@polymorphism-tech/morph-spec 7.8.1 → 7.9.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 (183) hide show
  1. package/README.md +2 -2
  2. package/bin/morph-spec.js +30 -1
  3. package/bin/validate.js +379 -379
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/CLAUDE.md +3 -1
  8. package/framework/MORPH.md +4 -3
  9. package/framework/commands/commit.md +166 -166
  10. package/framework/commands/morph-infra.md +215 -215
  11. package/framework/commands/morph-preflight.md +205 -205
  12. package/framework/commands/morph-troubleshoot.md +124 -124
  13. package/framework/evals/trace-schema.md +22 -12
  14. package/framework/hooks/README.md +2 -0
  15. package/framework/hooks/claude-code/core/subagent-report-guard.js +95 -0
  16. package/framework/hooks/claude-code/core/trace-autogen.js +183 -0
  17. package/framework/hooks/claude-code/statusline.py +679 -679
  18. package/framework/hooks/claude-code/statusline.sh +11 -11
  19. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  20. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  21. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  22. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  23. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  24. package/framework/hooks/shared/activity-logger.js +160 -160
  25. package/framework/hooks/shared/hook-response.js +45 -45
  26. package/framework/hooks/shared/payload-utils.js +78 -78
  27. package/framework/hooks/shared/stdin-reader.js +26 -26
  28. package/framework/hooks/shared/tasks-validator.js +47 -4
  29. package/framework/rubrics/backend.json +41 -41
  30. package/framework/rules/ai-agents-standards.md +45 -45
  31. package/framework/rules/dotnet-templates.md +86 -86
  32. package/framework/rules/frontend-standards.md +13 -13
  33. package/framework/rules/infrastructure-standards.md +27 -27
  34. package/framework/rules/neon-standards.md +25 -25
  35. package/framework/rules/nextjs-standards.md +20 -20
  36. package/framework/rules/nextjs-templates.md +40 -40
  37. package/framework/schemas/feature.schema.json +128 -0
  38. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  39. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  40. package/framework/skills/core/morph-apply/SKILL.md +23 -10
  41. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  42. package/framework/skills/core/morph-eval/SKILL.md +3 -6
  43. package/framework/skills/core/morph-implement/SKILL.md +28 -15
  44. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  45. package/framework/skills/core/morph-proposal/SKILL.md +2 -2
  46. package/framework/skills/core/morph-review/SKILL.md +2 -6
  47. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  48. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  49. package/framework/standards/ai-agents/agent-session.md +160 -160
  50. package/framework/standards/ai-agents/batching.md +193 -193
  51. package/framework/standards/ai-agents/context-providers.md +188 -188
  52. package/framework/standards/ai-agents/mcp-server.md +250 -250
  53. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  54. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  55. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  56. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  57. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  58. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  59. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  60. package/framework/standards/ai-agents/production.md +275 -275
  61. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  62. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  63. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  64. package/framework/standards/ai-agents/structured-output.md +249 -249
  65. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  66. package/framework/templates/.idea/morph-templates.xml +92 -0
  67. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  68. package/framework/templates/IDE-SNIPPETS.md +262 -262
  69. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  70. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  71. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  72. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  73. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  74. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  75. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  76. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  77. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  78. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  79. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  80. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  81. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  82. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  83. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  84. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  85. package/framework/templates/code/typescript/contracts.ts +167 -167
  86. package/framework/templates/docs/clarifications.md +253 -253
  87. package/framework/templates/docs/schema-analysis.md +119 -119
  88. package/framework/templates/docs/ui-components.md +52 -52
  89. package/framework/templates/docs/ui-design-system.md +76 -76
  90. package/framework/templates/docs/ui-flows.md +167 -167
  91. package/framework/templates/docs/ui-mockups.md +98 -98
  92. package/framework/templates/feature/decisions.md +122 -122
  93. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  94. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  95. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  96. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  97. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  98. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  99. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  100. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  101. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  102. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  103. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  104. package/framework/templates/infrastructure/github/README.md +56 -56
  105. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  106. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  107. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  108. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  109. package/framework/templates/integrations/asaas-client.cs +387 -387
  110. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  111. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  112. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  113. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  114. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  115. package/framework/templates/project/validate.js +120 -120
  116. package/framework/templates/state.template.json +17 -17
  117. package/framework/templates/ui/design-system.css +226 -226
  118. package/package.json +1 -1
  119. package/src/commands/dashboard/dashboard.js +53 -53
  120. package/src/commands/index.js +13 -13
  121. package/src/commands/mcp/mcp-setup.js +519 -519
  122. package/src/commands/project/checkpoint.js +209 -209
  123. package/src/commands/project/doctor.js +23 -18
  124. package/src/commands/project/update.js +16 -9
  125. package/src/commands/state/create.js +58 -0
  126. package/src/commands/state/gate-decision.js +99 -0
  127. package/src/core/state/phase-state-machine.js +197 -197
  128. package/src/core/state/state-manager.js +55 -0
  129. package/src/core/templates/template-renderer.js +477 -477
  130. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  131. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  132. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  133. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  134. package/src/dashboard/app/main.jsx +13 -13
  135. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  136. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  137. package/src/dashboard/app/pages/LiveState.jsx +239 -239
  138. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  139. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  140. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  141. package/src/dashboard/app/pages/Standards.jsx +332 -332
  142. package/src/dashboard/app/styles/index.css +47 -47
  143. package/src/dashboard/index.html +12 -12
  144. package/src/dashboard/package.json +24 -24
  145. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  146. package/src/dashboard/scanner/phases-scanner.js +15 -15
  147. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  148. package/src/dashboard/scanner/rules-scanner.js +37 -37
  149. package/src/dashboard/scanner/skills-scanner.js +43 -43
  150. package/src/dashboard/scanner/squads-scanner.js +13 -13
  151. package/src/dashboard/scanner/standards-scanner.js +26 -26
  152. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  153. package/src/dashboard/vite.config.js +24 -24
  154. package/src/lib/agents/metrics-aggregator.js +56 -56
  155. package/src/lib/agents/metrics-calculator.js +125 -125
  156. package/src/lib/agents/output-collector.js +73 -73
  157. package/src/lib/detectors/claude-config-detector.js +152 -152
  158. package/src/lib/detectors/design-system-detector.js +231 -231
  159. package/src/lib/detectors/index.js +217 -217
  160. package/src/lib/generators/architecture-scanner.js +639 -639
  161. package/src/lib/generators/design-system-generator.js +508 -508
  162. package/src/lib/generators/index.js +13 -13
  163. package/src/lib/generators/settings-generator.js +209 -209
  164. package/src/lib/hooks/hook-executor.js +167 -167
  165. package/src/lib/installers/mcp-installer.js +719 -719
  166. package/src/lib/tasks/task-classifier.js +30 -30
  167. package/src/lib/tasks/task-parser.js +209 -209
  168. package/src/lib/tasks/test-runner.js +81 -81
  169. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  170. package/src/lib/validators/checkpoint-persistence.js +39 -39
  171. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  172. package/src/lib/validators/css/css-validator.js +340 -340
  173. package/src/lib/validators/packages/package-validator.js +347 -347
  174. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  175. package/src/lib/validators/shared/issue-counter.js +14 -14
  176. package/src/lib/validators/validation-runner.js +349 -349
  177. package/src/scripts/setup-infra.js +385 -383
  178. package/src/utils/agent-id-mapper.js +11 -11
  179. package/src/utils/agents-installer.js +25 -10
  180. package/src/utils/banner.js +37 -4
  181. package/src/utils/claude-settings-manager.js +300 -300
  182. package/src/utils/hooks-installer.js +32 -4
  183. package/src/utils/skills-installer.js +174 -172
