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,514 @@
1
+ 'use strict';
2
+
3
+ // Language registry for the repo-map generator.
4
+ //
5
+ // Each entry binds a tree-sitter grammar (vendored as wasm under ./grammars/ by
6
+ // scripts/build-grammars.mjs, or supplied by the project — see "Project extension
7
+ // seam" below) to the queries
8
+ // that extract two things from a parsed file: the raw import strings (which the
9
+ // resolver turns into the internal dependency graph) and the top-level symbol
10
+ // definitions (the informational symbol index).
11
+ //
12
+ // A language declares a **fidelity**:
13
+ // 'graph' — has a resolver, so its imports become internal edges and feed
14
+ // PageRank centrality. This is the output people trust most, so a
15
+ // resolver ships only when its module-resolution rules are verified
16
+ // correct for that ecosystem.
17
+ // 'symbols' — has queries but no resolver: it yields a symbol index, an
18
+ // external-dependency listing, and module shape, but no internal
19
+ // edges. Honest partial coverage, never a confidently-wrong graph.
20
+ //
21
+ // This is deliberately coarse: import-edge granularity, not a full reference
22
+ // graph. Serena answers precise per-symbol questions live; this map exists for
23
+ // whole-repo aggregates (centrality, module shape) that Serena cannot export.
24
+ //
25
+ // ── Adding a language ────────────────────────────────────────────────────────
26
+ // Most projects never need to: the built-ins below cover the common stacks, and
27
+ // a project can add its own without forking GroundWork via the extension seam
28
+ // (`.groundwork/config/repo-map.languages.js` — see loadProjectLanguages). A new
29
+ // built-in is the same object shape: extensions, a grammar, an `@imp` import
30
+ // query, a `@sym` symbol query, and (for 'graph' fidelity) a `resolve` function.
31
+
32
+ const path = require('path');
33
+ const fs = require('fs');
34
+
35
+ // Where the bundled tree-sitter grammars live. These are vendored into the
36
+ // package (built by scripts/build-grammars.mjs for the pinned web-tree-sitter
37
+ // version) so the runtime needs no build toolchain — see that script's header.
38
+ function bundledWasmDir() {
39
+ return path.join(__dirname, 'grammars');
40
+ }
41
+
42
+ function stripQuotes(s) {
43
+ return s.replace(/^['"`]|['"`]$/g, '');
44
+ }
45
+
46
+ // ── Resolvers ────────────────────────────────────────────────────────────────
47
+ // resolve(spec, fromFile, fileSet, ctx) → [internal repo-relative paths] | null
48
+ // spec the import string, quotes already stripped
49
+ // fromFile repo-relative path of the importing file (posix separators)
50
+ // fileSet Set of all repo-relative source paths (posix separators)
51
+ // ctx { goModule } — extra repo facts a resolver may need
52
+ // Returning null means "external" (third-party, stdlib, or unresolvable): the
53
+ // import is recorded under external_dependencies, never as an internal edge.
54
+
55
+ const JSTS_RESOLVE_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
56
+ function jstsCandidates(base) {
57
+ const out = [base];
58
+ for (const e of JSTS_RESOLVE_EXTS) out.push(base + e);
59
+ for (const e of JSTS_RESOLVE_EXTS) out.push(path.posix.join(base, 'index' + e));
60
+ return out;
61
+ }
62
+
63
+ function resolveGo(spec, fromFile, fileSet, ctx) {
64
+ const goModule = ctx.goModule;
65
+ // Internal only when the import path sits under the module path.
66
+ if (!goModule || !(spec === goModule || spec.startsWith(goModule + '/'))) return null;
67
+ const rel = spec === goModule ? '.' : spec.slice(goModule.length + 1);
68
+ // Go imports a package (directory); the targets are its .go files.
69
+ const targets = [...fileSet].filter(
70
+ (f) => f.endsWith('.go') && path.posix.dirname(f) === path.posix.normalize(rel)
71
+ );
72
+ return targets.length ? targets : null;
73
+ }
74
+
75
+ function resolvePython(spec, fromFile, fileSet) {
76
+ const fromDir = path.posix.dirname(fromFile);
77
+ let dotted = spec;
78
+ let baseDir = '';
79
+ const lead = spec.match(/^\.+/);
80
+ if (lead) {
81
+ // Relative import: each dot after the first walks up one package level.
82
+ const up = lead[0].length - 1;
83
+ let dir = fromDir;
84
+ for (let i = 0; i < up; i++) dir = path.posix.dirname(dir);
85
+ baseDir = dir;
86
+ dotted = spec.slice(lead[0].length);
87
+ }
88
+ const sub = dotted ? dotted.split('.').join('/') : '';
89
+ const stem = baseDir ? path.posix.join(baseDir, sub) : sub;
90
+ for (const cand of [stem + '.py', path.posix.join(stem, '__init__.py')]) {
91
+ const norm = path.posix.normalize(cand);
92
+ if (fileSet.has(norm)) return [norm];
93
+ }
94
+ return null;
95
+ }
96
+
97
+ function resolveJsTs(spec, fromFile, fileSet) {
98
+ // Only relative specifiers are internal; bare specifiers are packages.
99
+ if (!spec.startsWith('.')) return null;
100
+ const fromDir = path.posix.dirname(fromFile);
101
+ const joined = path.posix.normalize(path.posix.join(fromDir, spec));
102
+ for (const cand of jstsCandidates(joined)) {
103
+ if (fileSet.has(cand)) return [cand];
104
+ }
105
+ return null;
106
+ }
107
+
108
+ // Dart: a `package:<self>/x/y.dart` import (where <self> is the project's own
109
+ // package, read from pubspec.yaml) maps to `lib/x/y.dart`; a relative import
110
+ // resolves against the importing file's directory. Imports of other packages
111
+ // (`package:flutter/...`) and `dart:` core libraries find no internal match and
112
+ // fall through to external.
113
+ function resolveDart(spec, fromFile, fileSet, ctx) {
114
+ const m = spec.match(/^package:([^/]+)\/(.+)$/);
115
+ if (m) {
116
+ // Self-package import → lib/. Other packages are external.
117
+ if (ctx.dartPackage && m[1] === ctx.dartPackage) {
118
+ const target = path.posix.normalize('lib/' + m[2]);
119
+ return fileSet.has(target) ? [target] : null;
120
+ }
121
+ return null;
122
+ }
123
+ if (spec.startsWith('dart:')) return null; // SDK library
124
+ // Any other (schemeless) URI is relative to the importing file's directory —
125
+ // covers `models/user.dart`, `./util.dart`, and `../shared/x.dart` alike.
126
+ const joined = path.posix.normalize(path.posix.join(path.posix.dirname(fromFile), spec));
127
+ return fileSet.has(joined) ? [joined] : null;
128
+ }
129
+
130
+ // Java: an import is a fully-qualified type name (`com.example.app.util.Helper`).
131
+ // By the language's near-universal convention the file path mirrors the package,
132
+ // so the type lives at `<source-root>/com/example/app/util/Helper.java`. We match
133
+ // any internal file whose path ends with that package-path suffix. Stdlib and
134
+ // third-party imports (java.*, com.google.*, …) simply find no internal match and
135
+ // fall through to external — exactly what we want.
136
+ function resolveJava(spec, fromFile, fileSet) {
137
+ if (spec.endsWith('.*')) return null; // wildcard import — a package, not a file
138
+ const suffix = '/' + spec.split('.').join('/') + '.java';
139
+ const targets = [...fileSet].filter((f) => f.endsWith(suffix) || f === suffix.slice(1));
140
+ return targets.length ? targets : null;
141
+ }
142
+
143
+ // ── Built-in language registry ───────────────────────────────────────────────
144
+ // Import-query capture name is always @imp (its node text is the raw module
145
+ // string); symbol-query capture name is always @sym. Queries are validated
146
+ // against the real grammars in tests/cli/test_repo_map.py.
147
+
148
+ const ESMODULE_IMPORT = `[
149
+ (import_statement source: (string) @imp)
150
+ (export_statement source: (string) @imp)
151
+ ]`;
152
+ const JSTS_SYMBOLS = `[
153
+ (function_declaration name: (identifier) @sym)
154
+ (class_declaration name: (_) @sym)
155
+ ]`;
156
+
157
+ const BUILTIN = [
158
+ {
159
+ id: 'go',
160
+ exts: ['.go'],
161
+ grammar: 'tree-sitter-go.wasm',
162
+ fidelity: 'graph',
163
+ importQuery: '(import_spec path: (interpreted_string_literal) @imp)',
164
+ symbolQuery: `[
165
+ (function_declaration name: (identifier) @sym)
166
+ (method_declaration name: (field_identifier) @sym)
167
+ (type_spec name: (type_identifier) @sym)
168
+ ]`,
169
+ resolve: resolveGo,
170
+ },
171
+ {
172
+ id: 'python',
173
+ exts: ['.py'],
174
+ grammar: 'tree-sitter-python.wasm',
175
+ fidelity: 'graph',
176
+ importQuery: `[
177
+ (import_statement (dotted_name) @imp)
178
+ (import_statement (aliased_import (dotted_name) @imp))
179
+ (import_from_statement module_name: (dotted_name) @imp)
180
+ (import_from_statement module_name: (relative_import) @imp)
181
+ ]`,
182
+ symbolQuery: `[
183
+ (function_definition name: (identifier) @sym)
184
+ (class_definition name: (identifier) @sym)
185
+ ]`,
186
+ resolve: resolvePython,
187
+ },
188
+ {
189
+ id: 'typescript',
190
+ exts: ['.ts'],
191
+ grammar: 'tree-sitter-typescript.wasm',
192
+ fidelity: 'graph',
193
+ importQuery: ESMODULE_IMPORT, // require()/dynamic import() are a known v1 gap
194
+ symbolQuery: JSTS_SYMBOLS,
195
+ resolve: resolveJsTs,
196
+ },
197
+ {
198
+ id: 'tsx',
199
+ exts: ['.tsx'],
200
+ grammar: 'tree-sitter-tsx.wasm',
201
+ fidelity: 'graph',
202
+ importQuery: ESMODULE_IMPORT,
203
+ symbolQuery: JSTS_SYMBOLS,
204
+ resolve: resolveJsTs,
205
+ },
206
+ {
207
+ id: 'javascript',
208
+ exts: ['.js', '.jsx', '.mjs', '.cjs'],
209
+ grammar: 'tree-sitter-javascript.wasm',
210
+ fidelity: 'graph',
211
+ importQuery: ESMODULE_IMPORT,
212
+ symbolQuery: JSTS_SYMBOLS,
213
+ resolve: resolveJsTs,
214
+ },
215
+ {
216
+ id: 'java',
217
+ exts: ['.java'],
218
+ grammar: 'tree-sitter-java.wasm',
219
+ fidelity: 'graph',
220
+ importQuery: '(import_declaration (scoped_identifier) @imp)',
221
+ symbolQuery: `[
222
+ (class_declaration name: (identifier) @sym)
223
+ (interface_declaration name: (identifier) @sym)
224
+ (enum_declaration name: (identifier) @sym)
225
+ (record_declaration name: (identifier) @sym)
226
+ ]`,
227
+ resolve: resolveJava,
228
+ },
229
+ {
230
+ id: 'dart',
231
+ exts: ['.dart'],
232
+ grammar: 'tree-sitter-dart.wasm',
233
+ fidelity: 'graph',
234
+ importQuery:
235
+ '(import_or_export (library_import (import_specification (configurable_uri (uri (string_literal) @imp)))))',
236
+ symbolQuery: `[
237
+ (class_definition name: (identifier) @sym)
238
+ (mixin_declaration (identifier) @sym)
239
+ (enum_declaration name: (identifier) @sym)
240
+ (function_signature name: (identifier) @sym)
241
+ ]`,
242
+ resolve: resolveDart,
243
+ },
244
+
245
+ // ── Symbols tier: queries verified, no internal-edge resolver (yet). ────────
246
+ {
247
+ id: 'rust',
248
+ exts: ['.rs'],
249
+ grammar: 'tree-sitter-rust.wasm',
250
+ fidelity: 'symbols',
251
+ importQuery:
252
+ '(use_declaration argument: [(scoped_identifier) (scoped_use_list) (use_as_clause) (identifier)] @imp)',
253
+ symbolQuery: `[
254
+ (function_item name: (identifier) @sym)
255
+ (struct_item name: (type_identifier) @sym)
256
+ (enum_item name: (type_identifier) @sym)
257
+ (trait_item name: (type_identifier) @sym)
258
+ (mod_item name: (identifier) @sym)
259
+ ]`,
260
+ },
261
+ {
262
+ id: 'kotlin',
263
+ exts: ['.kt', '.kts'],
264
+ grammar: 'tree-sitter-kotlin.wasm',
265
+ fidelity: 'symbols',
266
+ importQuery: '(import (qualified_identifier) @imp)',
267
+ symbolQuery: `[
268
+ (class_declaration name: (identifier) @sym)
269
+ (function_declaration name: (identifier) @sym)
270
+ (object_declaration name: (identifier) @sym)
271
+ ]`,
272
+ },
273
+ {
274
+ id: 'csharp',
275
+ exts: ['.cs'],
276
+ grammar: 'tree-sitter-csharp.wasm',
277
+ fidelity: 'symbols',
278
+ importQuery: '(using_directive [(qualified_name) (identifier)] @imp)',
279
+ symbolQuery: `[
280
+ (class_declaration name: (identifier) @sym)
281
+ (interface_declaration name: (identifier) @sym)
282
+ (struct_declaration name: (identifier) @sym)
283
+ (enum_declaration name: (identifier) @sym)
284
+ (record_declaration name: (identifier) @sym)
285
+ ]`,
286
+ },
287
+ {
288
+ id: 'cpp',
289
+ exts: ['.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx'],
290
+ grammar: 'tree-sitter-cpp.wasm',
291
+ fidelity: 'symbols',
292
+ importQuery: '(preproc_include path: [(system_lib_string) (string_literal)] @imp)',
293
+ symbolQuery: `[
294
+ (class_specifier name: (type_identifier) @sym)
295
+ (struct_specifier name: (type_identifier) @sym)
296
+ (function_definition declarator: (function_declarator declarator: (identifier) @sym))
297
+ ]`,
298
+ },
299
+ {
300
+ id: 'c',
301
+ exts: ['.c', '.h'],
302
+ grammar: 'tree-sitter-c.wasm',
303
+ fidelity: 'symbols',
304
+ importQuery: '(preproc_include path: [(system_lib_string) (string_literal)] @imp)',
305
+ symbolQuery: `[
306
+ (struct_specifier name: (type_identifier) @sym)
307
+ (function_definition declarator: (function_declarator declarator: (identifier) @sym))
308
+ ]`,
309
+ },
310
+ {
311
+ // Scala imports split into multiple `path:` fields (no single node holds the
312
+ // dotted path), so we extract symbols only rather than capture a fragment.
313
+ id: 'scala',
314
+ exts: ['.scala', '.sc'],
315
+ grammar: 'tree-sitter-scala.wasm',
316
+ fidelity: 'symbols',
317
+ symbolQuery: `[
318
+ (class_definition name: (identifier) @sym)
319
+ (object_definition name: (identifier) @sym)
320
+ (trait_definition name: (identifier) @sym)
321
+ (function_definition name: (identifier) @sym)
322
+ ]`,
323
+ },
324
+ {
325
+ id: 'swift',
326
+ exts: ['.swift'],
327
+ grammar: 'tree-sitter-swift.wasm',
328
+ fidelity: 'symbols',
329
+ importQuery: '(import_declaration (identifier) @imp)',
330
+ symbolQuery: `[
331
+ (class_declaration name: (type_identifier) @sym)
332
+ (protocol_declaration name: (type_identifier) @sym)
333
+ (function_declaration name: (simple_identifier) @sym)
334
+ ]`,
335
+ },
336
+ {
337
+ id: 'php',
338
+ exts: ['.php'],
339
+ grammar: 'tree-sitter-php.wasm',
340
+ fidelity: 'symbols',
341
+ importQuery: '(namespace_use_declaration (namespace_use_clause (qualified_name) @imp))',
342
+ symbolQuery: `[
343
+ (class_declaration name: (name) @sym)
344
+ (interface_declaration name: (name) @sym)
345
+ (trait_declaration name: (name) @sym)
346
+ (function_definition name: (name) @sym)
347
+ ]`,
348
+ },
349
+ {
350
+ // Ruby imports go through require/require_relative calls, which are
351
+ // indistinguishable from any other method call without predicate filtering
352
+ // the flat-capture engine does not apply — so we extract symbols only rather
353
+ // than pollute external_dependencies with arbitrary string arguments.
354
+ id: 'ruby',
355
+ exts: ['.rb'],
356
+ grammar: 'tree-sitter-ruby.wasm',
357
+ fidelity: 'symbols',
358
+ symbolQuery: `[
359
+ (class name: (constant) @sym)
360
+ (module name: (constant) @sym)
361
+ (method name: (identifier) @sym)
362
+ ]`,
363
+ },
364
+ {
365
+ id: 'lua',
366
+ exts: ['.lua'],
367
+ grammar: 'tree-sitter-lua.wasm',
368
+ fidelity: 'symbols',
369
+ symbolQuery: '(function_declaration name: (identifier) @sym)',
370
+ },
371
+ ];
372
+
373
+ // Common code languages that are NOT built in — used only to nudge the user
374
+ // toward the enablement path when their repo contains such files. `reason`
375
+ // explains why it is not built in (so the message is honest, not a shrug).
376
+ const NUDGE = {
377
+ '.ex': { lang: 'Elixir', reason: 'no built-in queries yet' },
378
+ '.exs': { lang: 'Elixir', reason: 'no built-in queries yet' },
379
+ '.zig': { lang: 'Zig', reason: 'no built-in queries yet' },
380
+ '.sol': { lang: 'Solidity', reason: 'no built-in queries yet' },
381
+ };
382
+
383
+ // ── Registry state (rebuilt per CLI invocation) ──────────────────────────────
384
+
385
+ let registry; // id → definition
386
+ let extToLang; // extension → id
387
+
388
+ function addToRegistry(def) {
389
+ registry.set(def.id, def);
390
+ for (const ext of def.exts) extToLang.set(ext.toLowerCase(), def.id);
391
+ }
392
+
393
+ function resetRegistry() {
394
+ registry = new Map();
395
+ extToLang = new Map();
396
+ for (const def of BUILTIN) addToRegistry(def);
397
+ }
398
+
399
+ resetRegistry();
400
+
401
+ // ── Project extension seam ───────────────────────────────────────────────────
402
+ // A project enables a language repo-map does not cover — or overrides a built-in
403
+ // — by committing `.groundwork/config/repo-map.languages.js` that exports an
404
+ // array of definitions (or `{ languages: [...] }`). Each entry mirrors a built-in:
405
+ //
406
+ // module.exports = [{
407
+ // id: 'dart',
408
+ // extensions: ['.dart'],
409
+ // grammar: 'tree-sitter-dart.wasm', // a bundled grammar by name, OR…
410
+ // grammarPath: './grammars/my.wasm', // …a path (relative to repo root) to your own
411
+ // importQuery: "(import_or_export ... @imp)",
412
+ // symbolQuery: "(class_definition name: (identifier) @sym)",
413
+ // resolve(spec, fromFile, files) { return [...] | null } // optional: enables edges
414
+ // }]
415
+ //
416
+ // An entry whose extensions collide with a built-in replaces it (lets a project
417
+ // upgrade a resolver or swap in an ABI-compatible grammar). This executes
418
+ // project-supplied JS — by design: it is the project's own committed config,
419
+ // loaded only from within the repo being mapped.
420
+
421
+ function loadProjectLanguages(cwd) {
422
+ const cfg = path.join(cwd, '.groundwork', 'config', 'repo-map.languages.js');
423
+ if (!fs.existsSync(cfg)) return { loaded: [], errors: [] };
424
+ let raw;
425
+ try {
426
+ delete require.cache[require.resolve(cfg)];
427
+ raw = require(cfg);
428
+ } catch (err) {
429
+ return { loaded: [], errors: [`failed to load ${path.relative(cwd, cfg)}: ${err.message}`] };
430
+ }
431
+ const defs = Array.isArray(raw) ? raw : Array.isArray(raw && raw.languages) ? raw.languages : null;
432
+ if (!defs) {
433
+ return { loaded: [], errors: ['repo-map.languages.js must export an array or { languages: [...] }'] };
434
+ }
435
+
436
+ const loaded = [];
437
+ const errors = [];
438
+ defs.forEach((d, i) => {
439
+ const where = d && d.id ? d.id : `entry ${i}`;
440
+ if (!d || typeof d !== 'object') return errors.push(`${where}: not an object`);
441
+ const exts = d.extensions || d.exts;
442
+ if (!Array.isArray(exts) || !exts.length) return errors.push(`${where}: needs a non-empty extensions array`);
443
+ if (!d.grammar && !d.grammarPath) return errors.push(`${where}: needs grammar or grammarPath`);
444
+ if (d.resolve && typeof d.resolve !== 'function') return errors.push(`${where}: resolve must be a function`);
445
+ const def = {
446
+ id: d.id || exts[0].replace(/^\./, ''),
447
+ exts: exts.map((e) => (e.startsWith('.') ? e : '.' + e).toLowerCase()),
448
+ grammar: d.grammar,
449
+ grammarPath: d.grammarPath ? path.resolve(cwd, d.grammarPath) : undefined,
450
+ fidelity: d.resolve ? 'graph' : 'symbols',
451
+ importQuery: d.importQuery,
452
+ symbolQuery: d.symbolQuery,
453
+ resolve: d.resolve,
454
+ source: 'project',
455
+ };
456
+ addToRegistry(def);
457
+ loaded.push(def.id);
458
+ });
459
+ return { loaded, errors };
460
+ }
461
+
462
+ // ── Lookups used by the engine ───────────────────────────────────────────────
463
+
464
+ function langForFile(relPath) {
465
+ return extToLang.get(path.extname(relPath).toLowerCase()) || null;
466
+ }
467
+
468
+ function defFor(lang) {
469
+ return registry.get(lang) || null;
470
+ }
471
+
472
+ // All extensions the registry currently maps (built-ins + project additions).
473
+ function sourceExtensions() {
474
+ return [...extToLang.keys()];
475
+ }
476
+
477
+ // Absolute path to a language's grammar wasm (project-supplied path wins).
478
+ function grammarPathFor(lang) {
479
+ const def = registry.get(lang);
480
+ if (!def) return null;
481
+ if (def.grammarPath) return def.grammarPath;
482
+ return path.join(bundledWasmDir(), def.grammar);
483
+ }
484
+
485
+ function fidelityFor(lang) {
486
+ const def = registry.get(lang);
487
+ return def ? def.fidelity : null;
488
+ }
489
+
490
+ // Resolve a raw import to internal repo-relative path(s), or null when external.
491
+ function resolveImport(lang, fromFile, raw, fileSet, ctx) {
492
+ const def = registry.get(lang);
493
+ if (!def || !def.resolve) return null;
494
+ return def.resolve(stripQuotes(raw), fromFile, fileSet, ctx || {});
495
+ }
496
+
497
+ // Code files of a language we do not map — for the enablement nudge.
498
+ function nudgeFor(ext) {
499
+ return NUDGE[ext.toLowerCase()] || null;
500
+ }
501
+
502
+ module.exports = {
503
+ stripQuotes,
504
+ resetRegistry,
505
+ loadProjectLanguages,
506
+ langForFile,
507
+ defFor,
508
+ sourceExtensions,
509
+ grammarPathFor,
510
+ fidelityFor,
511
+ resolveImport,
512
+ nudgeFor,
513
+ NUDGE,
514
+ };
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ // Weighted PageRank over the file dependency graph. Nodes are repo-relative
4
+ // file paths; a directed edge from→to means `from` imports `to`. The resulting
5
+ // rank is the centrality signal the scan uses to read hubs deeply and skim
6
+ // leaves — the same idea Aider's repo-map uses to rank files for an LLM.
7
+
8
+ const DAMPING = 0.85;
9
+ const MAX_ITERATIONS = 50;
10
+ const CONVERGENCE = 1e-6;
11
+
12
+ // nodes: string[] of all file paths.
13
+ // edges: Array<{ from, to, weight }>.
14
+ // Returns Map<file, rank> summing to ~1.
15
+ function pagerank(nodes, edges) {
16
+ const n = nodes.length;
17
+ if (n === 0) return new Map();
18
+
19
+ const index = new Map(nodes.map((node, i) => [node, i]));
20
+ const out = nodes.map(() => []); // out[i] = [{ j, weight }]
21
+ const outWeight = new Array(n).fill(0);
22
+
23
+ for (const e of edges) {
24
+ const i = index.get(e.from);
25
+ const j = index.get(e.to);
26
+ if (i === undefined || j === undefined || i === j) continue;
27
+ const w = e.weight > 0 ? e.weight : 1;
28
+ out[i].push({ j, weight: w });
29
+ outWeight[i] += w;
30
+ }
31
+
32
+ let rank = new Array(n).fill(1 / n);
33
+ const base = (1 - DAMPING) / n;
34
+
35
+ for (let iter = 0; iter < MAX_ITERATIONS; iter++) {
36
+ const next = new Array(n).fill(base);
37
+
38
+ // Dangling nodes (no out-edges) redistribute their mass uniformly.
39
+ let dangling = 0;
40
+ for (let i = 0; i < n; i++) if (outWeight[i] === 0) dangling += rank[i];
41
+ const danglingShare = (DAMPING * dangling) / n;
42
+
43
+ for (let i = 0; i < n; i++) {
44
+ if (outWeight[i] === 0) continue;
45
+ const share = (DAMPING * rank[i]) / outWeight[i];
46
+ for (const { j, weight } of out[i]) next[j] += share * weight;
47
+ }
48
+ for (let i = 0; i < n; i++) next[i] += danglingShare;
49
+
50
+ let delta = 0;
51
+ for (let i = 0; i < n; i++) delta += Math.abs(next[i] - rank[i]);
52
+ rank = next;
53
+ if (delta < CONVERGENCE) break;
54
+ }
55
+
56
+ return new Map(nodes.map((node, i) => [node, rank[i]]));
57
+ }
58
+
59
+ module.exports = { pagerank };
@@ -0,0 +1,60 @@
1
+ # The Migration Registry
2
+
3
+ The registry is the framework's **mechanical** update lane: small, scripted, deterministic
4
+ file operations that bring an installed project's plumbing to the current shape — seeding a
5
+ file `init` now writes that `update` once didn't, deleting an artifact a redesign retired,
6
+ registering an MCP server. Every entry is a `cli` migration.
7
+
8
+ **Structural and judgment-bearing advancement is not here.** How a project's bets are laid
9
+ out, where its architecture docs live, what its published docs may contain — these move
10
+ through the **`groundwork-update` skill's reconcile pass**, which compares each artifact
11
+ family against the framework's current canonical and advances divergent instances with
12
+ agent judgment (no per-change migration, no change-tracking). Add a registry migration only
13
+ when the change is a mechanical file op; when it needs judgment about the user's content,
14
+ it belongs to a Family Index entry in the `groundwork-update` skill instead.
15
+
16
+ The changelog's `[migration]` line stays — for humans — but it names an entry here, and the
17
+ tooling cross-checks both directions (a contract test fails when either side is missing).
18
+
19
+ ## Format
20
+
21
+ `index.json` lists entries in execution order:
22
+
23
+ ```json
24
+ { "id": "gw-seed-config-toml", "version": "0.10.0", "title": "…", "kind": "cli", "summary": "…" }
25
+ ```
26
+
27
+ - `id` — stable, kebab-case, `gw-` prefixed. Referenced from the changelog line as
28
+ `[migration] … (gw-seed-config-toml)`.
29
+ - `version` — the package version that ships the migration.
30
+ - `kind` — always **`cli`**: a CommonJS module at `migrations/<id>.js` exporting
31
+ `detect(ctx)` and `run(ctx)` that `npx groundwork-method update` runs.
32
+
33
+ ## Rules (all migrations)
34
+
35
+ - **Forward-only.** Projects do not downgrade frameworks; there are no down-migrations.
36
+ - **Detect-first.** `detect(ctx)` returns `"pending"`, `"done"`, or `"n/a"` and MUST be
37
+ read-only — `update --dry-run` calls it. `run` is only invoked on `pending`.
38
+ - **Idempotent.** Running twice must be a no-op; a crashed update re-runs safely.
39
+ - **Self-contained.** The module imports nothing from `bin/` — it receives
40
+ `ctx = { targetDir, packageRoot }` and uses only Node built-ins.
41
+
42
+ Completions are recorded in the project's `state.json` under `groundwork.migrations`;
43
+ recorded entries are never asked again (so a user who reverts a migration's effect on
44
+ purpose is respected). A fresh `init` records the entire registry as settled — a new
45
+ install needs no catch-up.
46
+
47
+ ## Authoring checklist
48
+
49
+ 1. Copy `_template/cli-migration.js`; pick an `id`.
50
+ 2. Add the entry to `index.json` at the unreleased version.
51
+ 3. Add the `[migration] … (<id>)` line to the changelog's Unreleased section.
52
+ 4. Add or extend a fixture under `tests/fixtures/installs/` that exercises the
53
+ migration from the shape it migrates, and cover it in `tests/cli/`.
54
+
55
+ If the change needs judgment rather than a deterministic file op, do **not** author a
56
+ migration — add or extend a family in the `groundwork-update` skill's Family Index, where
57
+ the reconcile pass will pick it up against the current canonical.
58
+
59
+ `GROUNDWORK_MIGRATIONS_DIR` overrides the registry location — a test seam for
60
+ exercising the runner with synthetic migrations.
@@ -0,0 +1,27 @@
1
+ // gw-<id> — <one-line imperative title>
2
+ //
3
+ // <Why this migration exists: what init does now that update never did, or what
4
+ // shape moved. Migrations are mechanical only — if the change needs judgment about
5
+ // the user's content, add a Family Index entry to the groundwork-update skill's
6
+ // reconcile pass instead of a migration.>
7
+ //
8
+ // Contract (migrations/README.md): forward-only, idempotent, detect-first.
9
+ // detect() MUST be read-only — `update --dry-run` calls it. Use only Node built-ins;
10
+ // never import from bin/. ctx = { targetDir, packageRoot }.
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+
15
+ module.exports = {
16
+ detect({ targetDir, packageRoot }) {
17
+ // Return 'pending' when the migration is owed, 'done' when the project already
18
+ // has the end state (however it got there), 'n/a' when it does not apply —
19
+ // e.g. the feature was never installed, or acting would risk user content.
20
+ return 'n/a';
21
+ },
22
+
23
+ run({ targetDir, packageRoot }) {
24
+ // Reach the end state. Running twice must be a no-op. Throwing stops the
25
+ // update with this migration named and the version stamp not advanced.
26
+ },
27
+ };