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.
- package/.agents/README.md +1 -1
- package/.agents/docs/agentrc-reference.json +1 -2
- package/.agents/docs/configuration.md +2 -4
- package/.agents/docs/workflows.md +1 -1
- package/.agents/schemas/agentrc.schema.json +1 -5
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +2 -1
- package/.agents/scripts/agents-update-preflight.js +235 -0
- package/.agents/scripts/apply-quality-bootstrap.js +79 -0
- package/.agents/scripts/audit-labels-bootstrap.js +52 -30
- package/.agents/scripts/audit-to-stories.js +54 -0
- package/.agents/scripts/bootstrap.js +13 -3
- package/.agents/scripts/epic-deliver-preflight.js +30 -13
- package/.agents/scripts/epic-deliver-prepare.js +40 -53
- package/.agents/scripts/epic-execute-record-wave.js +119 -133
- package/.agents/scripts/generate-config-docs.js +189 -94
- package/.agents/scripts/lib/audit-suite/findings.js +0 -4
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +99 -0
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +13 -5
- package/.agents/scripts/lib/baseline-snapshot.js +163 -4
- package/.agents/scripts/lib/baselines/refresh-service.js +13 -5
- package/.agents/scripts/lib/config/baselines.js +0 -20
- package/.agents/scripts/lib/config/explain.js +0 -2
- package/.agents/scripts/lib/config/limits.js +19 -8
- package/.agents/scripts/lib/config/temp-paths.js +0 -31
- package/.agents/scripts/lib/config-settings-schema.js +1 -2
- package/.agents/scripts/lib/crap-utils.js +281 -0
- package/.agents/scripts/lib/maintainability-utils.js +32 -9
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -2
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +11 -7
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +6 -6
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +11 -5
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +203 -110
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +38 -162
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +3 -4
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +16 -13
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +10 -7
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +37 -24
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +0 -4
- package/.agents/scripts/lib/orchestration/manifest-builder.js +6 -0
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +101 -70
- package/.agents/scripts/lib/orchestration/spec-renderer.js +42 -14
- package/.agents/scripts/lib/orchestration/ticket-lease.js +3 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +6 -2
- package/.agents/scripts/lib/orchestration/wave-record-io.js +18 -77
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +78 -122
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +21 -226
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +18 -1
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +77 -4
- package/.agents/scripts/lib/story-adjacency.js +14 -10
- package/.agents/scripts/lib/story-body/story-body.js +142 -65
- package/.agents/scripts/lib/templates/decomposer-prompts.js +23 -3
- package/.agents/scripts/lib/test-tiers.js +13 -7
- package/.agents/scripts/lib/wave-runner/ready-set.js +295 -0
- package/.agents/scripts/lib/wave-runner/tick.js +446 -216
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +2 -1
- package/.agents/scripts/lib/workers/combined-mi-crap-worker.js +226 -0
- package/.agents/scripts/lint-label-vocabulary.js +1 -1
- package/.agents/scripts/providers/github/issues.js +48 -0
- package/.agents/scripts/providers/github.js +1 -0
- package/.agents/scripts/stories-wave-tick.js +262 -161
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +6 -0
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +108 -101
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/workflows/agents-update.md +205 -28
- package/.agents/workflows/deliver.md +12 -9
- package/.agents/workflows/helpers/deliver-epic.md +126 -90
- package/.agents/workflows/helpers/deliver-stories.md +131 -85
- package/.agents/workflows/helpers/plan-epic.md +13 -10
- package/.agents/workflows/plan.md +1 -1
- package/README.md +20 -0
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +49 -6
- package/lib/cli/update.js +335 -332
- package/package.json +16 -11
- 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.
|
|
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.
|
|
78
|
-
"@commitlint/cli": "^21.0.
|
|
79
|
-
"@commitlint/config-conventional": "^21.0.
|
|
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.
|
|
84
|
-
"knip": "^6.
|
|
85
|
-
"lint-staged": "^17.0.
|
|
86
|
-
"markdownlint-cli2": "^0.
|
|
87
|
-
"memfs": "^4.57.
|
|
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.
|
|
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
|
-
}
|