@polymorphism-tech/morph-spec 9.0.0 → 9.2.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/CLAUDE.md +8 -9
- package/README.md +38 -36
- package/bin/morph-spec.js +11 -63
- package/bin/validate.js +1 -39
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +2 -1
- package/framework/MORPH.md +3 -3
- package/framework/agents.json +19 -11
- package/framework/commands/morph-apply.md +1 -1
- package/framework/commands/morph-status.md +1 -1
- package/framework/docs/CLI.md +22 -31
- package/framework/evals/review-checklist.md +12 -2
- package/framework/hooks/README.md +8 -44
- package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
- package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
- package/framework/hooks/claude-code/core/chain.js +4 -65
- package/framework/hooks/claude-code/core/comment-guard.js +2 -16
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +6 -50
- package/framework/hooks/claude-code/core/gate-guard.js +7 -67
- package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
- package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
- package/framework/hooks/claude-code/core/heavy-release.js +2 -13
- package/framework/hooks/claude-code/core/loop-detect.js +2 -31
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +0 -4
- package/framework/hooks/claude-code/core/protect-spec-files.js +7 -67
- package/framework/hooks/claude-code/core/state-sync.js +12 -68
- package/framework/hooks/claude-code/core/telemetry-log.js +12 -93
- package/framework/hooks/claude-code/core/validate-completion.js +11 -57
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +1 -9
- package/framework/hooks/claude-code/core/worktree-context.js +10 -110
- package/framework/hooks/claude-code/core/worktree-create.js +6 -70
- package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
- package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/shared/activity-logger.js +9 -89
- package/framework/hooks/shared/agent-reap.js +2 -17
- package/framework/hooks/shared/build-check.js +6 -75
- package/framework/hooks/shared/claim-registry.js +9 -119
- package/framework/hooks/shared/command-tokens.js +6 -51
- package/framework/hooks/shared/comment-rules.js +5 -20
- package/framework/hooks/shared/comment-scanner.js +6 -25
- package/framework/hooks/shared/comment-stripper.js +11 -85
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/errata.js +2 -15
- package/framework/hooks/shared/feature-locator.js +11 -95
- package/framework/hooks/shared/frontend-locations.js +1 -3
- package/framework/hooks/shared/gate-question.js +1 -7
- package/framework/hooks/shared/git-exclude.js +3 -20
- package/framework/hooks/shared/git-paths.js +8 -104
- package/framework/hooks/shared/graph-freshness.js +22 -166
- package/framework/hooks/shared/graph-refresh.js +21 -149
- package/framework/hooks/shared/heavy-command.js +4 -12
- package/framework/hooks/shared/hook-response.js +8 -83
- package/framework/hooks/shared/morph-cli.js +8 -52
- package/framework/hooks/shared/payload-utils.js +10 -132
- package/framework/hooks/shared/phase-utils.js +1 -42
- package/framework/hooks/shared/redact-secrets.js +4 -15
- package/framework/hooks/shared/reparse-scan.js +6 -66
- package/framework/hooks/shared/slice-progress.js +4 -23
- package/framework/hooks/shared/source-files.js +4 -17
- package/framework/hooks/shared/state-reader.js +13 -183
- package/framework/hooks/shared/state-writer.js +8 -52
- package/framework/hooks/shared/stdin-reader.js +1 -11
- package/framework/hooks/shared/telemetry-logger.js +7 -67
- package/framework/hooks/shared/transcript-usage.js +7 -29
- package/framework/hooks/shared/worktree-root.js +7 -29
- package/framework/rules/csharp-standards.md +1 -1
- package/framework/rules/frontend-standards.md +1 -0
- package/framework/rules/hangfire-standards.md +1 -1
- package/framework/rules/neon-standards.md +1 -1
- package/framework/rules/nextjs-standards.md +1 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +4 -4
- package/framework/skills/core/morph-hotfix/SKILL.md +3 -3
- package/framework/skills/core/morph-machine/SKILL.md +1 -1
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +9 -7
- package/framework/skills/core/morph-review/SKILL.md +9 -6
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +29 -12
- package/framework/standards/STANDARDS.json +36 -14
- package/framework/standards/STANDARDS.meta.json +16 -2
- package/framework/standards/ai-agents/agent-archetypes.md +2 -2
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
- package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
- package/framework/standards/ai-agents/observability-patterns.md +1 -1
- package/framework/standards/ai-agents/production.md +1 -1
- package/framework/standards/ai-agents/prompt-sources.md +2 -2
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
- package/framework/standards/ai-agents/setup.md +2 -2
- package/framework/standards/ai-agents/sweet-spot.md +2 -2
- package/framework/standards/ai-agents/tool-adapters.md +0 -2
- package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/standards/architecture/code-comments.md +1 -1
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
- package/framework/standards/backend/api/validation.md +1 -1
- package/framework/standards/backend/dotnet/testing.md +10 -4
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
- package/framework/standards/data/nosql/cache/redis.md +1 -1
- package/framework/standards/data/nosql/cosmos-db.md +3 -3
- package/framework/standards/frontend/admin-app/forms.md +1 -1
- package/framework/standards/frontend/design-system/art-direction.md +88 -0
- package/framework/standards/frontend/design-system/premium-finish.md +77 -2
- package/framework/standards/frontend/nextjs/testing.md +10 -6
- package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/CLAUDE.md.core.template +3 -3
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +9 -9
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/docs/plan.md +3 -1
- package/framework/templates/docs/ui-mockups.md +4 -0
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/context/context-refresh.js +0 -16
- package/src/commands/dashboard/dashboard.js +2 -8
- package/src/commands/e2e/e2e.js +17 -104
- package/src/commands/graph/affected.js +0 -14
- package/src/commands/graph/build.js +11 -50
- package/src/commands/graph/explain.js +0 -16
- package/src/commands/graph/status.js +1 -12
- package/src/commands/mcp/mcp-setup.js +4 -62
- package/src/commands/observability/cost.js +5 -57
- package/src/commands/observability/telemetry.js +1 -14
- package/src/commands/project/branch.js +4 -45
- package/src/commands/project/claim.js +4 -48
- package/src/commands/project/doctor.js +48 -302
- package/src/commands/project/env.js +1 -27
- package/src/commands/project/fleet.js +3 -32
- package/src/commands/project/init.js +4 -68
- package/src/commands/project/install-plugin-cmd.js +0 -1
- package/src/commands/project/standards.js +1 -62
- package/src/commands/project/status.js +0 -53
- package/src/commands/project/update.js +31 -239
- package/src/commands/project/worktree.js +108 -882
- package/src/commands/scaffold/scaffold.js +0 -25
- package/src/commands/state/advance.js +14 -85
- package/src/commands/state/approve.js +15 -97
- package/src/commands/state/archive.js +12 -64
- package/src/commands/state/auto-approval.js +2 -5
- package/src/commands/state/create.js +22 -109
- package/src/commands/state/delete.js +11 -63
- package/src/commands/state/finish.js +98 -475
- package/src/commands/state/gate-check.js +22 -132
- package/src/commands/state/gate-decision.js +3 -39
- package/src/commands/state/handoff.js +3 -30
- package/src/commands/state/list.js +14 -84
- package/src/commands/state/report-check.js +8 -58
- package/src/commands/state/retype.js +4 -26
- package/src/commands/validation/index.js +0 -3
- package/src/commands/validation/mutate.js +11 -11
- package/src/commands/validation/plan-check.js +4 -2
- package/src/commands/validation/tests-audit.js +7 -0
- package/src/commands/validation/validate-feature.js +10 -97
- package/src/commands/validation/verify.js +30 -113
- package/src/core/paths/output-schema.js +2 -101
- package/src/core/state/feature-identity.js +1 -25
- package/src/core/state/gate-order.js +0 -27
- package/src/core/state/lifecycle-audit.js +8 -100
- package/src/core/state/state-manager.js +22 -304
- package/src/core/templates/template-registry.js +2 -97
- package/src/core/templates/template-renderer.js +13 -93
- package/src/core/templates/template-seed.js +0 -1
- package/src/core/work-types.js +1 -36
- package/src/dashboard/app/App.jsx +1 -8
- package/src/dashboard/app/components/ActivityFeed.jsx +0 -5
- package/src/dashboard/app/components/CommandPalette.jsx +0 -7
- package/src/dashboard/app/components/DetailPanel.jsx +1 -5
- package/src/dashboard/app/components/EntityLink.jsx +0 -12
- package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
- package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
- package/src/dashboard/app/components/Markdown.jsx +0 -9
- package/src/dashboard/app/components/PhaseRail.jsx +0 -11
- package/src/dashboard/app/components/SearchFilter.jsx +0 -4
- package/src/dashboard/app/components/Sidebar.jsx +0 -5
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
- package/src/dashboard/app/hooks/usePref.js +1 -5
- package/src/dashboard/app/lib/format.js +0 -2
- package/src/dashboard/app/lib/phases.js +1 -5
- package/src/dashboard/app/lib/project.js +0 -12
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +1 -8
- package/src/dashboard/app/pages/FeatureDetail.jsx +1 -5
- package/src/dashboard/app/pages/Features.jsx +1 -8
- package/src/dashboard/app/pages/Guide.jsx +0 -1
- package/src/dashboard/app/pages/HookInspector.jsx +2 -23
- package/src/dashboard/app/pages/PhasePipeline.jsx +0 -3
- package/src/dashboard/app/pages/Portfolio.jsx +0 -1
- package/src/dashboard/app/pages/RulesMap.jsx +1 -16
- package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
- package/src/dashboard/app/pages/Standards.jsx +2 -17
- package/src/dashboard/scanner/activity-scanner.js +10 -69
- package/src/dashboard/scanner/agents-scanner.js +1 -23
- package/src/dashboard/scanner/docs-scanner.js +0 -6
- package/src/dashboard/scanner/feature-status.js +2 -5
- package/src/dashboard/scanner/features-scanner.js +10 -66
- package/src/dashboard/scanner/hooks-scanner.js +5 -28
- package/src/dashboard/scanner/index.js +0 -4
- package/src/dashboard/scanner/portfolio.js +5 -29
- package/src/dashboard/scanner/project-api.js +8 -54
- package/src/dashboard/scanner/rules-scanner.js +1 -2
- package/src/dashboard/scanner/skills-scanner.js +2 -12
- package/src/dashboard/scanner/standards-scanner.js +2 -6
- package/src/dashboard/vite-plugin-morph-data.js +5 -19
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/ai/ai-checks.js +7 -52
- package/src/lib/ai/ai-project-scan.js +14 -108
- package/src/lib/ai/code-audit.js +7 -63
- package/src/lib/ai/pin-drift.js +8 -51
- package/src/lib/ai/registry-audit.js +11 -90
- package/src/lib/ci/ci-verify.js +4 -19
- package/src/lib/ci/github-ci.js +9 -37
- package/src/lib/ci/workflow-scaffold.js +14 -10
- package/src/lib/detectors/claude-config-detector.js +13 -74
- package/src/lib/detectors/index.js +4 -50
- package/src/lib/e2e/applicability.js +37 -0
- package/src/lib/e2e/compose-env.js +5 -66
- package/src/lib/e2e/stack-teardown.js +6 -40
- package/src/lib/generators/architecture-scanner.js +18 -156
- package/src/lib/generators/handoff-generator.js +9 -53
- package/src/lib/generators/scaffold-generator.js +5 -101
- package/src/lib/generators/settings-generator.js +4 -37
- package/src/lib/git/branch-classifier.js +11 -84
- package/src/lib/git/default-branch.js +14 -169
- package/src/lib/git/evidence-staleness.js +1 -0
- package/src/lib/git/gh.js +2 -17
- package/src/lib/git/pending-prs.js +6 -37
- package/src/lib/git/pr-files.js +3 -28
- package/src/lib/git/pr-index.js +3 -34
- package/src/lib/git/tree-fingerprint.js +3 -15
- package/src/lib/git/tree-state.js +6 -33
- package/src/lib/graph/god-nodes.js +2 -22
- package/src/lib/graph/graph-health.js +3 -24
- package/src/lib/graph/graph-loader.js +5 -56
- package/src/lib/graph/graphify-runtime.js +7 -37
- package/src/lib/graph/graphifyignore.js +8 -74
- package/src/lib/graph/sanitize.js +16 -136
- package/src/lib/heavy/cleanup.js +1 -1
- package/src/lib/installers/effects.js +8 -93
- package/src/lib/installers/mcp-installer.js +9 -169
- package/src/lib/installers/memory-installer.js +4 -27
- package/src/lib/installers/templates-reconcile.js +5 -60
- package/src/lib/mutation/adapters.js +6 -17
- package/src/lib/mutation/dotnet-introspection.js +20 -106
- package/src/lib/mutation/runner.js +23 -75
- package/src/lib/mutation/subset.js +1 -4
- package/src/lib/mutation/trx.js +0 -1
- package/src/lib/plan/artifact-vocabulary.js +5 -25
- package/src/lib/plan/checks.js +34 -33
- package/src/lib/plan/plan-parser.js +7 -8
- package/src/lib/projects/registry.js +7 -44
- package/src/lib/review-reports.js +11 -26
- package/src/lib/risk-detector.js +41 -173
- package/src/lib/specs/adr-index.js +6 -34
- package/src/lib/specs/frontmatter.js +2 -15
- package/src/lib/specs/gfm-table.js +1 -7
- package/src/lib/specs/revocations.js +1 -14
- package/src/lib/specs/screen-checklist.js +47 -124
- package/src/lib/stack/dotnet-build-ignores.js +2 -6
- package/src/lib/stack/stack-profile.js +1 -28
- package/src/lib/stack/stack-scan.js +1 -8
- package/src/lib/stack-filter.js +4 -27
- package/src/lib/standards/registry.js +1 -7
- package/src/lib/standards/sections.js +2 -13
- package/src/lib/standards/verified-against.js +19 -191
- package/src/lib/tasks/eval-node.js +21 -169
- package/src/lib/tasks/linux-runner.js +18 -142
- package/src/lib/tasks/test-nodes.js +43 -240
- package/src/lib/tasks/test-runner.js +43 -341
- package/src/lib/telemetry/metrics.js +7 -36
- package/src/lib/telemetry/telemetry-reader.js +13 -125
- package/src/lib/telemetry/verify-event.js +2 -30
- package/src/lib/tests-audit/audit.js +96 -0
- package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
- package/src/lib/validators/code-budget/index.js +0 -7
- package/src/lib/validators/contracts/contract-compliance-validator.js +2 -24
- package/src/lib/validators/contracts/index.js +0 -6
- package/src/lib/validators/nextjs/index.js +0 -5
- package/src/lib/validators/nextjs/next-component-validator.js +4 -81
- package/src/lib/validators/packages/index.js +0 -6
- package/src/lib/validators/packages/package-validator.js +6 -56
- package/src/lib/validators/reuse/index.js +0 -8
- package/src/lib/validators/reuse/reuse-validator.js +11 -101
- package/src/lib/validators/reuse/symbol-scanner.js +6 -62
- package/src/lib/validators/traceability-check.js +5 -63
- package/src/lib/validators/validation-runner.js +21 -158
- package/src/lib/validators/verify-runner.js +85 -376
- package/src/lib/work-type-detector.js +5 -67
- package/src/lib/worktree/docker-audit.js +17 -136
- package/src/lib/worktree/env-allocator.js +10 -98
- package/src/lib/worktree/feature-truth.js +12 -115
- package/src/lib/worktree/finish-backup.js +32 -242
- package/src/lib/worktree/fleet-scanner.js +13 -95
- package/src/lib/worktree/ignored-triage.js +15 -91
- package/src/lib/worktree/vscode-settings.js +2 -3
- package/src/lib/worktree/worktree-audit.js +21 -213
- package/src/lib/worktree/worktree-include.js +3 -5
- package/src/scripts/global-install.js +3 -9
- package/src/scripts/install-plugin.js +1 -13
- package/src/scripts/setup-infra.js +17 -147
- package/src/utils/agents-installer.js +29 -276
- package/src/utils/banner.js +4 -25
- package/src/utils/claude-md-injector.js +1 -37
- package/src/utils/claude-settings-manager.js +1 -52
- package/src/utils/file-copier.js +11 -95
- package/src/utils/hooks-installer.js +21 -298
- package/src/utils/skills-installer.js +4 -101
- package/src/utils/version-checker.js +4 -83
- package/framework/commands/morph-proposal.md +0 -9
- package/framework/hooks/git/commit-msg/conventional-commits.sh +0 -33
- package/framework/hooks/git/pre-commit/agents.sh +0 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +0 -64
- package/framework/hooks/git/pre-push/run-tests.sh +0 -44
- package/src/commands/utils/index.js +0 -3
- package/src/lib/detectors/design-system-detector.js +0 -188
- package/src/lib/generators/design-system-generator.js +0 -508
- package/src/lib/specs/old-format.js +0 -68
- package/src/utils/agent-id-mapper.js +0 -11
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MORPH-SPEC Feature Status Command
|
|
3
|
-
*
|
|
4
|
-
* Displays a comprehensive dashboard showing feature progress, phase status,
|
|
5
|
-
* outputs, slices, approvals, and next steps.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* morph-spec status <feature-name>
|
|
9
|
-
* morph-spec status <feature-name> --json
|
|
10
|
-
*
|
|
11
|
-
* Example:
|
|
12
|
-
* morph-spec status user-portal
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
1
|
import chalk from 'chalk';
|
|
16
2
|
import { loadState, getFeature, derivePhase, deriveOutputs } from '../../core/state/state-manager.js';
|
|
17
3
|
import { sliceProgress } from '../../../framework/hooks/shared/slice-progress.js';
|
|
18
4
|
|
|
19
|
-
/**
|
|
20
|
-
* Phase symbols for visual representation
|
|
21
|
-
*/
|
|
22
5
|
const PHASE_SYMBOLS = {
|
|
23
6
|
completed: '✅',
|
|
24
7
|
current: '⏸️',
|
|
@@ -26,9 +9,6 @@ const PHASE_SYMBOLS = {
|
|
|
26
9
|
skipped: '⊘'
|
|
27
10
|
};
|
|
28
11
|
|
|
29
|
-
/**
|
|
30
|
-
* Phase definitions with order
|
|
31
|
-
*/
|
|
32
12
|
const PHASE_ORDER = [
|
|
33
13
|
{ key: 'plan', name: 'FASE 1: PLAN', order: 0 },
|
|
34
14
|
{ key: 'uiux', name: 'FASE 2: UI/UX', order: 1, optional: true },
|
|
@@ -43,18 +23,13 @@ const PHASE_OUTPUTS = {
|
|
|
43
23
|
review: ['verifierReport', 'reviewerReport']
|
|
44
24
|
};
|
|
45
25
|
|
|
46
|
-
/**
|
|
47
|
-
* Calculate phase status (completed, current, pending, skipped)
|
|
48
|
-
*/
|
|
49
26
|
function getPhaseStatus(phaseKey, currentPhase, feature) {
|
|
50
27
|
const phase = PHASE_ORDER.find(p => p.key === phaseKey);
|
|
51
28
|
const current = PHASE_ORDER.find(p => p.key === currentPhase);
|
|
52
29
|
|
|
53
30
|
if (!phase || !current) return 'pending';
|
|
54
31
|
|
|
55
|
-
// Check if phase was skipped (optional phases)
|
|
56
32
|
if (phase.optional && phase.order < current.order) {
|
|
57
|
-
// Check if any outputs were created for this phase
|
|
58
33
|
const hasOutputs = checkPhaseOutputs(phaseKey, feature);
|
|
59
34
|
if (!hasOutputs) return 'skipped';
|
|
60
35
|
}
|
|
@@ -64,17 +39,11 @@ function getPhaseStatus(phaseKey, currentPhase, feature) {
|
|
|
64
39
|
return 'pending';
|
|
65
40
|
}
|
|
66
41
|
|
|
67
|
-
/**
|
|
68
|
-
* Check if phase has any outputs created
|
|
69
|
-
*/
|
|
70
42
|
function checkPhaseOutputs(phaseKey, feature) {
|
|
71
43
|
const outputs = PHASE_OUTPUTS[phaseKey] || [];
|
|
72
44
|
return outputs.some(output => feature.outputs[output]?.created);
|
|
73
45
|
}
|
|
74
46
|
|
|
75
|
-
/**
|
|
76
|
-
* Format phase display with symbol and status
|
|
77
|
-
*/
|
|
78
47
|
function formatPhase(phaseKey, currentPhase, feature, options = {}) {
|
|
79
48
|
const phase = PHASE_ORDER.find(p => p.key === phaseKey);
|
|
80
49
|
const status = getPhaseStatus(phaseKey, currentPhase, feature);
|
|
@@ -96,7 +65,6 @@ function formatPhase(phaseKey, currentPhase, feature, options = {}) {
|
|
|
96
65
|
display = chalk.gray(display);
|
|
97
66
|
}
|
|
98
67
|
|
|
99
|
-
// Add output files if verbose
|
|
100
68
|
if (options.verbose && status !== 'pending' && status !== 'skipped') {
|
|
101
69
|
const outputs = PHASE_OUTPUTS[phaseKey] || [];
|
|
102
70
|
const created = outputs.filter(o => feature.outputs[o]?.created);
|
|
@@ -108,9 +76,6 @@ function formatPhase(phaseKey, currentPhase, feature, options = {}) {
|
|
|
108
76
|
return display;
|
|
109
77
|
}
|
|
110
78
|
|
|
111
|
-
/**
|
|
112
|
-
* Calculate completion percentage
|
|
113
|
-
*/
|
|
114
79
|
function calculateCompletionPercentage(feature) {
|
|
115
80
|
const totalPhases = PHASE_ORDER.filter(p => !p.optional).length;
|
|
116
81
|
const completedPhases = PHASE_ORDER.filter(p => {
|
|
@@ -122,13 +87,9 @@ function calculateCompletionPercentage(feature) {
|
|
|
122
87
|
return Math.round((completedPhases / totalPhases) * 100);
|
|
123
88
|
}
|
|
124
89
|
|
|
125
|
-
/**
|
|
126
|
-
* Get next steps based on current phase
|
|
127
|
-
*/
|
|
128
90
|
function getNextSteps(feature) {
|
|
129
91
|
const steps = [];
|
|
130
92
|
|
|
131
|
-
// Check for pending approvals relevant to current phase
|
|
132
93
|
const phaseApprovalMap = {
|
|
133
94
|
plan: 'plan',
|
|
134
95
|
uiux: 'uiux',
|
|
@@ -147,7 +108,6 @@ function getNextSteps(feature) {
|
|
|
147
108
|
});
|
|
148
109
|
}
|
|
149
110
|
|
|
150
|
-
// Check for missing outputs in current phase
|
|
151
111
|
const requiredOutputs = feature.phase === 'uiux' ? [] : PHASE_OUTPUTS[feature.phase] || [];
|
|
152
112
|
const missingOutputs = requiredOutputs.filter(o => !feature.outputs[o]?.created);
|
|
153
113
|
|
|
@@ -159,7 +119,6 @@ function getNextSteps(feature) {
|
|
|
159
119
|
});
|
|
160
120
|
}
|
|
161
121
|
|
|
162
|
-
// Suggest next phase if current is complete
|
|
163
122
|
const hasApprovalPending = relevantGate && approvalGates[relevantGate] && !approvalGates[relevantGate].approved;
|
|
164
123
|
if (missingOutputs.length === 0 && !hasApprovalPending) {
|
|
165
124
|
const currentPhaseIndex = PHASE_ORDER.findIndex(p => p.key === feature.phase);
|
|
@@ -182,9 +141,6 @@ function getNextSteps(feature) {
|
|
|
182
141
|
return steps;
|
|
183
142
|
}
|
|
184
143
|
|
|
185
|
-
/**
|
|
186
|
-
* Main status command
|
|
187
|
-
*/
|
|
188
144
|
export async function statusCommand(featureName, options = {}) {
|
|
189
145
|
if (!featureName) {
|
|
190
146
|
console.error(chalk.red('✗ Error: Feature name required'));
|
|
@@ -206,7 +162,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
206
162
|
process.exit(1);
|
|
207
163
|
}
|
|
208
164
|
|
|
209
|
-
// Derive phase and outputs from filesystem if not stored in state
|
|
210
165
|
const { join } = await import('path');
|
|
211
166
|
const featurePath = join(process.cwd(), '.morph', 'features', featureName);
|
|
212
167
|
if (!feature.phase) {
|
|
@@ -217,7 +172,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
217
172
|
}
|
|
218
173
|
const slices = sliceProgress(featurePath);
|
|
219
174
|
|
|
220
|
-
// JSON output mode
|
|
221
175
|
if (options.json) {
|
|
222
176
|
const status = {
|
|
223
177
|
feature: featureName,
|
|
@@ -244,18 +198,15 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
244
198
|
return;
|
|
245
199
|
}
|
|
246
200
|
|
|
247
|
-
// Visual dashboard output
|
|
248
201
|
console.log(chalk.cyan('\n┌────────────────────────────────────────────────────────────┐'));
|
|
249
202
|
console.log(chalk.cyan('│ MORPH-SPEC STATUS │'));
|
|
250
203
|
console.log(chalk.cyan('└────────────────────────────────────────────────────────────┘\n'));
|
|
251
204
|
|
|
252
|
-
// Feature info
|
|
253
205
|
console.log(chalk.white.bold(`Feature: ${featureName}`));
|
|
254
206
|
console.log(chalk.gray(`Status: ${feature.status || 'unknown'}`));
|
|
255
207
|
console.log(chalk.gray(`Completion: ${calculateCompletionPercentage(feature)}%`));
|
|
256
208
|
console.log('');
|
|
257
209
|
|
|
258
|
-
// Phase progression
|
|
259
210
|
console.log(chalk.white.bold('Phases:'));
|
|
260
211
|
console.log(chalk.cyan('├─────────────────────────────────────────────────────────────┤'));
|
|
261
212
|
PHASE_ORDER.forEach(phase => {
|
|
@@ -264,7 +215,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
264
215
|
console.log(chalk.cyan('└─────────────────────────────────────────────────────────────┘'));
|
|
265
216
|
console.log('');
|
|
266
217
|
|
|
267
|
-
// Outputs summary
|
|
268
218
|
const totalOutputs = Object.keys(feature.outputs).length;
|
|
269
219
|
const createdOutputs = Object.values(feature.outputs).filter(o => o.created).length;
|
|
270
220
|
console.log(chalk.white.bold(`Outputs: ${createdOutputs}/${totalOutputs} complete`));
|
|
@@ -289,7 +239,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
289
239
|
console.log('');
|
|
290
240
|
}
|
|
291
241
|
|
|
292
|
-
// Approval gates
|
|
293
242
|
if (feature.approvalGates) {
|
|
294
243
|
const gates = Object.entries(feature.approvalGates);
|
|
295
244
|
const approved = gates.filter(([_, g]) => g.approved).length;
|
|
@@ -309,7 +258,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
309
258
|
console.log('');
|
|
310
259
|
}
|
|
311
260
|
|
|
312
|
-
// Next steps
|
|
313
261
|
const nextSteps = getNextSteps(feature);
|
|
314
262
|
if (nextSteps.length > 0) {
|
|
315
263
|
console.log(chalk.white.bold('Next Steps:'));
|
|
@@ -324,7 +272,6 @@ export async function statusCommand(featureName, options = {}) {
|
|
|
324
272
|
console.log(chalk.green('✓ Nada pendente.\n'));
|
|
325
273
|
}
|
|
326
274
|
|
|
327
|
-
// Footer
|
|
328
275
|
console.log(chalk.gray('─'.repeat(60)));
|
|
329
276
|
console.log(chalk.gray('Run with --verbose for detailed output'));
|
|
330
277
|
console.log(chalk.gray('Run with --json for JSON output\n'));
|