@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
|
@@ -1,187 +1,187 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Design System Detector
|
|
3
|
-
*
|
|
4
|
-
* Detects if a design system exists for the project or feature.
|
|
5
|
-
* Checks multiple locations in priority order.
|
|
6
|
-
*
|
|
7
|
-
* @module design-system-detector
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { existsSync, readFileSync } from 'fs';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Detect design system for project or feature
|
|
15
|
-
* @param {string} projectPath - Root path of the project
|
|
16
|
-
* @param {string|null} featureName - Feature name (optional, checks feature-level if provided)
|
|
17
|
-
* @returns {Object} { hasDesignSystem, path, isProjectLevel, isFeatureLevel, source }
|
|
18
|
-
*/
|
|
19
|
-
export function detectDesignSystem(projectPath, featureName = null) {
|
|
20
|
-
const result = {
|
|
21
|
-
hasDesignSystem: false,
|
|
22
|
-
path: null,
|
|
23
|
-
isProjectLevel: false,
|
|
24
|
-
isFeatureLevel: false,
|
|
25
|
-
source: null
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// Priority 1: Feature-level design system (if feature specified)
|
|
29
|
-
if (featureName) {
|
|
30
|
-
const featureDesignSystemPath = join(
|
|
31
|
-
projectPath,
|
|
32
|
-
'.morph/project/outputs',
|
|
33
|
-
featureName,
|
|
34
|
-
'ui-design-system.md'
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
if (existsSync(featureDesignSystemPath)) {
|
|
38
|
-
return {
|
|
39
|
-
hasDesignSystem: true,
|
|
40
|
-
path: featureDesignSystemPath,
|
|
41
|
-
isProjectLevel: false,
|
|
42
|
-
isFeatureLevel: true,
|
|
43
|
-
source: 'feature-output'
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Priority 2: Project-level design system (markdown)
|
|
49
|
-
const projectDesignSystemPath = join(projectPath, '.morph/project/design-system.md');
|
|
50
|
-
if (existsSync(projectDesignSystemPath)) {
|
|
51
|
-
return {
|
|
52
|
-
hasDesignSystem: true,
|
|
53
|
-
path: projectDesignSystemPath,
|
|
54
|
-
isProjectLevel: true,
|
|
55
|
-
isFeatureLevel: false,
|
|
56
|
-
source: 'project-markdown'
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Priority 3: Generated CSS design system
|
|
61
|
-
const cssDesignSystemPath = join(projectPath, 'wwwroot/css/design-system.css');
|
|
62
|
-
if (existsSync(cssDesignSystemPath)) {
|
|
63
|
-
return {
|
|
64
|
-
hasDesignSystem: true,
|
|
65
|
-
path: cssDesignSystemPath,
|
|
66
|
-
isProjectLevel: true,
|
|
67
|
-
isFeatureLevel: false,
|
|
68
|
-
source: 'generated-css'
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Priority 4: Check common CSS locations for design system variables
|
|
73
|
-
const commonCssLocations = [
|
|
74
|
-
'wwwroot/css/site.css',
|
|
75
|
-
'wwwroot/css/app.css',
|
|
76
|
-
'styles/globals.css',
|
|
77
|
-
'src/styles/globals.css'
|
|
78
|
-
];
|
|
79
|
-
|
|
80
|
-
for (const cssPath of commonCssLocations) {
|
|
81
|
-
const fullPath = join(projectPath, cssPath);
|
|
82
|
-
if (existsSync(fullPath)) {
|
|
83
|
-
// Check if file contains design system variables (CSS custom properties)
|
|
84
|
-
try {
|
|
85
|
-
const content = readFileSync(fullPath, 'utf8');
|
|
86
|
-
|
|
87
|
-
// Look for CSS custom properties that indicate a design system
|
|
88
|
-
// Match :root { ... --variable ... } (with newlines)
|
|
89
|
-
const hasDesignTokens = /:root\s*\{[\s\S]*?--/.test(content);
|
|
90
|
-
|
|
91
|
-
if (hasDesignTokens) {
|
|
92
|
-
return {
|
|
93
|
-
hasDesignSystem: true,
|
|
94
|
-
path: fullPath,
|
|
95
|
-
isProjectLevel: true,
|
|
96
|
-
isFeatureLevel: false,
|
|
97
|
-
source: 'existing-css-variables'
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
} catch {
|
|
101
|
-
// Continue checking other locations
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// No design system found
|
|
107
|
-
return result;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Check if UI agents are active for a feature
|
|
112
|
-
* @param {string} projectPath - Root path of the project
|
|
113
|
-
* @param {string} featureName - Feature name
|
|
114
|
-
* @returns {boolean} True if UI agents are active
|
|
115
|
-
*/
|
|
116
|
-
export function hasUIAgentsActive(projectPath, featureName) {
|
|
117
|
-
try {
|
|
118
|
-
const statePath = join(projectPath, '.morph/state.json');
|
|
119
|
-
|
|
120
|
-
if (!existsSync(statePath)) {
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const state = JSON.parse(readFileSync(statePath, 'utf8'));
|
|
125
|
-
|
|
126
|
-
// Handle both array and object format
|
|
127
|
-
let feature;
|
|
128
|
-
if (Array.isArray(state.features)) {
|
|
129
|
-
feature = state.features.find(f => f.name === featureName);
|
|
130
|
-
} else if (state.features && typeof state.features === 'object') {
|
|
131
|
-
feature = state.features[featureName];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (!feature || !feature.activeAgents) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// UI agents that require design system
|
|
139
|
-
const uiAgents = [
|
|
140
|
-
'blazor-builder',
|
|
141
|
-
'ui-designer',
|
|
142
|
-
'css-specialist',
|
|
143
|
-
'nextjs-expert'
|
|
144
|
-
];
|
|
145
|
-
|
|
146
|
-
return feature.activeAgents.some(agentId => uiAgents.includes(agentId));
|
|
147
|
-
} catch {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Get recommended design system locations based on project type
|
|
154
|
-
* @param {string} projectPath - Root path of the project
|
|
155
|
-
* @returns {Object} { markdown, css, description }
|
|
156
|
-
*/
|
|
157
|
-
export function getRecommendedLocations(projectPath) {
|
|
158
|
-
try {
|
|
159
|
-
const configPath = join(projectPath, '.morph/config/config.json');
|
|
160
|
-
|
|
161
|
-
let projectType = 'unknown';
|
|
162
|
-
if (existsSync(configPath)) {
|
|
163
|
-
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
164
|
-
projectType = config.project?.type || 'unknown';
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Default locations (Blazor)
|
|
168
|
-
const locations = {
|
|
169
|
-
markdown: '.morph/project/design-system.md',
|
|
170
|
-
css: 'wwwroot/css/design-system.css',
|
|
171
|
-
description: 'Project-level design system (shared across features)'
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
// Adjust based on project type
|
|
175
|
-
if (projectType === 'nextjs' || projectType.includes('nextjs')) {
|
|
176
|
-
locations.css = 'styles/design-system.css';
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return locations;
|
|
180
|
-
} catch {
|
|
181
|
-
return {
|
|
182
|
-
markdown: '.morph/project/design-system.md',
|
|
183
|
-
css: 'wwwroot/css/design-system.css',
|
|
184
|
-
description: 'Project-level design system (shared across features)'
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Design System Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects if a design system exists for the project or feature.
|
|
5
|
+
* Checks multiple locations in priority order.
|
|
6
|
+
*
|
|
7
|
+
* @module design-system-detector
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { existsSync, readFileSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Detect design system for project or feature
|
|
15
|
+
* @param {string} projectPath - Root path of the project
|
|
16
|
+
* @param {string|null} featureName - Feature name (optional, checks feature-level if provided)
|
|
17
|
+
* @returns {Object} { hasDesignSystem, path, isProjectLevel, isFeatureLevel, source }
|
|
18
|
+
*/
|
|
19
|
+
export function detectDesignSystem(projectPath, featureName = null) {
|
|
20
|
+
const result = {
|
|
21
|
+
hasDesignSystem: false,
|
|
22
|
+
path: null,
|
|
23
|
+
isProjectLevel: false,
|
|
24
|
+
isFeatureLevel: false,
|
|
25
|
+
source: null
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Priority 1: Feature-level design system (if feature specified)
|
|
29
|
+
if (featureName) {
|
|
30
|
+
const featureDesignSystemPath = join(
|
|
31
|
+
projectPath,
|
|
32
|
+
'.morph/project/outputs',
|
|
33
|
+
featureName,
|
|
34
|
+
'ui-design-system.md'
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
if (existsSync(featureDesignSystemPath)) {
|
|
38
|
+
return {
|
|
39
|
+
hasDesignSystem: true,
|
|
40
|
+
path: featureDesignSystemPath,
|
|
41
|
+
isProjectLevel: false,
|
|
42
|
+
isFeatureLevel: true,
|
|
43
|
+
source: 'feature-output'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Priority 2: Project-level design system (markdown)
|
|
49
|
+
const projectDesignSystemPath = join(projectPath, '.morph/project/design-system.md');
|
|
50
|
+
if (existsSync(projectDesignSystemPath)) {
|
|
51
|
+
return {
|
|
52
|
+
hasDesignSystem: true,
|
|
53
|
+
path: projectDesignSystemPath,
|
|
54
|
+
isProjectLevel: true,
|
|
55
|
+
isFeatureLevel: false,
|
|
56
|
+
source: 'project-markdown'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Priority 3: Generated CSS design system
|
|
61
|
+
const cssDesignSystemPath = join(projectPath, 'wwwroot/css/design-system.css');
|
|
62
|
+
if (existsSync(cssDesignSystemPath)) {
|
|
63
|
+
return {
|
|
64
|
+
hasDesignSystem: true,
|
|
65
|
+
path: cssDesignSystemPath,
|
|
66
|
+
isProjectLevel: true,
|
|
67
|
+
isFeatureLevel: false,
|
|
68
|
+
source: 'generated-css'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Priority 4: Check common CSS locations for design system variables
|
|
73
|
+
const commonCssLocations = [
|
|
74
|
+
'wwwroot/css/site.css',
|
|
75
|
+
'wwwroot/css/app.css',
|
|
76
|
+
'styles/globals.css',
|
|
77
|
+
'src/styles/globals.css'
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
for (const cssPath of commonCssLocations) {
|
|
81
|
+
const fullPath = join(projectPath, cssPath);
|
|
82
|
+
if (existsSync(fullPath)) {
|
|
83
|
+
// Check if file contains design system variables (CSS custom properties)
|
|
84
|
+
try {
|
|
85
|
+
const content = readFileSync(fullPath, 'utf8');
|
|
86
|
+
|
|
87
|
+
// Look for CSS custom properties that indicate a design system
|
|
88
|
+
// Match :root { ... --variable ... } (with newlines)
|
|
89
|
+
const hasDesignTokens = /:root\s*\{[\s\S]*?--/.test(content);
|
|
90
|
+
|
|
91
|
+
if (hasDesignTokens) {
|
|
92
|
+
return {
|
|
93
|
+
hasDesignSystem: true,
|
|
94
|
+
path: fullPath,
|
|
95
|
+
isProjectLevel: true,
|
|
96
|
+
isFeatureLevel: false,
|
|
97
|
+
source: 'existing-css-variables'
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
// Continue checking other locations
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// No design system found
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if UI agents are active for a feature
|
|
112
|
+
* @param {string} projectPath - Root path of the project
|
|
113
|
+
* @param {string} featureName - Feature name
|
|
114
|
+
* @returns {boolean} True if UI agents are active
|
|
115
|
+
*/
|
|
116
|
+
export function hasUIAgentsActive(projectPath, featureName) {
|
|
117
|
+
try {
|
|
118
|
+
const statePath = join(projectPath, '.morph/state.json');
|
|
119
|
+
|
|
120
|
+
if (!existsSync(statePath)) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const state = JSON.parse(readFileSync(statePath, 'utf8'));
|
|
125
|
+
|
|
126
|
+
// Handle both array and object format
|
|
127
|
+
let feature;
|
|
128
|
+
if (Array.isArray(state.features)) {
|
|
129
|
+
feature = state.features.find(f => f.name === featureName);
|
|
130
|
+
} else if (state.features && typeof state.features === 'object') {
|
|
131
|
+
feature = state.features[featureName];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!feature || !feature.activeAgents) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// UI agents that require design system
|
|
139
|
+
const uiAgents = [
|
|
140
|
+
'blazor-builder',
|
|
141
|
+
'ui-designer',
|
|
142
|
+
'css-specialist',
|
|
143
|
+
'nextjs-expert'
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
return feature.activeAgents.some(agentId => uiAgents.includes(agentId));
|
|
147
|
+
} catch {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Get recommended design system locations based on project type
|
|
154
|
+
* @param {string} projectPath - Root path of the project
|
|
155
|
+
* @returns {Object} { markdown, css, description }
|
|
156
|
+
*/
|
|
157
|
+
export function getRecommendedLocations(projectPath) {
|
|
158
|
+
try {
|
|
159
|
+
const configPath = join(projectPath, '.morph/config/config.json');
|
|
160
|
+
|
|
161
|
+
let projectType = 'unknown';
|
|
162
|
+
if (existsSync(configPath)) {
|
|
163
|
+
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
164
|
+
projectType = config.project?.type || 'unknown';
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Default locations (Blazor)
|
|
168
|
+
const locations = {
|
|
169
|
+
markdown: '.morph/project/design-system.md',
|
|
170
|
+
css: 'wwwroot/css/design-system.css',
|
|
171
|
+
description: 'Project-level design system (shared across features)'
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Adjust based on project type
|
|
175
|
+
if (projectType === 'nextjs' || projectType.includes('nextjs')) {
|
|
176
|
+
locations.css = 'styles/design-system.css';
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return locations;
|
|
180
|
+
} catch {
|
|
181
|
+
return {
|
|
182
|
+
markdown: '.morph/project/design-system.md',
|
|
183
|
+
css: 'wwwroot/css/design-system.css',
|
|
184
|
+
description: 'Project-level design system (shared across features)'
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -1,84 +1,87 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MORPH-SPEC Detectors - Main Orchestrator
|
|
3
|
-
*
|
|
4
|
-
* Coordinates all detection modules to build a complete picture of the project.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { detectStructure } from './structure-detector.js';
|
|
8
|
-
import { detectConfig } from './config-detector.js';
|
|
9
|
-
import { analyzeConversation } from './conversation-analyzer.js';
|
|
10
|
-
import { generateStandards } from './standards-generator.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
''
|
|
71
|
-
|
|
72
|
-
`- **
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
''
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
'',
|
|
79
|
-
'###
|
|
80
|
-
...(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
1
|
+
/**
|
|
2
|
+
* MORPH-SPEC Detectors - Main Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all detection modules to build a complete picture of the project.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { detectStructure } from './structure-detector.js';
|
|
8
|
+
import { detectConfig } from './config-detector.js';
|
|
9
|
+
import { analyzeConversation } from './conversation-analyzer.js';
|
|
10
|
+
import { generateStandards } from './standards-generator.js';
|
|
11
|
+
|
|
12
|
+
// Re-export individual detectors
|
|
13
|
+
export * from './design-system-detector.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Main detection orchestrator
|
|
17
|
+
* @param {string} projectPath - Path to project root
|
|
18
|
+
* @param {Object} options - Detection options
|
|
19
|
+
* @returns {Promise<Object>} Detection results
|
|
20
|
+
*/
|
|
21
|
+
export async function detectProject(projectPath, options = {}) {
|
|
22
|
+
const results = {
|
|
23
|
+
path: projectPath,
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
structure: null,
|
|
26
|
+
config: null,
|
|
27
|
+
conversation: null,
|
|
28
|
+
inferred: null
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
// 1. Detect structure (stack, architecture, patterns)
|
|
33
|
+
if (options.structure !== false) {
|
|
34
|
+
results.structure = await detectStructure(projectPath);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 2. Detect config (technologies, dependencies, versions)
|
|
38
|
+
if (options.config !== false) {
|
|
39
|
+
results.config = await detectConfig(projectPath);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 3. Analyze conversation history (if available)
|
|
43
|
+
if (options.conversation !== false) {
|
|
44
|
+
results.conversation = await analyzeConversation(projectPath);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 4. Generate inferred standards
|
|
48
|
+
if (options.generateStandards !== false) {
|
|
49
|
+
results.inferred = await generateStandards(results);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return results;
|
|
53
|
+
} catch (error) {
|
|
54
|
+
throw new Error(`Detection failed: ${error.message}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Get detection summary
|
|
60
|
+
* @param {Object} results - Detection results
|
|
61
|
+
* @returns {string} Human-readable summary
|
|
62
|
+
*/
|
|
63
|
+
export function getDetectionSummary(results) {
|
|
64
|
+
const { structure, config } = results;
|
|
65
|
+
|
|
66
|
+
const lines = [
|
|
67
|
+
'## Detection Summary',
|
|
68
|
+
'',
|
|
69
|
+
'### Stack',
|
|
70
|
+
`- **Type**: ${structure?.stack || 'unknown'}`,
|
|
71
|
+
`- **Architecture**: ${structure?.architecture || 'unknown'}`,
|
|
72
|
+
`- **UI Library**: ${structure?.uiLibrary || 'none'}`,
|
|
73
|
+
'',
|
|
74
|
+
'### Technologies',
|
|
75
|
+
`- **Language**: ${config?.language || 'unknown'}`,
|
|
76
|
+
`- **Version**: ${config?.version || 'unknown'}`,
|
|
77
|
+
`- **Package Manager**: ${config?.packageManager || 'unknown'}`,
|
|
78
|
+
'',
|
|
79
|
+
'### Patterns Detected',
|
|
80
|
+
...(structure?.patterns || []).map(p => `- ${p}`),
|
|
81
|
+
'',
|
|
82
|
+
'### Recommendations',
|
|
83
|
+
...(results.inferred?.recommendations || []).map(r => `- ${r}`)
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
return lines.join('\n');
|
|
87
|
+
}
|