@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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +115 -390
- package/dist/chunks/{Schema-B3o6eRNU.mjs → testkit-CMBAAyRK.mjs} +13409 -3351
- package/dist/gtd.bundle.mjs +76 -59
- package/dist/testkit/gherkin.mjs +1 -1
- package/dist/testkit.mjs +1 -1
- package/package.json +3 -42
- package/skills/authoring/SKILL.md +31 -25
- package/src/cli/Cli.test.ts +15 -19
- package/src/cli/Cli.ts +2 -4
- package/src/cli/Program.test.ts +60 -29
- package/src/cli/Program.ts +5 -7
- package/src/edge/Edge.ts +3 -3
- package/src/flags/index.test.ts +0 -13
- package/src/flags/index.ts +1 -3
- package/src/install/Install.test.ts +14 -11
- package/src/install/Install.ts +38 -15
- package/src/install/index.ts +1 -2
- package/src/replay/Replay.test.ts +1 -1
- package/src/replay/index.ts +1 -1
- package/src/step/planStart.ts +6 -1
- package/src/twins/FlowScripts.ts +1 -1
- package/src/workflow/index.ts +1 -0
- package/src/workflow/load.test.ts +138 -113
- package/src/workflow/load.ts +1 -1
- package/src/workflow/vars.test.ts +30 -3
- package/src/workflow/vars.ts +34 -2
- package/src/workflow-kit/index.ts +1 -1
- package/dist/chunks/reserved-lMYCaapY.mjs +0 -1990
- package/dist/chunks/review-Bfaror38.mjs +0 -427
- package/dist/chunks/tail-Bd7L940p.mjs +0 -355
- package/dist/chunks/testkit-JDtpNKyi.mjs +0 -10410
- package/dist/workflows/cleanup.mjs +0 -36
- package/dist/workflows/feature.mjs +0 -1018
- package/dist/workflows/fix.mjs +0 -41
- package/dist/workflows/review.mjs +0 -45
- package/dist/workflows/rollout.mjs +0 -48
- package/dist/workflows.mjs +0 -40651
- package/src/install/ConfigScaffold.ts +0 -22
- package/src/workflows/cleanup/cleanup-path.feature +0 -94
- package/src/workflows/cleanup/cleanup.feature +0 -315
- package/src/workflows/cleanup/cleanup.test.ts +0 -276
- package/src/workflows/cleanup/cleanup.ts +0 -52
- package/src/workflows/cleanup/index.ts +0 -6
- package/src/workflows/feature/acceptance-criteria-tier.feature +0 -25
- package/src/workflows/feature/acceptance-criteria.feature +0 -389
- package/src/workflows/feature/criteria-coverage.feature +0 -102
- package/src/workflows/feature/criteria.test.ts +0 -147
- package/src/workflows/feature/criteria.ts +0 -267
- package/src/workflows/feature/fast-path.feature +0 -93
- package/src/workflows/feature/feature.test.ts +0 -338
- package/src/workflows/feature/feature.ts +0 -156
- package/src/workflows/feature/green.ts +0 -19
- package/src/workflows/feature/index.ts +0 -18
- package/src/workflows/feature/lens-models.feature +0 -69
- package/src/workflows/feature/lens-review.feature +0 -566
- package/src/workflows/feature/naive-acceptance.feature +0 -147
- package/src/workflows/feature/naive-test.feature +0 -263
- package/src/workflows/feature/one-step-land.feature +0 -93
- package/src/workflows/feature/planning.ts +0 -41
- package/src/workflows/feature/refactor-absorbs.feature +0 -131
- package/src/workflows/feature/refactor-first.feature +0 -158
- package/src/workflows/feature/refactor-lens-models.feature +0 -79
- package/src/workflows/feature/refactor-rebuild.feature +0 -273
- package/src/workflows/feature/refactor-review.feature +0 -1528
- package/src/workflows/feature/refactor.test.ts +0 -1220
- package/src/workflows/feature/refactor.ts +0 -368
- package/src/workflows/feature/release-flag.feature +0 -167
- package/src/workflows/feature/release-flag.test.ts +0 -49
- package/src/workflows/feature/release-flag.ts +0 -46
- package/src/workflows/feature/review-gate.feature +0 -241
- package/src/workflows/feature/reviewer-walkthrough.feature +0 -142
- package/src/workflows/feature/risk-tier.feature +0 -351
- package/src/workflows/feature/seam-rejection.feature +0 -146
- package/src/workflows/feature/seam.feature +0 -297
- package/src/workflows/feature/seam.test.ts +0 -527
- package/src/workflows/feature/seam.ts +0 -426
- package/src/workflows/feature/standards.feature +0 -354
- package/src/workflows/feature/steps.test.ts +0 -65
- package/src/workflows/feature/steps.ts +0 -45
- package/src/workflows/feature/tier-pin.feature +0 -66
- package/src/workflows/feature/tier.test.ts +0 -166
- package/src/workflows/feature/tier.ts +0 -56
- package/src/workflows/fix/fix-lens-origin.feature +0 -114
- package/src/workflows/fix/fix-quality.feature +0 -212
- package/src/workflows/fix/fix.feature +0 -79
- package/src/workflows/fix/fix.test.ts +0 -74
- package/src/workflows/fix/fix.ts +0 -52
- package/src/workflows/fix/index.ts +0 -6
- package/src/workflows/index.ts +0 -47
- package/src/workflows/review/index.ts +0 -6
- package/src/workflows/review/review-door.feature +0 -199
- package/src/workflows/review/review.test.ts +0 -27
- package/src/workflows/review/review.ts +0 -60
- package/src/workflows/rollout/index.ts +0 -6
- package/src/workflows/rollout/rollout.feature +0 -510
- package/src/workflows/rollout/rollout.test.ts +0 -263
- package/src/workflows/rollout/rollout.ts +0 -82
- package/src/workflows/shared/__fixtures__/feature-collecting-prompt.txt +0 -98
- package/src/workflows/shared/access.test.ts +0 -62
- package/src/workflows/shared/access.ts +0 -24
- package/src/workflows/shared/config.fixture.ts +0 -12
- package/src/workflows/shared/fences.ts +0 -24
- package/src/workflows/shared/health.test.ts +0 -148
- package/src/workflows/shared/health.ts +0 -191
- package/src/workflows/shared/learn.test.ts +0 -140
- package/src/workflows/shared/learn.ts +0 -201
- package/src/workflows/shared/lenses.test.ts +0 -39
- package/src/workflows/shared/lenses.ts +0 -294
- package/src/workflows/shared/options.test.ts +0 -157
- package/src/workflows/shared/options.ts +0 -92
- package/src/workflows/shared/progress.feature +0 -124
- package/src/workflows/shared/prose.ts +0 -263
- package/src/workflows/shared/recheck.feature +0 -60
- package/src/workflows/shared/registry.test.ts +0 -345
- package/src/workflows/shared/registry.ts +0 -183
- package/src/workflows/shared/reserved.ts +0 -11
- package/src/workflows/shared/review.test.ts +0 -1062
- package/src/workflows/shared/review.ts +0 -446
- package/src/workflows/shared/skills.test.ts +0 -121
- package/src/workflows/shared/skills.ts +0 -49
- package/src/workflows/shared/standards.test.ts +0 -90
- package/src/workflows/shared/standards.ts +0 -156
- package/src/workflows/shared/steps.test.ts +0 -219
- package/src/workflows/shared/steps.ts +0 -201
- package/src/workflows/shared/tail.test.ts +0 -454
- package/src/workflows/shared/tail.ts +0 -264
- package/src/workflows/shared/text.fixture.ts +0 -128
- package/src/workflows/shared/text.test.ts +0 -1430
- package/src/workflows/shared/text.ts +0 -1700
- package/src/workflows/shared/threads.test.ts +0 -129
- package/src/workflows/shared/vars.ts +0 -47
- 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
|