dev3000 0.0.151 → 0.0.154

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 (169) hide show
  1. package/README.md +121 -103
  2. package/bin/dev3000 +10 -5
  3. package/dist/cdp-monitor.d.ts.map +1 -1
  4. package/dist/cdp-monitor.js +2 -3
  5. package/dist/cdp-monitor.js.map +1 -1
  6. package/dist/cli.js +301 -75
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/cloud-check-pr.d.ts +1 -0
  9. package/dist/commands/cloud-check-pr.d.ts.map +1 -1
  10. package/dist/commands/cloud-check-pr.js +18 -6
  11. package/dist/commands/cloud-check-pr.js.map +1 -1
  12. package/dist/commands/crawl.d.ts +12 -0
  13. package/dist/commands/crawl.d.ts.map +1 -0
  14. package/dist/commands/crawl.js +140 -0
  15. package/dist/commands/crawl.js.map +1 -0
  16. package/dist/commands/errors.d.ts +14 -0
  17. package/dist/commands/errors.d.ts.map +1 -0
  18. package/dist/commands/errors.js +295 -0
  19. package/dist/commands/errors.js.map +1 -0
  20. package/dist/commands/find-component.d.ts +8 -0
  21. package/dist/commands/find-component.d.ts.map +1 -0
  22. package/dist/commands/find-component.js +182 -0
  23. package/dist/commands/find-component.js.map +1 -0
  24. package/dist/commands/fix.d.ts +13 -0
  25. package/dist/commands/fix.d.ts.map +1 -0
  26. package/dist/commands/fix.js +288 -0
  27. package/dist/commands/fix.js.map +1 -0
  28. package/dist/commands/logs.d.ts +13 -0
  29. package/dist/commands/logs.d.ts.map +1 -0
  30. package/dist/commands/logs.js +195 -0
  31. package/dist/commands/logs.js.map +1 -0
  32. package/dist/commands/restart.d.ts +8 -0
  33. package/dist/commands/restart.d.ts.map +1 -0
  34. package/dist/commands/restart.js +92 -0
  35. package/dist/commands/restart.js.map +1 -0
  36. package/dist/components/PackageSelector.d.ts +12 -0
  37. package/dist/components/PackageSelector.d.ts.map +1 -0
  38. package/dist/components/PackageSelector.js +74 -0
  39. package/dist/components/PackageSelector.js.map +1 -0
  40. package/dist/dev-environment.d.ts +0 -7
  41. package/dist/dev-environment.d.ts.map +1 -1
  42. package/dist/dev-environment.js +108 -674
  43. package/dist/dev-environment.js.map +1 -1
  44. package/dist/screencast-manager.d.ts.map +1 -1
  45. package/dist/screencast-manager.js +7 -8
  46. package/dist/screencast-manager.js.map +1 -1
  47. package/dist/services/parsers/output-processor.js +2 -2
  48. package/dist/services/parsers/output-processor.js.map +1 -1
  49. package/dist/skills/d3k/SKILL.md +38 -27
  50. package/dist/skills/index.d.ts +10 -14
  51. package/dist/skills/index.d.ts.map +1 -1
  52. package/dist/skills/index.js +47 -77
  53. package/dist/skills/index.js.map +1 -1
  54. package/dist/skills/index.test.ts +13 -55
  55. package/dist/skills/index.ts +48 -81
  56. package/dist/src/tui-interface-impl.tsx +6 -15
  57. package/dist/tui-interface-impl.d.ts.map +1 -1
  58. package/dist/tui-interface-impl.js +4 -4
  59. package/dist/tui-interface-impl.js.map +1 -1
  60. package/dist/tui-interface-opentui.d.ts.map +1 -1
  61. package/dist/tui-interface-opentui.js +227 -100
  62. package/dist/tui-interface-opentui.js.map +1 -1
  63. package/dist/utils/agent-browser.d.ts +2 -0
  64. package/dist/utils/agent-browser.d.ts.map +1 -1
  65. package/dist/utils/agent-browser.js +46 -8
  66. package/dist/utils/agent-browser.js.map +1 -1
  67. package/dist/utils/agent-selection.d.ts.map +1 -1
  68. package/dist/utils/agent-selection.js +9 -2
  69. package/dist/utils/agent-selection.js.map +1 -1
  70. package/dist/utils/skill-installer.d.ts +55 -29
  71. package/dist/utils/skill-installer.d.ts.map +1 -1
  72. package/dist/utils/skill-installer.js +118 -229
  73. package/dist/utils/skill-installer.js.map +1 -1
  74. package/dist/utils/tmux-helpers.d.ts +1 -2
  75. package/dist/utils/tmux-helpers.d.ts.map +1 -1
  76. package/dist/utils/tmux-helpers.js +17 -18
  77. package/dist/utils/tmux-helpers.js.map +1 -1
  78. package/dist/utils/version-check.d.ts +2 -1
  79. package/dist/utils/version-check.d.ts.map +1 -1
  80. package/dist/utils/version-check.js +9 -0
  81. package/dist/utils/version-check.js.map +1 -1
  82. package/mcp-server/.next/BUILD_ID +1 -1
  83. package/mcp-server/.next/build-manifest.json +2 -2
  84. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  85. package/mcp-server/.next/prerender-manifest.json +3 -3
  86. package/mcp-server/.next/server/app/_global-error/page.js +1 -1
  87. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  88. package/mcp-server/.next/server/app/_global-error.html +2 -2
  89. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  90. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  91. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  92. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  93. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  94. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  95. package/mcp-server/.next/server/app/_not-found/page.js +1 -1
  96. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  97. package/mcp-server/.next/server/app/_not-found.html +1 -1
  98. package/mcp-server/.next/server/app/_not-found.rsc +1 -1
  99. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  100. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  101. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  102. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  103. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  104. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  105. package/mcp-server/.next/server/app/api/screenshots/capture/route.js +2 -2
  106. package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -1
  107. package/mcp-server/.next/server/app/index.html +1 -1
  108. package/mcp-server/.next/server/app/index.rsc +2 -2
  109. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  110. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +2 -2
  111. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
  113. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  114. package/mcp-server/.next/server/app/logs/page.js +1 -1
  115. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  116. package/mcp-server/.next/server/app/mcp/route.js +4 -4
  117. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  118. package/mcp-server/.next/server/app/page.js +1 -1
  119. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  120. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  121. package/mcp-server/.next/server/app/video/[session]/page.js +1 -1
  122. package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
  123. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js +3 -3
  124. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js.map +1 -1
  125. package/mcp-server/.next/server/chunks/[root-of-the-server]__69e6dfb7._.js +3 -0
  126. package/mcp-server/.next/server/chunks/{[root-of-the-server]__444592aa._.js.map → [root-of-the-server]__69e6dfb7._.js.map} +1 -1
  127. package/mcp-server/.next/server/chunks/[root-of-the-server]__6baff21e._.js +4 -0
  128. package/mcp-server/.next/server/chunks/{[root-of-the-server]__130a5f58._.js.map → [root-of-the-server]__6baff21e._.js.map} +1 -1
  129. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js +1 -1
  130. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js.map +1 -1
  131. package/mcp-server/.next/server/chunks/[root-of-the-server]__c8cf5b23._.js +3 -0
  132. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6a83e60._.js +4 -0
  133. package/mcp-server/.next/server/chunks/{[root-of-the-server]__b71c83ed._.js.map → [root-of-the-server]__e6a83e60._.js.map} +1 -1
  134. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +32 -66
  135. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -1
  136. package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js +1 -1
  137. package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js.map +1 -1
  138. package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js +3 -0
  139. package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js.map +1 -0
  140. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js → [root-of-the-server]__b17d4048._.js} +2 -2
  141. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js → [root-of-the-server]__dcf84f77._.js} +2 -2
  142. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
  143. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js.map +1 -1
  144. package/mcp-server/.next/server/pages/404.html +1 -1
  145. package/mcp-server/.next/server/pages/500.html +2 -2
  146. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  147. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  148. package/mcp-server/.next/static/chunks/{2422ea9ed874427b.js → 3f3f8e7d16ba3bf4.js} +1 -1
  149. package/mcp-server/app/api/tools/route.ts +5 -4
  150. package/mcp-server/app/mcp/route.ts +8 -63
  151. package/mcp-server/app/mcp/tools.ts +71 -445
  152. package/mcp-server/app/page.tsx +1 -1
  153. package/mcp-server/package.json +2 -0
  154. package/package.json +6 -5
  155. package/src/tui-interface-impl.tsx +6 -15
  156. package/dist/components/SkillSelector.d.ts +0 -10
  157. package/dist/components/SkillSelector.d.ts.map +0 -1
  158. package/dist/components/SkillSelector.js +0 -87
  159. package/dist/components/SkillSelector.js.map +0 -1
  160. package/mcp-server/.next/server/chunks/[root-of-the-server]__130a5f58._.js +0 -4
  161. package/mcp-server/.next/server/chunks/[root-of-the-server]__444592aa._.js +0 -3
  162. package/mcp-server/.next/server/chunks/[root-of-the-server]__8f84b4cc._.js +0 -3
  163. package/mcp-server/.next/server/chunks/[root-of-the-server]__b71c83ed._.js +0 -4
  164. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__8f84b4cc._.js.map → [root-of-the-server]__c8cf5b23._.js.map} +0 -0
  165. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js.map → [root-of-the-server]__b17d4048._.js.map} +0 -0
  166. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js.map → [root-of-the-server]__dcf84f77._.js.map} +0 -0
  167. /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_buildManifest.js +0 -0
  168. /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_clientMiddlewareManifest.json +0 -0
  169. /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_ssgManifest.js +0 -0
