@polymorphism-tech/morph-spec 4.11.1 → 4.13.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/README.md +21 -29
- 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 +10 -11
- 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 +226 -1454
- package/framework/commands/morph-apply.md +4 -4
- package/framework/commands/morph-preflight.md +4 -26
- package/framework/commands/morph-proposal.md +19 -19
- package/framework/commands/morph-status.md +2 -2
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/agent-complete.js +122 -0
- 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/dispatch-helpers.js +17 -0
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +7 -45
- 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 +58 -124
- 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/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 +0 -2
- 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 +275 -61
- 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 -2338
- 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 +342 -211
- 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/mcp/mcp-setup.js +28 -6
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +32 -1
- 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 -298
- 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/design-system/design-system-validator.js +11 -5
- 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 +24 -3
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +21 -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 -213
- 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
|
@@ -57,9 +57,9 @@ Do NOT proceed until all phases are complete and all gates approved.
|
|
|
57
57
|
Read all prerequisite files in a single parallel call — every file listed here matters for implementation quality:
|
|
58
58
|
|
|
59
59
|
```
|
|
60
|
-
Read: .morph/features/$ARGUMENTS/
|
|
61
|
-
+ Read: .morph/features/$ARGUMENTS/
|
|
62
|
-
+ Read: .morph/features/$ARGUMENTS/
|
|
60
|
+
Read: .morph/features/$ARGUMENTS/2-design/spec.md (→ functional requirements, API contracts)
|
|
61
|
+
+ Read: .morph/features/$ARGUMENTS/2-design/contracts.cs (or contracts.ts / contracts-vsa.cs → C# interfaces)
|
|
62
|
+
+ Read: .morph/features/$ARGUMENTS/2-design/decisions.md (→ ADRs, architectural choices)
|
|
63
63
|
+ Read: .morph/features/$ARGUMENTS/3-plan/plan.md (→ TDD structure, execution strategy)
|
|
64
64
|
+ Read: .morph/features/$ARGUMENTS/4-tasks/tasks.md (→ task breakdown with T### IDs)
|
|
65
65
|
+ Read: .morph/config/config.json (→ architecture.style for VSA routing)
|
|
@@ -96,7 +96,7 @@ This shows which agents are active for implementation and how tasks can be group
|
|
|
96
96
|
morph-spec dispatch-agents $ARGUMENTS implement
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
The JSON output includes `shouldDispatch`, `agents
|
|
99
|
+
The JSON output includes `shouldDispatch`, `recommended` (agents by group), and `tasks` (task IDs by group) for multi-agent coordination.
|
|
100
100
|
|
|
101
101
|
---
|
|
102
102
|
|
|
@@ -117,27 +117,7 @@ docker build --check .
|
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
120
|
-
### 4.
|
|
121
|
-
|
|
122
|
-
**What it checks:**
|
|
123
|
-
- `RequiresAspNetWebAssets` is `true` (if Blazor + .NET 10)
|
|
124
|
-
- Static web assets configured correctly
|
|
125
|
-
|
|
126
|
-
**How to check:**
|
|
127
|
-
```bash
|
|
128
|
-
grep -r "RequiresAspNetWebAssets" *.csproj
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**Fix:**
|
|
132
|
-
```xml
|
|
133
|
-
<PropertyGroup>
|
|
134
|
-
<RequiresAspNetWebAssets>true</RequiresAspNetWebAssets>
|
|
135
|
-
</PropertyGroup>
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
### 5. Bicep Syntax Validation
|
|
120
|
+
### 4. Bicep Syntax Validation
|
|
141
121
|
|
|
142
122
|
**What it checks:**
|
|
143
123
|
- `.bicep` files without syntax errors
|
|
@@ -151,7 +131,7 @@ az bicep build --file infra/main.bicep --stdout > /dev/null
|
|
|
151
131
|
|
|
152
132
|
---
|
|
153
133
|
|
|
154
|
-
###
|
|
134
|
+
### 5. Key Vault Configuration
|
|
155
135
|
|
|
156
136
|
**What it checks:**
|
|
157
137
|
- Key Vault URI configured in `appsettings.json` or environment
|
|
@@ -175,7 +155,7 @@ if (!builder.Environment.IsDevelopment())
|
|
|
175
155
|
|
|
176
156
|
---
|
|
177
157
|
|
|
178
|
-
###
|
|
158
|
+
### 6. Connection Strings Security
|
|
179
159
|
|
|
180
160
|
**What it checks:**
|
|
181
161
|
- Connection strings not hardcoded in code
|
|
@@ -199,14 +179,13 @@ grep -rE "(Password=|Pwd=|Secret=)" appsettings*.json | grep -v Development
|
|
|
199
179
|
✅ Packages: No version conflicts detected
|
|
200
180
|
✅ Migrations: No pending model changes
|
|
201
181
|
✅ Dockerfile: Valid multi-stage build
|
|
202
|
-
✅ Blazor Assets: RequiresAspNetWebAssets=true
|
|
203
182
|
✅ Bicep: Syntax valid
|
|
204
183
|
❌ Key Vault: URI not configured in appsettings.Production.json
|
|
205
184
|
⚠️ Connection Strings: Found password in appsettings.Staging.json
|
|
206
185
|
|
|
207
186
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
208
187
|
|
|
209
|
-
📋 Summary:
|
|
188
|
+
📋 Summary: 4 passed, 1 failed, 1 warning
|
|
210
189
|
|
|
211
190
|
❌ BLOCKED: Fix Key Vault configuration before deploy!
|
|
212
191
|
|
|
@@ -262,7 +241,6 @@ Recommended fixes:
|
|
|
262
241
|
|
|
263
242
|
- [azure.md](../../standards/azure.md) - Azure Standards
|
|
264
243
|
- [dotnet10-migration.md](../../standards/dotnet10-migration.md) - Breaking changes .NET 10
|
|
265
|
-
- [blazor-efcore.md](../../../../framework/standards/blazor-efcore.md) - EF Core patterns
|
|
266
244
|
|
|
267
245
|
---
|
|
268
246
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: MORPH Spec Pipeline — creates or resumes feature planning through phases 0-
|
|
2
|
+
description: MORPH Spec Pipeline — creates or resumes feature planning through phases 0-8 with mandatory approval pauses. Use whenever the user wants to plan, spec, or design a new feature, or when they say /morph-proposal. This is the primary entry point for all MORPH-SPEC feature work.
|
|
3
3
|
argument-hint: <feature-name>
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
|
|
5
5
|
---
|
|
@@ -65,7 +65,7 @@ Fill every section of the template. In particular:
|
|
|
65
65
|
- **Risks**: table with likelihood, impact, mitigation
|
|
66
66
|
- **Dependencies**: checklist of prerequisites
|
|
67
67
|
- **Estimated Effort**: broken down by phase (in hours)
|
|
68
|
-
- **Questions & Clarifications**: seed 3-6 questions for the clarify phase — these become input for phase
|
|
68
|
+
- **Questions & Clarifications**: seed 3-6 questions for the clarify phase — these become input for phase 4
|
|
69
69
|
|
|
70
70
|
### Step 5: Register state
|
|
71
71
|
|
|
@@ -83,15 +83,15 @@ morph-spec state mark-output {feature-name} proposal
|
|
|
83
83
|
```
|
|
84
84
|
TaskCreate: "Phase 0: Proposal" → description: "Define feature scope and approach" → activeForm: "Proposal"
|
|
85
85
|
TaskCreate: "Phase 1: Setup" → description: "Load context, detect agents, confirm stack" → activeForm: "Setup"
|
|
86
|
-
TaskCreate: "Phase
|
|
87
|
-
TaskCreate: "Phase
|
|
88
|
-
TaskCreate: "Phase
|
|
89
|
-
TaskCreate: "Phase
|
|
86
|
+
TaskCreate: "Phase 3: Design" → description: "Schema analysis, spec, contracts, decisions" → activeForm: "Design"
|
|
87
|
+
TaskCreate: "Phase 4: Clarify" → description: "Resolve ambiguities and edge cases" → activeForm: "Clarify"
|
|
88
|
+
TaskCreate: "Phase 5: Plan" → description: "Implementation plan with TDD and file paths" → activeForm: "Plan"
|
|
89
|
+
TaskCreate: "Phase 6: Tasks" → description: "Break spec into T001-T00N with dependencies" → activeForm: "Tasks"
|
|
90
90
|
```
|
|
91
91
|
|
|
92
92
|
If `ui-designer` is among the activated agents, also create:
|
|
93
93
|
```
|
|
94
|
-
TaskCreate: "Phase
|
|
94
|
+
TaskCreate: "Phase 2: UI/UX" → description: "Design system, mockups, components, flows" → activeForm: "UI/UX"
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
Wire dependencies (addBlockedBy) matching the phase sequence:
|
|
@@ -135,13 +135,13 @@ Summary: load project context, confirm stack, list active agents, update state.
|
|
|
135
135
|
|
|
136
136
|
---
|
|
137
137
|
|
|
138
|
-
## 4. PHASE
|
|
138
|
+
## 4. PHASE 2: UI/UX (conditional)
|
|
139
139
|
|
|
140
140
|
Check if `ui-designer` is in `activeAgents`:
|
|
141
141
|
- **Yes:** Invoke the `morph-phase-uiux` skill. **MANDATORY PAUSE** after generating UI deliverables.
|
|
142
|
-
- **No:** Skip to PHASE
|
|
142
|
+
- **No:** Skip to PHASE 3.
|
|
143
143
|
|
|
144
|
-
> **Task lifecycle:** `TaskUpdate` the "Phase 1: Setup" task → `completed`. `TaskUpdate` the "Phase
|
|
144
|
+
> **Task lifecycle:** `TaskUpdate` the "Phase 1: Setup" task → `completed`. `TaskUpdate` the "Phase 2: UI/UX" task → `in_progress` (if UI/UX), or the "Phase 3: Design" task → `in_progress` (if skipping UI/UX).
|
|
145
145
|
|
|
146
146
|
After approval:
|
|
147
147
|
```bash
|
|
@@ -151,9 +151,9 @@ morph-spec phase advance {feature-name}
|
|
|
151
151
|
|
|
152
152
|
---
|
|
153
153
|
|
|
154
|
-
## 5. PHASE
|
|
154
|
+
## 5. PHASE 3: DESIGN
|
|
155
155
|
|
|
156
|
-
> **Task lifecycle:** `TaskUpdate` the completing phase task (UI/UX or Setup) → `completed`. `TaskUpdate` the "Phase
|
|
156
|
+
> **Task lifecycle:** `TaskUpdate` the completing phase task (UI/UX or Setup) → `completed`. `TaskUpdate` the "Phase 3: Design" task → `in_progress`.
|
|
157
157
|
|
|
158
158
|
Invoke the `morph-phase-design` skill.
|
|
159
159
|
|
|
@@ -171,9 +171,9 @@ morph-spec phase advance {feature-name}
|
|
|
171
171
|
|
|
172
172
|
---
|
|
173
173
|
|
|
174
|
-
## 6. PHASE
|
|
174
|
+
## 6. PHASE 4: CLARIFY (interactive)
|
|
175
175
|
|
|
176
|
-
> **Task lifecycle:** `TaskUpdate` the "Phase
|
|
176
|
+
> **Task lifecycle:** `TaskUpdate` the "Phase 3: Design" task → `completed`. `TaskUpdate` the "Phase 4: Clarify" task → `in_progress`.
|
|
177
177
|
|
|
178
178
|
Invoke the `morph-phase-clarify` skill.
|
|
179
179
|
|
|
@@ -183,9 +183,9 @@ Summary: identify ambiguities in spec.md, generate 3-7 targeted questions (build
|
|
|
183
183
|
|
|
184
184
|
---
|
|
185
185
|
|
|
186
|
-
## 7. PHASE
|
|
186
|
+
## 7. PHASE 5: PLAN
|
|
187
187
|
|
|
188
|
-
> **Task lifecycle:** `TaskUpdate` the "Phase
|
|
188
|
+
> **Task lifecycle:** `TaskUpdate` the "Phase 4: Clarify" task → `completed`. `TaskUpdate` the "Phase 5: Plan" task → `in_progress`.
|
|
189
189
|
|
|
190
190
|
Invoke the `morph-phase-plan` skill.
|
|
191
191
|
|
|
@@ -203,9 +203,9 @@ morph-spec phase advance {feature-name}
|
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
|
206
|
-
## 8. PHASE
|
|
206
|
+
## 8. PHASE 6: TASKS
|
|
207
207
|
|
|
208
|
-
> **Task lifecycle:** `TaskUpdate` the "Phase
|
|
208
|
+
> **Task lifecycle:** `TaskUpdate` the "Phase 5: Plan" task → `completed`. `TaskUpdate` the "Phase 6: Tasks" task → `in_progress`.
|
|
209
209
|
|
|
210
210
|
Invoke the `morph-phase-tasks` skill.
|
|
211
211
|
|
|
@@ -225,7 +225,7 @@ morph-spec phase advance {feature-name}
|
|
|
225
225
|
|
|
226
226
|
## 9. Planning Complete
|
|
227
227
|
|
|
228
|
-
> **Task lifecycle:** `TaskUpdate` the "Phase
|
|
228
|
+
> **Task lifecycle:** `TaskUpdate` the "Phase 6: Tasks" task → `completed`.
|
|
229
229
|
|
|
230
230
|
After task approval:
|
|
231
231
|
|
|
@@ -58,13 +58,13 @@ The `morph-spec state list` command automatically generates a formatted dashboar
|
|
|
58
58
|
║ MORPH-SPEC PROJECT STATUS ║
|
|
59
59
|
╠════════════════════════════════════════════════════════════════╣
|
|
60
60
|
║ Project: {PROJECT_NAME} ║
|
|
61
|
-
║ Type:
|
|
61
|
+
║ Type: dotnet-nextjs ║
|
|
62
62
|
╠════════════════════════════════════════════════════════════════╣
|
|
63
63
|
║ FEATURES ║
|
|
64
64
|
╠════════════════════════════════════════════════════════════════╣
|
|
65
65
|
║ 📝 {feature-1} ║
|
|
66
66
|
║ Phase: implement │ Tasks: 5/12 ║
|
|
67
|
-
║ Agents:
|
|
67
|
+
║ Agents: ef-modeler hangfire-orchestrator ║
|
|
68
68
|
╠════════════════════════════════════════════════════════════════╣
|
|
69
69
|
║ 📝 {feature-2} ║
|
|
70
70
|
║ Phase: design │ Tasks: 0/0 ║
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Find solutions for common .NET/
|
|
2
|
+
description: Find solutions for common .NET/Next.js development errors with root-cause analysis
|
|
3
3
|
argument-hint: "[error-message]"
|
|
4
4
|
allowed-tools: Read, Bash, Glob, Grep
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Troubleshoot - Find Solutions for Errors
|
|
8
8
|
|
|
9
|
-
Find solutions for common .NET/
|
|
9
|
+
Find solutions for common .NET/Next.js development errors and problems.
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
@@ -17,11 +17,10 @@ Find solutions for common .NET/Blazor/Azure development errors and problems.
|
|
|
17
17
|
## Examples
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
/morph-troubleshoot blazor.web.js 404
|
|
21
20
|
/morph-troubleshoot DbContext second operation
|
|
22
|
-
/morph-troubleshoot Azure.Identity NU1605
|
|
23
21
|
/morph-troubleshoot Include returns empty
|
|
24
22
|
/morph-troubleshoot PendingModelChanges
|
|
23
|
+
/morph-troubleshoot next/navigation error
|
|
25
24
|
```
|
|
26
25
|
|
|
27
26
|
## 3-Level Workflow
|
|
@@ -60,13 +59,11 @@ site:github.com/dotnet/aspnetcore {error}
|
|
|
60
59
|
site:github.com/dotnet/efcore {error}
|
|
61
60
|
|
|
62
61
|
# Stack Overflow
|
|
63
|
-
site:stackoverflow.com [blazor] {error}
|
|
64
62
|
site:stackoverflow.com [entity-framework-core] {error}
|
|
65
|
-
site:stackoverflow.com [
|
|
63
|
+
site:stackoverflow.com [next.js] {error}
|
|
66
64
|
|
|
67
65
|
# Microsoft Documentation
|
|
68
66
|
site:learn.microsoft.com {error}
|
|
69
|
-
site:learn.microsoft.com/azure {error}
|
|
70
67
|
```
|
|
71
68
|
|
|
72
69
|
**WebSearch usage example:**
|
|
@@ -80,9 +77,8 @@ If the user asks about a SignalR error:
|
|
|
80
77
|
|
|
81
78
|
| Category | Description |
|
|
82
79
|
|-----------|-----------|
|
|
83
|
-
| `blazor` | Blazor Server/WASM, components, lifecycle, rendering |
|
|
84
80
|
| `efcore` | Entity Framework Core, DbContext, migrations, queries |
|
|
85
|
-
| `
|
|
81
|
+
| `nextjs` | Next.js App Router, pages, components, routing |
|
|
86
82
|
| `auth` | Authentication, authorization, tokens, claims |
|
|
87
83
|
| `deploy` | Deployment, CI/CD, pipelines, containers |
|
|
88
84
|
|
|
@@ -118,13 +114,10 @@ When finding a solution, present in the following format:
|
|
|
118
114
|
|
|
119
115
|
| Error | Quick Fix |
|
|
120
116
|
|------|----------------|
|
|
121
|
-
| `blazor.web.js 404` | `<RequiresAspNetWebAssets>true</RequiresAspNetWebAssets>` |
|
|
122
117
|
| `PendingModelChangesWarning` | `dotnet ef migrations add <Name>` before update |
|
|
123
118
|
| `DbContext second operation` | Use `IDbContextFactory` for background tasks |
|
|
124
119
|
| `Include()` empty | Use `HasMany(x => x.Nav)` instead of `HasMany<T>()` |
|
|
125
|
-
| `
|
|
126
|
-
| `Key Vault won't load` | Don't condition on environment (IsDevelopment) |
|
|
127
|
-
| `DefaultAzureCredential slow` | Disable unused credentials |
|
|
120
|
+
| `next/navigation error` | Check App Router vs Pages Router usage |
|
|
128
121
|
|
|
129
122
|
---
|
|
130
123
|
|
|
@@ -15,14 +15,11 @@ framework/hooks/
|
|
|
15
15
|
│ │ ├── protect-spec-files.js # Block edits to approved spec artifacts
|
|
16
16
|
│ │ └── enforce-phase-writes.js # Enforce writes to correct phase dir
|
|
17
17
|
│ ├── post-tool-use/
|
|
18
|
-
│ │
|
|
19
|
-
│ │ └── context-refresh.js # Auto-refresh context on structural git commits
|
|
18
|
+
│ │ └── dispatch.js # Dispatch on CLI commands (auto-checkpoint)
|
|
20
19
|
│ ├── stop/
|
|
21
20
|
│ │ └── validate-completion.js # Advisory: warn about incomplete work
|
|
22
21
|
│ ├── pre-compact/
|
|
23
22
|
│ │ └── save-morph-context.js # Snapshot state before compaction
|
|
24
|
-
│ └── notification/
|
|
25
|
-
│ └── approval-reminder.js # Remind about pending approvals
|
|
26
23
|
├── shared/ # Reusable utilities for all hooks
|
|
27
24
|
│ ├── state-reader.js # Read-only state.json accessor
|
|
28
25
|
│ ├── phase-utils.js # Phase constants and path utilities
|
|
@@ -51,11 +48,9 @@ framework/hooks/
|
|
|
51
48
|
| **PreToolUse** (Write\|Edit) | enforce-phase-writes.js | Block | Ensures writes go to current phase directory |
|
|
52
49
|
| **PreToolUse** (Bash) | _(prompt-type inline guard)_ | Block | Blocks `rm -rf .morph/` and direct state edits via Claude's reasoning |
|
|
53
50
|
| **PostToolUse** (Bash) | dispatch.js | Dispatch | Triggers checkpoints on task completion |
|
|
54
|
-
| **PostToolUse** (Bash) | context-refresh.js | Inject context | Detects `git commit` with structural changes → instructs Claude to update `.morph/context/README.md` and `.morph/config/config.json` |
|
|
55
51
|
| **PostToolUseFailure** | handle-tool-failure.js | Logging | Appends structured JSON to .morph/logs/tool-failures.log |
|
|
56
52
|
| **Stop** | validate-completion.js | Advisory | Warns about incomplete tasks/missing outputs/pending gates |
|
|
57
53
|
| **PreCompact** | save-morph-context.js | Snapshot | Saves state to .morph/memory/ before compaction |
|
|
58
|
-
| **Notification** | approval-reminder.js | Advisory | Reminds about pending approval gates |
|
|
59
54
|
|
|
60
55
|
## Design Principles
|
|
61
56
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PostToolUse Hook: Agent Completion Tracker
|
|
5
|
+
*
|
|
6
|
+
* Event: PostToolUse | Matcher: Agent
|
|
7
|
+
*
|
|
8
|
+
* Detects when morph-spec subagents complete (dispatched via the Agent tool)
|
|
9
|
+
* and injects status notifications:
|
|
10
|
+
* - Partial: shows which agents are still pending
|
|
11
|
+
* - Complete: instructs to run validate-feature
|
|
12
|
+
*
|
|
13
|
+
* Only tracks tier 1-3 agents (not validators: morph-validator-*).
|
|
14
|
+
*
|
|
15
|
+
* Fail-open: exits 0 on any error.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { readStdin } from '../../shared/stdin-reader.js';
|
|
19
|
+
import { stateExists, getActiveFeature, getFeature, getFeaturePhase } from '../../shared/state-reader.js';
|
|
20
|
+
import { pass, injectContext } from '../../shared/hook-response.js';
|
|
21
|
+
import { logHookActivity } from '../../shared/activity-logger.js';
|
|
22
|
+
import { subagentTypeToAgentId } from '../../shared/dispatch-helpers.js';
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
if (!stateExists()) pass();
|
|
26
|
+
|
|
27
|
+
const payload = await readStdin();
|
|
28
|
+
if (!payload) pass();
|
|
29
|
+
|
|
30
|
+
const subagentType = payload?.tool_input?.subagent_type || '';
|
|
31
|
+
if (!subagentType) pass();
|
|
32
|
+
|
|
33
|
+
// Only track morph-* agents (not external subagents)
|
|
34
|
+
if (!subagentType.startsWith('morph-')) pass();
|
|
35
|
+
|
|
36
|
+
// Skip validators (tier 4) — they have their own tracking
|
|
37
|
+
if (subagentType.startsWith('morph-validator-')) pass();
|
|
38
|
+
|
|
39
|
+
const result = buildAgentCompleteContext(subagentType);
|
|
40
|
+
if (result) {
|
|
41
|
+
logHookActivity('agent-complete', 'PostToolUse', result.type);
|
|
42
|
+
injectContext(result.text);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
pass();
|
|
46
|
+
} catch {
|
|
47
|
+
// Fail-open
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Build the agent completion notification context.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} subagentType - e.g. 'morph-nextjs-expert'
|
|
55
|
+
* @returns {{ text: string, type: string }|null}
|
|
56
|
+
*/
|
|
57
|
+
function buildAgentCompleteContext(subagentType) {
|
|
58
|
+
// Get active feature
|
|
59
|
+
const active = getActiveFeature();
|
|
60
|
+
if (!active) return null;
|
|
61
|
+
|
|
62
|
+
const { name: featureName, feature } = active;
|
|
63
|
+
|
|
64
|
+
// Only track during implement phase
|
|
65
|
+
const phase = getFeaturePhase(featureName);
|
|
66
|
+
if (phase !== 'implement') return null;
|
|
67
|
+
|
|
68
|
+
// Get dispatch log
|
|
69
|
+
const dispatchLog = feature.dispatchLog;
|
|
70
|
+
if (!Array.isArray(dispatchLog) || dispatchLog.length === 0) return null;
|
|
71
|
+
|
|
72
|
+
// Get the most recent dispatch entry
|
|
73
|
+
const latestDispatch = dispatchLog[dispatchLog.length - 1];
|
|
74
|
+
const agents = latestDispatch?.agents;
|
|
75
|
+
if (!Array.isArray(agents) || agents.length === 0) return null;
|
|
76
|
+
|
|
77
|
+
// Find the completing agent in the dispatch
|
|
78
|
+
const agentId = subagentTypeToAgentId(subagentType);
|
|
79
|
+
let matchedAgent = agents.find(a => a.subagentType === subagentType);
|
|
80
|
+
if (!matchedAgent && agentId) {
|
|
81
|
+
matchedAgent = agents.find(a => a.id === agentId);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (!matchedAgent) return null;
|
|
85
|
+
|
|
86
|
+
// Mark this agent as completed (in-memory for evaluation only)
|
|
87
|
+
// Check which agents are still pending (no completedAt)
|
|
88
|
+
const pendingAgents = agents.filter(a => {
|
|
89
|
+
if (a === matchedAgent) return false; // The one just completed
|
|
90
|
+
return !a.completedAt;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const totalAgents = agents.length;
|
|
94
|
+
const completedCount = totalAgents - pendingAgents.length;
|
|
95
|
+
|
|
96
|
+
if (pendingAgents.length === 0) {
|
|
97
|
+
// All agents complete
|
|
98
|
+
return {
|
|
99
|
+
type: 'all_complete',
|
|
100
|
+
text: [
|
|
101
|
+
'✅ ALL MORPH-SPEC AGENTS COMPLETE',
|
|
102
|
+
'════════════════════════════════════════',
|
|
103
|
+
`All ${totalAgents} dispatched agents have completed their tasks.`,
|
|
104
|
+
'',
|
|
105
|
+
'NEXT STEP:',
|
|
106
|
+
` morph-spec validate-feature ${featureName} --phase implement`,
|
|
107
|
+
].join('\n'),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Partial completion
|
|
112
|
+
const remainingList = pendingAgents
|
|
113
|
+
.map(a => a.title || a.id || 'unknown')
|
|
114
|
+
.join(', ');
|
|
115
|
+
|
|
116
|
+
const agentTitle = matchedAgent.title || matchedAgent.id || subagentType;
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
type: 'partial_complete',
|
|
120
|
+
text: `✅ Agent '${agentTitle}' completed (${completedCount}/${totalAgents}). Remaining: ${remainingList}`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -24,12 +24,11 @@ import { parseTaskDoneCommand } from '../../shared/dispatch-helpers.js';
|
|
|
24
24
|
|
|
25
25
|
// Standard IDs referenced in remediation messages
|
|
26
26
|
const STANDARD_REFS = {
|
|
27
|
-
'di': '
|
|
28
|
-
'async': '
|
|
29
|
-
'security': '
|
|
30
|
-
'packages': '
|
|
27
|
+
'di': 'dependency injection best practices',
|
|
28
|
+
'async': 'async/await and CancellationToken patterns',
|
|
29
|
+
'security': 'security best practices',
|
|
30
|
+
'packages': 'NuGet package compatibility',
|
|
31
31
|
'design-system': 'frontend/design-system/naming.md#css-class-conventions',
|
|
32
|
-
'blazor': 'frontend/blazor/pitfalls.md#dbcontext-in-blazor',
|
|
33
32
|
};
|
|
34
33
|
|
|
35
34
|
try {
|
|
@@ -142,6 +141,5 @@ function getRefKey(ruleOrValidator) {
|
|
|
142
141
|
if (lower.includes('security') || lower.includes('sql') || lower.includes('xss')) return 'security';
|
|
143
142
|
if (lower.includes('package') || lower.includes('nuget')) return 'packages';
|
|
144
143
|
if (lower.includes('design') || lower.includes('css') || lower.includes('naming')) return 'design-system';
|
|
145
|
-
if (lower.includes('blazor') || lower.includes('dbcontext')) return 'blazor';
|
|
146
144
|
return null;
|
|
147
145
|
}
|
|
@@ -26,9 +26,9 @@ import { logHookActivity } from '../../shared/activity-logger.js';
|
|
|
26
26
|
import { buildRichContext, DECISIONS_MAX_CHARS, MAX_PENDING_TASKS } from '../../shared/compact-restore.js';
|
|
27
27
|
|
|
28
28
|
const PHASE_POSITIONS = {
|
|
29
|
-
proposal: 1,
|
|
29
|
+
proposal: 1,
|
|
30
30
|
uiux: 2, design: 2,
|
|
31
|
-
|
|
31
|
+
plan: 3,
|
|
32
32
|
tasks: 4,
|
|
33
33
|
implement: 5, sync: 5,
|
|
34
34
|
};
|
|
@@ -39,7 +39,7 @@ const NEXT_STEP_HINT = {
|
|
|
39
39
|
design: (n) => `Approve design gate: morph-spec approve ${n} design`,
|
|
40
40
|
uiux: (n) => `Approve UI gate: morph-spec approve ${n} uiux`,
|
|
41
41
|
tasks: (n) => `Approve tasks gate: morph-spec approve ${n} tasks`,
|
|
42
|
-
implement: (n) => `Continue implementation: morph-spec task
|
|
42
|
+
implement: (n) => `Continue implementation: morph-spec task start ${n} <next-task-id>`,
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
try {
|
|
@@ -77,11 +77,16 @@ try {
|
|
|
77
77
|
const { name: activeName, feature: activeFeature } = active;
|
|
78
78
|
const activePhase = derivePhaseForFeature(activeName);
|
|
79
79
|
let decisionsContent = '';
|
|
80
|
-
const decisionsPath = join(cwd, `.morph/features/${activeName}/
|
|
80
|
+
const decisionsPath = join(cwd, `.morph/features/${activeName}/2-design/decisions.md`);
|
|
81
81
|
if (existsSync(decisionsPath)) {
|
|
82
82
|
try { decisionsContent = readFileSync(decisionsPath, 'utf-8'); } catch { /* ignore */ }
|
|
83
83
|
}
|
|
84
|
-
|
|
84
|
+
let specContent = '';
|
|
85
|
+
const specPath2 = join(cwd, `.morph/features/${activeName}/2-design/spec.md`);
|
|
86
|
+
if (existsSync(specPath2)) {
|
|
87
|
+
try { specContent = readFileSync(specPath2, 'utf-8'); } catch { /* ignore */ }
|
|
88
|
+
}
|
|
89
|
+
snapshot.richContext = buildRichContext(activeFeature, activePhase, decisionsContent, specContent);
|
|
85
90
|
} catch { /* fail-open: richContext is optional */ }
|
|
86
91
|
}
|
|
87
92
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -132,7 +137,7 @@ try {
|
|
|
132
137
|
lines.push('Next pending tasks:');
|
|
133
138
|
for (const t of pending) lines.push(` [${t.id}] ${t.title}`);
|
|
134
139
|
if (taskList.filter(t => t.status === 'pending').length > MAX_PENDING_TASKS) {
|
|
135
|
-
lines.push(` ... (
|
|
140
|
+
lines.push(` ... (see tasks.md for full list)`);
|
|
136
141
|
}
|
|
137
142
|
}
|
|
138
143
|
|
|
@@ -164,7 +169,7 @@ try {
|
|
|
164
169
|
}
|
|
165
170
|
|
|
166
171
|
// Key decisions (truncated to stay within context budget)
|
|
167
|
-
const decisionsPath = join(cwd, `.morph/features/${name}/
|
|
172
|
+
const decisionsPath = join(cwd, `.morph/features/${name}/2-design/decisions.md`);
|
|
168
173
|
if (existsSync(decisionsPath)) {
|
|
169
174
|
try {
|
|
170
175
|
const raw = readFileSync(decisionsPath, 'utf-8');
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Ensures writes to .morph/features/{feature}/ go to the current phase's subfolder:
|
|
9
9
|
* proposal → only 0-proposal/
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* uiux → only 1-ui/
|
|
11
|
+
* design, clarify → only 2-design/
|
|
12
12
|
* tasks → only 4-tasks/
|
|
13
13
|
* implement → 5-implement/ + any source code (unrestricted)
|
|
14
14
|
*
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* Event: PreToolUse | Matcher: Write|Edit
|
|
7
7
|
*
|
|
8
8
|
* Blocks Write/Edit to spec artifacts after their approval gate has passed:
|
|
9
|
-
* -
|
|
9
|
+
* - 2-design/spec.md, contracts.cs, etc. → blocked if 'design' gate approved
|
|
10
10
|
* - 4-tasks/tasks.md → blocked if 'tasks' gate approved
|
|
11
|
-
* -
|
|
11
|
+
* - 1-ui/design-system.md, etc. → blocked if 'uiux' gate approved
|
|
12
12
|
*
|
|
13
13
|
* Fail-open: exits 0 on any error.
|
|
14
14
|
*/
|
|
@@ -36,23 +36,18 @@ try {
|
|
|
36
36
|
const phase = feature.phase || derivePhaseForFeature(name);
|
|
37
37
|
if (phase !== 'implement') pass();
|
|
38
38
|
|
|
39
|
-
// Check if any task is in_progress
|
|
40
|
-
|
|
39
|
+
// Check if any task is in_progress (read directly from taskList)
|
|
40
|
+
if (feature.taskList?.some(t => t.status === 'in_progress')) pass();
|
|
41
|
+
// Fallback: legacy counter check
|
|
41
42
|
if (feature.tasks?.inProgress > 0) pass();
|
|
42
43
|
|
|
43
|
-
// Method 2: taskList array (v2 state format)
|
|
44
|
-
if (feature.taskList) {
|
|
45
|
-
const hasActive = feature.taskList.some(t => t.status === 'in_progress');
|
|
46
|
-
if (hasActive) pass();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
44
|
// No task in_progress — inject advisory warning
|
|
50
45
|
approve(
|
|
51
46
|
`[morph-spec] WARNING: No active task tracking detected during implement phase.\n` +
|
|
52
47
|
`Before writing code, start a task:\n` +
|
|
53
|
-
` morph-spec task next ${name} # see what's next\n` +
|
|
54
48
|
` morph-spec task start ${name} <id> # mark it in progress\n` +
|
|
55
|
-
`Task tracking ensures validators run, checkpoints fire, and progress is recorded
|
|
49
|
+
`Task tracking ensures validators run, checkpoints fire, and progress is recorded.\n` +
|
|
50
|
+
`If a task is more complex than expected, use: morph-spec task expand ${name} <id> --into "T00Xa: Sub" "T00Xb: Sub"`
|
|
56
51
|
);
|
|
57
52
|
} catch {
|
|
58
53
|
// Fail-open
|