specweave 0.4.0 → 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 +501 -28
- package/README.md +99 -57
- 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 +48 -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/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/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/commands/specweave.increment.md +48 -4
- 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/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **Spec-Driven Development Framework** - Where specifications and documentation are the source of truth
|
|
4
4
|
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
[](https://github.com/anton-abyzov/specweave/releases/tag/v0.4.0)
|
|
7
7
|
[]()
|
|
8
8
|
[](https://spec-weave.com)
|
|
9
9
|
|
|
@@ -30,15 +30,19 @@
|
|
|
30
30
|
|
|
31
31
|
- 🤖 **Autonomous & Smart** - Just works! Agents ask clarifying questions, review output, validate quality—minimal interaction required
|
|
32
32
|
- ⚡ **Seamless Workflow** - Auto-resume, auto-close, progress tracking—natural flow without overhead
|
|
33
|
-
-
|
|
34
|
-
-
|
|
33
|
+
- 🔌 **Plugin Architecture** (NEW in v0.4.0) - Modular design with 75%+ context reduction! Core framework (12K tokens) + opt-in plugins only when needed
|
|
34
|
+
- Core: 3 agents + 8 skills (always loaded)
|
|
35
|
+
- Plugins: GitHub sync, tech stacks, domain expertise (load on demand)
|
|
36
|
+
- **Context efficiency**: 50K → 12K tokens for basic projects!
|
|
37
|
+
- 🎯 **Extensible & Scalable** - 10+ agents and 40+ skills via plugins. PM, Architect, DevOps, QA, Security work in parallel
|
|
35
38
|
- 🔧 **Universal Support** - Works with Claude Code (default), Cursor, Gemini CLI, Codex, Copilot, and ANY AI tool (100% market coverage)
|
|
36
|
-
- **Claude Code** (default): Native
|
|
37
|
-
- **
|
|
39
|
+
- **Claude Code** (default): Native plugin support with auto-activation - best experience!
|
|
40
|
+
- **Cursor/Copilot**: Plugin compilation to AGENTS.md - semi-automation
|
|
41
|
+
- **Other tools**: AGENTS.md for manual workflows - full capability access!
|
|
38
42
|
- 🧪 **Complete Test Coverage** - 4-level strategy from specs to integration tests (APIs, UIs, CLIs, libraries)
|
|
39
43
|
- 📚 **Living Documentation** - Specs auto-update after every operation and test—always in sync with code
|
|
40
44
|
- 🎨 **Visual Architecture** - C4 Model diagrams (Context, Container, Component)
|
|
41
|
-
- 🔄 **Tool Integration** -
|
|
45
|
+
- 🔄 **Tool Integration** - GitHub, JIRA, Azure DevOps sync (via plugins)
|
|
42
46
|
- 🏢 **Brownfield Excellence** - The hardest problem solved: merge with existing docs, create complex architecture (ADRs, HLDs, RFCs), maintain living documentation, safe regression prevention
|
|
43
47
|
- 🌐 **Framework Agnostic** - Works with TypeScript, Python, Go, Rust, Java, C#—any tech stack
|
|
44
48
|
|
|
@@ -107,8 +111,9 @@ specweave --help # Show help
|
|
|
107
111
|
```
|
|
108
112
|
|
|
109
113
|
**Note**:
|
|
110
|
-
- **Claude Code**:
|
|
114
|
+
- **Claude Code**: Core framework (3 agents + 8 skills) installed natively in `.claude/` + plugins auto-detected and suggested!
|
|
111
115
|
- **Other tools**: Universal AGENTS.md adapter generated - works with Cursor, Gemini CLI, Codex, Copilot, and ANY AI!
|
|
116
|
+
- **Plugins**: Auto-detected based on your project (GitHub, tech stacks, domain expertise) - enable as needed!
|
|
112
117
|
|
|
113
118
|
---
|
|
114
119
|
|
|
@@ -121,10 +126,11 @@ specweave --help # Show help
|
|
|
121
126
|
npx specweave init my-app
|
|
122
127
|
cd my-app
|
|
123
128
|
|
|
124
|
-
# For Claude Code -
|
|
125
|
-
# ✅
|
|
126
|
-
# ✅
|
|
127
|
-
# ✅
|
|
129
|
+
# For Claude Code - core framework native and ready immediately:
|
|
130
|
+
# ✅ 3 core agents in .claude/agents/ (PM, Architect, Tech Lead)
|
|
131
|
+
# ✅ 8 core skills in .claude/skills/ (increment lifecycle, living docs)
|
|
132
|
+
# ✅ 7 slash commands in .claude/commands/
|
|
133
|
+
# ✅ Plugins auto-detected and suggested based on project
|
|
128
134
|
# (Other tools get AGENTS.md adapter instead)
|
|
129
135
|
|
|
130
136
|
# Open Claude Code and use slash commands:
|
|
@@ -163,10 +169,11 @@ User: /specweave done 0001 # Close increment with slash command
|
|
|
163
169
|
|
|
164
170
|
**How it works** (smart append-only workflow: 0001 → 0002 → 0003):
|
|
165
171
|
1. `specweave init` → Detects your AI tool and configures appropriately
|
|
166
|
-
- **Claude Code**:
|
|
167
|
-
- **Other tools**: Universal AGENTS.md adapter generated
|
|
172
|
+
- **Claude Code**: Core framework installed + plugins auto-detected and suggested
|
|
173
|
+
- **Other tools**: Universal AGENTS.md adapter generated with enabled plugins
|
|
168
174
|
2. **Use `/specweave inc "feature"`** (Claude) or "Read AGENTS.md and create increment" (other tools)
|
|
169
175
|
- PM creates specs + plan + auto-generates tasks
|
|
176
|
+
- **Smart**: Auto-detects needed plugins from feature description
|
|
170
177
|
- **Smart**: Auto-closes previous increment if PM gates pass
|
|
171
178
|
3. **Use `/specweave do` or `/specweave do 0001`** → Execute implementation (hooks after EVERY task in Claude)
|
|
172
179
|
- **Smart**: Auto-resumes from next incomplete task
|
|
@@ -183,70 +190,105 @@ User: /specweave done 0001 # Close increment with slash command
|
|
|
183
190
|
|
|
184
191
|
---
|
|
185
192
|
|
|
186
|
-
## 🤖 Agents
|
|
193
|
+
## 🤖 Agents
|
|
187
194
|
|
|
188
|
-
SpecWeave
|
|
195
|
+
SpecWeave uses a **modular agent system** - core agents (always available) + plugin agents (opt-in):
|
|
196
|
+
|
|
197
|
+
### Core Agents (Always Available)
|
|
189
198
|
|
|
190
199
|
| Agent | Role | When It Activates |
|
|
191
200
|
|-------|------|-------------------|
|
|
192
201
|
| **pm** | Product Manager - requirements, user stories | Planning features, creating increments |
|
|
193
202
|
| **architect** | System Architect - design, ADRs, decisions | Technical design, architecture |
|
|
194
|
-
| **security** | Security Engineer - threat modeling, OWASP | Security review, vulnerability assessment |
|
|
195
|
-
| **qa-lead** | QA Lead - test strategy, quality gates | Testing, quality assurance |
|
|
196
|
-
| **devops** | DevOps Engineer - CI/CD, infrastructure | Deployment, infrastructure needs |
|
|
197
203
|
| **tech-lead** | Technical Lead - code review, best practices | Code review, refactoring |
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
|
204
|
+
|
|
205
|
+
### Plugin Agents (Available via Plugins)
|
|
206
|
+
|
|
207
|
+
| Agent | Plugin | Role | When It Activates |
|
|
208
|
+
|-------|--------|------|-------------------|
|
|
209
|
+
| **github-manager** | specweave-github | GitHub CLI specialist | GitHub operations, issue sync |
|
|
210
|
+
| **security** | specweave-security | Security Engineer - threat modeling | Security review, vulnerabilities |
|
|
211
|
+
| **qa-lead** | specweave-qa | QA Lead - test strategy | Testing, quality assurance |
|
|
212
|
+
| **devops** | specweave-kubernetes | DevOps Engineer - K8s, infrastructure | Deployment, infrastructure |
|
|
213
|
+
| **sre** | specweave-observability | SRE - incident response, monitoring | Production incidents |
|
|
214
|
+
| **docs-writer** | specweave-docs | Technical Writer - documentation | Writing docs, API docs |
|
|
215
|
+
| **performance** | specweave-performance | Performance Engineer - optimization | Performance issues |
|
|
216
|
+
| **diagrams-architect** | specweave-diagrams | Diagram Expert - C4 Model, Mermaid | Creating diagrams |
|
|
202
217
|
|
|
203
218
|
**Agent Access**:
|
|
204
|
-
- **Claude Code**:
|
|
205
|
-
- **Other tools**: Agents
|
|
219
|
+
- **Claude Code**: Core agents pre-installed in `.claude/agents/`, plugin agents load on demand!
|
|
220
|
+
- **Other tools**: Agents compiled to AGENTS.md - reference roles manually
|
|
206
221
|
|
|
207
222
|
---
|
|
208
223
|
|
|
209
|
-
## 🎯 Skills
|
|
224
|
+
## 🎯 Skills
|
|
225
|
+
|
|
226
|
+
SpecWeave uses a **modular skill system** - core skills (always available) + plugin skills (opt-in):
|
|
210
227
|
|
|
211
|
-
|
|
228
|
+
### Core Skills (Always Available)
|
|
212
229
|
|
|
213
|
-
|
|
214
|
-
- **specweave-detector** - Slash command documentation
|
|
230
|
+
**Increment Lifecycle:**
|
|
215
231
|
- **increment-planner** - Plan features via `/specweave inc` command
|
|
216
|
-
- **
|
|
217
|
-
- **context-loader** -
|
|
218
|
-
- **
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- **
|
|
222
|
-
- **
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
- **frontend** - React, Vue, Angular components
|
|
226
|
-
|
|
227
|
-
### Integration Skills
|
|
228
|
-
- **jira-sync** - Sync with JIRA issues
|
|
229
|
-
- **ado-sync** - Sync with Azure DevOps
|
|
230
|
-
- **github-sync** - Sync with GitHub issues
|
|
231
|
-
|
|
232
|
-
### Design & Diagram Skills
|
|
233
|
-
- **diagrams-generator** - Generate C4 diagrams
|
|
234
|
-
- **figma-designer** - Create Figma designs
|
|
235
|
-
- **figma-implementer** - Convert Figma to code
|
|
236
|
-
|
|
237
|
-
### Infrastructure Skills
|
|
238
|
-
- **hetzner-provisioner** - Deploy to Hetzner Cloud
|
|
239
|
-
- **cost-optimizer** - Optimize cloud costs
|
|
240
|
-
|
|
241
|
-
### Brownfield Skills
|
|
232
|
+
- **rfc-generator** - Generate RFCs and technical proposals
|
|
233
|
+
- **context-loader** - Explains progressive disclosure and context efficiency
|
|
234
|
+
- **context-optimizer** - Second-pass context optimization (80%+ token reduction)
|
|
235
|
+
|
|
236
|
+
**Project Management:**
|
|
237
|
+
- **project-kickstarter** - Initialize new projects from descriptions
|
|
238
|
+
- **increment-quality-judge** - AI-powered quality assessment
|
|
239
|
+
|
|
240
|
+
**Brownfield Support:**
|
|
242
241
|
- **brownfield-analyzer** - Analyze existing codebases
|
|
243
242
|
- **brownfield-onboarder** - Merge existing documentation
|
|
244
243
|
|
|
245
|
-
|
|
244
|
+
### Plugin Skills (40+ Available via Plugins)
|
|
245
|
+
|
|
246
|
+
**GitHub Integration (specweave-github):**
|
|
247
|
+
- **github-sync** - Bidirectional increment ↔ issue sync
|
|
248
|
+
- **github-issue-tracker** - Task-level progress tracking
|
|
249
|
+
|
|
250
|
+
**Technology Stacks:**
|
|
251
|
+
- **nextjs** - Next.js App Router, Server Components (specweave-frontend-stack)
|
|
252
|
+
- **nodejs-backend** - Node.js, Express, NestJS APIs (specweave-backend-stack)
|
|
253
|
+
- **python-backend** - FastAPI, Django APIs (specweave-backend-stack)
|
|
254
|
+
- **dotnet-backend** - ASP.NET Core APIs (specweave-backend-stack)
|
|
255
|
+
- **frontend** - React, Vue, Angular components (specweave-frontend-stack)
|
|
256
|
+
|
|
257
|
+
**Infrastructure:**
|
|
258
|
+
- **hetzner-provisioner** - Deploy to Hetzner Cloud (specweave-cloud)
|
|
259
|
+
- **cost-optimizer** - Optimize cloud costs (specweave-cloud)
|
|
260
|
+
- **k8s-deployer** - Kubernetes deployment (specweave-kubernetes)
|
|
261
|
+
|
|
262
|
+
**Integrations:**
|
|
263
|
+
- **jira-sync** - Sync with JIRA issues (specweave-jira)
|
|
264
|
+
- **ado-sync** - Sync with Azure DevOps (specweave-ado)
|
|
265
|
+
|
|
266
|
+
**Design & Diagrams:**
|
|
267
|
+
- **diagrams-generator** - Generate C4 diagrams (specweave-diagrams)
|
|
268
|
+
- **figma-designer** - Create Figma designs (specweave-figma)
|
|
269
|
+
- **figma-implementer** - Convert Figma to code (specweave-figma)
|
|
270
|
+
|
|
271
|
+
**And 30+ more specialized skills!**
|
|
272
|
+
|
|
273
|
+
### 🔌 Plugin System (NEW in v0.4.0)
|
|
274
|
+
|
|
275
|
+
SpecWeave v0.4.0 introduces **intelligent plugin detection**:
|
|
276
|
+
|
|
277
|
+
1. **Auto-Detection** - Plugins suggested based on:
|
|
278
|
+
- Package.json dependencies (React → frontend-stack)
|
|
279
|
+
- Directory structure (kubernetes/ → kubernetes)
|
|
280
|
+
- Git remote (github.com → github)
|
|
281
|
+
- Environment variables (GITHUB_TOKEN → github)
|
|
246
282
|
|
|
247
|
-
|
|
283
|
+
2. **Context Efficiency** - Load only what you need:
|
|
284
|
+
- Basic project: **12K tokens** (core only)
|
|
285
|
+
- React app: **16K tokens** (core + frontend-stack + github)
|
|
286
|
+
- Backend API: **15K tokens** (core + backend-stack + github)
|
|
248
287
|
|
|
249
|
-
|
|
288
|
+
3. **Multi-Tool Support** - Works across all platforms:
|
|
289
|
+
- **Claude Code**: Native plugin loading
|
|
290
|
+
- **Cursor/Copilot**: AGENTS.md compilation
|
|
291
|
+
- **Generic**: Manual workflows
|
|
250
292
|
|
|
251
293
|
**How it works**:
|
|
252
294
|
1. **Discovery**: Read `.claude/skills/SKILLS-INDEX.md` (1 file vs 35 files = 97% faster)
|
package/bin/specweave.js
CHANGED
|
@@ -81,6 +81,18 @@ program
|
|
|
81
81
|
await loader.listAdapters();
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
+
// Plugin commands - Manage plugins
|
|
85
|
+
program
|
|
86
|
+
.command('plugin <action> [plugin-name]')
|
|
87
|
+
.description('Manage plugins (list, enable, disable, info)')
|
|
88
|
+
.option('--enabled', 'Show only enabled plugins (for list)')
|
|
89
|
+
.option('--available', 'Show only available plugins (for list)')
|
|
90
|
+
.option('--force', 'Force operation (for enable/disable)')
|
|
91
|
+
.action(async (action, pluginName, options) => {
|
|
92
|
+
const { pluginCommand } = await import('../dist/cli/commands/plugin.js');
|
|
93
|
+
await pluginCommand(action, pluginName, options);
|
|
94
|
+
});
|
|
95
|
+
|
|
84
96
|
// Help text
|
|
85
97
|
program.on('--help', () => {
|
|
86
98
|
console.log('');
|
|
@@ -88,6 +100,10 @@ program.on('--help', () => {
|
|
|
88
100
|
console.log(' $ specweave init my-saas # Create new project (auto-detect tool)');
|
|
89
101
|
console.log(' $ specweave init my-saas --adapter cursor # Create project for Cursor');
|
|
90
102
|
console.log(' $ specweave adapters # List available AI tool adapters');
|
|
103
|
+
console.log(' $ specweave plugin list # List all plugins');
|
|
104
|
+
console.log(' $ specweave plugin enable specweave-github # Enable GitHub plugin');
|
|
105
|
+
console.log(' $ specweave plugin disable specweave-github # Disable GitHub plugin');
|
|
106
|
+
console.log(' $ specweave plugin info specweave-github # Show plugin details');
|
|
91
107
|
console.log(' $ specweave install pm --local # Install PM agent locally');
|
|
92
108
|
console.log(' $ specweave install --global # Install all (interactive)');
|
|
93
109
|
console.log(' $ specweave list # List all available components');
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Concrete adapters extend this class and implement tool-specific logic.
|
|
6
6
|
*/
|
|
7
7
|
import { IAdapter, AdapterOptions, RequirementsResult, AdapterFile, AutomationLevel } from './adapter-interface.js';
|
|
8
|
+
import type { Plugin } from '../core/types/plugin.js';
|
|
8
9
|
export declare abstract class AdapterBase implements IAdapter {
|
|
9
10
|
abstract name: string;
|
|
10
11
|
abstract description: string;
|
|
@@ -46,5 +47,25 @@ export declare abstract class AdapterBase implements IAdapter {
|
|
|
46
47
|
* Helper: Read template file and replace variables
|
|
47
48
|
*/
|
|
48
49
|
protected readTemplate(templatePath: string, variables: Record<string, string>): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if this adapter supports plugins
|
|
52
|
+
* Default: No plugin support (override in concrete adapters)
|
|
53
|
+
*/
|
|
54
|
+
supportsPlugins(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Compile and install a plugin
|
|
57
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
58
|
+
*/
|
|
59
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Unload a plugin
|
|
62
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
63
|
+
*/
|
|
64
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get installed plugins
|
|
67
|
+
* Default: Return empty array (override in concrete adapters that support plugins)
|
|
68
|
+
*/
|
|
69
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
49
70
|
}
|
|
50
71
|
//# sourceMappingURL=adapter-base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-base.d.ts","sourceRoot":"","sources":["../../src/adapters/adapter-base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EAChB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter-base.d.ts","sourceRoot":"","sources":["../../src/adapters/adapter-base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,8BAAsB,WAAY,YAAW,QAAQ;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA0BtD;;OAEG;IACH,QAAQ,CAAC,QAAQ,IAAI,WAAW,EAAE;IAElC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzD;;OAEG;IACH,QAAQ,CAAC,eAAe,IAAI,MAAM;IAElC;;OAEG;cACa,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE;;OAEG;cACa,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9D;;OAEG;cACa,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC;IAWlB;;;OAGG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD;;;OAGG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAG/C"}
|
|
@@ -107,5 +107,33 @@ export class AdapterBase {
|
|
|
107
107
|
}
|
|
108
108
|
return content;
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if this adapter supports plugins
|
|
112
|
+
* Default: No plugin support (override in concrete adapters)
|
|
113
|
+
*/
|
|
114
|
+
supportsPlugins() {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Compile and install a plugin
|
|
119
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
120
|
+
*/
|
|
121
|
+
async compilePlugin(plugin) {
|
|
122
|
+
throw new Error(`Plugin support not implemented for ${this.name} adapter`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Unload a plugin
|
|
126
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
127
|
+
*/
|
|
128
|
+
async unloadPlugin(pluginName) {
|
|
129
|
+
throw new Error(`Plugin support not implemented for ${this.name} adapter`);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get installed plugins
|
|
133
|
+
* Default: Return empty array (override in concrete adapters that support plugins)
|
|
134
|
+
*/
|
|
135
|
+
async getInstalledPlugins() {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
110
138
|
}
|
|
111
139
|
//# sourceMappingURL=adapter-base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-base.js","sourceRoot":"","sources":["../../src/adapters/adapter-base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter-base.js","sourceRoot":"","sources":["../../src/adapters/adapter-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Defines the contract that all SpecWeave adapters must implement.
|
|
5
5
|
* Enables SpecWeave to work with ANY AI coding tool (Claude, Cursor, Copilot, etc.)
|
|
6
6
|
*/
|
|
7
|
+
import type { Plugin } from '../core/types/plugin.js';
|
|
7
8
|
export interface AdapterOptions {
|
|
8
9
|
projectPath: string;
|
|
9
10
|
projectName: string;
|
|
@@ -104,5 +105,45 @@ export interface IAdapter {
|
|
|
104
105
|
* @returns string Markdown-formatted instructions
|
|
105
106
|
*/
|
|
106
107
|
getInstructions(): string;
|
|
108
|
+
/**
|
|
109
|
+
* Check if this adapter supports plugins
|
|
110
|
+
*
|
|
111
|
+
* Returns true if the adapter can install and compile plugins
|
|
112
|
+
* (Claude native, Cursor AGENTS.md, Copilot instructions.md)
|
|
113
|
+
* Returns false for generic/manual adapters
|
|
114
|
+
*
|
|
115
|
+
* @returns boolean True if plugins are supported
|
|
116
|
+
*/
|
|
117
|
+
supportsPlugins(): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Compile and install a plugin for this adapter
|
|
120
|
+
*
|
|
121
|
+
* Transforms plugin content (skills/agents/commands) to tool-specific format:
|
|
122
|
+
* - Claude: Copy to .claude/skills/, .claude/agents/, .claude/commands/
|
|
123
|
+
* - Cursor: Compile to AGENTS.md + team commands JSON
|
|
124
|
+
* - Copilot: Compile to .github/copilot/instructions.md
|
|
125
|
+
* - Generic: Generate manual copy-paste instructions
|
|
126
|
+
*
|
|
127
|
+
* @param plugin Plugin to compile and install
|
|
128
|
+
* @returns Promise<void>
|
|
129
|
+
*/
|
|
130
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Unload (disable) a plugin for this adapter
|
|
133
|
+
*
|
|
134
|
+
* Removes plugin-specific files and restores previous state
|
|
135
|
+
*
|
|
136
|
+
* @param pluginName Name of plugin to unload
|
|
137
|
+
* @returns Promise<void>
|
|
138
|
+
*/
|
|
139
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Get plugin installation status
|
|
142
|
+
*
|
|
143
|
+
* Returns information about which plugins are currently installed
|
|
144
|
+
*
|
|
145
|
+
* @returns Promise<string[]> Array of installed plugin names
|
|
146
|
+
*/
|
|
147
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
107
148
|
}
|
|
108
149
|
//# sourceMappingURL=adapter-interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-interface.d.ts","sourceRoot":"","sources":["../../src/adapters/adapter-interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnE;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,eAAe,EAAE,eAAe,CAAC;IAEjC;;;;;;;;;OASG;IACH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3B;;;;;;;;;OASG;IACH,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjD;;;;OAIG;IACH,QAAQ,IAAI,WAAW,EAAE,CAAC;IAE1B;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;;;;;OAMG;IACH,eAAe,IAAI,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter-interface.d.ts","sourceRoot":"","sources":["../../src/adapters/adapter-interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnE;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,eAAe,EAAE,eAAe,CAAC;IAEjC;;;;;;;;;OASG;IACH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3B;;;;;;;;;OASG;IACH,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjD;;;;OAIG;IACH,QAAQ,IAAI,WAAW,EAAE,CAAC;IAE1B;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;;;;;OAMG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;;;;;;OAQG;IACH,eAAe,IAAI,OAAO,CAAC;IAE3B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;;;OAOG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;;;;;OAMG;IACH,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { AdapterBase } from '../adapter-base.js';
|
|
11
11
|
import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
|
|
12
|
+
import type { Plugin } from '../../core/types/plugin.js';
|
|
12
13
|
export declare class ClaudeAdapter extends AdapterBase {
|
|
13
14
|
name: string;
|
|
14
15
|
description: string;
|
|
@@ -50,5 +51,40 @@ export declare class ClaudeAdapter extends AdapterBase {
|
|
|
50
51
|
* Get usage instructions for Claude adapter
|
|
51
52
|
*/
|
|
52
53
|
getInstructions(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Check if Claude adapter supports plugins
|
|
56
|
+
*
|
|
57
|
+
* Claude Code has FULL plugin support via native .claude/ directory
|
|
58
|
+
*
|
|
59
|
+
* @returns boolean Always true
|
|
60
|
+
*/
|
|
61
|
+
supportsPlugins(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Compile and install a plugin for Claude Code
|
|
64
|
+
*
|
|
65
|
+
* Claude uses native plugin installation:
|
|
66
|
+
* - Copy skills to .claude/skills/{plugin-name}/{skill-name}/
|
|
67
|
+
* - Copy agents to .claude/agents/{plugin-name}/{agent-name}/
|
|
68
|
+
* - Copy commands to .claude/commands/
|
|
69
|
+
*
|
|
70
|
+
* @param plugin Plugin to install
|
|
71
|
+
*/
|
|
72
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Unload a plugin from Claude Code
|
|
75
|
+
*
|
|
76
|
+
* Removes plugin files from .claude/ directory
|
|
77
|
+
*
|
|
78
|
+
* @param pluginName Name of plugin to unload
|
|
79
|
+
*/
|
|
80
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get list of installed plugins
|
|
83
|
+
*
|
|
84
|
+
* Returns plugin names that are currently installed in .claude/
|
|
85
|
+
*
|
|
86
|
+
* @returns Array of installed plugin names
|
|
87
|
+
*/
|
|
88
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
53
89
|
}
|
|
54
90
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,aAAc,SAAQ,WAAW;IAC5C,IAAI,SAAY;IAChB,WAAW,SAA0F;IACrG,eAAe,EAAG,MAAM,CAAU;IAElC;;;;;;OAMG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAUhC;;;;;;;;OAQG;IACH,QAAQ,IAAI,WAAW,EAAE;IAYzB;;;;;;;;;OASG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;OAEG;IACH,eAAe,IAAI,MAAM;IAuDzB;;;;;;OAMG;IACH,eAAe,IAAI,OAAO;IAI1B;;;;;;;;;OASG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DlD;;;;;;OAMG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDrD;;;;;;OAMG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAe/C"}
|
|
@@ -143,5 +143,140 @@ You're ready to build with SpecWeave on Claude Code!
|
|
|
143
143
|
For complete documentation, see: .claude/README.md
|
|
144
144
|
`;
|
|
145
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if Claude adapter supports plugins
|
|
148
|
+
*
|
|
149
|
+
* Claude Code has FULL plugin support via native .claude/ directory
|
|
150
|
+
*
|
|
151
|
+
* @returns boolean Always true
|
|
152
|
+
*/
|
|
153
|
+
supportsPlugins() {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Compile and install a plugin for Claude Code
|
|
158
|
+
*
|
|
159
|
+
* Claude uses native plugin installation:
|
|
160
|
+
* - Copy skills to .claude/skills/{plugin-name}/{skill-name}/
|
|
161
|
+
* - Copy agents to .claude/agents/{plugin-name}/{agent-name}/
|
|
162
|
+
* - Copy commands to .claude/commands/
|
|
163
|
+
*
|
|
164
|
+
* @param plugin Plugin to install
|
|
165
|
+
*/
|
|
166
|
+
async compilePlugin(plugin) {
|
|
167
|
+
const projectPath = process.cwd();
|
|
168
|
+
const claudeDir = path.join(projectPath, '.claude');
|
|
169
|
+
console.log(`\n📦 Installing plugin: ${plugin.manifest.name}`);
|
|
170
|
+
// Ensure base directories exist
|
|
171
|
+
await fs.ensureDir(path.join(claudeDir, 'skills'));
|
|
172
|
+
await fs.ensureDir(path.join(claudeDir, 'agents'));
|
|
173
|
+
await fs.ensureDir(path.join(claudeDir, 'commands'));
|
|
174
|
+
// Install skills
|
|
175
|
+
for (const skill of plugin.skills) {
|
|
176
|
+
const targetPath = path.join(claudeDir, 'skills', skill.name);
|
|
177
|
+
await fs.ensureDir(targetPath);
|
|
178
|
+
// Copy SKILL.md
|
|
179
|
+
const skillMdPath = path.join(skill.path, 'SKILL.md');
|
|
180
|
+
if (await fs.pathExists(skillMdPath)) {
|
|
181
|
+
await fs.copy(skillMdPath, path.join(targetPath, 'SKILL.md'));
|
|
182
|
+
}
|
|
183
|
+
// Copy test cases if they exist
|
|
184
|
+
const testCasesDir = path.join(skill.path, 'test-cases');
|
|
185
|
+
if (await fs.pathExists(testCasesDir)) {
|
|
186
|
+
await fs.copy(testCasesDir, path.join(targetPath, 'test-cases'));
|
|
187
|
+
}
|
|
188
|
+
console.log(` ✓ Skill: ${skill.name}`);
|
|
189
|
+
}
|
|
190
|
+
// Install agents
|
|
191
|
+
for (const agent of plugin.agents) {
|
|
192
|
+
const targetPath = path.join(claudeDir, 'agents', agent.name);
|
|
193
|
+
await fs.ensureDir(targetPath);
|
|
194
|
+
// Copy AGENT.md
|
|
195
|
+
const agentMdPath = path.join(agent.path, 'AGENT.md');
|
|
196
|
+
if (await fs.pathExists(agentMdPath)) {
|
|
197
|
+
await fs.copy(agentMdPath, path.join(targetPath, 'AGENT.md'));
|
|
198
|
+
}
|
|
199
|
+
console.log(` ✓ Agent: ${agent.name}`);
|
|
200
|
+
}
|
|
201
|
+
// Install commands
|
|
202
|
+
for (const command of plugin.commands) {
|
|
203
|
+
// Commands use their full name as filename
|
|
204
|
+
const fileName = command.name.replace(/\./g, '-') + '.md';
|
|
205
|
+
const targetPath = path.join(claudeDir, 'commands', fileName);
|
|
206
|
+
if (await fs.pathExists(command.path)) {
|
|
207
|
+
await fs.copy(command.path, targetPath);
|
|
208
|
+
}
|
|
209
|
+
console.log(` ✓ Command: /${command.name}`);
|
|
210
|
+
}
|
|
211
|
+
console.log(`\n✅ Plugin ${plugin.manifest.name} installed!`);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Unload a plugin from Claude Code
|
|
215
|
+
*
|
|
216
|
+
* Removes plugin files from .claude/ directory
|
|
217
|
+
*
|
|
218
|
+
* @param pluginName Name of plugin to unload
|
|
219
|
+
*/
|
|
220
|
+
async unloadPlugin(pluginName) {
|
|
221
|
+
const projectPath = process.cwd();
|
|
222
|
+
const claudeDir = path.join(projectPath, '.claude');
|
|
223
|
+
console.log(`\n🗑️ Unloading plugin: ${pluginName}`);
|
|
224
|
+
// Read plugin manifest to know what to remove
|
|
225
|
+
const pluginsDir = path.join(projectPath, 'src', 'plugins');
|
|
226
|
+
const pluginPath = path.join(pluginsDir, pluginName);
|
|
227
|
+
if (!(await fs.pathExists(pluginPath))) {
|
|
228
|
+
console.warn(`⚠️ Plugin ${pluginName} not found`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Load plugin to get its components
|
|
232
|
+
const { PluginLoader } = await import('../../core/plugin-loader.js');
|
|
233
|
+
const loader = new PluginLoader();
|
|
234
|
+
const plugin = await loader.loadFromDirectory(pluginPath);
|
|
235
|
+
// Remove skills
|
|
236
|
+
for (const skill of plugin.skills) {
|
|
237
|
+
const skillPath = path.join(claudeDir, 'skills', skill.name);
|
|
238
|
+
if (await fs.pathExists(skillPath)) {
|
|
239
|
+
await fs.remove(skillPath);
|
|
240
|
+
console.log(` ✓ Removed skill: ${skill.name}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Remove agents
|
|
244
|
+
for (const agent of plugin.agents) {
|
|
245
|
+
const agentPath = path.join(claudeDir, 'agents', agent.name);
|
|
246
|
+
if (await fs.pathExists(agentPath)) {
|
|
247
|
+
await fs.remove(agentPath);
|
|
248
|
+
console.log(` ✓ Removed agent: ${agent.name}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Remove commands
|
|
252
|
+
for (const command of plugin.commands) {
|
|
253
|
+
const fileName = command.name.replace(/\./g, '-') + '.md';
|
|
254
|
+
const commandPath = path.join(claudeDir, 'commands', fileName);
|
|
255
|
+
if (await fs.pathExists(commandPath)) {
|
|
256
|
+
await fs.remove(commandPath);
|
|
257
|
+
console.log(` ✓ Removed command: /${command.name}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
console.log(`\n✅ Plugin ${pluginName} unloaded!`);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get list of installed plugins
|
|
264
|
+
*
|
|
265
|
+
* Returns plugin names that are currently installed in .claude/
|
|
266
|
+
*
|
|
267
|
+
* @returns Array of installed plugin names
|
|
268
|
+
*/
|
|
269
|
+
async getInstalledPlugins() {
|
|
270
|
+
const projectPath = process.cwd();
|
|
271
|
+
const configPath = path.join(projectPath, '.specweave', 'config.yaml');
|
|
272
|
+
if (!(await fs.pathExists(configPath))) {
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
// Read config to get enabled plugins
|
|
276
|
+
const yaml = await import('js-yaml');
|
|
277
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
278
|
+
const config = yaml.load(content);
|
|
279
|
+
return config.plugins?.enabled || [];
|
|
280
|
+
}
|
|
146
281
|
}
|
|
147
282
|
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/claude/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/claude/adapter.ts"],"names":[],"mappings":"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"}
|