bigpowers 2.9.0 → 2.11.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,7 +1,7 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.9.0",
4
- "description": "64 skills — 61 agent skills for spec-driven, test-first software development by solo developers",
3
+ "version": "2.11.0",
4
+ "description": "65 skills — 61 agent skills for spec-driven, test-first software development by solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
7
7
  ],
@@ -0,0 +1,164 @@
1
+ ---
2
+ description: "Build → verify artifact → deploy → wait → smoke deployment pipeline. Platform-agnostic (MCP or CLI), with configurable timeout, retry with exponential backoff, and integrated health-check. The deploy half of CI/CD: run after build to push to production."
3
+ ---
4
+
5
+
6
+ # Deploy
7
+
8
+ > **HARD GATE** — Do not deploy without running tests first. Run `test` or your CI suite before this skill.
9
+ >
10
+ > **HARD GATE** — Use this skill from a CI/CD pipeline or post-merge on `main`/`master`. Never deploy from a feature branch.
11
+ >
12
+ > **HARD GATE** — The deploy skill orchestrates deployment; the `smoke-test` skill validates post-deploy health. Chain them: `deploy → smoke-test`.
13
+
14
+ Orchestrate a full build-to-deployment pipeline: build the artifact, verify it exists and is non-empty, invoke a platform deploy tool (MCP or CLI), poll until the deploy completes or times out, then run a baseline smoke test against the live URL.
15
+
16
+ ## Pipeline Stages
17
+
18
+ ```
19
+ build → verify artifact → deploy → wait/retry → smoke
20
+ ```
21
+
22
+ | Stage | Description | Failure mode |
23
+ |-------|-------------|-------------|
24
+ | Build | Execute the project's build command | Non-zero exit: report build error |
25
+ | Verify | Check artifact exists and is non-empty | Missing/empty: report artifact path |
26
+ | Deploy | Invoke platform deploy tool (MCP, Vercel CLI, rsync, etc.) | Non-zero exit: report deploy error |
27
+ | Wait | Poll deploy status every 30s up to `DEPLOY_TIMEOUT` (default 5 min) | Timeout: report exceeded |
28
+ | Smoke | `curl -sSf $DEPLOY_URL` as baseline health check | Non-200: report failure |
29
+
30
+ ## Process
31
+
32
+ ### 1. Detect build command
33
+
34
+ Read project manifest files in order to determine the build command:
35
+
36
+ | Manifest | Build command |
37
+ |----------|--------------|
38
+ | `package.json` | `npm run build` (or `scripts.build` value) |
39
+ | `Cargo.toml` | `cargo build --release` |
40
+ | `pyproject.toml` / `setup.py` | Depends on build backend (`poetry build`, `pip install -e .`, etc.) |
41
+ | `Makefile` | `make build` or first target named `build` |
42
+ | `AGENTS.md` / `CLAUDE.md` | Look for `build:` in project commands section |
43
+
44
+ If no manifest is found, prompt the user with: "No detected build command. Pass `--build 'npm run build'` or specify the command."
45
+
46
+ ### 2. Build the artifact
47
+
48
+ ```bash
49
+ npm run build
50
+ ```
51
+
52
+ Or the detected command from step 1. If the build fails, exit non-zero and report the build output.
53
+
54
+ ### 3. Verify the artifact
55
+
56
+ ```bash
57
+ ARTIFACT_DIR="${ARTIFACT_DIR:-dist}"
58
+ if [ ! -d "$ARTIFACT_DIR" ] || [ -z "$(ls -A "$ARTIFACT_DIR" 2>/dev/null)" ]; then
59
+ echo "FAIL: build artifact not found at $ARTIFACT_DIR"
60
+ exit 1
61
+ fi
62
+ ```
63
+
64
+ Configurable via `$ARTIFACT_DIR` environment variable (default: `dist/`).
65
+
66
+ ### 4. Deploy to platform
67
+
68
+ Platform-agnostic — supports multiple deployment targets via environment variables:
69
+
70
+ | Platform | Env var | Example |
71
+ |----------|---------|---------|
72
+ | Vercel | `VERCEL_TOKEN`, `VERCEL_PROJECT_ID` | `vercel deploy --prod --token $VERCEL_TOKEN` |
73
+ | Netlify | `NETLIFY_AUTH_TOKEN`, `NETLIFY_SITE_ID` | `netlify deploy --prod --auth $NETLIFY_AUTH_TOKEN --dir $ARTIFACT_DIR` |
74
+ | BigBase MCP | MCP tool call | `mcp deploy` via BigBase server |
75
+ | rsync/SSH | `DEPLOY_SSH_USER`, `DEPLOY_SSH_HOST`, `DEPLOY_SSH_PATH` | `rsync -avz $ARTIFACT_DIR/ $DEPLOY_SSH_USER@$DEPLOY_SSH_HOST:$DEPLOY_SSH_PATH` |
76
+ | Custom | `DEPLOY_COMMAND` | Run any deploy command string |
77
+
78
+ The deploy tool is selected by which environment variables are set. If none are configured:
79
+
80
+ ```bash
81
+ echo "No deploy target configured. Set one of: VERCEL_TOKEN, NETLIFY_AUTH_TOKEN, DEPLOY_SSH_USER+DEPLOY_SSH_HOST, DEPLOY_COMMAND, or MCP deploy tool."
82
+ exit 1
83
+ ```
84
+
85
+ ### 5. Wait and poll status
86
+
87
+ After invoking the deploy command, poll for completion:
88
+
89
+ ```bash
90
+ DEPLOY_TIMEOUT="${DEPLOY_TIMEOUT:-300}" # seconds (default 5 minutes)
91
+ DEPLOY_POLL_INTERVAL="${DEPLOY_POLL_INTERVAL:-30}" # seconds
92
+
93
+ start_time=$(date +%s)
94
+ while true; do
95
+ elapsed=$(( $(date +%s) - start_time ))
96
+ if [ "$elapsed" -ge "$DEPLOY_TIMEOUT" ]; then
97
+ echo "FAIL: deploy status polling timed out after ${DEPLOY_TIMEOUT}s"
98
+ exit 1
99
+ fi
100
+
101
+ status=$(get_deploy_status) # platform-specific status check
102
+ if [ "$status" = "ready" ] || [ "$status" = "done" ]; then
103
+ echo "Deploy completed in ${elapsed}s"
104
+ break
105
+ fi
106
+
107
+ sleep "$DEPLOY_POLL_INTERVAL"
108
+ done
109
+ ```
110
+
111
+ Use exponential backoff for retries on transient failures:
112
+
113
+ ```bash
114
+ RETRY_MAX="${RETRY_MAX:-3}"
115
+ base_delay=2
116
+ for attempt in $(seq 1 "$RETRY_MAX"); do
117
+ if deploy_command; then
118
+ break
119
+ fi
120
+ if [ "$attempt" -eq "$RETRY_MAX" ]; then
121
+ echo "FAIL: deploy failed after ${RETRY_MAX} attempts"
122
+ exit 1
123
+ fi
124
+ sleep $(( base_delay * 2 ** (attempt - 1) ))
125
+ done
126
+ ```
127
+
128
+ ### 6. Baseline smoke test
129
+
130
+ ```bash
131
+ DEPLOY_URL="${DEPLOY_URL:?DEPLOY_URL must be set}"
132
+ if curl -sSf "$DEPLOY_URL" > /dev/null 2>&1; then
133
+ echo "OK: $DEPLOY_URL responds with HTTP 200"
134
+ else
135
+ echo "FAIL: $DEPLOY_URL is not responding with HTTP 200"
136
+ exit 1
137
+ fi
138
+ ```
139
+
140
+ For comprehensive health-checking, chain to the `smoke-test` skill:
141
+
142
+ ```bash
143
+ # After deploy success
144
+ bash scripts/run-smoke.sh "$DEPLOY_URL"
145
+ ```
146
+
147
+ ## Configuration
148
+
149
+ | Variable | Default | Description |
150
+ |----------|---------|-------------|
151
+ | `ARTIFACT_DIR` | `dist` | Build output directory |
152
+ | `DEPLOY_URL` | *(required)* | Live URL for smoke test |
153
+ | `DEPLOY_TIMEOUT` | `300` | Max wait for deploy completion (seconds) |
154
+ | `DEPLOY_POLL_INTERVAL` | `30` | Polling interval (seconds) |
155
+ | `RETRY_MAX` | `3` | Max deploy retry attempts |
156
+ | `BUILD_COMMAND` | *(auto-detect)* | Override build command |
157
+
158
+ ## Verification
159
+
160
+ → verify: `test -f deploy/SKILL.md && grep -q 'name: deploy' deploy/SKILL.md && echo OK`
161
+ → verify: `grep -qi 'build\|artifact\|deploy\|smoke' deploy/SKILL.md && echo OK`
162
+ → verify: `grep -ci 'package.json\|Cargo.toml\|Makefile\|manifest' deploy/SKILL.md | awk '{if($1>=1) print "OK"; else print "FAIL"}'`
163
+ → verify: `grep -ci 'timeout\|poll\|status\|retry\|backoff' deploy/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`
164
+ → verify: `grep -q 'curl.*DEPLOY_URL\|smoke\|health' deploy/SKILL.md && echo OK`
@@ -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
@@ -0,0 +1,166 @@
1
+ ---
2
+ name: deploy
3
+ description: "\"Build → verify artifact → deploy → wait → smoke deployment pipeline. Platform-agnostic (MCP or CLI), with configurable timeout, retry with exponential backoff, and integrated health-check. The deploy half of CI/CD: run after build to push to production.\""
4
+ model: sonnet
5
+ ---
6
+
7
+
8
+ # Deploy
9
+
10
+ > **HARD GATE** — Do not deploy without running tests first. Run `test` or your CI suite before this skill.
11
+ >
12
+ > **HARD GATE** — Use this skill from a CI/CD pipeline or post-merge on `main`/`master`. Never deploy from a feature branch.
13
+ >
14
+ > **HARD GATE** — The deploy skill orchestrates deployment; the `smoke-test` skill validates post-deploy health. Chain them: `deploy → smoke-test`.
15
+
16
+ Orchestrate a full build-to-deployment pipeline: build the artifact, verify it exists and is non-empty, invoke a platform deploy tool (MCP or CLI), poll until the deploy completes or times out, then run a baseline smoke test against the live URL.
17
+
18
+ ## Pipeline Stages
19
+
20
+ ```
21
+ build → verify artifact → deploy → wait/retry → smoke
22
+ ```
23
+
24
+ | Stage | Description | Failure mode |
25
+ |-------|-------------|-------------|
26
+ | Build | Execute the project's build command | Non-zero exit: report build error |
27
+ | Verify | Check artifact exists and is non-empty | Missing/empty: report artifact path |
28
+ | Deploy | Invoke platform deploy tool (MCP, Vercel CLI, rsync, etc.) | Non-zero exit: report deploy error |
29
+ | Wait | Poll deploy status every 30s up to `DEPLOY_TIMEOUT` (default 5 min) | Timeout: report exceeded |
30
+ | Smoke | `curl -sSf $DEPLOY_URL` as baseline health check | Non-200: report failure |
31
+
32
+ ## Process
33
+
34
+ ### 1. Detect build command
35
+
36
+ Read project manifest files in order to determine the build command:
37
+
38
+ | Manifest | Build command |
39
+ |----------|--------------|
40
+ | `package.json` | `npm run build` (or `scripts.build` value) |
41
+ | `Cargo.toml` | `cargo build --release` |
42
+ | `pyproject.toml` / `setup.py` | Depends on build backend (`poetry build`, `pip install -e .`, etc.) |
43
+ | `Makefile` | `make build` or first target named `build` |
44
+ | `AGENTS.md` / `CLAUDE.md` | Look for `build:` in project commands section |
45
+
46
+ If no manifest is found, prompt the user with: "No detected build command. Pass `--build 'npm run build'` or specify the command."
47
+
48
+ ### 2. Build the artifact
49
+
50
+ ```bash
51
+ npm run build
52
+ ```
53
+
54
+ Or the detected command from step 1. If the build fails, exit non-zero and report the build output.
55
+
56
+ ### 3. Verify the artifact
57
+
58
+ ```bash
59
+ ARTIFACT_DIR="${ARTIFACT_DIR:-dist}"
60
+ if [ ! -d "$ARTIFACT_DIR" ] || [ -z "$(ls -A "$ARTIFACT_DIR" 2>/dev/null)" ]; then
61
+ echo "FAIL: build artifact not found at $ARTIFACT_DIR"
62
+ exit 1
63
+ fi
64
+ ```
65
+
66
+ Configurable via `$ARTIFACT_DIR` environment variable (default: `dist/`).
67
+
68
+ ### 4. Deploy to platform
69
+
70
+ Platform-agnostic — supports multiple deployment targets via environment variables:
71
+
72
+ | Platform | Env var | Example |
73
+ |----------|---------|---------|
74
+ | Vercel | `VERCEL_TOKEN`, `VERCEL_PROJECT_ID` | `vercel deploy --prod --token $VERCEL_TOKEN` |
75
+ | Netlify | `NETLIFY_AUTH_TOKEN`, `NETLIFY_SITE_ID` | `netlify deploy --prod --auth $NETLIFY_AUTH_TOKEN --dir $ARTIFACT_DIR` |
76
+ | BigBase MCP | MCP tool call | `mcp deploy` via BigBase server |
77
+ | rsync/SSH | `DEPLOY_SSH_USER`, `DEPLOY_SSH_HOST`, `DEPLOY_SSH_PATH` | `rsync -avz $ARTIFACT_DIR/ $DEPLOY_SSH_USER@$DEPLOY_SSH_HOST:$DEPLOY_SSH_PATH` |
78
+ | Custom | `DEPLOY_COMMAND` | Run any deploy command string |
79
+
80
+ The deploy tool is selected by which environment variables are set. If none are configured:
81
+
82
+ ```bash
83
+ echo "No deploy target configured. Set one of: VERCEL_TOKEN, NETLIFY_AUTH_TOKEN, DEPLOY_SSH_USER+DEPLOY_SSH_HOST, DEPLOY_COMMAND, or MCP deploy tool."
84
+ exit 1
85
+ ```
86
+
87
+ ### 5. Wait and poll status
88
+
89
+ After invoking the deploy command, poll for completion:
90
+
91
+ ```bash
92
+ DEPLOY_TIMEOUT="${DEPLOY_TIMEOUT:-300}" # seconds (default 5 minutes)
93
+ DEPLOY_POLL_INTERVAL="${DEPLOY_POLL_INTERVAL:-30}" # seconds
94
+
95
+ start_time=$(date +%s)
96
+ while true; do
97
+ elapsed=$(( $(date +%s) - start_time ))
98
+ if [ "$elapsed" -ge "$DEPLOY_TIMEOUT" ]; then
99
+ echo "FAIL: deploy status polling timed out after ${DEPLOY_TIMEOUT}s"
100
+ exit 1
101
+ fi
102
+
103
+ status=$(get_deploy_status) # platform-specific status check
104
+ if [ "$status" = "ready" ] || [ "$status" = "done" ]; then
105
+ echo "Deploy completed in ${elapsed}s"
106
+ break
107
+ fi
108
+
109
+ sleep "$DEPLOY_POLL_INTERVAL"
110
+ done
111
+ ```
112
+
113
+ Use exponential backoff for retries on transient failures:
114
+
115
+ ```bash
116
+ RETRY_MAX="${RETRY_MAX:-3}"
117
+ base_delay=2
118
+ for attempt in $(seq 1 "$RETRY_MAX"); do
119
+ if deploy_command; then
120
+ break
121
+ fi
122
+ if [ "$attempt" -eq "$RETRY_MAX" ]; then
123
+ echo "FAIL: deploy failed after ${RETRY_MAX} attempts"
124
+ exit 1
125
+ fi
126
+ sleep $(( base_delay * 2 ** (attempt - 1) ))
127
+ done
128
+ ```
129
+
130
+ ### 6. Baseline smoke test
131
+
132
+ ```bash
133
+ DEPLOY_URL="${DEPLOY_URL:?DEPLOY_URL must be set}"
134
+ if curl -sSf "$DEPLOY_URL" > /dev/null 2>&1; then
135
+ echo "OK: $DEPLOY_URL responds with HTTP 200"
136
+ else
137
+ echo "FAIL: $DEPLOY_URL is not responding with HTTP 200"
138
+ exit 1
139
+ fi
140
+ ```
141
+
142
+ For comprehensive health-checking, chain to the `smoke-test` skill:
143
+
144
+ ```bash
145
+ # After deploy success
146
+ bash scripts/run-smoke.sh "$DEPLOY_URL"
147
+ ```
148
+
149
+ ## Configuration
150
+
151
+ | Variable | Default | Description |
152
+ |----------|---------|-------------|
153
+ | `ARTIFACT_DIR` | `dist` | Build output directory |
154
+ | `DEPLOY_URL` | *(required)* | Live URL for smoke test |
155
+ | `DEPLOY_TIMEOUT` | `300` | Max wait for deploy completion (seconds) |
156
+ | `DEPLOY_POLL_INTERVAL` | `30` | Polling interval (seconds) |
157
+ | `RETRY_MAX` | `3` | Max deploy retry attempts |
158
+ | `BUILD_COMMAND` | *(auto-detect)* | Override build command |
159
+
160
+ ## Verification
161
+
162
+ → verify: `test -f deploy/SKILL.md && grep -q 'name: deploy' deploy/SKILL.md && echo OK`
163
+ → verify: `grep -qi 'build\|artifact\|deploy\|smoke' deploy/SKILL.md && echo OK`
164
+ → verify: `grep -ci 'package.json\|Cargo.toml\|Makefile\|manifest' deploy/SKILL.md | awk '{if($1>=1) print "OK"; else print "FAIL"}'`
165
+ → verify: `grep -ci 'timeout\|poll\|status\|retry\|backoff' deploy/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`
166
+ → verify: `grep -q 'curl.*DEPLOY_URL\|smoke\|health' deploy/SKILL.md && echo OK`
@@ -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,17 @@
1
+ # [2.11.0](https://github.com/danielvm-git/bigpowers/compare/v2.10.0...v2.11.0) (2026-06-20)
2
+
3
+
4
+ ### Features
5
+
6
+ * **skills:** add deploy pipeline — build, verify, deploy, wait, smoke ([35a8530](https://github.com/danielvm-git/bigpowers/commit/35a85309c7ded6faffbf7aad52838b1b9140087f))
7
+
8
+ # [2.10.0](https://github.com/danielvm-git/bigpowers/compare/v2.9.0...v2.10.0) (2026-06-20)
9
+
10
+
11
+ ### Features
12
+
13
+ * **skills:** add CI verify and dry-run to skills ([e751564](https://github.com/danielvm-git/bigpowers/commit/e75156478b7c23f4e32ed78eec644916f14dd3c4))
14
+
1
15
  # [2.9.0](https://github.com/danielvm-git/bigpowers/compare/v2.8.0...v2.9.0) (2026-06-20)
2
16
 
3
17
 
package/CONVENTIONS.md CHANGED
@@ -205,5 +205,6 @@ name must return < 5 results across the repo.
205
205
  |-------|----------------------|-----------|
206
206
  | `terse-mode` | adjective-noun | `enable-terse` implies a toggle; `terse-mode` names a mode state |
207
207
  | `visual-dashboard` | adjective-noun | `view-dashboard` implies read-only; `show-dashboard` collides with `show` verbs |
208
+ | `deploy` | single verb | Well-known DevOps single-word concept; renames like `deploy-app` or `deploy-service` are redundant since deploy always targets an application |
208
209
 
209
210
  Any new exception requires an entry in this table before the skill is published.
package/SKILL-INDEX.md CHANGED
@@ -3,8 +3,8 @@
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
7
- **Skills:** 64
6
+ **Generated:** 2026-06-20T21:48:09Z
7
+ **Skills:** 65
8
8
 
9
9
  ---
10
10
 
@@ -15,11 +15,11 @@
15
15
  | Discover | 6 | `elaborate-spec, map-codebase, research-first, search-skills, survey-context, using-bigpowers` |
16
16
  | Design | 7 | `deepen-architecture, define-language, define-success, design-interface, grill-me, grill-with-docs, model-domain` |
17
17
  | Plan | 9 | `assess-impact, change-request, plan-refactor, plan-release, plan-work, run-planning, scope-work, seed-conventions, slice-tasks` |
18
- | Build | 14 | `align-grid, build-epic, craft-skill, develop-tdd, execute-plan, guard-git, hook-commits, kickoff-branch, orchestrate-project, publish-package, setup-environment, spike-prototype, wire-ci, wire-observability` |
18
+ | Build | 15 | `align-grid, build-epic, craft-skill, deploy, develop-tdd, execute-plan, guard-git, hook-commits, kickoff-branch, orchestrate-project, publish-package, setup-environment, spike-prototype, wire-ci, wire-observability` |
19
19
  | Verify | 12 | `audit-code, diagnose-root, enforce-first, fix-bug, inspect-quality, investigate-bug, request-review, respond-review, run-evals, trace-requirement, validate-fix, verify-work` |
20
20
  | Release | 2 | `commit-message, release-branch` |
21
21
  | Sustain | 13 | `compose-workflow, delegate-task, dispatch-agents, edit-document, evolve-skill, migrate-spec, organize-workspace, reset-baseline, session-state, simulate-agents, stocktake-skills, terse-mode, write-document` |
22
- | **TOTAL** | **63** | |
22
+ | **TOTAL** | **64** | |
23
23
 
24
24
  ---
25
25
 
@@ -52,46 +52,47 @@
52
52
  | 23 | Build | `align-grid` | "Build editorial/magazine/report webpages on a GENUINE Müller-Brockmann modular | ✅ Active |
53
53
  | 24 | Build | `build-epic` | Eight-step epic build cycle — reads state.yaml, execution-status.yaml, and one | ✅ Active |
54
54
  | 25 | Build | `craft-skill` | Create new bigpowers skills with proper structure, progressive disclosure, and b | ✅ Active |
55
- | 26 | Build | `develop-tdd` | Test-driven development with red-green-refactor loop using vertical slices. Use | ✅ Active |
56
- | 27 | Build | `execute-plan` | Batch-execute tasks from the active epic capsule sequentially, with a human chec | ✅ Active |
57
- | 28 | Build | `guard-git` | Block dangerous git commands (push, force push, reset --hard, clean, branch -D, | ✅ Active |
58
- | 29 | Build | `hook-commits` | Set up pre-commit hooks with lint-staged (Prettier), type checking, and tests in | ✅ Active |
59
- | 30 | Build | `kickoff-branch` | Create a git worktree and feature branch, then verify a clean test baseline befo | ✅ Active |
60
- | 31 | Build | `orchestrate-project` | Meta-skill that enforces the 6-phase core loop (discover elaborate plan | ✅ Active |
61
- | 32 | Build | `publish-package` | "Package registry publishing for npm, crates.io, PyPI, and Homebrew. Verifies pr | ✅ Active |
62
- | 33 | Build | `setup-environment` | Pre-install dependencies and configure tools before development work begins. Use | ✅ Active |
63
- | 34 | Build | `spike-prototype` | Throw-away prototype for unknown problem spaces. Output is learning notes in spe | ✅ Active |
64
- | 35 | Build | `wire-ci` | "CI pipeline setup with pre-built templates and local validation. Generates GitH | ✅ Active |
65
- | 36 | Build | `wire-observability` | Add structured JSON logging, observability commands, and idempotent setup script | ✅ Active |
66
- | 37 | Verify | `audit-code` | Self-review checklist for the coding agent to run before dispatching a reviewer. | ✅ Active |
67
- | 38 | Verify | `diagnose-root` | Run 4-phase root cause analysis reproduce, isolate, hypothesize, verify. Use | ✅ Active |
68
- | 39 | Verify | `enforce-first` | Apply the F.I.R.S.T test quality rubric (Fast, Independent, Repeatable, Self-Val | ✅ Active |
69
- | 40 | Verify | `fix-bug` | Bug fix orchestrator active_flow fix_bug; reads specs/bugs/BUG-*.md; chains | ✅ Active |
70
- | 41 | Verify | `inspect-quality` | Interactive QA session where user reports bugs or issues conversationally, and t | ✅ Active |
71
- | 42 | Verify | `investigate-bug` | Investigate a bug or issue by exploring the codebase to find root cause, then wr | ✅ Active |
72
- | 43 | Verify | `request-review` | Dispatch a fresh reviewer agent with a clean context to critique the code after | ✅ Active |
73
- | 44 | Verify | `respond-review` | Act on a reviewer agent's feedback systematically categorize findings, apply | ✅ Active |
74
- | 45 | Verify | `run-evals` | Eval-Driven Development define capability and regression evals before buildi | ✅ Active |
75
- | 46 | Verify | `trace-requirement` | Link story IDs from specs/release-plan.yaml + epic capsule directories to the im | ✅ Active |
76
- | 47 | Verify | `validate-fix` | Prove a fix works before declaring done re-run the failing test, run the ful | ✅ Active |
77
- | 48 | Verify | `verify-work` | Multi-phase UAT gatecold-start smoke, build, typecheck, lint, tests, step-b | ✅ Active |
78
- | 49 | Release | `commit-message` | Reviews working-tree changes, then drafts a Conventional Commits title/body and | ✅ Active |
79
- | 50 | Release | `release-branch` | Make the merge/PR/keep/discard decision for a feature branch, verify coverage ga | ✅ Active |
80
- | 51 | Sustain | `compose-workflow` | Chain multiple bigpowers skills into a custom workflow recipe saved in specs/. U | ✅ Active |
81
- | 52 | Sustain | `delegate-task` | Delegate one complex task to a single subagent, review its work in two stages be | ✅ Active |
82
- | 53 | Sustain | `dispatch-agents` | Dispatch multiple subagents in parallel on independent tasks. No waiting between | ✅ Active |
83
- | 54 | Sustain | `edit-document` | Edit and improve documents by restructuring sections, improving clarity, and tig | ✅ Active |
84
- | 55 | Sustain | `evolve-skill` | Benchmark-gated skill evolution consume bigpowers-benchmark report, propose | ✅ Active |
85
- | 56 | Sustain | `migrate-spec` | Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers Y | ✅ Active |
86
- | 57 | Sustain | `organize-workspace` | Scans the active workspace for disposable artifacts—logs, caches, stale build | ✅ Active |
87
- | 58 | Sustain | `reset-baseline` | Restore the project to a known clean state between agent runs or experiments. Us | ✅ Active |
88
- | 59 | Sustain | `session-state` | Track implementation decisions and progress in specs/state.yaml to prevent conte | ✅ Active |
89
- | 60 | Sustain | `simulate-agents` | Run Mock User and Auditor agents against a feature in fresh contexts before huma | ✅ Active |
90
- | 61 | Sustain | `stocktake-skills` | Sequential subagent batch audit of the bigpowers skill catalog Quick Scan (c | ✅ Active |
91
- | 62 | Sustain | `terse-mode` | Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping | ✅ Active |
92
- | 63 | Sustain | `write-document` | Write, organize, and sync high-integrity technical documents using the BMAD meth | ✅ Active |
93
-
94
- **Total: 63 active skills.**
55
+ | 26 | Build | `deploy` | "Build verify artifact deploy wait → smoke deployment pipeline. Pl | ✅ Active |
56
+ | 27 | Build | `develop-tdd` | Test-driven development with red-green-refactor loop using vertical slices. Use | ✅ Active |
57
+ | 28 | Build | `execute-plan` | Batch-execute tasks from the active epic capsule sequentially, with a human chec | ✅ Active |
58
+ | 29 | Build | `guard-git` | Block dangerous git commands (push, force push, reset --hard, clean, branch -D, | ✅ Active |
59
+ | 30 | Build | `hook-commits` | Set up pre-commit hooks with lint-staged (Prettier), type checking, and tests in | ✅ Active |
60
+ | 31 | Build | `kickoff-branch` | Create a git worktree and feature branch, then verify a clean test baseline befo | ✅ Active |
61
+ | 32 | Build | `orchestrate-project` | Meta-skill that enforces the 6-phase core loop (discover elaborate plan | ✅ Active |
62
+ | 33 | Build | `publish-package` | "Package registry publishing for npm, crates.io, PyPI, and Homebrew. Verifies pr | ✅ Active |
63
+ | 34 | Build | `setup-environment` | Pre-install dependencies and configure tools before development work begins. Use | ✅ Active |
64
+ | 35 | Build | `spike-prototype` | Throw-away prototype for unknown problem spaces. Output is learning notes in spe | ✅ Active |
65
+ | 36 | Build | `wire-ci` | "CI pipeline setup with pre-built templates and local validation. Generates GitH | ✅ Active |
66
+ | 37 | Build | `wire-observability` | Add structured JSON logging, observability commands, and idempotent setup script | ✅ Active |
67
+ | 38 | Verify | `audit-code` | Self-review checklist for the coding agent to run before dispatching a reviewer. | ✅ Active |
68
+ | 39 | Verify | `diagnose-root` | Run 4-phase root cause analysis reproduce, isolate, hypothesize, verify. Use | ✅ Active |
69
+ | 40 | Verify | `enforce-first` | Apply the F.I.R.S.T test quality rubric (Fast, Independent, Repeatable, Self-Val | ✅ Active |
70
+ | 41 | Verify | `fix-bug` | Bug fix orchestrator active_flow fix_bug; reads specs/bugs/BUG-*.md; chains | ✅ Active |
71
+ | 42 | Verify | `inspect-quality` | Interactive QA session where user reports bugs or issues conversationally, and t | ✅ Active |
72
+ | 43 | Verify | `investigate-bug` | Investigate a bug or issue by exploring the codebase to find root cause, then wr | ✅ Active |
73
+ | 44 | Verify | `request-review` | Dispatch a fresh reviewer agent with a clean context to critique the code after | ✅ Active |
74
+ | 45 | Verify | `respond-review` | Act on a reviewer agent's feedback systematically categorize findings, apply | ✅ Active |
75
+ | 46 | Verify | `run-evals` | Eval-Driven Development define capability and regression evals before buildi | ✅ Active |
76
+ | 47 | Verify | `trace-requirement` | Link story IDs from specs/release-plan.yaml + epic capsule directories to the im | ✅ Active |
77
+ | 48 | Verify | `validate-fix` | Prove a fix works before declaring done re-run the failing test, run the ful | ✅ Active |
78
+ | 49 | Verify | `verify-work` | Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-b | ✅ Active |
79
+ | 50 | Release | `commit-message` | Reviews working-tree changes, then drafts a Conventional Commits title/body and | ✅ Active |
80
+ | 51 | Release | `release-branch` | Make the merge/PR/keep/discard decision for a feature branch, verify coverage ga | ✅ Active |
81
+ | 52 | Sustain | `compose-workflow` | Chain multiple bigpowers skills into a custom workflow recipe saved in specs/. U | ✅ Active |
82
+ | 53 | Sustain | `delegate-task` | Delegate one complex task to a single subagent, review its work in two stages be | ✅ Active |
83
+ | 54 | Sustain | `dispatch-agents` | Dispatch multiple subagents in parallel on independent tasks. No waiting between | ✅ Active |
84
+ | 55 | Sustain | `edit-document` | Edit and improve documents by restructuring sections, improving clarity, and tig | ✅ Active |
85
+ | 56 | Sustain | `evolve-skill` | Benchmark-gated skill evolution consume bigpowers-benchmark report, propose | ✅ Active |
86
+ | 57 | Sustain | `migrate-spec` | Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers Y | ✅ Active |
87
+ | 58 | Sustain | `organize-workspace` | Scans the active workspace for disposable artifacts—logs, caches, stale build | ✅ Active |
88
+ | 59 | Sustain | `reset-baseline` | Restore the project to a known clean state between agent runs or experiments. Us | ✅ Active |
89
+ | 60 | Sustain | `session-state` | Track implementation decisions and progress in specs/state.yaml to prevent conte | ✅ Active |
90
+ | 61 | Sustain | `simulate-agents` | Run Mock User and Auditor agents against a feature in fresh contexts before huma | ✅ Active |
91
+ | 62 | Sustain | `stocktake-skills` | Sequential subagent batch audit of the bigpowers skill catalog — Quick Scan (c | ✅ Active |
92
+ | 63 | Sustain | `terse-mode` | Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping | ✅ Active |
93
+ | 64 | Sustain | `write-document` | Write, organize, and sync high-integrity technical documents using the BMAD meth | ✅ Active |
94
+
95
+ **Total: 64 active skills.**
95
96
 
96
97
  ---
97
98
 
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: deploy
3
+ description: "Build → verify artifact → deploy → wait → smoke deployment pipeline. Platform-agnostic (MCP or CLI), with configurable timeout, retry with exponential backoff, and integrated health-check. The deploy half of CI/CD: run after build to push to production."
4
+ model: sonnet
5
+ ---
6
+
7
+ # Deploy
8
+
9
+ > **HARD GATE** — Do not deploy without running tests first. Run `test` or your CI suite before this skill.
10
+ >
11
+ > **HARD GATE** — Use this skill from a CI/CD pipeline or post-merge on `main`/`master`. Never deploy from a feature branch.
12
+ >
13
+ > **HARD GATE** — The deploy skill orchestrates deployment; the `smoke-test` skill validates post-deploy health. Chain them: `deploy → smoke-test`.
14
+
15
+ Orchestrate a full build-to-deployment pipeline: build the artifact, verify it exists and is non-empty, invoke a platform deploy tool (MCP or CLI), poll until the deploy completes or times out, then run a baseline smoke test against the live URL.
16
+
17
+ ## Pipeline Stages
18
+
19
+ ```
20
+ build → verify artifact → deploy → wait/retry → smoke
21
+ ```
22
+
23
+ | Stage | Description | Failure mode |
24
+ |-------|-------------|-------------|
25
+ | Build | Execute the project's build command | Non-zero exit: report build error |
26
+ | Verify | Check artifact exists and is non-empty | Missing/empty: report artifact path |
27
+ | Deploy | Invoke platform deploy tool (MCP, Vercel CLI, rsync, etc.) | Non-zero exit: report deploy error |
28
+ | Wait | Poll deploy status every 30s up to `DEPLOY_TIMEOUT` (default 5 min) | Timeout: report exceeded |
29
+ | Smoke | `curl -sSf $DEPLOY_URL` as baseline health check | Non-200: report failure |
30
+
31
+ ## Process
32
+
33
+ ### 1. Detect build command
34
+
35
+ Read project manifest files in order to determine the build command:
36
+
37
+ | Manifest | Build command |
38
+ |----------|--------------|
39
+ | `package.json` | `npm run build` (or `scripts.build` value) |
40
+ | `Cargo.toml` | `cargo build --release` |
41
+ | `pyproject.toml` / `setup.py` | Depends on build backend (`poetry build`, `pip install -e .`, etc.) |
42
+ | `Makefile` | `make build` or first target named `build` |
43
+ | `AGENTS.md` / `CLAUDE.md` | Look for `build:` in project commands section |
44
+
45
+ If no manifest is found, prompt the user with: "No detected build command. Pass `--build 'npm run build'` or specify the command."
46
+
47
+ ### 2. Build the artifact
48
+
49
+ ```bash
50
+ npm run build
51
+ ```
52
+
53
+ Or the detected command from step 1. If the build fails, exit non-zero and report the build output.
54
+
55
+ ### 3. Verify the artifact
56
+
57
+ ```bash
58
+ ARTIFACT_DIR="${ARTIFACT_DIR:-dist}"
59
+ if [ ! -d "$ARTIFACT_DIR" ] || [ -z "$(ls -A "$ARTIFACT_DIR" 2>/dev/null)" ]; then
60
+ echo "FAIL: build artifact not found at $ARTIFACT_DIR"
61
+ exit 1
62
+ fi
63
+ ```
64
+
65
+ Configurable via `$ARTIFACT_DIR` environment variable (default: `dist/`).
66
+
67
+ ### 4. Deploy to platform
68
+
69
+ Platform-agnostic — supports multiple deployment targets via environment variables:
70
+
71
+ | Platform | Env var | Example |
72
+ |----------|---------|---------|
73
+ | Vercel | `VERCEL_TOKEN`, `VERCEL_PROJECT_ID` | `vercel deploy --prod --token $VERCEL_TOKEN` |
74
+ | Netlify | `NETLIFY_AUTH_TOKEN`, `NETLIFY_SITE_ID` | `netlify deploy --prod --auth $NETLIFY_AUTH_TOKEN --dir $ARTIFACT_DIR` |
75
+ | BigBase MCP | MCP tool call | `mcp deploy` via BigBase server |
76
+ | rsync/SSH | `DEPLOY_SSH_USER`, `DEPLOY_SSH_HOST`, `DEPLOY_SSH_PATH` | `rsync -avz $ARTIFACT_DIR/ $DEPLOY_SSH_USER@$DEPLOY_SSH_HOST:$DEPLOY_SSH_PATH` |
77
+ | Custom | `DEPLOY_COMMAND` | Run any deploy command string |
78
+
79
+ The deploy tool is selected by which environment variables are set. If none are configured:
80
+
81
+ ```bash
82
+ echo "No deploy target configured. Set one of: VERCEL_TOKEN, NETLIFY_AUTH_TOKEN, DEPLOY_SSH_USER+DEPLOY_SSH_HOST, DEPLOY_COMMAND, or MCP deploy tool."
83
+ exit 1
84
+ ```
85
+
86
+ ### 5. Wait and poll status
87
+
88
+ After invoking the deploy command, poll for completion:
89
+
90
+ ```bash
91
+ DEPLOY_TIMEOUT="${DEPLOY_TIMEOUT:-300}" # seconds (default 5 minutes)
92
+ DEPLOY_POLL_INTERVAL="${DEPLOY_POLL_INTERVAL:-30}" # seconds
93
+
94
+ start_time=$(date +%s)
95
+ while true; do
96
+ elapsed=$(( $(date +%s) - start_time ))
97
+ if [ "$elapsed" -ge "$DEPLOY_TIMEOUT" ]; then
98
+ echo "FAIL: deploy status polling timed out after ${DEPLOY_TIMEOUT}s"
99
+ exit 1
100
+ fi
101
+
102
+ status=$(get_deploy_status) # platform-specific status check
103
+ if [ "$status" = "ready" ] || [ "$status" = "done" ]; then
104
+ echo "Deploy completed in ${elapsed}s"
105
+ break
106
+ fi
107
+
108
+ sleep "$DEPLOY_POLL_INTERVAL"
109
+ done
110
+ ```
111
+
112
+ Use exponential backoff for retries on transient failures:
113
+
114
+ ```bash
115
+ RETRY_MAX="${RETRY_MAX:-3}"
116
+ base_delay=2
117
+ for attempt in $(seq 1 "$RETRY_MAX"); do
118
+ if deploy_command; then
119
+ break
120
+ fi
121
+ if [ "$attempt" -eq "$RETRY_MAX" ]; then
122
+ echo "FAIL: deploy failed after ${RETRY_MAX} attempts"
123
+ exit 1
124
+ fi
125
+ sleep $(( base_delay * 2 ** (attempt - 1) ))
126
+ done
127
+ ```
128
+
129
+ ### 6. Baseline smoke test
130
+
131
+ ```bash
132
+ DEPLOY_URL="${DEPLOY_URL:?DEPLOY_URL must be set}"
133
+ if curl -sSf "$DEPLOY_URL" > /dev/null 2>&1; then
134
+ echo "OK: $DEPLOY_URL responds with HTTP 200"
135
+ else
136
+ echo "FAIL: $DEPLOY_URL is not responding with HTTP 200"
137
+ exit 1
138
+ fi
139
+ ```
140
+
141
+ For comprehensive health-checking, chain to the `smoke-test` skill:
142
+
143
+ ```bash
144
+ # After deploy success
145
+ bash scripts/run-smoke.sh "$DEPLOY_URL"
146
+ ```
147
+
148
+ ## Configuration
149
+
150
+ | Variable | Default | Description |
151
+ |----------|---------|-------------|
152
+ | `ARTIFACT_DIR` | `dist` | Build output directory |
153
+ | `DEPLOY_URL` | *(required)* | Live URL for smoke test |
154
+ | `DEPLOY_TIMEOUT` | `300` | Max wait for deploy completion (seconds) |
155
+ | `DEPLOY_POLL_INTERVAL` | `30` | Polling interval (seconds) |
156
+ | `RETRY_MAX` | `3` | Max deploy retry attempts |
157
+ | `BUILD_COMMAND` | *(auto-detect)* | Override build command |
158
+
159
+ ## Verification
160
+
161
+ → verify: `test -f deploy/SKILL.md && grep -q 'name: deploy' deploy/SKILL.md && echo OK`
162
+ → verify: `grep -qi 'build\|artifact\|deploy\|smoke' deploy/SKILL.md && echo OK`
163
+ → verify: `grep -ci 'package.json\|Cargo.toml\|Makefile\|manifest' deploy/SKILL.md | awk '{if($1>=1) print "OK"; else print "FAIL"}'`
164
+ → verify: `grep -ci 'timeout\|poll\|status\|retry\|backoff' deploy/SKILL.md | awk '{if($1>=2) print "OK"; else print "FAIL"}'`
165
+ → verify: `grep -q 'curl.*DEPLOY_URL\|smoke\|health' deploy/SKILL.md && echo OK`
@@ -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.11.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
@@ -56,6 +56,7 @@ PHASE_MAP=(
56
56
  [orchestrate-project]="Build"
57
57
  [guard-git]="Build"
58
58
  [hook-commits]="Build"
59
+ [deploy]="Build"
59
60
  # Verify
60
61
  [verify-work]="Verify"
61
62
  [validate-fix]="Verify"
package/skills-lock.json CHANGED
@@ -61,6 +61,11 @@
61
61
  "sha256": "9e3b8bd7274def42",
62
62
  "path": "delegate-task/SKILL.md"
63
63
  },
64
+ "deploy": {
65
+ "description": "\"Build → verify artifact → deploy → wait → smoke deployment pipeline. Platform-agnostic (MCP or CLI), with configurable timeout, retry with exponential backoff, and integrated health-check. The deploy half of CI/CD: run after build to push to production.\"",
66
+ "sha256": "260894aa4f869093",
67
+ "path": "deploy/SKILL.md"
68
+ },
64
69
  "design-interface": {
65
70
  "description": "Generate multiple radically different interface designs for a module using parallel sub-agents, then compare trade-offs. Based on \"Design It Twice\" from A Philosophy of Software Design. Use when user wants to design an API, explore interface options, compare module shapes, or mentions \"design it twice\".",
66
71
  "sha256": "c93e3fe065857cb8",
@@ -68,7 +73,7 @@
68
73
  },
69
74
  "develop-tdd": {
70
75
  "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",
76
+ "sha256": "4002d960b18436cd",
72
77
  "path": "develop-tdd/SKILL.md"
73
78
  },
74
79
  "diagnose-root": {
@@ -193,7 +198,7 @@
193
198
  },
194
199
  "release-branch": {
195
200
  "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",
201
+ "sha256": "6b2df2c92230d098",
197
202
  "path": "release-branch/SKILL.md"
198
203
  },
199
204
  "request-review": {