@every-env/compound-plugin 2.39.0 → 2.40.1
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/CHANGELOG.md +14 -0
- package/CLAUDE.md +16 -3
- package/docs/solutions/adding-converter-target-providers.md +4 -4
- package/docs/solutions/plugin-versioning-requirements.md +5 -5
- package/package.json +1 -1
- package/plugins/compound-engineering/AGENTS.md +110 -0
- package/plugins/compound-engineering/CLAUDE.md +1 -97
- package/plugins/compound-engineering/skills/ce-work/SKILL.md +20 -4
- package/src/converters/claude-to-kiro.ts +12 -11
- package/src/parsers/claude.ts +11 -2
- package/tests/kiro-converter.test.ts +20 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
Release numbering now follows the repository `v*` tag line. Starting at `v2.34.0`, the root CLI package and this changelog stay on that shared version stream. Older entries below retain the previous `0.x` CLI numbering.
|
|
9
9
|
|
|
10
|
+
## [2.40.1](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.40.0...v2.40.1) (2026-03-17)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **kiro:** parse .mcp.json wrapper key and support remote MCP servers ([#259](https://github.com/EveryInc/compound-engineering-plugin/issues/259)) ([dfff20e](https://github.com/EveryInc/compound-engineering-plugin/commit/dfff20e1adab891b4645a53d0581d4b20577e3f1))
|
|
16
|
+
|
|
17
|
+
# [2.40.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.39.0...v2.40.0) (2026-03-17)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* specific model/harness/version in PR attribution ([#283](https://github.com/EveryInc/compound-engineering-plugin/issues/283)) ([fdbd584](https://github.com/EveryInc/compound-engineering-plugin/commit/fdbd584bac40ca373275b1b339ab81db65ac0958))
|
|
23
|
+
|
|
10
24
|
# [2.39.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.38.0...v2.39.0) (2026-03-16)
|
|
11
25
|
|
|
12
26
|
|
package/CLAUDE.md
CHANGED
|
@@ -359,14 +359,27 @@ Follow these patterns for commit messages:
|
|
|
359
359
|
- `Fix [issue]` - Bug fixes
|
|
360
360
|
- `Simplify [component] to [improvement]` - Refactoring
|
|
361
361
|
|
|
362
|
-
Include the
|
|
362
|
+
Include the attribution footer (fill in your actual values):
|
|
363
363
|
|
|
364
364
|
```
|
|
365
|
-
🤖 Generated with [
|
|
365
|
+
🤖 Generated with [MODEL] via [HARNESS](HARNESS_URL) + Compound Engineering v[VERSION]
|
|
366
366
|
|
|
367
|
-
Co-Authored-By:
|
|
367
|
+
Co-Authored-By: [MODEL] ([CONTEXT] context, [THINKING]) <noreply@anthropic.com>
|
|
368
368
|
```
|
|
369
369
|
|
|
370
|
+
**Fill in at commit/PR time:**
|
|
371
|
+
|
|
372
|
+
| Placeholder | Value | Example |
|
|
373
|
+
|-------------|-------|---------|
|
|
374
|
+
| Placeholder | Value | Example |
|
|
375
|
+
|-------------|-------|---------|
|
|
376
|
+
| `[MODEL]` | Model name | Claude Opus 4.6, GPT-5.4 |
|
|
377
|
+
| `[CONTEXT]` | Context window (if known) | 200K, 1M |
|
|
378
|
+
| `[THINKING]` | Thinking level (if known) | extended thinking |
|
|
379
|
+
| `[HARNESS]` | Tool running you | Claude Code, Codex, Gemini CLI |
|
|
380
|
+
| `[HARNESS_URL]` | Link to that tool | `https://claude.com/claude-code` |
|
|
381
|
+
| `[VERSION]` | `plugin.json` → `version` | 2.40.0 |
|
|
382
|
+
|
|
370
383
|
## Resources to search for when needing more information
|
|
371
384
|
|
|
372
385
|
- [Claude Code Plugin Documentation](https://docs.claude.com/en/docs/claude-code/plugins)
|
|
@@ -687,7 +687,7 @@ Use this checklist when adding a new target provider:
|
|
|
687
687
|
|
|
688
688
|
## Related Files
|
|
689
689
|
|
|
690
|
-
-
|
|
691
|
-
-
|
|
692
|
-
-
|
|
693
|
-
-
|
|
690
|
+
- `plugins/compound-engineering/.claude-plugin/plugin.json` — Version and component counts
|
|
691
|
+
- `CHANGELOG.md` — Recent additions and patterns
|
|
692
|
+
- `README.md` — Usage examples for all targets
|
|
693
|
+
- `docs/solutions/plugin-versioning-requirements.md` — Checklist for releases
|
|
@@ -72,8 +72,8 @@ This documentation serves as a reminder. When Claude Code works on this plugin,
|
|
|
72
72
|
|
|
73
73
|
## Related Files
|
|
74
74
|
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
75
|
+
- `plugins/compound-engineering/.claude-plugin/plugin.json`
|
|
76
|
+
- `plugins/compound-engineering/CHANGELOG.md`
|
|
77
|
+
- `plugins/compound-engineering/README.md`
|
|
78
|
+
- `package.json`
|
|
79
|
+
- `CHANGELOG.md`
|
package/package.json
CHANGED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Plugin Instructions
|
|
2
|
+
|
|
3
|
+
These instructions apply when working under `plugins/compound-engineering/`.
|
|
4
|
+
They supplement the repo-root `AGENTS.md`.
|
|
5
|
+
|
|
6
|
+
# Compounding Engineering Plugin Development
|
|
7
|
+
|
|
8
|
+
## Versioning Requirements
|
|
9
|
+
|
|
10
|
+
**IMPORTANT**: Routine PRs should not cut releases for this plugin.
|
|
11
|
+
|
|
12
|
+
The repo uses an automatied release process to prepare plugin releases, including version selection and changelog generation. Because multiple PRs may merge before the next release, contributors cannot know the final released version from within an individual PR.
|
|
13
|
+
|
|
14
|
+
### Contributor Rules
|
|
15
|
+
|
|
16
|
+
- Do **not** manually bump `.claude-plugin/plugin.json` version in a normal feature PR.
|
|
17
|
+
- Do **not** manually bump `.claude-plugin/marketplace.json` plugin version in a normal feature PR.
|
|
18
|
+
- Do **not** cut a release section in `CHANGELOG.md` for a normal feature PR.
|
|
19
|
+
- Do update substantive docs that are part of the actual change, such as `README.md`, component tables, usage instructions, or counts when they would otherwise become inaccurate.
|
|
20
|
+
|
|
21
|
+
### Pre-Commit Checklist
|
|
22
|
+
|
|
23
|
+
Before committing ANY changes:
|
|
24
|
+
|
|
25
|
+
- [ ] No manual release-version bump in `.claude-plugin/plugin.json`
|
|
26
|
+
- [ ] No manual release-version bump in `.claude-plugin/marketplace.json`
|
|
27
|
+
- [ ] No manual release entry added to `CHANGELOG.md`
|
|
28
|
+
- [ ] README.md component counts verified
|
|
29
|
+
- [ ] README.md tables accurate (agents, commands, skills)
|
|
30
|
+
- [ ] plugin.json description matches current counts
|
|
31
|
+
|
|
32
|
+
### Directory Structure
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
agents/
|
|
36
|
+
├── review/ # Code review agents
|
|
37
|
+
├── research/ # Research and analysis agents
|
|
38
|
+
├── design/ # Design and UI agents
|
|
39
|
+
└── docs/ # Documentation agents
|
|
40
|
+
|
|
41
|
+
skills/
|
|
42
|
+
├── ce-*/ # Core workflow skills (ce:plan, ce:review, etc.)
|
|
43
|
+
├── workflows-*/ # Deprecated aliases for ce:* skills
|
|
44
|
+
└── */ # All other skills
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
> **Note:** Commands were migrated to skills in v2.39.0. All former
|
|
48
|
+
> `/command-name` slash commands now live under `skills/command-name/SKILL.md`
|
|
49
|
+
> and work identically in Claude Code. Other targets may convert or map these references differently.
|
|
50
|
+
|
|
51
|
+
## Command Naming Convention
|
|
52
|
+
|
|
53
|
+
**Workflow commands** use `ce:` prefix to unambiguously identify them as compound-engineering commands:
|
|
54
|
+
- `/ce:brainstorm` - Explore requirements and approaches before planning
|
|
55
|
+
- `/ce:plan` - Create implementation plans
|
|
56
|
+
- `/ce:review` - Run comprehensive code reviews
|
|
57
|
+
- `/ce:work` - Execute work items systematically
|
|
58
|
+
- `/ce:compound` - Document solved problems
|
|
59
|
+
|
|
60
|
+
**Why `ce:`?** Claude Code has built-in `/plan` and `/review` commands. The `ce:` namespace (short for compound-engineering) makes it immediately clear these commands belong to this plugin. The legacy `workflows:` prefix is still supported as deprecated aliases that forward to the `ce:*` equivalents.
|
|
61
|
+
|
|
62
|
+
## Skill Compliance Checklist
|
|
63
|
+
|
|
64
|
+
When adding or modifying skills, verify compliance with the skill spec:
|
|
65
|
+
|
|
66
|
+
### YAML Frontmatter (Required)
|
|
67
|
+
|
|
68
|
+
- [ ] `name:` present and matches directory name (lowercase-with-hyphens)
|
|
69
|
+
- [ ] `description:` present and describes **what it does and when to use it** (per official spec: "Explains code with diagrams. Use when exploring how code works.")
|
|
70
|
+
|
|
71
|
+
### Reference Links (Required if references/ exists)
|
|
72
|
+
|
|
73
|
+
- [ ] All files in `references/` are linked as `[filename.md](./references/filename.md)`
|
|
74
|
+
- [ ] All files in `assets/` are linked as `[filename](./assets/filename)`
|
|
75
|
+
- [ ] All files in `scripts/` are linked as `[filename](./scripts/filename)`
|
|
76
|
+
- [ ] No bare backtick references like `` `references/file.md` `` - use proper markdown links
|
|
77
|
+
|
|
78
|
+
### Writing Style
|
|
79
|
+
|
|
80
|
+
- [ ] Use imperative/infinitive form (verb-first instructions)
|
|
81
|
+
- [ ] Avoid second person ("you should") - use objective language ("To accomplish X, do Y")
|
|
82
|
+
|
|
83
|
+
### Cross-Platform User Interaction
|
|
84
|
+
|
|
85
|
+
- [ ] When a skill needs to ask the user a question, instruct use of the platform's blocking question tool and name the known equivalents (`AskUserQuestion` in Claude Code, `request_user_input` in Codex, `ask_user` in Gemini)
|
|
86
|
+
- [ ] Include a fallback for environments without a question tool (e.g., present numbered options and wait for the user's reply before proceeding)
|
|
87
|
+
|
|
88
|
+
### Cross-Platform Reference Rules
|
|
89
|
+
|
|
90
|
+
This plugin is authored once, then converted for other agent platforms. Commands and agents are transformed during that conversion, but `plugin.skills` are usually copied almost exactly as written.
|
|
91
|
+
|
|
92
|
+
- [ ] Because of that, slash references inside command or agent content are acceptable when they point to real published commands; target-specific conversion can remap them.
|
|
93
|
+
- [ ] Inside a pass-through `SKILL.md`, do not assume slash references will be remapped for another platform. Write references according to what will still make sense after the skill is copied as-is.
|
|
94
|
+
- [ ] When one skill refers to another skill, prefer semantic wording such as "load the `document-review` skill" rather than slash syntax.
|
|
95
|
+
- [ ] Use slash syntax only when referring to an actual published command or workflow such as `/ce:work` or `/deepen-plan`.
|
|
96
|
+
|
|
97
|
+
### Quick Validation Command
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Check for unlinked references in a skill
|
|
101
|
+
grep -E '`(references|assets|scripts)/[^`]+`' skills/*/SKILL.md
|
|
102
|
+
# Should return nothing if all refs are properly linked
|
|
103
|
+
|
|
104
|
+
# Check description format - should describe what + when
|
|
105
|
+
grep -E '^description:' skills/*/SKILL.md
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Documentation
|
|
109
|
+
|
|
110
|
+
See `docs/solutions/plugin-versioning-requirements.md` for detailed versioning workflow.
|
|
@@ -1,97 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
## Versioning Requirements
|
|
4
|
-
|
|
5
|
-
**IMPORTANT**: Routine PRs should not cut releases for this plugin.
|
|
6
|
-
|
|
7
|
-
The repo uses an automatied release process to prepare plugin releases, including version selection and changelog generation. Because multiple PRs may merge before the next release, contributors cannot know the final released version from within an individual PR.
|
|
8
|
-
|
|
9
|
-
### Contributor Rules
|
|
10
|
-
|
|
11
|
-
- Do **not** manually bump `.claude-plugin/plugin.json` version in a normal feature PR.
|
|
12
|
-
- Do **not** manually bump `.claude-plugin/marketplace.json` plugin version in a normal feature PR.
|
|
13
|
-
- Do **not** cut a release section in `CHANGELOG.md` for a normal feature PR.
|
|
14
|
-
- Do update substantive docs that are part of the actual change, such as `README.md`, component tables, usage instructions, or counts when they would otherwise become inaccurate.
|
|
15
|
-
|
|
16
|
-
### Pre-Commit Checklist
|
|
17
|
-
|
|
18
|
-
Before committing ANY changes:
|
|
19
|
-
|
|
20
|
-
- [ ] No manual release-version bump in `.claude-plugin/plugin.json`
|
|
21
|
-
- [ ] No manual release-version bump in `.claude-plugin/marketplace.json`
|
|
22
|
-
- [ ] No manual release entry added to `CHANGELOG.md`
|
|
23
|
-
- [ ] README.md component counts verified
|
|
24
|
-
- [ ] README.md tables accurate (agents, commands, skills)
|
|
25
|
-
- [ ] plugin.json description matches current counts
|
|
26
|
-
|
|
27
|
-
### Directory Structure
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
agents/
|
|
31
|
-
├── review/ # Code review agents
|
|
32
|
-
├── research/ # Research and analysis agents
|
|
33
|
-
├── design/ # Design and UI agents
|
|
34
|
-
├── workflow/ # Workflow automation agents
|
|
35
|
-
└── docs/ # Documentation agents
|
|
36
|
-
|
|
37
|
-
skills/
|
|
38
|
-
├── ce-*/ # Core workflow skills (ce:plan, ce:review, etc.)
|
|
39
|
-
├── workflows-*/ # Deprecated aliases for ce:* skills
|
|
40
|
-
└── */ # All other skills
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
> **Note:** Commands were migrated to skills in v2.39.0. All former
|
|
44
|
-
> `/command-name` slash commands now live under `skills/command-name/SKILL.md`
|
|
45
|
-
> and work identically (Claude Code 2.1.3+ merged the two formats).
|
|
46
|
-
|
|
47
|
-
## Command Naming Convention
|
|
48
|
-
|
|
49
|
-
**Workflow commands** use `ce:` prefix to unambiguously identify them as compound-engineering commands:
|
|
50
|
-
- `/ce:plan` - Create implementation plans
|
|
51
|
-
- `/ce:review` - Run comprehensive code reviews
|
|
52
|
-
- `/ce:work` - Execute work items systematically
|
|
53
|
-
- `/ce:compound` - Document solved problems
|
|
54
|
-
- `/ce:brainstorm` - Explore requirements and approaches before planning
|
|
55
|
-
|
|
56
|
-
**Why `ce:`?** Claude Code has built-in `/plan` and `/review` commands. The `ce:` namespace (short for compound-engineering) makes it immediately clear these commands belong to this plugin. The legacy `workflows:` prefix is still supported as deprecated aliases that forward to the `ce:*` equivalents.
|
|
57
|
-
|
|
58
|
-
## Skill Compliance Checklist
|
|
59
|
-
|
|
60
|
-
When adding or modifying skills, verify compliance with skill-creator spec:
|
|
61
|
-
|
|
62
|
-
### YAML Frontmatter (Required)
|
|
63
|
-
|
|
64
|
-
- [ ] `name:` present and matches directory name (lowercase-with-hyphens)
|
|
65
|
-
- [ ] `description:` present and describes **what it does and when to use it** (per official spec: "Explains code with diagrams. Use when exploring how code works.")
|
|
66
|
-
|
|
67
|
-
### Reference Links (Required if references/ exists)
|
|
68
|
-
|
|
69
|
-
- [ ] All files in `references/` are linked as `[filename.md](./references/filename.md)`
|
|
70
|
-
- [ ] All files in `assets/` are linked as `[filename](./assets/filename)`
|
|
71
|
-
- [ ] All files in `scripts/` are linked as `[filename](./scripts/filename)`
|
|
72
|
-
- [ ] No bare backtick references like `` `references/file.md` `` - use proper markdown links
|
|
73
|
-
|
|
74
|
-
### Writing Style
|
|
75
|
-
|
|
76
|
-
- [ ] Use imperative/infinitive form (verb-first instructions)
|
|
77
|
-
- [ ] Avoid second person ("you should") - use objective language ("To accomplish X, do Y")
|
|
78
|
-
|
|
79
|
-
### Cross-Platform User Interaction
|
|
80
|
-
|
|
81
|
-
- [ ] When a skill needs to ask the user a question, instruct use of the platform's blocking question tool and name the known equivalents (`AskUserQuestion` in Claude Code, `request_user_input` in Codex, `ask_user` in Gemini)
|
|
82
|
-
- [ ] Include a fallback for environments without a question tool (e.g., present numbered options and wait for the user's reply before proceeding)
|
|
83
|
-
|
|
84
|
-
### Quick Validation Command
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
# Check for unlinked references in a skill
|
|
88
|
-
grep -E '`(references|assets|scripts)/[^`]+`' skills/*/SKILL.md
|
|
89
|
-
# Should return nothing if all refs are properly linked
|
|
90
|
-
|
|
91
|
-
# Check description format - should describe what + when
|
|
92
|
-
grep -E '^description:' skills/*/SKILL.md
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Documentation
|
|
96
|
-
|
|
97
|
-
See `docs/solutions/plugin-versioning-requirements.md` for detailed versioning workflow.
|
|
1
|
+
@AGENTS.md
|
|
@@ -228,13 +228,28 @@ This command takes a work document (plan, specification, or todo file) and execu
|
|
|
228
228
|
|
|
229
229
|
Brief explanation if needed.
|
|
230
230
|
|
|
231
|
-
🤖 Generated with [
|
|
231
|
+
🤖 Generated with [MODEL] via [HARNESS](HARNESS_URL) + Compound Engineering v[VERSION]
|
|
232
232
|
|
|
233
|
-
Co-Authored-By:
|
|
233
|
+
Co-Authored-By: [MODEL] ([CONTEXT] context, [THINKING]) <noreply@anthropic.com>
|
|
234
234
|
EOF
|
|
235
235
|
)"
|
|
236
236
|
```
|
|
237
237
|
|
|
238
|
+
**Fill in at commit/PR time:**
|
|
239
|
+
|
|
240
|
+
| Placeholder | Value | Example |
|
|
241
|
+
|-------------|-------|---------|
|
|
242
|
+
| Placeholder | Value | Example |
|
|
243
|
+
|-------------|-------|---------|
|
|
244
|
+
| `[MODEL]` | Model name | Claude Opus 4.6, GPT-5.4 |
|
|
245
|
+
| `[CONTEXT]` | Context window (if known) | 200K, 1M |
|
|
246
|
+
| `[THINKING]` | Thinking level (if known) | extended thinking |
|
|
247
|
+
| `[HARNESS]` | Tool running you | Claude Code, Codex, Gemini CLI |
|
|
248
|
+
| `[HARNESS_URL]` | Link to that tool | `https://claude.com/claude-code` |
|
|
249
|
+
| `[VERSION]` | `plugin.json` → `version` | 2.40.0 |
|
|
250
|
+
|
|
251
|
+
Subagents creating commits/PRs are equally responsible for accurate attribution.
|
|
252
|
+
|
|
238
253
|
2. **Capture and Upload Screenshots for UI Changes** (REQUIRED for any UI work)
|
|
239
254
|
|
|
240
255
|
For **any** design changes, new views, or UI modifications, you MUST capture and upload screenshots:
|
|
@@ -308,7 +323,8 @@ This command takes a work document (plan, specification, or todo file) and execu
|
|
|
308
323
|
|
|
309
324
|
---
|
|
310
325
|
|
|
311
|
-
[![Compound
|
|
326
|
+
[![Compound Engineering v[VERSION]](https://img.shields.io/badge/Compound_Engineering-v[VERSION]-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
|
|
327
|
+
🤖 Generated with [MODEL] ([CONTEXT] context, [THINKING]) via [HARNESS](HARNESS_URL)
|
|
312
328
|
EOF
|
|
313
329
|
)"
|
|
314
330
|
```
|
|
@@ -445,7 +461,7 @@ Before creating PR, verify:
|
|
|
445
461
|
- [ ] Commit messages follow conventional format
|
|
446
462
|
- [ ] PR description includes Post-Deploy Monitoring & Validation section (or explicit no-impact rationale)
|
|
447
463
|
- [ ] PR description includes summary, testing notes, and screenshots
|
|
448
|
-
- [ ] PR description includes Compound Engineered badge
|
|
464
|
+
- [ ] PR description includes Compound Engineered badge with accurate model, harness, and version
|
|
449
465
|
|
|
450
466
|
## When to Use Reviewer Agents
|
|
451
467
|
|
|
@@ -53,7 +53,7 @@ export function convertClaudeToKiro(
|
|
|
53
53
|
convertCommandToSkill(command, usedSkillNames, agentNames),
|
|
54
54
|
)
|
|
55
55
|
|
|
56
|
-
// Convert MCP servers (stdio
|
|
56
|
+
// Convert MCP servers (stdio and remote)
|
|
57
57
|
const mcpServers = convertMcpServers(plugin.mcpServers)
|
|
58
58
|
|
|
59
59
|
// Build steering files from CLAUDE.md
|
|
@@ -177,19 +177,20 @@ function convertMcpServers(
|
|
|
177
177
|
|
|
178
178
|
const result: Record<string, KiroMcpServer> = {}
|
|
179
179
|
for (const [name, server] of Object.entries(servers)) {
|
|
180
|
-
if (
|
|
180
|
+
if (server.command) {
|
|
181
|
+
const entry: KiroMcpServer = { command: server.command }
|
|
182
|
+
if (server.args && server.args.length > 0) entry.args = server.args
|
|
183
|
+
if (server.env && Object.keys(server.env).length > 0) entry.env = server.env
|
|
184
|
+
result[name] = entry
|
|
185
|
+
} else if (server.url) {
|
|
186
|
+
const entry: KiroMcpServer = { url: server.url }
|
|
187
|
+
if (server.headers && Object.keys(server.headers).length > 0) entry.headers = server.headers
|
|
188
|
+
result[name] = entry
|
|
189
|
+
} else {
|
|
181
190
|
console.warn(
|
|
182
|
-
`Warning: MCP server "${name}" has no command
|
|
191
|
+
`Warning: MCP server "${name}" has no command or url. Skipping.`,
|
|
183
192
|
)
|
|
184
|
-
continue
|
|
185
193
|
}
|
|
186
|
-
|
|
187
|
-
const entry: KiroMcpServer = { command: server.command }
|
|
188
|
-
if (server.args && server.args.length > 0) entry.args = server.args
|
|
189
|
-
if (server.env && Object.keys(server.env).length > 0) entry.env = server.env
|
|
190
|
-
|
|
191
|
-
console.log(`MCP server "${name}" will execute: ${server.command}${server.args ? " " + server.args.join(" ") : ""}`)
|
|
192
|
-
result[name] = entry
|
|
193
194
|
}
|
|
194
195
|
return result
|
|
195
196
|
}
|
package/src/parsers/claude.ts
CHANGED
|
@@ -158,7 +158,8 @@ async function loadMcpServers(
|
|
|
158
158
|
|
|
159
159
|
const mcpPath = path.join(root, ".mcp.json")
|
|
160
160
|
if (await pathExists(mcpPath)) {
|
|
161
|
-
|
|
161
|
+
const raw = await readJson<Record<string, unknown>>(mcpPath)
|
|
162
|
+
return unwrapMcpServers(raw)
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
return undefined
|
|
@@ -232,12 +233,20 @@ async function loadMcpPaths(
|
|
|
232
233
|
for (const entry of toPathList(value)) {
|
|
233
234
|
const resolved = resolveWithinRoot(root, entry, "mcpServers path")
|
|
234
235
|
if (await pathExists(resolved)) {
|
|
235
|
-
|
|
236
|
+
const raw = await readJson<Record<string, unknown>>(resolved)
|
|
237
|
+
configs.push(unwrapMcpServers(raw))
|
|
236
238
|
}
|
|
237
239
|
}
|
|
238
240
|
return configs
|
|
239
241
|
}
|
|
240
242
|
|
|
243
|
+
function unwrapMcpServers(raw: Record<string, unknown>): Record<string, ClaudeMcpServer> {
|
|
244
|
+
if (raw.mcpServers && typeof raw.mcpServers === "object") {
|
|
245
|
+
return raw.mcpServers as Record<string, ClaudeMcpServer>
|
|
246
|
+
}
|
|
247
|
+
return raw as Record<string, ClaudeMcpServer>
|
|
248
|
+
}
|
|
249
|
+
|
|
241
250
|
function mergeMcpConfigs(configs: Record<string, ClaudeMcpServer>[]): Record<string, ClaudeMcpServer> {
|
|
242
251
|
return configs.reduce((acc, config) => ({ ...acc, ...config }), {})
|
|
243
252
|
}
|
|
@@ -174,7 +174,24 @@ describe("convertClaudeToKiro", () => {
|
|
|
174
174
|
expect(bundle.mcpServers.local.args).toEqual(["hello"])
|
|
175
175
|
})
|
|
176
176
|
|
|
177
|
-
test("MCP HTTP servers
|
|
177
|
+
test("MCP HTTP servers converted with url", () => {
|
|
178
|
+
const plugin: ClaudePlugin = {
|
|
179
|
+
...fixturePlugin,
|
|
180
|
+
mcpServers: {
|
|
181
|
+
httpServer: { url: "https://example.com/mcp" },
|
|
182
|
+
},
|
|
183
|
+
agents: [],
|
|
184
|
+
commands: [],
|
|
185
|
+
skills: [],
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const bundle = convertClaudeToKiro(plugin, defaultOptions)
|
|
189
|
+
|
|
190
|
+
expect(Object.keys(bundle.mcpServers)).toHaveLength(1)
|
|
191
|
+
expect(bundle.mcpServers.httpServer).toEqual({ url: "https://example.com/mcp" })
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test("MCP servers with no command or url skipped with warning", () => {
|
|
178
195
|
const warnings: string[] = []
|
|
179
196
|
const originalWarn = console.warn
|
|
180
197
|
console.warn = (msg: string) => warnings.push(msg)
|
|
@@ -182,7 +199,7 @@ describe("convertClaudeToKiro", () => {
|
|
|
182
199
|
const plugin: ClaudePlugin = {
|
|
183
200
|
...fixturePlugin,
|
|
184
201
|
mcpServers: {
|
|
185
|
-
|
|
202
|
+
broken: {} as any,
|
|
186
203
|
},
|
|
187
204
|
agents: [],
|
|
188
205
|
commands: [],
|
|
@@ -193,7 +210,7 @@ describe("convertClaudeToKiro", () => {
|
|
|
193
210
|
console.warn = originalWarn
|
|
194
211
|
|
|
195
212
|
expect(Object.keys(bundle.mcpServers)).toHaveLength(0)
|
|
196
|
-
expect(warnings.some((w) => w.includes("no command
|
|
213
|
+
expect(warnings.some((w) => w.includes("no command or url"))).toBe(true)
|
|
197
214
|
})
|
|
198
215
|
|
|
199
216
|
test("plugin with zero agents produces empty agents array", () => {
|