mandrel 1.94.0 → 2.1.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 +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- 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/retro.end.schema.json +1 -1
- 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 +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.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 +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- 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/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -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 +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- 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 +26 -24
- 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/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- 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/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- 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 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- 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 +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- 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 +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- 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/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- 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 +17 -19
- 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/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- 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/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- 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/review-provider-factory.js +21 -56
- 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 +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- 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 +86 -41
- 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 +77 -32
- 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 +44 -0
- 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 +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- 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 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- 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/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- 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 +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -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 +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- 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 +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- 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 +3 -53
- 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/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -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 +12 -8
- 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/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- 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/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- 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 -219
- 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/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- 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/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- 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 -33
- 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 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* plan-phase-cleanup.js — Post-phase temp-file cleanup for `/plan`.
|
|
3
3
|
*
|
|
4
|
-
* The spec and decompose phases write several
|
|
5
|
-
* the per-
|
|
6
|
-
* `temp/
|
|
4
|
+
* The spec and decompose phases write several run-scoped temp files under
|
|
5
|
+
* the per-run tree (`temp/run-<id>/planner-context.json`,
|
|
6
|
+
* `temp/run-<id>/techspec.md`, etc. — see `lib/config/temp-paths.js`). The
|
|
7
7
|
* workflow .md previously told the operator to `Remove-Item` those files by
|
|
8
8
|
* name at the end of each phase, which rots: adding a new temp file in the
|
|
9
9
|
* script required a synchronized markdown edit, and missed edits left
|
|
@@ -19,20 +19,20 @@
|
|
|
19
19
|
* never sinks a successful phase.
|
|
20
20
|
*
|
|
21
21
|
* Migration note (Epic #1030 Story #1040): the legacy flat layout
|
|
22
|
-
* (`temp/planner-context-
|
|
23
|
-
* resolver now delegates to `
|
|
24
|
-
* `lib/config/temp-paths.js`, which yields `temp/
|
|
22
|
+
* (`temp/planner-context-for-<id>.json` etc.) has been retired. The
|
|
23
|
+
* resolver now delegates to `runArtifactPath` from
|
|
24
|
+
* `lib/config/temp-paths.js`, which yields `temp/run-<id>/<basename>`
|
|
25
25
|
* under the configured `tempRoot`.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
import fs from 'node:fs/promises';
|
|
29
29
|
import path from 'node:path';
|
|
30
|
-
import {
|
|
30
|
+
import { runArtifactPath } from './config/temp-paths.js';
|
|
31
31
|
import { PROJECT_ROOT, resolveConfig } from './config-resolver.js';
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Map of phase → artifact basenames (no path components). The per-
|
|
35
|
-
* directory prefix is supplied by `
|
|
34
|
+
* Map of phase → artifact basenames (no path components). The per-run
|
|
35
|
+
* directory prefix is supplied by `runArtifactPath` at resolution time.
|
|
36
36
|
*/
|
|
37
37
|
export const PHASE_TEMP_BASENAMES = Object.freeze({
|
|
38
38
|
spec: Object.freeze([
|
|
@@ -45,15 +45,13 @@ export const PHASE_TEMP_BASENAMES = Object.freeze({
|
|
|
45
45
|
// plan-phase artifact and deletes them ONLY at terminal success (after
|
|
46
46
|
// the `agent::ready` flip), fixing the mid-pipeline deletion defect where
|
|
47
47
|
// per-phase cleanup removed artifacts a `--force`/`--resume` re-persist
|
|
48
|
-
// was still entitled to reuse.
|
|
49
|
-
// the split-phase cleanup never owned it, which orphaned it in temp/.
|
|
48
|
+
// was still entitled to reuse.
|
|
50
49
|
// `plan-metrics.json` stays deliberately excluded (PR1) — the ledger
|
|
51
50
|
// must survive cleanup so the whole plan run is visible in one stream.
|
|
52
51
|
persist: Object.freeze([
|
|
53
52
|
'planner-context.json',
|
|
54
53
|
'techspec.md',
|
|
55
54
|
'acceptance-spec.md',
|
|
56
|
-
'risk-verdict.json',
|
|
57
55
|
'decomposer-context.json',
|
|
58
56
|
'tickets.json',
|
|
59
57
|
]),
|
|
@@ -84,8 +82,8 @@ export function resolvePhaseTempPaths(phase, epicId, repoRoot = PROJECT_ROOT) {
|
|
|
84
82
|
config = undefined;
|
|
85
83
|
}
|
|
86
84
|
return basenames.map((basename) => {
|
|
87
|
-
const rel =
|
|
88
|
-
// `
|
|
85
|
+
const rel = runArtifactPath(epicId, basename, config);
|
|
86
|
+
// `runArtifactPath` yields a path under `tempRoot` (relative when
|
|
89
87
|
// tempRoot is itself relative — the framework default). Rebase
|
|
90
88
|
// relative paths against `repoRoot` so callers always receive an
|
|
91
89
|
// absolute path — matches the pre-migration contract that
|
|
@@ -2,305 +2,36 @@
|
|
|
2
2
|
* planning-corpus.js — corpus-aware context for the standalone-Story
|
|
3
3
|
* planning path (Story #4432).
|
|
4
4
|
*
|
|
5
|
-
* `/plan --
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* project already has — the docs digest and the relevant Tech Spec
|
|
10
|
-
* sections of existing Epics that cover the touched area.
|
|
11
|
-
*
|
|
12
|
-
* This module assembles that inherited context (`corpusContext`) for
|
|
13
|
-
* `story-plan.js`'s `--emit-context` envelope:
|
|
5
|
+
* `/plan --seed` drafts a standalone Story from the seed, the body
|
|
6
|
+
* template, and a title-only duplicate scan. This module assembles the
|
|
7
|
+
* inherited context (`corpusContext`) for `story-plan.js`'s
|
|
8
|
+
* `--emit-context` envelope:
|
|
14
9
|
*
|
|
15
10
|
* 1. `docsDigest` — the same per-project docs digest
|
|
16
11
|
* `orchestration/docs-digest.js` builds for `/deliver` Story
|
|
17
12
|
* children, reused here so the standalone path gets the same
|
|
18
13
|
* compact outline instead of re-reading the whole docs set.
|
|
19
14
|
* `null` when `project.docsContextFiles` is not configured.
|
|
20
|
-
* 2. `relevantSections` —
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* `issueToEpicListItem`, which deliberately omits `body` (a list-scale
|
|
27
|
-
* payload trim). Body content therefore requires an **explicit**,
|
|
28
|
-
* bounded per-candidate fetch via `provider.getEpic(id)` — never a
|
|
29
|
-
* silent assumption that the list response carries prose to score
|
|
30
|
-
* against.
|
|
31
|
-
*
|
|
32
|
-
* Relevance scoring reuses the same `tokenize` / `overlapScore` Jaccard
|
|
33
|
-
* primitives `duplicate-search.js` exports for Epic-dedupe and
|
|
34
|
-
* `story-plan.js` reuses for Story-dedupe — one matcher, three
|
|
35
|
-
* consumers, no forked scoring logic.
|
|
15
|
+
* 2. `relevantSections` — always `[]`. This field previously carried
|
|
16
|
+
* ranked Tech Spec excerpts mined from open Epics. v2.0.0 removed
|
|
17
|
+
* the Epic tier, and the provider's Epic-list surface was reduced
|
|
18
|
+
* to a `return []` stub, which made the entire ranking pipeline a
|
|
19
|
+
* permanent no-op. The pipeline has been removed; the field is
|
|
20
|
+
* retained so the envelope shape stays stable for its consumers.
|
|
36
21
|
*/
|
|
37
22
|
|
|
38
|
-
import { overlapScore, tokenize } from './duplicate-search.js';
|
|
39
|
-
import { extractEpicSection, hasEpicSection } from './epic-body-sections.js';
|
|
40
|
-
import { Logger } from './Logger.js';
|
|
41
23
|
import { buildDocsDigest } from './orchestration/docs-digest.js';
|
|
42
24
|
|
|
43
|
-
/** Top-K Epics kept after the cheap title-only ranking pass. */
|
|
44
|
-
const DEFAULT_CORPUS_MAX_CANDIDATES = 5;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Bound on the explicit per-candidate body fetch. Keeps corpus-context
|
|
48
|
-
* assembly at a fixed, small number of GitHub reads regardless of how
|
|
49
|
-
* many open Epics the repo carries.
|
|
50
|
-
*/
|
|
51
|
-
export const DEFAULT_CORPUS_BODY_FETCH_TOP_K = 3;
|
|
52
|
-
|
|
53
|
-
/** Minimum Jaccard overlap for a section excerpt to be worth surfacing. */
|
|
54
|
-
const DEFAULT_CORPUS_MIN_SCORE = 0.1;
|
|
55
|
-
|
|
56
|
-
/** Max relevant-section excerpts returned in the envelope. */
|
|
57
|
-
const DEFAULT_CORPUS_MAX_SECTIONS = 5;
|
|
58
|
-
|
|
59
|
-
/** Excerpt length cap (chars) so one oversized Tech Spec doesn't blow the envelope. */
|
|
60
|
-
const EXCERPT_MAX_CHARS = 600;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Page-scan cap passed to `provider.getEpics({ state: 'open', pageCap })`.
|
|
64
|
-
* The corpus lookup only ever ranks the list down to a top-5 shortlist
|
|
65
|
-
* (`DEFAULT_CORPUS_MAX_CANDIDATES`), so there is no need to inherit
|
|
66
|
-
* `paginateRest`'s full default ceiling (50 pages / 5000 items) to build
|
|
67
|
-
* it — a bounded scan keeps this call a fixed, small number of GitHub
|
|
68
|
-
* reads regardless of how many open Epics the repo carries.
|
|
69
|
-
*/
|
|
70
|
-
const CORPUS_EPICS_PAGE_CAP = 5;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Rank open Epics by title-overlap with the seed. This is the cheap
|
|
74
|
-
* first pass over the list surface (title only — `issueToEpicListItem`
|
|
75
|
-
* has no `body`), used solely to pick the bounded top-K candidates
|
|
76
|
-
* worth an explicit body fetch. It is not the final relevance signal;
|
|
77
|
-
* `extractRelevantSections` re-scores against actual section content.
|
|
78
|
-
*
|
|
79
|
-
* @param {{ seed: string, epics: Array<{ id:number, title:string }>, maxResults?: number }} opts
|
|
80
|
-
* @returns {Array<{ id:number, title:string, score:number }>}
|
|
81
|
-
*/
|
|
82
|
-
export function rankCandidateEpics({
|
|
83
|
-
seed,
|
|
84
|
-
epics,
|
|
85
|
-
maxResults = DEFAULT_CORPUS_MAX_CANDIDATES,
|
|
86
|
-
}) {
|
|
87
|
-
if (!seed || typeof seed !== 'string') {
|
|
88
|
-
throw new Error('rankCandidateEpics: seed must be a non-empty string');
|
|
89
|
-
}
|
|
90
|
-
if (!Array.isArray(epics)) {
|
|
91
|
-
throw new Error('rankCandidateEpics: epics must be an array');
|
|
92
|
-
}
|
|
93
|
-
const seedTokens = tokenize(seed);
|
|
94
|
-
if (seedTokens.size === 0) return [];
|
|
95
|
-
|
|
96
|
-
const ranked = [];
|
|
97
|
-
for (const epic of epics) {
|
|
98
|
-
if (!epic || typeof epic.title !== 'string') continue;
|
|
99
|
-
const score = overlapScore(seedTokens, tokenize(epic.title));
|
|
100
|
-
ranked.push({
|
|
101
|
-
id: epic.id,
|
|
102
|
-
title: epic.title,
|
|
103
|
-
score: Number(score.toFixed(4)),
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
ranked.sort((a, b) => b.score - a.score);
|
|
107
|
-
return ranked.slice(0, maxResults);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Fetch full bodies for the top-K ranked candidates via the single-issue
|
|
112
|
-
* read (`provider.getEpic`), which — unlike the `getEpics` list mapper —
|
|
113
|
-
* does carry `body`. This is the explicit, bounded fetch the corpus
|
|
114
|
-
* lookup performs instead of assuming the list surface already has
|
|
115
|
-
* prose to score: a candidate never contributes a relevant section
|
|
116
|
-
* without this round-trip resolving its body.
|
|
117
|
-
*
|
|
118
|
-
* A single candidate's fetch failing (deleted issue, transient error) is
|
|
119
|
-
* non-fatal — it is dropped from the result rather than aborting corpus
|
|
120
|
-
* assembly for every other candidate. Failures are logged via
|
|
121
|
-
* `Logger.debug` (stderr) so they are visible under
|
|
122
|
-
* `AGENT_LOG_LEVEL=verbose` triage without violating the friction-
|
|
123
|
-
* telemetry posture in `.agents/instructions.md` §1.H of never silently
|
|
124
|
-
* swallowing an error.
|
|
125
|
-
*
|
|
126
|
-
* The bounded candidate slice is fetched concurrently
|
|
127
|
-
* (`Promise.allSettled`) rather than sequentially — `topK` is a fixed
|
|
128
|
-
* small ceiling (default 3), so this is a bounded fan-out, not an
|
|
129
|
-
* unbounded one, and it removes the serial network-latency stacking a
|
|
130
|
-
* plain `for`-await loop would otherwise incur.
|
|
131
|
-
*
|
|
132
|
-
* @param {{ provider: object, candidates: Array<{ id:number, title:string }>, topK?: number }} opts
|
|
133
|
-
* @returns {Promise<Array<{ id:number, title:string, body:string }>>}
|
|
134
|
-
*/
|
|
135
|
-
export async function fetchCandidateBodies({
|
|
136
|
-
provider,
|
|
137
|
-
candidates,
|
|
138
|
-
topK = DEFAULT_CORPUS_BODY_FETCH_TOP_K,
|
|
139
|
-
}) {
|
|
140
|
-
if (!provider || typeof provider.getEpic !== 'function') return [];
|
|
141
|
-
if (!Array.isArray(candidates) || candidates.length === 0) return [];
|
|
142
|
-
|
|
143
|
-
const bounded = candidates.slice(0, topK);
|
|
144
|
-
const settled = await Promise.allSettled(
|
|
145
|
-
bounded.map(async (candidate) => {
|
|
146
|
-
const epic = await provider.getEpic(candidate.id);
|
|
147
|
-
return {
|
|
148
|
-
id: candidate.id,
|
|
149
|
-
title: candidate.title ?? epic?.title ?? '',
|
|
150
|
-
body: epic?.body ?? '',
|
|
151
|
-
};
|
|
152
|
-
}),
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
const results = [];
|
|
156
|
-
for (let i = 0; i < settled.length; i += 1) {
|
|
157
|
-
const outcome = settled[i];
|
|
158
|
-
if (outcome.status === 'fulfilled') {
|
|
159
|
-
results.push(outcome.value);
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
// Best-effort: one candidate failing to resolve must not abort
|
|
163
|
-
// corpus-context assembly for the rest — but the failure is still
|
|
164
|
-
// surfaced for triage rather than silently swallowed.
|
|
165
|
-
Logger.debug(
|
|
166
|
-
`[planning-corpus] fetchCandidateBodies: candidate #${bounded[i].id} failed to resolve: ${outcome.reason?.message ?? outcome.reason}`,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
return results;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Extract a scoreable excerpt from an Epic body: the managed Tech Spec
|
|
174
|
-
* region when present (the folded `## Delivery Slicing` section, #4324),
|
|
175
|
-
* otherwise the ideation lede — the prose before the first `##` heading
|
|
176
|
-
* — so a plain-body Epic still contributes something to score.
|
|
177
|
-
*
|
|
178
|
-
* @param {string} body
|
|
179
|
-
* @returns {{ kind:'techSpec'|'lede', content:string }}
|
|
180
|
-
*/
|
|
181
|
-
function extractScoreableExcerpt(body) {
|
|
182
|
-
if (hasEpicSection(body, 'techSpec')) {
|
|
183
|
-
return { kind: 'techSpec', content: extractEpicSection(body, 'techSpec') };
|
|
184
|
-
}
|
|
185
|
-
const lede = (body ?? '').split(/^##\s+/m)[0].trim();
|
|
186
|
-
return { kind: 'lede', content: lede };
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Rank existing-Epic body excerpts (Tech Spec section, or lede) by
|
|
191
|
-
* overlap with the seed. Reuses the same `tokenize` / `overlapScore`
|
|
192
|
-
* primitives as the title-ranking pass above and as
|
|
193
|
-
* `duplicate-search.js` — one matcher shared across every corpus /
|
|
194
|
-
* dedupe surface.
|
|
195
|
-
*
|
|
196
|
-
* @param {{ seed:string, epicBodies: Array<{ id:number, title:string, body:string }>, maxResults?: number, minScore?: number }} opts
|
|
197
|
-
* @returns {Array<{ epicId:number, epicTitle:string, section:'techSpec'|'lede', score:number, excerpt:string }>}
|
|
198
|
-
*/
|
|
199
|
-
export function extractRelevantSections({
|
|
200
|
-
seed,
|
|
201
|
-
epicBodies,
|
|
202
|
-
maxResults = DEFAULT_CORPUS_MAX_SECTIONS,
|
|
203
|
-
minScore = DEFAULT_CORPUS_MIN_SCORE,
|
|
204
|
-
}) {
|
|
205
|
-
if (!seed || typeof seed !== 'string') {
|
|
206
|
-
throw new Error('extractRelevantSections: seed must be a non-empty string');
|
|
207
|
-
}
|
|
208
|
-
if (!Array.isArray(epicBodies)) {
|
|
209
|
-
throw new Error('extractRelevantSections: epicBodies must be an array');
|
|
210
|
-
}
|
|
211
|
-
const seedTokens = tokenize(seed);
|
|
212
|
-
if (seedTokens.size === 0) return [];
|
|
213
|
-
|
|
214
|
-
const ranked = [];
|
|
215
|
-
for (const epic of epicBodies) {
|
|
216
|
-
if (!epic) continue;
|
|
217
|
-
const { kind, content } = extractScoreableExcerpt(epic.body ?? '');
|
|
218
|
-
if (!content) continue;
|
|
219
|
-
const score = overlapScore(seedTokens, tokenize(content));
|
|
220
|
-
if (score < minScore) continue;
|
|
221
|
-
ranked.push({
|
|
222
|
-
epicId: epic.id,
|
|
223
|
-
epicTitle: epic.title ?? null,
|
|
224
|
-
section: kind,
|
|
225
|
-
score: Number(score.toFixed(4)),
|
|
226
|
-
excerpt: content.slice(0, EXCERPT_MAX_CHARS),
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
ranked.sort((a, b) => b.score - a.score);
|
|
230
|
-
return ranked.slice(0, maxResults);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
25
|
/**
|
|
234
26
|
* Assemble the `corpusContext` field of the story-plan context envelope.
|
|
235
|
-
* Pure orchestration over the three helpers above plus `buildDocsDigest`
|
|
236
|
-
* — no I/O beyond what `provider` and the docs-digest reader perform.
|
|
237
|
-
*
|
|
238
|
-
* `relevantSections` is `[]` (not an error) when the provider has no
|
|
239
|
-
* `getEpics` surface, the seed tokenizes to nothing, or no candidate
|
|
240
|
-
* clears `minScore` — the standalone-Story draft path degrades to
|
|
241
|
-
* exactly today's blank-slate behavior in that case.
|
|
242
27
|
*
|
|
243
28
|
* @param {{
|
|
244
|
-
* seed: string,
|
|
245
|
-
* provider?: { getEpics?: Function, getEpic?: Function },
|
|
246
29
|
* docsContextFiles?: string[],
|
|
247
30
|
* docsRoot?: string,
|
|
248
|
-
* maxCandidates?: number,
|
|
249
|
-
* bodyFetchTopK?: number,
|
|
250
|
-
* maxSections?: number,
|
|
251
|
-
* minScore?: number,
|
|
252
31
|
* }} opts
|
|
253
32
|
* @returns {Promise<{ docsDigest: string|null, relevantSections: Array<object> }>}
|
|
254
33
|
*/
|
|
255
|
-
export async function buildCorpusContext({
|
|
256
|
-
seed,
|
|
257
|
-
provider,
|
|
258
|
-
docsContextFiles,
|
|
259
|
-
docsRoot,
|
|
260
|
-
maxCandidates = DEFAULT_CORPUS_MAX_CANDIDATES,
|
|
261
|
-
bodyFetchTopK = DEFAULT_CORPUS_BODY_FETCH_TOP_K,
|
|
262
|
-
maxSections = DEFAULT_CORPUS_MAX_SECTIONS,
|
|
263
|
-
minScore = DEFAULT_CORPUS_MIN_SCORE,
|
|
264
|
-
}) {
|
|
34
|
+
export async function buildCorpusContext({ docsContextFiles, docsRoot }) {
|
|
265
35
|
const docsDigest = await buildDocsDigest({ docsContextFiles, docsRoot });
|
|
266
|
-
|
|
267
|
-
let relevantSections = [];
|
|
268
|
-
if (provider && typeof provider.getEpics === 'function') {
|
|
269
|
-
// A single candidate-listing call failing (rate limit, transient
|
|
270
|
-
// network error, provider outage) must not abort the whole
|
|
271
|
-
// `--emit-context` envelope build — degrade to an empty candidate
|
|
272
|
-
// list instead of letting the rejection propagate out of the
|
|
273
|
-
// caller's `Promise.all` and take down the rest of the envelope
|
|
274
|
-
// (body template, tech-stack summary, docs digest) with it.
|
|
275
|
-
let epics = [];
|
|
276
|
-
try {
|
|
277
|
-
epics = await provider.getEpics({
|
|
278
|
-
state: 'open',
|
|
279
|
-
pageCap: CORPUS_EPICS_PAGE_CAP,
|
|
280
|
-
});
|
|
281
|
-
} catch (err) {
|
|
282
|
-
Logger.debug(
|
|
283
|
-
`[planning-corpus] buildCorpusContext: provider.getEpics failed, degrading to an empty candidate list: ${err?.message ?? err}`,
|
|
284
|
-
);
|
|
285
|
-
epics = [];
|
|
286
|
-
}
|
|
287
|
-
const ranked = rankCandidateEpics({
|
|
288
|
-
seed,
|
|
289
|
-
epics: Array.isArray(epics) ? epics : [],
|
|
290
|
-
maxResults: maxCandidates,
|
|
291
|
-
});
|
|
292
|
-
const bodies = await fetchCandidateBodies({
|
|
293
|
-
provider,
|
|
294
|
-
candidates: ranked,
|
|
295
|
-
topK: bodyFetchTopK,
|
|
296
|
-
});
|
|
297
|
-
relevantSections = extractRelevantSections({
|
|
298
|
-
seed,
|
|
299
|
-
epicBodies: bodies,
|
|
300
|
-
maxResults: maxSections,
|
|
301
|
-
minScore,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return { docsDigest, relevantSections };
|
|
36
|
+
return { docsDigest, relevantSections: [] };
|
|
306
37
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module is the single implementation of the "run the registry, fail
|
|
5
5
|
* fast on blockers, log auto-fixes" pattern. The consumer entry points
|
|
6
|
-
* (story-close.js
|
|
6
|
+
* (`single-story-close.js`, `mandrel-update-preflight.js`, the npm test wrapper, and
|
|
7
7
|
* the bootstrap scripts) call `runPreflight({ scope })` instead of
|
|
8
8
|
* re-implementing the same assemble+run+format+exit-2 dance.
|
|
9
9
|
*
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* auto-fixes. The wrapper prints a human-readable blocker table
|
|
14
14
|
* (`id · summary · fixCommand`) before returning. Code 2 is the
|
|
15
15
|
* project-wide "preflight refused" reservation — see
|
|
16
|
-
*
|
|
16
|
+
* `.agents/workflows/helpers/deliver-story.md` for the rationale.
|
|
17
17
|
*
|
|
18
18
|
* Auto-fixes are logged via `logFixes` before the blocker check so the
|
|
19
19
|
* operator sees the "we corrected X" line even when a separate blocker
|
|
@@ -52,8 +52,8 @@ const DEFAULT_LOGGER = {
|
|
|
52
52
|
* flag, finding/fix routing, and pretty-print of the blocker table.
|
|
53
53
|
*
|
|
54
54
|
* @param {object} opts
|
|
55
|
-
* @param {string} opts.scope Consumer surface — `'
|
|
56
|
-
* `'
|
|
55
|
+
* @param {string} opts.scope Consumer surface — `'story-close'`,
|
|
56
|
+
* `'npm-test'`, `'diagnose'`, etc.
|
|
57
57
|
* @param {boolean} [opts.autoFix=true] Forwarded to `runChecks`. Defaults
|
|
58
58
|
* to `true` because every wiring call site at this Story's level wants
|
|
59
59
|
* auto-correction (the `retro` consumer that needs `autoFix:false` does
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
// `.agents/rules/testing-standards.md` (unit / contract / acceptance) are
|
|
10
10
|
// PRESENT, and which are ABSENT — and why.
|
|
11
11
|
//
|
|
12
|
-
// A scenario that is skipped does not exercise anything — a `@skip`
|
|
13
|
-
//
|
|
12
|
+
// A scenario that is skipped does not exercise anything — a `@skip`
|
|
13
|
+
// Gherkin tag (or a runner equivalent such as `it.skip` / `xit` /
|
|
14
14
|
// `describe.skip`, or a `skipped: true` descriptor field) means the test is
|
|
15
15
|
// inert at run time. This module therefore treats a skipped test as ABSENT
|
|
16
16
|
// for its tier: it never bumps a tier into `present`, because a tier whose
|
|
@@ -49,10 +49,10 @@ export const TIERS = Object.freeze(['unit', 'contract', 'acceptance']);
|
|
|
49
49
|
const PRESENT = 'present';
|
|
50
50
|
const ABSENT = 'absent';
|
|
51
51
|
|
|
52
|
-
/** True when `value` contains a `@skip`
|
|
52
|
+
/** True when `value` contains a `@skip` Gherkin-style tag. */
|
|
53
53
|
function hasSkipTag(value) {
|
|
54
54
|
if (typeof value !== 'string') return false;
|
|
55
|
-
return /(^|[\s,])@
|
|
55
|
+
return /(^|[\s,])@skip\b/i.test(value);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/** True when `value` contains a runner-level skip/pending marker. */
|
|
@@ -67,7 +67,7 @@ function hasRunnerSkipMarker(value) {
|
|
|
67
67
|
/**
|
|
68
68
|
* True when a test descriptor is marked skipped/pending and therefore must
|
|
69
69
|
* NOT count toward its tier. Recognizes:
|
|
70
|
-
* - a `@skip`
|
|
70
|
+
* - a `@skip` tag in a `tags` array or whitespace/comma string,
|
|
71
71
|
* - the same tags embedded in a path or descriptor `name`,
|
|
72
72
|
* - explicit boolean flags (`skipped`, `pending`),
|
|
73
73
|
* - runner skip markers in a path/name (`it.skip`, `xit`, `xdescribe`,
|
|
@@ -142,7 +142,7 @@ export async function verifySurfaceMap(surfaceMap, gitPort, baseRef) {
|
|
|
142
142
|
* with no network when the ports are fakes.
|
|
143
143
|
*
|
|
144
144
|
* @param {{
|
|
145
|
-
*
|
|
145
|
+
* ticketNumber: number,
|
|
146
146
|
* githubPort: GithubPort,
|
|
147
147
|
* gitPort: GitPort,
|
|
148
148
|
* surfaceMap?: SurfaceMapEntry[],
|
|
@@ -162,7 +162,7 @@ export async function verifySurfaceMap(surfaceMap, gitPort, baseRef) {
|
|
|
162
162
|
*/
|
|
163
163
|
export async function hydrateQaContext(opts) {
|
|
164
164
|
const {
|
|
165
|
-
|
|
165
|
+
ticketNumber,
|
|
166
166
|
githubPort,
|
|
167
167
|
gitPort,
|
|
168
168
|
surfaceMap = [],
|
|
@@ -172,9 +172,9 @@ export async function hydrateQaContext(opts) {
|
|
|
172
172
|
fsImpl,
|
|
173
173
|
} = opts ?? {};
|
|
174
174
|
|
|
175
|
-
if (!Number.isInteger(
|
|
175
|
+
if (!Number.isInteger(ticketNumber)) {
|
|
176
176
|
throw new Error(
|
|
177
|
-
'hydrateQaContext: `
|
|
177
|
+
'hydrateQaContext: `ticketNumber` is required and must be an integer',
|
|
178
178
|
);
|
|
179
179
|
}
|
|
180
180
|
if (!githubPort || typeof githubPort.fetchIssue !== 'function') {
|
|
@@ -192,7 +192,7 @@ export async function hydrateQaContext(opts) {
|
|
|
192
192
|
);
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
const epicIssue = await githubPort.fetchIssue(
|
|
195
|
+
const epicIssue = await githubPort.fetchIssue(ticketNumber);
|
|
196
196
|
const epic = {
|
|
197
197
|
number: epicIssue.number,
|
|
198
198
|
body: epicIssue.body ?? '',
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* + `schema`; `buildSpanTree` was a throwing placeholder.
|
|
11
11
|
* - Epic #1181 / Story #1440 / Task #1461 — placeholder replaced by
|
|
12
12
|
* the real export from `./span-tree.js`.
|
|
13
|
-
* - Story #1476 — `appendSignal` / `appendTrace`
|
|
14
|
-
*
|
|
13
|
+
* - Story #1476 — `appendSignal` / `appendTrace` re-exported here
|
|
14
|
+
* via `./write.js` so the gate scripts (and any
|
|
15
15
|
* new code) converge on `lib/signals/` instead of importing the
|
|
16
16
|
* writer directly from `lib/observability/`.
|
|
17
17
|
*
|
|
@@ -21,19 +21,6 @@
|
|
|
21
21
|
import { read } from './read.js';
|
|
22
22
|
import * as schema from './schema.js';
|
|
23
23
|
import { buildSpanTree } from './span-tree.js';
|
|
24
|
-
import {
|
|
25
|
-
appendEpicSignal,
|
|
26
|
-
appendSignal,
|
|
27
|
-
appendTrace,
|
|
28
|
-
forEachLine,
|
|
29
|
-
} from './write.js';
|
|
24
|
+
import { appendSignal, appendTrace, forEachLine } from './write.js';
|
|
30
25
|
|
|
31
|
-
export {
|
|
32
|
-
appendEpicSignal,
|
|
33
|
-
appendSignal,
|
|
34
|
-
appendTrace,
|
|
35
|
-
buildSpanTree,
|
|
36
|
-
forEachLine,
|
|
37
|
-
read,
|
|
38
|
-
schema,
|
|
39
|
-
};
|
|
26
|
+
export { appendSignal, appendTrace, buildSpanTree, forEachLine, read, schema };
|