wave-agent-sdk 0.17.5 → 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.
Files changed (38) hide show
  1. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  2. package/dist/managers/MemoryRuleManager.js +30 -13
  3. package/dist/managers/hookManager.d.ts.map +1 -1
  4. package/dist/managers/hookManager.js +3 -1
  5. package/dist/managers/lspManager.d.ts.map +1 -1
  6. package/dist/managers/lspManager.js +12 -4
  7. package/dist/managers/mcpManager.d.ts.map +1 -1
  8. package/dist/managers/mcpManager.js +13 -6
  9. package/dist/managers/skillManager.d.ts +3 -0
  10. package/dist/managers/skillManager.d.ts.map +1 -1
  11. package/dist/managers/skillManager.js +69 -54
  12. package/dist/services/MarketplaceService.d.ts.map +1 -1
  13. package/dist/services/MarketplaceService.js +12 -4
  14. package/dist/services/memory.d.ts.map +1 -1
  15. package/dist/services/memory.js +39 -5
  16. package/dist/services/pluginLoader.d.ts.map +1 -1
  17. package/dist/services/pluginLoader.js +30 -7
  18. package/dist/types/skills.d.ts +1 -0
  19. package/dist/types/skills.d.ts.map +1 -1
  20. package/dist/utils/customCommands.d.ts.map +1 -1
  21. package/dist/utils/customCommands.js +11 -9
  22. package/dist/utils/skillParser.d.ts.map +1 -1
  23. package/dist/utils/skillParser.js +3 -1
  24. package/dist/utils/subagentParser.d.ts.map +1 -1
  25. package/dist/utils/subagentParser.js +18 -7
  26. package/package.json +1 -1
  27. package/src/managers/MemoryRuleManager.ts +29 -14
  28. package/src/managers/hookManager.ts +6 -1
  29. package/src/managers/lspManager.ts +23 -5
  30. package/src/managers/mcpManager.ts +24 -7
  31. package/src/managers/skillManager.ts +90 -57
  32. package/src/services/MarketplaceService.ts +22 -4
  33. package/src/services/memory.ts +43 -6
  34. package/src/services/pluginLoader.ts +35 -7
  35. package/src/types/skills.ts +1 -0
  36. package/src/utils/customCommands.ts +17 -12
  37. package/src/utils/skillParser.ts +3 -1
  38. 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;YAqBtB,aAAa;YAyDb,YAAY;IAsB1B;;OAEG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
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 projectRulesDir = path.join(this.workdir, ".wave", "rules");
21
- const userRulesDir = path.join(os.homedir(), ".wave", "rules");
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: ${userRulesDir}`);
24
- logger.debug(` Project rules directory: ${projectRulesDir}`);
25
+ logger.debug(` User rules directory: ${userWaveRulesDir}`);
26
+ logger.debug(` Project rules directory: ${projectWaveRulesDir}`);
25
27
  const newRules = {};
26
- // Discover user rules first, then project rules so project rules can override if needed
27
- // (though IDs are based on file path, so they shouldn't collide unless same path)
28
- await this.scanDirectory(userRulesDir, "user", newRules);
29
- await this.scanDirectory(projectRulesDir, "project", newRules);
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
- // Use relative path from rules root as ID to allow project rules to override user rules
87
- const rulesRoot = source === "project"
88
- ? path.join(this.workdir, ".wave", "rules")
89
- : path.join(os.homedir(), ".wave", "rules");
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":"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"}
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 (same pattern as Claude Code)
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;IAqHzB,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"}
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} in command/args/env
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
- args = args.map((arg) => arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot));
67
- // Also expand WAVE_PLUGIN_ROOT in user-provided env values
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
- env[key] = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, config.pluginRoot);
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":"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"}
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} in command/args/env
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
- args = args.map((arg) => arg.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot));
349
- // Also expand WAVE_PLUGIN_ROOT in user-provided env values
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
- env[key] = value.replace(/\$\{WAVE_PLUGIN_ROOT\}/g, server.config.pluginRoot);
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;IAc1C,OAAO,CAAC,SAAS;IAbnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,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;IAUnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,YAAY;IAkC1B;;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;IA4B5B;;OAEG;YACW,uBAAuB;IAoFrC;;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;IA0B3B;;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"}
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: personalCollection.skills,
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
- let skillsPath;
190
- if (type === "personal") {
191
- skillsPath = basePath;
192
- }
193
- else if (type === "builtin") {
194
- skillsPath = basePath;
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
- skillsPath = join(basePath, ".wave", "skills");
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
- for (const skillDir of skillDirs) {
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
- const skillFilePath = join(skillDir, "SKILL.md");
205
- // Check if SKILL.md exists
206
- try {
207
- await stat(skillFilePath);
208
- }
209
- catch {
210
- continue; // Skip directories without SKILL.md
211
- }
212
- const parsed = parseSkillFile(skillFilePath, {
213
- basePath: skillDir,
214
- validateMetadata: true,
215
- });
216
- if (parsed.isValid) {
217
- // Override the skill type with the collection type
218
- const skillMetadata = {
219
- ...parsed.skillMetadata,
220
- type,
221
- };
222
- // Create full skill object with content
223
- const skill = {
224
- ...skillMetadata,
225
- content: parsed.content,
226
- frontmatter: parsed.frontmatter,
227
- isValid: parsed.isValid,
228
- errors: parsed.validationErrors,
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
- catch (error) {
253
+ else {
242
254
  collection.errors.push({
243
255
  skillPath: skillDir,
244
- message: `Failed to process skill: ${error instanceof Error ? error.message : String(error)}`,
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} with the skill's directory path
363
+ // 2. Substitute ${WAVE_SKILL_DIR} and ${CLAUDE_SKILL_DIR}
351
364
  mainContent = mainContent.replace(/\$\{WAVE_SKILL_DIR\}/g, skill.skillPath);
352
- // 3. Substitute ${WAVE_PLUGIN_ROOT} with the skill's plugin root path
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarketplaceService.d.ts","sourceRoot":"","sources":["../../src/services/MarketplaceService.ts"],"names":[],"mappings":"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"}
@@ -286,9 +286,13 @@ export class MarketplaceService {
286
286
  * Loads a marketplace manifest from a local path
287
287
  */
288
288
  async loadMarketplaceManifest(marketplacePath) {
289
- const manifestPath = path.join(marketplacePath, ".wave-plugin", "marketplace.json");
289
+ let manifestPath = path.join(marketplacePath, ".wave-plugin", "marketplace.json");
290
290
  if (!existsSync(manifestPath)) {
291
- throw new Error(`Marketplace manifest not found at ${manifestPath}`);
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
+ }
292
296
  }
293
297
  const content = await fs.readFile(manifestPath, "utf-8");
294
298
  const manifest = JSON.parse(content);
@@ -649,9 +653,13 @@ export class MarketplaceService {
649
653
  else {
650
654
  pluginSrcPath = path.resolve(marketplacePath, pluginEntry.source);
651
655
  }
652
- const pluginManifestPath = path.join(pluginSrcPath, ".wave-plugin", "plugin.json");
656
+ let pluginManifestPath = path.join(pluginSrcPath, ".wave-plugin", "plugin.json");
653
657
  if (!existsSync(pluginManifestPath)) {
654
- throw new Error(`Plugin manifest not found at ${pluginManifestPath}`);
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
+ }
655
663
  }
656
664
  const pluginManifestContent = await fs.readFile(pluginManifestPath, "utf-8");
657
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;IAevC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBhD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBjE"}
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"}
@@ -117,6 +117,22 @@ export class MemoryService {
117
117
  userMemoryFile: USER_MEMORY_FILE,
118
118
  contentLength: content.length,
119
119
  });
120
+ // If the file is still the default empty template, fallback to ~/.claude/AGENTS.md
121
+ const defaultTemplate = "# User Memory\n\nThis is the user-level memory file, recording important information and context across projects.\n\n";
122
+ if (content === defaultTemplate) {
123
+ const claudeMemoryPath = path.join(homedir(), ".claude", "AGENTS.md");
124
+ try {
125
+ const claudeContent = await fs.readFile(claudeMemoryPath, "utf-8");
126
+ logger.debug("User memory content read from ~/.claude/AGENTS.md fallback", {
127
+ claudeMemoryPath,
128
+ contentLength: claudeContent.length,
129
+ });
130
+ return claudeContent;
131
+ }
132
+ catch {
133
+ // CLAUDE.md doesn't exist or can't be read, return the default template
134
+ }
135
+ }
120
136
  return content;
121
137
  }
122
138
  catch (error) {
@@ -126,7 +142,6 @@ export class MemoryService {
126
142
  }
127
143
  async readMemoryFile(workdir) {
128
144
  const memoryFilePath = path.join(workdir, "AGENTS.md");
129
- // Direct file access
130
145
  try {
131
146
  const content = await fs.readFile(memoryFilePath, "utf-8");
132
147
  logger.debug("Memory file read successfully via direct file access", {
@@ -137,10 +152,29 @@ export class MemoryService {
137
152
  }
138
153
  catch (error) {
139
154
  if (error.code === "ENOENT") {
140
- logger.debug("Memory file does not exist, returning empty content", {
141
- memoryFilePath,
142
- });
143
- return "";
155
+ // Fallback to CLAUDE.md
156
+ const claudeMemoryPath = path.join(workdir, "CLAUDE.md");
157
+ try {
158
+ const content = await fs.readFile(claudeMemoryPath, "utf-8");
159
+ logger.debug("Memory file read from CLAUDE.md fallback", {
160
+ memoryFilePath: claudeMemoryPath,
161
+ contentLength: content.length,
162
+ });
163
+ return content;
164
+ }
165
+ catch (claudeError) {
166
+ if (claudeError.code === "ENOENT") {
167
+ logger.debug("Neither AGENTS.md nor CLAUDE.md found", {
168
+ memoryFilePath,
169
+ });
170
+ return "";
171
+ }
172
+ logger.error("Failed to read CLAUDE.md fallback", {
173
+ memoryFilePath: claudeMemoryPath,
174
+ error: claudeError,
175
+ });
176
+ return "";
177
+ }
144
178
  }
145
179
  logger.error("Failed to read memory file", { memoryFilePath, error });
146
180
  return "";
@@ -1 +1 @@
1
- {"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,YAAY;IACvB;;;OAGG;WACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CtE;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK7D;;;OAGG;WACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuC7D;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAWjC;;OAEG;WACU,eAAe,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAgBhD;;OAEG;WACU,UAAU,CACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA2BnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAgBhC"}
1
+ {"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,YAAY;IACvB;;;OAGG;WACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAyEtE;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK7D;;;OAGG;WACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuC7D;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAWjC;;OAEG;WACU,eAAe,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAgBhD;;OAEG;WACU,UAAU,CACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA2BnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAgBhC"}
@@ -11,10 +11,12 @@ export class PluginLoader {
11
11
  */
12
12
  static async loadManifest(pluginPath) {
13
13
  const dotWavePluginPath = path.join(pluginPath, ".wave-plugin");
14
- const manifestPath = path.join(dotWavePluginPath, "plugin.json");
15
- // T018: Ensure plugin.json is the only file in .wave-plugin/
14
+ // Check if .wave-plugin/ directory exists
15
+ let wavePluginDirExists = false;
16
16
  try {
17
17
  const entries = await fs.readdir(dotWavePluginPath);
18
+ wavePluginDirExists = true;
19
+ // T018: Ensure plugin.json is the only file in .wave-plugin/
18
20
  const misplaced = entries.filter((e) => e !== "plugin.json");
19
21
  if (misplaced.length > 0) {
20
22
  throw new Error(`Misplaced files/directories in .wave-plugin/: ${misplaced.join(", ")}. Only plugin.json should be in this directory.`);
@@ -23,12 +25,33 @@ export class PluginLoader {
23
25
  catch (error) {
24
26
  if (error instanceof Error &&
25
27
  error.code === "ENOENT") {
26
- throw new Error(`Plugin manifest directory not found at ${dotWavePluginPath}`);
28
+ // .wave-plugin/ doesn't exist, will try .claude-plugin/ fallback below
29
+ }
30
+ else {
31
+ throw error;
32
+ }
33
+ }
34
+ if (wavePluginDirExists) {
35
+ const manifestPath = path.join(dotWavePluginPath, "plugin.json");
36
+ try {
37
+ const content = await fs.readFile(manifestPath, "utf-8");
38
+ const manifest = JSON.parse(content);
39
+ this.validateManifest(manifest);
40
+ return manifest;
41
+ }
42
+ catch (error) {
43
+ if (error instanceof Error &&
44
+ error.code === "ENOENT") {
45
+ throw new Error(`Plugin manifest not found at ${manifestPath}`);
46
+ }
47
+ throw new Error(`Failed to load plugin manifest at ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
27
48
  }
