@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.
Files changed (116) hide show
  1. package/CLAUDE.md +3 -3
  2. package/LICENSE +71 -71
  3. package/README.md +2 -2
  4. package/bin/morph-spec.js +22 -0
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/agents/README.md +14 -14
  9. package/framework/agents/architecture/standards-architect.md +159 -159
  10. package/framework/agents/infrastructure/azure-architect.md +149 -149
  11. package/framework/agents/infrastructure/infra-architect.md +48 -48
  12. package/framework/hooks/README.md +204 -204
  13. package/framework/hooks/shared/phase-utils.js +139 -139
  14. package/framework/rules/csharp-standards.md +13 -13
  15. package/framework/rules/frontend-standards.md +13 -13
  16. package/framework/rules/infrastructure-standards.md +16 -16
  17. package/framework/rules/testing-standards.md +14 -14
  18. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
  19. package/framework/skills/level-0-meta/morph-init/SKILL.md +57 -9
  20. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
  21. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
  22. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
  23. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
  24. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
  25. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
  26. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
  27. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
  28. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
  29. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +49 -16
  30. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  31. package/framework/standards/STANDARDS.json +2338 -2041
  32. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
  33. package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
  34. package/framework/templates/.idea/morph-templates.xml +92 -0
  35. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  36. package/framework/templates/README.md +814 -814
  37. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
  38. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
  39. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
  40. package/framework/templates/code/dotnet/contracts/README.md +74 -74
  41. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
  42. package/framework/templates/code/dotnet/frontend/component.razor +239 -239
  43. package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
  44. package/framework/templates/code/dotnet/jobs/job.cs +171 -171
  45. package/framework/templates/code/dotnet/test.cs +239 -239
  46. package/framework/templates/code/sql/rls-policy.sql +57 -57
  47. package/framework/templates/code/sql/supabase-migration.sql +100 -100
  48. package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
  49. package/framework/templates/code/typescript/contracts.ts +168 -168
  50. package/framework/templates/context/CONTEXT.md +181 -181
  51. package/framework/templates/docs/proposal.md +182 -182
  52. package/framework/templates/docs/user-stories.md +34 -34
  53. package/framework/templates/examples/design-system-examples.md +357 -357
  54. package/framework/templates/examples/spec-examples.md +90 -90
  55. package/framework/templates/feature/decisions.md +187 -187
  56. package/framework/templates/feature/recap.md +146 -146
  57. package/framework/templates/feature/tasks.md +199 -199
  58. package/framework/templates/infrastructure/azure/README.md +286 -286
  59. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
  60. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
  61. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
  62. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
  63. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
  64. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  65. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  66. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
  67. package/package.json +1 -1
  68. package/src/commands/agents/dispatch-agents.js +17 -0
  69. package/src/commands/agents/index.js +13 -13
  70. package/src/commands/agents/project-metrics.js +74 -0
  71. package/src/commands/project/install-plugin-cmd.js +28 -28
  72. package/src/commands/project/setup-infra-cmd.js +12 -12
  73. package/src/commands/standards/context-budget.js +89 -0
  74. package/src/commands/tasks/index.js +4 -4
  75. package/src/commands/templates/index.js +5 -5
  76. package/src/commands/utils/index.js +3 -3
  77. package/src/commands/validation/index.js +4 -4
  78. package/src/core/state/phase-state-machine.js +217 -217
  79. package/src/lib/agents/metrics-aggregator.js +56 -0
  80. package/src/lib/detectors/design-system-detector.js +73 -31
  81. package/src/lib/generators/design-system-generator.js +298 -298
  82. package/src/lib/generators/index.js +10 -10
  83. package/src/lib/generators/metadata-extractor.js +387 -387
  84. package/src/lib/stack-filter.js +65 -65
  85. package/src/lib/standards/digest-builder.js +57 -3
  86. package/src/lib/standards/index.js +7 -7
  87. package/src/lib/standards/standards-context-injector.js +302 -302
  88. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  89. package/src/lib/validators/architecture/index.js +7 -7
  90. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  91. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  92. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  93. package/src/lib/validators/blazor/index.js +9 -9
  94. package/src/lib/validators/content/content-validator.js +287 -287
  95. package/src/lib/validators/content/index.js +7 -7
  96. package/src/lib/validators/contracts/index.js +7 -7
  97. package/src/lib/validators/css/css-validator.js +352 -352
  98. package/src/lib/validators/css/index.js +7 -7
  99. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  100. package/src/lib/validators/design-system/index.js +7 -7
  101. package/src/lib/validators/nextjs/index.js +6 -6
  102. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  103. package/src/lib/validators/packages/index.js +7 -7
  104. package/src/lib/validators/packages/package-validator.js +360 -360
  105. package/src/lib/validators/shared/index.js +12 -12
  106. package/src/lib/validators/shared/issue-counter.js +18 -18
  107. package/src/lib/validators/shared/result-formatter.js +124 -124
  108. package/src/lib/validators/ui/index.js +7 -7
  109. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  110. package/src/scripts/global-install.js +58 -58
  111. package/src/scripts/install-plugin.js +126 -126
  112. package/src/utils/claude-md-injector.js +90 -90
  113. package/src/utils/file-copier.js +200 -200
  114. package/src/utils/logger.js +32 -32
  115. package/src/utils/skills-installer.js +178 -178
  116. package/src/utils/version-checker.js +175 -175
