@polymorphism-tech/morph-spec 9.7.0 → 10.0.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 -11
- package/README.md +4 -4
- package/bin/morph-spec.js +41 -44
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +24 -30
- package/framework/MORPH.md +47 -123
- package/framework/agents.json +6 -374
- package/framework/commands/morph-apply.md +1 -1
- package/framework/commands/morph-archive.md +4 -3
- package/framework/commands/morph-hotfix.md +8 -30
- package/framework/commands/morph-infra.md +2 -2
- package/framework/commands/morph-media.md +10 -9
- package/framework/commands/morph-review.md +15 -0
- package/framework/commands/morph-status.md +1 -1
- package/framework/docs/CLI.md +100 -102
- package/framework/evals/review-checklist.md +46 -54
- package/framework/hooks/README.md +4 -4
- package/framework/hooks/claude-code/__pycache__/statusline.cpython-313.pyc +0 -0
- package/framework/hooks/claude-code/core/README.md +1 -1
- package/framework/hooks/claude-code/core/denylist.json +4 -4
- package/framework/hooks/claude-code/core/gate-guard.js +9 -0
- package/framework/hooks/claude-code/core/masked-exit.js +49 -0
- package/framework/hooks/claude-code/core/state-sync.js +4 -1
- package/framework/hooks/claude-code/core/telemetry-log.js +1 -2
- package/framework/hooks/claude-code/core/test-budget.js +10 -70
- package/framework/hooks/claude-code/core/validate-completion.js +11 -24
- package/framework/hooks/claude-code/core/worktree-context.js +5 -22
- package/framework/hooks/claude-code/core/worktree-create.js +6 -45
- package/framework/hooks/claude-code/core/worktree-env-inject.js +2 -10
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/gate-event.js +2 -2
- package/framework/hooks/shared/graph-refresh.js +20 -3
- package/framework/hooks/shared/heavy-command.js +32 -1
- package/framework/hooks/shared/heavy-config.js +1 -1
- package/framework/hooks/shared/heavy-slots.js +41 -4
- package/framework/hooks/shared/next-step.js +63 -24
- package/framework/hooks/shared/phase-utils.js +6 -9
- package/framework/hooks/shared/report-progress.js +86 -0
- package/framework/hooks/shared/state-reader.js +3 -2
- package/framework/hooks/statusline.js +332 -0
- package/framework/phases.json +32 -10
- package/framework/rules/ai-agents-standards.md +9 -1
- package/framework/rules/csharp-standards.md +4 -0
- package/framework/rules/ef-standards.md +20 -0
- package/framework/rules/frontend-standards.md +1 -1
- package/framework/rules/implement-report.md +25 -0
- package/framework/rules/infrastructure-standards.md +2 -0
- package/framework/rules/nextjs-standards.md +7 -0
- package/framework/rules/plan-grammar.md +53 -0
- package/framework/rules/ui-design.md +27 -0
- package/framework/schemas/config.schema.json +12 -19
- package/framework/schemas/feature.schema.json +7 -1
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +2 -2
- package/framework/skills/core/morph-apply/SKILL.md +38 -166
- package/framework/skills/core/morph-apply/references/debugging.md +8 -0
- package/framework/skills/core/morph-apply/references/hotfix.md +42 -0
- package/framework/skills/core/morph-apply/references/machine.md +29 -0
- package/framework/skills/core/{morph-media/SKILL.md → morph-apply/references/media.md} +11 -74
- package/framework/skills/core/morph-apply/references/review.md +65 -0
- package/framework/skills/core/morph-plan/SKILL.md +42 -108
- package/framework/skills/core/morph-plan/references/critique.md +40 -0
- package/framework/skills/core/morph-plan/references/interview.md +25 -0
- package/framework/skills/core/morph-uiux/SKILL.md +47 -64
- package/framework/skills/core/morph-uiux/surfaces.json +32 -0
- package/framework/standards/STANDARDS.json +32 -5
- package/framework/standards/STANDARDS.meta.json +5 -1
- package/framework/standards/ai-agents/agent-session.md +2 -3
- package/framework/standards/ai-agents/context-providers.md +2 -2
- package/framework/standards/ai-agents/durable-workflows-hitl.md +2 -2
- package/framework/standards/ai-agents/providers/model-registry.md +2 -2
- package/framework/standards/ai-agents/rag-custom-pgvector.md +6 -6
- package/framework/standards/ai-agents/setup.md +1 -1
- package/framework/standards/ai-agents/tool-adapters.md +2 -2
- package/framework/standards/architecture/stack-baseline.md +47 -0
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -4
- package/framework/standards/frontend/design-system/ai-image-generation.md +51 -12
- package/framework/standards/frontend/design-system/ai-video-generation.md +50 -4
- package/framework/standards/frontend/design-system/art-direction.md +2 -2
- package/framework/standards/frontend/scroll-driven/frame-scrub.md +12 -2
- package/framework/standards/frontend/scroll-driven/scroll-components.md +76 -4
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +1 -2
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- 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/context/ARCHITECTURE.md +1 -1
- package/framework/templates/docs/plan.md +12 -12
- package/framework/templates/docs/ui-mockups.md +17 -105
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- 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/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/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/e2e/e2e.js +88 -23
- package/src/commands/graph/diff.js +74 -0
- package/src/commands/graph/status.js +1 -1
- package/src/commands/observability/cost.js +2 -4
- package/src/commands/observability/telemetry.js +1 -1
- package/src/commands/project/doctor.js +23 -39
- package/src/commands/project/fleet.js +5 -6
- package/src/commands/project/init.js +63 -36
- package/src/commands/project/stack-scan.js +3 -42
- package/src/commands/project/stack-set.js +26 -0
- package/src/commands/project/status.js +12 -13
- package/src/commands/project/update.js +39 -3
- package/src/commands/project/worktree.js +27 -16
- package/src/commands/state/advance.js +17 -17
- package/src/commands/state/approve.js +0 -6
- package/src/commands/state/archive.js +27 -1
- package/src/commands/state/auto-approval.js +1 -1
- package/src/commands/state/create.js +0 -5
- package/src/commands/state/finish.js +43 -1
- package/src/commands/state/gate-check.js +37 -30
- package/src/commands/state/gate-decision.js +3 -2
- package/src/commands/state/next.js +1 -0
- package/src/commands/state/recap.js +67 -0
- package/src/commands/state/report-check.js +39 -146
- package/src/commands/validation/plan-check.js +16 -11
- package/src/commands/validation/validate-feature.js +3 -3
- package/src/commands/validation/verify.js +6 -6
- package/src/core/paths/output-schema.js +3 -3
- package/src/core/state/state-manager.js +2 -4
- package/src/dashboard/app/components/CommandPalette.jsx +2 -5
- package/src/dashboard/app/components/GatePauses.jsx +116 -0
- package/src/dashboard/app/components/SessionMap.jsx +77 -0
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/Activity.jsx +4 -0
- package/src/dashboard/app/pages/AgentMap.jsx +1 -2
- package/src/dashboard/app/pages/FeatureDetail.jsx +129 -186
- package/src/dashboard/app/pages/Features.jsx +7 -7
- package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
- package/src/dashboard/app/pages/Portfolio.jsx +40 -5
- package/src/dashboard/scanner/activity-scanner.js +29 -0
- package/src/dashboard/scanner/agents-scanner.js +11 -14
- package/src/dashboard/scanner/features-scanner.js +45 -24
- package/src/dashboard/scanner/project-api.js +11 -2
- package/src/dashboard/scanner/skills-scanner.js +11 -1
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/e2e/applicability.js +3 -1
- package/src/lib/git/tree-state.js +1 -16
- package/src/lib/graph/diff-tree.js +127 -0
- package/src/lib/graph/graphify-runtime.js +12 -5
- package/src/lib/heavy/gate.js +22 -1
- package/src/lib/installers/memory-installer.js +2 -2
- package/src/lib/installers/rules-installer.js +57 -0
- package/src/lib/installers/stack-assets.js +17 -0
- package/src/lib/installers/stack-sync.js +219 -0
- package/src/lib/plan/checks.js +55 -110
- package/src/lib/plan/critique.js +28 -0
- package/src/lib/plan/media.js +42 -0
- package/src/lib/plan/plan-html.js +125 -0
- package/src/lib/plan/plan-parser.js +34 -45
- package/src/lib/recap/piper.js +36 -0
- package/src/lib/recap/recap.js +232 -0
- package/src/lib/review-reports.js +33 -7
- package/src/lib/risk-detector.js +90 -11
- package/src/lib/specs/screen-checklist.js +33 -48
- package/src/lib/stack/dotnet-build-ignores.js +8 -9
- package/src/lib/tasks/test-nodes.js +24 -6
- package/src/lib/tasks/test-runner.js +40 -1
- package/src/lib/telemetry/metrics.js +27 -29
- package/src/lib/validators/reuse/reuse-validator.js +1 -9
- package/src/lib/validators/verify-runner.js +50 -19
- package/src/lib/worktree/fleet-scanner.js +7 -20
- package/src/lib/worktree/worktree-audit.js +0 -37
- package/src/scripts/setup-infra.js +15 -50
- package/src/utils/agents-installer.js +27 -201
- package/src/utils/hooks-installer.js +11 -95
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +0 -23
- package/framework/hooks/claude-code/statusline.py +0 -699
- package/framework/hooks/claude-code/statusline.sh +0 -11
- package/framework/hooks/shared/agent-reap.js +0 -74
- package/framework/hooks/shared/slice-progress.js +0 -110
- package/framework/skills/core/morph-hotfix/SKILL.md +0 -133
- package/framework/skills/core/morph-machine/SKILL.md +0 -46
- package/framework/skills/core/morph-review/SKILL.md +0 -129
- package/framework/skills/core/morph-standards/SKILL.md +0 -52
- package/framework/standards/PROVENANCE.json +0 -119
- package/src/commands/project/worktree-reap.js +0 -34
- package/src/commands/state/handoff.js +0 -65
- package/src/commands/validation/mutate.js +0 -263
- package/src/commands/validation/scout-check.js +0 -28
- package/src/lib/generators/handoff-generator.js +0 -172
- package/src/lib/mutation/adapters.js +0 -79
- package/src/lib/mutation/commands.js +0 -61
- package/src/lib/mutation/dotnet-introspection.js +0 -281
- package/src/lib/mutation/manifest.js +0 -144
- package/src/lib/mutation/plan.js +0 -44
- package/src/lib/mutation/report.js +0 -68
- package/src/lib/mutation/runner.js +0 -301
- package/src/lib/mutation/schemata.js +0 -60
- package/src/lib/mutation/snapshot.js +0 -65
- package/src/lib/mutation/subset.js +0 -109
- package/src/lib/mutation/trx.js +0 -50
- package/src/lib/scout/scout-check.js +0 -293
- package/src/lib/validators/traceability-check.js +0 -103
- package/src/lib/worktree/agent-reaper.js +0 -247
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"expectedCount": {
|
|
58
58
|
"type": "integer",
|
|
59
59
|
"minimum": 0,
|
|
60
|
-
"description": "Recorded baseline. Written ONLY by `morph-spec verify --record-baseline`, from a green run — never typed by hand."
|
|
60
|
+
"description": "Recorded baseline, kept only for `node-test` and `evals` (ignored, and removed by --record-baseline, on the other runners). Written ONLY by `morph-spec verify --record-baseline`, from a green run — never typed by hand."
|
|
61
61
|
},
|
|
62
62
|
"timeoutMs": {
|
|
63
63
|
"type": "integer",
|
|
@@ -122,11 +122,16 @@
|
|
|
122
122
|
"e2e": {
|
|
123
123
|
"type": "object",
|
|
124
124
|
"additionalProperties": true,
|
|
125
|
-
"description": "The verification stack of `e2e up` and of the verify e2e node. Only hostServices
|
|
125
|
+
"description": "The verification stack of `e2e up` and of the verify e2e node. Only hostServices and resetCommand are described here; the other keys (auth, command, portEnvNames, ...) stay open.",
|
|
126
126
|
"properties": {
|
|
127
|
+
"resetCommand": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 1,
|
|
130
|
+
"description": "Run by `e2e reset` to put the running stack's data back in a known state between verification flows, with the stack env (port block + e2e.auth.envFile), before the auth seed. Unset: `e2e reset` recreates, empty, the compose services without a build section that mount a named, non-external volume (rm -sfv, volume rm, up -d --wait). App services and hostServices are never restarted."
|
|
131
|
+
},
|
|
127
132
|
"hostServices": {
|
|
128
133
|
"type": "array",
|
|
129
|
-
"description": "Apps that run as host processes next to the compose stack
|
|
134
|
+
"description": "Apps that run as host processes, in the feature's port block: next to the compose stack when building them inside the Docker VM is expensive (compose keeps only the dependencies), or alone when the app has no dependency to containerize (no database, no queue). Without a compose file and without a configured e2e.composeFile, a non-empty hostServices IS the stack (host-only): no compose lint, no Docker check, `e2e reset` runs resetCommand or only the seed. Order on `e2e up` and on the verify e2e node: compose up --wait (skipped host-only), then each service in array order (build, start detached, health), then the auth seed. They stay up until `e2e down`, `finish`, `delete` or `worktree remove`. Reused while the code stamp (HEAD + status + diff) matches and health is green; a divergent stamp or --fresh/--fresh-e2e kills, rebuilds and restarts them. A failure (build exit != 0, timeout, health never green) fails `e2e up` (exit 1) and the e2e node with the service name and its log tail, kills what this run started and skips the seed. The authority at runtime is validateServices() in framework/hooks/shared/host-services.js.",
|
|
130
135
|
"items": {
|
|
131
136
|
"type": "object",
|
|
132
137
|
"additionalProperties": false,
|
|
@@ -237,7 +242,7 @@
|
|
|
237
242
|
"type": "object",
|
|
238
243
|
"additionalProperties": false,
|
|
239
244
|
"default": { "unit": 1.5, "build": 4, "e2e": 4 },
|
|
240
|
-
"description": "Free-RAM floor per kind of heavy command. unit = vitest/jest, npm|pnpm|yarn test, the verify tests node; e2e = playwright, docker compose up, the verify e2e node, e2e up; build = everything else (dotnet build|test|publish, next build, docker build,
|
|
245
|
+
"description": "Free-RAM floor per kind of heavy command. unit = vitest/jest, npm|pnpm|yarn test, the verify tests node; e2e = playwright, docker compose up, the verify e2e node, e2e up; build = everything else (dotnet build|test|publish, next build, docker build, unknown commands). A verify admitted at a lighter node waits again, holding its slot, before a heavier one. A kind left out takes an explicit heavy.minFreeMemGb, else its default.",
|
|
241
246
|
"properties": {
|
|
242
247
|
"unit": { "type": "number", "minimum": 0 },
|
|
243
248
|
"build": { "type": "number", "minimum": 0 },
|
|
@@ -268,15 +273,15 @@
|
|
|
268
273
|
},
|
|
269
274
|
"gateBash": {
|
|
270
275
|
"type": "boolean",
|
|
271
|
-
"default":
|
|
272
|
-
"description": "
|
|
276
|
+
"default": true,
|
|
277
|
+
"description": "On by default: the session runs builds and tests itself, so a raw heavy command queues like the verify does. A PreToolUse hook takes a slot before a raw heavy Bash command (dotnet build|test|publish|pack, npm|pnpm|yarn test|build, vitest, jest, docker compose up|build, ...) runs and the matching Post hook gives it back. Waits up to heavy.waitTimeoutSec (capped below the hook timeout), then refuses the call with a busy message instead of running it. Foreground Bash only: a run_in_background call is not gated, and a call denied or interrupted after the hook keeps its slot until its timeout lapses, and that timeout starts before the permission prompt."
|
|
273
278
|
}
|
|
274
279
|
}
|
|
275
280
|
},
|
|
276
281
|
"worktree": {
|
|
277
282
|
"type": "object",
|
|
278
283
|
"additionalProperties": true,
|
|
279
|
-
"description": "Worktree behaviour of this project. Other keys are left open; the
|
|
284
|
+
"description": "Worktree behaviour of this project. Other keys are left open; the reader is src/lib/worktree/vscode-settings.js.",
|
|
280
285
|
"properties": {
|
|
281
286
|
"root": {
|
|
282
287
|
"type": "string",
|
|
@@ -287,18 +292,6 @@
|
|
|
287
292
|
"type": "boolean",
|
|
288
293
|
"default": true,
|
|
289
294
|
"description": "false stops `init`, `update`, `worktree setup|provision` and `doctor --worktrees --prune` from adding the worktree/node_modules (and, on .NET, bin/obj) excludes to .vscode/settings.json. `MORPH_EDITOR_SETTINGS=0` does the same for one run."
|
|
290
|
-
},
|
|
291
|
-
"reap": {
|
|
292
|
-
"type": "object",
|
|
293
|
-
"additionalProperties": false,
|
|
294
|
-
"properties": {
|
|
295
|
-
"graceMinutes": {
|
|
296
|
-
"type": "number",
|
|
297
|
-
"minimum": 0,
|
|
298
|
-
"default": 30,
|
|
299
|
-
"description": "How long a sub-agent's events.jsonl must stay quiet after its AgentUsage before `worktree reap` removes the tree: a stopped agent can still be resumed by SendMessage. An invalid value falls back to 30."
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
295
|
}
|
|
303
296
|
}
|
|
304
297
|
}
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"format": "date-time",
|
|
30
30
|
"description": "Stamped by `morph-spec archive`."
|
|
31
31
|
},
|
|
32
|
+
"archivedFrom": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"properties": { "sha": { "type": "string", "pattern": "^[0-9a-f]{40}$" } },
|
|
35
|
+
"description": "Branch tip before `morph-spec archive` pruned the folder to feature.json + 2-plan/plan.md: the report, reviews and evidence stay readable at this sha."
|
|
36
|
+
},
|
|
32
37
|
"abandonedAt": {
|
|
33
38
|
"type": "string",
|
|
34
39
|
"format": "date-time",
|
|
@@ -52,7 +57,8 @@
|
|
|
52
57
|
"type": "object",
|
|
53
58
|
"required": ["pause", "reason", "signals", "trust", "decidedAt"],
|
|
54
59
|
"properties": {
|
|
55
|
-
"pause": { "type": "boolean", "description": "true = the gate
|
|
60
|
+
"pause": { "type": "boolean", "description": "true = the gate does not pass yet: `resolver` says who clears it (the session by doing the work, or a human by AskUserQuestion); false = auto-pass with a short summary." },
|
|
61
|
+
"resolver": { "type": ["string", "null"], "enum": ["session", "human", null], "description": "Who clears a pause: `session` does the work the reason names and runs gate-check again (verify, fix loop, plan-check, review dispatch); `human` answers the gate question. null when the gate does not pause. Rule: `pauseResolver` in src/lib/risk-detector.js." },
|
|
56
62
|
"reason": { "type": "string", "description": "The signal that drove the decision (or 'nenhum sinal de risco')." },
|
|
57
63
|
"signals": {
|
|
58
64
|
"type": "object",
|
|
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
|
|
|
4
4
|
version: core
|
|
5
5
|
when_to_use: Use quando for iniciar um novo projeto de LP com o template Umbraco genérico
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "10.0.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- umbraco
|
|
10
10
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Umbraco 17 / .NET 10 + Next.js: Padrões e Gotchas do Sistema de Leads (Frente 4)
|
|
2
2
|
|
|
3
|
-
> **Origem:** documentado a partir do código real em `MORPH_Umbraco_LP_Template` (template canônico) e validado contra
|
|
3
|
+
> **Origem:** documentado a partir do código real em `MORPH_Umbraco_LP_Template` (template canônico) e validado contra uma LP em produção derivada dele.
|
|
4
4
|
> **Natureza:** referência consultável para devs adaptando o template para novos clientes — não é um skill executável. A lógica vive no template repo; este doc é o mapa dos padrões e armadilhas.
|
|
5
5
|
> **Convenção de citação:** cada padrão cita o **arquivo real** no `MORPH_Umbraco_LP_Template`. Símbolos (método/classe/alias) são âncoras estáveis; números de linha, quando aparecem, são auxiliares e podem deslizar entre versões.
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
|
|
|
4
4
|
version: core
|
|
5
5
|
when_to_use: Use quando o usuário pedir "use /migrate-lp-to-umbraco {projeto}" ou descrever a necessidade de migrar uma LP para Umbraco
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "10.0.0"
|
|
8
8
|
stacks:
|
|
9
9
|
- umbraco
|
|
10
10
|
---
|
|
@@ -346,7 +346,7 @@ Copiar as variáveis de design da origem para `frontend/src/app/globals.css` no
|
|
|
346
346
|
href="https://fonts.googleapis.com/css2?...">` no `<head>` é render-blocking (round-trip
|
|
347
347
|
externo antes de qualquer paint) e, combinado com `font-display: swap`, causa CLS quando a
|
|
348
348
|
fonte troca depois do primeiro paint — foi 1.680ms de render-blocking estimado e 0.221 de CLS
|
|
349
|
-
medidos
|
|
349
|
+
medidos numa LP real migrada. **Não usar `next/font/google`** aqui (diferente do passo 4
|
|
350
350
|
de `create-umbraco-lp`, que pode usar): o nome de família que ele gera é escopado/diferente do
|
|
351
351
|
literal da origem, e o gate de paridade (passo 6b.2) compara `font-family` computado
|
|
352
352
|
byte-a-byte contra a origem — `next/font` quebra esse check.
|
|
@@ -1,189 +1,61 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: morph-apply
|
|
3
|
-
description:
|
|
3
|
+
description: Implementa o plano aprovado de uma feature morph-spec inteiro nesta sessão, prova com um verify sem filtro, conduz o Gate 3 (verificador, revisor e segurança em contexto fresco) e fecha com finish. Também conduz hotfix e chore.
|
|
4
4
|
version: core
|
|
5
|
-
when_to_use: Use com o gate do plano aprovado, em "
|
|
5
|
+
when_to_use: Use com o gate do plano aprovado ("/morph-apply {feature}", "implementar feature"), em "/morph-review {feature}" (entra no §5), em "/morph-hotfix {feature}" ou incidente de produção (references/hotfix.md), ou quando `morph-spec next` mandar implement, verify, fix, review ou finish
|
|
6
6
|
user-invocable: true
|
|
7
|
-
cliVersion: "
|
|
7
|
+
cliVersion: "10.0.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Do plano aprovado à feature fechada, numa janela só. O progresso é `3-implement/report.md`; o próximo passo é o que `morph-spec next {feature}` disser.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
`verify` da feature verde, e a entrega à `morph-review`. O progresso **é** o conjunto de
|
|
16
|
-
relatórios (ausente = pendente, `PARCIAL` na 1ª linha = parcial, senão feito): não há arquivo de
|
|
17
|
-
status para editar.
|
|
14
|
+
## 1. Contexto, uma vez
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
Leia `2-plan/plan.md` e `2-plan/checks.json` uma vez por sessão (ou depois de um `/compact`): o plano está congelado, não releia por padrão — só o trecho que falta. Retomando, leia também `3-implement/report.md`: é a sua memória.
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
`run_in_background` e espera a notificação de término **no mesmo turno**: nunca encerre o turno
|
|
23
|
-
com o verify da feature rodando — o stamp que o Gate 3 lê é o dele. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
|
|
24
|
-
pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
|
|
25
|
-
saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
|
|
18
|
+
`.morph/config/config.json` sem `project.stack` → a stack é do usuário: `AskUserQuestion` com a stack completa do Morph recomendada (`dotnet+nextjs --with neon`, standard `architecture-stack-baseline`), depois `morph-spec stack-set <stack>`. As rules de domínio só valem numa sessão nova: peça para reabrir antes de qualquer código. Sem `project.tests` → declare-os a partir do `## Contrato de implementação` (forma em `.morph/framework/schemas/config.schema.json`) e confira com `morph-spec doctor --full`, antes de qualquer código.
|
|
26
19
|
|
|
27
|
-
##
|
|
20
|
+
## 2. Implementar
|
|
28
21
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
`morph-spec plan-check {feature}` imprime as **ondas**: fatias de uma onda não dependem uma da
|
|
39
|
-
outra nem tocam o mesmo arquivo, até 4 por onda.
|
|
40
|
-
|
|
41
|
-
## 2. Fatiar
|
|
42
|
-
|
|
43
|
-
- Uma onda por vez, até **4 agentes ao mesmo tempo**, um por fatia, `subagent_type: "morph-{id}"` (o `persona:` da fatia).
|
|
44
|
-
- Duas fatias em voo que escrevem o mesmo arquivo: a segunda vai em worktree (§4), rolling.
|
|
45
|
-
- Fatias em paralelo na mesma árvore commitam pela lista explícita de arquivos (`git add <paths>`), nunca um diretório: `git add api` leva o arquivo que a fatia vizinha acabou de escrever.
|
|
46
|
-
- **Inline** só para fatia pequena no domínio já carregado, com **uma linha de porquê** no relatório.
|
|
47
|
-
Antes de codar, leia os standards que a fatia fixa. Inline também grava `3-implement/reports/F{n}.md`,
|
|
48
|
-
no formato abaixo — é ele que conta o progresso.
|
|
49
|
-
|
|
50
|
-
O hook `validate-completion` (no Stop) e o `report-check` cobram o relatório pela mesma régua
|
|
51
|
-
(`inspectReport`); conhecer o formato antes evita reescrever o relatório depois de dar a fatia por feita:
|
|
52
|
-
|
|
53
|
-
```markdown
|
|
54
|
-
# F{n} — {título}
|
|
55
|
-
|
|
56
|
-
{2-3 frases: o comportamento entregue, onde mora e como foi provado}
|
|
57
|
-
|
|
58
|
-
**Arquivos:** `{path}`, `{path}`
|
|
59
|
-
|
|
60
|
-
**Checks:** C{n} — {teste que prova, ou `arquivo:linha`}
|
|
61
|
-
|
|
62
|
-
**Standards:** `{id}`, `{id}`
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
`**Arquivos:**` lista todo arquivo criado ou modificado; cada `C{n}` que a fatia `cobre` aparece pelo
|
|
66
|
-
id; relatório que abre com `PARCIAL` não conta como feito. Os relatórios **são** o registro da
|
|
67
|
-
implementação: o `verify` confere a união dos `**Arquivos:**` contra os
|
|
68
|
-
`arquivos:` das fatias (aviso, nunca reprova). `**Standards:**` nomeia os ids que o agente de fato
|
|
69
|
-
consultou (o `report-check` não o exige).
|
|
70
|
-
- Persona não registrada: `general-purpose` com o campo `persona` de `agents.json` colado, e
|
|
71
|
-
`dispatch-fallback: general-purpose ({id} não registrado)` no relatório.
|
|
72
|
-
|
|
73
|
-
## 3. Dispatch — só o que muda
|
|
74
|
-
|
|
75
|
-
O contrato fixo (relatório, estado, teste, escopo, `wip`, processos, reuso, mutação e o formato do
|
|
76
|
-
relatório) está no corpo da persona gerada e chega a todo dispatch sem ser colado. O prompt leva:
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
80
|
-
Fatia F{n} — <título>
|
|
81
|
-
cobre: <cada Cn com o texto literal do cenário, a `prova:` e o `risco:`>
|
|
82
|
-
arquivos: <os `arquivos:` da fatia>
|
|
83
|
-
standards: <por id: o digest de `morph-spec standards --find` + as 3-8 regras que ESTA fatia aplica>
|
|
84
|
-
reuso: <as linhas de `## Reuso` que tocam a fatia — conceito, veredito, alvo>
|
|
85
|
-
contexto: <o que você já leu: `arquivo:linhas` + o trecho; nada que o agente tenha de reler>
|
|
86
|
-
relatório: .morph/features/{feature}/3-implement/reports/F{n}.md (com `**Standards:**`: os ids consultados)
|
|
87
|
-
worktree: <só com isolamento>
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## 4. Worktree rolling
|
|
91
|
-
|
|
92
|
-
Com `isolation: "worktree"` o hook `WorktreeCreate` cria `worktrees/<n>` na branch `morph-task/<n>`,
|
|
93
|
-
com junctions e `.morph/worktree.env` prontos (infra faltando: `morph-spec worktree link --all`).
|
|
94
|
-
**Rolling, não por onda:** a cada relatório, `report-check`, `git merge --no-ff <branch>` (conflito →
|
|
95
|
-
`git merge --abort` e a fatia volta a pendente com nota no relatório) e despache na hora a próxima fatia
|
|
96
|
-
que ficou pronta sem colidir com as em voo. Depois de cada retorno, `morph-spec worktree reap --json`
|
|
97
|
-
(`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou); o que sobrar sai por `morph-spec worktree remove --target <path> --delete-branch` (já mergeada; o
|
|
98
|
-
`git branch -d` dele recusa trabalho não integrado) — NUNCA `git worktree remove` cru,
|
|
99
|
-
que atravessa as junctions.
|
|
100
|
-
|
|
101
|
-
## 5. Retomar o controle
|
|
102
|
-
|
|
103
|
-
`morph-spec report-check {feature} F1 F2 … --json` com as fatias que voltaram. **Leia o arquivo de
|
|
104
|
-
relatório, não a mensagem** — a mensagem final pode não chegar ou vir resumida.
|
|
105
|
-
|
|
106
|
-
| Veredito | Ação |
|
|
107
|
-
|---|---|
|
|
108
|
-
| `ok` | siga |
|
|
109
|
-
| `report-stale` | **não re-despache**: o agente escreveu depois de relatar; leia `observed` e atualize o relatório |
|
|
110
|
-
| `report-incomplete` + `resume` | `PARCIAL` na 1ª linha = a fatia não está pronta — o `report-check` o acusa como `report-incomplete`. Retome o MESMO agente por `SendMessage`, colando `tree.dirty`, `tree.commits` e o que falta |
|
|
111
|
-
| `report-blocked` + `ask-human` | `BLOQUEADO` na 1ª linha = decisão que não é do agente; a pergunta e as opções estão no relatório. **Não re-despache.** Plano ou ADR já decide → decida e registre; senão `AskUserQuestion`. Retome o MESMO agente com a resposta |
|
|
112
|
-
| `report-incomplete` + `complete-degraded` | complete a partir da mensagem, carimbe DEGRADADO e registre a falha no relatório |
|
|
113
|
-
| `work-landed-report-missing` | não re-despache; grave você o relatório, DEGRADADO |
|
|
114
|
-
| `no-work-no-report` / `report-missing-evidence-unknown` | re-despache uma vez; segunda ausência sem trabalho = escale |
|
|
115
|
-
|
|
116
|
-
Árvore suja sem explicação ou `tree.markers` não vazio vão ao relatório da fatia.
|
|
117
|
-
|
|
118
|
-
## 6. Verify da feature, uma vez
|
|
119
|
-
|
|
120
|
-
Sem fatia pendente nem em voo, **primeiro o contexto** — antes do verify, para que a prova e o Gate 3
|
|
121
|
-
cubram a árvore que vai ao merge. Todo `.morph/context/*.md` que descreve um fato que esta feature
|
|
122
|
-
mudou tem o **corpo** reescrito para o estado novo, nunca empilhado (valor que ainda vale em algum
|
|
123
|
-
lugar diz onde); o changelog do documento guarda só data e motivo. Mudança estrutural
|
|
124
|
-
(`package.json`, `.csproj`, `next.config.*`, `tsconfig.json`, `docker-compose.yml`) atualiza também
|
|
125
|
-
`.morph/context/README.md` (stack, arquitetura, integrações) e `.morph/config/config.json` (stack,
|
|
126
|
-
arquitetura, integrações, paths). **Commite** o trabalho das fatias e essa atualização de contexto e
|
|
127
|
-
config **antes** do verify: o stamp grava o HEAD, e código ou `config.json` commitado depois dele é
|
|
128
|
-
árvore nova — um terceiro verify.
|
|
129
|
-
|
|
130
|
-
Depois `morph-spec verify {feature} --json`, **sem filtro** — nunca recorte o
|
|
131
|
-
verify da feature. `--filter` é do loop do próprio sub-agente; o Gate 3 e o CI rodam a suíte
|
|
132
|
-
inteira. Nó de teste sem `expectedCount`, ou fatia que apagou teste de propósito (limpeza, `morph-spec tests-audit`): acrescente `--record-baseline` a ESTA rodada — ela mede e
|
|
133
|
-
prova de uma vez; nunca um segundo verify só para gravar a baseline. Vermelho: corrija com `verify.feedback` (direto no código, ou re-despachando a fatia dona)
|
|
134
|
-
e rode de novo; **3 tentativas** sem verde → `AskUserQuestion` ("Verify de {feature} vermelho após 3
|
|
135
|
-
tentativas — aceitar com ressalva, continuar tentando, ou parar?"). Quem conta é o `feature.json`:
|
|
136
|
-
`morph-spec next {feature}` devolve `fix` enquanto há tentativa e `escalate` na 3ª vermelha seguida.
|
|
137
|
-
|
|
138
|
-
**Cenário que julga saída de LLM** (`prova: eval`): a evidência é rodar, não ler código. Com nó
|
|
139
|
-
`runner: "evals"`: `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
|
|
140
|
-
(sonda, não prova de gate). Grave `3-implement/evidencias/{Cn}.md`: o cenário literal, o nó, o modelo
|
|
141
|
-
efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado pessoal, e o
|
|
142
|
-
veredito com a razão. Não é o `reports/F{n}.md`: aquele diz o que o agente fez; este prova, rodando,
|
|
143
|
-
que a saída atende ao cenário.
|
|
144
|
-
|
|
145
|
-
## 7. Review
|
|
146
|
-
|
|
147
|
-
Verify verde: `Skill(morph-review)`. O Gate 3 é apresentado, decidido e aprovado por ela; ao retomar o
|
|
148
|
-
controle, **não re-apresente o gate** — siga para o encerramento conforme `gateDecisions.review`.
|
|
149
|
-
|
|
150
|
-
## 8. Encerramento
|
|
151
|
-
|
|
152
|
-
- **Contexto já foi no §6**, antes da prova. Depois do Gate 3 nada muda `config.json` nem código: a
|
|
153
|
-
árvore integrada é a revisada. Commite na branch da feature o que faltar (relatórios do review) —
|
|
154
|
-
o `finish` exige a árvore limpa.
|
|
155
|
-
- **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo por `AskUserQuestion` (header
|
|
156
|
-
`"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
|
|
157
|
-
`aguardando-merge` em `list`/`fleet`.
|
|
158
|
-
|
|
159
|
-
## Escalada de escopo
|
|
22
|
+
O plano inteiro, nesta sessão, em sequência. Sem sub-agent para implementar: o que você descobre no `C1` (um formato, uma regra, um nome) é o que o `C5` precisa.
|
|
23
|
+
|
|
24
|
+
- As regras de cada domínio (.NET, EF, MAF, Next.js, infra) chegam sozinhas: a rule do stack carrega quando você toca o arquivo. O texto inteiro de um standard: `morph-spec standards --find` → `--show <id>#<âncora>`.
|
|
25
|
+
- Antes de criar um tipo, confira a tabela `## Reuso` e `morph-spec graph explain <nome>` (sem grafo, `grep -rn`).
|
|
26
|
+
- Rode build e teste quando quiser; teste pesado fora do `verify` por `morph-spec heavy run -- <cmd>`. Exit 3 = fila cheia: uma chamada nova no máximo (`references/machine.md`).
|
|
27
|
+
- Ao fechar um `Cn`, atualize a linha dele no `report.md` (`feito` + a evidência: teste, `arquivo:linha`) e commite (`wip(<f>): C2 …`). Decisão ou fato novo → uma linha em `## Notas`.
|
|
28
|
+
- Mídia gerada por IA: `references/media.md`. Erro difícil: `references/debugging.md`.
|
|
29
|
+
|
|
30
|
+
`Cn` que depende de uma decisão que não é sua: status `bloqueado` e a pergunta em `## Notas`; o `next` devolve `decide` → `AskUserQuestion`.
|
|
160
31
|
|
|
161
32
|
| Situação | Caminho |
|
|
162
33
|
|---|---|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
|
34
|
+
| acréscimo pequeno dentro do escopo | `## Notas` do report |
|
|
35
|
+
| fato errado no plano, escopo igual | `## Errata` no fim do `plan.md` (append-only) |
|
|
36
|
+
| escopo mudou | `morph-spec unapprove {feature} plan --reason "…"`, emende, `plan-check`, gate de novo |
|
|
166
37
|
|
|
167
|
-
|
|
168
|
-
e siga.
|
|
38
|
+
**Cenário `prova: eval`:** a evidência é rodar. Com nó `runner: "evals"`: `morph-spec verify {feature} --filter <nó> --skip-e2e --no-persist`; grave `3-implement/evidencias/{Cn}.md` (cenário, modelo, hash do prompt, entrada e saída sem dado pessoal, veredito). `prova: manual`: passo e resultado no mesmo lugar.
|
|
169
39
|
|
|
170
|
-
##
|
|
40
|
+
## 3. Verify, sem filtro
|
|
171
41
|
|
|
172
|
-
|
|
173
|
-
2. **Corrija a implementação primeiro** — o teste é a especificação; confie nele por padrão.
|
|
174
|
-
3. **Só mude um arquivo de teste se a própria expectativa estiver errada.**
|
|
175
|
-
4. **Antes de mudar, explique POR QUE o teste está errado** — qual é o comportamento certo.
|
|
42
|
+
Todo `Cn` `feito`: `morph-spec context refresh` (regera o inventário em `.morph/context/README.md`; `design-system.md` você atualiza só se mudou token), commite tudo e rode `morph-spec verify {feature} --json` sem filtro: a suíte inteira é a prova que o Gate 3 e o CI leem; com `--filter`, o verde mede só um nó. Passou de 10 min: `run_in_background` e espere a notificação **no mesmo turno**. Nó `node-test`/`evals` sem `expectedCount`, ou teste apagado de propósito: `--record-baseline` nesta mesma rodada.
|
|
176
43
|
|
|
177
|
-
|
|
44
|
+
Vermelho → corrija com `verify.feedback` e rode de novo. `next` conta: `fix` enquanto há tentativa, `escalate` na 3ª vermelha seguida → `AskUserQuestion` ("Verify de {feature} vermelho após 3 tentativas — aceitar com ressalva, continuar tentando, ou parar?").
|
|
178
45
|
|
|
179
|
-
|
|
180
|
-
`/morph-troubleshoot <palavras>`; **uma hipótese por vez**, cada uma testada pela menor checagem que
|
|
181
|
-
a refutaria; depois de três consertos falhos, nunca tente um quarto sozinho — `AskUserQuestion`
|
|
182
|
-
com a pergunta de desenho que as falhas levantam; confirme com a mesma checagem que reproduziu.
|
|
46
|
+
## 4. Ramo por tipo
|
|
183
47
|
|
|
184
|
-
|
|
48
|
+
- **chore:** Gate 3 só com o revisor (`references/review.md`).
|
|
49
|
+
- **hotfix:** `references/hotfix.md` do começo ao fim (diagnóstico, plano curto, `verifier.md` seu, Gate 3 sempre humano).
|
|
50
|
+
|
|
51
|
+
## 5. Gate 3
|
|
52
|
+
|
|
53
|
+
Verify verde: siga `references/review.md` — foto `--before-eval`, verificador ∥ revisor (∥ segurança) na mesma resposta, correção dos bloqueadores, confirmação, `gate-check review`. Ao retomar com o gate já decidido, não re-apresente: siga para o §6.
|
|
54
|
+
|
|
55
|
+
## 6. Fechar
|
|
56
|
+
|
|
57
|
+
Commite o que faltar (relatórios do review) — o `finish` exige árvore limpa. Modo por `AskUserQuestion` (header "Integração"): `morph-spec finish {feature} --pr|--merge`. `--pr` não integra: a feature fica `aguardando-merge` até o merge. O `finish` arquiva o `feature.json`, o `plan.md` e o recap; o report e a review ficam no histórico do git. Encerrado, aponte o recap ao usuário (`.morph/archive/{feature}/recap.html`, abra no navegador; `morph-spec recap {feature} --piper` narra com o Piper local).
|
|
58
|
+
|
|
59
|
+
## Arquivo de teste
|
|
185
60
|
|
|
186
|
-
|
|
187
|
-
- Sub-agente tocando `plan.md`, `checks.json` ou `feature.json`.
|
|
188
|
-
- Re-despachar sobre `report-stale` ou sobre um `PARCIAL` (retome o MESMO agente).
|
|
189
|
-
- Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
|
|
61
|
+
A implementação está errada ou a expectativa do teste está? Corrija a implementação primeiro — o teste é a especificação. Só mude o teste quando a expectativa estiver errada, e diga por quê nas `## Notas`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Debugging
|
|
2
|
+
|
|
3
|
+
Causa raiz antes do conserto.
|
|
4
|
+
|
|
5
|
+
1. Reproduza e leia o erro inteiro. Erro conhecido de .NET/Next.js → `/morph-troubleshoot <palavras>`.
|
|
6
|
+
2. **Uma hipótese por vez**, cada uma testada pela menor checagem que a refutaria.
|
|
7
|
+
3. Confirme o conserto com a mesma checagem que reproduziu o erro.
|
|
8
|
+
4. Três consertos falhos no mesmo problema: não tente um quarto sozinho — `AskUserQuestion` com a pergunta de desenho que as falhas levantaram.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Hotfix
|
|
2
|
+
|
|
3
|
+
Queda ou bug crítico de produção. Prioridade é velocidade, com aprovação humana obrigatória antes do ship.
|
|
4
|
+
|
|
5
|
+
## 1. Nascimento
|
|
6
|
+
|
|
7
|
+
`morph-spec create {feature} --type hotfix --description "<o que quebrou / sintoma>"` — nasce com o gate `plan` carimbado por política, já em `implement`. Já existe: siga.
|
|
8
|
+
|
|
9
|
+
## 2. Diagnóstico
|
|
10
|
+
|
|
11
|
+
Você mesmo, antes de qualquer fix: o sintoma → o caminho no código (`morph-spec graph affected <símbolo> --prod --json`; sem grafo, `grep -rn`) → causa provável → blast radius (o que mais passa pelo trecho que vai mudar). Cite `arquivo:linha` só do que você abriu: sob pressão, citação inventada vira um segundo incidente.
|
|
12
|
+
|
|
13
|
+
## 3. Plano curto (uma escrita só — o arquivo congela ao nascer)
|
|
14
|
+
|
|
15
|
+
`2-plan/plan.md`, ~20 linhas:
|
|
16
|
+
|
|
17
|
+
- `## Problema` — sintoma, causa, blast radius.
|
|
18
|
+
- `## Cenários`:
|
|
19
|
+
- **C1** — o sintoma ausente: dado o estado que quebrava, quando a ação que falhava, então o resultado certo. `prova: teste` (ou `e2e`) e `risco: regressão` — o único teste novo do hotfix.
|
|
20
|
+
- **C2** — o blast radius continua funcionando. `prova: leitura` (`arquivo:linha`) ou um teste existente que já o cobre.
|
|
21
|
+
- `## Decisões` com `### Conflitos com o acervo` (`nenhum` vale).
|
|
22
|
+
|
|
23
|
+
`morph-spec plan-check {feature}` até zero erro.
|
|
24
|
+
|
|
25
|
+
## 4. Fix e prova
|
|
26
|
+
|
|
27
|
+
A mudança mínima que tira a falha do ar — refatoração e hardening fora do sintoma ficam para outra feature. `report.md` com C1/C2. `morph-spec verify {feature} --json` sem filtro; C1 se prova com o sintoma reproduzido antes e ausente depois — cole a saída real.
|
|
28
|
+
|
|
29
|
+
## 5. Gate 3 — sempre humano
|
|
30
|
+
|
|
31
|
+
Escreva você `4-review/verifier.md`: `**Verdict:** SHIP|FIX`, `**Reviewed-SHA:** {git rev-parse HEAD}`, `## Checks` (`| Cn | PROVADO|NÃO PROVADO|FALHA | evidência |`, evidência = saída do verify), `## Bloqueadores` (`Nenhum.` vale). `morph-spec gate-check {feature} review` pausa sempre. `AskUserQuestion`, header "Gate 3":
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
question: "Gate 3 — Hotfix de {feature} pronto para ship?"
|
|
35
|
+
options: "aprovado, ship" | "preciso ajustar" | "rollback"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Nunca** `approve {feature} review --mode auto` (o CLI recusa). Headless: `morph-spec approve {feature} review --approver "<quem aprovou>"` — só com aprovação humana real; nunca invente o nome.
|
|
39
|
+
|
|
40
|
+
## 6. Pós-gate
|
|
41
|
+
|
|
42
|
+
Código mudou depois do verify → verify de novo. `morph-spec finish {feature} --pr|--merge`, modo escolhido pelo usuário; `--merge` integra na hora, `--pr` não — o incidente só está resolvido depois do merge.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Máquina: RAM, fila e processos
|
|
2
|
+
|
|
3
|
+
Para manter a máquina utilizável enquanto você compila e testa. Aplique quando o sintoma aparecer; o usuário não precisa pedir.
|
|
4
|
+
|
|
5
|
+
## Regras que não se negociam
|
|
6
|
+
|
|
7
|
+
- **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.
|
|
8
|
+
- **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.
|
|
9
|
+
- **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` ou `worktree remove`.
|
|
10
|
+
- **Destrutivo pergunta antes.** `doctor --procs --prune`: mostre a lista e use `AskUserQuestion`.
|
|
11
|
+
|
|
12
|
+
## Sintoma → comando
|
|
13
|
+
|
|
14
|
+
| Sintoma | Comando | Como ler e o que fazer |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| 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`. |
|
|
17
|
+
| 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`. |
|
|
18
|
+
| Várias features abertas, uma por worktree, testando ao mesmo tempo | nada: a fila resolve | São 2 vagas por padrão; o que não couber espera. Se a espera virar recusa toda hora, `heavy.slots` sobe quando houver RAM. |
|
|
19
|
+
| Worktree sobrando ou fora do contêiner | `morph-spec doctor --worktrees` | Lista cada árvore com a razão; remova só por `worktree remove`. |
|
|
20
|
+
| A worktree precisa de arquivo fora do git (`.env`, segredos) | `.worktreeinclude` na raiz do repo | Um padrão por linha, sintaxe do gitignore. Copia só o que casa **e** é ignorado; nunca `node_modules`, build ou `.git`. O `setup` e o `provision` aplicam. |
|
|
21
|
+
| Editor pesado por causa das worktrees | `worktree.root` em `.morph/config/config.json` | Põe as worktrees fora da árvore aberta (caminho absoluto fora do projeto). `init` e `update` já gravam as exclusões no `.vscode/settings.json`. |
|
|
22
|
+
|
|
23
|
+
## A fila pega o seu build e o seu teste
|
|
24
|
+
|
|
25
|
+
`heavy.gateBash` vem ligado: antes de `dotnet build|test`, `npm test`, `vitest`, `docker compose up` e afins, um hook toma uma vaga da fila e a devolve depois. Sem vaga no prazo, a chamada é recusada com a causa: rode o mesmo comando de novo uma vez, ou siga sem ele. Projeto que prefere sem a fila: `"heavy": { "gateBash": false }` em `.morph/config/config.json` (pergunte ao usuário antes).
|
|
26
|
+
|
|
27
|
+
Limites: não cobre `run_in_background`, PowerShell nem comando fora da lista; uma chamada negada por regra ou interrompida segura a vaga até o timeout dela.
|
|
28
|
+
|
|
29
|
+
Referências: `.morph/framework/CLI.md` — `### heavy`, `### doctor --procs` e `### worktree.root`; MORPH.md §2.2 (worktrees).
|
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
name: morph-media
|
|
3
|
-
description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo trabalho, montar o prompt como spec versionada, encadear derivadas a partir de um herói aprovado, subir a escada de custo e conduzir o gate humano de escolha entre N candidatas. É o lado processo; o conhecimento de API, custo e conformidade vive nos standards de mídia.
|
|
4
|
-
version: core
|
|
5
|
-
when_to_use: Use quando a tarefa for PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisar decidir modelo, prompt e aprovação
|
|
6
|
-
user-invocable: true
|
|
7
|
-
cliVersion: "9.7.0"
|
|
8
|
-
stacks:
|
|
9
|
-
- dotnet
|
|
10
|
-
- nextjs
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# morph-media
|
|
14
|
-
|
|
1
|
+
# Mídia gerada por IA
|
|
15
2
|
## Objetivo
|
|
16
3
|
|
|
17
4
|
Conduzir a **autoria** de mídia gerada: a sequência de decisões humanas que vai de "precisamos de
|
|
@@ -66,65 +53,17 @@ Uma pergunta decide quase tudo: **existe um produto real a preservar?**
|
|
|
66
53
|
desligado não é preferência de estilo: é uma chamada que devolve erro depois de você ter escrito o
|
|
67
54
|
código inteiro em cima dela.
|
|
68
55
|
|
|
69
|
-
##
|
|
70
|
-
|
|
71
|
-
Prompt de produção é **template versionado**, nunca string concatenada. A ordem importa, e as duas
|
|
72
|
-
famílias de modelo concordam nela:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
cena/fundo → sujeito → detalhes-chave → restrições
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Seis regras que mudam o resultado mais do que qualquer outra coisa:
|
|
79
|
-
|
|
80
|
-
1. **Descreva em prosa, não em lista de keywords.** "beautiful, stunning, 4k, masterpiece" adiciona
|
|
81
|
-
ruído, não qualidade. Briefe como se briefasse um fotógrafo.
|
|
82
|
-
2. **Seja hiper-específico no sujeito.** "armadura de fantasia" produz genérico; "armadura élfica de
|
|
83
|
-
placas prateadas, gravada com folhas, gola alta, ombreiras em asa de falcão" produz uma imagem.
|
|
84
|
-
3. **Descreva em camadas** — primeiro plano, plano médio, fundo. Descrição plana produz imagem
|
|
85
|
-
plana; camadas produzem profundidade.
|
|
86
|
-
4. **Iluminação é a maior alavanca isolada de qualidade.** Sempre declare, com termos de fotografia,
|
|
87
|
-
e prefira **múltiplas fontes** com direções e temperaturas diferentes. Luz única e frontal é o
|
|
88
|
-
que faz uma imagem parecer amadora.
|
|
89
|
-
5. **Enquadre positivamente.** "rua deserta, completamente parada" funciona; "rua sem carros" não —
|
|
90
|
-
o modelo lida mal com negação.
|
|
91
|
-
6. **Contexto e finalidade entram no prompt.** "logo para uma marca de skincare minimalista premium"
|
|
92
|
-
decide melhor que "faça um logo".
|
|
56
|
+
## Passos 2 a 4 — Prompt, edição e encadeamento
|
|
93
57
|
|
|
94
|
-
|
|
95
|
-
comum dessa categoria — **confira lendo a imagem gerada** e corrija com uma edição pontual ("corrija
|
|
96
|
-
a grafia para 'X' exatamente; mantenha o resto"). Duas ou três iterações são normais.
|
|
58
|
+
O ofício mora no standard de imagem; abra só a seção do passo (`morph-spec standards --show <id>#<âncora>`):
|
|
97
59
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
|
103
|
-
|
|
104
|
-
|
|
|
105
|
-
| Erro típico | Prompt raso → imagem plana e genérica | Prompt longo → o modelo "re-imagina" tudo e o resultado fica artificial |
|
|
106
|
-
|
|
107
|
-
Padrões de edição que funcionam:
|
|
108
|
-
|
|
109
|
-
- **Acrescentar/remover:** uma frase. Não explique como integrar — o modelo faz isso bem quando você
|
|
110
|
-
não o sufoca.
|
|
111
|
-
- **Trocar o fundo:** diga o fundo novo e pare. Ele casa a iluminação sozinho.
|
|
112
|
-
- **Inpaint:** nomeie o que muda e o que fica. *"Troque o sofá azul por um chesterfield de couro
|
|
113
|
-
marrom. Mantenha o resto."*
|
|
114
|
-
- **"Preserve list" repetida em CADA iteração.** É o que impede o drift de acumular.
|
|
115
|
-
- **Uma mudança por vez.** Refinamentos em série, nunca em bloco.
|
|
116
|
-
- **Ao driftar, recomece** com a descrição completa em vez de empilhar correções.
|
|
117
|
-
|
|
118
|
-
## Passo 4 — Encadear a partir de um herói aprovado
|
|
119
|
-
|
|
120
|
-
A consistência não vem do prompt; vem da **referência**.
|
|
121
|
-
|
|
122
|
-
1. Gere e **aprove** o herói primeiro — a imagem que define paleta, luz e enquadramento.
|
|
123
|
-
2. Use o herói aprovado como **referência** das derivadas. Nunca gere as derivadas em paralelo com o
|
|
124
|
-
herói: elas herdam o erro que ainda não foi visto.
|
|
125
|
-
3. Indexe cada referência no prompt ("image 1 = o sofá; image 2 = o tecido") e diga como interagem.
|
|
126
|
-
4. Imagens que vão virar vídeo são enquadradas **sem rosto** — rosto derruba moderação, e o contorno
|
|
127
|
-
está em `ai-video-generation.md` §Section 3.
|
|
60
|
+
| Passo | Seção |
|
|
61
|
+
|---|---|
|
|
62
|
+
| Prompt como spec versionada: prosa, sujeito específico, camadas, luz, enquadrar no positivo, contexto | `frontend-design-system-ai-image-generation#narrative-style`, `#prompting-principles`, `#category-templates` |
|
|
63
|
+
| Texto dentro da imagem e proporção pelo destino | `#text-rendering`, `#aspect-ratio-guide` |
|
|
64
|
+
| Editar é o oposto de gerar (contenção, preserve list, uma mudança por vez) | `#iterative-editing-workflows` |
|
|
65
|
+
| Herói aprovado primeiro, derivadas por referência, várias referências | `#chain-from-an-approved-hero`, `#multi-image-composition` |
|
|
66
|
+
| Imagem que vira vídeo (sem rosto) | `#downstream-images-that-become-video` |
|
|
128
67
|
|
|
129
68
|
**O que a IA nunca recria:** render arquitetônico do cliente e foto real de produto. Esses são
|
|
130
69
|
animados ou editados a partir do arquivo real — recriá-los é inventar o que o cliente já tem.
|
|
@@ -210,6 +149,4 @@ trabalho de design". Tratar a saída como entregável vetorial é o erro clássi
|
|
|
210
149
|
|
|
211
150
|
## Referências
|
|
212
151
|
|
|
213
|
-
|
|
214
|
-
- Proveniência do conhecimento absorvido: `.morph/framework/standards/PROVENANCE.json`
|
|
215
|
-
(`morph-image`, `cinematic-lp`, `brand-design`).
|
|
152
|
+
Os cinco standards da tabela do topo: a fonte de API, custo, prazo, conformidade e do ofício do prompt.
|