@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,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Karajan HU Board - Frontend Application
|
|
3
|
+
* Vanilla JS single-page app with hash-based routing.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Scoped-project mode: when the server serves `/p/<slug>`, the UI boots
|
|
8
|
+
* pre-filtered to that project. Multi-project affordances (project
|
|
9
|
+
* dropdown, Sessions tab, Pipeline link, Dashboard card grid) are hidden
|
|
10
|
+
* because they make no sense here. Driven by dogfood feedback: the user
|
|
11
|
+
* wanted one board per project, not a global view with 2 000 stories.
|
|
12
|
+
*/
|
|
13
|
+
const SCOPED_PREFIX = '/p/';
|
|
14
|
+
const scopedProjectSlug = window.location.pathname.startsWith(SCOPED_PREFIX)
|
|
15
|
+
? decodeURIComponent(window.location.pathname.slice(SCOPED_PREFIX.length)).replace(/\/+$/, '')
|
|
16
|
+
: null;
|
|
17
|
+
|
|
18
|
+
if (scopedProjectSlug) {
|
|
19
|
+
document.body.classList.add('scoped-mode');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Current view — Board is the default everywhere, not just in scoped mode.
|
|
24
|
+
* Dogfood quote: "Board vista por defecto. Dashboard es algo extra que a
|
|
25
|
+
* priori no me interesa, pq me interesan los proyectos." The Kanban is
|
|
26
|
+
* the thing the user wants to see first; Dashboard stays accessible via
|
|
27
|
+
* its nav button for the (rare) multi-project overview case but is never
|
|
28
|
+
* the landing view.
|
|
29
|
+
*/
|
|
30
|
+
let currentView = 'board';
|
|
31
|
+
|
|
32
|
+
/** @type {string} Selected project ID (empty = all) */
|
|
33
|
+
let selectedProject = scopedProjectSlug || '';
|
|
34
|
+
|
|
35
|
+
/** @type {number | null} Auto-refresh interval ID */
|
|
36
|
+
let refreshInterval = null;
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
// ---- Human-friendly story IDs ----
|
|
40
|
+
//
|
|
41
|
+
// Internal story IDs look like
|
|
42
|
+
// home_manu_ws_ai_linux-assistant-orchestrator::hu_plan-20260424182640-4icc_003
|
|
43
|
+
// which is fine for disk and logs but terrible for humans. The UI shows a
|
|
44
|
+
// short form like `lao-003` (project initials + HU sequence) so the user
|
|
45
|
+
// can say "take a look at `lao-003`" instead of pasting the 82-char blob.
|
|
46
|
+
// The full ID stays accessible as a tooltip (and in the underlying data-id).
|
|
47
|
+
|
|
48
|
+
const projectInitialsCache = {};
|
|
49
|
+
const projectNameCache = {};
|
|
50
|
+
// KJC-PRP-0002 PR6: cache project.is_shared so the HU modal can gate the
|
|
51
|
+
// "Asignado a" field without re-fetching /api/projects/:id each open.
|
|
52
|
+
// 0/1 mirror what sqlite stores; undefined = not yet hydrated.
|
|
53
|
+
const projectIsSharedCache = {};
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fetch-and-cache a project's metadata. Populates initialsCache and
|
|
58
|
+
* nameCache in one trip so neither renderStoryCard nor the section
|
|
59
|
+
* header has to await again. Falls back to the project id on any
|
|
60
|
+
* failure so the UI never blocks on a network error.
|
|
61
|
+
* @param {string} projectId
|
|
62
|
+
* @returns {Promise<{ initials: string, name: string }>}
|
|
63
|
+
*/
|
|
64
|
+
async function resolveProjectMeta(projectId) {
|
|
65
|
+
if (!projectId) return { initials: 'kj', name: '' };
|
|
66
|
+
if (projectInitialsCache[projectId]) {
|
|
67
|
+
return { initials: projectInitialsCache[projectId], name: projectNameCache[projectId] };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const project = await api(`/api/projects/${encodeURIComponent(projectId)}`);
|
|
71
|
+
const rawName = project.name || humaniseProjectName(projectId);
|
|
72
|
+
const initials = deriveInitialsFromName(rawName);
|
|
73
|
+
projectInitialsCache[projectId] = initials;
|
|
74
|
+
projectNameCache[projectId] = rawName;
|
|
75
|
+
projectIsSharedCache[projectId] = project.is_shared === 1 ? 1 : 0;
|
|
76
|
+
return { initials, name: rawName };
|
|
77
|
+
} catch {
|
|
78
|
+
const fallbackName = humaniseProjectName(projectId);
|
|
79
|
+
projectInitialsCache[projectId] = deriveInitialsFromName(fallbackName);
|
|
80
|
+
projectNameCache[projectId] = fallbackName;
|
|
81
|
+
projectIsSharedCache[projectId] = 0;
|
|
82
|
+
return { initials: projectInitialsCache[projectId], name: fallbackName };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Back-compat helper kept so existing callers don't break. */
|
|
87
|
+
async function resolveProjectInitials(projectId) {
|
|
88
|
+
const meta = await resolveProjectMeta(projectId);
|
|
89
|
+
return meta.initials;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* "Pick a project" view shown by the Board tab when nothing is
|
|
96
|
+
* selected. Lists every project that has at least one HU with the
|
|
97
|
+
* pending / running / done / failed counts — clicking takes the
|
|
98
|
+
* user into that project's kanban (`#board/<slug>`).
|
|
99
|
+
*
|
|
100
|
+
* Why this instead of an "All projects" merged kanban: HU short ids
|
|
101
|
+
* collide across projects (every project has a `*-001`), the column
|
|
102
|
+
* counts become meaningless, and "missing test contract" warnings
|
|
103
|
+
* apply to whatever-project so the user can't tell what to act on.
|
|
104
|
+
* Forcing a project pick before the kanban is the cheapest way to
|
|
105
|
+
* keep every other UI invariant honest.
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Renders an empty state component.
|
|
110
|
+
* @param {string} title
|
|
111
|
+
* @param {string} text
|
|
112
|
+
* @returns {string}
|
|
113
|
+
*/
|
|
114
|
+
function renderEmptyState(title, text) {
|
|
115
|
+
return `
|
|
116
|
+
<div class="empty-state">
|
|
117
|
+
<div class="empty-state__title">${title || 'No data yet'}</div>
|
|
118
|
+
<div class="empty-state__text">${text || 'HU stories and sessions will appear here as Karajan processes them.'}</div>
|
|
119
|
+
<div class="empty-state__path">~/.karajan/hu-stories/</div>
|
|
120
|
+
</div>
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---- Plan execution ----
|
|
125
|
+
//
|
|
126
|
+
// The board delegates execution to the CLI via `POST /api/projects/:id/run`.
|
|
127
|
+
// There's no more intermediate "certify" step: the user reviews HUs
|
|
128
|
+
// (editing inline if needed — see edit-in-place PR), and when happy
|
|
129
|
+
// clicks "Run plan", which spawns `kj run --plan <id>` as a detached
|
|
130
|
+
// child on the server. Status updates flow back through the plan JSON
|
|
131
|
+
// watcher without any manual refresh.
|
|
132
|
+
//
|
|
133
|
+
// We still expose a per-HU status PATCH endpoint for corrective moves
|
|
134
|
+
// (e.g. retry a failed HU manually), but it's no longer the primary
|
|
135
|
+
// action on the card.
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Launch the pipeline over every plan of a project. Returns when the
|
|
139
|
+
* spawn ack is received — not when the run completes. Live progress is
|
|
140
|
+
* reflected automatically by the plans-dir watcher on the server, so
|
|
141
|
+
* the board re-renders without us having to poll.
|
|
142
|
+
* @param {string} projectId
|
|
143
|
+
*/
|
|
144
|
+
// Track the most recently launched planId so the "View log" button in
|
|
145
|
+
// the section header can re-open the viewer without the user hunting
|
|
146
|
+
// through plan ids.
|
|
147
|
+
let lastLaunchedPlanId = null;
|
|
148
|
+
|
|
149
|
+
// Generalised across plan runs AND ⚡ launcher commands: the ▶ Run
|
|
150
|
+
// plan button populates this with the run's logPath, and the
|
|
151
|
+
// command launcher does the same with its own commandId. The 📜
|
|
152
|
+
// View log button in the section header reads from here so it
|
|
153
|
+
// re-opens whichever was most recently launched.
|
|
154
|
+
let lastOpenedLog = null; // { id, label, tailUrl(offset) }
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
// ---- Navigation ----
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Navigates to a specific view.
|
|
162
|
+
* @param {string} view - 'dashboard', 'board', or 'sessions'
|
|
163
|
+
*/
|
|
164
|
+
function navigate(view) {
|
|
165
|
+
currentView = view;
|
|
166
|
+
window.location.hash = selectedProject ? `${view}/${selectedProject}` : view;
|
|
167
|
+
|
|
168
|
+
// Update active nav button
|
|
169
|
+
document.querySelectorAll('.nav-btn').forEach((btn) => {
|
|
170
|
+
btn.classList.toggle('active', btn.dataset.view === view);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
render();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Selects a project and navigates to the board view.
|
|
178
|
+
* @param {string} projectId
|
|
179
|
+
*/
|
|
180
|
+
function selectProject(projectId) {
|
|
181
|
+
selectedProject = projectId;
|
|
182
|
+
document.getElementById('project-select').value = projectId;
|
|
183
|
+
navigate('board');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Renders the current view.
|
|
188
|
+
*/
|
|
189
|
+
function render() {
|
|
190
|
+
switch (currentView) {
|
|
191
|
+
case 'dashboard': return renderDashboard();
|
|
192
|
+
case 'board': return renderBoard();
|
|
193
|
+
case 'sessions': return renderSessions();
|
|
194
|
+
case 'graph': return renderGraph();
|
|
195
|
+
default: return renderDashboard();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Populates the project selector dropdown.
|
|
201
|
+
*/
|
|
202
|
+
async function populateProjectSelect() {
|
|
203
|
+
try {
|
|
204
|
+
const projects = await api('/api/projects');
|
|
205
|
+
const select = document.getElementById('project-select');
|
|
206
|
+
// Which project should appear pre-selected? Order:
|
|
207
|
+
// 1. scopedProjectSlug (URL is /p/<slug>) — locked, never changes
|
|
208
|
+
// 2. selectedProject (route state, ej. #board/<slug>)
|
|
209
|
+
// 3. "" — "All Projects"
|
|
210
|
+
// PR-D: the previous version cleared innerHTML and never marked
|
|
211
|
+
// any option as selected, so the dropdown showed "All Projects"
|
|
212
|
+
// even when scoped to one. handleRoute() set .value separately
|
|
213
|
+
// BUT the value was lost in the race because the matching option
|
|
214
|
+
// didn't exist yet when handleRoute ran. Setting .selected on
|
|
215
|
+
// the option directly avoids the race.
|
|
216
|
+
const desired = scopedProjectSlug || selectedProject || '';
|
|
217
|
+
select.innerHTML = '';
|
|
218
|
+
const all = document.createElement('option');
|
|
219
|
+
all.value = '';
|
|
220
|
+
all.textContent = 'All Projects';
|
|
221
|
+
if (desired === '') all.selected = true;
|
|
222
|
+
select.appendChild(all);
|
|
223
|
+
for (const p of projects) {
|
|
224
|
+
const opt = document.createElement('option');
|
|
225
|
+
opt.value = p.id;
|
|
226
|
+
opt.textContent = p.name || p.id;
|
|
227
|
+
if (p.id === desired) opt.selected = true;
|
|
228
|
+
select.appendChild(opt);
|
|
229
|
+
}
|
|
230
|
+
// Final guard: if `desired` did not match any rendered option
|
|
231
|
+
// (project not on the board yet), still set the value so
|
|
232
|
+
// handleRoute's expectation holds.
|
|
233
|
+
if (desired) select.value = desired;
|
|
234
|
+
} catch {
|
|
235
|
+
// Silently fail — project list will be empty
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Parses the hash route and renders.
|
|
241
|
+
*/
|
|
242
|
+
function handleRoute() {
|
|
243
|
+
// Board-first: the default landing view is always the Kanban. Dashboard
|
|
244
|
+
// is only shown when the user explicitly navigates to `#dashboard`.
|
|
245
|
+
const hash = window.location.hash.slice(1) || 'board';
|
|
246
|
+
const parts = hash.split('/');
|
|
247
|
+
// In scoped mode the project is locked — the hash controls the view
|
|
248
|
+
// only. `board/<slug>` becomes `board` and the slug stays fixed.
|
|
249
|
+
currentView = parts[0] || 'board';
|
|
250
|
+
selectedProject = scopedProjectSlug || parts[1] || '';
|
|
251
|
+
|
|
252
|
+
document.querySelectorAll('.nav-btn').forEach((btn) => {
|
|
253
|
+
btn.classList.toggle('active', btn.dataset.view === currentView);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
document.getElementById('project-select').value = selectedProject;
|
|
257
|
+
render();
|
|
258
|
+
}
|
|
259
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Karajan HU Board</title>
|
|
7
|
+
<link rel="stylesheet" href="/styles.css">
|
|
8
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='6' fill='%237c3aed'/><text x='16' y='22' text-anchor='middle' fill='white' font-size='16' font-family='sans-serif' font-weight='bold'>K</text></svg>">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<header class="header">
|
|
12
|
+
<div class="header__logo">
|
|
13
|
+
<svg viewBox="0 0 32 32" width="32" height="32">
|
|
14
|
+
<rect width="32" height="32" rx="6" fill="#7c3aed"/>
|
|
15
|
+
<text x="16" y="22" text-anchor="middle" fill="white" font-size="16" font-family="sans-serif" font-weight="bold">K</text>
|
|
16
|
+
</svg>
|
|
17
|
+
<div>
|
|
18
|
+
<div class="header__title">Karajan HU Board</div>
|
|
19
|
+
<div class="header__subtitle">story management dashboard</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<nav class="header__nav">
|
|
23
|
+
<button class="nav-btn active" data-view="board" title="Kanban board: every HU of the selected project, grouped by status (Pending → Certified → Done). Click an HU card to expand the detail panel.">Board</button>
|
|
24
|
+
<button class="nav-btn" data-view="graph" title="Dependency graph of the selected project's HUs — who blocks whom. Useful before scheduling work.">Graph</button>
|
|
25
|
+
<button class="nav-btn" data-view="dashboard" title="Per-project landing: stats grid + project list. Click a project card to focus the kanban / graph on that project.">Dashboard</button>
|
|
26
|
+
<button class="nav-btn" data-view="sessions" title="Every kj run that has touched the board, newest first. Filter by project; click a session to inspect its iterations, commits and checkpoints.">Sessions</button>
|
|
27
|
+
<a class="nav-btn" href="/pipeline.html" title="Live observability of pipeline runs (Karajan v2.7+): stage timings, agent calls, decision logs.">Pipeline</a>
|
|
28
|
+
<a class="nav-btn" href="/rag.html" title="RAG retrieval-quality dashboard: chunk counts, embedder provider, db size.">RAG</a>
|
|
29
|
+
<a class="nav-btn" href="/wiki.html" title="Search the per-project QMD semantic wiki (docs, plans, reviews).">Wiki</a>
|
|
30
|
+
<select class="project-select" id="project-select">
|
|
31
|
+
<option value="">All Projects</option>
|
|
32
|
+
</select>
|
|
33
|
+
<div class="header__controls">
|
|
34
|
+
<button class="control-btn" id="help-btn" title="What does each view do? Quick reference for Board / Graph / Dashboard / Sessions / Pipeline.">?</button>
|
|
35
|
+
<button class="control-btn" id="config-btn" title="Configurar Karajan (modelos, agentes, tope de iteraciones, …)">⚙</button>
|
|
36
|
+
<button class="control-btn" id="commands-btn" title="Launch a Karajan CLI command (kj plan, kj architect, kj clean…)">⚡</button>
|
|
37
|
+
<button class="control-btn" id="restart-btn" title="Restart the HU Board server (preserves URL, the page reconnects automatically)">🔁</button>
|
|
38
|
+
<button class="control-btn" id="sync-btn" title="Re-scan disk for new batches">🔄</button>
|
|
39
|
+
<button class="control-btn" id="force-refresh-btn" title="Force a clean reload — wipes browser caches and reloads. Use when the UI looks stale and a normal refresh isn't fixing it." onclick="window.forceRefresh()">🧹</button>
|
|
40
|
+
</div>
|
|
41
|
+
</nav>
|
|
42
|
+
</header>
|
|
43
|
+
|
|
44
|
+
<main class="main" id="app">
|
|
45
|
+
<div class="loading">
|
|
46
|
+
<div class="loading__spinner"></div>
|
|
47
|
+
<p>Loading...</p>
|
|
48
|
+
</div>
|
|
49
|
+
</main>
|
|
50
|
+
|
|
51
|
+
<div class="modal-backdrop hidden" id="modal-backdrop">
|
|
52
|
+
<div class="modal" id="modal-content"></div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<script src="/utils/formatters.js"></script>
|
|
56
|
+
<script src="/utils/modals.js"></script>
|
|
57
|
+
<script src="/utils/api.js"></script>
|
|
58
|
+
<script src="/utils/sessions-view.js"></script>
|
|
59
|
+
<script src="/utils/board-view.js"></script>
|
|
60
|
+
<script src="/utils/dashboard-view.js"></script>
|
|
61
|
+
<script src="/utils/graph-view.js"></script>
|
|
62
|
+
<script src="/utils/project-picker-view.js"></script>
|
|
63
|
+
<script src="/utils/story-detail-view.js"></script>
|
|
64
|
+
<script src="/utils/preflight-view.js"></script>
|
|
65
|
+
<script src="/utils/plan-rollup-view.js"></script>
|
|
66
|
+
<script src="/utils/log-panel.js"></script>
|
|
67
|
+
<script src="/utils/hu-actions.js"></script>
|
|
68
|
+
<script src="/utils/project-actions.js"></script>
|
|
69
|
+
<script src="/utils/story-edit-form.js"></script>
|
|
70
|
+
<script src="/utils/config-editor.js"></script>
|
|
71
|
+
<script src="/utils/command-launcher.js"></script>
|
|
72
|
+
<script src="/utils/run-launcher.js"></script>
|
|
73
|
+
<script src="/utils/server-push.js"></script>
|
|
74
|
+
<script src="/app.js"></script>
|
|
75
|
+
<script src="/utils/init-listeners.js"></script>
|
|
76
|
+
</body>
|
|
77
|
+
</html>
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/* Pipeline observability view (TSK-0325). */
|
|
2
|
+
|
|
3
|
+
.topbar {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: 1.5rem;
|
|
7
|
+
padding: 0.75rem 1.5rem;
|
|
8
|
+
border-bottom: 1px solid #2a3a4e;
|
|
9
|
+
background: #0f1420;
|
|
10
|
+
}
|
|
11
|
+
.topbar h1 { font-size: 1.125rem; margin: 0; color: #e1e8f2; }
|
|
12
|
+
.topbar .brand {
|
|
13
|
+
color: #7d9ebc;
|
|
14
|
+
text-decoration: none;
|
|
15
|
+
font-weight: 500;
|
|
16
|
+
}
|
|
17
|
+
.topbar .brand:hover { color: #e1e8f2; }
|
|
18
|
+
|
|
19
|
+
.session-picker {
|
|
20
|
+
margin-left: auto;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
gap: 0.5rem;
|
|
24
|
+
color: #94a4ac;
|
|
25
|
+
}
|
|
26
|
+
.session-picker select {
|
|
27
|
+
background: #1a2332;
|
|
28
|
+
color: #e1e8f2;
|
|
29
|
+
border: 1px solid #2a3a4e;
|
|
30
|
+
padding: 0.25rem 0.5rem;
|
|
31
|
+
border-radius: 4px;
|
|
32
|
+
min-width: 220px;
|
|
33
|
+
}
|
|
34
|
+
.session-picker button {
|
|
35
|
+
background: #1a2332;
|
|
36
|
+
color: #e1e8f2;
|
|
37
|
+
border: 1px solid #2a3a4e;
|
|
38
|
+
padding: 0.25rem 0.5rem;
|
|
39
|
+
border-radius: 4px;
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
.session-picker button:hover { background: #2a3a4e; }
|
|
43
|
+
|
|
44
|
+
main {
|
|
45
|
+
padding: 1.5rem;
|
|
46
|
+
display: grid;
|
|
47
|
+
gap: 1.5rem;
|
|
48
|
+
max-width: 1200px;
|
|
49
|
+
margin: 0 auto;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.role-grid {
|
|
53
|
+
display: grid;
|
|
54
|
+
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
|
|
55
|
+
gap: 0.75rem;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.role-card {
|
|
59
|
+
border: 1px solid #2a3a4e;
|
|
60
|
+
border-radius: 6px;
|
|
61
|
+
padding: 0.75rem;
|
|
62
|
+
background: #0f1420;
|
|
63
|
+
display: flex;
|
|
64
|
+
flex-direction: column;
|
|
65
|
+
gap: 0.25rem;
|
|
66
|
+
}
|
|
67
|
+
.role-card .name {
|
|
68
|
+
font-weight: 600;
|
|
69
|
+
font-size: 0.875rem;
|
|
70
|
+
color: #e1e8f2;
|
|
71
|
+
}
|
|
72
|
+
.role-card .meta {
|
|
73
|
+
font-size: 0.75rem;
|
|
74
|
+
color: #7d9ebc;
|
|
75
|
+
}
|
|
76
|
+
.role-card[data-status="done"] { border-color: #4caf50; }
|
|
77
|
+
.role-card[data-status="running"] { border-color: #f4b63f; }
|
|
78
|
+
.role-card[data-status="error"] { border-color: #e74c3c; }
|
|
79
|
+
.role-card[data-status="idle"] { opacity: 0.65; }
|
|
80
|
+
|
|
81
|
+
.panel {
|
|
82
|
+
border: 1px solid #2a3a4e;
|
|
83
|
+
border-radius: 6px;
|
|
84
|
+
padding: 1rem 1.25rem;
|
|
85
|
+
background: #0f1420;
|
|
86
|
+
}
|
|
87
|
+
.panel h2 {
|
|
88
|
+
margin: 0 0 0.75rem 0;
|
|
89
|
+
font-size: 1rem;
|
|
90
|
+
color: #e1e8f2;
|
|
91
|
+
}
|
|
92
|
+
.event-list {
|
|
93
|
+
list-style: none;
|
|
94
|
+
padding: 0;
|
|
95
|
+
margin: 0;
|
|
96
|
+
max-height: 420px;
|
|
97
|
+
overflow-y: auto;
|
|
98
|
+
display: grid;
|
|
99
|
+
gap: 0.5rem;
|
|
100
|
+
}
|
|
101
|
+
.event-list li {
|
|
102
|
+
border-left: 2px solid #2a3a4e;
|
|
103
|
+
padding: 0.5rem 0.75rem;
|
|
104
|
+
background: #0a0e18;
|
|
105
|
+
border-radius: 3px;
|
|
106
|
+
}
|
|
107
|
+
.event-list li strong { color: #e1e8f2; display: block; margin-bottom: 0.25rem; }
|
|
108
|
+
.event-list li pre {
|
|
109
|
+
margin: 0;
|
|
110
|
+
white-space: pre-wrap;
|
|
111
|
+
font-size: 0.8125rem;
|
|
112
|
+
color: #94a4ac;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.summary {
|
|
116
|
+
white-space: pre-wrap;
|
|
117
|
+
font-family: ui-monospace, SFMono-Regular, monospace;
|
|
118
|
+
font-size: 0.8125rem;
|
|
119
|
+
color: #94a4ac;
|
|
120
|
+
margin: 0;
|
|
121
|
+
max-height: 520px;
|
|
122
|
+
overflow-y: auto;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
footer {
|
|
126
|
+
text-align: center;
|
|
127
|
+
font-size: 0.75rem;
|
|
128
|
+
color: #7d9ebc;
|
|
129
|
+
padding: 0.75rem 1.5rem;
|
|
130
|
+
border-top: 1px solid #2a3a4e;
|
|
131
|
+
}
|
|
132
|
+
footer .sep { margin: 0 0.5rem; opacity: 0.5; }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Karajan — Pipeline Observability</title>
|
|
7
|
+
<link rel="stylesheet" href="/styles.css" />
|
|
8
|
+
<link rel="stylesheet" href="/pipeline.css" />
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<header class="topbar">
|
|
12
|
+
<a class="brand" href="/">← HU Board</a>
|
|
13
|
+
<h1>Pipeline Observability</h1>
|
|
14
|
+
<div class="session-picker">
|
|
15
|
+
<label for="sessionSelect">Session:</label>
|
|
16
|
+
<select id="sessionSelect" aria-label="Active session"></select>
|
|
17
|
+
<button id="refreshBtn" type="button" title="Refresh now">⟳</button>
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
20
|
+
|
|
21
|
+
<main>
|
|
22
|
+
<section id="roleGrid" class="role-grid" aria-label="Pipeline roles"></section>
|
|
23
|
+
|
|
24
|
+
<section class="panel">
|
|
25
|
+
<h2>Solomon arbitrations</h2>
|
|
26
|
+
<ol id="solomonList" class="event-list"></ol>
|
|
27
|
+
</section>
|
|
28
|
+
|
|
29
|
+
<section class="panel">
|
|
30
|
+
<h2>Iterations</h2>
|
|
31
|
+
<ol id="iterationList" class="event-list"></ol>
|
|
32
|
+
</section>
|
|
33
|
+
|
|
34
|
+
<section class="panel">
|
|
35
|
+
<h2>Summary</h2>
|
|
36
|
+
<pre id="summaryBlock" class="summary"></pre>
|
|
37
|
+
</section>
|
|
38
|
+
</main>
|
|
39
|
+
|
|
40
|
+
<footer>
|
|
41
|
+
<span id="lastRefresh">—</span>
|
|
42
|
+
<span class="sep">·</span>
|
|
43
|
+
<span>Auto-refresh every 2 s (click ⟳ to force)</span>
|
|
44
|
+
</footer>
|
|
45
|
+
|
|
46
|
+
<script src="/pipeline.js" type="module"></script>
|
|
47
|
+
</body>
|
|
48
|
+
</html>
|