@pmelab/gtd 32.1.0 → 34.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 +66 -53
- package/dist/chunks/{reserved-2fV0mj14.mjs → reserved-BcJgt5_R.mjs} +79 -12
- package/dist/chunks/{tail-BynhCfuv.mjs → tail-CM_fa93v.mjs} +1 -1
- package/dist/testkit.mjs +2 -2
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +174 -40
- package/dist/workflows/fix.mjs +2 -2
- package/dist/workflows/review.mjs +2 -2
- package/dist/workflows/rollout.mjs +1 -1
- package/dist/workflows.mjs +249 -48
- package/package.json +1 -1
- package/skills/authoring/SKILL.md +2 -2
- package/src/testkit/steps.ts +4 -0
- package/src/workflows/feature/acceptance-criteria.feature +8 -0
- package/src/workflows/feature/fast-path.feature +11 -35
- package/src/workflows/feature/feature.test.ts +9 -100
- package/src/workflows/feature/feature.ts +29 -16
- package/src/workflows/feature/flag-mode.feature +2 -91
- package/src/workflows/feature/naive-acceptance.feature +140 -0
- package/src/workflows/feature/one-step-land.feature +11 -34
- package/src/workflows/feature/quality-unresolved.feature +96 -0
- package/src/workflows/feature/refactor-absorbs.feature +17 -25
- package/src/workflows/feature/refactor-first.feature +11 -35
- package/src/workflows/feature/refactor-lens-models.feature +6 -1
- package/src/workflows/feature/refactor-review.feature +67 -360
- package/src/workflows/feature/refactor.ts +4 -3
- package/src/workflows/feature/risk-tier.feature +10 -0
- package/src/workflows/feature/seam-rejection.feature +20 -37
- package/src/workflows/feature/seam.feature +66 -113
- package/src/workflows/feature/seam.test.ts +173 -3
- package/src/workflows/feature/seam.ts +196 -31
- package/src/workflows/review/review-door.feature +108 -0
- package/src/workflows/shared/tail.ts +2 -2
- package/src/workflows/shared/text.test.ts +40 -0
- package/src/workflows/shared/text.ts +110 -16
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# One SDLC path per file, so a changed path reds exactly one fixture — do not merge.
|
|
2
2
|
@inmem
|
|
3
|
-
Feature: a refactor that carried the whole feature still gets a
|
|
3
|
+
Feature: a refactor that carried the whole feature still gets a quality lap over all of it
|
|
4
4
|
|
|
5
5
|
With GTD_FLAG_RISK_TIER off, a refactor-first
|
|
6
6
|
refactor can land everything the requirements ask for. The feature slice's
|
|
7
7
|
implement turn then has nothing to author: its empty turn completes the
|
|
8
|
-
step, and with no code changed since the refactor the feature
|
|
9
|
-
the whole change, refactor included.
|
|
8
|
+
step, and with no code changed since the refactor the feature slice's
|
|
9
|
+
quality lap covers the whole change, refactor included.
|
|
10
10
|
|
|
11
11
|
Background:
|
|
12
12
|
Given the shipped workflows, as gtd install scaffolds them
|
|
13
|
-
And an environment variable "GTD_QUALITYREVIEWS" set to ""
|
|
13
|
+
And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
|
|
14
14
|
And an environment variable "GTD_REFACTORQUALITYREVIEWS" set to ""
|
|
15
15
|
And an environment variable "GTD_FLAG_RISK_TIER" set to "0"
|
|
16
16
|
And a file "src/calc.ts" with:
|
|
@@ -42,8 +42,13 @@ Feature: a refactor that carried the whole feature still gets a feature review
|
|
|
42
42
|
"""
|
|
43
43
|
And step "design.gate.answer" changes nothing
|
|
44
44
|
|
|
45
|
-
Scenario: an empty implement turn after a refactor that did it all reaches
|
|
46
|
-
Given step "seam.
|
|
45
|
+
Scenario: an empty implement turn after a refactor that did it all reaches the quality lap and idle
|
|
46
|
+
Given step "seam.check" changes nothing
|
|
47
|
+
And step "seam.naive" writes "src/acceptance.test.ts" with:
|
|
48
|
+
"""
|
|
49
|
+
it("[AC-1] holds", () => {})
|
|
50
|
+
"""
|
|
51
|
+
And step "seam.naive" writes "src/calc.ts" with:
|
|
47
52
|
"""
|
|
48
53
|
export const add = (a: number, b: number) => a + b
|
|
49
54
|
export const subtract = (a: number, b: number) => a - b
|
|
@@ -89,25 +94,14 @@ Feature: a refactor that carried the whole feature still gets a feature review
|
|
|
89
94
|
And step "implement.building" changes nothing
|
|
90
95
|
And step "implement.health.check" changes nothing
|
|
91
96
|
And step "implement.closing" runs its script
|
|
92
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
93
|
-
"""
|
|
94
|
-
# Review: abc1234
|
|
95
|
-
|
|
96
|
-
<!-- base: 0000000 -->
|
|
97
|
-
|
|
98
|
-
## calc
|
|
99
|
-
|
|
100
|
-
- [ ] ./src/calc.ts#1-2
|
|
101
|
-
subtract next to add
|
|
102
|
-
"""
|
|
103
97
|
When gtd lands
|
|
104
98
|
And the process is driven
|
|
105
|
-
Then the process rests at "build.
|
|
99
|
+
Then the process rests at "build.quality.correctness.reviewing"
|
|
100
|
+
And the resting step's content contains the hash of the commit "feat: add calculator"
|
|
106
101
|
And ".gtd/REQUIREMENTS.md" does not exist
|
|
107
102
|
|
|
108
|
-
Given step "build.
|
|
109
|
-
When
|
|
110
|
-
And the process is driven
|
|
103
|
+
Given step "build.quality.correctness.reviewing" changes nothing
|
|
104
|
+
When the process is driven
|
|
111
105
|
Then the process rests at "idle"
|
|
112
106
|
And "src/calc.ts" contains "subtract"
|
|
113
107
|
And the commit subjects end with:
|
|
@@ -116,10 +110,8 @@ Feature: a refactor that carried the whole feature still gets a feature review
|
|
|
116
110
|
gtd(check): refactor.build.review.closing → implement.building
|
|
117
111
|
gtd(agent): implement.building → implement.health.check
|
|
118
112
|
gtd(check): implement.health.check → implement.closing
|
|
119
|
-
gtd(check): implement.closing → build.
|
|
120
|
-
gtd(agent): build.
|
|
121
|
-
gtd(human): build.review.await-review → build.review.closing
|
|
122
|
-
gtd(check): build.review.closing → idle
|
|
113
|
+
gtd(check): implement.closing → build.quality.correctness.reviewing
|
|
114
|
+
gtd(agent): build.quality.correctness.reviewing → idle
|
|
123
115
|
"""
|
|
124
116
|
And the output lines of gtd "slices" start with:
|
|
125
117
|
"""
|
|
@@ -4,7 +4,7 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
4
4
|
|
|
5
5
|
With GTD_FLAG_RISK_TIER off, a naive pass touching
|
|
6
6
|
an existing non-allowlisted file is ruled refactor-first, is refactored and
|
|
7
|
-
that refactor reviewed, and only then implemented. The flags are
|
|
7
|
+
that refactor reviewed, and only then implemented, with no feature review. The flags are
|
|
8
8
|
pinned so the per-flag test runs never move it off its path.
|
|
9
9
|
|
|
10
10
|
Background:
|
|
@@ -42,7 +42,12 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
42
42
|
And step "design.gate.answer" changes nothing
|
|
43
43
|
|
|
44
44
|
Scenario: a refactor-first judgment runs refactor, its review, implement and review to idle
|
|
45
|
-
Given step "seam.
|
|
45
|
+
Given step "seam.check" changes nothing
|
|
46
|
+
And step "seam.naive" writes "src/acceptance.test.ts" with:
|
|
47
|
+
"""
|
|
48
|
+
it("[AC-1] holds", () => {})
|
|
49
|
+
"""
|
|
50
|
+
And step "seam.naive" writes "src/calc.ts" with:
|
|
46
51
|
"""
|
|
47
52
|
export const add = (a: number, b: number) => a + b
|
|
48
53
|
export const subtract = (a: number, b: number) => a - b
|
|
@@ -90,18 +95,6 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
90
95
|
- [x] ./src/calc.ts#1-2
|
|
91
96
|
add built on the shared op
|
|
92
97
|
"""
|
|
93
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
94
|
-
"""
|
|
95
|
-
# Review: abc1234
|
|
96
|
-
|
|
97
|
-
<!-- base: 0000000 -->
|
|
98
|
-
|
|
99
|
-
## calc
|
|
100
|
-
|
|
101
|
-
- [ ] ./src/calc.ts#1-3
|
|
102
|
-
subtract built on the shared op
|
|
103
|
-
"""
|
|
104
|
-
And step "build.review.closing" runs its script
|
|
105
98
|
When gtd lands
|
|
106
99
|
And the process is driven
|
|
107
100
|
Then the process rests at "implement.building"
|
|
@@ -116,21 +109,6 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
116
109
|
And step "implement.health.check" changes nothing
|
|
117
110
|
And step "implement.closing" runs its script
|
|
118
111
|
When the process is driven
|
|
119
|
-
Then the process rests at "build.review.await-review"
|
|
120
|
-
|
|
121
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
122
|
-
"""
|
|
123
|
-
# Review: abc1234
|
|
124
|
-
|
|
125
|
-
<!-- base: 0000000 -->
|
|
126
|
-
|
|
127
|
-
## calc
|
|
128
|
-
|
|
129
|
-
- [x] ./src/calc.ts#1-3
|
|
130
|
-
subtract built on the shared op
|
|
131
|
-
"""
|
|
132
|
-
When gtd lands
|
|
133
|
-
And the process is driven
|
|
134
112
|
Then the process rests at "idle"
|
|
135
113
|
And "src/calc.ts" contains "op(a, b, 1)"
|
|
136
114
|
And "src/calc.ts" contains "subtract"
|
|
@@ -141,7 +119,8 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
141
119
|
gtd(check): start-gate.check → design.triage
|
|
142
120
|
gtd(agent): design.triage → design.gate.answer
|
|
143
121
|
gtd(human): design.gate.answer → seam.naive
|
|
144
|
-
gtd(agent): seam.naive → seam.
|
|
122
|
+
gtd(agent): seam.naive → seam.check
|
|
123
|
+
gtd(check): seam.check → seam.judge
|
|
145
124
|
gtd(judge): seam.judge → refactor.deriving
|
|
146
125
|
gtd(check): refactor.deriving → refactor.building
|
|
147
126
|
gtd(agent): refactor.building → refactor.health.check
|
|
@@ -152,13 +131,10 @@ Feature: a refactor-first judgment walks one fixed path to idle
|
|
|
152
131
|
gtd(check): refactor.build.review.closing → implement.building
|
|
153
132
|
gtd(agent): implement.building → implement.health.check
|
|
154
133
|
gtd(check): implement.health.check → implement.closing
|
|
155
|
-
gtd(check): implement.closing →
|
|
156
|
-
gtd(agent): build.review.reviewing → build.review.await-review
|
|
157
|
-
gtd(human): build.review.await-review → build.review.closing
|
|
158
|
-
gtd(check): build.review.closing → idle
|
|
134
|
+
gtd(check): implement.closing → idle
|
|
159
135
|
"""
|
|
160
136
|
And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
|
|
161
|
-
And the commit "gtd(agent): seam.naive → seam.
|
|
137
|
+
And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
|
|
162
138
|
And the commit "gtd(judge): seam.judge → refactor.deriving" has a body containing "\"answer\":\"refactor-first\""
|
|
163
139
|
And no commit body contains "Gtd-Approved:"
|
|
164
140
|
And the output lines of gtd "slices" start with:
|
|
@@ -36,7 +36,12 @@ Feature: the refactor review's lenses take their model hints from refactorQualit
|
|
|
36
36
|
And step "design.gate.answer" changes nothing
|
|
37
37
|
|
|
38
38
|
Scenario: a refactor lens runs on its refactorQualityReviews hint, else its default
|
|
39
|
-
Given step "seam.
|
|
39
|
+
Given step "seam.check" changes nothing
|
|
40
|
+
And step "seam.naive" writes "src/acceptance.test.ts" with:
|
|
41
|
+
"""
|
|
42
|
+
it("[AC-1] holds", () => {})
|
|
43
|
+
"""
|
|
44
|
+
And step "seam.naive" writes "src/calc.ts" with:
|
|
40
45
|
"""
|
|
41
46
|
export const add = (a: number, b: number) => a + b
|
|
42
47
|
export const subtract = (a: number, b: number) => a - b
|