cleargate 0.14.0 → 0.15.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 (149) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/MANIFEST.json +71 -15
  3. package/dist/admin-api/index.cjs +0 -1
  4. package/dist/admin-api/index.js +1 -2
  5. package/dist/auth/factory.cjs +0 -1
  6. package/dist/auth/factory.js +2 -3
  7. package/dist/auth/require-token.cjs +0 -1
  8. package/dist/auth/require-token.js +1 -2
  9. package/dist/auth/token-store.cjs +0 -1
  10. package/dist/auth/token-store.js +1 -2
  11. package/dist/{bootstrap-root-QKSA5V75.js → bootstrap-root-2H5HVTCC.js} +1 -2
  12. package/dist/{chunk-PDE37WFQ.js → chunk-A7MSQUU7.js} +2 -3
  13. package/dist/{chunk-BTSZOEWC.js → chunk-P6KEDAK2.js} +0 -1
  14. package/dist/{chunk-E3X7IE5E.js → chunk-PY6FHGV5.js} +1 -2
  15. package/dist/{chunk-5DI2Z3C2.js → chunk-Y53ZZYYU.js} +1 -2
  16. package/dist/cli.cjs +1564 -1414
  17. package/dist/cli.js +1514 -1364
  18. package/dist/lib/ledger.cjs +0 -1
  19. package/dist/lib/ledger.js +1 -2
  20. package/dist/lib/lifecycle-reconcile.cjs +0 -1
  21. package/dist/lib/lifecycle-reconcile.js +2 -3
  22. package/dist/{whoami-EANGN46Z.js → whoami-JKQQPABQ.js} +3 -4
  23. package/package.json +4 -3
  24. package/templates/cleargate-planning/.claude/agents/architect.md +4 -2
  25. package/templates/cleargate-planning/.claude/agents/developer.md +4 -11
  26. package/templates/cleargate-planning/.claude/agents/qa.md +14 -6
  27. package/templates/cleargate-planning/.claude/hooks/pending-task-sentinel.sh +2 -2
  28. package/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +19 -1
  29. package/templates/cleargate-planning/.cleargate/config.example.yml +16 -0
  30. package/templates/cleargate-planning/.cleargate/scripts/close_sprint.deferred-verify.red.node.test.ts +245 -0
  31. package/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +227 -0
  32. package/templates/cleargate-planning/.cleargate/scripts/gate-checks.json +5 -4
  33. package/templates/cleargate-planning/.cleargate/scripts/init_sprint.mjs +75 -2
  34. package/templates/cleargate-planning/.cleargate/scripts/pre_gate_common.sh +48 -0
  35. package/templates/cleargate-planning/.cleargate/scripts/pre_gate_runner.sh +57 -1
  36. package/templates/cleargate-planning/.cleargate/scripts/provision_worktree_config.sh +155 -0
  37. package/templates/cleargate-planning/.cleargate/scripts/qa_red_lint.mjs +380 -0
  38. package/templates/cleargate-planning/.cleargate/scripts/run_script.sh +34 -1
  39. package/templates/cleargate-planning/.cleargate/scripts/test/cr077_eviction.red.sh +113 -0
  40. package/templates/cleargate-planning/.cleargate/scripts/test/cr078_init.test.sh +309 -0
  41. package/templates/cleargate-planning/.cleargate/scripts/test/cr079_provision.red.sh +262 -0
  42. package/templates/cleargate-planning/.cleargate/scripts/test/cr080_wrapper.test.sh +177 -0
  43. package/templates/cleargate-planning/.cleargate/scripts/test/cr081_qa_red_lint.red.sh +348 -0
  44. package/templates/cleargate-planning/.cleargate/sprint-runs/_off-sprint/.session-totals.json +1 -0
  45. package/templates/cleargate-planning/.cleargate/sprint-runs/_off-sprint/token-ledger.jsonl +27 -0
  46. package/templates/cleargate-planning/.cleargate/templates/sprint_context.md +17 -0
  47. package/templates/cleargate-planning/.cleargate/templates/story.md +1 -0
  48. package/templates/cleargate-planning/MANIFEST.json +71 -15
  49. package/dist/admin-api/index.cjs.map +0 -1
  50. package/dist/admin-api/index.js.map +0 -1
  51. package/dist/auth/factory.cjs.map +0 -1
  52. package/dist/auth/factory.js.map +0 -1
  53. package/dist/auth/require-token.cjs.map +0 -1
  54. package/dist/auth/require-token.js.map +0 -1
  55. package/dist/auth/token-store.cjs.map +0 -1
  56. package/dist/auth/token-store.js.map +0 -1
  57. package/dist/bootstrap-root-QKSA5V75.js.map +0 -1
  58. package/dist/chunk-5DI2Z3C2.js.map +0 -1
  59. package/dist/chunk-BTSZOEWC.js.map +0 -1
  60. package/dist/chunk-E3X7IE5E.js.map +0 -1
  61. package/dist/chunk-PDE37WFQ.js.map +0 -1
  62. package/dist/cli.cjs.map +0 -1
  63. package/dist/cli.js.map +0 -1
  64. package/dist/lib/ledger.cjs.map +0 -1
  65. package/dist/lib/ledger.js.map +0 -1
  66. package/dist/lib/lifecycle-reconcile.cjs.map +0 -1
  67. package/dist/lib/lifecycle-reconcile.js.map +0 -1
  68. package/dist/templates/cleargate-planning/.claude/agents/architect-reader.md +0 -61
  69. package/dist/templates/cleargate-planning/.claude/agents/architect-synth.md +0 -124
  70. package/dist/templates/cleargate-planning/.claude/agents/architect.md +0 -230
  71. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-contradict.md +0 -108
  72. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-ingest.md +0 -194
  73. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-lint.md +0 -261
  74. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-query.md +0 -143
  75. package/dist/templates/cleargate-planning/.claude/agents/developer.md +0 -185
  76. package/dist/templates/cleargate-planning/.claude/agents/devops.md +0 -257
  77. package/dist/templates/cleargate-planning/.claude/agents/qa.md +0 -171
  78. package/dist/templates/cleargate-planning/.claude/agents/reporter.md +0 -274
  79. package/dist/templates/cleargate-planning/.claude/hooks/pending-task-sentinel.sh +0 -209
  80. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit-surface-gate.sh +0 -33
  81. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit-test-ratchet.sh +0 -58
  82. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit.sh +0 -19
  83. package/dist/templates/cleargate-planning/.claude/hooks/pre-edit-gate.sh +0 -162
  84. package/dist/templates/cleargate-planning/.claude/hooks/pre-tool-use-autonomy.sh +0 -58
  85. package/dist/templates/cleargate-planning/.claude/hooks/pre-tool-use-task.sh +0 -148
  86. package/dist/templates/cleargate-planning/.claude/hooks/session-start.sh +0 -75
  87. package/dist/templates/cleargate-planning/.claude/hooks/stamp-and-gate.sh +0 -43
  88. package/dist/templates/cleargate-planning/.claude/hooks/token-ledger.sh +0 -590
  89. package/dist/templates/cleargate-planning/.claude/settings.json +0 -68
  90. package/dist/templates/cleargate-planning/.claude/skills/flashcard/SKILL.md +0 -102
  91. package/dist/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +0 -742
  92. package/dist/templates/cleargate-planning/.cleargate/FLASHCARD.md +0 -7
  93. package/dist/templates/cleargate-planning/.cleargate/config.example.yml +0 -67
  94. package/dist/templates/cleargate-planning/.cleargate/config.yml +0 -18
  95. package/dist/templates/cleargate-planning/.cleargate/delivery/archive/.gitkeep +0 -0
  96. package/dist/templates/cleargate-planning/.cleargate/delivery/pending-sync/.gitkeep +0 -0
  97. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-enforcement.md +0 -551
  98. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-protocol.md +0 -878
  99. package/dist/templates/cleargate-planning/.cleargate/knowledge/mid-sprint-triage-rubric.md +0 -160
  100. package/dist/templates/cleargate-planning/.cleargate/knowledge/readiness-gates.md +0 -213
  101. package/dist/templates/cleargate-planning/.cleargate/knowledge/sprint-closeout-checklist.md +0 -71
  102. package/dist/templates/cleargate-planning/.cleargate/scripts/_migrate-schema-v3.mjs +0 -120
  103. package/dist/templates/cleargate-planning/.cleargate/scripts/assert_story_files.mjs +0 -265
  104. package/dist/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +0 -1012
  105. package/dist/templates/cleargate-planning/.cleargate/scripts/collision_surface.sh +0 -114
  106. package/dist/templates/cleargate-planning/.cleargate/scripts/constants.mjs +0 -62
  107. package/dist/templates/cleargate-planning/.cleargate/scripts/dedupe_frontmatter.mjs +0 -219
  108. package/dist/templates/cleargate-planning/.cleargate/scripts/file_surface_diff.sh +0 -320
  109. package/dist/templates/cleargate-planning/.cleargate/scripts/gate-checks.json +0 -15
  110. package/dist/templates/cleargate-planning/.cleargate/scripts/init_gate_config.sh +0 -38
  111. package/dist/templates/cleargate-planning/.cleargate/scripts/init_sprint.mjs +0 -240
  112. package/dist/templates/cleargate-planning/.cleargate/scripts/launch_wave.mjs +0 -341
  113. package/dist/templates/cleargate-planning/.cleargate/scripts/lib/report-filename.mjs +0 -54
  114. package/dist/templates/cleargate-planning/.cleargate/scripts/pre_gate_common.sh +0 -206
  115. package/dist/templates/cleargate-planning/.cleargate/scripts/pre_gate_runner.sh +0 -371
  116. package/dist/templates/cleargate-planning/.cleargate/scripts/prefill_report.mjs +0 -280
  117. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_doc_refresh.mjs +0 -378
  118. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_qa_context.mjs +0 -888
  119. package/dist/templates/cleargate-planning/.cleargate/scripts/run_script.sh +0 -209
  120. package/dist/templates/cleargate-planning/.cleargate/scripts/sprint_trends.mjs +0 -71
  121. package/dist/templates/cleargate-planning/.cleargate/scripts/state.schema.json +0 -127
  122. package/dist/templates/cleargate-planning/.cleargate/scripts/suggest_improvements.mjs +0 -717
  123. package/dist/templates/cleargate-planning/.cleargate/scripts/surface-whitelist.txt +0 -27
  124. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_assert_story_files.sh +0 -261
  125. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_file_surface.sh +0 -210
  126. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_flashcard_gate.sh +0 -190
  127. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_prep_qa_context.sh +0 -482
  128. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_test_ratchet.sh +0 -327
  129. package/dist/templates/cleargate-planning/.cleargate/scripts/test_ratchet.mjs +0 -261
  130. package/dist/templates/cleargate-planning/.cleargate/scripts/update_state.mjs +0 -246
  131. package/dist/templates/cleargate-planning/.cleargate/scripts/validate_bounce_readiness.mjs +0 -111
  132. package/dist/templates/cleargate-planning/.cleargate/scripts/validate_state.mjs +0 -184
  133. package/dist/templates/cleargate-planning/.cleargate/scripts/write_dispatch.sh +0 -172
  134. package/dist/templates/cleargate-planning/.cleargate/templates/Bug.md +0 -126
  135. package/dist/templates/cleargate-planning/.cleargate/templates/CR.md +0 -130
  136. package/dist/templates/cleargate-planning/.cleargate/templates/Sprint Plan Template.md +0 -137
  137. package/dist/templates/cleargate-planning/.cleargate/templates/epic.md +0 -166
  138. package/dist/templates/cleargate-planning/.cleargate/templates/hotfix.md +0 -111
  139. package/dist/templates/cleargate-planning/.cleargate/templates/initiative.md +0 -122
  140. package/dist/templates/cleargate-planning/.cleargate/templates/sprint_context.md +0 -50
  141. package/dist/templates/cleargate-planning/.cleargate/templates/sprint_report.md +0 -224
  142. package/dist/templates/cleargate-planning/.cleargate/templates/story.md +0 -213
  143. package/dist/templates/cleargate-planning/CLAUDE.md +0 -66
  144. package/dist/templates/cleargate-planning/MANIFEST.json +0 -503
  145. package/dist/templates/synthesis/active-sprint.md +0 -30
  146. package/dist/templates/synthesis/open-gates.md +0 -38
  147. package/dist/templates/synthesis/product-state.md +0 -31
  148. package/dist/templates/synthesis/roadmap.md +0 -63
  149. package/dist/whoami-EANGN46Z.js.map +0 -1
