image-skill 0.1.23 → 0.1.25
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/CHANGELOG.md +37 -0
- package/README.md +9 -7
- package/bin/image-skill.mjs +175 -44
- package/cli.md +67 -37
- package/llms.txt +6 -6
- package/package.json +1 -1
- package/skill.md +55 -39
- package/skills/image-skill/SKILL.md +55 -39
- package/skills/image-skill/references/cli.md +67 -37
- package/skills/image-skill/references/llms.txt +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,43 @@ This changelog tracks the public `image-skill` CLI package and public skill
|
|
|
4
4
|
mirror. The npm package metadata remains the authority for tarball integrity and
|
|
5
5
|
provenance; this file is the human- and agent-readable release map.
|
|
6
6
|
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
## 0.1.25 - 2026-06-02
|
|
10
|
+
|
|
11
|
+
- Fix (activation): `create --guide` now probes whether the public CLI auth
|
|
12
|
+
config path can actually be written before telling a fresh agent to run a
|
|
13
|
+
config-saving signup. If the default path is blocked, the guide returns the
|
|
14
|
+
browserless `signup --show-token --no-save --json` fallback plus
|
|
15
|
+
`--token-stdin` rerun/create templates, so read-only or workspace-scoped
|
|
16
|
+
runtimes can continue without losing the one-time hosted token.
|
|
17
|
+
- Fix (recovery copy): hosted signup config-write recovery now points agents at
|
|
18
|
+
a fresh `signup --agent ... --show-token` command instead of the local-only
|
|
19
|
+
`auth save` command, keeping the suggested recovery path valid for the hosted
|
|
20
|
+
public CLI.
|
|
21
|
+
|
|
22
|
+
## 0.1.24 - 2026-06-02
|
|
23
|
+
|
|
24
|
+
- Fix (activation): hosted `signup --agent` now saves the restricted token to
|
|
25
|
+
the public CLI config by default with `0600` permissions, while keeping the
|
|
26
|
+
raw token hidden unless `--show-token` is explicitly requested. Fresh agents
|
|
27
|
+
can run the guide's signup command, then continue with `whoami`, feedback,
|
|
28
|
+
credits, create, or edit from saved config instead of juggling a one-time
|
|
29
|
+
token through shell scope. `--show-token --no-save` remains available for
|
|
30
|
+
runtimes with their own secret store.
|
|
31
|
+
- Feature (x402 self-fund): `credits buy --provider stripe_x402` now returns
|
|
32
|
+
`stripe_x402.payable_instructions` when Stripe provides a Base crypto deposit
|
|
33
|
+
address. Wallet-equipped agents get the exact USDC amount, atomic units,
|
|
34
|
+
Base deposit address, optional token contract, expiry, and exact-amount flag
|
|
35
|
+
needed to settle without a browser; Stripe PaymentIntent ids and client
|
|
36
|
+
secrets remain redacted.
|
|
37
|
+
- Fix (payment readiness): `credits methods --json`, `create --guide`, public
|
|
38
|
+
skill docs, and the scoreboard now distinguish `agent_initiated` from
|
|
39
|
+
`agent_settleable`. A redacted browserless x402 deposit attempt is no longer
|
|
40
|
+
treated as autonomous self-fund ready unless the hosted catalog explicitly
|
|
41
|
+
reports `agent_settleable:true`; until then the guide prefers the Stripe
|
|
42
|
+
Checkout path that can actually be completed.
|
|
43
|
+
|
|
7
44
|
## 0.1.23 - 2026-06-02
|
|
8
45
|
|
|
9
46
|
- Fix (guide payments): `create --guide` now distinguishes browserless,
|
package/README.md
CHANGED
|
@@ -85,18 +85,20 @@ Release notes live in
|
|
|
85
85
|
Detailed package verification steps live in
|
|
86
86
|
[`PROVENANCE.md`](https://github.com/danielgwilson/image-skill-cli/blob/main/PROVENANCE.md).
|
|
87
87
|
|
|
88
|
-
Hosted signup
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
Hosted signup saves the restricted `isk_r_` token to the local public CLI
|
|
89
|
+
config by default with `0600` permissions, so later hosted commands can
|
|
90
|
+
authenticate without repeating signup. The raw token is returned only when
|
|
91
|
+
`--show-token` is set, and only once. Use `--show-token --no-save` when a
|
|
92
|
+
runtime intentionally wants to store the token somewhere else.
|
|
93
|
+
`create --guide` checks whether the configured auth path is writable before it
|
|
94
|
+
suggests a signup command; if not, it returns the `--show-token --no-save`
|
|
95
|
+
fallback plus `--token-stdin` rerun guidance.
|
|
94
96
|
|
|
95
97
|
Fresh sandboxes should prefer:
|
|
96
98
|
|
|
97
99
|
```bash
|
|
98
100
|
export IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json"
|
|
99
|
-
npx -y image-skill@latest signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name creative-agent --runtime openclaw --
|
|
101
|
+
npx -y image-skill@latest signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name creative-agent --runtime openclaw --json
|
|
100
102
|
```
|
|
101
103
|
|
|
102
104
|
If npm prefix/cache paths are read-only, set `npm_config_cache` and
|
package/bin/image-skill.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import { Readable } from "node:stream";
|
|
|
7
7
|
import { pipeline } from "node:stream/promises";
|
|
8
8
|
import os from "node:os";
|
|
9
9
|
|
|
10
|
-
const VERSION = "0.1.
|
|
10
|
+
const VERSION = "0.1.25";
|
|
11
11
|
const PACKAGE_NAME = "image-skill";
|
|
12
12
|
const DEFAULT_API_BASE_URL = "https://api.image-skill.com";
|
|
13
13
|
const DEFAULT_DOCS_BASE_URL = "https://image-skill.com";
|
|
@@ -28,7 +28,7 @@ const DEFAULT_CONFIG_PATH = join(
|
|
|
28
28
|
"config.json",
|
|
29
29
|
);
|
|
30
30
|
const SIGNUP_SUGGESTED_COMMAND =
|
|
31
|
-
"image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --
|
|
31
|
+
"image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json";
|
|
32
32
|
const SIGNUP_CONTACT_GUIDANCE =
|
|
33
33
|
"Preview signup currently requires an email-shaped durable contact inbox, not an individual human email. Use an agent-owned inbox when available; otherwise use an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. Do not block waiting for a person, invent a person, or use a throwaway inbox. --human-email remains a compatibility alias.";
|
|
34
34
|
const PUBLIC_NPX_COMMAND_PREFIX = "npx -y image-skill@latest";
|
|
@@ -75,7 +75,7 @@ async function main(rawArgv) {
|
|
|
75
75
|
commands: [
|
|
76
76
|
"doctor",
|
|
77
77
|
"trust",
|
|
78
|
-
"signup --agent --agent-contact --agent-name NAME --runtime RUNTIME
|
|
78
|
+
"signup --agent --agent-contact --agent-name NAME --runtime RUNTIME",
|
|
79
79
|
"auth status",
|
|
80
80
|
"auth save",
|
|
81
81
|
"auth logout",
|
|
@@ -346,21 +346,22 @@ async function signup(argv) {
|
|
|
346
346
|
},
|
|
347
347
|
);
|
|
348
348
|
}
|
|
349
|
-
const saveRequested = flagBool(args, "save");
|
|
350
349
|
const showToken = flagBool(args, "show-token");
|
|
351
|
-
|
|
352
|
-
|
|
350
|
+
const noSave = flagBool(args, "no-save");
|
|
351
|
+
const saveRequested = flagBool(args, "save");
|
|
352
|
+
if (saveRequested && noSave) {
|
|
353
|
+
return invalid(
|
|
353
354
|
"image-skill signup",
|
|
354
|
-
|
|
355
|
-
"INVALID_ARGUMENTS",
|
|
356
|
-
"signup --save is not available on the hosted public CLI; use --show-token once and store the token in the agent runtime secret store",
|
|
357
|
-
false,
|
|
358
|
-
{
|
|
359
|
-
suggested_command: SIGNUP_SUGGESTED_COMMAND,
|
|
360
|
-
docs_url: "https://image-skill.com/cli.md#image-skill-signup-agent",
|
|
361
|
-
},
|
|
355
|
+
"use either --save or --no-save, not both",
|
|
362
356
|
);
|
|
363
357
|
}
|
|
358
|
+
const shouldSave = !noSave;
|
|
359
|
+
if (shouldSave) {
|
|
360
|
+
const configReady = await assertConfigWritable("image-skill signup");
|
|
361
|
+
if (!configReady.ok) {
|
|
362
|
+
return configReady.result;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
364
365
|
const result = await apiRequest({
|
|
365
366
|
command: "image-skill signup",
|
|
366
367
|
method: "POST",
|
|
@@ -370,7 +371,7 @@ async function signup(argv) {
|
|
|
370
371
|
agent_contact: contact.value,
|
|
371
372
|
agent_name: agentName,
|
|
372
373
|
runtime,
|
|
373
|
-
return_token: showToken,
|
|
374
|
+
return_token: shouldSave || showToken,
|
|
374
375
|
},
|
|
375
376
|
});
|
|
376
377
|
result.envelope.command = "image-skill signup";
|
|
@@ -378,9 +379,39 @@ async function signup(argv) {
|
|
|
378
379
|
|
|
379
380
|
const token = result.envelope.data?.token;
|
|
380
381
|
const warnings = [...result.envelope.warnings];
|
|
382
|
+
if (result.envelope.ok && shouldSave) {
|
|
383
|
+
if (typeof token !== "string" || token.trim().length === 0) {
|
|
384
|
+
return failure(
|
|
385
|
+
"image-skill signup",
|
|
386
|
+
3,
|
|
387
|
+
"AUTH_REQUIRED",
|
|
388
|
+
"hosted signup did not return the restricted token needed for local auth save",
|
|
389
|
+
false,
|
|
390
|
+
{
|
|
391
|
+
suggested_command: `${SIGNUP_SUGGESTED_COMMAND} --show-token --no-save`,
|
|
392
|
+
docs_url: "https://image-skill.com/cli.md#image-skill-signup-agent",
|
|
393
|
+
},
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
await saveConfig({
|
|
398
|
+
api_base_url: apiBase(args),
|
|
399
|
+
token: token.trim(),
|
|
400
|
+
saved_at: new Date().toISOString(),
|
|
401
|
+
actor: null,
|
|
402
|
+
});
|
|
403
|
+
} catch (error) {
|
|
404
|
+
return configWriteFailure("image-skill signup", error);
|
|
405
|
+
}
|
|
406
|
+
warnings.push(
|
|
407
|
+
"hosted restricted token was saved to the public CLI config with 0600 permissions; later commands can authenticate from config without repeating signup",
|
|
408
|
+
);
|
|
409
|
+
}
|
|
381
410
|
if (result.envelope.ok && showToken) {
|
|
382
411
|
warnings.push(
|
|
383
|
-
|
|
412
|
+
shouldSave
|
|
413
|
+
? "hosted restricted token was also returned once because --show-token was set; keep it out of prompts, logs, issue text, and feedback"
|
|
414
|
+
: "hosted restricted token was returned once because --show-token --no-save was set; store it in the agent runtime secret store and use IMAGE_SKILL_TOKEN or --token-stdin for later commands",
|
|
384
415
|
);
|
|
385
416
|
}
|
|
386
417
|
|
|
@@ -392,11 +423,21 @@ async function signup(argv) {
|
|
|
392
423
|
token_presented: showToken,
|
|
393
424
|
storage: {
|
|
394
425
|
...(publicData.storage ?? {}),
|
|
395
|
-
saved:
|
|
396
|
-
config_path: null,
|
|
397
|
-
reason:
|
|
398
|
-
? "hosted signup
|
|
399
|
-
:
|
|
426
|
+
saved: shouldSave,
|
|
427
|
+
config_path: shouldSave ? configPath() : null,
|
|
428
|
+
reason: shouldSave
|
|
429
|
+
? "hosted signup saved the restricted token to the public CLI config for later commands"
|
|
430
|
+
: showToken
|
|
431
|
+
? "hosted signup returned the token once for the agent runtime secret store"
|
|
432
|
+
: "hosted signup did not request a raw token or save config because --no-save was set",
|
|
433
|
+
},
|
|
434
|
+
auth_handoff: {
|
|
435
|
+
accepted_methods: ["config", "IMAGE_SKILL_TOKEN", "--token-stdin"],
|
|
436
|
+
token_source_after_signup: shouldSave ? "config" : "not_saved",
|
|
437
|
+
secret_value_included: showToken,
|
|
438
|
+
next_step: shouldSave
|
|
439
|
+
? "Run whoami, usage quota, feedback create, credits, create, or edit normally; the CLI will read the saved config."
|
|
440
|
+
: "Store data.token in the agent runtime secret store immediately, then pass it with IMAGE_SKILL_TOKEN or --token-stdin.",
|
|
400
441
|
},
|
|
401
442
|
};
|
|
402
443
|
}
|
|
@@ -984,6 +1025,8 @@ async function createGuide(args) {
|
|
|
984
1025
|
quota,
|
|
985
1026
|
estimatedCredits,
|
|
986
1027
|
});
|
|
1028
|
+
const authConfigWrite =
|
|
1029
|
+
stage === "auth_required" ? await probeConfigWritable() : null;
|
|
987
1030
|
const blocker = createGuideBlocker(stage, {
|
|
988
1031
|
requestedModelId,
|
|
989
1032
|
quota,
|
|
@@ -998,6 +1041,7 @@ async function createGuide(args) {
|
|
|
998
1041
|
apiBaseUrl: explicitApiBaseUrl(args),
|
|
999
1042
|
paymentSummary,
|
|
1000
1043
|
commandPrefix: PUBLIC_NPX_COMMAND_PREFIX,
|
|
1044
|
+
authConfigWritable: authConfigWrite?.ok ?? true,
|
|
1001
1045
|
});
|
|
1002
1046
|
const afterNext =
|
|
1003
1047
|
stage === "auth_required" || stage === "quota_required"
|
|
@@ -1011,6 +1055,7 @@ async function createGuide(args) {
|
|
|
1011
1055
|
tokenSource: token.source,
|
|
1012
1056
|
nextCommand,
|
|
1013
1057
|
afterNext,
|
|
1058
|
+
authConfigWrite,
|
|
1014
1059
|
});
|
|
1015
1060
|
return success("image-skill create --guide", {
|
|
1016
1061
|
schema: "image-skill.create-guide.v1",
|
|
@@ -1029,6 +1074,13 @@ async function createGuide(args) {
|
|
|
1029
1074
|
claim_state: quota?.envelope.data?.claim_state ?? null,
|
|
1030
1075
|
token_status: quota?.envelope.data?.token_status ?? null,
|
|
1031
1076
|
saved_config_path: configPath(),
|
|
1077
|
+
config_write:
|
|
1078
|
+
authConfigWrite === null
|
|
1079
|
+
? null
|
|
1080
|
+
: publicConfigWriteStatus(
|
|
1081
|
+
authConfigWrite,
|
|
1082
|
+
"image-skill create --guide",
|
|
1083
|
+
),
|
|
1032
1084
|
},
|
|
1033
1085
|
models: {
|
|
1034
1086
|
reachable: models.envelope.ok,
|
|
@@ -1175,10 +1227,15 @@ function createGuidePaymentSummary(data) {
|
|
|
1175
1227
|
const browserlessMethods = availableMethods.filter(
|
|
1176
1228
|
(method) => method.requires_browser === false,
|
|
1177
1229
|
);
|
|
1178
|
-
const agentPayableMethods = browserlessMethods.filter(
|
|
1179
|
-
(method
|
|
1180
|
-
|
|
1181
|
-
|
|
1230
|
+
const agentPayableMethods = browserlessMethods.filter(
|
|
1231
|
+
(method) =>
|
|
1232
|
+
method.agent_settleable === true &&
|
|
1233
|
+
(method.buyer_modes ?? []).some(
|
|
1234
|
+
(mode) => mode === "agent_only" || mode === "hybrid",
|
|
1235
|
+
),
|
|
1236
|
+
);
|
|
1237
|
+
const agentInitiatedMethods = availableMethods.filter(
|
|
1238
|
+
(method) => method.agent_initiated === true,
|
|
1182
1239
|
);
|
|
1183
1240
|
const humanHandoffMethods = availableMethods.filter(
|
|
1184
1241
|
(method) =>
|
|
@@ -1186,7 +1243,10 @@ function createGuidePaymentSummary(data) {
|
|
|
1186
1243
|
(method.buyer_modes ?? []).some((mode) => mode === "human_only"),
|
|
1187
1244
|
);
|
|
1188
1245
|
const preferredMethod =
|
|
1189
|
-
agentPayableMethods[0] ??
|
|
1246
|
+
agentPayableMethods[0] ??
|
|
1247
|
+
humanHandoffMethods[0] ??
|
|
1248
|
+
browserlessMethods[0] ??
|
|
1249
|
+
availableMethods[0];
|
|
1190
1250
|
return {
|
|
1191
1251
|
checked: data !== null && typeof data === "object",
|
|
1192
1252
|
live_money_methods: availableMethods.map((method) => method.method_id),
|
|
@@ -1194,9 +1254,15 @@ function createGuidePaymentSummary(data) {
|
|
|
1194
1254
|
availableMethods.length > 0 &&
|
|
1195
1255
|
availableMethods.every((method) => method.requires_browser === true),
|
|
1196
1256
|
browserless_methods: browserlessMethods.map((method) => method.method_id),
|
|
1257
|
+
agent_initiated_methods: agentInitiatedMethods.map(
|
|
1258
|
+
(method) => method.method_id,
|
|
1259
|
+
),
|
|
1197
1260
|
agent_payable_methods: agentPayableMethods.map(
|
|
1198
1261
|
(method) => method.method_id,
|
|
1199
1262
|
),
|
|
1263
|
+
agent_settleable_methods: agentPayableMethods.map(
|
|
1264
|
+
(method) => method.method_id,
|
|
1265
|
+
),
|
|
1200
1266
|
human_handoff_methods: humanHandoffMethods.map(
|
|
1201
1267
|
(method) => method.method_id,
|
|
1202
1268
|
),
|
|
@@ -1314,6 +1380,7 @@ function createGuideBlocker(stage, input) {
|
|
|
1314
1380
|
|
|
1315
1381
|
function createGuideAuthHandoff(stage, input) {
|
|
1316
1382
|
if (stage === "auth_required") {
|
|
1383
|
+
const authConfigWritable = input.authConfigWrite?.ok ?? true;
|
|
1317
1384
|
return {
|
|
1318
1385
|
required: true,
|
|
1319
1386
|
token_source: "none",
|
|
@@ -1321,8 +1388,16 @@ function createGuideAuthHandoff(stage, input) {
|
|
|
1321
1388
|
accepted_methods: ["IMAGE_SKILL_TOKEN", "--token-stdin", "config"],
|
|
1322
1389
|
signup: {
|
|
1323
1390
|
returns_token_once: true,
|
|
1324
|
-
public_cli_saves_config:
|
|
1325
|
-
store_token_in:
|
|
1391
|
+
public_cli_saves_config: authConfigWritable,
|
|
1392
|
+
store_token_in: authConfigWritable
|
|
1393
|
+
? "public_cli_config_by_default"
|
|
1394
|
+
: "agent_runtime_secret_store",
|
|
1395
|
+
config_path: configPath(),
|
|
1396
|
+
config_writable: authConfigWritable,
|
|
1397
|
+
recovery:
|
|
1398
|
+
input.authConfigWrite?.ok === false
|
|
1399
|
+
? configWriteRecovery("image-skill create --guide")
|
|
1400
|
+
: null,
|
|
1326
1401
|
},
|
|
1327
1402
|
rerun_guide:
|
|
1328
1403
|
input.afterNext === null
|
|
@@ -1364,10 +1439,11 @@ function createGuideNextCommand(stage, input) {
|
|
|
1364
1439
|
);
|
|
1365
1440
|
}
|
|
1366
1441
|
if (stage === "auth_required") {
|
|
1367
|
-
|
|
1368
|
-
input.
|
|
1369
|
-
|
|
1370
|
-
|
|
1442
|
+
const signupCommand =
|
|
1443
|
+
input.authConfigWritable === false
|
|
1444
|
+
? "signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name AGENT_NAME --runtime RUNTIME_NAME --show-token --no-save --json"
|
|
1445
|
+
: "signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name AGENT_NAME --runtime RUNTIME_NAME --json";
|
|
1446
|
+
return renderGuidePrefixedCommand(input.commandPrefix, signupCommand);
|
|
1371
1447
|
}
|
|
1372
1448
|
if (stage === "quota_required") {
|
|
1373
1449
|
return renderGuidePrefixedCommand(
|
|
@@ -3151,7 +3227,7 @@ async function saveConfig(value) {
|
|
|
3151
3227
|
await chmod(path, 0o600);
|
|
3152
3228
|
}
|
|
3153
3229
|
|
|
3154
|
-
async function
|
|
3230
|
+
async function probeConfigWritable() {
|
|
3155
3231
|
const path = configPath();
|
|
3156
3232
|
const probePath = `${path}.write-test-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
3157
3233
|
try {
|
|
@@ -3159,32 +3235,87 @@ async function assertConfigWritable(command) {
|
|
|
3159
3235
|
await writeFile(probePath, "", { mode: 0o600 });
|
|
3160
3236
|
await chmod(probePath, 0o600);
|
|
3161
3237
|
await rm(probePath, { force: true });
|
|
3162
|
-
return { ok: true };
|
|
3238
|
+
return { ok: true, path, parent_path: dirname(path) };
|
|
3163
3239
|
} catch (error) {
|
|
3164
3240
|
await rm(probePath, { force: true }).catch(() => {});
|
|
3165
3241
|
return {
|
|
3166
3242
|
ok: false,
|
|
3167
|
-
|
|
3243
|
+
path,
|
|
3244
|
+
parent_path: dirname(path),
|
|
3245
|
+
error,
|
|
3246
|
+
message: configWriteErrorMessage(error),
|
|
3168
3247
|
};
|
|
3169
3248
|
}
|
|
3170
3249
|
}
|
|
3171
3250
|
|
|
3251
|
+
async function assertConfigWritable(command) {
|
|
3252
|
+
const status = await probeConfigWritable();
|
|
3253
|
+
if (status.ok) {
|
|
3254
|
+
return { ok: true };
|
|
3255
|
+
}
|
|
3256
|
+
return {
|
|
3257
|
+
ok: false,
|
|
3258
|
+
result: configWriteFailure(command, status.error),
|
|
3259
|
+
};
|
|
3260
|
+
}
|
|
3261
|
+
|
|
3262
|
+
function publicConfigWriteStatus(status, command) {
|
|
3263
|
+
if (status.ok) {
|
|
3264
|
+
return {
|
|
3265
|
+
writable: true,
|
|
3266
|
+
config_path: status.path,
|
|
3267
|
+
parent_path: status.parent_path,
|
|
3268
|
+
parent_directories_prepared: true,
|
|
3269
|
+
error_message: null,
|
|
3270
|
+
recovery: null,
|
|
3271
|
+
};
|
|
3272
|
+
}
|
|
3273
|
+
return {
|
|
3274
|
+
writable: false,
|
|
3275
|
+
config_path: status.path,
|
|
3276
|
+
parent_path: status.parent_path,
|
|
3277
|
+
parent_directories_prepared: false,
|
|
3278
|
+
error_message: status.message,
|
|
3279
|
+
recovery: configWriteRecovery(command),
|
|
3280
|
+
};
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
function configWriteErrorMessage(error) {
|
|
3284
|
+
return error instanceof Error
|
|
3285
|
+
? error.message
|
|
3286
|
+
: "public CLI could not write its local auth config";
|
|
3287
|
+
}
|
|
3288
|
+
|
|
3289
|
+
function configWriteRecovery(command) {
|
|
3290
|
+
const safeConfigPath = "$PWD/.image-skill/config.json";
|
|
3291
|
+
const baseSignupCommand = `IMAGE_SKILL_CONFIG_PATH="${safeConfigPath}" ${SIGNUP_SUGGESTED_COMMAND}`;
|
|
3292
|
+
if (command === "image-skill auth save") {
|
|
3293
|
+
return {
|
|
3294
|
+
config_path_env: "IMAGE_SKILL_CONFIG_PATH",
|
|
3295
|
+
suggested_config_path: safeConfigPath,
|
|
3296
|
+
suggested_command: `IMAGE_SKILL_CONFIG_PATH="${safeConfigPath}" image-skill auth save --json`,
|
|
3297
|
+
docs_url: "https://image-skill.com/cli.md#local-config-and-install",
|
|
3298
|
+
};
|
|
3299
|
+
}
|
|
3300
|
+
return {
|
|
3301
|
+
config_path_env: "IMAGE_SKILL_CONFIG_PATH",
|
|
3302
|
+
suggested_config_path: safeConfigPath,
|
|
3303
|
+
suggested_command: baseSignupCommand,
|
|
3304
|
+
fallback_command: `${SIGNUP_SUGGESTED_COMMAND} --show-token --no-save`,
|
|
3305
|
+
fallback_auth_method: "--token-stdin",
|
|
3306
|
+
docs_url: "https://image-skill.com/cli.md#local-config-and-install",
|
|
3307
|
+
};
|
|
3308
|
+
}
|
|
3309
|
+
|
|
3172
3310
|
function configWriteFailure(command, error) {
|
|
3173
|
-
const message =
|
|
3174
|
-
error instanceof Error
|
|
3175
|
-
? error.message
|
|
3176
|
-
: "public CLI could not write its local auth config";
|
|
3311
|
+
const message = configWriteErrorMessage(error);
|
|
3177
3312
|
return failure(
|
|
3178
3313
|
command,
|
|
3179
3314
|
9,
|
|
3180
3315
|
"PUBLIC_CLI_CONFIG_WRITE_FAILED",
|
|
3181
3316
|
`public CLI could not write auth config at ${configPath()}: ${message}`,
|
|
3182
3317
|
true,
|
|
3183
|
-
|
|
3184
|
-
suggested_command:
|
|
3185
|
-
'IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" image-skill auth save --json',
|
|
3186
|
-
docs_url: "https://image-skill.com/cli.md#local-config-and-install",
|
|
3187
|
-
},
|
|
3318
|
+
configWriteRecovery(command),
|
|
3188
3319
|
);
|
|
3189
3320
|
}
|
|
3190
3321
|
|
package/cli.md
CHANGED
|
@@ -84,18 +84,17 @@ image-skill signup --agent \
|
|
|
84
84
|
--agent-contact agent-inbox@example.com \
|
|
85
85
|
--agent-name creative-agent \
|
|
86
86
|
--runtime codex \
|
|
87
|
-
--show-token \
|
|
88
87
|
--json
|
|
89
88
|
```
|
|
90
89
|
|
|
91
|
-
Hosted signup
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
90
|
+
Hosted signup saves the restricted `isk_r_` token to the public CLI config by
|
|
91
|
+
default with `0600` permissions, so later hosted commands can authenticate from
|
|
92
|
+
config without repeating signup or carrying a raw token through prompts. Set
|
|
93
|
+
`IMAGE_SKILL_CONFIG_PATH` first when the default config home may be read-only.
|
|
94
|
+
The raw token is returned only when `--show-token` is set, and only once. Use
|
|
95
|
+
`--show-token --no-save` when the agent runtime has a separate secret store and
|
|
96
|
+
does not want local config. Do not paste tokens into prompts, logs, issue text,
|
|
97
|
+
or feedback.
|
|
99
98
|
|
|
100
99
|
In this preview contract, `--agent-contact` is an email-shaped durable contact
|
|
101
100
|
inbox for the restricted agent identity, not a requirement to find an
|
|
@@ -109,7 +108,8 @@ proof runs. `--human-email` remains accepted as a compatibility alias for
|
|
|
109
108
|
|
|
110
109
|
If the runtime has a separate secret store, it may provide the token to commands
|
|
111
110
|
as `IMAGE_SKILL_TOKEN`. Keep that value outside prompts, logs, issue text, and
|
|
112
|
-
feedback.
|
|
111
|
+
feedback. Saved config, `IMAGE_SKILL_TOKEN`, and `--token-stdin` are all
|
|
112
|
+
accepted by hosted commands; config is the default fresh-agent path.
|
|
113
113
|
|
|
114
114
|
If the agent runtime can hand secrets to a command over stdin, avoid exporting
|
|
115
115
|
the token and use `--token-stdin` instead:
|
|
@@ -139,9 +139,10 @@ auth or payment state changes. Do not run `doctor`, `models list`, `signup`,
|
|
|
139
139
|
checklist before the guide asks for them.
|
|
140
140
|
|
|
141
141
|
- `prompt_required`: rerun `data.next_command` with the real prompt.
|
|
142
|
-
- `auth_required`: run `data.next_command`,
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
- `auth_required`: run `data.next_command`, then rerun guide once. Hosted
|
|
143
|
+
signup saves auth to config by default. If the runtime intentionally used
|
|
144
|
+
`--no-save --show-token`, store the returned token and use
|
|
145
|
+
`data.auth_handoff.rerun_guide.with_env` or
|
|
145
146
|
`data.auth_handoff.rerun_guide.with_stdin`.
|
|
146
147
|
- `quota_required`: follow the payment commands in
|
|
147
148
|
`data.checks.payments.suggested_commands`, then rerun guide once.
|
|
@@ -164,9 +165,10 @@ image-skill usage quota
|
|
|
164
165
|
image-skill create --dry-run --prompt "a compact field camera on a stainless workbench"
|
|
165
166
|
```
|
|
166
167
|
|
|
167
|
-
Use `--show-token` for hosted signup only when the runtime can
|
|
168
|
-
the raw token once. For later commands,
|
|
169
|
-
|
|
168
|
+
Use `--show-token --no-save` for hosted signup only when the runtime can
|
|
169
|
+
immediately store the raw token once outside local config. For later commands,
|
|
170
|
+
saved config is the default; `IMAGE_SKILL_TOKEN` and `--token-stdin` remain
|
|
171
|
+
available for runtimes with a separate secret store.
|
|
170
172
|
`create --guide` also returns `data.auth_handoff` with copy-safe env/stdin
|
|
171
173
|
templates when auth is required or when the returned create command needs the
|
|
172
174
|
same auth context.
|
|
@@ -190,9 +192,9 @@ export PATH="$npm_config_prefix/bin:$PATH"
|
|
|
190
192
|
npx -y image-skill@latest create --guide --prompt "a compact field camera on a stainless workbench" --json
|
|
191
193
|
```
|
|
192
194
|
|
|
193
|
-
Hosted signup
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
Hosted signup saves auth state to the public CLI config by default. If the
|
|
196
|
+
runtime needs a writable compatibility config path, set
|
|
197
|
+
`IMAGE_SKILL_CONFIG_PATH` before `signup`:
|
|
196
198
|
|
|
197
199
|
```bash
|
|
198
200
|
export IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json"
|
|
@@ -200,13 +202,17 @@ npx -y image-skill@latest signup --agent \
|
|
|
200
202
|
--agent-contact agent-inbox@example.com \
|
|
201
203
|
--agent-name creative-agent \
|
|
202
204
|
--runtime codex \
|
|
203
|
-
--show-token \
|
|
204
205
|
--json
|
|
205
206
|
```
|
|
206
207
|
|
|
207
208
|
Config write failures return `PUBLIC_CLI_CONFIG_WRITE_FAILED` with a structured
|
|
208
209
|
`error.recovery.suggested_command`. Agents should follow that recovery field,
|
|
209
210
|
then rerun `create --guide` for the requested creative flow.
|
|
211
|
+
When `create --guide` reaches `auth_required`, it probes the configured auth
|
|
212
|
+
path first. If local config cannot be written, `data.next_command` uses
|
|
213
|
+
`--show-token --no-save` and `data.auth_handoff.rerun_guide.with_stdin` shows
|
|
214
|
+
the token-stdin rerun path instead of asking the agent to try a doomed saved
|
|
215
|
+
signup.
|
|
210
216
|
|
|
211
217
|
### `image-skill whoami`
|
|
212
218
|
|
|
@@ -264,6 +270,9 @@ Minimum success data shape:
|
|
|
264
270
|
"live_money": true,
|
|
265
271
|
"buyer_modes": ["hybrid", "human_only"],
|
|
266
272
|
"requires_browser": true,
|
|
273
|
+
"agent_initiated": true,
|
|
274
|
+
"agent_settleable": false,
|
|
275
|
+
"settlement_blocker": "requires human browser checkout completion",
|
|
267
276
|
"default_pack_id": "starter-500",
|
|
268
277
|
"purchase_endpoint": "/v1/credit-purchases/stripe-checkout-sessions"
|
|
269
278
|
},
|
|
@@ -276,6 +285,9 @@ Minimum success data shape:
|
|
|
276
285
|
"live_money": true,
|
|
277
286
|
"buyer_modes": ["agent_only", "hybrid"],
|
|
278
287
|
"requires_browser": false,
|
|
288
|
+
"agent_initiated": true,
|
|
289
|
+
"agent_settleable": true,
|
|
290
|
+
"settlement_blocker": null,
|
|
279
291
|
"default_pack_id": "starter-500",
|
|
280
292
|
"purchase_endpoint": "/v1/credit-purchases/stripe-x402-deposits"
|
|
281
293
|
}
|
|
@@ -299,11 +311,12 @@ curl -sS https://api.image-skill.com/v1/payment-methods
|
|
|
299
311
|
|
|
300
312
|
Lists the recommended Image Skill credit packs. Packs are the default
|
|
301
313
|
live-money buying UX because agents get obvious starter choices and avoid tiny
|
|
302
|
-
fee traps. Use the payment method catalog to choose the rail:
|
|
303
|
-
`
|
|
304
|
-
`
|
|
305
|
-
|
|
306
|
-
|
|
314
|
+
fee traps. Use the payment method catalog to choose the rail:
|
|
315
|
+
`stripe_checkout` when a human sponsor can complete Checkout, or
|
|
316
|
+
`stripe_x402.exact.usdc` when a wallet-equipped agent can settle a browserless
|
|
317
|
+
live crypto deposit attempt from returned pay-to instructions.
|
|
318
|
+
Exact custom quotes are still supported when an agent already knows the
|
|
319
|
+
required credit budget.
|
|
307
320
|
|
|
308
321
|
```bash
|
|
309
322
|
image-skill credits packs list --json
|
|
@@ -343,10 +356,9 @@ curl -sS https://api.image-skill.com/v1/credit-packs
|
|
|
343
356
|
### `image-skill credits quote`
|
|
344
357
|
|
|
345
358
|
Requests a bounded credit quote from the hosted service. Public top-ups use the
|
|
346
|
-
payment method returned by `credits methods --json`: `
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
credits.
|
|
359
|
+
payment method returned by `credits methods --json`: `stripe_checkout` for the
|
|
360
|
+
human Checkout path, or `stripe_x402.exact.usdc` for a browserless
|
|
361
|
+
action-required deposit attempt. A quote never grants credits.
|
|
350
362
|
One Image Skill credit is a stable user-facing value unit worth `$0.01`.
|
|
351
363
|
Creative operations can consume more than one credit based on the selected
|
|
352
364
|
model's provider cost and Image Skill's margin policy; inspect
|
|
@@ -422,8 +434,9 @@ Minimum success data:
|
|
|
422
434
|
```
|
|
423
435
|
|
|
424
436
|
For x402 quotes, `accepted_payment_method` is
|
|
425
|
-
`"stripe_x402.exact.usdc"
|
|
426
|
-
`
|
|
437
|
+
`"stripe_x402.exact.usdc"`. The quote does not grant credits or include pay-to
|
|
438
|
+
instructions; `credits buy --provider stripe_x402` creates the action-required
|
|
439
|
+
deposit challenge.
|
|
427
440
|
|
|
428
441
|
Hosted API equivalent:
|
|
429
442
|
|
|
@@ -440,12 +453,14 @@ Creates a payment action for a previously returned quote. Choose the provider
|
|
|
440
453
|
that matches the quote's `accepted_payment_method`.
|
|
441
454
|
|
|
442
455
|
For a `stripe_x402.exact.usdc` quote, `--provider stripe_x402` creates a
|
|
443
|
-
browserless
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
456
|
+
browserless action-required USDC deposit attempt. When the response includes
|
|
457
|
+
`stripe_x402.payable_instructions`, a wallet-equipped agent may pay the exact
|
|
458
|
+
USDC amount to `deposit_address` on Base without using a browser. The response
|
|
459
|
+
is live money when `live_money:true`. Credits are granted only after verified
|
|
460
|
+
settlement and webhook fulfillment succeeds. Deposit challenge creation itself
|
|
461
|
+
must not mutate credit balances. Stay within the delegated cap and never pass
|
|
462
|
+
wallet private keys, seed phrases, x402 payment headers, deposit client
|
|
463
|
+
secrets, card data, Stripe secrets, or provider receipts to Image Skill.
|
|
449
464
|
|
|
450
465
|
```bash
|
|
451
466
|
image-skill credits buy \
|
|
@@ -474,6 +489,21 @@ Minimum x402 action-required data:
|
|
|
474
489
|
"network": "base",
|
|
475
490
|
"token_currency": "usdc",
|
|
476
491
|
"deposit_address_present": true,
|
|
492
|
+
"payable_instructions": {
|
|
493
|
+
"kind": "stripe_crypto_deposit",
|
|
494
|
+
"network": "base",
|
|
495
|
+
"token_currency": "usdc",
|
|
496
|
+
"token_decimals": 6,
|
|
497
|
+
"token_amount": "5.00",
|
|
498
|
+
"token_amount_atomic": "5000000",
|
|
499
|
+
"amount_cents": 500,
|
|
500
|
+
"amount_usd": "5.00",
|
|
501
|
+
"deposit_address": "0x...",
|
|
502
|
+
"token_contract_address": "0x...",
|
|
503
|
+
"supported_token_currencies": ["usdc"],
|
|
504
|
+
"expires_at": "2026-05-08T20:00:00.000Z",
|
|
505
|
+
"exact_amount_required": true
|
|
506
|
+
},
|
|
477
507
|
"redacted": {
|
|
478
508
|
"payment_intent_id": "[redacted-stripe-payment-intent]",
|
|
479
509
|
"deposit_address": "[redacted-stripe-crypto-deposit-address]",
|