rulesync 3.6.0 → 3.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.
Files changed (3) hide show
  1. package/dist/index.cjs +177 -42
  2. package/dist/index.js +177 -42
  3. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -5282,6 +5282,16 @@ var CursorRule = class _CursorRule extends ToolRule {
5282
5282
  validate: true
5283
5283
  });
5284
5284
  }
5285
+ /**
5286
+ * Resolve cursor globs with priority: cursor-specific > parent
5287
+ * Returns comma-separated string for Cursor format, or undefined if no globs
5288
+ * @param cursorSpecificGlobs - Cursor-specific globs (takes priority if defined)
5289
+ * @param parentGlobs - Parent globs (used if cursorSpecificGlobs is undefined)
5290
+ */
5291
+ static resolveCursorGlobs(cursorSpecificGlobs, parentGlobs) {
5292
+ const targetGlobs = cursorSpecificGlobs !== void 0 ? cursorSpecificGlobs : parentGlobs;
5293
+ return targetGlobs && targetGlobs.length > 0 ? targetGlobs.join(",") : void 0;
5294
+ }
5285
5295
  static fromRulesyncRule({
5286
5296
  baseDir = ".",
5287
5297
  rulesyncRule,
@@ -5290,7 +5300,7 @@ var CursorRule = class _CursorRule extends ToolRule {
5290
5300
  const rulesyncFrontmatter = rulesyncRule.getFrontmatter();
5291
5301
  const cursorFrontmatter = {
5292
5302
  description: rulesyncFrontmatter.description,
5293
- globs: rulesyncFrontmatter.globs?.length ?? 0 > 0 ? rulesyncFrontmatter.globs?.join(",") : void 0,
5303
+ globs: this.resolveCursorGlobs(rulesyncFrontmatter.cursor?.globs, rulesyncFrontmatter.globs),
5294
5304
  alwaysApply: rulesyncFrontmatter.cursor?.alwaysApply ?? void 0
5295
5305
  };
5296
5306
  const body = rulesyncRule.getBody();
@@ -6940,53 +6950,64 @@ var gitignoreCommand = async () => {
6940
6950
  const gitignorePath = (0, import_node_path58.join)(process.cwd(), ".gitignore");
6941
6951
  const rulesFilesToIgnore = [
6942
6952
  "# Generated by rulesync - AI tool configuration files",
6953
+ // AGENTS.md
6954
+ "**/AGENTS.md",
6955
+ "**/.agents/",
6956
+ // Amazon Q
6943
6957
  "**/.amazonq/",
6944
- "**/.github/copilot-instructions.md",
6945
- "**/.github/instructions/",
6946
- "**/.github/prompts/",
6947
- "**/.cursor/",
6948
- "**/.cursorignore",
6949
- "**/.clinerules/",
6950
- "**/.clineignore",
6958
+ // Augment
6959
+ "**/.augmentignore",
6960
+ "**/.augment/rules/",
6961
+ "**/.augment-guidelines",
6962
+ // Claude Code
6951
6963
  "**/CLAUDE.md",
6952
6964
  "**/.claude/memories/",
6953
6965
  "**/.claude/commands/",
6954
6966
  "**/.claude/agents/",
6955
6967
  "**/.claude/settings.local.json",
6956
- "**/AGENTS.md",
6957
- "**/.agents/",
6958
- "**/.roo/rules/",
6959
- "**/.rooignore",
6960
- "**/.copilotignore",
6968
+ "**/.mcp.json",
6969
+ // Cline
6970
+ "**/.clinerules/",
6971
+ "**/.clineignore",
6972
+ "**/.cline/mcp.json",
6973
+ // Codex
6974
+ "**/.codexignore",
6975
+ "**/.codex/",
6976
+ // Cursor
6977
+ "**/.cursor/",
6978
+ "**/.cursorignore",
6979
+ "**/.cursor/mcp.json",
6980
+ // Gemini
6961
6981
  "**/GEMINI.md",
6962
6982
  "**/.gemini/memories/",
6963
6983
  "**/.gemini/commands/",
6964
6984
  "**/.gemini/subagents/",
6965
- "**/QWEN.md",
6966
- "**/.qwen/memories/",
6967
- "**/.aiexclude",
6968
- "**/.aiignore",
6969
- "**/.augmentignore",
6970
- "**/.kiro/steering/",
6971
- "**/.augment/rules/",
6972
- "**/.augment-guidelines",
6985
+ // GitHub Copilot
6986
+ "**/.github/copilot-instructions.md",
6987
+ "**/.github/instructions/",
6988
+ "**/.github/prompts/",
6989
+ "**/.github/subagents/",
6990
+ "**/.vscode/mcp.json",
6991
+ // Junie
6973
6992
  "**/.junie/guidelines.md",
6974
- "**/.noai",
6993
+ // Kiro
6994
+ "**/.kiro/steering/",
6995
+ "**/.aiignore",
6996
+ // OpenCode
6975
6997
  "**/.opencode/memories/",
6976
6998
  "**/.opencode/commands/",
6977
6999
  "**/opencode.json",
6978
- "**/.mcp.json",
6979
- "**/.cursor/mcp.json",
6980
- "**/.cline/mcp.json",
7000
+ // Qwen
7001
+ "**/QWEN.md",
7002
+ "**/.qwen/memories/",
7003
+ // Roo
7004
+ "**/.roo/rules/",
7005
+ "**/.rooignore",
6981
7006
  "**/.roo/mcp.json",
6982
7007
  "**/.roo/subagents/",
6983
- "**/.vscode/mcp.json",
6984
- "**/.github/commands/",
6985
- "**/.github/subagents/",
7008
+ // Warp
6986
7009
  "**/.warp/",
6987
- "**/WARP.md",
6988
- "**/.codexignore",
6989
- "**/.codex/"
7010
+ "**/WARP.md"
6990
7011
  ];
6991
7012
  let gitignoreContent = "";
6992
7013
  if (await fileExists(gitignorePath)) {
@@ -7173,7 +7194,7 @@ async function initCommand() {
7173
7194
  await createConfigFile();
7174
7195
  logger.success("rulesync initialized successfully!");
7175
7196
  logger.info("Next steps:");
7176
- logger.info(`1. Edit rule files in .rulesync/rules/`);
7197
+ logger.info(`1. Edit .rulesync/**/*.md, .rulesync/.mcp.json and .rulesyncignore`);
7177
7198
  logger.info("2. Run 'rulesync generate' to create configuration files");
7178
7199
  }
7179
7200
  async function createConfigFile() {
@@ -7201,7 +7222,7 @@ async function createConfigFile() {
7201
7222
  logger.success("Created rulesync.jsonc");
7202
7223
  }
7203
7224
  async function createSampleFiles() {
7204
- const sampleFile = {
7225
+ const sampleRuleFile = {
7205
7226
  filename: "overview.md",
7206
7227
  content: `---
7207
7228
  root: true
@@ -7236,20 +7257,134 @@ globs: ["**/*"]
7236
7257
  - Follow single responsibility principle
7237
7258
  `
7238
7259
  };
7239
- const filepath = (0, import_node_path59.join)(".rulesync/rules", sampleFile.filename);
7240
- await ensureDir(".rulesync/rules");
7241
- await ensureDir(RulesyncCommand.getSettablePaths().relativeDirPath);
7242
- await ensureDir(".rulesync/subagents");
7243
- if (!await fileExists(filepath)) {
7244
- await writeFileContent(filepath, sampleFile.content);
7245
- logger.success(`Created ${filepath}`);
7260
+ const sampleMcpFile = {
7261
+ filename: ".mcp.json",
7262
+ content: `{
7263
+ "mcpServers": {
7264
+ "serena": {
7265
+ "type": "stdio",
7266
+ "command": "uvx",
7267
+ "args": [
7268
+ "--from",
7269
+ "git+https://github.com/oraios/serena",
7270
+ "serena",
7271
+ "start-mcp-server",
7272
+ "--context",
7273
+ "ide-assistant",
7274
+ "--enable-web-dashboard",
7275
+ "false",
7276
+ "--project",
7277
+ "."
7278
+ ],
7279
+ "env": {}
7280
+ },
7281
+ "context7": {
7282
+ "type": "stdio",
7283
+ "command": "npx",
7284
+ "args": [
7285
+ "-y",
7286
+ "@upstash/context7-mcp"
7287
+ ],
7288
+ "env": {}
7289
+ }
7290
+ }
7291
+ }
7292
+ `
7293
+ };
7294
+ const sampleCommandFile = {
7295
+ filename: "review-pr.md",
7296
+ content: `---
7297
+ description: 'Review a pull request'
7298
+ targets: ["*"]
7299
+ ---
7300
+
7301
+ target_pr = $ARGUMENTS
7302
+
7303
+ If target_pr is not provided, use the PR of the current branch.
7304
+
7305
+ Execute the following in parallel:
7306
+
7307
+ 1. Check code quality and style consistency
7308
+ 2. Review test coverage
7309
+ 3. Verify documentation updates
7310
+ 4. Check for potential bugs or security issues
7311
+
7312
+ Then provide a summary of findings and suggestions for improvement.
7313
+ `
7314
+ };
7315
+ const sampleSubagentFile = {
7316
+ filename: "planner.md",
7317
+ content: `---
7318
+ name: planner
7319
+ targets: ["*"]
7320
+ description: >-
7321
+ This is the general-purpose planner. The user asks the agent to plan to
7322
+ suggest a specification, implement a new feature, refactor the codebase, or
7323
+ fix a bug. This agent can be called by the user explicitly only.
7324
+ claudecode:
7325
+ model: inherit
7326
+ ---
7327
+
7328
+ You are the planner for any tasks.
7329
+
7330
+ Based on the user's instruction, create a plan while analyzing the related files. Then, report the plan in detail. You can output files to @tmp/ if needed.
7331
+
7332
+ Attention, again, you are just the planner, so though you can read any files and run any commands for analysis, please don't write any code.
7333
+ `
7334
+ };
7335
+ const sampleIgnoreFile = {
7336
+ content: `credentials/
7337
+ `
7338
+ };
7339
+ const rulePaths = RulesyncRule.getSettablePaths();
7340
+ const mcpPaths = RulesyncMcp.getSettablePaths();
7341
+ const commandPaths = RulesyncCommand.getSettablePaths();
7342
+ const subagentPaths = RulesyncSubagent.getSettablePaths();
7343
+ const ignorePaths = RulesyncIgnore.getSettablePaths();
7344
+ await ensureDir(rulePaths.recommended.relativeDirPath);
7345
+ await ensureDir(mcpPaths.relativeDirPath);
7346
+ await ensureDir(commandPaths.relativeDirPath);
7347
+ await ensureDir(subagentPaths.relativeDirPath);
7348
+ await ensureDir(ignorePaths.relativeDirPath);
7349
+ const ruleFilepath = (0, import_node_path59.join)(rulePaths.recommended.relativeDirPath, sampleRuleFile.filename);
7350
+ if (!await fileExists(ruleFilepath)) {
7351
+ await writeFileContent(ruleFilepath, sampleRuleFile.content);
7352
+ logger.success(`Created ${ruleFilepath}`);
7353
+ } else {
7354
+ logger.info(`Skipped ${ruleFilepath} (already exists)`);
7355
+ }
7356
+ const mcpFilepath = (0, import_node_path59.join)(mcpPaths.relativeDirPath, mcpPaths.relativeFilePath);
7357
+ if (!await fileExists(mcpFilepath)) {
7358
+ await writeFileContent(mcpFilepath, sampleMcpFile.content);
7359
+ logger.success(`Created ${mcpFilepath}`);
7360
+ } else {
7361
+ logger.info(`Skipped ${mcpFilepath} (already exists)`);
7362
+ }
7363
+ const commandFilepath = (0, import_node_path59.join)(commandPaths.relativeDirPath, sampleCommandFile.filename);
7364
+ if (!await fileExists(commandFilepath)) {
7365
+ await writeFileContent(commandFilepath, sampleCommandFile.content);
7366
+ logger.success(`Created ${commandFilepath}`);
7367
+ } else {
7368
+ logger.info(`Skipped ${commandFilepath} (already exists)`);
7369
+ }
7370
+ const subagentFilepath = (0, import_node_path59.join)(subagentPaths.relativeDirPath, sampleSubagentFile.filename);
7371
+ if (!await fileExists(subagentFilepath)) {
7372
+ await writeFileContent(subagentFilepath, sampleSubagentFile.content);
7373
+ logger.success(`Created ${subagentFilepath}`);
7374
+ } else {
7375
+ logger.info(`Skipped ${subagentFilepath} (already exists)`);
7376
+ }
7377
+ const ignoreFilepath = (0, import_node_path59.join)(ignorePaths.relativeDirPath, ignorePaths.relativeFilePath);
7378
+ if (!await fileExists(ignoreFilepath)) {
7379
+ await writeFileContent(ignoreFilepath, sampleIgnoreFile.content);
7380
+ logger.success(`Created ${ignoreFilepath}`);
7246
7381
  } else {
7247
- logger.info(`Skipped ${filepath} (already exists)`);
7382
+ logger.info(`Skipped ${ignoreFilepath} (already exists)`);
7248
7383
  }
7249
7384
  }
7250
7385
 
7251
7386
  // src/cli/index.ts
7252
- var getVersion = () => "3.6.0";
7387
+ var getVersion = () => "3.7.0";
7253
7388
  var main = async () => {
7254
7389
  const program = new import_commander.Command();
7255
7390
  const version = getVersion();
package/dist/index.js CHANGED
@@ -5259,6 +5259,16 @@ var CursorRule = class _CursorRule extends ToolRule {
5259
5259
  validate: true
5260
5260
  });
5261
5261
  }
5262
+ /**
5263
+ * Resolve cursor globs with priority: cursor-specific > parent
5264
+ * Returns comma-separated string for Cursor format, or undefined if no globs
5265
+ * @param cursorSpecificGlobs - Cursor-specific globs (takes priority if defined)
5266
+ * @param parentGlobs - Parent globs (used if cursorSpecificGlobs is undefined)
5267
+ */
5268
+ static resolveCursorGlobs(cursorSpecificGlobs, parentGlobs) {
5269
+ const targetGlobs = cursorSpecificGlobs !== void 0 ? cursorSpecificGlobs : parentGlobs;
5270
+ return targetGlobs && targetGlobs.length > 0 ? targetGlobs.join(",") : void 0;
5271
+ }
5262
5272
  static fromRulesyncRule({
5263
5273
  baseDir = ".",
5264
5274
  rulesyncRule,
@@ -5267,7 +5277,7 @@ var CursorRule = class _CursorRule extends ToolRule {
5267
5277
  const rulesyncFrontmatter = rulesyncRule.getFrontmatter();
5268
5278
  const cursorFrontmatter = {
5269
5279
  description: rulesyncFrontmatter.description,
5270
- globs: rulesyncFrontmatter.globs?.length ?? 0 > 0 ? rulesyncFrontmatter.globs?.join(",") : void 0,
5280
+ globs: this.resolveCursorGlobs(rulesyncFrontmatter.cursor?.globs, rulesyncFrontmatter.globs),
5271
5281
  alwaysApply: rulesyncFrontmatter.cursor?.alwaysApply ?? void 0
5272
5282
  };
5273
5283
  const body = rulesyncRule.getBody();
@@ -6917,53 +6927,64 @@ var gitignoreCommand = async () => {
6917
6927
  const gitignorePath = join57(process.cwd(), ".gitignore");
6918
6928
  const rulesFilesToIgnore = [
6919
6929
  "# Generated by rulesync - AI tool configuration files",
6930
+ // AGENTS.md
6931
+ "**/AGENTS.md",
6932
+ "**/.agents/",
6933
+ // Amazon Q
6920
6934
  "**/.amazonq/",
6921
- "**/.github/copilot-instructions.md",
6922
- "**/.github/instructions/",
6923
- "**/.github/prompts/",
6924
- "**/.cursor/",
6925
- "**/.cursorignore",
6926
- "**/.clinerules/",
6927
- "**/.clineignore",
6935
+ // Augment
6936
+ "**/.augmentignore",
6937
+ "**/.augment/rules/",
6938
+ "**/.augment-guidelines",
6939
+ // Claude Code
6928
6940
  "**/CLAUDE.md",
6929
6941
  "**/.claude/memories/",
6930
6942
  "**/.claude/commands/",
6931
6943
  "**/.claude/agents/",
6932
6944
  "**/.claude/settings.local.json",
6933
- "**/AGENTS.md",
6934
- "**/.agents/",
6935
- "**/.roo/rules/",
6936
- "**/.rooignore",
6937
- "**/.copilotignore",
6945
+ "**/.mcp.json",
6946
+ // Cline
6947
+ "**/.clinerules/",
6948
+ "**/.clineignore",
6949
+ "**/.cline/mcp.json",
6950
+ // Codex
6951
+ "**/.codexignore",
6952
+ "**/.codex/",
6953
+ // Cursor
6954
+ "**/.cursor/",
6955
+ "**/.cursorignore",
6956
+ "**/.cursor/mcp.json",
6957
+ // Gemini
6938
6958
  "**/GEMINI.md",
6939
6959
  "**/.gemini/memories/",
6940
6960
  "**/.gemini/commands/",
6941
6961
  "**/.gemini/subagents/",
6942
- "**/QWEN.md",
6943
- "**/.qwen/memories/",
6944
- "**/.aiexclude",
6945
- "**/.aiignore",
6946
- "**/.augmentignore",
6947
- "**/.kiro/steering/",
6948
- "**/.augment/rules/",
6949
- "**/.augment-guidelines",
6962
+ // GitHub Copilot
6963
+ "**/.github/copilot-instructions.md",
6964
+ "**/.github/instructions/",
6965
+ "**/.github/prompts/",
6966
+ "**/.github/subagents/",
6967
+ "**/.vscode/mcp.json",
6968
+ // Junie
6950
6969
  "**/.junie/guidelines.md",
6951
- "**/.noai",
6970
+ // Kiro
6971
+ "**/.kiro/steering/",
6972
+ "**/.aiignore",
6973
+ // OpenCode
6952
6974
  "**/.opencode/memories/",
6953
6975
  "**/.opencode/commands/",
6954
6976
  "**/opencode.json",
6955
- "**/.mcp.json",
6956
- "**/.cursor/mcp.json",
6957
- "**/.cline/mcp.json",
6977
+ // Qwen
6978
+ "**/QWEN.md",
6979
+ "**/.qwen/memories/",
6980
+ // Roo
6981
+ "**/.roo/rules/",
6982
+ "**/.rooignore",
6958
6983
  "**/.roo/mcp.json",
6959
6984
  "**/.roo/subagents/",
6960
- "**/.vscode/mcp.json",
6961
- "**/.github/commands/",
6962
- "**/.github/subagents/",
6985
+ // Warp
6963
6986
  "**/.warp/",
6964
- "**/WARP.md",
6965
- "**/.codexignore",
6966
- "**/.codex/"
6987
+ "**/WARP.md"
6967
6988
  ];
6968
6989
  let gitignoreContent = "";
6969
6990
  if (await fileExists(gitignorePath)) {
@@ -7150,7 +7171,7 @@ async function initCommand() {
7150
7171
  await createConfigFile();
7151
7172
  logger.success("rulesync initialized successfully!");
7152
7173
  logger.info("Next steps:");
7153
- logger.info(`1. Edit rule files in .rulesync/rules/`);
7174
+ logger.info(`1. Edit .rulesync/**/*.md, .rulesync/.mcp.json and .rulesyncignore`);
7154
7175
  logger.info("2. Run 'rulesync generate' to create configuration files");
7155
7176
  }
7156
7177
  async function createConfigFile() {
@@ -7178,7 +7199,7 @@ async function createConfigFile() {
7178
7199
  logger.success("Created rulesync.jsonc");
7179
7200
  }
7180
7201
  async function createSampleFiles() {
7181
- const sampleFile = {
7202
+ const sampleRuleFile = {
7182
7203
  filename: "overview.md",
7183
7204
  content: `---
7184
7205
  root: true
@@ -7213,20 +7234,134 @@ globs: ["**/*"]
7213
7234
  - Follow single responsibility principle
7214
7235
  `
7215
7236
  };
7216
- const filepath = join58(".rulesync/rules", sampleFile.filename);
7217
- await ensureDir(".rulesync/rules");
7218
- await ensureDir(RulesyncCommand.getSettablePaths().relativeDirPath);
7219
- await ensureDir(".rulesync/subagents");
7220
- if (!await fileExists(filepath)) {
7221
- await writeFileContent(filepath, sampleFile.content);
7222
- logger.success(`Created ${filepath}`);
7237
+ const sampleMcpFile = {
7238
+ filename: ".mcp.json",
7239
+ content: `{
7240
+ "mcpServers": {
7241
+ "serena": {
7242
+ "type": "stdio",
7243
+ "command": "uvx",
7244
+ "args": [
7245
+ "--from",
7246
+ "git+https://github.com/oraios/serena",
7247
+ "serena",
7248
+ "start-mcp-server",
7249
+ "--context",
7250
+ "ide-assistant",
7251
+ "--enable-web-dashboard",
7252
+ "false",
7253
+ "--project",
7254
+ "."
7255
+ ],
7256
+ "env": {}
7257
+ },
7258
+ "context7": {
7259
+ "type": "stdio",
7260
+ "command": "npx",
7261
+ "args": [
7262
+ "-y",
7263
+ "@upstash/context7-mcp"
7264
+ ],
7265
+ "env": {}
7266
+ }
7267
+ }
7268
+ }
7269
+ `
7270
+ };
7271
+ const sampleCommandFile = {
7272
+ filename: "review-pr.md",
7273
+ content: `---
7274
+ description: 'Review a pull request'
7275
+ targets: ["*"]
7276
+ ---
7277
+
7278
+ target_pr = $ARGUMENTS
7279
+
7280
+ If target_pr is not provided, use the PR of the current branch.
7281
+
7282
+ Execute the following in parallel:
7283
+
7284
+ 1. Check code quality and style consistency
7285
+ 2. Review test coverage
7286
+ 3. Verify documentation updates
7287
+ 4. Check for potential bugs or security issues
7288
+
7289
+ Then provide a summary of findings and suggestions for improvement.
7290
+ `
7291
+ };
7292
+ const sampleSubagentFile = {
7293
+ filename: "planner.md",
7294
+ content: `---
7295
+ name: planner
7296
+ targets: ["*"]
7297
+ description: >-
7298
+ This is the general-purpose planner. The user asks the agent to plan to
7299
+ suggest a specification, implement a new feature, refactor the codebase, or
7300
+ fix a bug. This agent can be called by the user explicitly only.
7301
+ claudecode:
7302
+ model: inherit
7303
+ ---
7304
+
7305
+ You are the planner for any tasks.
7306
+
7307
+ Based on the user's instruction, create a plan while analyzing the related files. Then, report the plan in detail. You can output files to @tmp/ if needed.
7308
+
7309
+ Attention, again, you are just the planner, so though you can read any files and run any commands for analysis, please don't write any code.
7310
+ `
7311
+ };
7312
+ const sampleIgnoreFile = {
7313
+ content: `credentials/
7314
+ `
7315
+ };
7316
+ const rulePaths = RulesyncRule.getSettablePaths();
7317
+ const mcpPaths = RulesyncMcp.getSettablePaths();
7318
+ const commandPaths = RulesyncCommand.getSettablePaths();
7319
+ const subagentPaths = RulesyncSubagent.getSettablePaths();
7320
+ const ignorePaths = RulesyncIgnore.getSettablePaths();
7321
+ await ensureDir(rulePaths.recommended.relativeDirPath);
7322
+ await ensureDir(mcpPaths.relativeDirPath);
7323
+ await ensureDir(commandPaths.relativeDirPath);
7324
+ await ensureDir(subagentPaths.relativeDirPath);
7325
+ await ensureDir(ignorePaths.relativeDirPath);
7326
+ const ruleFilepath = join58(rulePaths.recommended.relativeDirPath, sampleRuleFile.filename);
7327
+ if (!await fileExists(ruleFilepath)) {
7328
+ await writeFileContent(ruleFilepath, sampleRuleFile.content);
7329
+ logger.success(`Created ${ruleFilepath}`);
7330
+ } else {
7331
+ logger.info(`Skipped ${ruleFilepath} (already exists)`);
7332
+ }
7333
+ const mcpFilepath = join58(mcpPaths.relativeDirPath, mcpPaths.relativeFilePath);
7334
+ if (!await fileExists(mcpFilepath)) {
7335
+ await writeFileContent(mcpFilepath, sampleMcpFile.content);
7336
+ logger.success(`Created ${mcpFilepath}`);
7337
+ } else {
7338
+ logger.info(`Skipped ${mcpFilepath} (already exists)`);
7339
+ }
7340
+ const commandFilepath = join58(commandPaths.relativeDirPath, sampleCommandFile.filename);
7341
+ if (!await fileExists(commandFilepath)) {
7342
+ await writeFileContent(commandFilepath, sampleCommandFile.content);
7343
+ logger.success(`Created ${commandFilepath}`);
7344
+ } else {
7345
+ logger.info(`Skipped ${commandFilepath} (already exists)`);
7346
+ }
7347
+ const subagentFilepath = join58(subagentPaths.relativeDirPath, sampleSubagentFile.filename);
7348
+ if (!await fileExists(subagentFilepath)) {
7349
+ await writeFileContent(subagentFilepath, sampleSubagentFile.content);
7350
+ logger.success(`Created ${subagentFilepath}`);
7351
+ } else {
7352
+ logger.info(`Skipped ${subagentFilepath} (already exists)`);
7353
+ }
7354
+ const ignoreFilepath = join58(ignorePaths.relativeDirPath, ignorePaths.relativeFilePath);
7355
+ if (!await fileExists(ignoreFilepath)) {
7356
+ await writeFileContent(ignoreFilepath, sampleIgnoreFile.content);
7357
+ logger.success(`Created ${ignoreFilepath}`);
7223
7358
  } else {
7224
- logger.info(`Skipped ${filepath} (already exists)`);
7359
+ logger.info(`Skipped ${ignoreFilepath} (already exists)`);
7225
7360
  }
7226
7361
  }
7227
7362
 
7228
7363
  // src/cli/index.ts
7229
- var getVersion = () => "3.6.0";
7364
+ var getVersion = () => "3.7.0";
7230
7365
  var main = async () => {
7231
7366
  const program = new Command();
7232
7367
  const version = getVersion();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rulesync",
3
- "version": "3.6.0",
3
+ "version": "3.7.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",