@credda/cli 0.1.0 → 0.1.2

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 CHANGED
@@ -29,6 +29,17 @@ credda verify <file|-> # OFFLINE-verify a credential someone handed you:
29
29
  # '-' reads stdin. Exit 0 valid / 2 invalid.
30
30
  credda registry # federated trust registry (/.well-known)
31
31
  credda did # issuer DID document
32
+ credda benchmarks # cohort-benchmark catalog: the dimensions you can
33
+ # benchmark on and the k-anonymity floor below
34
+ # which no cohort is disclosed
35
+ credda reason-codes # adverse-action reason-code catalog (ECOA / Reg B).
36
+ # Credda supplies the attribution only — it is not
37
+ # a creditor and issues no notice.
38
+ credda badges list # the closed set of Open Badges 3.0 achievements
39
+ credda badges get <badgeId> # this issuer will sign, and one definition
40
+ credda professional-record public <token>
41
+ # the professional record behind a share token —
42
+ # the token IS the subject's consent to present it
32
43
  ```
33
44
 
34
45
  Platform — set `CREDDA_API_KEY` (a `crd_live_…` platform key):
@@ -38,11 +49,135 @@ credda score <userId> # current score
38
49
  credda explain <userId> # factor-level explanation
39
50
  credda components <userId> # six named 0-100 components
40
51
  credda risk <userId> # advisory risk signals
41
- credda usage [days] # your platform's metered usage
52
+ credda trust-summary <userId> [--narrative]
53
+ # deterministic, evidence-based summary + strengths
54
+ # + risks. It explains; it is never a verdict.
55
+ # --narrative adds an advisory AI retelling.
56
+ credda benchmark <userId> [--dimension <d>]
57
+ # where the subject sits in its cohort: percentile
58
+ # + the cohort distribution. `available:false`
59
+ # when the cohort is below the k-anonymity floor
60
+ # (insufficient_data) or the subject has no score
61
+ # yet (no_score).
62
+ credda distribution [--dimension <d>] [--cohort <c>]
63
+ # aggregate, k-anonymised cohort distribution.
64
+ # Omit --cohort for every cohort on the dimension.
65
+ credda users [--score-min <n>] [--score-max <n>] [--band <b>]
66
+ [--subject-type <PERSON|AGENT>] [--active-since <iso>]
67
+ [--verified] [--min-verified <n>]
68
+ [--sort <score|lastActivity|registered|externalId>]
69
+ [--order <asc|desc>] [--cursor <c>] [--limit <n>]
70
+ # query + export your book of subjects. The filter
71
+ # set is closed and validated — no query DSL.
72
+ credda usage [days] # your platform's metered usage (trailing window)
73
+ credda usage --from 2026-06-01 --to 2026-06-30
74
+ # explicit statement range (mutually exclusive
75
+ # with [days])
76
+ credda usage --csv usage.csv
77
+ # write the flat CSV statement to a file
78
+ # (raw ?format=csv fetch; combines with either window)
79
+ credda activity [--action <A>] [--from <t>] [--to <t>] [--cursor <c>] [--limit <n>]
80
+ # your platform's own activity/audit log,
81
+ # newest-first, cursor-paginated
82
+ credda verified-profile <userId>
83
+ # how much of a subject's CLAIMED record
84
+ # (education/skills/certifications/employment) is
85
+ # third-party verified. Counts WHETHER a claim is
86
+ # verified, never how prestigious it is — and can
87
+ # never move the Reliability Score.
88
+ credda qualify <userId> --category <education|skill|certification|employment>
89
+ [--label <l>] [--issuer <i>] [--verified-by <witness>]
90
+ # record a qualification claim. Always recorded;
91
+ # counts as VERIFIED only with a genuine
92
+ # third-party --verified-by witness.
93
+ credda professional-record get <userId>
94
+ # résumé-shaped summary of a VERIFIED work record.
95
+ # Describes a record — not a hiring verdict, a
96
+ # background check, or a consumer report.
97
+ credda professional-record credential <userId> [--ttl <seconds>]
98
+ # mint the signed, offline-verifiable credential
99
+ # (+ an "Add to LinkedIn" certification link)
42
100
  credda mint <userId> # mint a share token
43
101
  credda revoke <userId> # revoke a share token
44
102
  ```
