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,167 @@
|
|
|
1
|
+
# Code Documentation
|
|
2
|
+
|
|
3
|
+
## Hierarchy
|
|
4
|
+
|
|
5
|
+
Structure documents more reliably than comments. Documentation priority:
|
|
6
|
+
|
|
7
|
+
1. **Type annotations** — `mypy`/`pyright` reject incorrect types. Zero drift risk.
|
|
8
|
+
2. **Pydantic `Field(description=...)`** — part of the code; flows into OpenAPI, Swagger UI, validation errors.
|
|
9
|
+
3. **Naming** — descriptive function and variable names. Refactor first; comment last.
|
|
10
|
+
4. **Test names** — executable documentation verified by CI.
|
|
11
|
+
5. **Docstrings** — one-line summaries for route handlers (Swagger) and complex public APIs.
|
|
12
|
+
6. **Inline "why" comments** — last resort for genuinely non-obvious decisions.
|
|
13
|
+
|
|
14
|
+
Levels 1–4 are verified by tooling. Levels 5–6 are human promises with drift risk. Minimise them.
|
|
15
|
+
|
|
16
|
+
## Pydantic as Documentation
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
from pydantic import BaseModel, Field
|
|
20
|
+
from typing import Annotated
|
|
21
|
+
|
|
22
|
+
class ItemCreate(BaseModel):
|
|
23
|
+
"""Request payload for creating a new item."""
|
|
24
|
+
|
|
25
|
+
title: Annotated[str, Field(
|
|
26
|
+
max_length=200,
|
|
27
|
+
description="Human-readable item title",
|
|
28
|
+
examples=["Sprint Planning"],
|
|
29
|
+
)]
|
|
30
|
+
owner_id: Annotated[str, Field(
|
|
31
|
+
description="UUID of the owning user",
|
|
32
|
+
pattern=r"^[0-9a-f]{8}-...$",
|
|
33
|
+
)]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Never duplicate `Field(description=...)` content in a class docstring.** One line for the model's domain role — nothing more.
|
|
37
|
+
|
|
38
|
+
## Route Handler Docstrings
|
|
39
|
+
|
|
40
|
+
One line for Swagger UI. Add a second only for non-obvious behaviour:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
@router.post("/items", status_code=201)
|
|
44
|
+
async def create_item(body: ItemCreate) -> ItemResponse:
|
|
45
|
+
"""Creates a new item. Requires `items:write` scope."""
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## What to Document
|
|
49
|
+
|
|
50
|
+
| What | How |
|
|
51
|
+
|------|-----|
|
|
52
|
+
| Pydantic fields | `Field(description=...)` |
|
|
53
|
+
| Pydantic class | One-line docstring |
|
|
54
|
+
| Route handler | One-line for Swagger |
|
|
55
|
+
| Complex public function | Minimal docstring for edge cases |
|
|
56
|
+
| Side effects | Note in docstring |
|
|
57
|
+
| Module (non-obvious name) | 1–3 line module docstring |
|
|
58
|
+
|
|
59
|
+
## What NOT to Document
|
|
60
|
+
|
|
61
|
+
- `__init__` with typed parameters — types say everything
|
|
62
|
+
- Simple functions where signature is self-evident
|
|
63
|
+
- `Args`/`Returns` sections that duplicate type hints
|
|
64
|
+
|
|
65
|
+
Document only what types cannot convey:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
def process(audio_url: str, diarize: bool = True) -> Result:
|
|
69
|
+
"""Processes audio and returns a structured result.
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
DownloadError: If the URL is unreachable.
|
|
73
|
+
ConfigError: If diarization is requested but API key is missing.
|
|
74
|
+
"""
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Inline Comments
|
|
78
|
+
|
|
79
|
+
Justified only for genuinely non-obvious "why":
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
# Batch size 16 determined via GPU memory profiling on T4 instances.
|
|
83
|
+
segments = self._model.process(data, batch_size=16)
|
|
84
|
+
|
|
85
|
+
# HACK(alice): Library returns negative start times on clips <2s.
|
|
86
|
+
# Clamp to zero until upstream fix. See lib#XXX.
|
|
87
|
+
for seg in segments:
|
|
88
|
+
seg.start = max(0.0, seg.start)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## In-Code Markers
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
# TODO(bob): Switch to streaming when SDK v4 adds support. Issue #123.
|
|
95
|
+
# FIXME(carol): Race condition on concurrent requests. Issue #456.
|
|
96
|
+
# HACK(dave): Workaround for library bug. Remove after v3.2 upgrade.
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
A marker without an issue reference will never be resolved.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
# MCP Servers in Python
|
|
104
|
+
|
|
105
|
+
## Architecture
|
|
106
|
+
|
|
107
|
+
MCP servers live in the entrypoint layer. Tools delegate to services — they contain no business logic. Docstrings and type hints are the schema.
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from fastmcp import FastMCP
|
|
111
|
+
|
|
112
|
+
mcp = FastMCP(
|
|
113
|
+
name="my-service",
|
|
114
|
+
instructions="Capabilities this server exposes.",
|
|
115
|
+
)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Tools
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
@mcp.tool()
|
|
122
|
+
async def process_item(
|
|
123
|
+
input_url: str,
|
|
124
|
+
language: str = "en",
|
|
125
|
+
) -> ProcessedResult:
|
|
126
|
+
"""
|
|
127
|
+
Process an item and return structured output.
|
|
128
|
+
|
|
129
|
+
Returns segments with labels, confidence scores, and timestamps.
|
|
130
|
+
Use when you need to convert raw input into structured data.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
input_url: URI of the input file.
|
|
134
|
+
language: BCP-47 language code.
|
|
135
|
+
"""
|
|
136
|
+
return await service.process(input_url, language=language)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**The docstring is the tool schema.** Write it for an LLM deciding whether to invoke the tool.
|
|
140
|
+
|
|
141
|
+
**Return domain types, not SDK types.** Tool return types must serialise to JSON cleanly.
|
|
142
|
+
|
|
143
|
+
## Resources
|
|
144
|
+
|
|
145
|
+
Read-only data an agent can browse for context. No inference, no side effects:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
@mcp.resource("items://{item_id}")
|
|
149
|
+
async def get_item(item_id: str) -> Item:
|
|
150
|
+
"""Retrieve a completed item by ID."""
|
|
151
|
+
return await repository.get(item_id)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Mounting on FastAPI
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
app = FastAPI(lifespan=lifespan)
|
|
158
|
+
app.mount("/mcp", mcp.get_asgi_app())
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Anti-Patterns
|
|
162
|
+
|
|
163
|
+
- **Business logic in tool body.** One line: a service call.
|
|
164
|
+
- **SDK types in signatures.** Use domain Pydantic models.
|
|
165
|
+
- **Missing docstrings.** Agents cannot select tools with vague descriptions.
|
|
166
|
+
- **`stdio` in production.** Use HTTP transport for concurrent agents.
|
|
167
|
+
- **Resources that run inference.** Resources are reads from storage.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Implementation Patterns
|
|
2
|
+
|
|
3
|
+
Concrete Python patterns for trace-first development, error handling, dependency injection, and idiomatic standards.
|
|
4
|
+
|
|
5
|
+
## 1. Trace-First Development
|
|
6
|
+
|
|
7
|
+
Every inbound request starts a trace. Every outbound call cascades it.
|
|
8
|
+
|
|
9
|
+
### Initializing a Span
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
from opentelemetry import trace
|
|
13
|
+
|
|
14
|
+
tracer = trace.get_tracer(__name__)
|
|
15
|
+
|
|
16
|
+
def process_item(item_id: str) -> None:
|
|
17
|
+
with tracer.start_as_current_span("ProcessItem") as span:
|
|
18
|
+
span.set_attribute("item.id", item_id)
|
|
19
|
+
# ... processing logic
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
When publishing to Pub/Sub or calling another service, explicitly inject the current trace context into HTTP headers or message attributes.
|
|
23
|
+
|
|
24
|
+
## 2. Error Handling
|
|
25
|
+
|
|
26
|
+
Use explicit `Exception` subclasses defined in the Domain to prevent SDK errors from polluting business logic.
|
|
27
|
+
|
|
28
|
+
### Defining Domain Exceptions
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# src/<package>/core/domain/exceptions.py
|
|
32
|
+
|
|
33
|
+
class AppError(Exception):
|
|
34
|
+
"""Base exception for all application errors."""
|
|
35
|
+
def __init__(self, message: str, cause: Exception | None = None):
|
|
36
|
+
super().__init__(message)
|
|
37
|
+
self.cause = cause
|
|
38
|
+
|
|
39
|
+
class ModelInferenceError(AppError):
|
|
40
|
+
"""Raised when an AI model fails to return a valid response."""
|
|
41
|
+
|
|
42
|
+
class TransientInferenceError(AppError):
|
|
43
|
+
"""Raised on transient provider failures — eligible for retry."""
|
|
44
|
+
|
|
45
|
+
class PermanentInferenceError(AppError):
|
|
46
|
+
"""Raised on permanent failures — do not retry."""
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Wrapping Errors in Adapters
|
|
50
|
+
|
|
51
|
+
Adapters catch library-specific errors and raise Domain exceptions:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
# src/<package>/adapters/external_api.py
|
|
55
|
+
class ExternalAPIClient:
|
|
56
|
+
def process(self, payload: str) -> Result:
|
|
57
|
+
try:
|
|
58
|
+
raw = self._client.call(payload)
|
|
59
|
+
if raw.error:
|
|
60
|
+
raise ModelInferenceError(f"upstream call failed: {raw.error}")
|
|
61
|
+
return self._to_domain(raw)
|
|
62
|
+
except sdk.ServerError as e:
|
|
63
|
+
raise TransientInferenceError("Provider unavailable", cause=e)
|
|
64
|
+
except sdk.BadRequestError as e:
|
|
65
|
+
raise PermanentInferenceError("Invalid payload", cause=e)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 3. Dependency Injection
|
|
69
|
+
|
|
70
|
+
### The Port
|
|
71
|
+
|
|
72
|
+
The Protocol belongs in `src/<package>/core/ports.py` (or its own `src/<package>/core/<capability>.py` module) and uses only Domain language:
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from typing import Protocol
|
|
76
|
+
from <package>.core.domain.models import Result
|
|
77
|
+
|
|
78
|
+
class Processor(Protocol):
|
|
79
|
+
def process(self, input_uri: str) -> Result: ...
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### The Wiring (Composition Root)
|
|
83
|
+
|
|
84
|
+
Constructor injection at the entrypoint startup:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from fastapi import Depends
|
|
88
|
+
from <package>.adapters.processor import ConcreteProcessor
|
|
89
|
+
|
|
90
|
+
def get_processor() -> Processor:
|
|
91
|
+
return ConcreteProcessor()
|
|
92
|
+
|
|
93
|
+
def get_processing_service(
|
|
94
|
+
processor: Processor = Depends(get_processor)
|
|
95
|
+
) -> ProcessingService:
|
|
96
|
+
return ProcessingService(processor=processor)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The dependency is typed as the Protocol port, not the concrete adapter — the seam stays on the port, and tests override `get_processor` without touching the service.
|
|
100
|
+
|
|
101
|
+
## 4. Strict Typing over Duck Typing
|
|
102
|
+
|
|
103
|
+
Use `typing.Protocol` and strict type hints on all domain models. Dependency inversion is compile-time verifiable via `mypy`/`pyright`:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from typing import Protocol
|
|
107
|
+
from dataclasses import dataclass
|
|
108
|
+
|
|
109
|
+
@dataclass(frozen=True)
|
|
110
|
+
class ProcessingRequest:
|
|
111
|
+
input_url: str
|
|
112
|
+
language: str
|
|
113
|
+
|
|
114
|
+
class Processor(Protocol):
|
|
115
|
+
def process(self, request: ProcessingRequest) -> str: ...
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 5. Context Managers for Resource Lifecycle
|
|
119
|
+
|
|
120
|
+
Always use `with` and `@contextmanager` for stateful resources. Guarantees cleanup even when domain logic crashes:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
from contextlib import contextmanager
|
|
124
|
+
import tempfile, os
|
|
125
|
+
|
|
126
|
+
@contextmanager
|
|
127
|
+
def temporary_file(data: bytes, suffix: str = ".tmp"):
|
|
128
|
+
"""Ensures ephemeral files are always deleted after processing."""
|
|
129
|
+
fd, path = tempfile.mkstemp(suffix=suffix)
|
|
130
|
+
try:
|
|
131
|
+
with os.fdopen(fd, "wb") as f:
|
|
132
|
+
f.write(data)
|
|
133
|
+
yield path
|
|
134
|
+
finally:
|
|
135
|
+
if os.path.exists(path):
|
|
136
|
+
os.remove(path)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## 6. Configuration Validation
|
|
140
|
+
|
|
141
|
+
Validate all environment variables at startup using `pydantic-settings`. Do not use `os.environ.get()` scattered throughout the codebase.
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
145
|
+
from pydantic import Field
|
|
146
|
+
|
|
147
|
+
class AppSettings(BaseSettings):
|
|
148
|
+
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")
|
|
149
|
+
|
|
150
|
+
environment: str = Field(default="production", pattern="^(development|staging|production)$")
|
|
151
|
+
database_url: str = Field(..., description="Postgres connection string")
|
|
152
|
+
api_key: str = Field(..., min_length=16)
|
|
153
|
+
|
|
154
|
+
# Initialised once at the composition root
|
|
155
|
+
settings = AppSettings()
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This ensures missing or invalid configuration crashes the service immediately at boot, rather than during a request.
|
|
159
|
+
|
|
160
|
+
## 7. Idiomatic Standards
|
|
161
|
+
|
|
162
|
+
- **PEP 8** for fundamental syntax.
|
|
163
|
+
- **Google Python Style Guide** for enterprise structure and docstrings.
|
|
164
|
+
- **`mypy --strict`** in CI for type safety.
|
|
165
|
+
- **`ruff`** for fast linting and formatting.
|
|
166
|
+
- **`uv`** for dependency management — no `pip`, `poetry`, or `pipenv`.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# ML Pipelines
|
|
2
|
+
|
|
3
|
+
## The Pipeline Contract
|
|
4
|
+
|
|
5
|
+
Every ML pipeline step follows the same structure:
|
|
6
|
+
|
|
7
|
+
1. **Receive a typed domain input** — no SDK types, no raw dicts
|
|
8
|
+
2. **Call a provider** through the port the core owns
|
|
9
|
+
3. **Validate the output** — confidence, shape, required fields — before it crosses the boundary
|
|
10
|
+
4. **Return a typed domain output** safe for downstream consumption
|
|
11
|
+
|
|
12
|
+
No step owns both inference and persistence. No step reaches into another step's domain. This composability makes each step independently testable and replaceable.
|
|
13
|
+
|
|
14
|
+
## Data Contracts
|
|
15
|
+
|
|
16
|
+
Domain models at pipeline boundaries use Pydantic with strict validation:
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
from pydantic import BaseModel, Field
|
|
20
|
+
|
|
21
|
+
class Segment(BaseModel):
|
|
22
|
+
id: int
|
|
23
|
+
speaker: str
|
|
24
|
+
start: float # seconds — never string formats at domain boundaries
|
|
25
|
+
end: float
|
|
26
|
+
text: str
|
|
27
|
+
confidence: float = Field(ge=0.0, le=1.0)
|
|
28
|
+
|
|
29
|
+
class ProcessedOutput(BaseModel):
|
|
30
|
+
segments: list[Segment]
|
|
31
|
+
metadata: OutputMetadata
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Confidence Validation
|
|
35
|
+
|
|
36
|
+
Filter low-confidence results before they enter domain logic. The threshold is configuration, not a literal:
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
def validate_segments(
|
|
40
|
+
segments: list[Segment],
|
|
41
|
+
threshold: float,
|
|
42
|
+
) -> list[Segment]:
|
|
43
|
+
valid = [s for s in segments if s.confidence >= threshold]
|
|
44
|
+
if len(valid) < len(segments):
|
|
45
|
+
logger.warning(
|
|
46
|
+
"low_confidence_segments_filtered",
|
|
47
|
+
total=len(segments),
|
|
48
|
+
filtered=len(segments) - len(valid),
|
|
49
|
+
)
|
|
50
|
+
return valid
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Mapping at the Edge
|
|
54
|
+
|
|
55
|
+
Adapters map SDK responses to domain types at the boundary. Core logic never imports any external SDK:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
# src/<package>/adapters/external_api.py
|
|
59
|
+
class ExternalAPIClient:
|
|
60
|
+
async def process(self, input_uri: str) -> ProcessedOutput:
|
|
61
|
+
raw = await self._client.process(input_uri)
|
|
62
|
+
return self._to_domain(raw)
|
|
63
|
+
|
|
64
|
+
def _to_domain(self, raw) -> ProcessedOutput:
|
|
65
|
+
return ProcessedOutput(
|
|
66
|
+
segments=[
|
|
67
|
+
Segment(id=i, speaker=u.speaker or "unknown", ...)
|
|
68
|
+
for i, u in enumerate(raw.items or [])
|
|
69
|
+
],
|
|
70
|
+
metadata=OutputMetadata(...),
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Embedding Pipeline
|
|
75
|
+
|
|
76
|
+
### Batching
|
|
77
|
+
Never embed one item at a time. Batch requests reduce API cost and latency 10–100×.
|
|
78
|
+
|
|
79
|
+
### Versioning
|
|
80
|
+
Store model name and version alongside every vector. Queries against stale embeddings produce incorrect results. Validate dimensions at the boundary.
|
|
81
|
+
|
|
82
|
+
### Caching
|
|
83
|
+
Cache on text content + model name + model version. Embedding the same input twice is pure cost with no benefit.
|
|
84
|
+
|
|
85
|
+
## RAG Pipeline
|
|
86
|
+
|
|
87
|
+
Three composable, independently testable steps:
|
|
88
|
+
|
|
89
|
+
1. **Retrieve** — embed query, search vector store for top-k candidates
|
|
90
|
+
2. **Rerank** — score candidates for relevance, discard below threshold
|
|
91
|
+
3. **Generate** — pass reranked context to LLM with a version-controlled prompt
|
|
92
|
+
|
|
93
|
+
**Prompts are code.** Prompts live in version control as Python constants, go through PR review, and are covered by eval suites. A prompt edited outside version control is an untested code change.
|
|
94
|
+
|
|
95
|
+
## Streaming Pipeline
|
|
96
|
+
|
|
97
|
+
Use semantic endpointing: buffer until a natural speech boundary (pause, sentence end), then process the completed chunk. Fixed-duration chunking splits mid-word and produces incoherent outputs.
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
class SemanticEndpointer:
|
|
101
|
+
MIN_CHUNK_DURATION_S = 3.0
|
|
102
|
+
MIN_SILENCE_MS = 500
|
|
103
|
+
|
|
104
|
+
def should_process(self, buffer: AudioBuffer) -> bool:
|
|
105
|
+
if buffer.duration < self.MIN_CHUNK_DURATION_S:
|
|
106
|
+
return False
|
|
107
|
+
if buffer.silence_since_ms < self.MIN_SILENCE_MS:
|
|
108
|
+
return False
|
|
109
|
+
return True
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Anti-Patterns
|
|
113
|
+
|
|
114
|
+
- **Raw SDK responses in domain logic.** Map at the adapter boundary.
|
|
115
|
+
- **Hardcoded thresholds.** Confidence scores belong in configuration.
|
|
116
|
+
- **Embedding one at a time.** Always batch.
|
|
117
|
+
- **Embedding without versioning.** Unqueryable after model change.
|
|
118
|
+
- **Prompts in runtime config.** Unreviewed, untested code changes.
|
|
119
|
+
- **Time-based audio chunking.** Semantic endpointing produces coherent chunks.
|
package/src/engineer-skills/groundwork-python-engineer/references/ml-systems-ai-engineering.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# ML Systems
|
|
2
|
+
|
|
3
|
+
Python ML services are services first. They meet the same bars for reliability, observability, and maintainability as any other backend. What makes ML different is _what_ we test (model behaviour), not _whether_ we test.
|
|
4
|
+
|
|
5
|
+
## Principles
|
|
6
|
+
|
|
7
|
+
### 1. FastAPI for HTTP, Uvicorn for Serving, `uv` for Everything Else
|
|
8
|
+
One combination, applied everywhere. The Python ecosystem has a hundred alternatives — pick one and stick.
|
|
9
|
+
|
|
10
|
+
### 2. A Pure Core, Swappable Edges from the Outset
|
|
11
|
+
Explicit `core/domain`, `core/ports.py`, `core/service`, `adapters/`, and `entrypoints/` packages under `src/<package>/` (src-layout), with the inward-dependency rule enforced by `import-linter` in CI. Model clients, storage, and the FastAPI router are all adapters. The core has no model-library imports.
|
|
12
|
+
|
|
13
|
+
### 3. Model Calls Are External Integrations
|
|
14
|
+
Every model call is wrapped behind a port the core owns, implemented by an adapter with timeouts, retries with jitter, circuit breaking, and rate-limit respect. The core never knows which provider is behind the port. Swapping providers is an adapter change.
|
|
15
|
+
|
|
16
|
+
### 4. Evals Are Part of the Test Suite
|
|
17
|
+
Eval sets for every significant model-driven behaviour. Run in CI. Numeric scores with committed thresholds. Regressions block merge. "The model got a little worse" is not an acceptable landing state.
|
|
18
|
+
|
|
19
|
+
### 5. Prompts Are Code, Not Configuration
|
|
20
|
+
Prompts live in version control, are reviewed, are tested, and are versioned. Not in a runtime config that someone can edit by accident.
|
|
21
|
+
|
|
22
|
+
### 6. Observability Spans Both Sides of the Model Call
|
|
23
|
+
Every model call emits a trace span with input hash, prompt version, model ID, latency, token counts, and cost.
|
|
24
|
+
|
|
25
|
+
### 7. Caching and Determinism Are Explicit
|
|
26
|
+
Cache when input + prompt version + model are identical. Temperature and seed set explicitly per use case.
|
|
27
|
+
|
|
28
|
+
### 8. Stateful Containers for Model Serving
|
|
29
|
+
Unlike stateless API services, ML services load models into memory at startup and keep them warm. Cold-starting a large model per request is not viable.
|
|
30
|
+
|
|
31
|
+
## Anti-Patterns
|
|
32
|
+
|
|
33
|
+
- **Model library imports in the domain.** If the domain imports `openai` or `torch`, it is broken.
|
|
34
|
+
- **Prompts in runtime config.** Untracked, unreviewed, untested.
|
|
35
|
+
- **"It is ML, testing is different."** The tests just include evals.
|
|
36
|
+
- **Uncached expensive calls.** Every stable call paid for twice is a bug.
|
|
37
|
+
- **Model outputs trusted blindly.** Validate shape, length, content at the boundary.
|
|
38
|
+
- **Synchronous long model calls on the request path.** Queue to worker, return job handle.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# AI Engineering
|
|
43
|
+
|
|
44
|
+
## Principles
|
|
45
|
+
|
|
46
|
+
1. **Prompts are code.** Version-controlled, reviewed, tested, versioned. Shipped through PR review.
|
|
47
|
+
2. **Evals are tests.** Scored comparisons in CI. Thresholds committed. Regressions block merge.
|
|
48
|
+
3. **Context is the interface.** The context window is the biggest lever on model behaviour. Design it deliberately. Measure its token budget.
|
|
49
|
+
4. **Retrieval matters more than the model.** Good retrieval + boring model > clever model + bad retrieval.
|
|
50
|
+
5. **Model outputs are validated at the boundary.** Shape, length, content, expected enumerations. Parse failures handled explicitly.
|
|
51
|
+
6. **Agents are distributed systems.** Bounded retries, circuit breakers, auditable history.
|
|
52
|
+
7. **Cost is part of evaluation.** Quality, latency, _and_ cost.
|
|
53
|
+
8. **Human oversight is designed in.** Review points for high-stakes outputs.
|
|
54
|
+
|
|
55
|
+
## Anti-Patterns
|
|
56
|
+
|
|
57
|
+
- "The model will figure it out." Over-stuffed context windows.
|
|
58
|
+
- Skipping evals "this once." Agent loops without termination.
|
|
59
|
+
- Deterministic reasoning on probabilistic output — use structured schemas.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
# Agent-Native Systems
|
|
64
|
+
|
|
65
|
+
## Principles
|
|
66
|
+
|
|
67
|
+
1. **Every interface has a machine-consumable spec.** OpenAPI, AsyncAPI, `llms.txt`, MCP schemas.
|
|
68
|
+
2. **Specs include descriptions, examples, constraints.** An agent should use the interface without reading implementation.
|
|
69
|
+
3. **MCP is the standard tool surface.** Typed, documented, error-reporting tools.
|
|
70
|
+
4. **`llms.txt` ships alongside docs.** Plain-text channel for agent navigation.
|
|
71
|
+
5. **Errors are structured, stable, actionable.** Agents branch on codes, not prose.
|
|
72
|
+
6. **Idempotency enables retry.** Every write endpoint accepts an idempotency key.
|
|
73
|
+
7. **Outputs are structured.** Schema-constrained generation over free-text-then-parse.
|
|
74
|
+
8. **Documentation reviewed for agent consumption.** Would an agent reading through MCP understand what to do?
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Observability
|
|
2
|
+
|
|
3
|
+
## Core Principles
|
|
4
|
+
|
|
5
|
+
### 1. OpenTelemetry Is the Common Language
|
|
6
|
+
Every service emits traces, metrics, and logs through OpenTelemetry SDKs to a single collector. Vendor lock-in at the collector boundary, not inside application code.
|
|
7
|
+
|
|
8
|
+
### 2. Traces Are the Primary Signal
|
|
9
|
+
Given a choice between adding a metric or enriching a trace, enrich the trace. Traces preserve causality; metrics aggregate it away.
|
|
10
|
+
|
|
11
|
+
### 3. The Three Pillars Are One Pillar
|
|
12
|
+
Logs, metrics, and traces are different projections of the same events. A log line includes its trace ID; a metric includes dimensions to pivot back to traces.
|
|
13
|
+
|
|
14
|
+
### 4. Dashboards Derive from SLOs
|
|
15
|
+
Every dashboard starts with the user-journey SLO it supports. Dashboards derived from SLOs stay useful; dashboards assembled by adding "interesting-looking" graphs drift.
|
|
16
|
+
|
|
17
|
+
### 5. Trace-Driven Development
|
|
18
|
+
Sketch the trace a new feature should produce _before_ writing the handler. What spans must exist? What attributes? The instrumentation design shapes the code.
|
|
19
|
+
|
|
20
|
+
### 6. Assert on Telemetry in Tests
|
|
21
|
+
System tests assert that traces are unbroken end-to-end — a missing span is a test failure.
|
|
22
|
+
|
|
23
|
+
### 7. Logs Are Structured, Sampled, and Contextual
|
|
24
|
+
Every log line is structured (JSON), carries its trace ID, and is emitted at an agreed severity. Sample aggressively at debug/info; do not sample errors.
|
|
25
|
+
|
|
26
|
+
### 8. Cardinality Is a Design Choice
|
|
27
|
+
High-cardinality on traces (per-user, per-tenant), lower cardinality on metrics.
|
|
28
|
+
|
|
29
|
+
## Python Implementation
|
|
30
|
+
|
|
31
|
+
- Use `structlog` for structured logging. Inject `trace_id` and `span_id` from the current OTel context.
|
|
32
|
+
- Every route handler and background task initialises a root span.
|
|
33
|
+
- Adapter calls (API, database, Pub/Sub) extract and cascade the span.
|
|
34
|
+
- ML model calls emit spans with: input hash, prompt version, model ID, latency, token counts, cost.
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from opentelemetry import trace
|
|
38
|
+
|
|
39
|
+
tracer = trace.get_tracer(__name__)
|
|
40
|
+
|
|
41
|
+
async def process(self, input_uri: str) -> Result:
|
|
42
|
+
with tracer.start_as_current_span("Process") as span:
|
|
43
|
+
span.set_attribute("input.uri", input_uri)
|
|
44
|
+
span.set_attribute("model.id", self._model_id)
|
|
45
|
+
result = await self._call_model(input_uri)
|
|
46
|
+
span.set_attribute("model.tokens", result.usage.total)
|
|
47
|
+
return result
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Anti-Patterns
|
|
51
|
+
|
|
52
|
+
- **Pillar-at-a-time adoption.** "We'll add metrics now, traces later."
|
|
53
|
+
- **Vendor SDKs in application code.** Application code imports OTel; the collector talks to the vendor.
|
|
54
|
+
- **Dashboards without SLOs.** Charts without a question they answer.
|
|
55
|
+
- **`print` debugging.** Write a test; add a span.
|
|
56
|
+
- **Cardinality explosions.** UUIDs in Prometheus labels.
|
|
57
|
+
- **Model calls without spans.** An uninstrumented model call is a black box.
|