groundwork-method 0.0.1 → 0.10.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 (629) hide show
  1. package/CHANGELOG.md +781 -0
  2. package/LICENSE +21 -0
  3. package/README.md +44 -29
  4. package/bin/groundwork.js +1654 -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 +125 -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 +68 -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 +82 -0
  106. package/src/docs/principles/index.md +23 -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 +118 -0
  128. package/src/engineer-skills/groundwork-electron-engineer/references/ipc-contracts.md +138 -0
  129. package/src/engineer-skills/groundwork-electron-engineer/references/packaging-and-updates.md +82 -0
  130. package/src/engineer-skills/groundwork-electron-engineer/references/process-model.md +94 -0
  131. package/src/engineer-skills/groundwork-electron-engineer/references/security.md +107 -0
  132. package/src/engineer-skills/groundwork-electron-engineer/references/testing-and-smoke.md +107 -0
  133. package/src/engineer-skills/groundwork-electron-engineer/references/theming-and-tokens.md +74 -0
  134. package/src/engineer-skills/groundwork-electron-engineer/sync-anchor.md +14 -0
  135. package/src/engineer-skills/groundwork-flutter-engineer/SKILL.md +108 -0
  136. package/src/engineer-skills/groundwork-flutter-engineer/references/accessibility.md +92 -0
  137. package/src/engineer-skills/groundwork-flutter-engineer/references/architecture.md +189 -0
  138. package/src/engineer-skills/groundwork-flutter-engineer/references/data-and-contracts.md +136 -0
  139. package/src/engineer-skills/groundwork-flutter-engineer/references/navigation.md +122 -0
  140. package/src/engineer-skills/groundwork-flutter-engineer/references/platform-channels.md +93 -0
  141. package/src/engineer-skills/groundwork-flutter-engineer/references/releases-and-distribution.md +84 -0
  142. package/src/engineer-skills/groundwork-flutter-engineer/references/state-management.md +166 -0
  143. package/src/engineer-skills/groundwork-flutter-engineer/references/testing.md +135 -0
  144. package/src/engineer-skills/groundwork-flutter-engineer/references/theming-and-design-tokens.md +109 -0
  145. package/src/engineer-skills/groundwork-flutter-engineer/references/widgets-and-composition.md +123 -0
  146. package/src/engineer-skills/groundwork-flutter-engineer/sync-anchor.md +15 -0
  147. package/src/engineer-skills/groundwork-go-engineer/SKILL.md +171 -0
  148. package/src/engineer-skills/groundwork-go-engineer/references/api-design.md +82 -0
  149. package/src/engineer-skills/groundwork-go-engineer/references/architecture.md +42 -0
  150. package/src/engineer-skills/groundwork-go-engineer/references/capability-ports.md +50 -0
  151. package/src/engineer-skills/groundwork-go-engineer/references/code-craft-security.md +34 -0
  152. package/src/engineer-skills/groundwork-go-engineer/references/concurrency.md +108 -0
  153. package/src/engineer-skills/groundwork-go-engineer/references/go-services.md +77 -0
  154. package/src/engineer-skills/groundwork-go-engineer/references/http-handlers.md +172 -0
  155. package/src/engineer-skills/groundwork-go-engineer/references/implementation-patterns.md +156 -0
  156. package/src/engineer-skills/groundwork-go-engineer/references/integration-realtime-data.md +57 -0
  157. package/src/engineer-skills/groundwork-go-engineer/references/observability.md +49 -0
  158. package/src/engineer-skills/groundwork-go-engineer/references/postgres.md +41 -0
  159. package/src/engineer-skills/groundwork-go-engineer/references/reliability-performance.md +105 -0
  160. package/src/engineer-skills/groundwork-go-engineer/references/testing.md +139 -0
  161. package/src/engineer-skills/groundwork-go-engineer/sync-anchor.md +11 -0
  162. package/src/engineer-skills/groundwork-nextjs-engineer/SKILL.md +107 -0
  163. package/src/engineer-skills/groundwork-nextjs-engineer/references/architecture.md +323 -0
  164. package/src/engineer-skills/groundwork-nextjs-engineer/references/data-fetching.md +458 -0
  165. package/src/engineer-skills/groundwork-nextjs-engineer/references/documentation.md +324 -0
  166. package/src/engineer-skills/groundwork-nextjs-engineer/references/error-boundaries.md +383 -0
  167. package/src/engineer-skills/groundwork-nextjs-engineer/references/mutations-and-forms.md +396 -0
  168. package/src/engineer-skills/groundwork-nextjs-engineer/references/performance-and-deployment.md +947 -0
  169. package/src/engineer-skills/groundwork-nextjs-engineer/references/routing-and-navigation.md +405 -0
  170. package/src/engineer-skills/groundwork-nextjs-engineer/references/server-components.md +394 -0
  171. package/src/engineer-skills/groundwork-nextjs-engineer/references/tailwind-and-styling.md +134 -0
  172. package/src/engineer-skills/groundwork-nextjs-engineer/references/testing.md +433 -0
  173. package/src/engineer-skills/groundwork-nextjs-engineer/references/type-system.md +368 -0
  174. package/src/engineer-skills/groundwork-nextjs-engineer/references/ux-principles.md +278 -0
  175. package/src/engineer-skills/groundwork-nextjs-engineer/references/visual-language.md +69 -0
  176. package/src/engineer-skills/groundwork-nextjs-engineer/sync-anchor.md +9 -0
  177. package/src/engineer-skills/groundwork-python-engineer/SKILL.md +196 -0
  178. package/src/engineer-skills/groundwork-python-engineer/references/api-standards.md +88 -0
  179. package/src/engineer-skills/groundwork-python-engineer/references/architecture.md +57 -0
  180. package/src/engineer-skills/groundwork-python-engineer/references/async-patterns.md +103 -0
  181. package/src/engineer-skills/groundwork-python-engineer/references/capability-ports.md +44 -0
  182. package/src/engineer-skills/groundwork-python-engineer/references/database.md +88 -0
  183. package/src/engineer-skills/groundwork-python-engineer/references/documentation-mcp.md +167 -0
  184. package/src/engineer-skills/groundwork-python-engineer/references/implementation-patterns.md +166 -0
  185. package/src/engineer-skills/groundwork-python-engineer/references/ml-pipelines.md +119 -0
  186. package/src/engineer-skills/groundwork-python-engineer/references/ml-systems-ai-engineering.md +74 -0
  187. package/src/engineer-skills/groundwork-python-engineer/references/observability.md +57 -0
  188. package/src/engineer-skills/groundwork-python-engineer/references/resilience.md +126 -0
  189. package/src/engineer-skills/groundwork-python-engineer/references/testing.md +177 -0
  190. package/src/engineer-skills/groundwork-python-engineer/sync-anchor.md +13 -0
  191. package/src/generators/add-capability/generator.ts +70 -0
  192. package/src/generators/add-capability/schema.json +30 -0
  193. package/src/generators/capabilities/llm/capability.json +28 -0
  194. package/src/generators/capabilities/llm/providers/anthropic/footprint.json +13 -0
  195. package/src/generators/capabilities/llm/providers/anthropic/stacks/go/internal/llm/llm.go.template +102 -0
  196. package/src/generators/capabilities/llm/providers/anthropic/stacks/python/src/__packageName__/adapters/llm.py.template +61 -0
  197. package/src/generators/capabilities/llm/providers/local/footprint.json +13 -0
  198. package/src/generators/capabilities/llm/providers/local/stacks/go/internal/llm/llm.go.template +102 -0
  199. package/src/generators/capabilities/llm/providers/local/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  200. package/src/generators/capabilities/llm/providers/localai/footprint.json +29 -0
  201. package/src/generators/capabilities/llm/providers/localai/stacks/go/internal/llm/llm.go.template +102 -0
  202. package/src/generators/capabilities/llm/providers/localai/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  203. package/src/generators/capabilities/llm/providers/none/footprint.json +9 -0
  204. package/src/generators/capabilities/llm/providers/none/stacks/go/internal/llm/llm.go.template +35 -0
  205. package/src/generators/capabilities/llm/providers/none/stacks/python/src/__packageName__/adapters/llm.py.template +25 -0
  206. package/src/generators/capabilities/llm/providers/ollama/footprint.json +20 -0
  207. package/src/generators/capabilities/llm/providers/ollama/stacks/go/internal/llm/llm.go.template +102 -0
  208. package/src/generators/capabilities/llm/providers/ollama/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  209. package/src/generators/capabilities/llm/providers/openai/footprint.json +13 -0
  210. package/src/generators/capabilities/llm/providers/openai/stacks/go/internal/llm/llm.go.template +98 -0
  211. package/src/generators/capabilities/llm/providers/openai/stacks/python/src/__packageName__/adapters/llm.py.template +60 -0
  212. package/src/generators/capabilities/llm/stacks/go/internal/core/service/llm.go.template +12 -0
  213. package/src/generators/capabilities/llm/stacks/go/internal/llm/llm_test.go.template +33 -0
  214. package/src/generators/capabilities/llm/stacks/python/src/__packageName__/core/llm.py.template +15 -0
  215. package/src/generators/capabilities/llm/stacks/python/tests/contracts/test_llm.py.template +37 -0
  216. package/src/generators/cli-app/files/README.md.template +76 -0
  217. package/src/generators/cli-app/files/build.mjs.template +15 -0
  218. package/src/generators/cli-app/files/package.json.template +21 -0
  219. package/src/generators/cli-app/files/src/cli.ts.template +67 -0
  220. package/src/generators/cli-app/files/src/commands/hello.ts.template +17 -0
  221. package/src/generators/cli-app/files/src/commands/status.ts.template +23 -0
  222. package/src/generators/cli-app/files/src/core/client.test.ts.template +80 -0
  223. package/src/generators/cli-app/files/src/core/client.ts.template +64 -0
  224. package/src/generators/cli-app/files/src/registry.test.ts.template +35 -0
  225. package/src/generators/cli-app/files/src/registry.ts.template +31 -0
  226. package/src/generators/cli-app/files/tsconfig.json.template +16 -0
  227. package/src/generators/cli-app/files/tsconfig.test.json.template +11 -0
  228. package/src/generators/cli-app/generator.ts +138 -0
  229. package/src/generators/cli-app/schema.json +24 -0
  230. package/src/generators/docs-site/files/.gitignore.ejs +40 -0
  231. package/src/generators/docs-site/files/app/docs/__slug__/page.tsx +101 -0
  232. package/src/generators/docs-site/files/app/docs/layout.tsx +14 -0
  233. package/src/generators/docs-site/files/app/docs.css +43 -0
  234. package/src/generators/docs-site/files/app/layout.tsx +24 -0
  235. package/src/generators/docs-site/files/app/page.tsx +135 -0
  236. package/src/generators/docs-site/files/app/source.ts +8 -0
  237. package/src/generators/docs-site/files/components/mermaid.tsx +67 -0
  238. package/src/generators/docs-site/files/next.config.mjs +10 -0
  239. package/src/generators/docs-site/files/package.json +32 -0
  240. package/src/generators/docs-site/files/pnpm-workspace.yaml +7 -0
  241. package/src/generators/docs-site/files/postcss.config.mjs +6 -0
  242. package/src/generators/docs-site/files/source.config.ts +77 -0
  243. package/src/generators/docs-site/files/tailwind.config.js +10 -0
  244. package/src/generators/docs-site/files/tsconfig.json +27 -0
  245. package/src/generators/docs-site/generator.ts +476 -0
  246. package/src/generators/docs-site/schema.json +17 -0
  247. package/src/generators/electron-app/docs/principles/stack/electron/index.md +47 -0
  248. package/src/generators/electron-app/docs/principles/stack/electron/ipc-contracts.md +71 -0
  249. package/src/generators/electron-app/docs/principles/stack/electron/packaging-and-updates.md +59 -0
  250. package/src/generators/electron-app/docs/principles/stack/electron/process-model.md +53 -0
  251. package/src/generators/electron-app/docs/principles/stack/electron/security.md +70 -0
  252. package/src/generators/electron-app/docs/principles/stack/typescript/frontend.md +65 -0
  253. package/src/generators/electron-app/files/.gitignore.template +20 -0
  254. package/src/generators/electron-app/files/README.md.template +125 -0
  255. package/src/generators/electron-app/files/electron.vite.config.ts +31 -0
  256. package/src/generators/electron-app/files/eslint.config.mjs +92 -0
  257. package/src/generators/electron-app/files/forge.config.ts.template +44 -0
  258. package/src/generators/electron-app/files/package.json.template +54 -0
  259. package/src/generators/electron-app/files/playwright.config.ts +18 -0
  260. package/src/generators/electron-app/files/project.json.template +65 -0
  261. package/src/generators/electron-app/files/src/main/core-client.test.ts +81 -0
  262. package/src/generators/electron-app/files/src/main/core-client.ts +55 -0
  263. package/src/generators/electron-app/files/src/main/index.ts +157 -0
  264. package/src/generators/electron-app/files/src/main/ipc.ts +52 -0
  265. package/src/generators/electron-app/files/src/main/policy.test.ts +71 -0
  266. package/src/generators/electron-app/files/src/main/policy.ts +73 -0
  267. package/src/generators/electron-app/files/src/preload/index.ts +23 -0
  268. package/src/generators/electron-app/files/src/renderer/index.html.template +20 -0
  269. package/src/generators/electron-app/files/src/renderer/src/App.test.tsx +61 -0
  270. package/src/generators/electron-app/files/src/renderer/src/App.tsx.template +43 -0
  271. package/src/generators/electron-app/files/src/renderer/src/assets/main.css +40 -0
  272. package/src/generators/electron-app/files/src/renderer/src/env.d.ts +14 -0
  273. package/src/generators/electron-app/files/src/renderer/src/main.tsx +25 -0
  274. package/src/generators/electron-app/files/src/shared/ipc.ts +54 -0
  275. package/src/generators/electron-app/files/tests/smoke/app.spec.ts.template +68 -0
  276. package/src/generators/electron-app/files/tool/electron_exec.sh.template +83 -0
  277. package/src/generators/electron-app/files/tsconfig.json +7 -0
  278. package/src/generators/electron-app/files/tsconfig.node.json +27 -0
  279. package/src/generators/electron-app/files/tsconfig.web.json +22 -0
  280. package/src/generators/electron-app/files/vitest.config.ts +32 -0
  281. package/src/generators/electron-app/files/vitest.setup.ts +1 -0
  282. package/src/generators/electron-app/generator.ts +288 -0
  283. package/src/generators/electron-app/schema.json +23 -0
  284. package/src/generators/flutter-app/docs/principles/stack/flutter/architecture.md +78 -0
  285. package/src/generators/flutter-app/docs/principles/stack/flutter/index.md +38 -0
  286. package/src/generators/flutter-app/docs/principles/stack/flutter/platform-channels.md +51 -0
  287. package/src/generators/flutter-app/docs/principles/stack/flutter/releases-and-distribution.md +59 -0
  288. package/src/generators/flutter-app/docs/principles/stack/flutter/state-management.md +85 -0
  289. package/src/generators/flutter-app/docs/principles/stack/flutter/testing.md +74 -0
  290. package/src/generators/flutter-app/docs/principles/stack/flutter/widgets-and-composition.md +69 -0
  291. package/src/generators/flutter-app/files/.gitignore.template +30 -0
  292. package/src/generators/flutter-app/files/README.md.template +100 -0
  293. package/src/generators/flutter-app/files/analysis_options.yaml.template +18 -0
  294. package/src/generators/flutter-app/files/integration_test/app_test.dart.template +30 -0
  295. package/src/generators/flutter-app/files/lib/app.dart.template +24 -0
  296. package/src/generators/flutter-app/files/lib/config/app_config.dart +15 -0
  297. package/src/generators/flutter-app/files/lib/data/repositories/status_repository.dart +36 -0
  298. package/src/generators/flutter-app/files/lib/data/services/api_client.dart +71 -0
  299. package/src/generators/flutter-app/files/lib/domain/models/health_status.dart +23 -0
  300. package/src/generators/flutter-app/files/lib/main.dart +11 -0
  301. package/src/generators/flutter-app/files/lib/router.dart +23 -0
  302. package/src/generators/flutter-app/files/lib/ui/core/theme/app_theme.dart +110 -0
  303. package/src/generators/flutter-app/files/lib/ui/home/home_view.dart +89 -0
  304. package/src/generators/flutter-app/files/lib/ui/home/home_view_model.dart.template +38 -0
  305. package/src/generators/flutter-app/files/project.json.template +51 -0
  306. package/src/generators/flutter-app/files/pubspec.yaml.template +47 -0
  307. package/src/generators/flutter-app/files/test/api_client_test.dart.template +63 -0
  308. package/src/generators/flutter-app/files/test/fakes/fake_status_repository.dart.template +19 -0
  309. package/src/generators/flutter-app/files/test/home_view_test.dart.template +58 -0
  310. package/src/generators/flutter-app/files/tool/flutter_exec.sh.template +60 -0
  311. package/src/generators/flutter-app/generator.ts +362 -0
  312. package/src/generators/flutter-app/schema.json +23 -0
  313. package/src/generators/go-microservice/docs/principles/stack/go/concurrency.md +123 -0
  314. package/src/generators/go-microservice/docs/principles/stack/go/index.md +70 -0
  315. package/src/generators/go-microservice/docs/principles/stack/go/testing.md +152 -0
  316. package/src/generators/go-microservice/files/.air.toml.template +38 -0
  317. package/src/generators/go-microservice/files/.env.template +4 -0
  318. package/src/generators/go-microservice/files/.golangci.yml.template +82 -0
  319. package/src/generators/go-microservice/files/Dockerfile.dev.template +12 -0
  320. package/src/generators/go-microservice/files/asyncapi-pubsub.yaml.template +33 -0
  321. package/src/generators/go-microservice/files/asyncapi-ws.yaml.template +34 -0
  322. package/src/generators/go-microservice/files/cmd/api/main.go.template +149 -0
  323. package/src/generators/go-microservice/files/cmd/api/main_test.go.template +99 -0
  324. package/src/generators/go-microservice/files/cmd/worker/cleanup/main.go.template +39 -0
  325. package/src/generators/go-microservice/files/db/schema.sql.template +24 -0
  326. package/src/generators/go-microservice/files/go.mod.template +39 -0
  327. package/src/generators/go-microservice/files/internal/config/config.go.template +52 -0
  328. package/src/generators/go-microservice/files/internal/config/otel.go.template +93 -0
  329. package/src/generators/go-microservice/files/internal/core/domain/errors.go.template +16 -0
  330. package/src/generators/go-microservice/files/internal/core/domain/model.go.template +28 -0
  331. package/src/generators/go-microservice/files/internal/core/domain/user.go.template +13 -0
  332. package/src/generators/go-microservice/files/internal/core/pagination.go.template +16 -0
  333. package/src/generators/go-microservice/files/internal/core/service/app_service.go.template +79 -0
  334. package/src/generators/go-microservice/files/internal/core/service/event_hub.go.template +9 -0
  335. package/src/generators/go-microservice/files/internal/core/service/message_queue.go.template +10 -0
  336. package/src/generators/go-microservice/files/internal/core/service/outbox_repository.go.template +31 -0
  337. package/src/generators/go-microservice/files/internal/core/service/repository.go.template +23 -0
  338. package/src/generators/go-microservice/files/internal/core/service/user_repository.go.template +15 -0
  339. package/src/generators/go-microservice/files/internal/core/service/user_service.go.template +43 -0
  340. package/src/generators/go-microservice/files/internal/entrypoints/api/app_handler.go.template +108 -0
  341. package/src/generators/go-microservice/files/internal/entrypoints/api/auth_middleware_test.go.template +52 -0
  342. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook.go.template +202 -0
  343. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook_test.go.template +82 -0
  344. package/src/generators/go-microservice/files/internal/entrypoints/api/health_handler.go.template +80 -0
  345. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware.go.template +87 -0
  346. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware_test.go.template +76 -0
  347. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/repository.go.template +37 -0
  348. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_auth.go.template +40 -0
  349. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_loadshed.go.template +38 -0
  350. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_logging.go.template +40 -0
  351. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_ratelimit.go.template +48 -0
  352. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_test.go.template +81 -0
  353. package/src/generators/go-microservice/files/internal/entrypoints/api/router.go.template +105 -0
  354. package/src/generators/go-microservice/files/internal/entrypoints/api/types.go.template +70 -0
  355. package/src/generators/go-microservice/files/internal/entrypoints/api/websocket_handler.go.template +39 -0
  356. package/src/generators/go-microservice/files/internal/httpclient/http_client.go.template +87 -0
  357. package/src/generators/go-microservice/files/internal/kafka/kafka.go.template +34 -0
  358. package/src/generators/go-microservice/files/internal/postgres/postgres.go.template +195 -0
  359. package/src/generators/go-microservice/files/internal/postgres/postgres_test.go.template +156 -0
  360. package/src/generators/go-microservice/files/internal/postgres/user_repository.go.template +56 -0
  361. package/src/generators/go-microservice/files/internal/pubsub/gcp_pubsub.go.template +35 -0
  362. package/src/generators/go-microservice/files/internal/websocket/client.go.template +151 -0
  363. package/src/generators/go-microservice/files/internal/websocket/hub.go.template +261 -0
  364. package/src/generators/go-microservice/files/scripts/apply-schema.sh.template +21 -0
  365. package/src/generators/go-microservice/files/tools/tools.go.template +10 -0
  366. package/src/generators/go-microservice/generator.ts +240 -0
  367. package/src/generators/go-microservice/schema.json +63 -0
  368. package/src/generators/nextjs-app/docs/principles/stack/typescript/frontend.md +65 -0
  369. package/src/generators/nextjs-app/files/.dockerignore.template +7 -0
  370. package/src/generators/nextjs-app/files/.env.example.template +24 -0
  371. package/src/generators/nextjs-app/files/.gitignore.template +5 -0
  372. package/src/generators/nextjs-app/files/Dockerfile +53 -0
  373. package/src/generators/nextjs-app/files/app/(auth)/sign-in/__sign-in__/page.tsx.template +9 -0
  374. package/src/generators/nextjs-app/files/app/(auth)/sign-up/__sign-up__/page.tsx.template +9 -0
  375. package/src/generators/nextjs-app/files/app/api/config/route.ts.template +39 -0
  376. package/src/generators/nextjs-app/files/app/api/healthz/route.test.ts +15 -0
  377. package/src/generators/nextjs-app/files/app/api/healthz/route.ts +5 -0
  378. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.test.ts.template +55 -0
  379. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.ts.template +126 -0
  380. package/src/generators/nextjs-app/files/app/error.tsx +39 -0
  381. package/src/generators/nextjs-app/files/app/global-error.tsx +68 -0
  382. package/src/generators/nextjs-app/files/app/globals.css +105 -0
  383. package/src/generators/nextjs-app/files/app/layout.tsx +59 -0
  384. package/src/generators/nextjs-app/files/app/loading.tsx +13 -0
  385. package/src/generators/nextjs-app/files/app/not-found.tsx +30 -0
  386. package/src/generators/nextjs-app/files/app/page.tsx +20 -0
  387. package/src/generators/nextjs-app/files/components/providers/default.tsx +19 -0
  388. package/src/generators/nextjs-app/files/components/providers/production.tsx +32 -0
  389. package/src/generators/nextjs-app/files/components/providers/telemetry.tsx +76 -0
  390. package/src/generators/nextjs-app/files/components/render-smoke.test.tsx +29 -0
  391. package/src/generators/nextjs-app/files/components/theme-provider.tsx +11 -0
  392. package/src/generators/nextjs-app/files/components.json +21 -0
  393. package/src/generators/nextjs-app/files/eslint.config.mjs +120 -0
  394. package/src/generators/nextjs-app/files/hooks/use-toast.ts +7 -0
  395. package/src/generators/nextjs-app/files/instrumentation.ts +90 -0
  396. package/src/generators/nextjs-app/files/lib/api/fetcher.ts.template +130 -0
  397. package/src/generators/nextjs-app/files/lib/config.ts +21 -0
  398. package/src/generators/nextjs-app/files/lib/logger.ts +29 -0
  399. package/src/generators/nextjs-app/files/lib/schemas/index.ts +19 -0
  400. package/src/generators/nextjs-app/files/lib/utils.ts +6 -0
  401. package/src/generators/nextjs-app/files/next.config.mjs +9 -0
  402. package/src/generators/nextjs-app/files/package.json +70 -0
  403. package/src/generators/nextjs-app/files/postcss.config.mjs +8 -0
  404. package/src/generators/nextjs-app/files/proxy.test.ts.template +30 -0
  405. package/src/generators/nextjs-app/files/proxy.ts +31 -0
  406. package/src/generators/nextjs-app/files/public/.gitkeep +1 -0
  407. package/src/generators/nextjs-app/files/tsconfig.json +42 -0
  408. package/src/generators/nextjs-app/files/vitest.config.mts +15 -0
  409. package/src/generators/nextjs-app/files/vitest.setup.ts +7 -0
  410. package/src/generators/nextjs-app/generator.ts +307 -0
  411. package/src/generators/nextjs-app/schema.json +44 -0
  412. package/src/generators/python-microservice/docs/principles/stack/python/async.md +168 -0
  413. package/src/generators/python-microservice/docs/principles/stack/python/documentation.md +240 -0
  414. package/src/generators/python-microservice/docs/principles/stack/python/mcp.md +147 -0
  415. package/src/generators/python-microservice/docs/principles/stack/python/resilience.md +193 -0
  416. package/src/generators/python-microservice/docs/principles/stack/python/testing.md +281 -0
  417. package/src/generators/python-microservice/files/.env.example.template +30 -0
  418. package/src/generators/python-microservice/files/Dockerfile.template +36 -0
  419. package/src/generators/python-microservice/files/db/schema.sql.template +19 -0
  420. package/src/generators/python-microservice/files/pyproject.toml.template +76 -0
  421. package/src/generators/python-microservice/files/scripts/apply-schema.sh.template +25 -0
  422. package/src/generators/python-microservice/files/src/__packageName__/adapters/comfyui.py.template +87 -0
  423. package/src/generators/python-microservice/files/src/__packageName__/adapters/config.py.template +48 -0
  424. package/src/generators/python-microservice/files/src/__packageName__/adapters/database.py.template +21 -0
  425. package/src/generators/python-microservice/files/src/__packageName__/adapters/message_queue.py.template +29 -0
  426. package/src/generators/python-microservice/files/src/__packageName__/adapters/repository.py.template +130 -0
  427. package/src/generators/python-microservice/files/src/__packageName__/adapters/telemetry.py.template +68 -0
  428. package/src/generators/python-microservice/files/src/__packageName__/adapters/websocket_hub.py.template +36 -0
  429. package/src/generators/python-microservice/files/src/__packageName__/core/domain/entities.py.template +22 -0
  430. package/src/generators/python-microservice/files/src/__packageName__/core/domain/exceptions.py.template +43 -0
  431. package/src/generators/python-microservice/files/src/__packageName__/core/ports.py.template +42 -0
  432. package/src/generators/python-microservice/files/src/__packageName__/core/service/example_service.py.template +68 -0
  433. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/dependencies.py.template +50 -0
  434. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/middleware.py.template +131 -0
  435. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/router.py.template +37 -0
  436. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/websocket_handler.py.template +20 -0
  437. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/cleanup.py.template +35 -0
  438. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/worker.py.template +28 -0
  439. package/src/generators/python-microservice/files/src/__packageName__/main.py.template +108 -0
  440. package/src/generators/python-microservice/files/tests/test_main.py.template +74 -0
  441. package/src/generators/python-microservice/files/tests/test_middleware.py.template +109 -0
  442. package/src/generators/python-microservice/files/tests/test_worker.py.template +16 -0
  443. package/src/generators/python-microservice/generator.ts +286 -0
  444. package/src/generators/python-microservice/schema.json +86 -0
  445. package/src/generators/shared/brand-tokens.ts +301 -0
  446. package/src/generators/shared/capabilities.ts +349 -0
  447. package/src/generators/shared/provenance.ts +61 -0
  448. package/src/generators/shared/scaffold-helpers.ts +309 -0
  449. package/src/generators/system-test-runner/files/tests/bets/.gitkeep +0 -0
  450. package/src/generators/system-test-runner/files/tests/bets/_archive/.gitkeep +0 -0
  451. package/src/generators/system-test-runner/files/tests/conftest.py.template +503 -0
  452. package/src/generators/system-test-runner/files/tests/pyproject.toml.template +20 -0
  453. package/src/generators/system-test-runner/files/tests/system/pages/__init__.py.template +9 -0
  454. package/src/generators/system-test-runner/files/tests/system/pages/base_page.py.template +36 -0
  455. package/src/generators/system-test-runner/files/tests/system/test_a11y_smoke.py.template +132 -0
  456. package/src/generators/system-test-runner/files/tests/system/test_contract_conformance.py.template +140 -0
  457. package/src/generators/system-test-runner/files/tests/system/test_layout_geometry.py.template +109 -0
  458. package/src/generators/system-test-runner/files/tests/system/test_render_smoke.py.template +227 -0
  459. package/src/generators/system-test-runner/files/tests/system/test_system.py.template +158 -0
  460. package/src/generators/system-test-runner/files/tests/system/test_token_conformance.py.template +206 -0
  461. package/src/generators/system-test-runner/files/tests/system/test_visual_regression.py.template +104 -0
  462. package/src/generators/system-test-runner/generator.ts +142 -0
  463. package/src/generators/system-test-runner/schema.json +24 -0
  464. package/src/generators/workspace-dev-cli/cli-src/build.mjs +42 -0
  465. package/src/generators/workspace-dev-cli/cli-src/dist/dev-bundle.js +2168 -0
  466. package/src/generators/workspace-dev-cli/cli-src/src/commands/bet.ts +442 -0
  467. package/src/generators/workspace-dev-cli/cli-src/src/commands/completion.ts +87 -0
  468. package/src/generators/workspace-dev-cli/cli-src/src/commands/doctor.ts +139 -0
  469. package/src/generators/workspace-dev-cli/cli-src/src/commands/lifecycle.ts +548 -0
  470. package/src/generators/workspace-dev-cli/cli-src/src/commands/quality.ts +127 -0
  471. package/src/generators/workspace-dev-cli/cli-src/src/commands/surface.ts +214 -0
  472. package/src/generators/workspace-dev-cli/cli-src/src/index.ts +127 -0
  473. package/src/generators/workspace-dev-cli/cli-src/src/registry.ts +194 -0
  474. package/src/generators/workspace-dev-cli/cli-src/src/theme/color.ts +130 -0
  475. package/src/generators/workspace-dev-cli/cli-src/src/theme/render.ts +158 -0
  476. package/src/generators/workspace-dev-cli/cli-src/src/theme/tokens.ts +122 -0
  477. package/src/generators/workspace-dev-cli/cli-src/src/util/context.ts +43 -0
  478. package/src/generators/workspace-dev-cli/cli-src/src/util/extensions.ts +99 -0
  479. package/src/generators/workspace-dev-cli/cli-src/src/util/paths.ts +46 -0
  480. package/src/generators/workspace-dev-cli/cli-src/src/util/proc.ts +106 -0
  481. package/src/generators/workspace-dev-cli/cli-src/src/util/prompt.ts +108 -0
  482. package/src/generators/workspace-dev-cli/cli-src/src/util/runners.ts +70 -0
  483. package/src/generators/workspace-dev-cli/cli-src/src/util/services.ts +221 -0
  484. package/src/generators/workspace-dev-cli/cli-src/src/util/version.ts +21 -0
  485. package/src/generators/workspace-dev-cli/cli-src/tsconfig.json +16 -0
  486. package/src/generators/workspace-dev-cli/files/.agents/skills/workspace-cli/SKILL.md.template +74 -0
  487. package/src/generators/workspace-dev-cli/files/dev.template +16 -0
  488. package/src/generators/workspace-dev-cli/files/docker-compose.yml.template +20 -0
  489. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/milestone-test.pytmpl.template +46 -0
  490. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/slice-test.pytmpl.template +38 -0
  491. package/src/generators/workspace-dev-cli/generator.ts +136 -0
  492. package/src/generators/workspace-dev-cli/schema.json +22 -0
  493. package/src/hidden-skills/code-intelligence.md +129 -0
  494. package/src/hidden-skills/groundwork-architect/SKILL.md +114 -0
  495. package/src/hidden-skills/groundwork-architect/references/agentic-systems.md +44 -0
  496. package/src/hidden-skills/groundwork-architect/references/ai-native-architecture.md +37 -0
  497. package/src/hidden-skills/groundwork-architect/references/api-and-contracts.md +45 -0
  498. package/src/hidden-skills/groundwork-architect/references/core-and-boundaries.md +45 -0
  499. package/src/hidden-skills/groundwork-architect/references/data-architecture.md +33 -0
  500. package/src/hidden-skills/groundwork-architect/references/decision-records.md +34 -0
  501. package/src/hidden-skills/groundwork-architect/references/durable-execution.md +45 -0
  502. package/src/hidden-skills/groundwork-architect/references/evolutionary-architecture.md +37 -0
  503. package/src/hidden-skills/groundwork-architect/references/identity-and-access.md +41 -0
  504. package/src/hidden-skills/groundwork-architect/references/integration-patterns.md +39 -0
  505. package/src/hidden-skills/groundwork-architect/references/observability.md +36 -0
  506. package/src/hidden-skills/groundwork-architect/references/performance-and-scale.md +41 -0
  507. package/src/hidden-skills/groundwork-architect/references/platform-and-delivery.md +47 -0
  508. package/src/hidden-skills/groundwork-architect/references/realtime-and-async.md +28 -0
  509. package/src/hidden-skills/groundwork-architect/references/reliability.md +31 -0
  510. package/src/hidden-skills/groundwork-architect/references/security-and-trust.md +47 -0
  511. package/src/hidden-skills/groundwork-architect/references/surface-architecture.md +40 -0
  512. package/src/hidden-skills/groundwork-architect/sync-anchor.md +34 -0
  513. package/src/hidden-skills/groundwork-architecture/architecture-template.md +50 -0
  514. package/src/hidden-skills/groundwork-architecture/instructions.md +139 -0
  515. package/src/hidden-skills/groundwork-architecture/phases/01-context-ingestion.md +18 -0
  516. package/src/hidden-skills/groundwork-architecture/phases/02-technical-constraints.md +27 -0
  517. package/src/hidden-skills/groundwork-architecture/phases/03-service-design.md +19 -0
  518. package/src/hidden-skills/groundwork-architecture/phases/04-data-flow-communication.md +23 -0
  519. package/src/hidden-skills/groundwork-architecture/phases/05-component-boundaries-contracts.md +17 -0
  520. package/src/hidden-skills/groundwork-architecture/phases/06-draft-review-present.md +38 -0
  521. package/src/hidden-skills/groundwork-architecture/phases/07-commit.md +33 -0
  522. package/src/hidden-skills/groundwork-architecture/templates/architecture-cache.md +43 -0
  523. package/src/hidden-skills/groundwork-architecture-extract/instructions.md +163 -0
  524. package/src/hidden-skills/groundwork-architecture-extract/templates/architecture-extract-cache.md +21 -0
  525. package/src/hidden-skills/groundwork-bet/briefs/slice-worker.md +191 -0
  526. package/src/hidden-skills/groundwork-bet/instructions.md +88 -0
  527. package/src/hidden-skills/groundwork-bet/templates/bet-progress-test.md +126 -0
  528. package/src/hidden-skills/groundwork-bet/templates/change-proposal.md +38 -0
  529. package/src/hidden-skills/groundwork-bet/templates/decomposition/meta.json +4 -0
  530. package/src/hidden-skills/groundwork-bet/templates/decomposition/milestone-index.md +35 -0
  531. package/src/hidden-skills/groundwork-bet/templates/decomposition/slice.md +35 -0
  532. package/src/hidden-skills/groundwork-bet/templates/pitch.md +45 -0
  533. package/src/hidden-skills/groundwork-bet/templates/technical-design/01-ui-design.md +51 -0
  534. package/src/hidden-skills/groundwork-bet/templates/technical-design/02-data-flows.md +36 -0
  535. package/src/hidden-skills/groundwork-bet/templates/technical-design/03-api-design.md +90 -0
  536. package/src/hidden-skills/groundwork-bet/templates/technical-design/04-data-design.md +29 -0
  537. package/src/hidden-skills/groundwork-bet/workflows/01-discovery.md +198 -0
  538. package/src/hidden-skills/groundwork-bet/workflows/02-design.md +168 -0
  539. package/src/hidden-skills/groundwork-bet/workflows/03-decomposition.md +246 -0
  540. package/src/hidden-skills/groundwork-bet/workflows/04-delivery.md +193 -0
  541. package/src/hidden-skills/groundwork-bet/workflows/05-validation.md +199 -0
  542. package/src/hidden-skills/groundwork-design-system/instructions.md +125 -0
  543. package/src/hidden-skills/groundwork-design-system/templates/brand-tokens.md +182 -0
  544. package/src/hidden-skills/groundwork-design-system/templates/design-system-cache.md +64 -0
  545. package/src/hidden-skills/groundwork-design-system/tracks/_foundation.md +136 -0
  546. package/src/hidden-skills/groundwork-design-system/tracks/agentic-protocol.md +269 -0
  547. package/src/hidden-skills/groundwork-design-system/tracks/cli.md +355 -0
  548. package/src/hidden-skills/groundwork-design-system/tracks/graphical-ui.md +330 -0
  549. package/src/hidden-skills/groundwork-design-system-extract/instructions.md +124 -0
  550. package/src/hidden-skills/groundwork-design-system-extract/templates/design-system-extract-cache.md +19 -0
  551. package/src/hidden-skills/groundwork-designer/SKILL.md +108 -0
  552. package/src/hidden-skills/groundwork-designer/references/accessibility.md +33 -0
  553. package/src/hidden-skills/groundwork-designer/references/ai-native-design.md +37 -0
  554. package/src/hidden-skills/groundwork-designer/references/design-review.md +29 -0
  555. package/src/hidden-skills/groundwork-designer/references/design-systems-and-tokens.md +33 -0
  556. package/src/hidden-skills/groundwork-designer/references/interaction-and-motion.md +37 -0
  557. package/src/hidden-skills/groundwork-designer/references/layout-and-space.md +33 -0
  558. package/src/hidden-skills/groundwork-designer/references/usability-and-ux.md +33 -0
  559. package/src/hidden-skills/groundwork-designer/references/visual-craft.md +49 -0
  560. package/src/hidden-skills/groundwork-designer/sync-anchor.md +20 -0
  561. package/src/hidden-skills/groundwork-doc-sync/instructions.md +100 -0
  562. package/src/hidden-skills/groundwork-elicit/instructions.md +66 -0
  563. package/src/hidden-skills/groundwork-elicit/methods.md +65 -0
  564. package/src/hidden-skills/groundwork-infra-adopt/instructions.md +168 -0
  565. package/src/hidden-skills/groundwork-infra-adopt/templates/infra-adopt-cache.md +21 -0
  566. package/src/hidden-skills/groundwork-mvp/instructions.md +223 -0
  567. package/src/hidden-skills/groundwork-mvp/templates/mvp-cache.md +9 -0
  568. package/src/hidden-skills/groundwork-patch/instructions.md +40 -0
  569. package/src/hidden-skills/groundwork-persona/instructions.md +54 -0
  570. package/src/hidden-skills/groundwork-product/SKILL.md +102 -0
  571. package/src/hidden-skills/groundwork-product/references/ai-native-product.md +45 -0
  572. package/src/hidden-skills/groundwork-product/references/discovery-and-opportunity.md +38 -0
  573. package/src/hidden-skills/groundwork-product/references/product-risks.md +52 -0
  574. package/src/hidden-skills/groundwork-product/references/requirements-and-specs.md +39 -0
  575. package/src/hidden-skills/groundwork-product/references/scope-and-sequencing.md +35 -0
  576. package/src/hidden-skills/groundwork-product/references/shaping-and-appetite.md +48 -0
  577. package/src/hidden-skills/groundwork-product/references/success-metrics-and-signals.md +37 -0
  578. package/src/hidden-skills/groundwork-product/sync-anchor.md +19 -0
  579. package/src/hidden-skills/groundwork-product-brief/instructions.md +231 -0
  580. package/src/hidden-skills/groundwork-product-brief-extract/instructions.md +139 -0
  581. package/src/hidden-skills/groundwork-product-brief-extract/templates/product-brief-extract-cache.md +17 -0
  582. package/src/hidden-skills/groundwork-review/checklists/architecture.md +93 -0
  583. package/src/hidden-skills/groundwork-review/checklists/bet-pitch.md +94 -0
  584. package/src/hidden-skills/groundwork-review/checklists/decomposition.md +135 -0
  585. package/src/hidden-skills/groundwork-review/checklists/design-system.md +85 -0
  586. package/src/hidden-skills/groundwork-review/checklists/domain-entity.md +66 -0
  587. package/src/hidden-skills/groundwork-review/checklists/implementation-readiness.md +46 -0
  588. package/src/hidden-skills/groundwork-review/checklists/infrastructure.md +68 -0
  589. package/src/hidden-skills/groundwork-review/checklists/maturity.md +71 -0
  590. package/src/hidden-skills/groundwork-review/checklists/product-brief.md +69 -0
  591. package/src/hidden-skills/groundwork-review/checklists/technical-design.md +112 -0
  592. package/src/hidden-skills/groundwork-review/instructions.md +181 -0
  593. package/src/hidden-skills/groundwork-scaffold/instructions.md +254 -0
  594. package/src/hidden-skills/groundwork-scaffold/phases/01-ingestion-service-mapping.md +87 -0
  595. package/src/hidden-skills/groundwork-scaffold/phases/02-scaffolding-execution.md +15 -0
  596. package/src/hidden-skills/groundwork-scaffold/phases/03-service-documentation-api-stubs.md +100 -0
  597. package/src/hidden-skills/groundwork-scaffold/phases/04-infrastructure-verification.md +17 -0
  598. package/src/hidden-skills/groundwork-scaffold/phases/05-draft-review.md +19 -0
  599. package/src/hidden-skills/groundwork-scaffold/phases/06-commit.md +19 -0
  600. package/src/hidden-skills/groundwork-scaffold/templates/scaffold-cache.md +23 -0
  601. package/src/hidden-skills/groundwork-scan/instructions.md +164 -0
  602. package/src/hidden-skills/groundwork-scan/references/digest-schema.md +66 -0
  603. package/src/hidden-skills/groundwork-scan/references/exclusions.md +44 -0
  604. package/src/hidden-skills/groundwork-scan/templates/architecture-findings.md +42 -0
  605. package/src/hidden-skills/groundwork-scan/templates/design-findings.md +23 -0
  606. package/src/hidden-skills/groundwork-scan/templates/overview.md +26 -0
  607. package/src/hidden-skills/groundwork-scan/templates/product-findings.md +23 -0
  608. package/src/hidden-skills/groundwork-scan/templates/scan-state.json +19 -0
  609. package/src/hidden-skills/groundwork-stack-forge/instructions.md +150 -0
  610. package/src/hidden-skills/groundwork-stack-forge/references/authoring-engineer-skills.md +107 -0
  611. package/src/hidden-skills/groundwork-surface-activation/instructions.md +138 -0
  612. package/src/hidden-skills/groundwork-update/briefs/reconcile-worker.md +196 -0
  613. package/src/hidden-skills/groundwork-update/instructions.md +200 -0
  614. package/src/hidden-skills/groundwork-writer/SKILL.md +278 -0
  615. package/src/hidden-skills/maturity-model.md +125 -0
  616. package/src/hidden-skills/operating-contract.md +400 -0
  617. package/src/hidden-skills/repo-map-schema.md +90 -0
  618. package/src/hidden-skills/templates/adr.md +57 -0
  619. package/src/hidden-skills/templates/capability-ports.md +71 -0
  620. package/src/hidden-skills/templates/discovery-notes.md +33 -0
  621. package/src/hidden-skills/templates/domain-entity.md +80 -0
  622. package/src/hidden-skills/templates/gap-ledger.md +21 -0
  623. package/src/hidden-skills/templates/handoff.md +37 -0
  624. package/src/hidden-skills/templates/maturity.md +39 -0
  625. package/src/hidden-skills/templates/surfaces.md +207 -0
  626. package/src/skills/groundwork-check/SKILL.md +56 -0
  627. package/src/skills/groundwork-check/instructions.md +70 -0
  628. package/src/skills/groundwork-orchestrator/SKILL.md +176 -0
  629. package/src/skills/groundwork-orchestrator/workflow-index.md +50 -0
