@polymorphism-tech/morph-spec 4.10.6 → 4.10.8

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 (149) hide show
  1. package/CLAUDE.md +3 -0
  2. package/LICENSE +71 -71
  3. package/README.md +379 -379
  4. package/bin/morph-spec.js +89 -0
  5. package/bin/task-manager.js +59 -6
  6. package/claude-plugin.json +14 -14
  7. package/docs/CHEATSHEET.md +1 -1
  8. package/docs/QUICKSTART.md +206 -206
  9. package/framework/agents/README.md +14 -14
  10. package/framework/agents/architecture/standards-architect.md +159 -159
  11. package/framework/agents/frontend/blazor-builder.md +13 -0
  12. package/framework/agents/frontend/css-specialist.md +87 -0
  13. package/framework/agents/frontend/nextjs-expert.md +13 -0
  14. package/framework/agents/frontend/nextjs-ui-specialist.md +218 -0
  15. package/framework/agents/frontend/ui-ux-designer.md +80 -10
  16. package/framework/agents/infrastructure/azure-architect.md +149 -149
  17. package/framework/agents/infrastructure/infra-architect.md +48 -48
  18. package/framework/agents.json +2268 -2567
  19. package/framework/hooks/README.md +204 -204
  20. package/framework/hooks/claude-code/post-tool-use/dispatch.js +10 -5
  21. package/framework/hooks/claude-code/session-start/inject-morph-context.js +10 -24
  22. package/framework/hooks/shared/phase-utils.js +139 -139
  23. package/framework/hooks/shared/worktree-helpers.js +30 -8
  24. package/framework/rules/csharp-standards.md +13 -13
  25. package/framework/rules/frontend-standards.md +13 -13
  26. package/framework/rules/infrastructure-standards.md +16 -16
  27. package/framework/rules/testing-standards.md +14 -14
  28. package/framework/skills/README.md +0 -1
  29. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +12 -0
  30. package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
  31. package/framework/skills/level-0-meta/morph-init/SKILL.md +88 -3
  32. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +247 -247
  33. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +270 -270
  34. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +515 -499
  35. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +508 -471
  36. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +12 -1
  37. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +272 -258
  38. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +317 -311
  39. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +424 -323
  40. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  41. package/framework/standards/STANDARDS.json +2040 -2040
  42. package/framework/standards/frontend/nextjs/motion-patterns.md +321 -0
  43. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
  44. package/framework/templates/README.md +814 -814
  45. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
  46. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
  47. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
  48. package/framework/templates/code/dotnet/contracts/README.md +74 -74
  49. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
  50. package/framework/templates/code/dotnet/frontend/component.razor +239 -239
  51. package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
  52. package/framework/templates/code/dotnet/jobs/job.cs +171 -171
  53. package/framework/templates/code/dotnet/test.cs +239 -239
  54. package/framework/templates/code/sql/rls-policy.sql +57 -57
  55. package/framework/templates/code/sql/supabase-migration.sql +100 -100
  56. package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
  57. package/framework/templates/code/typescript/contracts.ts +168 -168
  58. package/framework/templates/context/CONTEXT.md +181 -181
  59. package/framework/templates/context/design-system.md +211 -0
  60. package/framework/templates/docs/proposal.md +182 -182
  61. package/framework/templates/docs/user-stories.md +34 -34
  62. package/framework/templates/examples/design-system-examples.md +357 -357
  63. package/framework/templates/examples/spec-examples.md +90 -90
  64. package/framework/templates/feature/decisions.md +187 -187
  65. package/framework/templates/feature/recap.md +146 -146
  66. package/framework/templates/feature/tasks.md +199 -199
  67. package/framework/templates/infrastructure/azure/README.md +286 -286
  68. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
  69. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
  70. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
  71. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
  72. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
  73. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  74. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  75. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
  76. package/package.json +82 -82
  77. package/src/commands/agents/agent-metrics.js +174 -0
  78. package/src/commands/agents/audit-dispatch.js +82 -0
  79. package/src/commands/agents/detect-agents.js +275 -0
  80. package/src/commands/agents/dispatch-agents.js +41 -135
  81. package/src/commands/agents/index.js +13 -4
  82. package/src/commands/agents/manage-agents.js +352 -0
  83. package/src/commands/project/doctor.js +59 -0
  84. package/src/commands/project/install-plugin-cmd.js +28 -28
  85. package/src/commands/project/setup-infra-cmd.js +12 -12
  86. package/src/commands/project/update.js +1 -17
  87. package/src/commands/project/worktree.js +58 -2
  88. package/src/commands/state/advance-phase.js +11 -3
  89. package/src/commands/tasks/index.js +4 -4
  90. package/src/commands/templates/index.js +5 -5
  91. package/src/commands/utils/index.js +3 -3
  92. package/src/commands/validation/index.js +4 -4
  93. package/src/core/state/phase-state-machine.js +217 -217
  94. package/src/core/state/state-manager.js +81 -0
  95. package/src/lib/agents/agents-manager.js +349 -0
  96. package/src/lib/agents/metrics-calculator.js +125 -0
  97. package/src/lib/agents/output-collector.js +75 -0
  98. package/src/lib/generators/context-generator.js +8 -7
  99. package/src/lib/generators/design-system-generator.js +298 -298
  100. package/src/lib/generators/index.js +10 -10
  101. package/src/lib/generators/metadata-extractor.js +387 -387
  102. package/src/lib/stack-filter.js +65 -65
  103. package/src/lib/standards/index.js +7 -7
  104. package/src/lib/standards/standards-context-injector.js +302 -302
  105. package/src/lib/tasks/task-parser.js +94 -3
  106. package/src/lib/validators/architecture/architecture-validator.js +387 -387
  107. package/src/lib/validators/architecture/index.js +7 -7
  108. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
  109. package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
  110. package/src/lib/validators/blazor/blazor-validator.js +369 -369
  111. package/src/lib/validators/blazor/index.js +9 -9
  112. package/src/lib/validators/checkpoint-persistence.js +39 -0
  113. package/src/lib/validators/content/content-validator.js +287 -279
  114. package/src/lib/validators/content/index.js +7 -7
  115. package/src/lib/validators/contracts/index.js +7 -7
  116. package/src/lib/validators/css/css-validator.js +352 -352
  117. package/src/lib/validators/css/index.js +7 -7
  118. package/src/lib/validators/design-system/design-system-validator.js +231 -231
  119. package/src/lib/validators/design-system/index.js +7 -7
  120. package/src/lib/validators/nextjs/index.js +6 -6
  121. package/src/lib/validators/nextjs/next-component-validator.js +183 -183
  122. package/src/lib/validators/packages/index.js +7 -7
  123. package/src/lib/validators/packages/package-validator.js +360 -360
  124. package/src/lib/validators/shared/index.js +12 -12
  125. package/src/lib/validators/shared/issue-counter.js +18 -18
  126. package/src/lib/validators/shared/result-formatter.js +124 -124
  127. package/src/lib/validators/spec-validator.js +2 -2
  128. package/src/lib/validators/ui/index.js +7 -7
  129. package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
  130. package/src/lib/validators/validation-runner.js +20 -0
  131. package/src/scripts/global-install.js +58 -58
  132. package/src/scripts/install-plugin.js +126 -126
  133. package/src/scripts/setup-infra.js +1 -17
  134. package/src/utils/agent-id-mapper.js +11 -0
  135. package/src/utils/agents-installer.js +40 -8
  136. package/src/utils/claude-md-injector.js +90 -90
  137. package/src/utils/claude-settings-manager.js +1 -1
  138. package/src/utils/file-copier.js +200 -196
  139. package/src/utils/hooks-installer.js +556 -739
  140. package/src/utils/logger.js +32 -32
  141. package/src/utils/skills-installer.js +178 -178
  142. package/src/utils/tier-helpers.js +24 -0
  143. package/src/utils/version-checker.js +175 -175
  144. package/framework/agents/architecture/po-pm-advisor.md +0 -203
  145. package/framework/hooks/claude-code/user-prompt/set-terminal-title.js +0 -68
  146. package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
  147. package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
  148. package/framework/templates/.idea/morph-templates.xml +0 -92
  149. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
@@ -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
+ // ============================================================