bigpowers 2.74.12 → 2.75.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.
Files changed (166) hide show
  1. package/.pi/package.json +1 -1
  2. package/.pi/prompts/align-grid.md +6 -1
  3. package/.pi/prompts/assess-impact.md +2 -2
  4. package/.pi/prompts/audit-code.md +2 -2
  5. package/.pi/prompts/audit-plan.md +2 -2
  6. package/.pi/prompts/build-epic.md +2 -2
  7. package/.pi/prompts/change-request.md +2 -2
  8. package/.pi/prompts/commit-message.md +2 -2
  9. package/.pi/prompts/compose-workflow.md +2 -2
  10. package/.pi/prompts/context7-mcp.md +2 -2
  11. package/.pi/prompts/craft-skill.md +2 -2
  12. package/.pi/prompts/deepen-architecture.md +2 -2
  13. package/.pi/prompts/define-language.md +2 -2
  14. package/.pi/prompts/define-success.md +2 -2
  15. package/.pi/prompts/delegate-task.md +2 -2
  16. package/.pi/prompts/deploy.md +1 -1
  17. package/.pi/prompts/design-interface.md +2 -2
  18. package/.pi/prompts/develop-tdd.md +2 -2
  19. package/.pi/prompts/diagnose-root.md +2 -2
  20. package/.pi/prompts/diagnose-stall.md +2 -2
  21. package/.pi/prompts/dispatch-agents.md +2 -2
  22. package/.pi/prompts/edit-document.md +2 -2
  23. package/.pi/prompts/elaborate-spec.md +2 -2
  24. package/.pi/prompts/enforce-first.md +2 -2
  25. package/.pi/prompts/evolve-skill.md +2 -1
  26. package/.pi/prompts/execute-plan.md +2 -2
  27. package/.pi/prompts/extract-design.md +1 -1
  28. package/.pi/prompts/fix-bug.md +4 -2
  29. package/.pi/prompts/gate-trace.md +1 -1
  30. package/.pi/prompts/grill-me.md +2 -2
  31. package/.pi/prompts/grill-with-docs.md +2 -2
  32. package/.pi/prompts/guard-git.md +2 -2
  33. package/.pi/prompts/hook-commits.md +2 -2
  34. package/.pi/prompts/inspect-quality.md +2 -2
  35. package/.pi/prompts/investigate-bug.md +2 -2
  36. package/.pi/prompts/kickoff-branch.md +2 -2
  37. package/.pi/prompts/maintain-wiki.md +1 -1
  38. package/.pi/prompts/map-codebase.md +1 -1
  39. package/.pi/prompts/migrate-spec.md +4 -1
  40. package/.pi/prompts/model-domain.md +2 -2
  41. package/.pi/prompts/orchestrate-project.md +2 -2
  42. package/.pi/prompts/organize-workspace.md +2 -2
  43. package/.pi/prompts/plan-refactor.md +2 -2
  44. package/.pi/prompts/plan-release.md +1 -0
  45. package/.pi/prompts/plan-tests.md +1 -1
  46. package/.pi/prompts/plan-work.md +1 -1
  47. package/.pi/prompts/publish-package.md +1 -1
  48. package/.pi/prompts/quick-fix.md +1 -2
  49. package/.pi/prompts/release-branch.md +2 -2
  50. package/.pi/prompts/request-review.md +2 -2
  51. package/.pi/prompts/research-first.md +2 -2
  52. package/.pi/prompts/reset-baseline.md +2 -2
  53. package/.pi/prompts/respond-review.md +2 -2
  54. package/.pi/prompts/run-benchmark.md +2 -2
  55. package/.pi/prompts/run-evals.md +2 -2
  56. package/.pi/prompts/run-planning.md +1 -0
  57. package/.pi/prompts/scope-work.md +1 -1
  58. package/.pi/prompts/search-skills.md +2 -2
  59. package/.pi/prompts/security-review.md +2 -2
  60. package/.pi/prompts/seed-conventions.md +2 -2
  61. package/.pi/prompts/session-state.md +2 -2
  62. package/.pi/prompts/setup-environment.md +2 -2
  63. package/.pi/prompts/simulate-agents.md +2 -2
  64. package/.pi/prompts/slice-tasks.md +1 -1
  65. package/.pi/prompts/smoke-test.md +1 -1
  66. package/.pi/prompts/spike-prototype.md +2 -2
  67. package/.pi/prompts/stocktake-skills.md +2 -2
  68. package/.pi/prompts/survey-context.md +2 -2
  69. package/.pi/prompts/terse-mode.md +2 -2
  70. package/.pi/prompts/trace-requirement.md +2 -2
  71. package/.pi/prompts/using-bigpowers.md +2 -2
  72. package/.pi/prompts/validate-contracts.md +1 -1
  73. package/.pi/prompts/validate-fix.md +2 -2
  74. package/.pi/prompts/verify-work.md +2 -2
  75. package/.pi/prompts/visual-dashboard.md +2 -2
  76. package/.pi/prompts/wire-ci.md +1 -1
  77. package/.pi/prompts/wire-observability.md +2 -2
  78. package/.pi/prompts/write-document.md +2 -2
  79. package/.pi/skills/align-grid/SKILL.md +6 -2
  80. package/.pi/skills/assess-impact/SKILL.md +1 -2
  81. package/.pi/skills/audit-code/SKILL.md +1 -2
  82. package/.pi/skills/audit-plan/SKILL.md +1 -2
  83. package/.pi/skills/build-epic/SKILL.md +1 -2
  84. package/.pi/skills/change-request/SKILL.md +1 -2
  85. package/.pi/skills/commit-message/SKILL.md +1 -2
  86. package/.pi/skills/compose-workflow/SKILL.md +1 -2
  87. package/.pi/skills/context7-mcp/SKILL.md +1 -2
  88. package/.pi/skills/craft-skill/SKILL.md +1 -2
  89. package/.pi/skills/deepen-architecture/SKILL.md +1 -2
  90. package/.pi/skills/define-language/SKILL.md +1 -2
  91. package/.pi/skills/define-success/SKILL.md +1 -2
  92. package/.pi/skills/delegate-task/SKILL.md +1 -2
  93. package/.pi/skills/deploy/SKILL.md +1 -2
  94. package/.pi/skills/design-interface/SKILL.md +1 -2
  95. package/.pi/skills/develop-tdd/SKILL.md +1 -2
  96. package/.pi/skills/diagnose-root/SKILL.md +1 -2
  97. package/.pi/skills/diagnose-stall/SKILL.md +1 -2
  98. package/.pi/skills/dispatch-agents/SKILL.md +1 -2
  99. package/.pi/skills/edit-document/SKILL.md +1 -2
  100. package/.pi/skills/elaborate-spec/SKILL.md +1 -2
  101. package/.pi/skills/enforce-first/SKILL.md +1 -2
  102. package/.pi/skills/evolve-skill/SKILL.md +1 -1
  103. package/.pi/skills/execute-plan/SKILL.md +1 -2
  104. package/.pi/skills/extract-design/SKILL.md +1 -2
  105. package/.pi/skills/fix-bug/SKILL.md +3 -2
  106. package/.pi/skills/gate-trace/SKILL.md +1 -2
  107. package/.pi/skills/grill-me/SKILL.md +1 -2
  108. package/.pi/skills/grill-with-docs/SKILL.md +1 -2
  109. package/.pi/skills/guard-git/SKILL.md +1 -2
  110. package/.pi/skills/hook-commits/SKILL.md +1 -2
  111. package/.pi/skills/inspect-quality/SKILL.md +1 -2
  112. package/.pi/skills/investigate-bug/SKILL.md +1 -2
  113. package/.pi/skills/kickoff-branch/SKILL.md +1 -2
  114. package/.pi/skills/maintain-wiki/SKILL.md +1 -2
  115. package/.pi/skills/map-codebase/SKILL.md +1 -2
  116. package/.pi/skills/migrate-spec/SKILL.md +3 -1
  117. package/.pi/skills/model-domain/SKILL.md +1 -2
  118. package/.pi/skills/orchestrate-project/SKILL.md +1 -2
  119. package/.pi/skills/organize-workspace/SKILL.md +1 -2
  120. package/.pi/skills/plan-refactor/SKILL.md +1 -2
  121. package/.pi/skills/plan-release/SKILL.md +1 -1
  122. package/.pi/skills/plan-tests/SKILL.md +1 -2
  123. package/.pi/skills/plan-work/SKILL.md +1 -2
  124. package/.pi/skills/publish-package/SKILL.md +1 -2
  125. package/.pi/skills/quick-fix/SKILL.md +1 -3
  126. package/.pi/skills/release-branch/SKILL.md +1 -2
  127. package/.pi/skills/request-review/SKILL.md +1 -2
  128. package/.pi/skills/research-first/SKILL.md +1 -2
  129. package/.pi/skills/reset-baseline/SKILL.md +1 -2
  130. package/.pi/skills/respond-review/SKILL.md +1 -2
  131. package/.pi/skills/run-benchmark/SKILL.md +1 -2
  132. package/.pi/skills/run-evals/SKILL.md +1 -2
  133. package/.pi/skills/run-planning/SKILL.md +1 -1
  134. package/.pi/skills/scope-work/SKILL.md +1 -2
  135. package/.pi/skills/search-skills/SKILL.md +1 -2
  136. package/.pi/skills/security-review/SKILL.md +1 -2
  137. package/.pi/skills/seed-conventions/SKILL.md +1 -2
  138. package/.pi/skills/session-state/SKILL.md +1 -2
  139. package/.pi/skills/setup-environment/SKILL.md +1 -2
  140. package/.pi/skills/simulate-agents/SKILL.md +1 -2
  141. package/.pi/skills/slice-tasks/SKILL.md +1 -2
  142. package/.pi/skills/smoke-test/SKILL.md +1 -2
  143. package/.pi/skills/spike-prototype/SKILL.md +1 -2
  144. package/.pi/skills/stocktake-skills/SKILL.md +1 -2
  145. package/.pi/skills/survey-context/SKILL.md +1 -2
  146. package/.pi/skills/terse-mode/SKILL.md +1 -2
  147. package/.pi/skills/trace-requirement/SKILL.md +1 -2
  148. package/.pi/skills/using-bigpowers/SKILL.md +1 -2
  149. package/.pi/skills/validate-contracts/SKILL.md +1 -2
  150. package/.pi/skills/validate-fix/SKILL.md +1 -2
  151. package/.pi/skills/verify-work/SKILL.md +1 -2
  152. package/.pi/skills/visual-dashboard/SKILL.md +1 -2
  153. package/.pi/skills/wire-ci/SKILL.md +1 -2
  154. package/.pi/skills/wire-observability/SKILL.md +1 -2
  155. package/.pi/skills/write-document/SKILL.md +1 -2
  156. package/CHANGELOG.md +7 -0
  157. package/SKILL-INDEX.md +1 -1
  158. package/package.json +1 -1
  159. package/scripts/adapters/cursor.sh +13 -0
  160. package/scripts/adapters/gemini.sh +15 -1
  161. package/scripts/adapters/pi.sh +14 -0
  162. package/scripts/lib/srp-engine.py +245 -0
  163. package/scripts/sync-skills.sh +9 -27
  164. package/skills/define-success/SKILL.md +1 -1
  165. package/skills-lock.json +2 -2
  166. package/tests/test-srp-engine.sh +101 -0
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: seed-conventions
3
- description: "Generate CLAUDE.md and CONVENTIONS.md for a brand-new project through a brief interview, and create the specs/ directory with evolved bigpowers structure (product/, tech-architecture/, verifications/, epics/archive/). Entry point for greenfield projects. Use when starting a new project from scratch, when user asks to set up AI agent conventions, or when there is no CLAUDE.md yet."
4
3
  model: sonnet
