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 +1 -1
- package/.pi/prompts/commit-message.md +1 -0
- package/.pi/prompts/release-branch.md +3 -0
- package/.pi/skills/commit-message/SKILL.md +1 -0
- package/.pi/skills/release-branch/SKILL.md +3 -0
- package/CHANGELOG.md +15 -0
- package/hooks/pre-tool-use.sh +5 -0
- package/package.json +1 -1
- package/scripts/land-branch.sh +10 -0
- package/scripts/lib/check-orphan-gitlinks.sh +32 -0
- package/scripts/validate-doctrine.sh +11 -0
- package/skills/commit-message/SKILL.md +1 -0
- package/skills/release-branch/SKILL.md +3 -0
- package/skills-lock.json +2 -2
- package/tests/test-no-orphan-gitlinks.sh +39 -0
package/.pi/package.json
CHANGED
|
@@ -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
|
|
package/hooks/pre-tool-use.sh
CHANGED
|
@@ -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
package/scripts/land-branch.sh
CHANGED
|
@@ -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": "
|
|
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": "
|
|
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
|