@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.
- package/README.md +2 -2
- package/bin/morph-spec.js +9 -0
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +8 -15
- package/framework/MORPH.md +56 -58
- package/framework/commands/morph-hotfix.md +1 -1
- package/framework/docs/CLI.md +3 -2
- package/framework/hooks/shared/phase-utils.js +0 -2
- package/framework/phases.json +2 -2
- package/framework/rules/morph-workflow.md +1 -1
- package/framework/schemas/feature.schema.json +12 -0
- package/framework/skills/README.md +1 -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 +10 -14
- package/framework/skills/core/morph-brainstorming/SKILL.md +11 -22
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +4 -4
- package/framework/skills/core/morph-implement/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +14 -20
- package/framework/skills/core/morph-proposal/SKILL.md +12 -15
- package/framework/skills/core/morph-review/SKILL.md +15 -8
- package/framework/skills/core/morph-stack-scan/SKILL.md +9 -13
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +135 -0
- package/package.json +1 -1
- package/src/commands/project/status.js +2 -2
- package/src/commands/state/gate-check.js +223 -0
- package/src/commands/state/gate-decision.js +46 -10
- package/src/commands/validation/verify.js +18 -1
- package/src/core/paths/output-schema.js +0 -1
- package/src/lib/agents/output-collector.js +0 -1
- package/src/lib/git/default-branch.js +65 -0
- package/src/lib/risk-detector.js +13 -0
- 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.
|
|
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.
|
|
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`.
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
-
##
|
|
58
|
-
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
157
|
+
morph-spec gate-check {feature} plan --signals '{"designSystemDivergence":true,"standardsViolations":["<id>"]}'
|
|
166
158
|
```
|
|
167
159
|
|
|
168
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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)
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
**
|
|
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
|
|
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.
|
|
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 —
|
|
120
|
+
{ou: Migração necessária antes de prosseguir — ver Desvios acima}
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
-
4. Se houver desvios bloqueantes ou altos,
|
|
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
|
-
-
|
|
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.
|
|
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
|
@@ -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'
|
|
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'
|
|
103
|
+
proposal: ['proposal', 'stackScan'],
|
|
104
104
|
uiux: ['uiDesignSystem', 'uiMockups', 'uiComponents', 'uiFlows'],
|
|
105
105
|
plan: ['spec', 'mandate', 'tasks', 'decisions'],
|
|
106
106
|
implement: ['recap'],
|