@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,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Karajan configuration typedefs. Mirrors the shape produced by loadConfig()
|
|
3
|
+
* and consumed throughout the orchestrator. Optional fields are intentional
|
|
4
|
+
* — users may set them in kj.config.yml without every field being required.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {Object} RoleConfig
|
|
9
|
+
* @property {string} [provider] - claude | codex | gemini | opencode | aider | anthropic | openai | google
|
|
10
|
+
* @property {string} [model] - provider-specific model identifier
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {Object} PipelineToggle
|
|
15
|
+
* @property {boolean} [enabled]
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Object} PipelineFlags
|
|
20
|
+
* @property {boolean} [coderEnabled]
|
|
21
|
+
* @property {boolean} [reviewerEnabled]
|
|
22
|
+
* @property {boolean} [plannerEnabled]
|
|
23
|
+
* @property {boolean} [researcherEnabled]
|
|
24
|
+
* @property {boolean} [architectEnabled]
|
|
25
|
+
* @property {boolean} [refactorerEnabled]
|
|
26
|
+
* @property {boolean} [testerEnabled]
|
|
27
|
+
* @property {boolean} [securityEnabled]
|
|
28
|
+
* @property {boolean} [impeccableEnabled]
|
|
29
|
+
* @property {boolean} [triageEnabled]
|
|
30
|
+
* @property {boolean} [discoverEnabled]
|
|
31
|
+
* @property {boolean} [huReviewerEnabled]
|
|
32
|
+
* @property {boolean} [coderRequired]
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @typedef {Object} GitConfig
|
|
37
|
+
* @property {boolean} [auto_commit]
|
|
38
|
+
* @property {boolean} [auto_push]
|
|
39
|
+
* @property {boolean} [auto_pr]
|
|
40
|
+
* @property {boolean} [auto_rebase]
|
|
41
|
+
* @property {string} [branch_prefix]
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @typedef {Object} SonarConfig
|
|
46
|
+
* @property {boolean} [enabled]
|
|
47
|
+
* @property {string} [host]
|
|
48
|
+
* @property {string} [token]
|
|
49
|
+
* @property {boolean} [external]
|
|
50
|
+
* @property {string} [enforcement_profile]
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @typedef {Object} BudgetConfig
|
|
55
|
+
* @property {Object} [pricing]
|
|
56
|
+
* @property {number} [warn_threshold_pct]
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @typedef {Object} BrainDecisorConfig
|
|
61
|
+
* @property {boolean} [enabled]
|
|
62
|
+
* @property {number} [maxDecisions]
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @typedef {Object} BrainConfig
|
|
67
|
+
* @property {boolean} [enabled]
|
|
68
|
+
* @property {string} [provider]
|
|
69
|
+
* @property {boolean} [bypass_solomon_on_correctness]
|
|
70
|
+
* @property {number} [max_consecutive_verification_failures]
|
|
71
|
+
* @property {BrainDecisorConfig} [decisor]
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @typedef {Object} SkillsConfig
|
|
76
|
+
* @property {boolean} [enabled]
|
|
77
|
+
* @property {"auto"|"regex"|"semantic"|"none"} [mode]
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @typedef {Object} PreflightConfig
|
|
82
|
+
* @property {boolean} [extended]
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Full Karajan configuration shape as resolved by loadConfig() +
|
|
87
|
+
* applyRunOverrides(). Not every field is always present; consumers should
|
|
88
|
+
* defensively read via `config.x?.y`.
|
|
89
|
+
*
|
|
90
|
+
* @typedef {Object} KarajanConfig
|
|
91
|
+
* @property {string} [coder] - legacy agent name (claude, codex, ...)
|
|
92
|
+
* @property {string} [reviewer] - legacy agent name
|
|
93
|
+
* @property {Object.<string, RoleConfig>} [roles]
|
|
94
|
+
* @property {Object.<string, PipelineToggle>} [pipeline]
|
|
95
|
+
* @property {string} [review_mode] - standard | strict | paranoid | relaxed
|
|
96
|
+
* @property {string} [review_rules] - path to review rules .md
|
|
97
|
+
* @property {number} [max_iterations]
|
|
98
|
+
* @property {number} [max_budget_usd]
|
|
99
|
+
* @property {BudgetConfig} [budget]
|
|
100
|
+
* @property {SonarConfig} [sonarqube]
|
|
101
|
+
* @property {GitConfig} [git]
|
|
102
|
+
* @property {string} [base_branch]
|
|
103
|
+
* @property {Object} [session] - timeouts etc
|
|
104
|
+
* @property {Object} [output] - log level, report dir
|
|
105
|
+
* @property {Object} [development] - methodology, require_test_changes
|
|
106
|
+
* @property {BrainConfig} [brain]
|
|
107
|
+
* @property {SkillsConfig} [skills]
|
|
108
|
+
* @property {PreflightConfig} [preflight]
|
|
109
|
+
* @property {string} [projectDir] - absolute path, set at runtime
|
|
110
|
+
* @property {string} [productContext] - runtime-loaded
|
|
111
|
+
* @property {string} [domainContext] - runtime-loaded
|
|
112
|
+
*/
|
|
113
|
+
|
|
114
|
+
export {};
|
package/src/types/hu.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HU (Historia de Usuario) typedefs. An HU is a user story that the
|
|
3
|
+
* pipeline can decompose into, certify via hu-reviewer, then run as a
|
|
4
|
+
* sub-pipeline.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {"pending"|"planned"|"in_progress"|"done"|"rejected"|"blocked"|"failed"} HUStatus
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {Object} HUAcceptanceCriterion
|
|
13
|
+
* @property {string} [given]
|
|
14
|
+
* @property {string} [when]
|
|
15
|
+
* @property {string} [then]
|
|
16
|
+
* @property {string} [raw] - plain-text AC if not Gherkin
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} HUStory
|
|
21
|
+
* @property {string} id - stable slug per batch
|
|
22
|
+
* @property {string} title
|
|
23
|
+
* @property {string} [role] - "Como ..."
|
|
24
|
+
* @property {string} [goal] - "Quiero ..."
|
|
25
|
+
* @property {string} [benefit] - "Para ..."
|
|
26
|
+
* @property {HUAcceptanceCriterion[]} [acceptanceCriteria]
|
|
27
|
+
* @property {HUStatus} [status]
|
|
28
|
+
* @property {string} [assignee]
|
|
29
|
+
* @property {string[]} [dependencies] - ids of HUs that must be done first
|
|
30
|
+
* @property {Object} [certification] - hu-reviewer verdict
|
|
31
|
+
* @property {Object} [session] - sub-pipeline session metadata when it runs
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A batch is the ordered collection of HUs produced by the auto-generator
|
|
36
|
+
* or loaded from a YAML file.
|
|
37
|
+
*
|
|
38
|
+
* @typedef {Object} HUBatch
|
|
39
|
+
* @property {string} id - typically the parent sessionId
|
|
40
|
+
* @property {string} [task] - original task text
|
|
41
|
+
* @property {HUStory[]} stories
|
|
42
|
+
* @property {string} [created_at]
|
|
43
|
+
* @property {string} [updated_at]
|
|
44
|
+
* @property {Object} [board] - HU Board metadata (port, URL)
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central JSDoc typedef registry. Import typedefs via:
|
|
3
|
+
*
|
|
4
|
+
* /** @typedef {import("../types/index.js").KarajanConfig} KarajanConfig *\/
|
|
5
|
+
*
|
|
6
|
+
* This module re-exports every type so consumers have a single import path.
|
|
7
|
+
* The actual typedef bodies live in the focused files under src/types/.
|
|
8
|
+
*
|
|
9
|
+
* Intentionally a runtime-empty module: it only carries JSDoc annotations,
|
|
10
|
+
* nothing to execute.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {import("./config.js").KarajanConfig} KarajanConfig
|
|
15
|
+
* @typedef {import("./config.js").RoleConfig} RoleConfig
|
|
16
|
+
* @typedef {import("./config.js").PipelineFlags} PipelineFlags
|
|
17
|
+
*
|
|
18
|
+
* @typedef {import("./session.js").Session} Session
|
|
19
|
+
* @typedef {import("./session.js").Checkpoint} Checkpoint
|
|
20
|
+
*
|
|
21
|
+
* @typedef {import("./stage.js").StageContext} StageContext
|
|
22
|
+
* @typedef {import("./stage.js").StageResult} StageResult
|
|
23
|
+
*
|
|
24
|
+
* @typedef {import("./agent.js").AgentResult} AgentResult
|
|
25
|
+
* @typedef {import("./agent.js").AgentResponse} AgentResponse
|
|
26
|
+
*
|
|
27
|
+
* @typedef {import("./hu.js").HUStory} HUStory
|
|
28
|
+
* @typedef {import("./hu.js").HUBatch} HUBatch
|
|
29
|
+
*
|
|
30
|
+
* @typedef {import("./policy.js").ResolvedPolicies} ResolvedPolicies
|
|
31
|
+
* @typedef {import("./policy.js").QualityGateResult} QualityGateResult
|
|
32
|
+
*
|
|
33
|
+
* @typedef {import("./solomon.js").Conflict} SolomonConflict
|
|
34
|
+
* @typedef {import("./solomon.js").ConflictHistoryEntry} SolomonConflictHistoryEntry
|
|
35
|
+
* @typedef {import("./solomon.js").SolomonResult} SolomonResult
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy + quality-gate typedefs. Policies are resolved once per session
|
|
3
|
+
* from config + task type; quality gates are the outputs of each gate
|
|
4
|
+
* (sonar, perf, tests, review).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {Object} ResolvedPolicies
|
|
9
|
+
* @property {boolean} [tdd] - whether TDD is enforced
|
|
10
|
+
* @property {boolean} [sonar] - Sonar gate enabled
|
|
11
|
+
* @property {boolean} [tests] - tester gate enabled
|
|
12
|
+
* @property {boolean} [security] - security audit enabled
|
|
13
|
+
* @property {boolean} [reviewer] - reviewer gate enabled
|
|
14
|
+
* @property {boolean} [planner] - planner enabled
|
|
15
|
+
* @property {boolean} [researcher] - researcher enabled
|
|
16
|
+
* @property {boolean} [architect] - architect enabled
|
|
17
|
+
* @property {boolean} [refactorer] - refactorer enabled
|
|
18
|
+
* @property {boolean} [impeccable] - impeccable audit enabled
|
|
19
|
+
* @property {boolean} [triage] - triage enabled
|
|
20
|
+
* @property {boolean} [discover] - discover phase enabled
|
|
21
|
+
* @property {boolean} [hu_reviewer] - HU certification enabled
|
|
22
|
+
* @property {number} [reviewer_retries]
|
|
23
|
+
* @property {number} [tester_retries]
|
|
24
|
+
* @property {string} [reason] - why these policies (task type + config chain)
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Result of a quality gate evaluation — Sonar, perf, tester, reviewer, etc.
|
|
29
|
+
*
|
|
30
|
+
* @typedef {Object} QualityGateResult
|
|
31
|
+
* @property {boolean} ok - did the gate pass
|
|
32
|
+
* @property {"OK"|"FAIL"|"WARN"|"ERROR"} gateStatus
|
|
33
|
+
* @property {string} [summary]
|
|
34
|
+
* @property {Object[]} [blocking_issues] - for reviewer/security gates
|
|
35
|
+
* @property {number} [openIssues] - sonar
|
|
36
|
+
* @property {number} [issuesInitial]
|
|
37
|
+
* @property {number} [issuesFinal]
|
|
38
|
+
* @property {number} [issuesResolved]
|
|
39
|
+
* @property {string} [provider] - which agent produced the verdict (when relevant)
|
|
40
|
+
* @property {Object} [details] - gate-specific payload
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session state typedefs. The session is a mutable object that accumulates
|
|
3
|
+
* state throughout a kj run and is persisted to ~/.karajan/sessions/<id>/.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {Object} Checkpoint
|
|
8
|
+
* @property {string} [at] - ISO timestamp
|
|
9
|
+
* @property {string} [stage]
|
|
10
|
+
* @property {number} [iteration]
|
|
11
|
+
* @property {string} [conflictStage]
|
|
12
|
+
* @property {string} [ruling]
|
|
13
|
+
* @property {string} [alternativeAgent]
|
|
14
|
+
* @property {string} [waitUntil]
|
|
15
|
+
* @property {string[]} [conditions]
|
|
16
|
+
* @property {boolean} [escalate]
|
|
17
|
+
* @property {string} [error]
|
|
18
|
+
* @property {string|null} [subtask]
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {Object} SolomonRulingRecord
|
|
23
|
+
* @property {string} at - ISO timestamp
|
|
24
|
+
* @property {string} stage
|
|
25
|
+
* @property {string} trigger
|
|
26
|
+
* @property {Object} conflict
|
|
27
|
+
* @property {string} ruling - approve | approve_with_conditions | escalate_human | create_subtask | ...
|
|
28
|
+
* @property {string} [reasoning]
|
|
29
|
+
* @property {string[]} [conditions]
|
|
30
|
+
* @property {string|null} [alternativeAgent]
|
|
31
|
+
* @property {string} [result]
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {Object} BrainDecisionRecord
|
|
36
|
+
* @property {number} seq
|
|
37
|
+
* @property {string} at
|
|
38
|
+
* @property {string} intent - "<taskType>:<level>"
|
|
39
|
+
* @property {string[]} rolesOn
|
|
40
|
+
* @property {string} confidence - low | medium | high
|
|
41
|
+
* @property {string} rationale
|
|
42
|
+
* @property {string[]} appliedOverrides
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @typedef {Object} RtkSavings
|
|
47
|
+
* @property {number} [callCount]
|
|
48
|
+
* @property {number} [estimatedTokensSaved]
|
|
49
|
+
* @property {number} [savedPct]
|
|
50
|
+
* @property {number} [originalBytes]
|
|
51
|
+
* @property {number} [rtkBytes]
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @typedef {Object} Session
|
|
56
|
+
* @property {string} id - session id
|
|
57
|
+
* @property {string} task - user's task text
|
|
58
|
+
* @property {"running"|"paused"|"approved"|"rejected"|"failed"} status
|
|
59
|
+
* @property {string} created_at - ISO timestamp
|
|
60
|
+
* @property {string} updated_at
|
|
61
|
+
* @property {Checkpoint[]} [checkpoints]
|
|
62
|
+
* @property {SolomonRulingRecord[]} [solomonRulings] - KJC-TSK-0287
|
|
63
|
+
* @property {BrainDecisionRecord[]} [brainDecisions] - KJC-TSK-0322
|
|
64
|
+
* @property {string[]} [skillsRecommended] - wouldHaveUsed when openskills missing
|
|
65
|
+
* @property {string[]} [autoInstalledSkills]
|
|
66
|
+
* @property {RtkSavings} [rtk_savings]
|
|
67
|
+
* @property {string} [session_start_sha] - baseline for `git diff`; may be the empty-tree SHA when no prior commits exist
|
|
68
|
+
* @property {string} [head_at_start] - actual HEAD when the run started; used by the post-loop journal to enumerate commits produced BY the run. Falls back to session_start_sha in zero-commits repos. (2026-05-07 dogfooding fix.)
|
|
69
|
+
* @property {string} [_journalDir] - runtime journal path
|
|
70
|
+
* @property {string[]} [_journalIterations] - rendered iteration markdown
|
|
71
|
+
* @property {string[]} [_journalFiles]
|
|
72
|
+
* @property {Object} [budget] - final budget summary snapshot
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typedefs for Solomon — the AI judge consulted by Brain on genuine dilemmas.
|
|
3
|
+
*
|
|
4
|
+
* Architectural invariant (enforced by convention, see docs/ARCHITECTURE.md):
|
|
5
|
+
* Solomon is **NEVER** invoked directly from stages, rules or roles.
|
|
6
|
+
* The only legitimate entry points are:
|
|
7
|
+
* - `src/brain/solomon-consult.js#consultSolomonForRouting`
|
|
8
|
+
* - `src/orchestrator/solomon-escalation.js#invokeSolomon`
|
|
9
|
+
* Both are called by Brain (or by the orchestrator on Brain's behalf).
|
|
10
|
+
* The v2.3.0 audit fixed 21 violations where stages bypassed Brain and
|
|
11
|
+
* called Solomon directly. Don't reintroduce that pattern.
|
|
12
|
+
*
|
|
13
|
+
* This module is runtime-empty — it only carries JSDoc annotations.
|
|
14
|
+
*
|
|
15
|
+
* @module types/solomon
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A single turn of feedback attributed to a pipeline agent. Used to build
|
|
20
|
+
* `Conflict.history` when Brain escalates a decision to Solomon.
|
|
21
|
+
*
|
|
22
|
+
* @typedef {Object} ConflictHistoryEntry
|
|
23
|
+
* @property {string} agent - slug of the agent that produced the feedback
|
|
24
|
+
* (e.g. "reviewer", "sonar", "tester",
|
|
25
|
+
* "coder_rate_limit").
|
|
26
|
+
* @property {string} feedback - raw textual feedback to be weighted by Solomon.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The bundle of context Brain hands to Solomon when it cannot decide on its
|
|
31
|
+
* own. Solomon reads only this object + the stage + task; it never sees
|
|
32
|
+
* session internals beyond what is packed here.
|
|
33
|
+
*
|
|
34
|
+
* Historical shape: this matches the argument already used by
|
|
35
|
+
* `invokeSolomon({ ..., conflict })` — the typedef formalizes the contract
|
|
36
|
+
* so future drift is caught by `npm run typecheck`.
|
|
37
|
+
*
|
|
38
|
+
* @typedef {Object} Conflict
|
|
39
|
+
* @property {string} stage
|
|
40
|
+
* Pipeline stage that triggered escalation (e.g. "reviewer",
|
|
41
|
+
* "sonar", "tester", "init_error", "coder_rate_limit").
|
|
42
|
+
* @property {string} task
|
|
43
|
+
* Original user task (denormalized so Solomon sees what the user
|
|
44
|
+
* actually asked for, not just the stage context).
|
|
45
|
+
* @property {number} iterationCount
|
|
46
|
+
* Current iteration number inside the escalating sub-loop.
|
|
47
|
+
* @property {number} maxIterations
|
|
48
|
+
* Configured cap for that sub-loop (reviewer retries, tester
|
|
49
|
+
* retries, full pipeline iterations, etc.). Hitting this cap is
|
|
50
|
+
* the canonical trigger for Solomon consultation.
|
|
51
|
+
* @property {string|null} [cooldownUntil]
|
|
52
|
+
* ISO timestamp for rate-limit / standby escalations. Null when
|
|
53
|
+
* the conflict is not a rate-limit.
|
|
54
|
+
* @property {number|null} [cooldownMs]
|
|
55
|
+
* Remaining cooldown in milliseconds. Null outside rate-limit
|
|
56
|
+
* escalations.
|
|
57
|
+
* @property {ConflictHistoryEntry[]} history
|
|
58
|
+
* Ordered list of agent feedback Solomon should weigh. Most
|
|
59
|
+
* recent last. Must be non-empty — Solomon should always see at
|
|
60
|
+
* least one piece of evidence.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Solomon's ruling on a `Conflict`. Returned by `invokeSolomon()` and
|
|
65
|
+
* consumed by the orchestrator to decide what happens next.
|
|
66
|
+
*
|
|
67
|
+
* @typedef {Object} SolomonResult
|
|
68
|
+
* @property {"continue"|"pause"|"subtask"} action
|
|
69
|
+
* - `continue`: retry the sub-loop with optional `humanGuidance`
|
|
70
|
+
* appended to the next feedback round.
|
|
71
|
+
* - `pause`: stop the pipeline and surface a question to the
|
|
72
|
+
* human operator (`SolomonResult.question`).
|
|
73
|
+
* - `subtask`: bifurcate into a named sub-task defined in
|
|
74
|
+
* `SolomonResult.subtask`.
|
|
75
|
+
* @property {string} [rationale] - human-readable reasoning for the
|
|
76
|
+
* chosen action. Logged to the
|
|
77
|
+
* decisions journal.
|
|
78
|
+
* @property {string} [humanGuidance] - text to merge into the next
|
|
79
|
+
* coder/reviewer prompt when
|
|
80
|
+
* action === "continue".
|
|
81
|
+
* @property {string} [question] - prompt shown to the human when
|
|
82
|
+
* action === "pause".
|
|
83
|
+
* @property {Object} [subtask] - sub-task descriptor when
|
|
84
|
+
* action === "subtask".
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage context + stage result typedefs. A StageContext is the bundle of
|
|
3
|
+
* orchestration state every stage function receives; a StageResult is what
|
|
4
|
+
* they return for downstream stages to consume.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {Object} Logger
|
|
9
|
+
* @property {(msg: string, ...rest: any[]) => void} info
|
|
10
|
+
* @property {(msg: string, ...rest: any[]) => void} warn
|
|
11
|
+
* @property {(msg: string, ...rest: any[]) => void} error
|
|
12
|
+
* @property {(msg: string, ...rest: any[]) => void} [debug]
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} Emitter
|
|
17
|
+
* @property {(event: string, data?: any) => void} emit
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Shape of `eventBase` propagated to every emitted event for correlation.
|
|
22
|
+
*
|
|
23
|
+
* @typedef {Object} EventBase
|
|
24
|
+
* @property {string} sessionId
|
|
25
|
+
* @property {number} iteration
|
|
26
|
+
* @property {string|null} stage
|
|
27
|
+
* @property {number} startedAt - epoch ms
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The context every pipeline stage consumes. Most stages pick a subset with
|
|
32
|
+
* destructuring. Listed here so consumers can import a single type instead
|
|
33
|
+
* of re-declaring ad-hoc objects.
|
|
34
|
+
*
|
|
35
|
+
* @typedef {Object} StageContext
|
|
36
|
+
* @property {import("./config.js").KarajanConfig} config
|
|
37
|
+
* @property {import("./session.js").Session} session
|
|
38
|
+
* @property {Logger} logger
|
|
39
|
+
* @property {Emitter|null} emitter
|
|
40
|
+
* @property {EventBase} eventBase
|
|
41
|
+
* @property {Function} [trackBudget]
|
|
42
|
+
* @property {Function} [budgetSummary]
|
|
43
|
+
* @property {import("./config.js").PipelineFlags} [pipelineFlags]
|
|
44
|
+
* @property {Object} [coderRole] - CoderRole instance
|
|
45
|
+
* @property {Object} [reviewerRole]
|
|
46
|
+
* @property {Object} [brainCtx]
|
|
47
|
+
* @property {Function} [askQuestion]
|
|
48
|
+
* @property {Object} [stageResults] - accumulated results from prior stages
|
|
49
|
+
* @property {string} [task]
|
|
50
|
+
* @property {string|null} [pgTaskId]
|
|
51
|
+
* @property {string|null} [pgProject]
|
|
52
|
+
* @property {Object} [flags] - CLI/call-time flags
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The structured return of most stage helpers. Stages are allowed to return
|
|
57
|
+
* shape-specific additions on top of these common fields.
|
|
58
|
+
*
|
|
59
|
+
* @typedef {Object} StageResult
|
|
60
|
+
* @property {boolean} ok
|
|
61
|
+
* @property {string} [summary]
|
|
62
|
+
* @property {Object} [result] - stage-specific payload
|
|
63
|
+
* @property {string} [action] - "return" | "retry" | "continue" | "skip" | ...
|
|
64
|
+
* @property {Object} [stageResult] - alternate nested result shape used by some stages
|
|
65
|
+
* @property {string} [provider]
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { runCommand } from "./process.js";
|
|
2
|
+
import { resolveBin } from "../agents/resolve-bin.js";
|
|
3
|
+
import { getInstallCommand } from "./os-detect.js";
|
|
4
|
+
|
|
5
|
+
const KNOWN_AGENTS = [
|
|
6
|
+
{ name: "claude", install: getInstallCommand("claude") },
|
|
7
|
+
{ name: "codex", install: getInstallCommand("codex") },
|
|
8
|
+
{ name: "gemini", install: getInstallCommand("gemini") },
|
|
9
|
+
{ name: "aider", install: getInstallCommand("aider") },
|
|
10
|
+
{ name: "opencode", install: getInstallCommand("opencode") },
|
|
11
|
+
{ name: "qwen", install: getInstallCommand("qwen") },
|
|
12
|
+
{ name: "copilot", install: getInstallCommand("copilot") },
|
|
13
|
+
// KJC-TSK-0729: promoted from the observation census once its adapter
|
|
14
|
+
// landed — detecting is not supporting; supporting is.
|
|
15
|
+
{ name: "kimi", install: getInstallCommand("kimi") },
|
|
16
|
+
{ name: "agy", install: getInstallCommand("agy") }
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* KJC-TSK-0728 — observation census (from the Orca landscape): agent CLIs kj
|
|
21
|
+
* can SEE but does not drive. Detecting is not supporting — these never feed
|
|
22
|
+
* pipeline pickers; they feed the AI-surface inventory and one doctor line.
|
|
23
|
+
* `bin` differs from `name` when the vendor ships an umbrella binary.
|
|
24
|
+
*/
|
|
25
|
+
const OBSERVED_AGENTS = [
|
|
26
|
+
{ name: "grok", bin: "grok" },
|
|
27
|
+
{ name: "cursor-agent", bin: "cursor-agent" },
|
|
28
|
+
{ name: "pi", bin: "pi" },
|
|
29
|
+
{ name: "kilocode", bin: "kilocode" },
|
|
30
|
+
{ name: "vibe", bin: "vibe" },
|
|
31
|
+
{ name: "rovodev", bin: "acli" },
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
/** Probe the observation census in parallel; callers filter on `available`. */
|
|
35
|
+
export async function detectObservedAgents() {
|
|
36
|
+
return Promise.all(
|
|
37
|
+
OBSERVED_AGENTS.map(async (agent) => {
|
|
38
|
+
const check = await checkBinary(agent.bin);
|
|
39
|
+
return { name: agent.name, bin: agent.bin, available: check.ok, version: check.ok ? check.version : null };
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function checkBinary(name, versionArg = "--version") {
|
|
45
|
+
const resolved = resolveBin(name);
|
|
46
|
+
// KJC-BUG-0113: a zombie CLI that hangs on --version (seen with the
|
|
47
|
+
// retired Gemini Code Assist binary) must not hang init/preflight —
|
|
48
|
+
// 5s is generous for a version print.
|
|
49
|
+
const res = await runCommand(resolved, [versionArg], { timeout: 5000 });
|
|
50
|
+
const version = (res.stdout || res.stderr || "").split("\n")[0].trim();
|
|
51
|
+
return { ok: res.exitCode === 0, version, path: resolved };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function detectAvailableAgents() {
|
|
55
|
+
// PR-J (audit quick win): probe the 5 agent binaries in parallel
|
|
56
|
+
// via Promise.all instead of awaiting in a for-of. checkBinary is
|
|
57
|
+
// a pure shell-out (no shared state), so serialising them was
|
|
58
|
+
// wasted latency. With 5 agents at ~80ms each: O(n) → O(1).
|
|
59
|
+
return Promise.all(
|
|
60
|
+
KNOWN_AGENTS.map(async (agent) => {
|
|
61
|
+
const check = await checkBinary(agent.name);
|
|
62
|
+
return {
|
|
63
|
+
name: agent.name,
|
|
64
|
+
available: check.ok,
|
|
65
|
+
version: check.ok ? check.version : null,
|
|
66
|
+
install: agent.install
|
|
67
|
+
};
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Detect which AI agent is the current MCP host (if any).
|
|
74
|
+
* Returns the agent name ("claude", "codex", etc.) or null if not inside an agent.
|
|
75
|
+
*/
|
|
76
|
+
export function detectHostAgent() {
|
|
77
|
+
if (process.env.CLAUDECODE === "1" || process.env.CLAUDE_CODE === "1") return "claude";
|
|
78
|
+
if (process.env.CODEX_CLI === "1" || process.env.CODEX === "1") return "codex";
|
|
79
|
+
if (process.env.GEMINI_CLI === "1") return "gemini";
|
|
80
|
+
if (process.env.OPENCODE === "1") return "opencode";
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if a given provider matches the current host agent.
|
|
86
|
+
* When true, we can skip subprocess spawning and delegate to the host.
|
|
87
|
+
*/
|
|
88
|
+
export function isHostAgent(provider) {
|
|
89
|
+
const host = detectHostAgent();
|
|
90
|
+
return host !== null && host === provider;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { KNOWN_AGENTS, OBSERVED_AGENTS };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// ai-trash detection + Claude Code hook install (KJC-TSK-0391).
|
|
2
|
+
// `kj-trash` is the binary shipped by the @karajan/ai-trash workspace.
|
|
3
|
+
// detectAiTrash() probes the binary; installAiTrashHook() invokes
|
|
4
|
+
// `kj-trash install --claude-code`, which idempotently patches
|
|
5
|
+
// ~/.claude/settings.json to register the PreToolUse hook.
|
|
6
|
+
|
|
7
|
+
import { runCommand } from "./process.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @returns {Promise<{ available: boolean, version: string|null }>}
|
|
11
|
+
*/
|
|
12
|
+
export async function detectAiTrash() {
|
|
13
|
+
try {
|
|
14
|
+
const res = await runCommand("kj-trash", ["--help"]);
|
|
15
|
+
if (res.exitCode === 0 || res.exitCode === 2) {
|
|
16
|
+
return { available: true, version: "0.0.0" };
|
|
17
|
+
}
|
|
18
|
+
return { available: false, version: null };
|
|
19
|
+
} catch {
|
|
20
|
+
return { available: false, version: null };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Register the kj-trash PreToolUse hook in ~/.claude/settings.json.
|
|
26
|
+
* Idempotent: second run reports "already installed" without rewriting.
|
|
27
|
+
*
|
|
28
|
+
* @param {object} logger - logger with info/warn methods
|
|
29
|
+
* @returns {Promise<{ ok: boolean, mutated: boolean, error: string|null }>}
|
|
30
|
+
*/
|
|
31
|
+
export async function installAiTrashHook(logger) {
|
|
32
|
+
logger.info("Registering ai-trash Claude Code hook...");
|
|
33
|
+
try {
|
|
34
|
+
const res = await runCommand("kj-trash", ["install", "--claude-code"], { timeout: 30_000 });
|
|
35
|
+
if (res.exitCode !== 0) {
|
|
36
|
+
const error = (res.stderr || "").trim() || `exit code ${res.exitCode}`;
|
|
37
|
+
logger.warn(`ai-trash hook install failed: ${error}`);
|
|
38
|
+
return { ok: false, mutated: false, error };
|
|
39
|
+
}
|
|
40
|
+
const mutated = !(res.stdout || "").includes("already installed");
|
|
41
|
+
logger.info(mutated ? "ai-trash hook installed." : "ai-trash hook already installed.");
|
|
42
|
+
return { ok: true, mutated, error: null };
|
|
43
|
+
} catch (err) {
|
|
44
|
+
const error = err.message || String(err);
|
|
45
|
+
logger.warn(`ai-trash hook install failed: ${error}`);
|
|
46
|
+
return { ok: false, mutated: false, error };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* async-lock — named in-process mutex (KJC-TSK-0625, épica KJC-PCS-0065).
|
|
3
|
+
* Parallel HU lanes run inside ONE kj process; shared single-instance
|
|
4
|
+
* resources (the SonarQube server scans one project key at a time) must
|
|
5
|
+
* serialize across lanes. `withLock` chains callers per name in FIFO
|
|
6
|
+
* order; sequential runs pay nothing (the chain is always settled).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const locks = new Map(); // name -> { tail: Promise, holders: number }
|
|
10
|
+
|
|
11
|
+
/** Run `fn` exclusively among every caller sharing `name`. */
|
|
12
|
+
export async function withLock(name, fn) {
|
|
13
|
+
const entry = locks.get(name) ?? { tail: Promise.resolve(), holders: 0 };
|
|
14
|
+
entry.holders += 1;
|
|
15
|
+
locks.set(name, entry);
|
|
16
|
+
|
|
17
|
+
const previous = entry.tail;
|
|
18
|
+
let release;
|
|
19
|
+
entry.tail = new Promise((resolve) => {
|
|
20
|
+
release = resolve;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
await previous;
|
|
24
|
+
try {
|
|
25
|
+
return await fn();
|
|
26
|
+
} finally {
|
|
27
|
+
release();
|
|
28
|
+
entry.holders -= 1;
|
|
29
|
+
if (entry.holders === 0) locks.delete(name);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Shim — the real implementation now lives in karajan-core/atomic-write.
|
|
2
|
+
// Kept here so CLI callers (src/**/*.js) keep importing
|
|
3
|
+
// "#utils/atomic-write.js" without churn during KJC-TSK-0511 (decouple
|
|
4
|
+
// @karajan/hu-board). Will be retired once every consumer migrates to
|
|
5
|
+
// the karajan-core import.
|
|
6
|
+
export { writeJsonAtomic, writeJsonAtomicSync } from "karajan-core/atomic-write";
|