create-agentic-pdlc 2.0.4 โ 2.0.6
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/templates/docs/pdlc.md +105 -0
- package/bin/cli.js +48 -39
- package/docs/pdlc.md +8 -8
- package/package.json +1 -1
- package/scripts/reset-test-project.sh +45 -0
- package/templates/docs/pdlc.md +3 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# PDLC โ {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
## Board Columns
|
|
4
|
+
|
|
5
|
+
| Column | Meaning | Who moves the card |
|
|
6
|
+
|---|---|---|
|
|
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
|
+
| ๐งช Testing | CI pipeline or AI QA Agent running (Variant B) | GitHub Actions / QA Agent |
|
|
14
|
+
| ๐ Code Review / PR | PR opened (Variant A) or QA passed (Variant B) | GitHub Actions |
|
|
15
|
+
| ๐ Ready for Production | Merged | GitHub Actions |
|
|
16
|
+
|
|
17
|
+
<!--
|
|
18
|
+
Adapt columns as needed. The functional baseline is:
|
|
19
|
+
๐ก Idea โ โ๏ธ Development โ ๐ Code Review / PR โ ๐ Ready for Production
|
|
20
|
+
-->
|
|
21
|
+
|
|
22
|
+
## Workflow Variants (QA Agent)
|
|
23
|
+
|
|
24
|
+
- **Variant A (Default):** PRs bypass the `Testing` column and land directly in `Code Review / PR`.
|
|
25
|
+
- **Variant B (QA Agent Enabled):** PRs land in the `Testing` column first. An AI QA agent verifies the PR, adding `qa:pass` or `qa:fail`. Only after a `qa:pass` is the issue moved to `Code Review / PR`.
|
|
26
|
+
|
|
27
|
+
## Board Identifiers (GitHub Projects)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
PROJECT_ID = {{PROJECT_ID}}
|
|
31
|
+
STATUS_FIELD = {{STATUS_FIELD_ID}}
|
|
32
|
+
REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Column Option IDs
|
|
36
|
+
|
|
37
|
+
| Column | Option ID |
|
|
38
|
+
|---|---|
|
|
39
|
+
| ๐ก Idea | `{{ID_IDEA}}` |
|
|
40
|
+
| ๐ Exploration | `{{ID_EXPLORATION}}` |
|
|
41
|
+
| ๐ง Brainstorming | `{{ID_BRAINSTORMING}}` |
|
|
42
|
+
| ๐ Detail Solution | `{{ID_DETAIL}}` |
|
|
43
|
+
| โ
Approval | `{{ID_APPROVAL}}` |
|
|
44
|
+
| โ๏ธ Development | `{{ID_DEVELOPMENT}}` |
|
|
45
|
+
| ๐งช Testing | `{{ID_TESTING}}` |
|
|
46
|
+
| ๐ Code Review / PR | `{{ID_CODE_REVIEW_PR}}` |
|
|
47
|
+
| ๐ Ready for Production | `{{ID_READY_FOR_PRODUCTION}}` |
|
|
48
|
+
|
|
49
|
+
## Agent ร Phase Mapping
|
|
50
|
+
|
|
51
|
+
| Phase | Responsible |
|
|
52
|
+
|---|---|
|
|
53
|
+
| ๐ก โ ๐ (upstream) | Claude (or ideation agent) in conversational session |
|
|
54
|
+
| โ๏ธ โ ๐ (downstream) | {{IMPLEMENTATION_AGENT}} (e.g. Jules `@google-labs-jules`) |
|
|
55
|
+
| ๐ Code Review / PR | Human (you) |
|
|
56
|
+
| Automatic transitions | GitHub Actions |
|
|
57
|
+
|
|
58
|
+
## Issue Title Conventions
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
[icon] [PREFIX]: [short description, imperative tense]
|
|
62
|
+
|
|
63
|
+
๐ค US: user story
|
|
64
|
+
๐ BUG: bug
|
|
65
|
+
๐ง TASK: operational task
|
|
66
|
+
๐ฌ SPIKE: exploration/evaluation spike
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Labels
|
|
70
|
+
|
|
71
|
+
| Label | Entity | Color | Meaning |
|
|
72
|
+
|---|---|---|---|
|
|
73
|
+
| `stage:exploration` | Issue | Purple | Issue is being evaluated |
|
|
74
|
+
| `stage:brainstorming` | Issue | Pink | Proposed approaches awaiting PM gate |
|
|
75
|
+
| `stage:detailing` | Issue | Blue | Technical spec is being written |
|
|
76
|
+
| `stage:development` | Issue | Orange | Agent is implementing the spec |
|
|
77
|
+
| `spec:approved` | Issue | Green | Gate 2 โ agent is cleared to implement |
|
|
78
|
+
| `pr:in-review` | PR | Yellow | Awaiting code review |
|
|
79
|
+
| `pr:approved` | PR | Green | Code review approved |
|
|
80
|
+
|
|
81
|
+
## Approval Gates
|
|
82
|
+
|
|
83
|
+
**Gate 1 โ PM/Ideation (Brainstorming):**
|
|
84
|
+
You comment on the issue approving one of the approaches proposed by the ideation agent.
|
|
85
|
+
Format: *"Approved โ proceed with option X."*
|
|
86
|
+
|
|
87
|
+
**Gate 2 โ Tech Lead (Spec):**
|
|
88
|
+
You add the `spec:approved` label to the issue after reviewing the technical spec in the body.
|
|
89
|
+
This triggers the implementation agent via `agent-trigger.yml`.
|
|
90
|
+
|
|
91
|
+
## Shortcuts by Type
|
|
92
|
+
|
|
93
|
+
- **BUG** โ Skips Brainstorming; enters Detail Solution with diagnostics + fix.
|
|
94
|
+
- **TASK** โ Skips Brainstorming; enters Detail Solution with operational steps.
|
|
95
|
+
- **SPIKE** โ Never reaches Development; delivery is a concluding comment.
|
|
96
|
+
- **US** โ Full flow observing both gates.
|
|
97
|
+
|
|
98
|
+
## Definition of Done
|
|
99
|
+
|
|
100
|
+
An issue is truly done when:
|
|
101
|
+
- [ ] All Acceptance Criteria described in the body are implemented
|
|
102
|
+
- [ ] Tests passing: `{{TEST_COMMAND}}`
|
|
103
|
+
- [ ] No invariant violations (CI green)
|
|
104
|
+
- [ ] Associated PR explicitly contains `Closes #N`
|
|
105
|
+
- [ ] Basic manual smoke test executed after deploy (when applicable)
|
package/bin/cli.js
CHANGED
|
@@ -51,6 +51,8 @@ const i18n = {
|
|
|
51
51
|
creating_project: t('[2/2] Creating Project V2 Board...', '[2/2] Criando Project V2 Board...', '[2/2] Creando Project V2 Board...'),
|
|
52
52
|
project_ok: t('โ
Project created (ID: ', 'โ
Projeto criado (ID: ', 'โ
Proyecto creado (ID: '),
|
|
53
53
|
project_err: t('โ Failed to create project. Error: ', 'โ Falha ao criar o projeto. Erro: ', 'โ Fallo al crear el proyecto. Error: '),
|
|
54
|
+
link_project_ok: t('โ
Project linked to repository.', 'โ
Projeto vinculado ao repositรณrio.', 'โ
Proyecto vinculado al repositorio.'),
|
|
55
|
+
link_project_warn: t('โ ๏ธ Failed to link project to repository. Link it manually in GitHub Projects settings.', 'โ ๏ธ Falha ao vincular projeto ao repositรณrio. Faรงa isso manualmente nas configuraรงรตes do GitHub Projects.', 'โ ๏ธ Fallo al vincular el proyecto al repositorio. Hazlo manualmente en la configuraciรณn de GitHub Projects.'),
|
|
54
56
|
config_columns: t('Configuring Project Columns...', 'Configurando colunas do Projeto...', 'Configurando columnas del Proyecto...'),
|
|
55
57
|
columns_ok: t('โ
Project columns configured successfully.', 'โ
Colunas do projeto configuradas com sucesso.', 'โ
Columnas del proyecto configuradas con รฉxito.'),
|
|
56
58
|
columns_warn: t('โ ๏ธ Failed to configure project columns. You may need to add them manually.', 'โ ๏ธ Falha ao configurar colunas. Vocรช pode precisar adicionรก-las manualmente.', 'โ ๏ธ Fallo al configurar columnas. Es posible que debas agregarlas manualmente.'),
|
|
@@ -70,7 +72,9 @@ const i18n = {
|
|
|
70
72
|
cursor_step_1: t('\t1. Open Cursor', '\t1. Abra o Cursor', '\t1. Abre Cursor'),
|
|
71
73
|
cursor_step_2: t('\t2. Open Composer (Cmd+I or Cmd+L) and type: "@.agentic-pdlc/SETUP_PROMPT.md execute Setup Mode"\n', '\t2. Abra o Composer (Cmd+I ou Cmd+L) e digite: "@.agentic-pdlc/SETUP_PROMPT.md execute Setup Mode"\n', '\t2. Abre Composer (Cmd+I o Cmd+L) y escribe: "@.agentic-pdlc/SETUP_PROMPT.md execute Setup Mode"\n'),
|
|
72
74
|
generic_written: t('โ
Agent generic setup instructions written to .agentic-setup.md', 'โ
Instruรงรตes genรฉricas salvas em .agentic-setup.md', 'โ
Instrucciones genรฉricas guardadas en .agentic-setup.md'),
|
|
73
|
-
generic_done: t('Tell your AI agent to read and execute the .agentic-setup.md file!\n', 'Diga ao seu agente para ler e executar o arquivo .agentic-setup.md!\n', 'ยกDile a tu agente de IA que lea y ejecute el archivo .agentic-setup.md!\n')
|
|
75
|
+
generic_done: t('Tell your AI agent to read and execute the .agentic-setup.md file!\n', 'Diga ao seu agente para ler e executar o arquivo .agentic-setup.md!\n', 'ยกDile a tu agente de IA que lea y ejecute el archivo .agentic-setup.md!\n'),
|
|
76
|
+
setup_done: t('๐ All set! Continue the setup with your agent:', '๐ Aqui tรก pronto! Continue o setup com o seu agente:', '๐ ยกListo! Continรบa el setup con tu agente:'),
|
|
77
|
+
setup_done_hint: t('>>> Tell it to read and execute the .agentic-setup.md file!', '>>> Diga a ele para ler e executar o arquivo .agentic-setup.md!', '>>> Dile que lea y ejecute el archivo .agentic-setup.md!')
|
|
74
78
|
};
|
|
75
79
|
|
|
76
80
|
const cyan = '\x1b[36m';
|
|
@@ -99,6 +103,16 @@ function copyDirSync(src, dest) {
|
|
|
99
103
|
}
|
|
100
104
|
}
|
|
101
105
|
|
|
106
|
+
function printSetupDone() {
|
|
107
|
+
const line1 = i18n.setup_done;
|
|
108
|
+
const line2 = i18n.setup_done_hint;
|
|
109
|
+
const sep = '='.repeat(Math.max(line1.length, line2.length));
|
|
110
|
+
console.log(`\n${green}${sep}${reset}`);
|
|
111
|
+
console.log(`${green}${line1}${reset}`);
|
|
112
|
+
console.log(`${cyan}${line2}${reset}`);
|
|
113
|
+
console.log(`${green}${sep}${reset}\n`);
|
|
114
|
+
}
|
|
115
|
+
|
|
102
116
|
async function runSetup() {
|
|
103
117
|
console.log(`${yellow}${i18n.checking_gh}${reset}`);
|
|
104
118
|
try {
|
|
@@ -138,7 +152,7 @@ async function runSetup() {
|
|
|
138
152
|
|
|
139
153
|
let isOrg = false;
|
|
140
154
|
try {
|
|
141
|
-
const ownerType = execFileSync('gh', ['api', `repos/${repo}`, '--jq', '.owner.type']).toString().trim();
|
|
155
|
+
const ownerType = execFileSync('gh', ['api', `repos/${repo}`, '--jq', '.owner.type'], { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
142
156
|
isOrg = ownerType === 'Organization';
|
|
143
157
|
} catch (err) {
|
|
144
158
|
const accountTypeAnswer = await askQuestion(i18n.ask_org);
|
|
@@ -147,7 +161,7 @@ async function runSetup() {
|
|
|
147
161
|
|
|
148
162
|
let branchName = 'main';
|
|
149
163
|
try {
|
|
150
|
-
branchName = execFileSync('gh', ['api', `repos/${repo}`, '--jq', '.default_branch']).toString().trim() || 'main';
|
|
164
|
+
branchName = execFileSync('gh', ['api', `repos/${repo}`, '--jq', '.default_branch'], { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim() || 'main';
|
|
151
165
|
} catch (err) {
|
|
152
166
|
const branchAnswer = await askQuestion(i18n.ask_branch);
|
|
153
167
|
if (branchAnswer.trim()) branchName = branchAnswer.trim();
|
|
@@ -197,6 +211,15 @@ async function runSetup() {
|
|
|
197
211
|
projectId = projectCreateOutput;
|
|
198
212
|
|
|
199
213
|
console.log(` ${i18n.project_ok}${projectId})`);
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
const repoNodeId = execFileSync('gh', ['api', `repos/${repo}`, '--jq', '.node_id'], { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
217
|
+
execFileSync('gh', ['api', 'graphql', '-f', `query=mutation($projectId: ID!, $repositoryId: ID!) { linkProjectV2ToRepository(input: {projectId: $projectId, repositoryId: $repositoryId}) { repository { name } } }`, '-f', `projectId=${projectId}`, '-f', `repositoryId=${repoNodeId}`], { stdio: 'ignore' });
|
|
218
|
+
console.log(` ${i18n.link_project_ok}`);
|
|
219
|
+
} catch (err) {
|
|
220
|
+
console.log(` ${i18n.link_project_warn}`);
|
|
221
|
+
}
|
|
222
|
+
|
|
200
223
|
} catch (err) {
|
|
201
224
|
console.log(` ${i18n.project_err}${err.message}`);
|
|
202
225
|
}
|
|
@@ -212,35 +235,33 @@ async function runSetup() {
|
|
|
212
235
|
|
|
213
236
|
if (statusFieldId) {
|
|
214
237
|
const columns = [
|
|
215
|
-
{ name: "๐ก Idea", description: "Backlog", color: "GRAY" },
|
|
216
|
-
{ name: "๐ Exploration", description: "
|
|
217
|
-
{ name: "๐ง Brainstorming", description: "
|
|
218
|
-
{ name: "๐ Detail Solution", description: "
|
|
219
|
-
{ name: "โ
Approval", description: "Spec ready", color: "GREEN" },
|
|
220
|
-
{ name: "โ๏ธ Development", description: "
|
|
221
|
-
{ name: "๐งช Testing", description: "QA testing", color: "RED" },
|
|
222
|
-
{ name: "๐ Code Review / PR", description: "PR opened", color: "YELLOW" },
|
|
223
|
-
{ name: "๐ Production", description: "Merged", color: "GREEN" }
|
|
238
|
+
{ name: "๐ก Idea", description: "Backlog โ every new issue lands here", color: "GRAY" },
|
|
239
|
+
{ name: "๐ Exploration", description: "AI is analyzing code and context", color: "PURPLE" },
|
|
240
|
+
{ name: "๐ง Brainstorming", description: "AI proposed approaches and trade-offs", color: "PINK" },
|
|
241
|
+
{ name: "๐ Detail Solution", description: "AI is writing the technical spec", color: "BLUE" },
|
|
242
|
+
{ name: "โ
Approval", description: "Spec ready, awaiting `spec:approved` label", color: "GREEN" },
|
|
243
|
+
{ name: "โ๏ธ Development", description: "AI implementing the spec", color: "ORANGE" },
|
|
244
|
+
{ name: "๐งช Testing", description: "QA testing and CI pipeline checks", color: "RED" },
|
|
245
|
+
{ name: "๐ Code Review / PR", description: "PR opened, awaiting your review", color: "YELLOW" },
|
|
246
|
+
{ name: "๐ Ready for Production", description: "Merged and ready for production", color: "GREEN" }
|
|
224
247
|
];
|
|
225
248
|
|
|
226
|
-
const updateFieldQuery = `mutation($
|
|
249
|
+
const updateFieldQuery = `mutation($fieldId: ID!, $options: [ProjectV2SingleSelectFieldOptionInput!]) {
|
|
227
250
|
updateProjectV2Field(input: {
|
|
228
|
-
projectId: $projectId,
|
|
229
251
|
fieldId: $fieldId,
|
|
230
252
|
singleSelectOptions: $options
|
|
231
|
-
}) {
|
|
232
|
-
projectV2Field {
|
|
253
|
+
}) {
|
|
254
|
+
projectV2Field {
|
|
233
255
|
... on ProjectV2SingleSelectField {
|
|
234
|
-
options { id name }
|
|
256
|
+
options { id name }
|
|
235
257
|
}
|
|
236
|
-
}
|
|
258
|
+
}
|
|
237
259
|
}
|
|
238
260
|
}`;
|
|
239
261
|
|
|
240
262
|
const queryPayload = JSON.stringify({
|
|
241
263
|
query: updateFieldQuery,
|
|
242
264
|
variables: {
|
|
243
|
-
projectId: projectId,
|
|
244
265
|
fieldId: statusFieldId,
|
|
245
266
|
options: columns
|
|
246
267
|
}
|
|
@@ -249,7 +270,7 @@ async function runSetup() {
|
|
|
249
270
|
const updateOutput = execFileSync('gh', ['api', 'graphql', '--input', '-'], { input: queryPayload }).toString().trim();
|
|
250
271
|
const jsonResponse = updateOutput ? JSON.parse(updateOutput) : null;
|
|
251
272
|
const returnedOptions = jsonResponse?.data?.updateProjectV2Field?.projectV2Field?.options || [];
|
|
252
|
-
|
|
273
|
+
|
|
253
274
|
for (const opt of returnedOptions) {
|
|
254
275
|
optionMap[opt.name] = opt.id;
|
|
255
276
|
}
|
|
@@ -266,7 +287,7 @@ async function runSetup() {
|
|
|
266
287
|
// We copy the templates folder so the agent has the real text logic to replace and rename
|
|
267
288
|
const sourceTemplates = path.join(sourceDir, 'templates');
|
|
268
289
|
const targetTemplates = path.join(targetDir, '.agentic-pdlc', 'templates');
|
|
269
|
-
|
|
290
|
+
|
|
270
291
|
if (fs.existsSync(sourceTemplates)) {
|
|
271
292
|
copyDirSync(sourceTemplates, targetTemplates);
|
|
272
293
|
console.log(`${i18n.templates_copied}`);
|
|
@@ -275,7 +296,7 @@ async function runSetup() {
|
|
|
275
296
|
const pdlcDest = path.join(targetTemplates, 'docs', 'pdlc.md');
|
|
276
297
|
if (fs.existsSync(pdlcDest)) {
|
|
277
298
|
let pdlcContent = fs.readFileSync(pdlcDest, 'utf8');
|
|
278
|
-
|
|
299
|
+
|
|
279
300
|
if (projectId) pdlcContent = pdlcContent.replace(/\\{\\{PROJECT_ID\\}\\}/g, () => projectId);
|
|
280
301
|
if (statusFieldId) pdlcContent = pdlcContent.replace(/\\{\\{STATUS_FIELD_ID\\}\\}/g, () => statusFieldId);
|
|
281
302
|
pdlcContent = pdlcContent.replace(/\\{\\{REPO_OWNER\\}\\}/g, () => repoOwner);
|
|
@@ -290,7 +311,7 @@ async function runSetup() {
|
|
|
290
311
|
pdlcContent = pdlcContent.replace(/\{\{ID_DEVELOPMENT\}\}/g, optionMap["โ๏ธ Development"] || 'MISSING_ID');
|
|
291
312
|
pdlcContent = pdlcContent.replace(/\{\{ID_TESTING\}\}/g, optionMap["๐งช Testing"] || 'MISSING_ID');
|
|
292
313
|
pdlcContent = pdlcContent.replace(/\{\{ID_CODE_REVIEW_PR\}\}/g, optionMap["๐ Code Review / PR"] || 'MISSING_ID');
|
|
293
|
-
pdlcContent = pdlcContent.replace(/\{\{
|
|
314
|
+
pdlcContent = pdlcContent.replace(/\{\{ID_READY_FOR_PRODUCTION\}\}/g, optionMap["๐ Ready for Production"] || 'MISSING_ID');
|
|
294
315
|
}
|
|
295
316
|
|
|
296
317
|
fs.writeFileSync(pdlcDest, pdlcContent);
|
|
@@ -307,16 +328,7 @@ async function runSetup() {
|
|
|
307
328
|
const dest = path.join(targetDir, '.agentic-setup.md');
|
|
308
329
|
fs.copyFileSync(claudeSetupSrc, dest);
|
|
309
330
|
console.log(`${i18n.setup_written}`);
|
|
310
|
-
|
|
311
|
-
console.log(`${green}${i18n.framework_scaffolded}${reset}`);
|
|
312
|
-
console.log(`${green}============================================================${reset}\n`);
|
|
313
|
-
console.log(`${yellow}${i18n.next_steps}${reset}`);
|
|
314
|
-
console.log(`${cyan}${i18n.step_1}${reset}`);
|
|
315
|
-
console.log(`${cyan}${i18n.step_2}${reset}`);
|
|
316
|
-
console.log(`${cyan}>>> English: "Read .agentic-setup.md and guide me through the setup."${reset}`);
|
|
317
|
-
console.log(`${cyan}>>> Espaรฑol: "Lea el archivo .agentic-setup.md e inicie el Setup Mode"${reset}`);
|
|
318
|
-
console.log(`${cyan}>>> Portuguรชs: "Leia o arquivo .agentic-setup.md e inicie o Setup Mode."${reset}\n`);
|
|
319
|
-
console.log(`${i18n.note_cleanup}`);
|
|
331
|
+
printSetupDone();
|
|
320
332
|
} else {
|
|
321
333
|
console.error(`${i18n.missing_claude}${claudeSetupSrc}`);
|
|
322
334
|
}
|
|
@@ -325,16 +337,14 @@ async function runSetup() {
|
|
|
325
337
|
// Create .cursorrules which has the general invariants
|
|
326
338
|
const dest = path.join(targetDir, '.cursorrules');
|
|
327
339
|
fs.copyFileSync(cursorSetupSrc, dest);
|
|
328
|
-
|
|
340
|
+
|
|
329
341
|
// Also copy skill.md as a setup prompt for cursor composer
|
|
330
342
|
const setupPromptDest = path.join(targetDir, '.agentic-pdlc', 'SETUP_PROMPT.md');
|
|
331
343
|
if (fs.existsSync(claudeSetupSrc)) fs.copyFileSync(claudeSetupSrc, setupPromptDest);
|
|
332
344
|
|
|
333
345
|
console.log(`${i18n.cursor_rules_written}`);
|
|
334
346
|
console.log(`${i18n.cursor_setup_written}`);
|
|
335
|
-
|
|
336
|
-
console.log(`${cyan}${i18n.cursor_step_1}${reset}`);
|
|
337
|
-
console.log(`${cyan}${i18n.cursor_step_2}${reset}`);
|
|
347
|
+
printSetupDone();
|
|
338
348
|
} else {
|
|
339
349
|
console.error(`${i18n.missing_claude}${cursorSetupSrc}`);
|
|
340
350
|
}
|
|
@@ -343,8 +353,7 @@ async function runSetup() {
|
|
|
343
353
|
const dest = path.join(targetDir, '.agentic-setup.md');
|
|
344
354
|
fs.copyFileSync(claudeSetupSrc, dest);
|
|
345
355
|
console.log(`${i18n.generic_written}`);
|
|
346
|
-
|
|
347
|
-
console.log(`${cyan}>>> ${i18n.generic_done}${reset}`);
|
|
356
|
+
printSetupDone();
|
|
348
357
|
}
|
|
349
358
|
|
|
350
359
|
rl.close();
|
package/docs/pdlc.md
CHANGED
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
| Column | Meaning | Who moves the card |
|
|
6
6
|
|---|---|---|
|
|
7
7
|
| ๐ก Idea | Backlog โ every new issue lands here | Manual |
|
|
8
|
-
| ๐ Exploration |
|
|
9
|
-
| ๐ง Brainstorming |
|
|
10
|
-
| ๐ Detail Solution |
|
|
11
|
-
| โ
Approval |
|
|
12
|
-
| โ๏ธ Development |
|
|
8
|
+
| ๐ Exploration | AI is analyzing code and context | Label `stage:exploration` |
|
|
9
|
+
| ๐ง Brainstorming | AI proposed approaches and trade-offs | Label `stage:brainstorming` |
|
|
10
|
+
| ๐ Detail Solution | AI is writing the technical spec | Label `stage:detailing` |
|
|
11
|
+
| โ
Approval | Your turn, awaiting `spec:approved` label | Label `spec:approved` |
|
|
12
|
+
| โ๏ธ Development | AI implementing the spec | Label `stage:development` |
|
|
13
13
|
| ๐งช Testing | CI pipeline running | GitHub Actions |
|
|
14
14
|
| ๐ Code Review / PR | PR opened, awaiting human review | GitHub Actions |
|
|
15
|
-
| ๐ Production | Merged | GitHub Actions |
|
|
15
|
+
| ๐ Ready for Production | Merged | GitHub Actions |
|
|
16
16
|
|
|
17
17
|
<!--
|
|
18
18
|
Adapt columns as needed. The functional baseline is:
|
|
19
|
-
๐ก Idea โ โ๏ธ Development โ ๐ Code Review / PR โ ๐ Production
|
|
19
|
+
๐ก Idea โ โ๏ธ Development โ ๐ Code Review / PR โ ๐ Ready for Production
|
|
20
20
|
-->
|
|
21
21
|
|
|
22
22
|
## Board Identifiers (GitHub Projects)
|
|
@@ -39,7 +39,7 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
39
39
|
| โ๏ธ Development | `{{ID_DEVELOPMENT}}` |
|
|
40
40
|
| ๐งช Testing | `{{ID_TESTING}}` |
|
|
41
41
|
| ๐ Code Review / PR | `{{ID_CODE_REVIEW_PR}}` |
|
|
42
|
-
| ๐ Production | `{{
|
|
42
|
+
| ๐ Ready for Production | `{{ID_READY_FOR_PRODUCTION}}` |
|
|
43
43
|
|
|
44
44
|
## Agent ร Phase Mapping
|
|
45
45
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Run from the root of a test project to undo everything npx create-agentic-pdlc creates.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
RED='\033[0;31m'
|
|
6
|
+
GREEN='\033[0;32m'
|
|
7
|
+
YELLOW='\033[1;33m'
|
|
8
|
+
NC='\033[0m'
|
|
9
|
+
|
|
10
|
+
echo -e "${YELLOW}Resetting agentic-pdlc artifacts in: $(pwd)${NC}\n"
|
|
11
|
+
|
|
12
|
+
remove() {
|
|
13
|
+
local target="$1"
|
|
14
|
+
if [ ! -e "$target" ] && [ ! -L "$target" ]; then
|
|
15
|
+
echo -e " skipped $target (not found)"
|
|
16
|
+
return
|
|
17
|
+
fi
|
|
18
|
+
# Skip files/dirs tracked by git โ they predate the setup run
|
|
19
|
+
if git ls-files --error-unmatch "$target" &>/dev/null 2>&1; then
|
|
20
|
+
echo -e " ${YELLOW}protected${NC} $target (tracked by git โ skipping)"
|
|
21
|
+
return
|
|
22
|
+
fi
|
|
23
|
+
rm -rf "$target"
|
|
24
|
+
echo -e " ${GREEN}removed${NC} $target"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# --- CLI phase ---
|
|
28
|
+
remove .agentic-pdlc
|
|
29
|
+
remove .agentic-setup.md
|
|
30
|
+
remove .cursorrules
|
|
31
|
+
|
|
32
|
+
# --- Setup Mode phase (agent-generated) ---
|
|
33
|
+
remove AGENTS.md
|
|
34
|
+
remove docs/pdlc.md
|
|
35
|
+
remove .github/workflows/project-automation.yml
|
|
36
|
+
remove .github/workflows/agent-trigger.yml
|
|
37
|
+
remove .github/workflows/ci.yml
|
|
38
|
+
remove .github/workflows/qa-agent.yml
|
|
39
|
+
|
|
40
|
+
# Clean up empty dirs left behind
|
|
41
|
+
rmdir --ignore-fail-on-non-empty docs 2>/dev/null || true
|
|
42
|
+
rmdir --ignore-fail-on-non-empty .github/workflows 2>/dev/null || true
|
|
43
|
+
rmdir --ignore-fail-on-non-empty .github 2>/dev/null || true
|
|
44
|
+
|
|
45
|
+
echo -e "\n${GREEN}Done. Run 'npx create-agentic-pdlc' to start fresh.${NC}"
|
package/templates/docs/pdlc.md
CHANGED
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
| โ๏ธ Development | Agent implementing the spec | Label `stage:development` |
|
|
13
13
|
| ๐งช Testing | CI pipeline or AI QA Agent running (Variant B) | GitHub Actions / QA Agent |
|
|
14
14
|
| ๐ Code Review / PR | PR opened (Variant A) or QA passed (Variant B) | GitHub Actions |
|
|
15
|
-
| ๐ Production | Merged | GitHub Actions |
|
|
15
|
+
| ๐ Ready for Production | Merged | GitHub Actions |
|
|
16
16
|
|
|
17
17
|
<!--
|
|
18
18
|
Adapt columns as needed. The functional baseline is:
|
|
19
|
-
๐ก Idea โ โ๏ธ Development โ ๐ Code Review / PR โ ๐ Production
|
|
19
|
+
๐ก Idea โ โ๏ธ Development โ ๐ Code Review / PR โ ๐ Ready for Production
|
|
20
20
|
-->
|
|
21
21
|
|
|
22
22
|
## Workflow Variants (QA Agent)
|
|
@@ -44,7 +44,7 @@ REPO = {{REPO_OWNER}}/{{REPO_NAME}}
|
|
|
44
44
|
| โ๏ธ Development | `{{ID_DEVELOPMENT}}` |
|
|
45
45
|
| ๐งช Testing | `{{ID_TESTING}}` |
|
|
46
46
|
| ๐ Code Review / PR | `{{ID_CODE_REVIEW_PR}}` |
|
|
47
|
-
| ๐ Production | `{{
|
|
47
|
+
| ๐ Ready for Production | `{{ID_READY_FOR_PRODUCTION}}` |
|
|
48
48
|
|
|
49
49
|
## Agent ร Phase Mapping
|
|
50
50
|
|