project-iris 0.0.13 → 0.0.14

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 (189) hide show
  1. package/README.md +261 -94
  2. package/bin/cli.js +21 -0
  3. package/flows/aidlc/README.md +372 -0
  4. package/flows/aidlc/agents/construction-agent.md +79 -0
  5. package/flows/aidlc/agents/inception-agent.md +97 -0
  6. package/flows/aidlc/agents/master-agent.md +61 -0
  7. package/flows/aidlc/agents/operations-agent.md +89 -0
  8. package/flows/aidlc/commands/construction-agent.md +63 -0
  9. package/flows/aidlc/commands/inception-agent.md +55 -0
  10. package/flows/aidlc/commands/master-agent.md +47 -0
  11. package/flows/aidlc/commands/operations-agent.md +77 -0
  12. package/flows/aidlc/context-config.yaml +67 -0
  13. package/flows/aidlc/memory-bank.yaml +104 -0
  14. package/flows/aidlc/quick-start.md +322 -0
  15. package/flows/aidlc/skills/construction/bolt-list.md +163 -0
  16. package/flows/aidlc/skills/construction/bolt-replan.md +345 -0
  17. package/flows/aidlc/skills/construction/bolt-start.md +442 -0
  18. package/flows/aidlc/skills/construction/bolt-status.md +185 -0
  19. package/flows/aidlc/skills/construction/navigator.md +196 -0
  20. package/flows/aidlc/skills/inception/bolt-plan.md +372 -0
  21. package/flows/aidlc/skills/inception/context.md +171 -0
  22. package/flows/aidlc/skills/inception/intent-create.md +211 -0
  23. package/flows/aidlc/skills/inception/intent-list.md +124 -0
  24. package/flows/aidlc/skills/inception/navigator.md +207 -0
  25. package/flows/aidlc/skills/inception/requirements.md +227 -0
  26. package/flows/aidlc/skills/inception/review.md +248 -0
  27. package/flows/aidlc/skills/inception/story-create.md +304 -0
  28. package/flows/aidlc/skills/inception/units.md +278 -0
  29. package/flows/aidlc/skills/master/analyze-context.md +239 -0
  30. package/flows/aidlc/skills/master/answer-question.md +141 -0
  31. package/flows/aidlc/skills/master/explain-flow.md +158 -0
  32. package/flows/aidlc/skills/master/project-init.md +281 -0
  33. package/flows/aidlc/skills/master/route-request.md +126 -0
  34. package/flows/aidlc/skills/operations/build.md +237 -0
  35. package/flows/aidlc/skills/operations/deploy.md +259 -0
  36. package/flows/aidlc/skills/operations/monitor.md +265 -0
  37. package/flows/aidlc/skills/operations/navigator.md +209 -0
  38. package/flows/aidlc/skills/operations/verify.md +224 -0
  39. package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt.md +3 -3
  40. package/{dist → flows/aidlc}/templates/construction/bolt-types/spike-bolt.md +2 -2
  41. package/flows/aidlc/templates/construction/construction-log-template.md +129 -0
  42. package/flows/aidlc/templates/construction/standards/coding-standards.md +29 -0
  43. package/flows/aidlc/templates/construction/standards/system-architecture.md +22 -0
  44. package/flows/aidlc/templates/construction/standards/tech-stack.md +19 -0
  45. package/flows/aidlc/templates/inception/inception-log-template.md +134 -0
  46. package/flows/aidlc/templates/inception/project/README.md +55 -0
  47. package/flows/aidlc/templates/standards/catalog.yaml +345 -0
  48. package/flows/aidlc/templates/standards/coding-standards.guide.md +553 -0
  49. package/flows/aidlc/templates/standards/data-stack.guide.md +162 -0
  50. package/flows/aidlc/templates/standards/tech-stack.guide.md +280 -0
  51. package/lib/InstallerFactory.js +36 -0
  52. package/lib/analytics/env-detector.js +92 -0
  53. package/lib/analytics/index.js +22 -0
  54. package/lib/analytics/machine-id.js +33 -0
  55. package/lib/analytics/tracker.js +232 -0
  56. package/lib/cli-utils.js +342 -0
  57. package/lib/constants.js +32 -0
  58. package/lib/installer.js +402 -0
  59. package/lib/installers/AntigravityInstaller.js +22 -0
  60. package/lib/installers/ClaudeInstaller.js +85 -0
  61. package/lib/installers/ClineInstaller.js +21 -0
  62. package/lib/installers/CodexInstaller.js +21 -0
  63. package/lib/installers/CopilotInstaller.js +113 -0
  64. package/lib/installers/CursorInstaller.js +63 -0
  65. package/lib/installers/GeminiInstaller.js +75 -0
  66. package/lib/installers/KiroInstaller.js +22 -0
  67. package/lib/installers/OpenCodeInstaller.js +22 -0
  68. package/lib/installers/RooInstaller.js +22 -0
  69. package/lib/installers/ToolInstaller.js +73 -0
  70. package/lib/installers/WindsurfInstaller.js +22 -0
  71. package/lib/markdown-validator.ts +175 -0
  72. package/lib/yaml-validator.ts +99 -0
  73. package/package.json +105 -32
  74. package/scripts/artifact-validator.js +594 -0
  75. package/scripts/bolt-complete.js +606 -0
  76. package/scripts/status-integrity.js +598 -0
  77. package/dist/bridge/agent-runner.js +0 -190
  78. package/dist/bridge/connector-factory.js +0 -31
  79. package/dist/bridge/connectors/antigravity-connector.js +0 -18
  80. package/dist/bridge/connectors/cursor-connector.js +0 -31
  81. package/dist/bridge/connectors/in-process-connector.js +0 -29
  82. package/dist/bridge/connectors/vscode-connector.js +0 -31
  83. package/dist/bridge/connectors/windsurf-connector.js +0 -23
  84. package/dist/bridge/filesystem-connector.js +0 -110
  85. package/dist/bridge/helper.js +0 -203
  86. package/dist/bridge/types.js +0 -10
  87. package/dist/cli.js +0 -40
  88. package/dist/commands/ask.js +0 -259
  89. package/dist/commands/bridge.js +0 -88
  90. package/dist/commands/create.js +0 -25
  91. package/dist/commands/develop.js +0 -141
  92. package/dist/commands/doctor.js +0 -102
  93. package/dist/commands/flow.js +0 -301
  94. package/dist/commands/framework.js +0 -273
  95. package/dist/commands/generate.js +0 -59
  96. package/dist/commands/install.js +0 -100
  97. package/dist/commands/pack.js +0 -33
  98. package/dist/commands/phase.js +0 -38
  99. package/dist/commands/run.js +0 -199
  100. package/dist/commands/status.js +0 -114
  101. package/dist/commands/uninstall.js +0 -14
  102. package/dist/commands/use.js +0 -20
  103. package/dist/commands/validate.js +0 -102
  104. package/dist/framework/framework-loader.js +0 -97
  105. package/dist/framework/framework-paths.js +0 -48
  106. package/dist/framework/framework-types.js +0 -15
  107. package/dist/iris/artifact-checker.js +0 -78
  108. package/dist/iris/artifacts/config.js +0 -68
  109. package/dist/iris/artifacts/generator.js +0 -88
  110. package/dist/iris/artifacts/types.js +0 -1
  111. package/dist/iris/bundle.js +0 -44
  112. package/dist/iris/doctrine/collector.js +0 -124
  113. package/dist/iris/fixer.js +0 -149
  114. package/dist/iris/flows/manifest.js +0 -124
  115. package/dist/iris/framework-context.js +0 -49
  116. package/dist/iris/framework-manager.js +0 -215
  117. package/dist/iris/fs/atomic.js +0 -22
  118. package/dist/iris/guard.js +0 -38
  119. package/dist/iris/importers/index.js +0 -9
  120. package/dist/iris/importers/types.js +0 -8
  121. package/dist/iris/importers/writer.js +0 -139
  122. package/dist/iris/include.js +0 -49
  123. package/dist/iris/installer.js +0 -334
  124. package/dist/iris/interactive/env.js +0 -21
  125. package/dist/iris/interactive/intent-interview.js +0 -345
  126. package/dist/iris/interactive/intent-schema.js +0 -28
  127. package/dist/iris/interactive/interview-io.js +0 -22
  128. package/dist/iris/interview/config.js +0 -71
  129. package/dist/iris/interview/types.js +0 -16
  130. package/dist/iris/interview/utils.js +0 -38
  131. package/dist/iris/manifest.js +0 -54
  132. package/dist/iris/packer.js +0 -325
  133. package/dist/iris/parsers/unit-parser.js +0 -43
  134. package/dist/iris/paths.js +0 -18
  135. package/dist/iris/policy.js +0 -133
  136. package/dist/iris/proc.js +0 -56
  137. package/dist/iris/report.js +0 -53
  138. package/dist/iris/resolver.js +0 -66
  139. package/dist/iris/router.js +0 -114
  140. package/dist/iris/routes.js +0 -189
  141. package/dist/iris/run-state.js +0 -146
  142. package/dist/iris/state.js +0 -113
  143. package/dist/iris/templates.js +0 -70
  144. package/dist/iris/tmp.js +0 -24
  145. package/dist/iris/uninstaller.js +0 -181
  146. package/dist/iris/utils/interpolate.js +0 -42
  147. package/dist/iris/validator.js +0 -391
  148. package/dist/iris/workflow/config.js +0 -51
  149. package/dist/iris/workflow/engine.js +0 -129
  150. package/dist/iris/workflow/steps.js +0 -448
  151. package/dist/iris/workflow/types.js +0 -1
  152. package/dist/iris_bundle/frameworks/iris-core/framework.yaml +0 -9
  153. package/dist/iris_bundle/frameworks/iris-core/memory/memory-bank.yaml +0 -1
  154. package/dist/iris_bundle/frameworks/iris-core/policy.yaml +0 -7
  155. package/dist/iris_bundle/frameworks/iris-core/templates/config/memory-bank.yaml +0 -1
  156. package/dist/iris_bundle/frameworks/iris-core/templates/construction/bolt-types/spike-bolt.md +0 -240
  157. package/dist/lib.js +0 -96
  158. package/dist/templates/construction/bolt-template.md +0 -226
  159. package/dist/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -49
  160. package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -55
  161. package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -67
  162. package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -62
  163. package/dist/templates/construction/bolt-types/ddd-construction-bolt.md +0 -528
  164. package/dist/templates/construction/bolt-types/simple-construction-bolt.md +0 -347
  165. package/dist/templates/inception/requirements-template.md +0 -144
  166. package/dist/templates/inception/stories-template.md +0 -38
  167. package/dist/templates/inception/story-template.md +0 -147
  168. package/dist/templates/inception/system-context-template.md +0 -29
  169. package/dist/templates/inception/unit-brief-template.md +0 -177
  170. package/dist/templates/inception/units-template.md +0 -52
  171. package/dist/utils/exit-codes.js +0 -7
  172. package/dist/utils/logo.js +0 -17
  173. package/dist/workflows/bolt-execution.js +0 -238
  174. package/dist/workflows/bolt-plan.js +0 -221
  175. package/dist/workflows/intent-inception.js +0 -285
  176. package/dist/workflows/memory-bank-generator.js +0 -180
  177. package/dist/workflows/reporting.js +0 -74
  178. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-template.md +0 -0
  179. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -0
  180. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -0
  181. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -0
  182. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -0
  183. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/simple-construction-bolt.md +0 -0
  184. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/requirements-template.md +0 -0
  185. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/stories-template.md +0 -0
  186. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/story-template.md +0 -0
  187. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/system-context-template.md +0 -0
  188. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/unit-brief-template.md +0 -0
  189. /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/units-template.md +0 -0
