@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,247 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* MORPH-SPEC Semantic Agent Detection (LLM-based)
|
|
5
|
-
*
|
|
6
|
-
* Uses LLM analysis to detect which agents should be activated based on user request.
|
|
7
|
-
* More accurate than keyword matching - understands context and implicit needs.
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* export ANTHROPIC_API_KEY=sk-...
|
|
11
|
-
* node bin/semantic-detect-agents.js "user request here"
|
|
12
|
-
*
|
|
13
|
-
* Falls back to keyword-based detection if API key not available.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import fs from 'fs';
|
|
17
|
-
import path from 'path';
|
|
18
|
-
import { fileURLToPath } from 'url';
|
|
19
|
-
import { execSync } from 'child_process';
|
|
20
|
-
import { resolveAgentsConfigPath } from '../src/lib/stack-resolver.js';
|
|
21
|
-
|
|
22
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
-
const __dirname = path.dirname(__filename);
|
|
24
|
-
|
|
25
|
-
// ANSI colors
|
|
26
|
-
const colors = {
|
|
27
|
-
green: '\x1b[32m',
|
|
28
|
-
red: '\x1b[31m',
|
|
29
|
-
yellow: '\x1b[33m',
|
|
30
|
-
cyan: '\x1b[36m',
|
|
31
|
-
gray: '\x1b[90m',
|
|
32
|
-
reset: '\x1b[0m'
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Call Anthropic Claude API for semantic analysis
|
|
37
|
-
*/
|
|
38
|
-
async function callClaudeAPI(userRequest, agentDescriptions) {
|
|
39
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
40
|
-
|
|
41
|
-
if (!apiKey) {
|
|
42
|
-
return null; // Will fall back to keyword detection
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const prompt = `You are an expert at analyzing software development requests and determining which specialist agents are needed.
|
|
46
|
-
|
|
47
|
-
Given this user request:
|
|
48
|
-
"${userRequest}"
|
|
49
|
-
|
|
50
|
-
And these available specialist agents:
|
|
51
|
-
${agentDescriptions}
|
|
52
|
-
|
|
53
|
-
Analyze the request and determine which specialist agents should be activated. Consider:
|
|
54
|
-
- Explicit mentions (e.g., "create a dashboard" → UI/UX Designer)
|
|
55
|
-
- Implicit needs (e.g., "show data to users" → UI/UX Designer)
|
|
56
|
-
- Technical requirements (e.g., "scheduled tasks" → Hangfire Orchestrator)
|
|
57
|
-
- Architecture patterns (e.g., "RAG pipeline" → AI System Architect)
|
|
58
|
-
|
|
59
|
-
Respond with ONLY a JSON array of agent IDs, like:
|
|
60
|
-
["uiux-designer", "hangfire-orchestrator"]
|
|
61
|
-
|
|
62
|
-
If no specialists are needed, respond with: []
|
|
63
|
-
Do not include core agents (they are always active).`;
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
67
|
-
method: 'POST',
|
|
68
|
-
headers: {
|
|
69
|
-
'Content-Type': 'application/json',
|
|
70
|
-
'x-api-key': apiKey,
|
|
71
|
-
'anthropic-version': '2023-06-01'
|
|
72
|
-
},
|
|
73
|
-
body: JSON.stringify({
|
|
74
|
-
model: 'claude-3-haiku-20240307',
|
|
75
|
-
max_tokens: 200,
|
|
76
|
-
messages: [{
|
|
77
|
-
role: 'user',
|
|
78
|
-
content: prompt
|
|
79
|
-
}]
|
|
80
|
-
})
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
if (!response.ok) {
|
|
84
|
-
const error = await response.text();
|
|
85
|
-
console.error(`${colors.yellow}⚠ Claude API error: ${error}${colors.reset}`);
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const data = await response.json();
|
|
90
|
-
const content = data.content[0].text.trim();
|
|
91
|
-
|
|
92
|
-
// Parse JSON response
|
|
93
|
-
const agentIds = JSON.parse(content);
|
|
94
|
-
return agentIds;
|
|
95
|
-
} catch (error) {
|
|
96
|
-
console.error(`${colors.yellow}⚠ Claude API failed: ${error.message}${colors.reset}`);
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Fallback: keyword-based detection (existing behavior)
|
|
103
|
-
*/
|
|
104
|
-
function keywordBasedDetection(userRequest) {
|
|
105
|
-
console.log(`${colors.yellow}ℹ Using keyword-based detection (fallback)${colors.reset}`);
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
const result = execSync(`node bin/detect-agents.js "${userRequest}" --json`, {
|
|
109
|
-
encoding: 'utf-8',
|
|
110
|
-
cwd: process.cwd()
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
const parsed = JSON.parse(result);
|
|
114
|
-
return parsed.specialists || [];
|
|
115
|
-
} catch (error) {
|
|
116
|
-
console.error(`${colors.red}✗ Fallback detection failed: ${error.message}${colors.reset}`);
|
|
117
|
-
return [];
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Load agent descriptions for LLM context
|
|
123
|
-
*/
|
|
124
|
-
function loadAgentDescriptions() {
|
|
125
|
-
const agentsPath = resolveAgentsConfigPath(process.cwd());
|
|
126
|
-
|
|
127
|
-
if (!fs.existsSync(agentsPath)) {
|
|
128
|
-
throw new Error('agents.json not found');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const agents = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
|
|
132
|
-
const specialists = agents.agents.specialists || [];
|
|
133
|
-
|
|
134
|
-
return specialists.map(agent =>
|
|
135
|
-
`- ${agent.id}: ${agent.description}`
|
|
136
|
-
).join('\n');
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Print detection results
|
|
141
|
-
*/
|
|
142
|
-
function printResults(agentIds, method, userRequest) {
|
|
143
|
-
console.log(`\n${colors.cyan}╔════════════════════════════════════════════════╗${colors.reset}`);
|
|
144
|
-
console.log(`${colors.cyan}║ MORPH-SPEC SEMANTIC AGENT DETECTION ║${colors.reset}`);
|
|
145
|
-
console.log(`${colors.cyan}╚════════════════════════════════════════════════╝${colors.reset}\n`);
|
|
146
|
-
|
|
147
|
-
console.log(`${colors.gray}Request:${colors.reset} "${userRequest}"`);
|
|
148
|
-
console.log(`${colors.gray}Method:${colors.reset} ${method}`);
|
|
149
|
-
console.log(`${colors.gray}Agents Detected:${colors.reset} ${agentIds.length}`);
|
|
150
|
-
|
|
151
|
-
if (agentIds.length > 0) {
|
|
152
|
-
console.log('');
|
|
153
|
-
agentIds.forEach(id => {
|
|
154
|
-
console.log(` ${colors.green}✓${colors.reset} ${id}`);
|
|
155
|
-
});
|
|
156
|
-
} else {
|
|
157
|
-
console.log(`\n ${colors.gray}(No specialist agents needed)${colors.reset}`);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
console.log('');
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Print help
|
|
165
|
-
*/
|
|
166
|
-
function printHelp() {
|
|
167
|
-
console.log(`
|
|
168
|
-
${colors.cyan}MORPH-SPEC Semantic Agent Detection${colors.reset}
|
|
169
|
-
|
|
170
|
-
Uses LLM analysis to detect which agents should be activated.
|
|
171
|
-
More accurate than keyword matching - understands context.
|
|
172
|
-
|
|
173
|
-
${colors.green}Setup:${colors.reset}
|
|
174
|
-
export ANTHROPIC_API_KEY=sk-ant-...
|
|
175
|
-
|
|
176
|
-
${colors.green}Usage:${colors.reset}
|
|
177
|
-
node bin/semantic-detect-agents.js "user request here"
|
|
178
|
-
|
|
179
|
-
${colors.green}Examples:${colors.reset}
|
|
180
|
-
# Detects UI/UX Designer (implicit need)
|
|
181
|
-
node bin/semantic-detect-agents.js "sistema que mostra dados ao usuário"
|
|
182
|
-
|
|
183
|
-
# Detects Hangfire Orchestrator
|
|
184
|
-
node bin/semantic-detect-agents.js "processar arquivos todo dia às 3h"
|
|
185
|
-
|
|
186
|
-
# Detects AI System Architect
|
|
187
|
-
node bin/semantic-detect-agents.js "pipeline de RAG com chunking"
|
|
188
|
-
|
|
189
|
-
${colors.green}Fallback:${colors.reset}
|
|
190
|
-
If ANTHROPIC_API_KEY is not set, falls back to keyword-based detection.
|
|
191
|
-
|
|
192
|
-
${colors.green}Benefits:${colors.reset}
|
|
193
|
-
✓ Understands context ("show data to users" → UI)
|
|
194
|
-
✓ Works in any language (not just keywords)
|
|
195
|
-
✓ Eliminates false positives/negatives
|
|
196
|
-
✓ Detects implicit needs
|
|
197
|
-
|
|
198
|
-
${colors.green}Output:${colors.reset}
|
|
199
|
-
Prints detected agent IDs, one per line, for use in scripts.
|
|
200
|
-
`);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Main function
|
|
205
|
-
*/
|
|
206
|
-
async function main() {
|
|
207
|
-
const args = process.argv.slice(2);
|
|
208
|
-
|
|
209
|
-
if (args.includes('--help') || args.includes('-h') || args.length === 0) {
|
|
210
|
-
printHelp();
|
|
211
|
-
process.exit(args.length === 0 ? 1 : 0);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const userRequest = args.join(' ');
|
|
215
|
-
const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
|
|
216
|
-
|
|
217
|
-
let agentIds;
|
|
218
|
-
let method;
|
|
219
|
-
|
|
220
|
-
if (hasApiKey) {
|
|
221
|
-
method = `${colors.green}LLM-based (Claude Haiku)${colors.reset}`;
|
|
222
|
-
const agentDescriptions = loadAgentDescriptions();
|
|
223
|
-
agentIds = await callClaudeAPI(userRequest, agentDescriptions);
|
|
224
|
-
|
|
225
|
-
if (!agentIds) {
|
|
226
|
-
// API failed, fall back
|
|
227
|
-
method = `${colors.yellow}Keyword-based (API fallback)${colors.reset}`;
|
|
228
|
-
agentIds = keywordBasedDetection(userRequest);
|
|
229
|
-
}
|
|
230
|
-
} else {
|
|
231
|
-
method = `${colors.yellow}Keyword-based (no API key)${colors.reset}`;
|
|
232
|
-
agentIds = keywordBasedDetection(userRequest);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
printResults(agentIds, method, userRequest);
|
|
236
|
-
|
|
237
|
-
// Output for scripting (one ID per line)
|
|
238
|
-
if (args.includes('--quiet') || args.includes('-q')) {
|
|
239
|
-
console.clear();
|
|
240
|
-
agentIds.forEach(id => console.log(id));
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
main().catch(error => {
|
|
245
|
-
console.error(`${colors.red}✗ Error: ${error.message}${colors.reset}`);
|
|
246
|
-
process.exit(1);
|
|
247
|
-
});
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* MORPH-SPEC Agent-Skill Validator
|
|
5
|
-
*
|
|
6
|
-
* Valida a consistência entre agents.json e arquivos de skills.
|
|
7
|
-
* Garante que não há agentes sem skills ou skills sem agentes (orphans).
|
|
8
|
-
*
|
|
9
|
-
* Uso:
|
|
10
|
-
* node bin/validate-agents-skills.js
|
|
11
|
-
* node bin/validate-agents-skills.js --verbose
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
15
|
-
import { join, dirname } from 'path';
|
|
16
|
-
import { fileURLToPath } from 'url';
|
|
17
|
-
import { resolveAgentsConfigPath, resolveStackPath } from '../src/lib/stack-resolver.js';
|
|
18
|
-
|
|
19
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
-
const frameworkRoot = join(__dirname, '..');
|
|
21
|
-
const AGENTS_CONFIG_PATH = resolveAgentsConfigPath(frameworkRoot);
|
|
22
|
-
const SKILLS_BASE_PATH = join(resolveStackPath(frameworkRoot), '.claude/skills');
|
|
23
|
-
|
|
24
|
-
// Cores para output
|
|
25
|
-
const colors = {
|
|
26
|
-
reset: '\x1b[0m',
|
|
27
|
-
bright: '\x1b[1m',
|
|
28
|
-
green: '\x1b[32m',
|
|
29
|
-
yellow: '\x1b[33m',
|
|
30
|
-
red: '\x1b[31m',
|
|
31
|
-
cyan: '\x1b[36m',
|
|
32
|
-
gray: '\x1b[90m'
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
function log(message, color = 'reset') {
|
|
36
|
-
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Carrega agents.json
|
|
41
|
-
*/
|
|
42
|
-
function loadAgentsConfig() {
|
|
43
|
-
try {
|
|
44
|
-
const content = readFileSync(AGENTS_CONFIG_PATH, 'utf8');
|
|
45
|
-
return JSON.parse(content);
|
|
46
|
-
} catch (err) {
|
|
47
|
-
log(`ERROR: Failed to load agents.json: ${err.message}`, 'red');
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Recursivamente lista todos os arquivos .md no diretório de skills
|
|
54
|
-
*/
|
|
55
|
-
function getAllSkillFiles(dir, fileList = []) {
|
|
56
|
-
const files = readdirSync(dir);
|
|
57
|
-
|
|
58
|
-
files.forEach(file => {
|
|
59
|
-
const filePath = join(dir, file);
|
|
60
|
-
const stat = statSync(filePath);
|
|
61
|
-
|
|
62
|
-
if (stat.isDirectory()) {
|
|
63
|
-
getAllSkillFiles(filePath, fileList);
|
|
64
|
-
} else if (file.endsWith('.md')) {
|
|
65
|
-
// Converter para path relativo ao stacks/blazor-azure/
|
|
66
|
-
const stackPath = resolveStackPath(frameworkRoot).replace(/\\/g, '/');
|
|
67
|
-
const normalizedFile = filePath.replace(/\\/g, '/');
|
|
68
|
-
const relativePath = normalizedFile.startsWith(stackPath)
|
|
69
|
-
? normalizedFile.slice(stackPath.length + 1)
|
|
70
|
-
: normalizedFile;
|
|
71
|
-
fileList.push(relativePath);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
return fileList;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Valida agents vs skills
|
|
80
|
-
*/
|
|
81
|
-
function validateAgentsSkills(config, verbose = false) {
|
|
82
|
-
const errors = [];
|
|
83
|
-
const warnings = [];
|
|
84
|
-
const info = [];
|
|
85
|
-
|
|
86
|
-
// 1. Coletar todos os agentes e seus skillPaths
|
|
87
|
-
const allAgents = [...config.agents.core, ...config.agents.specialists];
|
|
88
|
-
const agentSkillPaths = new Set();
|
|
89
|
-
|
|
90
|
-
for (const agent of allAgents) {
|
|
91
|
-
if (agent.skillPath) {
|
|
92
|
-
agentSkillPaths.add(agent.skillPath);
|
|
93
|
-
|
|
94
|
-
// Verificar se skill file existe
|
|
95
|
-
const skillFilePath = join(__dirname, '../content', agent.skillPath);
|
|
96
|
-
if (!existsSync(skillFilePath)) {
|
|
97
|
-
errors.push({
|
|
98
|
-
type: 'missing-skill',
|
|
99
|
-
agent: agent.id,
|
|
100
|
-
skillPath: agent.skillPath,
|
|
101
|
-
message: `Agent '${agent.id}' references non-existent skill: ${agent.skillPath}`
|
|
102
|
-
});
|
|
103
|
-
} else if (verbose) {
|
|
104
|
-
info.push({
|
|
105
|
-
type: 'valid-mapping',
|
|
106
|
-
agent: agent.id,
|
|
107
|
-
skillPath: agent.skillPath,
|
|
108
|
-
message: `✓ ${agent.id} → ${agent.skillPath}`
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
} else if (verbose) {
|
|
112
|
-
warnings.push({
|
|
113
|
-
type: 'no-skill',
|
|
114
|
-
agent: agent.id,
|
|
115
|
-
message: `Agent '${agent.id}' has no skillPath defined (metadata-only agent)`
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// 2. Verificar skills órfãs (sem agente correspondente)
|
|
121
|
-
const allSkillFiles = getAllSkillFiles(SKILLS_BASE_PATH);
|
|
122
|
-
|
|
123
|
-
for (const skillFile of allSkillFiles) {
|
|
124
|
-
const skillPath = `.claude/skills/${skillFile.replace('.claude/skills/', '')}`;
|
|
125
|
-
|
|
126
|
-
if (!agentSkillPaths.has(skillPath)) {
|
|
127
|
-
// Orphan skills são OK - podem ser usados manualmente
|
|
128
|
-
// Apenas reportar em verbose mode
|
|
129
|
-
if (verbose) {
|
|
130
|
-
info.push({
|
|
131
|
-
type: 'manual-skill',
|
|
132
|
-
skillPath: skillPath,
|
|
133
|
-
message: `ℹ️ Manual skill: ${skillPath} (no auto-activation)`
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return { errors, warnings, info };
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Formata e exibe resultados
|
|
144
|
-
*/
|
|
145
|
-
function displayResults(results, verbose) {
|
|
146
|
-
const { errors, warnings, info } = results;
|
|
147
|
-
|
|
148
|
-
log('\n╔════════════════════════════════════════════════════════════════╗', 'cyan');
|
|
149
|
-
log('║ MORPH-SPEC AGENT-SKILL VALIDATION REPORT ║', 'cyan');
|
|
150
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
151
|
-
|
|
152
|
-
// Erros
|
|
153
|
-
if (errors.length > 0) {
|
|
154
|
-
log('║ ERRORS ║', 'red');
|
|
155
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
156
|
-
|
|
157
|
-
errors.forEach(err => {
|
|
158
|
-
log(`║ ❌ ${err.message.substring(0, 61).padEnd(61)}║`, 'red');
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Warnings
|
|
165
|
-
if (warnings.length > 0) {
|
|
166
|
-
log('║ WARNINGS ║', 'yellow');
|
|
167
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
168
|
-
|
|
169
|
-
warnings.forEach(warn => {
|
|
170
|
-
// Quebrar mensagens longas
|
|
171
|
-
const lines = warn.message.match(/.{1,60}/g) || [warn.message];
|
|
172
|
-
lines.forEach((line, idx) => {
|
|
173
|
-
if (idx === 0) {
|
|
174
|
-
log(`║ ⚠️ ${line.padEnd(61)}║`, 'yellow');
|
|
175
|
-
} else {
|
|
176
|
-
log(`║ ${line.padEnd(61)}║`, 'yellow');
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Info (verbose mode)
|
|
185
|
-
if (verbose && info.length > 0) {
|
|
186
|
-
log('║ VALID MAPPINGS ║', 'green');
|
|
187
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
188
|
-
|
|
189
|
-
info.forEach(item => {
|
|
190
|
-
log(`║ ${item.message.substring(0, 62).padEnd(62)}║`, 'gray');
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Summary
|
|
197
|
-
log('║ SUMMARY ║', 'cyan');
|
|
198
|
-
log('╠════════════════════════════════════════════════════════════════╣', 'cyan');
|
|
199
|
-
log(`║ Errors: ${errors.length.toString().padEnd(56)}║`, errors.length > 0 ? 'red' : 'green');
|
|
200
|
-
log(`║ Warnings: ${warnings.length.toString().padEnd(54)}║`, warnings.length > 0 ? 'yellow' : 'green');
|
|
201
|
-
|
|
202
|
-
if (errors.length === 0 && warnings.length === 0) {
|
|
203
|
-
log('║ ║', 'cyan');
|
|
204
|
-
log('║ ✅ All agents and skills are properly mapped! ║', 'green');
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Nota sobre manual skills
|
|
208
|
-
const manualSkills = info.filter(i => i.type === 'manual-skill').length;
|
|
209
|
-
if (manualSkills > 0 && verbose) {
|
|
210
|
-
log('║ ║', 'cyan');
|
|
211
|
-
log(`║ ℹ️ ${manualSkills} manual-only skills found (use --verbose to see) ║`, 'gray');
|
|
212
|
-
log('║ These are extra skills without auto-activation. ║', 'gray');
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
log('╚════════════════════════════════════════════════════════════════╝\n', 'cyan');
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// ============================================================================
|
|
219
|
-
// MAIN
|
|
220
|
-
// ============================================================================
|
|
221
|
-
|
|
222
|
-
function main() {
|
|
223
|
-
const args = process.argv.slice(2);
|
|
224
|
-
const verbose = args.includes('--verbose') || args.includes('-v');
|
|
225
|
-
const hasHelp = args.includes('--help') || args.includes('-h');
|
|
226
|
-
|
|
227
|
-
if (hasHelp) {
|
|
228
|
-
log('\nMORPH-SPEC Agent-Skill Validator', 'bright');
|
|
229
|
-
log('\nUsage:', 'cyan');
|
|
230
|
-
log(' node bin/validate-agents-skills.js [options]', 'gray');
|
|
231
|
-
log('\nOptions:', 'cyan');
|
|
232
|
-
log(' -v, --verbose Show all valid mappings', 'gray');
|
|
233
|
-
log(' -h, --help Show this help', 'gray');
|
|
234
|
-
log('\nDescription:', 'cyan');
|
|
235
|
-
log(' Validates consistency between agents.json and skill files.', 'gray');
|
|
236
|
-
log(' - Checks if all skillPaths exist', 'gray');
|
|
237
|
-
log(' - Detects orphan skills (no corresponding agent)', 'gray');
|
|
238
|
-
log(' - Exit code 0 if valid, 1 if errors found\n', 'gray');
|
|
239
|
-
process.exit(0);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Load config and validate
|
|
243
|
-
const config = loadAgentsConfig();
|
|
244
|
-
const results = validateAgentsSkills(config, verbose);
|
|
245
|
-
|
|
246
|
-
// Display results
|
|
247
|
-
displayResults(results, verbose);
|
|
248
|
-
|
|
249
|
-
// Exit with appropriate code
|
|
250
|
-
if (results.errors.length > 0) {
|
|
251
|
-
process.exit(1);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
process.exit(0);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
main();
|
package/bin/validate-agents.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
import Ajv from 'ajv';
|
|
6
|
-
import addFormats from 'ajv-formats';
|
|
7
|
-
import { resolveAgentsConfigPath, resolveStackPath } from '../src/lib/stack-resolver.js';
|
|
8
|
-
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = path.dirname(__filename);
|
|
11
|
-
|
|
12
|
-
function main() {
|
|
13
|
-
const args = process.argv.slice(2);
|
|
14
|
-
|
|
15
|
-
if (args.includes('--help') || args.includes('-h')) {
|
|
16
|
-
console.log('Usage: node bin/validate-agents.js [agents-file-path]');
|
|
17
|
-
process.exit(0);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const defaultPath = resolveAgentsConfigPath(process.cwd());
|
|
21
|
-
const agentsPath = args[0] || defaultPath;
|
|
22
|
-
const schemaPath = path.join(resolveStackPath(path.join(__dirname, '..')), '.morph/schemas/agent.schema.json');
|
|
23
|
-
|
|
24
|
-
if (!fs.existsSync(agentsPath)) {
|
|
25
|
-
console.error('Error: agents.json not found at', agentsPath);
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (!fs.existsSync(schemaPath)) {
|
|
30
|
-
console.error('Error: Schema not found at', schemaPath);
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
|
|
36
|
-
const agents = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
|
|
37
|
-
|
|
38
|
-
const ajv = new Ajv({ allErrors: true, verbose: true, strict: true });
|
|
39
|
-
addFormats(ajv);
|
|
40
|
-
|
|
41
|
-
const validate = ajv.compile(schema);
|
|
42
|
-
const valid = validate(agents);
|
|
43
|
-
|
|
44
|
-
console.log('\n=== MORPH-SPEC Agent Validator ===\n');
|
|
45
|
-
console.log('Version:', agents.version || 'unknown');
|
|
46
|
-
console.log('Core Agents:', agents.agents?.core?.length || 0);
|
|
47
|
-
console.log('Specialist Agents:', agents.agents?.specialists?.length || 0);
|
|
48
|
-
|
|
49
|
-
if (valid) {
|
|
50
|
-
console.log('\n✓ Validation PASSED\n');
|
|
51
|
-
process.exit(0);
|
|
52
|
-
} else {
|
|
53
|
-
console.log('\n✗ Validation FAILED\n');
|
|
54
|
-
console.log('Errors:');
|
|
55
|
-
validate.errors.forEach((err, i) => {
|
|
56
|
-
console.log(`${i + 1}. ${err.instancePath || '/'}: ${err.message}`);
|
|
57
|
-
if (err.params) {
|
|
58
|
-
console.log(' Params:', JSON.stringify(err.params));
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
console.log('');
|
|
62
|
-
process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('Error:', error.message);
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
main();
|