@peekdev/cli 0.1.0-alpha.3 → 0.1.0-alpha.5
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/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +81 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/db.d.ts +14 -5
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +30 -7
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/extension-id.d.ts +14 -0
- package/dist/lib/extension-id.d.ts.map +1 -1
- package/dist/lib/extension-id.js +29 -0
- package/dist/lib/extension-id.js.map +1 -1
- package/dist/lib/native-host-wrapper.d.ts +23 -0
- package/dist/lib/native-host-wrapper.d.ts.map +1 -0
- package/dist/lib/native-host-wrapper.js +45 -0
- package/dist/lib/native-host-wrapper.js.map +1 -0
- package/dist/lib/peek-home.d.ts +8 -0
- package/dist/lib/peek-home.d.ts.map +1 -1
- package/dist/lib/peek-home.js +10 -0
- package/dist/lib/peek-home.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8SA,+DAA+D;AAC/D,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC7D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
// messaging host — the consent step the Phase 3a postinstall deliberately
|
|
6
6
|
// defers to (it dry-runs unless PEEK_INSTALL_NATIVE_HOST is set; here the user
|
|
7
7
|
// affirmatively opts in, so we call the installer directly with realSink).
|
|
8
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
10
|
import { parseArgs } from 'node:util';
|
|
11
11
|
import { buildManifest, hostBinaryPath, installManifests, loadExtensionIds, realSink, resolveInstallTargets, } from '@peekdev/mcp/native-host';
|
|
12
|
-
import { chromeExtensionOrigin, validateChromeExtensionId } from '../lib/extension-id.js';
|
|
12
|
+
import { chromeExtensionOrigin, extractDevId, validateChromeExtensionId, } from '../lib/extension-id.js';
|
|
13
13
|
import { atomicWriteFileSync } from '../lib/fs-atomic.js';
|
|
14
14
|
import { PEEK_BLOCK_SNIPPET, containsJsonComments, detectClients, hasPeekServer, mergePeekConfig, serializeConfig, } from '../lib/init-config.js';
|
|
15
|
+
import { wrapperContent, wrapperPath } from '../lib/native-host-wrapper.js';
|
|
16
|
+
import { peekHomeDir } from '../lib/peek-home.js';
|
|
15
17
|
import { confirm, multiSelect, promptText } from '../lib/prompt.js';
|
|
16
18
|
const SUPPORTED = ['darwin', 'linux', 'win32'];
|
|
17
19
|
/** Thrown by `readConfig` when the file is JSONC (comments) — we won't rewrite it. */
|
|
@@ -105,6 +107,34 @@ async function configureClients(homeDir, cwd) {
|
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* P-13 (2026-05-28 QA walk): read the first existing native-host manifest from
|
|
112
|
+
* the candidate targets so a re-run of `peek init` can offer to reuse the
|
|
113
|
+
* previously-captured dev extension ID. Returns the parsed JSON (or
|
|
114
|
+
* `undefined` if no target had a readable manifest); the caller passes the
|
|
115
|
+
* result to `extractDevId` and decides what to do.
|
|
116
|
+
*
|
|
117
|
+
* Windows targets have `registryKey` instead of `manifestPath`; reading the
|
|
118
|
+
* registry would need a `reg.exe query` shell-out — out of scope here. The
|
|
119
|
+
* common case (darwin/linux) is plain JSON on disk; on win32 we fall through
|
|
120
|
+
* to a fresh prompt, which is acceptable.
|
|
121
|
+
*/
|
|
122
|
+
function readExistingManifest(targets) {
|
|
123
|
+
for (const target of targets) {
|
|
124
|
+
const path = target.manifestPath;
|
|
125
|
+
if (!path)
|
|
126
|
+
continue;
|
|
127
|
+
if (!existsSync(path))
|
|
128
|
+
continue;
|
|
129
|
+
try {
|
|
130
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Try the next target on parse failure (truncated/corrupt manifest).
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
108
138
|
async function registerNativeHost(platform, homeDir) {
|
|
109
139
|
const proceed = await confirm('\nRegister the native messaging host now? (writes a manifest into your browser dirs, with your consent)', true);
|
|
110
140
|
if (!proceed) {
|
|
@@ -132,24 +162,41 @@ async function registerNativeHost(platform, homeDir) {
|
|
|
132
162
|
// building the manifest. An empty submission is OK — only sensible for a
|
|
133
163
|
// user loading the published CWS build, where the chromeWebStore slot is
|
|
134
164
|
// populated and the `dev` placeholder doesn't matter.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
165
|
+
//
|
|
166
|
+
// P-13 (2026-05-28 QA walk): on re-runs, read the existing manifest's
|
|
167
|
+
// `allowed_origins` and offer to reuse any previously-captured dev ID
|
|
168
|
+
// instead of re-prompting from scratch. Confirms B.4 idempotency.
|
|
169
|
+
const allTargets = resolveInstallTargets(platform, homeDir);
|
|
170
|
+
const existingDevId = extractDevId(readExistingManifest(allTargets));
|
|
171
|
+
let captured;
|
|
172
|
+
if (existingDevId) {
|
|
173
|
+
const reuse = await confirm(`\nFound previously-saved extension ID: ${existingDevId}\nReuse this ID?`, true);
|
|
174
|
+
if (reuse) {
|
|
175
|
+
captured = existingDevId;
|
|
176
|
+
process.stdout.write(`Reusing: ${chromeExtensionOrigin(existingDevId)}\n`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (captured === undefined) {
|
|
180
|
+
process.stdout.write([
|
|
181
|
+
'',
|
|
182
|
+
'Paste your unpacked extension ID (from chrome://extensions/, Developer mode toggle ON).',
|
|
183
|
+
"Leave empty to skip — only do this if you're loading the published CWS build.",
|
|
184
|
+
'',
|
|
185
|
+
].join('\n'));
|
|
186
|
+
captured = await promptText('Extension ID: ', {
|
|
187
|
+
validate: validateChromeExtensionId,
|
|
188
|
+
allowEmpty: true,
|
|
189
|
+
});
|
|
190
|
+
if (captured) {
|
|
191
|
+
process.stdout.write(`allowed_origins includes: ${chromeExtensionOrigin(captured)}\n`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
process.stdout.write('No extension ID provided — `allowed_origins` will only include published IDs (if any).\n');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
145
197
|
if (captured) {
|
|
146
198
|
extensionIds = { ...extensionIds, dev: captured };
|
|
147
|
-
process.stdout.write(`allowed_origins includes: ${chromeExtensionOrigin(captured)}\n`);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
process.stdout.write('No extension ID provided — `allowed_origins` will only include published IDs (if any).\n');
|
|
151
199
|
}
|
|
152
|
-
const allTargets = resolveInstallTargets(platform, homeDir);
|
|
153
200
|
const chosen = await multiSelect('Register native messaging host for:', allTargets.map((t) => ({
|
|
154
201
|
value: t,
|
|
155
202
|
label: t.browser,
|
|
@@ -160,7 +207,23 @@ async function registerNativeHost(platform, homeDir) {
|
|
|
160
207
|
process.stdout.write('No browsers selected; skipping native-host registration.\n');
|
|
161
208
|
return;
|
|
162
209
|
}
|
|
163
|
-
|
|
210
|
+
// P-16 (2026-05-28 QA walk): write a tiny shell wrapper at ~/.peek/ that
|
|
211
|
+
// hardcodes `process.execPath`, then point the manifest at the wrapper
|
|
212
|
+
// instead of the raw .js. Chrome spawns the manifest's `path` via the GUI
|
|
213
|
+
// launcher's $PATH, NOT the shell's — on macOS with both a legacy
|
|
214
|
+
// /usr/local/bin/node (v14, x86_64) and a current /opt/homebrew/bin/node
|
|
215
|
+
// (arm64), the system PATH resolves `#!/usr/bin/env node` to the older
|
|
216
|
+
// binary and `better-sqlite3.node` dlopen-fails with an architecture
|
|
217
|
+
// mismatch, crashing the host before Chrome reads any output. The wrapper
|
|
218
|
+
// is the standard fix for Node-based native messaging hosts.
|
|
219
|
+
const home = peekHomeDir();
|
|
220
|
+
mkdirSync(home, { recursive: true });
|
|
221
|
+
const wrapper = wrapperPath(home, platform);
|
|
222
|
+
writeFileSync(wrapper, wrapperContent(process.execPath, hostBinaryPath(), platform), {
|
|
223
|
+
mode: 0o755,
|
|
224
|
+
});
|
|
225
|
+
process.stdout.write(` ✔ Wrote native-host wrapper: ${wrapper}\n`);
|
|
226
|
+
const manifest = buildManifest(wrapper, extensionIds);
|
|
164
227
|
const results = installManifests([...chosen], manifest, { sink: realSink });
|
|
165
228
|
for (const r of results) {
|
|
166
229
|
const where = r.manifestPath ?? r.registryKey ?? '(unknown)';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,+EAA+E;AAC/E,6EAA6E;AAC7E,wEAAwE;AACxE,0EAA0E;AAC1E,+EAA+E;AAC/E,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/db.d.ts
CHANGED
|
@@ -76,11 +76,20 @@ export interface NetworkQueryOptions {
|
|
|
76
76
|
export declare function getNetworkEvents(db: Database, id: string, options?: NetworkQueryOptions): NetworkEventRow[];
|
|
77
77
|
/** Hydrate one session fully for `show` / `export`. Returns `undefined` if no such id. */
|
|
78
78
|
export declare function getSessionDetail(db: Database, id: string): SessionDetail | undefined;
|
|
79
|
-
/** Delete one session by id. Child rows cascade (ON DELETE CASCADE). Returns rows removed (0 or 1). */
|
|
80
|
-
export declare function deleteSession(db: Database, id: string): number;
|
|
81
79
|
/**
|
|
82
|
-
* Delete
|
|
83
|
-
*
|
|
80
|
+
* Delete one session by id. Child rows cascade (ON DELETE CASCADE). Also
|
|
81
|
+
* removes the per-session chunk directory under {@link rrwebEventsDir} — K.4
|
|
82
|
+
* fix (2026-05-28 QA walk): the DB cascade alone left gzipped blobs on disk
|
|
83
|
+
* forever. Returns rows removed (0 or 1). `rrwebBaseDir` defaults to
|
|
84
|
+
* `~/.peek/rrweb-events/`; tests override it with a tmpdir.
|
|
84
85
|
*/
|
|
85
|
-
export declare function
|
|
86
|
+
export declare function deleteSession(db: Database, id: string, rrwebBaseDir?: string): number;
|
|
87
|
+
/**
|
|
88
|
+
* Delete every session whose `updated_at` is strictly before the ISO cutoff
|
|
89
|
+
* AND the corresponding per-session chunk directories on disk. SELECT-then-
|
|
90
|
+
* DELETE wraps in a transaction so the on-disk cleanup matches what was
|
|
91
|
+
* actually removed from the DB even if a concurrent write lands between the
|
|
92
|
+
* two statements. Returns the number of sessions removed.
|
|
93
|
+
*/
|
|
94
|
+
export declare function deleteSessionsOlderThan(db: Database, cutoffIso: string, rrwebBaseDir?: string): number;
|
|
86
95
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/lib/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/db.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
// The returned shapes deliberately mirror the MCP tool return schema (P2 PRD
|
|
7
7
|
// §B3) so `peek sessions export --format json` and the MCP `get_session_*`
|
|
8
8
|
// tools are interchangeable for an AI consumer.
|
|
9
|
+
import { rmSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { rrwebEventsDir } from './peek-home.js';
|
|
9
12
|
function mapSession(r) {
|
|
10
13
|
return {
|
|
11
14
|
id: r.id,
|
|
@@ -101,17 +104,37 @@ export function getSessionDetail(db, id) {
|
|
|
101
104
|
networkErrors: getNetworkEvents(db, id),
|
|
102
105
|
};
|
|
103
106
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Delete one session by id. Child rows cascade (ON DELETE CASCADE). Also
|
|
109
|
+
* removes the per-session chunk directory under {@link rrwebEventsDir} — K.4
|
|
110
|
+
* fix (2026-05-28 QA walk): the DB cascade alone left gzipped blobs on disk
|
|
111
|
+
* forever. Returns rows removed (0 or 1). `rrwebBaseDir` defaults to
|
|
112
|
+
* `~/.peek/rrweb-events/`; tests override it with a tmpdir.
|
|
113
|
+
*/
|
|
114
|
+
export function deleteSession(db, id, rrwebBaseDir = rrwebEventsDir()) {
|
|
106
115
|
const info = db.prepare('DELETE FROM sessions WHERE id = ?').run(id);
|
|
116
|
+
if (info.changes > 0) {
|
|
117
|
+
rmSync(join(rrwebBaseDir, id), { recursive: true, force: true });
|
|
118
|
+
}
|
|
107
119
|
return info.changes;
|
|
108
120
|
}
|
|
109
121
|
/**
|
|
110
|
-
* Delete every session whose `updated_at` is strictly before the ISO cutoff
|
|
111
|
-
*
|
|
122
|
+
* Delete every session whose `updated_at` is strictly before the ISO cutoff
|
|
123
|
+
* AND the corresponding per-session chunk directories on disk. SELECT-then-
|
|
124
|
+
* DELETE wraps in a transaction so the on-disk cleanup matches what was
|
|
125
|
+
* actually removed from the DB even if a concurrent write lands between the
|
|
126
|
+
* two statements. Returns the number of sessions removed.
|
|
112
127
|
*/
|
|
113
|
-
export function deleteSessionsOlderThan(db, cutoffIso) {
|
|
114
|
-
const
|
|
115
|
-
|
|
128
|
+
export function deleteSessionsOlderThan(db, cutoffIso, rrwebBaseDir = rrwebEventsDir()) {
|
|
129
|
+
const removeIds = db.transaction((cutoff) => {
|
|
130
|
+
const rows = db.prepare('SELECT id FROM sessions WHERE updated_at < ?').all(cutoff);
|
|
131
|
+
db.prepare('DELETE FROM sessions WHERE updated_at < ?').run(cutoff);
|
|
132
|
+
return rows.map((r) => r.id);
|
|
133
|
+
});
|
|
134
|
+
const ids = removeIds(cutoffIso);
|
|
135
|
+
for (const id of ids) {
|
|
136
|
+
rmSync(join(rrwebBaseDir, id), { recursive: true, force: true });
|
|
137
|
+
}
|
|
138
|
+
return ids.length;
|
|
116
139
|
}
|
|
117
140
|
//# sourceMappingURL=db.js.map
|
package/dist/lib/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,0DAA0D;AAC1D,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,gDAAgD;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,4 +13,18 @@ export declare function validateChromeExtensionId(raw: string): string | null;
|
|
|
13
13
|
* builder de-dupes when it folds multiple IDs together).
|
|
14
14
|
*/
|
|
15
15
|
export declare function chromeExtensionOrigin(id: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* P-13 (2026-05-28 QA walk) — pull the previously-saved unpacked extension ID
|
|
18
|
+
* out of an existing native-host manifest's `allowed_origins`. Returns the
|
|
19
|
+
* first 32-char a–p ID found (origins are written in the order
|
|
20
|
+
* chromeWebStore / edgeAddons / dev, but the published-store slots ship as
|
|
21
|
+
* `PLACEHOLDER_*` strings that `allowedOrigins()` drops, so anything actually
|
|
22
|
+
* present is by definition the user's dev ID).
|
|
23
|
+
*
|
|
24
|
+
* Pure — accepts any value, returns `undefined` for non-objects, malformed
|
|
25
|
+
* arrays, missing fields, or origin strings that don't match the expected
|
|
26
|
+
* `chrome-extension://<a-p×32>/` shape. The caller's idempotency check then
|
|
27
|
+
* skips the prompt and reuses the captured ID.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractDevId(manifest: unknown): string | undefined;
|
|
16
30
|
//# sourceMappingURL=extension-id.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-id.d.ts","sourceRoot":"","sources":["../../src/lib/extension-id.ts"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
1
|
+
{"version":3,"file":"extension-id.d.ts","sourceRoot":"","sources":["../../src/lib/extension-id.ts"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAWlE"}
|
package/dist/lib/extension-id.js
CHANGED
|
@@ -46,4 +46,33 @@ export function validateChromeExtensionId(raw) {
|
|
|
46
46
|
export function chromeExtensionOrigin(id) {
|
|
47
47
|
return `chrome-extension://${id}/`;
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* P-13 (2026-05-28 QA walk) — pull the previously-saved unpacked extension ID
|
|
51
|
+
* out of an existing native-host manifest's `allowed_origins`. Returns the
|
|
52
|
+
* first 32-char a–p ID found (origins are written in the order
|
|
53
|
+
* chromeWebStore / edgeAddons / dev, but the published-store slots ship as
|
|
54
|
+
* `PLACEHOLDER_*` strings that `allowedOrigins()` drops, so anything actually
|
|
55
|
+
* present is by definition the user's dev ID).
|
|
56
|
+
*
|
|
57
|
+
* Pure — accepts any value, returns `undefined` for non-objects, malformed
|
|
58
|
+
* arrays, missing fields, or origin strings that don't match the expected
|
|
59
|
+
* `chrome-extension://<a-p×32>/` shape. The caller's idempotency check then
|
|
60
|
+
* skips the prompt and reuses the captured ID.
|
|
61
|
+
*/
|
|
62
|
+
export function extractDevId(manifest) {
|
|
63
|
+
if (manifest === null || typeof manifest !== 'object')
|
|
64
|
+
return undefined;
|
|
65
|
+
const ao = manifest.allowed_origins;
|
|
66
|
+
if (!Array.isArray(ao))
|
|
67
|
+
return undefined;
|
|
68
|
+
const pattern = /^chrome-extension:\/\/([a-p]{32})\/$/;
|
|
69
|
+
for (const origin of ao) {
|
|
70
|
+
if (typeof origin !== 'string')
|
|
71
|
+
continue;
|
|
72
|
+
const m = pattern.exec(origin);
|
|
73
|
+
if (m)
|
|
74
|
+
return m[1];
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
49
78
|
//# sourceMappingURL=extension-id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-id.js","sourceRoot":"","sources":["../../src/lib/extension-id.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,uBAAuB;AACvB,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,8EAA8E;AAC9E,iEAAiE;AACjE,6EAA6E;AAC7E,8EAA8E;AAC9E,gEAAgE;AAChE,EAAE;AACF,8DAA8D;AAC9D,sEAAsE;AACtE,6EAA6E;AAC7E,0BAA0B;AAE1B,mFAAmF;AACnF,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACtC,OAAO,mCAAmC,EAAE,CAAC,MAAM,wCAAwC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,qFAAqF,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,sBAAsB,EAAE,GAAG,CAAC;AACrC,CAAC"}
|
|
1
|
+
{"version":3,"file":"extension-id.js","sourceRoot":"","sources":["../../src/lib/extension-id.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,uBAAuB;AACvB,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,8EAA8E;AAC9E,iEAAiE;AACjE,6EAA6E;AAC7E,8EAA8E;AAC9E,gEAAgE;AAChE,EAAE;AACF,8DAA8D;AAC9D,sEAAsE;AACtE,6EAA6E;AAC7E,0BAA0B;AAE1B,mFAAmF;AACnF,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACtC,OAAO,mCAAmC,EAAE,CAAC,MAAM,wCAAwC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,qFAAqF,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,sBAAsB,EAAE,GAAG,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,QAAiB;IAC5C,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,EAAE,GAAI,QAA0C,CAAC,eAAe,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,sCAAsC,CAAC;IACvD,KAAK,MAAM,MAAM,IAAI,EAAE,EAAE,CAAC;QACxB,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACzC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SupportedPlatform } from '@peekdev/mcp/native-host';
|
|
2
|
+
/**
|
|
3
|
+
* Where the generated wrapper lives. On POSIX it ends in `.sh`; on Windows
|
|
4
|
+
* `.cmd` so the shell that Chrome's CreateProcess invocation finds knows what
|
|
5
|
+
* to execute. The wrapper lives under `~/.peek/` so it shares the same
|
|
6
|
+
* permission scope as the audit log + sessions DB.
|
|
7
|
+
*/
|
|
8
|
+
export declare function wrapperPath(peekHomeDir: string, platform: SupportedPlatform): string;
|
|
9
|
+
/**
|
|
10
|
+
* Body of the wrapper script. Pure — accepts the node binary and the host
|
|
11
|
+
* `.js` path explicitly so tests can hand it any fixture without touching
|
|
12
|
+
* `process.execPath` or `hostBinaryPath()`.
|
|
13
|
+
*
|
|
14
|
+
* POSIX: a `/bin/sh` script that `exec`s `node host.js "$@"`. `exec` replaces
|
|
15
|
+
* the shell so Chrome's process tree stays minimal (it tracks the JS process
|
|
16
|
+
* directly for stdin/stdout, not a shell wrapper that's blocking the pipe).
|
|
17
|
+
*
|
|
18
|
+
* Windows: a `.cmd` that calls node with the args via `%*`. We use
|
|
19
|
+
* Windows line endings (`\r\n`) because some legacy CMD versions choke on
|
|
20
|
+
* LF-only `.cmd` files when invoked via CreateProcess.
|
|
21
|
+
*/
|
|
22
|
+
export declare function wrapperContent(nodePath: string, hostJsPath: string, platform: SupportedPlatform): string;
|
|
23
|
+
//# sourceMappingURL=native-host-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-host-wrapper.d.ts","sourceRoot":"","sources":["../../src/lib/native-host-wrapper.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAGpF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAKR"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// P-16 (2026-05-28 QA walk) — generate a tiny shell wrapper for the native
|
|
2
|
+
// host. Chrome (and other Chromium-based browsers) spawn the manifest's `path`
|
|
3
|
+
// via the GUI launcher's `$PATH`, NOT the shell's. On macOS with both a
|
|
4
|
+
// legacy /usr/local/bin/node and a current /opt/homebrew/bin/node, the system
|
|
5
|
+
// PATH resolves `#!/usr/bin/env node` to the older binary — typically
|
|
6
|
+
// architecture-mismatched, so `better-sqlite3.node` fails dlopen and the
|
|
7
|
+
// host process exits before Chrome reads any output. Chrome silently moves on.
|
|
8
|
+
//
|
|
9
|
+
// The fix is to write a wrapper that hardcodes `process.execPath` (the node
|
|
10
|
+
// that ran `peek init`) and point the manifest at the wrapper. This is the
|
|
11
|
+
// well-trodden pattern for any Node-based native messaging host.
|
|
12
|
+
//
|
|
13
|
+
// Pure helpers — `writeNativeHostWrapper` (in commands/init.ts) does the
|
|
14
|
+
// filesystem write. Tests pin the path layout + content shape per platform.
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
/**
|
|
17
|
+
* Where the generated wrapper lives. On POSIX it ends in `.sh`; on Windows
|
|
18
|
+
* `.cmd` so the shell that Chrome's CreateProcess invocation finds knows what
|
|
19
|
+
* to execute. The wrapper lives under `~/.peek/` so it shares the same
|
|
20
|
+
* permission scope as the audit log + sessions DB.
|
|
21
|
+
*/
|
|
22
|
+
export function wrapperPath(peekHomeDir, platform) {
|
|
23
|
+
const filename = platform === 'win32' ? 'peek-mcp-host.cmd' : 'peek-mcp-host.sh';
|
|
24
|
+
return join(peekHomeDir, filename);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Body of the wrapper script. Pure — accepts the node binary and the host
|
|
28
|
+
* `.js` path explicitly so tests can hand it any fixture without touching
|
|
29
|
+
* `process.execPath` or `hostBinaryPath()`.
|
|
30
|
+
*
|
|
31
|
+
* POSIX: a `/bin/sh` script that `exec`s `node host.js "$@"`. `exec` replaces
|
|
32
|
+
* the shell so Chrome's process tree stays minimal (it tracks the JS process
|
|
33
|
+
* directly for stdin/stdout, not a shell wrapper that's blocking the pipe).
|
|
34
|
+
*
|
|
35
|
+
* Windows: a `.cmd` that calls node with the args via `%*`. We use
|
|
36
|
+
* Windows line endings (`\r\n`) because some legacy CMD versions choke on
|
|
37
|
+
* LF-only `.cmd` files when invoked via CreateProcess.
|
|
38
|
+
*/
|
|
39
|
+
export function wrapperContent(nodePath, hostJsPath, platform) {
|
|
40
|
+
if (platform === 'win32') {
|
|
41
|
+
return `@echo off\r\n"${nodePath}" "${hostJsPath}" %*\r\n`;
|
|
42
|
+
}
|
|
43
|
+
return `#!/bin/sh\nexec "${nodePath}" "${hostJsPath}" "$@"\n`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=native-host-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-host-wrapper.js","sourceRoot":"","sources":["../../src/lib/native-host-wrapper.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,iEAAiE;AACjE,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,QAA2B;IAC1E,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACjF,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,UAAkB,EAClB,QAA2B;IAE3B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,UAAU,CAAC;IAC7D,CAAC;IACD,OAAO,oBAAoB,QAAQ,MAAM,UAAU,UAAU,CAAC;AAChE,CAAC"}
|
package/dist/lib/peek-home.d.ts
CHANGED
|
@@ -2,4 +2,12 @@ import { defaultDbPath, peekHomeDir } from '@peekdev/mcp/db';
|
|
|
2
2
|
export { defaultDbPath, peekHomeDir };
|
|
3
3
|
/** Absolute path to the append-only audit log (~/.peek/audit.log, ADR-0010). */
|
|
4
4
|
export declare function auditLogPath(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Base directory for gzipped rrweb event chunks (ADR-0007): `~/.peek/rrweb-events/`.
|
|
7
|
+
* Each session has a subdirectory `<sessionId>/` with one `<seq>.json.gz` per
|
|
8
|
+
* append batch. Mirrors `rrwebEventsDir()` in peek-mcp's `mcp/event-blobs.ts`;
|
|
9
|
+
* the path layout is the public contract between writer (native host) and
|
|
10
|
+
* reader/cleaner (this CLI).
|
|
11
|
+
*/
|
|
12
|
+
export declare function rrwebEventsDir(): string;
|
|
5
13
|
//# sourceMappingURL=peek-home.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peek-home.d.ts","sourceRoot":"","sources":["../../src/lib/peek-home.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAEtC,gFAAgF;AAChF,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
1
|
+
{"version":3,"file":"peek-home.d.ts","sourceRoot":"","sources":["../../src/lib/peek-home.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAEtC,gFAAgF;AAChF,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
package/dist/lib/peek-home.js
CHANGED
|
@@ -8,4 +8,14 @@ export { defaultDbPath, peekHomeDir };
|
|
|
8
8
|
export function auditLogPath() {
|
|
9
9
|
return join(peekHomeDir(), 'audit.log');
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Base directory for gzipped rrweb event chunks (ADR-0007): `~/.peek/rrweb-events/`.
|
|
13
|
+
* Each session has a subdirectory `<sessionId>/` with one `<seq>.json.gz` per
|
|
14
|
+
* append batch. Mirrors `rrwebEventsDir()` in peek-mcp's `mcp/event-blobs.ts`;
|
|
15
|
+
* the path layout is the public contract between writer (native host) and
|
|
16
|
+
* reader/cleaner (this CLI).
|
|
17
|
+
*/
|
|
18
|
+
export function rrwebEventsDir() {
|
|
19
|
+
return join(peekHomeDir(), 'rrweb-events');
|
|
20
|
+
}
|
|
11
21
|
//# sourceMappingURL=peek-home.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peek-home.js","sourceRoot":"","sources":["../../src/lib/peek-home.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,wDAAwD;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAEtC,gFAAgF;AAChF,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC"}
|
|
1
|
+
{"version":3,"file":"peek-home.js","sourceRoot":"","sources":["../../src/lib/peek-home.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,wDAAwD;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAEtC,gFAAgF;AAChF,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peekdev/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.5",
|
|
4
4
|
"description": "peek command-line tool. A thin read-mostly client of the native host's ~/.peek/sessions.db (ADR-0007): status, sessions list/show/export/delete, the `peek init` MCP-client wizard, and `peek audit log`.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|