caruso 0.5.4

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.
data/IMPROVEMENTS.md ADDED
@@ -0,0 +1,337 @@
1
+ # Caruso Gem - Improvement Checklist
2
+
3
+ Based on the Ruby CLI Gem Best Practices evaluation, here are the remaining tasks to bring Caruso to production-ready standards.
4
+
5
+ ## ✅ Completed
6
+
7
+ - [x] Fix dependency management - consolidate all dependencies to gemspec
8
+ - [x] Update RSpec to 3.13 (was inconsistent between Gemfile and gemspec)
9
+ - [x] Add Aruba for professional CLI testing (Note: Cucumber is a transitive dependency but won't be used)
10
+ - [x] Add RuboCop to gemspec development dependencies
11
+ - [x] Clean up Gemfile to only contain `source` and `gemspec`
12
+
13
+ > **Note on Cucumber:** Aruba requires Cucumber as a dependency, but it won't be used in this project. We only use Aruba's RSpec integration. This is normal and harmless - Cucumber won't run unless you create `.feature` files.
14
+
15
+ ## 🔴 Critical Priority (Do First)
16
+
17
+ - [ ] **Add GitHub Actions CI workflow** _(Deferred for later)_
18
+ - Create `.github/workflows/ci.yml`
19
+ - Test on Ruby 3.0, 3.1, 3.2, 3.3
20
+ - Run tests automatically on push/PR
21
+ - Run RuboCop in CI
22
+ - See template in this document below
23
+
24
+ - [x] **Create CHANGELOG.md**
25
+ - Follow [Keep a Changelog](https://keepachangelog.com/) format
26
+ - Document all existing versions (0.1.0, 0.1.1, 0.1.2, 0.1.3)
27
+ - Add Unreleased section for upcoming changes
28
+
29
+ - [x] **Add LICENSE.txt file**
30
+ - MIT License with proper copyright attribution
31
+ - Now matches gemspec declaration
32
+
33
+ ## 🟡 High Priority
34
+
35
+ - [x] **Migrate tests to use Aruba**
36
+ - Updated `spec/spec_helper.rb` to configure Aruba
37
+ - Replaced custom `run_caruso` helper with Aruba's `run_command`
38
+ - Migrated all 4 integration test files to use Aruba API
39
+ - All 32 tests passing with improved isolation and cleaner assertions
40
+
41
+ - [ ] **Add release automation workflow**
42
+ - Create `.github/workflows/release.yml`
43
+ - Auto-publish to RubyGems when git tag is pushed
44
+ - Add `RUBYGEMS_API_KEY` secret to GitHub repo
45
+ - See template in this document below
46
+
47
+ - [x] **Create RuboCop configuration**
48
+ - Added `.rubocop.yml` with sensible defaults
49
+ - Configured for Ruby 3.0+ with NewCops enabled
50
+ - Auto-corrected 57 violations (frozen string literals, string quotes, trailing whitespace, etc.)
51
+ - Fixed void context issue in fetcher.rb
52
+ - All 16 files passing with 0 offenses
53
+ - Tests verified passing after corrections
54
+
55
+ ## 🟢 Medium Priority
56
+
57
+ - [ ] **Add multi-OS testing in CI**
58
+ - Test on Ubuntu, macOS, and Windows
59
+ - Ensures cross-platform compatibility
60
+ - Update CI matrix to include `os: [ubuntu-latest, macos-latest, windows-latest]`
61
+
62
+ - [ ] **Add bundler-audit for security**
63
+ - Add `bundler-audit` to dev dependencies
64
+ - Add security check step in CI
65
+ - Catches vulnerable dependencies early
66
+
67
+ - [ ] **Improve release documentation**
68
+ - Add "Releasing" section to README.md
69
+ - Document the release process step-by-step
70
+ - Integrate with new bump tasks and GitHub Actions
71
+
72
+ - [ ] **Add Dependabot configuration**
73
+ - Create `.github/dependabot.yml`
74
+ - Automatically update dependencies
75
+ - Keep gem secure and up-to-date
76
+
77
+ ## 📝 Nice to Have
78
+
79
+ - [ ] **Add .editorconfig**
80
+ - Ensures consistent formatting across editors
81
+ - Standardizes indentation, line endings, etc.
82
+
83
+ - [ ] **Add code coverage reporting**
84
+ - Use SimpleCov for test coverage
85
+ - Add coverage badge to README
86
+ - Consider integrating with Codecov or Coveralls
87
+
88
+ - [ ] **Add more comprehensive tests**
89
+ - Edge cases for CLI argument parsing
90
+ - Error handling scenarios
91
+ - Network failure simulation
92
+
93
+ ---
94
+
95
+ ## Templates and Migration Guides
96
+
97
+ ### GitHub Actions CI Template
98
+
99
+ Create `.github/workflows/ci.yml`:
100
+
101
+ ```yaml
102
+ name: Ruby CI
103
+
104
+ on:
105
+ push:
106
+ branches: [ main ]
107
+ pull_request:
108
+ branches: [ main ]
109
+
110
+ jobs:
111
+ test:
112
+ runs-on: ubuntu-latest
113
+
114
+ strategy:
115
+ fail-fast: false
116
+ matrix:
117
+ ruby-version: ['3.0', '3.1', '3.2', '3.3']
118
+
119
+ steps:
120
+ - uses: actions/checkout@v4
121
+
122
+ - name: Set up Ruby
123
+ uses: ruby/setup-ruby@v1
124
+ with:
125
+ ruby-version: ${{ matrix.ruby-version }}
126
+ bundler-cache: true
127
+
128
+ - name: Run tests
129
+ run: bundle exec rake spec
130
+
131
+ - name: Run RuboCop
132
+ run: bundle exec rubocop
133
+ if: matrix.ruby-version == '3.3' # Only run once
134
+ ```
135
+
136
+ ### GitHub Actions Release Template
137
+
138
+ Create `.github/workflows/release.yml`:
139
+
140
+ ```yaml
141
+ name: Release
142
+
143
+ on:
144
+ push:
145
+ tags:
146
+ - 'v*'
147
+
148
+ jobs:
149
+ release:
150
+ runs-on: ubuntu-latest
151
+
152
+ permissions:
153
+ contents: write
154
+
155
+ steps:
156
+ - uses: actions/checkout@v4
157
+
158
+ - name: Set up Ruby
159
+ uses: ruby/setup-ruby@v1
160
+ with:
161
+ ruby-version: '3.3'
162
+ bundler-cache: true
163
+
164
+ - name: Build gem
165
+ run: bundle exec rake build
166
+
167
+ - name: Publish to RubyGems
168
+ env:
169
+ GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
170
+ run: |
171
+ mkdir -p ~/.gem
172
+ echo ":rubygems_api_key: ${GEM_HOST_API_KEY}" > ~/.gem/credentials
173
+ chmod 0600 ~/.gem/credentials
174
+ gem push pkg/*.gem
175
+
176
+ - name: Create GitHub Release
177
+ uses: softprops/action-gh-release@v1
178
+ with:
179
+ files: pkg/*.gem
180
+ generate_release_notes: true
181
+ ```
182
+
183
+ **Setup:**
184
+ 1. Go to https://rubygems.org/settings/edit
185
+ 2. Create an API key
186
+ 3. Add it to GitHub repo: Settings → Secrets → Actions → New secret
187
+ 4. Name: `RUBYGEMS_API_KEY`
188
+
189
+ ### CHANGELOG.md Template
190
+
191
+ ```markdown
192
+ # Changelog
193
+
194
+ All notable changes to this project will be documented in this file.
195
+
196
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
197
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
198
+
199
+ ## [Unreleased]
200
+
201
+ ### Added
202
+ - Aruba for professional CLI testing
203
+ - RuboCop for code quality
204
+
205
+ ### Changed
206
+ - Consolidated all dependencies to gemspec
207
+ - Updated RSpec to 3.13
208
+
209
+ ## [0.1.3] - 2025-11-20
210
+
211
+ ### Added
212
+ - Improved error handling for missing marketplaces and plugins
213
+
214
+ ### Changed
215
+ - Updated caruso gem dependencies
216
+
217
+ ## [0.1.2] - 2025-11-XX
218
+
219
+ ### Added
220
+ - Rake tasks for automated semantic version bumping
221
+ - Script to automate version bumping
222
+
223
+ ## [0.1.0] - 2025-11-XX
224
+
225
+ ### Added
226
+ - Initial release
227
+ - Marketplace management (add, list, remove)
228
+ - Plugin installation and uninstallation
229
+ - Support for Cursor IDE integration
230
+ - Configuration management
231
+ - Manifest tracking for installed plugins
232
+
233
+ [Unreleased]: https://github.com/pcomans/caruso/compare/v0.1.3...HEAD
234
+ [0.1.3]: https://github.com/pcomans/caruso/compare/v0.1.2...v0.1.3
235
+ [0.1.2]: https://github.com/pcomans/caruso/compare/v0.1.0...v0.1.2
236
+ [0.1.0]: https://github.com/pcomans/caruso/releases/tag/v0.1.0
237
+ ```
238
+
239
+ ### Aruba Migration Guide
240
+
241
+ **Before (current custom approach):**
242
+
243
+ ```ruby
244
+ # spec/spec_helper.rb
245
+ def run_caruso(*args)
246
+ cmd = "caruso #{args.join(' ')}"
247
+ output = `#{cmd} 2>&1`
248
+ { output: output, exit_code: $?.exitstatus }
249
+ end
250
+
251
+ # In tests:
252
+ result = run_caruso("marketplace add https://github.com/...")
253
+ expect(result[:exit_code]).to eq(0)
254
+ expect(result[:output]).to include("Added marketplace")
255
+ ```
256
+
257
+ **After (with Aruba):**
258
+
259
+ ```ruby
260
+ # spec/spec_helper.rb
261
+ require 'aruba/rspec'
262
+
263
+ RSpec.configure do |config|
264
+ config.include Aruba::Api, type: :integration
265
+
266
+ # ... rest of config ...
267
+ end
268
+
269
+ # In tests:
270
+ RSpec.describe "Marketplace Management", type: :integration do
271
+ it "adds a marketplace" do
272
+ run_command("caruso marketplace add https://github.com/...")
273
+
274
+ expect(last_command_started).to be_successfully_executed
275
+ expect(last_command_started).to have_output(/Added marketplace/)
276
+ end
277
+
278
+ it "handles errors gracefully" do
279
+ run_command("caruso marketplace remove nonexistent")
280
+
281
+ expect(last_command_started).to have_exit_status(0)
282
+ # or check for specific error output
283
+ end
284
+ end
285
+ ```
286
+
287
+ **Key Aruba Benefits:**
288
+ - Automatic command isolation
289
+ - Better stderr/stdout separation
290
+ - Rich matchers (`be_successfully_executed`, `have_output`)
291
+ - Support for interactive commands
292
+ - File system helpers (automatic cleanup)
293
+ - Environment variable manipulation
294
+
295
+ **Aruba Useful Methods:**
296
+ - `run_command(cmd)` - Run a command
297
+ - `last_command_started` - Access last command
298
+ - `have_output(content)` - Check output
299
+ - `be_successfully_executed` - Check exit code 0
300
+ - `have_exit_status(code)` - Check specific exit code
301
+ - `stop_all_commands` - Clean up background processes
302
+
303
+ ### .rubocop.yml Starter
304
+
305
+ ```yaml
306
+ AllCops:
307
+ TargetRubyVersion: 3.0
308
+ NewCops: enable
309
+ Exclude:
310
+ - 'vendor/**/*'
311
+ - 'pkg/**/*'
312
+
313
+ # Adjust these to your preferences
314
+ Layout/LineLength:
315
+ Max: 120
316
+
317
+ Metrics/BlockLength:
318
+ Exclude:
319
+ - 'spec/**/*'
320
+ - 'Rakefile'
321
+
322
+ Style/Documentation:
323
+ Enabled: false # Enable this if you want to enforce class documentation
324
+
325
+ Style/StringLiterals:
326
+ EnforcedStyle: double_quotes # or single_quotes, your choice
327
+ ```
328
+
329
+ ---
330
+
331
+ ## Progress Tracking
332
+
333
+ Update this section as you complete tasks:
334
+
335
+ **Completed:** 9/26 tasks (35%)
336
+
337
+ **Last Updated:** 2025-11-20
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Philipp Comans
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,326 @@
1
+ # Caruso
2
+
3
+ **Caruso** is a tool that bridges the gap between AI coding assistants. It allows you to take "steering documentation" (rules, context, capabilities) from **Claude Code Marketplaces** and make them available to **Cursor**.
4
+
5
+ ## Mission
6
+
7
+ Enable Cursor to consume Claude Code plugins from marketplaces by converting them to Cursor-compatible rules.
8
+
9
+ ## Features
10
+
11
+ * **One-time Configuration**: Initialize once with `caruso init --ide=cursor` and all commands automatically use the right settings.
12
+ * **Universal Fetcher**: Downloads plugins from local paths, HTTP URLs, or GitHub repositories.
13
+ * **Smart Adapter**: Automatically converts Claude Plugin Markdown files into **Cursor Rules** (`.mdc`), injecting necessary metadata (`globs: []`, `alwaysApply: false`) to ensure they work out of the box.
14
+ * **Package Manager**: Install, uninstall, and list plugins selectively. Tracks project configuration in `caruso.json` and local state in `.caruso.local.json`.
15
+
16
+ ## Installation
17
+
18
+ ### Option 1: Install from Source (Recommended)
19
+
20
+ Clone the repository and build the gem:
21
+
22
+ ```bash
23
+ git clone https://github.com/pcomans/caruso.git
24
+ cd caruso
25
+ gem build caruso.gemspec
26
+ gem install caruso-*.gem
27
+ ```
28
+
29
+ ### Option 2: Using `specific_install`
30
+
31
+ If you have the `specific_install` gem, you can install directly from GitHub:
32
+
33
+ ```bash
34
+ gem install specific_install
35
+ gem specific_install -l https://github.com/pcomans/caruso.git
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ Caruso mirrors the Claude Code CLI structure, providing a familiar interface for marketplace and plugin management.
41
+
42
+ ### Getting Started
43
+
44
+ Before using Caruso, initialize it in your project directory:
45
+
46
+ ```bash
47
+ # Navigate to your project
48
+ cd /path/to/your/project
49
+
50
+ # Initialize for Cursor (currently the only supported IDE)
51
+ caruso init --ide=cursor
52
+ ```
53
+
54
+ This creates a `caruso.json` config file for project settings and `.caruso.local.json` for local state. You only need to do this once per project.
55
+
56
+ **What happens during init:**
57
+ - Creates `caruso.json` and `.caruso.local.json` in your project root
58
+ - Configures target directory (`.cursor/rules` for Cursor)
59
+ - All subsequent commands automatically use this configuration
60
+
61
+ **Version Control:**
62
+ - ✅ **Commit to VCS:** `caruso.json` - Contains project plugin configuration (shared with team)
63
+ - ❌ **Add to .gitignore:** `.caruso.local.json` - Contains local state (machine-specific)
64
+ - ❌ **Add to .gitignore:** `.cursor/rules/caruso/` - Generated plugin files (build artifacts)
65
+
66
+ Add these to your `.gitignore`:
67
+ ```
68
+ # Caruso
69
+ .caruso.local.json
70
+ .cursor/rules/caruso/
71
+ ```
72
+
73
+ ### Marketplace commands
74
+
75
+ Manage plugin marketplaces to discover and install plugins from different sources.
76
+
77
+ #### Add a marketplace
78
+
79
+ Add the official Claude Code marketplace:
80
+
81
+ ```bash
82
+ caruso marketplace add https://github.com/anthropics/claude-code
83
+ ```
84
+
85
+ The marketplace name is automatically read from the `marketplace.json` file in the repository (in this case, `claude-code-plugins`).
86
+
87
+ Supported marketplace sources:
88
+ - **GitHub repositories**: `https://github.com/owner/repo`
89
+ - **Git repositories**: Any Git URL (e.g., `https://gitlab.com/company/plugins.git`)
90
+ - **Local paths**: `./path/to/marketplace` or `./path/to/marketplace.json`
91
+
92
+ #### List marketplaces
93
+
94
+ View all configured marketplaces:
95
+
96
+ ```bash
97
+ caruso marketplace list
98
+ ```
99
+
100
+ #### Remove a marketplace
101
+
102
+ Remove a marketplace from your configuration:
103
+
104
+ ```bash
105
+ caruso marketplace remove claude-code
106
+ ```
107
+
108
+ <Warning>
109
+ Removing a marketplace will not automatically uninstall plugins from that marketplace. Uninstall plugins first if you want to remove them.
110
+ </Warning>
111
+
112
+ ### Plugin commands
113
+
114
+ Discover, install, and manage plugins from configured marketplaces.
115
+
116
+ #### List available plugins
117
+
118
+ See all available plugins across configured marketplaces:
119
+
120
+ ```bash
121
+ caruso plugin list
122
+ ```
123
+
124
+ This shows:
125
+ - All plugins from each marketplace
126
+ - Installation status for each plugin
127
+ - Plugin descriptions
128
+
129
+ #### Install a plugin
130
+
131
+ Install from a specific marketplace:
132
+
133
+ ```bash
134
+ caruso plugin install frontend-design@claude-code
135
+ ```
136
+
137
+ Install when only one marketplace is configured (marketplace name is optional):
138
+
139
+ ```bash
140
+ caruso plugin install frontend-design
141
+ ```
142
+
143
+ **What happens during installation:**
144
+ 1. Fetches plugin files from the marketplace
145
+ 2. Scans `commands/`, `agents/`, and `skills/` directories
146
+ 3. Converts Claude Plugin Markdown to Cursor Rules (`.mdc` format)
147
+ 4. Injects Cursor-specific metadata (`globs: []`, `alwaysApply: false`)
148
+ 5. Saves converted files to `.cursor/rules/caruso/` (vendor directory)
149
+ 6. Updates `.caruso.local.json` with installed file list
150
+
151
+ #### Uninstall a plugin
152
+
153
+ Remove a plugin and update the manifest:
154
+
155
+ ```bash
156
+ caruso plugin uninstall frontend-design
157
+ ```
158
+
159
+ ### Complete workflow example
160
+
161
+ Here's a complete workflow from initialization to plugin installation:
162
+
163
+ ```bash
164
+ # 1. Initialize Caruso in your project
165
+ caruso init --ide=cursor
166
+
167
+ # 2. Add the official Claude Code marketplace
168
+ caruso marketplace add https://github.com/anthropics/claude-code
169
+
170
+ # 3. Browse available plugins
171
+ caruso plugin list
172
+
173
+ # 4. Install a plugin
174
+ caruso plugin install frontend-design@claude-code
175
+
176
+ # 5. Your Cursor rules are now updated!
177
+ # 5. Your Cursor rules are now updated!
178
+ # Files are in .cursor/rules/caruso/ and tracked in .caruso.local.json
179
+ ```
180
+
181
+ ## CLI Reference
182
+
183
+ ### Initialization
184
+
185
+ ```bash
186
+ caruso init [PATH] --ide=IDE
187
+ ```
188
+
189
+ Initialize Caruso in a directory. Creates `caruso.json` and `.caruso.local.json`.
190
+
191
+ **Arguments:**
192
+ - `PATH` - Project directory (optional, defaults to current directory)
193
+
194
+ **Options:**
195
+ - `--ide` - Target IDE (required). Currently supported: `cursor`
196
+
197
+ **Examples:**
198
+ ```bash
199
+ caruso init --ide=cursor # Initialize current directory
200
+ caruso init . --ide=cursor # Explicit current directory
201
+ caruso init /path/to/project --ide=cursor # Initialize specific directory
202
+ ```
203
+
204
+ ### Marketplace Management
205
+
206
+ ```bash
207
+ caruso marketplace add URL # Add a marketplace (name from marketplace.json)
208
+ caruso marketplace list # List configured marketplaces
209
+ caruso marketplace remove NAME # Remove a marketplace
210
+ ```
211
+
212
+ ### Plugin Management
213
+
214
+ ```bash
215
+ caruso plugin list # List available and installed plugins
216
+ caruso plugin install PLUGIN[@MARKETPLACE] # Install a plugin
217
+ caruso plugin uninstall PLUGIN # Uninstall a plugin
218
+ ```
219
+
220
+ ### Version
221
+
222
+ ```bash
223
+ caruso version # Print Caruso version
224
+ ```
225
+
226
+ ## How it works
227
+
228
+ 1. **Init**: Creates `caruso.json` and `.caruso.local.json` (one-time setup)
229
+ 2. **Fetch**: Resolves marketplace URI and clones Git repositories if needed
230
+ 3. **Scan**: Finds "steering files" in `commands/`, `agents/`, and `skills/` directories
231
+ 4. **Adapt**: Converts Claude Plugin Markdown to Cursor Rules (`.mdc`) with metadata injection
232
+ 5. **Manage**: Tracks installations in `.caruso.local.json` and project plugins in `caruso.json`
233
+
234
+ ## Development
235
+
236
+ After checking out the repo:
237
+
238
+ ```bash
239
+ # Install dependencies
240
+ bundle install
241
+
242
+ # Build and install the gem locally
243
+ gem build caruso.gemspec
244
+ gem install caruso-*.gem
245
+
246
+ # Run tests
247
+ bundle exec rake spec
248
+ ```
249
+
250
+ ### Testing
251
+
252
+ Caruso includes comprehensive test coverage with RSpec integration tests.
253
+
254
+ #### Run Tests
255
+
256
+ **Quick test (offline tests only):**
257
+ ```bash
258
+ bundle exec rake spec
259
+ ```
260
+
261
+ **All tests including live marketplace integration:**
262
+ ```bash
263
+ bundle exec rake spec:all
264
+ # or
265
+ RUN_LIVE_TESTS=true bundle exec rspec
266
+ ```
267
+
268
+ **Only live tests:**
269
+ ```bash
270
+ bundle exec rake spec:live
271
+ ```
272
+
273
+ **Run specific test file:**
274
+ ```bash
275
+ bundle exec rspec spec/integration/init_spec.rb
276
+ ```
277
+
278
+ #### Test Structure
279
+
280
+ Integration tests are organized in `spec/integration/`:
281
+
282
+ - **init_spec.rb** - Initialization and configuration tests
283
+ - **marketplace_spec.rb** - Marketplace management (add, list, remove)
284
+ - **plugin_spec.rb** - Plugin installation and uninstallation
285
+ - **file_validation_spec.rb** - .mdc file structure and manifest validation
286
+
287
+ #### Live Tests
288
+
289
+ Tests marked with `:live` tag require network access and interact with the real Claude Code marketplace:
290
+ - Plugin installation
291
+ - File conversion validation
292
+ - Marketplace fetching
293
+
294
+ To run live tests, set `RUN_LIVE_TESTS=true` or use `rake spec:all`.
295
+
296
+ #### Test Coverage
297
+
298
+ ✓ **Initialization**
299
+ - Config file creation and validation
300
+ - IDE selection
301
+ - Double-init prevention
302
+ - Error handling
303
+
304
+ ✓ **Marketplace Management**
305
+ - Adding marketplaces (GitHub, Git, local)
306
+ - Listing marketplaces
307
+ - Removing marketplaces
308
+ - Manifest structure
309
+
310
+ ✓ **Plugin Management**
311
+ - Listing available plugins
312
+ - Installing plugins (explicit/implicit marketplace)
313
+ - Uninstalling plugins
314
+ - Installation status tracking
315
+
316
+ ✓ **File Validation**
317
+ - .mdc file structure (frontmatter, globs, content)
318
+ - File naming conventions
319
+ - Manifest accuracy
320
+ - No orphaned files
321
+
322
+ For detailed testing documentation, see [TESTING.md](TESTING.md).
323
+
324
+ ## License
325
+
326
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).