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,308 @@
1
+ /**
2
+ * OTel Exporter
3
+ *
4
+ * Convert godpowers events.jsonl runs to OTLP/JSON ResourceSpans and
5
+ * (optionally) POST them to an OTLP HTTP collector. Lets users pipe
6
+ * godpowers telemetry into Honeycomb, Datadog, Jaeger, Tempo, or any
7
+ * OTLP-compatible backend.
8
+ *
9
+ * Public API:
10
+ * convertRun(events, opts) -> ResourceSpans[]
11
+ * exportRun(projectRoot, runId, opts) -> { spans, json, posted?, status? }
12
+ * resolveEndpoint(endpoint) -> string (appends /v1/traces if needed)
13
+ *
14
+ * Event -> span mapping:
15
+ * - workflow.run + workflow.complete become the root span.
16
+ * - agent.start + agent.end pairs (matched by span_id) become child spans.
17
+ * - Other named events (cost.recorded, gate.fail, error, decision.route, ...)
18
+ * attach as span events on the span sharing their span_id.
19
+ * - An event with a span_id that has no start/end becomes a
20
+ * zero-duration span so the data is never lost.
21
+ *
22
+ * Timestamps: events.jsonl ISO strings -> nanoseconds-since-epoch
23
+ * strings (per OTLP/JSON spec - JS numbers cannot hold full 64-bit
24
+ * nanos so they ship as strings).
25
+ *
26
+ * No external deps. HTTP POST uses Node's built-in http / https.
27
+ */
28
+
29
+ const fs = require('fs');
30
+ const path = require('path');
31
+ const http = require('http');
32
+ const https = require('https');
33
+ const { URL } = require('url');
34
+
35
+ const events = require('./events');
36
+
37
+ const SCOPE_NAME = 'godpowers';
38
+
39
+ function packageVersion() {
40
+ try {
41
+ const pkg = JSON.parse(fs.readFileSync(
42
+ path.join(__dirname, '..', 'package.json'), 'utf8'));
43
+ return pkg.version || '0.0.0';
44
+ } catch {
45
+ return '0.0.0';
46
+ }
47
+ }
48
+
49
+ function isoToNanos(iso) {
50
+ const ms = new Date(iso).getTime();
51
+ if (!Number.isFinite(ms)) return '0';
52
+ // Nanoseconds = milliseconds * 1_000_000. Use string concat to
53
+ // sidestep JS number precision; OTLP/JSON expects a numeric string.
54
+ return String(ms) + '000000';
55
+ }
56
+
57
+ /**
58
+ * Encode a JS value as an OTLP AnyValue.
59
+ */
60
+ function anyValue(v) {
61
+ if (v == null) return { stringValue: '' };
62
+ if (typeof v === 'string') return { stringValue: v };
63
+ if (typeof v === 'boolean') return { boolValue: v };
64
+ if (typeof v === 'number') {
65
+ return Number.isInteger(v)
66
+ ? { intValue: String(v) }
67
+ : { doubleValue: v };
68
+ }
69
+ return { stringValue: JSON.stringify(v) };
70
+ }
71
+
72
+ function attrEntries(obj) {
73
+ if (!obj || typeof obj !== 'object') return [];
74
+ return Object.entries(obj).map(([key, value]) => ({
75
+ key,
76
+ value: anyValue(value)
77
+ }));
78
+ }
79
+
80
+ /**
81
+ * Convert a run's events into an OTLP ResourceSpans array.
82
+ *
83
+ * opts.serviceName overrides the default 'godpowers' resource name.
84
+ * opts.runId is included in service.instance.id when supplied.
85
+ */
86
+ function convertRun(eventList, opts = {}) {
87
+ if (!Array.isArray(eventList) || eventList.length === 0) {
88
+ return [];
89
+ }
90
+
91
+ const traceId = eventList[0].trace_id;
92
+ const runId = opts.runId || '';
93
+ const serviceName = opts.serviceName || 'godpowers';
94
+
95
+ // Pass 1: group by span_id. Each bucket gathers its start/end/extras.
96
+ const bySpan = new Map();
97
+ let rootSpanId = null;
98
+ let workflowName = 'workflow';
99
+
100
+ for (const ev of eventList) {
101
+ if (!ev.span_id) continue;
102
+ if (!bySpan.has(ev.span_id)) {
103
+ bySpan.set(ev.span_id, {
104
+ spanId: ev.span_id,
105
+ parent: ev.parent || null,
106
+ startEvent: null,
107
+ endEvent: null,
108
+ extras: [],
109
+ name: null,
110
+ kind: 'internal',
111
+ attrs: {}
112
+ });
113
+ }
114
+ const bucket = bySpan.get(ev.span_id);
115
+ if (ev.name === 'workflow.run') {
116
+ bucket.startEvent = ev;
117
+ bucket.name = `workflow.${(ev.attrs && ev.attrs.name) || 'run'}`;
118
+ bucket.kind = 'root';
119
+ rootSpanId = ev.span_id;
120
+ workflowName = (ev.attrs && ev.attrs.name) || workflowName;
121
+ Object.assign(bucket.attrs, ev.attrs || {});
122
+ } else if (ev.name === 'workflow.complete') {
123
+ bucket.endEvent = ev;
124
+ Object.assign(bucket.attrs, ev.attrs || {});
125
+ } else if (ev.name === 'agent.start') {
126
+ bucket.startEvent = ev;
127
+ bucket.name = `agent.${(ev.attrs && ev.attrs.agent) || 'unknown'}`;
128
+ Object.assign(bucket.attrs, ev.attrs || {});
129
+ } else if (ev.name === 'agent.end') {
130
+ bucket.endEvent = ev;
131
+ Object.assign(bucket.attrs, ev.attrs || {});
132
+ } else {
133
+ bucket.extras.push(ev);
134
+ }
135
+ }
136
+
137
+ // Pass 2: emit spans. For buckets without a start, synthesize one
138
+ // using the first extra event's timestamp; same for end.
139
+ const spans = [];
140
+ for (const bucket of bySpan.values()) {
141
+ const start = bucket.startEvent
142
+ || bucket.extras[0]
143
+ || bucket.endEvent;
144
+ const end = bucket.endEvent
145
+ || bucket.extras[bucket.extras.length - 1]
146
+ || bucket.startEvent;
147
+ if (!start || !end) continue;
148
+
149
+ const span = {
150
+ traceId,
151
+ spanId: bucket.spanId,
152
+ name: bucket.name || (bucket.extras[0] && bucket.extras[0].name) || 'span',
153
+ kind: 1, // SPAN_KIND_INTERNAL
154
+ startTimeUnixNano: isoToNanos(start.ts),
155
+ endTimeUnixNano: isoToNanos(end.ts),
156
+ attributes: attrEntries(bucket.attrs),
157
+ events: bucket.extras.map(ev => ({
158
+ timeUnixNano: isoToNanos(ev.ts),
159
+ name: ev.name,
160
+ attributes: attrEntries(ev.attrs)
161
+ })),
162
+ status: { code: hasError(bucket) ? 2 : 1 } // 2=ERROR, 1=OK
163
+ };
164
+
165
+ if (bucket.parent) span.parentSpanId = bucket.parent;
166
+ else if (rootSpanId && bucket.spanId !== rootSpanId) {
167
+ span.parentSpanId = rootSpanId;
168
+ }
169
+
170
+ spans.push(span);
171
+ }
172
+
173
+ const resourceAttrs = [
174
+ { key: 'service.name', value: { stringValue: serviceName } }
175
+ ];
176
+ if (runId) {
177
+ resourceAttrs.push({
178
+ key: 'service.instance.id',
179
+ value: { stringValue: runId }
180
+ });
181
+ }
182
+ if (workflowName) {
183
+ resourceAttrs.push({
184
+ key: 'godpowers.workflow',
185
+ value: { stringValue: workflowName }
186
+ });
187
+ }
188
+
189
+ return [{
190
+ resource: { attributes: resourceAttrs },
191
+ scopeSpans: [{
192
+ scope: { name: SCOPE_NAME, version: packageVersion() },
193
+ spans
194
+ }]
195
+ }];
196
+ }
197
+
198
+ function hasError(bucket) {
199
+ if (bucket.extras.some(e => e.name === 'error' || e.name === 'gate.fail')) return true;
200
+ if (bucket.endEvent && bucket.endEvent.attrs && bucket.endEvent.attrs.status === 'error') return true;
201
+ return false;
202
+ }
203
+
204
+ /**
205
+ * Normalize an OTLP HTTP endpoint. The OTel spec says:
206
+ * - If OTEL_EXPORTER_OTLP_TRACES_ENDPOINT is set, use it verbatim.
207
+ * - If OTEL_EXPORTER_OTLP_ENDPOINT is set, append /v1/traces.
208
+ *
209
+ * This helper accepts either: if the path already ends in /v1/traces
210
+ * we leave it alone, otherwise we append.
211
+ */
212
+ function resolveEndpoint(endpoint) {
213
+ if (!endpoint) return null;
214
+ const u = new URL(endpoint);
215
+ if (!/\/v1\/traces\/?$/.test(u.pathname)) {
216
+ u.pathname = u.pathname.replace(/\/$/, '') + '/v1/traces';
217
+ }
218
+ return u.toString();
219
+ }
220
+
221
+ /**
222
+ * POST OTLP JSON to a collector. Returns a promise that resolves to
223
+ * { ok, status, body }. Honors OTEL_EXPORTER_OTLP_HEADERS env var
224
+ * (comma-separated key=value pairs) for auth.
225
+ */
226
+ function postJson(endpoint, body) {
227
+ const url = new URL(endpoint);
228
+ const client = url.protocol === 'https:' ? https : http;
229
+ const payload = JSON.stringify(body);
230
+ const headers = {
231
+ 'Content-Type': 'application/json',
232
+ 'Content-Length': Buffer.byteLength(payload)
233
+ };
234
+ const raw = process.env.OTEL_EXPORTER_OTLP_HEADERS;
235
+ if (raw) {
236
+ for (const pair of raw.split(',')) {
237
+ const [k, v] = pair.split('=').map(s => s && s.trim());
238
+ if (k && v) headers[k] = v;
239
+ }
240
+ }
241
+ return new Promise((resolve, reject) => {
242
+ const req = client.request({
243
+ method: 'POST',
244
+ hostname: url.hostname,
245
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
246
+ path: url.pathname + url.search,
247
+ headers
248
+ }, res => {
249
+ const chunks = [];
250
+ res.on('data', c => chunks.push(c));
251
+ res.on('end', () => resolve({
252
+ ok: res.statusCode >= 200 && res.statusCode < 300,
253
+ status: res.statusCode,
254
+ body: Buffer.concat(chunks).toString('utf8')
255
+ }));
256
+ });
257
+ req.on('error', reject);
258
+ req.write(payload);
259
+ req.end();
260
+ });
261
+ }
262
+
263
+ /**
264
+ * Export one run.
265
+ *
266
+ * opts:
267
+ * endpoint - OTLP HTTP endpoint (else falls back to OTEL_EXPORTER_OTLP_ENDPOINT)
268
+ * stdout - if true, return JSON without POSTing
269
+ * serviceName - override 'godpowers'
270
+ *
271
+ * Return: { spans, payload, posted, status?, body? }
272
+ */
273
+ async function exportRun(projectRoot, runId, opts = {}) {
274
+ const eventList = events.readRun(projectRoot, runId);
275
+ const resourceSpans = convertRun(eventList, { runId, serviceName: opts.serviceName });
276
+ const payload = { resourceSpans };
277
+ const result = {
278
+ spans: resourceSpans[0] ? resourceSpans[0].scopeSpans[0].spans.length : 0,
279
+ payload,
280
+ posted: false
281
+ };
282
+
283
+ const endpoint = opts.endpoint
284
+ || process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
285
+ || process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
286
+
287
+ if (opts.stdout || !endpoint) {
288
+ return result;
289
+ }
290
+
291
+ const resolved = resolveEndpoint(endpoint);
292
+ const res = await postJson(resolved, payload);
293
+ result.posted = true;
294
+ result.status = res.status;
295
+ result.body = res.body;
296
+ result.endpoint = resolved;
297
+ return result;
298
+ }
299
+
300
+ module.exports = {
301
+ convertRun,
302
+ exportRun,
303
+ resolveEndpoint,
304
+ isoToNanos,
305
+ anyValue,
306
+ attrEntries,
307
+ postJson
308
+ };
package/lib/recipes.js ADDED
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Recipes
3
+ *
4
+ * Scenario-based decision support. Maps fuzzy user intent to specific
5
+ * command sequences. Used by /god-next, god-orchestrator, and SessionStart
6
+ * hook to make decisions when the simple routing graph is insufficient.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { parseSimpleYaml } = require('./intent');
12
+ const state = require('./state');
13
+
14
+ const RECIPES_DIR = path.join(__dirname, '..', 'routing', 'recipes');
15
+
16
+ let _cache = null;
17
+
18
+ /**
19
+ * Load all recipe definitions.
20
+ */
21
+ function loadAll() {
22
+ if (_cache) return _cache;
23
+ const result = [];
24
+ if (!fs.existsSync(RECIPES_DIR)) return result;
25
+
26
+ for (const file of fs.readdirSync(RECIPES_DIR)) {
27
+ if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;
28
+ const content = fs.readFileSync(path.join(RECIPES_DIR, file), 'utf8');
29
+ const parsed = parseSimpleYaml(content);
30
+ if (parsed.metadata && parsed.metadata.name) {
31
+ result.push(parsed);
32
+ }
33
+ }
34
+ _cache = result;
35
+ return result;
36
+ }
37
+
38
+ /**
39
+ * Get a recipe by name.
40
+ */
41
+ function getRecipe(name) {
42
+ return loadAll().find(r => r.metadata && r.metadata.name === name) || null;
43
+ }
44
+
45
+ /**
46
+ * Match user intent text against recipes' keywords.
47
+ * Returns matches sorted by relevance score.
48
+ */
49
+ function matchIntent(text, projectRoot) {
50
+ if (!text) return [];
51
+ const lowered = text.toLowerCase();
52
+ const allRecipes = loadAll();
53
+ const matches = [];
54
+
55
+ for (const recipe of allRecipes) {
56
+ const keywords = (recipe.triggers && recipe.triggers['intent-keywords']) || [];
57
+ let score = 0;
58
+
59
+ for (const kw of keywords) {
60
+ const kwLower = kw.toLowerCase();
61
+ // Exact phrase match: high score
62
+ if (lowered.includes(kwLower)) {
63
+ score += 10;
64
+ } else {
65
+ // All-words match: medium score
66
+ const words = kwLower.split(/\s+/).filter(w => w.length > 2);
67
+ const allMatch = words.every(w => lowered.includes(w));
68
+ if (allMatch && words.length > 0) {
69
+ score += 5;
70
+ }
71
+ }
72
+ }
73
+
74
+ // Apply state conditions
75
+ if (score > 0 && projectRoot) {
76
+ const stateConds = (recipe.triggers && recipe.triggers['state-conditions']) || [];
77
+ const stateOk = stateConds.every(c => evaluateStateCondition(c, projectRoot));
78
+ if (!stateOk) {
79
+ // Doesn't match current state: penalize but don't remove (might still be useful)
80
+ score = Math.max(1, score - 5);
81
+ }
82
+ }
83
+
84
+ if (score > 0) {
85
+ matches.push({ recipe, score });
86
+ }
87
+ }
88
+
89
+ return matches.sort((a, b) => b.score - a.score);
90
+ }
91
+
92
+ /**
93
+ * Evaluate a state condition predicate.
94
+ */
95
+ function evaluateStateCondition(condition, projectRoot) {
96
+ const cond = condition.trim();
97
+
98
+ if (cond === 'no-godpowers-dir') {
99
+ return !fs.existsSync(path.join(projectRoot, '.godpowers'));
100
+ }
101
+ if (cond === 'has-package-json') {
102
+ return fs.existsSync(path.join(projectRoot, 'package.json'));
103
+ }
104
+ if (cond.startsWith('file:')) {
105
+ return fs.existsSync(path.join(projectRoot, cond.slice(5).trim()));
106
+ }
107
+ if (cond.startsWith('lifecycle-phase ==')) {
108
+ const expected = cond.split('==')[1].trim();
109
+ const s = state.read(projectRoot);
110
+ return s && s['lifecycle-phase'] === expected;
111
+ }
112
+ if (cond.startsWith('tier-')) {
113
+ // Format: tier-N.subkey.field == value
114
+ const m = cond.match(/^([\w.-]+)\s*==\s*(.+)$/);
115
+ if (!m) return true;
116
+ const [, dottedPath, expected] = m;
117
+ const s = state.read(projectRoot);
118
+ if (!s) return false;
119
+ const actual = dottedPath.split('.').reduce((acc, k) => (acc ? acc[k] : undefined), s.tiers || s);
120
+ return actual === expected.trim();
121
+ }
122
+ // Unknown condition: assume satisfied (don't block)
123
+ return true;
124
+ }
125
+
126
+ /**
127
+ * Suggest top recipes based on current project state alone (no intent text).
128
+ */
129
+ function suggestForState(projectRoot) {
130
+ const allRecipes = loadAll();
131
+ const matches = [];
132
+
133
+ for (const recipe of allRecipes) {
134
+ const stateConds = (recipe.triggers && recipe.triggers['state-conditions']) || [];
135
+ if (stateConds.length === 0) continue;
136
+ const stateOk = stateConds.every(c => evaluateStateCondition(c, projectRoot));
137
+ if (stateOk) {
138
+ matches.push(recipe);
139
+ }
140
+ }
141
+
142
+ return matches;
143
+ }
144
+
145
+ /**
146
+ * Get the default sequence (steps) from a recipe.
147
+ */
148
+ function getSequence(recipe, sequenceName) {
149
+ const name = sequenceName || recipe['default-sequence'] || 'default';
150
+ if (!recipe.sequences || !recipe.sequences[name]) return [];
151
+ return recipe.sequences[name].steps || [];
152
+ }
153
+
154
+ /**
155
+ * List recipes by category.
156
+ */
157
+ function listByCategory(category) {
158
+ return loadAll().filter(r => r.metadata && r.metadata.category === category);
159
+ }
160
+
161
+ /**
162
+ * Get all categories present.
163
+ */
164
+ function categories() {
165
+ const cats = new Set();
166
+ for (const r of loadAll()) {
167
+ if (r.metadata && r.metadata.category) cats.add(r.metadata.category);
168
+ }
169
+ return Array.from(cats).sort();
170
+ }
171
+
172
+ function clearCache() {
173
+ _cache = null;
174
+ }
175
+
176
+ module.exports = {
177
+ loadAll,
178
+ getRecipe,
179
+ matchIntent,
180
+ suggestForState,
181
+ getSequence,
182
+ listByCategory,
183
+ categories,
184
+ evaluateStateCondition,
185
+ clearCache
186
+ };