diff --git a/src/features/rules/rulesync-rule.test.ts b/src/features/rules/rulesync-rule.test.ts index c4fb88ddc..990398ea3 100644 --- a/src/features/rules/rulesync-rule.test.ts +++ b/src/features/rules/rulesync-rule.test.ts @@ -401,6 +401,94 @@ Subproject-specific rule body`; expect(rule.getBody()).toBe("Subproject-specific rule body"); }); + it("should handle copilot configuration in frontmatter", async () => { + const rulesDir = join(testDir, RULESYNC_RULES_RELATIVE_DIR_PATH); + await ensureDir(rulesDir); + + const ruleContent = `--- +root: false +targets: + - copilot +description: Copilot rule +copilot: + excludeAgent: "code-review" +--- + +Copilot-specific rule body`; + + const filePath = join(rulesDir, "copilot-rule.md"); + await writeFileContent(filePath, ruleContent); + + const rule = await RulesyncRule.fromFile({ + relativeFilePath: "copilot-rule.md", + }); + + expect(rule.getFrontmatter().copilot).toEqual({ + excludeAgent: "code-review", + }); + expect(rule.getBody()).toBe("Copilot-specific rule body"); + }); + + it("should handle claudecode configuration in frontmatter", async () => { + const rulesDir = join(testDir, RULESYNC_RULES_RELATIVE_DIR_PATH); + await ensureDir(rulesDir); + + const ruleContent = `--- +root: false +targets: + - claudecode +description: Claude Code rule +claudecode: + paths: + - "src/**/*.ts" +--- + +Claude Code-specific rule body`; + + const filePath = join(rulesDir, "claudecode-rule.md"); + await writeFileContent(filePath, ruleContent); + + const rule = await RulesyncRule.fromFile({ + relativeFilePath: "claudecode-rule.md", + }); + + expect(rule.getFrontmatter().claudecode).toEqual({ + paths: ["src/**/*.ts"], + }); + expect(rule.getBody()).toBe("Claude Code-specific rule body"); + }); + + it("should handle antigravity configuration in frontmatter", async () => { + const rulesDir = join(testDir, RULESYNC_RULES_RELATIVE_DIR_PATH); + await ensureDir(rulesDir); + + const ruleContent = `--- +root: false +targets: + - antigravity +description: Antigravity rule +antigravity: + trigger: "glob" + globs: + - "*.md" +--- + +Antigravity-specific rule body`; + + const filePath = join(rulesDir, "antigravity-rule.md"); + await writeFileContent(filePath, ruleContent); + + const rule = await RulesyncRule.fromFile({ + relativeFilePath: "antigravity-rule.md", + }); + + expect(rule.getFrontmatter().antigravity).toEqual({ + trigger: "glob", + globs: ["*.md"], + }); + expect(rule.getBody()).toBe("Antigravity-specific rule body"); + }); + it("should load rule with localRoot field", async () => { const rulesDir = join(testDir, RULESYNC_RULES_RELATIVE_DIR_PATH); await ensureDir(rulesDir); diff --git a/src/features/rules/rulesync-rule.ts b/src/features/rules/rulesync-rule.ts index cc2f4cd60..f253f2dde 100644 --- a/src/features/rules/rulesync-rule.ts +++ b/src/features/rules/rulesync-rule.ts @@ -163,7 +163,10 @@ export class RulesyncRule extends RulesyncFile { description: result.data.description, globs: result.data.globs ?? [], agentsmd: result.data.agentsmd, + claudecode: result.data.claudecode, cursor: result.data.cursor, + copilot: result.data.copilot, + antigravity: result.data.antigravity, }; return new RulesyncRule({