@polymorphism-tech/morph-spec 8.44.0 → 8.46.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 +11 -9
- package/README.md +10 -10
- package/bin/morph-spec.js +11 -13
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +2 -4
- package/docs/QUICKSTART.md +6 -6
- package/framework/CLAUDE.md +6 -8
- package/framework/MORPH.md +39 -45
- package/framework/agents.json +8 -9
- package/framework/commands/morph-apply.md +1 -3
- package/framework/commands/morph-hotfix.md +1 -1
- package/framework/commands/morph-proposal.md +2 -2
- package/framework/docs/CLI.md +15 -14
- package/framework/evals/review-checklist.md +90 -0
- package/framework/evals/trace-schema.md +2 -12
- package/framework/hooks/README.md +2 -3
- package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
- package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
- package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
- package/framework/hooks/claude-code/core/validate-completion.js +3 -56
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/build-check.js +1 -1
- package/framework/hooks/shared/comment-scanner.js +1 -1
- package/framework/hooks/shared/phase-utils.js +0 -5
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/phases.json +4 -6
- package/framework/rubrics/backend.json +1 -1
- package/framework/rubrics/default.json +1 -1
- package/framework/rubrics/frontend.json +1 -1
- package/framework/rules/morph-workflow.md +6 -6
- package/framework/schemas/config.schema.json +4 -0
- package/framework/schemas/feature.schema.json +5 -29
- package/framework/schemas/tasks.schema.json +6 -2
- package/framework/skills/README.md +1 -2
- 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 +145 -246
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
- package/framework/skills/core/morph-implement/SKILL.md +101 -201
- package/framework/skills/core/morph-machine/SKILL.md +3 -3
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +171 -287
- package/framework/skills/core/morph-proposal/SKILL.md +4 -5
- package/framework/skills/core/morph-review/SKILL.md +122 -430
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +2 -2
- package/framework/skills/core/morph-uiux/SKILL.md +2 -3
- package/framework/standards/STANDARDS.json +10 -10
- package/framework/standards/ai-agents/agent-archetypes.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/agent-spec.md +1 -1
- package/framework/standards/ai-agents/batching.md +1 -1
- package/framework/standards/ai-agents/context-providers.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
- package/framework/standards/ai-agents/cost-and-budget.md +1 -1
- package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
- package/framework/standards/ai-agents/mcp-server.md +1 -1
- package/framework/standards/ai-agents/mcp-tools.md +1 -1
- package/framework/standards/ai-agents/media-pipeline.md +1 -1
- package/framework/standards/ai-agents/media-video.md +1 -1
- package/framework/standards/ai-agents/middleware-patterns.md +1 -1
- package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
- package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
- package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
- package/framework/standards/ai-agents/modalities-vision.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
- package/framework/standards/ai-agents/observability-patterns.md +3 -3
- package/framework/standards/ai-agents/production.md +2 -2
- package/framework/standards/ai-agents/prompt-sources.md +1 -1
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
- package/framework/standards/ai-agents/service-tier-flex.md +1 -1
- package/framework/standards/ai-agents/setup.md +1 -1
- package/framework/standards/ai-agents/structured-output.md +1 -1
- package/framework/standards/ai-agents/sweet-spot.md +1 -1
- package/framework/standards/ai-agents/testing-ai.md +1 -1
- package/framework/standards/ai-agents/tool-adapters.md +1 -1
- package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/templates/CLAUDE.md.core.template +1 -1
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/README.md +1 -1
- package/framework/templates/REGISTRY.json +0 -81
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/docs/spec.md +19 -205
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +2 -2
- package/src/commands/e2e/e2e.js +1 -1
- package/src/commands/project/heavy.js +1 -1
- package/src/commands/project/status.js +3 -3
- package/src/commands/state/approve.js +7 -49
- package/src/commands/state/gate-check.js +16 -106
- package/src/commands/state/gate-decision.js +1 -1
- package/src/commands/state/report-check.js +42 -17
- package/src/commands/validation/mutate.js +1 -1
- package/src/commands/validation/scout-check.js +28 -0
- package/src/commands/validation/validate-feature.js +5 -32
- package/src/commands/validation/verify.js +98 -48
- package/src/core/paths/output-schema.js +0 -2
- package/src/core/state/state-manager.js +1 -2
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/lib/format.js +5 -0
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
- package/src/dashboard/app/pages/Features.jsx +7 -7
- package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
- package/src/dashboard/app/pages/Rubrics.jsx +7 -11
- package/src/dashboard/scanner/docs-scanner.js +1 -2
- package/src/dashboard/scanner/features-scanner.js +3 -4
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/output-collector.js +0 -1
- package/src/lib/ci/ci-verify.js +118 -0
- package/src/lib/ci/github-ci.js +192 -0
- package/src/lib/ci/workflow-scaffold.js +122 -0
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/evaluator-report.js +52 -334
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/handoff-generator.js +4 -5
- package/src/lib/installers/memory-installer.js +2 -2
- package/src/lib/mutation/manifest.js +8 -2
- package/src/lib/mutation/report.js +5 -3
- package/src/lib/mutation/runner.js +9 -7
- package/src/lib/risk-detector.js +60 -122
- package/src/lib/scout/scout-check.js +293 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/tasks-json-parser.js +7 -5
- package/src/lib/tasks/test-nodes.js +1 -1
- package/src/lib/tasks/test-runner.js +1 -1
- package/src/lib/telemetry/verify-event.js +3 -2
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/reuse/reuse-validator.js +6 -8
- package/src/lib/validators/verify-runner.js +1 -1
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +5 -9
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/hooks-installer.js +3 -10
- package/src/utils/skills-installer.js +1 -1
- package/framework/evals/proof-rubrics/README.md +0 -76
- package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
- package/framework/evals/proof-rubrics/fiacao.md +0 -54
- package/framework/evals/proof-rubrics/guard-cego.md +0 -52
- package/framework/evals/proof-rubrics/media-claims.md +0 -109
- package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
- package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
- package/framework/evals/rubrics/README.md +0 -45
- package/framework/evals/rubrics/architecture.md +0 -103
- package/framework/evals/rubrics/code-quality.md +0 -98
- package/framework/evals/rubrics/condensed.md +0 -57
- package/framework/evals/rubrics/contracts.md +0 -67
- package/framework/evals/rubrics/test-coverage.md +0 -99
- package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
- package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
- package/framework/evals/suites/standard.yaml +0 -5
- package/framework/hooks/claude-code/__pycache__/statusline.cpython-313.pyc +0 -0
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
- package/framework/skills/core/morph-eval/SKILL.md +0 -64
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/framework/templates/docs/clarifications.md +0 -253
- package/framework/templates/docs/onboarding.md +0 -122
- package/framework/templates/docs/schema-analysis.md +0 -119
- package/framework/templates/docs/user-stories.md +0 -34
- package/src/commands/state/score.js +0 -147
|
@@ -4,57 +4,46 @@ 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.46.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
11
11
|
|
|
12
12
|
## Objetivo
|
|
13
|
-
|
|
14
|
-
e
|
|
13
|
+
Executar uma task com o standard e a persona certos, até o `doneCriteria` valer e o
|
|
14
|
+
`verify` da task ficar verde, e registrar o resultado no recap.
|
|
15
15
|
|
|
16
16
|
## Quando invocar
|
|
17
|
-
Ao iniciar cada task de `tasks.json
|
|
17
|
+
Ao iniciar cada task de `tasks.json`, antes de escrever código. Normalmente chamada pela
|
|
18
|
+
`morph-apply`, que passa a task atual.
|
|
18
19
|
|
|
19
20
|
## O que fazer
|
|
20
21
|
|
|
21
|
-
1. **
|
|
22
|
+
1. **Contexto, uma vez por sessão.** Na primeira task da sessão (ou depois de um `/compact`), Read
|
|
23
|
+
em `2-plan/spec.md`, nos use cases que a task referencia (`2-plan/usecases/UC-*.md`) e em
|
|
24
|
+
`2-plan/decisions.md`. Nas tasks seguintes, **não releia por padrão**: o contrato do plano está
|
|
25
|
+
congelado desde o Gate 2. Releia só o trecho que falta para a task corrente.
|
|
22
26
|
|
|
23
|
-
**
|
|
24
|
-
|
|
25
|
-
- a task corrente referencia um FR ou uma decisão que você não tem em contexto — dúvida legítima, não default cego.
|
|
27
|
+
**Correção** (a `morph-apply` devolveu a task com o `feedback` do verify vermelho ou com critério
|
|
28
|
+
não atendido): corrija esses pontos no código existente — não reimplemente.
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
2. **Standard.** `morph-spec standards --find "<domínio da task>"` devolve `id · path · digest`.
|
|
31
|
+
O digest decide; Read só no `.md` escolhido. Task MAF: os `standards/ai-agents/*.md` relevantes
|
|
32
|
+
valem mesmo com docs externas consultadas. Nenhum standard cobre: registre em `decisions.md` e
|
|
33
|
+
siga o critério mais conservador.
|
|
28
34
|
|
|
29
|
-
|
|
35
|
+
3. **Persona.** `task.agent` e `task.standards` (carimbados pelo `morph-plan`). Plano legado sem
|
|
36
|
+
`agent`: Read em `.morph/framework/agents.json` e escolha por `domains`. O `**Persona:**` do recap
|
|
37
|
+
registra o mecanismo real: `morph-{id}`, `general-purpose (fallback: {id})` ou `inline ({id})`.
|
|
30
38
|
|
|
31
|
-
|
|
39
|
+
4. **Despachar ou não.** Despache (`subagent_type: "morph-{id}"`) quando a task muda de domínio,
|
|
40
|
+
tem effort L/XL, já falhou 3 correções no mesmo ponto, exige ler arquivo > 500 linhas, ou repete
|
|
41
|
+
um padrão > 3 vezes. Inline só para S/M no domínio já carregado. O DAG da `morph-apply` decide
|
|
42
|
+
quantas tasks rodam ao mesmo tempo; este passo decide quem executa cada uma.
|
|
32
43
|
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
- **Tarefas de agente de IA (MAF):** Read os `.morph/framework/standards/ai-agents/*.md` relevantes para a task. Mesmo que você consulte docs externas (context7) para a superfície da API do `Microsoft.Agents.AI`, as **convenções de projeto** (single-agent por padrão, provider/caching/observability, A2A, middleware) vêm desses standards. Uma fonte externa não as conhece.
|
|
37
|
-
- Se nenhum standard cobrir o caso, registre no decisions.md e adote o critério mais conservador.
|
|
38
|
-
|
|
39
|
-
3. Identifique a persona de agente adequada para a tarefa:
|
|
40
|
-
- **Fonte primária: `task.agent` do tasks.json.** O `morph-plan` já resolveu `agents.json` uma vez no momento do plano e carimbou `agent` (id da persona, sem prefixo `morph-`) e `standards` por task (ver `morph-plan` §5a) — use esses campos diretamente, sem reabrir `agents.json`.
|
|
41
|
-
- **Fallback — plano legado (task sem `agent`):** **use a tool Read em `.morph/framework/agents.json`** — não recupere a persona de memória. Encontre o agente cujo `domains` cobre o domínio da tarefa e leia o campo `persona` para adotar o ponto de vista durante a implementação.
|
|
42
|
-
- O array de standards — `task.standards` quando presente, ou o `standards` do agente lido no fallback — é o ponto de partida do passo 2.
|
|
43
|
-
- O `**Persona:**` que você grava no recap (passo 6) **deve** refletir o mecanismo REAL usado: `morph-{id}` (dispatch pelo subagent registrado), `general-purpose (fallback: {id})` (tipo não registrado — registre também nas `notes` da task), ou `inline ({id})` (você executou inline adotando a persona). É assim que o reviewer audita contra o que o runtime realmente registrou — uma auto-declaração que não casa com o dispatch é drift.
|
|
44
|
-
|
|
45
|
-
4. Decida se a task deve ser despachada para um sub-agent. Dispatch é o **default** para o caso pesado/multi-domínio (ver `.morph/framework/MORPH.md` seção 6) — despache quando a task dispara qualquer gatilho:
|
|
46
|
-
- **Domínio diferente do que você tem carregado agora** (a persona do passo 3 difere da que você vinha usando) — gatilho mais importante: o especialista carrega seus próprios standards sem inchar seu contexto.
|
|
47
|
-
- Esforço L ou XL (duração estimada > 5 minutos).
|
|
48
|
-
- Mais de 3 tentativas de correção falharam no mesmo problema.
|
|
49
|
-
- Análise de arquivo com > 500 linhas.
|
|
50
|
-
- Task repetitiva com > 3 instâncias do mesmo padrão.
|
|
51
|
-
- Risco de contaminar o contexto principal com detalhes de baixo nível irrelevantes para o fluxo.
|
|
52
|
-
|
|
53
|
-
Inline é aceitável só para tasks S/M **dentro do domínio já carregado**. Se for inline numa task que dispara um gatilho, registre a justificativa em uma linha no `decisions.md` — inline silencioso numa task pesada/multi-domínio é o anti-padrão da seção 6.
|
|
54
|
-
|
|
55
|
-
> **Relação com `morph-spec dag`:** a decisão do DAG (na `morph-apply` §2) governa o **paralelismo ENTRE tasks** — quantos sub-agents rodam ao mesmo tempo. Os gatilhos acima governam o **dispatch INDIVIDUAL desta task**. São ortogonais e coexistem: `DAG: sequencial` NÃO significa "tudo inline" — significa "uma task por vez, na ordem". Exemplo: cadeia única backend de 12 tasks (DAG: sequencial); T7 tem effort L → despache T7 sozinha para `morph-dotnet-senior` e aguarde o retorno antes de seguir; T8 (S, mesmo domínio) roda inline.
|
|
56
|
-
|
|
57
|
-
**Se for despachar — use `subagent_type: "morph-{id}"` do agente identificado no passo 3.** Os subagents são gerados de `agents.json` na instalação (`.claude/agents/morph-{id}.md`) e a persona é o **system prompt** deles — não a cole no prompt. **Fallback:** se `morph-{id}` não estiver na sua lista de subagent types (stack não instalado), use `general-purpose` colando o campo `persona` no prompt e registre nas `notes` da task: `dispatch-fallback: general-purpose ({id} não registrado)`. Template do prompt (cláusulas do relatório em forma curta — racional completo em `MORPH.md` §6). **Cole-o literal**: só os campos entre colchetes mudam; não parafraseie cláusula nem omita os parágrafos de leitura, ferramentas e comentário — foi assim que regras chegaram tortas ao sub-agent em campo:
|
|
44
|
+
Tipo `morph-{id}` não registrado: `general-purpose` com o campo `persona` colado no prompt, e
|
|
45
|
+
`dispatch-fallback: general-purpose ({id} não registrado)` nas `notes` da task.
|
|
46
|
+
Template do prompt para `subagent_type: "morph-{id}"` — cole literal, só os campos entre colchetes mudam:
|
|
58
47
|
```
|
|
59
48
|
Implementar [ID]: [title da task]
|
|
60
49
|
|
|
@@ -63,11 +52,9 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
63
52
|
do .md que ESTA task aplica, coladas. O path vai junto só para consulta
|
|
64
53
|
pontual — o sub-agente não relê standards inteiros]
|
|
65
54
|
Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
|
|
66
|
-
—
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Reuso: [task.reuse do tasks.json — `CONCEITO: VEREDITO → alvo`, uma linha por
|
|
70
|
-
conceito; ausente numa task que não introduz conceito]
|
|
55
|
+
— é por aqui que o código existente chega ao sub-agente, que trabalha em
|
|
56
|
+
contexto fresco. O que você já leu entra como `arquivo:linhas` + o trecho]
|
|
57
|
+
Reuso: [task.reuse — `CONCEITO: VEREDITO → alvo`, uma linha por conceito]
|
|
71
58
|
Done quando: [doneCriteria do tasks.json]
|
|
72
59
|
|
|
73
60
|
Antes de criar tipo, componente, hook ou serviço NOVO, verifique se já
|
|
@@ -87,21 +74,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
87
74
|
Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
|
|
88
75
|
shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
|
|
89
76
|
`query-docs`). Impacto e vizinhança de símbolo vêm do grafo
|
|
90
|
-
(`morph-spec graph`)
|
|
91
|
-
|
|
92
|
-
bloqueia — siga com o fallback.
|
|
77
|
+
(`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
|
|
78
|
+
(`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
|
|
93
79
|
|
|
94
80
|
Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
|
|
95
81
|
`///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
|
|
96
82
|
da task. Só o porquê que o código não mostra, em uma linha
|
|
97
83
|
(`architecture-code-comments`). O elo com a pós-condição vai no nome do
|
|
98
|
-
teste
|
|
99
|
-
|
|
84
|
+
teste. O hook `comment-guard` bloqueia a edição que adiciona história,
|
|
85
|
+
banner ou bloco longo.
|
|
100
86
|
|
|
101
87
|
Contrato do relatório final:
|
|
102
88
|
1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
|
|
103
|
-
encerrar — é o retorno autoritativo, não a sua mensagem final
|
|
104
|
-
|
|
89
|
+
encerrar — é o retorno autoritativo, não a sua mensagem final. NÃO chame
|
|
90
|
+
SendMessage.
|
|
105
91
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
106
92
|
— todo estado é gravado exclusivamente pelo orquestrador.
|
|
107
93
|
3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
|
|
@@ -109,186 +95,100 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
109
95
|
um por pós-condição, um de regressão por bug, variantes numa tabela
|
|
110
96
|
(`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
|
|
111
97
|
red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
|
|
112
|
-
testes UMA vez, antes do relatório; se falhar, corrija e rode só os que
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
hook e vira pendência do `doctor`. Ao rodar: compile uma vez e rode sem
|
|
118
|
-
recompilar (`dotnet test --no-build`), com `--filter`. Grave a saída em
|
|
119
|
-
arquivo uma vez (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
|
|
120
|
-
e leia o arquivo: rodar de novo com outro `| tail`/`| grep` repete o teste
|
|
121
|
-
para ver outras linhas, e com pipe ou `; echo` o exit é o do último
|
|
122
|
-
comando, não o do teste.
|
|
123
|
-
|
|
98
|
+
testes UMA vez, em primeiro plano, antes do relatório; se falhar, corrija e rode só os que falharam. Grave a
|
|
99
|
+
saída em arquivo (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
|
|
100
|
+
e leia o arquivo — um pipe troca o exit do teste pelo do último comando.
|
|
101
|
+
Em batch paralelo SEM isolamento, só compile. Com `isolation: "worktree"`,
|
|
102
|
+
o mesmo vale no seu worktree, e o último ato é o commit na branch dele.
|
|
124
103
|
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
125
104
|
volta — fatie antes, não depois.
|
|
126
105
|
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
127
106
|
corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
|
|
128
|
-
uma fatia coerente escrita
|
|
107
|
+
uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
|
|
129
108
|
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
130
109
|
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
131
|
-
na 1ª linha, o feito e o que falta, sem
|
|
132
|
-
por decisão sua;
|
|
133
|
-
`PARCIAL`. Sem limite declarado, bastam os commits por marco.
|
|
110
|
+
na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
|
|
111
|
+
siga ou pare, por decisão sua; o relatório final substitui o parcial.
|
|
134
112
|
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
135
113
|
sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
|
|
136
|
-
suíte pesados
|
|
137
|
-
|
|
138
|
-
|
|
114
|
+
suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
|
|
115
|
+
plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
|
|
116
|
+
nem espere em laço — diga no relatório o que não rodou.
|
|
139
117
|
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
140
118
|
substituto do relatório e não deve ser chamado.
|
|
141
119
|
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
142
120
|
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
143
121
|
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
144
122
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
123
|
+
Formato do relatório:
|
|
124
|
+
(1) o que foi feito, em 2-3 frases;
|
|
125
|
+
**Arquivos:** um item `- \`path\`` por arquivo criado ou modificado;
|
|
126
|
+
**Critérios:** cada doneCriteria — atendido (o teste ou `arquivo:linha` que o
|
|
127
|
+
prova) ou não atendido (por quê);
|
|
128
|
+
(4) problemas encontrados e como foram resolvidos.
|
|
150
129
|
```
|
|
151
|
-
**Passo pós-dispatch (seu,
|
|
152
|
-
`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
**Se não — siga para o passo 5.**
|
|
181
|
-
|
|
182
|
-
5. Implemente a tarefa seguindo o standard e a persona identificados.
|
|
183
|
-
Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
|
|
184
|
-
e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
|
|
185
|
-
Testes rodados durante a implementação inline seguem a cláusula 3 do template do passo 4
|
|
186
|
-
(sem red→green, uma rodada do filtro no fim, saída em arquivo) e a 8 (sem mutação).
|
|
187
|
-
|
|
188
|
-
**Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
|
|
189
|
-
`morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
|
|
190
|
-
declarado, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`:
|
|
191
|
-
escopo de feature porque no de task o nó `evals` é pulado; `--filter` só estreita o nó de testes
|
|
192
|
-
(build e validadores rodam; o e2e subiria o stack, daí `--skip-e2e`); `--no-persist` garante que
|
|
193
|
-
esta execução nunca escreve no `feature.json` — é sonda, não prova para gate nenhum.
|
|
194
|
-
É a única exceção ao passo 9. Sem nó `evals`, execute o eval direto e registre
|
|
195
|
-
"nenhum nó — execução manual". Grave o arquivo com: o critério (literal); o id do nó e o
|
|
196
|
-
cenário (ou aquele rótulo); o modelo efetivo; a versão ou o hash do prompt, nunca o prompt cru;
|
|
197
|
-
entrada e saída sem dado pessoal (`ai-agents-testing-ai`, "Captura do que foi ao provedor"); o
|
|
198
|
-
veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o sub-agente fez; este prova,
|
|
199
|
-
rodando, que a saída do modelo atende ao critério. Vale também para task despachada — sem o
|
|
200
|
-
arquivo, ela não vai para `done` (passo 8).
|
|
201
|
-
|
|
202
|
-
6. Ao concluir a tarefa, **append** um bloco a `recap.md` em `.morph/features/{feature}/3-implement/`
|
|
203
|
-
usando este template **obrigatório** (campos não-opcionais — sem standard, a entrada não conta):
|
|
204
|
-
|
|
130
|
+
**Passo pós-dispatch (seu, ao retomar o controle):** `morph-spec report-check {feature} {taskId} --json`. O veredito do
|
|
131
|
+
relatório e o bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostram o disco que o agente
|
|
132
|
+
deixou. Árvore suja sem explicação ou `markers` não vazio: registre no recap. Com
|
|
133
|
+
`isolation: "worktree"`, depois de ler o relatório rode `morph-spec worktree reap --json`.
|
|
134
|
+
|
|
135
|
+
**Leia `3-implement/reports/[ID].md`** — a mensagem de texto do agente é atalho, nunca a fonte.
|
|
136
|
+
Arquivo ausente é falha de protocolo: registre e complete a partir do que ficou no disco.
|
|
137
|
+
|
|
138
|
+
**`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
|
|
139
|
+
Retome o MESMO agente por `SendMessage`,
|
|
140
|
+
colando `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do
|
|
141
|
+
último `wip`. Nunca marque `done` sobre um parcial.
|
|
142
|
+
|
|
143
|
+
5. **Implementação inline.** Siga o standard e a persona. Ambiguidade não coberta pelo plano:
|
|
144
|
+
registre em `decisions.md` e resolva pelo lado conservador, sem pausar. Testes: as cláusulas 3 e 8
|
|
145
|
+
do template valem para você também.
|
|
146
|
+
|
|
147
|
+
**Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM): rode o
|
|
148
|
+
eval antes do `done`, e só ele. Com nó `runner: "evals"`:
|
|
149
|
+
`morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist` — escopo de
|
|
150
|
+
feature porque no de task o nó `evals` é pulado; `--skip-e2e` porque o stack subiria;
|
|
151
|
+
`--no-persist` porque esta execução é sonda, não prova de gate. Sem nó `evals`, rode o eval direto
|
|
152
|
+
e registre "nenhum nó — execução manual". O arquivo traz: o critério (literal), o nó e o cenário,
|
|
153
|
+
o modelo efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado
|
|
154
|
+
pessoal, e o veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o agente fez; este
|
|
155
|
+
prova, rodando, que a saída atende ao critério.
|
|
156
|
+
|
|
157
|
+
6. **Recap.** Append em `3-implement/recap.md`:
|
|
205
158
|
```markdown
|
|
206
159
|
## T{N} — {title}
|
|
207
160
|
|
|
208
161
|
**Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
|
|
209
|
-
**Persona:** {
|
|
162
|
+
**Persona:** {`morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
|
|
210
163
|
**Files:**
|
|
211
164
|
- `{path}`
|
|
212
|
-
- `{path}`
|
|
213
165
|
|
|
214
|
-
{2-3 frases
|
|
215
|
-
|
|
216
|
-
**Issues encontrados:** {breve descrição ou "nenhum"}
|
|
166
|
+
{2-3 frases}
|
|
217
167
|
```
|
|
168
|
+
Sem standard que cubra: `Standard: ad-hoc (see decisions.md ADR-{N})`. O `validate-completion`
|
|
169
|
+
cobra o bloco.
|
|
218
170
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
`Standard: ad-hoc (see decisions.md ADR-{N})` no recap.
|
|
224
|
-
- Sem standard ⇒ a task falha no validador de Gate 3 (`validate-completion`)
|
|
225
|
-
e o reviewer não consegue auditar de onde veio a decisão técnica.
|
|
226
|
-
|
|
227
|
-
7. **Antes de marcar a task como `done`, audite o relatório contra o trabalho:**
|
|
228
|
-
|
|
229
|
-
```
|
|
230
|
-
morph-spec report-check {feature} {taskId} --json
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
Não é burocracia — é a única checagem que não depende da palavra do agente. Veredito
|
|
234
|
-
`report-stale` significa **relatório completo e VELHO**: a task seguiu escrevendo arquivos depois
|
|
235
|
-
que ele foi gravado, então o texto descreve um estado já ultrapassado. Aconteceu de verdade: o
|
|
236
|
-
sub-agent gravou o esqueleto dizendo "teste ainda não escrito — em andamento", escreveu os 9
|
|
237
|
-
testes, e foi cortado antes de atualizar. Quem leu o relatório quase marcou a task como
|
|
238
|
-
incompleta e re-despachou trabalho pronto. **Nesse caso não re-despache**: leia `observed`
|
|
239
|
-
(arquivos realmente escritos, do `events.jsonl`, não auto-declarados) e atualize o relatório a
|
|
240
|
-
partir dessa evidência. Demais vereditos: tabela em `MORPH.md` §6.
|
|
241
|
-
|
|
242
|
-
8. Atualizar `tasks.json` marcando a task como `done` — **direto com a tool `Edit` (ou `Write`)**, sem scripts:
|
|
243
|
-
|
|
244
|
-
- Mude apenas os campos mutáveis da task: `status` (enum válido: `pending`,
|
|
245
|
-
`in_progress`, `done`, `skipped`, `blocked` — nunca invente valores como
|
|
246
|
-
`"completed"`), `outputs` (paths realmente produzidos) e `notes`.
|
|
247
|
-
- **`outputs` contém apenas paths realmente produzidos.** Deleções, remoções
|
|
248
|
-
e anotações (ex.: `"pasta/ (removido: a, b)"`) se registram em `notes`,
|
|
249
|
-
nunca em `outputs`. E `notes` é **uma string única** — não um array.
|
|
250
|
-
- **`outputs` DEVE listar TODO arquivo criado ou modificado pela task — sem exceção.**
|
|
251
|
-
Isso inclui artefato auxiliar que não estava no plano original (ex.: uma
|
|
252
|
-
factory de design-time, um seed, um arquivo de config gerado a reboque de
|
|
253
|
-
outro output) — se a task o produziu, ele entra em `outputs` junto com o
|
|
254
|
-
resto. Arquivo shipped sem dono em `outputs` de task alguma é falha de
|
|
255
|
-
protocolo: o Gate 3 (avaliador independente da `morph-review`) aponta como
|
|
256
|
-
achado de rastreabilidade, mesmo que o arquivo em si esteja correto — quem
|
|
257
|
-
lê `tasks.json`/`recap.md` depois precisa achar todo arquivo em produção
|
|
258
|
-
citado em algum lugar, e é essa a lacuna que este parágrafo fecha.
|
|
259
|
-
- **Se os `outputs` reais divergirem dos planejados**, registre o porquê em
|
|
260
|
-
`notes` na mesma edição — o hook exige a note quando há divergência (e a
|
|
261
|
-
mensagem de violação aponta o campo/valor exato do problema). Isto é o
|
|
262
|
-
caso mais comum em que a regra acima se aplica: todo arquivo extra na lista
|
|
263
|
-
de "realmente produzidos" acima do planejado é, por definição, uma
|
|
264
|
-
divergência real vs. planejado — a note explica o porquê.
|
|
265
|
-
- `tasks.json` é protegido após o Gate 2: o hook `protect-spec-files` faz diff
|
|
266
|
-
semântico e libera Write ou Edit desde que nenhum campo de contrato do plano
|
|
267
|
-
(`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`)
|
|
268
|
-
mude e o schema continue válido.
|
|
171
|
+
7. **Audite antes do `done`:** `morph-spec report-check {feature} {taskId} --json`. `report-stale` =
|
|
172
|
+
relatório completo e velho (a task seguiu escrevendo depois dele): **não re-despache** — leia
|
|
173
|
+
`observed` (escritas reais, do `events.jsonl`) e atualize o relatório. Demais vereditos:
|
|
174
|
+
`MORPH.md` §6.
|
|
269
175
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
176
|
+
8. Atualizar `tasks.json` marcando a task como `done` (Edit, só campos mutáveis):
|
|
177
|
+
- `status`: `pending` | `in_progress` | `done` | `skipped` | `blocked`.
|
|
178
|
+
- `outputs` DEVE listar TODO arquivo criado ou modificado pela task, inclusive artefato auxiliar
|
|
179
|
+
fora do plano (factory, seed, config gerada). Arquivo em produção sem dono em `outputs` é falha de
|
|
180
|
+
protocolo que o Gate 3 aponta. Deleções vão em `notes` (string única), nunca em `outputs`.
|
|
181
|
+
- Divergiu do planejado: o porquê em `notes` na mesma edição — o hook exige.
|
|
274
182
|
|
|
275
|
-
9. Quando invocada por `morph-apply`,
|
|
183
|
+
9. Quando invocada por `morph-apply`, devolva o controle a ela e não rode a suíte do projeto: o `verify {feature} {task}` é do orquestrador. **Única exceção:** a execução de evidência do passo 5, filtrada ao nó `evals`, com `--skip-e2e` e `--no-persist`. No loop por task o recorte é automático (o `group` escolhe as suítes, os testes de `outputs` estreitam o comando; `--filter` só força a escolha de suítes, `--full` desliga o recorte); a suíte inteira roda no Gate 3 e no CI, sem filtro. Invocada manualmente: siga para a próxima task ready.
|
|
276
184
|
|
|
277
185
|
## Output esperado
|
|
278
|
-
- Código
|
|
279
|
-
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
runtime do eval (passo 5), distinta do relatório do sub-agent em `reports/`
|
|
283
|
-
- `.morph/features/{feature}/3-implement/recap.md` atualizado com entrada da task concluída
|
|
284
|
-
- `.morph/features/{feature}/2-plan/tasks.json` com status da task atualizado para `done`
|
|
285
|
-
- `.morph/features/{feature}/2-plan/decisions.md` atualizado se houver decisão não trivial
|
|
286
|
-
- Trace em `.morph/traces/` gerado automaticamente pelo hook `trace-autogen` (a skill não o escreve)
|
|
186
|
+
- Código conforme o standard; `3-implement/reports/{taskId}.md` quando despachada
|
|
187
|
+
- `3-implement/evidencias/{taskId}.md` na task que o lista em `outputs`
|
|
188
|
+
- `recap.md` com o bloco da task; `tasks.json` com a task `done`
|
|
189
|
+
- `decisions.md` quando houve decisão não trivial
|
|
287
190
|
|
|
288
191
|
## Referências
|
|
289
|
-
- `morph-spec standards --find
|
|
290
|
-
- `.morph/framework/
|
|
291
|
-
- `.morph/framework/
|
|
292
|
-
- `.morph/features/{feature}/2-plan/mandate.md` — contrato da feature
|
|
293
|
-
- `.morph/features/{feature}/2-plan/tasks.json` — `task.agent`/`task.standards` carimbados pelo `morph-plan` §5a (fonte primária dos passos 2 e 3)
|
|
294
|
-
- `.morph/framework/schemas/tasks.schema.json` — schema de tasks.json (enum de status e campos)
|
|
192
|
+
- `morph-spec standards --find` — passo 2
|
|
193
|
+
- `.morph/framework/MORPH.md` §6 — dispatch e contrato do relatório
|
|
194
|
+
- `.morph/framework/CLI.md`, seção "Suítes de teste" — recorte por task
|
|
@@ -4,7 +4,7 @@ description: Cuida da RAM e da CPU da máquina enquanto o morph-spec trabalha
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: quando a máquina está lenta ou sem RAM, um comando pesado esperou ou foi recusado pela fila, sobrou worktree de sub-agent, ou vários sub-agents pesados vão rodar em paralelo
|
|
6
6
|
user-invokable: false
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.46.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-machine
|
|
@@ -16,7 +16,7 @@ Manter a máquina do dev utilizável enquanto o trabalho paralelo do morph-spec
|
|
|
16
16
|
## Regras que não se negociam
|
|
17
17
|
|
|
18
18
|
- **Nunca** `taskkill /IM`, `pkill`, `killall` nem `Stop-Process -Name`: derrubam os MCPs de todas as sessões abertas. O único que encerra processo é `doctor --procs --prune`, e por PID.
|
|
19
|
-
- **Fila cheia não é erro de código.** `⏳ … não rodou`, `slots pesados ocupados` e exit 3 querem dizer
|
|
19
|
+
- **Fila cheia não é erro de código.** `⏳ … não rodou`, `slots pesados ocupados` e exit 3 querem dizer que a fila já esperou o prazo dela (`heavy.waitTimeoutSec`). Não entra no loop de correção, não conta como tentativa e não é vermelho no `verify`. No máximo uma chamada nova; persistiu, siga sem aquela rodada e avise o usuário — nunca `sleep`/`until` nem retentativa agendada.
|
|
20
20
|
- **Nunca remova worktree** por `git worktree remove`, `rm -rf` ou `Remove-Item -Recurse`: atravessa a junction e apaga o conteúdo real da raiz. Só `finish`, `worktree remove` ou `worktree reap`.
|
|
21
21
|
- **Destrutivo pergunta antes.** `doctor --procs --prune` e `worktree reap` (sem `--dry-run`): mostre a lista e use `AskUserQuestion`.
|
|
22
22
|
|
|
@@ -25,7 +25,7 @@ Manter a máquina do dev utilizável enquanto o trabalho paralelo do morph-spec
|
|
|
25
25
|
| Sintoma | Comando | Como ler e o que fazer |
|
|
26
26
|
|---|---|---|
|
|
27
27
|
| Máquina ou editor lento, pouca RAM | `morph-spec doctor --procs` (só lê) | Cada linha diz órfão ou protegido, com a razão. Sem órfão, a pressão vem de fora (vmmem do WSL, IDE): diga isso e passe a sugestão de `.wslconfig` que o relatório traz. Com órfão, mostre a lista e ofereça `--prune`. |
|
|
28
|
-
| Comando voltou `⏳ … não rodou` ou exit 3 | `morph-spec heavy status` | Mostra quem segura cada vaga, há quanto tempo, e a RAM livre. A vaga solta sozinha (processo morto ou timeout).
|
|
28
|
+
| Comando voltou `⏳ … não rodou` ou exit 3 | `morph-spec heavy status` | Mostra quem segura cada vaga, há quanto tempo, e a RAM livre. A vaga solta sozinha (processo morto ou timeout). Vaga presa por sessão viva: diga ao usuário quem a segura. Se a causa for RAM e nenhuma vaga estiver presa, rode `doctor --procs`. |
|
|
29
29
|
| Vão rodar vários sub-agents pesados em paralelo | `morph-spec heavy status` antes | São 2 vagas por padrão. O que não couber espera na fila sem falhar, mas cada espera custa turnos: despache só o que cabe. |
|
|
30
30
|
| Build ou teste pesado avulso, fora do `verify` | `morph-spec heavy run -- <comando>` | Ou ligue o `heavy.gateBash` (abaixo) e o hook cuida disso. |
|
|
31
31
|
| Sobrou `agent-*` em `worktrees/` ou branch `morph-task/agent-*` | `morph-spec worktree reap --dry-run`, depois `worktree reap` | Só remove o que parou, está limpo e não tem commit exclusivo; o resto volta com a razão (`dirty`, `locked`…). `doctor --worktrees` lista tudo, inclusive árvore fora do contêiner. |
|
|
@@ -4,7 +4,7 @@ description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.46.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- dotnet
|
|
10
10
|
- nextjs
|