@polymorphism-tech/morph-spec 4.12.0 → 4.14.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 +7 -7
- package/README.md +28 -34
- package/bin/morph-spec.js +41 -24
- package/bin/task-manager.js +962 -1341
- package/bin/validate.js +1 -1
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +14 -16
- package/docs/QUICKSTART.md +15 -15
- package/framework/CLAUDE.md +5 -2
- package/framework/agents/README.md +3 -4
- package/framework/agents/ai-agents/ai-system-architect.md +6 -10
- package/framework/agents/architecture/seo-growth-hacker.md +166 -326
- package/framework/agents/architecture/standards-architect.md +21 -31
- package/framework/agents/backend/dotnet-senior.md +160 -86
- package/framework/agents/backend/ef-modeler.md +2 -6
- package/framework/agents/backend/hangfire-orchestrator.md +8 -9
- package/framework/agents/backend/ms-agent-expert.md +1 -1
- package/framework/agents/frontend/nextjs-expert.md +198 -133
- package/framework/agents/frontend/ui-ux-designer.md +226 -267
- package/framework/agents/infrastructure/infra-architect.md +191 -27
- package/framework/agents/integrations/clerk-auth.md +19 -26
- package/framework/agents/integrations/hangfire-integration.md +1 -4
- package/framework/agents.json +1084 -2278
- package/framework/commands/morph-apply.md +4 -6
- package/framework/commands/morph-preflight.md +192 -269
- package/framework/commands/morph-proposal.md +210 -238
- package/framework/commands/morph-status.md +72 -92
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
- package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
- package/framework/hooks/claude-code/statusline.py +4 -5
- package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
- package/framework/hooks/shared/compact-restore.js +28 -5
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +162 -200
- package/framework/rules/ai-agents-standards.md +15 -0
- package/framework/rules/asaas-standards.md +13 -0
- package/framework/rules/clerk-standards.md +13 -0
- package/framework/rules/csharp-standards.md +8 -4
- package/framework/rules/data-standards.md +18 -0
- package/framework/rules/dotnet-templates.md +87 -0
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/hangfire-standards.md +13 -0
- package/framework/rules/infrastructure-standards.md +27 -16
- package/framework/rules/morph-workflow.md +73 -13
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/rules/nextjs-templates.md +40 -0
- package/framework/rules/resend-standards.md +12 -0
- package/framework/rules/supabase-standards.md +29 -0
- package/framework/skills/README.md +6 -8
- package/framework/skills/level-0-meta/mcp-registry.json +21 -99
- package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
- package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
- package/framework/skills/level-1-workflows/README.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +57 -123
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +143 -172
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/squad-templates/backend-only.json +6 -6
- package/framework/squad-templates/frontend-only.json +17 -8
- package/framework/squad-templates/full-stack.json +29 -24
- package/framework/standards/STANDARDS.json +1021 -2369
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
- package/framework/standards/backend/dotnet/result-pattern.md +213 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
- package/framework/standards/backend/dotnet/scrutor.md +158 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
- package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
- package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
- package/framework/standards/integration/mcp/mcp-tools.md +91 -77
- package/framework/templates/IDE-SNIPPETS.md +2 -6
- package/framework/templates/README.md +709 -814
- package/framework/templates/REGISTRY.json +223 -762
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
- package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
- package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
- package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
- package/framework/templates/code/dotnet/backend/repository.cs +148 -141
- package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
- package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
- package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
- package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
- package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
- package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
- package/framework/templates/code/dotnet/jobs/job.cs +21 -17
- package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
- package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
- package/framework/templates/code/dotnet/test.cs +192 -106
- package/framework/templates/context/ARCHITECTURE.md +89 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
- package/framework/templates/context/CONTEXT.md +180 -181
- package/framework/templates/context/design-system.md +1 -5
- package/framework/templates/docs/onboarding.md +2 -3
- package/framework/templates/docs/proposal.md +171 -182
- package/framework/templates/docs/spec.md +1 -3
- package/framework/templates/docs/ui-components.md +0 -72
- package/framework/templates/examples/design-system-examples.md +4 -4
- package/framework/templates/feature/decisions.md +0 -66
- package/framework/templates/feature/recap.md +1 -2
- package/framework/templates/infrastructure/github/README.md +56 -593
- package/framework/templates/integrations/clerk-config.cs +0 -41
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
- package/framework/templates/project/validate.js +2 -4
- package/framework/templates/ui/design-system.css +1 -1
- package/framework/workflows/README.md +8 -8
- package/framework/workflows/configs/fast-track.json +51 -0
- package/framework/workflows/configs/full.json +68 -0
- package/framework/workflows/configs/standard.json +7 -3
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
- package/framework/workflows/docs/enforcement-pipeline.md +18 -19
- package/framework/workflows/docs/full-morph.md +69 -76
- package/framework/workflows/docs/standard.md +49 -44
- package/framework/workflows/docs/ui-refresh.md +1 -1
- package/package.json +3 -3
- package/src/commands/agents/dispatch-agents.js +55 -116
- package/src/commands/context/context-refresh.js +79 -0
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +12 -0
- package/src/commands/project/status.js +6 -12
- package/src/commands/scaffold/scaffold.js +131 -0
- package/src/commands/scope/escalate.js +1 -1
- package/src/commands/state/advance-phase.js +15 -29
- package/src/commands/state/state.js +20 -5
- package/src/commands/tasks/task.js +0 -30
- package/src/commands/validation/validate-feature.js +3 -10
- package/src/core/paths/output-schema.js +12 -13
- package/src/core/state/phase-state-machine.js +211 -217
- package/src/core/state/state-manager.js +9 -9
- package/src/lib/agents/agents-manager.js +2 -2
- package/src/lib/agents/output-collector.js +1 -2
- package/src/lib/detectors/design-system-detector.js +4 -4
- package/src/lib/detectors/index.js +1 -11
- package/src/lib/generators/architecture-scanner.js +640 -0
- package/src/lib/generators/context-generator.js +3 -3
- package/src/lib/generators/design-system-generator.js +508 -587
- package/src/lib/generators/index.js +12 -10
- package/src/lib/generators/metadata-extractor.js +386 -387
- package/src/lib/generators/recap-generator.js +4 -4
- package/src/lib/generators/scaffold-generator.js +317 -0
- package/src/lib/generators/settings-generator.js +0 -1
- package/src/lib/phase-chain/phase-validator.js +64 -42
- package/src/lib/stack/stack-profile.js +2 -2
- package/src/lib/standards/digest-builder.js +72 -285
- package/src/lib/tasks/task-parser.js +11 -5
- package/src/lib/validators/architecture/architecture-validator.js +259 -387
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/css/css-validator.js +340 -352
- package/src/lib/validators/packages/package-validator.js +347 -360
- package/src/lib/validators/shared/issue-counter.js +14 -18
- package/src/lib/validators/validation-runner.js +3 -19
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agents-installer.js +61 -10
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +11 -19
- package/src/utils/skills-installer.js +178 -178
- package/framework/agents/architecture/prompt-engineer.md +0 -195
- package/framework/agents/backend/api-designer.md +0 -106
- package/framework/agents/frontend/blazor-builder.md +0 -229
- package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
- package/framework/agents/infrastructure/azure-architect.md +0 -150
- package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
- package/framework/agents/infrastructure/bicep-architect.md +0 -132
- package/framework/agents/infrastructure/container-specialist.md +0 -137
- package/framework/agents/infrastructure/devops-engineer.md +0 -126
- package/framework/agents/integrations/azure-identity.md +0 -148
- package/framework/agents/quality/code-analyzer.md +0 -239
- package/framework/agents/quality/testing-specialist.md +0 -130
- package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
- package/framework/index/troubleshooting-index.json +0 -184
- package/framework/rules/testing-standards.md +0 -14
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
- package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
- package/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/framework/standards/architecture/ddd/entities.md +0 -99
- package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/framework/standards/backend/api/minimal-api.md +0 -494
- package/framework/standards/backend/api/rest.md +0 -492
- package/framework/standards/backend/authentication/passkeys.md +0 -428
- package/framework/standards/backend/database/ef-core.md +0 -199
- package/framework/standards/backend/database/migrations.md +0 -393
- package/framework/standards/backend/database/repository-patterns.md +0 -528
- package/framework/standards/backend/dotnet/async.md +0 -366
- package/framework/standards/backend/dotnet/core.md +0 -117
- package/framework/standards/backend/dotnet/di.md +0 -439
- package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/framework/standards/context/analytics.md +0 -96
- package/framework/standards/context/bundles.md +0 -110
- package/framework/standards/context/priming.md +0 -78
- package/framework/standards/core/architecture.md +0 -185
- package/framework/standards/core/coding.md +0 -214
- package/framework/standards/core/git-branching-strategy.md +0 -403
- package/framework/standards/core/git.md +0 -185
- package/framework/standards/core/testing.md +0 -295
- package/framework/standards/data/nosql/blob-storage.md +0 -102
- package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/framework/standards/frontend/blazor/state.md +0 -191
- package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
- package/framework/standards/frontend/design-system/design-trends.md +0 -171
- package/framework/standards/infrastructure/azure/azure.md +0 -624
- package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
- package/framework/standards/integration/api/graphql.md +0 -91
- package/framework/standards/integration/api/grpc.md +0 -114
- package/framework/standards/integration/api/rest-design.md +0 -95
- package/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/framework/standards/observability/logging.md +0 -131
- package/framework/standards/observability/metrics.md +0 -121
- package/framework/standards/observability/monitoring.md +0 -114
- package/framework/standards/observability/tracing.md +0 -132
- package/framework/standards/workflows/parallel-execution.md +0 -112
- package/framework/standards/workflows/thread-management.md +0 -113
- package/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/framework/templates/infrastructure/azure/README.md +0 -286
- package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/framework/templates/saas/subscription.cs +0 -347
- package/framework/templates/saas/tenant.cs +0 -338
- package/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/framework/templates/ui/MudTheme.cs +0 -281
- package/framework/workflows/configs/nodejs-cli.json +0 -40
- package/src/commands/standards/context-budget.js +0 -89
- package/src/lib/standards/index.js +0 -7
- package/src/lib/standards/standards-context-injector.js +0 -302
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
- package/src/lib/validators/blazor/blazor-validator.js +0 -369
- package/src/lib/validators/blazor/index.js +0 -9
|
@@ -1,76 +1,69 @@
|
|
|
1
|
-
# Workflow: FULL
|
|
2
|
-
|
|
3
|
-
> **Layer:** 1 | **Load:** on-keyword | **Keywords:** sistema,
|
|
4
|
-
|
|
5
|
-
## Critérios
|
|
6
|
-
|
|
7
|
-
- > 10 arquivos, > 500 linhas, múltiplos componentes novos
|
|
8
|
-
- Infraestrutura
|
|
9
|
-
|
|
10
|
-
## Fases (TODAS obrigatórias)
|
|
11
|
-
|
|
12
|
-
### FASE 0
|
|
13
|
-
1.
|
|
14
|
-
2.
|
|
15
|
-
3.
|
|
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
|
-
- **⛔ PAUSA:** Aprovar
|
|
48
|
-
|
|
49
|
-
### FASE
|
|
50
|
-
1.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
## Exemplos
|
|
72
|
-
- "Sistema de relatórios com jobs agendados Hangfire"
|
|
73
|
-
- "Autenticação completa com Clerk (login, signup, OAuth)"
|
|
74
|
-
- "Dashboard com gráficos, tabelas e filtros complexos"
|
|
75
|
-
- "RAG pipeline com Azure AI Search e embeddings"
|
|
76
|
-
- "Infraestrutura Azure completa com Bicep"
|
|
1
|
+
# Workflow: FULL (Alta Complexidade)
|
|
2
|
+
|
|
3
|
+
> **Layer:** 1 | **Load:** on-keyword | **Keywords:** sistema, integração, arquitetura, migração, infraestrutura, plataforma
|
|
4
|
+
|
|
5
|
+
## Critérios
|
|
6
|
+
|
|
7
|
+
- > 10 arquivos, > 500 linhas, múltiplos componentes novos
|
|
8
|
+
- Infraestrutura, decisões arquiteturais estratégicas, multi-domínio
|
|
9
|
+
|
|
10
|
+
## Fases (TODAS obrigatórias)
|
|
11
|
+
|
|
12
|
+
### FASE 0: PROPOSAL
|
|
13
|
+
1. Analisar solicitação, identificar stack, estimar complexidade
|
|
14
|
+
2. Gerar proposal.md, registrar agentes no state.json
|
|
15
|
+
3. Avaliar complexidade → recomendar workflow full
|
|
16
|
+
- **⛔ PAUSA:** Aprovar proposta?
|
|
17
|
+
|
|
18
|
+
### FASE 1: UI/UX (condicional — se keywords UI detectadas)
|
|
19
|
+
1. **Perguntar ao usuário:** layout, referências visuais, fluxo, imagens
|
|
20
|
+
2. Analisar referências fornecidas
|
|
21
|
+
3. Gerar deliverables (design-system, mockups, components, flows)
|
|
22
|
+
4. Validar acessibilidade (WCAG 2.1) e responsividade
|
|
23
|
+
- **⛔ PAUSA:** Aprovar UI/UX?
|
|
24
|
+
|
|
25
|
+
### FASE 2: DESIGN (com clarificação integrada)
|
|
26
|
+
1. Scan real do schema (Supabase MCP, EF Core, TypeScript)
|
|
27
|
+
2. Validar schema com usuário (CHECKPOINT 1)
|
|
28
|
+
3. Gerar blueprint arquitetural (CHECKPOINT 2)
|
|
29
|
+
4. Gerar spec.md, contracts.cs/.ts, schema-analysis.md, decisions.md
|
|
30
|
+
5. **Quality + Satisfaction scoring** (0-100):
|
|
31
|
+
- Quality: schema fidelity, functional coverage, blueprint, integrations, infra
|
|
32
|
+
- Satisfaction: functional completeness, failure coverage, edge cases, clarity, contracts
|
|
33
|
+
6. Loop de refinamento: perguntas → atualizar spec.md direto → re-score
|
|
34
|
+
7. Sai quando score ≥ 85 E usuário aprova
|
|
35
|
+
- **⛔ PAUSA:** Aprovar design?
|
|
36
|
+
|
|
37
|
+
### FASE 3: PLAN
|
|
38
|
+
1. Ler spec + contracts + decisions
|
|
39
|
+
2. Analisar codebase existente (Glob + Grep)
|
|
40
|
+
3. Determinar estratégia de execução (single/subagents/agent-teams)
|
|
41
|
+
4. Gerar plan.md com tasks cross-referenciando FRs
|
|
42
|
+
- **⛔ PAUSA:** Aprovar plano?
|
|
43
|
+
|
|
44
|
+
### FASE 4: TASKS
|
|
45
|
+
1. Quebrar spec em tasks T001-TXXX com [FR refs]
|
|
46
|
+
2. Definir ordem, checkpoints, dependências
|
|
47
|
+
- **⛔ PAUSA:** Aprovar tasks?
|
|
48
|
+
|
|
49
|
+
### FASE 5: IMPLEMENT
|
|
50
|
+
1. Para cada task: ler spec FRs → ler contracts → implementar → verificar
|
|
51
|
+
2. `morph-spec task done {feature} {task-id}` após cada task
|
|
52
|
+
3. Checkpoints automáticos a cada 3 tasks
|
|
53
|
+
4. Gerar recap.md ao final
|
|
54
|
+
|
|
55
|
+
### FASE 6: SYNC
|
|
56
|
+
1. Revisar decisions.md, categorizar
|
|
57
|
+
2. Promover para `.morph/context/{category}.md`
|
|
58
|
+
3. Gerar commit dedicado de sync
|
|
59
|
+
- **⛔ PAUSA:** Aprovar promoção de decisões?
|
|
60
|
+
|
|
61
|
+
## Outputs Completos
|
|
62
|
+
proposal.md, design-system.md, mockups.md, components.md, flows.md, spec.md, contracts.cs/.ts, schema-analysis.md, decisions.md, plan.md, tasks.md, recap.md
|
|
63
|
+
|
|
64
|
+
## Exemplos
|
|
65
|
+
- "Sistema de relatórios com jobs agendados Hangfire"
|
|
66
|
+
- "Autenticação completa com Clerk (login, signup, OAuth)"
|
|
67
|
+
- "Dashboard com gráficos, tabelas e filtros complexos"
|
|
68
|
+
- "RAG pipeline com AI Search e embeddings"
|
|
69
|
+
- "Infraestrutura completa com Docker/Easypanel"
|
|
@@ -1,44 +1,49 @@
|
|
|
1
|
-
# Workflow: STANDARD (Média Complexidade)
|
|
2
|
-
|
|
3
|
-
> **Layer:** 1 | **Load:** on-keyword | **Keywords:** paginação, filtro, refatorar, performance, exportar
|
|
4
|
-
|
|
5
|
-
## Critérios
|
|
6
|
-
|
|
7
|
-
- 3-10 arquivos, 50-500 linhas, 1-2 componentes simples
|
|
8
|
-
- Sem infraestrutura complexa, decisões táticas (não estratégicas)
|
|
9
|
-
|
|
10
|
-
## Fases
|
|
11
|
-
|
|
12
|
-
### 1. FASE 0: PROPOSAL (simplificada)
|
|
13
|
-
- Análise inicial em 1 parágrafo
|
|
14
|
-
- Detecta agentes relevantes
|
|
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
|
-
|
|
1
|
+
# Workflow: STANDARD (Média Complexidade)
|
|
2
|
+
|
|
3
|
+
> **Layer:** 1 | **Load:** on-keyword | **Keywords:** paginação, filtro, refatorar, performance, exportar
|
|
4
|
+
|
|
5
|
+
## Critérios
|
|
6
|
+
|
|
7
|
+
- 3-10 arquivos, 50-500 linhas, 1-2 componentes simples
|
|
8
|
+
- Sem infraestrutura complexa, decisões táticas (não estratégicas)
|
|
9
|
+
|
|
10
|
+
## Fases
|
|
11
|
+
|
|
12
|
+
### 1. FASE 0: PROPOSAL (simplificada)
|
|
13
|
+
- Análise inicial em 1 parágrafo
|
|
14
|
+
- Detecta agentes relevantes
|
|
15
|
+
- Avalia complexidade e recomenda workflow
|
|
16
|
+
- **PAUSA:** Aprovar?
|
|
17
|
+
|
|
18
|
+
### 2. FASE 2: DESIGN (spec.md + clarificação integrada)
|
|
19
|
+
- Spec técnico conciso (1-2 páginas)
|
|
20
|
+
- Quality loop com scoring (0-100) + clarificação embutida
|
|
21
|
+
- Spec editável até aprovação final
|
|
22
|
+
- Decisões táticas em decisions.md
|
|
23
|
+
- **PAUSA:** Aprovar?
|
|
24
|
+
|
|
25
|
+
### 3. FASE 3: PLAN
|
|
26
|
+
- Plano de implementação com paths exatos e TDD
|
|
27
|
+
- Tasks com cross-references para FRs do spec
|
|
28
|
+
- **PAUSA:** Aprovar?
|
|
29
|
+
|
|
30
|
+
### 4. FASE 4: TASKS
|
|
31
|
+
- Breakdown em tasks com [FR001, FR003] refs
|
|
32
|
+
- **PAUSA:** Aprovar? (se > 5 tasks)
|
|
33
|
+
|
|
34
|
+
### 5. FASE 5: IMPLEMENT
|
|
35
|
+
- Implementa task por task consultando spec por FR
|
|
36
|
+
- Gera recap.md ao final
|
|
37
|
+
|
|
38
|
+
## Outputs
|
|
39
|
+
proposal.md, spec.md, plan.md, tasks.md, recap.md
|
|
40
|
+
|
|
41
|
+
## Fases Puladas
|
|
42
|
+
- UI/UX — se não tiver front-end significativo (skipIfCondition: !hasUIAgents)
|
|
43
|
+
- Sync — decisões não são estratégicas
|
|
44
|
+
|
|
45
|
+
## Exemplos
|
|
46
|
+
- "Adicionar paginação na tabela de usuários"
|
|
47
|
+
- "Criar filtro por data no relatório"
|
|
48
|
+
- "Refatorar serviço de email para async"
|
|
49
|
+
- "Adicionar botão de exportar CSV"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- Se protótipo existir: ler e extrair padrões
|
|
17
17
|
- **PAUSA:** Escolher direção estética
|
|
18
18
|
|
|
19
|
-
### 2. DESIGN SYSTEM (FASE
|
|
19
|
+
### 2. DESIGN SYSTEM (FASE 2 simplificada)
|
|
20
20
|
- Definir variáveis CSS novas
|
|
21
21
|
- Listar componentes CSS a criar (checklist)
|
|
22
22
|
- Gerar/atualizar design-system.css
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polymorphism-tech/morph-spec",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.14.0",
|
|
4
4
|
"description": "MORPH-SPEC: AI-First development framework with validation pipeline and multi-stack support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"spec-driven",
|
|
11
11
|
"dotnet",
|
|
12
12
|
"dotnet10",
|
|
13
|
-
"
|
|
13
|
+
"nextjs",
|
|
14
14
|
"agent-framework",
|
|
15
|
-
"
|
|
15
|
+
"vsa",
|
|
16
16
|
"framework",
|
|
17
17
|
"developer-tools",
|
|
18
18
|
"morph",
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dispatch-agents —
|
|
2
|
+
* dispatch-agents — Advisor for native Claude Code agent dispatch
|
|
3
3
|
*
|
|
4
|
-
* Reads activeAgents from state.json +
|
|
5
|
-
*
|
|
4
|
+
* Reads activeAgents from state.json + agents.json and outputs a
|
|
5
|
+
* recommendation of which agents to use and which tasks they handle.
|
|
6
|
+
* Agent .md files in .claude/agents/ are self-contained — dispatch
|
|
7
|
+
* does NOT compose prompts (except for tier-4 validators).
|
|
6
8
|
*
|
|
7
9
|
* Usage:
|
|
8
10
|
* morph-spec dispatch-agents <feature> <phase>
|
|
@@ -11,8 +13,10 @@
|
|
|
11
13
|
* Output (JSON):
|
|
12
14
|
* {
|
|
13
15
|
* feature, phase, shouldDispatch, reason,
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* recommended: { [group]: subagentType[] },
|
|
17
|
+
* tasks: { [group]: taskId[] },
|
|
18
|
+
* agents: [{ id, subagentType, title, tier, icon, group }],
|
|
19
|
+
* warnings: []
|
|
16
20
|
* }
|
|
17
21
|
*/
|
|
18
22
|
|
|
@@ -20,7 +24,7 @@ import { readFileSync, existsSync } from 'fs';
|
|
|
20
24
|
import { join, dirname } from 'path';
|
|
21
25
|
import { fileURLToPath } from 'url';
|
|
22
26
|
import { loadState, stateExists, logDispatch } from '../../core/state/state-manager.js';
|
|
23
|
-
import {
|
|
27
|
+
import { buildValidatorPrompt } from '../../lib/standards/digest-builder.js';
|
|
24
28
|
import { agentIdToSubagentType } from '../../utils/agent-id-mapper.js';
|
|
25
29
|
import { shouldInstall, getProjectTags } from '../../lib/stack-filter.js';
|
|
26
30
|
import { parseAndGroupTasks } from '../../lib/tasks/task-parser.js';
|
|
@@ -179,8 +183,10 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
179
183
|
return {
|
|
180
184
|
shouldDispatch: false,
|
|
181
185
|
reason: 'state.json not found — run morph-spec state init',
|
|
186
|
+
recommended: {},
|
|
187
|
+
tasks: {},
|
|
182
188
|
agents: [],
|
|
183
|
-
|
|
189
|
+
warnings: [],
|
|
184
190
|
};
|
|
185
191
|
}
|
|
186
192
|
|
|
@@ -191,8 +197,10 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
191
197
|
phase,
|
|
192
198
|
shouldDispatch: false,
|
|
193
199
|
reason: `Feature '${featureName}' not found in state.json`,
|
|
200
|
+
recommended: {},
|
|
201
|
+
tasks: {},
|
|
194
202
|
agents: [],
|
|
195
|
-
|
|
203
|
+
warnings: [],
|
|
196
204
|
};
|
|
197
205
|
}
|
|
198
206
|
|
|
@@ -204,25 +212,16 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
204
212
|
phase,
|
|
205
213
|
shouldDispatch: false,
|
|
206
214
|
reason: 'framework/agents.json not found',
|
|
215
|
+
recommended: {},
|
|
216
|
+
tasks: {},
|
|
207
217
|
agents: [],
|
|
208
|
-
|
|
218
|
+
warnings: [],
|
|
209
219
|
};
|
|
210
220
|
}
|
|
211
221
|
|
|
212
222
|
const agentsData = JSON.parse(readFileSync(agentsPath, 'utf8'));
|
|
213
223
|
const allAgents = agentsData.agents || {};
|
|
214
224
|
|
|
215
|
-
// Load phases.json for required skills injection (opts.phasesJsonPath allows override for testing)
|
|
216
|
-
const phasesPath = opts.phasesJsonPath || PHASES_JSON_PATH;
|
|
217
|
-
let phasesData = null;
|
|
218
|
-
try {
|
|
219
|
-
if (existsSync(phasesPath)) {
|
|
220
|
-
phasesData = JSON.parse(readFileSync(phasesPath, 'utf8'));
|
|
221
|
-
}
|
|
222
|
-
} catch {
|
|
223
|
-
// Non-blocking — fail silent, skills block will be omitted
|
|
224
|
-
}
|
|
225
|
-
|
|
226
225
|
// Load project config for stack filtering
|
|
227
226
|
const configPath = join(projectPath, '.morph', 'config.json');
|
|
228
227
|
let projectTags = [];
|
|
@@ -278,44 +277,28 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
278
277
|
|
|
279
278
|
const group = getAgentGroup(agentId, agentData);
|
|
280
279
|
|
|
281
|
-
//
|
|
282
|
-
|
|
283
|
-
if (isValidateMode && isTier4) {
|
|
284
|
-
rawPrompt = buildValidatorPrompt(agentId) || agentData.teammate?.spawn_prompt || '';
|
|
285
|
-
} else {
|
|
286
|
-
rawPrompt = agentData.teammate.spawn_prompt;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Append standards digest as Constraints block, then skills block, then MCP block
|
|
290
|
-
const briefing = buildAgentBriefing(agentId, phase);
|
|
291
|
-
const skillsBlock = buildSkillsBlock(phase, phasesData);
|
|
292
|
-
const mcpBlock = buildMcpBlock(phase, phasesData);
|
|
293
|
-
const fullTaskPrompt = [
|
|
294
|
-
rawPrompt,
|
|
295
|
-
briefing ? `\n\nConstraints:\n${briefing}` : '',
|
|
296
|
-
skillsBlock ? `\n\n${skillsBlock}` : '',
|
|
297
|
-
mcpBlock ? `\n\n${mcpBlock}` : '',
|
|
298
|
-
].join('');
|
|
299
|
-
|
|
300
|
-
dispatchableAgents.push({
|
|
280
|
+
// Tier-4 validators in validate mode still get taskPrompt (dynamically generated)
|
|
281
|
+
const agentEntry = {
|
|
301
282
|
id: agentId,
|
|
302
283
|
subagentType: agentIdToSubagentType(agentId, agentData.tier),
|
|
303
284
|
title: agentData.title,
|
|
304
285
|
tier: agentData.tier,
|
|
305
286
|
icon: agentData.teammate?.icon || '🤖',
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
taskPrompt
|
|
311
|
-
}
|
|
287
|
+
group,
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
if (isValidateMode && isTier4) {
|
|
291
|
+
agentEntry.taskPrompt = buildValidatorPrompt(agentId) || agentData.teammate?.spawn_prompt || '';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
dispatchableAgents.push(agentEntry);
|
|
312
295
|
}
|
|
313
296
|
|
|
314
297
|
// Sort: domain-analysis first, then by tier (ascending), then alphabetically
|
|
315
298
|
const groupOrder = ['domain-analysis', 'backend', 'frontend', 'infra', 'tests', 'docs', 'support'];
|
|
316
299
|
dispatchableAgents.sort((a, b) => {
|
|
317
|
-
const gi = groupOrder.indexOf(a.
|
|
318
|
-
const gj = groupOrder.indexOf(b.
|
|
300
|
+
const gi = groupOrder.indexOf(a.group);
|
|
301
|
+
const gj = groupOrder.indexOf(b.group);
|
|
319
302
|
if (gi !== gj) return gi - gj;
|
|
320
303
|
if (a.tier !== b.tier) return a.tier - b.tier;
|
|
321
304
|
return a.id.localeCompare(b.id);
|
|
@@ -323,56 +306,18 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
323
306
|
|
|
324
307
|
const shouldDispatch = dispatchableAgents.length >= 2;
|
|
325
308
|
|
|
326
|
-
// ──
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
const distinctGroups = new Set(dispatchableAgents.map(a => a.parallelGroup)).size;
|
|
332
|
-
let mode;
|
|
333
|
-
if (shouldDispatch && distinctGroups >= 2 && dispatchableAgents.length >= 5) {
|
|
334
|
-
mode = 'agent-teams';
|
|
335
|
-
} else if (shouldDispatch) {
|
|
336
|
-
mode = 'subagents';
|
|
337
|
-
} else {
|
|
338
|
-
mode = 'single';
|
|
309
|
+
// ── Recommended agents by group ───────────────────────────────────────────
|
|
310
|
+
const recommended = {};
|
|
311
|
+
for (const agent of dispatchableAgents) {
|
|
312
|
+
if (!recommended[agent.group]) recommended[agent.group] = [];
|
|
313
|
+
recommended[agent.group].push(agent.subagentType);
|
|
339
314
|
}
|
|
340
315
|
|
|
341
|
-
// ──
|
|
342
|
-
|
|
343
|
-
|
|
316
|
+
// ── Tasks by group (implement phase only) ─────────────────────────────────
|
|
317
|
+
let tasks = {};
|
|
344
318
|
if (phase === 'implement') {
|
|
345
|
-
// Group tasks from tasks.md by domain category
|
|
346
319
|
const tasksPath = join(projectPath, `.morph/features/${featureName}/4-tasks/tasks.md`);
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
for (const [group, taskIds] of Object.entries(tasksByGroup)) {
|
|
350
|
-
const groupAgent = dispatchableAgents.find(a => a.parallelGroup === group);
|
|
351
|
-
taskGroups[group] = {
|
|
352
|
-
agentId: groupAgent?.id ?? null,
|
|
353
|
-
subagentType: groupAgent?.subagentType ?? null,
|
|
354
|
-
description: `${group} implementation tasks for feature '${featureName}'`,
|
|
355
|
-
tasks: taskIds,
|
|
356
|
-
canRunParallel: true,
|
|
357
|
-
taskPrompt: groupAgent?.taskPrompt ?? null,
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
} else {
|
|
361
|
-
// For design/tasks: one group per parallel group, no task IDs yet
|
|
362
|
-
const seenGroups = new Set();
|
|
363
|
-
for (const agent of dispatchableAgents) {
|
|
364
|
-
if (seenGroups.has(agent.parallelGroup)) continue;
|
|
365
|
-
seenGroups.add(agent.parallelGroup);
|
|
366
|
-
|
|
367
|
-
taskGroups[agent.parallelGroup] = {
|
|
368
|
-
agentId: agent.id,
|
|
369
|
-
subagentType: agent.subagentType,
|
|
370
|
-
description: agent.role,
|
|
371
|
-
tasks: [],
|
|
372
|
-
canRunParallel: true,
|
|
373
|
-
taskPrompt: agent.taskPrompt,
|
|
374
|
-
};
|
|
375
|
-
}
|
|
320
|
+
tasks = parseAndGroupTasks(tasksPath);
|
|
376
321
|
}
|
|
377
322
|
|
|
378
323
|
// ── Pre-flight: check agent files exist ──────────────────────────────────
|
|
@@ -391,15 +336,15 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
391
336
|
return {
|
|
392
337
|
feature: featureName,
|
|
393
338
|
phase,
|
|
394
|
-
mode,
|
|
395
339
|
shouldDispatch,
|
|
396
340
|
reason: shouldDispatch
|
|
397
341
|
? `${dispatchableAgents.length} dispatchable agents for phase '${phase}'`
|
|
398
342
|
: dispatchableAgents.length === 1
|
|
399
343
|
? `Only 1 dispatchable agent — sequential execution preferred`
|
|
400
344
|
: `No dispatchable agents found for phase '${phase}'`,
|
|
345
|
+
recommended,
|
|
346
|
+
tasks,
|
|
401
347
|
agents: dispatchableAgents,
|
|
402
|
-
taskGroups,
|
|
403
348
|
warnings,
|
|
404
349
|
};
|
|
405
350
|
}
|
|
@@ -440,18 +385,12 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
|
|
|
440
385
|
logDispatch(featureName, {
|
|
441
386
|
timestamp: new Date().toISOString(),
|
|
442
387
|
phase: normalizedPhase,
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
id: a.id,
|
|
450
|
-
subagentType: a.subagentType,
|
|
451
|
-
group: a.parallelGroup,
|
|
452
|
-
tasks: groupEntry ? groupEntry[1].tasks : [],
|
|
453
|
-
};
|
|
454
|
-
}),
|
|
388
|
+
agents: config.agents.map(a => ({
|
|
389
|
+
id: a.id,
|
|
390
|
+
subagentType: a.subagentType,
|
|
391
|
+
group: a.group,
|
|
392
|
+
tasks: config.tasks?.[a.group] || [],
|
|
393
|
+
})),
|
|
455
394
|
});
|
|
456
395
|
} catch {
|
|
457
396
|
// Non-blocking — dispatch output still succeeds even if log fails
|
|
@@ -474,7 +413,7 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
|
|
|
474
413
|
for (const agent of config.agents) {
|
|
475
414
|
console.log(
|
|
476
415
|
` ${(agent.icon + ' ' + agent.id).padEnd(28)} ` +
|
|
477
|
-
`${chalk.cyan(agent.
|
|
416
|
+
`${chalk.cyan(agent.group.padEnd(16))} ` +
|
|
478
417
|
`${agent.tier}`
|
|
479
418
|
);
|
|
480
419
|
}
|
|
@@ -482,17 +421,17 @@ export async function dispatchAgentsCommand(featureName, phase, options = {}) {
|
|
|
482
421
|
console.log(chalk.gray('\n No dispatchable agents.'));
|
|
483
422
|
}
|
|
484
423
|
|
|
485
|
-
const
|
|
486
|
-
if (
|
|
487
|
-
console.log(`\n
|
|
488
|
-
console.log(` ${'Group'.padEnd(20)} ${'Tasks'.padEnd(8)}
|
|
424
|
+
const recEntries = Object.entries(config.recommended || {});
|
|
425
|
+
if (recEntries.length > 0) {
|
|
426
|
+
console.log(`\n Recommended:`);
|
|
427
|
+
console.log(` ${'Group'.padEnd(20)} ${'Tasks'.padEnd(8)} Agents`);
|
|
489
428
|
console.log(' ' + '─'.repeat(50));
|
|
490
|
-
for (const [group,
|
|
491
|
-
const taskCount =
|
|
429
|
+
for (const [group, agentTypes] of recEntries) {
|
|
430
|
+
const taskCount = config.tasks?.[group]?.length || 0;
|
|
492
431
|
console.log(
|
|
493
432
|
` ${group.padEnd(20)} ` +
|
|
494
433
|
`${String(taskCount).padEnd(8)} ` +
|
|
495
|
-
`${
|
|
434
|
+
`${agentTypes.join(', ')}`
|
|
496
435
|
);
|
|
497
436
|
}
|
|
498
437
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI handler for `morph-spec context refresh`
|
|
3
|
+
*
|
|
4
|
+
* Scans the project filesystem for architectural patterns and generates
|
|
5
|
+
* a rich .morph/context/README.md that Claude reads at session start.
|
|
6
|
+
*
|
|
7
|
+
* @module context-refresh
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { scanArchitecture, renderArchitectureContext } from '../../lib/generators/architecture-scanner.js';
|
|
11
|
+
import { logger } from '../../utils/logger.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {Object} options - Commander options
|
|
15
|
+
* @param {string} [options.path] - Target project path
|
|
16
|
+
* @param {boolean} [options.verbose] - Show detailed output
|
|
17
|
+
* @param {boolean} [options.json] - Output raw JSON
|
|
18
|
+
* @param {boolean} [options.quiet] - Suppress output (for programmatic use)
|
|
19
|
+
*/
|
|
20
|
+
export async function contextRefreshCommand(options = {}) {
|
|
21
|
+
const projectPath = options.path || process.cwd();
|
|
22
|
+
|
|
23
|
+
if (!options.quiet) {
|
|
24
|
+
logger.header('Architecture Context Refresh');
|
|
25
|
+
logger.dim(`Scanning: ${projectPath}`);
|
|
26
|
+
logger.blank();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const scanResult = await scanArchitecture(projectPath);
|
|
31
|
+
|
|
32
|
+
if (options.json) {
|
|
33
|
+
console.log(JSON.stringify(scanResult, null, 2));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const outputPath = await renderArchitectureContext(projectPath, scanResult);
|
|
38
|
+
|
|
39
|
+
if (!options.quiet) {
|
|
40
|
+
const counts = [];
|
|
41
|
+
if (scanResult.entities.length > 0) counts.push(`${scanResult.entities.length} entities`);
|
|
42
|
+
if (scanResult.endpoints.length > 0) counts.push(`${scanResult.endpoints.length} endpoints`);
|
|
43
|
+
if (scanResult.nextjs.pages.length > 0) counts.push(`${scanResult.nextjs.pages.length} pages`);
|
|
44
|
+
if (scanResult.nextjs.components.length > 0) counts.push(`${scanResult.nextjs.components.length} components`);
|
|
45
|
+
if (scanResult.integrations.length > 0) counts.push(`${scanResult.integrations.length} integrations`);
|
|
46
|
+
if (scanResult.database.length > 0) counts.push(`${scanResult.database.length} tables`);
|
|
47
|
+
if (scanResult.stack.dotnet.length > 0) counts.push(`${scanResult.stack.dotnet.length} .NET packages`);
|
|
48
|
+
if (scanResult.stack.npm.length > 0) counts.push(`${scanResult.stack.npm.length} npm packages`);
|
|
49
|
+
|
|
50
|
+
if (counts.length > 0) {
|
|
51
|
+
logger.success(`Found: ${counts.join(', ')}`);
|
|
52
|
+
} else {
|
|
53
|
+
logger.warn('No architectural patterns detected (empty project?)');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
logger.success(`Written to: ${outputPath}`);
|
|
57
|
+
|
|
58
|
+
if (options.verbose) {
|
|
59
|
+
logger.blank();
|
|
60
|
+
if (scanResult.entities.length > 0) {
|
|
61
|
+
logger.info('Entities:');
|
|
62
|
+
for (const e of scanResult.entities) logger.dim(` ${e.name} (${e.type}) — ${e.path}`);
|
|
63
|
+
}
|
|
64
|
+
if (scanResult.endpoints.length > 0) {
|
|
65
|
+
logger.info('Endpoints:');
|
|
66
|
+
for (const ep of scanResult.endpoints) logger.dim(` ${ep.method || '???'} ${ep.route} — ${ep.name}`);
|
|
67
|
+
}
|
|
68
|
+
if (scanResult.nextjs.pages.length > 0) {
|
|
69
|
+
logger.info('Pages:');
|
|
70
|
+
for (const p of scanResult.nextjs.pages) logger.dim(` ${p.route} — ${p.path}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (options.quiet) throw err;
|
|
76
|
+
logger.error(`Scan failed: ${err.message}`);
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -12,7 +12,7 @@ import chalk from 'chalk';
|
|
|
12
12
|
import { loadState, saveState, derivePhase } from '../../core/state/state-manager.js';
|
|
13
13
|
import { join } from 'path';
|
|
14
14
|
|
|
15
|
-
const VALID_PHASES = ['proposal', '
|
|
15
|
+
const VALID_PHASES = ['proposal', 'uiux', 'design', 'plan', 'tasks', 'implement', 'sync'];
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Core reset logic — exported for testing.
|