28
- throw error;
29
49
  }
50
+ // Fallback to .claude-plugin/
51
+ const dotClaudePluginPath = path.join(pluginPath, ".claude-plugin");
52
+ const claudeManifestPath = path.join(dotClaudePluginPath, "plugin.json");
30
53
  try {
31
- const content = await fs.readFile(manifestPath, "utf-8");
54
+ const content = await fs.readFile(claudeManifestPath, "utf-8");
32
55
  const manifest = JSON.parse(content);
33
56
  this.validateManifest(manifest);
34
57
  return manifest;
@@ -36,9 +59,9 @@ export class PluginLoader {
36
59
  catch (error) {
37
60
  if (error instanceof Error &&
38
61
  error.code === "ENOENT") {
39
- throw new Error(`Plugin manifest not found at ${manifestPath}`);
62
+ throw new Error(`Plugin manifest not found at ${dotWavePluginPath} or ${dotClaudePluginPath}`);
40
63
  }
41
- throw new Error(`Failed to load plugin manifest at ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`);
64
+ throw new Error(`Failed to load plugin manifest at ${claudeManifestPath}: ${error instanceof Error ? error.message : String(error)}`);
42
65
  }
43
66
  }
44
67
  /**
@@ -63,6 +63,7 @@ export interface SkillToolArgs {
63
63
  }
64
64
  export interface SkillManagerOptions {
65
65
  personalSkillsPath?: string;
66
+ personalClaudeSkillsPath?: string;
66
67
  scanTimeout?: number;
67
68
  workdir?: string;
68
69
  watch?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/types/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/types/skills.ts"],"names":[],"mappings":"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"}