@peektag-ai/cli 0.1.0 → 0.1.1
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 +34 -0
- package/dist/auth.d.ts +1 -3
- package/dist/auth.js +15 -16
- package/dist/auth.js.map +1 -1
- package/dist/browser.d.ts +5 -0
- package/dist/browser.js +16 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/mcp.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,9 +8,37 @@ Node.js 20 or newer is required.
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install -g @peektag-ai/cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The public npm package is [@peektag-ai/cli](https://www.npmjs.com/package/@peektag-ai/cli). Its source lives in this repository at `tools/peektag-cli`; the server repository is not a public source download.
|
|
14
|
+
|
|
15
|
+
### Connect an existing coding client
|
|
16
|
+
|
|
17
|
+
Install Cursor, Claude Code or Codex first, then run the matching command:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
peektag mcp install cursor
|
|
21
|
+
peektag mcp install claude-code
|
|
22
|
+
peektag mcp install codex
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
These installers add the public remote MCP URL to the client's user configuration. They do not install the client or share the CLI's credentials with it. Complete authorization in the client:
|
|
26
|
+
|
|
27
|
+
- Cursor: restart the app, open Customize → MCP, enable `peektag` and sign in.
|
|
28
|
+
- Claude Code: open `/mcp`, select `peektag` and sign in.
|
|
29
|
+
- Codex: run `codex mcp login peektag`, then restart the session.
|
|
30
|
+
|
|
31
|
+
Verify the client can list PeekTag experience templates before creating or editing an experience. Each host uses the existing PeekTag MCP tools and native agents; this CLI does not implement a separate agent.
|
|
32
|
+
|
|
33
|
+
### Use standalone CLI commands
|
|
34
|
+
|
|
35
|
+
```bash
|
|
11
36
|
peektag auth login
|
|
37
|
+
peektag mcp tools
|
|
12
38
|
```
|
|
13
39
|
|
|
40
|
+
This sign-in is separate from the coding client's authorization. It requires the configured public Keycloak client described below. The default endpoint is production; use the non-secret environment overrides below for local development.
|
|
41
|
+
|
|
14
42
|
For local development:
|
|
15
43
|
|
|
16
44
|
```bash
|
|
@@ -67,3 +95,9 @@ npm run check
|
|
|
67
95
|
npm test
|
|
68
96
|
npm pack --dry-run
|
|
69
97
|
```
|
|
98
|
+
|
|
99
|
+
## 0.1.1 — Onboarding corrections (2026-10-19)
|
|
100
|
+
|
|
101
|
+
This patch launches Windows sign-in without passing the authorization query through `cmd /c start`, handles browser spawn failures, validates callback method/path and state bytes, ignores unrelated callbacks, and clears the callback timer when login ends.
|
|
102
|
+
|
|
103
|
+
Verification includes the TypeScript check and 10 tests covering argument handling, configuration, browser launch arguments, PKCE callback rejection and cleanup. The published `0.1.0` package was separately installed into an isolated directory and exercised against a local MCP fixture: initialization, tool listing, calling `peektag_answer`, large string IDs, all three installers, existing Cursor configuration preservation, and invalid input. Codex and Claude Code installers used recording stubs rather than changing real client settings. Actual end-user OAuth sign-in, refresh and revocation against production remain separate release checks; the local callback tests do not prove those completed.
|
package/dist/auth.d.ts
CHANGED
|
@@ -7,8 +7,6 @@ export interface StoredTokens {
|
|
|
7
7
|
}
|
|
8
8
|
export declare function readStoredTokens(config: CliConfig): Promise<StoredTokens | undefined>;
|
|
9
9
|
export declare function getAccessToken(config: CliConfig): Promise<string>;
|
|
10
|
-
declare function
|
|
11
|
-
export declare function login(config: CliConfig, open?: typeof openBrowser): Promise<StoredTokens>;
|
|
10
|
+
export declare function login(config: CliConfig, open?: (url: string) => void | Promise<void>): Promise<StoredTokens>;
|
|
12
11
|
export declare function logout(config: CliConfig): Promise<boolean>;
|
|
13
12
|
export declare function tokenIdentity(accessToken: string): Record<string, unknown>;
|
|
14
|
-
export {};
|
package/dist/auth.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
|
-
import {
|
|
3
|
+
import { openSignInBrowser } from "./browser.js";
|
|
4
4
|
import { AsyncEntry } from "@napi-rs/keyring";
|
|
5
5
|
import { assertHttpsOrLoopback } from "./config.js";
|
|
6
6
|
const KEYRING_SERVICE = "com.peektag.cli";
|
|
@@ -88,13 +88,7 @@ export async function getAccessToken(config) {
|
|
|
88
88
|
function base64Url(bytes) {
|
|
89
89
|
return bytes.toString("base64url");
|
|
90
90
|
}
|
|
91
|
-
function
|
|
92
|
-
const command = process.platform === "win32" ? "cmd" : process.platform === "darwin" ? "open" : "xdg-open";
|
|
93
|
-
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
94
|
-
const child = spawn(command, args, { detached: true, stdio: "ignore", windowsHide: true });
|
|
95
|
-
child.unref();
|
|
96
|
-
}
|
|
97
|
-
export async function login(config, open = openBrowser) {
|
|
91
|
+
export async function login(config, open = openSignInBrowser) {
|
|
98
92
|
const metadata = await discover(config);
|
|
99
93
|
const verifier = base64Url(randomBytes(48));
|
|
100
94
|
const challenge = base64Url(createHash("sha256").update(verifier).digest());
|
|
@@ -111,25 +105,30 @@ export async function login(config, open = openBrowser) {
|
|
|
111
105
|
const code = new Promise((res, rej) => { settle = res; fail = rej; });
|
|
112
106
|
const timer = setTimeout(() => fail(new Error("OAuth login timed out.")), CALLBACK_TIMEOUT_MS);
|
|
113
107
|
server.on("request", (request, response) => {
|
|
114
|
-
const url = new URL(request.url ?? "/",
|
|
108
|
+
const url = new URL(request.url ?? "/", "http://127.0.0.1");
|
|
115
109
|
const state = url.searchParams.get("state") ?? "";
|
|
116
|
-
const
|
|
110
|
+
const receivedState = Buffer.from(state);
|
|
111
|
+
const expectedStateBytes = Buffer.from(expectedState);
|
|
112
|
+
const stateMatches = receivedState.length === expectedStateBytes.length && timingSafeEqual(receivedState, expectedStateBytes);
|
|
113
|
+
if (request.method !== "GET" || url.pathname !== "/callback" || !stateMatches) {
|
|
114
|
+
response.writeHead(400, { "Content-Type": "text/plain; charset=utf-8", "Cache-Control": "no-store" });
|
|
115
|
+
response.end("Invalid sign-in callback.");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
117
118
|
const error = url.searchParams.get("error_description") ?? url.searchParams.get("error");
|
|
118
119
|
const authorizationCode = url.searchParams.get("code");
|
|
119
120
|
const success = stateMatches && !error && authorizationCode;
|
|
120
121
|
response.writeHead(success ? 200 : 400, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-store" });
|
|
121
122
|
response.end(success ? "<h1>PeekTag connected</h1><p>You can close this window.</p>" : "<h1>PeekTag sign-in failed</h1><p>Return to the terminal.</p>");
|
|
122
123
|
clearTimeout(timer);
|
|
123
|
-
if (
|
|
124
|
-
fail(new Error("OAuth state validation failed."));
|
|
125
|
-
else if (error)
|
|
124
|
+
if (error)
|
|
126
125
|
fail(new Error(`OAuth login failed: ${error}`));
|
|
127
126
|
else if (!authorizationCode)
|
|
128
127
|
fail(new Error("OAuth callback did not include an authorization code."));
|
|
129
128
|
else
|
|
130
129
|
settle(authorizationCode);
|
|
131
130
|
});
|
|
132
|
-
resolve({ redirectUri: `http://127.0.0.1:${address.port}/callback`, code, close: () => server.close() });
|
|
131
|
+
resolve({ redirectUri: `http://127.0.0.1:${address.port}/callback`, code, close: () => { clearTimeout(timer); server.close(); } });
|
|
133
132
|
});
|
|
134
133
|
});
|
|
135
134
|
try {
|
|
@@ -143,8 +142,8 @@ export async function login(config, open = openBrowser) {
|
|
|
143
142
|
code_challenge: challenge,
|
|
144
143
|
code_challenge_method: "S256",
|
|
145
144
|
}).toString();
|
|
146
|
-
|
|
147
|
-
const code = await callback.code;
|
|
145
|
+
// Attach the rejection handler before opening the browser: callbacks may arrive immediately.
|
|
146
|
+
const [, code] = await Promise.all([Promise.resolve().then(() => open(authorizationUrl.toString())), callback.code]);
|
|
148
147
|
const tokenResponse = await tokenRequest(metadata.token_endpoint, {
|
|
149
148
|
grant_type: "authorization_code",
|
|
150
149
|
client_id: config.clientId,
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function browserCommand(url, platform) {
|
|
3
|
+
if (platform === "win32")
|
|
4
|
+
return { command: "rundll32.exe", args: ["url.dll,FileProtocolHandler", url] };
|
|
5
|
+
return { command: platform === "darwin" ? "open" : "xdg-open", args: [url] };
|
|
6
|
+
}
|
|
7
|
+
export async function openSignInBrowser(url) {
|
|
8
|
+
const { command, args } = browserCommand(url, process.platform);
|
|
9
|
+
await new Promise((resolve, reject) => {
|
|
10
|
+
// Pass the whole authorization URL as an argument, without a shell interpreting its query string.
|
|
11
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore", windowsHide: true, shell: false });
|
|
12
|
+
child.once("error", () => reject(new Error("Could not open the sign-in browser. Check your default browser and try again.")));
|
|
13
|
+
child.once("spawn", () => { child.unref(); resolve(); });
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAyB;IACnE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE,CAAC;IACzG,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,kGAAkG;QAClG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC,CAAC,CAAC;QAC9H,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -31,7 +31,7 @@ function addSearchOptions(command) {
|
|
|
31
31
|
const program = new Command()
|
|
32
32
|
.name("peektag")
|
|
33
33
|
.description("Use PeekTag from the command line and MCP-compatible agents.")
|
|
34
|
-
.version("0.1.
|
|
34
|
+
.version("0.1.1")
|
|
35
35
|
.option("--json", "Print machine-readable JSON")
|
|
36
36
|
.option("--timeout <seconds>", "Request timeout in seconds", "60")
|
|
37
37
|
.showSuggestionAfterError();
|
package/dist/mcp.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/cli
|
|
|
2
2
|
import { assertHttpsOrLoopback } from "./config.js";
|
|
3
3
|
import { getAccessToken } from "./auth.js";
|
|
4
4
|
export class PeekTagMcpClient {
|
|
5
|
-
#client = new Client({ name: "peektag-cli", version: "0.1.
|
|
5
|
+
#client = new Client({ name: "peektag-cli", version: "0.1.1" });
|
|
6
6
|
#config;
|
|
7
7
|
#timeoutMs;
|
|
8
8
|
#transport;
|