bigpowers 2.76.1 → 2.76.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.76.1",
3
+ "version": "2.76.3",
4
4
  "description": "77 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"
@@ -37,6 +37,7 @@ description: "Reviews working-tree changes, then drafts a Conventional Commits t
37
37
  - [ ] **Scope** is a short noun in parentheses if it helps (e.g. `fix(api): …`).
38
38
  - [ ] Breaking changes are explicit (`!` and/or `BREAKING CHANGE:` in the body/footer).
39
39
  - [ ] Description is imperative, lowercase start after the prefix, no trailing period in the title line.
40
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By` footers** — P1 rule (CONVENTIONS.md § Git Attribution). All commits must appear as if authored solely by the human user. The git hook and `land-branch.sh` both block these.
40
41
 
41
42
  ## When not to invent a bump
42
43
 
@@ -40,9 +40,12 @@ If unsure, prefer **solo-local**.
40
40
  ```bash
41
41
  <full test command> && <typecheck command> && <lint command>
42
42
  git log main...HEAD --oneline | grep -vE "^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+$" && echo "❌ Non-conventional commits found" || echo "✅ Commits verified"
43
+ # Block AI agent attribution (P1)
44
+ git log main...HEAD --format="%B" | grep -qiE 'co[- ]authored[- ]by' && echo "❌ Co-authored-by footer found — blocked" || echo "✅ No AI attribution"
43
45
  ```
44
46
 
45
47
  - [ ] All tests pass, no type errors, no lint violations, all commits follow Conventional Commits
48
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By`** in any commit body — P1 rule (CONVENTIONS.md § Git Attribution). `land-branch.sh` blocks the merge if found.
46
49
 
47
50
  ### 2. Coverage check
48
51
 
@@ -38,6 +38,7 @@ description: "Reviews working-tree changes, then drafts a Conventional Commits t
38
38
  - [ ] **Scope** is a short noun in parentheses if it helps (e.g. `fix(api): …`).
39
39
  - [ ] Breaking changes are explicit (`!` and/or `BREAKING CHANGE:` in the body/footer).
40
40
  - [ ] Description is imperative, lowercase start after the prefix, no trailing period in the title line.
41
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By` footers** — P1 rule (CONVENTIONS.md § Git Attribution). All commits must appear as if authored solely by the human user. The git hook and `land-branch.sh` both block these.
41
42
 
42
43
  ## When not to invent a bump
43
44
 
@@ -41,9 +41,12 @@ If unsure, prefer **solo-local**.
41
41
  ```bash
42
42
  <full test command> && <typecheck command> && <lint command>
43
43
  git log main...HEAD --oneline | grep -vE "^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+$" && echo "❌ Non-conventional commits found" || echo "✅ Commits verified"
44
+ # Block AI agent attribution (P1)
45
+ git log main...HEAD --format="%B" | grep -qiE 'co[- ]authored[- ]by' && echo "❌ Co-authored-by footer found — blocked" || echo "✅ No AI attribution"
44
46
  ```
45
47
 
46
48
  - [ ] All tests pass, no type errors, no lint violations, all commits follow Conventional Commits
49
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By`** in any commit body — P1 rule (CONVENTIONS.md § Git Attribution). `land-branch.sh` blocks the merge if found.
47
50
 
48
51
  ### 2. Coverage check