@@ -1,40 +1,40 @@
1
- ---
2
- paths:
3
- - "**/*.tsx"
4
- - "**/*.ts"
5
- stacks:
6
- - nextjs
7
- ---
8
-
9
- # Next.js Code Templates
10
-
11
- When implementing Next.js features, use these templates as reference patterns.
12
- Read the template file to see the exact pattern, then generate code following it.
13
-
14
- ## Scaffold (preferred for new features)
15
-
16
- **Always use scaffold for new feature pages — never create feature files manually.**
17
-
18
- ```bash
19
- morph-spec scaffold nextjs <feature> [--dry-run]
20
- ```
21
-
22
- Examples:
23
- ```bash
24
- morph-spec scaffold nextjs book
25
- morph-spec scaffold nextjs user-profile
26
- ```
27
-
28
- Generates 4 files: page (Server Component), list component, form component, TanStack Query hook.
29
-
30
- **Only use `template render` for individual files when modifying an existing feature.**
31
-
32
- | Template | Path | Purpose |
33
- |----------|------|---------|
34
- | Server Page | `.morph/framework/templates/frontend/nextjs/page.tsx.hbs` | App Router server component |
35
- | Client Component | `.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs` | `'use client'` component |
36
- | Feature Form | `.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs` | react-hook-form + Zod + shadcn |
37
- | Custom Hook | `.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs` | TanStack Query hook |
38
- | Env Config | `.morph/framework/templates/frontend/nextjs/env.mjs.hbs` | T3 Env validation |
39
- | TypeScript Config | `.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs` | Path aliases |
40
- | Dockerfile | `.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs` | Multi-stage build |
1
+ ---
2
+ paths:
3
+ - "**/*.tsx"
4
+ - "**/*.ts"
5
+ stacks:
6
+ - nextjs
7
+ ---
8
+
9
+ # Next.js Code Templates
10
+
11
+ When implementing Next.js features, use these templates as reference patterns.
12
+ Read the template file to see the exact pattern, then generate code following it.
13
+
14
+ ## Scaffold (preferred for new features)
15
+
16
+ **Always use scaffold for new feature pages — never create feature files manually.**
17
+
18
+ ```bash
19
+ morph-spec scaffold nextjs <feature> [--dry-run]
20
+ ```
21
+
22
+ Examples:
23
+ ```bash
24
+ morph-spec scaffold nextjs book
25
+ morph-spec scaffold nextjs user-profile
26
+ ```
27
+
28
+ Generates 4 files: page (Server Component), list component, form component, TanStack Query hook.
29
+
30
+ **Only use `template render` for individual files when modifying an existing feature.**
31
+
32
+ | Template | Path | Purpose |
33
+ |----------|------|---------|
34
+ | Server Page | `.morph/framework/templates/frontend/nextjs/page.tsx.hbs` | App Router server component |
35
+ | Client Component | `.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs` | `'use client'` component |
36
+ | Feature Form | `.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs` | react-hook-form + Zod + shadcn |
37
+ | Custom Hook | `.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs` | TanStack Query hook |
38
+ | Env Config | `.morph/framework/templates/frontend/nextjs/env.mjs.hbs` | T3 Env validation |
39
+ | TypeScript Config | `.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs` | Path aliases |
40
+ | Dockerfile | `.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs` | Multi-stage build |
@@ -0,0 +1,128 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "MORPH-SPEC feature.json",
4
+ "description": "Canonical shape of the authoritative, committed per-feature state at .morph/features/{feature}/feature.json (v5 per-feature state model). Born via `morph-spec create` (explicit) or the state-sync hook (implicit fallback). Server-side writers: `morph-spec approve/advance` (approvalGates), `morph-spec score` (taskScores), `morph-spec gate-decision` (gateDecisions), `morph-spec archive` (status/archivedAt). Never hand-edit the CLI-owned fields — manual Edits collide with the state-sync hook. This schema is documentational: additionalProperties stays true so older/newer CLIs interoperate.",
5
+ "type": "object",
6
+ "required": ["status", "approvalGates"],
7
+ "properties": {
8
+ "status": {
9
+ "type": "string",
10
+ "enum": ["draft", "in_progress", "completed"],
11
+ "description": "Feature lifecycle status. `completed` is stamped by `morph-spec archive` together with archivedAt."
12
+ },
13
+ "createdAt": { "type": "string", "format": "date-time" },
14
+ "updatedAt": {
15
+ "type": "string",
16
+ "format": "date-time",
17
+ "description": "Stamped server-side on every CLI/hook write."
18
+ },
19
+ "archivedAt": {
20
+ "type": "string",
21
+ "format": "date-time",
22
+ "description": "Stamped by `morph-spec archive`."
23
+ },
24
+ "approvalGates": {
25
+ "type": "object",
26
+ "description": "One entry per gate. Written ONLY by `morph-spec approve`/`advance` (approvedBy: \"auto\") or the state-sync hook on a human \"aprovado\" answer (approvedBy: \"manual\").",
27
+ "properties": {
28
+ "proposal": { "$ref": "#/definitions/gate" },
29
+ "uiux": { "$ref": "#/definitions/gate" },
30
+ "plan": { "$ref": "#/definitions/gate" },
31
+ "review": { "$ref": "#/definitions/gate" }
32
+ },
33
+ "additionalProperties": false
34
+ },
35
+ "gateDecisions": {
36
+ "type": "object",
37
+ "description": "Trust decision persisted BEFORE acting on a gate, written ONLY by `morph-spec gate-decision` (decidedAt is server-side). Read by the gate-guard hook to verify the observed action matched the recorded decision.",
38
+ "propertyNames": { "enum": ["proposal", "uiux", "plan", "review"] },
39
+ "additionalProperties": {
40
+ "type": "object",
41
+ "required": ["pause", "reason", "signals", "trust", "decidedAt"],
42
+ "properties": {
43
+ "pause": { "type": "boolean", "description": "true = the gate must pause for a human (AskUserQuestion); false = auto-pass with a short summary." },
44
+ "reason": { "type": "string", "description": "The signal that drove the decision (or 'nenhum sinal de risco')." },
45
+ "signals": {
46
+ "type": "object",
47
+ "description": "Risk signals evaluated (free-form): taskCount, evalScore, standardsViolations, designSystemDivergence..."
48
+ },
49
+ "trust": { "type": "string", "enum": ["auto", "manual"] },
50
+ "decidedAt": { "type": "string", "format": "date-time" }
51
+ },
52
+ "additionalProperties": false
53
+ }
54
+ },
55
+ "taskScores": {
56
+ "type": "object",
57
+ "description": "Per-task eval scores, written ONLY by `morph-spec score` (updatedAt is server-side; attempts auto-increment; bestScore is kept).",
58
+ "propertyNames": { "pattern": "^T\\d+$" },
59
+ "additionalProperties": {
60
+ "type": "object",
61
+ "required": ["lastScore", "bestScore", "attempts", "updatedAt"],
62
+ "properties": {
63
+ "lastScore": { "type": "number", "minimum": 0, "maximum": 10 },
64
+ "bestScore": { "type": "number", "minimum": 0, "maximum": 10 },
65
+ "attempts": { "type": "integer", "minimum": 1 },
66
+ "dimensions": {
67
+ "type": "object",
68
+ "properties": {
69
+ "architecture": { "type": "number", "minimum": 0, "maximum": 10 },
70
+ "contracts": { "type": "number", "minimum": 0, "maximum": 10 },
71
+ "codeQuality": { "type": "number", "minimum": 0, "maximum": 10 },
72
+ "testCoverage": { "type": "number", "minimum": 0, "maximum": 10 }
73
+ },
74
+ "additionalProperties": false
75
+ },
76
+ "updatedAt": { "type": "string", "format": "date-time" }
77
+ },
78
+ "additionalProperties": false
79
+ }
80
+ },
81
+ "tasks": {
82
+ "type": "object",
83
+ "description": "Aggregate task counters (informational — the source of truth is 2-plan/tasks.json).",
84
+ "properties": {
85
+ "total": { "type": "integer", "minimum": 0 },
86
+ "completed": { "type": "integer", "minimum": 0 },
87
+ "inProgress": { "type": "integer", "minimum": 0 },
88
+ "pending": { "type": "integer", "minimum": 0 }
89
+ },
90
+ "additionalProperties": true
91
+ },
92
+ "outputs": {
93
+ "type": "object",
94
+ "description": "Outputs tracked by the state-sync hook: filename → { created, path }.",
95
+ "additionalProperties": {
96
+ "type": "object",
97
+ "properties": {
98
+ "created": { "type": "boolean" },
99
+ "path": { "type": "string" }
100
+ },
101
+ "additionalProperties": true
102
+ }
103
+ },
104
+ "activeAgents": { "type": "array", "items": { "type": "string" } },
105
+ "checkpoints": { "type": "array" },
106
+ "dispatchLog": {
107
+ "type": "array",
108
+ "description": "Dispatch events (capped at 50). Entries: { timestamp, phase, mode, agents: [{ id, subagentType, group, tasks }] }."
109
+ },
110
+ "trustConfig": { "type": "object" },
111
+ "contextBundles": { "type": "array" },
112
+ "fileChanges": { "type": "array" },
113
+ "skippedPhases": { "type": "array" }
114
+ },
115
+ "additionalProperties": true,
116
+ "definitions": {
117
+ "gate": {
118
+ "type": "object",
119
+ "required": ["approved"],
120
+ "properties": {
121
+ "approved": { "type": "boolean" },
122
+ "timestamp": { "type": ["string", "null"], "description": "ISO timestamp of the approval/revocation, null while never evaluated." },
123
+ "approvedBy": { "type": ["string", "null"], "description": "\"auto\" (policy gate), \"manual\" (human in the loop), a --approver name, or null while never evaluated." }
124
+ },
125
+ "additionalProperties": true
126
+ }
127
+ }
128
+ }
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # create-umbraco-lp
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # migrate-lp-to-umbraco
@@ -4,7 +4,7 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
4
4
  version: core
