@zhuk/spego 0.8.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +57 -2
  3. package/dist/cli/body-input.d.ts +12 -0
  4. package/dist/cli/body-input.js +27 -0
  5. package/dist/cli/body-input.js.map +1 -0
  6. package/dist/cli/commands/artifact.d.ts +8 -0
  7. package/dist/cli/commands/artifact.js +171 -0
  8. package/dist/cli/commands/artifact.js.map +1 -0
  9. package/dist/cli/commands/delivery.d.ts +7 -0
  10. package/dist/cli/commands/delivery.js +99 -0
  11. package/dist/cli/commands/delivery.js.map +1 -0
  12. package/dist/cli/commands/index-rebuild.d.ts +5 -0
  13. package/dist/cli/commands/index-rebuild.js +31 -0
  14. package/dist/cli/commands/index-rebuild.js.map +1 -0
  15. package/dist/cli/commands/meta.d.ts +6 -0
  16. package/dist/cli/commands/meta.js +60 -0
  17. package/dist/cli/commands/meta.js.map +1 -0
  18. package/dist/cli/commands/orchestrate.d.ts +6 -0
  19. package/dist/cli/commands/orchestrate.js +51 -0
  20. package/dist/cli/commands/orchestrate.js.map +1 -0
  21. package/dist/cli/commands/skills.d.ts +5 -0
  22. package/dist/cli/commands/skills.js +49 -0
  23. package/dist/cli/commands/skills.js.map +1 -0
  24. package/dist/cli/commands/view.d.ts +8 -0
  25. package/dist/cli/commands/view.js +59 -0
  26. package/dist/cli/commands/view.js.map +1 -0
  27. package/dist/cli/commands/workspace.d.ts +5 -0
  28. package/dist/cli/commands/workspace.js +61 -0
  29. package/dist/cli/commands/workspace.js.map +1 -0
  30. package/dist/cli/errors.d.ts +20 -0
  31. package/dist/cli/errors.js +55 -0
  32. package/dist/cli/errors.js.map +1 -0
  33. package/dist/cli/output.d.ts +12 -0
  34. package/dist/cli/output.js +28 -0
  35. package/dist/cli/output.js.map +1 -0
  36. package/dist/cli/render.d.ts +7 -0
  37. package/dist/cli/render.js +22 -0
  38. package/dist/cli/render.js.map +1 -1
  39. package/dist/cli/runtime.d.ts +26 -0
  40. package/dist/cli/runtime.js +48 -0
  41. package/dist/cli/runtime.js.map +1 -0
  42. package/dist/cli.d.ts +8 -0
  43. package/dist/cli.js +65 -582
  44. package/dist/cli.js.map +1 -1
  45. package/dist/commands/registry.js +12 -0
  46. package/dist/commands/registry.js.map +1 -1
  47. package/dist/errors.d.ts +1 -1
  48. package/dist/errors.js.map +1 -1
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.js +1 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/orchestration/agents.d.ts +15 -0
  53. package/dist/orchestration/agents.js +156 -0
  54. package/dist/orchestration/agents.js.map +1 -0
  55. package/dist/orchestration/artifacts.d.ts +8 -0
  56. package/dist/orchestration/artifacts.js +20 -0
  57. package/dist/orchestration/artifacts.js.map +1 -0
  58. package/dist/orchestration/client.d.ts +59 -0
  59. package/dist/orchestration/client.js +107 -0
  60. package/dist/orchestration/client.js.map +1 -0
  61. package/dist/orchestration/config.d.ts +14 -0
  62. package/dist/orchestration/config.js +45 -0
  63. package/dist/orchestration/config.js.map +1 -0
  64. package/dist/orchestration/emit.d.ts +7 -0
  65. package/dist/orchestration/emit.js +19 -0
  66. package/dist/orchestration/emit.js.map +1 -0
  67. package/dist/orchestration/engine.d.ts +23 -0
  68. package/dist/orchestration/engine.js +136 -0
  69. package/dist/orchestration/engine.js.map +1 -0
  70. package/dist/orchestration/file-gate.d.ts +19 -0
  71. package/dist/orchestration/file-gate.js +25 -0
  72. package/dist/orchestration/file-gate.js.map +1 -0
  73. package/dist/orchestration/index.d.ts +18 -0
  74. package/dist/orchestration/index.js +12 -0
  75. package/dist/orchestration/index.js.map +1 -0
  76. package/dist/orchestration/manager.d.ts +13 -0
  77. package/dist/orchestration/manager.js +26 -0
  78. package/dist/orchestration/manager.js.map +1 -0
  79. package/dist/orchestration/prompts.d.ts +10 -0
  80. package/dist/orchestration/prompts.js +71 -0
  81. package/dist/orchestration/prompts.js.map +1 -0
  82. package/dist/orchestration/scheduler.d.ts +18 -0
  83. package/dist/orchestration/scheduler.js +49 -0
  84. package/dist/orchestration/scheduler.js.map +1 -0
  85. package/dist/orchestration/schema.d.ts +12 -0
  86. package/dist/orchestration/schema.js +78 -0
  87. package/dist/orchestration/schema.js.map +1 -0
  88. package/dist/orchestration/tiers.d.ts +14 -0
  89. package/dist/orchestration/tiers.js +57 -0
  90. package/dist/orchestration/tiers.js.map +1 -0
  91. package/dist/orchestration/types.d.ts +74 -0
  92. package/dist/orchestration/types.js +8 -0
  93. package/dist/orchestration/types.js.map +1 -0
  94. package/dist/orchestration/verifier.d.ts +14 -0
  95. package/dist/orchestration/verifier.js +66 -0
  96. package/dist/orchestration/verifier.js.map +1 -0
  97. package/dist/orchestration/worker.d.ts +16 -0
  98. package/dist/orchestration/worker.js +80 -0
  99. package/dist/orchestration/worker.js.map +1 -0
  100. package/dist/workspace/config.d.ts +69 -2
  101. package/dist/workspace/config.js +20 -0
  102. package/dist/workspace/config.js.map +1 -1
  103. package/dist/workspace/init.js +2 -0
  104. package/dist/workspace/init.js.map +1 -1
  105. package/package.json +2 -2
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `spego orchestrate` — run the multi-agent orchestration pipeline over an
3
+ * OpenSpec change and emit a structured verdict in human or `--json` mode.
4
+ */
5
+ import path from 'node:path';
6
+ import { orchestrateChange } from '../../orchestration/index.js';
7
+ import { renderHeader, renderTable } from '../render.js';
8
+ import { runCommand } from '../runtime.js';
9
+ const VALID_MODES = new Set(['sequential', 'parallel', 'adaptive']);
10
+ export function registerOrchestrate(program) {
11
+ program
12
+ .command('orchestrate')
13
+ .description('Run the multi-agent orchestration pipeline for an OpenSpec change')
14
+ .requiredOption('--change <name>', 'OpenSpec change name to orchestrate')
15
+ .option('--mode <mode>', 'sequential | parallel | adaptive (default: from breakdown)')
16
+ .option('--skip-verify', 'skip the verifier step', false)
17
+ .option('--cwd <dir>', 'project root')
18
+ .action(async (opts) => {
19
+ await runCommand({ program }, async () => {
20
+ const mode = opts.mode && VALID_MODES.has(opts.mode) ? opts.mode : undefined;
21
+ const outcome = await orchestrateChange({
22
+ projectRoot: path.resolve(opts.cwd ?? process.cwd()),
23
+ changeName: opts.change,
24
+ mode,
25
+ skipVerify: Boolean(opts.skipVerify),
26
+ });
27
+ return {
28
+ payload: outcome,
29
+ human: () => {
30
+ const verdict = outcome.verdict.passed ? 'PASS' : 'FAIL';
31
+ const rows = outcome.results.map((r) => [
32
+ r.success ? '[x]' : '[ ]',
33
+ r.subtaskId,
34
+ r.error ?? '',
35
+ ]);
36
+ const table = renderTable(['ok', 'subtask', 'error'], rows);
37
+ return [
38
+ renderHeader('🧭', `Orchestrate: ${outcome.changeName}`),
39
+ `goal ${outcome.goal}`,
40
+ `mode ${outcome.executionMode}`,
41
+ `tasks ${outcome.tasksSucceeded}/${outcome.tasksTotal} succeeded`,
42
+ `verdict ${verdict}`,
43
+ '',
44
+ table,
45
+ ].join('\n');
46
+ },
47
+ };
48
+ });
49
+ });
50
+ }
51
+ //# sourceMappingURL=orchestrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../../src/cli/commands/orchestrate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAEnF,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,mEAAmE,CAAC;SAChF,cAAc,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SACxE,MAAM,CAAC,eAAe,EAAE,4DAA4D,CAAC;SACrF,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,CAAuB,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,IAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;gBACtC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACpD,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,IAAI;gBACJ,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;aACrC,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,GAAG,EAAE;oBACV,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBACzD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;wBACtC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;wBACzB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,KAAK,IAAI,EAAE;qBACd,CAAC,CAAC;oBACH,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;oBAC5D,OAAO;wBACL,YAAY,CAAC,IAAI,EAAE,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC;wBACxD,YAAY,OAAO,CAAC,IAAI,EAAE;wBAC1B,YAAY,OAAO,CAAC,aAAa,EAAE;wBACnC,YAAY,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,YAAY;wBACpE,YAAY,OAAO,EAAE;wBACrB,EAAE;wBACF,KAAK;qBACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Skill regeneration: `spego skills` (and the hidden `regenerate` alias).
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerSkills(program: Command): void;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skill regeneration: `spego skills` (and the hidden `regenerate` alias).
3
+ */
4
+ import path from 'node:path';
5
+ import { resolveWorkspacePaths } from '../../workspace/paths.js';
6
+ import { readConfig } from '../../workspace/config.js';
7
+ import { generateAll } from '../../generator/index.js';
8
+ import { emitOrchestrationAssets } from '../../orchestration/emit.js';
9
+ import { renderHeader } from '../render.js';
10
+ import { deprecate } from '../output.js';
11
+ import { runCommand } from '../runtime.js';
12
+ async function runSkills(cwd, json) {
13
+ const projectRoot = path.resolve(cwd ?? process.cwd());
14
+ const wsPaths = resolveWorkspacePaths(projectRoot);
15
+ const config = await readConfig(wsPaths.configPath);
16
+ const reports = await generateAll(projectRoot, config.agents, { emitWarnings: !json });
17
+ reports.push(await emitOrchestrationAssets(projectRoot));
18
+ const human = () => {
19
+ const lines = [renderHeader('🛠️', 'Skill regeneration'), ''];
20
+ for (const r of reports) {
21
+ lines.push(`[${r.target}]`);
22
+ for (const f of r.files) {
23
+ lines.push(` ${f.action} ${f.path}`);
24
+ }
25
+ }
26
+ return lines.join('\n');
27
+ };
28
+ return { payload: reports, human };
29
+ }
30
+ export function registerSkills(program) {
31
+ program
32
+ .command('skills')
33
+ .description('Regenerate agent skill and command files')
34
+ .option('--cwd <dir>', 'project root')
35
+ .action(async (opts) => {
36
+ await runCommand({ program }, async (json) => runSkills(opts.cwd, json));
37
+ });
38
+ program
39
+ .command('regenerate', { hidden: true })
40
+ .description('Regenerate agent skill and command files')
41
+ .option('--cwd <dir>', 'project root')
42
+ .action(async (opts) => {
43
+ await runCommand({ program }, async (json) => {
44
+ deprecate(json, "'spego regenerate' is now 'spego skills'");
45
+ return runSkills(opts.cwd, json);
46
+ });
47
+ });
48
+ }
49
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,KAAK,UAAU,SAAS,CAAC,GAAuB,EAAE,IAAa;IAI7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,GAAW,EAAE;QACzB,MAAM,KAAK,GAAa,CAAC,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACvC,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3C,SAAS,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC;YAC5D,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Bundle export: `spego view`.
3
+ *
4
+ * Honors the deprecated `--format` flag during the deprecation window in
5
+ * addition to the global `--json` flag.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerView(program: Command): void;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Bundle export: `spego view`.
3
+ *
4
+ * Honors the deprecated `--format` flag during the deprecation window in
5
+ * addition to the global `--json` flag.
6
+ */
7
+ import { ArtifactEngine } from '../../artifacts/engine.js';
8
+ import { viewArtifacts } from '../../export/view.js';
9
+ import { intersperseBundleDividers, renderHeader } from '../render.js';
10
+ import { deprecate, emitJson } from '../output.js';
11
+ import { fail } from '../errors.js';
12
+ import { getJsonMode } from '../runtime.js';
13
+ export function registerView(program) {
14
+ program
15
+ .command('view')
16
+ .description('Export artifact bundle as markdown (default) or JSON via --json')
17
+ .option('--type <type>', 'filter by type')
18
+ .option('--id <id>', 'limit to a single artifact')
19
+ .option('--revision <n>', 'specific revision (requires --id)')
20
+ .option('--include-deleted', 'include soft-deleted artifacts', false)
21
+ .option('--format <fmt>', '[deprecated] markdown | json — use the global --json flag instead')
22
+ .option('--cwd <dir>', 'project root')
23
+ .action(async (opts) => {
24
+ const globalJson = getJsonMode(program);
25
+ if (opts.format !== undefined) {
26
+ deprecate(globalJson, '--format is deprecated; use the global --json flag');
27
+ }
28
+ const wantJson = globalJson || opts.format === 'json';
29
+ let engine;
30
+ try {
31
+ engine = await ArtifactEngine.open({ projectRoot: opts.cwd });
32
+ }
33
+ catch (err) {
34
+ fail(err, wantJson);
35
+ }
36
+ try {
37
+ const view = await viewArtifacts(engine, {
38
+ type: opts.type,
39
+ id: opts.id,
40
+ revision: opts.revision !== undefined ? Number(opts.revision) : undefined,
41
+ includeDeleted: opts.includeDeleted,
42
+ });
43
+ if (wantJson) {
44
+ emitJson(view.json);
45
+ }
46
+ else {
47
+ const body = intersperseBundleDividers(view.markdown.content);
48
+ process.stdout.write(`${renderHeader('📦', 'Artifact bundle')}\n${body}`);
49
+ }
50
+ }
51
+ catch (err) {
52
+ fail(err, wantJson);
53
+ }
54
+ finally {
55
+ engine.close();
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/cli/commands/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC;SACjD,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,KAAK,CAAC;SACpE,MAAM,CAAC,gBAAgB,EAAE,mEAAmE,CAAC;SAC7F,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,SAAS,CAAC,UAAU,EAAE,oDAAoD,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;QAEtD,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzE,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC,CAAC,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Workspace lifecycle commands: `init` and `status`.
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerWorkspace(program: Command): void;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Workspace lifecycle commands: `init` and `status`.
3
+ */
4
+ import { initWorkspace, workspaceStatus } from '../../workspace/init.js';
5
+ import { renderBox, renderHeader } from '../render.js';
6
+ import { runCommand } from '../runtime.js';
7
+ export function registerWorkspace(program) {
8
+ program
9
+ .command('init')
10
+ .description('Initialize a .spego/ workspace in the current project')
11
+ .option('--agents <list>', 'comma-separated list of agent toolchains', 'claude')
12
+ .option('--demo <bool>', 'seed demo artifacts (true|false)', 'false')
13
+ .option('--force', 'overwrite config (does not delete artifacts)', false)
14
+ .option('--cwd <dir>', 'project root (defaults to current directory)')
15
+ .action(async (opts) => {
16
+ await runCommand({ program }, async () => {
17
+ const summary = await initWorkspace({
18
+ projectRoot: opts.cwd,
19
+ agents: String(opts.agents).split(',').map((s) => s.trim()).filter(Boolean),
20
+ demo: opts.demo === 'true',
21
+ force: opts.force,
22
+ });
23
+ const human = () => {
24
+ const headerLabel = summary.alreadyInitialized
25
+ ? 'Workspace already initialized'
26
+ : 'Initialized spego workspace';
27
+ const box = renderBox('Workspace', [
28
+ ['root', summary.workspaceRoot],
29
+ ['config', summary.configPath],
30
+ ['artifacts', summary.artifactsRoot],
31
+ ['index', summary.indexPath],
32
+ ['agents', summary.config.agents.join(', ')],
33
+ ]);
34
+ return `${renderHeader('📦', headerLabel)}\n${box}`;
35
+ };
36
+ return { payload: summary, human };
37
+ });
38
+ });
39
+ program
40
+ .command('status')
41
+ .description('Report workspace status')
42
+ .option('--cwd <dir>', 'project root')
43
+ .action(async (opts) => {
44
+ await runCommand({ program }, async () => {
45
+ const status = await workspaceStatus(opts.cwd);
46
+ const human = () => {
47
+ if (!status.initialized)
48
+ return `No spego workspace; run: spego init`;
49
+ const box = renderBox('Workspace status', [
50
+ ['root', status.workspaceRoot ?? ''],
51
+ ['agents', status.agents?.join(', ') ?? '(none)'],
52
+ ['artifacts', status.artifactsRoot ?? ''],
53
+ ['index', status.indexPath ?? ''],
54
+ ]);
55
+ return `${renderHeader('📦', 'Workspace ready')}\n${box}`;
56
+ };
57
+ return { payload: status, human };
58
+ });
59
+ });
60
+ }
61
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/cli/commands/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Centralized error formatting for the CLI.
3
+ *
4
+ * Every command and the program-level `exitOverride` route through this module
5
+ * so the human and JSON envelopes stay consistent and `error.details` is always
6
+ * an object — never undefined — so agents can branch on the shape safely.
7
+ */
8
+ /** Format and write a `SpegoError`/`Error`/unknown error to stderr; never returns. */
9
+ export declare function fail(err: unknown, json: boolean): never;
10
+ /**
11
+ * Format and write a commander validation error; never returns.
12
+ *
13
+ * Validation errors always exit with code 2, matching `SpegoError`, so agents
14
+ * can branch on `exitCode === 2 ⇒ structured error` regardless of source.
15
+ * Commander's default `exitCode` (1 for unknown options) is intentionally
16
+ * overridden here.
17
+ */
18
+ export declare function failValidation(err: {
19
+ message: string;
20
+ }, json: boolean): never;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Centralized error formatting for the CLI.
3
+ *
4
+ * Every command and the program-level `exitOverride` route through this module
5
+ * so the human and JSON envelopes stay consistent and `error.details` is always
6
+ * an object — never undefined — so agents can branch on the shape safely.
7
+ */
8
+ import { SpegoError } from '../errors.js';
9
+ function spegoErrorEnvelope(err) {
10
+ return { error: { code: err.code, message: err.message, details: err.details ?? {} } };
11
+ }
12
+ function genericErrorEnvelope(message) {
13
+ return { error: { code: 'INTERNAL', message, details: {} } };
14
+ }
15
+ function validationEnvelope(message) {
16
+ return { error: { code: 'VALIDATION_FAILED', message, details: {} } };
17
+ }
18
+ /** Format and write a `SpegoError`/`Error`/unknown error to stderr; never returns. */
19
+ export function fail(err, json) {
20
+ if (err instanceof SpegoError) {
21
+ if (json) {
22
+ process.stderr.write(`${JSON.stringify(spegoErrorEnvelope(err), null, 2)}\n`);
23
+ }
24
+ else {
25
+ process.stderr.write(`⚠️ [${err.code}] ${err.message}\n`);
26
+ }
27
+ process.exit(2);
28
+ }
29
+ const message = err instanceof Error ? err.message : String(err);
30
+ if (json) {
31
+ process.stderr.write(`${JSON.stringify(genericErrorEnvelope(message), null, 2)}\n`);
32
+ }
33
+ else {
34
+ process.stderr.write(`⚠️ [INTERNAL] ${message}\n`);
35
+ }
36
+ process.exit(1);
37
+ }
38
+ /**
39
+ * Format and write a commander validation error; never returns.
40
+ *
41
+ * Validation errors always exit with code 2, matching `SpegoError`, so agents
42
+ * can branch on `exitCode === 2 ⇒ structured error` regardless of source.
43
+ * Commander's default `exitCode` (1 for unknown options) is intentionally
44
+ * overridden here.
45
+ */
46
+ export function failValidation(err, json) {
47
+ if (json) {
48
+ process.stderr.write(`${JSON.stringify(validationEnvelope(err.message), null, 2)}\n`);
49
+ }
50
+ else {
51
+ process.stderr.write(`⚠️ [VALIDATION_FAILED] ${err.message}\n`);
52
+ }
53
+ process.exit(2);
54
+ }
55
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/cli/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,SAAS,kBAAkB,CAAC,GAAe;IACzC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,IAAI,CAAC,GAAY,EAAE,IAAa;IAC9C,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,OAAO,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,GAAwB,EAAE,IAAa;IACpE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Stdout/stderr output primitives for the CLI.
3
+ *
4
+ * Centralizes JSON vs human emission, deprecation warnings, and trailing-newline
5
+ * handling so individual command actions never branch on `--json` more than once.
6
+ */
7
+ export declare function emitJson(payload: unknown): void;
8
+ export declare function emitHuman(text: string): void;
9
+ /** Emit `payload` as JSON when `json` is true, otherwise lazily render and emit human text. */
10
+ export declare function output(json: boolean, payload: unknown, human: () => string): void;
11
+ /** Write a single-line `deprecated: <message>` warning to stderr in human mode only. */
12
+ export declare function deprecate(json: boolean, message: string): void;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Stdout/stderr output primitives for the CLI.
3
+ *
4
+ * Centralizes JSON vs human emission, deprecation warnings, and trailing-newline
5
+ * handling so individual command actions never branch on `--json` more than once.
6
+ */
7
+ export function emitJson(payload) {
8
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
9
+ }
10
+ export function emitHuman(text) {
11
+ process.stdout.write(text.endsWith('\n') ? text : `${text}\n`);
12
+ }
13
+ /** Emit `payload` as JSON when `json` is true, otherwise lazily render and emit human text. */
14
+ export function output(json, payload, human) {
15
+ if (json) {
16
+ emitJson(payload);
17
+ }
18
+ else {
19
+ emitHuman(human());
20
+ }
21
+ }
22
+ /** Write a single-line `deprecated: <message>` warning to stderr in human mode only. */
23
+ export function deprecate(json, message) {
24
+ if (!json) {
25
+ process.stderr.write(`deprecated: ${message}\n`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,OAAgB,EAAE,KAAmB;IACzE,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,OAAe;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -42,3 +42,10 @@ export declare function renderTable(columns: string[], rows: string[][], opts?:
42
42
  export declare function renderHeader(emoji: string, label: string): string;
43
43
  /** Render a `─` divider of the given width (default 60). */
44
44
  export declare function renderDivider(width?: number): string;
45
+ /**
46
+ * Insert `─` dividers between consecutive artifact sections in a markdown
47
+ * bundle. A section boundary is any line that starts with `## `; the first
48
+ * such line is left untouched, every subsequent boundary is preceded by
49
+ * `\n<divider>\n\n`.
50
+ */
51
+ export declare function intersperseBundleDividers(markdown: string): string;
@@ -87,4 +87,26 @@ export function renderHeader(emoji, label) {
87
87
  export function renderDivider(width = 60) {
88
88
  return '─'.repeat(Math.max(1, width));
89
89
  }
90
+ /**
91
+ * Insert `─` dividers between consecutive artifact sections in a markdown
92
+ * bundle. A section boundary is any line that starts with `## `; the first
93
+ * such line is left untouched, every subsequent boundary is preceded by
94
+ * `\n<divider>\n\n`.
95
+ */
96
+ export function intersperseBundleDividers(markdown) {
97
+ const lines = markdown.split('\n');
98
+ const out = [];
99
+ let seenFirstSection = false;
100
+ const divider = renderDivider();
101
+ for (const line of lines) {
102
+ if (line.startsWith('## ')) {
103
+ if (seenFirstSection) {
104
+ out.push('', divider, '');
105
+ }
106
+ seenFirstSection = true;
107
+ }
108
+ out.push(line);
109
+ }
110
+ return out.join('\n');
111
+ }
90
112
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/cli/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/cli/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACnD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AACzC,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACnD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAA6B;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,+BAA+B;IAEpE,uEAAuE;IACvE,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7F,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAI;SACd,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,KAAK,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;IAC/C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,OAAiB,EACjB,IAAgB,EAChB,OAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,KAAe,EAAU,EAAE,CAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAEtF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,CAAC;AACxF,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa;IACvD,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE;IAC9C,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared runtime for spego CLI command actions.
3
+ *
4
+ * Eliminates the per-command `try/catch/finally` boilerplate by routing every
5
+ * command through `runCommand` (no engine) or `runEngineCommand` (auto-managed
6
+ * `ArtifactEngine`). Each helper resolves the global `--json` flag, emits the
7
+ * success payload through `output`, and routes errors through `fail`, so the
8
+ * CLI surface stays small and uniform.
9
+ */
10
+ import type { Command } from 'commander';
11
+ import { ArtifactEngine } from '../artifacts/engine.js';
12
+ export interface CommandResult<T> {
13
+ payload: T;
14
+ human: () => string;
15
+ }
16
+ interface RuntimeContext {
17
+ program: Command;
18
+ }
19
+ export declare function getJsonMode(program: Command): boolean;
20
+ /** Run a command body that does not need an `ArtifactEngine`. */
21
+ export declare function runCommand<T>(ctx: RuntimeContext, fn: (json: boolean) => Promise<CommandResult<T>>): Promise<void>;
22
+ /** Run a command body that needs an `ArtifactEngine`; the engine is closed on every exit path. */
23
+ export declare function runEngineCommand<T>(ctx: RuntimeContext & {
24
+ cwd?: string;
25
+ }, fn: (engine: ArtifactEngine, json: boolean) => Promise<CommandResult<T>>): Promise<void>;
26
+ export {};
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Shared runtime for spego CLI command actions.
3
+ *
4
+ * Eliminates the per-command `try/catch/finally` boilerplate by routing every
5
+ * command through `runCommand` (no engine) or `runEngineCommand` (auto-managed
6
+ * `ArtifactEngine`). Each helper resolves the global `--json` flag, emits the
7
+ * success payload through `output`, and routes errors through `fail`, so the
8
+ * CLI surface stays small and uniform.
9
+ */
10
+ import { ArtifactEngine } from '../artifacts/engine.js';
11
+ import { output } from './output.js';
12
+ import { fail } from './errors.js';
13
+ export function getJsonMode(program) {
14
+ return program.opts().json;
15
+ }
16
+ /** Run a command body that does not need an `ArtifactEngine`. */
17
+ export async function runCommand(ctx, fn) {
18
+ const json = getJsonMode(ctx.program);
19
+ try {
20
+ const { payload, human } = await fn(json);
21
+ output(json, payload, human);
22
+ }
23
+ catch (err) {
24
+ fail(err, json);
25
+ }
26
+ }
27
+ /** Run a command body that needs an `ArtifactEngine`; the engine is closed on every exit path. */
28
+ export async function runEngineCommand(ctx, fn) {
29
+ const json = getJsonMode(ctx.program);
30
+ let engine;
31
+ try {
32
+ engine = await ArtifactEngine.open({ projectRoot: ctx.cwd });
33
+ }
34
+ catch (err) {
35
+ fail(err, json);
36
+ }
37
+ try {
38
+ const { payload, human } = await fn(engine, json);
39
+ output(json, payload, human);
40
+ }
41
+ catch (err) {
42
+ fail(err, json);
43
+ }
44
+ finally {
45
+ engine.close();
46
+ }
47
+ }
48
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/cli/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAWnC,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,IAAe,CAAC;AACxC,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAmB,EACnB,EAAgD;IAEhD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAsC,EACtC,EAAwE;IAExE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ /**
3
+ * spego CLI orchestrator.
4
+ *
5
+ * `buildProgram` wires the global `--json` flag, the program-level help and
6
+ * version handling, and one registrar per command group. Every command body
7
+ * lives under `src/cli/commands/` and routes through the shared runtime helper
8
+ * in `src/cli/runtime.ts`. Error formatting is centralized in `src/cli/errors.ts`.
9
+ */
2
10
  import { Command } from 'commander';
3
11
  export declare function buildProgram(): Command;