bigpowers 2.87.5 → 2.87.7

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.87.5",
3
+ "version": "2.87.7",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "gemini-extension"
package/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.87.5",
3
+ "version": "2.87.7",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [2.87.7](https://github.com/danielvm-git/bigpowers/compare/v2.87.6...v2.87.7) (2026-09-01)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **packaging:** ship wire-ci CI templates in the npm tarball ([#115](https://github.com/danielvm-git/bigpowers/issues/115)) ([26df32b](https://github.com/danielvm-git/bigpowers/commit/26df32bc88310950863715dc26ca9c97dcaa4601)), closes [#113](https://github.com/danielvm-git/bigpowers/issues/113)
7
+
8
+ ## [2.87.6](https://github.com/danielvm-git/bigpowers/compare/v2.87.5...v2.87.6) (2026-09-01)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **install:** refuse to replace non-managed files or dirs during setup ([#114](https://github.com/danielvm-git/bigpowers/issues/114)) ([f866adc](https://github.com/danielvm-git/bigpowers/commit/f866adca03901fc3a2797e968f866176cf604891)), closes [#112](https://github.com/danielvm-git/bigpowers/issues/112)
14
+
1
15
  ## [2.87.5](https://github.com/danielvm-git/bigpowers/compare/v2.87.4...v2.87.5) (2026-08-07)
2
16
 
3
17
 
@@ -0,0 +1,89 @@
1
+ # story: e37s01
2
+ # story: e45s21
3
+ # story: e81s01
4
+ # scenario: SC-e37s01-P1-01
5
+ # [Project Name] — AI Agents
6
+
7
+ > **Multi-agent context** — This file is the canonical project context for **Cline**, **Aider**, **OpenCode**, and other AGENTS.md-native tools. Claude Code and Cursor read it via the `CLAUDE.md` symlink.
8
+
9
+ Read CONVENTIONS.md before any GitHub or git operation.
10
+
11
+ <!-- BEGIN bigpowers:context-routing -->
12
+ ## Context Routing
13
+
14
+ Load subdirectory context by file glob — see project-specific routing table (seeded by `seed-conventions`).
15
+ <!-- END bigpowers:context-routing -->
16
+
17
+ <!-- BEGIN bigpowers:learned-preferences -->
18
+ ## Learned User Preferences
19
+
20
+ - (none yet — updated via `session-state`)
21
+
22
+ ## Workspace Facts
23
+
24
+ - (none yet — durable facts discovered across sessions)
25
+ <!-- END bigpowers:learned-preferences -->
26
+
27
+ <!-- BEGIN bigpowers:project -->
28
+ ## Project
29
+
30
+ [One sentence. What this codebase does.]
31
+ Stack: [language, framework, runtime]
32
+
33
+ ## Commands
34
+
35
+ | Action | Command |
36
+ |--------|---------|
37
+ | Run | `[cmd]` |
38
+ | Test | `[cmd]` or N/A |
39
+ | Build | `[cmd]` |
40
+ | Lint | `[cmd]` |
41
+ | Preflight | `[test && lint && build chain — or user-named full-green cmd]` |
42
+ | CI | `gh pr checks` (when a PR is open) |
43
+
44
+ ## Test
45
+
46
+ `[cmd]` or N/A
47
+
48
+ ## Lint
49
+
50
+ `[cmd]` or N/A
51
+
52
+ ## Build
53
+
54
+ `[cmd]` or N/A
55
+
56
+ ## Architecture
57
+
58
+ [1–2 sentences. Key modules and their relationships.]
59
+
60
+ ## Conventions
61
+
62
+ - [e.g. Named exports only]
63
+ - [e.g. All queries go through the repository layer]
64
+
65
+ ## Never
66
+
67
+ - Never dismiss reproducible gate failures as pre-existing or out of scope
68
+ - Never proceed on red Preflight or red CI — invoke quick-fix or fix-bug first
69
+ - [Hard stop — e.g. Never touch legacy/]
70
+
71
+ ## Agent Rules
72
+
73
+ - **Workflow Mandate:** Use bigpowers skills (e.g. `plan-work`, `develop-tdd`) for structured work.
74
+ - **Always Green:** Preflight and CI must be green before forward work.
75
+ - Read specs/ and CONVENTIONS.md before writing code.
76
+ - Write the minimum code that solves the stated problem.
77
+ - Run tests after every change. Show evidence before declaring done.
78
+ - All planning output goes in specs/.
79
+
80
+ ## Token Economy — Minimal Footprint
81
+
82
+ > Production-safe subset of the 8-rule AGENTS.md pattern (Vercel engineer, ~60B tokens).
83
+ > Rule 1 ("no backward compatibility") is excluded deliberately: it risks data loss in production.
84
+
85
+ 1. **Check existing dependencies first.** DO inspect what your current dependencies already do before adding a package or writing your own code.
86
+ 2. **Prefer mature, maintained libraries.** DO NOT rewrite a capability a maintained library provides without a documented reason.
87
+ 3. **Copy validated patterns.** DO study how established products solve the same problem before inventing a new approach.
88
+ 4. **Keep the simplest working implementation.** DO write the least code that satisfies the stated requirement. NEVER add preventive abstraction or unused config layers.
89
+ <!-- END bigpowers:project -->
@@ -0,0 +1,68 @@
1
+ # Bundled bigpowers CI template — Go. See test-build-release-node.yml for
2
+ # the override mechanism (BIGPOWERS_CI_TEMPLATES). GH #104.
3
+ name: Test Build Release
4
+
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ pull_request:
9
+ branches: [main]
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ lint:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+ # Read the version from go.mod so `go vet` cannot drift from the module.
20
+ - uses: actions/setup-go@v5
21
+ with:
22
+ go-version-file: go.mod
23
+ cache: true
24
+ - run: go vet ./...
25
+
26
+ test:
27
+ runs-on: ubuntu-latest
28
+ needs: lint
29
+ steps:
30
+ - uses: actions/checkout@v6
31
+ - uses: actions/setup-go@v5
32
+ with:
33
+ go-version-file: go.mod
34
+ cache: true
35
+ - run: go test ./... -race
36
+
37
+ build:
38
+ runs-on: ubuntu-latest
39
+ needs: test
40
+ steps:
41
+ - uses: actions/checkout@v6
42
+ - uses: actions/setup-go@v5
43
+ with:
44
+ go-version-file: go.mod
45
+ cache: true
46
+ - run: go build ./...
47
+ - uses: actions/upload-artifact@v4
48
+ with:
49
+ name: dist
50
+ path: bin/
51
+ if-no-files-found: ignore
52
+
53
+ release:
54
+ runs-on: ubuntu-latest
55
+ needs: build
56
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
57
+ permissions:
58
+ contents: write
59
+ steps:
60
+ - uses: actions/checkout@v6
61
+ with:
62
+ fetch-depth: 0
63
+ - uses: actions/download-artifact@v4
64
+ with:
65
+ name: dist
66
+ path: bin/
67
+ continue-on-error: true
68
+ - run: echo "Add your release step (goreleaser, gh release create, ...) here"
@@ -0,0 +1,87 @@
1
+ # Bundled bigpowers CI template — Node.
2
+ # Ships inside the npm package so `wire-ci` has no network dependency on any
3
+ # third party's repository (GH #104). Override the source with
4
+ # BIGPOWERS_CI_TEMPLATES=/path/to/your/templates to use your own org templates.
5
+ #
6
+ # Keep `name:` as "Test Build Release" — deploy.yml listens for it via workflow_run.
7
+ name: Test Build Release
8
+
9
+ on:
10
+ push:
11
+ branches: [main]
12
+ pull_request:
13
+ branches: [main]
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ jobs:
19
+ lint:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v6
23
+ - uses: actions/setup-node@v4
24
+ with:
25
+ node-version-file: .nvmrc
26
+ cache: npm
27
+ - run: npm ci
28
+ - run: npm run lint --if-present
29
+
30
+ test:
31
+ runs-on: ubuntu-latest
32
+ needs: lint
33
+ steps:
34
+ - uses: actions/checkout@v6
35
+ - uses: actions/setup-node@v4
36
+ with:
37
+ node-version-file: .nvmrc
38
+ cache: npm
39
+ - run: npm ci
40
+ - run: npm test
41
+
42
+ build:
43
+ runs-on: ubuntu-latest
44
+ needs: test
45
+ steps:
46
+ - uses: actions/checkout@v6
47
+ - uses: actions/setup-node@v4
48
+ with:
49
+ node-version-file: .nvmrc
50
+ cache: npm
51
+ - run: npm ci
52
+ - run: npm run build --if-present
53
+ - uses: actions/upload-artifact@v4
54
+ with:
55
+ name: dist
56
+ path: dist/
57
+ if-no-files-found: ignore
58
+
59
+ release:
60
+ runs-on: ubuntu-latest
61
+ needs: build
62
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
63
+ permissions:
64
+ contents: write
65
+ issues: write
66
+ pull-requests: write
67
+ id-token: write
68
+ steps:
69
+ - uses: actions/checkout@v6
70
+ with:
71
+ fetch-depth: 0
72
+ - uses: actions/setup-node@v4
73
+ with:
74
+ node-version-file: .nvmrc
75
+ cache: npm
76
+ - run: npm ci
77
+ # Reuse the build output rather than rebuilding — a rebuilt binary is not
78
+ # the artifact that was tested.
79
+ - uses: actions/download-artifact@v4
80
+ with:
81
+ name: dist
82
+ path: dist/
83
+ continue-on-error: true
84
+ - run: npx semantic-release
85
+ env:
86
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
87
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,74 @@
1
+ # Bundled bigpowers CI template — Python. See test-build-release-node.yml for
2
+ # the override mechanism (BIGPOWERS_CI_TEMPLATES). GH #104.
3
+ name: Test Build Release
4
+
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ pull_request:
9
+ branches: [main]
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ env:
15
+ PYTHON_VERSION: '3.12'
16
+
17
+ jobs:
18
+ lint:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v6
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ env.PYTHON_VERSION }}
25
+ cache: pip
26
+ - run: pip install -r requirements.txt
27
+ - run: ruff check .
28
+
29
+ test:
30
+ runs-on: ubuntu-latest
31
+ needs: lint
32
+ steps:
33
+ - uses: actions/checkout@v6
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: ${{ env.PYTHON_VERSION }}
37
+ cache: pip
38
+ - run: pip install -r requirements.txt
39
+ - run: pytest
40
+
41
+ build:
42
+ runs-on: ubuntu-latest
43
+ needs: test
44
+ steps:
45
+ - uses: actions/checkout@v6
46
+ - uses: actions/setup-python@v5
47
+ with:
48
+ python-version: ${{ env.PYTHON_VERSION }}
49
+ - run: pip install build
50
+ - run: python -m build
51
+ - uses: actions/upload-artifact@v4
52
+ with:
53
+ name: dist
54
+ path: dist/
55
+ if-no-files-found: ignore
56
+
57
+ release:
58
+ runs-on: ubuntu-latest
59
+ needs: build
60
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
61
+ permissions:
62
+ contents: write
63
+ id-token: write
64
+ steps:
65
+ - uses: actions/checkout@v6
66
+ with:
67
+ fetch-depth: 0
68
+ - uses: actions/download-artifact@v4
69
+ with:
70
+ name: dist
71
+ path: dist/
72
+ - uses: pypa/gh-action-pypi-publish@release/v1
73
+ with:
74
+ skip-existing: true
@@ -0,0 +1,67 @@
1
+ # Bundled bigpowers CI template — Rust. See test-build-release-node.yml for
2
+ # the override mechanism (BIGPOWERS_CI_TEMPLATES). GH #104.
3
+ name: Test Build Release
4
+
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ pull_request:
9
+ branches: [main]
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ env:
15
+ CARGO_TERM_COLOR: always
16
+
17
+ jobs:
18
+ lint:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v6
22
+ - uses: dtolnay/rust-toolchain@stable
23
+ with:
24
+ components: clippy, rustfmt
25
+ - uses: Swatinem/rust-cache@v2
26
+ - run: cargo fmt --check
27
+ # Pin clippy to the stable toolchain above: new nightly lints otherwise
28
+ # break CI on days nobody changed the code.
29
+ - run: cargo clippy --all-targets -- -D warnings
30
+
31
+ test:
32
+ runs-on: ubuntu-latest
33
+ needs: lint
34
+ steps:
35
+ - uses: actions/checkout@v6
36
+ - uses: dtolnay/rust-toolchain@stable
37
+ - uses: Swatinem/rust-cache@v2
38
+ - run: cargo test --all
39
+
40
+ build:
41
+ runs-on: ubuntu-latest
42
+ needs: test
43
+ steps:
44
+ - uses: actions/checkout@v6
45
+ - uses: dtolnay/rust-toolchain@stable
46
+ - uses: Swatinem/rust-cache@v2
47
+ - run: cargo build --release
48
+ - uses: actions/upload-artifact@v4
49
+ with:
50
+ name: dist
51
+ path: target/release/
52
+ if-no-files-found: ignore
53
+
54
+ release:
55
+ runs-on: ubuntu-latest
56
+ needs: build
57
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
58
+ permissions:
59
+ contents: write
60
+ steps:
61
+ - uses: actions/checkout@v6
62
+ with:
63
+ fetch-depth: 0
64
+ - uses: dtolnay/rust-toolchain@stable
65
+ - run: cargo publish --no-verify
66
+ env:
67
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.87.5",
3
+ "version": "2.87.7",
4
4
  "description": "73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -19,6 +19,31 @@
