mandrel 2.0.0 → 2.2.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/.agents/README.md +59 -28
- package/.agents/agents/acceptance-critic.md +20 -9
- package/.agents/agents/story-worker.md +45 -48
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +60 -46
- package/.agents/docs/agentrc-reference.json +8 -13
- package/.agents/docs/configuration.md +33 -57
- package/.agents/docs/execution-reference.md +39 -10
- package/.agents/docs/quality-gates.md +17 -19
- package/.agents/docs/workflows.md +6 -6
- package/.agents/instructions.md +64 -79
- package/.agents/rules/ci-remediation.md +3 -3
- package/.agents/rules/gherkin-standards.md +10 -0
- package/.agents/rules/git-conventions-reference.md +42 -51
- package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
- package/.agents/schemas/agentrc.schema.json +35 -46
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +24 -68
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +1 -1
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/audit-suite/selector.js +323 -23
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -1
- package/.agents/scripts/lib/checks/index.js +1 -1
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +3 -3
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli-args.js +23 -2
- package/.agents/scripts/lib/close-validation/gates.js +13 -13
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/acceptance-eval.js +2 -2
- package/.agents/scripts/lib/config/delivery-routing.js +7 -6
- package/.agents/scripts/lib/config/explain.js +10 -16
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +15 -25
- package/.agents/scripts/lib/config/quality.js +11 -14
- package/.agents/scripts/lib/config/runners.js +8 -21
- package/.agents/scripts/lib/config/temp-paths.js +18 -56
- package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
- package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
- package/.agents/scripts/lib/config-settings-schema.js +48 -22
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/duplicate-search.js +38 -7
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -189
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
- package/.agents/scripts/lib/git-utils.js +0 -14
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +0 -15
- package/.agents/scripts/lib/label-taxonomy.js +1 -12
- package/.agents/scripts/lib/observability/active-story-env.js +42 -163
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +2 -2
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +43 -45
- package/.agents/scripts/lib/orchestration/change-set.js +103 -0
- package/.agents/scripts/lib/orchestration/code-review.js +70 -191
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +9 -11
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +7 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/merge-block-class.js +76 -20
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
- package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
- package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +374 -16
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +4 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +72 -30
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +12 -8
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +264 -43
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
- package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
- package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
- package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
- package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -286
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +8 -7
- package/.agents/scripts/lib/story-body/story-body.js +81 -13
- package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/ticket-body-sections.js +0 -14
- package/.agents/scripts/lib/validation-evidence.js +31 -59
- package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
- package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/plan-context.js +38 -7
- package/.agents/scripts/plan-critics.js +203 -0
- package/.agents/scripts/plan-persist.js +145 -35
- package/.agents/scripts/plan-run-epilogue.js +83 -38
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +1 -11
- package/.agents/scripts/providers/github/mappers.js +5 -0
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -153
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/quality-preview.js +13 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +9 -10
- package/.agents/scripts/single-story-close.js +173 -18
- package/.agents/scripts/single-story-confirm-merge.js +288 -15
- package/.agents/scripts/single-story-init.js +6 -10
- package/.agents/scripts/stories-wave-tick.js +380 -53
- package/.agents/scripts/story-plan.js +3 -3
- package/.agents/scripts/update-ticket-state.js +8 -50
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +3 -3
- package/.agents/skills/core/scope-triage/SKILL.md +3 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +2 -12
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/workflows/audit-architecture.md +3 -4
- package/.agents/workflows/audit-clean-code.md +4 -4
- package/.agents/workflows/audit-documentation.md +4 -5
- package/.agents/workflows/audit-lighthouse.md +8 -0
- package/.agents/workflows/audit-navigability.md +10 -0
- package/.agents/workflows/audit-performance.md +2 -3
- package/.agents/workflows/audit-quality.md +8 -9
- package/.agents/workflows/audit-security.md +1 -2
- package/.agents/workflows/audit-seo.md +10 -0
- package/.agents/workflows/audit-ux-ui.md +7 -0
- package/.agents/workflows/deliver.md +133 -45
- package/.agents/workflows/git-cleanup.md +2 -2
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
- package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
- package/.agents/workflows/helpers/code-review.md +14 -12
- package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
- package/.agents/workflows/helpers/deliver-story.md +209 -118
- package/.agents/workflows/helpers/parallel-tooling.md +2 -2
- package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
- package/.agents/workflows/plan.md +239 -19
- package/.agents/workflows/qa-assist.md +6 -6
- package/.agents/workflows/qa-explore.md +3 -3
- package/.agents/workflows/qa-run.md +1 -5
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +62 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +17 -9
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
- package/package.json +2 -2
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -53
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -187
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +0 -128
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -21
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -397
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
- package/.agents/scripts/resolve-plan-run.js +0 -117
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
|
@@ -50,11 +50,6 @@ import {
|
|
|
50
50
|
} from '../../maintainability-engine.js';
|
|
51
51
|
import { PROJECT_ROOT } from '../../project-root.js';
|
|
52
52
|
import { transpileIfNeeded } from '../../transpile.js';
|
|
53
|
-
import {
|
|
54
|
-
hashCommandConfig,
|
|
55
|
-
recordPass,
|
|
56
|
-
shouldSkip,
|
|
57
|
-
} from '../../validation-evidence.js';
|
|
58
53
|
|
|
59
54
|
/** Worker entry that scores one file into a full maintainability report. */
|
|
60
55
|
const MAINTAINABILITY_REPORT_WORKER_URL = new URL(
|
|
@@ -141,13 +136,6 @@ export function partitionFilesForLint(changedFiles) {
|
|
|
141
136
|
return { code, md };
|
|
142
137
|
}
|
|
143
138
|
|
|
144
|
-
function resolveCurrentSha(cwd, gitSpawnFn = gitSpawn) {
|
|
145
|
-
const res = gitSpawnFn(cwd, 'rev-parse', 'HEAD');
|
|
146
|
-
if (res.status !== 0) return null;
|
|
147
|
-
const sha = (res.stdout || '').trim();
|
|
148
|
-
return sha.length > 0 ? sha : null;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
139
|
/**
|
|
152
140
|
* Read a changed file's content as it exists at `headRef` via
|
|
153
141
|
* `git show <headRef>:<relPath>`, rather than reading the on-disk copy at
|
|
@@ -260,28 +248,6 @@ export function runScopedLint(changedFiles, cwd, runnerFn = spawnLintRunner) {
|
|
|
260
248
|
return { ...summary, skipped: false, mode: 'changed-only' };
|
|
261
249
|
}
|
|
262
250
|
|
|
263
|
-
/**
|
|
264
|
-
* Compute the canonical command-config hash for the scoped-lint runner. The
|
|
265
|
-
* caller passes the partitioned biome + markdown lists so the hash captures
|
|
266
|
-
* the exact set of files; any change to that set invalidates the prior
|
|
267
|
-
* evidence and forces a re-lint.
|
|
268
|
-
*
|
|
269
|
-
* Exported for testing.
|
|
270
|
-
*/
|
|
271
|
-
export function buildLintEvidenceConfig(changedFiles, cwd) {
|
|
272
|
-
const { code, md } = partitionFilesForLint(changedFiles);
|
|
273
|
-
const args = [];
|
|
274
|
-
if (code.length > 0) args.push('biome', 'lint', ...code);
|
|
275
|
-
if (md.length > 0) {
|
|
276
|
-
args.push('markdownlint', ...md, '--ignore', 'node_modules');
|
|
277
|
-
}
|
|
278
|
-
return hashCommandConfig({
|
|
279
|
-
cmd: 'epic-code-review/scoped-lint',
|
|
280
|
-
args,
|
|
281
|
-
cwd,
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
|
|
285
251
|
/**
|
|
286
252
|
* Pure: classify a single file's maintainability report into a row + optional
|
|
287
253
|
* Finding-shaped entries. `reportFn` is the thunk that produces the file's
|
|
@@ -548,87 +514,9 @@ function _emptyResults() {
|
|
|
548
514
|
};
|
|
549
515
|
}
|
|
550
516
|
|
|
551
|
-
function tryEvidenceSkip({
|
|
552
|
-
storyId,
|
|
553
|
-
epicId,
|
|
554
|
-
useEvidence,
|
|
555
|
-
headSha,
|
|
556
|
-
evidenceCfg,
|
|
557
|
-
shouldSkipFn,
|
|
558
|
-
logger,
|
|
559
|
-
}) {
|
|
560
|
-
if (!(useEvidence && storyId && epicId && headSha)) return null;
|
|
561
|
-
const verdict = shouldSkipFn(
|
|
562
|
-
{
|
|
563
|
-
storyId,
|
|
564
|
-
gateName: 'epic-code-review/lint',
|
|
565
|
-
currentSha: headSha,
|
|
566
|
-
configHash: evidenceCfg,
|
|
567
|
-
},
|
|
568
|
-
{ cwd: PROJECT_ROOT, epicId },
|
|
569
|
-
);
|
|
570
|
-
if (!verdict.skip) return null;
|
|
571
|
-
logger?.info?.(
|
|
572
|
-
`[native-review] Scoped lint skipped (evidence match: SHA=${headSha.slice(
|
|
573
|
-
0,
|
|
574
|
-
7,
|
|
575
|
-
)}, recorded ${verdict.record?.timestamp ?? 'n/a'}).`,
|
|
576
|
-
);
|
|
577
|
-
return {
|
|
578
|
-
errors: 0,
|
|
579
|
-
warnings: 0,
|
|
580
|
-
parsed: false,
|
|
581
|
-
skipped: true,
|
|
582
|
-
mode: 'changed-only',
|
|
583
|
-
evidenceSkipped: true,
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
function maybeRecordLintEvidence({
|
|
588
|
-
storyId,
|
|
589
|
-
epicId,
|
|
590
|
-
useEvidence,
|
|
591
|
-
headSha,
|
|
592
|
-
evidenceCfg,
|
|
593
|
-
lintSummary,
|
|
594
|
-
recordPassFn,
|
|
595
|
-
logger,
|
|
596
|
-
}) {
|
|
597
|
-
const eligible =
|
|
598
|
-
useEvidence &&
|
|
599
|
-
storyId &&
|
|
600
|
-
epicId &&
|
|
601
|
-
headSha &&
|
|
602
|
-
lintSummary.errors === 0 &&
|
|
603
|
-
!lintSummary.skipped;
|
|
604
|
-
if (!eligible) return;
|
|
605
|
-
try {
|
|
606
|
-
recordPassFn(
|
|
607
|
-
{
|
|
608
|
-
storyId,
|
|
609
|
-
gateName: 'epic-code-review/lint',
|
|
610
|
-
sha: headSha,
|
|
611
|
-
configHash: evidenceCfg,
|
|
612
|
-
exitCode: 0,
|
|
613
|
-
},
|
|
614
|
-
{ cwd: PROJECT_ROOT, epicId },
|
|
615
|
-
);
|
|
616
|
-
} catch (err) {
|
|
617
|
-
logger?.warn?.(
|
|
618
|
-
`[native-review] Failed to record lint evidence: ${err?.message ?? err}`,
|
|
619
|
-
);
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
517
|
async function runLintPhase({
|
|
624
518
|
scopeLint,
|
|
625
519
|
changedFiles,
|
|
626
|
-
storyId,
|
|
627
|
-
epicId,
|
|
628
|
-
useEvidence,
|
|
629
|
-
gitSpawnFn,
|
|
630
|
-
shouldSkipFn,
|
|
631
|
-
recordPassFn,
|
|
632
520
|
runScopedLintFn,
|
|
633
521
|
logger,
|
|
634
522
|
}) {
|
|
@@ -644,34 +532,10 @@ async function runLintPhase({
|
|
|
644
532
|
mode: 'off',
|
|
645
533
|
};
|
|
646
534
|
}
|
|
647
|
-
const evidenceCfg = buildLintEvidenceConfig(changedFiles, PROJECT_ROOT);
|
|
648
|
-
const headSha = resolveCurrentSha(PROJECT_ROOT, gitSpawnFn);
|
|
649
|
-
const skipSummary = tryEvidenceSkip({
|
|
650
|
-
storyId,
|
|
651
|
-
epicId,
|
|
652
|
-
useEvidence,
|
|
653
|
-
headSha,
|
|
654
|
-
evidenceCfg,
|
|
655
|
-
shouldSkipFn,
|
|
656
|
-
logger,
|
|
657
|
-
});
|
|
658
|
-
if (skipSummary) return skipSummary;
|
|
659
|
-
|
|
660
535
|
logger?.info?.(
|
|
661
536
|
'[native-review] Linting changed files only (biome + markdownlint, scoped to diff)...',
|
|
662
537
|
);
|
|
663
|
-
|
|
664
|
-
maybeRecordLintEvidence({
|
|
665
|
-
storyId,
|
|
666
|
-
epicId,
|
|
667
|
-
useEvidence,
|
|
668
|
-
headSha,
|
|
669
|
-
evidenceCfg,
|
|
670
|
-
lintSummary,
|
|
671
|
-
recordPassFn,
|
|
672
|
-
logger,
|
|
673
|
-
});
|
|
674
|
-
return lintSummary;
|
|
538
|
+
return runScopedLintFn(changedFiles, PROJECT_ROOT);
|
|
675
539
|
}
|
|
676
540
|
|
|
677
541
|
/**
|
|
@@ -686,12 +550,8 @@ async function runLintPhase({
|
|
|
686
550
|
* runScopedLintFn?: typeof runScopedLint,
|
|
687
551
|
* analyzeChangedFilesFn?: typeof analyzeChangedFiles,
|
|
688
552
|
* buildLintFindingsFn?: typeof buildLintFindings,
|
|
689
|
-
* shouldSkipFn?: typeof shouldSkip,
|
|
690
|
-
* recordPassFn?: typeof recordPass,
|
|
691
553
|
* logger?: { info?: Function, warn?: Function, error?: Function },
|
|
692
554
|
* scopeLint?: 'changed-only'|'off',
|
|
693
|
-
* storyId?: number|null,
|
|
694
|
-
* useEvidence?: boolean,
|
|
695
555
|
* }} [deps]
|
|
696
556
|
* @returns {ReviewProvider}
|
|
697
557
|
*/
|
|
@@ -701,12 +561,8 @@ export function createNativeProvider(deps = {}) {
|
|
|
701
561
|
runScopedLintFn = runScopedLint,
|
|
702
562
|
analyzeChangedFilesFn = analyzeChangedFiles,
|
|
703
563
|
buildLintFindingsFn = buildLintFindings,
|
|
704
|
-
shouldSkipFn = shouldSkip,
|
|
705
|
-
recordPassFn = recordPass,
|
|
706
564
|
logger,
|
|
707
565
|
scopeLint = 'changed-only',
|
|
708
|
-
storyId = null,
|
|
709
|
-
useEvidence = true,
|
|
710
566
|
} = deps;
|
|
711
567
|
|
|
712
568
|
return {
|
|
@@ -761,18 +617,9 @@ export function createNativeProvider(deps = {}) {
|
|
|
761
617
|
gitSpawnFn,
|
|
762
618
|
});
|
|
763
619
|
|
|
764
|
-
// Epic-scope reviews flow through validation-evidence; story-scope
|
|
765
|
-
// reviews currently share the same gate name, keyed on the storyId.
|
|
766
|
-
const epicId = scope === 'epic' ? ticketId : null;
|
|
767
620
|
const lintSummary = await runLintPhase({
|
|
768
621
|
scopeLint,
|
|
769
622
|
changedFiles,
|
|
770
|
-
storyId: storyId ?? (scope === 'story' ? ticketId : null),
|
|
771
|
-
epicId,
|
|
772
|
-
useEvidence,
|
|
773
|
-
gitSpawnFn,
|
|
774
|
-
shouldSkipFn,
|
|
775
|
-
recordPassFn,
|
|
776
623
|
runScopedLintFn,
|
|
777
624
|
logger,
|
|
778
625
|
});
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* LLM-backed review providers.
|
|
4
4
|
*
|
|
5
5
|
* Story #3937 / #3938 — the depth lever (`light` / `standard` / `deep`,
|
|
6
|
-
*
|
|
7
|
-
* `lib/orchestration/review-depth.js
|
|
6
|
+
* derived from the diff's observable width and sensitive-path hits by
|
|
7
|
+
* `lib/orchestration/review-depth.js`; #4542 retired the judged-risk
|
|
8
|
+
* input) is threaded into every
|
|
8
9
|
* provider's `runReview` input. LLM-backed providers (codex, security-review,
|
|
9
10
|
* ultrareview) must render that lever into the prompt/instructions they emit so
|
|
10
11
|
* the model actually changes its thoroughness; the native (mechanical) provider
|
|
@@ -185,7 +185,7 @@ export const SECURITY_REVIEW_INVOKE_PROMPT =
|
|
|
185
185
|
* @returns {string}
|
|
186
186
|
*/
|
|
187
187
|
export function buildSecurityReviewPrompt(input) {
|
|
188
|
-
const scopeLabel =
|
|
188
|
+
const scopeLabel = 'Story';
|
|
189
189
|
const baseRef = typeof input?.baseRef === 'string' ? input.baseRef : '?';
|
|
190
190
|
const headRef = typeof input?.headRef === 'string' ? input.headRef : '?';
|
|
191
191
|
const ticketId =
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* @property {number=} line - 1-based line number, when attributable.
|
|
27
27
|
* @property {string=} category - Free-form tag (e.g. 'security', 'docs', 'lint').
|
|
28
28
|
*
|
|
29
|
-
* @typedef {'story'
|
|
29
|
+
* @typedef {'story'} ReviewScope
|
|
30
30
|
*
|
|
31
31
|
* @typedef {'light'|'standard'|'deep'} ReviewDepth
|
|
32
32
|
*
|
|
@@ -39,9 +39,10 @@
|
|
|
39
39
|
* lever (Story #3876/#3937/#3938). `light` → single-pass review focused on
|
|
40
40
|
* Pillar 1 (spec adherence) with Pillars 2–3 reduced to a quick scan;
|
|
41
41
|
* `standard` → all pillars at baseline depth; `deep` → all pillars plus a
|
|
42
|
-
* second adversarial pass over the diff.
|
|
43
|
-
*
|
|
44
|
-
* (`lib/orchestration/review-depth.js
|
|
42
|
+
* second adversarial pass over the diff. Derived from the diff's
|
|
43
|
+
* changed-file count and sensitive-path hits
|
|
44
|
+
* (`lib/orchestration/review-depth.js`; the judged-risk input was
|
|
45
|
+
* retired in #4542) and threaded into `runReview`.
|
|
45
46
|
* LLM-backed
|
|
46
47
|
* providers MUST render this into the prompt/instructions they emit; the
|
|
47
48
|
* native provider documents why its mechanical sweep ignores it. Absent →
|
|
@@ -55,7 +55,7 @@ export const ULTRAREVIEW_PROMPT_TEMPLATE =
|
|
|
55
55
|
* @returns {string}
|
|
56
56
|
*/
|
|
57
57
|
export function buildUltrareviewMessage(input) {
|
|
58
|
-
const scopeLabel =
|
|
58
|
+
const scopeLabel = 'Story';
|
|
59
59
|
const baseRef = typeof input?.baseRef === 'string' ? input.baseRef : '?';
|
|
60
60
|
const headRef = typeof input?.headRef === 'string' ? input.headRef : '?';
|
|
61
61
|
return ULTRAREVIEW_PROMPT_TEMPLATE.replace('{scopeLabel}', scopeLabel)
|