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.
@@ -7169,6 +7169,12 @@ var CodexcliHooks = class CodexcliHooks extends ToolHooks {
7169
7169
  relativeFilePath: CODEXCLI_HOOKS_FILE_NAME
7170
7170
  };
7171
7171
  }
7172
+ static getExtraSharedWritePaths() {
7173
+ return [{
7174
+ relativeDirPath: CODEXCLI_DIR,
7175
+ relativeFilePath: CODEXCLI_MCP_FILE_NAME
7176
+ }];
7177
+ }
7172
7178
  static async fromFile({ outputRoot = process.cwd(), validate = true, global = false }) {
7173
7179
  const paths = CodexcliHooks.getSettablePaths({ global });
7174
7180
  const fileContent = await readFileContentOrNull((0, node_path.join)(outputRoot, paths.relativeDirPath, paths.relativeFilePath)) ?? "{\"hooks\":{}}";
@@ -9759,6 +9765,12 @@ var VibeHooks = class VibeHooks extends ToolHooks {
9759
9765
  relativeFilePath: VIBE_HOOKS_FILE_NAME
9760
9766
  };
9761
9767
  }
9768
+ static getExtraSharedWritePaths() {
9769
+ return [{
9770
+ relativeDirPath: VIBE_DIR,
9771
+ relativeFilePath: VIBE_CONFIG_FILE_NAME
9772
+ }];
9773
+ }
9762
9774
  static async fromFile({ outputRoot = process.cwd(), validate = true, global = false }) {
9763
9775
  const paths = VibeHooks.getSettablePaths({ global });
9764
9776
  const fileContent = await readFileContentOrNull((0, node_path.join)(outputRoot, paths.relativeDirPath, paths.relativeFilePath)) ?? smol_toml.stringify({});
@@ -10477,6 +10489,66 @@ var AugmentcodeIgnore = class AugmentcodeIgnore extends ToolIgnore {
10477
10489
  }
10478
10490
  };
10479
10491
  //#endregion
