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 +33 -0
- package/README.md +6 -1
- package/bin/image-skill.mjs +159 -27
- package/cli.md +39 -9
- package/commands.json +37 -9
- package/llms.txt +5 -3
- package/package.json +1 -1
- package/skill.md +2 -3
- package/skills/image-skill/SKILL.md +2 -3
- package/skills/image-skill/references/cli.md +39 -9
- package/skills/image-skill/references/commands.json +37 -9
- package/skills/image-skill/references/llms.txt +5 -3
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-
|
|
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
|
|
package/bin/image-skill.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import { Readable } from "node:stream";
|
|
|
7
7
|
import { pipeline } from "node:stream/promises";
|
|
8
8
|
import os from "node:os";
|
|
9
9
|
|
|
10
|
-
const VERSION = "0.1.
|
|
10
|
+
const VERSION = "0.1.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-
|
|
32
|
+
"image-skill signup --agent --agent-name NAME --runtime RUNTIME --json";
|
|
33
33
|
const SIGNUP_CONTACT_GUIDANCE =
|
|
34
|
-
"
|
|
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
|
-
"
|
|
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-
|
|
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-
|
|
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
|
-
|
|
344
|
+
required_flags: ["--agent", "--agent-name", "--runtime"],
|
|
345
|
+
optional_flags: [
|
|
341
346
|
"--agent-contact",
|
|
342
|
-
"--
|
|
343
|
-
"--
|
|
347
|
+
"--show-token",
|
|
348
|
+
"--no-save",
|
|
349
|
+
"--token-stdin",
|
|
344
350
|
],
|
|
345
|
-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
777
|
+
`signup requires --agent-name and --runtime. ${SIGNUP_CONTACT_GUIDANCE}`,
|
|
754
778
|
false,
|
|
755
779
|
{
|
|
756
|
-
required_flags: ["--agent-
|
|
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
|
-
"
|
|
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-
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
216
|
+
"required_flags": ["--agent", "--agent-name", "--runtime"],
|
|
217
|
+
"optional_flags": [
|
|
209
218
|
"--agent-contact",
|
|
210
|
-
"--
|
|
211
|
-
"--
|
|
212
|
-
|
|
213
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
216
|
+
"required_flags": ["--agent", "--agent-name", "--runtime"],
|
|
217
|
+
"optional_flags": [
|
|
209
218
|
"--agent-contact",
|
|
210
|
-
"--
|
|
211
|
-
"--
|
|
212
|
-
|
|
213
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|