bigpowers 2.7.5 → 2.9.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.7.5",
4
- "description": "62 skills — 61 agent skills for spec-driven, test-first software development by solo developers",
3
+ "version": "2.9.0",
4
+ "description": "64 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,260 @@
1
+ ---
2
+ description: "Package registry publishing for npm, crates.io, PyPI, and Homebrew. Verifies prerequisites, runs the publish command, confirms success, and surfaces actionable error hints on failure."
3
+ ---
4
+
5
+
6
+ # Publish Package
7
+
8
+ > **HARD GATE** — Do not attempt to publish without verifying prerequisites. Missing auth tokens, stale builds, or duplicate versions cause CI failures that are hard to debug post-push.
9
+ >
10
+ > **HARD GATE** — Always run `--dry-run` first. Package registries are append-only — a bad publish cannot be fully undone on most registries.
11
+
12
+ Publish packages to language-specific registries. Detects package type from manifest files, verifies publish prerequisites, runs the registry-specific publish command, and confirms the version appears on the registry.
13
+
14
+ ## Process
15
+
16
+ ### 1. Detect package type
17
+
18
+ Read the project root for manifest files to determine the package type:
19
+
20
+ | Manifest | Registry | Publish command |
21
+ |----------|----------|----------------|
22
+ | `package.json` | npm | `npm publish --access public` |
23
+ | `Cargo.toml` | crates.io | `cargo publish` |
24
+ | `setup.py` / `pyproject.toml` | PyPI | `twine upload dist/*` or `flit publish` |
25
+ | `Formula/<name>.rb` | Homebrew | `brew bump-formula-pr` |
26
+ | Multiple detected | Polyglot | Error: specify registry with `--registry <npm|crates.io|pypi|brew>` |
27
+
28
+ If no manifest is found, prompt the user to specify the type or pass `--type <npm|crates.io|pypi|brew>`.
29
+
30
+ ### 2. Verify prerequisites
31
+
32
+ Before attempting any publish, run all applicable checks:
33
+
34
+ **npm (`package.json`):**
35
+ ```bash
36
+ # Check auth token exists
37
+ if [ -z "${NPM_TOKEN:-}" ]; then
38
+ if [ ! -f ~/.npmrc ] || ! grep -q "_authToken" ~/.npmrc; then
39
+ echo "FAIL: NPM_TOKEN not set. Set via: export NPM_TOKEN=<token> or add //registry.npmjs.org/:_authToken=<token> to .npmrc"
40
+ exit 1
41
+ fi
42
+ fi
43
+
44
+ # Check version not already published
45
+ PACKAGE_NAME=$(node -p "require('./package.json').name")
46
+ CURRENT_VER=$(node -p "require('./package.json').version")
47
+ if npm view "$PACKAGE_NAME@$CURRENT_VER" version 2>/dev/null; then
48
+ echo "FAIL: Version $CURRENT_VER already published for $PACKAGE_NAME. Bump version first."
49
+ exit 1
50
+ fi
51
+
52
+ # Check build artifacts are fresh
53
+ if [ -d dist ] || [ -d lib ]; then
54
+ LATEST_BUILD=$(find dist lib 2>/dev/null -name "*.js" -o -name "*.cjs" -o -name "*.mjs" | xargs ls -t 2>/dev/null | head -1)
55
+ PACKAGE_MODIFIED=$(stat -f %m package.json 2>/dev/null || stat -c %Y package.json 2>/dev/null)
56
+ if [ -n "$LATEST_BUILD" ] && [ -n "$PACKAGE_MODIFIED" ]; then
57
+ BUILD_TIME=$(stat -f %m "$LATEST_BUILD" 2>/dev/null || stat -c %Y "$LATEST_BUILD" 2>/dev/null)
58
+ if [ "$BUILD_TIME" -lt "$PACKAGE_MODIFIED" ]; then
59
+ echo "WARNING: Build artifacts may be stale (package.json modified after last build). Run npm run build first."
60
+ fi
61
+ fi
62
+ fi
63
+
64
+ # Check CHANGELOG is updated
65
+ if [ -f CHANGELOG.md ]; then
66
+ if ! grep -q "$CURRENT_VER" CHANGELOG.md 2>/dev/null; then
67
+ echo "WARNING: Version $CURRENT_VER not found in CHANGELOG.md. Update changelog before publish."
68
+ fi
69
+ fi
70
+ ```
71
+
72
+ **crates.io (`Cargo.toml`):**
73
+ ```bash
74
+ # Check auth token exists
75
+ if [ -z "${CARGO_REGISTRY_TOKEN:-}" ]; then
76
+ if [ ! -f ~/.cargo/config.toml ] || ! grep -q "token" ~/.cargo/config.toml; then
77
+ echo "FAIL: CARGO_REGISTRY_TOKEN not set. Set via: export CARGO_REGISTRY_TOKEN=<token> or add to ~/.cargo/config.toml"
78
+ exit 1
79
+ fi
80
+ fi
81
+
82
+ # Check version not already published
83
+ CRATE_NAME=$(grep '^name' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
84
+ CURRENT_VER=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
85
+ if cargo search "$CRATE_NAME" 2>/dev/null | grep -q "^${CRATE_NAME}.*\"$CURRENT_VER\""; then
86
+ echo "FAIL: Version $CURRENT_VER already published for $CRATE_NAME. Bump version in Cargo.toml first."
87
+ exit 1
88
+ fi
89
+ ```
90
+
91
+ **PyPI (`setup.py` / `pyproject.toml`):**
92
+ ```bash
93
+ # Check auth token exists
94
+ if [ -z "${TWINE_PASSWORD:-}" ] && [ -z "${POETRY_PYPI_TOKEN_PYPI:-}" ]; then
95
+ if [ ! -f ~/.pypirc ]; then
96
+ echo "FAIL: PyPI token not configured. Set TWINE_PASSWORD or create ~/.pypirc"
97
+ exit 1
98
+ fi
99
+ fi
100
+
101
+ # Check for build artifacts
102
+ if [ ! -d dist ] || [ -z "$(ls dist/*.whl 2>/dev/null)" ]; then
103
+ echo "WARNING: No .whl files found in dist/. Run: python -m build"
104
+ fi
105
+ ```
106
+
107
+ ### 3. Run publish
108
+
109
+ After all prerequisite checks pass, run the registry-specific command:
110
+
111
+ ```bash
112
+ # npm
113
+ npm publish --access public
114
+
115
+ # crates.io
116
+ cargo publish
117
+
118
+ # PyPI
119
+ python -m twine upload dist/* # or: poetry publish
120
+
121
+ # Homebrew (opens PR, does not publish directly)
122
+ brew bump-formula-pr --url=<tarball-url> <formula-name>
123
+ ```
124
+
125
+ ### 4. Verify publish success
126
+
127
+ After publish, confirm the version appears on the registry:
128
+
129
+ ```bash
130
+ # npm
131
+ npm view "$PACKAGE_NAME" versions --json 2>/dev/null | grep -q "\"$CURRENT_VER\"" && echo "OK: npm publish confirmed"
132
+
133
+ # crates.io
134
+ cargo search "$CRATE_NAME" 2>/dev/null | grep -q "^${CRATE_NAME}.*\"$CURRENT_VER\"" && echo "OK: crates.io publish confirmed"
135
+
136
+ # PyPI
137
+ pip index versions "$PACKAGE_NAME" 2>/dev/null | grep -q "$CURRENT_VER" && echo "OK: PyPI publish confirmed"
138
+ ```
139
+
140
+ ### 5. Error handling
141
+
142
+ On failure, surface actionable hints:
143
+
144
+ ```bash
145
+ # Generic failure handler
146
+ if [ $? -ne 0 ]; then
147
+ case "$REGISTRY" in
148
+ npm)
149
+ echo "FAIL: npm publish failed."
150
+ echo " Common causes:"
151
+ echo " - NPM_TOKEN not set in secrets: add to GitHub repo secrets"
152
+ echo " - Version already published: bump version in package.json"
153
+ echo " - Two-factor auth required: use --otp=<code> flag"
154
+ echo " - Package scoped but not public: add --access public"
155
+ ;;
156
+ crates.io)
157
+ echo "FAIL: cargo publish failed."
158
+ echo " Common causes:"
159
+ echo " - CARGO_REGISTRY_TOKEN not configured: see ~/.cargo/config.toml"
160
+ echo " - Version already published: bump version in Cargo.toml"
161
+ echo " - Local changes not committed: cargo publish requires clean working tree"
162
+ ;;
163
+ pypi)
164
+ echo "FAIL: PyPI publish failed."
165
+ echo " Common causes:"
166
+ echo " - TWINE_PASSWORD not configured: set env var or ~/.pypirc"
167
+ echo " - Build artifacts missing: run python -m build first"
168
+ echo " - Version conflict: version already exists on PyPI"
169
+ ;;
170
+ esac
171
+ exit 1
172
+ fi
173
+ ```
174
+
175
+ ### 6. Dry-run mode (`--dry-run`)
176
+
177
+ Run `--dry-run` to verify all prerequisites without actually publishing:
178
+
179
+ ```bash
180
+ # Example output
181
+ $ publish-package --dry-run
182
+
183
+ [DRY-RUN] Detected package type: npm
184
+ [DRY-RUN] Package: my-package v0.4.0
185
+ [DRY-RUN] Checking NPM_TOKEN... OK
186
+ [DRY-RUN] Checking version 0.4.0 not already published... OK
187
+ [DRY-RUN] Checking build artifacts... WARNING: package.json modified after build
188
+ [DRY-RUN] Checking CHANGELOG... OK
189
+ [DRY-RUN] Would run: npm publish --access public
190
+ [DRY-RUN] Exiting without publishing.
191
+ ```
192
+
193
+ ### 7. Dry-run mode per registry
194
+
195
+ ```bash
196
+ # npm dry-run
197
+ npm publish --access public --dry-run
198
+
199
+ # crates.io dry-run (cargo does not have a publish dry-run; use --dry-run flag for validation only)
200
+ cargo package --list 2>/dev/null
201
+
202
+ # PyPI dry-run
203
+ python -m twine upload --repository testpypi dist/* # test.pypi.org
204
+ ```
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"`
@@ -0,0 +1,307 @@
1
+ ---
2
+ description: "CI pipeline setup with pre-built templates and local validation. Generates GitHub Actions workflows, validates YAML syntax and permissions, supports dry-run via act/gh. The CI equivalent of wire-observability."
3
+ ---
4
+
5
+
6
+ # Wire CI
7
+
8
+ > **HARD GATE** — Do not ship a project without CI. Run this skill before first merge to main or when adding CI to an existing project.
9
+ >
10
+ > **HARD GATE** — CI that is untestable locally will break every cycle. Always run `--validate` after generating workflows and `--dry-run` before pushing.
11
+
12
+ Generate, validate, and test CI workflows. Detects your project type, produces platform-appropriate GitHub Actions configurations, and provides local verification to catch auth, permissions, and syntax issues before they reach CI.
13
+
14
+ ## What this sets up
15
+
16
+ 1. **CI workflow** — `.github/workflows/ci.yaml` with test, lint, typecheck, build steps
17
+ 2. **Release workflow** — `.github/workflows/release.yaml` with semantic-release (if applicable)
18
+ 3. **`--validate` mode** — checks YAML syntax, workflow permissions, required secrets, and common pitfalls
19
+ 4. **`--dry-run` mode** — runs workflows locally via `act` or `gh workflow run` to prove correctness before push
20
+ 5. **Failure pattern documentation** — common CI failure categories and their fixes
21
+
22
+ ## Process
23
+
24
+ ### 1. Detect project type
25
+
26
+ Read the project root for manifest files to determine which template to use:
27
+
28
+ | Manifest | Type | Template |
29
+ |----------|------|----------|
30
+ | `Cargo.toml` | Rust | Rust CI: test, clippy, fmt, build |
31
+ | `package.json` | Node | Node CI: test, lint, typecheck, build |
32
+ | `setup.py` / `pyproject.toml` | Python | Python CI: pytest, ruff/mypy/flake8, build |
33
+ | `go.mod` | Go | Go CI: test, vet, staticcheck, build |
34
+ | `CMakeLists.txt` | C/C++ | C/C++ CI: cmake build, ctest |
35
+ | Multiple detected | Polyglot | Combined workflows or error if ambiguous |
36
+
37
+ If no manifest is found, prompt the user to specify the type or pass `--type <rust|node|python|go|cpp>`.
38
+
39
+ ### 2. Generate CI workflow
40
+
41
+ Create `.github/workflows/ci.yaml` with standard steps derived from the project type and its manifest:
42
+
43
+ **Rust template (`Cargo.toml`):**
44
+ ```yaml
45
+ name: CI
46
+ on: [push, pull_request]
47
+ jobs:
48
+ test:
49
+ runs-on: ubuntu-latest
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+ - uses: actions-rust/toolchain@v1
53
+ with:
54
+ toolchain: stable
55
+ components: clippy, rustfmt
56
+ - run: cargo fmt --all -- --check
57
+ - run: cargo clippy -- -D warnings
58
+ - run: cargo test
59
+ - run: cargo build --release
60
+ ```
61
+
62
+ **Node template (`package.json`):**
63
+ ```yaml
64
+ name: CI
65
+ on: [push, pull_request]
66
+ jobs:
67
+ test:
68
+ runs-on: ubuntu-latest
69
+ steps:
70
+ - uses: actions/checkout@v4
71
+ - uses: actions/setup-node@v4
72
+ with:
73
+ node-version: 20
74
+ cache: npm
75
+ - run: npm ci
76
+ - run: npm test
77
+ - run: npm run lint 2>/dev/null || true
78
+ - run: npm run typecheck 2>/dev/null || true
79
+ - run: npm run build 2>/dev/null || true
80
+ ```
81
+
82
+ **Python template (`setup.py` / `pyproject.toml`):**
83
+ ```yaml
84
+ name: CI
85
+ on: [push, pull_request]
86
+ jobs:
87
+ test:
88
+ runs-on: ubuntu-latest
89
+ steps:
90
+ - uses: actions/checkout@v4
91
+ - uses: actions/setup-python@v5
92
+ with:
93
+ python-version: "3.12"
94
+ cache: pip
95
+ - run: pip install -e ".[dev]" || pip install -e .
96
+ - run: pip install pytest ruff mypy
97
+ - run: ruff check .
98
+ - run: mypy . 2>/dev/null || true
99
+ - run: pytest
100
+ ```
101
+
102
+ **Go template (`go.mod`):**
103
+ ```yaml
104
+ name: CI
105
+ on: [push, pull_request]
106
+ jobs:
107
+ test:
108
+ runs-on: ubuntu-latest
109
+ steps:
110
+ - uses: actions/checkout@v4
111
+ - uses: actions/setup-go@v5
112
+ with:
113
+ go-version: stable
114
+ cache: true
115
+ - run: go vet ./...
116
+ - run: go test ./...
117
+ - run: go build ./...
118
+ ```
119
+
120
+ **C/C++ template (`CMakeLists.txt`):**
121
+ ```yaml
122
+ name: CI
123
+ on: [push, pull_request]
124
+ jobs:
125
+ test:
126
+ runs-on: ubuntu-latest
127
+ steps:
128
+ - uses: actions/checkout@v4
129
+ - run: cmake -B build
130
+ - run: cmake --build build
131
+ - run: ctest --test-dir build
132
+ ```
133
+
134
+ ### 3. Generate release workflow (if semantic-release detected)
135
+
136
+ If the project has semantic-release configured (in `package.json`, `.releaserc`, or `release.config.js`), also generate `.github/workflows/release.yaml`:
137
+
138
+ ```yaml
139
+ name: Release
140
+ on:
141
+ push:
142
+ branches: [main]
143
+ jobs:
144
+ release:
145
+ runs-on: ubuntu-latest
146
+ permissions:
147
+ contents: write
148
+ issues: write
149
+ pull-requests: write
150
+ id-token: write
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ with:
154
+ fetch-depth: 0
155
+ - uses: actions/setup-node@v4
156
+ with:
157
+ node-version: 20
158
+ cache: npm
159
+ - run: npm ci
160
+ - run: npm run build 2>/dev/null || true
161
+ - run: npx semantic-release
162
+ env:
163
+ GITHUB_TOKEN: \${{ secrets.GITHUB_TOKEN }}
164
+ NPM_TOKEN: \${{ secrets.NPM_TOKEN }}
165
+ ```
166
+
167
+ > **NPM_TOKEN is required** for publishing to npm. Without it, semantic-release will fail at the publish step. See `--validate` to check this.
168
+
169
+ ### 4. Validate workflows (`--validate`)
170
+
171
+ Run `wire-ci --validate` to check all generated workflow files:
172
+
173
+ ```bash
174
+ # Validate YAML syntax
175
+ for f in .github/workflows/*.yaml; do
176
+ python3 -c "import yaml; yaml.safe_load(open('$f'))" || echo "FAIL: $f has YAML syntax errors"
177
+ done
178
+
179
+ # Check permissions block presence
180
+ for f in .github/workflows/*.yaml; do
181
+ if grep -q "permissions:" "$f"; then
182
+ echo "OK: $f has permissions block"
183
+ else
184
+ echo "WARNING: $f missing permissions block — add one for security"
185
+ fi
186
+ done
187
+
188
+ # Check for npm publish without NPM_TOKEN
189
+ for f in .github/workflows/*.yaml; do
190
+ if grep -q "npm publish\|npx semantic-release" "$f"; then
191
+ if ! grep -q "NPM_TOKEN" "$f"; then
192
+ echo "WARNING: $f has npm publish/semantic-release but no NPM_TOKEN secret"
193
+ fi
194
+ fi
195
+ done
196
+
197
+ # Check for hardcoded Node versions
198
+ for f in .github/workflows/*.yaml; do
199
+ if grep -q "node-version: [0-9]" "$f" && grep -qv "node-version-file\|\.nvmrc" "$f"; then
200
+ echo "NOTE: $f has hardcoded Node version — consider using .nvmrc instead"
201
+ fi
202
+ done
203
+
204
+ # Check for common secrets reference errors
205
+ for f in .github/workflows/*.yaml; do
206
+ # Secrets referencing something that doesn't exist in the workflow
207
+ grep -oP 'secrets\.\w+' "$f" | sort -u | while read -r secret; do
208
+ echo "REF: $f references $secret"
209
+ done
210
+ done
211
+ ```
212
+
213
+ **Exit codes:**
214
+ - `0` — all checks pass (no errors)
215
+ - `1` — YAML syntax errors found
216
+ - `2` — validation warnings only (missing permissions, secrets, etc.)
217
+
218
+ ### 5. Dry-run workflows (`--dry-run`)
219
+
220
+ Attempt to run the generated workflows locally to catch errors before push:
221
+
222
+ ```bash
223
+ # Option A: Use act (recommended)
224
+ if command -v act &>/dev/null; then
225
+ act push --dry-run
226
+ echo "OK: act dry-run completed"
227
+ elif command -v gh &>/dev/null; then
228
+ # Option B: Use gh workflow run (remote test, no local docker)
229
+ gh workflow run ci.yaml --ref "$(git branch --show-current)"
230
+ echo "OK: CI workflow dispatched. Check status: gh run list"
231
+ else
232
+ echo "NOTE: Install act (https://github.com/nektos/act) for full local dry-run"
233
+ echo " Install gh CLI for remote dry-run"
234
+ fi
235
+ ```
236
+
237
+ > **act** runs workflows in a local Docker environment — the most accurate pre-push validation.
238
+ > **gh workflow run** sends the workflow to GitHub but doesn't execute locally — useful for checking YAML parsing but not for testing the actual steps.
239
+
240
+ ### 6. Document common CI failure patterns
241
+
242
+ Add the following to the project's documentation or CLAUDE.md after setup:
243
+
244
+ | Failure | Cause | Fix |
245
+ |---------|-------|-----|
246
+ | `npm publish` fails | `NPM_TOKEN` not set as repo secret | Add `NPM_TOKEN` to GitHub repo secrets |
247
+ | `semantic-release` fails on push | Missing `permissions: contents: write` | Add `permissions: contents: write` to release job |
248
+ | `cargo publish` auth fail | `CARGO_REGISTRY_TOKEN` not set | Add token to `~/.cargo/config.toml` or env |
249
+ | `go vet` fails | Go version mismatch | Match `go.mod` `go` directive with setup-go version |
250
+ | `cargo clippy` errors | New lints in Rust nightly | `cargo clippy --fix` or allow specific lints |
251
+ | `act` not found | Docker not running or act not installed | `brew install act` / `docker ps` to verify Docker |
252
+ | Hardcoded Node version stale | `.nvmrc` exists but workflow uses hardcoded version | Use `node-version-file: .nvmrc` instead |
253
+
254
+ ## Examples
255
+
256
+ ### Create CI for a Rust project
257
+
258
+ ```bash
259
+ # Detect from Cargo.toml, generate workflows
260
+ wire-ci
261
+
262
+ # Validate generated workflows
263
+ wire-ci --validate
264
+
265
+ # Run locally with act
266
+ wire-ci --dry-run
267
+ ```
268
+
269
+ ### Create CI for a Node project with semantic-release
270
+
271
+ ```bash
272
+ wire-ci
273
+ wire-ci --validate
274
+ # Expect warning: "npm publish step found but no NPM_TOKEN in secrets"
275
+ # Fix: add NPM_TOKEN to repo secrets
276
+ ```
277
+
278
+ ### Validate existing workflows (no generation)
279
+
280
+ ```bash
281
+ wire-ci --validate --check-only
282
+ ```
283
+
284
+ ## Options
285
+
286
+ | Flag | Description |
287
+ |------|-------------|
288
+ | `--validate` | Check YAML syntax, permissions, secrets, common pitfalls |
289
+ | `--dry-run` | Run workflows locally via `act` or dispatch via `gh` |
290
+ | `--check-only` | Only validate, do not generate new files |
291
+ | `--type <type>` | Force project type (skip auto-detection) |
292
+ | `--force` | Overwrite existing workflow files |
293
+ | `--no-release` | Skip release workflow generation even if semantic-release detected |
294
+
295
+ ## Integration with build-epic
296
+
297
+ When `wire-ci` is used as part of `build-epic`:
298
+
299
+ 1. **During develop-tdd**: If the task modifies `.github/workflows/`, run `wire-ci --validate` as a CI dry-run sub-step
300
+ 2. **During release-branch**: After push, run `gh run list --limit 1 --branch main --json status,conclusion` to verify CI passes
301
+
302
+ ## Verify
303
+
304
+ → verify: `test -f wire-ci/SKILL.md && echo "OK: skill file exists" || echo "FAIL: no skill file"`
305
+ → verify: `grep -q "name: wire-ci" wire-ci/SKILL.md && echo "OK: frontmatter" || echo "FAIL: frontmatter"`
306
+ → verify: `grep -ci "template\|workflow\|validate\|dry.run" wire-ci/SKILL.md | awk '{if($1>=3) print "OK: semantics"; else print "FAIL: missing"}'`
307
+ → verify: `grep -q "wire-ci" SKILL-INDEX.md && echo "OK: in SKILL-INDEX" || echo "FAIL: not indexed"`