49
52
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [2.76.3](https://github.com/danielvm-git/bigpowers/compare/v2.76.2...v2.76.3) (2026-07-11)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **scripts:** move Co-authored-by feature branch scan after DEFAULT_BRANCH is set ([842dfb3](https://github.com/danielvm-git/bigpowers/commit/842dfb3c8caf710f75b1bc234f3178596d2e78df))
7
+ * **security:** enforce Co-authored-by ban across all commit paths ([b8610cd](https://github.com/danielvm-git/bigpowers/commit/b8610cdb060faebf94b614354c80c052d985c40d))
8
+
9
+ ## [2.76.2](https://github.com/danielvm-git/bigpowers/compare/v2.76.1...v2.76.2) (2026-07-09)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * **ci:** add orphan gitlink guard to prevent checkout failures ([#70](https://github.com/danielvm-git/bigpowers/issues/70)) ([4325ae9](https://github.com/danielvm-git/bigpowers/commit/4325ae9fd853defbb37d63c41317278b8882a6be))
15
+
1
16
  ## [2.76.1](https://github.com/danielvm-git/bigpowers/compare/v2.76.0...v2.76.1) (2026-07-09)
2
17
 
3
18
 
@@ -107,6 +107,11 @@ if [[ "$COMMAND" =~ git[[:space:]]+commit ]] || [[ "$COMMAND" =~ git[[:space:]]+
107
107
  if [ ${#SUBJECT} -gt 72 ]; then
108
108
  deny "BLOCKED: Commit subject line must be 72 characters or less."
109
109
  fi
110
+
111
+ # Block AI agent attribution (P1 — NEVER Co-authored-by:)
112
+ if echo "$MSG" | grep -qiE '^co[- ]authored[- ]by:' || echo "$MSG" | grep -qiE '\nco[- ]authored[- ]by:'; then
113
+ deny "BLOCKED: Commit must not include Co-authored-by: footer. All commits must appear as if authored solely by the human user (CONVENTIONS.md § Git Attribution)."
114
+ fi
110
115
  fi
111
116
 
112
117
  # Block direct commits to main unless land script is active
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.76.1",
3
+ "version": "2.76.3",
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": {
@@ -41,6 +41,11 @@ if [ ${#COMMIT_MSG} -gt 72 ]; then
41
41
  land_branch_deny "Commit subject line must be 72 characters or less"
42
42
  fi
43
43
 
44
+ # Block AI agent attribution (P1 — CONVENTIONS.md § Git Attribution)
45
+ if echo "$COMMIT_MSG" | grep -qiE '^co[- ]authored[- ]by:' || echo "$COMMIT_MSG" | grep -qiE '\nco[- ]authored[- ]by:'; then
46
+ land_branch_deny "Commit must not include Co-authored-by: footer. All commits must appear as if authored solely by the human user."
47
+ fi
48
+
44
49
  # Primary worktree only (.git is a directory, not a gitdir pointer file)
45
50
  if [ -f .git ]; then
46
51
  land_branch_deny "Run from the primary repository root, not a linked worktree (cd to main repo first)"
@@ -72,6 +77,11 @@ if ! git show-ref --verify --quiet "refs/heads/$FEATURE_BRANCH"; then
72
77
  land_branch_deny "Feature branch '$FEATURE_BRANCH' does not exist"
73
78
  fi
74
79
 
80
+ # Scan all commits in feature branch for Co-authored-by: footers
81
+ if git log "$DEFAULT_BRANCH..$FEATURE_BRANCH" --format="%B" 2>/dev/null | grep -qiE '^co[- ]authored[- ]by:'; then
82
+ land_branch_deny "Feature branch '$FEATURE_BRANCH' contains Co-authored-by: footer(s). Amend commits to remove all AI agent attribution before landing."
83
+ fi
84
+
75
85
  for protected in main master; do
76
86
  if [ "$FEATURE_BRANCH" = "$protected" ]; then
77
87
  land_branch_deny "Cannot land protected branch '$FEATURE_BRANCH'"
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ # check-orphan-gitlinks.sh — fail if git index has gitlinks without .gitmodules URLs
3
+ # story: BUG-2026-07-09T033939-golden-g01-submodule-checkout
4
+ set -euo pipefail
5
+
6
+ check_orphan_gitlinks() {
7
+ local repo_root="${1:-.}"
8
+ local gitlinks orphans=0
9
+
10
+ cd "$repo_root"
11
+
12
+ while IFS= read -r path; do
13
+ [[ -z "$path" ]] && continue
14
+ if [[ ! -f .gitmodules ]] || ! git config -f .gitmodules --get "submodule.${path}.url" >/dev/null 2>&1; then
15
+ gitlinks+=("$path")
16
+ orphans=$((orphans + 1))
17
+ fi
18
+ done < <(git ls-files -s | awk '$1 == "160000" { $1=$2=$3=""; sub(/^ /, ""); print }')
19
+
20
+ if [[ "$orphans" -eq 0 ]]; then
21
+ echo "no orphan gitlinks"
22
+ return 0
23
+ fi
24
+
25
+ echo "orphan gitlink(s) without .gitmodules URL:" >&2
26
+ printf ' %s\n' "${gitlinks[@]}" >&2
27
+ return 1
28
+ }
29
+
30
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
31
+ check_orphan_gitlinks "$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
32
+ fi
@@ -137,6 +137,17 @@ else
137
137
  done
138
138
  fi
139
139
 
140
+ # ── CI: orphan gitlinks break actions/checkout submodule cleanup ───────────────
141
+ echo "--- [CI] orphan gitlinks ---"
142
+ # shellcheck source=lib/check-orphan-gitlinks.sh
143
+ source "$REPO_ROOT/scripts/lib/check-orphan-gitlinks.sh"
144
+ if check_orphan_gitlinks "$REPO_ROOT" >/dev/null; then
145
+ doctrine_pass "no orphan gitlinks"
146
+ else
147
+ doctrine_fail "git index contains gitlink(s) without .gitmodules URL — breaks actions/checkout"
148
+ check_orphan_gitlinks "$REPO_ROOT" >&2 || true
149
+ fi
150
+
140
151
  # ── CI: trace-stories wrapper smoke (REPO_ROOT must be set under set -u) ───────
141
152
  echo "--- [CI] trace-stories wrapper smoke ---"
142
153
  if bash "$REPO_ROOT/scripts/trace-stories.sh" --help >/dev/null 2>&1; then
@@ -39,6 +39,7 @@ description: Reviews working-tree changes, then drafts a Conventional Commits ti
39
39
  - [ ] **Scope** is a short noun in parentheses if it helps (e.g. `fix(api): …`).
40
40
  - [ ] Breaking changes are explicit (`!` and/or `BREAKING CHANGE:` in the body/footer).
41
41
  - [ ] Description is imperative, lowercase start after the prefix, no trailing period in the title line.
42
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By` footers** — P1 rule (CONVENTIONS.md § Git Attribution). All commits must appear as if authored solely by the human user. The git hook and `land-branch.sh` both block these.
42
43
 
43
44
  ## When not to invent a bump
44
45
 
@@ -43,9 +43,12 @@ If unsure, prefer **solo-local**.
43
43
  ```bash
44
44
  <full test command> && <typecheck command> && <lint command>
45
45
  git log main...HEAD --oneline | grep -vE "^[a-f0-9]+ (feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .+$" && echo "❌ Non-conventional commits found" || echo "✅ Commits verified"
46
+ # Block AI agent attribution (P1)
47
+ git log main...HEAD --format="%B" | grep -qiE 'co[- ]authored[- ]by' && echo "❌ Co-authored-by footer found — blocked" || echo "✅ No AI attribution"
46
48
  ```
47
49
 
48
50
  - [ ] All tests pass, no type errors, no lint violations, all commits follow Conventional Commits
51
+ - [ ] **NO `Co-authored-by` or `Co-Authored-By`** in any commit body — P1 rule (CONVENTIONS.md § Git Attribution). `land-branch.sh` blocks the merge if found.
49
52
 
50
53
  ### 2. Coverage check
51
54
 
package/skills-lock.json CHANGED
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "commit-message": {
35
35
  "description": "Reviews working-tree changes, then drafts a Conventional Commits title/body and states the semantic-release version bump a single such commit would imply. Also notes which defensive-code categories were touched. Use when the user wants to commit recent work, prepare a Conventional Commits message, or asks for semantic-release / semver-consistent messaging before git commit.",
36
- "sha256": "61d7f45ea8ccd085",
36
+ "sha256": "1ed4ef65d813a84d",
37
37
  "path": "skills/commit-messageSKILL.md"
38
38
  },
39
39
  "compose-workflow": {
@@ -238,7 +238,7 @@
238
238
  },
239
239
  "release-branch": {
240
240
  "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\".",
241
- "sha256": "5da46a5b7aa7403f",
241
+ "sha256": "7e94a540b1dc75c1",
242
242
  "path": "skills/release-branchSKILL.md"
243
243
  },
244
244
  "request-review": {
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bash
2
+ # story: BUG-2026-07-09T033939-golden-g01-submodule-checkout
3
+ # Regression: orphan gitlinks (160000) without .gitmodules URLs break actions/checkout.
4
+ set -euo pipefail
5
+
6
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
8
+ # shellcheck source=../scripts/lib/check-orphan-gitlinks.sh
9
+ source "$REPO_ROOT/scripts/lib/check-orphan-gitlinks.sh"
10
+
11
+ # Clean tree must pass.
12
+ if ! output="$(check_orphan_gitlinks "$REPO_ROOT")"; then
13
+ echo "FAIL: check_orphan_gitlinks failed on clean tree"
14
+ exit 1
15
+ fi
16
+ if [[ "$output" != "no orphan gitlinks" ]]; then
17
+ echo "FAIL: unexpected output: $output"
18
+ exit 1
19
+ fi
20
+
21
+ # Synthetic orphan: gitlink path with no .gitmodules entry must fail.
22
+ tmpdir="$(mktemp -d)"
23
+ trap 'rm -rf "$tmpdir"' EXIT
24
+ git -C "$tmpdir" init -q
25
+ git -C "$tmpdir" config user.email "test@example.com"
26
+ git -C "$tmpdir" config user.name "test"
27
+ mkdir -p "$tmpdir/sub"
28
+ echo "nested" >"$tmpdir/sub/file.txt"
29
+ git -C "$tmpdir/sub" init -q
30
+ git -C "$tmpdir/sub" add file.txt
31
+ git -C "$tmpdir/sub" commit -qm "nested"
32
+ git -C "$tmpdir" add sub
33
+ if ! check_orphan_gitlinks "$tmpdir" >/dev/null 2>&1; then
34
+ echo "PASS: synthetic orphan gitlink correctly rejected"
35
+ exit 0
36
+ fi
37
+
38
+ echo "FAIL: check_orphan_gitlinks should reject orphan gitlink in synthetic repo"
39
+ exit 1