45
103
 
104
+ Confirmation requests — the counterparty-confirmation primitive. You propose an
105
+ outcome and deliver the one-time token yourself; the event is written, verified,
106
+ only when that distinct party confirms:
107
+
108
+ ```sh
109
+ credda confirmations create --user worker_7 --type CONTRACT_FULFILLED \
110
+ --counterparty client_42 --counterparty-name "Acme Ltd" \
111
+ --description "Kitchen refit" [--stake HIGH] [--value 1200] \
112
+ [--due <iso>] [--completed <iso>] [--return-url <url>] \
113
+ [--expires-in 14] [--idempotency-key <k>]
114
+ # needs CREDDA_API_KEY. The token is shown ONCE;
115
+ # creating a request writes no event.
116
+ credda confirmations list [--status PENDING] [--cursor <c>] [--limit <n>]
117
+ credda confirmations get <id>
118
+ credda confirmations cancel <id> # only while PENDING
119
+
120
+ # ⚠️ These two are the COUNTERPARTY's calls and take NO API key — they hold a
121
+ # token, not a Credda account:
122
+ credda confirmations preview <id> --token <t>
123
+ credda confirmations respond <id> --token <t> --confirm
124
+ credda confirmations respond <id> --token <t> --decline
125
+ # --confirm writes the verified event; --decline
126
+ # writes nothing. Single-use either way, and
127
+ # there is no default: you must say which.
128
+ ```
129
+
130
+ Threshold policies — declarative "tell me when this line is crossed", delivered
131
+ as `policy.threshold_crossed` through your webhooks. Config only: a policy never
132
+ reads into, blocks, or changes a score:
133
+
134
+ ```sh
135
+ credda policies create --name "Watch 60" --user worker_7 \
136
+ --metric score --direction down --threshold 60
137
+ credda policies create --name "Anyone entering High Risk" --all \
138
+ --metric band --direction enter --band "High Risk"
139
+ credda policies list [--cursor <c>] [--limit <n>]
140
+ credda policies get <id>
141
+ credda policies update <id> [--threshold <n>] [--direction <d>] [--band <b>]
142
+ [--component <c>] [--name <n>] [--activate | --deactivate]
143
+ # the metric is immutable — delete and recreate
144
+ credda policies delete <id>
145
+ ```
146
+
147
+ Score monitors — set `CREDDA_API_KEY`. Edge-triggered threshold/band watches
148
+ that deliver `monitor.triggered` through your subscribed webhooks;
149
+ notification config only — a monitor never affects a score:
150
+
151
+ ```sh
152
+ credda monitors list [--cursor <c>] [--limit <n>]
153
+ credda monitors get <id>
154
+ credda monitors create --user <externalId> --below 40
155
+ # at least one condition required:
156
+ # --below <score> downward crossing (also fires
157
+ # on a FIRST score already below)
158
+ # --above <score> upward crossing
159
+ # --band-change any band change
160
+ credda monitors delete <id>
161
+ ```
162
+
163
+ Bulk screenings — set `CREDDA_API_KEY`. Async batch score reads (up to
164
+ 10,000 ids per job), strictly read-only:
165
+
166
+ ```sh
167
+ credda screen u1,u2 u3 # ids inline, comma/space separated
168
+ credda screen --file roster.csv
169
+ # one id per line, or a CSV whose FIRST column is
170
+ # the id (a leading id/userId/externalId header
171
+ # row is skipped; no quoted-CSV handling)
172
+ credda screen u1,u2 --wait # poll until the job finishes, print the summary
173
+ # (exit 1 if the job FAILED)
174
+ credda screenings list [--cursor <c>] [--limit <n>]
175
+ credda screenings get <id> # job status + summary
176
+ credda screenings results <id> # per-user results as JSON
177
+ credda screenings results <id> --csv out.csv
178
+ # write the CSV attachment instead (raw fetch)
179
+ ```
180
+
46
181
  Webhooks — set `CREDDA_API_KEY`:
47
182
 