@@ -0,0 +1,107 @@
1
+ # Testing & Smoke
2
+
3
+ ## Table of Contents
4
+ - [The Three Tiers](#the-three-tiers)
5
+ - [Unit: Node Project (Main Policy)](#unit-node-project-main-policy)
6
+ - [Unit: Renderer Project (Fake the Bridge)](#unit-renderer-project-fake-the-bridge)
7
+ - [The Playwright _electron Smoke](#the-playwright-_electron-smoke)
8
+ - [_electron Patterns](#_electron-patterns)
9
+ - [CI: xvfb and Skip-with-Reason](#ci-xvfb-and-skip-with-reason)
10
+ - [Keeping the Smoke Thin](#keeping-the-smoke-thin)
11
+ - [Test Commands](#test-commands)
12
+
13
+ ---
14
+
15
+ ## The Three Tiers
16
+
17
+ | Tier | Tool | Environment | Proves |
18
+ |---|---|---|---|
19
+ | Unit (main) | vitest, `main` project | plain Node | The pure security/policy rules |
20
+ | Unit (renderer) | vitest, `renderer` project | jsdom, bridge faked | Components against the bridge contract |
21
+ | Smoke (boot) | Playwright `_electron` | the real built app | Boot, rendering, IPC wiring, theme push |
22
+
23
+ This maps onto the multi-surface verification contract: generation (snapshot, framework-side), compilation (`tsc` + lint), boot (the smoke). Business rules are **not** on this list — they are proven once at the capability core's contract; surface tests assert wiring and rendering only.
24
+
25
+ `vitest.config.ts` defines the two unit projects with per-process environments. Test placement follows the process split: `src/main/**/*.test.ts` runs in Node, `src/renderer/**/*.test.tsx` runs in jsdom. A test that needs the wrong environment is in the wrong process.
26
+
27
+ ## Unit: Node Project (Main Policy)
28
+
29
+ Main's testable logic lives in pure modules (`policy.ts` — no Electron imports), so it runs in plain Node with zero mocking:
30
+
31
+ ```ts
32
+ it.each(['http://example.com', 'file:///etc/passwd', 'javascript:alert(1)'])(
33
+ 'rejects %s', (url) => expect(isAllowedExternalUrl(url)).toBe(false),
34
+ );
35
+ ```
36
+
37
+ When adding privileged logic, keep this shape: decision in a pure module + test; wiring in the thin Electron glue, proven by the smoke. Do not import `electron` in a vitest file — in plain Node the module resolves to the binary path string, not the API, and mocking the whole surface buys nothing the pure-module split doesn't buy better.
38
+
39
+ ## Unit: Renderer Project (Fake the Bridge)
40
+
41
+ The renderer's platform surface is `window.api`, so tests fake exactly that seam:
42
+
43
+ ```tsx
44
+ const fakeApi: RendererApi = {
45
+ getStatus: async () => ({ status: 'ok', version: '0.1.0-test', platform: 'test' }),
46
+ openExternal: async () => ({ opened: false }),
47
+ onThemeChanged: () => () => undefined,
48
+ };
49
+ beforeEach(() => {
50
+ Object.defineProperty(window, 'api', { value: fakeApi, configurable: true });
51
+ });
52
+ ```
53
+
54
+ Typing the fake as `RendererApi` keeps it honest: a contract change breaks the fake at compile time. Async UI rule: query-backed components render their pending state first — `await screen.findByText(...)` past it; asserting on the container immediately races the resolution.
55
+
56
+ Everything else about component testing — Testing Library idiom, what to assert, accessibility queries — is the web stack's, unchanged: `groundwork-nextjs-engineer/references/testing.md`.
57
+
58
+ ## The Playwright _electron Smoke
59
+
60
+ Playwright's Electron support is officially "experimental" but is the de-facto standard (VS Code tests with it); it is the reason GroundWork picked this stack — the strongest agent-closable loop of any desktop option. The driver needs **no browser downloads** (`playwright install` is unnecessary): it launches the app's own Electron binary.
61
+
62
+ The generated smoke (`tests/smoke/app.spec.ts`) is the canonical shape: launch the **built** app, first window, title + rendered heading, one IPC round-trip, the theme push channel, one main-process assertion.
63
+
64
+ ## _electron Patterns
65
+
66
+ ```ts
67
+ import { _electron as electron } from 'playwright';
68
+
69
+ const app = await electron.launch({ args: ['out/main/index.js'] });
70
+ const page = await app.firstWindow(); // a normal Playwright Page
71
+ ```
72
+
73
+ - **Renderer assertions** — everything Playwright can do to a web page: `expect(page).toHaveTitle(...)`, `getByRole`, `getByTestId`, screenshots.
74
+ - **Bridge round-trips** — `page.evaluate(() => globalThis.api.foo())` exercises preload + sender validation + handler end-to-end. (Cast `globalThis`; the smoke compiles under the node tsconfig, which has no DOM types.)
75
+ - **Main-process assertions** — `app.evaluate(({ app, nativeTheme }) => ...)` runs **inside main** with the electron module injected: assert on windows, theme state, app metadata. This hook is unique to Electron among desktop options.
76
+ - **Push-channel proof** — assert the DOM consequence, e.g. `toHaveAttribute('data-theme', /^(light|dark)$/)` after main's initial broadcast.
77
+ - **Always `await app.close()`** in a `finally` — a leaked Electron process wedges CI workers.
78
+ - Launching a **packaged** binary instead of the dev build: `electron.launch({ executablePath })` — worth one lane before releases; the day-to-day smoke uses the built output for speed.
79
+ - Driver/runtime pairings can regress across Electron majors (the 36.x `Process failed to launch!` Linux regression, fixed in 37) — when a major bump breaks launch, check the pairing before debugging the app.
80
+
81
+ ## CI: xvfb and Skip-with-Reason
82
+
83
+ Electron is never truly headless — Linux CI needs a display server. The `smoke` target routes through `tool/electron_exec.sh`, which:
84
+
85
+ 1. Verifies `node_modules` and the Electron binary exist (bootstrap state) — else **"tier skipped"** with the bootstrap command.
86
+ 2. On Linux with no `DISPLAY`/`WAYLAND_DISPLAY`: wraps the run in `xvfb-run --auto-servernum` when available — else **"smoke tier skipped"** naming xvfb.
87
+ 3. Builds, then runs `playwright test`.
88
+
89
+ The contract is *skipped-with-reason, never silently green*: a missing toolchain degrades exactly the way a missing Docker daemon degrades `./dev`. CI installs `xvfb` to run the lane for real; macOS/Windows runners and desktop sessions need no wrapper. Artifacts on failure (screenshot, trace) are configured in `playwright.config.ts`.
90
+
91
+ ## Keeping the Smoke Thin
92
+
93
+ Boot minutes are this stack's expensive test currency. The smoke proves the app **boots and is wired** — it is not an E2E suite:
94
+
95
+ - One spec, happy path, serial (`workers: 1`).
96
+ - New IPC channels get unit tests (policy + renderer fake) by default; extend the smoke only when a channel's *wiring* is novel (new push mechanism, new window).
97
+ - Feature behaviour belongs in renderer unit tests; business rules belong at the core's contract. A fat smoke is the fat-integration-suite antipattern wearing a desktop coat.
98
+
99
+ ## Test Commands
100
+
101
+ ```bash
102
+ npx nx run <app>:test # both vitest projects (node + jsdom)
103
+ npx nx run <app>:test -- --project renderer # one project
104
+ npx nx run <app>:smoke # build + Playwright _electron (display-guarded)
105
+ npx nx run <app>:typecheck # tsc, both process tsconfigs
106
+ npx nx run <app>:lint # eslint incl. process-boundary rules
107
+ ```
@@ -0,0 +1,74 @@
1
+ # Theming & Tokens — the Desktop Delta
2
+
3
+ This reference covers **only what the desktop shell adds** to theming. Tailwind composition rules, styling discipline, visual language, and accessibility are the web stack's, unchanged: `groundwork-nextjs-engineer/references/tailwind-and-styling.md` and `groundwork-nextjs-engineer/references/visual-language.md` (or `docs/principles/stack/typescript/frontend.md` when no web surface is installed).
4
+
5
+ ## Table of Contents
6
+ - [The Projection Chain](#the-projection-chain)
7
+ - [The Generated brand.css](#the-generated-brandcss)
8
+ - [The @theme Mapping](#the-theme-mapping)
9
+ - [nativeTheme Sync (the Desktop Dark Mode)](#nativetheme-sync-the-desktop-dark-mode)
10
+ - [Evolving the Brand](#evolving-the-brand)
11
+
12
+ ---
13
+
14
+ ## The Projection Chain
15
+
16
+ The theme is **generated from the design system's brand tokens**, not authored in the app:
17
+
18
+ ```
19
+ docs/design-system.md → .groundwork/config/brand-tokens.json (visual block)
20
+ → src/renderer/src/assets/brand.css (GENERATED)
21
+ → @theme inline mapping in main.css (static)
22
+ → Tailwind utilities in components
23
+ ```
24
+
25
+ The same tokens drive every surface of the product (web, CLI, mobile, desktop), so cross-surface visual consistency is a build artifact, not a review hope. A hex literal in a component is a review finding — it forks the design system silently.
26
+
27
+ ## The Generated brand.css
28
+
29
+ `brand.css` carries the projected values as CSS custom properties and is regenerated, never hand-edited:
30
+
31
+ - Palette roles in both themes: `--gw-primary`, `--gw-accent`, `--gw-surface`, `--gw-surface-alt`, `--gw-text-body`, `--gw-success`, `--gw-error`, `--gw-warning`, `--gw-info` — light values on `:root`, dark values on `:root[data-theme='dark']`.
32
+ - Typography: `--gw-font-display`/`--gw-font-body` (+ weights). Families render once they are bundled or system-available.
33
+ - Shape: `--gw-radius-base`.
34
+
35
+ Unlike the Dart projection (which resolves OKLCH at generation time), the renderer is CSS — token values pass through verbatim and Chromium resolves OKLCH natively. The file header records the projection source (`visual-block`, `identity-only`, or `default` — the three-tier fallback every token consumer implements).
36
+
37
+ ## The @theme Mapping
38
+
39
+ `main.css` maps the custom properties into Tailwind v4 theme tokens once:
40
+
41
+ ```css
42
+ @theme inline {
43
+ --color-primary: var(--gw-primary);
44
+ --color-surface: var(--gw-surface);
45
+ --color-foreground: var(--gw-text-body);
46
+ --font-display: var(--gw-font-display);
47
+ --radius-base: var(--gw-radius-base);
48
+ /* ... */
49
+ }
50
+ ```
51
+
52
+ Components consume the utilities these tokens create (`bg-surface`, `text-primary`, `font-display`, `rounded-base`) and **never read `--gw-*` variables directly** — the mapping is the API, the variables are the projection artifact. Tailwind v4 is CSS-first: there is no `tailwind.config.js`; the plugin loads in the **renderer section** of `electron.vite.config.ts` and applies to the renderer only (main and preload have no styling surface). Needing a new semantic token means extending the `@theme` mapping from a `--gw-*` value — and if no token expresses the need, that is a design-system gap to raise, not a license to inline a value.
53
+
54
+ ## nativeTheme Sync (the Desktop Dark Mode)
55
+
56
+ On desktop, the OS owns dark mode and **main is the source of truth** — this is the structural difference from the web stack's `next-themes` approach:
57
+
58
+ 1. Main broadcasts `nativeTheme.shouldUseDarkColors` on the `theme:changed` push channel — once after `did-finish-load`, and on every `nativeTheme.on('updated')`.
59
+ 2. The renderer's entry point subscribes via the bridge and mirrors the value onto `<html data-theme="dark|light">`.
60
+ 3. `brand.css` resolves every `--gw-*` per theme from that attribute; utilities update without component involvement.
61
+
62
+ Implementation rules:
63
+
64
+ - Components never branch on theme to pick values — the custom properties already resolved per-theme. (Conditional *structure* via a `data-theme` selector is fine; conditional *colours* is the antipattern.)
65
+ - Every role carries light **and** dark values — a design-system commitment, not an option; verify visual changes in both themes (flip the OS setting, or `app.evaluate(({ nativeTheme }) => { nativeTheme.themeSource = 'dark'; })` in a smoke-side check).
66
+ - A user-facing theme override (light/dark/system menu) is implemented by setting `nativeTheme.themeSource` in main via an IPC channel — keeping main the single source of truth — never by writing `data-theme` directly from a component.
67
+
68
+ ## Evolving the Brand
69
+
70
+ 1. The design-system run updates `brand-tokens.json`.
71
+ 2. Regenerate (or mechanically update) `brand.css` to match — the header marks it generated; keep the `:root` / `:root[data-theme='dark']` structure intact.
72
+ 3. The `@theme` mapping and all components pick the change up for free. New palette roles need one new mapping line in `main.css`.
73
+
74
+ If a visual change cannot be expressed through tokens → brand.css → @theme → utilities, raise the design-system gap; do not hand-edit the projection.
@@ -0,0 +1,14 @@
1
+ # Sync Anchor
2
+
3
+ This file pins the principle files this skill embeds. When any listed file
4
+ changes, this skill must be reviewed in the same commit. CI verifies the
5
+ hashes match.
6
+
7
+ | Principle file | SHA-256 | Last reviewed |
8
+ |---|---|---|
9
+ | src/generators/electron-app/docs/principles/stack/electron/index.md | b983b5455f03d97c36647021a1c05aa6f2f0a0a23b9a0ffc284b161a0185fbd2 | 2026-06-24 |
10
+ | src/generators/electron-app/docs/principles/stack/electron/process-model.md | d510797d59a06786fb6bd35f537566ee7f1024ce35a8985c9c94d305e3de5c43 | 2026-06-12 |
11
+ | src/generators/electron-app/docs/principles/stack/electron/ipc-contracts.md | 11d728db5d33c0c9cb3a082a58a55c96d6195f61558ca38fae91806db72da9e3 | 2026-06-12 |
12
+ | src/generators/electron-app/docs/principles/stack/electron/security.md | 316c118dcfb6de110d3d62b8a4c95ca79b58f5368e1b41881cd842628b3902f8 | 2026-06-12 |
13
+ | src/generators/electron-app/docs/principles/stack/electron/packaging-and-updates.md | b5f91ed102290dd73e52890fd389bce5be825a3d76a0f0353673cfe32ae09871 | 2026-06-12 |
14
+ | src/generators/electron-app/docs/principles/stack/typescript/frontend.md | 98232d067ad03c08d6c1ca5f2caec30e7c3400da55c3afb7754482bc121d7554 | 2026-06-12 |
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: groundwork-flutter-engineer
3
+ description: >
4
+ Implement, review, and refactor Flutter mobile applications using the
5
+ official two-layer MVVM architecture, Riverpod state management, go_router
6
+ navigation, token-projected theming, widget and integration testing, Pigeon
7
+ platform channels, and store release engineering. Use for work touching
8
+ views, view models, repositories, services, providers, routing, theming,
9
+ widget tests, integration tests, native interop, or mobile release
10
+ pipelines. Make sure to use this skill whenever a user is working in a
11
+ Flutter or Dart codebase, building mobile UI features, fixing mobile bugs,
12
+ or reviewing Flutter code.
13
+ ---
14
+
15
+ # Flutter Engineer
16
+
17
+ Mobile execution engineer for Flutter applications. This skill guides implementation within the official Flutter architecture — MVVM features over a repository data layer, a compile-safe Riverpod provider graph, token-projected theming, and a test pyramid whose expensive tiers stay thin because the surface proves wiring, not business logic.
18
+
19
+ ## Operating Contract
20
+
21
+ 1. Locate the architectural layer before editing. Views, view models, repositories, services, and domain models each have distinct responsibilities; a change that blurs them is wrong even when it works.
22
+ 2. The capability core owns business logic. The surface is wired to it through a typed client in the data layer — never re-implement a rule the core's contract already proves.
23
+ 3. Route durable mobile policy to the canonical docs (`docs/principles/stack/flutter/`) instead of duplicating it in code comments or this skill.
24
+ 4. Verify lints, widget tests, theme consumption, and accessibility semantics 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. **MVVM Over Two Layers** — Every feature is one View (widgets only) paired with one ViewModel (state + commands). Repositories are the data layer's source of truth; services wrap external interfaces. A Domain layer is added only when it earns its place. This is the official Flutter architecture, adopted wholesale — code written against it is code every Flutter engineer recognises.
33
+
34
+ 2. **The Provider Graph Is the App** — Riverpod 3.x providers carry shared state and double as dependency injection. Construction order, disposal, and test substitution fall out of the graph. There is no service locator, no `provider`-package DI, and no GetX — ever.
35
+
36
+ 3. **Theming Is a Projection** — `ThemeData` is built from a palette module generated from the design system's brand tokens. Widgets consume `Theme.of(context)` and theme extensions; a `Color(0xFF...)` literal in a widget file is a review finding.
37
+
38
+ 4. **Tests Prove Wiring, Not Rules** — Widget tests are the bulk of coverage; `integration_test` happy paths run on a headless Android emulator; Patrol enters only at the Flutter/OS boundary. Business rules are proven once at the core's contract — surface tests never re-prove them.
39
+
40
+ 5. **Native Is a Disciplined Hatch** — Dropping to Swift/Kotlin is a capability decision made through Pigeon's typed boundary, wrapped as a data-layer service. Never a performance reflex, never a raw `MethodChannel` for a real API surface.
41
+
42
+ ## How to Use This Skill
43
+
44
+ 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
+ | Architecture & Layers | `references/architecture.md` | Placing new code, understanding the MVVM/repository split, file organization, the core-access seam. |
49
+ | State Management | `references/state-management.md` | Providers, Notifiers, Mutations, ephemeral vs app state, provider testing seams. |
50
+ | Widgets & Composition | `references/widgets-and-composition.md` | Building or refactoring widgets, const discipline, build purity, keys, extraction. |
51
+ | Theming & Design Tokens | `references/theming-and-design-tokens.md` | Theme consumption, the generated palette, ThemeExtensions, dark mode, typography. |
52
+ | Navigation | `references/navigation.md` | go_router routes, shell routes, redirects, typed routes, deep links. |
53
+ | Data & Contracts | `references/data-and-contracts.md` | Repositories, services, the dio contract client, error mapping, contract-client tooling. |
54
+ | Testing | `references/testing.md` | Unit/widget/integration taxonomy, fakes, emulator CI, Patrol, goldens, test commands. |
55
+ | Platform Channels | `references/platform-channels.md` | Pigeon APIs, native modules, when to drop to Swift/Kotlin, SwiftPM wiring. |
56
+ | Releases & Distribution | `references/releases-and-distribution.md` | Signing, CI/CD pipelines, versioning, forced upgrade, Shorebird code push. |
57
+ | Accessibility | `references/accessibility.md` | Semantics, tap targets, dynamic type, contrast, a11y-driven testing. |
58
+
59
+ ## Task Routing
60
+
61
+ - **New feature/screen** → Load `references/architecture.md`. One View + one ViewModel under `ui/<feature>/`; repository access only through the view model.
62
+ - **State or data-flow work** → Load `references/state-management.md`. Verify what is app state (provider) vs ephemeral (`setState`).
63
+ - **UI/visual work** → Load `references/widgets-and-composition.md` and `references/theming-and-design-tokens.md`. Check the generated palette before adding any colour.
64
+ - **API/contract work** → Load `references/data-and-contracts.md`. The client is the seam; repositories translate payloads to domain models.
65
+ - **Routing/deep-link work** → Load `references/navigation.md`. Check the existing route table conventions first.
66
+ - **Test work** → Load `references/testing.md`. Pick the cheapest tier that can carry the assertion.
67
+ - **Native capability work** → Load `references/platform-channels.md`. Check pub.dev for a maintained plugin before writing native code.
68
+ - **Release/store work** → Load `references/releases-and-distribution.md`. Signing material never enters the repo.
69
+
70
+ ## Safety Gates
71
+
72
+ - Do not put business logic in widgets or `build` methods — it belongs in the view model, or more likely in the capability core.
73
+ - Do not introduce hardcoded colours, text styles, radii, or spacing. The theme module is generated from brand tokens.
74
+ - Do not add state-management or DI packages (`provider`, `get_it`, GetX, Bloc) without a recorded decision; Riverpod is the standing default.
75
+ - Do not re-implement a rule the core's contract proves, and do not hand-map a large promoted contract — generated clients exist for that.
76
+ - Do not build on experimental Riverpod APIs (offline persistence) in load-bearing paths.
77
+ - Run `flutter analyze` and `flutter test` where the SDK is available; report the tier as skipped (never silently green) where it is not.
78
+
79
+ ## Hallucination Controls
80
+
81
+ Before presenting Flutter guidance as factual:
82
+
83
+ - Check `pubspec.yaml` for actual package versions and available dependencies.
84
+ - Check the existing `ui/`, `data/`, and `domain/` directories for naming conventions and patterns before proposing new ones.
85
+ - Check the generated theme module for colour and shape values before recommending visual changes.
86
+ - Check the route table in the router module before inventing paths or navigation flows.
87
+ - Label any recommendation based on general Flutter knowledge (rather than project-specific patterns) as an inference.
88
+
89
+ ## Output Expectations
90
+
91
+ - Feature changes name the layer each file belongs to and why.
92
+ - UI changes reference the theme roles or extensions used, or justify an explicit deviation.
93
+ - New features include accessibility considerations (semantic labels, tap targets, dynamic type behaviour).
94
+ - Verification steps include the specific Nx targets or `flutter` commands to run, with the skipped-with-reason caveat when the SDK is absent.
95
+ - Recommendations distinguish project conventions from general Flutter practice.
96
+
97
+ ## Antipatterns
98
+
99
+ Reject these patterns:
100
+
101
+ - **Logic in build methods** — Domain branching inside widgets instead of the view model. Build renders state.
102
+ - **setState as architecture** — App state held in `StatefulWidget`s and threaded through constructors. Ephemeral state only.
103
+ - **Hardcoded visual values** — Hex colours, raw `TextStyle`s, magic paddings that fork the design system silently.
104
+ - **Hand-written clients for large promoted contracts** — The contract is promoted precisely so clients can be generated from it.
105
+ - **Re-proving core logic on the surface** — Surface tests assert wiring and rendering; the contract suite already proved the rules.
106
+ - **Fat integration suites** — Emulator minutes are the most expensive test currency; widget tests carry the bulk.
107
+ - **Raw MethodChannels for real APIs** — Stringly-typed, runtime-failing. Pigeon exists.
108
+ - **Preemptive Domain layers** — Pass-through use-case classes add indirection and remove nothing.
@@ -0,0 +1,92 @@
1
+ # Accessibility
2
+
3
+ ## Table of Contents
4
+ - [The Baseline](#the-baseline)
5
+ - [Semantics](#semantics)
6
+ - [Tap Targets](#tap-targets)
7
+ - [Dynamic Type](#dynamic-type)
8
+ - [Contrast](#contrast)
9
+ - [Accessibility as the Test Seam](#accessibility-as-the-test-seam)
10
+ - [Review Checklist](#review-checklist)
11
+
12
+ ---
13
+
14
+ ## The Baseline
15
+
16
+ Accessibility is a merge gate, not a backlog item. The baseline for every feature: semantic labels on interactive widgets, 48dp tap targets, WCAG AA contrast (inherited from the token palette), and layouts that survive large text scales. An accessibility failure blocks the slice the way a failing test does.
17
+
18
+ ## Semantics
19
+
20
+ Every interactive widget exposes a meaningful semantic label — through the widget's built-in semantics (`Text`, `Tooltip`, button labels) or an explicit `Semantics` wrapper when the visual content alone is ambiguous:
21
+
22
+ ```dart
23
+ // Icon-only button: the tooltip doubles as the semantic label.
24
+ IconButton(
25
+ icon: const Icon(Icons.refresh),
26
+ tooltip: 'Refresh gateway status',
27
+ onPressed: onRefresh,
28
+ )
29
+
30
+ // Composite tile whose meaning isn't the sum of its texts:
31
+ Semantics(
32
+ label: 'Order ${order.id}, ${order.statusLabel}',
33
+ button: true,
34
+ child: OrderTile(order: order),
35
+ )
36
+ ```
37
+
38
+ Guidelines:
39
+
40
+ - Labels describe **meaning, not appearance** ("Refresh gateway status", not "circular arrow icon").
41
+ - Don't over-wrap: redundant `Semantics` around already-labelled widgets produces double announcements. Use `MergeSemantics` to combine fragments that should read as one.
42
+ - Purely decorative visuals get `ExcludeSemantics`.
43
+ - Dynamic state (loading, error) is announced — render it as text or update the label, don't communicate it by colour alone.
44
+
45
+ ## Tap Targets
46
+
47
+ Interactive targets meet the **48dp minimum** in both dimensions. Material widgets enforce this by default (`materialTapTargetSize`); the rule bites with custom `GestureDetector`/`InkWell` wrappers around small visuals:
48
+
49
+ ```dart
50
+ // Small visual, full-size target:
51
+ InkWell(
52
+ onTap: onTap,
53
+ child: const SizedBox(
54
+ width: 48,
55
+ height: 48,
56
+ child: Center(child: Icon(Icons.close, size: 20)),
57
+ ),
58
+ )
59
+ ```
60
+
61
+ ## Dynamic Type
62
+
63
+ Layouts must not break at large text scales. Practical rules:
64
+
65
+ - Never set fixed heights on text-bearing containers; let text size drive layout.
66
+ - Test at scale: pump widget tests with `MediaQuery(textScaler: TextScaler.linear(2.0))` for layout-sensitive components, and exercise device large-text settings during manual passes.
67
+ - Truncation (`overflow: TextOverflow.ellipsis`) is for genuinely unbounded user content, not a fix for layouts that can't absorb scale.
68
+
69
+ ## Contrast
70
+
71
+ Contrast meets WCAG AA **via the token palette** — it is enforced at the design-system layer and inherited here. The implementation duty: consume theme roles (see `references/theming-and-design-tokens.md`) so the audited pairs stay paired. Hand-mixed colours (opacity hacks, lightened variants) silently break audited contrast and are review findings on two counts.
72
+
73
+ ## Accessibility as the Test Seam
74
+
75
+ Flutter's semantics tree is also the widget-test seam: tests find by `find.bySemanticsLabel` and visible text, so **inaccessible UI is untestable UI**. This makes the baseline self-enforcing — a widget you cannot address semantically in a test is a widget a screen reader cannot address either. When a test reaches for `find.byType` or a key because nothing semantic exists, treat it as the accessibility defect it is and label the widget.
76
+
77
+ ```dart
78
+ testWidgets('refresh is reachable by semantics', (tester) async {
79
+ await tester.pumpWidget(harness());
80
+ expect(find.bySemanticsLabel('Refresh gateway status'), findsOneWidget);
81
+ });
82
+ ```
83
+
84
+ ## Review Checklist
85
+
86
+ - [ ] Every interactive widget has a meaningful semantic label.
87
+ - [ ] Icon-only buttons carry `tooltip` or `Semantics`.
88
+ - [ ] Custom gesture surfaces meet 48dp.
89
+ - [ ] No state communicated by colour alone.
90
+ - [ ] Layout verified (or tested) at 2.0 text scale.
91
+ - [ ] All colours via theme roles — no hand-mixed variants.
92
+ - [ ] Widget tests find by semantics, not widget types.
@@ -0,0 +1,189 @@
1
+ # Architecture
2
+
3
+ ## Table of Contents
4
+ - [The Layer Model](#the-layer-model)
5
+ - [File Organization](#file-organization)
6
+ - [Views and ViewModels](#views-and-viewmodels)
7
+ - [Repositories and Services](#repositories-and-services)
8
+ - [The Core-Access Seam](#the-core-access-seam)
9
+ - [Domain Models and Immutability](#domain-models-and-immutability)
10
+ - [When a Domain Layer Is Earned](#when-a-domain-layer-is-earned)
11
+ - [Placement Checklist](#placement-checklist)
12
+
13
+ ---
14
+
15
+ ## The Layer Model
16
+
17
+ This codebase follows the official Flutter architecture: a **UI layer** of MVVM features over a **data layer** of repositories and services. A Domain layer of use-cases exists only where it has earned its place. Dependency direction is strict and single-direction:
18
+
19
+ ```
20
+ View → ViewModel → Repository (abstract) → Service (ApiClient, platform APIs)
21
+
22
+ domain models
23
+ ```
24
+
25
+ - A View never imports a repository, a service, or `dio`.
26
+ - A ViewModel never imports widgets or `BuildContext`.
27
+ - A repository never imports another repository — cross-repository orchestration belongs in a view model (or an earned use-case).
28
+ - Services are stateless and never aware of repositories.
29
+
30
+ The app is a **surface adapter** over the workspace's capability core. Business rules live behind the promoted contracts and are proven there; if you find yourself implementing a pricing rule, a permission check, or validation semantics in Dart, stop — that logic belongs in the core, and the surface renders its results.
31
+
32
+ ---
33
+
34
+ ## File Organization
35
+
36
+ `ui/` is feature-first; `data/` and `domain/` are type-first:
37
+
38
+ ```
39
+ lib/
40
+ ├── main.dart # ProviderScope root — nothing else
41
+ ├── app.dart # MaterialApp.router + theme wiring
42
+ ├── router.dart # the go_router route table
43
+ ├── config/app_config.dart # --dart-define configuration
44
+ ├── ui/
45
+ │ ├── core/theme/ # generated palette + theme builder
46
+ │ └── <feature>/
47
+ │ ├── <feature>_view.dart
48
+ │ └── <feature>_view_model.dart
49
+ ├── data/
50
+ │ ├── repositories/ # <entity>_repository.dart: abstract + impl
51
+ │ └── services/ # api_client.dart, platform service wrappers
52
+ └── domain/
53
+ └── models/ # immutable models
54
+ ```
55
+
56
+ Naming is the official convention and is load-bearing — predictable names are how the next agent finds the right file on the first try: `HomeView`/`HomeViewModel`, `UserRepository`/`RemoteUserRepository`, `AuthService`. Do not invent variants (`HomeScreen`, `HomeController`, `UserStore`).
57
+
58
+ For large apps, split features into local packages with Dart pub workspaces (`resolution: workspace`); Melos 7.x (configured under the `melos:` key in the root pubspec) handles scripts and versioning. Layer-first roots (`/screens`, `/widgets`, `/models`) are legacy — do not recreate them.
59
+
60
+ ---
61
+
62
+ ## Views and ViewModels
63
+
64
+ Every feature is exactly one View paired with exactly one ViewModel.
65
+
66
+ **The View** is widgets only — layout, animation, conditional rendering, simple navigation calls. It watches its view model provider and dispatches commands:
67
+
68
+ ```dart
69
+ class ProfileView extends ConsumerWidget {
70
+ const ProfileView({super.key});
71
+
72
+ @override
73
+ Widget build(BuildContext context, WidgetRef ref) {
74
+ final state = ref.watch(profileViewModelProvider);
75
+ return state.when(
76
+ loading: () => const CircularProgressIndicator(),
77
+ error: (e, _) => ErrorPanel(error: e),
78
+ data: (profile) => ProfileBody(
79
+ profile: profile,
80
+ onRename: (name) =>
81
+ ref.read(profileViewModelProvider.notifier).rename(name),
82
+ ),
83
+ );
84
+ }
85
+ }
86
+ ```
87
+
88
+ **The ViewModel** is an `AsyncNotifier` (or `Notifier` for synchronous state) exposing an immutable state object and methods as commands:
89
+
90
+ ```dart
91
+ class ProfileViewModel extends AsyncNotifier<ProfileState> {
92
+ @override
93
+ Future<ProfileState> build() async {
94
+ final user = await ref.watch(userRepositoryProvider).current();
95
+ return ProfileState(user: user);
96
+ }
97
+
98
+ Future<void> rename(String name) async {
99
+ state = const AsyncLoading();
100
+ state = await AsyncValue.guard(() async {
101
+ final user = await ref.read(userRepositoryProvider).rename(name);
102
+ return ProfileState(user: user);
103
+ });
104
+ }
105
+ }
106
+ ```
107
+
108
+ Red flags: a `build` method with an `if` on a domain rule; a view model importing `material.dart`; a widget calling a repository.
109
+
110
+ ---
111
+
112
+ ## Repositories and Services
113
+
114
+ **Repositories** are the source of truth. They own caching, retry, polling, and translating contract payloads into domain models. Always an abstract class plus an implementation, exposed as a provider:
115
+
116
+ ```dart
117
+ abstract class OrderRepository {
118
+ Future<List<Order>> recent();
119
+ Stream<Order> watch(String id);
120
+ }
121
+
122
+ class RemoteOrderRepository implements OrderRepository {
123
+ RemoteOrderRepository(this._client);
124
+ final ApiClient _client;
125
+ // translate contract DTOs → domain models here, nowhere else
126
+ }
127
+
128
+ final orderRepositoryProvider = Provider<OrderRepository>(
129
+ (ref) => RemoteOrderRepository(ref.watch(apiClientProvider)),
130
+ );
131
+ ```
132
+
133
+ The abstract class is the test seam: an in-memory `FakeOrderRepository` serves unit and widget tests without a mocking framework.
134
+
135
+ **Services** are stateless wrappers over external interfaces — the contract client, platform APIs (via Pigeon), local storage — exposing `Future`/`Stream`. They hold no app state and know nothing about repositories or features.
136
+
137
+ ---
138
+
139
+ ## The Core-Access Seam
140
+
141
+ The typed contract client lives in `data/services/` and is consumed only by repositories:
142
+
143
+ - The client is **thin and hand-rolled while the contract surface is small**: one method per promoted-contract operation, typed models in `domain/models/`. (This is the recorded tooling stance; see `references/data-and-contracts.md`.)
144
+ - When the promoted `openapi.yaml` grows past a handful of operations, switch to generated clients (`openapi_generator` dart-dio) — the repositories keep their shape, so nothing above the data layer changes.
145
+ - **Nothing above the data layer knows the transport.** A view model cannot tell whether the core is REST or gRPC, hosted or embedded. If a view model is constructing URLs or reading `DioException`s, the seam has leaked.
146
+
147
+ ---
148
+
149
+ ## Domain Models and Immutability
150
+
151
+ Domain models are immutable. Plain `const` classes suffice while models are trivial; introduce **freezed** when models carry real shape — unions, `copyWith`, exhaustive matching, JSON round-trips — because at that point its codegen earns the build_runner step:
152
+
153
+ ```dart
154
+ @freezed
155
+ sealed class Order with _$Order {
156
+ const factory Order.draft({required String id}) = DraftOrder;
157
+ const factory Order.placed({required String id, required DateTime at}) = PlacedOrder;
158
+ factory Order.fromJson(Map<String, dynamic> json) => _$OrderFromJson(json);
159
+ }
160
+ ```
161
+
162
+ Never add a mutable field to a domain model to "simplify" an update path — that is the unidirectional flow breaking.
163
+
164
+ ---
165
+
166
+ ## When a Domain Layer Is Earned
167
+
168
+ Add a use-case class only when at least one of these is true:
169
+
170
+ 1. Logic **merges multiple repositories** (and would otherwise live awkwardly in one view model).
171
+ 2. The logic is **genuinely complex** and burying it in a view model harms testability.
172
+ 3. The logic is **reused across view models**.
173
+
174
+ A use-case that forwards a single repository call is indirection tax — delete it. Default is two layers.
175
+
176
+ ---
177
+
178
+ ## Placement Checklist
179
+
180
+ Before creating a file, answer:
181
+
182
+ | The code... | It goes in |
183
+ |---|---|
184
+ | renders widgets | `ui/<feature>/<feature>_view.dart` |
185
+ | holds feature state / handles user events | `ui/<feature>/<feature>_view_model.dart` |
186
+ | decides which data is the truth (cache, retry, merge) | `data/repositories/` |
187
+ | talks to the network, OS, or storage | `data/services/` |
188
+ | is a value the app passes around | `domain/models/` |
189
+ | is a business rule | the capability core, not this app |