rulesync 0.53.0 → 0.54.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 (27) hide show
  1. package/README.ja.md +186 -23
  2. package/README.md +101 -25
  3. package/dist/{augmentcode-ICLQ2NEZ.js → augmentcode-MJYD2Y4S.js} +2 -2
  4. package/dist/{chunk-TTHBLXOB.js → chunk-3PHMFVXP.js} +1 -1
  5. package/dist/{chunk-FFW6TGCM.js → chunk-BEPSWIZC.js} +1 -1
  6. package/dist/chunk-D7XQ4OHK.js +145 -0
  7. package/dist/{chunk-OPZOVKIL.js → chunk-ORNO5MOO.js} +1 -1
  8. package/dist/{chunk-Y2XH4E5R.js → chunk-OXKDEZJK.js} +1 -1
  9. package/dist/{chunk-FNL2KPM3.js → chunk-OY6BYYIX.js} +1 -1
  10. package/dist/{chunk-YPIFCGAP.js → chunk-PPAQWVXX.js} +1 -1
  11. package/dist/{chunk-QUJMXHNR.js → chunk-QVPD6ENS.js} +1 -1
  12. package/dist/{chunk-Y26DXTAT.js → chunk-TJKD6LEW.js} +1 -1
  13. package/dist/{chunk-HMMTSS5E.js → chunk-UHANRG2O.js} +1 -1
  14. package/dist/{chunk-IXCMY24P.js → chunk-UZCJNUXO.js} +1 -1
  15. package/dist/{chunk-USKQYIZ2.js → chunk-VI6SBYFB.js} +1 -0
  16. package/dist/{claudecode-4XWK2WAY.js → claudecode-CKGUHLRR.js} +3 -3
  17. package/dist/{cline-MNXOHP77.js → cline-Z5C656VR.js} +3 -3
  18. package/dist/codexcli-VFUJKSIJ.js +10 -0
  19. package/dist/{copilot-ARYIWVJ7.js → copilot-4WQS5TA7.js} +2 -2
  20. package/dist/{cursor-FCS74IAH.js → cursor-HOB2F2V2.js} +2 -2
  21. package/dist/{geminicli-VOPV6DXZ.js → geminicli-XTMQTIU2.js} +2 -2
  22. package/dist/index.cjs +267 -21
  23. package/dist/index.js +213 -33
  24. package/dist/{junie-A2Y2WZI4.js → junie-AN6CR7DD.js} +2 -2
  25. package/dist/{kiro-MHIK4UBV.js → kiro-PTUZOHQ2.js} +2 -2
  26. package/dist/{roo-VG4IUNTE.js → roo-WOMS36KU.js} +2 -2
  27. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,39 +1,42 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ generateJunieMcp
4
+ } from "./chunk-TJKD6LEW.js";
2
5
  import {
3
6
  generateKiroMcp
4
- } from "./chunk-QUJMXHNR.js";
7
+ } from "./chunk-QVPD6ENS.js";
5
8
  import {
6
9
  generateRooMcp
7
- } from "./chunk-FFW6TGCM.js";
10
+ } from "./chunk-BEPSWIZC.js";
8
11
  import {
9
12
  generateAugmentcodeMcp
10
- } from "./chunk-OPZOVKIL.js";
13
+ } from "./chunk-ORNO5MOO.js";
11
14
  import {
12
15
  generateClaudeMcp
13
- } from "./chunk-FNL2KPM3.js";
16
+ } from "./chunk-OY6BYYIX.js";
14
17
  import {
15
18
  generateClineMcp
16
- } from "./chunk-HMMTSS5E.js";
17
- import "./chunk-YPIFCGAP.js";
19
+ } from "./chunk-UHANRG2O.js";
20
+ import {
21
+ generateCodexMcp
22
+ } from "./chunk-D7XQ4OHK.js";
23
+ import "./chunk-PPAQWVXX.js";
18
24
  import {
19
25
  generateCopilotMcp
20
- } from "./chunk-Y2XH4E5R.js";
26
+ } from "./chunk-OXKDEZJK.js";
21
27
  import {
22
28
  generateCursorMcp
23
- } from "./chunk-TTHBLXOB.js";
29
+ } from "./chunk-3PHMFVXP.js";
24
30
  import {
25
31
  generateGeminiCliMcp
26
- } from "./chunk-IXCMY24P.js";
27
- import {
28
- generateJunieMcp
29
- } from "./chunk-Y26DXTAT.js";
32
+ } from "./chunk-UZCJNUXO.js";
30
33
  import {
31
34
  ALL_TOOL_TARGETS,
32
35
  RulesyncTargetsSchema,
33
36
  ToolTargetSchema,
34
37
  ToolTargetsSchema,
35
38
  isToolTarget
36
- } from "./chunk-USKQYIZ2.js";
39
+ } from "./chunk-VI6SBYFB.js";
37
40
 
