@polymorphism-tech/morph-spec 8.29.0 → 8.32.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/CLAUDE.md +11 -1
  2. package/README.md +13 -2
  3. package/bin/morph-spec.js +67 -1
  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 +4 -1
  9. package/framework/MORPH.md +4 -3
  10. package/framework/agents.json +6 -6
  11. package/framework/commands/morph-status.md +1 -1
  12. package/framework/docs/CLI.md +68 -45
  13. package/framework/evals/rubrics/code-quality.md +17 -0
  14. package/framework/evals/rubrics/condensed.md +3 -1
  15. package/framework/hooks/claude-code/statusline.sh +11 -11
  16. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  17. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  18. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  19. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  20. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  21. package/framework/hooks/shared/phase-utils.js +2 -0
  22. package/framework/hooks/shared/stdin-reader.js +26 -26
  23. package/framework/mcp/registry.json +39 -4
  24. package/framework/rubrics/backend.json +2 -2
  25. package/framework/rubrics/default.json +2 -2
  26. package/framework/rubrics/frontend.json +2 -2
  27. package/framework/schemas/tasks.schema.json +25 -0
  28. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  29. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  30. package/framework/skills/core/morph-apply/SKILL.md +14 -4
  31. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  32. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  33. package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
  34. package/framework/skills/core/morph-implement/SKILL.md +12 -2
  35. package/framework/skills/core/morph-plan/SKILL.md +45 -3
  36. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  37. package/framework/skills/core/morph-review/SKILL.md +12 -4
  38. package/framework/skills/core/morph-stack-scan/SKILL.md +13 -1
  39. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  40. package/framework/skills/core/morph-uiux/SKILL.md +1 -1
  41. package/framework/standards/ai-agents/agent-session.md +160 -160
  42. package/framework/standards/ai-agents/batching.md +193 -193
  43. package/framework/standards/ai-agents/context-providers.md +188 -188
  44. package/framework/standards/ai-agents/mcp-server.md +250 -250
  45. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  46. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  47. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  48. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  49. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  50. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  51. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  52. package/framework/standards/ai-agents/production.md +231 -231
  53. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  54. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  55. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  56. package/framework/standards/ai-agents/structured-output.md +249 -249
  57. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  58. package/framework/templates/.idea/morph-templates.xml +92 -0
  59. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  60. package/framework/templates/IDE-SNIPPETS.md +262 -262
  61. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  62. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  63. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  64. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  65. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  66. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  67. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  68. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  69. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  70. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  71. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  72. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  73. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  74. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  75. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  76. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  77. package/framework/templates/code/typescript/contracts.ts +167 -167
  78. package/framework/templates/context/ARCHITECTURE.md +20 -0
  79. package/framework/templates/docs/clarifications.md +253 -253
  80. package/framework/templates/docs/schema-analysis.md +119 -119
  81. package/framework/templates/docs/ui-components.md +52 -52
  82. package/framework/templates/docs/ui-design-system.md +76 -76
  83. package/framework/templates/docs/ui-flows.md +167 -167
  84. package/framework/templates/docs/ui-mockups.md +98 -98
  85. package/framework/templates/feature/decisions.md +122 -122
  86. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  87. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  88. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  89. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  90. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  91. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  92. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  93. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  94. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  95. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  96. package/framework/templates/infrastructure/github/README.md +56 -56
  97. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  98. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  99. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  100. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  101. package/framework/templates/integrations/asaas-client.cs +387 -387
  102. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  103. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  104. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  105. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  106. package/framework/templates/project/validate.js +120 -120
  107. package/framework/templates/state.template.json +17 -17
  108. package/framework/templates/ui/design-system.css +226 -226
  109. package/package.json +1 -1
  110. package/src/commands/dashboard/dashboard.js +53 -53
  111. package/src/commands/graph/affected.js +89 -0
  112. package/src/commands/graph/build.js +94 -0
  113. package/src/commands/graph/explain.js +96 -0
  114. package/src/commands/graph/status.js +93 -0
  115. package/src/commands/index.js +13 -13
  116. package/src/commands/project/branch.js +170 -0
  117. package/src/commands/project/checkpoint.js +209 -209
  118. package/src/commands/project/doctor.js +148 -9
  119. package/src/commands/project/fleet.js +10 -3
  120. package/src/commands/project/worktree.js +73 -50
  121. package/src/commands/state/finish.js +41 -26
  122. package/src/commands/state/list.js +79 -6
  123. package/src/core/paths/output-schema.js +7 -0
  124. package/src/core/state/lifecycle-audit.js +127 -0
  125. package/src/core/state/phase-state-machine.js +197 -197
  126. package/src/core/templates/template-renderer.js +477 -477
  127. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  128. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  129. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  130. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  131. package/src/dashboard/app/main.jsx +13 -13
  132. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  133. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  134. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  135. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  136. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  137. package/src/dashboard/app/pages/Standards.jsx +332 -332
  138. package/src/dashboard/app/styles/index.css +47 -47
  139. package/src/dashboard/index.html +12 -12
  140. package/src/dashboard/package.json +24 -24
  141. package/src/dashboard/scanner/phases-scanner.js +15 -15
  142. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  143. package/src/dashboard/scanner/rules-scanner.js +37 -37
  144. package/src/dashboard/scanner/skills-scanner.js +43 -43
  145. package/src/dashboard/scanner/squads-scanner.js +13 -13
  146. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  147. package/src/dashboard/vite.config.js +24 -24
  148. package/src/lib/detectors/design-system-detector.js +188 -188
  149. package/src/lib/detectors/index.js +217 -217
  150. package/src/lib/generators/architecture-scanner.js +45 -4
  151. package/src/lib/generators/design-system-generator.js +508 -508
  152. package/src/lib/generators/settings-generator.js +209 -209
  153. package/src/lib/git/branch-classifier.js +177 -0
  154. package/src/lib/git/gh.js +30 -0
  155. package/src/lib/git/pending-prs.js +89 -0
  156. package/src/lib/git/pr-index.js +70 -0
  157. package/src/lib/graph/god-nodes.js +75 -0
  158. package/src/lib/graph/graph-health.js +61 -0
  159. package/src/lib/graph/graph-loader.js +86 -0
  160. package/src/lib/graph/graphify-runtime.js +100 -0
  161. package/src/lib/graph/graphifyignore.js +86 -0
  162. package/src/lib/graph/sanitize.js +280 -0
  163. package/src/lib/hooks/hook-executor.js +167 -167
  164. package/src/lib/installers/mcp-installer.js +719 -719
  165. package/src/lib/tasks/task-classifier.js +30 -30
  166. package/src/lib/tasks/task-parser.js +209 -209
  167. package/src/lib/tasks/tasks-json-parser.js +26 -0
  168. package/src/lib/validators/checkpoint-persistence.js +39 -39
  169. package/src/lib/validators/css/css-validator.js +340 -340
  170. package/src/lib/validators/reuse/index.js +10 -0
  171. package/src/lib/validators/reuse/reuse-validator.js +324 -0
  172. package/src/lib/validators/reuse/symbol-scanner.js +144 -0
  173. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  174. package/src/lib/validators/shared/issue-counter.js +14 -14
  175. package/src/lib/validators/validation-runner.js +40 -1
  176. package/src/lib/worktree/fleet-scanner.js +51 -21
  177. package/src/lib/worktree/ignored-triage.js +197 -0
  178. package/src/lib/worktree/worktree-audit.js +200 -35
  179. package/src/scripts/setup-infra.js +60 -1
  180. package/src/utils/agent-id-mapper.js +11 -11
  181. package/src/utils/claude-settings-manager.js +300 -300
  182. package/src/utils/file-copier.js +40 -0
  183. package/src/utils/skills-installer.js +187 -187
