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,31 @@
1
+ import type { Renderer } from './theme/render';
2
+ import { hello } from './commands/hello';
3
+ <% if (core) { %>import { status } from './commands/status';
4
+ <% } %><% if (repl) { %>import { repl } from './commands/repl';
5
+ <% } %>
6
+ export interface Ctx {
7
+ r: Renderer;
8
+ json: boolean;
9
+ args: string[];
10
+ }
11
+
12
+ export type CommandGroup = 'CORE' | 'META';
13
+
14
+ export interface CommandDef {
15
+ name: string;
16
+ group: CommandGroup;
17
+ summary: string;
18
+ handler: (ctx: Ctx) => Promise<number>;
19
+ }
20
+
21
+ /** The command registry — the single source of truth for dispatch and help. Add a row
22
+ * here and the command is wired into both. */
23
+ export const COMMANDS: CommandDef[] = [
24
+ { name: 'hello', group: 'CORE', summary: 'Print a themed greeting (supports --json)', handler: hello },
25
+ <% if (core) { %> { name: 'status', group: 'CORE', summary: 'Probe the workspace core (exit 0 reachable, 1 not)', handler: status },
26
+ <% } %><% if (repl) { %> { name: 'repl', group: 'CORE', summary: 'Start an interactive session', handler: repl },
27
+ <% } %>];
28
+
29
+ export function findCommand(name: string): CommandDef | undefined {
30
+ return COMMANDS.find((c) => c.name === name);
31
+ }
@@ -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,11 @@
1
+ {
2
+ "//": "Test build: compiles src/ (including *.test.ts) to CommonJS in dist-test/ so node --test runs it directly. The shipped bundle still comes from build.mjs.",
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "noEmit": false,
6
+ "rootDir": "src",
7
+ "outDir": "dist-test",
8
+ "module": "NodeNext",
9
+ "moduleResolution": "NodeNext"
10
+ }
11
+ }
@@ -0,0 +1,138 @@
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
+ import { registerRunner } from '../shared/scaffold-helpers';
6
+
7
+ export interface CliAppGeneratorSchema {
8
+ name: string;
9
+ repl?: boolean;
10
+ /** Wire the CLI to the workspace core (core-access seam + `status` wiring
11
+ * proof). Omit for a standalone tool that fronts no services. */
12
+ core?: boolean;
13
+ }
14
+
15
+ const BRAND_TOKENS_PATH = '.groundwork/config/brand-tokens.json';
16
+
17
+ /** The shared CLI render layer lives with the ./dev CLI source and is the single
18
+ * source of truth. The product gets an owned copy so it can evolve independently. */
19
+ const THEME_SRC = path.join(
20
+ __dirname,
21
+ '..',
22
+ '..',
23
+ '..',
24
+ '..',
25
+ 'src',
26
+ 'generators',
27
+ 'workspace-dev-cli',
28
+ 'cli-src',
29
+ 'src',
30
+ );
31
+
32
+ function kebab(s: string): string {
33
+ return s
34
+ .trim()
35
+ .toLowerCase()
36
+ .replace(/[^a-z0-9]+/g, '-')
37
+ .replace(/^-+|-+$/g, '');
38
+ }
39
+
40
+ /** Project the design system's brand tokens (identity + terminal) for the product, or
41
+ * a minimal Tier-1 identity derived from the name when no tokens exist. */
42
+ function buildBrand(tree: Tree, name: string): Record<string, unknown> {
43
+ if (tree.exists(BRAND_TOKENS_PATH)) {
44
+ try {
45
+ const raw = JSON.parse(tree.read(BRAND_TOKENS_PATH, 'utf-8') || '{}');
46
+ return { identity: raw.identity, terminal: raw.terminal };
47
+ } catch {
48
+ /* malformed — fall through */
49
+ }
50
+ }
51
+ return {
52
+ identity: { appName: name, wordmark: '◢◤', primary: '#5fafff', accent: '#d7afff', voice: 'clear, modern' },
53
+ };
54
+ }
55
+
56
+ function copyShared(tree: Tree, fromRel: string, toRel: string): void {
57
+ const content = fs.readFileSync(path.join(THEME_SRC, fromRel), 'utf-8');
58
+ tree.write(toRel, content);
59
+ }
60
+
61
+ export default async function (tree: Tree, options: CliAppGeneratorSchema) {
62
+ const name = options.name;
63
+ const binName = kebab(name) || 'cli';
64
+ const repl = Boolean(options.repl);
65
+ const core = Boolean(options.core);
66
+ const projectRoot = path.join('services', binName);
67
+
68
+ const filesDir = path.join(__dirname, '..', '..', '..', '..', 'src', 'generators', 'cli-app', 'files');
69
+ generateFiles(tree, filesDir, projectRoot, {
70
+ name,
71
+ binName,
72
+ repl,
73
+ core,
74
+ tmpl: '',
75
+ });
76
+
77
+ // Standalone mode: the CLI is the whole product and fronts no services, so
78
+ // it carries no core-access seam. Core mode (--core) keeps these files —
79
+ // the same seam shape electron-app (src/main/core-client.ts) and
80
+ // flutter-app (lib/data/services/api_client.dart) ship unconditionally;
81
+ // here it is opt-in because a standalone CLI genuinely has no core.
82
+ if (!core) {
83
+ tree.delete(path.join(projectRoot, 'src/core/client.ts'));
84
+ tree.delete(path.join(projectRoot, 'src/core/client.test.ts'));
85
+ tree.delete(path.join(projectRoot, 'src/commands/status.ts'));
86
+ }
87
+
88
+ // Copy the shared render layer as owned product source.
89
+ copyShared(tree, 'theme/tokens.ts', path.join(projectRoot, 'src/theme/tokens.ts'));
90
+ copyShared(tree, 'theme/color.ts', path.join(projectRoot, 'src/theme/color.ts'));
91
+ copyShared(tree, 'theme/render.ts', path.join(projectRoot, 'src/theme/render.ts'));
92
+
93
+ // Project brand tokens into the product (baked into the build via import).
94
+ tree.write(path.join(projectRoot, 'src/brand.json'), JSON.stringify(buildBrand(tree, name), null, 2) + '\n');
95
+
96
+ // Interactive layer: reuse the same prompt utilities the ./dev wizard uses.
97
+ if (repl) {
98
+ copyShared(tree, 'util/prompt.ts', path.join(projectRoot, 'src/util/prompt.ts'));
99
+ tree.write(
100
+ path.join(projectRoot, 'src/commands/repl.ts'),
101
+ `import type { Ctx } from '../registry';
102
+ import { isInteractive, textPrompt } from '../util/prompt';
103
+
104
+ /** A minimal interactive session on top of the composable spine. Extend it into a
105
+ * full REPL — slash commands, streaming, autocomplete — per your design system. */
106
+ export async function repl(ctx: Ctx): Promise<number> {
107
+ if (!isInteractive()) {
108
+ ctx.r.error('repl requires an interactive terminal.');
109
+ return 2;
110
+ }
111
+ ctx.r.logo('interactive session');
112
+ ctx.r.info("Type a name to greet, or 'exit' to quit.");
113
+ for (;;) {
114
+ const line = await textPrompt(ctx.r.painter, '>');
115
+ if (line === 'exit' || line === 'quit') break;
116
+ if (line) ctx.r.success(\`Hello, \${line}!\`);
117
+ }
118
+ return 0;
119
+ }
120
+ `,
121
+ );
122
+ }
123
+
124
+ // A CLI is invoked ad hoc, not a long-running service — register it as a
125
+ // runner so `./dev status` reports it and `./dev` knows how to run it, but
126
+ // autostart is false so it is never launched by `./dev start`.
127
+ registerRunner(tree, {
128
+ name: binName,
129
+ kind: 'surface',
130
+ cmd: 'npm run dev',
131
+ cwd: projectRoot,
132
+ autostart: false,
133
+ });
134
+
135
+ await formatFiles(tree);
136
+
137
+ recordGeneratorProvenance(tree, 'cli-app', options as unknown as Record<string, unknown>);
138
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "CliApp",
4
+ "title": "CLI App",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "The CLI product name (used for the binary, package name, and branding fallback).",
10
+ "x-prompt": "What is the CLI called?"
11
+ },
12
+ "repl": {
13
+ "type": "boolean",
14
+ "description": "Scaffold the interactive REPL layer on top of the composable spine.",
15
+ "default": false
16
+ },
17
+ "core": {
18
+ "type": "boolean",
19
+ "description": "Wire the CLI to the workspace core: scaffolds the core-access seam (src/core/client.ts, API_BASE_URL-configurable, Bearer auth seam) and a `status` wiring-proof command. Omit for a standalone tool that fronts no services.",
20
+ "default": false
21
+ }
22
+ },
23
+ "required": ["name"]
24
+ }
@@ -0,0 +1,40 @@
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ /node_modules
5
+ /.pnp
6
+ .pnp.js
7
+
8
+ # testing
9
+ /coverage
10
+
11
+ # next.js
12
+ /.next/
13
+ /out/
14
+
15
+ # fumadocs generated source map (regenerated by `fumadocs-mdx` / next build)
16
+ /.source/
17
+
18
+ # production
19
+ /build
20
+
21
+ # misc
22
+ .DS_Store
23
+ *.pem
24
+
25
+ # debug
26
+ npm-debug.log*
27
+ yarn-debug.log*
28
+ yarn-error.log*
29
+ pnpm-debug.log*
30
+
31
+ # local env files
32
+ .env*.local
33
+ .env
34
+
35
+ # vercel
36
+ .vercel
37
+
38
+ # typescript
39
+ *.tsbuildinfo
40
+ next-env.d.ts
@@ -0,0 +1,101 @@
1
+ import { source } from '@/app/source';
2
+ import { DocsPage, DocsBody, DocsDescription, DocsTitle } from 'fumadocs-ui/page';
3
+ import { notFound } from 'next/navigation';
4
+ import Link from 'next/link';
5
+ import type { ComponentProps, FC } from 'react';
6
+ import { Mermaid } from '@/components/mermaid';
7
+
8
+ // MDX components injected into every rendered doc. `Mermaid` resolves the
9
+ // `<Mermaid chart="…" />` nodes the remark transform (source.config.ts) emits for fenced
10
+ // ```mermaid blocks.
11
+ const mdxComponents = { Mermaid };
12
+
13
+ // The custom title-from-H1 schema (source.config.ts) is a transform, which stops
14
+ // createMDXSource from threading the full page-data type through — the inferred
15
+ // type degrades to the base PageData (title only). The other fields (description,
16
+ // full, and the compiled-MDX runtime fields body + toc) are present at runtime;
17
+ // this view restores their types. toc's type is borrowed from DocsPage's own prop.
18
+ type DocData = {
19
+ title: string;
20
+ description?: string;
21
+ full?: boolean;
22
+ body: FC;
23
+ toc: ComponentProps<typeof DocsPage>['toc'];
24
+ };
25
+
26
+ // The pristine root docs/ tree ships without an index.md (source.config.ts reads
27
+ // it untouched), so the `/docs` root — the empty slug — has no backing page. The
28
+ // home route redirects here, so 404ing it would make the whole site look broken
29
+ // on first load. Instead, render a generated overview that links into every
30
+ // section, derived live from the page list and grouped by the first folder
31
+ // segment under /docs (top-level docs fall under "Overview").
32
+ function DocsIndex() {
33
+ const groups = new Map<string, { title: string; url: string }[]>();
34
+ for (const page of source.getPages()) {
35
+ const segments = page.url.replace(/^\/docs\/?/, '').split('/');
36
+ const section = segments.length > 1 ? segments[0] : 'Overview';
37
+ const list = groups.get(section) ?? [];
38
+ list.push({ title: page.data.title, url: page.url });
39
+ groups.set(section, list);
40
+ }
41
+
42
+ return (
43
+ <DocsPage>
44
+ <DocsTitle><%= navTitle %></DocsTitle>
45
+ <DocsDescription>Project documentation, organized by section.</DocsDescription>
46
+ <DocsBody>
47
+ {[...groups.entries()].map(([section, pages]) => (
48
+ <section key={section}>
49
+ <h2 style={{ textTransform: 'capitalize' }}>{section.replace(/-/g, ' ')}</h2>
50
+ <ul>
51
+ {pages.map((p) => (
52
+ <li key={p.url}>
53
+ <Link href={p.url}>{p.title}</Link>
54
+ </li>
55
+ ))}
56
+ </ul>
57
+ </section>
58
+ ))}
59
+ </DocsBody>
60
+ </DocsPage>
61
+ );
62
+ }
63
+
64
+ export default async function Page(props: { params: Promise<{ slug?: string[] }> }) {
65
+ const params = await props.params;
66
+ const page = source.getPage(params.slug);
67
+ if (!page) {
68
+ // Empty slug is the `/docs` root — render the generated overview, not a 404.
69
+ if (!params.slug || params.slug.length === 0) return <DocsIndex />;
70
+ notFound();
71
+ }
72
+
73
+ const data = page.data as typeof page.data & DocData;
74
+ const MDX = data.body;
75
+
76
+ return (
77
+ <DocsPage toc={data.toc} full={data.full}>
78
+ <DocsTitle>{data.title}</DocsTitle>
79
+ <DocsDescription>{data.description}</DocsDescription>
80
+ <DocsBody>
81
+ <MDX components={mdxComponents} />
82
+ </DocsBody>
83
+ </DocsPage>
84
+ );
85
+ }
86
+
87
+ export async function generateStaticParams() {
88
+ return source.generateParams();
89
+ }
90
+
91
+ export async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {
92
+ const params = await props.params;
93
+ const page = source.getPage(params.slug);
94
+ if (!page) return {};
95
+
96
+ const data = page.data as typeof page.data & DocData;
97
+ return {
98
+ title: data.title,
99
+ description: data.description,
100
+ };
101
+ }
@@ -0,0 +1,14 @@
1
+ import { DocsLayout } from 'fumadocs-ui/layouts/docs';
2
+ import type { ReactNode } from 'react';
3
+ import { source } from '@/app/source';
4
+
5
+ // Sidebar order is declarative now: docs/meta.json seeds the canonical top-level
6
+ // ordering and sinks the principles tree to the bottom (collapsed), so the old
7
+ // imperative betsFirst() sort is gone. Order is owned by the content tree, not code.
8
+ export default function Layout({ children }: { children: ReactNode }) {
9
+ return (
10
+ <DocsLayout tree={source.pageTree} nav={{ title: '<%= navTitle %>' }}>
11
+ {children}
12
+ </DocsLayout>
13
+ );
14
+ }
@@ -0,0 +1,43 @@
1
+ /* GENERATED by the GroundWork docs-site generator.
2
+ * Typography discipline for the docs prose (F2): a bounded reading measure, a
3
+ * comfortable line-height, and an explicit h1-h4 scale — the readability layer
4
+ * the stock Fumadocs starter leaves at defaults. Imported by app/layout.tsx
5
+ * only for branded sites; the unbranded fallback keeps the stock appearance.
6
+ *
7
+ * Scoped to the rendered doc body (`.prose`, Fumadocs' content container) so it
8
+ * shapes reference prose without touching the nav, sidebar, or landing chrome. */
9
+
10
+ .prose {
11
+ /* ~68ch measure keeps long lines readable; the stock starter runs full-width. */
12
+ max-width: 68ch;
13
+ line-height: 1.6;
14
+ }
15
+
16
+ /* Full-bleed pages (`full: true` frontmatter) opt out of the measure cap. */
17
+ .prose:where(.full) {
18
+ max-width: none;
19
+ }
20
+
21
+ /* Explicit type scale: a clear hierarchy from h1 to h4, with tightened
22
+ * line-height and tracking on headings so they read as structure, not body. */
23
+ .prose h1 {
24
+ font-size: 2.25rem;
25
+ line-height: 1.15;
26
+ letter-spacing: -0.02em;
27
+ }
28
+
29
+ .prose h2 {
30
+ font-size: 1.5rem;
31
+ line-height: 1.25;
32
+ letter-spacing: -0.01em;
33
+ }
34
+
35
+ .prose h3 {
36
+ font-size: 1.25rem;
37
+ line-height: 1.3;
38
+ }
39
+
40
+ .prose h4 {
41
+ font-size: 1.05rem;
42
+ line-height: 1.4;
43
+ }
@@ -0,0 +1,24 @@
1
+ import { RootProvider } from 'fumadocs-ui/provider';
2
+ import 'fumadocs-ui/style.css';
3
+ <% if (branded) { %>import './brand.css';
4
+ import './docs.css';
5
+ <% } %><% if (bodyFont) { %>import { <%= bodyFont.replace(/[^A-Za-z0-9]/g, '_') %> } from 'next/font/google';
6
+ <% } else { %>import { Inter } from 'next/font/google';
7
+ <% } %>import type { ReactNode } from 'react';
8
+
9
+ <% if (bodyFont) { %>const brandFont = <%= bodyFont.replace(/[^A-Za-z0-9]/g, '_') %>({
10
+ subsets: ['latin'],
11
+ });
12
+ <% } else { %>const inter = Inter({
13
+ subsets: ['latin'],
14
+ });
15
+ <% } %>
16
+ export default function Layout({ children }: { children: ReactNode }) {
17
+ return (
18
+ <html lang="en" className={<% if (bodyFont) { %>brandFont.className<% } else { %>inter.className<% } %>} suppressHydrationWarning>
19
+ <body className="flex flex-col min-h-screen">
20
+ <RootProvider>{children}</RootProvider>
21
+ </body>
22
+ </html>
23
+ );
24
+ }
@@ -0,0 +1,135 @@
1
+ import Link from 'next/link';
2
+ import { source } from '@/app/source';
3
+
4
+ // A generated, brand-driven landing page (F4): a hero (project name + a one-line
5
+ // tagline) over two audience on-ramps, then section cards derived live from the
6
+ // doc tree. Nothing here is product-specific — the project name, the on-ramp
7
+ // targets, and the sections all come from the workspace and the docs/ folder, so
8
+ // this renders sensibly for any project GroundWork builds. The /docs index (the
9
+ // catch-all route's DocsIndex) remains the fallback link.
10
+
11
+ const TITLE = '<%= projectName %>';
12
+ const TAGLINE = '<%= tagline %>';
13
+ const WORDMARK = '<%= wordmark %>';
14
+
15
+ /** Human-friendly label for a top-level docs folder segment. */
16
+ function label(slug: string): string {
17
+ return slug.replace(/[-_]/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
18
+ }
19
+
20
+ /** Every page url under /docs, lower-cased once for cheap existence checks. */
21
+ function pageUrls(): Set<string> {
22
+ return new Set(source.getPages().map((p) => p.url.toLowerCase()));
23
+ }
24
+
25
+ /** True when any doc exists at exactly `url` or nested beneath it — lets an
26
+ * on-ramp target either a leaf doc (product-brief) or a section (getting-started)
27
+ * without 404ing on a fresh scaffold where the setup skills have not yet authored
28
+ * the doc. */
29
+ function hasRoute(urls: Set<string>, url: string): boolean {
30
+ const target = url.toLowerCase();
31
+ for (const u of urls) {
32
+ if (u === target || u.startsWith(target + '/')) return true;
33
+ }
34
+ return false;
35
+ }
36
+
37
+ /** The two audience on-ramps, in reading order — a fresh-clone developer first,
38
+ * a product reader second. Only the ones whose target doc actually exists are
39
+ * rendered, so the hero degrades gracefully before setup authors the docs. */
40
+ function onramps(
41
+ urls: Set<string>,
42
+ ): { title: string; blurb: string; url: string }[] {
43
+ return [
44
+ {
45
+ title: 'New here — get it running',
46
+ blurb: 'Install dependencies, boot the stack, and learn the ./dev workflow.',
47
+ url: '/docs/getting-started',
48
+ },
49
+ {
50
+ title: 'Understand the product',
51
+ blurb: 'What the system is, who it serves, and what it does and does not do.',
52
+ url: '/docs/product-brief',
53
+ },
54
+ ].filter((r) => hasRoute(urls, r.url));
55
+ }
56
+
57
+ /** The top-level sections present under /docs, derived from the page list, plus
58
+ * the count of pages each one carries. Top-level docs fall under "Overview". */
59
+ function sections(): { slug: string; title: string; url: string; count: number }[] {
60
+ const groups = new Map<string, { count: number; firstUrl: string }>();
61
+ for (const page of source.getPages()) {
62
+ const segments = page.url.replace(/^\/docs\/?/, '').split('/').filter(Boolean);
63
+ const section = segments.length > 1 ? segments[0] : 'overview';
64
+ const g = groups.get(section);
65
+ if (g) g.count += 1;
66
+ else groups.set(section, { count: 1, firstUrl: page.url });
67
+ }
68
+ return [...groups.entries()].map(([slug, g]) => ({
69
+ slug,
70
+ title: slug === 'overview' ? 'Overview' : label(slug),
71
+ url: slug === 'overview' ? '/docs' : `/docs/${slug}`,
72
+ count: g.count,
73
+ }));
74
+ }
75
+
76
+ export default function HomePage() {
77
+ const urls = pageUrls();
78
+ const ramps = onramps(urls);
79
+ const cards = sections();
80
+ return (
81
+ <main className="flex flex-1 flex-col items-center px-4 py-16">
82
+ <section className="w-full max-w-3xl text-center">
83
+ {WORDMARK ? (
84
+ <div
85
+ aria-hidden
86
+ className="mb-6 text-4xl font-semibold"
87
+ style={{ color: 'hsl(var(--fd-primary))' }}
88
+ >
89
+ {WORDMARK}
90
+ </div>
91
+ ) : null}
92
+ <h1 className="text-4xl font-bold tracking-tight sm:text-5xl">{TITLE}</h1>
93
+ <p className="mt-4 text-lg text-fd-muted-foreground">{TAGLINE}</p>
94
+ <div className="mt-8 flex justify-center gap-3">
95
+ <Link
96
+ href="/docs"
97
+ className="rounded-lg bg-fd-primary px-5 py-2.5 text-sm font-medium text-fd-primary-foreground transition-opacity hover:opacity-90"
98
+ >
99
+ Browse the docs
100
+ </Link>
101
+ </div>
102
+ </section>
103
+
104
+ {ramps.length ? (
105
+ <section className="mt-12 grid w-full max-w-4xl grid-cols-1 gap-4 sm:grid-cols-2">
106
+ {ramps.map((r) => (
107
+ <Link
108
+ key={r.url}
109
+ href={r.url}
110
+ className="rounded-xl border border-fd-border bg-fd-card p-6 text-left transition-colors hover:border-fd-primary hover:bg-fd-accent"
111
+ >
112
+ <div className="text-lg font-semibold text-fd-card-foreground">{r.title}</div>
113
+ <div className="mt-2 text-sm text-fd-muted-foreground">{r.blurb}</div>
114
+ </Link>
115
+ ))}
116
+ </section>
117
+ ) : null}
118
+
119
+ <section className="mt-10 grid w-full max-w-4xl grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
120
+ {cards.map((c) => (
121
+ <Link
122
+ key={c.slug}
123
+ href={c.url}
124
+ className="rounded-xl border border-fd-border bg-fd-card p-5 text-left transition-colors hover:bg-fd-accent"
125
+ >
126
+ <div className="text-base font-semibold text-fd-card-foreground">{c.title}</div>
127
+ <div className="mt-1 text-sm text-fd-muted-foreground">
128
+ {c.count} {c.count === 1 ? 'page' : 'pages'}
129
+ </div>
130
+ </Link>
131
+ ))}
132
+ </section>
133
+ </main>
134
+ );
135
+ }
@@ -0,0 +1,8 @@
1
+ import { docs, meta } from '@/.source';
2
+ import { createMDXSource } from 'fumadocs-mdx';
3
+ import { loader } from 'fumadocs-core/source';
4
+
5
+ export const source = loader({
6
+ baseUrl: '/docs',
7
+ source: createMDXSource(docs, meta),
8
+ });
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useId, useState } from 'react';
4
+
5
+ // Client-side renderer for a single ```mermaid block. The remark transform in
6
+ // source.config.ts rewrites each fenced mermaid block into `<Mermaid chart="…" />`, and the
7
+ // docs page passes this component into the MDX components map. Rendering happens in the
8
+ // browser via mermaid's own renderer — `next build` never needs a headless browser, so the
9
+ // site stays plain-Markdown and Playwright-free. Re-renders on light/dark toggle (Fumadocs
10
+ // flips the `dark` class on <html>).
11
+ export function Mermaid({ chart }: { chart: string }) {
12
+ const [svg, setSvg] = useState('');
13
+ const rawId = useId();
14
+ const id = 'mmd-' + rawId.replace(/[^a-zA-Z0-9]/g, '');
15
+
16
+ useEffect(() => {
17
+ let active = true;
18
+
19
+ const render = async () => {
20
+ const mermaid = (await import('mermaid')).default;
21
+ if (!active) return;
22
+ const isDark = document.documentElement.classList.contains('dark');
23
+ mermaid.initialize({
24
+ startOnLoad: false,
25
+ theme: isDark ? 'dark' : 'default',
26
+ securityLevel: 'strict',
27
+ });
28
+ try {
29
+ const { svg } = await mermaid.render(id, chart);
30
+ if (active) setSvg(svg);
31
+ } catch {
32
+ // A malformed diagram should never crash the page.
33
+ if (active) setSvg('');
34
+ }
35
+ };
36
+
37
+ void render();
38
+
39
+ const observer = new MutationObserver(() => void render());
40
+ observer.observe(document.documentElement, {
41
+ attributes: true,
42
+ attributeFilter: ['class'],
43
+ });
44
+
45
+ return () => {
46
+ active = false;
47
+ observer.disconnect();
48
+ };
49
+ }, [chart, id]);
50
+
51
+ if (!svg) {
52
+ // Pre-render / pre-hydration fallback: show the source so the diagram is never blank.
53
+ return (
54
+ <pre className="mermaid-fallback">
55
+ <code>{chart}</code>
56
+ </pre>
57
+ );
58
+ }
59
+
60
+ return (
61
+ <div
62
+ className="my-4 flex justify-center"
63
+ // eslint-disable-next-line react/no-danger
64
+ dangerouslySetInnerHTML={{ __html: svg }}
65
+ />
66
+ );
67
+ }
@@ -0,0 +1,10 @@
1
+ import { createMDX } from 'fumadocs-mdx/next';
2
+
3
+ const withMDX = createMDX();
4
+
5
+ /** @type {import('next').NextConfig} */
6
+ const config = {
7
+ reactStrictMode: true,
8
+ };
9
+
10
+ export default withMDX(config);