specweave 0.8.3 → 0.8.5
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-plugin/marketplace.json +11 -0
- package/dist/adapters/adapter-loader.d.ts +4 -4
- package/dist/adapters/adapter-loader.d.ts.map +1 -1
- package/dist/adapters/adapter-loader.js +8 -7
- package/dist/adapters/adapter-loader.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/utils/docs-preview/config-generator.d.ts +46 -0
- package/dist/utils/docs-preview/config-generator.d.ts.map +1 -0
- package/dist/utils/docs-preview/config-generator.js +377 -0
- package/dist/utils/docs-preview/config-generator.js.map +1 -0
- package/dist/utils/docs-preview/docusaurus-setup.d.ts +38 -0
- package/dist/utils/docs-preview/docusaurus-setup.d.ts.map +1 -0
- package/dist/utils/docs-preview/docusaurus-setup.js +177 -0
- package/dist/utils/docs-preview/docusaurus-setup.js.map +1 -0
- package/dist/utils/docs-preview/index.d.ts +11 -0
- package/dist/utils/docs-preview/index.d.ts.map +1 -0
- package/dist/utils/docs-preview/index.js +17 -0
- package/dist/utils/docs-preview/index.js.map +1 -0
- package/dist/utils/docs-preview/package-installer.d.ts +42 -0
- package/dist/utils/docs-preview/package-installer.d.ts.map +1 -0
- package/dist/utils/docs-preview/package-installer.js +182 -0
- package/dist/utils/docs-preview/package-installer.js.map +1 -0
- package/dist/utils/docs-preview/server-manager.d.ts +30 -0
- package/dist/utils/docs-preview/server-manager.d.ts.map +1 -0
- package/dist/utils/docs-preview/server-manager.js +207 -0
- package/dist/utils/docs-preview/server-manager.js.map +1 -0
- package/dist/utils/docs-preview/sidebar-builder.d.ts +31 -0
- package/dist/utils/docs-preview/sidebar-builder.d.ts.map +1 -0
- package/dist/utils/docs-preview/sidebar-builder.js +202 -0
- package/dist/utils/docs-preview/sidebar-builder.js.map +1 -0
- package/dist/utils/docs-preview/types.d.ts +60 -0
- package/dist/utils/docs-preview/types.d.ts.map +1 -0
- package/dist/utils/docs-preview/types.js +5 -0
- package/dist/utils/docs-preview/types.js.map +1 -0
- package/dist/utils/docs-preview.bak/config-generator.d.ts +46 -0
- package/dist/utils/docs-preview.bak/config-generator.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/config-generator.js +377 -0
- package/dist/utils/docs-preview.bak/config-generator.js.map +1 -0
- package/dist/utils/docs-preview.bak/package-installer.d.ts +42 -0
- package/dist/utils/docs-preview.bak/package-installer.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/package-installer.js +182 -0
- package/dist/utils/docs-preview.bak/package-installer.js.map +1 -0
- package/dist/utils/docs-preview.bak/server-manager.d.ts +30 -0
- package/dist/utils/docs-preview.bak/server-manager.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/server-manager.js +207 -0
- package/dist/utils/docs-preview.bak/server-manager.js.map +1 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.d.ts +31 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.js +202 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.js.map +1 -0
- package/dist/utils/docs-preview.bak/types.d.ts +60 -0
- package/dist/utils/docs-preview.bak/types.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/types.js +5 -0
- package/dist/utils/docs-preview.bak/types.js.map +1 -0
- package/package.json +1 -1
- package/src/templates/.gitattributes.template +35 -0
- package/dist/cli/commands/plugin.js +0 -322
- package/dist/cli/commands/plugin.js.map +0 -1
- package/dist/core/plugin-detector.d.ts +0 -97
- package/dist/core/plugin-detector.d.ts.map +0 -1
- package/dist/core/plugin-detector.js +0 -374
- package/dist/core/plugin-detector.js.map +0 -1
- package/dist/core/plugin-manager.d.ts +0 -144
- package/dist/core/plugin-manager.d.ts.map +0 -1
- package/dist/core/plugin-manager.js +0 -393
- package/dist/core/plugin-manager.js.map +0 -1
- package/dist/utils/plugin-detection.js +0 -229
- package/dist/utils/plugin-detection.js.map +0 -1
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin Manager
|
|
3
|
-
*
|
|
4
|
-
* Central orchestrator for plugin lifecycle management.
|
|
5
|
-
* Handles loading/unloading, dependency resolution, configuration management.
|
|
6
|
-
*
|
|
7
|
-
* @module core/plugin-manager
|
|
8
|
-
* @version 0.4.0
|
|
9
|
-
*/
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import * as fs from 'fs-extra';
|
|
12
|
-
import * as yaml from 'js-yaml';
|
|
13
|
-
import { PluginLoader } from './plugin-loader.js';
|
|
14
|
-
import { PluginError, PluginDependencyError, PluginNotFoundError } from './types/plugin.js';
|
|
15
|
-
/**
|
|
16
|
-
* PluginManager - Manages plugin lifecycle and configuration
|
|
17
|
-
*/
|
|
18
|
-
export class PluginManager {
|
|
19
|
-
/**
|
|
20
|
-
* Create a new PluginManager
|
|
21
|
-
*
|
|
22
|
-
* @param projectPath - Path to project root
|
|
23
|
-
* @param pluginsDir - Path to plugins directory (default: src/plugins)
|
|
24
|
-
*/
|
|
25
|
-
constructor(projectPath = process.cwd(), pluginsDir) {
|
|
26
|
-
this.projectPath = projectPath;
|
|
27
|
-
this.loader = new PluginLoader();
|
|
28
|
-
this.configPath = path.join(projectPath, '.specweave', 'config.yaml');
|
|
29
|
-
this.pluginsDir = pluginsDir || path.join(projectPath, 'src', 'plugins');
|
|
30
|
-
this.loadedPlugins = new Map();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Load (enable) a plugin
|
|
34
|
-
*
|
|
35
|
-
* 1. Load plugin from src/plugins/
|
|
36
|
-
* 2. Check dependencies
|
|
37
|
-
* 3. Install via adapter
|
|
38
|
-
* 4. Update config
|
|
39
|
-
*
|
|
40
|
-
* @param name - Plugin name (e.g., "github", "kubernetes")
|
|
41
|
-
* @param adapter - Adapter to use for installation
|
|
42
|
-
* @param options - Load options
|
|
43
|
-
*/
|
|
44
|
-
async loadPlugin(name, adapter, options = {}) {
|
|
45
|
-
console.log(`\n📦 Loading plugin: ${name}...`);
|
|
46
|
-
// Check if already loaded
|
|
47
|
-
if (this.loadedPlugins.has(name) && !options.force) {
|
|
48
|
-
console.log(`ℹ️ Plugin ${name} already loaded`);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
// Load plugin from disk
|
|
52
|
-
const pluginPath = path.join(this.pluginsDir, name);
|
|
53
|
-
const plugin = await this.loader.loadFromDirectory(pluginPath);
|
|
54
|
-
// Validate plugin integrity
|
|
55
|
-
if (options.validate !== false) {
|
|
56
|
-
const isValid = await this.loader.verifyPlugin(plugin);
|
|
57
|
-
if (!isValid) {
|
|
58
|
-
throw new PluginError(`Plugin ${name} failed integrity check`, name);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Check dependencies
|
|
62
|
-
if (!options.skipDependencies) {
|
|
63
|
-
await this.checkDependencies(plugin);
|
|
64
|
-
}
|
|
65
|
-
// Install via adapter
|
|
66
|
-
console.log(`📋 Installing ${name} via ${adapter.name} adapter...`);
|
|
67
|
-
if (adapter.supportsPlugins && adapter.supportsPlugins()) {
|
|
68
|
-
await adapter.compilePlugin(plugin);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
console.warn(`⚠️ Adapter ${adapter.name} does not support plugins`);
|
|
72
|
-
throw new PluginError(`Adapter ${adapter.name} does not support plugins`, name, 'ADAPTER_NOT_SUPPORTED');
|
|
73
|
-
}
|
|
74
|
-
// Update config
|
|
75
|
-
await this.updateConfig(name, 'enable');
|
|
76
|
-
// Cache loaded plugin
|
|
77
|
-
this.loadedPlugins.set(name, plugin);
|
|
78
|
-
console.log(`✅ Plugin ${name} loaded successfully!`);
|
|
79
|
-
console.log(` - ${plugin.skills.length} skills`);
|
|
80
|
-
console.log(` - ${plugin.agents.length} agents`);
|
|
81
|
-
console.log(` - ${plugin.commands.length} commands`);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Unload (disable) a plugin
|
|
85
|
-
*
|
|
86
|
-
* @param name - Plugin name
|
|
87
|
-
* @param adapter - Adapter to use for uninstallation
|
|
88
|
-
* @param options - Unload options
|
|
89
|
-
*/
|
|
90
|
-
async unloadPlugin(name, adapter, options = {}) {
|
|
91
|
-
console.log(`\n🗑️ Unloading plugin: ${name}...`);
|
|
92
|
-
// Check if plugin is loaded
|
|
93
|
-
if (!this.loadedPlugins.has(name)) {
|
|
94
|
-
console.log(`ℹ️ Plugin ${name} not loaded`);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
// Check if other plugins depend on this one
|
|
98
|
-
if (!options.force) {
|
|
99
|
-
const dependents = await this.getDependents(name);
|
|
100
|
-
if (dependents.length > 0) {
|
|
101
|
-
throw new PluginDependencyError(`Cannot unload ${name}: Required by ${dependents.join(', ')}`, name);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Uninstall via adapter
|
|
105
|
-
if (adapter.supportsPlugins && adapter.supportsPlugins()) {
|
|
106
|
-
await adapter.unloadPlugin(name);
|
|
107
|
-
}
|
|
108
|
-
// Update config
|
|
109
|
-
await this.updateConfig(name, 'disable');
|
|
110
|
-
// Remove from cache
|
|
111
|
-
this.loadedPlugins.delete(name);
|
|
112
|
-
console.log(`✅ Plugin ${name} unloaded`);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Get all available plugins (scan src/plugins/)
|
|
116
|
-
*
|
|
117
|
-
* @returns Array of plugin info
|
|
118
|
-
*/
|
|
119
|
-
async getAvailablePlugins() {
|
|
120
|
-
const plugins = [];
|
|
121
|
-
// Check if plugins directory exists
|
|
122
|
-
if (!(await fs.pathExists(this.pluginsDir))) {
|
|
123
|
-
return plugins;
|
|
124
|
-
}
|
|
125
|
-
// Get enabled plugins from config
|
|
126
|
-
const enabledPlugins = await this.getEnabledPlugins();
|
|
127
|
-
// Scan plugins directory
|
|
128
|
-
const dirs = await fs.readdir(this.pluginsDir);
|
|
129
|
-
for (const dir of dirs) {
|
|
130
|
-
const pluginPath = path.join(this.pluginsDir, dir);
|
|
131
|
-
const stat = await fs.stat(pluginPath);
|
|
132
|
-
if (stat.isDirectory()) {
|
|
133
|
-
try {
|
|
134
|
-
const metadata = await this.loader.getMetadata(pluginPath);
|
|
135
|
-
plugins.push({
|
|
136
|
-
name: dir,
|
|
137
|
-
version: metadata.version,
|
|
138
|
-
description: metadata.description,
|
|
139
|
-
path: pluginPath,
|
|
140
|
-
enabled: enabledPlugins.includes(dir),
|
|
141
|
-
skillCount: metadata.skillCount,
|
|
142
|
-
agentCount: metadata.agentCount,
|
|
143
|
-
commandCount: metadata.commandCount
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
console.warn(`⚠️ Failed to load metadata for ${dir}: ${error.message}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return plugins;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Get enabled plugins from config
|
|
155
|
-
*
|
|
156
|
-
* @returns Array of enabled plugin names
|
|
157
|
-
*/
|
|
158
|
-
async getEnabledPlugins() {
|
|
159
|
-
const config = await this.loadConfig();
|
|
160
|
-
return config.enabled || [];
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Check if a plugin is enabled
|
|
164
|
-
*
|
|
165
|
-
* @param name - Plugin name
|
|
166
|
-
* @returns True if enabled
|
|
167
|
-
*/
|
|
168
|
-
async isPluginEnabled(name) {
|
|
169
|
-
const enabled = await this.getEnabledPlugins();
|
|
170
|
-
return enabled.includes(name);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Update plugin configuration
|
|
174
|
-
*
|
|
175
|
-
* @param name - Plugin name
|
|
176
|
-
* @param action - 'enable' or 'disable'
|
|
177
|
-
*/
|
|
178
|
-
async updateConfig(name, action) {
|
|
179
|
-
const config = await this.loadConfig();
|
|
180
|
-
if (action === 'enable') {
|
|
181
|
-
if (!config.enabled.includes(name)) {
|
|
182
|
-
config.enabled.push(name);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
config.enabled = config.enabled.filter(p => p !== name);
|
|
187
|
-
}
|
|
188
|
-
await this.saveConfig(config);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Load plugin configuration from .specweave/config.yaml
|
|
192
|
-
*
|
|
193
|
-
* @returns Plugin configuration
|
|
194
|
-
*/
|
|
195
|
-
async loadConfig() {
|
|
196
|
-
// Ensure config directory exists
|
|
197
|
-
const configDir = path.dirname(this.configPath);
|
|
198
|
-
await fs.ensureDir(configDir);
|
|
199
|
-
// Check if config file exists
|
|
200
|
-
if (!(await fs.pathExists(this.configPath))) {
|
|
201
|
-
// Create default config
|
|
202
|
-
const defaultConfig = {
|
|
203
|
-
enabled: [],
|
|
204
|
-
settings: {}
|
|
205
|
-
};
|
|
206
|
-
await this.saveConfig(defaultConfig);
|
|
207
|
-
return defaultConfig;
|
|
208
|
-
}
|
|
209
|
-
// Read and parse config
|
|
210
|
-
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
211
|
-
const config = yaml.load(content);
|
|
212
|
-
// Ensure plugins section exists
|
|
213
|
-
if (!config.plugins) {
|
|
214
|
-
config.plugins = { enabled: [], settings: {} };
|
|
215
|
-
}
|
|
216
|
-
return config.plugins;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Save plugin configuration to .specweave/config.yaml
|
|
220
|
-
*
|
|
221
|
-
* @param pluginConfig - Plugin configuration to save
|
|
222
|
-
*/
|
|
223
|
-
async saveConfig(pluginConfig) {
|
|
224
|
-
// Read full config (if exists)
|
|
225
|
-
let fullConfig = {};
|
|
226
|
-
if (await fs.pathExists(this.configPath)) {
|
|
227
|
-
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
228
|
-
fullConfig = yaml.load(content) || {};
|
|
229
|
-
}
|
|
230
|
-
// Update plugins section
|
|
231
|
-
fullConfig.plugins = pluginConfig;
|
|
232
|
-
// Write back
|
|
233
|
-
const yamlContent = yaml.dump(fullConfig, { indent: 2 });
|
|
234
|
-
await fs.writeFile(this.configPath, yamlContent, 'utf-8');
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Check plugin dependencies
|
|
238
|
-
*
|
|
239
|
-
* Ensures all required plugins are loaded
|
|
240
|
-
*
|
|
241
|
-
* @param plugin - Plugin to check
|
|
242
|
-
* @throws PluginDependencyError if dependencies are not met
|
|
243
|
-
*/
|
|
244
|
-
async checkDependencies(plugin) {
|
|
245
|
-
const { dependencies } = plugin.manifest;
|
|
246
|
-
if (!dependencies || !dependencies.plugins) {
|
|
247
|
-
return; // No dependencies
|
|
248
|
-
}
|
|
249
|
-
const enabledPlugins = await this.getEnabledPlugins();
|
|
250
|
-
const missingDeps = [];
|
|
251
|
-
for (const depName of dependencies.plugins) {
|
|
252
|
-
if (!enabledPlugins.includes(depName)) {
|
|
253
|
-
missingDeps.push(depName);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (missingDeps.length > 0) {
|
|
257
|
-
throw new PluginDependencyError(`Plugin ${plugin.manifest.name} requires: ${missingDeps.join(', ')}`, plugin.manifest.name);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Resolve dependency graph for a plugin
|
|
262
|
-
*
|
|
263
|
-
* Returns all plugins that need to be loaded (including transitive deps)
|
|
264
|
-
*
|
|
265
|
-
* @param plugin - Plugin to resolve
|
|
266
|
-
* @returns Array of plugins in load order
|
|
267
|
-
*/
|
|
268
|
-
async resolveDependencies(plugin) {
|
|
269
|
-
const resolved = [];
|
|
270
|
-
const visited = new Set();
|
|
271
|
-
const resolve = async (p) => {
|
|
272
|
-
if (visited.has(p.manifest.name)) {
|
|
273
|
-
return; // Already processed
|
|
274
|
-
}
|
|
275
|
-
visited.add(p.manifest.name);
|
|
276
|
-
// Resolve dependencies first
|
|
277
|
-
if (p.manifest.dependencies?.plugins) {
|
|
278
|
-
for (const depName of p.manifest.dependencies.plugins) {
|
|
279
|
-
const depPath = path.join(this.pluginsDir, depName);
|
|
280
|
-
const depPlugin = await this.loader.loadFromDirectory(depPath);
|
|
281
|
-
await resolve(depPlugin);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
// Add this plugin
|
|
285
|
-
resolved.push(p);
|
|
286
|
-
};
|
|
287
|
-
await resolve(plugin);
|
|
288
|
-
return resolved;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get plugins that depend on a given plugin
|
|
292
|
-
*
|
|
293
|
-
* @param name - Plugin name
|
|
294
|
-
* @returns Array of dependent plugin names
|
|
295
|
-
*/
|
|
296
|
-
async getDependents(name) {
|
|
297
|
-
const dependents = [];
|
|
298
|
-
const availablePlugins = await this.getAvailablePlugins();
|
|
299
|
-
for (const info of availablePlugins) {
|
|
300
|
-
if (info.enabled) {
|
|
301
|
-
const plugin = await this.loader.loadFromDirectory(info.path);
|
|
302
|
-
if (plugin.manifest.dependencies?.plugins?.includes(name)) {
|
|
303
|
-
dependents.push(info.name);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
return dependents;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Validate plugin configuration
|
|
311
|
-
*
|
|
312
|
-
* Checks for circular dependencies, missing plugins, etc.
|
|
313
|
-
*
|
|
314
|
-
* @returns Validation result
|
|
315
|
-
*/
|
|
316
|
-
async validateConfig() {
|
|
317
|
-
const errors = [];
|
|
318
|
-
const enabledPlugins = await this.getEnabledPlugins();
|
|
319
|
-
// Check if all enabled plugins exist
|
|
320
|
-
for (const name of enabledPlugins) {
|
|
321
|
-
const pluginPath = path.join(this.pluginsDir, name);
|
|
322
|
-
if (!(await fs.pathExists(pluginPath))) {
|
|
323
|
-
errors.push(`Enabled plugin '${name}' not found at ${pluginPath}`);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
// Check for circular dependencies
|
|
327
|
-
const visited = new Set();
|
|
328
|
-
const recursionStack = new Set();
|
|
329
|
-
const hasCycle = async (name) => {
|
|
330
|
-
visited.add(name);
|
|
331
|
-
recursionStack.add(name);
|
|
332
|
-
const pluginPath = path.join(this.pluginsDir, name);
|
|
333
|
-
if (!(await fs.pathExists(pluginPath))) {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
const plugin = await this.loader.loadFromDirectory(pluginPath);
|
|
337
|
-
const deps = plugin.manifest.dependencies?.plugins || [];
|
|
338
|
-
for (const dep of deps) {
|
|
339
|
-
if (!visited.has(dep)) {
|
|
340
|
-
if (await hasCycle(dep)) {
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
else if (recursionStack.has(dep)) {
|
|
345
|
-
errors.push(`Circular dependency detected: ${name} → ${dep}`);
|
|
346
|
-
return true;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
recursionStack.delete(name);
|
|
350
|
-
return false;
|
|
351
|
-
};
|
|
352
|
-
for (const name of enabledPlugins) {
|
|
353
|
-
if (!visited.has(name)) {
|
|
354
|
-
await hasCycle(name);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return {
|
|
358
|
-
valid: errors.length === 0,
|
|
359
|
-
errors
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Get plugin by name
|
|
364
|
-
*
|
|
365
|
-
* @param name - Plugin name
|
|
366
|
-
* @returns Loaded plugin
|
|
367
|
-
* @throws PluginNotFoundError if plugin is not loaded
|
|
368
|
-
*/
|
|
369
|
-
getPlugin(name) {
|
|
370
|
-
const plugin = this.loadedPlugins.get(name);
|
|
371
|
-
if (!plugin) {
|
|
372
|
-
throw new PluginNotFoundError(name);
|
|
373
|
-
}
|
|
374
|
-
return plugin;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Get all loaded plugins
|
|
378
|
-
*
|
|
379
|
-
* @returns Map of loaded plugins
|
|
380
|
-
*/
|
|
381
|
-
getLoadedPlugins() {
|
|
382
|
-
return this.loadedPlugins;
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Clear loaded plugins cache
|
|
386
|
-
*
|
|
387
|
-
* Useful for testing or forcing reload
|
|
388
|
-
*/
|
|
389
|
-
clearCache() {
|
|
390
|
-
this.loadedPlugins.clear();
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/core/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin Detection Utility
|
|
3
|
-
*
|
|
4
|
-
* Maps project tech stack signals to SpecWeave plugins.
|
|
5
|
-
* Used by:
|
|
6
|
-
* - specweave init (scan project structure)
|
|
7
|
-
* - plugin-detector skill (runtime detection)
|
|
8
|
-
*/
|
|
9
|
-
import * as fs from 'fs';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
/**
|
|
12
|
-
* Scan project directory for tech stack signals
|
|
13
|
-
*/
|
|
14
|
-
export async function scanProjectStructure(projectDir) {
|
|
15
|
-
const signals = {
|
|
16
|
-
hasPackageJson: false,
|
|
17
|
-
hasPyProject: false,
|
|
18
|
-
hasRequirementsTxt: false,
|
|
19
|
-
hasCsproj: false,
|
|
20
|
-
hasGemfile: false,
|
|
21
|
-
dependencies: [],
|
|
22
|
-
devDependencies: [],
|
|
23
|
-
files: [],
|
|
24
|
-
folders: [],
|
|
25
|
-
gitRemote: null,
|
|
26
|
-
};
|
|
27
|
-
// Check package.json
|
|
28
|
-
const packageJsonPath = path.join(projectDir, 'package.json');
|
|
29
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
30
|
-
signals.hasPackageJson = true;
|
|
31
|
-
try {
|
|
32
|
-
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
33
|
-
signals.dependencies = Object.keys(pkg.dependencies || {});
|
|
34
|
-
signals.devDependencies = Object.keys(pkg.devDependencies || {});
|
|
35
|
-
}
|
|
36
|
-
catch (e) {
|
|
37
|
-
// Ignore parse errors
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Check Python files
|
|
41
|
-
signals.hasPyProject = fs.existsSync(path.join(projectDir, 'pyproject.toml'));
|
|
42
|
-
signals.hasRequirementsTxt = fs.existsSync(path.join(projectDir, 'requirements.txt'));
|
|
43
|
-
// Check .NET files
|
|
44
|
-
const csprojFiles = fs.readdirSync(projectDir).filter(f => f.endsWith('.csproj'));
|
|
45
|
-
signals.hasCsproj = csprojFiles.length > 0;
|
|
46
|
-
// Check Ruby
|
|
47
|
-
signals.hasGemfile = fs.existsSync(path.join(projectDir, 'Gemfile'));
|
|
48
|
-
// Scan folders (top-level only to avoid deep recursion)
|
|
49
|
-
try {
|
|
50
|
-
const entries = fs.readdirSync(projectDir, { withFileTypes: true });
|
|
51
|
-
signals.folders = entries
|
|
52
|
-
.filter(e => e.isDirectory() && !e.name.startsWith('.'))
|
|
53
|
-
.map(e => e.name);
|
|
54
|
-
signals.files = entries
|
|
55
|
-
.filter(e => e.isFile())
|
|
56
|
-
.map(e => e.name);
|
|
57
|
-
}
|
|
58
|
-
catch (e) {
|
|
59
|
-
// Ignore permission errors
|
|
60
|
-
}
|
|
61
|
-
// Check git remote
|
|
62
|
-
const gitConfigPath = path.join(projectDir, '.git', 'config');
|
|
63
|
-
if (fs.existsSync(gitConfigPath)) {
|
|
64
|
-
try {
|
|
65
|
-
const gitConfig = fs.readFileSync(gitConfigPath, 'utf-8');
|
|
66
|
-
const remoteMatch = gitConfig.match(/url\s*=\s*(.+)/);
|
|
67
|
-
if (remoteMatch) {
|
|
68
|
-
signals.gitRemote = remoteMatch[1].trim();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch (e) {
|
|
72
|
-
// Ignore errors
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return signals;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Detect required plugins based on tech stack signals
|
|
79
|
-
*/
|
|
80
|
-
export function detectPlugins(signals) {
|
|
81
|
-
const detected = [];
|
|
82
|
-
// Helper to add detection
|
|
83
|
-
const addPlugin = (name, reason, confidence, signals) => {
|
|
84
|
-
detected.push({ name, reason, confidence, signals });
|
|
85
|
-
};
|
|
86
|
-
// Frontend detection
|
|
87
|
-
const frontendDeps = ['react', 'next', 'vue', 'angular', 'svelte', '@angular/core', 'vue-router', 'react-router-dom'];
|
|
88
|
-
const hasFrontend = signals.dependencies.some(dep => frontendDeps.some(fd => dep.includes(fd)));
|
|
89
|
-
if (hasFrontend) {
|
|
90
|
-
const matchedDeps = signals.dependencies.filter(dep => frontendDeps.some(fd => dep.includes(fd)));
|
|
91
|
-
addPlugin('specweave-frontend', 'Frontend framework detected', 'high', matchedDeps);
|
|
92
|
-
}
|
|
93
|
-
// Backend detection - Node.js
|
|
94
|
-
const backendNodeDeps = ['express', 'fastify', 'nestjs', 'koa', '@nestjs/core', 'hapi'];
|
|
95
|
-
const hasNodeBackend = signals.dependencies.some(dep => backendNodeDeps.some(bd => dep.includes(bd)));
|
|
96
|
-
if (hasNodeBackend) {
|
|
97
|
-
const matchedDeps = signals.dependencies.filter(dep => backendNodeDeps.some(bd => dep.includes(bd)));
|
|
98
|
-
addPlugin('specweave-backend', 'Node.js backend framework detected', 'high', matchedDeps);
|
|
99
|
-
}
|
|
100
|
-
// Backend detection - .NET
|
|
101
|
-
if (signals.hasCsproj) {
|
|
102
|
-
addPlugin('specweave-backend', '.NET project detected', 'high', ['*.csproj files']);
|
|
103
|
-
}
|
|
104
|
-
// Backend detection - Python
|
|
105
|
-
if (signals.hasPyProject || signals.hasRequirementsTxt) {
|
|
106
|
-
addPlugin('specweave-backend', 'Python project detected', 'medium', signals.hasPyProject ? ['pyproject.toml'] : ['requirements.txt']);
|
|
107
|
-
}
|
|
108
|
-
// Kubernetes detection
|
|
109
|
-
const k8sFolders = ['k8s', 'kubernetes', '.kube', 'helm'];
|
|
110
|
-
const hasK8s = signals.folders.some(f => k8sFolders.includes(f.toLowerCase()));
|
|
111
|
-
if (hasK8s) {
|
|
112
|
-
const matchedFolders = signals.folders.filter(f => k8sFolders.includes(f.toLowerCase()));
|
|
113
|
-
addPlugin('specweave-kubernetes', 'Kubernetes configuration detected', 'high', matchedFolders);
|
|
114
|
-
}
|
|
115
|
-
// Infrastructure detection
|
|
116
|
-
const infraFiles = ['docker-compose.yml', 'docker-compose.yaml', 'Dockerfile'];
|
|
117
|
-
const hasInfra = signals.files.some(f => infraFiles.includes(f));
|
|
118
|
-
const infraFolders = ['terraform', 'infrastructure'];
|
|
119
|
-
const hasInfraFolders = signals.folders.some(f => infraFolders.includes(f.toLowerCase()));
|
|
120
|
-
if (hasInfra || hasInfraFolders) {
|
|
121
|
-
const matchedSignals = [
|
|
122
|
-
...signals.files.filter(f => infraFiles.includes(f)),
|
|
123
|
-
...signals.folders.filter(f => infraFolders.includes(f.toLowerCase()))
|
|
124
|
-
];
|
|
125
|
-
addPlugin('specweave-infrastructure', 'Infrastructure as Code detected', 'high', matchedSignals);
|
|
126
|
-
}
|
|
127
|
-
// GitHub detection
|
|
128
|
-
if (signals.gitRemote && signals.gitRemote.includes('github.com')) {
|
|
129
|
-
addPlugin('specweave-github', 'GitHub repository detected', 'high', [signals.gitRemote]);
|
|
130
|
-
}
|
|
131
|
-
// Payment processing detection
|
|
132
|
-
const paymentDeps = ['stripe', '@stripe/stripe-js', 'paypal', 'braintree'];
|
|
133
|
-
const hasPayments = signals.dependencies.some(dep => paymentDeps.some(pd => dep.includes(pd)));
|
|
134
|
-
if (hasPayments) {
|
|
135
|
-
const matchedDeps = signals.dependencies.filter(dep => paymentDeps.some(pd => dep.includes(pd)));
|
|
136
|
-
addPlugin('specweave-payments', 'Payment processing library detected', 'high', matchedDeps);
|
|
137
|
-
}
|
|
138
|
-
// Machine Learning detection
|
|
139
|
-
const mlDeps = ['tensorflow', '@tensorflow/tfjs', 'torch', 'pytorch', 'sklearn', 'keras'];
|
|
140
|
-
const hasML = signals.dependencies.some(dep => mlDeps.some(md => dep.includes(md)));
|
|
141
|
-
if (hasML) {
|
|
142
|
-
const matchedDeps = signals.dependencies.filter(dep => mlDeps.some(md => dep.includes(md)));
|
|
143
|
-
addPlugin('specweave-ml', 'Machine learning library detected', 'high', matchedDeps);
|
|
144
|
-
}
|
|
145
|
-
// Testing detection
|
|
146
|
-
const testingDeps = ['playwright', '@playwright/test', 'cypress', 'selenium-webdriver', '@testing-library/react'];
|
|
147
|
-
const hasTesting = signals.devDependencies.some(dep => testingDeps.some(td => dep.includes(td)));
|
|
148
|
-
if (hasTesting) {
|
|
149
|
-
const matchedDeps = signals.devDependencies.filter(dep => testingDeps.some(td => dep.includes(td)));
|
|
150
|
-
addPlugin('specweave-testing', 'E2E testing framework detected', 'medium', matchedDeps);
|
|
151
|
-
}
|
|
152
|
-
// Documentation detection
|
|
153
|
-
const docsDeps = ['docusaurus', '@docusaurus/core', 'vuepress', 'docsify'];
|
|
154
|
-
const hasDocs = signals.dependencies.some(dep => docsDeps.some(dd => dep.includes(dd)));
|
|
155
|
-
const docsFolders = ['docs', 'documentation', 'doc'];
|
|
156
|
-
const hasDocsFolders = signals.folders.some(f => docsFolders.includes(f.toLowerCase()));
|
|
157
|
-
if (hasDocs || hasDocsFolders) {
|
|
158
|
-
const matchedSignals = [
|
|
159
|
-
...signals.dependencies.filter(dep => docsDeps.some(dd => dep.includes(dd))),
|
|
160
|
-
...signals.folders.filter(f => docsFolders.includes(f.toLowerCase()))
|
|
161
|
-
];
|
|
162
|
-
addPlugin('specweave-docs', 'Documentation site detected', hasDocs ? 'high' : 'medium', matchedSignals);
|
|
163
|
-
}
|
|
164
|
-
// Figma detection
|
|
165
|
-
const figmaDeps = ['figma-api', '@figma/rest-api', 'figma-js'];
|
|
166
|
-
const hasFigma = signals.dependencies.some(dep => figmaDeps.some(fd => dep.includes(fd)));
|
|
167
|
-
const figmaFiles = ['.figmarc', 'figma.config.js'];
|
|
168
|
-
const hasFigmaFiles = signals.files.some(f => figmaFiles.includes(f));
|
|
169
|
-
if (hasFigma || hasFigmaFiles) {
|
|
170
|
-
const matchedSignals = [
|
|
171
|
-
...signals.dependencies.filter(dep => figmaDeps.some(fd => dep.includes(fd))),
|
|
172
|
-
...signals.files.filter(f => figmaFiles.includes(f))
|
|
173
|
-
];
|
|
174
|
-
addPlugin('specweave-figma', 'Figma integration detected', 'high', matchedSignals);
|
|
175
|
-
}
|
|
176
|
-
// Diagrams detection (low confidence - common folder names)
|
|
177
|
-
const diagramsFolders = ['diagrams', 'architecture'];
|
|
178
|
-
const hasDiagrams = signals.folders.some(f => diagramsFolders.includes(f.toLowerCase()));
|
|
179
|
-
if (hasDiagrams) {
|
|
180
|
-
const matchedFolders = signals.folders.filter(f => diagramsFolders.includes(f.toLowerCase()));
|
|
181
|
-
addPlugin('specweave-diagrams', 'Architecture diagrams folder detected', 'low', matchedFolders);
|
|
182
|
-
}
|
|
183
|
-
return detected;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Format detected plugins for CLI output
|
|
187
|
-
*/
|
|
188
|
-
export function formatDetectedPlugins(plugins) {
|
|
189
|
-
if (plugins.length === 0) {
|
|
190
|
-
return ' No additional plugins recommended for this project.';
|
|
191
|
-
}
|
|
192
|
-
// Group by confidence
|
|
193
|
-
const high = plugins.filter(p => p.confidence === 'high');
|
|
194
|
-
const medium = plugins.filter(p => p.confidence === 'medium');
|
|
195
|
-
const low = plugins.filter(p => p.confidence === 'low');
|
|
196
|
-
let output = '';
|
|
197
|
-
if (high.length > 0) {
|
|
198
|
-
output += ' Recommended (high confidence):\n';
|
|
199
|
-
high.forEach(p => {
|
|
200
|
-
output += ` • ${p.name} - ${p.reason}\n`;
|
|
201
|
-
output += ` Signals: ${p.signals.join(', ')}\n`;
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
if (medium.length > 0) {
|
|
205
|
-
output += '\n Suggested (medium confidence):\n';
|
|
206
|
-
medium.forEach(p => {
|
|
207
|
-
output += ` • ${p.name} - ${p.reason}\n`;
|
|
208
|
-
output += ` Signals: ${p.signals.join(', ')}\n`;
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
if (low.length > 0) {
|
|
212
|
-
output += '\n Optional (low confidence):\n';
|
|
213
|
-
low.forEach(p => {
|
|
214
|
-
output += ` • ${p.name} - ${p.reason}\n`;
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
return output;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Generate install commands for detected plugins
|
|
221
|
-
*/
|
|
222
|
-
export function generateInstallCommands(plugins) {
|
|
223
|
-
// Only include high and medium confidence
|
|
224
|
-
const toInstall = plugins.filter(p => p.confidence === 'high' || p.confidence === 'medium');
|
|
225
|
-
// Deduplicate by name
|
|
226
|
-
const uniquePlugins = Array.from(new Set(toInstall.map(p => p.name)));
|
|
227
|
-
return uniquePlugins.map(name => `/plugin install ${name}@specweave`);
|
|
228
|
-
}
|
|
229
|
-
//# sourceMappingURL=plugin-detection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-detection.js","sourceRoot":"","sources":["../../src/utils/plugin-detection.ts"],"names":[],"mappings":"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"}
|