@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.
Files changed (315) hide show
  1. package/README.md +937 -0
  2. package/bin/harness.js +11 -0
  3. package/bin/kairo-runtime.js +11 -0
  4. package/bin/kairo.js +11 -0
  5. package/global-template/components/catalog.json +25 -0
  6. package/global-template/components/orchestrator/orchestrator.md +55 -0
  7. package/global-template/components/sdd-core/handoff.md +38 -0
  8. package/global-template/components/sdd-core/spec-sizing.md +38 -0
  9. package/global-template/components/sdd-core/workflow.md +31 -0
  10. package/global-template/core/orchestrator.md +55 -0
  11. package/package.json +64 -0
  12. package/prompts/HARNESS_ENFORCEMENT_UPGRADE.md +11 -0
  13. package/prompts/HARNESS_ENTERPRISE.md +33 -0
  14. package/prompts/HARNESS_INSTALLER_MASTER.md +853 -0
  15. package/prompts/HARNESS_MINIMAL.md +30 -0
  16. package/prompts/HARNESS_SPEC_SIZING_UPGRADE.md +41 -0
  17. package/prompts/HARNESS_STANDARD.md +35 -0
  18. package/prompts/HARNESS_UNIVERSAL_PARITY.md +56 -0
  19. package/repo-template/.claude/agents/adapter-parity-reviewer.md +17 -0
  20. package/repo-template/.claude/agents/architect.md +17 -0
  21. package/repo-template/.claude/agents/eval-engineer.md +17 -0
  22. package/repo-template/.claude/agents/reviewer.md +17 -0
  23. package/repo-template/.claude/agents/sdd-reviewer.md +17 -0
  24. package/repo-template/.claude/agents/sdd-spec-writer.md +17 -0
  25. package/repo-template/.claude/skills/checkpoint/SKILL.md +13 -0
  26. package/repo-template/.claude/skills/eval-design/SKILL.md +3 -0
  27. package/repo-template/.claude/skills/evals/SKILL.md +13 -0
  28. package/repo-template/.claude/skills/loop-engineering/SKILL.md +16 -0
  29. package/repo-template/.claude/skills/maintainability-review/SKILL.md +3 -0
  30. package/repo-template/.claude/skills/quality-gate-review/SKILL.md +3 -0
  31. package/repo-template/.claude/skills/sdd/SKILL.md +13 -0
  32. package/repo-template/.claude/skills/spec-complexity-classifier/SKILL.md +10 -0
  33. package/repo-template/.claude/skills/spec-escalation-review/SKILL.md +10 -0
  34. package/repo-template/.claude/skills/spec-intake/SKILL.md +10 -0
  35. package/repo-template/.claude/skills/tdd/SKILL.md +13 -0
  36. package/repo-template/.claude/skills/trust-review/SKILL.md +3 -0
  37. package/repo-template/.codex/skills/adapter-parity/SKILL.md +29 -0
  38. package/repo-template/.codex/skills/checkpoint/SKILL.md +36 -0
  39. package/repo-template/.codex/skills/eval-design/SKILL.md +3 -0
  40. package/repo-template/.codex/skills/evals/SKILL.md +28 -0
  41. package/repo-template/.codex/skills/loop-engineering/SKILL.md +24 -0
  42. package/repo-template/.codex/skills/maintainability-review/SKILL.md +3 -0
  43. package/repo-template/.codex/skills/quality-gate-review/SKILL.md +3 -0
  44. package/repo-template/.codex/skills/sdd/SKILL.md +30 -0
  45. package/repo-template/.codex/skills/spec-complexity-classifier/SKILL.md +10 -0
  46. package/repo-template/.codex/skills/spec-escalation-review/SKILL.md +10 -0
  47. package/repo-template/.codex/skills/spec-intake/SKILL.md +10 -0
  48. package/repo-template/.codex/skills/tdd/SKILL.md +27 -0
  49. package/repo-template/.codex/skills/trust-review/SKILL.md +3 -0
  50. package/repo-template/.cursor/agents/adapter-parity-reviewer.md +29 -0
  51. package/repo-template/.cursor/agents/architect.md +27 -0
  52. package/repo-template/.cursor/agents/context-engineer.md +27 -0
  53. package/repo-template/.cursor/agents/debugger.md +27 -0
  54. package/repo-template/.cursor/agents/eval-engineer.md +27 -0
  55. package/repo-template/.cursor/agents/harness-orchestrator.md +27 -0
  56. package/repo-template/.cursor/agents/loop-controller.md +17 -0
  57. package/repo-template/.cursor/agents/loop-debugger.md +16 -0
  58. package/repo-template/.cursor/agents/reviewer.md +27 -0
  59. package/repo-template/.cursor/agents/sdd/sdd-acceptance-reviewer.md +31 -0
  60. package/repo-template/.cursor/agents/sdd/sdd-implementation-guardian.md +31 -0
  61. package/repo-template/.cursor/agents/sdd/sdd-intake-analyst.md +31 -0
  62. package/repo-template/.cursor/agents/sdd/sdd-orchestrator.md +31 -0
  63. package/repo-template/.cursor/agents/sdd/sdd-spec-reviewer.md +31 -0
  64. package/repo-template/.cursor/agents/sdd/sdd-spec-writer.md +31 -0
  65. package/repo-template/.cursor/agents/sdd/sdd-task-breakdown.md +31 -0
  66. package/repo-template/.cursor/agents/sdd/sdd-technical-planner.md +31 -0
  67. package/repo-template/.cursor/agents/sdd/sdd-test-planner.md +31 -0
  68. package/repo-template/.cursor/agents/spec-intake-analyst.md +14 -0
  69. package/repo-template/.cursor/agents/test-engineer.md +27 -0
  70. package/repo-template/.cursor/commands/adapter-parity.md +34 -0
  71. package/repo-template/.cursor/commands/checkpoint.md +30 -0
  72. package/repo-template/.cursor/commands/debug.md +13 -0
  73. package/repo-template/.cursor/commands/init-eval.md +12 -0
  74. package/repo-template/.cursor/commands/init-feature.md +12 -0
  75. package/repo-template/.cursor/commands/init-harness.md +13 -0
  76. package/repo-template/.cursor/commands/loop-debug.md +3 -0
  77. package/repo-template/.cursor/commands/loop-review.md +3 -0
  78. package/repo-template/.cursor/commands/loop-run.md +5 -0
  79. package/repo-template/.cursor/commands/review.md +21 -0
  80. package/repo-template/.cursor/commands/sdd-intake.md +18 -0
  81. package/repo-template/.cursor/commands/sdd-plan.md +18 -0
  82. package/repo-template/.cursor/commands/sdd-spec.md +18 -0
  83. package/repo-template/.cursor/commands/sdd-tasks.md +18 -0
  84. package/repo-template/.cursor/commands/sdd-validate.md +18 -0
  85. package/repo-template/.cursor/commands/spec-escalate.md +9 -0
  86. package/repo-template/.cursor/commands/spec-intake.md +10 -0
  87. package/repo-template/.cursor/commands/spec-size.md +21 -0
  88. package/repo-template/.cursor/rules/adapter-parity.mdc +20 -0
  89. package/repo-template/.cursor/rules/api.mdc +12 -0
  90. package/repo-template/.cursor/rules/core.mdc +21 -0
  91. package/repo-template/.cursor/rules/enforcement.mdc +16 -0
  92. package/repo-template/.cursor/rules/evals.mdc +10 -0
  93. package/repo-template/.cursor/rules/git.mdc +19 -0
  94. package/repo-template/.cursor/rules/harness.mdc +14 -0
  95. package/repo-template/.cursor/rules/loops.mdc +17 -0
  96. package/repo-template/.cursor/rules/testing.mdc +13 -0
  97. package/repo-template/.cursor/rules/ui.mdc +13 -0
  98. package/repo-template/.cursor/skills/api-design/SKILL.md +23 -0
  99. package/repo-template/.cursor/skills/architecture/SKILL.md +23 -0
  100. package/repo-template/.cursor/skills/code-review/SKILL.md +23 -0
  101. package/repo-template/.cursor/skills/context-graph/SKILL.md +23 -0
  102. package/repo-template/.cursor/skills/debugging/SKILL.md +23 -0
  103. package/repo-template/.cursor/skills/evals/SKILL.md +23 -0
  104. package/repo-template/.cursor/skills/git-workflow/SKILL.md +23 -0
  105. package/repo-template/.cursor/skills/testing/SKILL.md +23 -0
  106. package/repo-template/.cursor/skills/ui-design/SKILL.md +23 -0
  107. package/repo-template/.gentle-ai/README.md +37 -0
  108. package/repo-template/.gentle-ai/loops/README.md +27 -0
  109. package/repo-template/.gentle-ai/loops/sdd-tdd-repair.loop.md +27 -0
  110. package/repo-template/.gentle-ai/model-routing.md +25 -0
  111. package/repo-template/.github/copilot-instructions.md +37 -0
  112. package/repo-template/.github/dependabot.yml +11 -0
  113. package/repo-template/.github/instructions/harness.instructions.md +11 -0
  114. package/repo-template/.github/workflows/harness-quality-gate.yml +67 -0
  115. package/repo-template/.github/workflows/harness-security-gate.yml +32 -0
  116. package/repo-template/.harness/spec-sizing.json +33 -0
  117. package/repo-template/.opencode/README.md +71 -0
  118. package/repo-template/.opencode/agents/adapter-parity-reviewer.md +23 -0
  119. package/repo-template/.opencode/agents/architect.md +38 -0
  120. package/repo-template/.opencode/agents/checkpoint-reviewer.md +38 -0
  121. package/repo-template/.opencode/agents/eval-engineer.md +38 -0
  122. package/repo-template/.opencode/agents/loop-controller.md +38 -0
  123. package/repo-template/.opencode/agents/loop-debugger.md +38 -0
  124. package/repo-template/.opencode/agents/model-router.md +38 -0
  125. package/repo-template/.opencode/agents/sdd-orchestrator.md +38 -0
  126. package/repo-template/.opencode/agents/sdd-spec-reviewer.md +38 -0
  127. package/repo-template/.opencode/agents/spec-intake-analyst.md +19 -0
  128. package/repo-template/.opencode/agents/tdd-engineer.md +38 -0
  129. package/repo-template/.opencode/commands/checkpoint.md +3 -0
  130. package/repo-template/.opencode/commands/eval-design.md +3 -0
  131. package/repo-template/.opencode/commands/maintainability-review.md +3 -0
  132. package/repo-template/.opencode/commands/quality-gate.md +3 -0
  133. package/repo-template/.opencode/commands/spec-escalate.md +9 -0
  134. package/repo-template/.opencode/commands/spec-intake.md +10 -0
  135. package/repo-template/.opencode/commands/spec-size.md +21 -0
  136. package/repo-template/.opencode/commands/trust-review.md +3 -0
  137. package/repo-template/.opencode/loops/ai-behavior-improvement.loop.md +15 -0
  138. package/repo-template/.opencode/loops/bug-repair.loop.md +16 -0
  139. package/repo-template/.opencode/loops/documentation-sync.loop.md +13 -0
  140. package/repo-template/.opencode/loops/feature-development.loop.md +25 -0
  141. package/repo-template/.opencode/skills/spec-complexity-classifier/SKILL.md +10 -0
  142. package/repo-template/.opencode/skills/spec-escalation-review/SKILL.md +10 -0
  143. package/repo-template/.opencode/skills/spec-intake/SKILL.md +10 -0
  144. package/repo-template/.pi/README.md +21 -0
  145. package/repo-template/.pi/prompts/checkpoint.md +11 -0
  146. package/repo-template/.pi/prompts/loop-run.md +10 -0
  147. package/repo-template/.pi/prompts/sdd-plan.md +11 -0
  148. package/repo-template/.pi/prompts/sdd-spec.md +13 -0
  149. package/repo-template/.pi/prompts/spec-escalate.md +9 -0
  150. package/repo-template/.pi/prompts/spec-intake.md +10 -0
  151. package/repo-template/.pi/prompts/spec-size.md +21 -0
  152. package/repo-template/.pi/skills/adapter-parity/SKILL.md +7 -0
  153. package/repo-template/.pi/skills/checkpoint/SKILL.md +7 -0
  154. package/repo-template/.pi/skills/eval-design/SKILL.md +3 -0
  155. package/repo-template/.pi/skills/evals/SKILL.md +7 -0
  156. package/repo-template/.pi/skills/loop-engineering/SKILL.md +7 -0
  157. package/repo-template/.pi/skills/maintainability-review/SKILL.md +3 -0
  158. package/repo-template/.pi/skills/quality-gate-review/SKILL.md +3 -0
  159. package/repo-template/.pi/skills/sdd/SKILL.md +7 -0
  160. package/repo-template/.pi/skills/spec-complexity-classifier/SKILL.md +10 -0
  161. package/repo-template/.pi/skills/spec-escalation-review/SKILL.md +10 -0
  162. package/repo-template/.pi/skills/spec-intake/SKILL.md +10 -0
  163. package/repo-template/.pi/skills/tdd/SKILL.md +7 -0
  164. package/repo-template/.pi/skills/trust-review/SKILL.md +3 -0
  165. package/repo-template/AGENT.md +8 -0
  166. package/repo-template/AGENTS.md +165 -0
  167. package/repo-template/CLAUDE.md +9 -0
  168. package/repo-template/GEMINI.md +9 -0
  169. package/repo-template/docs/ai/adapter-parity.md +135 -0
  170. package/repo-template/docs/ai/agent-workflow.md +45 -0
  171. package/repo-template/docs/ai/api.md +28 -0
  172. package/repo-template/docs/ai/architecture.md +53 -0
  173. package/repo-template/docs/ai/context-budget.md +54 -0
  174. package/repo-template/docs/ai/context-graph.md +39 -0
  175. package/repo-template/docs/ai/conventions.md +34 -0
  176. package/repo-template/docs/ai/decision-log.md +5 -0
  177. package/repo-template/docs/ai/enforcement.md +63 -0
  178. package/repo-template/docs/ai/eval-strategy.md +42 -0
  179. package/repo-template/docs/ai/evals.md +44 -0
  180. package/repo-template/docs/ai/git-workflow.md +35 -0
  181. package/repo-template/docs/ai/governance.md +61 -0
  182. package/repo-template/docs/ai/harness.md +49 -0
  183. package/repo-template/docs/ai/installer-cli.md +34 -0
  184. package/repo-template/docs/ai/loop-log.md +5 -0
  185. package/repo-template/docs/ai/loop-observability.md +57 -0
  186. package/repo-template/docs/ai/loop-policy.md +86 -0
  187. package/repo-template/docs/ai/loops.md +95 -0
  188. package/repo-template/docs/ai/maintainability-gates.md +26 -0
  189. package/repo-template/docs/ai/memory.md +71 -0
  190. package/repo-template/docs/ai/model-policy.md +105 -0
  191. package/repo-template/docs/ai/observability-runtime.md +48 -0
  192. package/repo-template/docs/ai/provider-routing.md +138 -0
  193. package/repo-template/docs/ai/quality-gates.md +48 -0
  194. package/repo-template/docs/ai/rollback-runtime.md +25 -0
  195. package/repo-template/docs/ai/security.md +12 -0
  196. package/repo-template/docs/ai/spec-driven-development.md +124 -0
  197. package/repo-template/docs/ai/spec-escalation.md +44 -0
  198. package/repo-template/docs/ai/spec-intake.md +46 -0
  199. package/repo-template/docs/ai/spec-sizing.md +207 -0
  200. package/repo-template/docs/ai/test-driven-development.md +35 -0
  201. package/repo-template/docs/ai/testing.md +28 -0
  202. package/repo-template/docs/ai/tool-adapters.md +186 -0
  203. package/repo-template/docs/ai/trust-allowlist.md +5 -0
  204. package/repo-template/docs/ai/trust-policy.md +41 -0
  205. package/repo-template/docs/ai/ui.md +17 -0
  206. package/repo-template/docs/skills/adapter-parity-review.md +46 -0
  207. package/repo-template/docs/skills/api-design.md +37 -0
  208. package/repo-template/docs/skills/architecture.md +37 -0
  209. package/repo-template/docs/skills/code-review.md +37 -0
  210. package/repo-template/docs/skills/context-graph.md +38 -0
  211. package/repo-template/docs/skills/debugging.md +37 -0
  212. package/repo-template/docs/skills/eval-design.md +12 -0
  213. package/repo-template/docs/skills/evals.md +37 -0
  214. package/repo-template/docs/skills/git-workflow.md +37 -0
  215. package/repo-template/docs/skills/look-trust-review.md +12 -0
  216. package/repo-template/docs/skills/loop-debugging.md +16 -0
  217. package/repo-template/docs/skills/loop-design.md +39 -0
  218. package/repo-template/docs/skills/loop-retrospective.md +15 -0
  219. package/repo-template/docs/skills/loop-review.md +16 -0
  220. package/repo-template/docs/skills/maintainability-review.md +12 -0
  221. package/repo-template/docs/skills/model-selection.md +36 -0
  222. package/repo-template/docs/skills/quality-gate-review.md +12 -0
  223. package/repo-template/docs/skills/spec-complexity-classifier.md +41 -0
  224. package/repo-template/docs/skills/spec-escalation-review.md +34 -0
  225. package/repo-template/docs/skills/spec-intake.md +25 -0
  226. package/repo-template/docs/skills/testing.md +37 -0
  227. package/repo-template/docs/skills/tool-adapter-sync.md +36 -0
  228. package/repo-template/docs/skills/ui-design.md +37 -0
  229. package/repo-template/docs/specs/README.md +9 -0
  230. package/repo-template/docs/specs/templates/basic-spec.md +41 -0
  231. package/repo-template/docs/specs/templates/complex-spec.md +145 -0
  232. package/repo-template/docs/specs/templates/standard-spec.md +58 -0
  233. package/repo-template/evals/README.md +11 -0
  234. package/repo-template/evals/golden/sample-golden.json +12 -0
  235. package/repo-template/evals/loop-regression/README.md +11 -0
  236. package/repo-template/evals/regression/sample-regression.json +12 -0
  237. package/repo-template/evals/schema/sample-schema.json +12 -0
  238. package/repo-template/evals/tool-calls/sample-tool-calls.json +12 -0
  239. package/repo-template/opencode.json.sample +29 -0
  240. package/repo-template/scripts/harness/backup.mjs +7 -0
  241. package/repo-template/scripts/harness/doctor.mjs +20 -0
  242. package/repo-template/scripts/harness/run-evals.mjs +27 -0
  243. package/repo-template/setup-agent-links.sh +54 -0
  244. package/scripts/check-published-release.mjs +127 -0
  245. package/scripts/check-release-commit.mjs +32 -0
  246. package/scripts/install.sh +225 -0
  247. package/scripts/installer-smoke-test.sh +155 -0
  248. package/scripts/lib/attribution-guard.mjs +59 -0
  249. package/scripts/registry-smoke-test.sh +149 -0
  250. package/scripts/smoke-test.sh +197 -0
  251. package/scripts/ux-smoke-test.sh +140 -0
  252. package/src/cli.js +625 -0
  253. package/src/doctor.js +68 -0
  254. package/src/global/adapter-context.js +27 -0
  255. package/src/global/adapter-matrix.js +38 -0
  256. package/src/global/adapters/claude.js +8 -0
  257. package/src/global/adapters/codex.js +8 -0
  258. package/src/global/adapters/cursor.js +8 -0
  259. package/src/global/adapters/opencode.js +8 -0
  260. package/src/global/agents.js +7 -0
  261. package/src/global/apply-confirmation.js +62 -0
  262. package/src/global/backups.js +54 -0
  263. package/src/global/brand/cli.js +52 -0
  264. package/src/global/brand/index.js +85 -0
  265. package/src/global/clack/setup-preview.js +48 -0
  266. package/src/global/clack/setup-wizard-constants.js +6 -0
  267. package/src/global/clack/setup-wizard.js +207 -0
  268. package/src/global/clack/theme.js +145 -0
  269. package/src/global/component-authoring.js +121 -0
  270. package/src/global/component-builders.js +43 -0
  271. package/src/global/component-distribution.js +270 -0
  272. package/src/global/component-installer.js +106 -0
  273. package/src/global/component-paths.js +22 -0
  274. package/src/global/component-registry.js +89 -0
  275. package/src/global/components/orchestrator.js +14 -0
  276. package/src/global/components/sdd-core.js +17 -0
  277. package/src/global/diff.js +233 -0
  278. package/src/global/drift.js +264 -0
  279. package/src/global/explain.js +144 -0
  280. package/src/global/global-cli.js +1145 -0
  281. package/src/global/global-doctor.js +67 -0
  282. package/src/global/global-installer.js +284 -0
  283. package/src/global/history.js +313 -0
  284. package/src/global/ink/run-setup-ink.js +77 -0
  285. package/src/global/ink/setup-app.js +278 -0
  286. package/src/global/ink/setup-routing.js +51 -0
  287. package/src/global/ink/setup-state.js +180 -0
  288. package/src/global/ink/terminal.js +13 -0
  289. package/src/global/json-output.js +22 -0
  290. package/src/global/load-component-catalog.js +41 -0
  291. package/src/global/load-workspace-component-catalog.js +123 -0
  292. package/src/global/managed-body.js +28 -0
  293. package/src/global/managed-config-adapter.js +134 -0
  294. package/src/global/managed-section.js +73 -0
  295. package/src/global/npm-registry.js +25 -0
  296. package/src/global/paths.js +22 -0
  297. package/src/global/policy.js +344 -0
  298. package/src/global/preflight.js +65 -0
  299. package/src/global/registry.js +79 -0
  300. package/src/global/report.js +110 -0
  301. package/src/global/rollback.js +126 -0
  302. package/src/global/setup.js +284 -0
  303. package/src/global/state-migration.js +65 -0
  304. package/src/global/state.js +50 -0
  305. package/src/global/status.js +94 -0
  306. package/src/global/sync.js +129 -0
  307. package/src/global/upgrade.js +145 -0
  308. package/src/harness-files.js +145 -0
  309. package/src/harness-updater.js +120 -0
  310. package/src/hash.js +5 -0
  311. package/src/manifest.js +36 -0
  312. package/src/project-detection.js +105 -0
  313. package/src/template-installer.js +72 -0
  314. package/src/text-template.js +24 -0
  315. 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,8 @@