19
19
  const fs = require('fs');
20
20
  const path = require('path');
21
21
 
22
+ // Package root — every link the installer creates points back into this
23
+ // directory, which is how "managed" is detected (see assertReplaceable).
24
+ const REPO_ROOT = path.resolve(__dirname, '..', '..');
25
+
26
+ // Refuse to replace a destination that is not already a bigpowers-managed
27
+ // symlink. Prevents setup from silently destroying a user's own file or
28
+ // directory (e.g. an existing ~/.claude/hooks/rtk-rewrite.sh installed by
29
+ // RTK itself, or a user-authored skills dir with a colliding name). (#112)
30
+ function assertReplaceable(dst) {
31
+ let st;
32
+ try {
33
+ st = fs.lstatSync(dst);
34
+ } catch {
35
+ return; // nothing there — safe to create
36
+ }
37
+ if (st.isSymbolicLink()) {
38
+ const target = fs.readlinkSync(dst);
39
+ if (target.startsWith(REPO_ROOT)) return; // managed by bigpowers — safe to re-link
40
+ }
41
+ throw new Error(
42
+ `Refusing to replace ${dst}: it exists and is not a bigpowers-managed symlink. ` +
43
+ `Back it up or remove it manually, then re-run setup.`
44
+ );
45
+ }
46
+
22
47
  function linkSkills(skillsDir, targetDir) {
23
48
  for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
24
49
  if (!entry.isDirectory()) continue;
@@ -27,11 +52,8 @@ function linkSkills(skillsDir, targetDir) {
27
52
  const src = path.join(skillsDir, entry.name);
28
53
  const dst = path.join(targetDir, entry.name);
29
54
 
30
- // Remove existing symlink or directory
31
- try {
32
- fs.rmSync(dst, { force: true, recursive: true });
33
- } catch {}
34
-
55
+ assertReplaceable(dst);
56
+ fs.rmSync(dst, { force: true });
35
57
  fs.symlinkSync(src, dst);
36
58
  }
37
59
  }
