@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 CHANGED
@@ -36,12 +36,12 @@ rogatio <command> [options]
36
36
 
37
37
  | Command | Description |
38
38
  | --- | --- |
39
- | `rogatio edit [path]` | Launch the browser editor for `.rogatio.json`. `--port <n>` fixes the port; `--no-open` skips opening a browser. |
40
- | `rogatio verify [path]` | Validate a `.rogatio.json` file (schema + compiler). |
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 against `.rogatio.json`. |
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 --extension-id <id>` 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. `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. |
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
- rogatio runtime install --extension-id <id>
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
@@ -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 createHash2 } from "node:crypto";
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 createHash("sha256").update(value, "utf8").digest();
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(createHash2("sha256").update(bytes).digest("hex"));
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 allowedOriginsCount = 0;
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
- const manifest = parsed;
24953
- allowedOriginsCount = manifest.allowed_origins.length;
24976
+ allowedOrigins = [...parsed.allowed_origins];
24954
24977
  try {
24955
- const fileStat = await stat2(manifest.path);
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 (allowedOriginsCount === 0) reasons.push("no-allowed-origins");
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 && allowedOriginsCount > 0;
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 .rogatio.json project file.
25724
+ Launch browser-based editor for a Rogatio project file.
25701
25725
 
25702
25726
  Arguments:
25703
- path Path to .rogatio.json (default: .rogatio.json in current directory)
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 project file.`);
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 .rogatio.json project file using schema and compiler.
25741
+ Validate a Rogatio project file using schema and compiler.
25717
25742
 
25718
25743
  Arguments:
25719
- path Path to .rogatio.json (default: .rogatio.json in current directory)
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 (requires --extension-id).
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 --extension-id
25752
- <id>' once to register the host, then use the extension.
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 (required for install)
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 .rogatio.json project file.
25802
+ Run offline dry-run tests against a Rogatio project file.
25770
25803
 
25771
25804
  Arguments:
25772
- path Path to .rogatio.json (default: .rogatio.json in current directory)
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() || !isRogatioProjectFilename(entry.name)) {
27362
- continue;
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 extIdIndex = args.indexOf("--extension-id");
29969
- if (extIdIndex === -1 || extIdIndex + 1 >= args.length) {
29970
- console.error("Error: --extension-id is required for install command");
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
- "runtime install complete: manifest + device-local CA trusted + runtime-host wrapper created\nNote: reload the extension at chrome://extensions for the native host to be detected."
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
- if (result.ok) {
30099
+ const originMismatch = result.manifestValid && result.allowedOrigins.length > 0 && !extensionOriginListed(extensionId, result.allowedOrigins);
30100
+ if (result.ok && !originMismatch) {
30022
30101
  console.log(
30023
- "runtime verification passed: manifest, binary, and CA trust all OK"
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 <id>' to register the host manifest"
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 <id>' to pin your 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 --extension-id <id>' with elevated privileges to trust the CA"
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 for .rogatio.json
30755
- test [path] [url...] Run offline dry-run tests against .rogatio.json
30756
- verify [path] Validate .rogatio.json file
30757
- import requestly <export.json> Migrate a Requestly export into .rogatio.json
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.7.0",
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.2",
49
+ "@types/node": "26.6.3",
50
50
  "typescript": "7.0.2",
51
- "vitest": "5.0.1"
51
+ "vitest": "5.0.2"
52
52
  }
53
53
  }