1
+ import { createManagedConfigAdapter } from "../managed-config-adapter.js";
2
+
3
+ export default createManagedConfigAdapter({
4
+ id: "claude",
5
+ label: "Claude Code",
6
+ rootDir: ".claude",
7
+ configFile: ".claude/CLAUDE.md"
8
+ });
@@ -0,0 +1,8 @@
1
+ import { createManagedConfigAdapter } from "../managed-config-adapter.js";
2
+
3
+ export default createManagedConfigAdapter({
4
+ id: "codex",
5
+ label: "Codex",
6
+ rootDir: ".codex",
7
+ configFile: ".codex/AGENTS.md"
8
+ });
@@ -0,0 +1,8 @@
1
+ import { createManagedConfigAdapter } from "../managed-config-adapter.js";
2
+
3
+ export default createManagedConfigAdapter({
4
+ id: "cursor",
5
+ label: "Cursor",
6
+ rootDir: ".cursor",
7
+ configFile: ".cursor/AGENTS.md"
8
+ });
@@ -0,0 +1,8 @@
1
+ import { createManagedConfigAdapter } from "../managed-config-adapter.js";
2
+
3
+ export default createManagedConfigAdapter({
4
+ id: "opencode",
5
+ label: "OpenCode",
6
+ rootDir: ".config/opencode",
7
+ configFile: ".config/opencode/AGENTS.md"
8
+ });
@@ -0,0 +1,7 @@
1
+ export {
2
+ GLOBAL_AGENT_IDS,
3
+ detectInstalledAdapters as detectGlobalAgents,
4
+ listAdapters,
5
+ resolveAdapter as agentById,
6
+ resolveTargetAdapters
7
+ } from "./registry.js";
@@ -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,6 @@
1
+ export class SetupWizardCancelledError extends Error {
2
+ constructor() {
3
+ super("Setup cancelled.");
4
+ this.name = "SetupWizardCancelledError";
5
+ }
6
+ }
@@ -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;