voidmachine 0.0.0 → 4.0.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 (341) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -4
  3. package/bin/void-harness.mjs +12 -0
  4. package/bin/void-machine.mjs +12 -0
  5. package/core-assets/.claude-plugin/plugin.json +253 -0
  6. package/core-assets/.gitkeep +0 -0
  7. package/core-assets/PHILOSOPHY.md +218 -0
  8. package/core-assets/PROJECT-DOCTRINE.template.md +14 -0
  9. package/core-assets/adapters/security/manifest.yaml +96 -0
  10. package/core-assets/agents/.gitkeep +0 -0
  11. package/core-assets/agents/accessibility-specialist.md +59 -0
  12. package/core-assets/agents/api-integration-engineer.md +59 -0
  13. package/core-assets/agents/code-explorer.md +94 -0
  14. package/core-assets/agents/code-explorer.source +7 -0
  15. package/core-assets/agents/data-migration-engineer.md +59 -0
  16. package/core-assets/agents/devex-docs-engineer.md +57 -0
  17. package/core-assets/agents/doctrine-critic.md +91 -0
  18. package/core-assets/agents/doctrine-critic.source +11 -0
  19. package/core-assets/agents/domain-architect.md +56 -0
  20. package/core-assets/agents/experience-designer.md +59 -0
  21. package/core-assets/agents/frontend-engineer.md +60 -0
  22. package/core-assets/agents/independent-code-reviewer.md +61 -0
  23. package/core-assets/agents/migration-planner.md +97 -0
  24. package/core-assets/agents/migration-planner.source +7 -0
  25. package/core-assets/agents/observability-sre-engineer.md +59 -0
  26. package/core-assets/agents/pdf-specialist.md +58 -0
  27. package/core-assets/agents/performance-engineer.md +58 -0
  28. package/core-assets/agents/product-challenger.md +55 -0
  29. package/core-assets/agents/security-engineer.md +66 -0
  30. package/core-assets/agents/silent-failure-hunter.md +94 -0
  31. package/core-assets/agents/silent-failure-hunter.source +8 -0
  32. package/core-assets/agents/solution-architect.md +57 -0
  33. package/core-assets/agents/test-qa-engineer.md +60 -0
  34. package/core-assets/agents/type-design-analyzer.md +93 -0
  35. package/core-assets/agents/type-design-analyzer.source +8 -0
  36. package/core-assets/agents/visual-craft-director.md +62 -0
  37. package/core-assets/codex/hooks.json +157 -0
  38. package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
  39. package/core-assets/data/catalog.v3.json +10479 -0
  40. package/core-assets/data/certification.json +1800 -0
  41. package/core-assets/data/identity.json +8 -0
  42. package/core-assets/data/model.json +4226 -0
  43. package/core-assets/enforce/ci-enforce.sh +183 -0
  44. package/core-assets/hooks/_checks.sh +145 -0
  45. package/core-assets/hooks/_hooklib.sh +163 -0
  46. package/core-assets/hooks/_syntax-worker.cjs +503 -0
  47. package/core-assets/hooks/_void-hook.mjs +5459 -0
  48. package/core-assets/hooks/activation-meter.sh +13 -0
  49. package/core-assets/hooks/anti-ai-slop-grep.sh +38 -0
  50. package/core-assets/hooks/auto-format.sh +9 -0
  51. package/core-assets/hooks/axe-precommit.sh +35 -0
  52. package/core-assets/hooks/block-dangerous-bash.sh +10 -0
  53. package/core-assets/hooks/block-protected-push.sh +81 -0
  54. package/core-assets/hooks/boundary-direction-check.sh +10 -0
  55. package/core-assets/hooks/control-character-grep.sh +10 -0
  56. package/core-assets/hooks/fowler-refactors.txt +71 -0
  57. package/core-assets/hooks/large-cl-grep.sh +9 -0
  58. package/core-assets/hooks/llm-cost-precommit.sh +55 -0
  59. package/core-assets/hooks/migration-lint.sh +58 -0
  60. package/core-assets/hooks/migration-pr-template.sh +55 -0
  61. package/core-assets/hooks/no-ai-design-slop.sh +10 -0
  62. package/core-assets/hooks/no-any-grep.sh +10 -0
  63. package/core-assets/hooks/no-as-cast-grep.sh +10 -0
  64. package/core-assets/hooks/no-console-log-grep.sh +10 -0
  65. package/core-assets/hooks/no-null-grep.sh +10 -0
  66. package/core-assets/hooks/no-only-no-skip.sh +10 -0
  67. package/core-assets/hooks/outcome-meter.sh +13 -0
  68. package/core-assets/hooks/pre-PR-review-evidence.sh +47 -0
  69. package/core-assets/hooks/protect-sensitive-files.sh +10 -0
  70. package/core-assets/hooks/refactor-named-grep.sh +49 -0
  71. package/core-assets/hooks/secret-in-content.sh +10 -0
  72. package/core-assets/hooks/sessionstart-context.sh +9 -0
  73. package/core-assets/hooks/stop-typecheck.sh +9 -0
  74. package/core-assets/hooks/tdd-guard.md +90 -0
  75. package/core-assets/hooks/tdd-guard.sh +10 -0
  76. package/core-assets/hooks/test-name-lint.sh +10 -0
  77. package/core-assets/hooks/tidying-commit-prefix.sh +37 -0
  78. package/core-assets/hooks/trim-large-output.sh +9 -0
  79. package/core-assets/hooks/tsc-noemit-precommit.sh +22 -0
  80. package/core-assets/hooks/ubiquitous-language-lint.sh +58 -0
  81. package/core-assets/hooks/viewport-screenshot-gate.sh +48 -0
  82. package/core-assets/modules/.gitkeep +0 -0
  83. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/.source +7 -0
  84. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/SKILL.md +164 -0
  85. package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/harness.yaml +14 -0
  86. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/.source +7 -0
  87. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/SKILL.md +178 -0
  88. package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/harness.yaml +14 -0
  89. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/.source +8 -0
  90. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/SKILL.md +209 -0
  91. package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/harness.yaml +14 -0
  92. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/.source +7 -0
  93. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/SKILL.md +194 -0
  94. package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/harness.yaml +14 -0
  95. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/.source +5 -0
  96. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +160 -0
  97. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/harness.yaml +14 -0
  98. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/.source +5 -0
  99. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/SKILL.md +70 -0
  100. package/core-assets/packs/pack-monorepo/skills/void-package-extraction/harness.yaml +14 -0
  101. package/core-assets/packs/pack-monorepo/skills/void-service-package/.source +5 -0
  102. package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +122 -0
  103. package/core-assets/packs/pack-monorepo/skills/void-service-package/harness.yaml +14 -0
  104. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/.source +7 -0
  105. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/SKILL.md +116 -0
  106. package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/harness.yaml +14 -0
  107. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/.source +5 -0
  108. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/SKILL.md +162 -0
  109. package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/harness.yaml +14 -0
  110. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/.source +5 -0
  111. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/SKILL.md +161 -0
  112. package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/harness.yaml +14 -0
  113. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/.source +5 -0
  114. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/SKILL.md +176 -0
  115. package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/harness.yaml +14 -0
  116. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/.source +5 -0
  117. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/SKILL.md +129 -0
  118. package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/harness.yaml +14 -0
  119. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/.source +5 -0
  120. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/SKILL.md +107 -0
  121. package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/harness.yaml +14 -0
  122. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/.source +5 -0
  123. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/SKILL.md +153 -0
  124. package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/harness.yaml +14 -0
  125. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/.source +5 -0
  126. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/SKILL.md +204 -0
  127. package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/harness.yaml +14 -0
  128. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/.source +8 -0
  129. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/SKILL.md +266 -0
  130. package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/harness.yaml +14 -0
  131. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/.source +5 -0
  132. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/SKILL.md +178 -0
  133. package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/harness.yaml +14 -0
  134. package/core-assets/packs/pack-react/skills/void-accessibility-check/.source +8 -0
  135. package/core-assets/packs/pack-react/skills/void-accessibility-check/SKILL.md +136 -0
  136. package/core-assets/packs/pack-react/skills/void-accessibility-check/harness.yaml +14 -0
  137. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/.source +5 -0
  138. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/SKILL.md +116 -0
  139. package/core-assets/packs/pack-react/skills/void-client-vs-server-component/harness.yaml +14 -0
  140. package/core-assets/packs/pack-react/skills/void-form-pattern/.source +7 -0
  141. package/core-assets/packs/pack-react/skills/void-form-pattern/SKILL.md +157 -0
  142. package/core-assets/packs/pack-react/skills/void-form-pattern/harness.yaml +14 -0
  143. package/core-assets/packs/pack-react/skills/void-state-architecture/.source +5 -0
  144. package/core-assets/packs/pack-react/skills/void-state-architecture/SKILL.md +160 -0
  145. package/core-assets/packs/pack-react/skills/void-state-architecture/harness.yaml +14 -0
  146. package/core-assets/packs/pack-server/skills/void-background-job-pattern/.source +6 -0
  147. package/core-assets/packs/pack-server/skills/void-background-job-pattern/SKILL.md +214 -0
  148. package/core-assets/packs/pack-server/skills/void-background-job-pattern/harness.yaml +14 -0
  149. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/.source +6 -0
  150. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/SKILL.md +168 -0
  151. package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/harness.yaml +14 -0
  152. package/core-assets/packs/pack-server/skills/void-env-validation/.source +6 -0
  153. package/core-assets/packs/pack-server/skills/void-env-validation/SKILL.md +131 -0
  154. package/core-assets/packs/pack-server/skills/void-env-validation/harness.yaml +14 -0
  155. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/.source +6 -0
  156. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/SKILL.md +149 -0
  157. package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/harness.yaml +14 -0
  158. package/core-assets/packs/pack-server/skills/void-server-action/.source +7 -0
  159. package/core-assets/packs/pack-server/skills/void-server-action/SKILL.md +181 -0
  160. package/core-assets/packs/pack-server/skills/void-server-action/harness.yaml +14 -0
  161. package/core-assets/packs/pack-server/skills/void-testing-server-modules/.source +7 -0
  162. package/core-assets/packs/pack-server/skills/void-testing-server-modules/SKILL.md +73 -0
  163. package/core-assets/packs/pack-server/skills/void-testing-server-modules/harness.yaml +14 -0
  164. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +7 -0
  165. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +205 -0
  166. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/harness.yaml +14 -0
  167. package/core-assets/policies/core.yaml +95 -0
  168. package/core-assets/policies/ui.yaml +23 -0
  169. package/core-assets/profiles/base.yaml +29 -0
  170. package/core-assets/profiles/expo-config.yaml +36 -0
  171. package/core-assets/profiles/expo.yaml +35 -0
  172. package/core-assets/profiles/monorepo.yaml +33 -0
  173. package/core-assets/profiles/nextjs-config.yaml +31 -0
  174. package/core-assets/profiles/nextjs.yaml +31 -0
  175. package/core-assets/profiles/node-server.yaml +31 -0
  176. package/core-assets/profiles/pwa.yaml +33 -0
  177. package/core-assets/profiles/react.yaml +39 -0
  178. package/core-assets/profiles/sql.yaml +39 -0
  179. package/core-assets/profiles/typescript.yaml +39 -0
  180. package/core-assets/skills/.gitkeep +0 -0
  181. package/core-assets/skills/void-accessibility/.source +15 -0
  182. package/core-assets/skills/void-accessibility/SKILL.md +275 -0
  183. package/core-assets/skills/void-accessibility/harness.yaml +17 -0
  184. package/core-assets/skills/void-api-and-interface-design/.source +13 -0
  185. package/core-assets/skills/void-api-and-interface-design/SKILL.md +231 -0
  186. package/core-assets/skills/void-api-and-interface-design/harness.yaml +16 -0
  187. package/core-assets/skills/void-async-safety/.source +13 -0
  188. package/core-assets/skills/void-async-safety/SKILL.md +287 -0
  189. package/core-assets/skills/void-async-safety/harness.yaml +16 -0
  190. package/core-assets/skills/void-audit/.source +15 -0
  191. package/core-assets/skills/void-audit/SKILL.md +83 -0
  192. package/core-assets/skills/void-audit/harness.yaml +14 -0
  193. package/core-assets/skills/void-autopilot/.source +21 -0
  194. package/core-assets/skills/void-autopilot/SKILL.md +358 -0
  195. package/core-assets/skills/void-autopilot/harness.yaml +14 -0
  196. package/core-assets/skills/void-brainstorm/.source +14 -0
  197. package/core-assets/skills/void-brainstorm/SKILL.md +271 -0
  198. package/core-assets/skills/void-brainstorm/harness.yaml +14 -0
  199. package/core-assets/skills/void-checkpoint/.source +39 -0
  200. package/core-assets/skills/void-checkpoint/SKILL.md +227 -0
  201. package/core-assets/skills/void-checkpoint/harness.yaml +14 -0
  202. package/core-assets/skills/void-claude-md/.source +15 -0
  203. package/core-assets/skills/void-claude-md/SKILL.md +180 -0
  204. package/core-assets/skills/void-claude-md/harness.yaml +14 -0
  205. package/core-assets/skills/void-code-review/.source +14 -0
  206. package/core-assets/skills/void-code-review/SKILL.md +232 -0
  207. package/core-assets/skills/void-code-review/harness.yaml +15 -0
  208. package/core-assets/skills/void-commit-discipline/.source +9 -0
  209. package/core-assets/skills/void-commit-discipline/SKILL.md +211 -0
  210. package/core-assets/skills/void-commit-discipline/harness.yaml +15 -0
  211. package/core-assets/skills/void-context/.source +15 -0
  212. package/core-assets/skills/void-context/SKILL.md +167 -0
  213. package/core-assets/skills/void-context/harness.yaml +14 -0
  214. package/core-assets/skills/void-debug/.source +11 -0
  215. package/core-assets/skills/void-debug/SKILL.md +211 -0
  216. package/core-assets/skills/void-debug/harness.yaml +14 -0
  217. package/core-assets/skills/void-decide/.source +9 -0
  218. package/core-assets/skills/void-decide/SKILL.md +147 -0
  219. package/core-assets/skills/void-decide/harness.yaml +14 -0
  220. package/core-assets/skills/void-devex-audit/.source +8 -0
  221. package/core-assets/skills/void-devex-audit/SKILL.md +113 -0
  222. package/core-assets/skills/void-devex-audit/harness.yaml +15 -0
  223. package/core-assets/skills/void-doctor/.source +15 -0
  224. package/core-assets/skills/void-doctor/SKILL.md +83 -0
  225. package/core-assets/skills/void-doctor/harness.yaml +14 -0
  226. package/core-assets/skills/void-domain-driven-design/.source +13 -0
  227. package/core-assets/skills/void-domain-driven-design/SKILL.md +292 -0
  228. package/core-assets/skills/void-domain-driven-design/harness.yaml +15 -0
  229. package/core-assets/skills/void-frontend-design/.source +19 -0
  230. package/core-assets/skills/void-frontend-design/SKILL.md +274 -0
  231. package/core-assets/skills/void-frontend-design/harness.yaml +17 -0
  232. package/core-assets/skills/void-functional/.source +14 -0
  233. package/core-assets/skills/void-functional/SKILL.md +312 -0
  234. package/core-assets/skills/void-functional/harness.yaml +15 -0
  235. package/core-assets/skills/void-graph/.source +15 -0
  236. package/core-assets/skills/void-graph/SKILL.md +80 -0
  237. package/core-assets/skills/void-graph/harness.yaml +14 -0
  238. package/core-assets/skills/void-hexagonal-architecture/.source +12 -0
  239. package/core-assets/skills/void-hexagonal-architecture/SKILL.md +276 -0
  240. package/core-assets/skills/void-hexagonal-architecture/harness.yaml +15 -0
  241. package/core-assets/skills/void-implement/.source +39 -0
  242. package/core-assets/skills/void-implement/SKILL.md +183 -0
  243. package/core-assets/skills/void-implement/harness.yaml +14 -0
  244. package/core-assets/skills/void-learn/.source +13 -0
  245. package/core-assets/skills/void-learn/SKILL.md +226 -0
  246. package/core-assets/skills/void-learn/harness.yaml +14 -0
  247. package/core-assets/skills/void-llm-cost-discipline/.source +13 -0
  248. package/core-assets/skills/void-llm-cost-discipline/SKILL.md +299 -0
  249. package/core-assets/skills/void-llm-cost-discipline/harness.yaml +15 -0
  250. package/core-assets/skills/void-make-pdf/.source +9 -0
  251. package/core-assets/skills/void-make-pdf/SKILL.md +52 -0
  252. package/core-assets/skills/void-make-pdf/harness.yaml +15 -0
  253. package/core-assets/skills/void-merge/.source +8 -0
  254. package/core-assets/skills/void-merge/SKILL.md +111 -0
  255. package/core-assets/skills/void-merge/harness.yaml +14 -0
  256. package/core-assets/skills/void-migrations/.source +13 -0
  257. package/core-assets/skills/void-migrations/SKILL.md +264 -0
  258. package/core-assets/skills/void-migrations/harness.yaml +17 -0
  259. package/core-assets/skills/void-observability/.source +12 -0
  260. package/core-assets/skills/void-observability/SKILL.md +245 -0
  261. package/core-assets/skills/void-observability/harness.yaml +15 -0
  262. package/core-assets/skills/void-plan/.source +15 -0
  263. package/core-assets/skills/void-plan/SKILL.md +239 -0
  264. package/core-assets/skills/void-plan/harness.yaml +14 -0
  265. package/core-assets/skills/void-plan-review/.source +12 -0
  266. package/core-assets/skills/void-plan-review/SKILL.md +128 -0
  267. package/core-assets/skills/void-plan-review/harness.yaml +15 -0
  268. package/core-assets/skills/void-qa/.source +15 -0
  269. package/core-assets/skills/void-qa/SKILL.md +103 -0
  270. package/core-assets/skills/void-qa/harness.yaml +15 -0
  271. package/core-assets/skills/void-refactor/.source +9 -0
  272. package/core-assets/skills/void-refactor/SKILL.md +220 -0
  273. package/core-assets/skills/void-refactor/harness.yaml +15 -0
  274. package/core-assets/skills/void-retrospective/.source +9 -0
  275. package/core-assets/skills/void-retrospective/SKILL.md +71 -0
  276. package/core-assets/skills/void-retrospective/harness.yaml +15 -0
  277. package/core-assets/skills/void-security-audit/.source +12 -0
  278. package/core-assets/skills/void-security-audit/SKILL.md +138 -0
  279. package/core-assets/skills/void-security-audit/harness.yaml +15 -0
  280. package/core-assets/skills/void-security-guidance/.source +12 -0
  281. package/core-assets/skills/void-security-guidance/SKILL.md +255 -0
  282. package/core-assets/skills/void-security-guidance/harness.yaml +15 -0
  283. package/core-assets/skills/void-source-driven-development/.source +12 -0
  284. package/core-assets/skills/void-source-driven-development/SKILL.md +158 -0
  285. package/core-assets/skills/void-source-driven-development/harness.yaml +15 -0
  286. package/core-assets/skills/void-tdd/.source +15 -0
  287. package/core-assets/skills/void-tdd/SKILL.md +394 -0
  288. package/core-assets/skills/void-tdd/harness.yaml +15 -0
  289. package/core-assets/skills/void-testing/.source +19 -0
  290. package/core-assets/skills/void-testing/SKILL.md +301 -0
  291. package/core-assets/skills/void-testing/harness.yaml +17 -0
  292. package/core-assets/skills/void-ticket/.source +18 -0
  293. package/core-assets/skills/void-ticket/SKILL.md +239 -0
  294. package/core-assets/skills/void-ticket/harness.yaml +14 -0
  295. package/core-assets/skills/void-typescript-strict/.source +10 -0
  296. package/core-assets/skills/void-typescript-strict/SKILL.md +294 -0
  297. package/core-assets/skills/void-typescript-strict/harness.yaml +17 -0
  298. package/core-assets/skills/void-ui-review/.source +12 -0
  299. package/core-assets/skills/void-ui-review/SKILL.md +97 -0
  300. package/core-assets/skills/void-ui-review/harness.yaml +15 -0
  301. package/core-assets/skills/void-verify/.source +12 -0
  302. package/core-assets/skills/void-verify/SKILL.md +184 -0
  303. package/core-assets/skills/void-verify/harness.yaml +15 -0
  304. package/core-assets/specialists/accessibility-specialist.source +11 -0
  305. package/core-assets/specialists/accessibility-specialist.yaml +30 -0
  306. package/core-assets/specialists/api-integration-engineer.source +11 -0
  307. package/core-assets/specialists/api-integration-engineer.yaml +30 -0
  308. package/core-assets/specialists/data-migration-engineer.source +11 -0
  309. package/core-assets/specialists/data-migration-engineer.yaml +30 -0
  310. package/core-assets/specialists/devex-docs-engineer.source +11 -0
  311. package/core-assets/specialists/devex-docs-engineer.yaml +29 -0
  312. package/core-assets/specialists/domain-architect.source +11 -0
  313. package/core-assets/specialists/domain-architect.yaml +28 -0
  314. package/core-assets/specialists/experience-designer.source +15 -0
  315. package/core-assets/specialists/experience-designer.yaml +38 -0
  316. package/core-assets/specialists/frontend-engineer.source +11 -0
  317. package/core-assets/specialists/frontend-engineer.yaml +32 -0
  318. package/core-assets/specialists/independent-code-reviewer.source +10 -0
  319. package/core-assets/specialists/independent-code-reviewer.yaml +37 -0
  320. package/core-assets/specialists/migrations.json +15 -0
  321. package/core-assets/specialists/observability-sre-engineer.source +11 -0
  322. package/core-assets/specialists/observability-sre-engineer.yaml +30 -0
  323. package/core-assets/specialists/pdf-specialist.source +11 -0
  324. package/core-assets/specialists/pdf-specialist.yaml +29 -0
  325. package/core-assets/specialists/performance-engineer.source +11 -0
  326. package/core-assets/specialists/performance-engineer.yaml +29 -0
  327. package/core-assets/specialists/product-challenger.source +10 -0
  328. package/core-assets/specialists/product-challenger.yaml +27 -0
  329. package/core-assets/specialists/security-engineer.source +13 -0
  330. package/core-assets/specialists/security-engineer.yaml +41 -0
  331. package/core-assets/specialists/solution-architect.source +13 -0
  332. package/core-assets/specialists/solution-architect.yaml +32 -0
  333. package/core-assets/specialists/test-qa-engineer.source +14 -0
  334. package/core-assets/specialists/test-qa-engineer.yaml +35 -0
  335. package/core-assets/specialists/visual-craft-director.source +17 -0
  336. package/core-assets/specialists/visual-craft-director.yaml +60 -0
  337. package/core-assets/templates/github/dependency-audit.mjs +54 -0
  338. package/core-assets/templates/github/void-dependency-audit.yml +35 -0
  339. package/core-assets/templates/github/void-security.yml +85 -0
  340. package/dist/main.js +57001 -0
  341. package/package.json +66 -4
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: void-webhook-handler-pattern
3
+ description: Build a webhook handler with signature verification, idempotency, and dead-letter routing. Per-source patterns (Stripe, Resend, GitHub). Self-contained — no harness wrappers required.
4
+ ---
5
+
6
+ # webhook-handler-pattern
7
+
8
+ Use when adding any inbound webhook endpoint (Stripe, Resend, GitHub, custom). Webhooks are **untrusted POST endpoints** that fire from external systems — every wrong handler is either a security breach (forged events accepted), a duplicate-charge bug (no idempotency), or a silent failure (no dead-letter).
9
+
10
+ ## Location
11
+
12
+ ```
13
+ apps/<app>/src/app/api/webhooks/<source>/route.ts
14
+ ```
15
+
16
+ One folder per source. Path stable (external systems POST to a fixed URL — never rename without coordinating).
17
+
18
+ ## The 5 non-negotiable layers
19
+
20
+ ```
21
+ 1. Signature verification — verify the event came from the source
22
+ 2. Idempotency — same event delivered twice = one effect
23
+ 3. Zod validation — parsed shape matches what handler expects
24
+ 4. Service call — the business work (in apps/<app>/src/services/)
25
+ 5. Acknowledgment — return 2xx on success; specific codes on failure
26
+ ```
27
+
28
+ Skipping ANY of these is a Sev-2 waiting. The pattern below shows the 5 layers explicit — no wrapper assumed.
29
+
30
+ ## Canonical handler (explicit, self-contained)
31
+
32
+ ```ts
33
+ // apps/web/src/app/api/webhooks/stripe/route.ts
34
+ import { NextRequest, NextResponse } from 'next/server';
35
+ import Stripe from 'stripe';
36
+ import { z } from 'zod';
37
+ import { db } from '@/adapters/db';
38
+ import { env, logger } from '@repo/core';
39
+ import * as Sentry from '@sentry/nextjs';
40
+ import { handleStripeEvent } from '@/services/billing/stripe';
41
+
42
+ const stripe = new Stripe(env.STRIPE_SECRET_KEY);
43
+
44
+ // 3. Zod schema for the parsed Stripe event (defense in depth — Stripe's
45
+ // own parser is trusted, but we re-shape to our service contract).
46
+ const EventSchema = z.object({
47
+ id: z.string(),
48
+ type: z.string(),
49
+ data: z.object({ object: z.unknown() }),
50
+ livemode: z.boolean(),
51
+ });
52
+
53
+ export async function POST(req: NextRequest) {
54
+ const sig = req.headers.get('stripe-signature');
55
+ const body = await req.text();
56
+ const idempotencyKey = `stripe:${req.headers.get('stripe-signature')?.slice(0, 16) ?? ''}`;
57
+
58
+ let stripeEvent: Stripe.Event;
59
+ try {
60
+ // 1. Signature verification (Stripe-specific)
61
+ if (!sig) {
62
+ return NextResponse.json({ error: 'missing signature' }, { status: 401 });
63
+ }
64
+ stripeEvent = stripe.webhooks.constructEvent(body, sig, env.STRIPE_WEBHOOK_SECRET);
65
+ } catch (err) {
66
+ logger.warn({ event: 'webhook.signature_invalid', source: 'stripe' });
67
+ return NextResponse.json({ error: 'invalid signature' }, { status: 401 });
68
+ }
69
+
70
+ // 2. Idempotency — Stripe's event.id is globally unique
71
+ const inboxKey = `stripe:${stripeEvent.id}`;
72
+ const inserted = await db
73
+ .insert(webhookInbox)
74
+ .values({ key: inboxKey, source: 'stripe', eventType: stripeEvent.type, payload: stripeEvent })
75
+ .onConflictDoNothing()
76
+ .returning();
77
+
78
+ if (inserted.length === 0) {
79
+ // Already seen — return 2xx to stop Stripe retrying
80
+ logger.info({ event: 'webhook.duplicate', source: 'stripe', eventId: stripeEvent.id });
81
+ return NextResponse.json({ ok: true, duplicate: true });
82
+ }
83
+
84
+ // 3. Re-validate with our schema
85
+ const event = EventSchema.parse(stripeEvent);
86
+
87
+ // 4. Service call — pure dispatch
88
+ logger.info({ event: 'webhook.received', source: 'stripe', type: event.type, eventId: event.id });
89
+ try {
90
+ await handleStripeEvent(event);
91
+ await db.update(webhookInbox).set({ committedAt: new Date() }).where(eq(webhookInbox.key, inboxKey));
92
+ // 5. Ack
93
+ return NextResponse.json({ ok: true });
94
+ } catch (err) {
95
+ Sentry.captureException(err, { tags: { webhook: 'stripe', eventType: event.type } });
96
+ // Retryable: return 5xx so Stripe retries with backoff
97
+ return NextResponse.json({ ok: false }, { status: 500 });
98
+ }
99
+ }
100
+ ```
101
+
102
+ The 5 layers are explicit. No wrapper is required. If your project ships its own `withWebhookSafety` helper that bundles these 5, that's a convenience — but the pattern is the substance, and it's the same.
103
+
104
+ ## Per-source notes
105
+
106
+ ### Stripe
107
+
108
+ - Signature: `stripe-signature` header → `stripe.webhooks.constructEvent`
109
+ - Idempotency: `event.id` is the canonical key
110
+ - Retry: Stripe retries failed webhooks with exponential backoff for up to 3 days
111
+ - Test mode: separate `STRIPE_WEBHOOK_SECRET_TEST` env var
112
+
113
+ ### Resend (via svix)
114
+
115
+ - Signature: `svix-id`, `svix-timestamp`, `svix-signature` headers → `new Webhook(secret).verify(body, headers)` from `svix` package
116
+ - Idempotency: `svix-id` header
117
+ - Retry: Svix retries automatically; you only see the first failure if your endpoint returns 5xx
118
+
119
+ ### GitHub
120
+
121
+ - Signature: `x-hub-signature-256` header (HMAC SHA-256 of the body with your secret)
122
+ - Idempotency: `x-github-delivery` header (UUID)
123
+ - Retry: GitHub does NOT auto-retry. If you return 5xx, the event is lost. Make sure dead-letter is robust.
124
+
125
+ ### Custom (internal services calling each other)
126
+
127
+ - Signature: HMAC SHA-256 with a shared secret. Use Node's `crypto.timingSafeEqual` for the compare (constant-time, no early-exit on mismatch).
128
+ - Idempotency: caller-generated UUID v7 in `x-idempotency-key`
129
+ - Retry: caller's responsibility; receiver acknowledges with 2xx + the key it already saw
130
+
131
+ ## Inbox table
132
+
133
+ The idempotency check needs persistent storage:
134
+
135
+ ```sql
136
+ CREATE TABLE webhook_inbox (
137
+ key text PRIMARY KEY, -- e.g., "stripe:evt_xxx"
138
+ source text NOT NULL,
139
+ event_type text NOT NULL,
140
+ received_at timestamptz NOT NULL DEFAULT now(),
141
+ committed_at timestamptz,
142
+ payload jsonb NOT NULL
143
+ );
144
+ CREATE INDEX idx_webhook_inbox_received ON webhook_inbox (received_at);
145
+ ```
146
+
147
+ Migration follows the safe-migration pattern (see `void-drizzle-migration-safe` skill).
148
+
149
+ ## Dead-letter routing
150
+
151
+ When the handler decides the error is permanent (validation failure, downstream API said 4xx):
152
+
153
+ ```ts
154
+ catch (err) {
155
+ if (isPermanentFailure(err)) {
156
+ await db.insert(webhookDeadLetter).values({
157
+ key: inboxKey,
158
+ source: 'stripe',
159
+ error: err.message,
160
+ payload: event,
161
+ receivedAt: new Date(),
162
+ });
163
+ return NextResponse.json({ ok: false, retry: false }, { status: 400 });
164
+ // 4xx tells Stripe "permanent — stop retrying"
165
+ }
166
+ throw err; // retryable — let the 5xx propagate
167
+ }
168
+ ```
169
+
170
+ Dead letter = a queue/table the team reviews. UI: `Settings → Webhook DLQ`. Never silently drop.
171
+
172
+ ## Error response codes
173
+
174
+ | Code | Means | Sender behavior |
175
+ |---|---|---|
176
+ | 200/202 | Accepted | Stops retrying |
177
+ | 401 | Invalid signature | Stops retrying (Stripe, GitHub will flag the endpoint) |
178
+ | 4xx (other) | Permanent failure (bad event shape) | Stops retrying — log this for investigation |
179
+ | 5xx | Transient failure | Retries with backoff (Stripe/Svix); GitHub doesn't retry |
180
+
181
+ NEVER return 200 to a malformed event (you'd accept invalid data). 4xx with a logged DLQ entry is the right pattern.
182
+
183
+ ## Anti-patterns
184
+
185
+ - ✗ **No signature verification** — anyone with the URL can forge events
186
+ - ✗ **Idempotency key = `Date.now()`** — re-delivery NOT detected; double-charges
187
+ - ✗ **Calling services synchronously for slow work** — if the handler takes > 10s, the sender retries. Enqueue background jobs for slow work (see `void-background-job-pattern`).
188
+ - ✗ **Returning 5xx to "make sender retry" without enqueueing** — sender's backoff is unpredictable; use your own queue
189
+ - ✗ **One handler for all sources** (`/api/webhooks/route.ts` switching on `source`) — different signatures, different idempotency keys, different retry semantics. One folder per source.
190
+ - ✗ **`==` for HMAC comparison** — use `crypto.timingSafeEqual`. Constant-time compare prevents timing attacks.
191
+
192
+ ## Testing
193
+
194
+ - Unit-test the verifier with a real (sanitized) payload from the source's docs
195
+ - Integration-test by running the handler against a captured event JSON
196
+ - E2E: use Stripe CLI / Svix CLI / ngrok to deliver real webhooks to a dev endpoint
197
+
198
+ ## Composition (informational)
199
+
200
+ - `void-async-safety` — generic retry, idempotency, dead-letter doctrine.
201
+ - `void-server-action` — both cross trust boundaries; same Zod discipline.
202
+ - `void-drizzle-migration-safe` — inbox table migration follows the safe pattern.
203
+ - `void-env-validation` — webhook secrets validated in `@repo/core/env`.
204
+ - `void-observability` — trace context per receive; Sentry breadcrumb.
205
+ - `void-security-guidance` — Zod re-validation IS the trust boundary; HMAC compare with constant-time.
@@ -0,0 +1,14 @@
1
+ # Harness metadata for this skill. Not part of the Agent Skills
2
+ # specification, and never copied into a consumer project: the SKILL.md
3
+ # beside it stays portable and validates against the official six fields.
4
+ # Read by this repository's graph, and by the installer for `runtimes`.
5
+ kind: standard
6
+ owner: folpe
7
+ runtimes: [claude, codex]
8
+ enforcement:
9
+ floor: ci
10
+ inline:
11
+ claude: active
12
+ codex: active
13
+ hermes: ci-only
14
+ eval_targets: [claude/anthropic/opus]
@@ -0,0 +1,95 @@
1
+ schemaVersion: 1
2
+ id: core:quality-floor
3
+ version: 2
4
+ layer: core
5
+ rules:
6
+ - id: core:product
7
+ pass: product
8
+ strength: required
9
+ baseline: false
10
+ appliesWhen:
11
+ any: [product]
12
+ - id: core:architecture
13
+ pass: architecture
14
+ strength: required
15
+ baseline: false
16
+ appliesWhen:
17
+ any: [architecture]
18
+ - id: core:fortress-threat-model
19
+ pass: architecture
20
+ strength: blocking
21
+ baseline: false
22
+ appliesWhen:
23
+ any: [auth, pii, tenancy, destructive-migration, upload, code-execution, llm-tools, supply-chain]
24
+ - id: core:tdd
25
+ pass: tdd
26
+ strength: blocking
27
+ baseline: false
28
+ appliesWhen:
29
+ any: [tdd]
30
+ - id: core:qa
31
+ pass: qa
32
+ strength: required
33
+ baseline: true
34
+ appliesWhen:
35
+ any: [qa]
36
+ - id: core:fortress-critical-verification
37
+ pass: qa
38
+ strength: blocking
39
+ baseline: false
40
+ appliesWhen:
41
+ any: [auth, pii, tenancy, destructive-migration, upload, code-execution, llm-tools, supply-chain]
42
+ - id: core:security
43
+ pass: security
44
+ strength: blocking
45
+ baseline: true
46
+ appliesWhen:
47
+ any: [security]
48
+ - id: core:fortress-adversarial-security
49
+ pass: security
50
+ strength: blocking
51
+ baseline: false
52
+ appliesWhen:
53
+ any: [auth, pii, tenancy, destructive-migration, upload, code-execution, llm-tools, supply-chain]
54
+ - id: core:observability
55
+ pass: observability
56
+ strength: required
57
+ baseline: false
58
+ appliesWhen:
59
+ any: [observability]
60
+ - id: core:migration
61
+ pass: migration
62
+ strength: required
63
+ baseline: false
64
+ appliesWhen:
65
+ any: [migration]
66
+ - id: core:fortress-destructive-recovery
67
+ pass: migration
68
+ strength: blocking
69
+ baseline: false
70
+ appliesWhen:
71
+ any: [destructive-migration]
72
+ - id: core:performance
73
+ pass: performance
74
+ strength: required
75
+ baseline: false
76
+ appliesWhen:
77
+ any: [performance]
78
+ - id: core:stack-patterns
79
+ pass: stack-patterns
80
+ strength: required
81
+ baseline: false
82
+ appliesWhen:
83
+ any: [stack-patterns]
84
+ - id: core:pdf
85
+ pass: pdf
86
+ strength: required
87
+ baseline: false
88
+ appliesWhen:
89
+ any: [pdf]
90
+ - id: core:retrospective
91
+ pass: retrospective
92
+ strength: advisory
93
+ baseline: false
94
+ appliesWhen:
95
+ any: [retrospective]
@@ -0,0 +1,23 @@
1
+ schemaVersion: 1
2
+ id: core:ui-quality
3
+ version: 1
4
+ layer: core
5
+ rules:
6
+ - id: core:ui-tdd
7
+ pass: tdd
8
+ strength: blocking
9
+ baseline: false
10
+ appliesWhen:
11
+ any: [ux-ui, accessibility]
12
+ - id: core:ux-ui
13
+ pass: ux-ui
14
+ strength: blocking
15
+ baseline: false
16
+ appliesWhen:
17
+ any: [ux-ui]
18
+ - id: core:accessibility
19
+ pass: accessibility
20
+ strength: blocking
21
+ baseline: false
22
+ appliesWhen:
23
+ any: [ux-ui, accessibility]
@@ -0,0 +1,29 @@
1
+ schemaVersion: 1
2
+ id: core:base
3
+ version: 1
4
+ name: base
5
+ technologies: []
6
+ detectors:
7
+ always: true
8
+ technologies: []
9
+ files:
10
+ extensions: []
11
+ names: []
12
+ pathSegments: []
13
+ sources:
14
+ - title: void-machine repository
15
+ url: https://github.com/voidcorp-core/void-machine
16
+ reviewedAt: 2026-07-27
17
+ expiresAfterDays: 180
18
+ invariants:
19
+ - Keep changes minimal, testable, reversible, and explicit at trust boundaries.
20
+ - Preserve project conventions unless the mission deliberately changes them.
21
+ patterns:
22
+ - id: universal-change
23
+ appliesWhen:
24
+ technologies: []
25
+ files:
26
+ extensions: []
27
+ names: []
28
+ pathSegments: []
29
+ guidance: Apply the universal safety, verification, and maintainability doctrine.
@@ -0,0 +1,36 @@
1
+ schemaVersion: 1
2
+ id: core:expo-config
3
+ version: 1
4
+ name: expo-config
5
+ technologies:
6
+ - id: expo
7
+ minimumVersion: 52.0.0
8
+ maximumVersionExclusive: 60.0.0
9
+ - id: react-native
10
+ minimumVersion: 0.75.0
11
+ maximumVersionExclusive: 1.0.0
12
+ detectors:
13
+ always: false
14
+ technologies: [expo]
15
+ files:
16
+ extensions: []
17
+ names: [app.json, app.config.js, app.config.ts, eas.json]
18
+ pathSegments: []
19
+ sources:
20
+ - title: Expo documentation
21
+ url: https://docs.expo.dev/
22
+ - title: React Native documentation
23
+ url: https://reactnative.dev/docs/getting-started
24
+ reviewedAt: 2026-07-27
25
+ expiresAfterDays: 90
26
+ invariants:
27
+ - Validate version-specific configuration against the installed tool's official documentation.
28
+ patterns:
29
+ - id: native-config
30
+ appliesWhen:
31
+ technologies: [expo]
32
+ files:
33
+ extensions: []
34
+ names: [app.json, app.config.js, app.config.ts, eas.json]
35
+ pathSegments: []
36
+ guidance: Validate configuration against the covered Expo documentation and rebuild native binaries when required.
@@ -0,0 +1,35 @@
1
+ schemaVersion: 1
2
+ id: core:expo
3
+ version: 2
4
+ name: expo
5
+ technologies:
6
+ - id: expo
7
+ versionIndependent: true
8
+ - id: react-native
9
+ versionIndependent: true
10
+ detectors:
11
+ always: false
12
+ technologies: [expo, react-native]
13
+ files:
14
+ extensions: [.ts, .tsx, .js, .jsx, .json]
15
+ names: [app.json, app.config.js, app.config.ts, eas.json]
16
+ pathSegments: [app, ios, android]
17
+ sources:
18
+ - title: Expo documentation
19
+ url: https://docs.expo.dev/
20
+ - title: React Native documentation
21
+ url: https://reactnative.dev/docs/getting-started
22
+ reviewedAt: 2026-07-27
23
+ expiresAfterDays: 90
24
+ invariants:
25
+ - Verify behavior on the supported native platforms and account for platform-specific capabilities.
26
+ - Treat native configuration changes as build changes, not over-the-air JavaScript updates.
27
+ patterns:
28
+ - id: native-app
29
+ appliesWhen:
30
+ technologies: [expo, react-native]
31
+ files:
32
+ extensions: [.ts, .tsx, .js, .jsx]
33
+ names: []
34
+ pathSegments: [app, ios, android]
35
+ guidance: Verify navigation, permissions, accessibility, keyboard, and device lifecycle states.
@@ -0,0 +1,33 @@
1
+ schemaVersion: 1
2
+ id: core:monorepo
3
+ version: 2
4
+ name: monorepo
5
+ technologies:
6
+ - id: monorepo
7
+ versionIndependent: true
8
+ detectors:
9
+ always: false
10
+ technologies: [monorepo]
11
+ files:
12
+ extensions: [.json, .yaml, .yml, .ts]
13
+ names: [package.json, pnpm-workspace.yaml, turbo.json]
14
+ pathSegments: [apps, packages]
15
+ sources:
16
+ - title: pnpm workspaces documentation
17
+ url: https://pnpm.io/workspaces
18
+ - title: npm workspaces documentation
19
+ url: https://docs.npmjs.com/cli/using-npm/workspaces
20
+ reviewedAt: 2026-07-27
21
+ expiresAfterDays: 180
22
+ invariants:
23
+ - Preserve dependency direction and assign each shared concern a single owner.
24
+ - Test affected packages without hiding failures behind cache or task filtering.
25
+ patterns:
26
+ - id: workspace-boundary
27
+ appliesWhen:
28
+ technologies: [monorepo]
29
+ files:
30
+ extensions: [.json, .yaml, .yml, .ts]
31
+ names: [package.json, pnpm-workspace.yaml, turbo.json]
32
+ pathSegments: [apps, packages]
33
+ guidance: Verify package ownership, dependency direction, and affected task coverage.
@@ -0,0 +1,31 @@
1
+ schemaVersion: 1
2
+ id: core:nextjs-config
3
+ version: 1
4
+ name: nextjs-config
5
+ technologies:
6
+ - id: nextjs
7
+ minimumVersion: 15.0.0
8
+ maximumVersionExclusive: 18.0.0
9
+ detectors:
10
+ always: false
11
+ technologies: [nextjs]
12
+ files:
13
+ extensions: []
14
+ names: [next.config.js, next.config.mjs, next.config.ts]
15
+ pathSegments: []
16
+ sources:
17
+ - title: Next.js documentation
18
+ url: https://nextjs.org/docs
19
+ reviewedAt: 2026-07-27
20
+ expiresAfterDays: 120
21
+ invariants:
22
+ - Validate version-specific configuration against the installed tool's official documentation.
23
+ patterns:
24
+ - id: framework-config
25
+ appliesWhen:
26
+ technologies: [nextjs]
27
+ files:
28
+ extensions: []
29
+ names: [next.config.js, next.config.mjs, next.config.ts]
30
+ pathSegments: []
31
+ guidance: Validate configuration against the covered official Next.js documentation.
@@ -0,0 +1,31 @@
1
+ schemaVersion: 1
2
+ id: core:nextjs
3
+ version: 2
4
+ name: nextjs
5
+ technologies:
6
+ - id: nextjs
7
+ versionIndependent: true
8
+ detectors:
9
+ always: false
10
+ technologies: [nextjs]
11
+ files:
12
+ extensions: [.ts, .tsx, .js, .jsx, .css]
13
+ names: [next.config.js, next.config.mjs, next.config.ts]
14
+ pathSegments: [app, pages]
15
+ sources:
16
+ - title: Next.js documentation
17
+ url: https://nextjs.org/docs
18
+ reviewedAt: 2026-07-27
19
+ expiresAfterDays: 120
20
+ invariants:
21
+ - Make server and client boundaries explicit and minimize client-side JavaScript.
22
+ - Treat caching, revalidation, authorization, and request input as explicit contracts.
23
+ patterns:
24
+ - id: app-router
25
+ appliesWhen:
26
+ technologies: [nextjs]
27
+ files:
28
+ extensions: [.ts, .tsx]
29
+ names: []
30
+ pathSegments: [app]
31
+ guidance: Keep routing and data-flow ownership explicit; verify framework-specific APIs against the installed version.
@@ -0,0 +1,31 @@
1
+ schemaVersion: 1
2
+ id: core:node-server
3
+ version: 2
4
+ name: node-server
5
+ technologies:
6
+ - id: node
7
+ versionIndependent: true
8
+ detectors:
9
+ always: false
10
+ technologies: [node]
11
+ files:
12
+ extensions: [.ts, .mts, .cts, .js, .mjs, .cjs]
13
+ names: [server.ts, server.js]
14
+ pathSegments: [api, server, routes, webhooks]
15
+ sources:
16
+ - title: Node.js documentation
17
+ url: https://nodejs.org/docs/latest/api/
18
+ reviewedAt: 2026-07-27
19
+ expiresAfterDays: 180
20
+ invariants:
21
+ - Validate inputs before domain logic and authorize every protected operation server-side.
22
+ - Bound concurrency, timeouts, retries, request sizes, and resource lifetimes.
23
+ patterns:
24
+ - id: request-boundary
25
+ appliesWhen:
26
+ technologies: [node]
27
+ files:
28
+ extensions: [.ts, .mts, .cts, .js, .mjs, .cjs]
29
+ names: [server.ts, server.js]
30
+ pathSegments: [api, server, routes, webhooks]
31
+ guidance: Keep transport parsing, authentication, authorization, domain logic, and response mapping separate.
@@ -0,0 +1,33 @@
1
+ schemaVersion: 1
2
+ id: core:pwa
3
+ version: 2
4
+ name: pwa
5
+ technologies:
6
+ - id: pwa
7
+ versionIndependent: true
8
+ detectors:
9
+ always: false
10
+ technologies: [pwa]
11
+ files:
12
+ extensions: [.ts, .js, .json, .webmanifest]
13
+ names: [manifest.json, manifest.webmanifest, service-worker.js, service-worker.ts]
14
+ pathSegments: [public]
15
+ sources:
16
+ - title: MDN Progressive web apps
17
+ url: https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps
18
+ - title: web.dev Progressive Web Apps
19
+ url: https://web.dev/learn/pwa/
20
+ reviewedAt: 2026-07-27
21
+ expiresAfterDays: 120
22
+ invariants:
23
+ - Make cache invalidation and offline fallback behavior explicit and testable.
24
+ - Never cache user-specific or security-sensitive responses without a proven policy.
25
+ patterns:
26
+ - id: offline-surface
27
+ appliesWhen:
28
+ technologies: [pwa]
29
+ files:
30
+ extensions: [.ts, .js, .json, .webmanifest]
31
+ names: [manifest.json, manifest.webmanifest, service-worker.js, service-worker.ts]
32
+ pathSegments: [public]
33
+ guidance: Verify installability, update behavior, offline fallback, and cache boundaries.
@@ -0,0 +1,39 @@
1
+ schemaVersion: 1
2
+ id: core:react
3
+ version: 2
4
+ name: react
5
+ technologies:
6
+ - id: react
7
+ versionIndependent: true
8
+ detectors:
9
+ always: false
10
+ technologies: [react]
11
+ files:
12
+ extensions: [.tsx, .jsx, .css]
13
+ names: []
14
+ pathSegments: []
15
+ sources:
16
+ - title: React documentation
17
+ url: https://react.dev/
18
+ reviewedAt: 2026-07-27
19
+ expiresAfterDays: 120
20
+ invariants:
21
+ - Keep rendering pure and derive state instead of synchronizing duplicates.
22
+ - Cover keyboard, focus, loading, empty, error, and success states where applicable.
23
+ patterns:
24
+ - id: component-change
25
+ appliesWhen:
26
+ technologies: [react]
27
+ files:
28
+ extensions: [.tsx, .jsx]
29
+ names: []
30
+ pathSegments: []
31
+ guidance: Test behavior at the user boundary and preserve accessible semantics.
32
+ - id: visual-change
33
+ appliesWhen:
34
+ technologies: [react]
35
+ files:
36
+ extensions: [.css]
37
+ names: []
38
+ pathSegments: []
39
+ guidance: Verify responsive, focus, contrast, and interaction states in a browser.
@@ -0,0 +1,39 @@
1
+ schemaVersion: 1
2
+ id: core:sql
3
+ version: 2
4
+ name: sql
5
+ technologies:
6
+ - id: drizzle
7
+ versionIndependent: true
8
+ - id: prisma
9
+ versionIndependent: true
10
+ - id: postgres
11
+ versionIndependent: true
12
+ detectors:
13
+ always: false
14
+ technologies: [drizzle, prisma, postgres]
15
+ files:
16
+ extensions: [.sql]
17
+ names: [schema.ts, schema.prisma, drizzle.config.ts]
18
+ pathSegments: [migrations]
19
+ sources:
20
+ - title: PostgreSQL documentation
21
+ url: https://www.postgresql.org/docs/current/
22
+ - title: Drizzle ORM documentation
23
+ url: https://orm.drizzle.team/docs/overview
24
+ - title: Prisma documentation
25
+ url: https://www.prisma.io/docs/
26
+ reviewedAt: 2026-07-27
27
+ expiresAfterDays: 120
28
+ invariants:
29
+ - Make schema changes forward-compatible, observable, reversible, and safe under live traffic.
30
+ - Keep constraints and transactions aligned with domain invariants.
31
+ patterns:
32
+ - id: schema-migration
33
+ appliesWhen:
34
+ technologies: [drizzle, prisma, postgres]
35
+ files:
36
+ extensions: [.sql]
37
+ names: [schema.ts, schema.prisma]
38
+ pathSegments: [migrations]
39
+ guidance: Plan expand-migrate-contract sequencing, rollback, backfill, locking, and production observability.