@pmelab/gtd 58.2.0 → 59.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.
Files changed (133) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +115 -390
  3. package/dist/chunks/{Schema-B3o6eRNU.mjs → testkit-CMBAAyRK.mjs} +13409 -3351
  4. package/dist/gtd.bundle.mjs +76 -59
  5. package/dist/testkit/gherkin.mjs +1 -1
  6. package/dist/testkit.mjs +1 -1
  7. package/package.json +3 -42
  8. package/skills/authoring/SKILL.md +31 -25
  9. package/src/cli/Cli.test.ts +15 -19
  10. package/src/cli/Cli.ts +2 -4
  11. package/src/cli/Program.test.ts +60 -29
  12. package/src/cli/Program.ts +5 -7
  13. package/src/edge/Edge.ts +3 -3
  14. package/src/flags/index.test.ts +0 -13
  15. package/src/flags/index.ts +1 -3
  16. package/src/install/Install.test.ts +14 -11
  17. package/src/install/Install.ts +38 -15
  18. package/src/install/index.ts +1 -2
  19. package/src/replay/Replay.test.ts +1 -1
  20. package/src/replay/index.ts +1 -1
  21. package/src/step/planStart.ts +6 -1
  22. package/src/twins/FlowScripts.ts +1 -1
  23. package/src/workflow/index.ts +1 -0
  24. package/src/workflow/load.test.ts +138 -113
  25. package/src/workflow/load.ts +1 -1
  26. package/src/workflow/vars.test.ts +30 -3
  27. package/src/workflow/vars.ts +34 -2
  28. package/src/workflow-kit/index.ts +1 -1
  29. package/dist/chunks/reserved-lMYCaapY.mjs +0 -1990
  30. package/dist/chunks/review-Bfaror38.mjs +0 -427
  31. package/dist/chunks/tail-Bd7L940p.mjs +0 -355
  32. package/dist/chunks/testkit-JDtpNKyi.mjs +0 -10410
  33. package/dist/workflows/cleanup.mjs +0 -36
  34. package/dist/workflows/feature.mjs +0 -1018
  35. package/dist/workflows/fix.mjs +0 -41
  36. package/dist/workflows/review.mjs +0 -45
  37. package/dist/workflows/rollout.mjs +0 -48
  38. package/dist/workflows.mjs +0 -40651
  39. package/src/install/ConfigScaffold.ts +0 -22
  40. package/src/workflows/cleanup/cleanup-path.feature +0 -94
  41. package/src/workflows/cleanup/cleanup.feature +0 -315
  42. package/src/workflows/cleanup/cleanup.test.ts +0 -276
  43. package/src/workflows/cleanup/cleanup.ts +0 -52
  44. package/src/workflows/cleanup/index.ts +0 -6
  45. package/src/workflows/feature/acceptance-criteria-tier.feature +0 -25
  46. package/src/workflows/feature/acceptance-criteria.feature +0 -389
  47. package/src/workflows/feature/criteria-coverage.feature +0 -102
  48. package/src/workflows/feature/criteria.test.ts +0 -147
  49. package/src/workflows/feature/criteria.ts +0 -267
  50. package/src/workflows/feature/fast-path.feature +0 -93
  51. package/src/workflows/feature/feature.test.ts +0 -338
  52. package/src/workflows/feature/feature.ts +0 -156
  53. package/src/workflows/feature/green.ts +0 -19
  54. package/src/workflows/feature/index.ts +0 -18
  55. package/src/workflows/feature/lens-models.feature +0 -69
  56. package/src/workflows/feature/lens-review.feature +0 -566
  57. package/src/workflows/feature/naive-acceptance.feature +0 -147
  58. package/src/workflows/feature/naive-test.feature +0 -263
  59. package/src/workflows/feature/one-step-land.feature +0 -93
  60. package/src/workflows/feature/planning.ts +0 -41
  61. package/src/workflows/feature/refactor-absorbs.feature +0 -131
  62. package/src/workflows/feature/refactor-first.feature +0 -158
  63. package/src/workflows/feature/refactor-lens-models.feature +0 -79
  64. package/src/workflows/feature/refactor-rebuild.feature +0 -273
  65. package/src/workflows/feature/refactor-review.feature +0 -1528
  66. package/src/workflows/feature/refactor.test.ts +0 -1220
  67. package/src/workflows/feature/refactor.ts +0 -368
  68. package/src/workflows/feature/release-flag.feature +0 -167
  69. package/src/workflows/feature/release-flag.test.ts +0 -49
  70. package/src/workflows/feature/release-flag.ts +0 -46
  71. package/src/workflows/feature/review-gate.feature +0 -241
  72. package/src/workflows/feature/reviewer-walkthrough.feature +0 -142
  73. package/src/workflows/feature/risk-tier.feature +0 -351
  74. package/src/workflows/feature/seam-rejection.feature +0 -146
  75. package/src/workflows/feature/seam.feature +0 -297
  76. package/src/workflows/feature/seam.test.ts +0 -527
  77. package/src/workflows/feature/seam.ts +0 -426
  78. package/src/workflows/feature/standards.feature +0 -354
  79. package/src/workflows/feature/steps.test.ts +0 -65
  80. package/src/workflows/feature/steps.ts +0 -45
  81. package/src/workflows/feature/tier-pin.feature +0 -66
  82. package/src/workflows/feature/tier.test.ts +0 -166
  83. package/src/workflows/feature/tier.ts +0 -56
  84. package/src/workflows/fix/fix-lens-origin.feature +0 -114
  85. package/src/workflows/fix/fix-quality.feature +0 -212
  86. package/src/workflows/fix/fix.feature +0 -79
  87. package/src/workflows/fix/fix.test.ts +0 -74
  88. package/src/workflows/fix/fix.ts +0 -52
  89. package/src/workflows/fix/index.ts +0 -6
  90. package/src/workflows/index.ts +0 -47
  91. package/src/workflows/review/index.ts +0 -6
  92. package/src/workflows/review/review-door.feature +0 -199
  93. package/src/workflows/review/review.test.ts +0 -27
  94. package/src/workflows/review/review.ts +0 -60
  95. package/src/workflows/rollout/index.ts +0 -6
  96. package/src/workflows/rollout/rollout.feature +0 -510
  97. package/src/workflows/rollout/rollout.test.ts +0 -263
  98. package/src/workflows/rollout/rollout.ts +0 -82
  99. package/src/workflows/shared/__fixtures__/feature-collecting-prompt.txt +0 -98
  100. package/src/workflows/shared/access.test.ts +0 -62
  101. package/src/workflows/shared/access.ts +0 -24
  102. package/src/workflows/shared/config.fixture.ts +0 -12
  103. package/src/workflows/shared/fences.ts +0 -24
  104. package/src/workflows/shared/health.test.ts +0 -148
  105. package/src/workflows/shared/health.ts +0 -191
  106. package/src/workflows/shared/learn.test.ts +0 -140
  107. package/src/workflows/shared/learn.ts +0 -201
  108. package/src/workflows/shared/lenses.test.ts +0 -39
  109. package/src/workflows/shared/lenses.ts +0 -294
  110. package/src/workflows/shared/options.test.ts +0 -157
  111. package/src/workflows/shared/options.ts +0 -92
  112. package/src/workflows/shared/progress.feature +0 -124
  113. package/src/workflows/shared/prose.ts +0 -263
  114. package/src/workflows/shared/recheck.feature +0 -60
  115. package/src/workflows/shared/registry.test.ts +0 -345
  116. package/src/workflows/shared/registry.ts +0 -183
  117. package/src/workflows/shared/reserved.ts +0 -11
  118. package/src/workflows/shared/review.test.ts +0 -1062
  119. package/src/workflows/shared/review.ts +0 -446
  120. package/src/workflows/shared/skills.test.ts +0 -121
  121. package/src/workflows/shared/skills.ts +0 -49
  122. package/src/workflows/shared/standards.test.ts +0 -90
  123. package/src/workflows/shared/standards.ts +0 -156
  124. package/src/workflows/shared/steps.test.ts +0 -219
  125. package/src/workflows/shared/steps.ts +0 -201
  126. package/src/workflows/shared/tail.test.ts +0 -454
  127. package/src/workflows/shared/tail.ts +0 -264
  128. package/src/workflows/shared/text.fixture.ts +0 -128
  129. package/src/workflows/shared/text.test.ts +0 -1430
  130. package/src/workflows/shared/text.ts +0 -1700
  131. package/src/workflows/shared/threads.test.ts +0 -129
  132. package/src/workflows/shared/vars.ts +0 -47
  133. package/src/workflows/shared/workflows.steps.ts +0 -54
