@tiny-fish/cli 0.23.1-next.203 → 0.23.1-next.205
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/connect.js +4 -1
- package/dist/commands/doctor.js +2 -1
- package/dist/lib/connect-all.js +11 -4
- package/dist/lib/connect-clients.d.ts +8 -1
- package/dist/lib/connect-clients.js +2 -0
- package/dist/lib/connect-install.d.ts +5 -2
- package/dist/lib/connect-install.js +7 -6
- package/dist/lib/doctor-report.d.ts +6 -0
- package/dist/lib/harness-detect.d.ts +1 -1
- package/dist/lib/harness-detect.js +2 -0
- package/dist/lib/registration-detect.js +59 -0
- package/dist/lib/setup-telemetry.d.ts +2 -0
- package/package.json +2 -2
package/dist/commands/connect.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import spawn from "cross-spawn";
|
|
2
2
|
import { CONNECT_SOURCE, persistApiKeyToEnvironment, saveConnectContext, validateKeyFormat, validatedApiKey, } from "../lib/auth.js";
|
|
3
|
-
import { CLAUDE_CODE, CODEX, GROK, HERMES, OPENCLAW, OPENCLAW_SKILL_INSTALL_ARGS, OPENCODE, launchNativeMcpClient, launchOpenClawWalkthrough, openExternalUrl, } from "../lib/connect-clients.js";
|
|
3
|
+
import { CLAUDE_CODE, CODEX, CURSOR_SKILL_TARGET, GROK, HERMES, OPENCLAW, OPENCLAW_SKILL_INSTALL_ARGS, OPENCODE, launchNativeMcpClient, launchOpenClawWalkthrough, openExternalUrl, } from "../lib/connect-clients.js";
|
|
4
4
|
import { ensureCliAuthenticated, installTinyFishCli, installWebSkill, SKILL_INSTALL_TIMEOUT_MS, UPGRADE_HINT, } from "../lib/connect-install.js";
|
|
5
5
|
import { ConnectInterruptedError, ConnectStepError, createConnectTelemetry, requireCommandSupport, runGuarded, settle, spawnStepError, throwIfInterrupted, NON_INTERACTIVE_TIMEOUT_MS, } from "../lib/connect-runtime.js";
|
|
6
6
|
import { cursorInstallDeeplink, cursorMcpPath, writeCursorMcpConfig, } from "../lib/cursor-config.js";
|
|
@@ -266,6 +266,9 @@ export async function connectCursor(options) {
|
|
|
266
266
|
await runGuarded(state, telemetry, async () => {
|
|
267
267
|
telemetry.track("started");
|
|
268
268
|
telemetry.track("checkpoint", { phase: "prerequisite_ok" });
|
|
269
|
+
state.stage = "skill_install";
|
|
270
|
+
installWebSkill(CURSOR_SKILL_TARGET);
|
|
271
|
+
telemetry.track("checkpoint", { phase: "skill_installed" });
|
|
269
272
|
// Auth first: a key lets the config carry an X-API-Key header, removing the sign-in hand-back.
|
|
270
273
|
state.stage = "authentication";
|
|
271
274
|
ensureCliAuthenticated("cursor", options.apiKey);
|
package/dist/commands/doctor.js
CHANGED
|
@@ -7,7 +7,7 @@ import { detectHumanInitiated } from "../lib/harness.js";
|
|
|
7
7
|
import { err, errLine, out, outLine } from "../lib/output.js";
|
|
8
8
|
import { detectRegistrations } from "../lib/registration-detect.js";
|
|
9
9
|
import { verifyMcpAuth, verifyMcpHealth } from "../lib/verify.js";
|
|
10
|
-
import { connectClaudeCode, connectCodex, connectCursor, connectHermes, connectOpenClaw, connectOpencode, DEFAULT_MCP_URL, } from "./connect.js";
|
|
10
|
+
import { connectClaudeCode, connectCodex, connectCursor, connectGrok, connectHermes, connectOpenClaw, connectOpencode, DEFAULT_MCP_URL, } from "./connect.js";
|
|
11
11
|
// A green auth mode with a red auth call proves nothing, so the call's verdict gates the claim.
|
|
12
12
|
function provesHarnessReach(status, keyAuth, healthOk, mcpUrl) {
|
|
13
13
|
// An endpoint doctor could not reach proves nothing about a harness pointed at it.
|
|
@@ -300,6 +300,7 @@ const CONNECTORS = {
|
|
|
300
300
|
"claude-code": (opts) => connectClaudeCode({ ...opts, launch: false }),
|
|
301
301
|
codex: (opts) => connectCodex({ ...opts, launch: false }),
|
|
302
302
|
cursor: (opts) => connectCursor(opts),
|
|
303
|
+
grok: (opts) => connectGrok({ ...opts, launch: false }),
|
|
303
304
|
hermes: (opts) => connectHermes({ ...opts, launch: false }),
|
|
304
305
|
openclaw: (opts) => connectOpenClaw({ ...opts, launch: false }),
|
|
305
306
|
opencode: (opts) => connectOpencode({ ...opts, launch: false }),
|
package/dist/lib/connect-all.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as readline from "node:readline/promises";
|
|
2
2
|
import spawn from "cross-spawn";
|
|
3
|
-
import { connectClaudeCode, connectCodex, connectCursor, connectHermes, connectOpenClaw, connectOpencode, } from "../commands/connect.js";
|
|
3
|
+
import { connectClaudeCode, connectCodex, connectCursor, connectGrok, connectHermes, connectOpenClaw, connectOpencode, } from "../commands/connect.js";
|
|
4
4
|
import { validatedApiKey } from "./auth.js";
|
|
5
5
|
import { NATIVE_MCP_CLIENTS } from "./connect-clients.js";
|
|
6
6
|
import { ensureCliAuthenticated, installTinyFishCli, TINYFISH_CLI_NOT_FOUND_MESSAGE, } from "./connect-install.js";
|
|
@@ -16,6 +16,7 @@ const DISPLAY_NAMES = {
|
|
|
16
16
|
"claude-code": "Claude Code",
|
|
17
17
|
codex: "Codex",
|
|
18
18
|
cursor: "Cursor",
|
|
19
|
+
grok: "Grok",
|
|
19
20
|
hermes: "Hermes",
|
|
20
21
|
openclaw: "OpenClaw",
|
|
21
22
|
opencode: "OpenCode",
|
|
@@ -26,7 +27,6 @@ const AUTH_DEFERRED_AT_INSTALL = new Set(["codex"]);
|
|
|
26
27
|
const AUTH_CHECK_CAPABLE = new Set(["cursor", "openclaw"]);
|
|
27
28
|
// Descriptor-derived so a harness that cannot carry a key is skipped, not failed, when headless.
|
|
28
29
|
// Cursor and OpenClaw hold the key themselves rather than handing it to a harness `mcp add`.
|
|
29
|
-
// `--all` only reaches harnesses it can detect; Grok has a keyAuth but no detection yet.
|
|
30
30
|
const KEY_AUTH_CAPABLE = new Set([
|
|
31
31
|
...NATIVE_MCP_CLIENTS.filter((client) => !!client.keyAuth)
|
|
32
32
|
.map((client) => client.connectClient)
|
|
@@ -40,6 +40,7 @@ const KEY_AUTH_CAPABLE = new Set([
|
|
|
40
40
|
const UNINSTALL_POINTERS = {
|
|
41
41
|
"claude-code": "claude mcp remove tinyfish --scope user",
|
|
42
42
|
codex: "codex mcp remove tinyfish",
|
|
43
|
+
grok: "grok mcp remove tinyfish",
|
|
43
44
|
hermes: "hermes mcp remove tinyfish",
|
|
44
45
|
openclaw: "openclaw skills uninstall @tinyfish/tinyfish --global",
|
|
45
46
|
// OpenCode ships no `mcp remove`, so the only removal is editing the config it wrote.
|
|
@@ -60,8 +61,14 @@ async function runHarnessConnect(harness, opts, keyAuthOnly) {
|
|
|
60
61
|
}
|
|
61
62
|
if (harness === "opencode")
|
|
62
63
|
return connectOpencode(base);
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
if (harness === "grok")
|
|
65
|
+
return connectGrok(base);
|
|
66
|
+
if (harness === "cursor") {
|
|
67
|
+
await connectCursor({ apiKey: opts.apiKey, mcpUrl: opts.mcpUrl });
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
// Explicit: a new harness reaching an untested branch must fail, not write Cursor's config.
|
|
71
|
+
throw new Error(`No installer is wired for ${harness}`);
|
|
65
72
|
}
|
|
66
73
|
async function verifyHarness(harness, mcpUrl, keyed, apiKey) {
|
|
67
74
|
const health = await verifyMcpHealth(mcpUrl);
|
|
@@ -3,10 +3,17 @@ import { type AgentClient, type SupportedCommand } from "./connect-runtime.js";
|
|
|
3
3
|
export declare const OPENCLAW_SKILL_INSTALL_ARGS: readonly string[];
|
|
4
4
|
export declare const DEFAULT_ONBOARDING_PROMPT: string;
|
|
5
5
|
export declare const OPENCLAW_ONBOARDING_PROMPT: string;
|
|
6
|
+
/** The `skills` CLI's own agent names — not ours, and not every harness has one. */
|
|
7
|
+
export type SkillAgent = "claude-code" | "codex" | "cursor" | "hermes-agent" | "opencode";
|
|
8
|
+
/** Cursor writes its own MCP config, so it has no descriptor to carry this. */
|
|
9
|
+
export declare const CURSOR_SKILL_TARGET: {
|
|
10
|
+
readonly skillAgent: "cursor";
|
|
11
|
+
readonly displayName: "Cursor";
|
|
12
|
+
};
|
|
6
13
|
export interface NativeMcpClient extends SupportedCommand {
|
|
7
14
|
connectClient: Exclude<AgentClient, "openclaw">;
|
|
8
15
|
/** Omitted where the `skills` CLI has no agent for this harness (Grok ships its own plugin). */
|
|
9
|
-
skillAgent?:
|
|
16
|
+
skillAgent?: SkillAgent;
|
|
10
17
|
/** Replaces `addArgs` when a stored key is available: key auth removes the OAuth hop. */
|
|
11
18
|
keyAuth?: {
|
|
12
19
|
/** Key reaches the client through TINYFISH_API_KEY, not argv. */
|
|
@@ -62,6 +62,8 @@ export const OPENCLAW_ONBOARDING_PROMPT = "I just installed the TinyFish skill.
|
|
|
62
62
|
"want to search and wait for my reply before using TinyFish Search. Show me the results, ask " +
|
|
63
63
|
"which result I want to read, and wait before using TinyFish Fetch. Then ask what browser task " +
|
|
64
64
|
"I want to complete and wait before using TinyFish Agent. Never skip ahead or choose for me.";
|
|
65
|
+
/** Cursor writes its own MCP config, so it has no descriptor to carry this. */
|
|
66
|
+
export const CURSOR_SKILL_TARGET = { skillAgent: "cursor", displayName: "Cursor" };
|
|
65
67
|
const HEADER_FLAG = /(?:^|\s)--header(?:[\s<=]|$)/m;
|
|
66
68
|
const claudeAddArgs = (mcpUrl) => [
|
|
67
69
|
"mcp",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type SkillAgent } from "./connect-clients.js";
|
|
2
2
|
import { type AgentClient } from "./connect-runtime.js";
|
|
3
3
|
export declare const SKILL_INSTALL_TIMEOUT_MS = 120000;
|
|
4
4
|
export declare const TINYFISH_CLI_NOT_FOUND_MESSAGE = "TinyFish CLI installed but is not available on PATH. Open a new terminal and retry.";
|
|
@@ -8,7 +8,10 @@ export type InstallOptions = {
|
|
|
8
8
|
verbose: boolean;
|
|
9
9
|
};
|
|
10
10
|
export declare function installTinyFishCli({ verbose }: InstallOptions): void;
|
|
11
|
-
export declare function installWebSkill(client:
|
|
11
|
+
export declare function installWebSkill(client: {
|
|
12
|
+
skillAgent?: SkillAgent;
|
|
13
|
+
displayName: string;
|
|
14
|
+
}): void;
|
|
12
15
|
/**
|
|
13
16
|
* Refresh the skill we installed, for the harnesses we installed it in.
|
|
14
17
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as path from "node:path";
|
|
2
2
|
import spawn from "cross-spawn";
|
|
3
3
|
import { loadConfig, persistApiKeyToEnvironment, validateKeyFormat, writeConfig } from "./auth.js";
|
|
4
|
-
import { NATIVE_MCP_CLIENTS, OPENCLAW_SKILL_INSTALL_ARGS, } from "./connect-clients.js";
|
|
4
|
+
import { CURSOR_SKILL_TARGET, NATIVE_MCP_CLIENTS, OPENCLAW_SKILL_INSTALL_ARGS, } from "./connect-clients.js";
|
|
5
5
|
import { commandNotFound, ConnectStepError, spawnStepError, throwIfInterrupted, NON_INTERACTIVE_TIMEOUT_MS, } from "./connect-runtime.js";
|
|
6
6
|
import { TINYFISH_CLI_PACKAGE } from "./constants.js";
|
|
7
7
|
import { installRoot } from "./install-root.js";
|
|
@@ -112,13 +112,14 @@ export function installWebSkill(client) {
|
|
|
112
112
|
export function updateWebSkill({ verbose }) {
|
|
113
113
|
// One entry per `tinyfish connect <client>`, persisted by PF-3169.
|
|
114
114
|
const connected = loadConfig().connect ?? {};
|
|
115
|
-
const skillAgents =
|
|
116
|
-
.filter((client) => connected[client.connectClient])
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
const skillAgents = [
|
|
116
|
+
...NATIVE_MCP_CLIENTS.filter((client) => connected[client.connectClient]).map((client) => client.skillAgent),
|
|
117
|
+
// Cursor is not a NativeMcpClient — it writes its own MCP config.
|
|
118
|
+
...(connected["cursor"] ? [CURSOR_SKILL_TARGET.skillAgent] : []),
|
|
119
|
+
].filter((agent) => agent !== undefined);
|
|
119
120
|
const hasOpenClaw = Boolean(connected["openclaw"]);
|
|
120
121
|
// Installs predating PF-3169 recorded nothing; ask `skills` to refresh what it tracks. A
|
|
121
|
-
// skill-less recorded install (Grok
|
|
122
|
+
// skill-less recorded install (Grok) may still have one from before, so refresh anyway
|
|
122
123
|
// — but there having been none is then expected, not an upgrade failure.
|
|
123
124
|
if (skillAgents.length === 0 && !hasOpenClaw) {
|
|
124
125
|
return refreshWebSkillByHash(verbose, Object.keys(connected).length > 0);
|
|
@@ -25,6 +25,7 @@ declare const doctorCheckSchema: z.ZodObject<{
|
|
|
25
25
|
detail: z.ZodString;
|
|
26
26
|
harness: z.ZodNullable<z.ZodEnum<{
|
|
27
27
|
openclaw: "openclaw";
|
|
28
|
+
grok: "grok";
|
|
28
29
|
cursor: "cursor";
|
|
29
30
|
codex: "codex";
|
|
30
31
|
hermes: "hermes";
|
|
@@ -40,6 +41,7 @@ declare const doctorCheckSchema: z.ZodObject<{
|
|
|
40
41
|
declare const doctorHarnessSchema: z.ZodObject<{
|
|
41
42
|
harness: z.ZodEnum<{
|
|
42
43
|
openclaw: "openclaw";
|
|
44
|
+
grok: "grok";
|
|
43
45
|
cursor: "cursor";
|
|
44
46
|
codex: "codex";
|
|
45
47
|
hermes: "hermes";
|
|
@@ -59,6 +61,7 @@ declare const doctorRepairSchema: z.ZodObject<{
|
|
|
59
61
|
}>;
|
|
60
62
|
harness: z.ZodNullable<z.ZodEnum<{
|
|
61
63
|
openclaw: "openclaw";
|
|
64
|
+
grok: "grok";
|
|
62
65
|
cursor: "cursor";
|
|
63
66
|
codex: "codex";
|
|
64
67
|
hermes: "hermes";
|
|
@@ -85,6 +88,7 @@ export declare const doctorReportSchema: z.ZodObject<{
|
|
|
85
88
|
detail: z.ZodString;
|
|
86
89
|
harness: z.ZodNullable<z.ZodEnum<{
|
|
87
90
|
openclaw: "openclaw";
|
|
91
|
+
grok: "grok";
|
|
88
92
|
cursor: "cursor";
|
|
89
93
|
codex: "codex";
|
|
90
94
|
hermes: "hermes";
|
|
@@ -100,6 +104,7 @@ export declare const doctorReportSchema: z.ZodObject<{
|
|
|
100
104
|
harnesses: z.ZodArray<z.ZodObject<{
|
|
101
105
|
harness: z.ZodEnum<{
|
|
102
106
|
openclaw: "openclaw";
|
|
107
|
+
grok: "grok";
|
|
103
108
|
cursor: "cursor";
|
|
104
109
|
codex: "codex";
|
|
105
110
|
hermes: "hermes";
|
|
@@ -119,6 +124,7 @@ export declare const doctorReportSchema: z.ZodObject<{
|
|
|
119
124
|
}>;
|
|
120
125
|
harness: z.ZodNullable<z.ZodEnum<{
|
|
121
126
|
openclaw: "openclaw";
|
|
127
|
+
grok: "grok";
|
|
122
128
|
cursor: "cursor";
|
|
123
129
|
codex: "codex";
|
|
124
130
|
hermes: "hermes";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const ALL_HARNESSES: readonly ["claude-code", "codex", "cursor", "hermes", "openclaw", "opencode"];
|
|
1
|
+
export declare const ALL_HARNESSES: readonly ["claude-code", "codex", "cursor", "grok", "hermes", "openclaw", "opencode"];
|
|
2
2
|
export type Harness = (typeof ALL_HARNESSES)[number];
|
|
3
3
|
export declare enum Registered {
|
|
4
4
|
Yes = "yes",
|
|
@@ -5,6 +5,7 @@ export const ALL_HARNESSES = [
|
|
|
5
5
|
"claude-code",
|
|
6
6
|
"codex",
|
|
7
7
|
"cursor",
|
|
8
|
+
"grok",
|
|
8
9
|
"hermes",
|
|
9
10
|
"openclaw",
|
|
10
11
|
"opencode",
|
|
@@ -27,6 +28,7 @@ const CONFIG_DIRS = {
|
|
|
27
28
|
"claude-code": ".claude",
|
|
28
29
|
codex: ".codex",
|
|
29
30
|
cursor: ".cursor",
|
|
31
|
+
grok: ".grok",
|
|
30
32
|
hermes: ".hermes",
|
|
31
33
|
openclaw: ".openclaw",
|
|
32
34
|
opencode: ".config/opencode",
|
|
@@ -342,10 +342,69 @@ function probeOpencode() {
|
|
|
342
342
|
}
|
|
343
343
|
return fromMcpList("opencode", probe.output, AuthMode.Unknown, OPENCODE_ROW_URL);
|
|
344
344
|
}
|
|
345
|
+
// Verified against grok 0.0.60: a list, with the header value in the clear.
|
|
346
|
+
const grokEntrySchema = z.looseObject({
|
|
347
|
+
name: z.string().optional(),
|
|
348
|
+
url: z.string().optional(),
|
|
349
|
+
headers: z.record(z.string(), z.string()).optional(),
|
|
350
|
+
});
|
|
351
|
+
const grokListSchema = z.array(grokEntrySchema);
|
|
352
|
+
// Grok drops X-API-Key when the server advertises OAuth metadata, so keys ride Authorization.
|
|
353
|
+
const BEARER_VALUE = /^Bearer\s+(\S+)$/i;
|
|
354
|
+
// Grok has no `mcp get`; `mcp list --json` is the only machine-readable view.
|
|
355
|
+
function probeGrok() {
|
|
356
|
+
const probe = runProbe("grok", ["mcp", "list", "--json"]);
|
|
357
|
+
if (probe.outcome === "unavailable") {
|
|
358
|
+
return { registered: Registered.Unknown, authMode: AuthMode.Unknown, reason: probe.reason };
|
|
359
|
+
}
|
|
360
|
+
if (probe.exitCode !== 0) {
|
|
361
|
+
if (UNSUPPORTED_SUBCOMMAND.test(probe.output)) {
|
|
362
|
+
return {
|
|
363
|
+
registered: Registered.Unknown,
|
|
364
|
+
authMode: AuthMode.Unknown,
|
|
365
|
+
reason: "this Grok build has no `mcp list --json`",
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
registered: Registered.Unknown,
|
|
370
|
+
authMode: AuthMode.Unknown,
|
|
371
|
+
reason: `\`grok mcp list --json\` exited ${probe.exitCode}`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
let entries;
|
|
375
|
+
try {
|
|
376
|
+
entries = grokListSchema.parse(JSON.parse(probe.stdout));
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return {
|
|
380
|
+
registered: Registered.Unknown,
|
|
381
|
+
authMode: AuthMode.Unknown,
|
|
382
|
+
reason: "`grok mcp list --json` did not return the expected shape",
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
const entry = entries.find((server) => server.name === "tinyfish");
|
|
386
|
+
if (!entry)
|
|
387
|
+
return { registered: Registered.No, authMode: AuthMode.Unknown };
|
|
388
|
+
const authorization = Object.entries(entry.headers ?? {}).find(([name]) => name.toLowerCase() === "authorization")?.[1];
|
|
389
|
+
// `${VAR}` expands to "" when the env var is unset: a present-but-empty header is a broken key.
|
|
390
|
+
const hasAuthorization = authorization !== undefined;
|
|
391
|
+
const key = extractableKey(BEARER_VALUE.exec(authorization ?? "")?.[1]);
|
|
392
|
+
return {
|
|
393
|
+
registered: Registered.Yes,
|
|
394
|
+
authMode: hasAuthorization ? AuthMode.ApiKey : AuthMode.OAuth,
|
|
395
|
+
...(entry.url ? { registeredUrl: entry.url } : {}),
|
|
396
|
+
...(key ? { apiKey: key } : {}),
|
|
397
|
+
// A keyed Grok entry suppresses OAuth discovery, so an unreadable key cannot fall back.
|
|
398
|
+
...(hasAuthorization && !key
|
|
399
|
+
? { keyReason: "its Authorization header is not a readable TinyFish key" }
|
|
400
|
+
: {}),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
345
403
|
const PROBES = {
|
|
346
404
|
"claude-code": () => fromMcpGet("claude", API_KEY_HEADER),
|
|
347
405
|
codex: probeCodex,
|
|
348
406
|
cursor: probeCursor,
|
|
407
|
+
grok: probeGrok,
|
|
349
408
|
hermes: probeHermes,
|
|
350
409
|
openclaw: probeOpenClaw,
|
|
351
410
|
opencode: probeOpencode,
|
|
@@ -25,6 +25,7 @@ export declare function postConnectEvent(options: {
|
|
|
25
25
|
declare const harnessResultSchema: z.ZodObject<{
|
|
26
26
|
harness: z.ZodEnum<{
|
|
27
27
|
openclaw: "openclaw";
|
|
28
|
+
grok: "grok";
|
|
28
29
|
cursor: "cursor";
|
|
29
30
|
codex: "codex";
|
|
30
31
|
hermes: "hermes";
|
|
@@ -43,6 +44,7 @@ export declare const setupCompletedPayloadSchema: z.ZodObject<{
|
|
|
43
44
|
harnesses: z.ZodArray<z.ZodObject<{
|
|
44
45
|
harness: z.ZodEnum<{
|
|
45
46
|
openclaw: "openclaw";
|
|
47
|
+
grok: "grok";
|
|
46
48
|
cursor: "cursor";
|
|
47
49
|
codex: "codex";
|
|
48
50
|
hermes: "hermes";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiny-fish/cli",
|
|
3
|
-
"version": "0.23.1-next.
|
|
3
|
+
"version": "0.23.1-next.205",
|
|
4
4
|
"description": "TinyFish CLI — run web automations from your terminal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"prepublishOnly": "npm run build"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@tiny-fish/sdk": "^0.
|
|
35
|
+
"@tiny-fish/sdk": "^0.5.0",
|
|
36
36
|
"chrome-cookies-secure": "^3.0.2",
|
|
37
37
|
"commander": "^12.0.0",
|
|
38
38
|
"cross-spawn": "^7.0.6",
|