bigpowers 2.67.0 → 2.68.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,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.67.0",
3
+ "version": "2.68.0",
4
4
  "description": "75 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"
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability."# story: e38s06
2
+ description: "Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability." # story: e38s06
3
3
  ---
4
4
 
5
5
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3."# story: e39s07
2
+ description: "Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3." # story: e39s07
3
3
  ---
4
4
 
5
5
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: > AI-powered security analysis of code changes — traces data flow, detects injection, auth bypass, secrets exposure, and unsafe deserialization across files. Use when reviewing pending changes, before release-branch, during verify-work Phase 5, during build-epic Step 0 threat modeling, or when the user says "security review" or "scan for vulns".
2
+ description: > AI-powered security analysis of code changes — traces data flow, detects injection, auth bypass, secrets exposure, and unsafe deserialization across files. Use when reviewing pending changes, before release-branch, during verify-work Phase 5, during build-epic Step 0 threat modeling, or when the user says "security review" or "scan for vulns".
3
3
  ---
4
4
 
5
5
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gate-trace
3
- description: "\"Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability.\"# story: e38s06"
3
+ description: "\"Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability.\" # story: e38s06"
4
4
  model: haiku
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: maintain-wiki
3
- description: "\"Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3.\"# story: e39s07"
3
+ description: "\"Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3.\" # story: e39s07"
4
4
  model: haiku
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: security-review
3
- description: "> AI-powered security analysis of code changes — traces data flow, detects injection, auth bypass, secrets exposure, and unsafe deserialization across files. Use when reviewing pending changes, before release-branch, during verify-work Phase 5, during build-epic Step 0 threat modeling, or when the user says \"security review\" or \"scan for vulns\"."
3
+ description: "> AI-powered security analysis of code changes — traces data flow, detects injection, auth bypass, secrets exposure, and unsafe deserialization across files. Use when reviewing pending changes, before release-branch, during verify-work Phase 5, during build-epic Step 0 threat modeling, or when the user says \"security review\" or \"scan for vulns\"."
4
4
  model: sonnet
5
5
  ---
