@peekdev/cli 0.1.0-alpha.4 → 0.1.0-alpha.6
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 +20 -2
- 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/format/json.d.ts +26 -1
- package/dist/lib/format/json.d.ts.map +1 -1
- package/dist/lib/format/json.js +39 -2
- package/dist/lib/format/json.js.map +1 -1
- package/dist/lib/format/markdown.d.ts.map +1 -1
- package/dist/lib/format/markdown.js +17 -0
- package/dist/lib/format/markdown.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
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. */
|
|
@@ -205,7 +207,23 @@ async function registerNativeHost(platform, homeDir) {
|
|
|
205
207
|
process.stdout.write('No browsers selected; skipping native-host registration.\n');
|
|
206
208
|
return;
|
|
207
209
|
}
|
|
208
|
-
|
|
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);
|
|
209
227
|
const results = installManifests([...chosen], manifest, { sink: realSink });
|
|
210
228
|
for (const r of results) {
|
|
211
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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"}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import type { SessionDetail } from '../db.js';
|
|
2
|
+
/** Static attribution block shape — never references session data. */
|
|
3
|
+
export interface AttributionBlock {
|
|
4
|
+
readonly tool: 'peek';
|
|
5
|
+
readonly url: string;
|
|
6
|
+
readonly description: string;
|
|
7
|
+
readonly version: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build the self-marketing attribution block (Phase 5 indirect virality).
|
|
11
|
+
*
|
|
12
|
+
* The URL links to `packages/peek-mcp` because the install command
|
|
13
|
+
* (`npm i @peekdev/mcp` / `peek init`) is the marketing artifact per the
|
|
14
|
+
* research — not the docs site, not a landing page. The UTM medium is
|
|
15
|
+
* format-specific so we can attribute which export shape drives the most
|
|
16
|
+
* click-through (JSON vs Markdown vs future formats).
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildAttribution(medium: 'json-attribution' | 'markdown-attribution'): AttributionBlock;
|
|
2
19
|
/** The JSON export envelope. Field names mirror the MCP tool return shapes. */
|
|
3
20
|
export interface SessionJsonExport {
|
|
4
21
|
readonly id: string;
|
|
@@ -30,6 +47,14 @@ export interface SessionJsonExport {
|
|
|
30
47
|
}
|
|
31
48
|
/** Build the JSON export object (pure; not yet stringified). */
|
|
32
49
|
export declare function toJsonExport(detail: SessionDetail): SessionJsonExport;
|
|
33
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Render a session as a pretty-printed JSON string (2-space indent).
|
|
52
|
+
*
|
|
53
|
+
* `_attribution` is inserted FIRST in the object literal so it appears at the
|
|
54
|
+
* top of the serialized output — `JSON.stringify` preserves insertion order
|
|
55
|
+
* per the ECMA-262 spec for string keys (own enumerable string properties are
|
|
56
|
+
* visited in insertion order). The `_` prefix is the JSON convention for
|
|
57
|
+
* "metadata, not data" — discoverable but not part of the session payload.
|
|
58
|
+
*/
|
|
34
59
|
export declare function formatSessionJson(detail: SessionDetail): string;
|
|
35
60
|
//# sourceMappingURL=json.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/lib/format/json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/lib/format/json.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,GAAG,sBAAsB,GAClD,gBAAgB,CAQlB;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;QACpC,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC,CAAC;IACH,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;QACpC,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CA8BrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAM/D"}
|
package/dist/lib/format/json.js
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
// (P2 PRD §C.3 "same schema as MCP tool returns", §B3) so an AI consumer can
|
|
3
3
|
// treat a CLI export and an MCP `get_session_*` response interchangeably. Pure:
|
|
4
4
|
// SessionDetail in, JSON string out.
|
|
5
|
+
//
|
|
6
|
+
// Phase 5 self-marketing: every export carries a top-level `_attribution` block
|
|
7
|
+
// (underscore-prefixed per JSON convention for "metadata not data") so a JSON
|
|
8
|
+
// export shared in a PR or attached to a JIRA ticket is a tracked acquisition
|
|
9
|
+
// channel — the Loom / Calendly / Statuspage indirect-virality pattern. The
|
|
10
|
+
// block contains only static strings + the CLI version; no session content
|
|
11
|
+
// leaks in.
|
|
12
|
+
import { CLI_VERSION } from '../../version.js';
|
|
13
|
+
/**
|
|
14
|
+
* Build the self-marketing attribution block (Phase 5 indirect virality).
|
|
15
|
+
*
|
|
16
|
+
* The URL links to `packages/peek-mcp` because the install command
|
|
17
|
+
* (`npm i @peekdev/mcp` / `peek init`) is the marketing artifact per the
|
|
18
|
+
* research — not the docs site, not a landing page. The UTM medium is
|
|
19
|
+
* format-specific so we can attribute which export shape drives the most
|
|
20
|
+
* click-through (JSON vs Markdown vs future formats).
|
|
21
|
+
*/
|
|
22
|
+
export function buildAttribution(medium) {
|
|
23
|
+
return {
|
|
24
|
+
tool: 'peek',
|
|
25
|
+
url: `https://github.com/Cubenest/rrweb-stack/tree/main/packages/peek-mcp?utm_source=peek-export&utm_medium=${medium}&utm_campaign=indirect-virality`,
|
|
26
|
+
description: 'Captured with peek — your real browser, exposed to your AI coding agent over MCP. Capture once, query forever, never leaves your machine.',
|
|
27
|
+
version: CLI_VERSION,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
5
30
|
/** Build the JSON export object (pure; not yet stringified). */
|
|
6
31
|
export function toJsonExport(detail) {
|
|
7
32
|
const { session, counts, consoleErrors, networkErrors } = detail;
|
|
@@ -34,8 +59,20 @@ export function toJsonExport(detail) {
|
|
|
34
59
|
})),
|
|
35
60
|
};
|
|
36
61
|
}
|
|
37
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* Render a session as a pretty-printed JSON string (2-space indent).
|
|
64
|
+
*
|
|
65
|
+
* `_attribution` is inserted FIRST in the object literal so it appears at the
|
|
66
|
+
* top of the serialized output — `JSON.stringify` preserves insertion order
|
|
67
|
+
* per the ECMA-262 spec for string keys (own enumerable string properties are
|
|
68
|
+
* visited in insertion order). The `_` prefix is the JSON convention for
|
|
69
|
+
* "metadata, not data" — discoverable but not part of the session payload.
|
|
70
|
+
*/
|
|
38
71
|
export function formatSessionJson(detail) {
|
|
39
|
-
|
|
72
|
+
const envelope = {
|
|
73
|
+
_attribution: buildAttribution('json-attribution'),
|
|
74
|
+
session: toJsonExport(detail),
|
|
75
|
+
};
|
|
76
|
+
return `${JSON.stringify(envelope, null, 2)}\n`;
|
|
40
77
|
}
|
|
41
78
|
//# sourceMappingURL=json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/lib/format/json.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,qCAAqC;
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/lib/format/json.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,qCAAqC;AACrC,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,YAAY;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAW/C;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAmD;IAEnD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,yGAAyG,MAAM,iCAAiC;QACrJ,WAAW,EACT,2IAA2I;QAC7I,OAAO,EAAE,WAAW;KACrB,CAAC;AACJ,CAAC;AAgCD,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IACjE,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;QACvD,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,QAAQ,GAAG;QACf,YAAY,EAAE,gBAAgB,CAAC,kBAAkB,CAAC;QAClD,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC;KAC9B,CAAC;IACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/lib/format/markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/lib/format/markdown.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAoC,aAAa,EAAE,MAAM,UAAU,CAAC;AAiChF,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAuDnE"}
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
// `generate_playwright_repro` tools (Phase 3c). The CLI markdown export reads
|
|
13
13
|
// only the extracted SQL rows, so it states where the richer data lives rather
|
|
14
14
|
// than fabricating it.
|
|
15
|
+
//
|
|
16
|
+
// Phase 5 self-marketing: the export ends with an `---` rule + an attribution
|
|
17
|
+
// blockquote so every Markdown export shared in a PR or attached to a ticket
|
|
18
|
+
// is a tracked acquisition channel (UTM-tagged link to peek-mcp's install
|
|
19
|
+
// path on GitHub — the install command IS the marketing artifact per the
|
|
20
|
+
// indirect-virality research). The attribution is static — no session data.
|
|
21
|
+
import { buildAttribution } from './json.js';
|
|
15
22
|
function isoFromMs(tsMs) {
|
|
16
23
|
return new Date(tsMs).toISOString();
|
|
17
24
|
}
|
|
@@ -71,6 +78,16 @@ export function formatSessionMarkdown(detail) {
|
|
|
71
78
|
lines.push('## Suggested reproduction');
|
|
72
79
|
lines.push(`Generate a Playwright repro with \`peek sessions export ${session.id} --format playwright\`, or the MCP \`generate_playwright_repro\` tool.`);
|
|
73
80
|
lines.push('');
|
|
81
|
+
// Self-marketing attribution (Phase 5 indirect virality). Horizontal-rule
|
|
82
|
+
// separates it from the export body; blockquote keeps it visually distinct
|
|
83
|
+
// (won't be mistaken for a user-action line by an AI paste consumer). The
|
|
84
|
+
// link target is the install path on GitHub — that's where the reader
|
|
85
|
+
// sees `npm i @peekdev/mcp`.
|
|
86
|
+
const attribution = buildAttribution('markdown-attribution');
|
|
87
|
+
lines.push('---');
|
|
88
|
+
lines.push('');
|
|
89
|
+
lines.push(`> _Captured with [peek](${attribution.url}) — your real browser, exposed to your AI coding agent over MCP._`);
|
|
90
|
+
lines.push('');
|
|
74
91
|
return lines.join('\n');
|
|
75
92
|
}
|
|
76
93
|
//# sourceMappingURL=markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/lib/format/markdown.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4DAA4D;AAC5D,YAAY;AACZ,sBAAsB;AACtB,uBAAuB;AACvB,iCAAiC;AACjC,8BAA8B;AAC9B,+CAA+C;AAC/C,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,8EAA8E;AAC9E,+EAA+E;AAC/E,uBAAuB;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/lib/format/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.6",
|
|
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",
|