10492
+ //#region src/features/claudecode-settings-gateway.ts
10493
+ /**
10494
+ * Single owner of the `.claude/settings.json` `permissions` block, which both
10495
+ * `ignore` (writes `Read(...)` into `permissions.deny`) and `permissions`
10496
+ * (writes the whole `allow`/`ask`/`deny`) read-modify-write. The entry format,
10497
+ * the merge, and the cross-feature ownership rule (permissions' explicit `Read`
10498
+ * rules win over ignore-derived `Read` denies) used to be duplicated across both
10499
+ * feature files; they live here once so each feature just states its intent and
10500
+ * never reasons about the other's existence.
10501
+ */
10502
+ const READ_TOOL_NAME = "Read";
10503
+ const isReadDenyEntry = (entry) => entry.startsWith(`${READ_TOOL_NAME}(`) && entry.endsWith(")");
10504
+ const buildReadDenyEntry = (pattern) => `${READ_TOOL_NAME}(${pattern})`;
10505
+ const parsePermissionsBlock = (settings) => {
10506
+ const permissions = settings.permissions ?? {};
10507
+ return {
10508
+ allow: permissions.allow ?? [],
10509
+ ask: permissions.ask ?? [],
10510
+ deny: permissions.deny ?? []
10511
+ };
10512
+ };
10513
+ const withPermissions = (settings, next) => {
10514
+ const permissions = { ...settings.permissions };
10515
+ const assign = (key, values) => {
10516
+ if (values.length > 0) permissions[key] = values;
10517
+ else delete permissions[key];
10518
+ };
10519
+ assign("allow", next.allow);
10520
+ assign("ask", next.ask);
10521
+ assign("deny", next.deny);
10522
+ return {
10523
+ ...settings,
10524
+ permissions
10525
+ };
10526
+ };
10527
+ const applyIgnoreReadDenies = (params) => {
10528
+ const { settings, readDenies } = params;
10529
+ const current = parsePermissionsBlock(settings);
10530
+ const preservedDeny = current.deny.filter((entry) => !isReadDenyEntry(entry) || readDenies.includes(entry));
10531
+ return withPermissions(settings, {
10532
+ allow: current.allow,
10533
+ ask: current.ask,
10534
+ deny: (0, es_toolkit.uniq)([...preservedDeny, ...readDenies].toSorted())
10535
+ });
10536
+ };
10537
+ const applyPermissions = (params) => {
10538
+ const { settings, managedToolNames, toolNameOf, allow, ask, deny, logger } = params;
10539
+ const current = parsePermissionsBlock(settings);
10540
+ const keepUnmanaged = (entries) => entries.filter((entry) => !managedToolNames.has(toolNameOf(entry)));
10541
+ if (logger && managedToolNames.has(READ_TOOL_NAME)) {
10542
+ const overwrittenReadDenies = current.deny.filter((entry) => toolNameOf(entry) === READ_TOOL_NAME);
10543
+ 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.`);
10544
+ }
10545
+ return withPermissions(settings, {
10546
+ allow: (0, es_toolkit.uniq)([...keepUnmanaged(current.allow), ...allow].toSorted()),
10547
+ ask: (0, es_toolkit.uniq)([...keepUnmanaged(current.ask), ...ask].toSorted()),
10548
+ deny: (0, es_toolkit.uniq)([...keepUnmanaged(current.deny), ...deny].toSorted())
10549
+ });
10550
+ };
10551
+ //#endregion
10480
10552
  //#region src/features/ignore/claudecode-ignore.ts
10481
10553
  const DEFAULT_FILE_MODE = "shared";
10482
10554
  /**
@@ -10523,7 +10595,7 @@ var ClaudecodeIgnore = class ClaudecodeIgnore extends ToolIgnore {
10523
10595
  }
10524
10596
  toRulesyncIgnore() {
10525
10597
  const fileContent = this.patterns.map((pattern) => {
10526
- if (pattern.startsWith("Read(") && pattern.endsWith(")")) return pattern.slice(5, -1);
10598
+ if (isReadDenyEntry(pattern)) return pattern.slice(5, -1);
10527
10599
  return pattern;
10528
10600
  }).filter((pattern) => pattern.length > 0).join("\n");
10529
10601
  return new RulesyncIgnore({
@@ -10534,22 +10606,20 @@ var ClaudecodeIgnore = class ClaudecodeIgnore extends ToolIgnore {
10534
10606
  });
10535
10607
  }
10536
10608
  static async fromRulesyncIgnore({ outputRoot = process.cwd(), rulesyncIgnore, options }) {
10537
- const deniedValues = rulesyncIgnore.getFileContent().split(/\r?\n|\r/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((pattern) => `Read(${pattern})`);
10609
+ const deniedValues = rulesyncIgnore.getFileContent().split(/\r?\n|\r/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((pattern) => buildReadDenyEntry(pattern));
10538
10610
  const paths = this.getSettablePaths({ options });
10539
10611
  const filePath = (0, node_path.join)(outputRoot, paths.relativeDirPath, paths.relativeFilePath);
10540
10612
  const existingFileContent = await fileExists(filePath) ? await readFileContent(filePath) : "{}";
10541
- const existingJsonValue = JSON.parse(existingFileContent);
10542
- const preservedDenies = (existingJsonValue.permissions?.deny ?? []).filter((deny) => {
10543
- if (deny.startsWith("Read(") && deny.endsWith(")")) return deniedValues.includes(deny);
10544
- return true;
10613
+ let existingJsonValue;
10614
+ try {
10615
+ existingJsonValue = JSON.parse(existingFileContent);
10616
+ } catch (error) {
10617
+ throw new Error(`Failed to parse existing Claude settings at ${filePath}: ${formatError(error)}`, { cause: error });
10618
+ }
10619
+ const jsonValue = applyIgnoreReadDenies({
10620
+ settings: existingJsonValue,
10621
+ readDenies: deniedValues
10545
10622
  });
10546
- const jsonValue = {
10547
- ...existingJsonValue,
10548
- permissions: {
10549
- ...existingJsonValue.permissions,
10550
- deny: (0, es_toolkit.uniq)([...preservedDenies, ...deniedValues].toSorted())
10551
- }
10552
- };
10553
10623
  return new ClaudecodeIgnore({
10554
10624
  outputRoot,
10555
10625
  relativeDirPath: paths.relativeDirPath,
@@ -17086,31 +17156,15 @@ var ClaudecodePermissions = class ClaudecodePermissions extends ToolPermissions
17086
17156
  const config = rulesyncPermissions.getJson();
17087
17157
  const { allow, ask, deny } = convertRulesyncToClaudePermissions(config);
17088
17158
  const managedToolNames = new Set(Object.keys(config.permission).map((category) => toClaudeToolName(category)));
17089
- const existingPermissions = settings.permissions ?? {};
17090
- const preservedAllow = (existingPermissions.allow ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17091
- const preservedAsk = (existingPermissions.ask ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17092
- const preservedDeny = (existingPermissions.deny ?? []).filter((entry) => !managedToolNames.has(parseClaudePermissionEntry(entry).toolName));
17093
- if (logger && managedToolNames.has("Read")) {
17094
- const droppedReadDenyEntries = (existingPermissions.deny ?? []).filter((entry) => {
17095
- const { toolName } = parseClaudePermissionEntry(entry);
17096
- return toolName === "Read";
17097
- });
17098
- 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.`);
17099
- }
17100
- const mergedPermissions = { ...existingPermissions };
17101
- const mergedAllow = (0, es_toolkit.uniq)([...preservedAllow, ...allow].toSorted());
17102
- const mergedAsk = (0, es_toolkit.uniq)([...preservedAsk, ...ask].toSorted());
17103
- const mergedDeny = (0, es_toolkit.uniq)([...preservedDeny, ...deny].toSorted());
17104
- if (mergedAllow.length > 0) mergedPermissions.allow = mergedAllow;
17105
- else delete mergedPermissions.allow;
17106
- if (mergedAsk.length > 0) mergedPermissions.ask = mergedAsk;
17107
- else delete mergedPermissions.ask;
17108
- if (mergedDeny.length > 0) mergedPermissions.deny = mergedDeny;
17109
- else delete mergedPermissions.deny;
17110
- const merged = {
17111
- ...settings,
17112
- permissions: mergedPermissions
17113
- };
17159
+ const merged = applyPermissions({
17160
+ settings,
17161
+ managedToolNames,
17162
+ toolNameOf: (entry) => parseClaudePermissionEntry(entry).toolName,
17163
+ allow,
17164
+ ask,
17165
+ deny,
17166
+ logger
17167
+ });
17114
17168
  const fileContent = JSON.stringify(merged, null, 2);
