@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.
- package/CLAUDE.md +3 -3
- package/LICENSE +71 -71
- package/README.md +379 -379
- package/bin/morph-spec.js +1 -1
- package/claude-plugin.json +14 -14
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +206 -206
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/blazor-builder.md +13 -0
- package/framework/agents/frontend/css-specialist.md +87 -0
- package/framework/agents/frontend/nextjs-expert.md +13 -0
- package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
- package/framework/agents/frontend/ui-ux-designer.md +80 -10
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/agents.json +2268 -2204
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/hooks/shared/worktree-helpers.js +30 -8
- package/framework/rules/csharp-standards.md +13 -13
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +16 -16
- package/framework/rules/testing-standards.md +14 -14
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-init/SKILL.md +136 -3
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -500
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -262
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +457 -323
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +2040 -2040
- package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/templates/README.md +814 -814
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
- package/framework/templates/code/dotnet/contracts/README.md +74 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
- package/framework/templates/code/dotnet/frontend/component.razor +239 -239
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
- package/framework/templates/code/dotnet/jobs/job.cs +171 -171
- package/framework/templates/code/dotnet/test.cs +239 -239
- package/framework/templates/code/sql/rls-policy.sql +57 -57
- package/framework/templates/code/sql/supabase-migration.sql +100 -100
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
- package/framework/templates/code/typescript/contracts.ts +168 -168
- package/framework/templates/context/CONTEXT.md +181 -181
- package/framework/templates/context/design-system.md +211 -0
- package/framework/templates/docs/proposal.md +182 -182
- package/framework/templates/docs/user-stories.md +34 -34
- package/framework/templates/examples/design-system-examples.md +357 -357
- package/framework/templates/examples/spec-examples.md +90 -90
- package/framework/templates/feature/decisions.md +187 -187
- package/framework/templates/feature/recap.md +146 -146
- package/framework/templates/feature/tasks.md +199 -199
- package/framework/templates/infrastructure/azure/README.md +286 -286
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
- package/package.json +82 -82
- package/src/commands/agents/index.js +13 -13
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/project/worktree.js +58 -2
- package/src/commands/tasks/index.js +4 -4
- package/src/commands/templates/index.js +5 -5
- package/src/commands/utils/index.js +3 -3
- package/src/commands/validation/index.js +4 -4
- package/src/core/state/phase-state-machine.js +217 -217
- package/src/lib/detectors/design-system-detector.js +73 -31
- package/src/lib/generators/design-system-generator.js +298 -298
- package/src/lib/generators/index.js +10 -10
- package/src/lib/generators/metadata-extractor.js +387 -387
- package/src/lib/stack-filter.js +65 -65
- package/src/lib/standards/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/validators/architecture/architecture-validator.js +387 -387
- package/src/lib/validators/architecture/index.js +7 -7
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
- package/src/lib/validators/blazor/blazor-validator.js +369 -369
- package/src/lib/validators/blazor/index.js +9 -9
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/content/index.js +7 -7
- package/src/lib/validators/contracts/index.js +7 -7
- package/src/lib/validators/css/css-validator.js +352 -352
- package/src/lib/validators/css/index.js +7 -7
- package/src/lib/validators/design-system/design-system-validator.js +231 -231
- package/src/lib/validators/design-system/index.js +7 -7
- package/src/lib/validators/nextjs/index.js +6 -6
- package/src/lib/validators/nextjs/next-component-validator.js +183 -183
- package/src/lib/validators/packages/index.js +7 -7
- package/src/lib/validators/packages/package-validator.js +360 -360
- package/src/lib/validators/shared/index.js +12 -12
- package/src/lib/validators/shared/issue-counter.js +18 -18
- package/src/lib/validators/shared/result-formatter.js +124 -124
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/scripts/global-install.js +58 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/file-copier.js +200 -196
- package/src/utils/hooks-installer.js +556 -494
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +175 -175
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
package/src/lib/stack-filter.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse `stacks:` from YAML frontmatter content.
|
|
3
|
-
* Returns ['*'] if no stacks field found (backwards compatible — always install).
|
|
4
|
-
*
|
|
5
|
-
* Supports:
|
|
6
|
-
* stacks:\n - dotnet\n - blazor (YAML list)
|
|
7
|
-
* stacks: [dotnet, blazor] (inline array)
|
|
8
|
-
*
|
|
9
|
-
* @param {string} content - Raw file content with YAML frontmatter
|
|
10
|
-
* @returns {string[]}
|
|
11
|
-
*/
|
|
12
|
-
export function parseStacks(content) {
|
|
13
|
-
const normalized = content.replace(/\r\n/g, '\n');
|
|
14
|
-
const fmMatch = normalized.match(/^---\n([\s\S]*?)\n---/);
|
|
15
|
-
if (!fmMatch) return ['*'];
|
|
16
|
-
|
|
17
|
-
const fm = fmMatch[1];
|
|
18
|
-
|
|
19
|
-
// Try inline format: stacks: [dotnet, blazor]
|
|
20
|
-
const inlineMatch = fm.match(/^stacks:\s*\[([^\]]*)\]/m);
|
|
21
|
-
if (inlineMatch) {
|
|
22
|
-
const items = inlineMatch[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
23
|
-
return items.length > 0 ? items : ['*'];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Try YAML list format: stacks:\n - dotnet\n - blazor
|
|
27
|
-
const listMatch = fm.match(/^stacks:\s*\n((?:\s+-\s+.+\n?)*)/m);
|
|
28
|
-
if (listMatch) {
|
|
29
|
-
const items = listMatch[1]
|
|
30
|
-
.split('\n')
|
|
31
|
-
.map(line => line.replace(/^\s+-\s+/, '').replace(/["']/g, '').trim())
|
|
32
|
-
.filter(Boolean);
|
|
33
|
-
return items.length > 0 ? items : ['*'];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return ['*'];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Extract project tags from config object.
|
|
41
|
-
* Combines stack tags (from `project.stack` split by '-' or '+')
|
|
42
|
-
* with integration tags (from `project.integrations` array).
|
|
43
|
-
* Deduplicates the result.
|
|
44
|
-
*/
|
|
45
|
-
export function getProjectTags(config) {
|
|
46
|
-
const stack = config?.project?.stack;
|
|
47
|
-
const stackTags = (stack && typeof stack === 'string')
|
|
48
|
-
? stack.split(/[-+]/).filter(Boolean)
|
|
49
|
-
: [];
|
|
50
|
-
const integrations = Array.isArray(config?.project?.integrations)
|
|
51
|
-
? config.project.integrations
|
|
52
|
-
: [];
|
|
53
|
-
return [...new Set([...stackTags, ...integrations])];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Determine if an asset should be installed for the given project tags.
|
|
58
|
-
* - stacks includes '*' → always install
|
|
59
|
-
* - stacks is empty → treat as '*' (backwards compatible)
|
|
60
|
-
* - Otherwise → install if intersection with projectTags is non-empty
|
|
61
|
-
*/
|
|
62
|
-
export function shouldInstall(assetStacks, projectTags) {
|
|
63
|
-
if (assetStacks.length === 0 || assetStacks.includes('*')) return true;
|
|
64
|
-
return assetStacks.some(s => projectTags.includes(s));
|
|
65
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Parse `stacks:` from YAML frontmatter content.
|
|
3
|
+
* Returns ['*'] if no stacks field found (backwards compatible — always install).
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* stacks:\n - dotnet\n - blazor (YAML list)
|
|
7
|
+
* stacks: [dotnet, blazor] (inline array)
|
|
8
|
+
*
|
|
9
|
+
* @param {string} content - Raw file content with YAML frontmatter
|
|
10
|
+
* @returns {string[]}
|
|
11
|
+
*/
|
|
12
|
+
export function parseStacks(content) {
|
|
13
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
14
|
+
const fmMatch = normalized.match(/^---\n([\s\S]*?)\n---/);
|
|
15
|
+
if (!fmMatch) return ['*'];
|
|
16
|
+
|
|
17
|
+
const fm = fmMatch[1];
|
|
18
|
+
|
|
19
|
+
// Try inline format: stacks: [dotnet, blazor]
|
|
20
|
+
const inlineMatch = fm.match(/^stacks:\s*\[([^\]]*)\]/m);
|
|
21
|
+
if (inlineMatch) {
|
|
22
|
+
const items = inlineMatch[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
23
|
+
return items.length > 0 ? items : ['*'];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Try YAML list format: stacks:\n - dotnet\n - blazor
|
|
27
|
+
const listMatch = fm.match(/^stacks:\s*\n((?:\s+-\s+.+\n?)*)/m);
|
|
28
|
+
if (listMatch) {
|
|
29
|
+
const items = listMatch[1]
|
|
30
|
+
.split('\n')
|
|
31
|
+
.map(line => line.replace(/^\s+-\s+/, '').replace(/["']/g, '').trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
return items.length > 0 ? items : ['*'];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return ['*'];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Extract project tags from config object.
|
|
41
|
+
* Combines stack tags (from `project.stack` split by '-' or '+')
|
|
42
|
+
* with integration tags (from `project.integrations` array).
|
|
43
|
+
* Deduplicates the result.
|
|
44
|
+
*/
|
|
45
|
+
export function getProjectTags(config) {
|
|
46
|
+
const stack = config?.project?.stack;
|
|
47
|
+
const stackTags = (stack && typeof stack === 'string')
|
|
48
|
+
? stack.split(/[-+]/).filter(Boolean)
|
|
49
|
+
: [];
|
|
50
|
+
const integrations = Array.isArray(config?.project?.integrations)
|
|
51
|
+
? config.project.integrations
|
|
52
|
+
: [];
|
|
53
|
+
return [...new Set([...stackTags, ...integrations])];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Determine if an asset should be installed for the given project tags.
|
|
58
|
+
* - stacks includes '*' → always install
|
|
59
|
+
* - stacks is empty → treat as '*' (backwards compatible)
|
|
60
|
+
* - Otherwise → install if intersection with projectTags is non-empty
|
|
61
|
+
*/
|
|
62
|
+
export function shouldInstall(assetStacks, projectTags) {
|
|
63
|
+
if (assetStacks.length === 0 || assetStacks.includes('*')) return true;
|
|
64
|
+
return assetStacks.some(s => projectTags.includes(s));
|
|
65
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Standards Utilities
|
|
3
|
-
*
|
|
4
|
-
* Injects relevant coding standards and architectural guidelines into LLM context.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export * from './standards-context-injector.js';
|
|
1
|
+
/**
|
|
2
|
+
* Standards Utilities
|
|
3
|
+
*
|
|
4
|
+
* Injects relevant coding standards and architectural guidelines into LLM context.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export * from './standards-context-injector.js';
|