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.
- package/CHANGELOG.md +823 -0
- package/LICENSE +21 -0
- package/README.md +44 -29
- package/bin/groundwork.js +1723 -0
- package/dist/src/generators/add-capability/generator.d.ts +8 -0
- package/dist/src/generators/add-capability/generator.js +60 -0
- package/dist/src/generators/add-capability/generator.js.map +1 -0
- package/dist/src/generators/cli-app/generator.d.ts +9 -0
- package/dist/src/generators/cli-app/generator.js +140 -0
- package/dist/src/generators/cli-app/generator.js.map +1 -0
- package/dist/src/generators/docs-site/generator.d.ts +5 -0
- package/dist/src/generators/docs-site/generator.js +441 -0
- package/dist/src/generators/docs-site/generator.js.map +1 -0
- package/dist/src/generators/electron-app/generator.d.ts +6 -0
- package/dist/src/generators/electron-app/generator.js +261 -0
- package/dist/src/generators/electron-app/generator.js.map +1 -0
- package/dist/src/generators/flutter-app/generator.d.ts +6 -0
- package/dist/src/generators/flutter-app/generator.js +314 -0
- package/dist/src/generators/flutter-app/generator.js.map +1 -0
- package/dist/src/generators/go-microservice/generator.d.ts +8 -0
- package/dist/src/generators/go-microservice/generator.js +232 -0
- package/dist/src/generators/go-microservice/generator.js.map +1 -0
- package/dist/src/generators/nextjs-app/generator.d.ts +8 -0
- package/dist/src/generators/nextjs-app/generator.js +294 -0
- package/dist/src/generators/nextjs-app/generator.js.map +1 -0
- package/dist/src/generators/python-microservice/generator.d.ts +13 -0
- package/dist/src/generators/python-microservice/generator.js +265 -0
- package/dist/src/generators/python-microservice/generator.js.map +1 -0
- package/dist/src/generators/shared/brand-tokens.d.ts +89 -0
- package/dist/src/generators/shared/brand-tokens.js +308 -0
- package/dist/src/generators/shared/brand-tokens.js.map +1 -0
- package/dist/src/generators/shared/capabilities.d.ts +101 -0
- package/dist/src/generators/shared/capabilities.js +279 -0
- package/dist/src/generators/shared/capabilities.js.map +1 -0
- package/dist/src/generators/shared/provenance.d.ts +2 -0
- package/dist/src/generators/shared/provenance.js +85 -0
- package/dist/src/generators/shared/provenance.js.map +1 -0
- package/dist/src/generators/shared/scaffold-helpers.d.ts +72 -0
- package/dist/src/generators/shared/scaffold-helpers.js +309 -0
- package/dist/src/generators/shared/scaffold-helpers.js.map +1 -0
- package/dist/src/generators/system-test-runner/generator.d.ts +23 -0
- package/dist/src/generators/system-test-runner/generator.js +173 -0
- package/dist/src/generators/system-test-runner/generator.js.map +1 -0
- package/dist/src/generators/workspace-dev-cli/generator.d.ts +7 -0
- package/dist/src/generators/workspace-dev-cli/generator.js +138 -0
- package/dist/src/generators/workspace-dev-cli/generator.js.map +1 -0
- package/generators.json +57 -0
- package/lib/repo-map/grammars/tree-sitter-c.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-cpp.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-csharp.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-dart.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-go.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-java.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-javascript.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-kotlin.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-lua.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-php.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-python.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-ruby.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-rust.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-scala.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-swift.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-tsx.wasm +0 -0
- package/lib/repo-map/grammars/tree-sitter-typescript.wasm +0 -0
- package/lib/repo-map/index.js +386 -0
- package/lib/repo-map/languages.js +514 -0
- package/lib/repo-map/pagerank.js +59 -0
- package/migrations/README.md +60 -0
- package/migrations/_template/cli-migration.js +27 -0
- package/migrations/gw-bet-prose-redesign.js +105 -0
- package/migrations/gw-drop-test-manifest.js +37 -0
- package/migrations/gw-register-serena-mcp.js +42 -0
- package/migrations/gw-relocate-hidden-skills.js +40 -0
- package/migrations/gw-seed-config-toml.js +24 -0
- package/migrations/index.json +40 -0
- package/package.json +70 -6
- package/src/AGENTS.md +36 -0
- package/src/config/config.toml +30 -0
- package/src/config/groundwork-state.json +5 -0
- package/src/docs/llms.txt +72 -0
- package/src/docs/principles/ai-native/agent-native-systems.md +90 -0
- package/src/docs/principles/ai-native/agentic-systems.md +78 -0
- package/src/docs/principles/ai-native/ai-engineering.md +100 -0
- package/src/docs/principles/ai-native/ai-native-product.md +76 -0
- package/src/docs/principles/delivery/cost-engineering.md +89 -0
- package/src/docs/principles/delivery/day-2-operational-baseline.md +57 -0
- package/src/docs/principles/delivery/devex.md +88 -0
- package/src/docs/principles/delivery/platform.md +101 -0
- package/src/docs/principles/delivery/progressive-delivery.md +92 -0
- package/src/docs/principles/design/ai-native-design.md +73 -0
- package/src/docs/principles/design/design-foundations.md +80 -0
- package/src/docs/principles/design/design-systems-and-tokens.md +72 -0
- package/src/docs/principles/design/interaction-and-motion.md +69 -0
- package/src/docs/principles/design/layout-and-space.md +72 -0
- package/src/docs/principles/design/usability-and-ux.md +79 -0
- package/src/docs/principles/design/visual-design.md +84 -0
- package/src/docs/principles/foundations/code-craft.md +86 -0
- package/src/docs/principles/foundations/continuous-discovery.md +75 -0
- package/src/docs/principles/foundations/documentation.md +102 -0
- package/src/docs/principles/foundations/prioritization-and-appetite.md +78 -0
- package/src/docs/principles/foundations/product-engineering.md +90 -0
- package/src/docs/principles/foundations/product-risks.md +89 -0
- package/src/docs/principles/foundations/requirements-and-specs.md +80 -0
- package/src/docs/principles/foundations/success-metrics.md +66 -0
- package/src/docs/principles/foundations/testing.md +108 -0
- package/src/docs/principles/index.md +24 -0
- package/src/docs/principles/quality/accessibility.md +88 -0
- package/src/docs/principles/quality/observability.md +84 -0
- package/src/docs/principles/quality/performance.md +84 -0
- package/src/docs/principles/quality/privacy.md +92 -0
- package/src/docs/principles/quality/reliability.md +89 -0
- package/src/docs/principles/quality/security.md +78 -0
- package/src/docs/principles/stack/postgres.md +100 -0
- package/src/docs/principles/system-design/api-design.md +86 -0
- package/src/docs/principles/system-design/architecture-decisions.md +81 -0
- package/src/docs/principles/system-design/code-structure.md +104 -0
- package/src/docs/principles/system-design/data-engineering.md +87 -0
- package/src/docs/principles/system-design/durable-execution.md +89 -0
- package/src/docs/principles/system-design/evolutionary-architecture.md +81 -0
- package/src/docs/principles/system-design/identity-and-access.md +76 -0
- package/src/docs/principles/system-design/integration-patterns.md +84 -0
- package/src/docs/principles/system-design/real-time.md +83 -0
- package/src/docs/principles/system-design/surface-architecture.md +74 -0
- package/src/docs/ways-of-working/documentation.md +69 -0
- package/src/docs/ways-of-working/how-we-work.md +76 -0
- package/src/docs/ways-of-working/units-of-work.md +40 -0
- package/src/engineer-skills/groundwork-electron-engineer/SKILL.md +123 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/documentation.md +126 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/ipc-contracts.md +138 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/observability.md +37 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/packaging-and-updates.md +82 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/performance-and-reliability.md +80 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/process-model.md +94 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/security.md +107 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/testing-and-smoke.md +129 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/theming-and-tokens.md +74 -0
- package/src/engineer-skills/groundwork-electron-engineer/sync-anchor.md +22 -0
- package/src/engineer-skills/groundwork-flutter-engineer/SKILL.md +114 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/accessibility.md +92 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/architecture.md +189 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/data-and-contracts.md +136 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/documentation.md +122 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/navigation.md +122 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/observability.md +37 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/performance-and-reliability.md +100 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/platform-channels.md +93 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/releases-and-distribution.md +84 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/security.md +96 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/state-management.md +166 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/testing.md +160 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/theming-and-design-tokens.md +109 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/widgets-and-composition.md +123 -0
- package/src/engineer-skills/groundwork-flutter-engineer/sync-anchor.md +24 -0
- package/src/engineer-skills/groundwork-go-engineer/SKILL.md +174 -0
- package/src/engineer-skills/groundwork-go-engineer/references/api-design.md +82 -0
- package/src/engineer-skills/groundwork-go-engineer/references/architecture.md +42 -0
- package/src/engineer-skills/groundwork-go-engineer/references/capability-ports.md +50 -0
- package/src/engineer-skills/groundwork-go-engineer/references/code-craft-security.md +34 -0
- package/src/engineer-skills/groundwork-go-engineer/references/concurrency.md +108 -0
- package/src/engineer-skills/groundwork-go-engineer/references/documentation.md +130 -0
- package/src/engineer-skills/groundwork-go-engineer/references/go-services.md +77 -0
- package/src/engineer-skills/groundwork-go-engineer/references/http-handlers.md +172 -0
- package/src/engineer-skills/groundwork-go-engineer/references/implementation-patterns.md +156 -0
- package/src/engineer-skills/groundwork-go-engineer/references/integration-realtime-data.md +57 -0
- package/src/engineer-skills/groundwork-go-engineer/references/observability.md +49 -0
- package/src/engineer-skills/groundwork-go-engineer/references/postgres.md +41 -0
- package/src/engineer-skills/groundwork-go-engineer/references/reliability-performance.md +105 -0
- package/src/engineer-skills/groundwork-go-engineer/references/testing.md +201 -0
- package/src/engineer-skills/groundwork-go-engineer/sync-anchor.md +20 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/SKILL.md +112 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/accessibility.md +111 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/architecture.md +323 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/data-fetching.md +458 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/documentation.md +324 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/error-boundaries.md +383 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/mutations-and-forms.md +396 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/observability.md +48 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/performance-and-deployment.md +947 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/routing-and-navigation.md +405 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/security.md +131 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/server-components.md +394 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/tailwind-and-styling.md +134 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/testing.md +491 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/type-system.md +368 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/ux-principles.md +230 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/visual-language.md +69 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/sync-anchor.md +16 -0
- package/src/engineer-skills/groundwork-python-engineer/SKILL.md +199 -0
- package/src/engineer-skills/groundwork-python-engineer/references/api-standards.md +88 -0
- package/src/engineer-skills/groundwork-python-engineer/references/architecture.md +57 -0
- package/src/engineer-skills/groundwork-python-engineer/references/async-patterns.md +103 -0
- package/src/engineer-skills/groundwork-python-engineer/references/capability-ports.md +44 -0
- package/src/engineer-skills/groundwork-python-engineer/references/database.md +88 -0
- package/src/engineer-skills/groundwork-python-engineer/references/documentation-mcp.md +167 -0
- package/src/engineer-skills/groundwork-python-engineer/references/implementation-patterns.md +166 -0
- package/src/engineer-skills/groundwork-python-engineer/references/ml-pipelines.md +119 -0
- package/src/engineer-skills/groundwork-python-engineer/references/ml-systems-ai-engineering.md +74 -0
- package/src/engineer-skills/groundwork-python-engineer/references/observability.md +57 -0
- package/src/engineer-skills/groundwork-python-engineer/references/resilience.md +126 -0
- package/src/engineer-skills/groundwork-python-engineer/references/security.md +148 -0
- package/src/engineer-skills/groundwork-python-engineer/references/testing.md +216 -0
- package/src/engineer-skills/groundwork-python-engineer/sync-anchor.md +20 -0
- package/src/generators/add-capability/generator.ts +70 -0
- package/src/generators/add-capability/schema.json +30 -0
- package/src/generators/capabilities/llm/capability.json +28 -0
- package/src/generators/capabilities/llm/providers/anthropic/footprint.json +13 -0
- package/src/generators/capabilities/llm/providers/anthropic/stacks/go/internal/llm/llm.go.template +102 -0
- package/src/generators/capabilities/llm/providers/anthropic/stacks/python/src/__packageName__/adapters/llm.py.template +61 -0
- package/src/generators/capabilities/llm/providers/local/footprint.json +13 -0
- package/src/generators/capabilities/llm/providers/local/stacks/go/internal/llm/llm.go.template +102 -0
- package/src/generators/capabilities/llm/providers/local/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
- package/src/generators/capabilities/llm/providers/localai/footprint.json +29 -0
- package/src/generators/capabilities/llm/providers/localai/stacks/go/internal/llm/llm.go.template +102 -0
- package/src/generators/capabilities/llm/providers/localai/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
- package/src/generators/capabilities/llm/providers/none/footprint.json +9 -0
- package/src/generators/capabilities/llm/providers/none/stacks/go/internal/llm/llm.go.template +35 -0
- package/src/generators/capabilities/llm/providers/none/stacks/python/src/__packageName__/adapters/llm.py.template +25 -0
- package/src/generators/capabilities/llm/providers/ollama/footprint.json +20 -0
- package/src/generators/capabilities/llm/providers/ollama/stacks/go/internal/llm/llm.go.template +102 -0
- package/src/generators/capabilities/llm/providers/ollama/stacks/python/src/__packageName__/adapters/llm.py.template +53 -0
- package/src/generators/capabilities/llm/providers/openai/footprint.json +13 -0
- package/src/generators/capabilities/llm/providers/openai/stacks/go/internal/llm/llm.go.template +98 -0
- package/src/generators/capabilities/llm/providers/openai/stacks/python/src/__packageName__/adapters/llm.py.template +60 -0
- package/src/generators/capabilities/llm/stacks/go/internal/core/service/llm.go.template +12 -0
- package/src/generators/capabilities/llm/stacks/go/internal/llm/llm_test.go.template +33 -0
- package/src/generators/capabilities/llm/stacks/python/src/__packageName__/core/llm.py.template +15 -0
- package/src/generators/capabilities/llm/stacks/python/tests/contracts/test_llm.py.template +37 -0
- package/src/generators/cli-app/files/README.md.template +76 -0
- package/src/generators/cli-app/files/build.mjs.template +15 -0
- package/src/generators/cli-app/files/package.json.template +21 -0
- package/src/generators/cli-app/files/src/cli.ts.template +67 -0
- package/src/generators/cli-app/files/src/commands/hello.ts.template +17 -0
- package/src/generators/cli-app/files/src/commands/status.ts.template +23 -0
- package/src/generators/cli-app/files/src/core/client.test.ts.template +80 -0
- package/src/generators/cli-app/files/src/core/client.ts.template +64 -0
- package/src/generators/cli-app/files/src/registry.test.ts.template +35 -0
- package/src/generators/cli-app/files/src/registry.ts.template +31 -0
- package/src/generators/cli-app/files/tsconfig.json.template +16 -0
- package/src/generators/cli-app/files/tsconfig.test.json.template +11 -0
- package/src/generators/cli-app/generator.ts +138 -0
- package/src/generators/cli-app/schema.json +24 -0
- package/src/generators/docs-site/files/.gitignore.ejs +40 -0
- package/src/generators/docs-site/files/app/docs/__slug__/page.tsx +101 -0
- package/src/generators/docs-site/files/app/docs/layout.tsx +14 -0
- package/src/generators/docs-site/files/app/docs.css +43 -0
- package/src/generators/docs-site/files/app/layout.tsx +24 -0
- package/src/generators/docs-site/files/app/page.tsx +135 -0
- package/src/generators/docs-site/files/app/source.ts +8 -0
- package/src/generators/docs-site/files/components/mermaid.tsx +67 -0
- package/src/generators/docs-site/files/next.config.mjs +10 -0
- package/src/generators/docs-site/files/package.json +32 -0
- package/src/generators/docs-site/files/pnpm-workspace.yaml +7 -0
- package/src/generators/docs-site/files/postcss.config.mjs +6 -0
- package/src/generators/docs-site/files/source.config.ts +77 -0
- package/src/generators/docs-site/files/tailwind.config.js +10 -0
- package/src/generators/docs-site/files/tsconfig.json +27 -0
- package/src/generators/docs-site/generator.ts +476 -0
- package/src/generators/docs-site/schema.json +17 -0
- package/src/generators/electron-app/docs/principles/stack/electron/index.md +49 -0
- package/src/generators/electron-app/docs/principles/stack/electron/ipc-contracts.md +71 -0
- package/src/generators/electron-app/docs/principles/stack/electron/packaging-and-updates.md +59 -0
- package/src/generators/electron-app/docs/principles/stack/electron/process-model.md +53 -0
- package/src/generators/electron-app/docs/principles/stack/electron/security.md +70 -0
- package/src/generators/electron-app/docs/principles/stack/typescript/frontend.md +65 -0
- package/src/generators/electron-app/files/.gitignore.template +20 -0
- package/src/generators/electron-app/files/README.md.template +125 -0
- package/src/generators/electron-app/files/electron.vite.config.ts +31 -0
- package/src/generators/electron-app/files/eslint.config.mjs +92 -0
- package/src/generators/electron-app/files/forge.config.ts.template +44 -0
- package/src/generators/electron-app/files/package.json.template +54 -0
- package/src/generators/electron-app/files/playwright.config.ts +18 -0
- package/src/generators/electron-app/files/project.json.template +65 -0
- package/src/generators/electron-app/files/src/main/core-client.test.ts +81 -0
- package/src/generators/electron-app/files/src/main/core-client.ts +55 -0
- package/src/generators/electron-app/files/src/main/index.ts +157 -0
- package/src/generators/electron-app/files/src/main/ipc.ts +52 -0
- package/src/generators/electron-app/files/src/main/policy.test.ts +71 -0
- package/src/generators/electron-app/files/src/main/policy.ts +73 -0
- package/src/generators/electron-app/files/src/preload/index.ts +23 -0
- package/src/generators/electron-app/files/src/renderer/index.html.template +20 -0
- package/src/generators/electron-app/files/src/renderer/src/App.test.tsx +61 -0
- package/src/generators/electron-app/files/src/renderer/src/App.tsx.template +43 -0
- package/src/generators/electron-app/files/src/renderer/src/assets/main.css +40 -0
- package/src/generators/electron-app/files/src/renderer/src/env.d.ts +14 -0
- package/src/generators/electron-app/files/src/renderer/src/main.tsx +25 -0
- package/src/generators/electron-app/files/src/shared/ipc.ts +54 -0
- package/src/generators/electron-app/files/tests/smoke/app.spec.ts.template +133 -0
- package/src/generators/electron-app/files/tool/electron_exec.sh.template +83 -0
- package/src/generators/electron-app/files/tsconfig.json +7 -0
- package/src/generators/electron-app/files/tsconfig.node.json +27 -0
- package/src/generators/electron-app/files/tsconfig.web.json +22 -0
- package/src/generators/electron-app/files/vitest.config.ts +32 -0
- package/src/generators/electron-app/files/vitest.setup.ts +1 -0
- package/src/generators/electron-app/generator.ts +288 -0
- package/src/generators/electron-app/schema.json +23 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/architecture.md +78 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/index.md +38 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/platform-channels.md +51 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/releases-and-distribution.md +59 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/state-management.md +85 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/testing.md +86 -0
- package/src/generators/flutter-app/docs/principles/stack/flutter/widgets-and-composition.md +69 -0
- package/src/generators/flutter-app/files/.gitignore.template +30 -0
- package/src/generators/flutter-app/files/README.md.template +100 -0
- package/src/generators/flutter-app/files/analysis_options.yaml.template +18 -0
- package/src/generators/flutter-app/files/integration_test/app_test.dart.template +64 -0
- package/src/generators/flutter-app/files/lib/app.dart.template +24 -0
- package/src/generators/flutter-app/files/lib/config/app_config.dart +15 -0
- package/src/generators/flutter-app/files/lib/data/repositories/status_repository.dart +36 -0
- package/src/generators/flutter-app/files/lib/data/services/api_client.dart +71 -0
- package/src/generators/flutter-app/files/lib/domain/models/health_status.dart +23 -0
- package/src/generators/flutter-app/files/lib/main.dart +11 -0
- package/src/generators/flutter-app/files/lib/router.dart +23 -0
- package/src/generators/flutter-app/files/lib/ui/core/theme/app_theme.dart +110 -0
- package/src/generators/flutter-app/files/lib/ui/home/home_view.dart +89 -0
- package/src/generators/flutter-app/files/lib/ui/home/home_view_model.dart.template +38 -0
- package/src/generators/flutter-app/files/project.json.template +51 -0
- package/src/generators/flutter-app/files/pubspec.yaml.template +47 -0
- package/src/generators/flutter-app/files/test/api_client_test.dart.template +63 -0
- package/src/generators/flutter-app/files/test/fakes/fake_status_repository.dart.template +19 -0
- package/src/generators/flutter-app/files/test/home_view_test.dart.template +58 -0
- package/src/generators/flutter-app/files/tool/flutter_exec.sh.template +60 -0
- package/src/generators/flutter-app/generator.ts +362 -0
- package/src/generators/flutter-app/schema.json +23 -0
- package/src/generators/go-microservice/docs/principles/stack/go/concurrency.md +123 -0
- package/src/generators/go-microservice/docs/principles/stack/go/index.md +70 -0
- package/src/generators/go-microservice/docs/principles/stack/go/testing.md +168 -0
- package/src/generators/go-microservice/files/.air.toml.template +38 -0
- package/src/generators/go-microservice/files/.env.template +4 -0
- package/src/generators/go-microservice/files/.golangci.yml.template +82 -0
- package/src/generators/go-microservice/files/Dockerfile.dev.template +12 -0
- package/src/generators/go-microservice/files/asyncapi-pubsub.yaml.template +33 -0
- package/src/generators/go-microservice/files/asyncapi-ws.yaml.template +34 -0
- package/src/generators/go-microservice/files/cmd/api/main.go.template +149 -0
- package/src/generators/go-microservice/files/cmd/api/main_test.go.template +99 -0
- package/src/generators/go-microservice/files/cmd/worker/cleanup/main.go.template +39 -0
- package/src/generators/go-microservice/files/db/schema.sql.template +24 -0
- package/src/generators/go-microservice/files/go.mod.template +39 -0
- package/src/generators/go-microservice/files/internal/config/config.go.template +52 -0
- package/src/generators/go-microservice/files/internal/config/otel.go.template +93 -0
- package/src/generators/go-microservice/files/internal/core/domain/errors.go.template +16 -0
- package/src/generators/go-microservice/files/internal/core/domain/model.go.template +28 -0
- package/src/generators/go-microservice/files/internal/core/domain/user.go.template +13 -0
- package/src/generators/go-microservice/files/internal/core/pagination.go.template +16 -0
- package/src/generators/go-microservice/files/internal/core/service/app_service.go.template +79 -0
- package/src/generators/go-microservice/files/internal/core/service/event_hub.go.template +9 -0
- package/src/generators/go-microservice/files/internal/core/service/message_queue.go.template +10 -0
- package/src/generators/go-microservice/files/internal/core/service/outbox_repository.go.template +31 -0
- package/src/generators/go-microservice/files/internal/core/service/repository.go.template +23 -0
- package/src/generators/go-microservice/files/internal/core/service/user_repository.go.template +15 -0
- package/src/generators/go-microservice/files/internal/core/service/user_service.go.template +43 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/app_handler.go.template +108 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/auth_middleware_test.go.template +52 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook.go.template +202 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/clerk_webhook_test.go.template +82 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/health_handler.go.template +80 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware.go.template +87 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/middleware_test.go.template +76 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/idempotency/repository.go.template +37 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_auth.go.template +40 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_loadshed.go.template +38 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_logging.go.template +40 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_ratelimit.go.template +48 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/middleware_test.go.template +81 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/router.go.template +105 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/types.go.template +70 -0
- package/src/generators/go-microservice/files/internal/entrypoints/api/websocket_handler.go.template +39 -0
- package/src/generators/go-microservice/files/internal/httpclient/http_client.go.template +87 -0
- package/src/generators/go-microservice/files/internal/kafka/kafka.go.template +34 -0
- package/src/generators/go-microservice/files/internal/postgres/postgres.go.template +195 -0
- package/src/generators/go-microservice/files/internal/postgres/postgres_test.go.template +156 -0
- package/src/generators/go-microservice/files/internal/postgres/user_repository.go.template +56 -0
- package/src/generators/go-microservice/files/internal/pubsub/gcp_pubsub.go.template +35 -0
- package/src/generators/go-microservice/files/internal/websocket/client.go.template +151 -0
- package/src/generators/go-microservice/files/internal/websocket/hub.go.template +261 -0
- package/src/generators/go-microservice/files/scripts/apply-schema.sh.template +21 -0
- package/src/generators/go-microservice/files/tools/tools.go.template +10 -0
- package/src/generators/go-microservice/generator.ts +240 -0
- package/src/generators/go-microservice/schema.json +63 -0
- package/src/generators/nextjs-app/docs/principles/stack/typescript/frontend.md +65 -0
- package/src/generators/nextjs-app/files/.dockerignore.template +7 -0
- package/src/generators/nextjs-app/files/.env.example.template +24 -0
- package/src/generators/nextjs-app/files/.gitignore.template +5 -0
- package/src/generators/nextjs-app/files/Dockerfile +53 -0
- package/src/generators/nextjs-app/files/app/(auth)/sign-in/__sign-in__/page.tsx.template +9 -0
- package/src/generators/nextjs-app/files/app/(auth)/sign-up/__sign-up__/page.tsx.template +9 -0
- package/src/generators/nextjs-app/files/app/api/config/route.ts.template +39 -0
- package/src/generators/nextjs-app/files/app/api/healthz/route.test.ts +15 -0
- package/src/generators/nextjs-app/files/app/api/healthz/route.ts +5 -0
- package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.test.ts.template +55 -0
- package/src/generators/nextjs-app/files/app/api/proxy/__path__/route.ts.template +126 -0
- package/src/generators/nextjs-app/files/app/error.tsx +39 -0
- package/src/generators/nextjs-app/files/app/global-error.tsx +68 -0
- package/src/generators/nextjs-app/files/app/globals.css +105 -0
- package/src/generators/nextjs-app/files/app/layout.tsx +59 -0
- package/src/generators/nextjs-app/files/app/loading.tsx +13 -0
- package/src/generators/nextjs-app/files/app/not-found.tsx +30 -0
- package/src/generators/nextjs-app/files/app/page.tsx +20 -0
- package/src/generators/nextjs-app/files/components/providers/default.tsx +19 -0
- package/src/generators/nextjs-app/files/components/providers/production.tsx +32 -0
- package/src/generators/nextjs-app/files/components/providers/telemetry.tsx +76 -0
- package/src/generators/nextjs-app/files/components/render-smoke.test.tsx +29 -0
- package/src/generators/nextjs-app/files/components/theme-provider.tsx +11 -0
- package/src/generators/nextjs-app/files/components.json +21 -0
- package/src/generators/nextjs-app/files/eslint.config.mjs +120 -0
- package/src/generators/nextjs-app/files/hooks/use-toast.ts +7 -0
- package/src/generators/nextjs-app/files/instrumentation.ts +90 -0
- package/src/generators/nextjs-app/files/lib/api/fetcher.ts.template +130 -0
- package/src/generators/nextjs-app/files/lib/config.ts +21 -0
- package/src/generators/nextjs-app/files/lib/logger.ts +29 -0
- package/src/generators/nextjs-app/files/lib/schemas/index.ts +19 -0
- package/src/generators/nextjs-app/files/lib/utils.ts +6 -0
- package/src/generators/nextjs-app/files/next.config.mjs +9 -0
- package/src/generators/nextjs-app/files/package.json +70 -0
- package/src/generators/nextjs-app/files/postcss.config.mjs +8 -0
- package/src/generators/nextjs-app/files/proxy.test.ts.template +30 -0
- package/src/generators/nextjs-app/files/proxy.ts +31 -0
- package/src/generators/nextjs-app/files/public/.gitkeep +1 -0
- package/src/generators/nextjs-app/files/tsconfig.json +42 -0
- package/src/generators/nextjs-app/files/vitest.config.mts +15 -0
- package/src/generators/nextjs-app/files/vitest.setup.ts +7 -0
- package/src/generators/nextjs-app/generator.ts +307 -0
- package/src/generators/nextjs-app/schema.json +44 -0
- package/src/generators/python-microservice/docs/principles/stack/python/async.md +168 -0
- package/src/generators/python-microservice/docs/principles/stack/python/documentation.md +240 -0
- package/src/generators/python-microservice/docs/principles/stack/python/mcp.md +147 -0
- package/src/generators/python-microservice/docs/principles/stack/python/resilience.md +193 -0
- package/src/generators/python-microservice/docs/principles/stack/python/testing.md +322 -0
- package/src/generators/python-microservice/files/.env.example.template +30 -0
- package/src/generators/python-microservice/files/Dockerfile.template +36 -0
- package/src/generators/python-microservice/files/db/schema.sql.template +19 -0
- package/src/generators/python-microservice/files/pyproject.toml.template +76 -0
- package/src/generators/python-microservice/files/scripts/apply-schema.sh.template +25 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/comfyui.py.template +87 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/config.py.template +48 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/database.py.template +21 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/message_queue.py.template +29 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/repository.py.template +130 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/telemetry.py.template +68 -0
- package/src/generators/python-microservice/files/src/__packageName__/adapters/websocket_hub.py.template +36 -0
- package/src/generators/python-microservice/files/src/__packageName__/core/domain/entities.py.template +22 -0
- package/src/generators/python-microservice/files/src/__packageName__/core/domain/exceptions.py.template +43 -0
- package/src/generators/python-microservice/files/src/__packageName__/core/ports.py.template +42 -0
- package/src/generators/python-microservice/files/src/__packageName__/core/service/example_service.py.template +68 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/dependencies.py.template +50 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/middleware.py.template +131 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/router.py.template +37 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/api/websocket_handler.py.template +20 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/cleanup.py.template +35 -0
- package/src/generators/python-microservice/files/src/__packageName__/entrypoints/worker/worker.py.template +28 -0
- package/src/generators/python-microservice/files/src/__packageName__/main.py.template +108 -0
- package/src/generators/python-microservice/files/tests/test_main.py.template +74 -0
- package/src/generators/python-microservice/files/tests/test_middleware.py.template +109 -0
- package/src/generators/python-microservice/files/tests/test_worker.py.template +16 -0
- package/src/generators/python-microservice/generator.ts +286 -0
- package/src/generators/python-microservice/schema.json +86 -0
- package/src/generators/shared/brand-tokens.ts +301 -0
- package/src/generators/shared/capabilities.ts +349 -0
- package/src/generators/shared/provenance.ts +61 -0
- package/src/generators/shared/scaffold-helpers.ts +309 -0
- package/src/generators/system-test-runner/NATIVE-CHECK-CONTRACT.md +20 -0
- package/src/generators/system-test-runner/files/tests/bets/.gitkeep +0 -0
- package/src/generators/system-test-runner/files/tests/bets/_archive/.gitkeep +0 -0
- package/src/generators/system-test-runner/files/tests/conftest.py.template +503 -0
- package/src/generators/system-test-runner/files/tests/pyproject.toml.template +20 -0
- package/src/generators/system-test-runner/files/tests/system/pages/__init__.py.template +9 -0
- package/src/generators/system-test-runner/files/tests/system/pages/base_page.py.template +36 -0
- package/src/generators/system-test-runner/files/tests/system/test_a11y_smoke.py.template +132 -0
- package/src/generators/system-test-runner/files/tests/system/test_contract_conformance.py.template +140 -0
- package/src/generators/system-test-runner/files/tests/system/test_layout_geometry.py.template +109 -0
- package/src/generators/system-test-runner/files/tests/system/test_render_smoke.py.template +257 -0
- package/src/generators/system-test-runner/files/tests/system/test_system.py.template +158 -0
- package/src/generators/system-test-runner/files/tests/system/test_token_conformance.py.template +206 -0
- package/src/generators/system-test-runner/files/tests/system/test_visual_regression.py.template +104 -0
- package/src/generators/system-test-runner/generator.ts +196 -0
- package/src/generators/system-test-runner/schema.json +24 -0
- package/src/generators/workspace-dev-cli/cli-src/build.mjs +42 -0
- package/src/generators/workspace-dev-cli/cli-src/dist/dev-bundle.js +2168 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/bet.ts +442 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/completion.ts +87 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/doctor.ts +139 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/lifecycle.ts +548 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/quality.ts +127 -0
- package/src/generators/workspace-dev-cli/cli-src/src/commands/surface.ts +214 -0
- package/src/generators/workspace-dev-cli/cli-src/src/index.ts +127 -0
- package/src/generators/workspace-dev-cli/cli-src/src/registry.ts +194 -0
- package/src/generators/workspace-dev-cli/cli-src/src/theme/color.ts +130 -0
- package/src/generators/workspace-dev-cli/cli-src/src/theme/render.ts +158 -0
- package/src/generators/workspace-dev-cli/cli-src/src/theme/tokens.ts +122 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/context.ts +43 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/extensions.ts +99 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/paths.ts +46 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/proc.ts +106 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/prompt.ts +108 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/runners.ts +70 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/services.ts +221 -0
- package/src/generators/workspace-dev-cli/cli-src/src/util/version.ts +21 -0
- package/src/generators/workspace-dev-cli/cli-src/tsconfig.json +16 -0
- package/src/generators/workspace-dev-cli/files/.agents/skills/workspace-cli/SKILL.md.template +74 -0
- package/src/generators/workspace-dev-cli/files/dev.template +16 -0
- package/src/generators/workspace-dev-cli/files/docker-compose.yml.template +20 -0
- package/src/generators/workspace-dev-cli/files/scripts/cli/templates/milestone-test.pytmpl.template +46 -0
- package/src/generators/workspace-dev-cli/files/scripts/cli/templates/slice-test.pytmpl.template +38 -0
- package/src/generators/workspace-dev-cli/generator.ts +136 -0
- package/src/generators/workspace-dev-cli/schema.json +22 -0
- package/src/hidden-skills/code-intelligence.md +135 -0
- package/src/hidden-skills/groundwork-architect/SKILL.md +114 -0
- package/src/hidden-skills/groundwork-architect/references/agentic-systems.md +44 -0
- package/src/hidden-skills/groundwork-architect/references/ai-native-architecture.md +37 -0
- package/src/hidden-skills/groundwork-architect/references/api-and-contracts.md +45 -0
- package/src/hidden-skills/groundwork-architect/references/core-and-boundaries.md +45 -0
- package/src/hidden-skills/groundwork-architect/references/data-architecture.md +33 -0
- package/src/hidden-skills/groundwork-architect/references/decision-records.md +34 -0
- package/src/hidden-skills/groundwork-architect/references/durable-execution.md +45 -0
- package/src/hidden-skills/groundwork-architect/references/evolutionary-architecture.md +37 -0
- package/src/hidden-skills/groundwork-architect/references/identity-and-access.md +41 -0
- package/src/hidden-skills/groundwork-architect/references/integration-patterns.md +39 -0
- package/src/hidden-skills/groundwork-architect/references/observability.md +36 -0
- package/src/hidden-skills/groundwork-architect/references/performance-and-scale.md +41 -0
- package/src/hidden-skills/groundwork-architect/references/platform-and-delivery.md +47 -0
- package/src/hidden-skills/groundwork-architect/references/realtime-and-async.md +28 -0
- package/src/hidden-skills/groundwork-architect/references/reliability.md +31 -0
- package/src/hidden-skills/groundwork-architect/references/security-and-trust.md +47 -0
- package/src/hidden-skills/groundwork-architect/references/surface-architecture.md +40 -0
- package/src/hidden-skills/groundwork-architect/sync-anchor.md +34 -0
- package/src/hidden-skills/groundwork-architecture/architecture-template.md +50 -0
- package/src/hidden-skills/groundwork-architecture/instructions.md +139 -0
- package/src/hidden-skills/groundwork-architecture/phases/01-context-ingestion.md +18 -0
- package/src/hidden-skills/groundwork-architecture/phases/02-technical-constraints.md +27 -0
- package/src/hidden-skills/groundwork-architecture/phases/03-service-design.md +19 -0
- package/src/hidden-skills/groundwork-architecture/phases/04-data-flow-communication.md +23 -0
- package/src/hidden-skills/groundwork-architecture/phases/05-component-boundaries-contracts.md +17 -0
- package/src/hidden-skills/groundwork-architecture/phases/06-draft-review-present.md +38 -0
- package/src/hidden-skills/groundwork-architecture/phases/07-commit.md +33 -0
- package/src/hidden-skills/groundwork-architecture/templates/architecture-cache.md +43 -0
- package/src/hidden-skills/groundwork-architecture-extract/instructions.md +163 -0
- package/src/hidden-skills/groundwork-architecture-extract/templates/architecture-extract-cache.md +21 -0
- package/src/hidden-skills/groundwork-bet/briefs/acceptance-auditor.md +68 -0
- package/src/hidden-skills/groundwork-bet/briefs/blind-reviewer.md +56 -0
- package/src/hidden-skills/groundwork-bet/briefs/coverage-auditor.md +95 -0
- package/src/hidden-skills/groundwork-bet/briefs/edge-case-tracer.md +64 -0
- package/src/hidden-skills/groundwork-bet/briefs/experience-auditor.md +83 -0
- package/src/hidden-skills/groundwork-bet/briefs/slice-worker.md +257 -0
- package/src/hidden-skills/groundwork-bet/instructions.md +88 -0
- package/src/hidden-skills/groundwork-bet/templates/bet-progress-test.md +115 -0
- package/src/hidden-skills/groundwork-bet/templates/change-proposal.md +38 -0
- package/src/hidden-skills/groundwork-bet/templates/decomposition/meta.json +4 -0
- package/src/hidden-skills/groundwork-bet/templates/decomposition/milestone-index.md +31 -0
- package/src/hidden-skills/groundwork-bet/templates/decomposition/slice.md +31 -0
- package/src/hidden-skills/groundwork-bet/templates/pitch.md +45 -0
- package/src/hidden-skills/groundwork-bet/templates/technical-design/01-ui-design.md +51 -0
- package/src/hidden-skills/groundwork-bet/templates/technical-design/02-data-flows.md +36 -0
- package/src/hidden-skills/groundwork-bet/templates/technical-design/03-api-design.md +90 -0
- package/src/hidden-skills/groundwork-bet/templates/technical-design/04-data-design.md +29 -0
- package/src/hidden-skills/groundwork-bet/workflows/01-discovery.md +200 -0
- package/src/hidden-skills/groundwork-bet/workflows/02-design.md +178 -0
- package/src/hidden-skills/groundwork-bet/workflows/03-decomposition.md +242 -0
- package/src/hidden-skills/groundwork-bet/workflows/04-delivery.md +226 -0
- package/src/hidden-skills/groundwork-bet/workflows/05-validation.md +210 -0
- package/src/hidden-skills/groundwork-design-system/instructions.md +125 -0
- package/src/hidden-skills/groundwork-design-system/templates/brand-tokens.md +182 -0
- package/src/hidden-skills/groundwork-design-system/templates/design-system-cache.md +64 -0
- package/src/hidden-skills/groundwork-design-system/tracks/_foundation.md +136 -0
- package/src/hidden-skills/groundwork-design-system/tracks/agentic-protocol.md +269 -0
- package/src/hidden-skills/groundwork-design-system/tracks/cli.md +355 -0
- package/src/hidden-skills/groundwork-design-system/tracks/graphical-ui.md +330 -0
- package/src/hidden-skills/groundwork-design-system-extract/instructions.md +124 -0
- package/src/hidden-skills/groundwork-design-system-extract/templates/design-system-extract-cache.md +19 -0
- package/src/hidden-skills/groundwork-designer/SKILL.md +108 -0
- package/src/hidden-skills/groundwork-designer/references/accessibility.md +33 -0
- package/src/hidden-skills/groundwork-designer/references/ai-native-design.md +37 -0
- package/src/hidden-skills/groundwork-designer/references/design-review.md +29 -0
- package/src/hidden-skills/groundwork-designer/references/design-systems-and-tokens.md +33 -0
- package/src/hidden-skills/groundwork-designer/references/interaction-and-motion.md +37 -0
- package/src/hidden-skills/groundwork-designer/references/layout-and-space.md +33 -0
- package/src/hidden-skills/groundwork-designer/references/usability-and-ux.md +33 -0
- package/src/hidden-skills/groundwork-designer/references/visual-craft.md +49 -0
- package/src/hidden-skills/groundwork-designer/sync-anchor.md +20 -0
- package/src/hidden-skills/groundwork-doc-sync/instructions.md +100 -0
- package/src/hidden-skills/groundwork-elicit/instructions.md +66 -0
- package/src/hidden-skills/groundwork-elicit/methods.md +65 -0
- package/src/hidden-skills/groundwork-infra-adopt/instructions.md +168 -0
- package/src/hidden-skills/groundwork-infra-adopt/templates/infra-adopt-cache.md +21 -0
- package/src/hidden-skills/groundwork-mvp/instructions.md +223 -0
- package/src/hidden-skills/groundwork-mvp/templates/mvp-cache.md +9 -0
- package/src/hidden-skills/groundwork-patch/instructions.md +40 -0
- package/src/hidden-skills/groundwork-persona/instructions.md +65 -0
- package/src/hidden-skills/groundwork-product/SKILL.md +102 -0
- package/src/hidden-skills/groundwork-product/references/ai-native-product.md +45 -0
- package/src/hidden-skills/groundwork-product/references/discovery-and-opportunity.md +38 -0
- package/src/hidden-skills/groundwork-product/references/product-risks.md +52 -0
- package/src/hidden-skills/groundwork-product/references/requirements-and-specs.md +39 -0
- package/src/hidden-skills/groundwork-product/references/scope-and-sequencing.md +35 -0
- package/src/hidden-skills/groundwork-product/references/shaping-and-appetite.md +48 -0
- package/src/hidden-skills/groundwork-product/references/success-metrics-and-signals.md +37 -0
- package/src/hidden-skills/groundwork-product/sync-anchor.md +19 -0
- package/src/hidden-skills/groundwork-product-brief/instructions.md +231 -0
- package/src/hidden-skills/groundwork-product-brief-extract/instructions.md +139 -0
- package/src/hidden-skills/groundwork-product-brief-extract/templates/product-brief-extract-cache.md +17 -0
- package/src/hidden-skills/groundwork-review/checklists/architecture.md +93 -0
- package/src/hidden-skills/groundwork-review/checklists/bet-pitch.md +94 -0
- package/src/hidden-skills/groundwork-review/checklists/decomposition.md +135 -0
- package/src/hidden-skills/groundwork-review/checklists/design-system.md +85 -0
- package/src/hidden-skills/groundwork-review/checklists/domain-entity.md +66 -0
- package/src/hidden-skills/groundwork-review/checklists/implementation-readiness.md +47 -0
- package/src/hidden-skills/groundwork-review/checklists/infrastructure.md +68 -0
- package/src/hidden-skills/groundwork-review/checklists/maturity.md +71 -0
- package/src/hidden-skills/groundwork-review/checklists/product-brief.md +69 -0
- package/src/hidden-skills/groundwork-review/checklists/technical-design.md +112 -0
- package/src/hidden-skills/groundwork-review/instructions.md +181 -0
- package/src/hidden-skills/groundwork-scaffold/instructions.md +254 -0
- package/src/hidden-skills/groundwork-scaffold/phases/01-ingestion-service-mapping.md +87 -0
- package/src/hidden-skills/groundwork-scaffold/phases/02-scaffolding-execution.md +15 -0
- package/src/hidden-skills/groundwork-scaffold/phases/03-service-documentation-api-stubs.md +100 -0
- package/src/hidden-skills/groundwork-scaffold/phases/04-infrastructure-verification.md +17 -0
- package/src/hidden-skills/groundwork-scaffold/phases/05-draft-review.md +19 -0
- package/src/hidden-skills/groundwork-scaffold/phases/06-commit.md +19 -0
- package/src/hidden-skills/groundwork-scaffold/templates/scaffold-cache.md +23 -0
- package/src/hidden-skills/groundwork-scan/instructions.md +164 -0
- package/src/hidden-skills/groundwork-scan/references/digest-schema.md +66 -0
- package/src/hidden-skills/groundwork-scan/references/exclusions.md +44 -0
- package/src/hidden-skills/groundwork-scan/templates/architecture-findings.md +42 -0
- package/src/hidden-skills/groundwork-scan/templates/design-findings.md +23 -0
- package/src/hidden-skills/groundwork-scan/templates/overview.md +26 -0
- package/src/hidden-skills/groundwork-scan/templates/product-findings.md +23 -0
- package/src/hidden-skills/groundwork-scan/templates/scan-state.json +19 -0
- package/src/hidden-skills/groundwork-stack-forge/instructions.md +150 -0
- package/src/hidden-skills/groundwork-stack-forge/references/authoring-engineer-skills.md +107 -0
- package/src/hidden-skills/groundwork-surface-activation/instructions.md +138 -0
- package/src/hidden-skills/groundwork-update/briefs/reconcile-worker.md +196 -0
- package/src/hidden-skills/groundwork-update/instructions.md +200 -0
- package/src/hidden-skills/groundwork-writer/SKILL.md +278 -0
- package/src/hidden-skills/maturity-model.md +125 -0
- package/src/hidden-skills/operating-contract.md +400 -0
- package/src/hidden-skills/repo-map-schema.md +90 -0
- package/src/hidden-skills/templates/adr.md +57 -0
- package/src/hidden-skills/templates/capability-ports.md +71 -0
- package/src/hidden-skills/templates/discovery-notes.md +33 -0
- package/src/hidden-skills/templates/domain-entity.md +80 -0
- package/src/hidden-skills/templates/gap-ledger.md +21 -0
- package/src/hidden-skills/templates/handoff.md +37 -0
- package/src/hidden-skills/templates/maturity.md +39 -0
- package/src/hidden-skills/templates/surfaces.md +207 -0
- package/src/skills/groundwork-check/SKILL.md +56 -0
- package/src/skills/groundwork-check/instructions.md +70 -0
- package/src/skills/groundwork-orchestrator/SKILL.md +176 -0
- 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
|
+
};
|