@zeroxyz/cli 0.0.33 → 0.0.34
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/README.md +10 -0
- package/dist/index.js +114 -23
- package/package.json +1 -1
- package/skills/zero/SKILL.md +5 -2
package/README.md
CHANGED
|
@@ -48,6 +48,16 @@ zero search "image classification"
|
|
|
48
48
|
|
|
49
49
|
Results are numbered. Use `zero get <number>` to view details.
|
|
50
50
|
|
|
51
|
+
**Cost filtering.** By default, results are filtered to capabilities priced **≤ $30/call** as a wallet-safety cap. Override per-call:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
zero search "image classification" --max-cost 5 # cap at $5/call
|
|
55
|
+
zero search "expensive deep research" --max-cost 100 # raise the cap for hard tasks
|
|
56
|
+
zero search "image classification" --free # only free capabilities
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Other useful filters: `--min-rating <1-5>`, `--min-trust <0-100>`, `--protocol x402|mpp`, `--status healthy|degraded|down`, `--source <name>`, `--all` (no trust/health filtering).
|
|
60
|
+
|
|
51
61
|
### `zero get <position>`
|
|
52
62
|
|
|
53
63
|
Get full details for a capability from the last search results.
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Command as Command12 } from "commander";
|
|
|
6
6
|
// package.json
|
|
7
7
|
var package_default = {
|
|
8
8
|
name: "@zeroxyz/cli",
|
|
9
|
-
version: "0.0.
|
|
9
|
+
version: "0.0.34",
|
|
10
10
|
type: "module",
|
|
11
11
|
bin: {
|
|
12
12
|
zero: "dist/index.js",
|
|
@@ -146,7 +146,10 @@ var capabilityResponseSchema = z.object({
|
|
|
146
146
|
blockchainActivity: z.number().nullable(),
|
|
147
147
|
performance: z.number().nullable()
|
|
148
148
|
}).nullable().optional(),
|
|
149
|
-
availabilityStatus: z.enum(["healthy", "degraded", "down", "unknown"]).nullable().optional()
|
|
149
|
+
availabilityStatus: z.enum(["healthy", "degraded", "down", "unknown"]).nullable().optional(),
|
|
150
|
+
activationCount: z.number().optional(),
|
|
151
|
+
lastUsedAt: z.string().nullable().optional(),
|
|
152
|
+
lastSuccessfullyRanAt: z.string().nullable().optional()
|
|
150
153
|
});
|
|
151
154
|
var createRunResponseSchema = z.object({
|
|
152
155
|
runId: z.string()
|
|
@@ -1285,7 +1288,10 @@ var detectPaymentRequirement = async (response) => {
|
|
|
1285
1288
|
};
|
|
1286
1289
|
var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
1287
1290
|
"Fetch a capability URL, handling 402 challenges automatically"
|
|
1288
|
-
).argument(
|
|
1291
|
+
).argument(
|
|
1292
|
+
"[url]",
|
|
1293
|
+
"URL to fetch. Optional when --capability is provided \u2014 the URL is resolved from the capability."
|
|
1294
|
+
).option(
|
|
1289
1295
|
"-X, --method <method>",
|
|
1290
1296
|
"HTTP method (GET, POST, PUT, PATCH, DELETE). Defaults to POST when -d is set, otherwise GET"
|
|
1291
1297
|
).option(
|
|
@@ -1317,6 +1323,30 @@ var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
|
1317
1323
|
walletService
|
|
1318
1324
|
} = appContext.services;
|
|
1319
1325
|
const startTime = Date.now();
|
|
1326
|
+
let resolvedUrl;
|
|
1327
|
+
let resolvedMethodFromCapability;
|
|
1328
|
+
if (!url) {
|
|
1329
|
+
if (!options.capability) {
|
|
1330
|
+
console.error(
|
|
1331
|
+
"Missing URL. Pass a URL argument or --capability <uid|slug> so the URL can be resolved from the capability."
|
|
1332
|
+
);
|
|
1333
|
+
process.exitCode = 1;
|
|
1334
|
+
return;
|
|
1335
|
+
}
|
|
1336
|
+
try {
|
|
1337
|
+
const cap = await apiService.getCapability(options.capability);
|
|
1338
|
+
resolvedUrl = cap.url;
|
|
1339
|
+
resolvedMethodFromCapability = cap.method;
|
|
1340
|
+
} catch (err) {
|
|
1341
|
+
console.error(
|
|
1342
|
+
`Failed to resolve --capability ${options.capability}: ${err instanceof Error ? err.message : String(err)}`
|
|
1343
|
+
);
|
|
1344
|
+
process.exitCode = 1;
|
|
1345
|
+
return;
|
|
1346
|
+
}
|
|
1347
|
+
} else {
|
|
1348
|
+
resolvedUrl = url;
|
|
1349
|
+
}
|
|
1320
1350
|
let resolvedBody;
|
|
1321
1351
|
try {
|
|
1322
1352
|
resolvedBody = resolveRequestBody(
|
|
@@ -1346,7 +1376,7 @@ var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
|
1346
1376
|
headers["content-type"] = Buffer.isBuffer(resolvedBody) ? "application/octet-stream" : "application/json";
|
|
1347
1377
|
}
|
|
1348
1378
|
const log = (msg) => console.error(` ${msg}`);
|
|
1349
|
-
const method = options.method ? options.method.toUpperCase() : resolvedBody ? "POST" : "GET";
|
|
1379
|
+
const method = options.method ? options.method.toUpperCase() : resolvedMethodFromCapability && !resolvedBody ? resolvedMethodFromCapability.toUpperCase() : resolvedBody ? "POST" : "GET";
|
|
1350
1380
|
const requestInit = {
|
|
1351
1381
|
method,
|
|
1352
1382
|
headers,
|
|
@@ -1354,7 +1384,7 @@ var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
|
1354
1384
|
};
|
|
1355
1385
|
const lastSearch = stateService.loadLastSearch();
|
|
1356
1386
|
const matchedCapability = lastSearch?.capabilities.find(
|
|
1357
|
-
(c) =>
|
|
1387
|
+
(c) => resolvedUrl.startsWith(c.url)
|
|
1358
1388
|
);
|
|
1359
1389
|
const capabilityId = options.capability ?? matchedCapability?.id ?? null;
|
|
1360
1390
|
const searchId = matchedCapability ? lastSearch?.searchId : void 0;
|
|
@@ -1377,15 +1407,15 @@ var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
|
1377
1407
|
let sessionMeta;
|
|
1378
1408
|
let fetchError;
|
|
1379
1409
|
try {
|
|
1380
|
-
log(`Calling ${
|
|
1381
|
-
const response = await fetch(
|
|
1410
|
+
log(`Calling ${resolvedUrl}...`);
|
|
1411
|
+
const response = await fetch(resolvedUrl, requestInit);
|
|
1382
1412
|
const paymentReq = await detectPaymentRequirement(response);
|
|
1383
1413
|
if (paymentReq) {
|
|
1384
1414
|
log(
|
|
1385
1415
|
`Payment required (${paymentReq.protocol}) \u2014 preparing payment...`
|
|
1386
1416
|
);
|
|
1387
1417
|
const result = await paymentService.handlePayment(
|
|
1388
|
-
|
|
1418
|
+
resolvedUrl,
|
|
1389
1419
|
requestInit,
|
|
1390
1420
|
paymentReq,
|
|
1391
1421
|
options.maxPay,
|
|
@@ -1530,7 +1560,7 @@ var fetchCommand = (appContext) => new Command3("fetch").description(
|
|
|
1530
1560
|
const status = finalResponse?.status;
|
|
1531
1561
|
const outcome = !finalResponse ? "network_error" : status === 402 && !paymentMeta ? "payment_failed" : status !== void 0 && status >= 400 && status !== 402 ? "server_error" : "success";
|
|
1532
1562
|
analyticsService.capture("fetch_executed", {
|
|
1533
|
-
url: redactUrl(
|
|
1563
|
+
url: redactUrl(resolvedUrl),
|
|
1534
1564
|
status,
|
|
1535
1565
|
outcome,
|
|
1536
1566
|
latencyMs,
|
|
@@ -1621,6 +1651,22 @@ var formatReviewCount = (count) => {
|
|
|
1621
1651
|
if (count >= 1e3) return `${(count / 1e3).toFixed(1)}k`;
|
|
1622
1652
|
return count.toString();
|
|
1623
1653
|
};
|
|
1654
|
+
var formatRelativeTimestamp = (iso) => {
|
|
1655
|
+
if (!iso) return "never";
|
|
1656
|
+
const then = new Date(iso).getTime();
|
|
1657
|
+
if (Number.isNaN(then)) return "never";
|
|
1658
|
+
const diffSec = Math.max(0, Math.round((Date.now() - then) / 1e3));
|
|
1659
|
+
if (diffSec < 60) return `${diffSec}s ago`;
|
|
1660
|
+
const diffMin = Math.round(diffSec / 60);
|
|
1661
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
1662
|
+
const diffHr = Math.round(diffMin / 60);
|
|
1663
|
+
if (diffHr < 24) return `${diffHr}h ago`;
|
|
1664
|
+
const diffDay = Math.round(diffHr / 24);
|
|
1665
|
+
if (diffDay < 30) return `${diffDay}d ago`;
|
|
1666
|
+
const diffMo = Math.round(diffDay / 30);
|
|
1667
|
+
if (diffMo < 12) return `${diffMo}mo ago`;
|
|
1668
|
+
return `${Math.round(diffMo / 12)}y ago`;
|
|
1669
|
+
};
|
|
1624
1670
|
var formatTrustScore = (capability) => {
|
|
1625
1671
|
if (capability.trustScore != null) {
|
|
1626
1672
|
return `Trust Score: ${capability.trustScore}/100`;
|
|
@@ -1705,11 +1751,11 @@ var buildTryItExample = (capability) => {
|
|
|
1705
1751
|
([k, schema]) => `${encodeURIComponent(k)}=${encodeURIComponent(placeholderFor(k, schema))}`
|
|
1706
1752
|
).join("&") : "";
|
|
1707
1753
|
const url = qs ? `${capability.url}?${qs}` : capability.url;
|
|
1708
|
-
const urlLine = ` zero fetch "${url}"`;
|
|
1754
|
+
const urlLine = ` zero fetch --capability ${capability.slug} "${url}"`;
|
|
1709
1755
|
if (headerFlags.length === 0) {
|
|
1710
1756
|
lines.push(urlLine);
|
|
1711
1757
|
} else {
|
|
1712
|
-
lines.push(` zero fetch \\`);
|
|
1758
|
+
lines.push(` zero fetch --capability ${capability.slug} \\`);
|
|
1713
1759
|
for (const h of headerFlags) lines.push(` ${h} \\`);
|
|
1714
1760
|
lines.push(` "${url}"`);
|
|
1715
1761
|
}
|
|
@@ -1727,11 +1773,10 @@ var buildTryItExample = (capability) => {
|
|
|
1727
1773
|
])
|
|
1728
1774
|
) : null;
|
|
1729
1775
|
const bodyJson = samplePayload ? JSON.stringify(samplePayload) : "<BODY_JSON>";
|
|
1730
|
-
lines.push(` zero fetch \\`);
|
|
1776
|
+
lines.push(` zero fetch --capability ${capability.slug} \\`);
|
|
1731
1777
|
if (method !== "POST") lines.push(` -X ${method} \\`);
|
|
1732
1778
|
for (const h of headerFlags) lines.push(` ${h} \\`);
|
|
1733
|
-
lines.push(` -d '${bodyJson}'
|
|
1734
|
-
lines.push(` ${capability.url}`);
|
|
1779
|
+
lines.push(` -d '${bodyJson}'`);
|
|
1735
1780
|
if (!body) {
|
|
1736
1781
|
lines.push(
|
|
1737
1782
|
" # bodySchema did not expose input.body \u2014 replace <BODY_JSON> with the exact shape shown above."
|
|
@@ -1768,6 +1813,9 @@ var formatCapability = (capability) => {
|
|
|
1768
1813
|
lines.push(...formatCost(capability));
|
|
1769
1814
|
lines.push(` URL: ${capability.url}`);
|
|
1770
1815
|
lines.push(` Method: ${capability.method}`);
|
|
1816
|
+
lines.push(
|
|
1817
|
+
` Last successful run: ${formatRelativeTimestamp(capability.lastSuccessfullyRanAt)}`
|
|
1818
|
+
);
|
|
1771
1819
|
lines.push(...buildTryItExample(capability));
|
|
1772
1820
|
return lines.join("\n");
|
|
1773
1821
|
};
|
|
@@ -1949,9 +1997,10 @@ var sectionDivider = () => {
|
|
|
1949
1997
|
var printReadyFooter = () => {
|
|
1950
1998
|
const lines = [
|
|
1951
1999
|
"",
|
|
1952
|
-
` ${color.boldGreen("Zero is ready!")}
|
|
2000
|
+
` ${color.boldGreen("Zero is ready!")} Zero works best with an AI agent.`,
|
|
2001
|
+
" Open Claude Code, Codex, Cursor, Blackbox, or your agent of choice",
|
|
2002
|
+
" and try one of these commands to get started:",
|
|
1953
2003
|
"",
|
|
1954
|
-
` ${color.dim("Try:")}`,
|
|
1955
2004
|
` ${color.cyan('zero search "translate text to Spanish"')}`,
|
|
1956
2005
|
` ${color.cyan('zero search "generate an image"')}`,
|
|
1957
2006
|
` ${color.cyan('zero search "weather forecast"')}`,
|
|
@@ -2658,6 +2707,20 @@ Bulk review complete: ${ok} ok, ${failed} failed`);
|
|
|
2658
2707
|
|
|
2659
2708
|
// src/commands/runs-command.ts
|
|
2660
2709
|
import { Command as Command7 } from "commander";
|
|
2710
|
+
var USD_ASSETS = /* @__PURE__ */ new Set(["USD", "USDC"]);
|
|
2711
|
+
var formatCost2 = (cost) => {
|
|
2712
|
+
if (!cost) return "free";
|
|
2713
|
+
const { amount, asset } = cost;
|
|
2714
|
+
const prefix = asset && USD_ASSETS.has(asset.toUpperCase()) ? "$" : "";
|
|
2715
|
+
const priced = asset ? `${prefix}${amount} ${asset}` : amount;
|
|
2716
|
+
return Number(amount) === 0 ? `free (${priced})` : priced;
|
|
2717
|
+
};
|
|
2718
|
+
var formatPayment = (payment) => {
|
|
2719
|
+
if (!payment) return "\u2014";
|
|
2720
|
+
const chain = payment.chain ? `:${payment.chain}` : "";
|
|
2721
|
+
const mode = payment.mode ? ` (${payment.mode})` : "";
|
|
2722
|
+
return `${payment.protocol}${chain}${mode}`;
|
|
2723
|
+
};
|
|
2661
2724
|
var runsCommand = (appContext) => new Command7("runs").description("List your recent capability runs").addHelpText(
|
|
2662
2725
|
"after",
|
|
2663
2726
|
`
|
|
@@ -2667,12 +2730,13 @@ A leading [\u2713] means the run already has a review; [ ] means it does not.
|
|
|
2667
2730
|
Examples:
|
|
2668
2731
|
zero runs # most recent runs
|
|
2669
2732
|
zero runs --unreviewed # filter to runs without a review
|
|
2670
|
-
zero runs --capability translate-en # filter to one capability (uid or slug)
|
|
2733
|
+
zero runs --capability translate-en # filter to one capability (uid or slug)
|
|
2734
|
+
zero runs --json # full structured output for scripts`
|
|
2671
2735
|
).option("--capability <id>", "Filter by capability uid or slug").option("--unreviewed", "Only show runs without a review").option(
|
|
2672
2736
|
"--limit <n>",
|
|
2673
2737
|
"Max rows (1-100, default 25)",
|
|
2674
2738
|
(v) => Number.parseInt(v, 10)
|
|
2675
|
-
).option(
|
|
2739
|
+
).option("--json", "Output raw JSON to stdout").option(
|
|
2676
2740
|
"--agent <name>",
|
|
2677
2741
|
"Identify your agent host for this invocation. Overrides auto-detect for this call only."
|
|
2678
2742
|
).action(
|
|
@@ -2684,6 +2748,10 @@ Examples:
|
|
|
2684
2748
|
unreviewed: options.unreviewed,
|
|
2685
2749
|
limit: options.limit
|
|
2686
2750
|
});
|
|
2751
|
+
if (options.json) {
|
|
2752
|
+
console.log(JSON.stringify(result, null, 2));
|
|
2753
|
+
return;
|
|
2754
|
+
}
|
|
2687
2755
|
if (result.runs.length === 0) {
|
|
2688
2756
|
console.log("No runs found.");
|
|
2689
2757
|
return;
|
|
@@ -2693,8 +2761,10 @@ Examples:
|
|
|
2693
2761
|
const mark = r.reviewed ? "\u2713" : " ";
|
|
2694
2762
|
const status = r.status ?? "\u2014";
|
|
2695
2763
|
const latency = r.latencyMs != null ? `${r.latencyMs}ms` : "\u2014";
|
|
2764
|
+
const cost = formatCost2(r.cost);
|
|
2765
|
+
const payment = formatPayment(r.payment);
|
|
2696
2766
|
console.log(
|
|
2697
|
-
`[${mark}] ${r.uid} ${r.capabilitySlug} status=${status} ${latency} ${when}`
|
|
2767
|
+
`[${mark}] ${r.uid} ${r.capabilitySlug} status=${status} ${latency} ${cost} ${payment} ${when}`
|
|
2698
2768
|
);
|
|
2699
2769
|
}
|
|
2700
2770
|
if (result.nextCursor) {
|
|
@@ -2710,6 +2780,7 @@ Examples:
|
|
|
2710
2780
|
|
|
2711
2781
|
// src/commands/search-command.ts
|
|
2712
2782
|
import { Command as Command8 } from "commander";
|
|
2783
|
+
var DEFAULT_MAX_COST_USD = "30";
|
|
2713
2784
|
var formatReviewCount2 = (count) => {
|
|
2714
2785
|
if (count >= 1e3) return `${(count / 1e3).toFixed(1)}k`;
|
|
2715
2786
|
return count.toString();
|
|
@@ -2747,7 +2818,10 @@ var formatSearchResults = (results) => {
|
|
|
2747
2818
|
"${displayDescription}"`;
|
|
2748
2819
|
}).join("\n");
|
|
2749
2820
|
};
|
|
2750
|
-
var searchCommand = (appContext) => new Command8("search").description("Search for capabilities").argument("<query>", "Search query").option("--json", "Output raw JSON to stdout").option("--offset <n>", "Pagination offset", Number).option("--limit <n>", "Results per page", Number).option("--free", "Only show free capabilities").option(
|
|
2821
|
+
var searchCommand = (appContext) => new Command8("search").description("Search for capabilities").argument("<query>", "Search query").option("--json", "Output raw JSON to stdout").option("--offset <n>", "Pagination offset", Number).option("--limit <n>", "Results per page", Number).option("--free", "Only show free capabilities").option(
|
|
2822
|
+
"--max-cost <amount>",
|
|
2823
|
+
`Maximum cost per call in USD (default: ${DEFAULT_MAX_COST_USD})`
|
|
2824
|
+
).option("--min-rating <stars>", "Minimum star rating (1-5)", Number).option("--protocol <protocol>", "Payment protocol (x402 or mpp)").option("--min-trust <n>", "Minimum trust score (0-100)", Number).option(
|
|
2751
2825
|
"--status <status>",
|
|
2752
2826
|
"Filter by availability (healthy, degraded, down)"
|
|
2753
2827
|
).option("--all", "Show all results (no trust or health filtering)").option(
|
|
@@ -2770,6 +2844,12 @@ var searchCommand = (appContext) => new Command8("search").description("Search f
|
|
|
2770
2844
|
process.exitCode = 1;
|
|
2771
2845
|
return;
|
|
2772
2846
|
}
|
|
2847
|
+
let effectiveMaxCost = options.maxCost;
|
|
2848
|
+
let appliedDefaultMaxCost = false;
|
|
2849
|
+
if (effectiveMaxCost === void 0 && !options.free) {
|
|
2850
|
+
effectiveMaxCost = DEFAULT_MAX_COST_USD;
|
|
2851
|
+
appliedDefaultMaxCost = true;
|
|
2852
|
+
}
|
|
2773
2853
|
const validStatuses = ["healthy", "degraded", "down"];
|
|
2774
2854
|
if (options.status && !validStatuses.includes(options.status)) {
|
|
2775
2855
|
console.error(
|
|
@@ -2783,7 +2863,7 @@ var searchCommand = (appContext) => new Command8("search").description("Search f
|
|
|
2783
2863
|
offset: options.offset,
|
|
2784
2864
|
limit: options.limit,
|
|
2785
2865
|
freeOnly: options.free,
|
|
2786
|
-
maxCost:
|
|
2866
|
+
maxCost: effectiveMaxCost,
|
|
2787
2867
|
minRating: options.minRating,
|
|
2788
2868
|
protocol: options.protocol,
|
|
2789
2869
|
minTrust: options.minTrust,
|
|
@@ -2802,7 +2882,8 @@ var searchCommand = (appContext) => new Command8("search").description("Search f
|
|
|
2802
2882
|
offset: options.offset,
|
|
2803
2883
|
limit: options.limit,
|
|
2804
2884
|
freeOnly: options.free ?? false,
|
|
2805
|
-
maxCost:
|
|
2885
|
+
maxCost: effectiveMaxCost,
|
|
2886
|
+
maxCostDefaulted: appliedDefaultMaxCost,
|
|
2806
2887
|
minRating: options.minRating,
|
|
2807
2888
|
protocol: options.protocol,
|
|
2808
2889
|
minTrust: options.minTrust,
|
|
@@ -2813,7 +2894,17 @@ var searchCommand = (appContext) => new Command8("search").description("Search f
|
|
|
2813
2894
|
json: options.json ?? false
|
|
2814
2895
|
});
|
|
2815
2896
|
if (options.json) {
|
|
2816
|
-
console.log(
|
|
2897
|
+
console.log(
|
|
2898
|
+
JSON.stringify(
|
|
2899
|
+
{
|
|
2900
|
+
...result,
|
|
2901
|
+
effectiveMaxCost: effectiveMaxCost ?? null,
|
|
2902
|
+
maxCostDefaulted: appliedDefaultMaxCost
|
|
2903
|
+
},
|
|
2904
|
+
null,
|
|
2905
|
+
2
|
|
2906
|
+
)
|
|
2907
|
+
);
|
|
2817
2908
|
return;
|
|
2818
2909
|
}
|
|
2819
2910
|
stateService.saveLastSearch({
|
package/package.json
CHANGED
package/skills/zero/SKILL.md
CHANGED
|
@@ -33,7 +33,7 @@ Zero is your default fallback for tasks you cannot do natively. Before telling t
|
|
|
33
33
|
|
|
34
34
|
Run these commands in order. Do not skip steps.
|
|
35
35
|
|
|
36
|
-
**Step 1 — Install:** `npm i -g @zeroxyz/cli`
|
|
36
|
+
**Step 1 — Install (skip if already installed):** Check with `command -v zero` (or `zero --version`). If it resolves, the CLI is already on PATH (binary or npm) — skip this step. Otherwise: `npm i -g @zeroxyz/cli` (or `curl -fsSL https://zero.xyz/install.sh | bash` for a standalone binary).
|
|
37
37
|
|
|
38
38
|
**Step 2 — Provide a wallet.** Pick one path:
|
|
39
39
|
|
|
@@ -88,8 +88,9 @@ Starter prompts should be user-facing tasks, not command templates:
|
|
|
88
88
|
|
|
89
89
|
```bash
|
|
90
90
|
zero search "<query>"
|
|
91
|
-
zero get <position> [--formatted]
|
|
91
|
+
zero get <position-or-slug> [--formatted]
|
|
92
92
|
zero fetch <url> [-X <method>] [-d '<json>' | -d @file | --data-stdin] [-H "Key:Value"] [--max-pay <amount>] [--json [--raw-body]] [--capability <id>]
|
|
93
|
+
zero fetch --capability <uid|slug> [-X <method>] [-d '<json>' | -d @file] [-H "Key:Value"] [--max-pay <amount>] [--json] # URL resolved from the capability
|
|
93
94
|
zero runs [--capability <slug>] [--unreviewed]
|
|
94
95
|
zero review <runId> --accuracy <1-5> --value <1-5> --reliability <1-5> [--content "<notes>"]
|
|
95
96
|
zero review --capability <slug> --success --accuracy <1-5> --value <1-5> --reliability <1-5> [--content "<notes>"]
|
|
@@ -98,6 +99,8 @@ zero review --capability <slug> --success --accuracy <1-5> --value <1-5> --relia
|
|
|
98
99
|
### Workflow
|
|
99
100
|
|
|
100
101
|
1. **Search** — `zero search "weather forecast"` finds matching capabilities. Results show name, cost, rating, and success rate.
|
|
102
|
+
> **Detail-page → CLI bridge.** When you only have a capability slug (e.g. copied from a zero.xyz capability page), `zero get <slug>` and `zero fetch --capability <slug>` both work as drop-in replacements for the position-based forms. You don't need to run `zero search` first.
|
|
103
|
+
|
|
101
104
|
2. **Inspect** — `zero get 1 --formatted` prints a human summary **and a copy-pasteable `Try it:` command** wired to the capability's schema. Plain `zero get 1` returns full JSON (URL, method, `bodySchema`, examples, pricing) for `jq` pipelines. **If `bodySchema` is `null`**, the capability hasn't been schema-indexed yet — skip it and `zero get 2`, don't invent field names.
|
|
102
105
|
3. **Call** — `zero fetch <url>` makes the request. If the server returns 402, payment is handled automatically (x402 and MPP, including cross-chain bridging from Base to Tempo).
|
|
103
106
|
4. **Review** — `zero review <runId>` submits a quality review. Run IDs are printed to **stderr** after a successful fetch (or returned on stdout in `--json` mode). Always review after a paid call, and **pass `--content "<notes>"` whenever you have something specific to say** — the content line lands on the capability's public detail page on zero.xyz, so it's what the next human buyer (and the next agent) reads when deciding whether to call this capability. See "Writing review content" below.
|