@polymorphism-tech/morph-spec 4.10.7 → 4.10.8

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 (122) hide show
  1. package/CLAUDE.md +3 -3
  2. package/LICENSE +71 -71
  3. package/README.md +379 -379
  4. package/bin/morph-spec.js +1 -1
  5. package/claude-plugin.json +14 -14
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +206 -206
  8. package/framework/agents/README.md +14 -14
  9. package/framework/agents/architecture/standards-architect.md +159 -159
  10. package/framework/agents/frontend/blazor-builder.md +13 -0
  11. package/framework/agents/frontend/css-specialist.md +87 -0
  12. package/framework/agents/frontend/nextjs-expert.md +13 -0
  13. package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
  14. package/framework/agents/frontend/ui-ux-designer.md +80 -10
  15. package/framework/agents/infrastructure/azure-architect.md +149 -149
  16. package/framework/agents/infrastructure/infra-architect.md +48 -48
  17. package/framework/agents.json +2268 -2204
  18. package/framework/hooks/README.md +204 -204
  19. package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
  20. package/framework/hooks/shared/phase-utils.js +139 -139
  21. package/framework/hooks/shared/worktree-helpers.js +30 -8
  22. package/framework/rules/csharp-standards.md +13 -13
  23. package/framework/rules/frontend-standards.md +13 -13
  24. package/framework/rules/infrastructure-standards.md +16 -16
  25. package/framework/rules/testing-standards.md +14 -14
  26. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
  27. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
  28. package/framework/skills/level-0-meta/morph-init/SKILL.md +88 -3
  29. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
  30. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
  31. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
  32. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -500
  33. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
  34. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -262
  35. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
  36. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +424 -323
  37. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  38. package/framework/standards/STANDARDS.json +2040 -2040
  39. package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
  40. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
  41. package/framework/templates/README.md +814 -814
  42. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
  43. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
  44. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
  45. package/framework/templates/code/dotnet/contracts/README.md +74 -74
  46. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
  47. package/framework/templates/code/dotnet/frontend/component.razor +239 -239
  48. package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
  49. package/framework/templates/code/dotnet/jobs/job.cs +171 -171
  50. package/framework/templates/code/dotnet/test.cs +239 -239
  51. package/framework/templates/code/sql/rls-policy.sql +57 -57
  52. package/framework/templates/code/sql/supabase-migration.sql +100 -100
  53. package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
  54. package/framework/templates/code/typescript/contracts.ts +168 -168
  55. package/framework/templates/context/CONTEXT.md +181 -181
  56. package/framework/templates/context/design-system.md +211 -0
  57. package/framework/templates/docs/proposal.md +182 -182
  58. package/framework/templates/docs/user-stories.md +34 -34
  59. package/framework/templates/examples/design-system-examples.md +357 -357
  60. package/framework/templates/examples/spec-examples.md +90 -90
  61. package/framework/templates/feature/decisions.md +187 -187
  62. package/framework/templates/feature/recap.md +146 -146
  63. package/framework/templates/feature/tasks.md +199 -199
  64. package/framework/templates/infrastructure/azure/README.md +286 -286
  65. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
  66. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
  67. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
  68. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
  69. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
  70. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  71. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  72. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
  73. package/package.json +82 -82
  74. package/src/commands/agents/index.js +13 -13
  75. package/src/commands/project/install-plugin-cmd.js +28 -28
  76. package/src/commands/project/setup-infra-cmd.js +12 -12
  77. package/src/commands/project/worktree.js +58 -2
  78. package/src/commands/tasks/index.js +4 -4
  79. package/src/commands/templates/index.js +5 -5
  80. package/src/commands/utils/index.js +3 -3
  81. package/src/commands/validation/index.js +4 -4
  82. package/src/core/state/phase-state-machine.js +217 -217
  83. package/src/lib/generators/design-system-generator.js +298 -298
  84. package/src/lib/generators/index.js +10 -10
  85. package/src/lib/generators/metadata-extractor.js +387 -387
  86. package/src/lib/stack-filter.js +65 -65
  87. package/src/lib/standards/index.js +7 -7
  88. package/src/lib/standards/standards-context-injector.js +302 -302
  89. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  90. package/src/lib/validators/architecture/index.js +7 -7
  91. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  92. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  93. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  94. package/src/lib/validators/blazor/index.js +9 -9
  95. package/src/lib/validators/content/content-validator.js +287 -287
  96. package/src/lib/validators/content/index.js +7 -7
  97. package/src/lib/validators/contracts/index.js +7 -7
  98. package/src/lib/validators/css/css-validator.js +352 -352
  99. package/src/lib/validators/css/index.js +7 -7
  100. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  101. package/src/lib/validators/design-system/index.js +7 -7
  102. package/src/lib/validators/nextjs/index.js +6 -6
  103. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  104. package/src/lib/validators/packages/index.js +7 -7
  105. package/src/lib/validators/packages/package-validator.js +360 -360
  106. package/src/lib/validators/shared/index.js +12 -12
  107. package/src/lib/validators/shared/issue-counter.js +18 -18
  108. package/src/lib/validators/shared/result-formatter.js +124 -124
  109. package/src/lib/validators/ui/index.js +7 -7
  110. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  111. package/src/scripts/global-install.js +58 -58
  112. package/src/scripts/install-plugin.js +126 -126
  113. package/src/utils/claude-md-injector.js +90 -90
  114. package/src/utils/file-copier.js +200 -196
  115. package/src/utils/hooks-installer.js +556 -494
  116. package/src/utils/logger.js +32 -32
  117. package/src/utils/skills-installer.js +178 -178
  118. package/src/utils/version-checker.js +175 -175
  119. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  120. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  121. package/framework/templates/.idea/morph-templates.xml +0 -92
  122. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
