@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,112 @@
|
|
|
1
|
+
// Chrome DevTools MCP detection and WebPerf skill auto-installation.
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import { isOpenSkillsAvailable, listSkills } from "../skills/openskills-client.js";
|
|
7
|
+
|
|
8
|
+
/** Skill names relevant for WebPerf analysis. Already installed globally via openskills. */
|
|
9
|
+
export const WEBPERF_SKILLS = [
|
|
10
|
+
"optimize",
|
|
11
|
+
"audit",
|
|
12
|
+
"polish"
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Check whether Chrome DevTools MCP is configured and available.
|
|
17
|
+
* Checks: (1) config flag, (2) Claude MCP config (~/.claude.json), (3) VS Code MCP settings.
|
|
18
|
+
* @param {object} config - merged Karajan config
|
|
19
|
+
* @returns {boolean}
|
|
20
|
+
*/
|
|
21
|
+
export function isDevToolsMcpAvailable(config) {
|
|
22
|
+
// Explicit config flag takes priority
|
|
23
|
+
if (config?.webperf?.devtools_mcp === true) return true;
|
|
24
|
+
if (config?.webperf?.devtools_mcp === false) return false;
|
|
25
|
+
|
|
26
|
+
// Check cached detection result
|
|
27
|
+
if (_devToolsDetected !== null) return _devToolsDetected;
|
|
28
|
+
|
|
29
|
+
// Not yet detected - return false (async detection runs at init)
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let _devToolsDetected = null;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Auto-detect Chrome DevTools MCP from system configuration.
|
|
37
|
+
* Checks ~/.claude.json and VS Code MCP settings.
|
|
38
|
+
* Call once at pipeline init.
|
|
39
|
+
*/
|
|
40
|
+
export async function detectDevToolsMcp(logger) {
|
|
41
|
+
// Check Claude MCP config
|
|
42
|
+
const claudeConfigPath = path.join(os.homedir(), ".claude.json");
|
|
43
|
+
try {
|
|
44
|
+
const raw = await fs.readFile(claudeConfigPath, "utf8");
|
|
45
|
+
const parsed = JSON.parse(raw);
|
|
46
|
+
const mcpServers = parsed?.mcpServers || parsed?.mcp_servers || {};
|
|
47
|
+
if (mcpServers["chrome-devtools"] || mcpServers["chrome_devtools"]) {
|
|
48
|
+
_devToolsDetected = true;
|
|
49
|
+
logger?.info?.("Chrome DevTools MCP detected in ~/.claude.json");
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
} catch { /* file not found or parse error */ }
|
|
53
|
+
|
|
54
|
+
// Check VS Code MCP settings
|
|
55
|
+
const vscodePaths = [
|
|
56
|
+
path.join(os.homedir(), ".vscode", "settings.json"),
|
|
57
|
+
path.join(process.cwd(), ".vscode", "settings.json")
|
|
58
|
+
];
|
|
59
|
+
for (const vscPath of vscodePaths) {
|
|
60
|
+
try {
|
|
61
|
+
const raw = await fs.readFile(vscPath, "utf8");
|
|
62
|
+
if (raw.includes("chrome-devtools") || raw.includes("chrome_devtools")) {
|
|
63
|
+
_devToolsDetected = true;
|
|
64
|
+
logger?.info?.(`Chrome DevTools MCP detected in ${vscPath}`);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
} catch { /* not found */ }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_devToolsDetected = false;
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Ensure WebPerf skills are installed via OpenSkills.
|
|
76
|
+
* Installs any missing skills from WEBPERF_SKILLS.
|
|
77
|
+
* @param {string} projectDir - absolute path to the project root
|
|
78
|
+
* @param {object} [logger] - optional logger ({ info, warn })
|
|
79
|
+
* @returns {Promise<{ installed: string[], alreadyInstalled: string[], skipped: string[] }>}
|
|
80
|
+
*/
|
|
81
|
+
export async function ensureWebPerfSkills(projectDir, logger) {
|
|
82
|
+
const result = { installed: [], alreadyInstalled: [], skipped: [] };
|
|
83
|
+
|
|
84
|
+
const available = await isOpenSkillsAvailable();
|
|
85
|
+
if (!available) {
|
|
86
|
+
logger?.debug?.("OpenSkills CLI not available - WebPerf skills unavailable");
|
|
87
|
+
result.skipped = [...WEBPERF_SKILLS];
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// List skills (includes global installs)
|
|
92
|
+
const listResult = await listSkills({ projectDir });
|
|
93
|
+
const installedNames = new Set(
|
|
94
|
+
(listResult.ok ? listResult.skills : []).map(s => s.name)
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
for (const skill of WEBPERF_SKILLS) {
|
|
98
|
+
if (installedNames.has(skill)) {
|
|
99
|
+
result.alreadyInstalled.push(skill);
|
|
100
|
+
} else {
|
|
101
|
+
// Skills should be installed globally via `openskills install owner/repo`
|
|
102
|
+
// Don't attempt auto-install with bare names — just note they're missing
|
|
103
|
+
result.skipped.push(skill);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (result.alreadyInstalled.length > 0) {
|
|
108
|
+
logger?.info?.(`WebPerf skills available: ${result.alreadyInstalled.join(", ")}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web performance scanner — KJC-TSK-0149.
|
|
3
|
+
*
|
|
4
|
+
* Wraps Google's Lighthouse CLI (`lighthouse`) to produce a structured
|
|
5
|
+
* Core Web Vitals + opportunity report against a local URL. Same
|
|
6
|
+
* pattern as sonar-findings.js, osv-findings.js, semgrep-findings.js:
|
|
7
|
+
* best-effort, missing binary returns {ok:false, reason}, all heavy
|
|
8
|
+
* lifting happens in an external tool the user installs themselves.
|
|
9
|
+
*
|
|
10
|
+
* Output shape is designed to feed two downstream consumers:
|
|
11
|
+
* 1. The CLI `kj webperf <url>` (KJC-TSK-0149) — print JSON or human
|
|
12
|
+
* report, optionally persist to config.webperf.lastResult.
|
|
13
|
+
* 2. `kj audit` WebPerf section (KJC-TSK-0360) — the `cwv-result` mode
|
|
14
|
+
* reads exactly this shape from `config.webperf.lastResult`.
|
|
15
|
+
*
|
|
16
|
+
* Lighthouse JSON schema reference:
|
|
17
|
+
* https://github.com/GoogleChrome/lighthouse/blob/main/types/lhr/lhr.d.ts
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { execFile } from "node:child_process";
|
|
21
|
+
import { promisify } from "node:util";
|
|
22
|
+
import { evaluateCwv, CWV_THRESHOLDS } from "./cwv-gate.js";
|
|
23
|
+
|
|
24
|
+
const execFileAsync = promisify(execFile);
|
|
25
|
+
|
|
26
|
+
const SCAN_TIMEOUT_MS = 120_000;
|
|
27
|
+
const MAX_OPPORTUNITIES = 20;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Opportunity audits we extract from Lighthouse output. Each maps to a
|
|
31
|
+
* known render-perf issue with actionable fixes; we keep the list short
|
|
32
|
+
* to bound the payload size and keep the LLM prompt tight when this
|
|
33
|
+
* result feeds `kj audit`.
|
|
34
|
+
*/
|
|
35
|
+
const OPPORTUNITY_AUDITS = [
|
|
36
|
+
"render-blocking-resources",
|
|
37
|
+
"unused-css-rules",
|
|
38
|
+
"unused-javascript",
|
|
39
|
+
"unminified-css",
|
|
40
|
+
"unminified-javascript",
|
|
41
|
+
"modern-image-formats",
|
|
42
|
+
"uses-optimized-images",
|
|
43
|
+
"uses-text-compression",
|
|
44
|
+
"uses-responsive-images",
|
|
45
|
+
"uses-rel-preconnect",
|
|
46
|
+
"uses-rel-preload",
|
|
47
|
+
"font-display",
|
|
48
|
+
"preload-lcp-image",
|
|
49
|
+
"lcp-lazy-loaded",
|
|
50
|
+
"non-composited-animations",
|
|
51
|
+
"third-party-summary",
|
|
52
|
+
"bootup-time",
|
|
53
|
+
"mainthread-work-breakdown",
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Run Lighthouse against a URL and return a structured result.
|
|
58
|
+
*
|
|
59
|
+
* @param {string} url - target URL (must be reachable from the runner)
|
|
60
|
+
* @param {object} [opts]
|
|
61
|
+
* @param {object} [opts.thresholds] - CWV thresholds override (passed to evaluateCwv)
|
|
62
|
+
* @param {object} [opts.logger]
|
|
63
|
+
* @param {string} [opts.preset] - "desktop" or "mobile" (default: desktop)
|
|
64
|
+
* @param {number} [opts.timeoutMs] - override the 120s default
|
|
65
|
+
* @returns {Promise<object>} scanner result (see module JSDoc)
|
|
66
|
+
*/
|
|
67
|
+
export async function runWebperfScan(url, opts = {}) {
|
|
68
|
+
if (!url || typeof url !== "string") {
|
|
69
|
+
return { ok: false, reason: "no URL provided" };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const logger = opts.logger || null;
|
|
73
|
+
const preset = opts.preset === "mobile" ? "mobile" : "desktop";
|
|
74
|
+
const timeoutMs = opts.timeoutMs || SCAN_TIMEOUT_MS;
|
|
75
|
+
|
|
76
|
+
const lighthouseArgs = [
|
|
77
|
+
url,
|
|
78
|
+
"--output=json",
|
|
79
|
+
"--quiet",
|
|
80
|
+
"--chrome-flags=--headless --no-sandbox --disable-gpu",
|
|
81
|
+
`--preset=${preset}`,
|
|
82
|
+
"--only-categories=performance",
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
let stdout;
|
|
86
|
+
try {
|
|
87
|
+
const result = await execFileAsync("lighthouse", lighthouseArgs, {
|
|
88
|
+
timeout: timeoutMs,
|
|
89
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
90
|
+
});
|
|
91
|
+
stdout = result.stdout;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
if (err.code === "ENOENT") {
|
|
94
|
+
if (logger?.warn) logger.warn("lighthouse not found in PATH — install via 'npm install -g lighthouse'");
|
|
95
|
+
return { ok: false, reason: "lighthouse not installed", url };
|
|
96
|
+
}
|
|
97
|
+
if (err.killed) {
|
|
98
|
+
return { ok: false, reason: `lighthouse timed out after ${timeoutMs}ms`, url };
|
|
99
|
+
}
|
|
100
|
+
if (typeof err.stdout === "string" && err.stdout.trim().startsWith("{")) {
|
|
101
|
+
stdout = err.stdout;
|
|
102
|
+
} else {
|
|
103
|
+
const stderr = (err.stderr || "").trim().split("\n").pop() || err.message;
|
|
104
|
+
// Lighthouse prints clear NO_DCHECK / NO_NAVSTART errors when the URL
|
|
105
|
+
// is unreachable. Surface that verbatim.
|
|
106
|
+
const reason = /failed to fetch|connection refused|net::|navigation_start_time/i.test(stderr)
|
|
107
|
+
? `URL ${url} not reachable: ${stderr}`
|
|
108
|
+
: `lighthouse failed: ${stderr}`;
|
|
109
|
+
if (logger?.warn) logger.warn(reason);
|
|
110
|
+
return { ok: false, reason, url };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let report;
|
|
115
|
+
try {
|
|
116
|
+
report = JSON.parse(stdout);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
return { ok: false, reason: `lighthouse output not parseable: ${err.message}`, url };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return parseLighthouseReport(report, { url, preset, thresholds: opts.thresholds });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Convert a raw Lighthouse JSON report into the scanner's flat output.
|
|
126
|
+
* Public so tests can drive parsing without spawning lighthouse.
|
|
127
|
+
*
|
|
128
|
+
* @param {object} report - parsed Lighthouse output (lhr)
|
|
129
|
+
* @param {{url: string, preset?: string, thresholds?: object}} ctx
|
|
130
|
+
*/
|
|
131
|
+
export function parseLighthouseReport(report, ctx = {}) {
|
|
132
|
+
const audits = report?.audits || {};
|
|
133
|
+
const metrics = extractMetrics(audits);
|
|
134
|
+
const issues = extractIssues(audits);
|
|
135
|
+
const cwv = evaluateCwv(metrics, ctx.thresholds || CWV_THRESHOLDS);
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
ok: true,
|
|
139
|
+
url: ctx.url || report?.finalDisplayedUrl || report?.requestedUrl || null,
|
|
140
|
+
preset: ctx.preset || "desktop",
|
|
141
|
+
capturedAt: report?.fetchTime || new Date().toISOString(),
|
|
142
|
+
lighthouseVersion: report?.lighthouseVersion || null,
|
|
143
|
+
performanceScore: typeof report?.categories?.performance?.score === "number"
|
|
144
|
+
? Math.round(report.categories.performance.score * 100)
|
|
145
|
+
: null,
|
|
146
|
+
metrics,
|
|
147
|
+
cwv,
|
|
148
|
+
issues,
|
|
149
|
+
thresholds: ctx.thresholds || CWV_THRESHOLDS,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Pull Core Web Vitals + supporting metrics out of the Lighthouse audit
|
|
155
|
+
* collection. `numericValue` is the raw measurement Google reports (ms
|
|
156
|
+
* for time-based metrics, score 0-1 for CLS).
|
|
157
|
+
*/
|
|
158
|
+
function extractMetrics(audits) {
|
|
159
|
+
const get = (id) => {
|
|
160
|
+
const v = audits[id]?.numericValue;
|
|
161
|
+
return typeof v === "number" ? v : null;
|
|
162
|
+
};
|
|
163
|
+
return {
|
|
164
|
+
// CWV — these three drive the cwv-gate verdict
|
|
165
|
+
lcp: get("largest-contentful-paint"),
|
|
166
|
+
cls: get("cumulative-layout-shift"),
|
|
167
|
+
inp: get("interaction-to-next-paint") ?? get("max-potential-fid"),
|
|
168
|
+
// Supporting (informational)
|
|
169
|
+
fcp: get("first-contentful-paint"),
|
|
170
|
+
tbt: get("total-blocking-time"),
|
|
171
|
+
si: get("speed-index"),
|
|
172
|
+
tti: get("interactive"),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Distil the Lighthouse opportunity audits into a flat `issues` array.
|
|
178
|
+
* Each issue carries the audit id, score, savings (when applicable) and
|
|
179
|
+
* a one-line description so consumers can prioritise without parsing
|
|
180
|
+
* the full lhr.
|
|
181
|
+
*/
|
|
182
|
+
function extractIssues(audits) {
|
|
183
|
+
const issues = [];
|
|
184
|
+
for (const id of OPPORTUNITY_AUDITS) {
|
|
185
|
+
const audit = audits[id];
|
|
186
|
+
if (!audit) continue;
|
|
187
|
+
// score === 1 means "passed" — skip clean audits
|
|
188
|
+
if (typeof audit.score === "number" && audit.score >= 1) continue;
|
|
189
|
+
if (audit.scoreDisplayMode === "notApplicable") continue;
|
|
190
|
+
issues.push({
|
|
191
|
+
id,
|
|
192
|
+
title: audit.title || id,
|
|
193
|
+
score: typeof audit.score === "number" ? audit.score : null,
|
|
194
|
+
savingsMs: audit.details?.overallSavingsMs ?? null,
|
|
195
|
+
savingsBytes: audit.details?.overallSavingsBytes ?? null,
|
|
196
|
+
severity: scoreToSeverity(audit.score),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return issues
|
|
200
|
+
.sort((a, b) => (b.savingsMs || 0) - (a.savingsMs || 0))
|
|
201
|
+
.slice(0, MAX_OPPORTUNITIES);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function scoreToSeverity(score) {
|
|
205
|
+
if (typeof score !== "number") return "info";
|
|
206
|
+
if (score < 0.5) return "high";
|
|
207
|
+
if (score < 0.9) return "medium";
|
|
208
|
+
return "low";
|
|
209
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration helpers that format CWV gate results for the
|
|
3
|
+
* impeccable prompt and for pipeline progress events.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const RATING_ICONS = { good: "PASS", "needs-improvement": "WARN", poor: "FAIL" };
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build a human-readable section for the impeccable prompt.
|
|
10
|
+
*
|
|
11
|
+
* @param {{ pass: boolean, scores: object, blocking: Array, advisory: Array }} cwvResult
|
|
12
|
+
* @returns {string}
|
|
13
|
+
*/
|
|
14
|
+
export function buildWebPerfSection(cwvResult) {
|
|
15
|
+
const lines = [];
|
|
16
|
+
const verdict = cwvResult.pass ? "PASSED" : "FAILED";
|
|
17
|
+
lines.push(`## WebPerf — Core Web Vitals (${verdict})`);
|
|
18
|
+
lines.push("");
|
|
19
|
+
|
|
20
|
+
for (const [metric, { value, rating }] of Object.entries(cwvResult.scores)) {
|
|
21
|
+
const icon = RATING_ICONS[rating] || rating;
|
|
22
|
+
const unit = metric === "cls" ? "" : "ms";
|
|
23
|
+
lines.push(`- **${metric.toUpperCase()}**: ${value}${unit} [${icon}]`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (cwvResult.blocking.length > 0) {
|
|
27
|
+
lines.push("");
|
|
28
|
+
lines.push("### Blocking issues");
|
|
29
|
+
for (const b of cwvResult.blocking) {
|
|
30
|
+
const unit = b.metric === "cls" ? "" : "ms";
|
|
31
|
+
lines.push(`- ${b.metric.toUpperCase()}: ${b.value}${unit} exceeds poor threshold (${b.threshold}${unit})`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (cwvResult.advisory.length > 0) {
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push("### Advisory (needs improvement)");
|
|
38
|
+
for (const a of cwvResult.advisory) {
|
|
39
|
+
const unit = a.metric === "cls" ? "" : "ms";
|
|
40
|
+
lines.push(`- ${a.metric.toUpperCase()}: ${a.value}${unit} exceeds good threshold (${a.threshold}${unit})`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Format CWV result for a pipeline progress event payload.
|
|
49
|
+
*
|
|
50
|
+
* @param {{ pass: boolean, scores: object, blocking: Array, advisory: Array }} cwvResult
|
|
51
|
+
* @returns {{ type: string, pass: boolean, metrics: object, blockingCount: number, advisoryCount: number }}
|
|
52
|
+
*/
|
|
53
|
+
export function formatCwvForEvent(cwvResult) {
|
|
54
|
+
const metrics = {};
|
|
55
|
+
for (const [metric, { value, rating }] of Object.entries(cwvResult.scores)) {
|
|
56
|
+
metrics[metric] = { value, rating };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
type: "webperf-cwv",
|
|
61
|
+
pass: cwvResult.pass,
|
|
62
|
+
metrics,
|
|
63
|
+
blockingCount: cwvResult.blocking.length,
|
|
64
|
+
advisoryCount: cwvResult.advisory.length
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Coder Rules
|
|
2
|
+
|
|
3
|
+
## File modification safety
|
|
4
|
+
|
|
5
|
+
- NEVER overwrite existing files entirely. Always make targeted, minimal edits.
|
|
6
|
+
- When adding new code to an existing file, insert only the new lines at the correct location.
|
|
7
|
+
- After each edit, verify with `git diff` that ONLY the intended lines changed.
|
|
8
|
+
- If unintended changes are detected, revert immediately with `git checkout -- <file>`.
|
|
9
|
+
- Pay special attention to CSS, HTML, and config files where full rewrites destroy prior work (brand colors, layouts, styles).
|
|
10
|
+
|
|
11
|
+
## Multi-agent / multi-developer environment
|
|
12
|
+
|
|
13
|
+
- Multiple developers and AI agents may be committing and modifying code simultaneously.
|
|
14
|
+
- ALWAYS run `git fetch origin main` and check recent commits before starting work.
|
|
15
|
+
- Before pushing or merging, rebase on the latest main: `git rebase origin/main`.
|
|
16
|
+
- If a commit or push fails, check whether someone else pushed in the meantime.
|
|
17
|
+
- Never assume main is unchanged since the last check — always verify.
|
|
18
|
+
- Create a dedicated branch per task (`feat/` or `fix/`) and merge via PR, never push directly to main.
|
|
19
|
+
|
|
20
|
+
## General
|
|
21
|
+
|
|
22
|
+
- Keep changes minimal and focused on the task.
|
|
23
|
+
- Do not modify code unrelated to the task.
|
|
24
|
+
- Follow existing code conventions and patterns in the repository.
|
|
25
|
+
|
|
26
|
+
## Environment isolation (parallel runs)
|
|
27
|
+
|
|
28
|
+
- Never hardcode ports, DB names, or docker project names — read them from env
|
|
29
|
+
vars, documenting each one in `.env.example`. When `KJ_LANE_SLOT` /
|
|
30
|
+
`KJ_PORT_OFFSET` exist in the env, derive per-task values from them so
|
|
31
|
+
parallel lanes never collide.
|
|
32
|
+
- Never commit a real `.env` — only `.env.example` is versioned.
|
|
33
|
+
|
|
34
|
+
## Tests location (MANDATORY)
|
|
35
|
+
|
|
36
|
+
- Tests live in a top-level `tests/` directory mirroring `src/` (e.g. a function in
|
|
37
|
+
`src/services/foo.js` is tested by `tests/services/foo.test.js`).
|
|
38
|
+
- DO NOT scatter `*.test.js` files inside `src/` unless the project's local
|
|
39
|
+
`.karajan/coder-rules.md` explicitly overrides this.
|
|
40
|
+
- When generating a project from scratch:
|
|
41
|
+
- Create `tests/` and point the test runner at it (`include: ['tests/**/*.test.{js,ts}']`).
|
|
42
|
+
- Exclude `tests/` from the production bundle.
|
|
43
|
+
- If you write `sonar-project.properties`, set `sonar.tests=tests` AND make sure
|
|
44
|
+
that directory exists. Never declare a path that doesn't exist — Sonar will
|
|
45
|
+
refuse to scan and the run will fail every iteration with the same error.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# SonarQube Community Edition + PostgreSQL
|
|
2
|
+
# Karajan Code - Geniova Technologies
|
|
3
|
+
#
|
|
4
|
+
# Prerequisite (Linux):
|
|
5
|
+
# sudo sysctl -w vm.max_map_count=262144
|
|
6
|
+
# echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# docker compose -f docker-compose.sonar.yml up -d
|
|
10
|
+
# Open http://localhost:9000 (admin/admin on first access)
|
|
11
|
+
|
|
12
|
+
services:
|
|
13
|
+
sonarqube:
|
|
14
|
+
image: sonarqube:community
|
|
15
|
+
container_name: karajan-sonarqube
|
|
16
|
+
depends_on:
|
|
17
|
+
sonarqube-db:
|
|
18
|
+
condition: service_healthy
|
|
19
|
+
ports:
|
|
20
|
+
- "9000:9000"
|
|
21
|
+
environment:
|
|
22
|
+
- SONAR_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonar
|
|
23
|
+
- SONAR_JDBC_USERNAME=sonar
|
|
24
|
+
- SONAR_JDBC_PASSWORD=sonar
|
|
25
|
+
- SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true
|
|
26
|
+
volumes:
|
|
27
|
+
- sonarqube_data:/opt/sonarqube/data
|
|
28
|
+
- sonarqube_extensions:/opt/sonarqube/extensions
|
|
29
|
+
- sonarqube_logs:/opt/sonarqube/logs
|
|
30
|
+
networks:
|
|
31
|
+
- sonarnet
|
|
32
|
+
restart: unless-stopped
|
|
33
|
+
|
|
34
|
+
sonarqube-db:
|
|
35
|
+
image: postgres:17
|
|
36
|
+
container_name: karajan-sonarqube-db
|
|
37
|
+
healthcheck:
|
|
38
|
+
test: ["CMD-SHELL", "pg_isready -U sonar"]
|
|
39
|
+
interval: 10s
|
|
40
|
+
timeout: 5s
|
|
41
|
+
retries: 5
|
|
42
|
+
environment:
|
|
43
|
+
- POSTGRES_USER=sonar
|
|
44
|
+
- POSTGRES_PASSWORD=sonar
|
|
45
|
+
- POSTGRES_DB=sonar
|
|
46
|
+
volumes:
|
|
47
|
+
- postgresql_data:/var/lib/postgresql/data
|
|
48
|
+
networks:
|
|
49
|
+
- sonarnet
|
|
50
|
+
restart: unless-stopped
|
|
51
|
+
|
|
52
|
+
volumes:
|
|
53
|
+
sonarqube_data:
|
|
54
|
+
sonarqube_extensions:
|
|
55
|
+
sonarqube_logs:
|
|
56
|
+
postgresql_data:
|
|
57
|
+
|
|
58
|
+
networks:
|
|
59
|
+
sonarnet:
|
|
60
|
+
driver: bridge
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dental-clinical
|
|
3
|
+
description: Clinical dental workflows, treatment types, and orthodontic terminology
|
|
4
|
+
tags:
|
|
5
|
+
- dental
|
|
6
|
+
- clinical
|
|
7
|
+
- orthodontics
|
|
8
|
+
- treatments
|
|
9
|
+
version: 1.0.0
|
|
10
|
+
author: geniova
|
|
11
|
+
visibility: private
|
|
12
|
+
sources:
|
|
13
|
+
- type: manual
|
|
14
|
+
note: Created by Geniova dental team based on clinical protocols
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Dental Clinical Domain
|
|
18
|
+
|
|
19
|
+
## Core Concepts
|
|
20
|
+
|
|
21
|
+
Teeth are numbered using the FDI World Dental Federation notation system:
|
|
22
|
+
- Upper right: 11-18, Upper left: 21-28
|
|
23
|
+
- Lower left: 31-38, Lower right: 41-48
|
|
24
|
+
|
|
25
|
+
Orthodontic treatment types:
|
|
26
|
+
- **Fixed appliances**: brackets, archwires, bands
|
|
27
|
+
- **Removable aligners**: transparent trays (e.g., Invisalign-type)
|
|
28
|
+
- **Mixed**: combination of fixed and removable phases
|
|
29
|
+
|
|
30
|
+
Treatment lifecycle: Diagnosis -> Planning -> Approval -> Manufacturing -> Delivery -> Follow-up
|
|
31
|
+
|
|
32
|
+
## Terminology
|
|
33
|
+
|
|
34
|
+
- **Malocclusion**: misalignment of teeth or incorrect relation between upper and lower dental arches
|
|
35
|
+
- **Bracket**: small attachment bonded to the tooth surface to hold the archwire
|
|
36
|
+
- **Archwire**: wire threaded through brackets that applies corrective force
|
|
37
|
+
- **Aligner**: removable transparent tray that gradually moves teeth
|
|
38
|
+
- **IPR (Interproximal Reduction)**: controlled removal of enamel between teeth to create space
|
|
39
|
+
- **Attachment**: tooth-colored bump bonded to tooth to help aligners grip
|
|
40
|
+
- **Overcorrection**: intentional over-movement to account for relapse tendency
|
|
41
|
+
- **Staging**: the sequence and timing of tooth movements across aligner steps
|
|
42
|
+
|
|
43
|
+
## Business Rules
|
|
44
|
+
|
|
45
|
+
- Treatment plans must be approved by the lead clinician before manufacturing begins.
|
|
46
|
+
- Maximum standard treatment duration is 36 months; extensions require clinical justification.
|
|
47
|
+
- Each aligner step should move teeth no more than 0.25mm or 2 degrees of rotation.
|
|
48
|
+
- Clinical photos and scans are mandatory at: initial diagnosis, mid-treatment, and completion.
|
|
49
|
+
- Patient consent form must be signed before any irreversible procedure (e.g., IPR, extractions).
|
|
50
|
+
|
|
51
|
+
## Common Edge Cases
|
|
52
|
+
|
|
53
|
+
- **Mixed dentition**: pediatric patients with both primary and permanent teeth require special staging to account for natural tooth eruption during treatment.
|
|
54
|
+
- **Missing teeth**: treatment plans must explicitly account for gaps, pontics, or implant spaces.
|
|
55
|
+
- **Previous orthodontic treatment**: relapse cases need different force protocols than first-time treatments.
|
|
56
|
+
- **TMJ disorders**: patients with temporomandibular joint issues may need movement limits per step.
|
|
57
|
+
- **Pregnancy**: treatment may need to be paused; certain procedures (radiographs) are contraindicated.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# AI Agents
|
|
2
|
+
coder: claude
|
|
3
|
+
reviewer: codex
|
|
4
|
+
|
|
5
|
+
# Review settings
|
|
6
|
+
review_mode: standard
|
|
7
|
+
max_iterations: 5
|
|
8
|
+
review_rules: ./review-rules.md
|
|
9
|
+
coder_rules: ./coder-rules.md
|
|
10
|
+
base_branch: main
|
|
11
|
+
|
|
12
|
+
# Coder settings
|
|
13
|
+
coder_options:
|
|
14
|
+
model: null
|
|
15
|
+
auto_approve: true
|
|
16
|
+
|
|
17
|
+
# Reviewer settings
|
|
18
|
+
reviewer_options:
|
|
19
|
+
output_format: json
|
|
20
|
+
require_schema: true
|
|
21
|
+
model: null
|
|
22
|
+
deterministic: true
|
|
23
|
+
retries: 1
|
|
24
|
+
fallback_reviewer: codex
|
|
25
|
+
|
|
26
|
+
# Development methodology
|
|
27
|
+
development:
|
|
28
|
+
methodology: tdd
|
|
29
|
+
require_test_changes: true
|
|
30
|
+
test_file_patterns:
|
|
31
|
+
- /tests/
|
|
32
|
+
- /__tests__/
|
|
33
|
+
- .test.
|
|
34
|
+
- .spec.
|
|
35
|
+
|
|
36
|
+
# SonarQube settings
|
|
37
|
+
# Authentication: set token below, or KJ_SONAR_TOKEN env var,
|
|
38
|
+
# or save admin credentials in ~/.karajan/sonar-credentials.json:
|
|
39
|
+
# {"user": "admin", "password": "your-password"}
|
|
40
|
+
sonarqube:
|
|
41
|
+
enabled: true
|
|
42
|
+
host: http://localhost:9000
|
|
43
|
+
token: null
|
|
44
|
+
quality_gate: true
|
|
45
|
+
enforcement_profile: pragmatic
|
|
46
|
+
gate_block_on:
|
|
47
|
+
- new_reliability_rating=E
|
|
48
|
+
- new_security_rating=E
|
|
49
|
+
- new_maintainability_rating=E
|
|
50
|
+
- new_coverage<80
|
|
51
|
+
- new_duplicated_lines_density>5
|
|
52
|
+
fail_on:
|
|
53
|
+
- BLOCKER
|
|
54
|
+
- CRITICAL
|
|
55
|
+
ignore_on:
|
|
56
|
+
- INFO
|
|
57
|
+
max_scan_retries: 3
|
|
58
|
+
scanner:
|
|
59
|
+
sources: "src,public,lib"
|
|
60
|
+
exclusions: "**/node_modules/**,**/fake-apps/**,**/scripts/**,**/playground/**,**/dist/**,**/build/**,**/*.min.js"
|
|
61
|
+
test_inclusions: "**/*.test.js,**/*.spec.js,**/tests/**,**/__tests__/**"
|
|
62
|
+
coverage_exclusions: "**/tests/**,**/__tests__/**,**/*.test.js,**/*.spec.js"
|
|
63
|
+
disabled_rules:
|
|
64
|
+
- "javascript:S1116"
|
|
65
|
+
- "javascript:S3776"
|
|
66
|
+
|
|
67
|
+
# Deterministic Guards
|
|
68
|
+
guards:
|
|
69
|
+
output:
|
|
70
|
+
enabled: true
|
|
71
|
+
# Custom patterns (added to built-in destructive + credential patterns)
|
|
72
|
+
# patterns:
|
|
73
|
+
# - id: custom-pattern
|
|
74
|
+
# pattern: "DANGEROUS_FUNCTION"
|
|
75
|
+
# severity: critical
|
|
76
|
+
# message: "Custom dangerous pattern detected"
|
|
77
|
+
# Protected files (added to built-in: .env, serviceAccountKey.json, etc.)
|
|
78
|
+
# protected_files:
|
|
79
|
+
# - secrets.yml
|
|
80
|
+
# - .env.production
|
|
81
|
+
on_violation: block # block | warn | skip
|
|
82
|
+
perf:
|
|
83
|
+
enabled: true
|
|
84
|
+
block_on_warning: false # true to block on perf warnings (default: advisory only)
|
|
85
|
+
# Custom perf patterns (added to built-in frontend anti-patterns)
|
|
86
|
+
# patterns:
|
|
87
|
+
# - id: custom-perf
|
|
88
|
+
# pattern: "eval\\("
|
|
89
|
+
# severity: warning
|
|
90
|
+
# message: "eval() detected"
|
|
91
|
+
intent:
|
|
92
|
+
enabled: false # enable for deterministic pre-triage classification
|
|
93
|
+
confidence_threshold: 0.85
|
|
94
|
+
# Custom intent patterns (evaluated before built-in)
|
|
95
|
+
# patterns:
|
|
96
|
+
# - keywords: ["readme", "docs", "documentation"]
|
|
97
|
+
# taskType: doc
|
|
98
|
+
# confidence: 0.9
|
|
99
|
+
|
|
100
|
+
# Git (post-approval)
|
|
101
|
+
git:
|
|
102
|
+
auto_commit: false
|
|
103
|
+
auto_push: false
|
|
104
|
+
auto_pr: false
|
|
105
|
+
auto_rebase: true
|
|
106
|
+
branch_prefix: feat/
|
|
107
|
+
|
|
108
|
+
# Output
|
|
109
|
+
output:
|
|
110
|
+
report_dir: ./.reviews
|
|
111
|
+
log_level: info
|
|
112
|
+
|
|
113
|
+
# Session limits
|
|
114
|
+
session:
|
|
115
|
+
max_iteration_minutes: 15
|
|
116
|
+
max_total_minutes: 120
|
|
117
|
+
# Hard per-run spend ceiling (USD-equivalent). The run stops with a summary
|
|
118
|
+
# when exceeded; resume with `kj resume`. Set to null to remove the cap.
|
|
119
|
+
max_budget_usd: 5
|
|
120
|
+
fail_fast_repeats: 2
|
|
121
|
+
# Per-lane setup for parallel runs (worktrees). Runs INSIDE the fresh
|
|
122
|
+
# worktree instead of the default `npm ci`. Each lane receives
|
|
123
|
+
# KJ_LANE_SLOT (0,1,2…) and KJ_PORT_OFFSET (slot-derived) in its env —
|
|
124
|
+
# derive ports, DB names and docker project names from them so lanes
|
|
125
|
+
# never collide. The coder never orchestrates git; isolation is declared
|
|
126
|
+
# here. Example:
|
|
127
|
+
# worktree_setup: "npm ci && docker compose -p app_lane_$KJ_LANE_SLOT up -d db"
|
|
128
|
+
worktree_setup: null
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Review Rules
|
|
2
|
+
|
|
3
|
+
- Focus on security, correctness, and tests first.
|
|
4
|
+
- Only raise blocking issues for concrete production risks.
|
|
5
|
+
- Keep non-blocking suggestions separate.
|
|
6
|
+
|
|
7
|
+
## Environment isolation
|
|
8
|
+
|
|
9
|
+
- Reject changes that hardcode ports, DB names or service hostnames instead of
|
|
10
|
+
reading them from env vars, and any diff that adds a real `.env` (only
|
|
11
|
+
`.env.example` is versioned).
|
|
12
|
+
|
|
13
|
+
## File overwrite detection (BLOCKING)
|
|
14
|
+
|
|
15
|
+
- If the diff shows an entire file was replaced (massive deletions + additions instead of targeted edits), flag it as BLOCKING.
|
|
16
|
+
- Check specifically for: reverted brand colors, lost CSS styles, removed existing functionality, overwritten config values.
|
|
17
|
+
- A diff where most lines of a file are removed and re-added with minor changes is a sign of full-file overwrite.
|