Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/solutions/adding-converter-target-providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ export async function backupFile(filePath: string): Promise<string | null> {
4. **Empty bundles should succeed gracefully** — Don't fail if a component array is empty. Many plugins may have no commands or no skills.

5. **File extensions matter** — Match target conventions exactly:
- Copilot: `.agent.md` (note the dot)
- Copilot: `.md` for agents (VS Code parses `.agent.md` as Copilot format and silently drops Claude-style tool names; `.md` triggers Claude format detection and maps tools to VS Code equivalents)
- Windsurf: `.md` for rules
- OpenCode: `.md` for commands

Expand Down
4 changes: 2 additions & 2 deletions plugins/compound-engineering/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Before committing ANY changes:

```
agents/
└── ce-*.agent.md # All agents live flat under agents/, prefixed with ce-
└── ce-*.md # All agents live flat under agents/, prefixed with ce-

skills/
├── ce-*/ # Core workflow skills (ce-plan, ce-code-review, etc.)
Expand Down Expand Up @@ -299,7 +299,7 @@ grep -E '^description:' skills/*/SKILL.md
## Adding Components

- **New skill:** Create `skills/<name>/SKILL.md` with required YAML frontmatter (`name`, `description`). Reference files go in `skills/<name>/references/`. Add the skill to the appropriate category table in `README.md` and update the skill count.
- **New agent:** Create `agents/ce-<name>.agent.md` with frontmatter (the `ce-` prefix is required). Add the agent to the appropriate topical section of `README.md` (Review, Document Review, Research, Design, Workflow, Docs) and update the agent count.
- **New agent:** Create `agents/ce-<name>.md` with frontmatter (the `ce-` prefix is required). Add the agent to the appropriate topical section of `README.md` (Review, Document Review, Research, Design, Workflow, Docs) and update the agent count.

### Adding a New Plugin to This Repo

Expand Down
6 changes: 3 additions & 3 deletions tests/frontmatter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,10 @@ describe("frontmatter YAML validity", () => {

if (
pluginRoot === "plugins/compound-engineering" &&
/^agents\/[^/]+\.agent\.md$/.test(rel)
/^agents\/[^/]+\.md$/.test(rel)
) {
test(`${pluginRoot}/${rel} agent name uses ce- prefix`, () => {
const fileName = path.basename(rel, ".agent.md")
const fileName = path.basename(rel, ".md")
expect(
fileName.startsWith("ce-"),
`Agent "${fileName}" must use the ce- prefix.`,
Expand All @@ -153,7 +153,7 @@ describe("frontmatter YAML validity", () => {
const NO_BASH_AGENTS = new Set([
"ce-coherence-reviewer",
])
const agentName = path.basename(rel, ".agent.md")
const agentName = path.basename(rel, ".md")
if (NO_BASH_AGENTS.has(agentName)) {
test(`${pluginRoot}/${rel} pure document reviewer must not allow Bash`, () => {
const parsed = load(yaml) as Record<string, unknown> | null
Expand Down
2 changes: 1 addition & 1 deletion tests/kiro-writer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe("writeKiroBundle", () => {
const kiroRoot = path.join(tempRoot, ".kiro")
await fs.mkdir(path.join(kiroRoot, "agents", "prompts"), { recursive: true })
const sessionHistorianDescription = await pluginDescription(
"plugins/compound-engineering/agents/ce-session-historian.agent.md",
"plugins/compound-engineering/agents/ce-session-historian.md",
)

await fs.writeFile(
Expand Down
26 changes: 16 additions & 10 deletions tests/legacy-cleanup.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -299,14 +299,14 @@ describe("cleanupStaleAgents", () => {
path.join(root, "adversarial-reviewer.md"),
agentContent(
"adversarial-reviewer",
await pluginDescription("plugins/compound-engineering/agents/ce-adversarial-reviewer.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-adversarial-reviewer.md"),
),
)
await createFile(
path.join(root, "learnings-researcher.md"),
agentContent(
"learnings-researcher",
await pluginDescription("plugins/compound-engineering/agents/ce-learnings-researcher.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-learnings-researcher.md"),
),
)

Expand All @@ -317,20 +317,26 @@ describe("cleanupStaleAgents", () => {
expect(await exists(path.join(root, "learnings-researcher.md"))).toBe(false)
})

test("removes .agent.md files (Copilot format)", async () => {
test("removes .agent.md files (legacy Copilot extension)", async () => {
// Even though current CE agent source files are now `.md` (renamed for VS
// Code Copilot tool access in PR #846), `getLegacyCopilotArtifacts` still
// enumerates `<name>.agent.md` candidates so `cleanupCopilot` can sweep
// stale flat installs from the pre-rename era. Keep this fixture on
// `.agent.md` so a regression in that legacy extension path is caught
// here -- the preceding test already covers the `.md` shape.
const root = await fs.mkdtemp(path.join(os.tmpdir(), "cleanup-agents-copilot-"))
await createFile(
path.join(root, "security-sentinel.agent.md"),
agentContent(
"security-sentinel",
await pluginDescription("plugins/compound-engineering/agents/ce-security-sentinel.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-security-sentinel.md"),
),
)
await createFile(
path.join(root, "performance-oracle.agent.md"),
agentContent(
"performance-oracle",
await pluginDescription("plugins/compound-engineering/agents/ce-performance-oracle.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-performance-oracle.md"),
),
)

Expand All @@ -346,14 +352,14 @@ describe("cleanupStaleAgents", () => {
path.join(root, "slack-researcher.json"),
kiroAgentConfigContent(
"slack-researcher",
await pluginDescription("plugins/compound-engineering/agents/ce-slack-researcher.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-slack-researcher.md"),
),
)
await createFile(
path.join(root, "session-historian.json"),
kiroAgentConfigContent(
"session-historian",
await pluginDescription("plugins/compound-engineering/agents/ce-session-historian.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-session-historian.md"),
),
)
await createFile(
Expand All @@ -378,14 +384,14 @@ describe("cleanupStaleAgents", () => {
path.join(root, "code-simplicity-reviewer"),
skillContent(
"code-simplicity-reviewer",
await pluginDescription("plugins/compound-engineering/agents/ce-code-simplicity-reviewer.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-code-simplicity-reviewer.md"),
),
)
await createDir(
path.join(root, "repo-research-analyst"),
skillContent(
"repo-research-analyst",
await pluginDescription("plugins/compound-engineering/agents/ce-repo-research-analyst.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-repo-research-analyst.md"),
),
)

Expand Down Expand Up @@ -660,7 +666,7 @@ describe("idempotency", () => {
path.join(root, "adversarial-reviewer.md"),
agentContent(
"adversarial-reviewer",
await pluginDescription("plugins/compound-engineering/agents/ce-adversarial-reviewer.agent.md"),
await pluginDescription("plugins/compound-engineering/agents/ce-adversarial-reviewer.md"),
),
)

Expand Down
2 changes: 1 addition & 1 deletion tests/pi-writer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ describe("writePiBundle", () => {
const outputRoot = path.join(tempRoot, ".pi")

const sessionHistorianDescription = await pluginDescription(
"plugins/compound-engineering/agents/ce-session-historian.agent.md",
"plugins/compound-engineering/agents/ce-session-historian.md",
)

await fs.mkdir(path.join(outputRoot, "skills", "session-historian"), { recursive: true })
Expand Down
2 changes: 1 addition & 1 deletion tests/pipeline-review-contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ describe("ce-compound frontmatter schema expansion contract", () => {
describe("ce-learnings-researcher domain-agnostic contract", () => {
test("agent prompt frames as domain-agnostic not bug-focused", async () => {
const agent = await readRepoFile(
"plugins/compound-engineering/agents/ce-learnings-researcher.agent.md"
"plugins/compound-engineering/agents/ce-learnings-researcher.md"
)

// Domain-agnostic identity framing
Expand Down
18 changes: 9 additions & 9 deletions tests/review-skill-contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ describe("ce-code-review contract", () => {
]

for (const persona of personas) {
const content = await readRepoFile(`plugins/compound-engineering/agents/${persona}.agent.md`)
const content = await readRepoFile(`plugins/compound-engineering/agents/${persona}.md`)

// Anchored language appears
expect(content).toMatch(/Anchor (75|100)/)
Expand Down Expand Up @@ -547,23 +547,23 @@ describe("ce-code-review contract", () => {
test("stack-specific reviewer agents follow the structured findings contract", async () => {
const reviewers = [
{
path: "plugins/compound-engineering/agents/ce-dhh-rails-reviewer.agent.md",
path: "plugins/compound-engineering/agents/ce-dhh-rails-reviewer.md",
reviewer: "dhh-rails",
},
{
path: "plugins/compound-engineering/agents/ce-kieran-rails-reviewer.agent.md",
path: "plugins/compound-engineering/agents/ce-kieran-rails-reviewer.md",
reviewer: "kieran-rails",
},
{
path: "plugins/compound-engineering/agents/ce-kieran-python-reviewer.agent.md",
path: "plugins/compound-engineering/agents/ce-kieran-python-reviewer.md",
reviewer: "kieran-python",
},
{
path: "plugins/compound-engineering/agents/ce-kieran-typescript-reviewer.agent.md",
path: "plugins/compound-engineering/agents/ce-kieran-typescript-reviewer.md",
reviewer: "kieran-typescript",
},
{
path: "plugins/compound-engineering/agents/ce-julik-frontend-races-reviewer.agent.md",
path: "plugins/compound-engineering/agents/ce-julik-frontend-races-reviewer.md",
reviewer: "julik-frontend-races",
},
]
Expand Down Expand Up @@ -611,7 +611,7 @@ describe("ce-code-review contract", () => {
]

for (const persona of personas) {
const content = await readRepoFile(`plugins/compound-engineering/agents/${persona}.agent.md`)
const content = await readRepoFile(`plugins/compound-engineering/agents/${persona}.md`)
const parsed = parseFrontmatter(content)
const tools = String(parsed.data.tools ?? "")

Expand All @@ -621,7 +621,7 @@ describe("ce-code-review contract", () => {

test("leaves data-migration-expert as the unstructured review format", async () => {
const content = await readRepoFile(
"plugins/compound-engineering/agents/ce-data-migration-expert.agent.md",
"plugins/compound-engineering/agents/ce-data-migration-expert.md",
)

expect(content).toContain("## Reviewer Checklist")
Expand Down Expand Up @@ -777,7 +777,7 @@ describe("ce-code-review contract", () => {

describe("testing-reviewer contract", () => {
test("includes behavioral-changes-with-no-test-additions check", async () => {
const content = await readRepoFile("plugins/compound-engineering/agents/ce-testing-reviewer.agent.md")
const content = await readRepoFile("plugins/compound-engineering/agents/ce-testing-reviewer.md")

// New check exists in "What you're hunting for" section
expect(content).toContain("Behavioral changes with no test additions")
Expand Down
2 changes: 1 addition & 1 deletion tests/skill-agent-ce-prefix.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe("compound-engineering agent ce- prefix", () => {
const agentFiles = readdirSync(AGENTS_DIR, { withFileTypes: true })
.filter((entry) =>
entry.isFile() &&
entry.name.endsWith(".agent.md") &&
entry.name.endsWith(".md") &&
!AGENT_EXEMPTIONS.has(entry.name),
)
.map((entry) => entry.name)
Expand Down
2 changes: 1 addition & 1 deletion tests/skills/ce-session-historian-no-skill-tool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { describe, expect, test } from "bun:test"

const AGENT_PATH = path.join(
process.cwd(),
"plugins/compound-engineering/agents/ce-session-historian.agent.md",
"plugins/compound-engineering/agents/ce-session-historian.md",
)
const AGENT_BODY = readFileSync(AGENT_PATH, "utf8")

Expand Down