@polymorphism-tech/morph-spec 3.1.0 → 4.2.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/CLAUDE.md +882 -3
- package/README.md +79 -18
- package/bin/detect-agents.js +1 -1
- package/bin/morph-spec.js +163 -26
- package/bin/task-manager.cjs +101 -7
- package/bin/validate.js +1 -1
- package/docs/cli-auto-detection.md +219 -0
- package/docs/getting-started.md +0 -5
- package/docs/llm-interaction-config.md +735 -0
- package/docs/troubleshooting.md +269 -0
- package/docs/v3.0/AGENTS.md +521 -0
- package/docs/v3.0/ANALYSIS.md +555 -0
- package/docs/v3.0/ARCHITECTURE.md +436 -0
- package/docs/v3.0/EXECUTION-FLOW.md +1304 -0
- package/docs/v3.0/FEATURES.md +688 -0
- package/docs/v3.0/README.md +231 -0
- package/docs/v3.0/ROADMAP.md +801 -0
- package/docs/validation-checklist.md +0 -1
- package/package.json +5 -1
- package/src/commands/agents/index.js +4 -0
- package/src/commands/agents/spawn-team.js +172 -0
- package/src/commands/{create-story.js → feature/create-story.js} +357 -354
- package/src/commands/feature/index.js +6 -0
- package/src/commands/{shard-spec.js → feature/shard-spec.js} +2 -2
- package/src/commands/{sprint-status.js → feature/sprint-status.js} +1 -1
- package/src/commands/{generate-context.js → generation/generate-context.js} +40 -40
- package/src/commands/{generate.js → generation/generate.js} +130 -3
- package/src/commands/generation/index.js +5 -0
- package/src/commands/index.js +16 -0
- package/src/commands/learning/capture-pattern.js +121 -0
- package/src/commands/learning/index.js +5 -0
- package/src/commands/learning/search-patterns.js +126 -0
- package/src/commands/{detect-agents.js → project/detect-agents.js} +178 -178
- package/src/commands/project/detect-workflow.js +174 -0
- package/src/commands/{detect.js → project/detect.js} +104 -104
- package/src/commands/{doctor.js → project/doctor.js} +356 -356
- package/src/commands/project/index.js +10 -0
- package/src/commands/{init.js → project/init.js} +305 -258
- package/src/commands/{sync.js → project/sync.js} +167 -167
- package/src/commands/{update.js → project/update.js} +240 -204
- package/src/commands/{advance-phase.js → state/advance-phase.js} +416 -266
- package/src/commands/state/approve.js +221 -0
- package/src/commands/state/index.js +8 -0
- package/src/commands/{rollback-phase.js → state/rollback-phase.js} +185 -185
- package/src/commands/{state.js → state/state.js} +334 -334
- package/src/commands/{validate-phase.js → state/validate-phase.js} +221 -221
- package/src/commands/tasks/index.js +4 -0
- package/src/commands/{task.js → tasks/task.js} +78 -78
- package/src/commands/templates/index.js +8 -0
- package/src/commands/templates/template-customize.js +101 -0
- package/src/commands/templates/template-list.js +128 -0
- package/src/commands/templates/template-render.js +95 -0
- package/src/commands/templates/template-show.js +131 -0
- package/src/commands/templates/template-validate.js +91 -0
- package/src/commands/utils/index.js +7 -0
- package/src/commands/utils/migrate-state.js +158 -0
- package/src/commands/{session-summary.js → utils/session-summary.js} +291 -291
- package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
- package/src/commands/utils/upgrade.js +346 -0
- package/src/commands/{analyze-blazor-concurrency.js → validation/analyze-blazor-concurrency.js} +193 -193
- package/src/commands/validation/index.js +8 -0
- package/src/commands/{lint-fluent.js → validation/lint-fluent.js} +352 -352
- package/src/commands/{validate-blazor-state.js → validation/validate-blazor-state.js} +210 -210
- package/src/commands/{validate-blazor.js → validation/validate-blazor.js} +156 -156
- package/src/commands/{validate-css.js → validation/validate-css.js} +84 -84
- package/src/core/index.js +10 -0
- package/src/core/registry/command-registry.js +302 -0
- package/src/core/registry/index.js +8 -0
- package/src/core/registry/validator-registry.js +204 -0
- package/src/core/state/index.js +8 -0
- package/src/core/state/phase-state-machine.js +214 -0
- package/src/{lib → core/state}/state-manager.js +572 -414
- package/src/core/templates/index.js +9 -0
- package/src/core/templates/template-data-sources.js +325 -0
- package/src/core/templates/template-registry.js +335 -0
- package/src/core/templates/template-renderer.js +477 -0
- package/src/core/templates/template-validator.js +296 -0
- package/src/core/workflows/index.js +7 -0
- package/src/core/workflows/workflow-detector.js +354 -0
- package/src/generator/config-generator.js +206 -0
- package/src/generator/templates/config.json.template +40 -0
- package/src/generator/templates/project.md.template +67 -0
- package/src/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
- package/src/lib/analysis/index.js +7 -0
- package/src/lib/checkpoints/checkpoint-hooks.js +258 -0
- package/src/lib/checkpoints/index.js +7 -0
- package/src/lib/detectors/config-detector.js +223 -223
- package/src/lib/detectors/conversation-analyzer.js +163 -163
- package/src/lib/{design-system-detector.js → detectors/design-system-detector.js} +187 -187
- package/src/lib/detectors/index.js +87 -84
- package/src/lib/detectors/standards-generator.js +275 -275
- package/src/lib/detectors/structure-detector.js +245 -245
- package/src/lib/{context-generator.js → generators/context-generator.js} +526 -516
- package/src/lib/generators/index.js +10 -0
- package/src/lib/generators/metadata-extractor.js +387 -0
- package/src/lib/{recap-generator.js → generators/recap-generator.js} +205 -205
- package/src/lib/learning/index.js +7 -0
- package/src/lib/orchestration/index.js +7 -0
- package/src/lib/{team-orchestrator.js → orchestration/team-orchestrator.js} +323 -323
- package/src/lib/stacks/index.js +7 -0
- package/src/lib/{stack-resolver.js → stacks/stack-resolver.js} +180 -148
- package/src/lib/standards/index.js +7 -0
- package/src/lib/{standards-context-injector.js → standards/standards-context-injector.js} +298 -288
- package/src/lib/troubleshooting/index.js +8 -0
- package/src/lib/{troubleshoot-grep.js → troubleshooting/troubleshoot-grep.js} +204 -204
- package/src/lib/{troubleshoot-index.js → troubleshooting/troubleshoot-index.js} +144 -144
- package/src/lib/validators/architecture/architecture-validator.js +387 -0
- package/src/lib/validators/architecture/index.js +7 -0
- package/src/lib/validators/architecture-validator.js +40 -367
- package/src/lib/{blazor-concurrency-analyzer.js → validators/blazor/blazor-concurrency-analyzer.js} +277 -288
- package/src/lib/{blazor-state-validator.js → validators/blazor/blazor-state-validator.js} +279 -291
- package/src/lib/{blazor-validator.js → validators/blazor/blazor-validator.js} +369 -374
- package/src/lib/validators/blazor/index.js +9 -0
- package/src/lib/validators/content/content-validator.js +351 -0
- package/src/lib/validators/content/index.js +7 -0
- package/src/lib/validators/content-validator.js +164 -0
- package/src/lib/validators/{contract-compliance-validator.js → contracts/contract-compliance-validator.js} +273 -273
- package/src/lib/validators/contracts/index.js +7 -0
- package/src/lib/{css-validator.js → validators/css/css-validator.js} +352 -352
- package/src/lib/validators/css/index.js +7 -0
- package/src/lib/validators/{design-system-validator.js → design-system/design-system-validator.js} +231 -231
- package/src/lib/validators/design-system/index.js +7 -0
- package/src/lib/validators/package-validator.js +41 -340
- package/src/lib/validators/packages/index.js +7 -0
- package/src/lib/validators/packages/package-validator.js +360 -0
- package/src/lib/validators/shared/index.js +12 -0
- package/src/lib/validators/shared/issue-counter.js +18 -0
- package/src/lib/validators/shared/result-formatter.js +124 -0
- package/src/lib/{spec-validator.js → validators/spec-validator.js} +258 -258
- package/src/lib/validators/ui/index.js +7 -0
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -0
- package/src/lib/validators/ui-contrast-validator.js +31 -409
- package/src/lib/{validation-runner.js → validators/validation-runner.js} +286 -284
- package/src/llm/analyzer.js +215 -0
- package/src/llm/environment-detector.js +43 -0
- package/src/llm/few-shot-examples.js +216 -0
- package/src/llm/project-config-schema.json +188 -0
- package/src/llm/prompt-builder.js +96 -0
- package/src/orchestrator.js +206 -0
- package/src/sanitizer/context-sanitizer.js +221 -0
- package/src/sanitizer/patterns.js +163 -0
- package/src/scanner/project-scanner.js +242 -0
- package/src/ui/diff-display.js +91 -0
- package/src/ui/interactive-wizard.js +96 -0
- package/src/ui/user-review.js +211 -0
- package/src/ui/wizard-questions.js +188 -0
- package/src/utils/color-utils.js +70 -0
- package/src/utils/file-copier.js +188 -189
- package/src/utils/process-handler.js +97 -0
- package/src/writer/file-writer.js +86 -0
- package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +3 -3
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/api-designer.md +59 -0
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +45 -255
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +33 -88
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +25 -89
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
- package/stacks/blazor-azure/.morph/config/agents.json +879 -764
- package/stacks/blazor-azure/.morph/hooks/{pre-commit-tests.sh → pre-commit/tests-csharp.sh} +3 -2
- package/stacks/blazor-azure/.morph/templates/.gitkeep +0 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +41 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +24 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +23 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +221 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +79 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +529 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +209 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +227 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +122 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-status.md +86 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +122 -0
- package/stacks/nextjs-supabase/.claude/settings.local.json +6 -0
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +30 -150
- package/stacks/nextjs-supabase/.morph/config/agents.json +345 -345
- package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +61 -0
- package/stacks/nextjs-supabase/.morph/templates/.gitkeep +0 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +35 -0
- package/stacks/nextjs-supabase/README.md +6 -15
- package/bin/render-template.js +0 -303
- package/bin/semantic-detect-agents.js +0 -247
- package/bin/validate-agents-skills.js +0 -257
- package/bin/validate-agents.js +0 -70
- package/bin/validate-phase.js +0 -263
- package/docs/examples.md +0 -328
- package/scripts/reorganize-skills.cjs +0 -175
- package/scripts/validate-agents-structure.cjs +0 -52
- package/scripts/validate-skills.cjs +0 -180
- package/src/commands/deploy.js +0 -780
- package/src/lib/continuous-validator.js +0 -421
- package/src/lib/decision-constraint-loader.js +0 -109
- package/src/lib/design-system-scaffolder.js +0 -299
- package/src/lib/hook-executor.js +0 -257
- package/src/lib/mockup-generator.js +0 -366
- package/src/lib/ui-detector.js +0 -350
- package/stacks/blazor-azure/.azure/README.md +0 -293
- package/stacks/blazor-azure/.azure/docs/azure-devops-setup.md +0 -454
- package/stacks/blazor-azure/.azure/docs/branch-strategy.md +0 -398
- package/stacks/blazor-azure/.azure/docs/local-development.md +0 -515
- package/stacks/blazor-azure/.azure/pipelines/pipeline-variables.yml +0 -34
- package/stacks/blazor-azure/.azure/pipelines/prod-pipeline.yml +0 -319
- package/stacks/blazor-azure/.azure/pipelines/staging-pipeline.yml +0 -234
- package/stacks/blazor-azure/.azure/pipelines/templates/build-dotnet.yml +0 -75
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-app-service.yml +0 -94
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-container-app.yml +0 -120
- package/stacks/blazor-azure/.azure/pipelines/templates/infra-deploy.yml +0 -90
- package/stacks/blazor-azure/.claude/settings.local.json +0 -15
- package/stacks/blazor-azure/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -392
- package/stacks/blazor-azure/.morph/docs/workflows/design-impl.md +0 -37
- package/stacks/blazor-azure/.morph/docs/workflows/enforcement-pipeline.md +0 -668
- package/stacks/blazor-azure/.morph/docs/workflows/fast-track.md +0 -29
- package/stacks/blazor-azure/.morph/docs/workflows/full-morph.md +0 -76
- package/stacks/blazor-azure/.morph/docs/workflows/standard.md +0 -44
- package/stacks/blazor-azure/.morph/docs/workflows/ui-refresh.md +0 -39
- package/stacks/blazor-azure/.morph/examples/api-nextjs/README.md +0 -241
- package/stacks/blazor-azure/.morph/examples/api-nextjs/contracts.ts +0 -307
- package/stacks/blazor-azure/.morph/examples/api-nextjs/spec.md +0 -399
- package/stacks/blazor-azure/.morph/examples/api-nextjs/tasks.md +0 -168
- package/stacks/blazor-azure/.morph/examples/micro-saas/README.md +0 -125
- package/stacks/blazor-azure/.morph/examples/micro-saas/contracts.cs +0 -358
- package/stacks/blazor-azure/.morph/examples/micro-saas/decisions.md +0 -246
- package/stacks/blazor-azure/.morph/examples/micro-saas/spec.md +0 -236
- package/stacks/blazor-azure/.morph/examples/micro-saas/tasks.md +0 -150
- package/stacks/blazor-azure/.morph/examples/multi-agent/README.md +0 -309
- package/stacks/blazor-azure/.morph/examples/multi-agent/contracts.cs +0 -433
- package/stacks/blazor-azure/.morph/examples/multi-agent/spec.md +0 -479
- package/stacks/blazor-azure/.morph/examples/multi-agent/tasks.md +0 -185
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/decisions.md +0 -158
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/proposal.md +0 -95
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/spec.md +0 -267
- package/stacks/blazor-azure/.morph/examples/state-v3.json +0 -188
- package/stacks/blazor-azure/.morph/hooks/README.md +0 -348
- package/stacks/blazor-azure/.morph/hooks/pre-commit-agents.sh +0 -24
- package/stacks/blazor-azure/.morph/hooks/pre-commit-all.sh +0 -48
- package/stacks/blazor-azure/.morph/hooks/pre-commit-specs.sh +0 -49
- package/stacks/blazor-azure/.morph/hooks/task-completed.js +0 -73
- package/stacks/blazor-azure/.morph/hooks/teammate-idle.js +0 -68
- package/stacks/blazor-azure/.morph/standards/agent-framework-blazor-ui.md +0 -359
- package/stacks/blazor-azure/.morph/standards/agent-framework-production.md +0 -410
- package/stacks/blazor-azure/.morph/standards/agent-framework-setup.md +0 -413
- package/stacks/blazor-azure/.morph/standards/agent-framework-workflows.md +0 -349
- package/stacks/blazor-azure/.morph/standards/agent-teams-workflow.md +0 -474
- package/stacks/blazor-azure/.morph/standards/architecture.md +0 -325
- package/stacks/blazor-azure/.morph/standards/azure.md +0 -605
- package/stacks/blazor-azure/.morph/standards/coding.md +0 -377
- package/stacks/blazor-azure/.morph/standards/dotnet10-migration.md +0 -520
- package/stacks/blazor-azure/.morph/standards/fluent-ui-setup.md +0 -590
- package/stacks/blazor-azure/.morph/standards/migration-guide.md +0 -514
- package/stacks/blazor-azure/.morph/standards/passkeys-auth.md +0 -423
- package/stacks/blazor-azure/.morph/standards/vector-search-rag.md +0 -536
- package/stacks/blazor-azure/.morph/templates/CONTEXT-FEATURE.md +0 -276
- package/stacks/blazor-azure/.morph/templates/CONTEXT.md +0 -170
- package/stacks/blazor-azure/.morph/templates/FluentDesignTheme.cs +0 -149
- package/stacks/blazor-azure/.morph/templates/MudTheme.cs +0 -281
- package/stacks/blazor-azure/.morph/templates/agent.cs +0 -163
- package/stacks/blazor-azure/.morph/templates/clarify-questions.md +0 -159
- package/stacks/blazor-azure/.morph/templates/component.razor +0 -239
- package/stacks/blazor-azure/.morph/templates/contracts/Commands.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/Entities.cs +0 -25
- package/stacks/blazor-azure/.morph/templates/contracts/Queries.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/README.md +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts.cs +0 -217
- package/stacks/blazor-azure/.morph/templates/decisions.md +0 -123
- package/stacks/blazor-azure/.morph/templates/design-system.css +0 -226
- package/stacks/blazor-azure/.morph/templates/infra/.dockerignore.example +0 -89
- package/stacks/blazor-azure/.morph/templates/infra/Dockerfile.example +0 -82
- package/stacks/blazor-azure/.morph/templates/infra/README.md +0 -286
- package/stacks/blazor-azure/.morph/templates/infra/app-insights.bicep +0 -63
- package/stacks/blazor-azure/.morph/templates/infra/app-service.bicep +0 -164
- package/stacks/blazor-azure/.morph/templates/infra/azure-pipelines-deploy.yml +0 -480
- package/stacks/blazor-azure/.morph/templates/infra/container-app-env.bicep +0 -49
- package/stacks/blazor-azure/.morph/templates/infra/container-app.bicep +0 -156
- package/stacks/blazor-azure/.morph/templates/infra/deploy-checklist.md +0 -426
- package/stacks/blazor-azure/.morph/templates/infra/deploy.ps1 +0 -229
- package/stacks/blazor-azure/.morph/templates/infra/deploy.sh +0 -208
- package/stacks/blazor-azure/.morph/templates/infra/key-vault.bicep +0 -91
- package/stacks/blazor-azure/.morph/templates/infra/main.bicep +0 -189
- package/stacks/blazor-azure/.morph/templates/infra/parameters.dev.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.prod.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.staging.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/sql-database.bicep +0 -103
- package/stacks/blazor-azure/.morph/templates/infra/storage.bicep +0 -106
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-client.cs +0 -387
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-webhook.cs +0 -351
- package/stacks/blazor-azure/.morph/templates/integrations/azure-identity-config.cs +0 -288
- package/stacks/blazor-azure/.morph/templates/integrations/clerk-config.cs +0 -258
- package/stacks/blazor-azure/.morph/templates/job.cs +0 -171
- package/stacks/blazor-azure/.morph/templates/migration.cs +0 -83
- package/stacks/blazor-azure/.morph/templates/proposal.md +0 -141
- package/stacks/blazor-azure/.morph/templates/recap.md +0 -94
- package/stacks/blazor-azure/.morph/templates/repository.cs +0 -141
- package/stacks/blazor-azure/.morph/templates/saas/subscription.cs +0 -347
- package/stacks/blazor-azure/.morph/templates/saas/tenant.cs +0 -338
- package/stacks/blazor-azure/.morph/templates/service.cs +0 -139
- package/stacks/blazor-azure/.morph/templates/simulation.md +0 -353
- package/stacks/blazor-azure/.morph/templates/spec.md +0 -149
- package/stacks/blazor-azure/.morph/templates/sprint-status.yaml +0 -68
- package/stacks/blazor-azure/.morph/templates/state.template.json +0 -222
- package/stacks/blazor-azure/.morph/templates/story.md +0 -143
- package/stacks/blazor-azure/.morph/templates/tasks.md +0 -257
- package/stacks/blazor-azure/.morph/templates/test.cs +0 -239
- package/stacks/blazor-azure/.morph/templates/ui-components.md +0 -362
- package/stacks/blazor-azure/.morph/templates/ui-design-system.md +0 -286
- package/stacks/blazor-azure/.morph/templates/ui-flows.md +0 -336
- package/stacks/blazor-azure/.morph/templates/ui-mockups.md +0 -133
- package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +0 -169
- package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +0 -247
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +0 -697
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +0 -85
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +0 -86
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +0 -498
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +0 -121
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +0 -138
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +0 -162
- package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +0 -191
- package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +0 -193
- package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +0 -171
- package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +0 -164
- package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +0 -179
- package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +0 -148
- package/stacks/nextjs-supabase/.morph/templates/contracts.cs +0 -173
- package/stacks/nextjs-supabase/.morph/templates/contracts.ts +0 -168
- package/stacks/nextjs-supabase/.morph/templates/decisions.md +0 -115
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +0 -38
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +0 -48
- package/stacks/nextjs-supabase/.morph/templates/proposal.md +0 -145
- package/stacks/nextjs-supabase/.morph/templates/recap.md +0 -134
- package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +0 -57
- package/stacks/nextjs-supabase/.morph/templates/spec.md +0 -231
- package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +0 -100
- package/stacks/nextjs-supabase/.morph/templates/tasks.md +0 -257
- /package/src/lib/{design-system-generator.js → generators/design-system-generator.js} +0 -0
- /package/src/lib/{learning-system.js → learning/learning-system.js} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview LLMAnalyzer - Analyzes project context using Claude Code's LLM
|
|
3
|
+
* @module morph-spec/llm/analyzer
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { detectClaudeCode, isInteractive } from './environment-detector.js';
|
|
8
|
+
import { buildPrompt } from './prompt-builder.js';
|
|
9
|
+
import Ajv from 'ajv';
|
|
10
|
+
import projectConfigSchema from './project-config-schema.json' with { type: 'json' };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {import('../types/index.js').SanitizedContext} SanitizedContext
|
|
14
|
+
* @typedef {import('../types/index.js').ProjectConfig} ProjectConfig
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* LLM Analysis Error
|
|
19
|
+
*/
|
|
20
|
+
export class LLMAnalysisError extends Error {
|
|
21
|
+
constructor(message, statusCode = 500, attempts = 0, originalError = null) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'LLMAnalysisError';
|
|
24
|
+
this.statusCode = statusCode;
|
|
25
|
+
this.attempts = attempts;
|
|
26
|
+
this.originalError = originalError;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Validation Error
|
|
32
|
+
*/
|
|
33
|
+
export class ValidationError extends Error {
|
|
34
|
+
constructor(message, field, value, schema = null) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'ValidationError';
|
|
37
|
+
this.field = field;
|
|
38
|
+
this.value = value;
|
|
39
|
+
this.schema = schema;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* LLMAnalyzer - Analyzes project context using Claude Code's embedded LLM
|
|
45
|
+
* @class
|
|
46
|
+
*/
|
|
47
|
+
export class LLMAnalyzer {
|
|
48
|
+
constructor() {
|
|
49
|
+
this.ajv = new Ajv({ allErrors: true });
|
|
50
|
+
this.validateSchema = this.ajv.compile(projectConfigSchema);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Analyze project context using Claude Code's LLM
|
|
55
|
+
* @param {SanitizedContext} context - Sanitized project context
|
|
56
|
+
* @param {Object} [options] - Analysis options
|
|
57
|
+
* @param {number} [options.timeout] - Timeout in ms (default: 60000 for user, no timeout for LLM)
|
|
58
|
+
* @returns {Promise<ProjectConfig>}
|
|
59
|
+
* @throws {LLMAnalysisError} If analysis fails
|
|
60
|
+
*/
|
|
61
|
+
async analyze(context, options = {}) {
|
|
62
|
+
// Check if Claude Code is available
|
|
63
|
+
if (!detectClaudeCode()) {
|
|
64
|
+
throw new LLMAnalysisError(
|
|
65
|
+
'Claude Code environment not detected. This feature requires Claude Code CLI.',
|
|
66
|
+
503,
|
|
67
|
+
0
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Build the prompt
|
|
72
|
+
const prompt = buildPrompt(context);
|
|
73
|
+
|
|
74
|
+
// Determine timeout: 60s for interactive (user present), no timeout for LLM-only
|
|
75
|
+
const timeout = options.timeout || (isInteractive() ? 60000 : 0);
|
|
76
|
+
|
|
77
|
+
// Invoke Claude Code LLM
|
|
78
|
+
const response = await this.invokeLLM(prompt, { timeout });
|
|
79
|
+
|
|
80
|
+
// Parse and validate JSON response
|
|
81
|
+
const projectConfig = this.parseJsonResponse(response);
|
|
82
|
+
|
|
83
|
+
return projectConfig;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Build structured prompt for LLM
|
|
88
|
+
* @param {SanitizedContext} context - Sanitized context
|
|
89
|
+
* @returns {string} Prompt text
|
|
90
|
+
*/
|
|
91
|
+
buildPrompt(context) {
|
|
92
|
+
return buildPrompt(context);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Invoke Claude Code's LLM via spawning a subprocess
|
|
97
|
+
*
|
|
98
|
+
* IMPLEMENTATION NOTE: This is a placeholder implementation.
|
|
99
|
+
* The actual Claude Code invocation mechanism depends on how Claude Code exposes its LLM.
|
|
100
|
+
*
|
|
101
|
+
* Possible approaches:
|
|
102
|
+
* 1. Spawn `claude` CLI with a special flag for JSON mode
|
|
103
|
+
* 2. Use an internal API/IPC mechanism
|
|
104
|
+
* 3. Write prompt to a temp file and invoke Claude Code agent
|
|
105
|
+
*
|
|
106
|
+
* For now, we'll simulate the response for testing purposes.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} prompt - Prompt text
|
|
109
|
+
* @param {Object} options - Invocation options
|
|
110
|
+
* @param {number} options.timeout - Timeout in ms (0 = no timeout)
|
|
111
|
+
* @returns {Promise<string>} JSON response from LLM
|
|
112
|
+
* @throws {LLMAnalysisError}
|
|
113
|
+
*/
|
|
114
|
+
async invokeLLM(prompt, options = {}) {
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
// TODO: Replace with actual Claude Code invocation
|
|
117
|
+
// For now, this is a placeholder that would need to be implemented
|
|
118
|
+
// based on how Claude Code exposes its LLM for programmatic access
|
|
119
|
+
|
|
120
|
+
// Example approach (pseudo-code):
|
|
121
|
+
// const claudeProcess = spawn('claude', ['--mode=json', '--prompt', prompt]);
|
|
122
|
+
|
|
123
|
+
// Placeholder: Simulate a timeout if needed
|
|
124
|
+
const { timeout } = options;
|
|
125
|
+
|
|
126
|
+
let output = '';
|
|
127
|
+
let errorOutput = '';
|
|
128
|
+
|
|
129
|
+
// Simulated response for testing (to be replaced with actual Claude Code invocation)
|
|
130
|
+
// In real implementation, this would spawn Claude Code process:
|
|
131
|
+
/*
|
|
132
|
+
const claudeProcess = spawn('claude-code', [
|
|
133
|
+
'--json',
|
|
134
|
+
'--prompt-from-stdin'
|
|
135
|
+
]);
|
|
136
|
+
|
|
137
|
+
claudeProcess.stdin.write(prompt);
|
|
138
|
+
claudeProcess.stdin.end();
|
|
139
|
+
|
|
140
|
+
claudeProcess.stdout.on('data', (data) => {
|
|
141
|
+
output += data.toString();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
claudeProcess.stderr.on('data', (data) => {
|
|
145
|
+
errorOutput += data.toString();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
claudeProcess.on('close', (code) => {
|
|
149
|
+
if (code !== 0) {
|
|
150
|
+
reject(new LLMAnalysisError(
|
|
151
|
+
`Claude Code exited with code ${code}: ${errorOutput}`,
|
|
152
|
+
500,
|
|
153
|
+
1
|
|
154
|
+
));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
resolve(output);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (timeout > 0) {
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
claudeProcess.kill();
|
|
164
|
+
reject(new LLMAnalysisError('LLM analysis timeout', 504, 1));
|
|
165
|
+
}, timeout);
|
|
166
|
+
}
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
// For now, reject with a "not implemented" error
|
|
170
|
+
// This will be replaced when we know the exact Claude Code invocation mechanism
|
|
171
|
+
reject(new LLMAnalysisError(
|
|
172
|
+
'LLM invocation not yet implemented. Awaiting Claude Code API documentation.',
|
|
173
|
+
501,
|
|
174
|
+
0
|
|
175
|
+
));
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Parse and validate LLM JSON response
|
|
181
|
+
* @param {string} response - Raw LLM response
|
|
182
|
+
* @returns {ProjectConfig}
|
|
183
|
+
* @throws {ValidationError} If response doesn't match schema
|
|
184
|
+
*/
|
|
185
|
+
parseJsonResponse(response) {
|
|
186
|
+
// Try to parse JSON
|
|
187
|
+
let parsed;
|
|
188
|
+
try {
|
|
189
|
+
parsed = JSON.parse(response);
|
|
190
|
+
} catch (error) {
|
|
191
|
+
throw new ValidationError(
|
|
192
|
+
'LLM response is not valid JSON',
|
|
193
|
+
'response',
|
|
194
|
+
response,
|
|
195
|
+
null
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Validate against schema
|
|
200
|
+
const valid = this.validateSchema(parsed);
|
|
201
|
+
if (!valid) {
|
|
202
|
+
const errors = this.validateSchema.errors || [];
|
|
203
|
+
const errorMessages = errors.map(err => `${err.instancePath} ${err.message}`).join(', ');
|
|
204
|
+
|
|
205
|
+
throw new ValidationError(
|
|
206
|
+
`Schema validation failed: ${errorMessages}`,
|
|
207
|
+
'schema',
|
|
208
|
+
parsed,
|
|
209
|
+
projectConfigSchema
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return parsed;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Environment Detector - Detects if running in Claude Code
|
|
3
|
+
* @module morph-spec/llm/environment-detector
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Detect if running inside Claude Code environment
|
|
8
|
+
* @returns {boolean} True if Claude Code is available
|
|
9
|
+
*/
|
|
10
|
+
export function detectClaudeCode() {
|
|
11
|
+
// Check for environment variables that Claude Code sets
|
|
12
|
+
const claudeEnvVars = [
|
|
13
|
+
'CLAUDE_CODE_SESSION',
|
|
14
|
+
'CLAUDE_API_KEY',
|
|
15
|
+
'ANTHROPIC_API_KEY'
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
// Check if any Claude-specific env var is set
|
|
19
|
+
const hasClaudeEnv = claudeEnvVars.some(varName => process.env[varName]);
|
|
20
|
+
|
|
21
|
+
// Check if we can detect Claude Code CLI
|
|
22
|
+
// (This is a heuristic - Claude Code sets these when running)
|
|
23
|
+
const hasClaudeCLI = process.env.TERM_PROGRAM === 'claude' ||
|
|
24
|
+
process.env.CLAUDE_CODE_VERSION;
|
|
25
|
+
|
|
26
|
+
return hasClaudeEnv || hasClaudeCLI;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Get Claude Code version if available
|
|
31
|
+
* @returns {string|null} Version string or null
|
|
32
|
+
*/
|
|
33
|
+
export function getClaudeCodeVersion() {
|
|
34
|
+
return process.env.CLAUDE_CODE_VERSION || null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if running in interactive mode (user is present)
|
|
39
|
+
* @returns {boolean} True if interactive
|
|
40
|
+
*/
|
|
41
|
+
export function isInteractive() {
|
|
42
|
+
return process.stdout.isTTY && process.stdin.isTTY;
|
|
43
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Few-shot examples for LLM prompt
|
|
3
|
+
* @module morph-spec/llm/few-shot-examples
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Example 1: Next.js + Supabase stack
|
|
8
|
+
*/
|
|
9
|
+
export const EXAMPLE_NEXTJS_SUPABASE = {
|
|
10
|
+
input: {
|
|
11
|
+
packageJson: {
|
|
12
|
+
name: 'my-nextjs-app',
|
|
13
|
+
dependencies: ['next', 'react', '@supabase/supabase-js', 'tailwindcss'],
|
|
14
|
+
devDependencies: ['typescript', 'eslint'],
|
|
15
|
+
scripts: { dev: 'next dev', build: 'next build' },
|
|
16
|
+
type: 'module'
|
|
17
|
+
},
|
|
18
|
+
csprojFilenames: [],
|
|
19
|
+
hasSolution: false,
|
|
20
|
+
readmeSummary: 'A modern web application built with Next.js 15 and Supabase...',
|
|
21
|
+
claudeMdSummary: null,
|
|
22
|
+
structure: {
|
|
23
|
+
hasSrc: true,
|
|
24
|
+
hasBackend: false,
|
|
25
|
+
hasFrontend: true,
|
|
26
|
+
hasTests: true,
|
|
27
|
+
topLevelDirs: ['src', 'app', 'components', 'lib', 'public', 'test'],
|
|
28
|
+
pattern: 'single-project'
|
|
29
|
+
},
|
|
30
|
+
infraSummary: {
|
|
31
|
+
dockerfilesCount: 1,
|
|
32
|
+
dockerComposeCount: 1,
|
|
33
|
+
bicepFilesCount: 0,
|
|
34
|
+
pipelinesCount: 0,
|
|
35
|
+
hasAzure: false,
|
|
36
|
+
hasDocker: true,
|
|
37
|
+
hasDevOps: false
|
|
38
|
+
},
|
|
39
|
+
gitRemoteDomain: 'github.com',
|
|
40
|
+
totalFiles: 60
|
|
41
|
+
},
|
|
42
|
+
output: {
|
|
43
|
+
name: 'my-nextjs-app',
|
|
44
|
+
description: 'A modern web application built with Next.js 15 and Supabase for backend',
|
|
45
|
+
type: 'nextjs',
|
|
46
|
+
stack: {
|
|
47
|
+
frontend: {
|
|
48
|
+
tech: 'Next.js',
|
|
49
|
+
version: '15',
|
|
50
|
+
details: 'App Router with Server Components'
|
|
51
|
+
},
|
|
52
|
+
backend: {
|
|
53
|
+
tech: 'Supabase',
|
|
54
|
+
version: 'latest',
|
|
55
|
+
details: 'PostgreSQL with real-time features'
|
|
56
|
+
},
|
|
57
|
+
database: {
|
|
58
|
+
tech: 'PostgreSQL',
|
|
59
|
+
version: '16',
|
|
60
|
+
details: 'Managed by Supabase'
|
|
61
|
+
},
|
|
62
|
+
hosting: 'Docker'
|
|
63
|
+
},
|
|
64
|
+
architecture: 'layered',
|
|
65
|
+
projectStructure: 'Next.js App Router: app/ for routes, components/ for UI, lib/ for utilities',
|
|
66
|
+
conventions: 'ESM modules, TypeScript, functional components with hooks',
|
|
67
|
+
repository: null,
|
|
68
|
+
hasAzure: false,
|
|
69
|
+
hasDocker: true,
|
|
70
|
+
hasDevOps: false,
|
|
71
|
+
confidence: 95,
|
|
72
|
+
warnings: []
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Example 2: Blazor Server + .NET + Azure SQL
|
|
78
|
+
*/
|
|
79
|
+
export const EXAMPLE_BLAZOR_AZURE = {
|
|
80
|
+
input: {
|
|
81
|
+
packageJson: null,
|
|
82
|
+
csprojFilenames: ['MyApp.Web.csproj', 'MyApp.Domain.csproj', 'MyApp.Infrastructure.csproj'],
|
|
83
|
+
hasSolution: true,
|
|
84
|
+
readmeSummary: 'Enterprise web application built with Blazor Server and .NET 10...',
|
|
85
|
+
claudeMdSummary: 'Stack: Blazor Server + .NET 10 + Azure SQL. Architecture: Clean Architecture with DDD patterns...',
|
|
86
|
+
structure: {
|
|
87
|
+
hasSrc: true,
|
|
88
|
+
hasBackend: false,
|
|
89
|
+
hasFrontend: false,
|
|
90
|
+
hasTests: true,
|
|
91
|
+
topLevelDirs: ['src', 'test', 'infra', 'docs'],
|
|
92
|
+
pattern: 'single-project'
|
|
93
|
+
},
|
|
94
|
+
infraSummary: {
|
|
95
|
+
dockerfilesCount: 1,
|
|
96
|
+
dockerComposeCount: 0,
|
|
97
|
+
bicepFilesCount: 5,
|
|
98
|
+
pipelinesCount: 1,
|
|
99
|
+
hasAzure: true,
|
|
100
|
+
hasDocker: true,
|
|
101
|
+
hasDevOps: true
|
|
102
|
+
},
|
|
103
|
+
gitRemoteDomain: 'github.com',
|
|
104
|
+
totalFiles: 120
|
|
105
|
+
},
|
|
106
|
+
output: {
|
|
107
|
+
name: 'MyApp',
|
|
108
|
+
description: 'Enterprise web application built with Blazor Server and .NET 10, deployed to Azure',
|
|
109
|
+
type: 'blazor-server',
|
|
110
|
+
stack: {
|
|
111
|
+
frontend: {
|
|
112
|
+
tech: 'Blazor',
|
|
113
|
+
version: '10',
|
|
114
|
+
details: 'Blazor Server with SignalR'
|
|
115
|
+
},
|
|
116
|
+
backend: {
|
|
117
|
+
tech: '.NET',
|
|
118
|
+
version: '10',
|
|
119
|
+
details: 'Minimal API with Clean Architecture'
|
|
120
|
+
},
|
|
121
|
+
database: {
|
|
122
|
+
tech: 'Azure SQL',
|
|
123
|
+
version: 'latest',
|
|
124
|
+
details: 'Entity Framework Core'
|
|
125
|
+
},
|
|
126
|
+
hosting: 'Azure'
|
|
127
|
+
},
|
|
128
|
+
architecture: 'clean-architecture',
|
|
129
|
+
projectStructure: 'Clean Architecture: Domain (entities), Application (use cases), Infrastructure (EF Core), Web (Blazor UI)',
|
|
130
|
+
conventions: 'C# 14, nullable reference types, record types for DTOs, async/await, PascalCase',
|
|
131
|
+
repository: null,
|
|
132
|
+
hasAzure: true,
|
|
133
|
+
hasDocker: true,
|
|
134
|
+
hasDevOps: true,
|
|
135
|
+
confidence: 98,
|
|
136
|
+
warnings: []
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Example 3: Monorepo with Next.js + .NET API
|
|
142
|
+
*/
|
|
143
|
+
export const EXAMPLE_MONOREPO = {
|
|
144
|
+
input: {
|
|
145
|
+
packageJson: {
|
|
146
|
+
name: 'monorepo-app',
|
|
147
|
+
dependencies: [],
|
|
148
|
+
devDependencies: ['turbo', 'lerna'],
|
|
149
|
+
scripts: { dev: 'turbo dev', build: 'turbo build' },
|
|
150
|
+
type: 'module'
|
|
151
|
+
},
|
|
152
|
+
csprojFilenames: ['backend/Api/Api.csproj', 'backend/Domain/Domain.csproj'],
|
|
153
|
+
hasSolution: true,
|
|
154
|
+
readmeSummary: 'Monorepo application with Next.js frontend and .NET backend API...',
|
|
155
|
+
claudeMdSummary: null,
|
|
156
|
+
structure: {
|
|
157
|
+
hasSrc: false,
|
|
158
|
+
hasBackend: true,
|
|
159
|
+
hasFrontend: true,
|
|
160
|
+
hasTests: true,
|
|
161
|
+
topLevelDirs: ['frontend', 'backend', 'packages', 'test'],
|
|
162
|
+
pattern: 'monorepo'
|
|
163
|
+
},
|
|
164
|
+
infraSummary: {
|
|
165
|
+
dockerfilesCount: 2,
|
|
166
|
+
dockerComposeCount: 1,
|
|
167
|
+
bicepFilesCount: 0,
|
|
168
|
+
pipelinesCount: 1,
|
|
169
|
+
hasAzure: false,
|
|
170
|
+
hasDocker: true,
|
|
171
|
+
hasDevOps: true
|
|
172
|
+
},
|
|
173
|
+
gitRemoteDomain: 'github.com',
|
|
174
|
+
totalFiles: 200
|
|
175
|
+
},
|
|
176
|
+
output: {
|
|
177
|
+
name: 'monorepo-app',
|
|
178
|
+
description: 'Monorepo application with Next.js frontend and .NET backend API',
|
|
179
|
+
type: 'monorepo',
|
|
180
|
+
stack: {
|
|
181
|
+
frontend: {
|
|
182
|
+
tech: 'Next.js',
|
|
183
|
+
version: 'latest',
|
|
184
|
+
details: 'App Router'
|
|
185
|
+
},
|
|
186
|
+
backend: {
|
|
187
|
+
tech: '.NET',
|
|
188
|
+
version: 'latest',
|
|
189
|
+
details: 'Minimal API'
|
|
190
|
+
},
|
|
191
|
+
database: null,
|
|
192
|
+
hosting: 'Docker'
|
|
193
|
+
},
|
|
194
|
+
architecture: 'microservices',
|
|
195
|
+
projectStructure: 'Monorepo: frontend/ (Next.js), backend/ (. NET API), packages/ (shared libs)',
|
|
196
|
+
conventions: 'Turbo for monorepo orchestration, ESM for frontend, C# for backend',
|
|
197
|
+
repository: null,
|
|
198
|
+
hasAzure: false,
|
|
199
|
+
hasDocker: true,
|
|
200
|
+
hasDevOps: true,
|
|
201
|
+
confidence: 90,
|
|
202
|
+
warnings: ['Database technology not detected - may not persist data']
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Get all few-shot examples
|
|
208
|
+
* @returns {Array} Array of examples
|
|
209
|
+
*/
|
|
210
|
+
export function getFewShotExamples() {
|
|
211
|
+
return [
|
|
212
|
+
EXAMPLE_NEXTJS_SUPABASE,
|
|
213
|
+
EXAMPLE_BLAZOR_AZURE,
|
|
214
|
+
EXAMPLE_MONOREPO
|
|
215
|
+
];
|
|
216
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "ProjectConfig",
|
|
4
|
+
"description": "Project configuration detected by LLM",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"name",
|
|
8
|
+
"description",
|
|
9
|
+
"type",
|
|
10
|
+
"stack",
|
|
11
|
+
"architecture",
|
|
12
|
+
"projectStructure",
|
|
13
|
+
"conventions",
|
|
14
|
+
"hasAzure",
|
|
15
|
+
"hasDocker",
|
|
16
|
+
"hasDevOps",
|
|
17
|
+
"confidence",
|
|
18
|
+
"warnings"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"name": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"description": "Project name (from package.json or repository)"
|
|
25
|
+
},
|
|
26
|
+
"description": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"minLength": 10,
|
|
29
|
+
"maxLength": 500,
|
|
30
|
+
"description": "Project description (1-2 sentences)"
|
|
31
|
+
},
|
|
32
|
+
"type": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"enum": [
|
|
35
|
+
"monorepo",
|
|
36
|
+
"blazor-server",
|
|
37
|
+
"nextjs",
|
|
38
|
+
"cli-tool",
|
|
39
|
+
"dotnet-api",
|
|
40
|
+
"other"
|
|
41
|
+
],
|
|
42
|
+
"description": "Project type"
|
|
43
|
+
},
|
|
44
|
+
"stack": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"required": ["backend"],
|
|
47
|
+
"properties": {
|
|
48
|
+
"frontend": {
|
|
49
|
+
"oneOf": [
|
|
50
|
+
{
|
|
51
|
+
"type": "object",
|
|
52
|
+
"required": ["tech", "version"],
|
|
53
|
+
"properties": {
|
|
54
|
+
"tech": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"description": "Frontend technology (e.g., Next.js, Blazor)"
|
|
57
|
+
},
|
|
58
|
+
"version": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"description": "Version (e.g., 15, 10)"
|
|
61
|
+
},
|
|
62
|
+
"details": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Additional details (e.g., App Router, Server Components)"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"type": "null"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"backend": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"required": ["tech", "version"],
|
|
76
|
+
"properties": {
|
|
77
|
+
"tech": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Backend technology (e.g., .NET, Supabase, Node.js)"
|
|
80
|
+
},
|
|
81
|
+
"version": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Version (e.g., 10, 18, latest)"
|
|
84
|
+
},
|
|
85
|
+
"details": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "Additional details (e.g., Minimal API, Express)"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"database": {
|
|
92
|
+
"oneOf": [
|
|
93
|
+
{
|
|
94
|
+
"type": "object",
|
|
95
|
+
"required": ["tech", "version"],
|
|
96
|
+
"properties": {
|
|
97
|
+
"tech": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "Database technology (e.g., PostgreSQL, Azure SQL)"
|
|
100
|
+
},
|
|
101
|
+
"version": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"description": "Version"
|
|
104
|
+
},
|
|
105
|
+
"details": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"description": "Additional details"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"type": "null"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
"hosting": {
|
|
117
|
+
"oneOf": [
|
|
118
|
+
{
|
|
119
|
+
"type": "string",
|
|
120
|
+
"description": "Hosting platform (e.g., Azure, Vercel, Docker)"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"type": "null"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
"architecture": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"enum": [
|
|
132
|
+
"clean-architecture",
|
|
133
|
+
"monolith",
|
|
134
|
+
"microservices",
|
|
135
|
+
"layered",
|
|
136
|
+
"other"
|
|
137
|
+
],
|
|
138
|
+
"description": "Architecture pattern"
|
|
139
|
+
},
|
|
140
|
+
"projectStructure": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"minLength": 10,
|
|
143
|
+
"description": "Description of folder structure"
|
|
144
|
+
},
|
|
145
|
+
"conventions": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"minLength": 5,
|
|
148
|
+
"description": "Detected code conventions"
|
|
149
|
+
},
|
|
150
|
+
"repository": {
|
|
151
|
+
"oneOf": [
|
|
152
|
+
{
|
|
153
|
+
"type": "string",
|
|
154
|
+
"format": "uri"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"type": "null"
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
"description": "Git repository URL"
|
|
161
|
+
},
|
|
162
|
+
"hasAzure": {
|
|
163
|
+
"type": "boolean",
|
|
164
|
+
"description": "Uses Azure infrastructure"
|
|
165
|
+
},
|
|
166
|
+
"hasDocker": {
|
|
167
|
+
"type": "boolean",
|
|
168
|
+
"description": "Uses Docker containerization"
|
|
169
|
+
},
|
|
170
|
+
"hasDevOps": {
|
|
171
|
+
"type": "boolean",
|
|
172
|
+
"description": "Uses CI/CD pipelines"
|
|
173
|
+
},
|
|
174
|
+
"confidence": {
|
|
175
|
+
"type": "number",
|
|
176
|
+
"minimum": 0,
|
|
177
|
+
"maximum": 100,
|
|
178
|
+
"description": "LLM confidence score (0-100)"
|
|
179
|
+
},
|
|
180
|
+
"warnings": {
|
|
181
|
+
"type": "array",
|
|
182
|
+
"items": {
|
|
183
|
+
"type": "string"
|
|
184
|
+
},
|
|
185
|
+
"description": "Warnings or uncertainties detected"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|