rulesync 43.6.2 → 43.7.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.
@@ -9723,11 +9723,9 @@ var RulesyncPermissions = class RulesyncPermissions extends RulesyncFile {
9723
9723
  * `PERMISSION_OVERRIDE_KEY_ALIASES`) is replaced wholesale, and removed when
9724
9724
  * the import does not produce one: only that tool's import ever writes it, so
9725
9725
  * a setting removed from the tool's own config has to disappear here too.
9726
- * Any other tool's override block the import carries (Hermes restores them
9727
- * from its provenance) merges one level down: an imported field replaces the
9728
- * existing field, fields the import does not name are kept, and a
9729
- * `permission` record inside the block merges per category. Every other
9730
- * top-level key — `$schema` included — is kept unless the import names it.
9726
+ * Every other top-level key — `$schema` included — is kept unless the import
9727
+ * names it, in which case the imported value replaces it. No importer emits
9728
+ * another tool's override block, so those blocks are never touched here.
9731
9729
  */
9732
9730
  static mergeImportedJson({ existing, imported, toolTarget }) {
9733
9731
  const ownOverrideKey = PERMISSION_OVERRIDE_KEY_ALIASES[toolTarget] ?? toolTarget;
@@ -9739,14 +9737,7 @@ var RulesyncPermissions = class RulesyncPermissions extends RulesyncFile {
9739
9737
  existing: current,
9740
9738
  imported: value
9741
9739
  });
9742
- else if (isRecord(current) && isRecord(value)) {
9743
- const block = { ...current };
9744
- for (const [field, fieldValue] of Object.entries(value)) block[field] = field === "permission" ? mergePermissionCategories({
9745
- existing: block[field],
9746
- imported: fieldValue
9747
- }) : fieldValue;
9748
- merged[key] = block;
9749
- } else merged[key] = value;
9740
+ else merged[key] = value;
9750
9741
  }
9751
9742
  return merged;
9752
9743
  }
@@ -29109,11 +29100,7 @@ var ZoocodeSkill = class extends RooSkill {
29109
29100
  static toolTarget = "zoocode";
29110
29101
  };
29111
29102
  // src/features/skills/skills-processor.ts
29112
- var skills_processor_exports = /* @__PURE__ */ __exportAll({
29113
- SkillsProcessor: () => SkillsProcessor,
29114
- SkillsProcessorToolTargetSchema: () => SkillsProcessorToolTargetSchema,
29115
- toolSkillFactories: () => toolSkillFactories
29116
- });
29103
+ var skills_processor_exports = /* @__PURE__ */ __exportAll({ toolSkillFactories: () => toolSkillFactories });
29117
29104
  const SkillsProcessorToolTargetSchema = z.enum(skillsProcessorToolTargetTuple);
29118
29105
  /**
29119
29106
  * Factory Map mapping tool targets to their skill factories.
@@ -52407,6 +52394,29 @@ var AmpHooks = class AmpHooks extends ToolHooks {
52407
52394
  });
52408
52395
  }
52409
52396
  };
52397
+ // src/features/hooks/hook-matcher-tool-names.ts
52398
+ const MATCHER_TOKEN_PATTERN = /\\.|\[(?:\\.|[^\]\\])*\]|(?<=^|[^\w\\]|\\\w)[A-Za-z_]\w*(?!\w)/gs;
52399
+ function isMatcherName(token) {
52400
+ return !token.startsWith("\\") && !token.startsWith("[");
52401
+ }
52402
+ /**
52403
+ * The distinct whole names in a matcher that start with a capital letter, for
52404
+ * adapters whose runtime tool names are all lowercase: after translation, such
52405
+ * a name has no runtime equivalent and can never match.
52406
+ */
52407
+ function capitalizedMatcherNames(matcher) {
52408
+ const names = [...matcher.matchAll(MATCHER_TOKEN_PATTERN)].map(([token]) => token).filter((token) => isMatcherName(token) && /^[A-Z]/.test(token));
52409
+ return [...new Set(names)];
52410
+ }
52411
+ /**
52412
+ * Rewrites the whole tool names inside a hook `matcher` regex through `names`,
52413
+ * leaving escapes, character classes and unknown names as written. Used by
52414
+ * adapters whose runtime tool names differ from the canonical (Claude Code)
52415
+ * spelling.
52416
+ */
52417
+ function replaceMatcherNames(matcher, names) {
52418
+ return matcher.replace(MATCHER_TOKEN_PATTERN, (token) => isMatcherName(token) && Object.hasOwn(names, token) ? names[token] ?? token : token);
52419
+ }
52410
52420
  // src/utils/object.ts
