project-iris 0.0.12 → 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.
- package/README.md +214 -323
- package/bin/cli.js +21 -0
- package/flows/aidlc/README.md +372 -0
- package/flows/aidlc/agents/construction-agent.md +79 -0
- package/flows/aidlc/agents/inception-agent.md +97 -0
- package/flows/aidlc/agents/master-agent.md +61 -0
- package/flows/aidlc/agents/operations-agent.md +89 -0
- package/flows/aidlc/commands/construction-agent.md +63 -0
- package/flows/aidlc/commands/inception-agent.md +55 -0
- package/flows/aidlc/commands/master-agent.md +47 -0
- package/flows/aidlc/commands/operations-agent.md +77 -0
- package/flows/aidlc/context-config.yaml +67 -0
- package/flows/aidlc/memory-bank.yaml +104 -0
- package/flows/aidlc/quick-start.md +322 -0
- package/flows/aidlc/skills/construction/bolt-list.md +163 -0
- package/flows/aidlc/skills/construction/bolt-replan.md +345 -0
- package/flows/aidlc/skills/construction/bolt-start.md +442 -0
- package/flows/aidlc/skills/construction/bolt-status.md +185 -0
- package/flows/aidlc/skills/construction/navigator.md +196 -0
- package/flows/aidlc/skills/inception/bolt-plan.md +372 -0
- package/flows/aidlc/skills/inception/context.md +171 -0
- package/flows/aidlc/skills/inception/intent-create.md +211 -0
- package/flows/aidlc/skills/inception/intent-list.md +124 -0
- package/flows/aidlc/skills/inception/navigator.md +207 -0
- package/flows/aidlc/skills/inception/requirements.md +227 -0
- package/flows/aidlc/skills/inception/review.md +248 -0
- package/flows/aidlc/skills/inception/story-create.md +304 -0
- package/flows/aidlc/skills/inception/units.md +278 -0
- package/flows/aidlc/skills/master/analyze-context.md +239 -0
- package/flows/aidlc/skills/master/answer-question.md +141 -0
- package/flows/aidlc/skills/master/explain-flow.md +158 -0
- package/flows/aidlc/skills/master/project-init.md +281 -0
- package/flows/aidlc/skills/master/route-request.md +126 -0
- package/flows/aidlc/skills/operations/build.md +237 -0
- package/flows/aidlc/skills/operations/deploy.md +259 -0
- package/flows/aidlc/skills/operations/monitor.md +265 -0
- package/flows/aidlc/skills/operations/navigator.md +209 -0
- package/flows/aidlc/skills/operations/verify.md +224 -0
- package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt.md +3 -3
- package/{dist → flows/aidlc}/templates/construction/bolt-types/spike-bolt.md +2 -2
- package/flows/aidlc/templates/construction/construction-log-template.md +129 -0
- package/flows/aidlc/templates/construction/standards/coding-standards.md +29 -0
- package/flows/aidlc/templates/construction/standards/system-architecture.md +22 -0
- package/flows/aidlc/templates/construction/standards/tech-stack.md +19 -0
- package/flows/aidlc/templates/inception/inception-log-template.md +134 -0
- package/flows/aidlc/templates/inception/project/README.md +55 -0
- package/flows/aidlc/templates/standards/catalog.yaml +345 -0
- package/flows/aidlc/templates/standards/coding-standards.guide.md +553 -0
- package/flows/aidlc/templates/standards/data-stack.guide.md +162 -0
- package/flows/aidlc/templates/standards/tech-stack.guide.md +280 -0
- package/lib/InstallerFactory.js +36 -0
- package/lib/analytics/env-detector.js +92 -0
- package/lib/analytics/index.js +22 -0
- package/lib/analytics/machine-id.js +33 -0
- package/lib/analytics/tracker.js +232 -0
- package/lib/cli-utils.js +342 -0
- package/lib/constants.js +32 -0
- package/lib/installer.js +402 -0
- package/lib/installers/AntigravityInstaller.js +22 -0
- package/lib/installers/ClaudeInstaller.js +85 -0
- package/lib/installers/ClineInstaller.js +21 -0
- package/lib/installers/CodexInstaller.js +21 -0
- package/lib/installers/CopilotInstaller.js +113 -0
- package/lib/installers/CursorInstaller.js +63 -0
- package/lib/installers/GeminiInstaller.js +75 -0
- package/lib/installers/KiroInstaller.js +22 -0
- package/lib/installers/OpenCodeInstaller.js +22 -0
- package/lib/installers/RooInstaller.js +22 -0
- package/lib/installers/ToolInstaller.js +73 -0
- package/lib/installers/WindsurfInstaller.js +22 -0
- package/lib/markdown-validator.ts +175 -0
- package/lib/yaml-validator.ts +99 -0
- package/package.json +105 -32
- package/scripts/artifact-validator.js +594 -0
- package/scripts/bolt-complete.js +606 -0
- package/scripts/status-integrity.js +598 -0
- package/dist/bridge/agent-runner.js +0 -190
- package/dist/bridge/connector-factory.js +0 -31
- package/dist/bridge/connectors/antigravity-connector.js +0 -18
- package/dist/bridge/connectors/cursor-connector.js +0 -31
- package/dist/bridge/connectors/in-process-connector.js +0 -29
- package/dist/bridge/connectors/vscode-connector.js +0 -31
- package/dist/bridge/connectors/windsurf-connector.js +0 -23
- package/dist/bridge/filesystem-connector.js +0 -110
- package/dist/bridge/helper.js +0 -203
- package/dist/bridge/types.js +0 -10
- package/dist/cli.js +0 -40
- package/dist/commands/ask.js +0 -259
- package/dist/commands/bridge.js +0 -88
- package/dist/commands/create.js +0 -25
- package/dist/commands/develop.js +0 -141
- package/dist/commands/doctor.js +0 -102
- package/dist/commands/flow.js +0 -301
- package/dist/commands/framework.js +0 -273
- package/dist/commands/generate.js +0 -59
- package/dist/commands/install.js +0 -100
- package/dist/commands/pack.js +0 -33
- package/dist/commands/phase.js +0 -38
- package/dist/commands/run.js +0 -199
- package/dist/commands/status.js +0 -114
- package/dist/commands/uninstall.js +0 -14
- package/dist/commands/use.js +0 -20
- package/dist/commands/validate.js +0 -102
- package/dist/framework/framework-loader.js +0 -97
- package/dist/framework/framework-paths.js +0 -48
- package/dist/framework/framework-types.js +0 -15
- package/dist/iris/artifact-checker.js +0 -78
- package/dist/iris/artifacts/config.js +0 -68
- package/dist/iris/artifacts/generator.js +0 -88
- package/dist/iris/artifacts/types.js +0 -1
- package/dist/iris/bundle.js +0 -44
- package/dist/iris/doctrine/collector.js +0 -124
- package/dist/iris/fixer.js +0 -149
- package/dist/iris/flows/manifest.js +0 -124
- package/dist/iris/framework-context.js +0 -49
- package/dist/iris/framework-manager.js +0 -215
- package/dist/iris/fs/atomic.js +0 -22
- package/dist/iris/guard.js +0 -38
- package/dist/iris/importers/index.js +0 -9
- package/dist/iris/importers/types.js +0 -8
- package/dist/iris/importers/writer.js +0 -139
- package/dist/iris/include.js +0 -49
- package/dist/iris/installer.js +0 -334
- package/dist/iris/interactive/env.js +0 -21
- package/dist/iris/interactive/intent-interview.js +0 -345
- package/dist/iris/interactive/intent-schema.js +0 -28
- package/dist/iris/interactive/interview-io.js +0 -22
- package/dist/iris/interview/config.js +0 -71
- package/dist/iris/interview/types.js +0 -16
- package/dist/iris/interview/utils.js +0 -38
- package/dist/iris/manifest.js +0 -54
- package/dist/iris/packer.js +0 -325
- package/dist/iris/parsers/unit-parser.js +0 -43
- package/dist/iris/paths.js +0 -18
- package/dist/iris/policy.js +0 -133
- package/dist/iris/proc.js +0 -56
- package/dist/iris/report.js +0 -53
- package/dist/iris/resolver.js +0 -66
- package/dist/iris/router.js +0 -114
- package/dist/iris/routes.js +0 -189
- package/dist/iris/run-state.js +0 -146
- package/dist/iris/state.js +0 -113
- package/dist/iris/templates.js +0 -70
- package/dist/iris/tmp.js +0 -24
- package/dist/iris/uninstaller.js +0 -181
- package/dist/iris/utils/interpolate.js +0 -42
- package/dist/iris/validator.js +0 -391
- package/dist/iris/workflow/config.js +0 -51
- package/dist/iris/workflow/engine.js +0 -129
- package/dist/iris/workflow/steps.js +0 -448
- package/dist/iris/workflow/types.js +0 -1
- package/dist/iris_bundle/frameworks/iris-core/framework.yaml +0 -9
- package/dist/iris_bundle/frameworks/iris-core/memory/memory-bank.yaml +0 -1
- package/dist/iris_bundle/frameworks/iris-core/policy.yaml +0 -7
- package/dist/iris_bundle/frameworks/iris-core/templates/config/memory-bank.yaml +0 -1
- package/dist/iris_bundle/frameworks/iris-core/templates/construction/bolt-types/spike-bolt.md +0 -240
- package/dist/lib.js +0 -96
- package/dist/templates/construction/bolt-template.md +0 -226
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -49
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -55
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -67
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -62
- package/dist/templates/construction/bolt-types/ddd-construction-bolt.md +0 -528
- package/dist/templates/construction/bolt-types/simple-construction-bolt.md +0 -347
- package/dist/templates/inception/requirements-template.md +0 -144
- package/dist/templates/inception/stories-template.md +0 -38
- package/dist/templates/inception/story-template.md +0 -147
- package/dist/templates/inception/system-context-template.md +0 -29
- package/dist/templates/inception/unit-brief-template.md +0 -177
- package/dist/templates/inception/units-template.md +0 -52
- package/dist/utils/exit-codes.js +0 -7
- package/dist/utils/logo.js +0 -17
- package/dist/workflows/bolt-execution.js +0 -238
- package/dist/workflows/bolt-plan.js +0 -221
- package/dist/workflows/intent-inception.js +0 -285
- package/dist/workflows/memory-bank-generator.js +0 -180
- package/dist/workflows/reporting.js +0 -74
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/simple-construction-bolt.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/requirements-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/stories-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/story-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/system-context-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/unit-brief-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/units-template.md +0 -0
package/dist/commands/install.js
DELETED
|
@@ -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
|
-
});
|
package/dist/commands/pack.js
DELETED
|
@@ -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
|
-
});
|
package/dist/commands/phase.js
DELETED
|
@@ -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
|
-
});
|
package/dist/commands/run.js
DELETED
|
@@ -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
|
-
});
|
package/dist/commands/status.js
DELETED
|
@@ -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
|
-
});
|
package/dist/commands/use.js
DELETED
|
@@ -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
|
-
});
|