@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.
- package/LICENSE +661 -0
- package/README.md +98 -0
- package/bin/karajan-mcp.js +2 -0
- package/bin/kj-rag-mcp.js +75 -0
- package/bin/kj-tail +361 -0
- package/bin/kj.js +2 -0
- package/docs/README.es.md +80 -0
- package/docs/karajan-code-logo-small.png +0 -0
- package/library/logical-clocks-lamport.md +40 -0
- package/package.json +140 -0
- package/packages/ai-trash/README.md +37 -0
- package/packages/ai-trash/bin/kj-trash.js +10 -0
- package/packages/ai-trash/package.json +43 -0
- package/packages/ai-trash/src/cli.js +200 -0
- package/packages/ai-trash/src/destructive-parser.js +74 -0
- package/packages/ai-trash/src/git-snapshot.js +128 -0
- package/packages/ai-trash/src/hook.js +137 -0
- package/packages/ai-trash/src/index.js +14 -0
- package/packages/ai-trash/src/install.js +73 -0
- package/packages/ai-trash/src/logger.js +60 -0
- package/packages/ai-trash/src/manifest.js +91 -0
- package/packages/ai-trash/src/permissions.js +26 -0
- package/packages/ai-trash/src/snapshot.js +66 -0
- package/packages/ai-trash/src/ulid.js +66 -0
- package/packages/hu-board/README.md +69 -0
- package/packages/hu-board/package.json +28 -0
- package/packages/hu-board/public/app.js +259 -0
- package/packages/hu-board/public/index.html +77 -0
- package/packages/hu-board/public/pipeline.css +132 -0
- package/packages/hu-board/public/pipeline.html +48 -0
- package/packages/hu-board/public/pipeline.js +200 -0
- package/packages/hu-board/public/rag.html +21 -0
- package/packages/hu-board/public/rag.js +39 -0
- package/packages/hu-board/public/styles.css +973 -0
- package/packages/hu-board/public/utils/api.js +139 -0
- package/packages/hu-board/public/utils/board-view.js +473 -0
- package/packages/hu-board/public/utils/command-launcher.js +213 -0
- package/packages/hu-board/public/utils/config-editor.js +181 -0
- package/packages/hu-board/public/utils/dashboard-view.js +103 -0
- package/packages/hu-board/public/utils/formatters.js +300 -0
- package/packages/hu-board/public/utils/graph-view.js +216 -0
- package/packages/hu-board/public/utils/hu-actions.js +224 -0
- package/packages/hu-board/public/utils/init-listeners.js +180 -0
- package/packages/hu-board/public/utils/log-panel.js +222 -0
- package/packages/hu-board/public/utils/modals.js +309 -0
- package/packages/hu-board/public/utils/plan-rollup-view.js +53 -0
- package/packages/hu-board/public/utils/preflight-view.js +89 -0
- package/packages/hu-board/public/utils/project-actions.js +143 -0
- package/packages/hu-board/public/utils/project-picker-view.js +139 -0
- package/packages/hu-board/public/utils/run-launcher.js +169 -0
- package/packages/hu-board/public/utils/server-push.js +252 -0
- package/packages/hu-board/public/utils/sessions-view.js +199 -0
- package/packages/hu-board/public/utils/story-detail-view.js +324 -0
- package/packages/hu-board/public/utils/story-edit-form.js +271 -0
- package/packages/hu-board/public/wiki.html +32 -0
- package/packages/hu-board/public/wiki.js +53 -0
- package/packages/hu-board/src/auth.js +92 -0
- package/packages/hu-board/src/boot-info.js +16 -0
- package/packages/hu-board/src/cleanup-zombies.js +145 -0
- package/packages/hu-board/src/command-runner.js +133 -0
- package/packages/hu-board/src/config-yaml.js +531 -0
- package/packages/hu-board/src/db.js +963 -0
- package/packages/hu-board/src/ephemeral-cleaner.js +196 -0
- package/packages/hu-board/src/event-bus.js +58 -0
- package/packages/hu-board/src/format.js +207 -0
- package/packages/hu-board/src/hu-zombie-reaper.js +103 -0
- package/packages/hu-board/src/journal-parser.js +180 -0
- package/packages/hu-board/src/plan-mutations.js +424 -0
- package/packages/hu-board/src/preflight.js +286 -0
- package/packages/hu-board/src/routes/api.js +1374 -0
- package/packages/hu-board/src/routes/pipeline.js +45 -0
- package/packages/hu-board/src/routes/rag.js +42 -0
- package/packages/hu-board/src/routes/wiki.js +43 -0
- package/packages/hu-board/src/run-tracker.js +121 -0
- package/packages/hu-board/src/server.js +438 -0
- package/packages/hu-board/src/sync.js +732 -0
- package/packages/hu-board/src/token-store.js +56 -0
- package/packages/hu-board/src/zombie-reaper.js +206 -0
- package/scripts/ai-attribution-guard.yml +84 -0
- package/scripts/audit-test-diet.mjs +151 -0
- package/scripts/build-sea.mjs +150 -0
- package/scripts/diet-baseline.mjs +170 -0
- package/scripts/dual-publish.mjs +67 -0
- package/scripts/esbuild-sea.config.mjs +273 -0
- package/scripts/git-hooks/post-merge +18 -0
- package/scripts/install-binary.ps1 +174 -0
- package/scripts/install-binary.sh +159 -0
- package/scripts/install-guard-all-repos.sh +85 -0
- package/scripts/install-kj.sh +193 -0
- package/scripts/install.js +901 -0
- package/scripts/install.sh +7 -0
- package/scripts/postinstall.js +117 -0
- package/scripts/protect-all-repos.sh +88 -0
- package/scripts/quickstart-gate.mjs +97 -0
- package/scripts/regen-arch-stats.sh +71 -0
- package/scripts/setup-multi-instance.sh +150 -0
- package/scripts/verify-pack.mjs +278 -0
- package/src/activity-log.js +59 -0
- package/src/agents/agy-agent.js +62 -0
- package/src/agents/aider-agent.js +78 -0
- package/src/agents/availability.js +52 -0
- package/src/agents/base-agent.js +134 -0
- package/src/agents/claude-agent.js +413 -0
- package/src/agents/codex-agent.js +112 -0
- package/src/agents/copilot-agent.js +65 -0
- package/src/agents/gemini-agent.js +85 -0
- package/src/agents/host-agent.js +38 -0
- package/src/agents/index.js +59 -0
- package/src/agents/kimi-agent.js +45 -0
- package/src/agents/model-registry.js +137 -0
- package/src/agents/opencode-agent.js +72 -0
- package/src/agents/qwen-agent.js +20 -0
- package/src/agents/resolve-bin.js +73 -0
- package/src/audit/agent-readiness.js +259 -0
- package/src/audit/ai-slop-findings.js +102 -0
- package/src/audit/audit-fallback.js +66 -0
- package/src/audit/audit-history-display.js +61 -0
- package/src/audit/audit-history.js +102 -0
- package/src/audit/basal-cost.js +281 -0
- package/src/audit/circular-deps.js +144 -0
- package/src/audit/dead-exports.js +186 -0
- package/src/audit/deterministic-summary.js +327 -0
- package/src/audit/harness-scorecard.js +100 -0
- package/src/audit/harness-section.js +81 -0
- package/src/audit/infra-findings.js +100 -0
- package/src/audit/injection-findings.js +114 -0
- package/src/audit/issue-filter.js +133 -0
- package/src/audit/osv-findings.js +167 -0
- package/src/audit/plan-adherence.js +224 -0
- package/src/audit/semgrep-findings.js +129 -0
- package/src/audit/sonar-findings.js +93 -0
- package/src/audit/webperf-input.js +133 -0
- package/src/autonomy/arbiter-role.js +71 -0
- package/src/autonomy/arbiter.js +22 -0
- package/src/autonomy/decider.js +18 -0
- package/src/autonomy/decision-resolver.js +58 -0
- package/src/autonomy/outcome-report.js +55 -0
- package/src/autonomy/policy.js +41 -0
- package/src/autonomy/stage-ask.js +30 -0
- package/src/bootstrap.js +276 -0
- package/src/brain/agent-error-classifier.js +116 -0
- package/src/brain/decision-tracker.js +125 -0
- package/src/brain/decisor.js +243 -0
- package/src/brain/solomon-consult.js +171 -0
- package/src/brain/standby-scheduler.js +8 -0
- package/src/brain/standby-store.js +12 -0
- package/src/brain/with-brain-recovery.js +235 -0
- package/src/budget/comparison.js +96 -0
- package/src/canvas/parse-md.js +238 -0
- package/src/canvas/schema.js +101 -0
- package/src/canvas/to-flat.js +85 -0
- package/src/canvas/validate.js +163 -0
- package/src/checks/ai-surface.js +79 -0
- package/src/checks/ai-trash.js +34 -0
- package/src/checks/binaries.js +207 -0
- package/src/checks/ci.js +105 -0
- package/src/checks/config-files.js +217 -0
- package/src/checks/dir-setup.js +103 -0
- package/src/checks/guarantee-level.js +38 -0
- package/src/checks/hardware.js +150 -0
- package/src/checks/harness-scorecard.js +41 -0
- package/src/checks/mcp-health.js +169 -0
- package/src/checks/method.js +73 -0
- package/src/checks/native-build.js +67 -0
- package/src/checks/node.js +70 -0
- package/src/checks/ollama.js +41 -0
- package/src/checks/orphans.js +77 -0
- package/src/checks/ports.js +188 -0
- package/src/checks/project-checks.js +245 -0
- package/src/checks/qmd.js +41 -0
- package/src/checks/rag-hooks.js +54 -0
- package/src/checks/release-check.js +102 -0
- package/src/checks/rtk.js +36 -0
- package/src/checks/runner.js +326 -0
- package/src/checks/skills.js +53 -0
- package/src/checks/sonar.js +67 -0
- package/src/checks/squeezr.js +36 -0
- package/src/checks/system.js +53 -0
- package/src/checks/tokens.js +172 -0
- package/src/checks/types.js +103 -0
- package/src/ci/dispatch.js +99 -0
- package/src/ci/index.js +3 -0
- package/src/ci/pr-diff.js +26 -0
- package/src/ci/repo.js +45 -0
- package/src/cli/_shared.js +30 -0
- package/src/cli/advanced-commands.js +61 -0
- package/src/cli/register-meta.js +772 -0
- package/src/cli/register-pipeline.js +335 -0
- package/src/cli/register-plan.js +224 -0
- package/src/cli/register-roles-skills.js +54 -0
- package/src/cli/register-sonar.js +28 -0
- package/src/cli/register-standby.js +26 -0
- package/src/cli.js +155 -0
- package/src/commands/advanced.js +31 -0
- package/src/commands/agent-run.js +63 -0
- package/src/commands/agents.js +105 -0
- package/src/commands/architect.js +123 -0
- package/src/commands/audit.js +430 -0
- package/src/commands/autorun.js +49 -0
- package/src/commands/board.js +458 -0
- package/src/commands/check.js +40 -0
- package/src/commands/clean.js +145 -0
- package/src/commands/code.js +45 -0
- package/src/commands/config.js +74 -0
- package/src/commands/discover.js +105 -0
- package/src/commands/doctor.js +251 -0
- package/src/commands/env.js +207 -0
- package/src/commands/harden.js +203 -0
- package/src/commands/hu.js +210 -0
- package/src/commands/identity.js +60 -0
- package/src/commands/init.js +950 -0
- package/src/commands/install-tools.js +432 -0
- package/src/commands/mutate.js +94 -0
- package/src/commands/ollama.js +44 -0
- package/src/commands/onboard.js +45 -0
- package/src/commands/plan/_shared.js +55 -0
- package/src/commands/plan/add-hu.js +23 -0
- package/src/commands/plan/delete.js +9 -0
- package/src/commands/plan/fix.js +99 -0
- package/src/commands/plan/generate.js +532 -0
- package/src/commands/plan/index.js +13 -0
- package/src/commands/plan/list.js +21 -0
- package/src/commands/plan/migrate-result.js +41 -0
- package/src/commands/plan/ready.js +46 -0
- package/src/commands/plan/remove-hu.js +17 -0
- package/src/commands/plan/share.js +85 -0
- package/src/commands/plan/show.js +81 -0
- package/src/commands/plan/unshare.js +41 -0
- package/src/commands/plan/validate.js +20 -0
- package/src/commands/plan.js +17 -0
- package/src/commands/policy.js +164 -0
- package/src/commands/privacy.js +45 -0
- package/src/commands/qmd.js +86 -0
- package/src/commands/rag-mcp.js +18 -0
- package/src/commands/rag.js +173 -0
- package/src/commands/report-issue.js +77 -0
- package/src/commands/report.js +469 -0
- package/src/commands/researcher.js +54 -0
- package/src/commands/resume.js +68 -0
- package/src/commands/review-gate.js +355 -0
- package/src/commands/review.js +89 -0
- package/src/commands/roles.js +116 -0
- package/src/commands/run.js +185 -0
- package/src/commands/scan.js +18 -0
- package/src/commands/skills.js +86 -0
- package/src/commands/sonar.js +53 -0
- package/src/commands/standby.js +117 -0
- package/src/commands/start.js +121 -0
- package/src/commands/status.js +36 -0
- package/src/commands/sync.js +103 -0
- package/src/commands/telemetry.js +70 -0
- package/src/commands/tournament.js +85 -0
- package/src/commands/triage.js +78 -0
- package/src/commands/undo.js +62 -0
- package/src/commands/watch.js +46 -0
- package/src/commands/webperf.js +162 -0
- package/src/commands/worktree.js +76 -0
- package/src/config/defaults.js +270 -0
- package/src/config/loader.js +204 -0
- package/src/config/overrides.js +220 -0
- package/src/config/role-resolver.js +171 -0
- package/src/config/schema.js +299 -0
- package/src/config/test-harness.js +78 -0
- package/src/config.js +34 -0
- package/src/domains/domain-loader.js +245 -0
- package/src/domains/domain-registry.js +140 -0
- package/src/domains/domain-synthesizer.js +129 -0
- package/src/environment/adr.js +45 -0
- package/src/environment/board-access.js +97 -0
- package/src/environment/board-select.js +59 -0
- package/src/environment/briefs.js +129 -0
- package/src/environment/issue-report.js +72 -0
- package/src/environment/mcp-wiring.js +44 -0
- package/src/environment/playbook.js +127 -0
- package/src/git/automation.js +334 -0
- package/src/git/hu-automation.js +171 -0
- package/src/git/hu-snapshot.js +10 -0
- package/src/golden/asserter.js +92 -0
- package/src/golden/loader.js +52 -0
- package/src/golden/runner.js +92 -0
- package/src/golden/schema.js +41 -0
- package/src/guards/intent-guard.js +161 -0
- package/src/guards/output-guard.js +149 -0
- package/src/guards/perf-guard.js +126 -0
- package/src/guards/policy-guard.js +90 -0
- package/src/guards/policy-resolver.js +85 -0
- package/src/guards/secret-redactor.js +71 -0
- package/src/harden/advisory.js +203 -0
- package/src/harden/alternatives.js +50 -0
- package/src/harden/check.js +81 -0
- package/src/harden/config-engine.js +128 -0
- package/src/harden/config-templates.js +122 -0
- package/src/harden/guidelines-engine.js +48 -0
- package/src/harden/guidelines-templates.js +36 -0
- package/src/harden/harden-engine.js +80 -0
- package/src/harden/harness-hooks.js +107 -0
- package/src/harden/hook-commands.js +25 -0
- package/src/harden/hook-templates.js +183 -0
- package/src/harden/interactive.js +76 -0
- package/src/harden/sentinel-hooks.js +721 -0
- package/src/harden/stack-roots.js +105 -0
- package/src/harden/test-on-push.js +38 -0
- package/src/harden/workflow-engine.js +116 -0
- package/src/harden/workflow-templates.js +285 -0
- package/src/hu/acceptance-runner.js +138 -0
- package/src/hu/auto-generator.js +358 -0
- package/src/hu/graph.js +71 -0
- package/src/hu/lazy-planner.js +109 -0
- package/src/hu/model-router.js +108 -0
- package/src/hu/parallel-executor.js +94 -0
- package/src/hu/split-validator.js +143 -0
- package/src/hu/splitting-detector.js +158 -0
- package/src/hu/splitting-generator.js +175 -0
- package/src/hu/store.js +392 -0
- package/src/hu/worktree-bootstrap.js +59 -0
- package/src/identity/bootstrap.js +48 -0
- package/src/identity/compare.js +38 -0
- package/src/identity/detect.js +51 -0
- package/src/identity/store.js +66 -0
- package/src/infrastructure/command-runner.js +44 -0
- package/src/infrastructure/environment.js +38 -0
- package/src/infrastructure/file-system-service.js +63 -0
- package/src/infrastructure/mocks.js +182 -0
- package/src/lang/chunk-go.js +94 -0
- package/src/lang/chunk-java.js +90 -0
- package/src/lang/chunk-python.js +88 -0
- package/src/lang/chunk-rust.js +102 -0
- package/src/lang/go.js +14 -0
- package/src/lang/java.js +16 -0
- package/src/lang/js.js +8 -0
- package/src/lang/python.js +14 -0
- package/src/lang/registry.js +79 -0
- package/src/lang/rust.js +14 -0
- package/src/lang/tree-sitter-loader.js +45 -0
- package/src/mcp/direct-role-runner.js +112 -0
- package/src/mcp/error-classifiers.js +66 -0
- package/src/mcp/handlers/direct-handlers.js +486 -0
- package/src/mcp/handlers/hu-handlers.js +93 -0
- package/src/mcp/handlers/management-handlers.js +265 -0
- package/src/mcp/handlers/rag-handler.js +52 -0
- package/src/mcp/handlers/run-handler.js +313 -0
- package/src/mcp/orphan-guard.js +131 -0
- package/src/mcp/preflight.js +47 -0
- package/src/mcp/progress.js +149 -0
- package/src/mcp/response-compressor.js +81 -0
- package/src/mcp/run-kj.js +135 -0
- package/src/mcp/server-handlers.js +79 -0
- package/src/mcp/server.js +66 -0
- package/src/mcp/shared-helpers.js +297 -0
- package/src/mcp/sovereignty-guard.js +112 -0
- package/src/mcp/suggest-handler.js +92 -0
- package/src/mcp/tool-arg-normalizers.js +16 -0
- package/src/mcp/tools.js +432 -0
- package/src/mutate/diff-scope.js +105 -0
- package/src/mutate/reviewer-signal.js +76 -0
- package/src/mutate/runner.js +72 -0
- package/src/mutate/tool-registry.js +90 -0
- package/src/onboarder/cache.js +24 -0
- package/src/onboarder/collectors/framework-multilang.js +64 -0
- package/src/onboarder/collectors/index.js +136 -0
- package/src/orchestrator/agent-fallback.js +81 -0
- package/src/orchestrator/brain-coordinator.js +186 -0
- package/src/orchestrator/ci-integration.js +139 -0
- package/src/orchestrator/config-init.js +510 -0
- package/src/orchestrator/direct-actions.js +217 -0
- package/src/orchestrator/drivers/error-recovery.js +287 -0
- package/src/orchestrator/drivers/init-context.js +227 -0
- package/src/orchestrator/drivers/iteration-loop.js +380 -0
- package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +69 -0
- package/src/orchestrator/drivers/iteration-phases/guards.js +84 -0
- package/src/orchestrator/drivers/iteration-phases/handle-approved.js +29 -0
- package/src/orchestrator/drivers/iteration-phases/quality-gates.js +114 -0
- package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +60 -0
- package/src/orchestrator/drivers/post-loop.js +383 -0
- package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +136 -0
- package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +47 -0
- package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +84 -0
- package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +391 -0
- package/src/orchestrator/drivers/pre-loop.js +507 -0
- package/src/orchestrator/drivers/run-hu-batch.js +427 -0
- package/src/orchestrator/feedback-enrichment.js +140 -0
- package/src/orchestrator/feedback-queue.js +151 -0
- package/src/orchestrator/flow-control.js +170 -0
- package/src/orchestrator/flow-runner.js +364 -0
- package/src/orchestrator/fs-leak-detector.js +210 -0
- package/src/orchestrator/hu-scheduler.js +114 -0
- package/src/orchestrator/hu-sub-pipeline.js +616 -0
- package/src/orchestrator/integrations.js +81 -0
- package/src/orchestrator/iteration-gate.js +73 -0
- package/src/orchestrator/iteration-stages.js +9 -0
- package/src/orchestrator/parallel-limiter.js +74 -0
- package/src/orchestrator/pipeline-context.js +72 -0
- package/src/orchestrator/post-loop-stages.js +468 -0
- package/src/orchestrator/pre-loop-stages.js +11 -0
- package/src/orchestrator/preflight-checks.js +462 -0
- package/src/orchestrator/repair/repair-detector.js +117 -0
- package/src/orchestrator/repair/repair-runner.js +142 -0
- package/src/orchestrator/reviewer-fallback.js +45 -0
- package/src/orchestrator/role-output-compressor.js +189 -0
- package/src/orchestrator/session-journal.js +308 -0
- package/src/orchestrator/solomon-escalation.js +305 -0
- package/src/orchestrator/solomon-rules.js +212 -0
- package/src/orchestrator/stages/architect-stage.js +172 -0
- package/src/orchestrator/stages/coder-stage.js +480 -0
- package/src/orchestrator/stages/domain-curator-stage.js +82 -0
- package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +127 -0
- package/src/orchestrator/stages/hu-reviewer-stage.js +394 -0
- package/src/orchestrator/stages/perf-stage.js +140 -0
- package/src/orchestrator/stages/planner-stage.js +85 -0
- package/src/orchestrator/stages/rag-context-stage.js +77 -0
- package/src/orchestrator/stages/rag-preload-decisor.js +58 -0
- package/src/orchestrator/stages/research-stage.js +69 -0
- package/src/orchestrator/stages/reviewer-stage.js +422 -0
- package/src/orchestrator/stages/sonar-stage.js +421 -0
- package/src/orchestrator/stages/stage-classes.js +84 -0
- package/src/orchestrator/stages/stage-executor.js +155 -0
- package/src/orchestrator/stages/tdd-discipline-stage.js +56 -0
- package/src/orchestrator/stages/tool-judge-stage.js +53 -0
- package/src/orchestrator/stages/triage-stage.js +172 -0
- package/src/orchestrator/standby.js +71 -0
- package/src/orchestrator/verification-gate.js +183 -0
- package/src/orchestrator.js +22 -0
- package/src/plan/adr-generator.js +170 -0
- package/src/plan/adr-loader.js +60 -0
- package/src/plan/plan-executor.js +100 -0
- package/src/plan/plan-fixer.js +192 -0
- package/src/plan/plan-hu-ops.js +16 -0
- package/src/plan/plan-id.js +4 -0
- package/src/plan/plan-migrate-result.js +24 -0
- package/src/plan/plan-reviewer.js +236 -0
- package/src/plan/plan-schema.js +334 -0
- package/src/plan/plan-store.js +260 -0
- package/src/plan/plan-structural-pass.js +122 -0
- package/src/plan/plan-validation.js +4 -0
- package/src/plan/preflight-hu.js +105 -0
- package/src/plan/spec-detector.js +61 -0
- package/src/plan/tests-synthesizer.js +131 -0
- package/src/planning-game/adapter.js +108 -0
- package/src/planning-game/architect-adrs.js +45 -0
- package/src/planning-game/client.js +108 -0
- package/src/planning-game/decomposition.js +87 -0
- package/src/planning-game/pipeline-adapter.js +251 -0
- package/src/plugins/loader.js +67 -0
- package/src/policy/add.js +111 -0
- package/src/policy/decisions.js +42 -0
- package/src/policy/engine.js +82 -0
- package/src/policy/exceptions.js +60 -0
- package/src/privacy/onboarding.js +35 -0
- package/src/privacy/scan.js +120 -0
- package/src/prompts/arbiter.js +38 -0
- package/src/prompts/architect.js +103 -0
- package/src/prompts/audit.js +474 -0
- package/src/prompts/coder.js +287 -0
- package/src/prompts/diff-clip.js +27 -0
- package/src/prompts/discover.js +222 -0
- package/src/prompts/hu-reviewer.js +219 -0
- package/src/prompts/planner.js +312 -0
- package/src/prompts/prompt-layout.js +80 -0
- package/src/prompts/prompt-resolver.js +120 -0
- package/src/prompts/reviewer.js +75 -0
- package/src/prompts/rtk-snippet.js +25 -0
- package/src/prompts/spec-reviewer.js +66 -0
- package/src/prompts/split-signal.js +82 -0
- package/src/prompts/start-decision.js +52 -0
- package/src/prompts/tool-correctness-judge.js +31 -0
- package/src/prompts/triage.js +57 -0
- package/src/rag/auto-update.js +72 -0
- package/src/rag/chunker-ast.js +56 -0
- package/src/rag/chunker.js +132 -0
- package/src/rag/embedder.js +2 -0
- package/src/rag/embedders/_cloud-base.js +2 -0
- package/src/rag/embedders/cohere.js +2 -0
- package/src/rag/embedders/factory.js +2 -0
- package/src/rag/embedders/mistral.js +2 -0
- package/src/rag/embedders/onnx.js +2 -0
- package/src/rag/embedders/openai.js +2 -0
- package/src/rag/embedders/voyage.js +2 -0
- package/src/rag/eval.js +61 -0
- package/src/rag/governed-embedder.js +39 -0
- package/src/rag/indexer.js +199 -0
- package/src/rag/library.js +62 -0
- package/src/rag/ollama-capability.js +59 -0
- package/src/rag/ollama-manager.js +98 -0
- package/src/rag/onnx-fallback.js +69 -0
- package/src/rag/rerank.js +4 -0
- package/src/rag/retriever.js +2 -0
- package/src/rag/vec-store.js +17 -0
- package/src/rag/watcher.js +62 -0
- package/src/rag/where-parser.js +4 -0
- package/src/repeat-detector.js +88 -0
- package/src/review/card-first.js +99 -0
- package/src/review/card-verify.js +83 -0
- package/src/review/diff-generator.js +112 -0
- package/src/review/gate-gitignore.js +77 -0
- package/src/review/git-stash-helper.js +104 -0
- package/src/review/mutation-pregate.js +48 -0
- package/src/review/one-shot-review.js +122 -0
- package/src/review/parser.js +80 -0
- package/src/review/policy-gate.js +26 -0
- package/src/review/profiles.js +66 -0
- package/src/review/reviewer-fallback.js +125 -0
- package/src/review/schema.js +31 -0
- package/src/review/scope-filter.js +152 -0
- package/src/review/snapshot-diff.js +122 -0
- package/src/review/solomon-arbitration.js +113 -0
- package/src/review/sonar-pregate.js +63 -0
- package/src/review/tdd-discipline.js +90 -0
- package/src/review/tdd-policy.js +69 -0
- package/src/review/tests-with-code.js +33 -0
- package/src/review/verdict-store.js +87 -0
- package/src/review/workspace.js +21 -0
- package/src/roles/agent-role.js +194 -0
- package/src/roles/architect-role.js +77 -0
- package/src/roles/audit-role.js +258 -0
- package/src/roles/base-role.js +165 -0
- package/src/roles/coder-role.js +107 -0
- package/src/roles/commiter-role.js +110 -0
- package/src/roles/discover-role.js +81 -0
- package/src/roles/domain-curator-role.js +141 -0
- package/src/roles/hu-reviewer-role.js +64 -0
- package/src/roles/impeccable-role.js +85 -0
- package/src/roles/index.js +18 -0
- package/src/roles/karajan-brain-role.js +134 -0
- package/src/roles/onboarder-role.js +61 -0
- package/src/roles/perf-role.js +122 -0
- package/src/roles/planner-role.js +151 -0
- package/src/roles/refactorer-role.js +30 -0
- package/src/roles/repairer-role.js +181 -0
- package/src/roles/researcher-role.js +70 -0
- package/src/roles/reviewer-role.js +104 -0
- package/src/roles/security-role.js +73 -0
- package/src/roles/solomon-role.js +265 -0
- package/src/roles/sonar-role.js +70 -0
- package/src/roles/spec-reviewer-role.js +106 -0
- package/src/roles/tester-role.js +235 -0
- package/src/roles/tool-correctness-judge-role.js +78 -0
- package/src/roles/triage-role.js +99 -0
- package/src/session/journal/decisions-writer.js +200 -0
- package/src/session/journal/iteration-logger.js +194 -0
- package/src/session/journal/summary-writer.js +320 -0
- package/src/session/journal/tree-writer.js +164 -0
- package/src/session/journal/write-all.js +89 -0
- package/src/session/mutators.js +339 -0
- package/src/session/runtime-overrides.js +59 -0
- package/src/session/store.js +106 -0
- package/src/session-cleanup.js +116 -0
- package/src/skills/addyosmani-catalog.js +315 -0
- package/src/skills/addyosmani-role-map.js +139 -0
- package/src/skills/openskills-client.js +157 -0
- package/src/skills/semantic-detector.js +167 -0
- package/src/skills/skill-detector.js +385 -0
- package/src/skills/skill-loader.js +219 -0
- package/src/skills/skills-cache.js +128 -0
- package/src/sonar/api.js +128 -0
- package/src/sonar/cloud-scanner.js +78 -0
- package/src/sonar/config-resolver.js +88 -0
- package/src/sonar/credentials.js +60 -0
- package/src/sonar/discovery.js +124 -0
- package/src/sonar/enforcer.js +19 -0
- package/src/sonar/issue-filter.js +12 -0
- package/src/sonar/manager.js +181 -0
- package/src/sonar/project-key.js +120 -0
- package/src/sonar/scanner.js +307 -0
- package/src/sonar/token-bootstrap.js +205 -0
- package/src/sonar/token-recovery.js +67 -0
- package/src/spec-review/refine-loop.js +58 -0
- package/src/spec-review/run-spec-review.js +119 -0
- package/src/start/assessment.js +74 -0
- package/src/start/maturity.js +73 -0
- package/src/start/start-decider-role.js +79 -0
- package/src/start/sweep.js +157 -0
- package/src/sync/apply-canvas-patch.js +55 -0
- package/src/sync/detect-drift.js +113 -0
- package/src/tournament/crown.js +88 -0
- package/src/tournament/judge.js +150 -0
- package/src/tournament/run.js +142 -0
- package/src/tournament/scoreboard.js +124 -0
- package/src/tracker-bootstrap.js +44 -0
- package/src/types/agent.js +55 -0
- package/src/types/config.js +114 -0
- package/src/types/hu.js +47 -0
- package/src/types/index.js +38 -0
- package/src/types/policy.js +43 -0
- package/src/types/session.js +75 -0
- package/src/types/solomon.js +87 -0
- package/src/types/stage.js +68 -0
- package/src/utils/agent-detect.js +93 -0
- package/src/utils/ai-trash.js +48 -0
- package/src/utils/async-lock.js +31 -0
- package/src/utils/atomic-write.js +6 -0
- package/src/utils/banner.js +66 -0
- package/src/utils/binary-sources.js +70 -0
- package/src/utils/board-prompt-bridge.js +108 -0
- package/src/utils/budget.js +229 -0
- package/src/utils/cli-ask-question.js +93 -0
- package/src/utils/cli-progress.js +220 -0
- package/src/utils/cli-run-log.js +83 -0
- package/src/utils/cwd-confirm.js +39 -0
- package/src/utils/derive-project-name-from-cwd.js +119 -0
- package/src/utils/display/event-handlers.js +403 -0
- package/src/utils/display/formatters.js +132 -0
- package/src/utils/display/header.js +47 -0
- package/src/utils/display/resume-hint.js +41 -0
- package/src/utils/display/session-summary.js +118 -0
- package/src/utils/display/solomon.js +42 -0
- package/src/utils/display/spec-findings.js +44 -0
- package/src/utils/doc-links.js +29 -0
- package/src/utils/docker-install.js +34 -0
- package/src/utils/escape-regexp.js +15 -0
- package/src/utils/events.js +35 -0
- package/src/utils/fs.js +19 -0
- package/src/utils/garbage-collector.js +481 -0
- package/src/utils/git.js +279 -0
- package/src/utils/home-migration.js +87 -0
- package/src/utils/injection-guard.js +186 -0
- package/src/utils/install-hints.js +180 -0
- package/src/utils/json-extract.js +64 -0
- package/src/utils/locale.js +59 -0
- package/src/utils/logger.js +96 -0
- package/src/utils/managed-markers.js +93 -0
- package/src/utils/manifest-sniff.js +82 -0
- package/src/utils/messages.js +61 -0
- package/src/utils/model-selector.js +107 -0
- package/src/utils/os-detect.js +79 -0
- package/src/utils/paths.js +13 -0
- package/src/utils/pending-user-action.js +95 -0
- package/src/utils/port-check.js +6 -0
- package/src/utils/port-occupant.js +96 -0
- package/src/utils/pricing.js +29 -0
- package/src/utils/process.js +4 -0
- package/src/utils/project-detect.js +160 -0
- package/src/utils/prompt-project-name.js +35 -0
- package/src/utils/provider-env.js +116 -0
- package/src/utils/qmd-collection.js +72 -0
- package/src/utils/qmd-detect.js +18 -0
- package/src/utils/qmd-install.js +37 -0
- package/src/utils/quota-simulator.js +56 -0
- package/src/utils/rate-limit-detector.js +181 -0
- package/src/utils/repo-cleaner.js +79 -0
- package/src/utils/retry.js +88 -0
- package/src/utils/role-assigner.js +137 -0
- package/src/utils/role-env.js +58 -0
- package/src/utils/rtk-detect.js +18 -0
- package/src/utils/rtk-install.js +38 -0
- package/src/utils/rtk-wrapper.js +87 -0
- package/src/utils/run-context.js +75 -0
- package/src/utils/run-log.js +217 -0
- package/src/utils/run-registry.js +9 -0
- package/src/utils/shared-paths.js +12 -0
- package/src/utils/squeezr-detect.js +21 -0
- package/src/utils/squeezr-install.js +37 -0
- package/src/utils/stack-detect.js +135 -0
- package/src/utils/stall-detector.js +159 -0
- package/src/utils/status-dashboard.js +254 -0
- package/src/utils/task-file.js +109 -0
- package/src/utils/telemetry.js +124 -0
- package/src/utils/templates-root.js +61 -0
- package/src/utils/tool-call-extractor.js +56 -0
- package/src/utils/tool-governor.js +116 -0
- package/src/utils/tool-installer.js +93 -0
- package/src/utils/update-check.js +280 -0
- package/src/utils/vector-store-orphans.js +89 -0
- package/src/utils/welcome.js +47 -0
- package/src/utils/with-timeout.js +42 -0
- package/src/utils/wizard.js +47 -0
- package/src/webperf/cwv-gate.js +94 -0
- package/src/webperf/devtools-detect.js +112 -0
- package/src/webperf/scanner.js +209 -0
- package/src/webperf/webperf-role-integration.js +66 -0
- package/templates/coder-rules.md +45 -0
- package/templates/docker-compose.sonar.yml +60 -0
- package/templates/domains/example-dental.md +57 -0
- package/templates/kj.config.yml +128 -0
- package/templates/review-rules.md +17 -0
- package/templates/roles/architect/anthropic.md +74 -0
- package/templates/roles/architect/default.md +72 -0
- package/templates/roles/architect/google.md +61 -0
- package/templates/roles/architect/openai.md +60 -0
- package/templates/roles/architect/opencode.md +59 -0
- package/templates/roles/architect.md +76 -0
- package/templates/roles/audit.md +68 -0
- package/templates/roles/coder/anthropic.md +81 -0
- package/templates/roles/coder/default.md +78 -0
- package/templates/roles/coder/google.md +87 -0
- package/templates/roles/coder/openai.md +68 -0
- package/templates/roles/coder/opencode.md +58 -0
- package/templates/roles/coder.md +152 -0
- package/templates/roles/commiter.md +44 -0
- package/templates/roles/discover.md +167 -0
- package/templates/roles/domain-curator.md +52 -0
- package/templates/roles/hu-reviewer.md +236 -0
- package/templates/roles/impeccable-design.md +87 -0
- package/templates/roles/impeccable.md +125 -0
- package/templates/roles/karajan-brain.md +95 -0
- package/templates/roles/onboarder.md +45 -0
- package/templates/roles/planner/anthropic.md +59 -0
- package/templates/roles/planner/default.md +57 -0
- package/templates/roles/planner/google.md +75 -0
- package/templates/roles/planner/openai.md +55 -0
- package/templates/roles/planner/opencode.md +62 -0
- package/templates/roles/planner.md +61 -0
- package/templates/roles/refactorer.md +48 -0
- package/templates/roles/repairer.md +103 -0
- package/templates/roles/researcher.md +41 -0
- package/templates/roles/reviewer/anthropic.md +61 -0
- package/templates/roles/reviewer/default.md +62 -0
- package/templates/roles/reviewer/google.md +63 -0
- package/templates/roles/reviewer/openai.md +57 -0
- package/templates/roles/reviewer/opencode.md +42 -0
- package/templates/roles/reviewer-paranoid.md +38 -0
- package/templates/roles/reviewer-relaxed.md +34 -0
- package/templates/roles/reviewer-strict.md +37 -0
- package/templates/roles/reviewer.md +62 -0
- package/templates/roles/security.md +54 -0
- package/templates/roles/solomon/anthropic.md +71 -0
- package/templates/roles/solomon/default.md +83 -0
- package/templates/roles/solomon/google.md +61 -0
- package/templates/roles/solomon/openai.md +53 -0
- package/templates/roles/solomon/opencode.md +55 -0
- package/templates/roles/solomon.md +83 -0
- package/templates/roles/sonar.md +49 -0
- package/templates/roles/spec-reviewer.md +47 -0
- package/templates/roles/tester.md +50 -0
- package/templates/roles/triage.md +69 -0
- package/templates/skills/kj-architect.md +45 -0
- package/templates/skills/kj-audit.md +63 -0
- package/templates/skills/kj-board.md +16 -0
- package/templates/skills/kj-code.md +51 -0
- package/templates/skills/kj-csv-transform.md +40 -0
- package/templates/skills/kj-data-report.md +44 -0
- package/templates/skills/kj-discover.md +24 -0
- package/templates/skills/kj-rag-query.md +50 -0
- package/templates/skills/kj-review.md +47 -0
- package/templates/skills/kj-run.md +73 -0
- package/templates/skills/kj-security.md +49 -0
- package/templates/skills/kj-sonar.md +41 -0
- package/templates/skills/kj-sql-analysis.md +40 -0
- package/templates/skills/kj-test.md +40 -0
- package/templates/workflows/automerge.yml +30 -0
- package/templates/workflows/houston-override.yml +46 -0
- package/templates/workflows/kj-ci-gateway.yml +58 -0
- package/vendor/tree-sitter-grammars/README.md +21 -0
- package/vendor/tree-sitter-grammars/go.wasm +0 -0
- package/vendor/tree-sitter-grammars/java.wasm +0 -0
- package/vendor/tree-sitter-grammars/python.wasm +0 -0
- package/vendor/tree-sitter-grammars/rust.wasm +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kj worktree start|list|done` (KJC-TSK-0679) — isolated lanes for the
|
|
3
|
+
* host agent. Field case: the playbook said "one worktree per task" and an
|
|
4
|
+
* agent NARRATED the isolation while editing the project root. Ordering a
|
|
5
|
+
* command beats ordering a practice: start = worktree + feat/ branch +
|
|
6
|
+
* dependency bootstrap + the exact cd printed; done = remove after merge.
|
|
7
|
+
* Same lane dir (.kj/worktrees) and bootstrap the headless pipeline uses.
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { execFile } from "node:child_process";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
import { bootstrapWorktree } from "../hu/worktree-bootstrap.js";
|
|
14
|
+
|
|
15
|
+
const execFileAsync = promisify(execFile);
|
|
16
|
+
const WORKTREE_DIR = ".kj/worktrees"; // shared with the headless lanes
|
|
17
|
+
|
|
18
|
+
const SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
19
|
+
|
|
20
|
+
export async function worktreeCommand({ config = null, action, args = [], flags = {} }) {
|
|
21
|
+
const projectDir = config?.projectDir || process.cwd();
|
|
22
|
+
const git = (gitArgs, cwd = projectDir) => execFileAsync("git", gitArgs, { cwd });
|
|
23
|
+
const lanePath = (slug) => path.join(projectDir, WORKTREE_DIR, slug);
|
|
24
|
+
|
|
25
|
+
if (action === "start") {
|
|
26
|
+
const slug = String(args[0] || "").trim();
|
|
27
|
+
if (!SLUG_RE.test(slug)) {
|
|
28
|
+
throw new Error("invalid slug — use letters, digits, dots, dashes (no slashes): kj worktree start <slug>");
|
|
29
|
+
}
|
|
30
|
+
const wtPath = lanePath(slug);
|
|
31
|
+
if (fs.existsSync(wtPath)) {
|
|
32
|
+
throw new Error(`lane "${slug}" already exists — cd ${wtPath}, or finish it with: kj worktree done ${slug}`);
|
|
33
|
+
}
|
|
34
|
+
const branch = `feat/${slug}`;
|
|
35
|
+
await git(["worktree", "add", "-b", branch, wtPath]);
|
|
36
|
+
const boot = await bootstrapWorktree({ worktreePath: wtPath, setupCommand: config?.session?.worktree_setup || null });
|
|
37
|
+
console.log(`✓ lane ready: ${branch}`);
|
|
38
|
+
console.log(` cd ${wtPath}`);
|
|
39
|
+
console.log(" The gates travel with the repo — kj review --staged works there. When merged: kj worktree done " + slug);
|
|
40
|
+
return { path: wtPath, branch, bootstrap: boot };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (action === "list") {
|
|
44
|
+
const laneRoot = path.join(projectDir, WORKTREE_DIR) + path.sep;
|
|
45
|
+
const { stdout } = await git(["worktree", "list", "--porcelain"]);
|
|
46
|
+
const rows = [];
|
|
47
|
+
let current = null;
|
|
48
|
+
for (const line of stdout.split("\n")) {
|
|
49
|
+
if (line.startsWith("worktree ")) current = { path: line.slice(9).trim() };
|
|
50
|
+
else if (line.startsWith("branch ") && current) {
|
|
51
|
+
current.branch = line.slice(7).trim().replace("refs/heads/", "");
|
|
52
|
+
if (current.path.startsWith(laneRoot)) {
|
|
53
|
+
rows.push({ slug: path.basename(current.path), branch: current.branch, path: current.path });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (rows.length === 0) console.log("no lanes — create one with: kj worktree start <slug>");
|
|
58
|
+
for (const r of rows) console.log(`${r.slug.padEnd(24)} ${r.branch.padEnd(30)} ${r.path}`);
|
|
59
|
+
return rows;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (action === "done") {
|
|
63
|
+
const slug = String(args[0] || "").trim();
|
|
64
|
+
const wtPath = lanePath(slug);
|
|
65
|
+
if (!fs.existsSync(wtPath)) throw new Error(`lane "${slug}" not found — see kj worktree list`);
|
|
66
|
+
const { stdout: dirty } = await git(["status", "--porcelain"], wtPath);
|
|
67
|
+
if (dirty.trim() && !flags.force) {
|
|
68
|
+
throw new Error(`lane "${slug}" has uncommitted changes — commit them (through the gate) or discard with --force`);
|
|
69
|
+
}
|
|
70
|
+
await git(["worktree", "remove", ...(flags.force ? ["--force"] : []), wtPath]);
|
|
71
|
+
console.log(`✓ lane "${slug}" removed — its branch survives; delete it after merge if you want`);
|
|
72
|
+
return { removed: true, slug };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
throw new Error(`unknown action "${action}" — use: start | list | done`);
|
|
76
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Karajan's default configuration — the baseline every user's config is
|
|
3
|
+
* merged on top of.
|
|
4
|
+
*
|
|
5
|
+
* This is **pure data**. It was extracted from `src/config.js` in TSK-0332
|
|
6
|
+
* (Oleada 2 of the v2.7.4 audit refactor) so that consumers that only
|
|
7
|
+
* need the shape (schema tests, display, docs) don't drag the loader's
|
|
8
|
+
* fs/yaml imports.
|
|
9
|
+
*
|
|
10
|
+
* Source of truth is here; `src/config.js` re-exports `DEFAULTS` for
|
|
11
|
+
* back-compat.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const DEFAULTS = {
|
|
15
|
+
coder: "claude",
|
|
16
|
+
reviewer: "codex",
|
|
17
|
+
roles: {
|
|
18
|
+
planner: { provider: null, model: null },
|
|
19
|
+
coder: { provider: null, model: null },
|
|
20
|
+
reviewer: { provider: null, model: null },
|
|
21
|
+
refactorer: { provider: null, model: null },
|
|
22
|
+
solomon: { provider: null, model: null },
|
|
23
|
+
researcher: { provider: null, model: null },
|
|
24
|
+
tester: { provider: null, model: null },
|
|
25
|
+
security: { provider: null, model: null },
|
|
26
|
+
impeccable: { provider: null, model: null },
|
|
27
|
+
triage: { provider: null, model: null },
|
|
28
|
+
discover: { provider: null, model: null },
|
|
29
|
+
architect: { provider: null, model: null },
|
|
30
|
+
hu_reviewer: { provider: null, model: null },
|
|
31
|
+
start: { provider: null, model: "haiku" }
|
|
32
|
+
},
|
|
33
|
+
pipeline: {
|
|
34
|
+
planner: { enabled: false },
|
|
35
|
+
refactorer: { enabled: false },
|
|
36
|
+
solomon: { enabled: true },
|
|
37
|
+
researcher: { enabled: false },
|
|
38
|
+
tester: { enabled: true },
|
|
39
|
+
security: { enabled: true },
|
|
40
|
+
impeccable: { enabled: false },
|
|
41
|
+
perf: { enabled: false },
|
|
42
|
+
triage: { enabled: true },
|
|
43
|
+
discover: { enabled: false },
|
|
44
|
+
architect: { enabled: false },
|
|
45
|
+
hu_reviewer: { enabled: false },
|
|
46
|
+
brain: { enabled: true },
|
|
47
|
+
auto_simplify: true
|
|
48
|
+
},
|
|
49
|
+
brain: {
|
|
50
|
+
enabled: true,
|
|
51
|
+
provider: "claude",
|
|
52
|
+
bypass_solomon_on_correctness: true,
|
|
53
|
+
max_consecutive_verification_failures: 2
|
|
54
|
+
},
|
|
55
|
+
review_mode: "standard",
|
|
56
|
+
max_iterations: 5,
|
|
57
|
+
hu_max_iterations: 3,
|
|
58
|
+
// Hard per-run spend ceiling, ON by default (KJC-TSK-0621): a stuck or
|
|
59
|
+
// runaway run must never drain a subscription quota unattended. Explicit
|
|
60
|
+
// null in the user's config opts out (no cap).
|
|
61
|
+
max_budget_usd: 5,
|
|
62
|
+
// ENV-D1 (KJC-TSK-0642): where work items live. The HU Board ships with
|
|
63
|
+
// kj; "planning-game" routes the v4 playbook to the user's PG MCP;
|
|
64
|
+
// "external" (KJC-TSK-0684) points card-first at the project's own board
|
|
65
|
+
// (Linear, Trello, Jira, GitHub Issues…) named in board.name — worked
|
|
66
|
+
// through the host agent's MCP/tools, never mirrored by kj. There is NO
|
|
67
|
+
// "none": Karajan does not run without a board.
|
|
68
|
+
state_backend: "hu-board",
|
|
69
|
+
// verify_cmd (KJC-TSK-0732): user adapter that checks a card ref against
|
|
70
|
+
// the real tracker — prints {exists, live, status} JSON; {ref} substituted.
|
|
71
|
+
board: { name: null, verify_cmd: null },
|
|
72
|
+
// Method gates (KJC-PCS-0068): rules climb from playbook text to
|
|
73
|
+
// deterministic enforcement. card_first: "auto" = block with hu-board
|
|
74
|
+
// (fully verifiable), warn with planning-game/external (presence only);
|
|
75
|
+
// explicit "warn" | "block" override. Release branches are exempt.
|
|
76
|
+
method_gates: {
|
|
77
|
+
card_first: "auto",
|
|
78
|
+
card_first_exempt_branches: ["chore/release-"],
|
|
79
|
+
// MG-B: source changes without a test change — "warn" | "block".
|
|
80
|
+
tests_with_code: "warn",
|
|
81
|
+
// MG-C: informative nudge when the staged diff exceeds this many
|
|
82
|
+
// added lines (0 disables). The project's CI owns any hard budget.
|
|
83
|
+
pr_size_warn: 150
|
|
84
|
+
},
|
|
85
|
+
review_rules: "./.karajan/review-rules.md",
|
|
86
|
+
coder_rules: "./.karajan/coder-rules.md",
|
|
87
|
+
base_branch: "main",
|
|
88
|
+
coder_options: { model: null, auto_approve: true, fallback_coder: null },
|
|
89
|
+
reviewer_options: {
|
|
90
|
+
output_format: "json",
|
|
91
|
+
require_schema: true,
|
|
92
|
+
model: null,
|
|
93
|
+
deterministic: true,
|
|
94
|
+
retries: 1,
|
|
95
|
+
fallback_reviewer: null
|
|
96
|
+
},
|
|
97
|
+
development: {
|
|
98
|
+
methodology: "tdd",
|
|
99
|
+
require_test_changes: true,
|
|
100
|
+
// KJC-TSK-0398: opt-in red-then-green gate. When true, the pipeline
|
|
101
|
+
// stashes source files and re-runs the test suite to confirm the new
|
|
102
|
+
// tests actually fail without the implementation. Off by default to
|
|
103
|
+
// preserve current iteration latency.
|
|
104
|
+
require_red_then_green: false,
|
|
105
|
+
test_file_patterns: ["/tests/", "/__tests__/", ".test.", ".spec."],
|
|
106
|
+
source_file_extensions: [".js", ".jsx", ".ts", ".tsx", ".py", ".go", ".java", ".rb", ".php", ".cs"]
|
|
107
|
+
},
|
|
108
|
+
sonarqube: {
|
|
109
|
+
enabled: true,
|
|
110
|
+
host: "http://localhost:9000",
|
|
111
|
+
external: false,
|
|
112
|
+
container_name: "karajan-sonarqube",
|
|
113
|
+
network: "karajan_sonar_net",
|
|
114
|
+
volumes: {
|
|
115
|
+
data: "karajan_sonar_data",
|
|
116
|
+
logs: "karajan_sonar_logs",
|
|
117
|
+
extensions: "karajan_sonar_extensions"
|
|
118
|
+
},
|
|
119
|
+
timeouts: {
|
|
120
|
+
healthcheck_seconds: 5,
|
|
121
|
+
compose_up_ms: 300000,
|
|
122
|
+
compose_control_ms: 120000,
|
|
123
|
+
logs_ms: 30000,
|
|
124
|
+
scanner_ms: 900000
|
|
125
|
+
},
|
|
126
|
+
token: null,
|
|
127
|
+
project_key: null,
|
|
128
|
+
admin_user: null,
|
|
129
|
+
admin_password: null,
|
|
130
|
+
coverage: {
|
|
131
|
+
enabled: false,
|
|
132
|
+
command: null,
|
|
133
|
+
timeout_ms: 300000,
|
|
134
|
+
block_on_failure: true,
|
|
135
|
+
lcov_report_path: null
|
|
136
|
+
},
|
|
137
|
+
quality_gate: true,
|
|
138
|
+
enforcement_profile: "pragmatic",
|
|
139
|
+
gate_block_on: [
|
|
140
|
+
"new_reliability_rating=E",
|
|
141
|
+
"new_security_rating=E",
|
|
142
|
+
"new_maintainability_rating=E",
|
|
143
|
+
"new_coverage<80",
|
|
144
|
+
"new_duplicated_lines_density>5"
|
|
145
|
+
],
|
|
146
|
+
fail_on: ["BLOCKER", "CRITICAL"],
|
|
147
|
+
ignore_on: ["INFO"],
|
|
148
|
+
max_scan_retries: 3,
|
|
149
|
+
scanner: {
|
|
150
|
+
sources: "src,public,lib",
|
|
151
|
+
exclusions: "**/node_modules/**,**/fake-apps/**,**/scripts/**,**/playground/**,**/dist/**,**/build/**,**/*.min.js",
|
|
152
|
+
test_inclusions: "**/*.test.js,**/*.spec.js,**/tests/**,**/__tests__/**",
|
|
153
|
+
coverage_exclusions: "**/tests/**,**/__tests__/**,**/*.test.js,**/*.spec.js",
|
|
154
|
+
disabled_rules: ["javascript:S1116", "javascript:S3776"]
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
sonarcloud: {
|
|
158
|
+
enabled: false,
|
|
159
|
+
organization: null,
|
|
160
|
+
token: null,
|
|
161
|
+
project_key: null,
|
|
162
|
+
host: "https://sonarcloud.io",
|
|
163
|
+
scanner: {
|
|
164
|
+
sources: "src,public,lib",
|
|
165
|
+
exclusions: "**/node_modules/**,**/dist/**,**/build/**,**/*.min.js",
|
|
166
|
+
test_inclusions: "**/*.test.js,**/*.spec.js,**/tests/**,**/__tests__/**"
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
hu_board: {
|
|
170
|
+
enabled: false,
|
|
171
|
+
port: 4000,
|
|
172
|
+
auto_start: false
|
|
173
|
+
},
|
|
174
|
+
language: "en",
|
|
175
|
+
hu_language: "en",
|
|
176
|
+
policies: {},
|
|
177
|
+
serena: { enabled: false },
|
|
178
|
+
planning_game: { enabled: false, project_id: null, codeveloper: null },
|
|
179
|
+
skills: {
|
|
180
|
+
mode: "auto",
|
|
181
|
+
sources: ["addyosmani", "openskills", "local"],
|
|
182
|
+
addyosmani: {
|
|
183
|
+
enabled: true,
|
|
184
|
+
refreshDays: 7,
|
|
185
|
+
repoUrl: "https://github.com/addyosmani/agent-skills.git"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
ci: { enabled: false, review_event: "kj-review", comment_event: "kj-comment", comment_prefix: true },
|
|
189
|
+
git: { auto_commit: false, auto_push: false, auto_pr: false, auto_rebase: true, branch_prefix: "feat/" },
|
|
190
|
+
output: { report_dir: "./.reviews", log_level: "info", quiet: true },
|
|
191
|
+
budget: {
|
|
192
|
+
warn_threshold_pct: 80,
|
|
193
|
+
currency: "usd",
|
|
194
|
+
exchange_rate_eur: 0.92
|
|
195
|
+
},
|
|
196
|
+
model_selection: {
|
|
197
|
+
enabled: true,
|
|
198
|
+
tiers: {},
|
|
199
|
+
role_overrides: {}
|
|
200
|
+
},
|
|
201
|
+
session: {
|
|
202
|
+
// Opt-in per-iteration supervision (KJC-TSK-0628): pause after each
|
|
203
|
+
// iteration with a report and ask continue / stop / instructions.
|
|
204
|
+
iteration_gate: false,
|
|
205
|
+
// Concurrent HU lanes per plan run (KJC-TSK-0626). 1 = sequential.
|
|
206
|
+
// Raising it multiplies token burn rate — the plan budget scales with it.
|
|
207
|
+
max_parallel_hus: 1,
|
|
208
|
+
// Command run inside each fresh lane worktree before the coder starts
|
|
209
|
+
// (KJC-TSK-0630). null = auto-detect: `npm ci` when package-lock.json
|
|
210
|
+
// exists, nothing otherwise. Submodules are always initialized first.
|
|
211
|
+
worktree_setup: null,
|
|
212
|
+
max_iteration_minutes: 30,
|
|
213
|
+
max_total_minutes: 120,
|
|
214
|
+
max_planner_minutes: 60,
|
|
215
|
+
checkpoint_interval_minutes: 5,
|
|
216
|
+
max_agent_silence_minutes: 20,
|
|
217
|
+
fail_fast_repeats: 2,
|
|
218
|
+
repeat_detection_threshold: 2,
|
|
219
|
+
max_sonar_retries: 3,
|
|
220
|
+
max_reviewer_retries: 3,
|
|
221
|
+
max_tester_retries: 1,
|
|
222
|
+
max_security_retries: 1,
|
|
223
|
+
max_auto_resumes: 2,
|
|
224
|
+
expiry_days: 30
|
|
225
|
+
},
|
|
226
|
+
failFast: {
|
|
227
|
+
repeatThreshold: 2
|
|
228
|
+
},
|
|
229
|
+
webperf: {
|
|
230
|
+
enabled: true,
|
|
231
|
+
devtools_mcp: false,
|
|
232
|
+
thresholds: { lcp: 2500, cls: 0.1, inp: 200 }
|
|
233
|
+
},
|
|
234
|
+
rag: {
|
|
235
|
+
// KJC-TSK-0455 — Auto-refresh the local RAG index. `onRun` runs a
|
|
236
|
+
// delta re-index before every `kj run`; `onCommit` is consulted by
|
|
237
|
+
// `kj rag install-hooks` to decide whether to install the post-merge
|
|
238
|
+
// hook. Both default ON; flip to false to opt out without uninstalling.
|
|
239
|
+
autoUpdate: { onCommit: true, onRun: true },
|
|
240
|
+
// KJC-TSK-0682 — sensitivity of the indexed code. Cloud embedders
|
|
241
|
+
// (openai/voyage/cohere/mistral) require an explicit "public"; the
|
|
242
|
+
// safe default blocks them (local ollama/onnx always allowed).
|
|
243
|
+
sensitivity: "internal"
|
|
244
|
+
},
|
|
245
|
+
// Opt-in. Set by the `kj init` wizard (explicit consent prompt in the OS
|
|
246
|
+
// locale). When the key is absent or false, no events are sent. See
|
|
247
|
+
// src/utils/telemetry.js and the Privacy & Telemetry section of README.md.
|
|
248
|
+
telemetry: false,
|
|
249
|
+
guards: {
|
|
250
|
+
output: {
|
|
251
|
+
enabled: true,
|
|
252
|
+
patterns: [],
|
|
253
|
+
protected_files: [],
|
|
254
|
+
on_violation: "block"
|
|
255
|
+
},
|
|
256
|
+
perf: {
|
|
257
|
+
enabled: true,
|
|
258
|
+
patterns: [],
|
|
259
|
+
block_on_warning: false,
|
|
260
|
+
frontend_extensions: []
|
|
261
|
+
},
|
|
262
|
+
intent: {
|
|
263
|
+
enabled: false,
|
|
264
|
+
patterns: [],
|
|
265
|
+
confidence_threshold: 0.85
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
export { DEFAULTS };
|
|
270
|
+
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config I/O layer — reads and writes Karajan's YAML config files.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `src/config.js` in TSK-0332 (Oleada 2 of the v2.7.4 audit
|
|
5
|
+
* refactor). The public API (`loadConfig`, `writeConfig`, `getConfigPath`,
|
|
6
|
+
* `getProjectConfigPath`, `loadProjectConfig`) stayed exactly the same so
|
|
7
|
+
* the 28+ files that imported from `src/config.js` didn't have to change.
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* - Resolve the global config path under `~/.karajan/kj.config.yml`
|
|
11
|
+
* (respecting `KJ_HOME`).
|
|
12
|
+
* - Resolve the project config path under `<projectDir>/.karajan/kj.config.yml`.
|
|
13
|
+
* - Load + merge global over DEFAULTS, then project over merged.
|
|
14
|
+
* - Validate the merged config via the Valibot schema.
|
|
15
|
+
* - Record deprecation flags (e.g. `sonarqube.enabled` → ignored since v2.7.4)
|
|
16
|
+
* for the orchestrator to surface as warnings at run start.
|
|
17
|
+
*
|
|
18
|
+
* Intentionally NOT here: flag overrides (src/config/overrides.js),
|
|
19
|
+
* role resolution (src/config/role-resolver.js), DEFAULTS (src/config/defaults.js).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import fs from "node:fs/promises";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import yaml from "js-yaml";
|
|
25
|
+
import { ensureDir, exists } from "../utils/fs.js";
|
|
26
|
+
import { getKarajanHome } from "../utils/paths.js";
|
|
27
|
+
import { safeParseConfig, formatConfigIssues } from "./schema.js";
|
|
28
|
+
import { DEFAULTS } from "./defaults.js";
|
|
29
|
+
import { resolveTestHarness } from "./test-harness.js";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Parse a YAML config file with an actionable error message.
|
|
33
|
+
* Plain `yaml.load` throws `YAMLException: bad indentation ...` with NO
|
|
34
|
+
* file path, so a single bad edit bricked the entire CLI (including
|
|
35
|
+
* `kj doctor`, the one command meant to diagnose it). Wrapping every
|
|
36
|
+
* read site in the same prefix means the user always knows which file
|
|
37
|
+
* they need to fix.
|
|
38
|
+
* @param {string} raw - file contents
|
|
39
|
+
* @param {string} filePath - absolute path (for the error message)
|
|
40
|
+
* @returns {object}
|
|
41
|
+
*/
|
|
42
|
+
function parseYamlOrThrow(raw, filePath) {
|
|
43
|
+
try {
|
|
44
|
+
return yaml.load(raw, { json: true }) || {};
|
|
45
|
+
} catch (err) {
|
|
46
|
+
const detail = err?.message || String(err);
|
|
47
|
+
const e = new Error(`Invalid YAML in ${filePath}:\n ${detail}`);
|
|
48
|
+
e.cause = err;
|
|
49
|
+
e.code = "INVALID_YAML";
|
|
50
|
+
e.path = filePath;
|
|
51
|
+
throw e;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function mergeDeep(base, override) {
|
|
56
|
+
const output = { ...base };
|
|
57
|
+
for (const [key, value] of Object.entries(override || {})) {
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
output[key] = value;
|
|
60
|
+
} else if (value && typeof value === "object") {
|
|
61
|
+
output[key] = mergeDeep(base[key] || {}, value);
|
|
62
|
+
} else {
|
|
63
|
+
output[key] = value;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return output;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getConfigPath() {
|
|
70
|
+
return path.join(getKarajanHome(), "kj.config.yml");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function getProjectConfigPath(projectDir = process.cwd()) {
|
|
74
|
+
return path.join(projectDir, ".karajan", "kj.config.yml");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function loadProjectConfig(projectDir = process.cwd()) {
|
|
78
|
+
const projectConfigPath = getProjectConfigPath(projectDir);
|
|
79
|
+
if (!(await exists(projectConfigPath))) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const raw = await fs.readFile(projectConfigPath, "utf8");
|
|
83
|
+
return parseYamlOrThrow(raw, projectConfigPath);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function loadProjectPricingOverrides(projectDir = process.cwd()) {
|
|
87
|
+
const projectConfigPath = path.join(projectDir, ".karajan.yml");
|
|
88
|
+
if (!(await exists(projectConfigPath))) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const raw = await fs.readFile(projectConfigPath, "utf8");
|
|
93
|
+
const parsed = parseYamlOrThrow(raw, projectConfigPath);
|
|
94
|
+
const pricing = parsed?.budget?.pricing;
|
|
95
|
+
if (!pricing || typeof pricing !== "object") {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return pricing;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function loadConfig(projectDir) {
|
|
103
|
+
const configPath = getConfigPath();
|
|
104
|
+
const projectPricing = await loadProjectPricingOverrides(projectDir);
|
|
105
|
+
|
|
106
|
+
// Load global config
|
|
107
|
+
let globalConfig = {};
|
|
108
|
+
const globalExists = await exists(configPath);
|
|
109
|
+
if (globalExists) {
|
|
110
|
+
const raw = await fs.readFile(configPath, "utf8");
|
|
111
|
+
globalConfig = parseYamlOrThrow(raw, configPath);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Load project config (.karajan/kj.config.yml)
|
|
115
|
+
const projectConfig = await loadProjectConfig(projectDir);
|
|
116
|
+
|
|
117
|
+
// KJC-TSK-0395: enforce the local-overrides-global hierarchy. A project
|
|
118
|
+
// config with no global counterpart is almost always user error (copied
|
|
119
|
+
// a .karajan dir from another repo, edited the wrong file, etc.) and
|
|
120
|
+
// would silently behave like a global config without the defaults
|
|
121
|
+
// people expect. Refuse with an actionable message.
|
|
122
|
+
if (projectConfig && !globalExists) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Local config found at ${getProjectConfigPath(projectDir)} but no global config exists.\n` +
|
|
125
|
+
"Local configs are merged ON TOP of the global one — run `kj init --global` first to create the base."
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Merge: DEFAULTS < global < project
|
|
130
|
+
let merged = mergeDeep(DEFAULTS, globalConfig);
|
|
131
|
+
if (projectConfig) {
|
|
132
|
+
merged = mergeDeep(merged, projectConfig);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (projectPricing) {
|
|
136
|
+
merged.budget = mergeDeep(merged.budget || {}, { pricing: projectPricing });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// KJC-TSK-0318 — schema-validate the merged config so invalid values
|
|
140
|
+
// (review_mode typos, max_iterations=0, out-of-range ports) surface at
|
|
141
|
+
// load time with a clear error instead of crashing deep inside the
|
|
142
|
+
// orchestrator. safeParse + explicit error prefix keeps the message
|
|
143
|
+
// actionable.
|
|
144
|
+
const validation = safeParseConfig(merged);
|
|
145
|
+
if (!validation.success) {
|
|
146
|
+
throw new Error(`Invalid Karajan config:\n${formatConfigIssues(validation.issues)}`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Deprecation tracking — `sonarqube.enabled` was a footgun: users would
|
|
150
|
+
// set it to `false` in their global ~/.karajan/kj.config.yml and then
|
|
151
|
+
// wonder why Sonar didn't run on a code task. Since v2.7.4 Sonar is
|
|
152
|
+
// intrinsic to Karajan for code tasks; the field is ignored. We surface
|
|
153
|
+
// a warning at run start (see emitConfigDeprecations in flow-runner.js)
|
|
154
|
+
// so users notice and clean up their config. Don't throw — keep
|
|
155
|
+
// back-compat so existing scripts keep working.
|
|
156
|
+
const userSetSonarEnabled = (globalConfig?.sonarqube?.enabled !== undefined)
|
|
157
|
+
|| (projectConfig?.sonarqube?.enabled !== undefined);
|
|
158
|
+
if (userSetSonarEnabled) {
|
|
159
|
+
merged._deprecated = merged._deprecated || {};
|
|
160
|
+
merged._deprecated.sonarqubeEnabledKey = true;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
merged.testHarness = resolveTestHarness(merged.testHarness);
|
|
164
|
+
return { config: merged, path: configPath, exists: globalExists, hasProjectConfig: !!projectConfig };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Runtime-only keys that the loader synthesises on every load (or that
|
|
169
|
+
* a wizard uses as transient in-memory hints). They MUST NOT survive
|
|
170
|
+
* to the on-disk YAML — otherwise the `kj run` deprecation warning
|
|
171
|
+
* fossilises (KJC-BUG-0036, observed in dogfooding 2026-05-07: the
|
|
172
|
+
* `_deprecated.sonarqubeEnabledKey: true` block ended up baked into
|
|
173
|
+
* `~/.karajan/kj.config.yml` and re-fired the warning on every run
|
|
174
|
+
* even after the user cleaned `sonarqube.enabled`).
|
|
175
|
+
*
|
|
176
|
+
* Pure: returns a shallow-copied config without the runtime keys —
|
|
177
|
+
* the caller's object is left untouched.
|
|
178
|
+
*/
|
|
179
|
+
function stripRuntimeOnlyKeys(config) {
|
|
180
|
+
if (!config || typeof config !== "object") return config;
|
|
181
|
+
const out = { ...config };
|
|
182
|
+
// _deprecated is loader-synthesised — never written intentionally.
|
|
183
|
+
if ("_deprecated" in out) delete out._deprecated;
|
|
184
|
+
// sonarqube.enabled was deprecated in v2.7.4. The init wizard still
|
|
185
|
+
// uses it as a hint to drive setupSonarQube during install, but the
|
|
186
|
+
// runtime ignores it. Persisting it would re-trigger the deprecation
|
|
187
|
+
// warning on every subsequent kj run.
|
|
188
|
+
if (out.sonarqube && typeof out.sonarqube === "object"
|
|
189
|
+
&& Object.prototype.hasOwnProperty.call(out.sonarqube, "enabled")) {
|
|
190
|
+
const rest = { ...out.sonarqube };
|
|
191
|
+
delete rest.enabled;
|
|
192
|
+
out.sonarqube = rest;
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export async function writeConfig(configPath, config) {
|
|
198
|
+
await ensureDir(path.dirname(configPath));
|
|
199
|
+
const sanitized = stripRuntimeOnlyKeys(config);
|
|
200
|
+
await fs.writeFile(configPath, yaml.dump(sanitized, { lineWidth: 120 }), "utf8");
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Declarative mappings for applyRunOverrides to reduce cognitive complexity.
|
|
204
|
+
|