godpowers 0.15.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 (444) hide show
  1. package/AGENTS.md +37 -0
  2. package/CHANGELOG.md +639 -0
  3. package/INSPIRATION.md +52 -0
  4. package/LICENSE +21 -0
  5. package/README.md +232 -0
  6. package/SKILL.md +500 -0
  7. package/agents/god-archaeologist.md +139 -0
  8. package/agents/god-architect.md +92 -0
  9. package/agents/god-auditor.md +150 -0
  10. package/agents/god-browser-tester.md +144 -0
  11. package/agents/god-context-writer.md +137 -0
  12. package/agents/god-coordinator.md +138 -0
  13. package/agents/god-debt-assessor.md +132 -0
  14. package/agents/god-debugger.md +77 -0
  15. package/agents/god-deploy-engineer.md +87 -0
  16. package/agents/god-deps-auditor.md +111 -0
  17. package/agents/god-design-reviewer.md +137 -0
  18. package/agents/god-designer.md +171 -0
  19. package/agents/god-docs-writer.md +102 -0
  20. package/agents/god-executor.md +76 -0
  21. package/agents/god-explorer.md +110 -0
  22. package/agents/god-harden-auditor.md +163 -0
  23. package/agents/god-incident-investigator.md +144 -0
  24. package/agents/god-launch-strategist.md +103 -0
  25. package/agents/god-migration-strategist.md +126 -0
  26. package/agents/god-observability-engineer.md +76 -0
  27. package/agents/god-orchestrator.md +728 -0
  28. package/agents/god-org-context-loader.md +124 -0
  29. package/agents/god-planner.md +73 -0
  30. package/agents/god-pm.md +105 -0
  31. package/agents/god-quality-reviewer.md +74 -0
  32. package/agents/god-reconciler.md +230 -0
  33. package/agents/god-reconstructor.md +124 -0
  34. package/agents/god-repo-scaffolder.md +60 -0
  35. package/agents/god-retrospective.md +109 -0
  36. package/agents/god-roadmap-reconciler.md +123 -0
  37. package/agents/god-roadmap-updater.md +89 -0
  38. package/agents/god-roadmapper.md +82 -0
  39. package/agents/god-spec-reviewer.md +70 -0
  40. package/agents/god-spike-runner.md +119 -0
  41. package/agents/god-stack-selector.md +93 -0
  42. package/agents/god-standards-check.md +132 -0
  43. package/agents/god-storyteller.md +116 -0
  44. package/agents/god-updater.md +174 -0
  45. package/bin/install.js +514 -0
  46. package/extensions/data-pack/README.md +33 -0
  47. package/extensions/data-pack/agents/god-dashboard-builder.md +66 -0
  48. package/extensions/data-pack/agents/god-etl-engineer.md +64 -0
  49. package/extensions/data-pack/agents/god-ml-feature-engineer.md +66 -0
  50. package/extensions/data-pack/manifest.yaml +39 -0
  51. package/extensions/data-pack/package.json +42 -0
  52. package/extensions/data-pack/skills/god-dashboard.md +28 -0
  53. package/extensions/data-pack/skills/god-etl.md +28 -0
  54. package/extensions/data-pack/skills/god-ml-feature.md +28 -0
  55. package/extensions/data-pack/workflows/dashboard-arc.yaml +13 -0
  56. package/extensions/data-pack/workflows/etl-arc.yaml +13 -0
  57. package/extensions/data-pack/workflows/ml-feature-arc.yaml +13 -0
  58. package/extensions/launch-pack/README.md +36 -0
  59. package/extensions/launch-pack/agents/god-indie-hackers-strategist.md +128 -0
  60. package/extensions/launch-pack/agents/god-oss-release-strategist.md +125 -0
  61. package/extensions/launch-pack/agents/god-product-hunt-strategist.md +118 -0
  62. package/extensions/launch-pack/agents/god-show-hn-strategist.md +113 -0
  63. package/extensions/launch-pack/manifest.yaml +45 -0
  64. package/extensions/launch-pack/package.json +41 -0
  65. package/extensions/launch-pack/skills/god-indie-hackers.md +39 -0
  66. package/extensions/launch-pack/skills/god-oss-release.md +43 -0
  67. package/extensions/launch-pack/skills/god-product-hunt.md +41 -0
  68. package/extensions/launch-pack/skills/god-show-hn.md +40 -0
  69. package/extensions/launch-pack/workflows/indie-hackers.yaml +13 -0
  70. package/extensions/launch-pack/workflows/oss-release.yaml +13 -0
  71. package/extensions/launch-pack/workflows/product-hunt.yaml +13 -0
  72. package/extensions/launch-pack/workflows/show-hn.yaml +13 -0
  73. package/extensions/security-pack/README.md +48 -0
  74. package/extensions/security-pack/agents/god-hipaa-auditor.md +117 -0
  75. package/extensions/security-pack/agents/god-pci-auditor.md +100 -0
  76. package/extensions/security-pack/agents/god-soc2-auditor.md +107 -0
  77. package/extensions/security-pack/manifest.yaml +39 -0
  78. package/extensions/security-pack/package.json +42 -0
  79. package/extensions/security-pack/skills/god-hipaa-audit.md +41 -0
  80. package/extensions/security-pack/skills/god-pci-audit.md +40 -0
  81. package/extensions/security-pack/skills/god-soc2-audit.md +42 -0
  82. package/extensions/security-pack/workflows/hipaa-arc.yaml +15 -0
  83. package/extensions/security-pack/workflows/pci-arc.yaml +15 -0
  84. package/extensions/security-pack/workflows/soc2-arc.yaml +15 -0
  85. package/hooks/pre-tool-use.sh +40 -0
  86. package/hooks/session-start.sh +74 -0
  87. package/lib/README.md +28 -0
  88. package/lib/agent-browser-driver.js +215 -0
  89. package/lib/agent-cache.js +194 -0
  90. package/lib/agent-validator.js +275 -0
  91. package/lib/artifact-diff.js +168 -0
  92. package/lib/artifact-linter.js +142 -0
  93. package/lib/awesome-design.js +312 -0
  94. package/lib/browser-bridge.js +209 -0
  95. package/lib/budget.js +215 -0
  96. package/lib/checkpoint.js +390 -0
  97. package/lib/code-scanner.js +262 -0
  98. package/lib/context-budget.js +170 -0
  99. package/lib/context-writer.js +348 -0
  100. package/lib/cost-tracker.js +325 -0
  101. package/lib/cross-artifact-impact.js +162 -0
  102. package/lib/cross-repo-linkage.js +150 -0
  103. package/lib/design-detector.js +167 -0
  104. package/lib/design-spec.js +348 -0
  105. package/lib/drift-detector.js +212 -0
  106. package/lib/event-reader.js +174 -0
  107. package/lib/events.js +183 -0
  108. package/lib/extensions.js +257 -0
  109. package/lib/have-nots-validator.js +647 -0
  110. package/lib/impact.js +314 -0
  111. package/lib/impeccable-bridge.js +139 -0
  112. package/lib/intent.js +177 -0
  113. package/lib/linkage.js +232 -0
  114. package/lib/meta-linter.js +263 -0
  115. package/lib/multi-repo-detector.js +182 -0
  116. package/lib/otel-exporter.js +308 -0
  117. package/lib/recipes.js +186 -0
  118. package/lib/reverse-sync.js +332 -0
  119. package/lib/review-required.js +224 -0
  120. package/lib/router.js +278 -0
  121. package/lib/runtime-audit.js +455 -0
  122. package/lib/runtime-test.js +309 -0
  123. package/lib/skillui-bridge.js +216 -0
  124. package/lib/state-lock.js +201 -0
  125. package/lib/state.js +142 -0
  126. package/lib/story-validator.js +301 -0
  127. package/lib/suite-state.js +220 -0
  128. package/lib/workflow-parser.js +109 -0
  129. package/lib/workflow-runner.js +221 -0
  130. package/package.json +63 -0
  131. package/references/HAVE-NOTS.md +573 -0
  132. package/references/building/BUILD-ANTIPATTERNS.md +102 -0
  133. package/references/building/BUILD-VERTICAL-SLICES.md +75 -0
  134. package/references/building/BUILD-WAVES.md +61 -0
  135. package/references/building/README.md +17 -0
  136. package/references/design/COLOR.md +122 -0
  137. package/references/design/DESIGN-ANATOMY.md +121 -0
  138. package/references/design/DESIGN-ANTIPATTERNS.md +108 -0
  139. package/references/design/INTERACTION.md +148 -0
  140. package/references/design/MOTION.md +120 -0
  141. package/references/design/RESPONSIVE.md +157 -0
  142. package/references/design/SPATIAL.md +109 -0
  143. package/references/design/TYPOGRAPHY.md +121 -0
  144. package/references/design/UX-WRITING.md +135 -0
  145. package/references/orchestration/MODE-DETECTION.md +74 -0
  146. package/references/orchestration/README.md +18 -0
  147. package/references/orchestration/SCALE-DETECTION.md +81 -0
  148. package/references/planning/ARCH-ANATOMY.md +143 -0
  149. package/references/planning/ARCH-ANTIPATTERNS.md +52 -0
  150. package/references/planning/PRD-ANATOMY.md +117 -0
  151. package/references/planning/PRD-ANTIPATTERNS.md +138 -0
  152. package/references/planning/README.md +16 -0
  153. package/references/planning/ROADMAP-ANATOMY.md +43 -0
  154. package/references/planning/ROADMAP-ANTIPATTERNS.md +94 -0
  155. package/references/planning/STACK-ANATOMY.md +60 -0
  156. package/references/planning/STACK-ANTIPATTERNS.md +95 -0
  157. package/references/shared/GLOSSARY.md +80 -0
  158. package/references/shared/ORCHESTRATORS.md +76 -0
  159. package/references/shared/README.md +14 -0
  160. package/references/shipping/DEPLOY-ANTIPATTERNS.md +64 -0
  161. package/references/shipping/DEPLOY-PATTERNS.md +110 -0
  162. package/references/shipping/HARDEN-ANTIPATTERNS.md +66 -0
  163. package/references/shipping/HARDEN-OWASP-WORKSHEETS.md +89 -0
  164. package/references/shipping/LAUNCH-ANTIPATTERNS.md +68 -0
  165. package/references/shipping/OBSERVE-ANTIPATTERNS.md +62 -0
  166. package/references/shipping/OBSERVE-SLO-EXAMPLES.md +107 -0
  167. package/references/shipping/README.md +18 -0
  168. package/routing/god-add-backlog.yaml +24 -0
  169. package/routing/god-add-tests.yaml +27 -0
  170. package/routing/god-add-todo.yaml +24 -0
  171. package/routing/god-agent-audit.yaml +24 -0
  172. package/routing/god-arch.yaml +46 -0
  173. package/routing/god-archaeology.yaml +28 -0
  174. package/routing/god-audit.yaml +32 -0
  175. package/routing/god-budget.yaml +24 -0
  176. package/routing/god-build-agent.yaml +24 -0
  177. package/routing/god-build.yaml +46 -0
  178. package/routing/god-cache-clear.yaml +24 -0
  179. package/routing/god-check-todos.yaml +24 -0
  180. package/routing/god-context-scan.yaml +24 -0
  181. package/routing/god-context.yaml +44 -0
  182. package/routing/god-cost.yaml +24 -0
  183. package/routing/god-debug.yaml +28 -0
  184. package/routing/god-deploy.yaml +34 -0
  185. package/routing/god-design-impact.yaml +25 -0
  186. package/routing/god-design.yaml +67 -0
  187. package/routing/god-discuss.yaml +27 -0
  188. package/routing/god-docs.yaml +33 -0
  189. package/routing/god-doctor.yaml +27 -0
  190. package/routing/god-explore.yaml +27 -0
  191. package/routing/god-extension-add.yaml +24 -0
  192. package/routing/god-extension-info.yaml +24 -0
  193. package/routing/god-extension-list.yaml +24 -0
  194. package/routing/god-extension-remove.yaml +24 -0
  195. package/routing/god-extract-learnings.yaml +24 -0
  196. package/routing/god-fast.yaml +27 -0
  197. package/routing/god-feature.yaml +34 -0
  198. package/routing/god-graph.yaml +24 -0
  199. package/routing/god-harden.yaml +41 -0
  200. package/routing/god-help.yaml +27 -0
  201. package/routing/god-hotfix.yaml +34 -0
  202. package/routing/god-hygiene.yaml +28 -0
  203. package/routing/god-init.yaml +37 -0
  204. package/routing/god-intel.yaml +24 -0
  205. package/routing/god-launch.yaml +41 -0
  206. package/routing/god-lifecycle.yaml +27 -0
  207. package/routing/god-link.yaml +24 -0
  208. package/routing/god-lint.yaml +24 -0
  209. package/routing/god-list-assumptions.yaml +27 -0
  210. package/routing/god-locate.yaml +24 -0
  211. package/routing/god-logs.yaml +24 -0
  212. package/routing/god-map-codebase.yaml +24 -0
  213. package/routing/god-metrics.yaml +24 -0
  214. package/routing/god-mode.yaml +31 -0
  215. package/routing/god-next.yaml +27 -0
  216. package/routing/god-note.yaml +24 -0
  217. package/routing/god-observe.yaml +34 -0
  218. package/routing/god-org-context.yaml +28 -0
  219. package/routing/god-party.yaml +24 -0
  220. package/routing/god-pause-work.yaml +27 -0
  221. package/routing/god-plant-seed.yaml +24 -0
  222. package/routing/god-postmortem.yaml +34 -0
  223. package/routing/god-pr-branch.yaml +25 -0
  224. package/routing/god-prd.yaml +49 -0
  225. package/routing/god-quick.yaml +28 -0
  226. package/routing/god-reconcile.yaml +48 -0
  227. package/routing/god-reconstruct.yaml +36 -0
  228. package/routing/god-redo.yaml +27 -0
  229. package/routing/god-refactor.yaml +36 -0
  230. package/routing/god-repair.yaml +27 -0
  231. package/routing/god-repo.yaml +35 -0
  232. package/routing/god-restore.yaml +27 -0
  233. package/routing/god-resume-work.yaml +27 -0
  234. package/routing/god-review-changes.yaml +25 -0
  235. package/routing/god-review.yaml +28 -0
  236. package/routing/god-roadmap-check.yaml +39 -0
  237. package/routing/god-roadmap-update.yaml +37 -0
  238. package/routing/god-roadmap.yaml +42 -0
  239. package/routing/god-rollback.yaml +27 -0
  240. package/routing/god-scan.yaml +24 -0
  241. package/routing/god-set-profile.yaml +24 -0
  242. package/routing/god-settings.yaml +24 -0
  243. package/routing/god-skip.yaml +27 -0
  244. package/routing/god-smite.yaml +29 -0
  245. package/routing/god-spike.yaml +35 -0
  246. package/routing/god-sprint.yaml +25 -0
  247. package/routing/god-stack.yaml +41 -0
  248. package/routing/god-standards.yaml +24 -0
  249. package/routing/god-status.yaml +27 -0
  250. package/routing/god-stories.yaml +24 -0
  251. package/routing/god-story-build.yaml +25 -0
  252. package/routing/god-story-close.yaml +25 -0
  253. package/routing/god-story-verify.yaml +25 -0
  254. package/routing/god-story.yaml +24 -0
  255. package/routing/god-suite-init.yaml +24 -0
  256. package/routing/god-suite-patch.yaml +25 -0
  257. package/routing/god-suite-release.yaml +25 -0
  258. package/routing/god-suite-status.yaml +25 -0
  259. package/routing/god-suite-sync.yaml +25 -0
  260. package/routing/god-sync.yaml +33 -0
  261. package/routing/god-tech-debt.yaml +32 -0
  262. package/routing/god-test-extension.yaml +24 -0
  263. package/routing/god-test-runtime.yaml +25 -0
  264. package/routing/god-thread.yaml +24 -0
  265. package/routing/god-trace.yaml +24 -0
  266. package/routing/god-undo.yaml +27 -0
  267. package/routing/god-update-deps.yaml +39 -0
  268. package/routing/god-upgrade.yaml +33 -0
  269. package/routing/god-version.yaml +24 -0
  270. package/routing/god-workstream.yaml +24 -0
  271. package/routing/god.yaml +24 -0
  272. package/routing/recipes/add-feature-defer-current-milestone.yaml +21 -0
  273. package/routing/recipes/add-feature-future-conditional.yaml +21 -0
  274. package/routing/recipes/add-feature-mid-arc-pause.yaml +33 -0
  275. package/routing/recipes/add-feature-next-milestone.yaml +23 -0
  276. package/routing/recipes/add-feature-parallel.yaml +29 -0
  277. package/routing/recipes/add-feature-prd-update.yaml +21 -0
  278. package/routing/recipes/add-feature-small.yaml +24 -0
  279. package/routing/recipes/add-feature-tiny.yaml +24 -0
  280. package/routing/recipes/bluefield-org-aware.yaml +27 -0
  281. package/routing/recipes/broken-install.yaml +22 -0
  282. package/routing/recipes/brownfield-onboarding.yaml +32 -0
  283. package/routing/recipes/bug-no-urgency.yaml +21 -0
  284. package/routing/recipes/capture-idea.yaml +22 -0
  285. package/routing/recipes/capture-todo.yaml +21 -0
  286. package/routing/recipes/clean-pr.yaml +21 -0
  287. package/routing/recipes/code-cleanup.yaml +23 -0
  288. package/routing/recipes/docs-drift.yaml +21 -0
  289. package/routing/recipes/existing-codebase-onboarding.yaml +32 -0
  290. package/routing/recipes/extract-learnings.yaml +22 -0
  291. package/routing/recipes/greenfield-fast.yaml +25 -0
  292. package/routing/recipes/greenfield-manual.yaml +32 -0
  293. package/routing/recipes/greenfield-with-ideation.yaml +29 -0
  294. package/routing/recipes/incident-postmortem.yaml +24 -0
  295. package/routing/recipes/major-framework-upgrade.yaml +23 -0
  296. package/routing/recipes/monthly-deps.yaml +22 -0
  297. package/routing/recipes/multi-repo-suite.yaml +56 -0
  298. package/routing/recipes/parallel-engineers.yaml +26 -0
  299. package/routing/recipes/pause-handoff.yaml +21 -0
  300. package/routing/recipes/production-broken.yaml +26 -0
  301. package/routing/recipes/rerun-tier.yaml +21 -0
  302. package/routing/recipes/returning-after-break.yaml +31 -0
  303. package/routing/recipes/state-drift.yaml +21 -0
  304. package/routing/recipes/undo-last.yaml +21 -0
  305. package/routing/recipes/weekly-health-check.yaml +24 -0
  306. package/routing/recipes/whats-next.yaml +22 -0
  307. package/routing/recipes/where-am-i.yaml +21 -0
  308. package/schema/events.v1.json +63 -0
  309. package/schema/extension-manifest.v1.json +84 -0
  310. package/schema/intent.v1.yaml.json +116 -0
  311. package/schema/recipe.v1.json +120 -0
  312. package/schema/routing.v1.json +163 -0
  313. package/schema/state.v1.json +146 -0
  314. package/schema/workflow.v1.json +96 -0
  315. package/skills/god-add-backlog.md +40 -0
  316. package/skills/god-add-tests.md +53 -0
  317. package/skills/god-add-todo.md +32 -0
  318. package/skills/god-agent-audit.md +87 -0
  319. package/skills/god-arch.md +81 -0
  320. package/skills/god-archaeology.md +48 -0
  321. package/skills/god-audit.md +65 -0
  322. package/skills/god-budget.md +103 -0
  323. package/skills/god-build-agent.md +91 -0
  324. package/skills/god-build.md +90 -0
  325. package/skills/god-cache-clear.md +75 -0
  326. package/skills/god-check-todos.md +42 -0
  327. package/skills/god-context-scan.md +125 -0
  328. package/skills/god-context.md +147 -0
  329. package/skills/god-cost.md +118 -0
  330. package/skills/god-debug.md +30 -0
  331. package/skills/god-deploy.md +76 -0
  332. package/skills/god-design-impact.md +86 -0
  333. package/skills/god-design.md +275 -0
  334. package/skills/god-discuss.md +46 -0
  335. package/skills/god-docs.md +81 -0
  336. package/skills/god-doctor.md +94 -0
  337. package/skills/god-explore.md +50 -0
  338. package/skills/god-export-otel.md +87 -0
  339. package/skills/god-extension-add.md +79 -0
  340. package/skills/god-extension-info.md +75 -0
  341. package/skills/god-extension-list.md +55 -0
  342. package/skills/god-extension-remove.md +66 -0
  343. package/skills/god-extract-learnings.md +60 -0
  344. package/skills/god-fast.md +47 -0
  345. package/skills/god-feature.md +114 -0
  346. package/skills/god-graph.md +56 -0
  347. package/skills/god-harden.md +106 -0
  348. package/skills/god-help.md +66 -0
  349. package/skills/god-hotfix.md +139 -0
  350. package/skills/god-hygiene.md +104 -0
  351. package/skills/god-init.md +161 -0
  352. package/skills/god-intel.md +36 -0
  353. package/skills/god-launch.md +86 -0
  354. package/skills/god-lifecycle.md +119 -0
  355. package/skills/god-link.md +90 -0
  356. package/skills/god-lint.md +128 -0
  357. package/skills/god-list-assumptions.md +56 -0
  358. package/skills/god-locate.md +97 -0
  359. package/skills/god-logs.md +57 -0
  360. package/skills/god-map-codebase.md +45 -0
  361. package/skills/god-metrics.md +51 -0
  362. package/skills/god-mode.md +159 -0
  363. package/skills/god-next.md +257 -0
  364. package/skills/god-note.md +39 -0
  365. package/skills/god-observe.md +76 -0
  366. package/skills/god-org-context.md +81 -0
  367. package/skills/god-party.md +87 -0
  368. package/skills/god-pause-work.md +64 -0
  369. package/skills/god-plant-seed.md +59 -0
  370. package/skills/god-postmortem.md +103 -0
  371. package/skills/god-pr-branch.md +50 -0
  372. package/skills/god-prd.md +90 -0
  373. package/skills/god-quick.md +50 -0
  374. package/skills/god-reconcile.md +90 -0
  375. package/skills/god-reconstruct.md +72 -0
  376. package/skills/god-redo.md +73 -0
  377. package/skills/god-refactor.md +137 -0
  378. package/skills/god-repair.md +82 -0
  379. package/skills/god-repo.md +49 -0
  380. package/skills/god-restore.md +91 -0
  381. package/skills/god-resume-work.md +42 -0
  382. package/skills/god-review-changes.md +93 -0
  383. package/skills/god-review.md +52 -0
  384. package/skills/god-roadmap-check.md +66 -0
  385. package/skills/god-roadmap-update.md +64 -0
  386. package/skills/god-roadmap.md +77 -0
  387. package/skills/god-rollback.md +88 -0
  388. package/skills/god-scan.md +106 -0
  389. package/skills/god-set-profile.md +58 -0
  390. package/skills/god-settings.md +44 -0
  391. package/skills/god-skip.md +78 -0
  392. package/skills/god-smite.md +86 -0
  393. package/skills/god-spike.md +120 -0
  394. package/skills/god-sprint.md +77 -0
  395. package/skills/god-stack.md +74 -0
  396. package/skills/god-standards.md +62 -0
  397. package/skills/god-status.md +99 -0
  398. package/skills/god-stories.md +60 -0
  399. package/skills/god-story-build.md +76 -0
  400. package/skills/god-story-close.md +82 -0
  401. package/skills/god-story-verify.md +71 -0
  402. package/skills/god-story.md +55 -0
  403. package/skills/god-suite-init.md +75 -0
  404. package/skills/god-suite-patch.md +64 -0
  405. package/skills/god-suite-release.md +58 -0
  406. package/skills/god-suite-status.md +63 -0
  407. package/skills/god-suite-sync.md +49 -0
  408. package/skills/god-sync.md +102 -0
  409. package/skills/god-tech-debt.md +56 -0
  410. package/skills/god-test-extension.md +87 -0
  411. package/skills/god-test-runtime.md +144 -0
  412. package/skills/god-thread.md +39 -0
  413. package/skills/god-trace.md +50 -0
  414. package/skills/god-undo.md +68 -0
  415. package/skills/god-update-deps.md +134 -0
  416. package/skills/god-upgrade.md +139 -0
  417. package/skills/god-version.md +37 -0
  418. package/skills/god-workstream.md +61 -0
  419. package/skills/god.md +207 -0
  420. package/templates/ARCH.md +99 -0
  421. package/templates/DEPS-AUDIT.md +66 -0
  422. package/templates/DESIGN.md +71 -0
  423. package/templates/DOCS-UPDATE-LOG.md +64 -0
  424. package/templates/HARDEN-FINDINGS.md +69 -0
  425. package/templates/MIGRATION.md +86 -0
  426. package/templates/POSTMORTEM.md +88 -0
  427. package/templates/PRD.md +80 -0
  428. package/templates/PROGRESS.md +49 -0
  429. package/templates/ROADMAP.md +47 -0
  430. package/templates/SPIKE.md +72 -0
  431. package/templates/STACK-DECISION.md +61 -0
  432. package/workflows/audit-only.yaml +22 -0
  433. package/workflows/bluefield-arc.yaml +87 -0
  434. package/workflows/brownfield-arc.yaml +44 -0
  435. package/workflows/deps-audit.yaml +56 -0
  436. package/workflows/docs-arc.yaml +22 -0
  437. package/workflows/feature-arc.yaml +59 -0
  438. package/workflows/full-arc.yaml +84 -0
  439. package/workflows/hotfix-arc.yaml +59 -0
  440. package/workflows/hygiene.yaml +43 -0
  441. package/workflows/migration-arc.yaml +73 -0
  442. package/workflows/postmortem.yaml +31 -0
  443. package/workflows/refactor-arc.yaml +59 -0
  444. package/workflows/spike.yaml +23 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Context Budget - per-agent input budgeting to avoid kitchen-sink
