@polymorphism-tech/morph-spec 4.3.6 → 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 -2
- 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
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context Prime CLI command — Load minimal context priming files
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* morph-spec prime feature (outputs feature-prime.md to stdout)
|
|
6
|
-
* morph-spec prime bug
|
|
7
|
-
* morph-spec prime refactor
|
|
8
|
-
* morph-spec prime design
|
|
9
|
-
* morph-spec prime infra
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import chalk from 'chalk';
|
|
13
|
-
import { readFileSync, existsSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
|
|
16
|
-
const PRIME_FILES = {
|
|
17
|
-
feature: '.morph/context/feature-prime.md',
|
|
18
|
-
bug: '.morph/context/bug-prime.md',
|
|
19
|
-
refactor: '.morph/context/refactor-prime.md',
|
|
20
|
-
design: '.morph/context/design-prime.md',
|
|
21
|
-
infra: '.morph/context/infra-prime.md'
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const PRIME_TYPES = Object.keys(PRIME_FILES);
|
|
25
|
-
|
|
26
|
-
export async function contextPrimeCommand(type, options) {
|
|
27
|
-
if (!type) {
|
|
28
|
-
console.log(chalk.cyan('\n Available prime types:\n'));
|
|
29
|
-
for (const [key, path] of Object.entries(PRIME_FILES)) {
|
|
30
|
-
const exists = existsSync(join(process.cwd(), path));
|
|
31
|
-
const status = exists ? chalk.green('✓') : chalk.red('✗');
|
|
32
|
-
console.log(` ${status} ${key.padEnd(10)} → ${path}`);
|
|
33
|
-
}
|
|
34
|
-
console.log('');
|
|
35
|
-
console.log(chalk.gray(' Usage: morph-spec prime <type>'));
|
|
36
|
-
console.log(chalk.gray(' Example: morph-spec prime feature\n'));
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!PRIME_TYPES.includes(type)) {
|
|
41
|
-
console.error(chalk.red(`Unknown prime type: ${type}`));
|
|
42
|
-
console.error(chalk.gray(`Valid types: ${PRIME_TYPES.join(', ')}`));
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const filePath = join(process.cwd(), PRIME_FILES[type]);
|
|
47
|
-
|
|
48
|
-
if (!existsSync(filePath)) {
|
|
49
|
-
console.error(chalk.red(`Prime file not found: ${filePath}`));
|
|
50
|
-
console.error(chalk.gray('Run `morph-spec init` to initialize MORPH-SPEC files.'));
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const content = readFileSync(filePath, 'utf8');
|
|
55
|
-
|
|
56
|
-
if (options.json) {
|
|
57
|
-
console.log(JSON.stringify({ type, path: filePath, content }));
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Output to stdout — designed to be read into context
|
|
62
|
-
console.log(content);
|
|
63
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core Four CLI command — Context/Model/Prompt/Tools dashboard
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* morph-spec core-four <feature>
|
|
6
|
-
* morph-spec core-four <feature> --json
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import chalk from 'chalk';
|
|
10
|
-
import { getCoreFour, formatCoreFour, initCoreFour } from '../../lib/context/core-four-tracker.js';
|
|
11
|
-
import { loadState } from '../../core/state/state-manager.js';
|
|
12
|
-
|
|
13
|
-
export async function coreFourCommand(featureName, options) {
|
|
14
|
-
try {
|
|
15
|
-
// Initialize with defaults if not already set
|
|
16
|
-
initCoreFour({
|
|
17
|
-
model: 'claude-sonnet-4-6',
|
|
18
|
-
contextWindow: 200000,
|
|
19
|
-
feature: featureName
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Try to populate context breakdown from feature state
|
|
23
|
-
try {
|
|
24
|
-
const state = loadState(false);
|
|
25
|
-
if (state?.features?.[featureName]) {
|
|
26
|
-
const feature = state.features[featureName];
|
|
27
|
-
// Attempt to estimate context breakdown from known files
|
|
28
|
-
const breakdown = {
|
|
29
|
-
'CLAUDE.md': 23000,
|
|
30
|
-
standards: feature.activeAgents ? feature.activeAgents.length * 500 : 0,
|
|
31
|
-
spec: feature.outputs?.includes('spec') ? 8000 : 0,
|
|
32
|
-
conversation: 5000,
|
|
33
|
-
other: 2000
|
|
34
|
-
};
|
|
35
|
-
const { updateContextBreakdown } = await import('../../lib/context/core-four-tracker.js');
|
|
36
|
-
updateContextBreakdown(breakdown);
|
|
37
|
-
}
|
|
38
|
-
} catch {
|
|
39
|
-
// Best-effort
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (options.json) {
|
|
43
|
-
const data = getCoreFour();
|
|
44
|
-
console.log(JSON.stringify(data, null, 2));
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
console.log('\n' + formatCoreFour());
|
|
49
|
-
console.log('');
|
|
50
|
-
} catch (err) {
|
|
51
|
-
console.error(chalk.red(`Error: ${err.message}`));
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Generate Context Command
|
|
3
|
-
*
|
|
4
|
-
* CLI: morph-spec generate context [feature]
|
|
5
|
-
*
|
|
6
|
-
* Generates CONTEXT.md (project-level) or CONTEXT-{feature}.md (feature-level)
|
|
7
|
-
* with all relevant project data for Claude's consumption.
|
|
8
|
-
*
|
|
9
|
-
* @module generate-context
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { generateContext } from '../../lib/generators/context-generator.js';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Generate context files
|
|
16
|
-
* @param {string} projectPath - Root path of the project
|
|
17
|
-
* @param {string} featureName - Optional feature name
|
|
18
|
-
* @returns {Promise<void>}
|
|
19
|
-
*/
|
|
20
|
-
export async function generateContextCommand(projectPath, featureName = null) {
|
|
21
|
-
console.log('📄 Generating CONTEXT files...\n');
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
const results = await generateContext(projectPath, featureName);
|
|
25
|
-
|
|
26
|
-
console.log('✅ Generated:');
|
|
27
|
-
console.log(` - ${results.projectContext}`);
|
|
28
|
-
|
|
29
|
-
if (results.featureContext) {
|
|
30
|
-
console.log(` - ${results.featureContext}`);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
console.log('\n💡 Use these files to provide full context to Claude Code.');
|
|
34
|
-
|
|
35
|
-
} catch (err) {
|
|
36
|
-
console.error('❌ Error generating context:');
|
|
37
|
-
console.error(` ${err.message}`);
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'fs';
|
|
2
|
-
import { join, dirname } from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { logger } from '../../utils/logger.js';
|
|
6
|
-
import { analyzeRequestComplexity } from '../../lib/analysis/complexity-analyzer.js';
|
|
7
|
-
import { LearningSystem } from '../../lib/learning/learning-system.js';
|
|
8
|
-
import { loadStandardsForAgent, getStandardsListForAgent } from '../../lib/standards/standards-context-injector.js';
|
|
9
|
-
|
|
10
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
const frameworkRoot = join(__dirname, '..', '..', '..');
|
|
12
|
-
|
|
13
|
-
function loadAgentsConfig() {
|
|
14
|
-
try {
|
|
15
|
-
const configPath = join(frameworkRoot, '.morph/config/agents.json');
|
|
16
|
-
const content = readFileSync(configPath, 'utf8');
|
|
17
|
-
return JSON.parse(content);
|
|
18
|
-
} catch (err) {
|
|
19
|
-
logger.error(`Failed to load agents config: ${err.message}`);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function detectAgents(userInput, config) {
|
|
25
|
-
const input = userInput.toLowerCase();
|
|
26
|
-
|
|
27
|
-
// MORPH 3.0 Hierarchical: agents is a flat object, not arrays
|
|
28
|
-
const allAgents = Object.entries(config.agents || {})
|
|
29
|
-
.filter(([id]) => !id.startsWith('_comment'))
|
|
30
|
-
.map(([id, agent]) => ({ id, ...agent }));
|
|
31
|
-
|
|
32
|
-
// Core agents = always_active agents (typically Tier 1)
|
|
33
|
-
const coreAgents = allAgents.filter(a => a.always_active === true);
|
|
34
|
-
const coreIds = coreAgents.map(a => a.id);
|
|
35
|
-
|
|
36
|
-
// Specialist agents = keyword-matched agents
|
|
37
|
-
const specialistMatches = [];
|
|
38
|
-
|
|
39
|
-
for (const agent of allAgents) {
|
|
40
|
-
if (agent.always_active) continue; // Skip core agents
|
|
41
|
-
|
|
42
|
-
// MORPH 3.0.1: Check negative keywords first — if any match, skip agent entirely
|
|
43
|
-
const negativeKeywords = agent.negativeKeywords || [];
|
|
44
|
-
const hasNegativeMatch = negativeKeywords.some(neg =>
|
|
45
|
-
input.includes(neg.toLowerCase())
|
|
46
|
-
);
|
|
47
|
-
if (hasNegativeMatch) continue;
|
|
48
|
-
|
|
49
|
-
// MORPH 3.0: keywords is directly on agent, not nested in autoActivation
|
|
50
|
-
const keywords = agent.keywords || [];
|
|
51
|
-
const matchedKeywords = [];
|
|
52
|
-
|
|
53
|
-
for (const keyword of keywords) {
|
|
54
|
-
if (input.includes(keyword.toLowerCase())) {
|
|
55
|
-
matchedKeywords.push(keyword);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (matchedKeywords.length > 0) {
|
|
60
|
-
specialistMatches.push({
|
|
61
|
-
id: agent.id,
|
|
62
|
-
name: agent.title || agent.id, // Use title as name
|
|
63
|
-
emoji: agent.teammate?.icon || '🤖',
|
|
64
|
-
matchedKeywords,
|
|
65
|
-
matchCount: matchedKeywords.length
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
specialistMatches.sort((a, b) => b.matchCount - a.matchCount);
|
|
71
|
-
|
|
72
|
-
const specialistIds = specialistMatches.map(m => m.id);
|
|
73
|
-
const allIds = [...new Set([...coreIds, ...specialistIds])];
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
core: coreIds,
|
|
77
|
-
specialists: specialistIds,
|
|
78
|
-
all: allIds,
|
|
79
|
-
matches: specialistMatches,
|
|
80
|
-
input: userInput
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function formatVerbose(result) {
|
|
85
|
-
logger.blank();
|
|
86
|
-
logger.header('AGENT DETECTION RESULT');
|
|
87
|
-
logger.info(`Input: ${chalk.white(result.input)}`);
|
|
88
|
-
logger.blank();
|
|
89
|
-
|
|
90
|
-
logger.header('CORE AGENTS (always active)');
|
|
91
|
-
result.core.forEach(id => {
|
|
92
|
-
logger.info(` ${chalk.green('✓')} ${id}`);
|
|
93
|
-
});
|
|
94
|
-
logger.blank();
|
|
95
|
-
|
|
96
|
-
if (result.matches.length > 0) {
|
|
97
|
-
logger.header('SPECIALIST AGENTS (keyword matched)');
|
|
98
|
-
result.matches.forEach(match => {
|
|
99
|
-
logger.info(` ${match.emoji} ${chalk.yellow(match.name)} (${match.matchCount} matches)`);
|
|
100
|
-
logger.dim(` Keywords: ${match.matchedKeywords.join(', ')}`);
|
|
101
|
-
});
|
|
102
|
-
} else {
|
|
103
|
-
logger.dim(' No specialist agents matched');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
logger.blank();
|
|
107
|
-
logger.info(`Total: ${chalk.cyan(result.all.length)} agents activated`);
|
|
108
|
-
logger.blank();
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export { detectAgents, loadAgentsConfig };
|
|
112
|
-
|
|
113
|
-
export function detectAgentsCommand(input, options) {
|
|
114
|
-
const userInput = Array.isArray(input) ? input.join(' ') : input;
|
|
115
|
-
|
|
116
|
-
if (!userInput) {
|
|
117
|
-
logger.error('User input is required');
|
|
118
|
-
logger.dim('Usage: morph-spec detect-agents "your feature description"');
|
|
119
|
-
process.exit(1);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const config = loadAgentsConfig();
|
|
123
|
-
const result = detectAgents(userInput, config);
|
|
124
|
-
|
|
125
|
-
// Stack-aware filtering: penalize stack-mismatched agents
|
|
126
|
-
try {
|
|
127
|
-
const projectConfigPath = join(process.cwd(), '.morph/config/config.json');
|
|
128
|
-
const projectConfig = JSON.parse(readFileSync(projectConfigPath, 'utf8'));
|
|
129
|
-
const stack = projectConfig?.project?.stack || projectConfig?.project?.language || '';
|
|
130
|
-
const isJsStack = stack === 'nodejs' || stack === 'javascript' || stack === 'nextjs';
|
|
131
|
-
|
|
132
|
-
if (isJsStack) {
|
|
133
|
-
const dotnetKeywords = ['dotnet', '.net', 'csharp', 'c#', 'blazor', 'razor', 'azure', 'bicep',
|
|
134
|
-
'ef core', 'entity framework', 'hangfire', 'mudblazor', 'fluent ui', 'asp.net'];
|
|
135
|
-
const hasExplicitDotnetRequest = dotnetKeywords.some(k => userInput.toLowerCase().includes(k));
|
|
136
|
-
|
|
137
|
-
if (!hasExplicitDotnetRequest) {
|
|
138
|
-
const dotnetAgents = new Set([
|
|
139
|
-
'dotnet-senior', 'azure-architect', 'ef-modeler', 'bicep-architect',
|
|
140
|
-
'blazor-builder', 'blazor-concurrency-validator', 'hangfire-orchestrator',
|
|
141
|
-
'azure-deploy-specialist'
|
|
142
|
-
]);
|
|
143
|
-
result.core = result.core.filter(id => !dotnetAgents.has(id));
|
|
144
|
-
result.specialists = result.specialists.filter(id => !dotnetAgents.has(id));
|
|
145
|
-
result.all = result.all.filter(id => !dotnetAgents.has(id));
|
|
146
|
-
result.matches = result.matches.filter(m => !dotnetAgents.has(m.id));
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} catch {
|
|
150
|
-
// Config not found or unreadable — skip stack filtering
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Enrich with complexity analysis
|
|
154
|
-
try {
|
|
155
|
-
result.complexity = analyzeRequestComplexity(userInput);
|
|
156
|
-
result.suggestedWorkflow = result.complexity.workflow;
|
|
157
|
-
} catch {
|
|
158
|
-
result.complexity = null;
|
|
159
|
-
result.suggestedWorkflow = 'standard';
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Enrich with learning suggestions
|
|
163
|
-
try {
|
|
164
|
-
const learner = new LearningSystem('.');
|
|
165
|
-
result.learningSuggestions = learner.getAllSuggestions();
|
|
166
|
-
} catch {
|
|
167
|
-
result.learningSuggestions = null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Enrich with skill paths for each detected agent
|
|
171
|
-
const allAgents = Object.entries(config.agents || {})
|
|
172
|
-
.filter(([id]) => !id.startsWith('_'))
|
|
173
|
-
.map(([id, agent]) => ({ id, ...agent }));
|
|
174
|
-
result.skillPaths = result.all
|
|
175
|
-
.map(id => {
|
|
176
|
-
const agent = allAgents.find(a => a.id === id);
|
|
177
|
-
return agent?.skillPath || null;
|
|
178
|
-
})
|
|
179
|
-
.filter(Boolean);
|
|
180
|
-
|
|
181
|
-
// Enrich with standards context when JSON output requested
|
|
182
|
-
if (options.json) {
|
|
183
|
-
const projectPath = process.cwd();
|
|
184
|
-
result.standardsSummary = {};
|
|
185
|
-
|
|
186
|
-
for (const agentId of result.all) {
|
|
187
|
-
const standardsList = getStandardsListForAgent(agentId);
|
|
188
|
-
const { fullContent } = loadStandardsForAgent(agentId, projectPath);
|
|
189
|
-
|
|
190
|
-
result.standardsSummary[agentId] = {
|
|
191
|
-
standards: standardsList,
|
|
192
|
-
fullContent: fullContent,
|
|
193
|
-
count: standardsList.length
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
if (options.json) {
|
|
199
|
-
console.log(JSON.stringify(result, null, 2));
|
|
200
|
-
} else if (options.verbose) {
|
|
201
|
-
formatVerbose(result);
|
|
202
|
-
} else if (options.idsOnly) {
|
|
203
|
-
result.all.forEach(id => console.log(id));
|
|
204
|
-
} else {
|
|
205
|
-
console.log(JSON.stringify(result.all));
|
|
206
|
-
}
|
|
207
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MORPH-SPEC Detect Workflow Command
|
|
3
|
-
*
|
|
4
|
-
* Analyzes a feature request and detects the most appropriate workflow
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* morph-spec detect-workflow "add pagination to users table"
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
import { detectWorkflow, getWorkflowConfig } from '../../core/workflows/workflow-detector.js';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Main command handler
|
|
15
|
-
* @param {Array<string>} input - User request words
|
|
16
|
-
* @param {Object} options - Command options
|
|
17
|
-
*/
|
|
18
|
-
export async function detectWorkflowCommand(input, options = {}) {
|
|
19
|
-
const userRequest = input.join(' ');
|
|
20
|
-
|
|
21
|
-
if (!userRequest || userRequest.trim().length === 0) {
|
|
22
|
-
console.log(chalk.red('\n✗ Error: Please provide a feature request'));
|
|
23
|
-
console.log(chalk.gray('\nUsage: morph-spec detect-workflow "add pagination to users table"\n'));
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
console.log(chalk.cyan('\n╔════════════════════════════════════════════════╗'));
|
|
28
|
-
console.log(chalk.cyan('║ MORPH-SPEC WORKFLOW DETECTION ║'));
|
|
29
|
-
console.log(chalk.cyan('╚════════════════════════════════════════════════╝\n'));
|
|
30
|
-
|
|
31
|
-
console.log(chalk.gray('Analyzing request:'), `"${userRequest}"`);
|
|
32
|
-
console.log('');
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
// Detect workflow
|
|
36
|
-
const result = await detectWorkflow({
|
|
37
|
-
userRequest,
|
|
38
|
-
projectPath: options.projectPath || '.'
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// Load workflow config for details
|
|
42
|
-
const workflowConfig = getWorkflowConfig(result.workflowId);
|
|
43
|
-
|
|
44
|
-
if (options.json) {
|
|
45
|
-
// JSON output mode
|
|
46
|
-
console.log(JSON.stringify({
|
|
47
|
-
workflowId: result.workflowId,
|
|
48
|
-
workflowName: workflowConfig?.name || result.workflowId,
|
|
49
|
-
confidence: result.confidence,
|
|
50
|
-
matchedKeywords: result.matchedKeywords,
|
|
51
|
-
estimatedComplexity: result.estimatedComplexity,
|
|
52
|
-
reasoning: result.reasoning,
|
|
53
|
-
alternativeWorkflows: result.alternativeWorkflows,
|
|
54
|
-
workflowConfig: workflowConfig
|
|
55
|
-
}, null, 2));
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Human-readable output
|
|
60
|
-
const confidencePercent = Math.round(result.confidence * 100);
|
|
61
|
-
console.log(chalk.green(`✓ Detected Workflow: ${chalk.bold(workflowConfig?.name || result.workflowId)}`));
|
|
62
|
-
console.log(chalk.gray(` Confidence: ${confidencePercent}%\n`));
|
|
63
|
-
|
|
64
|
-
// Criteria Match
|
|
65
|
-
console.log(chalk.cyan('Criteria Match:'));
|
|
66
|
-
if (result.matchedKeywords.length > 0) {
|
|
67
|
-
console.log(chalk.green(` ✓ Keywords: ${result.matchedKeywords.join(', ')}`));
|
|
68
|
-
}
|
|
69
|
-
console.log(chalk.gray(` • Estimated complexity: ${result.estimatedComplexity.files} files, ~${result.estimatedComplexity.lines} lines`));
|
|
70
|
-
if (result.estimatedComplexity.components > 0) {
|
|
71
|
-
console.log(chalk.gray(` • Components: ${result.estimatedComplexity.components}`));
|
|
72
|
-
}
|
|
73
|
-
if (result.estimatedComplexity.hasInfra) {
|
|
74
|
-
console.log(chalk.yellow(` ⚠ Infrastructure keywords detected`));
|
|
75
|
-
}
|
|
76
|
-
console.log('');
|
|
77
|
-
|
|
78
|
-
// Workflow Details
|
|
79
|
-
if (workflowConfig) {
|
|
80
|
-
console.log(chalk.cyan('Workflow Description:'));
|
|
81
|
-
console.log(chalk.gray(` ${workflowConfig.description}\n`));
|
|
82
|
-
|
|
83
|
-
// Phases to Run
|
|
84
|
-
console.log(chalk.cyan('Phases to Run:'));
|
|
85
|
-
const phasesToRun = workflowConfig.phases.run || [];
|
|
86
|
-
phasesToRun.forEach((phase, index) => {
|
|
87
|
-
const pausePoint = workflowConfig.pausePoints?.find(p => p.phase === phase);
|
|
88
|
-
const pauseIndicator = pausePoint ? chalk.yellow(' ⏸️ Pause for approval') : '';
|
|
89
|
-
console.log(chalk.white(` ${index + 1}. ${phase.toUpperCase()}${pauseIndicator}`));
|
|
90
|
-
if (pausePoint) {
|
|
91
|
-
console.log(chalk.gray(` Question: "${pausePoint.question}"`));
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
console.log('');
|
|
95
|
-
|
|
96
|
-
// Phases Skipped
|
|
97
|
-
if (workflowConfig.phases.skip && workflowConfig.phases.skip.length > 0) {
|
|
98
|
-
console.log(chalk.cyan('Phases Skipped:'));
|
|
99
|
-
workflowConfig.phases.skip.forEach(phase => {
|
|
100
|
-
const reason = getSkipReason(phase, workflowConfig);
|
|
101
|
-
console.log(chalk.gray(` ✗ ${phase.toUpperCase()}${reason ? ` - ${reason}` : ''}`));
|
|
102
|
-
});
|
|
103
|
-
console.log('');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Combined Phases
|
|
107
|
-
if (workflowConfig.phases.combined && Object.keys(workflowConfig.phases.combined).length > 0) {
|
|
108
|
-
console.log(chalk.cyan('Combined Phases:'));
|
|
109
|
-
for (const [combinedName, phases] of Object.entries(workflowConfig.phases.combined)) {
|
|
110
|
-
console.log(chalk.gray(` → ${combinedName.toUpperCase()} combines: ${phases.join(', ')}`));
|
|
111
|
-
}
|
|
112
|
-
console.log('');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Required Outputs
|
|
116
|
-
if (workflowConfig.outputs?.required && workflowConfig.outputs.required.length > 0) {
|
|
117
|
-
console.log(chalk.cyan('Required Outputs:'));
|
|
118
|
-
workflowConfig.outputs.required.forEach(output => {
|
|
119
|
-
console.log(chalk.white(` • ${output}`));
|
|
120
|
-
});
|
|
121
|
-
console.log('');
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Alternative Workflows
|
|
126
|
-
if (result.alternativeWorkflows.length > 0) {
|
|
127
|
-
console.log(chalk.cyan('Alternative Workflows:'));
|
|
128
|
-
result.alternativeWorkflows.forEach(alt => {
|
|
129
|
-
const altPercent = Math.round(alt.confidence * 100);
|
|
130
|
-
console.log(chalk.gray(` - ${alt.workflowId} (${altPercent}%): ${alt.reason}`));
|
|
131
|
-
});
|
|
132
|
-
console.log('');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// How to Override
|
|
136
|
-
console.log(chalk.cyan('To override detected workflow:'));
|
|
137
|
-
console.log(chalk.white(` morph-spec state set <feature-name> workflow <workflow-id>`));
|
|
138
|
-
console.log('');
|
|
139
|
-
|
|
140
|
-
console.log(chalk.gray('─'.repeat(50)));
|
|
141
|
-
console.log(chalk.gray('Available workflows: fast-track, standard, full-morph, design-impl, ui-refresh'));
|
|
142
|
-
console.log('');
|
|
143
|
-
|
|
144
|
-
} catch (error) {
|
|
145
|
-
console.log(chalk.red('\n✗ Workflow detection failed:'));
|
|
146
|
-
console.log(chalk.red(error.message));
|
|
147
|
-
if (options.verbose) {
|
|
148
|
-
console.log(chalk.gray('\nStack trace:'));
|
|
149
|
-
console.log(chalk.gray(error.stack));
|
|
150
|
-
}
|
|
151
|
-
console.log('');
|
|
152
|
-
process.exit(1);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Get skip reason for a phase
|
|
158
|
-
* @param {string} phase - Phase name
|
|
159
|
-
* @param {Object} workflowConfig - Workflow config
|
|
160
|
-
* @returns {string} Skip reason
|
|
161
|
-
*/
|
|
162
|
-
function getSkipReason(phase, workflowConfig) {
|
|
163
|
-
const reasons = {
|
|
164
|
-
'setup': 'context already loaded',
|
|
165
|
-
'uiux': 'no significant UI changes',
|
|
166
|
-
'clarify': 'spec is clear for this type',
|
|
167
|
-
'sync': 'tactical decisions, not strategic',
|
|
168
|
-
'proposal': 'combined into quick-analysis',
|
|
169
|
-
'design': 'design not needed for visual-only changes',
|
|
170
|
-
'tasks': 'simple enough for direct implementation'
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
return reasons[phase] || '';
|
|
174
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thread Template CLI command — Thread type management
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* morph-spec thread-template list
|
|
6
|
-
* morph-spec thread-template use <type> --feature=<feature>
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import chalk from 'chalk';
|
|
10
|
-
import { THREAD_TYPES } from '../../lib/threads/thread-manager.js';
|
|
11
|
-
|
|
12
|
-
const THREAD_TYPE_INFO = {
|
|
13
|
-
[THREAD_TYPES.BASE]: {
|
|
14
|
-
name: 'B-Thread (Base)',
|
|
15
|
-
description: 'Standard single-agent thread. Sequential execution, all approval gates required.',
|
|
16
|
-
useCase: 'Default for simple and medium features',
|
|
17
|
-
phases: 'All standard phases',
|
|
18
|
-
approvalGates: 'Manual (all)',
|
|
19
|
-
maxConcurrent: 1
|
|
20
|
-
},
|
|
21
|
-
[THREAD_TYPES.PARALLEL]: {
|
|
22
|
-
name: 'P-Thread (Parallel)',
|
|
23
|
-
description: 'Multiple agents run simultaneously on different feature domains.',
|
|
24
|
-
useCase: 'Full-stack features with independent backend/frontend/infra work',
|
|
25
|
-
phases: 'All phases (parallel IMPLEMENT)',
|
|
26
|
-
approvalGates: 'Manual (all)',
|
|
27
|
-
maxConcurrent: 5
|
|
28
|
-
},
|
|
29
|
-
[THREAD_TYPES.FUSION]: {
|
|
30
|
-
name: 'F-Thread (Fusion)',
|
|
31
|
-
description: 'N agents independently generate solutions; best-of-N result is selected.',
|
|
32
|
-
useCase: 'High-uncertainty decisions, critical architecture choices, prototype evaluation',
|
|
33
|
-
phases: 'DESIGN → parallel IMPLEMENT → AGGREGATE → SYNC',
|
|
34
|
-
approvalGates: 'Manual select (or auto best-of-n)',
|
|
35
|
-
maxConcurrent: 3
|
|
36
|
-
},
|
|
37
|
-
[THREAD_TYPES.LONG_RUNNING]: {
|
|
38
|
-
name: 'L-Thread (Long-Running)',
|
|
39
|
-
description: 'Autonomous agent with stop hooks every 30 minutes for validation.',
|
|
40
|
-
useCase: 'Large scope features (>10 files), autonomous implementation without interruption',
|
|
41
|
-
phases: 'IMPLEMENT (continuous) with periodic validation',
|
|
42
|
-
approvalGates: 'Auto (stop hooks validate)',
|
|
43
|
-
maxConcurrent: 1
|
|
44
|
-
},
|
|
45
|
-
[THREAD_TYPES.ZERO_TOUCH]: {
|
|
46
|
-
name: 'Z-Thread (Zero-Touch)',
|
|
47
|
-
description: 'Fully autonomous execution. Auto-approves all gates, auto-commits on success.',
|
|
48
|
-
useCase: 'Maximum-trust features with >95% checkpoint pass rate',
|
|
49
|
-
phases: 'All phases (auto-approved)',
|
|
50
|
-
approvalGates: 'Auto (trust-based)',
|
|
51
|
-
maxConcurrent: 1
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export async function threadTemplateListCommand(options) {
|
|
56
|
-
console.log(chalk.cyan('\n Thread Types\n'));
|
|
57
|
-
console.log(' ' + '─'.repeat(70));
|
|
58
|
-
|
|
59
|
-
for (const [type, info] of Object.entries(THREAD_TYPE_INFO)) {
|
|
60
|
-
console.log(`\n ${chalk.bold(info.name)}`);
|
|
61
|
-
console.log(` ${info.description}`);
|
|
62
|
-
console.log(` ${chalk.gray('Use case:')} ${info.useCase}`);
|
|
63
|
-
console.log(` ${chalk.gray('Phases:')} ${info.phases}`);
|
|
64
|
-
console.log(` ${chalk.gray('Gates:')} ${info.approvalGates}`);
|
|
65
|
-
console.log(` ${chalk.gray('Max concurrent:')} ${info.maxConcurrent}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
console.log('\n ' + '─'.repeat(70));
|
|
69
|
-
console.log(chalk.gray('\n Set thread type: morph-spec thread-template use <type> --feature=<feature>\n'));
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export async function threadTemplateUseCommand(type, options) {
|
|
73
|
-
if (!options.feature) {
|
|
74
|
-
console.error(chalk.red('--feature is required'));
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (!THREAD_TYPE_INFO[type]) {
|
|
79
|
-
console.error(chalk.red(`Unknown thread type: ${type}`));
|
|
80
|
-
console.error(chalk.gray(`Valid types: ${Object.keys(THREAD_TYPE_INFO).join(', ')}`));
|
|
81
|
-
process.exit(1);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const info = THREAD_TYPE_INFO[type];
|
|
85
|
-
|
|
86
|
-
// Special checks
|
|
87
|
-
if (type === THREAD_TYPES.ZERO_TOUCH) {
|
|
88
|
-
console.log(chalk.yellow('\n ⚠ Z-Thread requires maximum trust level (>95% checkpoint pass rate)'));
|
|
89
|
-
console.log(chalk.gray(' Check trust: morph-spec trust status\n'));
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Update feature state with thread type
|
|
93
|
-
try {
|
|
94
|
-
const { updateFeature } = await import('../../core/state/state-manager.js');
|
|
95
|
-
await updateFeature(options.feature, 'threadType', type);
|
|
96
|
-
console.log(chalk.green(`\n ✓ Thread type set: ${type} for feature: ${options.feature}`));
|
|
97
|
-
console.log(` ${info.name}: ${info.description}`);
|
|
98
|
-
console.log('');
|
|
99
|
-
} catch (err) {
|
|
100
|
-
console.error(chalk.red(` Error updating state: ${err.message}`));
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
}
|