@lnar/cli 0.0.1-dev.1da013d → 0.0.1-dev.3982ccb
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.d.ts +19 -0
- package/dist/api-client.js +42 -0
- package/dist/api-client.js.map +1 -1
- package/dist/auth.d.ts +20 -0
- package/dist/auth.js +74 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +68 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.js +100 -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/record.d.ts +11 -0
- package/dist/commands/record.js +136 -0
- package/dist/commands/record.js.map +1 -0
- 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/recording/bundle.d.ts +23 -0
- package/dist/recording/bundle.js +41 -0
- package/dist/recording/bundle.js.map +1 -0
- package/dist/recording/capture.d.ts +33 -0
- package/dist/recording/capture.js +173 -0
- package/dist/recording/capture.js.map +1 -0
- package/dist/recording/session.d.ts +27 -0
- package/dist/recording/session.js +81 -0
- package/dist/recording/session.js.map +1 -0
- package/dist/recording/types.d.ts +59 -0
- package/dist/recording/types.js +8 -0
- package/dist/recording/types.js.map +1 -0
- package/dist/run-client.d.ts +19 -0
- package/dist/run-client.js +44 -0
- package/dist/run-client.js.map +1 -0
- package/dist/run-worker.d.ts +25 -0
- package/dist/run-worker.js +85 -0
- package/dist/run-worker.js.map +1 -0
- package/dist/runtime/actions.d.ts +13 -0
- package/dist/runtime/actions.js +107 -0
- package/dist/runtime/actions.js.map +1 -0
- package/dist/runtime/client.d.ts +3 -0
- package/dist/runtime/client.js +85 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/login.d.ts +20 -0
- package/dist/runtime/login.js +34 -0
- package/dist/runtime/login.js.map +1 -0
- package/dist/runtime/loop.d.ts +28 -0
- package/dist/runtime/loop.js +68 -0
- package/dist/runtime/loop.js.map +1 -0
- package/dist/runtime/playbook.d.ts +49 -0
- package/dist/runtime/playbook.js +73 -0
- package/dist/runtime/playbook.js.map +1 -0
- package/dist/runtime/runner.d.ts +20 -0
- package/dist/runtime/runner.js +54 -0
- package/dist/runtime/runner.js.map +1 -0
- package/dist/runtime/types.d.ts +69 -0
- package/dist/runtime/types.js +10 -0
- package/dist/runtime/types.js.map +1 -0
- 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 +10 -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
|
@@ -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
|
@@ -4,7 +4,6 @@ export declare const AgentKind: z.ZodEnum<{
|
|
|
4
4
|
codex: "codex";
|
|
5
5
|
cursor: "cursor";
|
|
6
6
|
gemini_cli: "gemini_cli";
|
|
7
|
-
chatgpt: "chatgpt";
|
|
8
7
|
}>;
|
|
9
8
|
export type AgentKind = z.infer<typeof AgentKind>;
|
|
10
9
|
export declare const McpTransport: z.ZodEnum<{
|
|
@@ -63,13 +62,30 @@ export declare const PluginEntry: z.ZodObject<{
|
|
|
63
62
|
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
64
63
|
}, z.core.$strip>;
|
|
65
64
|
export type PluginEntry = z.infer<typeof PluginEntry>;
|
|
65
|
+
export declare const SkillScope: z.ZodEnum<{
|
|
66
|
+
project: "project";
|
|
67
|
+
user: "user";
|
|
68
|
+
}>;
|
|
69
|
+
export type SkillScope = z.infer<typeof SkillScope>;
|
|
70
|
+
export declare const SkillEntry: z.ZodObject<{
|
|
71
|
+
name: z.ZodString;
|
|
72
|
+
description: z.ZodString;
|
|
73
|
+
scope: z.ZodEnum<{
|
|
74
|
+
project: "project";
|
|
75
|
+
user: "user";
|
|
76
|
+
}>;
|
|
77
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
78
|
+
sourcePath: z.ZodString;
|
|
79
|
+
contentHash: z.ZodString;
|
|
80
|
+
body: 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";
|
|
69
86
|
codex: "codex";
|
|
70
87
|
cursor: "cursor";
|
|
71
88
|
gemini_cli: "gemini_cli";
|
|
72
|
-
chatgpt: "chatgpt";
|
|
73
89
|
}>;
|
|
74
90
|
agentVersion: z.ZodOptional<z.ZodString>;
|
|
75
91
|
servers: z.ZodArray<z.ZodObject<{
|
|
@@ -107,10 +123,23 @@ export declare const AgentSnapshot: z.ZodObject<{
|
|
|
107
123
|
lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
108
124
|
gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
109
125
|
}, z.core.$strip>>>;
|
|
126
|
+
skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
127
|
+
name: z.ZodString;
|
|
128
|
+
description: z.ZodString;
|
|
129
|
+
scope: z.ZodEnum<{
|
|
130
|
+
project: "project";
|
|
131
|
+
user: "user";
|
|
132
|
+
}>;
|
|
133
|
+
projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
134
|
+
sourcePath: z.ZodString;
|
|
135
|
+
contentHash: z.ZodString;
|
|
136
|
+
body: 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<{
|
|
113
141
|
hostname: z.ZodString;
|
|
142
|
+
machineId: z.ZodOptional<z.ZodString>;
|
|
114
143
|
scannedAt: z.ZodString;
|
|
115
144
|
agents: z.ZodArray<z.ZodObject<{
|
|
116
145
|
agentKind: z.ZodEnum<{
|
|
@@ -118,7 +147,6 @@ export declare const ScanResult: z.ZodObject<{
|
|
|
118
147
|
codex: "codex";
|
|
119
148
|
cursor: "cursor";
|
|
120
149
|
gemini_cli: "gemini_cli";
|
|
121
|
-
chatgpt: "chatgpt";
|
|
122
150
|
}>;
|
|
123
151
|
agentVersion: z.ZodOptional<z.ZodString>;
|
|
124
152
|
servers: z.ZodArray<z.ZodObject<{
|
|
@@ -156,6 +184,18 @@ 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
|
+
body: z.ZodString;
|
|
198
|
+
}, z.core.$strip>>>;
|
|
159
199
|
}, z.core.$strip>>;
|
|
160
200
|
}, z.core.$strip>;
|
|
161
201
|
export type ScanResult = z.infer<typeof ScanResult>;
|
package/dist/types.js
CHANGED
|
@@ -3,8 +3,11 @@ import { z } from 'zod';
|
|
|
3
3
|
// codex: Codex CLI (OpenAI)
|
|
4
4
|
// cursor: Cursor IDE
|
|
5
5
|
// gemini_cli: Google Gemini CLI (~/.gemini/settings.json)
|
|
6
|
-
//
|
|
7
|
-
|
|
6
|
+
//
|
|
7
|
+
// chatgpt は OS keychain で暗号化された設定にしかアクセスできず読み取り API も
|
|
8
|
+
// 公開されていないため、現状サポート対象外。pending change として残しておくと
|
|
9
|
+
// AgentKind enum が広がるだけで実体が無いので、enum 自体から外す。
|
|
10
|
+
export const AgentKind = z.enum(['claude_code', 'codex', 'cursor', 'gemini_cli']);
|
|
8
11
|
export const McpTransport = z.enum(['stdio', 'http', 'sse']);
|
|
9
12
|
// global: マシン全体 (plugin / ~/.claude.json top-level)
|
|
10
13
|
// project: .mcp.json (チーム共有 / repo にコミットされる)
|
|
@@ -38,15 +41,44 @@ export const PluginEntry = z.object({
|
|
|
38
41
|
lastUpdatedAt: z.string().nullable().optional(),
|
|
39
42
|
gitCommitSha: z.string().nullable().optional(),
|
|
40
43
|
});
|
|
44
|
+
// user: ~/.claude/skills/<name>/SKILL.md (マシン共通、個人 skill)
|
|
45
|
+
// project: <projectDir>/.claude/skills/<name>/SKILL.md (repo にコミットされ、チームで共有)
|
|
46
|
+
//
|
|
47
|
+
// plugin 同梱の skill (~/.claude/plugins/.../skills/...) は plugin 自体の情報から派生で
|
|
48
|
+
// 分かるため、本 snapshot には含めない (二重送信を避ける)。
|
|
49
|
+
export const SkillScope = z.enum(['user', 'project']);
|
|
50
|
+
export const SkillEntry = z.object({
|
|
51
|
+
// SKILL.md の YAML frontmatter から取り出した `name`
|
|
52
|
+
name: z.string(),
|
|
53
|
+
// SKILL.md の YAML frontmatter から取り出した `description` (skill のトリガー条件説明)
|
|
54
|
+
description: z.string(),
|
|
55
|
+
scope: SkillScope,
|
|
56
|
+
// project scope の場合のみ、所属する project ディレクトリ
|
|
57
|
+
projectPath: z.string().nullable().optional(),
|
|
58
|
+
// SKILL.md の絶対パス
|
|
59
|
+
sourcePath: z.string(),
|
|
60
|
+
// SKILL.md 全体の SHA-256 (先頭 16 桁) — 内容変更の検知に使う
|
|
61
|
+
contentHash: z.string(),
|
|
62
|
+
// SKILL.md 本文 (frontmatter 含む全体)。dashboard で開いたとき内容を見せるため。
|
|
63
|
+
// 多くても数 KB なので毎スキャンで送ってよい (圧縮効くので)。
|
|
64
|
+
body: z.string(),
|
|
65
|
+
});
|
|
41
66
|
export const AgentSnapshot = z.object({
|
|
42
67
|
agentKind: AgentKind,
|
|
43
68
|
agentVersion: z.string().optional(),
|
|
44
69
|
servers: z.array(McpServerEntry),
|
|
45
70
|
// Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
|
|
46
71
|
plugins: z.array(PluginEntry).optional(),
|
|
72
|
+
// Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
|
|
73
|
+
skills: z.array(SkillEntry).optional(),
|
|
47
74
|
});
|
|
48
75
|
export const ScanResult = z.object({
|
|
76
|
+
// hostname は macOS のネットワーク状況により `xxx.local` ↔ `xxx.kkbnj1.kt.home.ne.jp`
|
|
77
|
+
// のように変動する。表示用に保持しつつ、agent 同一性の判定には machineId を使う。
|
|
49
78
|
hostname: z.string(),
|
|
79
|
+
// ~/.config/lnar/machine.json に永続化される UUID。同一マシンを跨ぐスキャンを
|
|
80
|
+
// 1 agent に集約するためのキー。古い CLI 互換のため optional。
|
|
81
|
+
machineId: z.string().optional(),
|
|
50
82
|
scannedAt: z.string(),
|
|
51
83
|
agents: z.array(AgentSnapshot),
|
|
52
84
|
});
|
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,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,14 @@ import { applyPluginChange, PLUGIN_ACTIONS } from './claude-code-plugins.js';
|
|
|
11
11
|
* → ~/.claude.json の top-level `mcpServers` を編集
|
|
12
12
|
* - source_scope='local'
|
|
13
13
|
* → ~/.claude.json の `projects[<project_path>].mcpServers` を編集
|
|
14
|
-
* - source_scope='project' (.mcp.json, チーム共有)
|
|
15
|
-
* →
|
|
16
|
-
*
|
|
14
|
+
* - source_scope='project' (.mcp.json, チーム共有 + agent_kind 非依存)
|
|
15
|
+
* → `<project_path>/.mcp.json` の top-level `mcpServers` を編集。Anthropic
|
|
16
|
+
* が定義した形式だが、Cursor / VS Code 等他ツールも同じファイルを参照する
|
|
17
|
+
* クロスツール慣習として広まっているため、dashboard 側からも書き込みを
|
|
18
|
+
* 許可する。team 共有 (git にコミット) されているのでこの編集は repo の
|
|
19
|
+
* 作業ツリーに変更として現れる前提。
|
|
17
20
|
* - source_scope='remote' / plugin 由来
|
|
18
|
-
* →
|
|
21
|
+
* → 未対応 (claude.ai / plugin lifecycle の管理外)
|
|
19
22
|
*
|
|
20
23
|
* 形式: `{ "<server>": { type, command, args, url, env } }`
|
|
21
24
|
* - env キーは spec.envKeys 由来。値は空文字で埋める (ユーザーが手動補完)。
|
|
@@ -40,7 +43,9 @@ const buildEntryFromSpec = (spec) => {
|
|
|
40
43
|
return entry;
|
|
41
44
|
};
|
|
42
45
|
const globalConfigPath = (home = homedir()) => join(home, '.claude.json');
|
|
43
|
-
|
|
46
|
+
// project scope (.mcp.json) は project ディレクトリ直下に置かれる。
|
|
47
|
+
const projectConfigPath = (projectPath) => join(projectPath, '.mcp.json');
|
|
48
|
+
const loadJsonConfig = async (path) => {
|
|
44
49
|
try {
|
|
45
50
|
const text = await readFile(path, 'utf-8');
|
|
46
51
|
return JSON.parse(text);
|
|
@@ -53,7 +58,10 @@ const loadGlobalConfig = async (path) => {
|
|
|
53
58
|
};
|
|
54
59
|
/**
|
|
55
60
|
* 操作対象の mcpServers セクションへの参照を返す。
|
|
56
|
-
* local
|
|
61
|
+
* - local : `projects[project_path].mcpServers` を辿り、無ければ作る
|
|
62
|
+
* - project: top-level `mcpServers` (`<project>/.mcp.json` の単純なルート構造)
|
|
63
|
+
* - global : top-level `mcpServers` (`~/.claude.json`)
|
|
64
|
+
*
|
|
57
65
|
* config を mutate するので、戻り値を書き換えればそのまま永続化対象になる。
|
|
58
66
|
*/
|
|
59
67
|
const resolveMcpServersSection = (config, change) => {
|
|
@@ -80,7 +88,8 @@ const resolveMcpServersSection = (config, change) => {
|
|
|
80
88
|
}
|
|
81
89
|
return mcpServers;
|
|
82
90
|
}
|
|
83
|
-
// global (= Claude Code の user scope) / null (旧データ互換) は
|
|
91
|
+
// global (= Claude Code の user scope) / project (.mcp.json) / null (旧データ互換) は
|
|
92
|
+
// ファイル直下の top-level mcpServers を見る (書き込み先パスのみ呼び元で振り分け)。
|
|
84
93
|
let mcpServers = config.mcpServers;
|
|
85
94
|
if (!mcpServers || typeof mcpServers !== 'object' || Array.isArray(mcpServers)) {
|
|
86
95
|
mcpServers = {};
|
|
@@ -88,12 +97,24 @@ const resolveMcpServersSection = (config, change) => {
|
|
|
88
97
|
}
|
|
89
98
|
return mcpServers;
|
|
90
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* 書き込み対象ファイルのパスを scope から導出。
|
|
102
|
+
*/
|
|
103
|
+
const resolveConfigPath = (change, home) => {
|
|
104
|
+
if (change.source_scope === 'project') {
|
|
105
|
+
if (!change.project_path) {
|
|
106
|
+
throw new Error('source_scope=project requires project_path on the pending change');
|
|
107
|
+
}
|
|
108
|
+
return projectConfigPath(change.project_path);
|
|
109
|
+
}
|
|
110
|
+
return globalConfigPath(home);
|
|
111
|
+
};
|
|
91
112
|
const applyChange = async (change, home = homedir()) => {
|
|
92
|
-
if (change.source_scope === '
|
|
113
|
+
if (change.source_scope === 'remote') {
|
|
93
114
|
throw new Error(`claude-code writer does not support source_scope='${change.source_scope}'`);
|
|
94
115
|
}
|
|
95
|
-
const path =
|
|
96
|
-
const config = await
|
|
116
|
+
const path = resolveConfigPath(change, home);
|
|
117
|
+
const config = await loadJsonConfig(path);
|
|
97
118
|
const mcpServers = resolveMcpServersSection(config, change);
|
|
98
119
|
if (change.action === 'add_server') {
|
|
99
120
|
if (change.spec == null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/writers/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG7E
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/writers/claude-code.ts"],"names":[],"mappings":"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"}
|
package/dist/writers/registry.js
CHANGED
|
@@ -20,10 +20,6 @@ export const getWriter = async (kind) => {
|
|
|
20
20
|
const { geminiCliWriter } = await import('./gemini-cli.js');
|
|
21
21
|
return geminiCliWriter;
|
|
22
22
|
}
|
|
23
|
-
case 'chatgpt': {
|
|
24
|
-
const { chatgptWriter } = await import('./chatgpt.js');
|
|
25
|
-
return chatgptWriter;
|
|
26
|
-
}
|
|
27
23
|
default:
|
|
28
24
|
return null;
|
|
29
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/writers/registry.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAe,EAA0B,EAAE;IACzE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC9D,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACrD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5D,OAAO,eAAe,CAAC;QACzB,CAAC;QACD
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/writers/registry.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAe,EAA0B,EAAE;IACzE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC9D,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACrD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5D,OAAO,eAAe,CAAC;QACzB,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lnar/cli",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.3982ccb",
|
|
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,
|
|
7
7
|
"bin": {
|
|
8
8
|
"lnar": "./dist/cli.js"
|
|
9
9
|
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/cli.js"
|
|
12
|
+
},
|
|
10
13
|
"files": [
|
|
11
14
|
"dist",
|
|
12
15
|
"README.md"
|
|
13
16
|
],
|
|
14
17
|
"scripts": {
|
|
15
|
-
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"build": "tsc -p tsconfig.json && node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"",
|
|
16
19
|
"dev": "tsx src/cli.ts",
|
|
17
20
|
"test": "vitest run",
|
|
18
21
|
"test:watch": "vitest",
|
|
@@ -24,13 +27,18 @@
|
|
|
24
27
|
},
|
|
25
28
|
"lnar:defaultApiBaseUrl": "https://api-dev.lnar.ai",
|
|
26
29
|
"dependencies": {
|
|
30
|
+
"@google/genai": "^2.0.0",
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
27
32
|
"commander": "^12.1.0",
|
|
33
|
+
"playwright": "^1.49.0",
|
|
28
34
|
"smol-toml": "^1.3.1",
|
|
35
|
+
"tar": "^7.4.3",
|
|
29
36
|
"zod": "^4.4.3"
|
|
30
37
|
},
|
|
31
38
|
"devDependencies": {
|
|
32
39
|
"@biomejs/biome": "^2.4.13",
|
|
33
40
|
"@types/node": "^25.5.0",
|
|
41
|
+
"@types/tar": "^6.1.13",
|
|
34
42
|
"tsx": "^4.19.2",
|
|
35
43
|
"typescript": "~5.6.2",
|
|
36
44
|
"vitest": "^4.1.5"
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { AgentSnapshot } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* ChatGPT Desktop / ChatGPT connectors のスキャナー (placeholder)。
|
|
4
|
-
*
|
|
5
|
-
* 現状の制限:
|
|
6
|
-
* ChatGPT Desktop (macOS) の connector 一覧は
|
|
7
|
-
* `~/Library/Application Support/com.openai.chat/connector-apps-<uuid>/apps.data` に
|
|
8
|
-
* **暗号化されたバイナリ** で保存されており、平文の MCP 設定として読めない。
|
|
9
|
-
* 暗号鍵は OS Keychain (`com.openai.chat`) に格納されている可能性が高く、
|
|
10
|
-
* ユーザー同意なくアクセスするのは不適切。
|
|
11
|
-
*
|
|
12
|
-
* したがって本スキャナーは「ChatGPT Desktop が **インストールされている**」ことだけを
|
|
13
|
-
* 検出し、agent_kind='chatgpt' の空 snapshot を返す。MCP リストの取得は将来 OpenAI 側で
|
|
14
|
-
* 公開 API が用意されるか、ユーザー操作で明示的に export してもらう必要がある。
|
|
15
|
-
*/
|
|
16
|
-
export declare const chatgptDataDir: (home?: string, os?: NodeJS.Platform) => string | null;
|
|
17
|
-
export declare const scanChatgpt: (options?: {
|
|
18
|
-
home?: string;
|
|
19
|
-
platform?: NodeJS.Platform;
|
|
20
|
-
}) => Promise<AgentSnapshot | null>;
|