create-agentic-pdlc 2.2.1 → 2.4.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/SETUP_PROMPT.md +3 -4
- package/.agentic-pdlc/metrics/raw/2026-W18.jsonl +2 -0
- package/.agentic-pdlc/metrics/raw/2026-W21.jsonl +68 -0
- package/.agentic-pdlc/metrics/raw/2026-W22.jsonl +114 -0
- package/.agentic-setup-prompt.md +3 -4
- package/.agentic-setup.md +3 -4
- package/.github/ISSUE_TEMPLATE/bug.md +53 -0
- package/.github/ISSUE_TEMPLATE/feature.md +54 -0
- package/.github/ISSUE_TEMPLATE/task.md +33 -0
- package/.github/workflows/add-to-board.yml +1 -1
- package/.github/workflows/agent-trigger.yml +4 -4
- package/.github/workflows/agentic-metrics.yml +171 -38
- package/.github/workflows/ci.yml +1 -1
- package/.github/workflows/npm-publish.yml +2 -2
- package/.github/workflows/pdlc-health-check.yml +1 -3
- package/.github/workflows/pdlc-stage-gate.yml +2 -2
- package/.github/workflows/project-automation.yml +79 -16
- package/.github/workflows/qa-agent.yml +26 -15
- package/.github/workflows/qa-gate.yml +51 -0
- package/AGENTS.md +50 -8
- package/CLAUDE.md +53 -3
- package/SETUP.md +4 -1
- package/adapters/claude-code/skill.md +44 -20
- package/adapters/hooks/pdlc-stage-gate.sh +2 -7
- package/bin/cli.js +41 -9
- package/docs/flow.md +8 -21
- package/docs/pdlc.md +24 -16
- package/docs/superpowers/plans/2026-05-28-jules-label-pat-split.md +240 -0
- package/docs/superpowers/plans/2026-05-29-agentic-pulse-rework-taxonomy.md +474 -0
- package/docs/superpowers/plans/2026-05-29-qa-gate-enforcement.md +354 -0
- package/docs/superpowers/specs/2026-05-29-agentic-pulse-rework-taxonomy-design.md +122 -0
- package/package.json +1 -1
- package/templates/.github/ISSUE_TEMPLATE/bug.md +53 -0
- package/templates/.github/ISSUE_TEMPLATE/feature.md +54 -0
- package/templates/.github/ISSUE_TEMPLATE/task.md +33 -0
- package/templates/.github/workflows/add-to-board.yml +4 -4
- package/templates/.github/workflows/agent-trigger.yml +24 -15
- package/{.agentic-pdlc/templates → templates}/.github/workflows/agentic-metrics.yml +166 -36
- package/templates/.github/workflows/ci.yml +15 -1
- package/templates/.github/workflows/pdlc-health-check.yml +1 -3
- package/templates/.github/workflows/pdlc-stage-gate.yml +2 -2
- package/templates/.github/workflows/project-automation.yml +93 -36
- package/templates/.github/workflows/qa-agent.yml +33 -17
- package/templates/.github/workflows/qa-gate.yml +51 -0
- package/templates/AGENTS.md +74 -23
- package/templates/docs/pdlc.md +24 -16
- package/.agentic-pdlc/templates/.github/CODEOWNERS +0 -5
- package/.agentic-pdlc/templates/.github/copilot-instructions.md +0 -12
- package/.agentic-pdlc/templates/.github/workflows/add-to-board.yml +0 -38
- package/.agentic-pdlc/templates/.github/workflows/agent-trigger.yml +0 -146
- package/.agentic-pdlc/templates/.github/workflows/auto-approve.yml +0 -16
- package/.agentic-pdlc/templates/.github/workflows/ci.yml +0 -40
- package/.agentic-pdlc/templates/.github/workflows/pdlc-health-check.yml +0 -123
- package/.agentic-pdlc/templates/.github/workflows/pdlc-stage-gate.yml +0 -51
- package/.agentic-pdlc/templates/.github/workflows/project-automation.yml +0 -278
- package/.agentic-pdlc/templates/.github/workflows/protect-workflows.yml +0 -21
- package/.agentic-pdlc/templates/.github/workflows/qa-agent.yml +0 -128
- package/.agentic-pdlc/templates/AGENTS.md +0 -81
- package/.agentic-pdlc/templates/docs/pdlc.md +0 -115
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
name: Add to Board on Open
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
issues:
|
|
5
|
-
types: [opened]
|
|
6
|
-
|
|
7
|
-
env:
|
|
8
|
-
PROJECT_ID: "{{PROJECT_ID}}"
|
|
9
|
-
STATUS_FIELD_ID: "{{STATUS_FIELD_ID}}"
|
|
10
|
-
STATUS_IDEA: "{{ID_IDEA}}"
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
add-to-board:
|
|
14
|
-
name: Auto-add new issue to board
|
|
15
|
-
runs-on: ubuntu-latest
|
|
16
|
-
env:
|
|
17
|
-
PROJECT_PAT: ${{ secrets.PROJECT_PAT }}
|
|
18
|
-
steps:
|
|
19
|
-
- name: Add issue to project board
|
|
20
|
-
if: ${{ env.PROJECT_PAT != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
21
|
-
uses: actions/github-script@v7
|
|
22
|
-
with:
|
|
23
|
-
github-token: ${{ env.PROJECT_PAT }}
|
|
24
|
-
script: |
|
|
25
|
-
const nodeId = context.payload.issue.node_id;
|
|
26
|
-
const number = context.payload.issue.number;
|
|
27
|
-
const { addProjectV2ItemById: { item } } = await github.graphql(`
|
|
28
|
-
mutation($p: ID!, $c: ID!) {
|
|
29
|
-
addProjectV2ItemById(input: {projectId: $p, contentId: $c}) { item { id } }
|
|
30
|
-
}`, { p: process.env.PROJECT_ID, c: nodeId });
|
|
31
|
-
await github.graphql(`
|
|
32
|
-
mutation($p: ID!, $i: ID!, $f: ID!, $v: ProjectV2FieldValue!) {
|
|
33
|
-
updateProjectV2ItemFieldValue(input: {projectId: $p, itemId: $i, fieldId: $f, value: $v}) {
|
|
34
|
-
projectV2Item { id }
|
|
35
|
-
}
|
|
36
|
-
}`, { p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
37
|
-
v: { singleSelectOptionId: process.env.STATUS_IDEA } });
|
|
38
|
-
console.log(`Issue #${number} added to board → Idea`);
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
name: Trigger Implementation Agent
|
|
2
|
-
|
|
3
|
-
# Triggers when spec:approved is added to an issue (Gate 2)
|
|
4
|
-
# or when an architecture-violation issue is modified (Sentinel flow)
|
|
5
|
-
on:
|
|
6
|
-
issues:
|
|
7
|
-
types: [labeled]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
trigger-implementation-agent:
|
|
11
|
-
name: Trigger {{IMPLEMENTATION_AGENT_NAME}} for implementation
|
|
12
|
-
# Runs only when spec:approved is added
|
|
13
|
-
if: github.event.label.name == 'spec:approved'
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
permissions:
|
|
16
|
-
issues: write
|
|
17
|
-
pull-requests: write
|
|
18
|
-
contents: read
|
|
19
|
-
env:
|
|
20
|
-
PROJECT_PAT: ${{ secrets.PROJECT_PAT }}
|
|
21
|
-
PROJECT_ID: "{{PROJECT_ID}}"
|
|
22
|
-
STATUS_FIELD_ID: "{{STATUS_FIELD_ID}}"
|
|
23
|
-
STATUS_DEVELOPMENT: "{{ID_DEVELOPMENT}}"
|
|
24
|
-
steps:
|
|
25
|
-
- name: Update Labels
|
|
26
|
-
uses: actions/github-script@v7
|
|
27
|
-
with:
|
|
28
|
-
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
-
script: |
|
|
30
|
-
const { owner, repo } = context.repo;
|
|
31
|
-
const issue_number = context.payload.issue.number;
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
await github.rest.issues.removeLabel({
|
|
35
|
-
owner,
|
|
36
|
-
repo,
|
|
37
|
-
issue_number,
|
|
38
|
-
name: 'stage:approval'
|
|
39
|
-
});
|
|
40
|
-
} catch (error) {
|
|
41
|
-
console.log('Label stage:approval not found or could not be removed');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const agentLabel = '{{IMPLEMENTATION_AGENT_LABEL}}';
|
|
45
|
-
const labelsToAdd = ['stage:development'];
|
|
46
|
-
if (!agentLabel.includes('{{')) labelsToAdd.push(agentLabel, 'agent:working');
|
|
47
|
-
|
|
48
|
-
await github.rest.issues.addLabels({
|
|
49
|
-
owner,
|
|
50
|
-
repo,
|
|
51
|
-
issue_number,
|
|
52
|
-
labels: labelsToAdd
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
- name: Move board card to Development
|
|
56
|
-
if: ${{ env.PROJECT_PAT != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
57
|
-
continue-on-error: true
|
|
58
|
-
uses: actions/github-script@v7
|
|
59
|
-
with:
|
|
60
|
-
github-token: ${{ env.PROJECT_PAT }}
|
|
61
|
-
script: |
|
|
62
|
-
const nodeId = context.payload.issue.node_id;
|
|
63
|
-
const number = context.payload.issue.number;
|
|
64
|
-
const { addProjectV2ItemById: { item } } = await github.graphql(`
|
|
65
|
-
mutation($p: ID!, $c: ID!) {
|
|
66
|
-
addProjectV2ItemById(input: {projectId: $p, contentId: $c}) { item { id } }
|
|
67
|
-
}`, { p: process.env.PROJECT_ID, c: nodeId });
|
|
68
|
-
await github.graphql(`
|
|
69
|
-
mutation($p: ID!, $i: ID!, $f: ID!, $v: ProjectV2FieldValue!) {
|
|
70
|
-
updateProjectV2ItemFieldValue(input: {projectId: $p, itemId: $i, fieldId: $f, value: $v}) {
|
|
71
|
-
projectV2Item { id }
|
|
72
|
-
}
|
|
73
|
-
}`, { p: process.env.PROJECT_ID, i: item.id, f: process.env.STATUS_FIELD_ID,
|
|
74
|
-
v: { singleSelectOptionId: process.env.STATUS_DEVELOPMENT } });
|
|
75
|
-
console.log(`Issue #${number} → Development`);
|
|
76
|
-
|
|
77
|
-
- name: Comment on issue to trigger agent and prevent race conditions
|
|
78
|
-
if: ${{ !contains('{{IMPLEMENTATION_AGENT_LABEL}}', '{{') }}
|
|
79
|
-
uses: actions/github-script@v7
|
|
80
|
-
with:
|
|
81
|
-
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
82
|
-
script: |
|
|
83
|
-
const issueNumber = context.payload.issue.number;
|
|
84
|
-
const issueTitle = context.payload.issue.title;
|
|
85
|
-
|
|
86
|
-
const body = [
|
|
87
|
-
`🤖 **Agentic PDLC Orchestrator:** I have dispatched the implementation agent. Please wait for the Pull Request and avoid making concurrent commits on this task to prevent race conditions.`,
|
|
88
|
-
'',
|
|
89
|
-
`{{AGENT_HANDLE}} The spec for this issue has been approved. Please implement it exactly as described in the body above.`,
|
|
90
|
-
'',
|
|
91
|
-
'**Mandatory steps before you begin:**',
|
|
92
|
-
'1. `git fetch origin && git checkout main && git pull` — always start from the current HEAD',
|
|
93
|
-
'2. Read `AGENTS.md` — mandatory rules for agents in this repository',
|
|
94
|
-
'3. Read `docs/pdlc.md` — Definition of Done and invariants reference',
|
|
95
|
-
'',
|
|
96
|
-
'**Rules:**',
|
|
97
|
-
'- Implement strictly what the Acceptance Criteria describes',
|
|
98
|
-
'- Run `{{TEST_COMMAND}}` before opening the Pull Request',
|
|
99
|
-
`- Include \`Closes #${issueNumber}\` in the PR body`,
|
|
100
|
-
'- Create a descriptive branch branching from `main`',
|
|
101
|
-
].join('\n');
|
|
102
|
-
|
|
103
|
-
await github.rest.issues.createComment({
|
|
104
|
-
owner: context.repo.owner,
|
|
105
|
-
repo: context.repo.repo,
|
|
106
|
-
issue_number: issueNumber,
|
|
107
|
-
body,
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
trigger-agent-on-violation:
|
|
111
|
-
name: Trigger {{IMPLEMENTATION_AGENT_NAME}} for architecture violation
|
|
112
|
-
# Runs when architecture-violation is added (Sentinel flow)
|
|
113
|
-
if: github.event.label.name == 'architecture-violation'
|
|
114
|
-
runs-on: ubuntu-latest
|
|
115
|
-
permissions:
|
|
116
|
-
issues: write
|
|
117
|
-
pull-requests: write
|
|
118
|
-
contents: read
|
|
119
|
-
steps:
|
|
120
|
-
- name: Comment on issue to trigger agent
|
|
121
|
-
if: ${{ !contains('{{IMPLEMENTATION_AGENT_LABEL}}', '{{') }}
|
|
122
|
-
uses: actions/github-script@v7
|
|
123
|
-
with:
|
|
124
|
-
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
125
|
-
script: |
|
|
126
|
-
const issueNumber = context.payload.issue.number;
|
|
127
|
-
|
|
128
|
-
const body = [
|
|
129
|
-
`{{AGENT_HANDLE}} Please fix the architecture violation described in this issue.`,
|
|
130
|
-
'',
|
|
131
|
-
'**Mandatory steps before you begin:**',
|
|
132
|
-
'1. `git fetch origin && git checkout main && git pull` — always start from the current HEAD',
|
|
133
|
-
'2. Read `AGENTS.md` — mandatory rules for agents in this repository',
|
|
134
|
-
'',
|
|
135
|
-
'**Rules:**',
|
|
136
|
-
'- Fix only what the violation points out — do not refactor unrelated code',
|
|
137
|
-
'- Run `{{TEST_COMMAND}}` before opening the Pull Request',
|
|
138
|
-
`- Include \`Closes #${issueNumber}\` in the PR body`,
|
|
139
|
-
].join('\n');
|
|
140
|
-
|
|
141
|
-
await github.rest.issues.createComment({
|
|
142
|
-
owner: context.repo.owner,
|
|
143
|
-
repo: context.repo.repo,
|
|
144
|
-
issue_number: issueNumber,
|
|
145
|
-
body,
|
|
146
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
name: Auto Approve PRs
|
|
2
|
-
on:
|
|
3
|
-
pull_request:
|
|
4
|
-
types: [opened, labeled, synchronize]
|
|
5
|
-
|
|
6
|
-
permissions:
|
|
7
|
-
pull-requests: write
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
auto-approve:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
if: contains(github.event.pull_request.labels.*.name, 'auto-approve')
|
|
13
|
-
steps:
|
|
14
|
-
- uses: hmarr/auto-approve-action@v4
|
|
15
|
-
with:
|
|
16
|
-
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
name: Sentinel / CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [ main ]
|
|
6
|
-
push:
|
|
7
|
-
branches: [ main ]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
validate:
|
|
11
|
-
name: Run tests and linters
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
|
|
16
|
-
- name: Setup environment
|
|
17
|
-
run: echo "Replace this with your language/toolchain setup (e.g., actions/setup-node)"
|
|
18
|
-
|
|
19
|
-
- name: Install dependencies
|
|
20
|
-
run: echo "Replace this with your package manager install command"
|
|
21
|
-
|
|
22
|
-
- name: Run Linters
|
|
23
|
-
if: ${{ !contains('{{LINT_COMMAND}}', '{{') }}
|
|
24
|
-
run: |
|
|
25
|
-
{{LINT_COMMAND}}
|
|
26
|
-
|
|
27
|
-
- name: Typecheck
|
|
28
|
-
if: ${{ !contains('{{TYPECHECK_COMMAND}}', '{{') }}
|
|
29
|
-
run: |
|
|
30
|
-
{{TYPECHECK_COMMAND}}
|
|
31
|
-
|
|
32
|
-
- name: Build
|
|
33
|
-
if: ${{ !contains('{{BUILD_COMMAND}}', '{{') }}
|
|
34
|
-
run: |
|
|
35
|
-
{{BUILD_COMMAND}}
|
|
36
|
-
|
|
37
|
-
- name: Run Tests
|
|
38
|
-
if: ${{ !contains('{{TEST_COMMAND}}', '{{') }}
|
|
39
|
-
run: |
|
|
40
|
-
{{TEST_COMMAND}}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
name: PDLC Health Check (Drift Detection)
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
schedule:
|
|
6
|
-
- cron: '0 8 * * 1' # Every Monday at 8am
|
|
7
|
-
|
|
8
|
-
env:
|
|
9
|
-
PROJECT_ID: "{{PROJECT_ID}}"
|
|
10
|
-
STATUS_FIELD_ID: "{{STATUS_FIELD_ID}}"
|
|
11
|
-
STATUS_EXPLORATION: "{{ID_EXPLORATION}}"
|
|
12
|
-
STATUS_BRAINSTORMING: "{{ID_BRAINSTORMING}}"
|
|
13
|
-
STATUS_DETAILING: "{{ID_DETAILING}}"
|
|
14
|
-
STATUS_APPROVAL: "{{ID_APPROVAL}}"
|
|
15
|
-
STATUS_DEVELOPMENT: "{{ID_DEVELOPMENT}}"
|
|
16
|
-
STATUS_TESTING: "{{ID_TESTING}}"
|
|
17
|
-
STATUS_CODE_REVIEW_PR: "{{ID_CODE_REVIEW_PR}}"
|
|
18
|
-
STATUS_PRODUCTION: "{{ID_PRODUCTION}}"
|
|
19
|
-
|
|
20
|
-
jobs:
|
|
21
|
-
check-drift:
|
|
22
|
-
name: Detect Project Board Drift
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
env:
|
|
25
|
-
PROJECT_TOKEN: ${{ secrets.PROJECT_TOKEN }}
|
|
26
|
-
permissions:
|
|
27
|
-
issues: write
|
|
28
|
-
steps:
|
|
29
|
-
- name: Validate Board Configuration
|
|
30
|
-
if: ${{ env.PROJECT_TOKEN != '' && env.PROJECT_ID != '{{PROJECT_ID}}' }}
|
|
31
|
-
uses: actions/github-script@v7
|
|
32
|
-
with:
|
|
33
|
-
github-token: ${{ env.PROJECT_TOKEN }}
|
|
34
|
-
script: |
|
|
35
|
-
const projectId = process.env.PROJECT_ID;
|
|
36
|
-
const statusFieldId = process.env.STATUS_FIELD_ID;
|
|
37
|
-
const envVars = {
|
|
38
|
-
'STATUS_EXPLORATION': process.env.STATUS_EXPLORATION,
|
|
39
|
-
'STATUS_BRAINSTORMING': process.env.STATUS_BRAINSTORMING,
|
|
40
|
-
'STATUS_DETAILING': process.env.STATUS_DETAILING,
|
|
41
|
-
'STATUS_APPROVAL': process.env.STATUS_APPROVAL,
|
|
42
|
-
'STATUS_DEVELOPMENT': process.env.STATUS_DEVELOPMENT,
|
|
43
|
-
'STATUS_TESTING': process.env.STATUS_TESTING,
|
|
44
|
-
'STATUS_CODE_REVIEW_PR': process.env.STATUS_CODE_REVIEW_PR,
|
|
45
|
-
'STATUS_PRODUCTION': process.env.STATUS_PRODUCTION
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const query = `
|
|
49
|
-
query($projectId: ID!) {
|
|
50
|
-
node(id: $projectId) {
|
|
51
|
-
... on ProjectV2 {
|
|
52
|
-
title
|
|
53
|
-
fields(first: 20) {
|
|
54
|
-
nodes {
|
|
55
|
-
... on ProjectV2SingleSelectField {
|
|
56
|
-
id
|
|
57
|
-
name
|
|
58
|
-
options {
|
|
59
|
-
id
|
|
60
|
-
name
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
`;
|
|
69
|
-
|
|
70
|
-
let result;
|
|
71
|
-
try {
|
|
72
|
-
result = await github.graphql(query, { projectId });
|
|
73
|
-
} catch (error) {
|
|
74
|
-
console.log("❌ Error fetching project. Verify your PROJECT_ID.");
|
|
75
|
-
console.log(error);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const project = result.node;
|
|
80
|
-
if (!project) {
|
|
81
|
-
console.log("❌ Project not found.");
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const statusField = project.fields.nodes.find(f => f.id === statusFieldId);
|
|
86
|
-
if (!statusField) {
|
|
87
|
-
console.log("❌ Status field not found.");
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const validOptions = statusField.options;
|
|
92
|
-
const validOptionIds = validOptions.map(o => o.id);
|
|
93
|
-
|
|
94
|
-
let hasDrift = false;
|
|
95
|
-
let missingVars = [];
|
|
96
|
-
|
|
97
|
-
for (const [varName, id] of Object.entries(envVars)) {
|
|
98
|
-
if (id && !id.startsWith('{{') && !validOptionIds.includes(id)) {
|
|
99
|
-
hasDrift = true;
|
|
100
|
-
missingVars.push(varName);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (hasDrift) {
|
|
105
|
-
console.log("🚨 Drift detected! The following mapped columns no longer exist: " + missingVars.join(", "));
|
|
106
|
-
|
|
107
|
-
let table = "| Column Name | New ID |\n|---|---|\n";
|
|
108
|
-
validOptions.forEach(opt => {
|
|
109
|
-
table += `| ${opt.name} | \`${opt.id}\` |\n`;
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const body = `🚨 **Agentic PDLC Drift Detected**\n\nThe following columns mapped in your \`.github/workflows/project-automation.yml\` no longer exist in your project board:\n\n**${missingVars.join(", ")}**\n\n### How to fix it:\nHere is the list of current columns in your board with their valid IDs. Please update the \`env\` block in your \`.github/workflows/project-automation.yml\` and \`.github/workflows/pdlc-health-check.yml\`.\n\n${table}`;
|
|
113
|
-
|
|
114
|
-
await github.rest.issues.create({
|
|
115
|
-
owner: context.repo.owner,
|
|
116
|
-
repo: context.repo.repo,
|
|
117
|
-
title: '🚨 Agentic PDLC Drift Detected in Project Board',
|
|
118
|
-
body: body,
|
|
119
|
-
labels: ['bug']
|
|
120
|
-
});
|
|
121
|
-
} else {
|
|
122
|
-
console.log("✅ No drift detected. Board configuration is healthy.");
|
|
123
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
name: PDLC Stage Gate
|
|
2
|
-
on:
|
|
3
|
-
pull_request:
|
|
4
|
-
types: [opened, synchronize, reopened, labeled, unlabeled]
|
|
5
|
-
|
|
6
|
-
permissions:
|
|
7
|
-
pull-requests: read
|
|
8
|
-
issues: read
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
stage-gate:
|
|
12
|
-
name: PDLC Stage Gate
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
steps:
|
|
15
|
-
- name: Check stage:approval
|
|
16
|
-
env:
|
|
17
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
18
|
-
run: |
|
|
19
|
-
set -e
|
|
20
|
-
REPO="${{ github.repository }}"
|
|
21
|
-
PR_NUMBER="${{ github.event.pull_request.number }}"
|
|
22
|
-
|
|
23
|
-
PR_LABELS=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json labels --jq '[.labels[].name] | join(" ")')
|
|
24
|
-
if echo "$PR_LABELS" | grep -qw "hotfix"; then
|
|
25
|
-
echo "✅ Hotfix label — stage gate bypassed."
|
|
26
|
-
exit 0
|
|
27
|
-
fi
|
|
28
|
-
|
|
29
|
-
PR_BODY=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json body --jq '.body // ""')
|
|
30
|
-
ISSUE_NUMS=$(echo "$PR_BODY" | grep -oiE '(Closes?|Fixes?|Resolves?)\s+#([0-9]+)' | grep -oE '[0-9]+' || true)
|
|
31
|
-
|
|
32
|
-
if [ -z "$ISSUE_NUMS" ]; then
|
|
33
|
-
echo "❌ No linked issues in PR body."
|
|
34
|
-
echo " Add 'Closes #N' to PR body, or add 'hotfix' label to PR for emergencies."
|
|
35
|
-
exit 1
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
for NUM in $ISSUE_NUMS; do
|
|
39
|
-
LABELS=$(gh issue view "$NUM" --repo "$REPO" --json labels --jq '[.labels[].name] | join(" ")' 2>/dev/null || echo "")
|
|
40
|
-
if echo "$LABELS" | grep -qw "stage:approval" || echo "$LABELS" | grep -qw "spec:approved" || echo "$LABELS" | grep -qw "stage:development"; then
|
|
41
|
-
echo "✅ Issue #$NUM approved"
|
|
42
|
-
else
|
|
43
|
-
STAGE=$(echo "$LABELS" | tr ' ' '\n' | grep "^stage:" | head -1 || echo "none")
|
|
44
|
-
echo "❌ Issue #$NUM missing approval (current: $STAGE)"
|
|
45
|
-
echo " Required: stage:approval OR spec:approved OR stage:development label on the issue."
|
|
46
|
-
echo " Emergency bypass: add 'hotfix' label to this PR."
|
|
47
|
-
exit 1
|
|
48
|
-
fi
|
|
49
|
-
done
|
|
50
|
-
|
|
51
|
-
echo "✅ All linked issues approved."
|