package/package.json CHANGED
@@ -1,82 +1,82 @@
1
- {
2
- "name": "@polymorphism-tech/morph-spec",
3
- "version": "4.10.7",
4
- "description": "MORPH-SPEC: AI-First development framework with validation pipeline and multi-stack support",
5
- "keywords": [
6
- "claude-code",
7
- "claude",
8
- "ai-coding",
9
- "ai-first",
10
- "spec-driven",
11
- "dotnet",
12
- "dotnet10",
13
- "blazor",
14
- "agent-framework",
15
- "fluent-ui",
16
- "framework",
17
- "developer-tools",
18
- "morph",
19
- "polymorphism",
20
- "micro-saas"
21
- ],
22
- "main": "src/index.js",
23
- "bin": {
24
- "morph-spec": "bin/morph-spec.js"
25
- },
26
- "files": [
27
- "bin/",
28
- "src/",
29
- "framework/",
30
- "claude-plugin.json",
31
- "docs/QUICKSTART.md",
32
- "docs/CHEATSHEET.md",
33
- "README.md",
34
- "LICENSE",
35
- "CLAUDE.md"
36
- ],
37
- "type": "module",
38
- "engines": {
39
- "node": ">=18.0.0"
40
- },
41
- "scripts": {
42
- "start": "node bin/morph-spec.js",
43
- "generate": "node scripts/generate-refs.js",
44
- "test": "node --test --test-concurrency=1",
45
- "test:coverage": "c8 --reporter=text --reporter=html --reporter=lcov node --test --test-concurrency=1",
46
- "test:coverage:summary": "c8 --reporter=text-summary node --test --test-concurrency=1",
47
- "docs": "jsdoc -c jsdoc.json",
48
- "docs:watch": "jsdoc -c jsdoc.json --watch",
49
- "docs:serve": "npx http-server docs/api -p 8080 -o",
50
- "release": "node scripts/release.js",
51
- "postinstall": "node src/scripts/global-install.js"
52
- },
53
- "dependencies": {
54
- "chalk": "^5.3.0",
55
- "commander": "^12.0.0",
56
- "fs-extra": "^11.2.0",
57
- "glob": "^13.0.6",
58
- "handlebars": "^4.7.8",
59
- "inquirer": "^9.2.0",
60
- "minimatch": "^9.0.5",
61
- "ora": "^8.0.0"
62
- },
63
- "repository": {
64
- "type": "git",
65
- "url": "git+https://github.com/lucasPolymorphism/morph-spec-framework.git"
66
- },
67
- "author": "Polymorphism Tech <contact@polymorphism.com.br>",
68
- "license": "SEE LICENSE IN LICENSE",
69
- "homepage": "https://polymorphism.com.br/morph-spec",
70
- "bugs": {
71
- "email": "support@polymorphism.com.br"
72
- },
73
- "private": false,
74
- "publishConfig": {
75
- "access": "public"
76
- },
77
- "devDependencies": {
78
- "c8": "^11.0.0",
79
- "docdash": "^2.0.2",
80
- "jsdoc": "^4.0.5"
81
- }
82
- }
1
+ {
2
+ "name": "@polymorphism-tech/morph-spec",
3
+ "version": "4.10.8",
4
+ "description": "MORPH-SPEC: AI-First development framework with validation pipeline and multi-stack support",
5
+ "keywords": [
6
+ "claude-code",
7
+ "claude",
8
+ "ai-coding",
9
+ "ai-first",
10
+ "spec-driven",
11
+ "dotnet",
12
+ "dotnet10",
13
+ "blazor",
14
+ "agent-framework",
15
+ "fluent-ui",
16
+ "framework",
17
+ "developer-tools",
18
+ "morph",
19
+ "polymorphism",
20
+ "micro-saas"
21
+ ],
22
+ "main": "src/index.js",
23
+ "bin": {
24
+ "morph-spec": "bin/morph-spec.js"
25
+ },
26
+ "files": [
27
+ "bin/",
28
+ "src/",
29
+ "framework/",
30
+ "claude-plugin.json",
31
+ "docs/QUICKSTART.md",
32
+ "docs/CHEATSHEET.md",
33
+ "README.md",
34
+ "LICENSE",
35
+ "CLAUDE.md"
36
+ ],
37
+ "type": "module",
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "scripts": {
42
+ "start": "node bin/morph-spec.js",
43
+ "generate": "node scripts/generate-refs.js",
44
+ "test": "node --test --test-concurrency=1",
45
+ "test:coverage": "c8 --reporter=text --reporter=html --reporter=lcov node --test --test-concurrency=1",
46
+ "test:coverage:summary": "c8 --reporter=text-summary node --test --test-concurrency=1",
47
+ "docs": "jsdoc -c jsdoc.json",
48
+ "docs:watch": "jsdoc -c jsdoc.json --watch",
49
+ "docs:serve": "npx http-server docs/api -p 8080 -o",
50
+ "release": "node scripts/release.js",
51
+ "postinstall": "node src/scripts/global-install.js"
52
+ },
53
+ "dependencies": {
54
+ "chalk": "^5.3.0",
55
+ "commander": "^12.0.0",
56
+ "fs-extra": "^11.2.0",
57
+ "glob": "^13.0.6",
58
+ "handlebars": "^4.7.8",
59
+ "inquirer": "^9.2.0",
60
+ "minimatch": "^9.0.5",
61
+ "ora": "^8.0.0"
62
+ },
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/lucasPolymorphism/morph-spec-framework.git"
66
+ },
67
+ "author": "Polymorphism Tech <contact@polymorphism.com.br>",
68
+ "license": "SEE LICENSE IN LICENSE",
69
+ "homepage": "https://polymorphism.com.br/morph-spec",
70
+ "bugs": {
71
+ "email": "support@polymorphism.com.br"
72
+ },
73
+ "private": false,
74
+ "publishConfig": {
75
+ "access": "public"
76
+ },
77
+ "devDependencies": {
78
+ "c8": "^11.0.0",
79
+ "docdash": "^2.0.2",
80
+ "jsdoc": "^4.0.5"
81
+ }
82
+ }
@@ -1,13 +1,13 @@
1
- /**
2
- * Agent Commands
3
- */
4
- export { dispatchAgentsCommand, buildDispatchConfig } from './dispatch-agents.js';
5
- export { auditDispatchCommand } from './audit-dispatch.js';
6
- export { detectAgentsCommand, detectAgents } from './detect-agents.js';
7
- export {
8
- agentListCommand,
9
- agentShowCommand,
10
- agentAddCommand,
11
- agentEditCommand,
12
- agentRemoveCommand,
13
- } from './manage-agents.js';
1
+ /**
2
+ * Agent Commands
3
+ */
4
+ export { dispatchAgentsCommand, buildDispatchConfig } from './dispatch-agents.js';
5
+ export { auditDispatchCommand } from './audit-dispatch.js';
6
+ export { detectAgentsCommand, detectAgents } from './detect-agents.js';
7
+ export {
8
+ agentListCommand,
9
+ agentShowCommand,
10
+ agentAddCommand,
11
+ agentEditCommand,
12
+ agentRemoveCommand,
13
+ } from './manage-agents.js';
@@ -1,28 +1,28 @@
1
- // src/commands/project/install-plugin-cmd.js
2
- import { installPlugin } from '../../scripts/install-plugin.js';
3
- import { logger } from '../../utils/logger.js';
4
-
5
- export async function installPluginCommand(pluginName, _options) {
6
- if (!pluginName) {
7
- logger.error('Plugin name required. Usage: morph-spec install-plugin <name>');
8
- logger.dim(' Available: superpowers, context7');
9
- process.exit(1);
10
- }
11
- try {
12
- const result = await installPlugin(pluginName);
13
- if (result.alreadyInstalled) {
14
- logger.dim(` ✓ ${pluginName} already installed (${result.version})`);
15
- } else {
16
- logger.success(` ✓ ${pluginName} installed (${result.version})`);
17
- logger.dim(' Restart Claude Code to activate.');
18
- }
19
- } catch (err) {
20
- logger.error(`Failed to install plugin "${pluginName}": ${err.message}`);
21
- logger.blank();
22
- logger.warn('Manual installation:');
23
- logger.dim(' 1. Claude Code → Settings (Cmd/Ctrl+,) → Extensions');
24
- logger.dim(` 2. Browse → search "${pluginName}" → Install`);
25
- logger.dim(' 3. Restart Claude Code');
26
- process.exit(1);
27
- }
28
- }
1
+ // src/commands/project/install-plugin-cmd.js
2
+ import { installPlugin } from '../../scripts/install-plugin.js';
3
+ import { logger } from '../../utils/logger.js';
4
+
5
+ export async function installPluginCommand(pluginName, _options) {
6
+ if (!pluginName) {
7
+ logger.error('Plugin name required. Usage: morph-spec install-plugin <name>');
8
+ logger.dim(' Available: superpowers, context7');
9
+ process.exit(1);
10
+ }
11
+ try {
12
+ const result = await installPlugin(pluginName);
13
+ if (result.alreadyInstalled) {
14
+ logger.dim(` ✓ ${pluginName} already installed (${result.version})`);
15
+ } else {
16
+ logger.success(` ✓ ${pluginName} installed (${result.version})`);
17
+ logger.dim(' Restart Claude Code to activate.');
18
+ }
19
+ } catch (err) {
20
+ logger.error(`Failed to install plugin "${pluginName}": ${err.message}`);
21
+ logger.blank();
22
+ logger.warn('Manual installation:');
23
+ logger.dim(' 1. Claude Code → Settings (Cmd/Ctrl+,) → Extensions');
24
+ logger.dim(` 2. Browse → search "${pluginName}" → Install`);
25
+ logger.dim(' 3. Restart Claude Code');
26
+ process.exit(1);
27
+ }
28
+ }
@@ -1,12 +1,12 @@
1
- import { setupInfra } from '../../scripts/setup-infra.js';
2
- import { logger } from '../../utils/logger.js';
3
-
4
- export async function setupInfraCommand(options) {
5
- const targetPath = options.path || process.cwd();
6
- try {
7
- await setupInfra(targetPath);
8
- } catch (err) {
9
- logger.error(`setup-infra failed: ${err.message}`);
10
- process.exit(1);
11
- }
12
- }
1
+ import { setupInfra } from '../../scripts/setup-infra.js';
2
+ import { logger } from '../../utils/logger.js';
3
+
4
+ export async function setupInfraCommand(options) {
5
+ const targetPath = options.path || process.cwd();
6
+ try {
7
+ await setupInfra(targetPath);
8
+ } catch (err) {
9
+ logger.error(`setup-infra failed: ${err.message}`);
10
+ process.exit(1);
11
+ }
12
+ }
@@ -14,8 +14,8 @@
14
14
  */
