groundwork-method 0.0.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/CHANGELOG.md +823 -0
  2. package/LICENSE +21 -0
  3. package/README.md +44 -29
  4. package/bin/groundwork.js +1723 -0
  5. package/dist/src/generators/add-capability/generator.d.ts +8 -0
  6. package/dist/src/generators/add-capability/generator.js +60 -0
  7. package/dist/src/generators/add-capability/generator.js.map +1 -0
  8. package/dist/src/generators/cli-app/generator.d.ts +9 -0
  9. package/dist/src/generators/cli-app/generator.js +140 -0
  10. package/dist/src/generators/cli-app/generator.js.map +1 -0
  11. package/dist/src/generators/docs-site/generator.d.ts +5 -0
  12. package/dist/src/generators/docs-site/generator.js +441 -0
  13. package/dist/src/generators/docs-site/generator.js.map +1 -0
  14. package/dist/src/generators/electron-app/generator.d.ts +6 -0
  15. package/dist/src/generators/electron-app/generator.js +261 -0
  16. package/dist/src/generators/electron-app/generator.js.map +1 -0
  17. package/dist/src/generators/flutter-app/generator.d.ts +6 -0
  18. package/dist/src/generators/flutter-app/generator.js +314 -0
  19. package/dist/src/generators/flutter-app/generator.js.map +1 -0
  20. package/dist/src/generators/go-microservice/generator.d.ts +8 -0
  21. package/dist/src/generators/go-microservice/generator.js +232 -0
  22. package/dist/src/generators/go-microservice/generator.js.map +1 -0
  23. package/dist/src/generators/nextjs-app/generator.d.ts +8 -0
  24. package/dist/src/generators/nextjs-app/generator.js +294 -0
  25. package/dist/src/generators/nextjs-app/generator.js.map +1 -0
  26. package/dist/src/generators/python-microservice/generator.d.ts +13 -0
  27. package/dist/src/generators/python-microservice/generator.js +265 -0
  28. package/dist/src/generators/python-microservice/generator.js.map +1 -0
  29. package/dist/src/generators/shared/brand-tokens.d.ts +89 -0
  30. package/dist/src/generators/shared/brand-tokens.js +308 -0
  31. package/dist/src/generators/shared/brand-tokens.js.map +1 -0
  32. package/dist/src/generators/shared/capabilities.d.ts +101 -0
  33. package/dist/src/generators/shared/capabilities.js +279 -0
  34. package/dist/src/generators/shared/capabilities.js.map +1 -0
  35. package/dist/src/generators/shared/provenance.d.ts +2 -0
  36. package/dist/src/generators/shared/provenance.js +85 -0
  37. package/dist/src/generators/shared/provenance.js.map +1 -0
  38. package/dist/src/generators/shared/scaffold-helpers.d.ts +72 -0
  39. package/dist/src/generators/shared/scaffold-helpers.js +309 -0
  40. package/dist/src/generators/shared/scaffold-helpers.js.map +1 -0
  41. package/dist/src/generators/system-test-runner/generator.d.ts +23 -0
  42. package/dist/src/generators/system-test-runner/generator.js +173 -0
  43. package/dist/src/generators/system-test-runner/generator.js.map +1 -0
  44. package/dist/src/generators/workspace-dev-cli/generator.d.ts +7 -0
  45. package/dist/src/generators/workspace-dev-cli/generator.js +138 -0
  46. package/dist/src/generators/workspace-dev-cli/generator.js.map +1 -0
  47. package/generators.json +57 -0
  48. package/lib/repo-map/grammars/tree-sitter-c.wasm +0 -0
  49. package/lib/repo-map/grammars/tree-sitter-cpp.wasm +0 -0
  50. package/lib/repo-map/grammars/tree-sitter-csharp.wasm +0 -0
  51. package/lib/repo-map/grammars/tree-sitter-dart.wasm +0 -0
  52. package/lib/repo-map/grammars/tree-sitter-go.wasm +0 -0
  53. package/lib/repo-map/grammars/tree-sitter-java.wasm +0 -0
  54. package/lib/repo-map/grammars/tree-sitter-javascript.wasm +0 -0
  55. package/lib/repo-map/grammars/tree-sitter-kotlin.wasm +0 -0
  56. package/lib/repo-map/grammars/tree-sitter-lua.wasm +0 -0
  57. package/lib/repo-map/grammars/tree-sitter-php.wasm +0 -0
  58. package/lib/repo-map/grammars/tree-sitter-python.wasm +0 -0
  59. package/lib/repo-map/grammars/tree-sitter-ruby.wasm +0 -0
  60. package/lib/repo-map/grammars/tree-sitter-rust.wasm +0 -0
  61. package/lib/repo-map/grammars/tree-sitter-scala.wasm +0 -0
  62. package/lib/repo-map/grammars/tree-sitter-swift.wasm +0 -0
  63. package/lib/repo-map/grammars/tree-sitter-tsx.wasm +0 -0
  64. package/lib/repo-map/grammars/tree-sitter-typescript.wasm +0 -0
  65. package/lib/repo-map/index.js +386 -0
  66. package/lib/repo-map/languages.js +514 -0
  67. package/lib/repo-map/pagerank.js +59 -0
  68. package/migrations/README.md +60 -0
  69. package/migrations/_template/cli-migration.js +27 -0
  70. package/migrations/gw-bet-prose-redesign.js +105 -0
  71. package/migrations/gw-drop-test-manifest.js +37 -0
  72. package/migrations/gw-register-serena-mcp.js +42 -0
  73. package/migrations/gw-relocate-hidden-skills.js +40 -0
  74. package/migrations/gw-seed-config-toml.js +24 -0
  75. package/migrations/index.json +40 -0
  76. package/package.json +70 -6
  77. package/src/AGENTS.md +36 -0
  78. package/src/config/config.toml +30 -0
  79. package/src/config/groundwork-state.json +5 -0
  80. package/src/docs/llms.txt +72 -0
  81. package/src/docs/principles/ai-native/agent-native-systems.md +90 -0
  82. package/src/docs/principles/ai-native/agentic-systems.md +78 -0
  83. package/src/docs/principles/ai-native/ai-engineering.md +100 -0
  84. package/src/docs/principles/ai-native/ai-native-product.md +76 -0
  85. package/src/docs/principles/delivery/cost-engineering.md +89 -0
  86. package/src/docs/principles/delivery/day-2-operational-baseline.md +57 -0
  87. package/src/docs/principles/delivery/devex.md +88 -0
  88. package/src/docs/principles/delivery/platform.md +101 -0
  89. package/src/docs/principles/delivery/progressive-delivery.md +92 -0
  90. package/src/docs/principles/design/ai-native-design.md +73 -0
  91. package/src/docs/principles/design/design-foundations.md +80 -0
  92. package/src/docs/principles/design/design-systems-and-tokens.md +72 -0
  93. package/src/docs/principles/design/interaction-and-motion.md +69 -0
  94. package/src/docs/principles/design/layout-and-space.md +72 -0
  95. package/src/docs/principles/design/usability-and-ux.md +79 -0
  96. package/src/docs/principles/design/visual-design.md +84 -0
  97. package/src/docs/principles/foundations/code-craft.md +86 -0
  98. package/src/docs/principles/foundations/continuous-discovery.md +75 -0
  99. package/src/docs/principles/foundations/documentation.md +102 -0
  100. package/src/docs/principles/foundations/prioritization-and-appetite.md +78 -0
  101. package/src/docs/principles/foundations/product-engineering.md +90 -0
  102. package/src/docs/principles/foundations/product-risks.md +89 -0
  103. package/src/docs/principles/foundations/requirements-and-specs.md +80 -0
  104. package/src/docs/principles/foundations/success-metrics.md +66 -0
  105. package/src/docs/principles/foundations/testing.md +108 -0
  106. package/src/docs/principles/index.md +24 -0
  107. package/src/docs/principles/quality/accessibility.md +88 -0
  108. package/src/docs/principles/quality/observability.md +84 -0
  109. package/src/docs/principles/quality/performance.md +84 -0
  110. package/src/docs/principles/quality/privacy.md +92 -0
  111. package/src/docs/principles/quality/reliability.md +89 -0
  112. package/src/docs/principles/quality/security.md +78 -0
  113. package/src/docs/principles/stack/postgres.md +100 -0
  114. package/src/docs/principles/system-design/api-design.md +86 -0
  115. package/src/docs/principles/system-design/architecture-decisions.md +81 -0
  116. package/src/docs/principles/system-design/code-structure.md +104 -0
  117. package/src/docs/principles/system-design/data-engineering.md +87 -0
  118. package/src/docs/principles/system-design/durable-execution.md +89 -0
  119. package/src/docs/principles/system-design/evolutionary-architecture.md +81 -0
  120. package/src/docs/principles/system-design/identity-and-access.md +76 -0
  121. package/src/docs/principles/system-design/integration-patterns.md +84 -0
  122. package/src/docs/principles/system-design/real-time.md +83 -0
  123. package/src/docs/principles/system-design/surface-architecture.md +74 -0
  124. package/src/docs/ways-of-working/documentation.md +69 -0
  125. package/src/docs/ways-of-working/how-we-work.md +76 -0
  126. package/src/docs/ways-of-working/units-of-work.md +40 -0
  127. package/src/engineer-skills/groundwork-electron-engineer/SKILL.md +123 -0
  128. package/src/engineer-skills/groundwork-electron-engineer/references/documentation.md +126 -0
  129. package/src/engineer-skills/groundwork-electron-engineer/references/ipc-contracts.md +138 -0
  130. package/src/engineer-skills/groundwork-electron-engineer/references/observability.md +37 -0
  131. package/src/engineer-skills/groundwork-electron-engineer/references/packaging-and-updates.md +82 -0
  132. package/src/engineer-skills/groundwork-electron-engineer/references/performance-and-reliability.md +80 -0
  133. package/src/engineer-skills/groundwork-electron-engineer/references/process-model.md +94 -0
  134. package/src/engineer-skills/groundwork-electron-engineer/references/security.md +107 -0
  135. package/src/engineer-skills/groundwork-electron-engineer/references/testing-and-smoke.md +129 -0
  136. package/src/engineer-skills/groundwork-electron-engineer/references/theming-and-tokens.md +74 -0
  137. package/src/engineer-skills/groundwork-electron-engineer/sync-anchor.md +22 -0
  138. package/src/engineer-skills/groundwork-flutter-engineer/SKILL.md +114 -0
  139. package/src/engineer-skills/groundwork-flutter-engineer/references/accessibility.md +92 -0
  140. package/src/engineer-skills/groundwork-flutter-engineer/references/architecture.md +189 -0
  141. package/src/engineer-skills/groundwork-flutter-engineer/references/data-and-contracts.md +136 -0
  142. package/src/engineer-skills/groundwork-flutter-engineer/references/documentation.md +122 -0
  143. package/src/engineer-skills/groundwork-flutter-engineer/references/navigation.md +122 -0
  144. package/src/engineer-skills/groundwork-flutter-engineer/references/observability.md +37 -0
  145. package/src/engineer-skills/groundwork-flutter-engineer/references/performance-and-reliability.md +100 -0
  146. package/src/engineer-skills/groundwork-flutter-engineer/references/platform-channels.md +93 -0
  147. package/src/engineer-skills/groundwork-flutter-engineer/references/releases-and-distribution.md +84 -0
  148. package/src/engineer-skills/groundwork-flutter-engineer/references/security.md +96 -0
  149. package/src/engineer-skills/groundwork-flutter-engineer/references/state-management.md +166 -0
  150. package/src/engineer-skills/groundwork-flutter-engineer/references/testing.md +160 -0
  151. package/src/engineer-skills/groundwork-flutter-engineer/references/theming-and-design-tokens.md +109 -0
  152. package/src/engineer-skills/groundwork-flutter-engineer/references/widgets-and-composition.md +123 -0
  153. package/src/engineer-skills/groundwork-flutter-engineer/sync-anchor.md +24 -0
  154. package/src/engineer-skills/groundwork-go-engineer/SKILL.md +174 -0
  155. package/src/engineer-skills/groundwork-go-engineer/references/api-design.md +82 -0
  156. package/src/engineer-skills/groundwork-go-engineer/references/architecture.md +42 -0
  157. package/src/engineer-skills/groundwork-go-engineer/references/capability-ports.md +50 -0
  158. package/src/engineer-skills/groundwork-go-engineer/references/code-craft-security.md +34 -0
  159. package/src/engineer-skills/groundwork-go-engineer/references/concurrency.md +108 -0
  160. package/src/engineer-skills/groundwork-go-engineer/references/documentation.md +130 -0
  161. package/src/engineer-skills/groundwork-go-engineer/references/go-services.md +77 -0
  162. package/src/engineer-skills/groundwork-go-engineer/references/http-handlers.md +172 -0
  163. package/src/engineer-skills/groundwork-go-engineer/references/implementation-patterns.md +156 -0
  164. package/src/engineer-skills/groundwork-go-engineer/references/integration-realtime-data.md +57 -0
  165. package/src/engineer-skills/groundwork-go-engineer/references/observability.md +49 -0
  166. package/src/engineer-skills/groundwork-go-engineer/references/postgres.md +41 -0
  167. package/src/engineer-skills/groundwork-go-engineer/references/reliability-performance.md +105 -0
  168. package/src/engineer-skills/groundwork-go-engineer/references/testing.md +201 -0
  169. package/src/engineer-skills/groundwork-go-engineer/sync-anchor.md +20 -0
  170. package/src/engineer-skills/groundwork-nextjs-engineer/SKILL.md +112 -0
  171. package/src/engineer-skills/groundwork-nextjs-engineer/references/accessibility.md +111 -0
  172. package/src/engineer-skills/groundwork-nextjs-engineer/references/architecture.md +323 -0
  173. package/src/engineer-skills/groundwork-nextjs-engineer/references/data-fetching.md +458 -0
  174. package/src/engineer-skills/groundwork-nextjs-engineer/references/documentation.md +324 -0
  175. package/src/engineer-skills/groundwork-nextjs-engineer/references/error-boundaries.md +383 -0
  176. package/src/engineer-skills/groundwork-nextjs-engineer/references/mutations-and-forms.md +396 -0
  177. package/src/engineer-skills/groundwork-nextjs-engineer/references/observability.md +48 -0
  178. package/src/engineer-skills/groundwork-nextjs-engineer/references/performance-and-deployment.md +947 -0
  179. package/src/engineer-skills/groundwork-nextjs-engineer/references/routing-and-navigation.md +405 -0
  180. package/src/engineer-skills/groundwork-nextjs-engineer/references/security.md +131 -0
  181. package/src/engineer-skills/groundwork-nextjs-engineer/references/server-components.md +394 -0
  182. package/src/engineer-skills/groundwork-nextjs-engineer/references/tailwind-and-styling.md +134 -0
  183. package/src/engineer-skills/groundwork-nextjs-engineer/references/testing.md +491 -0
  184. package/src/engineer-skills/groundwork-nextjs-engineer/references/type-system.md +368 -0
  185. package/src/engineer-skills/groundwork-nextjs-engineer/references/ux-principles.md +230 -0
  186. package/src/engineer-skills/groundwork-nextjs-engineer/references/visual-language.md +69 -0
  187. package/src/engineer-skills/groundwork-nextjs-engineer/sync-anchor.md +16 -0
  188. package/src/engineer-skills/groundwork-python-engineer/SKILL.md +199 -0
  189. package/src/engineer-skills/groundwork-python-engineer/references/api-standards.md +88 -0
  190. package/src/engineer-skills/groundwork-python-engineer/references/architecture.md +57 -0
  191. package/src/engineer-skills/groundwork-python-engineer/references/async-patterns.md +103 -0
  192. package/src/engineer-skills/groundwork-python-engineer/references/capability-ports.md +44 -0
  193. package/src/engineer-skills/groundwork-python-engineer/references/database.md +88 -0
  194. package/src/engineer-skills/groundwork-python-engineer/references/documentation-mcp.md +167 -0
  195. package/src/engineer-skills/groundwork-python-engineer/references/implementation-patterns.md +166 -0
  196. package/src/engineer-skills/groundwork-python-engineer/references/ml-pipelines.md +119 -0
  197. package/src/engineer-skills/groundwork-python-engineer/references/ml-systems-ai-engineering.md +74 -0
  198. package/src/engineer-skills/groundwork-python-engineer/references/observability.md +57 -0
  199. package/src/engineer-skills/groundwork-python-engineer/references/resilience.md +126 -0
  200. package/src/engineer-skills/groundwork-python-engineer/references/security.md +148 -0
  201. package/src/engineer-skills/groundwork-python-engineer/references/testing.md +216 -0
  202. package/src/engineer-skills/groundwork-python-engineer/sync-anchor.md +20 -0
  203. package/src/generators/add-capability/generator.ts +70 -0
  204. package/src/generators/add-capability/schema.json +30 -0
  205. package/src/generators/capabilities/llm/capability.json +28 -0
  206. package/src/generators/capabilities/llm/providers/anthropic/footprint.json +13 -0
  207. package/src/generators/capabilities/llm/providers/anthropic/stacks/go/internal/llm/llm.go.template +102 -0
  208. package/src/generators/capabilities/llm/providers/anthropic/stacks/python/src/__packageName__/adapters/llm.py.template +61 -0
  209. package/src/generators/capabilities/llm/providers/local/footprint.json +13 -0
  210. package/src/generators/capabilities/llm/providers/local/stacks/go/internal/llm/llm.go.template +102 -0
  211. package/src/generators/capabilities/llm/providers/local/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  212. package/src/generators/capabilities/llm/providers/localai/footprint.json +29 -0
  213. package/src/generators/capabilities/llm/providers/localai/stacks/go/internal/llm/llm.go.template +102 -0
  214. package/src/generators/capabilities/llm/providers/localai/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  215. package/src/generators/capabilities/llm/providers/none/footprint.json +9 -0
  216. package/src/generators/capabilities/llm/providers/none/stacks/go/internal/llm/llm.go.template +35 -0
  217. package/src/generators/capabilities/llm/providers/none/stacks/python/src/__packageName__/adapters/llm.py.template +25 -0
  218. package/src/generators/capabilities/llm/providers/ollama/footprint.json +20 -0
  219. package/src/generators/capabilities/llm/providers/ollama/stacks/go/internal/llm/llm.go.template +102 -0
  220. package/src/generators/capabilities/llm/providers/ollama/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
  221. package/src/generators/capabilities/llm/providers/openai/footprint.json +13 -0
  222. package/src/generators/capabilities/llm/providers/openai/stacks/go/internal/llm/llm.go.template +98 -0
  223. package/src/generators/capabilities/llm/providers/openai/stacks/python/src/__packageName__/adapters/llm.py.template +60 -0
  224. package/src/generators/capabilities/llm/stacks/go/internal/core/service/llm.go.template +12 -0
  225. package/src/generators/capabilities/llm/stacks/go/internal/llm/llm_test.go.template +33 -0
  226. package/src/generators/capabilities/llm/stacks/python/src/__packageName__/core/llm.py.template +15 -0
  227. package/src/generators/capabilities/llm/stacks/python/tests/contracts/test_llm.py.template +37 -0
  228. package/src/generators/cli-app/files/README.md.template +76 -0
  229. package/src/generators/cli-app/files/build.mjs.template +15 -0
  230. package/src/generators/cli-app/files/package.json.template +21 -0
  231. package/src/generators/cli-app/files/src/cli.ts.template +67 -0
  232. package/src/generators/cli-app/files/src/commands/hello.ts.template +17 -0
  233. package/src/generators/cli-app/files/src/commands/status.ts.template +23 -0
  234. package/src/generators/cli-app/files/src/core/client.test.ts.template +80 -0
  235. package/src/generators/cli-app/files/src/core/client.ts.template +64 -0
  236. package/src/generators/cli-app/files/src/registry.test.ts.template +35 -0
  237. package/src/generators/cli-app/files/src/registry.ts.template +31 -0
  238. package/src/generators/cli-app/files/tsconfig.json.template +16 -0
  239. package/src/generators/cli-app/files/tsconfig.test.json.template +11 -0
  240. package/src/generators/cli-app/generator.ts +138 -0
  241. package/src/generators/cli-app/schema.json +24 -0
  242. package/src/generators/docs-site/files/.gitignore.ejs +40 -0
  243. package/src/generators/docs-site/files/app/docs/__slug__/page.tsx +101 -0
  244. package/src/generators/docs-site/files/app/docs/layout.tsx +14 -0
  245. package/src/generators/docs-site/files/app/docs.css +43 -0
  246. package/src/generators/docs-site/files/app/layout.tsx +24 -0
  247. package/src/generators/docs-site/files/app/page.tsx +135 -0
  248. package/src/generators/docs-site/files/app/source.ts +8 -0
  249. package/src/generators/docs-site/files/components/mermaid.tsx +67 -0
  250. package/src/generators/docs-site/files/next.config.mjs +10 -0
  251. package/src/generators/docs-site/files/package.json +32 -0
  252. package/src/generators/docs-site/files/pnpm-workspace.yaml +7 -0
  253. package/src/generators/docs-site/files/postcss.config.mjs +6 -0
  254. package/src/generators/docs-site/files/source.config.ts +77 -0
  255. package/src/generators/docs-site/files/tailwind.config.js +10 -0
  256. package/src/generators/docs-site/files/tsconfig.json +27 -0
  257. package/src/generators/docs-site/generator.ts +476 -0
  258. package/src/generators/docs-site/schema.json +17 -0
  259. package/src/generators/electron-app/docs/principles/stack/electron/index.md +49 -0
  260. package/src/generators/electron-app/docs/principles/stack/electron/ipc-contracts.md +71 -0
  261. package/src/generators/electron-app/docs/principles/stack/electron/packaging-and-updates.md +59 -0
  262. package/src/generators/electron-app/docs/principles/stack/electron/process-model.md +53 -0
  263. package/src/generators/electron-app/docs/principles/stack/electron/security.md +70 -0
  264. package/src/generators/electron-app/docs/principles/stack/typescript/frontend.md +65 -0
  265. package/src/generators/electron-app/files/.gitignore.template +20 -0
  266. package/src/generators/electron-app/files/README.md.template +125 -0
  267. package/src/generators/electron-app/files/electron.vite.config.ts +31 -0
  268. package/src/generators/electron-app/files/eslint.config.mjs +92 -0
  269. package/src/generators/electron-app/files/forge.config.ts.template +44 -0
  270. package/src/generators/electron-app/files/package.json.template +54 -0
  271. package/src/generators/electron-app/files/playwright.config.ts +18 -0
  272. package/src/generators/electron-app/files/project.json.template +65 -0
  273. package/src/generators/electron-app/files/src/main/core-client.test.ts +81 -0
  274. package/src/generators/electron-app/files/src/main/core-client.ts +55 -0
  275. package/src/generators/electron-app/files/src/main/index.ts +157 -0
  276. package/src/generators/electron-app/files/src/main/ipc.ts +52 -0
  277. package/src/generators/electron-app/files/src/main/policy.test.ts +71 -0
  278. package/src/generators/electron-app/files/src/main/policy.ts +73 -0
  279. package/src/generators/electron-app/files/src/preload/index.ts +23 -0
  280. package/src/generators/electron-app/files/src/renderer/index.html.template +20 -0
  281. package/src/generators/electron-app/files/src/renderer/src/App.test.tsx +61 -0
  282. package/src/generators/electron-app/files/src/renderer/src/App.tsx.template +43 -0
  283. package/src/generators/electron-app/files/src/renderer/src/assets/main.css +40 -0
  284. package/src/generators/electron-app/files/src/renderer/src/env.d.ts +14 -0
  285. package/src/generators/electron-app/files/src/renderer/src/main.tsx +25 -0
  286. package/src/generators/electron-app/files/src/shared/ipc.ts +54 -0
  287. package/src/generators/electron-app/files/tests/smoke/app.spec.ts.template +133 -0
  288. package/src/generators/electron-app/files/tool/electron_exec.sh.template +83 -0
  289. package/src/generators/electron-app/files/tsconfig.json +7 -0
  290. package/src/generators/electron-app/files/tsconfig.node.json +27 -0
  291. package/src/generators/electron-app/files/tsconfig.web.json +22 -0
  292. package/src/generators/electron-app/files/vitest.config.ts +32 -0
  293. package/src/generators/electron-app/files/vitest.setup.ts +1 -0
  294. package/src/generators/electron-app/generator.ts +288 -0
  295. package/src/generators/electron-app/schema.json +23 -0
  296. package/src/generators/flutter-app/docs/principles/stack/flutter/architecture.md +78 -0
  297. package/src/generators/flutter-app/docs/principles/stack/flutter/index.md +38 -0
  298. package/src/generators/flutter-app/docs/principles/stack/flutter/platform-channels.md +51 -0
  299. package/src/generators/flutter-app/docs/principles/stack/flutter/releases-and-distribution.md +59 -0
  300. package/src/generators/flutter-app/docs/principles/stack/flutter/state-management.md +85 -0
  301. package/src/generators/flutter-app/docs/principles/stack/flutter/testing.md +86 -0
  302. package/src/generators/flutter-app/docs/principles/stack/flutter/widgets-and-composition.md +69 -0
  303. package/src/generators/flutter-app/files/.gitignore.template +30 -0
  304. package/src/generators/flutter-app/files/README.md.template +100 -0
  305. package/src/generators/flutter-app/files/analysis_options.yaml.template +18 -0
  306. package/src/generators/flutter-app/files/integration_test/app_test.dart.template +64 -0
  307. package/src/generators/flutter-app/files/lib/app.dart.template +24 -0
  308. package/src/generators/flutter-app/files/lib/config/app_config.dart +15 -0
  309. package/src/generators/flutter-app/files/lib/data/repositories/status_repository.dart +36 -0
  310. package/src/generators/flutter-app/files/lib/data/services/api_client.dart +71 -0
  311. package/src/generators/flutter-app/files/lib/domain/models/health_status.dart +23 -0
  312. package/src/generators/flutter-app/files/lib/main.dart +11 -0
  313. package/src/generators/flutter-app/files/lib/router.dart +23 -0
  314. package/src/generators/flutter-app/files/lib/ui/core/theme/app_theme.dart +110 -0
  315. package/src/generators/flutter-app/files/lib/ui/home/home_view.dart +89 -0
  316. package/src/generators/flutter-app/files/lib/ui/home/home_view_model.dart.template +38 -0
  317. package/src/generators/flutter-app/files/project.json.template +51 -0
  318. package/src/generators/flutter-app/files/pubspec.yaml.template +47 -0
  319. package/src/generators/flutter-app/files/test/api_client_test.dart.template +63 -0
  320. package/src/generators/flutter-app/files/test/fakes/fake_status_repository.dart.template +19 -0
  321. package/src/generators/flutter-app/files/test/home_view_test.dart.template +58 -0
  322. package/src/generators/flutter-app/files/tool/flutter_exec.sh.template +60 -0
  323. package/src/generators/flutter-app/generator.ts +362 -0
  324. package/src/generators/flutter-app/schema.json +23 -0
  325. package/src/generators/go-microservice/docs/principles/stack/go/concurrency.md +123 -0
  326. package/src/generators/go-microservice/docs/principles/stack/go/index.md +70 -0
  327. package/src/generators/go-microservice/docs/principles/stack/go/testing.md +168 -0
  328. package/src/generators/go-microservice/files/.air.toml.template +38 -0
  329. package/src/generators/go-microservice/files/.env.template +4 -0
  330. package/src/generators/go-microservice/files/.golangci.yml.template +82 -0
  331. package/src/generators/go-microservice/files/Dockerfile.dev.template +12 -0
  332. package/src/generators/go-microservice/files/asyncapi-pubsub.yaml.template +33 -0
  333. package/src/generators/go-microservice/files/asyncapi-ws.yaml.template +34 -0
  334. package/src/generators/go-microservice/files/cmd/api/main.go.template +149 -0
  335. package/src/generators/go-microservice/files/cmd/api/main_test.go.template +99 -0
  336. package/src/generators/go-microservice/files/cmd/worker/cleanup/main.go.template +39 -0
  337. package/src/generators/go-microservice/files/db/schema.sql.template +24 -0
  338. package/src/generators/go-microservice/files/go.mod.template +39 -0
  339. package/src/generators/go-microservice/files/internal/config/config.go.template +52 -0
  340. package/src/generators/go-microservice/files/internal/config/otel.go.template +93 -0
  341. package/src/generators/go-microservice/files/internal/core/domain/errors.go.template +16 -0
  342. package/src/generators/go-microservice/files/internal/core/domain/model.go.template +28 -0
  343. package/src/generators/go-microservice/files/internal/core/domain/user.go.template +13 -0
  344. package/src/generators/go-microservice/files/internal/core/pagination.go.template +16 -0
  345. package/src/generators/go-microservice/files/internal/core/service/app_service.go.template +79 -0
  346. package/src/generators/go-microservice/files/internal/core/service/event_hub.go.template +9 -0
  347. package/src/generators/go-microservice/files/internal/core/service/message_queue.go.template +10 -0
  348. package/src/generators/go-microservice/files/internal/core/service/outbox_repository.go.template +31 -0
  349. package/src/generators/go-microservice/files/internal/core/service/repository.go.template +23 -0
  350. package/src/generators/go-microservice/files/internal/core/service/user_repository.go.template +15 -0
  351. package/src/generators/go-microservice/files/internal/core/service/user_service.go.template +43 -0
  352. package/src/generators/go-microservice/files/internal/entrypoints/api/app_handler.go.template +108 -0
  353. package/src/generators/go-microservice/files/internal/entrypoints/api/auth_middleware_test.go.template +52 -0
  354. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook.go.template +202 -0
  355. package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook_test.go.template +82 -0
  356. package/src/generators/go-microservice/files/internal/entrypoints/api/health_handler.go.template +80 -0
  357. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware.go.template +87 -0
  358. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware_test.go.template +76 -0
  359. package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/repository.go.template +37 -0
  360. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_auth.go.template +40 -0
  361. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_loadshed.go.template +38 -0
  362. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_logging.go.template +40 -0
  363. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_ratelimit.go.template +48 -0
  364. package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_test.go.template +81 -0
  365. package/src/generators/go-microservice/files/internal/entrypoints/api/router.go.template +105 -0
  366. package/src/generators/go-microservice/files/internal/entrypoints/api/types.go.template +70 -0
  367. package/src/generators/go-microservice/files/internal/entrypoints/api/websocket_handler.go.template +39 -0
  368. package/src/generators/go-microservice/files/internal/httpclient/http_client.go.template +87 -0
  369. package/src/generators/go-microservice/files/internal/kafka/kafka.go.template +34 -0
  370. package/src/generators/go-microservice/files/internal/postgres/postgres.go.template +195 -0
  371. package/src/generators/go-microservice/files/internal/postgres/postgres_test.go.template +156 -0
  372. package/src/generators/go-microservice/files/internal/postgres/user_repository.go.template +56 -0
  373. package/src/generators/go-microservice/files/internal/pubsub/gcp_pubsub.go.template +35 -0
  374. package/src/generators/go-microservice/files/internal/websocket/client.go.template +151 -0
  375. package/src/generators/go-microservice/files/internal/websocket/hub.go.template +261 -0
  376. package/src/generators/go-microservice/files/scripts/apply-schema.sh.template +21 -0
  377. package/src/generators/go-microservice/files/tools/tools.go.template +10 -0
  378. package/src/generators/go-microservice/generator.ts +240 -0
  379. package/src/generators/go-microservice/schema.json +63 -0
  380. package/src/generators/nextjs-app/docs/principles/stack/typescript/frontend.md +65 -0
  381. package/src/generators/nextjs-app/files/.dockerignore.template +7 -0
  382. package/src/generators/nextjs-app/files/.env.example.template +24 -0
  383. package/src/generators/nextjs-app/files/.gitignore.template +5 -0
  384. package/src/generators/nextjs-app/files/Dockerfile +53 -0
  385. package/src/generators/nextjs-app/files/app/(auth)/sign-in/__sign-in__/page.tsx.template +9 -0
  386. package/src/generators/nextjs-app/files/app/(auth)/sign-up/__sign-up__/page.tsx.template +9 -0
  387. package/src/generators/nextjs-app/files/app/api/config/route.ts.template +39 -0
  388. package/src/generators/nextjs-app/files/app/api/healthz/route.test.ts +15 -0
  389. package/src/generators/nextjs-app/files/app/api/healthz/route.ts +5 -0
  390. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.test.ts.template +55 -0
  391. package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.ts.template +126 -0
  392. package/src/generators/nextjs-app/files/app/error.tsx +39 -0
  393. package/src/generators/nextjs-app/files/app/global-error.tsx +68 -0
  394. package/src/generators/nextjs-app/files/app/globals.css +105 -0
  395. package/src/generators/nextjs-app/files/app/layout.tsx +59 -0
  396. package/src/generators/nextjs-app/files/app/loading.tsx +13 -0
  397. package/src/generators/nextjs-app/files/app/not-found.tsx +30 -0
  398. package/src/generators/nextjs-app/files/app/page.tsx +20 -0
  399. package/src/generators/nextjs-app/files/components/providers/default.tsx +19 -0
  400. package/src/generators/nextjs-app/files/components/providers/production.tsx +32 -0
  401. package/src/generators/nextjs-app/files/components/providers/telemetry.tsx +76 -0
  402. package/src/generators/nextjs-app/files/components/render-smoke.test.tsx +29 -0
  403. package/src/generators/nextjs-app/files/components/theme-provider.tsx +11 -0
  404. package/src/generators/nextjs-app/files/components.json +21 -0
  405. package/src/generators/nextjs-app/files/eslint.config.mjs +120 -0
  406. package/src/generators/nextjs-app/files/hooks/use-toast.ts +7 -0
  407. package/src/generators/nextjs-app/files/instrumentation.ts +90 -0
  408. package/src/generators/nextjs-app/files/lib/api/fetcher.ts.template +130 -0
  409. package/src/generators/nextjs-app/files/lib/config.ts +21 -0
  410. package/src/generators/nextjs-app/files/lib/logger.ts +29 -0
  411. package/src/generators/nextjs-app/files/lib/schemas/index.ts +19 -0
  412. package/src/generators/nextjs-app/files/lib/utils.ts +6 -0
  413. package/src/generators/nextjs-app/files/next.config.mjs +9 -0
  414. package/src/generators/nextjs-app/files/package.json +70 -0
  415. package/src/generators/nextjs-app/files/postcss.config.mjs +8 -0
  416. package/src/generators/nextjs-app/files/proxy.test.ts.template +30 -0
  417. package/src/generators/nextjs-app/files/proxy.ts +31 -0
  418. package/src/generators/nextjs-app/files/public/.gitkeep +1 -0
  419. package/src/generators/nextjs-app/files/tsconfig.json +42 -0
  420. package/src/generators/nextjs-app/files/vitest.config.mts +15 -0
  421. package/src/generators/nextjs-app/files/vitest.setup.ts +7 -0
  422. package/src/generators/nextjs-app/generator.ts +307 -0
  423. package/src/generators/nextjs-app/schema.json +44 -0
  424. package/src/generators/python-microservice/docs/principles/stack/python/async.md +168 -0
  425. package/src/generators/python-microservice/docs/principles/stack/python/documentation.md +240 -0
  426. package/src/generators/python-microservice/docs/principles/stack/python/mcp.md +147 -0
  427. package/src/generators/python-microservice/docs/principles/stack/python/resilience.md +193 -0
  428. package/src/generators/python-microservice/docs/principles/stack/python/testing.md +322 -0
  429. package/src/generators/python-microservice/files/.env.example.template +30 -0
  430. package/src/generators/python-microservice/files/Dockerfile.template +36 -0
  431. package/src/generators/python-microservice/files/db/schema.sql.template +19 -0
  432. package/src/generators/python-microservice/files/pyproject.toml.template +76 -0
  433. package/src/generators/python-microservice/files/scripts/apply-schema.sh.template +25 -0
  434. package/src/generators/python-microservice/files/src/__packageName__/adapters/comfyui.py.template +87 -0
  435. package/src/generators/python-microservice/files/src/__packageName__/adapters/config.py.template +48 -0
  436. package/src/generators/python-microservice/files/src/__packageName__/adapters/database.py.template +21 -0
  437. package/src/generators/python-microservice/files/src/__packageName__/adapters/message_queue.py.template +29 -0
  438. package/src/generators/python-microservice/files/src/__packageName__/adapters/repository.py.template +130 -0
  439. package/src/generators/python-microservice/files/src/__packageName__/adapters/telemetry.py.template +68 -0
  440. package/src/generators/python-microservice/files/src/__packageName__/adapters/websocket_hub.py.template +36 -0
  441. package/src/generators/python-microservice/files/src/__packageName__/core/domain/entities.py.template +22 -0
  442. package/src/generators/python-microservice/files/src/__packageName__/core/domain/exceptions.py.template +43 -0
  443. package/src/generators/python-microservice/files/src/__packageName__/core/ports.py.template +42 -0
  444. package/src/generators/python-microservice/files/src/__packageName__/core/service/example_service.py.template +68 -0
  445. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/dependencies.py.template +50 -0
  446. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/middleware.py.template +131 -0
  447. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/router.py.template +37 -0
  448. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/websocket_handler.py.template +20 -0
  449. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/cleanup.py.template +35 -0
  450. package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/worker.py.template +28 -0
  451. package/src/generators/python-microservice/files/src/__packageName__/main.py.template +108 -0
  452. package/src/generators/python-microservice/files/tests/test_main.py.template +74 -0
  453. package/src/generators/python-microservice/files/tests/test_middleware.py.template +109 -0
  454. package/src/generators/python-microservice/files/tests/test_worker.py.template +16 -0
  455. package/src/generators/python-microservice/generator.ts +286 -0
  456. package/src/generators/python-microservice/schema.json +86 -0
  457. package/src/generators/shared/brand-tokens.ts +301 -0
  458. package/src/generators/shared/capabilities.ts +349 -0
  459. package/src/generators/shared/provenance.ts +61 -0
  460. package/src/generators/shared/scaffold-helpers.ts +309 -0
  461. package/src/generators/system-test-runner/NATIVE-CHECK-CONTRACT.md +20 -0
  462. package/src/generators/system-test-runner/files/tests/bets/.gitkeep +0 -0
  463. package/src/generators/system-test-runner/files/tests/bets/_archive/.gitkeep +0 -0
  464. package/src/generators/system-test-runner/files/tests/conftest.py.template +503 -0
  465. package/src/generators/system-test-runner/files/tests/pyproject.toml.template +20 -0
  466. package/src/generators/system-test-runner/files/tests/system/pages/__init__.py.template +9 -0
  467. package/src/generators/system-test-runner/files/tests/system/pages/base_page.py.template +36 -0
  468. package/src/generators/system-test-runner/files/tests/system/test_a11y_smoke.py.template +132 -0
  469. package/src/generators/system-test-runner/files/tests/system/test_contract_conformance.py.template +140 -0
  470. package/src/generators/system-test-runner/files/tests/system/test_layout_geometry.py.template +109 -0
  471. package/src/generators/system-test-runner/files/tests/system/test_render_smoke.py.template +257 -0
  472. package/src/generators/system-test-runner/files/tests/system/test_system.py.template +158 -0
  473. package/src/generators/system-test-runner/files/tests/system/test_token_conformance.py.template +206 -0
  474. package/src/generators/system-test-runner/files/tests/system/test_visual_regression.py.template +104 -0
  475. package/src/generators/system-test-runner/generator.ts +196 -0
  476. package/src/generators/system-test-runner/schema.json +24 -0
  477. package/src/generators/workspace-dev-cli/cli-src/build.mjs +42 -0
  478. package/src/generators/workspace-dev-cli/cli-src/dist/dev-bundle.js +2168 -0
  479. package/src/generators/workspace-dev-cli/cli-src/src/commands/bet.ts +442 -0
  480. package/src/generators/workspace-dev-cli/cli-src/src/commands/completion.ts +87 -0
  481. package/src/generators/workspace-dev-cli/cli-src/src/commands/doctor.ts +139 -0
  482. package/src/generators/workspace-dev-cli/cli-src/src/commands/lifecycle.ts +548 -0
  483. package/src/generators/workspace-dev-cli/cli-src/src/commands/quality.ts +127 -0
  484. package/src/generators/workspace-dev-cli/cli-src/src/commands/surface.ts +214 -0
  485. package/src/generators/workspace-dev-cli/cli-src/src/index.ts +127 -0
  486. package/src/generators/workspace-dev-cli/cli-src/src/registry.ts +194 -0
  487. package/src/generators/workspace-dev-cli/cli-src/src/theme/color.ts +130 -0
  488. package/src/generators/workspace-dev-cli/cli-src/src/theme/render.ts +158 -0
  489. package/src/generators/workspace-dev-cli/cli-src/src/theme/tokens.ts +122 -0
  490. package/src/generators/workspace-dev-cli/cli-src/src/util/context.ts +43 -0
  491. package/src/generators/workspace-dev-cli/cli-src/src/util/extensions.ts +99 -0
  492. package/src/generators/workspace-dev-cli/cli-src/src/util/paths.ts +46 -0
  493. package/src/generators/workspace-dev-cli/cli-src/src/util/proc.ts +106 -0
  494. package/src/generators/workspace-dev-cli/cli-src/src/util/prompt.ts +108 -0
  495. package/src/generators/workspace-dev-cli/cli-src/src/util/runners.ts +70 -0
  496. package/src/generators/workspace-dev-cli/cli-src/src/util/services.ts +221 -0
  497. package/src/generators/workspace-dev-cli/cli-src/src/util/version.ts +21 -0
  498. package/src/generators/workspace-dev-cli/cli-src/tsconfig.json +16 -0
  499. package/src/generators/workspace-dev-cli/files/.agents/skills/workspace-cli/SKILL.md.template +74 -0
  500. package/src/generators/workspace-dev-cli/files/dev.template +16 -0
  501. package/src/generators/workspace-dev-cli/files/docker-compose.yml.template +20 -0
  502. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/milestone-test.pytmpl.template +46 -0
  503. package/src/generators/workspace-dev-cli/files/scripts/cli/templates/slice-test.pytmpl.template +38 -0
  504. package/src/generators/workspace-dev-cli/generator.ts +136 -0
  505. package/src/generators/workspace-dev-cli/schema.json +22 -0
  506. package/src/hidden-skills/code-intelligence.md +135 -0
  507. package/src/hidden-skills/groundwork-architect/SKILL.md +114 -0
  508. package/src/hidden-skills/groundwork-architect/references/agentic-systems.md +44 -0
  509. package/src/hidden-skills/groundwork-architect/references/ai-native-architecture.md +37 -0
  510. package/src/hidden-skills/groundwork-architect/references/api-and-contracts.md +45 -0
  511. package/src/hidden-skills/groundwork-architect/references/core-and-boundaries.md +45 -0
  512. package/src/hidden-skills/groundwork-architect/references/data-architecture.md +33 -0
  513. package/src/hidden-skills/groundwork-architect/references/decision-records.md +34 -0
  514. package/src/hidden-skills/groundwork-architect/references/durable-execution.md +45 -0
  515. package/src/hidden-skills/groundwork-architect/references/evolutionary-architecture.md +37 -0
  516. package/src/hidden-skills/groundwork-architect/references/identity-and-access.md +41 -0
  517. package/src/hidden-skills/groundwork-architect/references/integration-patterns.md +39 -0
  518. package/src/hidden-skills/groundwork-architect/references/observability.md +36 -0
  519. package/src/hidden-skills/groundwork-architect/references/performance-and-scale.md +41 -0
  520. package/src/hidden-skills/groundwork-architect/references/platform-and-delivery.md +47 -0
  521. package/src/hidden-skills/groundwork-architect/references/realtime-and-async.md +28 -0
  522. package/src/hidden-skills/groundwork-architect/references/reliability.md +31 -0
  523. package/src/hidden-skills/groundwork-architect/references/security-and-trust.md +47 -0
  524. package/src/hidden-skills/groundwork-architect/references/surface-architecture.md +40 -0
  525. package/src/hidden-skills/groundwork-architect/sync-anchor.md +34 -0
  526. package/src/hidden-skills/groundwork-architecture/architecture-template.md +50 -0
  527. package/src/hidden-skills/groundwork-architecture/instructions.md +139 -0
  528. package/src/hidden-skills/groundwork-architecture/phases/01-context-ingestion.md +18 -0
  529. package/src/hidden-skills/groundwork-architecture/phases/02-technical-constraints.md +27 -0
  530. package/src/hidden-skills/groundwork-architecture/phases/03-service-design.md +19 -0
  531. package/src/hidden-skills/groundwork-architecture/phases/04-data-flow-communication.md +23 -0
  532. package/src/hidden-skills/groundwork-architecture/phases/05-component-boundaries-contracts.md +17 -0
  533. package/src/hidden-skills/groundwork-architecture/phases/06-draft-review-present.md +38 -0
  534. package/src/hidden-skills/groundwork-architecture/phases/07-commit.md +33 -0
  535. package/src/hidden-skills/groundwork-architecture/templates/architecture-cache.md +43 -0
  536. package/src/hidden-skills/groundwork-architecture-extract/instructions.md +163 -0
  537. package/src/hidden-skills/groundwork-architecture-extract/templates/architecture-extract-cache.md +21 -0
  538. package/src/hidden-skills/groundwork-bet/briefs/acceptance-auditor.md +68 -0
  539. package/src/hidden-skills/groundwork-bet/briefs/blind-reviewer.md +56 -0
  540. package/src/hidden-skills/groundwork-bet/briefs/coverage-auditor.md +95 -0
  541. package/src/hidden-skills/groundwork-bet/briefs/edge-case-tracer.md +64 -0
  542. package/src/hidden-skills/groundwork-bet/briefs/experience-auditor.md +83 -0
  543. package/src/hidden-skills/groundwork-bet/briefs/slice-worker.md +257 -0
  544. package/src/hidden-skills/groundwork-bet/instructions.md +88 -0
  545. package/src/hidden-skills/groundwork-bet/templates/bet-progress-test.md +115 -0
  546. package/src/hidden-skills/groundwork-bet/templates/change-proposal.md +38 -0
  547. package/src/hidden-skills/groundwork-bet/templates/decomposition/meta.json +4 -0
  548. package/src/hidden-skills/groundwork-bet/templates/decomposition/milestone-index.md +31 -0
  549. package/src/hidden-skills/groundwork-bet/templates/decomposition/slice.md +31 -0
  550. package/src/hidden-skills/groundwork-bet/templates/pitch.md +45 -0
  551. package/src/hidden-skills/groundwork-bet/templates/technical-design/01-ui-design.md +51 -0
  552. package/src/hidden-skills/groundwork-bet/templates/technical-design/02-data-flows.md +36 -0
  553. package/src/hidden-skills/groundwork-bet/templates/technical-design/03-api-design.md +90 -0
  554. package/src/hidden-skills/groundwork-bet/templates/technical-design/04-data-design.md +29 -0
  555. package/src/hidden-skills/groundwork-bet/workflows/01-discovery.md +200 -0
  556. package/src/hidden-skills/groundwork-bet/workflows/02-design.md +178 -0
  557. package/src/hidden-skills/groundwork-bet/workflows/03-decomposition.md +242 -0
  558. package/src/hidden-skills/groundwork-bet/workflows/04-delivery.md +226 -0
  559. package/src/hidden-skills/groundwork-bet/workflows/05-validation.md +210 -0
  560. package/src/hidden-skills/groundwork-design-system/instructions.md +125 -0
  561. package/src/hidden-skills/groundwork-design-system/templates/brand-tokens.md +182 -0
  562. package/src/hidden-skills/groundwork-design-system/templates/design-system-cache.md +64 -0
  563. package/src/hidden-skills/groundwork-design-system/tracks/_foundation.md +136 -0
  564. package/src/hidden-skills/groundwork-design-system/tracks/agentic-protocol.md +269 -0
  565. package/src/hidden-skills/groundwork-design-system/tracks/cli.md +355 -0
  566. package/src/hidden-skills/groundwork-design-system/tracks/graphical-ui.md +330 -0
  567. package/src/hidden-skills/groundwork-design-system-extract/instructions.md +124 -0
  568. package/src/hidden-skills/groundwork-design-system-extract/templates/design-system-extract-cache.md +19 -0
  569. package/src/hidden-skills/groundwork-designer/SKILL.md +108 -0
  570. package/src/hidden-skills/groundwork-designer/references/accessibility.md +33 -0
  571. package/src/hidden-skills/groundwork-designer/references/ai-native-design.md +37 -0
  572. package/src/hidden-skills/groundwork-designer/references/design-review.md +29 -0
  573. package/src/hidden-skills/groundwork-designer/references/design-systems-and-tokens.md +33 -0
  574. package/src/hidden-skills/groundwork-designer/references/interaction-and-motion.md +37 -0
  575. package/src/hidden-skills/groundwork-designer/references/layout-and-space.md +33 -0
  576. package/src/hidden-skills/groundwork-designer/references/usability-and-ux.md +33 -0
  577. package/src/hidden-skills/groundwork-designer/references/visual-craft.md +49 -0
  578. package/src/hidden-skills/groundwork-designer/sync-anchor.md +20 -0
  579. package/src/hidden-skills/groundwork-doc-sync/instructions.md +100 -0
  580. package/src/hidden-skills/groundwork-elicit/instructions.md +66 -0
  581. package/src/hidden-skills/groundwork-elicit/methods.md +65 -0
  582. package/src/hidden-skills/groundwork-infra-adopt/instructions.md +168 -0
  583. package/src/hidden-skills/groundwork-infra-adopt/templates/infra-adopt-cache.md +21 -0
  584. package/src/hidden-skills/groundwork-mvp/instructions.md +223 -0
  585. package/src/hidden-skills/groundwork-mvp/templates/mvp-cache.md +9 -0
  586. package/src/hidden-skills/groundwork-patch/instructions.md +40 -0
  587. package/src/hidden-skills/groundwork-persona/instructions.md +65 -0
  588. package/src/hidden-skills/groundwork-product/SKILL.md +102 -0
  589. package/src/hidden-skills/groundwork-product/references/ai-native-product.md +45 -0
  590. package/src/hidden-skills/groundwork-product/references/discovery-and-opportunity.md +38 -0
  591. package/src/hidden-skills/groundwork-product/references/product-risks.md +52 -0
  592. package/src/hidden-skills/groundwork-product/references/requirements-and-specs.md +39 -0
  593. package/src/hidden-skills/groundwork-product/references/scope-and-sequencing.md +35 -0
  594. package/src/hidden-skills/groundwork-product/references/shaping-and-appetite.md +48 -0
  595. package/src/hidden-skills/groundwork-product/references/success-metrics-and-signals.md +37 -0
  596. package/src/hidden-skills/groundwork-product/sync-anchor.md +19 -0
  597. package/src/hidden-skills/groundwork-product-brief/instructions.md +231 -0
  598. package/src/hidden-skills/groundwork-product-brief-extract/instructions.md +139 -0
  599. package/src/hidden-skills/groundwork-product-brief-extract/templates/product-brief-extract-cache.md +17 -0
  600. package/src/hidden-skills/groundwork-review/checklists/architecture.md +93 -0
  601. package/src/hidden-skills/groundwork-review/checklists/bet-pitch.md +94 -0
  602. package/src/hidden-skills/groundwork-review/checklists/decomposition.md +135 -0
  603. package/src/hidden-skills/groundwork-review/checklists/design-system.md +85 -0
  604. package/src/hidden-skills/groundwork-review/checklists/domain-entity.md +66 -0
  605. package/src/hidden-skills/groundwork-review/checklists/implementation-readiness.md +47 -0
  606. package/src/hidden-skills/groundwork-review/checklists/infrastructure.md +68 -0
  607. package/src/hidden-skills/groundwork-review/checklists/maturity.md +71 -0
  608. package/src/hidden-skills/groundwork-review/checklists/product-brief.md +69 -0
  609. package/src/hidden-skills/groundwork-review/checklists/technical-design.md +112 -0
  610. package/src/hidden-skills/groundwork-review/instructions.md +181 -0
  611. package/src/hidden-skills/groundwork-scaffold/instructions.md +254 -0
  612. package/src/hidden-skills/groundwork-scaffold/phases/01-ingestion-service-mapping.md +87 -0
  613. package/src/hidden-skills/groundwork-scaffold/phases/02-scaffolding-execution.md +15 -0
  614. package/src/hidden-skills/groundwork-scaffold/phases/03-service-documentation-api-stubs.md +100 -0
  615. package/src/hidden-skills/groundwork-scaffold/phases/04-infrastructure-verification.md +17 -0
  616. package/src/hidden-skills/groundwork-scaffold/phases/05-draft-review.md +19 -0
  617. package/src/hidden-skills/groundwork-scaffold/phases/06-commit.md +19 -0
  618. package/src/hidden-skills/groundwork-scaffold/templates/scaffold-cache.md +23 -0
  619. package/src/hidden-skills/groundwork-scan/instructions.md +164 -0
  620. package/src/hidden-skills/groundwork-scan/references/digest-schema.md +66 -0
  621. package/src/hidden-skills/groundwork-scan/references/exclusions.md +44 -0
  622. package/src/hidden-skills/groundwork-scan/templates/architecture-findings.md +42 -0
  623. package/src/hidden-skills/groundwork-scan/templates/design-findings.md +23 -0
  624. package/src/hidden-skills/groundwork-scan/templates/overview.md +26 -0
  625. package/src/hidden-skills/groundwork-scan/templates/product-findings.md +23 -0
  626. package/src/hidden-skills/groundwork-scan/templates/scan-state.json +19 -0
  627. package/src/hidden-skills/groundwork-stack-forge/instructions.md +150 -0
  628. package/src/hidden-skills/groundwork-stack-forge/references/authoring-engineer-skills.md +107 -0
  629. package/src/hidden-skills/groundwork-surface-activation/instructions.md +138 -0
  630. package/src/hidden-skills/groundwork-update/briefs/reconcile-worker.md +196 -0
  631. package/src/hidden-skills/groundwork-update/instructions.md +200 -0
  632. package/src/hidden-skills/groundwork-writer/SKILL.md +278 -0
  633. package/src/hidden-skills/maturity-model.md +125 -0
  634. package/src/hidden-skills/operating-contract.md +400 -0
  635. package/src/hidden-skills/repo-map-schema.md +90 -0
  636. package/src/hidden-skills/templates/adr.md +57 -0
  637. package/src/hidden-skills/templates/capability-ports.md +71 -0
  638. package/src/hidden-skills/templates/discovery-notes.md +33 -0
  639. package/src/hidden-skills/templates/domain-entity.md +80 -0
  640. package/src/hidden-skills/templates/gap-ledger.md +21 -0
  641. package/src/hidden-skills/templates/handoff.md +37 -0
  642. package/src/hidden-skills/templates/maturity.md +39 -0
  643. package/src/hidden-skills/templates/surfaces.md +207 -0
  644. package/src/skills/groundwork-check/SKILL.md +56 -0
  645. package/src/skills/groundwork-check/instructions.md +70 -0
  646. package/src/skills/groundwork-orchestrator/SKILL.md +176 -0
  647. package/src/skills/groundwork-orchestrator/workflow-index.md +50 -0
