@atlasauth/pca-cli 0.0.0-stage → 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Atlas Authorization
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,54 @@
1
- # Temporary Holding Version
1
+ # @atlasauth/pca-cli
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The `pca` developer CLI for Proof-Carrying Authority (PCA). Decode a PCActn, run the verifier and see why it passed or failed each check, mint a throwaway dev keypair, simulate a policy over a list of actions, and emit a `.well-known/pca-configuration` discovery document.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm i -g @atlasauth/pca-cli
9
+ # or run without installing:
10
+ npx @atlasauth/pca-cli <command>
11
+ ```
12
+
13
+ This installs the `pca` binary. It depends on `@atlasauth/pca`.
14
+
15
+ ## Usage
16
+
17
+ ```sh
18
+ # Summarize a PCActn (JSON or base64url). A file path, or '-' to read STDIN.
19
+ pca decode action.txt
20
+ pca decode -
21
+
22
+ # Run the core verifier and explain each check (PASS / FAIL / -), ending in ALLOW or DENY.
23
+ pca explain action.txt --aud ins_acme
24
+
25
+ # Mint a throwaway Ed25519 dev keypair (base64url).
26
+ pca keygen
27
+
28
+ # Replay actions against a compiled policy: auto / step_up / deny, with the trust budget after each.
29
+ pca simulate policy.json actions.json
30
+
31
+ # Emit a discovery document for a resource server to publish.
32
+ pca discovery --aud ins_acme [--suites ed25519,ml-dsa-65] [--stepup <url>] [--revocation <url>] [--beacon <url>] [--attest <url>]
33
+ ```
34
+
35
+ Input files:
36
+
37
+ ```jsonc
38
+ // policy.json
39
+ { "permissions": { "stripe": ["refund"] }, "limits": { "refund": "$500/day" } }
40
+ // actions.json
41
+ [ { "verb": "stripe.refund", "resource": "charge:ch_1", "params": { "amount": 42 } } ]
42
+ ```
43
+
44
+ The command functions (`cmdDecode`, `cmdExplain`, `cmdKeygen`, `cmdSimulate`, `cmdDiscovery`) are also exported for programmatic use.
45
+
46
+ ## Status
47
+
48
+ `decode`, `explain` and `simulate` are read-only inspectors for development. `explain` verifies against the grant in the PCActn's own capability chain, so its verdict is the local, grant-relative view; checks that need server-side state (revocation, attestation, threshold co-signatures, taint) are shown as not enforced. Nothing here authorizes anything: the resource server's verifier, with its stored counter and revocation state, remains the authority. Cryptography in PCA is unaudited.
49
+
50
+ Source and issues: https://github.com/Atlas-Authorization/pca
51
+
52
+ ## License
53
+
54
+ MIT - see LICENSE
package/dist/cli.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `pca` — the PCA developer CLI entrypoint.
4
+ *
5
+ * A tiny, dependency-free argv parser dispatches to the pure command functions in `./index`. Input
6
+ * that is a PCActn / JSON is read from a file path argument, or from STDIN when the argument is `-`.
7
+ * Errors print to stderr and set a non-zero `process.exitCode` (we never call `process.exit`, so
8
+ * buffered stdout always flushes first).
9
+ */
10
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * `pca` — the PCA developer CLI entrypoint.
5
+ *
6
+ * A tiny, dependency-free argv parser dispatches to the pure command functions in `./index`. Input
7
+ * that is a PCActn / JSON is read from a file path argument, or from STDIN when the argument is `-`.
8
+ * Errors print to stderr and set a non-zero `process.exitCode` (we never call `process.exit`, so
9
+ * buffered stdout always flushes first).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const node_fs_1 = require("node:fs");
13
+ const index_1 = require("./index");
14
+ const USAGE = `pca — Proof-Carrying Authority dev CLI
15
+
16
+ Usage:
17
+ pca decode <file|-> Summarize a PCActn (JSON or base64url).
18
+ pca explain <file|-> [--aud <id>] Run the real verifier and explain each check (PASS/FAIL/—).
19
+ pca keygen Mint a throwaway Ed25519 dev keypair (base64url).
20
+ pca simulate <policy.json> <actions.json>
21
+ Replay actions against a compiled policy (auto/step_up/deny).
22
+ pca discovery --aud <id> [--suites a,b] [--stepup <url>] [--revocation <url>] [--beacon <url>] [--attest <url>]
23
+ Emit a .well-known/pca-configuration document.
24
+
25
+ Notes:
26
+ <-> reads from STDIN. Nothing here authorizes anything — the resource server's verifier decides.
27
+ `;
28
+ /** Read a positional file argument, or STDIN when it is '-'. */
29
+ function readSource(arg) {
30
+ if (arg === '-')
31
+ return (0, node_fs_1.readFileSync)(0, 'utf8');
32
+ return (0, node_fs_1.readFileSync)(arg, 'utf8');
33
+ }
34
+ /**
35
+ * Minimal hand-rolled parser (no dependency): everything after the sub-command, splitting
36
+ * `--flag value` and `--flag=value` out of the positionals. A bare `--flag` with no value is treated
37
+ * as the empty string.
38
+ */
39
+ function parseArgs(argv) {
40
+ const positionals = [];
41
+ const flags = {};
42
+ for (let i = 0; i < argv.length; i++) {
43
+ const a = argv[i];
44
+ if (a === undefined)
45
+ continue;
46
+ if (a.startsWith('--')) {
47
+ const body = a.slice(2);
48
+ const eq = body.indexOf('=');
49
+ if (eq >= 0) {
50
+ flags[body.slice(0, eq)] = body.slice(eq + 1);
51
+ }
52
+ else {
53
+ const next = argv[i + 1];
54
+ if (next !== undefined && !next.startsWith('--')) {
55
+ flags[body] = next;
56
+ i++;
57
+ }
58
+ else {
59
+ flags[body] = '';
60
+ }
61
+ }
62
+ }
63
+ else {
64
+ positionals.push(a);
65
+ }
66
+ }
67
+ return { positionals, flags };
68
+ }
69
+ async function main() {
70
+ const argv = process.argv.slice(2);
71
+ const command = argv[0];
72
+ if (command === undefined || command === '--help' || command === '-h' || command === 'help') {
73
+ process.stdout.write(USAGE);
74
+ return;
75
+ }
76
+ const { positionals, flags } = parseArgs(argv.slice(1));
77
+ switch (command) {
78
+ case 'decode': {
79
+ const src = positionals[0];
80
+ if (src === undefined)
81
+ throw new Error("decode: expected a file path or '-' for STDIN");
82
+ process.stdout.write((0, index_1.cmdDecode)(readSource(src)) + '\n');
83
+ return;
84
+ }
85
+ case 'explain': {
86
+ const src = positionals[0];
87
+ if (src === undefined)
88
+ throw new Error("explain: expected a file path or '-' for STDIN");
89
+ const opts = {};
90
+ if (flags.aud !== undefined && flags.aud !== '')
91
+ opts.audience = flags.aud;
92
+ const res = await (0, index_1.cmdExplain)(readSource(src), opts);
93
+ process.stdout.write(res.text + '\n');
94
+ if (!res.allow)
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ case 'keygen': {
99
+ process.stdout.write((0, index_1.cmdKeygen)().text + '\n');
100
+ return;
101
+ }
102
+ case 'simulate': {
103
+ const policyPath = positionals[0];
104
+ const actionsPath = positionals[1];
105
+ if (policyPath === undefined || actionsPath === undefined) {
106
+ throw new Error('simulate: expected <policy.json> <actions.json>');
107
+ }
108
+ process.stdout.write((0, index_1.cmdSimulate)(readSource(policyPath), readSource(actionsPath)) + '\n');
109
+ return;
110
+ }
111
+ case 'discovery': {
112
+ if (flags.aud === undefined || flags.aud === '')
113
+ throw new Error('discovery: --aud <id> is required');
114
+ const endpoints = {};
115
+ if (flags.attest)
116
+ endpoints.attestation_challenge = flags.attest;
117
+ if (flags.revocation)
118
+ endpoints.revocation_epoch = flags.revocation;
119
+ if (flags.beacon)
120
+ endpoints.liveness_beacon = flags.beacon;
121
+ if (flags.stepup)
122
+ endpoints.stepup = flags.stepup;
123
+ process.stdout.write((0, index_1.cmdDiscovery)({
124
+ audience: flags.aud,
125
+ ...(flags.suites ? { suites: flags.suites.split(',').map((s) => s.trim()).filter(Boolean) } : {}),
126
+ ...(Object.keys(endpoints).length ? { endpoints } : {}),
127
+ }) + '\n');
128
+ break;
129
+ }
130
+ default:
131
+ throw new Error(`unknown command '${command}'\n\n${USAGE}`);
132
+ }
133
+ }
134
+ main().catch((e) => {
135
+ process.stderr.write(`pca: ${e instanceof Error ? e.message : String(e)}\n`);
136
+ process.exitCode = 1;
137
+ });
138
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The `pca` developer CLI — the honest inspector for Proof-Carrying Authority.
3
+ *
4
+ * Four pure command functions, each taking parsed arguments and returning a string (or a small
5
+ * structured result) so they are unit-testable without spawning a process. They lean ENTIRELY on
6
+ * `@atlasauth/pca`'s own primitives — the same decode / verify / compile / simulate code the
7
+ * resource server and the facade use — so what the CLI prints is what the verifier actually does.
8
+ *
9
+ * HONEST about scope: nothing here authorizes anything. `decode` and `explain` are read-only
10
+ * inspectors; `explain` runs the REAL `verifyPCActnCore` against a grant it reads straight out of
11
+ * the PCActn's own capability chain, so a "verdict" it prints is the local, grant-relative view —
12
+ * the resource server, with its stored counter / revocation / attestation state, remains the
13
+ * authority. `keygen` mints a throwaway dev keypair (never a production holder). `simulate` is a
14
+ * pure offline planning replay: it mutates nothing, signs nothing, and reaches no network.
15
+ */
16
+ import { decodePCActn } from '@atlasauth/pca';
17
+ /**
18
+ * Parse CLI input that is EITHER PCActn JSON text or its base64url wire form. Detection is
19
+ * structural: a leading `{` (after trimming) is JSON; anything else is tried as base64url whose
20
+ * decoded bytes must be UTF-8 PCActn JSON. Either way the bytes go through the strict
21
+ * `decodePCActn` parser, so a malformed object throws a clear Error.
22
+ */
23
+ export declare function parsePCActnInput(input: string): ReturnType<typeof decodePCActn>;
24
+ /**
25
+ * Decode a PCActn (JSON or base64url) and return a readable summary: verb, resource, audience, the
26
+ * issued/expiry window (ISO + raw ms), counter, capability-chain depth, the claimed risk, and
27
+ * whether a threshold or zk-compliance field rides along. Throws a clear Error on malformed input.
28
+ */
29
+ export declare function cmdDecode(input: string): string;
30
+ export interface ExplainResult {
31
+ allow: boolean;
32
+ checks: Record<string, string>;
33
+ reasons: string[];
34
+ text: string;
35
+ }
36
+ /**
37
+ * The "why did it (not) verify?" explainer. Decodes the PCActn, takes its `cap_chain[0]` as the root
38
+ * grant (the capability the whole chain descends from), and runs the REAL `verifyPCActnCore` against
39
+ * it, then formats each check as PASS / FAIL / — (not enforced by this verifier profile) with a final
40
+ * verdict line. `--aud` supplies this verifier's audience; omit it to accept any audience.
41
+ */
42
+ export declare function cmdExplain(input: string, opts: {
43
+ audience?: string;
44
+ now?: number;
45
+ }): Promise<ExplainResult>;
46
+ export interface KeygenResult {
47
+ publicKey: string;
48
+ secretKey: string;
49
+ text: string;
50
+ }
51
+ /**
52
+ * Mint a throwaway Ed25519 dev keypair and return both keys base64url-encoded plus a clearly labelled
53
+ * block. This is a DEV convenience — not a production holder key. The secret signs PCActns as this
54
+ * holder and must stay private; the public key is what a grant binds to (`holder`).
55
+ */
56
+ export declare function cmdKeygen(): KeygenResult;
57
+ export interface DiscoveryCmdOptions {
58
+ audience: string;
59
+ suites?: string[];
60
+ endpoints?: {
61
+ attestation_challenge?: string;
62
+ revocation_epoch?: string;
63
+ liveness_beacon?: string;
64
+ stepup?: string;
65
+ grant?: string;
66
+ };
67
+ }
68
+ /** Emit a `.well-known/pca-configuration` document for a resource server to publish. */
69
+ export declare function cmdDiscovery(opts: DiscoveryCmdOptions): string;
70
+ /**
71
+ * Compile a policy spec `{ permissions, limits? }` and replay an actions array against it, printing a
72
+ * per-action table (auto / step_up / deny + the trust budget remaining after each), the static lints
73
+ * `lintPolicy` found, and the autonomy bound (the most this grant can spend/risk between human
74
+ * co-signs). Pure and offline — the resource server's verifier remains the authority at run time.
75
+ */
76
+ export declare function cmdSimulate(policyJson: string, actionsJson: string): string;
package/dist/index.js ADDED
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ /**
3
+ * The `pca` developer CLI — the honest inspector for Proof-Carrying Authority.
4
+ *
5
+ * Four pure command functions, each taking parsed arguments and returning a string (or a small
6
+ * structured result) so they are unit-testable without spawning a process. They lean ENTIRELY on
7
+ * `@atlasauth/pca`'s own primitives — the same decode / verify / compile / simulate code the
8
+ * resource server and the facade use — so what the CLI prints is what the verifier actually does.
9
+ *
10
+ * HONEST about scope: nothing here authorizes anything. `decode` and `explain` are read-only
11
+ * inspectors; `explain` runs the REAL `verifyPCActnCore` against a grant it reads straight out of
12
+ * the PCActn's own capability chain, so a "verdict" it prints is the local, grant-relative view —
13
+ * the resource server, with its stored counter / revocation / attestation state, remains the
14
+ * authority. `keygen` mints a throwaway dev keypair (never a production holder). `simulate` is a
15
+ * pure offline planning replay: it mutates nothing, signs nothing, and reaches no network.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.parsePCActnInput = parsePCActnInput;
19
+ exports.cmdDecode = cmdDecode;
20
+ exports.cmdExplain = cmdExplain;
21
+ exports.cmdKeygen = cmdKeygen;
22
+ exports.cmdDiscovery = cmdDiscovery;
23
+ exports.cmdSimulate = cmdSimulate;
24
+ const pca_1 = require("@atlasauth/pca");
25
+ // ---- small helpers --------------------------------------------------------------------------------
26
+ /** Message of an unknown throwable without an `any`/suppression cast. */
27
+ function errMessage(e) {
28
+ return e instanceof Error ? e.message : String(e);
29
+ }
30
+ function isRecord(v) {
31
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
32
+ }
33
+ /** Parse JSON into `unknown` (never `any`) with a labelled error. */
34
+ function parseJson(s, label) {
35
+ try {
36
+ return JSON.parse(s);
37
+ }
38
+ catch (e) {
39
+ throw new Error(`${label}: invalid JSON: ${errMessage(e)}`);
40
+ }
41
+ }
42
+ /** Epoch-ms → ISO 8601, or a clear marker when the value is not a finite instant. */
43
+ function iso(ms) {
44
+ if (typeof ms !== 'number' || !Number.isFinite(ms))
45
+ return '(none)';
46
+ const d = new Date(ms);
47
+ return Number.isNaN(d.getTime()) ? '(invalid)' : d.toISOString();
48
+ }
49
+ /** Right-pad to `width` for simple fixed-column tables. */
50
+ function pad(s, width) {
51
+ return s.length >= width ? s : s + ' '.repeat(width - s.length);
52
+ }
53
+ // ---- decode ---------------------------------------------------------------------------------------
54
+ /**
55
+ * Parse CLI input that is EITHER PCActn JSON text or its base64url wire form. Detection is
56
+ * structural: a leading `{` (after trimming) is JSON; anything else is tried as base64url whose
57
+ * decoded bytes must be UTF-8 PCActn JSON. Either way the bytes go through the strict
58
+ * `decodePCActn` parser, so a malformed object throws a clear Error.
59
+ */
60
+ function parsePCActnInput(input) {
61
+ const trimmed = input.trim();
62
+ if (trimmed.length === 0)
63
+ throw new Error('empty input: expected a PCActn as JSON text or base64url');
64
+ if (trimmed.startsWith('{')) {
65
+ try {
66
+ return (0, pca_1.decodePCActn)(trimmed);
67
+ }
68
+ catch (e) {
69
+ throw new Error(`not a valid PCActn (JSON): ${errMessage(e)}`);
70
+ }
71
+ }
72
+ let bytes;
73
+ try {
74
+ bytes = (0, pca_1.unb64u)(trimmed);
75
+ }
76
+ catch (e) {
77
+ throw new Error(`input is neither JSON (no leading '{') nor valid base64url: ${errMessage(e)}`);
78
+ }
79
+ let text;
80
+ try {
81
+ text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
82
+ }
83
+ catch {
84
+ throw new Error('base64url decoded to bytes that are not valid UTF-8; not a PCActn');
85
+ }
86
+ try {
87
+ return (0, pca_1.decodePCActn)(text);
88
+ }
89
+ catch (e) {
90
+ throw new Error(`base64url decoded but is not a valid PCActn: ${errMessage(e)}`);
91
+ }
92
+ }
93
+ /**
94
+ * Decode a PCActn (JSON or base64url) and return a readable summary: verb, resource, audience, the
95
+ * issued/expiry window (ISO + raw ms), counter, capability-chain depth, the claimed risk, and
96
+ * whether a threshold or zk-compliance field rides along. Throws a clear Error on malformed input.
97
+ */
98
+ function cmdDecode(input) {
99
+ const p = parsePCActnInput(input);
100
+ const chainDepth = Array.isArray(p.cap_chain) ? p.cap_chain.length : 0;
101
+ const riskR = isRecord(p.risk_claim) && typeof p.risk_claim.r === 'number' ? String(p.risk_claim.r) : '(none)';
102
+ const lines = [
103
+ 'PCActn summary',
104
+ ` verb ${p.action.verb}`,
105
+ ` resource ${p.action.resource}`,
106
+ ` reversibility ${p.action.reversibility_class}`,
107
+ ` audience ${p.aud || '(none)'}`,
108
+ ` issued (iat) ${iso(p.iat)} [${p.iat}]`,
109
+ ` expires (exp) ${iso(p.exp)} [${p.exp}]`,
110
+ ` counter ${p.counter}`,
111
+ ` cap-chain depth ${chainDepth}`,
112
+ ` risk_claim.r ${riskR}`,
113
+ ` threshold ${p.threshold !== undefined ? 'present' : 'absent'}`,
114
+ ` zk_compliance ${p.zk_compliance !== undefined ? 'present' : 'absent'}`,
115
+ ];
116
+ return lines.join('\n');
117
+ }
118
+ // ---- explain --------------------------------------------------------------------------------------
119
+ const STATUS_LABEL = { pass: 'PASS', fail: 'FAIL', 'not-enforced': '—' };
120
+ /**
121
+ * The "why did it (not) verify?" explainer. Decodes the PCActn, takes its `cap_chain[0]` as the root
122
+ * grant (the capability the whole chain descends from), and runs the REAL `verifyPCActnCore` against
123
+ * it, then formats each check as PASS / FAIL / — (not enforced by this verifier profile) with a final
124
+ * verdict line. `--aud` supplies this verifier's audience; omit it to accept any audience.
125
+ */
126
+ async function cmdExplain(input, opts) {
127
+ const p = parsePCActnInput(input);
128
+ const grant = Array.isArray(p.cap_chain) ? p.cap_chain[0] : undefined;
129
+ if (!grant)
130
+ throw new Error('cannot explain: the PCActn has an empty capability chain (no root grant)');
131
+ const result = await (0, pca_1.verifyPCActnCore)(p, {
132
+ grant,
133
+ audience: opts.audience ?? null,
134
+ nowEpoch: opts.now,
135
+ });
136
+ const checks = {};
137
+ for (const [name, status] of Object.entries(result.checks)) {
138
+ checks[name] = STATUS_LABEL[status] ?? status;
139
+ }
140
+ const reasons = [];
141
+ if (result.reason)
142
+ reasons.push(result.reason);
143
+ const audLine = opts.audience === undefined ? 'any (not supplied)' : opts.audience;
144
+ const width = Math.max(...Object.keys(checks).map((k) => k.length), 0) + 2;
145
+ const checkLines = Object.entries(result.checks).map(([name, status]) => {
146
+ const label = STATUS_LABEL[status] ?? status;
147
+ const note = status === 'not-enforced' ? ' (not enforced by this verifier profile)' : '';
148
+ return ` ${pad(name, width)}${label}${note}`;
149
+ });
150
+ const text = [
151
+ 'PCActn verification (explain)',
152
+ ` verb ${p.action.verb}`,
153
+ ` resource ${p.action.resource}`,
154
+ ` action audience ${p.aud || '(none)'}`,
155
+ ` verifier aud ${audLine}`,
156
+ '',
157
+ ...checkLines,
158
+ '',
159
+ ` VERDICT: ${result.allow ? 'ALLOW' : 'DENY'}`,
160
+ ...(reasons.length ? ['', ' reasons:', ...reasons.map((r) => ` - ${r}`)] : []),
161
+ ].join('\n');
162
+ return { allow: result.allow, checks, reasons, text };
163
+ }
164
+ /**
165
+ * Mint a throwaway Ed25519 dev keypair and return both keys base64url-encoded plus a clearly labelled
166
+ * block. This is a DEV convenience — not a production holder key. The secret signs PCActns as this
167
+ * holder and must stay private; the public key is what a grant binds to (`holder`).
168
+ */
169
+ function cmdKeygen() {
170
+ const kp = (0, pca_1.generateKeyPair)();
171
+ const publicKey = (0, pca_1.b64u)(kp.publicKey);
172
+ const secretKey = (0, pca_1.b64u)(kp.secretKey);
173
+ const text = [
174
+ 'PCA dev keypair (Ed25519)',
175
+ ` public ${publicKey}`,
176
+ ` secret ${secretKey}`,
177
+ '',
178
+ ' Keep the SECRET key private — it signs PCActns as this holder.',
179
+ ' Share only the public key (a grant binds to it as `holder`).',
180
+ ].join('\n');
181
+ return { publicKey, secretKey, text };
182
+ }
183
+ /** Emit a `.well-known/pca-configuration` document for a resource server to publish. */
184
+ function cmdDiscovery(opts) {
185
+ const doc = (0, pca_1.buildDiscoveryDocument)({
186
+ audience: opts.audience,
187
+ ...(opts.suites && opts.suites.length ? { signatureSuites: opts.suites } : {}),
188
+ ...(opts.endpoints && Object.keys(opts.endpoints).length ? { endpoints: opts.endpoints } : {}),
189
+ });
190
+ return JSON.stringify(doc, null, 2);
191
+ }
192
+ function parsePolicySpec(policyJson) {
193
+ const spec = parseJson(policyJson, 'policy');
194
+ if (!isRecord(spec))
195
+ throw new Error('policy must be a JSON object { permissions, limits? }');
196
+ if (!isRecord(spec.permissions))
197
+ throw new Error('policy.permissions must be an object { connector: [action, ...] }');
198
+ const permissions = {};
199
+ for (const [connector, acts] of Object.entries(spec.permissions)) {
200
+ if (!Array.isArray(acts))
201
+ throw new Error(`policy.permissions.${connector} must be an array of action names`);
202
+ const names = [];
203
+ for (const a of acts) {
204
+ if (typeof a !== 'string')
205
+ throw new Error(`policy.permissions.${connector} must contain only strings`);
206
+ names.push(a);
207
+ }
208
+ permissions[connector] = names;
209
+ }
210
+ if (spec.limits === undefined)
211
+ return { permissions };
212
+ if (!isRecord(spec.limits))
213
+ throw new Error('policy.limits must be an object { action: "$X/period" }');
214
+ const limits = {};
215
+ for (const [k, v] of Object.entries(spec.limits)) {
216
+ if (typeof v !== 'string')
217
+ throw new Error(`policy.limits.${k} must be a string like "$500/day"`);
218
+ limits[k] = v;
219
+ }
220
+ return { permissions, limits };
221
+ }
222
+ function parseSimActions(actionsJson) {
223
+ const arr = parseJson(actionsJson, 'actions');
224
+ if (!Array.isArray(arr))
225
+ throw new Error('actions must be a JSON array of { verb, resource, params?, at? }');
226
+ return arr.map((raw, i) => {
227
+ if (!isRecord(raw))
228
+ throw new Error(`actions[${i}] must be an object`);
229
+ if (typeof raw.verb !== 'string')
230
+ throw new Error(`actions[${i}].verb must be a string`);
231
+ if (typeof raw.resource !== 'string')
232
+ throw new Error(`actions[${i}].resource must be a string`);
233
+ const out = { verb: raw.verb, resource: raw.resource };
234
+ if (raw.params !== undefined) {
235
+ if (!isRecord(raw.params))
236
+ throw new Error(`actions[${i}].params must be an object`);
237
+ out.params = raw.params;
238
+ }
239
+ if (raw.at !== undefined) {
240
+ if (typeof raw.at !== 'number' || !Number.isFinite(raw.at))
241
+ throw new Error(`actions[${i}].at must be a number (epoch ms)`);
242
+ out.at = raw.at;
243
+ }
244
+ return out;
245
+ });
246
+ }
247
+ /**
248
+ * Compile a policy spec `{ permissions, limits? }` and replay an actions array against it, printing a
249
+ * per-action table (auto / step_up / deny + the trust budget remaining after each), the static lints
250
+ * `lintPolicy` found, and the autonomy bound (the most this grant can spend/risk between human
251
+ * co-signs). Pure and offline — the resource server's verifier remains the authority at run time.
252
+ */
253
+ function cmdSimulate(policyJson, actionsJson) {
254
+ const { permissions, limits } = parsePolicySpec(policyJson);
255
+ const policy = (0, pca_1.compilePolicy)({ permissions, ...(limits !== undefined ? { limits } : {}) });
256
+ const actions = parseSimActions(actionsJson);
257
+ const report = (0, pca_1.simulate)(policy, actions);
258
+ const lints = (0, pca_1.lintPolicy)(policy);
259
+ const { bMax, kappa } = policy.riskPolicy;
260
+ const safety = kappa > 0 ? Math.max(0, bMax) / kappa : 0;
261
+ const autonomyBound = safety * kappa;
262
+ const header = ` ${pad('#', 3)}${pad('verb', 18)}${pad('resource', 20)}${pad('outcome', 10)}budgetAfter`;
263
+ const rows = report.results.map((r, i) => ` ${pad(String(i + 1), 3)}${pad(r.action.verb, 18)}${pad(r.action.resource, 20)}${pad(r.outcome, 10)}${r.budgetAfter.toFixed(2)}`);
264
+ const lintLines = lints.length
265
+ ? lints.map((l) => ` [${l.level}] ${l.code}: ${l.message}`)
266
+ : [' (none)'];
267
+ return [
268
+ `Policy simulation (${report.results.length} action${report.results.length === 1 ? '' : 's'})`,
269
+ '',
270
+ header,
271
+ ...rows,
272
+ '',
273
+ ` auto=${report.auto} step_up=${report.stepUp} deny=${report.deny} endBudget=${report.endBudget.toFixed(2)} peakRisk=${report.peakRisk.toFixed(3)}`,
274
+ ` autonomy bound: ${autonomyBound.toFixed(2)} (most this grant can spend/risk between human co-signs)`,
275
+ '',
276
+ 'Lints:',
277
+ ...lintLines,
278
+ ].join('\n');
279
+ }
280
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,59 @@
1
1
  {
2
2
  "name": "@atlasauth/pca-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "The pca dev CLI: decode and explain a PCActn (why it passed or failed each check), mint a dev grant/key, and simulate a policy over actions.",
5
+ "keywords": [
6
+ "cli",
7
+ "debugging",
8
+ "policy simulation",
9
+ "agent authorization",
10
+ "proof-carrying authority",
11
+ "pca",
12
+ "ai agents"
13
+ ],
14
+ "license": "MIT",
15
+ "homepage": "https://github.com/Atlas-Authorization/pca#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/Atlas-Authorization/pca/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/Atlas-Authorization/pca.git",
22
+ "directory": "packages/pca-cli"
23
+ },
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "bin": {
27
+ "pca": "./dist/cli.js"
28
+ },
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "dependencies": {
37
+ "@atlasauth/pca": "0.2.0"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.6.3",
41
+ "vitest": "^2.1.4"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "engines": {
49
+ "node": ">=20"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "scripts": {
55
+ "build": "tsc -p tsconfig.build.json",
56
+ "typecheck": "tsc -p tsconfig.json --noEmit",
57
+ "test": "vitest run"
58
+ }
6
59
  }