@every-env/compound-plugin 0.2.0 → 0.3.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/.claude-plugin/marketplace.json +2 -2
- package/docs/plans/2026-02-08-refactor-reduce-plugin-context-token-usage-plan.md +212 -0
- package/package.json +1 -1
- package/plugins/compound-engineering/.claude-plugin/plugin.json +2 -2
- package/plugins/compound-engineering/CHANGELOG.md +26 -0
- package/plugins/compound-engineering/agents/design/design-implementation-reviewer.md +16 -1
- package/plugins/compound-engineering/agents/design/design-iterator.md +28 -1
- package/plugins/compound-engineering/agents/design/figma-design-sync.md +19 -1
- package/plugins/compound-engineering/agents/docs/ankane-readme-writer.md +16 -1
- package/plugins/compound-engineering/agents/research/best-practices-researcher.md +16 -1
- package/plugins/compound-engineering/agents/research/framework-docs-researcher.md +16 -1
- package/plugins/compound-engineering/agents/research/git-history-analyzer.md +16 -1
- package/plugins/compound-engineering/agents/research/learnings-researcher.md +22 -1
- package/plugins/compound-engineering/agents/research/repo-research-analyst.md +22 -1
- package/plugins/compound-engineering/agents/review/agent-native-reviewer.md +16 -1
- package/plugins/compound-engineering/agents/review/architecture-strategist.md +16 -1
- package/plugins/compound-engineering/agents/review/code-simplicity-reviewer.md +16 -1
- package/plugins/compound-engineering/agents/review/data-integrity-guardian.md +16 -1
- package/plugins/compound-engineering/agents/review/data-migration-expert.md +16 -1
- package/plugins/compound-engineering/agents/review/deployment-verification-agent.md +16 -1
- package/plugins/compound-engineering/agents/review/dhh-rails-reviewer.md +22 -1
- package/plugins/compound-engineering/agents/review/julik-frontend-races-reviewer.md +20 -21
- package/plugins/compound-engineering/agents/review/kieran-python-reviewer.md +30 -1
- package/plugins/compound-engineering/agents/review/kieran-rails-reviewer.md +30 -1
- package/plugins/compound-engineering/agents/review/kieran-typescript-reviewer.md +30 -1
- package/plugins/compound-engineering/agents/review/pattern-recognition-specialist.md +16 -1
- package/plugins/compound-engineering/agents/review/performance-oracle.md +28 -1
- package/plugins/compound-engineering/agents/review/schema-drift-detector.md +16 -1
- package/plugins/compound-engineering/agents/review/security-sentinel.md +22 -1
- package/plugins/compound-engineering/agents/workflow/bug-reproduction-validator.md +16 -1
- package/plugins/compound-engineering/agents/workflow/every-style-editor.md +1 -1
- package/plugins/compound-engineering/agents/workflow/pr-comment-resolver.md +16 -1
- package/plugins/compound-engineering/agents/workflow/spec-flow-analyzer.md +22 -1
- package/plugins/compound-engineering/commands/agent-native-audit.md +1 -0
- package/plugins/compound-engineering/commands/changelog.md +1 -0
- package/plugins/compound-engineering/commands/create-agent-skill.md +1 -0
- package/plugins/compound-engineering/commands/deploy-docs.md +1 -0
- package/plugins/compound-engineering/commands/generate_command.md +1 -0
- package/plugins/compound-engineering/commands/heal-skill.md +1 -0
- package/plugins/compound-engineering/commands/lfg.md +1 -0
- package/plugins/compound-engineering/commands/release-docs.md +1 -0
- package/plugins/compound-engineering/commands/report-bug.md +1 -0
- package/plugins/compound-engineering/commands/reproduce-bug.md +1 -0
- package/plugins/compound-engineering/commands/resolve_parallel.md +1 -0
- package/plugins/compound-engineering/commands/slfg.md +1 -0
- package/plugins/compound-engineering/commands/technical_review.md +1 -0
- package/plugins/compound-engineering/commands/{xcode-test.md → test-xcode.md} +2 -1
- package/plugins/compound-engineering/commands/triage.md +1 -0
- package/plugins/compound-engineering/skills/compound-docs/SKILL.md +1 -0
- package/plugins/compound-engineering/skills/file-todos/SKILL.md +1 -0
- package/plugins/compound-engineering/skills/orchestrating-swarms/SKILL.md +1 -0
- package/plugins/compound-engineering/skills/skill-creator/SKILL.md +1 -0
- package/src/converters/claude-to-codex.ts +2 -1
- package/src/converters/claude-to-opencode.ts +1 -0
- package/src/parsers/claude.ts +4 -0
- package/src/types/claude.ts +2 -0
- package/tests/claude-parser.test.ts +24 -2
- package/tests/codex-converter.test.ts +38 -0
- package/tests/converter.test.ts +15 -0
- package/tests/fixtures/sample-plugin/commands/disabled-command.md +7 -0
- package/tests/fixtures/sample-plugin/skills/disabled-skill/SKILL.md +7 -0
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-flow-analyzer
|
|
3
|
-
description: "
|
|
3
|
+
description: "Analyzes specifications and feature descriptions for user flow completeness and gap identification. Use when a spec, plan, or feature description needs flow analysis, edge case discovery, or requirements validation."
|
|
4
4
|
model: inherit
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
<examples>
|
|
8
|
+
<example>
|
|
9
|
+
Context: The user has just finished drafting a specification for OAuth implementation.
|
|
10
|
+
user: "Here's the OAuth spec for our new integration: [OAuth spec details]"
|
|
11
|
+
assistant: "Let me use the spec-flow-analyzer agent to analyze this OAuth specification for user flows and missing elements."
|
|
12
|
+
<commentary>Since the user has provided a specification document, use the Task tool to launch the spec-flow-analyzer agent to identify all user flows, edge cases, and missing clarifications.</commentary>
|
|
13
|
+
</example>
|
|
14
|
+
<example>
|
|
15
|
+
Context: The user is planning a new social sharing feature.
|
|
16
|
+
user: "I'm thinking we should add social sharing to posts. Users can share to Twitter, Facebook, and LinkedIn."
|
|
17
|
+
assistant: "This sounds like a feature specification that would benefit from flow analysis. Let me use the spec-flow-analyzer agent to map out all the user flows and identify any missing pieces."
|
|
18
|
+
<commentary>The user is describing a new feature. Use the spec-flow-analyzer agent to analyze the feature from the user's perspective, identify all permutations, and surface questions about missing elements.</commentary>
|
|
19
|
+
</example>
|
|
20
|
+
<example>
|
|
21
|
+
Context: The user has created a plan for a new onboarding flow.
|
|
22
|
+
user: "Can you review this onboarding plan and make sure we haven't missed anything?"
|
|
23
|
+
assistant: "I'll use the spec-flow-analyzer agent to thoroughly analyze this onboarding plan from the user's perspective."
|
|
24
|
+
<commentary>The user is explicitly asking for review of a plan. Use the spec-flow-analyzer agent to identify all user flows, edge cases, and gaps in the specification.</commentary>
|
|
25
|
+
</example>
|
|
26
|
+
</examples>
|
|
27
|
+
|
|
7
28
|
You are an elite User Experience Flow Analyst and Requirements Engineer. Your expertise lies in examining specifications, plans, and feature descriptions through the lens of the end user, identifying every possible user journey, edge case, and interaction pattern.
|
|
8
29
|
|
|
9
30
|
Your primary mission is to:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: changelog
|
|
3
3
|
description: Create engaging changelogs for recent merges to main branch
|
|
4
4
|
argument-hint: "[optional: daily|weekly, or time period in days]"
|
|
5
|
+
disable-model-invocation: true
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
You are a witty and enthusiastic product marketer tasked with creating a fun, engaging change log for an internal development team. Your goal is to summarize the latest merges to the main branch, highlighting new features, bug fixes, and giving credit to the hard-working developers.
|
|
@@ -3,6 +3,7 @@ name: create-agent-skill
|
|
|
3
3
|
description: Create or edit Claude Code skills with expert guidance on structure and best practices
|
|
4
4
|
allowed-tools: Skill(create-agent-skills)
|
|
5
5
|
argument-hint: [skill description or requirements]
|
|
6
|
+
disable-model-invocation: true
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
Invoke the create-agent-skills skill for: $ARGUMENTS
|
|
@@ -3,6 +3,7 @@ name: heal-skill
|
|
|
3
3
|
description: Fix incorrect SKILL.md files when a skill has wrong instructions or outdated API references
|
|
4
4
|
argument-hint: [optional: specific issue to fix]
|
|
5
5
|
allowed-tools: [Read, Edit, Bash(ls:*), Bash(git:*)]
|
|
6
|
+
disable-model-invocation: true
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
<objective>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: technical_review
|
|
3
3
|
description: Have multiple specialized agents review the technical approach and architecture of a plan in parallel
|
|
4
4
|
argument-hint: "[plan file path or plan content]"
|
|
5
|
+
disable-model-invocation: true
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
Have @agent-dhh-rails-reviewer @agent-kieran-rails-reviewer @agent-code-simplicity-reviewer review the technical approach in this plan in parallel.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: file-todos
|
|
3
3
|
description: This skill should be used when managing the file-based todo tracking system in the todos/ directory. It provides workflows for creating todos, managing status and dependencies, conducting triage, and integrating with slash commands and code review processes.
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# File-Based Todo Tracking Skill
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: orchestrating-swarms
|
|
3
3
|
description: This skill should be used when orchestrating multi-agent swarms using Claude Code's TeammateTool and Task system. It applies when coordinating multiple agents, running parallel code reviews, creating pipeline workflows with dependencies, building self-organizing task queues, or any task benefiting from divide-and-conquer patterns.
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Claude Code Swarm Orchestration
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: skill-creator
|
|
3
3
|
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
|
|
4
4
|
license: Complete terms in LICENSE.txt
|
|
5
|
+
disable-model-invocation: true
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Skill Creator
|
|
@@ -19,7 +19,8 @@ export function convertClaudeToCodex(
|
|
|
19
19
|
|
|
20
20
|
const usedSkillNames = new Set<string>(skillDirs.map((skill) => normalizeName(skill.name)))
|
|
21
21
|
const commandSkills: CodexGeneratedSkill[] = []
|
|
22
|
-
const
|
|
22
|
+
const invocableCommands = plugin.commands.filter((command) => !command.disableModelInvocation)
|
|
23
|
+
const prompts = invocableCommands.map((command) => {
|
|
23
24
|
const promptName = uniqueName(normalizeName(command.name), promptNames)
|
|
24
25
|
const commandSkill = convertCommandSkill(command, usedSkillNames)
|
|
25
26
|
commandSkills.push(commandSkill)
|
|
@@ -114,6 +114,7 @@ function convertAgent(agent: ClaudeAgent, options: ClaudeToOpenCodeOptions) {
|
|
|
114
114
|
function convertCommands(commands: ClaudeCommand[]): Record<string, OpenCodeCommandConfig> {
|
|
115
115
|
const result: Record<string, OpenCodeCommandConfig> = {}
|
|
116
116
|
for (const command of commands) {
|
|
117
|
+
if (command.disableModelInvocation) continue
|
|
117
118
|
const entry: OpenCodeCommandConfig = {
|
|
118
119
|
description: command.description,
|
|
119
120
|
template: command.body,
|
package/src/parsers/claude.ts
CHANGED
|
@@ -83,12 +83,14 @@ async function loadCommands(commandsDirs: string[]): Promise<ClaudeCommand[]> {
|
|
|
83
83
|
const { data, body } = parseFrontmatter(raw)
|
|
84
84
|
const name = (data.name as string) ?? path.basename(file, ".md")
|
|
85
85
|
const allowedTools = parseAllowedTools(data["allowed-tools"])
|
|
86
|
+
const disableModelInvocation = data["disable-model-invocation"] === true ? true : undefined
|
|
86
87
|
commands.push({
|
|
87
88
|
name,
|
|
88
89
|
description: data.description as string | undefined,
|
|
89
90
|
argumentHint: data["argument-hint"] as string | undefined,
|
|
90
91
|
model: data.model as string | undefined,
|
|
91
92
|
allowedTools,
|
|
93
|
+
disableModelInvocation,
|
|
92
94
|
body: body.trim(),
|
|
93
95
|
sourcePath: file,
|
|
94
96
|
})
|
|
@@ -104,9 +106,11 @@ async function loadSkills(skillsDirs: string[]): Promise<ClaudeSkill[]> {
|
|
|
104
106
|
const raw = await readText(file)
|
|
105
107
|
const { data } = parseFrontmatter(raw)
|
|
106
108
|
const name = (data.name as string) ?? path.basename(path.dirname(file))
|
|
109
|
+
const disableModelInvocation = data["disable-model-invocation"] === true ? true : undefined
|
|
107
110
|
skills.push({
|
|
108
111
|
name,
|
|
109
112
|
description: data.description as string | undefined,
|
|
113
|
+
disableModelInvocation,
|
|
110
114
|
sourceDir: path.dirname(file),
|
|
111
115
|
skillPath: file,
|
|
112
116
|
})
|
package/src/types/claude.ts
CHANGED
|
@@ -39,6 +39,7 @@ export type ClaudeCommand = {
|
|
|
39
39
|
argumentHint?: string
|
|
40
40
|
model?: string
|
|
41
41
|
allowedTools?: string[]
|
|
42
|
+
disableModelInvocation?: boolean
|
|
42
43
|
body: string
|
|
43
44
|
sourcePath: string
|
|
44
45
|
}
|
|
@@ -46,6 +47,7 @@ export type ClaudeCommand = {
|
|
|
46
47
|
export type ClaudeSkill = {
|
|
47
48
|
name: string
|
|
48
49
|
description?: string
|
|
50
|
+
disableModelInvocation?: boolean
|
|
49
51
|
sourceDir: string
|
|
50
52
|
skillPath: string
|
|
51
53
|
}
|
|
@@ -15,8 +15,8 @@ describe("loadClaudePlugin", () => {
|
|
|
15
15
|
|
|
16
16
|
expect(plugin.manifest.name).toBe("compound-engineering")
|
|
17
17
|
expect(plugin.agents.length).toBe(2)
|
|
18
|
-
expect(plugin.commands.length).toBe(
|
|
19
|
-
expect(plugin.skills.length).toBe(
|
|
18
|
+
expect(plugin.commands.length).toBe(7)
|
|
19
|
+
expect(plugin.skills.length).toBe(2)
|
|
20
20
|
expect(plugin.hooks).toBeDefined()
|
|
21
21
|
expect(plugin.mcpServers).toBeDefined()
|
|
22
22
|
|
|
@@ -55,6 +55,28 @@ describe("loadClaudePlugin", () => {
|
|
|
55
55
|
expect(plugin.mcpServers?.context7?.url).toBe("https://mcp.context7.com/mcp")
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
+
test("parses disable-model-invocation from commands", async () => {
|
|
59
|
+
const plugin = await loadClaudePlugin(fixtureRoot)
|
|
60
|
+
|
|
61
|
+
const disabledCommand = plugin.commands.find((command) => command.name === "deploy-docs")
|
|
62
|
+
expect(disabledCommand).toBeDefined()
|
|
63
|
+
expect(disabledCommand?.disableModelInvocation).toBe(true)
|
|
64
|
+
|
|
65
|
+
const normalCommand = plugin.commands.find((command) => command.name === "workflows:review")
|
|
66
|
+
expect(normalCommand?.disableModelInvocation).toBeUndefined()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test("parses disable-model-invocation from skills", async () => {
|
|
70
|
+
const plugin = await loadClaudePlugin(fixtureRoot)
|
|
71
|
+
|
|
72
|
+
const disabledSkill = plugin.skills.find((skill) => skill.name === "disabled-skill")
|
|
73
|
+
expect(disabledSkill).toBeDefined()
|
|
74
|
+
expect(disabledSkill?.disableModelInvocation).toBe(true)
|
|
75
|
+
|
|
76
|
+
const normalSkill = plugin.skills.find((skill) => skill.name === "skill-one")
|
|
77
|
+
expect(normalSkill?.disableModelInvocation).toBeUndefined()
|
|
78
|
+
})
|
|
79
|
+
|
|
58
80
|
test("loads MCP servers from .mcp.json when manifest is empty", async () => {
|
|
59
81
|
const plugin = await loadClaudePlugin(mcpFixtureRoot)
|
|
60
82
|
expect(plugin.mcpServers?.remote?.url).toBe("https://example.com/stream")
|
|
@@ -172,6 +172,44 @@ Don't confuse with file paths like /tmp/output.md or /dev/null.`,
|
|
|
172
172
|
expect(parsed.body).toContain("/dev/null")
|
|
173
173
|
})
|
|
174
174
|
|
|
175
|
+
test("excludes commands with disable-model-invocation from prompts and skills", () => {
|
|
176
|
+
const plugin: ClaudePlugin = {
|
|
177
|
+
...fixturePlugin,
|
|
178
|
+
commands: [
|
|
179
|
+
{
|
|
180
|
+
name: "normal-command",
|
|
181
|
+
description: "Normal command",
|
|
182
|
+
body: "Normal body.",
|
|
183
|
+
sourcePath: "/tmp/plugin/commands/normal.md",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: "disabled-command",
|
|
187
|
+
description: "Disabled command",
|
|
188
|
+
disableModelInvocation: true,
|
|
189
|
+
body: "Disabled body.",
|
|
190
|
+
sourcePath: "/tmp/plugin/commands/disabled.md",
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
agents: [],
|
|
194
|
+
skills: [],
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const bundle = convertClaudeToCodex(plugin, {
|
|
198
|
+
agentMode: "subagent",
|
|
199
|
+
inferTemperature: false,
|
|
200
|
+
permissions: "none",
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
// Only normal command should produce a prompt
|
|
204
|
+
expect(bundle.prompts).toHaveLength(1)
|
|
205
|
+
expect(bundle.prompts[0].name).toBe("normal-command")
|
|
206
|
+
|
|
207
|
+
// Only normal command should produce a generated skill
|
|
208
|
+
const commandSkills = bundle.generatedSkills.filter((s) => s.name === "normal-command" || s.name === "disabled-command")
|
|
209
|
+
expect(commandSkills).toHaveLength(1)
|
|
210
|
+
expect(commandSkills[0].name).toBe("normal-command")
|
|
211
|
+
})
|
|
212
|
+
|
|
175
213
|
test("truncates generated skill descriptions to Codex limits and single line", () => {
|
|
176
214
|
const longDescription = `Line one\nLine two ${"a".repeat(2000)}`
|
|
177
215
|
const plugin: ClaudePlugin = {
|
package/tests/converter.test.ts
CHANGED
|
@@ -168,4 +168,19 @@ describe("convertClaudeToOpenCode", () => {
|
|
|
168
168
|
const parsed = parseFrontmatter(agentFile!.content)
|
|
169
169
|
expect(parsed.data.mode).toBe("primary")
|
|
170
170
|
})
|
|
171
|
+
|
|
172
|
+
test("excludes commands with disable-model-invocation from command map", async () => {
|
|
173
|
+
const plugin = await loadClaudePlugin(fixtureRoot)
|
|
174
|
+
const bundle = convertClaudeToOpenCode(plugin, {
|
|
175
|
+
agentMode: "subagent",
|
|
176
|
+
inferTemperature: false,
|
|
177
|
+
permissions: "none",
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
// deploy-docs has disable-model-invocation: true, should be excluded
|
|
181
|
+
expect(bundle.config.command?.["deploy-docs"]).toBeUndefined()
|
|
182
|
+
|
|
183
|
+
// Normal commands should still be present
|
|
184
|
+
expect(bundle.config.command?.["workflows:review"]).toBeDefined()
|
|
185
|
+
})
|
|
171
186
|
})
|