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.
- package/README.ja.md +186 -23
- package/README.md +101 -25
- package/dist/{augmentcode-ICLQ2NEZ.js → augmentcode-MJYD2Y4S.js} +2 -2
- package/dist/{chunk-TTHBLXOB.js → chunk-3PHMFVXP.js} +1 -1
- package/dist/{chunk-FFW6TGCM.js → chunk-BEPSWIZC.js} +1 -1
- package/dist/chunk-D7XQ4OHK.js +145 -0
- package/dist/{chunk-OPZOVKIL.js → chunk-ORNO5MOO.js} +1 -1
- package/dist/{chunk-Y2XH4E5R.js → chunk-OXKDEZJK.js} +1 -1
- package/dist/{chunk-FNL2KPM3.js → chunk-OY6BYYIX.js} +1 -1
- package/dist/{chunk-YPIFCGAP.js → chunk-PPAQWVXX.js} +1 -1
- package/dist/{chunk-QUJMXHNR.js → chunk-QVPD6ENS.js} +1 -1
- package/dist/{chunk-Y26DXTAT.js → chunk-TJKD6LEW.js} +1 -1
- package/dist/{chunk-HMMTSS5E.js → chunk-UHANRG2O.js} +1 -1
- package/dist/{chunk-IXCMY24P.js → chunk-UZCJNUXO.js} +1 -1
- package/dist/{chunk-USKQYIZ2.js → chunk-VI6SBYFB.js} +1 -0
- package/dist/{claudecode-4XWK2WAY.js → claudecode-CKGUHLRR.js} +3 -3
- package/dist/{cline-MNXOHP77.js → cline-Z5C656VR.js} +3 -3
- package/dist/codexcli-VFUJKSIJ.js +10 -0
- package/dist/{copilot-ARYIWVJ7.js → copilot-4WQS5TA7.js} +2 -2
- package/dist/{cursor-FCS74IAH.js → cursor-HOB2F2V2.js} +2 -2
- package/dist/{geminicli-VOPV6DXZ.js → geminicli-XTMQTIU2.js} +2 -2
- package/dist/index.cjs +267 -21
- package/dist/index.js +213 -33
- package/dist/{junie-A2Y2WZI4.js → junie-AN6CR7DD.js} +2 -2
- package/dist/{kiro-MHIK4UBV.js → kiro-PTUZOHQ2.js} +2 -2
- package/dist/{roo-VG4IUNTE.js → roo-WOMS36KU.js} +2 -2
- 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-
|
|
7
|
+
} from "./chunk-QVPD6ENS.js";
|
|
5
8
|
import {
|
|
6
9
|
generateRooMcp
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-BEPSWIZC.js";
|
|
8
11
|
import {
|
|
9
12
|
generateAugmentcodeMcp
|
|
10
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ORNO5MOO.js";
|
|
11
14
|
import {
|
|
12
15
|
generateClaudeMcp
|
|
13
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OY6BYYIX.js";
|
|
14
17
|
import {
|
|
15
18
|
generateClineMcp
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import
|
|
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-
|
|
26
|
+
} from "./chunk-OXKDEZJK.js";
|
|
21
27
|
import {
|
|
22
28
|
generateCursorMcp
|
|
23
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-3PHMFVXP.js";
|
|
24
30
|
import {
|
|
25
31
|
generateGeminiCliMcp
|
|
26
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
|
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 =
|
|
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.
|
|
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");
|