52411
52421
  /**
52412
52422
  * Return a shallow copy of `obj` keeping only the entries whose value is
@@ -54327,6 +54337,48 @@ const ANTIGRAVITY_FLAT_HANDLER_EVENTS = new Set([...ANTIGRAVITY_NO_MATCHER_EVENT
54327
54337
  record: CANONICAL_TO_ANTIGRAVITY_EVENT_NAMES,
54328
54338
  key: event
54329
54339
  }) ?? event));
54340
+ const CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES = {
54341
+ Bash: "run_command",
54342
+ Read: "(?:read_file|view_file)",
54343
+ Write: "(?:write_file|write_to_file)",
54344
+ Edit: "(?:edit_file|replace_file_content)",
54345
+ WebSearch: "search_web"
54346
+ };
54347
+ const ANTIGRAVITY_TO_CANONICAL_TOOL_NAMES = {
54348
+ run_command: "Bash",
54349
+ read_file: "Read",
54350
+ view_file: "Read",
54351
+ write_file: "Write",
54352
+ write_to_file: "Write",
54353
+ edit_file: "Edit",
54354
+ replace_file_content: "Edit",
54355
+ search_web: "WebSearch"
54356
+ };
54357
+ const ANTIGRAVITY_GROUP_TO_CANONICAL_TOOL_NAMES = Object.entries(CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES).filter(([, name]) => name.startsWith("(?:")).map(([canonical, group]) => [group, canonical]);
54358
+ const ANTIGRAVITY_DOCUMENTED_TOOL_CANDIDATES = {
54359
+ Grep: "grep_search",
54360
+ Glob: "find_by_name",
54361
+ WebFetch: "read_url_content",
54362
+ MultiEdit: "multi_replace_file_content"
54363
+ };
54364
+ function canonicalToAntigravityMatcher({ matcher, eventName, warn }) {
54365
+ const translated = replaceMatcherNames(matcher, CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES);
54366
+ const unmatched = capitalizedMatcherNames(translated);
54367
+ if (unmatched.length > 0) {
54368
+ const candidates = unmatched.flatMap((name) => {
54369
+ const candidate = lookupOwn({
54370
+ record: ANTIGRAVITY_DOCUMENTED_TOOL_CANDIDATES,
54371
+ key: name
54372
+ });
54373
+ return candidate ? [`\`${candidate}\` for ${quoteValueForWarning(name)}`] : [];
54374
+ });
54375
+ warn(`Antigravity reports lowercase tool names in the hook payload (\`toolCall.name\`), and ${unmatched.map((name) => quoteValueForWarning(name)).join(", ")} in the "${eventName}" matcher ${quoteValueForWarning(matcher)} has no verified Antigravity equivalent, so it is written as-is and will likely never match. Use the tool name Antigravity reports instead` + (candidates.length > 0 ? ` (the Antigravity hooks docs list ${candidates.join(", ")}, unverified).` : "."));
54376
+ }
54377
+ return translated;
54378
+ }
54379
+ function antigravityToCanonicalMatcher(matcher) {
54380
+ return replaceMatcherNames(ANTIGRAVITY_GROUP_TO_CANONICAL_TOOL_NAMES.reduce((current, [group, canonical]) => current.split(group).join(canonical), matcher), ANTIGRAVITY_TO_CANONICAL_TOOL_NAMES);
54381
+ }
54330
54382
  /**
54331
54383
  * Antigravity uses a Claude-Code-like `hooks.json`. The `PreToolUse` /
54332
54384
  * `PostToolUse` events use the matcher-based group shape, while `SessionStart`,
@@ -54340,7 +54392,11 @@ const ANTIGRAVITY_CONVERTER_CONFIG = {
54340
54392
  toolToCanonicalEventNames: ANTIGRAVITY_TO_CANONICAL_EVENT_NAMES,
54341
54393
  projectDirVar: "",
54342
54394
  noMatcherEvents: ANTIGRAVITY_NO_MATCHER_EVENTS,
54343
- supportedHookTypes: /* @__PURE__ */ new Set(["command"])
54395
+ supportedHookTypes: /* @__PURE__ */ new Set(["command"]),
54396
+ matcherTranslation: {
54397
+ toTool: canonicalToAntigravityMatcher,
54398
+ toCanonical: antigravityToCanonicalMatcher
54399
+ }
54344
54400
  };
