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.
- package/dist/index.cjs +177 -42
- package/dist/index.js +177 -42
- 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
|
|
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
|
-
|
|
6945
|
-
"**/.
|
|
6946
|
-
"**/.
|
|
6947
|
-
"**/.
|
|
6948
|
-
|
|
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
|
-
"
|
|
6957
|
-
|
|
6958
|
-
"**/.
|
|
6959
|
-
"**/.
|
|
6960
|
-
"**/.
|
|
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
|
-
|
|
6966
|
-
"**/.
|
|
6967
|
-
"**/.
|
|
6968
|
-
"**/.
|
|
6969
|
-
"**/.
|
|
6970
|
-
"**/.
|
|
6971
|
-
|
|
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
|
-
|
|
6993
|
+
// Kiro
|
|
6994
|
+
"**/.kiro/steering/",
|
|
6995
|
+
"**/.aiignore",
|
|
6996
|
+
// OpenCode
|
|
6975
6997
|
"**/.opencode/memories/",
|
|
6976
6998
|
"**/.opencode/commands/",
|
|
6977
6999
|
"**/opencode.json",
|
|
6978
|
-
|
|
6979
|
-
"
|
|
6980
|
-
"**/.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
7240
|
-
|
|
7241
|
-
|
|
7242
|
-
|
|
7243
|
-
|
|
7244
|
-
|
|
7245
|
-
|
|
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 ${
|
|
7382
|
+
logger.info(`Skipped ${ignoreFilepath} (already exists)`);
|
|
7248
7383
|
}
|
|
7249
7384
|
}
|
|
7250
7385
|
|
|
7251
7386
|
// src/cli/index.ts
|
|
7252
|
-
var getVersion = () => "3.
|
|
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
|
|
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
|
-
|
|
6922
|
-
"**/.
|
|
6923
|
-
"**/.
|
|
6924
|
-
"**/.
|
|
6925
|
-
|
|
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
|
-
"
|
|
6934
|
-
|
|
6935
|
-
"**/.
|
|
6936
|
-
"**/.
|
|
6937
|
-
"**/.
|
|
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
|
-
|
|
6943
|
-
"**/.
|
|
6944
|
-
"**/.
|
|
6945
|
-
"**/.
|
|
6946
|
-
"**/.
|
|
6947
|
-
"**/.
|
|
6948
|
-
|
|
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
|
-
|
|
6970
|
+
// Kiro
|
|
6971
|
+
"**/.kiro/steering/",
|
|
6972
|
+
"**/.aiignore",
|
|
6973
|
+
// OpenCode
|
|
6952
6974
|
"**/.opencode/memories/",
|
|
6953
6975
|
"**/.opencode/commands/",
|
|
6954
6976
|
"**/opencode.json",
|
|
6955
|
-
|
|
6956
|
-
"
|
|
6957
|
-
"**/.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
7217
|
-
|
|
7218
|
-
|
|
7219
|
-
|
|
7220
|
-
|
|
7221
|
-
|
|
7222
|
-
|
|
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 ${
|
|
7359
|
+
logger.info(`Skipped ${ignoreFilepath} (already exists)`);
|
|
7225
7360
|
}
|
|
7226
7361
|
}
|
|
7227
7362
|
|
|
7228
7363
|
// src/cli/index.ts
|
|
7229
|
-
var getVersion = () => "3.
|
|
7364
|
+
var getVersion = () => "3.7.0";
|
|
7230
7365
|
var main = async () => {
|
|
7231
7366
|
const program = new Command();
|
|
7232
7367
|
const version = getVersion();
|