@polymorphism-tech/morph-spec 7.3.0 → 7.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1 -1
- package/README.md +2 -2
- package/bin/morph-spec.js +22 -2
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +10 -5
- package/framework/MORPH.md +31 -14
- package/framework/agents.json +132 -132
- package/framework/commands/create-umbraco-lp.md +35 -0
- package/framework/commands/migrate-lp-to-umbraco.md +33 -0
- package/framework/commands/morph-archive.md +17 -27
- package/framework/evals/rubrics/README.md +9 -8
- package/framework/hooks/README.md +2 -0
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +115 -90
- package/framework/hooks/claude-code/core/gate-guard.js +160 -0
- package/framework/hooks/claude-code/core/protect-spec-files.js +32 -30
- package/framework/hooks/claude-code/core/state-sync.js +16 -36
- package/framework/hooks/claude-code/core/validate-completion.js +105 -0
- package/framework/hooks/shared/state-reader.js +302 -221
- package/framework/hooks/shared/state-writer.js +124 -0
- package/framework/rules/morph-task-tracking.md +69 -49
- package/framework/rules/morph-workflow.md +192 -191
- package/framework/skills/README.md +1 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +252 -0
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +452 -0
- package/framework/skills/core/morph-apply/SKILL.md +69 -27
- package/framework/skills/core/morph-brainstorming/SKILL.md +6 -2
- package/framework/skills/core/morph-eval/SKILL.md +4 -5
- package/framework/skills/core/morph-implement/SKILL.md +51 -22
- package/framework/skills/core/morph-plan/SKILL.md +10 -4
- package/framework/skills/core/morph-proposal/SKILL.md +8 -7
- package/framework/skills/core/morph-review/SKILL.md +15 -8
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/standards/ai-agents/setup.md +258 -244
- package/framework/templates/REGISTRY.json +1 -3
- package/framework/templates/context/CONTEXT-FEATURE.md +10 -17
- package/framework/templates/context/CONTEXT.md +181 -180
- package/framework/templates/docs/onboarding.md +122 -118
- package/framework/templates/docs/proposal.md +10 -0
- package/framework/templates/docs/spec.md +228 -228
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -80
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -89
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +2 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +44 -43
- package/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -107
- package/package.json +1 -1
- package/src/commands/project/init.js +517 -515
- package/src/commands/project/update.js +415 -368
- package/src/commands/project/worktree.js +212 -210
- package/src/commands/state/advance.js +82 -0
- package/src/commands/state/approve.js +251 -213
- package/src/commands/state/archive.js +111 -0
- package/src/commands/validation/validate-feature.js +244 -79
- package/src/core/state/state-manager.js +256 -74
- package/src/dashboard/scanner/state-scanner.js +35 -8
- package/src/lib/generators/context-generator.js +12 -8
- package/src/lib/risk-detector.js +2 -2
- package/src/utils/file-copier.js +7 -0
- package/src/utils/hooks-installer.js +527 -516
package/CLAUDE.md
CHANGED
|
@@ -52,7 +52,7 @@ No build step — pure ESM JavaScript, runs directly via Node.js 18+.
|
|
|
52
52
|
- `agents.json` (v5.0.0) — 7 domain personas, no tiers
|
|
53
53
|
- `phases.json` — 5 phases (proposal, uiux, plan, implement, review)
|
|
54
54
|
- `standards/STANDARDS.json` — index of available standards
|
|
55
|
-
- `hooks/claude-code/core/` —
|
|
55
|
+
- `hooks/claude-code/core/` — 7 fail-open guardrail hooks
|
|
56
56
|
- `skills/core/` — 7 core NLH skills (single source of truth)
|
|
57
57
|
- `templates/` — Handlebars templates for code generation
|
|
58
58
|
- `mcp/registry.json` — MCP server registry
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Spec-driven development framework for multi-stack projects. Turns feature requests into implementation-ready code through structured, AI-orchestrated phases.
|
|
4
4
|
|
|
5
5
|
**Package:** `@polymorphism-tech/morph-spec`
|
|
6
|
-
**Version:** 7.
|
|
6
|
+
**Version:** 7.5.0
|
|
7
7
|
**Requires:** Node.js 22+, Claude Code
|
|
8
8
|
|
|
9
9
|
---
|
|
@@ -365,4 +365,4 @@ Code generated by morph-spec (contracts, templates, implementation output) belon
|
|
|
365
365
|
|
|
366
366
|
---
|
|
367
367
|
|
|
368
|
-
*morph-spec v7.
|
|
368
|
+
*morph-spec v7.5.0 by [Polymorphism Tech](https://polymorphism.tech)*
|
package/bin/morph-spec.js
CHANGED
|
@@ -26,6 +26,8 @@ import { worktreeSetupCommand } from '../src/commands/project/worktree.js';
|
|
|
26
26
|
|
|
27
27
|
// === Approval gates (human-only) ===
|
|
28
28
|
import { approveCommand, approvalStatusCommand, unapproveCommand } from '../src/commands/state/approve.js';
|
|
29
|
+
import { advanceCommand } from '../src/commands/state/advance.js';
|
|
30
|
+
import { archiveCommand } from '../src/commands/state/archive.js';
|
|
29
31
|
|
|
30
32
|
// === Validation ===
|
|
31
33
|
import { validateCommand } from './validate.js';
|
|
@@ -112,10 +114,27 @@ program
|
|
|
112
114
|
program
|
|
113
115
|
.command('approve <feature> <gate>')
|
|
114
116
|
.description('Approve a phase gate (proposal, plan, review)')
|
|
115
|
-
.option('--approver <name>', 'Name of approver (default: current user)')
|
|
117
|
+
.option('--approver <name>', 'Name of approver (default: current user when interactive, "auto" otherwise)')
|
|
118
|
+
.option('--mode <mode>', 'Approval mode: "user" or "auto" (default: detected from TTY)')
|
|
116
119
|
.option('--notes <notes>', 'Approval notes')
|
|
117
120
|
.action((feature, gate, options) => approveCommand(feature, gate, options));
|
|
118
121
|
|
|
122
|
+
program
|
|
123
|
+
.command('advance <feature>')
|
|
124
|
+
.description('Approve the current phase gate and scaffold the next phase folder (one step)')
|
|
125
|
+
.option('--approver <name>', 'Name of approver (default: current user when interactive, "auto" otherwise)')
|
|
126
|
+
.option('--mode <mode>', 'Approval mode: "user" or "auto" (default: detected from TTY)')
|
|
127
|
+
.option('--design', 'From proposal, advance into the optional design (uiux) phase instead of plan')
|
|
128
|
+
.option('--notes <notes>', 'Approval notes')
|
|
129
|
+
.action((feature, options) => advanceCommand(feature, options));
|
|
130
|
+
|
|
131
|
+
program
|
|
132
|
+
.command('archive <feature>')
|
|
133
|
+
.description('Archive a completed feature (atomic, git-aware): move folder + update state')
|
|
134
|
+
.option('--no-git', 'Skip git staging of the move')
|
|
135
|
+
.option('--force', 'Archive even if Gate 3 (review) is not approved')
|
|
136
|
+
.action((feature, options) => archiveCommand(feature, options));
|
|
137
|
+
|
|
119
138
|
program
|
|
120
139
|
.command('approval-status <feature>')
|
|
121
140
|
.description('Show approval status for all gates')
|
|
@@ -125,7 +144,8 @@ program
|
|
|
125
144
|
program
|
|
126
145
|
.command('unapprove <feature> <gate>')
|
|
127
146
|
.description('Revoke a phase gate approval (recovery only)')
|
|
128
|
-
.option('--revoker <name>', 'Name of person revoking')
|
|
147
|
+
.option('--revoker <name>', 'Name of person revoking (default: current user when interactive, "auto" otherwise)')
|
|
148
|
+
.option('--mode <mode>', 'Revocation mode: "user" or "auto" (default: detected from TTY)')
|
|
129
149
|
.option('--reason <reason>', 'Reason for revocation')
|
|
130
150
|
.action((feature, gate, options) => unapproveCommand(feature, gate, options));
|
|
131
151
|
|
package/claude-plugin.json
CHANGED
package/docs/CHEATSHEET.md
CHANGED
package/docs/QUICKSTART.md
CHANGED
package/framework/CLAUDE.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
## Como começar cada sessão
|
|
6
6
|
|
|
7
7
|
1. Leia `.morph/framework/MORPH.md` — o charter NLH com papéis, fases, gates e skills.
|
|
8
|
-
2. Leia `.morph/state.json` —
|
|
8
|
+
2. Leia `.morph/state.json` — índice fino e gitignored (só status + updatedAt por feature) — para identificar a feature `in_progress` e a fase atual. **Não o edite à mão:** é reconstruído a partir dos `feature.json` a cada load. O estado autoritativo e commitado de cada feature vive em `.morph/features/{feature}/feature.json`.
|
|
9
9
|
3. Assuma o papel correspondente (Orchestrator/Specialist/Evaluator) e continue o trabalho. Não aguarde instrução do usuário se há trabalho pendente entre gates.
|
|
10
10
|
|
|
11
11
|
Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
@@ -15,16 +15,16 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
15
15
|
**NUNCA:**
|
|
16
16
|
- Pular para código sem proposal aprovado (Gate 1) e plano aprovado (Gate 2).
|
|
17
17
|
- Modificar o contrato do plano depois do Gate 2: `spec.md`, `mandate.md`, e os campos de plano de `tasks.json` (`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`) estão congelados.
|
|
18
|
-
-
|
|
18
|
+
- Tocar os campos de contrato do plano em `tasks.json` após o Gate 2 (`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`) — o hook `protect-spec-files` faz diff semântico e bloqueia mudanças neles, seja via `Write` ou `Edit`. (Os campos mutáveis `status`/`outputs`/`notes` continuam graváveis por `Write` ou `Edit` — ver SEMPRE.)
|
|
19
19
|
- Listar perguntas em texto simples — sempre use a tool `AskUserQuestion` (1-4 perguntas por chamada).
|
|
20
20
|
- Usar `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, ou SQL cru sem justificativa.
|
|
21
21
|
|
|
22
22
|
**SEMPRE:**
|
|
23
23
|
- Auto-advance entre tarefas durante a fase implement — não pause sem ambiguidade bloqueante.
|
|
24
|
-
- Atualizar o progresso em `tasks.json`
|
|
24
|
+
- Atualizar o progresso em `tasks.json` ao concluir cada task gravando apenas os campos mutáveis `status`, `outputs` e `notes` — via `Write` OU `Edit` (o hook `protect-spec-files` faz diff semântico e permite qualquer um dos dois desde que o contrato do plano permaneça congelado).
|
|
25
25
|
- Apresentar gates com o template fixo definido em MORPH.md / morph-plan.
|
|
26
26
|
- Registrar decisões não triviais em `decisions.md`.
|
|
27
|
-
- Aplicar `morph-eval` após cada tarefa; silêncio em score ≥
|
|
27
|
+
- Aplicar `morph-eval` após cada tarefa; silêncio em score ≥ 9 é o sinal correto. Score < 9 dispara o loop de correção autônomo (re-implementa, sem pausa), não escala ao humano entre tarefas.
|
|
28
28
|
|
|
29
29
|
## Slash commands
|
|
30
30
|
|
|
@@ -33,10 +33,15 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
33
33
|
| `/morph-proposal {feature}` | Entendimento de negócio + plano (Gates 1 e 2) |
|
|
34
34
|
| `/morph-apply {feature}` | Execução autônoma + review (Gate 3) |
|
|
35
35
|
| `/morph-status [feature]` | Status da feature ativa (ou a especificada) |
|
|
36
|
-
| `/morph-archive {feature}` | Arquiva feature concluída (após Gate 3) |
|
|
36
|
+
| `/morph-archive {feature}` | Arquiva feature concluída (após Gate 3) — wrapper de `morph-spec archive` (atômico, git-aware) |
|
|
37
37
|
| `/morph-preflight` | Validação pré-deploy (specs, contratos, testes, infra) |
|
|
38
38
|
| `/morph-troubleshoot [erro]` | Diagnóstico de erros .NET/Next.js com root-cause analysis |
|
|
39
39
|
|
|
40
|
+
**Comandos CLI de gate** (a LLM os usa em vez de editar o estado à mão para aprovar/avançar):
|
|
41
|
+
- `morph-spec approve <feature> <gate> --mode auto` — aprova um gate (`proposal`/`plan`/`review`) em `trust: auto`.
|
|
42
|
+
- `morph-spec advance <feature>` — aprova o gate da fase corrente **e** cria a pasta da próxima fase num passo só (`--design` toma o ramo opcional de uiux a partir da proposta).
|
|
43
|
+
- `morph-spec archive <feature>` — arquiva a feature (atômico, git-aware); é o que `/morph-archive` chama.
|
|
44
|
+
|
|
40
45
|
## Skills core (em `.claude/skills/`)
|
|
41
46
|
|
|
42
47
|
| Skill | Quando usar |
|
package/framework/MORPH.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
> Ele define papéis, fases, outputs, standards, gates e skills do morph-spec.
|
|
5
5
|
> Não procure instruções em hooks — o harness vive aqui.
|
|
6
6
|
>
|
|
7
|
-
> **Depois de ler:** leia `.morph/state.json` para identificar a feature ativa e a fase atual.
|
|
7
|
+
> **Depois de ler:** leia `.morph/state.json` para identificar a feature ativa e a fase atual. `state.json` é um **índice fino e gitignored** (só status + updatedAt por feature, reconstruído a partir dos `feature.json` a cada load) — use-o apenas para descobrir a feature ativa, **nunca o edite à mão** (a edição é perdida no próximo load). O estado autoritativo e commitado de cada feature vive em `.morph/features/{feature}/feature.json`. Se houver uma feature `in_progress`, assuma o papel correspondente à fase e continue o trabalho sem esperar instrução. Se não houver feature ativa, pergunte ao usuário qual feature trabalhar ou se é uma feature nova.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -21,9 +21,9 @@ Entre gates, você opera com autonomia total. O dev valida. Você executa.
|
|
|
21
21
|
| Sub-agent com auto-score ≥ 7 | Integrar ao recap.md e continuar |
|
|
22
22
|
| Sub-agent com auto-score < 7 | Aplicar morph-eval antes de aceitar |
|
|
23
23
|
| Build/typecheck quebra | Corrigir antes de marcar tarefa como done |
|
|
24
|
-
| Score morph-eval ≥
|
|
25
|
-
| Score morph-eval
|
|
26
|
-
| Score morph-eval <
|
|
24
|
+
| Score morph-eval ≥ 9 | Silêncio (aprovação implícita), próxima tarefa |
|
|
25
|
+
| Score morph-eval < 9 numa task | Loop de correção autônomo: re-implementar com o feedback priorizado, até 3 tentativas, sem pausa humana |
|
|
26
|
+
| Score morph-eval < 9 após 3 tentativas | Escalar ao usuário (aceitar / continuar tentando / pular) — único ponto de pausa do loop de implement |
|
|
27
27
|
|
|
28
28
|
**Regra de ouro:** Dúvida que não bloqueia o progresso → resolver e registrar. Dúvida que bloqueia → uma pergunta, máximo.
|
|
29
29
|
|
|
@@ -68,7 +68,7 @@ Responsabilidades: executar tarefas do tasks.json em ordem, consultar standards
|
|
|
68
68
|
Anti-padrão: o Specialist não cria novas tarefas. Descobertas de escopo durante a implementação vão para o decisions.md com flag "escopo expandido" — o Orchestrator avalia se o tasks.json precisa ser atualizado.
|
|
69
69
|
|
|
70
70
|
**Evaluator** — ativo após uma tarefa ou fase ser concluída.
|
|
71
|
-
Responsabilidades: aplicar as rubricas em `framework/evals/rubrics/`, produzir score 0-10, emitir feedback priorizado quando score <
|
|
71
|
+
Responsabilidades: aplicar as rubricas em `framework/evals/rubrics/`, produzir score 0-10, emitir feedback priorizado quando score < 9 (que alimenta o loop de correção autônomo do morph-apply), escalar para revisão humana apenas quando o loop de correção se esgotar (3 tentativas sem atingir 9).
|
|
72
72
|
Anti-padrão: o Evaluator não reescreve o código que avaliou. Se o score está abaixo de 6, o relatório vai para o humano — não para uma segunda rodada de tentativa automática.
|
|
73
73
|
|
|
74
74
|
Os papéis não são exclusivos — numa sessão longa você transita entre Orchestrator e Specialist conforme as tarefas avançam. A transição deve ser explícita: antes de mudar de papel, conclua o que estava fazendo ou registre o estado corrente no recap.md.
|
|
@@ -77,7 +77,7 @@ Os papéis não são exclusivos — numa sessão longa você transita entre Orch
|
|
|
77
77
|
|
|
78
78
|
## 2. Fases
|
|
79
79
|
|
|
80
|
-
O fluxo padrão de uma feature tem quatro fases. Cada fase tem uma pasta dedicada em `.morph/features/{feature}/`.
|
|
80
|
+
O fluxo padrão de uma feature tem quatro fases. Cada fase tem uma pasta dedicada em `.morph/features/{feature}/`. O estado autoritativo e commitado da feature mora em `.morph/features/{feature}/feature.json` (status, approvalGates, outputs, tasks, gateDecisions, taskScores, archivedAt); a raiz `.morph/state.json` é só um índice fino e gitignored derivado dele, e a identidade do projeto fica no `.morph/config/config.json` (commitado).
|
|
81
81
|
|
|
82
82
|
| Fase | Pasta | Gate | O que termina a fase |
|
|
83
83
|
|-------------|----------------|-----------------------|-------------------------------------------------|
|
|
@@ -167,7 +167,7 @@ Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), gates **
|
|
|
167
167
|
|-------|-----------|---------------|
|
|
168
168
|
| `designSystemDivergence` | true | Brainstorming detecta fontes conflitantes (spec antigo vs bundle local) |
|
|
169
169
|
| `standardsViolations` | array.length > 0 | Mandate ou implementation viola padrões proibidos |
|
|
170
|
-
| `evalScore` | <
|
|
170
|
+
| `evalScore` | < 9 | morph-review produz score composto da feature abaixo do mínimo (o loop de correção intra-task já buscou 9 por task antes daqui) |
|
|
171
171
|
| `taskCount` | > 20 | Escopo grande — provavelmente vale revisar antes de implementar |
|
|
172
172
|
|
|
173
173
|
**Gate 1 — Proposta**
|
|
@@ -186,19 +186,32 @@ Para alterar o modo: editar `.morph/config/config.json → trust` (`"auto"` ou `
|
|
|
186
186
|
|
|
187
187
|
**Comportamento padrão fora de gate:** trabalhe com autonomia total. Gates só existem nestes três pontos. Não pause para confirmação no meio de implementação a menos que encontre uma ambiguidade de escopo que o mandate não cobre — nesse caso, registre a ambiguidade no decisions.md, resolva da forma mais conservadora possível, e sinalize na entrega da task.
|
|
188
188
|
|
|
189
|
-
**O hook state-sync.js**
|
|
189
|
+
**A aprovação de gate é unificada nos comandos da CLI — a LLM nunca edita o estado à mão para aprovar um gate.** Em `trust: "auto"` (sem `AskUserQuestion`), a skill aprova o gate via `morph-spec approve <feature> <gate> --mode auto`; para aprovar o gate da fase corrente **e** já criar a pasta da próxima fase num passo só, use `morph-spec advance <feature>` (adicione `--design` para tomar o ramo opcional de uiux a partir da proposta) — isso substitui o Edit manual de state.json + `mkdir` da pasta de fase. **O hook state-sync.js** cobre o caminho manual: quando uma `AskUserQuestion` é respondida com label começando em "aprovado", ele registra o gate correspondente no `feature.json` autoritativo da feature com `approvedBy: "manual"` (um humano aprovou no loop), na forma canônica. Nos dois caminhos o gate acaba gravado em `.morph/features/{feature}/feature.json` — nunca via Edit à mão de `state.json`.
|
|
190
|
+
|
|
191
|
+
**Registre quem aprovou cada gate (`approvedBy`):** o gate é um objeto `{ approved, timestamp, approvedBy }`.
|
|
192
|
+
- `approvedBy: "auto"` — gate avançado por política `trust: auto` sem decisão humana.
|
|
193
|
+
- `approvedBy: "manual"` — um humano aprovou explicitamente (via `AskUserQuestion`, ou, quando `AskUserQuestion` está indisponível em contexto headless, via mensagem em texto do usuário começando em "aprovado"). Em `trust: manual`, todo gate é `"manual"` — nunca grave `"auto"` num gate que um humano aprovou em conversa.
|
|
194
|
+
|
|
195
|
+
Isso mantém o audit trail honesto justamente nos contextos headless (CI, `claude -p`) onde ele mais importa.
|
|
196
|
+
|
|
197
|
+
**O hook gate-guard.js** confere, sem bloquear, se a ação tomada num gate (pausar via `AskUserQuestion` vs auto-aprovar) bateu com a decisão de trust que a skill computou via `shouldPauseGate`. Para isso, a skill **persiste** a decisão no `feature.json` autoritativo da feature antes de agir: `gateDecisions[gate] = { pause, reason, signals, trust, decidedAt }` (escrito com a tool `Edit` — a allowlist permite `Edit(.morph/features/**)`). Se a ação observada divergir do registro (pausou um gate auto-aprovável, ou auto-aprovou um gate que exigia pausa), o guard injeta um aviso no contexto — a LLM corrige. É um guardrail silencioso, nunca um orquestrador: coerente, sem registro, ou erro → silêncio.
|
|
190
198
|
|
|
191
199
|
---
|
|
192
200
|
|
|
193
201
|
## 6. Sub-agents
|
|
194
202
|
|
|
195
|
-
|
|
203
|
+
A thread principal é o **Orchestrator**. Trabalho de implementação pesado ou fora do domínio corrente **deve** ser delegado a um sub-agent com persona e standard escopados — não absorvido inline na thread principal. Delegar não é uma permissão excepcional; é o modo padrão de operação para o caso pesado/multi-domínio. Implementar tudo inline porque "eu já sei o padrão" contamina o contexto principal e desperdiça o sistema de personas — é exatamente o anti-padrão que esta seção existe para evitar.
|
|
204
|
+
|
|
205
|
+
**Despache um sub-agent por padrão quando a tarefa atende a pelo menos um destes gatilhos:**
|
|
196
206
|
|
|
197
|
-
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
201
|
-
-
|
|
207
|
+
- **Domínio diferente do contexto corrente** — a task pertence a um domínio (ver `agents.json → domains`) distinto do que você está trabalhando agora (ex: você está no backend e a próxima task é frontend/UI/dados). Cruzar de domínio é o gatilho mais importante: cada domínio tem sua persona e seus standards, e o sub-agent escopado os carrega sem inchar seu contexto.
|
|
208
|
+
- **Esforço L ou XL** (duração estimada > 5 minutos).
|
|
209
|
+
- Mais de 3 tentativas de correção falharam no mesmo problema.
|
|
210
|
+
- Análise de arquivo com mais de 500 linhas.
|
|
211
|
+
- Tarefa repetitiva com mais de 3 instâncias do mesmo padrão.
|
|
212
|
+
- Risco de "contaminar" o contexto principal com detalhes de baixo nível irrelevantes para o fluxo.
|
|
213
|
+
|
|
214
|
+
Inline (sem dispatch) é aceitável para tasks curtas (effort S/M) **dentro do domínio que você já tem carregado em contexto**. Se optar por inline numa task que dispara um gatilho acima, **registre a justificativa em uma linha no decisions.md** ("inline porque o contexto X já está carregado e o overhead de dispatch não compensa") — uma escolha de inline silenciosa numa task pesada/multi-domínio é o anti-padrão.
|
|
202
215
|
|
|
203
216
|
**O que passar ao sub-agent:**
|
|
204
217
|
- Especificação da tarefa (do tasks.json)
|
|
@@ -226,6 +239,10 @@ O sub-agent deve ser autossuficiente com o que você passou. Se precisar de mais
|
|
|
226
239
|
|
|
227
240
|
**Após receber o retorno do sub-agent:** leia o auto-score. Se for < 7, aplique a skill morph-eval no resultado antes de aceitar. Se for >= 7 e sem itens bloqueantes, integre o resultado ao recap.md e siga para a próxima tarefa.
|
|
228
241
|
|
|
242
|
+
> **Anti-padrão a evitar:** implementar múltiplas tasks de domínios diferentes inline, em sequência, na thread principal — "eu já sei o padrão de cada uma". Isso é exatamente o sinal de que o sistema de delegação foi ignorado. Quando uma feature cruza ≥2 domínios, o caminho default é o Orchestrator despachando especialistas, não o Orchestrator virando faz-tudo.
|
|
243
|
+
|
|
244
|
+
**Dispatch em paralelo (multi-agent):** quando há fluxos de trabalho **genuinamente independentes** (ex: a cadeia de backend e a cadeia de frontend de uma mesma feature, que só convergem no fim), despache múltiplos sub-agents **ao mesmo tempo** — um por fluxo — em vez de processá-los em série. O orquestrador analisa o DAG de `tasks.json`, identifica os fluxos independentes (por `dependencies` e por `group`), e dispara o batch paralelo. As regras concretas de decisão sequencial vs. paralelo e o cap de agentes simultâneos vivem na skill `morph-apply` (seção "Análise de DAG"). A thread principal coordena; os especialistas executam — inclusive em paralelo.
|
|
245
|
+
|
|
229
246
|
O padrão de dispatch e o template de prompt para sub-agents estão detalhados em `framework/skills/core/morph-implement/SKILL.md`.
|
|
230
247
|
|
|
231
248
|
---
|
package/framework/agents.json
CHANGED
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "5.0.0",
|
|
3
|
-
"schema": "domain-personas",
|
|
4
|
-
"total_agents": 7,
|
|
5
|
-
"description": "Domain personas dispatched per task by the morph-implement skill. The 3 roles (Orchestrator/Specialist/Evaluator) are assumed by Claude itself per MORPH.md — these are domain personas the Specialist consults when working in a specific area.",
|
|
6
|
-
"agents": {
|
|
7
|
-
"dotnet-senior": {
|
|
8
|
-
"title": ".NET Senior Engineer",
|
|
9
|
-
"icon": "🔷",
|
|
10
|
-
"color": "blue",
|
|
11
|
-
"domains": ["backend", "backend-api", "architecture"],
|
|
12
|
-
"keywords": [
|
|
13
|
-
"backend", "api", "dotnet", ".net", "csharp", "c#",
|
|
14
|
-
"minimal api", "vertical slice", "vsa", "result pattern",
|
|
15
|
-
"feature slice", "endpoint", "handler", "validator"
|
|
16
|
-
],
|
|
17
|
-
"stack": ["dotnet"],
|
|
18
|
-
"standards": [
|
|
19
|
-
"architecture-vertical-slice-vertical-slice",
|
|
20
|
-
"backend-dotnet-result-pattern",
|
|
21
|
-
"backend-dotnet-vsa-handler-patterns",
|
|
22
|
-
"backend-dotnet-fluent-validation-vsa"
|
|
23
|
-
],
|
|
24
|
-
"persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados híbrido: IRepository<T> + IUnitOfWork para CRUD, DbContext direto no slice para queries específicas; nunca uma camada de Service/Manager. Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros."
|
|
25
|
-
},
|
|
26
|
-
"ef-modeler": {
|
|
27
|
-
"title": "EF Core / Database Modeler",
|
|
28
|
-
"icon": "🗄️",
|
|
29
|
-
"color": "cyan",
|
|
30
|
-
"domains": ["database", "data-modeling", "migrations"],
|
|
31
|
-
"keywords": [
|
|
32
|
-
"ef core", "entity framework", "neon", "postgres", "postgresql",
|
|
33
|
-
"migration", "dbcontext", "navigation property", "configuration"
|
|
34
|
-
],
|
|
35
|
-
"stack": ["dotnet"],
|
|
36
|
-
"standards": [
|
|
37
|
-
"backend-database-postgresql-database",
|
|
38
|
-
"infrastructure-neon-setup",
|
|
39
|
-
"infrastructure-neon-pgvector"
|
|
40
|
-
],
|
|
41
|
-
"persona": "Você é um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explícitas, configurações fluentes, navigation properties bem nomeadas, índices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler."
|
|
42
|
-
},
|
|
43
|
-
"maf-expert": {
|
|
44
|
-
"title": "Microsoft Agent Framework Expert",
|
|
45
|
-
"icon": "🤖",
|
|
46
|
-
"color": "purple",
|
|
47
|
-
"domains": ["ai-agents", "ai-orchestration"],
|
|
48
|
-
"keywords": [
|
|
49
|
-
"agent", "ai agent", "maf", "microsoft agent framework",
|
|
50
|
-
"tool", "tool calling", "rag", "vector search", "llm",
|
|
51
|
-
"orchestration", "multi-agent"
|
|
52
|
-
],
|
|
53
|
-
"stack": ["dotnet"],
|
|
54
|
-
"standards": [
|
|
55
|
-
"ai-agents-setup",
|
|
56
|
-
"ai-agents-sweet-spot",
|
|
57
|
-
"ai-agents-providers-model-registry",
|
|
58
|
-
"ai-agents-structured-output",
|
|
59
|
-
"ai-agents-prompts-in-db",
|
|
60
|
-
"ai-agents-rag-custom-pgvector",
|
|
61
|
-
"ai-agents-middleware-patterns",
|
|
62
|
-
"ai-agents-multi-agent-patterns"
|
|
63
|
-
],
|
|
64
|
-
"persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via AgentOpenTelemetryConsts.DefaultSourceName."
|
|
65
|
-
},
|
|
66
|
-
"nextjs-expert": {
|
|
67
|
-
"title": "Next.js / React Expert",
|
|
68
|
-
"icon": "⚛️",
|
|
69
|
-
"color": "green",
|
|
70
|
-
"domains": ["frontend", "ui", "react", "nextjs"],
|
|
71
|
-
"keywords": [
|
|
72
|
-
"nextjs", "next.js", "react", "app router", "server component",
|
|
73
|
-
"client component", "tailwind", "framer motion", "shadcn"
|
|
74
|
-
],
|
|
75
|
-
"stack": ["nextjs"],
|
|
76
|
-
"standards": [
|
|
77
|
-
"frontend-nextjs-app-router",
|
|
78
|
-
"frontend-nextjs-components",
|
|
79
|
-
"frontend-nextjs-data-fetching",
|
|
80
|
-
"frontend-nextjs-naming-conventions",
|
|
81
|
-
"frontend-nextjs-state-management"
|
|
82
|
-
],
|
|
83
|
-
"persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido."
|
|
84
|
-
},
|
|
85
|
-
"ui-designer": {
|
|
86
|
-
"title": "UI/UX Designer",
|
|
87
|
-
"icon": "🎨",
|
|
88
|
-
"color": "magenta",
|
|
89
|
-
"domains": ["ui", "ux", "design-system", "accessibility"],
|
|
90
|
-
"keywords": [
|
|
91
|
-
"design", "ui", "ux", "design system", "tokens", "wcag",
|
|
92
|
-
"accessibility", "mockup", "flow", "shadcn", "tailwind"
|
|
93
|
-
],
|
|
94
|
-
"stack": ["nextjs"],
|
|
95
|
-
"standards": [
|
|
96
|
-
"frontend-design-system-naming",
|
|
97
|
-
"frontend-design-system-animations",
|
|
98
|
-
"frontend-nextjs-motion-patterns"
|
|
99
|
-
],
|
|
100
|
-
"persona": "Você desenha sistemas, não telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizáveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediário."
|
|
101
|
-
},
|
|
102
|
-
"infra-engineer": {
|
|
103
|
-
"title": "Infrastructure / Jobs Engineer",
|
|
104
|
-
"icon": "⚙️",
|
|
105
|
-
"color": "yellow",
|
|
106
|
-
"domains": ["infrastructure", "jobs", "deployment", "observability"],
|
|
107
|
-
"keywords": [
|
|
108
|
-
"hangfire", "background job", "queue", "deployment",
|
|
109
|
-
"docker", "ci/cd", "telemetry", "logging", "monitoring"
|
|
110
|
-
],
|
|
111
|
-
"stack": ["dotnet"],
|
|
112
|
-
"standards": [
|
|
113
|
-
"backend-integrations-hangfire-hangfire-jobs",
|
|
114
|
-
"infrastructure-docker-easypanel-deploy",
|
|
115
|
-
"backend-dotnet-scrutor"
|
|
116
|
-
],
|
|
117
|
-
"persona": "Você cuida de infra: jobs assíncronos com Hangfire (apenas quando há razão real), deployment, observabilidade. Pensa em retry, idempotência, dead-letter, métricas. Não inventa infra — usa o que o stack já oferece."
|
|
118
|
-
},
|
|
119
|
-
"evaluator": {
|
|
120
|
-
"title": "Code & Architecture Evaluator",
|
|
121
|
-
"icon": "🔍",
|
|
122
|
-
"color": "red",
|
|
123
|
-
"domains": ["evaluation", "review", "quality"],
|
|
124
|
-
"keywords": [
|
|
125
|
-
"review", "eval", "score", "rubric", "audit", "quality"
|
|
126
|
-
],
|
|
127
|
-
"stack": ["*"],
|
|
128
|
-
"standards": [],
|
|
129
|
-
"persona": "Você aplica as rubricas em framework/evals/rubrics/. Não reescreve código — produz scores 0-10 por dimensão (architecture, contracts, code-quality, test-coverage), feedback priorizado, e ação clara (aprovado/feedback
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"version": "5.0.0",
|
|
3
|
+
"schema": "domain-personas",
|
|
4
|
+
"total_agents": 7,
|
|
5
|
+
"description": "Domain personas dispatched per task by the morph-implement skill. The 3 roles (Orchestrator/Specialist/Evaluator) are assumed by Claude itself per MORPH.md — these are domain personas the Specialist consults when working in a specific area.",
|
|
6
|
+
"agents": {
|
|
7
|
+
"dotnet-senior": {
|
|
8
|
+
"title": ".NET Senior Engineer",
|
|
9
|
+
"icon": "🔷",
|
|
10
|
+
"color": "blue",
|
|
11
|
+
"domains": ["backend", "backend-api", "architecture"],
|
|
12
|
+
"keywords": [
|
|
13
|
+
"backend", "api", "dotnet", ".net", "csharp", "c#",
|
|
14
|
+
"minimal api", "vertical slice", "vsa", "result pattern",
|
|
15
|
+
"feature slice", "endpoint", "handler", "validator"
|
|
16
|
+
],
|
|
17
|
+
"stack": ["dotnet"],
|
|
18
|
+
"standards": [
|
|
19
|
+
"architecture-vertical-slice-vertical-slice",
|
|
20
|
+
"backend-dotnet-result-pattern",
|
|
21
|
+
"backend-dotnet-vsa-handler-patterns",
|
|
22
|
+
"backend-dotnet-fluent-validation-vsa"
|
|
23
|
+
],
|
|
24
|
+
"persona": "Você é um engenheiro .NET sênior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados híbrido: IRepository<T> + IUnitOfWork para CRUD, DbContext direto no slice para queries específicas; nunca uma camada de Service/Manager. Não usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parâmetros."
|
|
25
|
+
},
|
|
26
|
+
"ef-modeler": {
|
|
27
|
+
"title": "EF Core / Database Modeler",
|
|
28
|
+
"icon": "🗄️",
|
|
29
|
+
"color": "cyan",
|
|
30
|
+
"domains": ["database", "data-modeling", "migrations"],
|
|
31
|
+
"keywords": [
|
|
32
|
+
"ef core", "entity framework", "neon", "postgres", "postgresql",
|
|
33
|
+
"migration", "dbcontext", "navigation property", "configuration"
|
|
34
|
+
],
|
|
35
|
+
"stack": ["dotnet"],
|
|
36
|
+
"standards": [
|
|
37
|
+
"backend-database-postgresql-database",
|
|
38
|
+
"infrastructure-neon-setup",
|
|
39
|
+
"infrastructure-neon-pgvector"
|
|
40
|
+
],
|
|
41
|
+
"persona": "Você é um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explícitas, configurações fluentes, navigation properties bem nomeadas, índices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler."
|
|
42
|
+
},
|
|
43
|
+
"maf-expert": {
|
|
44
|
+
"title": "Microsoft Agent Framework Expert",
|
|
45
|
+
"icon": "🤖",
|
|
46
|
+
"color": "purple",
|
|
47
|
+
"domains": ["ai-agents", "ai-orchestration"],
|
|
48
|
+
"keywords": [
|
|
49
|
+
"agent", "ai agent", "maf", "microsoft agent framework",
|
|
50
|
+
"tool", "tool calling", "rag", "vector search", "llm",
|
|
51
|
+
"orchestration", "multi-agent"
|
|
52
|
+
],
|
|
53
|
+
"stack": ["dotnet"],
|
|
54
|
+
"standards": [
|
|
55
|
+
"ai-agents-setup",
|
|
56
|
+
"ai-agents-sweet-spot",
|
|
57
|
+
"ai-agents-providers-model-registry",
|
|
58
|
+
"ai-agents-structured-output",
|
|
59
|
+
"ai-agents-prompts-in-db",
|
|
60
|
+
"ai-agents-rag-custom-pgvector",
|
|
61
|
+
"ai-agents-middleware-patterns",
|
|
62
|
+
"ai-agents-multi-agent-patterns"
|
|
63
|
+
],
|
|
64
|
+
"persona": "Você é especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) — nunca hosted agent service. Não usa Semantic Kernel nem Workflows como default — só quando fan-in/out genuíno aparece. Telemetria via AgentOpenTelemetryConsts.DefaultSourceName."
|
|
65
|
+
},
|
|
66
|
+
"nextjs-expert": {
|
|
67
|
+
"title": "Next.js / React Expert",
|
|
68
|
+
"icon": "⚛️",
|
|
69
|
+
"color": "green",
|
|
70
|
+
"domains": ["frontend", "ui", "react", "nextjs"],
|
|
71
|
+
"keywords": [
|
|
72
|
+
"nextjs", "next.js", "react", "app router", "server component",
|
|
73
|
+
"client component", "tailwind", "framer motion", "shadcn"
|
|
74
|
+
],
|
|
75
|
+
"stack": ["nextjs"],
|
|
76
|
+
"standards": [
|
|
77
|
+
"frontend-nextjs-app-router",
|
|
78
|
+
"frontend-nextjs-components",
|
|
79
|
+
"frontend-nextjs-data-fetching",
|
|
80
|
+
"frontend-nextjs-naming-conventions",
|
|
81
|
+
"frontend-nextjs-state-management"
|
|
82
|
+
],
|
|
83
|
+
"persona": "Você escreve Next.js App Router idiomático. Server Components por padrão, Client Components apenas quando há interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido."
|
|
84
|
+
},
|
|
85
|
+
"ui-designer": {
|
|
86
|
+
"title": "UI/UX Designer",
|
|
87
|
+
"icon": "🎨",
|
|
88
|
+
"color": "magenta",
|
|
89
|
+
"domains": ["ui", "ux", "design-system", "accessibility"],
|
|
90
|
+
"keywords": [
|
|
91
|
+
"design", "ui", "ux", "design system", "tokens", "wcag",
|
|
92
|
+
"accessibility", "mockup", "flow", "shadcn", "tailwind"
|
|
93
|
+
],
|
|
94
|
+
"stack": ["nextjs"],
|
|
95
|
+
"standards": [
|
|
96
|
+
"frontend-design-system-naming",
|
|
97
|
+
"frontend-design-system-animations",
|
|
98
|
+
"frontend-nextjs-motion-patterns"
|
|
99
|
+
],
|
|
100
|
+
"persona": "Você desenha sistemas, não telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizáveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediário."
|
|
101
|
+
},
|
|
102
|
+
"infra-engineer": {
|
|
103
|
+
"title": "Infrastructure / Jobs Engineer",
|
|
104
|
+
"icon": "⚙️",
|
|
105
|
+
"color": "yellow",
|
|
106
|
+
"domains": ["infrastructure", "jobs", "deployment", "observability"],
|
|
107
|
+
"keywords": [
|
|
108
|
+
"hangfire", "background job", "queue", "deployment",
|
|
109
|
+
"docker", "ci/cd", "telemetry", "logging", "monitoring"
|
|
110
|
+
],
|
|
111
|
+
"stack": ["dotnet"],
|
|
112
|
+
"standards": [
|
|
113
|
+
"backend-integrations-hangfire-hangfire-jobs",
|
|
114
|
+
"infrastructure-docker-easypanel-deploy",
|
|
115
|
+
"backend-dotnet-scrutor"
|
|
116
|
+
],
|
|
117
|
+
"persona": "Você cuida de infra: jobs assíncronos com Hangfire (apenas quando há razão real), deployment, observabilidade. Pensa em retry, idempotência, dead-letter, métricas. Não inventa infra — usa o que o stack já oferece."
|
|
118
|
+
},
|
|
119
|
+
"evaluator": {
|
|
120
|
+
"title": "Code & Architecture Evaluator",
|
|
121
|
+
"icon": "🔍",
|
|
122
|
+
"color": "red",
|
|
123
|
+
"domains": ["evaluation", "review", "quality"],
|
|
124
|
+
"keywords": [
|
|
125
|
+
"review", "eval", "score", "rubric", "audit", "quality"
|
|
126
|
+
],
|
|
127
|
+
"stack": ["*"],
|
|
128
|
+
"standards": [],
|
|
129
|
+
"persona": "Você aplica as rubricas em framework/evals/rubrics/. Não reescreve código — produz scores 0-10 por dimensão (architecture, contracts, code-quality, test-coverage), feedback priorizado acionável, e ação clara (aprovado em >=9 / feedback para o loop de correção em <9). Silêncio em scores ≥ 9 é o sinal correto."
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Cria uma nova landing page ponta-a-ponta a partir do template MORPH Umbraco genérico: coleta decisões, scaffolda com new-lp, sobe e valida, customiza branding e módulos.
|
|
3
|
+
argument-hint: [nome-do-projeto]
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /create-umbraco-lp — Nova LP Umbraco
|
|
8
|
+
|
|
9
|
+
Cria um projeto de landing page novo a partir do template canônico `MORPH_Umbraco_LP_Template`.
|
|
10
|
+
|
|
11
|
+
**Implementação:** este slash command é um atalho. O agente deve invocar `Skill(create-umbraco-lp)` com o nome do projeto (se fornecido). A skill coleta decisões do usuário uma pergunta por vez, scaffolda via `new-lp.ps1` / `new-lp.sh`, valida o boot (Delivery API + Ping de leads) e apresenta o checklist de entrega.
|
|
12
|
+
|
|
13
|
+
## Argumentos
|
|
14
|
+
|
|
15
|
+
`[nome-do-projeto]` — nome do projeto/LP (opcional; se não fornecido, a skill pergunta).
|
|
16
|
+
|
|
17
|
+
## Pré-requisitos
|
|
18
|
+
|
|
19
|
+
- `gh` autenticado (ou credencial git) com acesso ao repositório **privado** `polymorphism-tech/MORPH_Umbraco_LP_Template` (branch `master`).
|
|
20
|
+
- .NET 10 SDK instalado (`dotnet --version` deve retornar `10.x`).
|
|
21
|
+
- Node.js 20+ e npm instalados.
|
|
22
|
+
- PowerShell 7+ (Windows) ou bash (Linux/macOS) para os scripts.
|
|
23
|
+
|
|
24
|
+
## Anti-padrões
|
|
25
|
+
|
|
26
|
+
- Não editar `backend/uSync/v17/` manualmente durante o setup — deixar o uSync importar no primeiro boot.
|
|
27
|
+
- Não commitar `.env` ou `frontend/.env.local` — contêm credenciais e secrets.
|
|
28
|
+
- Não reutilizar `UMBRACO_GLOBAL_ID` de outro projeto — o script gera um UUID único por execução.
|
|
29
|
+
|
|
30
|
+
## Referências
|
|
31
|
+
|
|
32
|
+
- `framework/skills/core/create-umbraco-lp/SKILL.md`
|
|
33
|
+
- `docs/umbraco-lp-patterns.md` (em `main`)
|
|
34
|
+
|
|
35
|
+
**Projeto:** $ARGUMENTS
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Migra uma LP existente (React/Vite, Next.js estático ou HTML) para o template Umbraco-headless MORPH entregando a LP EXATAMENTE igual à origem (mesmo CSS, imagens, fontes e comportamento) + Umbraco — obtenção automática do template, lift-and-rewire verbatim de cada seção para módulo editável, conexão do formulário ao backend de leads e gate de paridade determinístico. Repo-agnóstica.
|
|
3
|
+
argument-hint: <projeto>
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skill
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /migrate-lp-to-umbraco — Migração de LP para Umbraco Headless
|
|
8
|
+
|
|
9
|
+
Migra a LP de origem para o template `MORPH_Umbraco_LP_Template` de forma reproduzível, entregando a LP **exatamente igual** à origem com o Umbraco por cima.
|
|
10
|
+
|
|
11
|
+
**Implementação:** este slash command é um atalho. O agente deve invocar `Skill(migrate-lp-to-umbraco)` com o nome do projeto como argumento. A skill é **repo-agnóstica** — obtém o template sozinha e funciona mesmo sem template ou origem pré-baixados.
|
|
12
|
+
|
|
13
|
+
## Argumentos
|
|
14
|
+
|
|
15
|
+
`{projeto}` — nome do projeto em kebab-case (ex.: `reserva-das-flores`, `lp-imobiliaria`).
|
|
16
|
+
|
|
17
|
+
## Fluxo resumido
|
|
18
|
+
|
|
19
|
+
0. **Obter o template** — clone/cache de `polymorphism-tech/MORPH_Umbraco_LP_Template` (privado, branch `master`) via `gh repo clone` (fallback git HTTPS/SSH). Sempre garantido antes de qualquer passo.
|
|
20
|
+
1. **Analisar a origem (capturar para um lift)** — inventariar seções, markup/classes exatos, CSS/tema verbatim, assets byte-a-byte (com `sha256`), fontes e comportamentos. Origem por código-fonte local ou só URL (scrape). Produzir `docs/origem-inventario.md`.
|
|
21
|
+
2. **Mapear para módulos** — cada seção vira um módulo via **lift verbatim** (default) — reuso direto do template só quando o render já bate com a origem. Produzir `docs/mapeamento-modulos.md`.
|
|
22
|
+
3. **Scaffold via new-lp** — cópia fresca do template para o diretório do projeto, `git init`, `scripts/new-lp.sh`/`.ps1` com `--lead-integration`, smoke-boot com `docker compose up --build`.
|
|
23
|
+
4. **Lift verbatim** — copiar markup/CSS/classes/assets de cada seção verbatim para o componente do módulo, trocando só os literais por leitura do backoffice; uSync `.config`, `SeedContentHandler` idempotente, `globals.css` com o tema portado, registro em `moduleRegistry.ts`.
|
|
24
|
+
5. **Conectar formulário** — selecionar sink (`ghl`/`prospectpro`/`webhook`) no backoffice via nó `leadsConfig`; nunca colocar token em código ou env.
|
|
25
|
+
6. **Gate de paridade** — checks determinísticos (DOM+classes, estilo computado, checksum de assets, comportamento) como bloqueio + screenshot diff como corroboração secundária. A skill scaffolda `parity.spec.ts` e `compare-sections.mjs`.
|
|
26
|
+
|
|
27
|
+
## Referências
|
|
28
|
+
|
|
29
|
+
- `framework/skills/core/migrate-lp-to-umbraco/SKILL.md` — playbook completo (passos 0-6, gate de paridade)
|
|
30
|
+
- `polymorphism-tech/MORPH_Umbraco_LP_Template` — template canônico (privado, branch `master`), obtido no passo 0
|
|
31
|
+
- `MORPH_Umbraco_LP_Template/scripts/new-lp.sh` / `new-lp.ps1` — scaffold
|
|
32
|
+
|
|
33
|
+
**Projeto:** $ARGUMENTS
|