4
+ description: "Generate CLAUDE.md and CONVENTIONS.md for a brand-new project through a brief interview, and create the specs/ directory with evolved bigpowers structure (product/, tech-architecture/, verifications/, epics/archive/). Entry point for greenfield projects. Use when starting a new project from scratch, when user asks to set up AI agent conventions, or when there is no CLAUDE.md yet."
5
5
  ---
6
6
 
7
-
8
7
  # story: e10s01
9
8
  # story: e47s02
10
9
  # story: e10s02
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: session-state
3
- description: "Track implementation decisions and progress in specs/state.yaml to prevent context rot. Use at the start of a session to load context, and whenever a significant decision is made or a milestone is reached."
4
3
  model: haiku
4
+ description: "Track implementation decisions and progress in specs/state.yaml to prevent context rot. Use at the start of a session to load context, and whenever a significant decision is made or a milestone is reached."
5
5
  ---
6
6
 
7
-
8
7
  # story: e45s23
9
8
 
10
9
  # Session State
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: setup-environment
3
- description: "Pre-install dependencies and configure tools before development work begins. Use at session start on a fresh clone, before kickoff-branch, or when user says setup environment or install deps."
4
3
  model: haiku
4
+ description: "Pre-install dependencies and configure tools before development work begins. Use at session start on a fresh clone, before kickoff-branch, or when user says setup environment or install deps."
5
5
  ---
