@polymorphism-tech/morph-spec 7.3.0 → 7.4.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 +4 -2
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +1 -1
- package/framework/MORPH.md +29 -12
- package/framework/agents.json +132 -132
- package/framework/evals/rubrics/README.md +9 -8
- package/framework/hooks/README.md +2 -0
- package/framework/hooks/claude-code/core/gate-guard.js +160 -0
- package/framework/hooks/claude-code/core/state-sync.js +15 -3
- package/framework/hooks/claude-code/core/validate-completion.js +105 -0
- package/framework/hooks/shared/state-reader.js +236 -221
- package/framework/skills/README.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +63 -21
- package/framework/skills/core/morph-brainstorming/SKILL.md +5 -1
- package/framework/skills/core/morph-eval/SKILL.md +4 -5
- package/framework/skills/core/morph-implement/SKILL.md +47 -19
- package/framework/skills/core/morph-plan/SKILL.md +8 -2
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +13 -6
- 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/package.json +1 -1
- package/src/commands/project/init.js +517 -515
- package/src/commands/state/approve.js +251 -213
- package/src/commands/validation/validate-feature.js +64 -23
- package/src/core/state/state-manager.js +19 -9
- package/src/lib/risk-detector.js +2 -2
- package/src/utils/hooks-installer.js +527 -516
|
@@ -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.4.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.4.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`)
|
|
@@ -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.4.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 em `state.json` ANTES de apresentar ou auto-aprovar** — grave
|
|
98
|
+
`features[feature].gateDecisions.plan = { pause, reason, signals, trust, decidedAt: <ISO> }`
|
|
99
|
+
(Edit em `.morph/state.json` é permitido). 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
|
```
|
|
@@ -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.4.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|
|
@@ -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.4.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`
|
|
@@ -95,5 +100,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
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.4.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.4.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|