@semanticintent/phoenix-runtime 0.1.0

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 (70) hide show
  1. package/README.md +66 -0
  2. package/agents/A-00-SIGNAL-EXTRACTION.md +194 -0
  3. package/agents/A-01-BUSINESS-LOGIC-EXTRACTOR.md +163 -0
  4. package/agents/A-02-UI-ARCHAEOLOGIST.md +196 -0
  5. package/agents/A-03-REQUIREMENTS-SYNTHESIZER.md +193 -0
  6. package/agents/A-04-SOLUTION-ARCHITECT.md +218 -0
  7. package/agents/A-05-BUILDER.md +266 -0
  8. package/agents/A-06-VALIDATOR-CERTIFIER.md +304 -0
  9. package/bin/phoenix.js +3 -0
  10. package/dist/cli/commands/episode.d.ts +3 -0
  11. package/dist/cli/commands/episode.d.ts.map +1 -0
  12. package/dist/cli/commands/episode.js +125 -0
  13. package/dist/cli/commands/episode.js.map +1 -0
  14. package/dist/cli/commands/gate.d.ts +3 -0
  15. package/dist/cli/commands/gate.d.ts.map +1 -0
  16. package/dist/cli/commands/gate.js +57 -0
  17. package/dist/cli/commands/gate.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +3 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +77 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/run.d.ts +3 -0
  23. package/dist/cli/commands/run.d.ts.map +1 -0
  24. package/dist/cli/commands/run.js +56 -0
  25. package/dist/cli/commands/run.js.map +1 -0
  26. package/dist/cli/commands/status.d.ts +3 -0
  27. package/dist/cli/commands/status.d.ts.map +1 -0
  28. package/dist/cli/commands/status.js +23 -0
  29. package/dist/cli/commands/status.js.map +1 -0
  30. package/dist/cli/commands/validate.d.ts +3 -0
  31. package/dist/cli/commands/validate.d.ts.map +1 -0
  32. package/dist/cli/commands/validate.js +41 -0
  33. package/dist/cli/commands/validate.js.map +1 -0
  34. package/dist/cli/display.d.ts +12 -0
  35. package/dist/cli/display.d.ts.map +1 -0
  36. package/dist/cli/display.js +28 -0
  37. package/dist/cli/display.js.map +1 -0
  38. package/dist/cli/index.d.ts +2 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +20 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/episodes/manager.d.ts +16 -0
  43. package/dist/episodes/manager.d.ts.map +1 -0
  44. package/dist/episodes/manager.js +96 -0
  45. package/dist/episodes/manager.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +7 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/parser/sil.d.ts +15 -0
  51. package/dist/parser/sil.d.ts.map +1 -0
  52. package/dist/parser/sil.js +137 -0
  53. package/dist/parser/sil.js.map +1 -0
  54. package/dist/pipeline/agents.d.ts +16 -0
  55. package/dist/pipeline/agents.d.ts.map +1 -0
  56. package/dist/pipeline/agents.js +72 -0
  57. package/dist/pipeline/agents.js.map +1 -0
  58. package/dist/pipeline/orchestrator.d.ts +21 -0
  59. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  60. package/dist/pipeline/orchestrator.js +213 -0
  61. package/dist/pipeline/orchestrator.js.map +1 -0
  62. package/dist/pipeline/state.d.ts +34 -0
  63. package/dist/pipeline/state.d.ts.map +1 -0
  64. package/dist/pipeline/state.js +83 -0
  65. package/dist/pipeline/state.js.map +1 -0
  66. package/dist/prompts/loader.d.ts +3 -0
  67. package/dist/prompts/loader.d.ts.map +1 -0
  68. package/dist/prompts/loader.js +22 -0
  69. package/dist/prompts/loader.js.map +1 -0
  70. package/package.json +56 -0
