cleargate 0.14.0 → 0.15.1

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 (150) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/MANIFEST.json +72 -16
  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-synth.md +2 -0
  25. package/templates/cleargate-planning/.claude/agents/architect.md +4 -2
  26. package/templates/cleargate-planning/.claude/agents/developer.md +4 -11
  27. package/templates/cleargate-planning/.claude/agents/qa.md +14 -6
  28. package/templates/cleargate-planning/.claude/hooks/pending-task-sentinel.sh +2 -2
  29. package/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +19 -1
  30. package/templates/cleargate-planning/.cleargate/config.example.yml +16 -0
  31. package/templates/cleargate-planning/.cleargate/scripts/close_sprint.deferred-verify.red.node.test.ts +245 -0
  32. package/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +227 -0
  33. package/templates/cleargate-planning/.cleargate/scripts/gate-checks.json +5 -4
  34. package/templates/cleargate-planning/.cleargate/scripts/init_sprint.mjs +75 -2
  35. package/templates/cleargate-planning/.cleargate/scripts/pre_gate_common.sh +48 -0
  36. package/templates/cleargate-planning/.cleargate/scripts/pre_gate_runner.sh +57 -1
  37. package/templates/cleargate-planning/.cleargate/scripts/provision_worktree_config.sh +155 -0
  38. package/templates/cleargate-planning/.cleargate/scripts/qa_red_lint.mjs +380 -0
  39. package/templates/cleargate-planning/.cleargate/scripts/run_script.sh +34 -1
  40. package/templates/cleargate-planning/.cleargate/scripts/test/cr077_eviction.red.sh +113 -0
  41. package/templates/cleargate-planning/.cleargate/scripts/test/cr078_init.test.sh +309 -0
  42. package/templates/cleargate-planning/.cleargate/scripts/test/cr079_provision.red.sh +262 -0
  43. package/templates/cleargate-planning/.cleargate/scripts/test/cr080_wrapper.test.sh +177 -0
  44. package/templates/cleargate-planning/.cleargate/scripts/test/cr081_qa_red_lint.red.sh +348 -0
  45. package/templates/cleargate-planning/.cleargate/sprint-runs/_off-sprint/.session-totals.json +1 -0
  46. package/templates/cleargate-planning/.cleargate/sprint-runs/_off-sprint/token-ledger.jsonl +222 -0
  47. package/templates/cleargate-planning/.cleargate/templates/sprint_context.md +17 -0
  48. package/templates/cleargate-planning/.cleargate/templates/story.md +1 -0
  49. package/templates/cleargate-planning/MANIFEST.json +72 -16
  50. package/dist/admin-api/index.cjs.map +0 -1
  51. package/dist/admin-api/index.js.map +0 -1
  52. package/dist/auth/factory.cjs.map +0 -1
  53. package/dist/auth/factory.js.map +0 -1
  54. package/dist/auth/require-token.cjs.map +0 -1
  55. package/dist/auth/require-token.js.map +0 -1
  56. package/dist/auth/token-store.cjs.map +0 -1
  57. package/dist/auth/token-store.js.map +0 -1
  58. package/dist/bootstrap-root-QKSA5V75.js.map +0 -1
  59. package/dist/chunk-5DI2Z3C2.js.map +0 -1
  60. package/dist/chunk-BTSZOEWC.js.map +0 -1
  61. package/dist/chunk-E3X7IE5E.js.map +0 -1
  62. package/dist/chunk-PDE37WFQ.js.map +0 -1
  63. package/dist/cli.cjs.map +0 -1
  64. package/dist/cli.js.map +0 -1
  65. package/dist/lib/ledger.cjs.map +0 -1
  66. package/dist/lib/ledger.js.map +0 -1
  67. package/dist/lib/lifecycle-reconcile.cjs.map +0 -1
  68. package/dist/lib/lifecycle-reconcile.js.map +0 -1
  69. package/dist/templates/cleargate-planning/.claude/agents/architect-reader.md +0 -61
  70. package/dist/templates/cleargate-planning/.claude/agents/architect-synth.md +0 -124
  71. package/dist/templates/cleargate-planning/.claude/agents/architect.md +0 -230
  72. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-contradict.md +0 -108
  73. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-ingest.md +0 -194
  74. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-lint.md +0 -261
  75. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-query.md +0 -143
  76. package/dist/templates/cleargate-planning/.claude/agents/developer.md +0 -185
  77. package/dist/templates/cleargate-planning/.claude/agents/devops.md +0 -257
  78. package/dist/templates/cleargate-planning/.claude/agents/qa.md +0 -171
  79. package/dist/templates/cleargate-planning/.claude/agents/reporter.md +0 -274
  80. package/dist/templates/cleargate-planning/.claude/hooks/pending-task-sentinel.sh +0 -209
  81. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit-surface-gate.sh +0 -33
  82. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit-test-ratchet.sh +0 -58
  83. package/dist/templates/cleargate-planning/.claude/hooks/pre-commit.sh +0 -19
  84. package/dist/templates/cleargate-planning/.claude/hooks/pre-edit-gate.sh +0 -162
  85. package/dist/templates/cleargate-planning/.claude/hooks/pre-tool-use-autonomy.sh +0 -58
  86. package/dist/templates/cleargate-planning/.claude/hooks/pre-tool-use-task.sh +0 -148
  87. package/dist/templates/cleargate-planning/.claude/hooks/session-start.sh +0 -75
  88. package/dist/templates/cleargate-planning/.claude/hooks/stamp-and-gate.sh +0 -43
  89. package/dist/templates/cleargate-planning/.claude/hooks/token-ledger.sh +0 -590
  90. package/dist/templates/cleargate-planning/.claude/settings.json +0 -68
  91. package/dist/templates/cleargate-planning/.claude/skills/flashcard/SKILL.md +0 -102
  92. package/dist/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +0 -742
  93. package/dist/templates/cleargate-planning/.cleargate/FLASHCARD.md +0 -7
  94. package/dist/templates/cleargate-planning/.cleargate/config.example.yml +0 -67
  95. package/dist/templates/cleargate-planning/.cleargate/config.yml +0 -18
  96. package/dist/templates/cleargate-planning/.cleargate/delivery/archive/.gitkeep +0 -0
  97. package/dist/templates/cleargate-planning/.cleargate/delivery/pending-sync/.gitkeep +0 -0
  98. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-enforcement.md +0 -551
  99. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-protocol.md +0 -878
  100. package/dist/templates/cleargate-planning/.cleargate/knowledge/mid-sprint-triage-rubric.md +0 -160
  101. package/dist/templates/cleargate-planning/.cleargate/knowledge/readiness-gates.md +0 -213
  102. package/dist/templates/cleargate-planning/.cleargate/knowledge/sprint-closeout-checklist.md +0 -71
  103. package/dist/templates/cleargate-planning/.cleargate/scripts/_migrate-schema-v3.mjs +0 -120
  104. package/dist/templates/cleargate-planning/.cleargate/scripts/assert_story_files.mjs +0 -265
  105. package/dist/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +0 -1012
  106. package/dist/templates/cleargate-planning/.cleargate/scripts/collision_surface.sh +0 -114
  107. package/dist/templates/cleargate-planning/.cleargate/scripts/constants.mjs +0 -62
  108. package/dist/templates/cleargate-planning/.cleargate/scripts/dedupe_frontmatter.mjs +0 -219
  109. package/dist/templates/cleargate-planning/.cleargate/scripts/file_surface_diff.sh +0 -320
  110. package/dist/templates/cleargate-planning/.cleargate/scripts/gate-checks.json +0 -15
  111. package/dist/templates/cleargate-planning/.cleargate/scripts/init_gate_config.sh +0 -38
  112. package/dist/templates/cleargate-planning/.cleargate/scripts/init_sprint.mjs +0 -240
  113. package/dist/templates/cleargate-planning/.cleargate/scripts/launch_wave.mjs +0 -341
  114. package/dist/templates/cleargate-planning/.cleargate/scripts/lib/report-filename.mjs +0 -54
  115. package/dist/templates/cleargate-planning/.cleargate/scripts/pre_gate_common.sh +0 -206
  116. package/dist/templates/cleargate-planning/.cleargate/scripts/pre_gate_runner.sh +0 -371
  117. package/dist/templates/cleargate-planning/.cleargate/scripts/prefill_report.mjs +0 -280
  118. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_doc_refresh.mjs +0 -378
  119. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_qa_context.mjs +0 -888
  120. package/dist/templates/cleargate-planning/.cleargate/scripts/run_script.sh +0 -209
  121. package/dist/templates/cleargate-planning/.cleargate/scripts/sprint_trends.mjs +0 -71
  122. package/dist/templates/cleargate-planning/.cleargate/scripts/state.schema.json +0 -127
  123. package/dist/templates/cleargate-planning/.cleargate/scripts/suggest_improvements.mjs +0 -717
  124. package/dist/templates/cleargate-planning/.cleargate/scripts/surface-whitelist.txt +0 -27
  125. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_assert_story_files.sh +0 -261
  126. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_file_surface.sh +0 -210
  127. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_flashcard_gate.sh +0 -190
  128. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_prep_qa_context.sh +0 -482
  129. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_test_ratchet.sh +0 -327
  130. package/dist/templates/cleargate-planning/.cleargate/scripts/test_ratchet.mjs +0 -261
  131. package/dist/templates/cleargate-planning/.cleargate/scripts/update_state.mjs +0 -246
  132. package/dist/templates/cleargate-planning/.cleargate/scripts/validate_bounce_readiness.mjs +0 -111
  133. package/dist/templates/cleargate-planning/.cleargate/scripts/validate_state.mjs +0 -184
  134. package/dist/templates/cleargate-planning/.cleargate/scripts/write_dispatch.sh +0 -172
  135. package/dist/templates/cleargate-planning/.cleargate/templates/Bug.md +0 -126
  136. package/dist/templates/cleargate-planning/.cleargate/templates/CR.md +0 -130
  137. package/dist/templates/cleargate-planning/.cleargate/templates/Sprint Plan Template.md +0 -137
  138. package/dist/templates/cleargate-planning/.cleargate/templates/epic.md +0 -166
  139. package/dist/templates/cleargate-planning/.cleargate/templates/hotfix.md +0 -111
  140. package/dist/templates/cleargate-planning/.cleargate/templates/initiative.md +0 -122
  141. package/dist/templates/cleargate-planning/.cleargate/templates/sprint_context.md +0 -50
  142. package/dist/templates/cleargate-planning/.cleargate/templates/sprint_report.md +0 -224
  143. package/dist/templates/cleargate-planning/.cleargate/templates/story.md +0 -213
  144. package/dist/templates/cleargate-planning/CLAUDE.md +0 -66
  145. package/dist/templates/cleargate-planning/MANIFEST.json +0 -503
  146. package/dist/templates/synthesis/active-sprint.md +0 -30
  147. package/dist/templates/synthesis/open-gates.md +0 -38
  148. package/dist/templates/synthesis/product-state.md +0 -31
  149. package/dist/templates/synthesis/roadmap.md +0 -63
  150. 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();