@rogatio/cli 6.7.0 → 6.8.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/README.md +8 -6
- package/dist/node/index.js +139 -51
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -36,12 +36,12 @@ rogatio <command> [options]
|
|
|
36
36
|
|
|
37
37
|
| Command | Description |
|
|
38
38
|
| --- | --- |
|
|
39
|
-
| `rogatio edit [path]` | Launch the browser editor
|
|
40
|
-
| `rogatio verify [path]` | Validate a
|
|
39
|
+
| `rogatio edit [path]` | Launch the browser editor. Any filename is accepted; the default is `.rogatio.json` in the current directory. `--port <n>` fixes the port; `--no-open` skips opening a browser. Edits save back to the file that was opened. |
|
|
40
|
+
| `rogatio verify [path]` | Validate a project file (schema + compiler). Any filename is accepted; the default is `.rogatio.json` in the current directory. |
|
|
41
41
|
| `rogatio import requestly <export.json>` | Migrate a Requestly export into `.rogatio.json`. `--out <path>` chooses the file (default `.rogatio.json`); `--merge` appends onto an existing project; `--json` prints the report. |
|
|
42
|
-
| `rogatio test [path] [url...]` | Run offline dry-run tests
|
|
42
|
+
| `rogatio test [path] [url...]` | Run offline dry-run tests. Any filename is accepted; the default is `.rogatio.json` in the current directory. |
|
|
43
43
|
| `rogatio ai <setup\|ls\|show\|delete\|test>` | AI provider configuration. `setup` interactive; `ls` list; `show` redacted; `delete` remove; `test` connection. |
|
|
44
|
-
| `rogatio runtime <install\|uninstall\|verify>` | Register the native-messaging host with `install
|
|
44
|
+
| `rogatio runtime <install\|uninstall\|verify>` | Register the native-messaging host with `install` and trust the device-local CA in one **transactional** call; it needs elevated privileges (Linux `sudo`, macOS keychain authorization, Windows Administrator) and rolls back with exit `1` and `trust unsupported: <reasons>` when a capability or elevation is missing. Release users never pass `--extension-id`. That flag is only for development (a local unpacked build without the release key) and for forks. `uninstall` removes the host manifest, the device-local CA files, and the CA trust installation (idempotent). `verify` reports whether manifest, `runtime-host` wrapper, allowed origins, and CA trust are all valid, and fails when `allowed_origins` omits the release ID. Release users never pass `--extension-id` on verify either. |
|
|
45
45
|
| `rogatio runtime host [path]` | Run the consolidated native-messaging host for the project (pair/authorize/body transforms over stdio). Normally launched by the browser; run manually only for debugging. `--root <dir>` overrides the confined file root; `--mock-port <n>` binds the loopback mock-response faucet. |
|
|
46
46
|
|
|
47
47
|
Global options: `--help, -h` and `--version, -v`. Run `rogatio <command> --help`
|
|
@@ -73,8 +73,10 @@ rogatio runtime host .rogatio.json
|
|
|
73
73
|
## Local runtime
|
|
74
74
|
|
|
75
75
|
```sh
|
|
76
|
-
# Register the native-messaging host and trust the device-local CA (needs elevation)
|
|
77
|
-
|
|
76
|
+
# Register the native-messaging host and trust the device-local CA (needs elevation).
|
|
77
|
+
# Release users never pass --extension-id. It is only for development
|
|
78
|
+
# (a local unpacked build without the release key) and for forks.
|
|
79
|
+
rogatio runtime install
|
|
78
80
|
|
|
79
81
|
# Check manifest, runtime-host wrapper, allowed origins, and CA trust
|
|
80
82
|
rogatio runtime verify
|
package/dist/node/index.js
CHANGED
|
@@ -1682,6 +1682,9 @@ function validateProjectDetailed(value) {
|
|
|
1682
1682
|
const errors = semanticIssues(snapshot2.value);
|
|
1683
1683
|
return errors.length > 0 ? { valid: false, errors } : { valid: true, data: value };
|
|
1684
1684
|
}
|
|
1685
|
+
function validateProject(value) {
|
|
1686
|
+
return validateProjectDetailed(value).valid;
|
|
1687
|
+
}
|
|
1685
1688
|
|
|
1686
1689
|
// packages/compiler/dist/node/index.js
|
|
1687
1690
|
var ISSUE_CODES = {
|
|
@@ -2079,11 +2082,11 @@ import { Worker } from "node:worker_threads";
|
|
|
2079
2082
|
import { lookup as dnsLookup } from "node:dns/promises";
|
|
2080
2083
|
import { request as httpRequest } from "node:http";
|
|
2081
2084
|
import { request as httpsRequest } from "node:https";
|
|
2082
|
-
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2085
|
+
import { createHash as createHash2, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2083
2086
|
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
2084
2087
|
import { readFile as readFile2, realpath as realpath2, stat } from "node:fs/promises";
|
|
2085
2088
|
import { isAbsolute as isAbsolute2, relative as relative2, resolve, sep } from "node:path";
|
|
2086
|
-
import { createHash as
|
|
2089
|
+
import { createHash as createHash3 } from "node:crypto";
|
|
2087
2090
|
import { mkdir as mkdir2, readFile as readFile3, rename, rm, stat as stat2, writeFile as writeFile2 } from "node:fs/promises";
|
|
2088
2091
|
import { basename, dirname as dirname2, isAbsolute as isAbsolute3, join as join2, relative as relative3 } from "node:path";
|
|
2089
2092
|
import { generateKeyPairSync, webcrypto } from "node:crypto";
|
|
@@ -22056,6 +22059,27 @@ function parseEnvelope(json) {
|
|
|
22056
22059
|
};
|
|
22057
22060
|
return envelope;
|
|
22058
22061
|
}
|
|
22062
|
+
var RELEASE_EXTENSION_ID = "dkngkciiiabbdjcopbipkpndfmpbmjom";
|
|
22063
|
+
var EXTENSION_ID_RE = /^[a-p]{32}$/;
|
|
22064
|
+
function extensionOrigin(extensionId) {
|
|
22065
|
+
return `chrome-extension://${extensionId}/`;
|
|
22066
|
+
}
|
|
22067
|
+
function extensionOriginListed(extensionId, allowedOrigins) {
|
|
22068
|
+
if (!EXTENSION_ID_RE.test(extensionId)) return false;
|
|
22069
|
+
const origin = extensionOrigin(extensionId);
|
|
22070
|
+
const bare = origin.slice(0, -1);
|
|
22071
|
+
return allowedOrigins.some((value) => value === origin || value === bare);
|
|
22072
|
+
}
|
|
22073
|
+
function describeExtensionIdMismatch(expectedExtensionId, allowedOrigins) {
|
|
22074
|
+
const allowed = allowedOrigins.length > 0 ? allowedOrigins.join(", ") : "(none)";
|
|
22075
|
+
const command = expectedExtensionId === RELEASE_EXTENSION_ID ? "rogatio runtime install" : `rogatio runtime install --extension-id ${expectedExtensionId}`;
|
|
22076
|
+
return [
|
|
22077
|
+
`Extension ID ${expectedExtensionId} is not in the host manifest allowed_origins.`,
|
|
22078
|
+
`The host manifest allows: ${allowed}.`,
|
|
22079
|
+
"Chrome refuses the connection until allowed_origins includes this ID (Access to the specified native messaging host is forbidden).",
|
|
22080
|
+
`Run: ${command}`
|
|
22081
|
+
].join("\n");
|
|
22082
|
+
}
|
|
22059
22083
|
function supportedContentType(value) {
|
|
22060
22084
|
if (value === void 0) return false;
|
|
22061
22085
|
const mediaType = value.split(";", 1)[0]?.trim().toLowerCase() ?? "";
|
|
@@ -23439,7 +23463,7 @@ function createCapabilityState(preset, now) {
|
|
|
23439
23463
|
};
|
|
23440
23464
|
}
|
|
23441
23465
|
function digestToken(value) {
|
|
23442
|
-
return
|
|
23466
|
+
return createHash2("sha256").update(value, "utf8").digest();
|
|
23443
23467
|
}
|
|
23444
23468
|
function isToken(value) {
|
|
23445
23469
|
if (typeof value !== "string" || value.length !== TOKEN_LENGTH) return false;
|
|
@@ -23657,7 +23681,7 @@ function canonicalPresetBytes(preset, grants = preset.grants) {
|
|
|
23657
23681
|
return new TextEncoder().encode(canonical);
|
|
23658
23682
|
}
|
|
23659
23683
|
function digestBytes(bytes) {
|
|
23660
|
-
return formatSha256(
|
|
23684
|
+
return formatSha256(createHash3("sha256").update(bytes).digest("hex"));
|
|
23661
23685
|
}
|
|
23662
23686
|
var ID_PATTERN2 = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
23663
23687
|
function exactKeys(value, required) {
|
|
@@ -24942,17 +24966,16 @@ function createRequestBodyTrustController(options = {}) {
|
|
|
24942
24966
|
let manifestValid = false;
|
|
24943
24967
|
let binaryExists = false;
|
|
24944
24968
|
let binaryExecutable = false;
|
|
24945
|
-
let
|
|
24969
|
+
let allowedOrigins = [];
|
|
24946
24970
|
try {
|
|
24947
24971
|
const raw = await readFile3(manifestPath(), "utf8");
|
|
24948
24972
|
manifestExists = true;
|
|
24949
24973
|
const parsed = JSON.parse(raw);
|
|
24950
24974
|
if (isWellFormedManifest(parsed)) {
|
|
24951
24975
|
manifestValid = true;
|
|
24952
|
-
|
|
24953
|
-
allowedOriginsCount = manifest.allowed_origins.length;
|
|
24976
|
+
allowedOrigins = [...parsed.allowed_origins];
|
|
24954
24977
|
try {
|
|
24955
|
-
const fileStat = await stat2(
|
|
24978
|
+
const fileStat = await stat2(parsed.path);
|
|
24956
24979
|
binaryExists = fileStat.isFile();
|
|
24957
24980
|
binaryExecutable = (fileStat.mode & 73) !== 0;
|
|
24958
24981
|
if (!binaryExists) reasons.push("binary-not-found");
|
|
@@ -24961,7 +24984,7 @@ function createRequestBodyTrustController(options = {}) {
|
|
|
24961
24984
|
binaryExists = false;
|
|
24962
24985
|
reasons.push("binary-not-found");
|
|
24963
24986
|
}
|
|
24964
|
-
if (
|
|
24987
|
+
if (allowedOrigins.length === 0) reasons.push("no-allowed-origins");
|
|
24965
24988
|
} else {
|
|
24966
24989
|
reasons.push("manifest-invalid");
|
|
24967
24990
|
}
|
|
@@ -24970,7 +24993,7 @@ function createRequestBodyTrustController(options = {}) {
|
|
|
24970
24993
|
}
|
|
24971
24994
|
const caTrusted = await existsFile(caKeyFile) && await existsFile(caCertFile);
|
|
24972
24995
|
if (!caTrusted) reasons.push("ca-not-trusted");
|
|
24973
|
-
const ok = manifestExists && manifestValid && binaryExists && binaryExecutable && caTrusted &&
|
|
24996
|
+
const ok = manifestExists && manifestValid && binaryExists && binaryExecutable && caTrusted && allowedOrigins.length > 0;
|
|
24974
24997
|
return {
|
|
24975
24998
|
ok,
|
|
24976
24999
|
manifestExists,
|
|
@@ -24978,7 +25001,8 @@ function createRequestBodyTrustController(options = {}) {
|
|
|
24978
25001
|
binaryExists,
|
|
24979
25002
|
binaryExecutable,
|
|
24980
25003
|
caTrusted,
|
|
24981
|
-
allowedOriginsCount,
|
|
25004
|
+
allowedOriginsCount: allowedOrigins.length,
|
|
25005
|
+
allowedOrigins,
|
|
24982
25006
|
reasons
|
|
24983
25007
|
};
|
|
24984
25008
|
}
|
|
@@ -25697,10 +25721,10 @@ function selectTrustPlatformAdapter(platform) {
|
|
|
25697
25721
|
function showEditHelp() {
|
|
25698
25722
|
console.log(`Usage: rogatio edit [options] [path]
|
|
25699
25723
|
|
|
25700
|
-
Launch browser-based editor for
|
|
25724
|
+
Launch browser-based editor for a Rogatio project file.
|
|
25701
25725
|
|
|
25702
25726
|
Arguments:
|
|
25703
|
-
path
|
|
25727
|
+
path Project file (any filename; default: .rogatio.json in the current directory)
|
|
25704
25728
|
|
|
25705
25729
|
Options:
|
|
25706
25730
|
--port <n> Fixed port for editor server (default: random)
|
|
@@ -25708,15 +25732,16 @@ Options:
|
|
|
25708
25732
|
--help, -h Show this help
|
|
25709
25733
|
|
|
25710
25734
|
The editor runs in your default browser and communicates with a local server
|
|
25711
|
-
bound to 127.0.0.1. Changes are saved atomically to the
|
|
25735
|
+
bound to 127.0.0.1. Changes are saved atomically to the file that was opened.
|
|
25736
|
+
When path is omitted, the CLI looks for .rogatio.json in the current directory.`);
|
|
25712
25737
|
}
|
|
25713
25738
|
function showVerifyHelp() {
|
|
25714
25739
|
console.log(`Usage: rogatio verify [options] [path]
|
|
25715
25740
|
|
|
25716
|
-
Validate a
|
|
25741
|
+
Validate a Rogatio project file using schema and compiler.
|
|
25717
25742
|
|
|
25718
25743
|
Arguments:
|
|
25719
|
-
path
|
|
25744
|
+
path Project file (any filename; default: .rogatio.json in the current directory)
|
|
25720
25745
|
Use '-' to read from stdin
|
|
25721
25746
|
|
|
25722
25747
|
Options:
|
|
@@ -25736,23 +25761,31 @@ Native messaging runtime control for response-body and request-body rules.
|
|
|
25736
25761
|
|
|
25737
25762
|
Commands:
|
|
25738
25763
|
install Install the native-messaging host manifest and (on capable
|
|
25739
|
-
platforms) provision the device-local CA
|
|
25764
|
+
platforms) provision the device-local CA. Uses the pinned release
|
|
25765
|
+
extension ID. Release users never pass --extension-id. That flag is
|
|
25766
|
+
only for development (a local unpacked build without the release
|
|
25767
|
+
key) and for forks.
|
|
25740
25768
|
CA trust requires root/admin privileges (Linux: sudo, macOS: keychain
|
|
25741
25769
|
password, Windows: Administrator). Transactional: when CA trust is
|
|
25742
25770
|
unavailable the manifest is rolled back and the command exits 1.
|
|
25743
25771
|
uninstall Remove the native-messaging host manifest and device-local CA trust
|
|
25744
25772
|
(idempotent).
|
|
25745
25773
|
verify Check that the manifest, runtime-host wrapper, allowed origins, and
|
|
25746
|
-
device-local CA trust are all present and valid.
|
|
25774
|
+
device-local CA trust are all present and valid. Fails when
|
|
25775
|
+
allowed_origins does not include the release ID. Release users
|
|
25776
|
+
never pass --extension-id. That flag is only for development (a
|
|
25777
|
+
local unpacked build without the release key) and for forks.
|
|
25747
25778
|
host [path] Run the native-messaging runtime host. The browser launches this
|
|
25748
25779
|
process via the native-messaging manifest to handle rule matching.
|
|
25749
25780
|
|
|
25750
25781
|
The lifecycle of the runtime (start/stop) is driven from the extension's
|
|
25751
|
-
Start/Stop controls, not the CLI. Run 'rogatio runtime install
|
|
25752
|
-
|
|
25782
|
+
Start/Stop controls, not the CLI. Run 'rogatio runtime install' once to
|
|
25783
|
+
register the host for a release build, then use the extension.
|
|
25753
25784
|
|
|
25754
25785
|
Options:
|
|
25755
|
-
--extension-id Extension ID for native messaging manifest
|
|
25786
|
+
--extension-id Extension ID for the native messaging manifest. Release users
|
|
25787
|
+
never need this. It is only for development (a local unpacked
|
|
25788
|
+
build without the release key) and for forks.
|
|
25756
25789
|
--root <dir> Root for confined runtime file access (host only; default: project directory)
|
|
25757
25790
|
--mock-port <n> Bind the loopback mock-response faucet to this port (host only, 1-65535)
|
|
25758
25791
|
--help, -h Show this help
|
|
@@ -25766,10 +25799,10 @@ Exit codes:
|
|
|
25766
25799
|
function showTestHelp() {
|
|
25767
25800
|
console.log(`Usage: rogatio test [options] [path] [url...]
|
|
25768
25801
|
|
|
25769
|
-
Run offline dry-run tests against a
|
|
25802
|
+
Run offline dry-run tests against a Rogatio project file.
|
|
25770
25803
|
|
|
25771
25804
|
Arguments:
|
|
25772
|
-
path
|
|
25805
|
+
path Project file (any filename; default: .rogatio.json in the current directory)
|
|
25773
25806
|
Use '-' to read project JSON from stdin
|
|
25774
25807
|
url... URLs to test; when path is omitted, first URL is detected automatically
|
|
25775
25808
|
|
|
@@ -25805,7 +25838,7 @@ Arguments:
|
|
|
25805
25838
|
rule, or an object with a rules array)
|
|
25806
25839
|
|
|
25807
25840
|
Options:
|
|
25808
|
-
--out <path> Project file to write (default: .rogatio.json in the current directory)
|
|
25841
|
+
--out <path> Project file to write (any filename; default: .rogatio.json in the current directory)
|
|
25809
25842
|
--merge Append imported groups onto an existing version-2 project
|
|
25810
25843
|
--json Print the import report as JSON
|
|
25811
25844
|
--help, -h Show this help
|
|
@@ -27217,6 +27250,36 @@ function pickWord(words, byte) {
|
|
|
27217
27250
|
function isRogatioProjectFilename(name) {
|
|
27218
27251
|
return name === ".rogatio.json" || name.endsWith(".rogatio.json");
|
|
27219
27252
|
}
|
|
27253
|
+
function isJsonFilename(name) {
|
|
27254
|
+
return name.toLowerCase().endsWith(".json");
|
|
27255
|
+
}
|
|
27256
|
+
async function isDiscoverableProjectFile(id2) {
|
|
27257
|
+
let parsed;
|
|
27258
|
+
try {
|
|
27259
|
+
parsed = JSON.parse(await readFile5(id2, "utf-8"));
|
|
27260
|
+
} catch {
|
|
27261
|
+
return false;
|
|
27262
|
+
}
|
|
27263
|
+
const version = projectVersion(parsed);
|
|
27264
|
+
if (version === null) return false;
|
|
27265
|
+
const candidate = version === 1 ? migrateDiscoveredV1(parsed) : parsed;
|
|
27266
|
+
if (candidate === null) return false;
|
|
27267
|
+
return validateProject(candidate);
|
|
27268
|
+
}
|
|
27269
|
+
function projectVersion(data) {
|
|
27270
|
+
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
27271
|
+
return null;
|
|
27272
|
+
}
|
|
27273
|
+
if (!Object.hasOwn(data, "version")) return null;
|
|
27274
|
+
const version = data.version;
|
|
27275
|
+
if (version === 1 || version === 2) return version;
|
|
27276
|
+
return null;
|
|
27277
|
+
}
|
|
27278
|
+
function migrateDiscoveredV1(data) {
|
|
27279
|
+
const migrated = migrateV1Project(data);
|
|
27280
|
+
if (!migrated.ok) return null;
|
|
27281
|
+
return migrated.project;
|
|
27282
|
+
}
|
|
27220
27283
|
function projectName(data) {
|
|
27221
27284
|
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
27222
27285
|
return "";
|
|
@@ -27358,10 +27421,11 @@ function createJsonFileProjectStorage() {
|
|
|
27358
27421
|
}
|
|
27359
27422
|
const refs = [];
|
|
27360
27423
|
for (const entry of entries) {
|
|
27361
|
-
if (entry.isDirectory()
|
|
27362
|
-
|
|
27363
|
-
|
|
27424
|
+
if (entry.isDirectory()) continue;
|
|
27425
|
+
const named = isRogatioProjectFilename(entry.name);
|
|
27426
|
+
if (!named && !isJsonFilename(entry.name)) continue;
|
|
27364
27427
|
const id2 = join6(scope, entry.name);
|
|
27428
|
+
if (!named && !await isDiscoverableProjectFile(id2)) continue;
|
|
27365
27429
|
let name = "";
|
|
27366
27430
|
try {
|
|
27367
27431
|
const data = await readDocument(id2);
|
|
@@ -29961,30 +30025,42 @@ function reportTrust(subcommand, result, okMessage) {
|
|
|
29961
30025
|
);
|
|
29962
30026
|
return 1;
|
|
29963
30027
|
}
|
|
30028
|
+
function parseExtensionIdFlag(args) {
|
|
30029
|
+
const extIdIndex = args.indexOf("--extension-id");
|
|
30030
|
+
if (extIdIndex === -1) return { extensionId: RELEASE_EXTENSION_ID };
|
|
30031
|
+
const extensionId = args[extIdIndex + 1];
|
|
30032
|
+
if (extensionId === void 0 || extensionId.startsWith("-")) {
|
|
30033
|
+
return {
|
|
30034
|
+
error: "Error: --extension-id requires a value",
|
|
30035
|
+
showHelp: true
|
|
30036
|
+
};
|
|
30037
|
+
}
|
|
30038
|
+
if (!/^[a-p]{32}$/.test(extensionId)) {
|
|
30039
|
+
return {
|
|
30040
|
+
error: "Error: --extension-id must be exactly 32 lowercase characters from a through p",
|
|
30041
|
+
showHelp: false
|
|
30042
|
+
};
|
|
30043
|
+
}
|
|
30044
|
+
return { extensionId };
|
|
30045
|
+
}
|
|
29964
30046
|
async function trustRuntimeCommand(args) {
|
|
29965
30047
|
const subcommand = args[0];
|
|
29966
|
-
let extensionId;
|
|
29967
|
-
if (subcommand === "install") {
|
|
29968
|
-
const
|
|
29969
|
-
if (
|
|
29970
|
-
console.error(
|
|
29971
|
-
showRuntimeHelp();
|
|
29972
|
-
return 2;
|
|
29973
|
-
}
|
|
29974
|
-
extensionId = args[extIdIndex + 1];
|
|
29975
|
-
if (!/^[a-p]{32}$/.test(extensionId)) {
|
|
29976
|
-
console.error(
|
|
29977
|
-
"Error: --extension-id must be exactly 32 lowercase characters from a through p"
|
|
29978
|
-
);
|
|
30048
|
+
let extensionId = RELEASE_EXTENSION_ID;
|
|
30049
|
+
if (subcommand === "install" || subcommand === "verify") {
|
|
30050
|
+
const parsed = parseExtensionIdFlag(args);
|
|
30051
|
+
if ("error" in parsed) {
|
|
30052
|
+
console.error(parsed.error);
|
|
30053
|
+
if (parsed.showHelp) showRuntimeHelp();
|
|
29979
30054
|
return 2;
|
|
29980
30055
|
}
|
|
30056
|
+
extensionId = parsed.extensionId;
|
|
29981
30057
|
}
|
|
29982
30058
|
const controller = makeTrustController();
|
|
29983
30059
|
const installRoot = defaultTrustInstallRoot(process.platform);
|
|
29984
30060
|
const hostPath = join7(installRoot, "runtime-host");
|
|
29985
30061
|
switch (subcommand) {
|
|
29986
30062
|
case "install": {
|
|
29987
|
-
const installResult = await controller.install(extensionId
|
|
30063
|
+
const installResult = await controller.install(extensionId);
|
|
29988
30064
|
if (installResult.ok) {
|
|
29989
30065
|
try {
|
|
29990
30066
|
await writeHostWrapper(hostPath, installRoot);
|
|
@@ -29997,7 +30073,9 @@ async function trustRuntimeCommand(args) {
|
|
|
29997
30073
|
return reportTrust(
|
|
29998
30074
|
"install",
|
|
29999
30075
|
installResult,
|
|
30000
|
-
|
|
30076
|
+
`runtime install complete: manifest + device-local CA trusted + runtime-host wrapper created
|
|
30077
|
+
Pinned extension ID: ${extensionId}
|
|
30078
|
+
Note: reload the extension at chrome://extensions for the native host to be detected.`
|
|
30001
30079
|
);
|
|
30002
30080
|
}
|
|
30003
30081
|
case "uninstall": {
|
|
@@ -30018,9 +30096,11 @@ async function trustRuntimeCommand(args) {
|
|
|
30018
30096
|
}
|
|
30019
30097
|
case "verify": {
|
|
30020
30098
|
const result = await controller.verify();
|
|
30021
|
-
|
|
30099
|
+
const originMismatch = result.manifestValid && result.allowedOrigins.length > 0 && !extensionOriginListed(extensionId, result.allowedOrigins);
|
|
30100
|
+
if (result.ok && !originMismatch) {
|
|
30022
30101
|
console.log(
|
|
30023
|
-
|
|
30102
|
+
`runtime verification passed: manifest, binary, and CA trust all OK
|
|
30103
|
+
allowed_origins includes chrome-extension://${extensionId}/`
|
|
30024
30104
|
);
|
|
30025
30105
|
return 0;
|
|
30026
30106
|
}
|
|
@@ -30035,10 +30115,18 @@ async function trustRuntimeCommand(args) {
|
|
|
30035
30115
|
if (result.allowedOriginsCount === 0)
|
|
30036
30116
|
console.error(" no allowed_origins in manifest");
|
|
30037
30117
|
if (!result.caTrusted) console.error(" device-local CA not trusted");
|
|
30118
|
+
if (originMismatch) {
|
|
30119
|
+
for (const line of describeExtensionIdMismatch(
|
|
30120
|
+
extensionId,
|
|
30121
|
+
result.allowedOrigins
|
|
30122
|
+
).split("\n")) {
|
|
30123
|
+
console.error(` ${line}`);
|
|
30124
|
+
}
|
|
30125
|
+
}
|
|
30038
30126
|
for (const reason of result.reasons) {
|
|
30039
30127
|
if (reason === "manifest-not-found")
|
|
30040
30128
|
console.error(
|
|
30041
|
-
" Hint: run 'rogatio runtime install --extension-id
|
|
30129
|
+
" Hint: run 'rogatio runtime install' to register the host manifest (release users never pass --extension-id; it is only for development without the release key, and for forks)"
|
|
30042
30130
|
);
|
|
30043
30131
|
if (reason === "binary-not-found")
|
|
30044
30132
|
console.error(
|
|
@@ -30050,11 +30138,11 @@ async function trustRuntimeCommand(args) {
|
|
|
30050
30138
|
);
|
|
30051
30139
|
if (reason === "no-allowed-origins")
|
|
30052
30140
|
console.error(
|
|
30053
|
-
" Hint: re-run 'rogatio runtime install --extension-id
|
|
30141
|
+
" Hint: re-run 'rogatio runtime install' to pin your extension ID (release users never pass --extension-id; it is only for development without the release key, and for forks)"
|
|
30054
30142
|
);
|
|
30055
30143
|
if (reason === "ca-not-trusted")
|
|
30056
30144
|
console.error(
|
|
30057
|
-
" Hint: re-run 'rogatio runtime install
|
|
30145
|
+
" Hint: re-run 'rogatio runtime install' with elevated privileges to trust the CA"
|
|
30058
30146
|
);
|
|
30059
30147
|
}
|
|
30060
30148
|
return 1;
|
|
@@ -30751,10 +30839,10 @@ function showHelp() {
|
|
|
30751
30839
|
Usage: rogatio <command> [options]
|
|
30752
30840
|
|
|
30753
30841
|
Commands:
|
|
30754
|
-
edit [path] Launch browser editor
|
|
30755
|
-
test [path] [url...] Run offline dry-run tests
|
|
30756
|
-
verify [path] Validate .rogatio.json
|
|
30757
|
-
import requestly <export.json> Migrate a Requestly export
|
|
30842
|
+
edit [path] Launch browser editor (default: .rogatio.json; any filename)
|
|
30843
|
+
test [path] [url...] Run offline dry-run tests (default: .rogatio.json; any filename)
|
|
30844
|
+
verify [path] Validate a project file (default: .rogatio.json; any filename)
|
|
30845
|
+
import requestly <export.json> Migrate a Requestly export (default --out: .rogatio.json)
|
|
30758
30846
|
runtime <install|uninstall|verify|host> Native messaging runtime control
|
|
30759
30847
|
runtime host [path] Run the native-messaging runtime host
|
|
30760
30848
|
ai <setup|ls|show|delete|test> AI provider configuration
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rogatio/cli",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.8.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Local-first browser request and response rules — editor host, file verification, test runner, and runtime dispatch.",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"@rogatio/requestly-import": "workspace:*",
|
|
47
47
|
"@rogatio/runtime": "workspace:*",
|
|
48
48
|
"@rogatio/schema": "workspace:*",
|
|
49
|
-
"@types/node": "26.6.
|
|
49
|
+
"@types/node": "26.6.3",
|
|
50
50
|
"typescript": "7.0.2",
|
|
51
|
-
"vitest": "5.0.
|
|
51
|
+
"vitest": "5.0.2"
|
|
52
52
|
}
|
|
53
53
|
}
|