rulesync 9.1.0 → 9.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.
@@ -7142,6 +7142,12 @@ var CodexcliHooks = class CodexcliHooks extends ToolHooks {
7142
7142
  relativeFilePath: CODEXCLI_HOOKS_FILE_NAME
7143
7143
  };
7144
7144
  }
7145
+ static getExtraSharedWritePaths() {
7146
+ return [{
7147
+ relativeDirPath: CODEXCLI_DIR,
7148
+ relativeFilePath: CODEXCLI_MCP_FILE_NAME
7149
+ }];
7150
+ }
7145
7151
  static async fromFile({ outputRoot = process.cwd(), validate = true, global = false }) {
7146
7152
  const paths = CodexcliHooks.getSettablePaths({ global });
7147
7153
  const fileContent = await readFileContentOrNull(join(outputRoot, paths.relativeDirPath, paths.relativeFilePath)) ?? "{\"hooks\":{}}";
@@ -9732,6 +9738,12 @@ var VibeHooks = class VibeHooks extends ToolHooks {
9732
9738
  relativeFilePath: VIBE_HOOKS_FILE_NAME
9733
9739
  };
9734
9740
  }
9741
+ static getExtraSharedWritePaths() {
9742
+ return [{
9743
+ relativeDirPath: VIBE_DIR,
9744
+ relativeFilePath: VIBE_CONFIG_FILE_NAME
9745
+ }];
9746
+ }
9735
9747
  static async fromFile({ outputRoot = process.cwd(), validate = true, global = false }) {
9736
9748
  const paths = VibeHooks.getSettablePaths({ global });
9737
9749
  const fileContent = await readFileContentOrNull(join(outputRoot, paths.relativeDirPath, paths.relativeFilePath)) ?? smolToml.stringify({});
@@ -10450,6 +10462,66 @@ var AugmentcodeIgnore = class AugmentcodeIgnore extends ToolIgnore {
10450
10462
  }
10451
10463
  };
10452
10464
  //#endregion
10465
+ //#region src/features/claudecode-settings-gateway.ts
10466
+ /**
10467
+ * Single owner of the `.claude/settings.json` `permissions` block, which both
10468
+ * `ignore` (writes `Read(...)` into `permissions.deny`) and `permissions`
10469
+ * (writes the whole `allow`/`ask`/`deny`) read-modify-write. The entry format,
10470
+ * the merge, and the cross-feature ownership rule (permissions' explicit `Read`
10471
+ * rules win over ignore-derived `Read` denies) used to be duplicated across both
10472
+ * feature files; they live here once so each feature just states its intent and
10473
+ * never reasons about the other's existence.
10474
+ */
10475
+ const READ_TOOL_NAME = "Read";
10476
+ const isReadDenyEntry = (entry) => entry.startsWith(`${READ_TOOL_NAME}(`) && entry.endsWith(")");
10477
+ const buildReadDenyEntry = (pattern) => `${READ_TOOL_NAME}(${pattern})`;
10478
+ const parsePermissionsBlock = (settings) => {
10479
+ const permissions = settings.permissions ?? {};
10480
+ return {
10481
+ allow: permissions.allow ?? [],
10482
+ ask: permissions.ask ?? [],
10483
+ deny: permissions.deny ?? []
10484
+ };
10485
+ };
10486
+ const withPermissions = (settings, next) => {
10487
+ const permissions = { ...settings.permissions };
10488
+ const assign = (key, values) => {
10489
+ if (values.length > 0) permissions[key] = values;
10490
+ else delete permissions[key];
10491
+ };
10492
+ assign("allow", next.allow);
10493
+ assign("ask", next.ask);
10494
+ assign("deny", next.deny);
10495
+ return {
10496
+ ...settings,
10497
+ permissions
10498
+ };
10499
+ };
10500
+ const applyIgnoreReadDenies = (params) => {
10501
+ const { settings, readDenies } = params;
10502
+ const current = parsePermissionsBlock(settings);
10503
+ const preservedDeny = current.deny.filter((entry) => !isReadDenyEntry(entry) || readDenies.includes(entry));
10504
+ return withPermissions(settings, {
10505
+ allow: current.allow,
10506
+ ask: current.ask,
10507
+ deny: uniq([...preservedDeny, ...readDenies].toSorted())
10508
+ });
10509
+ };
10510
+ const applyPermissions = (params) => {
10511
+ const { settings, managedToolNames, toolNameOf, allow, ask, deny, logger } = params;
10512
+ const current = parsePermissionsBlock(settings);
10513
+ const keepUnmanaged = (entries) => entries.filter((entry) => !managedToolNames.has(toolNameOf(entry)));
10514
+ if (logger && managedToolNames.has(READ_TOOL_NAME)) {
10515
+ const overwrittenReadDenies = current.deny.filter((entry) => toolNameOf(entry) === READ_TOOL_NAME);
10516
+ if (overwrittenReadDenies.length > 0) logger.warn(`Permissions feature manages '${READ_TOOL_NAME}' tool and will overwrite ${overwrittenReadDenies.length} existing ${READ_TOOL_NAME} deny entries. Permissions take precedence.`);
10517
+ }
10518
+ return withPermissions(settings, {
10519
+ allow: uniq([...keepUnmanaged(current.allow), ...allow].toSorted()),
10520
+ ask: uniq([...keepUnmanaged(current.ask), ...ask].toSorted()),
10521
+ deny: uniq([...keepUnmanaged(current.deny), ...deny].toSorted())
10522
+ });
10523
+ };
10524
+ //#endregion
10453
10525
  //#region src/features/ignore/claudecode-ignore.ts
