@polymorphism-tech/morph-spec 4.10.7 → 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.
- 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 +88 -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 +424 -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/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
|
@@ -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
|
+
// ============================================================
|