groundwork-method 0.0.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +781 -0
- package/LICENSE +21 -0
- package/README.md +44 -29
- package/bin/groundwork.js +1654 -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 +125 -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 +68 -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 +82 -0
- package/src/docs/principles/index.md +23 -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 +118 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/ipc-contracts.md +138 -0
- package/src/engineer-skills/groundwork-electron-engineer/references/packaging-and-updates.md +82 -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 +107 -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 +14 -0
- package/src/engineer-skills/groundwork-flutter-engineer/SKILL.md +108 -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/navigation.md +122 -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/state-management.md +166 -0
- package/src/engineer-skills/groundwork-flutter-engineer/references/testing.md +135 -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 +15 -0
- package/src/engineer-skills/groundwork-go-engineer/SKILL.md +171 -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/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 +139 -0
- package/src/engineer-skills/groundwork-go-engineer/sync-anchor.md +11 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/SKILL.md +107 -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/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/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 +433 -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 +278 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/references/visual-language.md +69 -0
- package/src/engineer-skills/groundwork-nextjs-engineer/sync-anchor.md +9 -0
- package/src/engineer-skills/groundwork-python-engineer/SKILL.md +196 -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/testing.md +177 -0
- package/src/engineer-skills/groundwork-python-engineer/sync-anchor.md +13 -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 +47 -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 +68 -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 +74 -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 +30 -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 +152 -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 +281 -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/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 +227 -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 +142 -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 +129 -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/slice-worker.md +191 -0
- package/src/hidden-skills/groundwork-bet/instructions.md +88 -0
- package/src/hidden-skills/groundwork-bet/templates/bet-progress-test.md +126 -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 +35 -0
- package/src/hidden-skills/groundwork-bet/templates/decomposition/slice.md +35 -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 +198 -0
- package/src/hidden-skills/groundwork-bet/workflows/02-design.md +168 -0
- package/src/hidden-skills/groundwork-bet/workflows/03-decomposition.md +246 -0
- package/src/hidden-skills/groundwork-bet/workflows/04-delivery.md +193 -0
- package/src/hidden-skills/groundwork-bet/workflows/05-validation.md +199 -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 +54 -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 +46 -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,135 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
- [The Taxonomy](#the-taxonomy)
|
|
5
|
+
- [The Prove-Once Rule](#the-prove-once-rule)
|
|
6
|
+
- [Unit Tests](#unit-tests)
|
|
7
|
+
- [Widget Tests](#widget-tests)
|
|
8
|
+
- [Integration Tests](#integration-tests)
|
|
9
|
+
- [Patrol — the OS Boundary Only](#patrol--the-os-boundary-only)
|
|
10
|
+
- [Golden Tests](#golden-tests)
|
|
11
|
+
- [CI Lanes](#ci-lanes)
|
|
12
|
+
- [Test Commands](#test-commands)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The Taxonomy
|
|
17
|
+
|
|
18
|
+
| Tier | Scope | Runs on | Budget |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| Unit | view models, repositories, mappers (pure Dart) | anywhere, milliseconds | generous |
|
|
21
|
+
| Widget | feature views via `testWidgets` | headless, seconds | **the bulk of coverage** |
|
|
22
|
+
| `integration_test` | happy-path E2E through the real binary | headless Android emulator | thin — minutes per test |
|
|
23
|
+
| Patrol | flows crossing the Flutter/OS boundary | emulator/device | only when the OS is in the flow |
|
|
24
|
+
| Goldens (alchemist) | design-system-level components | CI with text-as-blocks variants | component library only |
|
|
25
|
+
|
|
26
|
+
Pick the **cheapest tier that can carry the assertion**. If a widget test can prove it, an integration test that proves it is waste.
|
|
27
|
+
|
|
28
|
+
## The Prove-Once Rule
|
|
29
|
+
|
|
30
|
+
Capability behaviour is proven once, headless, at the core's contract. The surface suite proves three things only:
|
|
31
|
+
|
|
32
|
+
1. **Wiring** — the typed client/repository is called with the right inputs.
|
|
33
|
+
2. **Rendering** — core state renders correctly (including error and empty states).
|
|
34
|
+
3. **Interaction** — commands fire, navigation moves, errors surface.
|
|
35
|
+
|
|
36
|
+
A widget or integration test re-asserting a business rule (price calculation, permission logic, validation semantics) is a review finding: it duplicates a proof that exists at the contract and couples this suite to core internals.
|
|
37
|
+
|
|
38
|
+
## Unit Tests
|
|
39
|
+
|
|
40
|
+
Pure Dart, **fakes over mocks**. An in-memory fake implementing the abstract repository survives refactors that stub-and-verify mocks break on, and doubles as the widget-test fixture:
|
|
41
|
+
|
|
42
|
+
```dart
|
|
43
|
+
class FakeOrderRepository implements OrderRepository {
|
|
44
|
+
FakeOrderRepository({List<Order> seed = const []}) : _orders = [...seed];
|
|
45
|
+
final List<Order> _orders;
|
|
46
|
+
Order? lastPlaced;
|
|
47
|
+
|
|
48
|
+
@override
|
|
49
|
+
Future<List<Order>> recent({bool refresh = false}) async => _orders;
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
Future<Order> place(PlaceOrderRequest req) async {
|
|
53
|
+
final order = Order(id: 'fake-${_orders.length}', /* ... */);
|
|
54
|
+
_orders.add(order);
|
|
55
|
+
lastPlaced = order;
|
|
56
|
+
return order;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
View models are tested through `ProviderContainer` with overrides — no widget tree (see `references/state-management.md` for the pattern). Test the real Notifier; never mock the unit under test.
|
|
62
|
+
|
|
63
|
+
## Widget Tests
|
|
64
|
+
|
|
65
|
+
The bulk of coverage. Pump the View inside a `ProviderScope` with fake repositories; assert through **semantics and visible text**, not widget types or internal keys:
|
|
66
|
+
|
|
67
|
+
```dart
|
|
68
|
+
testWidgets('placing an order shows the confirmation', (tester) async {
|
|
69
|
+
final fakeRepo = FakeOrderRepository(seed: [draftOrder]);
|
|
70
|
+
await tester.pumpWidget(ProviderScope(
|
|
71
|
+
overrides: [orderRepositoryProvider.overrideWithValue(fakeRepo)],
|
|
72
|
+
child: MaterialApp(theme: buildLightTheme(), home: const OrderView()),
|
|
73
|
+
));
|
|
74
|
+
await tester.pumpAndSettle();
|
|
75
|
+
|
|
76
|
+
await tester.tap(find.bySemanticsLabel('Place order'));
|
|
77
|
+
await tester.pumpAndSettle();
|
|
78
|
+
|
|
79
|
+
expect(find.text('Order placed'), findsOneWidget);
|
|
80
|
+
expect(fakeRepo.lastPlaced, isNotNull);
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Conventions:
|
|
85
|
+
|
|
86
|
+
- Finder priority: `find.bySemanticsLabel` → `find.text` → `find.byTooltip` → `find.byIcon` → (`find.byType`/keys only as a last resort). Semantics-based finds break on user-visible regressions only — and they keep the UI accessible, because inaccessible UI is untestable UI.
|
|
87
|
+
- Pump with the real theme (`buildLightTheme()`) so theme extensions resolve; pump both themes for theme-sensitive components.
|
|
88
|
+
- Cover error and empty states, not just the happy path — rendering core failure states is half the surface's job.
|
|
89
|
+
- `pumpAndSettle` is for settling real transitions, not a sleep. If a test needs settling tricks, the awaited state is not modelled — assert on it explicitly.
|
|
90
|
+
|
|
91
|
+
## Integration Tests
|
|
92
|
+
|
|
93
|
+
`integration_test/` drives the real app binary. Keep it to **happy paths, one flow per critical journey**, with the gateway faked or staged:
|
|
94
|
+
|
|
95
|
+
```dart
|
|
96
|
+
void main() {
|
|
97
|
+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
|
98
|
+
|
|
99
|
+
testWidgets('the app boots to the home view', (tester) async {
|
|
100
|
+
await tester.pumpWidget(ProviderScope(
|
|
101
|
+
overrides: [statusRepositoryProvider.overrideWithValue(FakeStatusRepository())],
|
|
102
|
+
child: const App(),
|
|
103
|
+
));
|
|
104
|
+
await tester.pumpAndSettle();
|
|
105
|
+
expect(find.text('Wired to the workspace gateway'), findsOneWidget);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Every integration test costs emulator minutes — the most expensive test currency in this stack. If a widget test can carry the assertion, move it down a tier.
|
|
111
|
+
|
|
112
|
+
## Patrol — the OS Boundary Only
|
|
113
|
+
|
|
114
|
+
Add Patrol (LeanCode) only when a flow **leaves Flutter for the OS**: permission dialogs, push notifications, system sign-in sheets, WebViews, home/recents behaviour. It also brings full test isolation and sharding. A Patrol suite duplicating pure-Flutter flows `integration_test` already covers is scope creep — the boundary is the OS, not preference for its `$` finder DSL.
|
|
115
|
+
|
|
116
|
+
## Golden Tests
|
|
117
|
+
|
|
118
|
+
Goldens guard **design-system-level components** (the token-projected theme made visible), via **alchemist** with its platform-test vs CI-test split (CI variants render text as blocks, killing font flakiness). Scope is the component library, not full screens — screen-level goldens churn on every copy change and teach rubber-stamping. `golden_toolkit` is discontinued: migrate, never adopt.
|
|
119
|
+
|
|
120
|
+
## CI Lanes
|
|
121
|
+
|
|
122
|
+
- **PR gate:** `flutter analyze` + `flutter test` (unit + widget, headless, fast).
|
|
123
|
+
- **Boot lane:** `flutter test integration_test` on a headless Android emulator — `reactivecircus/android-emulator-runner@v2`, x86_64, `-no-window -gpu swiftshader_indirect -no-snapshot-load -no-snapshot-save`, KVM-enabled runner.
|
|
124
|
+
- **iOS is a local-only / device-farm lane (Firebase Test Lab, Codemagic), never a CI gate** — it needs macOS runners and hands, and putting it in the gate breaks the headless loop.
|
|
125
|
+
- A runner without the Flutter SDK reports the tier **skipped-with-reason, never silently green**.
|
|
126
|
+
|
|
127
|
+
## Test Commands
|
|
128
|
+
|
|
129
|
+
| Command | Purpose |
|
|
130
|
+
|---|---|
|
|
131
|
+
| `npx nx run <app>:test` | unit + widget tests (guarded: skips-with-reason without the SDK) |
|
|
132
|
+
| `npx nx run <app>:analyze` | static analysis |
|
|
133
|
+
| `npx nx run <app>:test-integration` | integration_test against a device/emulator |
|
|
134
|
+
| `flutter test test/home_view_test.dart` | single file |
|
|
135
|
+
| `flutter test --name 'refresh'` | by test name |
|
package/src/engineer-skills/groundwork-flutter-engineer/references/theming-and-design-tokens.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Theming and Design Tokens
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
- [The Projection Model](#the-projection-model)
|
|
5
|
+
- [The Generated Palette Module](#the-generated-palette-module)
|
|
6
|
+
- [Consuming the Theme](#consuming-the-theme)
|
|
7
|
+
- [Theme Extensions for Semantic Roles](#theme-extensions-for-semantic-roles)
|
|
8
|
+
- [Dark Mode](#dark-mode)
|
|
9
|
+
- [Typography](#typography)
|
|
10
|
+
- [Evolving the Brand](#evolving-the-brand)
|
|
11
|
+
- [Material/Cupertino Freeze Note](#materialcupertino-freeze-note)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## The Projection Model
|
|
16
|
+
|
|
17
|
+
The theme is **generated from the design system's brand tokens**, not authored in the app. The chain:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
docs/design-system.md → .groundwork/config/brand-tokens.json (visual block)
|
|
21
|
+
→ lib/ui/core/theme/brand_palette.dart (GENERATED)
|
|
22
|
+
→ lib/ui/core/theme/app_theme.dart (builds ThemeData)
|
|
23
|
+
→ Theme.of(context) in widgets
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The same tokens drive every surface of the product (web, CLI, mobile), so cross-surface visual consistency is a build artifact, not a review hope. The consequence for implementation work: **a hex literal in a widget file is a review finding** — it forks the design system silently.
|
|
27
|
+
|
|
28
|
+
## The Generated Palette Module
|
|
29
|
+
|
|
30
|
+
`brand_palette.dart` carries the projected token values and is regenerated, never hand-edited:
|
|
31
|
+
|
|
32
|
+
- Palette roles in both themes: `primaryLight/primaryDark`, `accent…`, `surface…`, `surfaceAlt…`, `textBody…`, `success…`, `error…`, `warning…`, `info…`.
|
|
33
|
+
- Typography families and weights: `displayFontFamily`, `bodyFontFamily`.
|
|
34
|
+
- Shape: `radiusBase`.
|
|
35
|
+
|
|
36
|
+
Widgets do **not** import `brand_palette.dart`. Only `app_theme.dart` reads it, building `ThemeData` (ColorScheme, TextTheme, component themes, ThemeExtensions) from the constants. The palette is the projection artifact; the theme is the API.
|
|
37
|
+
|
|
38
|
+
## Consuming the Theme
|
|
39
|
+
|
|
40
|
+
```dart
|
|
41
|
+
@override
|
|
42
|
+
Widget build(BuildContext context) {
|
|
43
|
+
final theme = Theme.of(context);
|
|
44
|
+
return Container(
|
|
45
|
+
decoration: BoxDecoration(
|
|
46
|
+
color: theme.colorScheme.surfaceContainerHighest,
|
|
47
|
+
borderRadius: BorderRadius.circular(BrandPalette.radiusBase), // only via shared components
|
|
48
|
+
),
|
|
49
|
+
child: Text('Title', style: theme.textTheme.titleLarge),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Resolution order when you need a colour or style:
|
|
55
|
+
|
|
56
|
+
1. A `ColorScheme` role (`primary`, `surface`, `error`, `onSurface`, ...).
|
|
57
|
+
2. A `ThemeExtension` (semantic roles the scheme lacks — see below).
|
|
58
|
+
3. A shared component (e.g. a `Card` whose shape the component theme already sets).
|
|
59
|
+
4. If none fits, the design system is missing a decision — raise it; do not inline a value.
|
|
60
|
+
|
|
61
|
+
Never: `Color(0xFF...)`, `TextStyle(fontSize: 13)`, `EdgeInsets.all(13)` with non-scale values, opacity-hacked variants of brand colours.
|
|
62
|
+
|
|
63
|
+
## Theme Extensions for Semantic Roles
|
|
64
|
+
|
|
65
|
+
Material's `ColorScheme` has no success/warning/info roles. The theme defines them as a `ThemeExtension` built from the palette:
|
|
66
|
+
|
|
67
|
+
```dart
|
|
68
|
+
final status = Theme.of(context).extension<StatusColors>()!;
|
|
69
|
+
Icon(Icons.check_circle, color: status.success);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
When a new semantic role is needed (e.g. a "highlight" colour), extend the `ThemeExtension` in `app_theme.dart` from a palette/token value — do not scatter one-off colours.
|
|
73
|
+
|
|
74
|
+
## Dark Mode
|
|
75
|
+
|
|
76
|
+
Both themes are built from the same palette (each role carries light and dark values — a design-system commitment, not an option):
|
|
77
|
+
|
|
78
|
+
```dart
|
|
79
|
+
MaterialApp.router(
|
|
80
|
+
theme: buildLightTheme(),
|
|
81
|
+
darkTheme: buildDarkTheme(),
|
|
82
|
+
themeMode: ThemeMode.system,
|
|
83
|
+
)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Implementation rules:
|
|
87
|
+
|
|
88
|
+
- Never branch on `Theme.of(context).brightness` to pick hardcoded colours — the scheme and extensions already resolved per-theme values.
|
|
89
|
+
- Every visual change is verified in both themes (widget tests pump both when the component is theme-sensitive — see `references/testing.md`).
|
|
90
|
+
|
|
91
|
+
## Typography
|
|
92
|
+
|
|
93
|
+
`app_theme.dart` applies the projected families to the `TextTheme` (display family on headlines/titles, body family elsewhere). Widgets use `textTheme` slots — `headlineMedium`, `titleLarge`, `bodyMedium` — never raw `TextStyle`s with families or sizes.
|
|
94
|
+
|
|
95
|
+
The families only render once their font assets are bundled in `pubspec.yaml` (`fonts:` section). Until then Flutter falls back silently — if the type looks wrong, check the asset bundling before the theme code.
|
|
96
|
+
|
|
97
|
+
## Evolving the Brand
|
|
98
|
+
|
|
99
|
+
When the design system changes:
|
|
100
|
+
|
|
101
|
+
1. The design-system run updates `brand-tokens.json`.
|
|
102
|
+
2. Regenerate (or mechanically update) `brand_palette.dart` to match — the file header marks it as generated.
|
|
103
|
+
3. `app_theme.dart` and all widgets pick the change up for free.
|
|
104
|
+
|
|
105
|
+
If a visual change cannot be expressed through tokens → palette → theme, that is a design-system gap to raise, not a license to hand-edit the palette.
|
|
106
|
+
|
|
107
|
+
## Material/Cupertino Freeze Note
|
|
108
|
+
|
|
109
|
+
Material and Cupertino are frozen in the core framework as of Flutter 3.44 and are moving to standalone `material_ui`/`cupertino_ui` packages with independent versioning. When those packages land in this app's pubspec, pin them deliberately and review the theme builder against their migration notes — expect the dependency shift; do not be surprised by it.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Widgets and Composition
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
- [Composition Over Inheritance](#composition-over-inheritance)
|
|
5
|
+
- [Extract Widgets, Not Helper Methods](#extract-widgets-not-helper-methods)
|
|
6
|
+
- [const Discipline](#const-discipline)
|
|
7
|
+
- [Build Purity](#build-purity)
|
|
8
|
+
- [Keys](#keys)
|
|
9
|
+
- [Layout Decisions](#layout-decisions)
|
|
10
|
+
- [Review Checklist](#review-checklist)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Composition Over Inheritance
|
|
15
|
+
|
|
16
|
+
New UI composes existing widgets; it never subclasses a widget to alter behaviour. A `PrimaryButton` wraps and configures `FilledButton`; it does not extend it:
|
|
17
|
+
|
|
18
|
+
```dart
|
|
19
|
+
class PrimaryButton extends StatelessWidget {
|
|
20
|
+
const PrimaryButton({super.key, required this.label, this.onPressed});
|
|
21
|
+
|
|
22
|
+
final String label;
|
|
23
|
+
final VoidCallback? onPressed;
|
|
24
|
+
|
|
25
|
+
@override
|
|
26
|
+
Widget build(BuildContext context) {
|
|
27
|
+
return FilledButton(
|
|
28
|
+
onPressed: onPressed,
|
|
29
|
+
child: Text(label),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Flutter's rendering model rewards exactly one style — small, pure, const-friendly widgets composed deeply. Every deviation is something the next change must special-case.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Extract Widgets, Not Helper Methods
|
|
40
|
+
|
|
41
|
+
`Widget _buildHeader()` defeats const canonicalisation and rebuild isolation — the framework cannot skip a subtree it cannot identify. Extract a widget class instead:
|
|
42
|
+
|
|
43
|
+
```dart
|
|
44
|
+
// WRONG — helper method
|
|
45
|
+
Widget _buildHeader(BuildContext context) => Row(children: [...]);
|
|
46
|
+
|
|
47
|
+
// RIGHT — extracted widget, rebuild-isolated, const-capable
|
|
48
|
+
class _Header extends StatelessWidget {
|
|
49
|
+
const _Header({required this.title});
|
|
50
|
+
final String title;
|
|
51
|
+
@override
|
|
52
|
+
Widget build(BuildContext context) => Row(children: [...]);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Extract when a subtree is reused, when it can become `const`, or when a build method stops fitting on a screen.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## const Discipline
|
|
61
|
+
|
|
62
|
+
Every constructor that can be `const` is `const`; every instantiation site that can use `const` does. A `const` widget is canonicalised and skipped during rebuilds — the cheapest performance work in the framework. `flutter_lints` (`prefer_const_constructors` and friends) enforces this; treat those lints as errors, not suggestions.
|
|
63
|
+
|
|
64
|
+
Practical habit: when a `const` keyword fails to compile, ask why the widget isn't const-capable before deleting the keyword — often a value should be passed in rather than computed inline.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Build Purity
|
|
69
|
+
|
|
70
|
+
`build` reads state and returns widgets. It never:
|
|
71
|
+
|
|
72
|
+
- mutates state (including provider state),
|
|
73
|
+
- fires network requests,
|
|
74
|
+
- shows dialogs or snackbars,
|
|
75
|
+
- starts animations or timers.
|
|
76
|
+
|
|
77
|
+
Flutter may call `build` at any frequency; an impure build turns rebuild cadence into behaviour. Side effects belong in view-model commands, lifecycle hooks (`initState`, `ref.listen`), or explicit handlers:
|
|
78
|
+
|
|
79
|
+
```dart
|
|
80
|
+
// Side-effect on state change: ref.listen, not build.
|
|
81
|
+
ref.listen(submitOrder, (prev, next) {
|
|
82
|
+
if (next is MutationError) {
|
|
83
|
+
ScaffoldMessenger.of(context).showSnackBar(/* ... */);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
A conditional in `build` that encodes a business rule belongs in the view model; `build` branches on view state only.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Keys
|
|
93
|
+
|
|
94
|
+
Keys appear in exactly three situations:
|
|
95
|
+
|
|
96
|
+
1. **Reorderable/filterable lists** — `ValueKey(item.id)` on each child, so state follows identity, not position.
|
|
97
|
+
2. **Tree-shape changes around stateful widgets** — preserving state when conditionals restructure the tree.
|
|
98
|
+
3. **`GlobalKey` for the rare imperative handle** — forms (`FormState`), nothing else.
|
|
99
|
+
|
|
100
|
+
A key sprinkled "to be safe" is noise. A missing key on a reorderable list is a state-corruption bug. A `GlobalKey` reaching into another widget's state is a view model that wasn't written.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Layout Decisions
|
|
105
|
+
|
|
106
|
+
- **`LayoutBuilder` over `MediaQuery.of(context).size`** — a widget responds to its parent's constraints, not the screen. MediaQuery-based layout breaks the moment the widget is placed in a pane, sheet, or test harness.
|
|
107
|
+
- Spacing and sizes come from the theme/density system, not magic numbers (see `references/theming-and-design-tokens.md`).
|
|
108
|
+
- Tap targets meet the 48dp minimum (see `references/accessibility.md`).
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Review Checklist
|
|
113
|
+
|
|
114
|
+
Flag in review:
|
|
115
|
+
|
|
116
|
+
- [ ] Any subclassed framework widget (composition exists).
|
|
117
|
+
- [ ] `Widget _buildX()` helper methods returning subtrees.
|
|
118
|
+
- [ ] Missing `const` where the lint reports it.
|
|
119
|
+
- [ ] Side effects (mutation, requests, dialogs, animation starts) inside `build`.
|
|
120
|
+
- [ ] Business-rule conditionals inside `build`.
|
|
121
|
+
- [ ] `Color(0xFF...)`, raw `TextStyle(...)`, or magic paddings (theme violation — see theming reference).
|
|
122
|
+
- [ ] Lists built from dynamic collections without `ValueKey`s.
|
|
123
|
+
- [ ] `MediaQuery.size` used for layout branching.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Sync Anchor
|
|
2
|
+
|
|
3
|
+
This file pins the principle files this skill embeds. When any listed file
|
|
4
|
+
changes, this skill must be reviewed in the same commit. CI verifies the
|
|
5
|
+
hashes match.
|
|
6
|
+
|
|
7
|
+
| Principle file | SHA-256 | Last reviewed |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/index.md | 45c86182ebbaf4be599f54a22a7e8bbebbc455bbdcacda4fbec845f2de041885 | 2026-06-12 |
|
|
10
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/architecture.md | ac10c2c87da358157973ebbfe07657491d68a248b946b00697fdc5e18f3af596 | 2026-06-12 |
|
|
11
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/state-management.md | a690a3476453cb8ed0af0d3f48566d8ba6a2d508ac1ef782fd27bbffd2268994 | 2026-06-12 |
|
|
12
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/widgets-and-composition.md | b45c55220f14a7886837c4d4159b33febceed772db32a7efb277e7dba00512e8 | 2026-06-12 |
|
|
13
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/testing.md | 5aec7d7c5300cf6f4c4f4b07809ff02010505cf71329f7dc5b766de39b97685e | 2026-06-12 |
|
|
14
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/platform-channels.md | 6b5a54dcb8b55433b7175cf715a6a3abf03c86c317f2037af6155a131691cfb2 | 2026-06-12 |
|
|
15
|
+
| src/generators/flutter-app/docs/principles/stack/flutter/releases-and-distribution.md | 70ecdca2be6d8476359dbc2e72e3510157b49db0f5512cded76e0e3f19bed46f | 2026-06-12 |
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: groundwork-go-engineer
|
|
3
|
+
description: >
|
|
4
|
+
Implement and review Go service changes using self-contained engineering
|
|
5
|
+
references and the current repository as the source of truth. Use for Go
|
|
6
|
+
backend handlers, services, providers, domain models, migrations, telemetry,
|
|
7
|
+
structured logging, dependency injection, tests, concurrency, or service
|
|
8
|
+
architecture. This skill is the execution router for Go backend work: it loads
|
|
9
|
+
reference docs selectively, preserves core/edge boundaries and the inward
|
|
10
|
+
dependency rule, coordinates with adjacent skills, and verifies changes
|
|
11
|
+
against contracts and tests. Use this
|
|
12
|
+
skill whenever the user works in a Go service directory or asks about Go
|
|
13
|
+
backend behavior, even if they do not explicitly ask for a "go engineer."
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Go Engineer
|
|
17
|
+
|
|
18
|
+
Go backend execution router for service repositories. Durable engineering guidance lives in `references/`; this skill decides what to load, how to route the task, what repository facts to verify, and which safety gates apply.
|
|
19
|
+
|
|
20
|
+
## Operating Contract
|
|
21
|
+
|
|
22
|
+
1. Load reference docs from `references/` for architectural and implementation guidance. Treat the current repository's code, specs, and generated contracts as the source of truth for naming, structure, and behavior.
|
|
23
|
+
2. Inspect the current repository before naming packages, commands, import paths, schemas, or generated files.
|
|
24
|
+
3. Load the smallest reference set that explains the task. Add more context only when the task crosses a boundary.
|
|
25
|
+
4. Preserve the service's dependency direction and public contracts. Code implements OpenAPI, database migrations, event schemas, and documented architecture — it does not invent them.
|
|
26
|
+
5. Coordinate with adjacent skills when another skill owns the primary decision surface.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Code intelligence (repo map + Serena)
|
|
31
|
+
|
|
32
|
+
GroundWork gives you a deterministic **repo map** (`npx groundwork-method repo-map` — tree-sitter import edges + PageRank centrality, cached to `.groundwork/cache/repo-map.json`) and the **Serena** MCP server (LSP-backed symbol navigation and editing), registered at init. Orient before reading widely: refresh the map, read its `centrality` ranking to find the hubs, then use Serena to navigate them (`get_symbols_overview` / `find_symbol` / `find_referencing_symbols`) and make reference-aware edits (`replace_symbol_body` / `rename`). Full workflow and the graceful-degradation contract live in `.groundwork/skills/code-intelligence.md`; fall back to ordinary reads and edits when they are unavailable.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Required First Checks
|
|
37
|
+
|
|
38
|
+
Before non-trivial Go implementation or review work:
|
|
39
|
+
|
|
40
|
+
| Check | Why |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Service package layout and nearby examples for the touched layer | Prevents inventing structure that already has a convention |
|
|
43
|
+
| `go.mod` for Go and dependency versions | Avoids version-specific advice that contradicts the project |
|
|
44
|
+
| OpenAPI spec (if HTTP behavior changes) | HTTP contracts are generated — code must match the spec |
|
|
45
|
+
| Database schema file + migration tooling (if schema changes) | Schema is target-state — migrations derive from it |
|
|
46
|
+
| Event specs (AsyncAPI, Protobuf, etc.) for async/real-time behavior | Event types drive code generation downstream |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Context Routing
|
|
51
|
+
|
|
52
|
+
Load only the rows relevant to the current task. Reference files are in the skill's `references/` directory.
|
|
53
|
+
|
|
54
|
+
| Task shape | Reference to load |
|
|
55
|
+
|---|---|
|
|
56
|
+
| Any non-trivial service change | `architecture.md`, `implementation-patterns.md`, `go-services.md` |
|
|
57
|
+
| Go idioms, context, interfaces, DI, errors, config validation | `go-services.md` |
|
|
58
|
+
| Concurrency, goroutine lifecycle, errgroup, context cancellation | `concurrency.md` |
|
|
59
|
+
| Layer placement, new boundary, dependency direction | `architecture.md` |
|
|
60
|
+
| Capability interface + provider (LLM etc.), generated adapter shape, bare-interface bet, `add-capability` | `capability-ports.md`, `architecture.md` |
|
|
61
|
+
| HTTP endpoint, handler, idempotency, CORS | `http-handlers.md`, `api-design.md` |
|
|
62
|
+
| Database repository, SQL, declarative schema, test isolation | `postgres.md` |
|
|
63
|
+
| Observability — tracing, structured logging, metrics | `observability.md` |
|
|
64
|
+
| Reliability — retries, timeouts, graceful shutdown, backpressure | `reliability-performance.md` |
|
|
65
|
+
| Performance — latency budgets, load shedding, profiling | `reliability-performance.md` |
|
|
66
|
+
| Events, Pub/Sub, WebSocket, async integration | `integration-realtime-data.md` |
|
|
67
|
+
| Tests, quality gates, coverage strategy, flake triage | `testing.md` |
|
|
68
|
+
| Code quality, naming, simplicity, deletion | `code-craft-security.md` |
|
|
69
|
+
| Security, auth, secrets, input validation, supply chain | `code-craft-security.md` |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Skill Handoffs
|
|
74
|
+
|
|
75
|
+
Use the smallest collaborating set. Keep the Go engineer as lead when the work is mainly Go implementation inside a service directory.
|
|
76
|
+
|
|
77
|
+
| Condition | Hand off to |
|
|
78
|
+
|---|---|
|
|
79
|
+
| Endpoint shape, OpenAPI, error envelope, pagination, idempotency, SDK generation, webhooks, versioning | API architect / API design skill |
|
|
80
|
+
| Schema, migrations, indexes, query plans, constraints, RLS, retention, vector/full-text search | Database / Postgres design skill |
|
|
81
|
+
| Streaming, Pub/Sub, WebSockets, event schemas, replay, fan-out, idempotency, source-aware updates | Real-time / event architecture skill |
|
|
82
|
+
| Test strategy, CI quality gates, contract tests, flake reduction, validation design | Test architecture skill |
|
|
83
|
+
| Deployment, Cloud Run, Terraform, Docker, CI/CD, observability infrastructure, local dev tooling | Platform engineering skill |
|
|
84
|
+
|
|
85
|
+
If the collaborating skill does not exist in the project, handle the concern inline but flag it as outside this skill's primary scope.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Execution Checklist
|
|
90
|
+
|
|
91
|
+
1. **Identify the touched contract surface** — domain behavior, HTTP contract, database schema, event contract, operational behavior, or tests.
|
|
92
|
+
2. **Load minimal routed references** and inspect nearby code before designing.
|
|
93
|
+
3. **State important inferences** when guidance comes from general Go knowledge rather than project-specific docs or code.
|
|
94
|
+
4. **Implement within existing conventions** — do not create new layer boundaries without evidence from docs or existing code.
|
|
95
|
+
5. **Run targeted tests/checks** when feasible. If not feasible, explain the blocker and name the exact command to run later.
|
|
96
|
+
6. **Summarize** references consulted, files changed, verification performed, and residual risks.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Safety Gates
|
|
101
|
+
|
|
102
|
+
These constraints prevent the most common classes of architectural damage in Go services.
|
|
103
|
+
|
|
104
|
+
### Naming and Boundaries
|
|
105
|
+
- Do not invent package paths, command names, contract files, or service boundaries. Verify them in the repository first.
|
|
106
|
+
- Do not create new layer boundaries without evidence from docs or existing code.
|
|
107
|
+
|
|
108
|
+
### Layer Discipline
|
|
109
|
+
- Do not put business decisions in handlers, edge implementations, middleware, migrations, or generated code when the architecture expects them in domain/service code.
|
|
110
|
+
- Do not leak implementation-specific types across the core/edge boundary. If a database driver type appears in a core interface, the architecture is broken.
|
|
111
|
+
- Always validate configuration at startup (e.g., `envconfig`); do not scatter `os.Getenv` throughout the codebase.
|
|
112
|
+
|
|
113
|
+
### Inbound Defenses & API Standards
|
|
114
|
+
- Do not use offset/limit pagination for collections; enforce cursor-based pagination.
|
|
115
|
+
- Do not allow mutating endpoints (POST/PATCH) without an `Idempotency-Key` implementation to prevent duplicate side-effects.
|
|
116
|
+
- Do not omit inbound concurrency limits (load shedding); shed load rather than queuing indefinitely.
|
|
117
|
+
- Never use wildcard CORS (`AllowedOrigins: []string{"*"}`).
|
|
118
|
+
|
|
119
|
+
### Error Handling
|
|
120
|
+
- Do not log and return the same error at multiple layers. Wrap errors with context and log at the boundary established by existing code.
|
|
121
|
+
|
|
122
|
+
### Concurrency
|
|
123
|
+
- Do not launch untracked goroutines. Verify cancellation, error collection, and shutdown behavior for every concurrent operation.
|
|
124
|
+
|
|
125
|
+
### Contract & Data Integrity
|
|
126
|
+
- Do not change HTTP behavior without checking the OpenAPI source and any generated-client workflow.
|
|
127
|
+
- Do not change database behavior without checking the target-state schema, the migration workflow, and dry-run output when feasible. Use declarative schemas.
|
|
128
|
+
- Do not add or modify domain event types without updating the corresponding event spec.
|
|
129
|
+
|
|
130
|
+
### Generation
|
|
131
|
+
- Do not run code generation manually outside documented generation flows.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Quick Reference
|
|
136
|
+
|
|
137
|
+
Frequently needed patterns. Verify against the actual repository before using them.
|
|
138
|
+
|
|
139
|
+
### Domain Error Pattern
|
|
140
|
+
|
|
141
|
+
| Sentinel pattern | HTTP mapping | Use |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| `ErrNotFound` | 404 | Resource lookup miss |
|
|
144
|
+
| `ErrUnauthorized` | 401 | Missing or invalid auth |
|
|
145
|
+
| `ErrForbidden` | 403 | Valid auth, insufficient permission |
|
|
146
|
+
| `ErrConflict` | 409 | Duplicate resource |
|
|
147
|
+
| `ErrPayloadTooLarge` | 413 | File exceeds size/duration limit |
|
|
148
|
+
| `ErrInvalidFormat` | 415 | Input format validation failure |
|
|
149
|
+
| `ErrValidation` (catch-all) | 422 | Field-level validation failures |
|
|
150
|
+
|
|
151
|
+
### Mock Pattern
|
|
152
|
+
|
|
153
|
+
Hand-written mocks with settable `Func` fields. Read the mock file before writing tests — function signatures often include parameters easy to miss from the interface alone.
|
|
154
|
+
|
|
155
|
+
### Event Broadcast Pattern
|
|
156
|
+
|
|
157
|
+
Domain mutations broadcast via an event hub in service methods. For testing, use a mock event hub and assert captured events. Async events use a transactional outbox pattern.
|
|
158
|
+
|
|
159
|
+
### Idempotency Middleware
|
|
160
|
+
|
|
161
|
+
Caches responses by key + user ID. For tests, implement an in-memory repository rather than depending on the production store.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Output Expectations
|
|
166
|
+
|
|
167
|
+
- Name the references or source files that informed non-obvious decisions.
|
|
168
|
+
- Separate verified repository facts from recommendations based on general Go knowledge.
|
|
169
|
+
- Provide concrete verification commands and results.
|
|
170
|
+
- For code reviews: findings first, ordered by severity, with file references and missing-test risks.
|
|
171
|
+
- For implementation work: changed files, behavior, tests, and follow-up risks.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# API Design
|
|
2
|
+
|
|
3
|
+
## Core Principles
|
|
4
|
+
|
|
5
|
+
### 1. Contract-First, Code-Generated
|
|
6
|
+
|
|
7
|
+
Specs live in `/specs` and are the source of truth. Server handlers, typed clients, and reference docs are generated from them. Write the spec before the handler. Hand-rolled clients drift; generated clients cannot.
|
|
8
|
+
|
|
9
|
+
### 2. Explicit Versioning, Additive Evolution
|
|
10
|
+
|
|
11
|
+
Breaking changes require a new major version and a documented deprecation window. Within a major version, evolve additively: new optional fields, new endpoints, new response codes. Existing clients must never break from schema extension.
|
|
12
|
+
|
|
13
|
+
### 3. Resources, Not RPCs
|
|
14
|
+
|
|
15
|
+
HTTP endpoints model resources (`POST /entities`, `GET /entities/{id}`), not verbs (`POST /createEntity`). The resource shape forces identity, lifecycle, and composition reasoning up front. When a verb is unavoidable, name it carefully and document why a resource shape does not fit.
|
|
16
|
+
|
|
17
|
+
### 4. Idempotency by Design
|
|
18
|
+
|
|
19
|
+
Every write endpoint accepts an `Idempotency-Key` header. The server stores the key long enough to detect replays; the client is not responsible for being careful.
|
|
20
|
+
|
|
21
|
+
### 5. Pagination and Filtering Are Uniform
|
|
22
|
+
|
|
23
|
+
Every collection endpoint paginates with the same cursor shape, filters with the same query-string grammar, and returns the same `next`/`prev` link structure. Inconsistent pagination is a design smell.
|
|
24
|
+
|
|
25
|
+
### 6. Errors Are Structured and Machine-Readable
|
|
26
|
+
|
|
27
|
+
Every error response carries a stable code, a human message, and a `details` object. Clients branch on the code, not on the prose. Error codes are catalogued and never renumbered.
|
|
28
|
+
|
|
29
|
+
### 7. AI-Agent Readability Is a First-Class Concern
|
|
30
|
+
|
|
31
|
+
OpenAPI specs include rich descriptions on every field, enumerations for every finite domain, and explicit examples on every endpoint. An agent reading the spec should be able to use the API correctly without reading the handler.
|
|
32
|
+
|
|
33
|
+
### 8. Async Events Are Contracts Too
|
|
34
|
+
|
|
35
|
+
WebSocket and Pub/Sub events receive the same rigour as HTTP — AsyncAPI spec, generated client and server models, additive evolution.
|
|
36
|
+
|
|
37
|
+
## Error Envelope (RFC 9457)
|
|
38
|
+
|
|
39
|
+
All error responses follow this shape:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"status": 404,
|
|
44
|
+
"title": "Not Found",
|
|
45
|
+
"detail": "No entity with the provided id exists.",
|
|
46
|
+
"instance": "/entities/abc123"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Validation errors include a field-level `errors` array:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"status": 422,
|
|
55
|
+
"title": "Unprocessable Entity",
|
|
56
|
+
"detail": "Request body did not match the schema.",
|
|
57
|
+
"errors": [
|
|
58
|
+
{ "message": "required", "path": "body.title", "value": "" }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Common HTTP Status Codes
|
|
64
|
+
|
|
65
|
+
| Status | Title | Meaning | Action |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| 401 | Unauthorized | Missing or invalid auth token | Re-authenticate |
|
|
68
|
+
| 403 | Forbidden | Authenticated but not authorised | Confirm role. Do not retry |
|
|
69
|
+
| 404 | Not Found | Resource does not exist | Verify identifier |
|
|
70
|
+
| 422 | Unprocessable Entity | Request body did not match schema | Inspect `errors` array |
|
|
71
|
+
| 409 | Conflict | Idempotency-Key reused with different payload | Generate a fresh key |
|
|
72
|
+
| 429 | Too Many Requests | Rate limit exceeded | Back off per `Retry-After` |
|
|
73
|
+
| 504 | Gateway Timeout | Downstream dependency timed out | Retry with backoff |
|
|
74
|
+
| 500 | Internal Server Error | Unexpected server error | Retry with backoff; escalate if sustained |
|
|
75
|
+
|
|
76
|
+
## Anti-Patterns
|
|
77
|
+
|
|
78
|
+
- **Breaking changes without a version bump.** The assumption "no one uses that field" is always wrong.
|
|
79
|
+
- **Hand-written clients.** Clients drift. Generate.
|
|
80
|
+
- **Kitchen-sink endpoints.** Split large payloads into focused endpoints.
|
|
81
|
+
- **Error payloads as strings.** Structured errors, always.
|
|
82
|
+
- **Endpoint-scoped pagination conventions.** Pick one and apply universally.
|