15
15
 
16
16
  import { execSync } from 'child_process';
17
- import { existsSync, mkdirSync } from 'fs';
18
- import { join } from 'path';
17
+ import { existsSync, mkdirSync, symlinkSync, linkSync, copyFileSync } from 'fs';
18
+ import { join, resolve, dirname } from 'path';
19
19
 
20
20
  // ── Pure helpers (exported for tests) ──────────────────────────────────────
21
21
 
@@ -93,6 +93,59 @@ function getDateSuffix() {
93
93
  return new Date().toISOString().slice(0, 10).replace(/-/g, '');
94
94
  }
95
95
 
96
+ // ── Infrastructure linking ───────────────────────────────────────────────────
97
+
98
+ /**
99
+ * Create symlinks/junctions in the worktree for shared infrastructure files
100
+ * that are gitignored (state.json, .claude/, .morph/framework/, node_modules/).
101
+ *
102
+ * Uses junctions for directories (no admin required on Windows).
103
+ * File symlinks fall back to copy if symlink fails.
104
+ * Fail-open: any error is silently ignored.
105
+ *
106
+ * @param {string} worktreePath - Absolute path to the worktree
107
+ * @param {string} mainCwd - Absolute path to the main project root
108
+ */
109
+ export function setupInfraLinks(worktreePath, mainCwd) {
110
+ const mainAbs = resolve(mainCwd);
111
+ const wtAbs = resolve(worktreePath);
112
+
113
+ // Directory junctions — shared across worktrees
114
+ const dirLinks = ['node_modules', '.claude'];
115
+
116
+ // .morph/framework/ — client projects (in framework repo, framework/ is tracked)
117
+ if (existsSync(join(mainAbs, '.morph', 'framework'))) {
118
+ dirLinks.push(join('.morph', 'framework'));
119
+ }
120
+
121
+ for (const rel of dirLinks) {
122
+ const target = join(mainAbs, rel);
123
+ const linkPath = join(wtAbs, rel);
124
+ if (!existsSync(target) || existsSync(linkPath)) continue;
125
+ try {
126
+ const parent = dirname(linkPath);
127
+ if (!existsSync(parent)) mkdirSync(parent, { recursive: true });
128
+ symlinkSync(target, linkPath, 'junction');
129
+ } catch { /* fail-open */ }
130
+ }
131
+
132
+ // state.json — shared state via hard link (works on Windows without admin,
133
+ // same NTFS volume). Falls back to symlink, then copy.
134
+ const stateTarget = join(mainAbs, '.morph', 'state.json');
135
+ const stateLink = join(wtAbs, '.morph', 'state.json');
136
+ if (existsSync(stateTarget) && !existsSync(stateLink)) {
137
+ const morphDir = join(wtAbs, '.morph');
138
+ if (!existsSync(morphDir)) {
139
+ try { mkdirSync(morphDir, { recursive: true }); } catch { /* */ }
140
+ }
141
+ try {
142
+ linkSync(stateTarget, stateLink); // hard link — no admin, shared data
143
+ } catch {
144
+ try { copyFileSync(stateTarget, stateLink); } catch { /* fail-open */ }
145
+ }
146
+ }
147
+ }
148
+
96
149
  // ── Command handler ─────────────────────────────────────────────────────────