6
6
 
7
-
8
7
  # Setup Environment
9
8
  > **HARD GATE** — **HARD GATE** — Environment setup must be idempotent and reproducible. If setup fails, provide clear error messages and remediation steps. Do NOT assume prior state.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: simulate-agents
3
- description: "Run Mock User and Auditor agents against a feature in fresh contexts before human review. Use after verify-work, before request-review, when user wants pre-review simulation."
4
3
  model: sonnet
4
+ description: "Run Mock User and Auditor agents against a feature in fresh contexts before human review. Use after verify-work, before request-review, when user wants pre-review simulation."
5
5
  ---
6
6
 
7
-
8
7
  # Simulate Agents
9
8
  > **HARD GATE** — **HARD GATE** — Simulations are hypothetical. Do NOT use sim results to make production decisions without validation on real agents. Sims help discover gaps, not replace testing.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: slice-tasks
3
- description: "\"PLANNING SPINE STEP 2 of 3 — Slice the work: break a scoped PRD into vertical-slice stories in specs/epics/. Use after scope-work (step 1), before plan-work (step 3). Not a substitute for scope-work or plan-work.\""
4
3
  model: sonnet
4
+ description: "PLANNING SPINE STEP 2 of 3 — Slice the work: break a scoped PRD into vertical-slice stories in specs/epics/. Use after scope-work (step 1), before plan-work (step 3). Not a substitute for scope-work or plan-work."
5
5
  ---
6
6
 
7
-
8
7
  # story: e45s29
9
8
 
10
9
  # Slice Tasks
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: smoke-test
3
- description: "\"Post-deploy health-check against a live URL. Validates HTTP status, response content, and critical endpoints. Runnable standalone OR as the final step of the deploy skill.\""
4
3
  model: sonnet
4
+ description: "Post-deploy health-check against a live URL. Validates HTTP status, response content, and critical endpoints. Runnable standalone OR as the final step of the deploy skill."
5
5
  ---
6
6
 
7
-
8
7
  # Smoke Test
9
8
 
