create-agentic-pdlc 2.4.0 → 3.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/.agentic-pdlc/hooks/pdlc-stage-gate.sh +37 -10
- package/.claude/settings.json +18 -0
- package/.coderabbit.yaml +35 -0
- package/.github/workflows/project-automation.yml +13 -67
- package/CLAUDE.md +1 -1
- package/README.md +33 -32
- package/adapters/claude-code/skill.md +7 -3
- package/bin/cli.js +549 -209
- package/docs/superpowers/plans/2026-06-04-spec-format-issue-template.md +160 -0
- package/docs/superpowers/plans/2026-06-04-two-tier-installer.md +1056 -0
- package/docs/superpowers/specs/2026-06-04-spec-format-issue-template-design.md +46 -0
- package/package.json +2 -2
- package/templates/full/CLAUDE.md +30 -0
- package/templates/lite/AGENTS.md +121 -0
- package/templates/lite/CLAUDE.md +44 -0
- package/tests/cli.test.js +32 -0
- package/.github/workflows/agentic-metrics.yml +0 -545
- package/.github/workflows/qa-agent.yml +0 -139
- package/.github/workflows/qa-gate.yml +0 -51
- /package/templates/{AGENTS.md → full/AGENTS.md} +0 -0
- /package/templates/{docs → full/docs}/pdlc.md +0 -0
|
@@ -1,39 +1,66 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# PDLC Stage Gate — blocks gh pr create without
|
|
2
|
+
# PDLC Stage Gate — blocks gh pr create and file edits without spec:approved on linked issue.
|
|
3
3
|
# Bypass: branch prefix hotfix/ skips all checks.
|
|
4
4
|
|
|
5
5
|
INPUT=$(cat)
|
|
6
6
|
COMMAND=$(echo "$INPUT" | node -e "const d=JSON.parse(require('fs').readFileSync(0)); console.log(d.command || '')" 2>/dev/null || echo "")
|
|
7
|
+
FILE_PATH=$(echo "$INPUT" | node -e "const d=JSON.parse(require('fs').readFileSync(0)); console.log(d.file_path || '')" 2>/dev/null || echo "")
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
IS_PR_CREATE=false
|
|
10
|
+
IS_FILE_EDIT=false
|
|
11
|
+
|
|
12
|
+
if echo "$COMMAND" | grep -q "gh pr create"; then
|
|
13
|
+
IS_PR_CREATE=true
|
|
14
|
+
elif [ -n "$FILE_PATH" ]; then
|
|
15
|
+
IS_FILE_EDIT=true
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
if [ "$IS_PR_CREATE" != "true" ] && [ "$IS_FILE_EDIT" != "true" ]; then
|
|
9
19
|
exit 0
|
|
10
20
|
fi
|
|
11
21
|
|
|
12
22
|
BRANCH=$(git branch --show-current 2>/dev/null || echo "")
|
|
13
23
|
|
|
14
24
|
if echo "$BRANCH" | grep -qE "^hotfix/"; then
|
|
15
|
-
echo "✅ PDLC: Hotfix branch — stage gate bypassed."
|
|
16
25
|
exit 0
|
|
17
26
|
fi
|
|
18
27
|
|
|
19
28
|
ISSUE_NUM=$(echo "$BRANCH" | grep -oE '[0-9]+' | head -1)
|
|
20
29
|
|
|
21
30
|
if [ -z "$ISSUE_NUM" ]; then
|
|
31
|
+
if [ "$IS_FILE_EDIT" = "true" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
22
34
|
echo "❌ PDLC Stage Gate: Cannot determine issue from branch '$BRANCH'."
|
|
23
35
|
echo " Use: feat/<issue-number>-<description> or hotfix/<issue-number>-<description>"
|
|
24
36
|
exit 1
|
|
25
37
|
fi
|
|
26
38
|
|
|
27
|
-
LABELS=$(gh issue view "$ISSUE_NUM" --json labels --jq '[.labels[].name] | join(" ")' 2>/dev/null
|
|
39
|
+
LABELS=$(gh issue view "$ISSUE_NUM" --json labels --jq '[.labels[].name] | join(" ")' 2>/dev/null)
|
|
40
|
+
if [ $? -ne 0 ] || [ -z "$LABELS" ]; then
|
|
41
|
+
echo "❌ PDLC Stage Gate: Could not fetch labels for issue #$ISSUE_NUM."
|
|
42
|
+
echo " Missing condition: spec:approved"
|
|
43
|
+
echo " Next step: verify gh auth and issue number, then have PM add spec:approved."
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
28
46
|
|
|
29
|
-
if echo "$LABELS" | grep -qw "
|
|
30
|
-
echo "✅ PDLC: Issue #$ISSUE_NUM approved — gate passed."
|
|
47
|
+
if echo "$LABELS" | grep -qw "spec:approved"; then
|
|
31
48
|
exit 0
|
|
32
49
|
fi
|
|
33
50
|
|
|
34
51
|
STAGE=$(echo "$LABELS" | tr ' ' '\n' | grep "^stage:" | head -1 || echo "none")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
echo "
|
|
38
|
-
echo "
|
|
52
|
+
|
|
53
|
+
if [ "$IS_PR_CREATE" = "true" ]; then
|
|
54
|
+
echo "❌ PDLC Stage Gate: PR creation blocked — issue #$ISSUE_NUM missing spec:approved."
|
|
55
|
+
echo " Current stage: $STAGE"
|
|
56
|
+
echo " Missing condition: spec:approved (set by PM after reviewing spec in issue body)"
|
|
57
|
+
echo " Next step: complete spec → stage:approval → wait for PM to add spec:approved."
|
|
58
|
+
echo " Emergency bypass: rename branch to hotfix/<issue-number>-<description>."
|
|
59
|
+
else
|
|
60
|
+
echo "❌ PDLC Stage Gate: File edit blocked — issue #$ISSUE_NUM missing spec:approved."
|
|
61
|
+
echo " Current stage: $STAGE"
|
|
62
|
+
echo " Missing condition: spec:approved (set by PM after reviewing spec in issue body)"
|
|
63
|
+
echo " Next step: complete spec → stage:approval → wait for PM to add spec:approved."
|
|
64
|
+
echo " Emergency bypass: rename branch to hotfix/<issue-number>-<description>."
|
|
65
|
+
fi
|
|
39
66
|
exit 1
|
package/.claude/settings.json
CHANGED
|
@@ -9,6 +9,24 @@
|
|
|
9
9
|
"command": "bash .agentic-pdlc/hooks/pdlc-stage-gate.sh"
|
|
10
10
|
}
|
|
11
11
|
]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"matcher": "Edit",
|
|
15
|
+
"hooks": [
|
|
16
|
+
{
|
|
17
|
+
"type": "command",
|
|
18
|
+
"command": "bash .agentic-pdlc/hooks/pdlc-stage-gate.sh"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"matcher": "Write",
|
|
24
|
+
"hooks": [
|
|
25
|
+
{
|
|
26
|
+
"type": "command",
|
|
27
|
+
"command": "bash .agentic-pdlc/hooks/pdlc-stage-gate.sh"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
12
30
|
}
|
|
13
31
|
]
|
|
14
32
|
}
|
package/.coderabbit.yaml
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
language: "en-US"
|
|
2
|
+
reviews:
|
|
3
|
+
profile: "chill"
|
|
4
|
+
request_changes_workflow: false
|
|
5
|
+
high_level_summary: true
|
|
6
|
+
poem: false
|
|
7
|
+
auto_review:
|
|
8
|
+
enabled: true
|
|
9
|
+
drafts: false
|
|
10
|
+
base_branches:
|
|
11
|
+
- main
|
|
12
|
+
path_instructions:
|
|
13
|
+
- path: ".github/workflows/**"
|
|
14
|
+
instructions: >
|
|
15
|
+
Pay close attention to GitHub Actions syntax correctness, trigger
|
|
16
|
+
semantics (push/pull_request/workflow_run events and their filters),
|
|
17
|
+
expression syntax (${{ }}), and shell quoting in run steps.
|
|
18
|
+
Flag any logic that could cause silent failures or unintended trigger
|
|
19
|
+
behavior.
|
|
20
|
+
review_status: true
|
|
21
|
+
auto_apply_labels: true
|
|
22
|
+
labeling_instructions:
|
|
23
|
+
- label: "architecture-violation"
|
|
24
|
+
instructions: >
|
|
25
|
+
Apply when the PR introduces runtime behavior that violates documented
|
|
26
|
+
architectural invariants: code that bypasses the PDLC stage gate at runtime,
|
|
27
|
+
application code that programmatically sets or removes labels reserved for
|
|
28
|
+
automation (stage:*, spec:approved, qa:*) outside of their designated
|
|
29
|
+
automation workflows, business logic added directly to templates instead of
|
|
30
|
+
the CLI, or behavior that directly contradicts invariants in AGENTS.md or
|
|
31
|
+
CLAUDE.md. Do NOT apply for configuration changes to tools (e.g., updating
|
|
32
|
+
.coderabbit.yaml, GitHub Actions workflows, or CI config files) — those are
|
|
33
|
+
infrastructure, not invariant violations.
|
|
34
|
+
chat:
|
|
35
|
+
auto_reply: true
|
|
@@ -80,42 +80,6 @@ jobs:
|
|
|
80
80
|
await moveItem(node_id, targetStatusId);
|
|
81
81
|
console.log(`Issue #${number} moved to ${stageName}`);
|
|
82
82
|
|
|
83
|
-
# human-approved on issue → qa:approved on linked open PRs
|
|
84
|
-
handle-human-approved:
|
|
85
|
-
name: human-approved → qa:approved on linked PRs
|
|
86
|
-
if: github.event_name == 'issues' && github.event.action == 'labeled' && github.event.label.name == 'human-approved'
|
|
87
|
-
runs-on: ubuntu-latest
|
|
88
|
-
permissions:
|
|
89
|
-
issues: write
|
|
90
|
-
pull-requests: write
|
|
91
|
-
steps:
|
|
92
|
-
- name: Add qa:approved to linked open PRs
|
|
93
|
-
uses: actions/github-script@v8
|
|
94
|
-
with:
|
|
95
|
-
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
96
|
-
script: |
|
|
97
|
-
const { owner, repo } = context.repo;
|
|
98
|
-
const issueNumber = context.payload.issue.number;
|
|
99
|
-
const pattern = new RegExp(`(?:Closes?|Fixes?|Resolves?)\\s+#${issueNumber}\\b`, 'i');
|
|
100
|
-
|
|
101
|
-
const prs = await github.paginate(github.rest.pulls.list, {
|
|
102
|
-
owner, repo, state: 'open', per_page: 100
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
const linked = prs.filter(pr => pattern.test(pr.body ?? ''));
|
|
106
|
-
|
|
107
|
-
if (linked.length === 0) {
|
|
108
|
-
console.log(`No open PRs linking issue #${issueNumber}. Exiting.`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
for (const pr of linked) {
|
|
113
|
-
await github.rest.issues.addLabels({
|
|
114
|
-
owner, repo, issue_number: pr.number, labels: ['qa:approved']
|
|
115
|
-
}).catch(() => {});
|
|
116
|
-
console.log(`PR #${pr.number} → qa:approved`);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
83
|
# OPTIONAL: Uncomment to enable architecture-violation → Idea
|
|
120
84
|
# move-violation-to-board:
|
|
121
85
|
# name: architecture-violation → 💡 Idea
|
|
@@ -144,15 +108,15 @@ jobs:
|
|
|
144
108
|
# });
|
|
145
109
|
# console.log(`Issue #${number} moved to Idea`);
|
|
146
110
|
|
|
147
|
-
# PR Opened → Move linked issue to
|
|
111
|
+
# PR Opened → Move linked issue to Code Review / PR
|
|
148
112
|
move-card-on-pr-open:
|
|
149
|
-
name: Open PR →
|
|
113
|
+
name: Open PR → Code Review / PR
|
|
150
114
|
if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'reopened')
|
|
151
115
|
runs-on: ubuntu-latest
|
|
152
116
|
env:
|
|
153
117
|
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
154
118
|
steps:
|
|
155
|
-
- name: Move linked issue to
|
|
119
|
+
- name: Move linked issue to Code Review / PR
|
|
156
120
|
if: ${{ env.PROJECT_TOKEN != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
157
121
|
uses: actions/github-script@v8
|
|
158
122
|
with:
|
|
@@ -164,7 +128,6 @@ jobs:
|
|
|
164
128
|
const { data: pr } = await github.rest.pulls.get({ owner, repo, pull_number: prNumber });
|
|
165
129
|
const body = pr.body ?? '';
|
|
166
130
|
|
|
167
|
-
// Extract issues linked via "Closes #N", "Fixes #N", "Resolves #N"
|
|
168
131
|
const linkedIssues = [...body.matchAll(/(?:Closes?|Fixes?|Resolves?)\s+#(\d+)/gi)]
|
|
169
132
|
.map(m => parseInt(m[1]));
|
|
170
133
|
|
|
@@ -181,11 +144,11 @@ jobs:
|
|
|
181
144
|
}
|
|
182
145
|
}`, {
|
|
183
146
|
p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
184
|
-
v: { singleSelectOptionId: process.env.
|
|
147
|
+
v: { singleSelectOptionId: process.env.STATUS_CODE_REVIEW_PR }
|
|
185
148
|
});
|
|
186
149
|
};
|
|
187
150
|
|
|
188
|
-
const stageLabelsToRemove = ['stage:development', 'stage:brainstorming', 'stage:detailing', 'jules'];
|
|
151
|
+
const stageLabelsToRemove = ['stage:development', 'stage:brainstorming', 'stage:detailing', 'stage:testing', 'jules'];
|
|
189
152
|
|
|
190
153
|
if (linkedIssues.length > 0) {
|
|
191
154
|
for (const n of linkedIssues) {
|
|
@@ -194,25 +157,24 @@ jobs:
|
|
|
194
157
|
for (const label of stageLabelsToRemove) {
|
|
195
158
|
await github.rest.issues.removeLabel({ owner, repo, issue_number: n, name: label }).catch(() => {});
|
|
196
159
|
}
|
|
197
|
-
|
|
198
|
-
console.log(`Issue #${n} → Testing (labels updated)`);
|
|
160
|
+
console.log(`Issue #${n} → Code Review / PR`);
|
|
199
161
|
}
|
|
200
162
|
} else {
|
|
201
163
|
await moveItem(pr.node_id);
|
|
202
|
-
console.log(`PR #${prNumber} →
|
|
164
|
+
console.log(`PR #${prNumber} → Code Review / PR (no linked issue)`);
|
|
203
165
|
}
|
|
204
166
|
|
|
205
167
|
await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: ['pr:in-review'] }).catch(() => {});
|
|
206
168
|
|
|
207
|
-
#
|
|
208
|
-
move-card-on-
|
|
209
|
-
name:
|
|
210
|
-
if: github.event_name == '
|
|
169
|
+
# Review Approved → Move linked issue to Code Review / PR + swap PR labels
|
|
170
|
+
move-card-on-review-approved:
|
|
171
|
+
name: Approved PR → Code Review / PR
|
|
172
|
+
if: github.event_name == 'pull_request_review' && github.event.review.state == 'approved'
|
|
211
173
|
runs-on: ubuntu-latest
|
|
212
174
|
env:
|
|
213
175
|
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
214
176
|
steps:
|
|
215
|
-
- name: Move linked issue to Code Review
|
|
177
|
+
- name: Move linked issue to Code Review and swap PR labels
|
|
216
178
|
if: ${{ env.PROJECT_TOKEN != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
217
179
|
uses: actions/github-script@v8
|
|
218
180
|
with:
|
|
@@ -258,22 +220,6 @@ jobs:
|
|
|
258
220
|
console.log(`PR #${prNumber} → Code Review / PR (no linked issue)`);
|
|
259
221
|
}
|
|
260
222
|
|
|
261
|
-
# Review Approved → Add Label
|
|
262
|
-
move-card-on-review-approved:
|
|
263
|
-
name: Approved PR → Add Label
|
|
264
|
-
if: github.event_name == 'pull_request_review' && github.event.review.state == 'approved'
|
|
265
|
-
runs-on: ubuntu-latest
|
|
266
|
-
env:
|
|
267
|
-
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
268
|
-
steps:
|
|
269
|
-
- name: Swap PR labels
|
|
270
|
-
if: ${{ env.PROJECT_TOKEN != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
271
|
-
uses: actions/github-script@v8
|
|
272
|
-
with:
|
|
273
|
-
github-token: ${{ env.PROJECT_TOKEN }}
|
|
274
|
-
script: |
|
|
275
|
-
const prNumber = context.payload.pull_request.number;
|
|
276
|
-
const { owner, repo } = context.repo;
|
|
277
223
|
try { await github.rest.issues.removeLabel({ owner, repo, issue_number: prNumber, name: 'pr:in-review' }); } catch {}
|
|
278
224
|
await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: ['pr:approved'] }).catch(() => {});
|
|
279
225
|
|
|
@@ -339,7 +285,7 @@ jobs:
|
|
|
339
285
|
const toRemove = [
|
|
340
286
|
'stage:brainstorming', 'stage:detailing',
|
|
341
287
|
'stage:approval', 'stage:development', 'stage:testing',
|
|
342
|
-
'
|
|
288
|
+
'pr:in-review', 'jules'
|
|
343
289
|
];
|
|
344
290
|
for (const label of toRemove) {
|
|
345
291
|
await github.rest.issues.removeLabel({ owner, repo, issue_number, name: label }).catch(() => {});
|
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agentic-pdlc
|
|
2
2
|
|
|
3
|
-
**What it is:** npm CLI (`npx create-agentic-pdlc`) that installs a PDLC workflow for AI agent projects.
|
|
3
|
+
**What it is:** npm CLI (`npx create-agentic-pdlc`) that installs a PDLC workflow for AI agent projects.
|
|
4
4
|
|
|
5
5
|
**Workflow:** `stage:brainstorming` → `stage:detailing` → `spec:approved` → `stage:development` → PR → merge. Labels move the board automatically.
|
|
6
6
|
|
package/README.md
CHANGED
|
@@ -1,57 +1,54 @@
|
|
|
1
|
-
# 🤖 Agentic PDLC
|
|
1
|
+
# 🤖 Agentic PDLC
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
5
|
-
>
|
|
3
|
+
> Does your AI agent add code you didn't ask for?
|
|
4
|
+
> Does it skip the spec and jump straight to a PR?
|
|
5
|
+
> Does it ignore the rules in your CLAUDE.md?
|
|
6
6
|
|
|
7
|
-
**Agentic PDLC** gives your
|
|
7
|
+
**Agentic PDLC** gives your agent a brake it can't ignore — a hook that makes it write the spec first, keep changes small, and stop at each gate. One `npx` to install.
|
|
8
8
|
|
|
9
9
|
<div align="center">
|
|
10
|
-
<img src=".github/assets/agentic-pdlc-flow.svg" alt="Agentic PDLC
|
|
10
|
+
<img src=".github/assets/agentic-pdlc-flow.svg" alt="Agentic PDLC: Upstream idea-to-spec, gated by spec:approved, into Downstream spec-to-production" width="100%">
|
|
11
11
|
</div>
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Two modes — pick yours
|
|
16
|
+
|
|
17
|
+
**`lite` (default) — the brake**
|
|
18
|
+
Your agent writes the spec, waits for your approval, then implements it. It won't add code you didn't ask for. It won't open a PR before the spec is approved. It won't skip your `CLAUDE.md` rules — because the gate is a hook, not text the agent can ignore. Value on your first PR.
|
|
19
|
+
|
|
20
|
+
**`--agentic` — see your whole pipeline**
|
|
21
|
+
Everything in `lite`, plus a self-moving kanban board that shows your full product lifecycle, from **Idea → Production**. It makes transparent what needs your attention/approval, what's been done by the agent, and what's ready to merge. It supports as many agents as you need.
|
|
14
22
|
|
|
15
23
|
---
|
|
16
24
|
|
|
17
25
|
## ⚡ Why it works
|
|
18
26
|
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
- 🛡️ **Code that can't silently break production** — A CI auditor checks every PR for architecture violations before anything reaches your main branch. *(Maturity Model — coming soon)*
|
|
27
|
+
- 🛑 **A brake the agent can't ignore** — the gate is a hook, not text in CLAUDE.md. Text gets ignored; a hook does not.
|
|
28
|
+
- 📋 **Spec before code** — the agent can't open a PR until the spec is approved, with acceptance criteria, edge cases, and files to change.
|
|
29
|
+
- 🗺️ **See your whole pipeline** *(`--agentic` only)* — a board tracks every task from idea to production, and the gate between spec and code stays yours. You approve before anything ships.
|
|
23
30
|
|
|
24
31
|
---
|
|
25
32
|
|
|
26
33
|
## 🚀 Quick Start
|
|
27
34
|
|
|
28
|
-
Run this in the root of your project:
|
|
29
|
-
|
|
30
35
|
```bash
|
|
31
36
|
npx create-agentic-pdlc
|
|
32
37
|
```
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
Installs `lite` by default — your AGENTS.md, CLAUDE.md, and the gate hook. Your AI assistant finishes the setup with you; no YAML to edit.
|
|
35
40
|
|
|
36
|
-
**
|
|
41
|
+
**Want the full board and pipeline view?**
|
|
37
42
|
|
|
38
43
|
```bash
|
|
39
|
-
npx create-agentic-pdlc --
|
|
44
|
+
npx create-agentic-pdlc --agentic
|
|
40
45
|
```
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## 🏗️ How It Works
|
|
47
|
-
|
|
48
|
-
The framework splits work into two phases:
|
|
49
|
-
|
|
50
|
-
### 1. You + AI: Idea → Spec
|
|
51
|
-
Use conversational AI (e.g., **Claude Code**, **Gemini CLI**) as your brainstorming partner. Together, you flesh out user stories, acceptance criteria, and technical specifications until they are solid.
|
|
47
|
+
**Already set up? Add or change things any time:**
|
|
52
48
|
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
```bash
|
|
50
|
+
npx create-agentic-pdlc --update
|
|
51
|
+
```
|
|
55
52
|
|
|
56
53
|
---
|
|
57
54
|
|
|
@@ -71,11 +68,15 @@ One shared brief (`AGENTS.md`). Every agent reads it.
|
|
|
71
68
|
|
|
72
69
|
## 📦 What you get
|
|
73
70
|
|
|
74
|
-
|
|
71
|
+
**`lite` (default)**
|
|
72
|
+
- **`AGENTS.md`** — the shared brief every agent reads; your rules, once
|
|
73
|
+
- **`CLAUDE.md`** — keep-changes-small rule + the stage gates
|
|
74
|
+
- **`.agentic-pdlc/hooks/pdlc-stage-gate.sh`** — the hook; the agent can't open a PR until the spec is approved
|
|
75
75
|
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
-
|
|
76
|
+
**`--agentic` (opt-in)**
|
|
77
|
+
Everything in lite, plus:
|
|
78
|
+
- **`docs/pdlc.md`** — your pipeline map: board columns and who does what
|
|
79
|
+
- **`.github/workflows/`** — board automation: moves cards on spec approval, PR open, and CI pass
|
|
79
80
|
|
|
80
81
|
---
|
|
81
82
|
|
|
@@ -22,12 +22,14 @@ Specifically, check for:
|
|
|
22
22
|
|
|
23
23
|
If any of these files are missing, you are in **Setup Mode**. Do not proceed with feature requests until setup is complete.
|
|
24
24
|
|
|
25
|
+
**Lite profile note:** If `cli-context.json` contains `"profile": "lite"`, the only mandatory artifacts are `AGENTS.md` and `CLAUDE.md` — `docs/pdlc.md` and the workflow files are not installed in the lite profile. Skip checks for those files.
|
|
26
|
+
|
|
25
27
|
1. **Language Detection:** Analyze the user's previous prompts and preferred language. Conduct this entire Setup Mode and ask all your interactive questions in that same language.
|
|
26
28
|
2. Acknowledge that the framework is not yet set up.
|
|
27
29
|
3. **Pre-filled Context:** Before asking any questions, read the following files if they exist:
|
|
28
|
-
- `.agentic-pdlc/cli-context.json` — written by the CLI. Contains `projectName`, `repoOwner`, `repoName`, `projectNumber`, `isOrg`, `boardUrl`,
|
|
29
|
-
- `.agentic-pdlc/templates/docs/pdlc.md` — the CLI pre-fills PROJECT_ID, STATUS_FIELD_ID, REPO_OWNER, REPO_NAME, and all 9 column option IDs
|
|
30
|
-
- `.agentic-pdlc/templates/.github/workflows/project-automation.yml` — the CLI also pre-fills all ID placeholders here
|
|
30
|
+
- `.agentic-pdlc/cli-context.json` — written by the CLI. Contains `projectName`, `repoOwner`, `repoName`, `projectNumber`, `isOrg`, `boardUrl`, `patAutoSet` (boolean), and `profile` (`"lite"` or `"full"`). Use these values directly and skip the corresponding questions. Honor `patAutoSet` in Step 7 and `boardUrl` in Step 10.
|
|
31
|
+
- `.agentic-pdlc/templates/docs/pdlc.md` — **only present in the `full` profile.** If absent (lite install), skip the Board IDs question group entirely and skip all steps that reference this file. If present, the CLI pre-fills PROJECT_ID, STATUS_FIELD_ID, REPO_OWNER, REPO_NAME, and all 9 column option IDs; if none still contain `{{...}}` placeholders, skip the Board IDs question group.
|
|
32
|
+
- `.agentic-pdlc/templates/.github/workflows/project-automation.yml` — **only present in the `full` profile.** If absent, skip. If present, the CLI also pre-fills all ID placeholders here; remaining `{{...}}` placeholders are non-ID ones (project name, commands, etc.).
|
|
31
33
|
4. Interactively ask the user only for the **missing values**, **one group at a time**:
|
|
32
34
|
- **Project basics:** Project Name (skip if present in `cli-context.json`), Description, Technical Stack/Structure. **Do not ask for GitHub Username** — use `repoOwner` from `cli-context.json` directly for CODEOWNERS.
|
|
33
35
|
- **Commands:** In the user's detected language, ask for each command with its purpose and concrete examples:
|
|
@@ -53,6 +55,8 @@ If any of these files are missing, you are in **Setup Mode**. Do not proceed wit
|
|
|
53
55
|
- Jules (`@google-labs-jules`): use `jules` — this is the native label the Jules GitHub App watches. **Do NOT use `agent:jules`** — Jules does not watch that label and the trigger will silently fail.
|
|
54
56
|
- Other agents: use the handle without `@`, lowercase (e.g. `@my-agent` → `my-agent`).
|
|
55
57
|
5. Generate and write the missing files replacing the `{{SCREAMING_SNAKE_CASE}}` placeholders using the templates in `.agentic-pdlc/templates/`.
|
|
58
|
+
- **CLAUDE.md:** If `.agentic-pdlc/templates/CLAUDE.md` exists and `CLAUDE.md` does not yet exist at the project root, write it — replacing only `{{PROJECT_NAME}}` with the project name. Skip if CLAUDE.md already exists (never downgrade).
|
|
59
|
+
- **Lite profile:** If `cli-context.json` has `"profile": "lite"`, skip steps that reference `docs/pdlc.md`, `project-automation.yml`, `agent-trigger.yml`, and `pdlc-health-check.yml` — these are not installed in lite.
|
|
56
60
|
6. Offer to run the `gh` commands for labels (`spec:approved`, `pr:in-review`, `pr:approved`, `architecture-violation`).
|
|
57
61
|
7. **`PROJECT_PAT` secret (required for board automation):**
|
|
58
62
|
|