bigpowers 2.9.0 → 2.10.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/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "64 skills — 61 agent skills for spec-driven, test-first software development by solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -67,6 +67,66 @@ After all tests pass: extract duplication, deepen modules, apply SOLID principle
67
67
 
68
68
  After every behavior cycle, run the verify command from the active epic task. Show evidence before declaring the step done.
69
69
 
70
+ ### 6a. CI dry-run sub-step (when modifying workflows)
71
+
72
+ If this cycle modified files in `.github/workflows/`, run a CI dry-run before pushing:
73
+
74
+ ```bash
75
+ # 1. Check for workflow file changes
76
+ CHANGED_WORKFLOWS=$(git diff --name-only HEAD | grep '\.github/workflows/' || true)
77
+ if [ -n "$CHANGED_WORKFLOWS" ]; then
78
+ echo "==> CI dry-run: workflow files changed"
79
+ echo " $CHANGED_WORKFLOWS"
80
+
81
+ # 2. Validate YAML syntax
82
+ if command -v yamllint &>/dev/null; then
83
+ for f in $CHANGED_WORKFLOWS; do
84
+ yamllint "$f" && echo " OK: $f passes YAML lint" || echo " WARN: $f has YAML issues"
85
+ done
86
+ else
87
+ # Fallback: Python YAML parse
88
+ for f in $CHANGED_WORKFLOWS; do
89
+ python3 -c "import yaml; yaml.safe_load(open('$f'))" 2>/dev/null && \
90
+ echo " OK: $f YAML syntax valid" || \
91
+ echo " FAIL: $f has YAML syntax errors"
92
+ done
93
+ fi
94
+
95
+ # 3. Run actionlint if available
96
+ if command -v actionlint &>/dev/null; then
97
+ for f in $CHANGED_WORKFLOWS; do
98
+ actionlint "$f" && echo " OK: $f passes actionlint" || echo " WARN: $f has actionlint issues"
99
+ done
100
+ fi
101
+
102
+ # 4. Check common pitfalls
103
+ for f in $CHANGED_WORKFLOWS; do
104
+ # Missing permissions block
105
+ if ! grep -q 'permissions:' "$f"; then
106
+ echo " WARNING: $f missing permissions block — add one for security"
107
+ fi
108
+ # npm publish without NPM_TOKEN
109
+ if grep -q 'npm publish\|npx semantic-release' "$f" && ! grep -q 'NPM_TOKEN' "$f"; then
110
+ echo " WARNING: $f has npm publish/semantic-release but no NPM_TOKEN in secrets"
111
+ fi
112
+ # Hardcoded Node versions
113
+ if grep -q 'node-version: [0-9]' "$f"; then
114
+ echo " NOTE: $f has hardcoded Node version — consider node-version-file: .nvmrc"
115
+ fi
116
+ done
117
+
118
+ # 5. Suggest local dry-run
119
+ if command -v act &>/dev/null; then
120
+ echo " SUGGESTION: Run 'act push --dry-run' to test workflows locally"
121
+ fi
122
+ fi
123
+ ```
124
+
125
+ Checklist:
126
+ - [ ] YAML syntax validated for all changed workflow files
127
+ - [ ] No missing permissions, secrets, or hardcoded versions flagged
128
+ - [ ] Local dry-run suggested if `act` is available
129
+
70
130
  ### 7. Manual Verification Handover
71
131
 
72
132
  Once all tests pass: locate the Verification Script in the active epic capsule, present it to the user step-by-step, and wait for confirmation of behavioral correctness.
@@ -107,6 +107,52 @@ gh pr merge --squash --delete-branch
107
107
  mv specs/epics/eNN-slug specs/epics/archive/
