@polymorphism-tech/morph-spec 7.9.4 → 8.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 +2 -2
- package/README.md +31 -2
- package/bin/morph-spec.js +50 -2
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +38 -1
- package/docs/QUICKSTART.md +60 -1
- package/framework/CLAUDE.md +13 -2
- package/framework/MORPH.md +38 -2
- package/framework/agents.json +22 -3
- package/framework/commands/commit.md +166 -166
- package/framework/commands/morph-hotfix.md +39 -0
- package/framework/commands/morph-infra.md +215 -215
- package/framework/commands/morph-preflight.md +205 -205
- package/framework/commands/morph-troubleshoot.md +124 -124
- package/framework/hooks/README.md +25 -10
- package/framework/hooks/claude-code/core/gate-guard.js +4 -2
- package/framework/hooks/claude-code/core/loop-detect.js +2 -1
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +14 -5
- package/framework/hooks/claude-code/core/tasks-json-guard.js +4 -2
- package/framework/hooks/claude-code/core/validate-completion.js +1 -1
- package/framework/hooks/claude-code/core/worktree-context.js +160 -0
- package/framework/hooks/claude-code/statusline.py +679 -679
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/activity-logger.js +160 -160
- package/framework/hooks/shared/build-check.js +2 -2
- package/framework/hooks/shared/hook-response.js +17 -5
- package/framework/hooks/shared/payload-utils.js +42 -0
- package/framework/hooks/shared/state-reader.js +22 -2
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rubrics/backend.json +41 -41
- package/framework/rules/ai-agents-standards.md +45 -45
- package/framework/rules/dotnet-templates.md +86 -86
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +27 -27
- package/framework/rules/neon-standards.md +25 -25
- package/framework/rules/nextjs-standards.md +20 -20
- package/framework/rules/nextjs-templates.md +40 -40
- package/framework/schemas/feature.schema.json +95 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +39 -8
- package/framework/skills/core/morph-brainstorming/SKILL.md +9 -1
- package/framework/skills/core/morph-eval/SKILL.md +6 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +136 -0
- package/framework/skills/core/morph-implement/SKILL.md +8 -4
- package/framework/skills/core/morph-plan/SKILL.md +5 -1
- package/framework/skills/core/morph-proposal/SKILL.md +24 -1
- package/framework/skills/core/morph-review/SKILL.md +3 -2
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +275 -275
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +0 -62
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/index.js +13 -13
- package/src/commands/mcp/mcp-setup.js +519 -519
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +4 -2
- package/src/commands/project/init.js +46 -2
- package/src/commands/project/update.js +5 -3
- package/src/commands/project/worktree.js +1005 -46
- package/src/commands/state/advance.js +17 -2
- package/src/commands/state/approve.js +18 -1
- package/src/commands/state/create.js +158 -14
- package/src/commands/state/retype.js +126 -0
- package/src/commands/state/score.js +4 -0
- package/src/commands/tasks/dag.js +32 -0
- package/src/commands/validation/index.js +1 -0
- package/src/commands/validation/validate-feature.js +33 -5
- package/src/commands/validation/verify.js +190 -0
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +35 -10
- package/src/core/templates/template-renderer.js +477 -477
- package/src/core/work-types.js +79 -0
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/LiveState.jsx +11 -1
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/hooks-scanner.js +41 -41
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/scanner/standards-scanner.js +26 -26
- package/src/dashboard/scanner/state-scanner.js +42 -0
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/metrics-aggregator.js +56 -56
- package/src/lib/agents/metrics-calculator.js +125 -125
- package/src/lib/agents/output-collector.js +73 -73
- package/src/lib/detectors/claude-config-detector.js +152 -152
- package/src/lib/detectors/design-system-detector.js +231 -231
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +639 -639
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/index.js +13 -13
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/installers/memory-installer.js +1 -1
- package/src/lib/risk-detector.js +16 -0
- package/src/lib/tasks/dispatch-planner.js +122 -4
- package/src/lib/tasks/mermaid-renderer.js +132 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-runner.js +27 -6
- package/src/lib/validators/architecture/architecture-validator.js +259 -259
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/packages/package-validator.js +347 -347
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +349 -349
- package/src/lib/validators/verify-runner.js +322 -0
- package/src/lib/work-type-detector.js +143 -0
- package/src/scripts/setup-infra.js +32 -5
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +10 -6
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +43 -0
- package/src/utils/hooks-installer.js +41 -11
- package/src/utils/skills-installer.js +174 -174
- package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/src/lib/tasks/wave-resolver.js +0 -353
|
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# create-umbraco-lp
|
|
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# migrate-lp-to-umbraco
|
|
@@ -4,7 +4,7 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
@@ -50,6 +50,8 @@ O comando analisa `dependencies`, `group` e `effort` das tasks pendentes e impri
|
|
|
50
50
|
3. **Raízes independentes (fan-out na largura).** Tasks 100% independentes (`dependencies: []`). **≥ 3 raízes com effort M ou maior** → dispachar essas raízes em **paralelo**, depois cair em sequencial para o resto.
|
|
51
51
|
4. Caso contrário: **sequencial puro** com auto-advance.
|
|
52
52
|
|
|
53
|
+
> O `dag` também imprime uma recomendação de **isolamento**: se dois fluxos paralelos planejam escrever no mesmo path (colisão de `outputs`), ele reporta `isolation.recommended: "worktree"` — nesse caso siga a §3b-w em vez da §3b.
|
|
54
|
+
|
|
53
55
|
> **Peso de esforço:** a decisão é ponderada por `effort` (S=1, M=2, L=4, XL=8). **Raízes e fluxos compostos só de tasks S não ganham dispatch próprio** — overhead > trabalho. O comando os lista como `inline` (você os executa no modo sequencial) ou os agrupa num **único** agente quando são muitos. O cap de **4 agentes simultâneos** (anti-padrão abaixo) vale para ambas as formas. Se um fluxo de domínio é uma cadeia longa, despache o **fluxo inteiro** a um sub-agent (que executa a cadeia em ordem internamente) — um agente por fluxo, não um agente por task.
|
|
54
56
|
|
|
55
57
|
> **DAG × gatilho de effort — decisões ortogonais que coexistem:** a decisão deste comando governa o **paralelismo ENTRE tasks** (quantos sub-agents ao mesmo tempo: fluxos/raízes independentes em batch). O gatilho de effort/domínio de `morph-implement` §4 governa o **dispatch INDIVIDUAL** de cada task quando ela chega ao topo do loop sequencial. `DAG: sequencial` significa "uma task por vez, na ordem" — **NÃO significa "tudo inline"**. Exemplo: cadeia única backend de 12 tasks → o DAG decide sequencial; T7 tem effort L → ao chegar em T7, o orquestrador a despacha **sozinha** para `morph-dotnet-senior` e aguarda o retorno (um agente por vez); T8 (S, mesmo domínio já carregado) roda inline. As duas regras nunca conflitam: o DAG decide *quantos ao mesmo tempo*, o gatilho de effort decide *quem executa cada task*.
|
|
@@ -79,7 +81,16 @@ while (true):
|
|
|
79
81
|
while attempt < 3:
|
|
80
82
|
attempt += 1
|
|
81
83
|
invoke Skill(morph-implement) with task
|
|
82
|
-
(no attempt > 1: passar o feedback priorizado
|
|
84
|
+
(no attempt > 1: passar o feedback priorizado da tentativa anterior como input)
|
|
85
|
+
|
|
86
|
+
// CÓDIGO ANTES DO JUIZ — barreira determinística e barata (build+testes+validadores).
|
|
87
|
+
run: morph-spec verify {feature} {task.id} --json
|
|
88
|
+
if verify.status == 'fail':
|
|
89
|
+
// vermelho: feedback determinístico direto ao loop, SEM gastar o juiz LLM.
|
|
90
|
+
feedback = verify.feedback // usado como input do próximo attempt
|
|
91
|
+
continue // conta como tentativa; não invoca morph-eval sobre código que não builda/não passa
|
|
92
|
+
|
|
93
|
+
// verde: o juiz avalia só o que o código não pega (arquitetura, contratos, qualidade).
|
|
83
94
|
result = invoke Skill(morph-eval) with implementation output
|
|
84
95
|
if result.score > best.score: best = result
|
|
85
96
|
// Persista o score no feature.json autoritativo — torna o evalScore um signal
|
|
@@ -102,6 +113,8 @@ while (true):
|
|
|
102
113
|
options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
|
|
103
114
|
```
|
|
104
115
|
|
|
116
|
+
> **Verify vermelho consome uma tentativa** do loop (≤3) e devolve `feedback[]` acionável (erros de build, falhas de teste, issues de validador). O `morph-eval` NUNCA é invocado sobre código que não passou no verify — o juiz julga arquitetura/contratos/qualidade, o que o código determinístico não pega sozinho. Código roda antes, grátis; o juiz gasta tokens só no que sobra.
|
|
117
|
+
|
|
105
118
|
> **Por que loop e não pausa:** MORPH.md §0 manda auto-avançar entre tasks. Score baixo numa task individual é um problema de qualidade que o modelo deve **corrigir sozinho**, não delegar ao humano no meio da implementação. A pausa só existe quando o loop de correção se esgota (3 tentativas) — o "escape" do modelo autônomo. O trust mode não muda esse loop: ele governa os **gates** (proposal/plan/review), não o ciclo de correção intra-task.
|
|
106
119
|
|
|
107
120
|
### 3b. Modo Paralelo (para o subset independente)
|
|
@@ -139,9 +152,14 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
139
152
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
140
153
|
(TaskCreate/TaskUpdate) — todo estado (status de task, scores, gates) é
|
|
141
154
|
gravado exclusivamente pelo orquestrador.
|
|
142
|
-
3.
|
|
143
|
-
|
|
144
|
-
|
|
155
|
+
3. Verificação condicional ao isolamento:
|
|
156
|
+
- Batch SEM isolamento (working tree compartilhada): NÃO rode build/test da
|
|
157
|
+
suíte compartilhada — edições concorrentes quebram o build umas das outras;
|
|
158
|
+
a verificação é do orquestrador, uma vez, pós-batch (`morph-spec verify`).
|
|
159
|
+
- Batch COM isolamento (você recebeu `isolation: "worktree"`): rode build/test
|
|
160
|
+
DENTRO do seu worktree; commite seu trabalho na branch do worktree como
|
|
161
|
+
penúltimo ato (antes do SendMessage); reporte a branch + status de build no
|
|
162
|
+
relatório; NUNCA faça merge nem toque na árvore principal.
|
|
145
163
|
|
|
146
164
|
Retorne no content do SendMessage:
|
|
147
165
|
- sumário das mudanças
|
|
@@ -152,10 +170,10 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
152
170
|
|
|
153
171
|
> Este template é deliberadamente paritário com o template sequencial em `morph-implement` §4: ambos despacham o **subagent registrado do domínio (`morph-{id}`)** com standard escopado e as mesmas cláusulas de protocolo. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
|
|
154
172
|
|
|
155
|
-
> **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): despache com `isolation: "worktree"
|
|
173
|
+
> **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): siga a §3b-w abaixo em vez desta seção — despache com `isolation: "worktree"`, cada agente trabalha numa working tree própria e o orquestrador integra ao final.
|
|
156
174
|
|
|
157
175
|
Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/SubagentStop) bloqueia uma vez o encerramento de um subagent despachado que não chamou SendMessage, com a instrução da cláusula 1 — o ciclo cobrar-esperar deixa de ser o caminho normal. **Fallback: se mesmo assim um agente ficar idle sem entregar o relatório, cobre-o via SendMessage e registre a falha de protocolo no recap.** Assim que o relatório de um agente chegar (SendMessage como teammate-message), **libere a sessão imediatamente** — chame `TaskStop(task_id: <id/nome do agente retornado pelo dispatch>)` antes de seguir para o próximo agente. Não espere o idle-detector do harness: sem esse `TaskStop`, a sessão fica pendurada minutos até o harness marcá-la idle sozinho e injetar um `idle_notification` vazio de volta nesta sessão. Trate falha do TaskStop (agente já finalizado sozinho) como não-fatal. Depois, sequencialmente:
|
|
158
|
-
- **Rodar
|
|
176
|
+
- **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature) — os agentes não a rodaram (cláusula 3). Vermelho: use `verify.feedback` para corrigir/redespachar ANTES de qualquer morph-eval. (Com isolamento por worktree, cada agente já rodou o verify dentro do seu worktree; o orquestrador roda o verify compartilhado UMA vez após o merge — ver §3b-w.)
|
|
159
177
|
- Para cada relatório retornado:
|
|
160
178
|
- Aplicar `Skill(morph-eval)`.
|
|
161
179
|
- Gravar o score: `morph-spec score {feature} {taskId} {score} --dims {a},{c},{q},{t}`.
|
|
@@ -164,6 +182,18 @@ Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/Subag
|
|
|
164
182
|
|
|
165
183
|
Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
|
|
166
184
|
|
|
185
|
+
### 3b-w. Batch isolado por worktree (quando o dag recomenda)
|
|
186
|
+
|
|
187
|
+
Quando o `morph-spec dag {feature}` reporta `isolation.recommended: "worktree"` (dois fluxos paralelos planejam escrever no mesmo path — colisão de `outputs`), despache cada fluxo com o parâmetro `isolation: "worktree"` do tool Agent. Cada agente trabalha numa working tree própria; build/test rodam lá dentro sem colidir.
|
|
188
|
+
|
|
189
|
+
1. **Dispatch:** mesmo `subagent_type: "morph-{id}"` e standards de §3b, mais `isolation: "worktree"`. Se a stack for Node e faltar `node_modules` no worktree, o agente roda `morph-spec worktree link` (fail-open) antes de testar; se ainda impossível, reporta "verificação: não executada" (o verify pós-merge cobre). O agente commita na branch do worktree e reporta a branch.
|
|
190
|
+
2. **Integração (orquestrador, após todos os relatórios + `TaskStop`):** faça o merge de cada branch reportada, uma por vez, na ordem de chegada — `git merge --no-ff <branch>`. Conflito → `git merge --abort`, marque a task de volta a `pending` com nota "merge conflict — reexecutar sequencial", siga para a próxima branch. Os paths em conflito são exatamente os de `isolation.collisions` do dag.
|
|
191
|
+
3. **Pós-merge:** rode `morph-spec verify {feature} --json` UMA vez (o merge é o novo ponto de integração — verificação compartilhada obrigatória), depois `morph-eval` + `morph-spec score` por relatório, como em §3b.
|
|
192
|
+
4. **Cleanup:** `git worktree remove` + `git branch -d` das branches integradas + `git worktree prune` (fail-open). Branches não integradas ficam e são registradas no recap com o motivo.
|
|
193
|
+
5. **Agente morto no meio:** se commitou, a branch sobrevive (retomável); senão, a task volta a `pending` na lane sequencial. Registre a falha de protocolo no recap.
|
|
194
|
+
|
|
195
|
+
> Anti-padrões: não misture unidades isoladas e não-isoladas no mesmo batch; o subagent nunca faz merge (integração é exclusiva do orquestrador).
|
|
196
|
+
|
|
167
197
|
### 4. Conclusão de tasks
|
|
168
198
|
|
|
169
199
|
Quando `getPendingTasks(data).length === 0`:
|
|
@@ -222,7 +252,8 @@ O comando grava `gateDecisions.review = { pause, reason, signals, trust, decided
|
|
|
222
252
|
- `framework/skills/core/morph-implement/SKILL.md`
|
|
223
253
|
- `framework/skills/core/morph-eval/SKILL.md`
|
|
224
254
|
- `framework/skills/core/morph-review/SKILL.md`
|
|
225
|
-
- `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort)
|
|
255
|
+
- `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort), incluindo recomendação de isolamento (`isolation.recommended: "worktree"`)
|
|
256
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores (código antes do juiz)
|
|
226
257
|
- `morph-spec score {feature} {task} {score} [--dims a,c,q,t]` — grava taskScores no feature.json com timestamp server-side
|
|
227
258
|
- `morph-spec gate-decision {feature} {gate} --pause {bool} [--reason ...] [--signals ...]` — grava gateDecisions no feature.json com timestamp server-side (shape em `.morph/framework/schemas/feature.schema.json`)
|
|
228
259
|
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber um novo request de feature, antes de morph-plan
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-brainstorming
|
|
@@ -29,6 +29,12 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
29
29
|
|
|
30
30
|
**Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions sem result pattern, 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`.
|
|
31
31
|
|
|
32
|
+
## Modo bug-lean (`workType: bug`)
|
|
33
|
+
|
|
34
|
+
Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto: pule as 4 perguntas de negócio da Parte 1 e faça **no máximo 1 pergunta de repro** via `AskUserQuestion` (como reproduzir, em qual ambiente) — só se isso não estiver claro no pedido original. O `stack-scan` (Parte 2) continua rodando normalmente, o diagnóstico precisa do contexto técnico. O `proposal.md` (Parte 3) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Critérios de aceite**, sem as perguntas de negócio completas.
|
|
35
|
+
|
|
36
|
+
Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
|
|
37
|
+
|
|
32
38
|
## O que fazer
|
|
33
39
|
|
|
34
40
|
### Parte 1 — Entendimento de negócio
|
|
@@ -71,6 +77,8 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
71
77
|
- **Riscos e dependências:** o que pode dar errado, o que esta feature depende
|
|
72
78
|
- **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
|
|
73
79
|
|
|
80
|
+
**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 **Critérios de aceite** (condição verificável de que o bug foi corrigido) — sem as seções de negócio completas do fluxo `feature`.
|
|
81
|
+
|
|
74
82
|
Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
|
|
75
83
|
|
|
76
84
|
5. Apresente o Gate 1 segundo trust mode.
|
|
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
|
|
6
6
|
user-invokable: false
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-eval
|
|
@@ -17,10 +17,14 @@ O objetivo não é punir — é identificar o que melhorar antes de seguir adian
|
|
|
17
17
|
Após concluir uma tarefa ou ao finalizar a fase de implementação.
|
|
18
18
|
Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
19
19
|
|
|
20
|
+
**Somente após `morph-spec verify {feature} {task}` verde** (a `morph-apply` garante isso no loop §3a). O verify é a barreira determinística (build+testes+validadores); esta skill julga o que o código não pega: arquitetura, contratos, qualidade, cobertura qualitativa.
|
|
21
|
+
|
|
20
22
|
> **Escopo de fase (Gate 3):** a avaliação da feature inteira NÃO é feita por quem implementou — a `morph-review` despacha a persona `evaluator` de `agents.json` (contexto fresco, sem autoria; recebe mandate + diff + saída real dos testes) usando esta skill como guia. O eval por task pode ser inline; o score composto do Gate 3 vem sempre do avaliador independente.
|
|
21
23
|
|
|
22
24
|
## O que fazer
|
|
23
25
|
|
|
26
|
+
0. Confirme que o `morph-spec verify` da task está verde (a morph-apply passa o resultado; numa invocação manual, rode `morph-spec verify {feature} {task} --json`). Se estiver vermelho, NÃO avalie — devolva o `feedback[]` do verify ao loop de correção.
|
|
27
|
+
|
|
24
28
|
1. Identifique o escopo da avaliação: tarefa única ou fase completa.
|
|
25
29
|
|
|
26
30
|
2. Para cada dimensão, leia a rubrica correspondente em `.morph/framework/evals/rubrics/`:
|
|
@@ -48,6 +52,7 @@ Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
|
48
52
|
- Score persistido em `taskScores` via `morph-spec score` (o trace é gerado automaticamente pelo hook `trace-autogen`)
|
|
49
53
|
|
|
50
54
|
## Referências
|
|
55
|
+
- `morph-spec verify {feature} [task] --json` — barreira determinística (build+testes+validadores) que precede esta skill
|
|
51
56
|
- `.morph/framework/evals/rubrics/architecture.md` — rubrica de arquitetura (30%)
|
|
52
57
|
- `.morph/framework/evals/rubrics/contracts.md` — rubrica de contratos (25%)
|
|
53
58
|
- `.morph/framework/evals/rubrics/code-quality.md` — rubrica de qualidade (25%)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morph-hotfix
|
|
3
|
+
description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de produção com prioridade máxima em velocidade, com aprovação humana obrigatória antes do ship.
|
|
4
|
+
version: core
|
|
5
|
+
when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
|
|
6
|
+
user-invokable: true
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# morph-hotfix
|
|
11
|
+
|
|
12
|
+
## Objetivo
|
|
13
|
+
|
|
14
|
+
Resolver uma queda ou bug crítico de produção o mais rápido possível — prioridade é velocidade, não elegância — mantendo aprovação humana obrigatória antes do ship. É o pipeline dimensionado por `workType: hotfix` (MORPH.md §2.1): scout → fix cirúrgico → aprovação humana → test loop → ship.
|
|
15
|
+
|
|
16
|
+
## Quando invocar
|
|
17
|
+
|
|
18
|
+
- Usuário roda `/morph-hotfix {feature}` diretamente.
|
|
19
|
+
- `Skill(morph-proposal)` classifica o pedido como `hotfix` no Passo 0 de roteamento e invoca esta skill.
|
|
20
|
+
- Usuário diz "produção caiu", "hotfix", "urgente", "incident", "P0" — sinais que o detector determinístico de `morph-spec create --request` já reconhece.
|
|
21
|
+
|
|
22
|
+
## Argumentos
|
|
23
|
+
|
|
24
|
+
- `{feature-name}` — nome em kebab-case da feature. Se ausente, perguntar via `AskUserQuestion`.
|
|
25
|
+
|
|
26
|
+
## Fluxo
|
|
27
|
+
|
|
28
|
+
### 1. Nascimento da feature
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
morph-spec create {feature} --type hotfix
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Carimba os gates `proposal` e `plan` como `approvedBy: "policy:hotfix"` e cria as pastas `0-proposal/`, `2-plan/`, `3-implement/` num passo só — a feature já nasce em `implement` (fase derivada é gate-aware). Se a feature já existe, siga adiante sem recriar.
|
|
35
|
+
|
|
36
|
+
### 2. Scout — mapa do território (obrigatório)
|
|
37
|
+
|
|
38
|
+
Despache o scout com o sintoma reportado, antes de qualquer fix:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
subagent_type: "morph-scout"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback nas notes da task**.
|
|
45
|
+
|
|
46
|
+
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) — não escreve código. Inclua as 3 cláusulas de protocolo obrigatório no prompt (template literal em `morph-implement` §4 / `morph-apply` §3b): ato final = relatório via `SendMessage` para `main` como a ÚLTIMA tool call do turno, sem texto ou tool call depois; não tocar `tasks.json`/`feature.json`/`state.json` nem o board de sessão; sem build/test da suíte compartilhada em batch paralelo.
|
|
47
|
+
|
|
48
|
+
Ao receber o mapa via `SendMessage`, **libere a sessão imediatamente**: `TaskStop(task_id: <id/nome retornado pelo dispatch>)` (trate falha como não-fatal).
|
|
49
|
+
|
|
50
|
+
### 3. Hotfix brief (`0-proposal/proposal.md`)
|
|
51
|
+
|
|
52
|
+
Escreva o brief curto (~20 linhas) reutilizando o nome canônico `proposal.md`:
|
|
53
|
+
|
|
54
|
+
- **Sintoma** — o que está quebrado, em produção, agora.
|
|
55
|
+
- **Root cause** — o que o scout localizou.
|
|
56
|
+
- **Blast radius** — o que mais pode quebrar com o fix.
|
|
57
|
+
- **Plano do fix** — a mudança mínima que resolve o sintoma.
|
|
58
|
+
|
|
59
|
+
### 4. Plano mínimo (`2-plan/tasks.json`)
|
|
60
|
+
|
|
61
|
+
Escreva um `tasks.json` mínimo validado contra `framework/schemas/tasks.schema.json`:
|
|
62
|
+
|
|
63
|
+
- `T1` — o fix.
|
|
64
|
+
- `T2` — verify/regressão do blast radius.
|
|
65
|
+
|
|
66
|
+
Isso liga trace/score/dag de graça (o hook `trace-autogen` gera o trace a partir do primeiro write de `tasks.json`) — não pule esta escrita mesmo sob pressão de tempo.
|
|
67
|
+
|
|
68
|
+
### 5. Fix cirúrgico
|
|
69
|
+
|
|
70
|
+
Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` conforme `MORPH.md` §6 se a task cruzar domínio ou tiver esforço L/XL. Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
|
|
71
|
+
|
|
72
|
+
Aplique `morph-eval` com foco em correção: pese `contracts.md` e `test-coverage.md` mais que `architecture.md` — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
|
|
73
|
+
|
|
74
|
+
### 6. Test loop no blast radius
|
|
75
|
+
|
|
76
|
+
Rode a cadeia determinística focada na(s) task(s) do fix, não uma suíte ad-hoc:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
morph-spec verify {feature} {task} --json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Use `--skip-tests`/`--skip-build` quando fizer sentido para velocidade (ex.: iterar rápido no build antes de rodar a suíte completa), mas o `T2` de verify/regressão do passo 4 precisa fechar verde antes do Gate 3. Capture a saída real dos testes no `recap.md` — não descreva "testes passaram" sem colar a evidência.
|
|
83
|
+
|
|
84
|
+
### 7. Gate 3 — SEMPRE humano
|
|
85
|
+
|
|
86
|
+
O hotfix tem `forcedPauseGates: ['review']` (`src/core/work-types.js`) — o Gate 3 pausa **sempre**, mesmo em `trust: auto`. Persista a decisão antes de apresentar:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
morph-spec gate-decision {feature} review --pause true --reason "hotfix: aprovação humana obrigatória" --signals '{"workType":"hotfix","evalScore":X}'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Escreva `4-review/review-report.md` curto: diff do fix + evidência real de teste (saída do `verify` do passo 6). Depois, **`AskUserQuestion` SEMPRE**:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
question: "Gate 3 — Hotfix de {feature} pronto para ship?"
|
|
96
|
+
header: "Gate 3"
|
|
97
|
+
options:
|
|
98
|
+
- { label: "aprovado, ship", description: "Aceitar o fix e liberar para produção" }
|
|
99
|
+
- { label: "preciso ajustar", description: "Apontar correções antes de fechar" }
|
|
100
|
+
- { label: "rollback", description: "Desfazer o fix — voltar ao estado anterior" }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**NUNCA `morph-spec approve {feature} review --mode auto`** — o CLI recusa explicitamente essa combinação (`src/commands/state/approve.js`: `gateName === 'review' && feature.workType === 'hotfix' && approvedBy === 'auto'` é bloqueado) porque `forcedPauseGates` sobrepõe qualquer trust mode. Em contexto headless (sem `AskUserQuestion` disponível), a resposta textual "aprovado" do usuário é registrada pelo hook `state-sync` como `approvedBy: "manual"` — nunca `"auto"`.
|
|
104
|
+
|
|
105
|
+
### 8. Pós-gate (o "test loop → ship" de `MORPH.md` §2.1)
|
|
106
|
+
|
|
107
|
+
- Rode a suíte completa uma vez: `morph-spec verify {feature}` (sem escopo de task — cobertura da feature inteira, agora que o Gate 3 está aprovado).
|
|
108
|
+
- Sinalize ao usuário: commit do fix e `morph-spec archive {feature}` (ou `morph-spec worktree finish {feature}` se a feature nasceu em worktree — ver `MORPH.md` §2.2) estão prontos.
|
|
109
|
+
- Não arquive automaticamente — usuário decide quando.
|
|
110
|
+
|
|
111
|
+
## Anti-padrões
|
|
112
|
+
|
|
113
|
+
- Não pular o scout — mesmo sob pressão, o mapa de blast radius evita um segundo incidente causado pelo próprio fix.
|
|
114
|
+
- Não auto-aprovar o Gate 3 — nunca tente `morph-spec approve {feature} review --mode auto` num hotfix; o backstop server-side existe exatamente para isso.
|
|
115
|
+
- Não "fazer do jeito certo" às custas da velocidade — refatoração, cobertura extra, ou hardening que não bloqueia o sintoma atual vira item no roadmap-fora-hotfix, não neste diff.
|
|
116
|
+
- Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no review-report.
|
|
117
|
+
|
|
118
|
+
## Output esperado
|
|
119
|
+
|
|
120
|
+
- `.morph/features/{feature}/0-proposal/proposal.md` — hotfix brief (sintoma/root cause/blast radius/plano)
|
|
121
|
+
- `.morph/features/{feature}/2-plan/tasks.json` — T1 (fix) + T2 (verify/regressão)
|
|
122
|
+
- `.morph/features/{feature}/3-implement/recap.md` — evidência real de teste
|
|
123
|
+
- `.morph/features/{feature}/4-review/review-report.md` — diff + evidência, Gate 3 sempre humano
|
|
124
|
+
- Gates `proposal`/`plan` carimbados `approvedBy: "policy:hotfix"`; Gate 3 registrado `approvedBy: "manual"` em `feature.json` (autoritativo) — nunca `"auto"`
|
|
125
|
+
|
|
126
|
+
## Referências
|
|
127
|
+
|
|
128
|
+
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho
|
|
129
|
+
- `.morph/framework/MORPH.md` §5 — Gates de aprovação, gate humano forçado no hotfix
|
|
130
|
+
- `.morph/framework/MORPH.md` §6 — Sub-agents, persona de estágio scout, protocolo obrigatório
|
|
131
|
+
- `framework/skills/core/morph-proposal/SKILL.md` — Passo 0, roteamento que invoca esta skill
|
|
132
|
+
- `framework/skills/core/morph-implement/SKILL.md` §4 — template de dispatch e protocolo
|
|
133
|
+
- `src/core/work-types.js` — `scaffold`/`skippedGates`/`forcedPauseGates` do tipo `hotfix`
|
|
134
|
+
- `morph-spec create {feature} --type hotfix` — nascimento com política de gates
|
|
135
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores
|
|
136
|
+
- `morph-spec gate-decision {feature} review --pause true [--reason ...] [--signals ...]` — persiste a decisão de pausa antes do Gate 3
|
|
@@ -4,7 +4,7 @@ description: Guia a execução de cada tarefa de implementação com standard e
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
|
|
6
6
|
user-invokable: false
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
@@ -76,8 +76,12 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
76
76
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
77
77
|
(TaskCreate/TaskUpdate) — todo estado é gravado exclusivamente pelo
|
|
78
78
|
orquestrador.
|
|
79
|
-
3.
|
|
80
|
-
compartilhada — a verificação
|
|
79
|
+
3. Verificação condicional ao isolamento: em batch paralelo SEM isolamento,
|
|
80
|
+
NÃO rode build/test da suíte compartilhada — a verificação
|
|
81
|
+
(`morph-spec verify`) é do orquestrador, uma vez, pós-batch. Em batch
|
|
82
|
+
COM `isolation: "worktree"`, rode build/test dentro do seu worktree,
|
|
83
|
+
commite na branch do worktree como penúltimo ato (antes do SendMessage)
|
|
84
|
+
e reporte a branch — nunca faça merge.
|
|
81
85
|
|
|
82
86
|
Retorne no content do SendMessage APENAS: (1) o que foi feito em 2-3 frases,
|
|
83
87
|
(2) arquivos modificados, (3) problemas encontrados e como foram resolvidos,
|
|
@@ -137,7 +141,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
137
141
|
> tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
|
|
138
142
|
> manualmente** — a escrita manual foi removida da cerimônia por task.
|
|
139
143
|
|
|
140
|
-
8. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
|
|
144
|
+
8. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Não rode a suíte de testes inteira do projeto por conta própria ao fim da task quando invocada pela `morph-apply` — a verificação determinística (`morph-spec verify {feature} {task}`) é do orquestrador, logo após seu retorno (ver morph-apply §3a). Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
|
|
141
145
|
|
|
142
146
|
## Output esperado
|
|
143
147
|
- Código implementado conforme o standard consultado (direto ou via sub-agent)
|
|
@@ -4,7 +4,7 @@ description: Guia a produção dos três artefatos de planejamento de uma featur
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -73,10 +73,14 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
73
73
|
- `group` (opcional): backend, frontend, tests, infra, docs. Default backend.
|
|
74
74
|
- `outputs` (opcional): array de paths que serão criados/modificados.
|
|
75
75
|
|
|
76
|
+
**Preencha `outputs` (paths planejados) em cada task** — o `morph-spec dag` usa os outputs para detectar colisão de arquivos entre fluxos paralelos e recomendar `isolation: "worktree"`. Task sem `outputs` entra como footprint desconhecido (não força isolamento, mas o dag não consegue protegê-la de colisão).
|
|
77
|
+
|
|
76
78
|
Antes de retornar, valide rodando `morph-spec dag {feature}` — o comando parseia e valida o schema do tasks.json (ids únicos `T\d+`, enums de `status`/`effort`, `dependencies` válidas) e já imprime a análise de DAG que a `/morph-apply` vai usar. Erros de schema abortam com a lista do que corrigir.
|
|
77
79
|
|
|
78
80
|
5. Apresente o Gate 2 segundo trust mode.
|
|
79
81
|
|
|
82
|
+
Você pode embutir o diagrama do DAG do plano via `morph-spec dag {feature} --mermaid` (flowchart Mermaid) para visualização no gate.
|
|
83
|
+
|
|
80
84
|
Ler `.morph/config/config.json → trust` (default `"auto"`). Calcular os sinais de risco em linguagem natural — sem scripts:
|
|
81
85
|
|
|
82
86
|
- `taskCount` = número de tasks do tasks.json.
|
|
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|
|
@@ -30,6 +30,26 @@ Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem inte
|
|
|
30
30
|
|
|
31
31
|
## Fluxo
|
|
32
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>` diretamente quando o tipo é óbvio pelo pedido — ex.: o usuário já diz "isso é um hotfix").
|
|
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>`. 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 / critério de aceite — não a proposta completa de uma feature nova) 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
|
+
|
|
33
53
|
### 1. Determinar feature name e estado
|
|
34
54
|
|
|
35
55
|
- Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
|
|
@@ -117,6 +137,7 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
|
|
|
117
137
|
- Não pular o Gate 1 mesmo em trust:auto se houver divergência detectada.
|
|
118
138
|
- Não escrever código nesta fase — apenas artefatos de planejamento.
|
|
119
139
|
- Não perguntar sobre stack — o stack padrão está em MORPH.md / mandate.
|
|
140
|
+
- 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".
|
|
120
141
|
|
|
121
142
|
## Output esperado
|
|
122
143
|
|
|
@@ -129,6 +150,8 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
|
|
|
129
150
|
## Referências
|
|
130
151
|
|
|
131
152
|
- `.morph/framework/MORPH.md` — charter NLH completo
|
|
153
|
+
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
|
|
132
154
|
- `framework/skills/core/morph-brainstorming/SKILL.md`
|
|
133
155
|
- `framework/skills/core/morph-plan/SKILL.md`
|
|
156
|
+
- `framework/skills/core/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
|
|
134
157
|
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
@@ -4,7 +4,7 @@ description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar a fase review, após todas as tasks de tasks.json estarem com status `done`
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -43,7 +43,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
43
43
|
outro propósito. Falha aqui é bloqueante — quebra silenciosa em runtime, não em build.
|
|
44
44
|
|
|
45
45
|
4. **Despache o avaliador independente** — o score do Gate 3 nunca é auto-atribuído por quem implementou:
|
|
46
|
-
- Rode
|
|
46
|
+
- Rode `morph-spec verify {feature} --json` (escopo feature) e capture o JSON — é a saída real de build+testes+validadores que você anexa ao prompt do avaliador independente (`morph-evaluator`).
|
|
47
47
|
- Gere o **diff da implementação** (`git diff` do range da feature, ou a lista de arquivos do recap.md com seus conteúdos atuais).
|
|
48
48
|
- Despache o subagent registrado `morph-evaluator` (gerado de `agents.json` — a persona do avaliador é o system prompt dele, com tools read-only), com contexto fresco:
|
|
49
49
|
```
|
|
@@ -126,6 +126,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
126
126
|
- Gate 3 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo), na forma canônica `{ approved, timestamp, approvedBy }` — via `morph-spec approve` em auto, ou pelo hook state-sync no caminho manual
|
|
127
127
|
|
|
128
128
|
## Referências
|
|
129
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores anexada ao prompt do avaliador (passo 4)
|
|
129
130
|
- `.morph/framework/MORPH.md` — seção 5 (Gate 3 + regras de pausa), seção 1 (papel Evaluator), Trust Mode
|
|
130
131
|
- `.claude/agents/morph-evaluator.md` — subagent do avaliador (gerado de `.morph/framework/agents.json`), despachado no passo 4
|
|
131
132
|
- `framework/skills/core/morph-eval/SKILL.md` — rubricas e bandas que o avaliador aplica
|
|
@@ -4,7 +4,7 @@ description: Varre o codebase existente, detecta stack atual, compara com o stac
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao iniciar uma feature em projeto brownfield (codebase já existente)
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-stack-scan
|
|
@@ -4,7 +4,7 @@ description: Localiza e carrega um standard específico do STANDARDS.json sob de
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: quando precisar consultar um standard específico durante a implementação
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "8.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|