48
183
  ```sh
package/dist/cli.d.ts CHANGED
@@ -31,9 +31,57 @@ export interface CliContext {
31
31
  port: number;
32
32
  secret?: string;
33
33
  }) => Promise<void>;
34
+ /**
35
+ * Raw authenticated GET returning the response body as text — for the CSV
36
+ * endpoints (`?format=csv`), which the typed SDK deliberately leaves to raw
37
+ * fetch. `path` is relative to the `/api/v1` prefix.
38
+ */
39
+ fetchCsv?: (path: string, apiKey: string) => Promise<string>;
40
+ /** Write a file to disk (CSV outputs). Injected so the router stays fs-free. */
41
+ writeFile?: (path: string, content: string) => Promise<void>;
42
+ /** Sleep between `screen --wait` polls. Injected so tests don't wait. */
43
+ sleep?: (ms: number) => Promise<void>;
44
+ /** Poll interval for `screen --wait` (default 2000ms). */
45
+ pollIntervalMs?: number;
34
46
  }
35
- export declare const VERSION = "0.0.1";
36
- export declare const HELP = "credda \u2014 portable trust from the terminal\n\nPublic (no API key):\n credda lookup <token> Trust check for a share token\n credda export <token> Full self-verifying trust export bundle\n credda verify <file|-> Offline-verify a credential: a W3C VC-JWT,\n a compact Trust Credential, or a saved trust\n export bundle (auto-detected). '-' = stdin.\n credda registry Federated trust registry\n credda did Issuer DID document\n\nPlatform (needs CREDDA_API_KEY):\n credda score <userId> Current score\n credda explain <userId> Factor-level score explanation\n credda components <userId> Six named 0-100 score components\n credda risk <userId> Advisory risk signals\n credda usage [days] Your platform's metered API usage\n credda mint <userId> Mint a share token for a user\n credda revoke <userId> Revoke a user's share token\n\nWebhooks (needs CREDDA_API_KEY):\n credda webhooks list Your webhook subscriptions\n credda webhooks create <url> <event..> Subscribe (secret shown ONCE)\n credda webhooks delete <id> Remove a webhook\n credda webhooks test <id> Send a synthetic signed delivery\n credda webhooks deliveries <id> Recent delivery attempts (incl. retries)\n\nLocal development:\n credda listen [port] Local webhook receiver: verifies each delivery's\n HMAC signature (CREDDA_WEBHOOK_SECRET) and\n pretty-prints the payload. Default port 4141.\n Credda delivers to public HTTPS only \u2014 expose\n this port with your own tunnel (e.g. cloudflared).\n\nEnvironment:\n CREDDA_API_URL API base (default https://api.credda.io)\n CREDDA_API_KEY Platform API key for keyed commands\n CREDDA_WEBHOOK_SECRET whsec_\u2026 signing secret for \"credda listen\"\n\nExit codes: 0 ok/valid \u00B7 1 error \u00B7 2 credential failed verification";
47
+ export declare const VERSION = "0.1.2";
48
+ export declare const HELP = "credda \u2014 portable trust from the terminal\n\nPublic (no API key):\n credda lookup <token> Trust check for a share token\n credda export <token> Full self-verifying trust export bundle\n credda verify <file|-> Offline-verify a credential: a W3C VC-JWT,\n a compact Trust Credential, or a saved trust\n export bundle (auto-detected). '-' = stdin.\n credda registry Federated trust registry\n credda did Issuer DID document\n credda benchmarks Cohort-benchmark catalog (dimensions + k-anonymity)\n credda reason-codes Adverse-action reason-code catalog (ECOA / Reg B)\n credda badges list Open Badges 3.0 achievements this issuer signs\n credda badges get <badgeId> One achievement definition\n credda professional-record public <token>\n The professional record behind a share token\n (the subject's own consent to present it)\n\nPlatform (needs CREDDA_API_KEY):\n credda score <userId> Current score\n credda explain <userId> Factor-level score explanation\n credda components <userId> Six named 0-100 score components\n credda risk <userId> Advisory risk signals\n credda trust-summary <userId> [--narrative]\n Deterministic, evidence-based trust summary\n (explains; never a verdict). --narrative adds an\n advisory AI retelling when the server has AI on.\n credda benchmark <userId> [--dimension <d>]\n Where a subject sits within its cohort:\n percentile + the cohort distribution\n credda distribution [--dimension <d>] [--cohort <c>]\n Aggregate, k-anonymised cohort distribution.\n Omit --cohort for every cohort on the dimension.\n credda users [--score-min <n>] [--score-max <n>] [--band <b>] [--subject-type <PERSON|AGENT>]\n [--active-since <iso>] [--verified] [--min-verified <n>]\n [--sort <score|lastActivity|registered|externalId>] [--order <asc|desc>]\n [--cursor <c>] [--limit <n>]\n Query + export your book of subjects\n credda usage [days] [--from <date> --to <date>] [--csv <outfile>]\n Your platform's metered API usage. Either a\n trailing [days] window OR an inclusive\n --from/--to date range (YYYY-MM-DD), not both.\n --csv writes the flat CSV statement to a file.\n credda activity [--action <A>] [--from <t> --to <t>] [--cursor <c>] [--limit <n>]\n Your platform's own activity/audit log,\n newest-first, cursor-paginated\n credda verified-profile <userId>\n How much of a subject's CLAIMED record\n (education/skills/certifications/employment) is\n third-party verified. Counts whether a claim is\n verified, never how prestigious it is \u2014 and it\n can never move the Reliability Score.\n credda qualify <userId> --category <education|skill|certification|employment>\n [--label <l>] [--issuer <i>] [--verified-by <witness>]\n Record a qualification claim. Always recorded;\n counts as VERIFIED only with a genuine\n third-party --verified-by witness.\n credda professional-record get <userId>\n R\u00E9sum\u00E9-shaped summary of a VERIFIED work record.\n Describes a record \u2014 not a hiring verdict, a\n background check, or a consumer report.\n credda professional-record credential <userId> [--ttl <seconds>]\n Mint the signed, offline-verifiable Professional\n Record Credential (+ an \"Add to LinkedIn\" link)\n credda mint <userId> Mint a share token for a user\n credda revoke <userId> Revoke a user's share token\n\nConfirmation requests \u2014 the counterparty-confirmation primitive. You PROPOSE an\noutcome and deliver the one-time token to the counterparty over YOUR OWN channel;\nthe event is written, verified, only when that distinct party confirms:\n credda confirmations create --user <externalId> --type <eventType>\n --counterparty <ref> [--counterparty-name <n>] [--description <d>]\n [--stake <HIGH|MEDIUM|LOW>] [--value <n>] [--due <iso>] [--completed <iso>]\n [--return-url <url>] [--expires-in <days>] [--idempotency-key <k>]\n Needs CREDDA_API_KEY. Token shown ONCE.\n credda confirmations list [--status <s>] [--cursor <c>] [--limit <n>]\n credda confirmations get <id>\n credda confirmations cancel <id>\n credda confirmations preview <id> --token <t>\n What the counterparty is asked to confirm.\n NO API key \u2014 the token is the capability.\n credda confirmations respond <id> --token <t> (--confirm | --decline)\n The counterparty's decision. NO API key.\n --confirm writes the event; --decline writes\n nothing. Single-use either way.\n\nThreshold policies (needs CREDDA_API_KEY) \u2014 declarative \"tell me when this line\nis crossed\"; delivers policy.threshold_crossed through your webhooks. Config\nonly: a policy never reads into, blocks, or changes a score:\n credda policies list [--cursor <c>] [--limit <n>]\n credda policies get <id>\n credda policies create --name <n> (--user <externalId> | --all)\n --metric <score|component|band|verified_events>\n [--direction <up|down|enter|leave>] [--threshold <n>]\n [--component <reliability|timeliness|trustworthiness|verification|consistency|momentum>]\n [--band <b>]\n credda policies update <id> [--name <n>] [--direction <d>] [--threshold <n>]\n [--component <c>] [--band <b>] [--activate | --deactivate]\n The metric is immutable \u2014 delete + recreate.\n credda policies delete <id>\n\nScore monitors (needs CREDDA_API_KEY) \u2014 edge-triggered watches that deliver\n\"monitor.triggered\" through your webhooks; notification config only, a\nmonitor never affects a score:\n credda monitors list [--cursor <c>] [--limit <n>]\n credda monitors get <id>\n credda monitors create --user <externalId> [--below <score>] [--above <score>] [--band-change]\n At least one condition required. --below fires\n on a downward crossing (and on a first score\n already below it), --above on an upward\n crossing, --band-change on any band change.\n credda monitors delete <id>\n\nBulk screenings (needs CREDDA_API_KEY) \u2014 async batch score reads, up to\n10,000 ids per job, strictly read-only:\n credda screen <ids...> Submit ids (comma/space separated), or:\n credda screen --file <path> One id per line, or a CSV whose FIRST column\n is the id (a leading \"id\"/\"userId\"/\n \"externalId\" header row is skipped).\n [--wait] Poll until the job finishes, then print the\n summary (exit 1 if the job FAILED).\n credda screenings list [--cursor <c>] [--limit <n>]\n credda screenings get <id> Job status + summary\n credda screenings results <id> [--csv <outfile>]\n Per-user results (JSON; --csv writes the CSV\n attachment to a file instead)\n\nWebhooks (needs CREDDA_API_KEY):\n credda webhooks list Your webhook subscriptions\n credda webhooks create <url> <event..> Subscribe (secret shown ONCE)\n credda webhooks delete <id> Remove a webhook\n credda webhooks test <id> Send a synthetic signed delivery\n credda webhooks deliveries <id> Recent delivery attempts (incl. retries)\n credda webhooks recent [event..] Recent events across ALL your endpoints\n (sample data for automation platforms;\n falls back to catalog examples, flagged\n isExample, when nothing has fired yet)\n\nLocal development:\n credda listen [port] Local webhook receiver: verifies each delivery's\n HMAC signature (CREDDA_WEBHOOK_SECRET) and\n pretty-prints the payload. Default port 4141.\n Credda delivers to public HTTPS only \u2014 expose\n this port with your own tunnel (e.g. cloudflared).\n\nEnvironment:\n CREDDA_API_URL API base (default https://api.credda.io)\n CREDDA_API_KEY Platform API key for keyed commands\n CREDDA_WEBHOOK_SECRET whsec_\u2026 signing secret for \"credda listen\"\n\nExit codes: 0 ok/valid \u00B7 1 error \u00B7 2 credential failed verification";
49
+ /**
50
+ * Extra stderr lines for a failed command.
51
+ *
52
+ * The important one is the **request id**: it is the single fastest way for
53
+ * Credda to diagnose a failure, and a CLI user has nowhere else to find it.
54
+ * Also surfaces the machine code (so it can be looked up in
55
+ * `GET /api/v1/errors`) and any `Retry-After` the server asked for.
56
+ *
57
+ * Duck-typed rather than `instanceof CreddaError` on purpose — the router
58
+ * imports only TYPES from the SDK, so it stays pure and trivially mockable.
59
+ * Pure and exported for testing.
60
+ */
61
+ export declare function errorHints(e: unknown): string[];
62
+ /**
63
+ * Tiny flag parser: `--name value` for valued flags, bare `--name` for
64
+ * booleans, everything else positional. Unknown `--flags` are an error rather
65
+ * than silently becoming positionals.
66
+ */
67
+ export declare function parseFlags(args: string[], spec?: {
68
+ valued?: string[];
69
+ boolean?: string[];
70
+ }): {
71
+ positional: string[];
72
+ flags: Record<string, string | true>;
73
+ };
74
+ /**
75
+ * Parse the ids for `credda screen`. Inline args may be comma- and/or
76
+ * space-separated. A file is one id per line — or a CSV, in which case only
77
+ * the FIRST column is read (a leading header row named id/userId/externalId
78
+ * is skipped). Deduped, order-preserving. Deliberately simple: no quoted-CSV
79
+ * handling — an id containing a comma isn't a valid external id anyway.
80
+ */
81
+ export declare function parseIdList(input: {
82
+ inline?: string[];
83
+ fileText?: string;
84
+ }): string[];
37
85
  /** Classify verify input: trust-export bundle JSON, VC-JWT, or compact credential. */
38
86
  export declare function classifyCredentialInput(raw: string): {
39
87
  kind: 'export';
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,uDAAuD;IACvD,SAAS,EAAE;QACT,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACrE,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7D,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;KACpE,CAAC;IACF,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,IAAI,4oEAuCmD,CAAC;AAmBrE,sFAAsF;AACtF,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAcrH;AAED,6DAA6D;AAC7D,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA6I7E"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}