@@ -1,378 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * prep_doc_refresh.mjs <sprint-id>
4
- *
5
- * Generates a per-sprint tailored doc-refresh checklist by scanning what
6
- * changed in the sprint window and matching trigger patterns from the
7
- * canonical checklist at .cleargate/knowledge/sprint-closeout-checklist.md.
8
- *
9
- * Output: .cleargate/sprint-runs/<sprint-id>/.doc-refresh-checklist.md
10
- *
11
- * Each canonical-checklist category is evaluated; items where the trigger
12
- * pattern matches at least one changed file get `- [ ]`; items where it
13
- * does not get `- [x] — no changes detected, skip`.
14
- *
15
- * Does NOT modify any documentation. Application is human-driven.
16
- *
17
- * Exit codes:
18
- * 0 — success
19
- * 1 — sprint state.json not found (sprint dir missing)
20
- * 2 — usage error (missing sprint-id argument)
21
- */
22
-
23
- import fs from 'node:fs';
24
- import path from 'node:path';
25
- import { execSync } from 'node:child_process';
26
- import { fileURLToPath } from 'node:url';
27
-
28
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
29
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
30
-
31
- /** @typedef {{ surface: string, trigger: RegExp | null, triggerDesc: string }} Item */
32
- /** @typedef {{ name: string, items: Item[] }} Category */
33
-
34
- /** @type {Category[]} */
35
- const CATEGORIES = [
36
- {
37
- name: '1. Project READMEs',
38
- items: [
39
- {
40
- surface: '`README.md`',
41
- trigger: /^README\.md$/,
42
- triggerDesc: 'any feature that changes user-visible product behavior',
43
- },
44
- {
45
- surface: '`cleargate-cli/README.md`',
46
- trigger: /^cleargate-cli\/src\/commands\//,
47
- triggerDesc: 'any change to cleargate-cli/src/commands/*.ts',
48
- },
49
- {
50
- surface: '`cleargate-planning/README.md`',
51
- trigger: /^cleargate-planning\//,
52
- triggerDesc: 'any change under cleargate-planning/',
53
- },
54
- {
55
- surface: '`mcp/README.md`',
56
- trigger: /^mcp\/src\//,
57
- triggerDesc: 'any change under mcp/src/ (nested repo — check separately)',
58
- },
59
- {
60
- surface: '`admin/README.md`',
61
- trigger: /^admin\//,
62
- triggerDesc: 'any change under admin/ (currently stub)',
63
- },
64
- ],
65
- },
66
- {
67
- name: '2. CHANGELOG files (Common-Changelog format per STORY-016-03)',
68
- items: [
69
- {
70
- surface: '`cleargate-cli/CHANGELOG.md`',
71
- trigger: /^cleargate-cli\//,
72
- triggerDesc: 'any user-visible change in cleargate-cli/ (CLI surface, error messages, package contents)',
73
- },
74
- {
75
- surface: '`mcp/CHANGELOG.md`',
76
- trigger: /^mcp\//,
77
- triggerDesc: 'any user-visible change in mcp/ (if file exists)',
78
- },
79
- ],
80
- },
81
- {
82
- name: '3. Manifest / package metadata',
83
- items: [
84
- {
85
- surface: '`cleargate-planning/MANIFEST.json`',
86
- trigger: /^(\.claude\/agents\/|\.cleargate\/templates\/|\.cleargate\/knowledge\/|\.cleargate\/scripts\/)/,
87
- triggerDesc: 'any change to .claude/agents/*.md, .cleargate/templates/*, .cleargate/knowledge/*, or .cleargate/scripts/*',
88
- },
89
- {
90
- surface: '`cleargate-cli/package.json` (version bump)',
91
- trigger: /^cleargate-cli\//,
92
- triggerDesc: 'only if releasing this sprint (release lane is separate from sprint close)',
93
- },
94
- {
95
- surface: '`mcp/package.json` (version bump)',
96
- trigger: /^mcp\//,
97
- triggerDesc: 'only if releasing this sprint',
98
- },
99
- ],
100
- },
101
- {
102
- name: '4. CLAUDE.md "Active state" subsection',
103
- items: [
104
- {
105
- surface: '`CLAUDE.md` "Active state" section',
106
- trigger: /\.(cleargate\/delivery\/archive\/|cleargate\/delivery\/pending-sync\/)/,
107
- triggerDesc: 'any EPIC / CR / Bug / Hotfix archived this sprint, OR any stack version bumped',
108
- },
109
- {
110
- surface: '`cleargate-planning/CLAUDE.md` mirror',
111
- trigger: /\.(cleargate\/delivery\/archive\/|cleargate\/delivery\/pending-sync\/)/,
112
- triggerDesc: 'same edit as live (CLEARGATE-tag-block region only — outside-block diverges intentionally)',
113
- },
114
- ],
115
- },
116
- {
117
- name: '5. Wiki surfaces (auto-rebuilt by PostToolUse hooks; verify after close)',
118
- items: [
119
- {
120
- surface: '`.cleargate/wiki/active-sprint.md`',
121
- trigger: null,
122
- triggerDesc: 'always verify at sprint close — confirm sprint ID, status, and date are current',
123
- },
124
- {
125
- surface: '`.cleargate/wiki/index.md`',
126
- trigger: null,
127
- triggerDesc: 'always verify at sprint close — confirm new artifacts appear in relevant sections',
128
- },
129
- {
130
- surface: '`.cleargate/wiki/product-state.md`',
131
- trigger: null,
132
- triggerDesc: 'always verify at sprint close — confirm shipped capabilities are listed',
133
- },
134
- {
135
- surface: '`.cleargate/wiki/roadmap.md`',
136
- trigger: null,
137
- triggerDesc: 'always verify at sprint close — confirm closed sprint moved from Active to Completed',
138
- },
139
- ],
140
- },
141
- {
142
- name: '6. INDEX surfaces (manual updates)',
143
- items: [
144
- {
145
- surface: '`.cleargate/INDEX.md`',
146
- trigger: null,
147
- triggerDesc: 'if maintained as a curated roadmap; update when sprint closes',
148
- },
149
- {
150
- surface: '`.cleargate/delivery/INDEX.md`',
151
- trigger: null,
152
- triggerDesc: 'update epic/sprint map when new artifacts archived',
153
- },
154
- ],
155
- },
156
- {
157
- name: '7. Frontmatter version stamps',
158
- items: [
159
- {
160
- surface: 'Modified `.cleargate/templates/*.md` (run `cleargate stamp <path>`)',
161
- trigger: /^\.cleargate\/templates\//,
162
- triggerDesc: 'any .cleargate/templates/*.md modified this sprint',
163
- },
164
- {
165
- surface: '`.cleargate/knowledge/cleargate-protocol.md` (run `cleargate stamp`)',
166
- trigger: /^\.cleargate\/knowledge\/cleargate-protocol\.md$/,
167
- triggerDesc: 'if cleargate-protocol.md was modified this sprint (post-EPIC-024 slim)',
168
- },
169
- {
170
- surface: '`.cleargate/knowledge/cleargate-enforcement.md` (run `cleargate stamp`)',
171
- trigger: /^\.cleargate\/knowledge\/cleargate-enforcement\.md$/,
172
- triggerDesc: 'if cleargate-enforcement.md was modified this sprint (post-EPIC-024 split)',
173
- },
174
- {
175
- surface: 'Other modified `.cleargate/knowledge/*.md` (run `cleargate stamp <path>`)',
176
- trigger: /^\.cleargate\/knowledge\//,
177
- triggerDesc: 'any other .cleargate/knowledge/*.md touched this sprint',
178
- },
179
- ],
180
- },
181
- {
182
- name: '8. Knowledge doc cross-references',
183
- items: [
184
- {
185
- surface: 'Knowledge docs citing `§N` of protocol or enforcement.md',
186
- trigger: /^\.cleargate\/knowledge\//,
187
- triggerDesc: 'any knowledge doc modified — verify §N citations still resolve post-rewrite',
188
- },
189
- ],
190
- },
191
- {
192
- name: '9. Mirror parity audit',
193
- items: [
194
- {
195
- surface: '`cleargate-planning/.claude/agents/` diff',
196
- trigger: /^\.claude\/agents\//,
197
- triggerDesc: 'any change to .claude/agents/*.md — run diff -r to verify parity',
198
- },
199
- {
200
- surface: '`cleargate-planning/.cleargate/templates/` diff',
201
- trigger: /^\.cleargate\/templates\//,
202
- triggerDesc: 'any change to .cleargate/templates/ — run diff -r to verify parity',
203
- },
204
- {
205
- surface: '`cleargate-planning/.cleargate/knowledge/` diff',
206
- trigger: /^\.cleargate\/knowledge\//,
207
- triggerDesc: 'any change to .cleargate/knowledge/ — run diff -r to verify parity',
208
- },
209
- ],
210
- },
211
- ];
212
-
213
- /**
214
- * Get changed files for a sprint using available strategies.
215
- * Strategy 1: git log sprint/<sprint-id> ^main --name-only (if branch exists)
216
- * Strategy 2: git log --since <start_date> --name-only (from sprint frontmatter)
217
- * Strategy 3: git log --grep <sprint-id> --name-only (commit-message grep fallback)
218
- *
219
- * @param {string} sprintId
220
- * @param {string} sprintDir
221
- * @returns {string[]} deduped array of changed file paths
222
- */
223
- function getChangedFiles(sprintId, sprintDir) {
224
- // Strategy 1: sprint branch
225
- try {
226
- const branchCheck = execSync(`git rev-parse --verify "refs/heads/sprint/${sprintId}"`, {
227
- cwd: REPO_ROOT,
228
- stdio: ['pipe', 'pipe', 'pipe'],
229
- }).toString().trim();
230
- if (branchCheck) {
231
- const out = execSync(
232
- `git log "sprint/${sprintId}" ^main --name-only --format=""`,
233
- { cwd: REPO_ROOT, stdio: ['pipe', 'pipe', 'pipe'] }
234
- ).toString();
235
- const files = out.split('\n').map(f => f.trim()).filter(Boolean);
236
- if (files.length > 0) {
237
- return [...new Set(files)];
238
- }
239
- }
240
- } catch {
241
- // branch does not exist — fall through to next strategy
242
- }
243
-
244
- // Strategy 2: --since <start_date> from sprint frontmatter
245
- const startDate = readStartDateFromFrontmatter(sprintId);
246
- if (startDate) {
247
- try {
248
- const out = execSync(
249
- `git log --since="${startDate}" --name-only --format=""`,
250
- { cwd: REPO_ROOT, stdio: ['pipe', 'pipe', 'pipe'] }
251
- ).toString();
252
- const files = out.split('\n').map(f => f.trim()).filter(Boolean);
253
- if (files.length > 0) {
254
- return [...new Set(files)];
255
- }
256
- } catch {
257
- // fall through to strategy 3
258
- }
259
- }
260
-
261
- // Strategy 3: commit-message grep for sprint ID
262
- try {
263
- const out = execSync(
264
- `git log --grep="${sprintId}" --name-only --format=""`,
265
- { cwd: REPO_ROOT, stdio: ['pipe', 'pipe', 'pipe'] }
266
- ).toString();
267
- const files = out.split('\n').map(f => f.trim()).filter(Boolean);
268
- return [...new Set(files)];
269
- } catch {
270
- return [];
271
- }
272
- }
273
-
274
- /**
275
- * Read start_date from sprint frontmatter file.
276
- * Looks in pending-sync first, then archive.
277
- *
278
- * @param {string} sprintId
279
- * @returns {string | null}
280
- */
281
- function readStartDateFromFrontmatter(sprintId) {
282
- const dirs = [
283
- path.join(REPO_ROOT, '.cleargate', 'delivery', 'pending-sync'),
284
- path.join(REPO_ROOT, '.cleargate', 'delivery', 'archive'),
285
- ];
286
- for (const dir of dirs) {
287
- if (!fs.existsSync(dir)) continue;
288
- const entries = fs.readdirSync(dir);
289
- const match = entries.find(e => e.startsWith(`${sprintId}_`) && e.endsWith('.md'));
290
- if (match) {
291
- const content = fs.readFileSync(path.join(dir, match), 'utf8');
292
- const m = content.match(/^start_date:\s*["']?(.+?)["']?\s*$/m);
293
- if (m) return m[1].trim();
294
- }
295
- }
296
- return null;
297
- }
298
-
299
- /**
300
- * Evaluate each checklist category against the changed file set.
301
- *
302
- * @param {string[]} changedFiles
303
- * @returns {{ category: Category, results: Array<{ item: Item, triggered: boolean }> }[]}
304
- */
305
- function evaluateChecklist(changedFiles) {
306
- return CATEGORIES.map(category => ({
307
- category,
308
- results: category.items.map(item => ({
309
- item,
310
- triggered: item.trigger === null
311
- ? true // null trigger = always review
312
- : changedFiles.some(f => item.trigger.test(f)),
313
- })),
314
- }));
315
- }
316
-
317
- /**
318
- * Render the checklist markdown.
319
- *
320
- * @param {ReturnType<typeof evaluateChecklist>} evaluation
321
- * @param {string} sprintId
322
- * @returns {string}
323
- */
324
- function renderChecklist(evaluation, sprintId) {
325
- const lines = [
326
- `# Doc & Metadata Refresh Checklist — ${sprintId}`,
327
- '',
328
- `> Generated by \`prep_doc_refresh.mjs\` at ${new Date().toISOString()}.`,
329
- '> Each item is pre-evaluated against the sprint\'s changed file set.',
330
- '> `- [ ]` = action required; `- [x]` = no changes detected, skip.',
331
- '> Apply or defer each `- [ ]` item during Gate 4 ack.',
332
- '> Canonical checklist: `.cleargate/knowledge/sprint-closeout-checklist.md`',
333
- '',
334
- ];
335
-
336
- for (const { category, results } of evaluation) {
337
- lines.push(`### ${category.name}`);
338
- lines.push('');
339
- for (const { item, triggered } of results) {
340
- if (triggered) {
341
- lines.push(`- [ ] ${item.surface} — **trigger:** ${item.triggerDesc}`);
342
- } else {
343
- lines.push(`- [x] ${item.surface} — no changes detected, skip`);
344
- }
345
- }
346
- lines.push('');
347
- }
348
-
349
- return lines.join('\n');
350
- }
351
-
352
- function main() {
353
- const sprintId = process.argv[2];
354
- if (!sprintId) {
355
- console.error('Usage: prep_doc_refresh.mjs <sprint-id>');
356
- console.error('Example: prep_doc_refresh.mjs SPRINT-16');
357
- process.exit(2);
358
- }
359
-
360
- const sprintDir = path.join(REPO_ROOT, '.cleargate', 'sprint-runs', sprintId);
361
- if (!fs.existsSync(sprintDir)) {
362
- console.error(`Error: sprint state.json not found at ${path.join(sprintDir, 'state.json')}`);
363
- console.error(`Sprint directory does not exist: ${sprintDir}`);
364
- process.exit(1);
365
- }
366
-
367
- const changedFiles = getChangedFiles(sprintId, sprintDir);
368
- console.log(`Found ${changedFiles.length} changed files in sprint window.`);
369
-
370
- const evaluation = evaluateChecklist(changedFiles);
371
- const markdown = renderChecklist(evaluation, sprintId);
372
-
373
- const outFile = path.join(sprintDir, '.doc-refresh-checklist.md');
374
- fs.writeFileSync(outFile, markdown, 'utf8');
375
- console.log(`Wrote ${outFile}`);
376
- }
377
-
378
- main();