@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,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry - Auto-Discovery System
|
|
3
|
+
*
|
|
4
|
+
* Metadata-driven command loading eliminates hardcoded imports.
|
|
5
|
+
* Enables dynamic command registration and discovery.
|
|
6
|
+
*
|
|
7
|
+
* @module command-registry
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Command Metadata Registry
|
|
12
|
+
*
|
|
13
|
+
* Maps command names to their module paths and metadata.
|
|
14
|
+
* Auto-discovered from src/commands/{category}/ structure.
|
|
15
|
+
*/
|
|
16
|
+
export const commandMetadata = {
|
|
17
|
+
// Feature Management
|
|
18
|
+
'create-story': {
|
|
19
|
+
category: 'feature',
|
|
20
|
+
description: 'Create a new user story with acceptance criteria',
|
|
21
|
+
module: () => import('../../commands/feature/create-story.js'),
|
|
22
|
+
exportName: 'createStoryCommand',
|
|
23
|
+
},
|
|
24
|
+
'shard-spec': {
|
|
25
|
+
category: 'feature',
|
|
26
|
+
description: 'Shard a large spec into manageable chunks',
|
|
27
|
+
module: () => import('../../commands/feature/shard-spec.js'),
|
|
28
|
+
exportName: 'shardSpecCommand',
|
|
29
|
+
},
|
|
30
|
+
'sprint-status': {
|
|
31
|
+
category: 'feature',
|
|
32
|
+
description: 'Show sprint progress and completion status',
|
|
33
|
+
module: () => import('../../commands/feature/sprint-status.js'),
|
|
34
|
+
exportName: 'sprintStatusCommand',
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
// State Management
|
|
38
|
+
'state': {
|
|
39
|
+
category: 'state',
|
|
40
|
+
description: 'Manage feature state (init, get, set, list)',
|
|
41
|
+
module: () => import('../../commands/state/state.js'),
|
|
42
|
+
exportName: 'stateCommand',
|
|
43
|
+
},
|
|
44
|
+
'advance-phase': {
|
|
45
|
+
category: 'state',
|
|
46
|
+
description: 'Advance feature to next phase with validation',
|
|
47
|
+
module: () => import('../../commands/state/advance-phase.js'),
|
|
48
|
+
exportName: 'advancePhaseCommand',
|
|
49
|
+
},
|
|
50
|
+
'rollback-phase': {
|
|
51
|
+
category: 'state',
|
|
52
|
+
description: 'Rollback feature to previous phase',
|
|
53
|
+
module: () => import('../../commands/state/rollback-phase.js'),
|
|
54
|
+
exportName: 'rollbackPhaseCommand',
|
|
55
|
+
},
|
|
56
|
+
'approve': {
|
|
57
|
+
category: 'state',
|
|
58
|
+
description: 'Approve or reject approval gates',
|
|
59
|
+
module: () => import('../../commands/state/approve.js'),
|
|
60
|
+
exportName: 'approveCommand',
|
|
61
|
+
},
|
|
62
|
+
'validate-phase': {
|
|
63
|
+
category: 'state',
|
|
64
|
+
description: 'Validate phase transition requirements',
|
|
65
|
+
module: () => import('../../commands/state/validate-phase.js'),
|
|
66
|
+
exportName: 'validatePhaseCommand',
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// Generation
|
|
70
|
+
'generate': {
|
|
71
|
+
category: 'generation',
|
|
72
|
+
description: 'Generate design system files from spec',
|
|
73
|
+
module: () => import('../../commands/generation/generate.js'),
|
|
74
|
+
exportName: 'generateCommand',
|
|
75
|
+
},
|
|
76
|
+
'generate-context': {
|
|
77
|
+
category: 'generation',
|
|
78
|
+
description: 'Generate CONTEXT.md for LLM agents',
|
|
79
|
+
module: () => import('../../commands/generation/generate-context.js'),
|
|
80
|
+
exportName: 'generateContextCommand',
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// Validation
|
|
84
|
+
'validate-blazor': {
|
|
85
|
+
category: 'validation',
|
|
86
|
+
description: 'Validate Blazor components and patterns',
|
|
87
|
+
module: () => import('../../commands/validation/validate-blazor.js'),
|
|
88
|
+
exportName: 'validateBlazorCommand',
|
|
89
|
+
},
|
|
90
|
+
'validate-blazor-state': {
|
|
91
|
+
category: 'validation',
|
|
92
|
+
description: 'Validate Blazor state management patterns',
|
|
93
|
+
module: () => import('../../commands/validation/validate-blazor-state.js'),
|
|
94
|
+
exportName: 'validateBlazorStateCommand',
|
|
95
|
+
},
|
|
96
|
+
'validate-css': {
|
|
97
|
+
category: 'validation',
|
|
98
|
+
description: 'Validate CSS classes and design system',
|
|
99
|
+
module: () => import('../../commands/validation/validate-css.js'),
|
|
100
|
+
exportName: 'validateCssCommand',
|
|
101
|
+
},
|
|
102
|
+
'analyze-blazor-concurrency': {
|
|
103
|
+
category: 'validation',
|
|
104
|
+
description: 'Analyze Blazor concurrency issues',
|
|
105
|
+
module: () => import('../../commands/validation/analyze-blazor-concurrency.js'),
|
|
106
|
+
exportName: 'analyzeBlazorConcurrencyCommand',
|
|
107
|
+
},
|
|
108
|
+
'lint-fluent': {
|
|
109
|
+
category: 'validation',
|
|
110
|
+
description: 'Lint Fluent UI Blazor usage',
|
|
111
|
+
module: () => import('../../commands/validation/lint-fluent.js'),
|
|
112
|
+
exportName: 'lintFluentCommand',
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// Templates
|
|
116
|
+
'template-list': {
|
|
117
|
+
category: 'templates',
|
|
118
|
+
description: 'List available templates',
|
|
119
|
+
module: () => import('../../commands/templates/template-list.js'),
|
|
120
|
+
exportName: 'templateListCommand',
|
|
121
|
+
},
|
|
122
|
+
'template-show': {
|
|
123
|
+
category: 'templates',
|
|
124
|
+
description: 'Show template details and preview',
|
|
125
|
+
module: () => import('../../commands/templates/template-show.js'),
|
|
126
|
+
exportName: 'templateShowCommand',
|
|
127
|
+
},
|
|
128
|
+
'template-render': {
|
|
129
|
+
category: 'templates',
|
|
130
|
+
description: 'Render template with variables',
|
|
131
|
+
module: () => import('../../commands/templates/template-render.js'),
|
|
132
|
+
exportName: 'templateRenderCommand',
|
|
133
|
+
},
|
|
134
|
+
'template-customize': {
|
|
135
|
+
category: 'templates',
|
|
136
|
+
description: 'Customize template for stack',
|
|
137
|
+
module: () => import('../../commands/templates/template-customize.js'),
|
|
138
|
+
exportName: 'templateCustomizeCommand',
|
|
139
|
+
},
|
|
140
|
+
'template-validate': {
|
|
141
|
+
category: 'templates',
|
|
142
|
+
description: 'Validate template structure',
|
|
143
|
+
module: () => import('../../commands/templates/template-validate.js'),
|
|
144
|
+
exportName: 'templateValidateCommand',
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
// Project
|
|
148
|
+
'init': {
|
|
149
|
+
category: 'project',
|
|
150
|
+
description: 'Initialize MORPH-SPEC in current directory',
|
|
151
|
+
module: () => import('../../commands/project/init.js'),
|
|
152
|
+
exportName: 'initCommand',
|
|
153
|
+
},
|
|
154
|
+
'doctor': {
|
|
155
|
+
category: 'project',
|
|
156
|
+
description: 'Check project health and configuration',
|
|
157
|
+
module: () => import('../../commands/project/doctor.js'),
|
|
158
|
+
exportName: 'doctorCommand',
|
|
159
|
+
},
|
|
160
|
+
'detect': {
|
|
161
|
+
category: 'project',
|
|
162
|
+
description: 'Auto-detect project stack and configuration',
|
|
163
|
+
module: () => import('../../commands/project/detect.js'),
|
|
164
|
+
exportName: 'detectCommand',
|
|
165
|
+
},
|
|
166
|
+
'detect-workflow': {
|
|
167
|
+
category: 'project',
|
|
168
|
+
description: 'Detect appropriate workflow for request',
|
|
169
|
+
module: () => import('../../commands/project/detect-workflow.js'),
|
|
170
|
+
exportName: 'detectWorkflowCommand',
|
|
171
|
+
},
|
|
172
|
+
'detect-agents': {
|
|
173
|
+
category: 'project',
|
|
174
|
+
description: 'Detect required agents for request',
|
|
175
|
+
module: () => import('../../commands/project/detect-agents.js'),
|
|
176
|
+
exportName: 'detectAgentsCommand',
|
|
177
|
+
},
|
|
178
|
+
'sync': {
|
|
179
|
+
category: 'project',
|
|
180
|
+
description: 'Sync standards from framework',
|
|
181
|
+
module: () => import('../../commands/project/sync.js'),
|
|
182
|
+
exportName: 'syncCommand',
|
|
183
|
+
},
|
|
184
|
+
'update': {
|
|
185
|
+
category: 'project',
|
|
186
|
+
description: 'Update MORPH-SPEC framework',
|
|
187
|
+
module: () => import('../../commands/project/update.js'),
|
|
188
|
+
exportName: 'updateCommand',
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
// Learning
|
|
192
|
+
'capture-pattern': {
|
|
193
|
+
category: 'learning',
|
|
194
|
+
description: 'Capture learned pattern to memory',
|
|
195
|
+
module: () => import('../../commands/learning/capture-pattern.js'),
|
|
196
|
+
exportName: 'capturePatternCommand',
|
|
197
|
+
},
|
|
198
|
+
'search-patterns': {
|
|
199
|
+
category: 'learning',
|
|
200
|
+
description: 'Search learned patterns',
|
|
201
|
+
module: () => import('../../commands/learning/search-patterns.js'),
|
|
202
|
+
exportName: 'searchPatternsCommand',
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
// Tasks
|
|
206
|
+
'task': {
|
|
207
|
+
category: 'tasks',
|
|
208
|
+
description: 'Manage tasks (done, start, next)',
|
|
209
|
+
module: () => import('../../commands/tasks/task.js'),
|
|
210
|
+
exportName: 'taskCommand',
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
// Agents
|
|
214
|
+
'spawn-team': {
|
|
215
|
+
category: 'agents',
|
|
216
|
+
description: 'Spawn agent team for feature',
|
|
217
|
+
module: () => import('../../commands/agents/spawn-team.js'),
|
|
218
|
+
exportName: 'spawnTeamCommand',
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
// Utils
|
|
222
|
+
'troubleshoot': {
|
|
223
|
+
category: 'utils',
|
|
224
|
+
description: 'Troubleshoot common errors',
|
|
225
|
+
module: () => import('../../commands/utils/troubleshoot.js'),
|
|
226
|
+
exportName: 'troubleshootCommand',
|
|
227
|
+
},
|
|
228
|
+
'session-summary': {
|
|
229
|
+
category: 'utils',
|
|
230
|
+
description: 'Generate session summary and recap',
|
|
231
|
+
module: () => import('../../commands/utils/session-summary.js'),
|
|
232
|
+
exportName: 'sessionSummaryCommand',
|
|
233
|
+
},
|
|
234
|
+
'migrate-state': {
|
|
235
|
+
category: 'utils',
|
|
236
|
+
description: 'Migrate state to new version',
|
|
237
|
+
module: () => import('../../commands/utils/migrate-state.js'),
|
|
238
|
+
exportName: 'migrateStateCommand',
|
|
239
|
+
},
|
|
240
|
+
'upgrade': {
|
|
241
|
+
category: 'utils',
|
|
242
|
+
description: 'Upgrade project to latest framework',
|
|
243
|
+
module: () => import('../../commands/utils/upgrade.js'),
|
|
244
|
+
exportName: 'upgradeCommand',
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Load command dynamically
|
|
250
|
+
*
|
|
251
|
+
* @param {string} commandName - Command name (e.g., 'init', 'template-list')
|
|
252
|
+
* @returns {Promise<Function>} Command function
|
|
253
|
+
*/
|
|
254
|
+
export async function loadCommand(commandName) {
|
|
255
|
+
const meta = commandMetadata[commandName];
|
|
256
|
+
|
|
257
|
+
if (!meta) {
|
|
258
|
+
const availableCommands = Object.keys(commandMetadata).join(', ');
|
|
259
|
+
throw new Error(`Unknown command: ${commandName}\n\nAvailable: ${availableCommands}`);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const module = await meta.module();
|
|
263
|
+
const commandFn = module[meta.exportName] || module.default;
|
|
264
|
+
|
|
265
|
+
if (!commandFn) {
|
|
266
|
+
throw new Error(`Command '${commandName}' module does not export '${meta.exportName}'`);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return commandFn;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Get all command names
|
|
274
|
+
*
|
|
275
|
+
* @returns {string[]} Array of command names
|
|
276
|
+
*/
|
|
277
|
+
export function getAllCommandNames() {
|
|
278
|
+
return Object.keys(commandMetadata);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Get commands by category
|
|
283
|
+
*
|
|
284
|
+
* @param {string} category - Category name
|
|
285
|
+
* @returns {string[]} Array of command names in category
|
|
286
|
+
*/
|
|
287
|
+
export function getCommandsByCategory(category) {
|
|
288
|
+
return Object.entries(commandMetadata)
|
|
289
|
+
.filter(([_, meta]) => meta.category === category)
|
|
290
|
+
.map(([name, _]) => name);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Get all categories
|
|
295
|
+
*
|
|
296
|
+
* @returns {string[]} Array of unique category names
|
|
297
|
+
*/
|
|
298
|
+
export function getAllCategories() {
|
|
299
|
+
const categories = new Set();
|
|
300
|
+
Object.values(commandMetadata).forEach(meta => categories.add(meta.category));
|
|
301
|
+
return Array.from(categories).sort();
|
|
302
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator Registry - Technology-Based Auto-Discovery
|
|
3
|
+
*
|
|
4
|
+
* Maps validator types to their modules for dynamic loading.
|
|
5
|
+
* Organized by technology (blazor, css, architecture, etc.)
|
|
6
|
+
*
|
|
7
|
+
* @module validator-registry
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Validator Metadata Registry
|
|
12
|
+
*
|
|
13
|
+
* Technology-scoped validator discovery.
|
|
14
|
+
*/
|
|
15
|
+
export const validatorMetadata = {
|
|
16
|
+
// Blazor Validators
|
|
17
|
+
'blazor': {
|
|
18
|
+
technology: 'blazor',
|
|
19
|
+
validators: [
|
|
20
|
+
{
|
|
21
|
+
id: 'blazor-validator',
|
|
22
|
+
name: 'Blazor Patterns Validator',
|
|
23
|
+
description: 'Validates Fluent UI Blazor patterns and components',
|
|
24
|
+
module: () => import('../../lib/validators/blazor/blazor-validator.js'),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'blazor-state',
|
|
28
|
+
name: 'Blazor State Validator',
|
|
29
|
+
description: 'Validates Blazor state management patterns',
|
|
30
|
+
module: () => import('../../lib/validators/blazor/blazor-state-validator.js'),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'blazor-concurrency',
|
|
34
|
+
name: 'Blazor Concurrency Analyzer',
|
|
35
|
+
description: 'Analyzes Blazor concurrency and DbContext issues',
|
|
36
|
+
module: () => import('../../lib/validators/blazor/blazor-concurrency-analyzer.js'),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
// CSS Validators
|
|
42
|
+
'css': {
|
|
43
|
+
technology: 'css',
|
|
44
|
+
validators: [
|
|
45
|
+
{
|
|
46
|
+
id: 'css-validator',
|
|
47
|
+
name: 'CSS Validator',
|
|
48
|
+
description: 'Validates CSS classes and design system compliance',
|
|
49
|
+
module: () => import('../../lib/validators/css/css-validator.js'),
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Architecture Validators
|
|
55
|
+
'architecture': {
|
|
56
|
+
technology: 'architecture',
|
|
57
|
+
validators: [
|
|
58
|
+
{
|
|
59
|
+
id: 'architecture-validator',
|
|
60
|
+
name: 'Architecture Validator',
|
|
61
|
+
description: 'Validates architectural patterns (DI, CQRS, etc.)',
|
|
62
|
+
module: () => import('../../lib/validators/architecture/architecture-validator.js'),
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
// Design System Validators
|
|
68
|
+
'design-system': {
|
|
69
|
+
technology: 'design-system',
|
|
70
|
+
validators: [
|
|
71
|
+
{
|
|
72
|
+
id: 'design-system-validator',
|
|
73
|
+
name: 'Design System Validator',
|
|
74
|
+
description: 'Validates design system compliance',
|
|
75
|
+
module: () => import('../../lib/validators/design-system/design-system-validator.js'),
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
// Content Validators
|
|
81
|
+
'content': {
|
|
82
|
+
technology: 'content',
|
|
83
|
+
validators: [
|
|
84
|
+
{
|
|
85
|
+
id: 'content-validator',
|
|
86
|
+
name: 'Content Validator',
|
|
87
|
+
description: 'Validates content and specification format',
|
|
88
|
+
module: () => import('../../lib/validators/content/content-validator.js'),
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
// Contract Validators
|
|
94
|
+
'contracts': {
|
|
95
|
+
technology: 'contracts',
|
|
96
|
+
validators: [
|
|
97
|
+
{
|
|
98
|
+
id: 'contract-compliance-validator',
|
|
99
|
+
name: 'Contract Compliance Validator',
|
|
100
|
+
description: 'Validates API contract compliance',
|
|
101
|
+
module: () => import('../../lib/validators/contracts/contract-compliance-validator.js'),
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
// Package Validators
|
|
107
|
+
'packages': {
|
|
108
|
+
technology: 'packages',
|
|
109
|
+
validators: [
|
|
110
|
+
{
|
|
111
|
+
id: 'package-validator',
|
|
112
|
+
name: 'Package Validator',
|
|
113
|
+
description: 'Validates package dependencies and versions',
|
|
114
|
+
module: () => import('../../lib/validators/packages/package-validator.js'),
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// UI Validators
|
|
120
|
+
'ui': {
|
|
121
|
+
technology: 'ui',
|
|
122
|
+
validators: [
|
|
123
|
+
{
|
|
124
|
+
id: 'ui-contrast-validator',
|
|
125
|
+
name: 'UI Contrast Validator',
|
|
126
|
+
description: 'Validates UI contrast and accessibility',
|
|
127
|
+
module: () => import('../../lib/validators/ui/ui-contrast-validator.js'),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Load validator by ID
|
|
135
|
+
*
|
|
136
|
+
* @param {string} validatorId - Validator ID (e.g., 'blazor-validator')
|
|
137
|
+
* @returns {Promise<Object>} Validator module
|
|
138
|
+
*/
|
|
139
|
+
export async function loadValidator(validatorId) {
|
|
140
|
+
for (const techMeta of Object.values(validatorMetadata)) {
|
|
141
|
+
const validator = techMeta.validators.find(v => v.id === validatorId);
|
|
142
|
+
if (validator) {
|
|
143
|
+
return await validator.module();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
throw new Error(`Validator not found: ${validatorId}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Load all validators for a technology
|
|
152
|
+
*
|
|
153
|
+
* @param {string} technology - Technology name (e.g., 'blazor', 'css')
|
|
154
|
+
* @returns {Promise<Object[]>} Array of validator modules
|
|
155
|
+
*/
|
|
156
|
+
export async function loadValidatorsForTechnology(technology) {
|
|
157
|
+
const techMeta = validatorMetadata[technology];
|
|
158
|
+
|
|
159
|
+
if (!techMeta) {
|
|
160
|
+
throw new Error(`No validators found for technology: ${technology}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return await Promise.all(
|
|
164
|
+
techMeta.validators.map(v => v.module())
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Get all validator IDs
|
|
170
|
+
*
|
|
171
|
+
* @returns {string[]} Array of validator IDs
|
|
172
|
+
*/
|
|
173
|
+
export function getAllValidatorIds() {
|
|
174
|
+
const ids = [];
|
|
175
|
+
for (const techMeta of Object.values(validatorMetadata)) {
|
|
176
|
+
ids.push(...techMeta.validators.map(v => v.id));
|
|
177
|
+
}
|
|
178
|
+
return ids;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get all technologies
|
|
183
|
+
*
|
|
184
|
+
* @returns {string[]} Array of technology names
|
|
185
|
+
*/
|
|
186
|
+
export function getAllTechnologies() {
|
|
187
|
+
return Object.keys(validatorMetadata);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get validator metadata by ID
|
|
192
|
+
*
|
|
193
|
+
* @param {string} validatorId - Validator ID
|
|
194
|
+
* @returns {Object|null} Validator metadata or null
|
|
195
|
+
*/
|
|
196
|
+
export function getValidatorMetadata(validatorId) {
|
|
197
|
+
for (const techMeta of Object.values(validatorMetadata)) {
|
|
198
|
+
const validator = techMeta.validators.find(v => v.id === validatorId);
|
|
199
|
+
if (validator) {
|
|
200
|
+
return { ...validator, technology: techMeta.technology };
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|