@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,335 @@
|
|
|
1
|
+
import { initCommand } from "../commands/init.js";
|
|
2
|
+
import { ollamaStartCommand, ollamaStopCommand, ollamaStatusCommand, ollamaPullCommand } from "../commands/ollama.js";
|
|
3
|
+
import { configCommand } from "../commands/config.js";
|
|
4
|
+
import { codeCommand } from "../commands/code.js";
|
|
5
|
+
import { reviewCommand } from "../commands/review.js";
|
|
6
|
+
import { tournamentCommand } from "../commands/tournament.js";
|
|
7
|
+
import { resolveTaskInput } from "../utils/task-file.js";
|
|
8
|
+
import { reviewGateCommand, solomonCommand } from "../commands/review-gate.js";
|
|
9
|
+
import { scanCommand } from "../commands/scan.js";
|
|
10
|
+
import { installToolsCommand } from "../commands/install-tools.js";
|
|
11
|
+
import { doctorCommand } from "../commands/doctor.js";
|
|
12
|
+
import { reportCommand } from "../commands/report.js";
|
|
13
|
+
import { runCommandHandler } from "../commands/run.js";
|
|
14
|
+
import { statusCommand } from "../commands/status.js";
|
|
15
|
+
import { loadPlan } from "../plan/plan-store.js";
|
|
16
|
+
import { withConfig } from "./_shared.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Register the "core pipeline" commands: everything the user runs day-to-day
|
|
20
|
+
* to drive the agent loop or inspect its output. Kept together so the
|
|
21
|
+
* shape of the run/code/review trio (and the scan/report/doctor helpers
|
|
22
|
+
* that frame them) lives in one file.
|
|
23
|
+
*/
|
|
24
|
+
export function registerPipeline(program, { pkgVersion }) {
|
|
25
|
+
program
|
|
26
|
+
.command("init")
|
|
27
|
+
.description("Initialize config, review rules and SonarQube")
|
|
28
|
+
.option("--no-interactive", "Skip wizard, use defaults (for CI/scripts)")
|
|
29
|
+
.option("--scaffold-ci", "Scaffold Karajan CI Gateway workflow files")
|
|
30
|
+
.option("--global", "Save config to ~/.karajan/kj.config.yml (skip the scope wizard)")
|
|
31
|
+
.option("--local", "Save config to ./.karajan/kj.config.yml (skip the scope wizard)")
|
|
32
|
+
.option("--no-ollama", "Skip the RAG embedder bootstrap (Ollama-in-Docker). Useful on modest hardware or when an external embedder will be wired manually")
|
|
33
|
+
.option("--no-rtk", "Skip the RTK auto-install (token savings on Bash outputs). Karajan still runs but burns more tokens")
|
|
34
|
+
.option("--no-squeezr", "Skip the Squeezr auto-install (context compression). Karajan still runs but burns more tokens")
|
|
35
|
+
.option("--no-qmd", "Skip the QMD auto-install + collection registration (semantic wiki over docs/, .reviews/ and plans/)")
|
|
36
|
+
.option("--no-harden", "Skip the quality harness (git hooks, lint/commit config, CI gates, agent guidelines)")
|
|
37
|
+
.option("--json", "Emit a machine-readable summary of what init did (AB-B: for host agents)")
|
|
38
|
+
.action(async (flags) => {
|
|
39
|
+
await withConfig(pkgVersion, "init", flags, async ({ config: _config, logger }) => {
|
|
40
|
+
await initCommand({ logger, flags });
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
program
|
|
45
|
+
.command("config")
|
|
46
|
+
.description("Show current config")
|
|
47
|
+
.option("--json", "Show as JSON")
|
|
48
|
+
.option("--edit", "Open config in $EDITOR for editing")
|
|
49
|
+
.action(async (flags) => {
|
|
50
|
+
await configCommand(flags);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
program
|
|
54
|
+
.command("run")
|
|
55
|
+
.description("Run coder+sonar+reviewer loop")
|
|
56
|
+
.argument("[task]", "Task description (REQUIRED — provide as argument or via --task-file)")
|
|
57
|
+
.option("--task-file <path>", "Read the task from a file (e.g. .md). Alternative to the positional task argument.")
|
|
58
|
+
.option("-y, --yes", "Skip the cwd confirmation prompt (CI / scripted runs).")
|
|
59
|
+
.option("--non-interactive", "Agents/CI: auto-answer prompts with their safe defaults (warn → continue) and stop with exit code 1 when there is none (fail). Also enabled by KJ_NON_INTERACTIVE=1.")
|
|
60
|
+
.option("--planner <name>")
|
|
61
|
+
.option("--coder <name>")
|
|
62
|
+
.option("--reviewer <name>")
|
|
63
|
+
.option("--refactorer <name>")
|
|
64
|
+
.option("--planner-model <name>")
|
|
65
|
+
.option("--coder-model <name>")
|
|
66
|
+
.option("--reviewer-model <name>")
|
|
67
|
+
.option("--refactorer-model <name>")
|
|
68
|
+
.option("--enable-planner")
|
|
69
|
+
.option("--enable-reviewer")
|
|
70
|
+
.option("--enable-refactorer")
|
|
71
|
+
.option("--enable-researcher")
|
|
72
|
+
.option("--enable-tester")
|
|
73
|
+
.option("--enable-security")
|
|
74
|
+
.option("--enable-impeccable")
|
|
75
|
+
.option("--enable-perf")
|
|
76
|
+
.option("--enable-triage")
|
|
77
|
+
.option("--enable-discover")
|
|
78
|
+
.option("--enable-architect")
|
|
79
|
+
.option("--plan <planId>", "Plan ID from kj plan. Loads persisted plan context and skips researcher/architect/planner.")
|
|
80
|
+
// PR4: launch a single HU (or comma-separated list) instead of the
|
|
81
|
+
// entire plan. The board uses this for the per-HU ▶ button so the
|
|
82
|
+
// user can re-run only a failed HU without restarting the whole
|
|
83
|
+
// plan. Requires --plan to also be set.
|
|
84
|
+
.option("--hu <huIds>", "Comma-separated HU IDs to run. When set, the plan's other HUs are skipped. Requires --plan.")
|
|
85
|
+
.option("--enable-hu-reviewer")
|
|
86
|
+
.option("--hu-file <path>", "YAML file with HU stories to certify before coding")
|
|
87
|
+
.option("--enable-serena")
|
|
88
|
+
.option("--mode <name>")
|
|
89
|
+
.option("--max-iterations <n>")
|
|
90
|
+
.option("--max-iteration-minutes <n>")
|
|
91
|
+
.option("--max-total-minutes <n>")
|
|
92
|
+
.option("--base-branch <name>")
|
|
93
|
+
.option("--base-ref <ref>")
|
|
94
|
+
.option("--coder-fallback <name>")
|
|
95
|
+
.option("--reviewer-fallback <name>")
|
|
96
|
+
.option("--reviewer-retries <n>")
|
|
97
|
+
.option("--auto-commit")
|
|
98
|
+
.option("--auto-push")
|
|
99
|
+
.option("--auto-pr")
|
|
100
|
+
.option("--enable-ci", "Enable Karajan CI (early PR + dispatch comments/reviews)")
|
|
101
|
+
.option("--branch-prefix <prefix>")
|
|
102
|
+
.option("--task-type <type>", "Explicit task type: sw, infra, doc, add-tests, refactor")
|
|
103
|
+
.option("--methodology <name>")
|
|
104
|
+
.option("--no-auto-rebase")
|
|
105
|
+
.option("--no-sonar")
|
|
106
|
+
.option("--enable-sonarcloud", "Enable SonarCloud scan (complementary to SonarQube)")
|
|
107
|
+
.option("--no-sonarcloud")
|
|
108
|
+
.option("--checkpoint-interval <n>", "Minutes between interactive checkpoints (default: 5)")
|
|
109
|
+
.option("--step", "Pause after each iteration with a report and ask before continuing")
|
|
110
|
+
.option("--parallel <n>", "Concurrent HU lanes for plan runs (default: 1, sequential)")
|
|
111
|
+
.option("--pg-task <cardId>", "Planning Game card ID (e.g., KJC-TSK-0042)")
|
|
112
|
+
.option("--pg-project <projectId>", "Planning Game project ID")
|
|
113
|
+
.option("--auto-simplify", "Auto-simplify pipeline for simple tasks (disable reviewer/tester)")
|
|
114
|
+
.option("--no-auto-simplify", "Force full pipeline regardless of triage level")
|
|
115
|
+
.option("--smart-models", "Enable smart model selection based on triage complexity")
|
|
116
|
+
.option("--no-smart-models", "Disable smart model selection")
|
|
117
|
+
.option("--design", "Activate design refactoring mode (impeccable role applies design changes)")
|
|
118
|
+
.option("--domain <text-or-path>", "Domain knowledge: inline text or path to .md file")
|
|
119
|
+
.option("--skills-mode <mode>", "Skill detection mode: auto|regex|semantic|none (default: auto)")
|
|
120
|
+
.option("--brain <mode>", "Brain decisor: on|off (default: on). When off, only legacy flags drive routing.")
|
|
121
|
+
.option("--skip-role <role...>", "Force one or more roles OFF regardless of triage (e.g. --skip-role tester security)")
|
|
122
|
+
.option("--force-role <role...>", "Force one or more roles ON regardless of triage")
|
|
123
|
+
.option("--skip-spec-review", "Bypass the spec-reviewer pre-pipeline audit")
|
|
124
|
+
.option("--autonomy <level>", "Autonomy level: interactive | assisted | autonomous (default: interactive)")
|
|
125
|
+
.option("--autonomous", "Shortcut for --autonomy autonomous: the Arbiter resolves every gate, no human prompts")
|
|
126
|
+
.option("--no-rag-update", "Skip the pre-run RAG drift check (KJC-TSK-0455). Same as config.rag.autoUpdate.onRun=false.")
|
|
127
|
+
.option("--dry-run", "Show what would be executed without running anything")
|
|
128
|
+
.option("--json", "Output JSON only (no styled display)")
|
|
129
|
+
.option("-q, --quiet", "Show only stage status lines, suppress raw agent output (default)")
|
|
130
|
+
.option("-v, --verbose", "Show full agent output (stream-json, raw lines)")
|
|
131
|
+
.action(async (task, flags) => {
|
|
132
|
+
await withConfig(pkgVersion, "run", flags, async ({ config, logger }) => {
|
|
133
|
+
// If `--plan <id>` was passed and the user didn't provide a task
|
|
134
|
+
// argument or --task-file, fall back to the task embedded in the
|
|
135
|
+
// plan JSON. The whole point of `kj plan generate` is that the
|
|
136
|
+
// task is captured once and re-used; forcing the user to repeat
|
|
137
|
+
// --task-file on every run is friction with no upside.
|
|
138
|
+
let effectiveTask = task;
|
|
139
|
+
if (!task && !flags.taskFile && flags.plan) {
|
|
140
|
+
// config.projectDir is only populated post-init; before runFlow
|
|
141
|
+
// it can still be undefined. Plans are stored under cwd, so
|
|
142
|
+
// that's the correct fallback for the lookup.
|
|
143
|
+
const projectDir = config.projectDir || process.cwd();
|
|
144
|
+
const plan = await loadPlan(projectDir, flags.plan);
|
|
145
|
+
if (plan?.task && String(plan.task).trim()) {
|
|
146
|
+
effectiveTask = plan.task;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const resolvedTask = await resolveTaskInput({ task: effectiveTask, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
150
|
+
const res = await runCommandHandler({ task: resolvedTask, config, logger, flags });
|
|
151
|
+
// KJC-TSK-0674 (issue #1289): an aborted run (spec-review cancel,
|
|
152
|
+
// unanswerable non-interactive gate) must be observable by CI.
|
|
153
|
+
if (res?.aborted) process.exitCode = 1;
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
program
|
|
158
|
+
.command("autorun")
|
|
159
|
+
.description("Unattended delivery: spec → plan → run all HUs → outcome (defaults to --autonomous)")
|
|
160
|
+
.argument("[task]", "Spec/task description (or use --task-file)")
|
|
161
|
+
.option("--task-file <path>", "Read the spec from a file (e.g. spec.md)")
|
|
162
|
+
.option("--autonomy <level>", "interactive | assisted | autonomous (default: autonomous)")
|
|
163
|
+
.option("--autonomous", "Shortcut for --autonomy autonomous")
|
|
164
|
+
.option("--skip-spec-review", "Bypass the spec-reviewer pre-pipeline audit")
|
|
165
|
+
.action(async (task, flags) => {
|
|
166
|
+
const code = await withConfig(pkgVersion, "autorun", flags, async ({ config, logger }) => {
|
|
167
|
+
const { autorunCommand } = await import("../commands/autorun.js");
|
|
168
|
+
const resolvedTask = await resolveTaskInput({ task, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
169
|
+
const res = await autorunCommand({ task: resolvedTask, config, logger, flags });
|
|
170
|
+
return res?.ok ? 0 : 1;
|
|
171
|
+
});
|
|
172
|
+
if (Number.isInteger(code)) process.exit(code);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
program
|
|
176
|
+
.command("code")
|
|
177
|
+
.description("Run only coder")
|
|
178
|
+
.argument("[task]", "Task description (REQUIRED — provide as argument or via --task-file)")
|
|
179
|
+
.option("--task-file <path>", "Read the task from a file (e.g. .md)")
|
|
180
|
+
.option("--coder <name>")
|
|
181
|
+
.option("--coder-model <name>")
|
|
182
|
+
.action(async (task, flags) => {
|
|
183
|
+
await withConfig(pkgVersion, "code", flags, async ({ config, logger }) => {
|
|
184
|
+
const resolvedTask = await resolveTaskInput({ task, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
185
|
+
await codeCommand({ task: resolvedTask, config, logger });
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// AB-E (KJC-TSK-0651): third-AI arbitration for the v4 environment.
|
|
190
|
+
program
|
|
191
|
+
.command("solomon")
|
|
192
|
+
.description("Ask a third AI to arbitrate a rejected review verdict (brain ≠ reviewer ≠ solomon)")
|
|
193
|
+
.requiredOption("--position <text>", "Why the brain disagrees with the reviewer")
|
|
194
|
+
.option("--range <range>", "Arbitrate a git range instead of the staged diff")
|
|
195
|
+
.action(async (flags) => {
|
|
196
|
+
await withConfig(pkgVersion, "solomon", flags, async ({ config, logger }) => {
|
|
197
|
+
await solomonCommand({ config, logger, flags });
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// KJC-TSK-0723 (TOR-A) — the governed tournament: same task, N coders,
|
|
202
|
+
// isolated lanes; the method picks the winner (TOR-B/C), not vibes.
|
|
203
|
+
program
|
|
204
|
+
.command("tournament")
|
|
205
|
+
.description("Fan the SAME task out to N coders in isolated worktree lanes and collect per-lane evidence (diff, suite, log)")
|
|
206
|
+
.argument("[task]", "Task description (REQUIRED — provide as argument or via --task-file)")
|
|
207
|
+
.option("--task-file <path>", "Read the task from a file (e.g. .md)")
|
|
208
|
+
.option("--coders <csv>", "Comma-separated coder agents (minimum 2), e.g. claude,codex,agy")
|
|
209
|
+
.option("--score <id>", "Score an EXISTING tournament from its artifacts (deterministic, zero LLM)")
|
|
210
|
+
.option("--judge <id>", "Cross-AI judge ranks the finalists (scoreboard in sight; solomon on tie/dispute)")
|
|
211
|
+
.option("--crown <id>", "Commit the judged winner in its lane THROUGH the real review gate")
|
|
212
|
+
.option("--card <ref>", "With --crown: card reference for the commit message (card-first gates)")
|
|
213
|
+
.option("--json", "With --score/--judge/--crown: emit stable JSON")
|
|
214
|
+
.action(async (task, flags) => {
|
|
215
|
+
await withConfig(pkgVersion, "tournament", flags, async ({ config, logger }) => {
|
|
216
|
+
if (flags.score || flags.judge || flags.crown) {
|
|
217
|
+
await tournamentCommand({ task: "", config, logger, flags });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const resolvedTask = await resolveTaskInput({ task, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
221
|
+
await tournamentCommand({ task: resolvedTask, config, logger, flags });
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
program
|
|
226
|
+
.command("review")
|
|
227
|
+
.description("Run only reviewer (--staged/--check: v4 cross-AI gate with recorded verdict)")
|
|
228
|
+
.argument("[task]", "Task description (REQUIRED — provide as argument or via --task-file)")
|
|
229
|
+
.option("--task-file <path>", "Read the task from a file (e.g. .md)")
|
|
230
|
+
.option("--reviewer <name>")
|
|
231
|
+
.option("--reviewer-model <name>")
|
|
232
|
+
.option("--base-ref <ref>")
|
|
233
|
+
.option("--staged", "Review the staged diff with a cross-AI reviewer and record the verdict")
|
|
234
|
+
.option("--check", "Verify the recorded verdict matches the staged diff (exit 0/1, hook-friendly)")
|
|
235
|
+
.option("--range <range>", "Review a git range (e.g. main..HEAD) instead of the staged diff")
|
|
236
|
+
.option("--install-gate", "Enable the pre-commit review gate for this project (creates .karajan/review-gate)")
|
|
237
|
+
.option("--no-sonar", "Skip the deterministic Sonar pre-gate that runs before the cross-AI verdict")
|
|
238
|
+
.action(async (task, flags) => {
|
|
239
|
+
await withConfig(pkgVersion, "review", flags, async ({ config, logger }) => {
|
|
240
|
+
// ENV-B1 (KJC-TSK-0637): the gate mode records a verdict tied to
|
|
241
|
+
// the exact diff so the pre-commit hook can enforce cross-AI review.
|
|
242
|
+
if (flags.staged || flags.check || flags.range || flags.installGate) {
|
|
243
|
+
await reviewGateCommand({ config, logger, flags: { ...flags, task } });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const resolvedTask = await resolveTaskInput({ task, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
247
|
+
await reviewCommand({ task: resolvedTask, config, logger, baseRef: flags.baseRef });
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
program
|
|
252
|
+
.command("scan")
|
|
253
|
+
.description("Run SonarQube scan")
|
|
254
|
+
.action(async () => {
|
|
255
|
+
await withConfig(pkgVersion, "scan", {}, scanCommand);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
program
|
|
259
|
+
.command("doctor")
|
|
260
|
+
.description("Check environment requirements and auto-remediate when possible")
|
|
261
|
+
.option("--check-only", "Detect issues without applying fixes")
|
|
262
|
+
.option("-y, --yes", "Auto-confirm prompts for invasive remediations (CI mode)")
|
|
263
|
+
.option("--json", "Emit machine-readable JSON instead of human output")
|
|
264
|
+
.option("--verbose", "Include fix hints and timing for every check")
|
|
265
|
+
.option("--project", "Run ONLY project-aware checks (signals, tools per signal, write perms, .env consistency, gh remote access) — useful to validate a specific project before kj run")
|
|
266
|
+
.action(async (flags) => {
|
|
267
|
+
const exitCode = await withConfig(pkgVersion, "doctor", {}, (ctx) =>
|
|
268
|
+
doctorCommand({
|
|
269
|
+
...ctx,
|
|
270
|
+
checkOnly: !!flags.checkOnly,
|
|
271
|
+
yes: !!flags.yes,
|
|
272
|
+
json: !!flags.json,
|
|
273
|
+
verbose: !!flags.verbose,
|
|
274
|
+
projectOnly: !!flags.project,
|
|
275
|
+
})
|
|
276
|
+
);
|
|
277
|
+
if (Number.isInteger(exitCode)) process.exit(exitCode);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
program
|
|
281
|
+
.command("install-tools")
|
|
282
|
+
.description("Install the tools kj needs (git, agent CLI: claude+codex) plus the external audit tools (semgrep, osv-scanner, lighthouse, docker, sonar) using the package manager available on your system")
|
|
283
|
+
.option("--only <tools>", "Comma-separated subset (e.g. \"semgrep,osv-scanner\"). Bypasses stack-gating.")
|
|
284
|
+
.option("-y, --yes", "Auto-accept all prompts (non-interactive)")
|
|
285
|
+
.option("--dry-run", "Show what would be installed without running anything")
|
|
286
|
+
.action(async (flags) => {
|
|
287
|
+
try {
|
|
288
|
+
const { exitCode } = await installToolsCommand({
|
|
289
|
+
only: flags.only,
|
|
290
|
+
yes: !!flags.yes,
|
|
291
|
+
dryRun: !!flags.dryRun,
|
|
292
|
+
});
|
|
293
|
+
if (Number.isInteger(exitCode)) process.exit(exitCode);
|
|
294
|
+
} catch (err) {
|
|
295
|
+
console.error(`kj install-tools: ${err?.message || err}`);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
program
|
|
301
|
+
.command("status")
|
|
302
|
+
.description("Show pipeline dashboard with HU progress")
|
|
303
|
+
.option("-n, --lines <n>", "Max log lines to read", "50")
|
|
304
|
+
.action(async (flags) => {
|
|
305
|
+
await statusCommand({ lines: Number(flags.lines) });
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
program
|
|
309
|
+
.command("report")
|
|
310
|
+
.description("Show latest session report")
|
|
311
|
+
.option("--list", "List session ids")
|
|
312
|
+
.option("--session-id <id>", "Show report for a specific session ID")
|
|
313
|
+
.option("--format <type>", "Output format: text|json", "text")
|
|
314
|
+
.option("--trace", "Show chronological trace of all pipeline stages")
|
|
315
|
+
.option("--currency <code>", "Display costs in currency: usd|eur", "usd")
|
|
316
|
+
.option("--pg-task <cardId>", "Filter reports by Planning Game card ID")
|
|
317
|
+
.action(async (flags) => {
|
|
318
|
+
await reportCommand(flags);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// KJC-TSK-0437 — `kj ollama [start|stop|status|pull]`
|
|
322
|
+
const ollama = program.command("ollama").description("Manage the RAG embedder container (Ollama-in-Docker)");
|
|
323
|
+
ollama.command("start").description("Start Ollama container").action(async () => {
|
|
324
|
+
await withConfig(pkgVersion, "ollama:start", {}, async ({ config, logger }) => ollamaStartCommand({ config, logger }));
|
|
325
|
+
});
|
|
326
|
+
ollama.command("stop").description("Stop Ollama container").action(async () => {
|
|
327
|
+
await withConfig(pkgVersion, "ollama:stop", {}, async ({ config, logger }) => ollamaStopCommand({ config, logger }));
|
|
328
|
+
});
|
|
329
|
+
ollama.command("status").description("Report Ollama reachability + container").action(async () => {
|
|
330
|
+
await withConfig(pkgVersion, "ollama:status", {}, async ({ config, logger }) => ollamaStatusCommand({ config, logger }));
|
|
331
|
+
});
|
|
332
|
+
ollama.command("pull <model>").description("Pull a model into the Ollama container").action(async (model) => {
|
|
333
|
+
await withConfig(pkgVersion, "ollama:pull", {}, async ({ config, logger }) => ollamaPullCommand({ model, config, logger }));
|
|
334
|
+
});
|
|
335
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {
|
|
2
|
+
planGenerateCommand,
|
|
3
|
+
planListCommand,
|
|
4
|
+
planShowCommand,
|
|
5
|
+
planReadyCommand,
|
|
6
|
+
planValidateCommand,
|
|
7
|
+
planDeleteCommand,
|
|
8
|
+
planAddHuCommand,
|
|
9
|
+
planRemoveHuCommand,
|
|
10
|
+
planMigrateResultCommand,
|
|
11
|
+
planFixCommand,
|
|
12
|
+
planShareCommand,
|
|
13
|
+
planUnshareCommand,
|
|
14
|
+
} from "../commands/plan.js";
|
|
15
|
+
import { parseCanvasMarkdown } from "../canvas/parse-md.js";
|
|
16
|
+
import { validateCanvas } from "../canvas/validate.js";
|
|
17
|
+
import { canvasToTask } from "../canvas/to-flat.js";
|
|
18
|
+
import { withConfig } from "./_shared.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Register the `plan` parent command and every sub-command that lives
|
|
22
|
+
* under it (generate / list / show / ready / validate / delete /
|
|
23
|
+
* add-hu / remove-hu). Centralising plan management here keeps the
|
|
24
|
+
* REASONS Canvas auto-detection logic in one file alongside the
|
|
25
|
+
* planner entrypoint.
|
|
26
|
+
*/
|
|
27
|
+
export function registerPlan(program, { pkgVersion }) {
|
|
28
|
+
const plan = program.command("plan").description("Plan management (generate, review, approve, execute)");
|
|
29
|
+
|
|
30
|
+
plan
|
|
31
|
+
.command("generate", { isDefault: true })
|
|
32
|
+
.description("Generate implementation plan with HUs")
|
|
33
|
+
.argument("[task]", "Task description (REQUIRED — provide as argument or via --task-file)")
|
|
34
|
+
.option("--task-file <path>", "Read the task from a file (e.g. .md)")
|
|
35
|
+
.option("--planner <name>")
|
|
36
|
+
.option("--planner-model <name>")
|
|
37
|
+
.option("--context <text>", "Additional context for the planner")
|
|
38
|
+
.option("--json", "Output raw JSON plan")
|
|
39
|
+
// Tests-first quality knobs (v2.7.5). Default is "thorough":
|
|
40
|
+
// when the planner skips acceptance_tests on some HUs, run a
|
|
41
|
+
// focused synthesizer pass to fill them in. Disable with these
|
|
42
|
+
// flags only if you explicitly want a fast / sketch plan.
|
|
43
|
+
.option("--no-tests-synth", "Skip the tests-synthesizer pass that fills in missing acceptance_tests")
|
|
44
|
+
.option("--no-plan-review", "Skip the high-level plan reviewer pass (gaps / deps / overlap / order)")
|
|
45
|
+
.option("--skip-spec-review", "Bypass the spec-reviewer pre-pipeline audit")
|
|
46
|
+
.option("--quick", "Sketch mode — skip every quality pass after the initial planner call")
|
|
47
|
+
.option("--no-preflight-hu", "Skip auto-injection of [PREFLIGHT-000] HU at the top of the generated plan")
|
|
48
|
+
.option("--use-onboarding", "Inject the cached Architecture Brief (~/.karajan/onboarding/<slug>.md) into the planner context")
|
|
49
|
+
.option("-y, --yes", "Skip the project-name prompt (use the auto-derived default).")
|
|
50
|
+
.option("--no-interactive", "Force non-interactive mode (no prompts, use defaults).")
|
|
51
|
+
.action(async (task, flags) => {
|
|
52
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config, logger }) => {
|
|
53
|
+
const { resolveTaskInput } = await import("../utils/task-file.js");
|
|
54
|
+
const resolvedTask = await resolveTaskInput({ task, taskFile: flags.taskFile, projectDir: config.projectDir, logger });
|
|
55
|
+
|
|
56
|
+
// REASONS Canvas auto-detection: a SPEC that contains
|
|
57
|
+
// `## REASONS:Section` headings is treated as a structured
|
|
58
|
+
// Canvas — parsed + validated BEFORE the planner runs. This
|
|
59
|
+
// catches broken acceptance tests (jq syntax, bash parse,
|
|
60
|
+
// gherkin missing Given/Then, the 2026-04-29 as-binding
|
|
61
|
+
// misuse class) at plan-time, without spending LLM dollars.
|
|
62
|
+
//
|
|
63
|
+
// Detection by file CONTENTS, not by CLI flag — the Canvas
|
|
64
|
+
// format is the signal. Flat SPECs without REASONS sections
|
|
65
|
+
// continue through the legacy path unchanged (back-compat).
|
|
66
|
+
if (typeof resolvedTask === "string" && /^##\s+REASONS:/m.test(resolvedTask)) {
|
|
67
|
+
let parsed;
|
|
68
|
+
try {
|
|
69
|
+
parsed = parseCanvasMarkdown(resolvedTask);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
throw new Error(`Canvas parse error: ${err.message}`, { cause: err });
|
|
72
|
+
}
|
|
73
|
+
const validation = validateCanvas(parsed);
|
|
74
|
+
if (!validation.valid) {
|
|
75
|
+
const lines = ["Canvas validation failed."];
|
|
76
|
+
if (validation.schemaIssues) {
|
|
77
|
+
lines.push("Schema issues:");
|
|
78
|
+
for (const issue of validation.schemaIssues) {
|
|
79
|
+
lines.push(` - ${issue.path?.map((p) => p.key).join(".") || "(root)"}: ${issue.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (validation.testIssues) {
|
|
83
|
+
lines.push("Acceptance test issues:");
|
|
84
|
+
for (const issue of validation.testIssues) {
|
|
85
|
+
lines.push(` - Operation #${issue.operationIndex + 1} "${issue.operationTitle}", test #${issue.testIndex + 1} (${issue.type}, ${issue.kind}):`);
|
|
86
|
+
lines.push(` ${issue.content}`);
|
|
87
|
+
lines.push(` → ${issue.error}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
throw new Error(lines.join("\n"));
|
|
91
|
+
}
|
|
92
|
+
// Pass the Canvas-derived flat task to the existing planner.
|
|
93
|
+
// Norms + Safeguards ride along under explicit headings the
|
|
94
|
+
// coder prompt can grep for.
|
|
95
|
+
const taskFromCanvas = canvasToTask(validation.canvas);
|
|
96
|
+
// KJC-TSK-0348: remember WHERE the Canvas lived on disk so
|
|
97
|
+
// `kj sync --apply` later knows which file to patch.
|
|
98
|
+
let sourceCanvasPath = null;
|
|
99
|
+
if (typeof flags?.taskFile === "string" && flags.taskFile.length > 0) {
|
|
100
|
+
const path = await import("node:path");
|
|
101
|
+
sourceCanvasPath = path.isAbsolute(flags.taskFile)
|
|
102
|
+
? flags.taskFile
|
|
103
|
+
: path.resolve(config.projectDir || process.cwd(), flags.taskFile);
|
|
104
|
+
}
|
|
105
|
+
await planGenerateCommand({ task: taskFromCanvas, config, logger, flags, sourceCanvasPath });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await planGenerateCommand({
|
|
109
|
+
task: resolvedTask, config, logger, json: flags.json, context: flags.context,
|
|
110
|
+
flags: {
|
|
111
|
+
noTestsSynth: flags.testsSynth === false,
|
|
112
|
+
noPlanReview: flags.planReview === false,
|
|
113
|
+
quick: Boolean(flags.quick),
|
|
114
|
+
yes: Boolean(flags.yes),
|
|
115
|
+
interactive: flags.interactive,
|
|
116
|
+
preflightHu: flags.preflightHu !== false, // KJC-TSK-0397
|
|
117
|
+
useOnboarding: Boolean(flags.useOnboarding), // KJC-TSK-0384 PR 3
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
plan.command("list").description("List all plans").action(async (flags) => {
|
|
124
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
125
|
+
// TSK-0340: was `await import(...)` — now served by the top-level static import.
|
|
126
|
+
await planListCommand({ config });
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
plan.command("show").description("Show plan details + HUs").argument("<planId>").action(async (planId, flags) => {
|
|
131
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
132
|
+
await planShowCommand({ config, planId });
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
plan.command("ready").description("Approve plan — certify all HUs").argument("<planId>").action(async (planId, flags) => {
|
|
137
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
138
|
+
await planReadyCommand({ config, planId });
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
plan.command("validate").description("Validate plan structure").argument("<planId>").action(async (planId, flags) => {
|
|
143
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
144
|
+
await planValidateCommand({ config, planId });
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
plan.command("delete").description("Delete a plan").argument("<planId>").action(async (planId, flags) => {
|
|
149
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
150
|
+
await planDeleteCommand({ config, planId });
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// KJC-PRP-0002 / v2.31.0 PR1: promote a local plan into the project's
|
|
155
|
+
// `.karajan-shared/plans/` so teammates picking up the repo (or the same
|
|
156
|
+
// dev on another machine) see it in their HU Board without re-running
|
|
157
|
+
// the planner. The shared dir is meant to be committed to git.
|
|
158
|
+
plan.command("share")
|
|
159
|
+
.description("Promote a local plan to <projectDir>/.karajan-shared/ so the team can see it")
|
|
160
|
+
.argument("<planId>")
|
|
161
|
+
.option("--only <ids>", "Comma-separated HU IDs to include (share a subset)")
|
|
162
|
+
.option("--exclude <ids>", "Comma-separated HU IDs to omit from the shared copy")
|
|
163
|
+
.action(async (planId, flags) => {
|
|
164
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config, logger }) => {
|
|
165
|
+
await planShareCommand({ config, planId, logger, only: flags.only, exclude: flags.exclude });
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// KJC-PRP-0002 / v2.31.0 PR3: inverse of `kj plan share`. Removes the plan
|
|
170
|
+
// from `.karajan-shared/plans/` but keeps the per-user copy intact, so the
|
|
171
|
+
// dev still has the plan locally while the team stops seeing it.
|
|
172
|
+
plan.command("unshare")
|
|
173
|
+
.description("Remove a plan from <projectDir>/.karajan-shared/ (keeps local copy)")
|
|
174
|
+
.argument("<planId>")
|
|
175
|
+
.action(async (planId, flags) => {
|
|
176
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config, logger }) => {
|
|
177
|
+
await planUnshareCommand({ config, planId, logger });
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
plan.command("add-hu").description("Add HU to plan").argument("<planId>")
|
|
182
|
+
.option("--title <text>", "HU title")
|
|
183
|
+
.option("--type <type>", "Task type: sw|infra|doc|add-tests|refactor|nocode", "sw")
|
|
184
|
+
.option("--deps <ids>", "Comma-separated HU IDs this depends on")
|
|
185
|
+
.option("--scope <text>", "Scope description")
|
|
186
|
+
.action(async (planId, flags) => {
|
|
187
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
188
|
+
await planAddHuCommand({ config, planId, title: flags.title, type: flags.type, deps: flags.deps, scope: flags.scope });
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
plan.command("remove-hu").description("Remove HU from plan").argument("<planId>").argument("<huId>").action(async (planId, huId, flags) => {
|
|
193
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
194
|
+
await planRemoveHuCommand({ config, planId, huId });
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// KJC-TSK-0402: re-ejecuta reviewer + self-fix + structural pass sobre
|
|
199
|
+
// un plan existente. Acepta --prompt opcional con feedback humano que
|
|
200
|
+
// el reviewer inyecta como contexto extra antes de revisar.
|
|
201
|
+
plan.command("fix")
|
|
202
|
+
.description("Relanzar self-fix loop sobre plan existente (con --prompt opcional)")
|
|
203
|
+
.argument("<planId>")
|
|
204
|
+
.option("--prompt <text>", "Feedback del usuario para guiar al reviewer")
|
|
205
|
+
.option("--json", "Output JSON con before/after counts")
|
|
206
|
+
.action(async (planId, flags) => {
|
|
207
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config, logger }) => {
|
|
208
|
+
await planFixCommand({ config, planId, prompt: flags.prompt, logger, json: flags.json });
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// KJC-TSK-0394 step 4: migración one-shot que siembra `result` en las
|
|
213
|
+
// HUs de los plan files existentes (basado en su status legacy). Solo
|
|
214
|
+
// toca el campo result, NO el status — el cleanup del enum lo hará
|
|
215
|
+
// step 5. Idempotente.
|
|
216
|
+
plan.command("migrate-result")
|
|
217
|
+
.description("Backfill the `result` field on existing plan HUs (KJC-TSK-0394 step 4)")
|
|
218
|
+
.option("--dry-run", "Show what would change without writing")
|
|
219
|
+
.action(async (flags) => {
|
|
220
|
+
await withConfig(pkgVersion, "plan", flags, async ({ config }) => {
|
|
221
|
+
await planMigrateResultCommand({ config, flags: { dryRun: flags.dryRun } });
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { rolesCommand } from "../commands/roles.js";
|
|
2
|
+
import { agentsCommand, ASSIGNABLE_ROLES, VALID_PROVIDERS } from "../commands/agents.js";
|
|
3
|
+
import { withConfig } from "./_shared.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Register the meta-configuration commands the user reaches for when
|
|
7
|
+
* setting up the pipeline itself: which skills to load, which roles
|
|
8
|
+
* are wired in, which provider is mapped to each agent slot.
|
|
9
|
+
*/
|
|
10
|
+
export function registerRolesSkills(program, { pkgVersion }) {
|
|
11
|
+
program
|
|
12
|
+
.command("skills [action]")
|
|
13
|
+
.description("Manage the skill cache (actions: list | clear-cache | sync-addyosmani | list-addyosmani)")
|
|
14
|
+
.action(async (action) => {
|
|
15
|
+
const { skillsCommand } = await import("../commands/skills.js");
|
|
16
|
+
const exitCode = await skillsCommand({ action: action || "list" });
|
|
17
|
+
if (Number.isInteger(exitCode)) process.exit(exitCode);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
program
|
|
21
|
+
.command("roles [subcommand] [role]")
|
|
22
|
+
.description("List pipeline roles or show role template instructions")
|
|
23
|
+
.action(async (subcommand, role) => {
|
|
24
|
+
await withConfig(pkgVersion, "roles", {}, async ({ config }) => {
|
|
25
|
+
await rolesCommand({ config, subcommand: subcommand || "list", roleName: role });
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
program
|
|
30
|
+
.command("agents [subcommand] [role] [provider]")
|
|
31
|
+
.description("List or change AI agent assignments per role (e.g. kj agents set coder gemini)")
|
|
32
|
+
.option("--global", "Persist change to kj.config.yml (default for CLI)")
|
|
33
|
+
// KJC-TSK-0755: el --help enumera valores REALES (de las constantes, no
|
|
34
|
+
// duplicados a mano) — la firma genérica obligaba a preguntar.
|
|
35
|
+
.addHelpText("after", [
|
|
36
|
+
"",
|
|
37
|
+
"Subcommands:",
|
|
38
|
+
" list (default) Show the provider assigned to each role",
|
|
39
|
+
" set Change one: kj agents set <role> <provider>",
|
|
40
|
+
"",
|
|
41
|
+
`Roles: ${ASSIGNABLE_ROLES.join(", ")}`,
|
|
42
|
+
`Providers: ${VALID_PROVIDERS.join(", ")} (kj doctor shows which are installed)`,
|
|
43
|
+
"",
|
|
44
|
+
"Examples:",
|
|
45
|
+
" kj agents # current assignments",
|
|
46
|
+
" kj agents set reviewer codex",
|
|
47
|
+
" kj agents set solomon agy --global",
|
|
48
|
+
].join("\n"))
|
|
49
|
+
.action(async (subcommand, role, provider, flags) => {
|
|
50
|
+
await withConfig(pkgVersion, "agents", {}, async ({ config }) => {
|
|
51
|
+
await agentsCommand({ config, subcommand: subcommand || "list", role, provider, global: flags.global });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { sonarCommand, sonarOpenCommand } from "../commands/sonar.js";
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Register the `sonar` parent command and its sub-actions
|
|
6
|
+
* (status / start / stop / logs / open). Kept in its own module
|
|
7
|
+
* because every sub-command shares the same one-liner shape and
|
|
8
|
+
* the only one that needs config is `open`.
|
|
9
|
+
*/
|
|
10
|
+
export function registerSonar(program) {
|
|
11
|
+
const sonar = program.command("sonar").description("Manage SonarQube container");
|
|
12
|
+
sonar.command("status").action(async () => sonarCommand({ action: "status" }));
|
|
13
|
+
sonar.command("start").action(async () => sonarCommand({ action: "start" }));
|
|
14
|
+
sonar.command("stop").action(async () => sonarCommand({ action: "stop" }));
|
|
15
|
+
sonar.command("logs").action(async () => sonarCommand({ action: "logs" }));
|
|
16
|
+
sonar
|
|
17
|
+
.command("open")
|
|
18
|
+
.description("Open SonarQube dashboard in the browser")
|
|
19
|
+
.action(async () => {
|
|
20
|
+
const { config } = await loadConfig();
|
|
21
|
+
const result = await sonarOpenCommand({ config });
|
|
22
|
+
if (!result.ok) {
|
|
23
|
+
console.error(result.error);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
console.log(`Opened ${result.url}`);
|
|
27
|
+
});
|
|
28
|
+
}
|