108
108
  ```
109
109
 
110
+ ### 7b. CI verification (solo-local and team-pr)
111
+
112
+ > **HARD GATE** — Do NOT declare success until CI completes. A push that fails CI is a regression, not a release.
113
+
114
+ After push (solo-local step 5 or team-pr step 7), verify the CI workflow completes successfully:
115
+
116
+ ```bash
117
+ echo "==> Polling CI for main branch..."
118
+ TIMEOUT=600 # 10 minutes
119
+ INTERVAL=30 # poll every 30 seconds
120
+ ELAPSED=0
121
+
122
+ while [ $ELAPSED -lt $TIMEOUT ]; do
123
+ CI_JSON=$(gh run list --limit 1 --branch main --workflow CI --json status,conclusion,headSha,databaseId 2>/dev/null)
124
+ CI_STATUS=$(echo "$CI_JSON" | jq -r '.[0].status // "unknown"')
125
+ CI_CONCLUSION=$(echo "$CI_JSON" | jq -r '.[0].conclusion // ""')
126
+ CI_SHA=$(echo "$CI_JSON" | jq -r '.[0].headSha // ""')
127
+ CI_ID=$(echo "$CI_JSON" | jq -r '.[0].databaseId // ""')
128
+
129
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "success" ]; then
130
+ echo "OK: CI passed for $(git rev-parse --short HEAD)"
131
+ bp-yaml-set.sh specs/state.yaml release.ci_verified true 2>/dev/null || \
132
+ echo " (bp-yaml-set not available — manually set release.ci_verified: true in state.yaml)"
133
+ break
134
+ fi
135
+
136
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "failure" ]; then
137
+ echo "FAIL: CI failed for $(git rev-parse --short HEAD)"
138
+ echo " Run URL: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/actions/runs/$CI_ID"
139
+ echo " Handoff to fix-bug with the failure URL above."
140
+ return 1
141
+ fi
142
+
143
+ sleep $INTERVAL
144
+ ELAPSED=$((ELAPSED + INTERVAL))
145
+ echo " Waiting... (${ELAPSED}s / ${TIMEOUT}s)"
146
+ done
147
+
148
+ echo "FAIL: CI did not complete within ${TIMEOUT}s timeout"
149
+ return 1
150
+ ```
151
+
152
+ - [ ] CI workflow passes after push
153
+ - [ ] `release.ci_verified: true` documented in state.yaml
154
+ - On failure: `handoff.next_skill = fix-bug` with the CI failure URL
155
+
110
156
  ### 8. Clean up worktree
111
157
 
112
158
  ```bash
@@ -69,6 +69,66 @@ After all tests pass: extract duplication, deepen modules, apply SOLID principle
69
69
 
70
70
  After every behavior cycle, run the verify command from the active epic task. Show evidence before declaring the step done.
71
71
 
72
+ ### 6a. CI dry-run sub-step (when modifying workflows)
73
+
74
+ If this cycle modified files in `.github/workflows/`, run a CI dry-run before pushing:
75
+
76
+ ```bash
77
+ # 1. Check for workflow file changes
78
+ CHANGED_WORKFLOWS=$(git diff --name-only HEAD | grep '\.github/workflows/' || true)
79
+ if [ -n "$CHANGED_WORKFLOWS" ]; then
80
+ echo "==> CI dry-run: workflow files changed"
81
+ echo " $CHANGED_WORKFLOWS"
82
+
83
+ # 2. Validate YAML syntax
84
+ if command -v yamllint &>/dev/null; then
85
+ for f in $CHANGED_WORKFLOWS; do
86
+ yamllint "$f" && echo " OK: $f passes YAML lint" || echo " WARN: $f has YAML issues"
87
+ done
88
+ else
89
+ # Fallback: Python YAML parse
90
+ for f in $CHANGED_WORKFLOWS; do
91
+ python3 -c "import yaml; yaml.safe_load(open('$f'))" 2>/dev/null && \
92
+ echo " OK: $f YAML syntax valid" || \
93
+ echo " FAIL: $f has YAML syntax errors"
94
+ done
95
+ fi
96
+
97
+ # 3. Run actionlint if available
98
+ if command -v actionlint &>/dev/null; then
99
+ for f in $CHANGED_WORKFLOWS; do
100
+ actionlint "$f" && echo " OK: $f passes actionlint" || echo " WARN: $f has actionlint issues"
101
+ done
102
+ fi
103
+
104
+ # 4. Check common pitfalls
105
+ for f in $CHANGED_WORKFLOWS; do
106
+ # Missing permissions block
107
+ if ! grep -q 'permissions:' "$f"; then
108
+ echo " WARNING: $f missing permissions block — add one for security"
109
+ fi
110
+ # npm publish without NPM_TOKEN
111
+ if grep -q 'npm publish\|npx semantic-release' "$f" && ! grep -q 'NPM_TOKEN' "$f"; then
112
+ echo " WARNING: $f has npm publish/semantic-release but no NPM_TOKEN in secrets"
113
+ fi
114
+ # Hardcoded Node versions
115
+ if grep -q 'node-version: [0-9]' "$f"; then
116
+ echo " NOTE: $f has hardcoded Node version — consider node-version-file: .nvmrc"
117
+ fi
118
+ done
119
+
120
+ # 5. Suggest local dry-run
121
+ if command -v act &>/dev/null; then
122
+ echo " SUGGESTION: Run 'act push --dry-run' to test workflows locally"
123
+ fi
124
+ fi
125
+ ```
126
+
127
+ Checklist:
128
+ - [ ] YAML syntax validated for all changed workflow files
129
+ - [ ] No missing permissions, secrets, or hardcoded versions flagged
130
+ - [ ] Local dry-run suggested if `act` is available
131
+
72
132
  ### 7. Manual Verification Handover
