program.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { createRequire } from "node:module";
  2. import { Command } from "commander";
  3. import { initCommand } from "./commands/init.js";
  4. import { configCommand } from "./commands/config.js";
  5. import { bookCommand } from "./commands/book.js";
  6. import { writeCommand } from "./commands/write.js";
  7. import { reviewCommand } from "./commands/review.js";
  8. import { statusCommand } from "./commands/status.js";
  9. import { radarCommand } from "./commands/radar.js";
  10. import { upCommand, downCommand } from "./commands/daemon.js";
  11. import { doctorCommand } from "./commands/doctor.js";
  12. import { exportCommand } from "./commands/export.js";
  13. import { draftCommand } from "./commands/draft.js";
  14. import { auditCommand } from "./commands/audit.js";
  15. import { reviseCommand } from "./commands/revise.js";
  16. import { agentCommand } from "./commands/agent.js";
  17. import { planCommand } from "./commands/plan.js";
  18. import { composeCommand } from "./commands/compose.js";
  19. import { genreCommand } from "./commands/genre.js";
  20. import { updateCommand } from "./commands/update.js";
  21. import { detectCommand } from "./commands/detect.js";
  22. import { styleCommand } from "./commands/style.js";
  23. import { analyticsCommand } from "./commands/analytics.js";
  24. import { evalCommand } from "./commands/eval.js";
  25. import { importCommand } from "./commands/import.js";
  26. import { fanficCommand } from "./commands/fanfic.js";
  27. import { createStudioCommand, launchStudioEntry } from "./commands/studio.js";
  28. import { consolidateCommand } from "./commands/consolidate.js";
  29. import { createInteractCommand, type InteractCommandHooks } from "./commands/interact.js";
  30. import { createTuiCommand } from "./commands/tui.js";
  31. import { launchTui } from "./tui/app.js";
  32. const require = createRequire(import.meta.url);
  33. const { version } = require("../package.json") as { version: string };
  34. export interface ProgramHooks {
  35. readonly launchTui?: (projectRoot: string) => Promise<void> | void;
  36. readonly launchStudio?: (projectRoot: string, port: string) => Promise<void> | void;
  37. readonly runInteraction?: InteractCommandHooks["runInteraction"];
  38. readonly readInteractionInput?: InteractCommandHooks["readInput"];
  39. }
  40. export function createProgram(hooks: ProgramHooks = {}): Command {
  41. const program = new Command();
  42. program
  43. .name("inkos")
  44. .description("InkOS — Multi-agent novel production system")
  45. .version(version)
  46. .action(async () => {
  47. await launchStudioEntry(process.cwd(), "4567", { launchStudio: hooks.launchStudio });
  48. });
  49. program.addCommand(initCommand);
  50. program.addCommand(configCommand);
  51. program.addCommand(bookCommand);
  52. program.addCommand(writeCommand);
  53. program.addCommand(reviewCommand);
  54. program.addCommand(statusCommand);
  55. program.addCommand(radarCommand);
  56. program.addCommand(upCommand);
  57. program.addCommand(downCommand);
  58. program.addCommand(doctorCommand);
  59. program.addCommand(exportCommand);
  60. program.addCommand(draftCommand);
  61. program.addCommand(auditCommand);
  62. program.addCommand(reviseCommand);
  63. program.addCommand(agentCommand);
  64. program.addCommand(planCommand);
  65. program.addCommand(composeCommand);
  66. program.addCommand(genreCommand);
  67. program.addCommand(updateCommand);
  68. program.addCommand(detectCommand);
  69. program.addCommand(styleCommand);
  70. program.addCommand(analyticsCommand);
  71. program.addCommand(evalCommand);
  72. program.addCommand(importCommand);
  73. program.addCommand(fanficCommand);
  74. program.addCommand(createStudioCommand({ launchStudio: hooks.launchStudio }));
  75. program.addCommand(consolidateCommand);
  76. program.addCommand(createInteractCommand({
  77. runInteraction: hooks.runInteraction,
  78. readInput: hooks.readInteractionInput,
  79. }));
  80. program.addCommand(createTuiCommand({ launchTui: hooks.launchTui }));
  81. return program;
  82. }
  83. export async function runProgram(
  84. argv: string[] = process.argv,
  85. hooks: ProgramHooks = {},
  86. ): Promise<void> {
  87. const program = createProgram(hooks);
  88. await program.parseAsync(argv);
  89. }