@@ -42,18 +64,14 @@ function linkDir(src, dst) {
42
64
  `Link source missing: ${src} (run bash scripts/sync-skills.sh first)`
43
65
  );
44
66
  }
45
- // Remove existing symlink or directory
46
- try {
47
- fs.rmSync(dst, { force: true, recursive: true });
48
- } catch {}
67
+ assertReplaceable(dst);
68
+ fs.rmSync(dst, { force: true });
49
69
  fs.symlinkSync(src, dst);
50
70
  }
51
71
 
52
72
  function linkFile(src, dst) {
53
- // Remove existing symlink or file
54
- try {
55
- fs.rmSync(dst, { force: true });
56
- } catch {}
73
+ assertReplaceable(dst);
74
+ fs.rmSync(dst, { force: true });
57
75
  fs.symlinkSync(src, dst);
58
76
  }
59
77
 
@@ -82,10 +100,8 @@ function linkHook(src, dst) {
82
100
  `Hook source missing: ${src} (expected under repo skills/ or scripts/hooks/; fix path or restore file)`
83
101
  );
84
102
  }
85
- // Remove existing symlink or file
86
- try {
87
- fs.rmSync(dst, { force: true });
88
- } catch {}
103
+ assertReplaceable(dst);
104
+ fs.rmSync(dst, { force: true });
89
105
  fs.symlinkSync(src, dst);
