@polymorphism-tech/morph-spec 8.47.0 → 9.1.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 +51 -43
- package/README.md +39 -38
- package/bin/morph-spec.js +41 -113
- package/bin/validate.js +1 -147
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +86 -21
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +1 -1
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-preflight.md +2 -3
- package/framework/commands/morph-status.md +4 -4
- package/framework/docs/CLI.md +574 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- 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 +3 -17
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
- package/framework/hooks/claude-code/core/gate-guard.js +9 -78
- 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 +36 -2
- package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
- package/framework/hooks/claude-code/core/state-sync.js +15 -85
- package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
- package/framework/hooks/claude-code/core/validate-completion.js +37 -147
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
- package/framework/hooks/claude-code/core/worktree-context.js +15 -114
- 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.py +55 -41
- package/framework/hooks/package.json +3 -0
- 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 +11 -76
- package/framework/hooks/shared/claim-registry.js +9 -119
- package/framework/hooks/shared/command-tokens.js +168 -44
- package/framework/hooks/shared/comment-rules.js +5 -20
- package/framework/hooks/shared/comment-scanner.js +11 -43
- package/framework/hooks/shared/comment-stripper.js +11 -85
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/errata.js +59 -0
- package/framework/hooks/shared/feature-locator.js +11 -95
- package/framework/hooks/shared/frontend-locations.js +4 -0
- package/framework/hooks/shared/gate-question.js +12 -0
- 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 +14 -72
- 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 +99 -0
- package/framework/hooks/shared/source-files.js +4 -17
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +51 -247
- package/framework/hooks/shared/state-writer.js +9 -54
- 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/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- 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/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -50
- package/framework/skills/README.md +3 -4
- 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 +149 -222
- package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
- package/framework/skills/core/morph-machine/SKILL.md +2 -2
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +137 -299
- package/framework/skills/core/morph-review/SKILL.md +111 -136
- package/framework/skills/core/morph-standards/SKILL.md +27 -39
- package/framework/skills/core/morph-uiux/SKILL.md +94 -152
- package/framework/standards/STANDARDS.json +109 -1219
- package/framework/standards/STANDARDS.meta.json +1319 -0
- 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/evals-with-cache.md +1 -2
- 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 +3 -3
- 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 +7 -7
- 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/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/infrastructure/neon/neon-pgvector.md +5 -5
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/CLAUDE.md.core.template +3 -3
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +15 -179
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/docs/ui-mockups.md +4 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
- 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 +18 -105
- 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 +17 -111
- 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-procs.js +1 -1
- package/src/commands/project/doctor.js +53 -307
- package/src/commands/project/env.js +1 -27
- package/src/commands/project/fleet.js +6 -35
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +8 -68
- package/src/commands/project/install-plugin-cmd.js +0 -1
- package/src/commands/project/setup-infra-cmd.js +2 -1
- package/src/commands/project/stack-scan.js +58 -0
- package/src/commands/project/standards.js +65 -72
- package/src/commands/project/status.js +28 -121
- package/src/commands/project/update.js +31 -223
- package/src/commands/project/worktree.js +109 -883
- package/src/commands/scaffold/scaffold.js +0 -25
- package/src/commands/state/advance.js +65 -120
- package/src/commands/state/approve.js +87 -229
- package/src/commands/state/archive.js +23 -139
- package/src/commands/state/auto-approval.js +65 -0
- package/src/commands/state/create.js +49 -109
- package/src/commands/state/delete.js +11 -63
- package/src/commands/state/finish.js +105 -494
- package/src/commands/state/gate-check.js +74 -183
- package/src/commands/state/gate-decision.js +8 -42
- package/src/commands/state/handoff.js +4 -31
- package/src/commands/state/list.js +21 -91
- package/src/commands/state/report-check.js +134 -338
- package/src/commands/state/retype.js +12 -28
- package/src/commands/validation/index.js +0 -3
- package/src/commands/validation/mutate.js +79 -19
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +52 -216
- package/src/commands/validation/verify.js +45 -160
- package/src/core/paths/output-schema.js +9 -155
- package/src/core/state/feature-identity.js +1 -25
- package/src/core/state/gate-order.js +2 -30
- package/src/core/state/lifecycle-audit.js +8 -100
- package/src/core/state/state-manager.js +32 -395
- 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 +21 -0
- package/src/core/work-types.js +10 -45
- package/src/dashboard/app/App.jsx +1 -8
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
- package/src/dashboard/app/components/CommandPalette.jsx +4 -11
- 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 +3 -9
- package/src/dashboard/app/lib/project.js +0 -12
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/AgentMap.jsx +1 -8
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
- package/src/dashboard/app/pages/Features.jsx +9 -16
- package/src/dashboard/app/pages/Guide.jsx +2 -3
- package/src/dashboard/app/pages/HookInspector.jsx +2 -23
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
- 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 +14 -83
- package/src/dashboard/scanner/agents-scanner.js +1 -23
- package/src/dashboard/scanner/docs-scanner.js +1 -7
- package/src/dashboard/scanner/feature-status.js +2 -5
- package/src/dashboard/scanner/features-scanner.js +92 -113
- 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 +4 -7
- package/src/dashboard/vite-plugin-morph-data.js +5 -19
- 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 +14 -13
- package/src/lib/ci/github-ci.js +9 -37
- package/src/lib/ci/workflow-scaffold.js +2 -10
- package/src/lib/detectors/claude-config-detector.js +13 -74
- package/src/lib/detectors/index.js +8 -59
- 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 +37 -112
- package/src/lib/generators/scaffold-generator.js +5 -101
- package/src/lib/generators/settings-generator.js +11 -122
- 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 +2 -1
- 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 +17 -17
- 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 +2 -6
- package/src/lib/installers/effects.js +8 -93
- package/src/lib/installers/mcp-installer.js +9 -169
- package/src/lib/installers/memory-installer.js +8 -33
- package/src/lib/installers/templates-reconcile.js +5 -60
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/mutation/dotnet-introspection.js +281 -0
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +47 -13
- package/src/lib/plan/artifact-vocabulary.js +40 -0
- package/src/lib/plan/checks.js +208 -0
- package/src/lib/plan/plan-parser.js +204 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/projects/registry.js +7 -44
- package/src/lib/review-reports.js +204 -0
- package/src/lib/risk-detector.js +131 -274
- package/src/lib/specs/adr-index.js +38 -85
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +31 -0
- package/src/lib/specs/gfm-table.js +11 -0
- package/src/lib/specs/revocations.js +31 -102
- package/src/lib/specs/screen-checklist.js +56 -132
- package/src/lib/stack/dotnet-build-ignores.js +43 -0
- package/src/lib/stack/stack-profile.js +1 -28
- package/src/lib/stack/stack-scan.js +260 -0
- package/src/lib/stack-filter.js +4 -27
- package/src/lib/standards/registry.js +37 -0
- package/src/lib/standards/sections.js +47 -0
- package/src/lib/standards/verified-against.js +19 -191
- package/src/lib/tasks/eval-node.js +23 -179
- package/src/lib/tasks/linux-runner.js +18 -142
- package/src/lib/tasks/test-nodes.js +43 -313
- package/src/lib/tasks/test-runner.js +107 -447
- package/src/lib/telemetry/metrics.js +13 -103
- package/src/lib/telemetry/telemetry-reader.js +13 -238
- package/src/lib/telemetry/verify-event.js +4 -34
- 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 +4 -26
- 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 +24 -137
- package/src/lib/validators/reuse/symbol-scanner.js +6 -62
- package/src/lib/validators/traceability-check.js +54 -156
- package/src/lib/validators/validation-runner.js +20 -125
- package/src/lib/validators/verify-runner.js +152 -575
- package/src/lib/work-type-detector.js +5 -67
- package/src/lib/worktree/docker-audit.js +17 -137
- 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 +31 -126
- 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 -138
- package/src/utils/agents-installer.js +92 -272
- package/src/utils/banner.js +4 -25
- package/src/utils/claude-md-injector.js +1 -37
- package/src/utils/claude-settings-manager.js +1 -87
- package/src/utils/file-copier.js +32 -90
- package/src/utils/hooks-installer.js +26 -296
- package/src/utils/skills-installer.js +4 -102
- package/src/utils/version-checker.js +4 -83
- package/framework/commands/morph-proposal.md +0 -57
- package/framework/evals/trace-schema.md +0 -67
- package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
- package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
- package/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/framework/hooks/shared/tasks-validator.js +0 -111
- package/framework/rules/morph-task-tracking.md +0 -54
- package/framework/rules/morph-workflow.md +0 -244
- package/framework/schemas/tasks.schema.json +0 -79
- package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
- package/framework/skills/core/morph-implement/SKILL.md +0 -194
- package/framework/skills/core/morph-proposal/SKILL.md +0 -152
- package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
- package/framework/templates/docs/proposal.md +0 -192
- package/framework/templates/docs/spec.md +0 -57
- package/framework/templates/docs/ui-components.md +0 -52
- package/framework/templates/docs/ui-design-system.md +0 -76
- package/framework/templates/docs/ui-flows.md +0 -167
- package/framework/templates/examples/spec-examples.md +0 -91
- package/framework/templates/feature/decisions.md +0 -124
- package/framework/templates/feature/recap.md +0 -145
- package/framework/templates/tasks.template.json +0 -17
- package/src/commands/state/usecase.js +0 -143
- package/src/commands/tasks/dag.js +0 -181
- package/src/commands/utils/index.js +0 -3
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/detectors/design-system-detector.js +0 -188
- package/src/lib/evaluator-report.js +0 -104
- package/src/lib/generators/design-system-generator.js +0 -508
- package/src/lib/specs/acervo-format.js +0 -70
- package/src/lib/specs/acervo-lifecycle.js +0 -264
- package/src/lib/specs/done-criteria-check.js +0 -200
- package/src/lib/specs/usecase-check.js +0 -301
- package/src/lib/specs/usecase-promoter.js +0 -301
- package/src/lib/specs/usecase-registry.js +0 -237
- package/src/lib/tasks/dispatch-planner.js +0 -319
- package/src/lib/tasks/dotnet-test-introspection.js +0 -632
- package/src/lib/tasks/mermaid-renderer.js +0 -132
- package/src/lib/tasks/task-classifier.js +0 -30
- package/src/lib/tasks/task-parser.js +0 -209
- package/src/lib/tasks/tasks-json-parser.js +0 -296
- package/src/lib/tasks/test-scope.js +0 -597
- package/src/utils/agent-id-mapper.js +0 -11
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: morph-implement
|
|
3
|
-
description: Guia a execução de cada tarefa de implementação com standard e persona adequados
|
|
4
|
-
version: core
|
|
5
|
-
when_to_use: Use quando for iniciar cada task de implementação listada em tasks.json
|
|
6
|
-
user-invocable: false
|
|
7
|
-
cliVersion: "8.47.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# morph-implement
|
|
11
|
-
|
|
12
|
-
## Objetivo
|
|
13
|
-
Executar uma task com o standard e a persona certos, até o `doneCriteria` valer e o
|
|
14
|
-
`verify` da task ficar verde, e registrar o resultado no recap.
|
|
15
|
-
|
|
16
|
-
## Quando invocar
|
|
17
|
-
Ao iniciar cada task de `tasks.json`, antes de escrever código. Normalmente chamada pela
|
|
18
|
-
`morph-apply`, que passa a task atual.
|
|
19
|
-
|
|
20
|
-
## O que fazer
|
|
21
|
-
|
|
22
|
-
1. **Contexto, uma vez por sessão.** Na primeira task da sessão (ou depois de um `/compact`), Read
|
|
23
|
-
em `2-plan/spec.md`, nos use cases que a task referencia (`2-plan/usecases/UC-*.md`) e em
|
|
24
|
-
`2-plan/decisions.md`. Nas tasks seguintes, **não releia por padrão**: o contrato do plano está
|
|
25
|
-
congelado desde o Gate 2. Releia só o trecho que falta para a task corrente.
|
|
26
|
-
|
|
27
|
-
**Correção** (a `morph-apply` devolveu a task com o `feedback` do verify vermelho ou com critério
|
|
28
|
-
não atendido): corrija esses pontos no código existente — não reimplemente.
|
|
29
|
-
|
|
30
|
-
2. **Standard.** `morph-spec standards --find "<domínio da task>"` devolve `id · path · digest`.
|
|
31
|
-
O digest decide; Read só no `.md` escolhido. Task MAF: os `standards/ai-agents/*.md` relevantes
|
|
32
|
-
valem mesmo com docs externas consultadas. Nenhum standard cobre: registre em `decisions.md` e
|
|
33
|
-
siga o critério mais conservador.
|
|
34
|
-
|
|
35
|
-
3. **Persona.** `task.agent` e `task.standards` (carimbados pelo `morph-plan`). Plano legado sem
|
|
36
|
-
`agent`: Read em `.morph/framework/agents.json` e escolha por `domains`. O `**Persona:**` do recap
|
|
37
|
-
registra o mecanismo real: `morph-{id}`, `general-purpose (fallback: {id})` ou `inline ({id})`.
|
|
38
|
-
|
|
39
|
-
4. **Despachar ou não.** Despache (`subagent_type: "morph-{id}"`) quando a task muda de domínio,
|
|
40
|
-
tem effort L/XL, já falhou 3 correções no mesmo ponto, exige ler arquivo > 500 linhas, ou repete
|
|
41
|
-
um padrão > 3 vezes. Inline só para S/M no domínio já carregado. O DAG da `morph-apply` decide
|
|
42
|
-
quantas tasks rodam ao mesmo tempo; este passo decide quem executa cada uma.
|
|
43
|
-
|
|
44
|
-
Tipo `morph-{id}` não registrado: `general-purpose` com o campo `persona` colado no prompt, e
|
|
45
|
-
`dispatch-fallback: general-purpose ({id} não registrado)` nas `notes` da task.
|
|
46
|
-
Template do prompt para `subagent_type: "morph-{id}"` — cole literal, só os campos entre colchetes mudam:
|
|
47
|
-
```
|
|
48
|
-
Implementar [ID]: [title da task]
|
|
49
|
-
|
|
50
|
-
Spec: [description completa do tasks.json]
|
|
51
|
-
Standards: [por standard: `id` + o digest do `standards --find` + as 3-8 regras
|
|
52
|
-
do .md que ESTA task aplica, coladas. O path vai junto só para consulta
|
|
53
|
-
pontual — o sub-agente não relê standards inteiros]
|
|
54
|
-
Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
|
|
55
|
-
— é por aqui que o código existente chega ao sub-agente, que trabalha em
|
|
56
|
-
contexto fresco. O que você já leu entra como `arquivo:linhas` + o trecho]
|
|
57
|
-
Reuso: [task.reuse — `CONCEITO: VEREDITO → alvo`, uma linha por conceito]
|
|
58
|
-
Done quando: [doneCriteria do tasks.json]
|
|
59
|
-
|
|
60
|
-
Antes de criar tipo, componente, hook ou serviço NOVO, verifique se já
|
|
61
|
-
existe: `morph-spec graph explain <nome>` e `graph affected <conceito>
|
|
62
|
-
--uses-only`. Sem grafo (`no-graph`), caia para `grep -rn "<nome>"` e siga —
|
|
63
|
-
a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
|
|
64
|
-
se criar mesmo assim, diga por que em uma linha no relatório.
|
|
65
|
-
|
|
66
|
-
Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
|
|
67
|
-
turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
|
|
68
|
-
turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
|
|
69
|
-
Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
|
|
70
|
-
`ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
|
|
71
|
-
acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
|
|
72
|
-
se lê pelo `Grep` do erro, não inteiro.
|
|
73
|
-
|
|
74
|
-
Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
|
|
75
|
-
shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
|
|
76
|
-
`query-docs`). Impacto e vizinhança de símbolo vêm do grafo
|
|
77
|
-
(`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
|
|
78
|
-
(`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
|
|
79
|
-
|
|
80
|
-
Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
|
|
81
|
-
`///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
|
|
82
|
-
da task. Só o porquê que o código não mostra, em uma linha
|
|
83
|
-
(`architecture-code-comments`). O elo com a pós-condição vai no nome do
|
|
84
|
-
teste. O hook `comment-guard` bloqueia a edição que adiciona história,
|
|
85
|
-
banner ou bloco longo.
|
|
86
|
-
|
|
87
|
-
Contrato do relatório final:
|
|
88
|
-
1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
|
|
89
|
-
encerrar — é o retorno autoritativo, não a sua mensagem final. NÃO chame
|
|
90
|
-
SendMessage.
|
|
91
|
-
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
92
|
-
— todo estado é gravado exclusivamente pelo orquestrador.
|
|
93
|
-
3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
|
|
94
|
-
logo depois do seu retorno), não sua. Escreva os testes pelo orçamento:
|
|
95
|
-
um por pós-condição, um de regressão por bug, variantes numa tabela
|
|
96
|
-
(`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
|
|
97
|
-
red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
|
|
98
|
-
testes UMA vez, em primeiro plano, antes do relatório; se falhar, corrija e rode só os que falharam. Grave a
|
|
99
|
-
saída em arquivo (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
|
|
100
|
-
e leia o arquivo — um pipe troca o exit do teste pelo do último comando.
|
|
101
|
-
Em batch paralelo SEM isolamento, só compile. Com `isolation: "worktree"`,
|
|
102
|
-
o mesmo vale no seu worktree, e o último ato é o commit na branch dele.
|
|
103
|
-
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
104
|
-
volta — fatie antes, não depois.
|
|
105
|
-
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
106
|
-
corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
|
|
107
|
-
uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
|
|
108
|
-
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
109
|
-
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
110
|
-
na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
|
|
111
|
-
siga ou pare, por decisão sua; o relatório final substitui o parcial.
|
|
112
|
-
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
113
|
-
sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
|
|
114
|
-
suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
|
|
115
|
-
plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
|
|
116
|
-
nem espere em laço — diga no relatório o que não rodou.
|
|
117
|
-
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
118
|
-
substituto do relatório e não deve ser chamado.
|
|
119
|
-
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
120
|
-
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
121
|
-
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
122
|
-
|
|
123
|
-
Formato do relatório:
|
|
124
|
-
(1) o que foi feito, em 2-3 frases;
|
|
125
|
-
**Arquivos:** um item `- \`path\`` por arquivo criado ou modificado;
|
|
126
|
-
**Critérios:** cada doneCriteria — atendido (o teste ou `arquivo:linha` que o
|
|
127
|
-
prova) ou não atendido (por quê);
|
|
128
|
-
(4) problemas encontrados e como foram resolvidos.
|
|
129
|
-
```
|
|
130
|
-
**Passo pós-dispatch (seu, ao retomar o controle):** `morph-spec report-check {feature} {taskId} --json`. O veredito do
|
|
131
|
-
relatório e o bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostram o disco que o agente
|
|
132
|
-
deixou. Árvore suja sem explicação ou `markers` não vazio: registre no recap. Com
|
|
133
|
-
`isolation: "worktree"`, depois de ler o relatório rode `morph-spec worktree reap --json`.
|
|
134
|
-
|
|
135
|
-
**Leia `3-implement/reports/[ID].md`** — a mensagem de texto do agente é atalho, nunca a fonte.
|
|
136
|
-
Arquivo ausente é falha de protocolo: registre e complete a partir do que ficou no disco.
|
|
137
|
-
|
|
138
|
-
**`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
|
|
139
|
-
Retome o MESMO agente por `SendMessage`,
|
|
140
|
-
colando `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do
|
|
141
|
-
último `wip`. Nunca marque `done` sobre um parcial.
|
|
142
|
-
|
|
143
|
-
5. **Implementação inline.** Siga o standard e a persona. Ambiguidade não coberta pelo plano:
|
|
144
|
-
registre em `decisions.md` e resolva pelo lado conservador, sem pausar. Testes: as cláusulas 3 e 8
|
|
145
|
-
do template valem para você também.
|
|
146
|
-
|
|
147
|
-
**Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM): rode o
|
|
148
|
-
eval antes do `done`, e só ele. Com nó `runner: "evals"`:
|
|
149
|
-
`morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist` — escopo de
|
|
150
|
-
feature porque no de task o nó `evals` é pulado; `--skip-e2e` porque o stack subiria;
|
|
151
|
-
`--no-persist` porque esta execução é sonda, não prova de gate. Sem nó `evals`, rode o eval direto
|
|
152
|
-
e registre "nenhum nó — execução manual". O arquivo traz: o critério (literal), o nó e o cenário,
|
|
153
|
-
o modelo efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado
|
|
154
|
-
pessoal, e o veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o agente fez; este
|
|
155
|
-
prova, rodando, que a saída atende ao critério.
|
|
156
|
-
|
|
157
|
-
6. **Recap.** Append em `3-implement/recap.md`:
|
|
158
|
-
```markdown
|
|
159
|
-
## T{N} — {title}
|
|
160
|
-
|
|
161
|
-
**Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
|
|
162
|
-
**Persona:** {`morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
|
|
163
|
-
**Files:**
|
|
164
|
-
- `{path}`
|
|
165
|
-
|
|
166
|
-
{2-3 frases}
|
|
167
|
-
```
|
|
168
|
-
Sem standard que cubra: `Standard: ad-hoc (see decisions.md ADR-{N})`. O `validate-completion`
|
|
169
|
-
cobra o bloco.
|
|
170
|
-
|
|
171
|
-
7. **Audite antes do `done`:** `morph-spec report-check {feature} {taskId} --json`. `report-stale` =
|
|
172
|
-
relatório completo e velho (a task seguiu escrevendo depois dele): **não re-despache** — leia
|
|
173
|
-
`observed` (escritas reais, do `events.jsonl`) e atualize o relatório. Demais vereditos:
|
|
174
|
-
`MORPH.md` §6.
|
|
175
|
-
|
|
176
|
-
8. Atualizar `tasks.json` marcando a task como `done` (Edit, só campos mutáveis):
|
|
177
|
-
- `status`: `pending` | `in_progress` | `done` | `skipped` | `blocked`.
|
|
178
|
-
- `outputs` DEVE listar TODO arquivo criado ou modificado pela task, inclusive artefato auxiliar
|
|
179
|
-
fora do plano (factory, seed, config gerada). Arquivo em produção sem dono em `outputs` é falha de
|
|
180
|
-
protocolo que o Gate 3 aponta. Deleções vão em `notes` (string única), nunca em `outputs`.
|
|
181
|
-
- Divergiu do planejado: o porquê em `notes` na mesma edição — o hook exige.
|
|
182
|
-
|
|
183
|
-
9. Quando invocada por `morph-apply`, devolva o controle a ela e não rode a suíte do projeto: o `verify {feature} {task}` é do orquestrador. **Única exceção:** a execução de evidência do passo 5, filtrada ao nó `evals`, com `--skip-e2e` e `--no-persist`. No loop por task o recorte é automático (o `group` escolhe as suítes, os testes de `outputs` estreitam o comando; `--filter` só força a escolha de suítes, `--full` desliga o recorte); a suíte inteira roda no Gate 3 e no CI, sem filtro. Invocada manualmente: siga para a próxima task ready.
|
|
184
|
-
|
|
185
|
-
## Output esperado
|
|
186
|
-
- Código conforme o standard; `3-implement/reports/{taskId}.md` quando despachada
|
|
187
|
-
- `3-implement/evidencias/{taskId}.md` na task que o lista em `outputs`
|
|
188
|
-
- `recap.md` com o bloco da task; `tasks.json` com a task `done`
|
|
189
|
-
- `decisions.md` quando houve decisão não trivial
|
|
190
|
-
|
|
191
|
-
## Referências
|
|
192
|
-
- `morph-spec standards --find` — passo 2
|
|
193
|
-
- `.morph/framework/MORPH.md` §6 — dispatch e contrato do relatório
|
|
194
|
-
- `.morph/framework/CLI.md`, seção "Suítes de teste" — recorte por task
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: morph-proposal
|
|
3
|
-
description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encadeia morph-brainstorming (Gate 1) e morph-plan (Gate 2). Em trust:auto pula gates sem sinais de risco.
|
|
4
|
-
version: core
|
|
5
|
-
when_to_use: Use quando o usuário pedir "use /morph-proposal" ou ao iniciar uma nova feature
|
|
6
|
-
user-invocable: true
|
|
7
|
-
cliVersion: "8.47.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# morph-proposal
|
|
11
|
-
|
|
12
|
-
## Objetivo
|
|
13
|
-
|
|
14
|
-
Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem intervenção do usuário entre os gates quando `trust: "auto"` e sem sinais de risco.
|
|
15
|
-
|
|
16
|
-
## Quando invocar
|
|
17
|
-
|
|
18
|
-
- Usuário pede "use /morph-proposal {feature}" ou "vamos planejar {feature}".
|
|
19
|
-
- Início de qualquer feature nova num projeto morph-spec.
|
|
20
|
-
- Em sessões retomadas, antes de continuar uma feature em progresso, verificar via `.morph/features/{feature-name}/feature.json` (estado autoritativo da feature) se ela já passou pelos Gates.
|
|
21
|
-
|
|
22
|
-
## Argumentos
|
|
23
|
-
|
|
24
|
-
- `{feature-name}` — nome em kebab-case da feature. Se ausente, perguntar via `AskUserQuestion`.
|
|
25
|
-
|
|
26
|
-
## Pré-condições
|
|
27
|
-
|
|
28
|
-
- `.morph/config/config.json` existe (rode `morph-spec init` antes).
|
|
29
|
-
- Stack está definido (padrão: VSA + .NET 10 + MAF + Next.js + Neon).
|
|
30
|
-
|
|
31
|
-
## Fluxo
|
|
32
|
-
|
|
33
|
-
### 0. Roteamento por tipo de trabalho
|
|
34
|
-
|
|
35
|
-
Antes de qualquer trabalho de negócio, classifique o pedido. Se `{feature-name}` ainda não foi determinado, pergunte via `AskUserQuestion` antes desta chamada (ver Argumentos):
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
morph-spec create {feature-name} --request "<pedido do usuário>"
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
(ou `--type <tipo> --description "<o quê/porquê>"` diretamente quando o tipo é óbvio pelo pedido — ex.: o usuário já diz "isso é um hotfix"). O `--request` **serve de semente da descrição**: toda feature nasce com `name` (o slug) e `description` (obrigatória) carimbados. Sem `--request` nem `--description`, o `create` recusa — nada de scaffolds anônimos.
|
|
42
|
-
|
|
43
|
-
- **Classificação `high` confidence** — a feature nasce com o `workType` decidido pelo detector determinístico (keywords: `hotfix` — "produção caiu/urgente/incident/p0"; `bug` — "bug/corrigir/exception/regressão"; `chore` — "typo/rename/bump/config/docs/cleanup"). Prossiga para o branch correspondente abaixo.
|
|
44
|
-
- **Exit 2** (empate `tie` ou nenhum sinal `none`) — o comando sai sem criar a feature e imprime `{ needsDecision, candidates, matched }`. **Você é o roteador**: decida o tipo entre os candidatos e re-rode com `morph-spec create {feature-name} --type <tipo> --request "<pedido do usuário>"` (o `--request` re-passado carimba a descrição). Só use `AskUserQuestion` para o usuário quando o pedido for genuinamente indeterminado — a maioria dos empates o roteador resolve sozinho pelo contexto da conversa.
|
|
45
|
-
|
|
46
|
-
**Branches por tipo** (dimensionamento completo em `MORPH.md` §2.1):
|
|
47
|
-
|
|
48
|
-
- **`hotfix`** → invoque `Skill(morph-hotfix)` passando `{feature-name}` e **ENCERRE** — não siga o restante deste fluxo. A skill cuida de scout, brief, fix cirúrgico, test loop e Gate 3 (sempre humano).
|
|
49
|
-
- **`chore`** → fast-track: os Gates 1 e 2 já nasceram carimbados `policy:chore` no `create`. Escreva um `2-plan/tasks.json` mínimo (1-3 tasks) e invoque `Skill(morph-apply)` diretamente — **exceção documentada** à regra do passo 7 ("não despachar `morph-apply` automaticamente"): não pausar numa mudança óbvia é exatamente o valor do fast-track.
|
|
50
|
-
- **`bug`** → siga para `Skill(morph-brainstorming)` em modo **bug-lean**: produz um `proposal.md` enxuto (repro / diagnóstico / root cause / escopo do fix — não a proposta completa de uma feature nova; **sem critérios de aceite**, que moram na pós-condição do use case) e depois um plano enxuto via `Skill(morph-plan)`. Gates 1 e 2 continuam trust-aware (passos 3 e 6) — só o conteúdo dos artefatos é mais curto.
|
|
51
|
-
- **`feature`** (default — inclui features criadas antes do v8 sem `workType`) → siga o fluxo completo abaixo (passos 1-7): brainstorming → Gate 1 → plan → Gate 2.
|
|
52
|
-
|
|
53
|
-
### 1. Determinar feature name e estado
|
|
54
|
-
|
|
55
|
-
- Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
|
|
56
|
-
- Verificar `.morph/features/{feature-name}/`:
|
|
57
|
-
- Se `0-proposal/proposal.md` existe e tem conteúdo: pular para passo 3.
|
|
58
|
-
- Caso contrário: rode `morph-spec create {feature-name} --description "<resumo do pedido do usuário>"` — cria `.morph/features/{feature-name}/0-proposal/` e o `feature.json` canônico (shape em `.morph/framework/schemas/feature.schema.json`) num passo só, server-side, com `name`+`description` carimbados. A `--description` é **obrigatória** no nascimento (ou `--request`, que a semeia). Não crie a estrutura à mão nem dependa do nascimento implícito via hook no primeiro Write. Depois siga o passo 2.
|
|
59
|
-
|
|
60
|
-
### 2. Invocar `Skill(morph-brainstorming)`
|
|
61
|
-
|
|
62
|
-
Passa o nome da feature. A skill é a **dona da fase de entendimento** — não re-descreva o comportamento dela aqui. Em resumo: varre o ambiente antes de perguntar qualquer coisa (`Skill(morph-stack-scan)` + contexto do projeto + acervo de use cases), monta a **árvore de decisões abertas**, abre com a escolha de **modo de descoberta** (entrevista ou automático — só `feature` e `bug`), detecta divergência entre fontes de design-system (`signals.designSystemDivergence`) e produz `proposal.md` em `.morph/features/{feature}/0-proposal/`. Detalhes em `.claude/skills/morph-brainstorming/SKILL.md`.
|
|
63
|
-
|
|
64
|
-
No **modo entrevista** o Gate 1 pausa sempre — a confirmação do entendimento compartilhado é o gate. O modo escolhido chega ao passo 3 em `gateDecisions.proposal.signals.discoveryMode`.
|
|
65
|
-
|
|
66
|
-
### 3. Gate 1 (trust-aware)
|
|
67
|
-
|
|
68
|
-
A decisão de pausa já foi tomada e persistida pela `morph-brainstorming` (Parte 4): `morph-spec gate-check {feature} proposal` no caminho comum (`shouldPauseGate`; divergência de design-system detectada entra via `--signals`), ou `gate-decision` manual quando `discoveryMode: "interview"` — o único sinal que `shouldPauseGate` não representa. Leia `gateDecisions.proposal` em `feature.json` (ou o output do comando) para `pause`/`reason`.
|
|
69
|
-
|
|
70
|
-
**Se `pause === true`**, apresentar via `AskUserQuestion`:
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
question: "Gate 1 — Proposta de {feature} aprovada? Sinal de risco: {reason}"
|
|
74
|
-
options:
|
|
75
|
-
- { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
|
|
76
|
-
- { label: "preciso ajustar", description: "Apontar mudanças necessárias na proposta" }
|
|
77
|
-
- { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
|
|
78
|
-
header: "Gate 1"
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Aguardar resposta. Se "preciso ajustar", aplicar ajustes e reapresentar o gate.
|
|
82
|
-
|
|
83
|
-
**Se `pause === false`**, exibir summary curto e prosseguir:
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
## Gate 1 (auto-aprovado)
|
|
87
|
-
Feature: {nome}
|
|
88
|
-
Problema: {1 frase}
|
|
89
|
-
Escopo: {incluído} | Excluído: {exclusões}
|
|
90
|
-
Stack: {compliance}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
No caminho manual, o hook `state-sync.js` registra a aprovação automaticamente via PostToolUse quando a `AskUserQuestion` é respondida com "aprovado" (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`) — **atribuindo pela feature nomeada na pergunta**; sem o nome, e com mais de uma feature na árvore, ele recusa a gravar e avisa (aprove então por `morph-spec approve {feature} <gate>`). Em `trust: auto` (sem AskUserQuestion), **aprove via CLI — nunca via Edit à mão de state.json**:
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
morph-spec approve {feature} proposal --mode auto
|
|
97
|
-
# ou, para já aprovar o Gate 1 e criar a pasta 2-plan/ num passo só:
|
|
98
|
-
morph-spec advance {feature}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 3a. Roteamento uiux (após o Gate 1)
|
|
102
|
-
|
|
103
|
-
Critério objetivo em `MORPH.md` §2.1: a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação)?
|
|
104
|
-
|
|
105
|
-
- **Sim** → em vez do `advance {feature}` do passo 3, rode `morph-spec advance {feature} --design` (cria `1-design/`) e invoque `Skill(morph-uiux)`. Ela conduz a fase de design e, com o Gate uiux aprovado, devolve o controle aqui — siga para o passo 4.
|
|
106
|
-
- **Não** → nenhuma ação extra; o `advance {feature}` do passo 3 já criou `2-plan/` direto.
|
|
107
|
-
|
|
108
|
-
### 4. Verificar retomada antes de morph-plan
|
|
109
|
-
|
|
110
|
-
- Se `.morph/features/{feature}/2-plan/spec.md` já existe: pular para passo 6 (Gate 2).
|
|
111
|
-
|
|
112
|
-
### 5. Invocar `Skill(morph-plan)`
|
|
113
|
-
|
|
114
|
-
A skill lê `proposal.md` e produz:
|
|
115
|
-
- `usecases/UC-*.md` — o comportamento, com pós-condições testáveis
|
|
116
|
-
- `spec.md` — especificação técnica, com a seção `## Contrato de implementação`
|
|
117
|
-
- `tasks.json` — task breakdown estruturado validado contra `.morph/framework/schemas/tasks.schema.json`
|
|
118
|
-
- `decisions.md` — apenas se houver decisões não triviais
|
|
119
|
-
|
|
120
|
-
### 6. Gate 2 (trust-aware)
|
|
121
|
-
|
|
122
|
-
Mesma mecânica do passo 3: a decisão já foi tomada e persistida pela `morph-plan` (passo 6) — `morph-spec gate-check {feature} plan` no caminho comum (`shouldPauseGate` sobre `taskCount` do disco; `designSystemDivergence`/`standardsViolations` via `--signals` quando aplicável — não são herdados automaticamente entre gates), ou `gate-decision` manual para risco que nenhuma dessas chaves representa. Leia `gateDecisions.plan` para `pause`/`reason` e apresente com o mesmo template (AskUserQuestion ou auto-aprovação) do passo 3.
|
|
123
|
-
|
|
124
|
-
### 7. Conclusão
|
|
125
|
-
|
|
126
|
-
- Sinalizar ao usuário: "Plano aprovado. Rode `/morph-apply {feature}` (ou peça 'implementar {feature}') para iniciar a execução."
|
|
127
|
-
- Não dispachar `morph-apply` automaticamente — usuário decide quando começar.
|
|
128
|
-
|
|
129
|
-
## Anti-padrões
|
|
130
|
-
|
|
131
|
-
- Não pular o Gate 1 mesmo em trust:auto se houver divergência detectada.
|
|
132
|
-
- Não escrever código nesta fase — apenas artefatos de planejamento.
|
|
133
|
-
- Não perguntar sobre stack — o stack padrão está em MORPH.md.
|
|
134
|
-
- Não rodar o pipeline completo de 5 fases num `chore` ou `bug` óbvio — o Passo 0 existe para dimensionar o trabalho pelo `workType`, não para ser pulado "para simplificar".
|
|
135
|
-
|
|
136
|
-
## Output esperado
|
|
137
|
-
|
|
138
|
-
- `.morph/features/{feature}/0-proposal/proposal.md`
|
|
139
|
-
- `.morph/features/{feature}/1-design/` (se o ramo uiux — passo 3a — foi tomado)
|
|
140
|
-
- `.morph/features/{feature}/2-plan/spec.md`
|
|
141
|
-
- `.morph/features/{feature}/2-plan/tasks.json`
|
|
142
|
-
- Gates 1 e 2 registrados aprovados em `.morph/features/{feature}/feature.json` (autoritativo) — via `morph-spec approve`/`morph-spec advance` em auto, ou via hook state-sync no caminho manual.
|
|
143
|
-
|
|
144
|
-
## Referências
|
|
145
|
-
|
|
146
|
-
- `.morph/framework/MORPH.md` — charter NLH completo
|
|
147
|
-
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
|
|
148
|
-
- `.claude/skills/morph-brainstorming/SKILL.md`
|
|
149
|
-
- `.claude/skills/morph-uiux/SKILL.md` — invocada no passo 3a quando a feature toma o ramo uiux
|
|
150
|
-
- `.claude/skills/morph-plan/SKILL.md`
|
|
151
|
-
- `.claude/skills/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
|
|
152
|
-
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: morph-stack-scan
|
|
3
|
-
description: Varre o codebase existente, detecta stack atual, compara com o stack padrão e registra desvios em stack-scan.md
|
|
4
|
-
version: core
|
|
5
|
-
when_to_use: Use quando uma feature começar em projeto brownfield (codebase já existente)
|
|
6
|
-
user-invocable: true
|
|
7
|
-
cliVersion: "8.47.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# morph-stack-scan
|
|
11
|
-
|
|
12
|
-
## Objetivo
|
|
13
|
-
Identificar o estado real do codebase antes de planejar qualquer feature — garantindo que a implementação não adicione inconsistência a um projeto já existente.
|
|
14
|
-
|
|
15
|
-
## Quando invocar
|
|
16
|
-
Quando o projeto já tem código existente e você precisa entender o estado atual antes de propor uma feature. Normalmente invocado pelo morph-brainstorming, mas pode ser invocado diretamente.
|
|
17
|
-
|
|
18
|
-
## Stack padrão de referência
|
|
19
|
-
|
|
20
|
-
O "Esperado" da comparação do passo 2 é o stack baked-in (runtime .NET 10 + VSA, EF Core/Neon, `Guid.CreateVersion7()`, `sealed`, result pattern, MAF, Next.js/Tailwind/Shadcn, Hangfire) e a lista de padrões proibidos (`Guid.NewGuid()`, classes não-sealed, Service/Manager layer, repository genérico, SQL cru sem justificativa) — regra canônica em `MORPH.md` § "Stack baked-in". Os templates de `stack-scan.md` abaixo (greenfield e brownfield) escrevem essa lista por extenso no artefato da feature, para que quem ler o `stack-scan.md` depois não precise reabrir o `MORPH.md`.
|
|
21
|
-
|
|
22
|
-
## Greenfield short-circuit
|
|
23
|
-
|
|
24
|
-
Antes de despachar Explore, verifique se o projeto é greenfield:
|
|
25
|
-
|
|
26
|
-
1. Use `Glob` para detectar presença de qualquer um destes:
|
|
27
|
-
- `**/*.csproj`
|
|
28
|
-
- `**/*.sln`
|
|
29
|
-
- `package.json` (na raiz)
|
|
30
|
-
- `src/**/*.cs` ou `src/**/*.ts` ou `src/**/*.tsx`
|
|
31
|
-
- `migrations/**/*`
|
|
32
|
-
|
|
33
|
-
2. Se **nenhum** for encontrado, o projeto é greenfield. Produza este `stack-scan.md` em `.morph/features/{feature}/0-proposal/` e retorne sem chamar Explore:
|
|
34
|
-
|
|
35
|
-
```markdown
|
|
36
|
-
# Stack Scan — {feature}
|
|
37
|
-
|
|
38
|
-
**Status:** GREENFIELD (sem código source detectado)
|
|
39
|
-
|
|
40
|
-
## Stack
|
|
41
|
-
Project empty. Aplicar stack padrão de MORPH.md:
|
|
42
|
-
- Backend: .NET 10 + VSA + EF Core + Neon
|
|
43
|
-
- Frontend: Next.js App Router + Tailwind + Shadcn + Framer Motion
|
|
44
|
-
- IA: MAF (quando aplicável à feature)
|
|
45
|
-
- Jobs: Hangfire (apenas se necessário)
|
|
46
|
-
|
|
47
|
-
## Padrões obrigatórios
|
|
48
|
-
- IDs: `Guid.CreateVersion7()`
|
|
49
|
-
- Classes: `sealed` por padrão
|
|
50
|
-
- Erros: Result pattern (`result.Match()`)
|
|
51
|
-
|
|
52
|
-
## Padrões proibidos
|
|
53
|
-
`Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em `decisions.md`.
|
|
54
|
-
|
|
55
|
-
## Recomendação
|
|
56
|
-
Compliance trivial (greenfield). Prosseguir para morph-brainstorming.
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
3. Se algum dos arquivos foi encontrado, o projeto é brownfield — siga para o passo seguinte.
|
|
60
|
-
|
|
61
|
-
## O que fazer (brownfield)
|
|
62
|
-
|
|
63
|
-
0. **Se houver grafo, ele responde a pergunta do repository genérico melhor que o grep.**
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
morph-spec graph status --json # available:false? pule este passo
|
|
67
|
-
morph-spec graph affected IRepository --uses-only --json
|
|
68
|
-
morph-spec graph explain IRepository --json # o registro no DI aparece aqui
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
A pergunta do passo 1 é *"quantos CONSUMIDORES REAIS"*, e é exatamente aí que o grep erra: no ProspectPRO ele aponta **23 arquivos**, mas 20 são interfaces filhas **herdando** o contrato e só **2** são uso real. Quem lê 23 conclui "está em uso, não é código morto" — e a conclusão certa é a oposta. `--uses-only` exclui `inherits`/`implements`/`extends` e devolve os 2. O `explain` do mesmo símbolo entrega de brinde a outra metade da pergunta: onde ele está registrado no DI.
|
|
72
|
-
|
|
73
|
-
**Fallback:** grafo ausente (`no-graph`), símbolo não encontrado ou ambíguo — siga com o `Explore` e o grep do passo 1, e **registre no `stack-scan.md` que a contagem veio do grep**, que superestima consumidores por não separar herança de uso.
|
|
74
|
-
|
|
75
|
-
1. Despache um `Explore` subagent para varrer o codebase:
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
Varredura de stack compliance — morph-stack-scan.
|
|
79
|
-
|
|
80
|
-
Leia os seguintes arquivos/pastas e reporte o que encontrar:
|
|
81
|
-
|
|
82
|
-
BACKEND:
|
|
83
|
-
- Todos os .csproj: qual TargetFramework? Quais PackageReferences relevantes?
|
|
84
|
-
- Procure por: Guid.NewGuid() vs Guid.CreateVersion7(), sealed classes, result pattern vs exceptions
|
|
85
|
-
- Estrutura de src/: segue feature-folder (VSA)? Tem Controllers? Tem repository genérico (IRepository<T>/IUnitOfWork)? Se tiver, reporte como código morto: liste onde está registrado no DI e quantos consumidores reais existem em src/ e tests/
|
|
86
|
-
- Migrations/: qual ORM? Neon/Postgres ou outro banco?
|
|
87
|
-
- Microsoft.Agents.* ou Microsoft.Extensions.AI nos PackageReferences?
|
|
88
|
-
|
|
89
|
-
FRONTEND:
|
|
90
|
-
- package.json: Next.js? Tailwind? Framer Motion? Shadcn/ui?
|
|
91
|
-
- Estrutura de app/ ou pages/: App Router ou Pages Router?
|
|
92
|
-
|
|
93
|
-
JOBS:
|
|
94
|
-
- Hangfire nos PackageReferences?
|
|
95
|
-
|
|
96
|
-
Para cada item acima, responda: presente/ausente, e se presente qual versão ou padrão.
|
|
97
|
-
Não faça sugestões — apenas reporte o que existe.
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
2. Com os resultados da varredura, compare com o stack padrão item por item e classifique cada desvio:
|
|
101
|
-
|
|
102
|
-
| Severidade | Critério |
|
|
103
|
-
|------------|---------|
|
|
104
|
-
| **Bloqueante** | Runtime diferente (.NET 8 ou anterior), ORM diferente (Dapper puro sem EF Core), banco diferente (MySQL, SQL Server) |
|
|
105
|
-
| **Alto** | `Guid.NewGuid()` generalizado, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`) presente — código morto: migração é deletar a pasta `Repository/` + as 2 linhas de DI, SQL cru generalizado, exceptions como fluxo de controle |
|
|
106
|
-
| **Médio** | Classes não-sealed, Pages Router em vez de App Router, biblioteca de UI diferente |
|
|
107
|
-
| **Baixo** | Versões de pacotes desatualizadas mas compatíveis |
|
|
108
|
-
|
|
109
|
-
3. Produza `stack-scan.md` em `.morph/features/{feature}/0-proposal/`:
|
|
110
|
-
|
|
111
|
-
```markdown
|
|
112
|
-
# Stack Scan — {feature}
|
|
113
|
-
|
|
114
|
-
## Resultado
|
|
115
|
-
{Em compliance / Desvios detectados}
|
|
116
|
-
|
|
117
|
-
## Stack detectado
|
|
118
|
-
| Camada | Detectado | Esperado | Status |
|
|
119
|
-
|--------|-----------|----------|--------|
|
|
120
|
-
| Runtime | .NET X | .NET 10 | ✓ / ✗ |
|
|
121
|
-
...
|
|
122
|
-
|
|
123
|
-
## Desvios (ordenados por severidade)
|
|
124
|
-
### Bloqueantes
|
|
125
|
-
- {desvio}: {onde foi encontrado} — impacto: {o que quebra se não migrar} — esforço: {estimativa}
|
|
126
|
-
|
|
127
|
-
### Não bloqueantes
|
|
128
|
-
- {desvio}: {onde foi encontrado} — migração: {como resolver} — esforço: {estimativa}
|
|
129
|
-
|
|
130
|
-
## Recomendação
|
|
131
|
-
{Em compliance — prosseguir para morph-brainstorming}
|
|
132
|
-
{ou: Migração necessária antes de prosseguir — ver Desvios acima}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
4. Se houver desvios bloqueantes ou altos, pergunte via `AskUserQuestion`: "Esta migração deve ser incluída na feature atual ou tratada numa feature separada?" A resposta é decisão humana — registre-a na seção "Compliance de stack" do `proposal.md` (produzido pela `morph-brainstorming`), não num artefato novo: a lista de desvios com impacto/esforço já vive no `stack-scan.md` acima.
|
|
136
|
-
|
|
137
|
-
5. Se não houver desvios (ou apenas baixos): informe "codebase em compliance com o stack padrão" e prossiga para morph-brainstorming ou morph-plan conforme o contexto.
|
|
138
|
-
|
|
139
|
-
## Output esperado
|
|
140
|
-
- `.morph/features/{feature}/0-proposal/stack-scan.md` — resultado da varredura, com desvios ordenados por severidade e esforço estimado
|
|
141
|
-
- Decisão documentada: incluir migração nesta feature ou separar (registrada no proposal.md pela morph-brainstorming)
|
|
142
|
-
|
|
143
|
-
## Referências
|
|
144
|
-
- `.morph/framework/MORPH.md` — seção 4 (Standards), seção 2 (Fases)
|
|
145
|
-
- `.claude/skills/morph-brainstorming/SKILL.md` — fluxo greenfield/brownfield
|