@polymorphism-tech/morph-spec 4.3.7 → 4.5.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 +44 -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/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/{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 +51 -0
- package/.morph/memory/pre-compact-2026-02-22T17-01-01-658Z.json +16 -0
- package/.morph/state.json +1 -1
- package/CLAUDE.md +20 -119
- 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/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 +239 -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/level-0-meta/brainstorming.md +133 -0
- package/framework/skills/level-0-meta/code-review.md +12 -4
- package/framework/skills/level-0-meta/mcp-registry.json +207 -0
- package/framework/skills/level-0-meta/morph-checklist.md +9 -1
- package/framework/skills/level-0-meta/simulation-checklist.md +9 -1
- package/framework/skills/level-0-meta/tool-usage-guide.md +335 -0
- package/framework/skills/level-0-meta/verification-before-completion.md +145 -0
- package/framework/skills/level-1-workflows/morph-replicate.md +9 -1
- package/framework/skills/level-1-workflows/phase-clarify.md +65 -4
- package/framework/skills/level-1-workflows/phase-codebase-analysis.md +182 -0
- package/framework/skills/level-1-workflows/phase-design.md +342 -80
- package/framework/skills/level-1-workflows/phase-implement.md +254 -0
- package/framework/skills/level-1-workflows/phase-setup.md +76 -10
- package/framework/skills/level-1-workflows/phase-tasks.md +88 -7
- package/framework/skills/level-1-workflows/phase-uiux.md +95 -17
- package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +8 -1
- package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +8 -1
- package/framework/skills/level-2-domains/architecture/prompt-engineer.md +8 -1
- package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +8 -1
- package/framework/skills/level-2-domains/architecture/standards-architect.md +11 -4
- package/framework/skills/level-2-domains/backend/api-designer.md +8 -1
- package/framework/skills/level-2-domains/backend/dotnet-senior.md +8 -1
- package/framework/skills/level-2-domains/backend/ef-modeler.md +8 -1
- package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +9 -2
- package/framework/skills/level-2-domains/backend/ms-agent-expert.md +8 -1
- package/framework/skills/level-2-domains/frontend/blazor-builder.md +8 -1
- package/framework/skills/level-2-domains/frontend/nextjs-expert.md +8 -1
- package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +9 -2
- package/framework/skills/level-2-domains/infrastructure/azure-architect.md +8 -1
- package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +8 -1
- package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +8 -1
- package/framework/skills/level-2-domains/infrastructure/container-specialist.md +8 -1
- package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +8 -1
- package/framework/skills/level-2-domains/integrations/asaas-financial.md +8 -1
- package/framework/skills/level-2-domains/integrations/azure-identity.md +8 -1
- package/framework/skills/level-2-domains/integrations/clerk-auth.md +8 -1
- package/framework/skills/level-2-domains/integrations/{hangfire-orchestrator.md → hangfire-integration.md} +8 -1
- package/framework/skills/level-2-domains/integrations/resend-email.md +8 -1
- package/framework/skills/level-2-domains/quality/code-analyzer.md +10 -3
- package/framework/skills/level-2-domains/quality/testing-specialist.md +8 -1
- 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 -76
- 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 +63 -30
- 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 +392 -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 +74 -0
- 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/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/{project/context → context}/README.md +0 -0
- /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}/frontend/nextjs/nextjs-patterns.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/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
|
@@ -252,7 +252,7 @@ export function templateExists(templateId, projectPath = null) {
|
|
|
252
252
|
* Get template absolute path with fallback logic.
|
|
253
253
|
*
|
|
254
254
|
* Resolution order:
|
|
255
|
-
* 1. Project-local override (.morph/templates/{path})
|
|
255
|
+
* 1. Project-local override (.morph/framework/templates/{path})
|
|
256
256
|
* 2. Framework universal template (framework/templates/{path})
|
|
257
257
|
*
|
|
258
258
|
* @param {string} templateId - Template identifier
|
|
@@ -266,7 +266,7 @@ export function resolveTemplatePathById(templateId, projectPath) {
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
// 1. Project-local override
|
|
269
|
-
const projectLocalPath = join(projectPath, '.morph/templates', template.path);
|
|
269
|
+
const projectLocalPath = join(projectPath, '.morph/framework/templates', template.path);
|
|
270
270
|
if (existsSync(projectLocalPath)) {
|
|
271
271
|
return projectLocalPath;
|
|
272
272
|
}
|
|
@@ -14,6 +14,22 @@ import { join, dirname } from 'path';
|
|
|
14
14
|
import { fileURLToPath } from 'url';
|
|
15
15
|
import { getPhaseSequence } from '../state/phase-state-machine.js';
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Load the canonical phase id set from framework/phases.json.
|
|
19
|
+
* Falls back to getPhaseSequence() if the file is unavailable.
|
|
20
|
+
* @returns {Set<string>}
|
|
21
|
+
*/
|
|
22
|
+
function getValidPhaseIds() {
|
|
23
|
+
try {
|
|
24
|
+
const phasesPath = join(__dirname, '..', '..', '..', 'framework', 'phases.json');
|
|
25
|
+
const { phases } = JSON.parse(readFileSync(phasesPath, 'utf8'));
|
|
26
|
+
return new Set(Object.keys(phases));
|
|
27
|
+
} catch {
|
|
28
|
+
// Graceful fallback to state machine list
|
|
29
|
+
return new Set(getPhaseSequence());
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
17
33
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
34
|
|
|
19
35
|
/**
|
|
@@ -340,7 +356,7 @@ export function getWorkflowConfig(workflowId, projectPath = '.') {
|
|
|
340
356
|
const config = workflows.find(w => w.id === workflowId) || null;
|
|
341
357
|
|
|
342
358
|
if (config) {
|
|
343
|
-
const validPhases =
|
|
359
|
+
const validPhases = getValidPhaseIds();
|
|
344
360
|
const declaredPhases = config.phases?.run || [];
|
|
345
361
|
for (const phase of declaredPhases) {
|
|
346
362
|
if (!validPhases.has(phase)) {
|
|
@@ -13,7 +13,7 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from
|
|
|
13
13
|
import { join } from 'path';
|
|
14
14
|
|
|
15
15
|
const MICRO_AGENTS_DIR = join(process.cwd(), '.morph/micro-agents');
|
|
16
|
-
const AGENTS_CONFIG = join(process.cwd(), '.morph/
|
|
16
|
+
const AGENTS_CONFIG = join(process.cwd(), '.morph/framework/agents.json');
|
|
17
17
|
|
|
18
18
|
// ============================================================================
|
|
19
19
|
// Agent Creation
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
15
15
|
import { join } from 'path';
|
|
16
|
+
import { getOutputPath } from '../../core/paths/output-schema.js';
|
|
16
17
|
import { randomUUID } from 'crypto';
|
|
17
18
|
|
|
18
19
|
const BUNDLES_DIR = join(process.cwd(), '.morph/bundles');
|
|
@@ -232,7 +233,7 @@ function buildResumeInstructions(feature, checkpointNum, decisions, nextSteps) {
|
|
|
232
233
|
return `## Resume Instructions
|
|
233
234
|
|
|
234
235
|
1. Load minimal standards: run \`morph-spec prime feature\`
|
|
235
|
-
2. Read spec:
|
|
236
|
+
2. Read spec: \`${getOutputPath(feature, 'spec')}\` (key sections only)
|
|
236
237
|
3. Check tasks: \`morph-spec state get ${feature}\`
|
|
237
238
|
4. Continue from: ${nextSteps[0] || `task after checkpoint ${checkpointNum}`}
|
|
238
239
|
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Config Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects the user's Claude Code environment: plugins, MCP servers,
|
|
5
|
+
* custom skills, commands, hooks, and superpowers installation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Detect full Claude Code configuration for a project
|
|
14
|
+
* @param {string} targetPath - Project root directory
|
|
15
|
+
* @param {Object} options - Options
|
|
16
|
+
* @param {string} options.globalDir - Override global .claude dir (for testing)
|
|
17
|
+
* @returns {Promise<Object>} Detected configuration
|
|
18
|
+
*/
|
|
19
|
+
export async function detectClaudeConfig(targetPath, options = {}) {
|
|
20
|
+
const home = homedir();
|
|
21
|
+
const globalClaudeDir = options.globalDir || join(home, '.claude');
|
|
22
|
+
const projectClaudeDir = join(targetPath, '.claude');
|
|
23
|
+
|
|
24
|
+
const result = {
|
|
25
|
+
plugins: [],
|
|
26
|
+
mcpServers: [],
|
|
27
|
+
customSkills: [],
|
|
28
|
+
customCommands: [],
|
|
29
|
+
hooks: [],
|
|
30
|
+
superpowers: { installed: false, version: null, skills: [] }
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// 1. Detect enabled plugins from global settings
|
|
34
|
+
result.plugins = detectPlugins(globalClaudeDir);
|
|
35
|
+
|
|
36
|
+
// 2. Detect MCP servers from global + project settings
|
|
37
|
+
result.mcpServers = detectMcpServers(globalClaudeDir, projectClaudeDir);
|
|
38
|
+
|
|
39
|
+
// 3. Detect custom skills
|
|
40
|
+
result.customSkills = detectCustomSkills(globalClaudeDir, projectClaudeDir);
|
|
41
|
+
|
|
42
|
+
// 4. Detect custom commands
|
|
43
|
+
result.customCommands = detectCustomCommands(globalClaudeDir, projectClaudeDir);
|
|
44
|
+
|
|
45
|
+
// 5. Detect hooks
|
|
46
|
+
result.hooks = detectHooks(globalClaudeDir, projectClaudeDir);
|
|
47
|
+
|
|
48
|
+
// 6. Detect superpowers plugin
|
|
49
|
+
result.superpowers = detectSuperpowers(result.plugins, result.customSkills);
|
|
50
|
+
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Detect enabled plugins from settings.json
|
|
56
|
+
*/
|
|
57
|
+
function detectPlugins(globalClaudeDir) {
|
|
58
|
+
const plugins = [];
|
|
59
|
+
|
|
60
|
+
// Read global settings for enabledPlugins
|
|
61
|
+
const settingsPath = join(globalClaudeDir, 'settings.json');
|
|
62
|
+
const settings = readJsonSafe(settingsPath);
|
|
63
|
+
const rawPlugins = settings?.enabledPlugins;
|
|
64
|
+
const enabledPlugins = Array.isArray(rawPlugins) ? rawPlugins : [];
|
|
65
|
+
|
|
66
|
+
// Read installed plugins for version info
|
|
67
|
+
const installedPath = join(globalClaudeDir, 'plugins', 'installed_plugins.json');
|
|
68
|
+
const installed = readJsonSafe(installedPath) || {};
|
|
69
|
+
|
|
70
|
+
for (const pluginId of enabledPlugins) {
|
|
71
|
+
const pluginInfo = installed[pluginId] || {};
|
|
72
|
+
plugins.push({
|
|
73
|
+
name: extractPluginName(pluginId),
|
|
74
|
+
id: pluginId,
|
|
75
|
+
version: pluginInfo.version || null,
|
|
76
|
+
enabled: true
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return plugins;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Detect MCP servers from global and project settings
|
|
85
|
+
*/
|
|
86
|
+
function detectMcpServers(globalClaudeDir, projectClaudeDir) {
|
|
87
|
+
const servers = [];
|
|
88
|
+
|
|
89
|
+
// Global MCP servers from settings.json
|
|
90
|
+
const globalSettings = readJsonSafe(join(globalClaudeDir, 'settings.json'));
|
|
91
|
+
if (globalSettings?.mcpServers) {
|
|
92
|
+
for (const [name, config] of Object.entries(globalSettings.mcpServers)) {
|
|
93
|
+
servers.push({ name, source: 'global', config });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Global MCP servers from settings.local.json
|
|
98
|
+
const globalLocal = readJsonSafe(join(globalClaudeDir, 'settings.local.json'));
|
|
99
|
+
if (globalLocal?.mcpServers) {
|
|
100
|
+
for (const [name, config] of Object.entries(globalLocal.mcpServers)) {
|
|
101
|
+
if (!servers.find(s => s.name === name)) {
|
|
102
|
+
servers.push({ name, source: 'global', config });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Project MCP servers from .claude/settings.local.json
|
|
108
|
+
const projectSettings = readJsonSafe(join(projectClaudeDir, 'settings.local.json'));
|
|
109
|
+
if (projectSettings?.mcpServers) {
|
|
110
|
+
for (const [name, config] of Object.entries(projectSettings.mcpServers)) {
|
|
111
|
+
const existing = servers.find(s => s.name === name);
|
|
112
|
+
if (existing) {
|
|
113
|
+
existing.source = 'project'; // project overrides global
|
|
114
|
+
} else {
|
|
115
|
+
servers.push({ name, source: 'project', config });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return servers;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Detect custom skills from .claude/skills/ directories
|
|
125
|
+
*/
|
|
126
|
+
function detectCustomSkills(globalClaudeDir, projectClaudeDir) {
|
|
127
|
+
const skills = [];
|
|
128
|
+
|
|
129
|
+
// Global skills
|
|
130
|
+
const globalSkills = join(globalClaudeDir, 'skills');
|
|
131
|
+
if (existsSync(globalSkills)) {
|
|
132
|
+
for (const file of walkMdFiles(globalSkills)) {
|
|
133
|
+
skills.push({
|
|
134
|
+
name: extractSkillName(file),
|
|
135
|
+
path: file,
|
|
136
|
+
source: 'global'
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Project skills (may include morph-spec skills)
|
|
142
|
+
const projectSkills = join(projectClaudeDir, 'skills');
|
|
143
|
+
if (existsSync(projectSkills)) {
|
|
144
|
+
for (const file of walkMdFiles(projectSkills)) {
|
|
145
|
+
const name = extractSkillName(file);
|
|
146
|
+
// Skip morph-spec framework skills (they're managed by init)
|
|
147
|
+
if (file.includes('level-0-meta') || file.includes('level-1-workflows') ||
|
|
148
|
+
file.includes('level-2-domains') || file.includes('level-3-technologies') ||
|
|
149
|
+
file.includes('level-4-patterns')) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
skills.push({
|
|
153
|
+
name,
|
|
154
|
+
path: file,
|
|
155
|
+
source: 'project'
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return skills;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Detect custom commands from .claude/commands/ directories
|
|
165
|
+
*/
|
|
166
|
+
function detectCustomCommands(globalClaudeDir, projectClaudeDir) {
|
|
167
|
+
const commands = [];
|
|
168
|
+
|
|
169
|
+
// Global commands
|
|
170
|
+
const globalCommands = join(globalClaudeDir, 'commands');
|
|
171
|
+
if (existsSync(globalCommands)) {
|
|
172
|
+
for (const file of walkMdFiles(globalCommands)) {
|
|
173
|
+
commands.push({
|
|
174
|
+
name: extractCommandName(file),
|
|
175
|
+
path: file,
|
|
176
|
+
source: 'global'
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Project commands (excluding morph-spec managed commands)
|
|
182
|
+
const projectCommands = join(projectClaudeDir, 'commands');
|
|
183
|
+
if (existsSync(projectCommands)) {
|
|
184
|
+
for (const file of walkMdFiles(projectCommands)) {
|
|
185
|
+
const name = extractCommandName(file);
|
|
186
|
+
// Skip morph-spec commands
|
|
187
|
+
if (name.startsWith('morph-')) continue;
|
|
188
|
+
commands.push({
|
|
189
|
+
name,
|
|
190
|
+
path: file,
|
|
191
|
+
source: 'project'
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return commands;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Detect hooks from settings files
|
|
201
|
+
*/
|
|
202
|
+
function detectHooks(globalClaudeDir, projectClaudeDir) {
|
|
203
|
+
const hooks = [];
|
|
204
|
+
|
|
205
|
+
// Global hooks
|
|
206
|
+
const globalSettings = readJsonSafe(join(globalClaudeDir, 'settings.json'));
|
|
207
|
+
if (globalSettings?.hooks) {
|
|
208
|
+
for (const [trigger, entries] of Object.entries(globalSettings.hooks)) {
|
|
209
|
+
hooks.push({ trigger, source: 'global', entries });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Project hooks
|
|
214
|
+
const projectSettings = readJsonSafe(join(projectClaudeDir, 'settings.local.json'));
|
|
215
|
+
if (projectSettings?.hooks) {
|
|
216
|
+
for (const [trigger, entries] of Object.entries(projectSettings.hooks)) {
|
|
217
|
+
hooks.push({ trigger, source: 'project', entries });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return hooks;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Detect superpowers plugin installation
|
|
226
|
+
*/
|
|
227
|
+
function detectSuperpowers(plugins, customSkills) {
|
|
228
|
+
const result = { installed: false, version: null, skills: [] };
|
|
229
|
+
|
|
230
|
+
// Check if superpowers is in enabled plugins
|
|
231
|
+
const superPlugin = plugins.find(p =>
|
|
232
|
+
p.name === 'superpowers' || p.id?.includes('superpowers')
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
if (superPlugin) {
|
|
236
|
+
result.installed = true;
|
|
237
|
+
result.version = superPlugin.version;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Collect superpowers skills from detected skills
|
|
241
|
+
const superpowerSkills = customSkills.filter(s =>
|
|
242
|
+
s.path?.includes('superpowers') || s.name?.startsWith('superpowers:')
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
if (superpowerSkills.length > 0) {
|
|
246
|
+
result.installed = true;
|
|
247
|
+
result.skills = superpowerSkills.map(s => s.name);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// MCP Phase Mapping
|
|
255
|
+
// ============================================================================
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Map detected MCPs to morph-spec phases where they're useful
|
|
259
|
+
* @param {Array} mcpServers - Detected MCP servers
|
|
260
|
+
* @returns {Object} Map of phase → relevant MCPs
|
|
261
|
+
*/
|
|
262
|
+
export function mapMcpsToPhases(mcpServers) {
|
|
263
|
+
const phaseMap = {
|
|
264
|
+
proposal: [],
|
|
265
|
+
setup: [],
|
|
266
|
+
uiux: [],
|
|
267
|
+
design: [],
|
|
268
|
+
clarify: [],
|
|
269
|
+
tasks: [],
|
|
270
|
+
implement: []
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const mcpPhaseConfig = {
|
|
274
|
+
context7: ['proposal', 'design', 'tasks', 'implement'],
|
|
275
|
+
supabase: ['design', 'implement'],
|
|
276
|
+
playwright: ['uiux', 'implement'],
|
|
277
|
+
github: ['setup', 'tasks', 'implement'],
|
|
278
|
+
figma: ['uiux'],
|
|
279
|
+
docker: ['implement'],
|
|
280
|
+
azure: ['implement']
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
for (const server of mcpServers) {
|
|
284
|
+
const name = server.name.toLowerCase();
|
|
285
|
+
for (const [mcpKey, phases] of Object.entries(mcpPhaseConfig)) {
|
|
286
|
+
if (name.includes(mcpKey)) {
|
|
287
|
+
for (const phase of phases) {
|
|
288
|
+
phaseMap[phase].push({
|
|
289
|
+
name: server.name,
|
|
290
|
+
source: server.source
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return phaseMap;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Format detected config as a summary table string
|
|
302
|
+
* @param {Object} config - Detected Claude config
|
|
303
|
+
* @returns {string} Formatted summary
|
|
304
|
+
*/
|
|
305
|
+
export function formatConfigSummary(config) {
|
|
306
|
+
const lines = [];
|
|
307
|
+
|
|
308
|
+
if (config.plugins.length > 0) {
|
|
309
|
+
lines.push('Plugins:');
|
|
310
|
+
for (const p of config.plugins) {
|
|
311
|
+
const ver = p.version ? ` v${p.version}` : '';
|
|
312
|
+
lines.push(` - ${p.name}${ver}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (config.mcpServers.length > 0) {
|
|
317
|
+
lines.push('MCP Servers:');
|
|
318
|
+
for (const s of config.mcpServers) {
|
|
319
|
+
lines.push(` - ${s.name} (${s.source})`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (config.superpowers.installed) {
|
|
324
|
+
lines.push(`Superpowers: installed (${config.superpowers.skills.length} skills)`);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (config.customSkills.length > 0) {
|
|
328
|
+
lines.push(`Custom Skills: ${config.customSkills.length}`);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (config.customCommands.length > 0) {
|
|
332
|
+
lines.push(`Custom Commands: ${config.customCommands.length}`);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return lines.join('\n');
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// ============================================================================
|
|
339
|
+
// Helpers
|
|
340
|
+
// ============================================================================
|
|
341
|
+
|
|
342
|
+
function readJsonSafe(filePath) {
|
|
343
|
+
try {
|
|
344
|
+
if (!existsSync(filePath)) return null;
|
|
345
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
346
|
+
} catch {
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function extractPluginName(pluginId) {
|
|
352
|
+
// Plugin IDs can be URLs or package names
|
|
353
|
+
// e.g., "https://github.com/user/superpowers" → "superpowers"
|
|
354
|
+
// e.g., "@user/superpowers" → "superpowers"
|
|
355
|
+
const parts = pluginId.split('/');
|
|
356
|
+
return parts[parts.length - 1].replace(/\.git$/, '');
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function extractSkillName(filePath) {
|
|
360
|
+
// Extract skill name from file path
|
|
361
|
+
// e.g., ".claude/skills/superpowers/brainstorming.md" → "superpowers:brainstorming"
|
|
362
|
+
const parts = filePath.replace(/\\/g, '/').split('/');
|
|
363
|
+
const mdFile = parts[parts.length - 1].replace('.md', '');
|
|
364
|
+
const parentDir = parts.length >= 2 ? parts[parts.length - 2] : null;
|
|
365
|
+
|
|
366
|
+
if (parentDir && parentDir !== 'skills') {
|
|
367
|
+
return `${parentDir}:${mdFile}`;
|
|
368
|
+
}
|
|
369
|
+
return mdFile;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function extractCommandName(filePath) {
|
|
373
|
+
return filePath.replace(/\\/g, '/').split('/').pop().replace('.md', '');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function walkMdFiles(dir) {
|
|
377
|
+
const results = [];
|
|
378
|
+
try {
|
|
379
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
380
|
+
for (const entry of entries) {
|
|
381
|
+
const fullPath = join(dir, entry.name);
|
|
382
|
+
if (entry.isDirectory()) {
|
|
383
|
+
results.push(...walkMdFiles(fullPath));
|
|
384
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
385
|
+
results.push(fullPath);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
} catch {
|
|
389
|
+
// Permission errors or broken symlinks
|
|
390
|
+
}
|
|
391
|
+
return results;
|
|
392
|
+
}
|
|
@@ -21,8 +21,8 @@ export async function analyzeConversation(projectPath) {
|
|
|
21
21
|
available: false
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
// Check if .morph/
|
|
25
|
-
const contextPath = join(projectPath, '.morph', '
|
|
24
|
+
// Check if .morph/context exists (past decisions)
|
|
25
|
+
const contextPath = join(projectPath, '.morph', 'context');
|
|
26
26
|
if (existsSync(contextPath)) {
|
|
27
27
|
result.available = true;
|
|
28
28
|
|
|
@@ -34,8 +34,8 @@ export async function analyzeConversation(projectPath) {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
// Check .morph/
|
|
38
|
-
const outputsPath = join(projectPath, '.morph', '
|
|
37
|
+
// Check .morph/features/*/decisions.md
|
|
38
|
+
const outputsPath = join(projectPath, '.morph', 'features');
|
|
39
39
|
if (existsSync(outputsPath)) {
|
|
40
40
|
const { readdirSync } = await import('fs');
|
|
41
41
|
const features = readdirSync(outputsPath, { withFileTypes: true })
|
|
@@ -29,9 +29,10 @@ export function detectDesignSystem(projectPath, featureName = null) {
|
|
|
29
29
|
if (featureName) {
|
|
30
30
|
const featureDesignSystemPath = join(
|
|
31
31
|
projectPath,
|
|
32
|
-
'.morph/
|
|
32
|
+
'.morph/features',
|
|
33
33
|
featureName,
|
|
34
|
-
'ui
|
|
34
|
+
'2-ui',
|
|
35
|
+
'design-system.md'
|
|
35
36
|
);
|
|
36
37
|
|
|
37
38
|
if (existsSync(featureDesignSystemPath)) {
|
|
@@ -46,7 +47,7 @@ export function detectDesignSystem(projectPath, featureName = null) {
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
// Priority 2: Project-level design system (markdown)
|
|
49
|
-
const projectDesignSystemPath = join(projectPath, '.morph/
|
|
50
|
+
const projectDesignSystemPath = join(projectPath, '.morph/context/design-system.md');
|
|
50
51
|
if (existsSync(projectDesignSystemPath)) {
|
|
51
52
|
return {
|
|
52
53
|
hasDesignSystem: true,
|
|
@@ -166,7 +167,7 @@ export function getRecommendedLocations(projectPath) {
|
|
|
166
167
|
|
|
167
168
|
// Default locations (Blazor)
|
|
168
169
|
const locations = {
|
|
169
|
-
markdown: '.morph/
|
|
170
|
+
markdown: '.morph/context/design-system.md',
|
|
170
171
|
css: 'wwwroot/css/design-system.css',
|
|
171
172
|
description: 'Project-level design system (shared across features)'
|
|
172
173
|
};
|
|
@@ -179,7 +180,7 @@ export function getRecommendedLocations(projectPath) {
|
|
|
179
180
|
return locations;
|
|
180
181
|
} catch {
|
|
181
182
|
return {
|
|
182
|
-
markdown: '.morph/
|
|
183
|
+
markdown: '.morph/context/design-system.md',
|
|
183
184
|
css: 'wwwroot/css/design-system.css',
|
|
184
185
|
description: 'Project-level design system (shared across features)'
|
|
185
186
|
};
|
|
@@ -125,7 +125,7 @@ Based on detected patterns in your codebase:
|
|
|
125
125
|
- **DI**: Constructor injection (${structure.patterns.includes('Dependency Injection') ? '✅ detected' : '⚠️ not detected'})
|
|
126
126
|
- **Tests**: ${structure.patterns.includes('Unit Tests') ? '✅ Present' : '⚠️ Not detected'}
|
|
127
127
|
|
|
128
|
-
**Recommendation**: Refer to \`.morph/standards/coding.md\` for complete .NET standards.`;
|
|
128
|
+
**Recommendation**: Refer to \`.morph/framework/standards/coding.md\` for complete .NET standards.`;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
if (config?.language === 'javascript') {
|
|
@@ -233,7 +233,7 @@ function generateRecommendations(structure, config, conversation) {
|
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
if (!structure.patterns.includes('AI Agents') && config?.technologies?.includes('Microsoft Agent Framework')) {
|
|
236
|
-
recommendations.push('Setup detected Agent Framework but no agents found - check .morph/standards/agent-framework-setup.md');
|
|
236
|
+
recommendations.push('Setup detected Agent Framework but no agents found - check .morph/framework/standards/agent-framework-setup.md');
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
|