revise.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Command } from "commander";
  2. import { PipelineRunner, type ReviseMode } from "@actalk/inkos-core";
  3. import { loadConfig, buildPipelineConfig, findProjectRoot, resolveBookId, log, logError } from "../utils.js";
  4. export const reviseCommand = new Command("revise")
  5. .description("Revise a chapter based on audit issues")
  6. .argument("[book-id]", "Book ID (auto-detected if only one book)")
  7. .argument("[chapter]", "Chapter number (defaults to latest)")
  8. .option("--mode <mode>", "Revise mode: polish, rewrite, rework, spot-fix", "rewrite")
  9. .option("--json", "Output JSON")
  10. .action(async (bookIdArg: string | undefined, chapterStr: string | undefined, opts) => {
  11. try {
  12. const config = await loadConfig();
  13. const root = findProjectRoot();
  14. let bookId: string;
  15. let chapterNumber: number | undefined;
  16. if (bookIdArg && /^\d+$/.test(bookIdArg)) {
  17. bookId = await resolveBookId(undefined, root);
  18. chapterNumber = parseInt(bookIdArg, 10);
  19. } else {
  20. bookId = await resolveBookId(bookIdArg, root);
  21. chapterNumber = chapterStr ? parseInt(chapterStr, 10) : undefined;
  22. }
  23. const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
  24. const mode = opts.mode as ReviseMode;
  25. if (!opts.json) log(`Revising "${bookId}"${chapterNumber ? ` chapter ${chapterNumber}` : " (latest)"} [mode: ${mode}]...`);
  26. const result = await pipeline.reviseDraft(bookId, chapterNumber, mode);
  27. if (opts.json) {
  28. log(JSON.stringify(result, null, 2));
  29. } else if (result.fixedIssues.length === 0) {
  30. log(` Chapter ${result.chapterNumber}: no issues to fix (audit passed)`);
  31. } else {
  32. log(` Chapter ${result.chapterNumber} revised`);
  33. log(` Words: ${result.wordCount}`);
  34. log(" Fixed:");
  35. for (const fix of result.fixedIssues) {
  36. log(` - ${fix}`);
  37. }
  38. }
  39. } catch (e) {
  40. if (opts.json) {
  41. log(JSON.stringify({ error: String(e) }));
  42. } else {
  43. logError(`Revise failed: ${e}`);
  44. }
  45. process.exit(1);
  46. }
  47. });