3
+ * context that inflates token spend.
4
+ *
5
+ * The contract:
6
+ * - Each agent declares `required-context` (must load) and
7
+ * `optional-context` (load if budget allows) in its frontmatter.
8
+ * - Project intent.yaml declares `budgets.default-max-tokens` and
9
+ * optional per-agent overrides under `budgets.agents.<name>`.
10
+ * - Orchestrator computes the loadout: all required files, then as
11
+ * many optional files as fit under the budget.
12
+ * - If required-context exceeds budget, emit `budget.exceeded` event
13
+ * and proceed (load required anyway; users see the warning).
14
+ *
15
+ * Token estimation: bytes / 4 is a rough heuristic that matches
16
+ * empirical token-counts for typical English text well enough for
17
+ * budgeting. Not for billing.
18
+ *
19
+ * Public API:
20
+ * estimateTokens(text | bytes) -> number
21
+ * parseAgentBudget(agentPath) -> { required, optional, maxTokens? }
22
+ * plan(budget, required, optional, perAgentMax) -> { loadout, dropped, used }
23
+ * loadoutSize(files) -> { bytes, tokens }
24
+ */
25
+
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ const BYTES_PER_TOKEN = 4; // rough English text heuristic
30
+ const DEFAULT_MAX_TOKENS = 80_000; // per-agent default; ~half of a 200K window
31
+
32
+ function estimateTokens(input) {
33
+ if (typeof input === 'number') return Math.ceil(input / BYTES_PER_TOKEN);
34
+ if (typeof input === 'string') {
35
+ return Math.ceil(Buffer.byteLength(input, 'utf8') / BYTES_PER_TOKEN);
36
+ }
37
+ return 0;
38
+ }
39
+
40
+ /**
41
+ * Extract budget hints from an agent's frontmatter.
42
+ *
43
+ * Looks for lines like:
44
+ * required-context: [path1, path2]
45
+ * optional-context: [path3, path4]
46
+ * max-tokens: 50000
47
+ *
48
+ * Returns defaults when missing.
49
+ */
50
+ function parseAgentBudget(agentPath) {
51
+ if (!fs.existsSync(agentPath)) {
52
+ return { required: [], optional: [], maxTokens: null };
53
+ }
54
+ const raw = fs.readFileSync(agentPath, 'utf8');
55
+ let fmText = '';
56
+ if (raw.startsWith('---')) {
57
+ const end = raw.indexOf('\n---', 3);
58
+ if (end > 0) fmText = raw.slice(3, end);
59
+ }
60
+
61
+ const out = { required: [], optional: [], maxTokens: null };
62
+ // very loose YAML-ish parse, just for our subset
63
+ const lines = fmText.split('\n');
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i].trim();
66
+ if (line.startsWith('required-context:')) {
67
+ out.required = parseListInline(line.slice('required-context:'.length), lines, i);
68
+ } else if (line.startsWith('optional-context:')) {
69
+ out.optional = parseListInline(line.slice('optional-context:'.length), lines, i);
70
+ } else if (line.startsWith('max-tokens:')) {
71
+ const n = parseInt(line.slice('max-tokens:'.length).trim(), 10);
72
+ if (Number.isFinite(n)) out.maxTokens = n;
73
+ }
74
+ }
75
+ return out;
76
+ }
77
+
78
+ function parseListInline(rest, lines, idx) {
79
+ const r = rest.trim();
80
+ if (r.startsWith('[') && r.endsWith(']')) {
81
+ return r.slice(1, -1).split(',').map(s => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
82
+ }
83
+ // Block list: subsequent lines starting with '- '
84
+ const items = [];
85
+ for (let j = idx + 1; j < lines.length; j++) {
86
+ const l = lines[j];
87
+ if (!l.startsWith(' - ')) break;
88
+ items.push(l.slice(4).trim().replace(/^["']|["']$/g, ''));
89
+ }
90
+ return items;
91
+ }
92
+
93
+ /**
94
+ * Compute total bytes + estimated tokens for a list of file paths.
95
+ * Missing files contribute 0; not an error.
96
+ */
97
+ function loadoutSize(files) {
98
+ let bytes = 0;
99
+ for (const f of files || []) {
100
+ if (!fs.existsSync(f)) continue;
101
+ bytes += fs.statSync(f).size;
102
+ }
103
+ return { bytes, tokens: estimateTokens(bytes) };
104
+ }
105
+
106
+ /**
107
+ * Plan a context loadout.
108
+ *
109
+ * budget: { defaultMaxTokens, perAgent: { agentName: max } }
110
+ * required, optional: arrays of file paths
111
+ * agentName: used to look up per-agent override
112
+ *
113
+ * Returns:
114
+ * {
115
+ * loadout: [paths in load order],
116
+ * dropped: [paths skipped for budget],
117
+ * used: { bytes, tokens },
118
+ * budget: { tokens },
119
+ * exceeded: bool
120
+ * }
121
+ */
122
+ function plan(budget, required, optional, agentName) {
123
+ const cap = (budget && budget.perAgent && budget.perAgent[agentName]) ||
124
+ (budget && budget.defaultMaxTokens) ||
125
+ DEFAULT_MAX_TOKENS;
126
+
127
+ const loadout = [];
128
+ let usedBytes = 0;
129
+
130
+ // Required first; always loaded regardless of budget.
131
+ let exceeded = false;
132
+ for (const f of required || []) {
133
+ if (!fs.existsSync(f)) continue;
134
+ loadout.push(f);
135
+ usedBytes += fs.statSync(f).size;
136
+ }
137
+ const requiredTokens = estimateTokens(usedBytes);
138
+ if (requiredTokens > cap) exceeded = true;
139
+
140
+ // Then optional, fit under cap.
141
+ const dropped = [];
142
+ for (const f of optional || []) {
143
+ if (!fs.existsSync(f)) continue;
144
+ const size = fs.statSync(f).size;
145
+ const projected = estimateTokens(usedBytes + size);
146
+ if (projected > cap) {
147
+ dropped.push(f);
148
+ continue;
149
+ }
150
+ loadout.push(f);
151
+ usedBytes += size;
152
+ }
153
+
154
+ return {
155
+ loadout,
156
+ dropped,
157
+ used: { bytes: usedBytes, tokens: estimateTokens(usedBytes) },
158
+ budget: { tokens: cap },
159
+ exceeded
160
+ };
161
+ }
162
+
163
+ module.exports = {
164
+ estimateTokens,
165
+ parseAgentBudget,
166
+ plan,
167
+ loadoutSize,
168
+ BYTES_PER_TOKEN,
169
+ DEFAULT_MAX_TOKENS
170
+ };
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Context Writer
3
+ *
4
+ * Manages the fenced "Godpowers" section in project-level AI instruction
5
+ * files (AGENTS.md, CLAUDE.md, GEMINI.md, .cursor/rules/, .windsurfrules,
6
+ * .github/copilot-instructions.md, .clinerules).
7
+ *
8
+ * Rules:
9
+ * - AGENTS.md is canonical; the others are 1-line pointers when their
10
+ * tool's config dir is detected.
11
+ * - Never blind-overwrite. Use a fenced section the user can recognize
12
+ * and remove.
13
+ * - Idempotent. Running twice produces the same file.
14
+ * - Detect-then-write. Don't litter projects with files for tools the
15
+ * user isn't using.
16
+ *
17
+ * Fence format:
18
+ *
19
+ * <!-- godpowers:begin -->
20
+ * ... managed content ...
21
+ * <!-- godpowers:end -->
22
+ */
23
+
24
+ const fs = require('fs');
25
+ const path = require('path');
26
+
27
+ const FENCE_BEGIN = '<!-- godpowers:begin -->';
28
+ const FENCE_END = '<!-- godpowers:end -->';
29
+
30
+ /**
31
+ * Detect which AI tools are configured in the project.
32
+ * Returns an array of platform descriptors.
33
+ */
34
+ function detectInstalledTools(projectRoot) {
35
+ const detected = [];
36
+
37
+ const checks = [
38
+ { tool: 'claude-code', signal: '.claude', target: 'CLAUDE.md', kind: 'pointer' },
39
+ { tool: 'gemini', signal: '.gemini', target: 'GEMINI.md', kind: 'pointer' },
40
+ { tool: 'gemini', signal: 'GEMINI.md', target: 'GEMINI.md', kind: 'pointer' },
41
+ { tool: 'cursor', signal: '.cursor', target: '.cursor/rules/godpowers.mdc', kind: 'pointer' },
42
+ { tool: 'cursor', signal: '.cursorrules', target: '.cursorrules', kind: 'pointer' },
43
+ { tool: 'windsurf', signal: '.windsurf', target: '.windsurf/rules/godpowers.md', kind: 'pointer' },
44
+ { tool: 'windsurf', signal: '.windsurfrules', target: '.windsurfrules', kind: 'pointer' },
45
+ { tool: 'copilot', signal: '.github/copilot-instructions.md', target: '.github/copilot-instructions.md', kind: 'pointer' },
46
+ { tool: 'cline', signal: '.clinerules', target: '.clinerules', kind: 'pointer' },
47
+ { tool: 'roo', signal: '.roo', target: '.roo/rules/godpowers.md', kind: 'pointer' },
48
+ { tool: 'continue', signal: '.continue', target: '.continue/rules/godpowers.md', kind: 'pointer' },
49
+ // Pi (earendil-works/pi-coding-agent): reads AGENTS.md and CLAUDE.md
50
+ // as context files (already written via canonical AGENTS.md target),
51
+ // but also has its own project-local skills convention at .pi/skills/
52
+ { tool: 'pi', signal: '.pi', target: '.pi/skills/godpowers.md', kind: 'pointer' },
53
+ // .agents/skills/ is the cross-tool Agent Skills standard path used
54
+ // by Pi, Codex, and others; we write a pointer here when detected
55
+ { tool: 'agent-skills', signal: '.agents', target: '.agents/skills/godpowers.md', kind: 'pointer' }
56
+ ];
57
+
58
+ const seen = new Set();
59
+ for (const c of checks) {
60
+ if (seen.has(c.tool)) continue;
61
+ if (fs.existsSync(path.join(projectRoot, c.signal))) {
62
+ detected.push({ tool: c.tool, target: c.target, kind: c.kind });
63
+ seen.add(c.tool);
64
+ }
65
+ }
66
+ return detected;
67
+ }
68
+
69
+ /**
70
+ * Build the canonical Godpowers section content from project state.
71
+ * Keeps it short (the file is loaded into every AI prompt for some tools).
72
+ */
73
+ function buildCanonicalContent(state, opts = {}) {
74
+ const lines = [];
75
+ lines.push('## Godpowers project');
76
+ lines.push('');
77
+ lines.push('This project uses Godpowers. The on-disk state is the source of truth;');
78
+ lines.push('conversation memory is not.');
79
+ lines.push('');
80
+
81
+ const projectName = (state && state.project && state.project.name) || opts.projectName || '(unnamed)';
82
+ const mode = (state && state.project && state.project.mode) || opts.mode || 'unknown';
83
+ const scale = (state && state.project && state.project.scale) || opts.scale || 'unknown';
84
+ lines.push(`- Project: ${projectName}`);
85
+ lines.push(`- Mode: ${mode} Scale: ${scale}`);
86
+ lines.push('- State: `.godpowers/state.json` (machine) and `.godpowers/PROGRESS.md` (human)');
87
+ lines.push('');
88
+
89
+ lines.push('### Quarterback rule');
90
+ lines.push('');
91
+ lines.push('There is exactly one orchestrator: `god-orchestrator`. It owns all writes to');
92
+ lines.push('`state.json`, `PROGRESS.md`, `intent.yaml`, and `events.jsonl`. Skills like');
93
+ lines.push('`/god`, `/god-next`, `/god-status` read state without writing.');
94
+ lines.push('');
95
+
96
+ lines.push('### Useful commands');
97
+ lines.push('');
98
+ lines.push('- `/god-status` - re-derive state from disk');
99
+ lines.push('- `/god-next` - what to run next, with reason');
100
+ lines.push('- `/god <free text>` - match intent to a recipe');
101
+ lines.push('- `/god-mode` - run the full autonomous arc');
102
+ lines.push('- `/god-lint` - validate artifacts against have-nots');
103
+ lines.push('- `/god-scan` - rebuild linkage map from code');
104
+ lines.push('- `/god-review-changes` - walk REVIEW-REQUIRED.md');
105
+ lines.push('');
106
+
107
+ // Pointers to design and product files when present
108
+ const designExists = require('fs').existsSync(require('path').join(opts.projectRoot || process.cwd(), 'DESIGN.md'));
109
+ const productExists = require('fs').existsSync(require('path').join(opts.projectRoot || process.cwd(), 'PRODUCT.md'));
110
+ if (designExists || productExists) {
111
+ lines.push('### Design files');
112
+ lines.push('');
113
+ if (productExists) lines.push('- `PRODUCT.md` - strategic register, brand personality, anti-references');
114
+ if (designExists) lines.push('- `DESIGN.md` - visual tokens (Google Labs design.md format) + rationale');
115
+ lines.push('');
116
+ }
117
+
118
+ // Linkage status if known
119
+ if (state && state.linkage) {
120
+ const cov = (state.linkage['coverage-pct'] || 0) * 100;
121
+ if (cov > 0 || state.linkage['orphan-count'] > 0 || state.linkage['drift-count'] > 0) {
122
+ lines.push('### Linkage status');
123
+ lines.push('');
124
+ lines.push(`- Coverage: ${cov.toFixed(0)}%`);
125
+ if (state.linkage['orphan-count']) lines.push(`- Orphans: ${state.linkage['orphan-count']}`);
126
+ if (state.linkage['drift-count']) lines.push(`- Drift: ${state.linkage['drift-count']}`);
127
+ if (state.linkage['review-required-items']) lines.push(`- Pending reviews: ${state.linkage['review-required-items']}`);
128
+ lines.push('');
129
+ }
130
+ }
131
+
132
+ // Optional active artifacts list (filled in as tiers complete)
133
+ if (state && state.tiers) {
134
+ const active = [];
135
+ for (const tierKey of Object.keys(state.tiers)) {
136
+ const tier = state.tiers[tierKey];
137
+ for (const subKey of Object.keys(tier)) {
138
+ const sub = tier[subKey];
139
+ if (sub && sub.status === 'done' && sub.artifact) {
140
+ active.push(`${subKey}: \`${sub.artifact}\``);
141
+ }
142
+ }
143
+ }
144
+ if (active.length > 0) {
145
+ lines.push('### Active artifacts');
146
+ lines.push('');
147
+ for (const a of active) lines.push(`- ${a}`);
148
+ lines.push('');
149
+ }
150
+ }
151
+
152
+ lines.push('See `.godpowers/PROGRESS.md` for the live tier table.');
153
+ return lines.join('\n');
154
+ }
155
+
156
+ /**
157
+ * Build the pointer content for non-canonical files (CLAUDE.md, GEMINI.md, etc.).
158
+ * One line that defers to AGENTS.md.
159
+ */
160
+ function buildPointerContent(canonicalRelPath = 'AGENTS.md') {
161
+ return `## Godpowers project\n\nThis project uses Godpowers. See \`${canonicalRelPath}\` for the project context.`;
162
+ }
163
+
164
+ /**
165
+ * Read a file, find the fenced section if present, return:
166
+ * { exists, before, fenced, after }
167
+ *
168
+ * If no file exists, returns { exists: false, before: '', fenced: '', after: '' }.
169
+ * If file exists but has no fence, returns the whole file in `before`.
170
+ */
171
+ function readFenced(filePath) {
172
+ if (!fs.existsSync(filePath)) {
173
+ return { exists: false, before: '', fenced: '', after: '' };
174
+ }
175
+ const content = fs.readFileSync(filePath, 'utf8');
176
+ const beginIdx = content.indexOf(FENCE_BEGIN);
177
+ const endIdx = content.indexOf(FENCE_END);
178
+ if (beginIdx === -1 || endIdx === -1 || endIdx < beginIdx) {
179
+ return { exists: true, before: content, fenced: '', after: '' };
180
+ }
181
+ return {
182
+ exists: true,
183
+ before: content.slice(0, beginIdx),
184
+ fenced: content.slice(beginIdx + FENCE_BEGIN.length, endIdx),
185
+ after: content.slice(endIdx + FENCE_END.length)
186
+ };
187
+ }
188
+
189
+ /**
190
+ * Write a fenced section to a file. Idempotent. Preserves user content
191
+ * outside the fence.
192
+ *
193
+ * Args:
194
+ * filePath - absolute path to target file
195
+ * sectionContent - markdown body to put inside the fence (no fence markers)
196
+ */
197
+ function writeFenced(filePath, sectionContent) {
198
+ const dir = path.dirname(filePath);
199
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
200
+
201
+ const parsed = readFenced(filePath);
202
+ const fencedBlock = `${FENCE_BEGIN}\n${sectionContent}\n${FENCE_END}`;
203
+
204
+ let next;
205
+ if (!parsed.exists) {
206
+ next = `${fencedBlock}\n`;
207
+ } else if (parsed.fenced === '') {
208
+ // No fence yet. Append to end with a blank line separator.
209
+ const sep = parsed.before.endsWith('\n') ? '\n' : '\n\n';
210
+ next = `${parsed.before}${sep}${fencedBlock}\n`;
211
+ } else {
212
+ // Replace existing fence.
213
+ next = `${parsed.before}${fencedBlock}${parsed.after}`;
214
+ }
215
+ fs.writeFileSync(filePath, next);
216
+ return { written: filePath, hadFenceBefore: parsed.fenced !== '' };
217
+ }
218
+
219
+ /**
220
+ * Remove the Godpowers fence from a file. Leaves the rest untouched. If the
221
+ * file becomes empty (whitespace only), removes it.
222
+ */
223
+ function removeFenced(filePath) {
224
+ if (!fs.existsSync(filePath)) return { removed: false, reason: 'missing' };
225
+ const parsed = readFenced(filePath);
226
+ if (parsed.fenced === '') return { removed: false, reason: 'no-fence' };
227
+ let remaining = `${parsed.before}${parsed.after}`.replace(/\n{3,}/g, '\n\n').trim();
228
+ if (remaining === '') {
229
+ fs.unlinkSync(filePath);
230
+ return { removed: true, fileDeleted: true };
231
+ }
232
+ fs.writeFileSync(filePath, remaining + '\n');
233
+ return { removed: true, fileDeleted: false };
234
+ }
235
+
236
+ /**
237
+ * Detect existing fence in a file.
238
+ */
239
+ function hasFence(filePath) {
240
+ return readFenced(filePath).fenced !== '';
241
+ }
242
+
243
+ /**
244
+ * Plan what would be written for a given project.
245
+ * Returns:
246
+ * { canonical: { path, content }, pointers: [{ tool, path, content }] }
247
+ *
248
+ * Always plans AGENTS.md as canonical. Pointers are only planned for tools
249
+ * detected via `detectInstalledTools`.
250
+ */
251
+ function plan(projectRoot, state, opts = {}) {
252
+ const canonicalPath = path.join(projectRoot, 'AGENTS.md');
253
+ const canonical = {
254
+ path: canonicalPath,
255
+ content: buildCanonicalContent(state, opts)
256
+ };
257
+
258
+ const pointers = [];
259
+ const detected = detectInstalledTools(projectRoot);
260
+ for (const d of detected) {
261
+ pointers.push({
262
+ tool: d.tool,
263
+ path: path.join(projectRoot, d.target),
264
+ content: buildPointerContent('AGENTS.md')
265
+ });
266
+ }
267
+ return { canonical, pointers };
268
+ }
269
+
270
+ /**
271
+ * Apply a plan: write AGENTS.md and any detected-tool pointers.
272
+ * Returns a list of write results.
273
+ */
274
+ function apply(projectRoot, state, opts = {}) {
275
+ const p = plan(projectRoot, state, opts);
276
+ const results = [];
277
+ results.push(writeFenced(p.canonical.path, p.canonical.content));
278
+ for (const ptr of p.pointers) {
279
+ results.push({ ...writeFenced(ptr.path, ptr.content), tool: ptr.tool });
280
+ }
281
+ return results;
282
+ }
283
+
284
+ /**
285
+ * Remove all Godpowers fences from canonical + pointers (off-switch).
286
+ */
287
+ function clearAll(projectRoot) {
288
+ const targets = [
289
+ path.join(projectRoot, 'AGENTS.md'),
290
+ path.join(projectRoot, 'CLAUDE.md'),
291
+ path.join(projectRoot, 'GEMINI.md'),
292
+ path.join(projectRoot, '.cursorrules'),
293
+ path.join(projectRoot, '.cursor', 'rules', 'godpowers.mdc'),
294
+ path.join(projectRoot, '.windsurfrules'),
295
+ path.join(projectRoot, '.windsurf', 'rules', 'godpowers.md'),
296
+ path.join(projectRoot, '.github', 'copilot-instructions.md'),
297
+ path.join(projectRoot, '.clinerules'),
298
+ path.join(projectRoot, '.roo', 'rules', 'godpowers.md'),
299
+ path.join(projectRoot, '.continue', 'rules', 'godpowers.md'),
300
+ path.join(projectRoot, '.pi', 'skills', 'godpowers.md'),
301
+ path.join(projectRoot, '.agents', 'skills', 'godpowers.md')
302
+ ];
303
+ const results = [];
304
+ for (const t of targets) {
305
+ const r = removeFenced(t);
306
+ if (r.removed) results.push({ path: t, ...r });
307
+ }
308
+ return results;
309
+ }
310
+
311
+ /**
312
+ * Status report: which targets have fences, which don't, what tools detected.
313
+ */
314
+ function status(projectRoot) {
315
+ const canonicalPath = path.join(projectRoot, 'AGENTS.md');
316
+ const canonical = {
317
+ path: canonicalPath,
318
+ exists: fs.existsSync(canonicalPath),
319
+ hasFence: fs.existsSync(canonicalPath) ? hasFence(canonicalPath) : false
320
+ };
321
+ const detected = detectInstalledTools(projectRoot);
322
+ const pointers = detected.map(d => {
323
+ const p = path.join(projectRoot, d.target);
324
+ return {
325
+ tool: d.tool,
326
+ path: p,
327
+ exists: fs.existsSync(p),
328
+ hasFence: fs.existsSync(p) ? hasFence(p) : false
329
+ };
330
+ });
331
+ return { canonical, pointers, detected };
332
+ }
333
+
334
+ module.exports = {
335
+ FENCE_BEGIN,
336
+ FENCE_END,
337
+ detectInstalledTools,
338
+ buildCanonicalContent,
339
+ buildPointerContent,
340
+ readFenced,
341
+ writeFenced,
342
+ removeFenced,
343
+ hasFence,
344
+ plan,
345
+ apply,
346
+ clearAll,
347
+ status
348
+ };