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,368 @@
|
|
|
1
|
+
# Type System & Schemas
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
- [Zod as the Contract](#zod-as-the-contract)
|
|
5
|
+
- [Schema Organisation](#schema-organisation)
|
|
6
|
+
- [Deriving Types](#deriving-types)
|
|
7
|
+
- [Discriminated Unions](#discriminated-unions)
|
|
8
|
+
- [Exhaustive Matching](#exhaustive-matching)
|
|
9
|
+
- [The Result Pattern](#the-result-pattern)
|
|
10
|
+
- [RSC Serialisation Boundary](#rsc-serialisation-boundary)
|
|
11
|
+
- [Type Guards over any](#type-guards-over-any)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Zod as the Contract
|
|
16
|
+
|
|
17
|
+
Zod schemas are the single source of truth for all data shapes in the codebase. They serve as the type contract between the Go backend API and the React frontend. Every API response is validated against a Zod schema, and all TypeScript types for API data are derived from those schemas.
|
|
18
|
+
|
|
19
|
+
Standalone TypeScript interfaces for API data are forbidden — they drift from reality. Zod schemas enforce runtime validation and compile-time types simultaneously.
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
// lib/schemas/meeting.ts
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
export const meetingSchema = z.object({
|
|
26
|
+
id: z.string().uuid(),
|
|
27
|
+
title: z.string().min(1),
|
|
28
|
+
status: z.enum(['scheduled', 'in_progress', 'completed', 'cancelled']),
|
|
29
|
+
host_id: z.string().uuid(),
|
|
30
|
+
starts_at: z.string().datetime(),
|
|
31
|
+
duration_minutes: z.number().int().positive(),
|
|
32
|
+
created_at: z.string().datetime(),
|
|
33
|
+
updated_at: z.string().datetime(),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export type Meeting = z.infer<typeof meetingSchema>;
|
|
37
|
+
|
|
38
|
+
export const meetingListSchema = z.object({
|
|
39
|
+
data: z.array(meetingSchema),
|
|
40
|
+
pagination: z.object({
|
|
41
|
+
next_cursor: z.string().nullable(),
|
|
42
|
+
has_more: z.boolean(),
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export type MeetingList = z.infer<typeof meetingListSchema>;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Why Zod over Interfaces
|
|
50
|
+
|
|
51
|
+
- **Runtime validation** — API responses are parsed, not assumed. If the backend changes a field name or type, the schema catches it immediately instead of producing silent runtime bugs.
|
|
52
|
+
- **Single definition** — The schema defines shape, constraints, and TypeScript type in one place.
|
|
53
|
+
- **Form integration** — Zod schemas plug directly into `react-hook-form` via `@hookform/resolvers/zod` for validation.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Schema Organisation
|
|
58
|
+
|
|
59
|
+
All schemas live in `lib/schemas/` with zero internal application dependencies. A schema file must never import from hooks, components, contexts, or the API client.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
lib/schemas/
|
|
63
|
+
├── meeting.ts # Meeting entity schemas
|
|
64
|
+
├── meeting-synthesis.ts # Synthesis-related schemas
|
|
65
|
+
├── user.ts # User entity schemas
|
|
66
|
+
├── common.ts # Shared schemas (pagination, error responses)
|
|
67
|
+
└── index.ts # Barrel export
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Each file exports:
|
|
71
|
+
1. The Zod schema object (`meetingSchema`)
|
|
72
|
+
2. The inferred TypeScript type (`Meeting`)
|
|
73
|
+
3. Any sub-schemas needed for forms or partial updates
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
// lib/schemas/index.ts
|
|
77
|
+
export { meetingSchema, type Meeting, meetingListSchema, type MeetingList } from './meeting';
|
|
78
|
+
export { userSchema, type User } from './user';
|
|
79
|
+
export { paginationSchema, type Pagination } from './common';
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Deriving Types
|
|
85
|
+
|
|
86
|
+
Always derive types from schemas using `z.infer`. Never write parallel TypeScript interfaces.
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
// Correct — type derived from schema
|
|
90
|
+
export const meetingSchema = z.object({ /* ... */ });
|
|
91
|
+
export type Meeting = z.infer<typeof meetingSchema>;
|
|
92
|
+
|
|
93
|
+
// Incorrect — standalone interface duplicates the schema and will drift
|
|
94
|
+
export interface Meeting {
|
|
95
|
+
id: string;
|
|
96
|
+
title: string;
|
|
97
|
+
// This will get out of sync with the schema
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Partial and Pick Types
|
|
102
|
+
|
|
103
|
+
Derive form-specific types from the base schema:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
// Schema for creating a meeting (subset of fields)
|
|
107
|
+
export const createMeetingSchema = meetingSchema.pick({
|
|
108
|
+
title: true,
|
|
109
|
+
starts_at: true,
|
|
110
|
+
duration_minutes: true,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
export type CreateMeetingInput = z.infer<typeof createMeetingSchema>;
|
|
114
|
+
|
|
115
|
+
// Schema for updating a meeting (all fields optional)
|
|
116
|
+
export const updateMeetingSchema = meetingSchema.partial().omit({
|
|
117
|
+
id: true,
|
|
118
|
+
created_at: true,
|
|
119
|
+
updated_at: true,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
export type UpdateMeetingInput = z.infer<typeof updateMeetingSchema>;
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Discriminated Unions
|
|
128
|
+
|
|
129
|
+
Use discriminated unions to model states that are mutually exclusive. This prevents impossible states at the type level — the compiler enforces that only valid combinations of fields are accessed.
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
// Correct — discriminated union makes invalid states impossible
|
|
133
|
+
const meetingInputSchema = z.discriminatedUnion('type', [
|
|
134
|
+
z.object({
|
|
135
|
+
type: z.literal('recording'),
|
|
136
|
+
recording_url: z.string().url(),
|
|
137
|
+
device_id: z.string(),
|
|
138
|
+
}),
|
|
139
|
+
z.object({
|
|
140
|
+
type: z.literal('upload'),
|
|
141
|
+
file_path: z.string(),
|
|
142
|
+
file_size: z.number().positive(),
|
|
143
|
+
}),
|
|
144
|
+
]);
|
|
145
|
+
|
|
146
|
+
type MeetingInput = z.infer<typeof meetingInputSchema>;
|
|
147
|
+
|
|
148
|
+
// Usage — the compiler knows which fields exist based on type
|
|
149
|
+
function processMeetingInput(input: MeetingInput) {
|
|
150
|
+
switch (input.type) {
|
|
151
|
+
case 'recording':
|
|
152
|
+
// TypeScript knows recording_url and device_id exist here
|
|
153
|
+
startRecording(input.recording_url, input.device_id);
|
|
154
|
+
break;
|
|
155
|
+
case 'upload':
|
|
156
|
+
// TypeScript knows file_path and file_size exist here
|
|
157
|
+
uploadFile(input.file_path, input.file_size);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
// Incorrect — loose optional fields allow impossible states
|
|
165
|
+
const meetingInputSchema = z.object({
|
|
166
|
+
type: z.enum(['recording', 'upload']),
|
|
167
|
+
recording_url: z.string().url().optional(), // When is this present?
|
|
168
|
+
device_id: z.string().optional(), // What if type is 'upload'?
|
|
169
|
+
file_path: z.string().optional(), // What if type is 'recording'?
|
|
170
|
+
file_size: z.number().positive().optional(),
|
|
171
|
+
});
|
|
172
|
+
// Nothing prevents { type: 'recording', file_path: '/foo' }
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Exhaustive Matching
|
|
178
|
+
|
|
179
|
+
Always enforce exhaustive matching on discriminated unions using `default: never`. This catches unhandled cases at compile time when new variants are added.
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
type MeetingStatus = Meeting['status']; // 'scheduled' | 'in_progress' | 'completed' | 'cancelled'
|
|
183
|
+
|
|
184
|
+
function getStatusLabel(status: MeetingStatus): string {
|
|
185
|
+
switch (status) {
|
|
186
|
+
case 'scheduled':
|
|
187
|
+
return 'Upcoming';
|
|
188
|
+
case 'in_progress':
|
|
189
|
+
return 'Live';
|
|
190
|
+
case 'completed':
|
|
191
|
+
return 'Done';
|
|
192
|
+
case 'cancelled':
|
|
193
|
+
return 'Cancelled';
|
|
194
|
+
default: {
|
|
195
|
+
// If a new status is added to the enum, this line produces a compile error
|
|
196
|
+
const _exhaustive: never = status;
|
|
197
|
+
return _exhaustive;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
When a fifth status (e.g., `'archived'`) is added to the schema, the compiler flags every switch statement that doesn't handle it.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## The Result Pattern
|
|
208
|
+
|
|
209
|
+
All Server Actions return a strictly typed `ActionResult<T>` to prevent unhandled client-side crashes from failed mutations. A Server Action must never throw — it always returns a result.
|
|
210
|
+
|
|
211
|
+
### Type Definition
|
|
212
|
+
|
|
213
|
+
```tsx
|
|
214
|
+
// lib/schemas/common.ts
|
|
215
|
+
type ActionResult<T> =
|
|
216
|
+
| { data: T; error: null }
|
|
217
|
+
| { data: null; error: string };
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Server Action Implementation
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
// app/actions/meeting-actions.ts
|
|
224
|
+
'use server';
|
|
225
|
+
|
|
226
|
+
import { createMeetingSchema, type Meeting } from '@/lib/schemas';
|
|
227
|
+
import { createMeeting } from '@/lib/api';
|
|
228
|
+
import { revalidatePath } from 'next/cache';
|
|
229
|
+
|
|
230
|
+
export async function createMeetingAction(
|
|
231
|
+
formData: FormData
|
|
232
|
+
): Promise<ActionResult<Meeting>> {
|
|
233
|
+
const parsed = createMeetingSchema.safeParse({
|
|
234
|
+
title: formData.get('title'),
|
|
235
|
+
starts_at: formData.get('starts_at'),
|
|
236
|
+
duration_minutes: Number(formData.get('duration_minutes')),
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
if (!parsed.success) {
|
|
240
|
+
return { data: null, error: parsed.error.issues[0].message };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
try {
|
|
244
|
+
const meeting = await createMeeting(parsed.data);
|
|
245
|
+
revalidatePath('/meetings');
|
|
246
|
+
return { data: meeting, error: null };
|
|
247
|
+
} catch {
|
|
248
|
+
return { data: null, error: 'Failed to create meeting. Please try again.' };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Client Consumption
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
'use client';
|
|
257
|
+
|
|
258
|
+
import { createMeetingAction } from '@/app/actions/meeting-actions';
|
|
259
|
+
import { useTransition } from 'react';
|
|
260
|
+
|
|
261
|
+
function CreateMeetingButton() {
|
|
262
|
+
const [isPending, startTransition] = useTransition();
|
|
263
|
+
|
|
264
|
+
async function handleSubmit(formData: FormData) {
|
|
265
|
+
startTransition(async () => {
|
|
266
|
+
const result = await createMeetingAction(formData);
|
|
267
|
+
if (result.error) {
|
|
268
|
+
// Show error in UI — never an unhandled throw
|
|
269
|
+
toast.error(result.error);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Successfully created
|
|
273
|
+
toast.success(`Created: ${result.data.title}`);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return (
|
|
278
|
+
<form action={handleSubmit}>
|
|
279
|
+
{/* form fields */}
|
|
280
|
+
<button type="submit" disabled={isPending}>
|
|
281
|
+
{isPending ? 'Creating…' : 'Create Meeting'}
|
|
282
|
+
</button>
|
|
283
|
+
</form>
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## RSC Serialisation Boundary
|
|
291
|
+
|
|
292
|
+
When a Server Component passes props to a Client Component, those props must be JSON-serialisable. React serialises them across the server-client boundary, and non-serialisable values either silently corrupt or crash.
|
|
293
|
+
|
|
294
|
+
### What Can Cross the Boundary
|
|
295
|
+
|
|
296
|
+
| Type | Serialisable? | Notes |
|
|
297
|
+
|------|-------------|-------|
|
|
298
|
+
| `string`, `number`, `boolean` | Yes | |
|
|
299
|
+
| `null`, `undefined` | Yes | |
|
|
300
|
+
| Plain objects and arrays | Yes | No class instances |
|
|
301
|
+
| Server Actions (`'use server'`) | Yes | The only exception for functions |
|
|
302
|
+
| `Date` | **No** | Silently becomes a string — `.getFullYear()` crashes on the client |
|
|
303
|
+
| `Map`, `Set` | **No** | Silently stripped |
|
|
304
|
+
| Functions (non-Server Action) | **No** | Cannot be serialised |
|
|
305
|
+
| Class instances | **No** | Methods are stripped |
|
|
306
|
+
| `Symbol` | **No** | Unless globally registered |
|
|
307
|
+
|
|
308
|
+
### Fixing Non-Serialisable Props
|
|
309
|
+
|
|
310
|
+
```tsx
|
|
311
|
+
// Bad — Date object silently becomes string, then crashes
|
|
312
|
+
export default async function Page() {
|
|
313
|
+
const meeting = await getMeeting(id);
|
|
314
|
+
return <MeetingCard createdAt={meeting.created_at} />; // Date object
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Good — serialise to ISO string on the server
|
|
318
|
+
export default async function Page() {
|
|
319
|
+
const meeting = await getMeeting(id);
|
|
320
|
+
return <MeetingCard createdAt={meeting.created_at.toISOString()} />;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Bad — Map cannot be serialised
|
|
324
|
+
<ClientComponent items={new Map([['a', 1]])} />
|
|
325
|
+
|
|
326
|
+
// Good — convert to plain object
|
|
327
|
+
<ClientComponent items={Object.fromEntries(map)} />
|
|
328
|
+
|
|
329
|
+
// Bad — function prop (not a Server Action)
|
|
330
|
+
export default function Page() {
|
|
331
|
+
const handleClick = () => console.log('clicked');
|
|
332
|
+
return <ClientButton onClick={handleClick} />; // Cannot serialise
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Good — define the function inside the client component
|
|
336
|
+
'use client';
|
|
337
|
+
export function ClientButton() {
|
|
338
|
+
const handleClick = () => console.log('clicked');
|
|
339
|
+
return <button onClick={handleClick}>Click</button>;
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Type Guards over any
|
|
346
|
+
|
|
347
|
+
The `any` type is forbidden. When dealing with unknown data (external APIs, dynamic content, user input), use `unknown` and narrow the type using type guards or Zod parsing.
|
|
348
|
+
|
|
349
|
+
```tsx
|
|
350
|
+
// Bad — any bypasses all type checking
|
|
351
|
+
function processResponse(data: any) {
|
|
352
|
+
return data.meetings[0].title; // No type safety — runtime explosion
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Good — unknown + Zod parsing
|
|
356
|
+
function processResponse(data: unknown) {
|
|
357
|
+
const parsed = meetingListSchema.safeParse(data);
|
|
358
|
+
if (!parsed.success) {
|
|
359
|
+
throw new Error(`Invalid API response: ${parsed.error.message}`);
|
|
360
|
+
}
|
|
361
|
+
return parsed.data.data[0].title; // Fully typed
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Good — type guard for narrowing
|
|
365
|
+
function isMeeting(value: unknown): value is Meeting {
|
|
366
|
+
return meetingSchema.safeParse(value).success;
|
|
367
|
+
}
|
|
368
|
+
```
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# UX Principles
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
- [Speed & Interaction](#speed--interaction)
|
|
5
|
+
- [Navigation & Control](#navigation--control)
|
|
6
|
+
- [Information Architecture](#information-architecture)
|
|
7
|
+
- [Feedback & Motion](#feedback--motion)
|
|
8
|
+
- [Accessibility](#accessibility)
|
|
9
|
+
- [Empty States & Onboarding](#empty-states--onboarding)
|
|
10
|
+
- [Copy & Tone](#copy--tone)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Speed & Interaction
|
|
15
|
+
|
|
16
|
+
The UI must feel zero-latency for common actions. Speed is not a feature — it is the foundation of trust.
|
|
17
|
+
|
|
18
|
+
### Principles
|
|
19
|
+
|
|
20
|
+
- **Focus inputs immediately** — When a form or dialog opens, the primary input field must be focused without the user touching the mouse. Use `autoFocus` or `useRef` + `useEffect`.
|
|
21
|
+
- **Inline editing** — Treat "viewing" and "editing" as the same action. Clicking a text element activates an in-place input. No separate "edit" screens, no confirmation dialogs for routine edits.
|
|
22
|
+
- **Optimistic UI** — Update the interface immediately when the user acts. Show the intended result while the server confirms. Revert only on failure. See `references/data-fetching.md` for the SWR `mutate()` pattern.
|
|
23
|
+
- **Instant resets** — After a successful form submission, clear all fields immediately so the user can submit the next entry without reaching for a mouse or navigating.
|
|
24
|
+
|
|
25
|
+
### Anti-patterns
|
|
26
|
+
|
|
27
|
+
| Don't | Why | Do Instead |
|
|
28
|
+
|-------|-----|-----------|
|
|
29
|
+
| Separate "view" and "edit" screens | Forces navigation for simple edits | Inline editing — click to edit in place |
|
|
30
|
+
| Full-page loading spinner for submissions | Blocks the entire UI for a single operation | Optimistic update + subtle loading indicator on the action element |
|
|
31
|
+
| "Are you sure?" confirmation dialogs for reversible actions | Interrupts flow unnecessarily | Allow immediate action; provide "Undo" for 5 seconds |
|
|
32
|
+
| Unfocused form dialogs | User must click to start typing | `autoFocus` on the primary field |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Navigation & Control
|
|
37
|
+
|
|
38
|
+
### Command Palette
|
|
39
|
+
|
|
40
|
+
The command palette is the central navigation hub. Users can search for anything — pages, actions, meetings, settings — from a single keyboard-activated overlay.
|
|
41
|
+
|
|
42
|
+
- Launch with `⌘K` (macOS) / `Ctrl+K`
|
|
43
|
+
- Results group by category (pages, actions, recent items)
|
|
44
|
+
- Keyboard navigation with arrow keys + Enter
|
|
45
|
+
- Uses `.surface-elevated` styling (see `references/visual-language.md`)
|
|
46
|
+
|
|
47
|
+
### Keyboard Shortcuts
|
|
48
|
+
|
|
49
|
+
Power users should never be forced to use the mouse. Provide shortcuts for frequent actions:
|
|
50
|
+
|
|
51
|
+
| Action | Shortcut | Context |
|
|
52
|
+
|--------|----------|---------|
|
|
53
|
+
| Command palette | `⌘K` | Global |
|
|
54
|
+
| Quick search | `/` | When no input is focused |
|
|
55
|
+
| New meeting | `N` | Meeting list view |
|
|
56
|
+
| Close modal/dialog | `Escape` | Any overlay |
|
|
57
|
+
|
|
58
|
+
### Context Switching
|
|
59
|
+
|
|
60
|
+
Switching between views should be instantaneous. Use layout-based navigation so the sidebar and header persist while only the content panel changes. Avoid full-page reloads.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Information Architecture
|
|
65
|
+
|
|
66
|
+
### Content-First Layout
|
|
67
|
+
|
|
68
|
+
The most important content occupies the largest surface area and appears first in the visual hierarchy. Use the bento grid to establish importance through sizing (see `references/visual-language.md`).
|
|
69
|
+
|
|
70
|
+
### Progressive Disclosure
|
|
71
|
+
|
|
72
|
+
Show only what matters right now. Additional details reveal on interaction:
|
|
73
|
+
- Expand/collapse sections for secondary information
|
|
74
|
+
- Hover cards for quick previews
|
|
75
|
+
- Drill-down for detailed views
|
|
76
|
+
|
|
77
|
+
### Opacity-Based Depth
|
|
78
|
+
|
|
79
|
+
Use text opacity to create visual hierarchy without additional colours:
|
|
80
|
+
- Primary text: full opacity via `--color-text-primary`
|
|
81
|
+
- Secondary text (metadata, timestamps): reduced opacity via `--color-text-secondary`
|
|
82
|
+
- Disabled/inactive elements: further reduced opacity
|
|
83
|
+
|
|
84
|
+
### Focal Points
|
|
85
|
+
|
|
86
|
+
Create clear visual focal points using:
|
|
87
|
+
- **Typography weight** — Bold headings draw the eye before body text
|
|
88
|
+
- **Surface area** — Larger bento grid cells command more attention
|
|
89
|
+
- **Colour contrast** — Accent colour on CTAs, muted tones for everything else
|
|
90
|
+
- **Motion** — The first (and only) animated element on screen is the focal point
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Feedback & Motion
|
|
95
|
+
|
|
96
|
+
### Liquid Transitions
|
|
97
|
+
|
|
98
|
+
All transitions should feel organic and fluid — never mechanical or jarring.
|
|
99
|
+
|
|
100
|
+
- **Entry:** Elements fade in and slide from their origin direction (bottom sheet from bottom, sidebar from left, tooltip from near the trigger)
|
|
101
|
+
- **Duration:** 150-300ms for micro-interactions (button press, toggle); 300-500ms for layout transitions (panel open/close)
|
|
102
|
+
- **Easing:** `ease-out` for elements appearing; `ease-in` for elements leaving. Never `linear`.
|
|
103
|
+
|
|
104
|
+
### Tactile Scale Shifts
|
|
105
|
+
|
|
106
|
+
Interactive elements respond to press with a subtle scale reduction:
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
.interactive-element {
|
|
110
|
+
transition: transform 150ms ease-out;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.interactive-element:active {
|
|
114
|
+
transform: scale(0.97); /* 3% reduction — barely perceptible, deeply satisfying */
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Never exceed 5% scale change — larger shifts feel cartoonish.
|
|
119
|
+
|
|
120
|
+
### Calm Alerts
|
|
121
|
+
|
|
122
|
+
Notifications and status indicators use the semantic role tokens from the design system — never a hand-picked hex. The specific hue for each role (often muted rather than a harsh stoplight) is the design system's decision; consume the role, not a colour.
|
|
123
|
+
|
|
124
|
+
| State | Role token |
|
|
125
|
+
|-------|------------|
|
|
126
|
+
| Success | the `success` role |
|
|
127
|
+
| Error | the `error` / `destructive` role |
|
|
128
|
+
| Warning | the `warning` role |
|
|
129
|
+
| Info | the `info` role |
|
|
130
|
+
|
|
131
|
+
Toasts and banners should be dismissible, auto-fade after a reasonable duration (4-6 seconds for success, persistent for errors), and never stack vertically in a pile of doom.
|
|
132
|
+
|
|
133
|
+
### Progressive Disclosure of Actions
|
|
134
|
+
|
|
135
|
+
Actions should reveal contextually — on hover, on selection, or on focus. Don't show every possible action at all times.
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
// Actions appear on hover/focus
|
|
139
|
+
<div className="group relative">
|
|
140
|
+
<MeetingCard meeting={meeting} />
|
|
141
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover:opacity-100
|
|
142
|
+
group-focus-within:opacity-100 transition-opacity">
|
|
143
|
+
<EditButton />
|
|
144
|
+
<DeleteButton />
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Accessibility
|
|
152
|
+
|
|
153
|
+
Accessibility is a merge gate, not optional polish — semantic HTML, keyboard reachability, WCAG AA contrast, and labelled forms are a baseline requirement on every surface. See `references/accessibility.md` for the full reference.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Empty States & Onboarding
|
|
158
|
+
|
|
159
|
+
### Day-Zero Experience
|
|
160
|
+
|
|
161
|
+
When a user first encounters a section with no data, the empty state should:
|
|
162
|
+
1. Explain what this section is for
|
|
163
|
+
2. Provide a single clear action to populate it
|
|
164
|
+
3. Use a friendly illustration or icon (not a blank page)
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
export function EmptyMeetingList() {
|
|
168
|
+
return (
|
|
169
|
+
<div className="surface-glass p-8 text-center">
|
|
170
|
+
<CalendarPlus size={48} className="mx-auto text-muted-foreground" aria-hidden />
|
|
171
|
+
<h3 className="text-title mt-4">No meetings yet</h3>
|
|
172
|
+
<p className="text-muted-foreground mt-2">
|
|
173
|
+
Schedule your first meeting to get started.
|
|
174
|
+
</p>
|
|
175
|
+
<Button className="mt-6">
|
|
176
|
+
<Plus size={16} aria-hidden />
|
|
177
|
+
Schedule Meeting
|
|
178
|
+
</Button>
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Actionable Error States
|
|
185
|
+
|
|
186
|
+
Error states must tell the user what went wrong and what they can do about it. Never show raw error codes or technical jargon.
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
// Bad
|
|
190
|
+
<p>Error 500: ECONNREFUSED</p>
|
|
191
|
+
|
|
192
|
+
// Good
|
|
193
|
+
<div className="surface-glass p-6 text-center" role="alert">
|
|
194
|
+
<AlertCircle size={32} className="mx-auto text-destructive" aria-hidden />
|
|
195
|
+
<h3 className="text-title mt-4">Couldn't load your meetings</h3>
|
|
196
|
+
<p className="text-muted-foreground mt-2">
|
|
197
|
+
We're having trouble connecting right now. Your data is safe.
|
|
198
|
+
</p>
|
|
199
|
+
<Button onClick={reset} className="mt-4">Try again</Button>
|
|
200
|
+
</div>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Input Preservation
|
|
204
|
+
|
|
205
|
+
If a form submission fails, **never clear the user's input**. The react-hook-form + ActionResult pattern handles this automatically — `form.setError()` displays the server error without resetting field values.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Copy & Tone
|
|
210
|
+
|
|
211
|
+
### Voice Principles
|
|
212
|
+
|
|
213
|
+
- **Concise** — Say it in fewer words. If a label can be one word, use one word.
|
|
214
|
+
- **Active voice** — "Meeting created" not "A meeting has been created."
|
|
215
|
+
- **Context-sensitive** — Error messages are empathetic. Success messages are brief. Help text is instructional.
|
|
216
|
+
|
|
217
|
+
| Context | Tone | Example |
|
|
218
|
+
|---------|------|---------|
|
|
219
|
+
| Success | Brief, confident | "Saved" / "Meeting created" |
|
|
220
|
+
| Error | Empathetic, actionable | "Couldn't save. Check your connection and try again." |
|
|
221
|
+
| Empty state | Encouraging, helpful | "No meetings yet. Schedule your first one." |
|
|
222
|
+
| Destructive action | Clear, honest | "Delete this meeting? This can't be undone." |
|
|
223
|
+
| Loading | Invisible preferred | Use skeleton UI, not "Loading..." text |
|
|
224
|
+
|
|
225
|
+
### Punctuation
|
|
226
|
+
|
|
227
|
+
- Button labels: no period ("Save", not "Save.")
|
|
228
|
+
- Toast messages: no period ("Meeting created", not "Meeting created.")
|
|
229
|
+
- Error messages: period at end if a full sentence ("Check your connection and try again.")
|
|
230
|
+
- Labels: no period ("Duration", not "Duration:")
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Visual Language & Surfaces
|
|
2
|
+
|
|
3
|
+
This reference is about **technique** — how to consume the design system and how the surface layer composes depth. It carries **no fixed palette, type, or surface catalogue**. Every concrete value (colours, type scale, shadow stacks, blur radii, gradients, surface treatments) is a per-app decision that lives in `docs/design-system.md` and is projected from `.groundwork/config/brand-tokens.json` into `app/brand.css` and surfaced through `app/globals.css` as token utilities. Read the design system before any visual work; never invent values here.
|
|
4
|
+
|
|
5
|
+
## Where the values live
|
|
6
|
+
|
|
7
|
+
The nextjs-app generator projects the design system's `visual` block into `app/brand.css` (regenerated, never hand-edited). `app/globals.css` maps those values into Tailwind token utilities and surface classes. The chain:
|
|
8
|
+
|
|
9
|
+
| Layer | Owns | You touch |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `docs/design-system.md` | The human source of truth — palette, type, elevation, surfaces, motion, at the depth standard | Read it |
|
|
12
|
+
| `.groundwork/config/brand-tokens.json` `visual` block | The machine projection of those decisions | Read it; never hand-edit |
|
|
13
|
+
| `app/brand.css` (generated) | `--gw-*` values + the shadcn structural vars, light and dark | Never hand-edit |
|
|
14
|
+
| `app/globals.css` | Token-utility mappings (`@theme`) + surface classes | Extend structure only, never bake values |
|
|
15
|
+
| Your components | Consume token utilities and surface classes | Here |
|
|
16
|
+
|
|
17
|
+
**Consume tokens, never literals.** A raw hex/length/shadow/blur/gradient in a component bypasses the design system and fails the token-conformance lint (`eslint.config.mjs`). If you need a raw value, reference the projected custom property (`var(--gw-shadow-mid)`, or the Tailwind var form `shadow-(--gw-shadow-mid)`) — never a literal recipe.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Colour (OKLCH)
|
|
22
|
+
|
|
23
|
+
The design system defines colour in OKLCH — perceptually uniform lightness, so a colour at `L=0.7` reads equally bright across hues (unlike HSL). **Hex, RGB, and HSL literals are forbidden in components.**
|
|
24
|
+
|
|
25
|
+
Consume colour through the projected token utilities — `bg-background`, `text-foreground`, `bg-primary`, `text-muted-foreground`, `border-border`, `bg-destructive`, the `chart-*` roles — all backed by the brand's palette in `brand.css`. The semantic role of each (which hue means success, error, accent) is the design system's call, recorded there; honour it rather than reaching for a generic "green."
|
|
26
|
+
|
|
27
|
+
**Dynamic opacity** — derive a translucent variant of any token without a new variable, via the relative colour function:
|
|
28
|
+
|
|
29
|
+
```css
|
|
30
|
+
/* technique, not a value: any projected colour var works */
|
|
31
|
+
background-color: oklch(from var(--background) l c h / 0.72);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This keeps one source of truth per colour while allowing per-surface translucency.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Typography
|
|
39
|
+
|
|
40
|
+
The design system commits a full type scale (families, and per-role size, line-height, weight, tracking) at `docs/design-system.md`; the per-role micro is projected into `--gw-text-<role>-{size,line,weight,tracking}`. Consume the scale through the project's type utilities or those custom properties. Do not invent ad-hoc font sizes — if content does not fit a role, the layout needs adjustment, not a new size. Where figures must align in columns, use the projected tabular-numerals treatment rather than the proportional default.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Spacing (8pt grid)
|
|
45
|
+
|
|
46
|
+
The design system's spacing scale derives from an 8px base (4px is the optical sub-grid). Consume it through the spacing-scale utilities (`p-4`, `gap-6`, `px-8`) — arbitrary length values (`p-[12px]`) fail lint. Reserve the 4px sub-grid step for optical alignment (icon centring, badge offsets, hairline adjustments), not general spacing. Related elements sit closer than unrelated ones: internal spacing is always tighter than the gap between groups.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Surface depth — the technique
|
|
51
|
+
|
|
52
|
+
High-end surfaces read as modelled material, not flat boxes. Four techniques compose that depth. The design system decides the *values*; you apply them through the projected tokens and surface classes.
|
|
53
|
+
|
|
54
|
+
- **Multi-layer shadow.** A single drop shadow reads flat. Depth comes from stacking several shadows — a tight contact layer, a mid ambient layer, a wide diffuse layer — with alpha tapering as each widens, tinted toward the background rather than pure black. The stacks are projected as `--gw-shadow-low/mid/high` and surfaced as the `shadow-low/mid/high` utilities (theme-aware: the dark theme carries deeper variants).
|
|
55
|
+
- **Backdrop blur.** Translucent surfaces over content need `backdrop-filter: blur(...)` (always paired with the `-webkit-` prefix). Blur radii are projected as `--gw-blur-subtle/standard/heavy` and the `backdrop-blur-*` utilities.
|
|
56
|
+
- **Concentric radii.** When nesting rounded elements, keep curves harmonious: `inner radius = outer radius − padding`. Use the radius tokens (`rounded-lg`, `rounded-xl`), not literal pixel radii.
|
|
57
|
+
- **Ambient gradient.** A barely-perceptible mesh/aurora gradient (opacity well under ~0.15, fading to transparent, layered over a solid fallback) adds warmth to large surfaces. Recipes are projected as gradient tokens; the hero surface composes one.
|
|
58
|
+
|
|
59
|
+
### Surface utilities
|
|
60
|
+
|
|
61
|
+
The per-app surface vocabulary — the glass/elevated/hero treatments that used to be a fixed catalogue — is projected from the design system's `surface` tokens into composite classes in `globals.css`. Apply them; do not re-author the recipe:
|
|
62
|
+
|
|
63
|
+
| Class | For | Composes |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `.surface-glass` | Regular content cards, panels, list items | standard blur + glass tint + hairline border + `shadow-mid` |
|
|
66
|
+
| `.surface-elevated` | Modals, dialogs, command palette, popovers | heavy blur + denser tint + border + `shadow-high` |
|
|
67
|
+
| `.surface-hero` | Dashboard hero metric, key insight, primary KPI | standard blur + hero tint + ambient gradient + `shadow-high` |
|
|
68
|
+
|
|
69
|
+
Need a surface the project has not defined? Compose it from the same tokens (`var(--gw-shadow-*)`, `var(--gw-blur-*)`, the palette vars) or add the treatment to the design system and regenerate — never hardcode a one-off stack in a component.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Sync Anchor
|
|
2
|
+
|
|
3
|
+
This file pins the principle files this skill embeds — both the per-stack
|
|
4
|
+
TypeScript/frontend idiom doc and the cross-cutting central canon this skill
|
|
5
|
+
distils. When any listed file changes, this skill must be reviewed in the same
|
|
6
|
+
commit. CI verifies the hashes match.
|
|
7
|
+
|
|
8
|
+
| Principle file | SHA-256 | Last reviewed |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| src/generators/nextjs-app/docs/principles/stack/typescript/frontend.md | 98232d067ad03c08d6c1ca5f2caec30e7c3400da55c3afb7754482bc121d7554 | 2026-05-26 |
|
|
11
|
+
| src/docs/principles/foundations/testing.md | 205ac40d4c643e7b61cf1e4295df8a7b8b46dcd7c81b857aa8c642ea353f62ef | 2026-06-27 |
|
|
12
|
+
| src/docs/principles/quality/observability.md | 8aa60e213ba03e989c93263153e3a1ac10b2336f6d0360c394f473660d565a0b | 2026-06-26 |
|
|
13
|
+
| src/docs/principles/quality/security.md | 61157d97677142737ec537954dc5aaad7a04012cc8a3dcc855e2d324287fdc64 | 2026-06-26 |
|
|
14
|
+
| src/docs/principles/quality/performance.md | 18b6d3391c57d97342068f9f1da732b24de4221489d0459bb6ad8900fac0a02e | 2026-06-26 |
|
|
15
|
+
| src/docs/principles/quality/accessibility.md | f921e7bf6256bc105b127b841d0a30af8a70ad1ddd7632d492589f052e6501b2 | 2026-06-26 |
|
|
16
|
+
| src/docs/principles/foundations/documentation.md | 8b576072eaf4970f1251b560781e3e755c864a7920faa599b2834c921cbb8734 | 2026-06-26 |
|