@phosra/cli 0.1.0 → 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/dist/bin.js +13 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +96 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -7
- package/dist/config.js.map +1 -1
- package/package.json +20 -6
package/dist/bin.js
CHANGED
|
@@ -23,9 +23,10 @@ import { runCaps } from "./commands/caps.js";
|
|
|
23
23
|
import { runLinkWrite } from "./commands/link-write.js";
|
|
24
24
|
import { runGkCheck } from "./commands/gk-check.js";
|
|
25
25
|
import { runRegister } from "./commands/register.js";
|
|
26
|
+
import { runCheck } from "./commands/check.js";
|
|
26
27
|
const program = new Command("phosra")
|
|
27
28
|
.description("Phosra CLI — OCSS partner setup verification and sandbox round-trips")
|
|
28
|
-
.version("0.
|
|
29
|
+
.version("0.2.0");
|
|
29
30
|
// ── phosra init ─────────────────────────────────────────────────────────────
|
|
30
31
|
program
|
|
31
32
|
.command("init")
|
|
@@ -104,6 +105,17 @@ program
|
|
|
104
105
|
if (failed.length > 0)
|
|
105
106
|
process.exit(1);
|
|
106
107
|
});
|
|
108
|
+
// ── phosra check ─────────────────────────────────────────────────────────────
|
|
109
|
+
program
|
|
110
|
+
.command("check")
|
|
111
|
+
.description("Offline safety-invariant conformance suite — proves @phosra/gatekeeper is " +
|
|
112
|
+
"fail-closed and stale-closed. No census, no network, no credentials.")
|
|
113
|
+
.option("--json", "Machine-readable JSON output (for CI/agents)", false)
|
|
114
|
+
.action(async (opts) => {
|
|
115
|
+
const results = await runCheck(opts.json);
|
|
116
|
+
if (results.some((r) => r.status === "fail"))
|
|
117
|
+
process.exit(1);
|
|
118
|
+
});
|
|
107
119
|
// ── phosra caps ──────────────────────────────────────────────────────────────
|
|
108
120
|
program
|
|
109
121
|
.command("caps")
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,WAAW,EAA2C,MAAM,WAAW,CAAC;AAkEtF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAiBpE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phosra check — offline safety-invariant conformance suite.
|
|
3
|
+
*
|
|
4
|
+
* Runs four in-process probes against @phosra/gatekeeper using the published
|
|
5
|
+
* @phosra/gatekeeper/testing signed stack. No census, no network, no credentials.
|
|
6
|
+
* Proves the SDK is fail-closed and stale-closed before a partner ships:
|
|
7
|
+
* enforced_block a block rule → decision block
|
|
8
|
+
* fetch_interrupt_blocked a profile-fetch failure → block (no stale allow)
|
|
9
|
+
* stale_allow_blocked a cache older than the 60s floor → block
|
|
10
|
+
* reenable_open after recovery + fresh refresh → allow resumes
|
|
11
|
+
*
|
|
12
|
+
* §12.3: the CLI verifies; it never decides. This suite asserts the SDK's own
|
|
13
|
+
* fail-closed contract, not census authority.
|
|
14
|
+
*/
|
|
15
|
+
import { createGatekeeper } from "@phosra/gatekeeper";
|
|
16
|
+
import { makeSignedStack } from "@phosra/gatekeeper/testing";
|
|
17
|
+
import { printCheck, printJson, heading, summary } from "../out.js";
|
|
18
|
+
const ALLOW_RULE = {
|
|
19
|
+
category: "demo_allow",
|
|
20
|
+
decision: "allow",
|
|
21
|
+
fail_mode: "closed",
|
|
22
|
+
rule_slug: "demo_allow",
|
|
23
|
+
rule_ref: "rr-da",
|
|
24
|
+
};
|
|
25
|
+
async function probeEnforcedBlock() {
|
|
26
|
+
const stack = makeSignedStack();
|
|
27
|
+
stack.setProfile([
|
|
28
|
+
{ category: "infinite_scroll_block", decision: "block", fail_mode: "closed", rule_slug: "infinite_scroll_block", rule_ref: "rr-isb" },
|
|
29
|
+
]);
|
|
30
|
+
const gk = createGatekeeper(stack.config());
|
|
31
|
+
await gk.refreshTrustList();
|
|
32
|
+
await gk.refreshProfile();
|
|
33
|
+
const d = gk.isAllowed({ category: "infinite_scroll_block" }).decision;
|
|
34
|
+
return d === "block"
|
|
35
|
+
? { name: "enforced_block", status: "pass", message: "block rule → block" }
|
|
36
|
+
: { name: "enforced_block", status: "fail", message: `expected block, got ${d}` };
|
|
37
|
+
}
|
|
38
|
+
async function probeFetchInterruptBlocked() {
|
|
39
|
+
const stack = makeSignedStack();
|
|
40
|
+
const gk = createGatekeeper(stack.config());
|
|
41
|
+
await gk.refreshTrustList();
|
|
42
|
+
stack.simulateFetchError();
|
|
43
|
+
await gk.refreshProfile().catch(() => { });
|
|
44
|
+
const d = gk.isAllowed({ category: ALLOW_RULE.category }).decision;
|
|
45
|
+
return d === "block"
|
|
46
|
+
? { name: "fetch_interrupt_blocked", status: "pass", message: "fetch failure → block (no stale allow)" }
|
|
47
|
+
: { name: "fetch_interrupt_blocked", status: "fail", message: `expected block, got ${d}` };
|
|
48
|
+
}
|
|
49
|
+
async function probeStaleAllowBlocked() {
|
|
50
|
+
let t = Date.parse("2027-01-01T00:00:00Z");
|
|
51
|
+
const stack = makeSignedStack();
|
|
52
|
+
stack.setProfile([ALLOW_RULE]);
|
|
53
|
+
const gk = createGatekeeper(stack.config({ now: () => t, profileMaxAgeMs: 60_000 }));
|
|
54
|
+
await gk.refreshTrustList();
|
|
55
|
+
await gk.refreshProfile();
|
|
56
|
+
const fresh = gk.isAllowed({ category: ALLOW_RULE.category }).decision;
|
|
57
|
+
t += 61_000;
|
|
58
|
+
const stale = gk.isAllowed({ category: ALLOW_RULE.category }).decision;
|
|
59
|
+
return fresh === "allow" && stale === "block"
|
|
60
|
+
? { name: "stale_allow_blocked", status: "pass", message: "cache > 60s → block" }
|
|
61
|
+
: { name: "stale_allow_blocked", status: "fail", message: `fresh=${fresh} stale=${stale}` };
|
|
62
|
+
}
|
|
63
|
+
async function probeReenableOpen() {
|
|
64
|
+
const stack = makeSignedStack();
|
|
65
|
+
const gk = createGatekeeper(stack.config());
|
|
66
|
+
await gk.refreshTrustList();
|
|
67
|
+
stack.simulateFetchError();
|
|
68
|
+
await gk.refreshProfile().catch(() => { });
|
|
69
|
+
const blocked = gk.isAllowed({ category: ALLOW_RULE.category }).decision;
|
|
70
|
+
stack.setProfile([ALLOW_RULE]); // clears the fault + serves a fresh allow
|
|
71
|
+
await gk.refreshProfile();
|
|
72
|
+
const allowed = gk.isAllowed({ category: ALLOW_RULE.category }).decision;
|
|
73
|
+
return blocked === "block" && allowed === "allow"
|
|
74
|
+
? { name: "reenable_open", status: "pass", message: "recovery → allow resumes" }
|
|
75
|
+
: { name: "reenable_open", status: "fail", message: `blocked=${blocked} allowed=${allowed}` };
|
|
76
|
+
}
|
|
77
|
+
export async function runCheck(json) {
|
|
78
|
+
heading("Phosra conformance — offline safety invariants", json);
|
|
79
|
+
const results = [];
|
|
80
|
+
for (const probe of [probeEnforcedBlock, probeFetchInterruptBlocked, probeStaleAllowBlocked, probeReenableOpen]) {
|
|
81
|
+
const r = await probe();
|
|
82
|
+
results.push(r);
|
|
83
|
+
printCheck(r, json);
|
|
84
|
+
}
|
|
85
|
+
if (json) {
|
|
86
|
+
printJson({
|
|
87
|
+
ok: results.every((r) => r.status !== "fail"),
|
|
88
|
+
checks: results.map((r) => ({ name: r.name, status: r.status, message: r.message })),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
summary(results, json);
|
|
93
|
+
}
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAoB,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEtF,MAAM,UAAU,GAAG;IACjB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,OAAgB;IAC1B,SAAS,EAAE,QAAiB;IAC5B,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,KAAK,UAAU,kBAAkB;IAC/B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,KAAK,CAAC,UAAU,CAAC;QACf,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE;KACtI,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC;IACvE,OAAO,CAAC,KAAK,OAAO;QAClB,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE;QAC3E,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,CAAC,EAAE,EAAE,CAAC;AACtF,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,kBAAkB,EAAE,CAAC;IAC3B,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IACnE,OAAO,CAAC,KAAK,OAAO;QAClB,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE;QACxG,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,CAAC,EAAE,EAAE,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,KAAK,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IACvE,CAAC,IAAI,MAAM,CAAC;IACZ,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IACvE,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;QAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE;QACjF,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,UAAU,KAAK,EAAE,EAAE,CAAC;AAChG,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC5B,KAAK,CAAC,kBAAkB,EAAE,CAAC;IAC3B,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IACzE,KAAK,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,0CAA0C;IAC1E,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IACzE,OAAO,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO;QAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE;QAChF,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,OAAO,YAAY,OAAO,EAAE,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAa;IAC1C,OAAO,CAAC,gDAAgD,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAChH,MAAM,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC;YACR,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;YAC7C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACrF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* 16 seeded trust-list entries) — a partner goes green with ZERO new backend.
|
|
7
7
|
*/
|
|
8
8
|
export declare const SANDBOX_DEFAULTS: {
|
|
9
|
-
readonly CENSUS_URL: "https://phosra-api-sandbox-
|
|
10
|
-
readonly TRUST_ROOT_X: "
|
|
9
|
+
readonly CENSUS_URL: "https://phosra-api-sandbox-production.up.railway.app";
|
|
10
|
+
readonly TRUST_ROOT_X: "CMHWy3vUAiEcYDdE_bDvkRuEqwxkklS0tV-TYHJTlWU";
|
|
11
11
|
readonly HOUSEHOLD_SEED: "aG91c2Vob2xkLWFjbWUBAQEBAQEBAQEBAQEBAQEBAQE";
|
|
12
12
|
readonly MIA_POLICY_ID: "b011c1e5-0000-4000-8000-000000000b01";
|
|
13
13
|
readonly MIA_CHILD_ID: "a11ce0fa-0000-4000-8000-0000000000a1";
|
|
@@ -22,8 +22,8 @@ export declare const HOUSEHOLD_ACME_KEY_ID = "did:ocss:household-acme#2026-06";
|
|
|
22
22
|
export declare const ROUTER_DID = "did:ocss:phosra-router";
|
|
23
23
|
/**
|
|
24
24
|
* app_ref for the doctor round-trip consent_attestation.
|
|
25
|
-
* Must be in the census's OCSS_CONSENT_ATTESTATION_APPS env
|
|
26
|
-
* loopline
|
|
25
|
+
* Must be in the census's OCSS_CONSENT_ATTESTATION_APPS env (both the production and
|
|
26
|
+
* staging sandbox censuses carry loopline in the roster: "did:ocss:loopline,...").
|
|
27
27
|
*/
|
|
28
28
|
export declare const ROUNDTRIP_APP_DID = "did:ocss:loopline";
|
|
29
29
|
/** Rule category written in the doctor round-trip. household-acme is accredited for this. */
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,eAAO,MAAM,gBAAgB;;;;;;CAOnB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oCAAoC,CAAC;AAEvE,8EAA8E;AAC9E,eAAO,MAAM,UAAU,2BAA2B,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,6FAA6F;AAC7F,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAiCD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAqBxE"}
|
package/dist/config.js
CHANGED
|
@@ -7,14 +7,17 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
|
-
// Sandbox defaults — the
|
|
10
|
+
// Sandbox defaults — the stable PRODUCTION sandbox census + household-acme DID.
|
|
11
11
|
// These baked-in values let `phosra init` and `phosra doctor` work out-of-the-box
|
|
12
|
-
// against the
|
|
12
|
+
// against the production sandbox trust-list without any provisioning. The production
|
|
13
|
+
// sandbox is the stable, partner-facing testing endpoint (vs the staging dev stack,
|
|
14
|
+
// which is redeployed frequently). Point elsewhere with PHOSRA_CENSUS_URL +
|
|
15
|
+
// PHOSRA_TRUST_ROOT_X (e.g. the staging sandbox jDWZ…/…-staging for bleeding-edge).
|
|
13
16
|
export const SANDBOX_DEFAULTS = {
|
|
14
|
-
CENSUS_URL: "https://phosra-api-sandbox-
|
|
15
|
-
TRUST_ROOT_X: "
|
|
17
|
+
CENSUS_URL: "https://phosra-api-sandbox-production.up.railway.app",
|
|
18
|
+
TRUST_ROOT_X: "CMHWy3vUAiEcYDdE_bDvkRuEqwxkklS0tV-TYHJTlWU",
|
|
16
19
|
HOUSEHOLD_SEED: "aG91c2Vob2xkLWFjbWUBAQEBAQEBAQEBAQEBAQEBAQE",
|
|
17
|
-
// Sandbox Mia child/policy — seeded in
|
|
20
|
+
// Sandbox Mia child/policy — seeded identically in both sandbox DBs (doctor probe)
|
|
18
21
|
MIA_POLICY_ID: "b011c1e5-0000-4000-8000-000000000b01",
|
|
19
22
|
MIA_CHILD_ID: "a11ce0fa-0000-4000-8000-0000000000a1",
|
|
20
23
|
};
|
|
@@ -28,8 +31,8 @@ export const HOUSEHOLD_ACME_KEY_ID = "did:ocss:household-acme#2026-06";
|
|
|
28
31
|
export const ROUTER_DID = "did:ocss:phosra-router";
|
|
29
32
|
/**
|
|
30
33
|
* app_ref for the doctor round-trip consent_attestation.
|
|
31
|
-
* Must be in the census's OCSS_CONSENT_ATTESTATION_APPS env
|
|
32
|
-
* loopline
|
|
34
|
+
* Must be in the census's OCSS_CONSENT_ATTESTATION_APPS env (both the production and
|
|
35
|
+
* staging sandbox censuses carry loopline in the roster: "did:ocss:loopline,...").
|
|
33
36
|
*/
|
|
34
37
|
export const ROUNDTRIP_APP_DID = "did:ocss:loopline";
|
|
35
38
|
/** Rule category written in the doctor round-trip. household-acme is accredited for this. */
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phosra/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Phosra OCSS partner CLI
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Phosra OCSS partner CLI \u2014 scaffold configs, verify OCSS setup, run round-trip checks against the shared sandbox.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"phosra": "./dist/bin.js"
|
|
8
8
|
},
|
|
9
9
|
"exports": {
|
|
10
|
-
".": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/bin.js",
|
|
12
|
+
"types": "./dist/bin.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
11
21
|
},
|
|
12
|
-
"files": ["dist", "README.md"],
|
|
13
|
-
"publishConfig": { "access": "public" },
|
|
14
22
|
"scripts": {
|
|
15
23
|
"build": "tsc",
|
|
16
24
|
"typecheck": "tsc --noEmit",
|
|
@@ -19,6 +27,7 @@
|
|
|
19
27
|
},
|
|
20
28
|
"dependencies": {
|
|
21
29
|
"@openchildsafety/ocss": "^0.1.0",
|
|
30
|
+
"@phosra/gatekeeper": "^0.2.0",
|
|
22
31
|
"commander": "^12.0.0"
|
|
23
32
|
},
|
|
24
33
|
"devDependencies": {
|
|
@@ -26,6 +35,11 @@
|
|
|
26
35
|
"typescript": "^5.7.0",
|
|
27
36
|
"vitest": "^1.6.1"
|
|
28
37
|
},
|
|
29
|
-
"keywords": [
|
|
38
|
+
"keywords": [
|
|
39
|
+
"phosra",
|
|
40
|
+
"child-safety",
|
|
41
|
+
"ocss",
|
|
42
|
+
"cli"
|
|
43
|
+
],
|
|
30
44
|
"license": "MIT"
|
|
31
45
|
}
|