@peekdev/cli 0.1.0-alpha.2 → 0.1.0-alpha.20
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 +124 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +10 -0
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +154 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +129 -11
- package/dist/commands/sessions.js.map +1 -1
- package/dist/lib/claude-skill.d.ts +54 -0
- package/dist/lib/claude-skill.d.ts.map +1 -0
- package/dist/lib/claude-skill.js +88 -0
- package/dist/lib/claude-skill.js.map +1 -0
- package/dist/lib/db.d.ts +46 -5
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +78 -7
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/extension-id.d.ts +30 -0
- package/dist/lib/extension-id.d.ts.map +1 -0
- package/dist/lib/extension-id.js +78 -0
- package/dist/lib/extension-id.js.map +1 -0
- package/dist/lib/format/index.d.ts +11 -1
- package/dist/lib/format/index.d.ts.map +1 -1
- package/dist/lib/format/index.js +23 -22
- package/dist/lib/format/index.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/format/playwright.d.ts +13 -0
- package/dist/lib/format/playwright.d.ts.map +1 -0
- package/dist/lib/format/playwright.js +37 -0
- package/dist/lib/format/playwright.js.map +1 -0
- package/dist/lib/init-config.d.ts +12 -2
- package/dist/lib/init-config.d.ts.map +1 -1
- package/dist/lib/init-config.js +1 -1
- package/dist/lib/init-config.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/dist/lib/prompt.d.ts +13 -0
- package/dist/lib/prompt.d.ts.map +1 -1
- package/dist/lib/prompt.js +40 -0
- package/dist/lib/prompt.js.map +1 -1
- package/dist/skills/peek-skill.md +182 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +14 -5
- package/dist/version.js.map +1 -1
- package/package.json +24 -4
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<img src="https://raw.githubusercontent.com/Cubenest/rrweb-stack/main/assets/brand/sub-peek.svg" height="40" alt="peek">
|
|
2
|
+
|
|
3
|
+
# @peekdev/cli
|
|
4
|
+
|
|
5
|
+
> Your real browser, exposed to your AI coding agent over MCP — capture once, query forever, never leaves your machine.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@peekdev/cli)
|
|
8
|
+
[](https://www.npmjs.com/package/@peekdev/cli)
|
|
9
|
+
[](https://github.com/Cubenest/rrweb-stack/blob/main/LICENSE)
|
|
10
|
+
[](https://github.com/Cubenest/rrweb-stack/actions/workflows/ci.yml)
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
Docs: <https://peek.cubenest.in>
|
|
15
|
+
|
|
16
|
+
> **Requires Node.js ≥ 22.** peek's native `better-sqlite3` dependency only ships
|
|
17
|
+
> prebuilt binaries for Node 22+ — on Node 20 (notably Windows, which has no
|
|
18
|
+
> C/C++ toolchain by default) the install falls back to compiling from source and
|
|
19
|
+
> fails. Use Node 22 or newer.
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm install -g @peekdev/cli
|
|
23
|
+
peek init
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`peek init` is an interactive wizard. It:
|
|
27
|
+
|
|
28
|
+
1. Installs the native messaging host for the **Peek** Chrome extension (writes `~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.peekdev.peek.json` on macOS, equivalent on Linux + Windows).
|
|
29
|
+
2. Detects your AI coding-agent client (Claude Code, Cursor, Cline, Windsurf, Continue, Zed) and adds the `peek-mcp` server to its MCP configuration.
|
|
30
|
+
3. Prints a one-line "install the extension" link.
|
|
31
|
+
|
|
32
|
+
Then you install the [Peek Chrome extension](https://chromewebstore.google.com/) (CWS submission pending), open the side panel on the site you want to capture, and click **Enable on this site**. Your AI agent can now query the recording.
|
|
33
|
+
|
|
34
|
+
## What this is NOT
|
|
35
|
+
|
|
36
|
+
- Not a session-replay product for production traffic. Peek is a **developer-side** tool — captures happen on your machine, in your browser, when you explicitly enable them per site.
|
|
37
|
+
- Not Sentry, LogRocket, or FullStory. There is no cloud, no upload, no telemetry, no signup. Captures live in `~/.peek/sessions.db` until you delete them.
|
|
38
|
+
- Not a screen recorder. Peek captures structured DOM/console/network via rrweb, not pixels. AI agents query JSON, not video frames.
|
|
39
|
+
|
|
40
|
+
## Commands
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
peek init # interactive install (see above)
|
|
44
|
+
peek status # health check — extension connected? DB writable?
|
|
45
|
+
peek sessions list [--json] # list recent recording sessions
|
|
46
|
+
peek sessions show <id> # show one session's metadata + counts
|
|
47
|
+
peek sessions export <id> --format <html|json|playwright> # export for sharing
|
|
48
|
+
peek sessions delete <id> # delete one session + its on-disk events
|
|
49
|
+
peek audit [--json] # show the destructive-action audit log
|
|
50
|
+
peek <cmd> --help # usage for any subcommand
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
All commands operate read-only on `~/.peek/sessions.db` except `sessions delete` (and `peek init` which writes the install config). Nothing leaves your machine.
|
|
54
|
+
|
|
55
|
+
## Querying from an AI agent
|
|
56
|
+
|
|
57
|
+
After `peek init`, the `peek-mcp` server is available to your AI client as an MCP toolset. Sample queries:
|
|
58
|
+
|
|
59
|
+
- "what's in my latest peek session?"
|
|
60
|
+
- "show me the console errors from session `abc123` between t=10s and t=15s"
|
|
61
|
+
- "find network requests with status >= 400 from the last 5 minutes of recording on `example.com`"
|
|
62
|
+
- "generate a Playwright reproduction script from session `abc123`"
|
|
63
|
+
|
|
64
|
+
The MCP server exposes 10 tools — listing, session summaries, console/network drill-down, user-action history, DOM reconstruction and history, Playwright-repro generation, and (with explicit per-action authorization) actions like clicks/inputs/navigation. See [`@peekdev/mcp`](https://github.com/Cubenest/rrweb-stack/tree/main/packages/peek-mcp) for the tool reference.
|
|
65
|
+
|
|
66
|
+
## Privacy
|
|
67
|
+
|
|
68
|
+
Peek is **local-first**. The CLI reads from `~/.peek/sessions.db` (SQLite); the extension records into it; the MCP server queries it. There is no network destination. There is no telemetry. There is no auto-update channel. The native host runs as your user, not as a daemon.
|
|
69
|
+
|
|
70
|
+
The extension uses per-origin host permissions — recording is **off** for every site by default. You enable it explicitly from the side panel for each origin you care about. The five-level permission model (0 Off → 1 Read-only → 2 Suggest-only → 3 Act-with-confirm → 4 YOLO), plus a cross-level destructive-action blocklist that always prompts, is enforced server-side, not just in the UI.
|
|
71
|
+
|
|
72
|
+
Full data-handling policy: [`docs/peek/PRIVACY_POLICY.md`](https://github.com/Cubenest/rrweb-stack/blob/main/docs/peek/PRIVACY_POLICY.md). Chrome Web Store permission justifications: [`docs/peek/PERMISSION_JUSTIFICATION.md`](https://github.com/Cubenest/rrweb-stack/blob/main/docs/peek/PERMISSION_JUSTIFICATION.md).
|
|
73
|
+
|
|
74
|
+
## Supported AI clients
|
|
75
|
+
|
|
76
|
+
`peek init` configures the MCP server into:
|
|
77
|
+
|
|
78
|
+
| Client | Detection |
|
|
79
|
+
|---|---|
|
|
80
|
+
| Claude Code (CLI) | `~/.claude/` |
|
|
81
|
+
| Cursor | `~/Library/Application Support/Cursor/User/` (macOS) |
|
|
82
|
+
| Cline (VS Code) | VS Code workspace settings |
|
|
83
|
+
| Continue (VS Code) | `~/.continue/` |
|
|
84
|
+
| Windsurf | `~/.codeium/windsurf/` |
|
|
85
|
+
| Zed | `~/.config/zed/` |
|
|
86
|
+
|
|
87
|
+
If your client isn't auto-detected, `peek init` prints the JSON config you can paste manually. The MCP server speaks the standard stdio protocol (spec 2025-11-25 + 2025-03-26 back-compat).
|
|
88
|
+
|
|
89
|
+
### Claude Code skill
|
|
90
|
+
|
|
91
|
+
When Claude Code is among the configured clients (or `~/.claude.json` already exists), `peek init` also drops a SKILL.md into `~/.claude/skills/peek/`. Claude Code loads it on session start and uses it to decide *when* to reach for peek's MCP tools — investigating an error from a manual repro, generating a Playwright test from a session, querying DOM state at a past moment, etc.
|
|
92
|
+
|
|
93
|
+
The skill is idempotent on re-run (no-op when the on-disk content matches the bundled source). Skip the install with `peek init --skip-skill`. Want it without running `peek init`? See the curl-able recipe at [`docs/peek/distribution/claude-code-skill.md`](https://github.com/Cubenest/rrweb-stack/blob/main/docs/peek/distribution/claude-code-skill.md).
|
|
94
|
+
|
|
95
|
+
### Cursor — project-level recipe
|
|
96
|
+
|
|
97
|
+
`peek init` writes Cursor's MCP server entry to the global config at `~/.cursor/mcp.json` — every project opened in Cursor inherits it. If you'd rather scope peek to one project (a repo where peek captures matter but other repos on the same machine should not surface the tools), drop a `.cursor/mcp.json` into the workspace root:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"mcpServers": {
|
|
102
|
+
"peek": {
|
|
103
|
+
"command": "npx",
|
|
104
|
+
"args": ["-y", "@peekdev/mcp@latest"]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Commit it or add it to `.gitignore` — Cursor reads either. Cursor's docs document the global file as "tools available everywhere" and the project file as "project-specific tools" (see [docs.cursor.com/context/mcp](https://cursor.com/docs/context/mcp) for current merge semantics).
|
|
111
|
+
|
|
112
|
+
This is the same block `peek init` writes to the global file, so the two configs are interchangeable. You still need the [Peek Chrome extension](https://chromewebstore.google.com/) installed and the native messaging host registered — run `peek init --skip-clients` if you want the host installed without touching any MCP config.
|
|
113
|
+
|
|
114
|
+
## Versioning & compatibility
|
|
115
|
+
|
|
116
|
+
Semantic Versioning. Currently `0.1.0-alpha.x` — pre-release; the CLI surface is stable in spirit but flags may rename. See [SUPPORTED.md](https://github.com/Cubenest/rrweb-stack/blob/main/SUPPORTED.md) for the compatibility matrix.
|
|
117
|
+
|
|
118
|
+
`@peekdev/cli` depends on `@peekdev/mcp` as a workspace peer. Both are versioned and published together via Changesets + OIDC Trusted Publishing.
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
Apache 2.0. The bundled rrweb engine remains MIT-licensed; see `NOTICE`.
|
|
123
|
+
|
|
124
|
+
Contributions are accepted under the [Developer Certificate of Origin (DCO)](https://developercertificate.org/) — sign your commits with `git commit -s`. See [CONTRIBUTING.md](https://github.com/Cubenest/rrweb-stack/blob/main/CONTRIBUTING.md) + [SECURITY.md](https://github.com/Cubenest/rrweb-stack/blob/main/SECURITY.md).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AA+CA,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAsE/C"}
|
package/dist/commands/audit.js
CHANGED
|
@@ -16,6 +16,7 @@ function printUsage() {
|
|
|
16
16
|
' --tool <name> Filter by tool (e.g. execute_action)',
|
|
17
17
|
' --client <name> Filter by MCP client (e.g. cursor, claude-code)',
|
|
18
18
|
' --json Emit matching entries as JSON instead of a table',
|
|
19
|
+
' --help Show this help and exit',
|
|
19
20
|
'',
|
|
20
21
|
].join('\n'));
|
|
21
22
|
}
|
|
@@ -44,6 +45,10 @@ export function runAudit(argv) {
|
|
|
44
45
|
process.stderr.write(`peek audit: unknown subcommand '${sub}' (did you mean 'log'?)\n`);
|
|
45
46
|
return 1;
|
|
46
47
|
}
|
|
48
|
+
// P-18 (alpha.7): declare `--help` as a known option so passing it doesn't
|
|
49
|
+
// crash parseArgs with `TypeError: Unknown option`. Short-circuit to usage
|
|
50
|
+
// BEFORE any DB / log read so `peek audit log --help` always works even on
|
|
51
|
+
// a broken install.
|
|
47
52
|
const { values } = parseArgs({
|
|
48
53
|
args: argv.slice(1),
|
|
49
54
|
options: {
|
|
@@ -51,9 +56,14 @@ export function runAudit(argv) {
|
|
|
51
56
|
tool: { type: 'string' },
|
|
52
57
|
client: { type: 'string' },
|
|
53
58
|
json: { type: 'boolean' },
|
|
59
|
+
help: { type: 'boolean' },
|
|
54
60
|
},
|
|
55
61
|
allowPositionals: false,
|
|
56
62
|
});
|
|
63
|
+
if (values.help) {
|
|
64
|
+
printUsage();
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
57
67
|
const filter = {
|
|
58
68
|
...(values.tool !== undefined ? { tool: values.tool } : {}),
|
|
59
69
|
...(values.client !== undefined ? { client: values.client } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,kCAAkC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAGL,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,iCAAiC;QACjC,EAAE;QACF,UAAU;QACV,8DAA8D;QAC9D,0DAA0D;QAC1D,qEAAqE;QACrE,sEAAsE;QACtE,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAa;IAChC,MAAM,KAAK,GAAG;QACZ,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,IAAI,IAAI,WAAW;QACrB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QACpC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QACpC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5E,UAAU,EAAE,CAAC;YACb,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,2BAA2B,CAAC,CAAC;QACxF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnB,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC1B;QACD,gBAAgB,EAAE,KAAK;KACxB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAsWA,+DAA+D;AAC/D,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC7D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,13 +5,18 @@
|
|
|
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
|
+
import { join } from 'node:path';
|
|
10
11
|
import { parseArgs } from 'node:util';
|
|
11
12
|
import { buildManifest, hostBinaryPath, installManifests, loadExtensionIds, realSink, resolveInstallTargets, } from '@peekdev/mcp/native-host';
|
|
13
|
+
import { installSkill } from '../lib/claude-skill.js';
|
|
14
|
+
import { chromeExtensionOrigin, extractDevId, validateChromeExtensionId, } from '../lib/extension-id.js';
|
|
12
15
|
import { atomicWriteFileSync } from '../lib/fs-atomic.js';
|
|
13
16
|
import { PEEK_BLOCK_SNIPPET, containsJsonComments, detectClients, hasPeekServer, mergePeekConfig, serializeConfig, } from '../lib/init-config.js';
|
|
14
|
-
import {
|
|
17
|
+
import { wrapperContent, wrapperPath } from '../lib/native-host-wrapper.js';
|
|
18
|
+
import { peekHomeDir } from '../lib/peek-home.js';
|
|
19
|
+
import { confirm, multiSelect, promptText } from '../lib/prompt.js';
|
|
15
20
|
const SUPPORTED = ['darwin', 'linux', 'win32'];
|
|
16
21
|
/** Thrown by `readConfig` when the file is JSONC (comments) — we won't rewrite it. */
|
|
17
22
|
class JsoncConfigError extends Error {
|
|
@@ -72,7 +77,7 @@ async function configureClients(homeDir, cwd) {
|
|
|
72
77
|
})));
|
|
73
78
|
if (chosen.length === 0) {
|
|
74
79
|
process.stdout.write('No clients selected; skipping MCP config.\n');
|
|
75
|
-
return;
|
|
80
|
+
return [];
|
|
76
81
|
}
|
|
77
82
|
for (const client of chosen) {
|
|
78
83
|
const already = (() => {
|
|
@@ -103,6 +108,82 @@ async function configureClients(homeDir, cwd) {
|
|
|
103
108
|
process.stdout.write(` ✗ ${client.label}: ${client.configPath} — ${res.error}\n`);
|
|
104
109
|
}
|
|
105
110
|
}
|
|
111
|
+
return chosen;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Drop the peek Claude Code Skill (SKILL.md) into `~/.claude/skills/peek/`.
|
|
115
|
+
*
|
|
116
|
+
* The skill guides Claude Code on when to reach for peek's MCP tools — it's
|
|
117
|
+
* complementary to the `mcpServers.peek` block written by configureClients
|
|
118
|
+
* (the latter exposes the tools; the skill teaches Claude when to use them).
|
|
119
|
+
*
|
|
120
|
+
* Runs when Claude Code is among the just-configured clients OR already has
|
|
121
|
+
* `~/.claude.json` (i.e. the user has Claude Code installed regardless of
|
|
122
|
+
* whether they re-selected it in this run). Skipped via `--skip-skill`.
|
|
123
|
+
*
|
|
124
|
+
* Idempotent: re-running over an identical file is a no-op.
|
|
125
|
+
*/
|
|
126
|
+
function installClaudeSkill(homeDir, chosenClients) {
|
|
127
|
+
const claudeChosen = chosenClients.some((c) => c.id === 'claude-code');
|
|
128
|
+
const claudeConfigExists = existsSync(join(homeDir, '.claude.json'));
|
|
129
|
+
if (!claudeChosen && !claudeConfigExists) {
|
|
130
|
+
// No Claude Code on this machine + the user didn't ask to configure it.
|
|
131
|
+
// Don't write a skill for a tool they don't have.
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const result = installSkill(homeDir, {
|
|
135
|
+
fileExists: existsSync,
|
|
136
|
+
readFile: (p) => readFileSync(p, 'utf8'),
|
|
137
|
+
mkdir: (p) => mkdirSync(p, { recursive: true }),
|
|
138
|
+
writeFile: (p, c) => atomicWriteFileSync(p, c),
|
|
139
|
+
});
|
|
140
|
+
switch (result.status) {
|
|
141
|
+
case 'wrote':
|
|
142
|
+
process.stdout.write(` ✔ Wrote Claude Code skill: ${result.target}\n`);
|
|
143
|
+
break;
|
|
144
|
+
case 'updated':
|
|
145
|
+
process.stdout.write(` ✔ Refreshed Claude Code skill: ${result.target}\n`);
|
|
146
|
+
break;
|
|
147
|
+
case 'unchanged':
|
|
148
|
+
process.stdout.write(` · Claude Code skill already current: ${result.target}\n`);
|
|
149
|
+
break;
|
|
150
|
+
case 'source_missing':
|
|
151
|
+
// Should never happen in a published tarball — postbuild copies it in.
|
|
152
|
+
// If it does (e.g. broken local dev environment), say so but don't fail.
|
|
153
|
+
process.stdout.write(` ! Claude Code skill source missing at ${result.source}; skipped. (Reinstall @peekdev/cli.)\n`);
|
|
154
|
+
break;
|
|
155
|
+
case 'error':
|
|
156
|
+
process.stdout.write(` ✗ Claude Code skill: ${result.target} — ${result.error}\n`);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* P-13 (2026-05-28 QA walk): read the first existing native-host manifest from
|
|
162
|
+
* the candidate targets so a re-run of `peek init` can offer to reuse the
|
|
163
|
+
* previously-captured dev extension ID. Returns the parsed JSON (or
|
|
164
|
+
* `undefined` if no target had a readable manifest); the caller passes the
|
|
165
|
+
* result to `extractDevId` and decides what to do.
|
|
166
|
+
*
|
|
167
|
+
* Windows targets have `registryKey` instead of `manifestPath`; reading the
|
|
168
|
+
* registry would need a `reg.exe query` shell-out — out of scope here. The
|
|
169
|
+
* common case (darwin/linux) is plain JSON on disk; on win32 we fall through
|
|
170
|
+
* to a fresh prompt, which is acceptable.
|
|
171
|
+
*/
|
|
172
|
+
function readExistingManifest(targets) {
|
|
173
|
+
for (const target of targets) {
|
|
174
|
+
const path = target.manifestPath;
|
|
175
|
+
if (!path)
|
|
176
|
+
continue;
|
|
177
|
+
if (!existsSync(path))
|
|
178
|
+
continue;
|
|
179
|
+
try {
|
|
180
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Try the next target on parse failure (truncated/corrupt manifest).
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
106
187
|
}
|
|
107
188
|
async function registerNativeHost(platform, homeDir) {
|
|
108
189
|
const proceed = await confirm('\nRegister the native messaging host now? (writes a manifest into your browser dirs, with your consent)', true);
|
|
@@ -118,7 +199,54 @@ async function registerNativeHost(platform, homeDir) {
|
|
|
118
199
|
process.stdout.write(`Could not load extension IDs (${err instanceof Error ? err.message : String(err)}); skipping native-host registration.\n`);
|
|
119
200
|
return;
|
|
120
201
|
}
|
|
202
|
+
// P-10 (2026-05-28 QA walk): the shipped extension-ids.json carries
|
|
203
|
+
// `PLACEHOLDER_*` strings for every slot until the extension is in the
|
|
204
|
+
// Chrome Web Store / Edge Add-ons, and `allowedOrigins()` (correctly) drops
|
|
205
|
+
// those. With nothing else to fill in, the written manifest ends up with
|
|
206
|
+
// `"allowed_origins": []` and Chrome silently blocks
|
|
207
|
+
// `chrome.runtime.connectNative()` — zero sessions ever reach the host.
|
|
208
|
+
//
|
|
209
|
+
// The fix: prompt for the locally-loaded extension's ID (the per-machine
|
|
210
|
+
// 32-char a–p string Chrome assigns to an unpacked extension), validate
|
|
211
|
+
// its shape, and override extensionIds.dev with the captured value before
|
|
212
|
+
// building the manifest. An empty submission is OK — only sensible for a
|
|
213
|
+
// user loading the published CWS build, where the chromeWebStore slot is
|
|
214
|
+
// populated and the `dev` placeholder doesn't matter.
|
|
215
|
+
//
|
|
216
|
+
// P-13 (2026-05-28 QA walk): on re-runs, read the existing manifest's
|
|
217
|
+
// `allowed_origins` and offer to reuse any previously-captured dev ID
|
|
218
|
+
// instead of re-prompting from scratch. Confirms B.4 idempotency.
|
|
121
219
|
const allTargets = resolveInstallTargets(platform, homeDir);
|
|
220
|
+
const existingDevId = extractDevId(readExistingManifest(allTargets));
|
|
221
|
+
let captured;
|
|
222
|
+
if (existingDevId) {
|
|
223
|
+
const reuse = await confirm(`\nFound previously-saved extension ID: ${existingDevId}\nReuse this ID?`, true);
|
|
224
|
+
if (reuse) {
|
|
225
|
+
captured = existingDevId;
|
|
226
|
+
process.stdout.write(`Reusing: ${chromeExtensionOrigin(existingDevId)}\n`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (captured === undefined) {
|
|
230
|
+
process.stdout.write([
|
|
231
|
+
'',
|
|
232
|
+
'Paste your unpacked extension ID (from chrome://extensions/, Developer mode toggle ON).',
|
|
233
|
+
"Leave empty to skip — only do this if you're loading the published CWS build.",
|
|
234
|
+
'',
|
|
235
|
+
].join('\n'));
|
|
236
|
+
captured = await promptText('Extension ID: ', {
|
|
237
|
+
validate: validateChromeExtensionId,
|
|
238
|
+
allowEmpty: true,
|
|
239
|
+
});
|
|
240
|
+
if (captured) {
|
|
241
|
+
process.stdout.write(`allowed_origins includes: ${chromeExtensionOrigin(captured)}\n`);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
process.stdout.write('No extension ID provided — `allowed_origins` will only include published IDs (if any).\n');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (captured) {
|
|
248
|
+
extensionIds = { ...extensionIds, dev: captured };
|
|
249
|
+
}
|
|
122
250
|
const chosen = await multiSelect('Register native messaging host for:', allTargets.map((t) => ({
|
|
123
251
|
value: t,
|
|
124
252
|
label: t.browser,
|
|
@@ -129,7 +257,23 @@ async function registerNativeHost(platform, homeDir) {
|
|
|
129
257
|
process.stdout.write('No browsers selected; skipping native-host registration.\n');
|
|
130
258
|
return;
|
|
131
259
|
}
|
|
132
|
-
|
|
260
|
+
// P-16 (2026-05-28 QA walk): write a tiny shell wrapper at ~/.peek/ that
|
|
261
|
+
// hardcodes `process.execPath`, then point the manifest at the wrapper
|
|
262
|
+
// instead of the raw .js. Chrome spawns the manifest's `path` via the GUI
|
|
263
|
+
// launcher's $PATH, NOT the shell's — on macOS with both a legacy
|
|
264
|
+
// /usr/local/bin/node (v14, x86_64) and a current /opt/homebrew/bin/node
|
|
265
|
+
// (arm64), the system PATH resolves `#!/usr/bin/env node` to the older
|
|
266
|
+
// binary and `better-sqlite3.node` dlopen-fails with an architecture
|
|
267
|
+
// mismatch, crashing the host before Chrome reads any output. The wrapper
|
|
268
|
+
// is the standard fix for Node-based native messaging hosts.
|
|
269
|
+
const home = peekHomeDir();
|
|
270
|
+
mkdirSync(home, { recursive: true });
|
|
271
|
+
const wrapper = wrapperPath(home, platform);
|
|
272
|
+
writeFileSync(wrapper, wrapperContent(process.execPath, hostBinaryPath(), platform), {
|
|
273
|
+
mode: 0o755,
|
|
274
|
+
});
|
|
275
|
+
process.stdout.write(` ✔ Wrote native-host wrapper: ${wrapper}\n`);
|
|
276
|
+
const manifest = buildManifest(wrapper, extensionIds);
|
|
133
277
|
const results = installManifests([...chosen], manifest, { sink: realSink });
|
|
134
278
|
for (const r of results) {
|
|
135
279
|
const where = r.manifestPath ?? r.registryKey ?? '(unknown)';
|
|
@@ -156,6 +300,7 @@ export async function runInit(argv) {
|
|
|
156
300
|
options: {
|
|
157
301
|
'skip-native-host': { type: 'boolean' },
|
|
158
302
|
'skip-clients': { type: 'boolean' },
|
|
303
|
+
'skip-skill': { type: 'boolean' },
|
|
159
304
|
},
|
|
160
305
|
allowPositionals: false,
|
|
161
306
|
});
|
|
@@ -163,8 +308,12 @@ export async function runInit(argv) {
|
|
|
163
308
|
const homeDir = homedir();
|
|
164
309
|
const cwd = process.cwd();
|
|
165
310
|
process.stdout.write('peek init — configure MCP clients + the native messaging host.\n\n');
|
|
311
|
+
let chosenClients = [];
|
|
166
312
|
if (!values['skip-clients']) {
|
|
167
|
-
await configureClients(homeDir, cwd);
|
|
313
|
+
chosenClients = await configureClients(homeDir, cwd);
|
|
314
|
+
}
|
|
315
|
+
if (!values['skip-skill']) {
|
|
316
|
+
installClaudeSkill(homeDir, chosenClients);
|
|
168
317
|
}
|
|
169
318
|
if (!values['skip-native-host']) {
|
|
170
319
|
if (SUPPORTED.includes(platform)) {
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AA0XA,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAuBlD"}
|