bigpowers 2.50.0 → 2.52.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 +1 -1
- package/.pi/prompts/plan-release.md +0 -1
- package/.pi/prompts/release-branch.md +74 -56
- package/.pi/prompts/session-state.md +2 -0
- package/.pi/prompts/survey-context.md +1 -1
- package/.pi/skills/plan-release/SKILL.md +0 -1
- package/.pi/skills/release-branch/SKILL.md +74 -56
- package/.pi/skills/session-state/SKILL.md +2 -0
- package/.pi/skills/survey-context/SKILL.md +1 -1
- package/CHANGELOG.md +23 -0
- package/CLAUDE.md +9 -0
- package/package.json +1 -1
- package/scripts/audit-compliance.sh +1 -4
- package/scripts/record-cycle-time.sh +340 -0
- package/scripts/trace-stories.sh +612 -0
- package/scripts/validate-okf.sh +198 -0
- package/scripts/wait-for-ci.sh +130 -0
- package/skills/align-grid/SKILL.md +1 -0
- package/skills/assess-impact/SKILL.md +1 -0
- package/skills/audit-code/SKILL.md +1 -0
- package/skills/audit-plan/SKILL.md +1 -0
- package/skills/build-epic/SKILL.md +1 -0
- package/skills/change-request/SKILL.md +1 -0
- package/skills/commit-message/SKILL.md +1 -0
- package/skills/compose-workflow/SKILL.md +1 -0
- package/skills/craft-skill/SKILL.md +1 -0
- package/skills/deepen-architecture/SKILL.md +1 -0
- package/skills/define-language/SKILL.md +1 -0
- package/skills/define-success/SKILL.md +1 -0
- package/skills/delegate-task/SKILL.md +1 -0
- package/skills/deploy/SKILL.md +1 -0
- package/skills/design-interface/SKILL.md +1 -0
- package/skills/develop-tdd/SKILL.md +1 -0
- package/skills/diagnose-root/SKILL.md +1 -0
- package/skills/dispatch-agents/SKILL.md +1 -0
- package/skills/edit-document/SKILL.md +1 -0
- package/skills/elaborate-spec/SKILL.md +1 -0
- package/skills/enforce-first/SKILL.md +1 -0
- package/skills/evolve-skill/SKILL.md +1 -0
- package/skills/execute-plan/SKILL.md +1 -0
- package/skills/extract-design/SKILL.md +1 -0
- package/skills/fix-bug/SKILL.md +1 -0
- package/skills/grill-me/SKILL.md +1 -0
- package/skills/grill-with-docs/SKILL.md +1 -0
- package/skills/guard-git/SKILL.md +1 -0
- package/skills/hook-commits/SKILL.md +1 -0
- package/skills/inspect-quality/SKILL.md +1 -0
- package/skills/investigate-bug/SKILL.md +1 -0
- package/skills/kickoff-branch/SKILL.md +1 -0
- package/skills/map-codebase/SKILL.md +1 -0
- package/skills/migrate-spec/SKILL.md +1 -0
- package/skills/model-domain/SKILL.md +1 -0
- package/skills/orchestrate-project/SKILL.md +1 -0
- package/skills/organize-workspace/SKILL.md +1 -0
- package/skills/plan-refactor/SKILL.md +1 -0
- package/skills/plan-release/SKILL.md +1 -1
- package/skills/plan-work/SKILL.md +1 -0
- package/skills/publish-package/SKILL.md +1 -0
- package/skills/quick-fix/SKILL.md +1 -0
- package/skills/release-branch/REFERENCE.md +57 -54
- package/skills/release-branch/SKILL.md +20 -4
- package/skills/request-review/SKILL.md +1 -0
- package/skills/research-first/SKILL.md +1 -0
- package/skills/reset-baseline/SKILL.md +1 -0
- package/skills/respond-review/SKILL.md +1 -0
- package/skills/run-benchmark/SKILL.md +1 -0
- package/skills/run-evals/SKILL.md +1 -0
- package/skills/run-planning/SKILL.md +1 -0
- package/skills/scope-work/SKILL.md +1 -0
- package/skills/search-skills/SKILL.md +1 -0
- package/skills/security-review/SKILL.md +1 -0
- package/skills/seed-conventions/SKILL.md +1 -0
- package/skills/session-state/SKILL.md +3 -0
- package/skills/setup-environment/SKILL.md +1 -0
- package/skills/simulate-agents/SKILL.md +1 -0
- package/skills/slice-tasks/SKILL.md +1 -0
- package/skills/smoke-test/SKILL.md +1 -0
- package/skills/spike-prototype/SKILL.md +1 -0
- package/skills/stocktake-skills/SKILL.md +1 -0
- package/skills/survey-context/SKILL.md +2 -1
- package/skills/terse-mode/SKILL.md +1 -0
- package/skills/trace-requirement/SKILL.md +1 -0
- package/skills/using-bigpowers/SKILL.md +1 -0
- package/skills/validate-contracts/SKILL.md +1 -0
- package/skills/validate-fix/SKILL.md +1 -0
- package/skills/verify-work/SKILL.md +1 -0
- package/skills/visual-dashboard/SKILL.md +1 -0
- package/skills/wire-ci/SKILL.md +1 -0
- package/skills/wire-observability/SKILL.md +1 -0
- package/skills/write-document/SKILL.md +1 -0
- package/skills-lock.json +72 -72
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# validate-okf.sh — provenance gate for OKF story-metrics bundles (e40/e31 style).
|
|
4
|
+
#
|
|
5
|
+
# A bundle is valid iff:
|
|
6
|
+
# 1. The generator ran (generator field matches scripts/record-cycle-time.sh).
|
|
7
|
+
# 2. commit_range resolves to real commits in the repo.
|
|
8
|
+
# 3. Source enum is valid (measured|estimated|backfilled).
|
|
9
|
+
# 4. Required keys are present with correct aggregation tags.
|
|
10
|
+
#
|
|
11
|
+
# This script gates on PROVENANCE, NEVER on a specific metric value.
|
|
12
|
+
# Gate on freshness (did the right generator run?) not on outcomes.
|
|
13
|
+
#
|
|
14
|
+
# Usage:
|
|
15
|
+
# scripts/validate-okf.sh [--dir <path>] [--help]
|
|
16
|
+
# scripts/validate-okf.sh --bundle <file> # validate a single bundle
|
|
17
|
+
#
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || { echo "validate-okf: not inside a git repo"; exit 1; }
|
|
21
|
+
METRICS_DIR="$ROOT/specs/metrics"
|
|
22
|
+
EXIT_CODE=0
|
|
23
|
+
REQUIRED_KEYS="id epic bcps commit_range source generated_at generator"
|
|
24
|
+
VALID_SOURCES="measured estimated backfilled"
|
|
25
|
+
|
|
26
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[0;33m'; NC='\033[0m'
|
|
27
|
+
|
|
28
|
+
usage() {
|
|
29
|
+
cat <<'EOF'
|
|
30
|
+
Usage: scripts/validate-okf.sh [flags]
|
|
31
|
+
|
|
32
|
+
Flags:
|
|
33
|
+
--dir <path> Validate all OKF bundles in directory (default: specs/metrics/)
|
|
34
|
+
--bundle <file> Validate a single OKF bundle
|
|
35
|
+
--help Show this message
|
|
36
|
+
|
|
37
|
+
Description:
|
|
38
|
+
Provenance gate for OKF story-metrics bundles. Validates that:
|
|
39
|
+
- Required keys are present (id, epic, bcps, commit_range, source, generated_at, generator)
|
|
40
|
+
- Source enum is valid (measured|estimated|backfilled)
|
|
41
|
+
- Generator matches scripts/record-cycle-time.sh
|
|
42
|
+
- commit_range resolves to real commits
|
|
43
|
+
- Aggregation tags are present (Σ, ⌀, %, •)
|
|
44
|
+
|
|
45
|
+
NEVER gates on a specific metric value — only on provenance and freshness.
|
|
46
|
+
EOF
|
|
47
|
+
exit 0
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Parse a single YAML frontmatter block from an OKF bundle .md file.
|
|
51
|
+
# Returns the frontmatter as JSON via Python (which handles YAML safely).
|
|
52
|
+
parse_frontmatter() {
|
|
53
|
+
local file="$1"
|
|
54
|
+
# Extract YAML frontmatter between --- markers
|
|
55
|
+
python3 -c "
|
|
56
|
+
import yaml, sys
|
|
57
|
+
content = open('$file').read()
|
|
58
|
+
parts = content.split('---')
|
|
59
|
+
if len(parts) < 3:
|
|
60
|
+
sys.exit(1)
|
|
61
|
+
try:
|
|
62
|
+
fm = yaml.safe_load(parts[1])
|
|
63
|
+
if fm is None:
|
|
64
|
+
sys.exit(1)
|
|
65
|
+
# Emit as JSON for bash
|
|
66
|
+
import json
|
|
67
|
+
print(json.dumps(fm))
|
|
68
|
+
except Exception as e:
|
|
69
|
+
print(f'validate-okf: YAML parse error in $file: {e}', file=sys.stderr)
|
|
70
|
+
sys.exit(1)
|
|
71
|
+
" 2>/dev/null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
validate_bundle() {
|
|
75
|
+
local file="$1"
|
|
76
|
+
local bundle_name; bundle_name="$(basename "$file")"
|
|
77
|
+
|
|
78
|
+
# Parse frontmatter
|
|
79
|
+
local fm
|
|
80
|
+
fm="$(parse_frontmatter "$file")" || {
|
|
81
|
+
printf "${RED}FAIL${NC} %s: cannot parse YAML frontmatter\n" "$bundle_name"
|
|
82
|
+
EXIT_CODE=1
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Check okf_kind
|
|
87
|
+
local kind
|
|
88
|
+
kind="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('okf_kind',''))" 2>/dev/null)"
|
|
89
|
+
if [ "$kind" != "story-metrics" ]; then
|
|
90
|
+
printf "${YELLOW}SKIP${NC} %s: not a story-metrics bundle (kind=%s)\n" "$bundle_name" "${kind:-none}"
|
|
91
|
+
return
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Check required keys
|
|
95
|
+
for key in $REQUIRED_KEYS; do
|
|
96
|
+
local val
|
|
97
|
+
val="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('$key',''))" 2>/dev/null)"
|
|
98
|
+
if [ -z "$val" ] || [ "$val" = "null" ] || [ "$val" = "None" ]; then
|
|
99
|
+
printf "${RED}FAIL${NC} %s: missing required key '%s'\n" "$bundle_name" "$key"
|
|
100
|
+
EXIT_CODE=1
|
|
101
|
+
return
|
|
102
|
+
fi
|
|
103
|
+
done
|
|
104
|
+
|
|
105
|
+
# Check source enum
|
|
106
|
+
local source
|
|
107
|
+
source="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['source'])" 2>/dev/null)"
|
|
108
|
+
if ! echo "$VALID_SOURCES" | grep -qw "$source"; then
|
|
109
|
+
printf "${RED}FAIL${NC} %s: invalid source '%s' — must be one of: %s\n" "$bundle_name" "$source" "$VALID_SOURCES"
|
|
110
|
+
EXIT_CODE=1
|
|
111
|
+
return
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Check generator
|
|
115
|
+
local generator
|
|
116
|
+
generator="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['generator'])" 2>/dev/null)"
|
|
117
|
+
if [ "$generator" != "scripts/record-cycle-time.sh" ]; then
|
|
118
|
+
printf "${RED}FAIL${NC} %s: wrong generator '%s' — expected scripts/record-cycle-time.sh\n" "$bundle_name" "$generator"
|
|
119
|
+
EXIT_CODE=1
|
|
120
|
+
return
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Check commit_range resolves
|
|
124
|
+
local commit_range
|
|
125
|
+
commit_range="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['commit_range'])" 2>/dev/null)"
|
|
126
|
+
if ! git -C "$ROOT" log --oneline -1 "$commit_range" >/dev/null 2>&1; then
|
|
127
|
+
printf "${RED}FAIL${NC} %s: commit_range '%s' does not resolve\n" "$bundle_name" "$commit_range"
|
|
128
|
+
EXIT_CODE=1
|
|
129
|
+
return
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# Check aggregation tags exist (not empty, but don't validate correctness)
|
|
133
|
+
local effort_hours
|
|
134
|
+
effort_hours="$(echo "$fm" | python3 -c "import json,sys; d=json.load(sys.stdin); e=d.get('effort',{}); print(e.get('effort_hours',''))" 2>/dev/null)"
|
|
135
|
+
if [ -z "$effort_hours" ] || [ "$effort_hours" = "null" ]; then
|
|
136
|
+
printf "${RED}FAIL${NC} %s: effort.effort_hours missing or null\n" "$bundle_name"
|
|
137
|
+
EXIT_CODE=1
|
|
138
|
+
return
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# Bounds sanity (effort can't be negative)
|
|
142
|
+
python3 -c "
|
|
143
|
+
import json, sys
|
|
144
|
+
d = json.load(sys.stdin)
|
|
145
|
+
eff = d.get('effort', {}).get('effort_hours')
|
|
146
|
+
if eff is not None and eff < 0:
|
|
147
|
+
sys.exit(1)
|
|
148
|
+
" <<< "$fm" 2>/dev/null || {
|
|
149
|
+
printf "${RED}FAIL${NC} %s: effort_hours out of bounds\n" "$bundle_name"
|
|
150
|
+
EXIT_CODE=1
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
printf "${GREEN}PASS${NC} %s (source=%s, generator=%s, commit_range resolves)\n" "$bundle_name" "$source" "$generator"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
# ---- main ----------------------------------------------------------------
|
|
158
|
+
DIR=""
|
|
159
|
+
BUNDLE=""
|
|
160
|
+
|
|
161
|
+
[ $# -ge 1 ] || set -- "--dir" "$METRICS_DIR" # default: validate specs/metrics/
|
|
162
|
+
|
|
163
|
+
while [ $# -gt 0 ]; do
|
|
164
|
+
case "$1" in
|
|
165
|
+
--dir) DIR="$2"; shift 2 ;;
|
|
166
|
+
--bundle) BUNDLE="$2"; shift 2 ;;
|
|
167
|
+
--help|-h) usage ;;
|
|
168
|
+
*) echo "validate-okf: unknown flag: $1" >&2; usage ;;
|
|
169
|
+
esac
|
|
170
|
+
done
|
|
171
|
+
|
|
172
|
+
echo "validate-okf: scanning for OKF bundles..."
|
|
173
|
+
|
|
174
|
+
if [ -n "$BUNDLE" ]; then
|
|
175
|
+
validate_bundle "$BUNDLE"
|
|
176
|
+
elif [ -n "$DIR" ]; then
|
|
177
|
+
if [ ! -d "$DIR" ]; then
|
|
178
|
+
printf "${YELLOW}SKIP${NC} directory not found: %s\n" "$DIR"
|
|
179
|
+
exit 0
|
|
180
|
+
fi
|
|
181
|
+
count=0
|
|
182
|
+
while IFS= read -r -d '' f; do
|
|
183
|
+
# Only process .md files with YAML frontmatter
|
|
184
|
+
if head -1 "$f" 2>/dev/null | grep -q '^---$'; then
|
|
185
|
+
validate_bundle "$f"
|
|
186
|
+
count=$((count + 1))
|
|
187
|
+
fi
|
|
188
|
+
done < <(find "$DIR" -maxdepth 1 -name '*.md' -print0 2>/dev/null || true)
|
|
189
|
+
if [ "$count" -eq 0 ]; then
|
|
190
|
+
printf "${YELLOW}SKIP${NC} no OKF bundles found in %s\n" "$DIR"
|
|
191
|
+
else
|
|
192
|
+
echo "validate-okf: scanned $count bundle(s)"
|
|
193
|
+
fi
|
|
194
|
+
else
|
|
195
|
+
echo "validate-okf: nothing to validate" >&2
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
exit "$EXIT_CODE"
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# wait-for-ci.sh — Poll GitHub Actions until all workflow runs complete
|
|
3
|
+
# Usage: wait-for-ci.sh [--timeout SECONDS] [--interval SECONDS] [--branch BRANCH]
|
|
4
|
+
# --timeout Max seconds to wait (default: 600)
|
|
5
|
+
# --interval Seconds between polls (default: 30)
|
|
6
|
+
# --branch Branch to check (default: current branch)
|
|
7
|
+
# --commit Specific commit SHA to verify (default: HEAD)
|
|
8
|
+
# --json Output machine-readable JSON on completion
|
|
9
|
+
# --help Show this message
|
|
10
|
+
#
|
|
11
|
+
# Exit codes: 0 = all workflows green, 1 = any workflow failed, 2 = timeout, 3 = no gh CLI
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
TIMEOUT=600
|
|
16
|
+
INTERVAL=30
|
|
17
|
+
BRANCH=$(git branch --show-current 2>/dev/null || echo "main")
|
|
18
|
+
COMMIT=""
|
|
19
|
+
OUTPUT_JSON=false
|
|
20
|
+
|
|
21
|
+
usage() {
|
|
22
|
+
sed -n '2,12p' "$0" | sed 's/^# //'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
while [[ $# -gt 0 ]]; do
|
|
26
|
+
case "$1" in
|
|
27
|
+
--timeout) TIMEOUT="$2"; shift 2 ;;
|
|
28
|
+
--interval) INTERVAL="$2"; shift 2 ;;
|
|
29
|
+
--branch) BRANCH="$2"; shift 2 ;;
|
|
30
|
+
--commit) COMMIT="$2"; shift 2 ;;
|
|
31
|
+
--json) OUTPUT_JSON=true; shift ;;
|
|
32
|
+
--help) usage; exit 0 ;;
|
|
33
|
+
*) echo "Unknown flag: $1"; usage; exit 2 ;;
|
|
34
|
+
esac
|
|
35
|
+
done
|
|
36
|
+
|
|
37
|
+
COMMIT="${COMMIT:-$(git rev-parse HEAD)}"
|
|
38
|
+
COMMIT_SHORT="${COMMIT:0:7}"
|
|
39
|
+
|
|
40
|
+
# ── Git-only fallback ─────────────────────────────────────────────────
|
|
41
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
42
|
+
echo "⚠️ gh CLI not found — using git-only fallback (cannot verify CI status)"
|
|
43
|
+
git fetch origin "$BRANCH" 2>/dev/null || true
|
|
44
|
+
REMOTE_SHA=$(git rev-parse "origin/$BRANCH" 2>/dev/null || echo "")
|
|
45
|
+
if [[ -n "$REMOTE_SHA" ]] && [[ "$REMOTE_SHA" == "$COMMIT" ]]; then
|
|
46
|
+
echo "✅ Push confirmed: remote $BRANCH matches $COMMIT_SHORT"
|
|
47
|
+
echo "⚠️ CI status UNVERIFIED — gh CLI required for workflow polling"
|
|
48
|
+
exit 0
|
|
49
|
+
else
|
|
50
|
+
echo "❌ Push unconfirmed: remote $BRANCH does not match $COMMIT_SHORT"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# ── Verify gh auth ────────────────────────────────────────────────────
|
|
56
|
+
if ! gh auth status 2>/dev/null; then
|
|
57
|
+
echo "⚠️ gh CLI not authenticated — falling back to git-only"
|
|
58
|
+
git fetch origin "$BRANCH" 2>/dev/null || true
|
|
59
|
+
REMOTE_SHA=$(git rev-parse "origin/$BRANCH" 2>/dev/null || echo "")
|
|
60
|
+
if [[ -n "$REMOTE_SHA" ]] && [[ "$REMOTE_SHA" == "$COMMIT" ]]; then
|
|
61
|
+
echo "✅ Push confirmed: remote $BRANCH matches $COMMIT_SHORT"
|
|
62
|
+
echo "⚠️ CI status UNVERIFIED — gh auth required for workflow polling"
|
|
63
|
+
exit 0
|
|
64
|
+
else
|
|
65
|
+
echo "❌ Push unconfirmed"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# ── Poll CI ───────────────────────────────────────────────────────────
|
|
71
|
+
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner 2>/dev/null || echo "unknown")
|
|
72
|
+
echo "==> Polling CI for $BRANCH ($COMMIT_SHORT) in $REPO"
|
|
73
|
+
echo " Timeout: ${TIMEOUT}s, Interval: ${INTERVAL}s"
|
|
74
|
+
|
|
75
|
+
ELAPSED=0
|
|
76
|
+
FAILED_WORKFLOWS=()
|
|
77
|
+
PASSED_WORKFLOWS=()
|
|
78
|
+
|
|
79
|
+
while [[ $ELAPSED -lt $TIMEOUT ]]; do
|
|
80
|
+
# Fetch all runs for the branch
|
|
81
|
+
RUNS_JSON=$(gh run list --branch "$BRANCH" --limit 20 --json workflowName,status,conclusion,headSha,databaseId,displayTitle 2>/dev/null || echo "[]")
|
|
82
|
+
|
|
83
|
+
# Filter to runs matching our commit
|
|
84
|
+
MATCHING_RUNS=$(echo "$RUNS_JSON" | jq --arg sha "$COMMIT" '[.[] | select(.headSha == $sha)]' 2>/dev/null || echo "[]")
|
|
85
|
+
|
|
86
|
+
RUN_COUNT=$(echo "$MATCHING_RUNS" | jq 'length' 2>/dev/null || echo "0")
|
|
87
|
+
|
|
88
|
+
if [[ "$RUN_COUNT" -eq 0 ]]; then
|
|
89
|
+
echo " (${ELAPSED}s) No runs found for $COMMIT_SHORT — waiting for CI to start..."
|
|
90
|
+
sleep "$INTERVAL"
|
|
91
|
+
ELAPSED=$((ELAPSED + INTERVAL))
|
|
92
|
+
continue
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Check completion
|
|
96
|
+
INCOMPLETE=$(echo "$MATCHING_RUNS" | jq '[.[] | select(.status != "completed")] | length' 2>/dev/null || echo "0")
|
|
97
|
+
FAILURES=$(echo "$MATCHING_RUNS" | jq '[.[] | select(.status == "completed" and .conclusion == "failure")]' 2>/dev/null || echo "[]")
|
|
98
|
+
FAILURE_COUNT=$(echo "$FAILURES" | jq 'length' 2>/dev/null || echo "0")
|
|
99
|
+
SUCCESSES=$(echo "$MATCHING_RUNS" | jq '[.[] | select(.status == "completed" and .conclusion == "success")]' 2>/dev/null || echo "[]")
|
|
100
|
+
SUCCESS_COUNT=$(echo "$SUCCESSES" | jq 'length' 2>/dev/null || echo "0")
|
|
101
|
+
|
|
102
|
+
echo " (${ELAPSED}s) $RUN_COUNT runs: $SUCCESS_COUNT passed, $FAILURE_COUNT failed, $INCOMPLETE pending"
|
|
103
|
+
|
|
104
|
+
# All complete?
|
|
105
|
+
if [[ "$INCOMPLETE" -eq 0 ]]; then
|
|
106
|
+
if [[ "$FAILURE_COUNT" -eq 0 ]]; then
|
|
107
|
+
echo "✅ All $SUCCESS_COUNT workflow(s) passed for $COMMIT_SHORT"
|
|
108
|
+
if $OUTPUT_JSON; then
|
|
109
|
+
echo "$SUCCESSES" | jq '{status:"success",commit:$sha,workflows:.}' --arg sha "$COMMIT_SHORT"
|
|
110
|
+
fi
|
|
111
|
+
exit 0
|
|
112
|
+
else
|
|
113
|
+
echo "❌ $FAILURE_COUNT workflow(s) FAILED:"
|
|
114
|
+
echo "$FAILURES" | jq -r '.[] | " \(.workflowName) — https://github.com/'"$REPO"'/actions/runs/\(.databaseId)"'
|
|
115
|
+
echo ""
|
|
116
|
+
echo "Handoff: set handoff.next_skill = fix-bug in specs/state.yaml"
|
|
117
|
+
if $OUTPUT_JSON; then
|
|
118
|
+
echo "$FAILURES" | jq '{status:"failure",commit:$sha,failed_workflows:.}' --arg sha "$COMMIT_SHORT"
|
|
119
|
+
fi
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
sleep "$INTERVAL"
|
|
125
|
+
ELAPSED=$((ELAPSED + INTERVAL))
|
|
126
|
+
done
|
|
127
|
+
|
|
128
|
+
echo "❌ Timeout: CI did not complete within ${TIMEOUT}s"
|
|
129
|
+
echo " Branch: $BRANCH, Commit: $COMMIT_SHORT"
|
|
130
|
+
exit 2
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: align-grid
|
|
3
3
|
description: "Build editorial/magazine/report webpages on a GENUINE Müller-Brockmann modular grid (International Typographic Style) — not a decorative one. Encodes the discipline (columns + modules + baseline, grotesque type, flush-left, restrained black/white/red palette) AND the hard-won front-end engineering to make the grid real, visible, and verified: one CSS-variable source of truth, an interactive grid-toggle overlay that lives in the SAME content box as the content, subgrid \"bands\" so every element snaps to a column line, an 8px baseline lock, and runtime OPTICAL ALIGNMENT that puts display type's ink (not its box) on the line. Ships with a scaffold generator and a Puppeteer verification harness that proves 0px adherence."
|
|
4
4
|
model: sonnet
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Müller-Brockmann Grid Systems — built real, visible, and verified
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: assess-impact
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Analyze the blast radius of a proposed change before any code is written. Maps dependents, affected stories, and test coverage. Produces specs/IMPACT_LATEST.md. Use before plan-work on any non-trivial change, when touching a shared module, or when the user asks "what does this break?".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: audit-code
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Self-review checklist for the coding agent to run before dispatching a reviewer. Checks CONVENTIONS.md compliance, Boy Scout Rule, test coverage, types, and SOLID. Produces a pass/fail checklist. Use before request-review, before committing, or when user asks for a code quality check.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: audit-plan
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Evaluate an incoming project plan against bigpowers principles and conventions, surface gaps, and produce a READY/NOT READY verdict before engagement begins. Use when a new project arrives, when adapting a foreign plan, or before running seed-conventions on an unfamiliar codebase.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build-epic
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Eight-step epic build cycle — reads state.yaml, execution-status.yaml, and one epic capsule; updates status via bp-yaml-set or direct edit. Resume mode runs one step per invocation. Use instead of ad-hoc execute-plan for release work.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: change-request
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Add a new requirement or reorder epics by WSJF against specs/release-plan.yaml and epic capsule directories. Modes Add and Reorder. Use when a new requirement arrives mid-release or the plan needs prioritization.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: commit-message
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
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.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: compose-workflow
|
|
3
3
|
description: Chain multiple bigpowers skills into a custom workflow recipe saved in specs/. Use when a project repeats a non-standard skill sequence, or user wants a documented playbook beyond orchestrate-project modes.
|
|
4
4
|
model: sonnet
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Compose Workflow
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: deepen-architecture
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Find deepening opportunities in a codebase, informed by the domain language in specs/tech-architecture/tech-stack.md and the decisions in specs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: define-language
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Extract a DDD-style ubiquitous language glossary from the current conversation, flagging ambiguities and proposing canonical terms. Saves to specs/UBIQUITOUS_LANGUAGE_LATEST.md. Use when user wants to define domain terms, build a glossary, harden terminology, create a ubiquitous language, or mentions "domain model" or "DDD".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -3,6 +3,7 @@ ARCHIVED: content absorbed into plan-work
|
|
|
3
3
|
---
|
|
4
4
|
name: define-success
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: standard
|
|
6
7
|
description: Convert an imperative task statement into explicit "step → verify: <cmd>" pairs before implementation begins. Use before plan-work when success criteria are unclear, when a task lacks verifiable checkpoints, or when user says "how will we know this is done?".
|
|
7
8
|
---
|
|
8
9
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: delegate-task
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Delegate one complex task to a single subagent, review its work in two stages before merging back. Sequential — one agent at a time, with oversight. Use when a task is complex and requires careful review before the result is accepted. Distinct from dispatch-agents (no parallelism here; reviewer sees full diff before proceeding).
|
|
5
6
|
---
|
|
6
7
|
|
package/skills/deploy/SKILL.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: deploy
|
|
3
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
4
|
model: sonnet
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Deploy
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design-interface
|
|
3
3
|
model: opus
|
|
4
|
+
effort: standard
|
|
4
5
|
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".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: diagnose-root
|
|
3
3
|
description: Run 4-phase root cause analysis — reproduce, isolate, hypothesize, verify. Use when a bug is confirmed but root cause is unclear, after investigate-bug, or when user mentions root cause analysis.
|
|
4
4
|
model: sonnet
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Diagnose Root
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dispatch-agents
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Dispatch multiple subagents in parallel on independent tasks. No waiting between them — all run concurrently. Use when tasks are truly decoupled and speed matters. Distinct from delegate-task (concurrent here, no inter-task review gate).
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: edit-document
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Edit and improve documents by restructuring sections, improving clarity, and tightening prose. Use when user wants to edit, revise, restructure, or improve any document — including specs/ files, articles, READMEs, or technical writing.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: elaborate-spec
|
|
3
3
|
model: opus
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Refine a rough idea into a clear, detailed specification through dialogue. Does not produce code. Use when user has a vague idea, wants to think through a feature before planning, or needs to turn "I want X" into a concrete spec.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: enforce-first
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Apply the F.I.R.S.T test quality rubric (Fast, Independent, Repeatable, Self-Validating, Timely) to a test suite or individual tests. Use when develop-tdd is writing tests, when test quality needs to be checked, or when user mentions F.I.R.S.T or "test quality".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: evolve-skill
|
|
3
3
|
description: Benchmark-gated skill evolution — consume bigpowers-benchmark report, propose plan-work change, edit skill via craft-skill, re-run benchmark, record ADR. Use when a skill underperforms on benchmark or stocktake finds systemic gap.
|
|
4
4
|
model: opus
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Evolve Skill
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: extract-design
|
|
3
3
|
description: "Extract a Google DESIGN.md file from an HTML prototype (claude.ai/design or any styled page) using Puppeteer, producing machine-readable tokens and AI-generated prose. Use when the user has an HTML prototype and wants a DESIGN.md to anchor their project's visual identity, or when seed-conventions has just scaffolded a new project."
|
|
4
4
|
model: sonnet
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Extract DESIGN.md from HTML
|
package/skills/fix-bug/SKILL.md
CHANGED
package/skills/grill-me/SKILL.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grill-me
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Interactive assumption-surfacing Q&A that stress-tests a plan through relentless questioning until every decision is resolved. Use when user wants to challenge a plan, validate decisions from conversation/context, or mentions "grill me". For doc-grounded variant, use grill-with-docs.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: grill-with-docs
|
|
3
3
|
description: Doc-grounded variant of grill-me — stress-tests plan assumptions by fetching and citing real library or API documentation. Every challenge must cite a real URL. Use when the plan depends on a specific library or external API.
|
|
4
4
|
model: opus
|
|
5
|
+
effort: standard
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Grill With Docs
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: guard-git
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Block dangerous git commands (push, force push, reset --hard, clean, branch -D, checkout/restore .) and enforce Conventional Commits & Branch Protection before an AI agent runs them. Installs hook scripts for Claude Code, Cursor, Cursor CLI, and Gemini CLI; documents Google Antigravity Terminal deny lists. Use when the user wants git safety hooks, to block git push or destructive git in agents, or to mirror the same policy across AI coding tools.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hook-commits
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Set up pre-commit hooks with lint-staged (Prettier), type checking, and tests in the current repo. Use when user wants to add pre-commit hooks, set up Husky, configure lint-staged, or add commit-time formatting/typechecking/testing.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: inspect-quality
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Interactive QA session where user reports bugs or issues conversationally, and the agent logs them to specs/bugs/registry.yaml with a structured audit schema. Explores the codebase in the background for context and domain language. Use when user wants to report bugs, do QA, or mentions "QA session".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: investigate-bug
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Investigate a bug or issue by exploring the codebase to find root cause, then write a TDD-based fix plan to specs/bugs/BUG-*.md. Use when user reports a bug, wants to investigate a problem, mentions "triage", or wants to plan a fix.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kickoff-branch
|
|
3
3
|
model: haiku
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Create a git worktree and feature branch, then verify a clean test baseline before any code is written. Use when starting a new feature or task, when user wants to work in isolation from main, or mentions "start a branch" or "new worktree".
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: map-codebase
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: "Derives the tech-stack doc from scratch by scanning the codebase — analyzes stack, architecture, and gray areas (error handling, API shapes) and persists findings into specs/tech-architecture/tech-stack.md. Run when the tech doc doesn't exist yet; use survey-context to consume it once it does."
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: migrate-spec
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Detect GSD, spec-kit, or BMAD spec artifacts and transform them into bigpowers YAML layout (state.yaml, release-plan.yaml, epics/, requirements/, plans/, ADRs). Use when migrating foreign spec docs.
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: model-domain
|
|
3
3
|
model: sonnet
|
|
4
|
+
effort: standard
|
|
4
5
|
description: Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates specs/tech-architecture/tech-stack.md and specs/adr/ inline as decisions crystallise. Use when user wants to stress-test a plan against their project's domain language and documented decisions.
|
|
5
6
|
---
|
|
6
7
|
|