@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,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Test Diet — baseline snapshot generator.
|
|
4
|
+
*
|
|
5
|
+
* Captures the *current* state of the unit test suite so subsequent diet
|
|
6
|
+
* commits (HU plan-20260429094214-0srv_002 .. _008) can prove they did not
|
|
7
|
+
* blow past the guardrails (wall-clock budget and branch-coverage drop).
|
|
8
|
+
*
|
|
9
|
+
* Output file: tests/_diet/baseline.json
|
|
10
|
+
*
|
|
11
|
+
* Schema:
|
|
12
|
+
* {
|
|
13
|
+
* capturedAt: ISO-8601 timestamp,
|
|
14
|
+
* locTotal: total wc -l across every tests/...test.js file,
|
|
15
|
+
* wallClockSec: number, // `time npm test` wall-clock
|
|
16
|
+
* branchCoveragePct: number, // src/ branch coverage % from vitest --coverage
|
|
17
|
+
* fileCount: number, // files.length
|
|
18
|
+
* files: [ { path, loc, architecture } ]
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* The script is intentionally *measurement-only*: it never edits source
|
|
22
|
+
* or test files. Re-running it overwrites the snapshot — but the diet
|
|
23
|
+
* compares against the committed copy, not the latest run.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
27
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
28
|
+
import { dirname, relative, resolve } from "node:path";
|
|
29
|
+
import { fileURLToPath } from "node:url";
|
|
30
|
+
|
|
31
|
+
const REPO_ROOT = resolve(fileURLToPath(import.meta.url), "..", "..");
|
|
32
|
+
const OUTPUT_PATH = resolve(REPO_ROOT, "tests/_diet/baseline.json");
|
|
33
|
+
const ARCH_PREFIX = "tests/architecture/";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Enumerate every committed `tests/**\/*.test.js` file via `git ls-files`.
|
|
37
|
+
* Using git rather than fs walk keeps the snapshot reproducible: untracked
|
|
38
|
+
* scratch files in someone's worktree never leak into the baseline.
|
|
39
|
+
*
|
|
40
|
+
* @returns {string[]} repo-relative paths
|
|
41
|
+
*/
|
|
42
|
+
function listTestFiles() {
|
|
43
|
+
const out = execFileSync(
|
|
44
|
+
"git",
|
|
45
|
+
["ls-files", "tests"],
|
|
46
|
+
{ cwd: REPO_ROOT, encoding: "utf8" }
|
|
47
|
+
);
|
|
48
|
+
return out
|
|
49
|
+
.split("\n")
|
|
50
|
+
.map((line) => line.trim())
|
|
51
|
+
.filter((line) => line.endsWith(".test.js"));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Count lines in a file. Uses readFileSync because the files are small and
|
|
56
|
+
* spawning `wc -l` 300+ times is wasteful.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} absPath
|
|
59
|
+
* @returns {number}
|
|
60
|
+
*/
|
|
61
|
+
function countLines(absPath) {
|
|
62
|
+
const content = readFileSync(absPath, "utf8");
|
|
63
|
+
if (content.length === 0) return 0;
|
|
64
|
+
// wc -l counts newlines; mimic that so the JSON matches `wc -l` output.
|
|
65
|
+
let lines = 0;
|
|
66
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
67
|
+
if (content.charCodeAt(i) === 10) lines += 1;
|
|
68
|
+
}
|
|
69
|
+
return lines;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Run `npm test` once and report wall-clock seconds. The suite has a
|
|
74
|
+
* pre-existing architecture-budget failure (tests/architecture/dynamic-imports);
|
|
75
|
+
* its exit code is irrelevant for the wall-clock baseline.
|
|
76
|
+
*
|
|
77
|
+
* @returns {number} seconds, rounded to 2 decimals
|
|
78
|
+
*/
|
|
79
|
+
function measureWallClock() {
|
|
80
|
+
const started = process.hrtime.bigint();
|
|
81
|
+
spawnSync("npm", ["test", "--silent"], {
|
|
82
|
+
cwd: REPO_ROOT,
|
|
83
|
+
stdio: "ignore"
|
|
84
|
+
});
|
|
85
|
+
const elapsedNs = process.hrtime.bigint() - started;
|
|
86
|
+
return Math.round(Number(elapsedNs) / 1e7) / 100;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Run vitest with v8 coverage and parse the `text-summary` reporter output
|
|
91
|
+
* for the `Branches` percentage of the src/ tree.
|
|
92
|
+
*
|
|
93
|
+
* The architecture-budget test fails before the coverage summary is emitted,
|
|
94
|
+
* so we exclude that single file from this measurement run only. It scans
|
|
95
|
+
* source files statically and does not exercise src/ runtime code, so its
|
|
96
|
+
* absence does not move branch coverage in any meaningful way.
|
|
97
|
+
*
|
|
98
|
+
* @returns {number} branch coverage % (e.g. 17.23)
|
|
99
|
+
*/
|
|
100
|
+
function measureBranchCoverage() {
|
|
101
|
+
const result = spawnSync(
|
|
102
|
+
"npx",
|
|
103
|
+
[
|
|
104
|
+
"vitest",
|
|
105
|
+
"run",
|
|
106
|
+
"--coverage",
|
|
107
|
+
"--coverage.provider=v8",
|
|
108
|
+
"--coverage.reporter=text-summary",
|
|
109
|
+
"--exclude=tests/architecture/dynamic-imports.test.js"
|
|
110
|
+
],
|
|
111
|
+
{ cwd: REPO_ROOT, encoding: "utf8" }
|
|
112
|
+
);
|
|
113
|
+
const out = `${result.stdout}\n${result.stderr}`;
|
|
114
|
+
const match = out.match(/Branches\s*:\s*([\d.]+)%/);
|
|
115
|
+
if (!match) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
"Could not parse branch coverage from vitest output:\n" +
|
|
118
|
+
out.slice(-2000)
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return Number(match[1]);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Build the files[] array with metadata for every test file.
|
|
126
|
+
*
|
|
127
|
+
* @param {string[]} relativePaths
|
|
128
|
+
* @returns {Array<{path: string, loc: number, architecture: boolean}>}
|
|
129
|
+
*/
|
|
130
|
+
function buildFileEntries(relativePaths) {
|
|
131
|
+
return relativePaths
|
|
132
|
+
.map((rel) => ({
|
|
133
|
+
path: rel,
|
|
134
|
+
loc: countLines(resolve(REPO_ROOT, rel)),
|
|
135
|
+
architecture: rel.startsWith(ARCH_PREFIX)
|
|
136
|
+
}))
|
|
137
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function main() {
|
|
141
|
+
const relPaths = listTestFiles();
|
|
142
|
+
const files = buildFileEntries(relPaths);
|
|
143
|
+
const locTotal = files.reduce((sum, f) => sum + f.loc, 0);
|
|
144
|
+
|
|
145
|
+
// Order matters: cheap measurements first, expensive ones last, so a
|
|
146
|
+
// wedge in the slow ones is easy to bisect via Ctrl-C.
|
|
147
|
+
const wallClockSec = measureWallClock();
|
|
148
|
+
const branchCoveragePct = measureBranchCoverage();
|
|
149
|
+
|
|
150
|
+
const baseline = {
|
|
151
|
+
capturedAt: new Date().toISOString(),
|
|
152
|
+
locTotal,
|
|
153
|
+
wallClockSec,
|
|
154
|
+
branchCoveragePct,
|
|
155
|
+
fileCount: files.length,
|
|
156
|
+
files
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
|
|
160
|
+
writeFileSync(OUTPUT_PATH, `${JSON.stringify(baseline, null, 2)}\n`, "utf8");
|
|
161
|
+
|
|
162
|
+
process.stdout.write(
|
|
163
|
+
`Wrote ${relative(REPO_ROOT, OUTPUT_PATH)} — ` +
|
|
164
|
+
`${baseline.fileCount} files, ${baseline.locTotal} LOC, ` +
|
|
165
|
+
`${baseline.wallClockSec}s wall-clock, ` +
|
|
166
|
+
`${baseline.branchCoveragePct}% branch coverage.\n`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
main();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* dual-publish (MIG-A, KJC-TSK-0751, épica KJC-PCS-0077, ADR 0004) — el
|
|
4
|
+
* MISMO contenido sale bajo dos nombres npm durante la migración al scope:
|
|
5
|
+
* karajan-code (legacy, publish normal) y @karajan-family/code (scoped).
|
|
6
|
+
*
|
|
7
|
+
* Uso:
|
|
8
|
+
* node scripts/dual-publish.mjs --pack-only # genera+verifica el tarball scoped
|
|
9
|
+
* node scripts/dual-publish.mjs --publish --otp=XXX # publica el scoped (tras publicar el legacy)
|
|
10
|
+
*
|
|
11
|
+
* El swap del name es EN SITIO con restauración en finally: un crash a mitad
|
|
12
|
+
* no deja el manifest renombrado. La verificación es el MISMO verify-pack
|
|
13
|
+
* (name-agnóstico desde la parte 1): empaqueta, instala aislado y corre kj.
|
|
14
|
+
* El PRIMER publish del scoped lo hace el usuario (cuenta karajan-family,
|
|
15
|
+
* security key); los siguientes van con la sesión normal.
|
|
16
|
+
*/
|
|
17
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import { join, dirname, resolve } from "node:path";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
|
|
22
|
+
export const LEGACY_NAME = "karajan-code";
|
|
23
|
+
export const SCOPED_NAME = "@karajan-family/code";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Ejecuta `fn` con el manifest renombrado al scoped (+ publishConfig public,
|
|
27
|
+
* obligatorio para scoped) y lo RESTAURA byte a byte pase lo que pase.
|
|
28
|
+
*/
|
|
29
|
+
export async function withScopedName(repoRoot, fn) {
|
|
30
|
+
const pkgPath = join(repoRoot, "package.json");
|
|
31
|
+
const original = readFileSync(pkgPath, "utf8");
|
|
32
|
+
const pkg = JSON.parse(original);
|
|
33
|
+
if (pkg.name !== LEGACY_NAME) {
|
|
34
|
+
throw new Error(`dual-publish: el manifest dice "${pkg.name}" y solo se renombra desde ${LEGACY_NAME} — jamás a ciegas`);
|
|
35
|
+
}
|
|
36
|
+
// publishConfig se MERGEA, no se pisa (catch de codex): un registry/tag
|
|
37
|
+
// preexistente debe sobrevivir al publish scoped.
|
|
38
|
+
writeFileSync(pkgPath, `${JSON.stringify({ ...pkg, name: SCOPED_NAME, publishConfig: { ...pkg.publishConfig, access: "public" } }, null, 2)}\n`, "utf8");
|
|
39
|
+
try {
|
|
40
|
+
return await fn();
|
|
41
|
+
} finally {
|
|
42
|
+
writeFileSync(pkgPath, original, "utf8");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// argv[1] normalizado (catch de codex): node lo absolutiza hoy, pero el
|
|
47
|
+
// guard no debe depender de ese detalle de implementación.
|
|
48
|
+
const isMain = process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1]);
|
|
49
|
+
if (isMain) {
|
|
50
|
+
const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
51
|
+
const args = process.argv.slice(2);
|
|
52
|
+
const publish = args.includes("--publish");
|
|
53
|
+
const otp = args.find((a) => a.startsWith("--otp="))?.slice(6);
|
|
54
|
+
await withScopedName(repoRoot, async () => {
|
|
55
|
+
console.log(`dual-publish: manifest → ${SCOPED_NAME} (temporal)`);
|
|
56
|
+
// La E2E real: empaqueta el scoped, instálalo aislado y corre kj.
|
|
57
|
+
execFileSync("node", [join(repoRoot, "scripts", "verify-pack.mjs")], { cwd: repoRoot, stdio: "inherit" });
|
|
58
|
+
if (publish) {
|
|
59
|
+
const pubArgs = ["publish", "--ignore-scripts", ...(otp ? [`--otp=${otp}`] : [])];
|
|
60
|
+
console.log(`dual-publish: npm ${pubArgs.join(" ").replace(/--otp=\S+/, "--otp=***")}`);
|
|
61
|
+
execFileSync("npm", pubArgs, { cwd: repoRoot, stdio: "inherit" });
|
|
62
|
+
} else {
|
|
63
|
+
console.log("dual-publish: --pack-only — verificado y SIN publicar (usa --publish en la release)");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
console.log(`dual-publish: manifest restaurado a ${LEGACY_NAME} ✓`);
|
|
67
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* esbuild configuration for Node.js SEA (Single Executable Application) bundle.
|
|
3
|
+
*
|
|
4
|
+
* Bundles the entire CLI into a single CJS file suitable for SEA injection.
|
|
5
|
+
* A plugin handles:
|
|
6
|
+
* 1. import.meta.url / import.meta.dirname -> CJS equivalents
|
|
7
|
+
* 2. Top-level await in cli.js -> async IIFE wrapper
|
|
8
|
+
* 3. Runtime package.json reads -> inlined version string
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import fs from "node:fs/promises";
|
|
13
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
14
|
+
import { fileURLToPath } from "node:url";
|
|
15
|
+
|
|
16
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
17
|
+
const PKG_VERSION = JSON.parse(readFileSync(path.join(ROOT, "package.json"), "utf8")).version;
|
|
18
|
+
|
|
19
|
+
const seaTransformPlugin = {
|
|
20
|
+
name: "sea-transform",
|
|
21
|
+
setup(build) {
|
|
22
|
+
// Only process real files. Imports redirected by hu-board-stub (or any
|
|
23
|
+
// other namespaced plugin) MUST not pass through this transform —
|
|
24
|
+
// their `args.path` is a virtual id, not a path readFile can open.
|
|
25
|
+
build.onLoad({ filter: /\.m?js$/, namespace: "file" }, async (args) => {
|
|
26
|
+
let contents = await fs.readFile(args.path, "utf8");
|
|
27
|
+
let modified = false;
|
|
28
|
+
|
|
29
|
+
// Replace import.meta.dirname with __dirname
|
|
30
|
+
if (contents.includes("import.meta.dirname")) {
|
|
31
|
+
contents = contents.replaceAll("import.meta.dirname", "__dirname");
|
|
32
|
+
modified = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Replace import.meta.url with CJS equivalent
|
|
36
|
+
if (contents.includes("import.meta.url")) {
|
|
37
|
+
contents = contents.replaceAll(
|
|
38
|
+
"import.meta.url",
|
|
39
|
+
'require("node:url").pathToFileURL(__filename).href'
|
|
40
|
+
);
|
|
41
|
+
modified = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Inline version: replace any pattern that reads ../../package.json or ../package.json
|
|
45
|
+
// to extract the version, with the hardcoded version string.
|
|
46
|
+
// Covers cli.js, display.js, doctor.js, bootstrap.js, init.js, server.js
|
|
47
|
+
if (contents.includes("package.json") && contents.match(/["']\.\.\/.*package\.json/)) {
|
|
48
|
+
// Pattern: const X = path.resolve(..., "../../package.json");
|
|
49
|
+
// const Y = JSON.parse(readFileSync(X, "utf8")).version;
|
|
50
|
+
// Replace both lines with: const Y = "1.57.0";
|
|
51
|
+
contents = contents.replace(
|
|
52
|
+
/const (\w+) = (?:path\.resolve|resolve)\(.*?["']\.\.\/.*?package\.json["']\);\s*\n\s*(?:const|return) (\w+) = JSON\.parse\(.*?readFileSync\(\1.*?\).*?\.version;/g,
|
|
53
|
+
`const $2 = ${JSON.stringify(PKG_VERSION)};`
|
|
54
|
+
);
|
|
55
|
+
// Single-line pattern: return JSON.parse(readFileSync(pkgPath...)).version
|
|
56
|
+
contents = contents.replace(
|
|
57
|
+
/const (\w+) = (?:path\.resolve|resolve)\(.*?["']\.\.\/.*?package\.json["']\);\s*\n\s*return JSON\.parse\(.*?readFileSync\(\1.*?\).*?\.version;/g,
|
|
58
|
+
`return ${JSON.stringify(PKG_VERSION)};`
|
|
59
|
+
);
|
|
60
|
+
// Pattern in cli.js: const PKG_PATH = ...; const PKG_VERSION = ...;
|
|
61
|
+
contents = contents.replace(
|
|
62
|
+
/const PKG_PATH = .*?package\.json.*?;\s*\nconst PKG_VERSION = .*?\.version;/,
|
|
63
|
+
`const PKG_VERSION = ${JSON.stringify(PKG_VERSION)};`
|
|
64
|
+
);
|
|
65
|
+
// Pattern in display.js: const DISPLAY_PKG_PATH = ...; const DISPLAY_VERSION = ...;
|
|
66
|
+
contents = contents.replace(
|
|
67
|
+
/const DISPLAY_PKG_PATH = .*?package\.json.*?;\s*\nconst DISPLAY_VERSION = .*?\.version;/,
|
|
68
|
+
`const DISPLAY_VERSION = ${JSON.stringify(PKG_VERSION)};`
|
|
69
|
+
);
|
|
70
|
+
// Pattern in server.js: const PKG_PATH = ...; (used later to read version)
|
|
71
|
+
contents = contents.replace(
|
|
72
|
+
/const PKG_PATH = .*?package\.json.*?;\s*\nconst PKG = JSON\.parse\(readFileSync\(PKG_PATH.*?\)\);/,
|
|
73
|
+
`const PKG = { version: ${JSON.stringify(PKG_VERSION)}, name: "karajan-code" };`
|
|
74
|
+
);
|
|
75
|
+
modified = true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Wrap top-level await in cli.js inside an async IIFE
|
|
79
|
+
if (args.path.endsWith("src/cli.js") || args.path.endsWith("src\\cli.js")) {
|
|
80
|
+
contents = contents.replace(
|
|
81
|
+
/^(try\s*\{[\s\S]*?await\s+program\.parseAsync\(\)[\s\S]*?^\})\s*$/m,
|
|
82
|
+
"(async () => {\n$1\n})();"
|
|
83
|
+
);
|
|
84
|
+
modified = true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return modified ? { contents, loader: "js" } : undefined;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Stub plugin for the HU Board package (KJC-BUG-0040).
|
|
94
|
+
*
|
|
95
|
+
* The HU Board lives in `packages/hu-board/` and requires `better-sqlite3`
|
|
96
|
+
* — a native node-gyp module that esbuild cannot resolve at bundle time
|
|
97
|
+
* (it has no JS entry point, only `.node` binaries compiled per platform).
|
|
98
|
+
*
|
|
99
|
+
* The SEA binary is the lean CLI distribution. Users who want the HU
|
|
100
|
+
* Board install via `npm install -g karajan-code`, which installs
|
|
101
|
+
* better-sqlite3 normally. So the right answer is: do NOT include
|
|
102
|
+
* `packages/hu-board/` in the SEA bundle at all.
|
|
103
|
+
*
|
|
104
|
+
* This plugin intercepts every import / dynamic import that points into
|
|
105
|
+
* `packages/hu-board/src/*` and rewrites it to a stub module that throws
|
|
106
|
+
* a clear, actionable error when invoked at runtime — instead of failing
|
|
107
|
+
* silently during bundling.
|
|
108
|
+
*/
|
|
109
|
+
const huBoardStubPlugin = {
|
|
110
|
+
name: "hu-board-stub",
|
|
111
|
+
setup(build) {
|
|
112
|
+
build.onResolve({ filter: /packages[\\/]hu-board[\\/]src[\\/].*/ }, (args) => ({
|
|
113
|
+
path: args.path,
|
|
114
|
+
namespace: "hu-board-stub",
|
|
115
|
+
}));
|
|
116
|
+
build.onLoad({ filter: /.*/, namespace: "hu-board-stub" }, () => ({
|
|
117
|
+
contents: `
|
|
118
|
+
const NOT_AVAILABLE = "The HU Board is not available in this standalone binary.\\n" +
|
|
119
|
+
"Install karajan-code from npm to get the dashboard:\\n" +
|
|
120
|
+
" npm install -g karajan-code\\n";
|
|
121
|
+
function notAvailable() { throw new Error(NOT_AVAILABLE); }
|
|
122
|
+
// Explicit named exports for every symbol the CLI imports from
|
|
123
|
+
// hu-board. Adding them by name (rather than relying on a Proxy)
|
|
124
|
+
// avoids esbuild's CJS↔ESM interop confusion: a Proxy that
|
|
125
|
+
// returns truthy for "__esModule" makes esbuild wrap the import
|
|
126
|
+
// and the destructured names resolve to undefined.
|
|
127
|
+
module.exports = {
|
|
128
|
+
__esModule: false,
|
|
129
|
+
initDb: notAvailable,
|
|
130
|
+
closeDb: notAvailable,
|
|
131
|
+
cleanupZombies: notAvailable,
|
|
132
|
+
// Catch-all default so \`import foo from\` and \`import * as foo\`
|
|
133
|
+
// also throw the same message instead of returning undefined.
|
|
134
|
+
default: notAvailable,
|
|
135
|
+
};
|
|
136
|
+
`,
|
|
137
|
+
loader: "js",
|
|
138
|
+
}));
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Same reasoning as the HU Board stub: src/rag/* + src/commands/rag.js
|
|
143
|
+
// depend on better-sqlite3 + sqlite-vec, native modules that esbuild
|
|
144
|
+
// cannot bundle. The SEA binary stubs them out and tells the user to
|
|
145
|
+
// install via npm to get RAG. KJC-PCS-0049 / Step 6.
|
|
146
|
+
const ragStubPlugin = {
|
|
147
|
+
name: "rag-stub",
|
|
148
|
+
setup(build) {
|
|
149
|
+
// KJC-TSK-0704 — src/privacy/* rides this stub too: its engine is redactPII.
|
|
150
|
+
build.onResolve({ filter: /[\\/](rag[\\/].+|privacy[\\/].+|commands[\\/](rag|watch|privacy))\.js$/ }, (args) => ({
|
|
151
|
+
path: args.path, namespace: "rag-stub",
|
|
152
|
+
}));
|
|
153
|
+
build.onLoad({ filter: /.*/, namespace: "rag-stub" }, () => ({
|
|
154
|
+
contents: `
|
|
155
|
+
const NOT_AVAILABLE = "The RAG subsystem is not available in this standalone binary.\\n" +
|
|
156
|
+
"Install karajan-code from npm to get \\\`kj rag\\\`:\\n" +
|
|
157
|
+
" npm install -g karajan-code\\n";
|
|
158
|
+
function notAvailable() { throw new Error(NOT_AVAILABLE); }
|
|
159
|
+
module.exports = {
|
|
160
|
+
__esModule: false,
|
|
161
|
+
ragIndexCommand: notAvailable, ragQueryCommand: notAvailable,
|
|
162
|
+
openVecStore: notAvailable, OllamaEmbedder: notAvailable,
|
|
163
|
+
indexFile: notAvailable, indexProject: notAvailable,
|
|
164
|
+
query: notAvailable, chunkMarkdown: notAvailable, chunkPlan: notAvailable, chunkSource: notAvailable,
|
|
165
|
+
// KJC-TSK-0435 — Ollama Docker manager.
|
|
166
|
+
ollamaUp: notAvailable, ollamaDown: notAvailable, ensureComposeFile: notAvailable,
|
|
167
|
+
isOllamaReachable: notAvailable, findAvailableOllamaPort: notAvailable,
|
|
168
|
+
waitForOllamaReady: notAvailable, buildComposeTemplate: notAvailable, normalizeOllamaConfig: notAvailable,
|
|
169
|
+
// KJC-TSK-0436 — Ollama capability check + model pull.
|
|
170
|
+
checkDockerAvailable: notAvailable, checkRamCapacity: notAvailable,
|
|
171
|
+
checkOllamaCapability: notAvailable, pullOllamaModel: notAvailable,
|
|
172
|
+
// KJC-TSK-0438 — RAG project isolation.
|
|
173
|
+
projectSlug: notAvailable,
|
|
174
|
+
// KJC-TSK-0441 — RAG chokidar watcher.
|
|
175
|
+
startWatcher: notAvailable, readPidFile: notAvailable, clearPidFile: notAvailable,
|
|
176
|
+
isPidAlive: notAvailable, writePidFile: notAvailable,
|
|
177
|
+
// KJC-TSK-0442 / KJC-TSK-0446 — RAG embedders cloud + factory.
|
|
178
|
+
makeEmbedder: notAvailable, OpenAIEmbedder: notAvailable, VoyageEmbedder: notAvailable,
|
|
179
|
+
OpenAIEmbedderError: notAvailable, VoyageEmbedderError: notAvailable, PROVIDERS: notAvailable,
|
|
180
|
+
CohereEmbedder: notAvailable, CohereEmbedderError: notAvailable,
|
|
181
|
+
MistralEmbedder: notAvailable, MistralEmbedderError: notAvailable,
|
|
182
|
+
ONNXEmbedder: notAvailable, ONNXEmbedderError: notAvailable,
|
|
183
|
+
// KJC-TSK-0448 — RAG --where metadata filter.
|
|
184
|
+
parseWhere: notAvailable, buildWhereSql: notAvailable,
|
|
185
|
+
// KJC-TSK-0449 — RAG cross-encoder rerank.
|
|
186
|
+
rerank: notAvailable, RerankError: notAvailable, _resetPipeline: notAvailable,
|
|
187
|
+
// KJC-BUG-0097 — src/rag/auto-update.js lives under src/rag/ so it is
|
|
188
|
+
// caught by this stub, but its exports are called on the hot path.
|
|
189
|
+
// maybeAutoUpdate() runs on EVERY \`kj run\` (run.js): it must be a
|
|
190
|
+
// silent no-op here (RAG index is unavailable in SEA anyway), NOT an
|
|
191
|
+
// absent symbol — otherwise the whole command crashes with
|
|
192
|
+
// "maybeAutoUpdate is not a function". installPostMergeHook() is only
|
|
193
|
+
// reached from \`kj rag install-hooks\`, so it degrades like the rest.
|
|
194
|
+
maybeAutoUpdate: async () => ({ skipped: true }),
|
|
195
|
+
installPostMergeHook: notAvailable,
|
|
196
|
+
// KJC-TSK-0704 — privacy scan (engine = karajan-rag redactPII).
|
|
197
|
+
privacyScanCommand: notAvailable, loadPrivacyList: notAvailable,
|
|
198
|
+
scanText: notAvailable, scanPaths: notAvailable, privacyConfigPath: notAvailable,
|
|
199
|
+
ensurePrivacyList: async () => ({ created: false, reason: "sea-stub" }),
|
|
200
|
+
// KJC-BUG-0100 — the doctor rag-hooks check imports this; it throws
|
|
201
|
+
// here and the check swallows it (degrades to a benign info result).
|
|
202
|
+
resolveHooksDir: notAvailable,
|
|
203
|
+
default: notAvailable,
|
|
204
|
+
};
|
|
205
|
+
`,
|
|
206
|
+
loader: "js",
|
|
207
|
+
}));
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// KJC-TSK-0472 — audit-history sqlite stub (same reasoning as rag/hu-board stubs).
|
|
212
|
+
const auditHistoryStubPlugin = {
|
|
213
|
+
name: "audit-history-stub",
|
|
214
|
+
setup(b) {
|
|
215
|
+
b.onResolve({ filter: /[\\/]audit[\\/]audit-history\.js$/ }, (a) => ({ path: a.path, namespace: "ahs" }));
|
|
216
|
+
b.onLoad({ filter: /.*/, namespace: "ahs" }, () => ({ contents: "module.exports = { __esModule: false, persistAuditRun: () => ({ ok: false, error: 'history disabled in SEA' }), getAuditHistoryDbPath: () => null, openAuditHistoryDb: () => null, recordAuditRun: () => null, listRecentRuns: () => [], countRuns: () => 0, pruneOldRuns: () => 0, getLatestPreviousRun: () => null, getRecentScores: () => [] };", loader: "js" }));
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/** @type {import('esbuild').BuildOptions} */
|
|
221
|
+
/**
|
|
222
|
+
* List every built-in template file, as paths relative to templates/
|
|
223
|
+
* (KJC-BUG-0104). The SEA binary ships them as SEA assets — build-sea.mjs
|
|
224
|
+
* turns this list into the sea-config `assets` map plus an index the
|
|
225
|
+
* runtime (src/utils/templates-root.js) uses to extract them on first use.
|
|
226
|
+
* Exported (instead of living in build-sea.mjs, which runs main() on
|
|
227
|
+
* import) so tests can exercise it.
|
|
228
|
+
*/
|
|
229
|
+
export function collectTemplateFiles(rootDir = path.join(ROOT, "templates")) {
|
|
230
|
+
const files = [];
|
|
231
|
+
const walk = (dir) => {
|
|
232
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
233
|
+
const p = path.join(dir, entry.name);
|
|
234
|
+
if (entry.isDirectory()) walk(p);
|
|
235
|
+
else files.push(path.relative(rootDir, p));
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
walk(rootDir);
|
|
239
|
+
return files.sort();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export const seaBuildOptions = {
|
|
243
|
+
entryPoints: ["src/cli.js"],
|
|
244
|
+
outfile: "dist/kj-bundle.cjs",
|
|
245
|
+
format: "cjs",
|
|
246
|
+
platform: "node",
|
|
247
|
+
target: "node20",
|
|
248
|
+
bundle: true,
|
|
249
|
+
minify: false,
|
|
250
|
+
// better-sqlite3 is a native module imported by packages/hu-board/src/db.js.
|
|
251
|
+
// The hu-board-stub plugin below replaces the whole hu-board package so
|
|
252
|
+
// this `external` entry is belt-and-braces — if any other dependency
|
|
253
|
+
// pulls better-sqlite3 in we want a clear "not bundled" error, not a
|
|
254
|
+
// silent half-bundle.
|
|
255
|
+
//
|
|
256
|
+
// madge (KJC-TSK v2.17): pulled in by src/audit/circular-deps.js via a
|
|
257
|
+
// dynamic import. Madge transitively depends on @vue/compiler-sfc which
|
|
258
|
+
// optionally requires ~20 template engines (velocityjs, dustjs-linkedin,
|
|
259
|
+
// twig, …) that are not installed — esbuild fails the bundle if it
|
|
260
|
+
// tries to walk those. Marking madge external keeps `kj audit` working
|
|
261
|
+
// in npm-installed Karajan (madge is in node_modules) and degrades
|
|
262
|
+
// gracefully in the SEA binary (the dynamic import fails → audit
|
|
263
|
+
// continues without circular-dep findings).
|
|
264
|
+
// knip (KJC-TSK v2.17): invoked as a subprocess by src/audit/dead-exports.js
|
|
265
|
+
// via `process.execPath knip-bin --reporter json`. Its native parser
|
|
266
|
+
// (oxc-parser, oxc-resolver) and CLI machinery must not be bundled. In SEA
|
|
267
|
+
// builds the createRequire(import.meta.url).resolve("knip/bin/knip.js")
|
|
268
|
+
// throws → collector returns available:false. npm installs get knip
|
|
269
|
+
// resolved normally from node_modules.
|
|
270
|
+
external: ["better-sqlite3", "madge", "knip", "oxc-parser", "oxc-resolver"],
|
|
271
|
+
plugins: [seaTransformPlugin, huBoardStubPlugin, ragStubPlugin, auditHistoryStubPlugin],
|
|
272
|
+
logLevel: "info",
|
|
273
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# KJC-TSK-0455 — Auto-refresh the local RAG index after a merge so retrieval
|
|
3
|
+
# never serves stale code. Installed by `kj rag install-hooks`. The marker
|
|
4
|
+
# in this comment is how the installer tells kj-managed hooks from user hooks.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
if command -v kj >/dev/null 2>&1; then
|
|
7
|
+
kj rag index --since auto >/dev/null 2>&1 || true
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
# KJC-TSK-0507 — Refresh the per-project QMD semantic wiki when the merge
|
|
11
|
+
# touched indexable folders (docs/, .reviews/, .karajan/plans/). Background
|
|
12
|
+
# so it never blocks the user's `git pull` / `git merge`.
|
|
13
|
+
if command -v qmd >/dev/null 2>&1; then
|
|
14
|
+
if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null \
|
|
15
|
+
| grep -qE '^(docs/|\.reviews/|\.karajan/plans/)'; then
|
|
16
|
+
(qmd update >/dev/null 2>&1 || true) &
|
|
17
|
+
fi
|
|
18
|
+
fi
|