@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.
Files changed (185) hide show
  1. package/CLAUDE.md +6 -1
  2. package/README.md +13 -2
  3. package/bin/morph-spec.js +48 -0
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +2 -0
  9. package/framework/MORPH.md +2 -1
  10. package/framework/agents.json +20 -9
  11. package/framework/commands/create-umbraco-lp.md +1 -1
  12. package/framework/commands/morph-status.md +1 -1
  13. package/framework/docs/CLI.md +18 -0
  14. package/framework/evals/rubrics/code-quality.md +17 -0
  15. package/framework/evals/rubrics/condensed.md +3 -1
  16. package/framework/hooks/claude-code/statusline.sh +11 -11
  17. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  18. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  19. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  20. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  21. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  22. package/framework/hooks/shared/phase-utils.js +2 -0
  23. package/framework/hooks/shared/stdin-reader.js +26 -26
  24. package/framework/mcp/registry.json +97 -11
  25. package/framework/rubrics/backend.json +2 -2
  26. package/framework/rubrics/default.json +2 -2
  27. package/framework/rubrics/frontend.json +2 -2
  28. package/framework/schemas/tasks.schema.json +25 -0
  29. package/framework/skills/core/create-umbraco-lp/SKILL.md +13 -2
  30. package/framework/skills/core/create-umbraco-lp/references/umbraco-lp-patterns.md +598 -0
  31. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +92 -7
  32. package/framework/skills/core/morph-apply/SKILL.md +12 -3
  33. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  34. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  35. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  36. package/framework/skills/core/morph-implement/SKILL.md +12 -2
  37. package/framework/skills/core/morph-plan/SKILL.md +45 -3
  38. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  39. package/framework/skills/core/morph-review/SKILL.md +11 -3
  40. package/framework/skills/core/morph-stack-scan/SKILL.md +13 -1
  41. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  42. package/framework/skills/core/morph-uiux/SKILL.md +1 -1
  43. package/framework/standards/PROVENANCE.json +41 -0
  44. package/framework/standards/STANDARDS.json +218 -7
  45. package/framework/standards/ai-agents/agent-session.md +160 -160
  46. package/framework/standards/ai-agents/batching.md +193 -193
  47. package/framework/standards/ai-agents/context-providers.md +188 -188
  48. package/framework/standards/ai-agents/mcp-server.md +250 -250
  49. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  50. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  51. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  52. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  53. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  54. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  55. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  56. package/framework/standards/ai-agents/production.md +231 -231
  57. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  58. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  59. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  60. package/framework/standards/ai-agents/structured-output.md +249 -249
  61. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  62. package/framework/standards/frontend/design-system/ai-image-generation.md +43 -0
  63. package/framework/standards/frontend/design-system/ai-video-generation.md +113 -0
  64. package/framework/standards/frontend/design-system/premium-finish.md +160 -0
  65. package/framework/standards/frontend/gsap/gsap-core.md +1 -1
  66. package/framework/standards/frontend/gsap/gsap-plugins.md +1 -1
  67. package/framework/standards/frontend/gsap/gsap-scrolltrigger.md +3 -1
  68. package/framework/standards/frontend/nextjs/motion-patterns.md +3 -1
  69. package/framework/standards/frontend/scroll-driven/frame-scrub.md +287 -0
  70. package/framework/standards/frontend/scroll-driven/scroll-components.md +256 -0
  71. package/framework/standards/frontend/scroll-driven/smooth-scroll.md +148 -0
  72. package/framework/standards/frontend/seo/meta-schema-audit.md +134 -0
  73. package/framework/templates/.idea/morph-templates.xml +92 -0
  74. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  75. package/framework/templates/IDE-SNIPPETS.md +262 -262
  76. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  77. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  78. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  79. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  80. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  81. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  82. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  83. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  84. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  85. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  86. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  87. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  88. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  89. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  90. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  91. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  92. package/framework/templates/code/typescript/contracts.ts +167 -167
  93. package/framework/templates/context/ARCHITECTURE.md +20 -0
  94. package/framework/templates/docs/clarifications.md +253 -253
  95. package/framework/templates/docs/schema-analysis.md +119 -119
  96. package/framework/templates/docs/ui-components.md +52 -52
  97. package/framework/templates/docs/ui-design-system.md +76 -76
  98. package/framework/templates/docs/ui-flows.md +167 -167
  99. package/framework/templates/docs/ui-mockups.md +98 -98
  100. package/framework/templates/feature/decisions.md +122 -122
  101. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  102. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  103. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  104. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  105. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  106. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  107. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  108. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/integrations/asaas-client.cs +387 -387
  117. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  118. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  119. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  120. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  121. package/framework/templates/project/validate.js +120 -120
  122. package/framework/templates/state.template.json +17 -17
  123. package/framework/templates/ui/design-system.css +226 -226
  124. package/package.json +1 -1
  125. package/src/commands/dashboard/dashboard.js +53 -53
  126. package/src/commands/graph/affected.js +89 -0
  127. package/src/commands/graph/build.js +94 -0
  128. package/src/commands/graph/explain.js +96 -0
  129. package/src/commands/graph/status.js +93 -0
  130. package/src/commands/index.js +13 -13
  131. package/src/commands/project/checkpoint.js +209 -209
  132. package/src/commands/project/doctor.js +11 -0
  133. package/src/core/paths/output-schema.js +7 -0
  134. package/src/core/state/phase-state-machine.js +197 -197
  135. package/src/core/templates/template-renderer.js +477 -477
  136. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  137. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  138. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  139. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  140. package/src/dashboard/app/main.jsx +13 -13
  141. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  142. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  143. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  144. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  145. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  146. package/src/dashboard/app/pages/Standards.jsx +332 -332
  147. package/src/dashboard/app/styles/index.css +47 -47
  148. package/src/dashboard/index.html +12 -12
  149. package/src/dashboard/package.json +24 -24
  150. package/src/dashboard/scanner/phases-scanner.js +15 -15
  151. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  152. package/src/dashboard/scanner/rules-scanner.js +37 -37
  153. package/src/dashboard/scanner/skills-scanner.js +43 -43
  154. package/src/dashboard/scanner/squads-scanner.js +13 -13
  155. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  156. package/src/dashboard/vite.config.js +24 -24
  157. package/src/lib/detectors/design-system-detector.js +188 -188
  158. package/src/lib/detectors/index.js +217 -217
  159. package/src/lib/generators/architecture-scanner.js +45 -4
  160. package/src/lib/generators/design-system-generator.js +508 -508
  161. package/src/lib/generators/settings-generator.js +209 -209
  162. package/src/lib/graph/god-nodes.js +75 -0
  163. package/src/lib/graph/graph-health.js +61 -0
  164. package/src/lib/graph/graph-loader.js +86 -0
  165. package/src/lib/graph/graphify-runtime.js +100 -0
  166. package/src/lib/graph/graphifyignore.js +86 -0
  167. package/src/lib/graph/sanitize.js +280 -0
  168. package/src/lib/hooks/hook-executor.js +167 -167
  169. package/src/lib/installers/mcp-installer.js +719 -719
  170. package/src/lib/tasks/task-classifier.js +30 -30
  171. package/src/lib/tasks/task-parser.js +209 -209
  172. package/src/lib/tasks/tasks-json-parser.js +26 -0
  173. package/src/lib/validators/checkpoint-persistence.js +39 -39
  174. package/src/lib/validators/css/css-validator.js +340 -340
  175. package/src/lib/validators/reuse/index.js +10 -0
  176. package/src/lib/validators/reuse/reuse-validator.js +324 -0
  177. package/src/lib/validators/reuse/symbol-scanner.js +144 -0
  178. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  179. package/src/lib/validators/shared/issue-counter.js +14 -14
  180. package/src/lib/validators/validation-runner.js +40 -1
  181. package/src/scripts/setup-infra.js +60 -1
  182. package/src/utils/agent-id-mapper.js +11 -11
  183. package/src/utils/claude-settings-manager.js +300 -300
  184. package/src/utils/file-copier.js +40 -0
  185. package/src/utils/skills-installer.js +187 -187
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "morph-spec",
3
- "version": "8.28.0",
3
+ "version": "8.31.0",
4
4
  "displayName": "MORPH-SPEC Framework",
5
5
  "description": "Spec-driven development with 38 agents and 8-phase workflow for .NET/Blazor/Next.js/Azure",
6
6
  "publisher": "polymorphism-tech",
@@ -186,4 +186,4 @@ Never edited directly — go through CLI commands or `morph-spec update` instead
186
186
 
187
187
  ---
188
188
 
189
- *morph-spec v8.28.0 by Polymorphism Tech*
189
+ *morph-spec v8.31.0 by Polymorphism Tech*
@@ -249,4 +249,4 @@ morph-spec doctor
249
249
 
250
250
  ---
251
251
 
252
- *morph-spec v8.28.0 by Polymorphism Tech*
252
+ *morph-spec v8.31.0 by Polymorphism Tech*
@@ -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 |
@@ -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
 
@@ -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). Usa Read/Glob/Grep e Bash SOMENTE-LEITURA (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."
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
- - `docs/umbraco-lp-patterns.md` (em `main`)
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/13 outputs), task progress, and next-step suggestions.
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
@@ -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