devez-vibe 1.5.28 → 1.5.30

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/bin/dvz.exe CHANGED
Binary file
@@ -889,9 +889,53 @@ async function claudePluginDetail(params) {
889
889
  };
890
890
  }
891
891
 
892
+ // SKILL.md 앞머리(frontmatter)에서 슬래시 이름과 설명만 가볍게 읽는다.
893
+ async function readSkillMeta(skillMdPath, fallbackName) {
894
+ let name = fallbackName;
895
+ let description = "";
896
+ try {
897
+ const text = await readFile(skillMdPath, "utf8");
898
+ const front = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
899
+ const body = front ? front[1] : "";
900
+ const nameLine = body.match(/^name:\s*(.+?)\s*$/m);
901
+ const descLine = body.match(/^description:\s*(.+?)\s*$/m);
902
+ const unquote = (value) => value.replace(/^["']|["']$/g, "").trim();
903
+ if (nameLine && unquote(nameLine[1])) name = unquote(nameLine[1]);
904
+ if (descLine) description = unquote(descLine[1]);
905
+ } catch { /* SKILL.md가 없거나 읽을 수 없을 수 있다. */ }
906
+ return { name, description };
907
+ }
908
+
909
+ // 플러그인이 아닌 개인·프로젝트 스킬 디렉터리(<root>/<name>/SKILL.md)를 훑는다.
910
+ async function localSkills(root, scope) {
911
+ const skills = [];
912
+ let entries;
913
+ try {
914
+ entries = await readdir(root, { withFileTypes: true });
915
+ } catch {
916
+ return skills; // 스킬 디렉터리가 없을 수 있다.
917
+ }
918
+ for (const child of entries) {
919
+ if (!child.isDirectory()) continue;
920
+ const path = join(root, child.name, "SKILL.md");
921
+ if (!existsSync(path)) continue;
922
+ const meta = await readSkillMeta(path, child.name);
923
+ skills.push({
924
+ name: meta.name,
925
+ path,
926
+ description: meta.description || `${scope} skill`,
927
+ enabled: true,
928
+ scope,
929
+ pluginId: null,
930
+ });
931
+ }
932
+ return skills;
933
+ }
934
+
892
935
  async function claudeSkills(params) {
893
936
  const installed = await runClaudeJson(params, ["plugin", "list", "--json"]);
894
937
  const skills = [];
938
+ const seen = new Set();
895
939
  for (const plugin of Array.isArray(installed) ? installed : []) {
896
940
  if (!plugin?.installPath) continue;
897
941
  try {
@@ -905,10 +949,22 @@ async function claudeSkills(params) {
905
949
  scope: plugin.scope || "user",
906
950
  pluginId: plugin.id,
907
951
  });
952
+ seen.add(child.name);
908
953
  }
909
954
  } catch { /* Plugins do not have to provide skills. */ }
910
955
  }
911
- return { data: [{ cwd: params.cwd || process.cwd(), skills }] };
956
+ const cwd = params.cwd || process.cwd();
957
+ const configDir = process.env.CLAUDE_CONFIG_DIR || join(homedir(), ".claude");
958
+ const local = [
959
+ ...(await localSkills(join(configDir, "skills"), "user")),
960
+ ...(await localSkills(join(cwd, ".claude", "skills"), "project")),
961
+ ];
962
+ for (const skill of local) {
963
+ if (seen.has(skill.name)) continue;
964
+ seen.add(skill.name);
965
+ skills.push(skill);
966
+ }
967
+ return { data: [{ cwd, skills }] };
912
968
  }
913
969
 
914
970
  function claudeMcpStatusValue(statuses) {
package/package.json CHANGED
@@ -1,41 +1,41 @@
1
- {
2
- "name": "devez-vibe",
3
- "version": "1.5.28",
4
- "description": "Stable terminal UI for Codex and Claude Agent SDK",
5
- "keywords": [
6
- "codex",
7
- "cli",
8
- "tui",
9
- "terminal",
10
- "app-server",
11
- "claude-agent-sdk"
12
- ],
13
- "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
14
- "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/MrHoje/Devez-vibe.git"
18
- },
19
- "license": "MIT",
20
- "bin": {
21
- "dvz": "bin/dvz.exe"
22
- },
23
- "files": [
24
- "bin/dvz.exe",
25
- "bridge/claude-agent-sdk-bridge.mjs",
26
- "README.md",
27
- "LICENSE"
28
- ],
29
- "os": [
30
- "win32"
31
- ],
32
- "cpu": [
33
- "x64"
34
- ],
35
- "engines": {
36
- "node": ">=18"
37
- },
38
- "dependencies": {
39
- "@anthropic-ai/claude-agent-sdk": "0.3.231"
40
- }
41
- }
1
+ {
2
+ "name": "devez-vibe",
3
+ "version": "1.5.30",
4
+ "description": "Stable terminal UI for Codex and Claude Agent SDK",
5
+ "keywords": [
6
+ "codex",
7
+ "cli",
8
+ "tui",
9
+ "terminal",
10
+ "app-server",
11
+ "claude-agent-sdk"
12
+ ],
13
+ "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
14
+ "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/MrHoje/Devez-vibe.git"
18
+ },
19
+ "license": "MIT",
20
+ "bin": {
21
+ "dvz": "bin/dvz.exe"
22
+ },
23
+ "files": [
24
+ "bin/dvz.exe",
25
+ "bridge/claude-agent-sdk-bridge.mjs",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "os": [
30
+ "win32"
31
+ ],
32
+ "cpu": [
33
+ "x64"
34
+ ],
35
+ "engines": {
36
+ "node": ">=18"
37
+ },
38
+ "dependencies": {
39
+ "@anthropic-ai/claude-agent-sdk": "0.3.231"
40
+ }
41
+ }