@@ -0,0 +1,70 @@
1
+ import * as fs from 'fs';
2
+ import { CONFIG_PATH } from './paths';
3
+
4
+ /** A declared native process the CLI manages directly — a surface app (Electron,
5
+ * CLI, Flutter) or a native sidecar (a macOS-only Python service that can't be
6
+ * containerized). Runners decouple "managed by ./dev" from "is a docker-compose
7
+ * service": the lifecycle commands start/stop/tail/report them alongside Docker
8
+ * infra and natively-run app services. Declared in `.dev/dev.config.json`. */
9
+ export interface Runner {
10
+ /** Unique within the workspace; keys the runner's pid and log files. */
11
+ name: string;
12
+ /** Display/metadata only. */
13
+ kind?: 'sidecar' | 'surface';
14
+ /** Shell command to launch. Run via `bash -c` from `cwd`. */
15
+ cmd: string;
16
+ /** Working directory, relative to the repo root. */
17
+ cwd?: string;
18
+ /** Extra environment merged over the parent process env. */
19
+ env?: Record<string, string>;
20
+ /** Optional readiness probe. Carried but not enforced by `start` yet. */
21
+ health?: unknown;
22
+ /** Whether `./dev start` launches it (default true). `false` = registered and
23
+ * reportable, but not part of the boot set (e.g. a CLI tool). */
24
+ autostart?: boolean;
25
+ }
26
+
27
+ /** Coerce a raw `runners` value (untrusted JSON) into validated Runner records.
28
+ * Entries missing a string `name`/`cmd` are dropped rather than throwing, so a
29
+ * malformed config degrades to fewer runners instead of breaking every command. */
30
+ export function parseRunners(raw: unknown): Runner[] {
31
+ if (!Array.isArray(raw)) return [];
32
+ const out: Runner[] = [];
33
+ for (const item of raw) {
34
+ if (!item || typeof item !== 'object') continue;
35
+ const r = item as Record<string, unknown>;
36
+ if (typeof r.name !== 'string' || typeof r.cmd !== 'string') continue;
37
+ out.push({
38
+ name: r.name,
39
+ kind: r.kind === 'surface' ? 'surface' : r.kind === 'sidecar' ? 'sidecar' : undefined,
40
+ cmd: r.cmd,
41
+ cwd: typeof r.cwd === 'string' ? r.cwd : undefined,
42
+ env:
43
+ r.env && typeof r.env === 'object' && !Array.isArray(r.env)
44
+ ? (r.env as Record<string, string>)
45
+ : undefined,
46
+ health: r.health ?? null,
47
+ autostart: r.autostart === false ? false : true,
48
+ });
49
+ }
50
+ return out;
51
+ }
52
+
53
+ /** Load runners straight from dev.config.json. Used where there is no Ctx
54
+ * (e.g. service discovery in services.ts). Returns [] on any read/parse error. */
55
+ export function loadRunners(): Runner[] {
56
+ try {
57
+ if (!fs.existsSync(CONFIG_PATH)) return [];
58
+ const raw = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8')) as { runners?: unknown };
59
+ return parseRunners(raw.runners);
60
+ } catch {
61
+ return [];
62
+ }
63
+ }
64
+
65
+ /** Names of every registered runner — the set of `services/` directories that
66
+ * are managed as runners and must therefore be excluded from app-service
67
+ * discovery so they are not double-managed or boot-detected by marker file. */
68
+ export function runnerNames(): Set<string> {
69
+ return new Set(loadRunners().map((r) => r.name));
70
+ }
@@ -0,0 +1,221 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { PID_DIR, SERVICES_DIR, pidFile } from './paths';
4
+ import { capture, sleep } from './proc';
5
+ import { runnerNames } from './runners';
6
+
7
+ export type ServiceType = 'go' | 'node' | 'python' | 'unknown';
8
+
9
+ let composeServicesCache: Set<string> | null | undefined;
10
+
11
+ /** Compose membership, resolved once per process. `null` means the topology
12
+ * could not be read (no docker CLI / no compose file) — callers fall back to
13
+ * directory listing so the CLI still degrades gracefully without Docker. */
14
+ function getComposeServices(): Set<string> | null {
15
+ if (composeServicesCache !== undefined) return composeServicesCache;
16
+ const r = capture('docker', ['compose', 'config', '--services']);
17
+ composeServicesCache =
18
+ r.status === 0
19
+ ? new Set(
20
+ r.stdout
21
+ .split('\n')
22
+ .map((s) => s.trim())
23
+ .filter(Boolean),
24
+ )
25
+ : null;
26
+ return composeServicesCache;
27
+ }
28
+
29
+ /** App services are the subdirectories of `services/` that are wired into the
30
+ * workspace docker-compose topology. Surface apps (mobile, desktop, CLI)
31
+ * live under `services/` too but never join compose — they have their own
32
+ * Nx targets and are excluded from backend lifecycle commands
33
+ * (start/migrate/doctor would otherwise boot phantom backends and create
34
+ * phantom databases for them). */
35
+ export function getAppServices(): string[] {
36
+ if (!fs.existsSync(SERVICES_DIR)) return [];
37
+ const runners = runnerNames();
38
+ const dirs = fs
39
+ .readdirSync(SERVICES_DIR, { withFileTypes: true })
40
+ .filter((d) => d.isDirectory())
41
+ .map((d) => d.name)
42
+ // A dir registered as a runner is managed as a native runner, not an app
43
+ // service — exclude it from both the compose-readable and the fallback path
44
+ // so it is never double-managed or boot-detected by marker file.
45
+ .filter((d) => !runners.has(d))
46
+ .sort();
47
+ const compose = getComposeServices();
48
+ if (compose === null) return dirs;
49
+ return dirs.filter((d) => compose.has(d));
50
+ }
51
+
52
+ /** Infra services are compose services that are NOT app services. */
53
+ export function getInfraServices(): string[] {
54
+ const app = new Set(getAppServices());
55
+ const r = capture('docker', ['compose', 'config', '--services']);
56
+ if (r.status !== 0) return [];
57
+ return r.stdout
58
+ .split('\n')
59
+ .map((s) => s.trim())
60
+ .filter(Boolean)
61
+ .filter((s) => !app.has(s));
62
+ }
63
+
64
+ export function serviceDir(svc: string): string {
65
+ return path.join(SERVICES_DIR, svc);
66
+ }
67
+
68
+ /** Detect a service's type by marker file. Precedence matches the bash CLI:
69
+ * .air.toml (go) → package.json (node) → pyproject.toml (python). */
70
+ export function detectType(svc: string): ServiceType {
71
+ const dir = serviceDir(svc);
72
+ if (fs.existsSync(path.join(dir, '.air.toml'))) return 'go';
73
+ if (fs.existsSync(path.join(dir, 'package.json'))) return 'node';
74
+ if (fs.existsSync(path.join(dir, 'pyproject.toml'))) return 'python';
75
+ return 'unknown';
76
+ }
77
+
78
+ /** Locate a Python service's pydantic Settings module (it carries `server_port`).
79
+ * The package name is dynamic, so walk `src/` rather than assuming a fixed path. */
80
+ function findPythonConfig(dir: string): string | null {
81
+ const src = path.join(dir, 'src');
82
+ if (!fs.existsSync(src)) return null;
83
+ const stack = [src];
84
+ while (stack.length > 0) {
85
+ const cur = stack.pop() as string;
86
+ let entries: fs.Dirent[];
87
+ try {
88
+ entries = fs.readdirSync(cur, { withFileTypes: true });
89
+ } catch {
90
+ continue;
91
+ }
92
+ for (const e of entries) {
93
+ const full = path.join(cur, e.name);
94
+ if (e.isDirectory()) stack.push(full);
95
+ else if (e.name === 'config.py') return full;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+
101
+ /** Resolve a service's HTTP port from its language marker file. Go reads
102
+ * `.env` (PORT/SERVER_PORT); Node reads `package.json` (`next dev --port`);
103
+ * Python reads `server_port` from its Settings module. Returns null when the
104
+ * port can't be determined (the caller renders this as an "unknown port" row). */
105
+ export function servicePort(svc: string): number | null {
106
+ const dir = serviceDir(svc);
107
+ switch (detectType(svc)) {
108
+ case 'go': {
109
+ const env = path.join(dir, '.env');
110
+ if (fs.existsSync(env)) {
111
+ const m = fs.readFileSync(env, 'utf8').match(/^(?:PORT|SERVER_PORT)=(\d+)/m);
112
+ if (m) return parseInt(m[1], 10);
113
+ }
114
+ return null;
115
+ }
116
+ case 'node': {
117
+ const pkg = path.join(dir, 'package.json');
118
+ if (fs.existsSync(pkg)) {
119
+ const m = fs.readFileSync(pkg, 'utf8').match(/next dev --port (\d+)/);
120
+ if (m) return parseInt(m[1], 10);
121
+ }
122
+ return null;
123
+ }
124
+ case 'python': {
125
+ const cfg = findPythonConfig(dir);
126
+ if (cfg) {
127
+ const m = fs.readFileSync(cfg, 'utf8').match(/server_port:\s*int\s*=\s*(\d+)/);
128
+ if (m) return parseInt(m[1], 10);
129
+ }
130
+ return null;
131
+ }
132
+ default:
133
+ return null;
134
+ }
135
+ }
136
+
137
+ /** A service's health endpoint path. Next.js/Node apps expose `/api/healthz`;
138
+ * Go and Python services expose `/health`. */
139
+ export function serviceHealthPath(svc: string): string {
140
+ return detectType(svc) === 'node' ? '/api/healthz' : '/health';
141
+ }
142
+
143
+ /** The boot command for a service, faithful to the bash CLI. */
144
+ export function bootCommand(svc: string): string | null {
145
+ const dir = serviceDir(svc);
146
+ switch (detectType(svc)) {
147
+ case 'go':
148
+ return `cd ${JSON.stringify(dir)} && air`;
149
+ case 'node':
150
+ return `cd ${JSON.stringify(dir)} && ([ -d node_modules ] || npm install --legacy-peer-deps) && npm run dev`;
151
+ case 'python':
152
+ return `cd ${JSON.stringify(dir)} && uv run python src/main.py`;
153
+ default:
154
+ return null;
155
+ }
156
+ }
157
+
158
+ export function readPid(svc: string): number | null {
159
+ const f = pidFile(svc);
160
+ if (!fs.existsSync(f)) return null;
161
+ const n = parseInt(fs.readFileSync(f, 'utf8').trim(), 10);
162
+ return Number.isFinite(n) ? n : null;
163
+ }
164
+
165
+ function pidAlive(pid: number): boolean {
166
+ try {
167
+ process.kill(pid, 0);
168
+ return true;
169
+ } catch {
170
+ return false;
171
+ }
172
+ }
173
+
174
+ /** True if the service has a live PID. Cleans up a stale pidfile, matching bash. */
175
+ export function isRunning(svc: string): boolean {
176
+ const pid = readPid(svc);
177
+ if (pid === null) return false;
178
+ if (pidAlive(pid)) return true;
179
+ fs.rmSync(pidFile(svc), { force: true });
180
+ return false;
181
+ }
182
+
183
+ /** True if a pidfile exists but the process is dead. */
184
+ export function isDead(svc: string): boolean {
185
+ const pid = readPid(svc);
186
+ return pid !== null && !pidAlive(pid);
187
+ }
188
+
189
+ export function writePid(svc: string, pid: number): void {
190
+ fs.mkdirSync(PID_DIR, { recursive: true });
191
+ fs.writeFileSync(pidFile(svc), `${pid}\n`);
192
+ }
193
+
194
+ export function removePid(svc: string): void {
195
+ fs.rmSync(pidFile(svc), { force: true });
196
+ }
197
+
198
+ /** Recursively terminate a process tree: SIGTERM, grace period, then SIGKILL. */
199
+ export async function killTree(pid: number): Promise<void> {
200
+ const r = capture('pgrep', ['-P', String(pid)]);
201
+ const children = r.stdout
202
+ .split('\n')
203
+ .map((s) => parseInt(s.trim(), 10))
204
+ .filter((n) => Number.isFinite(n));
205
+ for (const child of children) {
206
+ await killTree(child);
207
+ }
208
+ try {
209
+ process.kill(pid, 'SIGTERM');
210
+ } catch {
211
+ /* already gone */
212
+ }
213
+ await sleep(1000);
214
+ if (pidAlive(pid)) {
215
+ try {
216
+ process.kill(pid, 'SIGKILL');
217
+ } catch {
218
+ /* already gone */
219
+ }
220
+ }
221
+ }
@@ -0,0 +1,21 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { ROOT } from './paths';
4
+
5
+ /** The GroundWork package version this bundle was built from. Injected by
6
+ * build.mjs via esbuild `define` so the deployed bundle knows its own vintage —
7
+ * the upgrade path (./dev doctor, groundwork check) compares it against the
8
+ * install's framework stamp to flag a trailing bundle. */
9
+ export const DEV_CLI_VERSION: string = process.env.GW_DEV_CLI_VERSION || 'unknown';
10
+
11
+ /** The framework version stamped into this project by groundwork init/update. */
12
+ export function stampedFrameworkVersion(): string | null {
13
+ try {
14
+ const state = JSON.parse(
15
+ fs.readFileSync(path.join(ROOT, '.groundwork', 'config', 'state.json'), 'utf8'),
16
+ ) as { groundwork?: { version?: string } };
17
+ return (state.groundwork && state.groundwork.version) || null;
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2021",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2021"],
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "resolveJsonModule": true,
12
+ "noEmit": true,
13
+ "types": ["node"]
14
+ },
15
+ "include": ["src/**/*.ts"]
16
+ }
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: workspace-cli
3
+ description: "The primary toolkit for managing local services and the bet delivery workflow in this workspace. Use for start/stop/status, running tests, scaffolding bet/milestone/slice stubs, and archiving delivered bet-progress suites."
4
+ ---
5
+
6
+ # Workspace CLI Skill
7
+
8
+ You are operating in a workspace that uses a custom `./dev` CLI to manage its local development environment and bet delivery workflow.
9
+ Whenever the user asks you to start, stop, or check the status of the local services, or to scaffold a bet/milestone/slice, run bet-progress tests, or archive a delivered bet, you MUST use this CLI.
10
+
11
+ ## Capabilities
12
+
13
+ The `./dev` CLI is an executable Node program in the root directory — a thin launcher over a prebuilt, zero-dependency bundle in `.dev/`. It needs no `npm install`; it runs on the Node the workspace already requires. It provides the following commands:
14
+
15
+ ### Lifecycle
16
+
17
+ - `./dev start`: Starts all services. It automatically handles spinning up infrastructure (like databases) in Docker, and booting application code natively.
18
+ - `./dev start --docker`: Forces ALL services, including application code, to run inside Docker.
19
+ - `./dev stop`: Gracefully kills all native processes and shuts down Docker containers.
20
+ - `./dev reset` / `./dev reset --docker`: Full-cycle recycle — stop, wipe volumes (`clean --hard`), start, then migrate. Use to recover from a corrupted local environment.
21
+ - `./dev status`: Displays a human-readable table of running Docker and native processes.
22
+ - `./dev status --json`: Returns JSON `{ "docker": [{service,status,ports}], "native": [{service,status,pid}] }` on stdout. **Always use this flag when you need to programmatically determine what is running** — never guess ports.
23
+ - `./dev status --watch`: A live, self-refreshing dashboard for humans (TTY only; press `q` to exit). Do not call from a tool — use `--json` instead.
24
+ - `./dev logs`: Prints the recent tail of native and Docker logs, then exits. Safe to run non-interactively.
25
+ - `./dev logs <service>`: Filters to a single service — its native log file if it has one, otherwise its Docker container. An unknown name fails loud (exit 1).
26
+ - `./dev logs --follow`: Streams logs continuously (TTY only). Do not run this from a tool call — it will not return.
27
+ - `./dev health` / `./dev health --json`: Actively HTTP-polls every app service's health endpoint plus Jaeger and prints a pass/fail panel. Exits 1 when any endpoint is down — safe to run non-interactively.
28
+ - `./dev doctor` / `./dev doctor --json`: Verify the local environment. Dependency checks are advisory, but runtime-connectivity failures (DB/Redis/Jaeger unreachable, stack down, missing migration tooling) gate the exit code (non-zero).
29
+ - `./dev completion bash|zsh|fish`: Print a shell completion script.
30
+
31
+ ### Testing
32
+
33
+ - `./dev test`: Run system tests against the already-running stack (fast inner loop).
34
+ - `./dev test integration`: Boot the dev stack, run system tests with FAIL-LOUD flags, then tear down. Requires Docker — flag before running.
35
+ - `./dev test bet <slug>`: Run a bet-progress suite at `tests/bets/<slug>/` against the already-running stack.
36
+ - `./dev test bet <slug> --integration`: Boot the dev stack, run the bet-progress suite, then tear down. Requires Docker — flag before running.
37
+
38
+ ### Bet Workflow
39
+
40
+ The bet workflow commands scaffold and manage bet-progress tests — the red, up-front proof-of-work suite written during Decomposition. Two test populations exist: **bet-progress tests** (temporary, in `tests/bets/<slug>/`, archived at delivery) and **permanent best-practice tests** (in service repos and `tests/system/`, stay forever).
41
+
42
+ - `./dev new bet <slug>`: Create `docs/bets/<slug>/` and `tests/bets/<slug>/` directories for a new bet. `<slug>` must be lowercase kebab-case.
43
+ - `./dev new milestone <bet-slug> <milestone-slug>`: Scaffold a red milestone test stub at `tests/bets/<bet-slug>/test_milestone_<N>_<milestone-slug>.py`. `N` is auto-incremented.
44
+ - `./dev new slice <bet-slug> <milestone-slug> <service> <slice-slug>`: Scaffold a red slice test stub at `tests/bets/<bet-slug>/test_slice_<N>_<service>_<slice-slug>.py`. `N` is auto-incremented.
45
+ - `./dev archive bet <slug>`: Archive a delivered bet's progress suite — `git mv tests/bets/<slug>/ tests/bets/_archive/<slug>/`.
46
+
47
+ ### Layout
48
+
49
+ ```
50
+ tests/bets/<slug>/ # Active bet-progress suite (Phases 3–4)
51
+ ├── test_milestone_<N>_<slug>.py # Milestone proof: interface-level + API-level
52
+ └── test_slice_<N>_<service>_<slug>.py # Slice proof, bounded by parent milestone
53
+
54
+ tests/bets/_archive/<slug>/ # Archived at Phase 5 (delivery); permanent tests take over
55
+ ```
56
+
57
+ Shared fixtures (`cluster`, `api_client`, `pure_state_reset`, `frontend_base_url`) are auto-discovered from `tests/conftest.py` — no explicit import needed in bet test files.
58
+
59
+ ## Best Practices for Agents
60
+
61
+ 1. **Service Discovery**: Do not guess what ports services are running on. Run `./dev status --json` to get the ground truth.
62
+ 2. **Log Reading**: `./dev logs` prints the recent tail and exits — safe to call. Only `./dev logs --follow` streams and will hang a tool call; never use `--follow` from `run_command`. For deeper history, read the per-service files in `.dev/logs/*.log`.
63
+ 3. **Idempotency**: `./dev start`, `./dev stop`, and `./dev new bet` are fully idempotent. It is safe to run them multiple times.
64
+ 4. **Bet test stubs**: After `./dev new milestone` or `./dev new slice`, fill in the `pytest.fail(...)` stub with the target-state assertion before starting Delivery. The stub is intentionally red — it should stay red until the implementation exists.
65
+ 5. **Docker gates**: `./dev test integration` and `./dev test bet <slug> --integration` boot Docker. Do not run these commands unless Docker is available and the user expects the boot cost.
66
+
67
+ ## Non-interactive behavior (the agent contract)
68
+
69
+ The CLI never blocks an agent. `--json` and any non-TTY invocation skip all spinners, live rendering, and prompts — output is plain and the command always returns.
70
+
71
+ - `./dev status --json` and `./dev doctor --json` emit machine-readable JSON to stdout; all human chrome goes to stderr, so the JSON is pipe-clean.
72
+ - `./dev new bet|milestone|slice` with all arguments supplied runs fully non-interactively — always safe. (When run in a terminal with arguments omitted, it may prompt; supply the arguments to avoid that.)
73
+ - `./dev logs` is non-streaming by default. Only `./dev logs --follow` streams, and it requires a TTY — never call it from a tool.
74
+ - Exit codes: `0` success, `1` failure, `2` usage error (unknown command / bad arguments), `130` on interrupt.
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * ./dev — the local development control plane.
4
+ *
5
+ * This is a thin launcher over a prebuilt, zero-dependency Node bundle in
6
+ * .dev/dev-bundle.js. The bundle is built from the GroundWork source and copied in
7
+ * verbatim, so no `npm install` is needed in this project — it runs on the Node that
8
+ * the Nx workspace already requires.
9
+ *
10
+ * Branding and theming come from .dev/dev.config.json (projected from the design
11
+ * system's brand tokens). See the workspace-cli skill for the agent-facing contract.
12
+ */
13
+ 'use strict';
14
+ const path = require('path');
15
+ process.env.DEV_ROOT = __dirname;
16
+ require(path.join(__dirname, '.dev', 'dev-bundle.js'));
@@ -0,0 +1,20 @@
1
+ version: '3.8'
2
+
3
+ # No infrastructure is provisioned by default. There is intentionally no
4
+ # `services:` block here — every backing service is opt-in, added on demand by
5
+ # the generator for a service that actually uses it, so a project provisions
6
+ # only what it needs and `./dev start` never boots an unused (or empty) stack:
7
+ #
8
+ # - db (Postgres + pgvector) + jaeger (OTLP traces): added by the go / python
9
+ # microservice generators, which use a per-service database and export
10
+ # telemetry. jaeger alone is added by the nextjs generator.
11
+ # - redis / the pubsub emulator: added only for a WebSocket backplane, Redis
12
+ # pub/sub, or GCP Pub/Sub messaging.
13
+ #
14
+ # A workspace with no containerized service (e.g. a desktop or CLI app whose
15
+ # stores are local-file) has no services at all; its surfaces and native
16
+ # sidecars are managed as runners in .dev/dev.config.json instead.
17
+
18
+ networks:
19
+ groundwork-net:
20
+ driver: bridge
@@ -0,0 +1,46 @@
1
+ """Bet-progress test — Milestone @@N@@: @@MILESTONE@@
2
+ Bet: @@BET@@
3
+
4
+ This test is RED by design. It defines the target state for Milestone @@N@@.
5
+ Run './dev test bet @@BET@@' to see it fail; it will pass when Delivery is complete.
6
+
7
+ Two complementary proof layers — fill in both before starting Delivery:
8
+ Layer 1 — Interface: what the user observes in the product's interface
9
+ Layer 2 — API: what the running service returns end-to-end over HTTP
10
+ """
11
+
12
+ import pytest
13
+
14
+
15
+ # ---------------------------------------------------------------------------
16
+ # Layer 1: Interface-level proof
17
+ # ---------------------------------------------------------------------------
18
+ # Use the fixture that matches your project's interface track (docs/design-system.md):
19
+ # graphical-ui → page (pytest-playwright browser fixture)
20
+ # cli → subprocess.run / pexpect
21
+ # agentic-protocol → httpx to the protocol endpoint
22
+ #
23
+ # def test_milestone_@@N@@_@@MILESTONE@@_interface(cluster, page, frontend_base_url):
24
+ # """Assert what the user observes at Milestone @@N@@."""
25
+ # page.goto(f"{frontend_base_url}/your-route")
26
+ # # assert page.locator("...").is_visible()
27
+ # pytest.fail("bet-progress test not yet implemented — describe the user-visible target state here")
28
+
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Layer 2: API-level system proof
32
+ # ---------------------------------------------------------------------------
33
+ # Uses shared fixtures from tests/conftest.py (auto-discovered, no import needed):
34
+ # cluster — health-gates the running services
35
+ # api_client — async httpx.AsyncClient with traceparent header
36
+ #
37
+ @pytest.mark.asyncio
38
+ async def test_milestone_@@N@@_@@MILESTONE@@_api(cluster, api_client):
39
+ """Assert the API-level outcome for Milestone @@N@@: @@MILESTONE@@."""
40
+ # TODO: replace with the real end-to-end HTTP assertion
41
+ # resp = await api_client.get("http://localhost:<port>/api/v1/...")
42
+ # assert resp.status_code == 200
43
+ pytest.fail(
44
+ "bet-progress test not yet implemented — "
45
+ "assert the user-visible outcome via the running API for milestone @@N@@ (@@MILESTONE@@)"
46
+ )
@@ -0,0 +1,38 @@
1
+ """Bet-progress test — Slice @@N@@: @@SLUG@@ (service: @@SERVICE@@)
2
+ Bet: @@BET@@ | Parent milestone: @@MILESTONE@@
3
+
4
+ This test is RED by design. It proves the vertical capability this slice contributes
5
+ toward Milestone @@MILESTONE@@. Tests are bounded by — not duplicates of — the parent
6
+ milestone tests.
7
+
8
+ Run './dev test bet @@BET@@' to see it fail; it will pass when this slice is merged.
9
+ """
10
+
11
+ import pytest
12
+
13
+
14
+ # ---------------------------------------------------------------------------
15
+ # Slice capability proof (@@SERVICE@@ service)
16
+ # ---------------------------------------------------------------------------
17
+ # Slice tests hit the running service from the outside.
18
+ # They do not import application code, mock services, or assume internal schema details.
19
+ #
20
+ # Use shared fixtures from tests/conftest.py (auto-discovered, no import needed):
21
+ # cluster — health-gates the running stack
22
+ # api_client — async httpx.AsyncClient with traceparent header
23
+ #
24
+ @pytest.mark.asyncio
25
+ async def test_slice_@@N@@_@@SLUG@@(cluster, api_client):
26
+ """Assert the vertical capability for slice @@N@@ (@@SLUG@@) in @@SERVICE@@.
27
+
28
+ This slice contributes to Milestone @@MILESTONE@@.
29
+ Each assertion here should trace to a Required Capability in decomposition.md.
30
+ """
31
+ # TODO: replace with a falsifiable end-to-end HTTP assertion against @@SERVICE@@
32
+ # resp = await api_client.post("http://localhost:<port>/api/v1/...", json={...})
33
+ # assert resp.status_code == 201
34
+ # assert resp.json().get("id") is not None
35
+ pytest.fail(
36
+ "bet-progress test not yet implemented — "
37
+ "assert the vertical capability for slice @@N@@ (@@SLUG@@) in @@SERVICE@@"
38
+ )
@@ -0,0 +1,136 @@
1
+ import { formatFiles, generateFiles, Tree } from '@nx/devkit';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import { recordGeneratorProvenance } from '../shared/provenance';
5
+
6
+ export interface WorkspaceDevCliGeneratorSchema {
7
+ appName?: string;
8
+ primaryColor?: string;
9
+ hexColor?: string;
10
+ }
11
+
12
+ const BRAND_TOKENS_PATH = '.groundwork/config/brand-tokens.json';
13
+
14
+ /** Project the design system's brand tokens (or sensible defaults) into the runtime
15
+ * config the ./dev bundle reads. Self-discovers brand-tokens.json if the design
16
+ * system has run; otherwise builds a minimal Tier-1 identity from the options. */
17
+ function buildDevConfig(
18
+ tree: Tree,
19
+ projectPrefix: string,
20
+ appName: string,
21
+ hexColor: string,
22
+ ): Record<string, unknown> {
23
+ if (tree.exists(BRAND_TOKENS_PATH)) {
24
+ try {
25
+ const raw = JSON.parse(tree.read(BRAND_TOKENS_PATH, 'utf-8') || '{}');
26
+ return {
27
+ projectPrefix,
28
+ identity: raw.identity,
29
+ terminal: raw.terminal,
30
+ };
31
+ } catch {
32
+ /* malformed tokens — fall through to defaults */
33
+ }
34
+ }
35
+ return {
36
+ projectPrefix,
37
+ identity: {
38
+ appName,
39
+ wordmark: '◢◤',
40
+ primary: hexColor || '#5fafff',
41
+ accent: '#d7afff',
42
+ voice: 'clear, modern',
43
+ },
44
+ };
45
+ }
46
+
47
+ export default async function (tree: Tree, options: WorkspaceDevCliGeneratorSchema) {
48
+ const projectRoot = '.';
49
+ const appName = options.appName || 'Workspace';
50
+ const projectPrefix = appName.toLowerCase().replace(/\s+/g, '-');
51
+
52
+ const templateOptions = {
53
+ ...options,
54
+ appName,
55
+ primaryColor: options.primaryColor || 'BLUE',
56
+ hexColor: options.hexColor || '',
57
+ projectPrefix,
58
+ tmpl: '',
59
+ };
60
+
61
+ // docker-compose.yml accretes service registrations from every service
62
+ // generator after this one runs. A re-run of this generator (e.g. to pick
63
+ // up a newer CLI bundle) must never reset the workspace topology to the
64
+ // base infra — preserve the existing file verbatim.
65
+ const existingCompose = tree.exists('docker-compose.yml')
66
+ ? tree.read('docker-compose.yml', 'utf-8')
67
+ : null;
68
+
69
+ // EJS-templated files: the launcher, docker-compose, bet stub templates, and the
70
+ // workspace-cli skill. The prebuilt bundle is deliberately NOT among these — EJS
71
+ // would corrupt `<%` sequences inside bundled code.
72
+ generateFiles(
73
+ tree,
74
+ path.join(__dirname, '..', '..', '..', '..', 'src', 'generators', 'workspace-dev-cli', 'files'),
75
+ projectRoot,
76
+ templateOptions,
77
+ );
78
+
79
+ if (existingCompose !== null) {
80
+ tree.write('docker-compose.yml', existingCompose);
81
+ }
82
+
83
+ // Copy the prebuilt CLI bundle verbatim (raw write — never through EJS).
84
+ const bundlePath = path.join(
85
+ __dirname,
86
+ '..',
87
+ '..',
88
+ '..',
89
+ '..',
90
+ 'src',
91
+ 'generators',
92
+ 'workspace-dev-cli',
93
+ 'cli-src',
94
+ 'dist',
95
+ 'dev-bundle.js',
96
+ );
97
+ const bundle = fs.readFileSync(bundlePath, 'utf-8');
98
+ tree.write('.dev/dev-bundle.js', bundle);
99
+
100
+ // Project brand tokens into the runtime config the bundle reads. The runner
101
+ // registry accretes entries from surface/sidecar generators that run after
102
+ // this one — and a re-run (e.g. to pick up a newer bundle) must not reset it,
103
+ // exactly like the docker-compose topology above. Preserve any existing
104
+ // runners verbatim.
105
+ let preservedRunners: unknown = [];
106
+ let preservedCommands: unknown = undefined;
107
+ if (tree.exists('.dev/dev.config.json')) {
108
+ try {
109
+ const prev = JSON.parse(tree.read('.dev/dev.config.json', 'utf-8') || '{}');
110
+ if (Array.isArray(prev.runners)) preservedRunners = prev.runners;
111
+ // Project-owned commands (the composability seam) are never reset by a re-run —
112
+ // they belong to the project, not the framework. Carry them verbatim.
113
+ if (Array.isArray(prev.commands)) preservedCommands = prev.commands;
114
+ } catch {
115
+ /* malformed prior config — fall back to an empty registry */
116
+ }
117
+ }
118
+ const devConfig = buildDevConfig(tree, projectPrefix, appName, templateOptions.hexColor);
119
+ devConfig.runners = preservedRunners;
120
+ if (preservedCommands !== undefined) devConfig.commands = preservedCommands;
121
+ tree.write('.dev/dev.config.json', JSON.stringify(devConfig, null, 2) + '\n');
122
+
123
+ // Ensure the launcher is executable (generateFiles preserves the template's mode,
124
+ // but set it explicitly so the bit survives any environment that strips it).
125
+ if (tree.exists('dev')) {
126
+ tree.changePermissions('dev', '755');
127
+ }
128
+
129
+ await formatFiles(tree);
130
+
131
+ recordGeneratorProvenance(tree, 'workspace-dev-cli', {
132
+ appName,
133
+ primaryColor: templateOptions.primaryColor,
134
+ hexColor: templateOptions.hexColor,
135
+ });
136
+ }