mandrel 1.68.0 → 1.70.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.
Files changed (75) hide show
  1. package/.agents/README.md +1 -1
  2. package/.agents/docs/agentrc-reference.json +1 -2
  3. package/.agents/docs/configuration.md +2 -4
  4. package/.agents/docs/workflows.md +1 -1
  5. package/.agents/schemas/agentrc.schema.json +1 -5
  6. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +2 -1
  7. package/.agents/scripts/agents-update-preflight.js +235 -0
  8. package/.agents/scripts/apply-quality-bootstrap.js +79 -0
  9. package/.agents/scripts/audit-labels-bootstrap.js +52 -30
  10. package/.agents/scripts/audit-to-stories.js +54 -0
  11. package/.agents/scripts/bootstrap.js +13 -3
  12. package/.agents/scripts/epic-deliver-preflight.js +30 -13
  13. package/.agents/scripts/epic-deliver-prepare.js +40 -53
  14. package/.agents/scripts/epic-execute-record-wave.js +119 -133
  15. package/.agents/scripts/generate-config-docs.js +189 -94
  16. package/.agents/scripts/lib/audit-suite/findings.js +0 -4
  17. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +99 -0
  18. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +13 -5
  19. package/.agents/scripts/lib/baseline-snapshot.js +163 -4
  20. package/.agents/scripts/lib/baselines/refresh-service.js +13 -5
  21. package/.agents/scripts/lib/config/baselines.js +0 -20
  22. package/.agents/scripts/lib/config/explain.js +0 -2
  23. package/.agents/scripts/lib/config/limits.js +19 -8
  24. package/.agents/scripts/lib/config/temp-paths.js +0 -31
  25. package/.agents/scripts/lib/config-settings-schema.js +1 -2
  26. package/.agents/scripts/lib/crap-utils.js +281 -0
  27. package/.agents/scripts/lib/maintainability-utils.js +32 -9
  28. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -2
  29. package/.agents/scripts/lib/orchestration/epic-cleanup.js +11 -7
  30. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +6 -6
  31. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +11 -5
  32. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +203 -110
  33. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +38 -162
  34. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +3 -4
  35. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +16 -13
  36. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +10 -7
  37. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +37 -24
  38. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +0 -4
  39. package/.agents/scripts/lib/orchestration/manifest-builder.js +6 -0
  40. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +101 -70
  41. package/.agents/scripts/lib/orchestration/spec-renderer.js +42 -14
  42. package/.agents/scripts/lib/orchestration/ticket-lease.js +3 -0
  43. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +6 -2
  44. package/.agents/scripts/lib/orchestration/wave-record-io.js +18 -77
  45. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +78 -122
  46. package/.agents/scripts/lib/orchestration/wave-record-projection.js +21 -226
  47. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +18 -1
  48. package/.agents/scripts/lib/presentation/manifest-render-waves.js +77 -4
  49. package/.agents/scripts/lib/story-adjacency.js +14 -10
  50. package/.agents/scripts/lib/story-body/story-body.js +142 -65
  51. package/.agents/scripts/lib/templates/decomposer-prompts.js +23 -3
  52. package/.agents/scripts/lib/test-tiers.js +13 -7
  53. package/.agents/scripts/lib/wave-runner/ready-set.js +295 -0
  54. package/.agents/scripts/lib/wave-runner/tick.js +446 -216
  55. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +2 -1
  56. package/.agents/scripts/lib/workers/combined-mi-crap-worker.js +226 -0
  57. package/.agents/scripts/lint-label-vocabulary.js +1 -1
  58. package/.agents/scripts/providers/github/issues.js +48 -0
  59. package/.agents/scripts/providers/github.js +1 -0
  60. package/.agents/scripts/stories-wave-tick.js +262 -161
  61. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +6 -0
  62. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +108 -101
  63. package/.agents/skills/skills.index.json +2 -2
  64. package/.agents/workflows/agents-update.md +205 -28
  65. package/.agents/workflows/deliver.md +12 -9
  66. package/.agents/workflows/helpers/deliver-epic.md +126 -90
  67. package/.agents/workflows/helpers/deliver-stories.md +131 -85
  68. package/.agents/workflows/helpers/plan-epic.md +13 -10
  69. package/.agents/workflows/plan.md +1 -1
  70. package/README.md +20 -0
  71. package/docs/CHANGELOG.md +46 -0
  72. package/lib/cli/registry.js +49 -6
  73. package/lib/cli/update.js +335 -332
  74. package/package.json +16 -11
  75. package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +0 -91
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "mandrel",
3
- "version": "1.68.0",
3
+ "version": "1.70.0",
4
4
  "description": "Claude Code-first opinionated workflow framework: instructions, personas, skills, and SDLC workflows that govern AI coding assistants.",
5
5
  "files": [
6
6
  ".agents/",
7
7
  "bin/",
8
8
  "docs/CHANGELOG.md",
9
9
  "lib/",
10
- "!lib/**/__tests__"
10
+ "!lib/**/__tests__",
11
+ "!.agents/**/__tests__"
11
12
  ],
12
13
  "publishConfig": {
13
14
  "access": "public",
@@ -74,24 +75,24 @@
74
75
  "node": ">=22.22.1 <25"
75
76
  },
