mandrel 1.93.0 → 2.0.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 -73
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/diagnose-friction.js +0 -6
- 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 +5 -5
- 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 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +39 -4
- package/.agents/scripts/lib/duplicate-search.js +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- 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/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- 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 +14 -14
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- 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/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- 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 +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -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 +3 -3
- package/.agents/workflows/deliver.md +122 -131
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +3 -2
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- 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 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- 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/orchestration/context-hydration-engine.js +0 -660
- 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/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 -388
- 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/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/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-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- 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 -278
- 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/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/post-merge-pipeline.js +0 -205
- 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-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- 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 -301
- 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/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- 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 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- 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 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- 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 -351
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# epic-plan-spec-author — examples & extended rationale
|
|
2
|
-
|
|
3
|
-
Read this file on demand while authoring the Tech Spec. The SKILL.md carries
|
|
4
|
-
the operating contract (Policy Capsule, Inputs / Outputs, Procedure, the two
|
|
5
|
-
authoritative system prompts, and Constraints); this file carries the worked
|
|
6
|
-
Delivery Slicing example and the extended rationale behind the slicing rules.
|
|
7
|
-
|
|
8
|
-
## Delivery Slicing — extended rationale
|
|
9
|
-
|
|
10
|
-
The Tech Spec MUST carry a `## Delivery Slicing` section in which the Architect
|
|
11
|
-
— who holds the full design — proposes how the Epic's enumerated capabilities
|
|
12
|
-
**cluster into N shippable Stories**. This section is the intentional grouping
|
|
13
|
-
the Phase 8 consolidation pass
|
|
14
|
-
([`epic-plan-consolidate`](../epic-plan-consolidate/SKILL.md)) reconciles the
|
|
15
|
-
decomposer's draft against before any GitHub write. Without it, the decompose
|
|
16
|
-
phase maps Epic capabilities to Stories ~1:1 and cannot produce a coarser,
|
|
17
|
-
holistic plan; with it, the consolidation critic has a well-defined reference
|
|
18
|
-
instead of a guess.
|
|
19
|
-
|
|
20
|
-
**The proposed count is a ceiling, not a target.** Consolidation reconciles
|
|
21
|
-
the draft *toward* your grouping, but it treats the count as an upper bound: it
|
|
22
|
-
may **merge below** your proposed count when slices form dependent
|
|
23
|
-
single-consumer chains, and it **never splits above** it. Over-slicing here
|
|
24
|
-
therefore locks in fragmentation only when the extra slices are genuinely
|
|
25
|
-
independent — so keep a slice separate only when it earns its own delivery
|
|
26
|
-
session.
|
|
27
|
-
|
|
28
|
-
**Write the Delivery Slicing section before any other section — it is the
|
|
29
|
-
primary input to Phase 8 consolidation.** Author it first so the rest of the
|
|
30
|
-
spec (Core Components, API Changes, Data Models) hangs off a deliberate
|
|
31
|
-
slicing decision rather than being reverse-engineered into one at the end.
|
|
32
|
-
Drafting it last is exactly how the model omits it under the weight of the
|
|
33
|
-
other sections.
|
|
34
|
-
|
|
35
|
-
Author the section as a table — one row per proposed slice — naming the
|
|
36
|
-
capability cluster each slice would deliver, what ships in it, and whether it
|
|
37
|
-
can ship independently. Use **noun phrases** for slice names ("Foundation",
|
|
38
|
-
"Transport seam", "Send helper") so they map cleanly onto Feature titles in the
|
|
39
|
-
resulting decomposition — never verb phrases ("Add transport") or file names
|
|
40
|
-
("`sender.ts`"). Do **not** coarsen the Epic's capability enumeration to produce
|
|
41
|
-
the slicing: the granularity lever is *this* grouping recommendation, not a
|
|
42
|
-
dumbed-down Epic enumeration.
|
|
43
|
-
|
|
44
|
-
**What "Independent?" means:** can this slice ship to production and provide
|
|
45
|
-
value *without the next slice landing*? A `Yes` slice is releasable on its own;
|
|
46
|
-
a `No` slice only becomes valuable once a later slice lands on top of it.
|
|
47
|
-
|
|
48
|
-
**"Independent? No" is a smell that must be justified.** A dependent,
|
|
49
|
-
single-consumer slice (one that only feeds the next slice) folds into its
|
|
50
|
-
consumer by default — it is not worth its own delivery session's hydration,
|
|
51
|
-
branch, PR, and CI ceremony. Mark a slice `No` only when you can name a
|
|
52
|
-
one-line reason to keep it separate anyway: **parallelism** (two `No` slices
|
|
53
|
-
that can be delivered concurrently by different sessions), **risk isolation**
|
|
54
|
-
(a blast-radius or reviewability reason to land it as its own reviewable PR),
|
|
55
|
-
or **delivery-envelope pressure** (folding it in would push the consumer past a
|
|
56
|
-
single-session sizing envelope). Absent such a justification, do not author the
|
|
57
|
-
slice as its own row — fold it into its consumer and let the merged slice carry
|
|
58
|
-
the combined capability.
|
|
59
|
-
|
|
60
|
-
### Worked example
|
|
61
|
-
|
|
62
|
-
```text
|
|
63
|
-
## Delivery Slicing
|
|
64
|
-
|
|
65
|
-
Proposed shippable slices (consolidation ceiling for Phase 8):
|
|
66
|
-
|
|
67
|
-
| Slice | What ships | Independent? |
|
|
68
|
-
| -------------- | ------------------------------------------------------ | ------------ |
|
|
69
|
-
| Foundation | Config schema, types, and the no-op default path | Yes |
|
|
70
|
-
| Transport seam | The pluggable transport interface + in-memory adapter | Yes |
|
|
71
|
-
| Send helper | The send() helper + retries, built on the transport | No (justified: risk isolation) |
|
|
72
|
-
|
|
73
|
-
- **Foundation** folds Epic capabilities "config surface" + "type model" — they
|
|
74
|
-
share a reason to exist and ship as one reviewable PR.
|
|
75
|
-
- **Transport seam** is the pluggable boundary; it provides value on its own
|
|
76
|
-
(in-memory adapter is usable for tests) so it is independently shippable.
|
|
77
|
-
- **Send helper** depends on the transport seam landing first, so it is *not*
|
|
78
|
-
independent. It stays its own slice only because the retry/backoff logic is a
|
|
79
|
-
large, high-blast-radius surface worth isolating in its own reviewable PR
|
|
80
|
-
(risk isolation). Absent that justification it would fold into Transport
|
|
81
|
-
seam — a bare "depends on the previous slice" is not a reason to keep it
|
|
82
|
-
separate.
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
The consolidation pass degrades gracefully when this section is absent (it
|
|
86
|
-
falls back to cohesion + single-Story-Feature rules only), so authoring it is
|
|
87
|
-
how the Architect steers the decomposition toward fewer, right-sized Stories.
|
|
88
|
-
Because the count is a **ceiling**, an over-sliced table is coarsened back
|
|
89
|
-
during consolidation — but only where the extra slices are dependent
|
|
90
|
-
single-consumer chains, so an unjustified `No` slice is the one you should fold
|
|
91
|
-
in yourself rather than leaning on the consolidator to catch.
|
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: frontend-ui-engineering
|
|
3
|
-
description:
|
|
4
|
-
Builds production-quality UIs. Use when building or modifying user-facing
|
|
5
|
-
interfaces. Use when creating components, implementing layouts, managing
|
|
6
|
-
state, or when the output needs to look and feel production-quality rather
|
|
7
|
-
than AI-generated.
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Frontend UI Engineering
|
|
11
|
-
|
|
12
|
-
## Policy Capsule
|
|
13
|
-
|
|
14
|
-
- Build UI that meets WCAG 2.1 AA: every interactive element keyboard-accessible, ARIA labels on icon-only controls, focus moved when content changes, color never the sole indicator of state.
|
|
15
|
-
- Adhere to the project's design system — use semantic tokens (`text-primary`, `bg-surface`) and the spacing scale (no arbitrary pixel values, no inline styles).
|
|
16
|
-
- Avoid the "AI aesthetic": no default purple/indigo palettes, gratuitous gradients, blanket `rounded-2xl`, oversized padding, or shadow-heavy layering.
|
|
17
|
-
- Prefer composition over configuration; keep components focused (split anything past ~200 lines) and separate data-fetching containers from presentation components.
|
|
18
|
-
- Choose the simplest state mechanism that works: local `useState` → lifted state → context (read-heavy) → URL state → server-state library → global store; do not prop-drill past three levels.
|
|
19
|
-
- Render meaningful loading, empty, and error states for every async surface — skeletons for content (not spinners), and explicit empty-state copy + CTA.
|
|
20
|
-
- Design mobile-first and verify at 320 / 768 / 1024 / 1440 px breakpoints before claiming responsive.
|
|
21
|
-
- Respect the heading hierarchy (one `h1` per page, no skipped levels) and never re-purpose heading styles for non-heading content.
|
|
22
|
-
- Verify accessibility tooling (axe-core / dev-tools warnings) is clean and a screen reader can convey the page structure before marking the work done.
|
|
23
|
-
|
|
24
|
-
## Overview
|
|
25
|
-
|
|
26
|
-
Build production-quality user interfaces that are accessible, performant, and
|
|
27
|
-
visually polished. The goal is UI that looks like it was built by a design-aware
|
|
28
|
-
engineer at a top company — not like it was generated by an AI. This means real
|
|
29
|
-
design system adherence, proper accessibility, thoughtful interaction patterns,
|
|
30
|
-
and no generic "AI aesthetic."
|
|
31
|
-
|
|
32
|
-
## When to Use
|
|
33
|
-
|
|
34
|
-
- Building new UI components or pages
|
|
35
|
-
- Modifying existing user-facing interfaces
|
|
36
|
-
- Implementing responsive layouts
|
|
37
|
-
- Adding interactivity or state management
|
|
38
|
-
- Fixing visual or UX issues
|
|
39
|
-
|
|
40
|
-
## Component Architecture
|
|
41
|
-
|
|
42
|
-
### File Structure
|
|
43
|
-
|
|
44
|
-
Colocate everything related to a component:
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
src/components/
|
|
48
|
-
TaskList/
|
|
49
|
-
TaskList.tsx # Component implementation
|
|
50
|
-
TaskList.test.tsx # Tests
|
|
51
|
-
TaskList.stories.tsx # Storybook stories (if using)
|
|
52
|
-
use-task-list.ts # Custom hook (if complex state)
|
|
53
|
-
types.ts # Component-specific types (if needed)
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Component Patterns
|
|
57
|
-
|
|
58
|
-
**Prefer composition over configuration:**
|
|
59
|
-
|
|
60
|
-
```tsx
|
|
61
|
-
// Good: Composable
|
|
62
|
-
<Card>
|
|
63
|
-
<CardHeader>
|
|
64
|
-
<CardTitle>Tasks</CardTitle>
|
|
65
|
-
</CardHeader>
|
|
66
|
-
<CardBody>
|
|
67
|
-
<TaskList tasks={tasks} />
|
|
68
|
-
</CardBody>
|
|
69
|
-
</Card>
|
|
70
|
-
|
|
71
|
-
// Avoid: Over-configured
|
|
72
|
-
<Card
|
|
73
|
-
title="Tasks"
|
|
74
|
-
headerVariant="large"
|
|
75
|
-
bodyPadding="md"
|
|
76
|
-
content={<TaskList tasks={tasks} />}
|
|
77
|
-
/>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Keep components focused:**
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
// Good: Does one thing
|
|
84
|
-
export function TaskItem({ task, onToggle, onDelete }: TaskItemProps) {
|
|
85
|
-
return (
|
|
86
|
-
<li className="flex items-center gap-3 p-3">
|
|
87
|
-
<Checkbox checked={task.done} onChange={() => onToggle(task.id)} />
|
|
88
|
-
<span className={task.done ? 'line-through text-muted' : ''}>
|
|
89
|
-
{task.title}
|
|
90
|
-
</span>
|
|
91
|
-
<Button variant="ghost" size="sm" onClick={() => onDelete(task.id)}>
|
|
92
|
-
<TrashIcon />
|
|
93
|
-
</Button>
|
|
94
|
-
</li>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**Separate data fetching from presentation:**
|
|
100
|
-
|
|
101
|
-
```tsx
|
|
102
|
-
// Container: handles data
|
|
103
|
-
export function TaskListContainer() {
|
|
104
|
-
const { tasks, isLoading, error } = useTasks();
|
|
105
|
-
|
|
106
|
-
if (isLoading) return <TaskListSkeleton />;
|
|
107
|
-
if (error)
|
|
108
|
-
return <ErrorState message="Failed to load tasks" retry={refetch} />;
|
|
109
|
-
if (tasks.length === 0) return <EmptyState message="No tasks yet" />;
|
|
110
|
-
|
|
111
|
-
return <TaskList tasks={tasks} />;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Presentation: handles rendering
|
|
115
|
-
export function TaskList({ tasks }: { tasks: Task[] }) {
|
|
116
|
-
return (
|
|
117
|
-
<ul role="list" className="divide-y">
|
|
118
|
-
{tasks.map((task) => (
|
|
119
|
-
<TaskItem key={task.id} task={task} />
|
|
120
|
-
))}
|
|
121
|
-
</ul>
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## State Management
|
|
127
|
-
|
|
128
|
-
**Choose the simplest approach that works:**
|
|
129
|
-
|
|
130
|
-
```text
|
|
131
|
-
Local state (useState) → Component-specific UI state
|
|
132
|
-
Lifted state → Shared between 2-3 sibling components
|
|
133
|
-
Context → Theme, auth, locale (read-heavy, write-rare)
|
|
134
|
-
URL state (searchParams) → Filters, pagination, shareable UI state
|
|
135
|
-
Server state (React Query, SWR) → Remote data with caching
|
|
136
|
-
Global store (Zustand, Redux) → Complex client state shared app-wide
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**Avoid prop drilling deeper than 3 levels.** If you're passing props through
|
|
140
|
-
components that don't use them, introduce context or restructure the component
|
|
141
|
-
tree.
|
|
142
|
-
|
|
143
|
-
## Design System Adherence
|
|
144
|
-
|
|
145
|
-
### Avoid the AI Aesthetic
|
|
146
|
-
|
|
147
|
-
AI-generated UI has recognizable patterns. Avoid all of them:
|
|
148
|
-
|
|
149
|
-
| AI Default | Why It Is a Problem | Production Quality |
|
|
150
|
-
| -------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
|
151
|
-
| Purple/indigo everything | Models default to visually "safe" palettes, making every app look identical | Use the project's actual color palette |
|
|
152
|
-
| Excessive gradients | Gradients add visual noise and clash with most design systems | Flat or subtle gradients matching the design system |
|
|
153
|
-
| Rounded everything (rounded-2xl) | Maximum rounding signals "friendly" but ignores the hierarchy of corner radii in real designs | Consistent border-radius from the design system |
|
|
154
|
-
| Generic hero sections | Template-driven layout with no connection to the actual content or user need | Content-first layouts |
|
|
155
|
-
| Lorem ipsum-style copy | Placeholder text hides layout problems that real content reveals (length, wrapping, overflow) | Realistic placeholder content |
|
|
156
|
-
| Oversized padding everywhere | Equal generous padding destroys visual hierarchy and wastes screen space | Consistent spacing scale |
|
|
157
|
-
| Stock card grids | Uniform grids are a layout shortcut that ignores information priority and scanning patterns | Purpose-driven layouts |
|
|
158
|
-
| Shadow-heavy design | Layered shadows add depth that competes with content and slows rendering on low-end devices | Subtle or no shadows unless the design system specifies |
|
|
159
|
-
|
|
160
|
-
### Spacing and Layout
|
|
161
|
-
|
|
162
|
-
Use a consistent spacing scale. Don't invent values:
|
|
163
|
-
|
|
164
|
-
```css
|
|
165
|
-
/* Use the scale: 0.25rem increments (or whatever the project uses) */
|
|
166
|
-
/* Good */
|
|
167
|
-
padding: 1rem; /* 16px */
|
|
168
|
-
/* Good */
|
|
169
|
-
gap: 0.75rem; /* 12px */
|
|
170
|
-
/* Bad */
|
|
171
|
-
padding: 13px; /* Not on any scale */
|
|
172
|
-
/* Bad */
|
|
173
|
-
margin-top: 2.3rem; /* Not on any scale */
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Typography
|
|
177
|
-
|
|
178
|
-
Respect the type hierarchy:
|
|
179
|
-
|
|
180
|
-
```text
|
|
181
|
-
h1 → Page title (one per page)
|
|
182
|
-
h2 → Section title
|
|
183
|
-
h3 → Subsection title
|
|
184
|
-
body → Default text
|
|
185
|
-
small → Secondary/helper text
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
Don't skip heading levels. Don't use heading styles for non-heading content.
|
|
189
|
-
|
|
190
|
-
### Color
|
|
191
|
-
|
|
192
|
-
- Use semantic color tokens: `text-primary`, `bg-surface`, `border-default` —
|
|
193
|
-
not raw hex values
|
|
194
|
-
- Ensure sufficient contrast (4.5:1 for normal text, 3:1 for large text)
|
|
195
|
-
- Don't rely solely on color to convey information (use icons, text, or patterns
|
|
196
|
-
too)
|
|
197
|
-
|
|
198
|
-
## Accessibility (WCAG 2.1 AA)
|
|
199
|
-
|
|
200
|
-
Every component must meet these standards:
|
|
201
|
-
|
|
202
|
-
### Keyboard Navigation
|
|
203
|
-
|
|
204
|
-
```tsx
|
|
205
|
-
// Every interactive element must be keyboard accessible
|
|
206
|
-
<button onClick={handleClick}>Click me</button> // ✓ Focusable by default
|
|
207
|
-
<div onClick={handleClick}>Click me</div> // ✗ Not focusable
|
|
208
|
-
<div role="button" tabIndex={0} onClick={handleClick} // ✓ But prefer <button>
|
|
209
|
-
onKeyDown={e => e.key === 'Enter' && handleClick()}>
|
|
210
|
-
Click me
|
|
211
|
-
</div>
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### ARIA Labels
|
|
215
|
-
|
|
216
|
-
```tsx
|
|
217
|
-
// Label interactive elements that lack visible text
|
|
218
|
-
<button aria-label="Close dialog"><XIcon /></button>
|
|
219
|
-
|
|
220
|
-
// Label form inputs
|
|
221
|
-
<label htmlFor="email">Email</label>
|
|
222
|
-
<input id="email" type="email" />
|
|
223
|
-
|
|
224
|
-
// Or use aria-label when no visible label exists
|
|
225
|
-
<input aria-label="Search tasks" type="search" />
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Focus Management
|
|
229
|
-
|
|
230
|
-
```tsx
|
|
231
|
-
// Move focus when content changes
|
|
232
|
-
function Dialog({ isOpen, onClose }: DialogProps) {
|
|
233
|
-
const closeRef = useRef<HTMLButtonElement>(null);
|
|
234
|
-
|
|
235
|
-
useEffect(() => {
|
|
236
|
-
if (isOpen) closeRef.current?.focus();
|
|
237
|
-
}, [isOpen]);
|
|
238
|
-
|
|
239
|
-
// Trap focus inside dialog when open
|
|
240
|
-
return (
|
|
241
|
-
<dialog open={isOpen}>
|
|
242
|
-
<button ref={closeRef} onClick={onClose}>
|
|
243
|
-
Close
|
|
244
|
-
</button>
|
|
245
|
-
{/* dialog content */}
|
|
246
|
-
</dialog>
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### Meaningful Empty and Error States
|
|
252
|
-
|
|
253
|
-
```tsx
|
|
254
|
-
// Don't show blank screens
|
|
255
|
-
function TaskList({ tasks }: { tasks: Task[] }) {
|
|
256
|
-
if (tasks.length === 0) {
|
|
257
|
-
return (
|
|
258
|
-
<div role="status" className="text-center py-12">
|
|
259
|
-
<TasksEmptyIcon className="mx-auto h-12 w-12 text-muted" />
|
|
260
|
-
<h3 className="mt-2 text-sm font-medium">No tasks</h3>
|
|
261
|
-
<p className="mt-1 text-sm text-muted">
|
|
262
|
-
Get started by creating a new task.
|
|
263
|
-
</p>
|
|
264
|
-
<Button className="mt-4" onClick={onCreateTask}>
|
|
265
|
-
Create Task
|
|
266
|
-
</Button>
|
|
267
|
-
</div>
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
return <ul role="list">...</ul>;
|
|
272
|
-
}
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
## Responsive Design
|
|
276
|
-
|
|
277
|
-
Design for mobile first, then expand:
|
|
278
|
-
|
|
279
|
-
```tsx
|
|
280
|
-
// Tailwind: mobile-first responsive
|
|
281
|
-
<div className="
|
|
282
|
-
grid grid-cols-1 /* Mobile: single column */
|
|
283
|
-
sm:grid-cols-2 /* Small: 2 columns */
|
|
284
|
-
lg:grid-cols-3 /* Large: 3 columns */
|
|
285
|
-
gap-4
|
|
286
|
-
">
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
Test at these breakpoints: 320px, 768px, 1024px, 1440px.
|
|
290
|
-
|
|
291
|
-
## Loading and Transitions
|
|
292
|
-
|
|
293
|
-
```tsx
|
|
294
|
-
// Skeleton loading (not spinners for content)
|
|
295
|
-
function TaskListSkeleton() {
|
|
296
|
-
return (
|
|
297
|
-
<div className="space-y-3" aria-busy="true" aria-label="Loading tasks">
|
|
298
|
-
{Array.from({ length: 3 }).map((_, i) => (
|
|
299
|
-
<div key={i} className="h-12 bg-muted animate-pulse rounded" />
|
|
300
|
-
))}
|
|
301
|
-
</div>
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Optimistic updates for perceived speed
|
|
306
|
-
function useToggleTask() {
|
|
307
|
-
const queryClient = useQueryClient();
|
|
308
|
-
|
|
309
|
-
return useMutation({
|
|
310
|
-
mutationFn: toggleTask,
|
|
311
|
-
onMutate: async (taskId) => {
|
|
312
|
-
await queryClient.cancelQueries({ queryKey: ['tasks'] });
|
|
313
|
-
const previous = queryClient.getQueryData(['tasks']);
|
|
314
|
-
|
|
315
|
-
queryClient.setQueryData(['tasks'], (old: Task[]) =>
|
|
316
|
-
old.map((t) => (t.id === taskId ? { ...t, done: !t.done } : t)),
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
return { previous };
|
|
320
|
-
},
|
|
321
|
-
onError: (_err, _taskId, context) => {
|
|
322
|
-
queryClient.setQueryData(['tasks'], context?.previous);
|
|
323
|
-
},
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Common Rationalizations
|
|
329
|
-
|
|
330
|
-
| Rationalization | Reality |
|
|
331
|
-
| ---------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
332
|
-
| "Accessibility is a nice-to-have" | It's a legal requirement in many jurisdictions and an engineering quality standard. |
|
|
333
|
-
| "We'll make it responsive later" | Retrofitting responsive design is 3x harder than building it from the start. |
|
|
334
|
-
| "The design isn't final, so I'll skip styling" | Use the design system defaults. Unstyled UI creates a broken first impression for reviewers. |
|
|
335
|
-
| "This is just a prototype" | Prototypes become production code. Build the foundation right. |
|
|
336
|
-
| "The AI aesthetic is fine for now" | It signals low quality. Use the project's actual design system from the start. |
|
|
337
|
-
|
|
338
|
-
## Red Flags
|
|
339
|
-
|
|
340
|
-
- Components with more than 200 lines (split them)
|
|
341
|
-
- Inline styles or arbitrary pixel values
|
|
342
|
-
- Missing error states, loading states, or empty states
|
|
343
|
-
- No keyboard navigation testing
|
|
344
|
-
- Color as the sole indicator of state (red/green without text or icons)
|
|
345
|
-
- Generic "AI look" (purple gradients, oversized cards, stock layouts)
|
|
346
|
-
|
|
347
|
-
## Verification
|
|
348
|
-
|
|
349
|
-
After building UI:
|
|
350
|
-
|
|
351
|
-
- [ ] Component renders without console errors
|
|
352
|
-
- [ ] All interactive elements are keyboard accessible (Tab through the page)
|
|
353
|
-
- [ ] Screen reader can convey the page's content and structure
|
|
354
|
-
- [ ] Responsive: works at 320px, 768px, 1024px, 1440px
|
|
355
|
-
- [ ] Loading, error, and empty states all handled
|
|
356
|
-
- [ ] Follows the project's design system (spacing, colors, typography)
|
|
357
|
-
- [ ] No accessibility warnings in dev tools or axe-core
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: hydrate-context
|
|
3
|
-
description: >-
|
|
4
|
-
Hydrate a Story ticket into a structured ContextEnvelope (or the
|
|
5
|
-
legacy `{ prompt }` stdout wrapper). Reads the ticket body, resolves the
|
|
6
|
-
parent Epic, embeds the sectioned Epic body (acceptance-table section
|
|
7
|
-
stripped), and assembles
|
|
8
|
-
named sections with provenance and section-aware elision. Successor to
|
|
9
|
-
the retired mandrel MCP `context.hydrate` tool.
|
|
10
|
-
allowed_tools:
|
|
11
|
-
- Read
|
|
12
|
-
- Bash
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# hydrate-context
|
|
16
|
-
|
|
17
|
-
## Policy Capsule
|
|
18
|
-
|
|
19
|
-
- Invoke via `node .agents/scripts/hydrate-context.js --ticket <id> [--epic <id>]`; the wrapping CLI is the only supported entry point and delegates to `lib/orchestration/context-hydration-engine.js`.
|
|
20
|
-
- Treat the operation as strictly **read-only on GitHub** — never modify ticket bodies, never post comments, never apply labels.
|
|
21
|
-
- When `--epic` is omitted, parse the Epic ID from the ticket body's `Epic: #N` line; do not infer it from elsewhere.
|
|
22
|
-
- Surface `persona::*` and `skill::*` labels from the ticket into the composed prompt so the downstream executor can pin its sub-agent dispatch.
|
|
23
|
-
- Emit exactly one JSON object on stdout (`{ "prompt": "..." }` by default, or `{ "envelope": {...} }` with `--emit envelope`) and nothing else — no temp files, no diagnostic prints that would corrupt the envelope.
|
|
24
|
-
- Honour the engine's context-budget cap via section-aware elision (`elideEnvelope`): lower-priority sections drop or summarize before higher-priority ones. Never silently truncate mid-string.
|
|
25
|
-
- Do not persist the composed prompt to disk; forwarding is the caller's responsibility.
|
|
26
|
-
|
|
27
|
-
## Role
|
|
28
|
-
|
|
29
|
-
Context aggregator. Resolves a ticket's hierarchy (Story → Epic)
|
|
30
|
-
and stitches the Epic body — the single planning document, carrying the
|
|
31
|
-
folded Tech Spec sections — plus the Story body into a
|
|
32
|
-
single prompt the executor consumes. The Epic body is embedded with its
|
|
33
|
-
`## Acceptance Table` managed section stripped (close-time reconciliation
|
|
34
|
-
detail the executor does not need); there is no separate Tech Spec fetch
|
|
35
|
-
(Story #4324).
|
|
36
|
-
|
|
37
|
-
## When to use
|
|
38
|
-
|
|
39
|
-
Whenever an Epic-scoped sub-agent needs the same context bundle the
|
|
40
|
-
human operator would assemble manually before opening the file editor.
|
|
41
|
-
The wrapping script `hydrate-context.js` is the CLI today; this Skill
|
|
42
|
-
documents the dispatch contract for callers that want to invoke via
|
|
43
|
-
the Skill tool.
|
|
44
|
-
|
|
45
|
-
## Inputs
|
|
46
|
-
|
|
47
|
-
- `--ticket <id>` — GitHub issue number to hydrate (required).
|
|
48
|
-
- `--epic <id>` (optional) — when omitted, parsed from the ticket
|
|
49
|
-
body's `Epic: #N` line.
|
|
50
|
-
|
|
51
|
-
Persona and skill labels are read off the ticket
|
|
52
|
-
(`persona::*`, `skill::*`) and surfaced in the composed prompt so the
|
|
53
|
-
executor can pin its sub-agent dispatch.
|
|
54
|
-
|
|
55
|
-
## Outputs
|
|
56
|
-
|
|
57
|
-
The engine assembles a typed **ContextEnvelope** (`lib/orchestration/context-envelope.js`) and serializes it for consumers:
|
|
58
|
-
|
|
59
|
-
| Field | Role |
|
|
60
|
-
| --- | --- |
|
|
61
|
-
| `schemaVersion` | Always `"1"` for the current contract. |
|
|
62
|
-
| `task` | `{ id, title, persona?, skills?, protocolVersion? }` from the ticket and labels. |
|
|
63
|
-
| `sections[]` | Named blocks (`protocolPolicy`, `persona`, `skillCapsules`, `hierarchy`, `acceptanceCriteria`, `verificationCommands`, `taskInstructions`) each with `priority`, `elideWhenOverBudget` (`drop` \| `summarize`), `content`, `estimatedTokens`, optional `source`. |
|
|
64
|
-
| `provenance[]` | Ticket snapshots: `{ id, version, hash, retrievedAt }` so auditors can cite what was fetched. |
|
|
65
|
-
| `budget` | `{ maxTokens, used, elided[] }` after `elideEnvelope` runs. |
|
|
66
|
-
| `warnings[]` | Non-fatal hydration notices (missing files, skipped skills, etc.). |
|
|
67
|
-
|
|
68
|
-
Default CLI stdout (backward-compatible wrapper):
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{ "prompt": "..." }
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
`prompt` is `envelopeToPrompt(envelope)` — sections joined in `SECTION_RENDER_ORDER`, not elision priority. For inspection or downstream tools that consume the typed shape:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
node .agents/scripts/hydrate-context.js --ticket <id> --emit envelope
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
```json
|
|
81
|
-
{ "envelope": { "schemaVersion": "1", "task": { ... }, "sections": [ ... ], "provenance": [ ... ], "budget": { ... }, "warnings": [ ... ] } }
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
The Skill writes nothing else — no GitHub comments, no temp files.
|
|
85
|
-
Idempotence is trivial because the operation is read-only.
|
|
86
|
-
|
|
87
|
-
## Procedure
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
node .agents/scripts/hydrate-context.js --ticket <id> [--epic <id>]
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Delegates to `hydrateContext` from
|
|
94
|
-
`lib/orchestration/context-hydration-engine.js`. The engine handles
|
|
95
|
-
provider I/O, body parsing, provenance stamping, and
|
|
96
|
-
`elideEnvelope` when `budget.used` exceeds `limits.maxTokenBudget`.
|
|
97
|
-
|
|
98
|
-
**Section-aware elision.** Each section carries a numeric `priority`
|
|
99
|
-
(lower drops first) and an `elideWhenOverBudget` policy (`drop` removes
|
|
100
|
-
the section; `summarize` keeps a head excerpt). Defaults live in
|
|
101
|
-
`DEFAULT_SECTION_PRIORITIES` and `DEFAULT_ELIDE_POLICIES` in
|
|
102
|
-
`context-envelope.js`. Elided section names are recorded in
|
|
103
|
-
`budget.elided`.
|
|
104
|
-
|
|
105
|
-
**Capsule-only skill loading.** Activated skills resolve through
|
|
106
|
-
`skills.index.json` and `loadSkillCapsule`, emitting only the Policy
|
|
107
|
-
Capsule (the skill's non-negotiables) plus a pointer instruction into the
|
|
108
|
-
`skillCapsules` section. Full `SKILL.md` bodies are never inlined into a
|
|
109
|
-
task prompt — the sub-agent reads the full playbook on demand via the
|
|
110
|
-
rendered `Read <path>` pointer. The full-body injection path, the
|
|
111
|
-
`fullSkillBodies` config flag, and the `skill::full` label were removed in
|
|
112
|
-
a hard cutover (Story #3863); the only residual full-body emission is the
|
|
113
|
-
defensive fallback when a `SKILL.md` is missing its capsule marker (a
|
|
114
|
-
malformed manifest), which also logs a warning.
|
|
115
|
-
|
|
116
|
-
## Constraints
|
|
117
|
-
|
|
118
|
-
- Do **not** modify ticket bodies or post comments. The Skill is
|
|
119
|
-
strictly read-only on GitHub.
|
|
120
|
-
- Do **not** persist the composed prompt to disk. The caller is
|
|
121
|
-
responsible for forwarding the stdout envelope to its consumer.
|
|
122
|
-
- Do **not** bypass the context-budget cap — honour `elideEnvelope`
|
|
123
|
-
and the per-section policies; never silently truncate.
|