bigpowers 2.68.1 → 2.68.2

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.68.1",
3
+ "version": "2.68.2",
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"
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [2.68.2](https://github.com/danielvm-git/bigpowers/compare/v2.68.1...v2.68.2) (2026-07-06)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **ci:** extract stale-lock check to script — inline Python broke YAML parser ([1fd0126](https://github.com/danielvm-git/bigpowers/commit/1fd01261c0c3bee250a89aab394f35fb21e41c75))
7
+ * **ci:** validate-specs-yaml.sh REPO_ROOT unbound in skill-health — add local resolution ([4dada67](https://github.com/danielvm-git/bigpowers/commit/4dada67dfe47c9e3228cb1749c3200851a6f241a))
8
+
1
9
  ## [2.68.1](https://github.com/danielvm-git/bigpowers/compare/v2.68.0...v2.68.1) (2026-07-06)
2
10
 
3
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.68.1",
3
+ "version": "2.68.2",
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": {
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+ # story: e39s02
3
+ # Validate that no agent lock in specs/agent-locks.yaml is >24h old.
4
+ set -euo pipefail
5
+
6
+ LOCK_FILE="specs/agent-locks.yaml"
7
+ if [ ! -f "$LOCK_FILE" ]; then
8
+ echo "No agent-locks.yaml — skipping stale-lock check"
9
+ exit 0
10
+ fi
11
+
12
+ python3 -c "
13
+ import yaml, datetime, sys
14
+
15
+ now = datetime.datetime.now(datetime.timezone.utc)
16
+ with open('$LOCK_FILE') as f:
17
+ d = yaml.safe_load(f)
18
+
19
+ if not d or 'locks' not in d:
20
+ print('No locks to validate')
21
+ sys.exit(0)
22
+
23
+ stale = []
24
+ for lock in d['locks']:
25
+ locked_at = datetime.datetime.fromisoformat(lock.get('locked_at', '1970-01-01T00:00:00Z'))
26
+ if locked_at.tzinfo is None:
27
+ locked_at = locked_at.replace(tzinfo=datetime.timezone.utc)
28
+ age_hours = (now - locked_at).total_seconds() / 3600
29
+ if age_hours > 24:
30
+ stale.append(f'{lock[\"story_id\"]}: locked by {lock.get(\"locked_by\", \"?\")} for {age_hours:.1f}h')
31
+
32
+ if stale:
33
+ print(f'::warning::Stale locks found (>24h):')
34
+ for s in stale:
35
+ print(f' {s}')
36
+ else:
37
+ print('No stale locks')
38
+ " 2>&1
@@ -8,6 +8,11 @@
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
+
12
+ # Resolve REPO_ROOT from script location
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
15
+
11
16
  SPECS="${1:-$REPO_ROOT/specs}"
12
17
 
13
18
  err=0