38
41
  // src/cli/index.ts
39
42
  import { Command } from "commander";
@@ -53,6 +56,7 @@ function getDefaultConfig() {
53
56
  cursor: ".cursor/rules",
54
57
  cline: ".clinerules",
55
58
  claudecode: ".",
59
+ codexcli: ".",
56
60
  roo: ".roo/rules",
57
61
  geminicli: ".gemini/memories",
58
62
  kiro: ".kiro/steering",
@@ -139,6 +143,7 @@ var OutputPathsSchema = z3.object({
139
143
  cursor: z3.optional(z3.string()),
140
144
  cline: z3.optional(z3.string()),
141
145
  claudecode: z3.optional(z3.string()),
146
+ codexcli: z3.optional(z3.string()),
142
147
  roo: z3.optional(z3.string()),
143
148
  geminicli: z3.optional(z3.string()),
144
149
  kiro: z3.optional(z3.string()),
@@ -201,7 +206,8 @@ var McpServerBaseSchema = z4.object({
201
206
  alwaysAllow: z4.optional(z4.array(z4.string())),
202
207
  tools: z4.optional(z4.array(z4.string())),
203
208
  kiroAutoApprove: z4.optional(z4.array(z4.string())),
204
- kiroAutoBlock: z4.optional(z4.array(z4.string()))
209
+ kiroAutoBlock: z4.optional(z4.array(z4.string())),
210
+ headers: z4.optional(z4.record(z4.string(), z4.string()))
205
211
  });
206
212
  var RulesyncMcpServerSchema = z4.extend(McpServerBaseSchema, {
207
213
  targets: z4.optional(RulesyncTargetsSchema)
@@ -1160,6 +1166,135 @@ var ignoreConfigs = {
1160
1166
  }
1161
1167
  return augmentPatterns;
1162
1168
  }
1169
+ },
1170
+ codexcli: {
1171
+ tool: "codexcli",
1172
+ filename: ".codexignore",
1173
+ header: [
1174
+ "# Generated by rulesync - OpenAI Codex CLI ignore file",
1175
+ "# This file controls which files are excluded from Codex CLI's AI context",
1176
+ "# Note: .codexignore is a community-requested feature (GitHub Issue #205)",
1177
+ "# Currently using proposed syntax based on .gitignore patterns"
1178
+ ],
1179
+ corePatterns: [
1180
+ "# \u2500\u2500\u2500\u2500\u2500 Security & Credentials (Critical) \u2500\u2500\u2500\u2500\u2500",
1181
+ "# Environment files",
1182
+ ".env",
1183
+ ".env.*",
1184
+ "!.env.example",
1185
+ "",
1186
+ "# Private keys and certificates",
1187
+ "*.key",
1188
+ "*.pem",
1189
+ "*.p12",
1190
+ "*.pfx",
1191
+ "*.der",
1192
+ "*.crt",
1193
+ "",
1194
+ "# SSH keys",
1195
+ "id_rsa*",
1196
+ "id_dsa*",
1197
+ "*.ppk",
1198
+ "",
1199
+ "# API keys and secrets",
1200
+ "api-keys.json",
1201
+ "credentials.json",
1202
+ "secrets.json",
1203
+ "**/apikeys/",
1204
+ "**/*_token*",
1205
+ "**/*_secret*",
1206
+ "**/*api_key*",
1207
+ "",
1208
+ "# Cloud provider credentials",
1209
+ "aws-credentials.json",
1210
+ "gcp-service-account*.json",
1211
+ "azure-credentials.json",
1212
+ ".aws/",
1213
+ "",
1214
+ "# \u2500\u2500\u2500\u2500\u2500 Database & Infrastructure Secrets \u2500\u2500\u2500\u2500\u2500",
1215
+ "# Database configuration",
1216
+ "*.db",
1217
+ "*.sqlite",
1218
+ "*.sqlite3",
1219
+ "database.yml",
1220
+ "**/database/config.*",
1221
+ "",
1222
+ "# Infrastructure as Code secrets",
1223
+ "*.tfstate",
1224
+ "*.tfstate.*",
1225
+ "terraform.tfvars",
1226
+ "secrets.auto.tfvars",
1227
+ ".terraform/",
1228
+ "",
1229
+ "# Kubernetes secrets",
1230
+ "**/k8s/**/secret*.yaml",
1231
+ "**/kubernetes/**/secret*.yaml",
1232
+ "",
1233
+ "# \u2500\u2500\u2500\u2500\u2500 Business Sensitive Data \u2500\u2500\u2500\u2500\u2500",
1234
+ "# Sensitive directories",
1235
+ "secrets/",
1236
+ "private/",
1237
+ "confidential/",
1238
+ "internal-docs/",
1239
+ "company-secrets/",
1240
+ "",
1241
+ "# Customer and personal data",
1242
+ "customer-data/",
1243
+ "pii/",
1244
+ "personal-data/",
1245
+ "**/*customer*.csv",
1246
+ "**/*personal*.json",
1247
+ "",
1248
+ "# \u2500\u2500\u2500\u2500\u2500 Build Artifacts & Large Files \u2500\u2500\u2500\u2500\u2500",
1249
+ "# Build outputs (may contain embedded secrets)",
1250
+ "dist/",
1251
+ "build/",
1252
+ "out/",
1253
+ ".next/",
1254
+ ".nuxt/",
1255
+ "",
1256
+ "# Large files that slow down AI processing",
1257
+ "*.zip",
1258
+ "*.tar.gz",
1259
+ "*.rar",
1260
+ "**/*.{mp4,avi,mov,mkv}",
1261
+ "**/*.{pdf,doc,docx}",
1262
+ "",
1263
+ "# Data files",
1264
+ "*.csv",
1265
+ "*.tsv",
1266
+ "*.xlsx",
1267
+ "data/",
1268
+ "datasets/",
1269
+ "",
1270
+ "# \u2500\u2500\u2500\u2500\u2500 Development Environment \u2500\u2500\u2500\u2500\u2500",
1271
+ "# Personal IDE settings",
1272
+ ".vscode/settings.json",
1273
+ ".idea/workspace.xml",
1274
+ "",
1275
+ "# Temporary files",
1276
+ "*.swp",
1277
+ "*.swo",
1278
+ "*~",
1279
+ "*.tmp",
1280
+ "",
1281
+ "# Test data with sensitive content",
1282
+ "test-data/sensitive/",
1283
+ "tests/fixtures/real-data/**",
1284
+ "",
1285
+ "# \u2500\u2500\u2500\u2500\u2500 Logs & Runtime Data \u2500\u2500\u2500\u2500\u2500",
1286
+ "*.log",
1287
+ "logs/",
1288
+ ".cache/",
1289
+ "",
1290
+ "# \u2500\u2500\u2500\u2500\u2500 Re-include Important Files \u2500\u2500\u2500\u2500\u2500",
1291
+ "# Allow configuration examples and documentation",
1292
+ "!secrets/README.md",
1293
+ "!config/*.example.*",
1294
+ "!docs/**/*.md"
1295
+ ],
1296
+ includeCommonPatterns: false,
1297
+ projectPatternsHeader: "# \u2500\u2500\u2500\u2500\u2500 Project-specific patterns from rulesync rules \u2500\u2500\u2500\u2500\u2500"
1163
1298
  }
1164
1299
  };
1165
1300
 
@@ -1504,6 +1639,37 @@ async function generateClineConfig(rules, config, baseDir) {
1504
1639
  );
1505
1640
  }
1506
1641
 
1642
+ // src/generators/rules/codexcli.ts
1643
+ async function generateCodexConfig(rules, config, baseDir) {
1644
+ const generatorConfig = {
1645
+ tool: "codexcli",
1646
+ fileExtension: ".md",
1647
+ ignoreFileName: ".codexignore",
1648
+ generateContent: generateCodexInstructionsMarkdown,
1649
+ pathResolver: (rule, outputDir) => {
1650
+ if (rule.frontmatter.root === true) {
1651
+ return `${outputDir}/codex.md`;
1652
+ }
1653
+ return `${outputDir}/${rule.filename}.md`;
1654
+ }
1655
+ };
1656
+ return generateRulesConfig(rules, config, generatorConfig, baseDir);
1657
+ }
1658
+ function generateCodexInstructionsMarkdown(rule) {
1659
+ const lines = [];
1660
+ if (rule.frontmatter.root === false && rule.frontmatter.description && rule.frontmatter.description !== "Main instructions" && !rule.frontmatter.description.includes("Project-level Codex CLI instructions")) {
1661
+ lines.push(`<!-- ${rule.frontmatter.description} -->`);
1662
+ if (rule.content.trim()) {
1663
+ lines.push("");
1664
+ }
1665
+ }
1666
+ const content = rule.content.trim();
1667
+ if (content) {
1668
+ lines.push(content);
1669
+ }
1670
+ return lines.join("\n");
1671
+ }
1672
+
1507
1673
  // src/generators/rules/copilot.ts
1508
1674
  import { join as join8 } from "path";
1509
1675
  async function generateCopilotConfig(rules, config, baseDir) {
@@ -1768,6 +1934,8 @@ async function generateForTool(tool, rules, config, baseDir) {
1768
1934
  return generateClineConfig(rules, config, baseDir);
1769
1935
  case "claudecode":
1770
1936
  return await generateClaudecodeConfig(rules, config, baseDir);
1937
+ case "codexcli":
1938
+ return generateCodexConfig(rules, config, baseDir);
1771
1939
  case "roo":
1772
1940
  return generateRooConfig(rules, config, baseDir);
1773
1941
  case "geminicli":
@@ -1960,6 +2128,11 @@ async function generateMcpConfigs(projectRoot, baseDir, targetTools) {
1960
2128
  path: path4.join(targetRoot, ".cline", "mcp.json"),
1961
2129
  generate: () => generateClineMcp(config)
1962
2130
  },
2131
+ {
2132
+ tool: "codexcli-project",
2133
+ path: path4.join(targetRoot, ".codex", "mcp-config.json"),
2134
+ generate: () => generateCodexMcp(config)
2135
+ },
1963
2136
  {
1964
2137
  tool: "gemini-project",
1965
2138
  path: path4.join(targetRoot, ".gemini", "settings.json"),
@@ -1995,7 +2168,7 @@ async function generateMcpConfigs(projectRoot, baseDir, targetTools) {
1995
2168
  try {
1996
2169
  const content = generator.generate();
1997
2170
  const parsed = JSON.parse(content);
1998
- if (generator.tool.includes("augmentcode") || generator.tool.includes("claude") || generator.tool.includes("cline") || generator.tool.includes("cursor") || generator.tool.includes("gemini") || generator.tool.includes("junie") || generator.tool.includes("kiro") || generator.tool.includes("roo")) {
2171
+ if (generator.tool.includes("augmentcode") || generator.tool.includes("claude") || generator.tool.includes("cline") || generator.tool.includes("codexcli") || generator.tool.includes("cursor") || generator.tool.includes("gemini") || generator.tool.includes("junie") || generator.tool.includes("kiro") || generator.tool.includes("roo")) {
1999
2172
  if (!parsed.mcpServers || Object.keys(parsed.mcpServers).length === 0) {
2000
2173
  results.push({
2001
2174
  tool: generator.tool,
@@ -2220,6 +2393,8 @@ var gitignoreCommand = async () => {
2220
2393
  "**/.clineignore",
2221
2394
  "**/CLAUDE.md",
2222
2395
  "**/.claude/memories/",
2396
+ "**/codex.md",
2397
+ "**/.codexignore",
2223
2398
  "**/.roo/rules/",
2224
2399
  "**/.rooignore",
2225
2400
  "**/.copilotignore",
@@ -2238,6 +2413,7 @@ var gitignoreCommand = async () => {
2238
2413
  "**/.cursor/mcp.json",
2239
2414
  "**/.cline/mcp.json",
2240
2415
  "**/.vscode/mcp.json",
2416
+ "**/.codex/mcp-config.json",
2241
2417
  "**/.gemini/settings.json",
2242
2418
  "**/.roo/mcp.json"
2243
2419
  ];
@@ -2270,7 +2446,7 @@ ${linesToAdd.join("\n")}
2270
2446
  };
2271
2447
 
2272
2448
  // src/core/importer.ts
2273
- import { join as join20 } from "path";
2449
+ import { join as join21 } from "path";
2274
2450
  import matter5 from "gray-matter";
2275
2451
 
2276
2452
  // src/parsers/augmentcode.ts
@@ -2695,6 +2871,9 @@ async function parseClineConfiguration(baseDir = process.cwd()) {
2695
2871
  });
2696
2872
  }
2697
2873
 
2874
+ // src/parsers/codexcli.ts
2875
+ import { join as join18 } from "path";
2876
+
2698
2877
  // src/parsers/copilot.ts
2699
2878
  async function parseCopilotConfiguration(baseDir = process.cwd()) {
2700
2879
  return parseConfigurationFiles(baseDir, {
@@ -2716,7 +2895,7 @@ async function parseCopilotConfiguration(baseDir = process.cwd()) {
2716
2895
  }
2717
2896
 
2718
2897
  // src/parsers/cursor.ts
2719
- import { basename as basename4, join as join18 } from "path";
2898
+ import { basename as basename4, join as join19 } from "path";
2720
2899
  import matter4 from "gray-matter";
2721
2900
  import { DEFAULT_SCHEMA, FAILSAFE_SCHEMA, load } from "js-yaml";
2722
2901
  import { z as z6 } from "zod/mini";
@@ -2841,7 +3020,7 @@ async function parseCursorConfiguration(baseDir = process.cwd()) {
2841
3020
  const rules = [];
2842
3021
  let ignorePatterns;
2843
3022
  let mcpServers;
2844
- const cursorFilePath = join18(baseDir, ".cursorrules");
3023
+ const cursorFilePath = join19(baseDir, ".cursorrules");
2845
3024
  if (await fileExists(cursorFilePath)) {
2846
3025
  try {
2847
3026
  const rawContent = await readFileContent(cursorFilePath);
@@ -2862,14 +3041,14 @@ async function parseCursorConfiguration(baseDir = process.cwd()) {
2862
3041
  errors.push(`Failed to parse .cursorrules file: ${errorMessage}`);
2863
3042
  }
2864
3043
  }
2865
- const cursorRulesDir = join18(baseDir, ".cursor", "rules");
3044
+ const cursorRulesDir = join19(baseDir, ".cursor", "rules");
2866
3045
  if (await fileExists(cursorRulesDir)) {
2867
3046
  try {
2868
3047
  const { readdir: readdir2 } = await import("fs/promises");
2869
3048
  const files = await readdir2(cursorRulesDir);
2870
3049
  for (const file of files) {
2871
3050
  if (file.endsWith(".mdc")) {
2872
- const filePath = join18(cursorRulesDir, file);
3051
+ const filePath = join19(cursorRulesDir, file);
2873
3052
  try {
2874
3053
  const rawContent = await readFileContent(filePath);
2875
3054
  const parsed = matter4(rawContent, customMatterOptions);
@@ -2898,7 +3077,7 @@ async function parseCursorConfiguration(baseDir = process.cwd()) {
2898
3077
  if (rules.length === 0) {
2899
3078
  errors.push("No Cursor configuration files found (.cursorrules or .cursor/rules/*.mdc)");
2900
3079
  }
2901
- const cursorIgnorePath = join18(baseDir, ".cursorignore");
3080
+ const cursorIgnorePath = join19(baseDir, ".cursorignore");
2902
3081
  if (await fileExists(cursorIgnorePath)) {
2903
3082
  try {
2904
3083
  const content = await readFileContent(cursorIgnorePath);
@@ -2911,7 +3090,7 @@ async function parseCursorConfiguration(baseDir = process.cwd()) {
2911
3090
  errors.push(`Failed to parse .cursorignore: ${errorMessage}`);
2912
3091
  }
2913
3092
  }
2914
- const cursorMcpPath = join18(baseDir, ".cursor", "mcp.json");
3093
+ const cursorMcpPath = join19(baseDir, ".cursor", "mcp.json");
2915
3094
  if (await fileExists(cursorMcpPath)) {
2916
3095
  try {
2917
3096
  const content = await readFileContent(cursorMcpPath);
@@ -2960,11 +3139,11 @@ async function parseGeminiConfiguration(baseDir = process.cwd()) {
2960
3139
  }
2961
3140
 
2962
3141
  // src/parsers/junie.ts
2963
- import { join as join19 } from "path";
3142
+ import { join as join20 } from "path";
2964
3143
  async function parseJunieConfiguration(baseDir = process.cwd()) {
2965
3144
  const errors = [];
2966
3145
  const rules = [];
2967
- const guidelinesPath = join19(baseDir, ".junie", "guidelines.md");
3146
+ const guidelinesPath = join20(baseDir, ".junie", "guidelines.md");
2968
3147
  if (!await fileExists(guidelinesPath)) {
2969
3148
  errors.push(".junie/guidelines.md file not found");
2970
3149
  return { rules, errors };
@@ -3099,7 +3278,7 @@ async function importConfiguration(options) {
3099
3278
  if (rules.length === 0 && !ignorePatterns && !mcpServers) {
3100
3279
  return { success: false, rulesCreated: 0, errors };
3101
3280
  }
3102
- const rulesDirPath = join20(baseDir, rulesDir);
3281
+ const rulesDirPath = join21(baseDir, rulesDir);
3103
3282
  try {
3104
3283
  const { mkdir: mkdir3 } = await import("fs/promises");
3105
3284
  await mkdir3(rulesDirPath, { recursive: true });
@@ -3113,7 +3292,7 @@ async function importConfiguration(options) {
3113
3292
  try {
3114
3293
  const baseFilename = rule.filename;
3115
3294
  const filename = await generateUniqueFilename(rulesDirPath, baseFilename);
3116
- const filePath = join20(rulesDirPath, `${filename}.md`);
3295
+ const filePath = join21(rulesDirPath, `${filename}.md`);
3117
3296
  const content = generateRuleFileContent(rule);
3118
3297
  await writeFileContent(filePath, content);
3119
3298
  rulesCreated++;
@@ -3128,7 +3307,7 @@ async function importConfiguration(options) {
3128
3307
  let ignoreFileCreated = false;
3129
3308
  if (ignorePatterns && ignorePatterns.length > 0) {
3130
3309
  try {
3131
- const rulesyncignorePath = join20(baseDir, ".rulesyncignore");
3310
+ const rulesyncignorePath = join21(baseDir, ".rulesyncignore");
3132
3311
  const ignoreContent = `${ignorePatterns.join("\n")}
3133
3312
  `;
3134
3313
  await writeFileContent(rulesyncignorePath, ignoreContent);
@@ -3144,7 +3323,7 @@ async function importConfiguration(options) {
3144
3323
  let mcpFileCreated = false;
3145
3324
  if (mcpServers && Object.keys(mcpServers).length > 0) {
3146
3325
  try {
3147
- const mcpPath = join20(baseDir, rulesDir, ".mcp.json");
3326
+ const mcpPath = join21(baseDir, rulesDir, ".mcp.json");
3148
3327
  const mcpContent = `${JSON.stringify({ mcpServers }, null, 2)}
3149
3328
  `;
3150
3329
  await writeFileContent(mcpPath, mcpContent);
@@ -3172,7 +3351,7 @@ function generateRuleFileContent(rule) {
3172
3351
  async function generateUniqueFilename(rulesDir, baseFilename) {
3173
3352
  let filename = baseFilename;
3174
3353
  let counter = 1;
3175
- while (await fileExists(join20(rulesDir, `${filename}.md`))) {
3354
+ while (await fileExists(join21(rulesDir, `${filename}.md`))) {
3176
3355
  filename = `${baseFilename}-${counter}`;
3177
3356
  counter++;
3178
3357
  }
@@ -3239,7 +3418,7 @@ async function importCommand(options = {}) {
3239
3418
  }
3240
3419
 
3241
3420
  // src/cli/commands/init.ts
3242
- import { join as join21 } from "path";
3421
+ import { join as join22 } from "path";
3243
3422
  async function initCommand() {
3244
3423
  const aiRulesDir = ".rulesync";
3245
3424
  console.log("Initializing rulesync...");
@@ -3286,7 +3465,7 @@ globs: ["**/*"]
3286
3465
  - Follow single responsibility principle
3287
3466
  `
3288
3467
  };
3289
- const filepath = join21(aiRulesDir, sampleFile.filename);
3468
+ const filepath = join22(aiRulesDir, sampleFile.filename);
3290
3469
  if (!await fileExists(filepath)) {
3291
3470
  await writeFileContent(filepath, sampleFile.content);
3292
3471
  console.log(`Created ${filepath}`);
@@ -3430,12 +3609,12 @@ async function watchCommand() {
3430
3609
 
3431
3610
  // src/cli/index.ts
3432
3611
  var program = new Command();
3433
- program.name("rulesync").description("Unified AI rules management CLI tool").version("0.53.0");
3612
+ program.name("rulesync").description("Unified AI rules management CLI tool").version("0.54.0");
3434
3613
  program.command("init").description("Initialize rulesync in current directory").action(initCommand);
3435
3614
  program.command("add <filename>").description("Add a new rule file").action(addCommand);
3436
3615
  program.command("gitignore").description("Add generated files to .gitignore").action(gitignoreCommand);
3437
3616
  program.command("import").description("Import configurations from AI tools to rulesync format").option("--augmentcode", "Import from AugmentCode (.augment/rules/)").option("--augmentcode-legacy", "Import from AugmentCode legacy format (.augment-guidelines)").option("--claudecode", "Import from Claude Code (CLAUDE.md)").option("--cursor", "Import from Cursor (.cursorrules)").option("--copilot", "Import from GitHub Copilot (.github/copilot-instructions.md)").option("--cline", "Import from Cline (.cline/instructions.md)").option("--roo", "Import from Roo Code (.roo/instructions.md)").option("--geminicli", "Import from Gemini CLI (GEMINI.md)").option("--junie", "Import from JetBrains Junie (.junie/guidelines.md)").option("-v, --verbose", "Verbose output").action(importCommand);
3438
- program.command("generate").description("Generate configuration files for AI tools").option("--augmentcode", "Generate only for AugmentCode").option("--augmentcode-legacy", "Generate only for AugmentCode legacy format").option("--copilot", "Generate only for GitHub Copilot").option("--cursor", "Generate only for Cursor").option("--cline", "Generate only for Cline").option("--claudecode", "Generate only for Claude Code").option("--roo", "Generate only for Roo Code").option("--geminicli", "Generate only for Gemini CLI").option("--junie", "Generate only for JetBrains Junie").option("--kiro", "Generate only for Kiro IDE").option("--delete", "Delete all existing files in output directories before generating").option(
3617
+ program.command("generate").description("Generate configuration files for AI tools").option("--augmentcode", "Generate only for AugmentCode").option("--augmentcode-legacy", "Generate only for AugmentCode legacy format").option("--copilot", "Generate only for GitHub Copilot").option("--cursor", "Generate only for Cursor").option("--cline", "Generate only for Cline").option("--codexcli", "Generate only for OpenAI Codex CLI").option("--claudecode", "Generate only for Claude Code").option("--roo", "Generate only for Roo Code").option("--geminicli", "Generate only for Gemini CLI").option("--junie", "Generate only for JetBrains Junie").option("--kiro", "Generate only for Kiro IDE").option("--delete", "Delete all existing files in output directories before generating").option(
3439
3618
  "-b, --base-dir <paths>",
3440
3619
  "Base directories to generate files (comma-separated for multiple paths)"
3441
3620
  ).option("-v, --verbose", "Verbose output").option("-c, --config <path>", "Path to configuration file").option("--no-config", "Disable configuration file loading").action(async (options) => {
@@ -3445,6 +3624,7 @@ program.command("generate").description("Generate configuration files for AI too
3445
3624
  if (options.copilot) tools.push("copilot");
3446
3625
  if (options.cursor) tools.push("cursor");
3447
3626
  if (options.cline) tools.push("cline");
3627
+ if (options.codexcli) tools.push("codexcli");
3448
3628
  if (options.claudecode) tools.push("claudecode");
3449
3629
  if (options.roo) tools.push("roo");
3450
3630
  if (options.geminicli) tools.push("geminicli");
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generateJunieMcp,
3
3
  generateJunieMcpConfiguration
4
- } from "./chunk-Y26DXTAT.js";
5
- import "./chunk-USKQYIZ2.js";
4
+ } from "./chunk-TJKD6LEW.js";
5
+ import "./chunk-VI6SBYFB.js";
6
6
  export {
7
7
  generateJunieMcp,
8
8
  generateJunieMcpConfiguration
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generateKiroMcp,
3
3
  generateKiroMcpConfiguration
4
- } from "./chunk-QUJMXHNR.js";
5
- import "./chunk-USKQYIZ2.js";
4
+ } from "./chunk-QVPD6ENS.js";
5
+ import "./chunk-VI6SBYFB.js";
6
6
  export {
7
7
  generateKiroMcp,
8
8
  generateKiroMcpConfiguration
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generateRooMcp,
3
3
  generateRooMcpConfiguration
4
- } from "./chunk-FFW6TGCM.js";
5
- import "./chunk-USKQYIZ2.js";
4
+ } from "./chunk-BEPSWIZC.js";
5
+ import "./chunk-VI6SBYFB.js";
6
6
  export {
7
7
  generateRooMcp,
8
8
  generateRooMcpConfiguration
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rulesync",
3
- "version": "0.53.0",
3
+ "version": "0.54.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",