10454
10526
  const DEFAULT_FILE_MODE = "shared";
10455
10527
  /**
@@ -10496,7 +10568,7 @@ var ClaudecodeIgnore = class ClaudecodeIgnore extends ToolIgnore {
10496
10568
  }
10497
10569
  toRulesyncIgnore() {
10498
10570
  const fileContent = this.patterns.map((pattern) => {
10499
- if (pattern.startsWith("Read(") && pattern.endsWith(")")) return pattern.slice(5, -1);
10571
+ if (isReadDenyEntry(pattern)) return pattern.slice(5, -1);
10500
10572
  return pattern;
10501
10573
  }).filter((pattern) => pattern.length > 0).join("\n");
10502
10574
  return new RulesyncIgnore({
@@ -10507,22 +10579,20 @@ var ClaudecodeIgnore = class ClaudecodeIgnore extends ToolIgnore {
10507
10579
  });
10508
10580
  }
10509
10581
  static async fromRulesyncIgnore({ outputRoot = process.cwd(), rulesyncIgnore, options }) {
10510
- const deniedValues = rulesyncIgnore.getFileContent().split(/\r?\n|\r/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((pattern) => `Read(${pattern})`);
10582
+ const deniedValues = rulesyncIgnore.getFileContent().split(/\r?\n|\r/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((pattern) => buildReadDenyEntry(pattern));
10511
10583
  const paths = this.getSettablePaths({ options });
10512
10584
  const filePath = join(outputRoot, paths.relativeDirPath, paths.relativeFilePath);
10513
10585
  const existingFileContent = await fileExists(filePath) ? await readFileContent(filePath) : "{}";
10514
- const existingJsonValue = JSON.parse(existingFileContent);
10515
- const preservedDenies = (existingJsonValue.permissions?.deny ?? []).filter((deny) => {
10516
- if (deny.startsWith("Read(") && deny.endsWith(")")) return deniedValues.includes(deny);
10517
- return true;
10586
+ let existingJsonValue;
10587
+ try {
10588
+ existingJsonValue = JSON.parse(existingFileContent);
10589
+ } catch (error) {
10590
+ throw new Error(`Failed to parse existing Claude settings at ${filePath}: ${formatError(error)}`, { cause: error });
10591
+ }
10592
+ const jsonValue = applyIgnoreReadDenies({
10593
+ settings: existingJsonValue,
10594
+ readDenies: deniedValues
10518
10595
  });
10519
- const jsonValue = {
10520
- ...existingJsonValue,
10521
- permissions: {
10522
- ...existingJsonValue.permissions,
10523
- deny: uniq([...preservedDenies, ...deniedValues].toSorted())
10524
- }
10525
- };
10526
10596
  return new ClaudecodeIgnore({
10527
10597
  outputRoot,
10528
10598
  relativeDirPath: paths.relativeDirPath,
@@ -17059,31 +17129,15 @@ var ClaudecodePermissions = class ClaudecodePermissions extends ToolPermissions
17059
17129
  const config = rulesyncPermissions.getJson();
17060
17130
  const { allow, ask, deny } = convertRulesyncToClaudePermissions(config);
17061
17131
  const managedToolNames = new Set(Object.keys(config.permission).map((category) => toClaudeToolName(category)));
17062
- const existingPermissions = settings.permissions ?? {};
17063
- const preservedAllow = (existingPermissions.allow ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17064
- const preservedAsk = (existingPermissions.ask ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17065
- const preservedDeny = (existingPermissions.deny ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17066
- if (logger && managedToolNames.has("Read")) {
17067
- const droppedReadDenyEntries = (existingPermissions.deny ?? []).filter((entry) => {
17068
- const { toolName } = parseClaudePermissionEntry(entry);
17069
- return toolName === "Read";
17070
- });
17071
- if (droppedReadDenyEntries.length > 0) logger.warn(`Permissions feature manages 'Read' tool and will overwrite ${droppedReadDenyEntries.length} existing Read deny entries (possibly from ignore feature). Permissions take precedence.`);
17072
- }
17073
- const mergedPermissions = { ...existingPermissions };
17074
- const mergedAllow = uniq([...preservedAllow, ...allow].toSorted());
17075
- const mergedAsk = uniq([...preservedAsk, ...ask].toSorted());
17076
- const mergedDeny = uniq([...preservedDeny, ...deny].toSorted());
17077
- if (mergedAllow.length > 0) mergedPermissions.allow = mergedAllow;
17078
- else delete mergedPermissions.allow;
17079
- if (mergedAsk.length > 0) mergedPermissions.ask = mergedAsk;
17080
- else delete mergedPermissions.ask;
17081
- if (mergedDeny.length > 0) mergedPermissions.deny = mergedDeny;
17082
- else delete mergedPermissions.deny;
17083
- const merged = {
17084
- ...settings,
17085
- permissions: mergedPermissions
17086
- };
17132
+ const merged = applyPermissions({
17133
+ settings,
17134
+ managedToolNames,
17135
+ toolNameOf: (entry) => parseClaudePermissionEntry(entry).toolName,
17136
+ allow,
17137
+ ask,
17138
+ deny,
17139
+ logger
17140
+ });
17087
17141
  const fileContent = JSON.stringify(merged, null, 2);
17088
17142
  return new ClaudecodePermissions({
17089
17143
  outputRoot,
@@ -33761,6 +33815,9 @@ var KiloRule = class KiloRule extends ToolRule {
33761
33815
  nonRoot: { relativeDirPath: buildToolPath(KILO_DIR, KILO_RULES_DIR_NAME, excludeToolDir) }
33762
33816
  };
33763
33817
  }
33818
+ static getExtraSharedWritePaths({ global = false } = {}) {
33819
+ return global ? [] : [KiloMcp.getSettablePaths({ global: false })];
33820
+ }
33764
33821
  static async fromFile({ outputRoot = process.cwd(), relativeFilePath, validate = true, global = false }) {
33765
33822
  const paths = this.getSettablePaths({ global });
33766
33823
  if (relativeFilePath === paths.root.relativeFilePath) {
@@ -34022,6 +34079,9 @@ var OpenCodeRule = class OpenCodeRule extends ToolRule {
34022
34079
  nonRoot: { relativeDirPath: buildToolPath(OPENCODE_DIR, "memories", excludeToolDir) }
34023
34080
  };
34024
34081
  }
34082
+ static getExtraSharedWritePaths({ global = false } = {}) {
34083
+ return global ? [] : [OpencodeMcp.getSettablePaths({ global: false })];
34084
+ }
34025
34085
  static async fromFile({ outputRoot = process.cwd(), relativeFilePath, validate = true, global = false }) {
34026
34086
  const paths = this.getSettablePaths({ global });
34027
34087
  if (relativeFilePath === paths.root.relativeFilePath) {
@@ -34698,6 +34758,37 @@ var RovodevRule = class RovodevRule extends ToolRule {
34698
34758
  toolTarget: "rovodev"
34699
34759
  });
34700
34760
  }
34761
+ /**
34762
+ * Mirror the primary `.rovodev/AGENTS.md` root rule to `./AGENTS.md` so project
34763
+ * memory stays discoverable at the repo root. Empty when `rootRule` is not the primary root.
34764
+ */
34765
+ static getRootMirrorFiles({ outputRoot, rootRule, content }) {
34766
+ if (!(rootRule instanceof RovodevRule)) return [];
34767
+ const primary = this.getSettablePaths({ global: false }).root;
34768
+ if (rootRule.getRelativeDirPath() !== primary.relativeDirPath || rootRule.getRelativeFilePath() !== primary.relativeFilePath) return [];
34769
+ return [new RovodevRule({
34770
+ outputRoot,
34771
+ relativeDirPath: ".",
34772
+ relativeFilePath: ROVODEV_RULE_FILE_NAME,
34773
+ fileContent: content,
34774
+ validate: true,
34775
+ root: true
34776
+ })];
34777
+ }
34778
+ /**
34779
+ * Globs for mirror deletion: the `./AGENTS.md` mirror (`mirrorGlob`) is deleted
34780
+ * only when the primary `.rovodev/AGENTS.md` (`primaryGlob`) still exists.
34781
+ */
34782
+ static getRootMirrorDeletionGlobs({ outputRoot }) {
34783
+ return {
34784
+ primaryGlob: join(outputRoot, ROVODEV_DIR, ROVODEV_RULE_FILE_NAME),
34785
+ mirrorGlob: join(outputRoot, ROVODEV_RULE_FILE_NAME)
34786
+ };
34787
+ }
34788
+ /** Glob for the `separate-local-file` deletion; rovodev writes it at project root, not under `.rovodev/`. */
34789
+ static getLocalRootDeletionGlob({ outputRoot, fileName }) {
34790
+ return join(outputRoot, fileName);
34791
+ }
34701
34792
  };
