image-skill 0.1.37 → 0.1.39

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,39 @@ 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
+ ## 0.1.39 - 2026-06-10
8
+
9
+ - Feature (growth): **`signup --discovery-source SLUG`** (or the
10
+ `IMAGE_SKILL_DISCOVERY_SOURCE` environment variable; the flag wins)
11
+ optionally records the channel where the agent discovered Image Skill — a
12
+ short slug such as `clawhub`, `skills-sh`, or `npm` (lowercase
13
+ letters/digits plus `.`/`_`/`-`, max 64 chars). Self-reported and
14
+ first-touch: the first signup that names a channel wins, and a later
15
+ re-signup never relabels it. Never required — omit it rather than guessing.
16
+
17
+ ## 0.1.38 - 2026-06-09
18
+
19
+ - Feature (auth): **signup is anonymous by default** — `signup --agent
20
+ --agent-name NAME --runtime RUNTIME` succeeds with no contact inbox.
21
+ `--agent-contact` stays optional with unchanged semantics when provided
22
+ (`--human-email` remains a compatibility alias). The guide's auth handoff no
23
+ longer asks for an inbox placeholder. Anonymous signups mint a fresh agent
24
+ identity on every call; reuse the saved config instead of re-running signup.
25
+ - Feature (auth): new **`claim request --contact INBOX --json`** attaches an
26
+ email-shaped durable contact inbox to the authenticated agent after signup —
27
+ the on-demand identity upgrade for billing, abuse, and recovery notices
28
+ (`POST /v1/agent-claims`). Re-sending the same contact is idempotent
29
+ (`data.state` is `unchanged`). Attaching a contact is not inbox-ownership
30
+ verification: `data.claim_state` stays `unclaimed` and whoami/quota report
31
+ `claim_request_state: "requested"`.
32
+ - Fix (recovery): the in-flight spend breadcrumb now survives **retryable**
33
+ failures (network reset, proxy 5xx — the maybe-already-debited cases it
34
+ exists for) and is removed only on success or a non-retryable rejection. A
35
+ network-level failure on a live create/edit now echoes the request's
36
+ `idempotency_key` in `error.recovery` so the advertised retry dedupes to one
37
+ charge. The breadcrumb filename is sanitized so an unusual
38
+ `--idempotency-key` value can never escape the `in-flight/` directory.
39
+
7
40
  ## 0.1.37 - 2026-06-09
8
41
 
9
42
  - Fix (recovery): a live `create`/`edit` now leaves a recovery handle _before_
package/README.md CHANGED
@@ -128,9 +128,14 @@ Fresh sandboxes should prefer:
128
128
 
129
129
  ```bash
130
130
  export IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json"
131
- npm_config_update_notifier=false npx -y image-skill@latest signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name creative-agent --runtime openclaw --json
131
+ npm_config_update_notifier=false npx -y image-skill@latest signup --agent --agent-name creative-agent --runtime openclaw --json
132
132
  ```
133
133
 
134
+ Signup is anonymous by default. `--agent-contact` stays optional for attaching
135
+ an email-shaped durable contact inbox at signup; otherwise attach one later
136
+ with `image-skill claim request --contact INBOX --json` when funding or
137
+ durability makes it worth having.
138
+
134
139
  If npm prefix/cache paths are read-only, keep the fresh `npx -y` path and set
135
140
  the package-manager cache, prefix, and PATH together before rerunning the guide:
136
141
 
@@ -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.37";
10
+ const VERSION = "0.1.39";
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";
@@ -29,9 +29,11 @@ const DEFAULT_CONFIG_PATH = join(
29
29
  );
30
30
  const LOCAL_WRITABLE_CONFIG_PATH = "$PWD/.image-skill/config.json";
31
31
  const SIGNUP_SUGGESTED_COMMAND =
32
- "image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json";
32
+ "image-skill signup --agent --agent-name NAME --runtime RUNTIME --json";
33
33
  const SIGNUP_CONTACT_GUIDANCE =
34
- "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
+ "Signup is anonymous by default: no contact inbox is required to get a restricted token. --agent-contact stays optional for attaching an email-shaped durable contact inbox at signup; otherwise attach one later with `image-skill claim request --contact INBOX --json` when funding or durability makes it worth having. Never invent an inbox or borrow an unrelated human email just to fill the flag. --human-email remains a compatibility alias.";
35
+ const CLAIM_REQUEST_SUGGESTED_COMMAND =
36
+ "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json";
35
37
  const HOSTED_SIGNUP_TOKEN_RETURNED_WARNING =
36
38
  "hosted restricted token is returned once; store it in the agent runtime secret store and never paste it into prompts, logs, issues, or product feedback";
37
39
  const PUBLIC_NPX_COMMAND_PREFIX =
@@ -70,7 +72,7 @@ const GUIDE_NEXT_COMMAND_PLACEHOLDERS = [
70
72
  placeholder: "AGENT_OR_OPERATOR_INBOX",
71
73
  flag: "--agent-contact",
72
74
  value_description:
73
- "Email-shaped durable contact inbox for the restricted agent identity; use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox.",
75
+ "Optional email-shaped durable contact inbox; signup is anonymous by default and `claim request --contact` attaches one later. Use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox.",
74
76
  effect_description: "email-shaped durable contact inbox",
75
77
  example: "agent-inbox@example.com",
76
78
  },
