@polymorphism-tech/morph-spec 8.28.0 â 8.31.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 +6 -1
- package/README.md +13 -2
- package/bin/morph-spec.js +48 -0
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +2 -0
- package/framework/MORPH.md +2 -1
- package/framework/agents.json +20 -9
- package/framework/commands/create-umbraco-lp.md +1 -1
- package/framework/commands/morph-status.md +1 -1
- package/framework/docs/CLI.md +18 -0
- package/framework/evals/rubrics/code-quality.md +17 -0
- package/framework/evals/rubrics/condensed.md +3 -1
- 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/phase-utils.js +2 -0
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/mcp/registry.json +97 -11
- package/framework/rubrics/backend.json +2 -2
- package/framework/rubrics/default.json +2 -2
- package/framework/rubrics/frontend.json +2 -2
- package/framework/schemas/tasks.schema.json +25 -0
- package/framework/skills/core/create-umbraco-lp/SKILL.md +13 -2
- package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +598 -0
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +92 -7
- package/framework/skills/core/morph-apply/SKILL.md +12 -3
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
- package/framework/skills/core/morph-implement/SKILL.md +12 -2
- package/framework/skills/core/morph-plan/SKILL.md +45 -3
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +11 -3
- package/framework/skills/core/morph-stack-scan/SKILL.md +13 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +1 -1
- package/framework/standards/PROVENANCE.json +41 -0
- package/framework/standards/STANDARDS.json +218 -7
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +231 -231
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/standards/frontend/design-system/ai-image-generation.md +43 -0
- package/framework/standards/frontend/design-system/ai-video-generation.md +113 -0
- package/framework/standards/frontend/design-system/premium-finish.md +160 -0
- package/framework/standards/frontend/gsap/gsap-core.md +1 -1
- package/framework/standards/frontend/gsap/gsap-plugins.md +1 -1
- package/framework/standards/frontend/gsap/gsap-scrolltrigger.md +3 -1
- package/framework/standards/frontend/nextjs/motion-patterns.md +3 -1
- package/framework/standards/frontend/scroll-driven/frame-scrub.md +287 -0
- package/framework/standards/frontend/scroll-driven/scroll-components.md +256 -0
- package/framework/standards/frontend/scroll-driven/smooth-scroll.md +148 -0
- package/framework/standards/frontend/seo/meta-schema-audit.md +134 -0
- 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/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- 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/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/context/ARCHITECTURE.md +20 -0
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- 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/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- 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/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- 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/project/validate.js +120 -120
- 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/dashboard/dashboard.js +53 -53
- package/src/commands/graph/affected.js +89 -0
- package/src/commands/graph/build.js +94 -0
- package/src/commands/graph/explain.js +96 -0
- package/src/commands/graph/status.js +93 -0
- package/src/commands/index.js +13 -13
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +11 -0
- package/src/core/paths/output-schema.js +7 -0
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +45 -4
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/graph/god-nodes.js +75 -0
- package/src/lib/graph/graph-health.js +61 -0
- package/src/lib/graph/graph-loader.js +86 -0
- package/src/lib/graph/graphify-runtime.js +100 -0
- package/src/lib/graph/graphifyignore.js +86 -0
- package/src/lib/graph/sanitize.js +280 -0
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- 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 +26 -0
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/reuse/index.js +10 -0
- package/src/lib/validators/reuse/reuse-validator.js +324 -0
- package/src/lib/validators/reuse/symbol-scanner.js +144 -0
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +40 -1
- package/src/scripts/setup-infra.js +60 -1
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +40 -0
- package/src/utils/skills-installer.js +187 -187
package/claude-plugin.json
CHANGED
package/docs/CHEATSHEET.md
CHANGED
package/docs/QUICKSTART.md
CHANGED
package/framework/CLAUDE.md
CHANGED
|
@@ -65,6 +65,8 @@ Se nÃŖo houver feature ativa, pergunte ao usuÃĄrio qual feature trabalhar.
|
|
|
65
65
|
| `fleet` | VisÃŖo agregada de toda feature ativa (raiz + worktrees) |
|
|
66
66
|
| `claim [f] [--release] [--list]` | Posse advisory â confirme antes de `finish`/`archive`/`delete` se outra sessÃŖo tiver claim vivo |
|
|
67
67
|
| `dag <f>` | DAG de `tasks.json`: sequencial/paralelo, recomenda isolamento |
|
|
68
|
+
| `graph status\|build\|refresh` | Grafo de codebase. `status` reporta frescor: o rebuild do hook Ê assÃncrono |
|
|
69
|
+
| `graph affected\|explain <sym>` | Blast radius e vizinhança saneados. Sem grafo, caia para grep â nunca Ê erro |
|
|
68
70
|
| `verify <f> [task] [--json]` | Build+testes+validadores+e2e, antes do juiz LLM |
|
|
69
71
|
| `e2e up\|status\|down <f>` | Stack de verificaÃ§ÃŖo (docker compose) |
|
|
70
72
|
| `doctor --worktrees [--prune]` | Reconcilia git à disco à features; sÃŗ `--prune` remove algo |
|
package/framework/MORPH.md
CHANGED
|
@@ -54,6 +54,7 @@ PadrÃĩes proibidos automaticamente injetados no mandate:
|
|
|
54
54
|
- Camada de Service/Manager entre handler e dados â o handler fala com o `ApplicationDbContext` direto, nunca com um service
|
|
55
55
|
- Repository genÊrico (`IRepository<T>`/`IUnitOfWork`) â redundante sobre EF Core: `DbSet<T>` jÃĄ Ê repository, `DbContext` jÃĄ Ê unit of work
|
|
56
56
|
- SQL cru (`FromSqlRaw`, `ExecuteQuery(string)`) sem justificativa em `decisions.md` â use LINQ
|
|
57
|
+
- Redeclarar tipo/componente que jÃĄ existe na mesma feature â `morph-spec graph explain <nome>` antes de criar (sem grafo: `grep -rn`); criar exige veredito `CRIAR` no `reuse-map.md`
|
|
57
58
|
|
|
58
59
|
Acesso a dados em VSA: `ApplicationDbContext` direto no slice (`DbSet<T>` jÃĄ Ê repository, `DbContext` jÃĄ Ê unit of work). ConcorrÃĒncia ou SQL especÃfico â store dedicado hand-written com justificativa em `decisions.md`.
|
|
59
60
|
|
|
@@ -264,7 +265,7 @@ Inline (sem dispatch) Ê aceitÃĄvel para tasks curtas (S/M) **dentro do domÃnio
|
|
|
264
265
|
|
|
265
266
|
**Mecanismo de dispatch:** agents de domÃnio sÃŖo subagents **registrados** (`.claude/agents/morph-{id}.md`, gerados de `agents.json` na instalaÃ§ÃŖo). Despache com `subagent_type: "morph-{id}"` (ex.: `morph-dotnet-senior`) â persona Ê o **system prompt**, tools/model/MCPs por domÃnio em `agents.json` (ex.: `context7` nos implementadores; Stitch/Gemini/Playwright no `morph-ui-designer`; `morph-evaluator` Ê read-only). **Fallback** (tipo nÃŖo registrado): `general-purpose` com `persona` colado no prompt, **registrado nas `notes` da task**. O `**Persona:**` do recap registra sempre o mecanismo real â nunca auto-declaraÃ§ÃŖo.
|
|
266
267
|
|
|
267
|
-
**Persona de estÃĄgio â scout:** `morph-scout` (read-only: Read/Glob/Grep/Bash somente-leitura). Despache para um mapa do territÃŗrio sem contaminar a thread principal â obrigatÃŗrio no inÃcio de um hotfix (root cause + blast radius), opcional antes do plan de uma feature grande. Devolve um mapa curto como relatÃŗrio final; nÃŖo escreve cÃŗdigo.
|
|
268
|
+
**Persona de estÃĄgio â scout:** `morph-scout` (read-only: Read/Glob/Grep/Bash somente-leitura). Começa por `morph-spec graph affected|explain` e cai para grep sozinho quando nÃŖo hÃĄ grafo. Despache para um mapa do territÃŗrio sem contaminar a thread principal â obrigatÃŗrio no inÃcio de um hotfix (root cause + blast radius), opcional antes do plan de uma feature grande (`morph-plan` §1b). Devolve um mapa curto como relatÃŗrio final; nÃŖo escreve cÃŗdigo.
|
|
268
269
|
|
|
269
270
|
**Passe ao sub-agent:** especificaÃ§ÃŖo da tarefa (tasks.json), path do standard relevante (sÃŗ um), arquivos a ler/modificar, critÊrio de done claro e verificÃĄvel.
|
|
270
271
|
|
package/framework/agents.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"mcp": ["context7"],
|
|
27
27
|
"model": "sonnet",
|
|
28
|
-
"persona": "VocÃĒ ÃŠ um engenheiro .NET sÃĒnior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> jÃĄ Ê repository, DbContext jÃĄ Ê unit of work); para concorrÃĒncia ou SQL especÃfico, store dedicado hand-written com justificativa em decisions.md; nunca uma camada de Service/Manager; nunca repository genÊrico (IRepository<T>/IUnitOfWork). NÃŖo usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parÃĸmetros."
|
|
28
|
+
"persona": "VocÃĒ ÃŠ um engenheiro .NET sÃĒnior. Pensa em VSA com handlers diretos, result pattern, sealed classes, Guid.CreateVersion7(). Acesso a dados: ApplicationDbContext injetado direto no slice (DbSet<T> jÃĄ Ê repository, DbContext jÃĄ Ê unit of work); para concorrÃĒncia ou SQL especÃfico, store dedicado hand-written com justificativa em decisions.md; nunca uma camada de Service/Manager; nunca repository genÊrico (IRepository<T>/IUnitOfWork). NÃŖo usa exceptions como fluxo. Consulta o standard antes de escrever cada slice. Nomeia tudo em PascalCase para tipos, camelCase para parÃĸmetros. REUSO ANTES DE CRIAR: antes de declarar record/class/interface novo, rode `morph-spec graph explain <Nome>` e `graph affected <Conceito> --uses-only` (sem grafo: `grep -rn`); se jÃĄ existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim diga por que em uma linha no relatÃŗrio da task."
|
|
29
29
|
},
|
|
30
30
|
"ef-modeler": {
|
|
31
31
|
"title": "EF Core / Database Modeler",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
],
|
|
45
45
|
"mcp": ["context7"],
|
|
46
46
|
"model": "sonnet",
|
|
47
|
-
"persona": "VocÃĒ ÃŠ um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explÃcitas, configuraçÃĩes fluentes, navigation properties bem nomeadas, Ãndices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler."
|
|
47
|
+
"persona": "VocÃĒ ÃŠ um especialista em EF Core sobre Neon (Postgres). Pensa em migrations explÃcitas, configuraçÃĩes fluentes, navigation properties bem nomeadas, Ãndices intencionais. Sempre Guid.CreateVersion7() para PKs. Sealed entities. Nunca leak de DbContext fora do handler. REUSO ANTES DE CRIAR: antes de declarar entidade, configuraÃ§ÃŖo ou value object novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) â entidade duplicada vira migration divergente; se criar mesmo assim, justifique em uma linha no relatÃŗrio da task."
|
|
48
48
|
},
|
|
49
49
|
"maf-expert": {
|
|
50
50
|
"title": "Microsoft Agent Framework Expert",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
],
|
|
71
71
|
"mcp": ["context7"],
|
|
72
72
|
"model": "sonnet",
|
|
73
|
-
"persona": "VocÃĒ ÃŠ especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) â nunca hosted agent service. NÃŖo usa Semantic Kernel nem Workflows como default â sÃŗ quando fan-in/out genuÃno aparece. Telemetria via AgentOpenTelemetryConsts.DefaultSourceName."
|
|
73
|
+
"persona": "VocÃĒ ÃŠ especialista no Microsoft Agent Framework (MAF 1.0 GA). Aplica a regra do sweet-spot: single-agent + structured output + tools + RAG custom resolvem 95%. Refere alias do Model Registry, nunca model hardcoded. Provider-agnostic, direct models sempre (OpenAI/Google/Anthropic/Ollama) â nunca hosted agent service. NÃŖo usa Semantic Kernel nem Workflows como default â sÃŗ quando fan-in/out genuÃno aparece. Telemetria via AgentOpenTelemetryConsts.DefaultSourceName. REUSO ANTES DE CRIAR: antes de escrever tool, contrato ou serviço de agente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`); se jÃĄ existe algo que cobre o caso, reuse ou estenda, e se criar mesmo assim justifique em uma linha no relatÃŗrio da task."
|
|
74
74
|
},
|
|
75
75
|
"nextjs-expert": {
|
|
76
76
|
"title": "Next.js / React Expert",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
],
|
|
93
93
|
"mcp": ["context7"],
|
|
94
94
|
"model": "sonnet",
|
|
95
|
-
"persona": "VocÃĒ escreve Next.js App Router idiomÃĄtico. Server Components por padrÃŖo, Client Components apenas quando hÃĄ interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido."
|
|
95
|
+
"persona": "VocÃĒ escreve Next.js App Router idiomÃĄtico. Server Components por padrÃŖo, Client Components apenas quando hÃĄ interatividade real. Tailwind + Shadcn + Framer Motion. Tipos via Zod. Nada de getServerSideProps. RSC streaming quando faz sentido. REUSO ANTES DE CRIAR: antes de declarar tipo, hook ou componente novo, rode `morph-spec graph explain <Nome>` (sem grafo: `grep -rn`) â o tipo local redeclarado em cada arquivo Ê o defeito mais comum aqui; reuse ou estenda o que existe, e se criar mesmo assim justifique em uma linha no relatÃŗrio da task."
|
|
96
96
|
},
|
|
97
97
|
"ui-designer": {
|
|
98
98
|
"title": "UI/UX Designer",
|
|
@@ -101,18 +101,29 @@
|
|
|
101
101
|
"domains": ["ui", "ux", "design-system", "accessibility"],
|
|
102
102
|
"keywords": [
|
|
103
103
|
"design", "ui", "ux", "design system", "tokens", "wcag",
|
|
104
|
-
"accessibility", "mockup", "flow", "shadcn", "tailwind"
|
|
104
|
+
"accessibility", "mockup", "flow", "shadcn", "tailwind",
|
|
105
|
+
"motion", "scroll", "scrub", "gsap", "lenis", "seo"
|
|
105
106
|
],
|
|
106
107
|
"stack": ["*"],
|
|
107
108
|
"standards": [
|
|
108
109
|
"frontend-design-system-naming",
|
|
109
110
|
"frontend-design-system-animations",
|
|
110
|
-
"frontend-nextjs-motion-patterns"
|
|
111
|
+
"frontend-nextjs-motion-patterns",
|
|
112
|
+
"frontend-design-system-premium-finish",
|
|
113
|
+
"frontend-design-system-ai-image-generation",
|
|
114
|
+
"frontend-design-system-ai-video-generation",
|
|
115
|
+
"frontend-scroll-driven-frame-scrub",
|
|
116
|
+
"frontend-scroll-driven-smooth-scroll",
|
|
117
|
+
"frontend-scroll-driven-scroll-components",
|
|
118
|
+
"frontend-seo-meta-schema-audit",
|
|
119
|
+
"frontend-gsap-core",
|
|
120
|
+
"frontend-gsap-scrolltrigger",
|
|
121
|
+
"frontend-gsap-plugins"
|
|
111
122
|
],
|
|
112
123
|
"tools": "Read, Write, Edit, Glob, Grep",
|
|
113
|
-
"mcp": ["context7", "stitch", "gemini-image", "playwright"],
|
|
124
|
+
"mcp": ["context7", "stitch", "gemini-image", "playwright", "seedance"],
|
|
114
125
|
"model": "sonnet",
|
|
115
|
-
"persona": "VocÃĒ desenha sistemas, nÃŖo telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizÃĄveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediÃĄrio."
|
|
126
|
+
"persona": "VocÃĒ desenha sistemas, nÃŖo telas isoladas. Pensa em tokens (cor, espaço, tipografia), componentes reutilizÃĄveis, estados (default/hover/focus/disabled/loading/error), acessibilidade WCAG AA. Mockups em Tailwind direto, sem Figma intermediÃĄrio. REUSO ANTES DE CRIAR: componente reutilizÃĄvel se BUSCA antes de se escrever â rode `morph-spec graph explain <Nome>` e confira `.morph/context/design-system.md` (sem grafo: `grep -rn`); criar um novo exige justificativa em uma linha no relatÃŗrio da task, a mesma regra que jÃĄ vale para token de design."
|
|
116
127
|
},
|
|
117
128
|
"infra-engineer": {
|
|
118
129
|
"title": "Infrastructure / Jobs Engineer",
|
|
@@ -159,7 +170,7 @@
|
|
|
159
170
|
"standards": [],
|
|
160
171
|
"tools": "Read, Glob, Grep, Bash",
|
|
161
172
|
"model": "haiku",
|
|
162
|
-
"persona": "VocÃĒ ÃŠ um scout read-only: mapeia o territÃŗrio sem escrever cÃŗdigo. Dado um sintoma ou uma feature, localiza os arquivos relevantes, o root cause provÃĄvel e o blast radius (o que mais Ê afetado).
|
|
173
|
+
"persona": "VocÃĒ ÃŠ um scout read-only: mapeia o territÃŗrio sem escrever cÃŗdigo. Dado um sintoma ou uma feature, localiza os arquivos relevantes, o root cause provÃĄvel e o blast radius (o que mais Ê afetado).\n\nCOMECE PELO GRAFO, nÃŖo pelo grep. `morph-spec graph affected <sÃmbolo> --json` dÃĄ o blast radius; `morph-spec graph explain <sÃmbolo> --json` dÃĄ a vizinhança com arquivo:linha. Contra o grep isso Ê 58% menos ruÃdo e, principalmente, classifica a relaÃ§ÃŖo: 20 tipos podem IMPLEMENTAR uma interface enquanto sÃŗ 2 a USAM, e Ê essa diferença que decide se dÃĄ para mexer. Use `--uses-only` quando a pergunta for \"quem realmente usa\" e `--prod` para ignorar consumidores em projeto de teste.\n\nFALLBACK OBRIGATÃRIO: se o comando devolver `no-graph`, `not-found` ou `ambiguous`, caia para Read/Glob/Grep e siga normalmente â o grafo Ê um subconjunto do grep, entÃŖo nunca perde arquivo que o grep acharia. Diga no seu mapa qual caminho vocÃĒ usou. Nunca trate ausÃĒncia de grafo como impedimento.\n\nDUAS RESSALVAS que mudam a leitura do resultado: (1) o grafo pode estar STALE, porque o rebuild do hook roda em background â logo depois de um commit ele ainda Ê o anterior; confirme no cÃŗdigo antes de afirmar que algo NÃO tem consumidor, que Ê justamente a conclusÃŖo perigosa antes de um hotfix. (2) Em frontend o grafo Ê estrutura de mÃŗdulos, nÃŖo call graph: ali o blast radius responde QUEM IMPORTA, nÃŖo quem chama. Em backend responde quem chama.\n\nUsa Read/Glob/Grep e Bash SOMENTE-LEITURA (morph-spec graph, git log/diff/show, ls, cat) â nunca Write/Edit, nunca comandos que mudam estado. Devolve um mapa curto e acionÃĄvel (arquivos com paths, hipÃŗtese de causa, ÃĄreas de impacto) como relatÃŗrio final e encerra. NÃŖo implementa, nÃŖo corrige â ilumina o caminho para quem vai."
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
176
|
}
|
|
@@ -30,6 +30,6 @@ Cria um projeto de landing page novo a partir do template canônico `MORPH_Umbra
|
|
|
30
30
|
## ReferÃĒncias
|
|
31
31
|
|
|
32
32
|
- `.claude/skills/create-umbraco-lp/SKILL.md`
|
|
33
|
-
- `
|
|
33
|
+
- `references/umbraco-lp-patterns.md` (dentro da skill `create-umbraco-lp`)
|
|
34
34
|
|
|
35
35
|
**Projeto:** $ARGUMENTS
|
|
@@ -29,7 +29,7 @@ If the user did not pass a feature name in `$ARGUMENTS`:
|
|
|
29
29
|
## What you display
|
|
30
30
|
|
|
31
31
|
The CLI prints a banner, the phase chain (`proposal â uiux â plan â implement â review`),
|
|
32
|
-
output completion (X/
|
|
32
|
+
output completion (X/N outputs), task progress, and next-step suggestions.
|
|
33
33
|
|
|
34
34
|
After running the CLI, summarize:
|
|
35
35
|
- Current phase and which gate (if any) is open
|
package/framework/docs/CLI.md
CHANGED
|
@@ -39,6 +39,24 @@
|
|
|
39
39
|
- **`morph-spec doctor --worktrees [--prune] [--json]`** â reconcilia o registro do git à as pastas em disco à as features conhecidas. Worktrees ÃŗrfÃŖos acumulavam **invisÃveis**: o `fleet` sÃŗ reporta worktrees em branch `morph/*`, entÃŖo um worktree em outra branch (resÃduo de finish anterior) nÃŖo aparecia em lugar nenhum. `--prune` roda o Ãēnico reparo seguro (`git worktree prune` â registros de pastas que jÃĄ sumiram) **e** limpa o registro `worktree` de qualquer feature cujo `.path` aponte para um desses diretÃŗrios jÃĄ sumidos (`dangling-registration` â a direÃ§ÃŖo simÊtrica do `no-feature`: nÃŖo Ê o worktree sem feature, Ê a feature com um ponteiro morto na raiz); apagar pasta que ainda existe Ê reportado com o comando exato, nunca executado.
|
|
40
40
|
- **`morph-spec report-check <feature> [task] [--json]`** â audita os relatÃŗrios de sub-agent contra o trabalho que realmente entrou. **RelatÃŗrio ausente NÃO quer dizer que o agente falhou** â ele pode ter feito tudo e perdido o meio de gravar. E relatÃŗrio PRESENTE nÃŖo basta: `report-stale` Ê o relatÃŗrio completo porÊm gravado ANTES do fim do trabalho (o agente relatou cedo e continuou escrevendo) â completo e mentindo. O comando responde a pergunta certa (`work-landed-report-missing` â aceite degradado, NÃO re-despache; `no-work-no-report` â re-despache uma vez; `report-stale` â atualize a partir do campo `observed`, NÃO re-despache). A evidÃĒncia de `observed` vem do `events.jsonl` (todo `Write`/`Edit` observado na janela da task, cruzada com `task-times.json`), nÃŖo de `outputs`, que Ê auto-declarado pelo prÃŗprio agente â writes do orquestrador sob `.morph/` e o do prÃŗprio relatÃŗrio sÃŖo excluÃdos. Sem telemetria no projeto, o comando volta ao comportamento anterior (fail-open). Protocolo completo em MORPH.md §6.
|
|
41
41
|
|
|
42
|
+
## Grafo de codebase
|
|
43
|
+
|
|
44
|
+
Grafo de sÃmbolos extraÃdo localmente pelo [graphify](https://pypi.org/project/graphifyy/) (versÃŖo pinada **0.9.50**, AST via tree-sitter, **zero token**), servido atrÃĄs de uma camada de saneamento prÃŗpria. **Tudo Ê fail-open:** sem Python, sem grafo, com grafo velho ou corrompido, o framework segue por grep â Ê assim que ele sempre funcionou, e nenhuma skill pode exigir o grafo (ADR-002).
|
|
45
|
+
|
|
46
|
+
O ganho medido **nÃŖo Ê recall**: contra o grep, o grafo nÃŖo achou um Ãēnico arquivo a mais. à precisÃŖo â em 12 sÃmbolos do ProspectPRO, o grep aponta 1.092 arquivos onde existem 266 usos reais (58% de ruÃdo), e o grafo ainda diz *que tipo* de relaÃ§ÃŖo Ê cada um. `IHandler` aparece em 193 arquivos no grep e tem **2** usos reais: Ê implementada por 98.
|
|
47
|
+
|
|
48
|
+
**Por que nÃŖo consumir o graphify cru.** O resolvedor C# dele nÃŖo implementa escopo hierÃĄrquico de namespace, entÃŖo um tipo usado por um namespace filho sem `using` explÃcito vira um *stub* por arquivo â e o blast radius do sÃmbolo real devolve **zero** consumidores onde existem dois. Falso negativo silencioso Ê o pior modo de falha possÃvel antes de um hotfix. A camada de saneamento coalesce esses stubs (+91,9% de arestas de uso recuperadas no MORPH_GHLBrain), trata como externo sÃŗ o que **nÃŖo tem nenhum** nÃŗ com arquivo (BCL/NuGet), e devolve as opçÃĩes quando o sÃmbolo Ê genuinamente ambÃguo em vez de escolher por conta prÃŗpria.
|
|
49
|
+
|
|
50
|
+
- **`morph-spec graph status [-p <path>] [--json]`** â existÃĒncia, tamanho, **frescor** e saÃēde do saneamento. Grafo ausente **sai 0**, nÃŖo 1: nÃŖo ter grafo Ê um estado vÃĄlido do projeto. O frescor compara o `built_at_commit` gravado no `graph.json` com o `HEAD` â e importa porque o hook `post-commit` do graphify rebuilda **em background**: logo depois de um commit, o grafo ainda Ê o do commit anterior. `--json` devolve `{ available, path, nodes, links, freshness: {state}, version: {installed, pinned, matches}, sanitize: {coalescible, external, ambiguous} }`.
|
|
51
|
+
- **`morph-spec graph build [-p <path>] [--json]`** â extraÃ§ÃŖo completa (`graphify extract --code-only`). Gera o `.graphifyignore` stack-aware antes de extrair, porque um grafo que nasce com o ruÃdo dentro nÃŖo se conserta depois. Projeto **sem nenhum arquivo de cÃŗdigo** (o caso de um `init` recÊm-feito) sai **0** com aviso, nÃŖo erro. Sem graphify no PATH: exit 1 com `reason: graphify-unavailable` e o comando de instalaÃ§ÃŖo â nunca stack trace.
|
|
52
|
+
- **`morph-spec graph refresh [-p <path>] [--json]`** â atualizaÃ§ÃŖo incremental (`graphify update`), 2 a 3à mais rÃĄpida que o build graças ao cache por hash de conteÃēdo.
|
|
53
|
+
- **`morph-spec graph affected <sÃmbolo> [--prod] [--uses-only] [-p <path>] [--json]`** â blast radius saneado. `--uses-only` exclui `inherits`/`implements`/`extends`, que Ê o que separa *"20 implementam"* de *"2 usam"*; `--prod` descarta consumidores em projeto de teste. Erros sÃŖo estados, nÃŖo exceçÃĩes: `no-graph`, `not-found` e `ambiguous` (este devolvendo as opçÃĩes com path e id) saem 1 com a dica de fallback para grep.
|
|
54
|
+
- **`morph-spec graph explain <sÃmbolo> [-p <path>] [--json]`** â vizinhança com citaÃ§ÃŖo `arquivo:linha`, separando quem depende dele de do que ele depende. **Prefira `explain` a `query`** nas personas: no eval, `explain` foi consistentemente mais preciso, enquanto `query` trunca por budget e traz ruÃdo. Cada aresta traz a procedÃĒncia em `via` (`direct`, `coalesced`, `language-disambiguated`), entÃŖo dÃĄ para ver exatamente o que o saneamento recuperou.
|
|
55
|
+
|
|
56
|
+
**O que o resultado significa muda com a stack.** Em backend, blast radius Ê *quem chama*. Em frontend, o grafo Ê estrutura de mÃŗdulos e nÃŖo call graph (`imports: 78` contra `calls: 3` no LP_Polymorphism), entÃŖo ali ele responde *quem importa*. Ler um como o outro leva a conclusÃŖo errada, e Ê por isso que as personas dizem isso no prÃŗprio texto.
|
|
57
|
+
|
|
58
|
+
O servidor MCP (`graphify-mcp`, 10 tools, todas aceitando `project_path`) estÃĄ registrado em `framework/mcp/registry.json` para exploraÃ§ÃŖo interativa e consulta cross-repo â mas ele devolve o grafo **cru**, sem saneamento. Para qualquer decisÃŖo, prefira os comandos acima.
|
|
59
|
+
|
|
42
60
|
## Observabilidade
|
|
43
61
|
|
|
44
62
|
- **`morph-spec telemetry [--json] [--feature <f>] [--limit <n>]`** â reconstrÃŗi o caminho de execuÃ§ÃŖo da sessÃŖo a partir de `.morph/logs/events.jsonl` (skills invocadas, personas despachadas + prompts, standards/base de conhecimento lidos, mix de tools, prompts do usuÃĄrio). Capturado silenciosamente pelo hook `telemetry-log` em todo tool call e todo UserPromptSubmit.
|
|
@@ -8,6 +8,7 @@ Avalia naming, ausÃĒncia de code smells e aderÃĒncia aos padrÃĩes do stack do pr
|
|
|
8
8
|
- FunçÃĩes com responsabilidade Ãēnica: cada funÃ§ÃŖo faz uma coisa e tem no mÃĄximo 20-25 linhas.
|
|
9
9
|
- Classes com responsabilidade Ãēnica: coesas, sem mistura de concerns.
|
|
10
10
|
- Zero duplicaÃ§ÃŖo Ãŗbvia â lÃŗgica repetida foi extraÃda.
|
|
11
|
+
- **Nada do que foi criado aqui jÃĄ existia no projeto**: os conceitos novos batem com o veredito do `reuse-map.md`, e cada `CRIAR` tem justificativa que se sustenta.
|
|
11
12
|
- Segue os padrÃĩes do stack conforme os standards do projeto (ex: Result pattern para .NET, hooks pattern para React).
|
|
12
13
|
- Sem "dead code" â sem variÃĄveis nÃŖo usadas, sem blocos comentados, sem imports desnecessÃĄrios.
|
|
13
14
|
|
|
@@ -16,6 +17,7 @@ Avalia naming, ausÃĒncia de code smells e aderÃĒncia aos padrÃĩes do stack do pr
|
|
|
16
17
|
- Nomes claros na maioria dos casos, com raras abreviaçÃĩes nÃŖo Ãŗbvias.
|
|
17
18
|
- FunçÃĩes e classes bem dimensionadas com poucos casos acima do ideal.
|
|
18
19
|
- DuplicaÃ§ÃŖo mÃnima e pontual.
|
|
20
|
+
- No mÃĄximo um conceito recriado que jÃĄ existia no codebase, com impacto pequeno e localizado.
|
|
19
21
|
- Segue padrÃĩes do stack com desvios isolados e justificÃĄveis.
|
|
20
22
|
- Sem dead code significativo.
|
|
21
23
|
|
|
@@ -24,6 +26,7 @@ Avalia naming, ausÃĒncia de code smells e aderÃĒncia aos padrÃĩes do stack do pr
|
|
|
24
26
|
- Alguns nomes genÊricos ou pouco descritivos (`data`, `result`, `temp`).
|
|
25
27
|
- FunçÃĩes longas (>30 linhas) ou com mÃēltiplas responsabilidades.
|
|
26
28
|
- DuplicaÃ§ÃŖo perceptÃvel que aumenta custo de manutenÃ§ÃŖo.
|
|
29
|
+
- Um ou dois tipos/componentes recriados que jÃĄ existiam em outro arquivo do projeto.
|
|
27
30
|
- Desvios dos padrÃĩes do stack sem justificativa.
|
|
28
31
|
- Dead code pontual.
|
|
29
32
|
|
|
@@ -32,6 +35,7 @@ Avalia naming, ausÃĒncia de code smells e aderÃĒncia aos padrÃĩes do stack do pr
|
|
|
32
35
|
- Nomes que exigem contexto externo para entender o que representam.
|
|
33
36
|
- FunçÃĩes com >50 linhas ou classes com >200 linhas sem coesÃŖo.
|
|
34
37
|
- DuplicaÃ§ÃŖo significativa: mesma lÃŗgica em mÃēltiplos lugares.
|
|
38
|
+
- Conceito central do domÃnio redeclarado na MESMA feature (o caso `SimpleBuilding`: cinco cÃŗpias na mesma pasta, uma jÃĄ divergindo do resto).
|
|
35
39
|
- NÃŖo segue os padrÃĩes do stack â cÃŗdigo parece escrito para outro contexto.
|
|
36
40
|
|
|
37
41
|
## Score 1-2 â Reprovado
|
|
@@ -39,12 +43,25 @@ Avalia naming, ausÃĒncia de code smells e aderÃĒncia aos padrÃĩes do stack do pr
|
|
|
39
43
|
- Nomes arbitrÃĄrios ou gerados automaticamente sem semÃĸntica.
|
|
40
44
|
- FunçÃĩes/classes sem separaÃ§ÃŖo de responsabilidades â "god objects".
|
|
41
45
|
- DuplicaÃ§ÃŖo massiva ou copy-paste evidente.
|
|
46
|
+
- Ignora por completo o que o projeto jÃĄ tem: o `reuse-map.md` mandou REUSAR e o cÃŗdigo criou do zero.
|
|
42
47
|
- Completamente fora dos padrÃĩes do stack â exige reescrita.
|
|
43
48
|
|
|
49
|
+
> **O escopo desta dimensÃŖo Ê o CODEBASE, nÃŖo sÃŗ o diff.** "DuplicaÃ§ÃŖo" lÃĒ-se
|
|
50
|
+
> naturalmente como repetiÃ§ÃŖo *dentro do que foi escrito* â e foi assim que
|
|
51
|
+
> `SimpleBuilding` foi redefinido cinco vezes na mesma pasta do ProspectPRO sem
|
|
52
|
+
> que nenhuma avaliaÃ§ÃŖo pegasse: cada diff, sozinho, parecia limpo. Antes de
|
|
53
|
+
> pontuar, pergunte de fora do diff. Ferramentas: o `reuse-map.md` da feature
|
|
54
|
+
> (`2-plan/reuse-map.md`) diz o que o plano decidiu; `morph-spec graph explain
|
|
55
|
+
> <sÃmbolo>` diz o que existe de fato (**sem grafo: `grep -rn "<sÃmbolo>"`**);
|
|
56
|
+
> o nÃŗ `validators` do `morph-spec verify` jÃĄ traz os achados do validador
|
|
57
|
+
> `reuse`. Um sÃmbolo criado contra um veredito `REUSAR` Ê achado desta
|
|
58
|
+
> dimensÃŖo, mesmo que o cÃŗdigo esteja impecÃĄvel por dentro.
|
|
59
|
+
|
|
44
60
|
## Perguntas de avaliaÃ§ÃŖo
|
|
45
61
|
|
|
46
62
|
1. à possÃvel entender o que uma funÃ§ÃŖo faz apenas pelo seu nome e assinatura?
|
|
47
63
|
2. Alguma funÃ§ÃŖo tem mais de 30 linhas ou mais de uma responsabilidade clara?
|
|
48
64
|
3. HÃĄ lÃŗgica duplicada que poderia ser extraÃda?
|
|
65
|
+
3b. **O que foi criado aqui jÃĄ existia no projeto?** Confira os tipos, componentes, hooks e serviços novos contra o `reuse-map.md` e contra o grafo â e diga no relatÃŗrio o que vocÃĒ conferiu.
|
|
49
66
|
4. O cÃŗdigo segue os padrÃĩes definidos nos standards do projeto?
|
|
50
67
|
5. HÃĄ variÃĄveis nÃŖo usadas, imports desnecessÃĄrios ou blocos comentados?
|
|
@@ -30,9 +30,11 @@ Se o diff toca endpoint minimal API ou fetch cross-camada, independente do resto
|
|
|
30
30
|
|---|---|---|---|---|
|
|
31
31
|
| **Arquitetura** | Ignora a arquitetura do spec.md; sem feature folder; deps circulares; ou violaÃ§ÃŖo mecÃĸnica acima | Pastas corretas, responsabilidades se misturam; deps cross-feature sem justificativa; domain acoplado a infra | Desvios menores justificados; deps cross-feature via abstraÃ§ÃŖo; impurezas de infra pontuais | Feature folder rigoroso; zero deps cross-feature diretas; domain isolado; DI onde exige |
|
|
32
32
|
| **Contratos** | Sem tipos ou `any` generalizado; zero validaÃ§ÃŖo; sem tratamento de erro; naming arbitrÃĄrio | `any`/genÊrico visÃvel; validaÃ§ÃŖo parcial; mix exceptions/Result; naming inconsistente | Tipos bem definidos, `any` raro e justificado; validaÃ§ÃŖo na maioria; erro consistente | Zero `any`; validaÃ§ÃŖo em todos endpoints; Result pattern/discriminated union; naming consistente |
|
|
33
|
-
| **Qualidade** | Nomes arbitrÃĄrios; god objects; duplicaÃ§ÃŖo massiva; fora do padrÃŖo do stack | Nomes genÊricos (`data`,`temp`); funçÃĩes >30 linhas; duplicaÃ§ÃŖo perceptÃvel | Nomes claros, raras exceçÃĩes; bem dimensionado; duplicaÃ§ÃŖo mÃnima | Nomes comunicam intenÃ§ÃŖo; funçÃĩes â¤20-25 linhas, 1 responsabilidade; zero duplicaÃ§ÃŖo/dead code |
|
|
33
|
+
| **Qualidade** | Nomes arbitrÃĄrios; god objects; duplicaÃ§ÃŖo massiva; recria o que o `reuse-map` mandou REUSAR; fora do padrÃŖo do stack | Nomes genÊricos (`data`,`temp`); funçÃĩes >30 linhas; duplicaÃ§ÃŖo perceptÃvel; conceito da MESMA feature redeclarado | Nomes claros, raras exceçÃĩes; bem dimensionado; duplicaÃ§ÃŖo mÃnima; no mÃĄximo um conceito recriado | Nomes comunicam intenÃ§ÃŖo; funçÃĩes â¤20-25 linhas, 1 responsabilidade; zero duplicaÃ§ÃŖo/dead code; nada criado que jÃĄ existia no projeto |
|
|
34
34
|
| **Testes** | Sem testes ou sem asserts reais; zero edge case; nomes genÊricos | Happy path OK, edge cases parciais; erros sÃŗ Ãŗbvios; testes interdependentes | Happy path completo; maioria dos edge cases; erros nos fluxos principais | Toda pÃŗs-condiÃ§ÃŖo do `usecase` tem teste; A1/A2 cobertos; edge+erro cobertos; isolados |
|
|
35
35
|
|
|
36
|
+
> **Qualidade olha o CODEBASE, nÃŖo sÃŗ o diff.** SÃmbolo novo cujo nome jÃĄ existe no projeto nÃŖo aparece no diff â Ê preciso perguntar de fora dele. O nÃŗ `validators` do `morph-spec verify` jÃĄ traz os achados do validador `reuse`; o `2-plan/reuse-map.md` diz o que o plano decidiu por conceito.
|
|
37
|
+
|
|
36
38
|
> Task com `usecase: UC-nn`: pÃŗs-condiÃ§ÃŖo sem teste **impede a faixa 9-10** em Testes, mesmo com o resto da suÃte completo (herdado de `test-coverage.md`).
|
|
37
39
|
|
|
38
40
|
## Score composto
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# morph-spec statusline â installed globally to ~/.claude/statusline.sh
|
|
3
|
-
# Claude Code invokes this with JSON via stdin after each response.
|
|
4
|
-
# Requires: Python 3 available as `python3` or `python` on PATH.
|
|
5
|
-
|
|
6
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
-
if command -v python3 &>/dev/null; then
|
|
8
|
-
python3 "${SCRIPT_DIR}/statusline.py" 2>/dev/null || true
|
|
9
|
-
elif command -v python &>/dev/null; then
|
|
10
|
-
python "${SCRIPT_DIR}/statusline.py" 2>/dev/null || true
|
|
11
|
-
fi
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# morph-spec statusline â installed globally to ~/.claude/statusline.sh
|
|
3
|
+
# Claude Code invokes this with JSON via stdin after each response.
|
|
4
|
+
# Requires: Python 3 available as `python3` or `python` on PATH.
|
|
5
|
+
|
|
6
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
if command -v python3 &>/dev/null; then
|
|
8
|
+
python3 "${SCRIPT_DIR}/statusline.py" 2>/dev/null || true
|
|
9
|
+
elif command -v python &>/dev/null; then
|
|
10
|
+
python "${SCRIPT_DIR}/statusline.py" 2>/dev/null || true
|
|
11
|
+
fi
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Scope: universal | Validates commit message format (Conventional Commits)
|
|
3
|
-
# MORPH-SPEC Commit Message Hook
|
|
4
|
-
# Enforces Conventional Commits specification
|
|
5
|
-
|
|
6
|
-
COMMIT_MSG_FILE="$1"
|
|
7
|
-
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
|
|
8
|
-
|
|
9
|
-
# Conventional Commits pattern: type(scope): description
|
|
10
|
-
# Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert
|
|
11
|
-
PATTERN="^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\(.+\))?: .{1,100}"
|
|
12
|
-
|
|
13
|
-
if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
|
|
14
|
-
echo "â Invalid commit message format!"
|
|
15
|
-
echo ""
|
|
16
|
-
echo "Required format: <type>(<scope>): <description>"
|
|
17
|
-
echo ""
|
|
18
|
-
echo "Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert"
|
|
19
|
-
echo ""
|
|
20
|
-
echo "Examples:"
|
|
21
|
-
echo " feat(auth): add JWT refresh token rotation"
|
|
22
|
-
echo " fix(api): resolve null reference in UserService"
|
|
23
|
-
echo " docs(readme): update installation instructions"
|
|
24
|
-
echo ""
|
|
25
|
-
echo "Your message:"
|
|
26
|
-
echo " $COMMIT_MSG"
|
|
27
|
-
echo ""
|
|
28
|
-
echo "Override with: git commit --no-verify"
|
|
29
|
-
exit 1
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
echo "â
Commit message format valid"
|
|
33
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Scope: universal | Validates commit message format (Conventional Commits)
|
|
3
|
+
# MORPH-SPEC Commit Message Hook
|
|
4
|
+
# Enforces Conventional Commits specification
|
|
5
|
+
|
|
6
|
+
COMMIT_MSG_FILE="$1"
|
|
7
|
+
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
|
|
8
|
+
|
|
9
|
+
# Conventional Commits pattern: type(scope): description
|
|
10
|
+
# Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert
|
|
11
|
+
PATTERN="^(feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(\(.+\))?: .{1,100}"
|
|
12
|
+
|
|
13
|
+
if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
|
|
14
|
+
echo "â Invalid commit message format!"
|
|
15
|
+
echo ""
|
|
16
|
+
echo "Required format: <type>(<scope>): <description>"
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci, revert"
|
|
19
|
+
echo ""
|
|
20
|
+
echo "Examples:"
|
|
21
|
+
echo " feat(auth): add JWT refresh token rotation"
|
|
22
|
+
echo " fix(api): resolve null reference in UserService"
|
|
23
|
+
echo " docs(readme): update installation instructions"
|
|
24
|
+
echo ""
|
|
25
|
+
echo "Your message:"
|
|
26
|
+
echo " $COMMIT_MSG"
|
|
27
|
+
echo ""
|
|
28
|
+
echo "Override with: git commit --no-verify"
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
echo "â
Commit message format valid"
|
|
33
|
+
exit 0
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Scope: universal | Validates agents.json Schema
|
|
3
|
-
# MORPH-SPEC Pre-Commit Hook: Agent Configuration Validation
|
|
4
|
-
# Uses validate-agents.js to check agents.json
|
|
5
|
-
|
|
6
|
-
echo "đ¤ Validating agent configuration..."
|
|
7
|
-
|
|
8
|
-
# Check if agents.json is being modified
|
|
9
|
-
if git diff --cached --name-only | grep -q 'agents\.json$'; then
|
|
10
|
-
echo "Detected changes to agents.json"
|
|
11
|
-
|
|
12
|
-
# Run validator
|
|
13
|
-
if ! morph-spec validate-agents-skills; then
|
|
14
|
-
echo ""
|
|
15
|
-
echo "â COMMIT BLOCKED: agents.json validation failed"
|
|
16
|
-
echo " Fix errors above before committing"
|
|
17
|
-
exit 1
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
echo "â agents.json is valid"
|
|
21
|
-
else
|
|
22
|
-
echo "â No changes to agents.json"
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
exit 0
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Scope: universal | Validates agents.json Schema
|
|
3
|
+
# MORPH-SPEC Pre-Commit Hook: Agent Configuration Validation
|
|
4
|
+
# Uses validate-agents.js to check agents.json
|
|
5
|
+
|
|
6
|
+
echo "đ¤ Validating agent configuration..."
|
|
7
|
+
|
|
8
|
+
# Check if agents.json is being modified
|
|
9
|
+
if git diff --cached --name-only | grep -q 'agents\.json$'; then
|
|
10
|
+
echo "Detected changes to agents.json"
|
|
11
|
+
|
|
12
|
+
# Run validator
|
|
13
|
+
if ! morph-spec validate-agents-skills; then
|
|
14
|
+
echo ""
|
|
15
|
+
echo "â COMMIT BLOCKED: agents.json validation failed"
|
|
16
|
+
echo " Fix errors above before committing"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo "â agents.json is valid"
|
|
21
|
+
else
|
|
22
|
+
echo "â No changes to agents.json"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
exit 0
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Scope: universal | Orchestrates framework + stack-specific pre-commit hooks
|
|
3
|
-
# MORPH-SPEC Master Pre-Commit Hook
|
|
4
|
-
# Runs universal framework hooks + stack-specific hooks in sequence
|
|
5
|
-
|
|
6
|
-
echo "ââââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
7
|
-
echo "â MORPH-SPEC PRE-COMMIT VALIDATION â"
|
|
8
|
-
echo "ââââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
9
|
-
echo ""
|
|
10
|
-
|
|
11
|
-
FRAMEWORK_HOOKS_DIR="$(dirname "$0")"
|
|
12
|
-
STACK_HOOKS_DIR=".morph/hooks/pre-commit"
|
|
13
|
-
|
|
14
|
-
HAS_FAILURES=false
|
|
15
|
-
|
|
16
|
-
# Run framework hooks (universal - all stacks)
|
|
17
|
-
echo "đĻ Running framework hooks (universal)..."
|
|
18
|
-
for hook in "$FRAMEWORK_HOOKS_DIR"/*.sh; do
|
|
19
|
-
# Skip orchestrator itself
|
|
20
|
-
if [[ "$hook" == */orchestrator.sh ]]; then
|
|
21
|
-
continue
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
if [[ -f "$hook" ]]; then
|
|
25
|
-
hook_name=$(basename "$hook")
|
|
26
|
-
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
27
|
-
if ! bash "$hook"; then
|
|
28
|
-
HAS_FAILURES=true
|
|
29
|
-
echo "â Framework hook failed: $hook_name"
|
|
30
|
-
fi
|
|
31
|
-
echo ""
|
|
32
|
-
fi
|
|
33
|
-
done
|
|
34
|
-
|
|
35
|
-
# Run stack-specific hooks (if exist)
|
|
36
|
-
if [[ -d "$STACK_HOOKS_DIR" ]]; then
|
|
37
|
-
echo "đ¯ Running stack-specific hooks..."
|
|
38
|
-
for hook in "$STACK_HOOKS_DIR"/*.sh; do
|
|
39
|
-
if [[ -f "$hook" ]]; then
|
|
40
|
-
hook_name=$(basename "$hook")
|
|
41
|
-
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
42
|
-
if ! bash "$hook"; then
|
|
43
|
-
HAS_FAILURES=true
|
|
44
|
-
echo "â Stack hook failed: $hook_name"
|
|
45
|
-
fi
|
|
46
|
-
echo ""
|
|
47
|
-
fi
|
|
48
|
-
done
|
|
49
|
-
else
|
|
50
|
-
echo "âšī¸ No stack-specific hooks found (optional)"
|
|
51
|
-
echo ""
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
55
|
-
|
|
56
|
-
if [[ "$HAS_FAILURES" == "true" ]]; then
|
|
57
|
-
echo "â PRE-COMMIT VALIDATION FAILED"
|
|
58
|
-
echo " Fix errors above before committing"
|
|
59
|
-
echo " Or use: git commit --no-verify to skip"
|
|
60
|
-
exit 1
|
|
61
|
-
fi
|
|
62
|
-
|
|
63
|
-
echo "â
ALL PRE-COMMIT VALIDATIONS PASSED"
|
|
64
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Scope: universal | Orchestrates framework + stack-specific pre-commit hooks
|
|
3
|
+
# MORPH-SPEC Master Pre-Commit Hook
|
|
4
|
+
# Runs universal framework hooks + stack-specific hooks in sequence
|
|
5
|
+
|
|
6
|
+
echo "ââââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
7
|
+
echo "â MORPH-SPEC PRE-COMMIT VALIDATION â"
|
|
8
|
+
echo "ââââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
9
|
+
echo ""
|
|
10
|
+
|
|
11
|
+
FRAMEWORK_HOOKS_DIR="$(dirname "$0")"
|
|
12
|
+
STACK_HOOKS_DIR=".morph/hooks/pre-commit"
|
|
13
|
+
|
|
14
|
+
HAS_FAILURES=false
|
|
15
|
+
|
|
16
|
+
# Run framework hooks (universal - all stacks)
|
|
17
|
+
echo "đĻ Running framework hooks (universal)..."
|
|
18
|
+
for hook in "$FRAMEWORK_HOOKS_DIR"/*.sh; do
|
|
19
|
+
# Skip orchestrator itself
|
|
20
|
+
if [[ "$hook" == */orchestrator.sh ]]; then
|
|
21
|
+
continue
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
if [[ -f "$hook" ]]; then
|
|
25
|
+
hook_name=$(basename "$hook")
|
|
26
|
+
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
27
|
+
if ! bash "$hook"; then
|
|
28
|
+
HAS_FAILURES=true
|
|
29
|
+
echo "â Framework hook failed: $hook_name"
|
|
30
|
+
fi
|
|
31
|
+
echo ""
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
# Run stack-specific hooks (if exist)
|
|
36
|
+
if [[ -d "$STACK_HOOKS_DIR" ]]; then
|
|
37
|
+
echo "đ¯ Running stack-specific hooks..."
|
|
38
|
+
for hook in "$STACK_HOOKS_DIR"/*.sh; do
|
|
39
|
+
if [[ -f "$hook" ]]; then
|
|
40
|
+
hook_name=$(basename "$hook")
|
|
41
|
+
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
42
|
+
if ! bash "$hook"; then
|
|
43
|
+
HAS_FAILURES=true
|
|
44
|
+
echo "â Stack hook failed: $hook_name"
|
|
45
|
+
fi
|
|
46
|
+
echo ""
|
|
47
|
+
fi
|
|
48
|
+
done
|
|
49
|
+
else
|
|
50
|
+
echo "âšī¸ No stack-specific hooks found (optional)"
|
|
51
|
+
echo ""
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
echo "âââââââââââââââââââââââââââââââââââââââââââââââââ"
|
|
55
|
+
|
|
56
|
+
if [[ "$HAS_FAILURES" == "true" ]]; then
|
|
57
|
+
echo "â PRE-COMMIT VALIDATION FAILED"
|
|
58
|
+
echo " Fix errors above before committing"
|
|
59
|
+
echo " Or use: git commit --no-verify to skip"
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
echo "â
ALL PRE-COMMIT VALIDATIONS PASSED"
|
|
64
|
+
exit 0
|