@@ -1,510 +0,0 @@
1
- Feature: rollout turns one release flag default-on and touches nothing else
2
-
3
- `gtd --workflow rollout --var flag=<name>` has an agent set `defaultOn: true`
4
- on the named registry entry; a check refuses any other change, and a red
5
- suite rests at a human gate — never a fix turn.
6
-
7
- Background:
8
- Given a gtd config with:
9
- """
10
- export {
11
- feature as default,
12
- feature,
13
- defaults,
14
- envDefaults,
15
- summary,
16
- steering,
17
- skills,
18
- access,
19
- } from "@pmelab/gtd/workflows/feature"
20
- import { rollout } from "@pmelab/gtd/workflows"
21
- export { rollout }
22
- export const elsewhere = rollout({ flagRegistry: "config/flags.ts" })
23
- """
24
- And a file "src/calc.ts" with:
25
- """
26
- export const add = (a: number, b: number) => a + b
27
- """
28
- And a file "src/flags/index.ts" with:
29
- """
30
- export const FLAGS = [
31
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release" },
32
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
33
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
34
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
35
- ] as const
36
- """
37
- And the working tree is committed as "feat: registry"
38
-
39
- Scenario: a flip of the named entry lands, the suite passes and the process ends
40
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
41
- """
42
- export const FLAGS = [
43
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
44
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
45
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
46
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
47
- ] as const
48
- """
49
- And step "rollout.suite.check" changes nothing
50
- And step "rollout.mentions" runs its script
51
- When gtd starts workflow "rollout" with "--var flag=alpha"
52
- And the process is driven
53
- Then the process rests at "idle"
54
- And "src/flags/index.ts" contains "kind: \"release\", defaultOn: true },"
55
- And the commit subjects end with:
56
- """
57
- gtd(check): rollout.suite.check → rollout.mentions
58
- gtd(check): rollout.mentions → idle
59
- """
60
-
61
- Scenario: a turn also changing a source file is refused naming that path
62
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
63
- """
64
- export const FLAGS = [
65
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
66
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
67
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
68
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
69
- ] as const
70
- """
71
- And step "rollout.flipping" writes "src/calc.ts" with:
72
- """
73
- export const add = (a: number, b: number) => b + a
74
- """
75
- When gtd starts workflow "rollout" with "--var flag=alpha"
76
- Then driving the process is refused with "rollout-only: src/calc.ts changed"
77
-
78
- Scenario: a turn editing a second registry entry is refused
79
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
80
- """
81
- export const FLAGS = [
82
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
83
- { name: "beta", owner: "zed", expiry: "2027-02-01", kind: "release" },
84
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
85
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
86
- ] as const
87
- """
88
- When gtd starts workflow "rollout" with "--var flag=alpha"
89
- Then driving the process is refused with "other edits in src/flags/index.ts"
90
-
91
- Scenario: a factory flagRegistry names the one file the guard allows
92
- Given a file "config/flags.ts" with:
93
- """
94
- export const FLAGS = [
95
- { name: "gamma", owner: "g", expiry: "2027-05-01", kind: "release" },
96
- ] as const
97
- """
98
- And the working tree is committed as "feat: second registry"
99
- And step "rollout.flipping" writes "config/flags.ts" with:
100
- """
101
- export const FLAGS = [
102
- { name: "gamma", owner: "g", expiry: "2027-05-01", kind: "release", defaultOn: true },
103
- ] as const
104
- """
105
- And step "rollout.suite.check" changes nothing
106
- And step "rollout.mentions" runs its script
107
- When gtd starts workflow "elsewhere" with "--var flag=gamma"
108
- And the process is driven
109
- Then the process rests at "idle"
110
- And "config/flags.ts" contains "defaultOn: true"
111
-
112
- @inmem
113
- Scenario: gtd door rollout starts the rollout of its flag argument
114
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
115
- """
116
- export const FLAGS = [
117
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
118
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
119
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
120
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
121
- ] as const
122
- """
123
- And step "rollout.suite.check" changes nothing
124
- And step "rollout.mentions" runs its script
125
- When gtd opens door "rollout" with "alpha"
126
- And the process is driven
127
- Then the process rests at "idle"
128
- And "src/flags/index.ts" contains "kind: \"release\", defaultOn: true },"
129
-
130
- @inmem
131
- Scenario: gtd door rollout with no argument is refused naming the flag
132
- Then opening door "rollout" is refused with "usage: gtd door rollout <flag>"
133
-
134
- Scenario: a missing flag var is refused before any turn
135
- Then starting workflow "rollout" with "" is refused with "gtd: rollout needs --var flag=<name>"
136
-
137
- Scenario: an unknown flag is refused before any turn
138
- Then starting workflow "rollout" with "--var flag=nope" is refused with "no flag \"nope\" in src/flags/index.ts"
139
-
140
- Scenario: an ops flag is refused before any turn
141
- Then starting workflow "rollout" with "--var flag=ops1" is refused with "flag \"ops1\" is ops, not release"
142
-
143
- Scenario: an already default-on flag is refused before any turn
144
- Then starting workflow "rollout" with "--var flag=live" is refused with "flag \"live\" is already default-on"
145
-
146
- Scenario: a red suite after the flip rests at the blocked gate with no fix turn
147
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
148
- """
149
- export const FLAGS = [
150
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
151
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
152
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
153
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
154
- ] as const
155
- """
156
- And step "rollout.suite.check" writes ".gtd/FEEDBACK.md" with:
157
- """
158
- 1 test failing
159
- """
160
- And step "rollout.suite.recheck" writes ".gtd/FEEDBACK.md" with:
161
- """
162
- 1 test still failing
163
- """
164
- When gtd starts workflow "rollout" with "--var flag=alpha"
165
- And the process is driven
166
- Then the process rests at "rollout.suite.blocked"
167
-
168
- @inmem
169
- Scenario: a human fix at the blocked gate that also edits a source file is refused
170
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
171
- """
172
- export const FLAGS = [
173
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
174
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
175
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
176
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
177
- ] as const
178
- """
179
- And step "rollout.suite.check" writes ".gtd/FEEDBACK.md" with:
180
- """
181
- 1 test failing
182
- """
183
- And step "rollout.suite.recheck" writes ".gtd/FEEDBACK.md" with:
184
- """
185
- 1 test still failing
186
- """
187
- When gtd starts workflow "rollout" with "--var flag=alpha"
188
- And the process is driven
189
- Then the process rests at "rollout.suite.blocked"
190
- And step "rollout.suite.blocked" writes "src/calc.ts" with:
191
- """
192
- export const add = (a: number, b: number) => b + a
193
- """
194
- Then driving the process is refused with "rollout-only: src/calc.ts changed"
195
-
196
- @inmem
197
- Scenario: a human fix at the blocked gate that edits a second registry entry is refused
198
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
199
- """
200
- export const FLAGS = [
201
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
202
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
203
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
204
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
205
- ] as const
206
- """
207
- And step "rollout.suite.check" writes ".gtd/FEEDBACK.md" with:
208
- """
209
- 1 test failing
210
- """
211
- And step "rollout.suite.recheck" writes ".gtd/FEEDBACK.md" with:
212
- """
213
- 1 test still failing
214
- """
215
- When gtd starts workflow "rollout" with "--var flag=alpha"
216
- And the process is driven
217
- Then the process rests at "rollout.suite.blocked"
218
- And step "rollout.suite.blocked" writes "src/flags/index.ts" with:
219
- """
220
- export const FLAGS = [
221
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
222
- { name: "beta", owner: "zed", expiry: "2027-02-01", kind: "release" },
223
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
224
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
225
- ] as const
226
- """
227
- Then driving the process is refused with "other edits in src/flags/index.ts"
228
-
229
- @inmem
230
- Scenario: a human fix touching only the feedback file lands and the process ends with no review
231
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
232
- """
233
- export const FLAGS = [
234
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
235
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
236
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
237
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
238
- ] as const
239
- """
240
- And step "rollout.suite.check" writes ".gtd/FEEDBACK.md" with:
241
- """
242
- 1 test failing
243
- """
244
- And step "rollout.suite.recheck" writes ".gtd/FEEDBACK.md" with:
245
- """
246
- 1 test still failing
247
- """
248
- When gtd starts workflow "rollout" with "--var flag=alpha"
249
- And the process is driven
250
- Then the process rests at "rollout.suite.blocked"
251
- And step "rollout.suite.blocked" writes ".gtd/FEEDBACK.md" with:
252
- """
253
- fixed by hand
254
- """
255
- And step "rollout.suite.check" from now on changes nothing
256
- And step "rollout.mentions" runs its script
257
- When the process is driven
258
- Then the process rests at "idle"
259
- And the commit subjects end with:
260
- """
261
- gtd(check): rollout.suite.check → rollout.mentions
262
- gtd(check): rollout.mentions → idle
263
- """
264
-
265
- @inmem
266
- Scenario: a stray file written at the mentions step is refused naming that path
267
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
268
- """
269
- export const FLAGS = [
270
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
271
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
272
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
273
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
274
- ] as const
275
- """
276
- And step "rollout.suite.check" changes nothing
277
- And step "rollout.mentions" runs its script
278
- And step "rollout.mentions" writes "src/stray.ts" with:
279
- """
280
- export const x = 1
281
- """
282
- When gtd starts workflow "rollout" with "--var flag=alpha"
283
- Then driving the process is refused with "rollout-only: src/stray.ts changed"
284
-
285
- @inmem
286
- Scenario: a second registry entry edited at the mentions step is refused
287
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
288
- """
289
- export const FLAGS = [
290
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
291
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
292
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
293
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
294
- ] as const
295
- """
296
- And step "rollout.suite.check" changes nothing
297
- And step "rollout.mentions" runs its script
298
- And step "rollout.mentions" writes "src/flags/index.ts" with:
299
- """
300
- export const FLAGS = [
301
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
302
- { name: "beta", owner: "z", expiry: "2027-02-01", kind: "release" },
303
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
304
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
305
- ] as const
306
- """
307
- When gtd starts workflow "rollout" with "--var flag=alpha"
308
- Then driving the process is refused with "rollout-only: other edits in src/flags/index.ts"
309
-
310
- @inmem
311
- Scenario: every line naming the flag is listed, no file is edited, and gtd summary repeats the list
312
- Given a file "README.md" with:
313
- """
314
- # calc
315
-
316
- The alpha formatter is on under GTD_FLAG_ALPHA=1.
317
- """
318
- And a file "src/calc.ts" with:
319
- """
320
- export const help = "pass --flag_alpha to enable the alpha formatter"
321
- """
322
- And the working tree is committed as "docs: mention the flag"
323
- And step "rollout.flipping" writes "src/flags/index.ts" with:
324
- """
325
- export const FLAGS = [
326
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
327
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
328
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
329
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
330
- ] as const
331
- """
332
- And step "rollout.suite.check" changes nothing
333
- And step "rollout.mentions" runs its script
334
- When gtd starts workflow "rollout" with "--var flag=alpha"
335
- And the process is driven
336
- Then the process rests at "idle"
337
- And ".gtd/FEEDBACK.md" does not exist
338
- And "README.md" contains "The alpha formatter is on under GTD_FLAG_ALPHA=1."
339
- And "src/calc.ts" contains "pass --flag_alpha to enable the alpha formatter"
340
- And the output of gtd "summary" contains "`README.md:3`"
341
- And the output of gtd "summary" contains "src/calc.ts:1"
342
-
343
- @inmem
344
- Scenario: gtd summary's grep hint excludes a factory flagRegistry
345
- Given a file "config/flags.ts" with:
346
- """
347
- export const FLAGS = [
348
- { name: "alpha", owner: "g", expiry: "2027-05-01", kind: "release" },
349
- ] as const
350
- """
351
- And a file "NOTES.md" with:
352
- """
353
- alpha 1
354
- alpha 2
355
- alpha 3
356
- alpha 4
357
- alpha 5
358
- alpha 6
359
- alpha 7
360
- alpha 8
361
- alpha 9
362
- alpha 10
363
- alpha 11
364
- alpha 12
365
- alpha 13
366
- alpha 14
367
- alpha 15
368
- alpha 16
369
- alpha 17
370
- alpha 18
371
- alpha 19
372
- alpha 20
373
- alpha 21
374
- alpha 22
375
- alpha 23
376
- alpha 24
377
- alpha 25
378
- alpha 26
379
- alpha 27
380
- alpha 28
381
- alpha 29
382
- alpha 30
383
- alpha 31
384
- alpha 32
385
- alpha 33
386
- alpha 34
387
- alpha 35
388
- alpha 36
389
- alpha 37
390
- alpha 38
391
- alpha 39
392
- alpha 40
393
- alpha 41
394
- alpha 42
395
- alpha 43
396
- alpha 44
397
- alpha 45
398
- alpha 46
399
- alpha 47
400
- alpha 48
401
- alpha 49
402
- alpha 50
403
- alpha 51
404
- alpha 52
405
- alpha 53
406
- alpha 54
407
- alpha 55
408
- """
409
- And the working tree is committed as "docs: mention the flag"
410
- And step "rollout.flipping" writes "config/flags.ts" with:
411
- """
412
- export const FLAGS = [
413
- { name: "alpha", owner: "g", expiry: "2027-05-01", kind: "release", defaultOn: true },
414
- ] as const
415
- """
416
- And step "rollout.suite.check" changes nothing
417
- And step "rollout.mentions" runs its script
418
- When gtd starts workflow "elsewhere" with "--var flag=alpha"
419
- And the process is driven
420
- Then the process rests at "idle"
421
- And the output of gtd "summary" contains "':(top,exclude,literal)config/flags.ts'"
422
-
423
- @inmem
424
- Scenario: a flag named nowhere outside the registry says so in gtd summary
425
- Given step "rollout.flipping" writes "src/flags/index.ts" with:
426
- """
427
- export const FLAGS = [
428
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
429
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
430
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
431
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
432
- ] as const
433
- """
434
- And step "rollout.suite.check" changes nothing
435
- And step "rollout.mentions" runs its script
436
- When gtd starts workflow "rollout" with "--var flag=alpha"
437
- And the process is driven
438
- Then the process rests at "idle"
439
- And ".gtd/FEEDBACK.md" does not exist
440
- And the output of gtd "summary" contains "no line outside the registry names it"
441
-
442
- @inmem
443
- Scenario: the closing commit marks the total and each listed line
444
- Given a file "README.md" with:
445
- """
446
- # calc
447
-
448
- The alpha formatter is on under GTD_FLAG_ALPHA=1.
449
- """
450
- And a file "src/calc.ts" with:
451
- """
452
- export const help = "pass --flag_alpha to enable the alpha formatter"
453
- """
454
- And the working tree is committed as "docs: mention the flag"
455
- And step "rollout.flipping" writes "src/flags/index.ts" with:
456
- """
457
- export const FLAGS = [
458
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
459
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
460
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
461
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
462
- ] as const
463
- """
464
- And step "rollout.suite.check" changes nothing
465
- And step "rollout.mentions" runs its script
466
- When gtd starts workflow "rollout" with "--var flag=alpha"
467
- And the process is driven
468
- Then the last commit subject is "gtd(check): rollout.mentions → idle"
469
- And the last commit body contains "Gtd-Mark: flag-mentions=2"
470
- And the last commit body contains "Gtd-Mark: flag-mention=README.md:3"
471
- And the last commit body contains "Gtd-Mark: flag-mention=src/calc.ts:1"
472
-
473
- @inmem
474
- Scenario: a finished rollout leaves no state file for the next feature start
475
- Given a file "README.md" with:
476
- """
477
- # calc
478
-
479
- The alpha formatter is on under GTD_FLAG_ALPHA=1.
480
- """
481
- And a file "src/calc.ts" with:
482
- """
483
- export const help = "pass --flag_alpha to enable the alpha formatter"
484
- """
485
- And the working tree is committed as "docs: mention the flag"
486
- And step "rollout.flipping" writes "src/flags/index.ts" with:
487
- """
488
- export const FLAGS = [
489
- { name: "alpha", owner: "a", expiry: "2027-01-01", kind: "release", defaultOn: true },
490
- { name: "beta", owner: "b", expiry: "2027-02-01", kind: "release" },
491
- { name: "ops1", owner: "c", expiry: "2027-03-01", kind: "ops" },
492
- { name: "live", owner: "d", expiry: "2027-04-01", kind: "release", defaultOn: true },
493
- ] as const
494
- """
495
- And step "rollout.suite.check" changes nothing
496
- And step "rollout.mentions" runs its script
497
- And step "unwind" changes nothing
498
- And step "start-gate.check" changes nothing
499
- When gtd starts workflow "rollout" with "--var flag=alpha"
500
- And the process is driven
501
- Then the process rests at "idle"
502
- Given a file "TODO.md" with:
503
- """
504
- # Add subtract
505
-
506
- subtract(a, b) returns the difference.
507
- """
508
- When the process is driven
509
- Then the process rests at "design.triage"
510
- And ".gtd/FEEDBACK.md" does not exist