@lnar/cli 0.0.1-dev.1da013d → 0.0.1-dev.27db913
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 +16 -54
- package/dist/api-client.js +2 -0
- package/dist/api-client.js.map +1 -1
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +68 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.js +87 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +19 -9
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/scan.js +12 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sync.js +3 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/up.js +19 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/machine-id.d.ts +2 -0
- package/dist/machine-id.js +48 -0
- package/dist/machine-id.js.map +1 -0
- package/dist/pending-client.d.ts +1 -1
- package/dist/scanners/claude-code-skills.d.ts +6 -0
- package/dist/scanners/claude-code-skills.js +201 -0
- package/dist/scanners/claude-code-skills.js.map +1 -0
- package/dist/scanners/claude-code.js +10 -3
- package/dist/scanners/claude-code.js.map +1 -1
- package/dist/scanners/index.js +3 -2
- package/dist/scanners/index.js.map +1 -1
- package/dist/service/install.js +72 -13
- package/dist/service/install.js.map +1 -1
- package/dist/sse-client.d.ts +72 -0
- package/dist/sse-client.js +174 -0
- package/dist/sse-client.js.map +1 -0
- package/dist/types.d.ts +43 -3
- package/dist/types.js +34 -2
- package/dist/types.js.map +1 -1
- package/dist/writers/claude-code.js +31 -10
- package/dist/writers/claude-code.js.map +1 -1
- package/dist/writers/registry.js +0 -4
- package/dist/writers/registry.js.map +1 -1
- package/package.json +2 -2
- package/dist/scanners/chatgpt.d.ts +0 -20
- package/dist/scanners/chatgpt.js +0 -49
- package/dist/scanners/chatgpt.js.map +0 -1
- package/dist/writers/chatgpt.d.ts +0 -8
- package/dist/writers/chatgpt.js +0 -12
- package/dist/writers/chatgpt.js.map +0 -1
package/dist/commands/up.js
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 1. `~/.config/lnar/auth.json` を読んで、認証済みでなければ device flow を起動する
|
|
5
5
|
* 2. OS の常駐サービスとして登録 (macOS=launchd / Linux=systemd / Windows=Task Scheduler)
|
|
6
|
+
* 3. インストール直後に初回 sync を 1 回だけ同期実行し、daemon の最初の cycle を
|
|
7
|
+
* 待たずダッシュボードへの反映を即時化する。Tailscale が `tailscale up` で
|
|
8
|
+
* 同期的に "phone home" するのと同じ思想。失敗しても daemon 側 polling が
|
|
9
|
+
* 後続 cycle で再試行するので、ここはベストエフォート扱いにする。
|
|
6
10
|
*
|
|
7
11
|
* 認証済みかどうかは「資格情報ファイルが存在し、accessToken or apiKey が入っているか」で
|
|
8
12
|
* 判断する。トークンの有効期限は daemon 側の API クライアントが refresh するので、
|
|
@@ -12,6 +16,20 @@
|
|
|
12
16
|
import { loadConfig } from '../config.js';
|
|
13
17
|
import { runDaemonInstall } from '../service/install.js';
|
|
14
18
|
import { runLogin } from './login.js';
|
|
19
|
+
import { runSync } from './sync.js';
|
|
20
|
+
const runInitialSync = async () => {
|
|
21
|
+
process.stdout.write('\nRunning initial sync…\n');
|
|
22
|
+
try {
|
|
23
|
+
await runSync();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
// runSync は ApiError / 401 では process.exit(1) を直接呼ぶので、ここに到達する
|
|
27
|
+
// のは予期しない例外のみ。daemon サービスのインストール自体は成功しているので、
|
|
28
|
+
// 続く polling cycle が同じ scan を再試行できる。lnar up 自体は warn で済ませる。
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
process.stderr.write(`lnar up: initial sync failed (${message}). The daemon will retry on its next cycle.\n`);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
15
33
|
export const runUp = async (options = {}) => {
|
|
16
34
|
const config = await loadConfig();
|
|
17
35
|
if (config == null) {
|
|
@@ -23,5 +41,6 @@ export const runUp = async (options = {}) => {
|
|
|
23
41
|
process.stdout.write(`Using existing credentials (${config.apiBaseUrl}).\n\n`);
|
|
24
42
|
}
|
|
25
43
|
await runDaemonInstall();
|
|
44
|
+
await runInitialSync();
|
|
26
45
|
};
|
|
27
46
|
//# sourceMappingURL=up.js.map
|
package/dist/commands/up.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAqB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,6CAA6C;QAC7C,4DAA4D;QAC5D,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,OAAO,+CAA+C,CACxF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,UAAqB,EAAE,EAAiB,EAAE;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACxF,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,UAAU,QAAQ,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* マシンに永続化される一意 ID。hostname は macOS のネットワーク状況で
|
|
8
|
+
* `xxx.local` ↔ `xxx.kkbnj1.kt.home.ne.jp` のように切り替わって別マシンと
|
|
9
|
+
* みなされるため、agent 同一性の判定には使えない。代わりに UUID v4 を生成して
|
|
10
|
+
* `~/.config/lnar/machine.json` に保存し、これをサーバー側 dedupe キーにする。
|
|
11
|
+
*
|
|
12
|
+
* - 初回呼び出し時に UUID を生成して書き込む
|
|
13
|
+
* - 2 回目以降は読み込んで返す
|
|
14
|
+
* - ファイル破損時は新規生成して上書き (機微情報は持たないので破壊的でよい)
|
|
15
|
+
*/
|
|
16
|
+
const MachineFile = z.object({
|
|
17
|
+
machineId: z.string().uuid(),
|
|
18
|
+
createdAt: z.string(),
|
|
19
|
+
});
|
|
20
|
+
export const machineIdPath = (home = homedir()) => join(home, '.config', 'lnar', 'machine.json');
|
|
21
|
+
const tryRead = async (path) => {
|
|
22
|
+
try {
|
|
23
|
+
const text = await readFile(path, 'utf-8');
|
|
24
|
+
const parsed = MachineFile.parse(JSON.parse(text));
|
|
25
|
+
return parsed.machineId;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const code = err.code;
|
|
29
|
+
if (code === 'ENOENT')
|
|
30
|
+
return null;
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const write = async (path, machineId) => {
|
|
35
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
36
|
+
const payload = { machineId, createdAt: new Date().toISOString() };
|
|
37
|
+
await writeFile(path, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
38
|
+
};
|
|
39
|
+
export const loadOrCreateMachineId = async (home = homedir()) => {
|
|
40
|
+
const path = machineIdPath(home);
|
|
41
|
+
const existing = await tryRead(path);
|
|
42
|
+
if (existing != null)
|
|
43
|
+
return existing;
|
|
44
|
+
const machineId = randomUUID();
|
|
45
|
+
await write(path, machineId);
|
|
46
|
+
return machineId;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=machine-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-id.js","sourceRoot":"","sources":["../src/machine-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,OAAO,EAAE,EAAU,EAAE,CAChE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;AAEhD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAE,SAAiB,EAAiB,EAAE;IACrE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACnE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,OAAe,OAAO,EAAE,EAAmB,EAAE;IACvF,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACtC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
|
package/dist/pending-client.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export type PendingAction = 'add_server' | 'remove_server' | 'install_plugin' | 'uninstall_plugin' | 'enable_plugin' | 'disable_plugin';
|
|
11
11
|
export type PendingStatus = 'pending' | 'applied' | 'failed' | 'cancelled';
|
|
12
|
-
export type AgentKind = 'claude_code' | 'codex' | 'cursor' | 'gemini_cli'
|
|
12
|
+
export type AgentKind = 'claude_code' | 'codex' | 'cursor' | 'gemini_cli';
|
|
13
13
|
export type SourceScope = 'global' | 'project' | 'local' | 'remote';
|
|
14
14
|
export type PluginScope = 'user' | 'local' | 'project';
|
|
15
15
|
export interface PendingSpec {
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code の skill インストール状態をスキャンする。
|
|
3
|
+
*
|
|
4
|
+
* skill とは: `<scope>/.claude/skills/<name>/SKILL.md` に置かれた agent 用の
|
|
5
|
+
* 「呼び出し可能な手順書」。各 SKILL.md は YAML frontmatter で `name` と
|
|
6
|
+
* `description` を宣言する。
|
|
7
|
+
*
|
|
8
|
+
* スキャン対象:
|
|
9
|
+
* - user: ~/.claude/skills/<name>/SKILL.md
|
|
10
|
+
* - project: <projectDir>/.claude/skills/<name>/SKILL.md
|
|
11
|
+
* ※ `<projectDir>` は `~/.claude.json#projects` に登録されたパスと
|
|
12
|
+
* 現在の cwd を巡回する (claude-code.ts の MCP スキャンと同じ流儀)
|
|
13
|
+
*
|
|
14
|
+
* 明示的に **対象外**:
|
|
15
|
+
* - ~/.claude/plugins/.../skills/<name>/SKILL.md (plugin 同梱)
|
|
16
|
+
* plugin の情報自体が別途 plugin scanner で取れているため、ここで二重送信しない。
|
|
17
|
+
*
|
|
18
|
+
* 値ではなく状態 (どの skill が入っていて、その frontmatter は何か) だけを送る。
|
|
19
|
+
* SKILL.md 本文は contentHash 経由で「変わったかどうか」だけ追跡する。
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
23
|
+
import { homedir } from 'node:os';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { readJsonIfExists } from './_normalize.js';
|
|
26
|
+
/**
|
|
27
|
+
* YAML frontmatter の最小パーサ。
|
|
28
|
+
*
|
|
29
|
+
* SKILL.md は実質的に `name:` と `description:` の 2 キーしか使わないので、
|
|
30
|
+
* 完全な YAML パーサは入れず、以下のサブセットだけ扱う:
|
|
31
|
+
* - `key: value` (single-line scalar)
|
|
32
|
+
* - `key: "value"` / `'value'` (quoted scalar)
|
|
33
|
+
* - `key: >` / `key: |` の後の indent された継続行 (folded / literal block scalar)
|
|
34
|
+
*
|
|
35
|
+
* これ以外 (リスト、ネスト、anchor 等) は SKILL.md には現れないので未対応。
|
|
36
|
+
* 想定外の構文が来たら値は空文字になり、上位で `null` 扱いされて drop される。
|
|
37
|
+
*/
|
|
38
|
+
const parseFrontmatter = (text) => {
|
|
39
|
+
// 先頭が `---\n` で始まらなければ frontmatter なし
|
|
40
|
+
if (!text.startsWith('---\n') && !text.startsWith('---\r\n'))
|
|
41
|
+
return null;
|
|
42
|
+
const lines = text.split(/\r?\n/);
|
|
43
|
+
// 最初の `---` を飛ばし、次の `---` (or `...`) までを frontmatter とみなす
|
|
44
|
+
let endIdx = -1;
|
|
45
|
+
for (let i = 1; i < lines.length; i++) {
|
|
46
|
+
const trimmed = lines[i]?.trim();
|
|
47
|
+
if (trimmed === '---' || trimmed === '...') {
|
|
48
|
+
endIdx = i;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (endIdx === -1)
|
|
53
|
+
return null;
|
|
54
|
+
const result = {};
|
|
55
|
+
let i = 1;
|
|
56
|
+
while (i < endIdx) {
|
|
57
|
+
const line = lines[i] ?? '';
|
|
58
|
+
const m = line.match(/^([A-Za-z_][A-Za-z0-9_-]*)\s*:\s*(.*)$/);
|
|
59
|
+
if (!m) {
|
|
60
|
+
i += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const [, key, rawValueRaw] = m;
|
|
64
|
+
if (!key) {
|
|
65
|
+
i += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const rawValue = (rawValueRaw ?? '').trim();
|
|
69
|
+
if (rawValue === '>' || rawValue === '|') {
|
|
70
|
+
// block scalar: 次の indented 行を全て集める
|
|
71
|
+
const collected = [];
|
|
72
|
+
const baseIndent = (lines[i + 1] ?? '').match(/^(\s*)/)?.[1]?.length ?? 0;
|
|
73
|
+
let j = i + 1;
|
|
74
|
+
while (j < endIdx) {
|
|
75
|
+
const nextLine = lines[j] ?? '';
|
|
76
|
+
if (nextLine.trim() === '') {
|
|
77
|
+
collected.push('');
|
|
78
|
+
j += 1;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const indent = nextLine.match(/^(\s*)/)?.[1]?.length ?? 0;
|
|
82
|
+
if (indent < Math.max(baseIndent, 1))
|
|
83
|
+
break;
|
|
84
|
+
collected.push(nextLine.slice(baseIndent));
|
|
85
|
+
j += 1;
|
|
86
|
+
}
|
|
87
|
+
result[key] =
|
|
88
|
+
rawValue === '>' ? collected.join(' ').replace(/\s+/g, ' ').trim() : collected.join('\n');
|
|
89
|
+
i = j;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// single-line: クォート除去のみ最小対応
|
|
93
|
+
result[key] = stripQuotes(rawValue);
|
|
94
|
+
i += 1;
|
|
95
|
+
}
|
|
96
|
+
const name = result.name?.trim();
|
|
97
|
+
const description = result.description?.trim();
|
|
98
|
+
if (!name || !description)
|
|
99
|
+
return null;
|
|
100
|
+
return { name, description };
|
|
101
|
+
};
|
|
102
|
+
const stripQuotes = (s) => {
|
|
103
|
+
if (s.length >= 2) {
|
|
104
|
+
const first = s[0];
|
|
105
|
+
const last = s[s.length - 1];
|
|
106
|
+
if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
|
|
107
|
+
return s.slice(1, -1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return s;
|
|
111
|
+
};
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// ファイルシステム走査
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
const hashContent = (text) => createHash('sha256').update(text).digest('hex').slice(0, 16);
|
|
116
|
+
const isDirectory = async (path) => {
|
|
117
|
+
try {
|
|
118
|
+
return (await stat(path)).isDirectory();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const readSkillFile = async (skillsDir, childName, scope, projectPath) => {
|
|
125
|
+
// 想定構造: <skillsDir>/<childName>/SKILL.md
|
|
126
|
+
// childName 自体が直接 SKILL.md ということは Claude Code の仕様上ない。
|
|
127
|
+
const dir = join(skillsDir, childName);
|
|
128
|
+
if (!(await isDirectory(dir)))
|
|
129
|
+
return null;
|
|
130
|
+
const filePath = join(dir, 'SKILL.md');
|
|
131
|
+
let body;
|
|
132
|
+
try {
|
|
133
|
+
body = await readFile(filePath, 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
if (err.code === 'ENOENT')
|
|
137
|
+
return null;
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const front = parseFrontmatter(body);
|
|
141
|
+
if (front == null)
|
|
142
|
+
return null;
|
|
143
|
+
return {
|
|
144
|
+
name: front.name,
|
|
145
|
+
description: front.description,
|
|
146
|
+
scope,
|
|
147
|
+
projectPath: projectPath ?? null,
|
|
148
|
+
sourcePath: filePath,
|
|
149
|
+
contentHash: hashContent(body),
|
|
150
|
+
body,
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
const scanSkillsDirectory = async (skillsDir, scope, projectPath) => {
|
|
154
|
+
let entries;
|
|
155
|
+
try {
|
|
156
|
+
entries = await readdir(skillsDir);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (err.code === 'ENOENT')
|
|
160
|
+
return [];
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
const results = await Promise.all(entries.map((name) => readSkillFile(skillsDir, name, scope, projectPath)));
|
|
164
|
+
return results.filter((s) => s !== null);
|
|
165
|
+
};
|
|
166
|
+
const dedupeByPath = (skills) => {
|
|
167
|
+
// 巡回中に同じ project を重複して見ることがある (cwd と ~/.claude.json#projects の両方に
|
|
168
|
+
// 入っている場合など) ので、sourcePath で de-dup する。
|
|
169
|
+
const seen = new Map();
|
|
170
|
+
for (const s of skills) {
|
|
171
|
+
if (!seen.has(s.sourcePath))
|
|
172
|
+
seen.set(s.sourcePath, s);
|
|
173
|
+
}
|
|
174
|
+
return Array.from(seen.values());
|
|
175
|
+
};
|
|
176
|
+
export const scanClaudeCodeSkills = async (options = {}) => {
|
|
177
|
+
const home = options.home ?? homedir();
|
|
178
|
+
const cwd = options.cwd ?? process.cwd();
|
|
179
|
+
// user scope: ~/.claude/skills/
|
|
180
|
+
const userSkillsDir = join(home, '.claude', 'skills');
|
|
181
|
+
// project scope: ~/.claude.json#projects のキー + cwd を全部巡回。
|
|
182
|
+
// MCP スキャン (claude-code.ts) と同じ巡回ロジック。
|
|
183
|
+
const claudeJsonPath = join(home, '.claude.json');
|
|
184
|
+
const projectDirs = new Set();
|
|
185
|
+
projectDirs.add(cwd);
|
|
186
|
+
const root = await readJsonIfExists(claudeJsonPath);
|
|
187
|
+
if (root && typeof root === 'object' && !Array.isArray(root)) {
|
|
188
|
+
const projects = root.projects;
|
|
189
|
+
if (projects && typeof projects === 'object' && !Array.isArray(projects)) {
|
|
190
|
+
for (const dir of Object.keys(projects)) {
|
|
191
|
+
projectDirs.add(dir);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const [userSkills, ...projectSkillSets] = await Promise.all([
|
|
196
|
+
scanSkillsDirectory(userSkillsDir, 'user', null),
|
|
197
|
+
...Array.from(projectDirs).map((dir) => scanSkillsDirectory(join(dir, '.claude', 'skills'), 'project', dir)),
|
|
198
|
+
]);
|
|
199
|
+
return dedupeByPath([...userSkills, ...projectSkillSets.flat()]);
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=claude-code-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-skills.js","sourceRoot":"","sources":["../../src/scanners/claude-code-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { promisify } from 'node:util';
|
|
|
5
5
|
import { hashConfig } from '../hash.js';
|
|
6
6
|
import { extractFromMcpServersField, readJsonIfExists } from './_normalize.js';
|
|
7
7
|
import { scanClaudeCodePlugins } from './claude-code-plugins.js';
|
|
8
|
+
import { scanClaudeCodeSkills } from './claude-code-skills.js';
|
|
8
9
|
const execAsync = promisify(exec);
|
|
9
10
|
export const claudeCodePaths = (home = homedir(), cwd = process.cwd()) => ({
|
|
10
11
|
global: join(home, '.claude.json'),
|
|
@@ -194,12 +195,13 @@ export const scanClaudeCode = async (options = {}) => {
|
|
|
194
195
|
const cwd = options.cwd ?? process.cwd();
|
|
195
196
|
const includeRemote = options.includeRemote ?? true;
|
|
196
197
|
const paths = claudeCodePaths(home, cwd);
|
|
197
|
-
const [projectShared, globalAndLocal, plugins, remote, installedPlugins] = await Promise.all([
|
|
198
|
+
const [projectShared, globalAndLocal, plugins, remote, installedPlugins, installedSkills] = await Promise.all([
|
|
198
199
|
readAllProjectShared(paths.global, cwd),
|
|
199
200
|
readGlobalClaudeJson(paths.global),
|
|
200
201
|
readPluginServers(paths.pluginsManifest),
|
|
201
202
|
includeRemote ? scanClaudeAiRemote() : Promise.resolve([]),
|
|
202
203
|
scanClaudeCodePlugins(home),
|
|
204
|
+
scanClaudeCodeSkills({ home, cwd }),
|
|
203
205
|
]);
|
|
204
206
|
const all = [
|
|
205
207
|
...projectShared,
|
|
@@ -208,7 +210,7 @@ export const scanClaudeCode = async (options = {}) => {
|
|
|
208
210
|
...plugins,
|
|
209
211
|
...remote,
|
|
210
212
|
];
|
|
211
|
-
if (all.length === 0 && installedPlugins.length === 0) {
|
|
213
|
+
if (all.length === 0 && installedPlugins.length === 0 && installedSkills.length === 0) {
|
|
212
214
|
// 検出ゼロでもファイルが一つでも存在すれば「Claude Code を使っているマシン」と
|
|
213
215
|
// みなして空 snapshot を返す。すべて読めなかった場合のみ null。
|
|
214
216
|
const anyConfigSeen = (await readJsonIfExists(paths.global)) !== null ||
|
|
@@ -216,6 +218,11 @@ export const scanClaudeCode = async (options = {}) => {
|
|
|
216
218
|
if (!anyConfigSeen)
|
|
217
219
|
return null;
|
|
218
220
|
}
|
|
219
|
-
return {
|
|
221
|
+
return {
|
|
222
|
+
agentKind: 'claude_code',
|
|
223
|
+
servers: all,
|
|
224
|
+
plugins: installedPlugins,
|
|
225
|
+
skills: installedSkills,
|
|
226
|
+
};
|
|
220
227
|
};
|
|
221
228
|
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/scanners/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/scanners/claude-code.ts"],"names":[],"mappings":"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"}
|
package/dist/scanners/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { scanChatgpt } from './chatgpt.js';
|
|
2
1
|
import { scanClaudeCode } from './claude-code.js';
|
|
3
2
|
import { scanCodex } from './codex.js';
|
|
4
3
|
import { scanCursor } from './cursor.js';
|
|
5
4
|
import { scanGeminiCli } from './gemini-cli.js';
|
|
5
|
+
// ChatGPT は OS keychain で設定が暗号化されており、現状読み取り API が無いため
|
|
6
|
+
// scanner / agent_kind から外している。再追加する場合は scanners/chatgpt.ts と
|
|
7
|
+
// writers/chatgpt.ts を復活させて runAllScanners と AgentKind enum に戻すこと。
|
|
6
8
|
export const runAllScanners = async (options = {}) => {
|
|
7
9
|
const results = await Promise.all([
|
|
8
10
|
scanClaudeCode(options),
|
|
9
11
|
scanCodex({ home: options.home }),
|
|
10
12
|
scanCursor(options),
|
|
11
13
|
scanGeminiCli(options),
|
|
12
|
-
scanChatgpt({ home: options.home }),
|
|
13
14
|
]);
|
|
14
15
|
return results.filter((r) => r !== null);
|
|
15
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,sDAAsD;AACtD,8DAA8D;AAC9D,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,UAA0B,EAAE,EAA4B,EAAE;IAC7F,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChC,cAAc,CAAC,OAAO,CAAC;QACvB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,OAAO,CAAC;QACnB,aAAa,CAAC,OAAO,CAAC;KACvB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC/D,CAAC,CAAC"}
|
package/dist/service/install.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* いずれも管理者権限不要 (per-user スコープ) でインストールできる構成。
|
|
11
11
|
*/
|
|
12
12
|
import { exec } from 'node:child_process';
|
|
13
|
+
import { realpathSync } from 'node:fs';
|
|
13
14
|
import { mkdir, mkdtemp, rm, unlink, writeFile } from 'node:fs/promises';
|
|
14
15
|
import { homedir, platform, tmpdir, userInfo } from 'node:os';
|
|
15
16
|
import { dirname, join } from 'node:path';
|
|
@@ -30,7 +31,27 @@ async function runIgnoring(cmd) {
|
|
|
30
31
|
}
|
|
31
32
|
function detectTarget() {
|
|
32
33
|
const nodePath = process.execPath;
|
|
33
|
-
const
|
|
34
|
+
const rawScriptPath = process.argv[1] ?? '';
|
|
35
|
+
// ----------------------------------------------------------------------
|
|
36
|
+
// scriptPath は symlink を解決した実体パスにする。
|
|
37
|
+
// `npm install -g @lnar/cli` 後の `lnar` は `/opt/homebrew/bin/lnar` 等の
|
|
38
|
+
// symlink で、これをそのまま plist の ProgramArguments に入れると macOS
|
|
39
|
+
// launchd が bootstrap 時に EIO ("Input/output error") を返すことがある
|
|
40
|
+
// (Homebrew bin symlink + launchd の既知の癖)。さらに symlink を経由する
|
|
41
|
+
// と、後で symlink が張り替わったり消えたときに plist が壊れるリスクも
|
|
42
|
+
// 残る。realpath で解決した絶対パス
|
|
43
|
+
// (`.../lib/node_modules/@lnar/cli/dist/cli.js`) を plist に書くことで、
|
|
44
|
+
// bootstrap の安定性とパスの永続性の両方を確保する。
|
|
45
|
+
// ----------------------------------------------------------------------
|
|
46
|
+
let scriptPath = rawScriptPath;
|
|
47
|
+
try {
|
|
48
|
+
if (rawScriptPath) {
|
|
49
|
+
scriptPath = realpathSync(rawScriptPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// 解決失敗 (パスが存在しない等) は raw を使う best-effort
|
|
54
|
+
}
|
|
34
55
|
let warning = null;
|
|
35
56
|
if (scriptPath.includes('/_npx/') || scriptPath.includes('\\_npx\\')) {
|
|
36
57
|
warning =
|
|
@@ -59,29 +80,67 @@ async function isMacOsServiceLoaded() {
|
|
|
59
80
|
return false;
|
|
60
81
|
}
|
|
61
82
|
}
|
|
83
|
+
const LAUNCHCTL_EIO_PATTERN = /Input\/output error|errno 5\b|:\s*5:/i;
|
|
84
|
+
async function bootoutBothDomains(uid) {
|
|
85
|
+
// gui ドメインと user ドメインの両方を best-effort で bootout する。
|
|
86
|
+
// `launchctl print gui/uid/<label>` で見えなくても launchd 内部に過去の
|
|
87
|
+
// 別パス bootstrap 由来の "torn-down" レコードが残っていることがあり、
|
|
88
|
+
// この状態で新規 bootstrap すると EIO になる。両ドメインを叩いて
|
|
89
|
+
// launchd 側のキャッシュを確実にクリアする。
|
|
90
|
+
await runIgnoring(`launchctl bootout gui/${uid}/${SERVICE_LABEL}`);
|
|
91
|
+
await runIgnoring(`launchctl bootout user/${uid}/${SERVICE_LABEL}`);
|
|
92
|
+
}
|
|
93
|
+
async function bootstrapMacOsWithRetry(uid, plistPath) {
|
|
94
|
+
const bootstrapCmd = `launchctl bootstrap gui/${uid} ${plistPath}`;
|
|
95
|
+
const maxAttempts = 3;
|
|
96
|
+
let lastError;
|
|
97
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
98
|
+
try {
|
|
99
|
+
await run(bootstrapCmd);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
lastError = err;
|
|
104
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
105
|
+
const isEio = LAUNCHCTL_EIO_PATTERN.test(message);
|
|
106
|
+
if (!isEio || attempt === maxAttempts) {
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
process.stderr.write(`launchctl bootstrap returned EIO; retrying (${attempt}/${maxAttempts - 1})…\n`);
|
|
110
|
+
await bootoutBothDomains(uid);
|
|
111
|
+
await new Promise((r) => setTimeout(r, 500 * attempt));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// 到達不能だが TS の型チェックのため
|
|
115
|
+
throw lastError instanceof Error ? lastError : new Error('launchctl bootstrap failed');
|
|
116
|
+
}
|
|
62
117
|
async function installMacOs(target) {
|
|
63
118
|
const plistPath = macOsPlistPath();
|
|
64
119
|
await mkdir(dirname(plistPath), { recursive: true });
|
|
65
120
|
await writeFile(plistPath, macOsPlist(target));
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
121
|
+
const uid = userInfo().uid;
|
|
122
|
+
// 既存サービスは print 結果に関わらず両ドメインを bootout する。
|
|
123
|
+
// (詳細は bootoutBothDomains のコメント参照)
|
|
124
|
+
await bootoutBothDomains(uid);
|
|
125
|
+
// bootout は非同期で完了する。実際に unload されるまで最大 ~3 秒ポーリングする。
|
|
126
|
+
// `lnar up` の冪等性に必要。
|
|
127
|
+
for (let i = 0; i < 30; i++) {
|
|
128
|
+
if (!(await isMacOsServiceLoaded()))
|
|
129
|
+
break;
|
|
130
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
76
131
|
}
|
|
77
|
-
|
|
132
|
+
// bootstrap は launchd の内部状態キャッシュにより最初の試行が EIO になる
|
|
133
|
+
// ことがある。EIO を検出して再 bootout + 短い backoff で数回リトライする。
|
|
134
|
+
await bootstrapMacOsWithRetry(uid, plistPath);
|
|
78
135
|
await run(`launchctl enable ${macOsServiceTarget()}`);
|
|
79
136
|
process.stdout.write(`Installed: ${plistPath}\n`);
|
|
80
137
|
process.stdout.write(`Logs: /tmp/lnar-daemon.log /tmp/lnar-daemon.err.log\n`);
|
|
81
138
|
}
|
|
82
139
|
async function uninstallMacOs() {
|
|
83
140
|
const plistPath = macOsPlistPath();
|
|
84
|
-
|
|
141
|
+
// install 側と同様、両ドメインの torn-down レコードまで掃除する。
|
|
142
|
+
// これを怠ると `lnar down` → `lnar up` 再実行時に EIO を踏む。
|
|
143
|
+
await bootoutBothDomains(userInfo().uid);
|
|
85
144
|
try {
|
|
86
145
|
await unlink(plistPath);
|
|
87
146
|
process.stdout.write(`Removed: ${plistPath}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAoB,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EAEb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,UAAuB,EAAE;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"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"}
|