f4adf8674d
- Script CLI com args --discussion 31|32|33|all, --since-days N, --force - Paginação via MCP gateway (limit 100, tree_view false) - Output JSON-line progressivo + summary final - Testes: parseWorklogHtml tolerante (h2/h3/h4), idempotência upsert Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
#!/usr/bin/env tsx
|
|
/**
|
|
* Importa comentários das discussões Desk #31/#32/#33 (worklogs, reflexões
|
|
* e acções de melhoria) para a BD Observabilidade.
|
|
*
|
|
* Uso:
|
|
* sessions-worklog-import.ts [--discussion 31|32|33|all] [--since-days N]
|
|
* sessions-worklog-import.ts --discussion 31 --page-size 200
|
|
*
|
|
* Default: --discussion all --since-days 365
|
|
*
|
|
* Env obrigatório:
|
|
* MCP_GATEWAY_TOKEN Bearer token do gateway MCP
|
|
*/
|
|
import { openSessionsDb } from '../services/sessions/db.js'
|
|
import { DEFAULT_DB_PATH } from '../services/sessions/indexer.js'
|
|
import { importWorklogDiscussion, type ImportResult } from '../services/sessions/worklog-import.js'
|
|
|
|
interface Args {
|
|
discussion: 'all' | number
|
|
sinceDays: number
|
|
pageSize: number
|
|
}
|
|
|
|
function parseArgs(argv: string[]): Args {
|
|
const a: Args = { discussion: 'all', sinceDays: 365, pageSize: 500 }
|
|
for (let i = 0; i < argv.length; i++) {
|
|
if (argv[i] === '--discussion') {
|
|
const v = argv[++i]
|
|
a.discussion = v === 'all' ? 'all' : parseInt(v, 10)
|
|
} else if (argv[i] === '--since-days') {
|
|
a.sinceDays = parseInt(argv[++i], 10)
|
|
} else if (argv[i] === '--page-size') {
|
|
a.pageSize = parseInt(argv[++i], 10)
|
|
}
|
|
}
|
|
return a
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
const args = parseArgs(process.argv.slice(2))
|
|
if (!process.env.MCP_GATEWAY_TOKEN) {
|
|
console.error('[worklog-import] MCP_GATEWAY_TOKEN não definido. Aborta.')
|
|
process.exit(1)
|
|
}
|
|
const dbPath = process.env.OBSERVABILIDADE_DB ?? DEFAULT_DB_PATH
|
|
const db = openSessionsDb(dbPath)
|
|
|
|
const discussions = args.discussion === 'all' ? [31, 32, 33] : [args.discussion as number]
|
|
const sinceIso = new Date(Date.now() - args.sinceDays * 86400_000).toISOString()
|
|
|
|
console.error(
|
|
`[worklog-import] db=${dbPath} discussions=${discussions.join(',')} since=${sinceIso} page_size=${args.pageSize}`,
|
|
)
|
|
|
|
const results: ImportResult[] = []
|
|
for (const d of discussions) {
|
|
try {
|
|
const r = await importWorklogDiscussion(db, d, { sinceIso, pageSize: args.pageSize })
|
|
results.push(r)
|
|
console.error(
|
|
`[worklog-import] #${d}: fetched=${r.fetched} inserted=${r.imported} updated=${r.updated} skipped=${r.skipped} errors=${r.errors}`,
|
|
)
|
|
} catch (e) {
|
|
console.error(`[worklog-import] falha #${d}:`, (e as Error).message)
|
|
results.push({
|
|
discussion_id: d,
|
|
fetched: 0,
|
|
imported: 0,
|
|
updated: 0,
|
|
skipped: 0,
|
|
errors: 1,
|
|
})
|
|
}
|
|
}
|
|
|
|
const summary = {
|
|
db: dbPath,
|
|
since_iso: sinceIso,
|
|
discussions: results,
|
|
totals: {
|
|
fetched: results.reduce((s, r) => s + r.fetched, 0),
|
|
imported: results.reduce((s, r) => s + r.imported, 0),
|
|
updated: results.reduce((s, r) => s + r.updated, 0),
|
|
skipped: results.reduce((s, r) => s + r.skipped, 0),
|
|
errors: results.reduce((s, r) => s + r.errors, 0),
|
|
},
|
|
total_in_db: db.countWorklogComments(),
|
|
}
|
|
console.log(JSON.stringify(summary))
|
|
db.close()
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error('[worklog-import] falha fatal:', err)
|
|
process.exit(2)
|
|
})
|