@polymorphism-tech/morph-spec 8.18.0 → 8.20.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.
Files changed (37) hide show
  1. package/README.md +2 -2
  2. package/bin/morph-spec.js +9 -0
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +1 -1
  5. package/docs/QUICKSTART.md +1 -1
  6. package/framework/CLAUDE.md +8 -15
  7. package/framework/MORPH.md +56 -58
  8. package/framework/commands/morph-hotfix.md +1 -1
  9. package/framework/docs/CLI.md +3 -2
  10. package/framework/hooks/shared/phase-utils.js +0 -2
  11. package/framework/phases.json +2 -2
  12. package/framework/rules/morph-workflow.md +1 -1
  13. package/framework/schemas/feature.schema.json +12 -0
  14. package/framework/skills/README.md +1 -1
  15. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  16. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  17. package/framework/skills/core/morph-apply/SKILL.md +10 -14
  18. package/framework/skills/core/morph-brainstorming/SKILL.md +11 -22
  19. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  20. package/framework/skills/core/morph-hotfix/SKILL.md +4 -4
  21. package/framework/skills/core/morph-implement/SKILL.md +1 -1
  22. package/framework/skills/core/morph-plan/SKILL.md +14 -20
  23. package/framework/skills/core/morph-proposal/SKILL.md +12 -15
  24. package/framework/skills/core/morph-review/SKILL.md +15 -8
  25. package/framework/skills/core/morph-stack-scan/SKILL.md +9 -13
  26. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  27. package/framework/skills/core/morph-uiux/SKILL.md +135 -0
  28. package/package.json +1 -1
  29. package/src/commands/project/status.js +2 -2
  30. package/src/commands/state/gate-check.js +223 -0
  31. package/src/commands/state/gate-decision.js +46 -10
  32. package/src/commands/validation/verify.js +18 -1
  33. package/src/core/paths/output-schema.js +0 -1
  34. package/src/lib/agents/output-collector.js +0 -1
  35. package/src/lib/git/default-branch.js +65 -0
  36. package/src/lib/risk-detector.js +13 -0
  37. package/src/lib/standards/digest-builder.js +0 -72
@@ -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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
4
4
  version: core
5
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
6
  user-invokable: true
