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.
@@ -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: "Claude is analyzing", color: "PURPLE" },
217
- { name: "๐Ÿง  Brainstorming", description: "Awaiting PM gate", color: "PINK" },
218
- { name: "๐Ÿ“ Detail Solution", description: "Technical spec", color: "BLUE" },
219
- { name: "โœ… Approval", description: "Spec ready", color: "GREEN" },
220
- { name: "โš™๏ธ Development", description: "Agent implementing", color: "ORANGE" },
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($projectId: ID!, $fieldId: ID!, $options: [ProjectV2SingleSelectFieldOptionInput!]) {
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(/\{\{ID_PRODUCTION\}\}/g, optionMap["๐Ÿš€ Production"] || 'MISSING_ID');
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
- console.log(`${green}============================================================${reset}`);
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
- console.log(`\n${green}${i18n.cursor_done}${reset}`);
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
- console.log(`\n${green}${i18n.cursor_done}${reset}`);
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 | 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` |
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 | `{{ID_PRODUCTION}}` |
42
+ | ๐Ÿš€ Ready for Production | `{{ID_READY_FOR_PRODUCTION}}` |
43
43
 
44
44
  ## Agent ร— Phase Mapping
45
45
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-agentic-pdlc",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Agentic PDLC Framework - Conversational setup for your AI coding assistants",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -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}"
@@ -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 | `{{ID_PRODUCTION}}` |
47
+ | ๐Ÿš€ Ready for Production | `{{ID_READY_FOR_PRODUCTION}}` |
48
48
 
49
49
  ## Agent ร— Phase Mapping
50
50