@@ -0,0 +1,56 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { Command } from 'commander';
4
+ import { prepareRun } from '../../pipeline/orchestrator.js';
5
+ import { display } from '../display.js';
6
+ export const runCommand = new Command('run')
7
+ .argument('<agent-id>', 'agent to run — a-00 through a-06')
8
+ .option('--project <path>', 'path to the Phoenix project', process.cwd())
9
+ .option('--output <file>', 'write prompt to file instead of terminal')
10
+ .description('Prepare and output the prompt for an agent run')
11
+ .action(async (agentId, options) => {
12
+ const projectPath = resolve(options.project);
13
+ display.blank();
14
+ display.info(`Preparing ${agentId.toUpperCase()} — checking prerequisites...`);
15
+ let result;
16
+ try {
17
+ result = await prepareRun(agentId, projectPath);
18
+ }
19
+ catch (err) {
20
+ display.error(err.message);
21
+ process.exit(1);
22
+ }
23
+ if (!result.ready) {
24
+ display.blank();
25
+ display.error(`${agentId.toUpperCase()} is not ready`);
26
+ display.info(` Reason: ${result.reason}`);
27
+ display.blank();
28
+ display.info(' Run `phoenix status` to see the full pipeline state.');
29
+ display.blank();
30
+ process.exit(1);
31
+ }
32
+ // Report what was checked
33
+ if (result.prerequisitesMet.length > 0) {
34
+ for (const prereq of result.prerequisitesMet) {
35
+ display.success(prereq);
36
+ }
37
+ }
38
+ if (result.episodeCount > 0) {
39
+ display.warn(`${result.episodeCount} open episode(s) injected into prompt`);
40
+ }
41
+ const prompt = result.prompt;
42
+ if (options.output) {
43
+ const outPath = resolve(options.output);
44
+ writeFileSync(outPath, prompt, 'utf-8');
45
+ display.blank();
46
+ display.success(`Prompt written to: ${outPath}`);
47
+ display.info(' Open the file and paste its contents into Claude Code.');
48
+ }
49
+ else {
50
+ display.prompt(prompt);
51
+ display.info(' Copy the prompt above and paste it into Claude Code.');
52
+ display.info(' When the agent completes, run: phoenix status');
53
+ }
54
+ display.blank();
55
+ });
56
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,eAAO,MAAM,aAAa,SAiBtB,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { resolve } from 'node:path';
2
+ import { Command } from 'commander';
3
+ import { readState } from '../../pipeline/state.js';
4
+ import { pipelineSummary } from '../../pipeline/orchestrator.js';
5
+ import { display } from '../display.js';
6
+ export const statusCommand = new Command('status')
7
+ .option('--project <path>', 'path to the Phoenix project', process.cwd())
8
+ .description('Show current pipeline state — agents, gates, artifact counts')
9
+ .action((options) => {
10
+ const projectPath = resolve(options.project);
11
+ let state;
12
+ try {
13
+ state = readState(projectPath);
14
+ }
15
+ catch (err) {
16
+ display.error(err.message);
17
+ process.exit(1);
18
+ }
19
+ display.blank();
20
+ console.log(pipelineSummary(state, projectPath));
21
+ display.blank();
22
+ });
23
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACxE,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,CAAC,OAA4B,EAAE,EAAE;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE5C,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QACH,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;IAChD,OAAO,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const validateCommand: Command;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,eAAO,MAAM,eAAe,SAsCxB,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { resolve } from 'node:path';
2
+ import { Command } from 'commander';
3
+ import { validateArtifacts } from '../../pipeline/orchestrator.js';
4
+ import { display } from '../display.js';
5
+ export const validateCommand = new Command('validate')
6
+ .argument('<agent-id>', 'agent whose outputs to validate — a-00 through a-06')
7
+ .option('--project <path>', 'path to the Phoenix project', process.cwd())
8
+ .description('Check that all expected artifact outputs exist for a completed agent')
9
+ .action((agentId, options) => {
10
+ const projectPath = resolve(options.project);
11
+ let result;
12
+ try {
13
+ result = validateArtifacts(agentId, projectPath);
14
+ }
15
+ catch (err) {
16
+ display.error(err.message);
17
+ process.exit(1);
18
+ }
19
+ display.blank();
20
+ display.header(`Artifact validation — ${agentId.toUpperCase()}`);
21
+ for (const construct of result.expected) {
22
+ const count = result.found[construct] ?? 0;
23
+ const missing = result.missing.includes(construct);
24
+ if (missing) {
25
+ display.error(`${construct.padEnd(16)} 0 files — missing`);
26
+ }
27
+ else {
28
+ display.success(`${construct.padEnd(16)} ${count} file${count !== 1 ? 's' : ''}`);
29
+ }
30
+ }
31
+ display.blank();
32
+ if (result.missing.length > 0) {
33
+ display.warn(`${result.missing.length} construct type(s) missing — re-run the agent.`);
34
+ process.exit(1);
35
+ }
36
+ else {
37
+ display.success('All expected artifacts present.');
38
+ }
39
+ display.blank();
40
+ });
41
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,QAAQ,CAAC,YAAY,EAAE,qDAAqD,CAAC;KAC7E,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACxE,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,CAAC,OAAe,EAAE,OAA4B,EAAE,EAAE;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE5C,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACH,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAA;IACf,OAAO,CAAC,MAAM,CAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAEhE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAA;IAEf,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,gDAAgD,CAAC,CAAA;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ export declare const display: {
2
+ success: (msg: string) => void;
3
+ error: (msg: string) => void;
4
+ warn: (msg: string) => void;
5
+ info: (msg: string) => void;
6
+ line: () => void;
7
+ blank: () => void;
8
+ header: (title: string) => void;
9
+ label: (key: string, value: string) => void;
10
+ prompt: (text: string) => void;
11
+ };
12
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;mBACH,MAAM;iBACR,MAAM;gBACP,MAAM;gBACN,MAAM;;;oBAIF,MAAM;iBAMT,MAAM,SAAS,MAAM;mBAGnB,MAAM;CAYtB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ export const display = {
3
+ success: (msg) => console.log(chalk.green('✓ ') + msg),
4
+ error: (msg) => console.error(chalk.red('✗ ') + msg),
5
+ warn: (msg) => console.log(chalk.yellow('⚠ ') + msg),
6
+ info: (msg) => console.log(chalk.dim(msg)),
7
+ line: () => console.log(chalk.dim('─'.repeat(51))),
8
+ blank: () => console.log(''),
9
+ header: (title) => {
10
+ console.log('');
11
+ console.log(chalk.bold(title));
12
+ console.log(chalk.dim('─'.repeat(51)));
13
+ },
14
+ label: (key, value) => console.log(chalk.dim(key.padEnd(12)) + value),
15
+ prompt: (text) => {
16
+ const border = chalk.dim('─'.repeat(51));
17
+ console.log('');
18
+ console.log(border);
19
+ console.log(chalk.bold.hex('#f97316')(' PROMPT — paste into Claude Code'));
20
+ console.log(border);
21
+ console.log('');
22
+ console.log(text);
23
+ console.log('');
24
+ console.log(border);
25
+ console.log('');
26
+ },
27
+ };
28
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC9D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAE5B,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,EAAE,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAEhD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAA;QAC3E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { Command } from 'commander';
2
+ import { initCommand } from './commands/init.js';
3
+ import { runCommand } from './commands/run.js';
4
+ import { statusCommand } from './commands/status.js';
5
+ import { gateCommand } from './commands/gate.js';
6
+ import { episodeCommand } from './commands/episode.js';
7
+ import { validateCommand } from './commands/validate.js';
8
+ const program = new Command();
9
+ program
10
+ .name('phoenix')
11
+ .description('Phoenix Pipeline Runtime — orchestrate the 7-agent legacy modernization pipeline')
12
+ .version('0.1.0');
13
+ program.addCommand(initCommand);
14
+ program.addCommand(runCommand);
15
+ program.addCommand(statusCommand);
16
+ program.addCommand(gateCommand);
17
+ program.addCommand(episodeCommand);
18
+ program.addCommand(validateCommand);
19
+ program.parse();
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,kFAAkF,CAAC;KAC/F,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC9B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAEnC,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,16 @@
1
+ export interface Episode {
2
+ id: string;
3
+ date: string;
4
+ trigger: string;
5
+ status: 'open' | 'active' | 'resolved';
6
+ change: string;
7
+ reason: string;
8
+ affects: Record<string, string>;
9
+ skip: string[];
10
+ }
11
+ export declare function readOpenEpisodes(projectPath: string): Episode[];
12
+ export declare function episodesForAgent(agentId: string, episodes: Episode[]): Episode[];
13
+ export declare function buildEpisodeContext(episodes: Episode[]): string;
14
+ export declare function writeEpisode(projectPath: string, episode: Episode): void;
15
+ export declare function resolveEpisode(episodeId: string, projectPath: string): void;
16
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/episodes/manager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAiED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAO/D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAIhF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAY/D;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAIxE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAK3E"}
@@ -0,0 +1,96 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { readSil, writeSil, readSilDir } from '../parser/sil.js';
4
+ const EPISODES_DIR = 'episodes';
5
+ // Parse the affects field from .sil lines into a Record<agentId, instruction>
6
+ // Each line looks like: "A-01 → add guest.checkout workflow"
7
+ function parseAffects(raw) {
8
+ const lines = Array.isArray(raw) ? raw : raw.split('\n');
9
+ const result = {};
10
+ for (const line of lines) {
11
+ const match = line.trim().match(/^(A-\d{2})\s+→\s+(.+)$/);
12
+ if (match)
13
+ result[match[1].toLowerCase().replace('-', '-')] = match[2].trim();
14
+ }
15
+ return result;
16
+ }
17
+ // Parse the skip field from .sil lines into string[]
18
+ // Each line looks like: "A-00 → brief unchanged"
19
+ function parseSkip(raw) {
20
+ const lines = Array.isArray(raw) ? raw : raw.split('\n');
21
+ return lines
22
+ .map((l) => {
23
+ const match = l.trim().match(/^(A-\d{2})/);
24
+ return match ? match[1].toLowerCase() : null;
25
+ })
26
+ .filter((v) => v !== null);
27
+ }
28
+ function episodeFromConstruct(construct) {
29
+ const f = construct.fields;
30
+ return {
31
+ id: construct.id,
32
+ date: String(f['date'] ?? ''),
33
+ trigger: String(f['trigger'] ?? ''),
34
+ status: f['status'] ?? 'open',
35
+ change: String(f['change'] ?? ''),
36
+ reason: String(f['reason'] ?? ''),
37
+ affects: f['affects'] ? parseAffects(f['affects']) : {},
38
+ skip: f['skip'] ? parseSkip(f['skip']) : [],
39
+ };
40
+ }
41
+ function episodeToConstruct(episode) {
42
+ const affectsLines = Object.entries(episode.affects).map(([agentId, instruction]) => `${agentId.toUpperCase()} → ${instruction}`);
43
+ const skipLines = episode.skip.map((agentId) => `${agentId.toUpperCase()} → (skipped)`);
44
+ return {
45
+ construct: 'episode',
46
+ id: episode.id,
47
+ version: 1,
48
+ fields: {
49
+ date: episode.date,
50
+ trigger: episode.trigger,
51
+ status: episode.status,
52
+ change: episode.change,
53
+ reason: episode.reason,
54
+ affects: affectsLines,
55
+ skip: skipLines,
56
+ },
57
+ raw: '',
58
+ };
59
+ }
60
+ export function readOpenEpisodes(projectPath) {
61
+ const dir = join(projectPath, EPISODES_DIR);
62
+ if (!existsSync(dir))
63
+ return [];
64
+ return readSilDir(dir)
65
+ .filter((c) => c.construct === 'episode')
66
+ .map(episodeFromConstruct)
67
+ .filter((e) => e.status === 'open' || e.status === 'active');
68
+ }
69
+ export function episodesForAgent(agentId, episodes) {
70
+ // Normalize to a-01, a-02 etc for matching
71
+ const normalId = agentId.toLowerCase();
72
+ return episodes.filter((e) => normalId in e.affects);
73
+ }
74
+ export function buildEpisodeContext(episodes) {
75
+ if (episodes.length === 0)
76
+ return '';
77
+ const line = '─'.repeat(42);
78
+ const header = `OPEN EPISODES — READ BEFORE PROCEEDING\n${line}`;
79
+ const blocks = episodes.map((e) => {
80
+ const instruction = Object.values(e.affects).join(', ');
81
+ return `${e.id} (${e.date}) — ${e.change.split('\n')[0]}\n Your attention: ${instruction}`;
82
+ });
83
+ return [header, ...blocks, line].join('\n');
84
+ }
85
+ export function writeEpisode(projectPath, episode) {
86
+ const dir = join(projectPath, EPISODES_DIR);
87
+ const filePath = join(dir, `${episode.id}.sil`);
88
+ writeSil(filePath, episodeToConstruct(episode));
89
+ }
90
+ export function resolveEpisode(episodeId, projectPath) {
91
+ const filePath = join(projectPath, EPISODES_DIR, `${episodeId}.sil`);
92
+ const construct = readSil(filePath);
93
+ construct.fields['status'] = 'resolved';
94
+ writeSil(filePath, construct);
95
+ }
96
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/episodes/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './parser/sil.js';
2
+ export * from './pipeline/agents.js';
3
+ export * from './pipeline/state.js';
4
+ export * from './pipeline/orchestrator.js';
5
+ export * from './episodes/manager.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // Public API
2
+ export * from './parser/sil.js';
3
+ export * from './pipeline/agents.js';
4
+ export * from './pipeline/state.js';
5
+ export * from './pipeline/orchestrator.js';
6
+ export * from './episodes/manager.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,15 @@
1
+ export type ConstructType = 'signal' | 'workflow' | 'screen' | 'spec' | 'episode' | 'architecture' | 'blueprint' | 'build' | 'certification';
2
+ export interface SilConstruct {
3
+ construct: ConstructType;
4
+ id: string;
5
+ version: number;
6
+ fields: Record<string, string | string[]>;
7
+ raw: string;
8
+ }
9
+ export declare function parseSil(raw: string): SilConstruct;
10
+ export declare function readSil(filePath: string): SilConstruct;
11
+ export declare function writeSil(filePath: string, construct: SilConstruct): void;
12
+ export declare function readSilDir(dirPath: string): SilConstruct[];
13
+ export declare function readMissionBrief(projectPath: string): SilConstruct;
14
+ export declare function getConfidence(construct: SilConstruct): 'high' | 'medium' | 'low' | null;
15
+ //# sourceMappingURL=sil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sil.d.ts","sourceRoot":"","sources":["../../src/parser/sil.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,MAAM,GACN,SAAS,GACT,cAAc,GACd,WAAW,GACX,OAAO,GACP,eAAe,CAAA;AAEnB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,aAAa,CAAA;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;IACzC,GAAG,EAAE,MAAM,CAAA;CACZ;AA8GD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAKlD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAGtD;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CASxE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAI1D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAElE;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,YAAY,GACtB,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,IAAI,CAIlC"}
@@ -0,0 +1,137 @@
1
+ import { readFileSync, writeFileSync, readdirSync } from 'node:fs';
2
+ import { join, extname } from 'node:path';
3
+ // The separator is 41 Unicode box-drawing dashes (─, U+2500), not ASCII hyphens
4
+ const SEPARATOR_RE = /^─+$/u;
5
+ const FIELD_RE = /^([a-z]\w*):\s*(.*)$/;
6
+ // ─────────────────────────────────────────
7
+ // Parsing
8
+ // ─────────────────────────────────────────
9
+ function parseHeader(lines) {
10
+ const sepIdx = lines.findIndex((l) => SEPARATOR_RE.test(l.trim()));
11
+ if (sepIdx < 3)
12
+ throw new Error('Invalid .sil file: separator line not found');
13
+ const construct = lines[0].replace(/^CONSTRUCT\s+/, '').trim();
14
+ const id = lines[1].replace(/^ID\s+/, '').trim();
15
+ const version = parseInt(lines[2].replace(/^VERSION\s+/, '').trim(), 10);
16
+ if (!construct)
17
+ throw new Error('Invalid .sil file: missing CONSTRUCT');
18
+ if (!id)
19
+ throw new Error('Invalid .sil file: missing ID');
20
+ if (isNaN(version))
21
+ throw new Error('Invalid .sil file: missing VERSION');
22
+ return { construct, id, version, bodyStart: sepIdx + 1 };
23
+ }
24
+ function parseBody(bodyLines) {
25
+ const fields = {};
26
+ let i = 0;
27
+ while (i < bodyLines.length) {
28
+ const line = bodyLines[i];
29
+ // Skip blank lines and comments at the top level
30
+ if (!line.trim() || line.trimStart().startsWith('#')) {
31
+ i++;
32
+ continue;
33
+ }
34
+ // Top-level field: word immediately at column 0
35
+ const fieldMatch = line.match(FIELD_RE);
36
+ if (fieldMatch && !line.startsWith(' ') && !line.startsWith('\t')) {
37
+ const key = fieldMatch[1];
38
+ const inlineValue = fieldMatch[2].trim();
39
+ if (inlineValue) {
40
+ // Simple single-line value
41
+ fields[key] = inlineValue;
42
+ i++;
43
+ }
44
+ else {
45
+ // Multi-line value — collect all indented lines that follow
46
+ i++;
47
+ const valueLines = [];
48
+ while (i < bodyLines.length &&
49
+ (bodyLines[i].startsWith(' ') ||
50
+ bodyLines[i].startsWith('\t') ||
51
+ !bodyLines[i].trim())) {
52
+ if (bodyLines[i].trim())
53
+ valueLines.push(bodyLines[i]);
54
+ i++;
55
+ }
56
+ if (valueLines.length === 0) {
57
+ fields[key] = '';
58
+ }
59
+ else if (valueLines.every((l) => l.trimStart().startsWith('- '))) {
60
+ // Uniform list — store as string[]
61
+ fields[key] = valueLines.map((l) => l.trimStart().replace(/^-\s+/, ''));
62
+ }
63
+ else {
64
+ // Mixed or prose — store as joined string, trimmed
65
+ fields[key] = valueLines.map((l) => l.trim()).join('\n');
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ // Non-field line at top level (e.g. SCREEN blocks in screen constructs)
71
+ // Absorbed into raw; skip here
72
+ i++;
73
+ }
74
+ }
75
+ return fields;
76
+ }
77
+ // ─────────────────────────────────────────
78
+ // Serialization
79
+ // ─────────────────────────────────────────
80
+ const SEPARATOR = '─'.repeat(41);
81
+ function serializeFields(fields) {
82
+ const lines = [];
83
+ for (const [key, value] of Object.entries(fields)) {
84
+ if (Array.isArray(value)) {
85
+ lines.push(`${key}:`);
86
+ for (const item of value)
87
+ lines.push(` - ${item}`);
88
+ }
89
+ else if (value.includes('\n')) {
90
+ lines.push(`${key}:`);
91
+ for (const l of value.split('\n'))
92
+ lines.push(` ${l}`);
93
+ }
94
+ else {
95
+ lines.push(`${key}: ${value}`);
96
+ }
97
+ }
98
+ return lines.join('\n');
99
+ }
100
+ // ─────────────────────────────────────────
101
+ // Public API
102
+ // ─────────────────────────────────────────
103
+ export function parseSil(raw) {
104
+ const lines = raw.split('\n');
105
+ const { construct, id, version, bodyStart } = parseHeader(lines);
106
+ const fields = parseBody(lines.slice(bodyStart));
107
+ return { construct, id, version, fields, raw };
108
+ }
109
+ export function readSil(filePath) {
110
+ const raw = readFileSync(filePath, 'utf-8');
111
+ return parseSil(raw);
112
+ }
113
+ export function writeSil(filePath, construct) {
114
+ const header = [
115
+ `CONSTRUCT ${construct.construct}`,
116
+ `ID ${construct.id}`,
117
+ `VERSION ${construct.version}`,
118
+ SEPARATOR,
119
+ ].join('\n');
120
+ const body = serializeFields(construct.fields);
121
+ writeFileSync(filePath, `${header}\n${body}\n`, 'utf-8');
122
+ }
123
+ export function readSilDir(dirPath) {
124
+ return readdirSync(dirPath)
125
+ .filter((f) => extname(f) === '.sil')
126
+ .map((f) => readSil(join(dirPath, f)));
127
+ }
128
+ export function readMissionBrief(projectPath) {
129
+ return readSil(join(projectPath, '_mission.sil'));
130
+ }
131
+ export function getConfidence(construct) {
132
+ const val = construct.fields['confidence'];
133
+ if (val === 'high' || val === 'medium' || val === 'low')
134
+ return val;
135
+ return null;
136
+ }
137
+ //# sourceMappingURL=sil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sil.js","sourceRoot":"","sources":["../../src/parser/sil.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ConstructType } from '../parser/sil.js';
2
+ export interface AgentDefinition {
3
+ id: string;
4
+ name: string;
5
+ promptFile: string;
6
+ requires: {
7
+ agents: string[];
8
+ gates: string[];
9
+ constructs: ConstructType[];
10
+ };
11
+ produces: ConstructType[];
12
+ humanGate: boolean;
13
+ }
14
+ export declare const AGENTS: AgentDefinition[];
15
+ export declare function getAgent(id: string): AgentDefinition | undefined;
16
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/pipeline/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,UAAU,EAAE,aAAa,EAAE,CAAA;KAC5B,CAAA;IACD,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,eAAO,MAAM,MAAM,EAAE,eAAe,EAiEnC,CAAA;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEhE"}