17115
17169
  return new ClaudecodePermissions({
17116
17170
  outputRoot,
@@ -33788,6 +33842,9 @@ var KiloRule = class KiloRule extends ToolRule {
33788
33842
  nonRoot: { relativeDirPath: buildToolPath(KILO_DIR, KILO_RULES_DIR_NAME, excludeToolDir) }
33789
33843
  };
33790
33844
  }
33845
+ static getExtraSharedWritePaths({ global = false } = {}) {
33846
+ return global ? [] : [KiloMcp.getSettablePaths({ global: false })];
33847
+ }
33791
33848
  static async fromFile({ outputRoot = process.cwd(), relativeFilePath, validate = true, global = false }) {
33792
33849
  const paths = this.getSettablePaths({ global });
33793
33850
  if (relativeFilePath === paths.root.relativeFilePath) {
@@ -34049,6 +34106,9 @@ var OpenCodeRule = class OpenCodeRule extends ToolRule {
34049
34106
  nonRoot: { relativeDirPath: buildToolPath(OPENCODE_DIR, "memories", excludeToolDir) }
34050
34107
  };
34051
34108
  }
34109
+ static getExtraSharedWritePaths({ global = false } = {}) {
34110
+ return global ? [] : [OpencodeMcp.getSettablePaths({ global: false })];
34111
+ }
34052
34112
  static async fromFile({ outputRoot = process.cwd(), relativeFilePath, validate = true, global = false }) {
34053
34113
  const paths = this.getSettablePaths({ global });
34054
34114
  if (relativeFilePath === paths.root.relativeFilePath) {
@@ -34725,6 +34785,37 @@ var RovodevRule = class RovodevRule extends ToolRule {
34725
34785
  toolTarget: "rovodev"
34726
34786
  });
34727
34787
  }
34788
+ /**
34789
+ * Mirror the primary `.rovodev/AGENTS.md` root rule to `./AGENTS.md` so project
34790
+ * memory stays discoverable at the repo root. Empty when `rootRule` is not the primary root.
34791
+ */
34792
+ static getRootMirrorFiles({ outputRoot, rootRule, content }) {
34793
+ if (!(rootRule instanceof RovodevRule)) return [];
34794
+ const primary = this.getSettablePaths({ global: false }).root;
34795
+ if (rootRule.getRelativeDirPath() !== primary.relativeDirPath || rootRule.getRelativeFilePath() !== primary.relativeFilePath) return [];
34796
+ return [new RovodevRule({
34797
+ outputRoot,
34798
+ relativeDirPath: ".",
34799
+ relativeFilePath: ROVODEV_RULE_FILE_NAME,
34800
+ fileContent: content,
34801
+ validate: true,
34802
+ root: true
34803
+ })];
34804
+ }
34805
+ /**
34806
+ * Globs for mirror deletion: the `./AGENTS.md` mirror (`mirrorGlob`) is deleted
34807
+ * only when the primary `.rovodev/AGENTS.md` (`primaryGlob`) still exists.
34808
+ */
34809
+ static getRootMirrorDeletionGlobs({ outputRoot }) {
34810
+ return {
34811
+ primaryGlob: (0, node_path.join)(outputRoot, ROVODEV_DIR, ROVODEV_RULE_FILE_NAME),
34812
+ mirrorGlob: (0, node_path.join)(outputRoot, ROVODEV_RULE_FILE_NAME)
34813
+ };
34814
+ }
34815
+ /** Glob for the `separate-local-file` deletion; rovodev writes it at project root, not under `.rovodev/`. */
34816
+ static getLocalRootDeletionGlob({ outputRoot, fileName }) {
34817
+ return (0, node_path.join)(outputRoot, fileName);
34818
+ }
34728
34819
  };
34729
34820
  //#endregion
34730
34821
  //#region src/features/rules/takt-rule.ts
@@ -35447,7 +35538,7 @@ var RulesProcessor = class extends FeatureProcessor {
35447
35538
  });
