@polymorphism-tech/morph-spec 7.3.0 → 7.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1 -1
- package/README.md +2 -2
- package/bin/morph-spec.js +22 -2
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +10 -5
- package/framework/MORPH.md +31 -14
- package/framework/agents.json +132 -132
- package/framework/commands/create-umbraco-lp.md +35 -0
- package/framework/commands/migrate-lp-to-umbraco.md +33 -0
- package/framework/commands/morph-archive.md +17 -27
- package/framework/evals/rubrics/README.md +9 -8
- package/framework/hooks/README.md +2 -0
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +115 -90
- package/framework/hooks/claude-code/core/gate-guard.js +160 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +32 -30
- package/framework/hooks/claude-code/core/state-sync.js +16 -36
- package/framework/hooks/claude-code/core/validate-completion.js +105 -0
- package/framework/hooks/shared/state-reader.js +302 -221
- package/framework/hooks/shared/state-writer.js +124 -0
- package/framework/rules/morph-task-tracking.md +69 -49
- package/framework/rules/morph-workflow.md +192 -191
- package/framework/skills/README.md +1 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +252 -0
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +452 -0
- package/framework/skills/core/morph-apply/SKILL.md +69 -27
- package/framework/skills/core/morph-brainstorming/SKILL.md +6 -2
- package/framework/skills/core/morph-eval/SKILL.md +4 -5
- package/framework/skills/core/morph-implement/SKILL.md +51 -22
- package/framework/skills/core/morph-plan/SKILL.md +10 -4
- package/framework/skills/core/morph-proposal/SKILL.md +8 -7
- package/framework/skills/core/morph-review/SKILL.md +15 -8
- 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/setup.md +258 -244
- package/framework/templates/REGISTRY.json +1 -3
- package/framework/templates/context/CONTEXT-FEATURE.md +10 -17
- package/framework/templates/context/CONTEXT.md +181 -180
- package/framework/templates/docs/onboarding.md +122 -118
- package/framework/templates/docs/proposal.md +10 -0
- package/framework/templates/docs/spec.md +228 -228
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -80
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -89
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +2 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +44 -43
- package/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -107
- package/package.json +1 -1
- package/src/commands/project/init.js +517 -515
- package/src/commands/project/update.js +415 -368
- package/src/commands/project/worktree.js +212 -210
- package/src/commands/state/advance.js +82 -0
- package/src/commands/state/approve.js +251 -213
- package/src/commands/state/archive.js +111 -0
- package/src/commands/validation/validate-feature.js +244 -79
- package/src/core/state/state-manager.js +256 -74
- package/src/dashboard/scanner/state-scanner.js +35 -8
- package/src/lib/generators/context-generator.js +12 -8
- package/src/lib/risk-detector.js +2 -2
- package/src/utils/file-copier.js +7 -0
- package/src/utils/hooks-installer.js +527 -516
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-brainstorming
|
|
@@ -87,6 +87,10 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
87
87
|
const riskList = getRiskSignals(signals);
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
**Persista a decisão no `feature.json` autoritativo da feature ANTES de apresentar ou auto-aprovar** — grave
|
|
91
|
+
`gateDecisions.proposal = { pause, reason, signals, trust, decidedAt: <ISO> }` em `.morph/features/{feature}/feature.json`
|
|
92
|
+
(Edit em `.morph/features/**` é permitido pela allowlist). O hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com esta decisão e avisa em divergência. Sem o registro o guard não verifica — não pule.
|
|
93
|
+
|
|
90
94
|
**Se `pause === true`** (manual mode OU risco detectado em auto), use `AskUserQuestion`:
|
|
91
95
|
|
|
92
96
|
```
|
|
@@ -112,7 +116,7 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
112
116
|
**Riscos:** {principal} (sinais detectados: nenhum)
|
|
113
117
|
```
|
|
114
118
|
|
|
115
|
-
|
|
119
|
+
No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`). 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.
|
|
116
120
|
|
|
117
121
|
## Output esperado
|
|
118
122
|
- `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-eval
|
|
@@ -32,9 +32,8 @@ Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
|
32
32
|
4. Calcule o score composto: (arch × 0.30) + (contracts × 0.25) + (quality × 0.25) + (tests × 0.20).
|
|
33
33
|
|
|
34
34
|
5. Aja conforme o score composto:
|
|
35
|
-
- **
|
|
36
|
-
-
|
|
37
|
-
- **< 6:** Escale para revisão humana — produza relatório detalhado com scores por dimensão e itens bloqueantes.
|
|
35
|
+
- **9-10:** Aprovado — nenhuma saída necessária no contexto, a task avança.
|
|
36
|
+
- **< 9:** Produza **feedback priorizado** (bloqueantes primeiro) — este feedback é a entrada do loop de correção autônomo da `morph-apply`: ela re-invoca `morph-implement` passando esse feedback para a próxima tentativa. NÃO escale ao humano aqui; a escalada só acontece quando o loop esgota 3 tentativas sem atingir 9. O feedback deve ser acionável (o que corrigir, onde), não só descritivo.
|
|
38
37
|
|
|
39
38
|
6. Registre o score no recap.md da tarefa avaliada.
|
|
40
39
|
|
|
@@ -45,7 +44,7 @@ Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
|
45
44
|
|
|
46
45
|
## Output esperado
|
|
47
46
|
- Score composto 0-10 com scores por dimensão
|
|
48
|
-
- Ação tomada com base no score (aprovado / feedback
|
|
47
|
+
- Ação tomada com base no score (aprovado em >=9 / feedback acionável para o loop em <9)
|
|
49
48
|
- Entrada no recap.md com scores
|
|
50
49
|
- Trace atualizado com `eval_score` e `eval_dimensions`
|
|
51
50
|
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
@@ -18,26 +18,36 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
18
18
|
|
|
19
19
|
## O que fazer
|
|
20
20
|
|
|
21
|
-
1.
|
|
22
|
-
|
|
21
|
+
1. **Garanta que o conteúdo do plano está no seu contexto antes de implementar** — `mandate.md`, `spec.md` e `decisions.md` de `.morph/features/{feature}/2-plan/`. Se você não tem o conteúdo atual desses arquivos em contexto (sessão fresca / cold start de `/morph-apply`, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los**: primeiro `mandate.md`, depois `spec.md`, depois `decisions.md`.
|
|
22
|
+
|
|
23
|
+
> Por que "garanta que está em contexto" e não "sempre Read": numa sessão quente, onde você acabou de escrever esses arquivos no mesmo turno, o conteúdo já está disponível e um Read seria redundante. Mas o contrato é o conteúdo estar em contexto — não confie em cache de turnos anteriores que pode ter sido truncado ou evictado. Na dúvida, Read. Nunca implemente sem o mandate em contexto.
|
|
24
|
+
|
|
25
|
+
Do `mandate.md`, identifique os standards obrigatórios e patterns proibidos. Do `spec.md`, a arquitetura e as seções de FRs referenciadas pela `description` da task corrente. Do `decisions.md`, as ADRs já registradas — para não contradizê-las nem re-decidir o que já foi decidido.
|
|
26
|
+
|
|
27
|
+
**Se a `morph-apply` passou `feedback` de uma tentativa anterior** (loop de correção — a task foi implementada mas o `morph-eval` deu score < 9): isto NÃO é uma implementação do zero. Leia o feedback priorizado, identifique os pontos bloqueantes listados, e **corrija especificamente esses pontos** no código já existente. Não reescreva o que já passou; foque no que o eval apontou. Registre no recap qual feedback foi endereçado em qual tentativa.
|
|
23
28
|
|
|
24
29
|
2. Identifique o standard mais relevante para a tarefa atual:
|
|
25
30
|
- Consulte `framework/standards/STANDARDS.json` — filtre por `category` e `tags`.
|
|
26
|
-
-
|
|
31
|
+
- **Use a tool Read no arquivo `.md` do standard identificado** (campo `path` no JSON) — não baste o digest do index; abra o arquivo. O index só diz que o standard existe; as convenções estão no `.md`.
|
|
32
|
+
- **Tarefas de agente de IA (MAF):** Read os `framework/standards/ai-agents/*.md` relevantes para a task. Mesmo que você consulte docs externas (context7) para a superfície da API do `Microsoft.Agents.AI`, as **convenções de projeto** (single-agent por padrão, provider/caching/observability, A2A, middleware) vêm desses standards. Uma fonte externa não as conhece.
|
|
27
33
|
- Se nenhum standard cobrir o caso, registre no decisions.md e adote o critério mais conservador.
|
|
28
34
|
|
|
29
35
|
3. Identifique a persona de agente adequada para a tarefa:
|
|
30
|
-
-
|
|
31
|
-
- Leia o campo `persona` do agente e adote esse ponto de vista durante a implementação.
|
|
36
|
+
- **Use a tool Read em `.morph/framework/agents.json`** — não recupere a persona de memória. O registro existe para ser consultado; pular o Read significa que a persona vira um rótulo inventado em vez de uma seleção auditável. Encontre o agente cujo `domains` cobre o domínio da tarefa.
|
|
37
|
+
- Leia o campo `persona` do agente e adote esse ponto de vista durante a implementação. O array `standards` desse agente é o ponto de partida para o passo 2.
|
|
38
|
+
- O `**Persona:**` que você grava no recap (passo 6) **deve** ser o `name` exato de um agente que existe em `agents.json` — é assim que o reviewer audita de qual ponto de vista a task foi feita. Uma persona que não casa com nenhum agente do registro é um sinal de que o consult não aconteceu.
|
|
32
39
|
|
|
33
|
-
4.
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
40
|
+
4. Decida se a task deve ser despachada para um sub-agent. Dispatch é o **default** para o caso pesado/multi-domínio (ver `.morph/framework/MORPH.md` seção 6) — despache quando a task dispara qualquer gatilho:
|
|
41
|
+
- **Domínio diferente do que você tem carregado agora** (a persona do passo 3 difere da que você vinha usando) — gatilho mais importante: o especialista carrega seus próprios standards sem inchar seu contexto.
|
|
42
|
+
- Esforço L ou XL (duração estimada > 5 minutos).
|
|
43
|
+
- Mais de 3 tentativas de correção falharam no mesmo problema.
|
|
44
|
+
- Análise de arquivo com > 500 linhas.
|
|
45
|
+
- Task repetitiva com > 3 instâncias do mesmo padrão.
|
|
46
|
+
- Risco de contaminar o contexto principal com detalhes de baixo nível irrelevantes para o fluxo.
|
|
39
47
|
|
|
40
|
-
**Se
|
|
48
|
+
Inline é aceitável só para tasks S/M **dentro do domínio já carregado**. Se for inline numa task que dispara um gatilho, registre a justificativa em uma linha no `decisions.md` — inline silencioso numa task pesada/multi-domínio é o anti-padrão da seção 6.
|
|
49
|
+
|
|
50
|
+
**Se for despachar — use este template (passe a persona e o standard escopados, nunca um agente genérico sem contexto de domínio):**
|
|
41
51
|
```
|
|
42
52
|
Implementar [ID]: [title da task]
|
|
43
53
|
|
|
@@ -57,12 +67,30 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
57
67
|
Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
|
|
58
68
|
e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
|
|
59
69
|
|
|
60
|
-
6. Ao concluir a tarefa,
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
6. Ao concluir a tarefa, **append** um bloco a `recap.md` em `.morph/features/{feature}/3-implement/`
|
|
71
|
+
usando este template **obrigatório** (campos não-opcionais — sem standard, a entrada não conta):
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
## T{N} — {title}
|
|
75
|
+
|
|
76
|
+
**Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
|
|
77
|
+
**Persona:** {agent-name}
|
|
78
|
+
**Files:**
|
|
79
|
+
- `{path}`
|
|
80
|
+
- `{path}`
|
|
81
|
+
|
|
82
|
+
{2-3 frases sobre o que foi feito}
|
|
83
|
+
|
|
84
|
+
**Issues encontrados:** {breve descrição ou "nenhum"}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Regras:
|
|
88
|
+
- **Standard é obrigatório** — sempre referenciar pelo menos um standard de
|
|
89
|
+
`framework/standards/STANDARDS.json` que justificou as escolhas de implementação.
|
|
90
|
+
Se nenhum standard existente cobre, registre a decisão em `decisions.md` E cite
|
|
91
|
+
`Standard: ad-hoc (see decisions.md ADR-{N})` no recap.
|
|
92
|
+
- Sem standard ⇒ a task falha no validador de Gate 3 (`validate-completion`)
|
|
93
|
+
e o reviewer não consegue auditar de onde veio a decisão técnica.
|
|
66
94
|
|
|
67
95
|
7. Registre a entrada no trace de execução em `.morph/traces/YYYY-MM-DD-{feature}-implement.json`:
|
|
68
96
|
- Crie o arquivo se não existir (use o schema em `framework/evals/trace-schema.md`)
|
|
@@ -81,9 +109,10 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
81
109
|
|
|
82
110
|
`tasks.json` é protegido após o Gate 2, mas os campos de progresso (`status`,
|
|
83
111
|
`outputs`, `notes`) continuam graváveis durante a fase implement. `writeTasksJson`
|
|
84
|
-
grava o arquivo
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
grava o arquivo inteiro (Write) e é o caminho mais simples; **uma `Edit` que mexe
|
|
113
|
+
só nesses campos mutáveis também é permitida** — o hook `protect-spec-files` faz
|
|
114
|
+
diff semântico e libera Write ou Edit desde que nenhum campo de contrato do plano
|
|
115
|
+
(`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`) mude.
|
|
87
116
|
|
|
88
117
|
9. 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.
|
|
89
118
|
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -20,7 +20,7 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
20
20
|
|
|
21
21
|
## O que fazer
|
|
22
22
|
|
|
23
|
-
1.
|
|
23
|
+
1. **Garanta que `proposal.md` e `stack-scan.md` estão no seu contexto antes de planejar.** Se não tem o conteúdo atual em contexto (sessão fresca, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los** — não confie em cache de turnos anteriores. Na dúvida, Read. `.morph/features/{feature}/0-proposal/proposal.md` (escopo, critérios de aceite, riscos) e `.morph/features/{feature}/0-proposal/stack-scan.md` (contexto técnico detectado: greenfield vs brownfield, stack atual, drift). Em brownfield, o stack-scan informa decisões de spec/mandate — não invente padrões que conflitam com o detectado.
|
|
24
24
|
|
|
25
25
|
2. Produza `spec.md` em `.morph/features/{feature}/2-plan/`:
|
|
26
26
|
- Arquitetura da solução: quais componentes, como se conectam, fluxos de dados principais.
|
|
@@ -37,6 +37,7 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
37
37
|
- Camada de Service/Manager entre handler e dados → handler usa `IRepository<T>` ou `DbContext` direto
|
|
38
38
|
- SQL cru (`FromSqlRaw`, `ExecuteQuery(string)`) sem justificativa em `decisions.md` → usar LINQ
|
|
39
39
|
- Política de acesso a dados (registre no mandate como orientação, não proibição): `IRepository<T>` + `IUnitOfWork` para CRUD simples; `ApplicationDbContext` injetado direto no slice para queries específicas (joins, projeção, paginação).
|
|
40
|
+
- **Features com agentes de IA (MAF):** se a feature envolve um agente (Microsoft Agent Framework), **use a tool Read** nos standards relevantes de `framework/standards/ai-agents/*.md` (ex.: `setup`, `agent-session`, `middleware-patterns`, `mcp-server`, `mcp-tools`, `multi-agent-patterns`, `production`) — filtre pelo que a feature exige via STANDARDS.json. Esses standards carregam as **convenções de projeto** (single-agent por padrão — Workflows só para fan-in/out real; provider, caching, observability, A2A) que uma fonte externa de docs (ex.: context7) não conhece. Padrão de divisão: **superfície da API** pode vir de docs ao vivo/context7 (mais frescas para um SDK em evolução), mas **as convenções vêm dos standards** — registre ambas no mandate. Não pule os `ai-agents/*.md` só porque o STANDARDS.json index lista que eles existem.
|
|
40
41
|
- Checklist de done com critérios verificáveis por tarefa.
|
|
41
42
|
|
|
42
43
|
4. Produza `tasks.json` em `.morph/features/{feature}/2-plan/` seguindo o schema em `.morph/framework/schemas/tasks.schema.json`.
|
|
@@ -93,6 +94,10 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
93
94
|
const { pause, reason } = shouldPauseGate(config, signals);
|
|
94
95
|
```
|
|
95
96
|
|
|
97
|
+
**Persista a decisão no `feature.json` autoritativo da feature ANTES de apresentar ou auto-aprovar** — grave
|
|
98
|
+
`gateDecisions.plan = { pause, reason, signals, trust, decidedAt: <ISO> }` em `.morph/features/{feature}/feature.json`
|
|
99
|
+
(Edit em `.morph/features/**` é permitido pela allowlist). Isso deixa o raciocínio de trust auditável no disco: o hook `gate-guard.js` confere depois se a ação tomada (pausar vs auto-aprovar) bateu com esta decisão e avisa em caso de divergência. Sem este registro o guard não tem como verificar — não pule.
|
|
100
|
+
|
|
96
101
|
**Se `pause === true`**, use `AskUserQuestion`:
|
|
97
102
|
|
|
98
103
|
```
|
|
@@ -116,14 +121,14 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
116
121
|
**Tasks:** {N} | Esforço total: {soma} | Caminho crítico: {IDs sem deps paralelas}
|
|
117
122
|
```
|
|
118
123
|
|
|
119
|
-
|
|
124
|
+
No caminho manual, o hook state-sync registra a aprovação automaticamente em answers de AskUserQuestion (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`). Em auto sem AskUserQuestion, aprove via `morph-spec approve {feature} plan --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta da próxima fase) — nunca via Edit à mão de state.json.
|
|
120
125
|
|
|
121
126
|
## Output esperado
|
|
122
127
|
|
|
123
128
|
- `.morph/features/{feature}/2-plan/spec.md` — especificação técnica completa
|
|
124
129
|
- `.morph/features/{feature}/2-plan/mandate.md` — contrato de implementação
|
|
125
130
|
- `.morph/features/{feature}/2-plan/tasks.json` — task list estruturada válida contra schema
|
|
126
|
-
- Gate 2
|
|
131
|
+
- Gate 2 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo)
|
|
127
132
|
|
|
128
133
|
## Referências
|
|
129
134
|
|
|
@@ -131,5 +136,6 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
131
136
|
- `.morph/framework/standards/STANDARDS.json` — para identificar standards relevantes ao mandate
|
|
132
137
|
- `.morph/framework/schemas/tasks.schema.json` — schema obrigatório de tasks.json
|
|
133
138
|
- `.morph/features/{feature}/0-proposal/proposal.md` — escopo da feature
|
|
139
|
+
- `.morph/features/{feature}/0-proposal/stack-scan.md` — contexto técnico detectado
|
|
134
140
|
- `src/lib/tasks/tasks-json-parser.js` — `validateTasksJson`, `writeTasksJson`
|
|
135
141
|
- `src/lib/risk-detector.js` — `shouldPauseGate`, `getRiskSignals`
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|
|
@@ -17,7 +17,7 @@ Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem inte
|
|
|
17
17
|
|
|
18
18
|
- Usuário pede "use /morph-proposal {feature}" ou "vamos planejar {feature}".
|
|
19
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/
|
|
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
21
|
|
|
22
22
|
## Argumentos
|
|
23
23
|
|
|
@@ -82,11 +82,12 @@ Escopo: {incluído} | Excluído: {exclusões}
|
|
|
82
82
|
Stack: {compliance}
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
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"`). Em `trust: auto` (sem AskUserQuestion), **aprove via CLI — nunca via Edit à mão de state.json**:
|
|
86
86
|
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
```
|
|
88
|
+
morph-spec approve {feature} proposal --mode auto
|
|
89
|
+
# ou, para já aprovar o Gate 1 e criar a pasta 2-plan/ num passo só:
|
|
90
|
+
morph-spec advance {feature}
|
|
90
91
|
```
|
|
91
92
|
|
|
92
93
|
### 4. Verificar retomada antes de morph-plan
|
|
@@ -128,7 +129,7 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
|
|
|
128
129
|
- `.morph/features/{feature}/2-plan/spec.md`
|
|
129
130
|
- `.morph/features/{feature}/2-plan/mandate.md`
|
|
130
131
|
- `.morph/features/{feature}/2-plan/tasks.json`
|
|
131
|
-
- Gates 1 e 2
|
|
132
|
+
- 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.
|
|
132
133
|
|
|
133
134
|
## Referências
|
|
134
135
|
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -19,11 +19,14 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
19
19
|
|
|
20
20
|
## O que fazer
|
|
21
21
|
|
|
22
|
-
1.
|
|
23
|
-
|
|
22
|
+
1. **Garanta que todos os artefatos de plano estão no seu contexto antes de revisar.** Se você não tem o conteúdo atual em contexto (sessão fresca, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los** — não confie em cache de turnos anteriores que pode ter sido truncado ou evictado. Na dúvida, Read:
|
|
23
|
+
- `.morph/features/{feature}/2-plan/mandate.md` — critérios de done, standards obrigatórios, patterns proibidos.
|
|
24
|
+
- `.morph/features/{feature}/2-plan/spec.md` — arquitetura, FRs/NFRs, contratos esperados.
|
|
25
|
+
- `.morph/features/{feature}/2-plan/decisions.md` (se existir) — ADRs que devem ter sido seguidos pela implementação. Use para validar coerência entre decisão registrada e código produzido.
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
> O contrato é o conteúdo estar em contexto, não o número de chamadas a Read. Numa sessão quente onde você acabou de produzir esses artefatos, eles já estão disponíveis. Mas uma revisão sem o mandate em contexto não é uma revisão — é um chute. Nunca produza o review-report sem ter o mandate, spec e decisions disponíveis.
|
|
28
|
+
|
|
29
|
+
2. **Use a tool Read em `.morph/features/{feature}/3-implement/recap.md`**. Verifique se todas as tarefas têm entrada e se os problemas foram resolvidos.
|
|
27
30
|
|
|
28
31
|
3. Para cada critério do mandate.md, verifique se foi atendido:
|
|
29
32
|
- Se atendido: registre como "aprovado" com evidência (arquivo ou comportamento).
|
|
@@ -39,8 +42,10 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
39
42
|
- Lista de melhorias recomendadas (não bloqueantes)
|
|
40
43
|
- Recomendação final: Aprovado / Rejeitar com condições / Reprovar
|
|
41
44
|
|
|
42
|
-
6. Se houver itens bloqueantes (score <
|
|
45
|
+
6. Se houver itens bloqueantes (score < 8 em qualquer dimensão bloqueante), corrija antes
|
|
43
46
|
de apresentar o review-report.md ao usuário. Não abra o Gate 3 com bloqueantes em aberto.
|
|
47
|
+
(A barra de avanço por task é 9; uma dimensão individual abaixo de 8 no review da feature
|
|
48
|
+
inteira é um bloqueante crítico que o loop de correção deveria ter pego.)
|
|
44
49
|
|
|
45
50
|
7. Finalize o trace de execução em `.morph/traces/YYYY-MM-DD-{feature}-implement.json`:
|
|
46
51
|
- Preencha `phase_summary.tasks_completed`, `tasks_failed`, `avg_eval_score`
|
|
@@ -83,17 +88,19 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
83
88
|
**Recomendação:** Aprovado
|
|
84
89
|
```
|
|
85
90
|
|
|
86
|
-
|
|
91
|
+
No caminho manual, o hook state-sync detecta a aprovação em answers de AskUserQuestion e grava `approvalGates.review = { approved: true, timestamp, approvedBy: "manual" }` no `feature.json` autoritativo da feature. Em auto sem AskUserQuestion, aprove via `morph-spec approve {feature} review --mode auto` — nunca via Edit à mão de state.json.
|
|
87
92
|
|
|
88
93
|
## Output esperado
|
|
89
94
|
- `.morph/features/{feature}/4-review/review-report.md` com scores e recomendação
|
|
90
95
|
- Trace da fase com `phase_summary` preenchido
|
|
91
|
-
- Gate 3
|
|
96
|
+
- 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
|
|
92
97
|
|
|
93
98
|
## Referências
|
|
94
99
|
- `.morph/framework/MORPH.md` — seção 5 (Gate 3), seção 1 (papel Evaluator), Trust Mode
|
|
95
100
|
- `framework/skills/core/morph-eval/SKILL.md` — para calcular scores por dimensão
|
|
96
101
|
- `.morph/framework/evals/trace-schema.md` — formato canônico do trace
|
|
97
102
|
- `.morph/features/{feature}/2-plan/mandate.md` — critérios de done da feature
|
|
103
|
+
- `.morph/features/{feature}/2-plan/spec.md` — arquitetura e contratos
|
|
104
|
+
- `.morph/features/{feature}/2-plan/decisions.md` — ADRs registrados (se existir)
|
|
98
105
|
- `.morph/features/{feature}/3-implement/recap.md` — registro de execução
|
|
99
106
|
- `src/lib/risk-detector.js` — `shouldPauseGate` para Gate 3
|
|
@@ -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.
|
|
7
|
+
cliVersion: "7.5.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.
|
|
7
|
+
cliVersion: "7.5.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|