@polymorphism-tech/morph-spec 4.10.8 → 4.10.10
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 +2 -2
- package/bin/morph-spec.js +22 -0
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/shared/phase-utils.js +139 -139
- 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-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-init/SKILL.md +57 -9
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +49 -16
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +2338 -2041
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- 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/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 +1 -1
- package/src/commands/agents/dispatch-agents.js +17 -0
- package/src/commands/agents/index.js +13 -13
- package/src/commands/agents/project-metrics.js +74 -0
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/standards/context-budget.js +89 -0
- 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/agents/metrics-aggregator.js +56 -0
- 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/digest-builder.js +57 -3
- 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 -200
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +175 -175
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared validator utilities
|
|
3
|
-
*
|
|
4
|
-
* Common functionality used across multiple validators.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { countIssues } from './issue-counter.js';
|
|
8
|
-
export {
|
|
9
|
-
formatValidationSummary,
|
|
10
|
-
formatValidationIssues,
|
|
11
|
-
formatValidationStatus,
|
|
12
|
-
} from './result-formatter.js';
|
|
1
|
+
/**
|
|
2
|
+
* Shared validator utilities
|
|
3
|
+
*
|
|
4
|
+
* Common functionality used across multiple validators.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { countIssues } from './issue-counter.js';
|
|
8
|
+
export {
|
|
9
|
+
formatValidationSummary,
|
|
10
|
+
formatValidationIssues,
|
|
11
|
+
formatValidationStatus,
|
|
12
|
+
} from './result-formatter.js';
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared issue counting utility for validators
|
|
3
|
-
*
|
|
4
|
-
* Consolidates duplicate implementations from:
|
|
5
|
-
* - blazor-validator.js
|
|
6
|
-
* - blazor-state-validator.js
|
|
7
|
-
* - blazor-concurrency-analyzer.js
|
|
8
|
-
*
|
|
9
|
-
* @param {Array} issues - Array of validation issues with type property
|
|
10
|
-
* @returns {{errors: number, warnings: number, infos: number}} Count by type
|
|
11
|
-
*/
|
|
12
|
-
export function countIssues(issues) {
|
|
13
|
-
return {
|
|
14
|
-
errors: issues.filter((i) => i.type === 'error').length,
|
|
15
|
-
warnings: issues.filter((i) => i.type === 'warning').length,
|
|
16
|
-
infos: issues.filter((i) => i.type === 'info').length,
|
|
17
|
-
};
|
|
18
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Shared issue counting utility for validators
|
|
3
|
+
*
|
|
4
|
+
* Consolidates duplicate implementations from:
|
|
5
|
+
* - blazor-validator.js
|
|
6
|
+
* - blazor-state-validator.js
|
|
7
|
+
* - blazor-concurrency-analyzer.js
|
|
8
|
+
*
|
|
9
|
+
* @param {Array} issues - Array of validation issues with type property
|
|
10
|
+
* @returns {{errors: number, warnings: number, infos: number}} Count by type
|
|
11
|
+
*/
|
|
12
|
+
export function countIssues(issues) {
|
|
13
|
+
return {
|
|
14
|
+
errors: issues.filter((i) => i.type === 'error').length,
|
|
15
|
+
warnings: issues.filter((i) => i.type === 'warning').length,
|
|
16
|
+
infos: issues.filter((i) => i.type === 'info').length,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared validation result formatting utilities
|
|
3
|
-
*
|
|
4
|
-
* Provides common formatting patterns for validation results.
|
|
5
|
-
* Domain-specific formatters (CSS, template, etc.) can extend these.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Format a generic validation result summary
|
|
12
|
-
*
|
|
13
|
-
* @param {Object} summary - Validation summary object
|
|
14
|
-
* @param {string} title - Title for the results section
|
|
15
|
-
* @returns {string[]} Array of formatted lines
|
|
16
|
-
*/
|
|
17
|
-
export function formatValidationSummary(summary, title = 'Validation Results') {
|
|
18
|
-
const lines = [];
|
|
19
|
-
|
|
20
|
-
lines.push('');
|
|
21
|
-
lines.push(title);
|
|
22
|
-
lines.push('='.repeat(50));
|
|
23
|
-
lines.push('');
|
|
24
|
-
|
|
25
|
-
// Format summary key-value pairs
|
|
26
|
-
for (const [key, value] of Object.entries(summary)) {
|
|
27
|
-
const label = key
|
|
28
|
-
.replace(/([A-Z])/g, ' $1')
|
|
29
|
-
.replace(/^./, str => str.toUpperCase())
|
|
30
|
-
.trim();
|
|
31
|
-
lines.push(`${label}: ${value}`);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
lines.push('');
|
|
35
|
-
|
|
36
|
-
return lines;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Format validation issues with consistent styling
|
|
41
|
-
*
|
|
42
|
-
* @param {Array} issues - Array of validation issues
|
|
43
|
-
* @param {boolean} verbose - Include detailed output
|
|
44
|
-
* @returns {string[]} Array of formatted issue lines
|
|
45
|
-
*/
|
|
46
|
-
export function formatValidationIssues(issues, verbose = false) {
|
|
47
|
-
const lines = [];
|
|
48
|
-
|
|
49
|
-
if (issues.length === 0) {
|
|
50
|
-
return lines;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Group by type
|
|
54
|
-
const errors = issues.filter(i => i.type === 'error');
|
|
55
|
-
const warnings = issues.filter(i => i.type === 'warning');
|
|
56
|
-
|
|
57
|
-
if (errors.length > 0) {
|
|
58
|
-
lines.push(chalk.red.bold(`Errors (${errors.length}):`));
|
|
59
|
-
lines.push('-'.repeat(50));
|
|
60
|
-
for (const issue of errors) {
|
|
61
|
-
lines.push(formatIssue(issue, verbose));
|
|
62
|
-
}
|
|
63
|
-
lines.push('');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (warnings.length > 0) {
|
|
67
|
-
lines.push(chalk.yellow.bold(`Warnings (${warnings.length}):`));
|
|
68
|
-
lines.push('-'.repeat(50));
|
|
69
|
-
for (const issue of warnings) {
|
|
70
|
-
lines.push(formatIssue(issue, verbose));
|
|
71
|
-
}
|
|
72
|
-
lines.push('');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return lines;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Format a single validation issue
|
|
80
|
-
*
|
|
81
|
-
* @param {Object} issue - Validation issue
|
|
82
|
-
* @param {boolean} verbose - Include additional details
|
|
83
|
-
* @returns {string} Formatted issue string
|
|
84
|
-
*/
|
|
85
|
-
function formatIssue(issue, verbose = false) {
|
|
86
|
-
const color = issue.type === 'error' ? chalk.red : chalk.yellow;
|
|
87
|
-
const icon = issue.type === 'error' ? '✗' : '⚠';
|
|
88
|
-
|
|
89
|
-
let formatted = ` ${icon} ${issue.message}`;
|
|
90
|
-
|
|
91
|
-
if (issue.file) {
|
|
92
|
-
formatted += chalk.dim(` (${issue.file}`);
|
|
93
|
-
if (issue.line) {
|
|
94
|
-
formatted += `:${issue.line}`;
|
|
95
|
-
}
|
|
96
|
-
formatted += chalk.dim(')');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (verbose && issue.suggestion) {
|
|
100
|
-
formatted += `\n ${chalk.cyan('→')} ${issue.suggestion}`;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return formatted;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Format final validation status
|
|
108
|
-
*
|
|
109
|
-
* @param {boolean} valid - Whether validation passed
|
|
110
|
-
* @param {number} errorCount - Number of errors
|
|
111
|
-
* @param {number} warningCount - Number of warnings
|
|
112
|
-
* @returns {string} Status message with appropriate styling
|
|
113
|
-
*/
|
|
114
|
-
export function formatValidationStatus(valid, errorCount = 0, warningCount = 0) {
|
|
115
|
-
if (valid && errorCount === 0 && warningCount === 0) {
|
|
116
|
-
return chalk.green('✓ All validations passed');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (errorCount > 0) {
|
|
120
|
-
return chalk.red(`✗ Validation failed with ${errorCount} error(s) and ${warningCount} warning(s)`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return chalk.yellow(`⚠ Validation passed with ${warningCount} warning(s)`);
|
|
124
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation result formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides common formatting patterns for validation results.
|
|
5
|
+
* Domain-specific formatters (CSS, template, etc.) can extend these.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Format a generic validation result summary
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} summary - Validation summary object
|
|
14
|
+
* @param {string} title - Title for the results section
|
|
15
|
+
* @returns {string[]} Array of formatted lines
|
|
16
|
+
*/
|
|
17
|
+
export function formatValidationSummary(summary, title = 'Validation Results') {
|
|
18
|
+
const lines = [];
|
|
19
|
+
|
|
20
|
+
lines.push('');
|
|
21
|
+
lines.push(title);
|
|
22
|
+
lines.push('='.repeat(50));
|
|
23
|
+
lines.push('');
|
|
24
|
+
|
|
25
|
+
// Format summary key-value pairs
|
|
26
|
+
for (const [key, value] of Object.entries(summary)) {
|
|
27
|
+
const label = key
|
|
28
|
+
.replace(/([A-Z])/g, ' $1')
|
|
29
|
+
.replace(/^./, str => str.toUpperCase())
|
|
30
|
+
.trim();
|
|
31
|
+
lines.push(`${label}: ${value}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
lines.push('');
|
|
35
|
+
|
|
36
|
+
return lines;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Format validation issues with consistent styling
|
|
41
|
+
*
|
|
42
|
+
* @param {Array} issues - Array of validation issues
|
|
43
|
+
* @param {boolean} verbose - Include detailed output
|
|
44
|
+
* @returns {string[]} Array of formatted issue lines
|
|
45
|
+
*/
|
|
46
|
+
export function formatValidationIssues(issues, verbose = false) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
|
|
49
|
+
if (issues.length === 0) {
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Group by type
|
|
54
|
+
const errors = issues.filter(i => i.type === 'error');
|
|
55
|
+
const warnings = issues.filter(i => i.type === 'warning');
|
|
56
|
+
|
|
57
|
+
if (errors.length > 0) {
|
|
58
|
+
lines.push(chalk.red.bold(`Errors (${errors.length}):`));
|
|
59
|
+
lines.push('-'.repeat(50));
|
|
60
|
+
for (const issue of errors) {
|
|
61
|
+
lines.push(formatIssue(issue, verbose));
|
|
62
|
+
}
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (warnings.length > 0) {
|
|
67
|
+
lines.push(chalk.yellow.bold(`Warnings (${warnings.length}):`));
|
|
68
|
+
lines.push('-'.repeat(50));
|
|
69
|
+
for (const issue of warnings) {
|
|
70
|
+
lines.push(formatIssue(issue, verbose));
|
|
71
|
+
}
|
|
72
|
+
lines.push('');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return lines;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Format a single validation issue
|
|
80
|
+
*
|
|
81
|
+
* @param {Object} issue - Validation issue
|
|
82
|
+
* @param {boolean} verbose - Include additional details
|
|
83
|
+
* @returns {string} Formatted issue string
|
|
84
|
+
*/
|
|
85
|
+
function formatIssue(issue, verbose = false) {
|
|
86
|
+
const color = issue.type === 'error' ? chalk.red : chalk.yellow;
|
|
87
|
+
const icon = issue.type === 'error' ? '✗' : '⚠';
|
|
88
|
+
|
|
89
|
+
let formatted = ` ${icon} ${issue.message}`;
|
|
90
|
+
|
|
91
|
+
if (issue.file) {
|
|
92
|
+
formatted += chalk.dim(` (${issue.file}`);
|
|
93
|
+
if (issue.line) {
|
|
94
|
+
formatted += `:${issue.line}`;
|
|
95
|
+
}
|
|
96
|
+
formatted += chalk.dim(')');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (verbose && issue.suggestion) {
|
|
100
|
+
formatted += `\n ${chalk.cyan('→')} ${issue.suggestion}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return formatted;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Format final validation status
|
|
108
|
+
*
|
|
109
|
+
* @param {boolean} valid - Whether validation passed
|
|
110
|
+
* @param {number} errorCount - Number of errors
|
|
111
|
+
* @param {number} warningCount - Number of warnings
|
|
112
|
+
* @returns {string} Status message with appropriate styling
|
|
113
|
+
*/
|
|
114
|
+
export function formatValidationStatus(valid, errorCount = 0, warningCount = 0) {
|
|
115
|
+
if (valid && errorCount === 0 && warningCount === 0) {
|
|
116
|
+
return chalk.green('✓ All validations passed');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (errorCount > 0) {
|
|
120
|
+
return chalk.red(`✗ Validation failed with ${errorCount} error(s) and ${warningCount} warning(s)`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return chalk.yellow(`⚠ Validation passed with ${warningCount} warning(s)`);
|
|
124
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UI Validators
|
|
3
|
-
*
|
|
4
|
-
* UI contrast and accessibility validation.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export * from './ui-contrast-validator.js';
|
|
1
|
+
/**
|
|
2
|
+
* UI Validators
|
|
3
|
+
*
|
|
4
|
+
* UI contrast and accessibility validation.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export * from './ui-contrast-validator.js';
|