10
9
  > **HARD GATE** — Do NOT run smoke-test against a URL that hasn't been deployed yet. Always run `deploy` first, then `smoke-test`.
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: spike-prototype
3
- description: "Throw-away prototype for unknown problem spaces. Output is learning notes in specs/archive/spikes/SPIKE-<name>.md, not production code. Use when the domain or technology is unexplored, when estimates are impossible without experimentation, or when user says \"spike\", \"prototype\", or \"proof of concept\"."
4
3
  model: sonnet
4
+ description: "Throw-away prototype for unknown problem spaces. Output is learning notes in specs/archive/spikes/SPIKE-<name>.md, not production code. Use when the domain or technology is unexplored, when estimates are impossible without experimentation, or when user says \"spike\", \"prototype\", or \"proof of concept\"."
5
5
  ---
6
6
 
7
-
8
7
  # Spike Prototype
9
8
  > **HARD GATE** — **HARD GATE** — Spikes are time-boxed experiments, not shipping code. Results must be throwaway or clearly isolated. Do NOT merge a spike without a plan to integrate it or replace it with a proper implementation.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: stocktake-skills
3
- description: "Sequential subagent batch audit of the bigpowers skill catalog — Quick Scan (changed only) or Full (all skills). Use during sustain phase, before a major release, or when catalog drift is suspected."
4
3
  model: sonnet
4
+ description: "Sequential subagent batch audit of the bigpowers skill catalog — Quick Scan (changed only) or Full (all skills). Use during sustain phase, before a major release, or when catalog drift is suspected."
5
5
  ---
6
6
 
7
-
8
7
  # story: e09s01
9
8
  <!-- story: e45s12 -->
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: survey-context
3
- description: "Per-task context bootstrap — reads existing specs/ and tech-architecture docs to map the current lifecycle phase and suggest the next skill. Use at the start of any task, when returning after a break, or when unsure what to do next. For deriving a tech-stack doc from scratch, use map-codebase first."
4
3
  model: haiku
4
+ description: "Per-task context bootstrap — reads existing specs/ and tech-architecture docs to map the current lifecycle phase and suggest the next skill. Use at the start of any task, when returning after a break, or when unsure what to do next. For deriving a tech-stack doc from scratch, use map-codebase first."
5
5
  ---
6
6
 
7
-
8
7
  # Survey Context
9
8
 
10
9
  Read the project's current state and give a phase map + next-skill recommendation. This is the "where am I?" skill — run it at the start of every task.
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: terse-mode
3
- description: "Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use ONLY when context is critically long and compressing output is necessary to continue. Not a strategy — token discipline comes from code shape (small functions, unique names, headless tests), not terser prompts. Use when user says \"caveman mode\", \"terse mode\", \"less tokens\", \"be brief\", or invokes /terse-mode."
4
3
  model: haiku
4
+ description: "Fallback ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use ONLY when context is critically long and compressing output is necessary to continue. Not a strategy — token discipline comes from code shape (small functions, unique names, headless tests), not terser prompts. Use when user says \"caveman mode\", \"terse mode\", \"less tokens\", \"be brief\", or invokes /terse-mode."
5
5
  ---
6
6
 
7
-
8
7
  Respond terse like smart caveman. All technical substance stay. Only fluff die.
9
8
 
10
9
  ## Persistence
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: trace-requirement
3
- description: "Link story IDs from specs/release-plan.yaml + epic capsule directories to the implementing code and tests. Produces specs/TRACEABILITY_LATEST.md. Use when you want to verify coverage of a release plan, audit which stories are implemented, or find \"dark\" stories with no code."
4
3
  model: haiku
4
+ description: "Link story IDs from specs/release-plan.yaml + epic capsule directories to the implementing code and tests. Produces specs/TRACEABILITY_LATEST.md. Use when you want to verify coverage of a release plan, audit which stories are implemented, or find \"dark\" stories with no code."
5
5
  ---
6
6
 
7
-
8
7
  # Trace Requirement
9
8
 
10
9
  Build a traceability matrix from `specs/release-plan.yaml + epic capsule directories` to implementing code and tests. Surfaces gaps in both directions: stories with no code, and code with no story.
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: using-bigpowers
3
- description: "One-time bootstrap that introduces the bigpowers skills system, the PMBOK lifecycle arc, and tells you which skill to call first for your situation. Use when starting with bigpowers for the first time, when user asks \"where do I start?\", or when the skills system needs to be explained."
4
3
  model: sonnet
4
+ description: "One-time bootstrap that introduces the bigpowers skills system, the PMBOK lifecycle arc, and tells you which skill to call first for your situation. Use when starting with bigpowers for the first time, when user asks \"where do I start?\", or when the skills system needs to be explained."
5
5
  ---
6
6
 
7
-
8
7
  # Using bigpowers
9
8
  > **HARD GATE** — **HARD GATE** — This skill is the entry point. Do NOT skip it when onboarding new users or starting a new session. It establishes the bigpowers methodology, lifecycle phases, and conventions.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: validate-contracts
3
- description: "\"Assert data shape consistency across system boundaries — live API responses against JSON Schema, key-set comparison across layers, data shape validation for migrations and exports. Catches silent data corruption before deploy.\""
4
3
  model: sonnet
4
+ description: "Assert data shape consistency across system boundaries — live API responses against JSON Schema, key-set comparison across layers, data shape validation for migrations and exports. Catches silent data corruption before deploy."
5
5
  ---