7
- cliVersion: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -81,10 +81,10 @@ Use `--skip-tests`/`--skip-build` quando fizer sentido para velocidade (ex.: ite
81
81
 
82
82
  ### 7. Gate 3 — SEMPRE humano
83
83
 
84
- 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:
84
+ O hotfix tem `forcedPauseGates: ['review']` (`src/core/work-types.js`) — o Gate 3 pausa **sempre**, mesmo em `trust: auto`. `gate-check` já sabe disso: lê `workType` do disco e `shouldPauseGate` força a pausa antes de checar qualquer outro sinal — rode direto, sem `--signals`:
85
85
 
86
86
  ```
87
- morph-spec gate-decision {feature} review --pause true --reason "hotfix: aprovação humana obrigatória" --signals '{"workType":"hotfix","evalScore":X}'
87
+ morph-spec gate-check {feature} review [--json]
88
88
  ```
89
89
 
90
90
  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**:
@@ -137,4 +137,4 @@ morph-spec approve {feature} review --approver "<nome de quem aprovou>"
137
137
  - `src/core/work-types.js` — `scaffold`/`skippedGates`/`forcedPauseGates` do tipo `hotfix`
138
138
  - `morph-spec create {feature} --type hotfix` — nascimento com política de gates
139
139
  - `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores
140
- - `morph-spec gate-decision {feature} review --pause true [--reason ...] [--signals ...]` — persiste a decisão de pausa antes do Gate 3
140
+ - `morph-spec gate-check {feature} review [--json]` — persiste a decisão de pausa (forçada por `workType: hotfix`) 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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -4,7 +4,7 @@ description: Guia a produção dos artefatos de planejamento de uma feature (use
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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-plan
@@ -45,25 +45,22 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
45
45
  2. Sistema retorna os veterinários ordenados por sobrenome
46
46
  3. Sistema exibe, para cada um, nome e especialidades
47
47
 
48
- ## Fluxos alternativos
49
- - **A1** — Nenhum veterinário cadastrado → sistema exibe estado vazio
50
- - **A2** — Veterinário sem especialidade → sistema exibe "sem especialidade"
51
-
52
48
  ## Pós-condições
53
49
  - **P1** — A resposta contém todos os veterinários não arquivados
54
50
  - **P2** — Cada veterinário traz suas especialidades em lista, nunca string concatenada
55
51
  - **P3** — A ordenação por sobrenome é estável para nomes repetidos
56
52
 
57
- ## Delta de domínio
58
- - `Vet.archivedAt` (novo, nullable) — habilita P1
59
- - Nenhuma relação nova
53
+ ## Fluxos alternativos (opcional)
54
+ - **A1** — Nenhum veterinário cadastrado → sistema exibe estado vazio
60
55
  ```
61
56
 
62
57
  **A regra que sustenta a camada inteira: pós-condição precisa ser observável em teste.** "O sistema fica consistente" não passa. "A resposta contém todos os veterinários não arquivados" passa. Antes de escrever cada pós-condição, pergunte: *que asserção eu escreveria para verificar isto?* Se não há resposta, a pós-condição está mal formulada — reescreva ou descarte. Sem esse filtro a camada vira prosa e não chega ao `doneCriteria`.
63
58
 
64
59
  **Identificador sequencial no projeto, não na feature.** Antes de numerar, leia o acervo `.morph/specs/usecases/` (se existir) mais os use cases das features ativas em `.morph/features/*/2-plan/usecases/`; tome o maior `UC-{nn}` e some um. Numerar por feature garante colisão no momento da promoção.
65
60
 
66
- **Seções:** `Pré-condições` (o que já é verdade antes), `Cenário principal` (o caminho feliz, numerado), `Fluxos alternativos` (**A1**, **A2**… — cada alternativa aproxima uma user story; edge case de *comportamento* mora aqui, edge case *técnico* fica no `spec.md`), `Pós-condições` (**P1**, **P2**… — o que passa a ser verdade, cada uma testável) e `Delta de domínio` (**só o que muda**: campo novo, relação nova, invariante nova — o modelo completo continua sendo o código EF Core mais as migrations; se a feature não altera o domínio, escreva "nenhum").
61
+ **Seções obrigatórias:** `Pré-condições` (o que já é verdade antes), `Cenário principal` (o caminho feliz, numerado, **curto** — não é o lugar para exaustão de casos) e `Pós-condições` (**P1**, **P2**… — o que passa a ser verdade, cada uma testável; é a seção que viaja **literal** ao `doneCriteria`, ver abaixo).
62
+
63
+ **Seções opcionais** — inclua só quando o comportamento não-trivial exigir, não por padrão: `Fluxos alternativos` (**A1**, **A2**… — um desvio do caminho feliz que precisa de pós-condição própria; edge case de *comportamento* mora aqui, edge case *técnico* fica no `spec.md`) e `Delta de domínio` (**só quando a feature muda o modelo**: campo novo, relação nova, invariante nova — sem delta, omita a seção em vez de escrever "nenhum"). Nenhuma das duas é consumida por `dag`/`finish` — existem para o leitor humano quando o caso pede, não para preencher o template.
67
64
 
68
65
  **Quando é obrigatório** (ver MORPH.md §2.1 para o roteamento por tipo):
69
66
 
@@ -135,6 +132,8 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
135
132
  - `agent`: o `id` da persona (chave do objeto `agents`, sem prefixo `morph-`) cujo `domains` cobre o `group`/domínio da task — o mesmo casamento que `morph-implement` §3 e `morph-apply` §3b fariam manualmente a cada dispatch; aqui você faz uma vez, no plano.
136
133
  - `standards`: o array `standards` dessa persona, mais qualquer standard adicional que a task especificamente exija (some, não substitua).
137
134
 
135
+ **Task que cria ou altera superfície de UI** (componente, página, estilo, fluxo de navegação) carimba `agent: "ui-designer"` — inclusive numa feature que não tomou o ramo uiux (MORPH.md §2.1): o critério de agente é por domínio da task, não por fase percorrida.
136
+
138
137
  Uma task cujo domínio não bate com nenhuma persona registrada (ex.: task pura de config/docs) fica sem `agent` — `morph-implement` cai no fallback de Read de `agents.json` nesse caso.
139
138
 
140
139
  **O `doneCriteria` carrega a pós-condição LITERAL.** Este é o elo que amarra a cadeia inteira: a pós-condição escrita em linguagem de negócio chega **sem tradução** ao critério que o `morph-spec verify` e o `morph-eval` cobram. Copie o texto da pós-condição, prefixado pelo seu rótulo (`"P2 — Cada veterinário traz..."`). Reescrever com outras palavras aqui é exatamente o ponto em que o requisito se perde hoje.
@@ -151,21 +150,16 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
151
150
 
152
151
  Você pode embutir o diagrama do DAG do plano via `morph-spec dag {feature} --mermaid` (flowchart Mermaid) para visualização no gate.
153
152
 
154
- Ler `.morph/config/config.json → trust` (default `"auto"`). Calcular os sinais de risco em linguagem natural — sem scripts:
155
-
156
- - `taskCount` = número de tasks do tasks.json.
157
- - `designSystemDivergence` = herdado do brainstorming.
158
- - `standardsViolations` = violações detectadas no mandate.
159
-
160
- **Decisão de pausa** (regras da tabela do MORPH.md §5): `trust: manual` → pausa sempre; `designSystemDivergence` → pausa; `standardsViolations` não-vazio → pausa; `taskCount > 20` → pausa; caso contrário → auto-passa (`pause: false`).
161
-
162
- **Persista a decisão ANTES de apresentar ou auto-aprovar — via CLI, nunca editando feature.json à mão** (o Edit manual colide com o hook state-sync, que reescreve o arquivo entre o seu Read e o Edit — erro "file modified since read"):
153
+ Rode `morph-spec gate-check {feature} plan [--json]` — lê `trust` de `.morph/config/config.json`, conta `taskCount` do `tasks.json` (disco), decide via `shouldPauseGate` e persiste `gateDecisions.plan` com timestamp server-side (shape canônico em `.morph/framework/schemas/feature.schema.json`), imprimindo `pause`/`reason`/`signals`. É o default — não recompute a tabela do MORPH.md §5 em linguagem natural.
163
154
 
155
+ `gate-check` **não herda** `designSystemDivergence` do Gate 1 automaticamente — é recomputado a cada chamada. Se a divergência do Gate 1 segue sem resolução, ou o mandate introduziu uma violação de standard, repasse via `--signals` (as únicas chaves que este comando aceita sobrescrever):
164
156
  ```
165
- morph-spec gate-decision {feature} plan --pause false --reason "nenhum sinal de risco" --signals '{"taskCount":12,"standardsViolations":[]}'
157
+ morph-spec gate-check {feature} plan --signals '{"designSystemDivergence":true,"standardsViolations":["<id>"]}'
166
158
  ```
167
159
 
168
- O comando grava `gateDecisions.plan = { pause, reason, signals, trust, decidedAt }` no `feature.json` autoritativo com timestamp server-side (shape canônico em `.morph/framework/schemas/feature.schema.json`). 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.
160
+ Risco que nenhuma dessas chaves representa (julgamento desta sessão, não fato de disco): use `gate-decision` direto em vez de `gate-check`.
161
+
162
+ **Nunca edite `feature.json` à mão** (colide com o hook state-sync — erro "file modified since read"). Os caminhos acima gravam no mesmo lugar; o hook `gate-guard.js` confere depois se a ação tomada (pausar vs auto-aprovar) bateu com a decisão persistida.
169
163
 
170
164
  **Se `pause === true`**, use `AskUserQuestion`:
171
165
 
@@ -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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-proposal
@@ -65,13 +65,7 @@ No **modo entrevista** o Gate 1 pausa sempre — a confirmação do entendimento
65
65
 
66
66
  ### 3. Gate 1 (trust-aware)
67
67
 
68
- Ler `.morph/config/config.json → trust` (default `"auto"`). Calcular sinais de risco:
69
-
70
- - `discoveryMode` — `"interview"` ou `"auto"`, decidido na pergunta de abertura da morph-brainstorming.
71
- - `designSystemDivergence` — detectado pela morph-brainstorming.
72
- - `standardsViolations` — violações de mandate listadas na proposal (não deveria, mas verifica).
73
-
74
- **Decisão de pausa** (regras da tabela do MORPH.md §5, aplicadas em linguagem natural — sem scripts): `discoveryMode: "interview"` → `pause: true` sempre; `trust: manual` → `pause: true` sempre; `designSystemDivergence` → pausa; `standardsViolations` não-vazio → pausa; caso contrário → `pause: false` (auto-passa). Monte `reason` com o sinal que disparou.
68
+ A decisão de pausa já foi tomada e persistida pela `morph-brainstorming` (Parte 4): `morph-spec gate-check {feature} proposal` no caminho comum (`shouldPauseGate`; divergência de design-system detectada entra via `--signals`), ou `gate-decision` manual quando `discoveryMode: "interview"` — o único sinal que `shouldPauseGate` não representa. Leia `gateDecisions.proposal` em `feature.json` (ou o output do comando) para `pause`/`reason`.
75
69
 
76
70
  **Se `pause === true`**, apresentar via `AskUserQuestion`:
77
71
 
@@ -104,6 +98,13 @@ morph-spec approve {feature} proposal --mode auto
104
98
  morph-spec advance {feature}
105
99
  ```
106
100
 
101
+ ### 3a. Roteamento uiux (após o Gate 1)
102
+
103
+ Critério objetivo em `MORPH.md` §2.1: a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação)?
104
+
105
+ - **Sim** → em vez do `advance {feature}` do passo 3, rode `morph-spec advance {feature} --design` (cria `1-design/`) e invoque `Skill(morph-uiux)`. Ela conduz a fase de design e, com o Gate uiux aprovado, devolve o controle aqui — siga para o passo 4.
106
+ - **Não** → nenhuma ação extra; o `advance {feature}` do passo 3 já criou `2-plan/` direto.
107
+
107
108
  ### 4. Verificar retomada antes de morph-plan
108
109
 
109
110
  - Se `.morph/features/{feature}/2-plan/spec.md` já existe: pular para passo 6 (Gate 2).
@@ -118,13 +119,7 @@ A skill lê `proposal.md` e produz:
118
119
 
119
120
  ### 6. Gate 2 (trust-aware)
120
121
 
121
- Sinais de risco para Gate 2 incluem **mais** do que Gate 1:
122
-
123
- - Todos os do Gate 1.
124
- - `taskCount` — count(tasks.json.tasks). Threshold: 20.
125
- - `standardsViolations` detectadas no mandate (improvável, mas verificar).
126
-
127
- Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprovação).
122
+ Mesma mecânica do passo 3: a decisão já foi tomada e persistida pela `morph-plan` (passo 6) — `morph-spec gate-check {feature} plan` no caminho comum (`shouldPauseGate` sobre `taskCount` do disco; `designSystemDivergence`/`standardsViolations` via `--signals` quando aplicável — não são herdados automaticamente entre gates), ou `gate-decision` manual para risco que nenhuma dessas chaves representa. Leia `gateDecisions.plan` para `pause`/`reason` e apresente com o mesmo template (AskUserQuestion ou auto-aprovação) do passo 3.
128
123
 
129
124
  ### 7. Conclusão
130
125
 
@@ -141,6 +136,7 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
141
136
  ## Output esperado
142
137
 
143
138
  - `.morph/features/{feature}/0-proposal/proposal.md`
139
+ - `.morph/features/{feature}/1-design/` (se o ramo uiux — passo 3a — foi tomado)
144
140
  - `.morph/features/{feature}/2-plan/spec.md`
145
141
  - `.morph/features/{feature}/2-plan/mandate.md`
146
142
  - `.morph/features/{feature}/2-plan/tasks.json`
@@ -151,6 +147,7 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
151
147
  - `.morph/framework/MORPH.md` — charter NLH completo
152
148
  - `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
153
149
  - `framework/skills/core/morph-brainstorming/SKILL.md`
150
+ - `framework/skills/core/morph-uiux/SKILL.md` — invocada no passo 3a quando a feature toma o ramo uiux
154
151
  - `framework/skills/core/morph-plan/SKILL.md`
155
152
  - `framework/skills/core/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
156
153
  - `.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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-review
@@ -68,9 +68,12 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
68
68
  um turno inútil ao orquestrador.
69
69
  Seu relatório (no arquivo, e na mensagem final quando ela chega)
70
70
  deve conter: score 0-10 por dimensão, score composto (arch×0.30 +
71
- contracts×0.25 + quality×0.25 + tests×0.20), e feedback priorizado
72
- (bloqueantes primeiro) para qualquer dimensão < 9. Relatório
73
- ausente, oco, ou sem esses itens, é falha de protocolo.
71
+ contracts×0.25 + quality×0.25 + tests×0.20) gravado TAMBÉM como a
72
+ linha literal `**Composite-Score:** {n.n}` (machine-readable — o
73
+ `morph-spec gate-check` lê o score real daí em vez do proxy de
74
+ taskScores), e feedback priorizado (bloqueantes primeiro) para
75
+ qualquer dimensão < 9. Relatório ausente, oco, ou sem esses itens,
76
+ é falha de protocolo.
74
77
  ```
75
78
  - **Fallback (tipo não registrado):** se `morph-evaluator` não estiver na sua lista de subagent types, despache `general-purpose` colando o campo `persona` do agente `evaluator` (Read em `.morph/framework/agents.json`) no topo do prompt — e **registre o fallback no review-report** (seção de método).
76
79
  - **Leia primeiro** `.morph/features/{feature}/4-review/evaluator-report.md` — é o valor de retorno autoritativo, não a mensagem de texto do dispatch (que é cortesia, útil só quando chega inteira). Os scores por dimensão e o composto do review-report vêm **desse arquivo**, não da sua auto-avaliação. Se o arquivo vier ausente, oco, ou sem os scores por dimensão, registre a falha de protocolo na seção de método do review-report e re-despache.
@@ -97,12 +100,16 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
97
100
 
98
101
  8. Apresente o Gate 3 segundo trust mode.
99
102
 
100
- Ler `.morph/config/config.json → trust` (default `"auto"`). Calcular os sinais de risco em linguagem natural — sem scripts:
103
+ Rode `morph-spec gate-check {feature} review [--json]` — lê `trust` de `.morph/config/config.json`, decide via `shouldPauseGate` e persiste `gateDecisions.review` com timestamp server-side, imprimindo `pause`/`reason`/`signals`. É o default — não recompute a tabela do MORPH.md §5 em linguagem natural.
101
104
 
102
- - `evalScore` = score composto retornado pelo **avaliador independente** (passo 4).
103
- - `standardsViolations` = ids dos itens bloqueantes de standard encontrados no passo 3.
105
+ **`evalScore` sem override é uma PROXY** (média das `taskScores`, não o composto real). Passe o composto retornado pelo **avaliador independente** (passo 4) e qualquer item bloqueante encontrado nas **verificações mecânicas sempre-rodar** do passo 3 via `--signals` — as únicas chaves que este comando aceita sobrescrever:
106
+ ```
107
+ morph-spec gate-check {feature} review --signals '{"evalScore":9.2,"standardsViolations":[]}'
108
+ ```
109
+
110
+ Julgamento do revisor que nenhuma dessas chaves representa: use `gate-decision` direto em vez de `gate-check`.
104
111
 
105
- **Decisão de pausa** (mesmas regras da tabela do MORPH.md §5): `trust: manual` → `pause: true` sempre; `standardsViolations` não-vazio → `pause: true`; `evalScore < 9` → `pause: true`; caso contrário → `pause: false` (auto-passa).
112
+ **Nunca edite `feature.json` à mão** (colide com o hook state-sync). Os caminhos acima gravam no mesmo lugar; o hook `gate-guard.js` confere depois se a ação bateu com a decisão persistida.
106
113
 
107
114
  **Se `pause === true`**, use `AskUserQuestion`:
108
115
 
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: morph-stack-scan
3
- description: Varre o codebase existente, detecta stack atual, compara com o stack padrão e gera migration-plan.md se houver desvios
3
+ description: Varre o codebase existente, detecta stack atual, compara com o stack padrão e registra desvios em stack-scan.md
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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-stack-scan
@@ -108,29 +108,25 @@ Antes de despachar Explore, verifique se o projeto é greenfield:
108
108
  | Runtime | .NET X | .NET 10 | ✓ / ✗ |
109
109
  ...
110
110
 
111
- ## Desvios
111
+ ## Desvios (ordenados por severidade)
112
112
  ### Bloqueantes
113
- - {desvio}: {onde foi encontrado} — impacto: {o que quebra se não migrar}
113
+ - {desvio}: {onde foi encontrado} — impacto: {o que quebra se não migrar} — esforço: {estimativa}
114
114
 
115
115
  ### Não bloqueantes
116
- - {desvio}: {onde foi encontrado} — migração: {como resolver}
116
+ - {desvio}: {onde foi encontrado} — migração: {como resolver} — esforço: {estimativa}
117
117
 
118
118
  ## Recomendação
119
119
  {Em compliance — prosseguir para morph-brainstorming}
120
- {ou: Migração necessária antes de prosseguir — veja migration-plan.md}
120
+ {ou: Migração necessária antes de prosseguir — ver Desvios acima}
121
121
  ```
