@karajan-family/code 4.21.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 (746) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +98 -0
  3. package/bin/karajan-mcp.js +2 -0
  4. package/bin/kj-rag-mcp.js +75 -0
  5. package/bin/kj-tail +361 -0
  6. package/bin/kj.js +2 -0
  7. package/docs/README.es.md +80 -0
  8. package/docs/karajan-code-logo-small.png +0 -0
  9. package/library/logical-clocks-lamport.md +40 -0
  10. package/package.json +140 -0
  11. package/packages/ai-trash/README.md +37 -0
  12. package/packages/ai-trash/bin/kj-trash.js +10 -0
  13. package/packages/ai-trash/package.json +43 -0
  14. package/packages/ai-trash/src/cli.js +200 -0
  15. package/packages/ai-trash/src/destructive-parser.js +74 -0
  16. package/packages/ai-trash/src/git-snapshot.js +128 -0
  17. package/packages/ai-trash/src/hook.js +137 -0
  18. package/packages/ai-trash/src/index.js +14 -0
  19. package/packages/ai-trash/src/install.js +73 -0
  20. package/packages/ai-trash/src/logger.js +60 -0
  21. package/packages/ai-trash/src/manifest.js +91 -0
  22. package/packages/ai-trash/src/permissions.js +26 -0
  23. package/packages/ai-trash/src/snapshot.js +66 -0
  24. package/packages/ai-trash/src/ulid.js +66 -0
  25. package/packages/hu-board/README.md +69 -0
  26. package/packages/hu-board/package.json +28 -0
  27. package/packages/hu-board/public/app.js +259 -0
  28. package/packages/hu-board/public/index.html +77 -0
  29. package/packages/hu-board/public/pipeline.css +132 -0
  30. package/packages/hu-board/public/pipeline.html +48 -0
  31. package/packages/hu-board/public/pipeline.js +200 -0
  32. package/packages/hu-board/public/rag.html +21 -0
  33. package/packages/hu-board/public/rag.js +39 -0
  34. package/packages/hu-board/public/styles.css +973 -0
  35. package/packages/hu-board/public/utils/api.js +139 -0
  36. package/packages/hu-board/public/utils/board-view.js +473 -0
  37. package/packages/hu-board/public/utils/command-launcher.js +213 -0
  38. package/packages/hu-board/public/utils/config-editor.js +181 -0
  39. package/packages/hu-board/public/utils/dashboard-view.js +103 -0
  40. package/packages/hu-board/public/utils/formatters.js +300 -0
  41. package/packages/hu-board/public/utils/graph-view.js +216 -0
  42. package/packages/hu-board/public/utils/hu-actions.js +224 -0
  43. package/packages/hu-board/public/utils/init-listeners.js +180 -0
  44. package/packages/hu-board/public/utils/log-panel.js +222 -0
  45. package/packages/hu-board/public/utils/modals.js +309 -0
  46. package/packages/hu-board/public/utils/plan-rollup-view.js +53 -0
  47. package/packages/hu-board/public/utils/preflight-view.js +89 -0
  48. package/packages/hu-board/public/utils/project-actions.js +143 -0
  49. package/packages/hu-board/public/utils/project-picker-view.js +139 -0
  50. package/packages/hu-board/public/utils/run-launcher.js +169 -0
  51. package/packages/hu-board/public/utils/server-push.js +252 -0
  52. package/packages/hu-board/public/utils/sessions-view.js +199 -0
  53. package/packages/hu-board/public/utils/story-detail-view.js +324 -0
  54. package/packages/hu-board/public/utils/story-edit-form.js +271 -0
  55. package/packages/hu-board/public/wiki.html +32 -0
  56. package/packages/hu-board/public/wiki.js +53 -0
  57. package/packages/hu-board/src/auth.js +92 -0
  58. package/packages/hu-board/src/boot-info.js +16 -0
  59. package/packages/hu-board/src/cleanup-zombies.js +145 -0
  60. package/packages/hu-board/src/command-runner.js +133 -0
  61. package/packages/hu-board/src/config-yaml.js +531 -0
  62. package/packages/hu-board/src/db.js +963 -0
  63. package/packages/hu-board/src/ephemeral-cleaner.js +196 -0
  64. package/packages/hu-board/src/event-bus.js +58 -0
  65. package/packages/hu-board/src/format.js +207 -0
  66. package/packages/hu-board/src/hu-zombie-reaper.js +103 -0
  67. package/packages/hu-board/src/journal-parser.js +180 -0
  68. package/packages/hu-board/src/plan-mutations.js +424 -0
  69. package/packages/hu-board/src/preflight.js +286 -0
  70. package/packages/hu-board/src/routes/api.js +1374 -0
  71. package/packages/hu-board/src/routes/pipeline.js +45 -0
  72. package/packages/hu-board/src/routes/rag.js +42 -0
  73. package/packages/hu-board/src/routes/wiki.js +43 -0
  74. package/packages/hu-board/src/run-tracker.js +121 -0
  75. package/packages/hu-board/src/server.js +438 -0
  76. package/packages/hu-board/src/sync.js +732 -0
  77. package/packages/hu-board/src/token-store.js +56 -0
  78. package/packages/hu-board/src/zombie-reaper.js +206 -0
  79. package/scripts/ai-attribution-guard.yml +84 -0
  80. package/scripts/audit-test-diet.mjs +151 -0
  81. package/scripts/build-sea.mjs +150 -0
  82. package/scripts/diet-baseline.mjs +170 -0
  83. package/scripts/dual-publish.mjs +67 -0
  84. package/scripts/esbuild-sea.config.mjs +273 -0
  85. package/scripts/git-hooks/post-merge +18 -0
  86. package/scripts/install-binary.ps1 +174 -0
  87. package/scripts/install-binary.sh +159 -0
  88. package/scripts/install-guard-all-repos.sh +85 -0
  89. package/scripts/install-kj.sh +193 -0
  90. package/scripts/install.js +901 -0
  91. package/scripts/install.sh +7 -0
  92. package/scripts/postinstall.js +117 -0
  93. package/scripts/protect-all-repos.sh +88 -0
  94. package/scripts/quickstart-gate.mjs +97 -0
  95. package/scripts/regen-arch-stats.sh +71 -0
  96. package/scripts/setup-multi-instance.sh +150 -0
  97. package/scripts/verify-pack.mjs +278 -0
  98. package/src/activity-log.js +59 -0
  99. package/src/agents/agy-agent.js +62 -0
  100. package/src/agents/aider-agent.js +78 -0
  101. package/src/agents/availability.js +52 -0
  102. package/src/agents/base-agent.js +134 -0
  103. package/src/agents/claude-agent.js +413 -0
  104. package/src/agents/codex-agent.js +112 -0
  105. package/src/agents/copilot-agent.js +65 -0
  106. package/src/agents/gemini-agent.js +85 -0
  107. package/src/agents/host-agent.js +38 -0
  108. package/src/agents/index.js +59 -0
  109. package/src/agents/kimi-agent.js +45 -0
  110. package/src/agents/model-registry.js +137 -0
  111. package/src/agents/opencode-agent.js +72 -0
  112. package/src/agents/qwen-agent.js +20 -0
  113. package/src/agents/resolve-bin.js +73 -0
  114. package/src/audit/agent-readiness.js +259 -0
  115. package/src/audit/ai-slop-findings.js +102 -0
  116. package/src/audit/audit-fallback.js +66 -0
  117. package/src/audit/audit-history-display.js +61 -0
  118. package/src/audit/audit-history.js +102 -0
  119. package/src/audit/basal-cost.js +281 -0
  120. package/src/audit/circular-deps.js +144 -0
  121. package/src/audit/dead-exports.js +186 -0
  122. package/src/audit/deterministic-summary.js +327 -0
  123. package/src/audit/harness-scorecard.js +100 -0
  124. package/src/audit/harness-section.js +81 -0
  125. package/src/audit/infra-findings.js +100 -0
  126. package/src/audit/injection-findings.js +114 -0
  127. package/src/audit/issue-filter.js +133 -0
  128. package/src/audit/osv-findings.js +167 -0
  129. package/src/audit/plan-adherence.js +224 -0
  130. package/src/audit/semgrep-findings.js +129 -0
  131. package/src/audit/sonar-findings.js +93 -0
  132. package/src/audit/webperf-input.js +133 -0
  133. package/src/autonomy/arbiter-role.js +71 -0
  134. package/src/autonomy/arbiter.js +22 -0
  135. package/src/autonomy/decider.js +18 -0
  136. package/src/autonomy/decision-resolver.js +58 -0
  137. package/src/autonomy/outcome-report.js +55 -0
  138. package/src/autonomy/policy.js +41 -0
  139. package/src/autonomy/stage-ask.js +30 -0
  140. package/src/bootstrap.js +276 -0
  141. package/src/brain/agent-error-classifier.js +116 -0
  142. package/src/brain/decision-tracker.js +125 -0
  143. package/src/brain/decisor.js +243 -0
  144. package/src/brain/solomon-consult.js +171 -0
  145. package/src/brain/standby-scheduler.js +8 -0
  146. package/src/brain/standby-store.js +12 -0
  147. package/src/brain/with-brain-recovery.js +235 -0
  148. package/src/budget/comparison.js +96 -0
  149. package/src/canvas/parse-md.js +238 -0
  150. package/src/canvas/schema.js +101 -0
  151. package/src/canvas/to-flat.js +85 -0
  152. package/src/canvas/validate.js +163 -0
  153. package/src/checks/ai-surface.js +79 -0
  154. package/src/checks/ai-trash.js +34 -0
  155. package/src/checks/binaries.js +207 -0
  156. package/src/checks/ci.js +105 -0
  157. package/src/checks/config-files.js +217 -0
  158. package/src/checks/dir-setup.js +103 -0
  159. package/src/checks/guarantee-level.js +38 -0
  160. package/src/checks/hardware.js +150 -0
  161. package/src/checks/harness-scorecard.js +41 -0
  162. package/src/checks/mcp-health.js +169 -0
  163. package/src/checks/method.js +73 -0
  164. package/src/checks/native-build.js +67 -0
  165. package/src/checks/node.js +70 -0
  166. package/src/checks/ollama.js +41 -0
  167. package/src/checks/orphans.js +77 -0
  168. package/src/checks/ports.js +188 -0
  169. package/src/checks/project-checks.js +245 -0
  170. package/src/checks/qmd.js +41 -0
  171. package/src/checks/rag-hooks.js +54 -0
  172. package/src/checks/release-check.js +102 -0
  173. package/src/checks/rtk.js +36 -0
  174. package/src/checks/runner.js +326 -0
  175. package/src/checks/skills.js +53 -0
  176. package/src/checks/sonar.js +67 -0
  177. package/src/checks/squeezr.js +36 -0
  178. package/src/checks/system.js +53 -0
  179. package/src/checks/tokens.js +172 -0
  180. package/src/checks/types.js +103 -0
  181. package/src/ci/dispatch.js +99 -0
  182. package/src/ci/index.js +3 -0
  183. package/src/ci/pr-diff.js +26 -0
  184. package/src/ci/repo.js +45 -0
  185. package/src/cli/_shared.js +30 -0
  186. package/src/cli/advanced-commands.js +61 -0
  187. package/src/cli/register-meta.js +772 -0
  188. package/src/cli/register-pipeline.js +335 -0
  189. package/src/cli/register-plan.js +224 -0
  190. package/src/cli/register-roles-skills.js +54 -0
  191. package/src/cli/register-sonar.js +28 -0
  192. package/src/cli/register-standby.js +26 -0
  193. package/src/cli.js +155 -0
  194. package/src/commands/advanced.js +31 -0
  195. package/src/commands/agent-run.js +63 -0
  196. package/src/commands/agents.js +105 -0
  197. package/src/commands/architect.js +123 -0
  198. package/src/commands/audit.js +430 -0
  199. package/src/commands/autorun.js +49 -0
  200. package/src/commands/board.js +458 -0
  201. package/src/commands/check.js +40 -0
  202. package/src/commands/clean.js +145 -0
  203. package/src/commands/code.js +45 -0
  204. package/src/commands/config.js +74 -0
  205. package/src/commands/discover.js +105 -0
  206. package/src/commands/doctor.js +251 -0
  207. package/src/commands/env.js +207 -0
  208. package/src/commands/harden.js +203 -0
  209. package/src/commands/hu.js +210 -0
  210. package/src/commands/identity.js +60 -0
  211. package/src/commands/init.js +950 -0
  212. package/src/commands/install-tools.js +432 -0
  213. package/src/commands/mutate.js +94 -0
  214. package/src/commands/ollama.js +44 -0
  215. package/src/commands/onboard.js +45 -0
  216. package/src/commands/plan/_shared.js +55 -0
  217. package/src/commands/plan/add-hu.js +23 -0
  218. package/src/commands/plan/delete.js +9 -0
  219. package/src/commands/plan/fix.js +99 -0
  220. package/src/commands/plan/generate.js +532 -0
  221. package/src/commands/plan/index.js +13 -0
  222. package/src/commands/plan/list.js +21 -0
  223. package/src/commands/plan/migrate-result.js +41 -0
  224. package/src/commands/plan/ready.js +46 -0
  225. package/src/commands/plan/remove-hu.js +17 -0
  226. package/src/commands/plan/share.js +85 -0
  227. package/src/commands/plan/show.js +81 -0
  228. package/src/commands/plan/unshare.js +41 -0
  229. package/src/commands/plan/validate.js +20 -0
  230. package/src/commands/plan.js +17 -0
  231. package/src/commands/policy.js +164 -0
  232. package/src/commands/privacy.js +45 -0
  233. package/src/commands/qmd.js +86 -0
  234. package/src/commands/rag-mcp.js +18 -0
  235. package/src/commands/rag.js +173 -0
  236. package/src/commands/report-issue.js +77 -0
  237. package/src/commands/report.js +469 -0
  238. package/src/commands/researcher.js +54 -0
  239. package/src/commands/resume.js +68 -0
  240. package/src/commands/review-gate.js +355 -0
  241. package/src/commands/review.js +89 -0
  242. package/src/commands/roles.js +116 -0
  243. package/src/commands/run.js +185 -0
  244. package/src/commands/scan.js +18 -0
  245. package/src/commands/skills.js +86 -0
  246. package/src/commands/sonar.js +53 -0
  247. package/src/commands/standby.js +117 -0
  248. package/src/commands/start.js +121 -0
  249. package/src/commands/status.js +36 -0
  250. package/src/commands/sync.js +103 -0
  251. package/src/commands/telemetry.js +70 -0
  252. package/src/commands/tournament.js +85 -0
  253. package/src/commands/triage.js +78 -0
  254. package/src/commands/undo.js +62 -0
  255. package/src/commands/watch.js +46 -0
  256. package/src/commands/webperf.js +162 -0
  257. package/src/commands/worktree.js +76 -0
  258. package/src/config/defaults.js +270 -0
  259. package/src/config/loader.js +204 -0
  260. package/src/config/overrides.js +220 -0
  261. package/src/config/role-resolver.js +171 -0
  262. package/src/config/schema.js +299 -0
  263. package/src/config/test-harness.js +78 -0
  264. package/src/config.js +34 -0
  265. package/src/domains/domain-loader.js +245 -0
  266. package/src/domains/domain-registry.js +140 -0
  267. package/src/domains/domain-synthesizer.js +129 -0
  268. package/src/environment/adr.js +45 -0
  269. package/src/environment/board-access.js +97 -0
  270. package/src/environment/board-select.js +59 -0
  271. package/src/environment/briefs.js +129 -0
  272. package/src/environment/issue-report.js +72 -0
  273. package/src/environment/mcp-wiring.js +44 -0
  274. package/src/environment/playbook.js +127 -0
  275. package/src/git/automation.js +334 -0
  276. package/src/git/hu-automation.js +171 -0
  277. package/src/git/hu-snapshot.js +10 -0
  278. package/src/golden/asserter.js +92 -0
  279. package/src/golden/loader.js +52 -0
  280. package/src/golden/runner.js +92 -0
  281. package/src/golden/schema.js +41 -0
  282. package/src/guards/intent-guard.js +161 -0
  283. package/src/guards/output-guard.js +149 -0
  284. package/src/guards/perf-guard.js +126 -0
  285. package/src/guards/policy-guard.js +90 -0
  286. package/src/guards/policy-resolver.js +85 -0
  287. package/src/guards/secret-redactor.js +71 -0
  288. package/src/harden/advisory.js +203 -0
  289. package/src/harden/alternatives.js +50 -0
  290. package/src/harden/check.js +81 -0
  291. package/src/harden/config-engine.js +128 -0
  292. package/src/harden/config-templates.js +122 -0
  293. package/src/harden/guidelines-engine.js +48 -0
  294. package/src/harden/guidelines-templates.js +36 -0
  295. package/src/harden/harden-engine.js +80 -0
  296. package/src/harden/harness-hooks.js +107 -0
  297. package/src/harden/hook-commands.js +25 -0
  298. package/src/harden/hook-templates.js +183 -0
  299. package/src/harden/interactive.js +76 -0
  300. package/src/harden/sentinel-hooks.js +721 -0
  301. package/src/harden/stack-roots.js +105 -0
  302. package/src/harden/test-on-push.js +38 -0
  303. package/src/harden/workflow-engine.js +116 -0
  304. package/src/harden/workflow-templates.js +285 -0
  305. package/src/hu/acceptance-runner.js +138 -0
  306. package/src/hu/auto-generator.js +358 -0
  307. package/src/hu/graph.js +71 -0
  308. package/src/hu/lazy-planner.js +109 -0
  309. package/src/hu/model-router.js +108 -0
  310. package/src/hu/parallel-executor.js +94 -0
  311. package/src/hu/split-validator.js +143 -0
  312. package/src/hu/splitting-detector.js +158 -0
  313. package/src/hu/splitting-generator.js +175 -0
  314. package/src/hu/store.js +392 -0
  315. package/src/hu/worktree-bootstrap.js +59 -0
  316. package/src/identity/bootstrap.js +48 -0
  317. package/src/identity/compare.js +38 -0
  318. package/src/identity/detect.js +51 -0
  319. package/src/identity/store.js +66 -0
  320. package/src/infrastructure/command-runner.js +44 -0
  321. package/src/infrastructure/environment.js +38 -0
  322. package/src/infrastructure/file-system-service.js +63 -0
  323. package/src/infrastructure/mocks.js +182 -0
  324. package/src/lang/chunk-go.js +94 -0
  325. package/src/lang/chunk-java.js +90 -0
  326. package/src/lang/chunk-python.js +88 -0
  327. package/src/lang/chunk-rust.js +102 -0
  328. package/src/lang/go.js +14 -0
  329. package/src/lang/java.js +16 -0
  330. package/src/lang/js.js +8 -0
  331. package/src/lang/python.js +14 -0
  332. package/src/lang/registry.js +79 -0
  333. package/src/lang/rust.js +14 -0
  334. package/src/lang/tree-sitter-loader.js +45 -0
  335. package/src/mcp/direct-role-runner.js +112 -0
  336. package/src/mcp/error-classifiers.js +66 -0
  337. package/src/mcp/handlers/direct-handlers.js +486 -0
  338. package/src/mcp/handlers/hu-handlers.js +93 -0
  339. package/src/mcp/handlers/management-handlers.js +265 -0
  340. package/src/mcp/handlers/rag-handler.js +52 -0
  341. package/src/mcp/handlers/run-handler.js +313 -0
  342. package/src/mcp/orphan-guard.js +131 -0
  343. package/src/mcp/preflight.js +47 -0
  344. package/src/mcp/progress.js +149 -0
  345. package/src/mcp/response-compressor.js +81 -0
  346. package/src/mcp/run-kj.js +135 -0
  347. package/src/mcp/server-handlers.js +79 -0
  348. package/src/mcp/server.js +66 -0
  349. package/src/mcp/shared-helpers.js +297 -0
  350. package/src/mcp/sovereignty-guard.js +112 -0
  351. package/src/mcp/suggest-handler.js +92 -0
  352. package/src/mcp/tool-arg-normalizers.js +16 -0
  353. package/src/mcp/tools.js +432 -0
  354. package/src/mutate/diff-scope.js +105 -0
  355. package/src/mutate/reviewer-signal.js +76 -0
  356. package/src/mutate/runner.js +72 -0
  357. package/src/mutate/tool-registry.js +90 -0
  358. package/src/onboarder/cache.js +24 -0
  359. package/src/onboarder/collectors/framework-multilang.js +64 -0
  360. package/src/onboarder/collectors/index.js +136 -0
  361. package/src/orchestrator/agent-fallback.js +81 -0
  362. package/src/orchestrator/brain-coordinator.js +186 -0
  363. package/src/orchestrator/ci-integration.js +139 -0
  364. package/src/orchestrator/config-init.js +510 -0
  365. package/src/orchestrator/direct-actions.js +217 -0
  366. package/src/orchestrator/drivers/error-recovery.js +287 -0
  367. package/src/orchestrator/drivers/init-context.js +227 -0
  368. package/src/orchestrator/drivers/iteration-loop.js +380 -0
  369. package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +69 -0
  370. package/src/orchestrator/drivers/iteration-phases/guards.js +84 -0
  371. package/src/orchestrator/drivers/iteration-phases/handle-approved.js +29 -0
  372. package/src/orchestrator/drivers/iteration-phases/quality-gates.js +114 -0
  373. package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +60 -0
  374. package/src/orchestrator/drivers/post-loop.js +383 -0
  375. package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +136 -0
  376. package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +47 -0
  377. package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +84 -0
  378. package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +391 -0
  379. package/src/orchestrator/drivers/pre-loop.js +507 -0
  380. package/src/orchestrator/drivers/run-hu-batch.js +427 -0
  381. package/src/orchestrator/feedback-enrichment.js +140 -0
  382. package/src/orchestrator/feedback-queue.js +151 -0
  383. package/src/orchestrator/flow-control.js +170 -0
  384. package/src/orchestrator/flow-runner.js +364 -0
  385. package/src/orchestrator/fs-leak-detector.js +210 -0
  386. package/src/orchestrator/hu-scheduler.js +114 -0
  387. package/src/orchestrator/hu-sub-pipeline.js +616 -0
  388. package/src/orchestrator/integrations.js +81 -0
  389. package/src/orchestrator/iteration-gate.js +73 -0
  390. package/src/orchestrator/iteration-stages.js +9 -0
  391. package/src/orchestrator/parallel-limiter.js +74 -0
  392. package/src/orchestrator/pipeline-context.js +72 -0
  393. package/src/orchestrator/post-loop-stages.js +468 -0
  394. package/src/orchestrator/pre-loop-stages.js +11 -0
  395. package/src/orchestrator/preflight-checks.js +462 -0
  396. package/src/orchestrator/repair/repair-detector.js +117 -0
  397. package/src/orchestrator/repair/repair-runner.js +142 -0
  398. package/src/orchestrator/reviewer-fallback.js +45 -0
  399. package/src/orchestrator/role-output-compressor.js +189 -0
  400. package/src/orchestrator/session-journal.js +308 -0
  401. package/src/orchestrator/solomon-escalation.js +305 -0
  402. package/src/orchestrator/solomon-rules.js +212 -0
  403. package/src/orchestrator/stages/architect-stage.js +172 -0
  404. package/src/orchestrator/stages/coder-stage.js +480 -0
  405. package/src/orchestrator/stages/domain-curator-stage.js +82 -0
  406. package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +127 -0
  407. package/src/orchestrator/stages/hu-reviewer-stage.js +394 -0
  408. package/src/orchestrator/stages/perf-stage.js +140 -0
  409. package/src/orchestrator/stages/planner-stage.js +85 -0
  410. package/src/orchestrator/stages/rag-context-stage.js +77 -0
  411. package/src/orchestrator/stages/rag-preload-decisor.js +58 -0
  412. package/src/orchestrator/stages/research-stage.js +69 -0
  413. package/src/orchestrator/stages/reviewer-stage.js +422 -0
  414. package/src/orchestrator/stages/sonar-stage.js +421 -0
  415. package/src/orchestrator/stages/stage-classes.js +84 -0
  416. package/src/orchestrator/stages/stage-executor.js +155 -0
  417. package/src/orchestrator/stages/tdd-discipline-stage.js +56 -0
  418. package/src/orchestrator/stages/tool-judge-stage.js +53 -0
  419. package/src/orchestrator/stages/triage-stage.js +172 -0
  420. package/src/orchestrator/standby.js +71 -0
  421. package/src/orchestrator/verification-gate.js +183 -0
  422. package/src/orchestrator.js +22 -0
  423. package/src/plan/adr-generator.js +170 -0
  424. package/src/plan/adr-loader.js +60 -0
  425. package/src/plan/plan-executor.js +100 -0
  426. package/src/plan/plan-fixer.js +192 -0
  427. package/src/plan/plan-hu-ops.js +16 -0
  428. package/src/plan/plan-id.js +4 -0
  429. package/src/plan/plan-migrate-result.js +24 -0
  430. package/src/plan/plan-reviewer.js +236 -0
  431. package/src/plan/plan-schema.js +334 -0
  432. package/src/plan/plan-store.js +260 -0
  433. package/src/plan/plan-structural-pass.js +122 -0
  434. package/src/plan/plan-validation.js +4 -0
  435. package/src/plan/preflight-hu.js +105 -0
  436. package/src/plan/spec-detector.js +61 -0
  437. package/src/plan/tests-synthesizer.js +131 -0
  438. package/src/planning-game/adapter.js +108 -0
  439. package/src/planning-game/architect-adrs.js +45 -0
  440. package/src/planning-game/client.js +108 -0
  441. package/src/planning-game/decomposition.js +87 -0
  442. package/src/planning-game/pipeline-adapter.js +251 -0
  443. package/src/plugins/loader.js +67 -0
  444. package/src/policy/add.js +111 -0
  445. package/src/policy/decisions.js +42 -0
  446. package/src/policy/engine.js +82 -0
  447. package/src/policy/exceptions.js +60 -0
  448. package/src/privacy/onboarding.js +35 -0
  449. package/src/privacy/scan.js +120 -0
  450. package/src/prompts/arbiter.js +38 -0
  451. package/src/prompts/architect.js +103 -0
  452. package/src/prompts/audit.js +474 -0
  453. package/src/prompts/coder.js +287 -0
  454. package/src/prompts/diff-clip.js +27 -0
  455. package/src/prompts/discover.js +222 -0
  456. package/src/prompts/hu-reviewer.js +219 -0
  457. package/src/prompts/planner.js +312 -0
  458. package/src/prompts/prompt-layout.js +80 -0
  459. package/src/prompts/prompt-resolver.js +120 -0
  460. package/src/prompts/reviewer.js +75 -0
  461. package/src/prompts/rtk-snippet.js +25 -0
  462. package/src/prompts/spec-reviewer.js +66 -0
  463. package/src/prompts/split-signal.js +82 -0
  464. package/src/prompts/start-decision.js +52 -0
  465. package/src/prompts/tool-correctness-judge.js +31 -0
  466. package/src/prompts/triage.js +57 -0
  467. package/src/rag/auto-update.js +72 -0
  468. package/src/rag/chunker-ast.js +56 -0
  469. package/src/rag/chunker.js +132 -0
  470. package/src/rag/embedder.js +2 -0
  471. package/src/rag/embedders/_cloud-base.js +2 -0
  472. package/src/rag/embedders/cohere.js +2 -0
  473. package/src/rag/embedders/factory.js +2 -0
  474. package/src/rag/embedders/mistral.js +2 -0
  475. package/src/rag/embedders/onnx.js +2 -0
  476. package/src/rag/embedders/openai.js +2 -0
  477. package/src/rag/embedders/voyage.js +2 -0
  478. package/src/rag/eval.js +61 -0
  479. package/src/rag/governed-embedder.js +39 -0
  480. package/src/rag/indexer.js +199 -0
  481. package/src/rag/library.js +62 -0
  482. package/src/rag/ollama-capability.js +59 -0
  483. package/src/rag/ollama-manager.js +98 -0
  484. package/src/rag/onnx-fallback.js +69 -0
  485. package/src/rag/rerank.js +4 -0
  486. package/src/rag/retriever.js +2 -0
  487. package/src/rag/vec-store.js +17 -0
  488. package/src/rag/watcher.js +62 -0
  489. package/src/rag/where-parser.js +4 -0
  490. package/src/repeat-detector.js +88 -0
  491. package/src/review/card-first.js +99 -0
  492. package/src/review/card-verify.js +83 -0
  493. package/src/review/diff-generator.js +112 -0
  494. package/src/review/gate-gitignore.js +77 -0
  495. package/src/review/git-stash-helper.js +104 -0
  496. package/src/review/mutation-pregate.js +48 -0
  497. package/src/review/one-shot-review.js +122 -0
  498. package/src/review/parser.js +80 -0
  499. package/src/review/policy-gate.js +26 -0
  500. package/src/review/profiles.js +66 -0
  501. package/src/review/reviewer-fallback.js +125 -0
  502. package/src/review/schema.js +31 -0
  503. package/src/review/scope-filter.js +152 -0
  504. package/src/review/snapshot-diff.js +122 -0
  505. package/src/review/solomon-arbitration.js +113 -0
  506. package/src/review/sonar-pregate.js +63 -0
  507. package/src/review/tdd-discipline.js +90 -0
  508. package/src/review/tdd-policy.js +69 -0
  509. package/src/review/tests-with-code.js +33 -0
  510. package/src/review/verdict-store.js +87 -0
  511. package/src/review/workspace.js +21 -0
  512. package/src/roles/agent-role.js +194 -0
  513. package/src/roles/architect-role.js +77 -0
  514. package/src/roles/audit-role.js +258 -0
  515. package/src/roles/base-role.js +165 -0
  516. package/src/roles/coder-role.js +107 -0
  517. package/src/roles/commiter-role.js +110 -0
  518. package/src/roles/discover-role.js +81 -0
  519. package/src/roles/domain-curator-role.js +141 -0
  520. package/src/roles/hu-reviewer-role.js +64 -0
  521. package/src/roles/impeccable-role.js +85 -0
  522. package/src/roles/index.js +18 -0
  523. package/src/roles/karajan-brain-role.js +134 -0
  524. package/src/roles/onboarder-role.js +61 -0
  525. package/src/roles/perf-role.js +122 -0
  526. package/src/roles/planner-role.js +151 -0
  527. package/src/roles/refactorer-role.js +30 -0
  528. package/src/roles/repairer-role.js +181 -0
  529. package/src/roles/researcher-role.js +70 -0
  530. package/src/roles/reviewer-role.js +104 -0
  531. package/src/roles/security-role.js +73 -0
  532. package/src/roles/solomon-role.js +265 -0
  533. package/src/roles/sonar-role.js +70 -0
  534. package/src/roles/spec-reviewer-role.js +106 -0
  535. package/src/roles/tester-role.js +235 -0
  536. package/src/roles/tool-correctness-judge-role.js +78 -0
  537. package/src/roles/triage-role.js +99 -0
  538. package/src/session/journal/decisions-writer.js +200 -0
  539. package/src/session/journal/iteration-logger.js +194 -0
  540. package/src/session/journal/summary-writer.js +320 -0
  541. package/src/session/journal/tree-writer.js +164 -0
  542. package/src/session/journal/write-all.js +89 -0
  543. package/src/session/mutators.js +339 -0
  544. package/src/session/runtime-overrides.js +59 -0
  545. package/src/session/store.js +106 -0
  546. package/src/session-cleanup.js +116 -0
  547. package/src/skills/addyosmani-catalog.js +315 -0
  548. package/src/skills/addyosmani-role-map.js +139 -0
  549. package/src/skills/openskills-client.js +157 -0
  550. package/src/skills/semantic-detector.js +167 -0
  551. package/src/skills/skill-detector.js +385 -0
  552. package/src/skills/skill-loader.js +219 -0
  553. package/src/skills/skills-cache.js +128 -0
  554. package/src/sonar/api.js +128 -0
  555. package/src/sonar/cloud-scanner.js +78 -0
  556. package/src/sonar/config-resolver.js +88 -0
  557. package/src/sonar/credentials.js +60 -0
  558. package/src/sonar/discovery.js +124 -0
  559. package/src/sonar/enforcer.js +19 -0
  560. package/src/sonar/issue-filter.js +12 -0
  561. package/src/sonar/manager.js +181 -0
  562. package/src/sonar/project-key.js +120 -0
  563. package/src/sonar/scanner.js +307 -0
  564. package/src/sonar/token-bootstrap.js +205 -0
  565. package/src/sonar/token-recovery.js +67 -0
  566. package/src/spec-review/refine-loop.js +58 -0
  567. package/src/spec-review/run-spec-review.js +119 -0
  568. package/src/start/assessment.js +74 -0
  569. package/src/start/maturity.js +73 -0
  570. package/src/start/start-decider-role.js +79 -0
  571. package/src/start/sweep.js +157 -0
  572. package/src/sync/apply-canvas-patch.js +55 -0
  573. package/src/sync/detect-drift.js +113 -0
  574. package/src/tournament/crown.js +88 -0
  575. package/src/tournament/judge.js +150 -0
  576. package/src/tournament/run.js +142 -0
  577. package/src/tournament/scoreboard.js +124 -0
  578. package/src/tracker-bootstrap.js +44 -0
  579. package/src/types/agent.js +55 -0
  580. package/src/types/config.js +114 -0
  581. package/src/types/hu.js +47 -0
  582. package/src/types/index.js +38 -0
  583. package/src/types/policy.js +43 -0
  584. package/src/types/session.js +75 -0
  585. package/src/types/solomon.js +87 -0
  586. package/src/types/stage.js +68 -0
  587. package/src/utils/agent-detect.js +93 -0
  588. package/src/utils/ai-trash.js +48 -0
  589. package/src/utils/async-lock.js +31 -0
  590. package/src/utils/atomic-write.js +6 -0
  591. package/src/utils/banner.js +66 -0
  592. package/src/utils/binary-sources.js +70 -0
  593. package/src/utils/board-prompt-bridge.js +108 -0
  594. package/src/utils/budget.js +229 -0
  595. package/src/utils/cli-ask-question.js +93 -0
  596. package/src/utils/cli-progress.js +220 -0
  597. package/src/utils/cli-run-log.js +83 -0
  598. package/src/utils/cwd-confirm.js +39 -0
  599. package/src/utils/derive-project-name-from-cwd.js +119 -0
  600. package/src/utils/display/event-handlers.js +403 -0
  601. package/src/utils/display/formatters.js +132 -0
  602. package/src/utils/display/header.js +47 -0
  603. package/src/utils/display/resume-hint.js +41 -0
  604. package/src/utils/display/session-summary.js +118 -0
  605. package/src/utils/display/solomon.js +42 -0
  606. package/src/utils/display/spec-findings.js +44 -0
  607. package/src/utils/doc-links.js +29 -0
  608. package/src/utils/docker-install.js +34 -0
  609. package/src/utils/escape-regexp.js +15 -0
  610. package/src/utils/events.js +35 -0
  611. package/src/utils/fs.js +19 -0
  612. package/src/utils/garbage-collector.js +481 -0
  613. package/src/utils/git.js +279 -0
  614. package/src/utils/home-migration.js +87 -0
  615. package/src/utils/injection-guard.js +186 -0
  616. package/src/utils/install-hints.js +180 -0
  617. package/src/utils/json-extract.js +64 -0
  618. package/src/utils/locale.js +59 -0
  619. package/src/utils/logger.js +96 -0
  620. package/src/utils/managed-markers.js +93 -0
  621. package/src/utils/manifest-sniff.js +82 -0
  622. package/src/utils/messages.js +61 -0
  623. package/src/utils/model-selector.js +107 -0
  624. package/src/utils/os-detect.js +79 -0
  625. package/src/utils/paths.js +13 -0
  626. package/src/utils/pending-user-action.js +95 -0
  627. package/src/utils/port-check.js +6 -0
  628. package/src/utils/port-occupant.js +96 -0
  629. package/src/utils/pricing.js +29 -0
  630. package/src/utils/process.js +4 -0
  631. package/src/utils/project-detect.js +160 -0
  632. package/src/utils/prompt-project-name.js +35 -0
  633. package/src/utils/provider-env.js +116 -0
  634. package/src/utils/qmd-collection.js +72 -0
  635. package/src/utils/qmd-detect.js +18 -0
  636. package/src/utils/qmd-install.js +37 -0
  637. package/src/utils/quota-simulator.js +56 -0
  638. package/src/utils/rate-limit-detector.js +181 -0
  639. package/src/utils/repo-cleaner.js +79 -0
  640. package/src/utils/retry.js +88 -0
  641. package/src/utils/role-assigner.js +137 -0
  642. package/src/utils/role-env.js +58 -0
  643. package/src/utils/rtk-detect.js +18 -0
  644. package/src/utils/rtk-install.js +38 -0
  645. package/src/utils/rtk-wrapper.js +87 -0
  646. package/src/utils/run-context.js +75 -0
  647. package/src/utils/run-log.js +217 -0
  648. package/src/utils/run-registry.js +9 -0
  649. package/src/utils/shared-paths.js +12 -0
  650. package/src/utils/squeezr-detect.js +21 -0
  651. package/src/utils/squeezr-install.js +37 -0
  652. package/src/utils/stack-detect.js +135 -0
  653. package/src/utils/stall-detector.js +159 -0
  654. package/src/utils/status-dashboard.js +254 -0
  655. package/src/utils/task-file.js +109 -0
  656. package/src/utils/telemetry.js +124 -0
  657. package/src/utils/templates-root.js +61 -0
  658. package/src/utils/tool-call-extractor.js +56 -0
  659. package/src/utils/tool-governor.js +116 -0
  660. package/src/utils/tool-installer.js +93 -0
  661. package/src/utils/update-check.js +280 -0
  662. package/src/utils/vector-store-orphans.js +89 -0
  663. package/src/utils/welcome.js +47 -0
  664. package/src/utils/with-timeout.js +42 -0
  665. package/src/utils/wizard.js +47 -0
  666. package/src/webperf/cwv-gate.js +94 -0
  667. package/src/webperf/devtools-detect.js +112 -0
  668. package/src/webperf/scanner.js +209 -0
  669. package/src/webperf/webperf-role-integration.js +66 -0
  670. package/templates/coder-rules.md +45 -0
  671. package/templates/docker-compose.sonar.yml +60 -0
  672. package/templates/domains/example-dental.md +57 -0
  673. package/templates/kj.config.yml +128 -0
  674. package/templates/review-rules.md +17 -0
  675. package/templates/roles/architect/anthropic.md +74 -0
  676. package/templates/roles/architect/default.md +72 -0
  677. package/templates/roles/architect/google.md +61 -0
  678. package/templates/roles/architect/openai.md +60 -0
  679. package/templates/roles/architect/opencode.md +59 -0
  680. package/templates/roles/architect.md +76 -0
  681. package/templates/roles/audit.md +68 -0
  682. package/templates/roles/coder/anthropic.md +81 -0
  683. package/templates/roles/coder/default.md +78 -0
  684. package/templates/roles/coder/google.md +87 -0
  685. package/templates/roles/coder/openai.md +68 -0
  686. package/templates/roles/coder/opencode.md +58 -0
  687. package/templates/roles/coder.md +152 -0
  688. package/templates/roles/commiter.md +44 -0
  689. package/templates/roles/discover.md +167 -0
  690. package/templates/roles/domain-curator.md +52 -0
  691. package/templates/roles/hu-reviewer.md +236 -0
  692. package/templates/roles/impeccable-design.md +87 -0
  693. package/templates/roles/impeccable.md +125 -0
  694. package/templates/roles/karajan-brain.md +95 -0
  695. package/templates/roles/onboarder.md +45 -0
  696. package/templates/roles/planner/anthropic.md +59 -0
  697. package/templates/roles/planner/default.md +57 -0
  698. package/templates/roles/planner/google.md +75 -0
  699. package/templates/roles/planner/openai.md +55 -0
  700. package/templates/roles/planner/opencode.md +62 -0
  701. package/templates/roles/planner.md +61 -0
  702. package/templates/roles/refactorer.md +48 -0
  703. package/templates/roles/repairer.md +103 -0
  704. package/templates/roles/researcher.md +41 -0
  705. package/templates/roles/reviewer/anthropic.md +61 -0
  706. package/templates/roles/reviewer/default.md +62 -0
  707. package/templates/roles/reviewer/google.md +63 -0
  708. package/templates/roles/reviewer/openai.md +57 -0
  709. package/templates/roles/reviewer/opencode.md +42 -0
  710. package/templates/roles/reviewer-paranoid.md +38 -0
  711. package/templates/roles/reviewer-relaxed.md +34 -0
  712. package/templates/roles/reviewer-strict.md +37 -0
  713. package/templates/roles/reviewer.md +62 -0
  714. package/templates/roles/security.md +54 -0
  715. package/templates/roles/solomon/anthropic.md +71 -0
  716. package/templates/roles/solomon/default.md +83 -0
  717. package/templates/roles/solomon/google.md +61 -0
  718. package/templates/roles/solomon/openai.md +53 -0
  719. package/templates/roles/solomon/opencode.md +55 -0
  720. package/templates/roles/solomon.md +83 -0
  721. package/templates/roles/sonar.md +49 -0
  722. package/templates/roles/spec-reviewer.md +47 -0
  723. package/templates/roles/tester.md +50 -0
  724. package/templates/roles/triage.md +69 -0
  725. package/templates/skills/kj-architect.md +45 -0
  726. package/templates/skills/kj-audit.md +63 -0
  727. package/templates/skills/kj-board.md +16 -0
  728. package/templates/skills/kj-code.md +51 -0
  729. package/templates/skills/kj-csv-transform.md +40 -0
  730. package/templates/skills/kj-data-report.md +44 -0
  731. package/templates/skills/kj-discover.md +24 -0
  732. package/templates/skills/kj-rag-query.md +50 -0
  733. package/templates/skills/kj-review.md +47 -0
  734. package/templates/skills/kj-run.md +73 -0
  735. package/templates/skills/kj-security.md +49 -0
  736. package/templates/skills/kj-sonar.md +41 -0
  737. package/templates/skills/kj-sql-analysis.md +40 -0
  738. package/templates/skills/kj-test.md +40 -0
  739. package/templates/workflows/automerge.yml +30 -0
  740. package/templates/workflows/houston-override.yml +46 -0
  741. package/templates/workflows/kj-ci-gateway.yml +58 -0
  742. package/vendor/tree-sitter-grammars/README.md +21 -0
  743. package/vendor/tree-sitter-grammars/go.wasm +0 -0
  744. package/vendor/tree-sitter-grammars/java.wasm +0 -0
  745. package/vendor/tree-sitter-grammars/python.wasm +0 -0
  746. package/vendor/tree-sitter-grammars/rust.wasm +0 -0
