@lnar/cli 0.0.1-dev.5da411d → 0.0.1-dev.8b5d456
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 +1 -0
- package/dist/api-client.js.map +1 -1
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.js +84 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/scan.js +9 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/scanners/claude-code-skills.d.ts +6 -0
- package/dist/scanners/claude-code-skills.js +200 -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/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 +39 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,29 +4,27 @@ Lnar CLI that scans your AI agent configuration files (Claude / Claude Code, Cod
|
|
|
4
4
|
|
|
5
5
|
Read-only: the CLI only reads agent config files. Environment variable **keys** are recorded, but their **values are never sent** to the server.
|
|
6
6
|
|
|
7
|
-
## Install
|
|
7
|
+
## Install
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
# 1. Install the CLI globally
|
|
11
10
|
npm install -g @lnar/cli
|
|
12
|
-
|
|
13
|
-
# 2. Sign in + start the always-on background service (one command)
|
|
14
11
|
lnar up
|
|
15
12
|
```
|
|
16
13
|
|
|
17
|
-
`lnar up`
|
|
14
|
+
`lnar up` does two things in one command:
|
|
18
15
|
|
|
19
|
-
- If you are not
|
|
20
|
-
-
|
|
16
|
+
- If you are not authenticated, runs the OAuth device-code flow (opens a URL + shows a short code).
|
|
17
|
+
- Registers a background service that auto-starts on login / boot and re-launches if it crashes:
|
|
21
18
|
- macOS → launchd LaunchAgent (`~/Library/LaunchAgents/ai.lnar.daemon.plist`)
|
|
22
19
|
- Linux → systemd `--user` unit (`~/.config/systemd/user/lnar-daemon.service`)
|
|
23
20
|
- Windows → Task Scheduler (`LnarDaemon`, logon trigger + auto-restart)
|
|
24
21
|
|
|
25
22
|
The service syncs the latest MCP-server list with lnar every 30s and applies any changes queued from the dashboard (e.g. "Add MCP server", "Disconnect").
|
|
26
23
|
|
|
27
|
-
|
|
24
|
+
## Commands
|
|
28
25
|
|
|
29
26
|
```sh
|
|
27
|
+
lnar up # sign in + start the background service
|
|
30
28
|
lnar status # show authentication + service status
|
|
31
29
|
lnar down # stop and remove the background service
|
|
32
30
|
lnar scan # one-shot: print detected MCP servers, no upload
|
|
@@ -34,14 +32,15 @@ lnar sync # one-shot: scan and upload, then exit
|
|
|
34
32
|
lnar login # re-authenticate (normally `lnar up` is enough)
|
|
35
33
|
```
|
|
36
34
|
|
|
37
|
-
|
|
35
|
+
To force a specific endpoint, pass `--api-base-url` or set `LNAR_API_BASE_URL`.
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
|---|---|---|
|
|
41
|
-
| Production | `npm install -g @lnar/cli && lnar up` | `https://api.lnar.ai` |
|
|
42
|
-
| Develop (pre-release verification) | `npm install -g @lnar/cli@dev && lnar up` | `https://api-dev.lnar.ai` |
|
|
37
|
+
## Uninstall
|
|
43
38
|
|
|
44
|
-
|
|
39
|
+
```sh
|
|
40
|
+
lnar down # stop and unregister the background service
|
|
41
|
+
npm uninstall -g @lnar/cli # remove the CLI binary
|
|
42
|
+
rm -rf ~/.config/lnar # (optional) remove cached credentials
|
|
43
|
+
```
|
|
45
44
|
|
|
46
45
|
## Supported agents
|
|
47
46
|
|
|
@@ -53,44 +52,7 @@ The `@dev` tag is published from the `develop` branch and is intended for verify
|
|
|
53
52
|
| Gemini CLI | implemented | `~/.gemini/settings.json`, `.gemini/settings.json` (project) |
|
|
54
53
|
| ChatGPT | placeholder | `~/Library/Application Support/com.openai.chat` (existence only — connector data is encrypted) |
|
|
55
54
|
|
|
56
|
-
##
|
|
57
|
-
|
|
58
|
-
```sh
|
|
59
|
-
pnpm install
|
|
60
|
-
pnpm dev scan # run from source against your default API
|
|
61
|
-
pnpm test # run vitest
|
|
62
|
-
pnpm build # compile to dist/
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Release workflow
|
|
66
|
-
|
|
67
|
-
公開戦略は **canary + manual prod** (Next.js / Claude Code 系):
|
|
68
|
-
|
|
69
|
-
| トリガー | dist-tag | デフォルト API |
|
|
70
|
-
|---|---|---|
|
|
71
|
-
| `develop` への push | `@dev` (canary) | `api-dev.lnar.ai` |
|
|
72
|
-
| `cli-v*` の git tag push | `@latest` (本番) | `api.lnar.ai` |
|
|
73
|
-
| GitHub Actions の `workflow_dispatch` (手動) | 任意 (dev / latest / beta / rc) | tag に応じる |
|
|
74
|
-
|
|
75
|
-
### dev (canary) リリース
|
|
76
|
-
|
|
77
|
-
develop ブランチに変更を merge するだけ。CI が自動で `0.0.1-dev.abc1234` のような
|
|
78
|
-
SHA suffix 付きで `@dev` タグに publish する。
|
|
79
|
-
|
|
80
|
-
### 本番リリース
|
|
81
|
-
|
|
82
|
-
```sh
|
|
83
|
-
git checkout main
|
|
84
|
-
git merge develop # 本番化したい develop の内容を取り込む
|
|
85
|
-
cd cli
|
|
86
|
-
npm version minor # 0.0.1 → 0.1.0、自動で commit + tag (v0.1.0) が作られる
|
|
87
|
-
# ※ ただし tag 名は CI 側で "cli-v*" を期待するので
|
|
88
|
-
# git tag -a cli-v0.1.0 -m "Release 0.1.0" の方が安全
|
|
89
|
-
git push --follow-tags
|
|
90
|
-
# → cli-v0.1.0 tag が CI を発火し、@latest で publish
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 緊急時の手動公開
|
|
55
|
+
## Contributing
|
|
94
56
|
|
|
95
|
-
|
|
96
|
-
|
|
57
|
+
For development setup (pre-release `@dev` verification, local source
|
|
58
|
+
workflow, release process), see the [lnar repository](https://github.com/NexaScience/lnar).
|
package/dist/api-client.js
CHANGED
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,MAAM,CAAS;IACf,IAAI,CAAS;IACb,YAAY,MAAc,EAAE,IAAY;QACtC,KAAK,CAAC,aAAa,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,OAAe,EACf,MAAc,EACd,IAAgB,EACW,EAAE;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,MAAM,CAAS;IACf,IAAI,CAAS;IACb,YAAY,MAAc,EAAE,IAAY;QACtC,KAAK,CAAC,aAAa,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,OAAe,EACf,MAAc,EACd,IAAgB,EACW,EAAE;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;aACvB,CAAC,CAAC;SACJ,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;AACrD,CAAC,CAAC"}
|
package/dist/commands/daemon.js
CHANGED
|
@@ -4,6 +4,7 @@ import { DEFAULT_CLIENT_ID, loadConfig, saveConfig } from '../config.js';
|
|
|
4
4
|
import { OAuthError, refreshAccessToken } from '../oauth-client.js';
|
|
5
5
|
import { listPendingForHost, reportApplied, reportFailed, } from '../pending-client.js';
|
|
6
6
|
import { runAllScanners } from '../scanners/index.js';
|
|
7
|
+
import { runSseClient, SseFatalError } from '../sse-client.js';
|
|
7
8
|
import { getWriter } from '../writers/registry.js';
|
|
8
9
|
const DEFAULT_INTERVAL_SECONDS = 30;
|
|
9
10
|
const ACCESS_TOKEN_REFRESH_SKEW_SECONDS = 60;
|
|
@@ -112,6 +113,61 @@ const runOnce = async (config) => {
|
|
|
112
113
|
// 3. 反映後に再スキャン送信して dashboard の表示も最新化
|
|
113
114
|
await runScanAndSync(config);
|
|
114
115
|
};
|
|
116
|
+
/**
|
|
117
|
+
* runOnce が重複実行されないよう mutex を取る。SSE 通知と polling が同時に発火
|
|
118
|
+
* したとき、両方が runOnce を呼んで pending を二重処理するのを防ぐ。pending が
|
|
119
|
+
* あれば即時実行、すでに走っていれば 1 回だけ追い焚き予約 (coalesce)。
|
|
120
|
+
*/
|
|
121
|
+
const createRunOnceMutex = () => {
|
|
122
|
+
let inFlight = null;
|
|
123
|
+
let queued = false;
|
|
124
|
+
const trigger = (config) => {
|
|
125
|
+
if (inFlight) {
|
|
126
|
+
// すでに走っているなら次回追い焚き予約 (複数回呼ばれても 1 回に集約)。
|
|
127
|
+
queued = true;
|
|
128
|
+
return inFlight;
|
|
129
|
+
}
|
|
130
|
+
const run = async () => {
|
|
131
|
+
try {
|
|
132
|
+
await runOnce(config);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
if (queued) {
|
|
136
|
+
queued = false;
|
|
137
|
+
// 1 回だけ追い焚き。caller の最新 trigger に応答する。
|
|
138
|
+
inFlight = run();
|
|
139
|
+
await inFlight;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
inFlight = run().finally(() => {
|
|
144
|
+
inFlight = null;
|
|
145
|
+
});
|
|
146
|
+
return inFlight;
|
|
147
|
+
};
|
|
148
|
+
return { trigger };
|
|
149
|
+
};
|
|
150
|
+
const startSseListener = (config, host, trigger, signal) => {
|
|
151
|
+
const url = new URL('/v1/monitoring/daemon/events', config.apiBaseUrl);
|
|
152
|
+
url.searchParams.set('hostname', host);
|
|
153
|
+
process.stdout.write(`lnar daemon: SSE connecting to ${url.toString()}\n`);
|
|
154
|
+
return runSseClient({
|
|
155
|
+
url: url.toString(),
|
|
156
|
+
token: bearerFor(config),
|
|
157
|
+
signal,
|
|
158
|
+
onOpen: async () => {
|
|
159
|
+
// 接続 / 再接続のたびに 1 回 fetch (取りこぼし防止)
|
|
160
|
+
process.stdout.write('lnar daemon: SSE connected\n');
|
|
161
|
+
await trigger(config);
|
|
162
|
+
},
|
|
163
|
+
onEvent: async (event) => {
|
|
164
|
+
if (event.type === 'pending_created') {
|
|
165
|
+
process.stdout.write('lnar daemon: SSE event → fetching pending\n');
|
|
166
|
+
await trigger(config);
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
};
|
|
115
171
|
export const runDaemon = async (options = {}) => {
|
|
116
172
|
const initial = await loadConfig();
|
|
117
173
|
if (initial == null) {
|
|
@@ -119,13 +175,36 @@ export const runDaemon = async (options = {}) => {
|
|
|
119
175
|
process.exit(1);
|
|
120
176
|
}
|
|
121
177
|
const interval = (options.intervalSeconds ?? DEFAULT_INTERVAL_SECONDS) * 1000;
|
|
178
|
+
const enableSse = options.enableSse ?? !options.once;
|
|
179
|
+
const host = hostname();
|
|
180
|
+
const { trigger } = createRunOnceMutex();
|
|
122
181
|
let running = true;
|
|
182
|
+
const sseAbort = new AbortController();
|
|
123
183
|
const stop = () => {
|
|
124
184
|
running = false;
|
|
185
|
+
sseAbort.abort();
|
|
125
186
|
process.stdout.write('\nlnar daemon: shutting down…\n');
|
|
126
187
|
};
|
|
127
188
|
process.on('SIGINT', stop);
|
|
128
189
|
process.on('SIGTERM', stop);
|
|
190
|
+
// SSE listener は background で常時走らせる。fatal error (401 等) は
|
|
191
|
+
// catch して polling loop 側の token refresh に任せる。
|
|
192
|
+
// Box にしないと TS が closure 内の代入をフローに反映できず never 扱いになる。
|
|
193
|
+
const sseTaskRef = { current: null };
|
|
194
|
+
const startSse = (config) => {
|
|
195
|
+
if (!enableSse)
|
|
196
|
+
return;
|
|
197
|
+
sseTaskRef.current = startSseListener(config, host, trigger, sseAbort.signal).catch((err) => {
|
|
198
|
+
if (err instanceof SseFatalError) {
|
|
199
|
+
process.stderr.write(`lnar daemon: SSE fatal (${err.status}); falling back to polling only\n`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
203
|
+
process.stderr.write(`lnar daemon: SSE listener stopped: ${message}\n`);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
startSse(initial);
|
|
129
208
|
while (running) {
|
|
130
209
|
let config;
|
|
131
210
|
try {
|
|
@@ -140,7 +219,7 @@ export const runDaemon = async (options = {}) => {
|
|
|
140
219
|
continue;
|
|
141
220
|
}
|
|
142
221
|
try {
|
|
143
|
-
await
|
|
222
|
+
await trigger(config);
|
|
144
223
|
}
|
|
145
224
|
catch (err) {
|
|
146
225
|
if (err instanceof ApiError && err.status === 401) {
|
|
@@ -154,5 +233,9 @@ export const runDaemon = async (options = {}) => {
|
|
|
154
233
|
break;
|
|
155
234
|
await sleep(interval);
|
|
156
235
|
}
|
|
236
|
+
if (sseTaskRef.current) {
|
|
237
|
+
sseAbort.abort();
|
|
238
|
+
await sseTaskRef.current.catch(() => undefined);
|
|
239
|
+
}
|
|
157
240
|
};
|
|
158
241
|
//# sourceMappingURL=daemon.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { hostname } from 'node:os';
|
|
2
2
|
import { runAllScanners } from '../scanners/index.js';
|
|
3
|
+
const truncate = (s, max) => s.length <= max ? s : `${s.slice(0, max - 1)}…`;
|
|
3
4
|
const formatHuman = (result) => {
|
|
4
5
|
if (result.agents.length === 0) {
|
|
5
6
|
return 'No AI agents with MCP servers detected on this machine.';
|
|
@@ -16,6 +17,14 @@ const formatHuman = (result) => {
|
|
|
16
17
|
const scope = `[${s.sourceScope}]`.padEnd(10);
|
|
17
18
|
lines.push(` - ${s.name.padEnd(24)} ${transport} ${scope} ${target}`);
|
|
18
19
|
}
|
|
20
|
+
if (agent.skills && agent.skills.length > 0) {
|
|
21
|
+
lines.push('');
|
|
22
|
+
lines.push(` skills (${agent.skills.length})`);
|
|
23
|
+
for (const sk of agent.skills) {
|
|
24
|
+
const scope = `[${sk.scope}]`.padEnd(10);
|
|
25
|
+
lines.push(` - ${sk.name.padEnd(28)} ${scope} ${truncate(sk.description, 64)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
19
28
|
lines.push('');
|
|
20
29
|
}
|
|
21
30
|
return lines.join('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtD,MAAM,WAAW,GAAG,CAAC,MAAkB,EAAU,EAAE;IACjD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,SAAS,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACzF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,UAAU,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CACjG,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,UAA8B,EAAE,EAAiB,EAAE;IAC/E,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,MAAM,MAAM,GAAe;QACzB,QAAQ,EAAE,QAAQ,EAAE;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM;KACP,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
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
|
+
};
|
|
151
|
+
};
|
|
152
|
+
const scanSkillsDirectory = async (skillsDir, scope, projectPath) => {
|
|
153
|
+
let entries;
|
|
154
|
+
try {
|
|
155
|
+
entries = await readdir(skillsDir);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (err.code === 'ENOENT')
|
|
159
|
+
return [];
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const results = await Promise.all(entries.map((name) => readSkillFile(skillsDir, name, scope, projectPath)));
|
|
163
|
+
return results.filter((s) => s !== null);
|
|
164
|
+
};
|
|
165
|
+
const dedupeByPath = (skills) => {
|
|
166
|
+
// 巡回中に同じ project を重複して見ることがある (cwd と ~/.claude.json#projects の両方に
|
|
167
|
+
// 入っている場合など) ので、sourcePath で de-dup する。
|
|
168
|
+
const seen = new Map();
|
|
169
|
+
for (const s of skills) {
|
|
170
|
+
if (!seen.has(s.sourcePath))
|
|
171
|
+
seen.set(s.sourcePath, s);
|
|
172
|
+
}
|
|
173
|
+
return Array.from(seen.values());
|
|
174
|
+
};
|
|
175
|
+
export const scanClaudeCodeSkills = async (options = {}) => {
|
|
176
|
+
const home = options.home ?? homedir();
|
|
177
|
+
const cwd = options.cwd ?? process.cwd();
|
|
178
|
+
// user scope: ~/.claude/skills/
|
|
179
|
+
const userSkillsDir = join(home, '.claude', 'skills');
|
|
180
|
+
// project scope: ~/.claude.json#projects のキー + cwd を全部巡回。
|
|
181
|
+
// MCP スキャン (claude-code.ts) と同じ巡回ロジック。
|
|
182
|
+
const claudeJsonPath = join(home, '.claude.json');
|
|
183
|
+
const projectDirs = new Set();
|
|
184
|
+
projectDirs.add(cwd);
|
|
185
|
+
const root = await readJsonIfExists(claudeJsonPath);
|
|
186
|
+
if (root && typeof root === 'object' && !Array.isArray(root)) {
|
|
187
|
+
const projects = root.projects;
|
|
188
|
+
if (projects && typeof projects === 'object' && !Array.isArray(projects)) {
|
|
189
|
+
for (const dir of Object.keys(projects)) {
|
|
190
|
+
projectDirs.add(dir);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const [userSkills, ...projectSkillSets] = await Promise.all([
|
|
195
|
+
scanSkillsDirectory(userSkillsDir, 'user', null),
|
|
196
|
+
...Array.from(projectDirs).map((dir) => scanSkillsDirectory(join(dir, '.claude', 'skills'), 'project', dir)),
|
|
197
|
+
]);
|
|
198
|
+
return dedupeByPath([...userSkills, ...projectSkillSets.flat()]);
|
|
199
|
+
};
|
|
200
|
+
//# 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/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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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal SSE client for daemon → API event channel.
|
|
3
|
+
*
|
|
4
|
+
* Node 20 にはネイティブの `EventSource` グローバルが無いため、`fetch` の
|
|
5
|
+
* `ReadableStream<Uint8Array>` を自前で SSE フレームにパースする。
|
|
6
|
+
* 依存を増やさず、必要な機能 (event name + data) だけを抜き出す最小実装。
|
|
7
|
+
*
|
|
8
|
+
* 重要な設計判断:
|
|
9
|
+
* - **canonical fetch パターン**: SSE はベストエフォート通知レイヤー。
|
|
10
|
+
* payload に頼らず、event を受けたら呼び出し元が必ず再 fetch する
|
|
11
|
+
* 責務を持つ。これにより exactly-once / 順序問題から解放される。
|
|
12
|
+
* - **exponential backoff**: 1s → 2s → 4s → ... cap 30s。401 はリトライ不可。
|
|
13
|
+
* - **再接続時の取りこぼし防止**: caller は connect-callback で必ず 1 回
|
|
14
|
+
* fetch を回す前提。SSE が落ちている間に発生したイベントは fallback
|
|
15
|
+
* poll が拾うので、SSE 側で catch-up を実装する必要は無い。
|
|
16
|
+
*/
|
|
17
|
+
import type { ApiError } from './api-client.js';
|
|
18
|
+
interface SseEvent {
|
|
19
|
+
/** SSE の `event:` フィールド。デフォルトは "message"。 */
|
|
20
|
+
type: string;
|
|
21
|
+
/** SSE の `data:` フィールドの結合結果 (連続行は `\n` で join)。 */
|
|
22
|
+
data: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SseClientOptions {
|
|
25
|
+
/** SSE エンドポイントの完全 URL (例: https://api.lnar.ai/v1/monitoring/daemon/events?hostname=...) */
|
|
26
|
+
url: string;
|
|
27
|
+
/** OAuth bearer token。 */
|
|
28
|
+
token: string;
|
|
29
|
+
/** イベント到着時に呼ばれる。例外は無視されない (caller で握る)。 */
|
|
30
|
+
onEvent: (event: SseEvent) => Promise<void> | void;
|
|
31
|
+
/** SSE がオープンしたタイミング (初回 + 各再接続時)。catch-up fetch を仕込むのに使う。 */
|
|
32
|
+
onOpen?: () => Promise<void> | void;
|
|
33
|
+
/** 致命的に止めるシグナル。AbortSignal を渡せば caller が close 可能。 */
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
/** 初期 backoff (ms)。テスト時に短縮できるよう注入可能。default 1000。 */
|
|
36
|
+
initialBackoffMs?: number;
|
|
37
|
+
/** 最大 backoff (ms)。default 30000。 */
|
|
38
|
+
maxBackoffMs?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 1 行ずつ SSE フィールドを読み取って `SseEvent` を組み立てるパーサ。
|
|
42
|
+
* 仕様: https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
43
|
+
*
|
|
44
|
+
* 必要な部分だけ実装: event / data / 空行で flush。id / retry はサーバ側で
|
|
45
|
+
* 使っていないので無視。
|
|
46
|
+
*/
|
|
47
|
+
declare class SseFrameParser {
|
|
48
|
+
private buffer;
|
|
49
|
+
private currentEvent;
|
|
50
|
+
private currentData;
|
|
51
|
+
/** 受信したテキスト断片をフィードし、確定した event だけを返す。 */
|
|
52
|
+
feed(chunk: string): SseEvent[];
|
|
53
|
+
private flush;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 終端不能エラー (401 など) を表す例外。caller がリトライをやめる判断に使う。
|
|
57
|
+
*/
|
|
58
|
+
export declare class SseFatalError extends Error {
|
|
59
|
+
status: number;
|
|
60
|
+
constructor(message: string, status: number);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* SSE エンドポイントに常時接続し、event を caller に流し続ける。
|
|
64
|
+
*
|
|
65
|
+
* 戻り値の Promise は signal が abort されたとき、もしくは SseFatalError が
|
|
66
|
+
* 発生したときに解決する。通常運用では永久ループのため await は daemon の
|
|
67
|
+
* シャットダウンと組み合わせて使う。
|
|
68
|
+
*/
|
|
69
|
+
export declare const runSseClient: (options: SseClientOptions) => Promise<void>;
|
|
70
|
+
export declare const _SseFrameParserForTest: typeof SseFrameParser;
|
|
71
|
+
export type { SseEvent };
|
|
72
|
+
export type { ApiError };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal SSE client for daemon → API event channel.
|
|
3
|
+
*
|
|
4
|
+
* Node 20 にはネイティブの `EventSource` グローバルが無いため、`fetch` の
|
|
5
|
+
* `ReadableStream<Uint8Array>` を自前で SSE フレームにパースする。
|
|
6
|
+
* 依存を増やさず、必要な機能 (event name + data) だけを抜き出す最小実装。
|
|
7
|
+
*
|
|
8
|
+
* 重要な設計判断:
|
|
9
|
+
* - **canonical fetch パターン**: SSE はベストエフォート通知レイヤー。
|
|
10
|
+
* payload に頼らず、event を受けたら呼び出し元が必ず再 fetch する
|
|
11
|
+
* 責務を持つ。これにより exactly-once / 順序問題から解放される。
|
|
12
|
+
* - **exponential backoff**: 1s → 2s → 4s → ... cap 30s。401 はリトライ不可。
|
|
13
|
+
* - **再接続時の取りこぼし防止**: caller は connect-callback で必ず 1 回
|
|
14
|
+
* fetch を回す前提。SSE が落ちている間に発生したイベントは fallback
|
|
15
|
+
* poll が拾うので、SSE 側で catch-up を実装する必要は無い。
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_INITIAL_BACKOFF_MS = 1000;
|
|
18
|
+
const DEFAULT_MAX_BACKOFF_MS = 30_000;
|
|
19
|
+
/**
|
|
20
|
+
* 1 行ずつ SSE フィールドを読み取って `SseEvent` を組み立てるパーサ。
|
|
21
|
+
* 仕様: https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
22
|
+
*
|
|
23
|
+
* 必要な部分だけ実装: event / data / 空行で flush。id / retry はサーバ側で
|
|
24
|
+
* 使っていないので無視。
|
|
25
|
+
*/
|
|
26
|
+
class SseFrameParser {
|
|
27
|
+
buffer = '';
|
|
28
|
+
currentEvent = null;
|
|
29
|
+
currentData = [];
|
|
30
|
+
/** 受信したテキスト断片をフィードし、確定した event だけを返す。 */
|
|
31
|
+
feed(chunk) {
|
|
32
|
+
this.buffer += chunk;
|
|
33
|
+
const events = [];
|
|
34
|
+
let lineEnd;
|
|
35
|
+
// CR / LF / CRLF いずれにも対応するため正規表現で分割。
|
|
36
|
+
while ((lineEnd = this.buffer.search(/\r\n|\r|\n/)) !== -1) {
|
|
37
|
+
const line = this.buffer.slice(0, lineEnd);
|
|
38
|
+
const sepLen = this.buffer.slice(lineEnd, lineEnd + 2) === '\r\n' ? 2 : 1;
|
|
39
|
+
this.buffer = this.buffer.slice(lineEnd + sepLen);
|
|
40
|
+
if (line === '') {
|
|
41
|
+
// 空行 = event 区切り
|
|
42
|
+
const event = this.flush();
|
|
43
|
+
if (event)
|
|
44
|
+
events.push(event);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// コメント行 (':' で始まる) は heartbeat 用なので無視。
|
|
48
|
+
if (line.startsWith(':'))
|
|
49
|
+
continue;
|
|
50
|
+
const colonIdx = line.indexOf(':');
|
|
51
|
+
const field = colonIdx === -1 ? line : line.slice(0, colonIdx);
|
|
52
|
+
// SSE 仕様: `:` の直後の単一スペースは省く。
|
|
53
|
+
let value = colonIdx === -1 ? '' : line.slice(colonIdx + 1);
|
|
54
|
+
if (value.startsWith(' '))
|
|
55
|
+
value = value.slice(1);
|
|
56
|
+
if (field === 'event') {
|
|
57
|
+
this.currentEvent = value;
|
|
58
|
+
}
|
|
59
|
+
else if (field === 'data') {
|
|
60
|
+
this.currentData.push(value);
|
|
61
|
+
}
|
|
62
|
+
// id / retry はサポート外。
|
|
63
|
+
}
|
|
64
|
+
return events;
|
|
65
|
+
}
|
|
66
|
+
flush() {
|
|
67
|
+
if (this.currentData.length === 0 && this.currentEvent == null)
|
|
68
|
+
return null;
|
|
69
|
+
const event = {
|
|
70
|
+
type: this.currentEvent ?? 'message',
|
|
71
|
+
data: this.currentData.join('\n'),
|
|
72
|
+
};
|
|
73
|
+
this.currentEvent = null;
|
|
74
|
+
this.currentData = [];
|
|
75
|
+
return event;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 終端不能エラー (401 など) を表す例外。caller がリトライをやめる判断に使う。
|
|
80
|
+
*/
|
|
81
|
+
export class SseFatalError extends Error {
|
|
82
|
+
status;
|
|
83
|
+
constructor(message, status) {
|
|
84
|
+
super(message);
|
|
85
|
+
this.status = status;
|
|
86
|
+
this.name = 'SseFatalError';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SSE エンドポイントに常時接続し、event を caller に流し続ける。
|
|
91
|
+
*
|
|
92
|
+
* 戻り値の Promise は signal が abort されたとき、もしくは SseFatalError が
|
|
93
|
+
* 発生したときに解決する。通常運用では永久ループのため await は daemon の
|
|
94
|
+
* シャットダウンと組み合わせて使う。
|
|
95
|
+
*/
|
|
96
|
+
export const runSseClient = async (options) => {
|
|
97
|
+
const initialBackoff = options.initialBackoffMs ?? DEFAULT_INITIAL_BACKOFF_MS;
|
|
98
|
+
const maxBackoff = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;
|
|
99
|
+
let backoff = initialBackoff;
|
|
100
|
+
while (!options.signal?.aborted) {
|
|
101
|
+
try {
|
|
102
|
+
await connectAndStream(options);
|
|
103
|
+
// 正常クローズ (サーバ側切断 / EOF) は即再接続する。
|
|
104
|
+
backoff = initialBackoff;
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (options.signal?.aborted)
|
|
108
|
+
return;
|
|
109
|
+
if (err instanceof SseFatalError && err.status === 401) {
|
|
110
|
+
// トークン期限切れなどは上位 daemon ループで refresh されるため
|
|
111
|
+
// ここでは終了して上位に任せる。
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
+
process.stderr.write(`lnar daemon: SSE disconnected (${message}); retry in ${Math.round(backoff / 1000)}s\n`);
|
|
116
|
+
await sleep(backoff, options.signal);
|
|
117
|
+
backoff = Math.min(backoff * 2, maxBackoff);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const sleep = (ms, signal) => new Promise((resolve) => {
|
|
122
|
+
if (signal?.aborted)
|
|
123
|
+
return resolve();
|
|
124
|
+
const timer = setTimeout(() => {
|
|
125
|
+
signal?.removeEventListener('abort', onAbort);
|
|
126
|
+
resolve();
|
|
127
|
+
}, ms);
|
|
128
|
+
const onAbort = () => {
|
|
129
|
+
clearTimeout(timer);
|
|
130
|
+
resolve();
|
|
131
|
+
};
|
|
132
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
133
|
+
});
|
|
134
|
+
const connectAndStream = async (options) => {
|
|
135
|
+
const response = await fetch(options.url, {
|
|
136
|
+
method: 'GET',
|
|
137
|
+
headers: {
|
|
138
|
+
Authorization: `Bearer ${options.token}`,
|
|
139
|
+
Accept: 'text/event-stream',
|
|
140
|
+
},
|
|
141
|
+
signal: options.signal,
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
const body = await response.text().catch(() => '');
|
|
145
|
+
if (response.status === 401 || response.status === 403) {
|
|
146
|
+
throw new SseFatalError(`SSE auth failed: ${response.status} ${body}`, response.status);
|
|
147
|
+
}
|
|
148
|
+
throw new Error(`SSE HTTP ${response.status}: ${body}`);
|
|
149
|
+
}
|
|
150
|
+
if (response.body == null) {
|
|
151
|
+
throw new Error('SSE response has no body');
|
|
152
|
+
}
|
|
153
|
+
if (options.onOpen) {
|
|
154
|
+
// open callback は parser 起動 *前* に走らせる。これにより SSE 接続中に
|
|
155
|
+
// 来たイベントよりも前に必ず 1 回の canonical fetch が動く。
|
|
156
|
+
await options.onOpen();
|
|
157
|
+
}
|
|
158
|
+
const decoder = new TextDecoder('utf-8');
|
|
159
|
+
const parser = new SseFrameParser();
|
|
160
|
+
const reader = response.body.getReader();
|
|
161
|
+
while (true) {
|
|
162
|
+
const { value, done } = await reader.read();
|
|
163
|
+
if (done)
|
|
164
|
+
return;
|
|
165
|
+
const text = decoder.decode(value, { stream: true });
|
|
166
|
+
const events = parser.feed(text);
|
|
167
|
+
for (const event of events) {
|
|
168
|
+
await options.onEvent(event);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
// テスト用: パーサ単体をエクスポートする (private クラスに匹敵)。
|
|
173
|
+
export const _SseFrameParserForTest = SseFrameParser;
|
|
174
|
+
//# sourceMappingURL=sse-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -63,6 +63,23 @@ export declare const PluginEntry: z.ZodObject<{
|
|
|
63
63
|
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
64
64
|
}, z.core.$strip>;
|
|
65
65
|
export type PluginEntry = z.infer<typeof PluginEntry>;
|
|
66
|
+
export declare const SkillScope: z.ZodEnum<{
|
|
67
|
+
project: "project";
|
|
68
|
+
user: "user";
|
|
69
|
+
}>;
|
|
70
|
+
export type SkillScope = z.infer<typeof SkillScope>;
|
|
71
|
+
export declare const SkillEntry: z.ZodObject<{
|
|
72
|
+
name: z.ZodString;
|
|
73
|
+
description: z.ZodString;
|
|
74
|
+
scope: z.ZodEnum<{
|
|
75
|
+
project: "project";
|
|
76
|
+
user: "user";
|
|
77
|
+
}>;
|
|
78
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
79
|
+
sourcePath: z.ZodString;
|
|
80
|
+
contentHash: z.ZodString;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
export type SkillEntry = z.infer<typeof SkillEntry>;
|
|
66
83
|
export declare const AgentSnapshot: z.ZodObject<{
|
|
67
84
|
agentKind: z.ZodEnum<{
|
|
68
85
|
claude_code: "claude_code";
|
|
@@ -107,6 +124,17 @@ export declare const AgentSnapshot: z.ZodObject<{
|
|
|
107
124
|
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
108
125
|
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
109
126
|
}, z.core.$strip>>>;
|
|
127
|
+
skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
128
|
+
name: z.ZodString;
|
|
129
|
+
description: z.ZodString;
|
|
130
|
+
scope: z.ZodEnum<{
|
|
131
|
+
project: "project";
|
|
132
|
+
user: "user";
|
|
133
|
+
}>;
|
|
134
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
135
|
+
sourcePath: z.ZodString;
|
|
136
|
+
contentHash: z.ZodString;
|
|
137
|
+
}, z.core.$strip>>>;
|
|
110
138
|
}, z.core.$strip>;
|
|
111
139
|
export type AgentSnapshot = z.infer<typeof AgentSnapshot>;
|
|
112
140
|
export declare const ScanResult: z.ZodObject<{
|
|
@@ -156,6 +184,17 @@ export declare const ScanResult: z.ZodObject<{
|
|
|
156
184
|
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
157
185
|
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
158
186
|
}, z.core.$strip>>>;
|
|
187
|
+
skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
188
|
+
name: z.ZodString;
|
|
189
|
+
description: z.ZodString;
|
|
190
|
+
scope: z.ZodEnum<{
|
|
191
|
+
project: "project";
|
|
192
|
+
user: "user";
|
|
193
|
+
}>;
|
|
194
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
195
|
+
sourcePath: z.ZodString;
|
|
196
|
+
contentHash: z.ZodString;
|
|
197
|
+
}, z.core.$strip>>>;
|
|
159
198
|
}, z.core.$strip>>;
|
|
160
199
|
}, z.core.$strip>;
|
|
161
200
|
export type ScanResult = z.infer<typeof ScanResult>;
|
package/dist/types.js
CHANGED
|
@@ -38,12 +38,33 @@ export const PluginEntry = z.object({
|
|
|
38
38
|
lastUpdatedAt: z.string().nullable().optional(),
|
|
39
39
|
gitCommitSha: z.string().nullable().optional(),
|
|
40
40
|
});
|
|
41
|
+
// user: ~/.claude/skills/<name>/SKILL.md (マシン共通、個人 skill)
|
|
42
|
+
// project: <projectDir>/.claude/skills/<name>/SKILL.md (repo にコミットされ、チームで共有)
|
|
43
|
+
//
|
|
44
|
+
// plugin 同梱の skill (~/.claude/plugins/.../skills/...) は plugin 自体の情報から派生で
|
|
45
|
+
// 分かるため、本 snapshot には含めない (二重送信を避ける)。
|
|
46
|
+
export const SkillScope = z.enum(['user', 'project']);
|
|
47
|
+
export const SkillEntry = z.object({
|
|
48
|
+
// SKILL.md の YAML frontmatter から取り出した `name`
|
|
49
|
+
name: z.string(),
|
|
50
|
+
// SKILL.md の YAML frontmatter から取り出した `description` (skill のトリガー条件説明)
|
|
51
|
+
description: z.string(),
|
|
52
|
+
scope: SkillScope,
|
|
53
|
+
// project scope の場合のみ、所属する project ディレクトリ
|
|
54
|
+
projectPath: z.string().nullable().optional(),
|
|
55
|
+
// SKILL.md の絶対パス
|
|
56
|
+
sourcePath: z.string(),
|
|
57
|
+
// SKILL.md 全体の SHA-256 (先頭 16 桁) — 内容変更の検知に使う
|
|
58
|
+
contentHash: z.string(),
|
|
59
|
+
});
|
|
41
60
|
export const AgentSnapshot = z.object({
|
|
42
61
|
agentKind: AgentKind,
|
|
43
62
|
agentVersion: z.string().optional(),
|
|
44
63
|
servers: z.array(McpServerEntry),
|
|
45
64
|
// Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
|
|
46
65
|
plugins: z.array(PluginEntry).optional(),
|
|
66
|
+
// Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
|
|
67
|
+
skills: z.array(SkillEntry).optional(),
|
|
47
68
|
});
|
|
48
69
|
export const ScanResult = z.object({
|
|
49
70
|
hostname: z.string(),
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yDAAyD;AACzD,kCAAkC;AAClC,0BAA0B;AAC1B,2DAA2D;AAC3D,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;AAG7F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAG7D,oDAAoD;AACpD,6CAA6C;AAC7C,8DAA8D;AAC9D,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAGH,kDAAkD;AAClD,0DAA0D;AAC1D,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAGhE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,wEAAwE;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IAChC,0DAA0D;IAC1D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lnar/cli",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.8b5d456",
|
|
4
4
|
"description": "Lnar CLI — scans local AI agents (Claude / Claude Code, Codex CLI, Cursor, Gemini CLI, ChatGPT) for connected MCP servers and reports them to your lnar account.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|