35448
35539
  this.applyRootRuleSections({
35449
35540
  toolRules,
35450
- meta
35541
+ factory
35451
35542
  });
35452
35543
  return [...toolRules, ...extraFiles];
35453
35544
  }
@@ -35509,31 +35600,16 @@ var RulesProcessor = class extends FeatureProcessor {
35509
35600
  * reference and conventions sections to the root rule content. Mutates the
35510
35601
  * root rule in place.
35511
35602
  */
35512
- applyRootRuleSections({ toolRules, meta }) {
35603
+ applyRootRuleSections({ toolRules, factory }) {
35604
+ const { meta } = factory;
35513
35605
  const rootRule = toolRules.find((rule) => rule.isRoot());
35514
35606
  if (!rootRule) return;
35515
35607
  const newContent = this.generateReferenceSectionFromMeta(meta, toolRules) + (!meta.createsSeparateConventionsRule && meta.additionalConventions ? this.generateAdditionalConventionsSectionFromMeta(meta) : "") + rootRule.getFileContent();
35516
35608
  rootRule.setFileContent(newContent);
35517
- if (meta.mirrorsRootToAgentsMd && !this.global) this.mirrorRootRuleToAgentsMd({
35518
- toolRules,
35609
+ if (meta.mirrorsRootToAgentsMd && !this.global && factory.class.getRootMirrorFiles) toolRules.push(...factory.class.getRootMirrorFiles({
35610
+ outputRoot: this.outputRoot,
35519
35611
  rootRule,
35520
35612
  content: newContent
35521
- });
35522
- }
35523
- /**
35524
- * Mirror the primary root rule to a project-root `AGENTS.md` for tools whose
35525
- * primary root lives in a subdirectory (rovodev: `.rovodev/AGENTS.md`).
35526
- */
35527
- mirrorRootRuleToAgentsMd({ toolRules, rootRule, content }) {
35528
- if (!(rootRule instanceof RovodevRule)) return;
35529
- const primary = RovodevRule.getSettablePaths({ global: false }).root;
35530
- if (rootRule.getRelativeDirPath() === primary.relativeDirPath && rootRule.getRelativeFilePath() === primary.relativeFilePath) toolRules.push(new RovodevRule({
35531
- outputRoot: this.outputRoot,
35532
- relativeDirPath: ".",
35533
- relativeFilePath: "AGENTS.md",
35534
- fileContent: content,
35535
- validate: true,
35536
- root: true
35537
35613
  }));
35538
35614
  }
35539
35615
  buildSkillList(skillClass) {
@@ -35759,15 +35835,19 @@ As this project's AI coding tool, you must follow the additional conventions bel
35759
35835
  const localRootToolRules = await (async () => {
35760
35836
  if (!forDeletion || this.global || factory.meta.localRootMode !== "separate-local-file" || !factory.meta.localRootFileName) return [];
35761
35837
  const fileName = factory.meta.localRootFileName;
35762
- if (factory.class === RovodevRule) return buildDeletionRulesFromPaths(await findFilesByGlobs((0, node_path.join)(this.outputRoot, fileName)));
35838
+ if (factory.class.getLocalRootDeletionGlob) return buildDeletionRulesFromPaths(await findFilesByGlobs(factory.class.getLocalRootDeletionGlob({
35839
+ outputRoot: this.outputRoot,
35840
+ fileName
35841
+ })));
35763
35842
  if (!settablePaths.root) return [];
35764
35843
  return buildDeletionRulesFromPaths(await findFilesWithFallback((0, node_path.join)(this.outputRoot, settablePaths.root.relativeDirPath ?? ".", fileName), settablePaths.alternativeRoots, (alt) => (0, node_path.join)(this.outputRoot, alt.relativeDirPath, fileName)));
35765
35844
  })();
35766
35845
  this.logger.debug(`Found ${localRootToolRules.length} local root tool rule files for deletion`);
35767
35846
  const rootMirrorDeletionRules = await (async () => {
35768
- if (!forDeletion || this.global || !factory.meta.mirrorsRootToAgentsMd || factory.class !== RovodevRule) return [];
35769
- if ((await findFilesByGlobs((0, node_path.join)(this.outputRoot, ".rovodev", "AGENTS.md"))).length === 0) return [];
35770
- return buildDeletionRulesFromPaths(await findFilesByGlobs((0, node_path.join)(this.outputRoot, "AGENTS.md")));
35847
+ if (!forDeletion || this.global || !factory.meta.mirrorsRootToAgentsMd || !factory.class.getRootMirrorDeletionGlobs) return [];
35848
+ const { primaryGlob, mirrorGlob } = factory.class.getRootMirrorDeletionGlobs({ outputRoot: this.outputRoot });
35849
+ if ((await findFilesByGlobs(primaryGlob)).length === 0) return [];
35850
+ return buildDeletionRulesFromPaths(await findFilesByGlobs(mirrorGlob));
35771
35851
  })();
35772
35852
  const nonRootToolRules = await (async () => {
35773
35853
  if (!settablePaths.nonRoot) return [];
@@ -36281,22 +36361,29 @@ function resolveExecutionOrder(steps) {
36281
36361
  const GENERATION_STEP_GRAPH = [
36282
36362
  {
36283
36363
  id: "ignore",
36284
- writesSharedFile: ["claude-settings", "zed-settings"]
36364
+ writesSharedFile: [".claude/settings.json", ".zed/settings.json"]
36285
36365
  },
36286
36366
  {
36287
36367
  id: "mcp",
36288
36368
  writesSharedFile: [
36289
- "kilo-opencode-config",
36290
- "zed-settings",
36291
- "qwencode-settings",
36292
- "augmentcode-settings",
36293
- "hermesagent-config",
36294
- "amp-settings",
36295
- "codexcli-config",
36296
- "grokcli-config",
36297
- "vibe-config",
36298
- "devin-config",
36299
- "reasonix-config"
36369
+ ".amp/settings.json",
36370
+ ".augment/settings.json",
36371
+ ".codex/config.toml",
36372
+ ".config/amp/settings.json",
36373
+ ".config/devin/config.json",
36374
+ ".config/opencode/opencode.json",
36375
+ ".config/zed/settings.json",
36376
+ ".devin/config.json",
36377
+ ".grok/config.toml",
36378
+ ".hermes/config.yaml",
36379
+ ".qwen/settings.json",
36380
+ ".reasonix/config.toml",
36381
+ ".takt/config.yaml",
36382
+ ".vibe/config.toml",
36383
+ ".zed/settings.json",
36384
+ "kilo.json",
36385
+ "opencode.json",
36386
+ "reasonix.toml"
36300
36387
  ],
36301
36388
  dependsOn: ["ignore"]
36302
36389
  },
@@ -36306,33 +36393,39 @@ const GENERATION_STEP_GRAPH = [
36306
36393
  {
36307
36394
  id: "hooks",
36308
36395
  writesSharedFile: [
36309
- "claude-settings",
36310
- "qwencode-settings",
36311
- "augmentcode-settings",
36312
- "hermesagent-config",
36313
- "kiro-agent-config",
36314
- "codexcli-config",
36315
- "vibe-config",
36316
- "devin-config"
36396
+ ".augment/settings.json",
36397
+ ".claude/settings.json",
36398
+ ".codex/config.toml",
36399
+ ".config/devin/config.json",
36400
+ ".hermes/config.yaml",
36401
+ ".kiro/agents/default.json",
36402
+ ".qwen/settings.json",
36403
+ ".vibe/config.toml"
36317
36404
  ],
36318
36405
  dependsOn: ["ignore", "mcp"]
36319
36406
  },
36320
36407
  {
36321
36408
  id: "permissions",
36322
36409
  writesSharedFile: [
36323
- "claude-settings",
36324
- "kilo-opencode-config",
36325
- "zed-settings",
36326
- "qwencode-settings",
36327
- "augmentcode-settings",
36328
- "hermesagent-config",
36329
- "kiro-agent-config",
36330
- "amp-settings",
36331
- "codexcli-config",
36332
- "grokcli-config",
36333
- "vibe-config",
36334
- "devin-config",
36335
- "reasonix-config"
36410
+ ".amp/settings.json",
36411
+ ".augment/settings.json",
36412
+ ".claude/settings.json",
36413
+ ".codex/config.toml",
36414
+ ".config/amp/settings.json",
36415
+ ".config/devin/config.json",
36416
+ ".config/opencode/opencode.json",
36417
+ ".config/zed/settings.json",
36418
+ ".devin/config.json",
36419
+ ".grok/config.toml",
36420
+ ".hermes/config.yaml",
36421
+ ".kiro/agents/default.json",
36422
+ ".qwen/settings.json",
36423
+ ".reasonix/config.toml",
36424
+ ".takt/config.yaml",
36425
+ ".vibe/config.toml",
36426
+ ".zed/settings.json",
36427
+ "opencode.json",
36428
+ "reasonix.toml"
36336
36429
  ],
36337
36430
  dependsOn: [
36338
36431
  "ignore",
@@ -36342,7 +36435,7 @@ const GENERATION_STEP_GRAPH = [
36342
36435
  },
36343
36436
  {
36344
36437
  id: "rules",
36345
- writesSharedFile: ["kilo-opencode-config"],
36438
+ writesSharedFile: ["kilo.json", "opencode.json"],
36346
36439
  dependsOn: [
36347
36440
  "mcp",
36348
36441
  "skills",
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_import = require("./import-CNtfs80W.cjs");
2
+ const require_import = require("./import-H0MKtu9x.cjs");
3
3
  //#region src/index.ts
4
4
  async function generate(options = {}) {
5
5
  const { silent = true, verbose = false, ...rest } = options;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Ut as ALL_FEATURES, Y as ConfigResolver, Z as ConsoleLogger, _t as ALL_TOOL_TARGETS, i as convertFromTool$1, n as checkRulesyncDirExists, r as generate$1, t as importFromTool$1 } from "./import-ylOvQDpE.js";
1
+ import { Ut as ALL_FEATURES, Y as ConfigResolver, Z as ConsoleLogger, _t as ALL_TOOL_TARGETS, i as convertFromTool$1, n as checkRulesyncDirExists, r as generate$1, t as importFromTool$1 } from "./import-BkxwFCDM.js";
2
2
  //#region src/index.ts
3
3
  async function generate(options = {}) {
4
4
  const { silent = true, verbose = false, ...rest } = options;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rulesync",
3
- "version": "9.1.0",
3
+ "version": "9.2.0",
4
4
  "description": "Unified AI rules management CLI tool that generates configuration files for various AI development tools",
5
5
  "keywords": [
6
6
  "ai",
@@ -54,33 +54,33 @@
54
54
  "@toon-format/toon": "2.3.0",
55
55
  "@valibot/to-json-schema": "1.7.1",
56
56
  "commander": "15.0.0",
57
- "effect": "3.21.3",
58
- "es-toolkit": "1.47.1",
59
- "fastmcp": "4.3.0",
57
+ "effect": "3.21.4",
58
+ "es-toolkit": "1.49.0",
59
+ "fastmcp": "4.3.2",
60
60
  "globby": "16.2.0",
61
61
  "gray-matter": "4.0.3",
62
62
  "js-yaml": "4.2.0",
63
63
  "jsonc-parser": "3.3.1",
64
- "smol-toml": "1.6.1",
64
+ "smol-toml": "1.7.0",
65
65
  "sury": "10.0.4",
66
66
  "zod": "4.4.3"
67
67
  },
68
68
  "devDependencies": {
69
- "@anthropic-ai/claude-agent-sdk": "0.3.181",
70
- "@openrouter/sdk": "0.13.7",
69
+ "@anthropic-ai/claude-agent-sdk": "0.3.198",
70
+ "@openrouter/sdk": "0.13.22",
71
71
  "@secretlint/secretlint-rule-preset-recommend": "13.0.2",
72
72
  "@tsconfig/node24": "24.0.4",
73
73
  "@types/js-yaml": "4.0.9",
74
- "@types/node": "25.9.3",
75
- "@typescript/native-preview": "7.0.0-dev.20260617.2",
74
+ "@types/node": "26.1.0",
75
+ "@typescript/native-preview": "7.0.0-dev.20260701.1",
76
76
  "@vitest/coverage-v8": "4.1.9",
77
77
  "cspell": "10.0.1",
78
- "knip": "6.17.1",
79
- "lint-staged": "17.0.7",
80
- "oxfmt": "0.55.0",
81
- "oxlint": "1.70.0",
82
- "repomix": "1.14.1",
83
- "resend": "6.14.0",
78
+ "knip": "6.23.0",
79
+ "lint-staged": "17.0.8",
80
+ "oxfmt": "0.57.0",
81
+ "oxlint": "1.72.0",
82
+ "repomix": "1.16.0",
83
+ "resend": "6.16.0",
84
84
  "secretlint": "13.0.2",
85
85
  "simple-git": "3.36.0",
86
86
  "simple-git-hooks": "2.13.1",
@@ -88,7 +88,7 @@
88
88
  "tsdown": "0.22.3",
89
89
  "tsx": "4.22.4",
90
90
  "typescript": "6.0.3",
91
- "vite": "8.0.16",
91
+ "vite": "8.1.2",
92
92
  "vitepress": "1.6.4",
93
93
  "vitest": "4.1.9"
94
94
  },