@polymorphism-tech/morph-spec 4.3.7 → 4.6.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/.morph/.morphversion +3 -3
- package/.morph/analytics/threads-log.jsonl +6 -9
- package/.morph/config/config.json +2 -3
- package/.morph/framework/standards/STANDARDS.json +812 -0
- package/.morph/{standards → framework/standards}/ai-agents/team-orchestration.md +3 -3
- package/.morph/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +17 -0
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
- package/.morph/{templates → framework/templates}/README.md +17 -17
- package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
- package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
- package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
- package/.morph/framework/templates/docs/clarifications.md +253 -0
- package/.morph/framework/templates/docs/onboarding.md +123 -0
- package/.morph/framework/templates/docs/schema-analysis.md +119 -0
- package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
- package/.morph/framework/templates/docs/ui-components.md +124 -0
- package/.morph/framework/templates/docs/ui-design-system.md +76 -0
- package/.morph/framework/templates/docs/ui-flows.md +167 -0
- package/.morph/framework/templates/docs/ui-mockups.md +98 -0
- package/.morph/framework/templates/docs/user-stories.md +34 -0
- package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
- package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
- package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
- package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
- package/.morph/logs/tool-failures.log +7 -0
- package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +16 -0
- package/.morph/state.json +1 -1
- package/CLAUDE.md +77 -155
- package/README.md +20 -18
- package/bin/detect-agents.js +1 -1
- package/bin/morph-spec.js +116 -266
- package/bin/task-manager.cjs +2 -2
- package/bin/validate.js +1 -1
- package/claude-plugin.json +14 -0
- package/docs/claude-alignment-report.md +137 -0
- package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
- package/docs/plans/2026-02-22-claude-settings.md +515 -0
- package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
- package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
- package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
- package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
- package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
- package/docs/plans/2026-02-22-native-enrichment.md +735 -0
- package/framework/CLAUDE.md +77 -0
- package/framework/{skills/level-2-domains → agents}/ai-agents/ai-system-architect.md +7 -3
- package/framework/{skills/level-2-domains → agents}/architecture/po-pm-advisor.md +7 -1
- package/framework/{skills/level-2-domains → agents}/architecture/prompt-engineer.md +7 -1
- package/framework/{skills/level-2-domains → agents}/architecture/seo-growth-hacker.md +7 -1
- package/framework/{skills/level-2-domains → agents}/architecture/standards-architect.md +10 -6
- package/framework/agents/backend/api-designer.md +103 -0
- package/framework/{skills/level-2-domains → agents}/backend/dotnet-senior.md +7 -1
- package/framework/agents/backend/ef-modeler.md +119 -0
- package/framework/{skills/level-2-domains → agents}/backend/hangfire-orchestrator.md +8 -4
- package/framework/{skills/level-2-domains → agents}/backend/ms-agent-expert.md +7 -3
- package/framework/{skills/level-2-domains → agents}/frontend/blazor-builder.md +7 -3
- package/framework/{skills/level-2-domains → agents}/frontend/nextjs-expert.md +7 -3
- package/framework/{skills/level-2-domains → agents}/frontend/ui-ux-designer.md +8 -2
- package/framework/{skills/level-2-domains → agents}/infrastructure/azure-architect.md +7 -1
- package/framework/{skills/level-2-domains → agents}/infrastructure/azure-deploy-specialist.md +7 -1
- package/framework/{skills/level-2-domains → agents}/infrastructure/bicep-architect.md +7 -3
- package/framework/{skills/level-2-domains → agents}/infrastructure/container-specialist.md +7 -3
- package/framework/{skills/level-2-domains → agents}/infrastructure/devops-engineer.md +7 -3
- package/framework/{skills/level-2-domains → agents}/integrations/asaas-financial.md +7 -3
- package/framework/{skills/level-2-domains → agents}/integrations/azure-identity.md +7 -3
- package/framework/{skills/level-2-domains → agents}/integrations/clerk-auth.md +7 -3
- package/framework/{skills/level-2-domains/integrations/hangfire-orchestrator.md → agents/integrations/hangfire-integration.md} +7 -1
- package/framework/{skills/level-2-domains → agents}/integrations/resend-email.md +7 -3
- package/framework/{skills/level-2-domains → agents}/quality/code-analyzer.md +9 -5
- package/framework/{skills/level-2-domains → agents}/quality/testing-specialist.md +7 -3
- package/framework/commands/morph-apply.md +9 -9
- package/framework/commands/morph-archive.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-proposal.md +9 -9
- package/framework/commands/morph-status.md +3 -3
- package/framework/commands/morph-troubleshoot.md +1 -1
- package/framework/hooks/README.md +201 -282
- package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
- package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
- package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
- package/framework/hooks/claude-code/statusline.py +538 -0
- package/framework/hooks/claude-code/statusline.sh +7 -0
- package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
- package/framework/hooks/shared/hook-response.js +45 -0
- package/framework/hooks/shared/phase-utils.js +129 -0
- package/framework/hooks/shared/state-reader.js +138 -0
- package/framework/hooks/shared/stdin-reader.js +26 -0
- package/framework/phases.json +145 -0
- package/framework/rules/csharp-standards.md +10 -0
- package/framework/rules/frontend-standards.md +14 -0
- package/framework/rules/infrastructure-standards.md +13 -0
- package/framework/rules/morph-workflow.md +86 -0
- package/framework/rules/testing-standards.md +11 -0
- package/framework/skills/README.md +66 -0
- package/framework/skills/level-0-meta/brainstorming/SKILL.md +135 -0
- package/framework/skills/level-0-meta/brainstorming/references/proposal-example.md +138 -0
- package/framework/skills/level-0-meta/{code-review.md → code-review/SKILL.md} +13 -4
- package/framework/skills/level-0-meta/code-review/references/review-example.md +164 -0
- package/framework/skills/level-0-meta/code-review/scripts/scan-csharp.mjs +121 -0
- package/framework/skills/level-0-meta/mcp-registry.json +207 -0
- package/framework/skills/level-0-meta/{morph-checklist.md → morph-checklist/SKILL.md} +8 -3
- package/framework/skills/{level-1-workflows/morph-replicate.md → level-0-meta/morph-replicate/SKILL.md} +13 -6
- package/framework/skills/level-0-meta/{simulation-checklist.md → simulation-checklist/SKILL.md} +9 -4
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +334 -0
- package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +147 -0
- package/framework/skills/level-0-meta/verification-before-completion/scripts/check-phase-outputs.mjs +110 -0
- package/framework/skills/level-1-workflows/{phase-clarify.md → phase-clarify/SKILL.md} +65 -4
- package/framework/skills/level-1-workflows/phase-clarify/references/clarifications-example.md +117 -0
- package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -0
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +303 -0
- package/framework/skills/level-1-workflows/phase-design/references/spec-example.md +253 -0
- package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -0
- package/framework/skills/level-1-workflows/phase-implement/references/recap-example.md +132 -0
- package/framework/skills/level-1-workflows/phase-setup/SKILL.md +171 -0
- package/framework/skills/level-1-workflows/{phase-tasks.md → phase-tasks/SKILL.md} +89 -7
- package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +231 -0
- package/framework/skills/level-1-workflows/phase-tasks/scripts/validate-tasks.mjs +112 -0
- package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -0
- package/framework/standards/STANDARDS.json +812 -0
- package/framework/standards/ai-agents/team-orchestration.md +3 -3
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
- package/framework/standards/integration/mcp/mcp-tools.md +384 -0
- package/framework/templates/README.md +17 -17
- package/framework/templates/REGISTRY.json +48 -233
- package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
- package/framework/templates/context/CONTEXT.md +3 -3
- package/framework/templates/docs/clarifications.md +253 -0
- package/framework/templates/docs/onboarding.md +123 -0
- package/framework/templates/docs/schema-analysis.md +119 -0
- package/framework/templates/docs/spec.md +149 -149
- package/framework/templates/docs/ui-components.md +124 -0
- package/framework/templates/docs/ui-design-system.md +76 -0
- package/framework/templates/docs/ui-flows.md +167 -0
- package/framework/templates/docs/ui-mockups.md +98 -0
- package/framework/templates/docs/user-stories.md +34 -0
- package/framework/templates/examples/spec-examples.md +1 -1
- package/framework/templates/infrastructure/github/README.md +11 -11
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
- package/framework/workflows/configs/express.json +45 -0
- package/framework/workflows/configs/spec-only.json +43 -0
- package/framework/workflows/docs/enforcement-pipeline.md +8 -8
- package/framework/workflows/docs/full-morph.md +3 -3
- package/package.json +3 -1
- package/scripts/generate-refs.js +336 -0
- package/scripts/generate-standards-registry.js +44 -0
- package/scripts/validate-real.mjs +255 -0
- package/src/commands/feature/create-story.js +362 -361
- package/src/commands/feature/shard-spec.js +225 -224
- package/src/commands/feature/sprint-status.js +1 -1
- package/src/commands/generation/generate-onboarding.js +169 -0
- package/src/commands/generation/generate.js +2 -2
- package/src/commands/mcp/mcp-setup.js +315 -0
- package/src/commands/project/changes.js +66 -0
- package/src/commands/project/checkpoint.js +209 -0
- package/src/commands/project/cost.js +179 -0
- package/src/commands/project/diff.js +278 -0
- package/src/commands/project/doctor.js +55 -7
- package/src/commands/project/init.js +318 -136
- package/src/commands/project/revert.js +173 -0
- package/src/commands/project/standards.js +80 -0
- package/src/commands/project/status.js +376 -0
- package/src/commands/project/update-agents.js +23 -0
- package/src/commands/project/update.js +60 -88
- package/src/commands/state/advance-phase.js +4 -3
- package/src/commands/state/state.js +10 -3
- package/src/commands/state/validate-phase.js +19 -2
- package/src/commands/templates/template-customize.js +4 -4
- package/src/commands/templates/template-render.js +1 -1
- package/src/commands/templates/template-show.js +1 -1
- package/src/commands/validation/validate-feature.js +359 -0
- package/src/core/orchestrator.js +3 -38
- package/src/core/paths/output-schema.js +135 -0
- package/src/core/state/state-manager.js +831 -592
- package/src/core/templates/template-registry.js +2 -2
- package/src/core/workflows/workflow-detector.js +17 -1
- package/src/lib/agents/micro-agent-factory.js +1 -1
- package/src/lib/context/context-bundler.js +2 -1
- package/src/lib/detectors/claude-config-detector.js +390 -0
- package/src/lib/detectors/conversation-analyzer.js +4 -4
- package/src/lib/detectors/design-system-detector.js +6 -5
- package/src/lib/detectors/standards-generator.js +2 -2
- package/src/lib/generators/context-generator.js +539 -538
- package/src/lib/generators/recap-generator.js +1 -1
- package/src/lib/generators/settings-generator.js +210 -0
- package/src/lib/hooks/hook-executor.js +1 -1
- package/src/lib/installers/mcp-installer.js +299 -0
- package/src/lib/learning/learning-system.js +3 -3
- package/src/lib/orchestration/team-orchestrator.js +1 -1
- package/src/lib/standards/standards-context-injector.js +7 -7
- package/src/lib/threads/thread-coordinator.js +1 -1
- package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
- package/src/lib/validators/design-system/design-system-validator.js +1 -1
- package/src/lib/validators/spec-validator.js +258 -258
- package/src/lib/validators/validation-runner.js +270 -269
- package/src/utils/agents-installer.js +206 -0
- package/src/utils/claude-settings-manager.js +258 -0
- package/src/utils/file-copier.js +1 -1
- package/src/utils/hooks-installer.js +354 -28
- package/src/utils/skills-installer.js +118 -0
- package/.morph/project/context/README.md +0 -17
- package/.morph/project/context/detection-log.md +0 -16
- package/.morph/project/standards/inferred.md +0 -59
- package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
- package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
- package/framework/hooks/agent-stop/validate-tests.js +0 -109
- package/framework/hooks/agent-teams/dispatch.js +0 -67
- package/framework/hooks/agent-teams/phase-advanced.js +0 -80
- package/framework/hooks/agent-teams/task-completed.js +0 -76
- package/framework/hooks/agent-teams/teammate-idle.js +0 -70
- package/framework/skills/level-1-workflows/phase-design.md +0 -213
- package/framework/skills/level-1-workflows/phase-setup.md +0 -106
- package/framework/skills/level-1-workflows/phase-uiux.md +0 -169
- package/framework/skills/level-2-domains/backend/api-designer.md +0 -59
- package/framework/skills/level-2-domains/backend/ef-modeler.md +0 -58
- package/framework/skills/level-3-technologies/README.md +0 -7
- package/framework/skills/level-4-patterns/README.md +0 -7
- package/src/commands/agents/agents-fuse.js +0 -97
- package/src/commands/agents/micro-agent.js +0 -112
- package/src/commands/agents/spawn-team.js +0 -237
- package/src/commands/agents/squad-template.js +0 -146
- package/src/commands/analytics/analytics.js +0 -176
- package/src/commands/context/context-prime.js +0 -63
- package/src/commands/context/core-four.js +0 -54
- package/src/commands/generation/generate-context.js +0 -40
- package/src/commands/project/detect-agents.js +0 -207
- package/src/commands/project/detect-workflow.js +0 -174
- package/src/commands/threads/thread-template.js +0 -103
- package/src/commands/threads/threads.js +0 -261
- package/src/commands/utils/session-summary.js +0 -291
- package/src/llm/analyzer.js +0 -215
- package/src/llm/few-shot-examples.js +0 -216
- package/src/llm/project-config-schema.json +0 -188
- package/src/llm/prompt-builder.js +0 -96
- /package/.morph/{config → framework}/agents.json +0 -0
- /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
- /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
- /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
- /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
- /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
- /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
- /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
- /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
- /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
- /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
- /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
- /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
- /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
- /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
- /package/.morph/{standards → framework/standards}/core/git.md +0 -0
- /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
- /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
- /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
- /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
- /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
- /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
- /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
- /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
- /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
- /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
- /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
- /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
- /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
- /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
- /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
- /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
- /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
- /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
- /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
- /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
- /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
- /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
- /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
- /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
- /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
- /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
- /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
- /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
- /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
- /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
- /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
- /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
- /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
- /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
- /package/.morph/{templates → framework/templates}/state.template.json +0 -0
- /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
- /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
- /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
- /package/framework/{skills/level-2-domains → agents}/README.md +0 -0
- /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
- /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
- /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
- /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
- /package/framework/hooks/{pre-push → git/pre-push}/run-tests.sh +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# MORPH-SPEC Workflow Rules
|
|
2
|
+
|
|
3
|
+
> Always-active rules for all MORPH-SPEC managed projects.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Spec-First Mandate
|
|
8
|
+
|
|
9
|
+
**NEVER skip to code without a specification.** Every feature must progress through phases:
|
|
10
|
+
|
|
11
|
+
1. **Proposal** — User story + acceptance criteria (`0-proposal/proposal.md`)
|
|
12
|
+
2. **Design** — Technical spec + C# contracts + decisions (`1-design/`)
|
|
13
|
+
3. **Tasks** — Atomic task list (`3-tasks/tasks.md`)
|
|
14
|
+
4. **Implement** — Code + recap (`4-implement/recap.md`)
|
|
15
|
+
|
|
16
|
+
UI-heavy features also include **UI/UX** phase (`2-ui/`) between Design and Tasks.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Phase Commands
|
|
21
|
+
|
|
22
|
+
| Command | Purpose |
|
|
23
|
+
|---------|---------|
|
|
24
|
+
| `/morph-proposal {feature}` | Full spec pipeline (phases 1–4, pauses for approval) |
|
|
25
|
+
| `/morph-apply {feature}` | Implement feature (phase 5) |
|
|
26
|
+
| `/morph-status` | Feature dashboard |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Output Paths
|
|
31
|
+
|
|
32
|
+
All outputs go in `.morph/features/{feature}/`:
|
|
33
|
+
|
|
34
|
+
| Phase | Path |
|
|
35
|
+
|-------|------|
|
|
36
|
+
| Proposal | `0-proposal/proposal.md` |
|
|
37
|
+
| Spec | `1-design/spec.md` |
|
|
38
|
+
| Contracts | `1-design/contracts.cs` |
|
|
39
|
+
| Decisions | `1-design/decisions.md` |
|
|
40
|
+
| UI Design | `2-ui/design-system.md`, `mockups.md`, `components.md`, `flows.md` |
|
|
41
|
+
| Tasks | `3-tasks/tasks.md` |
|
|
42
|
+
| Recap | `4-implement/recap.md` |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Checkpoints
|
|
47
|
+
|
|
48
|
+
Run a checkpoint every 3 completed tasks:
|
|
49
|
+
- Validate architecture compliance
|
|
50
|
+
- Check package versions
|
|
51
|
+
- Scan for security issues
|
|
52
|
+
- Verify design system adherence (UI features)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Approval Gates
|
|
57
|
+
|
|
58
|
+
**Design Gate:** Before moving from Design → Tasks, spec must be approved.
|
|
59
|
+
**Implementation Gate:** Before starting implementation, task list must be approved.
|
|
60
|
+
|
|
61
|
+
Check approval status: `morph-spec state show {feature}`
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Protected Files
|
|
66
|
+
|
|
67
|
+
**NEVER directly edit:**
|
|
68
|
+
- `.morph/state.json` — Managed by CLI only
|
|
69
|
+
- `.morph/framework/**` — Read-only framework content
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Test File Policy
|
|
74
|
+
|
|
75
|
+
When a test fails, always follow this order:
|
|
76
|
+
|
|
77
|
+
1. **Analyze first** — determine if the IMPLEMENTATION is wrong or the TEST SPEC is wrong
|
|
78
|
+
2. **Fix implementation first** — the test is the spec; trust it by default
|
|
79
|
+
3. **Only modify a test file if the test expectation itself is incorrect** — wrong expected value, wrong behavior modeled
|
|
80
|
+
4. **Before modifying any test file, explain WHY the test spec is wrong** — what the correct behavior is and why the test doesn't model it
|
|
81
|
+
|
|
82
|
+
Do not modify test files to make a failing test pass when the implementation is the actual problem.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# MORPH-SPEC Skills
|
|
2
|
+
|
|
3
|
+
Skills installed to `.claude/skills/` during `morph-spec init` (or `morph-spec update`).
|
|
4
|
+
|
|
5
|
+
Each skill is a directory: `{name}/SKILL.md` + optional `scripts/`, `references/`, `assets/`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## level-0-meta — Utilities & Meta-Skills
|
|
10
|
+
|
|
11
|
+
| Skill | Description |
|
|
12
|
+
|-------|-------------|
|
|
13
|
+
| `tool-usage-guide` | Tool selection flowchart — which tool for which action |
|
|
14
|
+
| `morph-checklist` | Pre-session checklist for MORPH-SPEC projects |
|
|
15
|
+
| `simulation-checklist` | Checklist for AI simulation / prompt testing |
|
|
16
|
+
| `brainstorming` | Collaborative ideation → spec via dialogue |
|
|
17
|
+
| `verification-before-completion` | Gate check before marking any work done |
|
|
18
|
+
| `code-review` | .NET/C# review checklist (naming, arch, async, DI, DTOs) |
|
|
19
|
+
| `morph-replicate` | Convert HTML prototypes to Blazor components |
|
|
20
|
+
|
|
21
|
+
### level-0-meta extras
|
|
22
|
+
|
|
23
|
+
| Skill | File | Purpose |
|
|
24
|
+
|-------|------|---------|
|
|
25
|
+
| `brainstorming` | `references/proposal-example.md` | Filled-in proposal.md example |
|
|
26
|
+
| `verification-before-completion` | `scripts/check-phase-outputs.mjs` | Validate required phase outputs exist |
|
|
27
|
+
| `code-review` | `references/review-example.md` | Filled-in review with finding format |
|
|
28
|
+
| `code-review` | `scripts/scan-csharp.mjs` | Scan .cs files for CRITICAL/HIGH violations |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## level-1-workflows — Phase Workflow Skills
|
|
33
|
+
|
|
34
|
+
Invoked internally by `/morph-proposal` and `/morph-apply`. Not user-invocable.
|
|
35
|
+
|
|
36
|
+
| Skill | Phase | Description |
|
|
37
|
+
|-------|-------|-------------|
|
|
38
|
+
| `phase-codebase-analysis` | 0 | Analyse existing codebase before design |
|
|
39
|
+
| `phase-setup` | 1 | Project scaffolding and initial setup |
|
|
40
|
+
| `phase-design` | 2 | Technical spec + contracts + decisions |
|
|
41
|
+
| `phase-uiux` | 3 | UI/UX design system + mockups + components |
|
|
42
|
+
| `phase-clarify` | 4 | Clarification questions → edge cases → spec update |
|
|
43
|
+
| `phase-tasks` | 5 | Break spec into ordered task list (tasks.md) |
|
|
44
|
+
| `phase-implement` | 6 | Implement tasks with TDD + checkpoints + recap |
|
|
45
|
+
|
|
46
|
+
### level-1-workflows extras
|
|
47
|
+
|
|
48
|
+
| Skill | File | Purpose |
|
|
49
|
+
|-------|------|---------|
|
|
50
|
+
| `phase-design` | `references/spec-example.md` | Filled-in spec.md example |
|
|
51
|
+
| `phase-clarify` | `references/clarifications-example.md` | Filled-in clarifications Q&A |
|
|
52
|
+
| `phase-tasks` | `references/tasks-example.md` | Filled-in tasks.md with T### format |
|
|
53
|
+
| `phase-tasks` | `scripts/validate-tasks.mjs` | Validate tasks.md structure and IDs |
|
|
54
|
+
| `phase-implement` | `references/recap-example.md` | Filled-in recap.md example |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Domain Agents
|
|
59
|
+
|
|
60
|
+
Domain specialist agents (`framework/agents/`) are installed separately as `.claude/agents/morph-domain-{name}.md` — they are subagents, not skills.
|
|
61
|
+
|
|
62
|
+
See `framework/agents/README.md` for the full list.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brainstorming
|
|
3
|
+
description: Morph-spec-aware brainstorming that loads project context, explores multiple design approaches, asks clarifying questions, and produces proposal.md or decisions.md. Use before designing a feature, when facing architectural decisions with multiple valid approaches, or when a feature needs requirements exploration before committing to a direction.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Brainstorming — MORPH-SPEC Integrated
|
|
7
|
+
|
|
8
|
+
> Explore context, ask questions, generate multiple approaches, and produce a design document before committing to implementation.
|
|
9
|
+
>
|
|
10
|
+
> **Example:** `references/proposal-example.md` — filled-in proposal.md showing expected quality.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- **Phase 0 (Proposal):** Explore the feature request before writing `proposal.md`
|
|
15
|
+
- **Phase 2 (Design):** Explore architectural alternatives before writing `spec.md`
|
|
16
|
+
- **Any phase:** When facing a decision with multiple valid approaches
|
|
17
|
+
|
|
18
|
+
## Prerequisites
|
|
19
|
+
|
|
20
|
+
Before brainstorming, load project context:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Load current state
|
|
24
|
+
npx morph-spec state get {feature-name}
|
|
25
|
+
|
|
26
|
+
# Read project config
|
|
27
|
+
Read: .morph/config/config.json
|
|
28
|
+
|
|
29
|
+
# Read existing proposal (if Phase 2)
|
|
30
|
+
Read: .morph/features/{feature}/0-proposal/proposal.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Workflow
|
|
36
|
+
|
|
37
|
+
### Step 1: Explore Context
|
|
38
|
+
|
|
39
|
+
**Gather information before generating ideas:**
|
|
40
|
+
|
|
41
|
+
1. **Read state.json** — current phase, active agents, existing outputs
|
|
42
|
+
2. **Read config.json** — stack, architecture, project name
|
|
43
|
+
3. **Read existing outputs** — proposal.md, spec.md (if they exist)
|
|
44
|
+
4. **Scan codebase** — use Glob/Grep to understand existing patterns
|
|
45
|
+
5. **Check integrations.json** — available MCPs and plugins
|
|
46
|
+
|
|
47
|
+
**Use MCP tools when available:**
|
|
48
|
+
- **Context7** → look up library capabilities relevant to the feature
|
|
49
|
+
- **Supabase** → check existing schema for data-related features
|
|
50
|
+
- **GitHub** → check existing issues/PRs for related work
|
|
51
|
+
|
|
52
|
+
### Step 2: Ask Clarifying Questions
|
|
53
|
+
|
|
54
|
+
Generate **3-5 focused questions** for the user:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
### Q1: Scope
|
|
58
|
+
What is the minimum viable version of this feature?
|
|
59
|
+
|
|
60
|
+
### Q2: Constraints
|
|
61
|
+
Are there performance/budget/timeline constraints?
|
|
62
|
+
|
|
63
|
+
### Q3: Integration
|
|
64
|
+
Does this need to integrate with existing features?
|
|
65
|
+
|
|
66
|
+
### Q4: Users
|
|
67
|
+
Who are the primary users of this feature?
|
|
68
|
+
|
|
69
|
+
### Q5: Success Criteria
|
|
70
|
+
How will we know this feature is working correctly?
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Wait for user responses before proceeding.**
|
|
74
|
+
|
|
75
|
+
### Step 3: Generate 2-3 Approaches
|
|
76
|
+
|
|
77
|
+
For each approach, document:
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
## Approach A: {Name}
|
|
81
|
+
|
|
82
|
+
**Description:** {1-2 sentences}
|
|
83
|
+
|
|
84
|
+
**Pros:**
|
|
85
|
+
- Pro 1
|
|
86
|
+
- Pro 2
|
|
87
|
+
|
|
88
|
+
**Cons:**
|
|
89
|
+
- Con 1
|
|
90
|
+
- Con 2
|
|
91
|
+
|
|
92
|
+
**Complexity:** Low / Medium / High
|
|
93
|
+
**Estimated Tasks:** ~N
|
|
94
|
+
**Key Dependencies:** {list}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Step 4: Recommend and Document
|
|
98
|
+
|
|
99
|
+
1. **Recommend** the best approach with reasoning
|
|
100
|
+
2. **Write output** to the appropriate location:
|
|
101
|
+
- Phase 0 → render `docs/proposal` template → `.morph/features/{feature}/0-proposal/proposal.md`
|
|
102
|
+
- Phase 2 → document in `decisions.md` as an ADR
|
|
103
|
+
|
|
104
|
+
3. **Update state:**
|
|
105
|
+
```bash
|
|
106
|
+
npx morph-spec state mark-output {feature-name} proposal # Phase 0
|
|
107
|
+
npx morph-spec state mark-output {feature-name} decisions # Phase 2
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Integration with Superpowers
|
|
113
|
+
|
|
114
|
+
> Available when the `superpowers` plugin is installed.
|
|
115
|
+
|
|
116
|
+
This skill replaces `superpowers:brainstorming` within morph-spec workflows. It adds:
|
|
117
|
+
- Automatic context loading from `.morph/` state and config
|
|
118
|
+
- Template rendering for outputs (proposal.md, decisions.md)
|
|
119
|
+
- State tracking via `morph-spec state mark-output`
|
|
120
|
+
- MCP integration for research (Context7, Supabase)
|
|
121
|
+
|
|
122
|
+
For brainstorming **outside** morph-spec workflows, the original `superpowers:brainstorming` skill remains available.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Anti-patterns
|
|
127
|
+
|
|
128
|
+
- Never skip brainstorming for features with multiple valid approaches
|
|
129
|
+
- Never commit to an approach without documenting alternatives
|
|
130
|
+
- Never brainstorm without loading project context first
|
|
131
|
+
- Never write code before completing the brainstorming output
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Feature Proposal: Photo Processing Pipeline
|
|
2
|
+
|
|
3
|
+
> Example of a well-structured proposal.md. This is a filled-in reference — not a template.
|
|
4
|
+
|
|
5
|
+
## Metadata
|
|
6
|
+
|
|
7
|
+
| Field | Value |
|
|
8
|
+
|-------|-------|
|
|
9
|
+
| **Proposed** | 2025-01-15 |
|
|
10
|
+
| **Author** | Product Team |
|
|
11
|
+
| **Status** | Approved |
|
|
12
|
+
| **Priority** | High |
|
|
13
|
+
| **Stack** | blazor-azure |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
Users currently cannot upload photos for AI-based transformations because no upload infrastructure exists. This feature adds an end-to-end photo upload, processing, and delivery pipeline using Azure Blob Storage and Hangfire background jobs.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Problem Statement
|
|
24
|
+
|
|
25
|
+
### What is the problem?
|
|
26
|
+
|
|
27
|
+
Users cannot submit photos for AI transformation, blocking the core product value proposition. The system has no file upload capability, no background processing queue, and no way to notify users when processing completes.
|
|
28
|
+
|
|
29
|
+
### Who is affected?
|
|
30
|
+
|
|
31
|
+
All end users who want to use the photo transformation feature — the primary user journey is completely unavailable.
|
|
32
|
+
|
|
33
|
+
### What is the impact?
|
|
34
|
+
|
|
35
|
+
- User productivity loss: 100% of core use case unavailable
|
|
36
|
+
- Revenue impact: Feature is the primary paid tier differentiator
|
|
37
|
+
- User satisfaction: Can't demo product to prospects
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Proposed Solution
|
|
42
|
+
|
|
43
|
+
### Overview
|
|
44
|
+
|
|
45
|
+
A multi-step pipeline: user uploads a photo via a Blazor form → the file is stored in Azure Blob Storage → a Hangfire background job is queued for AI processing → the user polls for completion → the processed photo is returned via a download link.
|
|
46
|
+
|
|
47
|
+
### Key Features
|
|
48
|
+
|
|
49
|
+
1. **Upload endpoint** — Validates file type/size, stores in Azure Blob
|
|
50
|
+
2. **Background processing** — Hangfire job calls AI API, stores result in Blob
|
|
51
|
+
3. **Status polling** — User sees real-time progress (Pending → Processing → Completed)
|
|
52
|
+
|
|
53
|
+
### User Journey
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
1. User selects a photo file on the upload page
|
|
57
|
+
2. System validates (max 10MB, .jpg/.png only) and shows preview
|
|
58
|
+
3. User clicks "Upload" → system enqueues job, redirects to /processing/{jobId}
|
|
59
|
+
4. User sees progress bar polling every 5 seconds
|
|
60
|
+
5. On completion: "Download" button appears, user gets processed photo
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Success Metrics
|
|
66
|
+
|
|
67
|
+
| Metric | Current | Target |
|
|
68
|
+
|--------|---------|--------|
|
|
69
|
+
| Upload success rate | N/A | >99% |
|
|
70
|
+
| Processing time (p95) | N/A | <120s |
|
|
71
|
+
| Error recovery rate | N/A | >95% (auto-retry) |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Scope
|
|
76
|
+
|
|
77
|
+
### In Scope
|
|
78
|
+
|
|
79
|
+
- Photo upload (Blazor form, Azure Blob Storage)
|
|
80
|
+
- Background processing via Hangfire
|
|
81
|
+
- Status polling page with progress indicator
|
|
82
|
+
- Download link for processed photo
|
|
83
|
+
- Basic error handling and retry logic
|
|
84
|
+
|
|
85
|
+
### Out of Scope
|
|
86
|
+
|
|
87
|
+
- Batch uploads (multiple photos at once)
|
|
88
|
+
- Email notifications when processing completes
|
|
89
|
+
- Photo editing before upload (crop, resize)
|
|
90
|
+
|
|
91
|
+
### Future Considerations
|
|
92
|
+
|
|
93
|
+
- Webhooks for external integrations
|
|
94
|
+
- Processing history and gallery view
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Risks & Concerns
|
|
99
|
+
|
|
100
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
101
|
+
|------|------------|--------|------------|
|
|
102
|
+
| AI API unavailable | Medium | High | Retry with exponential backoff, fallback error state |
|
|
103
|
+
| Large file upload timeout | Low | Medium | Chunked upload or presigned URL direct to Blob |
|
|
104
|
+
| Blob storage costs unexpectedly high | Low | Low | Set blob lifecycle policy (auto-delete after 30 days) |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Estimated Effort
|
|
109
|
+
|
|
110
|
+
| Phase | Estimate |
|
|
111
|
+
|-------|----------|
|
|
112
|
+
| Design & Spec | 2h |
|
|
113
|
+
| Implementation | 6h |
|
|
114
|
+
| Testing | 2h |
|
|
115
|
+
| **Total** | **10h** |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Questions & Clarifications
|
|
120
|
+
|
|
121
|
+
1. Maximum file size: 10MB or higher for pro users?
|
|
122
|
+
2. Should processed photos be kept indefinitely or expire after 30 days?
|
|
123
|
+
3. Does the AI API support async webhooks or only polling?
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Next Steps
|
|
128
|
+
|
|
129
|
+
Once approved:
|
|
130
|
+
1. Create detailed `spec.md` with technical design
|
|
131
|
+
2. Define contracts in `contracts.cs`
|
|
132
|
+
3. Record decisions in `decisions.md`
|
|
133
|
+
4. Break down into `tasks.md`
|
|
134
|
+
5. Begin implementation
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: .NET/C# code review checklist covering naming conventions, architecture layer integrity, async patterns, logging, error handling, DI lifetimes, and DTO contracts. Use after implementing .NET code, before creating PRs, or when reviewing C# code for compliance with MORPH-SPEC standards.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
6
|
+
---
|
|
7
|
+
|
|
1
8
|
# Code Review Checklist
|
|
2
9
|
|
|
3
10
|
> Comprehensive checklist for .NET code review: naming, architecture, clean code, duplication, and runtime patterns.
|
|
4
|
-
> **Ref:** `framework/standards/coding.md` for naming conventions and style.
|
|
5
|
-
> **Ref:** `framework/standards/architecture.md` for layer rules and SOLID.
|
|
6
|
-
> **Ref:** `framework/standards/
|
|
11
|
+
> **Ref:** `framework/standards/core/coding.md` for naming conventions and style.
|
|
12
|
+
> **Ref:** `framework/standards/core/architecture.md` for layer rules and SOLID.
|
|
13
|
+
> **Ref:** `framework/standards/backend/database/ef-core.md` for DbContext patterns and background ops.
|
|
14
|
+
> **Example:** `references/review-example.md` — filled-in review showing expected finding format and severity levels.
|
|
15
|
+
> **Script:** `scripts/scan-csharp.mjs` — automated scan for CRITICAL/HIGH violations before manual review.
|
|
7
16
|
|
|
8
17
|
---
|
|
9
18
|
|
|
@@ -223,4 +232,4 @@ public enum OrderStatus
|
|
|
223
232
|
---
|
|
224
233
|
|
|
225
234
|
*Consolidated from: code-review-services.md + code-review-background.md + code-review-contracts.md + architecture/clean-code/duplication analysis.*
|
|
226
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
235
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Code Review Report — Photo Processing Pipeline
|
|
2
|
+
|
|
3
|
+
> Example of a well-structured code review output. Filled-in reference — not a template.
|
|
4
|
+
|
|
5
|
+
**Scope:** `src/Application/PhotoProcessing/` + `src/Web/Endpoints/PhotoProcessingEndpoints.cs`
|
|
6
|
+
**Date:** 2025-01-22
|
|
7
|
+
**Reviewer:** code-review skill
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Findings by Severity
|
|
12
|
+
|
|
13
|
+
| Severity | Count |
|
|
14
|
+
|----------|-------|
|
|
15
|
+
| CRITICAL | 1 |
|
|
16
|
+
| HIGH | 2 |
|
|
17
|
+
| MEDIUM | 2 |
|
|
18
|
+
| LOW | 1 |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
### [CRITICAL] Naming: UPPER_SNAKE_CASE constant
|
|
23
|
+
|
|
24
|
+
**File:** `src/Application/PhotoProcessing/PhotoProcessingService.cs:14`
|
|
25
|
+
|
|
26
|
+
**Current code:**
|
|
27
|
+
```csharp
|
|
28
|
+
private const int MAX_RETRY_COUNT = 3;
|
|
29
|
+
private const int DEFAULT_TIMEOUT_SECONDS = 30;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Suggested fix:**
|
|
33
|
+
```csharp
|
|
34
|
+
private const int MaxRetryCount = 3;
|
|
35
|
+
private const int DefaultTimeoutSeconds = 30;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Why:** `ALL_CAPS` constants violate C# conventions (§ coding.md). Pascal case is the .NET standard.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### [HIGH] Async: Missing CancellationToken propagation
|
|
43
|
+
|
|
44
|
+
**File:** `src/Infrastructure/Storage/AzureBlobStorageService.cs:28`
|
|
45
|
+
|
|
46
|
+
**Current code:**
|
|
47
|
+
```csharp
|
|
48
|
+
public async Task<string> UploadAsync(Stream content, string blobName)
|
|
49
|
+
{
|
|
50
|
+
var blobClient = _containerClient.GetBlobClient(blobName);
|
|
51
|
+
await blobClient.UploadAsync(content); // no CT
|
|
52
|
+
return blobClient.Uri.ToString();
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Suggested fix:**
|
|
57
|
+
```csharp
|
|
58
|
+
public async Task<string> UploadAsync(Stream content, string blobName, CancellationToken ct = default)
|
|
59
|
+
{
|
|
60
|
+
var blobClient = _containerClient.GetBlobClient(blobName);
|
|
61
|
+
await blobClient.UploadAsync(content, cancellationToken: ct);
|
|
62
|
+
return blobClient.Uri.ToString();
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Why:** Cancellation cannot propagate into the Blob SDK call, meaning a cancelled HTTP request still holds the upload open.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### [HIGH] Logging: String interpolation in ILogger call
|
|
71
|
+
|
|
72
|
+
**File:** `src/Application/PhotoProcessing/PhotoProcessingJob.cs:52`
|
|
73
|
+
|
|
74
|
+
**Current code:**
|
|
75
|
+
```csharp
|
|
76
|
+
_logger.LogError($"Job {jobId} failed after {retryCount} retries: {ex.Message}");
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Suggested fix:**
|
|
80
|
+
```csharp
|
|
81
|
+
_logger.LogError("Job {JobId} failed after {RetryCount} retries: {ErrorMessage}",
|
|
82
|
+
jobId, retryCount, ex.Message);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Why:** String interpolation allocates eagerly even if the log level is filtered. Message templates are structured and queryable in Application Insights / Seq.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### [MEDIUM] Architecture: Controller logic exceeds 50 lines
|
|
90
|
+
|
|
91
|
+
**File:** `src/Web/Endpoints/PhotoProcessingEndpoints.cs`
|
|
92
|
+
|
|
93
|
+
**Issue:** The upload endpoint inline lambda is 60+ lines — includes validation, service call, response mapping, and error handling all inline.
|
|
94
|
+
|
|
95
|
+
**Suggested fix:** Extract a `UploadPhotoRequestHandler` or move validation to a FluentValidation `IValidator<UploadPhotoCommand>`. The endpoint lambda should be < 10 lines.
|
|
96
|
+
|
|
97
|
+
**Why:** Fat endpoints are hard to test and violate the "thin API layer" rule (§ architecture.md).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### [MEDIUM] Error Handling: Generic catch without context
|
|
102
|
+
|
|
103
|
+
**File:** `src/Application/PhotoProcessing/PhotoProcessingService.cs:89`
|
|
104
|
+
|
|
105
|
+
**Current code:**
|
|
106
|
+
```csharp
|
|
107
|
+
catch (Exception ex)
|
|
108
|
+
{
|
|
109
|
+
_logger.LogError(ex, "Upload failed");
|
|
110
|
+
throw;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Suggested fix:**
|
|
115
|
+
```csharp
|
|
116
|
+
catch (Exception ex)
|
|
117
|
+
{
|
|
118
|
+
_logger.LogError(ex, "Upload failed for user {UserId}", userId);
|
|
119
|
+
throw;
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Why:** Log entries without correlation IDs (UserId, JobId) are unqueryable in production. Always include the relevant entity ID.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### [LOW] Dead Code: Unused private method
|
|
128
|
+
|
|
129
|
+
**File:** `src/Application/PhotoProcessing/PhotoProcessingService.cs:110`
|
|
130
|
+
|
|
131
|
+
**Current code:**
|
|
132
|
+
```csharp
|
|
133
|
+
private string BuildBlobPath(Guid jobId, string suffix)
|
|
134
|
+
=> $"uploads/{jobId}/{suffix}";
|
|
135
|
+
// Called 0 times — path built inline everywhere
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Suggested fix:** Either use `BuildBlobPath` consistently or delete it.
|
|
139
|
+
|
|
140
|
+
**Why:** Dead code misleads future readers and increases maintenance surface.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Top Priorities
|
|
145
|
+
|
|
146
|
+
1. `PhotoProcessingService.cs:14` — CRITICAL naming violation (5 min fix)
|
|
147
|
+
2. `AzureBlobStorageService.cs:28` — HIGH missing CancellationToken (10 min fix)
|
|
148
|
+
3. `PhotoProcessingJob.cs:52` — HIGH structured logging (5 min fix)
|
|
149
|
+
4. `PhotoProcessingEndpoints.cs` — MEDIUM endpoint refactor (30 min)
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Passed Checks ✅
|
|
154
|
+
|
|
155
|
+
- Layer integrity: Domain has no Infrastructure references
|
|
156
|
+
- All async methods have `Async` suffix
|
|
157
|
+
- Private fields use `_camelCase`
|
|
158
|
+
- No hardcoded connection strings or secrets
|
|
159
|
+
- External services accessed through interfaces (`IBlobStorageService`, `IPhotoProcessingJob`)
|
|
160
|
+
- `ProcessingJob` entity uses private setters + domain methods
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
*MORPH-SPEC by Polymorphism Tech*
|