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.
- package/README.md +121 -103
- package/bin/dev3000 +10 -5
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +2 -3
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.js +301 -75
- package/dist/cli.js.map +1 -1
- package/dist/commands/cloud-check-pr.d.ts +1 -0
- package/dist/commands/cloud-check-pr.d.ts.map +1 -1
- package/dist/commands/cloud-check-pr.js +18 -6
- package/dist/commands/cloud-check-pr.js.map +1 -1
- package/dist/commands/crawl.d.ts +12 -0
- package/dist/commands/crawl.d.ts.map +1 -0
- package/dist/commands/crawl.js +140 -0
- package/dist/commands/crawl.js.map +1 -0
- package/dist/commands/errors.d.ts +14 -0
- package/dist/commands/errors.d.ts.map +1 -0
- package/dist/commands/errors.js +295 -0
- package/dist/commands/errors.js.map +1 -0
- package/dist/commands/find-component.d.ts +8 -0
- package/dist/commands/find-component.d.ts.map +1 -0
- package/dist/commands/find-component.js +182 -0
- package/dist/commands/find-component.js.map +1 -0
- package/dist/commands/fix.d.ts +13 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +288 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/logs.d.ts +13 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +195 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/restart.d.ts +8 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +92 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/components/PackageSelector.d.ts +12 -0
- package/dist/components/PackageSelector.d.ts.map +1 -0
- package/dist/components/PackageSelector.js +74 -0
- package/dist/components/PackageSelector.js.map +1 -0
- package/dist/dev-environment.d.ts +0 -7
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +108 -674
- package/dist/dev-environment.js.map +1 -1
- package/dist/screencast-manager.d.ts.map +1 -1
- package/dist/screencast-manager.js +7 -8
- package/dist/screencast-manager.js.map +1 -1
- package/dist/services/parsers/output-processor.js +2 -2
- package/dist/services/parsers/output-processor.js.map +1 -1
- package/dist/skills/d3k/SKILL.md +38 -27
- package/dist/skills/index.d.ts +10 -14
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +47 -77
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/index.test.ts +13 -55
- package/dist/skills/index.ts +48 -81
- package/dist/src/tui-interface-impl.tsx +6 -15
- package/dist/tui-interface-impl.d.ts.map +1 -1
- package/dist/tui-interface-impl.js +4 -4
- package/dist/tui-interface-impl.js.map +1 -1
- package/dist/tui-interface-opentui.d.ts.map +1 -1
- package/dist/tui-interface-opentui.js +227 -100
- package/dist/tui-interface-opentui.js.map +1 -1
- package/dist/utils/agent-browser.d.ts +2 -0
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +46 -8
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/agent-selection.d.ts.map +1 -1
- package/dist/utils/agent-selection.js +9 -2
- package/dist/utils/agent-selection.js.map +1 -1
- package/dist/utils/skill-installer.d.ts +55 -29
- package/dist/utils/skill-installer.d.ts.map +1 -1
- package/dist/utils/skill-installer.js +118 -229
- package/dist/utils/skill-installer.js.map +1 -1
- package/dist/utils/tmux-helpers.d.ts +1 -2
- package/dist/utils/tmux-helpers.d.ts.map +1 -1
- package/dist/utils/tmux-helpers.js +17 -18
- package/dist/utils/tmux-helpers.js.map +1 -1
- package/dist/utils/version-check.d.ts +2 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +9 -0
- package/dist/utils/version-check.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/build-manifest.json +2 -2
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/prerender-manifest.json +3 -3
- package/mcp-server/.next/server/app/_global-error/page.js +1 -1
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found/page.js +1 -1
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js +2 -2
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/logs/page.js +1 -1
- package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/mcp/route.js +4 -4
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page.js +1 -1
- package/mcp-server/.next/server/app/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js +3 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js.map +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__69e6dfb7._.js +3 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__444592aa._.js.map → [root-of-the-server]__69e6dfb7._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6baff21e._.js +4 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__130a5f58._.js.map → [root-of-the-server]__6baff21e._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js.map +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c8cf5b23._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e6a83e60._.js +4 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__b71c83ed._.js.map → [root-of-the-server]__e6a83e60._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +32 -66
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -1
- package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js +1 -1
- package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js.map +1 -1
- package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js +3 -0
- package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js → [root-of-the-server]__b17d4048._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js → [root-of-the-server]__dcf84f77._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js.map +1 -1
- package/mcp-server/.next/server/pages/404.html +1 -1
- package/mcp-server/.next/server/pages/500.html +2 -2
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/chunks/{2422ea9ed874427b.js → 3f3f8e7d16ba3bf4.js} +1 -1
- package/mcp-server/app/api/tools/route.ts +5 -4
- package/mcp-server/app/mcp/route.ts +8 -63
- package/mcp-server/app/mcp/tools.ts +71 -445
- package/mcp-server/app/page.tsx +1 -1
- package/mcp-server/package.json +2 -0
- package/package.json +6 -5
- package/src/tui-interface-impl.tsx +6 -15
- package/dist/components/SkillSelector.d.ts +0 -10
- package/dist/components/SkillSelector.d.ts.map +0 -1
- package/dist/components/SkillSelector.js +0 -87
- package/dist/components/SkillSelector.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__130a5f58._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__444592aa._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8f84b4cc._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b71c83ed._.js +0 -4
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__8f84b4cc._.js.map → [root-of-the-server]__c8cf5b23._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js.map → [root-of-the-server]__b17d4048._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js.map → [root-of-the-server]__dcf84f77._.js.map} +0 -0
- /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{HVxg1xsmhVm6VO2KBlH_- → MfA6U1EFS31sVuHA4xDF_}/_ssgManifest.js +0 -0
package/dist/skills/index.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Skill module for d3k
|
|
3
3
|
*
|
|
4
|
-
* Skills are
|
|
5
|
-
*
|
|
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
|
|
26
|
-
*
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
*
|
|
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
|
|
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"}
|
package/dist/skills/index.js
CHANGED
|
@@ -1,71 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Skill module for d3k
|
|
3
3
|
*
|
|
4
|
-
* Skills are
|
|
5
|
-
*
|
|
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
|
|
17
|
-
*
|
|
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
|
|
24
|
-
|
|
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);
|
|
40
|
-
const packageDir = dirname(binDir);
|
|
41
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
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
|
|
113
|
-
for (const dir of skillDirs) {
|
|
92
|
+
for (const dir of getSkillDirectories(cwd)) {
|
|
114
93
|
try {
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
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
|
|
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
|
|
137
|
-
for (const dir of skillDirs) {
|
|
111
|
+
for (const dir of getSkillDirectories(cwd)) {
|
|
138
112
|
try {
|
|
139
|
-
const
|
|
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
|
|
126
|
+
// Skip unreadable
|
|
155
127
|
}
|
|
156
128
|
}
|
|
157
129
|
}
|
|
158
130
|
}
|
|
159
131
|
}
|
|
160
132
|
catch {
|
|
161
|
-
// Directory
|
|
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
|
|
142
|
+
// Try YAML frontmatter
|
|
171
143
|
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
172
144
|
if (frontmatterMatch) {
|
|
173
|
-
const
|
|
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:
|
|
180
|
-
const
|
|
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.
|
|
154
|
+
return trimmed.length > 100 ? `${trimmed.slice(0, 97)}...` : trimmed;
|
|
185
155
|
}
|
|
186
156
|
}
|
|
187
157
|
return "No description available";
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(".
|
|
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(".
|
|
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
|
|
98
|
+
it("should list skills from directories", () => {
|
|
113
99
|
mockExistsSync.mockReturnValue(true)
|
|
114
|
-
mockReaddirSync.mockImplementation((
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
})
|