@@ -0,0 +1,174 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Karajan Code installer for Windows — guarantees a COMPLETE install (KJC-TSK-0667).
4
+
5
+ .DESCRIPTION
6
+ Run it with:
7
+ irm https://karajancode.com/install.ps1 | iex
8
+
9
+ Default route: npm — the full product (CLI + RAG + HU Board + MCP).
10
+ 1. Node >= 22.12 present -> npm install -g karajan-code
11
+ 2. No usable Node -> auto-provision the official Node LTS zip into
12
+ ~\.karajan\node (checksum-verified, nothing system-wide touched),
13
+ install karajan-code with it, drop kj/karajan-mcp wrappers into the
14
+ install dir and add it to the user PATH.
15
+ Standalone route (CLI only, no native-module features — RAG/board/MCP
16
+ unavailable): opt-in with $env:KJ_STANDALONE = "1".
17
+
18
+ Env overrides (irm|iex cannot take parameters): KJ_VERSION, KJ_INSTALL_DIR,
19
+ KJ_STANDALONE. Windows PowerShell 5.1 compatible.
20
+ #>
21
+ $ErrorActionPreference = "Stop"
22
+
23
+ $repo = "manufosela/karajan-code"
24
+ $version = if ($env:KJ_VERSION) { $env:KJ_VERSION } else { "latest" }
25
+ $installDir = if ($env:KJ_INSTALL_DIR) { $env:KJ_INSTALL_DIR } else { Join-Path $env:LOCALAPPDATA "Karajan" }
26
+ $mode = if ($env:KJ_STANDALONE -eq "1") { "standalone" } else { "full" }
27
+ $nodeMajor = 22
28
+ $nodeMinMinor = 12
29
+
30
+ function Get-NpmPkg {
31
+ if ($version -eq "latest") { "karajan-code" } else { "karajan-code@" + $version.TrimStart("v") }
32
+ }
33
+
34
+ function Test-NodeOk {
35
+ $node = Get-Command node -ErrorAction SilentlyContinue
36
+ if (-not $node) { return $false }
37
+ $v = (& node --version) 2>$null
38
+ if (-not $v) { return $false }
39
+ $parts = $v.TrimStart("v").Split(".")
40
+ $major = [int]$parts[0]; $minor = [int]$parts[1]
41
+ return ($major -gt $nodeMajor) -or ($major -eq $nodeMajor -and $minor -ge $nodeMinMinor)
42
+ }
43
+
44
+ function Add-UserPath([string]$dir) {
45
+ $userPath = [Environment]::GetEnvironmentVariable("Path", "User")
46
+ $parts = @()
47
+ if ($userPath) { $parts = $userPath.Split(";") | Where-Object { $_ -ne "" } }
48
+ $already = $parts | Where-Object { $_.TrimEnd("\") -ieq $dir.TrimEnd("\") }
49
+ if (-not $already) {
50
+ $newPath = if ($userPath) { "$userPath;$dir" } else { $dir }
51
+ [Environment]::SetEnvironmentVariable("Path", $newPath, "User")
52
+ Write-Host "kj-install: added '$dir' to your user PATH. Open a NEW terminal to use 'kj'."
53
+ }
54
+ }
55
+
56
+ $tmp = Join-Path ([System.IO.Path]::GetTempPath()) ("kj-install-" + [System.Guid]::NewGuid().ToString("N"))
57
+ New-Item -ItemType Directory -Path $tmp -Force | Out-Null
58
+
59
+ try {
60
+ if ($mode -eq "full") {
61
+ if (Test-NodeOk) {
62
+ Write-Host "kj-install: Node $(& node --version) found — installing via npm (full product)..."
63
+ & npm install -g (Get-NpmPkg)
64
+ if ($LASTEXITCODE -ne 0) { throw "npm install failed (exit $LASTEXITCODE)." }
65
+ Write-Host "kj-install: installed. Run 'kj doctor' next, then 'kj install-tools' to complete the whole stack."
66
+ return
67
+ }
68
+
69
+ Write-Host "kj-install: no usable Node (need >= $nodeMajor.$nodeMinMinor) — provisioning official Node LTS into ~\.karajan\node (nothing system-wide)..."
70
+ $dist = "https://nodejs.org/dist/latest-v$nodeMajor.x"
71
+ $shaFile = Join-Path $tmp "SHASUMS256.txt"
72
+ Invoke-WebRequest -Uri "$dist/SHASUMS256.txt" -OutFile $shaFile -UseBasicParsing
73
+ $shaLines = Get-Content $shaFile
74
+ $assetLine = $shaLines | Where-Object { $_ -match "node-v[0-9.]+-win-x64\.zip" } | Select-Object -First 1
75
+ if (-not $assetLine) { throw "no official Node build for win-x64 in $dist" }
76
+ $nodeAsset = ($assetLine -split "\s+")[1]
77
+ $expected = ($assetLine -split "\s+")[0].ToLower()
78
+
79
+ Write-Host "kj-install: downloading $nodeAsset..."
80
+ $zip = Join-Path $tmp $nodeAsset
81
+ Invoke-WebRequest -Uri "$dist/$nodeAsset" -OutFile $zip -UseBasicParsing
82
+ $actual = (Get-FileHash -Algorithm SHA256 -Path $zip).Hash.ToLower()
83
+ if ($expected -ne $actual) { throw "Node checksum mismatch — aborting, nothing installed." }
84
+
85
+ # Stage everything (extract + npm install) and only swap into place once
86
+ # EVERYTHING succeeded — a failure must never destroy a previous working
87
+ # ~\.karajan\node.
88
+ $nodeHome = Join-Path $env:USERPROFILE ".karajan\node"
89
+ $staging = "$nodeHome.staging.$PID"
90
+ $extract = Join-Path $tmp "extract"
91
+ if (Test-Path $staging) { Remove-Item -Recurse -Force $staging }
92
+ Expand-Archive -Path $zip -DestinationPath $extract -Force
93
+ # The zip wraps everything in a node-vX.Y.Z-win-x64\ top folder — unwrap it.
94
+ $inner = Get-ChildItem -Directory $extract | Select-Object -First 1
95
+ New-Item -ItemType Directory -Path (Split-Path $staging) -Force | Out-Null
96
+ Move-Item -Path $inner.FullName -Destination $staging
97
+
98
+ Write-Host "kj-install: installing karajan-code with the provisioned Node..."
99
+ $env:Path = "$staging;$env:Path"
100
+ # Explicit --prefix: the official Windows npm ships a builtin prefix of
101
+ # %AppData%\npm — without this the global shims would land OUTSIDE the
102
+ # self-contained ~\.karajan\node home (on Windows, prefix root IS the
103
+ # global bin dir, so shims land at $staging\kj.cmd).
104
+ & (Join-Path $staging "npm.cmd") install -g --prefix "$staging" (Get-NpmPkg)
105
+ if ($LASTEXITCODE -ne 0) { throw "npm install failed with the provisioned Node (exit $LASTEXITCODE)." }
106
+ foreach ($bin in @("kj", "karajan-mcp")) {
107
+ if (-not (Test-Path (Join-Path $staging "$bin.cmd"))) {
108
+ throw "npm reported success but the $bin shim is missing from the staged prefix — the full product needs both kj and karajan-mcp. Aborting, nothing swapped."
109
+ }
110
+ }
111
+
112
+ # Swap keeping the previous install recoverable: park it as a backup,
113
+ # move the staged one in, restore the backup if that move fails.
114
+ $backup = "$nodeHome.old.$PID"
115
+ if (Test-Path $nodeHome) { Move-Item -Path $nodeHome -Destination $backup -Force }
116
+ try {
117
+ Move-Item -Path $staging -Destination $nodeHome
118
+ } catch {
119
+ if (Test-Path $backup) { Move-Item -Path $backup -Destination $nodeHome -Force }
120
+ throw "could not move the staged install into place (previous install restored). $_"
121
+ }
122
+ if (Test-Path $backup) { Remove-Item -Recurse -Force $backup }
123
+
124
+ # Wrappers, not copies: npm's own .cmd shims live inside nodeHome and
125
+ # resolve node via their folder; these put nodeHome on PATH for children
126
+ # (kj spawns node tooling) and forward every argument.
127
+ New-Item -ItemType Directory -Path $installDir -Force | Out-Null
128
+ foreach ($bin in @("kj", "karajan-mcp")) {
129
+ $shim = Join-Path $nodeHome "$bin.cmd"
130
+ $wrapper = @(
131
+ "@echo off",
132
+ "set `"PATH=$nodeHome;%PATH%`"",
133
+ "`"$shim`" %*"
134
+ )
135
+ Set-Content -Path (Join-Path $installDir "$bin.cmd") -Value $wrapper -Encoding ASCII
136
+ }
137
+ Add-UserPath $installDir
138
+ $installed = (& (Join-Path $installDir "kj.cmd") --version) 2>$null
139
+ Write-Host "kj-install: installed kj $installed (full product) — kj at $(Join-Path $installDir 'kj.cmd')"
140
+ Write-Host "kj-install: next — run 'kj doctor', then 'kj install-tools' to complete the whole stack."
141
+ return
142
+ }
143
+
144
+ # --- Standalone route: prebuilt single binary (CLI only). ---
145
+ Write-Host "kj-install: standalone mode — single binary, NO native-module features (RAG, HU Board and MCP need the npm install)."
146
+ $asset = "kj-win-x64.exe"
147
+ $base = if ($version -eq "latest") { "https://github.com/$repo/releases/latest/download" }
148
+ else { "https://github.com/$repo/releases/download/$version" }
149
+
150
+ $binTmp = Join-Path $tmp "kj.exe"
151
+ $shaTmp = Join-Path $tmp "kj.exe.sha256"
152
+ Write-Host "kj-install: downloading $asset ($version)..."
153
+ Invoke-WebRequest -Uri "$base/$asset" -OutFile $binTmp -UseBasicParsing
154
+ Invoke-WebRequest -Uri "$base/$asset.sha256" -OutFile $shaTmp -UseBasicParsing
155
+
156
+ $shaLine = (Get-Content $shaTmp | Where-Object { $_ -notmatch "SHA256|CertUtil" } | Select-Object -First 1)
157
+ $expected = ($shaLine -replace "[^0-9A-Fa-f]", "").ToLower()
158
+ $actual = (Get-FileHash -Algorithm SHA256 -Path $binTmp).Hash.ToLower()
159
+ if ($expected.Length -ne 64 -or $expected -ne $actual) {
160
+ throw "checksum mismatch (expected '$expected', got '$actual'). Aborting, nothing installed."
161
+ }
162
+
163
+ New-Item -ItemType Directory -Path $installDir -Force | Out-Null
164
+ $dest = Join-Path $installDir "kj.exe"
165
+ Move-Item -Path $binTmp -Destination $dest -Force
166
+ # Clear the mark-of-the-web on the copy we just checksum-verified ourselves.
167
+ Unblock-File -Path $dest -ErrorAction SilentlyContinue
168
+ Add-UserPath $installDir
169
+ $installed = (& $dest --version) 2>$null
170
+ Write-Host "kj-install: installed standalone kj $installed to $dest"
171
+ Write-Host "kj-install: next — run 'kj doctor'. For the full product later: re-run without KJ_STANDALONE."
172
+ } finally {
173
+ Remove-Item -Path $tmp -Recurse -Force -ErrorAction SilentlyContinue
174
+ }
@@ -0,0 +1,159 @@
1
+ #!/bin/sh
2
+ # Karajan Code installer — guarantees a COMPLETE install (KJC-TSK-0658).
3
+ #
4
+ # curl -fsSL https://karajancode.com/install.sh | sh
5
+ #
6
+ # Default route: npm — the full product (CLI + RAG + HU Board + MCP).
7
+ # 1. Node >= 22.12 present → npm install -g karajan-code
8
+ # 2. No usable Node → auto-provision official Node LTS into
9
+ # ~/.karajan/node (checksum-verified, nothing system-wide touched),
10
+ # install karajan-code with it, symlink kj into ~/.local/bin.
11
+ # Standalone route (CLI only, no native-module features — RAG/board/MCP
12
+ # unavailable): opt-in with `--standalone` or KJ_STANDALONE=1.
13
+ #
14
+ # POSIX sh only. Env overrides: KJ_VERSION, KJ_INSTALL_DIR.
15
+ set -eu
16
+
17
+ REPO="manufosela/karajan-code"
18
+ VERSION="${KJ_VERSION:-latest}"
19
+ INSTALL_DIR="${KJ_INSTALL_DIR:-$HOME/.local/bin}"
20
+ NODE_MAJOR="22"
21
+ NODE_MIN_MINOR="12"
22
+ MODE="full"
23
+ [ "${1:-}" = "--standalone" ] && MODE="standalone"
24
+ [ "${KJ_STANDALONE:-0}" = "1" ] && MODE="standalone"
25
+
26
+ die() { echo "kj-install: $1" >&2; exit 1; }
27
+
28
+ # --- Detect OS/arch (shared by both routes). ---
29
+ os="$(uname -s)"; arch="$(uname -m)"
30
+ case "$os" in
31
+ Linux) os="linux" ;;
32
+ Darwin) os="darwin" ;;
33
+ *) die "unsupported OS '$os'. Supported: Linux, macOS." ;;
34
+ esac
35
+ case "$arch" in
36
+ x86_64 | amd64) arch="x64" ;;
37
+ arm64 | aarch64) arch="arm64" ;;
38
+ *) die "unsupported architecture '$arch'" ;;
39
+ esac
40
+
41
+ # --- Downloader + checksum tool. ---
42
+ if command -v curl >/dev/null 2>&1; then fetch() { curl -fsSL "$1" -o "$2"; }
43
+ elif command -v wget >/dev/null 2>&1; then fetch() { wget -qO "$2" "$1"; }
44
+ else die "need curl or wget"; fi
45
+ if command -v sha256sum >/dev/null 2>&1; then sha256() { sha256sum "$1" | cut -d' ' -f1; }
46
+ elif command -v shasum >/dev/null 2>&1; then sha256() { shasum -a 256 "$1" | cut -d' ' -f1; }
47
+ else die "need sha256sum or shasum to verify downloads"; fi
48
+
49
+ tmp="$(mktemp -d "${TMPDIR:-/tmp}/kj-install.XXXXXX")"
50
+ trap 'rm -rf "$tmp"' EXIT INT TERM
51
+
52
+ path_hint() {
53
+ case ":${PATH}:" in
54
+ *":$1:"*) ;;
55
+ *) echo "kj-install: add '$1' to your PATH: export PATH=\"$1:\$PATH\" (persist it in ~/.bashrc / ~/.zshrc)" ;;
56
+ esac
57
+ }
58
+
59
+ # --- Is there a usable Node (>= NODE_MAJOR.NODE_MIN_MINOR)? ---
60
+ node_ok() {
61
+ command -v node >/dev/null 2>&1 || return 1
62
+ v="$(node --version 2>/dev/null | sed 's/^v//')"
63
+ major="${v%%.*}"; rest="${v#*.}"; minor="${rest%%.*}"
64
+ [ "$major" -gt "$NODE_MAJOR" ] 2>/dev/null && return 0
65
+ [ "$major" -eq "$NODE_MAJOR" ] 2>/dev/null && [ "$minor" -ge "$NODE_MIN_MINOR" ] 2>/dev/null
66
+ }
67
+
68
+ npm_pkg() { if [ "$VERSION" = "latest" ]; then echo "karajan-code"; else echo "karajan-code@${VERSION#v}"; fi; }
69
+
70
+ if [ "$MODE" = "full" ]; then
71
+ if node_ok; then
72
+ echo "kj-install: Node $(node --version) found — installing via npm (full product)..."
73
+ npm install -g "$(npm_pkg)" || die "npm install failed. If it was a permissions error, set a user prefix (npm config set prefix ~/.local) and re-run."
74
+ echo "kj-install: installed $(kj --version 2>/dev/null || echo karajan-code). Run 'kj doctor' next."
75
+ exit 0
76
+ fi
77
+
78
+ echo "kj-install: no usable Node (need >= ${NODE_MAJOR}.${NODE_MIN_MINOR}) — provisioning official Node LTS into ~/.karajan/node (nothing system-wide)..."
79
+ dist="https://nodejs.org/dist/latest-v${NODE_MAJOR}.x"
80
+ fetch "${dist}/SHASUMS256.txt" "${tmp}/SHASUMS256.txt" || die "could not fetch the Node checksum list"
81
+ node_asset="$(grep -o "node-v[0-9.]*-${os}-${arch}\.tar\.gz" "${tmp}/SHASUMS256.txt" | head -1)"
82
+ [ -n "$node_asset" ] || die "no official Node build for ${os}-${arch}"
83
+ echo "kj-install: downloading ${node_asset}..."
84
+ fetch "${dist}/${node_asset}" "${tmp}/${node_asset}" || die "could not download Node"
85
+ expected="$(grep "${node_asset}\$" "${tmp}/SHASUMS256.txt" | head -1 | cut -d' ' -f1)"
86
+ actual="$(sha256 "${tmp}/${node_asset}")"
87
+ [ "$expected" = "$actual" ] || die "Node checksum mismatch — aborting, nothing installed"
88
+
89
+ # Stage the whole install (extract + npm install) in a sibling dir and only
90
+ # swap it into place once EVERYTHING succeeded — a failed download/extract/
91
+ # install must never destroy a previous working ~/.karajan/node.
92
+ node_home="$HOME/.karajan/node"
93
+ staging="${node_home}.staging.$$"
94
+ rm -rf "$staging"; mkdir -p "$staging"
95
+ trap 'rm -rf "$tmp" "$staging"' EXIT INT TERM
96
+ tar -xzf "${tmp}/${node_asset}" -C "$staging" --strip-components=1 || die "could not extract Node"
97
+
98
+ echo "kj-install: installing karajan-code with the provisioned Node..."
99
+ PATH="${staging}/bin:$PATH" "${staging}/bin/npm" install -g "$(npm_pkg)" || die "npm install failed with the provisioned Node"
100
+
101
+ # Swap keeping the previous install recoverable at EVERY instant: park it
102
+ # as a backup, arm a trap that restores it on any exit (signal included),
103
+ # move the staged one in, and only then disarm the trap and drop the
104
+ # backup — the user can never end up without a working install.
105
+ backup="${node_home}.old.$$"
106
+ if [ -e "$node_home" ]; then
107
+ mv "$node_home" "$backup" || die "could not park the previous install"
108
+ trap '[ -e "$node_home" ] || mv "$backup" "$node_home" 2>/dev/null; rm -rf "$tmp" "$staging"' EXIT INT TERM
109
+ fi
110
+ mv "$staging" "$node_home" || die "could not move the staged install into place (previous install restored)"
111
+ trap 'rm -rf "$tmp"' EXIT INT TERM
112
+ rm -rf "$backup"
113
+ mkdir -p "$INSTALL_DIR"
114
+ # Wrappers, not symlinks: the shebang (#!/usr/bin/env node) must find the
115
+ # provisioned Node even though it is not on the user's PATH.
116
+ for bin in kj karajan-mcp; do
117
+ [ -e "${node_home}/bin/${bin}" ] || continue
118
+ {
119
+ echo '#!/bin/sh'
120
+ echo "export PATH=\"${node_home}/bin:\$PATH\""
121
+ echo "exec \"${node_home}/bin/${bin}\" \"\$@\""
122
+ } >"${INSTALL_DIR}/${bin}"
123
+ chmod +x "${INSTALL_DIR}/${bin}"
124
+ done
125
+ installed="$("${INSTALL_DIR}/kj" --version 2>/dev/null || echo '?')"
126
+ echo "kj-install: installed kj ${installed} (full product) — kj at ${INSTALL_DIR}/kj"
127
+ path_hint "$INSTALL_DIR"
128
+ echo "kj-install: next — run 'kj doctor', then 'kj install-tools' to complete the whole stack."
129
+ exit 0
130
+ fi
131
+
132
+ # --- Standalone route: prebuilt single binary (CLI only). ---
133
+ echo "kj-install: standalone mode — single binary, NO native-module features (RAG, HU Board and MCP need the npm install)."
134
+ target="${os}-${arch}"
135
+ case "$target" in
136
+ linux-x64 | darwin-arm64) ;;
137
+ *) die "no prebuilt binary for '$target' (available: linux-x64, darwin-arm64) — run without --standalone for the npm route" ;;
138
+ esac
139
+ asset="kj-${target}"
140
+ if [ "$VERSION" = "latest" ]; then base="https://github.com/${REPO}/releases/latest/download"
141
+ else base="https://github.com/${REPO}/releases/download/${VERSION}"; fi
142
+
143
+ echo "kj-install: downloading ${asset} (${VERSION})..."
144
+ fetch "${base}/${asset}" "${tmp}/kj" || die "could not download ${base}/${asset}"
145
+ fetch "${base}/${asset}.sha256" "${tmp}/kj.sha256" || die "could not download the checksum for ${asset}"
146
+ expected="$(cut -d' ' -f1 <"${tmp}/kj.sha256")"
147
+ actual="$(sha256 "${tmp}/kj")"
148
+ [ "$expected" = "$actual" ] || die "checksum mismatch — aborting, nothing installed"
149
+
150
+ chmod +x "${tmp}/kj"
151
+ mkdir -p "$INSTALL_DIR"
152
+ mv -f "${tmp}/kj" "${INSTALL_DIR}/kj"
153
+ if [ "$os" = "darwin" ] && command -v xattr >/dev/null 2>&1; then
154
+ xattr -d com.apple.quarantine "${INSTALL_DIR}/kj" 2>/dev/null || true
155
+ fi
156
+ installed="$("${INSTALL_DIR}/kj" --version 2>/dev/null || echo '?')"
157
+ echo "kj-install: installed standalone kj ${installed} to ${INSTALL_DIR}/kj"
158
+ path_hint "$INSTALL_DIR"
159
+ echo "kj-install: next — run 'kj doctor'. For the full product later: re-run this installer without --standalone."
@@ -0,0 +1,85 @@
1
+ #!/bin/bash
2
+ #
3
+ # Installs the AI Attribution Guard workflow in all repos of a GitHub user.
4
+ # Requires: gh CLI authenticated with admin/push permissions.
5
+ #
6
+ # Usage:
7
+ # ./scripts/install-guard-all-repos.sh # dry-run
8
+ # ./scripts/install-guard-all-repos.sh --apply # install in all repos
9
+ #
10
+ # What it does:
11
+ # - Creates .github/workflows/ai-attribution-guard.yml in each repo
12
+ # - Skips repos that already have the file
13
+ # - Skips archived repos
14
+
15
+ set -euo pipefail
16
+
17
+ OWNER="${GH_OWNER:-manufosela}"
18
+ APPLY=false
19
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
20
+ WORKFLOW_FILE="$SCRIPT_DIR/ai-attribution-guard.yml"
21
+
22
+ if [[ "${1:-}" == "--apply" ]]; then
23
+ APPLY=true
24
+ fi
25
+
26
+ if [[ ! -f "$WORKFLOW_FILE" ]]; then
27
+ echo "ERROR: $WORKFLOW_FILE not found"
28
+ exit 1
29
+ fi
30
+
31
+ CONTENT=$(base64 -w 0 "$WORKFLOW_FILE")
32
+
33
+ echo "=== Install AI Attribution Guard in all repos of $OWNER ==="
34
+ echo ""
35
+
36
+ if [[ "$APPLY" == false ]]; then
37
+ echo " DRY RUN mode. Use --apply to actually install."
38
+ echo ""
39
+ fi
40
+
41
+ REPOS=$(gh repo list "$OWNER" --limit 500 --json name,isArchived \
42
+ --jq '.[] | select(.isArchived == false) | .name')
43
+
44
+ TOTAL=0
45
+ INSTALLED=0
46
+ SKIPPED=0
47
+ FAILED=0
48
+
49
+ while read -r REPO; do
50
+ [ -z "$REPO" ] && continue
51
+ TOTAL=$((TOTAL + 1))
52
+
53
+ # Check if workflow already exists
54
+ EXISTS=$(gh api "repos/$OWNER/$REPO/contents/.github/workflows/ai-attribution-guard.yml" --jq '.sha' 2>/dev/null || echo "")
55
+
56
+ if [[ -n "$EXISTS" ]]; then
57
+ echo " SKIP $REPO — workflow already exists"
58
+ SKIPPED=$((SKIPPED + 1))
59
+ continue
60
+ fi
61
+
62
+ if [[ "$APPLY" == false ]]; then
63
+ echo " WOULD $REPO"
64
+ continue
65
+ fi
66
+
67
+ if gh api "repos/$OWNER/$REPO/contents/.github/workflows/ai-attribution-guard.yml" -X PUT \
68
+ -f message="chore: add AI attribution guard workflow" \
69
+ -f content="$CONTENT" \
70
+ --jq '.commit.sha' 2>/dev/null; then
71
+ echo " OK $REPO"
72
+ INSTALLED=$((INSTALLED + 1))
73
+ else
74
+ echo " FAIL $REPO — check permissions"
75
+ FAILED=$((FAILED + 1))
76
+ fi
77
+
78
+ done <<< "$REPOS"
79
+
80
+ echo ""
81
+ echo "=== Summary ==="
82
+ echo " Total: $TOTAL"
83
+ echo " Installed: $INSTALLED"
84
+ echo " Skipped: $SKIPPED"
85
+ echo " Failed: $FAILED"
@@ -0,0 +1,193 @@
1
+ #!/bin/sh
2
+ # Karajan Code - Universal Installer
3
+ # Usage: curl -fsSL https://raw.githubusercontent.com/manufosela/karajan-code/main/scripts/install-kj.sh | sh
4
+ #
5
+ # Installs karajan-code globally via npm if Node.js >= 18 is available.
6
+ # If Node.js is not installed, prints platform-specific instructions.
7
+
8
+ # --- Color support ---
9
+ setup_colors() {
10
+ if [ -t 1 ] && command -v tput >/dev/null 2>&1 && [ "$(tput colors 2>/dev/null || echo 0)" -ge 8 ]; then
11
+ BOLD="$(tput bold)"
12
+ GREEN="$(tput setaf 2)"
13
+ YELLOW="$(tput setaf 3)"
14
+ RED="$(tput setaf 1)"
15
+ CYAN="$(tput setaf 6)"
16
+ RESET="$(tput sgr0)"
17
+ else
18
+ BOLD="" GREEN="" YELLOW="" RED="" CYAN="" RESET=""
19
+ fi
20
+ }
21
+
22
+ info() { printf '%s[info]%s %s\n' "$CYAN" "$RESET" "$1"; }
23
+ success() { printf '%s[ok]%s %s\n' "$GREEN" "$RESET" "$1"; }
24
+ warn() { printf '%s[warn]%s %s\n' "$YELLOW" "$RESET" "$1"; }
25
+ error() { printf '%s[error]%s %s\n' "$RED" "$RESET" "$1"; }
26
+
27
+ # --- Platform detection ---
28
+ detect_platform() {
29
+ OS="$(uname -s)"
30
+ ARCH="$(uname -m)"
31
+
32
+ case "$OS" in
33
+ Linux*) PLATFORM="linux" ;;
34
+ Darwin*) PLATFORM="macos" ;;
35
+ MINGW*|MSYS*|CYGWIN*) PLATFORM="windows" ;;
36
+ *) PLATFORM="unknown" ;;
37
+ esac
38
+
39
+ case "$ARCH" in
40
+ x86_64|amd64) ARCH="x64" ;;
41
+ aarch64|arm64) ARCH="arm64" ;;
42
+ *) ARCH="$ARCH" ;;
43
+ esac
44
+ }
45
+
46
+ # --- Check Node.js ---
47
+ check_node() {
48
+ if ! command -v node >/dev/null 2>&1; then
49
+ return 1
50
+ fi
51
+
52
+ NODE_VERSION="$(node --version 2>/dev/null | sed 's/^v//')"
53
+ NODE_MAJOR="$(echo "$NODE_VERSION" | cut -d. -f1)"
54
+
55
+ if [ "$NODE_MAJOR" -lt 18 ] 2>/dev/null; then
56
+ warn "Node.js v${NODE_VERSION} found, but v18+ is required."
57
+ return 1
58
+ fi
59
+
60
+ return 0
61
+ }
62
+
63
+ # --- Print Node.js install instructions ---
64
+ print_node_instructions() {
65
+ echo ""
66
+ error "Node.js >= 18 is required but not found."
67
+ echo ""
68
+ printf '%sInstall Node.js for your platform:%s\n' "$BOLD" "$RESET"
69
+ echo ""
70
+
71
+ case "$PLATFORM" in
72
+ linux)
73
+ echo " Option 1 - nvm (recommended):"
74
+ echo " curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash"
75
+ echo " nvm install 22"
76
+ echo ""
77
+ echo " Option 2 - NodeSource:"
78
+ echo " curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -"
79
+ echo " sudo apt-get install -y nodejs"
80
+ ;;
81
+ macos)
82
+ echo " Option 1 - nvm (recommended):"
83
+ echo " curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash"
84
+ echo " nvm install 22"
85
+ echo ""
86
+ echo " Option 2 - Homebrew:"
87
+ echo " brew install node@22"
88
+ ;;
89
+ windows)
90
+ echo " Option 1 - nvm-windows:"
91
+ echo " https://github.com/coreybutler/nvm-windows/releases"
92
+ echo ""
93
+ echo " Option 2 - Download installer:"
94
+ echo " https://nodejs.org/en/download/"
95
+ ;;
96
+ *)
97
+ echo " Download from: https://nodejs.org/en/download/"
98
+ ;;
99
+ esac
100
+
101
+ echo ""
102
+ echo " After installing Node.js, re-run this script:"
103
+ echo " curl -fsSL https://raw.githubusercontent.com/manufosela/karajan-code/main/scripts/install-kj.sh | sh"
104
+ echo ""
105
+ }
106
+
107
+ # --- Install via npm ---
108
+ install_karajan() {
109
+ info "Installing karajan-code via npm..."
110
+ echo ""
111
+
112
+ if npm install -g karajan-code; then
113
+ success "karajan-code installed successfully."
114
+ else
115
+ echo ""
116
+ error "npm install failed."
117
+ echo ""
118
+ echo " Common fixes:"
119
+ echo " - Permission error? Use: sudo npm install -g karajan-code"
120
+ echo " - Or configure npm prefix: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
121
+ echo ""
122
+ exit 1
123
+ fi
124
+ }
125
+
126
+ # --- Verify installation ---
127
+ verify_install() {
128
+ echo ""
129
+ if command -v kj >/dev/null 2>&1; then
130
+ KJ_VERSION="$(kj --version 2>/dev/null || echo "unknown")"
131
+ success "kj ${KJ_VERSION} is ready."
132
+ else
133
+ warn "kj command not found in PATH. You may need to restart your shell."
134
+ return 1
135
+ fi
136
+ }
137
+
138
+ # --- Run kj init ---
139
+ run_init() {
140
+ if command -v kj >/dev/null 2>&1; then
141
+ info "Running kj init to detect installed agents..."
142
+ echo ""
143
+ kj init --no-interactive 2>/dev/null || true
144
+ echo ""
145
+ fi
146
+ }
147
+
148
+ # --- Print next steps ---
149
+ print_next_steps() {
150
+ echo ""
151
+ printf '%s%s--- Karajan Code installed ---%s\n' "$BOLD" "$GREEN" "$RESET"
152
+ echo ""
153
+ echo " Next steps:"
154
+ echo ""
155
+ echo " 1. Go to a project directory:"
156
+ echo " cd your-project/"
157
+ echo ""
158
+ echo " 2. Run from CLI:"
159
+ echo " kj run \"Add input validation with tests\""
160
+ echo ""
161
+ echo " 3. Or use as MCP server inside Claude Code / Codex:"
162
+ echo " The MCP server auto-registers during install."
163
+ echo " Open kj-tail in a separate terminal to see pipeline output."
164
+ echo ""
165
+ echo " Docs: https://karajancode.com"
166
+ echo ""
167
+ }
168
+
169
+ # --- Main ---
170
+ main() {
171
+ setup_colors
172
+
173
+ echo ""
174
+ printf '%s%sKarajan Code Installer%s\n' "$BOLD" "$CYAN" "$RESET"
175
+ echo ""
176
+
177
+ detect_platform
178
+ info "Detected: ${PLATFORM} (${ARCH})"
179
+
180
+ if ! check_node; then
181
+ print_node_instructions
182
+ exit 1
183
+ fi
184
+
185
+ success "Node.js v${NODE_VERSION} detected."
186
+
187
+ install_karajan
188
+ verify_install
189
+ run_init
190
+ print_next_steps
191
+ }
192
+
193
+ main