5
5
  when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
6
6
  user-invokable: true
7
- cliVersion: "7.8.0"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
@@ -52,6 +52,8 @@ O comando analisa `dependencies`, `group` e `effort` das tasks pendentes e impri
52
52
 
53
53
  > **Peso de esforço:** a decisão é ponderada por `effort` (S=1, M=2, L=4, XL=8). **Raízes e fluxos compostos só de tasks S não ganham dispatch próprio** — overhead > trabalho. O comando os lista como `inline` (você os executa no modo sequencial) ou os agrupa num **único** agente quando são muitos. O cap de **4 agentes simultâneos** (anti-padrão abaixo) vale para ambas as formas. Se um fluxo de domínio é uma cadeia longa, despache o **fluxo inteiro** a um sub-agent (que executa a cadeia em ordem internamente) — um agente por fluxo, não um agente por task.
54
54
 
55
+ > **DAG × gatilho de effort — decisões ortogonais que coexistem:** a decisão deste comando governa o **paralelismo ENTRE tasks** (quantos sub-agents ao mesmo tempo: fluxos/raízes independentes em batch). O gatilho de effort/domínio de `morph-implement` §4 governa o **dispatch INDIVIDUAL** de cada task quando ela chega ao topo do loop sequencial. `DAG: sequencial` significa "uma task por vez, na ordem" — **NÃO significa "tudo inline"**. Exemplo: cadeia única backend de 12 tasks → o DAG decide sequencial; T7 tem effort L → ao chegar em T7, o orquestrador a despacha **sozinha** para `morph-dotnet-senior` e aguarda o retorno (um agente por vez); T8 (S, mesmo domínio já carregado) roda inline. As duas regras nunca conflitam: o DAG decide *quantos ao mesmo tempo*, o gatilho de effort decide *quem executa cada task*.
56
+
55
57
  Registre a linha de decisão que o comando imprimiu, por exemplo:
56
58
  ```
57
59
  DAG: 14 tasks, fluxos {backend:9, frontend:2} independentes (peso 18‖4) → 2 fluxos paralelos + T14 (integração) sequencial no fim
@@ -120,9 +122,15 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
120
122
  Não modifique spec.md, mandate.md.
121
123
 
122
124
  Protocolo obrigatório:
123
- 1. Ao concluir, ENTREGUE o relatório final — sua última mensagem é o relatório;
124
- se a sessão permanecer viva aguardando, envie-o via SendMessage para main.
125
- Terminar idle sem reportar é falha de protocolo.
125
+ 1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage: antes de encerrar,
126
+ chame a tool SendMessage com to:"main" e o relatório completo no content.
127
+ Sua última mensagem em texto NÃO chega ao orquestrador — só SendMessage
128
+ chega. Não termine idle "aguardando"; o SendMessage É o encerramento.
129
+ Exemplo literal (última chamada de tool da sua sessão):
130
+ SendMessage({ to: "main", content: "Fluxo backend concluído (T2→T7).
131
+ Sumário: ... Arquivos: src/... Standards: vsa-handler-patterns.
132
+ Auto-score: 9/10" })
133
+ Terminar idle sem SendMessage é falha de protocolo.
126
134
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
127
135
  (TaskCreate/TaskUpdate) — todo estado (status de task, scores, gates) é
128
136
  gravado exclusivamente pelo orquestrador.
@@ -130,7 +138,7 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
130
138
  (dotnet test / npm test do projeto inteiro) — edições concorrentes quebram
131
139
  o build umas das outras; a verificação é do orquestrador, pós-batch.
132
140
 
133
- Retorne:
141
+ Retorne no content do SendMessage:
134
142
  - sumário das mudanças
135
143
  - arquivos modificados (paths)
136
144
  - standard(s) consultado(s)
@@ -141,7 +149,7 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
141
149
 
142
150
  > **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): despache com `isolation: "worktree"` — cada agente trabalha numa working tree própria e o orquestrador integra ao final. Nesse caso a cláusula 3 vira "rode build/test apenas dentro do seu worktree".
143
151
 
144
- Aguardar todos os agentes terminarem. **Se um agente ficar idle sem entregar o relatório, cobre-o via SendMessage e registre a falha de protocolo no recap.** Depois, sequencialmente:
152
+ Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/SubagentStop) bloqueia uma vez o encerramento de um subagent despachado que não chamou SendMessage, com a instrução da cláusula 1 — o ciclo cobrar-esperar deixa de ser o caminho normal. **Fallback: se mesmo assim um agente ficar idle sem entregar o relatório, cobre-o via SendMessage e registre a falha de protocolo no recap.** Depois, sequencialmente:
145
153
  - **Rodar a verificação compartilhada uma única vez** (build + suíte de testes do projeto) — os agentes não a rodaram (cláusula 3 do protocolo).
146
154
  - Para cada relatório retornado:
147
155
  - Aplicar `Skill(morph-eval)`.
@@ -168,9 +176,13 @@ Sinais de risco para Gate 3:
168
176
 
169
177
  Mesma lógica do Gate 1/Gate 2 (regras da tabela do MORPH.md §5, aplicadas em linguagem natural — sem scripts): `trust: manual` → pausa sempre; `standardsViolations` não-vazio → pausa; `evalScore < 9` → pausa; caso contrário → auto-passa.
170
178
 
171
- **Persista a decisão no `feature.json` autoritativo da feature ANTES de apresentar ou auto-aprovar** — grave
172
- `gateDecisions.review = { pause, reason, signals, trust, decidedAt: <ISO> }` em `.morph/features/{feature}/feature.json`
173
- (o `signals.evalScore` aqui é o score composto do review-report; Edit em `.morph/features/**` é permitido). O hook `gate-guard.js` confere depois se a ação bateu. Sem o registro o guard não verifica.
179
+ **Persista a decisão ANTES de apresentar ou auto-aprovar — via CLI, nunca editando feature.json à mão** (o Edit manual colide com o hook state-sync — erro "file modified since read"):
180
+
181
+ ```
182
+ morph-spec gate-decision {feature} review --pause false --reason "score 9.2, sem violações" --signals '{"evalScore":9.2,"standardsViolations":[]}'
183
+ ```
184
+
185
+ O comando grava `gateDecisions.review = { pause, reason, signals, trust, decidedAt }` no `feature.json` autoritativo com timestamp server-side (o `signals.evalScore` aqui é o score composto do review-report; shape canônico em `.morph/framework/schemas/feature.schema.json`). O hook `gate-guard.js` confere depois se a ação bateu. Sem o registro o guard não verifica.
174
186
 
175
187
  - Pause: `AskUserQuestion` com options `["aprovado, fechar feature", "preciso ajustar", "rollback"]`.
176
188
  - Auto: exibir summary do review-report, aprovar via `morph-spec approve {feature} review --mode auto`, e prosseguir.
@@ -189,7 +201,7 @@ Mesma lógica do Gate 1/Gate 2 (regras da tabela do MORPH.md §5, aplicadas em l
189
201
  - Não dispachar mais que 4 agentes em paralelo (sobrecarga de contexto + custo).
190
202
  - Não dispachar um agente inteiro para uma raiz de effort S — overhead > trabalho; o `morph-spec dag` já as marca como `inline`.
191
203
  - Não deixar sub-agent tocar `tasks.json`, `feature.json` ou o board de sessão — estado é do orquestrador (cláusula 2 do protocolo).
192
- - Não editar `feature.json` à mão para gravar scores — use `morph-spec score` (timestamp server-side).
204
+ - Não editar `feature.json` à mão para gravar scores ou decisões de gate — use `morph-spec score` e `morph-spec gate-decision` (timestamps server-side; o Edit manual colide com o hook state-sync — "file modified since read").
193
205
 
194
206
  ## Output esperado
195
207
 
@@ -207,4 +219,5 @@ Mesma lógica do Gate 1/Gate 2 (regras da tabela do MORPH.md §5, aplicadas em l
207
219
  - `framework/skills/core/morph-review/SKILL.md`
208
220
  - `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort)
209
221
  - `morph-spec score {feature} {task} {score} [--dims a,c,q,t]` — grava taskScores no feature.json com timestamp server-side
222
+ - `morph-spec gate-decision {feature} {gate} --pause {bool} [--reason ...] [--signals ...]` — grava gateDecisions no feature.json com timestamp server-side (shape em `.morph/framework/schemas/feature.schema.json`)
210
223
  - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
4
4
  version: core
5
5
  when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
4
4
  version: core
5
5
  when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
6
6
  user-invokable: false
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -39,16 +39,13 @@ Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
39
39
 
40
40
  6. Registre o score no recap.md da tarefa avaliada.
41
41
 
42
- 7. Atualize o trace de execução em `.morph/traces/YYYY-MM-DD-{feature}-{phase}.json`:
43
- - Encontre a entrada da task avaliada em `tasks[]` pelo `id`
44
- - Preencha `eval_score` com o score composto calculado no passo 4
45
- - Preencha `eval_dimensions` com os scores individuais por dimensão
42
+ 7. **NÃO escreva o trace manualmente.** O arquivo `.morph/traces/YYYY-MM-DD-{feature}-implement.json` é gerado automaticamente pelo hook `trace-autogen` a cada write de `tasks.json`, lendo `eval_score`/`eval_dimensions` do registro `taskScores` do feature.json. Garanta apenas que o score foi persistido via `morph-spec score {feature} {task} {score} --dims {a},{c},{q},{t}` (a `morph-apply` faz esse registro no loop) — é dali que o trace lê.
46
43
 
47
44
  ## Output esperado
48
45
  - Score composto 0-10 com scores por dimensão
49
46
  - Ação tomada com base no score (aprovado em >=9 / feedback acionável para o loop em <9)
50
47
  - Entrada no recap.md com scores
51
- - Trace atualizado com `eval_score` e `eval_dimensions`
48
+ - Score persistido em `taskScores` via `morph-spec score` (o trace é gerado automaticamente pelo hook `trace-autogen`)
52
49
 
53
50
  ## Referências
54
51
  - `.morph/framework/evals/rubrics/architecture.md` — rubrica de arquitetura (30%)
@@ -4,7 +4,7 @@ description: Guia a execução de cada tarefa de implementação com standard e
4
4
  version: core
5
5
  when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
6
  user-invokable: false
7
- cliVersion: "7.8.0"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -47,6 +47,8 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
47
47
 
48
48
  Inline é aceitável só para tasks S/M **dentro do domínio já carregado**. Se for inline numa task que dispara um gatilho, registre a justificativa em uma linha no `decisions.md` — inline silencioso numa task pesada/multi-domínio é o anti-padrão da seção 6.
49
49
 
50
+ > **Relação com `morph-spec dag`:** a decisão do DAG (na `morph-apply` §2) governa o **paralelismo ENTRE tasks** — quantos sub-agents rodam ao mesmo tempo. Os gatilhos acima governam o **dispatch INDIVIDUAL desta task**. São ortogonais e coexistem: `DAG: sequencial` NÃO significa "tudo inline" — significa "uma task por vez, na ordem". Exemplo: cadeia única backend de 12 tasks (DAG: sequencial); T7 tem effort L → despache T7 sozinha para `morph-dotnet-senior` e aguarde o retorno antes de seguir; T8 (S, mesmo domínio) roda inline.
51
+
50
52
  **Se for despachar — use `subagent_type: "morph-{id}"` do agente identificado no passo 3.** Os subagents são gerados de `agents.json` na instalação (`.claude/agents/morph-{id}.md`) e a persona é o **system prompt** deles — não a cole no prompt. **Fallback:** se `morph-{id}` não estiver na sua lista de subagent types (stack não instalado), use `general-purpose` colando o campo `persona` no prompt e registre nas `notes` da task: `dispatch-fallback: general-purpose ({id} não registrado)`. Template do prompt:
51
53
  ```
52
54
  Implementar [ID]: [title da task]
@@ -57,17 +59,24 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
57
59
  Done quando: [doneCriteria do tasks.json]
58
60
 
59
61
  Protocolo obrigatório:
60
- 1. Ao concluir, ENTREGUE o relatório final — sua última mensagem é o relatório;
61
- se a sessão permanecer viva aguardando, envie-o via SendMessage para main.
62
- Terminar idle sem reportar é falha de protocolo.
62
+ 1. ATO FINAL OBRIGATÓRIO — relatório via SendMessage: antes de encerrar,
63
+ chame a tool SendMessage com to:"main" e o relatório completo no content.
64
+ Sua última mensagem em texto NÃO chega ao orquestrador — só SendMessage
65
+ chega. Não termine idle "aguardando"; o SendMessage É o encerramento.
66
+ Exemplo literal (última chamada de tool da sua sessão):
67
+ SendMessage({ to: "main", content: "T{N} concluída. (1) O que foi feito:
68
+ handler + validator do slice X. (2) Arquivos: src/Features/X/Handler.cs,
69
+ tests/X/HandlerTests.cs. (3) Problemas: nenhum. (4) Auto-score: 9/10" })
70
+ Terminar idle sem SendMessage é falha de protocolo.
63
71
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
64
72
  (TaskCreate/TaskUpdate) — todo estado é gravado exclusivamente pelo
65
73
  orquestrador.
66
74
  3. Se você faz parte de um batch paralelo, NÃO rode build/test da suíte
67
75
  compartilhada — a verificação é do orquestrador, pós-batch.
68
76
 
69
- Retorne APENAS: (1) o que foi feito em 2-3 frases, (2) arquivos modificados,
70
- (3) problemas encontrados e como foram resolvidos, (4) auto-score 0-10.
77
+ Retorne no content do SendMessage APENAS: (1) o que foi feito em 2-3 frases,
78
+ (2) arquivos modificados, (3) problemas encontrados e como foram resolvidos,
79
+ (4) auto-score 0-10.
71
80
  ```
72
81
  Após receber o retorno: o auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (barra única do MORPH.md §0). Integre o relatório ao recap.md e vá para o passo 7.
73
82
 
@@ -102,31 +111,35 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
102
111
  - Sem standard ⇒ a task falha no validador de Gate 3 (`validate-completion`)
103
112
  e o reviewer não consegue auditar de onde veio a decisão técnica.
104
113
 
105
- 7. Registre a entrada no trace de execução em `.morph/traces/YYYY-MM-DD-{feature}-implement.json`:
106
- - Crie o arquivo se não existir (use o schema em `.morph/framework/evals/trace-schema.md`)
107
- - Adicione entrada em `tasks[]` com: `id`, `title`, `status`, `standards_consulted`, `agent_persona`, `files_modified`, `sub_agent_dispatched`
108
- - Deixe `eval_score` e `eval_dimensions` como `null` — serão preenchidos pelo morph-eval
109
- - Se esta for a última tarefa da fase, preencha `completed_at`
110
-
111
- 8. Atualizar `tasks.json` marcando a task como `done` — **direto com a tool `Edit` (ou `Write`)**, sem scripts:
114
+ 7. Atualizar `tasks.json` marcando a task como `done` — **direto com a tool `Edit` (ou `Write`)**, sem scripts:
112
115
 
113
116
  - Mude apenas os campos mutáveis da task: `status` (enum válido: `pending`,
114
117
  `in_progress`, `done`, `skipped`, `blocked` — nunca invente valores como
115
118
  `"completed"`), `outputs` (paths realmente produzidos) e `notes`.
119
+ - **`outputs` contém apenas paths realmente produzidos.** Deleções, remoções
120
+ e anotações (ex.: `"pasta/ (removido: a, b)"`) se registram em `notes`,
121
+ nunca em `outputs`. E `notes` é **uma string única** — não um array.
116
122
  - **Se os `outputs` reais divergirem dos planejados**, registre o porquê em
117
- `notes` na mesma edição — o hook exige a note quando há divergência.
123
+ `notes` na mesma edição — o hook exige a note quando há divergência (e a
124
+ mensagem de violação aponta o campo/valor exato do problema).
118
125
  - `tasks.json` é protegido após o Gate 2: o hook `protect-spec-files` faz diff
119
126
  semântico e libera Write ou Edit desde que nenhum campo de contrato do plano
120
127
  (`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`)
121
128
  mude e o schema continue válido.
122
129
 
123
- 9. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
130
+ > **Trace automático:** este write de `tasks.json` dispara o hook `trace-autogen`,
131
+ > que gera/atualiza `.morph/traces/YYYY-MM-DD-{feature}-implement.json` a partir de
132
+ > tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
133
+ > manualmente** — a escrita manual foi removida da cerimônia por task.
134
+
135
+ 8. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
124
136
 
125
137
  ## Output esperado
126
138
  - Código implementado conforme o standard consultado (direto ou via sub-agent)
127
139
  - `.morph/features/{feature}/3-implement/recap.md` atualizado com entrada da task concluída
128
140
  - `.morph/features/{feature}/2-plan/tasks.json` com status da task atualizado para `done`
129
141
  - `.morph/features/{feature}/2-plan/decisions.md` atualizado se houver decisão não trivial
142
+ - Trace em `.morph/traces/` gerado automaticamente pelo hook `trace-autogen` (a skill não o escreve)
130
143
 
131
144
  ## Referências
132
145
  - `.morph/framework/standards/STANDARDS.json` — índice de standards (não carregue todos — filtre por task)
@@ -4,7 +4,7 @@ description: Guia a produção dos três artefatos de planejamento de uma featur
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-plan
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-proposal
@@ -35,7 +35,7 @@ Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem inte
35
35
  - Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
36
36
  - Verificar `.morph/features/{feature-name}/`:
37
37
  - Se `0-proposal/proposal.md` existe e tem conteúdo: pular para passo 3.
38
- - Caso contrário: criar a estrutura e seguir o passo 2.
38
+ - Caso contrário: rode `morph-spec create {feature-name}` — cria `.morph/features/{feature-name}/0-proposal/` e o `feature.json` canônico (shape em `.morph/framework/schemas/feature.schema.json`) num passo só, server-side. Não crie a estrutura à mão nem dependa do nascimento implícito via hook no primeiro Write. Depois siga o passo 2.
39
39
 
40
40
  ### 2. Invocar `Skill(morph-brainstorming)`
41
41
 
@@ -4,7 +4,7 @@ description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase review, após todas as tasks de tasks.json estarem com status `done`
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-review
@@ -73,11 +73,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
73
73
  (A barra de avanço por task é 9; uma dimensão individual abaixo de 8 no review da feature
74
74
  inteira é um bloqueante crítico que o loop de correção deveria ter pego.)
75
75
 
76
- 7. Finalize o trace de execução em `.morph/traces/YYYY-MM-DD-{feature}-implement.json`:
77
- - Preencha `phase_summary.tasks_completed`, `tasks_failed`, `avg_eval_score`
78
- - Calcule `standards_most_used` a partir das entradas em `tasks[].standards_consulted`
79
- - Preencha `sub_agents_dispatched` com a contagem de tasks onde `sub_agent_dispatched: true`
80
- - Preencha `completed_at` com o timestamp atual
76
+ 7. **NÃO finalize o trace manualmente.** O hook `trace-autogen` gera e finaliza `.morph/traces/YYYY-MM-DD-{feature}-implement.json` automaticamente (incl. `phase_summary` e `completed_at`) no último write de `tasks.json` — quando a última task sai de `pending`/`in_progress`. Se o trace parecer desatualizado, a causa é um `morph-spec score` faltante ou um recap sem o bloco da task — corrija a fonte, não o trace.
81
77
 
82
78
  8. Apresente o Gate 3 segundo trust mode.
83
79
 
@@ -4,7 +4,7 @@ description: Varre o codebase existente, detecta stack atual, compara com o stac
4
4
  version: core
5
5
  when-to-invoke: ao iniciar uma feature em projeto brownfield (codebase já existente)
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-stack-scan
@@ -4,7 +4,7 @@ description: Localiza e carrega um standard específico do STANDARDS.json sob de
4
4
  version: core
5
5
  when-to-invoke: quando precisar consultar um standard específico durante a implementação
6
6
  user-invokable: true
7
- cliVersion: "7.8.1"
7
+ cliVersion: "7.9.0"
8
8
  ---
9
9
 
10
10
  # morph-standards