@@ -1,12 +1,8 @@
1
1
  /**
2
- * Shared skill module for d3k
2
+ * Skill module for d3k
3
3
  *
4
- * Skills are prompt templates stored as SKILL.md files that provide
5
- * specialized instructions for specific tasks.
6
- *
7
- * This module is used by both:
8
- * - CLI: `d3k skill <name>`
9
- * - MCP: `get_skill` tool
4
+ * Skills are managed by `npx skills` and stored in .agents/skills/
5
+ * d3k also bundles its own skill which gets copied to .agents/skills/d3k/ on startup.
10
6
  */
11
7
  export interface SkillInfo {
12
8
  name: string;
@@ -22,17 +18,17 @@ export interface SkillResult {
22
18
  availableSkills?: string[];
23
19
  }
24
20
  /**
25
- * Get the base directories where skills can be found.
26
- * Searches in order of priority:
27
- * 1. Project-local skills (.claude/skills/)
28
- * 2. Global skills (~/.claude/skills/)
29
- * 3. Source skills (src/skills/) - for development
30
- * 4. Dist skills (dist/skills/) - for installed packages
21
+ * Get the path to d3k's bundled skills directory.
22
+ * Returns null if not found (e.g., running in development without build).
23
+ */
24
+ export declare function getBundledSkillsPath(): string | null;
25
+ /**
26
+ * Get directories where skills can be found.
27
+ * Skills are managed by `npx skills` in .agents/skills/
31
28
  */
32
29
  export declare function getSkillDirectories(cwd?: string): string[];
33
30
  /**
34
31
  * Find a skill by name.
35
- * Returns the path to the SKILL.md file if found.
36
32
  */
37
33
  export declare function findSkill(name: string, cwd?: string): string | null;
38
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA8C1D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CA4BhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CA+BvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAkBpD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAuBhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CA4BvD"}
@@ -1,71 +1,56 @@
1
1
  /**
2
- * Shared skill module for d3k
2
+ * Skill module for d3k
3
3
  *
4
- * Skills are prompt templates stored as SKILL.md files that provide
5
- * specialized instructions for specific tasks.
6
- *
7
- * This module is used by both:
8
- * - CLI: `d3k skill <name>`
9
- * - MCP: `get_skill` tool
4
+ * Skills are managed by `npx skills` and stored in .agents/skills/
5
+ * d3k also bundles its own skill which gets copied to .agents/skills/d3k/ on startup.
10
6
  */
11
7
  import { existsSync, readdirSync, readFileSync } from "fs";
12
8
  import { homedir } from "os";
13
9
  import { dirname, join } from "path";
14
- import { fileURLToPath } from "url";
15
10
  /**
16
- * Get the base directories where skills can be found.
17
- * Searches in order of priority:
18
- * 1. Project-local skills (.claude/skills/)
19
- * 2. Global skills (~/.claude/skills/)
20
- * 3. Source skills (src/skills/) - for development
21
- * 4. Dist skills (dist/skills/) - for installed packages
11
+ * Get the path to d3k's bundled skills directory.
12
+ * Returns null if not found (e.g., running in development without build).
22
13
  */
23
- export function getSkillDirectories(cwd) {
24
- const dirs = [];
25
- // 1. Project-local skills (highest priority)
26
- const projectDir = cwd || process.cwd();
27
- dirs.push(join(projectDir, ".claude", "skills"));
28
- // 2. Global skills (~/.claude/skills/)
29
- dirs.push(join(homedir(), ".claude", "skills"));
30
- // 3. Check if we're running from a compiled binary (bun compile)
31
- // In compiled binaries, import.meta.url returns /$bunfs/... virtual path
32
- // We detect this by checking if the URL starts with /$bunfs
14
+ export function getBundledSkillsPath() {
15
+ // Check if running from compiled binary
33
16
  const moduleUrl = import.meta.url;
34
17
  const isCompiledBinary = moduleUrl.startsWith("file:///$bunfs") || moduleUrl.startsWith("/$bunfs");
35
18
  if (isCompiledBinary) {
36
- // For compiled binaries, process.execPath contains the actual binary path
37
19
  const binaryPath = process.execPath;
38
20
  if (binaryPath && existsSync(binaryPath)) {
39
- const binDir = dirname(binaryPath); // bin/
40
- const packageDir = dirname(binDir); // platform package root (e.g., @d3k/darwin-arm64)
41
- dirs.push(join(packageDir, "skills"));
21
+ const binDir = dirname(binaryPath);
22
+ const packageDir = dirname(binDir);
23
+ const skillsDir = join(packageDir, "skills");
24
+ if (existsSync(skillsDir)) {
25
+ return skillsDir;
26
+ }
42
27
  }
43
28
  }
44
- // 4. Source and dist skills from the d3k package
45
- // Handle both ESM (__dirname equivalent) and different execution contexts
46
- try {
47
- const currentFile = fileURLToPath(import.meta.url);
48
- const srcDir = dirname(currentFile); // src/skills
49
- const packageRoot = dirname(dirname(srcDir)); // package root
50
- // Source skills (for development)
51
- dirs.push(join(packageRoot, "src", "skills"));
52
- // Dist skills (for installed package)
53
- dirs.push(join(packageRoot, "dist", "skills"));
54
- // Also check if we're in a binary distribution
55
- dirs.push(join(packageRoot, "skills"));
56
- }
57
- catch {
58
- // Fallback for CommonJS or other contexts
29
+ return null;
30
+ }
31
+ /**
32
+ * Get directories where skills can be found.
33
+ * Skills are managed by `npx skills` in .agents/skills/
34
+ */
35
+ export function getSkillDirectories(cwd) {
36
+ const dirs = [];
37
+ const projectDir = cwd || process.cwd();
38
+ // Project-local skills (highest priority)
39
+ dirs.push(join(projectDir, ".agents", "skills"));
40
+ // Global skills
41
+ dirs.push(join(homedir(), ".agents", "skills"));
42
+ // d3k's bundled skills (fallback for d3k skill before it's copied)
43
+ const bundled = getBundledSkillsPath();
44
+ if (bundled) {
45
+ dirs.push(bundled);
59
46
  }
60
47
  return dirs.filter((dir) => existsSync(dir));
61
48
  }
62
49
  /**
63
50
  * Find a skill by name.
64
- * Returns the path to the SKILL.md file if found.
65
51
  */
66
52
  export function findSkill(name, cwd) {
67
- const skillDirs = getSkillDirectories(cwd);
68
- for (const dir of skillDirs) {
53
+ for (const dir of getSkillDirectories(cwd)) {
69
54
  const skillPath = join(dir, name, "SKILL.md");
70
55
  if (existsSync(skillPath)) {
71
56
  return skillPath;
@@ -81,12 +66,7 @@ export function getSkill(name, cwd) {
81
66
  if (skillPath) {
82
67
  try {
83
68
  const content = readFileSync(skillPath, "utf-8");
84
- return {
85
- found: true,
86
- name,
87
- content,
88
- path: skillPath
89
- };
69
+ return { found: true, name, content, path: skillPath };
90
70
  }
91
71
  catch (error) {
92
72
  return {
@@ -109,21 +89,16 @@ export function getSkill(name, cwd) {
109
89
  */
110
90
  export function listAvailableSkills(cwd) {
111
91
  const skills = new Set();
112
- const skillDirs = getSkillDirectories(cwd);
113
- for (const dir of skillDirs) {
92
+ for (const dir of getSkillDirectories(cwd)) {
114
93
  try {
115
- const entries = readdirSync(dir, { withFileTypes: true });
116
- for (const entry of entries) {
117
- if (entry.isDirectory()) {
118
- const skillFile = join(dir, entry.name, "SKILL.md");
119
- if (existsSync(skillFile)) {
120
- skills.add(entry.name);
121
- }
94
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
95
+ if (entry.isDirectory() && existsSync(join(dir, entry.name, "SKILL.md"))) {
96
+ skills.add(entry.name);
122
97
  }
123
98
  }
124
99
  }
125
100
  catch {
126
- // Directory might not exist or be readable
101
+ // Directory not readable
127
102
  }
128
103
  }
129
104
  return Array.from(skills).sort();
@@ -133,32 +108,29 @@ export function listAvailableSkills(cwd) {
133
108
  */
134
109
  export function getSkillsInfo(cwd) {
135
110
  const skillsMap = new Map();
136
- const skillDirs = getSkillDirectories(cwd);
137
- for (const dir of skillDirs) {
111
+ for (const dir of getSkillDirectories(cwd)) {
138
112
  try {
139
- const entries = readdirSync(dir, { withFileTypes: true });
140
- for (const entry of entries) {
113
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
141
114
  if (entry.isDirectory() && !skillsMap.has(entry.name)) {
142
115
  const skillPath = join(dir, entry.name, "SKILL.md");
143
116
  if (existsSync(skillPath)) {
144
117
  try {
145
118
  const content = readFileSync(skillPath, "utf-8");
146
- const description = extractDescription(content);
147
119
  skillsMap.set(entry.name, {
148
120
  name: entry.name,
149
- description,
121
+ description: extractDescription(content),
150
122
  path: skillPath
151
123
  });
152
124
  }
153
125
  catch {
154
- // Skip unreadable skills
126
+ // Skip unreadable
155
127
  }
156
128
  }
157
129
  }
158
130
  }
159
131
  }
160
132
  catch {
161
- // Directory might not exist or be readable
133
+ // Directory not readable
162
134
  }
163
135
  }
164
136
  return Array.from(skillsMap.values()).sort((a, b) => a.name.localeCompare(b.name));
@@ -167,21 +139,19 @@ export function getSkillsInfo(cwd) {
167
139
  * Extract description from SKILL.md frontmatter or first paragraph.
168
140
  */
169
141
  function extractDescription(content) {
170
- // Try to extract from YAML frontmatter
142
+ // Try YAML frontmatter
171
143
  const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
172
144
  if (frontmatterMatch) {
173
- const frontmatter = frontmatterMatch[1];
174
- const descMatch = frontmatter.match(/description:\s*(.+)/);
145
+ const descMatch = frontmatterMatch[1].match(/description:\s*(.+)/);
175
146
  if (descMatch) {
176
147
  return descMatch[1].trim();
177
148
  }
178
149
  }
179
- // Fallback: use first non-heading, non-empty line
180
- const lines = content.split("\n");
181
- for (const line of lines) {
150
+ // Fallback: first non-heading, non-empty line
151
+ for (const line of content.split("\n")) {
182
152
  const trimmed = line.trim();
183
153
  if (trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("---")) {
184
- return trimmed.slice(0, 100) + (trimmed.length > 100 ? "..." : "");
154
+ return trimmed.length > 100 ? `${trimmed.slice(0, 97)}...` : trimmed;
185
155
  }
186
156
  }
187
157
  return "No description available";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,6 @@ import { existsSync, readdirSync, readFileSync } from "fs"
2
2
  import { beforeEach, describe, expect, it, vi } from "vitest"
3
3
  import { findSkill, getSkill, getSkillDirectories, getSkillsInfo, listAvailableSkills, type SkillResult } from "./index"
4
4
 
5
- // Mock fs module
6
5
  vi.mock("fs", () => ({
7
6
  existsSync: vi.fn(),
8
7
  readdirSync: vi.fn(),
@@ -20,30 +19,22 @@ describe("skills module", () => {
20
19
 
21
20
  describe("getSkillDirectories", () => {
22
21
  it("should return directories that exist", () => {
23
- // At minimum, should return project-local .claude/skills if it exists
24
- mockExistsSync.mockImplementation((path: string) => {
25
- return path.includes(".claude/skills") || path.includes("src/skills")
26
- })
27
-
22
+ mockExistsSync.mockImplementation((path: string) => path.includes(".agents/skills"))
28
23
  const dirs = getSkillDirectories("/test/project")
29
24
  expect(dirs.length).toBeGreaterThan(0)
30
25
  })
31
26
 
32
- it("should include project-local skills directory", () => {
27
+ it("should include project-local .agents/skills directory", () => {
33
28
  mockExistsSync.mockReturnValue(true)
34
-
35
29
  const dirs = getSkillDirectories("/test/project")
36
- const hasProjectLocal = dirs.some((d) => d.includes(".claude/skills"))
37
- expect(hasProjectLocal).toBe(true)
30
+ expect(dirs.some((d) => d.includes(".agents/skills"))).toBe(true)
38
31
  })
39
32
  })
40
33
 
41
34
  describe("findSkill", () => {
42
35
  it("should find a skill in the first matching directory", () => {
43
- // Mock: directory exists AND skill file exists
44
36
  mockExistsSync.mockImplementation((path: string) => {
45
- // Return true for both the directory check and the SKILL.md file check
46
- return path.includes(".claude/skills") || path.includes("src/skills") || path.includes("test-skill/SKILL.md")
37
+ return path.includes(".agents/skills") || path.includes("test-skill/SKILL.md")
47
38
  })
48
39
 
49
40
  const result = findSkill("test-skill", "/test/project")
@@ -53,7 +44,6 @@ describe("skills module", () => {
53
44
 
54
45
  it("should return null if skill not found", () => {
55
46
  mockExistsSync.mockReturnValue(false)
56
-
57
47
  const result = findSkill("nonexistent-skill", "/test/project")
58
48
  expect(result).toBeNull()
59
49
  })
@@ -69,9 +59,8 @@ description: Test skill description
69
59
 
70
60
  This is test content.`
71
61
 
72
- // Mock: directory exists AND skill file exists
73
62
  mockExistsSync.mockImplementation((path: string) => {
74
- return path.includes(".claude/skills") || path.includes("src/skills") || path.includes("test-skill/SKILL.md")
63
+ return path.includes(".agents/skills") || path.includes("test-skill/SKILL.md")
75
64
  })
76
65
  mockReadFileSync.mockReturnValue(skillContent)
77
66
 
@@ -79,7 +68,6 @@ This is test content.`
79
68
  expect(result.found).toBe(true)
80
69
  expect(result.name).toBe("test-skill")
81
70
  expect(result.content).toBe(skillContent)
82
- expect(result.path).toBeTruthy()
83
71
  })
84
72
 
85
73
  it("should return error when skill not found", () => {
@@ -89,13 +77,11 @@ This is test content.`
89
77
  const result: SkillResult = getSkill("nonexistent", "/test/project")
90
78
  expect(result.found).toBe(false)
91
79
  expect(result.error).toContain("not found")
92
- expect(result.availableSkills).toBeDefined()
93
80
  })
94
81
 
95
82
  it("should handle read errors gracefully", () => {
96
- // Mock: directory and file exist but read fails
97
83
  mockExistsSync.mockImplementation((path: string) => {
98
- return path.includes(".claude/skills") || path.includes("src/skills") || path.includes("error-skill/SKILL.md")
84
+ return path.includes(".agents/skills") || path.includes("error-skill/SKILL.md")
99
85
  })
100
86
  mockReadFileSync.mockImplementation(() => {
101
87
  throw new Error("Permission denied")
@@ -109,28 +95,17 @@ This is test content.`
109
95
  })
110
96
 
111
97
  describe("listAvailableSkills", () => {
112
- it("should list skills from all directories", () => {
98
+ it("should list skills from directories", () => {
113
99
  mockExistsSync.mockReturnValue(true)
114
- mockReaddirSync.mockImplementation((dir: string) => {
115
- if (dir.includes(".claude/skills")) {
116
- return [
117
- { name: "skill-a", isDirectory: () => true },
118
- { name: "skill-b", isDirectory: () => true }
119
- ]
120
- }
121
- if (dir.includes("src/skills")) {
122
- return [
123
- { name: "skill-c", isDirectory: () => true },
124
- { name: "not-a-skill.txt", isDirectory: () => false }
125
- ]
126
- }
127
- return []
128
- })
100
+ mockReaddirSync.mockImplementation(() => [
101
+ { name: "skill-a", isDirectory: () => true },
102
+ { name: "skill-b", isDirectory: () => true },
103
+ { name: "not-a-skill.txt", isDirectory: () => false }
104
+ ])
129
105
 
130
106
  const skills = listAvailableSkills("/test/project")
131
107
  expect(skills).toContain("skill-a")
132
108
  expect(skills).toContain("skill-b")
133
- expect(skills).toContain("skill-c")
134
109
  expect(skills).not.toContain("not-a-skill.txt")
135
110
  })
136
111
 
@@ -139,8 +114,7 @@ This is test content.`
139
114
  mockReaddirSync.mockImplementation(() => [{ name: "same-skill", isDirectory: () => true }])
140
115
 
141
116
  const skills = listAvailableSkills("/test/project")
142
- const sameSkillCount = skills.filter((s) => s === "same-skill").length
143
- expect(sameSkillCount).toBe(1)
117
+ expect(skills.filter((s) => s === "same-skill").length).toBe(1)
144
118
  })
145
119
 
146
120
  it("should return sorted list", () => {
@@ -182,7 +156,6 @@ description: A helpful skill for testing
182
156
  expect(skills.length).toBeGreaterThan(0)
183
157
  expect(skills[0].name).toBe("test-skill")
184
158
  expect(skills[0].description).toBe("A helpful skill for testing")
185
- expect(skills[0].path).toBeTruthy()
186
159
  })
187
160
 
188
161
  it("should extract description from first paragraph if no frontmatter", () => {
@@ -199,20 +172,5 @@ More content here.`
199
172
  const skills = getSkillsInfo("/test/project")
200
173
  expect(skills[0].description).toContain("This is the first paragraph")
201
174
  })
202
-
203
- it("should truncate long descriptions", () => {
204
- const longDescription = "A".repeat(150)
205
- const skillContent = `---
206
- description: ${longDescription}
207
- ---`
208
-
209
- mockExistsSync.mockReturnValue(true)
210
- mockReaddirSync.mockImplementation(() => [{ name: "test-skill", isDirectory: () => true }])
211
- mockReadFileSync.mockReturnValue(skillContent)
212
-
213
- const skills = getSkillsInfo("/test/project")
214
- // The frontmatter description isn't truncated, only first-paragraph fallback is
215
- expect(skills[0].description).toBe(longDescription)
216
- })
217
175
  })
218
176
  })