6
6
 
7
-
8
7
  # Validate Contracts
9
8
 
10
9
  > **HARD GATE** — Do NOT deploy or migrate data without running `validate-contracts` first. Silent data divergence between system boundaries causes the hardest-to-debug production bugs.
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: validate-fix
3
- description: "Prove a fix works before declaring done — re-run the failing test, run the full suite, typecheck, lint, and harden against recurrence. Use after implementing a bug fix, when user says \"is this fixed?\", or before closing an investigation."
4
3
  model: haiku
4
+ description: "Prove a fix works before declaring done — re-run the failing test, run the full suite, typecheck, lint, and harden against recurrence. Use after implementing a bug fix, when user says \"is this fixed?\", or before closing an investigation."
5
5
  ---
6
6
 
7
-
8
7
  # Validate Fix
9
8
  > **HARD GATE** — **HARD GATE** — Fix must not regress. Run full test suite and manual UAT before declaring success. A fix that passes tests but breaks something else is a failure.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: verify-work
3
- description: "Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-by-step manual verification, gaps-closure loop. Use after execute-plan or develop-tdd, before audit-code."
4
3
  model: haiku
4
+ description: "Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-by-step manual verification, gaps-closure loop. Use after execute-plan or develop-tdd, before audit-code."
5
5
  ---
6
6
 
7
-
8
7
  <!-- story: e02s01 e46s03 -->
9
8
  <!-- story: e38s05 -->
10
9
  <!-- story: e45s05 -->
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: visual-dashboard
3
- description: "Start a browser-based dashboard that visualizes architecture, implementation plans, and project status. Persists artifacts in .bigpowers/dashboard/. Reads specs/state.yaml, release-plan.yaml, epics, and planning-status via HTTP API or opencode panel."
4
3
  model: sonnet
4
+ description: "Start a browser-based dashboard that visualizes architecture, implementation plans, and project status. Persists artifacts in .bigpowers/dashboard/. Reads specs/state.yaml, release-plan.yaml, epics, and planning-status via HTTP API or opencode panel."
5
5
  ---
6
6
 
7
-
8
7
  # Visual Dashboard
9
8
  > **HARD GATE** — **HARD GATE** — Dashboards are read-only. Do NOT use visualization to make decisions without consulting the source data. 'The chart looks better' is not a decision.
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: wire-ci
3
- description: "\"CI pipeline setup with pre-built templates and local validation. Generates GitHub Actions workflows, validates YAML syntax and permissions, supports dry-run via act/gh. The CI equivalent of wire-observability.\""
4
3
  model: sonnet
4
+ description: "CI pipeline setup with pre-built templates and local validation. Generates GitHub Actions workflows, validates YAML syntax and permissions, supports dry-run via act/gh. The CI equivalent of wire-observability."
5
5
  ---
6
6
 
7
-
8
7
  # Wire CI
9
8
 
10
9
  > **HARD GATE** — Do not ship a project without CI. Run this skill before first merge to main or when adding CI to an existing project.
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: wire-observability
3
- description: "Add structured JSON logging, observability commands, and idempotent setup scripts to a project. Use when a project needs production-readiness instrumentation, when user wants structured logging, or as a production-readiness gate at any phase of development."
4
3
  model: sonnet
4
+ description: "Add structured JSON logging, observability commands, and idempotent setup scripts to a project. Use when a project needs production-readiness instrumentation, when user wants structured logging, or as a production-readiness gate at any phase of development."
5
5
  ---
6
6
 
7
-
8
7
  # Wire Observability
9
8
  > **HARD GATE** — **HARD GATE** — Observability is not optional. Before shipping, verify: structured logging is in place, key metrics are instrumented, error cases emit signals. 'We'll add metrics later' becomes 'never.'
10
9
 
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  name: write-document
3
- description: "Write, organize, and sync high-integrity technical documents using the BMAD methodology. Ensures every document is Bold, Minimal, Actionable, and Durable. Use when creating architectural docs, technical guides, or organizing the specs/ directory."
4
3
  model: sonnet
4
+ description: "Write, organize, and sync high-integrity technical documents using the BMAD methodology. Ensures every document is Bold, Minimal, Actionable, and Durable. Use when creating architectural docs, technical guides, or organizing the specs/ directory."
5
5
  ---
6
6
 
7
-
8
7
  # Write Document (BMAD)
9
8
 
