@astrasyncai/verification-gateway 4.1.0 → 4.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.
@@ -5912,6 +5912,72 @@ function uninstallClaudeHooks(settingsPath, marker2 = ASTRASYNC_HOOK_MARKER) {
5912
5912
  writeSettings(settingsPath, settings);
5913
5913
  return true;
5914
5914
  }
5915
+ var PERMISSION_DENY_PATHS = [
5916
+ "**/.claude/settings.json",
5917
+ "**/.claude/settings.local.json",
5918
+ "~/.claude/settings.json",
5919
+ "~/.claude/settings.local.json",
5920
+ "**/.astrasync/**",
5921
+ "~/.astrasync/**"
5922
+ ];
5923
+ var GUARD_PERMISSION_DENY_RULES = PERMISSION_DENY_PATHS.map(
5924
+ (p) => `Edit(${p})`
5925
+ );
5926
+ var LEGACY_GUARD_PERMISSION_DENY_RULES = [];
5927
+ function readDenyRules(settings, settingsPath) {
5928
+ const permissions = settings.permissions;
5929
+ if (permissions !== void 0 && (typeof permissions !== "object" || Array.isArray(permissions) || permissions === null)) {
5930
+ throw new Error(`${settingsPath}: "permissions" is not an object \u2014 refusing to rewrite it.`);
5931
+ }
5932
+ const deny = permissions?.deny;
5933
+ if (deny === void 0) return [];
5934
+ if (!Array.isArray(deny) || deny.some((r) => typeof r !== "string")) {
5935
+ throw new Error(
5936
+ `${settingsPath}: "permissions.deny" is not an array of strings \u2014 refusing to rewrite it.`
5937
+ );
5938
+ }
5939
+ return deny;
5940
+ }
5941
+ function installClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
5942
+ const settings = readSettings(settingsPath);
5943
+ const deny = readDenyRules(settings, settingsPath);
5944
+ const stale = new Set(staleRules);
5945
+ const removedStaleRules = deny.filter((r) => stale.has(r));
5946
+ const kept = deny.filter((r) => !stale.has(r));
5947
+ const present = new Set(kept);
5948
+ const addedRules = rules.filter((r) => !present.has(r));
5949
+ const changed = addedRules.length > 0 || removedStaleRules.length > 0;
5950
+ if (changed) {
5951
+ settings.permissions = settings.permissions ?? {};
5952
+ settings.permissions.deny = [...kept, ...addedRules];
5953
+ writeSettings(settingsPath, settings);
5954
+ }
5955
+ return { addedRules, removedStaleRules, changed };
5956
+ }
5957
+ function uninstallClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
5958
+ if (!(0, import_fs5.existsSync)(settingsPath)) return [];
5959
+ let settings;
5960
+ let deny;
5961
+ try {
5962
+ settings = readSettings(settingsPath);
5963
+ deny = readDenyRules(settings, settingsPath);
5964
+ } catch {
5965
+ return [];
5966
+ }
5967
+ if (deny.length === 0) return [];
5968
+ const ours = /* @__PURE__ */ new Set([...rules, ...staleRules]);
5969
+ const removed = deny.filter((r) => ours.has(r));
5970
+ if (removed.length === 0) return [];
5971
+ const remaining = deny.filter((r) => !ours.has(r));
5972
+ if (remaining.length > 0) {
5973
+ settings.permissions.deny = remaining;
5974
+ } else {
5975
+ delete settings.permissions.deny;
5976
+ if (Object.keys(settings.permissions).length === 0) delete settings.permissions;
5977
+ }
5978
+ writeSettings(settingsPath, settings);
5979
+ return removed;
5980
+ }
5915
5981
  var GUARD_SELF_PROTECTION_PATTERNS = [
5916
5982
  "**/.claude/settings.json",
5917
5983
  "**/.claude/settings.local.json",
@@ -6306,6 +6372,17 @@ async function cmdInstallClaudeCode() {
6306
6372
  } else {
6307
6373
  console.log(` Hook: already present in ${settingsPath}`);
6308
6374
  }
6375
+ const permResult = installClaudePermissionRules(settingsPath);
6376
+ if (permResult.addedRules.length > 0) {
6377
+ console.log(
6378
+ ` Deny: ${permResult.addedRules.length} permissions.deny self-protection rules added in ${settingsPath}`
6379
+ );
6380
+ } else {
6381
+ console.log(" Deny: permissions.deny self-protection rules already present");
6382
+ }
6383
+ if (permResult.removedStaleRules.length > 0) {
6384
+ console.log(` removed ${permResult.removedStaleRules.length} stale guard rules`);
6385
+ }
6309
6386
  console.log("\n Next steps:");
6310
6387
  console.log(" 1. Start a NEW Claude Code session (settings load at startup).");
6311
6388
  console.log(` 2. Watch decisions: tail -f ${path.join(astrasyncDir, "traces")}/*.jsonl`);
@@ -6323,6 +6400,16 @@ async function cmdUninstallClaudeCode() {
6323
6400
  } else {
6324
6401
  console.log(`[AstraSync] No AstraSync hook found in ${settingsPath}`);
6325
6402
  }
6403
+ const removedRules = uninstallClaudePermissionRules(settingsPath);
6404
+ if (removedRules.length > 0) {
6405
+ console.log(
6406
+ `[AstraSync] Removed ${removedRules.length} permissions.deny rules from ${settingsPath}.`
6407
+ );
6408
+ console.log(" If you had added any of these yourself, re-add them:");
6409
+ for (const rule of removedRules) {
6410
+ console.log(` ${rule}`);
6411
+ }
6412
+ }
6326
6413
  console.log(
6327
6414
  `[AstraSync] Policy and traces left in place at ${astrasyncDir} \u2014 delete manually if unwanted.`
6328
6415
  );
@@ -6851,6 +6851,60 @@ function uninstallClaudeHooks(settingsPath, marker2 = ASTRASYNC_HOOK_MARKER) {
6851
6851
  writeSettings(settingsPath, settings);
6852
6852
  return true;
6853
6853
  }
6854
+ function readDenyRules(settings, settingsPath) {
6855
+ const permissions = settings.permissions;
6856
+ if (permissions !== void 0 && (typeof permissions !== "object" || Array.isArray(permissions) || permissions === null)) {
6857
+ throw new Error(`${settingsPath}: "permissions" is not an object \u2014 refusing to rewrite it.`);
6858
+ }
6859
+ const deny = permissions?.deny;
6860
+ if (deny === void 0) return [];
6861
+ if (!Array.isArray(deny) || deny.some((r) => typeof r !== "string")) {
6862
+ throw new Error(
6863
+ `${settingsPath}: "permissions.deny" is not an array of strings \u2014 refusing to rewrite it.`
6864
+ );
6865
+ }
6866
+ return deny;
6867
+ }
6868
+ function installClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
6869
+ const settings = readSettings(settingsPath);
6870
+ const deny = readDenyRules(settings, settingsPath);
6871
+ const stale = new Set(staleRules);
6872
+ const removedStaleRules = deny.filter((r) => stale.has(r));
6873
+ const kept = deny.filter((r) => !stale.has(r));
6874
+ const present = new Set(kept);
6875
+ const addedRules = rules.filter((r) => !present.has(r));
6876
+ const changed = addedRules.length > 0 || removedStaleRules.length > 0;
6877
+ if (changed) {
6878
+ settings.permissions = settings.permissions ?? {};
6879
+ settings.permissions.deny = [...kept, ...addedRules];
6880
+ writeSettings(settingsPath, settings);
6881
+ }
6882
+ return { addedRules, removedStaleRules, changed };
6883
+ }
6884
+ function uninstallClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
6885
+ if (!(0, import_fs5.existsSync)(settingsPath)) return [];
6886
+ let settings;
6887
+ let deny;
6888
+ try {
6889
+ settings = readSettings(settingsPath);
6890
+ deny = readDenyRules(settings, settingsPath);
6891
+ } catch {
6892
+ return [];
6893
+ }
6894
+ if (deny.length === 0) return [];
6895
+ const ours = /* @__PURE__ */ new Set([...rules, ...staleRules]);
6896
+ const removed = deny.filter((r) => ours.has(r));
6897
+ if (removed.length === 0) return [];
6898
+ const remaining = deny.filter((r) => !ours.has(r));
6899
+ if (remaining.length > 0) {
6900
+ settings.permissions.deny = remaining;
6901
+ } else {
6902
+ delete settings.permissions.deny;
6903
+ if (Object.keys(settings.permissions).length === 0) delete settings.permissions;
6904
+ }
6905
+ writeSettings(settingsPath, settings);
6906
+ return removed;
6907
+ }
6854
6908
  function ensureGuardSelfProtection(policyPath) {
6855
6909
  const parsed = parseFile(policyPath);
6856
6910
  if (!parsed.validation.valid || !parsed.policy) return false;
@@ -6895,7 +6949,7 @@ function buildDefaultClaudeCodePolicy(name = "claude-code-local-guard") {
6895
6949
  riskThresholds: permissive.thresholds
6896
6950
  };
6897
6951
  }
