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 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 returns the raw `isk_r_` token only when `--show-token` is set,
89
- and only once. Store it immediately in the agent runtime secret store, then use
90
- `IMAGE_SKILL_TOKEN` or `--token-stdin` for later hosted commands. The hosted
91
- public CLI does not auto-save signup auth into the local config. Use
92
- `image-skill auth save --json` only when a runtime intentionally wants a local
93
- 0600 compatibility config.
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 --show-token --json
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
@@ -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.23";
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 --show-token --json";
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 --show-token",
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
- if (saveRequested) {
352
- return failure(
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
- 2,
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
- "hosted restricted token was returned once because --show-token was set; store it in the agent runtime secret store and use IMAGE_SKILL_TOKEN or --token-stdin for later commands",
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: false,
396
- config_path: null,
397
- reason: showToken
398
- ? "hosted signup returned the token once for the agent runtime secret store"
399
- : "hosted signup did not request a raw token; use --show-token only when the agent can immediately store it in a runtime secret store",
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((method) =>
1179
- (method.buyer_modes ?? []).some(
1180
- (mode) => mode === "agent_only" || mode === "hybrid",
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] ?? browserlessMethods[0] ?? availableMethods[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: false,
1325
- store_token_in: "agent_runtime_secret_store",
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
- return renderGuidePrefixedCommand(
1368
- input.commandPrefix,
1369
- "signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name AGENT_NAME --runtime RUNTIME_NAME --show-token --json",
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 assertConfigWritable(command) {
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
- result: configWriteFailure(command, error),
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 returns the raw `isk_r_` token only when `--show-token` is set,
92
- and only once. Store it immediately in the agent runtime secret store, then use
93
- `IMAGE_SKILL_TOKEN` or `--token-stdin` for later hosted commands. Public hosted
94
- signup does not auto-save auth into the CLI config. `--save` is local-only
95
- (`--local`) and rejected on the hosted path; `--no-save` remains accepted for
96
- older hosted instructions. Use `--show-token --no-save` when the agent runtime
97
- has a separate secret store and needs the raw token once. Do not paste tokens
98
- into prompts, logs, issue text, or feedback.
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`, store the returned token, then
143
- rerun guide once. If the runtime does not automatically inject that token,
144
- use `data.auth_handoff.rerun_guide.with_env` or
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 immediately store
168
- the raw token once. For later commands, prefer `IMAGE_SKILL_TOKEN` or
169
- `--token-stdin`; both keep tokens out of prompts and shell history.
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 does not auto-save auth state; it returns the token once with
194
- `--show-token`. If the runtime also needs a writable compatibility config path,
195
- set `IMAGE_SKILL_CONFIG_PATH` before `signup`:
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: browserless
303
- `stripe_x402.exact.usdc` when it is available for agent self-funding, or
304
- `stripe_checkout` when a human sponsor needs a Checkout handoff. Exact custom
305
- quotes are still supported when an agent already knows the required credit
306
- budget.
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`: `stripe_x402.exact.usdc`
347
- for browserless agent self-funding when it is available, or
348
- `stripe_checkout` for the human Checkout fallback. A quote never grants
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"` and the response includes redacted
426
- `quote.x402` metadata for the agent-payable deposit flow.
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 agent-payable USDC deposit challenge. The response is live money
444
- when `live_money:true`; credits are granted only after verified settlement and
445
- webhook fulfillment succeeds. Deposit challenge creation itself must not mutate
446
- credit balances. Stay within the delegated cap and never pass wallet private
447
- keys, seed phrases, x402 payment headers, deposit client secrets, or provider
448
- receipts to Image Skill.
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]",