54345
54401
  /**
54346
54402
  * Turn the shared converter's matcher-group output into Antigravity's shape:
@@ -57373,20 +57429,6 @@ var CopilotcliHooks = class CopilotcliHooks extends ToolHooks {
57373
57429
  }), null, 2) });
57374
57430
  }
57375
57431
  };
57376
- // src/features/hooks/hook-matcher-tool-names.ts
57377
- const MATCHER_TOKEN_PATTERN = /\\.|\[(?:\\.|[^\]\\])*\]|(?<=^|[^\w\\]|\\\w)[A-Za-z_]\w*(?!\w)/gs;
57378
- function isMatcherName(token) {
57379
- return !token.startsWith("\\") && !token.startsWith("[");
57380
- }
57381
- /**
57382
- * Rewrites the whole tool names inside a hook `matcher` regex through `names`,
57383
- * leaving escapes, character classes and unknown names as written. Used by
57384
- * adapters whose runtime tool names differ from the canonical (Claude Code)
57385
- * spelling.
57386
- */
57387
- function replaceMatcherNames(matcher, names) {
57388
- return matcher.replace(MATCHER_TOKEN_PATTERN, (token) => isMatcherName(token) && Object.hasOwn(names, token) ? names[token] ?? token : token);
57389
- }
57390
57432
  // src/features/hooks/cortexcode-hooks.ts
57391
57433
  const CORTEXCODE_NO_MATCHER_EVENTS = /* @__PURE__ */ new Set(["beforeSubmitPrompt", "stop"]);