@@ -1,100 +0,0 @@
1
- import { Command } from "commander";
2
- import inquirer from "inquirer";
3
- import kleur from "kleur";
4
- import { repoRoot } from "../lib.js";
5
- import { detectTools, installIris, TOOLS } from "../iris/installer.js";
6
- import { setSelectedIde } from "../iris/state.js";
7
- import { displayLogo } from "../utils/logo.js";
8
- export const installCommand = new Command("install")
9
- .description("Install IRIS doctrine under .iris and install tool commands into this repo (interactive).")
10
- .option("-y, --yes", "Skip prompts and use default/detected values")
11
- .option("-f, --force", "Overwrite existing files")
12
- .option("--tools <items>", "Comma-separated list of tools to install (e.g. cursor,vscode)")
13
- .action(async (options) => {
14
- // Display OSiris logo banner
15
- displayLogo("0.0.11");
16
- const root = repoRoot();
17
- // Step 1: Detect agentic coding tools
18
- console.log(kleur.bold(`(1/4) Detecting agentic coding tools...`));
19
- const defaults = detectTools(root);
20
- if (defaults.length > 0) {
21
- console.log(kleur.gray(` Found: ${defaults.join(", ")}`));
22
- }
23
- else {
24
- console.log(kleur.gray(" No agentic coding tools detected"));
25
- }
26
- console.log("");
27
- // Step 2: Select target tools
28
- let selectedTools = [];
29
- if (options.yes || options.tools) {
30
- if (options.tools) {
31
- selectedTools = options.tools.split(",").map((t) => t.trim().toLowerCase());
32
- // Validate? (optional but good)
33
- }
34
- else {
35
- selectedTools = defaults.length > 0 ? defaults : ["cursor"]; // Fallback default
36
- }
37
- console.log(kleur.bold(`(2/4) Select target tools`));
38
- console.log(kleur.gray(` [Space] = toggle [Enter] confirm [a] toggle all`));
39
- console.log(kleur.green(` [x] = selected [ ] = not selected`));
40
- console.log("");
41
- selectedTools.forEach(t => {
42
- console.log(kleur.green(` ◉ ${t.charAt(0).toUpperCase() + t.slice(1)}`));
43
- });
44
- console.log("");
45
- }
46
- else {
47
- // Step B: Prompt
48
- console.log(kleur.bold(`(2/4) Select target tools`));
49
- const { tools } = await inquirer.prompt([
50
- {
51
- type: "checkbox",
52
- name: "tools",
53
- message: "Choose tools:",
54
- prefix: "?",
55
- choices: TOOLS.map(t => ({
56
- name: t.charAt(0).toUpperCase() + t.slice(1), // Capitalize
57
- value: t,
58
- checked: defaults.includes(t)
59
- })),
60
- validate: (arr) => (arr.length ? true : "Select at least one tool."),
61
- },
62
- ]);
63
- selectedTools = tools;
64
- console.log("");
65
- }
66
- console.log(kleur.bold("(3/4) Installing iris-core framework..."));
67
- // Step 3: Core Installer - Install framework and tools
68
- await installIris(root, selectedTools, options);
69
- console.log("");
70
- console.log(kleur.bold("(4/4) Finalizing setup..."));
71
- // Persist IDE selection for iris develop
72
- let selectedIde = selectedTools[0];
73
- if (!options.yes && selectedTools.length > 1) {
74
- // Only prompt if interactive
75
- const { ide } = await inquirer.prompt([
76
- {
77
- type: "list",
78
- name: "ide",
79
- message: "Which IDE will you primarily use with 'iris develop'?",
80
- choices: selectedTools.map(t => ({
81
- name: t.charAt(0).toUpperCase() + t.slice(1),
82
- value: t
83
- }))
84
- }
85
- ]);
86
- selectedIde = ide;
87
- }
88
- // If non-interactive and multiple tools, first one is default IDE.
89
- setSelectedIde(selectedIde);
90
- console.log("");
91
- console.log(kleur.bold().green("✓ IRIS install complete."));
92
- console.log("");
93
- console.log(kleur.gray("Installation Summary"));
94
- console.log(kleur.gray("───────────────────────"));
95
- console.log(kleur.gray(`Doctrine: .iris/aidlc`));
96
- console.log(kleur.gray(`Policy: .iris/policy.yaml`));
97
- console.log(kleur.gray(`Tools: ${selectedTools.join(", ")}`));
98
- console.log(kleur.gray(`Primary IDE: ${selectedIde}`));
99
- console.log("");
100
- });
@@ -1,33 +0,0 @@
1
- import { Command } from "commander";
2
- import { generatePack } from "../iris/packer.js";
3
- import { resolveActiveFramework } from "../iris/framework-context.js";
4
- function collect(value, previous) {
5
- return previous.concat([value]);
6
- }
7
- export const packCommand = new Command("pack")
8
- .description("Generate a deterministic context bundle (markdown) for an agent.")
9
- .option("--agent <agent>", "Target agent (inception|construction|operations|master)")
10
- .option("--phase <phase>", "Target phase (overrides state.phase.current)")
11
- .option("--out <path>", "Output file path (default: .iris/inbox/context-<phase>-<agent>.md)")
12
- .option("--stdout", "Print bundle to stdout instead of writing file", false)
13
- .option("--json", "Output result as JSON", false)
14
- .option("--strict", "Fail on validation warnings", false)
15
- .option("--max-bytes <n>", "Maximum size in bytes", (val) => parseInt(val, 10), 1_500_000)
16
- .option("--include <glob>", "Glob pattern to include files (repeatable)", collect, [])
17
- .option("--exclude <glob>", "Glob pattern to exclude files (repeatable)", collect, [])
18
- .action(async (opts) => {
19
- // Wiring up framework resolution as per Step 4 plan (no functional change to packer yet)
20
- const { resolution } = await resolveActiveFramework();
21
- await generatePack({
22
- agent: opts.agent,
23
- phase: opts.phase,
24
- output: opts.out,
25
- stdout: opts.stdout,
26
- json: opts.json,
27
- strict: opts.strict,
28
- maxBytes: opts.maxBytes,
29
- includes: opts.include,
30
- excludes: opts.exclude,
31
- frameworkResolution: resolution
32
- });
33
- });
@@ -1,38 +0,0 @@
1
- import { Command } from "commander";
2
- import kleur from "kleur";
3
- import { loadState, saveState } from "../iris/state.js";
4
- import { loadPolicy } from "../iris/policy.js";
5
- import { EXIT_CODES } from "../utils/exit-codes.js";
6
- export const phaseCommand = new Command("phase")
7
- .description("Manage IRIS lifecycle phases");
8
- phaseCommand
9
- .command("set")
10
- .description("Request a transition to a new phase")
11
- .argument("<phase>", "The target phase to transition to")
12
- .action((phaseName) => {
13
- // 1. Validate phase exists in policy
14
- const policy = loadPolicy();
15
- if (!policy.phases[phaseName]) {
16
- console.error(kleur.red(`Error: Phase '${phaseName}' is not defined in policy.`));
17
- console.log("Available phases: " + Object.keys(policy.phases).join(", "));
18
- process.exit(EXIT_CODES.POLICY_ERROR);
19
- }
20
- // 2. Load state
21
- const state = loadState();
22
- // 3. Write request
23
- state.phase.requested = phaseName;
24
- try {
25
- saveState(state);
26
- }
27
- catch (e) {
28
- console.error(kleur.red("Failed to save state."));
29
- process.exit(EXIT_CODES.STATE_ERROR);
30
- }
31
- // 4. Print output
32
- console.log("");
33
- console.log(`Current Phase: ${kleur.cyan(state.phase.current)}`);
34
- console.log(`Requested Phase: ${kleur.yellow(state.phase.requested || "")}`);
35
- console.log("");
36
- console.log(kleur.bold("Next: ") + "Run " + kleur.green("iris validate --apply") + " to commit this transition.");
37
- console.log("");
38
- });
@@ -1,199 +0,0 @@
1
- import { Command } from "commander";
2
- import kleur from "kleur";
3
- import path from "path";
4
- import fs from "fs";
5
- import { repoRoot } from "../lib.js";
6
- import { loadState, getActiveFramework, saveState } from "../iris/state.js";
7
- import { WorkflowEngine } from "../iris/workflow/engine.js";
8
- import { loadEffectiveWorkflowConfig } from "../iris/workflow/config.js";
9
- import { EXEC_REGISTRY } from "../iris/workflow/steps.js";
10
- import { loadFramework } from "../framework/framework-loader.js";
11
- export const runCommand = new Command("run")
12
- .description("Execute the IRIS workflow loop")
13
- .option("--new", "Start a new run (even if one exists)", false)
14
- .option("--resume [runId]", "Resume a specific run ID")
15
- .option("--seed <path>", "Seed run with an existing intent draft")
16
- .option("--step <id>", "Execute only a specific step")
17
- .option("--force", "Force re-execution of done steps", false)
18
- .option("--json", "Output machine-readable status", false)
19
- .option("--no-interactive", "Disable interactive prompts (Block if input needed)")
20
- .action(async (options) => {
21
- const root = repoRoot();
22
- try {
23
- // 1. Resolve Run Context
24
- let engine;
25
- let runId = options.resume === true ? undefined : options.resume; // --resume might be boolean true if no arg? No, [runId] means optional arg.
26
- // If --resume passed without arg, commander sets it to true? Commander syntax [runId] sets it to true if flag present but no arg?
27
- // Wait, argument [runId] means optional.
28
- // If I run `iris run --resume`, `options.resume` is `true`? Or `runId`?
29
- // Need to handle `true`.
30
- if (typeof options.resume === 'boolean') {
31
- runId = undefined; // Implies "resume latest" explicitly requested
32
- }
33
- const latestId = WorkflowEngine.getLatestRunId(root);
34
- if (options.new || (!runId && !latestId)) {
35
- // START NEW RUN
36
- // Resolve Active Framework for configuration
37
- const state = loadState();
38
- const active = getActiveFramework(state);
39
- // Load framework config
40
- let framework = null;
41
- try {
42
- if (active.current) {
43
- framework = await loadFramework(active.current, { repoRoot: root });
44
- }
45
- }
46
- catch (e) {
47
- // Ignore framework load error? Default workflow will use default.
48
- // But we should probably warn.
49
- if (options.json) {
50
- // We are creating a run, hard to report json error before engine exists?
51
- }
52
- else {
53
- console.warn(kleur.yellow(`Warning: Could not load framework '${active.current}'. Using default workflow.`));
54
- }
55
- }
56
- const workflowConfig = loadEffectiveWorkflowConfig(framework);
57
- engine = WorkflowEngine.create(root, active.current, active.version || null, workflowConfig);
58
- if (!options.json) {
59
- console.log(kleur.bold(`Started new run: ${kleur.cyan(engine.getRunId())}`));
60
- console.log(kleur.dim(`Framework: ${active.current}`));
61
- }
62
- }
63
- else {
64
- // RESUME
65
- runId = runId || latestId;
66
- if (!runId) {
67
- // Should be unreachable due to !latestId check above
68
- throw new Error("No run to resume.");
69
- }
70
- try {
71
- engine = WorkflowEngine.load(root, runId);
72
- if (!options.json) {
73
- console.log(kleur.bold(`Resuming run: ${kleur.cyan(runId)}`));
74
- }
75
- engine.appendEvent("RUN_RESUMED");
76
- // Assuming workflow config is baked into state, so no need to reload framework
77
- }
78
- catch (e) {
79
- console.error(kleur.red(`Failed to load run '${runId}': ${e.message}`));
80
- process.exit(1);
81
- }
82
- }
83
- // 2. Execution Loop
84
- const engineState = engine.getState();
85
- // Sync intentId to global state
86
- const state = loadState();
87
- state.active.intent_id = engineState.intentId;
88
- // Also sync other active fields if needed
89
- saveState(state);
90
- const steps = engineState.workflow.steps;
91
- // Filter steps?
92
- const targetSteps = options.step
93
- ? steps.filter(s => s.id === options.step)
94
- : steps;
95
- if (targetSteps.length === 0) {
96
- console.error(kleur.red(`Step '${options.step}' not found in workflow.`));
97
- process.exit(1);
98
- }
99
- let blocked = false;
100
- let failed = false;
101
- for (const stepConfig of targetSteps) {
102
- if (stepConfig.enabled === false)
103
- continue;
104
- const status = engine.getStepStatus(stepConfig.id);
105
- const isDone = status?.status === 'done';
106
- fs.appendFileSync(path.join(root, 'debug.log'), `[DEBUG] Step ${stepConfig.id} status=${status?.status} isDone=${isDone}\n`);
107
- if (isDone && !options.force) {
108
- if (!options.json)
109
- console.log(kleur.dim(`✓ Step '${stepConfig.id}' already done.`));
110
- continue;
111
- }
112
- // Execute
113
- if (!options.json)
114
- console.log(kleur.bold(`\nRunning step: ${stepConfig.id}...`));
115
- engine.appendEvent("STEP_STARTED", { stepId: stepConfig.id });
116
- const executor = EXEC_REGISTRY[stepConfig.kind];
117
- if (!executor) {
118
- const msg = `Unknown step kind '${stepConfig.kind}'`;
119
- console.error(kleur.red(msg));
120
- engine.updateStepstatus(stepConfig.id, { status: "failed", error: msg });
121
- engine.appendEvent("STEP_FAILED", { stepId: stepConfig.id, error: msg });
122
- failed = true;
123
- break;
124
- }
125
- const result = await executor.execute(engineState, stepConfig, root, engine.getRunDir(), {
126
- interactive: options.interactive ?? true,
127
- seed: options.seed,
128
- force: options.force,
129
- quiet: options.json // Suppress stdout when --json is enabled
130
- });
131
- fs.appendFileSync(path.join(root, 'debug.log'), `[DEBUG] Step ${stepConfig.id} result result=${JSON.stringify(result)}\n`);
132
- // Update Status
133
- engine.updateStepstatus(stepConfig.id, {
134
- status: result.status,
135
- reason: result.reason,
136
- error: result.error,
137
- outputs: result.outputs
138
- });
139
- if (result.status === "failed") {
140
- if (!options.json)
141
- console.error(kleur.red(`✗ Step '${stepConfig.id}' failed: ${result.error}`));
142
- engine.appendEvent("STEP_FAILED", { stepId: stepConfig.id, error: result.error });
143
- failed = true;
144
- break;
145
- }
146
- else if (result.status === "blocked") {
147
- if (!options.json) {
148
- console.warn(kleur.yellow(`⚠ Step '${stepConfig.id}' blocked: ${result.reason}`));
149
- console.warn(kleur.dim(` To fix: ${result.error}`));
150
- }
151
- engine.appendEvent("STEP_BLOCKED", { stepId: stepConfig.id, msg: result.reason, error: result.error });
152
- blocked = true;
153
- break;
154
- }
155
- else {
156
- if (!options.json)
157
- console.log(kleur.green(`✓ Step '${stepConfig.id}' done.`));
158
- engine.appendEvent("STEP_DONE", { stepId: stepConfig.id, outputs: result.outputs });
159
- }
160
- }
161
- // Finish
162
- if (failed) {
163
- engine.appendEvent("RUN_FINISHED", { error: "Run failed" });
164
- if (options.json) {
165
- console.log(JSON.stringify(engine.getState(), null, 2));
166
- // console.error("DEBUG: Run failed. Exiting 1.");
167
- }
168
- process.exit(1);
169
- }
170
- else if (blocked) {
171
- // Blocked is special exit code 2
172
- engine.appendEvent("STEP_BLOCKED", { stepId: "run", msg: "Run blocked" }); // Ensure event log?
173
- if (options.json) {
174
- console.log(JSON.stringify(engine.getState(), null, 2));
175
- // console.error("DEBUG: Run blocked. Exiting 2.");
176
- }
177
- process.exit(2);
178
- }
179
- else {
180
- if (!options.step) {
181
- // Only mark run finished if we ran the full loop?
182
- // Or if cursor reached end?
183
- // For now, if no failure/block, we assume success.
184
- engine.appendEvent("RUN_FINISHED");
185
- }
186
- }
187
- if (options.json) {
188
- // Reload state to get latest updates
189
- console.log(JSON.stringify(engine.getState(), null, 2));
190
- }
191
- }
192
- catch (e) {
193
- console.error(kleur.red(`Run error: ${e.message}`));
194
- if (options.json) {
195
- console.log(JSON.stringify({ error: e.message }));
196
- }
197
- process.exit(1);
198
- }
199
- });
@@ -1,114 +0,0 @@
1
- import { Command } from "commander";
2
- import fs from "fs";
3
- import path from "path";
4
- import kleur from "kleur";
5
- import { validate } from "../iris/validator.js";
6
- import { loadState, DEFAULT_STATE } from "../iris/state.js";
7
- import { EXIT_CODES } from "../utils/exit-codes.js";
8
- function getIrisStatus() {
9
- const root = process.cwd();
10
- const policyPath = path.join(root, ".iris/policy.yaml");
11
- const doctrinePath = path.join(root, ".iris/aidlc");
12
- return {
13
- policy: fs.existsSync(policyPath),
14
- doctrine: fs.existsSync(doctrinePath)
15
- };
16
- }
17
- export const statusCommand = new Command("status")
18
- .description("Show IRIS validation status (informational)")
19
- .option("--json", "Output result as JSON", false)
20
- .action(async (options) => {
21
- // 1. Check basic presence
22
- const presence = getIrisStatus();
23
- // 2. Run validator in read-only mode
24
- // We catch errors here because status command should be safe and always exit 0
25
- let result = null;
26
- let error = null;
27
- try {
28
- result = await validate({
29
- apply: false,
30
- strict: false,
31
- writeBack: false // Do not mutate state
32
- });
33
- }
34
- catch (e) {
35
- error = e;
36
- }
37
- // 3. Load state manually just for reporting if validate failed completely
38
- let state = DEFAULT_STATE;
39
- try {
40
- state = loadState();
41
- }
42
- catch (e) {
43
- // failed to load state, use defaults
44
- }
45
- if (options.json) {
46
- const jsonOutput = {
47
- policy: { ok: presence.policy },
48
- doctrine: { ok: presence.doctrine },
49
- phase: {
50
- current: result ? result.phase.current : state.phase.current,
51
- requested: result ? result.phase.requested : state.phase.requested
52
- },
53
- last_validation: result ? state.last_validation : null,
54
- active: {
55
- flow: state.active.flow
56
- },
57
- summary: result ? {
58
- result: result.valid ? "valid" : "invalid",
59
- errors_count: result.errors.length,
60
- warnings_count: result.warnings ? 1 : 0, // simplistic
61
- top_errors: result.errors
62
- } : { error: "Validation failed to run" }
63
- };
64
- console.log(JSON.stringify(jsonOutput, null, 2));
65
- process.exit(EXIT_CODES.SUCCESS);
66
- }
67
- // Human Output
68
- console.log("");
69
- console.log(kleur.bold("IRIS Status"));
70
- console.log(`- Policy: ${presence.policy ? kleur.green("OK") : kleur.red("MISSING")} (.iris/policy.yaml)`);
71
- console.log(`- Doctrine: ${presence.doctrine ? kleur.green("OK") : kleur.red("MISSING")} (.iris/aidlc)`);
72
- if (result) {
73
- console.log(`- Phase: ${kleur.cyan(result.phase.current)}`);
74
- if (result.phase.requested) {
75
- console.log(`- Requested:${kleur.yellow(result.phase.requested)}`);
76
- }
77
- if (state.active && state.active.flow) {
78
- console.log(`- Active Flow: ${kleur.blue(state.active.flow)}`);
79
- }
80
- else {
81
- console.log(`- Active Flow: (none)`);
82
- }
83
- // Show validation result
84
- const validity = result.valid
85
- ? kleur.green("VALID")
86
- : kleur.red("INVALID");
87
- console.log(`- Last val.: ${validity} (dry-run just now)`);
88
- if (!result.valid && result.errors.length > 0) {
89
- console.log("");
90
- console.log(kleur.bold(`Issues (showing top ${Math.min(5, result.errors.length)}/${result.errors.length})`));
91
- result.errors.slice(0, 5).forEach((err, idx) => {
92
- console.log(kleur.yellow(`${idx + 1}) [${err.code}] ${err.path || ""}`));
93
- if (err.remediation)
94
- console.log(` Fix: ${kleur.dim(err.remediation)}`);
95
- });
96
- if (result.errors.length > 5) {
97
- console.log(kleur.dim(`... and ${result.errors.length - 5} more.`));
98
- }
99
- console.log("");
100
- console.log(kleur.dim("Hint: Run `iris validate` for full details."));
101
- }
102
- else {
103
- console.log("");
104
- console.log(kleur.green("System is healthy."));
105
- }
106
- }
107
- else {
108
- console.log(kleur.red("Validation engine failed to run."));
109
- if (error)
110
- console.log(error);
111
- }
112
- console.log("");
113
- process.exit(EXIT_CODES.SUCCESS);
114
- });
@@ -1,14 +0,0 @@
1
- import { Command } from "commander";
2
- import { uninstallIris } from "../iris/uninstaller.js";
3
- export const uninstallCommand = new Command("uninstall")
4
- .description("Remove .iris and tool command files installed by IRIS (manifest-driven).")
5
- .option("--keep-memory", "Keep memory-bank folder if present", false)
6
- .option("--yes", "Run non-interactively (defaults to safe preservation)", false)
7
- .option("--force", "Skip confirmations where possible", false)
8
- .action(async (opts) => {
9
- await uninstallIris({
10
- keepMemory: opts.keepMemory,
11
- force: opts.force,
12
- yes: opts.yes
13
- });
14
- });
@@ -1,20 +0,0 @@
1
- import { Command } from "commander";
2
- import kleur from "kleur";
3
- import { setSelectedIde } from "../iris/state.js";
4
- import { TOOLS } from "../iris/installer.js";
5
- export const useCommand = new Command("use")
6
- .description("Set the active IDE/Tool for IRIS")
7
- .argument("<ide>", "IDE ID (cursor, vscode, auto, etc.)")
8
- .action((ide) => {
9
- const normalized = ide.toLowerCase();
10
- // Validation (Soft)
11
- if (!TOOLS.includes(normalized)) {
12
- console.log(kleur.yellow(`Warning: '${ide}' is not in the standard tools list.`));
13
- console.log(kleur.dim(`Available: ${TOOLS.join(", ")}`));
14
- }
15
- setSelectedIde(normalized);
16
- console.log(kleur.green(`✓ Active IDE set to: ${normalized}`));
17
- if (normalized === "auto") {
18
- console.log(kleur.cyan(" In-Process Agent enabled (background mode)."));
19
- }
20
- });
@@ -1,102 +0,0 @@
1
- import { Command } from "commander";
2
- import kleur from "kleur";
3
- import { validate } from "../iris/validator.js";
4
- import { printReport } from "../iris/report.js";
5
- import { collectFixPlan, applyFixPlan } from "../iris/fixer.js";
6
- import { EXIT_CODES } from "../utils/exit-codes.js";
7
- import { resolveActiveFramework } from "../iris/framework-context.js";
8
- export const validateCommand = new Command("validate")
9
- // ...
10
- .action(async (options) => {
11
- const { resolution } = await resolveActiveFramework();
12
- try {
13
- // 1. First Validation Pass
14
- if (!options.fix && !options.fixDryRun) {
15
- const result = await validate({
16
- apply: options.apply || false,
17
- phase: options.phase,
18
- strict: options.strict || false,
19
- frameworkResolution: resolution,
20
- });
21
- printReport(result, options.json, undefined, options.strict);
22
- let exitCode = EXIT_CODES.SUCCESS;
23
- if (!result.valid) {
24
- exitCode = EXIT_CODES.INVALID;
25
- }
26
- else if (options.strict && result.warnings) {
27
- exitCode = EXIT_CODES.VALID_WITH_WARNINGS;
28
- }
29
- process.exit(exitCode);
30
- }
31
- // 2. Fix Mode
32
- // Pass 1: Discovery
33
- const result1 = await validate({
34
- apply: false,
35
- phase: options.phase,
36
- strict: options.strict || false,
37
- writeBack: false,
38
- frameworkResolution: resolution,
39
- });
40
- if (result1.valid && !result1.warnings) {
41
- if (options.json) {
42
- printReport(result1, true);
43
- }
44
- else {
45
- console.log(kleur.green("✓ Repository is valid. No fixes needed."));
46
- }
47
- process.exit(EXIT_CODES.SUCCESS);
48
- }
49
- // Collect Plan
50
- const plan = collectFixPlan(result1);
51
- if (plan.actions.length === 0) {
52
- if (options.json) {
53
- printReport(result1, true);
54
- }
55
- else {
56
- console.log(kleur.yellow("No fixable missing artifacts found."));
57
- printReport(result1, false, undefined, options.strict);
58
- }
59
- process.exit(EXIT_CODES.INVALID); // Changed from POLICY_ERROR
60
- }
61
- // Apply Fixes
62
- const fixResult = await applyFixPlan(plan, {
63
- dryRun: options.fixDryRun,
64
- yes: options.yes
65
- });
66
- if (options.fixDryRun) {
67
- process.exit(EXIT_CODES.SUCCESS);
68
- }
69
- // 3. Re-validate (Final Pass)
70
- const result2 = await validate({
71
- apply: options.apply || false,
72
- phase: options.phase,
73
- strict: options.strict || false,
74
- writeBack: true,
75
- frameworkResolution: resolution,
76
- });
77
- printReport(result2, options.json, fixResult, options.strict);
78
- let exitCode = EXIT_CODES.SUCCESS;
79
- if (!result2.valid) {
80
- exitCode = EXIT_CODES.INVALID; // Changed from POLICY_ERROR
81
- }
82
- else if (options.strict && result2.warnings) {
83
- exitCode = EXIT_CODES.VALID_WITH_WARNINGS;
84
- }
85
- process.exit(exitCode);
86
- }
87
- catch (e) {
88
- if (e.name === "PolicyOverlayMissingError") {
89
- console.error(kleur.red(`\n[Policy Error] ${e.message}`));
90
- process.exit(EXIT_CODES.POLICY_ERROR);
91
- }
92
- if (e.name === "PolicyLoadError") {
93
- console.error(kleur.red(`\n[Policy Error] ${e.message}`));
94
- if (e.cause)
95
- console.error(kleur.gray(e.cause));
96
- process.exit(EXIT_CODES.POLICY_ERROR);
97
- }
98
- // Unexpected
99
- console.error(kleur.red(`\n[Unexpected Error] ${e.message}`));
100
- process.exit(EXIT_CODES.INVALID);
101
- }
102
- });