create-agentic-pdlc 1.1.0 → 1.2.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.
|
@@ -5,8 +5,8 @@ on:
|
|
|
5
5
|
types: [opened, reopened, closed]
|
|
6
6
|
pull_request_review:
|
|
7
7
|
types: [submitted]
|
|
8
|
-
|
|
9
|
-
types: [
|
|
8
|
+
issues:
|
|
9
|
+
types: [labeled]
|
|
10
10
|
|
|
11
11
|
env:
|
|
12
12
|
PROJECT_ID: "{{PROJECT_ID}}"
|
|
@@ -15,43 +15,49 @@ env:
|
|
|
15
15
|
STATUS_BRAINSTORMING: "{{ID_BRAINSTORMING}}"
|
|
16
16
|
STATUS_DETAILING: "{{ID_DETAILING}}"
|
|
17
17
|
STATUS_APPROVAL: "{{ID_APPROVAL}}"
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
STATUS_DEVELOPMENT: "{{ID_DEVELOPMENT}}"
|
|
19
|
+
STATUS_CODE_REVIEW_PR: "{{ID_CODE_REVIEW_PR}}"
|
|
20
|
+
STATUS_MERGE: "{{ID_MERGE}}"
|
|
20
21
|
STATUS_PRODUCAO: "{{ID_PRODUCAO}}"
|
|
21
22
|
|
|
22
23
|
jobs:
|
|
23
|
-
# Issue
|
|
24
|
-
move-card-on-
|
|
25
|
-
name: Upstream
|
|
26
|
-
if: github.event_name == '
|
|
24
|
+
# Issue Labeled → Move Upstream
|
|
25
|
+
move-card-on-label:
|
|
26
|
+
name: Upstream Label → Move Card
|
|
27
|
+
if: github.event_name == 'issues' && github.event.action == 'labeled'
|
|
27
28
|
runs-on: ubuntu-latest
|
|
29
|
+
env:
|
|
30
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
28
31
|
steps:
|
|
29
|
-
- name: Detect
|
|
30
|
-
if: ${{
|
|
32
|
+
- name: Detect Label and Move Issue
|
|
33
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
31
34
|
uses: actions/github-script@v7
|
|
32
35
|
with:
|
|
33
|
-
github-token: ${{
|
|
36
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
34
37
|
script: |
|
|
35
|
-
const
|
|
38
|
+
const labelName = context.payload.label.name;
|
|
36
39
|
let targetStatusId = null;
|
|
37
40
|
let stageName = null;
|
|
38
41
|
|
|
39
|
-
if (
|
|
42
|
+
if (labelName === 'stage:exploration') {
|
|
40
43
|
targetStatusId = process.env.STATUS_EXPLORATION;
|
|
41
44
|
stageName = 'Exploration';
|
|
42
|
-
} else if (
|
|
45
|
+
} else if (labelName === 'stage:brainstorming') {
|
|
43
46
|
targetStatusId = process.env.STATUS_BRAINSTORMING;
|
|
44
47
|
stageName = 'Brainstorming';
|
|
45
|
-
} else if (
|
|
48
|
+
} else if (labelName === 'stage:detailing') {
|
|
46
49
|
targetStatusId = process.env.STATUS_DETAILING;
|
|
47
50
|
stageName = 'Detailing';
|
|
48
|
-
} else if (
|
|
51
|
+
} else if (labelName === 'spec:approved') {
|
|
49
52
|
targetStatusId = process.env.STATUS_APPROVAL;
|
|
50
53
|
stageName = 'Approval';
|
|
54
|
+
} else if (labelName === 'stage:development') {
|
|
55
|
+
targetStatusId = process.env.STATUS_DEVELOPMENT;
|
|
56
|
+
stageName = 'Development';
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
if (!targetStatusId) {
|
|
54
|
-
console.log('No upstream PDLC
|
|
60
|
+
console.log('No upstream PDLC label found. Skipping.');
|
|
55
61
|
return;
|
|
56
62
|
}
|
|
57
63
|
|
|
@@ -78,17 +84,19 @@ jobs:
|
|
|
78
84
|
console.log(`Issue #${number} moved to ${stageName}`);
|
|
79
85
|
|
|
80
86
|
|
|
81
|
-
# PR Opened → Move linked issue to Code Review
|
|
87
|
+
# PR Opened → Move linked issue to Code Review / PR
|
|
82
88
|
move-card-on-pr-open:
|
|
83
|
-
name: Open PR → Code Review
|
|
89
|
+
name: Open PR → Code Review / PR
|
|
84
90
|
if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'reopened')
|
|
85
91
|
runs-on: ubuntu-latest
|
|
92
|
+
env:
|
|
93
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
86
94
|
steps:
|
|
87
|
-
- name: Move linked issue to Code Review
|
|
88
|
-
if: ${{
|
|
95
|
+
- name: Move linked issue to Code Review / PR
|
|
96
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
89
97
|
uses: actions/github-script@v7
|
|
90
98
|
with:
|
|
91
|
-
github-token: ${{
|
|
99
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
92
100
|
script: |
|
|
93
101
|
const prNumber = context.payload.pull_request.number;
|
|
94
102
|
const { owner, repo } = context.repo;
|
|
@@ -113,7 +121,7 @@ jobs:
|
|
|
113
121
|
}
|
|
114
122
|
}`, {
|
|
115
123
|
p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
116
|
-
v: { singleSelectOptionId: process.env.
|
|
124
|
+
v: { singleSelectOptionId: process.env.STATUS_CODE_REVIEW_PR }
|
|
117
125
|
});
|
|
118
126
|
};
|
|
119
127
|
|
|
@@ -121,26 +129,28 @@ jobs:
|
|
|
121
129
|
for (const n of linkedIssues) {
|
|
122
130
|
const { data: issue } = await github.rest.issues.get({ owner, repo, issue_number: n });
|
|
123
131
|
await moveItem(issue.node_id);
|
|
124
|
-
console.log(`Issue #${n} → Code Review`);
|
|
132
|
+
console.log(`Issue #${n} → Code Review / PR`);
|
|
125
133
|
}
|
|
126
134
|
} else {
|
|
127
135
|
await moveItem(pr.node_id);
|
|
128
|
-
console.log(`PR #${prNumber} → Code Review (no linked issue)`);
|
|
136
|
+
console.log(`PR #${prNumber} → Code Review / PR (no linked issue)`);
|
|
129
137
|
}
|
|
130
138
|
|
|
131
139
|
await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: ['pr:review'] }).catch(() => {});
|
|
132
140
|
|
|
133
|
-
# Review Approved →
|
|
141
|
+
# Review Approved → Merge
|
|
134
142
|
move-card-on-review-approved:
|
|
135
|
-
name: Approved PR →
|
|
143
|
+
name: Approved PR → Merge
|
|
136
144
|
if: github.event_name == 'pull_request_review' && github.event.review.state == 'approved'
|
|
137
145
|
runs-on: ubuntu-latest
|
|
146
|
+
env:
|
|
147
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
138
148
|
steps:
|
|
139
|
-
- name: Move issue to
|
|
140
|
-
if: ${{
|
|
149
|
+
- name: Move issue to Merge
|
|
150
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
141
151
|
uses: actions/github-script@v7
|
|
142
152
|
with:
|
|
143
|
-
github-token: ${{
|
|
153
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
144
154
|
script: |
|
|
145
155
|
const prNumber = context.payload.pull_request.number;
|
|
146
156
|
const { owner, repo } = context.repo;
|
|
@@ -159,7 +169,7 @@ jobs:
|
|
|
159
169
|
projectV2Item { id }
|
|
160
170
|
}
|
|
161
171
|
}`, { p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
162
|
-
v: { singleSelectOptionId: process.env.
|
|
172
|
+
v: { singleSelectOptionId: process.env.STATUS_MERGE } });
|
|
163
173
|
};
|
|
164
174
|
|
|
165
175
|
if (linkedIssues.length > 0) {
|
|
@@ -179,12 +189,14 @@ jobs:
|
|
|
179
189
|
name: Merged PR → Production
|
|
180
190
|
if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true
|
|
181
191
|
runs-on: ubuntu-latest
|
|
192
|
+
env:
|
|
193
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
182
194
|
steps:
|
|
183
195
|
- name: Move issue to Production
|
|
184
|
-
if: ${{
|
|
196
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
185
197
|
uses: actions/github-script@v7
|
|
186
198
|
with:
|
|
187
|
-
github-token: ${{
|
|
199
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
188
200
|
script: |
|
|
189
201
|
const prNumber = context.payload.pull_request.number;
|
|
190
202
|
const { owner, repo } = context.repo;
|
|
@@ -22,7 +22,7 @@ If any of these files are missing, you are in **Setup Mode**. Do not proceed wit
|
|
|
22
22
|
- **Project basics:** Project Name, Description, Technical Stack (Structure).
|
|
23
23
|
- **Commands:** Test command, Lint command, Build command.
|
|
24
24
|
- **Invariants:** Critical business rules agents must never violate (e.g. Human-in-the-loop).
|
|
25
|
-
- **Board IDs:** PROJECT_ID, STATUS_FIELD_ID, column option IDs (provide standard PDLC options: Idea, Exploration, Brainstorming, Detail Solution, Approval, Development, Testing, Code Review
|
|
25
|
+
- **Board IDs:** PROJECT_ID, STATUS_FIELD_ID, column option IDs (provide standard PDLC options: Idea, Exploration, Brainstorming, Detail Solution, Approval, Development, Testing, Code Review / PR, Merge, Production). Allow user to answer "skip", which means you leave the placeholders intact.
|
|
26
26
|
- **Implementation agent handle:** e.g., `@google-labs-jules`, or "none".
|
|
27
27
|
3. Generate and write the missing files replacing the `{{SCREAMING_SNAKE_CASE}}` placeholders using the templates logic you know (usually they reside in standard Agentic PDLC templates).
|
|
28
28
|
4. Offer to run the `gh` commands for labels (`spec:approved`, `pr:review`, `pr:approved`, `architecture-violation`).
|
|
@@ -47,3 +47,9 @@ Once approved, you will detail the solution directly into the GitHub Issue body.
|
|
|
47
47
|
|
|
48
48
|
### 3. Handoff
|
|
49
49
|
Do not write code for downstream features! Your goal is to refine the Spec, so the human Tech Lead can label the issue `spec:approved`. This label triggers the downstream agent via `agent-trigger.yml`.
|
|
50
|
+
|
|
51
|
+
### 4. Moving the Board (Upstream States)
|
|
52
|
+
As you actively work with the user advancing the feature, you MUST use the GitHub CLI to update internal state labels. This triggers GitHub Actions behind the scenes.
|
|
53
|
+
- Starting context evaluation: Run `gh issue edit <N> --add-label "stage:exploration"`
|
|
54
|
+
- Presenting architecture/approaches: Run `gh issue edit <N> --add-label "stage:brainstorming"`
|
|
55
|
+
- Starting to write the technical spec: Run `gh issue edit <N> --add-label "stage:detailing"`
|
package/docs/pdlc.md
CHANGED
|
@@ -4,20 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
| Column | Meaning | Who moves the card |
|
|
6
6
|
|---|---|---|
|
|
7
|
-
| 💡 Idea | Backlog — every new issue lands here |
|
|
8
|
-
| 🔍 Exploration | Claude is analyzing code and context |
|
|
9
|
-
| 🧠 Brainstorming | Claude proposed approaches, awaiting PM gate |
|
|
10
|
-
| 📐 Detail Solution | Claude is writing the technical spec |
|
|
11
|
-
| ✅ Approval | Spec ready, awaiting `spec:approved` label |
|
|
12
|
-
| ⚙️ Development | Agent implementing the spec |
|
|
7
|
+
| 💡 Idea | Backlog — every new issue lands here | Manual |
|
|
8
|
+
| 🔍 Exploration | Claude is analyzing code and context | Label `stage:exploration` |
|
|
9
|
+
| 🧠 Brainstorming | Claude proposed approaches, awaiting PM gate | Label `stage:brainstorming` |
|
|
10
|
+
| 📐 Detail Solution | Claude is writing the technical spec | Label `stage:detailing` |
|
|
11
|
+
| ✅ Approval | Spec ready, awaiting `spec:approved` label | Label `spec:approved` |
|
|
12
|
+
| ⚙️ Development | Agent implementing the spec | Label `stage:development` |
|
|
13
13
|
| 🧪 Testing | CI pipeline running | GitHub Actions |
|
|
14
|
-
| 👁 Code Review | PR opened, awaiting human review | GitHub Actions |
|
|
15
|
-
| 🔀
|
|
14
|
+
| 👁 Code Review / PR | PR opened, awaiting human review | GitHub Actions |
|
|
15
|
+
| 🔀 Merge | PR approved, awaiting merge | GitHub Actions |
|
|
16
16
|
| 🚀 Production | Merged | GitHub Actions |
|
|
17
17
|
|
|
18
18
|
<!--
|
|
19
19
|
Adapt columns as needed. The functional baseline is:
|
|
20
|
-
💡 Idea → ⚙️ Development → 👁 Code Review → 🚀 Production
|
|
20
|
+
💡 Idea → ⚙️ Development → 👁 Code Review / PR → 🚀 Production
|
|
21
21
|
-->
|
|
22
22
|
|
|
23
23
|
## Board Identifiers (GitHub Projects)
|
|
@@ -39,8 +39,8 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
39
39
|
| ✅ Approval | `{{ID_APPROVAL}}` |
|
|
40
40
|
| ⚙️ Development | `{{ID_DEVELOPMENT}}` |
|
|
41
41
|
| 🧪 Testing | `{{ID_TESTING}}` |
|
|
42
|
-
| 👁 Code Review | `{{
|
|
43
|
-
| 🔀
|
|
42
|
+
| 👁 Code Review / PR | `{{ID_CODE_REVIEW_PR}}` |
|
|
43
|
+
| 🔀 Merge | `{{ID_MERGE}}` |
|
|
44
44
|
| 🚀 Production | `{{ID_PRODUCTION}}` |
|
|
45
45
|
|
|
46
46
|
## Agent × Phase Mapping
|
|
@@ -49,7 +49,7 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
49
49
|
|---|---|
|
|
50
50
|
| 💡 → 📐 (upstream) | Claude (or ideation agent) in conversational session |
|
|
51
51
|
| ⚙️ → 🔀 (downstream) | {{IMPLEMENTATION_AGENT}} (e.g. Jules `@google-labs-jules`) |
|
|
52
|
-
| 👁 Code Review | Human (you) |
|
|
52
|
+
| 👁 Code Review / PR | Human (you) |
|
|
53
53
|
| Automatic transitions | GitHub Actions |
|
|
54
54
|
|
|
55
55
|
## Issue Title Conventions
|
|
@@ -67,6 +67,10 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
67
67
|
|
|
68
68
|
| Label | Entity | Color | Meaning |
|
|
69
69
|
|---|---|---|---|
|
|
70
|
+
| `stage:exploration` | Issue | Purple | Issue is being evaluated |
|
|
71
|
+
| `stage:brainstorming` | Issue | Pink | Proposed approaches awaiting PM gate |
|
|
72
|
+
| `stage:detailing` | Issue | Blue | Technical spec is being written |
|
|
73
|
+
| `stage:development` | Issue | Orange | Agent is implementing the spec |
|
|
70
74
|
| `spec:approved` | Issue | Green | Gate 2 — agent is cleared to implement |
|
|
71
75
|
| `pr:review` | PR | Yellow | Awaiting code review |
|
|
72
76
|
| `pr:approved` | PR | Green | Code review approved |
|
package/package.json
CHANGED
|
@@ -5,8 +5,8 @@ on:
|
|
|
5
5
|
types: [opened, reopened, closed]
|
|
6
6
|
pull_request_review:
|
|
7
7
|
types: [submitted]
|
|
8
|
-
|
|
9
|
-
types: [
|
|
8
|
+
issues:
|
|
9
|
+
types: [labeled]
|
|
10
10
|
|
|
11
11
|
env:
|
|
12
12
|
PROJECT_ID: "{{PROJECT_ID}}"
|
|
@@ -15,43 +15,49 @@ env:
|
|
|
15
15
|
STATUS_BRAINSTORMING: "{{ID_BRAINSTORMING}}"
|
|
16
16
|
STATUS_DETAILING: "{{ID_DETAILING}}"
|
|
17
17
|
STATUS_APPROVAL: "{{ID_APPROVAL}}"
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
STATUS_DEVELOPMENT: "{{ID_DEVELOPMENT}}"
|
|
19
|
+
STATUS_CODE_REVIEW_PR: "{{ID_CODE_REVIEW_PR}}"
|
|
20
|
+
STATUS_MERGE: "{{ID_MERGE}}"
|
|
20
21
|
STATUS_PRODUCAO: "{{ID_PRODUCAO}}"
|
|
21
22
|
|
|
22
23
|
jobs:
|
|
23
|
-
# Issue
|
|
24
|
-
move-card-on-
|
|
25
|
-
name: Upstream
|
|
26
|
-
if: github.event_name == '
|
|
24
|
+
# Issue Labeled → Move Upstream
|
|
25
|
+
move-card-on-label:
|
|
26
|
+
name: Upstream Label → Move Card
|
|
27
|
+
if: github.event_name == 'issues' && github.event.action == 'labeled'
|
|
27
28
|
runs-on: ubuntu-latest
|
|
29
|
+
env:
|
|
30
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
28
31
|
steps:
|
|
29
|
-
- name: Detect
|
|
30
|
-
if: ${{
|
|
32
|
+
- name: Detect Label and Move Issue
|
|
33
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
31
34
|
uses: actions/github-script@v7
|
|
32
35
|
with:
|
|
33
|
-
github-token: ${{
|
|
36
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
34
37
|
script: |
|
|
35
|
-
const
|
|
38
|
+
const labelName = context.payload.label.name;
|
|
36
39
|
let targetStatusId = null;
|
|
37
40
|
let stageName = null;
|
|
38
41
|
|
|
39
|
-
if (
|
|
42
|
+
if (labelName === 'stage:exploration') {
|
|
40
43
|
targetStatusId = process.env.STATUS_EXPLORATION;
|
|
41
44
|
stageName = 'Exploration';
|
|
42
|
-
} else if (
|
|
45
|
+
} else if (labelName === 'stage:brainstorming') {
|
|
43
46
|
targetStatusId = process.env.STATUS_BRAINSTORMING;
|
|
44
47
|
stageName = 'Brainstorming';
|
|
45
|
-
} else if (
|
|
48
|
+
} else if (labelName === 'stage:detailing') {
|
|
46
49
|
targetStatusId = process.env.STATUS_DETAILING;
|
|
47
50
|
stageName = 'Detailing';
|
|
48
|
-
} else if (
|
|
51
|
+
} else if (labelName === 'spec:approved') {
|
|
49
52
|
targetStatusId = process.env.STATUS_APPROVAL;
|
|
50
53
|
stageName = 'Approval';
|
|
54
|
+
} else if (labelName === 'stage:development') {
|
|
55
|
+
targetStatusId = process.env.STATUS_DEVELOPMENT;
|
|
56
|
+
stageName = 'Development';
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
if (!targetStatusId) {
|
|
54
|
-
console.log('No upstream PDLC
|
|
60
|
+
console.log('No upstream PDLC label found. Skipping.');
|
|
55
61
|
return;
|
|
56
62
|
}
|
|
57
63
|
|
|
@@ -78,17 +84,19 @@ jobs:
|
|
|
78
84
|
console.log(`Issue #${number} moved to ${stageName}`);
|
|
79
85
|
|
|
80
86
|
|
|
81
|
-
# PR Opened → Move linked issue to Code Review
|
|
87
|
+
# PR Opened → Move linked issue to Code Review / PR
|
|
82
88
|
move-card-on-pr-open:
|
|
83
|
-
name: Open PR → Code Review
|
|
89
|
+
name: Open PR → Code Review / PR
|
|
84
90
|
if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'reopened')
|
|
85
91
|
runs-on: ubuntu-latest
|
|
92
|
+
env:
|
|
93
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
86
94
|
steps:
|
|
87
|
-
- name: Move linked issue to Code Review
|
|
88
|
-
if: ${{
|
|
95
|
+
- name: Move linked issue to Code Review / PR
|
|
96
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
89
97
|
uses: actions/github-script@v7
|
|
90
98
|
with:
|
|
91
|
-
github-token: ${{
|
|
99
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
92
100
|
script: |
|
|
93
101
|
const prNumber = context.payload.pull_request.number;
|
|
94
102
|
const { owner, repo } = context.repo;
|
|
@@ -113,7 +121,7 @@ jobs:
|
|
|
113
121
|
}
|
|
114
122
|
}`, {
|
|
115
123
|
p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
116
|
-
v: { singleSelectOptionId: process.env.
|
|
124
|
+
v: { singleSelectOptionId: process.env.STATUS_CODE_REVIEW_PR }
|
|
117
125
|
});
|
|
118
126
|
};
|
|
119
127
|
|
|
@@ -121,26 +129,28 @@ jobs:
|
|
|
121
129
|
for (const n of linkedIssues) {
|
|
122
130
|
const { data: issue } = await github.rest.issues.get({ owner, repo, issue_number: n });
|
|
123
131
|
await moveItem(issue.node_id);
|
|
124
|
-
console.log(`Issue #${n} → Code Review`);
|
|
132
|
+
console.log(`Issue #${n} → Code Review / PR`);
|
|
125
133
|
}
|
|
126
134
|
} else {
|
|
127
135
|
await moveItem(pr.node_id);
|
|
128
|
-
console.log(`PR #${prNumber} → Code Review (no linked issue)`);
|
|
136
|
+
console.log(`PR #${prNumber} → Code Review / PR (no linked issue)`);
|
|
129
137
|
}
|
|
130
138
|
|
|
131
139
|
await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: ['pr:review'] }).catch(() => {});
|
|
132
140
|
|
|
133
|
-
# Review Approved →
|
|
141
|
+
# Review Approved → Merge
|
|
134
142
|
move-card-on-review-approved:
|
|
135
|
-
name: Approved PR →
|
|
143
|
+
name: Approved PR → Merge
|
|
136
144
|
if: github.event_name == 'pull_request_review' && github.event.review.state == 'approved'
|
|
137
145
|
runs-on: ubuntu-latest
|
|
146
|
+
env:
|
|
147
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
138
148
|
steps:
|
|
139
|
-
- name: Move issue to
|
|
140
|
-
if: ${{
|
|
149
|
+
- name: Move issue to Merge
|
|
150
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
141
151
|
uses: actions/github-script@v7
|
|
142
152
|
with:
|
|
143
|
-
github-token: ${{
|
|
153
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
144
154
|
script: |
|
|
145
155
|
const prNumber = context.payload.pull_request.number;
|
|
146
156
|
const { owner, repo } = context.repo;
|
|
@@ -159,7 +169,7 @@ jobs:
|
|
|
159
169
|
projectV2Item { id }
|
|
160
170
|
}
|
|
161
171
|
}`, { p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
162
|
-
v: { singleSelectOptionId: process.env.
|
|
172
|
+
v: { singleSelectOptionId: process.env.STATUS_MERGE } });
|
|
163
173
|
};
|
|
164
174
|
|
|
165
175
|
if (linkedIssues.length > 0) {
|
|
@@ -179,12 +189,14 @@ jobs:
|
|
|
179
189
|
name: Merged PR → Production
|
|
180
190
|
if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true
|
|
181
191
|
runs-on: ubuntu-latest
|
|
192
|
+
env:
|
|
193
|
+
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
182
194
|
steps:
|
|
183
195
|
- name: Move issue to Production
|
|
184
|
-
if: ${{
|
|
196
|
+
if: ${{ env.PROJECT_TOKEN != '' }}
|
|
185
197
|
uses: actions/github-script@v7
|
|
186
198
|
with:
|
|
187
|
-
github-token: ${{
|
|
199
|
+
github-token: ${{ env.PROJECT_TOKEN }}
|
|
188
200
|
script: |
|
|
189
201
|
const prNumber = context.payload.pull_request.number;
|
|
190
202
|
const { owner, repo } = context.repo;
|
package/templates/docs/pdlc.md
CHANGED
|
@@ -4,20 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
| Column | Meaning | Who moves the card |
|
|
6
6
|
|---|---|---|
|
|
7
|
-
| 💡 Idea | Backlog — every new issue lands here |
|
|
8
|
-
| 🔍 Exploration | Claude is analyzing code and context |
|
|
9
|
-
| 🧠 Brainstorming | Claude proposed approaches, awaiting PM gate |
|
|
10
|
-
| 📐 Detail Solution | Claude is writing the technical spec |
|
|
11
|
-
| ✅ Approval | Spec ready, awaiting `spec:approved` label |
|
|
12
|
-
| ⚙️ Development | Agent implementing the spec |
|
|
7
|
+
| 💡 Idea | Backlog — every new issue lands here | Manual |
|
|
8
|
+
| 🔍 Exploration | Claude is analyzing code and context | Label `stage:exploration` |
|
|
9
|
+
| 🧠 Brainstorming | Claude proposed approaches, awaiting PM gate | Label `stage:brainstorming` |
|
|
10
|
+
| 📐 Detail Solution | Claude is writing the technical spec | Label `stage:detailing` |
|
|
11
|
+
| ✅ Approval | Spec ready, awaiting `spec:approved` label | Label `spec:approved` |
|
|
12
|
+
| ⚙️ Development | Agent implementing the spec | Label `stage:development` |
|
|
13
13
|
| 🧪 Testing | CI pipeline running | GitHub Actions |
|
|
14
|
-
| 👁 Code Review | PR opened, awaiting human review | GitHub Actions |
|
|
15
|
-
| 🔀
|
|
14
|
+
| 👁 Code Review / PR | PR opened, awaiting human review | GitHub Actions |
|
|
15
|
+
| 🔀 Merge | PR approved, awaiting merge | GitHub Actions |
|
|
16
16
|
| 🚀 Production | Merged | GitHub Actions |
|
|
17
17
|
|
|
18
18
|
<!--
|
|
19
19
|
Adapt columns as needed. The functional baseline is:
|
|
20
|
-
💡 Idea → ⚙️ Development → 👁 Code Review → 🚀 Production
|
|
20
|
+
💡 Idea → ⚙️ Development → 👁 Code Review / PR → 🚀 Production
|
|
21
21
|
-->
|
|
22
22
|
|
|
23
23
|
## Board Identifiers (GitHub Projects)
|
|
@@ -39,8 +39,8 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
39
39
|
| ✅ Approval | `{{ID_APPROVAL}}` |
|
|
40
40
|
| ⚙️ Development | `{{ID_DEVELOPMENT}}` |
|
|
41
41
|
| 🧪 Testing | `{{ID_TESTING}}` |
|
|
42
|
-
| 👁 Code Review | `{{
|
|
43
|
-
| 🔀
|
|
42
|
+
| 👁 Code Review / PR | `{{ID_CODE_REVIEW_PR}}` |
|
|
43
|
+
| 🔀 Merge | `{{ID_MERGE}}` |
|
|
44
44
|
| 🚀 Production | `{{ID_PRODUCTION}}` |
|
|
45
45
|
|
|
46
46
|
## Agent × Phase Mapping
|
|
@@ -49,7 +49,7 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
49
49
|
|---|---|
|
|
50
50
|
| 💡 → 📐 (upstream) | Claude (or ideation agent) in conversational session |
|
|
51
51
|
| ⚙️ → 🔀 (downstream) | {{IMPLEMENTATION_AGENT}} (e.g. Jules `@google-labs-jules`) |
|
|
52
|
-
| 👁 Code Review | Human (you) |
|
|
52
|
+
| 👁 Code Review / PR | Human (you) |
|
|
53
53
|
| Automatic transitions | GitHub Actions |
|
|
54
54
|
|
|
55
55
|
## Issue Title Conventions
|
|
@@ -67,6 +67,10 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
67
67
|
|
|
68
68
|
| Label | Entity | Color | Meaning |
|
|
69
69
|
|---|---|---|---|
|
|
70
|
+
| `stage:exploration` | Issue | Purple | Issue is being evaluated |
|
|
71
|
+
| `stage:brainstorming` | Issue | Pink | Proposed approaches awaiting PM gate |
|
|
72
|
+
| `stage:detailing` | Issue | Blue | Technical spec is being written |
|
|
73
|
+
| `stage:development` | Issue | Orange | Agent is implementing the spec |
|
|
70
74
|
| `spec:approved` | Issue | Green | Gate 2 — agent is cleared to implement |
|
|
71
75
|
| `pr:review` | PR | Yellow | Awaiting code review |
|
|
72
76
|
| `pr:approved` | PR | Green | Code review approved |
|