@artblocks/abx-cli 0.1.0-alpha.9 → 0.2.0

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.
Files changed (201) hide show
  1. package/CHANGELOG.md +429 -0
  2. package/assets/renderer-scaffold/README.md +44 -13
  3. package/assets/renderer-scaffold/foundry.toml +5 -0
  4. package/assets/renderer-scaffold/remappings.txt +1 -1
  5. package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
  6. package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
  7. package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
  8. package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
  9. package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
  10. package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
  11. package/dist/bin.d.ts +26 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +63 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/capabilities.d.ts +132 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +175 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/commands/auth.d.ts +54 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +483 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/contract.d.ts +19 -0
  24. package/dist/commands/contract.d.ts.map +1 -0
  25. package/dist/commands/contract.js +171 -0
  26. package/dist/commands/contract.js.map +1 -0
  27. package/dist/commands/deploy.d.ts +296 -0
  28. package/dist/commands/deploy.d.ts.map +1 -0
  29. package/dist/commands/deploy.js +5756 -0
  30. package/dist/commands/deploy.js.map +1 -0
  31. package/dist/commands/feedback.d.ts +7 -0
  32. package/dist/commands/feedback.d.ts.map +1 -0
  33. package/dist/commands/feedback.js +154 -0
  34. package/dist/commands/feedback.js.map +1 -0
  35. package/dist/commands/maintenance.d.ts +4 -0
  36. package/dist/commands/maintenance.d.ts.map +1 -0
  37. package/dist/commands/maintenance.js +114 -0
  38. package/dist/commands/maintenance.js.map +1 -0
  39. package/dist/commands/project.d.ts +458 -0
  40. package/dist/commands/project.d.ts.map +1 -0
  41. package/dist/commands/project.js +1837 -0
  42. package/dist/commands/project.js.map +1 -0
  43. package/dist/commands/reads.d.ts +85 -0
  44. package/dist/commands/reads.d.ts.map +1 -0
  45. package/dist/commands/reads.js +881 -0
  46. package/dist/commands/reads.js.map +1 -0
  47. package/dist/commands/scaffold.d.ts +89 -0
  48. package/dist/commands/scaffold.d.ts.map +1 -0
  49. package/dist/commands/scaffold.js +741 -0
  50. package/dist/commands/scaffold.js.map +1 -0
  51. package/dist/commands/service.d.ts +67 -0
  52. package/dist/commands/service.d.ts.map +1 -0
  53. package/dist/commands/service.js +761 -0
  54. package/dist/commands/service.js.map +1 -0
  55. package/dist/commands/storage.d.ts +51 -0
  56. package/dist/commands/storage.d.ts.map +1 -0
  57. package/dist/commands/storage.js +399 -0
  58. package/dist/commands/storage.js.map +1 -0
  59. package/dist/commands/submit-app.d.ts +102 -0
  60. package/dist/commands/submit-app.d.ts.map +1 -0
  61. package/dist/commands/submit-app.js +638 -0
  62. package/dist/commands/submit-app.js.map +1 -0
  63. package/dist/config.d.ts +94 -2
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +332 -12
  66. package/dist/config.js.map +1 -1
  67. package/dist/conformance.d.ts +31 -0
  68. package/dist/conformance.d.ts.map +1 -0
  69. package/dist/conformance.js +400 -0
  70. package/dist/conformance.js.map +1 -0
  71. package/dist/contract-read-error.d.ts +5 -0
  72. package/dist/contract-read-error.d.ts.map +1 -0
  73. package/dist/contract-read-error.js +37 -0
  74. package/dist/contract-read-error.js.map +1 -0
  75. package/dist/creator-agent.d.ts +49 -0
  76. package/dist/creator-agent.d.ts.map +1 -0
  77. package/dist/creator-agent.js +363 -0
  78. package/dist/creator-agent.js.map +1 -0
  79. package/dist/creator-keyring.d.ts +26 -0
  80. package/dist/creator-keyring.d.ts.map +1 -0
  81. package/dist/creator-keyring.js +57 -0
  82. package/dist/creator-keyring.js.map +1 -0
  83. package/dist/creator-signer.d.ts +52 -0
  84. package/dist/creator-signer.d.ts.map +1 -0
  85. package/dist/creator-signer.js +267 -0
  86. package/dist/creator-signer.js.map +1 -0
  87. package/dist/deploy-plan.d.ts +218 -0
  88. package/dist/deploy-plan.d.ts.map +1 -0
  89. package/dist/deploy-plan.js +20 -0
  90. package/dist/deploy-plan.js.map +1 -0
  91. package/dist/deps.d.ts +6 -39
  92. package/dist/deps.d.ts.map +1 -1
  93. package/dist/deps.js +4 -68
  94. package/dist/deps.js.map +1 -1
  95. package/dist/errors.d.ts +22 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +32 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/flag-allowlists.d.ts +53 -0
  100. package/dist/flag-allowlists.d.ts.map +1 -0
  101. package/dist/flag-allowlists.js +188 -0
  102. package/dist/flag-allowlists.js.map +1 -0
  103. package/dist/flags.d.ts +53 -0
  104. package/dist/flags.d.ts.map +1 -1
  105. package/dist/flags.js +151 -1
  106. package/dist/flags.js.map +1 -1
  107. package/dist/jsonout.d.ts +37 -0
  108. package/dist/jsonout.d.ts.map +1 -0
  109. package/dist/jsonout.js +79 -0
  110. package/dist/jsonout.js.map +1 -0
  111. package/dist/kind.d.ts +57 -0
  112. package/dist/kind.d.ts.map +1 -0
  113. package/dist/kind.js +122 -0
  114. package/dist/kind.js.map +1 -0
  115. package/dist/main.js +859 -5374
  116. package/dist/main.js.map +1 -1
  117. package/dist/mintpage.d.ts +17 -2
  118. package/dist/mintpage.d.ts.map +1 -1
  119. package/dist/mintpage.js +241 -54
  120. package/dist/mintpage.js.map +1 -1
  121. package/dist/output.d.ts +184 -0
  122. package/dist/output.d.ts.map +1 -0
  123. package/dist/output.js +774 -0
  124. package/dist/output.js.map +1 -0
  125. package/dist/ownerops.d.ts +463 -59
  126. package/dist/ownerops.d.ts.map +1 -1
  127. package/dist/ownerops.js +2329 -366
  128. package/dist/ownerops.js.map +1 -1
  129. package/dist/preview.d.ts +23 -5
  130. package/dist/preview.d.ts.map +1 -1
  131. package/dist/preview.js +95 -43
  132. package/dist/preview.js.map +1 -1
  133. package/dist/provision.d.ts +3 -13
  134. package/dist/provision.d.ts.map +1 -1
  135. package/dist/provision.js +19 -21
  136. package/dist/provision.js.map +1 -1
  137. package/dist/remote.d.ts +116 -9
  138. package/dist/remote.d.ts.map +1 -1
  139. package/dist/remote.js +371 -14
  140. package/dist/remote.js.map +1 -1
  141. package/dist/riskgate.d.ts +101 -0
  142. package/dist/riskgate.d.ts.map +1 -0
  143. package/dist/riskgate.js +343 -0
  144. package/dist/riskgate.js.map +1 -0
  145. package/dist/scaffold.d.ts +12 -0
  146. package/dist/scaffold.d.ts.map +1 -0
  147. package/dist/scaffold.js +56 -0
  148. package/dist/scaffold.js.map +1 -0
  149. package/dist/schema.d.ts +36 -1
  150. package/dist/schema.d.ts.map +1 -1
  151. package/dist/schema.js +121 -26
  152. package/dist/schema.js.map +1 -1
  153. package/dist/script-chunks.d.ts +8 -0
  154. package/dist/script-chunks.d.ts.map +1 -0
  155. package/dist/script-chunks.js +35 -0
  156. package/dist/script-chunks.js.map +1 -0
  157. package/dist/served.d.ts +30 -0
  158. package/dist/served.d.ts.map +1 -0
  159. package/dist/served.js +112 -0
  160. package/dist/served.js.map +1 -0
  161. package/dist/signer.d.ts +20 -1
  162. package/dist/signer.d.ts.map +1 -1
  163. package/dist/signer.js +110 -18
  164. package/dist/signer.js.map +1 -1
  165. package/dist/update-check.d.ts +60 -9
  166. package/dist/update-check.d.ts.map +1 -1
  167. package/dist/update-check.js +105 -18
  168. package/dist/update-check.js.map +1 -1
  169. package/package.json +17 -12
  170. package/skill/SKILL.md +213 -354
  171. package/skill/agents/openai.yaml +4 -0
  172. package/skill/reference/capabilities.md +195 -0
  173. package/skill/reference/code.md +236 -0
  174. package/skill/reference/creator-token.md +94 -0
  175. package/skill/reference/deploy.md +191 -0
  176. package/skill/reference/diagnose.md +178 -0
  177. package/skill/reference/hosting.md +191 -102
  178. package/skill/reference/operate.md +237 -0
  179. package/skill/reference/services.md +173 -0
  180. package/skill/reference/setup.md +221 -42
  181. package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
  182. package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
  183. package/dist/inspect.d.ts +0 -48
  184. package/dist/inspect.d.ts.map +0 -1
  185. package/dist/inspect.js +0 -184
  186. package/dist/inspect.js.map +0 -1
  187. package/dist/migrate.d.ts +0 -65
  188. package/dist/migrate.d.ts.map +0 -1
  189. package/dist/migrate.js +0 -180
  190. package/dist/migrate.js.map +0 -1
  191. package/dist/onchain-uri.d.ts +0 -97
  192. package/dist/onchain-uri.d.ts.map +0 -1
  193. package/dist/onchain-uri.js +0 -243
  194. package/dist/onchain-uri.js.map +0 -1
  195. package/dist/upload.d.ts +0 -28
  196. package/dist/upload.d.ts.map +0 -1
  197. package/dist/upload.js +0 -41
  198. package/dist/upload.js.map +0 -1
  199. package/skill/reference/code-projects.md +0 -246
  200. package/skill/reference/operating.md +0 -118
  201. package/skill/reference/troubleshooting.md +0 -28
