@polymorphism-tech/morph-spec 4.7.2 → 4.8.1
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/.morph/analytics/threads-log.jsonl +54 -5
- package/.morph/state.json +152 -2
- package/LICENSE +1 -2
- package/README.md +379 -414
- package/bin/morph-spec.js +57 -394
- package/bin/validate.js +2 -26
- package/claude-plugin.json +2 -2
- package/docs/ARCHITECTURE.md +43 -46
- package/docs/CHEATSHEET.md +203 -221
- package/docs/COMMAND-FLOWS.md +319 -289
- package/docs/QUICKSTART.md +2 -8
- package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +2 -0
- package/docs/plans/2026-02-22-claude-settings.md +2 -0
- package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +2 -0
- package/docs/plans/2026-02-22-morph-spec-next.md +2 -0
- package/docs/plans/2026-02-22-native-alignment-design.md +2 -0
- package/docs/plans/2026-02-22-native-alignment-impl.md +2 -0
- package/docs/plans/2026-02-22-native-enrichment-design.md +2 -0
- package/docs/plans/2026-02-22-native-enrichment.md +2 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +2 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +2 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +2 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +2 -1
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +2 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +2 -1
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +2 -0
- package/docs/plans/2026-02-24-cli-radical-simplification.md +592 -0
- package/docs/plans/2026-02-24-framework-failure-points.md +125 -0
- package/docs/plans/2026-02-24-morph-init-design.md +337 -0
- package/docs/plans/2026-02-24-morph-init-impl.md +1269 -0
- package/docs/plans/2026-02-24-tutorial-command-design.md +71 -0
- package/docs/plans/2026-02-24-tutorial-command.md +298 -0
- package/framework/CLAUDE.md +1 -1
- package/framework/commands/morph-proposal.md +3 -3
- package/framework/hooks/README.md +2 -5
- package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +4 -55
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +20 -5
- package/framework/hooks/claude-code/statusline.py +6 -1
- package/framework/hooks/dev/check-sync-health.js +117 -0
- package/framework/hooks/dev/guard-version-numbers.js +57 -0
- package/framework/hooks/dev/sync-standards-registry.js +60 -0
- package/framework/hooks/dev/sync-template-registry.js +60 -0
- package/framework/hooks/dev/validate-skill-format.js +70 -0
- package/framework/hooks/dev/validate-standard-format.js +73 -0
- package/framework/hooks/shared/payload-utils.js +39 -0
- package/framework/hooks/shared/state-reader.js +25 -1
- package/framework/rules/morph-workflow.md +1 -1
- package/framework/skills/level-0-meta/morph-init/SKILL.md +216 -0
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +4 -4
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +4 -4
- package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +192 -191
- package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -180
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +339 -338
- package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -253
- package/framework/skills/level-1-workflows/phase-setup/SKILL.md +168 -170
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +284 -283
- package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -245
- package/framework/templates/examples/design-system-examples.md +1 -1
- package/framework/templates/ui/FluentDesignTheme.cs +1 -1
- package/framework/templates/ui/MudTheme.cs +1 -1
- package/framework/templates/ui/design-system.css +1 -1
- package/package.json +4 -2
- package/scripts/bump-version.js +248 -0
- package/scripts/install-dev-hooks.js +138 -0
- package/src/commands/agents/index.js +1 -2
- package/src/commands/index.js +13 -16
- package/src/commands/project/doctor.js +100 -14
- package/src/commands/project/index.js +7 -10
- package/src/commands/project/init.js +398 -528
- package/src/commands/project/install-plugin-cmd.js +28 -0
- package/src/commands/project/setup-infra-cmd.js +12 -0
- package/src/commands/project/tutorial.js +115 -0
- package/src/commands/state/approve.js +213 -221
- package/src/commands/state/index.js +0 -1
- package/src/commands/state/state.js +337 -365
- package/src/commands/templates/index.js +0 -4
- package/src/commands/trust/trust.js +1 -93
- package/src/commands/utils/index.js +1 -5
- package/src/commands/validation/index.js +1 -5
- package/src/core/registry/command-registry.js +11 -285
- package/src/core/state/state-manager.js +5 -2
- package/src/lib/detectors/index.js +81 -87
- package/src/lib/detectors/structure-detector.js +275 -273
- package/src/lib/generators/recap-generator.js +232 -225
- package/src/scripts/global-install.js +34 -0
- package/src/scripts/install-plugin.js +126 -0
- package/src/scripts/setup-infra.js +203 -0
- package/src/utils/agents-installer.js +10 -1
- package/src/utils/hooks-installer.js +66 -3
- package/.morph/.morphversion +0 -5
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -1815
- package/.morph/framework/hooks/README.md +0 -205
- package/.morph/framework/hooks/claude-code/notification/approval-reminder.js +0 -54
- package/.morph/framework/hooks/claude-code/post-tool-use/dispatch.js +0 -83
- package/.morph/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +0 -42
- package/.morph/framework/hooks/claude-code/pre-compact/save-morph-context.js +0 -61
- package/.morph/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +0 -71
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +0 -58
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +0 -64
- package/.morph/framework/hooks/claude-code/session-start/inject-morph-context.js +0 -94
- package/.morph/framework/hooks/claude-code/statusline.py +0 -538
- package/.morph/framework/hooks/claude-code/statusline.sh +0 -7
- package/.morph/framework/hooks/claude-code/stop/validate-completion.js +0 -88
- package/.morph/framework/hooks/claude-code/user-prompt/enrich-prompt.js +0 -91
- package/.morph/framework/hooks/git/commit-msg/conventional-commits.sh +0 -33
- package/.morph/framework/hooks/git/pre-commit/agents.sh +0 -25
- package/.morph/framework/hooks/git/pre-commit/orchestrator.sh +0 -64
- package/.morph/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/.morph/framework/hooks/git/pre-push/run-tests.sh +0 -44
- package/.morph/framework/hooks/shared/hook-response.js +0 -45
- package/.morph/framework/hooks/shared/phase-utils.js +0 -129
- package/.morph/framework/hooks/shared/state-reader.js +0 -138
- package/.morph/framework/hooks/shared/stdin-reader.js +0 -26
- package/.morph/framework/standards/STANDARDS.json +0 -933
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/.morph/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/app-router.md +0 -123
- package/.morph/framework/standards/frontend/nextjs/components.md +0 -132
- package/.morph/framework/standards/frontend/nextjs/data-fetching.md +0 -126
- package/.morph/framework/standards/frontend/nextjs/forms.md +0 -128
- package/.morph/framework/standards/frontend/nextjs/naming-conventions.md +0 -67
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/frontend/nextjs/project-structure.md +0 -102
- package/.morph/framework/standards/frontend/nextjs/state-management.md +0 -72
- package/.morph/framework/standards/frontend/nextjs/testing.md +0 -111
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1888
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -198
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +0 -43
- package/.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs +0 -26
- package/.morph/framework/templates/frontend/nextjs/env.mjs.hbs +0 -32
- package/.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs +0 -56
- package/.morph/framework/templates/frontend/nextjs/page.tsx.hbs +0 -22
- package/.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs +0 -26
- package/.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs +0 -54
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -17
- package/.morph/memory/pre-compact-2026-02-24T17-43-30-049Z.json +0 -16
- package/.morph/plans/eager-watching-bunny.md +0 -105
- package/.morph/plans/temporal-seeking-nebula.md +0 -45
- package/CLAUDE.md +0 -77
- package/docs/claude-alignment-report.md +0 -137
- package/docs/examples/order-management/contracts.cs +0 -84
- package/docs/examples/order-management/proposal.md +0 -24
- package/docs/examples/order-management/spec.md +0 -162
- package/src/commands/feature/create-story.js +0 -362
- package/src/commands/feature/index.js +0 -6
- package/src/commands/feature/shard-spec.js +0 -225
- package/src/commands/feature/sprint-status.js +0 -250
- package/src/commands/generation/generate-onboarding.js +0 -169
- package/src/commands/generation/generate.js +0 -276
- package/src/commands/generation/index.js +0 -5
- package/src/commands/learning/capture-pattern.js +0 -121
- package/src/commands/learning/index.js +0 -5
- package/src/commands/learning/search-patterns.js +0 -126
- package/src/commands/mcp/mcp.js +0 -102
- package/src/commands/project/changes.js +0 -66
- package/src/commands/project/cost.js +0 -179
- package/src/commands/project/diff.js +0 -278
- package/src/commands/project/revert.js +0 -173
- package/src/commands/project/standards.js +0 -80
- package/src/commands/project/sync.js +0 -167
- package/src/commands/project/update-agents.js +0 -23
- package/src/commands/state/rollback-phase.js +0 -185
- package/src/commands/templates/template-customize.js +0 -87
- package/src/commands/templates/template-list.js +0 -114
- package/src/commands/templates/template-show.js +0 -129
- package/src/commands/templates/template-validate.js +0 -91
- package/src/commands/utils/troubleshoot.js +0 -222
- package/src/commands/validation/analyze-blazor-concurrency.js +0 -193
- package/src/commands/validation/lint-fluent.js +0 -352
- package/src/commands/validation/validate-blazor-state.js +0 -210
- package/src/commands/validation/validate-blazor.js +0 -156
- package/src/commands/validation/validate-css.js +0 -84
- package/src/lib/detectors/conversation-analyzer.js +0 -163
- package/src/lib/learning/index.js +0 -7
- package/src/lib/learning/learning-system.js +0 -520
- package/src/lib/troubleshooting/index.js +0 -8
- package/src/lib/troubleshooting/troubleshoot-grep.js +0 -198
- package/src/lib/troubleshooting/troubleshoot-index.js +0 -144
- package/src/llm/environment-detector.js +0 -43
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# Plan: Fix Statusline Not Being Installed
|
|
2
|
-
|
|
3
|
-
## Context
|
|
4
|
-
|
|
5
|
-
`morph-spec init` is supposed to install the global statusline to `~/.claude/` so
|
|
6
|
-
it appears in every Claude Code session. Two bugs exist:
|
|
7
|
-
|
|
8
|
-
1. **`update.js` never calls `installGlobalStatusline`** — running `morph-spec update`
|
|
9
|
-
leaves the statusline missing or stale, and there is no path for existing users to
|
|
10
|
-
get it without running `init` from scratch.
|
|
11
|
-
2. **No success confirmation in `init.js` output** — after a successful installation the
|
|
12
|
-
"Files installed:" list never mentions `~/.claude/statusline.sh`, so users assume
|
|
13
|
-
it was skipped (especially since failures are silently swallowed by a bare `catch {}`).
|
|
14
|
-
|
|
15
|
-
Root cause confirmed by: reading `update.js` (no `installGlobalStatusline` import or call)
|
|
16
|
-
and `init.js` lines 462–505 (success block omits statusline entry). Tests for
|
|
17
|
-
`installGlobalStatusline` in isolation pass; there is no integration test covering the
|
|
18
|
-
init/update flow.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Critical Files
|
|
23
|
-
|
|
24
|
-
| File | Change |
|
|
25
|
-
|------|--------|
|
|
26
|
-
| `src/commands/project/update.js` | Add `installGlobalStatusline` import + call |
|
|
27
|
-
| `src/commands/project/init.js` | Add `✓ ~/.claude/statusline.sh` to success output |
|
|
28
|
-
| `test/hooks/hooks-installer.test.js` | Already has good coverage — no change needed |
|
|
29
|
-
| `test/commands/init.test.js` | Add `statusline-installation` describe suite |
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Implementation Steps
|
|
34
|
-
|
|
35
|
-
### 1. `update.js` — Add statusline installation
|
|
36
|
-
|
|
37
|
-
**File:** `src/commands/project/update.js`
|
|
38
|
-
|
|
39
|
-
**Import change** (line 27 — extend existing destructure):
|
|
40
|
-
```js
|
|
41
|
-
import { installClaudeHooks, installGlobalStatusline } from '../../utils/claude-settings-manager.js';
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**Call** — insert after the CLAUDE.md sync block (after line 280, before "Update Claude
|
|
45
|
-
Code hooks" at line 282):
|
|
46
|
-
```js
|
|
47
|
-
// Sync statusline globally to ~/.claude/
|
|
48
|
-
updateSpinner.text = 'Syncing statusline to ~/.claude/...';
|
|
49
|
-
const HOOKS_SRC = join(__dirname, '..', '..', '..', 'framework', 'hooks', 'claude-code');
|
|
50
|
-
try {
|
|
51
|
-
await installGlobalStatusline(HOOKS_SRC);
|
|
52
|
-
} catch {
|
|
53
|
-
// Non-critical: global dir may not be writable in all environments
|
|
54
|
-
logger.dim(' ⚠ Could not install statusline globally (non-critical)');
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**Success output** — add line after `.claude/CLAUDE.md` entry (around line 324):
|
|
59
|
-
```js
|
|
60
|
-
logger.dim(' ✓ ~/.claude/statusline.sh (global statusline synced)');
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Note: `update.js` already uses `__dirname` (defined at line 6 via `fileURLToPath`),
|
|
64
|
-
so use `__dirname` instead of `import.meta.dirname` to stay consistent with the file.
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
### 2. `init.js` — Add statusline to success output
|
|
69
|
-
|
|
70
|
-
**File:** `src/commands/project/init.js`
|
|
71
|
-
|
|
72
|
-
After line 505 (`logger.dim(' ✓ .claude/agents/...')`), add:
|
|
73
|
-
```js
|
|
74
|
-
logger.dim(' ✓ ~/.claude/statusline.sh (global statusline installed)');
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
This line is unconditional — the installation is always attempted and the message
|
|
78
|
-
reflects the intent (mirrors how skills/agents are always listed even without a flag).
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
### 3. `test/commands/init.test.js` — Add statusline integration test suite
|
|
83
|
-
|
|
84
|
-
Add a new `describe('statusline-installation')` block that:
|
|
85
|
-
- Calls `installGlobalStatusline` directly with a `globalClaudeDirOverride` temp dir
|
|
86
|
-
and the real `framework/hooks/claude-code` source path
|
|
87
|
-
- Asserts `statusline.sh` and `statusline.py` were copied
|
|
88
|
-
- Asserts `settings.json` has a `statusLine` key pointing to `statusline.sh`
|
|
89
|
-
|
|
90
|
-
This mirrors the pattern used by the `rules-installation` suite.
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Verification
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
# Run full test suite — must stay green (678+ pass, 0 fail)
|
|
98
|
-
node --test --test-concurrency=1
|
|
99
|
-
|
|
100
|
-
# Smoke test update path
|
|
101
|
-
node bin/morph-spec.js update --skip-detection --skip-mcp 2>&1 | grep -i statusline
|
|
102
|
-
|
|
103
|
-
# Manually verify ~/.claude/statusline.sh exists and settings.json has statusLine key
|
|
104
|
-
node -e "const s = require('fs').readFileSync(require('os').homedir()+'/.claude/settings.json','utf8'); console.log(JSON.parse(s).statusLine)"
|
|
105
|
-
```
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Plan: Remove `detect` command and fix `init` for PowerShell execution
|
|
2
|
-
|
|
3
|
-
## Context
|
|
4
|
-
|
|
5
|
-
`morph-spec init` is run from PowerShell (not inside Claude Code), so `detectClaudeCode()` always returns false, making step 13 a dead code branch that shows a confusing warning. `morph-spec detect` is registered but provides no additional value beyond what `init` already does with `detectProject()`. `--wizard` is referenced in messages but was never registered as a CLI option. This plan removes the dead code and makes `init` self-sufficient.
|
|
6
|
-
|
|
7
|
-
## What changes
|
|
8
|
-
|
|
9
|
-
### 1. Delete `src/commands/project/detect.js`
|
|
10
|
-
The command is obsolete — its functionality (stack/arch detection + saving to `.morph/project/context/`) is superseded by the `detectProject()` call already inside `init` at step 11c.
|
|
11
|
-
|
|
12
|
-
### 2. `bin/morph-spec.js`
|
|
13
|
-
- Remove `import { detectCommand }` (line 14)
|
|
14
|
-
- Remove the `.command('detect')` block (lines 131–136)
|
|
15
|
-
|
|
16
|
-
### 3. `src/commands/project/init.js`
|
|
17
|
-
- Remove imports: `AutoContextOrchestrator` (line 21), `detectClaudeCode` (line 22)
|
|
18
|
-
- **Remove step 13 entirely** (lines 509–540) — the entire `if (!options.skipDetection && detectClaudeCode())` / `else if` / `else` block
|
|
19
|
-
- Fix context README.md template (line 110): remove `Run \`morph-spec detect\`` sentence, replace with `Edit this file to describe your project context.`
|
|
20
|
-
- Fix Next Steps (line 470): remove `logger.step(1, 'Run detection: morph-spec detect')`, renumber remaining steps (step 1 → "Review .morph/config/config.json", step 2 → "Open project in VS Code with Claude Code", step 3 → "Start your first feature:")
|
|
21
|
-
|
|
22
|
-
### 4. `src/commands/project/update.js`
|
|
23
|
-
- Remove imports: `AutoContextOrchestrator`, `detectClaudeCode` (lines ~3–4 in that file)
|
|
24
|
-
- Remove the `if (!options.skipDetection && detectClaudeCode())` / `else if` / `else` block (lines 331–363)
|
|
25
|
-
|
|
26
|
-
## Files to modify
|
|
27
|
-
- `bin/morph-spec.js`
|
|
28
|
-
- `src/commands/project/init.js`
|
|
29
|
-
- `src/commands/project/update.js`
|
|
30
|
-
|
|
31
|
-
## Files to delete
|
|
32
|
-
- `src/commands/project/detect.js`
|
|
33
|
-
|
|
34
|
-
## Files NOT changed
|
|
35
|
-
- `test/integration/wizard-fallback.test.js` — tests `mapAnswersToConfig()` from `wizard-questions.js`, unrelated to detect command; still passes
|
|
36
|
-
- `test/commands/init.test.js` — no references to detect/wizard/detectClaudeCode; unaffected
|
|
37
|
-
- `src/core/orchestrator.js`, `src/ui/wizard-questions.js`, `src/llm/environment-detector.js` — left in place (may be used elsewhere); just remove imports/usage from init+update
|
|
38
|
-
- `src/lib/detectors/index.js` + `detectProject()` — **kept** in init (step 11c); this is the static file-based stack detection that works without Claude Code
|
|
39
|
-
|
|
40
|
-
## Verification
|
|
41
|
-
1. `node bin/morph-spec.js --help` — `detect` command should no longer appear
|
|
42
|
-
2. `node bin/morph-spec.js init --help` — no `--skip-detection` or `--wizard` references
|
|
43
|
-
3. `node bin/morph-spec.js update --help` — same
|
|
44
|
-
4. Run test suite: `npm test` — should still pass 678 tests (no tests reference detect/wizard in init.test.js)
|
|
45
|
-
5. Manual: run `morph-spec init` from PowerShell in a test project — should complete without the "Claude Code not detected" warning
|
package/CLAUDE.md
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# MORPH-SPEC Runtime Instructions
|
|
2
|
-
|
|
3
|
-
> by Polymorphism Tech — Spec-driven development for .NET/Blazor/Next.js/Azure
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Project Context
|
|
8
|
-
|
|
9
|
-
@.morph/context/README.md
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Critical Rules
|
|
14
|
-
|
|
15
|
-
**NEVER:**
|
|
16
|
-
- Skip to code without a specification
|
|
17
|
-
- Implement without design approval
|
|
18
|
-
- Ignore standards in `.morph/framework/standards/`
|
|
19
|
-
- Create infrastructure manually
|
|
20
|
-
- Generate code without defined contracts
|
|
21
|
-
|
|
22
|
-
**ALWAYS:**
|
|
23
|
-
- Follow the mandatory phases
|
|
24
|
-
- Generate outputs in `.morph/features/{feature}/`
|
|
25
|
-
- Document decisions in `decisions.md`
|
|
26
|
-
- Checkpoint every 3 implemented tasks
|
|
27
|
-
- Use Infrastructure as Code
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Quick Reference
|
|
32
|
-
|
|
33
|
-
| Command | Purpose |
|
|
34
|
-
|---------|---------|
|
|
35
|
-
| `/morph-proposal {feature}` | Full spec pipeline (phases 1–4, pauses for approval) |
|
|
36
|
-
| `/morph-apply {feature}` | Implement feature (phase 5) |
|
|
37
|
-
| `/morph-status` | Feature status dashboard |
|
|
38
|
-
| `/morph-preflight` | Pre-implementation validation |
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## State & Outputs
|
|
43
|
-
|
|
44
|
-
| Path | Notes |
|
|
45
|
-
|------|-------|
|
|
46
|
-
| `.morph/state.json` | **READ-ONLY** — use `morph-spec` CLI to update |
|
|
47
|
-
| `.morph/features/{feature}/{phase}/` | Feature outputs organized by phase |
|
|
48
|
-
| `.morph/framework/` | **READ-ONLY** — framework files managed by morph-spec |
|
|
49
|
-
| `.morph/config/config.json` | Project configuration (editable) |
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Phase Sequence
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
proposal → setup → [uiux] → design → clarify → tasks → implement → [sync]
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Use `morph-spec status {feature}` to see current phase and pending approval gates.
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## Agents
|
|
64
|
-
|
|
65
|
-
Tier-1 and tier-2 MORPH agents are available as native subagents in `.claude/agents/`.
|
|
66
|
-
They can be invoked directly by Claude Code during multi-agent workflows.
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Context Window Tip
|
|
71
|
-
|
|
72
|
-
When using 3+ MCPs, add `"experimental": { "mcpCliMode": true }` to `.claude/settings.json`.
|
|
73
|
-
MCP tools load on-demand instead of all at startup — keeps context clean for actual work.
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
*MORPH-SPEC v4.5.0 by Polymorphism Tech*
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
# Claude Code Native Alignment Report — Round 2
|
|
2
|
-
|
|
3
|
-
> **Date:** 2026-02-22
|
|
4
|
-
> **Status:** Implemented
|
|
5
|
-
> **Scope:** Memory/rules layer — building on Round 1 (commit 8c806c2)
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Summary
|
|
10
|
-
|
|
11
|
-
Round 2 of Claude Code native alignment identifies and adopts two native patterns from the official Claude Code memory documentation that were missed in Round 1:
|
|
12
|
-
|
|
13
|
-
1. **`.claude/rules/*.md`** — Path-scoped, auto-loading instruction files
|
|
14
|
-
2. **`@import` in CLAUDE.md** — Auto-import external files into session context
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Native Patterns Now Adopted
|
|
19
|
-
|
|
20
|
-
### 1. Path-Scoped Rules (`.claude/rules/`)
|
|
21
|
-
|
|
22
|
-
**What it is:** Claude Code natively supports modular instruction files placed in `.claude/rules/`. Files without `paths:` frontmatter apply globally; files with `paths:` frontmatter auto-load only when Claude is working with matching files.
|
|
23
|
-
|
|
24
|
-
**What we implemented:**
|
|
25
|
-
|
|
26
|
-
| File | Scope | Paths |
|
|
27
|
-
|------|-------|-------|
|
|
28
|
-
| `morph-workflow.md` | Always active | (none — global) |
|
|
29
|
-
| `csharp-standards.md` | C# files | `**/*.cs`, `**/*.csproj` |
|
|
30
|
-
| `frontend-standards.md` | Blazor/TS/CSS | `**/*.razor`, `**/*.tsx`, `**/*.ts`, `**/*.css` |
|
|
31
|
-
| `testing-standards.md` | Test files | `tests/**`, `**/*.test.*`, `**/*.spec.*`, `**/*Tests.cs` |
|
|
32
|
-
| `infrastructure-standards.md` | Infra files | `**/*.bicep`, `**/Dockerfile`, `**/pipelines/**` |
|
|
33
|
-
|
|
34
|
-
**Source material:** Distilled from `framework/standards/` (core/coding.md, backend/dotnet/core.md, core/testing.md, frontend/blazor/pitfalls.md, infrastructure/azure/azure.md, frontend/nextjs/nextjs-patterns.md).
|
|
35
|
-
|
|
36
|
-
**Why it matters:** Previously, standards were buried in `.morph/framework/standards/` — Claude had to navigate deep paths to access them, and they were never automatically loaded. Path-scoped rules ensure Claude sees the right standards *automatically* when working on the right files, without any manual intervention.
|
|
37
|
-
|
|
38
|
-
**Installation:** `morph-spec init` copies `framework/rules/` → `.claude/rules/` (step 9a in `initCommand()`).
|
|
39
|
-
|
|
40
|
-
### 2. `@import` in CLAUDE.md
|
|
41
|
-
|
|
42
|
-
**What it is:** Claude Code supports `@path/to/file` syntax inside CLAUDE.md to auto-import external files into the session context at startup.
|
|
43
|
-
|
|
44
|
-
**What we implemented:** Added `@.morph/context/README.md` to `framework/CLAUDE.md`:
|
|
45
|
-
|
|
46
|
-
```markdown
|
|
47
|
-
## PROJECT CONTEXT
|
|
48
|
-
|
|
49
|
-
@.morph/context/README.md
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**Why it matters:** Previously, `framework/CLAUDE.md` referenced `.morph/context/README.md` only in text (e.g., "run `morph-spec detect` to see your stack"). The file was never actually loaded. Now, every Claude Code session in a user project automatically starts with the project context (stack, architecture, technologies) pre-loaded — no manual reading required.
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## What Remains Over-Engineered
|
|
57
|
-
|
|
58
|
-
### Partially Redundant: Session Context Injection vs Auto Memory
|
|
59
|
-
|
|
60
|
-
The `UserPromptSubmit` hook injects context into every session. This overlaps with:
|
|
61
|
-
- Auto memory (`~/.claude/projects/.../memory/`) — Claude Code's native persistent context layer
|
|
62
|
-
- The new `@import` in CLAUDE.md — project context auto-loaded at startup
|
|
63
|
-
|
|
64
|
-
**Verdict:** Keep the hook for now. It handles dynamic state (current feature, active phase) that auto memory doesn't cover. Revisit in Round 3 — the hook may be reducible to only inject feature-specific state, not static project context.
|
|
65
|
-
|
|
66
|
-
### Level 3–4 Skills Rarely Used
|
|
67
|
-
|
|
68
|
-
`framework/skills/level-3-technologies/` and `level-4-patterns/` contain 30+ files that are rarely invoked. They're installed to `.claude/skills/` via symlinks/copies during init.
|
|
69
|
-
|
|
70
|
-
**Verdict:** Keep for now — they're passive (loaded on-demand via `/skill-name`). Consider documenting them as "on-demand only" in the `morph-workflow.md` rule. Long-term, Level 3–4 could be removed from auto-install and accessed directly from `framework/skills/` when needed.
|
|
71
|
-
|
|
72
|
-
### 37 Agents in `agents.json`
|
|
73
|
-
|
|
74
|
-
The agent system has 37 agents across 4 tiers. For most projects, only 5–8 agents are active at any given time.
|
|
75
|
-
|
|
76
|
-
**Verdict:** Acceptable complexity. Agents drive spawn prompts and workflow orchestration — they can't be replaced by documentation. The activation-by-keyword system (Tier 3) already limits unnecessary activation.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## What Was Intentionally Kept (Justified)
|
|
81
|
-
|
|
82
|
-
| Feature | Justification |
|
|
83
|
-
|---------|--------------|
|
|
84
|
-
| `state.json` + state machine | Claude Code has no native feature-tracking equivalent; phase enforcement requires runtime state |
|
|
85
|
-
| `protect-spec-files.js` hook | Dynamically checks approval gate state before allowing spec file edits — cannot be replaced by static `permissions.deny` |
|
|
86
|
-
| All 12 Claude Code hooks | Context injection (dynamic), output tracking (direct JSON I/O), tool failure logging all provide value beyond native capabilities |
|
|
87
|
-
| `.morph/framework/standards/` | Deep reference library for agents; the rules layer distills it but doesn't replace it |
|
|
88
|
-
| `permissions.deny` for state.json + framework | Already replaced `protect-readonly-files.js` hook in Round 1 — this is the right native approach |
|
|
89
|
-
| Skills hierarchy (Level 0–2) | Level 0 (meta), Level 1 (phase workflows), Level 2 (domains) are actively invoked via `/skill-name` syntax |
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Roadmap: Round 3 Candidates
|
|
94
|
-
|
|
95
|
-
In priority order:
|
|
96
|
-
|
|
97
|
-
1. **Session context hook reduction** — Trim `UserPromptSubmit` hook to inject only feature-specific dynamic state, relying on `@import` + rules for static context. Reduces hook complexity.
|
|
98
|
-
|
|
99
|
-
2. **Level 3–4 skill audit** — Measure actual usage frequency. If consistently low, move these to a "pull-on-demand" model (reference from framework, not installed to `.claude/skills/`).
|
|
100
|
-
|
|
101
|
-
3. **`morph-workflow.md` rule enhancement** — Add current workflow/phase detection so the always-active rule provides live feature status context (currently requires `morph-spec status` command).
|
|
102
|
-
|
|
103
|
-
4. **User-level rules layer (`~/.claude/rules/`)** — A potential personal workflow preferences file for Polymorphism Tech developers (e.g., preferred stack defaults, commit message style). Not currently used.
|
|
104
|
-
|
|
105
|
-
5. **Rules auto-update on `morph-spec update`** — Currently rules are only installed during `init`. The `update` command should sync `.claude/rules/` when framework rules change.
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## Files Changed in Round 2
|
|
110
|
-
|
|
111
|
-
| Action | File |
|
|
112
|
-
|--------|------|
|
|
113
|
-
| Created | `framework/rules/morph-workflow.md` |
|
|
114
|
-
| Created | `framework/rules/csharp-standards.md` |
|
|
115
|
-
| Created | `framework/rules/frontend-standards.md` |
|
|
116
|
-
| Created | `framework/rules/testing-standards.md` |
|
|
117
|
-
| Created | `framework/rules/infrastructure-standards.md` |
|
|
118
|
-
| Updated | `framework/CLAUDE.md` — added `@.morph/context/README.md` import |
|
|
119
|
-
| Updated | `src/commands/project/init.js` — added step 9a: rules copy to `.claude/rules/` |
|
|
120
|
-
| Created | `docs/claude-alignment-report.md` (this file) |
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Round 1 Reference (commit 8c806c2)
|
|
125
|
-
|
|
126
|
-
Round 1 implemented 7 tasks:
|
|
127
|
-
1. Fixed circular hook bug in `track-output-creation.js`
|
|
128
|
-
2. Native `permissions.deny` replaced `protect-readonly-files.js`
|
|
129
|
-
3. Skills installed to `.claude/skills/` (flat, with symlinks on non-Windows)
|
|
130
|
-
4. Global statusline installed to `~/.claude/`
|
|
131
|
-
5. `PostToolUseFailure` hook: `handle-tool-failure.js`
|
|
132
|
-
6. Standards registry: `framework/standards/STANDARDS.json` (74 entries)
|
|
133
|
-
7. `framework/phases.json` — canonical phase definitions
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// CONTRACTS: Order Management — Level 2 (Business Logic)
|
|
3
|
-
// Example of correctly filled contracts-level2.cs template
|
|
4
|
-
// Feature: order-management | Date: 2026-02-23
|
|
5
|
-
// ============================================================
|
|
6
|
-
|
|
7
|
-
using System;
|
|
8
|
-
using System.Collections.Generic;
|
|
9
|
-
using System.Threading;
|
|
10
|
-
using System.Threading.Tasks;
|
|
11
|
-
using MediatR;
|
|
12
|
-
|
|
13
|
-
// ===== AGGREGATE ROOT =====
|
|
14
|
-
// Implementado em: Domain/Orders/Aggregates/Order.cs
|
|
15
|
-
//
|
|
16
|
-
// Invariants (do spec.md > Aggregate Blueprint):
|
|
17
|
-
// - Confirm() só é válido se Status == Draft E Items.Any()
|
|
18
|
-
// - AddItem() lança DomainException se Status != Draft
|
|
19
|
-
// - Cancel() é válido de Draft ou Confirmed → Cancelled (terminal)
|
|
20
|
-
|
|
21
|
-
namespace ExampleApp.Domain.Orders.Events;
|
|
22
|
-
|
|
23
|
-
// ===== DOMAIN EVENTS =====
|
|
24
|
-
|
|
25
|
-
public record OrderCreatedEvent(Guid OrderId, Guid UserId) : DomainEvent;
|
|
26
|
-
public record OrderConfirmedEvent(Guid OrderId, Guid UserId, decimal Total) : DomainEvent; // Total as decimal for event serialization; Money value object lives inside the Aggregate
|
|
27
|
-
public record OrderCancelledEvent(Guid OrderId, string Reason) : DomainEvent;
|
|
28
|
-
|
|
29
|
-
namespace ExampleApp.Application.Orders.Commands;
|
|
30
|
-
|
|
31
|
-
// ===== COMMANDS (CQRS) =====
|
|
32
|
-
|
|
33
|
-
public record CreateOrderCommand(Guid UserId, List<CreateOrderItemRequest> Items)
|
|
34
|
-
: IRequest<CreateOrderResult>;
|
|
35
|
-
public record CreateOrderResult(Guid OrderId);
|
|
36
|
-
|
|
37
|
-
public record ConfirmOrderCommand(Guid OrderId) : IRequest;
|
|
38
|
-
public record CancelOrderCommand(Guid OrderId, string Reason) : IRequest;
|
|
39
|
-
|
|
40
|
-
namespace ExampleApp.Application.Orders.Queries;
|
|
41
|
-
|
|
42
|
-
// ===== QUERIES =====
|
|
43
|
-
|
|
44
|
-
public record GetOrderQuery(Guid OrderId) : IRequest<OrderDto?>;
|
|
45
|
-
|
|
46
|
-
// PagedResult<T> — defined in Shared/Common/PagedResult.cs (shared framework type)
|
|
47
|
-
public record ListOrdersByUserQuery(Guid UserId, int Page = 1, int PageSize = 20)
|
|
48
|
-
: IRequest<PagedResult<OrderDto>>;
|
|
49
|
-
|
|
50
|
-
namespace ExampleApp.Application.Orders;
|
|
51
|
-
|
|
52
|
-
// ===== DTOs (read models — nunca expõe o Aggregate diretamente) =====
|
|
53
|
-
|
|
54
|
-
public record OrderDto(
|
|
55
|
-
Guid Id,
|
|
56
|
-
Guid UserId,
|
|
57
|
-
string Status,
|
|
58
|
-
decimal Total,
|
|
59
|
-
List<OrderItemDto> Items,
|
|
60
|
-
DateTime CreatedAt,
|
|
61
|
-
DateTime? UpdatedAt
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
public record OrderItemDto(Guid ProductId, int Quantity, decimal UnitPrice, decimal Subtotal);
|
|
65
|
-
|
|
66
|
-
public record CreateOrderItemRequest(Guid ProductId, int Quantity, decimal UnitPrice);
|
|
67
|
-
|
|
68
|
-
namespace ExampleApp.Domain.Orders;
|
|
69
|
-
|
|
70
|
-
// ===== REPOSITORY (um por Aggregate Root) =====
|
|
71
|
-
|
|
72
|
-
public interface IOrderRepository
|
|
73
|
-
{
|
|
74
|
-
Task<Order?> GetAsync(Guid id, CancellationToken ct = default);
|
|
75
|
-
Task<List<Order>> GetByUserAsync(Guid userId, CancellationToken ct = default);
|
|
76
|
-
Task AddAsync(Order order, CancellationToken ct = default);
|
|
77
|
-
Task UpdateAsync(Order order, CancellationToken ct = default);
|
|
78
|
-
Task<bool> ExistsAsync(Guid id, CancellationToken ct = default);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ===== EXCEPTIONS =====
|
|
82
|
-
|
|
83
|
-
public class OrderNotFoundException(Guid id) : DomainException($"Order '{id}' not found.");
|
|
84
|
-
public class OrderInvalidStateException(string message) : DomainException(message);
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Proposal: Order Management
|
|
2
|
-
|
|
3
|
-
**Feature:** order-management
|
|
4
|
-
**Type:** Business Logic (Level 2)
|
|
5
|
-
**Stack:** .NET 10 / C# 14, Blazor Server, EF Core, Azure SQL
|
|
6
|
-
|
|
7
|
-
## User Story
|
|
8
|
-
|
|
9
|
-
Como usuário autenticado, quero criar e gerenciar pedidos de compra para que eu possa
|
|
10
|
-
acompanhar o status dos meus pedidos e receber notificações de mudanças.
|
|
11
|
-
|
|
12
|
-
## Acceptance Criteria
|
|
13
|
-
|
|
14
|
-
- [ ] Usuário pode criar um pedido com 1+ itens
|
|
15
|
-
- [ ] Pedido começa no status Draft
|
|
16
|
-
- [ ] Pedido só pode ser Confirmado se tiver pelo menos 1 item
|
|
17
|
-
- [ ] Pedido Confirmado não pode receber mais itens
|
|
18
|
-
- [ ] Total do pedido é calculado automaticamente
|
|
19
|
-
- [ ] Sistema notifica quando pedido é Confirmado
|
|
20
|
-
|
|
21
|
-
## Out of Scope
|
|
22
|
-
|
|
23
|
-
- Pagamento (feature separada)
|
|
24
|
-
- Envio/logística
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
# Feature Specification: Order Management
|
|
2
|
-
|
|
3
|
-
| Field | Value |
|
|
4
|
-
|-------|-------|
|
|
5
|
-
| **ID** | order-management |
|
|
6
|
-
| **Status** | Approved |
|
|
7
|
-
| **Created** | 2026-02-23 |
|
|
8
|
-
| **Stack** | .NET 10 / Blazor Server / EF Core |
|
|
9
|
-
| **Complexity** | Medium |
|
|
10
|
-
| **Agents** | Core: All / Specialists: domain-architect, ef-modeler, event-architect |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Overview
|
|
15
|
-
|
|
16
|
-
**Problem:** Usuários precisam criar e gerenciar pedidos com rastreamento de status.
|
|
17
|
-
|
|
18
|
-
**Solution:** Aggregate Order com factory method, invariants de estado, e Domain Events para notificações.
|
|
19
|
-
|
|
20
|
-
**Success Criteria:**
|
|
21
|
-
- [ ] Order CRUD com validações de negócio
|
|
22
|
-
- [ ] Status tracking com transições controladas
|
|
23
|
-
- [ ] Notificação ao confirmar pedido
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Requirements
|
|
28
|
-
|
|
29
|
-
**Functional:**
|
|
30
|
-
FR001: Criar pedido com mínimo 1 item | FR002: Confirmar pedido (Draft → Confirmed) | FR003: Cancelar pedido (Draft/Confirmed → Cancelled) | FR004: Calcular total automaticamente
|
|
31
|
-
|
|
32
|
-
**Non-Functional:**
|
|
33
|
-
NFR001: Performance - operações < 200ms | NFR002: Consistência - invariants garantidas em toda operação
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## User Stories
|
|
38
|
-
|
|
39
|
-
### US001: Criar Pedido
|
|
40
|
-
**As** usuário autenticado **I want** criar um pedido com itens **so that** posso comprar produtos
|
|
41
|
-
|
|
42
|
-
**Acceptance Criteria:**
|
|
43
|
-
1. Pedido criado com status Draft
|
|
44
|
-
2. Total calculado na criação
|
|
45
|
-
|
|
46
|
-
**Edge Cases:** Lista de itens vazia → erro 400
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Technical Design
|
|
51
|
-
|
|
52
|
-
### Stack
|
|
53
|
-
| Component | Technology |
|
|
54
|
-
|-----------|------------|
|
|
55
|
-
| Frontend | Blazor Server |
|
|
56
|
-
| Backend | .NET 10 / C# 14 |
|
|
57
|
-
| Database | Azure SQL / EF Core |
|
|
58
|
-
|
|
59
|
-
### Data Model
|
|
60
|
-
|
|
61
|
-
#### Order
|
|
62
|
-
| Column | Type | Constraints |
|
|
63
|
-
|--------|------|-------------|
|
|
64
|
-
| Id | Guid | PK |
|
|
65
|
-
| UserId | Guid | FK (reference by ID — cross-aggregate) |
|
|
66
|
-
| Status | OrderStatus | Enum |
|
|
67
|
-
| CreatedAt | datetime2 | Default: GETUTCDATE() |
|
|
68
|
-
| UpdatedAt | datetime2 | Nullable |
|
|
69
|
-
|
|
70
|
-
#### OrderItem (owned entity)
|
|
71
|
-
| Column | Type | Constraints |
|
|
72
|
-
|--------|------|-------------|
|
|
73
|
-
| Id | Guid | PK |
|
|
74
|
-
| OrderId | Guid | FK |
|
|
75
|
-
| ProductId | Guid | Reference by ID |
|
|
76
|
-
| Quantity | int | > 0 |
|
|
77
|
-
| UnitPrice | decimal(18,2) | > 0 |
|
|
78
|
-
|
|
79
|
-
### Contracts
|
|
80
|
-
> **Ref:** `framework/templates/code/dotnet/contracts/contracts-level2.cs`
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Domain Complexity
|
|
85
|
-
|
|
86
|
-
**Nível:** 2 — Business Logic
|
|
87
|
-
|
|
88
|
-
**Justificativa:** Order tem estados com transições controladas (Draft → Confirmed → Cancelled),
|
|
89
|
-
invariants de negócio (não confirmar sem itens, não adicionar itens a pedido confirmado),
|
|
90
|
-
cálculo derivado (Total), e outros módulos precisam reagir (NotificationService ao OrderConfirmed).
|
|
91
|
-
|
|
92
|
-
**Padrões Aplicados:**
|
|
93
|
-
- AggregateRoot com factory method estático
|
|
94
|
-
- Value Objects: Money (UnitPrice, Total)
|
|
95
|
-
- Domain Events: OrderCreatedEvent, OrderConfirmedEvent, OrderCancelledEvent
|
|
96
|
-
- CQRS com MediatR
|
|
97
|
-
|
|
98
|
-
**Padrões Omitidos:**
|
|
99
|
-
- Bounded Contexts — sistema single-domain, desnecessário
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Aggregate Blueprint (Nível 2+ apenas)
|
|
104
|
-
|
|
105
|
-
### Aggregate Root: Order
|
|
106
|
-
|
|
107
|
-
**Invariants:**
|
|
108
|
-
- Order só pode ser Confirmado se Status == Draft E tiver pelo menos 1 item
|
|
109
|
-
- Order Confirmado não pode receber mais itens (AddItem lança DomainException)
|
|
110
|
-
- Order Cancelado não pode ser reativado (estado terminal)
|
|
111
|
-
|
|
112
|
-
**Estados e Transições:**
|
|
113
|
-
```
|
|
114
|
-
{Draft} → Confirm() → {Confirmed}
|
|
115
|
-
{Draft} → Cancel() → {Cancelled}
|
|
116
|
-
{Confirmed} → Cancel() → {Cancelled}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**Domain Events:**
|
|
120
|
-
- `OrderCreatedEvent` — publicado ao criar (Create factory method)
|
|
121
|
-
- `OrderConfirmedEvent` — publicado ao confirmar (Confirm method)
|
|
122
|
-
- `OrderCancelledEvent` — publicado ao cancelar (Cancel method)
|
|
123
|
-
|
|
124
|
-
**Value Objects:**
|
|
125
|
-
- `Money` — UnitPrice e Total não são decimals simples: têm validação (> 0) e operações (Add, Multiply)
|
|
126
|
-
|
|
127
|
-
**Referências Cross-Aggregate (por ID):**
|
|
128
|
-
- `UserId: Guid` — nunca `User User { get; }`
|
|
129
|
-
- `ProductId: Guid` em OrderItem — nunca `Product Product { get; }`
|
|
130
|
-
|
|
131
|
-
### Linguagem Ubíqua
|
|
132
|
-
|
|
133
|
-
| Termo | Definição | Código |
|
|
134
|
-
|-------|-----------|--------|
|
|
135
|
-
| Order | Pedido de compra de um usuário | `Order` (AggregateRoot) |
|
|
136
|
-
| Draft | Pedido criado, ainda editável | `OrderStatus.Draft` |
|
|
137
|
-
| Confirmed | Pedido submetido, não editável | `OrderStatus.Confirmed` |
|
|
138
|
-
| Cancelled | Pedido cancelado, estado terminal | `OrderStatus.Cancelled` |
|
|
139
|
-
| Confirm | Ato de finalizar e submeter um pedido | `Order.Confirm()` |
|
|
140
|
-
| OrderItem | Linha de produto dentro de um pedido | `OrderItem` (Entity owned) |
|
|
141
|
-
| Total | Soma calculada de todos os itens | `Order.Total` (property calculada) |
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Flows
|
|
146
|
-
|
|
147
|
-
### Confirmar Pedido
|
|
148
|
-
**Trigger:** Usuário clica "Confirmar Pedido"
|
|
149
|
-
1. Frontend → `POST /api/orders/{id}/confirm`
|
|
150
|
-
2. API → `ConfirmOrderCommand(OrderId)`
|
|
151
|
-
3. Handler → `repository.GetAsync(id)` → `order.Confirm()` → `repository.UpdateAsync(order)`
|
|
152
|
-
4. `OrderConfirmedEvent` publicado → NotificationService envia email
|
|
153
|
-
**End State:** Order.Status = Confirmed
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Definition of Done
|
|
158
|
-
- [ ] Aggregate implementado com todos os invariants
|
|
159
|
-
- [ ] Domain Events publicados e consumidos
|
|
160
|
-
- [ ] Testes unitários do Aggregate (sem EF)
|
|
161
|
-
- [ ] Testes de integração do Handler
|
|
162
|
-
- [ ] API endpoint documentado
|