@@ -1,139 +1,139 @@
1
- // GENERATED by scripts/generate-refs.js — DO NOT EDIT manually
2
- // Source of truth: src/core/paths/output-schema.js
3
- // Regenerate with: node scripts/generate-refs.js
4
- /**
5
- * Shared phase utilities for Claude Code hooks.
6
- *
7
- * Maps phases to directories and output types.
8
- */
9
-
10
- /** Phase order */
11
- export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","plan","tasks","implement","sync"];
12
-
13
- /** Map phase → allowed output subdirectory */
14
- export const PHASE_DIRS = {
15
- proposal: '0-proposal',
16
- setup: '0-proposal',
17
- uiux: '2-ui',
18
- design: '1-design',
19
- clarify: '1-design',
20
- plan: '3-plan',
21
- tasks: '4-tasks',
22
- implement: '5-implement',
23
- sync: '5-implement',
24
- };
25
-
26
- /** Map output type (camelCase) → phase that produces it */
27
- export const OUTPUT_PHASE_MAP = {
28
- proposal: 'proposal',
29
- schemaAnalysis: 'design',
30
- spec: 'design',
31
- clarifications: 'clarify',
32
- contracts: 'design',
33
- contractsTs: 'design',
34
- contractsVsa: 'design',
35
- plan: 'plan',
36
- tasks: 'tasks',
37
- uiDesignSystem: 'uiux',
38
- uiMockups: 'uiux',
39
- uiComponents: 'uiux',
40
- uiFlows: 'uiux',
41
- decisions: 'design',
42
- recap: 'implement',
43
- };
44
-
45
- /** Map filename → output type (camelCase) */
46
- export const FILENAME_TO_OUTPUT = {
47
- 'proposal.md': 'proposal',
48
- 'schema-analysis.md': 'schemaAnalysis',
49
- 'spec.md': 'spec',
50
- 'clarifications.md': 'clarifications',
51
- 'contracts.cs': 'contracts',
52
- 'contracts.ts': 'contractsTs',
53
- 'contracts-vsa.cs': 'contractsVsa',
54
- 'plan.md': 'plan',
55
- 'tasks.md': 'tasks',
56
- 'design-system.md': 'uiDesignSystem',
57
- 'mockups.md': 'uiMockups',
58
- 'components.md': 'uiComponents',
59
- 'flows.md': 'uiFlows',
60
- 'decisions.md': 'decisions',
61
- 'recap.md': 'recap',
62
- };
63
-
64
- /** Protected spec files and the approval gate that locks them */
65
- export const PROTECTED_SPEC_FILES = {
66
- 'schema-analysis.md': 'design',
67
- 'spec.md': 'design',
68
- 'contracts.cs': 'design',
69
- 'contracts.ts': 'design',
70
- 'contracts-vsa.cs': 'design',
71
- 'plan.md': 'plan',
72
- 'tasks.md': 'tasks',
73
- 'design-system.md': 'uiux',
74
- 'mockups.md': 'uiux',
75
- 'components.md': 'uiux',
76
- 'flows.md': 'uiux',
77
- };
78
-
79
- /**
80
- * Extract feature name from a .morph/features/{feature}/... path
81
- * @param {string} filePath - File path to analyze
82
- * @returns {string|null} Feature name or null
83
- */
84
- export function extractFeatureName(filePath) {
85
- const normalized = filePath.replace(/\\/g, '/');
86
- const match = normalized.match(/\.morph\/features\/([^/]+)\//);
87
- return match ? match[1] : null;
88
- }
89
-
90
- /**
91
- * Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
92
- * @param {string} filePath - File path to analyze
93
- * @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
94
- */
95
- export function extractPhaseDir(filePath) {
96
- const normalized = filePath.replace(/\\/g, '/');
97
- const match = normalized.match(/\.morph\/features\/[^/]+\/(\d+-[^/]+)\//);
98
- return match ? match[1] : null;
99
- }
100
-
101
- /**
102
- * Check if a file path is inside .morph/features/
103
- * @param {string} filePath
104
- * @returns {boolean}
105
- */
106
- export function isFeaturePath(filePath) {
107
- const normalized = filePath.replace(/\\/g, '/');
108
- return normalized.includes('.morph/features/');
109
- }
110
-
111
- /**
112
- * Check if a file path is inside .morph/framework/ (readonly)
113
- * @param {string} filePath
114
- * @returns {boolean}
115
- */
116
- export function isFrameworkPath(filePath) {
117
- const normalized = filePath.replace(/\\/g, '/');
118
- return normalized.includes('.morph/framework/');
119
- }
120
-
121
- /**
122
- * Check if a file path is state.json
123
- * @param {string} filePath
124
- * @returns {boolean}
125
- */
126
- export function isStatePath(filePath) {
127
- const normalized = filePath.replace(/\\/g, '/');
128
- return normalized.endsWith('.morph/state.json');
129
- }
130
-
131
- /**
132
- * Get the basename of a file path
133
- * @param {string} filePath
134
- * @returns {string}
135
- */
136
- export function getBasename(filePath) {
137
- const normalized = filePath.replace(/\\/g, '/');
138
- return normalized.split('/').pop();
139
- }
1
+ // GENERATED by scripts/generate-refs.js — DO NOT EDIT manually
2
+ // Source of truth: src/core/paths/output-schema.js
3
+ // Regenerate with: node scripts/generate-refs.js
4
+ /**
5
+ * Shared phase utilities for Claude Code hooks.
6
+ *
7
+ * Maps phases to directories and output types.
8
+ */
9
+
10
+ /** Phase order */
11
+ export const PHASE_ORDER = ["proposal","setup","uiux","design","clarify","plan","tasks","implement","sync"];
12
+
13
+ /** Map phase → allowed output subdirectory */
14
+ export const PHASE_DIRS = {
15
+ proposal: '0-proposal',
16
+ setup: '0-proposal',
17
+ uiux: '2-ui',
18
+ design: '1-design',
19
+ clarify: '1-design',
20
+ plan: '3-plan',
21
+ tasks: '4-tasks',
22
+ implement: '5-implement',
23
+ sync: '5-implement',
24
+ };
25
+
26
+ /** Map output type (camelCase) → phase that produces it */
27
+ export const OUTPUT_PHASE_MAP = {
28
+ proposal: 'proposal',
29
+ schemaAnalysis: 'design',
30
+ spec: 'design',
31
+ clarifications: 'clarify',
32
+ contracts: 'design',
33
+ contractsTs: 'design',
34
+ contractsVsa: 'design',
35
+ plan: 'plan',
36
+ tasks: 'tasks',
37
+ uiDesignSystem: 'uiux',
38
+ uiMockups: 'uiux',
39
+ uiComponents: 'uiux',
40
+ uiFlows: 'uiux',
41
+ decisions: 'design',
42
+ recap: 'implement',
43
+ };
44
+
45
+ /** Map filename → output type (camelCase) */
46
+ export const FILENAME_TO_OUTPUT = {
47
+ 'proposal.md': 'proposal',
48
+ 'schema-analysis.md': 'schemaAnalysis',
49
+ 'spec.md': 'spec',
50
+ 'clarifications.md': 'clarifications',
51
+ 'contracts.cs': 'contracts',
52
+ 'contracts.ts': 'contractsTs',
53
+ 'contracts-vsa.cs': 'contractsVsa',
54
+ 'plan.md': 'plan',
55
+ 'tasks.md': 'tasks',
56
+ 'design-system.md': 'uiDesignSystem',
57
+ 'mockups.md': 'uiMockups',
58
+ 'components.md': 'uiComponents',
59
+ 'flows.md': 'uiFlows',
60
+ 'decisions.md': 'decisions',
61
+ 'recap.md': 'recap',
62
+ };
63
+
64
+ /** Protected spec files and the approval gate that locks them */
65
+ export const PROTECTED_SPEC_FILES = {
66
+ 'schema-analysis.md': 'design',
67
+ 'spec.md': 'design',
68
+ 'contracts.cs': 'design',
69
+ 'contracts.ts': 'design',
70
+ 'contracts-vsa.cs': 'design',
71
+ 'plan.md': 'plan',
72
+ 'tasks.md': 'tasks',
73
+ 'design-system.md': 'uiux',
74
+ 'mockups.md': 'uiux',
75
+ 'components.md': 'uiux',
76
+ 'flows.md': 'uiux',
77
+ };
78
+
79
+ /**
80
+ * Extract feature name from a .morph/features/{feature}/... path
81
+ * @param {string} filePath - File path to analyze
82
+ * @returns {string|null} Feature name or null
83
+ */
84
+ export function extractFeatureName(filePath) {
85
+ const normalized = filePath.replace(/\\/g, '/');
86
+ const match = normalized.match(/\.morph\/features\/([^/]+)\//);
87
+ return match ? match[1] : null;
88
+ }
89
+
90
+ /**
91
+ * Extract phase subdirectory from a .morph/features/{feature}/{phaseDir}/... path
92
+ * @param {string} filePath - File path to analyze
93
+ * @returns {string|null} Phase directory (e.g., '0-proposal', '1-design') or null
94
+ */
95
+ export function extractPhaseDir(filePath) {
96
+ const normalized = filePath.replace(/\\/g, '/');
97
+ const match = normalized.match(/\.morph\/features\/[^/]+\/(\d+-[^/]+)\//);
98
+ return match ? match[1] : null;
99
+ }
100
+
101
+ /**
102
+ * Check if a file path is inside .morph/features/
103
+ * @param {string} filePath
104
+ * @returns {boolean}
105
+ */
106
+ export function isFeaturePath(filePath) {
107
+ const normalized = filePath.replace(/\\/g, '/');
108
+ return normalized.includes('.morph/features/');
109
+ }
110
+
111
+ /**
112
+ * Check if a file path is inside .morph/framework/ (readonly)
113
+ * @param {string} filePath
114
+ * @returns {boolean}
115
+ */
116
+ export function isFrameworkPath(filePath) {
117
+ const normalized = filePath.replace(/\\/g, '/');
118
+ return normalized.includes('.morph/framework/');
119
+ }
120
+
121
+ /**
122
+ * Check if a file path is state.json
123
+ * @param {string} filePath
124
+ * @returns {boolean}
125
+ */
126
+ export function isStatePath(filePath) {
127
+ const normalized = filePath.replace(/\\/g, '/');
128
+ return normalized.endsWith('.morph/state.json');
129
+ }
130
+
131
+ /**
132
+ * Get the basename of a file path
133
+ * @param {string} filePath
134
+ * @returns {string}
135
+ */
136
+ export function getBasename(filePath) {
137
+ const normalized = filePath.replace(/\\/g, '/');
138
+ return normalized.split('/').pop();
139
+ }
@@ -1,13 +1,13 @@
1
- ---
2
- paths:
3
- - "**/*.cs"
4
- - "**/*.csproj"
5
- stacks:
6
- - dotnet
7
- - blazor
8
- ---
9
-
10
- # C# and .NET Standards
11
-
12
- @.morph/framework/standards/core/coding.md
13
- @.morph/framework/standards/backend/dotnet/core.md
1
+ ---
2
+ paths:
3
+ - "**/*.cs"
4
+ - "**/*.csproj"
5
+ stacks:
6
+ - dotnet
7
+ - blazor
8
+ ---
9
+
10
+ # C# and .NET Standards
11
+
12
+ @.morph/framework/standards/core/coding.md
13
+ @.morph/framework/standards/backend/dotnet/core.md
@@ -1,13 +1,13 @@
1
- ---
2
- paths:
3
- - "**/*.razor"
4
- - "**/*.css"
5
- - "**/*.scss"
6
- stacks:
7
- - blazor
8
- ---
9
-
10
- # Frontend Standards
11
-
12
- @.morph/framework/standards/frontend/blazor/design-checklist.md
13
- @.morph/framework/standards/frontend/design-system/naming.md
1
+ ---
2
+ paths:
3
+ - "**/*.razor"
4
+ - "**/*.css"
5
+ - "**/*.scss"
6
+ stacks:
7
+ - blazor
8
+ ---
9
+
10
+ # Frontend Standards
11
+
12
+ @.morph/framework/standards/frontend/blazor/design-checklist.md
13
+ @.morph/framework/standards/frontend/design-system/naming.md
@@ -1,16 +1,16 @@
1
- ---
2
- paths:
3
- - "**/*.bicep"
4
- - "**/Dockerfile"
5
- - "**/docker-compose*.yml"
6
- - "**/pipelines/**"
7
- - "**/.github/workflows/**"
8
- stacks:
9
- - azure
10
- - docker
11
- ---
12
-
13
- # Infrastructure Standards
14
-
15
- @.morph/framework/standards/infrastructure/azure/azure.md
16
- @.morph/framework/standards/infrastructure/docker/easypanel-deploy.md
1
+ ---
2
+ paths:
3
+ - "**/*.bicep"
4
+ - "**/Dockerfile"
5
+ - "**/docker-compose*.yml"
6
+ - "**/pipelines/**"
7
+ - "**/.github/workflows/**"
8
+ stacks:
9
+ - azure
10
+ - docker
11
+ ---
12
+
13
+ # Infrastructure Standards
14
+
15
+ @.morph/framework/standards/infrastructure/azure/azure.md
16
+ @.morph/framework/standards/infrastructure/docker/easypanel-deploy.md
@@ -1,14 +1,14 @@
1
- ---
2
- paths:
3
- - "tests/**"
4
- - "**/*.test.*"
5
- - "**/*.spec.*"
6
- - "**/*Tests.cs"
7
- stacks:
8
- - dotnet
9
- - blazor
10
- ---
11
-
12
- # Testing Standards
13
-
14
- @.morph/framework/standards/core/testing.md
1
+ ---
2
+ paths:
3
+ - "tests/**"
4
+ - "**/*.test.*"
5
+ - "**/*.spec.*"
6
+ - "**/*Tests.cs"
7
+ stacks:
8
+ - dotnet
9
+ - blazor
10
+ ---
11
+
12
+ # Testing Standards
13
+
14
+ @.morph/framework/standards/core/testing.md