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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 VoidCorp / Florent Pellegrin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,124 @@
1
- # voidmachine
1
+ # `voidmachine`
2
2
 
3
- This name is reserved for [Void Machine](https://github.com/voidcorp-core/void-machine).
4
- Version 0.0.0 installs nothing. The first real release, 4.0.0, is published from CI with
5
- npm provenance.
3
+ CLI for the [void-machine](https://github.com/voidcorp-core/void-machine): register the marketplace, enable the `harness` core plugin plus the stack packs a project needs, and health-check the setup.
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ # In any project: register the marketplace, enable core + the packs you pick,
9
+ # scaffold .void/config.json, and patch CLAUDE.md / AGENTS.md.
10
+ cd my-project
11
+ npx voidmachine init # core only
12
+ npx voidmachine init --pack pack-nextjs --pack pack-monorepo
13
+
14
+ # Verify the setup (offline-friendly)
15
+ npx voidmachine doctor
16
+ ```
17
+
18
+ Pack names accept any form: `pack-nextjs`, `harness-nextjs`, or `nextjs`.
19
+
20
+ ## Commands
21
+
22
+ ### `cheatsheet`
23
+
24
+ Discover shipped skills, hooks, agents, specialist contracts and CLI commands,
25
+ with local installation evidence and invocation details.
26
+
27
+ ```bash
28
+ void-machine cheatsheet > cheatsheet.html
29
+ void-machine cheatsheet --format markdown > cheatsheet.md
30
+ void-machine cheatsheet --format json
31
+ ```
32
+
33
+ HTML is a self-contained offline document with catalogue, availability and intent
34
+ views, composable filters, selectable/copyable invocations and print styling.
35
+ The catalogue remains readable without JavaScript. No server, browser launch,
36
+ installation, status refresh or network request is performed by the command.
37
+
38
+ JSON schema version 1 contains `installation` and stable, sorted `entries` with
39
+ canonical `id`, `type`, `name`, `description`, `pack`, `runtimes`, `invocations`,
40
+ `triggers`, `relatedIds` and per-runtime `availability`. Specialist roles link to
41
+ their agent implementations; they are not two independent capabilities.
42
+ Availability distinguishes `installed`, `absent`, `disabled`, `inactive-pack`,
43
+ `unsupported` and `unknown`, always with a reason. Installed means a receipt-owned
44
+ asset matches, not that runtime execution was verified. No consumer content,
45
+ absolute machine paths or journals are exported. User-global settings and
46
+ marketplace caches are outside the snapshot; missing proof stays unknown.
47
+
48
+ Project Claude `skillOverrides: { "void-tdd": "off" }` is explicit disabled
49
+ evidence; local settings override project settings. Manual-only visibility is
50
+ not disabled. No Codex home configuration is read. Missing hook wiring is
51
+ reported as undeclared rather than inferred from the hook name.
52
+
53
+ Exit codes: `0` exported, `1` invalid/unavailable bundled catalogue, `2` invalid
54
+ arguments. Diagnostics go to stderr; a corrupt local install still exports the
55
+ global catalogue with unknown local availability.
56
+
57
+ ### `init`
58
+
59
+ Sets up the current project:
60
+
61
+ - Creates `.void/config.json` (pinned plugin versions, stack, paths, TDD modes)
62
+ - Registers the marketplace in `.claude/settings.json` and enables `harness` plus the chosen packs
63
+ - Patches `CLAUDE.md` / `AGENTS.md` (sister docs, cross-referenced)
64
+
65
+ ```
66
+ npx voidmachine init [--pack <name>...] [--all-packs] [--force]
67
+ ```
68
+
69
+ After `init`, restart Claude Code; skills appear as `/harness:<name>` and `/void-<pack>:<name>`.
70
+
71
+ ### `add` / `remove`
72
+
73
+ Enable or disable a pack on an already-initialized project (updates `.claude/settings.json` and `.void/config.json`).
74
+
75
+ ```
76
+ npx voidmachine add pack-nextjs
77
+ npx voidmachine remove pack-nextjs
78
+ ```
79
+
80
+ ### `doctor`
81
+
82
+ Health-check: `.void/config.json` validity, marketplace + plugins registered in `.claude/settings.json`, the CLAUDE.md block, `jq` (required by the hooks), and version drift against the marketplace HEAD. `--no-remote` runs fully offline. Exit `0` if all checks pass, `1` otherwise.
83
+
84
+ ```
85
+ npx voidmachine doctor [--no-remote]
86
+ ```
87
+
88
+ ### `list` / `check` / `update`
89
+
90
+ `list` shows packs and their detection status; `check` reports version drift; `update` refreshes pinned versions.
91
+
92
+ ### `decisions`
93
+
94
+ Creates, validates and projects ADRs without a shared counter or generated
95
+ index. Existing decision directories are preserved; new projects default to
96
+ `docs/decisions/`.
97
+
98
+ ```bash
99
+ npx voidmachine decisions new --title "Use X" --slug use-x
100
+ npx voidmachine decisions check [--base <git-ref>]
101
+ npx voidmachine decisions render --format markdown|json
102
+ ```
103
+
104
+ Accepted decision content is immutable. Reverse it with a new record and
105
+ `--supersedes <adr:id>`. A proven repository-local path substitution is the
106
+ only in-place exception; the new target must exist and the surrounding record
107
+ must remain unchanged. Rendered views expose both declared and effective status
108
+ and identify the records that supersede an older decision.
109
+
110
+ ### `install --global`
111
+
112
+ Escape hatch (rare): installs the `harness` plugin at the user-global level (`~/.claude-plugin/plugins/harness/`) instead of per-project. The recommended flow is `init`.
113
+
114
+ ```
115
+ npx voidmachine install --global [--dry-run]
116
+ ```
117
+
118
+ ### `help`
119
+
120
+ Print the command reference.
121
+
122
+ ## License
123
+
124
+ MIT.
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ // Entry point for the CLI. Every installed command is one of these files, named after the command
3
+ // it serves, so the CLI learns how it was invoked from the file name. The typed name never reaches
4
+ // the process: Node resolves the npm bin symlink to this file, and a Windows shim calls it directly.
5
+ import { basename } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { run } from '../dist/main.js';
8
+
9
+ run(basename(fileURLToPath(import.meta.url), '.mjs'), process.argv.slice(2)).catch((err) => {
10
+ console.error(err?.message ?? err);
11
+ process.exit(1);
12
+ });
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ // Entry point for the CLI. Every installed command is one of these files, named after the command
3
+ // it serves, so the CLI learns how it was invoked from the file name. The typed name never reaches
4
+ // the process: Node resolves the npm bin symlink to this file, and a Windows shim calls it directly.
5
+ import { basename } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { run } from '../dist/main.js';
8
+
9
+ run(basename(fileURLToPath(import.meta.url), '.mjs'), process.argv.slice(2)).catch((err) => {
10
+ console.error(err?.message ?? err);
11
+ process.exit(1);
12
+ });
@@ -0,0 +1,253 @@
1
+ {
2
+ "name": "harness",
3
+ "version": "4.0.0",
4
+ "description": "VoidCorp universal craftsman skills (void-tdd, void-typescript-strict, void-hexagonal-architecture, void-domain-driven-design, void-functional, void-code-review, void-api-and-interface-design, void-source-driven-development, void-context, void-learn, void-decide, void-claude-md, void-observability, void-security-guidance, ...) plus 12 PreToolUse enforcement hooks (tdd-guard, no-any, protect-sensitive-files, block-dangerous-bash, no-ai-design-slop, ...) and PostToolUse/SessionStart lifecycle hooks (incl. trim-large-output token frugality), five read-only critics including doctrine-critic, native architecture/security/QA specialists, and the void-graph, void-doctor and void-audit gestures, which are skills like everything else.",
5
+ "author": {
6
+ "name": "VoidCorp",
7
+ "email": "florent.pellegrin@voidcorp.io"
8
+ },
9
+ "homepage": "https://github.com/voidcorp-core/void-machine",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "voidcorp",
13
+ "craftsman",
14
+ "tdd",
15
+ "tigerstyle",
16
+ "harness"
17
+ ],
18
+ "hooks": {
19
+ "PreToolUse": [
20
+ {
21
+ "matcher": "Edit|Write",
22
+ "hooks": [
23
+ {
24
+ "type": "command",
25
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce tdd-order claude"
26
+ }
27
+ ]
28
+ },
29
+ {
30
+ "matcher": "Edit|Write",
31
+ "hooks": [
32
+ {
33
+ "type": "command",
34
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce no-any claude"
35
+ }
36
+ ]
37
+ },
38
+ {
39
+ "matcher": "Edit|Write",
40
+ "hooks": [
41
+ {
42
+ "type": "command",
43
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce no-as-cast claude"
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ "matcher": "Edit|Write",
49
+ "hooks": [
50
+ {
51
+ "type": "command",
52
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce no-console claude"
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ "matcher": "Edit|Write",
58
+ "hooks": [
59
+ {
60
+ "type": "command",
61
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce no-null claude"
62
+ }
63
+ ]
64
+ },
65
+ {
66
+ "matcher": "Edit|Write",
67
+ "hooks": [
68
+ {
69
+ "type": "command",
70
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce control-character claude"
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "matcher": "Edit|Write",
76
+ "hooks": [
77
+ {
78
+ "type": "command",
79
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce no-focused-test claude"
80
+ }
81
+ ]
82
+ },
83
+ {
84
+ "matcher": "Edit|Write",
85
+ "hooks": [
86
+ {
87
+ "type": "command",
88
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce boundary-direction claude"
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "matcher": "Edit|Write",
94
+ "hooks": [
95
+ {
96
+ "type": "command",
97
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce test-name claude"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "matcher": "Edit|Write",
103
+ "hooks": [
104
+ {
105
+ "type": "command",
106
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce protected-file claude"
107
+ }
108
+ ]
109
+ },
110
+ {
111
+ "matcher": "Bash",
112
+ "hooks": [
113
+ {
114
+ "type": "command",
115
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce dangerous-command claude"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "matcher": "Edit|Write",
121
+ "hooks": [
122
+ {
123
+ "type": "command",
124
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce design-slop claude"
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "matcher": "*",
130
+ "hooks": [
131
+ {
132
+ "type": "command",
133
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" activation claude"
134
+ }
135
+ ]
136
+ },
137
+ {
138
+ "matcher": "Edit|Write",
139
+ "hooks": [
140
+ {
141
+ "type": "command",
142
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" enforce secret-content claude"
143
+ }
144
+ ]
145
+ }
146
+ ],
147
+ "PostToolUse": [
148
+ {
149
+ "matcher": "*",
150
+ "hooks": [
151
+ {
152
+ "type": "command",
153
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle context-continuity claude"
154
+ }
155
+ ]
156
+ },
157
+ {
158
+ "matcher": "Edit|Write",
159
+ "hooks": [
160
+ {
161
+ "type": "command",
162
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle format claude"
163
+ }
164
+ ]
165
+ },
166
+ {
167
+ "matcher": "*",
168
+ "hooks": [
169
+ {
170
+ "type": "command",
171
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle trim claude"
172
+ }
173
+ ]
174
+ },
175
+ {
176
+ "matcher": "*",
177
+ "hooks": [
178
+ {
179
+ "type": "command",
180
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" outcome claude"
181
+ }
182
+ ]
183
+ }
184
+ ],
185
+ "PreCompact": [
186
+ {
187
+ "hooks": [
188
+ {
189
+ "type": "command",
190
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle context-continuity claude"
191
+ }
192
+ ]
193
+ }
194
+ ],
195
+ "SessionStart": [
196
+ {
197
+ "matcher": "startup|resume|clear|compact",
198
+ "hooks": [
199
+ {
200
+ "type": "command",
201
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle context-continuity claude"
202
+ }
203
+ ]
204
+ }
205
+ ],
206
+ "UserPromptSubmit": [
207
+ {
208
+ "hooks": [
209
+ {
210
+ "type": "command",
211
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle context-continuity claude"
212
+ }
213
+ ]
214
+ },
215
+ {
216
+ "hooks": [
217
+ {
218
+ "type": "command",
219
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle checkpoint-reminder claude"
220
+ }
221
+ ]
222
+ }
223
+ ],
224
+ "SessionEnd": [
225
+ {
226
+ "hooks": [
227
+ {
228
+ "type": "command",
229
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle checkpoint-audit claude"
230
+ }
231
+ ]
232
+ }
233
+ ],
234
+ "Stop": [
235
+ {
236
+ "hooks": [
237
+ {
238
+ "type": "command",
239
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" stop claude"
240
+ }
241
+ ]
242
+ },
243
+ {
244
+ "hooks": [
245
+ {
246
+ "type": "command",
247
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/_void-hook.mjs\" lifecycle typecheck claude"
248
+ }
249
+ ]
250
+ }
251
+ ]
252
+ }
253
+ }
File without changes
@@ -0,0 +1,218 @@
1
+ # Philosophy
2
+
3
+ ## Stack assumption
4
+
5
+ The harness assumes **TypeScript + web** as its baseline. The `core/` is *not* truly stack-agnostic: it imposes TS strict, Zod at boundaries, a React/Next mental model for UI concerns, `tsc`-style type checking, and TigerStyle naming adapted for typed languages.
6
+
7
+ Pretending universal agnosticism would dilute the design. A future Rust/Go/Python flavor of the harness would live in a sibling repo (`void-machine-rust`, etc.), reusing the *mechanics* but not the TS-specific skills.
8
+
9
+ `packs/` specialize *within* the TypeScript/web universe (Next.js PWA, monorepo with Bun/Turbo, future mobile React Native, etc.).
10
+
11
+ ## Three pillars
12
+
13
+ Three non-negotiables, in order. **Safety > Performance > Developer Experience.**
14
+
15
+ When two of these collide, the earlier wins. When all three agree, you have an opportunity to find the "super idea" — the simple, elegant move that advances all three simultaneously.
16
+
17
+ ## 1. Safety
18
+
19
+ Code is steel: cheap to change while hot, expensive once it ships. A problem solved in design is 100× cheaper than the same problem solved in production. The harness invests in design discipline upfront so the implementation is dwarfed by the upfront thought.
20
+
21
+ **Operational rules**
22
+
23
+ - Every line of production code is requested by a failing test (Iron Law, in strict mode).
24
+ - Every assertion is paired. Validate at write, validate at read. Boundary checks are doubled.
25
+ - Every external input is schema-validated at the trust boundary (Zod).
26
+ - Functions ≤ 70 lines, lines ≤ 100 cols (TigerStyle limits, physical screen constraint).
27
+ - All loops bounded, all queues bounded, all timeouts explicit. Limit everything.
28
+ - Use explicitly-sized types. No `usize`. In TypeScript: no `any`, no unmotivated `unknown`.
29
+ - All errors handled. The majority of catastrophic production failures come from mishandled non-fatal errors.
30
+
31
+ Sources: TigerStyle (TigerBeetle), NASA Power of Ten, citypaul `tdd-strict-mode`.
32
+
33
+ ## 2. Performance
34
+
35
+ Sketches before code. The best time to win 1000× is in design, when nothing exists to profile. Once code exists, you fight diminishing returns.
36
+
37
+ **Operational rules**
38
+
39
+ - Back-of-the-envelope sketches across the four resources (network, disk, memory, CPU) and the two characteristics (bandwidth, latency) before non-trivial designs.
40
+ - Optimize the slowest resource first, after compensating for frequency of use.
41
+ - Batch over react. The program runs at its own pace.
42
+ - Be predictable. CPU as a sprinter — no zig-zagging through dispatch tables and dynamic dispatch.
43
+ - Distinguish control plane from data plane. Assertions in the control plane stay free.
44
+
45
+ Sources: TigerStyle, Armin Ronacher "Agentic Coding", citypaul performance notes.
46
+
47
+ ## 3. Developer Experience
48
+
49
+ Naming, file layout, and feedback loops are not cosmetics — they are how a system scales beyond its author.
50
+
51
+ **Operational rules**
52
+
53
+ - Get nouns and verbs right. Long-form, snake_case, units as suffixes (`latency_ms_max`, not `max_latency_ms`).
54
+ - Same-length related names line up in source for visual symmetry (`source` and `target`, not `src` and `dest`).
55
+ - "Always say why." Commit messages, comments, ADRs — explain the rationale, not the change.
56
+ - Comments are sentences, with punctuation. Not scribblings.
57
+ - Order matters for readability: important things at the top of a file. Main first. Fields, then types, then methods.
58
+ - No em dashes or emojis as AI-slop filler; both are allowed where they carry meaning (typographic separators in prose, glyphs in code). Not a hard CI gate.
59
+
60
+ Sources: TigerStyle naming, citypaul CLAUDE.md, Folpe quality bar.
61
+
62
+ ## Wing Chun / economy of means
63
+
64
+ Maximum efficiency, minimum motion. Every dependency, every layer, every file earns its place. The harness forbids:
65
+
66
+ - Dependency injection containers (tsyringe, awilix) — earn nothing at solopreneur scale, cost hours of onboarding
67
+ - Explicit CQRS buses — same logic, smaller cost via simple service composition
68
+ - Micro-packages (`@repo/utils`, `@repo/hooks`, `@repo/types`) — kitchen-sink collections of unrelated functions
69
+ - Runtime feature flag services — env vars and build-time activation suffice
70
+ - Hand-rolled accessibility — wrap Radix, do not re-derive ARIA
71
+
72
+ If a credible alternative exists, it is logged as one immutable file under `docs/decisions/` (or the detected equivalent) with the reason it was rejected.
73
+
74
+ Every change is judged against four questions, in this order:
75
+
76
+ - **Subtract before adding.** Ask what existing rule, file, layer or proof can be removed or fused instead of adding one, or why nothing can. A removal is never invented to show one. The smallest sufficient change is the deliverable.
77
+ - **Simplest design that holds (KISS).** No abstraction, option or indirection that the current requirement does not ask for.
78
+ - **One owner per rule (DRY of knowledge, not of text).** A rule, contract or invariant lives in one place and is referenced elsewhere. Two pieces of code that merely look alike are not mutualised by force: shared code is justified by a shared reason to change, never by resemblance.
79
+ - **Strong separation, minimum useful layers.** Each module owns one responsibility behind an explicit boundary. A layer with neither a responsibility nor a boundary of its own is removed; a port or facade that delegates but protects a real boundary is kept.
80
+
81
+ These are judgments, not a metric: no hook or linter decides them, and the harness does not pretend otherwise. The review applies them to the actual change. An explanation (what was removed, which owner holds a rule, which boundary was crossed) is written briefly when it helps understand or record a choice; its absence never blocks on its own. A finding blocks only when it demonstrates a concrete defect: a security flaw, broken behavior, or an architecture violation (a boundary or contract broken with a real consequence). A preference, a hypothetical risk or a possible improvement is advisory: it triggers no new review and no loop.
82
+
83
+ ## "Ultra moderne, exceptionnel" — the Folpe quality bar
84
+
85
+ - Latest stable libs. React 19, Next 16, TS 6, Tailwind 4. Migration cost accepted.
86
+ - No half-built features. Tests, types, error states, loading states, dark mode — all ship together or it does not ship.
87
+ - No "fonctionnel-but-not-exceptionnel." Visual polish, motion, copy, DX are part of the deliverable.
88
+
89
+ A change technically correct but below this bar is pushed back.
90
+
91
+ ## Anti-rustine — only state of the art
92
+
93
+ Before any implementation or fix, read the official documentation of the SDK / framework / tool concerned, for the version the project actually resolves (lockfile), in its most recent revision for that version. The current docs of a newer major are not a license to write against an API the project does not have, and reading them never triggers an upgrade: an upgrade is its own decided change. For internal code, the equivalent sources are the project's own contracts, types, source and docs, read before the first edit. The reading is systematic; the citation is not. A reference is noted briefly where it helps the next reader understand or accept a choice, and a missing citation or trace never blocks on its own.
94
+
95
+ A fix addresses the root cause; a change that only makes the symptom disappear is a patch. A quick patch to make the test pass at the wrong level of abstraction is rejected. The first implementation that comes to mind is often a patch (tokenize a string where the API expects a typed schema, mock a field where the real adapter does not provide it, disable a flag instead of understanding why it blocks). That is a STOP signal: refactor the approach at the right level.
96
+
97
+ A throwaway implementation is not an acceptable initial state. It is debt that has not exploded yet. A V0 mock must mirror the signature of the real adapter cible (Graph API, Dropbox v2, etc.), not a comfort signature.
98
+
99
+ ## Universal hard rules
100
+
101
+ These rules apply to ALL my projects regardless of stack. Project-specific exceptions go in `.void/PROJECT-DOCTRINE.md` with an ADR.
102
+
103
+ - **No `console.log` in committed business code.** Use the project logger (`@repo/core/logger` via `pack-monorepo`). Enforced by `no-console-log-grep` hook + `void-observability` skill.
104
+ - **No em dashes or emojis as AI-slop filler.** Both are allowed where they carry meaning (typographic separators in prose, glyphs in code such as the render layer); just do not sprinkle them decoratively. A taste rule carried by the `void-commit-discipline` skill, deliberately **not** a hard CI gate (DECISIONS.md, 2026-06-01).
105
+ - **No `process.env.*` directly in business code.** Use Zod-validated `@repo/core/env` (`void-security-guidance` skill). This governs the app's OWN secrets; a customer-provided credential (BYO key) is application data — store it encrypted at rest per tenant (master key in env), not in env itself.
106
+ - **Read the official documentation of any third-party tool BEFORE writing its config or wrapping its SDK.** Shortcuts based on assumed semantics produce subtle bugs that take hours to find. (Anti-rustine, formalized.)
107
+ - **Match file naming exactly** per the convention of the active pack (e.g. `Name.tsx`, `Name.helper.ts`, `Name.test.ts`).
108
+ - **No `any` in committed TypeScript.** `unknown` + narrowing is the escape valve. Enforced by `no-any-grep` hook + `void-typescript-strict` skill.
109
+ - **No raw SQL string concatenation.** Parameterized queries via Drizzle. (`void-security-guidance` skill.)
110
+ - **Auth via Better-Auth (or Clerk opt-in).** Never hand-rolled password hashing, session tokens, or CSRF.
111
+ - **Server Actions live in `apps/<app>/src/actions/`** (or framework equivalent). Never in shared packages.
112
+
113
+ Each rule has its enforcement mechanism listed. Rules without enforcement should NOT be added to this file — they belong in `PROJECT-DOCTRINE.md` (project taste) or in a skill (with its own hook).
114
+
115
+ ## Git worktree placement and lifetime
116
+
117
+ This invariant applies to every project using Git worktree, regardless of language,
118
+ framework, editor, terminal or presentation adapter. It does not require a project
119
+ to use worktrees and is independent of the TypeScript/web stack assumption above.
120
+
121
+ - **Emplacement des worktrees** : une worktree de travail vit dans
122
+ `${VOID_WORKTREES:-${XDG_DATA_HOME:-$HOME/.local/share}/git-worktrees}/<dépôt>/<branche>`.
123
+ Elle n'est créée ni dans `/tmp` ni sous un chemin temporaire du système : ces
124
+ répertoires sont purgés au redémarrage et emportent ce qui n'a pas été commité.
125
+ Elle n'est pas créée non plus à l'intérieur du dépôt, fût-ce sous un répertoire
126
+ ignoré : les outils qui parcourent l'arborescence (compilateur, linter, recherche,
127
+ watchers) y voient des doublons du même fichier et rendent des résultats faux.
128
+ - **Réutilisation** : avant de créer, vérifier `git worktree list` : si la branche
129
+ a déjà une worktree, l'utiliser. Deux worktrees sur une même branche sont
130
+ refusées par Git, et la deuxième tentative doit être traitée comme un état
131
+ normal, pas comme une erreur.
132
+ - **Cycle de vie** : la worktree appartient au ticket, pas au run. Elle est retirée
133
+ par `git worktree remove` quand le ticket est mergé, jamais laissée à la purge
134
+ du système. Un run interrompu laisse sa worktree en place : le travail non
135
+ commité y est en sûreté et sera repris.
136
+ - **Indépendance** : aucun chemin ne mentionne un multiplexeur, un éditeur ou un
137
+ outil d'affichage. Ceux-ci découvrent les worktrees par `git worktree list` ;
138
+ ils n'en fixent pas l'emplacement.
139
+ - **Reprise de l'existant** : le projet déplace les worktrees situées hors de cet
140
+ emplacement avec `git worktree move`, jamais en les recréant, ce qui perdrait
141
+ les modifications non commitées. Les références dont le répertoire a disparu
142
+ sont nettoyées avec `git worktree prune`.
143
+ - **Why** : préserver le travail non commité et éviter les doublons dans les
144
+ outils qui parcourent le dépôt.
145
+ - **Enforced by** : planification et cycle de vie des worktrees, inventaire Git et revue ; invariant
146
+ partagé par `void-implement` et `void-autopilot`, sans règle locale à un skill.
147
+ - **Session et présentation** : le cycle de vie d'un agent et de son affichage
148
+ est distinct de celui de sa worktree. Après récupération de son retour et des
149
+ preuves utiles, une session terminée peut libérer sa présentation via
150
+ l'adaptateur disponible. Fermer une session, un terminal, un éditeur ou un
151
+ panneau ne déclenche ni retrait de worktree ni nettoyage global des références.
152
+ - **Stockage** : distinguer le travail durable, les preuves utiles à conserver
153
+ et les fichiers temporaires ou régénérables possédés par la tâche. Libérer de
154
+ l'espace ne justifie jamais la suppression de travail non commité ou d'une
155
+ worktree non mergée. Le nettoyage des fixtures temporaires reste borné à celles
156
+ créées par la tâche, après conservation des preuves nécessaires.
157
+
158
+ ## Mobile-first, dual-quality target
159
+
160
+ Every UI — including web apps that are not primarily mobile — is designed **mobile-first** AND must reach **first-class quality on both mobile and desktop simultaneously**. Not "mobile-first then responsive afterthought." Not "desktop-first then squeeze for mobile." Both experiences are deliverables.
161
+
162
+ Concrete invariants enforced by `void-frontend-design` + `void-accessibility` skills:
163
+
164
+ - Layout designed at 360–390px first, then progressively enhanced to wider viewports — never the reverse
165
+ - Touch targets ≥ 44×44px (Apple HIG) on every interactive element, regardless of viewport
166
+ - Keyboard navigation works on desktop with the same completeness as touch on mobile (focus rings, skip links, escape closes modals)
167
+ - Performance budget enforced for both : LCP < 2.5s on slow 4G mobile + on desktop fiber
168
+ - No mobile-only nor desktop-only feature without an equivalent on the other surface (or an explicit, documented decision)
169
+ - Both viewports are screenshotted in design review (mobile portrait + desktop) before any UI ships
170
+
171
+ Source: Folpe operating principle. Translated into mechanical checks via `void-accessibility`, `void-frontend-design`, and the `pack-react` / `pack-pwa` design-review hooks.
172
+
173
+ ## Harness self-evolution — feedback loop and obsolescence audit (HITL strict)
174
+
175
+ The harness must evolve from real usage in real projects, like citypaul's dotfiles evolves from his daily work. Two complementary mechanisms, both **strict Human-In-The-Loop** (no automatic write into doctrine, ever):
176
+
177
+ ### Inbound — `void-learn` skill, harness-gap branch
178
+
179
+ While coding in any project consuming the harness, when the model (or the user) perceives that something is missing, wrong, or worth a rule:
180
+
181
+ 1. The perception is filed **directly as a GitHub issue** on `voidcorp-core/void-machine` (not captured to a per-project queue). The body carries source-project context: repo, commit SHA, file path, and the motivation. The agent drafts it and confirms with the user before opening it.
182
+ 2. The filing bar is load-bearing: open an issue only when the gap is both *agnostic* (helps any consumer, not just this project) and *harness-worthy* (changes a skill, hook, pack, CLI, or doctrine line). A project-specific rule goes to `.void/PROJECT-DOCTRINE.md` via `void-learn`'s project-rule branch instead. When in doubt, do not file.
183
+ 3. The issue tracker is the triage zone: taking the issue promotes it, closing it declines it — no `proposed/` queue, no `feedback push` step. A promoted issue becomes a void-machine PR carrying the source-project context as motivation. Nothing is merged without human review.
184
+
185
+ ### Outbound — `void-learn` skill, audit branch
186
+
187
+ A recurring auto-evaluation that questions the harness's current surface:
188
+
189
+ 1. Each invocation and outcome writes a redacted canonical event to `.void/machine/runs/<mission-id>/events.jsonl` (local, never shipped); legacy usage logs remain read-only history.
190
+ 2. `void-machine audit` joins declared relations, human activations, outcomes, and cost across hooks, skills, and agents. It repairs telemetry before judging behavior, excludes self-host/smoke missions, and requires twenty human sessions before a retirement review. Upstream-source deprecation and decision-matrix-conflict detection are planned extensions.
191
+ 3. The report **proposes** telemetry repair, failure repair, wiring, tuning/fusion, or retirement review. Nothing is auto-applied. `void-learn` owns the human decision and any resulting PR.
192
+
193
+ ### Why HITL is absolute here
194
+
195
+ Auto-write into the harness's doctrine — even with good signals — would create silent drift, contradictions, and prompt bloat over time. The harness is the foundation; foundations don't shift without deliberate decision. The cost of a human review per change is the price of keeping the doctrine coherent.
196
+
197
+ Source: citypaul's manual curation discipline; Boris Cherny's "compounding engineering" (adapted with the review gate); user's explicit project lead direction (2026-05-29).
198
+
199
+ ## Compound engineering — deliberate capture, NOT auto-write
200
+
201
+ Each session can produce 0–N learnings, **never written automatically to CLAUDE.md or any load-bearing doctrine file**. The per-repo `learnings/proposed/` queue and a `learnings-promote` skill were designed but never built: a markdown queue is a strictly worse reimplementation of the tools that already exist. What actually routes a learning:
202
+
203
+ - **`void-learn`** — the single skill that names the reusable pattern, decides its scope, and runs the matching HITL capture: an end-of-cycle pattern or a stated project rule into `.void/PROJECT-DOCTRINE.md`, or a universal gap **directly as a GitHub issue** on `voidcorp-core/void-machine`.
204
+
205
+ Auto-append into CLAUDE.md was rejected: it creates drift, contradictions, prompt bloat. Doctrine evolves deliberately, not by accretion.
206
+
207
+ Source: Kieran Klaassen (EveryInc/compound-engineering-plugin), Boris Cherny ("how Boris uses Claude Code"). Adapted — not vendored — to add the review gate.
208
+
209
+ ## What this philosophy excludes
210
+
211
+ The harness does **not** govern:
212
+
213
+ - Product strategy or roadmap decisions (a written plan's premise/ambition is reviewed by `void-plan-review`'s CEO lens; a raw idea's demand pressure-test lives in `void-brainstorm`)
214
+ - Visual design system choices (the `DESIGN.md` contract; build via `void-frontend-design`, audit via `void-ui-review`)
215
+ - Live QA of running apps (use `void-qa` through claude-in-chrome)
216
+ - Ship/deploy mechanics (use `void-implement` and `gh`; release-please owns versions)
217
+
218
+ These live elsewhere on purpose. The harness focuses on **how code is conceived, written, tested, and reviewed**.
@@ -0,0 +1,14 @@
1
+ # PROJECT-DOCTRINE.md
2
+
3
+ What is true of **this** project and could not be inferred from the code: its domain vocabulary,
4
+ the trade-offs already settled, the rules it has paid for. Loaded into every session, so write
5
+ only what you want read every time.
6
+
7
+ This file is yours. `void-machine init` creates it, and never overwrites one you have written in.
8
+ Universal rules live in `.void/installed/PHILOSOPHY.md` and belong to the harness.
9
+
10
+ Say a rule out loud — "ajoute la règle…", "always X here", "never Y" — and `void-learn` proposes
11
+ the wording, waits for your yes, then writes it here. Sections appear as you use them.
12
+
13
+ Full format, with the shape of each section:
14
+ https://github.com/voidcorp-core/void-machine/blob/main/docs/PROJECT-DOCTRINE-FORMAT.md