@kal-elsam/kairo-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.
- package/README.md +937 -0
- package/bin/harness.js +11 -0
- package/bin/kairo-runtime.js +11 -0
- package/bin/kairo.js +11 -0
- package/global-template/components/catalog.json +25 -0
- package/global-template/components/orchestrator/orchestrator.md +55 -0
- package/global-template/components/sdd-core/handoff.md +38 -0
- package/global-template/components/sdd-core/spec-sizing.md +38 -0
- package/global-template/components/sdd-core/workflow.md +31 -0
- package/global-template/core/orchestrator.md +55 -0
- package/package.json +64 -0
- package/prompts/HARNESS_ENFORCEMENT_UPGRADE.md +11 -0
- package/prompts/HARNESS_ENTERPRISE.md +33 -0
- package/prompts/HARNESS_INSTALLER_MASTER.md +853 -0
- package/prompts/HARNESS_MINIMAL.md +30 -0
- package/prompts/HARNESS_SPEC_SIZING_UPGRADE.md +41 -0
- package/prompts/HARNESS_STANDARD.md +35 -0
- package/prompts/HARNESS_UNIVERSAL_PARITY.md +56 -0
- package/repo-template/.claude/agents/adapter-parity-reviewer.md +17 -0
- package/repo-template/.claude/agents/architect.md +17 -0
- package/repo-template/.claude/agents/eval-engineer.md +17 -0
- package/repo-template/.claude/agents/reviewer.md +17 -0
- package/repo-template/.claude/agents/sdd-reviewer.md +17 -0
- package/repo-template/.claude/agents/sdd-spec-writer.md +17 -0
- package/repo-template/.claude/skills/checkpoint/SKILL.md +13 -0
- package/repo-template/.claude/skills/eval-design/SKILL.md +3 -0
- package/repo-template/.claude/skills/evals/SKILL.md +13 -0
- package/repo-template/.claude/skills/loop-engineering/SKILL.md +16 -0
- package/repo-template/.claude/skills/maintainability-review/SKILL.md +3 -0
- package/repo-template/.claude/skills/quality-gate-review/SKILL.md +3 -0
- package/repo-template/.claude/skills/sdd/SKILL.md +13 -0
- package/repo-template/.claude/skills/spec-complexity-classifier/SKILL.md +10 -0
- package/repo-template/.claude/skills/spec-escalation-review/SKILL.md +10 -0
- package/repo-template/.claude/skills/spec-intake/SKILL.md +10 -0
- package/repo-template/.claude/skills/tdd/SKILL.md +13 -0
- package/repo-template/.claude/skills/trust-review/SKILL.md +3 -0
- package/repo-template/.codex/skills/adapter-parity/SKILL.md +29 -0
- package/repo-template/.codex/skills/checkpoint/SKILL.md +36 -0
- package/repo-template/.codex/skills/eval-design/SKILL.md +3 -0
- package/repo-template/.codex/skills/evals/SKILL.md +28 -0
- package/repo-template/.codex/skills/loop-engineering/SKILL.md +24 -0
- package/repo-template/.codex/skills/maintainability-review/SKILL.md +3 -0
- package/repo-template/.codex/skills/quality-gate-review/SKILL.md +3 -0
- package/repo-template/.codex/skills/sdd/SKILL.md +30 -0
- package/repo-template/.codex/skills/spec-complexity-classifier/SKILL.md +10 -0
- package/repo-template/.codex/skills/spec-escalation-review/SKILL.md +10 -0
- package/repo-template/.codex/skills/spec-intake/SKILL.md +10 -0
- package/repo-template/.codex/skills/tdd/SKILL.md +27 -0
- package/repo-template/.codex/skills/trust-review/SKILL.md +3 -0
- package/repo-template/.cursor/agents/adapter-parity-reviewer.md +29 -0
- package/repo-template/.cursor/agents/architect.md +27 -0
- package/repo-template/.cursor/agents/context-engineer.md +27 -0
- package/repo-template/.cursor/agents/debugger.md +27 -0
- package/repo-template/.cursor/agents/eval-engineer.md +27 -0
- package/repo-template/.cursor/agents/harness-orchestrator.md +27 -0
- package/repo-template/.cursor/agents/loop-controller.md +17 -0
- package/repo-template/.cursor/agents/loop-debugger.md +16 -0
- package/repo-template/.cursor/agents/reviewer.md +27 -0
- package/repo-template/.cursor/agents/sdd/sdd-acceptance-reviewer.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-implementation-guardian.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-intake-analyst.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-orchestrator.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-spec-reviewer.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-spec-writer.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-task-breakdown.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-technical-planner.md +31 -0
- package/repo-template/.cursor/agents/sdd/sdd-test-planner.md +31 -0
- package/repo-template/.cursor/agents/spec-intake-analyst.md +14 -0
- package/repo-template/.cursor/agents/test-engineer.md +27 -0
- package/repo-template/.cursor/commands/adapter-parity.md +34 -0
- package/repo-template/.cursor/commands/checkpoint.md +30 -0
- package/repo-template/.cursor/commands/debug.md +13 -0
- package/repo-template/.cursor/commands/init-eval.md +12 -0
- package/repo-template/.cursor/commands/init-feature.md +12 -0
- package/repo-template/.cursor/commands/init-harness.md +13 -0
- package/repo-template/.cursor/commands/loop-debug.md +3 -0
- package/repo-template/.cursor/commands/loop-review.md +3 -0
- package/repo-template/.cursor/commands/loop-run.md +5 -0
- package/repo-template/.cursor/commands/review.md +21 -0
- package/repo-template/.cursor/commands/sdd-intake.md +18 -0
- package/repo-template/.cursor/commands/sdd-plan.md +18 -0
- package/repo-template/.cursor/commands/sdd-spec.md +18 -0
- package/repo-template/.cursor/commands/sdd-tasks.md +18 -0
- package/repo-template/.cursor/commands/sdd-validate.md +18 -0
- package/repo-template/.cursor/commands/spec-escalate.md +9 -0
- package/repo-template/.cursor/commands/spec-intake.md +10 -0
- package/repo-template/.cursor/commands/spec-size.md +21 -0
- package/repo-template/.cursor/rules/adapter-parity.mdc +20 -0
- package/repo-template/.cursor/rules/api.mdc +12 -0
- package/repo-template/.cursor/rules/core.mdc +21 -0
- package/repo-template/.cursor/rules/enforcement.mdc +16 -0
- package/repo-template/.cursor/rules/evals.mdc +10 -0
- package/repo-template/.cursor/rules/git.mdc +19 -0
- package/repo-template/.cursor/rules/harness.mdc +14 -0
- package/repo-template/.cursor/rules/loops.mdc +17 -0
- package/repo-template/.cursor/rules/testing.mdc +13 -0
- package/repo-template/.cursor/rules/ui.mdc +13 -0
- package/repo-template/.cursor/skills/api-design/SKILL.md +23 -0
- package/repo-template/.cursor/skills/architecture/SKILL.md +23 -0
- package/repo-template/.cursor/skills/code-review/SKILL.md +23 -0
- package/repo-template/.cursor/skills/context-graph/SKILL.md +23 -0
- package/repo-template/.cursor/skills/debugging/SKILL.md +23 -0
- package/repo-template/.cursor/skills/evals/SKILL.md +23 -0
- package/repo-template/.cursor/skills/git-workflow/SKILL.md +23 -0
- package/repo-template/.cursor/skills/testing/SKILL.md +23 -0
- package/repo-template/.cursor/skills/ui-design/SKILL.md +23 -0
- package/repo-template/.gentle-ai/README.md +37 -0
- package/repo-template/.gentle-ai/loops/README.md +27 -0
- package/repo-template/.gentle-ai/loops/sdd-tdd-repair.loop.md +27 -0
- package/repo-template/.gentle-ai/model-routing.md +25 -0
- package/repo-template/.github/copilot-instructions.md +37 -0
- package/repo-template/.github/dependabot.yml +11 -0
- package/repo-template/.github/instructions/harness.instructions.md +11 -0
- package/repo-template/.github/workflows/harness-quality-gate.yml +67 -0
- package/repo-template/.github/workflows/harness-security-gate.yml +32 -0
- package/repo-template/.harness/spec-sizing.json +33 -0
- package/repo-template/.opencode/README.md +71 -0
- package/repo-template/.opencode/agents/adapter-parity-reviewer.md +23 -0
- package/repo-template/.opencode/agents/architect.md +38 -0
- package/repo-template/.opencode/agents/checkpoint-reviewer.md +38 -0
- package/repo-template/.opencode/agents/eval-engineer.md +38 -0
- package/repo-template/.opencode/agents/loop-controller.md +38 -0
- package/repo-template/.opencode/agents/loop-debugger.md +38 -0
- package/repo-template/.opencode/agents/model-router.md +38 -0
- package/repo-template/.opencode/agents/sdd-orchestrator.md +38 -0
- package/repo-template/.opencode/agents/sdd-spec-reviewer.md +38 -0
- package/repo-template/.opencode/agents/spec-intake-analyst.md +19 -0
- package/repo-template/.opencode/agents/tdd-engineer.md +38 -0
- package/repo-template/.opencode/commands/checkpoint.md +3 -0
- package/repo-template/.opencode/commands/eval-design.md +3 -0
- package/repo-template/.opencode/commands/maintainability-review.md +3 -0
- package/repo-template/.opencode/commands/quality-gate.md +3 -0
- package/repo-template/.opencode/commands/spec-escalate.md +9 -0
- package/repo-template/.opencode/commands/spec-intake.md +10 -0
- package/repo-template/.opencode/commands/spec-size.md +21 -0
- package/repo-template/.opencode/commands/trust-review.md +3 -0
- package/repo-template/.opencode/loops/ai-behavior-improvement.loop.md +15 -0
- package/repo-template/.opencode/loops/bug-repair.loop.md +16 -0
- package/repo-template/.opencode/loops/documentation-sync.loop.md +13 -0
- package/repo-template/.opencode/loops/feature-development.loop.md +25 -0
- package/repo-template/.opencode/skills/spec-complexity-classifier/SKILL.md +10 -0
- package/repo-template/.opencode/skills/spec-escalation-review/SKILL.md +10 -0
- package/repo-template/.opencode/skills/spec-intake/SKILL.md +10 -0
- package/repo-template/.pi/README.md +21 -0
- package/repo-template/.pi/prompts/checkpoint.md +11 -0
- package/repo-template/.pi/prompts/loop-run.md +10 -0
- package/repo-template/.pi/prompts/sdd-plan.md +11 -0
- package/repo-template/.pi/prompts/sdd-spec.md +13 -0
- package/repo-template/.pi/prompts/spec-escalate.md +9 -0
- package/repo-template/.pi/prompts/spec-intake.md +10 -0
- package/repo-template/.pi/prompts/spec-size.md +21 -0
- package/repo-template/.pi/skills/adapter-parity/SKILL.md +7 -0
- package/repo-template/.pi/skills/checkpoint/SKILL.md +7 -0
- package/repo-template/.pi/skills/eval-design/SKILL.md +3 -0
- package/repo-template/.pi/skills/evals/SKILL.md +7 -0
- package/repo-template/.pi/skills/loop-engineering/SKILL.md +7 -0
- package/repo-template/.pi/skills/maintainability-review/SKILL.md +3 -0
- package/repo-template/.pi/skills/quality-gate-review/SKILL.md +3 -0
- package/repo-template/.pi/skills/sdd/SKILL.md +7 -0
- package/repo-template/.pi/skills/spec-complexity-classifier/SKILL.md +10 -0
- package/repo-template/.pi/skills/spec-escalation-review/SKILL.md +10 -0
- package/repo-template/.pi/skills/spec-intake/SKILL.md +10 -0
- package/repo-template/.pi/skills/tdd/SKILL.md +7 -0
- package/repo-template/.pi/skills/trust-review/SKILL.md +3 -0
- package/repo-template/AGENT.md +8 -0
- package/repo-template/AGENTS.md +165 -0
- package/repo-template/CLAUDE.md +9 -0
- package/repo-template/GEMINI.md +9 -0
- package/repo-template/docs/ai/adapter-parity.md +135 -0
- package/repo-template/docs/ai/agent-workflow.md +45 -0
- package/repo-template/docs/ai/api.md +28 -0
- package/repo-template/docs/ai/architecture.md +53 -0
- package/repo-template/docs/ai/context-budget.md +54 -0
- package/repo-template/docs/ai/context-graph.md +39 -0
- package/repo-template/docs/ai/conventions.md +34 -0
- package/repo-template/docs/ai/decision-log.md +5 -0
- package/repo-template/docs/ai/enforcement.md +63 -0
- package/repo-template/docs/ai/eval-strategy.md +42 -0
- package/repo-template/docs/ai/evals.md +44 -0
- package/repo-template/docs/ai/git-workflow.md +35 -0
- package/repo-template/docs/ai/governance.md +61 -0
- package/repo-template/docs/ai/harness.md +49 -0
- package/repo-template/docs/ai/installer-cli.md +34 -0
- package/repo-template/docs/ai/loop-log.md +5 -0
- package/repo-template/docs/ai/loop-observability.md +57 -0
- package/repo-template/docs/ai/loop-policy.md +86 -0
- package/repo-template/docs/ai/loops.md +95 -0
- package/repo-template/docs/ai/maintainability-gates.md +26 -0
- package/repo-template/docs/ai/memory.md +71 -0
- package/repo-template/docs/ai/model-policy.md +105 -0
- package/repo-template/docs/ai/observability-runtime.md +48 -0
- package/repo-template/docs/ai/provider-routing.md +138 -0
- package/repo-template/docs/ai/quality-gates.md +48 -0
- package/repo-template/docs/ai/rollback-runtime.md +25 -0
- package/repo-template/docs/ai/security.md +12 -0
- package/repo-template/docs/ai/spec-driven-development.md +124 -0
- package/repo-template/docs/ai/spec-escalation.md +44 -0
- package/repo-template/docs/ai/spec-intake.md +46 -0
- package/repo-template/docs/ai/spec-sizing.md +207 -0
- package/repo-template/docs/ai/test-driven-development.md +35 -0
- package/repo-template/docs/ai/testing.md +28 -0
- package/repo-template/docs/ai/tool-adapters.md +186 -0
- package/repo-template/docs/ai/trust-allowlist.md +5 -0
- package/repo-template/docs/ai/trust-policy.md +41 -0
- package/repo-template/docs/ai/ui.md +17 -0
- package/repo-template/docs/skills/adapter-parity-review.md +46 -0
- package/repo-template/docs/skills/api-design.md +37 -0
- package/repo-template/docs/skills/architecture.md +37 -0
- package/repo-template/docs/skills/code-review.md +37 -0
- package/repo-template/docs/skills/context-graph.md +38 -0
- package/repo-template/docs/skills/debugging.md +37 -0
- package/repo-template/docs/skills/eval-design.md +12 -0
- package/repo-template/docs/skills/evals.md +37 -0
- package/repo-template/docs/skills/git-workflow.md +37 -0
- package/repo-template/docs/skills/look-trust-review.md +12 -0
- package/repo-template/docs/skills/loop-debugging.md +16 -0
- package/repo-template/docs/skills/loop-design.md +39 -0
- package/repo-template/docs/skills/loop-retrospective.md +15 -0
- package/repo-template/docs/skills/loop-review.md +16 -0
- package/repo-template/docs/skills/maintainability-review.md +12 -0
- package/repo-template/docs/skills/model-selection.md +36 -0
- package/repo-template/docs/skills/quality-gate-review.md +12 -0
- package/repo-template/docs/skills/spec-complexity-classifier.md +41 -0
- package/repo-template/docs/skills/spec-escalation-review.md +34 -0
- package/repo-template/docs/skills/spec-intake.md +25 -0
- package/repo-template/docs/skills/testing.md +37 -0
- package/repo-template/docs/skills/tool-adapter-sync.md +36 -0
- package/repo-template/docs/skills/ui-design.md +37 -0
- package/repo-template/docs/specs/README.md +9 -0
- package/repo-template/docs/specs/templates/basic-spec.md +41 -0
- package/repo-template/docs/specs/templates/complex-spec.md +145 -0
- package/repo-template/docs/specs/templates/standard-spec.md +58 -0
- package/repo-template/evals/README.md +11 -0
- package/repo-template/evals/golden/sample-golden.json +12 -0
- package/repo-template/evals/loop-regression/README.md +11 -0
- package/repo-template/evals/regression/sample-regression.json +12 -0
- package/repo-template/evals/schema/sample-schema.json +12 -0
- package/repo-template/evals/tool-calls/sample-tool-calls.json +12 -0
- package/repo-template/opencode.json.sample +29 -0
- package/repo-template/scripts/harness/backup.mjs +7 -0
- package/repo-template/scripts/harness/doctor.mjs +20 -0
- package/repo-template/scripts/harness/run-evals.mjs +27 -0
- package/repo-template/setup-agent-links.sh +54 -0
- package/scripts/check-published-release.mjs +127 -0
- package/scripts/check-release-commit.mjs +32 -0
- package/scripts/install.sh +225 -0
- package/scripts/installer-smoke-test.sh +155 -0
- package/scripts/lib/attribution-guard.mjs +59 -0
- package/scripts/registry-smoke-test.sh +149 -0
- package/scripts/smoke-test.sh +197 -0
- package/scripts/ux-smoke-test.sh +140 -0
- package/src/cli.js +625 -0
- package/src/doctor.js +68 -0
- package/src/global/adapter-context.js +27 -0
- package/src/global/adapter-matrix.js +38 -0
- package/src/global/adapters/claude.js +8 -0
- package/src/global/adapters/codex.js +8 -0
- package/src/global/adapters/cursor.js +8 -0
- package/src/global/adapters/opencode.js +8 -0
- package/src/global/agents.js +7 -0
- package/src/global/apply-confirmation.js +62 -0
- package/src/global/backups.js +54 -0
- package/src/global/brand/cli.js +52 -0
- package/src/global/brand/index.js +85 -0
- package/src/global/clack/setup-preview.js +48 -0
- package/src/global/clack/setup-wizard-constants.js +6 -0
- package/src/global/clack/setup-wizard.js +207 -0
- package/src/global/clack/theme.js +145 -0
- package/src/global/component-authoring.js +121 -0
- package/src/global/component-builders.js +43 -0
- package/src/global/component-distribution.js +270 -0
- package/src/global/component-installer.js +106 -0
- package/src/global/component-paths.js +22 -0
- package/src/global/component-registry.js +89 -0
- package/src/global/components/orchestrator.js +14 -0
- package/src/global/components/sdd-core.js +17 -0
- package/src/global/diff.js +233 -0
- package/src/global/drift.js +264 -0
- package/src/global/explain.js +144 -0
- package/src/global/global-cli.js +1145 -0
- package/src/global/global-doctor.js +67 -0
- package/src/global/global-installer.js +284 -0
- package/src/global/history.js +313 -0
- package/src/global/ink/run-setup-ink.js +77 -0
- package/src/global/ink/setup-app.js +278 -0
- package/src/global/ink/setup-routing.js +51 -0
- package/src/global/ink/setup-state.js +180 -0
- package/src/global/ink/terminal.js +13 -0
- package/src/global/json-output.js +22 -0
- package/src/global/load-component-catalog.js +41 -0
- package/src/global/load-workspace-component-catalog.js +123 -0
- package/src/global/managed-body.js +28 -0
- package/src/global/managed-config-adapter.js +134 -0
- package/src/global/managed-section.js +73 -0
- package/src/global/npm-registry.js +25 -0
- package/src/global/paths.js +22 -0
- package/src/global/policy.js +344 -0
- package/src/global/preflight.js +65 -0
- package/src/global/registry.js +79 -0
- package/src/global/report.js +110 -0
- package/src/global/rollback.js +126 -0
- package/src/global/setup.js +284 -0
- package/src/global/state-migration.js +65 -0
- package/src/global/state.js +50 -0
- package/src/global/status.js +94 -0
- package/src/global/sync.js +129 -0
- package/src/global/upgrade.js +145 -0
- package/src/harness-files.js +145 -0
- package/src/harness-updater.js +120 -0
- package/src/hash.js +5 -0
- package/src/manifest.js +36 -0
- package/src/project-detection.js +105 -0
- package/src/template-installer.js +72 -0
- package/src/text-template.js +24 -0
- package/src/workspace-cli.js +115 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { harnessHomePaths } from "./paths.js";
|
|
3
|
+
|
|
4
|
+
export function buildAdapterContext({
|
|
5
|
+
homeDir,
|
|
6
|
+
packageName,
|
|
7
|
+
packageRoot = null,
|
|
8
|
+
workspaceRoot = null,
|
|
9
|
+
components = [],
|
|
10
|
+
dryRun = false,
|
|
11
|
+
timestamp = null
|
|
12
|
+
}) {
|
|
13
|
+
const paths = harnessHomePaths(homeDir);
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
homeDir,
|
|
17
|
+
paths,
|
|
18
|
+
packageRoot,
|
|
19
|
+
workspaceRoot,
|
|
20
|
+
packageName,
|
|
21
|
+
coreDir: paths.coreDir,
|
|
22
|
+
componentsDir: join(paths.root, "components"),
|
|
23
|
+
components,
|
|
24
|
+
dryRun,
|
|
25
|
+
timestamp
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { harnessHomePaths } from "./paths.js";
|
|
2
|
+
import { readGlobalState } from "./state.js";
|
|
3
|
+
import {
|
|
4
|
+
detectInstalledAdapters,
|
|
5
|
+
isAllAgentsSelection,
|
|
6
|
+
listAdapters
|
|
7
|
+
} from "./registry.js";
|
|
8
|
+
|
|
9
|
+
export async function buildAdapterMatrix(homeDir) {
|
|
10
|
+
const paths = harnessHomePaths(homeDir);
|
|
11
|
+
const state = await readGlobalState(paths.statePath);
|
|
12
|
+
const detected = detectInstalledAdapters({ homeDir });
|
|
13
|
+
const installedAgentIds = new Set((state?.adapters ?? state?.agents ?? []).map((entry) => entry.id));
|
|
14
|
+
|
|
15
|
+
return listAdapters().map((adapter) => ({
|
|
16
|
+
id: adapter.id,
|
|
17
|
+
label: adapter.label,
|
|
18
|
+
rootDir: adapter.assets.rootDir,
|
|
19
|
+
configFile: adapter.assets.configFile,
|
|
20
|
+
detected: detected.includes(adapter.id),
|
|
21
|
+
managed: installedAgentIds.has(adapter.id),
|
|
22
|
+
managedTargets: [...adapter.assets.managedTargets]
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function buildAdapterMatrixReport(homeDir) {
|
|
27
|
+
const matrix = await buildAdapterMatrix(homeDir);
|
|
28
|
+
const managedCount = matrix.filter((entry) => entry.managed).length;
|
|
29
|
+
const detectedCount = matrix.filter((entry) => entry.detected).length;
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
homeDir,
|
|
33
|
+
adapters: matrix,
|
|
34
|
+
managedCount,
|
|
35
|
+
detectedCount,
|
|
36
|
+
supportedCount: matrix.length
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import readline from "node:readline/promises";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
|
|
4
|
+
export function isInteractiveTerminal(interactive = null) {
|
|
5
|
+
if (interactive != null) return interactive;
|
|
6
|
+
return Boolean(input.isTTY && output.isTTY);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function shouldPromptApplyConfirmation({
|
|
10
|
+
applying = true,
|
|
11
|
+
dryRun = false,
|
|
12
|
+
json = false,
|
|
13
|
+
confirm = false,
|
|
14
|
+
interactive = null
|
|
15
|
+
}) {
|
|
16
|
+
if (!applying || dryRun || json || confirm) return false;
|
|
17
|
+
return isInteractiveTerminal(interactive);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function assertExplicitApplyConsent({
|
|
21
|
+
applying = true,
|
|
22
|
+
dryRun = false,
|
|
23
|
+
json = false,
|
|
24
|
+
yes = false,
|
|
25
|
+
confirm = false,
|
|
26
|
+
noPreflight = false,
|
|
27
|
+
interactive = null,
|
|
28
|
+
command
|
|
29
|
+
}) {
|
|
30
|
+
if (!applying || dryRun || json) return;
|
|
31
|
+
if (isInteractiveTerminal(interactive)) return;
|
|
32
|
+
if (yes || confirm || noPreflight) return;
|
|
33
|
+
|
|
34
|
+
throw new Error(
|
|
35
|
+
`Non-interactive ${command} requires --yes, --confirm, or --no-preflight before applying managed changes.`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function promptApplyConfirmation({
|
|
40
|
+
command,
|
|
41
|
+
createPrompt = createReadlinePrompt,
|
|
42
|
+
question = null
|
|
43
|
+
}) {
|
|
44
|
+
const prompt = createPrompt();
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const answer = (await prompt(
|
|
48
|
+
question ?? `Apply managed changes for ${command}? [Y/n]: `
|
|
49
|
+
)).trim().toLowerCase();
|
|
50
|
+
|
|
51
|
+
return !(answer === "n" || answer === "no");
|
|
52
|
+
} finally {
|
|
53
|
+
await prompt.close?.();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function createReadlinePrompt() {
|
|
58
|
+
const rl = readline.createInterface({ input, output });
|
|
59
|
+
const prompt = (question) => rl.question(question);
|
|
60
|
+
prompt.close = async () => rl.close();
|
|
61
|
+
return prompt;
|
|
62
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { copyFile, mkdir, readdir } from "node:fs/promises";
|
|
3
|
+
import { basename, join, relative, sep } from "node:path";
|
|
4
|
+
import { formatCliCommand } from "./brand/cli.js";
|
|
5
|
+
|
|
6
|
+
export function backupTimestamp(date = new Date()) {
|
|
7
|
+
return date.toISOString().replace(/[:.]/g, "-");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function backupFileBeforeChange({ backupsDir, homeDir, filePath, timestamp, dryRun = false }) {
|
|
11
|
+
if (!existsSync(filePath)) return null;
|
|
12
|
+
|
|
13
|
+
const relativeName = relative(homeDir, filePath).split(sep).join("__");
|
|
14
|
+
const backupName = relativeName.startsWith("..") ? basename(filePath) : relativeName;
|
|
15
|
+
const backupPath = join(backupsDir, timestamp, backupName);
|
|
16
|
+
|
|
17
|
+
if (!dryRun) {
|
|
18
|
+
await mkdir(join(backupsDir, timestamp), { recursive: true });
|
|
19
|
+
await copyFile(filePath, backupPath);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return backupPath;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function listBackupSnapshots(backupsDir) {
|
|
26
|
+
if (!existsSync(backupsDir)) return [];
|
|
27
|
+
|
|
28
|
+
const entries = await readdir(backupsDir, { withFileTypes: true });
|
|
29
|
+
|
|
30
|
+
return entries
|
|
31
|
+
.filter((entry) => entry.isDirectory())
|
|
32
|
+
.map((entry) => entry.name)
|
|
33
|
+
.sort();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function assertValidSnapshotName(snapshotName) {
|
|
37
|
+
if (!snapshotName || snapshotName.includes("/") || snapshotName.includes("\\") || snapshotName.includes("..")) {
|
|
38
|
+
throw new Error(`Invalid snapshot "${snapshotName}".`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function resolveSnapshotDir(backupsDir, snapshotName) {
|
|
43
|
+
assertValidSnapshotName(snapshotName);
|
|
44
|
+
|
|
45
|
+
const snapshotDir = join(backupsDir, snapshotName);
|
|
46
|
+
|
|
47
|
+
if (!existsSync(snapshotDir)) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`Snapshot not found: "${snapshotName}". Run "${formatCliCommand("backups")}" to list available snapshots.`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return snapshotDir;
|
|
54
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
|
|
3
|
+
export const PACKAGE_NAME = "@kal-elsam/kairo-runtime";
|
|
4
|
+
export const LEGACY_PACKAGE_NAME = "@kal-elsam/harness";
|
|
5
|
+
export const PREFERRED_CLI = "kairo";
|
|
6
|
+
|
|
7
|
+
export const PREFERRED_CLI_NAMES = new Set(["kairo", "kairo-runtime"]);
|
|
8
|
+
export const LEGACY_CLI_NAMES = new Set([
|
|
9
|
+
"harness",
|
|
10
|
+
"agentic-harness",
|
|
11
|
+
"sgs-harness",
|
|
12
|
+
"harness-sgs"
|
|
13
|
+
]);
|
|
14
|
+
export const ALL_CLI_NAMES = new Set([...PREFERRED_CLI_NAMES, ...LEGACY_CLI_NAMES]);
|
|
15
|
+
|
|
16
|
+
export function isLegacyCliName(name) {
|
|
17
|
+
return LEGACY_CLI_NAMES.has(name);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function legacyCliWarning(cliName) {
|
|
21
|
+
return `${cliName} is a legacy alias; prefer ${PREFERRED_CLI}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function normalizeInvokedCliBase(argv = process.argv) {
|
|
25
|
+
const invokedBase = basename(argv[1] ?? "");
|
|
26
|
+
if (invokedBase.endsWith(".js")) {
|
|
27
|
+
return invokedBase.slice(0, -3);
|
|
28
|
+
}
|
|
29
|
+
return invokedBase;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function resolveInvokedCliName(argv = process.argv) {
|
|
33
|
+
const invokedBase = normalizeInvokedCliBase(argv);
|
|
34
|
+
if (ALL_CLI_NAMES.has(invokedBase)) {
|
|
35
|
+
return invokedBase;
|
|
36
|
+
}
|
|
37
|
+
return PREFERRED_CLI;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function maybeWarnLegacyCli(argv = process.argv, { json = false } = {}) {
|
|
41
|
+
if (json) return;
|
|
42
|
+
|
|
43
|
+
const invokedBase = normalizeInvokedCliBase(argv);
|
|
44
|
+
if (isLegacyCliName(invokedBase)) {
|
|
45
|
+
console.warn(`Warning: ${legacyCliWarning(invokedBase)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function formatCliCommand(subcommand, cliName = PREFERRED_CLI) {
|
|
50
|
+
const trimmed = subcommand.trim();
|
|
51
|
+
return trimmed ? `${cliName} ${trimmed}` : cliName;
|
|
52
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const KAIRO_LOGO = [
|
|
2
|
+
"██╗ ██╗ █████╗ ██╗██████╗ ██████╗ ",
|
|
3
|
+
"██║ ██╔╝██╔══██╗██║██╔══██╗██╔═══██╗",
|
|
4
|
+
"█████╔╝ ███████║██║██████╔╝██║ ██║",
|
|
5
|
+
"██╔═██╗ ██╔══██║██║██╔══██╗██║ ██║",
|
|
6
|
+
"██║ ██╗██║ ██║██║██║ ██║╚██████╔╝",
|
|
7
|
+
"╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚═════╝ "
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
const COMPACT_LOGO = [
|
|
11
|
+
" _ __ ___ _ __ ",
|
|
12
|
+
"| |/ /|_ _| '_ \\ ",
|
|
13
|
+
"| ' < | || |_) |",
|
|
14
|
+
"|_|\\_\\|___| .__/ ",
|
|
15
|
+
" |_| "
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
export const BRAND = {
|
|
19
|
+
name: "KAIRO RUNTIME",
|
|
20
|
+
displayName: "Kairo Runtime",
|
|
21
|
+
tagline: "Local Agent Operating System",
|
|
22
|
+
splashLine: "Coordinates local AI agents — does not install the apps themselves.",
|
|
23
|
+
asciiLogo: KAIRO_LOGO,
|
|
24
|
+
compactLogo: COMPACT_LOGO,
|
|
25
|
+
splashHint: "Press Enter to continue",
|
|
26
|
+
wizardCancelMessage: "Setup cancelled."
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const AGENT_LABELS = {
|
|
30
|
+
cursor: "Cursor",
|
|
31
|
+
codex: "Codex",
|
|
32
|
+
opencode: "OpenCode",
|
|
33
|
+
claude: "Claude Code"
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const AGENT_SYMBOLS = {
|
|
37
|
+
cursor: "◆",
|
|
38
|
+
codex: "◆",
|
|
39
|
+
opencode: "◆",
|
|
40
|
+
claude: "◆"
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const TOKENS = {
|
|
44
|
+
success: "green",
|
|
45
|
+
warning: "yellow",
|
|
46
|
+
danger: "red",
|
|
47
|
+
muted: "gray",
|
|
48
|
+
accent: "cyan"
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const AGENT_HINTS = {
|
|
52
|
+
ready: "ready",
|
|
53
|
+
notDetected: "not detected",
|
|
54
|
+
managedLater: "managed later"
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const WIZARD_COPY = {
|
|
58
|
+
introTitle: `${BRAND.displayName} — ${BRAND.tagline}`,
|
|
59
|
+
splashTitle: "Welcome",
|
|
60
|
+
detectTitle: "Your agents",
|
|
61
|
+
agentsPrompt: `Which agents should ${BRAND.displayName} manage?`,
|
|
62
|
+
componentsPrompt: "Which components should be installed?",
|
|
63
|
+
previewTitle: "Plan preview",
|
|
64
|
+
confirmDryRun: "Preview only — no files will be written. Continue?",
|
|
65
|
+
confirmApply: "Apply this plan? Backups run before config writes when needed.",
|
|
66
|
+
resultDryRunTitle: "Dry run complete",
|
|
67
|
+
resultSuccessTitle: "Setup complete",
|
|
68
|
+
outroDryRun: "Nothing was written.",
|
|
69
|
+
outroSuccess: "Your local agent OS is ready.",
|
|
70
|
+
coreOnlyLabel: "Core only (no components)"
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export function getAgentLabel(agentId) {
|
|
74
|
+
return AGENT_LABELS[agentId] ?? agentId;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function getAgentSymbol(agentId) {
|
|
78
|
+
return AGENT_SYMBOLS[agentId] ?? "•";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function commandHeader(label) {
|
|
82
|
+
return `${BRAND.displayName} ${label}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { formatCliCommand, PREFERRED_CLI } from "./cli.js";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { installGlobalHarness } from "../global-installer.js";
|
|
2
|
+
import { summarizeInstallPreflight } from "../diff.js";
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_COMPONENT_IDS,
|
|
5
|
+
validateComponentIds
|
|
6
|
+
} from "../component-registry.js";
|
|
7
|
+
import { validateAdapterIds } from "../registry.js";
|
|
8
|
+
|
|
9
|
+
export async function buildSetupPreview({
|
|
10
|
+
homeDir,
|
|
11
|
+
workspaceRoot,
|
|
12
|
+
packageRoot,
|
|
13
|
+
packageName,
|
|
14
|
+
cliVersion,
|
|
15
|
+
agents,
|
|
16
|
+
components,
|
|
17
|
+
noDefaultComponents
|
|
18
|
+
}) {
|
|
19
|
+
const validatedAgents = validateAdapterIds(agents);
|
|
20
|
+
const plan = await installGlobalHarness({
|
|
21
|
+
packageRoot,
|
|
22
|
+
packageName,
|
|
23
|
+
cliVersion,
|
|
24
|
+
homeDir,
|
|
25
|
+
workspaceRoot,
|
|
26
|
+
agents: validatedAgents,
|
|
27
|
+
components,
|
|
28
|
+
noDefaultComponents,
|
|
29
|
+
dryRun: true
|
|
30
|
+
});
|
|
31
|
+
const preflight = await summarizeInstallPreflight(homeDir, plan);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
agents: validatedAgents,
|
|
35
|
+
components: noDefaultComponents ? [] : (components ?? [...DEFAULT_COMPONENT_IDS]),
|
|
36
|
+
plan,
|
|
37
|
+
preflight
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function resolveComponentSelection(selectedIds, { workspaceRoot }) {
|
|
42
|
+
if (selectedIds.includes("__none__")) {
|
|
43
|
+
return { noDefaults: true, selected: [] };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const selected = validateComponentIds(selectedIds, { workspaceRoot });
|
|
47
|
+
return { noDefaults: false, selected };
|
|
48
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as defaultPrompts from "@clack/prompts";
|
|
2
|
+
import { BRAND, getAgentLabel, WIZARD_COPY } from "../brand/index.js";
|
|
3
|
+
import { canUseSetupInk } from "../ink/terminal.js";
|
|
4
|
+
import { shouldUseClackWizard } from "../ink/setup-routing.js";
|
|
5
|
+
import { describeComponentCatalog, DEFAULT_COMPONENT_IDS } from "../component-registry.js";
|
|
6
|
+
import { loadConsentAudit } from "../policy.js";
|
|
7
|
+
import {
|
|
8
|
+
GLOBAL_AGENT_IDS,
|
|
9
|
+
detectInstalledAdapters,
|
|
10
|
+
listAdapters,
|
|
11
|
+
validateAdapterIds
|
|
12
|
+
} from "../registry.js";
|
|
13
|
+
import {
|
|
14
|
+
buildSetupPreview,
|
|
15
|
+
resolveComponentSelection
|
|
16
|
+
} from "./setup-preview.js";
|
|
17
|
+
import { SetupWizardCancelledError } from "./setup-wizard-constants.js";
|
|
18
|
+
import {
|
|
19
|
+
brandIntroTitle,
|
|
20
|
+
formatAgentDetectCard,
|
|
21
|
+
formatAgentMultiselectHint,
|
|
22
|
+
formatComponentMultiselectHint,
|
|
23
|
+
formatPreviewNote,
|
|
24
|
+
formatResultNote,
|
|
25
|
+
formatSplashNote
|
|
26
|
+
} from "./theme.js";
|
|
27
|
+
|
|
28
|
+
export { SetupWizardCancelledError };
|
|
29
|
+
|
|
30
|
+
export function shouldUseSetupWizard({
|
|
31
|
+
interactive,
|
|
32
|
+
simple = false,
|
|
33
|
+
inkCapable = canUseSetupInk({ interactive }),
|
|
34
|
+
dryRun = false,
|
|
35
|
+
yes = false,
|
|
36
|
+
confirm = false,
|
|
37
|
+
json = false,
|
|
38
|
+
agents = null,
|
|
39
|
+
components = null,
|
|
40
|
+
noDefaultComponents = false
|
|
41
|
+
} = {}) {
|
|
42
|
+
return shouldUseClackWizard({
|
|
43
|
+
interactive,
|
|
44
|
+
simple,
|
|
45
|
+
inkCapable,
|
|
46
|
+
dryRun,
|
|
47
|
+
yes,
|
|
48
|
+
confirm,
|
|
49
|
+
json,
|
|
50
|
+
agents,
|
|
51
|
+
components,
|
|
52
|
+
noDefaultComponents
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** @deprecated Use shouldUseSetupWizard */
|
|
57
|
+
export const shouldUseSetupTui = shouldUseSetupWizard;
|
|
58
|
+
|
|
59
|
+
function handleCancel(prompts, message = BRAND.wizardCancelMessage) {
|
|
60
|
+
prompts.cancel(message);
|
|
61
|
+
return { cancelled: true, usedWizard: true };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function runSetupWizard({
|
|
65
|
+
homeDir,
|
|
66
|
+
workspaceRoot,
|
|
67
|
+
packageRoot,
|
|
68
|
+
packageName,
|
|
69
|
+
cliVersion,
|
|
70
|
+
dryRun = false,
|
|
71
|
+
preflight = true,
|
|
72
|
+
yes = false,
|
|
73
|
+
confirm = false,
|
|
74
|
+
preflightExplicit = false,
|
|
75
|
+
yesExplicit = false,
|
|
76
|
+
confirmExplicit = false,
|
|
77
|
+
interactive = true,
|
|
78
|
+
prompts = defaultPrompts
|
|
79
|
+
}) {
|
|
80
|
+
const detected = detectInstalledAdapters({ homeDir });
|
|
81
|
+
const adapters = listAdapters();
|
|
82
|
+
const components = describeComponentCatalog({ workspaceRoot });
|
|
83
|
+
const defaultAgents = detected.length > 0 ? detected : [...GLOBAL_AGENT_IDS];
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
prompts.intro(brandIntroTitle());
|
|
87
|
+
prompts.note(formatSplashNote(), WIZARD_COPY.splashTitle);
|
|
88
|
+
|
|
89
|
+
prompts.note(
|
|
90
|
+
formatAgentDetectCard({ adapters, detected }),
|
|
91
|
+
WIZARD_COPY.detectTitle
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const agentSelection = await prompts.multiselect({
|
|
95
|
+
message: WIZARD_COPY.agentsPrompt,
|
|
96
|
+
options: adapters.map((adapter) => ({
|
|
97
|
+
value: adapter.id,
|
|
98
|
+
label: getAgentLabel(adapter.id),
|
|
99
|
+
hint: formatAgentMultiselectHint(adapter.id, detected)
|
|
100
|
+
})),
|
|
101
|
+
initialValues: defaultAgents,
|
|
102
|
+
required: true
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
if (prompts.isCancel(agentSelection)) {
|
|
106
|
+
return handleCancel(prompts);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const agents = validateAdapterIds(agentSelection);
|
|
110
|
+
const defaultComponents = [...DEFAULT_COMPONENT_IDS];
|
|
111
|
+
const componentSelection = await prompts.multiselect({
|
|
112
|
+
message: WIZARD_COPY.componentsPrompt,
|
|
113
|
+
options: [
|
|
114
|
+
...components.map((component) => ({
|
|
115
|
+
value: component.id,
|
|
116
|
+
label: component.label,
|
|
117
|
+
hint: formatComponentMultiselectHint(component)
|
|
118
|
+
})),
|
|
119
|
+
{
|
|
120
|
+
value: "__none__",
|
|
121
|
+
label: WIZARD_COPY.coreOnlyLabel
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
initialValues: defaultComponents,
|
|
125
|
+
required: false
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
if (prompts.isCancel(componentSelection)) {
|
|
129
|
+
return handleCancel(prompts);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const { noDefaults: noDefaultComponents, selected: selectedComponents } = resolveComponentSelection(
|
|
133
|
+
componentSelection,
|
|
134
|
+
{ workspaceRoot }
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
const preview = await buildSetupPreview({
|
|
138
|
+
homeDir,
|
|
139
|
+
workspaceRoot,
|
|
140
|
+
packageRoot,
|
|
141
|
+
packageName,
|
|
142
|
+
cliVersion,
|
|
143
|
+
agents,
|
|
144
|
+
components: selectedComponents,
|
|
145
|
+
noDefaultComponents
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
prompts.note(
|
|
149
|
+
formatPreviewNote({ preview, componentCatalog: components }),
|
|
150
|
+
WIZARD_COPY.previewTitle
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const approved = await prompts.confirm({
|
|
154
|
+
message: dryRun ? WIZARD_COPY.confirmDryRun : WIZARD_COPY.confirmApply,
|
|
155
|
+
initialValue: true
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
if (prompts.isCancel(approved) || !approved) {
|
|
159
|
+
return handleCancel(prompts);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const consent = preflight
|
|
163
|
+
? await loadConsentAudit(homeDir, {
|
|
164
|
+
yes,
|
|
165
|
+
confirm,
|
|
166
|
+
yesExplicit,
|
|
167
|
+
confirmExplicit,
|
|
168
|
+
preflight,
|
|
169
|
+
preflightExplicit,
|
|
170
|
+
interactive,
|
|
171
|
+
applying: !dryRun,
|
|
172
|
+
dryRun,
|
|
173
|
+
json: false
|
|
174
|
+
})
|
|
175
|
+
: null;
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
cancelled: false,
|
|
179
|
+
usedWizard: true,
|
|
180
|
+
agents,
|
|
181
|
+
components: selectedComponents,
|
|
182
|
+
noDefaultComponents,
|
|
183
|
+
preview,
|
|
184
|
+
consent
|
|
185
|
+
};
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (error instanceof SetupWizardCancelledError) {
|
|
188
|
+
return handleCancel(prompts);
|
|
189
|
+
}
|
|
190
|
+
prompts.log.error(error instanceof Error ? error.message : String(error));
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** @deprecated Use runSetupWizard */
|
|
196
|
+
export const runSetupTui = runSetupWizard;
|
|
197
|
+
|
|
198
|
+
export function renderSetupWizardResult(result, { dryRun = false, prompts = defaultPrompts } = {}) {
|
|
199
|
+
prompts.note(
|
|
200
|
+
formatResultNote(result, { dryRun }),
|
|
201
|
+
dryRun ? WIZARD_COPY.resultDryRunTitle : WIZARD_COPY.resultSuccessTitle
|
|
202
|
+
);
|
|
203
|
+
prompts.outro(dryRun ? WIZARD_COPY.outroDryRun : WIZARD_COPY.outroSuccess);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** @deprecated Use renderSetupWizardResult */
|
|
207
|
+
export const renderSetupTuiResult = renderSetupWizardResult;
|