@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,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* UserPromptSubmit Hook: Enrich User Prompts with Context
|
|
5
|
+
*
|
|
6
|
+
* Event: UserPromptSubmit
|
|
7
|
+
*
|
|
8
|
+
* Scans user prompt for morph-spec keywords and injects relevant context:
|
|
9
|
+
* - Feature name mentioned → inject its current status/phase
|
|
10
|
+
* - "implement"/"code" while not in implement phase → warn about wrong phase
|
|
11
|
+
* - "approve"/"looks good" → inject approval command syntax
|
|
12
|
+
* - "next task" → inject current task list
|
|
13
|
+
*
|
|
14
|
+
* Fail-open: exits 0 on any error.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { readStdin } from '../../shared/stdin-reader.js';
|
|
18
|
+
import { stateExists, loadState, getActiveFeature, getFeature, getPendingGates } from '../../shared/state-reader.js';
|
|
19
|
+
import { injectContext, pass } from '../../shared/hook-response.js';
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
if (!stateExists()) pass();
|
|
23
|
+
|
|
24
|
+
const payload = await readStdin();
|
|
25
|
+
if (!payload) pass();
|
|
26
|
+
|
|
27
|
+
const userPrompt = payload?.user_prompt || payload?.content || '';
|
|
28
|
+
if (!userPrompt || userPrompt.length < 3) pass();
|
|
29
|
+
|
|
30
|
+
const promptLower = userPrompt.toLowerCase();
|
|
31
|
+
const state = loadState();
|
|
32
|
+
if (!state?.features) pass();
|
|
33
|
+
|
|
34
|
+
const context = [];
|
|
35
|
+
|
|
36
|
+
// Check if a feature name is mentioned
|
|
37
|
+
for (const [featureName, feature] of Object.entries(state.features)) {
|
|
38
|
+
if (promptLower.includes(featureName.toLowerCase())) {
|
|
39
|
+
context.push(`[morph-spec] Feature '${featureName}': phase=${feature.phase}, status=${feature.status}`);
|
|
40
|
+
if (feature.tasks?.total > 0) {
|
|
41
|
+
context.push(` Tasks: ${feature.tasks.completed || 0}/${feature.tasks.total} completed`);
|
|
42
|
+
}
|
|
43
|
+
break; // Only inject for the first matched feature
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Check for implement/code intent while not in implement phase
|
|
48
|
+
const active = getActiveFeature();
|
|
49
|
+
if (active) {
|
|
50
|
+
const { name, feature } = active;
|
|
51
|
+
|
|
52
|
+
const codeKeywords = ['implement', 'code', 'start coding', 'write the code', 'build it', 'let\'s build'];
|
|
53
|
+
const wantsToCode = codeKeywords.some(kw => promptLower.includes(kw));
|
|
54
|
+
|
|
55
|
+
if (wantsToCode && feature.phase !== 'implement' && feature.phase !== 'sync') {
|
|
56
|
+
context.push(
|
|
57
|
+
`[morph-spec] WARNING: Feature '${name}' is in '${feature.phase}' phase, not 'implement'.` +
|
|
58
|
+
` Complete the current phase first or advance: morph-spec phase advance ${name}`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Check for approval intent
|
|
63
|
+
const approvalKeywords = ['approve', 'approved', 'looks good', 'lgtm', 'ship it'];
|
|
64
|
+
const wantsToApprove = approvalKeywords.some(kw => promptLower.includes(kw));
|
|
65
|
+
|
|
66
|
+
if (wantsToApprove) {
|
|
67
|
+
const pending = getPendingGates(name);
|
|
68
|
+
if (pending.length > 0) {
|
|
69
|
+
context.push(
|
|
70
|
+
`[morph-spec] To approve, use: morph-spec approve ${name} ${pending[0]}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Check for "next task" intent
|
|
76
|
+
if (promptLower.includes('next task') || promptLower.includes('what\'s next')) {
|
|
77
|
+
if (feature.phase === 'implement') {
|
|
78
|
+
context.push(
|
|
79
|
+
`[morph-spec] Use: morph-spec task next ${name}`
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (context.length === 0) pass();
|
|
86
|
+
|
|
87
|
+
injectContext(context.join('\n'));
|
|
88
|
+
} catch {
|
|
89
|
+
// Fail-open
|
|
90
|
+
process.exit(0);
|
|
91
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared hook response builders for Claude Code hooks.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code hooks communicate via JSON to stdout.
|
|
5
|
+
* - PreToolUse: { "decision": "block"|"approve", "reason": "..." }
|
|
6
|
+
* - SessionStart/Stop/etc: { "additionalContext": "..." }
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Block a tool use with a reason.
|
|
11
|
+
* @param {string} reason - Human-readable reason for blocking
|
|
12
|
+
*/
|
|
13
|
+
export function block(reason) {
|
|
14
|
+
console.log(JSON.stringify({ decision: 'block', reason }));
|
|
15
|
+
process.exit(0);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Approve a tool use, optionally injecting context.
|
|
20
|
+
* @param {string} [context] - Additional context to inject
|
|
21
|
+
*/
|
|
22
|
+
export function approve(context) {
|
|
23
|
+
if (context) {
|
|
24
|
+
console.log(JSON.stringify({ decision: 'approve', additionalContext: context }));
|
|
25
|
+
}
|
|
26
|
+
// No output = implicit approve
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Inject additional context (for SessionStart, Stop, UserPromptSubmit, etc.).
|
|
32
|
+
* @param {string} text - Context text to inject
|
|
33
|
+
* @param {Object} [extra] - Additional fields to include in response
|
|
34
|
+
*/
|
|
35
|
+
export function injectContext(text, extra = {}) {
|
|
36
|
+
console.log(JSON.stringify({ additionalContext: text, ...extra }));
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Silent exit — no output, no blocking.
|
|
42
|
+
*/
|
|
43
|
+
export function pass() {
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// GENERATED by scripts/generate-refs.js — DO NOT EDIT manually
|
|
2
|
+
// Source of truth: src/core/paths/output-schema.js
|
|
3
|
+
// Regenerate with: node scripts/generate-refs.js
|
|
4
|
+
/**
|
|
5
|
+
* Shared phase utilities for Claude Code hooks.
|
|
6
|
+
*
|
|
7
|
+
* Maps phases to directories and output types.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Phase order */
|
|
11
|
+
export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","tasks","implement","sync"];
|
|
12
|
+
|
|
13
|
+
/** Map phase → allowed output subdirectory */
|
|
14
|
+
export const PHASE_DIRS = {
|
|
15
|
+
proposal: '0-proposal',
|
|
16
|
+
setup: '0-proposal',
|
|
17
|
+
uiux: '2-ui',
|
|
18
|
+
design: '1-design',
|
|
19
|
+
clarify: '1-design',
|
|
20
|
+
tasks: '3-tasks',
|
|
21
|
+
implement: '4-implement',
|
|
22
|
+
sync: '4-implement',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Map output type (camelCase) → phase that produces it */
|
|
26
|
+
export const OUTPUT_PHASE_MAP = {
|
|
27
|
+
proposal: 'proposal',
|
|
28
|
+
schemaAnalysis: 'design',
|
|
29
|
+
spec: 'design',
|
|
30
|
+
clarifications: 'clarify',
|
|
31
|
+
contracts: 'design',
|
|
32
|
+
tasks: 'tasks',
|
|
33
|
+
uiDesignSystem: 'uiux',
|
|
34
|
+
uiMockups: 'uiux',
|
|
35
|
+
uiComponents: 'uiux',
|
|
36
|
+
uiFlows: 'uiux',
|
|
37
|
+
decisions: 'design',
|
|
38
|
+
recap: 'implement',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** Map filename → output type (camelCase) */
|
|
42
|
+
export const FILENAME_TO_OUTPUT = {
|
|
43
|
+
'proposal.md': 'proposal',
|
|
44
|
+
'schema-analysis.md': 'schemaAnalysis',
|
|
45
|
+
'spec.md': 'spec',
|
|
46
|
+
'clarifications.md': 'clarifications',
|
|
47
|
+
'contracts.cs': 'contracts',
|
|
48
|
+
'tasks.md': 'tasks',
|
|
49
|
+
'design-system.md': 'uiDesignSystem',
|
|
50
|
+
'mockups.md': 'uiMockups',
|
|
51
|
+
'components.md': 'uiComponents',
|
|
52
|
+
'flows.md': 'uiFlows',
|
|
53
|
+
'decisions.md': 'decisions',
|
|
54
|
+
'recap.md': 'recap',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Protected spec files and the approval gate that locks them */
|
|
58
|
+
export const PROTECTED_SPEC_FILES = {
|
|
59
|
+
'schema-analysis.md': 'design',
|
|
60
|
+
'spec.md': 'design',
|
|
61
|
+
'contracts.cs': 'design',
|
|
62
|
+
'tasks.md': 'tasks',
|
|
63
|
+
'design-system.md': 'uiux',
|
|
64
|
+
'mockups.md': 'uiux',
|
|
65
|
+
'components.md': 'uiux',
|
|
66
|
+
'flows.md': 'uiux',
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Extract feature name from a .morph/features/{feature}/... path
|
|
71
|
+
* @param {string} filePath - File path to analyze
|
|
72
|
+
* @returns {string|null} Feature name or null
|
|
73
|
+
*/
|
|
74
|
+
export function extractFeatureName(filePath) {
|
|
75
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
76
|
+
const match = normalized.match(/\.morph\/features\/([^/]+)\//);
|
|
77
|
+
return match ? match[1] : null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
|
|
82
|
+
* @param {string} filePath - File path to analyze
|
|
83
|
+
* @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
|
|
84
|
+
*/
|
|
85
|
+
export function extractPhaseDir(filePath) {
|
|
86
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
87
|
+
const match = normalized.match(/\.morph\/features\/[^/]+\/(\d+-[^/]+)\//);
|
|
88
|
+
return match ? match[1] : null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Check if a file path is inside .morph/features/
|
|
93
|
+
* @param {string} filePath
|
|
94
|
+
* @returns {boolean}
|
|
95
|
+
*/
|
|
96
|
+
export function isFeaturePath(filePath) {
|
|
97
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
98
|
+
return normalized.includes('.morph/features/');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if a file path is inside .morph/framework/ (readonly)
|
|
103
|
+
* @param {string} filePath
|
|
104
|
+
* @returns {boolean}
|
|
105
|
+
*/
|
|
106
|
+
export function isFrameworkPath(filePath) {
|
|
107
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
108
|
+
return normalized.includes('.morph/framework/');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Check if a file path is state.json
|
|
113
|
+
* @param {string} filePath
|
|
114
|
+
* @returns {boolean}
|
|
115
|
+
*/
|
|
116
|
+
export function isStatePath(filePath) {
|
|
117
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
118
|
+
return normalized.endsWith('.morph/state.json');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get the basename of a file path
|
|
123
|
+
* @param {string} filePath
|
|
124
|
+
* @returns {string}
|
|
125
|
+
*/
|
|
126
|
+
export function getBasename(filePath) {
|
|
127
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
128
|
+
return normalized.split('/').pop();
|
|
129
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared read-only state accessor for Claude Code hooks.
|
|
3
|
+
*
|
|
4
|
+
* Wraps state.json reads with fail-open semantics:
|
|
5
|
+
* - Returns null instead of throwing on missing/corrupt state
|
|
6
|
+
* - Never writes to state.json (read-only)
|
|
7
|
+
* - Uses synchronous reads for <100ms performance
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync, existsSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
|
|
13
|
+
const STATE_FILE = '.morph/state.json';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Load state.json from the project root.
|
|
17
|
+
* Fail-open: returns null if file missing or corrupt.
|
|
18
|
+
* @param {string} [projectPath] - Project root (defaults to cwd)
|
|
19
|
+
* @returns {Object|null} State object or null
|
|
20
|
+
*/
|
|
21
|
+
export function loadState(projectPath) {
|
|
22
|
+
try {
|
|
23
|
+
const statePath = join(projectPath || process.cwd(), STATE_FILE);
|
|
24
|
+
if (!existsSync(statePath)) return null;
|
|
25
|
+
return JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Check if state.json exists.
|
|
33
|
+
* @param {string} [projectPath]
|
|
34
|
+
* @returns {boolean}
|
|
35
|
+
*/
|
|
36
|
+
export function stateExists(projectPath) {
|
|
37
|
+
return existsSync(join(projectPath || process.cwd(), STATE_FILE));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the active feature (most recently updated in_progress feature).
|
|
42
|
+
* @param {string} [projectPath]
|
|
43
|
+
* @returns {{ name: string, feature: Object }|null}
|
|
44
|
+
*/
|
|
45
|
+
export function getActiveFeature(projectPath) {
|
|
46
|
+
const state = loadState(projectPath);
|
|
47
|
+
if (!state?.features) return null;
|
|
48
|
+
|
|
49
|
+
let active = null;
|
|
50
|
+
let latestUpdate = '';
|
|
51
|
+
|
|
52
|
+
for (const [name, feature] of Object.entries(state.features)) {
|
|
53
|
+
if (feature.status === 'in_progress' || feature.status === 'draft') {
|
|
54
|
+
const updated = feature.updatedAt || feature.createdAt || '';
|
|
55
|
+
if (updated >= latestUpdate) {
|
|
56
|
+
latestUpdate = updated;
|
|
57
|
+
active = { name, feature };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return active;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get a specific feature by name.
|
|
67
|
+
* @param {string} featureName
|
|
68
|
+
* @param {string} [projectPath]
|
|
69
|
+
* @returns {Object|null}
|
|
70
|
+
*/
|
|
71
|
+
export function getFeature(featureName, projectPath) {
|
|
72
|
+
const state = loadState(projectPath);
|
|
73
|
+
return state?.features?.[featureName] || null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Get the current phase of a feature.
|
|
78
|
+
* @param {string} featureName
|
|
79
|
+
* @param {string} [projectPath]
|
|
80
|
+
* @returns {string|null}
|
|
81
|
+
*/
|
|
82
|
+
export function getFeaturePhase(featureName, projectPath) {
|
|
83
|
+
const feature = getFeature(featureName, projectPath);
|
|
84
|
+
return feature?.phase || null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get approval status for a gate.
|
|
89
|
+
* @param {string} featureName
|
|
90
|
+
* @param {string} gate - 'proposal'|'uiux'|'design'|'tasks'
|
|
91
|
+
* @param {string} [projectPath]
|
|
92
|
+
* @returns {boolean}
|
|
93
|
+
*/
|
|
94
|
+
export function isGateApproved(featureName, gate, projectPath) {
|
|
95
|
+
const feature = getFeature(featureName, projectPath);
|
|
96
|
+
return feature?.approvalGates?.[gate]?.approved === true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get all pending approval gates for a feature.
|
|
101
|
+
* @param {string} featureName
|
|
102
|
+
* @param {string} [projectPath]
|
|
103
|
+
* @returns {string[]} List of gate names that are not yet approved
|
|
104
|
+
*/
|
|
105
|
+
export function getPendingGates(featureName, projectPath) {
|
|
106
|
+
const feature = getFeature(featureName, projectPath);
|
|
107
|
+
if (!feature?.approvalGates) return [];
|
|
108
|
+
|
|
109
|
+
return Object.entries(feature.approvalGates)
|
|
110
|
+
.filter(([, gate]) => !gate.approved)
|
|
111
|
+
.map(([name]) => name);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get feature outputs status.
|
|
116
|
+
* @param {string} featureName
|
|
117
|
+
* @param {string} [projectPath]
|
|
118
|
+
* @returns {Object|null} outputs map or null
|
|
119
|
+
*/
|
|
120
|
+
export function getOutputs(featureName, projectPath) {
|
|
121
|
+
const feature = getFeature(featureName, projectPath);
|
|
122
|
+
return feature?.outputs || null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get uncompleted required outputs for current phase.
|
|
127
|
+
* @param {string} featureName
|
|
128
|
+
* @param {string} [projectPath]
|
|
129
|
+
* @returns {Array<{type: string, path: string}>}
|
|
130
|
+
*/
|
|
131
|
+
export function getMissingOutputs(featureName, projectPath) {
|
|
132
|
+
const feature = getFeature(featureName, projectPath);
|
|
133
|
+
if (!feature?.outputs) return [];
|
|
134
|
+
|
|
135
|
+
return Object.entries(feature.outputs)
|
|
136
|
+
.filter(([, output]) => !output.created)
|
|
137
|
+
.map(([type, output]) => ({ type, path: output.path }));
|
|
138
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stdin reader for Claude Code hooks.
|
|
3
|
+
*
|
|
4
|
+
* Reads JSON payload from stdin (provided by Claude Code to hooks).
|
|
5
|
+
* Returns parsed object or null on failure.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Read and parse JSON from stdin
|
|
10
|
+
* @returns {Promise<Object|null>} Parsed JSON or null
|
|
11
|
+
*/
|
|
12
|
+
export function readStdin() {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
let input = '';
|
|
15
|
+
process.stdin.setEncoding('utf-8');
|
|
16
|
+
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
17
|
+
process.stdin.on('end', () => {
|
|
18
|
+
try {
|
|
19
|
+
resolve(JSON.parse(input || '{}'));
|
|
20
|
+
} catch {
|
|
21
|
+
resolve(null);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
process.stdin.on('error', () => resolve(null));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"phases": {
|
|
4
|
+
"proposal": {
|
|
5
|
+
"id": "proposal",
|
|
6
|
+
"index": 0,
|
|
7
|
+
"folder": "0-proposal",
|
|
8
|
+
"displayName": "Proposal",
|
|
9
|
+
"goals": [
|
|
10
|
+
"Understand the feature scope",
|
|
11
|
+
"Agree on high-level approach",
|
|
12
|
+
"Produce initial proposal document"
|
|
13
|
+
],
|
|
14
|
+
"requiredOutputs": ["proposal"],
|
|
15
|
+
"optionalOutputs": [],
|
|
16
|
+
"recommendedMCPs": ["context7"],
|
|
17
|
+
"pausePoints": [
|
|
18
|
+
{ "id": "proposal", "label": "Approve Proposal" }
|
|
19
|
+
],
|
|
20
|
+
"agentTiers": [1]
|
|
21
|
+
},
|
|
22
|
+
"setup": {
|
|
23
|
+
"id": "setup",
|
|
24
|
+
"index": 1,
|
|
25
|
+
"folder": null,
|
|
26
|
+
"displayName": "Setup",
|
|
27
|
+
"goals": [
|
|
28
|
+
"Load project context from .morph/context/",
|
|
29
|
+
"Activate relevant agents by tier and keyword",
|
|
30
|
+
"Confirm workflow type (fast-track / standard / full-morph)"
|
|
31
|
+
],
|
|
32
|
+
"requiredOutputs": [],
|
|
33
|
+
"optionalOutputs": [],
|
|
34
|
+
"recommendedMCPs": ["github"],
|
|
35
|
+
"pausePoints": [],
|
|
36
|
+
"agentTiers": [1, 2]
|
|
37
|
+
},
|
|
38
|
+
"uiux": {
|
|
39
|
+
"id": "uiux",
|
|
40
|
+
"index": 1.5,
|
|
41
|
+
"folder": "2-ui",
|
|
42
|
+
"displayName": "UI/UX Design",
|
|
43
|
+
"optional": true,
|
|
44
|
+
"goals": [
|
|
45
|
+
"Define visual design and design system",
|
|
46
|
+
"Create component inventory and style guide",
|
|
47
|
+
"Produce wireframes and user flows"
|
|
48
|
+
],
|
|
49
|
+
"requiredOutputs": ["uiDesignSystem"],
|
|
50
|
+
"optionalOutputs": ["uiMockups", "uiComponents", "uiFlows"],
|
|
51
|
+
"recommendedMCPs": ["playwright", "context7"],
|
|
52
|
+
"pausePoints": [
|
|
53
|
+
{ "id": "uiux", "label": "Approve UI/UX Design" }
|
|
54
|
+
],
|
|
55
|
+
"agentTiers": [1, 2, 3]
|
|
56
|
+
},
|
|
57
|
+
"design": {
|
|
58
|
+
"id": "design",
|
|
59
|
+
"index": 2,
|
|
60
|
+
"folder": "1-design",
|
|
61
|
+
"displayName": "Technical Design",
|
|
62
|
+
"goals": [
|
|
63
|
+
"Write technical specification",
|
|
64
|
+
"Define C# contracts and interfaces",
|
|
65
|
+
"Analyse schema changes",
|
|
66
|
+
"Document architectural decisions"
|
|
67
|
+
],
|
|
68
|
+
"requiredOutputs": ["spec", "contracts"],
|
|
69
|
+
"optionalOutputs": ["schemaAnalysis", "clarifications", "decisions"],
|
|
70
|
+
"recommendedMCPs": ["supabase", "context7", "github"],
|
|
71
|
+
"pausePoints": [
|
|
72
|
+
{ "id": "design", "label": "Approve Design Spec" }
|
|
73
|
+
],
|
|
74
|
+
"agentTiers": [1, 2, 3, 4]
|
|
75
|
+
},
|
|
76
|
+
"clarify": {
|
|
77
|
+
"id": "clarify",
|
|
78
|
+
"index": 3,
|
|
79
|
+
"folder": "1-design",
|
|
80
|
+
"displayName": "Clarification",
|
|
81
|
+
"goals": [
|
|
82
|
+
"Resolve open questions and ambiguities",
|
|
83
|
+
"Update spec with clarification decisions",
|
|
84
|
+
"Confirm edge cases are handled"
|
|
85
|
+
],
|
|
86
|
+
"requiredOutputs": ["clarifications"],
|
|
87
|
+
"optionalOutputs": [],
|
|
88
|
+
"recommendedMCPs": ["context7", "github"],
|
|
89
|
+
"pausePoints": [],
|
|
90
|
+
"agentTiers": [1, 2]
|
|
91
|
+
},
|
|
92
|
+
"tasks": {
|
|
93
|
+
"id": "tasks",
|
|
94
|
+
"index": 4,
|
|
95
|
+
"folder": "3-tasks",
|
|
96
|
+
"displayName": "Task Breakdown",
|
|
97
|
+
"goals": [
|
|
98
|
+
"Break approved spec into numbered, atomic tasks",
|
|
99
|
+
"Order tasks by dependency",
|
|
100
|
+
"Assign tasks to agent tiers"
|
|
101
|
+
],
|
|
102
|
+
"requiredOutputs": ["tasks"],
|
|
103
|
+
"optionalOutputs": [],
|
|
104
|
+
"recommendedMCPs": ["context7", "github"],
|
|
105
|
+
"pausePoints": [
|
|
106
|
+
{ "id": "tasks", "label": "Approve Task List" }
|
|
107
|
+
],
|
|
108
|
+
"agentTiers": [1, 2, 3]
|
|
109
|
+
},
|
|
110
|
+
"implement": {
|
|
111
|
+
"id": "implement",
|
|
112
|
+
"index": 5,
|
|
113
|
+
"folder": "4-implement",
|
|
114
|
+
"displayName": "Implementation",
|
|
115
|
+
"goals": [
|
|
116
|
+
"Execute approved tasks in order",
|
|
117
|
+
"Follow framework standards at each step",
|
|
118
|
+
"Checkpoint every 3 tasks",
|
|
119
|
+
"Write implementation recap"
|
|
120
|
+
],
|
|
121
|
+
"requiredOutputs": ["recap"],
|
|
122
|
+
"optionalOutputs": [],
|
|
123
|
+
"recommendedMCPs": ["supabase", "context7", "playwright", "github", "docker", "azure"],
|
|
124
|
+
"pausePoints": [],
|
|
125
|
+
"agentTiers": [1, 2, 3, 4]
|
|
126
|
+
},
|
|
127
|
+
"sync": {
|
|
128
|
+
"id": "sync",
|
|
129
|
+
"index": 6,
|
|
130
|
+
"folder": null,
|
|
131
|
+
"displayName": "Sync Standards",
|
|
132
|
+
"optional": true,
|
|
133
|
+
"goals": [
|
|
134
|
+
"Update framework standards from feature learnings",
|
|
135
|
+
"Capture new patterns to learning library",
|
|
136
|
+
"Archive completed feature"
|
|
137
|
+
],
|
|
138
|
+
"requiredOutputs": [],
|
|
139
|
+
"optionalOutputs": [],
|
|
140
|
+
"recommendedMCPs": [],
|
|
141
|
+
"pausePoints": [],
|
|
142
|
+
"agentTiers": [1]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.razor"
|
|
4
|
+
- "**/*.tsx"
|
|
5
|
+
- "**/*.ts"
|
|
6
|
+
- "**/*.css"
|
|
7
|
+
- "**/*.scss"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Frontend Standards
|
|
11
|
+
|
|
12
|
+
@.morph/framework/standards/frontend/blazor/design-checklist.md
|
|
13
|
+
@.morph/framework/standards/frontend/nextjs/nextjs-patterns.md
|
|
14
|
+
@.morph/framework/standards/frontend/design-system/naming.md
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.bicep"
|
|
4
|
+
- "**/Dockerfile"
|
|
5
|
+
- "**/docker-compose*.yml"
|
|
6
|
+
- "**/pipelines/**"
|
|
7
|
+
- "**/.github/workflows/**"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Infrastructure Standards
|
|
11
|
+
|
|
12
|
+
@.morph/framework/standards/infrastructure/azure/azure.md
|
|
13
|
+
@.morph/framework/standards/infrastructure/docker/easypanel-deploy.md
|