groundwork-method 0.0.1 → 0.11.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 (647) hide show
  1. package/CHANGELOG.md +823 -0
  2. package/LICENSE +21 -0
  3. package/README.md +44 -29
  4. package/bin/groundwork.js +1723 -0
  5. package/dist/src/generators/add-capability/generator.d.ts +8 -0
  6. package/dist/src/generators/add-capability/generator.js +60 -0
  7. package/dist/src/generators/add-capability/generator.js.map +1 -0
  8. package/dist/src/generators/cli-app/generator.d.ts +9 -0
  9. package/dist/src/generators/cli-app/generator.js +140 -0
  10. package/dist/src/generators/cli-app/generator.js.map +1 -0
  11. package/dist/src/generators/docs-site/generator.d.ts +5 -0
  12. package/dist/src/generators/docs-site/generator.js +441 -0
  13. package/dist/src/generators/docs-site/generator.js.map +1 -0
  14. package/dist/src/generators/electron-app/generator.d.ts +6 -0
  15. package/dist/src/generators/electron-app/generator.js +261 -0
  16. package/dist/src/generators/electron-app/generator.js.map +1 -0
  17. package/dist/src/generators/flutter-app/generator.d.ts +6 -0
  18. package/dist/src/generators/flutter-app/generator.js +314 -0
  19. package/dist/src/generators/flutter-app/generator.js.map +1 -0
  20. package/dist/src/generators/go-microservice/generator.d.ts +8 -0
  21. package/dist/src/generators/go-microservice/generator.js +232 -0
  22. package/dist/src/generators/go-microservice/generator.js.map +1 -0
  23. package/dist/src/generators/nextjs-app/generator.d.ts +8 -0
  24. package/dist/src/generators/nextjs-app/generator.js +294 -0
  25. package/dist/src/generators/nextjs-app/generator.js.map +1 -0
  26. package/dist/src/generators/python-microservice/generator.d.ts +13 -0
  27. package/dist/src/generators/python-microservice/generator.js +265 -0
  28. package/dist/src/generators/python-microservice/generator.js.map +1 -0
  29. package/dist/src/generators/shared/brand-tokens.d.ts +89 -0
  30. package/dist/src/generators/shared/brand-tokens.js +308 -0
  31. package/dist/src/generators/shared/brand-tokens.js.map +1 -0
  32. package/dist/src/generators/shared/capabilities.d.ts +101 -0
  33. package/dist/src/generators/shared/capabilities.js +279 -0
  34. package/dist/src/generators/shared/capabilities.js.map +1 -0
  35. package/dist/src/generators/shared/provenance.d.ts +2 -0
  36. package/dist/src/generators/shared/provenance.js +85 -0
  37. package/dist/src/generators/shared/provenance.js.map +1 -0
  38. package/dist/src/generators/shared/scaffold-helpers.d.ts +72 -0
  39. package/dist/src/generators/shared/scaffold-helpers.js +309 -0
  40. package/dist/src/generators/shared/scaffold-helpers.js.map +1 -0
  41. package/dist/src/generators/system-test-runner/generator.d.ts +23 -0
  42. package/dist/src/generators/system-test-runner/generator.js +173 -0
  43. package/dist/src/generators/system-test-runner/generator.js.map +1 -0
  44. package/dist/src/generators/workspace-dev-cli/generator.d.ts +7 -0
  45. package/dist/src/generators/workspace-dev-cli/generator.js +138 -0
  46. package/dist/src/generators/workspace-dev-cli/generator.js.map +1 -0
  47. package/generators.json +57 -0
  48. package/lib/repo-map/grammars/tree-sitter-c.wasm +0 -0
  49. package/lib/repo-map/grammars/tree-sitter-cpp.wasm +0 -0
  50. package/lib/repo-map/grammars/tree-sitter-csharp.wasm +0 -0
  51. package/lib/repo-map/grammars/tree-sitter-dart.wasm +0 -0
  52. package/lib/repo-map/grammars/tree-sitter-go.wasm +0 -0
  53. package/lib/repo-map/grammars/tree-sitter-java.wasm +0 -0
  54. package/lib/repo-map/grammars/tree-sitter-javascript.wasm +0 -0
  55. package/lib/repo-map/grammars/tree-sitter-kotlin.wasm +0 -0
  56. package/lib/repo-map/grammars/tree-sitter-lua.wasm +0 -0
  57. package/lib/repo-map/grammars/tree-sitter-php.wasm +0 -0
  58. package/lib/repo-map/grammars/tree-sitter-python.wasm +0 -0
  59. package/lib/repo-map/grammars/tree-sitter-ruby.wasm +0 -0
  60. package/lib/repo-map/grammars/tree-sitter-rust.wasm +0 -0
  61. package/lib/repo-map/grammars/tree-sitter-scala.wasm +0 -0
  62. package/lib/repo-map/grammars/tree-sitter-swift.wasm +0 -0
  63. package/lib/repo-map/grammars/tree-sitter-tsx.wasm +0 -0
  64. package/lib/repo-map/grammars/tree-sitter-typescript.wasm +0 -0
  65. package/lib/repo-map/index.js +386 -0
  66. package/lib/repo-map/languages.js +514 -0
  67. package/lib/repo-map/pagerank.js +59 -0
  68. package/migrations/README.md +60 -0
  69. package/migrations/_template/cli-migration.js +27 -0
  70. package/migrations/gw-bet-prose-redesign.js +105 -0
  71. package/migrations/gw-drop-test-manifest.js +37 -0
  72. package/migrations/gw-register-serena-mcp.js +42 -0
  73. package/migrations/gw-relocate-hidden-skills.js +40 -0
  74. package/migrations/gw-seed-config-toml.js +24 -0
  75. package/migrations/index.json +40 -0
  76. package/package.json +70 -6
  77. package/src/AGENTS.md +36 -0
  78. package/src/config/config.toml +30 -0
  79. package/src/config/groundwork-state.json +5 -0
  80. package/src/docs/llms.txt +72 -0
  81. package/src/docs/principles/ai-native/agent-native-systems.md +90 -0
  82. package/src/docs/principles/ai-native/agentic-systems.md +78 -0
  83. package/src/docs/principles/ai-native/ai-engineering.md +100 -0
  84. package/src/docs/principles/ai-native/ai-native-product.md +76 -0
  85. package/src/docs/principles/delivery/cost-engineering.md +89 -0
  86. package/src/docs/principles/delivery/day-2-operational-baseline.md +57 -0
  87. package/src/docs/principles/delivery/devex.md +88 -0
  88. package/src/docs/principles/delivery/platform.md +101 -0
  89. package/src/docs/principles/delivery/progressive-delivery.md +92 -0
  90. package/src/docs/principles/design/ai-native-design.md +73 -0
  91. package/src/docs/principles/design/design-foundations.md +80 -0
  92. package/src/docs/principles/design/design-systems-and-tokens.md +72 -0
  93. package/src/docs/principles/design/interaction-and-motion.md +69 -0
  94. package/src/docs/principles/design/layout-and-space.md +72 -0
  95. package/src/docs/principles/design/usability-and-ux.md +79 -0
  96. package/src/docs/principles/design/visual-design.md +84 -0
  97. package/src/docs/principles/foundations/code-craft.md +86 -0
  98. package/src/docs/principles/foundations/continuous-discovery.md +75 -0
  99. package/src/docs/principles/foundations/documentation.md +102 -0
  100. package/src/docs/principles/foundations/prioritization-and-appetite.md +78 -0
  101. package/src/docs/principles/foundations/product-engineering.md +90 -0
  102. package/src/docs/principles/foundations/product-risks.md +89 -0
  103. package/src/docs/principles/foundations/requirements-and-specs.md +80 -0
  104. package/src/docs/principles/foundations/success-metrics.md +66 -0
  105. package/src/docs/principles/foundations/testing.md +108 -0
  106. package/src/docs/principles/index.md +24 -0
  107. package/src/docs/principles/quality/accessibility.md +88 -0
  108. package/src/docs/principles/quality/observability.md +84 -0
  109. package/src/docs/principles/quality/performance.md +84 -0
  110. package/src/docs/principles/quality/privacy.md +92 -0
  111. package/src/docs/principles/quality/reliability.md +89 -0
  112. package/src/docs/principles/quality/security.md +78 -0
  113. package/src/docs/principles/stack/postgres.md +100 -0
  114. package/src/docs/principles/system-design/api-design.md +86 -0
  115. package/src/docs/principles/system-design/architecture-decisions.md +81 -0
  116. package/src/docs/principles/system-design/code-structure.md +104 -0
  117. package/src/docs/principles/system-design/data-engineering.md +87 -0
  118. package/src/docs/principles/system-design/durable-execution.md +89 -0
  119. package/src/docs/principles/system-design/evolutionary-architecture.md +81 -0
  120. package/src/docs/principles/system-design/identity-and-access.md +76 -0
  121. package/src/docs/principles/system-design/integration-patterns.md +84 -0
  122. package/src/docs/principles/system-design/real-time.md +83 -0
  123. package/src/docs/principles/system-design/surface-architecture.md +74 -0
  124. package/src/docs/ways-of-working/documentation.md +69 -0
  125. package/src/docs/ways-of-working/how-we-work.md +76 -0
  126. package/src/docs/ways-of-working/units-of-work.md +40 -0
  127. package/src/engineer-skills/groundwork-electron-engineer/SKILL.md +123 -0
  128. package/src/engineer-skills/groundwork-electron-engineer/references/documentation.md +126 -0
  129. package/src/engineer-skills/groundwork-electron-engineer/references/ipc-contracts.md +138 -0
  130. package/src/engineer-skills/groundwork-electron-engineer/references/observability.md +37 -0
  131. package/src/engineer-skills/groundwork-electron-engineer/references/packaging-and-updates.md +82 -0
  132. package/src/engineer-skills/groundwork-electron-engineer/references/performance-and-reliability.md +80 -0
  133. package/src/engineer-skills/groundwork-electron-engineer/references/process-model.md +94 -0
  134. package/src/engineer-skills/groundwork-electron-engineer/references/security.md +107 -0
  135. package/src/engineer-skills/groundwork-electron-engineer/references/testing-and-smoke.md +129 -0
  136. package/src/engineer-skills/groundwork-electron-engineer/references/theming-and-tokens.md +74 -0
  137. package/src/engineer-skills/groundwork-electron-engineer/sync-anchor.md +22 -0
  138. package/src/engineer-skills/groundwork-flutter-engineer/SKILL.md +114 -0
  139. package/src/engineer-skills/groundwork-flutter-engineer/references/accessibility.md +92 -0
  140. package/src/engineer-skills/groundwork-flutter-engineer/references/architecture.md +189 -0
  141. package/src/engineer-skills/groundwork-flutter-engineer/references/data-and-contracts.md +136 -0
  142. package/src/engineer-skills/groundwork-flutter-engineer/references/documentation.md +122 -0
  143. package/src/engineer-skills/groundwork-flutter-engineer/references/navigation.md +122 -0
  144. package/src/engineer-skills/groundwork-flutter-engineer/references/observability.md +37 -0
  145. package/src/engineer-skills/groundwork-flutter-engineer/references/performance-and-reliability.md +100 -0
  146. package/src/engineer-skills/groundwork-flutter-engineer/references/platform-channels.md +93 -0
  147. package/src/engineer-skills/groundwork-flutter-engineer/references/releases-and-distribution.md +84 -0
  148. package/src/engineer-skills/groundwork-flutter-engineer/references/security.md +96 -0
  149. package/src/engineer-skills/groundwork-flutter-engineer/references/state-management.md +166 -0
  150. package/src/engineer-skills/groundwork-flutter-engineer/references/testing.md +160 -0
  151. package/src/engineer-skills/groundwork-flutter-engineer/references/theming-and-design-tokens.md +109 -0
  152. package/src/engineer-skills/groundwork-flutter-engineer/references/widgets-and-composition.md +123 -0
  153. package/src/engineer-skills/groundwork-flutter-engineer/sync-anchor.md +24 -0
  154. package/src/engineer-skills/groundwork-go-engineer/SKILL.md +174 -0
  155. package/src/engineer-skills/groundwork-go-engineer/references/api-design.md +82 -0
  156. package/src/engineer-skills/groundwork-go-engineer/references/architecture.md +42 -0
  157. package/src/engineer-skills/groundwork-go-engineer/references/capability-ports.md +50 -0
  158. package/src/engineer-skills/groundwork-go-engineer/references/code-craft-security.md +34 -0
  159. package/src/engineer-skills/groundwork-go-engineer/references/concurrency.md +108 -0
  160. package/src/engineer-skills/groundwork-go-engineer/references/documentation.md +130 -0
  161. package/src/engineer-skills/groundwork-go-engineer/references/go-services.md +77 -0
  162. package/src/engineer-skills/groundwork-go-engineer/references/http-handlers.md +172 -0
  163. package/src/engineer-skills/groundwork-go-engineer/references/implementation-patterns.md +156 -0
  164. package/src/engineer-skills/groundwork-go-engineer/references/integration-realtime-data.md +57 -0
  165. package/src/engineer-skills/groundwork-go-engineer/references/observability.md +49 -0
  166. package/src/engineer-skills/groundwork-go-engineer/references/postgres.md +41 -0
  167. package/src/engineer-skills/groundwork-go-engineer/references/reliability-performance.md +105 -0
  168. package/src/engineer-skills/groundwork-go-engineer/references/testing.md +201 -0
  169. package/src/engineer-skills/groundwork-go-engineer/sync-anchor.md +20 -0
  170. package/src/engineer-skills/groundwork-nextjs-engineer/SKILL.md +112 -0
  171. package/src/engineer-skills/groundwork-nextjs-engineer/references/accessibility.md +111 -0
  172. package/src/engineer-skills/groundwork-nextjs-engineer/references/architecture.md +323 -0
  173. package/src/engineer-skills/groundwork-nextjs-engineer/references/data-fetching.md +458 -0
  174. package/src/engineer-skills/groundwork-nextjs-engineer/references/documentation.md +324 -0
  175. package/src/engineer-skills/groundwork-nextjs-engineer/references/error-boundaries.md +383 -0
  176. package/src/engineer-skills/groundwork-nextjs-engineer/references/mutations-and-forms.md +396 -0
  177. package/src/engineer-skills/groundwork-nextjs-engineer/references/observability.md +48 -0
  178. package/src/engineer-skills/groundwork-nextjs-engineer/references/performance-and-deployment.md +947 -0
  179. package/src/engineer-skills/groundwork-nextjs-engineer/references/routing-and-navigation.md +405 -0
  180. package/src/engineer-skills/groundwork-nextjs-engineer/references/security.md +131 -0
  181. package/src/engineer-skills/groundwork-nextjs-engineer/references/server-components.md +394 -0
  182. package/src/engineer-skills/groundwork-nextjs-engineer/references/tailwind-and-styling.md +134 -0
  183. package/src/engineer-skills/groundwork-nextjs-engineer/references/testing.md +491 -0
  184. package/src/engineer-skills/groundwork-nextjs-engineer/references/type-system.md +368 -0
  185. package/src/engineer-skills/groundwork-nextjs-engineer/references/ux-principles.md +230 -0
  186. package/src/engineer-skills/groundwork-nextjs-engineer/references/visual-language.md +69 -0
  187. package/src/engineer-skills/groundwork-nextjs-engineer/sync-anchor.md +16 -0
  188. package/src/engineer-skills/groundwork-python-engineer/SKILL.md +199 -0
  189. package/src/engineer-skills/groundwork-python-engineer/references/api-standards.md +88 -0
  190. package/src/engineer-skills/groundwork-python-engineer/references/architecture.md +57 -0
  191. package/src/engineer-skills/groundwork-python-engineer/references/async-patterns.md +103 -0
  192. package/src/engineer-skills/groundwork-python-engineer/references/capability-ports.md +44 -0
  193. package/src/engineer-skills/groundwork-python-engineer/references/database.md +88 -0
  194. package/src/engineer-skills/groundwork-python-engineer/references/documentation-mcp.md +167 -0
  195. package/src/engineer-skills/groundwork-python-engineer/references/implementation-patterns.md +166 -0
  196. package/src/engineer-skills/groundwork-python-engineer/references/ml-pipelines.md +119 -0
  197. package/src/engineer-skills/groundwork-python-engineer/references/ml-systems-ai-engineering.md +74 -0
  198. package/src/engineer-skills/groundwork-python-engineer/references/observability.md +57 -0
  199. package/src/engineer-skills/groundwork-python-engineer/references/resilience.md +126 -0
  200. package/src/engineer-skills/groundwork-python-engineer/references/security.md +148 -0
  201. package/src/engineer-skills/groundwork-python-engineer/references/testing.md +216 -0
  202. package/src/engineer-skills/groundwork-python-engineer/sync-anchor.md +20 -0
  203. package/src/generators/add-capability/generator.ts +70 -0
  204. package/src/generators/add-capability/schema.json +30 -0
  205. package/src/generators/capabilities/llm/capability.json +28 -0
  206. package/src/generators/capabilities/llm/providers/anthropic/footprint.json +13 -0
  207. package/src/generators/capabilities/llm/providers/anthropic/stacks/go/internal/llm/llm.go.template +102 -0
  208. package/src/generators/capabilities/llm/providers/anthropic/stacks/python/src/__packageName__/adapters/llm.py.template +61 -0
  209. package/src/generators/capabilities/llm/providers/local/footprint.json +13 -0
  210. package/src/generators/capabilities/llm/providers/local/stacks/go/internal/llm/llm.go.template +102 -0
  211. package/src/generators/capabilities/llm/providers/local/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  212. package/src/generators/capabilities/llm/providers/localai/footprint.json +29 -0
  213. package/src/generators/capabilities/llm/providers/localai/stacks/go/internal/llm/llm.go.template +102 -0
  214. package/src/generators/capabilities/llm/providers/localai/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  215. package/src/generators/capabilities/llm/providers/none/footprint.json +9 -0
  216. package/src/generators/capabilities/llm/providers/none/stacks/go/internal/llm/llm.go.template +35 -0
  217. package/src/generators/capabilities/llm/providers/none/stacks/python/src/__packageName__/adapters/llm.py.template +25 -0
  218. package/src/generators/capabilities/llm/providers/ollama/footprint.json +20 -0
  219. package/src/generators/capabilities/llm/providers/ollama/stacks/go/internal/llm/llm.go.template +102 -0
  220. package/src/generators/capabilities/llm/providers/ollama/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  221. package/src/generators/capabilities/llm/providers/openai/footprint.json +13 -0
  222. package/src/generators/capabilities/llm/providers/openai/stacks/go/internal/llm/llm.go.template +98 -0
  223. package/src/generators/capabilities/llm/providers/openai/stacks/python/src/__packageName__/adapters/llm.py.template +60 -0
  224. package/src/generators/capabilities/llm/stacks/go/internal/core/service/llm.go.template +12 -0
  225. package/src/generators/capabilities/llm/stacks/go/internal/llm/llm_test.go.template +33 -0
  226. package/src/generators/capabilities/llm/stacks/python/src/__packageName__/core/llm.py.template +15 -0
  227. package/src/generators/capabilities/llm/stacks/python/tests/contracts/test_llm.py.template +37 -0
  228. package/src/generators/cli-app/files/README.md.template +76 -0
  229. package/src/generators/cli-app/files/build.mjs.template +15 -0
  230. package/src/generators/cli-app/files/package.json.template +21 -0
  231. package/src/generators/cli-app/files/src/cli.ts.template +67 -0
  232. package/src/generators/cli-app/files/src/commands/hello.ts.template +17 -0
  233. package/src/generators/cli-app/files/src/commands/status.ts.template +23 -0
  234. package/src/generators/cli-app/files/src/core/client.test.ts.template +80 -0
  235. package/src/generators/cli-app/files/src/core/client.ts.template +64 -0
  236. package/src/generators/cli-app/files/src/registry.test.ts.template +35 -0
  237. package/src/generators/cli-app/files/src/registry.ts.template +31 -0
  238. package/src/generators/cli-app/files/tsconfig.json.template +16 -0
  239. package/src/generators/cli-app/files/tsconfig.test.json.template +11 -0
  240. package/src/generators/cli-app/generator.ts +138 -0
  241. package/src/generators/cli-app/schema.json +24 -0
  242. package/src/generators/docs-site/files/.gitignore.ejs +40 -0
  243. package/src/generators/docs-site/files/app/docs/__slug__/page.tsx +101 -0
  244. package/src/generators/docs-site/files/app/docs/layout.tsx +14 -0
  245. package/src/generators/docs-site/files/app/docs.css +43 -0
  246. package/src/generators/docs-site/files/app/layout.tsx +24 -0
  247. package/src/generators/docs-site/files/app/page.tsx +135 -0
  248. package/src/generators/docs-site/files/app/source.ts +8 -0
  249. package/src/generators/docs-site/files/components/mermaid.tsx +67 -0
  250. package/src/generators/docs-site/files/next.config.mjs +10 -0
  251. package/src/generators/docs-site/files/package.json +32 -0
  252. package/src/generators/docs-site/files/pnpm-workspace.yaml +7 -0
  253. package/src/generators/docs-site/files/postcss.config.mjs +6 -0
  254. package/src/generators/docs-site/files/source.config.ts +77 -0
  255. package/src/generators/docs-site/files/tailwind.config.js +10 -0
  256. package/src/generators/docs-site/files/tsconfig.json +27 -0
  257. package/src/generators/docs-site/generator.ts +476 -0
  258. package/src/generators/docs-site/schema.json +17 -0
  259. package/src/generators/electron-app/docs/principles/stack/electron/index.md +49 -0
  260. package/src/generators/electron-app/docs/principles/stack/electron/ipc-contracts.md +71 -0
  261. package/src/generators/electron-app/docs/principles/stack/electron/packaging-and-updates.md +59 -0
  262. package/src/generators/electron-app/docs/principles/stack/electron/process-model.md +53 -0
  263. package/src/generators/electron-app/docs/principles/stack/electron/security.md +70 -0
  264. package/src/generators/electron-app/docs/principles/stack/typescript/frontend.md +65 -0
  265. package/src/generators/electron-app/files/.gitignore.template +20 -0
  266. package/src/generators/electron-app/files/README.md.template +125 -0
  267. package/src/generators/electron-app/files/electron.vite.config.ts +31 -0
  268. package/src/generators/electron-app/files/eslint.config.mjs +92 -0
  269. package/src/generators/electron-app/files/forge.config.ts.template +44 -0
  270. package/src/generators/electron-app/files/package.json.template +54 -0
  271. package/src/generators/electron-app/files/playwright.config.ts +18 -0
  272. package/src/generators/electron-app/files/project.json.template +65 -0
  273. package/src/generators/electron-app/files/src/main/core-client.test.ts +81 -0
  274. package/src/generators/electron-app/files/src/main/core-client.ts +55 -0
  275. package/src/generators/electron-app/files/src/main/index.ts +157 -0
  276. package/src/generators/electron-app/files/src/main/ipc.ts +52 -0
  277. package/src/generators/electron-app/files/src/main/policy.test.ts +71 -0
  278. package/src/generators/electron-app/files/src/main/policy.ts +73 -0
  279. package/src/generators/electron-app/files/src/preload/index.ts +23 -0
  280. package/src/generators/electron-app/files/src/renderer/index.html.template +20 -0
  281. package/src/generators/electron-app/files/src/renderer/src/App.test.tsx +61 -0
  282. package/src/generators/electron-app/files/src/renderer/src/App.tsx.template +43 -0
  283. package/src/generators/electron-app/files/src/renderer/src/assets/main.css +40 -0
  284. package/src/generators/electron-app/files/src/renderer/src/env.d.ts +14 -0
  285. package/src/generators/electron-app/files/src/renderer/src/main.tsx +25 -0
  286. package/src/generators/electron-app/files/src/shared/ipc.ts +54 -0
  287. package/src/generators/electron-app/files/tests/smoke/app.spec.ts.template +133 -0
  288. package/src/generators/electron-app/files/tool/electron_exec.sh.template +83 -0
  289. package/src/generators/electron-app/files/tsconfig.json +7 -0
  290. package/src/generators/electron-app/files/tsconfig.node.json +27 -0
  291. package/src/generators/electron-app/files/tsconfig.web.json +22 -0
  292. package/src/generators/electron-app/files/vitest.config.ts +32 -0
  293. package/src/generators/electron-app/files/vitest.setup.ts +1 -0
  294. package/src/generators/electron-app/generator.ts +288 -0
  295. package/src/generators/electron-app/schema.json +23 -0
  296. package/src/generators/flutter-app/docs/principles/stack/flutter/architecture.md +78 -0
  297. package/src/generators/flutter-app/docs/principles/stack/flutter/index.md +38 -0
  298. package/src/generators/flutter-app/docs/principles/stack/flutter/platform-channels.md +51 -0
  299. package/src/generators/flutter-app/docs/principles/stack/flutter/releases-and-distribution.md +59 -0
  300. package/src/generators/flutter-app/docs/principles/stack/flutter/state-management.md +85 -0
  301. package/src/generators/flutter-app/docs/principles/stack/flutter/testing.md +86 -0
  302. package/src/generators/flutter-app/docs/principles/stack/flutter/widgets-and-composition.md +69 -0
  303. package/src/generators/flutter-app/files/.gitignore.template +30 -0
  304. package/src/generators/flutter-app/files/README.md.template +100 -0
  305. package/src/generators/flutter-app/files/analysis_options.yaml.template +18 -0
  306. package/src/generators/flutter-app/files/integration_test/app_test.dart.template +64 -0
  307. package/src/generators/flutter-app/files/lib/app.dart.template +24 -0
  308. package/src/generators/flutter-app/files/lib/config/app_config.dart +15 -0
  309. package/src/generators/flutter-app/files/lib/data/repositories/status_repository.dart +36 -0
  310. package/src/generators/flutter-app/files/lib/data/services/api_client.dart +71 -0
  311. package/src/generators/flutter-app/files/lib/domain/models/health_status.dart +23 -0
  312. package/src/generators/flutter-app/files/lib/main.dart +11 -0
  313. package/src/generators/flutter-app/files/lib/router.dart +23 -0
  314. package/src/generators/flutter-app/files/lib/ui/core/theme/app_theme.dart +110 -0
  315. package/src/generators/flutter-app/files/lib/ui/home/home_view.dart +89 -0
  316. package/src/generators/flutter-app/files/lib/ui/home/home_view_model.dart.template +38 -0
  317. package/src/generators/flutter-app/files/project.json.template +51 -0
  318. package/src/generators/flutter-app/files/pubspec.yaml.template +47 -0
  319. package/src/generators/flutter-app/files/test/api_client_test.dart.template +63 -0
  320. package/src/generators/flutter-app/files/test/fakes/fake_status_repository.dart.template +19 -0
  321. package/src/generators/flutter-app/files/test/home_view_test.dart.template +58 -0
  322. package/src/generators/flutter-app/files/tool/flutter_exec.sh.template +60 -0
  323. package/src/generators/flutter-app/generator.ts +362 -0
  324. package/src/generators/flutter-app/schema.json +23 -0
  325. package/src/generators/go-microservice/docs/principles/stack/go/concurrency.md +123 -0
  326. package/src/generators/go-microservice/docs/principles/stack/go/index.md +70 -0
  327. package/src/generators/go-microservice/docs/principles/stack/go/testing.md +168 -0
  328. package/src/generators/go-microservice/files/.air.toml.template +38 -0
  329. package/src/generators/go-microservice/files/.env.template +4 -0
  330. package/src/generators/go-microservice/files/.golangci.yml.template +82 -0
  331. package/src/generators/go-microservice/files/Dockerfile.dev.template +12 -0
  332. package/src/generators/go-microservice/files/asyncapi-pubsub.yaml.template +33 -0
  333. package/src/generators/go-microservice/files/asyncapi-ws.yaml.template +34 -0
  334. package/src/generators/go-microservice/files/cmd/api/main.go.template +149 -0
  335. package/src/generators/go-microservice/files/cmd/api/main_test.go.template +99 -0
  336. package/src/generators/go-microservice/files/cmd/worker/cleanup/main.go.template +39 -0
  337. package/src/generators/go-microservice/files/db/schema.sql.template +24 -0
  338. package/src/generators/go-microservice/files/go.mod.template +39 -0
  339. package/src/generators/go-microservice/files/internal/config/config.go.template +52 -0
  340. package/src/generators/go-microservice/files/internal/config/otel.go.template +93 -0
  341. package/src/generators/go-microservice/files/internal/core/domain/errors.go.template +16 -0
  342. package/src/generators/go-microservice/files/internal/core/domain/model.go.template +28 -0
  343. package/src/generators/go-microservice/files/internal/core/domain/user.go.template +13 -0
  344. package/src/generators/go-microservice/files/internal/core/pagination.go.template +16 -0
  345. package/src/generators/go-microservice/files/internal/core/service/app_service.go.template +79 -0
  346. package/src/generators/go-microservice/files/internal/core/service/event_hub.go.template +9 -0
  347. package/src/generators/go-microservice/files/internal/core/service/message_queue.go.template +10 -0
  348. package/src/generators/go-microservice/files/internal/core/service/outbox_repository.go.template +31 -0
  349. package/src/generators/go-microservice/files/internal/core/service/repository.go.template +23 -0
  350. package/src/generators/go-microservice/files/internal/core/service/user_repository.go.template +15 -0
  351. package/src/generators/go-microservice/files/internal/core/service/user_service.go.template +43 -0
  352. package/src/generators/go-microservice/files/internal/entrypoints/api/app_handler.go.template +108 -0
  353. package/src/generators/go-microservice/files/internal/entrypoints/api/auth_middleware_test.go.template +52 -0
  354. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook.go.template +202 -0
  355. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook_test.go.template +82 -0
  356. package/src/generators/go-microservice/files/internal/entrypoints/api/health_handler.go.template +80 -0
  357. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware.go.template +87 -0
  358. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware_test.go.template +76 -0
  359. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/repository.go.template +37 -0
  360. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_auth.go.template +40 -0
  361. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_loadshed.go.template +38 -0
  362. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_logging.go.template +40 -0
  363. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_ratelimit.go.template +48 -0
  364. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_test.go.template +81 -0
  365. package/src/generators/go-microservice/files/internal/entrypoints/api/router.go.template +105 -0
  366. package/src/generators/go-microservice/files/internal/entrypoints/api/types.go.template +70 -0
  367. package/src/generators/go-microservice/files/internal/entrypoints/api/websocket_handler.go.template +39 -0
  368. package/src/generators/go-microservice/files/internal/httpclient/http_client.go.template +87 -0
  369. package/src/generators/go-microservice/files/internal/kafka/kafka.go.template +34 -0
  370. package/src/generators/go-microservice/files/internal/postgres/postgres.go.template +195 -0
  371. package/src/generators/go-microservice/files/internal/postgres/postgres_test.go.template +156 -0
  372. package/src/generators/go-microservice/files/internal/postgres/user_repository.go.template +56 -0
  373. package/src/generators/go-microservice/files/internal/pubsub/gcp_pubsub.go.template +35 -0
  374. package/src/generators/go-microservice/files/internal/websocket/client.go.template +151 -0
  375. package/src/generators/go-microservice/files/internal/websocket/hub.go.template +261 -0
  376. package/src/generators/go-microservice/files/scripts/apply-schema.sh.template +21 -0
  377. package/src/generators/go-microservice/files/tools/tools.go.template +10 -0
  378. package/src/generators/go-microservice/generator.ts +240 -0
  379. package/src/generators/go-microservice/schema.json +63 -0
  380. package/src/generators/nextjs-app/docs/principles/stack/typescript/frontend.md +65 -0
  381. package/src/generators/nextjs-app/files/.dockerignore.template +7 -0
  382. package/src/generators/nextjs-app/files/.env.example.template +24 -0
  383. package/src/generators/nextjs-app/files/.gitignore.template +5 -0
  384. package/src/generators/nextjs-app/files/Dockerfile +53 -0
  385. package/src/generators/nextjs-app/files/app/(auth)/sign-in/__sign-in__/page.tsx.template +9 -0
  386. package/src/generators/nextjs-app/files/app/(auth)/sign-up/__sign-up__/page.tsx.template +9 -0
  387. package/src/generators/nextjs-app/files/app/api/config/route.ts.template +39 -0
  388. package/src/generators/nextjs-app/files/app/api/healthz/route.test.ts +15 -0
  389. package/src/generators/nextjs-app/files/app/api/healthz/route.ts +5 -0
  390. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.test.ts.template +55 -0
  391. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.ts.template +126 -0
  392. package/src/generators/nextjs-app/files/app/error.tsx +39 -0
  393. package/src/generators/nextjs-app/files/app/global-error.tsx +68 -0
  394. package/src/generators/nextjs-app/files/app/globals.css +105 -0
  395. package/src/generators/nextjs-app/files/app/layout.tsx +59 -0
  396. package/src/generators/nextjs-app/files/app/loading.tsx +13 -0
  397. package/src/generators/nextjs-app/files/app/not-found.tsx +30 -0
  398. package/src/generators/nextjs-app/files/app/page.tsx +20 -0
  399. package/src/generators/nextjs-app/files/components/providers/default.tsx +19 -0
  400. package/src/generators/nextjs-app/files/components/providers/production.tsx +32 -0
  401. package/src/generators/nextjs-app/files/components/providers/telemetry.tsx +76 -0
  402. package/src/generators/nextjs-app/files/components/render-smoke.test.tsx +29 -0
  403. package/src/generators/nextjs-app/files/components/theme-provider.tsx +11 -0
  404. package/src/generators/nextjs-app/files/components.json +21 -0
  405. package/src/generators/nextjs-app/files/eslint.config.mjs +120 -0
  406. package/src/generators/nextjs-app/files/hooks/use-toast.ts +7 -0
  407. package/src/generators/nextjs-app/files/instrumentation.ts +90 -0
  408. package/src/generators/nextjs-app/files/lib/api/fetcher.ts.template +130 -0
  409. package/src/generators/nextjs-app/files/lib/config.ts +21 -0
  410. package/src/generators/nextjs-app/files/lib/logger.ts +29 -0
  411. package/src/generators/nextjs-app/files/lib/schemas/index.ts +19 -0
  412. package/src/generators/nextjs-app/files/lib/utils.ts +6 -0
  413. package/src/generators/nextjs-app/files/next.config.mjs +9 -0
  414. package/src/generators/nextjs-app/files/package.json +70 -0
  415. package/src/generators/nextjs-app/files/postcss.config.mjs +8 -0
  416. package/src/generators/nextjs-app/files/proxy.test.ts.template +30 -0
  417. package/src/generators/nextjs-app/files/proxy.ts +31 -0
  418. package/src/generators/nextjs-app/files/public/.gitkeep +1 -0
  419. package/src/generators/nextjs-app/files/tsconfig.json +42 -0
  420. package/src/generators/nextjs-app/files/vitest.config.mts +15 -0
  421. package/src/generators/nextjs-app/files/vitest.setup.ts +7 -0
  422. package/src/generators/nextjs-app/generator.ts +307 -0
  423. package/src/generators/nextjs-app/schema.json +44 -0
  424. package/src/generators/python-microservice/docs/principles/stack/python/async.md +168 -0
  425. package/src/generators/python-microservice/docs/principles/stack/python/documentation.md +240 -0
  426. package/src/generators/python-microservice/docs/principles/stack/python/mcp.md +147 -0
  427. package/src/generators/python-microservice/docs/principles/stack/python/resilience.md +193 -0
  428. package/src/generators/python-microservice/docs/principles/stack/python/testing.md +322 -0
  429. package/src/generators/python-microservice/files/.env.example.template +30 -0
  430. package/src/generators/python-microservice/files/Dockerfile.template +36 -0
  431. package/src/generators/python-microservice/files/db/schema.sql.template +19 -0
  432. package/src/generators/python-microservice/files/pyproject.toml.template +76 -0
  433. package/src/generators/python-microservice/files/scripts/apply-schema.sh.template +25 -0
  434. package/src/generators/python-microservice/files/src/__packageName__/adapters/comfyui.py.template +87 -0
  435. package/src/generators/python-microservice/files/src/__packageName__/adapters/config.py.template +48 -0
  436. package/src/generators/python-microservice/files/src/__packageName__/adapters/database.py.template +21 -0
  437. package/src/generators/python-microservice/files/src/__packageName__/adapters/message_queue.py.template +29 -0
  438. package/src/generators/python-microservice/files/src/__packageName__/adapters/repository.py.template +130 -0
  439. package/src/generators/python-microservice/files/src/__packageName__/adapters/telemetry.py.template +68 -0
  440. package/src/generators/python-microservice/files/src/__packageName__/adapters/websocket_hub.py.template +36 -0
  441. package/src/generators/python-microservice/files/src/__packageName__/core/domain/entities.py.template +22 -0
  442. package/src/generators/python-microservice/files/src/__packageName__/core/domain/exceptions.py.template +43 -0
  443. package/src/generators/python-microservice/files/src/__packageName__/core/ports.py.template +42 -0
  444. package/src/generators/python-microservice/files/src/__packageName__/core/service/example_service.py.template +68 -0
  445. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/dependencies.py.template +50 -0
  446. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/middleware.py.template +131 -0
  447. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/router.py.template +37 -0
  448. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/websocket_handler.py.template +20 -0
  449. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/cleanup.py.template +35 -0
  450. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/worker.py.template +28 -0
  451. package/src/generators/python-microservice/files/src/__packageName__/main.py.template +108 -0
  452. package/src/generators/python-microservice/files/tests/test_main.py.template +74 -0
  453. package/src/generators/python-microservice/files/tests/test_middleware.py.template +109 -0
  454. package/src/generators/python-microservice/files/tests/test_worker.py.template +16 -0
  455. package/src/generators/python-microservice/generator.ts +286 -0
  456. package/src/generators/python-microservice/schema.json +86 -0
  457. package/src/generators/shared/brand-tokens.ts +301 -0
  458. package/src/generators/shared/capabilities.ts +349 -0
  459. package/src/generators/shared/provenance.ts +61 -0
  460. package/src/generators/shared/scaffold-helpers.ts +309 -0
  461. package/src/generators/system-test-runner/NATIVE-CHECK-CONTRACT.md +20 -0
  462. package/src/generators/system-test-runner/files/tests/bets/.gitkeep +0 -0
  463. package/src/generators/system-test-runner/files/tests/bets/_archive/.gitkeep +0 -0
  464. package/src/generators/system-test-runner/files/tests/conftest.py.template +503 -0
  465. package/src/generators/system-test-runner/files/tests/pyproject.toml.template +20 -0
  466. package/src/generators/system-test-runner/files/tests/system/pages/__init__.py.template +9 -0
  467. package/src/generators/system-test-runner/files/tests/system/pages/base_page.py.template +36 -0
  468. package/src/generators/system-test-runner/files/tests/system/test_a11y_smoke.py.template +132 -0
  469. package/src/generators/system-test-runner/files/tests/system/test_contract_conformance.py.template +140 -0
  470. package/src/generators/system-test-runner/files/tests/system/test_layout_geometry.py.template +109 -0
  471. package/src/generators/system-test-runner/files/tests/system/test_render_smoke.py.template +257 -0
  472. package/src/generators/system-test-runner/files/tests/system/test_system.py.template +158 -0
  473. package/src/generators/system-test-runner/files/tests/system/test_token_conformance.py.template +206 -0
  474. package/src/generators/system-test-runner/files/tests/system/test_visual_regression.py.template +104 -0
  475. package/src/generators/system-test-runner/generator.ts +196 -0
  476. package/src/generators/system-test-runner/schema.json +24 -0
  477. package/src/generators/workspace-dev-cli/cli-src/build.mjs +42 -0
  478. package/src/generators/workspace-dev-cli/cli-src/dist/dev-bundle.js +2168 -0
  479. package/src/generators/workspace-dev-cli/cli-src/src/commands/bet.ts +442 -0
  480. package/src/generators/workspace-dev-cli/cli-src/src/commands/completion.ts +87 -0
  481. package/src/generators/workspace-dev-cli/cli-src/src/commands/doctor.ts +139 -0
  482. package/src/generators/workspace-dev-cli/cli-src/src/commands/lifecycle.ts +548 -0
  483. package/src/generators/workspace-dev-cli/cli-src/src/commands/quality.ts +127 -0
  484. package/src/generators/workspace-dev-cli/cli-src/src/commands/surface.ts +214 -0
  485. package/src/generators/workspace-dev-cli/cli-src/src/index.ts +127 -0
  486. package/src/generators/workspace-dev-cli/cli-src/src/registry.ts +194 -0
  487. package/src/generators/workspace-dev-cli/cli-src/src/theme/color.ts +130 -0
  488. package/src/generators/workspace-dev-cli/cli-src/src/theme/render.ts +158 -0
  489. package/src/generators/workspace-dev-cli/cli-src/src/theme/tokens.ts +122 -0
  490. package/src/generators/workspace-dev-cli/cli-src/src/util/context.ts +43 -0
  491. package/src/generators/workspace-dev-cli/cli-src/src/util/extensions.ts +99 -0
  492. package/src/generators/workspace-dev-cli/cli-src/src/util/paths.ts +46 -0
  493. package/src/generators/workspace-dev-cli/cli-src/src/util/proc.ts +106 -0
  494. package/src/generators/workspace-dev-cli/cli-src/src/util/prompt.ts +108 -0
  495. package/src/generators/workspace-dev-cli/cli-src/src/util/runners.ts +70 -0
  496. package/src/generators/workspace-dev-cli/cli-src/src/util/services.ts +221 -0
  497. package/src/generators/workspace-dev-cli/cli-src/src/util/version.ts +21 -0
  498. package/src/generators/workspace-dev-cli/cli-src/tsconfig.json +16 -0
  499. package/src/generators/workspace-dev-cli/files/.agents/skills/workspace-cli/SKILL.md.template +74 -0
  500. package/src/generators/workspace-dev-cli/files/dev.template +16 -0
  501. package/src/generators/workspace-dev-cli/files/docker-compose.yml.template +20 -0
  502. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/milestone-test.pytmpl.template +46 -0
  503. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/slice-test.pytmpl.template +38 -0
  504. package/src/generators/workspace-dev-cli/generator.ts +136 -0
  505. package/src/generators/workspace-dev-cli/schema.json +22 -0
  506. package/src/hidden-skills/code-intelligence.md +135 -0
  507. package/src/hidden-skills/groundwork-architect/SKILL.md +114 -0
  508. package/src/hidden-skills/groundwork-architect/references/agentic-systems.md +44 -0
  509. package/src/hidden-skills/groundwork-architect/references/ai-native-architecture.md +37 -0
  510. package/src/hidden-skills/groundwork-architect/references/api-and-contracts.md +45 -0
  511. package/src/hidden-skills/groundwork-architect/references/core-and-boundaries.md +45 -0
  512. package/src/hidden-skills/groundwork-architect/references/data-architecture.md +33 -0
  513. package/src/hidden-skills/groundwork-architect/references/decision-records.md +34 -0
  514. package/src/hidden-skills/groundwork-architect/references/durable-execution.md +45 -0
  515. package/src/hidden-skills/groundwork-architect/references/evolutionary-architecture.md +37 -0
  516. package/src/hidden-skills/groundwork-architect/references/identity-and-access.md +41 -0
  517. package/src/hidden-skills/groundwork-architect/references/integration-patterns.md +39 -0
  518. package/src/hidden-skills/groundwork-architect/references/observability.md +36 -0
  519. package/src/hidden-skills/groundwork-architect/references/performance-and-scale.md +41 -0
  520. package/src/hidden-skills/groundwork-architect/references/platform-and-delivery.md +47 -0
  521. package/src/hidden-skills/groundwork-architect/references/realtime-and-async.md +28 -0
  522. package/src/hidden-skills/groundwork-architect/references/reliability.md +31 -0
  523. package/src/hidden-skills/groundwork-architect/references/security-and-trust.md +47 -0
  524. package/src/hidden-skills/groundwork-architect/references/surface-architecture.md +40 -0
  525. package/src/hidden-skills/groundwork-architect/sync-anchor.md +34 -0
  526. package/src/hidden-skills/groundwork-architecture/architecture-template.md +50 -0
  527. package/src/hidden-skills/groundwork-architecture/instructions.md +139 -0
  528. package/src/hidden-skills/groundwork-architecture/phases/01-context-ingestion.md +18 -0
  529. package/src/hidden-skills/groundwork-architecture/phases/02-technical-constraints.md +27 -0
  530. package/src/hidden-skills/groundwork-architecture/phases/03-service-design.md +19 -0
  531. package/src/hidden-skills/groundwork-architecture/phases/04-data-flow-communication.md +23 -0
  532. package/src/hidden-skills/groundwork-architecture/phases/05-component-boundaries-contracts.md +17 -0
  533. package/src/hidden-skills/groundwork-architecture/phases/06-draft-review-present.md +38 -0
  534. package/src/hidden-skills/groundwork-architecture/phases/07-commit.md +33 -0
  535. package/src/hidden-skills/groundwork-architecture/templates/architecture-cache.md +43 -0
  536. package/src/hidden-skills/groundwork-architecture-extract/instructions.md +163 -0
  537. package/src/hidden-skills/groundwork-architecture-extract/templates/architecture-extract-cache.md +21 -0
  538. package/src/hidden-skills/groundwork-bet/briefs/acceptance-auditor.md +68 -0
  539. package/src/hidden-skills/groundwork-bet/briefs/blind-reviewer.md +56 -0
  540. package/src/hidden-skills/groundwork-bet/briefs/coverage-auditor.md +95 -0
  541. package/src/hidden-skills/groundwork-bet/briefs/edge-case-tracer.md +64 -0
  542. package/src/hidden-skills/groundwork-bet/briefs/experience-auditor.md +83 -0
  543. package/src/hidden-skills/groundwork-bet/briefs/slice-worker.md +257 -0
  544. package/src/hidden-skills/groundwork-bet/instructions.md +88 -0
  545. package/src/hidden-skills/groundwork-bet/templates/bet-progress-test.md +115 -0
  546. package/src/hidden-skills/groundwork-bet/templates/change-proposal.md +38 -0
  547. package/src/hidden-skills/groundwork-bet/templates/decomposition/meta.json +4 -0
  548. package/src/hidden-skills/groundwork-bet/templates/decomposition/milestone-index.md +31 -0
  549. package/src/hidden-skills/groundwork-bet/templates/decomposition/slice.md +31 -0
  550. package/src/hidden-skills/groundwork-bet/templates/pitch.md +45 -0
  551. package/src/hidden-skills/groundwork-bet/templates/technical-design/01-ui-design.md +51 -0
  552. package/src/hidden-skills/groundwork-bet/templates/technical-design/02-data-flows.md +36 -0
  553. package/src/hidden-skills/groundwork-bet/templates/technical-design/03-api-design.md +90 -0
  554. package/src/hidden-skills/groundwork-bet/templates/technical-design/04-data-design.md +29 -0
  555. package/src/hidden-skills/groundwork-bet/workflows/01-discovery.md +200 -0
  556. package/src/hidden-skills/groundwork-bet/workflows/02-design.md +178 -0
  557. package/src/hidden-skills/groundwork-bet/workflows/03-decomposition.md +242 -0
  558. package/src/hidden-skills/groundwork-bet/workflows/04-delivery.md +226 -0
  559. package/src/hidden-skills/groundwork-bet/workflows/05-validation.md +210 -0
  560. package/src/hidden-skills/groundwork-design-system/instructions.md +125 -0
  561. package/src/hidden-skills/groundwork-design-system/templates/brand-tokens.md +182 -0
  562. package/src/hidden-skills/groundwork-design-system/templates/design-system-cache.md +64 -0
  563. package/src/hidden-skills/groundwork-design-system/tracks/_foundation.md +136 -0
  564. package/src/hidden-skills/groundwork-design-system/tracks/agentic-protocol.md +269 -0
  565. package/src/hidden-skills/groundwork-design-system/tracks/cli.md +355 -0
  566. package/src/hidden-skills/groundwork-design-system/tracks/graphical-ui.md +330 -0
  567. package/src/hidden-skills/groundwork-design-system-extract/instructions.md +124 -0
  568. package/src/hidden-skills/groundwork-design-system-extract/templates/design-system-extract-cache.md +19 -0
  569. package/src/hidden-skills/groundwork-designer/SKILL.md +108 -0
  570. package/src/hidden-skills/groundwork-designer/references/accessibility.md +33 -0
  571. package/src/hidden-skills/groundwork-designer/references/ai-native-design.md +37 -0
  572. package/src/hidden-skills/groundwork-designer/references/design-review.md +29 -0
  573. package/src/hidden-skills/groundwork-designer/references/design-systems-and-tokens.md +33 -0
  574. package/src/hidden-skills/groundwork-designer/references/interaction-and-motion.md +37 -0
  575. package/src/hidden-skills/groundwork-designer/references/layout-and-space.md +33 -0
  576. package/src/hidden-skills/groundwork-designer/references/usability-and-ux.md +33 -0
  577. package/src/hidden-skills/groundwork-designer/references/visual-craft.md +49 -0
  578. package/src/hidden-skills/groundwork-designer/sync-anchor.md +20 -0
  579. package/src/hidden-skills/groundwork-doc-sync/instructions.md +100 -0
  580. package/src/hidden-skills/groundwork-elicit/instructions.md +66 -0
  581. package/src/hidden-skills/groundwork-elicit/methods.md +65 -0
  582. package/src/hidden-skills/groundwork-infra-adopt/instructions.md +168 -0
  583. package/src/hidden-skills/groundwork-infra-adopt/templates/infra-adopt-cache.md +21 -0
  584. package/src/hidden-skills/groundwork-mvp/instructions.md +223 -0
  585. package/src/hidden-skills/groundwork-mvp/templates/mvp-cache.md +9 -0
  586. package/src/hidden-skills/groundwork-patch/instructions.md +40 -0
  587. package/src/hidden-skills/groundwork-persona/instructions.md +65 -0
  588. package/src/hidden-skills/groundwork-product/SKILL.md +102 -0
  589. package/src/hidden-skills/groundwork-product/references/ai-native-product.md +45 -0
  590. package/src/hidden-skills/groundwork-product/references/discovery-and-opportunity.md +38 -0
  591. package/src/hidden-skills/groundwork-product/references/product-risks.md +52 -0
  592. package/src/hidden-skills/groundwork-product/references/requirements-and-specs.md +39 -0
  593. package/src/hidden-skills/groundwork-product/references/scope-and-sequencing.md +35 -0
  594. package/src/hidden-skills/groundwork-product/references/shaping-and-appetite.md +48 -0
  595. package/src/hidden-skills/groundwork-product/references/success-metrics-and-signals.md +37 -0
  596. package/src/hidden-skills/groundwork-product/sync-anchor.md +19 -0
  597. package/src/hidden-skills/groundwork-product-brief/instructions.md +231 -0
  598. package/src/hidden-skills/groundwork-product-brief-extract/instructions.md +139 -0
  599. package/src/hidden-skills/groundwork-product-brief-extract/templates/product-brief-extract-cache.md +17 -0
  600. package/src/hidden-skills/groundwork-review/checklists/architecture.md +93 -0
  601. package/src/hidden-skills/groundwork-review/checklists/bet-pitch.md +94 -0
  602. package/src/hidden-skills/groundwork-review/checklists/decomposition.md +135 -0
  603. package/src/hidden-skills/groundwork-review/checklists/design-system.md +85 -0
  604. package/src/hidden-skills/groundwork-review/checklists/domain-entity.md +66 -0
  605. package/src/hidden-skills/groundwork-review/checklists/implementation-readiness.md +47 -0
  606. package/src/hidden-skills/groundwork-review/checklists/infrastructure.md +68 -0
  607. package/src/hidden-skills/groundwork-review/checklists/maturity.md +71 -0
  608. package/src/hidden-skills/groundwork-review/checklists/product-brief.md +69 -0
  609. package/src/hidden-skills/groundwork-review/checklists/technical-design.md +112 -0
  610. package/src/hidden-skills/groundwork-review/instructions.md +181 -0
  611. package/src/hidden-skills/groundwork-scaffold/instructions.md +254 -0
  612. package/src/hidden-skills/groundwork-scaffold/phases/01-ingestion-service-mapping.md +87 -0
  613. package/src/hidden-skills/groundwork-scaffold/phases/02-scaffolding-execution.md +15 -0
  614. package/src/hidden-skills/groundwork-scaffold/phases/03-service-documentation-api-stubs.md +100 -0
  615. package/src/hidden-skills/groundwork-scaffold/phases/04-infrastructure-verification.md +17 -0
  616. package/src/hidden-skills/groundwork-scaffold/phases/05-draft-review.md +19 -0
  617. package/src/hidden-skills/groundwork-scaffold/phases/06-commit.md +19 -0
  618. package/src/hidden-skills/groundwork-scaffold/templates/scaffold-cache.md +23 -0
  619. package/src/hidden-skills/groundwork-scan/instructions.md +164 -0
  620. package/src/hidden-skills/groundwork-scan/references/digest-schema.md +66 -0
  621. package/src/hidden-skills/groundwork-scan/references/exclusions.md +44 -0
  622. package/src/hidden-skills/groundwork-scan/templates/architecture-findings.md +42 -0
  623. package/src/hidden-skills/groundwork-scan/templates/design-findings.md +23 -0
  624. package/src/hidden-skills/groundwork-scan/templates/overview.md +26 -0
  625. package/src/hidden-skills/groundwork-scan/templates/product-findings.md +23 -0
  626. package/src/hidden-skills/groundwork-scan/templates/scan-state.json +19 -0
  627. package/src/hidden-skills/groundwork-stack-forge/instructions.md +150 -0
  628. package/src/hidden-skills/groundwork-stack-forge/references/authoring-engineer-skills.md +107 -0
  629. package/src/hidden-skills/groundwork-surface-activation/instructions.md +138 -0
  630. package/src/hidden-skills/groundwork-update/briefs/reconcile-worker.md +196 -0
  631. package/src/hidden-skills/groundwork-update/instructions.md +200 -0
  632. package/src/hidden-skills/groundwork-writer/SKILL.md +278 -0
  633. package/src/hidden-skills/maturity-model.md +125 -0
  634. package/src/hidden-skills/operating-contract.md +400 -0
  635. package/src/hidden-skills/repo-map-schema.md +90 -0
  636. package/src/hidden-skills/templates/adr.md +57 -0
  637. package/src/hidden-skills/templates/capability-ports.md +71 -0
  638. package/src/hidden-skills/templates/discovery-notes.md +33 -0
  639. package/src/hidden-skills/templates/domain-entity.md +80 -0
  640. package/src/hidden-skills/templates/gap-ledger.md +21 -0
  641. package/src/hidden-skills/templates/handoff.md +37 -0
  642. package/src/hidden-skills/templates/maturity.md +39 -0
  643. package/src/hidden-skills/templates/surfaces.md +207 -0
  644. package/src/skills/groundwork-check/SKILL.md +56 -0
  645. package/src/skills/groundwork-check/instructions.md +70 -0
  646. package/src/skills/groundwork-orchestrator/SKILL.md +176 -0
  647. package/src/skills/groundwork-orchestrator/workflow-index.md +50 -0
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Units of Work
3
+ description: How GroundWork structures delivery — Bet, Milestone, and Slice.
4
+ status: active
5
+ last_reviewed: 2026-05-26
6
+ ---
7
+
8
+ # Units of Work
9
+
10
+ GroundWork organises delivery through three nested units — **Bet**, **Milestone**, and **Slice** — each defined by the contract its dependents can rely on. A Bet's appetite holds while scope is designed. A Milestone's capability is provable behind a flag before customers see it. A Slice's API surface is testable before anything consumes it.
11
+
12
+ ## Pitch
13
+
14
+ A Pitch is the shaped plan for solving a problem within an appetite. It contains: a problem statement, a high-level solution sketch, explicit rabbit holes and no-gos, and a falsifiable success signal — the measurable outcome that confirms the bet delivered its intended value. The appetite is an opportunity-cost judgment made before the solution is designed, not a post-design estimate.
15
+
16
+ A Pitch does not contain milestones or slices. Those are derived in Decomposition, after the design is locked in Design Foundations.
17
+
18
+ Multiple Pitches may exist at once. Committing to a Pitch converts it into an active Bet.
19
+
20
+ ## Bet
21
+
22
+ A Bet is the committed execution of a Pitch — active from the moment the team decides to execute through Validation. A Bet operates on a fixed appetite with variable scope: the worth it is bounded to — judged by opportunity cost, not a calendar-time estimate — is set upfront and does not move; scope adjusts to fit what can be delivered within it.
23
+
24
+ Milestones and slices are defined in the Decomposition phase, from the locked technical design. They are not part of the Pitch.
25
+
26
+ ## Milestone
27
+
28
+ A Milestone is a demonstrable state the product reaches within a Bet — visible in the UI and verifiable behind a feature flag, but not yet exposed to customers. Milestones sequence by dependency: a Milestone that requires an earlier one to be complete must declare that dependency explicitly.
29
+
30
+ The Milestone is not a customer release. It is an internal proof point: the capability exists, can be demonstrated, and composes with other Milestones toward a customer-releasable Bet.
31
+
32
+ ## Slice
33
+
34
+ A Slice is a vertical cut through a single tech stack component — a service, a module, or a domain area — that delivers a new capability at that component's API boundary. A Slice spans the full depth of its component (schema, business logic, API surface) and stops there. The component above it — the UI or a downstream service — can consume it once the Slice is complete.
35
+
36
+ The hamburger method defines what "vertical" means in practice: rather than building all schemas across components, then all business logic, then all APIs, each Slice delivers one complete column through a single component's layers. The column is independently testable before anything above it is built.
37
+
38
+ Milestones close when every Slice that contributes to the Milestone's required API surface is complete.
39
+
40
+ **Brownfield systems**: Services in brownfield codebases often own multiple domains or share domain logic across services. A Slice is architecture-agnostic — the definition does not assume one service equals one domain. What matters is that a Slice delivers a testable API-level capability at a component boundary, regardless of how that component's internal responsibilities are structured.
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: groundwork-electron-engineer
3
+ description: >
4
+ Implement, review, and refactor Electron desktop applications using the
5
+ hardened main/preload/renderer process model, typed IPC contracts with
6
+ runtime validation, enforced security defaults, fuse-hardened Forge
7
+ packaging, and Playwright _electron boot smokes. Use for work touching the
8
+ main process, preload bridges, IPC channels, BrowserWindow configuration,
9
+ contextBridge, utilityProcess, auto-update, code signing, desktop packaging,
10
+ nativeTheme, or Electron testing. Make sure to use this skill whenever a
11
+ user is working in an Electron codebase, building desktop shell features,
12
+ fixing desktop app bugs, or reviewing Electron code.
13
+ ---
14
+
15
+ # Electron Engineer
16
+
17
+ Desktop execution engineer for Electron applications. This skill guides implementation within the flagship-app architecture — a privileged main process that only orchestrates, fully sandboxed Node-free renderers behind a narrow typed bridge, security defaults that are baked rather than advisory, and a boot smoke driven by Playwright's `_electron` driver, the agent-closable loop this stack was chosen for.
18
+
19
+ ## Operating Contract
20
+
21
+ 1. Locate the process before editing. Main, preload, renderer, and shared each have distinct responsibilities and their own compiler context; a change that blurs the boundary is wrong even when it works.
22
+ 2. The capability core owns business logic. The renderer is a thin surface adapter, and privileged core access belongs on main's side of the IPC seam — never re-implement a rule the core's contract already proves.
23
+ 3. Route durable desktop policy to the canonical docs (`docs/principles/stack/electron/`) instead of duplicating it in code comments or this skill.
24
+ 4. Verify typecheck (both tsconfigs), lint (including the boundary rules), unit tests, and — for shell-touching changes — the boot smoke before declaring work complete.
25
+
26
+ ## Code intelligence (repo map + Serena)
27
+
28
+ GroundWork gives you a deterministic **repo map** (`npx groundwork-method repo-map` — tree-sitter import edges + PageRank centrality, cached to `.groundwork/cache/repo-map.json`) and the **Serena** MCP server (LSP-backed symbol navigation and editing), registered at init. Orient before reading widely: refresh the map, read its `centrality` ranking to find the hubs, then use Serena to navigate them (`get_symbols_overview` / `find_symbol` / `find_referencing_symbols`) and make reference-aware edits (`replace_symbol_body` / `rename`). Full workflow and the graceful-degradation contract live in `.groundwork/skills/code-intelligence.md`; fall back to ordinary reads and edits when they are unavailable.
29
+
30
+ ## Core Pillars
31
+
32
+ 1. **Main Is an Orchestrator** — Window creation, security policy, IPC registration, OS integration. CPU-heavy or crash-prone work runs in a `utilityProcess` with MessagePorts wired renderer↔utility directly. A blocked main process freezes every window the app has.
33
+
34
+ 2. **The Renderer Is a Web App** — Sandboxed, context-isolated, Node-free; its only platform surface is the preload-exposed `window.api`. Everything it shares with the web stack — component idiom, styling, accessibility — follows the web rules unchanged (see the deferrals below).
35
+
36
+ 3. **IPC Is a Contract Boundary** — One shared channel-map type consumed by both sides; `invoke`/`handle` for two-way; sender validation in every handler and zod validation for non-trivial payloads. The seam gets the same discipline the core enforces at its contracts.
37
+
38
+ 4. **Security Defaults Are Baked** — The hardened quartet, denied-by-default permissions, restricted navigation, allowlisted `openExternal`, custom-protocol content, strict CSP, and package-time fuses. None of these is a hardening backlog item; loosening one is a defect.
39
+
40
+ 5. **The Smoke Closes the Loop** — Playwright `_electron` launches the real built app, drives its window as an ordinary Page, and evaluates in the main process — headless under xvfb in CI. Generate → boot → test → observe, no human in the loop.
41
+
42
+ ## How to Use This Skill
43
+
44
+ **Orient first.** On any non-trivial task, refresh the repo map (`npx groundwork-method repo-map`), read its `centrality` ranking to find the hubs, and navigate them with Serena before reading widely (see Code intelligence above) — this is the first step, not optional; fall back to ordinary reads only when those tools are unavailable. Then match the user's task to the smallest relevant reference set. Most tasks touch one or two references.
45
+
46
+ | Topic | Reference | Load When |
47
+ |-------|-----------|-----------|
48
+ | Process Model | `references/process-model.md` | Placing new code, main vs preload vs renderer vs shared, utilityProcess, the enforced folder boundary. |
49
+ | IPC Contracts | `references/ipc-contracts.md` | Adding or changing channels, the bridge, validation at the seam, TanStack Query over IPC, push events. |
50
+ | Security | `references/security.md` | BrowserWindow options, permissions, navigation, openExternal, CSP, the custom protocol, fuses, Electron upgrades. |
51
+ | Packaging & Updates | `references/packaging-and-updates.md` | Forge config, makers, fuses at package time, code signing, notarization, auto-update routes. |
52
+ | Testing & Smoke | `references/testing-and-smoke.md` | The three test tiers, Playwright `_electron` patterns, xvfb CI, skip-with-reason guards. |
53
+ | Theming & Tokens | `references/theming-and-tokens.md` | The generated brand.css, Tailwind token mapping, nativeTheme sync, dark mode on desktop. |
54
+ | Performance & Reliability | `references/performance-and-reliability.md` | Main never blocks, renderer/bundle perf, IPC batching, long-lived-window memory, cold boot, gateway resilience. |
55
+ | Observability | `references/observability.md` | Two-process crash reporting, structured logs across IPC, app/update telemetry, PII discipline. |
56
+ | Documentation | `references/documentation.md` | The typed IPC contract as documentation, TSDoc on the bridge, process-boundary why-comments. |
57
+
58
+ ## Shared with the web stack — deferrals
59
+
60
+ The renderer is a normal Vite + React web app, and the web stack's rules apply to it unchanged. That knowledge is owned by the Next.js engineer skill (`.agents/skills/groundwork-nextjs-engineer/`, installed alongside any web surface) and by `docs/principles/stack/typescript/frontend.md` (always deployed with this app); it is deliberately **not** duplicated here:
61
+
62
+ - **Component idiom, composition, and visual language** → `groundwork-nextjs-engineer/references/visual-language.md` and `groundwork-nextjs-engineer/references/ux-principles.md`. Skip the App Router / Server Component material — an Electron renderer is fully client-side and has no server boundary.
63
+ - **Tailwind usage and styling discipline** → `groundwork-nextjs-engineer/references/tailwind-and-styling.md`. Only the desktop delta (the generated token file, nativeTheme sync) lives in this skill's `references/theming-and-tokens.md`.
64
+ - **Data-fetching discipline** (cache-layer rules, no fetch-in-useEffect) → `groundwork-nextjs-engineer/references/data-fetching.md`. The transport here is the IPC bridge with TanStack Query instead of SWR over HTTP — that delta is in `references/ipc-contracts.md`.
65
+ - **Accessibility** → `groundwork-nextjs-engineer/references/ux-principles.md` (Accessibility) and `groundwork-nextjs-engineer/references/testing.md` (Accessibility Testing). Desktop changes nothing about it.
66
+ - **Component testing idiom** (Testing Library patterns, what to assert) → `groundwork-nextjs-engineer/references/testing.md`. This skill's testing reference covers only what the shell adds: the process-split test projects and the `_electron` smoke.
67
+
68
+ When the workspace has no web surface, the same canon is available as `docs/principles/stack/typescript/frontend.md` in the project's deployed docs.
69
+
70
+ ## Task Routing
71
+
72
+ - **New capability reaching the shell** → Load `references/ipc-contracts.md`. Contract type first, then handler (validated), then bridge method, then the renderer query.
73
+ - **New window / shell behaviour** → Load `references/process-model.md` and `references/security.md`. The quartet and the policy handlers apply to every window, no exceptions.
74
+ - **Heavy work (parsing, crypto, indexing)** → Load `references/process-model.md`. It goes in a `utilityProcess`, not main.
75
+ - **UI/visual work** → Load `references/theming-and-tokens.md`, then defer to the web stack's styling references. Check the generated token file before adding any colour.
76
+ - **Release/packaging work** → Load `references/packaging-and-updates.md`. Fuses and signing live in the pipeline; signing material never enters the repo.
77
+ - **Test work** → Load `references/testing-and-smoke.md`. Pick the cheapest tier that can carry the assertion; the smoke stays thin.
78
+ - **Electron upgrade** → Load `references/security.md` (currency window). Treat a skipped support window as a security finding.
79
+ - **Performance / responsiveness work** → Load `references/performance-and-reliability.md`. Main never blocks; SLOs and load shedding live in the core.
80
+ - **Crash reporting / telemetry** → Load `references/observability.md`. Both processes report; distributed tracing lives at the services the app calls.
81
+
82
+ ## Safety Gates
83
+
84
+ - Do not loosen the hardened quartet — `contextIsolation: true`, `sandbox: true`, `nodeIntegration: false`, `webSecurity: true` — for any window, flag, or debugging session.
85
+ - Do not expose `ipcRenderer`, any Electron module, or a generic `invoke` passthrough on `window`; the bridge stays narrow and purpose-named.
86
+ - Do not add an IPC handler without sender validation, or accept a non-trivial payload without zod parsing.
87
+ - Do not import Electron or Node built-ins in `src/renderer/` or `src/shared/` — the lint boundary and per-process tsconfigs enforce this; a suppression comment is a review finding.
88
+ - Do not serve app content over `file://` or weaken the CSP to unblock a feature.
89
+ - Do not ship a build whose fuses were not flipped by the packaging pipeline, and do not flip `nodeCliInspect` off — it breaks the Playwright `_electron` loop.
90
+ - Run typecheck, lint, and unit tests where the toolchain is available; report a tier as skipped-with-reason (never silently green) where it is not.
91
+
92
+ ## Hallucination Controls
93
+
94
+ Before presenting Electron guidance as factual:
95
+
96
+ - Check `package.json` for the actual Electron major and available dependencies; the support window moves every 8 weeks.
97
+ - Check `src/shared/ipc.ts` for the real channel map before referencing or inventing channels.
98
+ - Check `src/main/policy.ts` for the actual navigation/permission/external-URL rules before describing the app's security behaviour.
99
+ - Check `electron.vite.config.ts` and `forge.config.ts` for the real build/packaging shape before recommending tooling changes.
100
+ - Label any recommendation based on general Electron knowledge (rather than project-specific patterns) as an inference.
101
+
102
+ ## Output Expectations
103
+
104
+ - Changes name the process each touched file runs in and why the code belongs there.
105
+ - IPC changes show all four pieces: contract type, validated handler, bridge method, renderer consumption.
106
+ - Shell changes state their security impact explicitly, even when it is "none".
107
+ - Verification steps name the specific Nx targets (`typecheck`, `lint`, `test`, `smoke`) with the skipped-with-reason caveat where the binary or display is absent.
108
+ - Recommendations distinguish project conventions from general Electron practice.
109
+
110
+ ## Antipatterns
111
+
112
+ Reject these patterns:
113
+
114
+ - **Node-enabled renderers** — `nodeIntegration: true` also silently kills the sandbox for that renderer; the controls fail as a set.
115
+ - **Raw ipcRenderer on window** — The bridge exists to be narrow; this makes it infinitely wide.
116
+ - **`sendSync`** — Blocks the renderer event loop. There is always an async shape.
117
+ - **Untyped ad-hoc channels** — A channel missing from the shared contract is a seam that drifts silently.
118
+ - **Trusting renderer input in main** — Compile-time types are not runtime guarantees; validate sender and payload.
119
+ - **CPU-heavy work in main** — It freezes every window. `utilityProcess` exists.
120
+ - **Shared folders with runtime code** — `src/shared/` carries types only; shared behaviour leaks Node toward the sandbox.
121
+ - **`webSecurity: false` or CSP wildcards to "unblock" development** — Fix the content, not the boundary.
122
+ - **Un-fused release builds** — Post-CVE-2025-55305, ASAR integrity off is a shipping defect.
123
+ - **Fat smoke suites** — The smoke proves boot and wiring; rules are proven in unit tiers and at the core's contract.
@@ -0,0 +1,126 @@
1
+ # Documentation
2
+
3
+ ## Table of Contents
4
+ - [Hierarchy](#hierarchy)
5
+ - [The Contract Type Is the Surface Documentation](#the-contract-type-is-the-surface-documentation)
6
+ - [TSDoc on the Bridge Contract](#tsdoc-on-the-bridge-contract)
7
+ - [The Process Boundary Documents Itself](#the-process-boundary-documents-itself)
8
+ - [Why-Comments on Security Policy](#why-comments-on-security-policy)
9
+ - [Inline Comments](#inline-comments)
10
+ - [A Comment Is Often a Smell](#a-comment-is-often-a-smell)
11
+ - [In-Code Markers](#in-code-markers)
12
+ - [What NOT to Document](#what-not-to-document)
13
+
14
+ ---
15
+
16
+ A desktop shell has a documentation problem the web app does not: the same TypeScript runs in three processes at three privilege levels, and a reader must know which one a file belongs to before a single line makes sense. The architecture answers that in structure — the folder boundary, the shared contract, the typed bridge — so the documentation is mostly the code's shape, not prose around it.
17
+
18
+ ## Hierarchy
19
+
20
+ Structure documents more reliably than comments. A comment is a promise no compiler checks, and a stale comment about *which process runs this* is worse than none — it misleads about a security boundary. Documentation priority — the foundations principle (`docs/principles/foundations/documentation.md`) written the Electron way:
21
+
22
+ 1. **Types and the shared contract** — `IpcContract`/`RendererApi` in `src/shared/ipc.ts`; a drifted signature is a compile error in both processes (`references/ipc-contracts.md`).
23
+ 2. **The folder boundary** — `main/`, `preload/`, `renderer/`, `shared/` declare where code runs; lint and two tsconfigs enforce it (`references/process-model.md`).
24
+ 3. **Zod schemas at the trust boundary** — runtime-checked validation that documents the accepted payload and flows into errors.
25
+ 4. **Test names** — a smoke or unit test named for its behaviour is executable documentation verified by CI.
26
+ 5. **TSDoc on the bridge and security policy** — written only where types and structure cannot carry the intent.
27
+ 6. **Inline "why" comments** — last resort for a genuinely non-obvious decision.
28
+
29
+ Levels 1–4 are verified by tooling. Levels 5–6 are human promises that drift. Minimise them.
30
+
31
+ ## The Contract Type Is the Surface Documentation
32
+
33
+ `src/shared/ipc.ts` is the single document of what the renderer may ask the privileged side to do. `IpcContract` enumerates every channel; `RendererApi` is the capability surface the UI sees. Read together they are the complete, compiler-verified description of the trust boundary — no prose inventory of "available IPC calls" stays as accurate, because this one fails the build when it lies.
34
+
35
+ ```ts
36
+ // src/shared/ipc.ts — the surface, documented by its types
37
+ export type RendererApi = {
38
+ openProject: (path: string) => Promise<ProjectSummary>;
39
+ onProjectChanged: (cb: () => void) => () => void;
40
+ };
41
+ ```
42
+
43
+ The naming carries the documentation: bridge methods name **capabilities** (`openProject`), never transport (`invoke`, `send`). A method called `invoke` documents nothing about what crosses the seam (`references/ipc-contracts.md`).
44
+
45
+ ## TSDoc on the Bridge Contract
46
+
47
+ Most channels are self-documenting through their contract types. Add TSDoc only where a method carries a consequence the signature cannot — a privileged side effect, a security implication, an OS interaction the caller must understand:
48
+
49
+ ```ts
50
+ export type RendererApi = {
51
+ /**
52
+ * Opens a path in the OS file manager. Main validates it is inside an
53
+ * allowed root before the shell call — a renderer cannot open arbitrary
54
+ * paths. Rejects if the path escapes the sandboxed roots.
55
+ */
56
+ openInFileManager: (path: string) => Promise<void>;
57
+ };
58
+ ```
59
+
60
+ The note documents the trust decision, not the mechanics. A plain `getStatus(): Promise<AppStatus>` needs nothing — the name and return type are the whole contract.
61
+
62
+ ## The Process Boundary Documents Itself
63
+
64
+ The folder a file lives in is its most important documentation: it declares the privilege level and what the file may import (`references/process-model.md`). That boundary is physical and enforced — `no-restricted-imports` fails the build when `renderer/` or `shared/` imports `electron` or a Node built-in, and the two tsconfigs reject a renderer file touching `process` or a main file touching `document`.
65
+
66
+ This is why a comment like `// runs in the renderer, no Node here` is a smell: the folder already says it, the lint already enforces it, and the comment will outlive the file's move to another directory. Trust the structure. When a file's process is genuinely ambiguous, the fix is to move it to the right folder, not to annotate it.
67
+
68
+ `src/shared/` documents a stronger rule by what it contains: types only, no runtime behaviour. A function body in a shared file silently drags Node-flavoured code toward the sandbox — the absence of runtime code there is itself the contract (`references/process-model.md`).
69
+
70
+ ## Why-Comments on Security Policy
71
+
72
+ Security configuration is the one place inline prose earns its keep, because the *reason* a setting holds is invisible in the value and dangerous to guess at. A future reader tempted to loosen a policy must find the threat model next to the line:
73
+
74
+ ```ts
75
+ // sandbox + contextIsolation are non-negotiable: the renderer loads UI
76
+ // that can be XSS'd; without these, an injection reaches Node and the OS.
77
+ webPreferences: { sandbox: true, contextIsolation: true, nodeIntegration: false },
78
+
79
+ // CSP forbids connect-src: the renderer fetches nothing directly — core
80
+ // calls go through main over IPC, which holds the credentials.
81
+ ```
82
+
83
+ Keep `src/main/policy.ts` a pure module so the rules are unit-tested rather than narrated (`references/process-model.md`). The test documents the policy's behaviour; the comment documents only the threat the test cannot express.
84
+
85
+ ## Inline Comments
86
+
87
+ Inline comments explain **why**, never **what**. In a handler, the validation and delegation are visible; the comment captures the reason.
88
+
89
+ ```ts
90
+ ipcMain.handle('project:open', async (event, rawPath: unknown) => {
91
+ assertTrustedSender(event, devServerUrl); // reject navigated-away frames
92
+ const path = openProjectPayload.parse(rawPath);
93
+ return openProject(path);
94
+ });
95
+ ```
96
+
97
+ A comment narrating the obvious is noise — the reader can see the `parse` call.
98
+
99
+ ## A Comment Is Often a Smell
100
+
101
+ When you reach for a comment to explain *what* a block does, the code is asking to be refactored:
102
+
103
+ - A comment naming which process a file runs in → move it to the right folder.
104
+ - A comment explaining a generic `invoke(channel, ...)` passthrough → name the capability; the passthrough is itself an anti-pattern (`references/ipc-contracts.md`).
105
+ - A comment decoding an untyped channel string → add it to `IpcContract`.
106
+ - A comment summarising what a handler does → the handler does too much; delegate to a named function in main.
107
+
108
+ Delete the comment and fix the code. The refactor cannot drift; the comment can.
109
+
110
+ ## In-Code Markers
111
+
112
+ ```ts
113
+ // TODO(bob): move indexing to a utilityProcess once payloads grow. Issue #231.
114
+ // FIXME(carol): unsubscribe leak when a window closes mid-stream. Issue #245.
115
+ // HACK(dave): re-assert CSP after a dev-only HMR reload until upstream fix.
116
+ ```
117
+
118
+ Always include `(username)` and an issue reference. A marker without one will never be resolved.
119
+
120
+ ## What NOT to Document
121
+
122
+ - Channels whose contract type and capability name tell the whole story.
123
+ - Which process a file runs in — the folder and the lint already say it.
124
+ - Boilerplate window construction — the hardened `webPreferences` quartet is the documented standard (`references/process-model.md`), not a per-window note.
125
+ - TanStack Query `queryFn`s that call the typed bridge — the types are the contract.
126
+ - Generated or framework code — never hand-edit comments into it.
@@ -0,0 +1,138 @@
1
+ # IPC Contracts
2
+
3
+ ## Table of Contents
4
+ - [The Seam Is a Contract](#the-seam-is-a-contract)
5
+ - [Adding a Channel End-to-End](#adding-a-channel-end-to-end)
6
+ - [Validation at the Trust Boundary](#validation-at-the-trust-boundary)
7
+ - [Push Channels (Main → Renderer)](#push-channels-main--renderer)
8
+ - [TanStack Query Over the Bridge](#tanstack-query-over-the-bridge)
9
+ - [Core Access for a Hosted Capability Core](#core-access-for-a-hosted-capability-core)
10
+ - [The electron-trpc Variant](#the-electron-trpc-variant)
11
+ - [Anti-Patterns](#anti-patterns)
12
+
13
+ ---
14
+
15
+ ## The Seam Is a Contract
16
+
17
+ The main↔renderer seam gets the same discipline the capability core enforces at its contracts. One module — `src/shared/ipc.ts` — declares every channel; both sides import it; a rename or payload change is a compile error in both processes.
18
+
19
+ ```ts
20
+ // src/shared/ipc.ts (types only)
21
+ export type IpcContract = {
22
+ 'app:get-status': { args: []; result: AppStatus };
23
+ 'shell:open-external': { args: [url: string]; result: OpenExternalResult };
24
+ };
25
+ ```
26
+
27
+ Channel naming: `domain:verb` (`project:open`, `settings:get`, `theme:changed`). The bridge methods name **capabilities** (`getStatus`, `openExternal`), never transport (`invoke`, `send`).
28
+
29
+ `invoke`/`handle` is the two-way pattern — promise-based, errors propagate to the caller. `send`/`on` carries one-way pushes from main. `sendSync` is forbidden: it blocks the renderer event loop for the round trip.
30
+
31
+ ## Adding a Channel End-to-End
32
+
33
+ Four pieces, in this order. A channel missing any of them is incomplete.
34
+
35
+ **1. Contract type** (`src/shared/ipc.ts`):
36
+
37
+ ```ts
38
+ export type ProjectSummary = { path: string; fileCount: number };
39
+
40
+ export type IpcContract = {
41
+ // ...existing channels
42
+ 'project:open': { args: [path: string]; result: ProjectSummary };
43
+ };
44
+
45
+ export type RendererApi = {
46
+ // ...existing methods
47
+ openProject: (path: string) => Promise<ProjectSummary>;
48
+ };
49
+ ```
50
+
51
+ **2. Validated handler** (`src/main/ipc.ts`):
52
+
53
+ ```ts
54
+ const openProjectPayload = z.string().min(1);
55
+
56
+ ipcMain.handle('project:open', async (event, rawPath: unknown): Promise<ProjectSummary> => {
57
+ assertTrustedSender(event, devServerUrl); // every handler
58
+ const projectPath = openProjectPayload.parse(rawPath); // non-trivial payloads
59
+ return openProject(projectPath); // delegate; main orchestrates
60
+ });
61
+ ```
62
+
63
+ **3. Bridge method** (`src/preload/index.ts`):
64
+
65
+ ```ts
66
+ const api: RendererApi = {
67
+ // ...existing methods
68
+ openProject: (path) => ipcRenderer.invoke('project:open', path),
69
+ };
70
+ ```
71
+
72
+ **4. Renderer consumption** — through the cache layer, never a bare effect:
73
+
74
+ ```ts
75
+ const { data } = useQuery({
76
+ queryKey: ['project', path],
77
+ queryFn: () => window.api.openProject(path),
78
+ });
79
+ ```
80
+
81
+ Typing keeps the pieces honest: `RendererApi` is implemented by preload and consumed via the `Window` augmentation in `src/renderer/src/env.d.ts`, so a drifted signature fails both tsconfigs.
82
+
83
+ ## Validation at the Trust Boundary
84
+
85
+ Main treats renderer input as untrusted, the same way an API treats the public internet. Two checks in every handler:
86
+
87
+ - **Sender validation, always.** `assertTrustedSender` verifies `event.senderFrame.url` against the bundle protocol / dev-server origin (security checklist item 17). A destroyed or missing frame is rejected. This is what stops an iframe or a navigated-away window from driving privileged code.
88
+ - **Payload validation with zod for anything beyond a trivial getter.** TypeScript types vanish at runtime; a compromised renderer is not bound by them. `z.string().url()`, `z.object({...}).strict()` — parse, don't trust. A handler taking no arguments (like `app:get-status`) needs only the sender check.
89
+
90
+ Failures throw — `invoke` rejects in the renderer, which is correct: a rejected privileged call is a bug or an attack, not a state to paper over.
91
+
92
+ ## Push Channels (Main → Renderer)
93
+
94
+ One-way events (theme changes, update progress, file-watcher hits) flow as `webContents.send` from main to a **subscription method on the bridge** that returns an unsubscribe function:
95
+
96
+ ```ts
97
+ // preload
98
+ onThemeChanged: (callback) => {
99
+ const listener = (_e: Electron.IpcRendererEvent, theme: ThemeInfo) => callback(theme);
100
+ ipcRenderer.on('theme:changed', listener);
101
+ return () => ipcRenderer.removeListener('theme:changed', listener);
102
+ },
103
+ ```
104
+
105
+ Declare push channels in `IpcPushContract` so they are part of the contract too. The renderer never receives the event object — only the typed payload. Theme is the canonical example: `nativeTheme` in main, broadcast on `updated`, mirrored onto `<html data-theme>` (`references/theming-and-tokens.md`).
106
+
107
+ ## TanStack Query Over the Bridge
108
+
109
+ The renderer's data source is IPC, not HTTP, and TanStack Query is the convergent IPC-aware pattern: `queryFn`s call the typed bridge; caching, retry, and invalidation work exactly as in an HTTP app. This is the desktop shell's one deviation from the web stack's SWR pick — the one-cache-one-mental-model rule still holds: **TanStack Query is the renderer's only query library.**
110
+
111
+ Push events invalidate queries through a bridge subscription:
112
+
113
+ ```ts
114
+ useEffect(() => {
115
+ return window.api.onProjectChanged(() => {
116
+ void queryClient.invalidateQueries({ queryKey: ['project'] });
117
+ });
118
+ }, [queryClient]);
119
+ ```
120
+
121
+ (The effect here manages a subscription — that is its legitimate use. *Fetching* in an effect is still wrong; see the web stack's data-fetching reference for the full discipline.)
122
+
123
+ ## Core Access for a Hosted Capability Core
124
+
125
+ When the workspace has a hosted core (services behind promoted contracts), the desktop app reaches it from **main's side of the seam**: main holds the HTTP client, tokens, and retries; the renderer asks main over IPC. This keeps credentials out of the sandboxed process, keeps the strict CSP intact (`default-src 'self'` — the renderer fetches nothing), and gives core calls the same sender/payload validation as every other channel. Do not punch `connect-src` holes in the CSP to let the renderer fetch the gateway directly.
126
+
127
+ ## The electron-trpc Variant
128
+
129
+ tRPC-over-IPC (Zod inputs, queries/mutations/subscriptions, React Query integration) is the packaged version of this pattern — and a **recorded choice, not the default**: it sits in a maintenance lull (tRPC v11 support lives in forks) and adds per-call overhead on hot paths. The hand-rolled contract above covers the same ground with no dependency risk. Adopt electron-trpc only via a decision record naming what outgrew the hand-rolled seam.
130
+
131
+ ## Anti-Patterns
132
+
133
+ - **Exposing `ipcRenderer`, a whole Electron module, or a generic `invoke(channel, ...args)` passthrough on `window`.** All three make the narrow bridge infinitely wide.
134
+ - **`sendSync`.** Always an async shape instead.
135
+ - **String-typed ad-hoc channels** with no entry in the shared contract.
136
+ - **Trusting renderer payloads or senders** because "the types guarantee it" — they don't, at runtime.
137
+ - **The `remote` module** or packages emulating it.
138
+ - **Raw `useEffect` IPC fetching.** Data goes through TanStack Query; effects only manage subscriptions.
@@ -0,0 +1,37 @@
1
+ # Observability
2
+
3
+ An Electron app has two processes and no backend span surface. Distributed tracing lives at the capability core — the services the app talks to — which is why trace-assertions are N/A for the desktop shell (`references/testing-and-smoke.md`). The shell's observability job is **crash reporting and structured logs across the main/renderer boundary**, plus update telemetry. Instrument for the questions you will ask when a user reports a crash you cannot reproduce; the discipline is the framework canon adapted to a binary running on someone else's machine (`docs/principles/quality/observability.md`).
4
+
5
+ ## Crash Reporting — Both Processes
6
+
7
+ Two signals, both required, because they catch different failures:
8
+
9
+ - **Native crashes.** Electron's built-in `crashReporter` (Crashpad) captures native crashes in main and renderer and uploads minidumps. Start it in main *before* `app` is ready — a reporter started late misses the early crash.
10
+ - **JS exceptions.** A sink (Sentry-for-Electron shape) captures uncaught JS in both processes — main's `process.on('uncaughtException')`/`'unhandledRejection'` and the renderer's `window` handlers. A native crash and a JS exception are different events; you need both wired.
11
+
12
+ ## Structured Logs Across the Process Boundary
13
+
14
+ - **Main-process logging** goes to a rotating file sink (electron-log shape) as JSON, severity-tagged. Main has no devtools console, so an unstructured main log is invisible in the field.
15
+ - **Renderer errors forward to main** over IPC, so a single log stream reconstructs an incident that spans both processes. An error that lands only in the renderer devtools is gone the moment the window closes.
16
+ - Tag every line with the process (`main`/`renderer`) and a session id, so a multi-process incident reads as one timeline.
17
+
18
+ ## App and Update Telemetry
19
+
20
+ `autoUpdater` lifecycle events — update available, downloaded, applied, failed — are the signal for whether the fleet is actually on the new build. A silent update failure strands users on an old version with nothing to alert on, the desktop equivalent of a botched rollout. Carry app version, OS, and channel as context on every event.
21
+
22
+ ## What to Capture vs PII
23
+
24
+ - **Capture** process, session id, error type and stack, app/OS/channel version, and update events.
25
+ - **Never** log tokens, file paths containing usernames, or PII into logs, crash context, or minidumps. The upload is third-party — redact at the edge.
26
+
27
+ ## Where Distributed Tracing Lives
28
+
29
+ The end-to-end request trace belongs to the services the app calls and is asserted at the capability core. The shell does not emit spans; it correlates by attaching a request id it can log on both sides of the IPC boundary.
30
+
31
+ ## Anti-Patterns
32
+
33
+ - **`console.log` in main.** There is no console to read in the field — log structured to the sink.
34
+ - **Renderer errors that never cross to main.** Lost when the window closes.
35
+ - **A late `crashReporter`.** Started after `app` ready, it misses the crashes that happen at startup.
36
+ - **A collector in the shell.** The app reports to a sink; it does not run backend OTel infrastructure.
37
+ - **PII in logs or minidumps.** Usernames in paths and tokens in context follow the upload off-machine.
@@ -0,0 +1,82 @@
1
+ # Packaging & Updates
2
+
3
+ ## Table of Contents
4
+ - [The Toolchain Split](#the-toolchain-split)
5
+ - [Anatomy of forge.config.ts](#anatomy-of-forgeconfigts)
6
+ - [Makers](#makers)
7
+ - [Code Signing](#code-signing)
8
+ - [Auto-Update Routes](#auto-update-routes)
9
+ - [Update Discipline](#update-discipline)
10
+ - [Version Hygiene](#version-hygiene)
11
+
12
+ ---
13
+
14
+ ## The Toolchain Split
15
+
16
+ Two tools, one pipeline:
17
+
18
+ - **electron-vite builds.** One `electron.vite.config.ts` with `main`/`preload`/`renderer` sections → `out/`. Renderer HMR and main/preload hot-reload in dev; `utilityProcess` workers via `?modulePath`. Tailwind loads as a Vite plugin in the **renderer section only**.
19
+ - **Electron Forge packages.** `forge.config.ts` drives `@electron/packager`, the makers, signing hooks, and `@electron/fuses` — the officially recommended pipeline, maintained in the `electron/` org.
20
+
21
+ `package.json` `main` points at `out/main/index.js`, so packaging always consumes the built output; the `package` Nx target runs the build first. Forge's own Vite plugin remains experimental and lags Vite majors — keep the electron-vite + Forge pairing. **electron-builder** is the recorded escape hatch when packaging needs outgrow Forge's makers (exotic targets, NSIS specifics, staged-rollout updater); switching to it is a decision record, not a preference.
22
+
23
+ ## Anatomy of forge.config.ts
24
+
25
+ The generated config has three load-bearing parts:
26
+
27
+ ```ts
28
+ packagerConfig: {
29
+ asar: true, // required for the integrity fuses to mean anything
30
+ appBundleId: '<org>.<app>', // macOS bundle id; pairs with the AppUserModelID main sets
31
+ },
32
+ makers: [new MakerZIP({}, ['darwin', 'linux', 'win32'])],
33
+ plugins: [new FusesPlugin({ ... })], // see references/security.md → Fuses
34
+ ```
35
+
36
+ The fuses plugin is the part that must never be removed or moved out of the pipeline: it is what makes "an unhardened binary cannot ship" structurally true rather than procedurally hoped. `nodeCliInspect` stays on (Playwright `_electron` needs it); everything else is hardened per the table in `references/security.md`.
37
+
38
+ ## Makers
39
+
40
+ ZIP is the scaffold's lowest-common-denominator maker — it packages on every host OS with no native tooling. Graduate per platform when distribution starts:
41
+
42
+ | Target | Maker | Notes |
43
+ |---|---|---|
44
+ | Windows installer | `@electron-forge/maker-squirrel` | Pairs with the Squirrel auto-update route; set `setupIcon`, match `appBundleId`/AppUserModelID |
45
+ | macOS disk image | `@electron-forge/maker-dmg` | Sign + notarize first or Gatekeeper rejects |
46
+ | Linux | `maker-deb` / `maker-rpm` | Needs `dpkg`/`rpm` on the build host |
47
+
48
+ Cross-platform makers generally require their native OS — package per-OS in CI matrix jobs, not on one machine.
49
+
50
+ ## Code Signing
51
+
52
+ An unsigned build is a development artifact, never a release. Both platforms treat unsigned binaries as malware, because malware is what unsigned binaries usually are.
53
+
54
+ - **macOS:** Developer ID certificate + hardened runtime + entitlements, then notarization via `notarytool` (Forge wraps `@electron/notarize` — configure `osxSign`/`osxNotarize` in `packagerConfig`). `altool` is dead. Credentials arrive from CI secrets, never the repo.
55
+ - **Windows:** **Azure Artifact Signing** (renamed from Azure Trusted Signing; GA since Jan 2026) — cloud-HSM-backed, clears SmartScreen, runs from CI via signtool/jsign. USB-token OV/EV certificates cannot live in a pipeline; they are the legacy path. (Tooling note: post-rename CLI tools have needed `--prerelease` flags — verify current tool names when wiring CI.)
56
+
57
+ Signing config is wired in `forge.config.ts` when release credentials exist; until then the scaffold's unsigned `package` output is explicitly a dev artifact.
58
+
59
+ ## Auto-Update Routes
60
+
61
+ Two sanctioned routes — pick by distribution model, record the choice:
62
+
63
+ 1. **Open-source, GitHub-released:** `update-electron-app` (drop-in module) against **update.electronjs.org** — free, zero infrastructure, feeds the platform-native Squirrel updaters behind Electron's built-in `autoUpdater`. Serves only semver-tagged, non-draft releases.
64
+ 2. **Everything else:** `electron-updater` with a generic/S3/GitHub feed — channels and staged rollouts included. Self-hosted feed servers only when rollout control demands them.
65
+
66
+ A hand-rolled update endpoint without semver and rollback discipline is an outage generator, not a third route.
67
+
68
+ ## Update Discipline
69
+
70
+ Fixed rules, each one a classic self-inflicted outage when skipped:
71
+
72
+ - Never check for updates on `--squirrel-firstrun` — the install is still settling.
73
+ - Call `quitAndInstall()` only after the `update-downloaded` event.
74
+ - One in-flight `checkForUpdates()` at a time; double-calls corrupt state.
75
+ - `app.setAppUserModelId()` must match the Squirrel shortcut ID (the generated main sets it from the same `appId` as the bundle id) or Windows notifications detach.
76
+ - Staying inside the 3-major Electron support window is an update-discipline item (`references/security.md` → The Currency Window) — the auto-updater is the mechanism that makes the 8-week cadence shippable.
77
+
78
+ ## Version Hygiene
79
+
80
+ - `version` in `package.json` is what `app.getVersion()` reports, what the smoke sees, and what update feeds compare — bump it semver-honestly per release.
81
+ - Pin the Electron major deliberately (`^42.0.0` floats within the major; that is correct — patch releases are Chromium security fixes).
82
+ - When bumping the Electron major, run the full tier set including the smoke in CI before merging: driver/runtime pairings occasionally regress (`references/security.md`).