34702
34793
  //#endregion
34703
34794
  //#region src/features/rules/takt-rule.ts
@@ -35420,7 +35511,7 @@ var RulesProcessor = class extends FeatureProcessor {
35420
35511
  });
35421
35512
  this.applyRootRuleSections({
35422
35513
  toolRules,
35423
- meta
35514
+ factory
35424
35515
  });
35425
35516
  return [...toolRules, ...extraFiles];
35426
35517
  }
@@ -35482,31 +35573,16 @@ var RulesProcessor = class extends FeatureProcessor {
35482
35573
  * reference and conventions sections to the root rule content. Mutates the
35483
35574
  * root rule in place.
35484
35575
  */
35485
- applyRootRuleSections({ toolRules, meta }) {
35576
+ applyRootRuleSections({ toolRules, factory }) {
35577
+ const { meta } = factory;
35486
35578
  const rootRule = toolRules.find((rule) => rule.isRoot());
35487
35579
  if (!rootRule) return;
35488
35580
  const newContent = this.generateReferenceSectionFromMeta(meta, toolRules) + (!meta.createsSeparateConventionsRule && meta.additionalConventions ? this.generateAdditionalConventionsSectionFromMeta(meta) : "") + rootRule.getFileContent();
35489
35581
  rootRule.setFileContent(newContent);
35490
- if (meta.mirrorsRootToAgentsMd && !this.global) this.mirrorRootRuleToAgentsMd({
35491
- toolRules,
35582
+ if (meta.mirrorsRootToAgentsMd && !this.global && factory.class.getRootMirrorFiles) toolRules.push(...factory.class.getRootMirrorFiles({
35583
+ outputRoot: this.outputRoot,
35492
35584
  rootRule,
35493
35585
  content: newContent
35494
- });
35495
- }
35496
- /**
35497
- * Mirror the primary root rule to a project-root `AGENTS.md` for tools whose
35498
- * primary root lives in a subdirectory (rovodev: `.rovodev/AGENTS.md`).
35499
- */
35500
- mirrorRootRuleToAgentsMd({ toolRules, rootRule, content }) {
35501
- if (!(rootRule instanceof RovodevRule)) return;
35502
- const primary = RovodevRule.getSettablePaths({ global: false }).root;
35503
- if (rootRule.getRelativeDirPath() === primary.relativeDirPath && rootRule.getRelativeFilePath() === primary.relativeFilePath) toolRules.push(new RovodevRule({
35504
- outputRoot: this.outputRoot,
35505
- relativeDirPath: ".",
35506
- relativeFilePath: "AGENTS.md",
35507
- fileContent: content,
35508
- validate: true,
35509
- root: true
35510
35586
  }));
35511
35587
  }
35512
35588
  buildSkillList(skillClass) {
@@ -35732,15 +35808,19 @@ As this project's AI coding tool, you must follow the additional conventions bel
35732
35808
  const localRootToolRules = await (async () => {
35733
35809
  if (!forDeletion || this.global || factory.meta.localRootMode !== "separate-local-file" || !factory.meta.localRootFileName) return [];
35734
35810
  const fileName = factory.meta.localRootFileName;
35735
- if (factory.class === RovodevRule) return buildDeletionRulesFromPaths(await findFilesByGlobs(join(this.outputRoot, fileName)));
35811
+ if (factory.class.getLocalRootDeletionGlob) return buildDeletionRulesFromPaths(await findFilesByGlobs(factory.class.getLocalRootDeletionGlob({
35812
+ outputRoot: this.outputRoot,
35813
+ fileName
35814
+ })));
35736
35815
  if (!settablePaths.root) return [];
35737
35816
  return buildDeletionRulesFromPaths(await findFilesWithFallback(join(this.outputRoot, settablePaths.root.relativeDirPath ?? ".", fileName), settablePaths.alternativeRoots, (alt) => join(this.outputRoot, alt.relativeDirPath, fileName)));
35738
35817
  })();
35739
35818
  this.logger.debug(`Found ${localRootToolRules.length} local root tool rule files for deletion`);
35740
35819
  const rootMirrorDeletionRules = await (async () => {
35741
- if (!forDeletion || this.global || !factory.meta.mirrorsRootToAgentsMd || factory.class !== RovodevRule) return [];
35742
- if ((await findFilesByGlobs(join(this.outputRoot, ".rovodev", "AGENTS.md"))).length === 0) return [];
35743
- return buildDeletionRulesFromPaths(await findFilesByGlobs(join(this.outputRoot, "AGENTS.md")));
35820
+ if (!forDeletion || this.global || !factory.meta.mirrorsRootToAgentsMd || !factory.class.getRootMirrorDeletionGlobs) return [];
35821
+ const { primaryGlob, mirrorGlob } = factory.class.getRootMirrorDeletionGlobs({ outputRoot: this.outputRoot });
35822
+ if ((await findFilesByGlobs(primaryGlob)).length === 0) return [];
35823
+ return buildDeletionRulesFromPaths(await findFilesByGlobs(mirrorGlob));
35744
35824
  })();
35745
35825
  const nonRootToolRules = await (async () => {
35746
35826
  if (!settablePaths.nonRoot) return [];
@@ -36254,22 +36334,29 @@ function resolveExecutionOrder(steps) {
36254
36334
  const GENERATION_STEP_GRAPH = [
36255
36335
  {
36256
36336
  id: "ignore",
36257
- writesSharedFile: ["claude-settings", "zed-settings"]
36337
+ writesSharedFile: [".claude/settings.json", ".zed/settings.json"]
36258
36338
  },
36259
36339
  {
36260
36340
  id: "mcp",
36261
36341
  writesSharedFile: [
36262
- "kilo-opencode-config",
36263
- "zed-settings",
36264
- "qwencode-settings",
36265
- "augmentcode-settings",
36266
- "hermesagent-config",
36267
- "amp-settings",
36268
- "codexcli-config",
36269
- "grokcli-config",
36270
- "vibe-config",
36271
- "devin-config",
36272
- "reasonix-config"
36342
+ ".amp/settings.json",
36343
+ ".augment/settings.json",
36344
+ ".codex/config.toml",
36345
+ ".config/amp/settings.json",
36346
+ ".config/devin/config.json",
36347
+ ".config/opencode/opencode.json",
36348
+ ".config/zed/settings.json",
36349
+ ".devin/config.json",
36350
+ ".grok/config.toml",
36351
+ ".hermes/config.yaml",
36352
+ ".qwen/settings.json",
36353
+ ".reasonix/config.toml",
36354
+ ".takt/config.yaml",
36355
+ ".vibe/config.toml",
36356
+ ".zed/settings.json",
36357
+ "kilo.json",
36358
+ "opencode.json",
36359
+ "reasonix.toml"
36273
36360
  ],
36274
36361
  dependsOn: ["ignore"]
36275
36362
  },
@@ -36279,33 +36366,39 @@ const GENERATION_STEP_GRAPH = [
36279
36366
  {
36280
36367
  id: "hooks",
36281
36368
  writesSharedFile: [
36282
- "claude-settings",
36283
- "qwencode-settings",
36284
- "augmentcode-settings",
36285
- "hermesagent-config",
36286
- "kiro-agent-config",
36287
- "codexcli-config",
36288
- "vibe-config",
36289
- "devin-config"
36369
+ ".augment/settings.json",
36370
+ ".claude/settings.json",
36371
+ ".codex/config.toml",
36372
+ ".config/devin/config.json",
36373
+ ".hermes/config.yaml",
36374
+ ".kiro/agents/default.json",
36375
+ ".qwen/settings.json",
36376
+ ".vibe/config.toml"
36290
36377
  ],
36291
36378
  dependsOn: ["ignore", "mcp"]
36292
36379
  },
36293
36380
  {
36294
36381
  id: "permissions",
36295
36382
  writesSharedFile: [
36296
- "claude-settings",
36297
- "kilo-opencode-config",
36298
- "zed-settings",
36299
- "qwencode-settings",
36300
- "augmentcode-settings",
36301
- "hermesagent-config",
36302
- "kiro-agent-config",
36303
- "amp-settings",
36304
- "codexcli-config",
36305
- "grokcli-config",
36306
- "vibe-config",
36307
- "devin-config",
36308
- "reasonix-config"
36383
+ ".amp/settings.json",
36384
+ ".augment/settings.json",
36385
+ ".claude/settings.json",
36386
+ ".codex/config.toml",
36387
+ ".config/amp/settings.json",
36388
+ ".config/devin/config.json",
36389
+ ".config/opencode/opencode.json",
36390
+ ".config/zed/settings.json",
36391
+ ".devin/config.json",
36392
+ ".grok/config.toml",
36393
+ ".hermes/config.yaml",
36394
+ ".kiro/agents/default.json",
36395
+ ".qwen/settings.json",
36396
+ ".reasonix/config.toml",
36397
+ ".takt/config.yaml",
36398
+ ".vibe/config.toml",
36399
+ ".zed/settings.json",
36400
+ "opencode.json",
36401
+ "reasonix.toml"
36309
36402
  ],
36310
36403
  dependsOn: [
36311
36404
  "ignore",
@@ -36315,7 +36408,7 @@ const GENERATION_STEP_GRAPH = [
36315
36408
  },
36316
36409
  {
36317
36410
  id: "rules",
36318
- writesSharedFile: ["kilo-opencode-config"],
36411
+ writesSharedFile: ["kilo.json", "opencode.json"],
36319
36412
  dependsOn: [
36320
36413
  "mcp",
36321
36414
  "skills",
@@ -37014,4 +37107,4 @@ async function importPermissionsCore(params) {
37014
37107
  //#endregion
37015
37108
  export { CLIError as $, IgnoreProcessor as A, RULESYNC_LOCAL_CONFIG_RELATIVE_FILE_PATH as At, toolCommandFactories as B, RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH as Bt, PermissionsProcessorToolTargetSchema as C, RULESYNC_COMMANDS_RELATIVE_DIR_PATH as Ct, McpProcessorToolTargetSchema as D, RULESYNC_HOOKS_FILE_NAME as Dt, McpProcessor as E, RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH as Et, HooksProcessorToolTargetSchema as F, RULESYNC_PERMISSIONS_FILE_NAME as Ft, CLAUDECODE_SKILLS_DIR_PATH as G, CLAUDECODE_LOCAL_RULE_FILE_NAME as H, formatError as Ht, toolHooksFactories as I, RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH as It, stringifyFrontmatter as J, RulesyncCommand as K, RulesyncHooks as L, RULESYNC_RELATIVE_DIR_PATH as Lt, toolIgnoreFactories as M, RULESYNC_MCP_RELATIVE_FILE_PATH as Mt, RulesyncIgnore as N, RULESYNC_MCP_SCHEMA_URL as Nt, toolMcpFactories as O, RULESYNC_HOOKS_RELATIVE_FILE_PATH as Ot, HooksProcessor as P, RULESYNC_OVERVIEW_FILE_NAME as Pt, JsonLogger as Q, CommandsProcessor as R, RULESYNC_RULES_RELATIVE_DIR_PATH as Rt, PermissionsProcessor as S, RULESYNC_AIIGNORE_RELATIVE_FILE_PATH as St, RulesyncPermissions as T, RULESYNC_CONFIG_SCHEMA_URL as Tt, CLAUDECODE_MEMORIES_DIR_NAME as U, ALL_FEATURES as Ut, CLAUDECODE_DIR as V, RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH as Vt, CLAUDECODE_SETTINGS_LOCAL_FILE_NAME as W, ALL_FEATURES_WITH_WILDCARD as Wt, findControlCharacter as X, ConfigResolver as Y, ConsoleLogger as Z, toolSkillFactories as _, ALL_TOOL_TARGETS as _t, RulesProcessor as a, fileExists as at, RulesyncSkillFrontmatterSchema as b, MAX_FILE_SIZE as bt, RulesyncRule as c, getHomeDirectory as ct, SubagentsProcessorToolTargetSchema as d, readFileContent as dt, ErrorCodes as et, toolSubagentFactories as f, removeDirectory as ft, SkillsProcessorToolTargetSchema as g, writeFileContent as gt, SkillsProcessor as h, toPosixPath as ht, convertFromTool as i, ensureDir as it, IgnoreProcessorToolTargetSchema as j, RULESYNC_MCP_FILE_NAME as jt, RulesyncMcp as k, RULESYNC_IGNORE_RELATIVE_FILE_PATH as kt, RulesyncRuleFrontmatterSchema as l, isSymlink as lt, RulesyncSubagentFrontmatterSchema as m, removeTempDirectory as mt, checkRulesyncDirExists as n, createTempDirectory as nt, RulesProcessorToolTargetSchema as o, findFilesByGlobs as ot, RulesyncSubagent as p, removeFile as pt, RulesyncCommandFrontmatterSchema as q, generate as r, directoryExists as rt, toolRuleFactories as s, getFileSize as st, importFromTool as t, checkPathTraversal as tt, SubagentsProcessor as u, listDirectoryFiles as ut, getLocalSkillDirNames as v, ALL_TOOL_TARGETS_WITH_WILDCARD as vt, toolPermissionsFactories as w, RULESYNC_CONFIG_RELATIVE_FILE_PATH as wt, SKILL_FILE_NAME as x, RULESYNC_AIIGNORE_FILE_NAME as xt, RulesyncSkill as y, ToolTargetSchema as yt, CommandsProcessorToolTargetSchema as z, RULESYNC_SKILLS_RELATIVE_DIR_PATH as zt };
37016
37109
 
37017
- //# sourceMappingURL=import-ylOvQDpE.js.map
37110
+ //# sourceMappingURL=import-BkxwFCDM.js.map