6
6
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [2.68.0](https://github.com/danielvm-git/bigpowers/compare/v2.67.1...v2.68.0) (2026-07-06)
2
+
3
+
4
+ ### Features
5
+
6
+ * **e28:** sync pipeline refactor — Parse→IR→Render with shared library ([#54](https://github.com/danielvm-git/bigpowers/issues/54)) ([2006f4b](https://github.com/danielvm-git/bigpowers/commit/2006f4bdbe794c454fc167b485e92bd9d3ff71a0))
7
+
8
+ ## [2.67.1](https://github.com/danielvm-git/bigpowers/compare/v2.67.0...v2.67.1) (2026-07-05)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **compliance:** resolve 5 pre-existing CI failures — 91/91 PASS ([de0a163](https://github.com/danielvm-git/bigpowers/commit/de0a1637eff11b6d445b7235a1474a5ca4163635))
14
+
1
15
  # [2.67.0](https://github.com/danielvm-git/bigpowers/compare/v2.66.0...v2.67.0) (2026-07-05)
2
16
 
3
17
 
package/SKILL-INDEX.md CHANGED
@@ -77,7 +77,7 @@
77
77
  | 49 | Verify | `request-review` | Dispatch a fresh reviewer agent with a clean context to critique the code after | ✅ Active |
78
78
  | 50 | Verify | `respond-review` | Act on a reviewer agent's feedback systematically — categorize findings, apply | ✅ Active |
79
79
  | 51 | Verify | `run-evals` | Eval-Driven Development — define capability and regression evals before buildi | ✅ Active |
80
- | 52 | Verify | `security-review` | > AI-powered security analysis of code changes — traces data flow, detects inj | ✅ Active |
80
+ | 52 | Verify | `security-review` | > | ✅ Active |
81
81
  | 53 | Verify | `trace-requirement` | Link story IDs from specs/release-plan.yaml + epic capsule directories to the im | ✅ Active |
82
82
  | 54 | Verify | `validate-fix` | Prove a fix works before declaring done — re-run the failing test, run the ful | ✅ Active |
83
83
  | 55 | Verify | `verify-work` | Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-b | ✅ Active |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.67.0",
3
+ "version": "2.68.0",
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": {
@@ -1,10 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
  # add-model-frontmatter.sh — one-time helper; idempotent model: injection
3
3
  set -euo pipefail
4
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
4
  # SKILLS_ROOT: use skills/ when it exists, fall back to repo root
6
- SKILLS_ROOT="$REPO_ROOT"
7
- [[ -d "$REPO_ROOT/skills" ]] && SKILLS_ROOT="$REPO_ROOT/skills"
5
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
6
+ resolve_repo_root
8
7
 
9
8
  # Bash 3.2-compatible model mapping (no declare -A)
10
9
  model_for() {
@@ -2,7 +2,6 @@
2
2
  # bp-yaml-set.sh — patch a dotted key in a specs YAML file
3
3
  # Usage: bp-yaml-set.sh <file> <dotted.key> <value>
4
4
  set -euo pipefail
5
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
5
  FILE="${1:?file}"
7
6
  KEY="${2:?dotted.key}"
8
7
  VAL="${3:?value}"
@@ -2,7 +2,6 @@
2
2
  # bp-yaml-snapshot.sh — freeze release-plan + requirements into snapshots/
3
3
  # Usage: bp-yaml-snapshot.sh [version] (default: read from release-plan.yaml)
4
4
  set -euo pipefail
5
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
5
  SPECS="$REPO_ROOT/specs"
7
6
  VER="${1:-}"
8
7
 
@@ -11,7 +11,6 @@
11
11
 
12
12
  set -euo pipefail
13
13
 
14
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
15
14
  BLIND_SPOTS_JSON="$REPO_ROOT/specs/blind-spots.json"
16
15
  EXEC_STATUS="$REPO_ROOT/specs/execution-status.yaml"
17
16
  MATRIX_JSON="$REPO_ROOT/specs/traceability-matrix.json"
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # convert-legado.sh — RELEASE-PLAN.md + SCOPE.md → YAML layout (one-time migration helper)
3
3
  set -euo pipefail
4
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
4
  SPECS="$REPO_ROOT/specs"
6
5
  RP_MD="$SPECS/RELEASE-PLAN.md"
7
6
  SCOPE_MD="$SPECS/SCOPE.md"
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # enrich-epics-from-archive.sh — populate specs/epics from archive RELEASE-PLAN.md
3
3
  set -euo pipefail
4
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
4
  ARCHIVE="${1:-$REPO_ROOT/specs/archive/RELEASE-PLAN.md}"
6
5
  SPECS="$REPO_ROOT/specs"
7
6
 
@@ -13,6 +13,8 @@
13
13
  # Exit 1: at least one step script failed to detect a violation (fail-open risk)
14
14
 
15
15
  set -euo pipefail
16
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
17
+ resolve_repo_root
16
18
 
17
19
  RED='\033[0;31m'
18
20
  GREEN='\033[0;32m'
@@ -25,7 +27,6 @@ FAIL=0
25
27
  g07_pass() { echo -e " ${GREEN}PASS${NC} $*"; PASS=$((PASS + 1)); }
26
28
  g07_fail() { echo -e " ${RED}FAIL${NC} $*"; FAIL=$((FAIL + 1)); }
27
29
 
28
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
29
30
  FIXTURE_DIR="$REPO_ROOT/specs/verifications/fixtures/negative-path"
30
31
  STEPS_DIR="$REPO_ROOT/specs/verifications/steps"
31
32
 
@@ -18,12 +18,13 @@
18
18
  # Exit 1: validate-specs-yaml.sh passed vacuously on the corrupt fixture
19
19
 
20
20
  set -euo pipefail
21
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
22
+ resolve_repo_root
21
23
 
22
24
  RED='\033[0;31m'
23
25
  GREEN='\033[0;32m'
24
26
  NC='\033[0m'
25
27
 
26
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
27
28
  FIXTURE_DIR="$REPO_ROOT/specs/verifications/fixtures/corrupt-yaml"
28
29
  VALIDATOR="$REPO_ROOT/scripts/validate-specs-yaml.sh"
29
30
 
@@ -40,6 +41,8 @@ set +e
40
41
  actual_output=$(bash "$VALIDATOR" "$FIXTURE_DIR" 2>&1)
41
42
  actual_exit=$?
42
43
  set -e
44
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
45
+ resolve_repo_root
43
46
 
44
47
  echo "$actual_output"
45
48
  echo ""
@@ -17,12 +17,13 @@
17
17
  # Exit 1: round trip destroyed structure (corruption bug is back)
18
18
 
19
19
  set -euo pipefail
20
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
21
+ resolve_repo_root
20
22
 
21
23
  RED='\033[0;31m'
22
24
  GREEN='\033[0;32m'
23
25
  NC='\033[0m'
24
26
 
25
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
26
27
  FIXTURE="$REPO_ROOT/specs/verifications/fixtures/yaml-roundtrip/sample.yaml"
27
28
  TOOL="$REPO_ROOT/scripts/yaml-tools.py"
28
29
 
@@ -82,6 +83,8 @@ sys.exit(0)
82
83
  " "$WORKDIR/sample.yaml")"
83
84
  EXIT=$?
84
85
  set -e
86
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
87
+ resolve_repo_root
85
88
 
86
89
  echo "$RESULT"
87
90
 
@@ -13,12 +13,13 @@
13
13
  # Exit 1: trace-stories.py passed vacuously on the degenerate fixture (fail-open risk)
14
14
 
15
15
  set -euo pipefail
16
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
17
+ resolve_repo_root
16
18
 
17
19
  RED='\033[0;31m'
18
20
  GREEN='\033[0;32m'
19
21
  NC='\033[0m'
20
22
 
21
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
22
23
  FIXTURE_DIR="$REPO_ROOT/specs/verifications/fixtures/trace-vacuous"
23
24
  TRACE_ENGINE="$REPO_ROOT/scripts/lib/trace-stories.py"
24
25
 
@@ -40,6 +41,8 @@ set +e
40
41
  actual_output=$(python3 "$TRACE_ENGINE" "$FIXTURE_DIR" "$MATRIX_JSON" "$TRACE_MD" "$OKF_DIR" 1 "" 2>&1)
41
42
  actual_exit=$?
42
43
  set -e
44
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
45
+ resolve_repo_root
43
46
 
44
47
  echo "$actual_output"
45
48
  echo ""
@@ -13,8 +13,9 @@
13
13
  # Usage: bash scripts/golden-g11-gitignore-venv.sh
14
14
 
15
15
  set -euo pipefail
16
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
17
+ resolve_repo_root
16
18
 
17
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
18
19
  cd "$REPO_ROOT"
19
20
 
20
21
  RED='\033[0;31m'
@@ -12,11 +12,12 @@
12
12
  # ./scripts/install.sh --dry-run # show what would be linked
13
13
  # ./scripts/install.sh --uninstall # remove all managed symlinks
14
14
  set -euo pipefail
15
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
16
+ resolve_repo_root
15
17
 
16
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
17
18
  # SKILLS_ROOT: use skills/ subdirectory when it exists, fall back to repo root
18
- SKILLS_ROOT="$REPO_ROOT"
19
- [[ -d "$REPO_ROOT/skills" ]] && SKILLS_ROOT="$REPO_ROOT/skills"
19
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
20
+ resolve_repo_root
20
21
 
21
22
  DRY_RUN=false
22
23
  UNINSTALL=false
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+ # story: BUG-2026-07-04-python-interpreter-fragility
3
+ # Resolve a Python interpreter that is guaranteed to have PyYAML
4
+ # and other requirements.txt dependencies.
5
+ # Source this script, then use $PYTHON instead of bare python3.
6
+ #
7
+ # Resolution order:
8
+ # 1. .venv/bin/python3 (project virtualenv, if present)
9
+ # 2. pyenv shim (if active)
10
+ # 3. python3 on PATH
11
+
12
+ resolve_python() {
13
+ local script_dir
14
+ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
15
+ local venv_python="$script_dir/.venv/bin/python3"
16
+
17
+ if [ -x "$venv_python" ]; then
18
+ PYTHON="$venv_python"
19
+ elif command -v python3 >/dev/null 2>&1; then
20
+ PYTHON="python3"
21
+ else
22
+ echo "python-env: ERROR — no python3 found anywhere" >&2
23
+ echo " Tried: $venv_python, python3 on PATH" >&2
24
+ return 1
25
+ fi
26
+
27
+ # Verify PyYAML is available
28
+ if ! "$PYTHON" -c "import yaml" 2>/dev/null; then
29
+ echo "python-env: WARN — $PYTHON lacks PyYAML" >&2
30
+ echo " Run: pip install -r requirements.txt" >&2
31
+ # Fall back to PATH python3 if .venv one doesn't work
32
+ if [ "$PYTHON" = "$venv_python" ] && command -v python3 >/dev/null 2>&1; then
33
+ if python3 -c "import yaml" 2>/dev/null; then
34
+ PYTHON="python3"
35
+ echo "python-env: Fallback to PATH python3 (has PyYAML)" >&2
36
+ fi
37
+ fi
38
+ fi
39
+
40
+ export PYTHON
41
+ echo "python-env: Using $PYTHON" >&2
42
+ }
43
+
44
+ resolve_python
@@ -1,73 +1,102 @@
1
1
  #!/usr/bin/env bash
2
2
  # story: e28s01
3
- # scripts/lib/skill-common.sh — Shared bash library for skill pipeline scripts
4
- # Provides: resolve_repo_root, parse_frontmatter, iterate_skills
5
- # Safe to source under set -euo pipefail; double-source is a no-op.
3
+ # Shared functions for bigpowers sync pipeline.
4
+ # Source this from any script that needs REPO_ROOT, SKILLS_ROOT, or skill iteration.
5
+ # Double-source guard: safe under set -euo pipefail.
6
6
 
7
- # Double-source guard
8
- if [[ -n "${_SKILL_COMMON_SOURCED:-}" ]]; then
7
+ if [ -n "${SKILL_COMMON_LOADED:-}" ]; then
9
8
  return 0
10
9
  fi
11
- _SKILL_COMMON_SOURCED=1
10
+ SKILL_COMMON_LOADED=1
12
11
 
13
- # ── resolve_repo_root ───────────────────────────────────────────────
14
- # Resolves REPO_ROOT to the repository root (two levels up from this
15
- # library at scripts/lib/skill-common.sh). Also sets SKILLS_ROOT:
16
- # skills/ subdirectory when it exists, repo root fallback.
12
+ # resolve_repo_root — set REPO_ROOT and SKILLS_ROOT
17
13
  resolve_repo_root() {
18
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
14
+ local lib_dir
15
+ lib_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || return 1
16
+ # Library is at REPO/scripts/lib/skill-common.sh → two levels up
17
+ local repo_candidate
18
+ repo_candidate="$(cd "$lib_dir/../.." 2>/dev/null && pwd)"
19
+ if [ -n "$repo_candidate" ] && [ -d "$repo_candidate/skills" ]; then
20
+ REPO_ROOT="$repo_candidate"
21
+ else
22
+ repo_candidate="$(cd "$lib_dir/.." 2>/dev/null && pwd)"
23
+ REPO_ROOT="$repo_candidate"
24
+ fi
19
25
  SKILLS_ROOT="$REPO_ROOT"
20
- [[ -d "$REPO_ROOT/skills" ]] && SKILLS_ROOT="$REPO_ROOT/skills"
26
+ [ -d "$REPO_ROOT/skills" ] && SKILLS_ROOT="$REPO_ROOT/skills"
27
+ export REPO_ROOT SKILLS_ROOT
21
28
  }
22
29
 
23
- # Resolve at source time so callers don't need to
24
- resolve_repo_root
25
-
26
- # ── parse_frontmatter ───────────────────────────────────────────────
27
- # Usage: parse_frontmatter <SKILL.md>
28
- # Extracts YAML frontmatter into globals: _PF_NAME, _PF_MODEL, _PF_DESCRIPTION
29
- # Returns 0 on success, non-zero if file missing or no name in frontmatter.
30
+ # parse_frontmatter — extract name, model, description from SKILL.md YAML frontmatter
31
+ # Usage: parse_frontmatter <path-to-SKILL.md>
32
+ # Output: exports SKILL_NAME, SKILL_MODEL, SKILL_DESC
30
33
  parse_frontmatter() {
31
34
  local file="$1"
32
- _PF_NAME=""
33
- _PF_MODEL=""
34
- _PF_DESCRIPTION=""
35
-
36
- if [[ ! -f "$file" ]]; then
35
+ if [ ! -f "$file" ]; then
37
36
  echo "parse_frontmatter: file not found: $file" >&2
38
37
  return 1
39
38
  fi
40
39
 
41
- # Verify YAML frontmatter exists (at least one --- delimiter)
42
- if ! grep -q '^---$' "$file"; then
43
- echo "parse_frontmatter: no YAML frontmatter in $file" >&2
44
- return 1
45
- fi
40
+ local in_block=0
41
+ local name="" model="" desc="" line
46
42
 
47
- # Extract name (single-line, first match in frontmatter)
48
- _PF_NAME=$(awk '/^---/{f++} f==1 && /^name:/{print; exit}' "$file" | sed 's/^name:[[:space:]]*//')
43
+ while IFS= read -r line; do
44
+ if [ "$line" = "---" ]; then
45
+ in_block=$((in_block + 1))
46
+ [ "$in_block" -eq 2 ] && break
47
+ continue
48
+ fi
49
+ [ "$in_block" -ne 1 ] && continue
49
50
 
50
- # Extract model (single-line, first match in frontmatter)
51
- _PF_MODEL=$(awk '/^---/{f++} f==1 && /^model:/{print; exit}' "$file" | sed 's/^model:[[:space:]]*//')
51
+ case "$line" in
52
+ name:*)
53
+ name="${line#name: }"
54
+ name="${name#name:}"
55
+ name="${name# }"
56
+ ;;
57
+ model:*)
58
+ model="${line#model: }"
59
+ model="${model#model:}"
60
+ model="${model# }"
61
+ ;;
62
+ description:*)
63
+ desc="${line#description: }"
64
+ desc="${desc#description:}"
65
+ desc="${desc# }"
66
+ # Handle multiline: keep reading indented continuation lines
67
+ ;;
68
+ esac
69
+ done < "$file"
52
70
 
53
- # Extract description (potentially multiline, from "description:" to next YAML key or closing ---)
54
- _PF_DESCRIPTION=$(awk '/^---/{f++; next} f==1 && /^description:/{p=1; sub(/^description:[[:space:]]*/,""); print; next} f==1 && p && /^[a-z]+:/{exit} f==1 && p{print}' "$file" \
55
- | tr -d '\n' \
56
- | sed -E 's/[[:space:]]+/ /g')
71
+ # Read continuation lines for multiline description
72
+ local continued=0
73
+ while IFS= read -r line; do
74
+ if [ "$line" = "---" ]; then
75
+ [ "$continued" -eq 0 ] && continued=1 || break
76
+ continue
77
+ fi
78
+ [ "$continued" -eq 0 ] && continue
79
+ # If next field starts (unindented key:), stop
80
+ [[ "$line" =~ ^[a-zA-Z_]+: ]] && break
81
+ desc="$desc $line"
82
+ done < "$file"
57
83
 
58
- [[ -z "$_PF_NAME" ]] && return 1
59
- return 0
84
+ SKILL_NAME="$name"
85
+ SKILL_MODEL="$model"
86
+ SKILL_DESC="$desc"
87
+ # Compatibility: also set _PF_* for scripts that expect them
88
+ _PF_NAME="$SKILL_NAME"
89
+ _PF_MODEL="$SKILL_MODEL"
90
+ _PF_DESCRIPTION="$SKILL_DESC"
91
+ export SKILL_NAME SKILL_MODEL SKILL_DESC _PF_NAME _PF_MODEL _PF_DESCRIPTION
60
92
  }
61
93
 
62
- # ── iterate_skills ──────────────────────────────────────────────────
63
- # Usage: iterate_skills
64
- # Outputs one absolute path per skill directory under SKILLS_ROOT that
65
- # contains a SKILL.md file, in stable sorted order (no trailing slash).
94
+ # iterate_skills — list skill directories containing SKILL.md, stable sorted order
66
95
  iterate_skills() {
67
- local dir
68
- for dir in "$SKILLS_ROOT"/*/; do
69
- [[ -d "$dir" ]] || continue
70
- [[ -f "$dir/SKILL.md" ]] || continue
71
- echo "${dir%/}"
72
- done
96
+ resolve_repo_root 2>/dev/null || true
97
+ if [ -d "$SKILLS_ROOT" ]; then
98
+ for dir in "$SKILLS_ROOT"/*/; do
99
+ [ -f "${dir}SKILL.md" ] && echo "${dir%/}"
100
+ done | sort
101
+ fi
73
102
  }
@@ -4,8 +4,9 @@
4
4
  # Called by sync-skills.sh --okf after concept files are rendered.
5
5
  # Steps: cross-references from skill-graph.json → index.md → validate-okf.sh
6
6
  set -euo pipefail
7
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
8
+ resolve_repo_root
7
9
 
8
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
9
10
  GRAPH_JSON="$REPO_ROOT/specs/skill-graph.json"
10
11
  OKF_WIKI_SKILLS="$REPO_ROOT/specs/skills-wiki/skills"
11
12
  OKF_WIKI_DIR="$REPO_ROOT/specs/skills-wiki"
@@ -31,6 +31,7 @@ for arg in "$@"; do
31
31
  done
32
32
 
33
33
  source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
34
+ resolve_repo_root
34
35
 
35
36
  CURSOR_RULES="$REPO_ROOT/.cursor/rules"
36
37
  GEMINI_EXT_DIR="$REPO_ROOT/.gemini/extensions/bigpowers"
@@ -213,7 +214,22 @@ render_okf_concept() {
213
214
  }
214
215
 
215
216
  # ── Parse extended frontmatter for OKF (includes effort) ────────────
216
- # Extends the base parse_frontmatter with _PF_EFFORT.
217
+ # Wrapper for library parse_frontmatter — sets _PF_* compat vars
218
+ parse_frontmatter() {
219
+ # Delegate to library which now sets _PF_* vars
220
+ if command -v skill_common_parse >/dev/null 2>&1 || [ -n "${SKILL_COMMON_LOADED:-}" ]; then
221
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh" 2>/dev/null
222
+ fi
223
+ # Call library version (defined in skill-common.sh, sets SKILL_NAME and _PF_*)
224
+ # But since we have the same name, we need the inline version
225
+ _PF_NAME=$(awk '/^---/{f++} f==1 && /^name:/{print; exit}' "$1" | sed 's/^name:[[:space:]]*//')
226
+ _PF_MODEL=$(awk '/^---/{f++} f==1 && /^model:/{print; exit}' "$1" | sed 's/^model:[[:space:]]*//')
227
+ _PF_DESCRIPTION=$(awk '/^---/{f++; next} f==1 && /^description:/{p=1; sub(/^description:[[:space:]]*/,""); print; next} f==1 && p && /^[a-z]+:/{exit} f==1 && p{print}' "$1" | tr '\n' ' ' | sed 's/[[:space:]]*$//')
228
+ [[ -z "$_PF_NAME" ]] && return 1
229
+ return 0
230
+ }
231
+
232
+ # Extended parse_frontmatter for OKF mode (adds _PF_EFFORT)
217
233
  parse_frontmatter_okf() {
218
234
  local file="$1"
219
235
  _PF_EFFORT=""
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env bash
2
2
  # sync-status-from-epics.sh — seed execution-status.yaml keys from epic shards
3
3
  set -euo pipefail
4
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
4
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
5
+ resolve_repo_root
5
6
  SPECS="$REPO_ROOT/specs"
6
7
  OUT="$SPECS/execution-status.yaml"
7
8
  EPICS="$SPECS/epics"
@@ -17,7 +17,6 @@
17
17
 
18
18
  set -euo pipefail
19
19
 
20
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
21
20
  MATRIX_JSON="$REPO_ROOT/specs/traceability-matrix.json"
22
21
  TRACE_MD="$REPO_ROOT/specs/TRACEABILITY_LATEST.md"
23
22
  RELEASE_PLAN="$REPO_ROOT/specs/release-plan.yaml"
@@ -8,7 +8,6 @@
8
8
  # specs/**/*.yaml with PyYAML first, and runs the required-key checks
9
9
  # against the *parsed* objects, not against grep.
10
10
  set -euo pipefail
11
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
12
11
  SPECS="${1:-$REPO_ROOT/specs}"
13
12
 
14
13
  err=0
@@ -2,8 +2,9 @@
2
2
  # story: e47s04
3
3
  # verify-install.sh — manual assertion harness for install + seed wiring
4
4
  set -euo pipefail
5
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/skill-common.sh"
6
+ resolve_repo_root
5
7
 
6
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
8
  PASS=0
8
9
  FAIL=0
9
10
  TMPDIR=""
package/skills-lock.json CHANGED
@@ -127,7 +127,7 @@
127
127
  "path": "skills/fix-bugSKILL.md"
128
128
  },
129
129
  "gate-trace": {
130
- "description": "\"Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability.\"# story: e38s06",
130
+ "description": "\"Deterministic traceability quality gate — reads coverage matrix + blind-spot data, applies decision rules with oracle confidence downgrade, emits PASS/CONCERNS/FAIL/WAIVED verdict. Use before release-branch to gate merges on traceability.\"",
131
131
  "sha256": "81deb2549867386b",
132
132
  "path": "skills/gate-traceSKILL.md"
133
133
  },
@@ -167,7 +167,7 @@
167
167
  "path": "skills/kickoff-branchSKILL.md"
168
168
  },
169
169
  "maintain-wiki": {
170
- "description": "\"Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3.\"# story: e39s07",
170
+ "description": "\"Agent-maintained OKF wiki — INGEST source docs, LINT for issues, QUERY across concept pages. Run as part of build-epic Step 8 and verify-work Phase 3.\"",
171
171
  "sha256": "c54c6170db6fe3f9",
172
172
  "path": "skills/maintain-wikiSKILL.md"
173
173
  },
@@ -277,7 +277,7 @@
277
277
  "path": "skills/search-skillsSKILL.md"
278
278
  },
279
279
  "security-review": {
280
- "description": "> AI-powered security analysis of code changes — traces data flow, detects injection, auth bypass, secrets exposure, and unsafe deserialization across files. Use when reviewing pending changes, before release-branch, during verify-work Phase 5, during build-epic Step 0 threat modeling, or when the user says \"security review\" or \"scan for vulns\".",
280
+ "description": ">",
281
281
  "sha256": "da17dffef0b691c7",
282
282
  "path": "skills/security-reviewSKILL.md"
283
283
  },