@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,163 +1,163 @@
1
- // ============================================================
2
- // MICROSOFT AGENT FRAMEWORK TEMPLATE
3
- // Generated by MORPH Framework
4
- // ============================================================
5
-
6
- using System.ComponentModel;
7
- using System.Text.Json;
8
- using Microsoft.Agents.AI;
9
- using Microsoft.Extensions.AI;
10
- using Microsoft.Extensions.Logging;
11
-
12
- namespace {{NAMESPACE}}.Agents.{{pascalCase FEATURE_NAME}};
13
-
14
- /// <summary>
15
- /// AI Agent for analyzing {{pascalCase FEATURE_NAME}} data.
16
- /// Uses Microsoft Agent Framework with IChatClient (gpt-4o-mini by default).
17
- /// </summary>
18
- public class {{pascalCase FEATURE_NAME}}AnalyzerAgent(
19
- IChatClient chatClient,
20
- ILogger<{{pascalCase FEATURE_NAME}}AnalyzerAgent> logger) : I{{pascalCase FEATURE_NAME}}AnalyzerAgent
21
- {
22
- /// <inheritdoc />
23
- public async Task<{{pascalCase FEATURE_NAME}}AnalysisResult> AnalyzeAsync(
24
- {{pascalCase FEATURE_NAME}}Data data,
25
- CancellationToken cancellationToken = default)
26
- {
27
- logger.LogInformation("Starting {{pascalCase FEATURE_NAME}} analysis for: {Content}",
28
- data.Content.Length > 100 ? data.Content[..100] + "..." : data.Content);
29
-
30
- var agent = new ChatClientAgent(
31
- chatClient,
32
- new ChatClientAgentOptions
33
- {
34
- Name = "{{pascalCase FEATURE_NAME}}Analyzer",
35
- Instructions = """
36
- You are an expert analyst for {{pascalCase FEATURE_NAME}} data.
37
-
38
- Analyze the provided data and return a JSON object with:
39
- - summary: Brief summary (1-2 sentences)
40
- - insights: Array of at least 2 insights
41
- - recommendations: Array of at least 1 recommendation
42
- - confidenceScore: Number between 0 and 1
43
-
44
- Respond ONLY with valid JSON, no additional text.
45
- """,
46
- ChatOptions = new ChatOptions
47
- {
48
- Tools =
49
- [
50
- AIFunctionFactory.Create(GetContextAsync),
51
- AIFunctionFactory.Create(GetMetricsAsync)
52
- ]
53
- }
54
- });
55
-
56
- var response = await agent.RunAsync(
57
- $"Analyze this data:\n{data.Content}",
58
- cancellationToken: cancellationToken);
59
-
60
- var result = ParseResponse(response.Text);
61
-
62
- logger.LogInformation(
63
- "Analysis completed. Confidence: {Confidence:P0}",
64
- result.ConfidenceScore);
65
-
66
- return result;
67
- }
68
-
69
- #region Tools
70
-
71
- [Description("Gets additional context for the analysis")]
72
- private async Task<string> GetContextAsync(
73
- [Description("What context is needed")] string query,
74
- CancellationToken ct = default)
75
- {
76
- // TODO: Implement context retrieval (e.g., from database or search)
77
- await Task.CompletedTask;
78
- return $"Context for: {query}";
79
- }
80
-
81
- [Description("Gets relevant metrics for the analysis")]
82
- private async Task<string> GetMetricsAsync(
83
- [Description("Metric type to retrieve")] string metricType,
84
- CancellationToken ct = default)
85
- {
86
- // TODO: Implement metrics retrieval
87
- await Task.CompletedTask;
88
- return $"Metrics for: {metricType}";
89
- }
90
-
91
- #endregion
92
-
93
- #region Response Parsing
94
-
95
- private {{pascalCase FEATURE_NAME}}AnalysisResult ParseResponse(string response)
96
- {
97
- try
98
- {
99
- var json = response
100
- .Replace("```json", "")
101
- .Replace("```", "")
102
- .Trim();
103
-
104
- var parsed = JsonSerializer.Deserialize<AnalysisResponse>(json,
105
- new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
106
-
107
- if (parsed is null)
108
- throw new {{pascalCase FEATURE_NAME}}ProcessingException("Failed to parse analysis response");
109
-
110
- return new {{pascalCase FEATURE_NAME}}AnalysisResult(
111
- parsed.Summary ?? "Analysis completed",
112
- parsed.Insights ?? [],
113
- parsed.Recommendations ?? [],
114
- parsed.ConfidenceScore);
115
- }
116
- catch (JsonException ex)
117
- {
118
- logger.LogError(ex, "Failed to parse AI response: {Response}", response);
119
- throw new {{pascalCase FEATURE_NAME}}ProcessingException("Failed to parse analysis response", ex);
120
- }
121
- }
122
-
123
- private class AnalysisResponse
124
- {
125
- public string? Summary { get; set; }
126
- public List<string>? Insights { get; set; }
127
- public List<string>? Recommendations { get; set; }
128
- public double ConfidenceScore { get; set; }
129
- }
130
-
131
- #endregion
132
- }
133
-
134
- // ============================================================
135
- // DEPENDENCY INJECTION SETUP
136
- // ============================================================
137
- //
138
- // In Program.cs:
139
- //
140
- // // Register IChatClient (Azure OpenAI with Managed Identity)
141
- // builder.Services.AddSingleton<IChatClient>(sp =>
142
- // {
143
- // var cfg = sp.GetRequiredService<IConfiguration>();
144
- // return new AzureOpenAIClient(
145
- // new Uri(cfg["AzureOpenAI:Endpoint"]!),
146
- // new DefaultAzureCredential())
147
- // .GetChatClient(cfg["AzureOpenAI:DeploymentName"] ?? "gpt-4o-mini")
148
- // .AsIChatClient();
149
- // });
150
- //
151
- // // Option A: Register as scoped service
152
- // builder.Services.AddScoped<I{{pascalCase FEATURE_NAME}}AnalyzerAgent, {{pascalCase FEATURE_NAME}}AnalyzerAgent>();
153
- //
154
- // // Option B: Register as keyed agent (recommended for multiple agents)
155
- // builder.AddAIAgent("{{pascalCase FEATURE_NAME}}Analyzer", (sp, key) =>
156
- // {
157
- // var chatClient = sp.GetRequiredService<IChatClient>();
158
- // return new ChatClientAgent(chatClient,
159
- // name: key,
160
- // instructions: "You are an expert {{pascalCase FEATURE_NAME}} analyst.");
161
- // });
162
- //
163
- // ============================================================
1
+ // ============================================================
2
+ // MICROSOFT AGENT FRAMEWORK TEMPLATE
3
+ // Generated by MORPH Framework
4
+ // ============================================================
5
+
6
+ using System.ComponentModel;
7
+ using System.Text.Json;
8
+ using Microsoft.Agents.AI;
9
+ using Microsoft.Extensions.AI;
10
+ using Microsoft.Extensions.Logging;
11
+
12
+ namespace {{NAMESPACE}}.Agents.{{pascalCase FEATURE_NAME}};
13
+
14
+ /// <summary>
15
+ /// AI Agent for analyzing {{pascalCase FEATURE_NAME}} data.
16
+ /// Uses Microsoft Agent Framework with IChatClient (gpt-4o-mini by default).
17
+ /// </summary>
18
+ public class {{pascalCase FEATURE_NAME}}AnalyzerAgent(
19
+ IChatClient chatClient,
20
+ ILogger<{{pascalCase FEATURE_NAME}}AnalyzerAgent> logger) : I{{pascalCase FEATURE_NAME}}AnalyzerAgent
21
+ {
22
+ /// <inheritdoc />
23
+ public async Task<{{pascalCase FEATURE_NAME}}AnalysisResult> AnalyzeAsync(
24
+ {{pascalCase FEATURE_NAME}}Data data,
25
+ CancellationToken cancellationToken = default)
26
+ {
27
+ logger.LogInformation("Starting {{pascalCase FEATURE_NAME}} analysis for: {Content}",
28
+ data.Content.Length > 100 ? data.Content[..100] + "..." : data.Content);
29
+
30
+ var agent = new ChatClientAgent(
31
+ chatClient,
32
+ new ChatClientAgentOptions
33
+ {
34
+ Name = "{{pascalCase FEATURE_NAME}}Analyzer",
35
+ Instructions = """
36
+ You are an expert analyst for {{pascalCase FEATURE_NAME}} data.
37
+
38
+ Analyze the provided data and return a JSON object with:
39
+ - summary: Brief summary (1-2 sentences)
40
+ - insights: Array of at least 2 insights
41
+ - recommendations: Array of at least 1 recommendation
42
+ - confidenceScore: Number between 0 and 1
43
+
44
+ Respond ONLY with valid JSON, no additional text.
45
+ """,
46
+ ChatOptions = new ChatOptions
47
+ {
48
+ Tools =
49
+ [
50
+ AIFunctionFactory.Create(GetContextAsync),
51
+ AIFunctionFactory.Create(GetMetricsAsync)
52
+ ]
53
+ }
54
+ });
55
+
56
+ var response = await agent.RunAsync(
57
+ $"Analyze this data:\n{data.Content}",
58
+ cancellationToken: cancellationToken);
59
+
60
+ var result = ParseResponse(response.Text);
61
+
62
+ logger.LogInformation(
63
+ "Analysis completed. Confidence: {Confidence:P0}",
64
+ result.ConfidenceScore);
65
+
66
+ return result;
67
+ }
68
+
69
+ #region Tools
70
+
71
+ [Description("Gets additional context for the analysis")]
72
+ private async Task<string> GetContextAsync(
73
+ [Description("What context is needed")] string query,
74
+ CancellationToken ct = default)
75
+ {
76
+ // TODO: Implement context retrieval (e.g., from database or search)
77
+ await Task.CompletedTask;
78
+ return $"Context for: {query}";
79
+ }
80
+
81
+ [Description("Gets relevant metrics for the analysis")]
82
+ private async Task<string> GetMetricsAsync(
83
+ [Description("Metric type to retrieve")] string metricType,
84
+ CancellationToken ct = default)
85
+ {
86
+ // TODO: Implement metrics retrieval
87
+ await Task.CompletedTask;
88
+ return $"Metrics for: {metricType}";
89
+ }
90
+
91
+ #endregion
92
+
93
+ #region Response Parsing
94
+
95
+ private {{pascalCase FEATURE_NAME}}AnalysisResult ParseResponse(string response)
96
+ {
97
+ try
98
+ {
99
+ var json = response
100
+ .Replace("```json", "")
101
+ .Replace("```", "")
102
+ .Trim();
103
+
104
+ var parsed = JsonSerializer.Deserialize<AnalysisResponse>(json,
105
+ new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
106
+
107
+ if (parsed is null)
108
+ throw new {{pascalCase FEATURE_NAME}}ProcessingException("Failed to parse analysis response");
109
+
110
+ return new {{pascalCase FEATURE_NAME}}AnalysisResult(
111
+ parsed.Summary ?? "Analysis completed",
112
+ parsed.Insights ?? [],
113
+ parsed.Recommendations ?? [],
114
+ parsed.ConfidenceScore);
115
+ }
116
+ catch (JsonException ex)
117
+ {
118
+ logger.LogError(ex, "Failed to parse AI response: {Response}", response);
119
+ throw new {{pascalCase FEATURE_NAME}}ProcessingException("Failed to parse analysis response", ex);
120
+ }
121
+ }
122
+
123
+ private class AnalysisResponse
124
+ {
125
+ public string? Summary { get; set; }
126
+ public List<string>? Insights { get; set; }
127
+ public List<string>? Recommendations { get; set; }
128
+ public double ConfidenceScore { get; set; }
129
+ }
130
+
131
+ #endregion
132
+ }
133
+
134
+ // ============================================================
135
+ // DEPENDENCY INJECTION SETUP
136
+ // ============================================================
137
+ //
138
+ // In Program.cs:
139
+ //
140
+ // // Register IChatClient (Azure OpenAI with Managed Identity)
141
+ // builder.Services.AddSingleton<IChatClient>(sp =>
142
+ // {
143
+ // var cfg = sp.GetRequiredService<IConfiguration>();
144
+ // return new AzureOpenAIClient(
145
+ // new Uri(cfg["AzureOpenAI:Endpoint"]!),
146
+ // new DefaultAzureCredential())
147
+ // .GetChatClient(cfg["AzureOpenAI:DeploymentName"] ?? "gpt-4o-mini")
148
+ // .AsIChatClient();
149
+ // });
150
+ //
151
+ // // Option A: Register as scoped service
152
+ // builder.Services.AddScoped<I{{pascalCase FEATURE_NAME}}AnalyzerAgent, {{pascalCase FEATURE_NAME}}AnalyzerAgent>();
153
+ //
154
+ // // Option B: Register as keyed agent (recommended for multiple agents)
155
+ // builder.AddAIAgent("{{pascalCase FEATURE_NAME}}Analyzer", (sp, key) =>
156
+ // {
157
+ // var chatClient = sp.GetRequiredService<IChatClient>();
158
+ // return new ChatClientAgent(chatClient,
159
+ // name: key,
160
+ // instructions: "You are an expert {{pascalCase FEATURE_NAME}} analyst.");
161
+ // });
162
+ //
163
+ // ============================================================