@@ -1,120 +1,120 @@
1
- #!/usr/bin/env node
2
- /**
3
- * bin/validate.js — generated by morph-spec setup-infra
4
- *
5
- * Thin validator entry-point called by morph-spec validate-completion hook:
6
- * node bin/validate.js <validator> [--json]
7
- *
8
- * Supported validators: architecture, nextjs-component,
9
- * packages, design-system, ui-contrast, css
10
- *
11
- * Exits 0 on pass, 1 on validation errors.
12
- * --json flag prints structured JSON to stdout.
13
- */
14
-
15
- const validator = process.argv[2];
16
- const isJson = process.argv.includes('--json');
17
-
18
- if (!validator) {
19
- console.error('Usage: node bin/validate.js <validator> [--json]');
20
- process.exit(1);
21
- }
22
-
23
- const { execSync } = await import('child_process');
24
- const { existsSync } = await import('fs');
25
- const { join } = await import('path');
26
-
27
- const cwd = process.cwd();
28
-
29
- const results = {
30
- validator,
31
- errors: 0,
32
- warnings: 0,
33
- passed: true,
34
- issues: [],
35
- };
36
-
37
- /**
38
- * Run a shell command and capture output.
39
- * Returns { success, stdout, stderr }.
40
- */
41
- function runCommand(cmd, options = {}) {
42
- try {
43
- const stdout = execSync(cmd, { cwd, stdio: ['pipe', 'pipe', 'pipe'], ...options }).toString();
44
- return { success: true, stdout, stderr: '' };
45
- } catch (err) {
46
- return {
47
- success: false,
48
- stdout: err.stdout?.toString() || '',
49
- stderr: err.stderr?.toString() || err.message,
50
- };
51
- }
52
- }
53
-
54
- // ── Stack detection ───────────────────────────────────────────────────────────
55
-
56
- const hasFrontend = existsSync(join(cwd, 'src/frontend')) || existsSync(join(cwd, 'frontend'));
57
- const hasBackend = existsSync(join(cwd, 'src/backend')) || existsSync(join(cwd, 'backend'));
58
- const hasSln = existsSync(join(cwd, 'src/backend/backend.sln')) ||
59
- existsSync(join(cwd, 'src/backend/Backend.sln'));
60
-
61
- const frontendDir = existsSync(join(cwd, 'src/frontend')) ? 'src/frontend' : 'frontend';
62
- const backendDir = existsSync(join(cwd, 'src/backend')) ? 'src/backend' : 'backend';
63
-
64
- // ── Validator dispatch ────────────────────────────────────────────────────────
65
-
66
- switch (validator) {
67
- case 'architecture': {
68
- if (hasBackend && hasSln) {
69
- const slnFile = hasSln ? (
70
- existsSync(join(cwd, 'src/backend/backend.sln')) ? 'backend.sln' : 'Backend.sln'
71
- ) : '.';
72
- const result = runCommand(`dotnet build ${slnFile} --no-restore -warnaserror`, { cwd: join(cwd, backendDir) });
73
- if (!result.success) {
74
- results.errors++;
75
- results.passed = false;
76
- results.issues.push({ level: 'error', message: `dotnet build failed: ${result.stderr.split('\n')[0]}` });
77
- }
78
- }
79
- break;
80
- }
81
-
82
- case 'nextjs-component':
83
- case 'packages':
84
- case 'design-system': {
85
- if (hasFrontend) {
86
- const result = runCommand('npx tsc --noEmit', { cwd: join(cwd, frontendDir) });
87
- if (!result.success) {
88
- results.errors++;
89
- results.passed = false;
90
- results.issues.push({ level: 'error', message: `TypeScript errors found. Run: npx tsc --noEmit` });
91
- }
92
- }
93
- break;
94
- }
95
-
96
- case 'ui-contrast':
97
- case 'css': {
98
- // CSS/contrast validators are visual — report as informational
99
- results.issues.push({ level: 'info', message: `${validator} requires manual review` });
100
- break;
101
- }
102
-
103
- default:
104
- results.issues.push({ level: 'warning', message: `Unknown validator: ${validator}` });
105
- break;
106
- }
107
-
108
- // ── Output ────────────────────────────────────────────────────────────────────
109
-
110
- if (isJson) {
111
- console.log(JSON.stringify(results, null, 2));
112
- } else {
113
- const icon = results.passed ? '✅' : '❌';
114
- console.log(`${icon} Validator: ${validator} — ${results.passed ? 'PASSED' : `FAILED (${results.errors} errors)`}`);
115
- for (const issue of results.issues) {
116
- console.log(` [${issue.level}] ${issue.message}`);
117
- }
118
- }
119
-
120
- process.exit(results.passed ? 0 : 1);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bin/validate.js — generated by morph-spec setup-infra
4
+ *
5
+ * Thin validator entry-point called by morph-spec validate-completion hook:
6
+ * node bin/validate.js <validator> [--json]
7
+ *
8
+ * Supported validators: architecture, nextjs-component,
9
+ * packages, design-system, ui-contrast, css
10
+ *
11
+ * Exits 0 on pass, 1 on validation errors.
12
+ * --json flag prints structured JSON to stdout.
13
+ */
14
+
15
+ const validator = process.argv[2];
16
+ const isJson = process.argv.includes('--json');
17
+
18
+ if (!validator) {
19
+ console.error('Usage: node bin/validate.js <validator> [--json]');
20
+ process.exit(1);
21
+ }
22
+
23
+ const { execSync } = await import('child_process');
24
+ const { existsSync } = await import('fs');
25
+ const { join } = await import('path');
26
+
27
+ const cwd = process.cwd();
28
+
29
+ const results = {
30
+ validator,
31
+ errors: 0,
32
+ warnings: 0,
33
+ passed: true,
34
+ issues: [],
35
+ };
36
+
37
+ /**
38
+ * Run a shell command and capture output.
39
+ * Returns { success, stdout, stderr }.
40
+ */
41
+ function runCommand(cmd, options = {}) {
42
+ try {
43
+ const stdout = execSync(cmd, { cwd, stdio: ['pipe', 'pipe', 'pipe'], ...options }).toString();
44
+ return { success: true, stdout, stderr: '' };
45
+ } catch (err) {
46
+ return {
47
+ success: false,
48
+ stdout: err.stdout?.toString() || '',
49
+ stderr: err.stderr?.toString() || err.message,
50
+ };
51
+ }
52
+ }
53
+
54
+ // ── Stack detection ───────────────────────────────────────────────────────────
55
+
56
+ const hasFrontend = existsSync(join(cwd, 'src/frontend')) || existsSync(join(cwd, 'frontend'));
57
+ const hasBackend = existsSync(join(cwd, 'src/backend')) || existsSync(join(cwd, 'backend'));
58
+ const hasSln = existsSync(join(cwd, 'src/backend/backend.sln')) ||
59
+ existsSync(join(cwd, 'src/backend/Backend.sln'));
60
+
61
+ const frontendDir = existsSync(join(cwd, 'src/frontend')) ? 'src/frontend' : 'frontend';
62
+ const backendDir = existsSync(join(cwd, 'src/backend')) ? 'src/backend' : 'backend';
63
+
64
+ // ── Validator dispatch ────────────────────────────────────────────────────────
65
+
66
+ switch (validator) {
67
+ case 'architecture': {
68
+ if (hasBackend && hasSln) {
69
+ const slnFile = hasSln ? (
70
+ existsSync(join(cwd, 'src/backend/backend.sln')) ? 'backend.sln' : 'Backend.sln'
71
+ ) : '.';
72
+ const result = runCommand(`dotnet build ${slnFile} --no-restore -warnaserror`, { cwd: join(cwd, backendDir) });
73
+ if (!result.success) {
74
+ results.errors++;
75
+ results.passed = false;
76
+ results.issues.push({ level: 'error', message: `dotnet build failed: ${result.stderr.split('\n')[0]}` });
77
+ }
78
+ }
79
+ break;
80
+ }
81
+
82
+ case 'nextjs-component':
83
+ case 'packages':
84
+ case 'design-system': {
85
+ if (hasFrontend) {
86
+ const result = runCommand('npx tsc --noEmit', { cwd: join(cwd, frontendDir) });
87
+ if (!result.success) {
88
+ results.errors++;
89
+ results.passed = false;
90
+ results.issues.push({ level: 'error', message: `TypeScript errors found. Run: npx tsc --noEmit` });
91
+ }
92
+ }
93
+ break;
94
+ }
95
+
96
+ case 'ui-contrast':
97
+ case 'css': {
98
+ // CSS/contrast validators are visual — report as informational
99
+ results.issues.push({ level: 'info', message: `${validator} requires manual review` });
100
+ break;
101
+ }
102
+
103
+ default:
104
+ results.issues.push({ level: 'warning', message: `Unknown validator: ${validator}` });
105
+ break;
106
+ }
107
+
108
+ // ── Output ────────────────────────────────────────────────────────────────────
109
+
110
+ if (isJson) {
111
+ console.log(JSON.stringify(results, null, 2));
112
+ } else {
113
+ const icon = results.passed ? '✅' : '❌';
114
+ console.log(`${icon} Validator: ${validator} — ${results.passed ? 'PASSED' : `FAILED (${results.errors} errors)`}`);
115
+ for (const issue of results.issues) {
116
+ console.log(` [${issue.level}] ${issue.message}`);
117
+ }
118
+ }
119
+
120
+ process.exit(results.passed ? 0 : 1);
@@ -1,17 +1,17 @@
1
- {
2
- "version": "3.0.0",
3
- "project": {
4
- "name": "{{PROJECT_NAME}}",
5
- "type": "{{PROJECT_TYPE}}",
6
- "createdAt": "{{TIMESTAMP}}",
7
- "updatedAt": "{{TIMESTAMP}}"
8
- },
9
- "features": {},
10
- "threads": {},
11
- "metadata": {
12
- "totalFeatures": 0,
13
- "completedFeatures": 0,
14
- "totalTimeSpent": 0,
15
- "lastUpdated": "{{TIMESTAMP}}"
16
- }
17
- }
1
+ {
2
+ "version": "3.0.0",
3
+ "project": {
4
+ "name": "{{PROJECT_NAME}}",
5
+ "type": "{{PROJECT_TYPE}}",
6
+ "createdAt": "{{TIMESTAMP}}",
7
+ "updatedAt": "{{TIMESTAMP}}"
8
+ },
9
+ "features": {},
10
+ "threads": {},
11
+ "metadata": {
12
+ "totalFeatures": 0,
13
+ "completedFeatures": 0,
14
+ "totalTimeSpent": 0,
15
+ "lastUpdated": "{{TIMESTAMP}}"
16
+ }
17
+ }