57392
57434
  const CANONICAL_TO_CORTEXCODE_TOOL_NAMES = {
@@ -57400,8 +57442,8 @@ const CANONICAL_TO_CORTEXCODE_TOOL_NAMES = {
57400
57442
  const CORTEXCODE_TO_CANONICAL_TOOL_NAMES = invertRecord(CANONICAL_TO_CORTEXCODE_TOOL_NAMES);
57401
57443
  function canonicalToCortexcodeMatcher({ matcher, eventName, warn }) {
57402
57444
  const translated = replaceMatcherNames(matcher, CANONICAL_TO_CORTEXCODE_TOOL_NAMES);
57403
- const unmatched = [...translated.matchAll(MATCHER_TOKEN_PATTERN)].map(([token]) => token).filter((token) => isMatcherName(token) && /^[A-Z]/.test(token));
57404
- if (unmatched.length > 0) warn(`Cortex Code matches hook matchers case-sensitively against lowercase runtime tool names, and ${[...new Set(unmatched)].map((name) => quoteValueForWarning(name)).join(", ")} in the "${eventName}" matcher ${quoteValueForWarning(matcher)} is not a tool Cortex Code documents a runtime ID for, so it is written as-is and will likely never match. Replace it with the lowercase name Cortex Code uses for that tool, if it has one.`);
57445
+ const unmatched = capitalizedMatcherNames(translated);
57446
+ if (unmatched.length > 0) warn(`Cortex Code matches hook matchers case-sensitively against lowercase runtime tool names, and ${unmatched.map((name) => quoteValueForWarning(name)).join(", ")} in the "${eventName}" matcher ${quoteValueForWarning(matcher)} is not a tool Cortex Code documents a runtime ID for, so it is written as-is and will likely never match. Replace it with the lowercase name Cortex Code uses for that tool, if it has one.`);
57405
57447
  return translated;
57406
57448
  }
57407
57449
  function cortexcodeToCanonicalMatcher(matcher) {
@@ -79837,6 +79879,39 @@ const MATCH_ALL_PATH_GLOBS = /* @__PURE__ */ new Set([
79837
79879
  ]);
79838
79880
  const DIRECTORY_CONTENTS_SUFFIX = /\/\*\*(?:\/\*)?$/;
79839
79881
  const HOME_OR_VARIABLE_PATH = /^~(?:\/|$)|^\$[A-Za-z_]|\$\{[A-Za-z_]/;
79882
+ const LEADING_HOME = /^~(?:\/|$)/;
79883
+ /**
79884
+ * The home directory as an Antigravity path: forward slashes, no trailing
79885
+ * slash. agy accepts `C:/Users/...` on Windows, so one spelling serves both.
79886
+ */
79887
+ function toAntigravityHomePath(homeDirectory) {
79888
+ return homeDirectory.replaceAll("\\", "/").replace(/\/+$/, "");
79889
+ }
79890
+ /**
79891
+ * Rewrite a leading `~` or `~/` of a path target to the absolute home
79892
+ * directory. agy 1.5.1 matches `~` literally, so a `~/...` rule would never
79893
+ * apply (rulesync#3324). Only a file the user's own home holds, such as the
79894
+ * global Antigravity CLI settings, may carry a machine-specific path, so the
79895
+ * caller passes `homeDirectory` only then. `$HOME`, `${HOME}`, `%VAR%` and
79896
+ * `~user/` are left as written (the variable forms are still warned about).
79897
+ */
79898
+ function expandLeadingHome(target, homeDirectory) {
79899
+ if (homeDirectory === void 0 || !LEADING_HOME.test(target)) return target;
79900
+ const home = toAntigravityHomePath(homeDirectory);
79901
+ return target === "~" ? home || "/" : `${home}${target.slice(1)}`;
79902
+ }
79903
+ /**
79904
+ * The reverse of {@link expandLeadingHome} on import: an absolute path in the
79905
+ * home directory goes back to `~/...`, so `.rulesync/permissions.jsonc` stays
79906
+ * the same on every machine.
79907
+ */
79908
+ function collapseLeadingHome(target, homeDirectory) {
79909
+ if (homeDirectory === void 0) return target;
79910
+ const home = toAntigravityHomePath(homeDirectory);
79911
+ if (home.length === 0) return target;
79912
+ if (target === home) return "~";
79913
+ return target.startsWith(`${home}/`) ? `~${target.slice(home.length)}` : target;
79914
+ }
79840
79915
  const HOSTNAME = /^[a-z0-9-]+(?:\.[a-z0-9-]+)*$/;
79841
79916
  const DENY_HINTS = {
79842
79917
  read_file: "deny a directory or file path instead",
@@ -79989,13 +80064,14 @@ function warnHomeOrVariablePath({ action, target, rule, decision, logger, toolLa
79989
80064
  * nothing enforces it, and a widened one is warned about too, because it
79990
80065
  * blocks more than it says.
79991
80066
  */
79992
- function buildAntigravityPermissionEntry({ action: toolAction, category, pattern, decision, logger, toolLabel }) {
80067
+ function buildAntigravityPermissionEntry({ action: toolAction, category, pattern, decision, logger, toolLabel, homeDirectory }) {
79993
80068
  const isMcp = category.startsWith(MCP_CATEGORY_PREFIX);
79994
80069
  const action = isMcp ? "mcp" : toolAction;
79995
80070
  const result = isMcp ? toMcpRuleTarget(category, pattern) : pattern === "*" ? { target: "*" } : toTarget(action, pattern);
79996
80071
  const rule = `${category}: { "${pattern}": "${decision}" }`;
79997
80072
  if ("skipReason" in result) {
79998
- const prefix = decision !== "deny" ? void 0 : isMcp ? result.lead : toWidenedDenyTarget(action, pattern);
80073
+ const lead = decision !== "deny" ? void 0 : isMcp ? result.lead : toWidenedDenyTarget(action, pattern);
80074
+ const prefix = lead !== void 0 && PATH_ACTIONS.has(action) ? expandLeadingHome(lead, homeDirectory) : lead;
79999
80075
  if (prefix !== void 0) {
80000
80076
  const { entry, scope } = describeWidenedDeny({
80001
80077
  action,
@@ -80021,22 +80097,23 @@ function buildAntigravityPermissionEntry({ action: toolAction, category, pattern
80021
80097
  const consequence = decision === "deny" ? ", so the deny also overrides any allow or ask there" : "";
80022
80098
  logger.warn(`${toolLabel} permissions: ${rule}: ${result.note}${consequence}.`);
80023
80099
  }
80100
+ const target = PATH_ACTIONS.has(action) ? expandLeadingHome(result.target, homeDirectory) : result.target;
80024
80101
  warnHomeOrVariablePath({
80025
80102
  action,
80026
- target: result.target,
80103
+ target,
80027
80104
  rule,
80028
80105
  decision,
80029
80106
  logger,
80030
80107
  toolLabel
80031
80108
  });
80032
- return result.target === "*" ? action : `${action}(${result.target})`;
80109
+ return target === "*" ? action : `${action}(${target})`;
80033
80110
  }
80034
80111
  /**
80035
80112
  * Convert rulesync permissions config to Antigravity allow/ask/deny arrays,
80036
80113
  * shared by the CLI and IDE generators; `toAction` maps a canonical category to
80037
80114
  * the target's tool or action name.
80038
80115
  */
80039
- function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel, logger }) {
80116
+ function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel, logger, homeDirectory }) {
80040
80117
  const allow = [];
80041
80118
  const ask = [];
80042
80119
  const deny = [];
@@ -80049,7 +80126,8 @@ function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel,
80049
80126
  pattern,
80050
80127
  decision: permissionAction,
80051
80128
  logger,
80052
- toolLabel
80129
+ toolLabel,
80130
+ homeDirectory
80053
80131
  });
80054
80132
  if (entry === void 0) continue;
80055
80133
  switch (permissionAction) {
@@ -80074,7 +80152,7 @@ function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel,
80074
80152
  * shared by the CLI and IDE adapters; `toCategory` maps the target's tool or
80075
80153
  * action name back to a canonical category.
80076
80154
  */
80077
- function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory, toolLabel, logger }) {
80155
+ function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory, toolLabel, logger, homeDirectory }) {
80078
80156
  const permission = {};
80079
80157
  const processEntries = (entries, action) => {
80080
80158
  for (const entry of entries) {
@@ -80086,7 +80164,7 @@ function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory,
80086
80164
  decision: action,
80087
80165
  logger,
80088
80166
  toolLabel
80089
- }) : target;
80167
+ }) : PATH_ACTIONS.has(toolName) ? collapseLeadingHome(target, homeDirectory) : target;
80090
80168
  if (isPrototypePollutionKey(canonical) || isPrototypePollutionKey(pattern)) continue;
80091
80169
  getOrCreateOwn({
80092
80170
  record: permission,
@@ -80225,7 +80303,8 @@ var AntigravityCliPermissions = class AntigravityCliPermissions extends ToolPerm
80225
80303
  config,
80226
80304
  toAction: toAntigravityCliToolName,
80227
80305
  toolLabel: "Antigravity CLI",
80228
- logger
80306
+ logger,
80307
+ homeDirectory: outputRoot
80229
80308
  });
80230
80309
  const managedToolNames = new Set(Object.keys(config.permission).map((category) => toAntigravityCliToolName(category)));
80231
80310
  const isManagedToolName = (toolName) => managedToolNames.has(toolName) || managedToolNames.has("mcp") && toolName.startsWith("mcp__");
@@ -80276,7 +80355,8 @@ var AntigravityCliPermissions = class AntigravityCliPermissions extends ToolPerm
80276
80355
  deny: permissions.deny ?? [],
80277
80356
  toCategory: toCanonicalToolName$9,
80278
80357
  toolLabel: "Antigravity CLI",
80279
- logger: moduleLogger$4
80358
+ logger: moduleLogger$4,
80359
+ homeDirectory: this.getOutputRoot()
80280
80360
  });
80281
80361
  const override = {};
80282
80362
  const toolPermission = pickDocumentedValue({
@@ -90239,6 +90319,22 @@ function unmanagedMcpAllowlistEntries({ existing, previousPermission, nextPermis
90239
90319
  return category === null || !Object.hasOwn(previousPermission, category) && !Object.hasOwn(nextPermission, category);
90240
90320
  });
90241
90321
  }
90322
+ /** Hermes's override key in the canonical document (`hermes`). */
90323
+ const HERMES_OVERRIDE_KEY = PERMISSION_OVERRIDE_KEY_ALIASES.hermesagent ?? "hermesagent";
90324
+ /**
90325
+ * The part of a canonical permissions document Hermes keeps as provenance: the
90326
+ * `$schema`, the canonical `permission` block, and Hermes's own override.
90327
+ */
90328
+ function hermesProvenanceOf(permissions) {
90329
+ const source = permissions;
90330
+ const provenance = {};
90331
+ for (const key of [
90332
+ "$schema",
90333
+ "permission",
90334
+ HERMES_OVERRIDE_KEY
90335
+ ]) if (source[key] !== void 0) provenance[key] = source[key];
90336
+ return provenance;
90337
+ }
90242
90338
  /** The validated canonical `permission` block of a config's `permissions.rulesync` blob. */
90243
90339
  function canonicalPermissionOf(config) {
90244
90340
  const parsed = RulesyncPermissionsFileSchema.safeParse({ permission: provenancePermissionOf(config) });
@@ -90406,10 +90502,10 @@ var HermesagentPermissions = class HermesagentPermissions extends ToolPermission
90406
90502
  patterns: websiteBlocklist.enabled === true && isStringArray(websiteBlocklist.domains) ? websiteBlocklist.domains : []
90407
90503
  });
90408
90504
  removeEmptyCategories(permission);
90409
- const { permission: _permission, hermes: _hermes, ...otherProvenance } = provenance;
90410
90505
  const hermes = buildHermesOverride(config, provenance);
90506
+ const { $schema } = provenance;
90411
90507
  const imported = {
90412
- ...otherProvenance,
90508
+ ...$schema !== void 0 && { $schema },
90413
90509
  permission,
90414
90510
  ...Object.keys(hermes).length > 0 && { hermes }
90415
90511
  };
@@ -90467,7 +90563,7 @@ var HermesagentPermissions = class HermesagentPermissions extends ToolPermission
90467
90563
  base: config,
90468
90564
  patch: permissions.hermes
90469
90565
  });
90470
- config.permissions = { rulesync: permissions };
90566
+ config.permissions = { rulesync: hermesProvenanceOf(permissions) };
90471
90567
  return new HermesagentPermissions({
90472
90568
  outputRoot,
90473
90569
  fileContent: stringifySharedConfig({
@@ -103997,4 +104093,4 @@ const CHECKS_IMPORT_STRATEGY = {
103997
104093
  };
103998
104094
  export { RulesyncMcp as $, RULESYNC_USER_CONFIG_DIR_NAME as $n, isRootDirPath as $t, CODEBUDDY_LOCAL_RULE_FILE_NAME as A, CURATED_RULES_FEATURE_SUBDIR as An, resetRunWarningState as At, CLAUDECODE_MEMORIES_DIR_NAME as B, RULESYNC_HOOKS_RELATIVE_FILE_PATH as Bn, assertTreeContainsNoSymlinks as Bt, LETTACODE_DIR as C, ALL_TOOL_TARGETS as Cn, findControlCharacter as Ct, COMMANDCODE_DIR as D, ALL_FEATURES as Dn, fallbackLogger as Dt, FACTORYDROID_SETTINGS_LOCAL_FILE_NAME as E, ToolTargetSchema as En, WarningCollectingLogger as Et, CODEXCLI_BASH_RULES_FILE_NAME as F, RULESYNC_COMMANDS_RELATIVE_DIR_PATH as Fn, PathOutsideRootError as Ft, getLocalSkillDirNames as G, RULESYNC_NPM_SOURCES_LOCK_RELATIVE_FILE_PATH as Gn, ensureDir as Gt, CLAUDECODE_SKILLS_DIR_PATH as H, RULESYNC_LOCAL_CONFIG_RELATIVE_FILE_PATH as Hn, checkPathTraversal as Ht, CODEXCLI_DIR as I, RULESYNC_CONFIG_RELATIVE_FILE_PATH as In, applyFileMode as It, RulesyncSkill as J, RULESYNC_RELATIVE_DIR_PATH as Jn, findFilesByGlobs as Jt, RulesyncSubagent as K, RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH as Kn, fileExists as Kt, CLAUDECODE_AGENT_MEMORY_LOCAL_DIR_NAME as L, RULESYNC_CONFIG_SCHEMA_URL as Ln, assertDirectoryIfExists as Lt, AUGMENTCODE_SETTINGS_LOCAL_FILE_NAME as M, MAX_FILE_SIZE as Mn, CLIError as Mt, caseFoldIdentity as N, RULESYNC_AIIGNORE_RELATIVE_FILE_PATH as Nn, ErrorCodes as Nt, COMMANDCODE_SETTINGS_LOCAL_FILE_NAME as O, ALL_FEATURES_WITH_WILDCARD as On, warnOnConflictingFlags as Ot, groupSpellingsByCaseFoldedIdentity as P, RULESYNC_CHECKS_RELATIVE_DIR_PATH as Pn, parseJsonc as Pt, RulesyncPermissions as Q, RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH as Qn, isFileSystemError as Qt, CLAUDECODE_DIR as R, RULESYNC_CURATED_RULES_RELATIVE_DIR_PATH as Rn, assertNoSymlinkBelowRoot as Rt, QWENCODE_LOCAL_RULE_FILE_NAME as S, mapWithConcurrency as Sn, getSourceTransport as St, FACTORYDROID_DIR as T, PACKAGING_TOOL_TARGETS as Tn, JsonLogger as Tt, findProjectInstructionBudgetFindings as U, RULESYNC_MCP_RELATIVE_FILE_PATH as Un, createTempDirectory as Ut, CLAUDECODE_SETTINGS_LOCAL_FILE_NAME as V, RULESYNC_IGNORE_RELATIVE_FILE_PATH as Vn, assertWritablePathInsideRoot as Vt, toInstructionBudgetFile as W, RULESYNC_MCP_SCHEMA_URL as Wn, directoryExists as Wt, RulesyncRule as X, RULESYNC_SKILLS_RELATIVE_DIR_PATH as Xn, getHomeDirectory as Xt, RulesyncSkillFrontmatterSchema as Y, RULESYNC_RULES_RELATIVE_DIR_PATH as Yn, getFileSizeAndExecutableBit as Yt, RulesyncRuleFrontmatterSchema as Z, RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH as Zn, isFileNotFoundError as Zt, SkillsProcessor as _, runWithDirectoryRollback as _n, CONFLICTING_TARGET_PAIRS as _t, convertFromTool as a, pathEscapesRoot as an, hasEnclosingMarkOutsideKeycap as ar, RulesyncCommandFrontmatterSchema as at, REASONIX_LOCAL_RULE_FILE_NAME as b, writeFileBuffer as bn, SourceEntrySchema as bt, ELLIPSIS_WIDTH as c, readFileContentOrNull as cn, stripControlCharactersKeepingLineFeeds as cr, stringifyFrontmatter as ct, McpProcessor as d, removeFile as dn, SHARED_USER_MANAGED_CONFIG_PATHS as dt, isSymlink as en, RULESYNC_XDG_CONFIG_HOME_DEFAULT_DIR_NAME as er, RulesyncIgnore as et, IgnoreProcessor as f, removeFileStrict as fn, SKILL_FILE_NAME as ft, SubagentsProcessor as g, resolvedRelativePath as gn, resolveEffectiveInputRoots as gt, RulesProcessor as h, resolvePath as hn, parseConfigFileContent as ht, inspectInputRoots as i, normalizePosixDirPath as in, hasDeceptiveHiddenCharacters as ir, RulesyncCommand as it, AUGMENTCODE_DIR as j, FEATURE_SOURCE_TREE_ENTRIES as jn, withWarnOnceScope as jt, CODEBUDDY_DIR as k, DEPRECATED_FEATURE_REPLACEMENTS as kn, withFallbackLoggerTarget as kt, displayWidthOf as l, removeDirectory as ln, stripControlCharactersKeepingLineFeedsAndTabs as lr, loadYaml as lt, ChecksProcessor as m, removeTempDirectory as mn, mergeInputRootConfigs as mt, formatSourceLoadFailure as n, listFilePathsRecursively as nn, formatError as nr, getRulesyncSourceCandidates as nt, getProcessorRegistryEntry as o, posixRelativePathEscapesRoot as on, quoteForLog as or, RulesyncCheck as ot, HooksProcessor as p, removeFileWithoutFollowingSymlinks as pn, ConfigResolver as pt, RulesyncSubagentFrontmatterSchema as q, RULESYNC_PERMISSIONS_SCHEMA_URL as qn, fileExistsStrict as qt, generate as r, listSubdirectoryNames as rn, truncateText as rr, resolveRulesyncSourceWritePath as rt, parseCommaSeparatedList as s, readFileContent as sn, stripControlCharacters as sr, RulesyncCheckFrontmatterSchema as st, importFromTool as t, listDirectoryEntryNames as tn, formatMegabytes as tr, RulesyncHooks as tt, shortenToWidth as u, removeDirectoryStrict as un, stripHiddenCharacters as ur, isRecord as ut, CRUSH_LOCAL_RULE_FILE_NAME as v, splitPathSegments as vn, ConfigFileSchema as vt, LETTACODE_SETTINGS_LOCAL_FILE_NAME as w, ALL_TOOL_TARGETS_WITH_WILDCARD as wn, ConsoleLogger as wt, QWENCODE_DIR as x, writeFileContent as xn, assertTargetsFeaturesExclusive as xt, CommandsProcessor as y, toPosixPath as yn, GITIGNORE_DESTINATION_KEY as yt, CLAUDECODE_LOCAL_RULE_FILE_NAME as z, RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH as zn, assertPathResolvesInsideRoot as zt };
103999
104095
 
104000
- //# sourceMappingURL=import-iLVVcze8.js.map
104096
+ //# sourceMappingURL=import-tr3jHcG2.js.map