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,136 @@
1
+ # Data and Contracts
2
+
3
+ ## Table of Contents
4
+ - [The Seam](#the-seam)
5
+ - [The Thin Client (Current Stance)](#the-thin-client-current-stance)
6
+ - [When to Switch to Generated Clients](#when-to-switch-to-generated-clients)
7
+ - [Repositories: Translation and Truth](#repositories-translation-and-truth)
8
+ - [Error Mapping](#error-mapping)
9
+ - [Configuration](#configuration)
10
+ - [dio Conventions](#dio-conventions)
11
+ - [Anti-patterns](#anti-patterns)
12
+
13
+ ---
14
+
15
+ ## The Seam
16
+
17
+ The app reaches the capability core through exactly one seam:
18
+
19
+ ```
20
+ ViewModel → Repository (abstract) → ApiClient (data/services/) → gateway
21
+ ```
22
+
23
+ Nothing above the data layer knows the transport. A view model cannot tell whether the core is hosted or embedded, REST or gRPC. If transport details (URLs, status codes, `DioException`) appear above `data/`, the seam has leaked — fix the leak before the feature.
24
+
25
+ ## The Thin Client (Current Stance)
26
+
27
+ The recorded contract-tooling stance (O8, settled 2026-06-12): while the promoted contract surface is small, the client is **hand-rolled and thin** — one method per contract operation, typed models in `domain/models/`, no codegen dependency:
28
+
29
+ ```dart
30
+ class ApiClient {
31
+ ApiClient(this._dio);
32
+ final Dio _dio;
33
+
34
+ Future<Order> order(String id) async {
35
+ final res = await _dio.get<Map<String, dynamic>>('/api/v1/orders/$id');
36
+ return Order.fromJson(res.data ?? const {});
37
+ }
38
+
39
+ Future<Order> placeOrder(PlaceOrderRequest req) async {
40
+ final res = await _dio.post<Map<String, dynamic>>(
41
+ '/api/v1/orders',
42
+ data: req.toJson(),
43
+ );
44
+ return Order.fromJson(res.data ?? const {});
45
+ }
46
+ }
47
+ ```
48
+
49
+ Discipline that keeps "thin" honest:
50
+
51
+ - Every method maps 1:1 to a promoted-contract operation — the method set is the contract's operation list, nothing speculative.
52
+ - Request/response models live in `domain/models/` with explicit `fromJson`/`toJson` that match the contract schema field-for-field.
53
+ - When the contract changes, the client changes in the same slice — the promoted `openapi.yaml` is the source of truth, and drift between it and this client is a defect.
54
+
55
+ ## When to Switch to Generated Clients
56
+
57
+ The thin client is the lightest path **while the surface is small**. Once the promoted `openapi.yaml` grows past a handful of operations (or starts carrying complex schemas you are hand-mapping), switch to generation: `openapi_generator`'s **dart-dio** output via build_runner, consuming the promoted spec directly.
58
+
59
+ The migration is contained by construction: repositories keep consuming a client; only the client's implementation becomes generated. Nothing above the data layer changes. Hand-mapping a large promoted contract is the defect the principles warn about — the contract is promoted precisely so clients can be generated from it.
60
+
61
+ ## Repositories: Translation and Truth
62
+
63
+ Repositories own the boundary between contract types and domain models:
64
+
65
+ ```dart
66
+ class RemoteOrderRepository implements OrderRepository {
67
+ RemoteOrderRepository(this._client);
68
+ final ApiClient _client;
69
+
70
+ List<Order>? _cache;
71
+
72
+ @override
73
+ Future<List<Order>> recent({bool refresh = false}) async {
74
+ if (!refresh && _cache != null) return _cache!;
75
+ _cache = await _client.recentOrders();
76
+ return _cache!;
77
+ }
78
+ }
79
+ ```
80
+
81
+ - Caching, retry policy, polling, and merge logic live here — not in view models, not in the client.
82
+ - Contract DTO → domain model translation happens here and nowhere else.
83
+ - Repositories are many-to-many with view models and never aware of each other.
84
+
85
+ ## Error Mapping
86
+
87
+ The data layer converts transport failures into domain-meaningful states; `DioException` never crosses upward:
88
+
89
+ ```dart
90
+ @override
91
+ Future<HealthStatus> status() async {
92
+ try {
93
+ return await _client.health();
94
+ } on DioException catch (e) {
95
+ if (e.type == DioExceptionType.connectionTimeout ||
96
+ e.type == DioExceptionType.connectionError) {
97
+ return const HealthStatus.unreachable();
98
+ }
99
+ rethrow; // programming errors still surface loudly
100
+ }
101
+ }
102
+ ```
103
+
104
+ Rules of thumb:
105
+
106
+ - **Expected failures** (offline, gateway down, 404 on an optional resource) become domain states the UI renders.
107
+ - **Contract violations** (schema mismatch, unexpected 500s) surface as errors — they indicate a defect, and the view renders the error state.
108
+ - Business rules about failures (retry budgets, "is this recoverable") still do not belong in views.
109
+
110
+ ## Configuration
111
+
112
+ The gateway URL arrives at build time via `--dart-define`:
113
+
114
+ ```dart
115
+ static const String apiBaseUrl = String.fromEnvironment(
116
+ 'API_BASE_URL',
117
+ defaultValue: 'http://localhost:4000',
118
+ );
119
+ ```
120
+
121
+ - Android emulator → host: `http://10.0.2.2:4000`. iOS simulator → `http://localhost:4000`.
122
+ - No `.env` files baked into the binary; no secrets in `--dart-define` either — a mobile binary is fully inspectable, so anything secret stays server-side.
123
+
124
+ ## dio Conventions
125
+
126
+ - One `Dio` instance, configured in the client provider: `baseUrl`, timeouts, `Accept: application/json`.
127
+ - Cross-cutting concerns (auth header injection, logging, retry) are **interceptors** on that instance — not per-call options scattered through methods.
128
+ - dio throws on non-2xx by default; keep that behaviour and map in repositories rather than checking status codes inline.
129
+
130
+ ## Anti-patterns
131
+
132
+ - **Transport above the data layer** — a view model importing `dio` or parsing status codes.
133
+ - **Hand-mapping a grown contract** — switch to dart-dio generation; the seam is built for it.
134
+ - **Speculative client methods** — operations the promoted contract does not define.
135
+ - **Business rules in the surface** — validation semantics, pricing, permissions re-implemented in Dart. The core proves them; the surface renders results.
136
+ - **Repositories calling repositories** — orchestration belongs in a view model or an earned use-case.
@@ -0,0 +1,122 @@
1
+ # Navigation
2
+
3
+ ## Table of Contents
4
+ - [The Router Is go_router](#the-router-is-go_router)
5
+ - [The Route Table](#the-route-table)
6
+ - [Typed Routes](#typed-routes)
7
+ - [Tab Scaffolds: StatefulShellRoute](#tab-scaffolds-statefulshellroute)
8
+ - [Auth Guards: Centralized redirect](#auth-guards-centralized-redirect)
9
+ - [The Route as State](#the-route-as-state)
10
+ - [Deep Links](#deep-links)
11
+ - [What Remains for Navigator 1.0](#what-remains-for-navigator-10)
12
+
13
+ ---
14
+
15
+ ## The Router Is go_router
16
+
17
+ go_router (flutter.dev verified publisher, declared feature-complete — a stable platform piece) owns app-level navigation. The router lives in one module as a provider:
18
+
19
+ ```dart
20
+ final routerProvider = Provider<GoRouter>((ref) {
21
+ return GoRouter(
22
+ routes: [/* the route table */],
23
+ redirect: (context, state) => _guard(ref, state),
24
+ );
25
+ });
26
+ ```
27
+
28
+ `MaterialApp.router(routerConfig: ref.watch(routerProvider))` is the only place the router meets the widget tree. Hand-rolled `RouterDelegate`/Navigator 2.0 code is legacy — it is the API go_router exists to hide. Do not write it, and refactor it away on contact.
29
+
30
+ ## The Route Table
31
+
32
+ One table, hierarchical, every destination declared:
33
+
34
+ ```dart
35
+ GoRoute(
36
+ path: '/orders',
37
+ name: 'orders',
38
+ builder: (context, state) => const OrdersView(),
39
+ routes: [
40
+ GoRoute(
41
+ path: ':orderId',
42
+ name: 'order-detail',
43
+ builder: (context, state) =>
44
+ OrderDetailView(orderId: state.pathParameters['orderId']!),
45
+ ),
46
+ ],
47
+ )
48
+ ```
49
+
50
+ Conventions:
51
+
52
+ - Paths are URL-shaped and lowercase-kebab; names exist for every route.
53
+ - The view receives parsed parameters via its constructor — it does not read `GoRouterState` internally.
54
+ - New screens are added to the table, never pushed ad hoc from a feature file.
55
+
56
+ ## Typed Routes
57
+
58
+ As the table grows past a few routes, adopt `go_router_builder` typed routes — route paths and parameters as generated, compile-checked classes:
59
+
60
+ ```dart
61
+ @TypedGoRoute<OrderDetailRoute>(path: '/orders/:orderId')
62
+ class OrderDetailRoute extends GoRouteData {
63
+ const OrderDetailRoute({required this.orderId});
64
+ final String orderId;
65
+
66
+ @override
67
+ Widget build(BuildContext context, GoRouterState state) =>
68
+ OrderDetailView(orderId: orderId);
69
+ }
70
+
71
+ // Navigation becomes compile-checked:
72
+ const OrderDetailRoute(orderId: '42').go(context);
73
+ ```
74
+
75
+ Stringly-typed `context.go('/orders/$id')` calls scattered through features are the navigation equivalent of hand-rolled JSON — acceptable only while the table is a handful of routes, refactored to typed routes as it grows.
76
+
77
+ ## Tab Scaffolds: StatefulShellRoute
78
+
79
+ Bottom-bar/tab UIs use `StatefulShellRoute.indexedStack` — per-tab navigation stacks whose state survives tab switches:
80
+
81
+ ```dart
82
+ StatefulShellRoute.indexedStack(
83
+ builder: (context, state, shell) => AppScaffold(shell: shell),
84
+ branches: [
85
+ StatefulShellBranch(routes: [GoRoute(path: '/home', ...)]),
86
+ StatefulShellBranch(routes: [GoRoute(path: '/settings', ...)]),
87
+ ],
88
+ )
89
+ ```
90
+
91
+ Do not hand-roll tab stacks with nested Navigators.
92
+
93
+ ## Auth Guards: Centralized redirect
94
+
95
+ Auth is one `redirect` function on the router — never per-screen checks:
96
+
97
+ ```dart
98
+ String? _guard(Ref ref, GoRouterState state) {
99
+ final signedIn = ref.read(sessionProvider).isSignedIn;
100
+ final signingIn = state.matchedLocation == '/sign-in';
101
+ if (!signedIn && !signingIn) return '/sign-in?from=${state.matchedLocation}';
102
+ if (signedIn && signingIn) return '/';
103
+ return null;
104
+ }
105
+ ```
106
+
107
+ Wire the session provider to the router with `refreshListenable` (or rebuild the router provider on session change) so guard decisions re-evaluate when auth state changes.
108
+
109
+ ## The Route as State
110
+
111
+ The URL is a first-class state container. Selected entity id, active tab, current screen — if the route encodes it, **no provider duplicates it**; a provider mirroring the route will drift. This also makes navigation state survive process death for free, which matters because mobile processes die constantly.
112
+
113
+ ## Deep Links
114
+
115
+ Anything declared as a `GoRoute` is deep-linkable across Android/iOS — that falls out of the declarative table. Practical consequences:
116
+
117
+ - Every route must render sensibly when entered **directly** (cold start onto `/orders/42`): the view model fetches what it needs from its id parameters; no route depends on in-memory state a previous screen happened to leave behind.
118
+ - Guard-sensitive routes are protected by the central `redirect`, so deep links cannot skip auth.
119
+
120
+ ## What Remains for Navigator 1.0
121
+
122
+ Imperative `showDialog`, `showModalBottomSheet`, and one-off local flows are fine — they are transient UI, not app navigation. The boundary: if a destination should be linkable, restorable, or guarded, it is a `GoRoute`; if it is a momentary overlay, Navigator 1.0 primitives are correct.
@@ -0,0 +1,93 @@
1
+ # Platform Channels
2
+
3
+ ## Table of Contents
4
+ - [The Decision Ladder](#the-decision-ladder)
5
+ - [Check the Plugin Shelf First](#check-the-plugin-shelf-first)
6
+ - [Pigeon: the Default for Structured APIs](#pigeon-the-default-for-structured-apis)
7
+ - [Wrapping the Native Module](#wrapping-the-native-module)
8
+ - [ffigen/jnigen: the Tracked Destination](#ffigenjnigen-the-tracked-destination)
9
+ - [Raw MethodChannel](#raw-methodchannel)
10
+ - [iOS Build Wiring](#ios-build-wiring)
11
+ - [Testing the Boundary](#testing-the-boundary)
12
+
13
+ ---
14
+
15
+ ## The Decision Ladder
16
+
17
+ When a capability is not reachable from Dart:
18
+
19
+ 1. **pub.dev** — a maintained, verified-publisher plugin is a dependency decision, not an interop project.
20
+ 2. **Pigeon module** — write Swift/Kotlin behind a generated, typed boundary.
21
+ 3. **Raw MethodChannel** — a single fire-and-forget call with no evolving surface, nothing more.
22
+
23
+ Dropping to native is a **capability decision, never a performance reflex**. Profile in Dart first — rendering and isolates cover almost every performance complaint, and a native detour taken for imagined speed buys two codebases for one feature. Legitimate native triggers: a platform API with no maintained plugin (HealthKit details, background modes, vendor SDKs), OS-integrated UI Flutter cannot render (widgets/complications, App Intents), hardware access below the plugin ecosystem.
24
+
25
+ ## Check the Plugin Shelf First
26
+
27
+ Before writing native code: search pub.dev, check publisher verification, maintenance cadence, and issue tracker health. Rewriting a maintained verified-publisher plugin is negative work. Write native code when the shelf is empty or unmaintained.
28
+
29
+ ## Pigeon: the Default for Structured APIs
30
+
31
+ Define the API once in Dart; Pigeon generates type-safe stubs on both sides — misspelled methods and mistyped arguments become compile errors instead of runtime channel exceptions:
32
+
33
+ ```dart
34
+ // pigeons/battery_api.dart
35
+ import 'package:pigeon/pigeon.dart';
36
+
37
+ @ConfigurePigeon(PigeonOptions(
38
+ dartOut: 'lib/data/services/gen/battery_api.g.dart',
39
+ kotlinOut: 'android/app/src/main/kotlin/.../BatteryApi.kt',
40
+ swiftOut: 'ios/Runner/BatteryApi.swift',
41
+ ))
42
+ @HostApi()
43
+ abstract class BatteryApi {
44
+ int batteryLevel();
45
+ bool isCharging();
46
+ }
47
+ ```
48
+
49
+ Run `dart run pigeon --input pigeons/battery_api.dart` and implement the generated interface in Kotlin/Swift. **Every structured Flutter↔native API goes through Pigeon** — keep the native side a small module the agent can regenerate.
50
+
51
+ ## Wrapping the Native Module
52
+
53
+ The Dart side of a Pigeon API is a **service in the data layer**, like any other platform API:
54
+
55
+ ```dart
56
+ class BatteryService {
57
+ BatteryService(this._api);
58
+ final BatteryApi _api;
59
+
60
+ Future<BatteryReading> read() async => BatteryReading(
61
+ level: await _api.batteryLevel(),
62
+ charging: await _api.isCharging(),
63
+ );
64
+ }
65
+
66
+ final batteryServiceProvider = Provider<BatteryService>(
67
+ (ref) => BatteryService(BatteryApi()),
68
+ );
69
+ ```
70
+
71
+ Repositories/view models consume the service; nothing above the data layer knows a channel exists. **Native code never grows business rules** — it is transport to an OS capability; rules live in the core or the view model where they are proven.
72
+
73
+ ## ffigen/jnigen: the Tracked Destination
74
+
75
+ The ecosystem is mid-migration to channel-free codegen interop: `ffigen` (C/Obj-C/Swift; stable) and `jnigen` (Java/Kotlin via JNI; pre-1.0), on build hooks / native assets (default-enabled since Flutter 3.38). The stance:
76
+
77
+ - **Adopt where a dependency already ships it** — that is the dependency's choice.
78
+ - **Pigeon remains the app-code default** until the jnigen path reaches 1.0.
79
+ - Aim refactors at the destination; re-evaluate at the next ecosystem survey.
80
+
81
+ ## Raw MethodChannel
82
+
83
+ Acceptable for exactly one shape: a single trivial call with no evolving surface (toggle a platform flag, read one value). The moment a channel grows a second method or a structured payload, it becomes a Pigeon definition. Hand-written channels for any real API surface are legacy — stringly-typed, runtime-failing, agent-hostile.
84
+
85
+ ## iOS Build Wiring
86
+
87
+ **Swift Package Manager is the iOS/macOS default as of Flutter 3.44.** New native modules and plugin dependencies use SwiftPM; CocoaPods is the legacy path kept only where a required dependency has not migrated. Do not add new Podfile-based wiring.
88
+
89
+ ## Testing the Boundary
90
+
91
+ - **Unit/widget tiers:** fake the Pigeon-fronted **service** in Dart like any other service — the native side does not run.
92
+ - **Emulator tier:** the native implementation is exercised by `integration_test` (or Patrol, when the flow crosses into OS UI) only where the capability is observable.
93
+ - Pure pass-through wrappers over OS APIs get a thin smoke test, not a re-proof of the OS.
@@ -0,0 +1,84 @@
1
+ # Releases and Distribution
2
+
3
+ ## Table of Contents
4
+ - [Why This Is Architecture](#why-this-is-architecture)
5
+ - [Signing](#signing)
6
+ - [CI/CD Pipeline](#cicd-pipeline)
7
+ - [Versioning](#versioning)
8
+ - [Forced Upgrade: the Compatibility Floor](#forced-upgrade-the-compatibility-floor)
9
+ - [Shorebird Code Push](#shorebird-code-push)
10
+ - [Release Checklist](#release-checklist)
11
+
12
+ ---
13
+
14
+ ## Why This Is Architecture
15
+
16
+ A mobile surface cannot be rolled back and cannot be force-refreshed: every version ever shipped is potentially still running, store review adds days of latency, and a signing mistake can permanently lock the listing. Treat release engineering as the half of the contract-compatibility story that lives outside the repo — and keep it CI-driven, because a human clicking through Xcode is a step the delivery loop stalls on.
17
+
18
+ ## Signing
19
+
20
+ **Android**
21
+
22
+ - One upload keystore per app, generated once, stored in a secret manager **with an independent secure copy** — the official docs warn it is unrecoverable.
23
+ - `key.properties` and the keystore are never in git; CI injects them from encrypted secrets (or Codemagic code-signing identities).
24
+ - **Play App Signing** holds the actual app signing key, so a compromised upload key is rotatable.
25
+
26
+ **iOS**
27
+
28
+ - **App Store Connect API keys** authenticate CI — no human Apple ID sessions in automation.
29
+ - Certificates/provisioning profiles are fastlane-match-style: encrypted, centrally stored, CI-fetched. Codemagic's managed signing is the equivalent.
30
+
31
+ A keystore or service-account JSON committed to a repo is an **incident**, not a finding: rotate it, scrub history, then fix the pipeline. The generated `.gitignore` already excludes signing material — keep it that way.
32
+
33
+ ## CI/CD Pipeline
34
+
35
+ Default stack: **GitHub Actions + fastlane** (`supply` → Play, `deliver`/`pilot` → App Store Connect/TestFlight). **Codemagic** is the recorded Flutter-native alternative; fastlane is preinstalled there, so the stacks compose. Pick one per product and record it.
36
+
37
+ The standard flow:
38
+
39
+ ```
40
+ PR → analyze + widget tests + emulator integration lane (the test gate)
41
+ main → build signed release artifacts (CI-owned build number)
42
+ artifact → internal track / TestFlight first
43
+ promote → staged rollout to production
44
+ ```
45
+
46
+ No artifact reaches a store that CI did not build, sign, and test. Manual store uploads are unrepeatable releases — refuse them.
47
+
48
+ ## Versioning
49
+
50
+ pubspec carries `version: x.y.z+buildNumber`:
51
+
52
+ - **Humans own `x.y.z`** — the user-visible, compatibility-relevant part.
53
+ - **CI owns the build number**, auto-incrementing per release build via `--build-number` (and `--build-name` when overriding the version). Hand-bumped build numbers collide, and collided build numbers are store-upload rejections.
54
+
55
+ ## Forced Upgrade: the Compatibility Floor
56
+
57
+ The core's stance is that a published contract field is never broken — because the fleet lags releases by months and cannot be recalled. Forced upgrade is the other half of that bargain:
58
+
59
+ - The core (or a config endpoint / Firebase Remote Config) publishes a **minimum supported version**; the app compares at startup.
60
+ - The **`upgrader`** package implements the prompt: `minAppVersion` below the floor auto-hides "Later"/"Ignore".
61
+ - Two tiers, used deliberately:
62
+ - **Soft prompt** (dismissible) — new features, gentle migration pressure.
63
+ - **Hard force** (blocking) — security issues, or a contract the core can no longer serve.
64
+
65
+ Operational rules: the floor advances slowly and each advance is a recorded product decision; between "never break a field" and the floor, every fleet version is served correctly. **Shipping a contract-breaking core change without first raising the floor and waiting out adoption is a sequencing defect** — flag it whenever a slice proposes it.
66
+
67
+ ## Shorebird Code Push
68
+
69
+ Shorebird (stable on Android and iOS, store-policy compliant) is the OTA lane for **Dart-only hotfixes** — it skips store latency for Dart-level defects, with `shorebird_code_push` for in-app patch checks. Boundaries:
70
+
71
+ - Native-code changes (plugins, Pigeon modules, SDK bumps) still require a store release.
72
+ - A patched 1.4.2 is still 1.4.2 to the contract — OTA never substitutes for the version floor.
73
+ - It is a hotfix channel, not the release process; features and floors move through the stores.
74
+
75
+ ## Release Checklist
76
+
77
+ Before a release slice closes:
78
+
79
+ - [ ] CI builds, signs, and tests the artifact; no manual store steps.
80
+ - [ ] Build number CI-assigned; `x.y.z` deliberately chosen.
81
+ - [ ] No signing material, `key.properties`, ASC keys, or service-account JSON in the diff.
82
+ - [ ] Contract changes verified against the version floor (raise the floor first, then ship the change after adoption).
83
+ - [ ] Internal track / TestFlight before production; staged rollout configured.
84
+ - [ ] If Shorebird patched anything since the last release, the patch content is folded into this store release.
@@ -0,0 +1,166 @@
1
+ # State Management
2
+
3
+ ## Table of Contents
4
+ - [The Rules](#the-rules)
5
+ - [Providers Are the Graph](#providers-are-the-graph)
6
+ - [Notifier and AsyncNotifier](#notifier-and-asyncnotifier)
7
+ - [Mutations for Action Lifecycle](#mutations-for-action-lifecycle)
8
+ - [App State vs Ephemeral State](#app-state-vs-ephemeral-state)
9
+ - [ref.watch vs ref.read](#refwatch-vs-refread)
10
+ - [Testing Providers](#testing-providers)
11
+ - [Refused Packages and Patterns](#refused-packages-and-patterns)
12
+
13
+ ---
14
+
15
+ ## The Rules
16
+
17
+ 1. **Riverpod 3.x** is the state-management and DI mechanism. One tool for both; no second container.
18
+ 2. Everything shared is a provider; everything provider-shaped is testable through overrides.
19
+ 3. Pin 3.x conservatively — the experimental offline-persistence API never enters load-bearing paths.
20
+ 4. `setState` survives only for ephemeral widget-local state.
21
+
22
+ ---
23
+
24
+ ## Providers Are the Graph
25
+
26
+ Repositories, services, the contract client, view models, and derived state are all providers. The provider graph **is** the dependency-injection graph:
27
+
28
+ ```dart
29
+ final apiClientProvider = Provider<ApiClient>((ref) => ApiClient(/* ... */));
30
+
31
+ final userRepositoryProvider = Provider<UserRepository>(
32
+ (ref) => RemoteUserRepository(ref.watch(apiClientProvider)),
33
+ );
34
+
35
+ // Derived read-only state: a plain provider, not a class.
36
+ final unreadCountProvider = Provider<int>(
37
+ (ref) => ref.watch(inboxViewModelProvider).valueOrNull?.unread.length ?? 0,
38
+ );
39
+ ```
40
+
41
+ Construction order, disposal, and test substitution fall out of the graph. Do not write a `Notifier` class where a derived provider (a function) suffices.
42
+
43
+ `ProviderScope` at the root of `main.dart` is the only composition root. There is no `get_it`, no manually threaded constructors across features, no `InheritedWidget` plumbing for app state.
44
+
45
+ ---
46
+
47
+ ## Notifier and AsyncNotifier
48
+
49
+ A view model is a `Notifier` (synchronous initial state) or `AsyncNotifier` (asynchronous initial state). `build` declares dependencies with `ref.watch` — when a dependency changes, state recomputes:
50
+
51
+ ```dart
52
+ class InboxViewModel extends AsyncNotifier<InboxState> {
53
+ @override
54
+ Future<InboxState> build() async {
55
+ final messages = await ref.watch(messageRepositoryProvider).inbox();
56
+ return InboxState(messages: messages);
57
+ }
58
+
59
+ // Commands: the only way the view mutates anything.
60
+ Future<void> archive(String id) async {
61
+ await ref.read(messageRepositoryProvider).archive(id);
62
+ ref.invalidateSelf(); // re-derive from the source of truth
63
+ }
64
+ }
65
+
66
+ final inboxViewModelProvider =
67
+ AsyncNotifierProvider<InboxViewModel, InboxState>(InboxViewModel.new);
68
+ ```
69
+
70
+ Prefer `ref.invalidateSelf()` (re-derive from the repository) over hand-patching state when the repository is cheap to re-read — hand-patched state drifts from the source of truth.
71
+
72
+ In views, render `AsyncValue` exhaustively:
73
+
74
+ ```dart
75
+ final state = ref.watch(inboxViewModelProvider);
76
+ return state.when(
77
+ loading: () => const InboxSkeleton(),
78
+ error: (e, _) => ErrorPanel(error: e, onRetry: ...),
79
+ data: (inbox) => InboxList(inbox: inbox),
80
+ );
81
+ ```
82
+
83
+ Never `.valueOrNull!` your way past the loading and error cases in a view.
84
+
85
+ ---
86
+
87
+ ## Mutations for Action Lifecycle
88
+
89
+ User actions that need pending/success/error surfacing — submit, delete, retry — use Riverpod 3 **Mutations** instead of hand-rolled `isLoading` booleans:
90
+
91
+ ```dart
92
+ final archiveMessage = Mutation<void>();
93
+
94
+ // In the view model / command site:
95
+ archiveMessage.run(ref, (tsx) async {
96
+ await tsx.get(messageRepositoryProvider).archive(id);
97
+ });
98
+
99
+ // In the view:
100
+ final archiveState = ref.watch(archiveMessage);
101
+ // idle / pending / success / error — render the spinner or the failure from this.
102
+ ```
103
+
104
+ One mutation per user action. If you are writing `bool _submitting` into a state class, reach for a Mutation instead.
105
+
106
+ ---
107
+
108
+ ## App State vs Ephemeral State
109
+
110
+ The boundary question: **does anything outside this widget care?**
111
+
112
+ | State | Mechanism |
113
+ |---|---|
114
+ | Session, fetched data, feature view state | provider / Notifier |
115
+ | Selected tab, selected entity id, current screen | the **route** (go_router) — never duplicated in a provider |
116
+ | Text-field focus, animation progress, tile expanded | `setState` in a `StatefulWidget` |
117
+
118
+ Two corollaries:
119
+
120
+ - **Route-mirroring providers drift.** If go_router already encodes it, read it from the route.
121
+ - **State must be recoverable.** Mobile processes die constantly; anything not rebuildable from the core or the route is state the app silently loses. Design state so `build()` can reconstruct it.
122
+
123
+ ---
124
+
125
+ ## ref.watch vs ref.read
126
+
127
+ - `ref.watch` — in `build` methods (Notifier and widget alike). Declares a reactive dependency.
128
+ - `ref.read` — inside callbacks and commands only. A `ref.read` in `build` silently opts out of reactivity and is a bug even when it appears to work.
129
+ - `ref.listen` — for side-effects on state change (showing a snackbar on error) — never for deriving state.
130
+
131
+ ---
132
+
133
+ ## Testing Providers
134
+
135
+ Providers test without widgets. `ProviderContainer` plus overrides substitutes fakes at any node:
136
+
137
+ ```dart
138
+ test('archiving removes the message from inbox state', () async {
139
+ final fakeRepo = FakeMessageRepository(seed: [message1, message2]);
140
+ final container = ProviderContainer(
141
+ overrides: [messageRepositoryProvider.overrideWithValue(fakeRepo)],
142
+ );
143
+ addTearDown(container.dispose);
144
+
145
+ await container.read(inboxViewModelProvider.future);
146
+ await container.read(inboxViewModelProvider.notifier).archive(message1.id);
147
+
148
+ final state = await container.read(inboxViewModelProvider.future);
149
+ expect(state.messages, [message2]);
150
+ });
151
+ ```
152
+
153
+ Widget tests use the same seam through `ProviderScope(overrides: [...])`. Test the **real Notifier with fake repositories** — mocking the Notifier itself proves nothing. Fakes over mocks throughout (see `references/testing.md`).
154
+
155
+ ---
156
+
157
+ ## Refused Packages and Patterns
158
+
159
+ These are named so they are recognised and refused in review:
160
+
161
+ - **GetX** — global mutable service locators, context-free magic. Never, in any role.
162
+ - **provider as state management** — the 2019–2022 pattern; Riverpod is its successor by the same author. With Riverpod, even provider's DI role is subsumed — do not run both.
163
+ - **setState as architecture** — app state in `StatefulWidget`s threaded through constructors.
164
+ - **Riverpod experimental persistence** — explicitly experimental; not in load-bearing paths.
165
+ - **Bloc** — not wrong, but a deliberate alternative for regulated/large-team contexts. Adopting it is a recorded decision, not a drift; never mix it with Riverpod in one app.
166
+ - **One god-provider per screen** — split by concern; the graph recomputes at the right granularity only if you let it.