97
150
 
98
151
  /**
@@ -133,6 +186,9 @@ export async function worktreeSetupCommand(feature, options = {}) {
133
186
  // Add worktree
134
187
  execSync(`git worktree add "${worktreePath}" ${branch}`, { cwd, stdio: 'pipe' });
135
188
 
189
+ // Set up infrastructure symlinks so the worktree has state.json, .claude/, etc.
190
+ setupInfraLinks(worktreePath, cwd);
191
+
136
192
  // Persist in state (non-blocking — feature may not be in state yet)
137
193
  try {
138
194
  const { loadState, saveState } = await import('../../lib/state/state-manager.js');
@@ -1,4 +1,4 @@
1
- /**
2
- * Task Management Commands
3
- */
4
- export { taskCommand } from './task.js';
1
+ /**
2
+ * Task Management Commands
3
+ */
4
+ export { taskCommand } from './task.js';
@@ -1,5 +1,5 @@
1
- /**
2
- * Template Commands
3
- */
4
- export { templateRenderCommand } from './template-render.js';
5
- export { generateContractsCommand, parseSchemaAnalysisMd } from './generate-contracts.js';
1
+ /**
2
+ * Template Commands
3
+ */
4
+ export { templateRenderCommand } from './template-render.js';
5
+ export { generateContractsCommand, parseSchemaAnalysisMd } from './generate-contracts.js';
@@ -1,3 +1,3 @@
1
- /**
2
- * Utility Commands — no active commands after CLI simplification
3
- */
1
+ /**
2
+ * Utility Commands — no active commands after CLI simplification
3
+ */
@@ -1,4 +1,4 @@
1
- /**
2
- * Validation Commands
3
- */
4
- export { validateFeatureCommand } from './validate-feature.js';
1
+ /**
2
+ * Validation Commands
3
+ */
4
+ export { validateFeatureCommand } from './validate-feature.js';