karajan-code 4.70.4 → 5.0.1
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/README.md +2 -2
- package/package.json +6 -14
- package/packages/hu-board/package.json +1 -1
- package/packages/hu-board/public/app.js +4 -18
- package/packages/hu-board/public/index.html +5 -2
- package/packages/hu-board/public/styles.css +26 -0
- package/packages/hu-board/public/utils/api.js +0 -74
- package/packages/hu-board/public/utils/board-tour.js +62 -0
- package/packages/hu-board/public/utils/board-view.js +49 -144
- package/packages/hu-board/public/utils/command-launcher.js +8 -70
- package/packages/hu-board/public/utils/formatters.js +10 -0
- package/packages/hu-board/public/utils/governance-view.js +13 -1
- package/packages/hu-board/public/utils/hu-actions.js +17 -68
- package/packages/hu-board/public/utils/init-listeners.js +7 -8
- package/packages/hu-board/public/utils/log-panel.js +3 -16
- package/packages/hu-board/public/utils/maggle-mode.js +2 -12
- package/packages/hu-board/public/utils/modals.js +7 -0
- package/packages/hu-board/public/utils/project-picker-view.js +1 -1
- package/packages/hu-board/public/utils/server-push.js +3 -22
- package/packages/hu-board/public/utils/shared-board-notice.js +33 -0
- package/packages/hu-board/public/utils/story-detail-view.js +5 -19
- package/packages/hu-board/src/cleanup-zombies.js +0 -1
- package/packages/hu-board/src/command-runner.js +36 -25
- package/packages/hu-board/src/db-connection.js +282 -0
- package/packages/hu-board/src/db-paths.js +113 -0
- package/packages/hu-board/src/db-queries.js +188 -0
- package/packages/hu-board/src/db-tombstones.js +51 -0
- package/packages/hu-board/src/db.js +28 -619
- package/packages/hu-board/src/ephemeral-cleaner.js +2 -3
- package/packages/hu-board/src/hu-zombie-reaper.js +5 -1
- package/packages/hu-board/src/plan-mutations.js +3 -153
- package/packages/hu-board/src/plans-service.js +55 -0
- package/packages/hu-board/src/routes/api/commands.js +122 -0
- package/packages/hu-board/src/routes/api/plans.js +55 -0
- package/packages/hu-board/src/routes/api/projects.js +267 -0
- package/packages/hu-board/src/routes/api/prompts.js +135 -0
- package/packages/hu-board/src/routes/api/sessions.js +95 -0
- package/packages/hu-board/src/routes/api/stories.js +183 -0
- package/packages/hu-board/src/routes/api/system.js +241 -0
- package/packages/hu-board/src/routes/api/tombstones.js +38 -0
- package/packages/hu-board/src/routes/api.js +24 -1371
- package/packages/hu-board/src/routes/governance.js +23 -1
- package/packages/hu-board/src/routes/lanes.js +40 -0
- package/packages/hu-board/src/routes/rag.js +4 -3
- package/packages/hu-board/src/server.js +20 -34
- package/packages/hu-board/src/sync-files.js +318 -0
- package/packages/hu-board/src/sync-project.js +99 -0
- package/packages/hu-board/src/sync.js +22 -566
- package/packages/hu-board/src/zombie-reaper.js +1 -1
- package/scripts/dual-publish.mjs +19 -3
- package/scripts/postinstall.js +15 -2
- package/scripts/verify-pack-mcp.mjs +11 -7
- package/scripts/verify-pack.mjs +4 -4
- package/src/audit/audit-history.js +3 -2
- package/src/audit/dead-exports.js +68 -59
- package/src/audit/deterministic-summary.js +33 -13
- package/src/audit/npm-signatures.js +41 -0
- package/src/audit/sbom.js +35 -0
- package/src/checks/agent-token.js +112 -0
- package/src/checks/dir-setup.js +34 -1
- package/src/checks/native-build.js +21 -39
- package/src/checks/runner.js +128 -142
- package/src/cli/advanced-commands.js +6 -6
- package/src/cli/register-meta.js +42 -82
- package/src/cli/register-pipeline.js +8 -143
- package/src/cli/register-plan.js +9 -100
- package/src/cli/register-roles-skills.js +1 -1
- package/src/cli/retired-commands.js +49 -0
- package/src/cli.js +18 -5
- package/src/commands/agent-run.js +40 -26
- package/src/commands/audit.js +127 -124
- package/src/commands/board.js +5 -9
- package/src/commands/check.js +29 -16
- package/src/commands/doctor.js +2 -0
- package/src/commands/env.js +176 -150
- package/src/commands/go.js +71 -53
- package/src/commands/harden.js +90 -81
- package/src/commands/hu-start.js +52 -0
- package/src/commands/hu.js +288 -221
- package/src/commands/identity.js +111 -78
- package/src/commands/init-atril.js +47 -0
- package/src/commands/init.js +11 -40
- package/src/commands/install-tools.js +70 -85
- package/src/commands/main-guard.js +78 -0
- package/src/commands/policy.js +226 -184
- package/src/commands/qmd.js +27 -21
- package/src/commands/rag.js +121 -55
- package/src/commands/review-gate.js +421 -341
- package/src/commands/skills.js +4 -1
- package/src/commands/start.js +4 -5
- package/src/commands/steward.js +96 -47
- package/src/commands/tournament.js +46 -37
- package/src/commands/worktree.js +107 -26
- package/src/config/defaults.js +1 -0
- package/src/config/loader.js +34 -17
- package/src/config/role-resolver.js +1 -0
- package/src/config/schema.js +1 -0
- package/src/config/secrets.js +36 -0
- package/src/config.js +1 -0
- package/src/environment/adr.js +16 -2
- package/src/git/karajan-label.js +20 -8
- package/src/guards/main-guard.js +54 -0
- package/src/harden/hook-templates.js +16 -1
- package/src/harden/sentinel/posttooluse.mjs +18 -6
- package/src/harden/sentinel/pretooluse-sentinel.mjs +64 -36
- package/src/harden/sentinel/sentinel-lib.mjs +129 -26
- package/src/harden/sentinel/sentinel-shell.mjs +5 -16
- package/src/harden/sentinel/sessionstart.mjs +3 -2
- package/src/harden/sentinel/stop.mjs +5 -4
- package/src/harden/workflow-templates.js +1 -1
- package/src/hu/board-lookup.js +29 -0
- package/src/hu/gh-identity.js +23 -0
- package/src/hu/github-board.js +4 -2
- package/src/hu/lane-prune.js +83 -13
- package/src/hu/lane-setup.js +65 -0
- package/src/hu/lanes.js +66 -0
- package/src/hu/team-board-mirror.js +3 -2
- package/src/infrastructure/command-runner.js +1 -1
- package/src/infrastructure/file-system-service.js +1 -1
- package/src/mcp/handlers/direct-handlers.js +2 -292
- package/src/mcp/handlers/hu-handlers.js +1 -35
- package/src/mcp/handlers/management-handlers.js +2 -42
- package/src/mcp/handlers/rag-handler.js +9 -1
- package/src/mcp/server-handlers.js +16 -22
- package/src/mcp/tools.js +1 -196
- package/src/plan/lane-plans.js +54 -0
- package/src/plan/plan-store.js +7 -4
- package/src/policy/add.js +26 -12
- package/src/policy/adr-number-check.js +31 -0
- package/src/prompts/audit.js +299 -339
- package/src/prompts/card-context.js +10 -5
- package/src/prompts/reviewer.js +5 -2
- package/src/rag/auto-update.js +71 -44
- package/src/rag/bootstrap-index.js +46 -54
- package/src/rag/indexer.js +9 -4
- package/src/rag/migrate.js +1 -1
- package/src/rag/onnx-fallback.js +2 -2
- package/src/rag/pid-lease.js +181 -0
- package/src/rag/project-store.js +2 -12
- package/src/review/card-first.js +57 -46
- package/src/review/gate-gitignore.js +23 -4
- package/src/review/gate-hook.js +12 -4
- package/src/review/one-shot-review.js +45 -35
- package/src/review/publish-pr.js +14 -2
- package/src/review/repo-docs.js +73 -0
- package/src/review/repo-stack.js +59 -0
- package/src/review/reviewer-fallback.js +19 -4
- package/src/review/seal-commit.js +29 -0
- package/src/review/sonar-pregate.js +59 -44
- package/src/review/third-party-review.js +90 -16
- package/src/review/third-party-size.js +43 -0
- package/src/review/third-party-skills.js +54 -0
- package/src/review/verify-pr.js +1 -24
- package/src/roles/audit-role.js +106 -125
- package/src/skills/atril-cli.js +19 -1
- package/src/skills/atril-skills.js +5 -4
- package/src/skills/skills-search.js +72 -0
- package/src/skills/translate.js +62 -0
- package/src/sonar/scanner.js +116 -101
- package/src/steward/invariants.js +5 -4
- package/src/steward/phantom-sweep.js +66 -0
- package/src/tournament/judge.js +60 -53
- package/src/utils/gh-account.js +37 -0
- package/src/utils/git.js +0 -13
- package/src/utils/home-migration.js +7 -1
- package/src/utils/main-checkout.js +53 -0
- package/src/utils/qmd-collection.js +3 -1
- package/src/utils/welcome.js +3 -3
- package/templates/{skills → atril/commands}/kj-architect.md +5 -0
- package/templates/{skills → atril/commands}/kj-audit.md +5 -0
- package/templates/{skills → atril/commands}/kj-board.md +5 -0
- package/templates/{skills → atril/commands}/kj-code.md +5 -0
- package/templates/{skills → atril/commands}/kj-csv-transform.md +5 -0
- package/templates/{skills → atril/commands}/kj-data-report.md +5 -0
- package/templates/{skills → atril/commands}/kj-discover.md +5 -0
- package/templates/{skills → atril/commands}/kj-rag-query.md +5 -0
- package/templates/{skills → atril/commands}/kj-review.md +5 -0
- package/templates/{skills → atril/commands}/kj-security.md +5 -0
- package/templates/{skills → atril/commands}/kj-sonar.md +5 -0
- package/templates/{skills → atril/commands}/kj-sql-analysis.md +5 -0
- package/templates/{skills → atril/commands}/kj-test.md +5 -0
- package/packages/hu-board/public/utils/run-launcher.js +0 -169
- package/packages/hu-board/src/run-tracker.js +0 -121
- package/src/activity-log.js +0 -59
- package/src/agents/host-agent.js +0 -38
- package/src/agents/model-registry.js +0 -142
- package/src/audit/plan-adherence.js +0 -224
- package/src/autonomy/arbiter-role.js +0 -71
- package/src/autonomy/arbiter.js +0 -22
- package/src/autonomy/decider.js +0 -18
- package/src/autonomy/decision-resolver.js +0 -58
- package/src/autonomy/outcome-report.js +0 -55
- package/src/autonomy/stage-ask.js +0 -30
- package/src/brain/decision-tracker.js +0 -125
- package/src/brain/decisor.js +0 -243
- package/src/brain/solomon-consult.js +0 -171
- package/src/brain/standby-scheduler.js +0 -8
- package/src/budget/comparison.js +0 -96
- package/src/canvas/parse-md.js +0 -238
- package/src/canvas/schema.js +0 -101
- package/src/canvas/to-flat.js +0 -85
- package/src/canvas/validate.js +0 -163
- package/src/ci/dispatch.js +0 -99
- package/src/ci/index.js +0 -3
- package/src/ci/pr-diff.js +0 -26
- package/src/cli/register-standby.js +0 -26
- package/src/commands/architect.js +0 -111
- package/src/commands/autorun.js +0 -49
- package/src/commands/researcher.js +0 -54
- package/src/commands/resume.js +0 -72
- package/src/commands/review.js +0 -89
- package/src/commands/run.js +0 -185
- package/src/commands/standby.js +0 -117
- package/src/commands/status.js +0 -36
- package/src/commands/triage.js +0 -78
- package/src/commands/undo.js +0 -62
- package/src/domains/domain-loader.js +0 -245
- package/src/domains/domain-registry.js +0 -140
- package/src/domains/domain-synthesizer.js +0 -129
- package/src/git/automation.js +0 -433
- package/src/git/coder-commit-guard.js +0 -40
- package/src/git/hu-automation.js +0 -243
- package/src/git/hu-snapshot.js +0 -10
- package/src/git/symlink-targets.js +0 -57
- package/src/golden/asserter.js +0 -92
- package/src/golden/loader.js +0 -52
- package/src/golden/runner.js +0 -92
- package/src/golden/schema.js +0 -41
- package/src/guards/duplicate-members.js +0 -86
- package/src/guards/intent-guard.js +0 -161
- package/src/guards/perf-guard.js +0 -126
- package/src/guards/policy-guard.js +0 -90
- package/src/guards/policy-resolver.js +0 -85
- package/src/guards/secret-redactor.js +0 -71
- package/src/hu/acceptance-runner.js +0 -138
- package/src/hu/lazy-planner.js +0 -109
- package/src/hu/parallel-executor.js +0 -94
- package/src/hu/routing-metrics.js +0 -17
- package/src/hu/split-validator.js +0 -143
- package/src/hu/splitting-detector.js +0 -158
- package/src/hu/splitting-generator.js +0 -175
- package/src/hu/store.js +0 -394
- package/src/infrastructure/mocks.js +0 -182
- package/src/mcp/handlers/run-handler.js +0 -318
- package/src/mcp/sovereignty-guard.js +0 -113
- package/src/mcp/tool-arg-normalizers.js +0 -16
- package/src/mutate/reviewer-signal.js +0 -76
- package/src/orchestrator/agent-fallback.js +0 -81
- package/src/orchestrator/brain-coordinator.js +0 -186
- package/src/orchestrator/ci-integration.js +0 -139
- package/src/orchestrator/config-init.js +0 -426
- package/src/orchestrator/direct-actions.js +0 -217
- package/src/orchestrator/drivers/error-recovery.js +0 -287
- package/src/orchestrator/drivers/init-context.js +0 -238
- package/src/orchestrator/drivers/iteration-loop.js +0 -382
- package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +0 -69
- package/src/orchestrator/drivers/iteration-phases/guards.js +0 -91
- package/src/orchestrator/drivers/iteration-phases/handle-approved.js +0 -29
- package/src/orchestrator/drivers/iteration-phases/quality-gates.js +0 -125
- package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +0 -62
- package/src/orchestrator/drivers/post-loop.js +0 -404
- package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +0 -137
- package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +0 -47
- package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +0 -84
- package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +0 -393
- package/src/orchestrator/drivers/pre-loop.js +0 -524
- package/src/orchestrator/drivers/run-hu-batch.js +0 -468
- package/src/orchestrator/feedback-enrichment.js +0 -140
- package/src/orchestrator/feedback-queue.js +0 -151
- package/src/orchestrator/flow-control.js +0 -170
- package/src/orchestrator/flow-runner.js +0 -365
- package/src/orchestrator/fs-leak-detector.js +0 -228
- package/src/orchestrator/hu-scheduler.js +0 -114
- package/src/orchestrator/hu-sub-pipeline.js +0 -642
- package/src/orchestrator/iteration-gate.js +0 -73
- package/src/orchestrator/iteration-stages.js +0 -9
- package/src/orchestrator/parallel-limiter.js +0 -74
- package/src/orchestrator/pipeline-context.js +0 -72
- package/src/orchestrator/post-loop-stages.js +0 -468
- package/src/orchestrator/pre-loop-stages.js +0 -11
- package/src/orchestrator/preflight-checks.js +0 -487
- package/src/orchestrator/repair/repair-detector.js +0 -117
- package/src/orchestrator/repair/repair-runner.js +0 -142
- package/src/orchestrator/reviewer-fallback.js +0 -45
- package/src/orchestrator/role-output-compressor.js +0 -189
- package/src/orchestrator/session-journal.js +0 -308
- package/src/orchestrator/solomon-escalation.js +0 -331
- package/src/orchestrator/solomon-rules.js +0 -212
- package/src/orchestrator/stages/acceptance-coverage-stage.js +0 -47
- package/src/orchestrator/stages/architect-stage.js +0 -172
- package/src/orchestrator/stages/coder-stage.js +0 -506
- package/src/orchestrator/stages/domain-curator-stage.js +0 -82
- package/src/orchestrator/stages/format-stage.js +0 -61
- package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +0 -127
- package/src/orchestrator/stages/hu-reviewer-stage.js +0 -419
- package/src/orchestrator/stages/perf-stage.js +0 -140
- package/src/orchestrator/stages/planner-stage.js +0 -85
- package/src/orchestrator/stages/rag-context-stage.js +0 -80
- package/src/orchestrator/stages/rag-preload-decisor.js +0 -58
- package/src/orchestrator/stages/research-stage.js +0 -69
- package/src/orchestrator/stages/reviewer-stage.js +0 -431
- package/src/orchestrator/stages/sonar-stage.js +0 -439
- package/src/orchestrator/stages/stage-classes.js +0 -84
- package/src/orchestrator/stages/stage-executor.js +0 -155
- package/src/orchestrator/stages/suite-green-stage.js +0 -62
- package/src/orchestrator/stages/tdd-discipline-stage.js +0 -56
- package/src/orchestrator/stages/tool-judge-stage.js +0 -53
- package/src/orchestrator/stages/triage-stage.js +0 -172
- package/src/orchestrator/standby.js +0 -71
- package/src/orchestrator/verification-gate.js +0 -183
- package/src/orchestrator.js +0 -22
- package/src/plan/adr-generator.js +0 -170
- package/src/plan/adr-loader.js +0 -60
- package/src/plan/plan-executor.js +0 -100
- package/src/plan/plan-validation.js +0 -4
- package/src/prompts/acceptance-coverage.js +0 -32
- package/src/prompts/arbiter.js +0 -38
- package/src/prompts/architect.js +0 -103
- package/src/prompts/hu-reviewer.js +0 -244
- package/src/prompts/tool-correctness-judge.js +0 -31
- package/src/prompts/triage.js +0 -57
- package/src/rag/embedder.js +0 -2
- package/src/rag/embedders/_cloud-base.js +0 -2
- package/src/rag/embedders/cohere.js +0 -2
- package/src/rag/embedders/mistral.js +0 -2
- package/src/rag/embedders/onnx.js +0 -2
- package/src/rag/embedders/openai.js +0 -2
- package/src/rag/embedders/voyage.js +0 -2
- package/src/rag/rerank.js +0 -4
- package/src/rag/where-parser.js +0 -4
- package/src/repeat-detector.js +0 -88
- package/src/review/diff-generator.js +0 -112
- package/src/review/git-stash-helper.js +0 -104
- package/src/review/schema.js +0 -31
- package/src/review/scope-filter.js +0 -152
- package/src/review/snapshot-diff.js +0 -122
- package/src/review/tdd-discipline.js +0 -90
- package/src/review/tdd-policy.js +0 -69
- package/src/roles/acceptance-coverage-role.js +0 -78
- package/src/roles/architect-role.js +0 -77
- package/src/roles/coder-role.js +0 -113
- package/src/roles/commiter-role.js +0 -113
- package/src/roles/domain-curator-role.js +0 -134
- package/src/roles/hu-reviewer-role.js +0 -64
- package/src/roles/impeccable-role.js +0 -85
- package/src/roles/index.js +0 -18
- package/src/roles/karajan-brain-role.js +0 -134
- package/src/roles/perf-role.js +0 -122
- package/src/roles/planner-role.js +0 -151
- package/src/roles/refactorer-role.js +0 -30
- package/src/roles/repairer-role.js +0 -181
- package/src/roles/researcher-role.js +0 -70
- package/src/roles/reviewer-role.js +0 -115
- package/src/roles/security-role.js +0 -73
- package/src/roles/solomon-role.js +0 -271
- package/src/roles/sonar-role.js +0 -72
- package/src/roles/tester-role.js +0 -235
- package/src/roles/tool-correctness-judge-role.js +0 -78
- package/src/roles/triage-role.js +0 -99
- package/src/session/journal/decisions-writer.js +0 -200
- package/src/session/journal/iteration-logger.js +0 -194
- package/src/session/journal/summary-writer.js +0 -320
- package/src/session/journal/tree-writer.js +0 -164
- package/src/session/journal/write-all.js +0 -89
- package/src/session-cleanup.js +0 -116
- package/src/skills/semantic-detector.js +0 -167
- package/src/skills/skill-detector.js +0 -385
- package/src/sonar/cloud-scanner.js +0 -78
- package/src/tracker-bootstrap.js +0 -44
- package/src/types/index.js +0 -38
- package/src/types/policy.js +0 -43
- package/src/types/solomon.js +0 -87
- package/src/utils/async-lock.js +0 -31
- package/src/utils/budget.js +0 -229
- package/src/utils/cwd-confirm.js +0 -39
- package/src/utils/display/event-handlers.js +0 -403
- package/src/utils/display/formatters.js +0 -132
- package/src/utils/display/header.js +0 -47
- package/src/utils/display/session-summary.js +0 -118
- package/src/utils/display/solomon.js +0 -42
- package/src/utils/pricing.js +0 -29
- package/src/utils/quota-simulator.js +0 -56
- package/src/utils/role-assigner.js +0 -137
- package/src/utils/rtk-wrapper.js +0 -87
- package/src/utils/run-registry.js +0 -9
- package/src/utils/status-dashboard.js +0 -254
- package/src/utils/tool-call-extractor.js +0 -56
- package/src/webperf/devtools-detect.js +0 -112
- package/src/webperf/webperf-role-integration.js +0 -66
- package/templates/skills/kj-run.md +0 -73
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
// Brain Coordinator: integrates Karajan Brain + 5 support modules into the pipeline.
|
|
2
|
-
// Replaces ad-hoc role-to-role communication with a central intelligence.
|
|
3
|
-
|
|
4
|
-
import * as queue from "./feedback-queue.js";
|
|
5
|
-
import * as enrich from "./feedback-enrichment.js";
|
|
6
|
-
import { verifyCoderOutput, VerificationTracker } from "./verification-gate.js";
|
|
7
|
-
import { executeActions } from "./direct-actions.js";
|
|
8
|
-
import { compressRoleOutput, measureCompression } from "./role-output-compressor.js";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @typedef {Object} BrainContext
|
|
12
|
-
* @property {Object} feedbackQueue - structured feedback queue
|
|
13
|
-
* @property {VerificationTracker} verificationTracker - tracks coder changes
|
|
14
|
-
* @property {Object} compressionStats - token savings per role
|
|
15
|
-
* @property {boolean} enabled - whether brain coordination is active
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Create a new brain context for a pipeline session.
|
|
20
|
-
*/
|
|
21
|
-
export function createBrainContext({ enabled = false } = {}) {
|
|
22
|
-
return {
|
|
23
|
-
feedbackQueue: queue.createQueue(),
|
|
24
|
-
verificationTracker: new VerificationTracker(),
|
|
25
|
-
compressionStats: { totalSaved: 0, perRole: {} },
|
|
26
|
-
extensionCount: 0,
|
|
27
|
-
enabled
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Check if brain coordination is enabled for this config.
|
|
33
|
-
*/
|
|
34
|
-
export function isBrainEnabled(config) {
|
|
35
|
-
return Boolean(config?.brain?.enabled) || Boolean(config?.pipeline?.brain?.enabled);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* After a role completes, push its feedback to the queue and compress.
|
|
40
|
-
* Returns the compressed output for passing to next role.
|
|
41
|
-
*/
|
|
42
|
-
export function processRoleOutput(ctx, { roleName, output, iteration }) {
|
|
43
|
-
if (!ctx.enabled) return output;
|
|
44
|
-
|
|
45
|
-
// Compress for next-role context
|
|
46
|
-
const compressed = compressRoleOutput(roleName, output);
|
|
47
|
-
const stats = measureCompression(output, compressed);
|
|
48
|
-
ctx.compressionStats.totalSaved += stats.savedTokens;
|
|
49
|
-
ctx.compressionStats.perRole[roleName] = stats;
|
|
50
|
-
|
|
51
|
-
// Extract feedback entries from specific role outputs
|
|
52
|
-
const entries = extractFeedbackEntries(roleName, output, iteration);
|
|
53
|
-
if (entries.length > 0) {
|
|
54
|
-
queue.addEntries(ctx.feedbackQueue, entries);
|
|
55
|
-
enrich.enrichQueue(ctx.feedbackQueue);
|
|
56
|
-
queue.deduplicate(ctx.feedbackQueue);
|
|
57
|
-
queue.prioritize(ctx.feedbackQueue);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return compressed;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Extract structured feedback entries from a role's output.
|
|
65
|
-
*/
|
|
66
|
-
function extractFeedbackEntries(roleName, output, iteration) {
|
|
67
|
-
if (!output || typeof output !== "object") return [];
|
|
68
|
-
|
|
69
|
-
const entries = [];
|
|
70
|
-
if (roleName === "reviewer" && output.blocking_issues) {
|
|
71
|
-
for (const issue of output.blocking_issues) {
|
|
72
|
-
entries.push({
|
|
73
|
-
source: "reviewer",
|
|
74
|
-
severity: issue.severity || "medium",
|
|
75
|
-
description: issue.description || "",
|
|
76
|
-
file: issue.file || null,
|
|
77
|
-
line: issue.line || null,
|
|
78
|
-
suggestedFix: issue.suggested_fix || null,
|
|
79
|
-
id: issue.id || null,
|
|
80
|
-
iteration
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
} else if (roleName === "tester" && output.verdict === "fail") {
|
|
84
|
-
const missing = output.missing_scenarios || [];
|
|
85
|
-
for (const scenario of missing) {
|
|
86
|
-
entries.push({
|
|
87
|
-
source: "tester",
|
|
88
|
-
severity: "high",
|
|
89
|
-
category: "tests",
|
|
90
|
-
description: `Missing scenario: ${scenario}`,
|
|
91
|
-
iteration
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
if (output.coverage?.overall != null && output.coverage.overall < 80) {
|
|
95
|
-
entries.push({
|
|
96
|
-
source: "tester",
|
|
97
|
-
severity: "high",
|
|
98
|
-
category: "tests",
|
|
99
|
-
description: `Coverage below 80% (${output.coverage.overall}%)`,
|
|
100
|
-
iteration
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
// Catch-all: tester failed but no structured detail → still record the failure
|
|
104
|
-
if (entries.length === 0) {
|
|
105
|
-
entries.push({
|
|
106
|
-
source: "tester",
|
|
107
|
-
severity: "high",
|
|
108
|
-
category: "tests",
|
|
109
|
-
description: output.summary || "Tester failed (no structured detail available)",
|
|
110
|
-
iteration
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
} else if (roleName === "security" && output.verdict === "fail") {
|
|
114
|
-
for (const vuln of output.vulnerabilities || []) {
|
|
115
|
-
entries.push({
|
|
116
|
-
source: "security",
|
|
117
|
-
severity: vuln.severity || "high",
|
|
118
|
-
category: "security",
|
|
119
|
-
description: vuln.description || "",
|
|
120
|
-
file: vuln.file || null,
|
|
121
|
-
line: vuln.line || null,
|
|
122
|
-
suggestedFix: vuln.fix_suggestion || null,
|
|
123
|
-
iteration
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
// Catch-all: security failed but no structured vulnerabilities → still record
|
|
127
|
-
if (entries.length === 0) {
|
|
128
|
-
entries.push({
|
|
129
|
-
source: "security",
|
|
130
|
-
severity: "high",
|
|
131
|
-
category: "security",
|
|
132
|
-
description: output.summary || "Security gate failed (no structured detail available)",
|
|
133
|
-
iteration
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return entries;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Before coder runs, format the feedback queue as an actionable prompt.
|
|
142
|
-
*/
|
|
143
|
-
export function buildCoderFeedbackPrompt(ctx) {
|
|
144
|
-
if (!ctx.enabled || ctx.feedbackQueue.entries.length === 0) return null;
|
|
145
|
-
return enrich.formatEnrichedForCoder(ctx.feedbackQueue.entries);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* After coder runs, verify changes were made. Returns verification result.
|
|
150
|
-
*/
|
|
151
|
-
export function verifyCoderRan(ctx, { baseRef, projectDir }) {
|
|
152
|
-
if (!ctx.enabled) return { passed: true, filesChanged: 0, reason: "brain disabled" };
|
|
153
|
-
const result = verifyCoderOutput({ baseRef, projectDir });
|
|
154
|
-
ctx.verificationTracker.record(result);
|
|
155
|
-
return result;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Execute direct actions (npm install, gitignore updates, etc.).
|
|
160
|
-
*/
|
|
161
|
-
export async function runDirectActions(ctx, actions, { cwd } = {}) {
|
|
162
|
-
if (!ctx.enabled || !actions?.length) return [];
|
|
163
|
-
return executeActions(actions, { cwd });
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Clear feedback queue after coder addresses it.
|
|
168
|
-
*/
|
|
169
|
-
export function clearFeedback(ctx) {
|
|
170
|
-
if (!ctx.enabled) return;
|
|
171
|
-
queue.clear(ctx.feedbackQueue);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Get a summary of brain activity for the session.
|
|
176
|
-
*/
|
|
177
|
-
export function summarize(ctx) {
|
|
178
|
-
if (!ctx.enabled) return null;
|
|
179
|
-
return {
|
|
180
|
-
feedbackQueueSize: ctx.feedbackQueue.entries.length,
|
|
181
|
-
queueCategories: queue.countByCategory(ctx.feedbackQueue),
|
|
182
|
-
consecutiveVerificationFailures: ctx.verificationTracker.consecutiveFailures,
|
|
183
|
-
compressionSaved: ctx.compressionStats.totalSaved,
|
|
184
|
-
compressionPerRole: ctx.compressionStats.perRole
|
|
185
|
-
};
|
|
186
|
-
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CI/CD integration — early PR creation, incremental push, review dispatch.
|
|
3
|
-
* Extracted from orchestrator.js — self-contained feature, only active when ci.enabled.
|
|
4
|
-
*/
|
|
5
|
-
import { saveSession } from "../session/store.js";
|
|
6
|
-
import { setCiEarlyPr, appendCiCommits } from "../session/mutators.js";
|
|
7
|
-
import { earlyPrCreation, incrementalPush } from "../git/automation.js";
|
|
8
|
-
import { emitProgress, makeEvent } from "../utils/events.js";
|
|
9
|
-
import { getIntegration } from "./integrations.js";
|
|
10
|
-
|
|
11
|
-
export async function tryCiComment({ config, session, logger: _logger, agent, body }) {
|
|
12
|
-
if (!config.ci?.enabled || !session.ci_pr_number) return;
|
|
13
|
-
try {
|
|
14
|
-
const { dispatchComment } = await import("../ci/dispatch.js");
|
|
15
|
-
const { detectRepo } = await import("../ci/repo.js");
|
|
16
|
-
const repo = await detectRepo();
|
|
17
|
-
if (repo) {
|
|
18
|
-
await dispatchComment({
|
|
19
|
-
repo, prNumber: session.ci_pr_number, agent,
|
|
20
|
-
body, ciConfig: config.ci
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
} catch { /* non-blocking */ }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function formatCommitList(commits) {
|
|
27
|
-
return commits.map((c) => `- \`${c.hash.slice(0, 7)}\` ${c.message}`).join("\n");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function ciIncrementalPush({ config, session, gitCtx, task, logger, repo, dispatchComment }) {
|
|
31
|
-
const pushResult = await incrementalPush({ gitCtx, task, logger, session });
|
|
32
|
-
if (!pushResult) return;
|
|
33
|
-
|
|
34
|
-
const tracker = getIntegration("tracker");
|
|
35
|
-
for (const c of pushResult.commits) tracker?.onCommit?.(session, c);
|
|
36
|
-
|
|
37
|
-
appendCiCommits(session, pushResult.commits);
|
|
38
|
-
await saveSession(session);
|
|
39
|
-
|
|
40
|
-
if (!repo) return;
|
|
41
|
-
const feedback = session.last_reviewer_feedback || "N/A";
|
|
42
|
-
await dispatchComment({
|
|
43
|
-
repo, prNumber: session.ci_pr_number, agent: "Coder",
|
|
44
|
-
body: `Issues fixed:\n${feedback}\n\nCommits:\n${formatCommitList(pushResult.commits)}`,
|
|
45
|
-
ciConfig: config.ci
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function ciCreateEarlyPr({ config, session, emitter, eventBase, gitCtx, task, logger, stageResults, i, repo, dispatchComment }) {
|
|
50
|
-
const earlyPr = await earlyPrCreation({ gitCtx, task, logger, session, stageResults });
|
|
51
|
-
if (!earlyPr) return;
|
|
52
|
-
|
|
53
|
-
const tracker = getIntegration("tracker");
|
|
54
|
-
for (const c of earlyPr.commits) tracker?.onCommit?.(session, c);
|
|
55
|
-
|
|
56
|
-
setCiEarlyPr(session, { prNumber: earlyPr.prNumber, prUrl: earlyPr.prUrl, commits: earlyPr.commits });
|
|
57
|
-
await saveSession(session);
|
|
58
|
-
emitProgress(emitter, makeEvent("ci:pr-created", { ...eventBase, stage: "ci" }, {
|
|
59
|
-
message: `Early PR created: #${earlyPr.prNumber}`,
|
|
60
|
-
detail: { prNumber: earlyPr.prNumber, prUrl: earlyPr.prUrl }
|
|
61
|
-
}));
|
|
62
|
-
|
|
63
|
-
if (!repo) return;
|
|
64
|
-
await dispatchComment({
|
|
65
|
-
repo, prNumber: earlyPr.prNumber, agent: "Coder",
|
|
66
|
-
body: `Iteration ${i} completed.\n\nCommits:\n${formatCommitList(earlyPr.commits)}`,
|
|
67
|
-
ciConfig: config.ci
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export async function handleCiEarlyPrOrPush({ ciEnabled, config, session, emitter, eventBase, gitCtx, task, logger, stageResults, i }) {
|
|
72
|
-
if (!ciEnabled) return;
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
const { dispatchComment } = await import("../ci/dispatch.js");
|
|
76
|
-
const { detectRepo } = await import("../ci/repo.js");
|
|
77
|
-
const repo = await detectRepo();
|
|
78
|
-
|
|
79
|
-
if (session.ci_pr_number) {
|
|
80
|
-
await ciIncrementalPush({ config, session, gitCtx, task, logger, repo, dispatchComment });
|
|
81
|
-
} else {
|
|
82
|
-
await ciCreateEarlyPr({ config, session, emitter, eventBase, gitCtx, task, logger, stageResults, i, repo, dispatchComment });
|
|
83
|
-
}
|
|
84
|
-
} catch (err) {
|
|
85
|
-
logger.warn(`CI early PR/push failed (non-blocking): ${err.message}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function formatBlockingIssues(issues) {
|
|
90
|
-
return issues?.map((x) => `- ${x.id || "ISSUE"} [${x.severity || ""}] ${x.description}`).join("\n") || "";
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function formatSuggestions(suggestions) {
|
|
94
|
-
return suggestions?.map((s) => {
|
|
95
|
-
const detail = typeof s === "string" ? s : `${s.id || ""} ${s.description || s}`;
|
|
96
|
-
return `- ${detail}`;
|
|
97
|
-
}).join("\n") || "";
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function buildReviewCommentBody(review, i) {
|
|
101
|
-
const status = review.approved ? "APPROVED" : "REQUEST_CHANGES";
|
|
102
|
-
const blocking = formatBlockingIssues(review.blocking_issues);
|
|
103
|
-
const suggestions = formatSuggestions(review.non_blocking_suggestions);
|
|
104
|
-
let body = `Review iteration ${i}: ${status}`;
|
|
105
|
-
if (blocking) body += `\n\n**Blocking:**\n${blocking}`;
|
|
106
|
-
if (suggestions) body += `\n\n**Suggestions:**\n${suggestions}`;
|
|
107
|
-
return body;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export async function handleCiReviewDispatch({ ciEnabled, config, session, review, i, logger }) {
|
|
111
|
-
if (!ciEnabled || !session.ci_pr_number) return;
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
const { dispatchReview, dispatchComment } = await import("../ci/dispatch.js");
|
|
115
|
-
const { detectRepo } = await import("../ci/repo.js");
|
|
116
|
-
const repo = await detectRepo();
|
|
117
|
-
if (!repo) return;
|
|
118
|
-
|
|
119
|
-
const bc = config.ci;
|
|
120
|
-
const reviewEvent = review.approved ? "APPROVE" : "REQUEST_CHANGES";
|
|
121
|
-
const reviewBody = review.approved
|
|
122
|
-
? (review.summary || "Approved")
|
|
123
|
-
: (formatBlockingIssues(review.blocking_issues) || review.summary || "Changes requested");
|
|
124
|
-
|
|
125
|
-
await dispatchReview({
|
|
126
|
-
repo, prNumber: session.ci_pr_number,
|
|
127
|
-
event: reviewEvent, body: reviewBody, agent: "Reviewer", ciConfig: bc
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
await dispatchComment({
|
|
131
|
-
repo, prNumber: session.ci_pr_number, agent: "Reviewer",
|
|
132
|
-
body: buildReviewCommentBody(review, i), ciConfig: bc
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
logger.info(`CI: dispatched review for PR #${session.ci_pr_number}`);
|
|
136
|
-
} catch (err) {
|
|
137
|
-
logger.warn(`CI dispatch failed (non-blocking): ${err.message}`);
|
|
138
|
-
}
|
|
139
|
-
}
|