@@ -166,6 +168,8 @@ async function main(rawArgv) {
166
168
  return await trust(rest);
167
169
  case "signup":
168
170
  return await signup(rest);
171
+ case "claim":
172
+ return await claim(rest);
169
173
  case "auth":
170
174
  return await auth(rest);
171
175
  case "whoami":
@@ -278,12 +282,13 @@ function commandHelpByKey(key) {
278
282
  "": {
279
283
  command: "help",
280
284
  usage:
281
- "image-skill <doctor|trust|signup|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
285
+ "image-skill <doctor|trust|signup|claim|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
282
286
  docs_url: "https://image-skill.com/cli.md",
283
287
  commands: [
284
288
  "doctor",
285
289
  "trust",
286
- "signup --agent --agent-contact --agent-name NAME --runtime RUNTIME",
290
+ "signup --agent --agent-name NAME --runtime RUNTIME",
291
+ "claim request --contact INBOX",
287
292
  "whoami",
288
293
  "usage quota",
289
294
  "quota",
@@ -334,15 +339,30 @@ function commandHelpByKey(key) {
334
339
  signup: {
335
340
  command: "image-skill signup help",
336
341
  usage:
337
- "image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json",
342
+ "image-skill signup --agent --agent-name NAME --runtime RUNTIME --json",
338
343
  docs_url: "https://image-skill.com/cli.md#image-skill-signup-agent",
339
- required_flags: [
340
- "--agent",
344
+ required_flags: ["--agent", "--agent-name", "--runtime"],
345
+ optional_flags: [
341
346
  "--agent-contact",
342
- "--agent-name",
343
- "--runtime",
347
+ "--show-token",
348
+ "--no-save",
349
+ "--token-stdin",
344
350
  ],
345
- optional_flags: ["--show-token", "--no-save", "--token-stdin"],
351
+ },
352
+ claim: {
353
+ command: "image-skill claim help",
354
+ usage:
355
+ "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
356
+ docs_url: "https://image-skill.com/cli.md#image-skill-claim-request",
357
+ subcommands: ["request"],
358
+ },
359
+ "claim request": {
360
+ command: "image-skill claim request help",
361
+ usage:
362
+ "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
363
+ docs_url: "https://image-skill.com/cli.md#image-skill-claim-request",
364
+ required_flags: ["--contact"],
365
+ optional_flags: ["--token-stdin"],
346
366
  },
347
367
  auth: {
348
368
  command: "image-skill auth help",
@@ -739,21 +759,26 @@ async function signup(argv) {
739
759
  contact.message,
740
760
  false,
741
761
  {
742
- required_flags: ["--agent-contact", "--agent-name", "--runtime"],
762
+ required_flags: ["--agent-name", "--runtime"],
763
+ optional_flags: ["--agent-contact", "--discovery-source"],
743
764
  suggested_command: SIGNUP_SUGGESTED_COMMAND,
744
765
  docs_url: "https://image-skill.com/cli.md#image-skill-signup-agent",
745
766
  },
746
767
  );
747
768
  }
748
- if (contact.value === null || agentName === null || runtime === null) {
769
+ // Anonymous signup is the default (decision 0030): only name + runtime are
770
+ // required. A contact stays optional here and attachable later via
771
+ // `claim request --contact INBOX`.
772
+ if (agentName === null || runtime === null) {
749
773
  return failure(
750
774
  "image-skill signup",
751
775
  2,
752
776
  "INVALID_ARGUMENTS",
753
- `signup requires --agent-contact, --agent-name, and --runtime. ${SIGNUP_CONTACT_GUIDANCE}`,
777
+ `signup requires --agent-name and --runtime. ${SIGNUP_CONTACT_GUIDANCE}`,
754
778
  false,
755
779
  {
756
- required_flags: ["--agent-contact", "--agent-name", "--runtime"],
780
+ required_flags: ["--agent-name", "--runtime"],
781
+ optional_flags: ["--agent-contact", "--discovery-source"],
757
782
  accepted_aliases: {
758
783
  "--human-email": "--agent-contact",
759
784
  },
@@ -778,16 +803,26 @@ async function signup(argv) {
778
803
  return configReady.result;
779
804
  }
780
805
  }
806
+ // Discovery-source attribution (#1814): self-reported channel slug from
807
+ // --discovery-source or IMAGE_SKILL_DISCOVERY_SOURCE (flag wins). Omitted
808
+ // entirely when absent — never guessed, never required.
809
+ const discoverySource =
810
+ flagString(args, "discovery-source")?.trim() ||
811
+ process.env.IMAGE_SKILL_DISCOVERY_SOURCE?.trim() ||
812
+ null;
781
813
  const result = await apiRequest({
782
814
  command: "image-skill signup",
783
815
  method: "POST",
784
816
  apiBaseUrl: apiBase(args),
785
817
  path: "/v1/agent-signups",
786
818
  body: {
787
- agent_contact: contact.value,
819
+ ...(contact.value === null ? {} : { agent_contact: contact.value }),
788
820
  agent_name: agentName,
789
821
  runtime,
790
822
  return_token: shouldSave || showToken,
823
+ ...(discoverySource === null || discoverySource === ""
824
+ ? {}
825
+ : { discovery_source: discoverySource }),
791
826
  },
792
827
  });
793
828
  result.envelope.command = "image-skill signup";
@@ -870,6 +905,55 @@ async function signup(argv) {
870
905
  return result;
871
906
  }
872
907
 
908
+ // Claim request (decision 0030): attach an email-shaped durable contact to the
909
+ // authenticated agent after an (often anonymous) signup — the on-demand
910
+ // identity upgrade for funding notices and durability. claim_state stays
911
+ // unclaimed; attaching a contact is not inbox-ownership verification.
912
+ async function claim(argv) {
913
+ const [subcommand, ...rest] = argv;
914
+ if (subcommand !== "request") {
915
+ return failure(
916
+ "image-skill claim",
917
+ 2,
918
+ "INVALID_ARGUMENTS",
919
+ "claim requires the request subcommand",
920
+ false,
921
+ {
922
+ suggested_command: CLAIM_REQUEST_SUGGESTED_COMMAND,
923
+ docs_url: "https://image-skill.com/cli.md#image-skill-claim-request",
924
+ },
925
+ );
926
+ }
927
+ const args = parseArgs(rest);
928
+ const contact = flagString(args, "contact");
929
+ if (contact === null || contact.trim().length === 0) {
930
+ return failure(
931
+ "image-skill claim request",
932
+ 2,
933
+ "INVALID_ARGUMENTS",
934
+ "claim request requires --contact, an email-shaped durable contact inbox (agent-owned when available, otherwise an operator, team, or sponsor inbox)",
935
+ false,
936
+ {
937
+ required_flags: ["--contact"],
938
+ suggested_command: CLAIM_REQUEST_SUGGESTED_COMMAND,
939
+ docs_url: "https://image-skill.com/cli.md#image-skill-claim-request",
940
+ },
941
+ );
942
+ }
943
+ const token = await resolveToken(args);
944
+ if (!token.ok) {
945
+ return token.result;
946
+ }
947
+ return apiRequest({
948
+ command: "image-skill claim request",
949
+ method: "POST",
950
+ apiBaseUrl: apiBase(args),
951
+ path: "/v1/agent-claims",
952
+ token: token.token,
953
+ body: { contact: contact.trim().toLowerCase() },
954
+ });
955
+ }
956
+
873
957
  function rewriteSignupContactFailure(result) {
874
958
  const error = result.envelope.error;
875
959
  if (
@@ -882,7 +966,7 @@ function rewriteSignupContactFailure(result) {
882
966
  "human_email is a legacy alias for agent_contact and must be an email-shaped durable contact inbox")
883
967
  ) {
884
968
  error.message =
885
- "preview signup currently requires --agent-contact to be an email-shaped durable contact inbox; it does not need to belong to an individual human";
969
+ "--agent-contact, when provided, must be an email-shaped durable contact inbox; signup itself is anonymous by default, so omit the flag entirely if no durable inbox exists";
886
970
  error.recovery = {
887
971
  ...(error.recovery ?? {}),
888
972
  suggested_command: SIGNUP_SUGGESTED_COMMAND,
@@ -2912,8 +2996,11 @@ function renderGuideCommand(
2912
2996
  }
2913
2997
 
2914
2998
  function renderGuideSignupCommand(input) {
2999
+ // Anonymous signup (decision 0030): no contact placeholder in the handoff —
3000
+ // the agent still substitutes its own name/runtime, but no longer has to
3001
+ // find (or invent) an inbox before it can authenticate.
2915
3002
  const signupCommand = [
2916
- "signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name AGENT_NAME --runtime RUNTIME_NAME",
3003
+ "signup --agent --agent-name AGENT_NAME --runtime RUNTIME_NAME",
2917
3004
  ...(input.apiBaseUrl === null
2918
3005
  ? []
2919
3006
  : ["--api-base-url", shellQuote(input.apiBaseUrl)]),
@@ -3182,7 +3269,7 @@ async function create(argv) {
3182
3269
  accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
3183
3270
  },
3184
3271
  });
3185
- await clearInFlightSpend(inFlight);
3272
+ await clearInFlightSpendForResult(inFlight, result);
3186
3273
  return result;
3187
3274
  }
3188
3275
 
@@ -3307,7 +3394,7 @@ async function edit(argv) {
3307
3394
  accept_unknown_cost: flagBool(args, "accept-unknown-cost"),
3308
3395
  },
3309
3396
  });
3310
- await clearInFlightSpend(inFlight);
3397
+ await clearInFlightSpendForResult(inFlight, result);
3311
3398
  return result;
3312
3399
  }
3313
3400
 
@@ -4415,6 +4502,16 @@ function recoverCommandFor(operation, idempotencyKey) {
4415
4502
  return `image-skill ${operation} --idempotency-key ${idempotencyKey} <same arguments> --json`;
4416
4503
  }
4417
4504
 
4505
+ // The breadcrumb filename derives from the (possibly agent-supplied)
4506
+ // idempotency key; keep it to a safe charset so a hostile or accidental key
4507
+ // like "../config" can never escape the in-flight directory or collide with
4508
+ // the CLI's own config file.
4509
+ function inFlightSpendFileName(idempotencyKey) {
4510
+ const safe = String(idempotencyKey).replace(/[^A-Za-z0-9._-]/g, "_");
4511
+ const trimmed = safe.replace(/^\.+/, "").slice(0, 120);
4512
+ return `${trimmed.length === 0 ? "key" : trimmed}.json`;
4513
+ }
4514
+
4418
4515
  async function recordInFlightSpend(input) {
4419
4516
  const { command, operation, idempotencyKey, argv } = input;
4420
4517
  const recoverCommand = recoverCommandFor(operation, idempotencyKey);
@@ -4425,7 +4522,7 @@ async function recordInFlightSpend(input) {
4425
4522
  // or a later session can find an orphaned spend even when the transcript is
4426
4523
  // gone).
4427
4524
  const dir = inFlightSpendDir();
4428
- const path = join(dir, `${idempotencyKey}.json`);
4525
+ const path = join(dir, inFlightSpendFileName(idempotencyKey));
4429
4526
  let recordedPath = null;
4430
4527
  try {
4431
4528
  await mkdir(dir, { recursive: true });
@@ -4481,6 +4578,26 @@ async function clearInFlightSpend(path) {
4481
4578
  }
4482
4579
  }
4483
4580
 
4581
+ // Clear the breadcrumb only when the spend's fate is KNOWN: a success, or a
4582
+ // non-retryable failure (4xx — the server rejected it without charging). A
4583
+ // retryable failure (network reset, proxy 5xx) is exactly the
4584
+ // maybe-already-debited case the breadcrumb exists for, so it must survive
4585
+ // for a later session or operator to find.
4586
+ async function clearInFlightSpendForResult(path, result) {
4587
+ if (path === null || path === undefined) {
4588
+ return;
4589
+ }
4590
+ const envelope = result?.envelope;
4591
+ const retryableFailure =
4592
+ envelope !== undefined &&
4593
+ envelope.ok !== true &&
4594
+ envelope.error?.retryable === true;
4595
+ if (retryableFailure) {
4596
+ return;
4597
+ }
4598
+ await clearInFlightSpend(path);
4599
+ }
4600
+
4484
4601
  async function apiRequest(input) {
4485
4602
  const url = new URL(input.path, ensureTrailingSlash(input.apiBaseUrl));
4486
4603
  try {
@@ -4512,17 +4629,32 @@ async function apiRequest(input) {
4512
4629
  envelope,
4513
4630
  };
4514
4631
  } catch (error) {
4632
+ // Money integrity (#1789 review): a network failure can land AFTER the
4633
+ // request was sent — a live create/edit may already have reserved a
4634
+ // credit. Echo the request's idempotency key in-band so the recovery
4635
+ // re-run dedupes to one charge instead of pointing at doctor alone.
4636
+ const recovery =
4637
+ isCreateOrEditCommand(input.command) &&
4638
+ input.body !== undefined &&
4639
+ typeof input.body.idempotency_key === "string"
4640
+ ? {
4641
+ suggested_command: `${input.command} --idempotency-key ${input.body.idempotency_key} --json`,
4642
+ idempotency_key: input.body.idempotency_key,
4643
+ docs_url: "https://image-skill.com/cli.md",
4644
+ retry_after_seconds: 30,
4645
+ }
4646
+ : {
4647
+ suggested_command: "image-skill doctor --json",
4648
+ docs_url: "https://image-skill.com/cli.md",
4649
+ retry_after_seconds: 30,
4650
+ };
4515
4651
  return failure(
4516
4652
  input.command,
4517
4653
  7,
4518
4654
  "HOSTED_API_REQUEST_FAILED",
4519
4655
  error instanceof Error ? error.message : "hosted API request failed",
4520
4656
  true,
4521
- {
4522
- suggested_command: "image-skill doctor --json",
4523
- docs_url: "https://image-skill.com/cli.md",
4524
- retry_after_seconds: 30,
4525
- },
4657
+ recovery,
4526
4658
  );
4527
4659
  }
4528
4660
  }
package/cli.md CHANGED
@@ -82,11 +82,11 @@ than omitting the field.
82
82
 
83
83
  ### `image-skill signup --agent`
84
84
 
85
- Bootstraps restricted agent access.
85
+ Bootstraps restricted agent access. Signup is anonymous by default: no contact
86
+ inbox is required to get a restricted token.
86
87
 
87
88
  ```bash
88
89
  image-skill signup --agent \
89
- --agent-contact agent-inbox@example.com \
90
90
  --agent-name creative-agent \
91
91
  --runtime codex \
92
92
  --json
@@ -104,16 +104,47 @@ The raw token is returned only when `--show-token` is set, and only once. Use
104
104
  does not want local config. Do not paste tokens into prompts, logs, issue text,
105
105
  or feedback.
106
106
 
107
- In this preview contract, `--agent-contact` is an email-shaped durable contact
108
- inbox for the restricted agent identity, not a requirement to find an
109
- individual human. Use an agent-owned inbox when available; otherwise use an
110
- operator, team, or sponsor inbox that can receive future claim, billing, or
111
- abuse notices. Do not block waiting for a person, invent a person, or use a
112
- throwaway inbox.
107
+ `--agent-contact` is an email-shaped durable contact inbox and it is optional
108
+ at signup: provide it when a durable inbox already exists, or attach one later
109
+ with `image-skill claim request --contact INBOX --json` when funding or
110
+ durability makes it worth having. Use an agent-owned inbox when available;
111
+ otherwise use an operator, team, or sponsor inbox that can receive future
112
+ claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated
113
+ human email just to fill the flag — omit it instead.
113
114
  `example.invalid` addresses are only appropriate inside documented harness or
114
115
  proof runs. `--human-email` remains accepted as a compatibility alias for
115
116
  `--agent-contact`.
116
117
 
118
+ Anonymous signups mint a fresh agent identity on every call, so re-running
119
+ signup without a contact creates a new agent instead of returning the existing
120
+ one; rely on the saved config to reuse the identity you already have.
121
+
122
+ `--discovery-source SLUG` (or the `IMAGE_SKILL_DISCOVERY_SOURCE` environment
123
+ variable; the flag wins) optionally records where you discovered Image Skill —
124
+ a short channel slug such as `clawhub`, `skills-sh`, or `npm` (lowercase
125
+ letters/digits plus `.`/`_`/`-`, max 64 chars). It is self-reported,
126
+ first-touch (a later re-signup never relabels it), and never required: omit it
127
+ when you do not know the channel rather than guessing.
128
+
129
+ ### `image-skill claim request`
130
+
131
+ Attaches an email-shaped durable contact inbox to the authenticated agent —
132
+ the on-demand identity upgrade after an anonymous signup. Use it when funding
133
+ or durability makes a reachable contact worth having (billing, abuse, and
134
+ recovery notices).
135
+
136
+ ```bash
137
+ image-skill claim request \
138
+ --contact agent-inbox@example.com \
139
+ --json
140
+ ```
141
+
142
+ Re-running with the same contact is idempotent (`data.state` is `unchanged`);
143
+ a different contact replaces the previous one (`data.state` is `attached`).
144
+ Attaching a contact is not inbox-ownership verification: `data.claim_state`
145
+ stays `unclaimed` and `data.claim_request_state` reports `requested`. The
146
+ response echoes only a redacted form of the contact.
147
+
117
148
  If the runtime has a separate secret store, it may provide the token to commands
118
149
  as `IMAGE_SKILL_TOKEN`. Keep that value outside prompts, logs, issue text, and
119
150
  feedback. Saved config, `IMAGE_SKILL_TOKEN`, and `--token-stdin` are all
@@ -276,7 +307,6 @@ runtime needs a writable compatibility config path, set
276
307
  ```bash
277
308
  export IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json"
278
309
  npm_config_update_notifier=false npx -y image-skill@latest signup --agent \
279
- --agent-contact agent-inbox@example.com \
280
310
  --agent-name creative-agent \
281
311
  --runtime codex \
282
312
  --json
package/commands.json CHANGED
@@ -27,6 +27,14 @@
27
27
  "mutation": true,
28
28
  "spend": false
29
29
  },
30
+ {
31
+ "id": "claim",
32
+ "docs_anchor": "image-skill-claim-request",
33
+ "surface": "hosted_cli",
34
+ "mutation": true,
35
+ "spend": false,
36
+ "subcommands": ["request"]
37
+ },
30
38
  {
31
39
  "id": "whoami",
32
40
  "docs_anchor": "image-skill-whoami",
@@ -140,12 +148,13 @@
140
148
  "key": "",
141
149
  "help": {
142
150
  "command": "help",
143
- "usage": "image-skill <doctor|trust|signup|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
151
+ "usage": "image-skill <doctor|trust|signup|claim|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
144
152
  "docs_url": "https://image-skill.com/cli.md",
145
153
  "commands": [
146
154
  "doctor",
147
155
  "trust",
148
- "signup --agent --agent-contact --agent-name NAME --runtime RUNTIME",
156
+ "signup --agent --agent-name NAME --runtime RUNTIME",
157
+ "claim request --contact INBOX",
149
158
  "whoami",
150
159
  "usage quota",
151
160
  "quota",
@@ -202,15 +211,34 @@
202
211
  "key": "signup",
203
212
  "help": {
204
213
  "command": "image-skill signup help",
205
- "usage": "image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json",
214
+ "usage": "image-skill signup --agent --agent-name NAME --runtime RUNTIME --json",
206
215
  "docs_url": "https://image-skill.com/cli.md#image-skill-signup-agent",
207
- "required_flags": [
208
- "--agent",
216
+ "required_flags": ["--agent", "--agent-name", "--runtime"],
217
+ "optional_flags": [
209
218
  "--agent-contact",
210
- "--agent-name",
211
- "--runtime"
212
- ],
213
- "optional_flags": ["--show-token", "--no-save", "--token-stdin"]
219
+ "--show-token",
220
+ "--no-save",
221
+ "--token-stdin"
222
+ ]
223
+ }
224
+ },
225
+ {
226
+ "key": "claim",
227
+ "help": {
228
+ "command": "image-skill claim help",
229
+ "usage": "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
230
+ "docs_url": "https://image-skill.com/cli.md#image-skill-claim-request",
231
+ "subcommands": ["request"]
232
+ }
233
+ },
234
+ {
235
+ "key": "claim request",
236
+ "help": {
237
+ "command": "image-skill claim request help",
238
+ "usage": "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
239
+ "docs_url": "https://image-skill.com/cli.md#image-skill-claim-request",
240
+ "required_flags": ["--contact"],
241
+ "optional_flags": ["--token-stdin"]
214
242
  }
215
243
  },
216
244
  {
package/llms.txt CHANGED
@@ -61,7 +61,7 @@ First-run guide loop:
61
61
  1. Run image-skill create --guide --prompt PROMPT. This is the canonical fresh-agent entrypoint and the only required first command. It performs read-only hosted reachability, executable model availability, auth/quota, and payment rail checks and returns data.stage, data.next_command, data.guide_warning, data.next_command_effect, data.auth_ready, data.no_spend_evaluation, data.no_spend_next_command, data.no_spend_next_command_effect, data.self_fund_next_command, data.self_fund_handoff, data.auth_handoff, data.escape_hatches, and data.mutation. Guide mode must report provider_call: false, hosted_create: false, hosted_signup: false, payment_object: false, credit_debit: false, and media_write: false.
62
62
  2. Read data.guide_warning, then follow data.next_command when its next_command_safety is safe for the current spend policy. Do not run doctor, models list, signup, whoami, quota, dry-run, or payment commands as a setup checklist before the guide asks for them.
63
63
  3. If data.stage is prompt_required, rerun data.next_command with the real prompt.
64
- 4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. The signup command uses --agent-contact as an email-shaped durable contact inbox for the restricted agent identity, not as a requirement to find an individual human. Hosted signup returns the raw restricted token only when --show-token is set, and only once. 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. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
64
+ 4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. Signup is anonymous by default: no contact inbox is required to get a restricted token. The optional --agent-contact flag takes an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find an individual human; attach one later with image-skill claim request --contact INBOX --json when funding or durability makes it worth having. Hosted signup returns the raw restricted token only when --show-token is set, and only once. When providing a contact, use an agent-owned inbox when available; otherwise use an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. Anonymous signups mint a fresh agent identity on every call; reuse the saved config instead of re-running signup. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
65
65
  5. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
66
66
  6. If data.stage is ready_to_create, data.next_command is the first bounded live create. data.guide_warning.next_command_safety must be live_media_create_credit_debit, data.guide_warning.no_spend_safe must be false, data.guide_warning.spend_required must be true, and data.guide_warning.recommended_command_field must be recommended_no_spend_command. data.auth_ready.ready and data.auth_ready.next_command_auth_ready must be true; data.auth_ready.next_command_requires_auth must be true, and the command can reuse saved config, IMAGE_SKILL_TOKEN, or --token-stdin context without exposing a raw token. data.next_command_effect.label must be live_media_create_credit_debit and its provider_call, hosted_create, credit_debit, and media_write flags are true. data.no_spend_evaluation.stop_here must be true, data.no_spend_evaluation.next_command_is_live_create must be true, and data.no_spend_evaluation.recommended_command_field must be recommended_no_spend_command. Run data.next_command only when media spend is allowed. In no-spend evaluations, or when you only need to prove readiness without media/provider work, stop before data.next_command and run data.recommended_no_spend_command instead. data.recommended_no_spend_command must equal data.no_spend_next_command. data.no_spend_next_command_effect.label must be dry_run_planned_job_no_provider_call_no_credit_debit_no_media_write: no_spend, hosted_create_dry_run, planned_job, and plan_receipt are true; activity_event is job.planned; provider_call, credit_debit, and media_write are false. This dry-run may create a recoverable planned job/activity receipt but no provider execution, debit, downloadable asset, or media write. If the guide authenticated from env or stdin, prefer data.auth_handoff.next_command.with_env or data.auth_handoff.next_command.with_stdin so auth follows the live create. In guide cost output, cost.estimated_usd_per_image and cost.estimated_debit_usd_per_image are the Image Skill debit dollars for one output; cost.estimated_provider_usd_per_image is only the upstream provider estimate. Use the guide's returned max_estimated_usd_per_image because it is sized to the credit debit the agent funds. Add --output-count N only after models show confirms the selected create model supports more than one output; credit_pricing.credits_required is the total debit across outputs, while max_estimated_usd_per_image remains a per-image Image Skill debit guard.
67
67
  7. After create, use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, and asset links to cite.
@@ -71,7 +71,8 @@ Manual escape hatches are not prerequisites. Use image-skill doctor, image-skill
71
71
 
72
72
  Core commands:
73
73
  - image-skill doctor --json
74
- - image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json
74
+ - image-skill signup --agent --agent-name NAME --runtime RUNTIME --json
75
+ - image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json
75
76
  - image-skill whoami --json
76
77
  - image-skill usage quota --json
77
78
  - image-skill quota --json (compatibility alias)
@@ -110,7 +111,8 @@ Core commands:
110
111
  - image-skill feedback create --type user_feedback --title TITLE --body BODY --command COMMAND --expected EXPECTED --actual ACTUAL --proof-needed PROOF --surface cli,docs --evidence trace:TRACE_ID --severity medium --confidence high --next-state watch --json
111
112
 
112
113
  Hosted API endpoints:
113
- - POST https://api.image-skill.com/v1/agent-signups creates or rotates a restricted unclaimed agent token. Request JSON prefers agent_contact as the email-shaped durable contact inbox for the restricted agent identity; human_email remains accepted only as a legacy compatibility alias. The contact is not a requirement that an autonomous agent stop until a specific human is present. Direct API callers receive the raw token once as data.token only when request.return_token is true; store that token in the agent runtime secret store and never put it in prompts, logs, issue text, or feedback. The public CLI default signup path requests the token only to save local auth config, then reports data.token:null and data.auth_handoff.status:saved_config_ready so no raw token copy step is required.
114
+ - POST https://api.image-skill.com/v1/agent-signups creates or rotates a restricted unclaimed agent token. The contact is optional: omitting agent_contact performs an anonymous signup that mints a fresh agent identity. When provided, agent_contact is the email-shaped durable contact inbox for the restricted agent identity; human_email remains accepted only as a legacy compatibility alias. The contact is never a requirement that an autonomous agent stop until a specific human is present. Direct API callers receive the raw token once as data.token only when request.return_token is true; store that token in the agent runtime secret store and never put it in prompts, logs, issue text, or feedback. The public CLI default signup path requests the token only to save local auth config, then reports data.token:null and data.auth_handoff.status:saved_config_ready so no raw token copy step is required.
115
+ - POST https://api.image-skill.com/v1/agent-claims attaches an email-shaped durable contact inbox to the authenticated agent after an (often anonymous) signup. Request JSON is {"contact": INBOX}. Re-sending the same contact is idempotent (data.state unchanged); a different contact replaces the previous one (data.state attached). Attaching a contact is not inbox-ownership verification: data.claim_state stays unclaimed and data.claim_request_state reports requested. The response echoes only a redacted contact.
114
116
  - GET https://api.image-skill.com/v1/whoami returns durable hosted identity for Authorization: Bearer TOKEN.
115
117
  - GET https://api.image-skill.com/v1/quota returns durable hosted quota for Authorization: Bearer TOKEN.
116
118
  - GET https://api.image-skill.com/v1/payment-methods returns the no-auth action-only payment rail catalog. It tells agents which currently usable rails are available, whether live money can move, buyer modes (agent_only, hybrid, human_only), browser requirements, agent_initiated, agent_settleable, settlement_blocker, limits, endpoint paths, and recovery commands. Planned, watch-only, fake, and private harness rails are intentionally omitted.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "image-skill",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "description": "Zero-setup durable creative-media CLI for agents (image + video + audio + 3D): guide-first creation, model and cost inspection, owned URLs, JSON recovery, payments, reusable assets, and feedback.",
5
5
  "type": "module",
6
6
  "private": false,
package/skill.md CHANGED
@@ -118,18 +118,17 @@ edit many assets x video -> image-skill create --model fal.ltx-v
118
118
 
119
119
  ## First real run
120
120
 
121
- Hosted signup saves a restricted token to the public CLI config by default. The token is created by Image Skill and is not a user-supplied provider credential. The raw token is only returned once and only with `--show-token`; pass `--no-save --show-token` when the runtime has its own secret store.
121
+ Hosted signup saves a restricted token to the public CLI config by default. The token is created by Image Skill and is not a user-supplied provider credential. The raw token is only returned once and only with `--show-token`; pass `--no-save --show-token` when the runtime has its own secret store. Signup is anonymous by default: no contact inbox is required.
122
122
 
123
123
  ```bash
124
124
  image-skill signup --agent \
125
- --agent-contact AGENT_OR_OPERATOR_INBOX \
126
125
  --agent-name AGENT_NAME \
127
126
  --runtime RUNTIME_NAME
128
127
  image-skill whoami
129
128
  image-skill usage quota
130
129
  ```
131
130
 
132
- `--agent-contact` means an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find a specific human. Use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. `example.invalid` is only appropriate in documented harness or proof runs. `--human-email` remains an accepted compatibility alias.
131
+ `--agent-contact` is optional at signup. It means an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find a specific human. Attach one later with `image-skill claim request --contact INBOX --json` when funding or durability makes it worth having (billing, abuse, and recovery notices). Use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. `example.invalid` is only appropriate in documented harness or proof runs. `--human-email` remains an accepted compatibility alias. Anonymous signups mint a fresh agent identity on every call; rely on the saved config to reuse the identity you already have.
133
132
 
134
133
  If the runtime supports stdin secret handoff, prefer `--token-stdin` over `--token` for `whoami`, `usage quota`, `create`, and `feedback create`. The guide returns `data.auth_handoff` with copy-safe env and stdin command templates so the token never lands in prompts, logs, or feedback.
135
134
 
@@ -118,18 +118,17 @@ edit many assets x video -> image-skill create --model fal.ltx-v
118
118
 
119
119
  ## First real run
120
120
 
121
- Hosted signup saves a restricted token to the public CLI config by default. The token is created by Image Skill and is not a user-supplied provider credential. The raw token is only returned once and only with `--show-token`; pass `--no-save --show-token` when the runtime has its own secret store.
121
+ Hosted signup saves a restricted token to the public CLI config by default. The token is created by Image Skill and is not a user-supplied provider credential. The raw token is only returned once and only with `--show-token`; pass `--no-save --show-token` when the runtime has its own secret store. Signup is anonymous by default: no contact inbox is required.
122
122
 
123
123
  ```bash
124
124
  image-skill signup --agent \
125
- --agent-contact AGENT_OR_OPERATOR_INBOX \
126
125
  --agent-name AGENT_NAME \
127
126
  --runtime RUNTIME_NAME
128
127
  image-skill whoami
129
128
  image-skill usage quota
130
129
  ```
131
130
 
132
- `--agent-contact` means an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find a specific human. Use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. `example.invalid` is only appropriate in documented harness or proof runs. `--human-email` remains an accepted compatibility alias.
131
+ `--agent-contact` is optional at signup. It means an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find a specific human. Attach one later with `image-skill claim request --contact INBOX --json` when funding or durability makes it worth having (billing, abuse, and recovery notices). Use an agent-owned inbox when available, otherwise an operator, team, or sponsor inbox. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. `example.invalid` is only appropriate in documented harness or proof runs. `--human-email` remains an accepted compatibility alias. Anonymous signups mint a fresh agent identity on every call; rely on the saved config to reuse the identity you already have.
133
132
 
134
133
  If the runtime supports stdin secret handoff, prefer `--token-stdin` over `--token` for `whoami`, `usage quota`, `create`, and `feedback create`. The guide returns `data.auth_handoff` with copy-safe env and stdin command templates so the token never lands in prompts, logs, or feedback.
135
134
 
@@ -82,11 +82,11 @@ than omitting the field.
82
82
 
83
83
  ### `image-skill signup --agent`
84
84
 
85
- Bootstraps restricted agent access.
85
+ Bootstraps restricted agent access. Signup is anonymous by default: no contact
86
+ inbox is required to get a restricted token.
86
87
 
87
88
  ```bash
88
89
  image-skill signup --agent \
89
- --agent-contact agent-inbox@example.com \
90
90
  --agent-name creative-agent \
91
91
  --runtime codex \
92
92
  --json
@@ -104,16 +104,47 @@ The raw token is returned only when `--show-token` is set, and only once. Use
104
104
  does not want local config. Do not paste tokens into prompts, logs, issue text,
105
105
  or feedback.
106
106
 
107
- In this preview contract, `--agent-contact` is an email-shaped durable contact
108
- inbox for the restricted agent identity, not a requirement to find an
109
- individual human. Use an agent-owned inbox when available; otherwise use an
110
- operator, team, or sponsor inbox that can receive future claim, billing, or
111
- abuse notices. Do not block waiting for a person, invent a person, or use a
112
- throwaway inbox.
107
+ `--agent-contact` is an email-shaped durable contact inbox and it is optional
108
+ at signup: provide it when a durable inbox already exists, or attach one later
109
+ with `image-skill claim request --contact INBOX --json` when funding or
110
+ durability makes it worth having. Use an agent-owned inbox when available;
111
+ otherwise use an operator, team, or sponsor inbox that can receive future
112
+ claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated
113
+ human email just to fill the flag — omit it instead.
113
114
  `example.invalid` addresses are only appropriate inside documented harness or
114
115
  proof runs. `--human-email` remains accepted as a compatibility alias for
115
116
  `--agent-contact`.
116
117
 
118
+ Anonymous signups mint a fresh agent identity on every call, so re-running
119
+ signup without a contact creates a new agent instead of returning the existing
120
+ one; rely on the saved config to reuse the identity you already have.
121
+
122
+ `--discovery-source SLUG` (or the `IMAGE_SKILL_DISCOVERY_SOURCE` environment
123
+ variable; the flag wins) optionally records where you discovered Image Skill —
124
+ a short channel slug such as `clawhub`, `skills-sh`, or `npm` (lowercase
125
+ letters/digits plus `.`/`_`/`-`, max 64 chars). It is self-reported,
126
+ first-touch (a later re-signup never relabels it), and never required: omit it
127
+ when you do not know the channel rather than guessing.
128
+
129
+ ### `image-skill claim request`
130
+
131
+ Attaches an email-shaped durable contact inbox to the authenticated agent —
132
+ the on-demand identity upgrade after an anonymous signup. Use it when funding
133
+ or durability makes a reachable contact worth having (billing, abuse, and
134
+ recovery notices).
135
+
136
+ ```bash
137
+ image-skill claim request \
138
+ --contact agent-inbox@example.com \
139
+ --json
140
+ ```
141
+
142
+ Re-running with the same contact is idempotent (`data.state` is `unchanged`);
143
+ a different contact replaces the previous one (`data.state` is `attached`).
144
+ Attaching a contact is not inbox-ownership verification: `data.claim_state`
145
+ stays `unclaimed` and `data.claim_request_state` reports `requested`. The
146
+ response echoes only a redacted form of the contact.
147
+
117
148
  If the runtime has a separate secret store, it may provide the token to commands
118
149
  as `IMAGE_SKILL_TOKEN`. Keep that value outside prompts, logs, issue text, and
119
150
  feedback. Saved config, `IMAGE_SKILL_TOKEN`, and `--token-stdin` are all
@@ -276,7 +307,6 @@ runtime needs a writable compatibility config path, set
276
307
  ```bash
277
308
  export IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json"
278
309
  npm_config_update_notifier=false npx -y image-skill@latest signup --agent \
279
- --agent-contact agent-inbox@example.com \
280
310
  --agent-name creative-agent \
281
311
  --runtime codex \
282
312
  --json
@@ -27,6 +27,14 @@
27
27
  "mutation": true,
28
28
  "spend": false
29
29
  },
30
+ {
31
+ "id": "claim",
32
+ "docs_anchor": "image-skill-claim-request",
33
+ "surface": "hosted_cli",
34
+ "mutation": true,
35
+ "spend": false,
36
+ "subcommands": ["request"]
37
+ },
30
38
  {
31
39
  "id": "whoami",
32
40
  "docs_anchor": "image-skill-whoami",
@@ -140,12 +148,13 @@
140
148
  "key": "",
141
149
  "help": {
142
150
  "command": "help",
143
- "usage": "image-skill <doctor|trust|signup|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
151
+ "usage": "image-skill <doctor|trust|signup|claim|whoami|usage|quota|credits|capabilities|models|create|upload|edit|assets|jobs|activity|feedback> --json",
144
152
  "docs_url": "https://image-skill.com/cli.md",
145
153
  "commands": [
146
154
  "doctor",
147
155
  "trust",
148
- "signup --agent --agent-contact --agent-name NAME --runtime RUNTIME",
156
+ "signup --agent --agent-name NAME --runtime RUNTIME",
157
+ "claim request --contact INBOX",
149
158
  "whoami",
150
159
  "usage quota",
151
160
  "quota",
@@ -202,15 +211,34 @@
202
211
  "key": "signup",
203
212
  "help": {
204
213
  "command": "image-skill signup help",
205
- "usage": "image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json",
214
+ "usage": "image-skill signup --agent --agent-name NAME --runtime RUNTIME --json",
206
215
  "docs_url": "https://image-skill.com/cli.md#image-skill-signup-agent",
207
- "required_flags": [
208
- "--agent",
216
+ "required_flags": ["--agent", "--agent-name", "--runtime"],
217
+ "optional_flags": [
209
218
  "--agent-contact",
210
- "--agent-name",
211
- "--runtime"
212
- ],
213
- "optional_flags": ["--show-token", "--no-save", "--token-stdin"]
219
+ "--show-token",
220
+ "--no-save",
221
+ "--token-stdin"
222
+ ]
223
+ }
224
+ },
225
+ {
226
+ "key": "claim",
227
+ "help": {
228
+ "command": "image-skill claim help",
229
+ "usage": "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
230
+ "docs_url": "https://image-skill.com/cli.md#image-skill-claim-request",
231
+ "subcommands": ["request"]
232
+ }
233
+ },
234
+ {
235
+ "key": "claim request",
236
+ "help": {
237
+ "command": "image-skill claim request help",
238
+ "usage": "image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json",
239
+ "docs_url": "https://image-skill.com/cli.md#image-skill-claim-request",
240
+ "required_flags": ["--contact"],
241
+ "optional_flags": ["--token-stdin"]
214
242
  }
215
243
  },
216
244
  {
@@ -61,7 +61,7 @@ First-run guide loop:
61
61
  1. Run image-skill create --guide --prompt PROMPT. This is the canonical fresh-agent entrypoint and the only required first command. It performs read-only hosted reachability, executable model availability, auth/quota, and payment rail checks and returns data.stage, data.next_command, data.guide_warning, data.next_command_effect, data.auth_ready, data.no_spend_evaluation, data.no_spend_next_command, data.no_spend_next_command_effect, data.self_fund_next_command, data.self_fund_handoff, data.auth_handoff, data.escape_hatches, and data.mutation. Guide mode must report provider_call: false, hosted_create: false, hosted_signup: false, payment_object: false, credit_debit: false, and media_write: false.
62
62
  2. Read data.guide_warning, then follow data.next_command when its next_command_safety is safe for the current spend policy. Do not run doctor, models list, signup, whoami, quota, dry-run, or payment commands as a setup checklist before the guide asks for them.
63
63
  3. If data.stage is prompt_required, rerun data.next_command with the real prompt.
64
- 4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. The signup command uses --agent-contact as an email-shaped durable contact inbox for the restricted agent identity, not as a requirement to find an individual human. Hosted signup returns the raw restricted token only when --show-token is set, and only once. 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. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
64
+ 4. If data.stage is auth_required, data.auth_ready.ready is false and data.guide_warning.next_command_safety is hosted_signup_no_spend_setup. Run data.next_command, then rerun the guide once. Hosted signup saves the restricted token to the public CLI config by default with 0600 permissions. If the configured config path is blocked, data.next_command sets IMAGE_SKILL_CONFIG_PATH="$PWD/.image-skill/config.json" and still runs a saved-config signup; do not switch to raw-token handoff unless recovery explicitly requires it. If the runtime intentionally uses --no-save --show-token, store the returned token in the agent runtime secret store, then rerun with IMAGE_SKILL_TOKEN or --token-stdin; data.auth_handoff.rerun_guide.with_env and data.auth_handoff.rerun_guide.with_stdin are copy-safe templates for that mode. Signup is anonymous by default: no contact inbox is required to get a restricted token. The optional --agent-contact flag takes an email-shaped durable contact inbox for the restricted agent identity, not a requirement to find an individual human; attach one later with image-skill claim request --contact INBOX --json when funding or durability makes it worth having. Hosted signup returns the raw restricted token only when --show-token is set, and only once. When providing a contact, use an agent-owned inbox when available; otherwise use an operator, team, or sponsor inbox that can receive future claim, billing, or abuse notices. Never invent an inbox or borrow an unrelated human email just to fill the flag — omit it instead. example.invalid addresses are only appropriate inside documented harness or proof runs. --human-email remains accepted as a compatibility alias, but the guide must not teach it. Anonymous signups mint a fresh agent identity on every call; reuse the saved config instead of re-running signup. --save is accepted as a compatibility no-op for the default save behavior; use --no-save only when the runtime has a separate secret store and does not want local config.
65
65
  5. If data.stage is quota_required, data.guide_warning.next_command_safety is live_money_payment_action and data.guide_warning.payment_top_up_path summarizes the live-money path. Run data.self_fund_next_command to start the top-up. It aliases data.next_command and is the first payment command, usually an x402 or Stripe quote. First read data.checks.payments.preferred_method_summary.top_up_path: browserless_agent_self_fund means a wallet-equipped agent can complete the preferred live-money rail without a browser; human_payment_handoff means the agent can create the payment attempt but a human/browser step must complete before credits are granted. If the guide authenticated from env or stdin, prefer data.self_fund_handoff.auth.next_command.with_env or data.self_fund_handoff.auth.next_command.with_stdin so auth follows the payment command. Then follow data.self_fund_handoff.payment_commands.buy and status, and rerun data.self_fund_handoff.after_next once credits are granted. One Image Skill credit is $0.01. Credit quotes grant prepaid value units; create/edit operations debit model-priced credits reported as cost.credit_pricing. Starter preview currently gives bounded free-preview credits plus a four-job daily cap.
66
66
  6. If data.stage is ready_to_create, data.next_command is the first bounded live create. data.guide_warning.next_command_safety must be live_media_create_credit_debit, data.guide_warning.no_spend_safe must be false, data.guide_warning.spend_required must be true, and data.guide_warning.recommended_command_field must be recommended_no_spend_command. data.auth_ready.ready and data.auth_ready.next_command_auth_ready must be true; data.auth_ready.next_command_requires_auth must be true, and the command can reuse saved config, IMAGE_SKILL_TOKEN, or --token-stdin context without exposing a raw token. data.next_command_effect.label must be live_media_create_credit_debit and its provider_call, hosted_create, credit_debit, and media_write flags are true. data.no_spend_evaluation.stop_here must be true, data.no_spend_evaluation.next_command_is_live_create must be true, and data.no_spend_evaluation.recommended_command_field must be recommended_no_spend_command. Run data.next_command only when media spend is allowed. In no-spend evaluations, or when you only need to prove readiness without media/provider work, stop before data.next_command and run data.recommended_no_spend_command instead. data.recommended_no_spend_command must equal data.no_spend_next_command. data.no_spend_next_command_effect.label must be dry_run_planned_job_no_provider_call_no_credit_debit_no_media_write: no_spend, hosted_create_dry_run, planned_job, and plan_receipt are true; activity_event is job.planned; provider_call, credit_debit, and media_write are false. This dry-run may create a recoverable planned job/activity receipt but no provider execution, debit, downloadable asset, or media write. If the guide authenticated from env or stdin, prefer data.auth_handoff.next_command.with_env or data.auth_handoff.next_command.with_stdin so auth follows the live create. In guide cost output, cost.estimated_usd_per_image and cost.estimated_debit_usd_per_image are the Image Skill debit dollars for one output; cost.estimated_provider_usd_per_image is only the upstream provider estimate. Use the guide's returned max_estimated_usd_per_image because it is sized to the credit debit the agent funds. Add --output-count N only after models show confirms the selected create model supports more than one output; credit_pricing.credits_required is the total debit across outputs, while max_estimated_usd_per_image remains a per-image Image Skill debit guard.
67
67
  7. After create, use image-skill jobs show JOB_ID to recover status, cost, safety, timestamps, and final assets; image-skill assets get ASSET_URL_OR_ID --output ./result.png to fetch the generated asset without repeating provider work; and image-skill activity list --subject JOB_ID to find ledger events, trace, usage, and asset links to cite.
@@ -71,7 +71,8 @@ Manual escape hatches are not prerequisites. Use image-skill doctor, image-skill
71
71
 
72
72
  Core commands:
73
73
  - image-skill doctor --json
74
- - image-skill signup --agent --agent-contact AGENT_OR_OPERATOR_INBOX --agent-name NAME --runtime RUNTIME --json
74
+ - image-skill signup --agent --agent-name NAME --runtime RUNTIME --json
75
+ - image-skill claim request --contact AGENT_OR_OPERATOR_INBOX --json
75
76
  - image-skill whoami --json
76
77
  - image-skill usage quota --json
77
78
  - image-skill quota --json (compatibility alias)
@@ -110,7 +111,8 @@ Core commands:
110
111
  - image-skill feedback create --type user_feedback --title TITLE --body BODY --command COMMAND --expected EXPECTED --actual ACTUAL --proof-needed PROOF --surface cli,docs --evidence trace:TRACE_ID --severity medium --confidence high --next-state watch --json
111
112
 
112
113
  Hosted API endpoints:
113
- - POST https://api.image-skill.com/v1/agent-signups creates or rotates a restricted unclaimed agent token. Request JSON prefers agent_contact as the email-shaped durable contact inbox for the restricted agent identity; human_email remains accepted only as a legacy compatibility alias. The contact is not a requirement that an autonomous agent stop until a specific human is present. Direct API callers receive the raw token once as data.token only when request.return_token is true; store that token in the agent runtime secret store and never put it in prompts, logs, issue text, or feedback. The public CLI default signup path requests the token only to save local auth config, then reports data.token:null and data.auth_handoff.status:saved_config_ready so no raw token copy step is required.
114
+ - POST https://api.image-skill.com/v1/agent-signups creates or rotates a restricted unclaimed agent token. The contact is optional: omitting agent_contact performs an anonymous signup that mints a fresh agent identity. When provided, agent_contact is the email-shaped durable contact inbox for the restricted agent identity; human_email remains accepted only as a legacy compatibility alias. The contact is never a requirement that an autonomous agent stop until a specific human is present. Direct API callers receive the raw token once as data.token only when request.return_token is true; store that token in the agent runtime secret store and never put it in prompts, logs, issue text, or feedback. The public CLI default signup path requests the token only to save local auth config, then reports data.token:null and data.auth_handoff.status:saved_config_ready so no raw token copy step is required.
115
+ - POST https://api.image-skill.com/v1/agent-claims attaches an email-shaped durable contact inbox to the authenticated agent after an (often anonymous) signup. Request JSON is {"contact": INBOX}. Re-sending the same contact is idempotent (data.state unchanged); a different contact replaces the previous one (data.state attached). Attaching a contact is not inbox-ownership verification: data.claim_state stays unclaimed and data.claim_request_state reports requested. The response echoes only a redacted contact.
114
116
  - GET https://api.image-skill.com/v1/whoami returns durable hosted identity for Authorization: Bearer TOKEN.
115
117
  - GET https://api.image-skill.com/v1/quota returns durable hosted quota for Authorization: Bearer TOKEN.
116
118
  - GET https://api.image-skill.com/v1/payment-methods returns the no-auth action-only payment rail catalog. It tells agents which currently usable rails are available, whether live money can move, buyer modes (agent_only, hybrid, human_only), browser requirements, agent_initiated, agent_settleable, settlement_blocker, limits, endpoint paths, and recovery commands. Planned, watch-only, fake, and private harness rails are intentionally omitted.