6898
- var import_fs5, import_path4, ASTRASYNC_HOOK_MARKER, HOOK_MATCHER, HOOK_TIMEOUT_SECONDS, GUARD_SELF_PROTECTION_PATTERNS;
6952
+ var import_fs5, import_path4, ASTRASYNC_HOOK_MARKER, HOOK_MATCHER, HOOK_TIMEOUT_SECONDS, PERMISSION_DENY_PATHS, GUARD_PERMISSION_DENY_RULES, LEGACY_GUARD_PERMISSION_DENY_RULES, GUARD_SELF_PROTECTION_PATTERNS;
6899
6953
  var init_settings_installer = __esm({
6900
6954
  "src/claude-code/settings-installer.ts"() {
6901
6955
  "use strict";
@@ -6906,6 +6960,18 @@ var init_settings_installer = __esm({
6906
6960
  ASTRASYNC_HOOK_MARKER = "astrasync-claude-hook";
6907
6961
  HOOK_MATCHER = "Bash|PowerShell|Write|Edit|MultiEdit|NotebookEdit|Read|Glob|Grep|WebFetch|WebSearch|Task|Agent|mcp__.*";
6908
6962
  HOOK_TIMEOUT_SECONDS = 10;
6963
+ PERMISSION_DENY_PATHS = [
6964
+ "**/.claude/settings.json",
6965
+ "**/.claude/settings.local.json",
6966
+ "~/.claude/settings.json",
6967
+ "~/.claude/settings.local.json",
6968
+ "**/.astrasync/**",
6969
+ "~/.astrasync/**"
6970
+ ];
6971
+ GUARD_PERMISSION_DENY_RULES = PERMISSION_DENY_PATHS.map(
6972
+ (p) => `Edit(${p})`
6973
+ );
6974
+ LEGACY_GUARD_PERMISSION_DENY_RULES = [];
6909
6975
  GUARD_SELF_PROTECTION_PATTERNS = [
6910
6976
  "**/.claude/settings.json",
6911
6977
  "**/.claude/settings.local.json",
@@ -7264,6 +7330,17 @@ async function cmdInstallClaudeCode() {
7264
7330
  } else {
7265
7331
  console.log(` Hook: already present in ${settingsPath}`);
7266
7332
  }
7333
+ const permResult = installClaudePermissionRules(settingsPath);
7334
+ if (permResult.addedRules.length > 0) {
7335
+ console.log(
7336
+ ` Deny: ${permResult.addedRules.length} permissions.deny self-protection rules added in ${settingsPath}`
7337
+ );
7338
+ } else {
7339
+ console.log(" Deny: permissions.deny self-protection rules already present");
7340
+ }
7341
+ if (permResult.removedStaleRules.length > 0) {
7342
+ console.log(` removed ${permResult.removedStaleRules.length} stale guard rules`);
7343
+ }
7267
7344
  console.log("\n Next steps:");
7268
7345
  console.log(" 1. Start a NEW Claude Code session (settings load at startup).");
7269
7346
  console.log(` 2. Watch decisions: tail -f ${path.join(astrasyncDir, "traces")}/*.jsonl`);
@@ -7281,6 +7358,16 @@ async function cmdUninstallClaudeCode() {
7281
7358
  } else {
7282
7359
  console.log(`[AstraSync] No AstraSync hook found in ${settingsPath}`);
7283
7360
  }
7361
+ const removedRules = uninstallClaudePermissionRules(settingsPath);
7362
+ if (removedRules.length > 0) {
7363
+ console.log(
7364
+ `[AstraSync] Removed ${removedRules.length} permissions.deny rules from ${settingsPath}.`
7365
+ );
7366
+ console.log(" If you had added any of these yourself, re-add them:");
7367
+ for (const rule of removedRules) {
7368
+ console.log(` ${rule}`);
7369
+ }
7370
+ }
7284
7371
  console.log(
7285
7372
  `[AstraSync] Policy and traces left in place at ${astrasyncDir} \u2014 delete manually if unwanted.`
7286
7373
  );
@@ -5314,6 +5314,17 @@ function uninstallClaudeHooks(settingsPath, marker2 = ASTRASYNC_HOOK_MARKER) {
5314
5314
  writeSettings(settingsPath, settings);
5315
5315
  return true;
5316
5316
  }
5317
+ var PERMISSION_DENY_PATHS = [
5318
+ "**/.claude/settings.json",
5319
+ "**/.claude/settings.local.json",
5320
+ "~/.claude/settings.json",
5321
+ "~/.claude/settings.local.json",
5322
+ "**/.astrasync/**",
5323
+ "~/.astrasync/**"
5324
+ ];
5325
+ var GUARD_PERMISSION_DENY_RULES = PERMISSION_DENY_PATHS.map(
5326
+ (p) => `Edit(${p})`
5327
+ );
5317
5328
 
5318
5329
  // src/codex/settings-installer.ts
5319
5330
  var ASTRASYNC_CODEX_HOOK_MARKER = "astrasync-codex-hook";