73
133
 
74
134
  Once all tests pass: locate the Verification Script in the active epic capsule, present it to the user step-by-step, and wait for confirmation of behavioral correctness.
@@ -109,6 +109,52 @@ gh pr merge --squash --delete-branch
109
109
  mv specs/epics/eNN-slug specs/epics/archive/
110
110
  ```
111
111
 
112
+ ### 7b. CI verification (solo-local and team-pr)
113
+
114
+ > **HARD GATE** — Do NOT declare success until CI completes. A push that fails CI is a regression, not a release.
115
+
116
+ After push (solo-local step 5 or team-pr step 7), verify the CI workflow completes successfully:
117
+
118
+ ```bash
119
+ echo "==> Polling CI for main branch..."
120
+ TIMEOUT=600 # 10 minutes
121
+ INTERVAL=30 # poll every 30 seconds
122
+ ELAPSED=0
123
+
124
+ while [ $ELAPSED -lt $TIMEOUT ]; do
125
+ CI_JSON=$(gh run list --limit 1 --branch main --workflow CI --json status,conclusion,headSha,databaseId 2>/dev/null)
126
+ CI_STATUS=$(echo "$CI_JSON" | jq -r '.[0].status // "unknown"')
127
+ CI_CONCLUSION=$(echo "$CI_JSON" | jq -r '.[0].conclusion // ""')
128
+ CI_SHA=$(echo "$CI_JSON" | jq -r '.[0].headSha // ""')
129
+ CI_ID=$(echo "$CI_JSON" | jq -r '.[0].databaseId // ""')
130
+
131
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "success" ]; then
132
+ echo "OK: CI passed for $(git rev-parse --short HEAD)"
133
+ bp-yaml-set.sh specs/state.yaml release.ci_verified true 2>/dev/null || \
134
+ echo " (bp-yaml-set not available — manually set release.ci_verified: true in state.yaml)"
135
+ break
136
+ fi
137
+
138
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "failure" ]; then
139
+ echo "FAIL: CI failed for $(git rev-parse --short HEAD)"
140
+ echo " Run URL: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/actions/runs/$CI_ID"
141
+ echo " Handoff to fix-bug with the failure URL above."
142
+ return 1
143
+ fi
144
+
145
+ sleep $INTERVAL
146
+ ELAPSED=$((ELAPSED + INTERVAL))
147
+ echo " Waiting... (${ELAPSED}s / ${TIMEOUT}s)"
148
+ done
149
+
150
+ echo "FAIL: CI did not complete within ${TIMEOUT}s timeout"
151
+ return 1
152
+ ```
153
+
154
+ - [ ] CI workflow passes after push
155
+ - [ ] `release.ci_verified: true` documented in state.yaml
156
+ - On failure: `handoff.next_skill = fix-bug` with the CI failure URL
157
+
112
158
  ### 8. Clean up worktree
113
159
 
114
160
  ```bash
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [2.10.0](https://github.com/danielvm-git/bigpowers/compare/v2.9.0...v2.10.0) (2026-06-20)
2
+
3
+
4
+ ### Features
5
+
6
+ * **skills:** add CI verify and dry-run to skills ([e751564](https://github.com/danielvm-git/bigpowers/commit/e75156478b7c23f4e32ed78eec644916f14dd3c4))
7
+
1
8
  # [2.9.0](https://github.com/danielvm-git/bigpowers/compare/v2.8.0...v2.9.0) (2026-06-20)
2
9
 
3
10
 
package/SKILL-INDEX.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > **DO NOT EDIT** — This file is auto-generated by `scripts/generate-skill-index.sh`.
4
4
  > Edit `SKILL.md` source files or `skills-lock.json` instead. Run `bash scripts/sync-skills.sh` to regenerate.
5
5
 
6
- **Generated:** 2026-06-20T21:29:33Z
6
+ **Generated:** 2026-06-20T21:31:11Z
7
7
  **Skills:** 64
8
8
 
9
9
  ---
@@ -68,6 +68,66 @@ After all tests pass: extract duplication, deepen modules, apply SOLID principle
68
68
 
69
69
  After every behavior cycle, run the verify command from the active epic task. Show evidence before declaring the step done.
70
70
 
71
+ ### 6a. CI dry-run sub-step (when modifying workflows)
72
+
73
+ If this cycle modified files in `.github/workflows/`, run a CI dry-run before pushing:
74
+
75
+ ```bash
76
+ # 1. Check for workflow file changes
77
+ CHANGED_WORKFLOWS=$(git diff --name-only HEAD | grep '\.github/workflows/' || true)
78
+ if [ -n "$CHANGED_WORKFLOWS" ]; then
79
+ echo "==> CI dry-run: workflow files changed"
80
+ echo " $CHANGED_WORKFLOWS"
81
+
82
+ # 2. Validate YAML syntax
83
+ if command -v yamllint &>/dev/null; then
84
+ for f in $CHANGED_WORKFLOWS; do
85
+ yamllint "$f" && echo " OK: $f passes YAML lint" || echo " WARN: $f has YAML issues"
86
+ done
87
+ else
88
+ # Fallback: Python YAML parse
89
+ for f in $CHANGED_WORKFLOWS; do
90
+ python3 -c "import yaml; yaml.safe_load(open('$f'))" 2>/dev/null && \
91
+ echo " OK: $f YAML syntax valid" || \
92
+ echo " FAIL: $f has YAML syntax errors"
93
+ done
94
+ fi
95
+
96
+ # 3. Run actionlint if available
97
+ if command -v actionlint &>/dev/null; then
98
+ for f in $CHANGED_WORKFLOWS; do
99
+ actionlint "$f" && echo " OK: $f passes actionlint" || echo " WARN: $f has actionlint issues"
100
+ done
101
+ fi
102
+
103
+ # 4. Check common pitfalls
104
+ for f in $CHANGED_WORKFLOWS; do
105
+ # Missing permissions block
106
+ if ! grep -q 'permissions:' "$f"; then
107
+ echo " WARNING: $f missing permissions block — add one for security"
108
+ fi
109
+ # npm publish without NPM_TOKEN
110
+ if grep -q 'npm publish\|npx semantic-release' "$f" && ! grep -q 'NPM_TOKEN' "$f"; then
111
+ echo " WARNING: $f has npm publish/semantic-release but no NPM_TOKEN in secrets"
112
+ fi
113
+ # Hardcoded Node versions
114
+ if grep -q 'node-version: [0-9]' "$f"; then
115
+ echo " NOTE: $f has hardcoded Node version — consider node-version-file: .nvmrc"
116
+ fi
117
+ done
118
+
119
+ # 5. Suggest local dry-run
120
+ if command -v act &>/dev/null; then
121
+ echo " SUGGESTION: Run 'act push --dry-run' to test workflows locally"
122
+ fi
123
+ fi
124
+ ```
125
+
126
+ Checklist:
127
+ - [ ] YAML syntax validated for all changed workflow files
128
+ - [ ] No missing permissions, secrets, or hardcoded versions flagged
129
+ - [ ] Local dry-run suggested if `act` is available
130
+
71
131
  ### 7. Manual Verification Handover
72
132
 
73
133
  Once all tests pass: locate the Verification Script in the active epic capsule, present it to the user step-by-step, and wait for confirmation of behavioral correctness.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "61 agent skills for spec-driven, test-first software development by solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -108,6 +108,52 @@ gh pr merge --squash --delete-branch
108
108
  mv specs/epics/eNN-slug specs/epics/archive/
109
109
  ```
110
110
 
111
+ ### 7b. CI verification (solo-local and team-pr)
112
+
113
+ > **HARD GATE** — Do NOT declare success until CI completes. A push that fails CI is a regression, not a release.
114
+
115
+ After push (solo-local step 5 or team-pr step 7), verify the CI workflow completes successfully:
116
+
117
+ ```bash
118
+ echo "==> Polling CI for main branch..."
119
+ TIMEOUT=600 # 10 minutes
120
+ INTERVAL=30 # poll every 30 seconds
121
+ ELAPSED=0
122
+
123
+ while [ $ELAPSED -lt $TIMEOUT ]; do
124
+ CI_JSON=$(gh run list --limit 1 --branch main --workflow CI --json status,conclusion,headSha,databaseId 2>/dev/null)
125
+ CI_STATUS=$(echo "$CI_JSON" | jq -r '.[0].status // "unknown"')
126
+ CI_CONCLUSION=$(echo "$CI_JSON" | jq -r '.[0].conclusion // ""')
127
+ CI_SHA=$(echo "$CI_JSON" | jq -r '.[0].headSha // ""')
128
+ CI_ID=$(echo "$CI_JSON" | jq -r '.[0].databaseId // ""')
129
+
130
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "success" ]; then
131
+ echo "OK: CI passed for $(git rev-parse --short HEAD)"
132
+ bp-yaml-set.sh specs/state.yaml release.ci_verified true 2>/dev/null || \
133
+ echo " (bp-yaml-set not available — manually set release.ci_verified: true in state.yaml)"
134
+ break
135
+ fi
136
+
137
+ if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "failure" ]; then
138
+ echo "FAIL: CI failed for $(git rev-parse --short HEAD)"
139
+ echo " Run URL: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/actions/runs/$CI_ID"
140
+ echo " Handoff to fix-bug with the failure URL above."
141
+ return 1
142
+ fi
143
+
144
+ sleep $INTERVAL
145
+ ELAPSED=$((ELAPSED + INTERVAL))
146
+ echo " Waiting... (${ELAPSED}s / ${TIMEOUT}s)"
147
+ done
148
+
149
+ echo "FAIL: CI did not complete within ${TIMEOUT}s timeout"
150
+ return 1
151
+ ```
152
+
153
+ - [ ] CI workflow passes after push
154
+ - [ ] `release.ci_verified: true` documented in state.yaml
155
+ - On failure: `handoff.next_skill = fix-bug` with the CI failure URL
156
+
111
157
  ### 8. Clean up worktree
112
158
 
113
159
  ```bash
package/skills-lock.json CHANGED
@@ -68,7 +68,7 @@
68
68
  },
69
69
  "develop-tdd": {
70
70
  "description": "Test-driven development with red-green-refactor loop using vertical slices. Use for features (epic tasks) or bugs (specs/bugs/BUG-*.md).",
71
- "sha256": "af45529ecb20d449",
71
+ "sha256": "4002d960b18436cd",
72
72
  "path": "develop-tdd/SKILL.md"
73
73
  },
74
74
  "diagnose-root": {
@@ -193,7 +193,7 @@
193
193
  },
194
194
  "release-branch": {
195
195
  "description": "Make the merge/PR/keep/discard decision for a feature branch, verify coverage gates, create the PR with gh, and clean up the worktree. Use when a feature is done and ready to ship, or when user says \"release\", \"merge\", or \"open a PR\".",
196
- "sha256": "70fc37ac4e22143d",
196
+ "sha256": "6b2df2c92230d098",
197
197
  "path": "release-branch/SKILL.md"
198
198
  },
199
199
  "request-review": {