@polymorphism-tech/morph-spec 3.2.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 +352 -7
- package/README.md +1 -14
- package/bin/detect-agents.js +1 -1
- package/bin/morph-spec.js +122 -34
- package/bin/validate.js +1 -1
- package/docs/getting-started.md +0 -5
- 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 +1 -1
- package/src/commands/agents/index.js +4 -0
- package/src/commands/{spawn-team.js → agents/spawn-team.js} +172 -172
- 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} +4 -4
- package/src/commands/generation/index.js +5 -0
- package/src/commands/index.js +16 -0
- package/src/commands/{capture-pattern.js → learning/capture-pattern.js} +121 -121
- package/src/commands/learning/index.js +5 -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 -295
- package/src/commands/{sync.js → project/sync.js} +167 -167
- package/src/commands/{update.js → project/update.js} +240 -240
- package/src/commands/{advance-phase.js → state/advance-phase.js} +416 -357
- package/src/commands/{approve.js → state/approve.js} +221 -221
- 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/{session-summary.js → utils/session-summary.js} +291 -291
- package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
- 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/{lib → core/state}/phase-state-machine.js +214 -214
- package/src/{lib → core/state}/state-manager.js +572 -534
- package/src/core/templates/index.js +9 -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/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
- package/src/lib/analysis/index.js +7 -0
- package/src/lib/{checkpoint-hooks.js → checkpoints/checkpoint-hooks.js} +258 -258
- 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/{metadata-extractor.js → generators/metadata-extractor.js} +387 -380
- 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 -351
- 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/ui/wizard-questions.js +0 -2
- 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/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/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/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 -349
- 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/src/llm/schema-validator.js +0 -121
- package/src/sanitizer/.gitkeep +0 -0
- package/src/scanner/.gitkeep +0 -0
- package/src/types/index.js +0 -477
- package/src/ui/.gitkeep +0 -0
- package/src/writer/.gitkeep +0 -0
- 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/commands/{search-patterns.js → learning/search-patterns.js} +0 -0
- /package/src/commands/{migrate-state.js → utils/migrate-state.js} +0 -0
- /package/src/commands/{upgrade.js → utils/upgrade.js} +0 -0
- /package/src/{lib → core/templates}/template-data-sources.js +0 -0
- /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
- /package/{src/generator → stacks/blazor-azure/.morph/templates}/.gitkeep +0 -0
- /package/{src/llm → stacks/nextjs-supabase/.morph/templates}/.gitkeep +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Template System
|
|
3
|
+
*
|
|
4
|
+
* Template registry, rendering, and data sources for code generation.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { TemplateRegistry } from './template-registry.js';
|
|
8
|
+
export { TemplateRenderer } from './template-renderer.js';
|
|
9
|
+
export { TemplateDataSources } from './template-data-sources.js';
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Registry - Discovery and metadata API for all framework templates.
|
|
3
|
+
*
|
|
4
|
+
* Provides programmatic access to REGISTRY.json for:
|
|
5
|
+
* - Template discovery by category, phase, stack
|
|
6
|
+
* - Template metadata lookup
|
|
7
|
+
* - Path resolution with fallback logic
|
|
8
|
+
* - Validation of template existence
|
|
9
|
+
*
|
|
10
|
+
* @module template-registry
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { readFileSync, existsSync } from 'fs';
|
|
14
|
+
import { join, dirname } from 'path';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
|
|
17
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
+
const __dirname = dirname(__filename);
|
|
19
|
+
|
|
20
|
+
// Cache for loaded registry
|
|
21
|
+
let _cachedRegistry = null;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Load the template registry from REGISTRY.json.
|
|
25
|
+
*
|
|
26
|
+
* @param {string} [projectPath] - Optional project path (defaults to framework root)
|
|
27
|
+
* @returns {Object} Parsed registry object
|
|
28
|
+
* @throws {Error} If registry file not found or invalid JSON
|
|
29
|
+
*/
|
|
30
|
+
export function loadTemplateRegistry(projectPath = null) {
|
|
31
|
+
// Return cached if already loaded
|
|
32
|
+
if (_cachedRegistry) {
|
|
33
|
+
return _cachedRegistry;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Default to framework registry
|
|
37
|
+
const registryPath = projectPath
|
|
38
|
+
? join(projectPath, 'framework/templates/REGISTRY.json')
|
|
39
|
+
: join(__dirname, '../../framework/templates/REGISTRY.json');
|
|
40
|
+
|
|
41
|
+
if (!existsSync(registryPath)) {
|
|
42
|
+
throw new Error(`Template registry not found: ${registryPath}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const content = readFileSync(registryPath, 'utf-8');
|
|
47
|
+
_cachedRegistry = JSON.parse(content);
|
|
48
|
+
return _cachedRegistry;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
throw new Error(`Failed to parse template registry: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Clear cached registry (useful for testing).
|
|
56
|
+
*/
|
|
57
|
+
export function clearRegistryCache() {
|
|
58
|
+
_cachedRegistry = null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get all templates from registry.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} [projectPath] - Optional project path
|
|
65
|
+
* @returns {Array} Array of template objects
|
|
66
|
+
*/
|
|
67
|
+
export function getAllTemplates(projectPath = null) {
|
|
68
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
69
|
+
return registry.templates || [];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get template by ID.
|
|
74
|
+
*
|
|
75
|
+
* @param {string} templateId - Template identifier (e.g., 'proposal', 'spec')
|
|
76
|
+
* @param {string} [projectPath] - Optional project path
|
|
77
|
+
* @returns {Object|null} Template object or null if not found
|
|
78
|
+
*/
|
|
79
|
+
export function getTemplateById(templateId, projectPath = null) {
|
|
80
|
+
const templates = getAllTemplates(projectPath);
|
|
81
|
+
return templates.find(t => t.id === templateId) || null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get templates by category.
|
|
86
|
+
*
|
|
87
|
+
* @param {string} category - Category ('documentation', 'code', 'infrastructure', 'context', 'examples')
|
|
88
|
+
* @param {string} [projectPath] - Optional project path
|
|
89
|
+
* @returns {Array} Filtered template array
|
|
90
|
+
*/
|
|
91
|
+
export function getTemplatesByCategory(category, projectPath = null) {
|
|
92
|
+
const templates = getAllTemplates(projectPath);
|
|
93
|
+
return templates.filter(t => t.category === category);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Get templates by phase.
|
|
98
|
+
*
|
|
99
|
+
* @param {string} phase - Phase name (e.g., 'proposal', 'design', 'implement')
|
|
100
|
+
* @param {string} [projectPath] - Optional project path
|
|
101
|
+
* @returns {Array} Filtered template array
|
|
102
|
+
*/
|
|
103
|
+
export function getTemplatesByPhase(phase, projectPath = null) {
|
|
104
|
+
const templates = getAllTemplates(projectPath);
|
|
105
|
+
return templates.filter(t => t.phase === phase);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get templates by stack.
|
|
110
|
+
*
|
|
111
|
+
* @param {string} stackId - Stack identifier ('blazor-azure', 'nextjs-supabase')
|
|
112
|
+
* @param {string} [projectPath] - Optional project path
|
|
113
|
+
* @returns {Array} Filtered template array (includes universal + stack-specific)
|
|
114
|
+
*/
|
|
115
|
+
export function getTemplatesByStack(stackId, projectPath = null) {
|
|
116
|
+
const templates = getAllTemplates(projectPath);
|
|
117
|
+
return templates.filter(t => {
|
|
118
|
+
// Include universal templates (stackSpecific: false)
|
|
119
|
+
if (!t.stackSpecific) return true;
|
|
120
|
+
|
|
121
|
+
// Include stack-specific if matches
|
|
122
|
+
return t.stacks && t.stacks.includes(stackId);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Get required templates only.
|
|
128
|
+
*
|
|
129
|
+
* @param {string} [stackId] - Optional stack filter
|
|
130
|
+
* @param {string} [projectPath] - Optional project path
|
|
131
|
+
* @returns {Array} Filtered template array
|
|
132
|
+
*/
|
|
133
|
+
export function getRequiredTemplates(stackId = null, projectPath = null) {
|
|
134
|
+
let templates = getAllTemplates(projectPath);
|
|
135
|
+
|
|
136
|
+
// Filter by required flag
|
|
137
|
+
templates = templates.filter(t => t.required === true);
|
|
138
|
+
|
|
139
|
+
// Optional: filter by stack
|
|
140
|
+
if (stackId) {
|
|
141
|
+
templates = templates.filter(t => {
|
|
142
|
+
if (!t.stackSpecific) return true;
|
|
143
|
+
return t.stacks && t.stacks.includes(stackId);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return templates;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Get infrastructure templates for a specific stack.
|
|
152
|
+
*
|
|
153
|
+
* @param {string} stackId - Stack identifier
|
|
154
|
+
* @param {string} [projectPath] - Optional project path
|
|
155
|
+
* @returns {Array} Infrastructure template array
|
|
156
|
+
*/
|
|
157
|
+
export function getInfrastructureTemplates(stackId, projectPath = null) {
|
|
158
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
159
|
+
return registry.infrastructureTemplates?.[stackId] || [];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get contract templates for a specific stack.
|
|
164
|
+
*
|
|
165
|
+
* @param {string} stackId - Stack identifier
|
|
166
|
+
* @param {string} [projectPath] - Optional project path
|
|
167
|
+
* @returns {Array} Contract template array
|
|
168
|
+
*/
|
|
169
|
+
export function getContractTemplates(stackId, projectPath = null) {
|
|
170
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
171
|
+
return registry.contractTemplates?.[stackId] || [];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get integration templates for a specific stack.
|
|
176
|
+
*
|
|
177
|
+
* @param {string} stackId - Stack identifier
|
|
178
|
+
* @param {string} [projectPath] - Optional project path
|
|
179
|
+
* @returns {Array} Integration template array
|
|
180
|
+
*/
|
|
181
|
+
export function getIntegrationTemplates(stackId, projectPath = null) {
|
|
182
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
183
|
+
return registry.integrationTemplates?.[stackId] || [];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Get SaaS templates for a specific stack.
|
|
188
|
+
*
|
|
189
|
+
* @param {string} stackId - Stack identifier
|
|
190
|
+
* @param {string} [projectPath] - Optional project path
|
|
191
|
+
* @returns {Array} SaaS template array
|
|
192
|
+
*/
|
|
193
|
+
export function getSaasTemplates(stackId, projectPath = null) {
|
|
194
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
195
|
+
return registry.saasTemplates?.[stackId] || [];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get example templates.
|
|
200
|
+
*
|
|
201
|
+
* @param {string} [projectPath] - Optional project path
|
|
202
|
+
* @returns {Array} Example template array
|
|
203
|
+
*/
|
|
204
|
+
export function getExampleTemplates(projectPath = null) {
|
|
205
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
206
|
+
return registry.exampleTemplates || [];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Search templates by keyword (searches id, name, description).
|
|
211
|
+
*
|
|
212
|
+
* @param {string} keyword - Search term
|
|
213
|
+
* @param {string} [projectPath] - Optional project path
|
|
214
|
+
* @returns {Array} Matching templates
|
|
215
|
+
*/
|
|
216
|
+
export function searchTemplates(keyword, projectPath = null) {
|
|
217
|
+
const templates = getAllTemplates(projectPath);
|
|
218
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
219
|
+
|
|
220
|
+
return templates.filter(t => {
|
|
221
|
+
return (
|
|
222
|
+
t.id.toLowerCase().includes(lowerKeyword) ||
|
|
223
|
+
t.name.toLowerCase().includes(lowerKeyword) ||
|
|
224
|
+
(t.description && t.description.toLowerCase().includes(lowerKeyword))
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Get registry statistics.
|
|
231
|
+
*
|
|
232
|
+
* @param {string} [projectPath] - Optional project path
|
|
233
|
+
* @returns {Object} Statistics object
|
|
234
|
+
*/
|
|
235
|
+
export function getRegistryStats(projectPath = null) {
|
|
236
|
+
const registry = loadTemplateRegistry(projectPath);
|
|
237
|
+
return registry.stats || {};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Validate that a template exists in the registry.
|
|
242
|
+
*
|
|
243
|
+
* @param {string} templateId - Template identifier
|
|
244
|
+
* @param {string} [projectPath] - Optional project path
|
|
245
|
+
* @returns {boolean} True if template exists
|
|
246
|
+
*/
|
|
247
|
+
export function templateExists(templateId, projectPath = null) {
|
|
248
|
+
return getTemplateById(templateId, projectPath) !== null;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Get template absolute path with fallback logic.
|
|
253
|
+
*
|
|
254
|
+
* Resolution order:
|
|
255
|
+
* 1. Stack-specific template (stacks/{stack}/.morph/templates/{path})
|
|
256
|
+
* 2. Framework universal template (framework/templates/{path})
|
|
257
|
+
*
|
|
258
|
+
* @param {string} templateId - Template identifier
|
|
259
|
+
* @param {string} projectPath - Project root path
|
|
260
|
+
* @param {string} [stackId] - Stack identifier (optional)
|
|
261
|
+
* @returns {string|null} Absolute template path or null if not found
|
|
262
|
+
*/
|
|
263
|
+
export function resolveTemplatePathById(templateId, projectPath, stackId = null) {
|
|
264
|
+
const template = getTemplateById(templateId, projectPath);
|
|
265
|
+
if (!template) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// If template is universal (framework location)
|
|
270
|
+
if (template.location === 'framework') {
|
|
271
|
+
const frameworkPath = join(projectPath, 'framework/templates', template.path);
|
|
272
|
+
return existsSync(frameworkPath) ? frameworkPath : null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// If template is stack-specific
|
|
276
|
+
if (template.location === 'stack' && stackId) {
|
|
277
|
+
// Try stack-specific first
|
|
278
|
+
const stackPath = join(projectPath, 'stacks', stackId, '.morph/templates', template.path);
|
|
279
|
+
if (existsSync(stackPath)) {
|
|
280
|
+
return stackPath;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Fallback to framework if exists
|
|
284
|
+
const frameworkPath = join(projectPath, 'framework/templates', template.path);
|
|
285
|
+
if (existsSync(frameworkPath)) {
|
|
286
|
+
return frameworkPath;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* List all template IDs.
|
|
295
|
+
*
|
|
296
|
+
* @param {string} [projectPath] - Optional project path
|
|
297
|
+
* @returns {string[]} Array of template IDs
|
|
298
|
+
*/
|
|
299
|
+
export function listTemplateIds(projectPath = null) {
|
|
300
|
+
const templates = getAllTemplates(projectPath);
|
|
301
|
+
return templates.map(t => t.id);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get templates that use Handlebars engine.
|
|
306
|
+
*
|
|
307
|
+
* @param {string} [projectPath] - Optional project path
|
|
308
|
+
* @returns {Array} Templates using Handlebars
|
|
309
|
+
*/
|
|
310
|
+
export function getHandlebarsTemplates(projectPath = null) {
|
|
311
|
+
const templates = getAllTemplates(projectPath);
|
|
312
|
+
return templates.filter(t => t.engine === 'handlebars');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Get templates that use custom engine (need migration).
|
|
317
|
+
*
|
|
318
|
+
* @param {string} [projectPath] - Optional project path
|
|
319
|
+
* @returns {Array} Templates using custom engine
|
|
320
|
+
*/
|
|
321
|
+
export function getCustomEngineTemplates(projectPath = null) {
|
|
322
|
+
const templates = getAllTemplates(projectPath);
|
|
323
|
+
return templates.filter(t => t.engine === 'custom');
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Get deprecated templates.
|
|
328
|
+
*
|
|
329
|
+
* @param {string} [projectPath] - Optional project path
|
|
330
|
+
* @returns {Array} Deprecated templates
|
|
331
|
+
*/
|
|
332
|
+
export function getDeprecatedTemplates(projectPath = null) {
|
|
333
|
+
const templates = getAllTemplates(projectPath);
|
|
334
|
+
return templates.filter(t => t.deprecated === true);
|
|
335
|
+
}
|