specweave 0.3.13 → 0.4.1
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 +506 -17
- package/README.md +100 -58
- package/bin/install-all.sh +9 -2
- package/bin/install-hooks.sh +57 -0
- package/bin/specweave.js +16 -0
- package/dist/adapters/adapter-base.d.ts +21 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -1
- package/dist/adapters/adapter-base.js +28 -0
- package/dist/adapters/adapter-base.js.map +1 -1
- package/dist/adapters/adapter-interface.d.ts +41 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.d.ts +36 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.js +135 -0
- package/dist/adapters/claude/adapter.js.map +1 -1
- package/dist/adapters/copilot/adapter.d.ts +25 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot/adapter.js +112 -0
- package/dist/adapters/copilot/adapter.js.map +1 -1
- package/dist/adapters/cursor/adapter.d.ts +36 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +140 -0
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/generic/adapter.d.ts +25 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/adapters/generic/adapter.js +111 -0
- package/dist/adapters/generic/adapter.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +103 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +37 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +296 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/core/agent-model-manager.d.ts +52 -0
- package/dist/core/agent-model-manager.d.ts.map +1 -0
- package/dist/core/agent-model-manager.js +120 -0
- package/dist/core/agent-model-manager.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +108 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +281 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/model-selector.d.ts +57 -0
- package/dist/core/model-selector.d.ts.map +1 -0
- package/dist/core/model-selector.js +115 -0
- package/dist/core/model-selector.js.map +1 -0
- package/dist/core/phase-detector.d.ts +62 -0
- package/dist/core/phase-detector.d.ts.map +1 -0
- package/dist/core/phase-detector.js +229 -0
- package/dist/core/phase-detector.js.map +1 -0
- package/dist/core/plugin-detector.d.ts +96 -0
- package/dist/core/plugin-detector.d.ts.map +1 -0
- package/dist/core/plugin-detector.js +349 -0
- package/dist/core/plugin-detector.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +111 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +319 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-manager.d.ts +144 -0
- package/dist/core/plugin-manager.d.ts.map +1 -0
- package/dist/core/plugin-manager.js +393 -0
- package/dist/core/plugin-manager.js.map +1 -0
- package/dist/core/schemas/plugin-manifest.schema.json +253 -0
- package/dist/core/types/plugin.d.ts +252 -0
- package/dist/core/types/plugin.d.ts.map +1 -0
- package/dist/core/types/plugin.js +48 -0
- package/dist/core/types/plugin.js.map +1 -0
- package/dist/integrations/jira/jira-mapper.d.ts +2 -2
- package/dist/integrations/jira/jira-mapper.js +2 -2
- package/dist/types/cost-tracking.d.ts +43 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/cost-tracking.js +8 -0
- package/dist/types/cost-tracking.js.map +1 -0
- package/dist/types/model-selection.d.ts +53 -0
- package/dist/types/model-selection.d.ts.map +1 -0
- package/dist/types/model-selection.js +12 -0
- package/dist/types/model-selection.js.map +1 -0
- package/dist/utils/cost-reporter.d.ts +58 -0
- package/dist/utils/cost-reporter.d.ts.map +1 -0
- package/dist/utils/cost-reporter.js +224 -0
- package/dist/utils/cost-reporter.js.map +1 -0
- package/dist/utils/pricing-constants.d.ts +70 -0
- package/dist/utils/pricing-constants.d.ts.map +1 -0
- package/dist/utils/pricing-constants.js +71 -0
- package/dist/utils/pricing-constants.js.map +1 -0
- package/package.json +13 -9
- package/src/adapters/adapter-base.ts +33 -0
- package/src/adapters/adapter-interface.ts +46 -0
- package/src/adapters/claude/adapter.ts +164 -0
- package/src/adapters/copilot/adapter.ts +138 -0
- package/src/adapters/cursor/adapter.ts +170 -0
- package/src/adapters/generic/adapter.ts +137 -0
- package/src/agents/architect/AGENT.md +3 -0
- package/src/agents/code-reviewer.md +156 -0
- package/src/agents/data-scientist/AGENT.md +181 -0
- package/src/agents/database-optimizer/AGENT.md +147 -0
- package/src/agents/devops/AGENT.md +3 -0
- package/src/agents/diagrams-architect/AGENT.md +3 -0
- package/src/agents/docs-writer/AGENT.md +3 -0
- package/src/agents/kubernetes-architect/AGENT.md +142 -0
- package/src/agents/ml-engineer/AGENT.md +150 -0
- package/src/agents/mlops-engineer/AGENT.md +201 -0
- package/src/agents/network-engineer/AGENT.md +149 -0
- package/src/agents/observability-engineer/AGENT.md +213 -0
- package/src/agents/payment-integration/AGENT.md +35 -0
- package/src/agents/performance/AGENT.md +3 -0
- package/src/agents/performance-engineer/AGENT.md +153 -0
- package/src/agents/pm/AGENT.md +3 -0
- package/src/agents/qa-lead/AGENT.md +3 -0
- package/src/agents/security/AGENT.md +3 -0
- package/src/agents/sre/AGENT.md +3 -0
- package/src/agents/tdd-orchestrator/AGENT.md +169 -0
- package/src/agents/tech-lead/AGENT.md +3 -0
- package/src/commands/specweave.costs.md +261 -0
- package/src/commands/specweave.increment.md +48 -4
- package/src/commands/specweave.ml-pipeline.md +292 -0
- package/src/commands/specweave.monitor-setup.md +501 -0
- package/src/commands/specweave.slo-implement.md +1055 -0
- package/src/commands/specweave.sync-github.md +1 -1
- package/src/commands/specweave.tdd-cycle.md +199 -0
- package/src/commands/specweave.tdd-green.md +842 -0
- package/src/commands/specweave.tdd-red.md +135 -0
- package/src/commands/specweave.tdd-refactor.md +165 -0
- package/src/hooks/post-increment-plugin-detect.sh +142 -0
- package/src/hooks/post-task-completion.sh +53 -11
- package/src/hooks/pre-task-plugin-detect.sh +96 -0
- package/src/skills/SKILLS-INDEX.md +18 -10
- package/src/skills/billing-automation/SKILL.md +559 -0
- package/src/skills/distributed-tracing/SKILL.md +438 -0
- package/src/skills/e2e-playwright/README.md +1 -1
- package/src/skills/e2e-playwright/package.json +1 -1
- package/src/skills/gitops-workflow/SKILL.md +285 -0
- package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/src/skills/grafana-dashboards/SKILL.md +369 -0
- package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
- package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
- package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/src/skills/k8s-security-policies/SKILL.md +334 -0
- package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
- package/src/skills/paypal-integration/SKILL.md +467 -0
- package/src/skills/pci-compliance/SKILL.md +466 -0
- package/src/skills/prometheus-configuration/SKILL.md +392 -0
- package/src/skills/slo-implementation/SKILL.md +329 -0
- package/src/skills/stripe-integration/SKILL.md +442 -0
- package/src/skills/tdd-workflow/SKILL.md +378 -0
- package/src/templates/README.md.template +1 -1
- package/src/skills/bmad-method-expert/SKILL.md +0 -626
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/src/skills/context-optimizer/SKILL.md +0 -588
- package/src/skills/figma-designer/SKILL.md +0 -149
- package/src/skills/figma-implementer/SKILL.md +0 -148
- package/src/skills/figma-mcp-connector/SKILL.md +0 -136
- package/src/skills/figma-to-code/SKILL.md +0 -128
- package/src/skills/spec-kit-expert/SKILL.md +0 -1010
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin CLI Command
|
|
3
|
+
*
|
|
4
|
+
* Provides commands for managing SpecWeave plugins:
|
|
5
|
+
* - list: List available and enabled plugins
|
|
6
|
+
* - enable: Enable a plugin
|
|
7
|
+
* - disable: Disable a plugin
|
|
8
|
+
* - info: Show detailed plugin information
|
|
9
|
+
*/
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { PluginManager } from '../../core/plugin-manager.js';
|
|
12
|
+
import { PluginDetector } from '../../core/plugin-detector.js';
|
|
13
|
+
import { AdapterLoader } from '../../adapters/adapter-loader.js';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
import { dirname } from 'path';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
/**
|
|
19
|
+
* List available and enabled plugins
|
|
20
|
+
*/
|
|
21
|
+
export async function listPlugins(options) {
|
|
22
|
+
try {
|
|
23
|
+
console.log(chalk.blue('\n📦 SpecWeave Plugins\n'));
|
|
24
|
+
const projectRoot = process.cwd();
|
|
25
|
+
const manager = new PluginManager(projectRoot);
|
|
26
|
+
if (options.enabled || (!options.enabled && !options.available)) {
|
|
27
|
+
// Show enabled plugins
|
|
28
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
29
|
+
console.log(chalk.green('✅ Enabled Plugins:'));
|
|
30
|
+
if (enabledPlugins.length === 0) {
|
|
31
|
+
console.log(chalk.gray(' (none)'));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
for (const pluginName of enabledPlugins) {
|
|
35
|
+
try {
|
|
36
|
+
const plugin = manager.getPlugin(pluginName);
|
|
37
|
+
console.log(` ${chalk.cyan(plugin.manifest.name)} ${chalk.gray(`v${plugin.manifest.version}`)}`);
|
|
38
|
+
console.log(` ${chalk.gray(plugin.manifest.description)}`);
|
|
39
|
+
console.log(` ${chalk.gray(`Skills: ${plugin.skills.length}, Agents: ${plugin.agents.length}, Commands: ${plugin.commands.length}`)}`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.log(` ${chalk.cyan(pluginName)} ${chalk.red('(error loading)')}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
if (options.available || (!options.enabled && !options.available)) {
|
|
49
|
+
// Show available plugins
|
|
50
|
+
const availablePlugins = await manager.getAvailablePlugins();
|
|
51
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
52
|
+
const disabledPlugins = availablePlugins.filter(p => !enabledPlugins.includes(p.name));
|
|
53
|
+
console.log(chalk.yellow('📚 Available Plugins:'));
|
|
54
|
+
if (disabledPlugins.length === 0) {
|
|
55
|
+
console.log(chalk.gray(' (all enabled)'));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
for (const plugin of disabledPlugins) {
|
|
59
|
+
console.log(` ${chalk.cyan(plugin.name)} ${chalk.gray(`v${plugin.version}`)}`);
|
|
60
|
+
console.log(` ${chalk.gray(plugin.description)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
// Show auto-detection suggestions
|
|
66
|
+
const detector = new PluginDetector();
|
|
67
|
+
const detectionResults = await detector.detectFromProject(projectRoot);
|
|
68
|
+
const suggestions = detectionResults.map(r => r.pluginName);
|
|
69
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
70
|
+
const newSuggestions = suggestions.filter(s => !enabledPlugins.includes(s));
|
|
71
|
+
if (newSuggestions.length > 0) {
|
|
72
|
+
console.log(chalk.magenta('💡 Suggested Plugins (auto-detected):'));
|
|
73
|
+
for (const suggestion of newSuggestions) {
|
|
74
|
+
console.log(` ${chalk.cyan(suggestion)}`);
|
|
75
|
+
}
|
|
76
|
+
console.log(chalk.gray('\nRun `specweave plugin enable <name>` to enable a plugin'));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error(chalk.red('❌ Error listing plugins:'), error instanceof Error ? error.message : error);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Enable a plugin
|
|
86
|
+
*/
|
|
87
|
+
export async function enablePlugin(pluginName, options) {
|
|
88
|
+
try {
|
|
89
|
+
console.log(chalk.blue(`\n🔌 Enabling plugin: ${pluginName}\n`));
|
|
90
|
+
const projectRoot = process.cwd();
|
|
91
|
+
const adapterLoader = new AdapterLoader();
|
|
92
|
+
const toolName = await adapterLoader.detectTool();
|
|
93
|
+
const adapter = adapterLoader.getAdapter(toolName);
|
|
94
|
+
if (!adapter) {
|
|
95
|
+
throw new Error(`Adapter not found for tool: ${toolName}`);
|
|
96
|
+
}
|
|
97
|
+
const manager = new PluginManager(projectRoot);
|
|
98
|
+
// Check if already enabled
|
|
99
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
100
|
+
if (enabledPlugins.includes(pluginName) && !options.force) {
|
|
101
|
+
console.log(chalk.yellow(`⚠️ Plugin ${pluginName} is already enabled`));
|
|
102
|
+
console.log(chalk.gray('Use --force to reinstall'));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Load and enable plugin
|
|
106
|
+
const loadOptions = {
|
|
107
|
+
force: options.force,
|
|
108
|
+
autoInstallDependencies: true
|
|
109
|
+
};
|
|
110
|
+
await manager.loadPlugin(pluginName, adapter, loadOptions);
|
|
111
|
+
console.log(chalk.green(`\n✅ Plugin ${pluginName} enabled successfully!`));
|
|
112
|
+
// Show what was installed
|
|
113
|
+
try {
|
|
114
|
+
const plugin = manager.getPlugin(pluginName);
|
|
115
|
+
console.log(chalk.gray(`\nInstalled:`));
|
|
116
|
+
if (plugin.skills.length > 0) {
|
|
117
|
+
console.log(chalk.gray(` Skills: ${plugin.skills.map(s => s.name).join(', ')}`));
|
|
118
|
+
}
|
|
119
|
+
if (plugin.agents.length > 0) {
|
|
120
|
+
console.log(chalk.gray(` Agents: ${plugin.agents.map(a => a.name).join(', ')}`));
|
|
121
|
+
}
|
|
122
|
+
if (plugin.commands.length > 0) {
|
|
123
|
+
console.log(chalk.gray(` Commands: ${plugin.commands.map(c => c.name).join(', ')}`));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Plugin info not available, skip
|
|
128
|
+
}
|
|
129
|
+
console.log(chalk.gray(`\nPlugin installed to: ${adapter.name === 'claude' ? '.claude/' : 'AGENTS.md'}`));
|
|
130
|
+
if (adapter.name === 'claude') {
|
|
131
|
+
console.log(chalk.yellow('\n⚠️ Restart Claude Code to activate the new plugin'));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error(chalk.red('❌ Error enabling plugin:'), error instanceof Error ? error.message : error);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Disable a plugin
|
|
141
|
+
*/
|
|
142
|
+
export async function disablePlugin(pluginName, options) {
|
|
143
|
+
try {
|
|
144
|
+
console.log(chalk.blue(`\n🔌 Disabling plugin: ${pluginName}\n`));
|
|
145
|
+
const projectRoot = process.cwd();
|
|
146
|
+
const adapterLoader = new AdapterLoader();
|
|
147
|
+
const toolName = await adapterLoader.detectTool();
|
|
148
|
+
const adapter = adapterLoader.getAdapter(toolName);
|
|
149
|
+
if (!adapter) {
|
|
150
|
+
throw new Error(`Adapter not found for tool: ${toolName}`);
|
|
151
|
+
}
|
|
152
|
+
const manager = new PluginManager(projectRoot);
|
|
153
|
+
// Check if enabled
|
|
154
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
155
|
+
if (!enabledPlugins.includes(pluginName)) {
|
|
156
|
+
console.log(chalk.yellow(`⚠️ Plugin ${pluginName} is not currently enabled`));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Unload plugin
|
|
160
|
+
const unloadOptions = {
|
|
161
|
+
force: options.force
|
|
162
|
+
};
|
|
163
|
+
await manager.unloadPlugin(pluginName, adapter, unloadOptions);
|
|
164
|
+
console.log(chalk.green(`\n✅ Plugin ${pluginName} disabled successfully!`));
|
|
165
|
+
if (adapter.name === 'claude') {
|
|
166
|
+
console.log(chalk.yellow('\n⚠️ Restart Claude Code to deactivate the plugin'));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error(chalk.red('❌ Error disabling plugin:'), error instanceof Error ? error.message : error);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Show detailed plugin information
|
|
176
|
+
*/
|
|
177
|
+
export async function pluginInfo(pluginName) {
|
|
178
|
+
try {
|
|
179
|
+
console.log(chalk.blue(`\n📋 Plugin Information: ${pluginName}\n`));
|
|
180
|
+
const projectRoot = process.cwd();
|
|
181
|
+
const manager = new PluginManager(projectRoot);
|
|
182
|
+
const { PluginLoader } = await import('../../core/plugin-loader.js');
|
|
183
|
+
// Check if plugin exists
|
|
184
|
+
const availablePlugins = await manager.getAvailablePlugins();
|
|
185
|
+
const basicInfo = availablePlugins.find(p => p.name === pluginName);
|
|
186
|
+
if (!basicInfo) {
|
|
187
|
+
console.log(chalk.red(`❌ Plugin ${pluginName} not found`));
|
|
188
|
+
console.log(chalk.gray('\nRun `specweave plugin list --available` to see available plugins'));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Load full plugin to get manifest details
|
|
192
|
+
const loader = new PluginLoader();
|
|
193
|
+
const plugin = await loader.loadFromDirectory(basicInfo.path);
|
|
194
|
+
const manifest = plugin.manifest;
|
|
195
|
+
// Basic info
|
|
196
|
+
console.log(chalk.cyan('Name:'), manifest.name);
|
|
197
|
+
console.log(chalk.cyan('Version:'), manifest.version);
|
|
198
|
+
console.log(chalk.cyan('Description:'), manifest.description);
|
|
199
|
+
if (manifest.author) {
|
|
200
|
+
console.log(chalk.cyan('Author:'), manifest.author);
|
|
201
|
+
}
|
|
202
|
+
if (manifest.license) {
|
|
203
|
+
console.log(chalk.cyan('License:'), manifest.license);
|
|
204
|
+
}
|
|
205
|
+
console.log(chalk.cyan('SpecWeave Core Version:'), manifest.specweave_core_version);
|
|
206
|
+
// Status
|
|
207
|
+
const enabledPlugins = await manager.getEnabledPlugins();
|
|
208
|
+
const isEnabled = enabledPlugins.includes(pluginName);
|
|
209
|
+
console.log(chalk.cyan('Status:'), isEnabled ? chalk.green('✅ Enabled') : chalk.gray('⚪ Disabled'));
|
|
210
|
+
// Provides
|
|
211
|
+
console.log(chalk.cyan('\nProvides:'));
|
|
212
|
+
console.log(` Skills: ${manifest.provides.skills.length > 0 ? manifest.provides.skills.join(', ') : chalk.gray('(none)')}`);
|
|
213
|
+
console.log(` Agents: ${manifest.provides.agents.length > 0 ? manifest.provides.agents.join(', ') : chalk.gray('(none)')}`);
|
|
214
|
+
console.log(` Commands: ${manifest.provides.commands.length > 0 ? manifest.provides.commands.join(', ') : chalk.gray('(none)')}`);
|
|
215
|
+
// Dependencies
|
|
216
|
+
if (manifest.dependencies?.plugins && manifest.dependencies.plugins.length > 0) {
|
|
217
|
+
console.log(chalk.cyan('\nDependencies:'));
|
|
218
|
+
for (const dep of manifest.dependencies.plugins) {
|
|
219
|
+
console.log(` - ${dep}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Auto-detection
|
|
223
|
+
if (manifest.auto_detect) {
|
|
224
|
+
console.log(chalk.cyan('\nAuto-Detection Triggers:'));
|
|
225
|
+
if (manifest.auto_detect.files) {
|
|
226
|
+
console.log(` Files: ${manifest.auto_detect.files.join(', ')}`);
|
|
227
|
+
}
|
|
228
|
+
if (manifest.auto_detect.packages) {
|
|
229
|
+
console.log(` Packages: ${manifest.auto_detect.packages.join(', ')}`);
|
|
230
|
+
}
|
|
231
|
+
if (manifest.auto_detect.env_vars) {
|
|
232
|
+
console.log(` Environment Variables: ${manifest.auto_detect.env_vars.join(', ')}`);
|
|
233
|
+
}
|
|
234
|
+
if (manifest.auto_detect.git_remote_pattern) {
|
|
235
|
+
console.log(` Git Remote Pattern: ${manifest.auto_detect.git_remote_pattern}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Credits
|
|
239
|
+
if (manifest.credits) {
|
|
240
|
+
console.log(chalk.cyan('\nCredits:'));
|
|
241
|
+
if (manifest.credits.based_on) {
|
|
242
|
+
console.log(` Based on: ${manifest.credits.based_on}`);
|
|
243
|
+
}
|
|
244
|
+
if (manifest.credits.original_author) {
|
|
245
|
+
console.log(` Original Author: ${manifest.credits.original_author}`);
|
|
246
|
+
}
|
|
247
|
+
if (manifest.credits.contributors && manifest.credits.contributors.length > 0) {
|
|
248
|
+
console.log(` Contributors: ${manifest.credits.contributors.join(', ')}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
console.log();
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
console.error(chalk.red('❌ Error getting plugin info:'), error instanceof Error ? error.message : error);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Main plugin command handler
|
|
260
|
+
*/
|
|
261
|
+
export async function pluginCommand(action, pluginName, options) {
|
|
262
|
+
switch (action) {
|
|
263
|
+
case 'list':
|
|
264
|
+
await listPlugins(options || {});
|
|
265
|
+
break;
|
|
266
|
+
case 'enable':
|
|
267
|
+
if (!pluginName) {
|
|
268
|
+
console.error(chalk.red('❌ Plugin name required for enable command'));
|
|
269
|
+
console.log(chalk.gray('Usage: specweave plugin enable <plugin-name>'));
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
await enablePlugin(pluginName, options || {});
|
|
273
|
+
break;
|
|
274
|
+
case 'disable':
|
|
275
|
+
if (!pluginName) {
|
|
276
|
+
console.error(chalk.red('❌ Plugin name required for disable command'));
|
|
277
|
+
console.log(chalk.gray('Usage: specweave plugin disable <plugin-name>'));
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
await disablePlugin(pluginName, options || {});
|
|
281
|
+
break;
|
|
282
|
+
case 'info':
|
|
283
|
+
if (!pluginName) {
|
|
284
|
+
console.error(chalk.red('❌ Plugin name required for info command'));
|
|
285
|
+
console.log(chalk.gray('Usage: specweave plugin info <plugin-name>'));
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
await pluginInfo(pluginName);
|
|
289
|
+
break;
|
|
290
|
+
default:
|
|
291
|
+
console.error(chalk.red(`❌ Unknown plugin action: ${action}`));
|
|
292
|
+
console.log(chalk.gray('Valid actions: list, enable, disable, info'));
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/cli/commands/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Model Manager
|
|
3
|
+
*
|
|
4
|
+
* Loads and manages agent model preferences from AGENT.md frontmatter.
|
|
5
|
+
* Each agent declares:
|
|
6
|
+
* - model_preference: sonnet | haiku | opus | auto
|
|
7
|
+
* - cost_profile: planning | execution | hybrid
|
|
8
|
+
* - fallback_behavior: strict | flexible | auto
|
|
9
|
+
*
|
|
10
|
+
* Planning agents (PM, Architect, Security) prefer Sonnet.
|
|
11
|
+
* Execution agents (Frontend, Backend, DevOps) prefer Haiku.
|
|
12
|
+
* Hybrid agents (Diagrams, Docs) use auto (context-dependent).
|
|
13
|
+
*/
|
|
14
|
+
import type { AgentModelPreference, Model, CostProfile, FallbackBehavior } from '../types/model-selection';
|
|
15
|
+
export declare class AgentModelManager {
|
|
16
|
+
private preferences;
|
|
17
|
+
private agentsPath;
|
|
18
|
+
constructor(agentsPath?: string);
|
|
19
|
+
/**
|
|
20
|
+
* Load all agent preferences from src/agents/
|
|
21
|
+
*/
|
|
22
|
+
loadAllPreferences(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Load preference for a specific agent
|
|
25
|
+
*/
|
|
26
|
+
loadAgentPreference(agentName: string): Promise<AgentModelPreference | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Extract YAML frontmatter from markdown content
|
|
29
|
+
*/
|
|
30
|
+
private extractFrontmatter;
|
|
31
|
+
/**
|
|
32
|
+
* Get preferred model for an agent (returns 'auto' if not found)
|
|
33
|
+
*/
|
|
34
|
+
getPreferredModel(agentName: string): Model;
|
|
35
|
+
/**
|
|
36
|
+
* Get cost profile for an agent (returns 'hybrid' if not found)
|
|
37
|
+
*/
|
|
38
|
+
getCostProfile(agentName: string): CostProfile;
|
|
39
|
+
/**
|
|
40
|
+
* Get fallback behavior for an agent
|
|
41
|
+
*/
|
|
42
|
+
getFallbackBehavior(agentName: string): FallbackBehavior;
|
|
43
|
+
/**
|
|
44
|
+
* Get all loaded preferences (for debugging/reporting)
|
|
45
|
+
*/
|
|
46
|
+
getAllPreferences(): Map<string, AgentModelPreference>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if an agent has explicit preference (not 'auto')
|
|
49
|
+
*/
|
|
50
|
+
hasExplicitPreference(agentName: string): boolean;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=agent-model-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-model-manager.d.ts","sourceRoot":"","sources":["../../src/core/agent-model-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE3G,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAgD;IACnE,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAK/B;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzC;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IA2BlF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAK3C;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW;IAK9C;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAKxD;;OAEG;IACH,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAItD;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAIlD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Model Manager
|
|
3
|
+
*
|
|
4
|
+
* Loads and manages agent model preferences from AGENT.md frontmatter.
|
|
5
|
+
* Each agent declares:
|
|
6
|
+
* - model_preference: sonnet | haiku | opus | auto
|
|
7
|
+
* - cost_profile: planning | execution | hybrid
|
|
8
|
+
* - fallback_behavior: strict | flexible | auto
|
|
9
|
+
*
|
|
10
|
+
* Planning agents (PM, Architect, Security) prefer Sonnet.
|
|
11
|
+
* Execution agents (Frontend, Backend, DevOps) prefer Haiku.
|
|
12
|
+
* Hybrid agents (Diagrams, Docs) use auto (context-dependent).
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'fs-extra';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import yaml from 'js-yaml';
|
|
17
|
+
export class AgentModelManager {
|
|
18
|
+
constructor(agentsPath) {
|
|
19
|
+
this.preferences = new Map();
|
|
20
|
+
// Default to src/agents (works in development and after build)
|
|
21
|
+
this.agentsPath = agentsPath || path.join(__dirname, '../agents');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load all agent preferences from src/agents/
|
|
25
|
+
*/
|
|
26
|
+
async loadAllPreferences() {
|
|
27
|
+
try {
|
|
28
|
+
const agentDirs = await fs.readdir(this.agentsPath);
|
|
29
|
+
for (const agentDir of agentDirs) {
|
|
30
|
+
const agentMdPath = path.join(this.agentsPath, agentDir, 'AGENT.md');
|
|
31
|
+
if (await fs.pathExists(agentMdPath)) {
|
|
32
|
+
const preference = await this.loadAgentPreference(agentDir);
|
|
33
|
+
if (preference) {
|
|
34
|
+
this.preferences.set(agentDir, preference);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.warn('Failed to load agent preferences:', error);
|
|
41
|
+
// Continue with empty preferences (fallback to defaults)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load preference for a specific agent
|
|
46
|
+
*/
|
|
47
|
+
async loadAgentPreference(agentName) {
|
|
48
|
+
const agentMdPath = path.join(this.agentsPath, agentName, 'AGENT.md');
|
|
49
|
+
if (!await fs.pathExists(agentMdPath)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const content = await fs.readFile(agentMdPath, 'utf-8');
|
|
54
|
+
const frontmatter = this.extractFrontmatter(content);
|
|
55
|
+
if (!frontmatter) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
agent: agentName,
|
|
60
|
+
preference: frontmatter.model_preference || 'auto',
|
|
61
|
+
profile: frontmatter.cost_profile || 'hybrid',
|
|
62
|
+
fallback: frontmatter.fallback_behavior || 'auto',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn(`Failed to load preference for agent ${agentName}:`, error);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract YAML frontmatter from markdown content
|
|
72
|
+
*/
|
|
73
|
+
extractFrontmatter(content) {
|
|
74
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
75
|
+
if (!match)
|
|
76
|
+
return null;
|
|
77
|
+
try {
|
|
78
|
+
return yaml.load(match[1]);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('Failed to parse YAML frontmatter:', error);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get preferred model for an agent (returns 'auto' if not found)
|
|
87
|
+
*/
|
|
88
|
+
getPreferredModel(agentName) {
|
|
89
|
+
const preference = this.preferences.get(agentName);
|
|
90
|
+
return preference?.preference || 'auto';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get cost profile for an agent (returns 'hybrid' if not found)
|
|
94
|
+
*/
|
|
95
|
+
getCostProfile(agentName) {
|
|
96
|
+
const preference = this.preferences.get(agentName);
|
|
97
|
+
return preference?.profile || 'hybrid';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get fallback behavior for an agent
|
|
101
|
+
*/
|
|
102
|
+
getFallbackBehavior(agentName) {
|
|
103
|
+
const preference = this.preferences.get(agentName);
|
|
104
|
+
return preference?.fallback || 'auto';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get all loaded preferences (for debugging/reporting)
|
|
108
|
+
*/
|
|
109
|
+
getAllPreferences() {
|
|
110
|
+
return new Map(this.preferences);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if an agent has explicit preference (not 'auto')
|
|
114
|
+
*/
|
|
115
|
+
hasExplicitPreference(agentName) {
|
|
116
|
+
const pref = this.getPreferredModel(agentName);
|
|
117
|
+
return pref !== 'auto';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=agent-model-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-model-manager.js","sourceRoot":"","sources":["../../src/core/agent-model-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Tracker Service
|
|
3
|
+
*
|
|
4
|
+
* Real-time cost tracking for agent executions. Tracks token usage, calculates
|
|
5
|
+
* costs, aggregates by increment, and calculates savings vs baseline (Sonnet-only).
|
|
6
|
+
*
|
|
7
|
+
* Persistence: Stores data in .specweave/logs/costs.json
|
|
8
|
+
*/
|
|
9
|
+
import type { Model } from '../types/model-selection';
|
|
10
|
+
import type { CostSession, IncrementCostReport } from '../types/cost-tracking';
|
|
11
|
+
interface CostTrackerConfig {
|
|
12
|
+
logPath?: string;
|
|
13
|
+
autoSave?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare class CostTracker {
|
|
16
|
+
private sessions;
|
|
17
|
+
private currentSessionId;
|
|
18
|
+
private logPath;
|
|
19
|
+
private autoSave;
|
|
20
|
+
constructor(config?: CostTrackerConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Start a new tracking session
|
|
23
|
+
*
|
|
24
|
+
* @param agent - Agent name (e.g., 'pm', 'frontend')
|
|
25
|
+
* @param model - Model used ('sonnet', 'haiku', 'opus')
|
|
26
|
+
* @param increment - Optional increment ID (e.g., '0003')
|
|
27
|
+
* @param command - Optional command that triggered this (e.g., '/specweave.inc')
|
|
28
|
+
* @returns Session ID
|
|
29
|
+
*/
|
|
30
|
+
startSession(agent: string, model: Exclude<Model, 'auto'>, increment?: string, command?: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Record token usage for current session
|
|
33
|
+
*
|
|
34
|
+
* @param inputTokens - Number of input tokens
|
|
35
|
+
* @param outputTokens - Number of output tokens
|
|
36
|
+
* @param sessionId - Optional session ID (defaults to current)
|
|
37
|
+
*/
|
|
38
|
+
recordTokens(inputTokens: number, outputTokens: number, sessionId?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* End current session
|
|
41
|
+
*
|
|
42
|
+
* @param sessionId - Optional session ID (defaults to current)
|
|
43
|
+
*/
|
|
44
|
+
endSession(sessionId?: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get session by ID
|
|
47
|
+
*/
|
|
48
|
+
getSession(sessionId: string): CostSession | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Get current session
|
|
51
|
+
*/
|
|
52
|
+
getCurrentSession(): CostSession | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Get all sessions for a specific increment
|
|
55
|
+
*
|
|
56
|
+
* @param incrementId - Increment ID (e.g., '0003')
|
|
57
|
+
* @returns Array of sessions for this increment
|
|
58
|
+
*/
|
|
59
|
+
getIncrementSessions(incrementId: string): CostSession[];
|
|
60
|
+
/**
|
|
61
|
+
* Get cost report for a specific increment
|
|
62
|
+
*
|
|
63
|
+
* @param incrementId - Increment ID (e.g., '0003')
|
|
64
|
+
* @returns Aggregate cost report
|
|
65
|
+
*/
|
|
66
|
+
getIncrementCost(incrementId: string): IncrementCostReport;
|
|
67
|
+
/**
|
|
68
|
+
* Get total cost across all sessions
|
|
69
|
+
*/
|
|
70
|
+
getTotalCost(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Get total savings across all sessions
|
|
73
|
+
*/
|
|
74
|
+
getTotalSavings(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Get all sessions
|
|
77
|
+
*/
|
|
78
|
+
getAllSessions(): CostSession[];
|
|
79
|
+
/**
|
|
80
|
+
* Clear all sessions (useful for testing)
|
|
81
|
+
*/
|
|
82
|
+
clearSessions(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Save sessions to disk
|
|
85
|
+
*/
|
|
86
|
+
saveToDisk(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Load sessions from disk
|
|
89
|
+
*/
|
|
90
|
+
loadFromDisk(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Generate unique session ID
|
|
93
|
+
*/
|
|
94
|
+
private generateSessionId;
|
|
95
|
+
/**
|
|
96
|
+
* Get summary statistics
|
|
97
|
+
*/
|
|
98
|
+
getSummary(): {
|
|
99
|
+
totalSessions: number;
|
|
100
|
+
totalCost: number;
|
|
101
|
+
totalSavings: number;
|
|
102
|
+
savingsPercentage: number;
|
|
103
|
+
mostExpensiveAgent: string | null;
|
|
104
|
+
cheapestAgent: string | null;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=cost-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/core/cost-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAc,WAAW,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAU;gBAEd,MAAM,GAAE,iBAAsB;IAK1C;;;;;;;;OAQG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM;IAwBT;;;;;;OAMG;IACH,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IA+BP;;;;OAIG;IACH,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBpC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAItD;;OAEG;IACH,iBAAiB,IAAI,WAAW,GAAG,SAAS;IAM5C;;;;;OAKG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE;IAMxD;;;;;OAKG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB;IA+C1D;;OAEG;IACH,YAAY,IAAI,MAAM;IAOtB;;OAEG;IACH,eAAe,IAAI,MAAM;IAOzB;;OAEG;IACH,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,UAAU,IAAI;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B;CAwCF"}
|