skiller 0.7.19 → 0.7.21

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/README.md CHANGED
@@ -1,995 +1,63 @@
1
1
  # `skiller`
2
2
 
3
- A Claude-centric fork of [ruler](https://github.com/intellectronica/ruler) with native skills support:
4
-
5
- ## 1. Skills as Source of Truth
6
-
7
- - `.claude/skills/` is the committed source of truth for skills
8
- - **Bidirectional sync** between `.mdc` and `SKILL.md` (sibling pattern):
9
- - Create `.claude/skills/foo/foo.mdc` → auto-generates `.claude/skills/foo/SKILL.md`
10
- - Create `.claude/skills/foo/SKILL.md` → auto-generates `.claude/skills/foo/foo.mdc`
11
- - Sync direction detected via `@reference` body pattern (SKILL.md with `@path` = .mdc is source)
12
- - Edit either file, the other stays in sync on next `skiller apply`
13
- - `.claude/rules/` contents are migrated to `.claude/skills/` and rules directory is deleted
14
-
15
- ## 2. CLAUDE.md @filename References
16
-
17
- - Uses `@filename` syntax instead of merging content
18
- - Claude Code auto-includes referenced files
19
- - Reduces CLAUDE.md size and keeps sources separate
20
- - Other agents still get merged content
21
-
22
- ## 3. MDC File Support
23
-
24
- - Supports both `.md` and `.mdc` files (Nuxt Content, Vue)
25
- - All patterns auto-expand: `"components"` → `"components/**/*.{md,mdc}"`
26
-
27
- ## 4. Rules Filtering
28
-
29
- - `include`/`exclude` glob patterns in `[rules]`
30
- - Directory names auto-expand to `directory/**/*.{md,mdc}`
31
- - Organize by team/feature, exclude drafts/internal docs
32
-
33
- ## 5. Claude Root Folder
34
-
35
- - Default directory is `.claude/` (no extra flags needed)
36
- - Skills already in `.claude/skills` (no copying)
37
- - Single directory for all Claude Code config
38
-
39
- ## 6. Cursor-style Rules
40
-
41
- - `merge_strategy = "cursor"` parses `.mdc` frontmatter
42
- - Only includes rules with `alwaysApply: true`
43
- - Strips frontmatter, keeps body only
44
-
45
- ## 7. Backup Control
46
-
47
- - `[backup].enabled = false` disables `.bak` files
48
-
49
- ## 8. Multi-Agent Skills Propagation
50
-
51
- - `.claude/skills/` is the source of truth — skills are automatically copied to agent-specific directories on `skiller apply`
52
- - Supported agent paths: `.codex/skills`, `.cursor/skills`, `.opencode/skill`, `.roo/skills`, `.gemini/skills`, `.agents/skills`
53
- - Shared paths are deduplicated (Claude/Copilot/Kilo share `.claude/skills`, Goose/Amp share `.agents/skills`)
54
- - Agent skills directories are auto-added to `.gitignore` (excluding `.claude/skills`)
55
- - Validates skill structure — warns on missing `SKILL.md`
56
- - Flattens nested skills into dash-separated names for agent skills dirs (e.g., `workflows/lfg` → `workflows-lfg`)
57
-
58
- ## 9. Claude Code Plugins → Skills
59
-
60
- - Reads `.claude/settings.json` `enabledPlugins`
61
- - Reads plugin content from `~/.claude/plugins/marketplaces` (never from `cache/`)
62
- - Syncs enabled plugin `skills/` into agent skills directories on `skiller apply` (recursive, flattened names)
63
- - Syncs enabled plugin `commands/*.md` as skills (`SKILL.md`) into agent skills directories
64
- - Syncs enabled plugin `agents/**/*.md` as skills (`SKILL.md`) into agent skills directories
65
- - Uses the skill/command/agent name by default (matches existing Codex skill names)
66
- - If a name conflicts, local skills win and the plugin skill is namespaced as `<pluginName>-<name>` (marketplace only when needed)
67
- - Tracks plugin-managed skills in a single `.skiller.json` file per agent skills directory
68
- - Removes stale plugin skills when plugins are disabled
69
-
70
- ## 10. Claude Commands/Agents → Skills
71
-
72
- - Syncs `.claude/commands/**/*.md` as skills (`SKILL.md`) into agent skills directories
73
- - Syncs `.claude/agents/**/*.md` as skills (`SKILL.md`) into agent skills directories
74
- - Uses the command/agent name by default
75
- - If a name conflicts, existing local/manual skills win and the project item is namespaced as `claude-<name>`
76
- - Project items win over plugin skills/commands/agents on name conflicts
77
- - Tracks project-managed items in a single `.skiller.json` file per agent skills directory
78
-
79
- ---
80
-
81
- # Skiller: Centralise Your AI Coding Assistant Instructions
82
-
83
- > **Beta Research Preview**
84
- >
85
- > - Please test this version carefully in your environment
86
- > - Report issues at https://github.com/udecode/skiller/issues
87
-
88
- ## Why Skiller?
89
-
90
- Managing instructions across multiple AI coding tools becomes complex as your team grows. Different agents (GitHub Copilot, Claude, Cursor, Aider, etc.) require their own configuration files, leading to:
91
-
92
- - **Inconsistent guidance** across AI tools
93
- - **Duplicated effort** maintaining multiple config files
94
- - **Context drift** as project requirements evolve
95
- - **Onboarding friction** for new AI tools
96
- - **Complex project structures** requiring context-specific instructions for different components
97
-
98
- Skiller solves this by providing a **single source of truth** for all your AI agent instructions, automatically distributing them to the right configuration files. With support for **nested rule loading**, Skiller can handle complex project structures with context-specific instructions for different components.
99
-
100
- ## Core Features
101
-
102
- - **Centralised Rule Management**: Store all AI instructions in a dedicated `.claude/` directory using Markdown files
103
- - **Nested Rule Loading**: Support complex project structures with multiple `.claude/` directories for context-specific instructions
104
- - **Automatic Distribution**: Skiller applies these rules to configuration files of supported AI agents
105
- - **Targeted Agent Configuration**: Fine-tune which agents are affected and their specific output paths via `skiller.toml`
106
- - **MCP Server Propagation**: Manage and distribute Model Context Protocol (MCP) server settings
107
- - **`.gitignore` Automation**: Keeps generated agent config files out of version control automatically
108
- - **Simple CLI**: Easy-to-use commands for initialising and applying configurations
109
-
110
- ## Supported AI Agents
111
-
112
- | Agent | Rules File(s) | MCP Configuration / Notes | Skills Location |
113
- | ---------------- | -------------------------------------------------- | ------------------------------------------------ | ------------------ |
114
- | AGENTS.md | `AGENTS.md` | (pseudo-agent ensuring root `AGENTS.md` exists) | - |
115
- | GitHub Copilot | `AGENTS.md` | `.vscode/mcp.json` | `.claude/skills/` |
116
- | Claude Code | `CLAUDE.md` (@filename references) | `.mcp.json` | `.claude/skills/` |
117
- | OpenAI Codex CLI | `AGENTS.md` | `.codex/config.toml` | `.codex/skills/` |
118
- | Jules | `AGENTS.md` | - | - |
119
- | Cursor | `AGENTS.md` | `.cursor/mcp.json` | `.cursor/skills/` |
120
- | Windsurf | `AGENTS.md` | `.windsurf/mcp_config.json` | - |
121
- | Cline | `.clinerules` | - | - |
122
- | Crush | `CRUSH.md` | `.crush.json` | - |
123
- | Amp | `AGENTS.md` | - | `.agents/skills/` |
124
- | Amazon Q CLI | `.amazonq/rules/skiller_q_rules.md` | `.amazonq/mcp.json` | - |
125
- | Aider | `AGENTS.md`, `.aider.conf.yml` | `.mcp.json` | - |
126
- | Firebase Studio | `.idx/airules.md` | `.idx/mcp.json` | - |
127
- | Open Hands | `.openhands/microagents/repo.md` | `config.toml` | - |
128
- | Gemini CLI | `AGENTS.md` | `.gemini/settings.json` | `.gemini/skills/` |
129
- | Junie | `.junie/guidelines.md` | - | - |
130
- | AugmentCode | `.augment/rules/skiller_augment_instructions.md` | - | - |
131
- | Kilo Code | `.kilocode/rules/skiller_kilocode_instructions.md` | `.kilocode/mcp.json` | `.claude/skills/` |
132
- | OpenCode | `AGENTS.md` | `opencode.json` | `.opencode/skill/` |
133
- | Goose | `.goosehints` | - | `.agents/skills/` |
134
- | Qwen Code | `AGENTS.md` | `.qwen/settings.json` | - |
135
- | RooCode | `AGENTS.md` | `.roo/mcp.json` | `.roo/skills/` |
136
- | Zed | `AGENTS.md` | `.zed/settings.json` (project root, never $HOME) | - |
137
- | Trae AI | `.trae/rules/project_rules.md` | - | - |
138
- | Warp | `WARP.md` | - | - |
139
- | Kiro | `.kiro/steering/skiller_kiro_instructions.md` | - | - |
140
- | Firebender | `firebender.json` | `firebender.json` (rules and MCP in same file) | - |
141
-
142
- ## Getting Started
143
-
144
- ### Installation
145
-
146
- **Using `npx` (for one-off commands):**
3
+ Apply the same rules (and skills) to multiple AI coding agents.
147
4
 
148
5
  ```bash
6
+ npx skiller@latest init
149
7
  npx skiller@latest apply
150
8
  ```
151
9
 
152
- ### Project Initialisation
153
-
154
- 1. Navigate to your project's root directory
155
- 2. Run `skiller init`
156
- 3. This creates:
157
-
158
- - `.claude/` directory
159
- - `.claude/AGENTS.md`: The primary starter Markdown file for your rules
160
- - `.claude/skiller.toml`: The main configuration file for Skiller
161
-
162
- Additionally, you can create a global configuration to use when no local `.claude/` directory is found:
163
-
164
- ```bash
165
- skiller init --global
166
- ```
167
-
168
- The global configuration will be created to `$XDG_CONFIG_HOME/skiller` (default: `~/.config/skiller`).
169
-
170
- ## Core Concepts
171
-
172
- ### The `.claude/` Directory
173
-
174
- This is your central hub for all AI agent instructions:
175
-
176
- - **Primary File Order & Precedence**:
177
- 1. A repository root `AGENTS.md` (outside `.claude/`) if present (highest precedence, prepended)
178
- 2. `.claude/AGENTS.md` (new default starter file)
179
- 3. Remaining discovered `.md` files under `.claude/` (and subdirectories) in sorted order
180
- - **Rule Files (`*.md`)**: Discovered recursively from `.claude/` or `$XDG_CONFIG_HOME/skiller` and concatenated in the order above
181
- - **Concatenation Marker**: Each file's content is prepended with `--- Source: <relative_path_to_md_file> ---` for traceability
182
- - **`skiller.toml`**: Master configuration for Skiller's behavior, agent selection, and output paths
183
- - **`mcp.json`**: Shared MCP server settings
184
-
185
- This ordering lets you keep a short, high-impact root `AGENTS.md` (e.g. executive project summary) while housing detailed guidance inside `.claude/`.
186
-
187
- ### Nested Rule Loading
188
-
189
- Skiller now supports **nested rule loading** with the `--nested` flag, enabling context-specific instructions for different parts of your project:
190
-
191
- ```
192
- project/
193
- ├── .claude/ # Global project rules
194
- │ ├── AGENTS.md
195
- │ └── coding_style.md
196
- ├── src/
197
- │ └── .claude/ # Component-specific rules
198
- │ └── api_guidelines.md
199
- ├── tests/
200
- │ └── .claude/ # Test-specific rules
201
- │ └── testing_conventions.md
202
- └── docs/
203
- └── .claude/ # Documentation rules
204
- └── writing_style.md
205
- ```
206
-
207
- **How it works:**
208
-
209
- - Discover all `.claude/` directories in the project hierarchy
210
- - Load and concatenate rules from each directory in order
211
- - Decide whether nested mode is enabled using the following precedence:
212
- 1. `skiller apply --nested` (or `--no-nested`) takes top priority
213
- 2. `nested = true` in `skiller.toml`
214
- 3. Default to disabled when neither option is provided
215
- - When a run is nested, downstream configs are forced to keep `nested = true`. If a child config attempts to disable it, Skiller keeps nested processing active and emits a warning in the logs.
216
- - Nested processing carries forward each directory's own MCP bundle and configuration settings so that generated files remain scoped to their source directories while being normalized back to the project root.
217
-
218
- > [!CAUTION]
219
- > Nested mode is experimental and may change in future releases. The CLI logs this warning the first time a nested run is detected so you know the behavior may evolve.
220
-
221
- **Perfect for:**
222
-
223
- - Monorepos with multiple services
224
- - Projects with distinct components (frontend/backend)
225
- - Teams needing different instructions for different areas
226
- - Complex codebases with varying standards
227
-
228
- ### Best Practices for Rule Files
229
-
230
- **Granularity**: Break down complex instructions into focused `.md` files:
231
-
232
- - `coding_style.md`
233
- - `api_conventions.md`
234
- - `project_architecture.md`
235
- - `security_guidelines.md`
236
-
237
- **Example rule file (`.claude/python_guidelines.md`):**
238
-
239
- ```markdown
240
- # Python Project Guidelines
241
-
242
- ## General Style
243
-
244
- - Follow PEP 8 for all Python code
245
- - Use type hints for all function signatures and complex variables
246
- - Keep functions short and focused on a single task
247
-
248
- ## Error Handling
249
-
250
- - Use specific exception types rather than generic `Exception`
251
- - Log errors effectively with context
252
-
253
- ## Security
254
-
255
- - Always validate and sanitize user input
256
- - Be mindful of potential injection vulnerabilities
257
- ```
258
-
259
- ## Usage: The `apply` Command
260
-
261
- ### Primary Command
262
-
263
- ```bash
264
- skiller apply [options]
265
- ```
266
-
267
- The `apply` command looks for `.claude/` in the current directory tree, reading the first match. If no such directory is found, it will look for a global configuration in `$XDG_CONFIG_HOME/skiller`.
268
-
269
- ### Options
270
-
271
- | Option | Description |
272
- | ------------------------------ | ---------------------------------------------------------------------- |
273
- | `--project-root <path>` | Project root path (default: current directory). |
274
- | `--agents <agent1,agent2,...>` | Comma-separated agent names to target (see supported list below). |
275
- | `--config <path>` | Custom `skiller.toml` path. |
276
- | `--mcp` / `--with-mcp` | Enable applying MCP server configurations (default: true). |
277
- | `--no-mcp` | Disable applying MCP server configurations. |
278
- | `--mcp-overwrite` | Overwrite native MCP config instead of merging. |
279
- | `--gitignore` | Enable automatic .gitignore updates (default: true). |
280
- | `--no-gitignore` | Disable automatic .gitignore updates. |
281
- | `--nested` | Enable nested rule loading (default: inherit from config or disabled). |
282
- | `--no-nested` | Disable nested rule loading even if `nested = true` in config. |
283
- | `--backup` / `--no-backup` | Enable/disable creation of `.bak` backup files (default: enabled). |
284
- | `--dry-run` | Preview changes without writing files. |
285
- | `--local-only` | Skip `$XDG_CONFIG_HOME` when looking for configuration. |
286
- | `--verbose` / `-v` | Display detailed output during execution. |
287
-
288
- ### Common Examples
289
-
290
- **Apply rules to all configured agents:**
291
-
292
- ```bash
293
- skiller apply
294
- ```
295
-
296
- **Apply rules only to GitHub Copilot and Claude:**
297
-
298
- ```bash
299
- skiller apply --agents copilot,claude
300
- ```
301
-
302
- **Apply rules only to Firebase Studio:**
303
-
304
- ```bash
305
- skiller apply --agents firebase
306
- ```
307
-
308
- **Apply rules only to Warp:**
309
-
310
- ```bash
311
- skiller apply --agents warp
312
- ```
313
-
314
- **Apply rules only to Trae AI:**
315
-
316
- ```bash
317
- skiller apply --agents trae
318
- ```
319
-
320
- **Apply rules only to RooCode:**
321
-
322
- ```bash
323
- skiller apply --agents roo
324
- ```
325
-
326
- **Use a specific configuration file:**
327
-
328
- ```bash
329
- skiller apply --config ./team-configs/skiller.frontend.toml
330
- ```
331
-
332
- **Apply rules with verbose output:**
333
-
334
- ```bash
335
- skiller apply --verbose
336
- ```
337
-
338
- **Apply rules but skip MCP and .gitignore updates:**
339
-
340
- ```bash
341
- skiller apply --no-mcp --no-gitignore
342
- ```
343
-
344
- ## Usage: The `revert` Command
345
-
346
- The `revert` command safely undoes all changes made by `skiller apply`, restoring your project to its pre-skiller state. It intelligently restores files from backups (`.bak` files) when available, or removes generated files that didn't exist before.
347
-
348
- ### Why Revert is Needed
349
-
350
- When experimenting with different rule configurations or switching between projects, you may want to:
351
-
352
- - **Clean slate**: Remove all skiller-generated files to start fresh
353
- - **Restore originals**: Revert modified files back to their original state
354
- - **Selective cleanup**: Remove configurations for specific agents only
355
- - **Safe experimentation**: Try skiller without fear of permanent changes
356
-
357
- ### Primary Command
358
-
359
- ```bash
360
- skiller revert [options]
361
- ```
362
-
363
- ### Options
364
-
365
- | Option | Description |
366
- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
367
- | `--project-root <path>` | Path to your project's root (default: current directory) |
368
- | `--agents <agent1,agent2,...>` | Comma-separated list of agent names to revert (agentsmd, aider, amazonqcli, amp, augmentcode, claude, cline, codex, copilot, crush, cursor, firebase, firebender, gemini-cli, goose, jules, junie, kilocode, kiro, opencode, openhands, qwen, roo, trae, warp, windsurf, zed) |
369
- | `--config <path>` | Path to a custom `skiller.toml` configuration file |
370
- | `--keep-backups` | Keep backup files (.bak) after restoration (default: false) |
371
- | `--dry-run` | Preview changes without actually reverting files |
372
- | `--verbose` / `-v` | Display detailed output during execution |
373
- | `--local-only` | Only search for local .claude directories, ignore global config |
374
-
375
- ### Common Examples
376
-
377
- **Revert all skiller changes:**
378
-
379
- ```bash
380
- skiller revert
381
- ```
382
-
383
- **Preview what would be reverted (dry-run):**
384
-
385
- ```bash
386
- skiller revert --dry-run
387
- ```
388
-
389
- **Revert only specific agents:**
390
-
391
- ```bash
392
- skiller revert --agents claude,copilot
393
- ```
394
-
395
- **Revert with detailed output:**
396
-
397
- ```bash
398
- skiller revert --verbose
399
- ```
400
-
401
- **Keep backup files after reverting:**
402
-
403
- ```bash
404
- skiller revert --keep-backups
405
- ```
406
-
407
- ## Configuration (`skiller.toml`) in Detail
408
-
409
- ### Location
410
-
411
- Defaults to `.claude/skiller.toml` in the project root. Override with `--config` CLI option.
412
-
413
- ### Complete Example
414
-
415
- ```toml
416
- # Default agents to run when --agents is not specified
417
- # Uses case-insensitive substring matching
418
- default_agents = ["copilot", "claude", "aider"]
419
-
420
- # --- Global MCP Server Configuration ---
421
- [mcp]
422
- # Enable/disable MCP propagation globally (default: true)
423
- enabled = true
424
- # Global merge strategy: 'merge' or 'overwrite' (default: 'merge')
425
- merge_strategy = "merge"
426
-
427
- # --- MCP Server Definitions ---
428
- [mcp_servers.filesystem]
429
- command = "npx"
430
- args = ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"]
431
-
432
- [mcp_servers.git]
433
- command = "npx"
434
- args = ["-y", "@modelcontextprotocol/server-git", "--repository", "."]
435
-
436
- [mcp_servers.remote_api]
437
- url = "https://api.example.com"
438
-
439
- [mcp_servers.remote_api.headers]
440
- Authorization = "Bearer your-token"
441
-
442
- # --- Global .gitignore Configuration ---
443
- [gitignore]
444
- # Enable/disable automatic .gitignore updates (default: true)
445
- enabled = true
446
-
447
- # --- Backup Configuration ---
448
- [backup]
449
- # Enable/disable creation of .bak backup files (default: true)
450
- enabled = false
451
-
452
- # --- Agent-Specific Configurations ---
453
- [agents.copilot]
454
- enabled = true
455
-
456
- [agents.claude]
457
- enabled = true
458
- output_path = "CLAUDE.md"
459
-
460
- [agents.aider]
461
- enabled = true
462
- output_path_instructions = "AGENTS.md"
463
- output_path_config = ".aider.conf.yml"
464
-
465
- # OpenAI Codex CLI agent and MCP config
466
- [agents.codex]
467
- enabled = true
468
- output_path = "AGENTS.md"
469
- output_path_config = ".codex/config.toml"
470
-
471
- # Agent-specific MCP configuration for Codex CLI
472
- [agents.codex.mcp]
473
- enabled = true
474
- merge_strategy = "merge"
475
-
476
- [agents.firebase]
477
- enabled = true
478
- output_path = ".idx/airules.md"
479
-
480
- [agents.gemini-cli]
481
- enabled = true
482
-
483
- [agents.jules]
484
- enabled = true
485
-
486
- [agents.junie]
487
- enabled = true
488
- output_path = ".junie/guidelines.md"
489
-
490
- # Agent-specific MCP configuration
491
- [agents.cursor.mcp]
492
- enabled = true
493
- merge_strategy = "merge"
494
-
495
- # Disable specific agents
496
- [agents.windsurf]
497
- enabled = false
498
-
499
- [agents.kilocode]
500
- enabled = true
501
- output_path = ".kilocode/rules/skiller_kilocode_instructions.md"
502
-
503
- [agents.warp]
504
- enabled = true
505
- output_path = "WARP.md"
506
- ```
507
-
508
- ### Configuration Precedence
509
-
510
- 1. **CLI flags** (e.g., `--agents`, `--no-mcp`, `--mcp-overwrite`, `--no-gitignore`)
511
- 2. **Settings in `skiller.toml`** (`default_agents`, specific agent settings, global sections)
512
- 3. **Skiller's built-in defaults** (all agents enabled, standard output paths, MCP enabled with 'merge')
513
-
514
- ## MCP (Model Context Protocol) Server Configuration
515
-
516
- MCP provides broader context to AI models through server configurations. Skiller can manage and distribute these settings across compatible agents.
517
-
518
- ### TOML Configuration (Recommended)
519
-
520
- You can now define MCP servers directly in `skiller.toml` using the `[mcp_servers.<name>]` syntax:
521
-
522
- ```toml
523
- # Global MCP behavior
524
- [mcp]
525
- enabled = true
526
- merge_strategy = "merge" # or "overwrite"
527
-
528
- # Local (stdio) server
529
- [mcp_servers.filesystem]
530
- command = "npx"
531
- args = ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"]
532
-
533
- [mcp_servers.filesystem.env]
534
- API_KEY = "your-api-key"
535
-
536
- # Remote server
537
- [mcp_servers.search]
538
- url = "https://mcp.example.com"
539
-
540
- [mcp_servers.search.headers]
541
- Authorization = "Bearer your-token"
542
- "X-API-Version" = "v1"
543
- ```
544
-
545
- ### Configuration Precedence
546
-
547
- When both TOML and JSON configurations are present:
548
-
549
- 1. **TOML servers take precedence** over JSON servers with the same name
550
- 2. **Servers are merged** from both sources (unless using overwrite strategy)
551
- 3. **Deprecation warning** is shown encouraging migration to TOML (warning shown once per run)
552
-
553
- ### Server Types
554
-
555
- **Local/stdio servers** require a `command` field:
556
-
557
- ```toml
558
- [mcp_servers.local_server]
559
- command = "node"
560
- args = ["server.js"]
561
-
562
- [mcp_servers.local_server.env]
563
- DEBUG = "1"
564
- ```
565
-
566
- **Remote servers** require a `url` field (headers optional; bearer Authorization token auto-extracted for OpenHands when possible):
567
-
568
- ```toml
569
- [mcp_servers.remote_server]
570
- url = "https://api.example.com"
571
-
572
- [mcp_servers.remote_server.headers]
573
- Authorization = "Bearer token"
574
- ```
575
-
576
- Skiller uses this configuration with the `merge` (default) or `overwrite` strategy, controlled by `skiller.toml` or CLI flags.
577
-
578
- **Home Directory Safety:** Skiller never writes MCP configuration files outside your project root. Any historical references to user home directories (e.g. `~/.codeium/windsurf/mcp_config.json` or `~/.zed/settings.json`) have been removed; only project-local paths are targeted.
579
-
580
- **Note for OpenAI Codex CLI:** To apply the local Codex CLI MCP configuration, set the `CODEX_HOME` environment variable to your project’s `.codex` directory:
581
-
582
- ```bash
583
- export CODEX_HOME="$(pwd)/.codex"
584
- ```
585
-
586
- ## Skills Support
587
-
588
- Skiller can manage and propagate skills to supported AI agents. Skills are stored in `.claude/skills/` as the **committed source of truth** and automatically copied to agent-specific directories on `skiller apply`.
589
-
590
- ### How It Works
591
-
592
- Skills are specialized knowledge packages that extend AI agent capabilities. Skiller discovers skills in your `.claude/skills/` directory, keeps them in sync via bidirectional `.mdc`/`SKILL.md` sync, and propagates them to all agents with native skills support:
593
-
594
- - **Claude Code, GitHub Copilot, Kilo Code**: `.claude/skills/` (shared, source of truth)
595
- - **OpenAI Codex CLI**: `.codex/skills/`
596
- - **Cursor**: `.cursor/skills/`
597
- - **OpenCode**: `.opencode/skill/`
598
- - **Goose, Amp**: `.agents/skills/` (shared)
599
- - **Roo Code**: `.roo/skills/`
600
- - **Gemini CLI**: `.gemini/skills/`
601
-
602
- Shared paths are deduplicated — agents sharing the same directory only trigger one copy operation.
603
-
604
- ### Claude Code Plugins
605
-
606
- If your project enables Claude Code plugins in `.claude/settings.json`, Skiller also syncs plugin content into agent skills directories on `skiller apply`:
607
-
608
- - Plugin `skills/` are copied as skills
609
- - Plugin `commands/*.md` are converted into skills (`SKILL.md`)
610
- - Plugin skills use their original skill/command name by default
611
- - If a name conflicts, local skills win and the plugin skill is namespaced as `<pluginName>-<name>` (marketplace only when needed)
612
- - Plugin-managed skills are tracked via `.skiller.json` in each agent skills directory
613
-
614
- ### Skills Directory Structure
615
-
616
- Skills can be organized flat or nested:
617
-
618
- ```
619
- .claude/skills/
620
- ├── my-skill/
621
- │ ├── my-skill.mdc # Skill content (body)
622
- │ └── SKILL.md # @reference to my-skill.mdc (frontmatter here)
623
- ├── another-skill/
624
- │ ├── another-skill.mdc # Generated from SKILL.md body
625
- │ ├── SKILL.md # Manually created skill (now @reference)
626
- │ ├── helper.py # Optional: additional resources (scripts)
627
- │ └── reference.md # Optional: additional resources (docs)
628
- ```
629
-
630
- Each skill can be defined in two ways:
631
-
632
- 1. **Standalone `.mdc` file** - Simple skills can be a single `.mdc` file at the skills root
633
- 2. **Skill folder with `SKILL.md`** - Complex skills with additional resources
634
-
635
- ### Bidirectional Sync
636
-
637
- Skiller provides bidirectional sync between `.mdc` files and `SKILL.md` folders:
638
-
639
- | Scenario | Sync Direction |
640
- | ------------------------------- | ---------------------------------------------------------- |
641
- | `.mdc` exists, no `SKILL.md` | → Generate `SKILL.md` with `@reference` to .mdc |
642
- | `SKILL.md` body is `@reference` | .mdc is source of truth (frontmatter in SKILL.md) |
643
- | `SKILL.md` has full content | → Generate .mdc from body, update SKILL.md to `@reference` |
644
-
645
- The `@reference` body pattern indicates that the `.mdc` file contains the skill content:
646
-
647
- ```yaml
648
- ---
649
- name: my-skill
650
- description: My custom skill
651
- ---
652
-
653
- @.claude/skills/my-skill/my-skill.mdc
654
- ```
655
-
656
- ### Rules Migration
657
-
658
- Content from `.claude/rules/` is automatically migrated to `.claude/skills/` during `skiller apply`, then the rules directory is deleted:
659
-
660
- ```
661
- .claude/rules/docx/
662
- ├── SKILL.md # Makes this a skill folder
663
- ├── script.sh # Helper script
664
- └── templates/ # Subdirectory
665
- └── default.docx # Template file
666
-
667
- → Migrated to:
668
-
669
- .claude/skills/docx/
670
- ├── docx.mdc # Generated from SKILL.md body
671
- ├── SKILL.md # Updated to @reference
672
- ├── script.sh # Copied automatically
673
- └── templates/ # Copied automatically
674
- └── default.docx # Copied automatically
675
-
676
- .claude/rules/ → Deleted after migration
677
- ```
678
-
679
- ### Configuration
680
-
681
- Skills support is **enabled by default** but can be controlled via:
682
-
683
- **CLI flags:**
684
-
685
- ```bash
686
- # Enable skills (default)
687
- skiller apply --skills
688
-
689
- # Disable skills
690
- skiller apply --no-skills
691
- ```
692
-
693
- **Configuration in `skiller.toml`:**
694
-
695
- ```toml
696
- [skills]
697
- enabled = true # or false to disable
698
- ```
699
-
700
- ### Validation
701
-
702
- Skiller validates discovered skills and issues warnings for:
703
-
704
- - Missing required file (`SKILL.md`)
705
- - Invalid directory structures (directories without `SKILL.md` and no sub-skills)
706
-
707
- Warnings don't prevent propagation but help identify potential issues.
708
-
709
- ### `.gitignore` Integration
710
-
711
- When skills propagation is enabled, agent skills directories are automatically added to `.gitignore` (excluding `.claude/skills/` which is the committed source of truth):
712
-
713
- - `.codex/skills/`, `.cursor/skills/`, `.opencode/skill/`, `.agents/skills/`, `.roo/skills/`, `.gemini/skills/`
714
-
715
- ### Dry-Run Mode
716
-
717
- Test skills propagation without making changes:
718
-
719
- ```bash
720
- skiller apply --dry-run
721
- ```
722
-
723
- This shows which skills would be synced, validated, and copied to each agent directory.
724
-
725
- ### Example Workflow
726
-
727
- ```bash
728
- # 1. Create a skill folder
729
- mkdir -p .claude/skills/my-skill
730
- cat > .claude/skills/my-skill/SKILL.md << 'EOF'
731
- ---
732
- name: my-skill
733
- description: My custom skill
734
- ---
735
-
736
- # My Custom Skill
737
-
738
- This skill provides specialized knowledge for...
739
- EOF
740
-
741
- # 2. Apply to sync and propagate skills
742
- skiller apply
743
-
744
- # 3. Skills are now available to all compatible agents:
745
- # - Claude Code, Copilot, Kilo Code: .claude/skills/my-skill/
746
- # - Codex CLI: .codex/skills/my-skill/
747
- # - Cursor: .cursor/skills/my-skill/
748
- # - OpenCode: .opencode/skill/my-skill/
749
- # - Goose, Amp: .agents/skills/my-skill/
750
- # - Roo Code: .roo/skills/my-skill/
751
- # - Gemini CLI: .gemini/skills/my-skill/
752
- ```
753
-
754
- ## `.gitignore` Integration
755
-
756
- Skiller automatically manages your `.gitignore` file to keep generated agent configuration files out of version control.
757
-
758
- ### How it Works
759
-
760
- - Creates or updates `.gitignore` in your project root
761
- - Adds paths to a managed block marked with `# START Skiller Generated Files` and `# END Skiller Generated Files`
762
- - Preserves existing content outside this block
763
- - Sorts paths alphabetically and uses relative POSIX-style paths
764
-
765
- ### Example `.gitignore` Section (sample - actual list depends on enabled agents)
766
-
767
- ```gitignore
768
- # Your existing rules
769
- node_modules/
770
- *.log
771
-
772
- # START Skiller Generated Files
773
- .aider.conf.yml
774
- .clinerules
775
- AGENTS.md
776
- CLAUDE.md
777
- # END Skiller Generated Files
778
-
779
- dist/
780
- ```
781
-
782
- ### Control Options
783
-
784
- - **CLI flags**: `--gitignore` or `--no-gitignore`
785
- - **Configuration**: `[gitignore].enabled` in `skiller.toml`
786
- - **Default**: enabled
787
-
788
- ## Practical Usage Scenarios
789
-
790
- ### Scenario 1: Getting Started Quickly
791
-
792
- ```bash
793
- # Initialize Skiller in your project
794
- cd your-project
795
- skiller init
796
-
797
- # Edit the generated files
798
- # - Add your coding guidelines to .claude/AGENTS.md (or keep adding additional .md files)
799
- # - Customize .claude/skiller.toml if needed
800
-
801
- # Apply rules to all AI agents
802
- skiller apply
803
- ```
804
-
805
- ### Scenario 2: Complex Projects with Nested Rules
806
-
807
- For large projects with multiple components or services, enable nested rule loading so each directory keeps its own rules and MCP bundle:
808
-
809
- ```bash
810
- # Set up nested .claude directories
811
- mkdir -p src/.claude tests/.claude docs/.claude
812
-
813
- # Add component-specific instructions
814
- echo "# API Design Guidelines" > src/.claude/api_rules.md
815
- echo "# Testing Best Practices" > tests/.claude/test_rules.md
816
- echo "# Documentation Standards" > docs/.claude/docs_rules.md
817
- ```
818
-
819
- ```toml
820
- # .claude/skiller.toml
821
- nested = true
822
- ```
823
-
824
- ```bash
825
- # The CLI inherits nested mode from skiller.toml
826
- skiller apply --verbose
827
-
828
- # Override from the CLI at any time
829
- skiller apply --no-nested
830
- ```
831
-
832
- This creates context-specific instructions for different parts of your project while maintaining global rules in the root `.claude/` directory. Nested runs automatically keep every nested config enabled even if a child tries to disable it.
833
-
834
- > [!NOTE]
835
- > The CLI prints "Nested mode is experimental and may change in future releases." the first time nested processing runs. Expect refinements in future versions.
836
-
837
- ### Scenario 3: Team Standardization
838
-
839
- 1. Create `.claude/coding_standards.md`, `.claude/api_usage.md`
840
- 2. Commit the `.claude` directory to your repository
841
- 3. Team members pull changes and run `skiller apply` to update their local AI agent configurations
842
-
843
- ### Scenario 4: Project-Specific Context for AI
844
-
845
- 1. Detail your project's architecture in `.claude/project_overview.md`
846
- 2. Describe primary data structures in `.claude/data_models.md`
847
- 3. Run `skiller apply` to help AI tools provide more relevant suggestions
848
-
849
- ### Integration with NPM Scripts
850
-
851
- ```json
852
- {
853
- "scripts": {
854
- "skiller:apply": "skiller apply",
855
- "dev": "npm run skiller:apply && your_dev_command",
856
- "precommit": "npm run skiller:apply"
857
- }
858
- }
859
- ```
860
-
861
- ### Integration with GitHub Actions
862
-
863
- ```yaml
864
- # .github/workflows/skiller-check.yml
865
- name: Check Skiller Configuration
866
- on:
867
- pull_request:
868
- paths: ['.claude/**']
869
-
870
- jobs:
871
- check-skiller:
872
- runs-on: ubuntu-latest
873
- steps:
874
- - uses: actions/checkout@v4
875
- - uses: actions/setup-node@v4
876
- with:
877
- node-version: '18'
878
- cache: 'npm'
879
-
880
- - name: Install Skiller
881
- run: npm install -g skiller
882
-
883
- - name: Apply Skiller configuration
884
- run: skiller apply --no-gitignore
885
-
886
- - name: Check for uncommitted changes
887
- run: |
888
- if [[ -n $(git status --porcelain) ]]; then
889
- echo "::error::Skiller configuration is out of sync!"
890
- echo "Please run 'skiller apply' locally and commit the changes."
891
- exit 1
892
- fi
893
- ```
894
-
895
- ## Troubleshooting
896
-
897
- ### Common Issues
898
-
899
- **"Cannot find module" errors:**
900
-
901
- - Ensure Skiller is installed globally: `npm install -g skiller`
902
- - Or use `npx skiller@latest`
903
-
904
- **Permission denied errors:**
905
-
906
- - On Unix systems, you may need `sudo` for global installation
907
-
908
- **Agent files not updating:**
909
-
910
- - Check if the agent is enabled in `skiller.toml`
911
- - Verify agent isn't excluded by `--agents` flag
912
- - Use `--verbose` to see detailed execution logs
913
-
914
- **Configuration validation errors:**
915
-
916
- - Skiller now validates `skiller.toml` format and will show specific error details
917
- - Check that all configuration values match the expected types and formats
918
-
919
- ### Debug Mode
920
-
921
- Use `--verbose` flag to see detailed execution logs:
922
-
923
- ```bash
924
- skiller apply --verbose
925
- ```
926
-
927
- This shows:
928
-
929
- - Configuration loading details
930
- - Agent selection logic
931
- - File processing information
932
- - MCP configuration steps
933
-
934
- ## FAQ
935
-
936
- **Q: Can I use different rules for different agents?**
937
- A: Currently, all agents receive the same concatenated rules. For agent-specific instructions, include sections in your rule files like "## GitHub Copilot Specific" or "## Aider Configuration".
938
-
939
- **Q: How do I set up different instructions for different parts of my project?**
940
- A: Enable nested mode either by setting `nested = true` in `skiller.toml` or by passing `skiller apply --nested`. The CLI inherits the config setting by default, but `--no-nested` always wins if you need to opt out for a run. Nested mode keeps loading rules (and MCP settings) from every `.claude/` directory in the hierarchy, forces child configs to remain nested, and logs "Nested mode is experimental and may change in future releases." if any nested processing occurs.
941
-
942
- **Q: How do I temporarily disable Skiller for an agent?**
943
- A: Set `enabled = false` in `skiller.toml` under `[agents.agentname]`, or use `--agents` flag to specify only the agents you want.
944
-
945
- **Q: What happens to my existing agent configuration files?**
946
- A: Skiller creates backups with `.bak` extension before overwriting any existing files.
947
-
948
- **Q: Can I run Skiller in CI/CD pipelines?**
949
- A: Yes! Use `skiller apply --no-gitignore` in CI to avoid modifying `.gitignore`. See the GitHub Actions example above.
950
-
951
- **Q: How does OpenHands MCP propagation classify servers?**
952
- A: Local stdio servers become `stdio_servers`. Remote URLs containing `/sse` are classified as `sse_servers`; others become `shttp_servers`. Bearer tokens in an `Authorization` header are extracted into `api_key` where possible.
953
-
954
- **Q: Where is Zed configuration written now?**
955
- A: Skiller writes a `settings.json` in the project root (not the user home dir) and transforms MCP server definitions to Zed's `context_servers` format including `source: "custom"`.
956
-
957
- **Q: What changed about MCP initialization?**
958
- A: `skiller init` now only adds example MCP server sections to `skiller.toml` instead of creating `.claude/mcp.json`. The JSON file is still consumed if present, but TOML servers win on name conflicts.
959
-
960
- **Q: Is Kiro supported?**
961
- A: Yes. Kiro receives concatenated rules at `.kiro/steering/skiller_kiro_instructions.md`.
962
-
963
- ## Development
964
-
965
- ### Setup
966
-
967
- ```bash
968
- git clone https://github.com/udecode/skiller.git
969
- cd skiller
970
- npm install
971
- npm run build
972
- ```
973
-
974
- ### Testing
975
-
976
- ```bash
977
- # Run all tests
978
- npm test
979
-
980
- # Run tests with coverage
981
- npm run test:coverage
982
-
983
- # Run tests in watch mode
984
- npm run test:watch
985
- ```
986
-
987
- ### Code Quality
988
-
989
- ```bash
990
- # Run linting
991
- npm run lint
992
-
993
- # Run formatting
994
- npm run format
995
- ```
10
+ ## Skills
11
+
12
+ - `.claude/skills/` is the committed source of truth
13
+ - On `apply`, skills are synced to all agents' native skill directories
14
+ - Claude Code plugins, commands, and agents are also synced as skills to other agents
15
+ - See [docs/skills.md](docs/skills.md)
16
+
17
+ ## MCP
18
+
19
+ - Define MCP servers once in `skiller.toml`
20
+ - On `apply`, servers are propagated to all agents that support MCP
21
+ - See [docs/mcp.md](docs/mcp.md)
22
+
23
+ ## Docs
24
+
25
+ - [docs/cli.md](docs/cli.md) — commands and flags
26
+ - [docs/config.md](docs/config.md) `skiller.toml` reference
27
+ - [docs/skills.md](docs/skills.md) — skills, propagation, plugin sync
28
+ - [docs/mcp.md](docs/mcp.md) — MCP server config and propagation
29
+ - [docs/troubleshooting.md](docs/troubleshooting.md) — common failures and fixes
30
+ - [docs/development.md](docs/development.md) dev workflow
31
+ - [docs/migration-from-ruler.md](docs/migration-from-ruler.md) — notes for `ruler` users
32
+
33
+ ## Supported agents
34
+
35
+ | Identifier | Agent | Rules | MCP | Skills |
36
+ | ------------- | ----------------- | -------------------------------------------------------- | ------------------------------ | ----------------- |
37
+ | `agentsmd` | AgentsMd (pseudo) | `AGENTS.md` | - | - |
38
+ | `copilot` | GitHub Copilot | `AGENTS.md` | `.vscode/mcp.json` (`servers`) | `.claude/skills` |
39
+ | `claude` | Claude Code | `CLAUDE.md` (`@file` refs) | `.mcp.json` | `.claude/skills` |
40
+ | `codex` | OpenAI Codex CLI | `AGENTS.md`, `.codex/config.toml` | `.codex/config.toml` | `.codex/skills` |
41
+ | `cursor` | Cursor | `AGENTS.md` | `.cursor/mcp.json` | `.cursor/skills` |
42
+ | `windsurf` | Windsurf | `AGENTS.md` | `.windsurf/mcp_config.json` | - |
43
+ | `cline` | Cline | `.clinerules` | - | - |
44
+ | `aider` | Aider | `AGENTS.md`, `.aider.conf.yml` | `.mcp.json` | - |
45
+ | `firebase` | Firebase Studio | `.idx/airules.md` | `.idx/mcp.json` | - |
46
+ | `openhands` | Open Hands | `.openhands/microagents/repo.md` | `config.toml` | - |
47
+ | `gemini-cli` | Gemini CLI | `AGENTS.md`, `.gemini/settings.json` | `.gemini/settings.json` | `.gemini/skills` |
48
+ | `jules` | Jules | `AGENTS.md` | - | - |
49
+ | `junie` | Junie | `.junie/guidelines.md` | - | - |
50
+ | `augmentcode` | AugmentCode | `.augment/rules/skiller_augment_instructions.md` | - | - |
51
+ | `kilocode` | Kilo Code | `.kilocode/rules/skiller_kilocode_instructions.md` | `.kilocode/mcp.json` | `.claude/skills` |
52
+ | `opencode` | OpenCode | `AGENTS.md`, `opencode.json` | `opencode.json` | `.opencode/skill` |
53
+ | `goose` | Goose | `.goosehints` | - | `.agents/skills` |
54
+ | `crush` | Crush | `CRUSH.md`, `.crush.json` | `.crush.json` | - |
55
+ | `amp` | Amp | `AGENTS.md` | - | `.agents/skills` |
56
+ | `zed` | Zed | `AGENTS.md`, `.zed/settings.json` | `.zed/settings.json` | - |
57
+ | `qwen` | Qwen Code | `AGENTS.md`, `.qwen/settings.json` | `.qwen/settings.json` | - |
58
+ | `kiro` | Kiro | `.kiro/steering/skiller_kiro_instructions.md` | - | - |
59
+ | `warp` | Warp | `WARP.md` | - | - |
60
+ | `roo` | RooCode | `AGENTS.md`, `.roo/mcp.json` | `.roo/mcp.json` | `.roo/skills` |
61
+ | `trae` | Trae AI | `.trae/rules/project_rules.md` | - | - |
62
+ | `amazonqcli` | Amazon Q CLI | `.amazonq/rules/skiller_q_rules.md`, `.amazonq/mcp.json` | `.amazonq/mcp.json` | - |
63
+ | `firebender` | Firebender | `firebender.json` | `firebender.json` | - |