10
9
  Create high-signal technical documentation that serves as an expert collaborator for both humans and AI. This skill enforces the BMAD principles to prevent context rot and ensure architectural durability.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [2.75.0](https://github.com/danielvm-git/bigpowers/compare/v2.74.12...v2.75.0) (2026-07-07)
2
+
3
+
4
+ ### Features
5
+
6
+ * **srp:** refactor skills render pipeline to hybrid JSON seam ([9532291](https://github.com/danielvm-git/bigpowers/commit/9532291010aad9027867895af2e2224df9449e7c))
7
+
1
8
  ## [2.74.12](https://github.com/danielvm-git/bigpowers/compare/v2.74.11...v2.74.12) (2026-07-07)
2
9
 
3
10
 
package/SKILL-INDEX.md CHANGED
@@ -35,7 +35,7 @@
35
35
  | 7 | Discover | `using-bigpowers` | One-time bootstrap that introduces the bigpowers skills system, the PMBOK lifecy | ✅ Active |
36
36
  | 8 | Design | `deepen-architecture` | Find deepening opportunities in a codebase, informed by the domain language in s | ✅ Active |
37
37
  | 9 | Design | `define-language` | Extract a DDD-style ubiquitous language glossary from the current conversation, | ✅ Active |
38
- | 10 | Design | `define-success` | Convert an imperative task statement into explicit "step → verify: <cmd>" pair | ✅ Active |
38
+ | 10 | Design | `define-success` | 'Convert an imperative task statement into explicit "step → verify: <cmd>" pai | ✅ Active |
39
39
  | 11 | Design | `design-interface` | Generate multiple radically different interface designs for a module using paral | ✅ Active |
40
40
  | 12 | Design | `grill-me` | Interactive assumption-surfacing Q&A that stress-tests a plan through relentless | ✅ Active |
41
41
  | 13 | Design | `grill-with-docs` | Doc-grounded variant of grill-me — stress-tests plan assumptions by fetching a | ✅ Active |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.74.12",
3
+ "version": "2.75.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,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # story: e48s15
2
3
  # story: e37s05 e37s07
3
4
  # scenario: SC-e37s07-P0-02
4
5
  # Cursor skill adapter — renders .cursor/rules/*.mdc from IR globals.
@@ -23,3 +24,15 @@ wire_context() {
23
24
  source "$(dirname "${BASH_SOURCE[0]}")/../lib/context-wire.sh"
24
25
  wire_context_mode symlink "${1:-CLAUDE.md}"
25
26
  }
27
+
28
+ # If stdin is a pipe/redirect, read the SkillIR JSON and render
29
+ if [[ ! -t 0 ]]; then
30
+ JSON_INPUT=$(cat)
31
+ if [[ -n "$JSON_INPUT" ]]; then
32
+ IR_NAME=$(echo "$JSON_INPUT" | jq -r '.name')
33
+ IR_DESCRIPTION=$(echo "$JSON_INPUT" | jq -r '.description')
34
+ IR_BODY=$(echo "$JSON_INPUT" | jq -r '.body')
35
+ IR_DESC_ESCAPED=$(echo "$IR_DESCRIPTION" | sed 's/\\/\\\\/g; s/\"/\\"/g')
36
+ render_skill
37
+ fi
38
+ fi
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # story: e48s15
2
3
  # story: e37s05 e37s07
3
4
 
4
5
  render_skill() {
@@ -19,7 +20,7 @@ render_skill() {
19
20
  echo "$IR_BODY"
20
21
  } > "${GEMINI_SKILLS}/$IR_NAME/SKILL.md"
21
22
 
22
- mkdir -p "${GEMINI_COMMANDS:-.gemini/extensions/bigpowers/commands/prompts}"
23
+ mkdir -p "${GEMINI_COMMANDS:-.gemini/extensions/bigpowers/commands}/prompts"
23
24
  {
24
25
  echo "---"
25
26
  echo "name: $IR_NAME"
@@ -34,3 +35,16 @@ wire_context() {
34
35
  source "$(dirname "${BASH_SOURCE[0]}")/../lib/context-wire.sh"
35
36
  wire_context_mode symlink "${1:-GEMINI.md}"
36
37
  }
38
+
39
+ # If stdin is a pipe/redirect, read the SkillIR JSON and render
40
+ if [[ ! -t 0 ]]; then
41
+ JSON_INPUT=$(cat)
42
+ if [[ -n "$JSON_INPUT" ]]; then
43
+ IR_NAME=$(echo "$JSON_INPUT" | jq -r '.name')
44
+ IR_MODEL=$(echo "$JSON_INPUT" | jq -r '.model')
45
+ IR_DESCRIPTION=$(echo "$JSON_INPUT" | jq -r '.description')
46
+ IR_BODY=$(echo "$JSON_INPUT" | jq -r '.body')
47
+ IR_DESC_ESCAPED=$(echo "$IR_DESCRIPTION" | sed 's/\\/\\\\/g; s/\"/\\"/g')
48
+ render_skill
49
+ fi
50
+ fi
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # story: e48s15
2
3
  # story: e37s05 e37s07
3
4
 
4
5
  render_skill() {
@@ -35,3 +36,16 @@ wire_context() {
35
36
  source "$(dirname "${BASH_SOURCE[0]}")/../lib/context-wire.sh"
36
37
  wire_context_mode symlink "${1:-CLAUDE.md}"
37
38
  }
39
+
40
+ # If stdin is a pipe/redirect, read the SkillIR JSON and render
41
+ if [[ ! -t 0 ]]; then
42
+ JSON_INPUT=$(cat)
43
+ if [[ -n "$JSON_INPUT" ]]; then
44
+ IR_NAME=$(echo "$JSON_INPUT" | jq -r '.name')
45
+ IR_MODEL=$(echo "$JSON_INPUT" | jq -r '.model')
46
+ IR_DESCRIPTION=$(echo "$JSON_INPUT" | jq -r '.description')
47
+ IR_BODY=$(echo "$JSON_INPUT" | jq -r '.body')
48
+ IR_DESC_ESCAPED=$(echo "$IR_DESCRIPTION" | sed 's/\\/\\\\/g; s/\"/\\"/g')
49
+ render_skill
50
+ fi
51
+ fi
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env python3
2
+ # story: e48s15
3
+ import os
4
+ import sys
5
+ import json
6
+ import glob
7
+ import subprocess
8
+ import yaml
9
+
10
+ def resolve_repo_root():
11
+ lib_dir = os.path.dirname(os.path.abspath(__file__))
12
+ # scripts/lib/srp-engine.py -> two levels up is REPO_ROOT
13
+ repo_candidate = os.path.dirname(os.path.dirname(lib_dir))
14
+ if os.path.isdir(os.path.join(repo_candidate, "skills")):
15
+ return repo_candidate
16
+ return os.path.dirname(lib_dir)
17
+
18
+ def parse_skill(skill_md_path):
19
+ if not os.path.isfile(skill_md_path):
20
+ print(f"Error: file not found {skill_md_path}", file=sys.stderr)
21
+ sys.exit(1)
22
+
23
+ skill_dir = os.path.dirname(skill_md_path)
24
+
25
+ # Read file content
26
+ with open(skill_md_path, 'r', encoding='utf-8') as f:
27
+ content = f.read()
28
+
29
+ # Split frontmatter and body
30
+ parts = content.split('---')
31
+ if len(parts) < 3:
32
+ print(f"Error: invalid SKILL.md format in {skill_md_path}", file=sys.stderr)
33
+ sys.exit(1)
34
+
35
+ frontmatter_raw = parts[1]
36
+ # The body of SKILL.md starts after the second '---'
37
+ skill_body = '---'.join(parts[2:])
38
+
39
+ try:
40
+ frontmatter = yaml.safe_load(frontmatter_raw)
41
+ except Exception as e:
42
+ print(f"Error parsing YAML frontmatter in {skill_md_path}: {e}", file=sys.stderr)
43
+ sys.exit(1)
44
+
45
+ if not isinstance(frontmatter, dict):
46
+ print(f"Error: frontmatter is not a dictionary in {skill_md_path}", file=sys.stderr)
47
+ sys.exit(1)
48
+
49
+ name = frontmatter.get('name', '')
50
+ description = frontmatter.get('description', '')
51
+ effort = frontmatter.get('effort', 'standard')
52
+ model = frontmatter.get('model', '')
53
+
54
+ # Compile the full body (including other *.md files in the directory)
55
+ body = skill_body.strip()
56
+ extra_files = glob.glob(os.path.join(skill_dir, "*.md"))
57
+ # Filter out SKILL.md
58
+ extra_files = [f for f in extra_files if os.path.basename(f) != "SKILL.md"]
59
+ # Sort them by name (ASCII sorting as in LC_ALL=C sort)
60
+ extra_files.sort()
61
+
62
+ for extra_file in extra_files:
63
+ with open(extra_file, 'r', encoding='utf-8') as f:
64
+ extra_content = f.read()
65
+ body += "\n\n---\n\n" + extra_content.strip()
66
+
67
+ # Remove lines containing 'disable-model-invocation'
68
+ body_lines = body.splitlines()
69
+ body_lines = [line for line in body_lines if 'disable-model-invocation' not in line]
70
+ body = '\n'.join(body_lines)
71
+
72
+ return {
73
+ 'name': name,
74
+ 'description': description,
75
+ 'effort': effort,
76
+ 'model': model,
77
+ 'body': body
78
+ }
79
+
80
+ def get_active_adapters(repo_root):
81
+ targets_file = os.path.join(repo_root, "scripts", "targets.yaml")
82
+ if not os.path.isfile(targets_file):
83
+ return ["cursor", "gemini", "pi"]
84
+ try:
85
+ with open(targets_file, 'r', encoding='utf-8') as f:
86
+ data = yaml.safe_load(f)
87
+ adapters = []
88
+ for target in data.get('targets', []):
89
+ if target.get('skill') is not None:
90
+ adapter = target['skill'].get('adapter')
91
+ if adapter and adapter not in adapters:
92
+ adapters.append(adapter)
93
+ return sorted(adapters)
94
+ except Exception as e:
95
+ print(f"Warning: error reading targets.yaml: {e}", file=sys.stderr)
96
+ return ["cursor", "gemini", "pi"]
97
+
98
+ def iterate_skills(repo_root):
99
+ skills_root = os.path.join(repo_root, "skills")
100
+ if not os.path.isdir(skills_root):
101
+ skills_root = repo_root
102
+
103
+ skills = []
104
+ for entry in os.listdir(skills_root):
105
+ skill_dir = os.path.join(skills_root, entry)
106
+ if os.path.isdir(skill_dir):
107
+ skill_md = os.path.join(skill_dir, "SKILL.md")
108
+ if os.path.isfile(skill_md):
109
+ skills.append(skill_md)
110
+ return sorted(skills)
111
+
112
+ def render_okf_concept(skill_data, okf_wiki_skills):
113
+ name = skill_data['name']
114
+ model = skill_data['model']
115
+ effort = skill_data['effort']
116
+ description = skill_data['description']
117
+
118
+ os.makedirs(okf_wiki_skills, exist_ok=True)
119
+ okf_file = os.path.join(okf_wiki_skills, f"{name}.md")
120
+
121
+ phase = "utility"
122
+ critical_path_skills = {
123
+ "survey-context", "elaborate-spec", "model-domain", "define-language",
124
+ "design-interface", "plan-work", "plan-release", "slice-tasks",
125
+ "kickoff-branch", "develop-tdd", "verify-work", "audit-code",
126
+ "commit-message", "release-branch", "security-review",
127
+ "assess-impact", "investigate-bug", "validate-fix", "dispatch-agents",
128
+ "request-review", "respond-review", "hook-commits", "guard-git",
129
+ "wire-observability", "wire-ci", "smoke-test", "deploy", "enforce-first"
130
+ }
131
+ if name in critical_path_skills:
132
+ phase = "critical-path"
133
+
134
+ title = name.replace("-", " ").title()
135
+ desc_escaped = description.replace("\\", "\\\\").replace('"', '\\"')
136
+
137
+ lines = [
138
+ "---",
139
+ "okf_kind: concept",
140
+ "type: Skill",
141
+ f"id: {name}",
142
+ f'title: "{title}"',
143
+ f"name: {name}",
144
+ "category: skills"
145
+ ]
146
+ if model:
147
+ lines.append(f"model: {model}")
148
+ lines.extend([
149
+ f"effort: {effort}",
150
+ f"phase: {phase}",
151
+ f'description: "{desc_escaped}"',
152
+ "references: []",
153
+ "---",
154
+ "",
155
+ f"# {title}",
156
+ "",
157
+ f"**Phase:** {phase}"
158
+ ])
159
+ if model:
160
+ lines.append(f"**Model:** {model}")
161
+ lines.extend([
162
+ f"**Effort:** {effort}",
163
+ "",
164
+ description,
165
+ "",
166
+ f"> Auto-generated by sync-skills.sh --okf (e39s04) from skills/{name}/SKILL.md"
167
+ ])
168
+
169
+ with open(okf_file, 'w', encoding='utf-8') as f:
170
+ f.write('\n'.join(lines) + '\n')
171
+
172
+ def dispatch_to_adapter(skill_data, target, repo_root):
173
+ adapter_path = os.path.join(repo_root, "scripts", "adapters", f"{target}.sh")
174
+ if not os.path.isfile(adapter_path):
175
+ print(f"Error: adapter not found: {adapter_path}", file=sys.stderr)
176
+ sys.exit(1)
177
+
178
+ # Pipe JSON to the adapter
179
+ proc = subprocess.Popen(
180
+ ['bash', adapter_path],
181
+ stdin=subprocess.PIPE,
182
+ stdout=subprocess.PIPE,
183
+ stderr=subprocess.PIPE,
184
+ text=True
185
+ )
186
+ stdout, stderr = proc.communicate(input=json.dumps(skill_data))
187
+
188
+ if stdout:
189
+ print(stdout, end="")
190
+ if stderr:
191
+ print(stderr, end="", file=sys.stderr)
192
+
193
+ if proc.returncode != 0:
194
+ print(f"Error: adapter {target} failed with exit code {proc.returncode}", file=sys.stderr)
195
+ sys.exit(proc.returncode)
196
+
197
+ def main():
198
+ repo_root = resolve_repo_root()
199
+
200
+ if "--all" in sys.argv:
201
+ okf_mode = "--okf" in sys.argv
202
+ skills = iterate_skills(repo_root)
203
+ adapters = get_active_adapters(repo_root)
204
+
205
+ okf_wiki_skills = os.environ.get("OKF_WIKI_SKILLS", os.path.join(repo_root, "specs", "skills-wiki", "skills"))
206
+
207
+ for skill_md in skills:
208
+ skill_data = parse_skill(skill_md)
209
+ if not skill_data['name']:
210
+ continue
211
+
212
+ for adapter in adapters:
213
+ dispatch_to_adapter(skill_data, adapter, repo_root)
214
+
215
+ if okf_mode:
216
+ render_okf_concept(skill_data, okf_wiki_skills)
217
+ return
218
+
219
+ if len(sys.argv) < 2:
220
+ print("Usage: srp-engine.py <path-to-SKILL.md> [--dry-run] [--target <target>]", file=sys.stderr)
221
+ print(" srp-engine.py --all [--okf]", file=sys.stderr)
222
+ sys.exit(1)
223
+
224
+ skill_md_path = sys.argv[1]
225
+ dry_run = "--dry-run" in sys.argv
226
+ target = None
227
+
228
+ if "--target" in sys.argv:
229
+ try:
230
+ target_idx = sys.argv.index("--target")
231
+ target = sys.argv[target_idx + 1]
232
+ except (ValueError, IndexError):
233
+ print("Error: --target requires an argument", file=sys.stderr)
234
+ sys.exit(1)
235
+
236
+ skill_data = parse_skill(skill_md_path)
237
+
238
+ if dry_run or not target:
239
+ print(json.dumps(skill_data, indent=2))
240
+ return
241
+
242
+ dispatch_to_adapter(skill_data, target, repo_root)
243
+
244
+ if __name__ == "__main__":
245
+ main()