@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,26 @@
|
|
|
1
|
+
// KJC-TSK-0414 PR2: registra `kj standby list` + `kj standby resume <id>`.
|
|
2
|
+
// `resume` es subcomando de standby para no colisionar con el `kj resume`
|
|
3
|
+
// pre-existente (Solomon pauses con --answer). Modelos mentales distintos:
|
|
4
|
+
// - `kj resume <id> --answer X` → Solomon pauseado (existente)
|
|
5
|
+
// - `kj standby resume <id>` → run hibernada por quota
|
|
6
|
+
import { resumeCommand, standbyListCommand } from "../commands/standby.js";
|
|
7
|
+
|
|
8
|
+
export function registerStandby(program) {
|
|
9
|
+
const standby = program.command("standby").description("Sesiones hibernadas (QUOTA_EXHAUSTED_DAILY etc.)");
|
|
10
|
+
standby
|
|
11
|
+
.command("list", { isDefault: true })
|
|
12
|
+
.description("Lista sesiones pendientes de reanudar")
|
|
13
|
+
.option("--json", "Output JSON")
|
|
14
|
+
.action(async (flags) => {
|
|
15
|
+
await standbyListCommand({ json: flags.json });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
standby
|
|
19
|
+
.command("resume")
|
|
20
|
+
.description("Reanuda una sesión hibernada (re-spawn comando original)")
|
|
21
|
+
.argument("<sessionId>")
|
|
22
|
+
.option("--force", "Reanudar aunque cooldownUntil todavía esté en el futuro (no recomendado)")
|
|
23
|
+
.action(async (sessionId, flags) => {
|
|
24
|
+
await resumeCommand({ sessionId, force: Boolean(flags.force) });
|
|
25
|
+
});
|
|
26
|
+
}
|
package/src/cli.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { Command, Help } from "commander";
|
|
6
|
+
import { loadConfig } from "./config.js";
|
|
7
|
+
import { isAdvancedCommand } from "./cli/advanced-commands.js";
|
|
8
|
+
import { registerPipeline } from "./cli/register-pipeline.js";
|
|
9
|
+
import { registerPlan } from "./cli/register-plan.js";
|
|
10
|
+
import { registerRolesSkills } from "./cli/register-roles-skills.js";
|
|
11
|
+
import { registerMeta } from "./cli/register-meta.js";
|
|
12
|
+
import { registerSonar } from "./cli/register-sonar.js";
|
|
13
|
+
import { registerStandby } from "./cli/register-standby.js";
|
|
14
|
+
import { printUpdateNotice } from "./utils/update-check.js";
|
|
15
|
+
import { printWelcomeScreen } from "./utils/welcome.js";
|
|
16
|
+
import { migrateKjToKarajan } from "./utils/home-migration.js";
|
|
17
|
+
|
|
18
|
+
const PKG_PATH = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../package.json");
|
|
19
|
+
const PKG_VERSION = JSON.parse(readFileSync(PKG_PATH, "utf8")).version;
|
|
20
|
+
|
|
21
|
+
// Non-blocking update check (runs in background, prints after command output)
|
|
22
|
+
printUpdateNotice(PKG_VERSION).catch(() => {});
|
|
23
|
+
|
|
24
|
+
const program = new Command();
|
|
25
|
+
program
|
|
26
|
+
.name("kj")
|
|
27
|
+
.description("Karajan Code CLI")
|
|
28
|
+
.version(PKG_VERSION)
|
|
29
|
+
// Tell Commander to surface "did you mean…?" + a help pointer on every
|
|
30
|
+
// CLI error (typo'd subcommand, missing required arg, etc.). Propagates
|
|
31
|
+
// automatically to subcommands.
|
|
32
|
+
.showSuggestionAfterError(true)
|
|
33
|
+
.showHelpAfterError("(usa 'kj --help' para ver los comandos disponibles)")
|
|
34
|
+
// Accept unknown options + extra positional args at the ROOT only.
|
|
35
|
+
// Without these two, typing `kj generate plan --task-file SPEC.md`
|
|
36
|
+
// errors with "unknown option --task-file" or "too many arguments"
|
|
37
|
+
// before the welcome action ever sees that 'generate' wasn't a valid
|
|
38
|
+
// subcommand. With them, both are captured and the welcome action
|
|
39
|
+
// gets a chance to emit a useful "no such command" message. Subcommands
|
|
40
|
+
// keep their own strict checking because both flags are per-command,
|
|
41
|
+
// not inherited.
|
|
42
|
+
.allowUnknownOption(true)
|
|
43
|
+
.allowExcessArguments(true);
|
|
44
|
+
|
|
45
|
+
// KJC-TSK-0582: the flat list had grown to 37 commands. Show only the core
|
|
46
|
+
// basics in `kj --help`; the advanced/specialized ones live under
|
|
47
|
+
// `kj advanced`. The filter applies to the ROOT help only — subcommand help
|
|
48
|
+
// keeps listing its own subcommands untouched.
|
|
49
|
+
program.configureHelp({
|
|
50
|
+
visibleCommands(cmd) {
|
|
51
|
+
const cmds = Help.prototype.visibleCommands.call(this, cmd);
|
|
52
|
+
if (cmd !== program) return cmds;
|
|
53
|
+
return cmds.filter((c) => !isAdvancedCommand(c.name()));
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// KJC-TSK-0571/0582: orient a newcomer to the few commands they need and
|
|
58
|
+
// point them at `kj advanced` for everything else.
|
|
59
|
+
program.addHelpText(
|
|
60
|
+
"after",
|
|
61
|
+
`
|
|
62
|
+
Getting started (the basics — start here):
|
|
63
|
+
kj init Set up Karajan in this project (run once)
|
|
64
|
+
kj run "<task>" Build or fix something end-to-end (coder + review)
|
|
65
|
+
kj plan "<task>" Break a task into user stories first, then run them
|
|
66
|
+
kj doctor Check your environment is ready
|
|
67
|
+
kj harden Add quality git hooks + CI to any repo
|
|
68
|
+
|
|
69
|
+
kj advanced List every advanced/specialized command, grouped by area`
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
registerPipeline(program, { pkgVersion: PKG_VERSION });
|
|
73
|
+
registerPlan(program, { pkgVersion: PKG_VERSION });
|
|
74
|
+
registerRolesSkills(program, { pkgVersion: PKG_VERSION });
|
|
75
|
+
registerMeta(program, { pkgVersion: PKG_VERSION });
|
|
76
|
+
registerSonar(program);
|
|
77
|
+
registerStandby(program);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Find subcommands whose name is "close enough" to a typo. Used by the
|
|
81
|
+
* fallback action below so `kj generate plan` suggests `kj plan`. Cheap
|
|
82
|
+
* heuristic — same first letter OR substring match OR Levenshtein ≤ 2 —
|
|
83
|
+
* which is all we need for the small set of commands kj exposes.
|
|
84
|
+
*/
|
|
85
|
+
function suggestSimilarCommands(bad, known) {
|
|
86
|
+
const lower = bad.toLowerCase();
|
|
87
|
+
const out = new Set();
|
|
88
|
+
for (const name of known) {
|
|
89
|
+
const n = name.toLowerCase();
|
|
90
|
+
if (n.includes(lower) || lower.includes(n)) out.add(name);
|
|
91
|
+
else if (n[0] === lower[0] && Math.abs(n.length - lower.length) <= 2) out.add(name);
|
|
92
|
+
else if (levenshtein(n, lower) <= 2) out.add(name);
|
|
93
|
+
}
|
|
94
|
+
return [...out].slice(0, 3);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function levenshtein(a, b) {
|
|
98
|
+
if (a === b) return 0;
|
|
99
|
+
if (!a.length) return b.length;
|
|
100
|
+
if (!b.length) return a.length;
|
|
101
|
+
const m = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
|
|
102
|
+
for (let i = 0; i <= a.length; i += 1) m[i][0] = i;
|
|
103
|
+
for (let j = 0; j <= b.length; j += 1) m[0][j] = j;
|
|
104
|
+
for (let i = 1; i <= a.length; i += 1) {
|
|
105
|
+
for (let j = 1; j <= b.length; j += 1) {
|
|
106
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
107
|
+
m[i][j] = Math.min(m[i - 1][j] + 1, m[i][j - 1] + 1, m[i - 1][j - 1] + cost);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return m[a.length][b.length];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Default action — fires when no subcommand matched. Two cases:
|
|
114
|
+
// 1. No args at all → friendly welcome screen (preserved behaviour).
|
|
115
|
+
// 2. Args were given → user typed an unknown command. Print a clear
|
|
116
|
+
// error pointing at WHICH word was wrong, suggest a close match,
|
|
117
|
+
// list every valid command, and exit non-zero. Commander's own
|
|
118
|
+
// "unknown option" error never fires for these because we set
|
|
119
|
+
// allowUnknownOption(true) on the root above.
|
|
120
|
+
program.action(async (_opts, command) => {
|
|
121
|
+
if (command.args.length > 0) {
|
|
122
|
+
const bad = command.args[0];
|
|
123
|
+
const known = program.commands.map((c) => c.name()).sort();
|
|
124
|
+
process.stderr.write(`error: '${bad}' no es un comando válido de kj\n`);
|
|
125
|
+
const suggestions = suggestSimilarCommands(bad, known);
|
|
126
|
+
if (suggestions.length > 0) {
|
|
127
|
+
const list = suggestions.map((s) => `'${s}'`).join(suggestions.length === 2 ? " o " : ", ");
|
|
128
|
+
process.stderr.write(`\n¿Quisiste decir ${list}?\n`);
|
|
129
|
+
}
|
|
130
|
+
process.stderr.write("\nComandos disponibles:\n");
|
|
131
|
+
for (const c of known) process.stderr.write(` ${c}\n`);
|
|
132
|
+
process.stderr.write("\nUsa 'kj --help' para más información, o 'kj <comando> --help' para detalles de un subcomando.\n");
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
const { config } = await loadConfig().catch(() => ({ config: null }));
|
|
136
|
+
printWelcomeScreen({ version: PKG_VERSION, config });
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// One-shot ~/.kj/ → ~/.karajan/ consolidation. Idempotent via marker
|
|
140
|
+
// file; failures non-blocking. See src/utils/home-migration.js.
|
|
141
|
+
// Static import — the migrator runs on every kj invocation, no
|
|
142
|
+
// lazy-load benefit + the architectural dynamic-imports budget would
|
|
143
|
+
// otherwise grow by one for a permanent caller.
|
|
144
|
+
try {
|
|
145
|
+
await migrateKjToKarajan();
|
|
146
|
+
} catch (err) {
|
|
147
|
+
console.warn(`\x1b[33m[warn]\x1b[0m home migration skipped: ${err.message}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
await program.parseAsync();
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error(error.message);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// KJC-TSK-0582: `kj advanced` prints every advanced/specialized command,
|
|
2
|
+
// grouped by area, with the one-line description commander already holds for
|
|
3
|
+
// it. Pure formatter (takes a name→description map) so it's trivially
|
|
4
|
+
// testable without spinning up the whole CLI.
|
|
5
|
+
import { ADVANCED_GROUPS } from "../cli/advanced-commands.js";
|
|
6
|
+
|
|
7
|
+
const NAME_PAD = 14;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Build the `kj advanced` index text.
|
|
11
|
+
* @param {Record<string,string>|Map<string,string>} descriptions name → one-line description
|
|
12
|
+
*/
|
|
13
|
+
export function formatAdvancedIndex(descriptions) {
|
|
14
|
+
const lookup = descriptions instanceof Map ? descriptions : new Map(Object.entries(descriptions || {}));
|
|
15
|
+
const firstLine = (text) => String(text || "").split("\n")[0].trim();
|
|
16
|
+
|
|
17
|
+
const lines = [
|
|
18
|
+
"Comandos avanzados y especializados (agrupados por área).",
|
|
19
|
+
"Todos siguen siendo invocables directamente: kj <comando>.",
|
|
20
|
+
"",
|
|
21
|
+
];
|
|
22
|
+
for (const group of ADVANCED_GROUPS) {
|
|
23
|
+
lines.push(`${group.title}:`);
|
|
24
|
+
for (const name of group.commands) {
|
|
25
|
+
lines.push(` kj ${name.padEnd(NAME_PAD)} ${firstLine(lookup.get(name))}`.trimEnd());
|
|
26
|
+
}
|
|
27
|
+
lines.push("");
|
|
28
|
+
}
|
|
29
|
+
lines.push("Usa 'kj <comando> --help' para los detalles de cualquiera de ellos.");
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kj agent run <agent> "<task>"` (AB-D, KJC-TSK-0654) — the brain's
|
|
3
|
+
* inter-agent bus. The host agent decides WHO does WHAT; kj provides the
|
|
4
|
+
* plumbing it shouldn't have to fight: binary detection, subprocess
|
|
5
|
+
* workarounds (CLAUDECODE strip, stdin, silence timeouts), usage capture.
|
|
6
|
+
* The brain reads the output and decides — kj never interprets it.
|
|
7
|
+
*/
|
|
8
|
+
import { createAgent, getAvailableAgents } from "../agents/index.js";
|
|
9
|
+
import { detectAvailableAgents } from "../utils/agent-detect.js";
|
|
10
|
+
|
|
11
|
+
export async function agentRunCommand({ agent, task, config = {}, logger = null, flags = {} }) {
|
|
12
|
+
if (!task || !task.trim()) {
|
|
13
|
+
throw new Error("kj agent run requires a task: kj agent run <agent> \"<task>\"");
|
|
14
|
+
}
|
|
15
|
+
const known = getAvailableAgents().map((a) => a.name);
|
|
16
|
+
const detected = await detectAvailableAgents();
|
|
17
|
+
const up = detected.filter((a) => a.available).map((a) => a.name).join(", ") || "none";
|
|
18
|
+
if (!known.includes(agent)) {
|
|
19
|
+
throw new Error(`unknown agent "${agent}" — supported: ${known.join(", ")}; available on this machine: ${up}`);
|
|
20
|
+
}
|
|
21
|
+
const entry = detected.find((a) => a.name === agent);
|
|
22
|
+
if (!entry?.available) {
|
|
23
|
+
throw new Error(`agent "${agent}" is not available on this machine (available: ${up}) — install its CLI or pick another`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let timeoutMs;
|
|
27
|
+
if (flags.timeoutMinutes !== undefined) {
|
|
28
|
+
const minutes = Number(flags.timeoutMinutes);
|
|
29
|
+
if (!Number.isFinite(minutes) || minutes <= 0) {
|
|
30
|
+
throw new Error(`--timeout-minutes must be a positive number, got "${flags.timeoutMinutes}"`);
|
|
31
|
+
}
|
|
32
|
+
timeoutMs = minutes * 60000;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// --json must emit ONLY the serialized result — no informational lines,
|
|
36
|
+
// and a crash of the delegated subprocess still yields one JSON payload.
|
|
37
|
+
if (!flags.json) logger?.info?.(`kj agent run: delegating to ${agent}`);
|
|
38
|
+
const instance = createAgent(agent, config, logger);
|
|
39
|
+
let result;
|
|
40
|
+
try {
|
|
41
|
+
result = await instance.runTask({ prompt: task, role: "delegate", timeoutMs });
|
|
42
|
+
} catch (err) {
|
|
43
|
+
result = { ok: false, output: "", error: err.message };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const res = {
|
|
47
|
+
ok: Boolean(result?.ok),
|
|
48
|
+
agent,
|
|
49
|
+
output: result?.output || "",
|
|
50
|
+
error: result?.error || null,
|
|
51
|
+
usage: result?.tokens_out != null
|
|
52
|
+
? { tokens_in: result.tokens_in ?? null, tokens_out: result.tokens_out, cached_tokens: result.cached_tokens ?? null }
|
|
53
|
+
: null,
|
|
54
|
+
};
|
|
55
|
+
if (flags.json) {
|
|
56
|
+
console.log(JSON.stringify(res));
|
|
57
|
+
} else {
|
|
58
|
+
if (res.output) console.log(res.output);
|
|
59
|
+
if (!res.ok && res.error) console.error(res.error);
|
|
60
|
+
}
|
|
61
|
+
process.exitCode = res.ok ? 0 : 1;
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { loadConfig, writeConfig, getConfigPath, getProjectConfigPath, loadProjectConfig, resolveRole } from "../config.js";
|
|
2
|
+
import { checkBinary, KNOWN_AGENTS } from "../utils/agent-detect.js";
|
|
3
|
+
|
|
4
|
+
// Exportados para que el --help se autoalimente de las constantes reales
|
|
5
|
+
// (KJC-TSK-0755, hallazgo de campo: la firma genérica obligaba a preguntar).
|
|
6
|
+
export const ASSIGNABLE_ROLES = [
|
|
7
|
+
"coder", "reviewer", "planner", "refactorer", "triage",
|
|
8
|
+
"researcher", "tester", "security", "solomon"
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
export const VALID_PROVIDERS = KNOWN_AGENTS.map((a) => a.name);
|
|
12
|
+
|
|
13
|
+
export function listAgents(config, sessionOverrides = {}, projectConfig = null) {
|
|
14
|
+
return ASSIGNABLE_ROLES.map((role) => {
|
|
15
|
+
const resolved = resolveRole(config, role);
|
|
16
|
+
const sessionProvider = sessionOverrides[role];
|
|
17
|
+
const projectProvider = projectConfig?.roles?.[role]?.provider;
|
|
18
|
+
let scope = "global";
|
|
19
|
+
if (sessionProvider) scope = "session";
|
|
20
|
+
else if (projectProvider) scope = "project";
|
|
21
|
+
return {
|
|
22
|
+
role,
|
|
23
|
+
provider: sessionProvider || resolved.provider || "-",
|
|
24
|
+
model: resolved.model || "-",
|
|
25
|
+
scope
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function setAgent(role, provider, { global: isGlobal = false } = {}) {
|
|
31
|
+
if (!ASSIGNABLE_ROLES.includes(role)) {
|
|
32
|
+
throw new Error(`Unknown role "${role}". Valid roles: ${ASSIGNABLE_ROLES.join(", ")}`);
|
|
33
|
+
}
|
|
34
|
+
if (!VALID_PROVIDERS.includes(provider)) {
|
|
35
|
+
const bin = await checkBinary(provider);
|
|
36
|
+
if (!bin.ok) {
|
|
37
|
+
throw new Error(`Provider "${provider}" not found. Available: ${VALID_PROVIDERS.join(", ")}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (isGlobal) {
|
|
42
|
+
const { config } = await loadConfig();
|
|
43
|
+
config.roles = config.roles || {};
|
|
44
|
+
config.roles[role] = config.roles[role] || {};
|
|
45
|
+
config.roles[role].provider = provider;
|
|
46
|
+
const configPath = getConfigPath();
|
|
47
|
+
await writeConfig(configPath, config);
|
|
48
|
+
return { role, provider, scope: "global", configPath };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Session scope — write to the process-lifetime runtime-overrides store.
|
|
52
|
+
// Post-v2.7.5 this store lives at the session layer
|
|
53
|
+
// (src/session/runtime-overrides.js) instead of under src/mcp/, so the
|
|
54
|
+
// CLI no longer reaches into the MCP layer. The store is in-memory for
|
|
55
|
+
// the current process: MCP server long-lived invocations see the
|
|
56
|
+
// override across tool calls, CLI short-lived invocations naturally
|
|
57
|
+
// lose it at exit (that's fine — CLI users who want persistence pass
|
|
58
|
+
// --global or let it fall through to the project config below).
|
|
59
|
+
const { setRuntimeOverride } = await import("../session/runtime-overrides.js");
|
|
60
|
+
setRuntimeOverride(role, provider);
|
|
61
|
+
|
|
62
|
+
// Also mirror to the project config file so future CLI invocations pick
|
|
63
|
+
// it up. (The in-memory store alone is useless for CLI because the
|
|
64
|
+
// process exits immediately after.)
|
|
65
|
+
try {
|
|
66
|
+
const projectConfigPath = getProjectConfigPath();
|
|
67
|
+
const projectConfig = (await loadProjectConfig()) || {};
|
|
68
|
+
projectConfig.roles = projectConfig.roles || {};
|
|
69
|
+
projectConfig.roles[role] = projectConfig.roles[role] || {};
|
|
70
|
+
projectConfig.roles[role].provider = provider;
|
|
71
|
+
await writeConfig(projectConfigPath, projectConfig);
|
|
72
|
+
return { role, provider, scope: "project", configPath: projectConfigPath };
|
|
73
|
+
} catch {
|
|
74
|
+
// Project config not writable — still counts as a session-scope set
|
|
75
|
+
// because the in-memory store got updated above.
|
|
76
|
+
return { role, provider, scope: "session" };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export async function agentsCommand({ config, subcommand, role, provider, global: isGlobal }) {
|
|
81
|
+
if (subcommand === "set") {
|
|
82
|
+
if (!role || !provider) {
|
|
83
|
+
console.log("Usage: kj agents set <role> <provider> [--global]");
|
|
84
|
+
console.log(`Roles: ${ASSIGNABLE_ROLES.join(", ")}`);
|
|
85
|
+
console.log(`Providers: ${VALID_PROVIDERS.join(", ")}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const result = await setAgent(role, provider, { global: isGlobal ?? true });
|
|
89
|
+
console.log(`Set ${result.role} -> ${result.provider} (scope: ${result.scope})`);
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const projectConfig = await loadProjectConfig();
|
|
94
|
+
const agents = listAgents(config, {}, projectConfig);
|
|
95
|
+
const roleWidth = Math.max(...agents.map((a) => a.role.length), 4);
|
|
96
|
+
const provWidth = Math.max(...agents.map((a) => a.provider.length), 8);
|
|
97
|
+
const scopeWidth = Math.max(...agents.map((a) => a.scope.length), 5);
|
|
98
|
+
console.log(`${"Role".padEnd(roleWidth)} ${"Provider".padEnd(provWidth)} ${"Scope".padEnd(scopeWidth)} Model`);
|
|
99
|
+
console.log("-".repeat(roleWidth + provWidth + scopeWidth + 14));
|
|
100
|
+
for (const a of agents) {
|
|
101
|
+
console.log(`${a.role.padEnd(roleWidth)} ${a.provider.padEnd(provWidth)} ${a.scope.padEnd(scopeWidth)} ${a.model}`);
|
|
102
|
+
}
|
|
103
|
+
return agents;
|
|
104
|
+
}
|
|
105
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createAgent } from "../agents/index.js";
|
|
2
|
+
import { assertAgentsAvailable } from "../agents/availability.js";
|
|
3
|
+
import { resolveRole } from "../config.js";
|
|
4
|
+
import { buildArchitectPrompt, parseArchitectOutput } from "../prompts/architect.js";
|
|
5
|
+
import { createCliProgressReporter } from "../utils/cli-progress.js";
|
|
6
|
+
import { withBrainRecovery } from "../brain/with-brain-recovery.js";
|
|
7
|
+
|
|
8
|
+
function formatLayers(layers, lines) {
|
|
9
|
+
lines.push("### Layers");
|
|
10
|
+
for (const l of layers) {
|
|
11
|
+
lines.push(typeof l === "string" ? `- ${l}` : `- **${l.name}**: ${l.responsibility || ""}`);
|
|
12
|
+
}
|
|
13
|
+
lines.push("");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function formatTradeoffs(tradeoffs, lines) {
|
|
17
|
+
lines.push("### Tradeoffs");
|
|
18
|
+
for (const t of tradeoffs) {
|
|
19
|
+
lines.push(`- **${t.decision}**: ${t.rationale || ""}`);
|
|
20
|
+
if (t.alternatives?.length) lines.push(` Alternatives: ${t.alternatives.join(", ")}`);
|
|
21
|
+
}
|
|
22
|
+
lines.push("");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function formatApiContracts(contracts, lines) {
|
|
26
|
+
lines.push("### API Contracts");
|
|
27
|
+
for (const c of contracts) {
|
|
28
|
+
lines.push(`- \`${c.method || "GET"} ${c.endpoint}\``);
|
|
29
|
+
}
|
|
30
|
+
lines.push("");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function formatArchitecture(arch, lines) {
|
|
34
|
+
if (arch.type) lines.push(`**Type:** ${arch.type}`, "");
|
|
35
|
+
if (arch.layers?.length) formatLayers(arch.layers, lines);
|
|
36
|
+
if (arch.patterns?.length) {
|
|
37
|
+
lines.push("### Patterns");
|
|
38
|
+
for (const p of arch.patterns) lines.push(`- ${p}`);
|
|
39
|
+
lines.push("");
|
|
40
|
+
}
|
|
41
|
+
if (arch.tradeoffs?.length) formatTradeoffs(arch.tradeoffs, lines);
|
|
42
|
+
if (arch.apiContracts?.length) formatApiContracts(arch.apiContracts, lines);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function formatArchitect(result) {
|
|
46
|
+
const lines = [];
|
|
47
|
+
lines.push(`## Architecture Design`);
|
|
48
|
+
lines.push(`**Verdict:** ${result.verdict || "unknown"}`, "");
|
|
49
|
+
|
|
50
|
+
if (result.architecture) formatArchitecture(result.architecture, lines);
|
|
51
|
+
|
|
52
|
+
if (result.questions?.length) {
|
|
53
|
+
lines.push("### Clarification Questions");
|
|
54
|
+
for (const q of result.questions) lines.push(`- ${q.question || q}`);
|
|
55
|
+
lines.push("");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (result.summary) lines.push(`---\n${result.summary}`);
|
|
59
|
+
return lines.join("\n");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function architectCommand({ task, config, logger, context, json }) {
|
|
63
|
+
const { withCliRunLog } = await import("../utils/cli-run-log.js");
|
|
64
|
+
return withCliRunLog("architect", { projectDir: config?.projectDir, logger }, async ({ runLog }) => {
|
|
65
|
+
const architectRole = resolveRole(config, "architect");
|
|
66
|
+
await assertAgentsAvailable([architectRole.provider]);
|
|
67
|
+
logger.info(`Architect (${architectRole.provider}) starting...`);
|
|
68
|
+
runLog.logText(`[architect] provider=${architectRole.provider}`);
|
|
69
|
+
|
|
70
|
+
const agent = createAgent(architectRole.provider, config, logger);
|
|
71
|
+
const prompt = await buildArchitectPrompt({ task, researchContext: context });
|
|
72
|
+
const progress = createCliProgressReporter({ role: "architect" });
|
|
73
|
+
let result;
|
|
74
|
+
try {
|
|
75
|
+
result = await withBrainRecovery({
|
|
76
|
+
agent, taskArgs: { prompt, onOutput: progress.onOutput, role: "architect" },
|
|
77
|
+
role: "architect", provider: architectRole.provider, logger,
|
|
78
|
+
});
|
|
79
|
+
progress.finish(result.ok ? "done" : (result.action || "failed"));
|
|
80
|
+
} catch (err) { progress.finish("failed"); throw err; }
|
|
81
|
+
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
throw new Error(result.error || result.output || "Architect failed");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const parsed = parseArchitectOutput(result.output);
|
|
87
|
+
|
|
88
|
+
if (json) {
|
|
89
|
+
console.log(JSON.stringify(parsed || result.output, null, 2));
|
|
90
|
+
return { ok: true };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (parsed?.verdict) {
|
|
94
|
+
console.log(formatArchitect(parsed));
|
|
95
|
+
} else {
|
|
96
|
+
console.log(result.output);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Persist ADRs from the architect's tradeoffs[] (v2.7.5). One ADR
|
|
100
|
+
// per tradeoff in Nygard format under `~/.kj/plans/_loose/adrs/`.
|
|
101
|
+
// Coder/reviewer in subsequent runs can pull the active ADRs into
|
|
102
|
+
// their prompt for context — done in a follow-up PR.
|
|
103
|
+
if (parsed?.architecture && config?.projectDir) {
|
|
104
|
+
try {
|
|
105
|
+
const { persistAdrsFromArchitecture } = await import("../plan/adr-generator.js");
|
|
106
|
+
const { adrs, paths } = await persistAdrsFromArchitecture({
|
|
107
|
+
projectDir: config.projectDir,
|
|
108
|
+
planId: null, // standalone architect → "_loose" bucket
|
|
109
|
+
architecture: parsed.architecture,
|
|
110
|
+
});
|
|
111
|
+
if (paths.length > 0) {
|
|
112
|
+
console.log(`\n${adrs.length} ADR${adrs.length === 1 ? "" : "s"} written:`);
|
|
113
|
+
for (const p of paths) console.log(` - ${p}`);
|
|
114
|
+
}
|
|
115
|
+
} catch (err) {
|
|
116
|
+
logger.warn(`ADR write skipped: ${err.message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
logger.info("Architect completed.");
|
|
121
|
+
return { ok: true };
|
|
122
|
+
});
|
|
123
|
+
}
|