76
77
  "devDependencies": {
77
- "@biomejs/biome": "^2.4.15",
78
- "@commitlint/cli": "^21.0.1",
79
- "@commitlint/config-conventional": "^21.0.1",
78
+ "@biomejs/biome": "^2.5.0",
79
+ "@commitlint/cli": "^21.0.2",
80
+ "@commitlint/config-conventional": "^21.0.2",
80
81
  "c8": "^11.0.0",
81
82
  "chokidar": "^5.0.0",
82
83
  "husky": "^9.1.7",
83
- "jscpd": "^4.2.4",
84
- "knip": "^6.14.0",
85
- "lint-staged": "^17.0.4",
86
- "markdownlint-cli2": "^0.18.1",
87
- "memfs": "^4.57.2",
84
+ "jscpd": "^4.2.5",
85
+ "knip": "^6.17.1",
86
+ "lint-staged": "^17.0.7",
87
+ "markdownlint-cli2": "^0.22.1",
88
+ "memfs": "^4.57.7",
88
89
  "node-pty": "^1.0.0",
89
90
  "typescript": ">=5.0.0"
90
91
  },
91
92
  "dependencies": {
92
93
  "ajv": "^8.20.0",
93
94
  "ajv-formats": "^3.0.1",
94
- "js-yaml": "^4.1.1",
95
+ "js-yaml": "^4.2.0",
95
96
  "minimatch": "^10.0.0",
96
97
  "picomatch": "^4.0.4",
97
98
  "string-argv": "^0.3.2",
@@ -104,5 +105,9 @@
104
105
  "typescript": {
105
106
  "optional": true
106
107
  }
108
+ },
109
+ "overrides": {
110
+ "js-yaml": "^4.2.0",
111
+ "markdown-it": "^14.2.0"
107
112
  }
108
113
  }
@@ -1,91 +0,0 @@
1
- /**
2
- * Wave-checkpoint reducers — pure functions that read the
3
- * `epic-run-state` checkpoint payload and the per-wave outcome maps.
4
- *
5
- * These two helpers historically lived inside the iterate-waves phase
6
- * (`lib/orchestration/epic-runner/phases/iterate-waves.js`) but are
7
- * consumed by both the phase and the stateless wave-runner `tick.js`.
8
- * Hosting them here severs the planner→phase import coupling: `tick.js`
9
- * no longer reaches up into the epic-runner phase tree just to derive a
10
- * force-fresh set, and the phase imports them back from this neutral
11
- * module.
12
- *
13
- * Both functions are pure: they read their argument and return a value
14
- * without I/O, so they can be unit-tested in isolation.
15
- *
16
- * @module lib/wave-runner/wave-checkpoint
17
- */
18
-
19
- /**
20
- * Pull the set of Story IDs that the prior checkpoint marked as part of
21
- * a halted wave. Story #1795 — used by the resume-check cache pre-warm:
22
- * Stories appearing in this set are force-fresh-fetched on resume (the
23
- * operator may have hand-edited their labels during the blocker
24
- * window); every other Story serves its resume-check from the
25
- * provider's in-process cache.
26
- *
27
- * Tolerant of partial/legacy checkpoint shapes: a missing or
28
- * unparseable checkpoint returns an empty set so the resume-check
29
- * gracefully degrades to "use cache for all" — the existing
30
- * cold-start fallback inside `getTicket` still issues the real fetch.
31
- *
32
- * @param {object | null | undefined} checkpoint
33
- * @returns {Set<number>}
34
- */
35
- export function collectHaltedStoryIds(checkpoint) {
36
- const halted = new Set();
37
- const waves = checkpoint?.waves;
38
- if (!Array.isArray(waves)) return halted;
39
- for (const wave of waves) {
40
- if (wave?.status !== 'halted') continue;
41
- const stories = Array.isArray(wave.stories) ? wave.stories : [];
42
- for (const story of stories) {
43
- const id =
44
- story?.storyId ??
45
- story?.id ??
46
- (typeof story === 'number' ? story : null);
47
- if (Number.isInteger(id) && id > 0) halted.add(id);
48
- }
49
- }
50
- return halted;
51
- }
52
-
53
- /**
54
- * Cross-event invariant guard for `wave.end` (Acceptance Spec AC-8 /
55
- * Repeatability AC #5 — wave completeness).
56
- *
57
- * The schema layer can declare key/value types for `outcomes` but
58
- * cannot enforce that the key set equals the `wave.start.storyIds` set
59
- * from earlier in the run. We enforce it here, before emit, so a
60
- * violation throws synchronously and the ledger never carries a
61
- * non-conformant record.
62
- *
63
- * Throws a typed `Error` with `code: 'WAVE_COMPLETENESS_VIOLATION'` and
64
- * attached diagnostic fields so tests and operators can reason about
65
- * the mismatch without grepping the message.
66
- *
67
- * @param {{ waveIndex: number, storyIds: number[], outcomes: Record<string, string> }} args
68
- */
69
- export function assertWaveCompleteness({ waveIndex, storyIds, outcomes }) {
70
- const expected = new Set(storyIds);
71
- const actual = new Set(
72
- Object.keys(outcomes ?? {})
73
- .map((k) => Number(k))
74
- .filter((n) => Number.isInteger(n)),
75
- );
76
- const missing = [...expected].filter((id) => !actual.has(id));
77
- const extra = [...actual].filter((id) => !expected.has(id));
78
- if (missing.length === 0 && extra.length === 0) return;
79
- const err = new Error(
80
- `wave-completeness violation for wave #${waveIndex}: ${
81
- missing.length ? `missing outcomes for [${missing.join(', ')}]` : ''
82
- }${missing.length && extra.length ? '; ' : ''}${
83
- extra.length ? `extra outcomes for [${extra.join(', ')}]` : ''
84
- }`,
85
- );
86
- err.code = 'WAVE_COMPLETENESS_VIOLATION';
87
- err.waveIndex = waveIndex;
88
- err.missing = missing;
89
- err.extra = extra;
90
- throw err;
91
- }