bigpowers 2.34.0 → 2.34.2
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 +2 -2
- package/.pi/prompts/deploy.md +53 -28
- package/.pi/prompts/develop-tdd.md +5 -80
- package/.pi/prompts/migrate-spec.md +273 -197
- package/.pi/prompts/publish-package.md +125 -67
- package/.pi/prompts/release-branch.md +85 -69
- package/.pi/prompts/smoke-test.md +98 -58
- package/.pi/prompts/using-bigpowers.md +2 -2
- package/.pi/prompts/validate-contracts.md +169 -54
- package/.pi/prompts/wire-ci.md +147 -89
- package/.pi/skills/deploy/SKILL.md +53 -28
- package/.pi/skills/develop-tdd/SKILL.md +5 -80
- package/.pi/skills/migrate-spec/SKILL.md +273 -197
- package/.pi/skills/publish-package/SKILL.md +125 -67
- package/.pi/skills/release-branch/SKILL.md +85 -69
- package/.pi/skills/smoke-test/SKILL.md +98 -58
- package/.pi/skills/using-bigpowers/SKILL.md +2 -2
- package/.pi/skills/validate-contracts/SKILL.md +169 -54
- package/.pi/skills/wire-ci/SKILL.md +147 -89
- package/CHANGELOG.md +14 -0
- package/README.md +4 -4
- package/SKILL-INDEX.md +1 -1
- package/deploy/REFERENCE.md +82 -0
- package/deploy/SKILL.md +3 -63
- package/develop-tdd/SKILL.md +5 -80
- package/migrate-spec/REFERENCE.md +268 -0
- package/migrate-spec/SKILL.md +5 -199
- package/package.json +4 -3
- package/publish-package/REFERENCE.md +239 -0
- package/publish-package/SKILL.md +8 -192
- package/release-branch/REFERENCE.md +83 -0
- package/release-branch/SKILL.md +2 -69
- package/scripts/generate-reference-tables.sh +1 -0
- package/scripts/sync-skills.sh +4 -1
- package/skills-lock.json +9 -9
- package/smoke-test/REFERENCE.md +162 -0
- package/smoke-test/SKILL.md +5 -130
- package/using-bigpowers/SKILL.md +2 -2
- package/validate-contracts/REFERENCE.md +183 -0
- package/validate-contracts/SKILL.md +6 -77
- package/wire-ci/REFERENCE.md +257 -0
- package/wire-ci/SKILL.md +8 -210
|
@@ -32,6 +32,112 @@ If no manifest is found, prompt the user to specify the type or pass `--type <np
|
|
|
32
32
|
Before attempting any publish, run all applicable checks:
|
|
33
33
|
|
|
34
34
|
**npm (`package.json`):**
|
|
35
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
36
|
+
|
|
37
|
+
**crates.io (`Cargo.toml`):**
|
|
38
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
39
|
+
|
|
40
|
+
**PyPI (`setup.py` / `pyproject.toml`):**
|
|
41
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
42
|
+
|
|
43
|
+
### 3. Run publish
|
|
44
|
+
|
|
45
|
+
After all prerequisite checks pass, run the registry-specific command:
|
|
46
|
+
|
|
47
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
48
|
+
|
|
49
|
+
### 4. Verify publish success
|
|
50
|
+
|
|
51
|
+
After publish, confirm the version appears on the registry:
|
|
52
|
+
|
|
53
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
54
|
+
|
|
55
|
+
### 5. Error handling
|
|
56
|
+
|
|
57
|
+
On failure, surface actionable hints:
|
|
58
|
+
|
|
59
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
60
|
+
|
|
61
|
+
### 6. Dry-run mode (`--dry-run`)
|
|
62
|
+
|
|
63
|
+
Run `--dry-run` to verify all prerequisites without actually publishing:
|
|
64
|
+
|
|
65
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
66
|
+
|
|
67
|
+
### 7. Dry-run mode per registry
|
|
68
|
+
|
|
69
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
70
|
+
|
|
71
|
+
## Verify
|
|
72
|
+
|
|
73
|
+
→ verify: `test -f publish-package/SKILL.md && echo "OK: skill file exists" || echo "FAIL: no skill file"`
|
|
74
|
+
→ verify: `grep -q "name: publish-package" publish-package/SKILL.md && echo "OK: frontmatter" || echo "FAIL: frontmatter"`
|
|
75
|
+
→ verify: `grep -ci "npm\|crates.io\|pypi\|publish\|registry" publish-package/SKILL.md | awk '{if($1>=4) print "OK: semantics"; else print "FAIL: missing"}'`
|
|
76
|
+
→ verify: `grep -q "publish-package" SKILL-INDEX.md && echo "OK: in SKILL-INDEX" || echo "FAIL: not indexed"`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
# Publish Package — Reference
|
|
81
|
+
|
|
82
|
+
## Options
|
|
83
|
+
|
|
84
|
+
| Flag | Description |
|
|
85
|
+
|------|-------------|
|
|
86
|
+
| `--dry-run` | Verify prerequisites and show publish command without executing |
|
|
87
|
+
| `--registry <type>` | Force registry type (skip auto-detection) |
|
|
88
|
+
| `--otp <code>` | One-time password for npm 2FA |
|
|
89
|
+
| `--no-verify` | Skip prerequisite checks (use with caution) |
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Examples
|
|
95
|
+
|
|
96
|
+
### Publish an npm package
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Verify first
|
|
100
|
+
publish-package --dry-run
|
|
101
|
+
|
|
102
|
+
# Publish
|
|
103
|
+
publish-package
|
|
104
|
+
|
|
105
|
+
# Output:
|
|
106
|
+
# [npm] Publishing my-package v0.4.0...
|
|
107
|
+
# OK: npm publish confirmed (my-package@0.4.0 on registry)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Publish a Rust crate
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
export CARGO_REGISTRY_TOKEN=<token>
|
|
114
|
+
publish-package --dry-run
|
|
115
|
+
publish-package
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Missing token scenario
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
$ publish-package
|
|
122
|
+
FAIL: NPM_TOKEN not set. Set via: export NPM_TOKEN=<token> or add to .npmrc
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Integration with release-branch
|
|
129
|
+
|
|
130
|
+
When wired into `release-branch`, add a step after git push:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
6a. Run publish-package to publish to package registries
|
|
134
|
+
→ verify: publish-package --dry-run && publish-package
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Reference block 1
|
|
140
|
+
|
|
35
141
|
```bash
|
|
36
142
|
# Check auth token exists
|
|
37
143
|
if [ -z "${NPM_TOKEN:-}" ]; then
|
|
@@ -69,7 +175,10 @@ if [ -f CHANGELOG.md ]; then
|
|
|
69
175
|
fi
|
|
70
176
|
```
|
|
71
177
|
|
|
72
|
-
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Reference block 2
|
|
181
|
+
|
|
73
182
|
```bash
|
|
74
183
|
# Check auth token exists
|
|
75
184
|
if [ -z "${CARGO_REGISTRY_TOKEN:-}" ]; then
|
|
@@ -88,7 +197,10 @@ if cargo search "$CRATE_NAME" 2>/dev/null | grep -q "^${CRATE_NAME}.*\"$CURRENT_
|
|
|
88
197
|
fi
|
|
89
198
|
```
|
|
90
199
|
|
|
91
|
-
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Reference block 3
|
|
203
|
+
|
|
92
204
|
```bash
|
|
93
205
|
# Check auth token exists
|
|
94
206
|
if [ -z "${TWINE_PASSWORD:-}" ] && [ -z "${POETRY_PYPI_TOKEN_PYPI:-}" ]; then
|
|
@@ -104,9 +216,9 @@ if [ ! -d dist ] || [ -z "$(ls dist/*.whl 2>/dev/null)" ]; then
|
|
|
104
216
|
fi
|
|
105
217
|
```
|
|
106
218
|
|
|
107
|
-
|
|
219
|
+
---
|
|
108
220
|
|
|
109
|
-
|
|
221
|
+
## Reference block 4
|
|
110
222
|
|
|
111
223
|
```bash
|
|
112
224
|
# npm
|
|
@@ -122,9 +234,9 @@ python -m twine upload dist/* # or: poetry publish
|
|
|
122
234
|
brew bump-formula-pr --url=<tarball-url> <formula-name>
|
|
123
235
|
```
|
|
124
236
|
|
|
125
|
-
|
|
237
|
+
---
|
|
126
238
|
|
|
127
|
-
|
|
239
|
+
## Reference block 5
|
|
128
240
|
|
|
129
241
|
```bash
|
|
130
242
|
# npm
|
|
@@ -137,9 +249,9 @@ cargo search "$CRATE_NAME" 2>/dev/null | grep -q "^${CRATE_NAME}.*\"$CURRENT_VER
|
|
|
137
249
|
pip index versions "$PACKAGE_NAME" 2>/dev/null | grep -q "$CURRENT_VER" && echo "OK: PyPI publish confirmed"
|
|
138
250
|
```
|
|
139
251
|
|
|
140
|
-
|
|
252
|
+
---
|
|
141
253
|
|
|
142
|
-
|
|
254
|
+
## Reference block 6
|
|
143
255
|
|
|
144
256
|
```bash
|
|
145
257
|
# Generic failure handler
|
|
@@ -172,9 +284,9 @@ if [ $? -ne 0 ]; then
|
|
|
172
284
|
fi
|
|
173
285
|
```
|
|
174
286
|
|
|
175
|
-
|
|
287
|
+
---
|
|
176
288
|
|
|
177
|
-
|
|
289
|
+
## Reference block 7
|
|
178
290
|
|
|
179
291
|
```bash
|
|
180
292
|
# Example output
|
|
@@ -190,7 +302,9 @@ $ publish-package --dry-run
|
|
|
190
302
|
[DRY-RUN] Exiting without publishing.
|
|
191
303
|
```
|
|
192
304
|
|
|
193
|
-
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Reference block 8
|
|
194
308
|
|
|
195
309
|
```bash
|
|
196
310
|
# npm dry-run
|
|
@@ -202,59 +316,3 @@ cargo package --list 2>/dev/null
|
|
|
202
316
|
# PyPI dry-run
|
|
203
317
|
python -m twine upload --repository testpypi dist/* # test.pypi.org
|
|
204
318
|
```
|
|
205
|
-
|
|
206
|
-
## Options
|
|
207
|
-
|
|
208
|
-
| Flag | Description |
|
|
209
|
-
|------|-------------|
|
|
210
|
-
| `--dry-run` | Verify prerequisites and show publish command without executing |
|
|
211
|
-
| `--registry <type>` | Force registry type (skip auto-detection) |
|
|
212
|
-
| `--otp <code>` | One-time password for npm 2FA |
|
|
213
|
-
| `--no-verify` | Skip prerequisite checks (use with caution) |
|
|
214
|
-
|
|
215
|
-
## Examples
|
|
216
|
-
|
|
217
|
-
### Publish an npm package
|
|
218
|
-
|
|
219
|
-
```bash
|
|
220
|
-
# Verify first
|
|
221
|
-
publish-package --dry-run
|
|
222
|
-
|
|
223
|
-
# Publish
|
|
224
|
-
publish-package
|
|
225
|
-
|
|
226
|
-
# Output:
|
|
227
|
-
# [npm] Publishing my-package v0.4.0...
|
|
228
|
-
# OK: npm publish confirmed (my-package@0.4.0 on registry)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Publish a Rust crate
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
export CARGO_REGISTRY_TOKEN=<token>
|
|
235
|
-
publish-package --dry-run
|
|
236
|
-
publish-package
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Missing token scenario
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
$ publish-package
|
|
243
|
-
FAIL: NPM_TOKEN not set. Set via: export NPM_TOKEN=<token> or add to .npmrc
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
## Integration with release-branch
|
|
247
|
-
|
|
248
|
-
When wired into `release-branch`, add a step after git push:
|
|
249
|
-
|
|
250
|
-
```
|
|
251
|
-
6a. Run publish-package to publish to package registries
|
|
252
|
-
→ verify: publish-package --dry-run && publish-package
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## Verify
|
|
256
|
-
|
|
257
|
-
→ verify: `test -f publish-package/SKILL.md && echo "OK: skill file exists" || echo "FAIL: no skill file"`
|
|
258
|
-
→ verify: `grep -q "name: publish-package" publish-package/SKILL.md && echo "OK: frontmatter" || echo "FAIL: frontmatter"`
|
|
259
|
-
→ verify: `grep -ci "npm\|crates.io\|pypi\|publish\|registry" publish-package/SKILL.md | awk '{if($1>=4) print "OK: semantics"; else print "FAIL: missing"}'`
|
|
260
|
-
→ verify: `grep -q "publish-package" SKILL-INDEX.md && echo "OK: in SKILL-INDEX" || echo "FAIL: not indexed"`
|
|
@@ -62,29 +62,7 @@ bash scripts/land-branch.sh <task-slug> "feat(scope): description"
|
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
**Path B — `scripts/land-branch.sh` missing (fallback):**
|
|
65
|
-
|
|
66
|
-
# Fallback: manual squash-merge when land-branch.sh is absent
|
|
67
|
-
FEATURE_BRANCH=<task-slug>
|
|
68
|
-
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo main)
|
|
69
|
-
|
|
70
|
-
# Ensure we're on the feature branch
|
|
71
|
-
if [ "$(git branch --show-current)" != "$FEATURE_BRANCH" ]; then
|
|
72
|
-
git checkout "$FEATURE_BRANCH"
|
|
73
|
-
fi
|
|
74
|
-
|
|
75
|
-
# Checkout default branch and update
|
|
76
|
-
git checkout "$DEFAULT_BRANCH"
|
|
77
|
-
git pull --rebase origin "$DEFAULT_BRANCH" 2>/dev/null || git pull origin "$DEFAULT_BRANCH"
|
|
78
|
-
|
|
79
|
-
# Squash-merge the feature branch
|
|
80
|
-
git merge --no-ff "$FEATURE_BRANCH" -m "<conventional-commit-message>"
|
|
81
|
-
|
|
82
|
-
# Push
|
|
83
|
-
git push origin "$DEFAULT_BRANCH"
|
|
84
|
-
|
|
85
|
-
# Clean up local feature branch
|
|
86
|
-
git branch -d "$FEATURE_BRANCH"
|
|
87
|
-
```
|
|
65
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
88
66
|
|
|
89
67
|
**Report which path was taken.** Print exactly:
|
|
90
68
|
- `"used land-branch.sh"` if Path A
|
|
@@ -116,41 +94,7 @@ mv specs/epics/eNN-slug specs/epics/archive/
|
|
|
116
94
|
|
|
117
95
|
After push (solo-local step 5 or team-pr step 7), verify the CI workflow completes successfully:
|
|
118
96
|
|
|
119
|
-
|
|
120
|
-
echo "==> Polling CI for main branch..."
|
|
121
|
-
TIMEOUT=600 # 10 minutes
|
|
122
|
-
INTERVAL=30 # poll every 30 seconds
|
|
123
|
-
ELAPSED=0
|
|
124
|
-
|
|
125
|
-
while [ $ELAPSED -lt $TIMEOUT ]; do
|
|
126
|
-
CI_JSON=$(gh run list --limit 1 --branch main --workflow CI --json status,conclusion,headSha,databaseId 2>/dev/null)
|
|
127
|
-
CI_STATUS=$(echo "$CI_JSON" | jq -r '.[0].status // "unknown"')
|
|
128
|
-
CI_CONCLUSION=$(echo "$CI_JSON" | jq -r '.[0].conclusion // ""')
|
|
129
|
-
CI_SHA=$(echo "$CI_JSON" | jq -r '.[0].headSha // ""')
|
|
130
|
-
CI_ID=$(echo "$CI_JSON" | jq -r '.[0].databaseId // ""')
|
|
131
|
-
|
|
132
|
-
if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "success" ]; then
|
|
133
|
-
echo "OK: CI passed for $(git rev-parse --short HEAD)"
|
|
134
|
-
bp-yaml-set.sh specs/state.yaml release.ci_verified true 2>/dev/null || \
|
|
135
|
-
echo " (bp-yaml-set not available — manually set release.ci_verified: true in state.yaml)"
|
|
136
|
-
break
|
|
137
|
-
fi
|
|
138
|
-
|
|
139
|
-
if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "failure" ]; then
|
|
140
|
-
echo "FAIL: CI failed for $(git rev-parse --short HEAD)"
|
|
141
|
-
echo " Run URL: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/actions/runs/$CI_ID"
|
|
142
|
-
echo " Handoff to fix-bug with the failure URL above."
|
|
143
|
-
return 1
|
|
144
|
-
fi
|
|
145
|
-
|
|
146
|
-
sleep $INTERVAL
|
|
147
|
-
ELAPSED=$((ELAPSED + INTERVAL))
|
|
148
|
-
echo " Waiting... (${ELAPSED}s / ${TIMEOUT}s)"
|
|
149
|
-
done
|
|
150
|
-
|
|
151
|
-
echo "FAIL: CI did not complete within ${TIMEOUT}s timeout"
|
|
152
|
-
return 1
|
|
153
|
-
```
|
|
97
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
154
98
|
|
|
155
99
|
- [ ] CI workflow passes after push
|
|
156
100
|
- [ ] `release.ci_verified: true` documented in state.yaml
|
|
@@ -176,21 +120,12 @@ git checkout main && git status && pwd
|
|
|
176
120
|
|
|
177
121
|
Report: "Branch released. Integrate mode: <solo-local|team-pr>. cwd: $(pwd) on $(git branch --show-current)."
|
|
178
122
|
|
|
179
|
-
## Solo-local fallback detail
|
|
180
|
-
|
|
181
|
-
The fallback sequence (Path B above) handles the "remote has moved" case with `git pull --rebase`. Use when `scripts/land-branch.sh` is absent.
|
|
182
|
-
|
|
183
|
-
**Acceptance:** When fallback runs, main is updated, feature branch is deleted locally, and output states `"used fallback merge (land-branch.sh not found)"`.
|
|
184
|
-
|
|
185
|
-
## Handoff
|
|
186
|
-
|
|
187
|
-
Gate: READY -> next: survey-context
|
|
188
|
-
Writes: state.yaml handoff.next_skill = survey-context
|
|
189
|
-
|
|
190
123
|
---
|
|
191
124
|
|
|
192
125
|
# Release Branch — Reference
|
|
193
126
|
|
|
127
|
+
# Release Branch — Reference
|
|
128
|
+
|
|
194
129
|
## PR body template (team-pr mode)
|
|
195
130
|
|
|
196
131
|
```bash
|
|
@@ -244,3 +179,84 @@ After landing the branch, record delivery metrics for this story:
|
|
|
244
179
|
cycle_minutes: 90
|
|
245
180
|
bcp_per_hour: 2.0
|
|
246
181
|
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Solo-local fallback detail
|
|
186
|
+
|
|
187
|
+
The fallback sequence (Path B above) handles the "remote has moved" case with `git pull --rebase`. Use when `scripts/land-branch.sh` is absent.
|
|
188
|
+
|
|
189
|
+
**Acceptance:** When fallback runs, main is updated, feature branch is deleted locally, and output states `"used fallback merge (land-branch.sh not found)"`.
|
|
190
|
+
|
|
191
|
+
## Handoff
|
|
192
|
+
|
|
193
|
+
Gate: READY -> next: survey-context
|
|
194
|
+
Writes: state.yaml handoff.next_skill = survey-context
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Reference block 1
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# Fallback: manual squash-merge when land-branch.sh is absent
|
|
202
|
+
FEATURE_BRANCH=<task-slug>
|
|
203
|
+
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo main)
|
|
204
|
+
|
|
205
|
+
# Ensure we're on the feature branch
|
|
206
|
+
if [ "$(git branch --show-current)" != "$FEATURE_BRANCH" ]; then
|
|
207
|
+
git checkout "$FEATURE_BRANCH"
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# Checkout default branch and update
|
|
211
|
+
git checkout "$DEFAULT_BRANCH"
|
|
212
|
+
git pull --rebase origin "$DEFAULT_BRANCH" 2>/dev/null || git pull origin "$DEFAULT_BRANCH"
|
|
213
|
+
|
|
214
|
+
# Squash-merge the feature branch
|
|
215
|
+
git merge --no-ff "$FEATURE_BRANCH" -m "<conventional-commit-message>"
|
|
216
|
+
|
|
217
|
+
# Push
|
|
218
|
+
git push origin "$DEFAULT_BRANCH"
|
|
219
|
+
|
|
220
|
+
# Clean up local feature branch
|
|
221
|
+
git branch -d "$FEATURE_BRANCH"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Reference block 2
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
echo "==> Polling CI for main branch..."
|
|
230
|
+
TIMEOUT=600 # 10 minutes
|
|
231
|
+
INTERVAL=30 # poll every 30 seconds
|
|
232
|
+
ELAPSED=0
|
|
233
|
+
|
|
234
|
+
while [ $ELAPSED -lt $TIMEOUT ]; do
|
|
235
|
+
CI_JSON=$(gh run list --limit 1 --branch main --workflow CI --json status,conclusion,headSha,databaseId 2>/dev/null)
|
|
236
|
+
CI_STATUS=$(echo "$CI_JSON" | jq -r '.[0].status // "unknown"')
|
|
237
|
+
CI_CONCLUSION=$(echo "$CI_JSON" | jq -r '.[0].conclusion // ""')
|
|
238
|
+
CI_SHA=$(echo "$CI_JSON" | jq -r '.[0].headSha // ""')
|
|
239
|
+
CI_ID=$(echo "$CI_JSON" | jq -r '.[0].databaseId // ""')
|
|
240
|
+
|
|
241
|
+
if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "success" ]; then
|
|
242
|
+
echo "OK: CI passed for $(git rev-parse --short HEAD)"
|
|
243
|
+
bp-yaml-set.sh specs/state.yaml release.ci_verified true 2>/dev/null || \
|
|
244
|
+
echo " (bp-yaml-set not available — manually set release.ci_verified: true in state.yaml)"
|
|
245
|
+
break
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
if [ "$CI_STATUS" = "completed" ] && [ "$CI_CONCLUSION" = "failure" ]; then
|
|
249
|
+
echo "FAIL: CI failed for $(git rev-parse --short HEAD)"
|
|
250
|
+
echo " Run URL: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/actions/runs/$CI_ID"
|
|
251
|
+
echo " Handoff to fix-bug with the failure URL above."
|
|
252
|
+
return 1
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
sleep $INTERVAL
|
|
256
|
+
ELAPSED=$((ELAPSED + INTERVAL))
|
|
257
|
+
echo " Waiting... (${ELAPSED}s / ${TIMEOUT}s)"
|
|
258
|
+
done
|
|
259
|
+
|
|
260
|
+
echo "FAIL: CI did not complete within ${TIMEOUT}s timeout"
|
|
261
|
+
return 1
|
|
262
|
+
```
|
|
@@ -20,6 +20,94 @@ Can be run standalone for quick health checks or chained as the final step of th
|
|
|
20
20
|
|
|
21
21
|
Smoke checks are defined in `smoke-checks.yaml` at the project root:
|
|
22
22
|
|
|
23
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
24
|
+
|
|
25
|
+
Checks can also be specified inline via environment variables or CLI arguments for ad-hoc use.
|
|
26
|
+
|
|
27
|
+
### Check Schema
|
|
28
|
+
|
|
29
|
+
| Field | Required | Default | Description |
|
|
30
|
+
|-------|----------|---------|-------------|
|
|
31
|
+
| `name` | Yes | — | Human-readable check name (used in report) |
|
|
32
|
+
| `path` | Yes | `/` | URL path relative to base_url |
|
|
33
|
+
| `method` | No | `GET` | HTTP method |
|
|
34
|
+
| `expected_status` | No | `200` | Expected HTTP status code |
|
|
35
|
+
| `content_signal` | No | — | Regex or string to find in response body |
|
|
36
|
+
| `max_response_time_ms` | No | — | Fail if response slower than this threshold (ms) |
|
|
37
|
+
|
|
38
|
+
## Process
|
|
39
|
+
|
|
40
|
+
### 1. Load smoke checks
|
|
41
|
+
|
|
42
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
43
|
+
|
|
44
|
+
### 2. Run each check
|
|
45
|
+
|
|
46
|
+
For each check in the configuration, perform an HTTP request:
|
|
47
|
+
|
|
48
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
49
|
+
|
|
50
|
+
### 3. Assert results
|
|
51
|
+
|
|
52
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
53
|
+
|
|
54
|
+
### 4. Generate report
|
|
55
|
+
|
|
56
|
+
See [REFERENCE.md](REFERENCE.md)
|
|
57
|
+
|
|
58
|
+
## Integration with deploy skill
|
|
59
|
+
|
|
60
|
+
The `deploy` skill references `smoke-test` as its final verification step:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# In deploy workflow — after successful deploy
|
|
64
|
+
DEPLOY_URL="$DEPLOY_URL" bash scripts/run-smoke.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
# Smoke Test — Reference
|
|
70
|
+
|
|
71
|
+
## Runner script
|
|
72
|
+
|
|
73
|
+
A ready-to-use runner is provided for standalone operation:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
bash scripts/run-smoke.sh [url] [smoke-checks-file]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The runner:
|
|
80
|
+
1. Uses `$DEPLOY_URL`, `$SMOKE_CHECKS_FILE`, or CLI arguments
|
|
81
|
+
2. Runs all defined checks
|
|
82
|
+
3. Prints a pass/fail summary
|
|
83
|
+
4. Exits 0 on all pass, non-zero on any failure
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Configuration reference
|
|
89
|
+
|
|
90
|
+
| Variable | Default | Description |
|
|
91
|
+
|----------|---------|-------------|
|
|
92
|
+
| `SMOKE_CHECKS_FILE` | `smoke-checks.yaml` | Path to smoke checks YAML |
|
|
93
|
+
| `DEPLOY_URL` / `BASE_URL` | *(required)* | Base URL for all checks |
|
|
94
|
+
| `SMOKE_TIMEOUT` | `30` | Per-check timeout (seconds) |
|
|
95
|
+
| `SMOKE_RETRIES` | `0` | Number of retries on failure |
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Verification
|
|
101
|
+
|
|
102
|
+
→ verify: `test -f smoke-test/SKILL.md && grep -q 'name: smoke-test' smoke-test/SKILL.md && echo OK`
|
|
103
|
+
→ verify: `grep -qi 'smoke.checks.yaml\|checklist\|expected_status\|content_signal' smoke-test/SKILL.md && echo OK`
|
|
104
|
+
→ verify: `grep -ci 'pass\|fail\|summary\|report' smoke-test/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`
|
|
105
|
+
→ verify: `grep -q 'smoke-test' SKILL-INDEX.md && echo OK`
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Reference block 1
|
|
110
|
+
|
|
23
111
|
```yaml
|
|
24
112
|
# smoke-checks.yaml — auto-loaded if present at project root
|
|
25
113
|
base_url: "https://example.com"
|
|
@@ -50,22 +138,9 @@ checks:
|
|
|
50
138
|
content_signal: "not found|404"
|
|
51
139
|
```
|
|
52
140
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
### Check Schema
|
|
56
|
-
|
|
57
|
-
| Field | Required | Default | Description |
|
|
58
|
-
|-------|----------|---------|-------------|
|
|
59
|
-
| `name` | Yes | — | Human-readable check name (used in report) |
|
|
60
|
-
| `path` | Yes | `/` | URL path relative to base_url |
|
|
61
|
-
| `method` | No | `GET` | HTTP method |
|
|
62
|
-
| `expected_status` | No | `200` | Expected HTTP status code |
|
|
63
|
-
| `content_signal` | No | — | Regex or string to find in response body |
|
|
64
|
-
| `max_response_time_ms` | No | — | Fail if response slower than this threshold (ms) |
|
|
65
|
-
|
|
66
|
-
## Process
|
|
141
|
+
---
|
|
67
142
|
|
|
68
|
-
|
|
143
|
+
## Reference block 2
|
|
69
144
|
|
|
70
145
|
```bash
|
|
71
146
|
SMOKE_CHECKS_FILE="${SMOKE_CHECKS_FILE:-smoke-checks.yaml}"
|
|
@@ -81,9 +156,9 @@ else
|
|
|
81
156
|
fi
|
|
82
157
|
```
|
|
83
158
|
|
|
84
|
-
|
|
159
|
+
---
|
|
85
160
|
|
|
86
|
-
|
|
161
|
+
## Reference block 3
|
|
87
162
|
|
|
88
163
|
```bash
|
|
89
164
|
url="${BASE_URL}${path}"
|
|
@@ -96,7 +171,9 @@ status=$response
|
|
|
96
171
|
body=$(cat /tmp/smoke_body.txt)
|
|
97
172
|
```
|
|
98
173
|
|
|
99
|
-
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Reference block 4
|
|
100
177
|
|
|
101
178
|
```bash
|
|
102
179
|
checks_passed=0
|
|
@@ -131,7 +208,9 @@ if [ -n "$max_response_time_ms" ] && [ "$response_time" -gt "$max_response_time_
|
|
|
131
208
|
fi
|
|
132
209
|
```
|
|
133
210
|
|
|
134
|
-
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Reference block 5
|
|
135
214
|
|
|
136
215
|
```bash
|
|
137
216
|
total=$((checks_passed + checks_failed))
|
|
@@ -149,42 +228,3 @@ else
|
|
|
149
228
|
exit 0
|
|
150
229
|
fi
|
|
151
230
|
```
|
|
152
|
-
|
|
153
|
-
## Runner script
|
|
154
|
-
|
|
155
|
-
A ready-to-use runner is provided for standalone operation:
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
bash scripts/run-smoke.sh [url] [smoke-checks-file]
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
The runner:
|
|
162
|
-
1. Uses `$DEPLOY_URL`, `$SMOKE_CHECKS_FILE`, or CLI arguments
|
|
163
|
-
2. Runs all defined checks
|
|
164
|
-
3. Prints a pass/fail summary
|
|
165
|
-
4. Exits 0 on all pass, non-zero on any failure
|
|
166
|
-
|
|
167
|
-
## Integration with deploy skill
|
|
168
|
-
|
|
169
|
-
The `deploy` skill references `smoke-test` as its final verification step:
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
# In deploy workflow — after successful deploy
|
|
173
|
-
DEPLOY_URL="$DEPLOY_URL" bash scripts/run-smoke.sh
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## Configuration reference
|
|
177
|
-
|
|
178
|
-
| Variable | Default | Description |
|
|
179
|
-
|----------|---------|-------------|
|
|
180
|
-
| `SMOKE_CHECKS_FILE` | `smoke-checks.yaml` | Path to smoke checks YAML |
|
|
181
|
-
| `DEPLOY_URL` / `BASE_URL` | *(required)* | Base URL for all checks |
|
|
182
|
-
| `SMOKE_TIMEOUT` | `30` | Per-check timeout (seconds) |
|
|
183
|
-
| `SMOKE_RETRIES` | `0` | Number of retries on failure |
|
|
184
|
-
|
|
185
|
-
## Verification
|
|
186
|
-
|
|
187
|
-
→ verify: `test -f smoke-test/SKILL.md && grep -q 'name: smoke-test' smoke-test/SKILL.md && echo OK`
|
|
188
|
-
→ verify: `grep -qi 'smoke.checks.yaml\|checklist\|expected_status\|content_signal' smoke-test/SKILL.md && echo OK`
|
|
189
|
-
→ verify: `grep -ci 'pass\|fail\|summary\|report' smoke-test/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`
|
|
190
|
-
→ verify: `grep -q 'smoke-test' SKILL-INDEX.md && echo OK`
|
|
@@ -7,7 +7,7 @@ description: One-time bootstrap that introduces the bigpowers skills system, the
|
|
|
7
7
|
> **HARD GATE** — **HARD GATE** — This skill is the entry point. Do NOT skip it when onboarding new users or starting a new session. It establishes the bigpowers methodology, lifecycle phases, and conventions.
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
Welcome to **bigpowers** — a lifecycle of **
|
|
10
|
+
Welcome to **bigpowers** — a lifecycle of **70** agent skills for production-ready, TDD-driven software by solo developers.
|
|
11
11
|
|
|
12
12
|
## Install
|
|
13
13
|
|
|
@@ -98,7 +98,7 @@ Start the HTTP dashboard with `visual-dashboard` → `GET /api/status?projectDir
|
|
|
98
98
|
- **Integrate:** team default is `gh pr` (team-pr); solo profile uses `land-branch.sh`. Never create GitHub issues from skills — use local Markdown files instead.
|
|
99
99
|
- **One skill, one thing.** If you're unsure which skill to call, call `survey-context` — it reads your current state and recommends the next step.
|
|
100
100
|
- **verify: every step.** Every epic task must have `verify: <runnable command>`. Evidence over claims.
|
|
101
|
-
- **
|
|
101
|
+
- **70 skills.** See `SKILL-INDEX.md`; find skills with `search-skills`.
|
|
102
102
|
|
|
103
103
|
## After this
|
|
104
104
|
|