122
122
 
123
- 4. Se houver desvios bloqueantes ou altos, produza `migration-plan.md` em `.morph/features/{feature}/0-proposal/` com:
124
- - Lista de desvios ordenados por severidade
125
- - Para cada desvio: o que migrar, como migrar, estimativa de esforço, ordem sugerida
126
- - Pergunta única via `AskUserQuestion`: "Esta migração deve ser incluída na feature atual ou tratada numa feature separada?"
123
+ 4. Se houver desvios bloqueantes ou altos, pergunte via `AskUserQuestion`: "Esta migração deve ser incluída na feature atual ou tratada numa feature separada?" A resposta é decisão humana — registre-a na seção "Compliance de stack" do `proposal.md` (produzido pela `morph-brainstorming`), não num artefato novo: a lista de desvios com impacto/esforço já vive no `stack-scan.md` acima.
127
124
 
128
125
  5. Se não houver desvios (ou apenas baixos): informe "codebase em compliance com o stack padrão" e prossiga para morph-brainstorming ou morph-plan conforme o contexto.
129
126
 
130
127
  ## Output esperado
131
- - `.morph/features/{feature}/0-proposal/stack-scan.md` — resultado da varredura
132
- - `.morph/features/{feature}/0-proposal/migration-plan.md` — apenas se houver desvios altos/bloqueantes
133
- - Decisão documentada: incluir migração nesta feature ou separar
128
+ - `.morph/features/{feature}/0-proposal/stack-scan.md` — resultado da varredura, com desvios ordenados por severidade e esforço estimado
129
+ - Decisão documentada: incluir migração nesta feature ou separar (registrada no proposal.md pela morph-brainstorming)
134
130
 
