rulesync 7.21.0 → 7.22.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
@@ -67,13 +67,13 @@ See [Quick Start guide](https://dyoshikawa.github.io/rulesync/getting-started/qu
67
67
  | AGENTS.md | agentsmd | ✅ | | | 🎮 | 🎮 | 🎮 | |
68
68
  | AgentsSkills | agentsskills | | | | | | ✅ | |
69
69
  | Claude Code | claudecode | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 |
70
- | Codex CLI | codexcli | ✅ 🌏 | | ✅ 🌏 🔧 | 🌏 | | ✅ 🌏 | |
70
+ | Codex CLI | codexcli | ✅ 🌏 | | ✅ 🌏 🔧 | 🌏 | 🌏 | ✅ 🌏 | |
71
71
  | Gemini CLI | geminicli | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | 🎮 | ✅ 🌏 | ✅ 🌏 |
72
72
  | Goose | goose | ✅ 🌏 | ✅ | | | | | |
73
73
  | GitHub Copilot | copilot | ✅ 🌏 | | ✅ | ✅ | ✅ | ✅ | ✅ |
74
74
  | GitHub Copilot CLI | copilotcli | | | ✅ 🌏 | | | | |
75
75
  | Cursor | cursor | ✅ | ✅ | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ |
76
- | Factory Droid | factorydroid | ✅ 🌏 | | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 |
76
+ | Factory Droid | factorydroid | ✅ 🌏 | | ✅ 🌏 | 🎮 | 🎮 | 🎮 | ✅ 🌏 |
77
77
  | OpenCode | opencode | ✅ 🌏 | | ✅ 🌏 🔧 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 |
78
78
  | Cline | cline | ✅ | ✅ | ✅ | ✅ 🌏 | | ✅ 🌏 | |
79
79
  | Kilo Code | kilo | ✅ 🌏 | ✅ | ✅ | ✅ 🌏 | | ✅ 🌏 | |
@@ -24,7 +24,8 @@ var ALL_FEATURES = [
24
24
  "subagents",
25
25
  "commands",
26
26
  "skills",
27
- "hooks"
27
+ "hooks",
28
+ "permissions"
28
29
  ];
29
30
  var ALL_FEATURES_WITH_WILDCARD = [...ALL_FEATURES, "*"];
30
31
  var FeatureSchema = z.enum(ALL_FEATURES);
@@ -82,6 +83,10 @@ var RULESYNC_COMMANDS_RELATIVE_DIR_PATH = join(RULESYNC_RELATIVE_DIR_PATH, "comm
82
83
  var RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH = join(RULESYNC_RELATIVE_DIR_PATH, "subagents");
83
84
  var RULESYNC_MCP_RELATIVE_FILE_PATH = join(RULESYNC_RELATIVE_DIR_PATH, "mcp.json");
84
85
  var RULESYNC_HOOKS_RELATIVE_FILE_PATH = join(RULESYNC_RELATIVE_DIR_PATH, "hooks.json");
86
+ var RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH = join(
87
+ RULESYNC_RELATIVE_DIR_PATH,
88
+ "permissions.json"
89
+ );
85
90
  var RULESYNC_AIIGNORE_FILE_NAME = ".aiignore";
86
91
  var RULESYNC_AIIGNORE_RELATIVE_FILE_PATH = join(RULESYNC_RELATIVE_DIR_PATH, ".aiignore");
87
92
  var RULESYNC_IGNORE_RELATIVE_FILE_PATH = ".rulesyncignore";
@@ -94,6 +99,7 @@ var RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH = join(
94
99
  var RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH = "rulesync.lock";
95
100
  var RULESYNC_MCP_FILE_NAME = "mcp.json";
96
101
  var RULESYNC_HOOKS_FILE_NAME = "hooks.json";
102
+ var RULESYNC_PERMISSIONS_FILE_NAME = "permissions.json";
97
103
  var RULESYNC_CONFIG_SCHEMA_URL = "https://github.com/dyoshikawa/rulesync/releases/latest/download/config-schema.json";
98
104
  var RULESYNC_MCP_SCHEMA_URL = "https://github.com/dyoshikawa/rulesync/releases/latest/download/mcp-schema.json";
99
105
  var MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -2917,7 +2923,7 @@ var toolCommandFactories = /* @__PURE__ */ new Map([
2917
2923
  meta: {
2918
2924
  extension: "md",
2919
2925
  supportsProject: true,
2920
- supportsGlobal: true,
2926
+ supportsGlobal: false,
2921
2927
  isSimulated: true,
2922
2928
  supportsSubdirectory: false
2923
2929
  }
@@ -10988,7 +10994,7 @@ var toolSkillFactories = /* @__PURE__ */ new Map([
10988
10994
  "factorydroid",
10989
10995
  {
10990
10996
  class: FactorydroidSkill,
10991
- meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: true }
10997
+ meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: false }
10992
10998
  }
10993
10999
  ],
10994
11000
  [
@@ -12751,7 +12757,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12751
12757
  "codexcli",
12752
12758
  {
12753
12759
  class: CodexCliSubagent,
12754
- meta: { supportsSimulated: false, supportsGlobal: false, filePattern: "*.toml" }
12760
+ meta: { supportsSimulated: false, supportsGlobal: true, filePattern: "*.toml" }
12755
12761
  }
12756
12762
  ],
12757
12763
  [
@@ -12772,7 +12778,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12772
12778
  "factorydroid",
12773
12779
  {
12774
12780
  class: FactorydroidSubagent,
12775
- meta: { supportsSimulated: true, supportsGlobal: true, filePattern: "*.md" }
12781
+ meta: { supportsSimulated: true, supportsGlobal: false, filePattern: "*.md" }
12776
12782
  }
12777
12783
  ],
12778
12784
  [
@@ -16709,11 +16715,23 @@ async function processEmptyFeatureGeneration(params) {
16709
16715
  }
16710
16716
  return { count: totalCount, paths: [], hasDiff };
16711
16717
  }
16718
+ var SIMULATE_OPTION_MAP = {
16719
+ commands: "--simulate-commands",
16720
+ subagents: "--simulate-subagents",
16721
+ skills: "--simulate-skills"
16722
+ };
16712
16723
  function warnUnsupportedTargets(params) {
16713
- const { config, supportedTargets, featureName, logger } = params;
16724
+ const { config, supportedTargets, simulatedTargets = [], featureName, logger } = params;
16714
16725
  for (const target of config.getTargets()) {
16715
16726
  if (!supportedTargets.includes(target) && config.getFeatures(target).includes(featureName)) {
16716
- logger.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
16727
+ const simulateOption = SIMULATE_OPTION_MAP[featureName];
16728
+ if (simulateOption && simulatedTargets.includes(target)) {
16729
+ logger.warn(
16730
+ `Target '${target}' only supports simulated '${featureName}'. Use '${simulateOption}' to enable it. Skipping.`
16731
+ );
16732
+ } else {
16733
+ logger.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
16734
+ }
16717
16735
  }
16718
16736
  }
16719
16737
  }
@@ -16894,6 +16912,7 @@ async function generateCommandsCore(params) {
16894
16912
  warnUnsupportedTargets({
16895
16913
  config,
16896
16914
  supportedTargets: supportedCommandsTargets,
16915
+ simulatedTargets: CommandsProcessor.getToolTargetsSimulated(),
16897
16916
  featureName: "commands",
16898
16917
  logger
16899
16918
  });
@@ -16936,6 +16955,7 @@ async function generateSubagentsCore(params) {
16936
16955
  warnUnsupportedTargets({
16937
16956
  config,
16938
16957
  supportedTargets: supportedSubagentsTargets,
16958
+ simulatedTargets: SubagentsProcessor.getToolTargetsSimulated(),
16939
16959
  featureName: "subagents",
16940
16960
  logger
16941
16961
  });
@@ -16979,6 +16999,7 @@ async function generateSkillsCore(params) {
16979
16999
  warnUnsupportedTargets({
16980
17000
  config,
16981
17001
  supportedTargets: supportedSkillsTargets,
17002
+ simulatedTargets: SkillsProcessor.getToolTargetsSimulated(),
16982
17003
  featureName: "skills",
16983
17004
  logger
16984
17005
  });
@@ -17474,6 +17495,7 @@ export {
17474
17495
  RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH,
17475
17496
  RULESYNC_MCP_FILE_NAME,
17476
17497
  RULESYNC_HOOKS_FILE_NAME,
17498
+ RULESYNC_PERMISSIONS_FILE_NAME,
17477
17499
  RULESYNC_CONFIG_SCHEMA_URL,
17478
17500
  RULESYNC_MCP_SCHEMA_URL,
17479
17501
  MAX_FILE_SIZE,
@@ -35,7 +35,8 @@ var ALL_FEATURES = [
35
35
  "subagents",
36
36
  "commands",
37
37
  "skills",
38
- "hooks"
38
+ "hooks",
39
+ "permissions"
39
40
  ];
40
41
  var ALL_FEATURES_WITH_WILDCARD = [...ALL_FEATURES, "*"];
41
42
  var FeatureSchema = import_mini.z.enum(ALL_FEATURES);
@@ -79,6 +80,10 @@ var RULESYNC_COMMANDS_RELATIVE_DIR_PATH = (0, import_node_path.join)(RULESYNC_RE
79
80
  var RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "subagents");
80
81
  var RULESYNC_MCP_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "mcp.json");
81
82
  var RULESYNC_HOOKS_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "hooks.json");
83
+ var RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH = (0, import_node_path.join)(
84
+ RULESYNC_RELATIVE_DIR_PATH,
85
+ "permissions.json"
86
+ );
82
87
  var RULESYNC_AIIGNORE_FILE_NAME = ".aiignore";
83
88
  var RULESYNC_AIIGNORE_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, ".aiignore");
84
89
  var RULESYNC_IGNORE_RELATIVE_FILE_PATH = ".rulesyncignore";
@@ -91,6 +96,7 @@ var RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH = (0, import_node_path.join)(
91
96
  var RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH = "rulesync.lock";
92
97
  var RULESYNC_MCP_FILE_NAME = "mcp.json";
93
98
  var RULESYNC_HOOKS_FILE_NAME = "hooks.json";
99
+ var RULESYNC_PERMISSIONS_FILE_NAME = "permissions.json";
94
100
  var RULESYNC_CONFIG_SCHEMA_URL = "https://github.com/dyoshikawa/rulesync/releases/latest/download/config-schema.json";
95
101
  var RULESYNC_MCP_SCHEMA_URL = "https://github.com/dyoshikawa/rulesync/releases/latest/download/mcp-schema.json";
96
102
  var MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -2626,7 +2632,7 @@ var toolCommandFactories = /* @__PURE__ */ new Map([
2626
2632
  meta: {
2627
2633
  extension: "md",
2628
2634
  supportsProject: true,
2629
- supportsGlobal: true,
2635
+ supportsGlobal: false,
2630
2636
  isSimulated: true,
2631
2637
  supportsSubdirectory: false
2632
2638
  }
@@ -10697,7 +10703,7 @@ var toolSkillFactories = /* @__PURE__ */ new Map([
10697
10703
  "factorydroid",
10698
10704
  {
10699
10705
  class: FactorydroidSkill,
10700
- meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: true }
10706
+ meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: false }
10701
10707
  }
10702
10708
  ],
10703
10709
  [
@@ -12460,7 +12466,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12460
12466
  "codexcli",
12461
12467
  {
12462
12468
  class: CodexCliSubagent,
12463
- meta: { supportsSimulated: false, supportsGlobal: false, filePattern: "*.toml" }
12469
+ meta: { supportsSimulated: false, supportsGlobal: true, filePattern: "*.toml" }
12464
12470
  }
12465
12471
  ],
12466
12472
  [
@@ -12481,7 +12487,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12481
12487
  "factorydroid",
12482
12488
  {
12483
12489
  class: FactorydroidSubagent,
12484
- meta: { supportsSimulated: true, supportsGlobal: true, filePattern: "*.md" }
12490
+ meta: { supportsSimulated: true, supportsGlobal: false, filePattern: "*.md" }
12485
12491
  }
12486
12492
  ],
12487
12493
  [
@@ -16830,7 +16836,8 @@ var FEATURE_PATHS = {
16830
16836
  skills: ["skills"],
16831
16837
  ignore: [RULESYNC_AIIGNORE_FILE_NAME],
16832
16838
  mcp: [RULESYNC_MCP_FILE_NAME],
16833
- hooks: [RULESYNC_HOOKS_FILE_NAME]
16839
+ hooks: [RULESYNC_HOOKS_FILE_NAME],
16840
+ permissions: [RULESYNC_PERMISSIONS_FILE_NAME]
16834
16841
  };
16835
16842
  function isToolTarget(target) {
16836
16843
  return target !== "rulesync";
@@ -17710,11 +17717,23 @@ async function processEmptyFeatureGeneration(params) {
17710
17717
  }
17711
17718
  return { count: totalCount, paths: [], hasDiff };
17712
17719
  }
17720
+ var SIMULATE_OPTION_MAP = {
17721
+ commands: "--simulate-commands",
17722
+ subagents: "--simulate-subagents",
17723
+ skills: "--simulate-skills"
17724
+ };
17713
17725
  function warnUnsupportedTargets(params) {
17714
- const { config, supportedTargets, featureName, logger: logger5 } = params;
17726
+ const { config, supportedTargets, simulatedTargets = [], featureName, logger: logger5 } = params;
17715
17727
  for (const target of config.getTargets()) {
17716
17728
  if (!supportedTargets.includes(target) && config.getFeatures(target).includes(featureName)) {
17717
- logger5.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
17729
+ const simulateOption = SIMULATE_OPTION_MAP[featureName];
17730
+ if (simulateOption && simulatedTargets.includes(target)) {
17731
+ logger5.warn(
17732
+ `Target '${target}' only supports simulated '${featureName}'. Use '${simulateOption}' to enable it. Skipping.`
17733
+ );
17734
+ } else {
17735
+ logger5.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
17736
+ }
17718
17737
  }
17719
17738
  }
17720
17739
  }
@@ -17895,6 +17914,7 @@ async function generateCommandsCore(params) {
17895
17914
  warnUnsupportedTargets({
17896
17915
  config,
17897
17916
  supportedTargets: supportedCommandsTargets,
17917
+ simulatedTargets: CommandsProcessor.getToolTargetsSimulated(),
17898
17918
  featureName: "commands",
17899
17919
  logger: logger5
17900
17920
  });
@@ -17937,6 +17957,7 @@ async function generateSubagentsCore(params) {
17937
17957
  warnUnsupportedTargets({
17938
17958
  config,
17939
17959
  supportedTargets: supportedSubagentsTargets,
17960
+ simulatedTargets: SubagentsProcessor.getToolTargetsSimulated(),
17940
17961
  featureName: "subagents",
17941
17962
  logger: logger5
17942
17963
  });
@@ -17980,6 +18001,7 @@ async function generateSkillsCore(params) {
17980
18001
  warnUnsupportedTargets({
17981
18002
  config,
17982
18003
  supportedTargets: supportedSkillsTargets,
18004
+ simulatedTargets: SkillsProcessor.getToolTargetsSimulated(),
17983
18005
  featureName: "skills",
17984
18006
  logger: logger5
17985
18007
  });
@@ -21781,7 +21803,7 @@ function wrapCommand({
21781
21803
  }
21782
21804
 
21783
21805
  // src/cli/index.ts
21784
- var getVersion = () => "7.21.0";
21806
+ var getVersion = () => "7.22.0";
21785
21807
  function wrapCommand2(name, errorCode, handler) {
21786
21808
  return wrapCommand({ name, errorCode, handler, getVersion });
21787
21809
  }
package/dist/cli/index.js CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  RULESYNC_MCP_RELATIVE_FILE_PATH,
29
29
  RULESYNC_MCP_SCHEMA_URL,
30
30
  RULESYNC_OVERVIEW_FILE_NAME,
31
+ RULESYNC_PERMISSIONS_FILE_NAME,
31
32
  RULESYNC_RELATIVE_DIR_PATH,
32
33
  RULESYNC_RULES_RELATIVE_DIR_PATH,
33
34
  RULESYNC_SKILLS_RELATIVE_DIR_PATH,
@@ -69,7 +70,7 @@ import {
69
70
  removeTempDirectory,
70
71
  stringifyFrontmatter,
71
72
  writeFileContent
72
- } from "../chunk-UYWCICY6.js";
73
+ } from "../chunk-4WYBBN4I.js";
73
74
 
74
75
  // src/cli/index.ts
75
76
  import { Command } from "commander";
@@ -537,7 +538,8 @@ var FEATURE_PATHS = {
537
538
  skills: ["skills"],
538
539
  ignore: [RULESYNC_AIIGNORE_FILE_NAME],
539
540
  mcp: [RULESYNC_MCP_FILE_NAME],
540
- hooks: [RULESYNC_HOOKS_FILE_NAME]
541
+ hooks: [RULESYNC_HOOKS_FILE_NAME],
542
+ permissions: [RULESYNC_PERMISSIONS_FILE_NAME]
541
543
  };
542
544
  function isToolTarget(target) {
543
545
  return target !== "rulesync";
@@ -4370,7 +4372,7 @@ function wrapCommand({
4370
4372
  }
4371
4373
 
4372
4374
  // src/cli/index.ts
4373
- var getVersion = () => "7.21.0";
4375
+ var getVersion = () => "7.22.0";
4374
4376
  function wrapCommand2(name, errorCode, handler) {
4375
4377
  return wrapCommand({ name, errorCode, handler, getVersion });
4376
4378
  }
package/dist/index.cjs CHANGED
@@ -51,6 +51,10 @@ var RULESYNC_COMMANDS_RELATIVE_DIR_PATH = (0, import_node_path.join)(RULESYNC_RE
51
51
  var RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "subagents");
52
52
  var RULESYNC_MCP_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "mcp.json");
53
53
  var RULESYNC_HOOKS_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, "hooks.json");
54
+ var RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH = (0, import_node_path.join)(
55
+ RULESYNC_RELATIVE_DIR_PATH,
56
+ "permissions.json"
57
+ );
54
58
  var RULESYNC_AIIGNORE_FILE_NAME = ".aiignore";
55
59
  var RULESYNC_AIIGNORE_RELATIVE_FILE_PATH = (0, import_node_path.join)(RULESYNC_RELATIVE_DIR_PATH, ".aiignore");
56
60
  var RULESYNC_IGNORE_RELATIVE_FILE_PATH = ".rulesyncignore";
@@ -244,7 +248,8 @@ var ALL_FEATURES = [
244
248
  "subagents",
245
249
  "commands",
246
250
  "skills",
247
- "hooks"
251
+ "hooks",
252
+ "permissions"
248
253
  ];
249
254
  var ALL_FEATURES_WITH_WILDCARD = [...ALL_FEATURES, "*"];
250
255
  var FeatureSchema = import_mini.z.enum(ALL_FEATURES);
@@ -2925,7 +2930,7 @@ var toolCommandFactories = /* @__PURE__ */ new Map([
2925
2930
  meta: {
2926
2931
  extension: "md",
2927
2932
  supportsProject: true,
2928
- supportsGlobal: true,
2933
+ supportsGlobal: false,
2929
2934
  isSimulated: true,
2930
2935
  supportsSubdirectory: false
2931
2936
  }
@@ -10996,7 +11001,7 @@ var toolSkillFactories = /* @__PURE__ */ new Map([
10996
11001
  "factorydroid",
10997
11002
  {
10998
11003
  class: FactorydroidSkill,
10999
- meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: true }
11004
+ meta: { supportsProject: true, supportsSimulated: true, supportsGlobal: false }
11000
11005
  }
11001
11006
  ],
11002
11007
  [
@@ -12759,7 +12764,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12759
12764
  "codexcli",
12760
12765
  {
12761
12766
  class: CodexCliSubagent,
12762
- meta: { supportsSimulated: false, supportsGlobal: false, filePattern: "*.toml" }
12767
+ meta: { supportsSimulated: false, supportsGlobal: true, filePattern: "*.toml" }
12763
12768
  }
12764
12769
  ],
12765
12770
  [
@@ -12780,7 +12785,7 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
12780
12785
  "factorydroid",
12781
12786
  {
12782
12787
  class: FactorydroidSubagent,
12783
- meta: { supportsSimulated: true, supportsGlobal: true, filePattern: "*.md" }
12788
+ meta: { supportsSimulated: true, supportsGlobal: false, filePattern: "*.md" }
12784
12789
  }
12785
12790
  ],
12786
12791
  [
@@ -16717,11 +16722,23 @@ async function processEmptyFeatureGeneration(params) {
16717
16722
  }
16718
16723
  return { count: totalCount, paths: [], hasDiff };
16719
16724
  }
16725
+ var SIMULATE_OPTION_MAP = {
16726
+ commands: "--simulate-commands",
16727
+ subagents: "--simulate-subagents",
16728
+ skills: "--simulate-skills"
16729
+ };
16720
16730
  function warnUnsupportedTargets(params) {
16721
- const { config, supportedTargets, featureName, logger } = params;
16731
+ const { config, supportedTargets, simulatedTargets = [], featureName, logger } = params;
16722
16732
  for (const target of config.getTargets()) {
16723
16733
  if (!supportedTargets.includes(target) && config.getFeatures(target).includes(featureName)) {
16724
- logger.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
16734
+ const simulateOption = SIMULATE_OPTION_MAP[featureName];
16735
+ if (simulateOption && simulatedTargets.includes(target)) {
16736
+ logger.warn(
16737
+ `Target '${target}' only supports simulated '${featureName}'. Use '${simulateOption}' to enable it. Skipping.`
16738
+ );
16739
+ } else {
16740
+ logger.warn(`Target '${target}' does not support the feature '${featureName}'. Skipping.`);
16741
+ }
16725
16742
  }
16726
16743
  }
16727
16744
  }
@@ -16902,6 +16919,7 @@ async function generateCommandsCore(params) {
16902
16919
  warnUnsupportedTargets({
16903
16920
  config,
16904
16921
  supportedTargets: supportedCommandsTargets,
16922
+ simulatedTargets: CommandsProcessor.getToolTargetsSimulated(),
16905
16923
  featureName: "commands",
16906
16924
  logger
16907
16925
  });
@@ -16944,6 +16962,7 @@ async function generateSubagentsCore(params) {
16944
16962
  warnUnsupportedTargets({
16945
16963
  config,
16946
16964
  supportedTargets: supportedSubagentsTargets,
16965
+ simulatedTargets: SubagentsProcessor.getToolTargetsSimulated(),
16947
16966
  featureName: "subagents",
16948
16967
  logger
16949
16968
  });
@@ -16987,6 +17006,7 @@ async function generateSkillsCore(params) {
16987
17006
  warnUnsupportedTargets({
16988
17007
  config,
16989
17008
  supportedTargets: supportedSkillsTargets,
17009
+ simulatedTargets: SkillsProcessor.getToolTargetsSimulated(),
16990
17010
  featureName: "skills",
16991
17011
  logger
16992
17012
  });
package/dist/index.d.cts CHANGED
@@ -30,7 +30,7 @@ declare const ToolTargetSchema: z.ZodMiniEnum<{
30
30
  }>;
31
31
  type ToolTarget = z.infer<typeof ToolTargetSchema>;
32
32
 
33
- declare const ALL_FEATURES: readonly ["rules", "ignore", "mcp", "subagents", "commands", "skills", "hooks"];
33
+ declare const ALL_FEATURES: readonly ["rules", "ignore", "mcp", "subagents", "commands", "skills", "hooks", "permissions"];
34
34
  declare const FeatureSchema: z.ZodMiniEnum<{
35
35
  rules: "rules";
36
36
  ignore: "ignore";
@@ -39,6 +39,7 @@ declare const FeatureSchema: z.ZodMiniEnum<{
39
39
  commands: "commands";
40
40
  skills: "skills";
41
41
  hooks: "hooks";
42
+ permissions: "permissions";
42
43
  }>;
43
44
  type Feature = z.infer<typeof FeatureSchema>;
44
45
 
package/dist/index.d.ts CHANGED
@@ -30,7 +30,7 @@ declare const ToolTargetSchema: z.ZodMiniEnum<{
30
30
  }>;
31
31
  type ToolTarget = z.infer<typeof ToolTargetSchema>;
32
32
 
33
- declare const ALL_FEATURES: readonly ["rules", "ignore", "mcp", "subagents", "commands", "skills", "hooks"];
33
+ declare const ALL_FEATURES: readonly ["rules", "ignore", "mcp", "subagents", "commands", "skills", "hooks", "permissions"];
34
34
  declare const FeatureSchema: z.ZodMiniEnum<{
35
35
  rules: "rules";
36
36
  ignore: "ignore";
@@ -39,6 +39,7 @@ declare const FeatureSchema: z.ZodMiniEnum<{
39
39
  commands: "commands";
40
40
  skills: "skills";
41
41
  hooks: "hooks";
42
+ permissions: "permissions";
42
43
  }>;
43
44
  type Feature = z.infer<typeof FeatureSchema>;
44
45
 
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  checkRulesyncDirExists,
7
7
  generate,
8
8
  importFromTool
9
- } from "./chunk-UYWCICY6.js";
9
+ } from "./chunk-4WYBBN4I.js";
10
10
 
11
11
  // src/index.ts
12
12
  async function generate2(options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rulesync",
3
- "version": "7.21.0",
3
+ "version": "7.22.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",
@@ -52,9 +52,9 @@
52
52
  "@octokit/request-error": "7.1.0",
53
53
  "@octokit/rest": "22.0.1",
54
54
  "@toon-format/toon": "2.1.0",
55
- "@valibot/to-json-schema": "1.5.0",
55
+ "@valibot/to-json-schema": "1.6.0",
56
56
  "commander": "14.0.3",
57
- "effect": "3.19.19",
57
+ "effect": "3.20.0",
58
58
  "es-toolkit": "1.45.1",
59
59
  "fastmcp": "3.34.0",
60
60
  "globby": "16.1.1",
@@ -66,40 +66,42 @@
66
66
  "zod": "4.3.6"
67
67
  },
68
68
  "devDependencies": {
69
- "@anthropic-ai/claude-agent-sdk": "0.2.74",
69
+ "@anthropic-ai/claude-agent-sdk": "0.2.79",
70
70
  "@eslint/js": "9.39.4",
71
+ "@opencode-ai/sdk": "1.2.27",
71
72
  "@openrouter/sdk": "0.9.11",
72
73
  "@secretlint/secretlint-rule-preset-recommend": "11.3.1",
73
74
  "@tsconfig/node24": "24.0.4",
74
75
  "@types/js-yaml": "4.0.9",
75
- "@types/node": "25.4.0",
76
- "@typescript/native-preview": "7.0.0-dev.20260312.1",
77
- "@vitest/coverage-v8": "4.0.18",
76
+ "@types/node": "25.5.0",
77
+ "@typescript/native-preview": "7.0.0-dev.20260318.1",
78
+ "@vitest/coverage-v8": "4.1.0",
78
79
  "cspell": "9.7.0",
79
80
  "eslint": "9.39.4",
80
81
  "eslint-plugin-import": "2.32.0",
81
82
  "eslint-plugin-no-type-assertion": "1.3.0",
82
- "eslint-plugin-oxlint": "1.53.0",
83
- "eslint-plugin-strict-dependencies": "1.3.31",
83
+ "eslint-plugin-oxlint": "1.56.0",
84
+ "eslint-plugin-strict-dependencies": "1.3.32",
84
85
  "eslint-plugin-zod-import": "0.3.0",
85
- "knip": "5.86.0",
86
- "lint-staged": "16.3.3",
87
- "oxfmt": "0.39.0",
88
- "oxlint": "1.54.0",
86
+ "knip": "5.88.0",
87
+ "lint-staged": "16.4.0",
88
+ "oxfmt": "0.41.0",
89
+ "oxlint": "1.56.0",
89
90
  "repomix": "1.12.0",
90
- "resend": "6.9.3",
91
+ "resend": "6.9.4",
91
92
  "secretlint": "11.3.1",
92
93
  "simple-git-hooks": "2.13.1",
93
94
  "sort-package-json": "3.6.1",
94
95
  "tsup": "8.5.1",
95
96
  "tsx": "4.21.0",
96
97
  "typescript": "5.9.3",
97
- "typescript-eslint": "8.57.0",
98
+ "typescript-eslint": "8.57.1",
98
99
  "vitepress": "1.6.4",
99
- "vitest": "4.0.18"
100
+ "vitest": "4.1.0"
100
101
  },
101
102
  "engines": {
102
- "node": ">=22.0.0"
103
+ "node": ">=22.0.0",
104
+ "pnpm": ">=10"
103
105
  },
104
106
  "publishConfig": {
105
107
  "access": "public"
@@ -122,9 +124,11 @@
122
124
  "fmt:check": "oxfmt --check .",
123
125
  "generate": "pnpm run dev generate",
124
126
  "generate:schema": "tsx scripts/generate-json-schema.ts",
127
+ "implement-loop": "tsx scripts/implement-loop.ts",
125
128
  "knip": "knip",
126
129
  "oxlint": "oxlint . --max-warnings 0",
127
130
  "oxlint:fix": "oxlint . --fix --max-warnings 0",
131
+ "review-loop": "tsx scripts/review-loop.ts",
128
132
  "secretlint": "secretlint --secretlintignore .gitignore \"**/*\"",
129
133
  "sort": "sort-package-json",
130
134
  "task": "tsx scripts/run-tasks.ts",