@@ -0,0 +1,237 @@
1
+ # Operating an existing ABX project
2
+
3
+ Use this reference for inspection, minting and sales, transfers, fields, gateways, URI pointers,
4
+ royalties, supply, attachments, refreshes, ownership transfer, and locks.
5
+
6
+ ## Contents
7
+
8
+ - [Read before writing](#read-before-writing)
9
+ - [Mint and run primary sales](#mint-and-run-primary-sales)
10
+ - [Transfer tokens and authority](#transfer-tokens-and-authority)
11
+ - [Operate metadata and data](#operate-metadata-and-data)
12
+ - [Manage economics and supply](#manage-economics-and-supply)
13
+ - [Lock precisely](#lock-precisely)
14
+
15
+ ## Read before writing
16
+
17
+ Never infer contract type or current authority from the original launch notes. Read the contract:
18
+
19
+ ```bash
20
+ abx state <address>
21
+ abx tokens <address> --json
22
+ abx contracturi <address> --json
23
+ abx tokenuri <address> --token <id>
24
+ abx verify <address> --json
25
+ abx artifacts <address> --token <id> --json
26
+ ```
27
+
28
+ `abx artifacts` reads a token's `artifacts` manifest directly, without fetching and parsing the whole
29
+ served document — entries plus every registered effect row (current and stale, labeled against the
30
+ token's active `inputsHash`). Report which surface answered: this node's local projection, or (with
31
+ `--remote <name|url>`) the hosted resolver that actually owns a hosted project's real artifact set.
32
+ Neither "not registered here" nor "not registered on that remote" is an error — both return a stable
33
+ `{surface, registered, available, reason, entries, effects}` shape. Nothing it reports is onchain data
34
+ itself; every entry is a resolver-published projection.
35
+
36
+ Use `abx status` or its remote form for projection/render lifecycle. Record active chain, detected
37
+ family, owner/admin, supply and pause state, minter/payee, royalty/cap, URI renderer/pointers, code
38
+ dependencies, schemas/hooks, and lock state.
39
+
40
+ Before every write, run its help and dry-run form when available. Confirm sender, target, value,
41
+ token/id/amount, and permanence. Let the CLI validate contract type; do not send raw ABI calls to make
42
+ an operation fit the wrong family.
43
+
44
+ ## Mint and run primary sales
45
+
46
+ `abx mint` follows the detected family:
47
+
48
+ - A 1/1 issues its single token.
49
+ - A Series mints the next id in order; `--count` can mint multiple sequential ids.
50
+ - An edition requires `--token-id` except where the contract has only the single 1/1-edition id, and
51
+ uses `--amount` for copies. `--count` is not an edition synonym.
52
+
53
+ Confirm the recipient. Minting may trigger a transfer hook; a hook that vetoes mint will revert the
54
+ whole transaction.
55
+
56
+ ### Shared fixed-price minter
57
+
58
+ Use the shared minter commands for ordinary ETH primary sales:
59
+
60
+ 1. `abx minter configure <token> …` sets price and allocation. Editions require a token id and use a
61
+ per-id sale configuration.
62
+ 2. `abx set-minter <token> --minter <address>` authorizes the minter.
63
+ 3. `abx set-primary-payee <token> --payee <address>` declares payout.
64
+ 4. `abx unpause <token>` opens minting when the family supports the pause gate.
65
+ 5. `abx minter show <token> …` verifies the public sale state.
66
+ 6. `abx minter buy <token> …` is the public purchase path; editions use quantity and token id.
67
+
68
+ Do not call a sale live until price units, allocation, payee, minter address, pause state, and a
69
+ representative purchase are verified. `abx mint-page` scaffolds a client for the shared minter; it does
70
+ not configure the on-chain sale for you.
71
+
72
+ Use a custom minter for auctions, allowlists, raffles, free claims, ERC-20 pricing, or other issuance
73
+ rules. The custom contract calls the canonical token's mint authority; the token itself remains a
74
+ factory clone. Read [capabilities.md](capabilities.md).
75
+
76
+ ## Transfer tokens and authority
77
+
78
+ `abx transfer` moves token ownership/copies, not contract administration.
79
+
80
+ - A 721 transfer names token id and destination.
81
+ - An edition transfer names token id, amount, destination, and source holder because an id can have
82
+ multiple holders.
83
+ - Creator-token validation or a transfer hook may reject the move. Diagnose the actual revert; do not
84
+ bypass or clear an enforcement mechanism without the owner's explicit intent.
85
+
86
+ `abx set-admin --to <address>` transfers contract authority. Treat it as a high-risk, potentially
87
+ irrecoverable handoff:
88
+
89
+ 1. Verify the recipient is correct for the active chain.
90
+ 2. Inventory unfinished operations and unlocked surfaces.
91
+ 3. State which powers move and which external controllers remain separate.
92
+ 4. Receive exact human confirmation.
93
+ 5. Execute once, then read state from chain to prove the new owner.
94
+
95
+ Never interpret a token transfer as a sale listing. ABX has no secondary order book; a marketplace or
96
+ manual transfer handles secondary exchange.
97
+
98
+ ## Operate metadata and data
99
+
100
+ ### URI pointers and renderers
101
+
102
+ Use `set-token-uri`, `set-contract-uri`, and `set-renderer` only after reading the current configuration
103
+ and verifying the destination. Switching `set-renderer --off` can place an HTTP resolver in front of
104
+ content that remains stored on-chain. Switching to the canonical renderer makes configured on-chain
105
+ fields self-resolving when the contract supports them.
106
+
107
+ Never hand-build a resolver path. Read `tokenURI`/`contractURI`, decode it, and follow what the
108
+ contract actually returns. A correct-looking URL constructed from memory is not evidence.
109
+
110
+ ### Fields
111
+
112
+ `abx set-field` writes one metadata field representation at token or collection scope. Representations
113
+ include inline data, reader/chunk pointers, hashes, public locators, and renderer pointers as supported
114
+ by the contract. Collection-scope values act as shared defaults; token-scope values override them.
115
+
116
+ Use reserved fields such as description, attributes, creator, license, display notes, and links
117
+ according to command help. Verify the resulting provenance in decoded metadata. On-chain-wins means a
118
+ new on-chain value can intentionally supersede a resolver projection.
119
+
120
+ ### Gateways
121
+
122
+ `abx set-gateway` changes the serving prefix for IPFS/Arweave locator representations without moving
123
+ the content. Verify a representative locator through the new gateway before changing it. A gateway
124
+ repoint is not a re-upload and does not change the committed CID/transaction id.
125
+
126
+ ### Attachments versus parameters
127
+
128
+ `abx attach <addr> <key> <locator>` records a named artifact. It prints the CANONICAL fetch URL for
129
+ every key (`{base}/{chainId}/{address}[/<id>]/data/<key>`) directly — never hand-build that route.
130
+ It also distinguishes the on-chain field write from off-chain SERVING: an on-chain write can succeed
131
+ while nothing can serve it. With no resolver base baked in at all, it warns there is no serving path
132
+ whatsoever. With one baked in, it probes whether a resolver actually answers for this token right
133
+ now (before the write, since the key itself doesn't exist yet) and warns if not — "the on-chain
134
+ document carries reserved fields only" is a real gap creators hit; the write landing is not proof
135
+ anything can serve it. Bare on-chain metadata cannot enumerate arbitrary field keys, so consumers
136
+ need a resolver to discover all attachments even when each locator is durable and hash-anchored.
137
+
138
+ PostParams are different: the parameter store enumerates schemas and values on-chain. Read schemas
139
+ with `state` and values with `tokens --json`. Parameters do not require a resolver merely to be
140
+ canonical or enumerable.
141
+
142
+ ### Replacing an unlocked script
143
+
144
+ `abx replace-script <addr> --script <file>` ships a fix to a code project's on-chain program any
145
+ time before `abx lock-script`. It refuses outright — never warns and proceeds — on a locked script
146
+ or a target that isn't SeriesCode/EditionCode. It diffs by content against what's on-chain (an index
147
+ that already matches is never re-sent), folds every write and remove into ONE atomic transaction (so
148
+ a revert can never leave a half-applied script), and reads the completed script back to verify exact
149
+ reassembly before reporting success. Prefer this over hand-encoding `setScriptChunk` calls.
150
+
151
+ `--chunk-size <bytes>` overrides the default on-chain split size (~22 KB) — the same flag
152
+ `deploy-code` accepts (see [code.md](code.md#choose-the-runtime-lane)). A small value forces a
153
+ multi-chunk layout, which is the cheap way to exercise growing/shrinking a program across several
154
+ chunks (including the on-chain removal of surplus chunks when shrinking) without needing a large
155
+ real program.
156
+
157
+ ### Refresh and URI events
158
+
159
+ `abx refresh` asks external marketplaces to fetch metadata again; it does not fix the metadata or
160
+ mutate canonical state. First prove that the current URI resolves and returns the intended document.
161
+ For editions, `ping-uri` re-emits native URI events for selected ids after a repoint. Use the smallest
162
+ id set needed and verify the new path before signalling indexers.
163
+
164
+ ## Manage economics and supply
165
+
166
+ Use `set-royalty` to change receiver/rate within the collection's permanent royalty ceiling. Use
167
+ `set-royalty-cap` only to lower that ceiling. State the old and new values and confirm the irreversible
168
+ loss of future headroom.
169
+
170
+ Series supply caps and edition per-id caps are monotonic downward. Before lowering one, read the
171
+ Series issuance cursor or the edition id's live supply, respectively; never propose a value below that
172
+ floor. For editions, name the id and distinguish its live per-id cap from aggregate collection supply.
173
+
174
+ Pause/unpause controls the supported mint gate, not transfers or every external minter behavior.
175
+ Read state after changing it.
176
+
177
+ Primary payee declares sale proceeds; royalty receiver handles secondary royalty reporting. Keep them
178
+ separate. Changing one does not update the other.
179
+
180
+ ## Lock precisely
181
+
182
+ Lock last, after production-path verification. Every lock freezes a different surface:
183
+
184
+ **Never lock a token or collection URI to a domain the creator does not own.** A managed remote's
185
+ URL is not creator custody. Route a creator-controlled domain only when the provider supports it,
186
+ verify the route, then lock that domain. ABX Services does not currently support custom-domain
187
+ routing, so never lock an `abx.io` URI. The CLI refuses to do so.
188
+
189
+ | Lock | Freezes | Does not necessarily freeze |
190
+ |---|---|---|
191
+ | `lock-field` | one token/collection field representation | other fields, URI pointer, program, params |
192
+ | `lock-uri` | URI configuration/pointer at selected scope | program/dependencies/params/hooks |
193
+ | `lock-script` | code-project script chunks | dependencies, metadata, params, external renderer code |
194
+ | `lock-dependencies` | dependency list and registry pointer | bytes returned later by a live registry entry |
195
+ | `lock-param-hooks` | configure/transfer/augment addresses | behavior behind an upgradeable address |
196
+ | governed schema/value lock | writes governed by that schema/key | unrelated or ungoverned params; some inherited defaults |
197
+ | ownership transfer | future owner-only authority at this contract | powers held by external minters/hooks/providers |
198
+
199
+ For a code project, metadata locks alone do not freeze the program. A strong freeze normally requires
200
+ script, dependency, relevant field/URI, hook, and governed-parameter decisions, plus immutable external
201
+ renderer/hook/dependency deployments.
202
+
203
+ Important qualifications:
204
+
205
+ - An ungoverned parameter remains writable despite metadata locks.
206
+ - A schema-welded token value is stronger than a collection default inherited by many tokens; the
207
+ recovery path may still allow a poisoned collection default to be cleared.
208
+ - A registry dependency may return different bytes behind a frozen reference.
209
+ - A locked pointer to an upgradeable proxy fixes the address, not its behavior.
210
+ - A transfer-hook address represents a standing ability to veto mints/transfers. Freezing an empty
211
+ hook set is the proof that this power cannot later be added.
212
+ - `lock-field` targets one scope (token, or `--collection`); a token-scope value wins over a
213
+ collection-scope one when both are set. Locking a scope that ISN'T actually serving the value
214
+ freezes an empty or overridden slot, not what a viewer sees — the CLI refuses this by default and
215
+ names the correct command; only `--force-field` proceeds (with a loud warning, never silently).
216
+ Check `abx tokenuri --token <id>`'s `abx_provenance` (or just try the lock without `--force-field`)
217
+ before assuming a scope holds the value.
218
+
219
+ Use `abx verify` and direct state reads to enumerate what remains mutable. Describe the guarantee as
220
+ specific stored values and addresses that can no longer change; do not promise immutable output unless
221
+ every live input and external implementation has actually been bounded.
222
+
223
+ `abx state <address> --json` reports every lock above in one `locks` object — token/contract URI,
224
+ script, dependencies, param hooks, and the standard `METADATA_FIELD` set — each as `true` (frozen),
225
+ `false` (open), or `null` (unread; never report an unread lock as off). A project's own custom field
226
+ keys are real and independently lockable but are not enumerable from a bare head read; say so rather
227
+ than implying the field scan is exhaustive. Every lock is independent: never infer one lock's state
228
+ from another's.
229
+
230
+ `abx verify --json` separates two verdicts that must not be conflated: `ok`/`contentIntegrity` is
231
+ content-integrity ONLY (a hash mismatch, or none to check) and is the only field the exit code
232
+ reflects; `availability` is a sibling verdict for render/serve readiness (`available` / `partial` /
233
+ `unavailable` / `unknown`) that a missing render or an un-refetched `ipfs`/`arweave`/`url` locator
234
+ moves, while `ok` stays unaffected by design. Report both, never collapse one into the other.
235
+ `abx verify` also flags whether the project's stored `tokenURIRenderer`/generator pointers are the
236
+ CURRENT canonical singletons — a `false` here means an older-but-working deployment (or a fully
237
+ custom one), never "broken".
@@ -0,0 +1,173 @@
1
+ # First-party services and feedback
2
+
3
+ Use this reference for the public ABX service, API-key login, hosted resolver/rendering, or feedback.
4
+ For provider-independent hosting and migration, also read [hosting.md](hosting.md).
5
+
6
+ ## Contents
7
+
8
+ - [First-party service](#first-party-service)
9
+ - [Creator wallet and sponsorship](#creator-wallet-and-sponsorship)
10
+ - [Feedback targets](#feedback-targets)
11
+
12
+ ## First-party service
13
+
14
+ The documented endpoints are:
15
+
16
+ - documentation: `https://docs.abx.io`
17
+ - service catalog, account, and control: `https://services.abx.io`
18
+ - public token data: `https://resolver.abx.io` (discover it from the catalog; do not hardcode it)
19
+ - OAuth discovery: `https://services.abx.io/.well-known/oauth-authorization-server`
20
+ - manual signup fallback: `https://services.abx.io/signup`
21
+
22
+ The first-party provider has the built-in remote name `abx`:
23
+
24
+ ```bash
25
+ abx remote abx
26
+ ```
27
+
28
+ It needs `ABX_SERVICES_API_KEY` in the project's ignored `.env`; it does not need
29
+ `ABX_REMOTE_ABX_URL`. When the key is absent, use:
30
+
31
+ ```bash
32
+ abx auth login
33
+ ```
34
+
35
+ The CLI starts the OAuth device flow and shows a verified browser URL plus a matching short code.
36
+ The human completes name, email, one-time-code verification, and approval in that browser. The CLI
37
+ polls at the provider-declared interval, receives the API key, and writes it directly to ignored
38
+ `.env` without printing it. The browser never receives the key. Do not ask the human to paste an OTP
39
+ or key into chat. `--no-open` leaves the browser handoff as a link; `--force` is required to replace
40
+ an existing local credential, but does not revoke the displaced provider key. For normal rotation,
41
+ run `abx auth logout` and then `abx auth login`; reserve `--force` for recovery. The CLI refuses
42
+ tracked or unignored `.env` files.
43
+
44
+ The issued API key is long-lived and remains valid until it is revoked. Reuse the stored key across
45
+ tasks and agent sessions; do not start a new login merely because a task or conversation ended. If
46
+ `abx remote abx` authenticates successfully, no login is needed. `abx auth login` also detects an
47
+ already loaded credential and reuses it instead of issuing another.
48
+
49
+ In an agent runner, start `abx auth login --no-open` with a short initial yield or a resumable
50
+ background session. Relay the printed URL and code immediately while that same process keeps polling,
51
+ then resume it after human approval. Do not start another login or add an outer retry loop. If the
52
+ runner cannot yield control while a command waits, ask the human to run the command in their terminal.
53
+
54
+ Logout only for intentional teardown, suspected compromise, deliberate rotation, or to free an
55
+ active-key slot. When revoking, do not only delete the local value:
56
+
57
+ ```bash
58
+ abx auth logout # first-party service
59
+ abx auth logout <name> # another OAuth-capable named remote
60
+ ```
61
+
62
+ Logout discovers the provider's RFC 7009 endpoint, revokes the current key, and only then removes the
63
+ matching `.env` assignment. If the key came from a shell or another environment source, the CLI
64
+ revokes it and tells the human where it still needs to be unset. A repeated logout with no active
65
+ local credential is safe.
66
+
67
+ An account may have up to five active keys. The service stores hashes, so it can list key metadata
68
+ but cannot recover a lost secret. Use `abx auth keys` to inspect active keys and
69
+ `abx auth revoke-key <key-id>` to revoke an unused non-current key. Use `abx auth logout` for the
70
+ current key. Only create another key when a separate environment actually needs its own credential.
71
+
72
+ Use `/signup` only as the manual recovery path. It shows the raw key once, so the human—not the
73
+ agent—must place it in `.env`. An already verified email reuses its account and may receive another
74
+ key, subject to the same limit.
75
+
76
+ Availability, pricing, and quotas are service policy rather than protocol guarantees. Confirm current
77
+ terms before making a durable hosting choice and keep the exit route explicit: the same remote-service
78
+ contract supports another provider or a creator-operated resolver/effects deployment.
79
+
80
+ Before depending on hosted behavior, inspect the live descriptor with `abx remote abx`; do not infer
81
+ capabilities from this file. A remote is a provider catalog and may advertise different HTTPS
82
+ origins for token resolution, control, account operations, and creator wallets. Trust the advertised
83
+ interface endpoint, not a guessed hostname. Use `--remote abx` on commands that accept a managed
84
+ resolver and verify the resulting public surfaces as described in [hosting.md](hosting.md).
85
+
86
+ ## Creator wallet and sponsorship
87
+
88
+ An account with a verified email can use one persistent ABX creator wallet. The
89
+ `ABX_SERVICES_API_KEY` identifies the account but cannot sign. `--sponsor` discovers the provider's
90
+ `abx-creator-wallet/v1` endpoint and provisions or reuses the wallet. The first sponsored command
91
+ asks the human to match one code and approve a Privy agent grant. The CLI keeps the rotating grant in
92
+ the operating system's credential store and reuses it for up to 30 days, unless the creator revokes
93
+ it first. The request-signing key remains memory-only. A reused grant removes another browser step; it does
94
+ not remove the dry run, transaction summary, or production confirmation.
95
+
96
+ The approval is authority for the agent to use the creator wallet, not approval of one displayed
97
+ transaction. Review each exact network and transaction plan in the terminal. The creator can inspect
98
+ and revoke active grants at `https://services.abx.io/authorize`.
99
+
100
+ Treat the live descriptor and account capabilities as the authority for sponsored networks. The
101
+ public [network table](https://docs.abx.io/docs/reference/deployments) is the human-readable summary,
102
+ but it does not guarantee sponsorship for an account or moment. When the creator has not selected
103
+ another signer, prefer this lane for an eligible testnet operation. For production, prove the flow on
104
+ the paired testnet and repeat the production warning before confirmation. Before using it:
105
+
106
+ 1. run `abx auth login` if the account has no API key;
107
+ 2. inspect `abx capabilities --json` and the command help;
108
+ 3. run the same command with `--dry-run --json`;
109
+ 4. summarize the network, creator-wallet address, transaction group, zero value, permanent choices,
110
+ and any experimental or beta status;
111
+ 5. repeat with `--sponsor`; if no usable grant exists, give the human the verified URL and code and
112
+ resume the same command after approval.
113
+
114
+ The lane accepts zero-value calls and receipt-dependent staged content groups up to the live network
115
+ and provider policy. ABX does not impose an additional per-transaction gas ceiling. Use
116
+ `abx deploy-contract` for exact already-compiled creation bytecode; its sponsored path calls the
117
+ keyless CREATE2 proxy because provider-backed raw creation is unsupported. The constructor therefore
118
+ sees the proxy as `msg.sender`; use explicit constructor arguments for ownership. ABX does not
119
+ compile or audit it. Never add retries around a sponsored write. An `unknown` outcome means the
120
+ provider may have submitted it: preserve the operation ID and reconcile status before any new send.
121
+
122
+ Sponsorship is optional service policy, not protocol support. `--send`, `--sign`, and `--unsigned`
123
+ remain first-class bring-your-own alternatives. Honor an explicit choice of any of them. If the
124
+ provider does not advertise the chain, the account is ineligible, or the transaction group exceeds
125
+ policy, select one of those lanes rather than refusing the underlying operation. Do not use
126
+ sponsorship on a production network unless the live descriptor, account capabilities, and command
127
+ all explicitly support it. Never infer eligibility merely because the CLI recognizes the lane.
128
+
129
+ ## Feedback targets
130
+
131
+ `abx feedback` has two deliberately separate targets:
132
+
133
+ | Intent | Command | Recipient |
134
+ |---|---|---|
135
+ | ABX protocol, contracts, CLI, SDK, skill, or docs | `abx feedback` | core ABX team |
136
+ | A remote provider's resolver, rendering, auth, or operations | `abx feedback --remote <name>` | that provider |
137
+
138
+ For first-party hosted-service feedback use `--remote abx`. A third-party remote can advertise the
139
+ optional `abx-service-feedback/v1` interface and operate its own feedback store. Never send
140
+ provider-specific incidents through core feedback merely because both first-party targets currently
141
+ share infrastructure.
142
+
143
+ Discovery and report previews are public. Submission (`--yes`) and `--mine` require the same key
144
+ created by `abx auth login`; login once rather than creating a separate feedback credential. Run the
145
+ command without report flags to inspect its live schema and instructions. To report, provide the
146
+ required structured flags; use `--detail-file` or `--context-file` rather than fragile shell quoting
147
+ for longer content. The CLI shows the exact destination and payload first. Review and redact the
148
+ preview with the human, then repeat with `--yes` only after explicit approval.
149
+
150
+ ```bash
151
+ # Preview core feedback; nothing is sent.
152
+ abx feedback --area cli --kind bug --summary "Concise summary" --detail-file report.md
153
+
154
+ # After the human approves this exact preview.
155
+ abx feedback --area cli --kind bug --summary "Concise summary" --detail-file report.md --yes
156
+
157
+ # Provider-specific preview.
158
+ abx feedback --remote abx --component rendering --kind bug --summary "Concise summary"
159
+
160
+ # Review reports previously submitted with the current key.
161
+ abx feedback --mine
162
+ abx feedback --remote abx --mine
163
+ ```
164
+
165
+ Do not attach `.env`, credentials, wallet/session URLs, full transcripts, or unrelated source files.
166
+ Prefer the smallest reproduction and relevant version/chain/address context. The API key authenticates
167
+ the reporter; hosted-service entitlement is evaluated separately. It never grants transaction-signing
168
+ authority.
169
+
170
+ Use the CLI instead of hand-written HTTP or retry loops. The device flow already handles pending,
171
+ slow-down, and transient polling responses until its fixed expiry. Treat `401` as missing/invalid credentials,
172
+ `403` as recognized credentials without the required entitlement, and schema/interface errors as a
173
+ request or provider-contract mismatch. Read [diagnose.md](diagnose.md) and make one state transition.