90
106
  try { fs.chmodSync(src, 0o755); } catch {}
91
107
  }
@@ -230,6 +230,7 @@ try {
230
230
  '.cursor/rules',
231
231
  '.pi/skills',
232
232
  'skills/audit-code/SKILL.md',
233
+ 'docs/templates/ci/github/test-build-release-node.yml',
233
234
  ];
234
235
  const isIgnored = (p) =>
235
236
  npmignore.some((pat) => {
@@ -244,6 +245,30 @@ try {
244
245
  }
245
246
  }
246
247
 
248
+ // story: #113 — wire-ci templates must actually ship in the npm tarball.
249
+ // The .npmignore pattern check above is necessary but not sufficient (it
250
+ // cannot model gitignore negation); prove it with a real pack listing.
251
+ {
252
+ const { execSync } = require('child_process');
253
+ const packOut = execSync('npm pack --dry-run 2>&1', {
254
+ cwd: ROOT,
255
+ encoding: 'utf8',
256
+ maxBuffer: 16 * 1024 * 1024,
257
+ });
258
+ for (const tpl of [
259
+ 'docs/templates/ci/github/test-build-release-node.yml',
260
+ 'docs/templates/ci/github/test-build-release-rust.yml',
261
+ 'docs/templates/ci/github/test-build-release-python.yml',
262
+ 'docs/templates/ci/github/test-build-release-go.yml',
263
+ 'docs/templates/AGENTS.md',
264
+ ]) {
265
+ assert.ok(
266
+ packOut.includes(tpl),
267
+ `npm tarball must include ${tpl} (wire-ci templates, #113)`
268
+ );
269
+ }
270
+ }
271
+
247
272
  console.log('test-install-helpers: ALL PASS');
248
273
  } finally {
249
274
  rmSync(tmpHome, { recursive: true, force: true });