135
131
  ## Referências
136
132
  - `framework/MORPH.md` — seção 4 (Standards), seção 2 (Fases)
@@ -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: "8.18.0"
7
+ cliVersion: "8.20.0"
8
8
  ---
9
9
 
10
10
  # morph-standards
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: morph-uiux
3
+ description: Conduz a fase opcional de UI/UX — design system, mockups, componentes e fluxos — entre o Gate 1 e o plan, despachando a persona ui-designer para o trabalho visual.
4
+ version: core
5
+ when-to-invoke: ao tomar o ramo uiux (morph-spec advance --design), depois do Gate 1 e antes do morph-plan
6
+ user-invokable: true
7
+ cliVersion: "8.20.0"
8
+ ---
9
+
10
+ # morph-uiux
11
+
12
+ ## Objetivo
13
+
14
+ Produzir os artefatos de `1-design/` com qualidade de produção — boas práticas de UI/UX, usabilidade, consistência com o padrão visual do projeto, tecnologia de ponta do stack instalado — e apresentar o Gate uiux antes de entregar a feature ao `morph-plan`.
15
+
16
+ ## Quando invocar
17
+
18
+ Ao tomar o ramo opcional uiux: feature/bug cuja mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação) — critério objetivo em `MORPH.md` §2.1. Normalmente invocada pela `morph-proposal` logo após o Gate 1, via `morph-spec advance {feature} --design`. Sem essa condição a feature segue direto para `morph-plan` e esta skill nunca é chamada.
19
+
20
+ ## O que fazer
21
+
22
+ 1. **Garanta os insumos em contexto** — use a tool Read se não estiver:
23
+ - `.morph/features/{feature}/0-proposal/proposal.md` — problema, escopo, usuários e fluxos.
24
+ - `.morph/context/design-system.md` (se existir) — o design system **vivo** do projeto: toda decisão de token/componente parte dele, nunca do zero. Ausente → greenfield de design; use `.morph/framework/templates/context/design-system.md` como forma de partida.
25
+ - `.morph/config/config.json` → `project.stack` — decide a tecnologia de ponta a aplicar (`nextjs` → Tailwind + shadcn + Framer Motion; outro stack → o equivalente idiomático dele). Nunca hardcode Next.js quando o stack detectado é outro.
26
+ - `.morph/features/{feature}/0-proposal/stack-scan.md` (se existir) — desvios de stack já detectados.
27
+
28
+ 2. **Princípios de qualidade** (decisão do produto — não são opcionais):
29
+ - **Usabilidade e acessibilidade:** WCAG AA, todos os estados de componente interativo cobertos (default/hover/focus/disabled/loading/error) — não só o caminho feliz.
30
+ - **Consistência:** reusa tokens/componentes existentes de `.morph/context/design-system.md` antes de criar novos; um token novo precisa de justificativa (o existente não cobre o caso).
31
+ - **Tecnologia de ponta condicionada ao stack real** (passo 1) — nunca a suposição de que o projeto é Next.js.
32
+ - **Sistemas, não telas isoladas** — mesmo critério da persona `ui-designer`: componentes reutilizáveis antes de composições de uso único.
33
+
34
+ 3. **Despache `morph-ui-designer`** para o trabalho visual — dispatch é o default aqui (domínio diferente do Orchestrator, MORPH.md §6). `morph-ui-designer` tem `Read/Write/Edit/Glob/Grep` + MCPs `stitch`/`gemini-image`/`playwright`/`context7`, mas **não tem Bash** — não peça build, testes nem `morph-spec` a ele; isso é do orquestrador.
35
+
36
+ **Fallback — caminho normal fora de stack Next.js** (`ui-designer.stack = ["nextjs"]` em `agents.json`, então em qualquer outro stack o subagent não está registrado): `general-purpose` colando o campo `persona` (Read em `.morph/framework/agents.json`) no prompt, registrando o fallback no relatório. Isto não é uma exceção rara — é o caminho normal para projetos não-Next.js.
37
+
38
+ Template do prompt (contrato do relatório em forma curta — copia o padrão de `morph-implement` §4, sem a cláusula de build/isolamento, que não se aplica a um agente sem Bash):
39
+ ```
40
+ Produzir os artefatos de UI/UX de [feature] em `.morph/features/{feature}/1-design/`.
41
+
42
+ Contexto: [problema/escopo do proposal.md] + design system atual
43
+ (`.morph/context/design-system.md`, tokens/componentes a reusar) + stack: [stack real do config.json]
44
+
45
+ Produza, NESTA ORDEM — design-system.md primeiro, os demais só como aplicável ao escopo:
46
+ 1. `design-system.md` — tokens (cor, tipografia, espaço, motion) consistentes com o projeto
47
+ 2. `mockups.md` — descrição estruturada de cada tela nova/alterada (+ imagem via MCP
48
+ gemini-image/stitch quando disponível; fallback: descrição textual detalhada)
49
+ 3. `components.md` — inventário de componentes novos/reusados, com props e os estados do
50
+ princípio 2 acima
51
+ 4. `flows.md` — fluxos de navegação/interação entre as telas
52
+
53
+ Done quando: os artefatos aplicáveis existem e cada um cita os tokens/componentes do
54
+ design-system.md em vez de reinventar valores soltos.
55
+
56
+ Contrato do relatório final:
57
+ 1. GRAVE um relatório por artefato produzido em
58
+ `1-design/reports/[artefato]-report.md` (ex.: `1-design/reports/design-system-report.md`)
59
+ ANTES de encerrar — é o retorno autoritativo, não a sua mensagem final (cortesia
60
+ best-effort, pode não chegar inteira). NÃO chame SendMessage.
61
+ 2. Você não tem Bash — não rode `morph-spec`, build nem testes; a aprovação do Gate uiux
62
+ e qualquer comando CLI são do orquestrador.
63
+ 3. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão.
64
+
65
+ Cada relatório contém: (1) o que foi feito em 2-3 frases, (2) o artefato produzido,
66
+ (3) decisões de design e por quê (token reusado vs. novo, padrão de acessibilidade
67
+ aplicado), (4) auto-score 0-10 com justificativa em uma linha. Relatório ausente, oco,
68
+ ou sem os 4 itens, é falha de protocolo.
69
+ ```
70
+
71
+ Após o retorno: **leia primeiro** `1-design/reports/*-report.md` — valor de retorno autoritativo, a mensagem de texto é atalho best-effort quando chega inteira. `design-system.md` é o único output obrigatório (`phases.json → uiux.requiredOutputs`); sem ele em disco, `morph-spec advance` recusa avançar — confirme que existe antes de rodar `advance` no passo 6.
72
+
73
+ 4. **Atualize o design system vivo do projeto** — se a Parte 3 introduziu tokens/componentes novos, aplique o mesmo protocolo do `morph-brainstorming` (Parte 0): atualize `.morph/context/design-system.md` com a adição e uma entrada de changelog (data, motivo). `1-design/design-system.md` é o artefato **da feature** (o que ela usa/introduz); `.morph/context/design-system.md` é o acervo vivo do **projeto** — não confunda os dois.
74
+
75
+ 5. **Os artefatos alimentam o `morph-plan` seguinte.** Use cases e tasks de UI referenciam `1-design/mockups.md`/`components.md` **por path** (ex.: doneCriteria citando a seção do mockup) — não redigite conteúdo visual em `spec.md`.
76
+
77
+ 6. Apresente o Gate uiux.
78
+
79
+ Rode `morph-spec gate-check {feature} uiux [--json]` — mesma mecânica de `morph-plan`/`morph-review`: lê `trust`, decide via `shouldPauseGate` e persiste `gateDecisions.uiux` com timestamp server-side. Divergência de design-system detectada aqui (fonte do projeto vs. o que a feature precisa) é uma das poucas chaves que `--signals` aceita sobrescrever:
80
+ ```
81
+ morph-spec gate-check {feature} uiux --signals '{"designSystemDivergence":true}'
82
+ ```
83
+
84
+ **Se `pause === true`**, use `AskUserQuestion`:
85
+ ```
86
+ question: "Gate uiux — Design de {feature} aprovado?{ reason ? ' Sinal: ' + reason : '' }"
87
+ header: "Gate uiux"
88
+ options:
89
+ - { label: "aprovado, prosseguir", description: "Aceitar design-system/mockups/components/flows e avançar para o plano" }
90
+ - { label: "preciso ajustar", description: "Apontar mudanças no design antes de prosseguir" }
91
+ - { label: "cancelar feature", description: "Abortar" }
92
+ ```
93
+
94
+ Aguardar resposta. Se "preciso ajustar", aplicar e reapresentar.
95
+
96
+ **Divergência do hook state-sync — só neste gate:** ao contrário de Gate 1/2/3, o hook `state-sync.js` (`gateFromQuestion`) não reconhece o texto "Gate uiux" — uma resposta "aprovado" aqui **não** grava o gate sozinha. Depois do "aprovado", grave explicitamente:
97
+ ```
98
+ morph-spec approve {feature} uiux --approver <quem respondeu>
99
+ # ou, para já aprovar e criar 2-plan/ num passo só:
100
+ morph-spec advance {feature} --approver <quem respondeu>
101
+ ```
102
+ (o `--approver` importa aqui: sem ele, num terminal não-interativo `advance`/`approve` resolvem `approvedBy: "auto"` — que MORPH.md §5 proíbe registrar quando quem aprovou foi um humano.)
103
+
104
+ **Se `pause === false`** (auto-aprovação, sem `AskUserQuestion`), exibir summary curto e já aprovar via CLI:
105
+ ```
106
+ ## Gate uiux (auto-aprovado)
107
+
108
+ **Design system:** {tokens novos, se houver} | **Mockups:** {N telas}
109
+ **Components:** {N novos / N reusados} | **Flows:** {N fluxos}
110
+ ```
111
+ ```
112
+ morph-spec advance {feature}
113
+ ```
114
+
115
+ Os 4 outputs de `1-design/` (`protected: true, approvalGate: 'uiux'`) travam na aprovação — retrabalho de design depois do gate passa pelo gate de novo (revogar, ajustar, reapresentar), nunca por Edit direto no arquivo travado.
116
+
117
+ **Próximo passo (não é desta skill):** com o Gate uiux aprovado e `2-plan/` criado, devolva o controle a quem invocou (`morph-proposal`, passo 4/5) — ela invoca `Skill(morph-plan)`. Não invoque `morph-plan` diretamente daqui.
118
+
119
+ ## Output esperado
120
+
121
+ - `.morph/features/{feature}/1-design/design-system.md` — obrigatório
122
+ - `.morph/features/{feature}/1-design/mockups.md`, `components.md`, `flows.md` — conforme o escopo exigir
123
+ - `.morph/features/{feature}/1-design/reports/*-report.md` — relatório(s) bruto(s) do `morph-ui-designer` despachado no passo 3
124
+ - `.morph/context/design-system.md` atualizado (se tokens/componentes novos entraram) com entrada de changelog
125
+ - Gate uiux registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo)
126
+
127
+ ## Referências
128
+
129
+ - `.morph/framework/MORPH.md` §2.1 — critério objetivo de entrada no ramo uiux
130
+ - `.morph/framework/MORPH.md` §6 — protocolo de dispatch e contrato do relatório final
131
+ - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
132
+ - `.morph/framework/agents.json` — persona `ui-designer` (tools, MCPs, standards)
133
+ - `.morph/framework/templates/context/design-system.md` — forma de partida quando o projeto não tem design system vivo
134
+ - `framework/skills/core/morph-brainstorming/SKILL.md` — protocolo de reconciliação/changelog do design-system vivo (Parte 0), reaplicado no passo 4
135
+ - `framework/skills/core/morph-plan/SKILL.md` — consome os artefatos desta fase por path
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polymorphism-tech/morph-spec",
3
- "version": "8.18.0",
3
+ "version": "8.20.0",
4
4
  "description": "MORPH-SPEC: NLH (Natural Language Harness) for spec-driven development with Claude Code",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -62,7 +62,7 @@ function getPhaseStatus(phaseKey, currentPhase, feature) {
62
62
  */
63
63
  function checkPhaseOutputs(phaseKey, feature) {
64
64
  const phaseOutputMap = {
65
- proposal: ['proposal', 'stackScan', 'migrationPlan'],
65
+ proposal: ['proposal', 'stackScan'],
66
66
  uiux: ['uiDesignSystem', 'uiMockups', 'uiComponents', 'uiFlows'],
67
67
  plan: ['spec', 'mandate', 'tasks', 'decisions'],
68
68
  implement: ['recap'],
@@ -100,7 +100,7 @@ function formatPhase(phaseKey, currentPhase, feature, options = {}) {
100
100
  // Add output files if verbose
101
101
  if (options.verbose && status !== 'pending' && status !== 'skipped') {
102
102
  const phaseOutputMap = {
103
- proposal: ['proposal', 'stackScan', 'migrationPlan'],
103
+ proposal: ['proposal', 'stackScan'],
104
104
  uiux: ['uiDesignSystem', 'uiMockups', 'uiComponents', 'uiFlows'],
105
105
  plan: ['spec', 'mandate', 'tasks', 'decisions'],
106
106
  implement: ['recap'],