@polymorphism-tech/morph-spec 8.46.0 → 9.0.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 +53 -44
- package/README.md +3 -4
- package/bin/morph-spec.js +38 -55
- package/bin/validate.js +5 -134
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +2 -2
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +75 -18
- package/framework/commands/create-umbraco-lp.md +2 -0
- package/framework/commands/migrate-lp-to-umbraco.md +2 -0
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +2 -2
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +17 -203
- package/framework/commands/morph-media.md +3 -0
- package/framework/commands/morph-preflight.md +7 -31
- package/framework/commands/morph-proposal.md +2 -50
- package/framework/commands/morph-status.md +3 -3
- package/framework/commands/morph-troubleshoot.md +2 -14
- package/framework/docs/CLI.md +585 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- package/framework/hooks/claude-code/core/comment-guard.js +1 -1
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
- package/framework/hooks/claude-code/core/gate-guard.js +2 -11
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
- package/framework/hooks/claude-code/core/state-sync.js +17 -19
- package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
- package/framework/hooks/claude-code/core/validate-completion.js +33 -97
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
- package/framework/hooks/claude-code/core/worktree-context.js +5 -4
- package/framework/hooks/claude-code/statusline.py +55 -41
- package/framework/hooks/package.json +3 -0
- package/framework/hooks/shared/activity-logger.js +1 -1
- package/framework/hooks/shared/build-check.js +10 -6
- package/framework/hooks/shared/command-tokens.js +169 -0
- package/framework/hooks/shared/comment-rules.js +1 -1
- package/framework/hooks/shared/comment-scanner.js +10 -23
- package/framework/hooks/shared/comment-stripper.js +1 -1
- package/framework/hooks/shared/e2e-check.js +67 -31
- package/framework/hooks/shared/errata.js +72 -0
- package/framework/hooks/shared/feature-locator.js +1 -1
- package/framework/hooks/shared/frontend-locations.js +6 -0
- package/framework/hooks/shared/gate-question.js +18 -0
- package/framework/hooks/shared/phase-utils.js +15 -32
- package/framework/hooks/shared/slice-progress.js +118 -0
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +61 -87
- package/framework/hooks/shared/state-writer.js +3 -3
- package/framework/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- package/framework/rules/ai-agents-standards.md +18 -16
- package/framework/rules/asaas-standards.md +3 -1
- package/framework/rules/csharp-standards.md +10 -8
- package/framework/rules/data-standards.md +5 -5
- package/framework/rules/dotnet-templates.md +1 -1
- package/framework/rules/frontend-standards.md +4 -2
- package/framework/rules/gsap-standards.md +10 -5
- package/framework/rules/hangfire-standards.md +3 -1
- package/framework/rules/infrastructure-standards.md +4 -2
- package/framework/rules/neon-auth-standards.md +3 -1
- package/framework/rules/neon-standards.md +6 -4
- package/framework/rules/nextjs-standards.md +13 -11
- package/framework/rules/nextjs-templates.md +1 -1
- package/framework/rules/resend-standards.md +3 -1
- package/framework/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -52
- package/framework/skills/README.md +4 -5
- package/framework/skills/core/create-umbraco-lp/SKILL.md +3 -3
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +3 -3
- package/framework/skills/core/morph-apply/SKILL.md +150 -223
- package/framework/skills/core/morph-hotfix/SKILL.md +34 -43
- package/framework/skills/core/morph-machine/SKILL.md +4 -4
- package/framework/skills/core/morph-media/SKILL.md +3 -3
- package/framework/skills/core/morph-plan/SKILL.md +138 -300
- package/framework/skills/core/morph-review/SKILL.md +112 -137
- package/framework/skills/core/morph-standards/SKILL.md +29 -41
- package/framework/skills/core/morph-uiux/SKILL.md +78 -153
- package/framework/standards/STANDARDS.json +90 -1219
- package/framework/standards/STANDARDS.meta.json +1305 -0
- package/framework/standards/ai-agents/evals-with-cache.md +2 -3
- package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
- package/framework/standards/ai-agents/modalities-speech-to-text.md +36 -26
- package/framework/standards/ai-agents/prompt-sources.md +6 -4
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +67 -39
- package/framework/standards/ai-agents/setup.md +2 -2
- package/framework/standards/ai-agents/structured-output.md +1 -1
- package/framework/standards/ai-agents/sweet-spot.md +1 -1
- package/framework/standards/architecture/code-comments.md +8 -8
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +18 -9
- package/framework/standards/backend/api/validation.md +135 -47
- package/framework/standards/backend/database/postgresql/database.md +11 -7
- package/framework/standards/backend/database/vector-search-rag.md +207 -324
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +14 -8
- package/framework/standards/backend/dotnet/result-pattern.md +40 -6
- package/framework/standards/backend/dotnet/scalar-ui.md +13 -7
- package/framework/standards/backend/dotnet/scrutor.md +1 -1
- package/framework/standards/backend/dotnet/testing.md +1 -1
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +7 -7
- package/framework/standards/backend/integrations/asaas/asaas-api.md +309 -165
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +134 -154
- package/framework/standards/data/nosql/cache/redis.md +120 -44
- package/framework/standards/data/nosql/cosmos-db.md +114 -71
- package/framework/standards/frontend/design-system/animations.md +1 -1
- package/framework/standards/frontend/design-system/naming.md +1 -1
- package/framework/standards/frontend/nextjs/motion-patterns.md +45 -29
- package/framework/standards/frontend/nextjs/naming-conventions.md +1 -1
- package/framework/standards/infrastructure/docker/coolify-deploy.md +8 -6
- package/framework/standards/infrastructure/neon/neon-pgvector.md +120 -75
- package/framework/standards/infrastructure/neon/neon-setup.md +53 -31
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +6 -170
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +2 -2
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +1 -1
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +27 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +2 -2
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +1 -1
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/infrastructure/docker/coolify.template.json +3 -3
- package/framework/templates/infrastructure/github/README.md +2 -1
- package/framework/templates/infrastructure/github/workflows/deploy-coolify.yml.hbs +2 -1
- 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/e2e/e2e.js +2 -2
- package/src/commands/observability/cost.js +18 -60
- package/src/commands/observability/telemetry.js +3 -5
- package/src/commands/project/doctor-procs.js +1 -1
- package/src/commands/project/doctor.js +9 -9
- package/src/commands/project/fleet.js +4 -4
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +6 -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 +79 -25
- package/src/commands/project/status.js +29 -69
- package/src/commands/project/update.js +33 -19
- package/src/commands/project/worktree.js +1 -1
- package/src/commands/state/advance.js +62 -46
- package/src/commands/state/approve.js +95 -138
- package/src/commands/state/archive.js +20 -84
- package/src/commands/state/auto-approval.js +68 -0
- package/src/commands/state/create.js +28 -1
- package/src/commands/state/delete.js +1 -1
- package/src/commands/state/finish.js +11 -23
- package/src/commands/state/gate-check.js +86 -95
- package/src/commands/state/gate-decision.js +6 -4
- package/src/commands/state/handoff.js +1 -1
- package/src/commands/state/list.js +9 -9
- package/src/commands/state/report-check.js +157 -311
- package/src/commands/state/retype.js +9 -3
- package/src/commands/validation/mutate.js +77 -14
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +60 -135
- package/src/commands/validation/verify.js +41 -82
- package/src/core/paths/output-schema.js +20 -67
- package/src/core/state/gate-order.js +5 -6
- package/src/core/state/lifecycle-audit.js +2 -2
- package/src/core/state/state-manager.js +17 -98
- package/src/core/templates/template-registry.js +2 -2
- package/src/core/templates/template-seed.js +22 -0
- package/src/core/work-types.js +10 -10
- package/src/dashboard/app/App.jsx +0 -2
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
- package/src/dashboard/app/components/CommandPalette.jsx +7 -8
- package/src/dashboard/app/components/EntityLink.jsx +1 -2
- package/src/dashboard/app/components/Markdown.jsx +1 -1
- package/src/dashboard/app/components/Sidebar.jsx +1 -2
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
- package/src/dashboard/app/lib/phases.js +2 -4
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
- package/src/dashboard/app/pages/Features.jsx +9 -9
- package/src/dashboard/app/pages/Guide.jsx +2 -2
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
- package/src/dashboard/app/pages/RulesMap.jsx +3 -3
- package/src/dashboard/app/pages/SkillsLibrary.jsx +3 -3
- package/src/dashboard/app/pages/Standards.jsx +1 -1
- package/src/dashboard/scanner/activity-scanner.js +6 -16
- package/src/dashboard/scanner/agents-scanner.js +1 -1
- package/src/dashboard/scanner/docs-scanner.js +5 -23
- package/src/dashboard/scanner/features-scanner.js +95 -60
- package/src/dashboard/scanner/index.js +0 -2
- package/src/dashboard/scanner/project-api.js +1 -1
- package/src/dashboard/scanner/rules-scanner.js +15 -10
- package/src/dashboard/scanner/skills-scanner.js +2 -3
- package/src/dashboard/scanner/standards-scanner.js +2 -1
- package/src/lib/ci/ci-verify.js +17 -1
- package/src/lib/ci/github-ci.js +1 -1
- package/src/lib/detectors/index.js +3 -8
- package/src/lib/generators/handoff-generator.js +34 -65
- package/src/lib/generators/settings-generator.js +11 -89
- package/src/lib/git/evidence-staleness.js +1 -1
- package/src/lib/git/tree-fingerprint.js +19 -7
- package/src/lib/git/tree-state.js +2 -2
- package/src/lib/heavy/cleanup.js +1 -5
- package/src/lib/installers/memory-installer.js +6 -8
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +46 -9
- package/src/lib/plan/artifact-vocabulary.js +60 -0
- package/src/lib/plan/checks.js +234 -0
- package/src/lib/plan/plan-parser.js +209 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/review-reports.js +222 -0
- package/src/lib/risk-detector.js +134 -135
- package/src/lib/specs/adr-index.js +50 -69
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +44 -0
- package/src/lib/specs/gfm-table.js +17 -0
- package/src/lib/specs/old-format.js +68 -0
- package/src/lib/specs/revocations.js +37 -95
- package/src/lib/specs/screen-checklist.js +18 -17
- package/src/lib/stack/dotnet-build-ignores.js +47 -0
- package/src/lib/stack/stack-profile.js +1 -1
- package/src/lib/stack/stack-scan.js +267 -0
- package/src/lib/standards/registry.js +43 -0
- package/src/lib/standards/sections.js +58 -0
- package/src/lib/tasks/eval-node.js +4 -12
- package/src/lib/tasks/test-nodes.js +1 -74
- package/src/lib/tasks/test-runner.js +75 -117
- package/src/lib/telemetry/metrics.js +8 -69
- package/src/lib/telemetry/telemetry-reader.js +5 -118
- package/src/lib/telemetry/verify-event.js +5 -7
- package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
- package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
- package/src/lib/validators/reuse/reuse-validator.js +24 -48
- package/src/lib/validators/reuse/symbol-scanner.js +2 -4
- package/src/lib/validators/traceability-check.js +85 -129
- package/src/lib/validators/validation-runner.js +8 -88
- package/src/lib/validators/verify-runner.js +134 -301
- package/src/lib/worktree/docker-audit.js +1 -2
- package/src/lib/worktree/fleet-scanner.js +25 -38
- package/src/scripts/setup-infra.js +42 -22
- package/src/utils/agents-installer.js +92 -13
- package/src/utils/claude-settings-manager.js +0 -35
- package/src/utils/file-copier.js +34 -6
- package/src/utils/hooks-installer.js +16 -9
- package/src/utils/skills-installer.js +1 -2
- package/framework/commands/commit.md +0 -166
- 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/rubrics/backend.json +0 -41
- package/framework/rubrics/default.json +0 -36
- package/framework/rubrics/frontend.json +0 -36
- 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/project/validate.js +0 -97
- 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/dashboard/app/pages/Rubrics.jsx +0 -97
- package/src/dashboard/scanner/rubrics-scanner.js +0 -12
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/evaluator-report.js +0 -91
- 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/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/lib/validators/architecture/architecture-validator.js +0 -270
- package/src/lib/validators/architecture/index.js +0 -7
- package/src/lib/validators/css/css-validator.js +0 -340
- package/src/lib/validators/css/index.js +0 -7
- package/src/lib/validators/design-system/design-system-validator.js +0 -237
- package/src/lib/validators/design-system/index.js +0 -7
- package/src/lib/validators/score-aggregator.js +0 -244
- package/src/lib/validators/ui/index.js +0 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +0 -422
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: morph-brainstorming
|
|
3
|
-
description: Entende o negócio, os usuários e a arquitetura antes de qualquer planejamento técnico. Varre o ambiente primeiro, monta a árvore de decisões abertas e abre com a escolha de modo de descoberta (entrevista uma-pergunta-por-vez ou automático). Para projetos existentes, detecta desvios de stack e propõe plano de compliance.
|
|
4
|
-
version: core
|
|
5
|
-
when-to-invoke: ao receber um novo request de feature, antes de morph-plan
|
|
6
|
-
user-invokable: true
|
|
7
|
-
cliVersion: "8.46.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# morph-brainstorming
|
|
11
|
-
|
|
12
|
-
## Objetivo
|
|
13
|
-
Garantir que o planejamento técnico parta de entendimento real do negócio e do contexto técnico existente — não de suposições. Output é o `proposal.md` aprovado pelo Gate 1.
|
|
14
|
-
|
|
15
|
-
## Quando invocar
|
|
16
|
-
Ao iniciar uma nova feature — antes de qualquer especificação técnica ou planejamento.
|
|
17
|
-
|
|
18
|
-
## Stack padrão (baked in)
|
|
19
|
-
|
|
20
|
-
O harness conhece o stack por padrão (backend .NET 10 + VSA + EF Core/Neon, IA via MAF, frontend Next.js/Tailwind/Shadcn) e a lista de padrões proibidos (`Guid.NewGuid()`, classes não-sealed, Service/Manager layer, repository genérico, SQL cru). **Não pergunte sobre tecnologia a menos que haja ambiguidade real** — stack nunca entra na árvore de decisões. Regra canônica: `MORPH.md` § "Stack baked-in".
|
|
21
|
-
|
|
22
|
-
## Modo bug-lean (`workType: bug`)
|
|
23
|
-
|
|
24
|
-
Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Conflitos com o acervo**, sem as seções de negócio completas.
|
|
25
|
-
|
|
26
|
-
Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
|
|
27
|
-
|
|
28
|
-
## O que fazer
|
|
29
|
-
|
|
30
|
-
### Parte 0 — Varredura (antes de qualquer pergunta)
|
|
31
|
-
|
|
32
|
-
Fato não se pergunta. Antes de levar a primeira pergunta ao usuário, levante o que o ambiente já responde:
|
|
33
|
-
|
|
34
|
-
1. Invoque `Skill(morph-stack-scan)`. A skill:
|
|
35
|
-
- Curto-circuita em projetos greenfield (sem source files) — retorna relatório vazio.
|
|
36
|
-
- Em brownfield, varre stack atual (.csproj, package.json, migrations), padrões (Guid.NewGuid vs Guid.CreateVersion7, sealed, result pattern), features existentes.
|
|
37
|
-
- Produz `.morph/features/{feature}/0-proposal/stack-scan.md`.
|
|
38
|
-
|
|
39
|
-
2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/`, o **acervo de use cases** em `.morph/specs/usecases/` e o **índice de ADRs ativos** em `.morph/specs/adrs/` (um arquivo por ADR, se existir). O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
|
|
40
|
-
|
|
41
|
-
O acervo tem ciclo de vida: UC com `status: superseded` **não é o comportamento vigente** — o vigente é o `superseded_by`, e `scope` (quando existe) diz onde o antigo ainda vale. Decisão vigente é a do índice; os `decisions.md` de `.morph/archive/` são **história, não instrução** — abra um só para entender por que algo é como é, nunca para decidir.
|
|
42
|
-
|
|
43
|
-
3. **Conflitos com o acervo — avise, não entreviste.** Para cada UC vigente, ADR do índice ou documento de `.morph/context/` que o pedido novo **contradiz**:
|
|
44
|
-
- **Avise o usuário** — uma linha por conflito no resumo que abre a Parte 2 (fonte, o que ela diz, o que o pedido muda). Aviso, não pergunta.
|
|
45
|
-
- **Pedido explícito sobre o ponto → vale o mais novo.** Registre a escolha na coluna **Decisão** da seção de conflitos (o que muda, o que o antigo ainda cobre) e siga. Só entra na árvore (Parte 1) o conflito que o pedido deixa **ambíguo** — "o admin passa a Geist" não diz nada sobre a vitrine, então a vitrine é decisão; o admin não é.
|
|
46
|
-
- Todo conflito vai para a seção **Conflitos com o acervo** do `proposal.md` (Parte 4). A `2-plan/` só abre depois do Gate 1, então é a `morph-plan` que transforma cada decisão pelo novo em ADR no `decisions.md` e em linha de revogação no `spec.md` (§3) — é essa linha que o `finish` aplica ao acervo.
|
|
47
|
-
|
|
48
|
-
4. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, **reescreva o corpo** de `.morph/context/design-system.md` com a fonte escolhida — a seção que descrevia a antiga passa a descrever a nova, e o valor que ainda vale num escopo diz o escopo. O changelog guarda **só data e motivo**, nunca o valor novo: quem lê só o corpo precisa receber a resposta de hoje.
|
|
49
|
-
|
|
50
|
-
5. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
|
|
51
|
-
|
|
52
|
-
### Parte 1 — Árvore de decisões abertas
|
|
53
|
-
|
|
54
|
-
Enumere **só o que a varredura não respondeu**. Uma decisão entra na árvore quando (a) muda o escopo, o comportamento ou a arquitetura da feature, e (b) o ambiente não a resolve.
|
|
55
|
-
|
|
56
|
-
Ordene por dependência: decisão que **poda** outras vem primeiro. "O fluxo é síncrono ou assíncrono?" antecede "qual é a política de retry" — a primeira resposta pode eliminar a segunda inteira.
|
|
57
|
-
|
|
58
|
-
Publique a **árvore de decisões** ao usuário antes de perguntar qualquer coisa. Ela é o sinal de progresso da entrevista e a base da recomendação de modo na Parte 2.
|
|
59
|
-
|
|
60
|
-
### Parte 2 — Pergunta de abertura (modo de descoberta)
|
|
61
|
-
|
|
62
|
-
Aplica-se a `workType: feature` e `bug`. **`chore` e `hotfix` não passam por aqui** — nascem com os Gates 1 e 2 carimbados `policy:{tipo}` e começam direto em `implement`.
|
|
63
|
-
|
|
64
|
-
Faça **uma** `AskUserQuestion` apresentando a árvore e recomendando um modo. A recomendação sai do tamanho e do acoplamento da árvore: muitas decisões abertas, ou decisões que dependem umas das outras → recomende **entrevista**; árvore rasa ou já respondida pela varredura → recomende **automático**. A opção recomendada vai em primeiro lugar, com o sufixo `(Recomendado)` no label.
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
question: "Antes de começar {feature}: entrevista ou automático? Encontrei {n} decisões abertas: {resumo da árvore}"
|
|
68
|
-
header: "Descoberta"
|
|
69
|
-
options:
|
|
70
|
-
- { label: "{modo recomendado} (Recomendado)", description: "{por que a árvore recomenda este modo}" }
|
|
71
|
-
- { label: "{o outro modo}", description: "{o que muda na prática}" }
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Parte 3 — Entendimento
|
|
75
|
-
|
|
76
|
-
**Modo entrevista.** Percorra a árvore, **uma pergunta por chamada** de `AskUserQuestion` — perguntas em lote desorientam e impedem que uma resposta pode ramos. Regras:
|
|
77
|
-
|
|
78
|
-
- Toda pergunta traz **resposta recomendada**, como primeira opção, marcada `(Recomendado)`.
|
|
79
|
-
- Cada resposta risca, poda ou abre ramos; mostre a árvore atualizada quando ela mudar de forma.
|
|
80
|
-
- Fato descoberto no ambiente nunca vira pergunta. As **decisões** são do usuário; os **fatos** são seus.
|
|
81
|
-
- Termina quando a árvore zera. Então apresente o **entendimento compartilhado** (problema, escopo com exclusões, usuários e fluxos, riscos) — a confirmação dele é o Gate 1, que **pausa sempre** neste modo.
|
|
82
|
-
- O usuário pode encerrar a entrevista a qualquer momento; o que ficou aberto vira exclusão explícita de escopo no `proposal.md`.
|
|
83
|
-
|
|
84
|
-
**Modo automático.** Até 4 perguntas via `AskUserQuestion` cobrindo o que a árvore deixou aberto:
|
|
85
|
-
- Qual problema de negócio esta feature resolve?
|
|
86
|
-
- Quem são os usuários afetados e quais são os fluxos críticos deles?
|
|
87
|
-
- Qual é o critério de sucesso — como saberemos que a feature está pronta?
|
|
88
|
-
- Há integrações externas, dependências de outras features ou restrições de prazo?
|
|
89
|
-
|
|
90
|
-
Árvore vazia → nenhuma pergunta. O Gate 1 segue trust-aware (regras do MORPH.md §5).
|
|
91
|
-
|
|
92
|
-
**Em `workType: bug`**, a árvore é de **repro, diagnóstico e comportamento do sistema** — não de negócio. Em modo automático vale o bug-lean: no máximo 1 pergunta de repro, e só se o pedido original não deixar claro.
|
|
93
|
-
|
|
94
|
-
### Parte 4 — Produção do proposal.md
|
|
95
|
-
|
|
96
|
-
1. Produza `proposal.md` em `.morph/features/{feature}/0-proposal/` com:
|
|
97
|
-
- **Problema:** o que está sendo resolvido e para quem (máx. 2 parágrafos)
|
|
98
|
-
- **Escopo:** o que está incluído e o que está explicitamente excluído — registre se a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação): é o fato que decide o roteamento para o ramo uiux na `morph-proposal` (critério objetivo em `MORPH.md` §2.1)
|
|
99
|
-
- **Usuários e fluxos críticos:** quem usa e qual é o caminho principal
|
|
100
|
-
- **Stack:** confirme o stack padrão ou documente desvios aprovados
|
|
101
|
-
- **Riscos e dependências:** o que pode dar errado, o que esta feature depende
|
|
102
|
-
- **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
|
|
103
|
-
- **Conflitos com o acervo:** os conflitos da Parte 0 (passo 3), numa tabela `Fonte | O que diz hoje | O que o pedido muda | Decisão` — ou `Nenhum conflito encontrado.`. A seção existe sempre, também no bug-lean: ausente, ela diz que a checagem não rodou (o `validate-feature` avisa)
|
|
104
|
-
|
|
105
|
-
**Não escreva critérios de aceite aqui.** O comportamento verificável mora nos **use cases**, destilados pela `morph-plan` na fase seguinte (`2-plan/usecases/UC-{nn}-{slug}.md`), onde cada pós-condição precisa ser observável em teste e chega literal ao `doneCriteria` das tasks. O `proposal.md` responde **o quê e por quê**; os use cases respondem **como o sistema se comporta**. Duplicar aqui produz duas fontes que divergem no primeiro ajuste.
|
|
106
|
-
|
|
107
|
-
**Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Conflitos com o acervo** — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
|
|
108
|
-
|
|
109
|
-
Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
|
|
110
|
-
|
|
111
|
-
2. Apresente o Gate 1 segundo o modo de descoberta e o trust mode.
|
|
112
|
-
|
|
113
|
-
**Modo entrevista** (Parte 2) é a única exceção genuína: pausa sempre, e `shouldPauseGate` não tem esse conceito — `discoveryMode` não está entre as chaves que `gate-check --signals` aceita sobrescrever. Registre direto, sem `gate-check`:
|
|
114
|
-
```
|
|
115
|
-
morph-spec gate-decision {feature} proposal --pause true --reason "modo entrevista — entendimento compartilhado confirmado pelo usuário" --signals '{"discoveryMode":"interview"}'
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Fora do modo entrevista** (o caminho comum), rode `morph-spec gate-check {feature} proposal [--json]` — lê `trust` de `.morph/config/config.json`, decide via `shouldPauseGate` e persiste `gateDecisions.proposal` com timestamp server-side, imprimindo `pause`/`reason`/`signals`. Se a Parte 0 detectou divergência de design-system (leitura semântica — o `gate-check` não a vê sozinho no disco), repasse-a: `designSystemDivergence` é uma das poucas chaves que `--signals` aceita sobrescrever aqui:
|
|
119
|
-
```
|
|
120
|
-
morph-spec gate-check {feature} proposal --signals '{"designSystemDivergence":true}'
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
**Nunca edite `feature.json` à mão** (o Edit manual colide com o hook state-sync — erro "file modified since read"). Os dois comandos gravam `gateDecisions.proposal = { pause, reason, signals, trust, decidedAt }` no mesmo lugar (shape canônico em `.morph/framework/schemas/feature.schema.json`); o hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com a decisão persistida.
|
|
124
|
-
|
|
125
|
-
**Se `pause === true`** (manual mode OU risco detectado em auto), use `AskUserQuestion`:
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
question: "Gate 1 — Proposta de {nome} aprovada?{ reason ? ' Sinal de risco: ' + reason : '' }"
|
|
129
|
-
header: "Gate 1"
|
|
130
|
-
options:
|
|
131
|
-
- { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
|
|
132
|
-
- { label: "preciso ajustar", description: "Apontar mudanças necessárias antes de prosseguir" }
|
|
133
|
-
- { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Aguardar resposta. Se "preciso ajustar", aplique e reapresente.
|
|
137
|
-
|
|
138
|
-
**Se `pause === false`** (auto-aprovação), exibir summary curto e prosseguir sem aguardar:
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
## Gate 1 (auto-aprovado)
|
|
142
|
-
|
|
143
|
-
**Feature:** {nome}
|
|
144
|
-
**Problema:** {1 frase}
|
|
145
|
-
**Escopo:** {incluído} | Excluído: {exclusões}
|
|
146
|
-
**Stack:** {compliance}
|
|
147
|
-
**Riscos:** {principal} (sinais detectados: nenhum)
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (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} proposal`). Em modo auto sem AskUserQuestion, aprove via `morph-spec approve {feature} proposal --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta 2-plan/) — nunca via Edit à mão de state.json.
|
|
151
|
-
|
|
152
|
-
## Output esperado
|
|
153
|
-
- `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack" e os conflitos com o acervo listados em "Conflitos com o acervo"
|
|
154
|
-
- Gate 1 apresentado e aprovado
|
|
155
|
-
|
|
156
|
-
## Referências
|
|
157
|
-
- `.morph/framework/MORPH.md` — seções 1 (Papéis), 2 (Fases), 5 (Gates), Trust Mode
|
|
158
|
-
- `morph-spec standards --find "<query>"` — para referência de standards relevantes à stack (ver `morph-standards`)
|
|
159
|
-
- `.claude/skills/morph-stack-scan/SKILL.md` — invocada na Parte 0 (varredura), antes de qualquer pergunta
|
|
160
|
-
- `.morph/framework/MORPH.md` §5 — regras de pausa do Gate 1 (trust mode)
|
|
161
|
-
- `.morph/specs/usecases/` e `.morph/specs/adrs/` — o acervo vigente (UC `superseded` e `decisions.md` arquivado não são instrução); lidos na Parte 0
|
|
@@ -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-invoke: ao iniciar cada task de implementação listada em tasks.json
|
|
6
|
-
user-invokable: false
|
|
7
|
-
cliVersion: "8.46.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-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
|
|
6
|
-
user-invokable: true
|
|
7
|
-
cliVersion: "8.46.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)
|