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,80 @@
|
|
|
1
|
+
// The core-access seam is proven without a network: fetch is injected, so
|
|
2
|
+
// every reachability outcome (ok, non-200, thrown) is a deterministic case.
|
|
3
|
+
// Runs on node:test — the CLI's test layer adds no dependencies, like the
|
|
4
|
+
// CLI itself.
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_CORE_BASE_URL,
|
|
9
|
+
coreAuthHeaders,
|
|
10
|
+
coreBaseUrl,
|
|
11
|
+
fetchCoreHealth,
|
|
12
|
+
} from './client';
|
|
13
|
+
|
|
14
|
+
function fetchReturning(status: number, body: unknown): typeof fetch {
|
|
15
|
+
return (async () =>
|
|
16
|
+
new Response(JSON.stringify(body), {
|
|
17
|
+
status,
|
|
18
|
+
headers: { 'Content-Type': 'application/json' },
|
|
19
|
+
})) as typeof fetch;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe('coreBaseUrl', () => {
|
|
23
|
+
it('defaults to the workspace gateway', () => {
|
|
24
|
+
assert.equal(coreBaseUrl({}), DEFAULT_CORE_BASE_URL);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('honours API_BASE_URL from the environment', () => {
|
|
28
|
+
assert.equal(coreBaseUrl({ API_BASE_URL: 'http://10.0.0.5:4000' }), 'http://10.0.0.5:4000');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('treats a blank API_BASE_URL as unset', () => {
|
|
32
|
+
assert.equal(coreBaseUrl({ API_BASE_URL: ' ' }), DEFAULT_CORE_BASE_URL);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('coreAuthHeaders', () => {
|
|
37
|
+
it('is unauthenticated by default', () => {
|
|
38
|
+
assert.deepEqual(coreAuthHeaders(), {});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('carries a supplied token as a Bearer header', () => {
|
|
42
|
+
assert.deepEqual(coreAuthHeaders('jwt-123'), { Authorization: 'Bearer jwt-123' });
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe('fetchCoreHealth', () => {
|
|
47
|
+
it('maps a healthy core to reachable + its reported status', async () => {
|
|
48
|
+
const health = await fetchCoreHealth(
|
|
49
|
+
'http://core.test',
|
|
50
|
+
fetchReturning(200, { status: 'ok', checks: { db: 'ok' } }),
|
|
51
|
+
);
|
|
52
|
+
assert.deepEqual(health, { reachable: true, status: 'ok' });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('requests the /health route of the configured base URL', async () => {
|
|
56
|
+
let requested: string | undefined;
|
|
57
|
+
const probe = (async (input: Parameters<typeof fetch>[0]) => {
|
|
58
|
+
requested = String(input);
|
|
59
|
+
return new Response('{"status":"ok"}', { status: 200 });
|
|
60
|
+
}) as typeof fetch;
|
|
61
|
+
await fetchCoreHealth('http://core.test:4000', probe);
|
|
62
|
+
assert.equal(requested, 'http://core.test:4000/health');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('maps a non-200 to unreachable with the code as the status', async () => {
|
|
66
|
+
const health = await fetchCoreHealth(
|
|
67
|
+
'http://core.test',
|
|
68
|
+
fetchReturning(503, { error: 'overloaded' }),
|
|
69
|
+
);
|
|
70
|
+
assert.deepEqual(health, { reachable: false, status: 'http 503' });
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('maps a network failure to a value, never a throw', async () => {
|
|
74
|
+
const down = (async () => {
|
|
75
|
+
throw new Error('ECONNREFUSED');
|
|
76
|
+
}) as typeof fetch;
|
|
77
|
+
const health = await fetchCoreHealth('http://core.test', down);
|
|
78
|
+
assert.deepEqual(health, { reachable: false, status: 'unreachable' });
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// The core-access seam: the ONLY place this CLI talks to the workspace
|
|
2
|
+
// gateway. Commands consume these functions and never carry transport
|
|
3
|
+
// detail themselves — the terminal twin of the desktop scaffold's
|
|
4
|
+
// main-process core client and the mobile scaffold's thin dio client.
|
|
5
|
+
//
|
|
6
|
+
// Contract-client stance (O8): hand-rolled and deliberately thin — one
|
|
7
|
+
// function per promoted-contract operation, typed results beside them.
|
|
8
|
+
// When the promoted openapi.yaml grows past a handful of operations, switch
|
|
9
|
+
// to a generated TypeScript client and keep this module as the seam the
|
|
10
|
+
// commands consume — nothing above it changes.
|
|
11
|
+
|
|
12
|
+
/** The workspace core's health as commands render it. An unreachable core
|
|
13
|
+
* is a value, not an exception: a CLI fronting a down service reports it
|
|
14
|
+
* through output and exit code, never a stack trace. */
|
|
15
|
+
export type CoreHealth = {
|
|
16
|
+
reachable: boolean;
|
|
17
|
+
status: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const DEFAULT_CORE_BASE_URL = 'http://localhost:4000';
|
|
21
|
+
|
|
22
|
+
/** Where the workspace core lives. The system-test harness (and any
|
|
23
|
+
* deployed environment) overrides via the API_BASE_URL environment
|
|
24
|
+
* variable. Standalone use never reaches this module — the seam only
|
|
25
|
+
* exists when the CLI fronts workspace services. */
|
|
26
|
+
export function coreBaseUrl(env: NodeJS.ProcessEnv = process.env): string {
|
|
27
|
+
const configured = env['API_BASE_URL']?.trim();
|
|
28
|
+
return configured ? configured : DEFAULT_CORE_BASE_URL;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The auth seam: headers attached to every core request. Unauthenticated
|
|
32
|
+
* by default — wire your identity provider here (e.g. a service token from
|
|
33
|
+
* the environment becomes `Authorization: Bearer <token>`); the core's
|
|
34
|
+
* /health route stays public. */
|
|
35
|
+
export function coreAuthHeaders(token?: string): Record<string, string> {
|
|
36
|
+
return token ? { Authorization: `Bearer ${token}` } : {};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Probe the gateway's health endpoint — the wiring proof the `status`
|
|
40
|
+
* command renders. `/health` is what GroundWork's Go and Python cores
|
|
41
|
+
* serve; a Next.js BFF would be `/api/healthz` — adjust to your gateway.
|
|
42
|
+
* Failures map to a value, never a throw: an unreachable core is a state
|
|
43
|
+
* the command reports (exit 1), not an exception that kills the process. */
|
|
44
|
+
export async function fetchCoreHealth(
|
|
45
|
+
baseUrl: string = coreBaseUrl(),
|
|
46
|
+
fetchImpl: typeof fetch = fetch,
|
|
47
|
+
): Promise<CoreHealth> {
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetchImpl(new URL('/health', baseUrl), {
|
|
50
|
+
headers: { Accept: 'application/json', ...coreAuthHeaders() },
|
|
51
|
+
signal: AbortSignal.timeout(5_000),
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
return { reachable: false, status: `http ${response.status}` };
|
|
55
|
+
}
|
|
56
|
+
const body = (await response.json()) as { status?: unknown };
|
|
57
|
+
return {
|
|
58
|
+
reachable: true,
|
|
59
|
+
status: typeof body.status === 'string' ? body.status : 'ok',
|
|
60
|
+
};
|
|
61
|
+
} catch {
|
|
62
|
+
return { reachable: false, status: 'unreachable' };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// The registry is the single source of truth for dispatch and help — these
|
|
2
|
+
// tests keep it honest as commands accrete. Runs on node:test (zero deps).
|
|
3
|
+
import { describe, it } from 'node:test';
|
|
4
|
+
import assert from 'node:assert/strict';
|
|
5
|
+
import { COMMANDS, findCommand } from './registry';
|
|
6
|
+
|
|
7
|
+
describe('command registry', () => {
|
|
8
|
+
it('registers at least one command', () => {
|
|
9
|
+
assert.ok(COMMANDS.length > 0);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('has no duplicate command names', () => {
|
|
13
|
+
const names = COMMANDS.map((c) => c.name);
|
|
14
|
+
assert.equal(new Set(names).size, names.length);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('gives every command a group and a summary (help renders from these)', () => {
|
|
18
|
+
for (const c of COMMANDS) {
|
|
19
|
+
assert.ok(c.summary.length > 0, `command ${c.name} has no summary`);
|
|
20
|
+
assert.ok(['CORE', 'META'].includes(c.group), `command ${c.name} has an unknown group`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('resolves a registered command', () => {
|
|
25
|
+
assert.ok(findCommand('hello'));
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('returns undefined for an unknown command (cli.ts exits 2 on this)', () => {
|
|
29
|
+
assert.equal(findCommand('no-such-command'), undefined);
|
|
30
|
+
});
|
|
31
|
+
<% if (core) { %>
|
|
32
|
+
it('registers the core status probe — the wiring proof to the workspace core', () => {
|
|
33
|
+
assert.ok(findCommand('status'));
|
|
34
|
+
});
|
|
35
|
+
<% } %>});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Renderer } from './theme/render';
|
|
2
|
+
import { hello } from './commands/hello';
|
|
3
|
+
<% if (core) { %>import { status } from './commands/status';
|
|
4
|
+
<% } %><% if (repl) { %>import { repl } from './commands/repl';
|
|
5
|
+
<% } %>
|
|
6
|
+
export interface Ctx {
|
|
7
|
+
r: Renderer;
|
|
8
|
+
json: boolean;
|
|
9
|
+
args: string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type CommandGroup = 'CORE' | 'META';
|
|
13
|
+
|
|
14
|
+
export interface CommandDef {
|
|
15
|
+
name: string;
|
|
16
|
+
group: CommandGroup;
|
|
17
|
+
summary: string;
|
|
18
|
+
handler: (ctx: Ctx) => Promise<number>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** The command registry — the single source of truth for dispatch and help. Add a row
|
|
22
|
+
* here and the command is wired into both. */
|
|
23
|
+
export const COMMANDS: CommandDef[] = [
|
|
24
|
+
{ name: 'hello', group: 'CORE', summary: 'Print a themed greeting (supports --json)', handler: hello },
|
|
25
|
+
<% if (core) { %> { name: 'status', group: 'CORE', summary: 'Probe the workspace core (exit 0 reachable, 1 not)', handler: status },
|
|
26
|
+
<% } %><% if (repl) { %> { name: 'repl', group: 'CORE', summary: 'Start an interactive session', handler: repl },
|
|
27
|
+
<% } %>];
|
|
28
|
+
|
|
29
|
+
export function findCommand(name: string): CommandDef | undefined {
|
|
30
|
+
return COMMANDS.find((c) => c.name === name);
|
|
31
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2021",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"lib": ["ES2021"],
|
|
7
|
+
"strict": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true,
|
|
11
|
+
"resolveJsonModule": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"types": ["node"]
|
|
14
|
+
},
|
|
15
|
+
"include": ["src/**/*.ts"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"//": "Test build: compiles src/ (including *.test.ts) to CommonJS in dist-test/ so node --test runs it directly. The shipped bundle still comes from build.mjs.",
|
|
3
|
+
"extends": "./tsconfig.json",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"noEmit": false,
|
|
6
|
+
"rootDir": "src",
|
|
7
|
+
"outDir": "dist-test",
|
|
8
|
+
"module": "NodeNext",
|
|
9
|
+
"moduleResolution": "NodeNext"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { formatFiles, generateFiles, Tree } from '@nx/devkit';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { recordGeneratorProvenance } from '../shared/provenance';
|
|
5
|
+
import { registerRunner } from '../shared/scaffold-helpers';
|
|
6
|
+
|
|
7
|
+
export interface CliAppGeneratorSchema {
|
|
8
|
+
name: string;
|
|
9
|
+
repl?: boolean;
|
|
10
|
+
/** Wire the CLI to the workspace core (core-access seam + `status` wiring
|
|
11
|
+
* proof). Omit for a standalone tool that fronts no services. */
|
|
12
|
+
core?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const BRAND_TOKENS_PATH = '.groundwork/config/brand-tokens.json';
|
|
16
|
+
|
|
17
|
+
/** The shared CLI render layer lives with the ./dev CLI source and is the single
|
|
18
|
+
* source of truth. The product gets an owned copy so it can evolve independently. */
|
|
19
|
+
const THEME_SRC = path.join(
|
|
20
|
+
__dirname,
|
|
21
|
+
'..',
|
|
22
|
+
'..',
|
|
23
|
+
'..',
|
|
24
|
+
'..',
|
|
25
|
+
'src',
|
|
26
|
+
'generators',
|
|
27
|
+
'workspace-dev-cli',
|
|
28
|
+
'cli-src',
|
|
29
|
+
'src',
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
function kebab(s: string): string {
|
|
33
|
+
return s
|
|
34
|
+
.trim()
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
37
|
+
.replace(/^-+|-+$/g, '');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Project the design system's brand tokens (identity + terminal) for the product, or
|
|
41
|
+
* a minimal Tier-1 identity derived from the name when no tokens exist. */
|
|
42
|
+
function buildBrand(tree: Tree, name: string): Record<string, unknown> {
|
|
43
|
+
if (tree.exists(BRAND_TOKENS_PATH)) {
|
|
44
|
+
try {
|
|
45
|
+
const raw = JSON.parse(tree.read(BRAND_TOKENS_PATH, 'utf-8') || '{}');
|
|
46
|
+
return { identity: raw.identity, terminal: raw.terminal };
|
|
47
|
+
} catch {
|
|
48
|
+
/* malformed — fall through */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
identity: { appName: name, wordmark: '◢◤', primary: '#5fafff', accent: '#d7afff', voice: 'clear, modern' },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function copyShared(tree: Tree, fromRel: string, toRel: string): void {
|
|
57
|
+
const content = fs.readFileSync(path.join(THEME_SRC, fromRel), 'utf-8');
|
|
58
|
+
tree.write(toRel, content);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default async function (tree: Tree, options: CliAppGeneratorSchema) {
|
|
62
|
+
const name = options.name;
|
|
63
|
+
const binName = kebab(name) || 'cli';
|
|
64
|
+
const repl = Boolean(options.repl);
|
|
65
|
+
const core = Boolean(options.core);
|
|
66
|
+
const projectRoot = path.join('services', binName);
|
|
67
|
+
|
|
68
|
+
const filesDir = path.join(__dirname, '..', '..', '..', '..', 'src', 'generators', 'cli-app', 'files');
|
|
69
|
+
generateFiles(tree, filesDir, projectRoot, {
|
|
70
|
+
name,
|
|
71
|
+
binName,
|
|
72
|
+
repl,
|
|
73
|
+
core,
|
|
74
|
+
tmpl: '',
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Standalone mode: the CLI is the whole product and fronts no services, so
|
|
78
|
+
// it carries no core-access seam. Core mode (--core) keeps these files —
|
|
79
|
+
// the same seam shape electron-app (src/main/core-client.ts) and
|
|
80
|
+
// flutter-app (lib/data/services/api_client.dart) ship unconditionally;
|
|
81
|
+
// here it is opt-in because a standalone CLI genuinely has no core.
|
|
82
|
+
if (!core) {
|
|
83
|
+
tree.delete(path.join(projectRoot, 'src/core/client.ts'));
|
|
84
|
+
tree.delete(path.join(projectRoot, 'src/core/client.test.ts'));
|
|
85
|
+
tree.delete(path.join(projectRoot, 'src/commands/status.ts'));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Copy the shared render layer as owned product source.
|
|
89
|
+
copyShared(tree, 'theme/tokens.ts', path.join(projectRoot, 'src/theme/tokens.ts'));
|
|
90
|
+
copyShared(tree, 'theme/color.ts', path.join(projectRoot, 'src/theme/color.ts'));
|
|
91
|
+
copyShared(tree, 'theme/render.ts', path.join(projectRoot, 'src/theme/render.ts'));
|
|
92
|
+
|
|
93
|
+
// Project brand tokens into the product (baked into the build via import).
|
|
94
|
+
tree.write(path.join(projectRoot, 'src/brand.json'), JSON.stringify(buildBrand(tree, name), null, 2) + '\n');
|
|
95
|
+
|
|
96
|
+
// Interactive layer: reuse the same prompt utilities the ./dev wizard uses.
|
|
97
|
+
if (repl) {
|
|
98
|
+
copyShared(tree, 'util/prompt.ts', path.join(projectRoot, 'src/util/prompt.ts'));
|
|
99
|
+
tree.write(
|
|
100
|
+
path.join(projectRoot, 'src/commands/repl.ts'),
|
|
101
|
+
`import type { Ctx } from '../registry';
|
|
102
|
+
import { isInteractive, textPrompt } from '../util/prompt';
|
|
103
|
+
|
|
104
|
+
/** A minimal interactive session on top of the composable spine. Extend it into a
|
|
105
|
+
* full REPL — slash commands, streaming, autocomplete — per your design system. */
|
|
106
|
+
export async function repl(ctx: Ctx): Promise<number> {
|
|
107
|
+
if (!isInteractive()) {
|
|
108
|
+
ctx.r.error('repl requires an interactive terminal.');
|
|
109
|
+
return 2;
|
|
110
|
+
}
|
|
111
|
+
ctx.r.logo('interactive session');
|
|
112
|
+
ctx.r.info("Type a name to greet, or 'exit' to quit.");
|
|
113
|
+
for (;;) {
|
|
114
|
+
const line = await textPrompt(ctx.r.painter, '>');
|
|
115
|
+
if (line === 'exit' || line === 'quit') break;
|
|
116
|
+
if (line) ctx.r.success(\`Hello, \${line}!\`);
|
|
117
|
+
}
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A CLI is invoked ad hoc, not a long-running service — register it as a
|
|
125
|
+
// runner so `./dev status` reports it and `./dev` knows how to run it, but
|
|
126
|
+
// autostart is false so it is never launched by `./dev start`.
|
|
127
|
+
registerRunner(tree, {
|
|
128
|
+
name: binName,
|
|
129
|
+
kind: 'surface',
|
|
130
|
+
cmd: 'npm run dev',
|
|
131
|
+
cwd: projectRoot,
|
|
132
|
+
autostart: false,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
await formatFiles(tree);
|
|
136
|
+
|
|
137
|
+
recordGeneratorProvenance(tree, 'cli-app', options as unknown as Record<string, unknown>);
|
|
138
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"$id": "CliApp",
|
|
4
|
+
"title": "CLI App",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "The CLI product name (used for the binary, package name, and branding fallback).",
|
|
10
|
+
"x-prompt": "What is the CLI called?"
|
|
11
|
+
},
|
|
12
|
+
"repl": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"description": "Scaffold the interactive REPL layer on top of the composable spine.",
|
|
15
|
+
"default": false
|
|
16
|
+
},
|
|
17
|
+
"core": {
|
|
18
|
+
"type": "boolean",
|
|
19
|
+
"description": "Wire the CLI to the workspace core: scaffolds the core-access seam (src/core/client.ts, API_BASE_URL-configurable, Bearer auth seam) and a `status` wiring-proof command. Omit for a standalone tool that fronts no services.",
|
|
20
|
+
"default": false
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"required": ["name"]
|
|
24
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
/node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.js
|
|
7
|
+
|
|
8
|
+
# testing
|
|
9
|
+
/coverage
|
|
10
|
+
|
|
11
|
+
# next.js
|
|
12
|
+
/.next/
|
|
13
|
+
/out/
|
|
14
|
+
|
|
15
|
+
# fumadocs generated source map (regenerated by `fumadocs-mdx` / next build)
|
|
16
|
+
/.source/
|
|
17
|
+
|
|
18
|
+
# production
|
|
19
|
+
/build
|
|
20
|
+
|
|
21
|
+
# misc
|
|
22
|
+
.DS_Store
|
|
23
|
+
*.pem
|
|
24
|
+
|
|
25
|
+
# debug
|
|
26
|
+
npm-debug.log*
|
|
27
|
+
yarn-debug.log*
|
|
28
|
+
yarn-error.log*
|
|
29
|
+
pnpm-debug.log*
|
|
30
|
+
|
|
31
|
+
# local env files
|
|
32
|
+
.env*.local
|
|
33
|
+
.env
|
|
34
|
+
|
|
35
|
+
# vercel
|
|
36
|
+
.vercel
|
|
37
|
+
|
|
38
|
+
# typescript
|
|
39
|
+
*.tsbuildinfo
|
|
40
|
+
next-env.d.ts
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { source } from '@/app/source';
|
|
2
|
+
import { DocsPage, DocsBody, DocsDescription, DocsTitle } from 'fumadocs-ui/page';
|
|
3
|
+
import { notFound } from 'next/navigation';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import type { ComponentProps, FC } from 'react';
|
|
6
|
+
import { Mermaid } from '@/components/mermaid';
|
|
7
|
+
|
|
8
|
+
// MDX components injected into every rendered doc. `Mermaid` resolves the
|
|
9
|
+
// `<Mermaid chart="…" />` nodes the remark transform (source.config.ts) emits for fenced
|
|
10
|
+
// ```mermaid blocks.
|
|
11
|
+
const mdxComponents = { Mermaid };
|
|
12
|
+
|
|
13
|
+
// The custom title-from-H1 schema (source.config.ts) is a transform, which stops
|
|
14
|
+
// createMDXSource from threading the full page-data type through — the inferred
|
|
15
|
+
// type degrades to the base PageData (title only). The other fields (description,
|
|
16
|
+
// full, and the compiled-MDX runtime fields body + toc) are present at runtime;
|
|
17
|
+
// this view restores their types. toc's type is borrowed from DocsPage's own prop.
|
|
18
|
+
type DocData = {
|
|
19
|
+
title: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
full?: boolean;
|
|
22
|
+
body: FC;
|
|
23
|
+
toc: ComponentProps<typeof DocsPage>['toc'];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// The pristine root docs/ tree ships without an index.md (source.config.ts reads
|
|
27
|
+
// it untouched), so the `/docs` root — the empty slug — has no backing page. The
|
|
28
|
+
// home route redirects here, so 404ing it would make the whole site look broken
|
|
29
|
+
// on first load. Instead, render a generated overview that links into every
|
|
30
|
+
// section, derived live from the page list and grouped by the first folder
|
|
31
|
+
// segment under /docs (top-level docs fall under "Overview").
|
|
32
|
+
function DocsIndex() {
|
|
33
|
+
const groups = new Map<string, { title: string; url: string }[]>();
|
|
34
|
+
for (const page of source.getPages()) {
|
|
35
|
+
const segments = page.url.replace(/^\/docs\/?/, '').split('/');
|
|
36
|
+
const section = segments.length > 1 ? segments[0] : 'Overview';
|
|
37
|
+
const list = groups.get(section) ?? [];
|
|
38
|
+
list.push({ title: page.data.title, url: page.url });
|
|
39
|
+
groups.set(section, list);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<DocsPage>
|
|
44
|
+
<DocsTitle><%= navTitle %></DocsTitle>
|
|
45
|
+
<DocsDescription>Project documentation, organized by section.</DocsDescription>
|
|
46
|
+
<DocsBody>
|
|
47
|
+
{[...groups.entries()].map(([section, pages]) => (
|
|
48
|
+
<section key={section}>
|
|
49
|
+
<h2 style={{ textTransform: 'capitalize' }}>{section.replace(/-/g, ' ')}</h2>
|
|
50
|
+
<ul>
|
|
51
|
+
{pages.map((p) => (
|
|
52
|
+
<li key={p.url}>
|
|
53
|
+
<Link href={p.url}>{p.title}</Link>
|
|
54
|
+
</li>
|
|
55
|
+
))}
|
|
56
|
+
</ul>
|
|
57
|
+
</section>
|
|
58
|
+
))}
|
|
59
|
+
</DocsBody>
|
|
60
|
+
</DocsPage>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default async function Page(props: { params: Promise<{ slug?: string[] }> }) {
|
|
65
|
+
const params = await props.params;
|
|
66
|
+
const page = source.getPage(params.slug);
|
|
67
|
+
if (!page) {
|
|
68
|
+
// Empty slug is the `/docs` root — render the generated overview, not a 404.
|
|
69
|
+
if (!params.slug || params.slug.length === 0) return <DocsIndex />;
|
|
70
|
+
notFound();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const data = page.data as typeof page.data & DocData;
|
|
74
|
+
const MDX = data.body;
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<DocsPage toc={data.toc} full={data.full}>
|
|
78
|
+
<DocsTitle>{data.title}</DocsTitle>
|
|
79
|
+
<DocsDescription>{data.description}</DocsDescription>
|
|
80
|
+
<DocsBody>
|
|
81
|
+
<MDX components={mdxComponents} />
|
|
82
|
+
</DocsBody>
|
|
83
|
+
</DocsPage>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function generateStaticParams() {
|
|
88
|
+
return source.generateParams();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {
|
|
92
|
+
const params = await props.params;
|
|
93
|
+
const page = source.getPage(params.slug);
|
|
94
|
+
if (!page) return {};
|
|
95
|
+
|
|
96
|
+
const data = page.data as typeof page.data & DocData;
|
|
97
|
+
return {
|
|
98
|
+
title: data.title,
|
|
99
|
+
description: data.description,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { source } from '@/app/source';
|
|
4
|
+
|
|
5
|
+
// Sidebar order is declarative now: docs/meta.json seeds the canonical top-level
|
|
6
|
+
// ordering and sinks the principles tree to the bottom (collapsed), so the old
|
|
7
|
+
// imperative betsFirst() sort is gone. Order is owned by the content tree, not code.
|
|
8
|
+
export default function Layout({ children }: { children: ReactNode }) {
|
|
9
|
+
return (
|
|
10
|
+
<DocsLayout tree={source.pageTree} nav={{ title: '<%= navTitle %>' }}>
|
|
11
|
+
{children}
|
|
12
|
+
</DocsLayout>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/* GENERATED by the GroundWork docs-site generator.
|
|
2
|
+
* Typography discipline for the docs prose (F2): a bounded reading measure, a
|
|
3
|
+
* comfortable line-height, and an explicit h1-h4 scale — the readability layer
|
|
4
|
+
* the stock Fumadocs starter leaves at defaults. Imported by app/layout.tsx
|
|
5
|
+
* only for branded sites; the unbranded fallback keeps the stock appearance.
|
|
6
|
+
*
|
|
7
|
+
* Scoped to the rendered doc body (`.prose`, Fumadocs' content container) so it
|
|
8
|
+
* shapes reference prose without touching the nav, sidebar, or landing chrome. */
|
|
9
|
+
|
|
10
|
+
.prose {
|
|
11
|
+
/* ~68ch measure keeps long lines readable; the stock starter runs full-width. */
|
|
12
|
+
max-width: 68ch;
|
|
13
|
+
line-height: 1.6;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Full-bleed pages (`full: true` frontmatter) opt out of the measure cap. */
|
|
17
|
+
.prose:where(.full) {
|
|
18
|
+
max-width: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Explicit type scale: a clear hierarchy from h1 to h4, with tightened
|
|
22
|
+
* line-height and tracking on headings so they read as structure, not body. */
|
|
23
|
+
.prose h1 {
|
|
24
|
+
font-size: 2.25rem;
|
|
25
|
+
line-height: 1.15;
|
|
26
|
+
letter-spacing: -0.02em;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.prose h2 {
|
|
30
|
+
font-size: 1.5rem;
|
|
31
|
+
line-height: 1.25;
|
|
32
|
+
letter-spacing: -0.01em;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.prose h3 {
|
|
36
|
+
font-size: 1.25rem;
|
|
37
|
+
line-height: 1.3;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.prose h4 {
|
|
41
|
+
font-size: 1.05rem;
|
|
42
|
+
line-height: 1.4;
|
|
43
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RootProvider } from 'fumadocs-ui/provider';
|
|
2
|
+
import 'fumadocs-ui/style.css';
|
|
3
|
+
<% if (branded) { %>import './brand.css';
|
|
4
|
+
import './docs.css';
|
|
5
|
+
<% } %><% if (bodyFont) { %>import { <%= bodyFont.replace(/[^A-Za-z0-9]/g, '_') %> } from 'next/font/google';
|
|
6
|
+
<% } else { %>import { Inter } from 'next/font/google';
|
|
7
|
+
<% } %>import type { ReactNode } from 'react';
|
|
8
|
+
|
|
9
|
+
<% if (bodyFont) { %>const brandFont = <%= bodyFont.replace(/[^A-Za-z0-9]/g, '_') %>({
|
|
10
|
+
subsets: ['latin'],
|
|
11
|
+
});
|
|
12
|
+
<% } else { %>const inter = Inter({
|
|
13
|
+
subsets: ['latin'],
|
|
14
|
+
});
|
|
15
|
+
<% } %>
|
|
16
|
+
export default function Layout({ children }: { children: ReactNode }) {
|
|
17
|
+
return (
|
|
18
|
+
<html lang="en" className={<% if (bodyFont) { %>brandFont.className<% } else { %>inter.className<% } %>} suppressHydrationWarning>
|
|
19
|
+
<body className="flex flex-col min-h-screen">
|
|
20
|
+
<RootProvider>{children}</RootProvider>
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
|
23
|
+
);
|
|
24
|
+
}
|