@polymorphism-tech/morph-spec 4.10.7 → 4.10.9

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 (123) 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 +136 -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 +457 -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/detectors/design-system-detector.js +73 -31
  84. package/src/lib/generators/design-system-generator.js +298 -298
  85. package/src/lib/generators/index.js +10 -10
  86. package/src/lib/generators/metadata-extractor.js +387 -387
  87. package/src/lib/stack-filter.js +65 -65
  88. package/src/lib/standards/index.js +7 -7
  89. package/src/lib/standards/standards-context-injector.js +302 -302
  90. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  91. package/src/lib/validators/architecture/index.js +7 -7
  92. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  93. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  94. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  95. package/src/lib/validators/blazor/index.js +9 -9
  96. package/src/lib/validators/content/content-validator.js +287 -287
  97. package/src/lib/validators/content/index.js +7 -7
  98. package/src/lib/validators/contracts/index.js +7 -7
  99. package/src/lib/validators/css/css-validator.js +352 -352
  100. package/src/lib/validators/css/index.js +7 -7
  101. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  102. package/src/lib/validators/design-system/index.js +7 -7
  103. package/src/lib/validators/nextjs/index.js +6 -6
  104. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  105. package/src/lib/validators/packages/index.js +7 -7
  106. package/src/lib/validators/packages/package-validator.js +360 -360
  107. package/src/lib/validators/shared/index.js +12 -12
  108. package/src/lib/validators/shared/issue-counter.js +18 -18
  109. package/src/lib/validators/shared/result-formatter.js +124 -124
  110. package/src/lib/validators/ui/index.js +7 -7
  111. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  112. package/src/scripts/global-install.js +58 -58
  113. package/src/scripts/install-plugin.js +126 -126
  114. package/src/utils/claude-md-injector.js +90 -90
  115. package/src/utils/file-copier.js +200 -196
  116. package/src/utils/hooks-installer.js +556 -494
  117. package/src/utils/logger.js +32 -32
  118. package/src/utils/skills-installer.js +178 -178
  119. package/src/utils/version-checker.js +175 -175
  120. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  121. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  122. package/framework/templates/.idea/morph-templates.xml +0 -92
  123. 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.9",
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';