wave-agent-sdk 0.17.4 → 0.17.6
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/dist/managers/MemoryRuleManager.d.ts.map +1 -1
- package/dist/managers/MemoryRuleManager.js +30 -13
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +3 -1
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +12 -4
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +13 -6
- package/dist/managers/skillManager.d.ts +3 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +69 -54
- package/dist/services/MarketplaceService.d.ts +15 -0
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +95 -6
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +39 -5
- package/dist/services/pluginLoader.d.ts.map +1 -1
- package/dist/services/pluginLoader.js +30 -7
- package/dist/types/marketplace.d.ts +1 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/utils/customCommands.js +11 -9
- package/dist/utils/skillParser.d.ts.map +1 -1
- package/dist/utils/skillParser.js +3 -1
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +18 -7
- package/package.json +1 -1
- package/src/managers/MemoryRuleManager.ts +29 -14
- package/src/managers/hookManager.ts +6 -1
- package/src/managers/lspManager.ts +23 -5
- package/src/managers/mcpManager.ts +24 -7
- package/src/managers/skillManager.ts +90 -57
- package/src/services/MarketplaceService.ts +152 -6
- package/src/services/memory.ts +43 -6
- package/src/services/pluginLoader.ts +35 -7
- package/src/types/marketplace.ts +1 -0
- package/src/types/skills.ts +1 -0
- package/src/utils/customCommands.ts +17 -12
- package/src/utils/skillParser.ts +3 -1
- package/src/utils/subagentParser.ts +22 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAGzB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,wBAAwB;IAMnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryRuleManager.d.ts","sourceRoot":"","sources":["../../src/managers/MemoryRuleManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAoB;gBAGzB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,wBAAwB;IAMnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBtB,aAAa;YAyDb,YAAY;IAkC1B;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
|
|
@@ -17,19 +17,22 @@ export class MemoryRuleManager {
|
|
|
17
17
|
* Scans .wave/rules and ~/.wave/rules for memory rule files.
|
|
18
18
|
*/
|
|
19
19
|
async discoverRules() {
|
|
20
|
-
const
|
|
21
|
-
const
|
|
20
|
+
const projectWaveRulesDir = path.join(this.workdir, ".wave", "rules");
|
|
21
|
+
const projectClaudeRulesDir = path.join(this.workdir, ".claude", "rules");
|
|
22
|
+
const userWaveRulesDir = path.join(os.homedir(), ".wave", "rules");
|
|
23
|
+
const userClaudeRulesDir = path.join(os.homedir(), ".claude", "rules");
|
|
22
24
|
logger.debug(`Scanning for modular memory rules...`);
|
|
23
|
-
logger.debug(` User rules directory: ${
|
|
24
|
-
logger.debug(` Project rules directory: ${
|
|
25
|
+
logger.debug(` User rules directory: ${userWaveRulesDir}`);
|
|
26
|
+
logger.debug(` Project rules directory: ${projectWaveRulesDir}`);
|
|
25
27
|
const newRules = {};
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
await this.scanDirectory(
|
|
29
|
-
await this.scanDirectory(
|
|
28
|
+
// Scan order: userClaude → userWave → projectClaude → projectWave
|
|
29
|
+
// Later writes override, so .wave takes priority over .claude
|
|
30
|
+
await this.scanDirectory(userClaudeRulesDir, "user", newRules);
|
|
31
|
+
await this.scanDirectory(userWaveRulesDir, "user", newRules);
|
|
32
|
+
await this.scanDirectory(projectClaudeRulesDir, "project", newRules);
|
|
33
|
+
await this.scanDirectory(projectWaveRulesDir, "project", newRules);
|
|
30
34
|
this.state.rules = newRules;
|
|
31
35
|
const ruleCount = Object.keys(newRules).length;
|
|
32
|
-
// Removed verbose logging of all discovered rules
|
|
33
36
|
logger.debug(`Discovered ${ruleCount} modular memory rules`);
|
|
34
37
|
}
|
|
35
38
|
async scanDirectory(dir, source, registry, visited = new Set()) {
|
|
@@ -83,10 +86,24 @@ export class MemoryRuleManager {
|
|
|
83
86
|
try {
|
|
84
87
|
const content = await fs.readFile(filePath, "utf-8");
|
|
85
88
|
const rule = this.service.parseRule(content, filePath, source);
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
// Determine rulesRoot dynamically based on actual file path
|
|
90
|
+
let rulesRoot;
|
|
91
|
+
if (source === "project") {
|
|
92
|
+
if (filePath.includes(path.join(".claude", "rules"))) {
|
|
93
|
+
rulesRoot = path.join(this.workdir, ".claude", "rules");
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
rulesRoot = path.join(this.workdir, ".wave", "rules");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
if (filePath.includes(path.join(".claude", "rules"))) {
|
|
101
|
+
rulesRoot = path.join(os.homedir(), ".claude", "rules");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
rulesRoot = path.join(os.homedir(), ".wave", "rules");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
90
107
|
const relativeId = path.relative(rulesRoot, filePath);
|
|
91
108
|
rule.id = relativeId;
|
|
92
109
|
registry[rule.id] = rule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,WAAW;IASpB,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGvB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAA+B;IAM1C;;OAEG;IACH,iBAAiB,CAAC,KAAK,CAAC,EAAE,wBAAwB,GAAG,IAAI;IAqBzD;;;OAGG;IACH,+BAA+B,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IA6B3E;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,12 +118,14 @@ export class HookManager {
|
|
|
118
118
|
env: {
|
|
119
119
|
...("env" in context ? (context.env ?? {}) : {}),
|
|
120
120
|
WAVE_PLUGIN_ROOT: hookCommand.pluginRoot,
|
|
121
|
+
CLAUDE_PLUGIN_ROOT: hookCommand.pluginRoot,
|
|
121
122
|
},
|
|
122
123
|
}
|
|
123
124
|
: context;
|
|
124
|
-
// Substitute ${WAVE_PLUGIN_ROOT} in the command string
|
|
125
|
+
// Substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT} in the command string
|
|
125
126
|
if (hookCommand.pluginRoot) {
|
|
126
127
|
command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, hookCommand.pluginRoot);
|
|
128
|
+
command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, hookCommand.pluginRoot);
|
|
127
129
|
}
|
|
128
130
|
if (hookCommand.async) {
|
|
129
131
|
// Execute async command without awaiting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,qBAAa,UAAW,YAAW,WAAW;IAKhC,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEX,SAAS,EAAE,SAAS;IAElC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;
|
|
1
|
+
{"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EAEL,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,qBAAa,UAAW,YAAW,WAAW;IAKhC,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEX,SAAS,EAAE,SAAS;IAElC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;IAuIzB,OAAO,CAAC,aAAa;YAiBP,WAAW;YA0CX,gBAAgB;IAgBxB,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoJ5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B"}
|
|
@@ -57,17 +57,25 @@ export class LspManager {
|
|
|
57
57
|
logger?.info(`Starting LSP server for ${language}: ${config.command} ${config.args?.join(" ") || ""}`);
|
|
58
58
|
try {
|
|
59
59
|
const env = { ...process.env, ...config.env };
|
|
60
|
-
// For plugin servers, substitute ${WAVE_PLUGIN_ROOT}
|
|
60
|
+
// For plugin servers, substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
|
|
61
61
|
let command = config.command;
|
|
62
62
|
let args = config.args || [];
|
|
63
63
|
if (config.pluginRoot) {
|
|
64
64
|
env.WAVE_PLUGIN_ROOT = config.pluginRoot;
|
|
65
|
+
env.CLAUDE_PLUGIN_ROOT = config.pluginRoot;
|
|
65
66
|
command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
68
|
+
args = args.map((arg) => {
|
|
69
|
+
let result = arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
70
|
+
result = result.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
71
|
+
return result;
|
|
72
|
+
});
|
|
73
|
+
// Also expand plugin root in user-provided env values
|
|
68
74
|
if (config.env) {
|
|
69
75
|
for (const [key, value] of Object.entries(config.env)) {
|
|
70
|
-
|
|
76
|
+
let expanded = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
77
|
+
expanded = expanded.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, config.pluginRoot);
|
|
78
|
+
env[key] = expanded;
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CAC3D;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC9C;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAsC7D;AAED,qBAAa,UAAU;IAanB,OAAO,CAAC,SAAS;IAZnB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAA8C;IAEhE,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,iBAAiB,CAAkC;gBAGjD,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,iBAAsB;IAMjC;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;IAgDV,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAO/C,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAgEvC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B,aAAa,IAAI,eAAe,EAAE;IAIlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO;IAuDzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgB7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { logger } from "../utils/globalLogger.js";
|
|
|
10
10
|
* Expand environment variables in a string value.
|
|
11
11
|
* Supports ${VAR} and ${VAR:-default} patterns.
|
|
12
12
|
*/
|
|
13
|
-
const WAVE_TEMPLATE_VARS = ["WAVE_PLUGIN_ROOT"];
|
|
13
|
+
const WAVE_TEMPLATE_VARS = ["WAVE_PLUGIN_ROOT", "CLAUDE_PLUGIN_ROOT"];
|
|
14
14
|
export function expandEnvVars(value) {
|
|
15
15
|
return value.replace(/\$\{([^}]+)\}/g, (_match, expr) => {
|
|
16
16
|
const [varName, ...rest] = expr.split(":-");
|
|
@@ -338,17 +338,24 @@ export class McpManager {
|
|
|
338
338
|
...agentEnv,
|
|
339
339
|
...(server.config.env || {}),
|
|
340
340
|
};
|
|
341
|
-
// For plugin servers, substitute ${WAVE_PLUGIN_ROOT}
|
|
342
|
-
// (same pattern as Claude Code's substitutePluginVariables)
|
|
341
|
+
// For plugin servers, substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
|
|
343
342
|
let command = server.config.command;
|
|
344
343
|
let args = server.config.args || [];
|
|
345
344
|
if (server.config.pluginRoot) {
|
|
346
345
|
env.WAVE_PLUGIN_ROOT = server.config.pluginRoot;
|
|
346
|
+
env.CLAUDE_PLUGIN_ROOT = server.config.pluginRoot;
|
|
347
347
|
command = command.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
348
|
-
|
|
349
|
-
|
|
348
|
+
command = command.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
349
|
+
args = args.map((arg) => {
|
|
350
|
+
let result = arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
351
|
+
result = result.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
352
|
+
return result;
|
|
353
|
+
});
|
|
354
|
+
// Also expand plugin root in user-provided env values
|
|
350
355
|
for (const [key, value] of Object.entries(server.config.env || {})) {
|
|
351
|
-
|
|
356
|
+
let expanded = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
357
|
+
expanded = expanded.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
|
|
358
|
+
env[key] = expanded;
|
|
352
359
|
}
|
|
353
360
|
}
|
|
354
361
|
transport = new StdioClientTransport({
|
|
@@ -7,6 +7,7 @@ import { Container } from "../utils/container.js";
|
|
|
7
7
|
export declare class SkillManager extends EventEmitter {
|
|
8
8
|
private container;
|
|
9
9
|
private personalSkillsPath;
|
|
10
|
+
private personalClaudeSkillsPath;
|
|
10
11
|
private scanTimeout;
|
|
11
12
|
private workdir;
|
|
12
13
|
private skillMetadata;
|
|
@@ -58,6 +59,8 @@ export declare class SkillManager extends EventEmitter {
|
|
|
58
59
|
* Discover skills in a specific directory
|
|
59
60
|
*/
|
|
60
61
|
private discoverSkillCollection;
|
|
62
|
+
private scanSkillPath;
|
|
63
|
+
private processSkillDirs;
|
|
61
64
|
/**
|
|
62
65
|
* Find all directories that could contain skills
|
|
63
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAe1C,OAAO,CAAC,SAAS;IAdnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAYnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAqC5B;;OAEG;YACW,uBAAuB;YAwBvB,aAAa;YAiBb,gBAAgB;IAsD9B;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkC3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA8BhE"}
|
|
@@ -23,6 +23,8 @@ export class SkillManager extends EventEmitter {
|
|
|
23
23
|
this.fileWatcher = null;
|
|
24
24
|
this.personalSkillsPath =
|
|
25
25
|
options.personalSkillsPath || join(homedir(), ".wave", "skills");
|
|
26
|
+
this.personalClaudeSkillsPath =
|
|
27
|
+
options.personalClaudeSkillsPath || join(homedir(), ".claude", "skills");
|
|
26
28
|
this.scanTimeout = options.scanTimeout || 5000;
|
|
27
29
|
this.workdir = options.workdir || process.cwd();
|
|
28
30
|
this.watchEnabled = options.watch ?? false;
|
|
@@ -89,7 +91,9 @@ export class SkillManager extends EventEmitter {
|
|
|
89
91
|
this.fileWatcher = new FileWatcherService(logger);
|
|
90
92
|
const pathsToWatch = [
|
|
91
93
|
this.personalSkillsPath,
|
|
94
|
+
this.personalClaudeSkillsPath,
|
|
92
95
|
join(this.workdir, ".wave", "skills"),
|
|
96
|
+
join(this.workdir, ".claude", "skills"),
|
|
93
97
|
];
|
|
94
98
|
logger?.debug(`Setting up skill watcher for: ${pathsToWatch.join(", ")}`);
|
|
95
99
|
for (const pathToWatch of pathsToWatch) {
|
|
@@ -163,14 +167,19 @@ export class SkillManager extends EventEmitter {
|
|
|
163
167
|
*/
|
|
164
168
|
async discoverSkills() {
|
|
165
169
|
const builtinCollection = await this.discoverSkillCollection(getBuiltinSkillsDir(), "builtin");
|
|
170
|
+
const personalClaudeCollection = await this.discoverSkillCollection(this.personalClaudeSkillsPath, "personal");
|
|
166
171
|
const personalCollection = await this.discoverSkillCollection(this.personalSkillsPath, "personal");
|
|
167
172
|
const projectCollection = await this.discoverSkillCollection(this.workdir, "project");
|
|
168
173
|
return {
|
|
169
174
|
builtinSkills: builtinCollection.skills,
|
|
170
|
-
personalSkills:
|
|
175
|
+
personalSkills: new Map([
|
|
176
|
+
...personalClaudeCollection.skills,
|
|
177
|
+
...personalCollection.skills, // .wave overrides .claude
|
|
178
|
+
]),
|
|
171
179
|
projectSkills: projectCollection.skills,
|
|
172
180
|
errors: [
|
|
173
181
|
...builtinCollection.errors,
|
|
182
|
+
...personalClaudeCollection.errors,
|
|
174
183
|
...personalCollection.errors,
|
|
175
184
|
...projectCollection.errors,
|
|
176
185
|
],
|
|
@@ -186,71 +195,75 @@ export class SkillManager extends EventEmitter {
|
|
|
186
195
|
skills: new Map(),
|
|
187
196
|
errors: [],
|
|
188
197
|
};
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
198
|
+
if (type === "project") {
|
|
199
|
+
// Scan .claude/skills first, then .wave/skills (wave overrides)
|
|
200
|
+
const claudePath = join(basePath, ".claude", "skills");
|
|
201
|
+
const wavePath = join(basePath, ".wave", "skills");
|
|
202
|
+
await this.scanSkillPath(claudePath, collection);
|
|
203
|
+
await this.scanSkillPath(wavePath, collection);
|
|
195
204
|
}
|
|
196
205
|
else {
|
|
197
|
-
|
|
206
|
+
await this.scanSkillPath(basePath, collection);
|
|
198
207
|
}
|
|
208
|
+
return collection;
|
|
209
|
+
}
|
|
210
|
+
async scanSkillPath(skillsPath, collection) {
|
|
199
211
|
try {
|
|
200
212
|
const skillDirs = await this.findSkillDirectories(skillsPath);
|
|
201
213
|
logger?.debug(`Found ${skillDirs.length} potential skill directories in ${skillsPath}`);
|
|
202
|
-
|
|
214
|
+
await this.processSkillDirs(skillDirs, collection);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger?.debug(`Could not scan ${skillsPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async processSkillDirs(skillDirs, collection) {
|
|
221
|
+
for (const skillDir of skillDirs) {
|
|
222
|
+
try {
|
|
223
|
+
const skillFilePath = join(skillDir, "SKILL.md");
|
|
224
|
+
// Check if SKILL.md exists
|
|
203
225
|
try {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
collection.skills.set(skillMetadata.name, skillMetadata);
|
|
231
|
-
// Store the full skill content in the manager's skillContent map
|
|
232
|
-
this.skillContent.set(skillMetadata.name, skill);
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
collection.errors.push({
|
|
236
|
-
skillPath: skillDir,
|
|
237
|
-
message: parsed.validationErrors.join("; "),
|
|
238
|
-
});
|
|
239
|
-
}
|
|
226
|
+
await stat(skillFilePath);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
continue; // Skip directories without SKILL.md
|
|
230
|
+
}
|
|
231
|
+
const parsed = parseSkillFile(skillFilePath, {
|
|
232
|
+
basePath: skillDir,
|
|
233
|
+
validateMetadata: true,
|
|
234
|
+
});
|
|
235
|
+
if (parsed.isValid) {
|
|
236
|
+
// Override the skill type with the collection type
|
|
237
|
+
const skillMetadata = {
|
|
238
|
+
...parsed.skillMetadata,
|
|
239
|
+
type: collection.type,
|
|
240
|
+
};
|
|
241
|
+
// Create full skill object with content
|
|
242
|
+
const skill = {
|
|
243
|
+
...skillMetadata,
|
|
244
|
+
content: parsed.content,
|
|
245
|
+
frontmatter: parsed.frontmatter,
|
|
246
|
+
isValid: parsed.isValid,
|
|
247
|
+
errors: parsed.validationErrors,
|
|
248
|
+
};
|
|
249
|
+
collection.skills.set(skillMetadata.name, skillMetadata);
|
|
250
|
+
// Store the full skill content in the manager's skillContent map
|
|
251
|
+
this.skillContent.set(skillMetadata.name, skill);
|
|
240
252
|
}
|
|
241
|
-
|
|
253
|
+
else {
|
|
242
254
|
collection.errors.push({
|
|
243
255
|
skillPath: skillDir,
|
|
244
|
-
message:
|
|
256
|
+
message: parsed.validationErrors.join("; "),
|
|
245
257
|
});
|
|
246
258
|
}
|
|
247
259
|
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
collection.errors.push({
|
|
262
|
+
skillPath: skillDir,
|
|
263
|
+
message: `Failed to process skill: ${error instanceof Error ? error.message : String(error)}`,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
248
266
|
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
logger?.debug(`Could not scan ${skillsPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
251
|
-
// Not an error - the directory might not exist yet
|
|
252
|
-
}
|
|
253
|
-
return collection;
|
|
254
267
|
}
|
|
255
268
|
/**
|
|
256
269
|
* Find all directories that could contain skills
|
|
@@ -347,11 +360,13 @@ export class SkillManager extends EventEmitter {
|
|
|
347
360
|
let mainContent = contentMatch ? contentMatch[1].trim() : skill.content;
|
|
348
361
|
// 1. Substitute parameters ($1, $ARGUMENTS, etc.)
|
|
349
362
|
mainContent = substituteCommandParameters(mainContent, argsString);
|
|
350
|
-
// 2. Substitute ${WAVE_SKILL_DIR}
|
|
363
|
+
// 2. Substitute ${WAVE_SKILL_DIR} and ${CLAUDE_SKILL_DIR}
|
|
351
364
|
mainContent = mainContent.replace(/\$\{WAVE_SKILL_DIR\}/g, skill.skillPath);
|
|
352
|
-
|
|
365
|
+
mainContent = mainContent.replace(/\$\{CLAUDE_SKILL_DIR\}/g, skill.skillPath);
|
|
366
|
+
// 3. Substitute ${WAVE_PLUGIN_ROOT} and ${CLAUDE_PLUGIN_ROOT}
|
|
353
367
|
if (skill.pluginRoot) {
|
|
354
368
|
mainContent = mainContent.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, skill.pluginRoot);
|
|
369
|
+
mainContent = mainContent.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, skill.pluginRoot);
|
|
355
370
|
}
|
|
356
371
|
return skillPath + mainContent;
|
|
357
372
|
}
|
|
@@ -33,6 +33,15 @@ export declare class MarketplaceService {
|
|
|
33
33
|
* to user-level settings if they aren't already declared there.
|
|
34
34
|
*/
|
|
35
35
|
private runMigration;
|
|
36
|
+
/**
|
|
37
|
+
* Seeds the builtin marketplace on first startup.
|
|
38
|
+
* Adds it to user-scope settings and marks the cache as seeded.
|
|
39
|
+
*/
|
|
40
|
+
private seedBuiltinMarketplace;
|
|
41
|
+
/**
|
|
42
|
+
* Sets the builtinSeeded flag in the cache registry, preserving all other fields.
|
|
43
|
+
*/
|
|
44
|
+
private setBuiltinSeeded;
|
|
36
45
|
/**
|
|
37
46
|
* Check if a lock file is stale by reading its PID and checking if the process is alive.
|
|
38
47
|
* Returns true if the lock is stale and safe to remove.
|
|
@@ -97,6 +106,12 @@ export declare class MarketplaceService {
|
|
|
97
106
|
* Removes a marketplace by name from the specified scope
|
|
98
107
|
*/
|
|
99
108
|
removeMarketplace(name: string, scope?: Scope): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Uninstalls all plugins belonging to a given marketplace.
|
|
111
|
+
* Removes them from installed_plugins.json, deletes cache files,
|
|
112
|
+
* and cleans up enabledPlugins entries from all scopes.
|
|
113
|
+
*/
|
|
114
|
+
private uninstallPluginsByMarketplace;
|
|
100
115
|
/**
|
|
101
116
|
* Updates a specific marketplace or all marketplaces
|
|
102
117
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAqB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAG1E;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAS;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAOzC;gBAGA,OAAO,GAAE,MAAsB,EAC/B,oBAAoB,GAAE,oBAAiD;
|
|
1
|
+
{"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,9 @@ export class MarketplaceService {
|
|
|
28
28
|
this.gitService = new GitService();
|
|
29
29
|
this.ensureDirectoryStructure();
|
|
30
30
|
this.runMigration();
|
|
31
|
+
// Stored dynamically to avoid widening keyof MarketplaceService
|
|
32
|
+
this._seedComplete =
|
|
33
|
+
this.seedBuiltinMarketplace();
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
33
36
|
* Ensures the required directory structure exists in ~/.wave/plugins
|
|
@@ -65,6 +68,46 @@ export class MarketplaceService {
|
|
|
65
68
|
// Migration failure should not block startup
|
|
66
69
|
}
|
|
67
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Seeds the builtin marketplace on first startup.
|
|
73
|
+
* Adds it to user-scope settings and marks the cache as seeded.
|
|
74
|
+
*/
|
|
75
|
+
async seedBuiltinMarketplace() {
|
|
76
|
+
try {
|
|
77
|
+
const cache = await this.getCacheRegistry();
|
|
78
|
+
if (cache?.builtinSeeded)
|
|
79
|
+
return;
|
|
80
|
+
const builtin = MarketplaceService.BUILTIN_MARKETPLACE;
|
|
81
|
+
// Add to user-scope settings if not already in any scope
|
|
82
|
+
const scoped = this.configurationService.getMergedMarketplaces(this.workdir);
|
|
83
|
+
if (!scoped[builtin.name]) {
|
|
84
|
+
await this.configurationService.addMarketplaceToScope(this.workdir, "user", builtin.name, { source: builtin.source, autoUpdate: builtin.autoUpdate });
|
|
85
|
+
}
|
|
86
|
+
// Update cache: add entry + set builtinSeeded flag
|
|
87
|
+
await this.updateCacheMarketplace(builtin.name, {
|
|
88
|
+
source: builtin.source,
|
|
89
|
+
autoUpdate: builtin.autoUpdate,
|
|
90
|
+
isBuiltin: true,
|
|
91
|
+
declaredScope: "builtin",
|
|
92
|
+
});
|
|
93
|
+
await this.setBuiltinSeeded(true);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Seeding failure should not block startup
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Sets the builtinSeeded flag in the cache registry, preserving all other fields.
|
|
101
|
+
*/
|
|
102
|
+
async setBuiltinSeeded(value) {
|
|
103
|
+
const registry = await this.getCacheRegistry();
|
|
104
|
+
const tmpPath = `${this.knownMarketplacesPath}.tmp`;
|
|
105
|
+
await fs.writeFile(tmpPath, JSON.stringify({
|
|
106
|
+
builtinSeeded: value,
|
|
107
|
+
marketplaces: registry?.marketplaces ?? [],
|
|
108
|
+
}, null, 2));
|
|
109
|
+
await fs.rename(tmpPath, this.knownMarketplacesPath);
|
|
110
|
+
}
|
|
68
111
|
/**
|
|
69
112
|
* Check if a lock file is stale by reading its PID and checking if the process is alive.
|
|
70
113
|
* Returns true if the lock is stale and safe to remove.
|
|
@@ -192,7 +235,10 @@ export class MarketplaceService {
|
|
|
192
235
|
});
|
|
193
236
|
}
|
|
194
237
|
const tmpPath = `${this.knownMarketplacesPath}.tmp`;
|
|
195
|
-
await fs.writeFile(tmpPath, JSON.stringify({
|
|
238
|
+
await fs.writeFile(tmpPath, JSON.stringify({
|
|
239
|
+
builtinSeeded: registry?.builtinSeeded ?? false,
|
|
240
|
+
marketplaces,
|
|
241
|
+
}, null, 2));
|
|
196
242
|
await fs.rename(tmpPath, this.knownMarketplacesPath);
|
|
197
243
|
}
|
|
198
244
|
/**
|
|
@@ -203,7 +249,10 @@ export class MarketplaceService {
|
|
|
203
249
|
const marketplaces = registry?.marketplaces ?? [];
|
|
204
250
|
const filtered = marketplaces.filter((m) => m.name !== name);
|
|
205
251
|
const tmpPath = `${this.knownMarketplacesPath}.tmp`;
|
|
206
|
-
await fs.writeFile(tmpPath, JSON.stringify({
|
|
252
|
+
await fs.writeFile(tmpPath, JSON.stringify({
|
|
253
|
+
builtinSeeded: registry?.builtinSeeded ?? false,
|
|
254
|
+
marketplaces: filtered,
|
|
255
|
+
}, null, 2));
|
|
207
256
|
await fs.rename(tmpPath, this.knownMarketplacesPath);
|
|
208
257
|
}
|
|
209
258
|
/**
|
|
@@ -237,9 +286,13 @@ export class MarketplaceService {
|
|
|
237
286
|
* Loads a marketplace manifest from a local path
|
|
238
287
|
*/
|
|
239
288
|
async loadMarketplaceManifest(marketplacePath) {
|
|
240
|
-
|
|
289
|
+
let manifestPath = path.join(marketplacePath, ".wave-plugin", "marketplace.json");
|
|
241
290
|
if (!existsSync(manifestPath)) {
|
|
242
|
-
|
|
291
|
+
// Fallback to .claude-plugin/marketplace.json
|
|
292
|
+
manifestPath = path.join(marketplacePath, ".claude-plugin", "marketplace.json");
|
|
293
|
+
if (!existsSync(manifestPath)) {
|
|
294
|
+
throw new Error(`Marketplace manifest not found at ${manifestPath}`);
|
|
295
|
+
}
|
|
243
296
|
}
|
|
244
297
|
const content = await fs.readFile(manifestPath, "utf-8");
|
|
245
298
|
const manifest = JSON.parse(content);
|
|
@@ -402,6 +455,8 @@ export class MarketplaceService {
|
|
|
402
455
|
async removeMarketplace(name, scope) {
|
|
403
456
|
return this.withLock(async () => {
|
|
404
457
|
const targetScope = scope || this.getMarketplaceDeclaringSource(name) || "user";
|
|
458
|
+
// Uninstall all plugins from this marketplace
|
|
459
|
+
await this.uninstallPluginsByMarketplace(name);
|
|
405
460
|
if (targetScope !== "builtin") {
|
|
406
461
|
await this.configurationService.removeMarketplaceFromScope(this.workdir, targetScope, name);
|
|
407
462
|
}
|
|
@@ -409,6 +464,36 @@ export class MarketplaceService {
|
|
|
409
464
|
await this.removeFromCache(name);
|
|
410
465
|
});
|
|
411
466
|
}
|
|
467
|
+
/**
|
|
468
|
+
* Uninstalls all plugins belonging to a given marketplace.
|
|
469
|
+
* Removes them from installed_plugins.json, deletes cache files,
|
|
470
|
+
* and cleans up enabledPlugins entries from all scopes.
|
|
471
|
+
*/
|
|
472
|
+
async uninstallPluginsByMarketplace(marketplaceName) {
|
|
473
|
+
const installedRegistry = await this.getInstalledPlugins();
|
|
474
|
+
const pluginsFromMarketplace = installedRegistry.plugins.filter((p) => p.marketplace === marketplaceName);
|
|
475
|
+
if (pluginsFromMarketplace.length === 0)
|
|
476
|
+
return;
|
|
477
|
+
// Remove all plugins from this marketplace from the registry
|
|
478
|
+
installedRegistry.plugins = installedRegistry.plugins.filter((p) => p.marketplace !== marketplaceName);
|
|
479
|
+
await this.saveInstalledPlugins(installedRegistry);
|
|
480
|
+
// Delete cache files that are no longer referenced
|
|
481
|
+
const remainingCachePaths = new Set(installedRegistry.plugins.map((p) => p.cachePath));
|
|
482
|
+
for (const plugin of pluginsFromMarketplace) {
|
|
483
|
+
if (!remainingCachePaths.has(plugin.cachePath) &&
|
|
484
|
+
existsSync(plugin.cachePath)) {
|
|
485
|
+
await fs.rm(plugin.cachePath, { recursive: true, force: true });
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// Remove enabledPlugins entries from all scopes
|
|
489
|
+
const scopes = ["user", "project", "local"];
|
|
490
|
+
for (const plugin of pluginsFromMarketplace) {
|
|
491
|
+
const pluginId = `${plugin.name}@${plugin.marketplace}`;
|
|
492
|
+
for (const s of scopes) {
|
|
493
|
+
await this.configurationService.removeEnabledPlugin(this.workdir, s, pluginId);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
412
497
|
/**
|
|
413
498
|
* Updates a specific marketplace or all marketplaces
|
|
414
499
|
*/
|
|
@@ -568,9 +653,13 @@ export class MarketplaceService {
|
|
|
568
653
|
else {
|
|
569
654
|
pluginSrcPath = path.resolve(marketplacePath, pluginEntry.source);
|
|
570
655
|
}
|
|
571
|
-
|
|
656
|
+
let pluginManifestPath = path.join(pluginSrcPath, ".wave-plugin", "plugin.json");
|
|
572
657
|
if (!existsSync(pluginManifestPath)) {
|
|
573
|
-
|
|
658
|
+
// Fallback to .claude-plugin/plugin.json
|
|
659
|
+
pluginManifestPath = path.join(pluginSrcPath, ".claude-plugin", "plugin.json");
|
|
660
|
+
if (!existsSync(pluginManifestPath)) {
|
|
661
|
+
throw new Error(`Plugin manifest not found at ${pluginManifestPath}`);
|
|
662
|
+
}
|
|
574
663
|
}
|
|
575
664
|
const pluginManifestContent = await fs.readFile(pluginManifestPath, "utf-8");
|
|
576
665
|
const pluginManifest = JSON.parse(pluginManifestContent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,aAAa;IAKZ,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,qBAAqB,CAAuB;gBAEhC,SAAS,EAAE,SAAS;IAExC,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,UAAU,IAAI,IAAI;IAMzB;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU/C;;OAEG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,aAAa;IAKZ,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,qBAAqB,CAAuB;gBAEhC,SAAS,EAAE,SAAS;IAExC,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,UAAU,IAAI,IAAI;IAMzB;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU/C;;OAEG;IACG,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/D;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAoCvC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuChD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjE"}
|