allagents 0.31.2 → 0.32.0-next.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/LICENSE +21 -21
- package/README.md +441 -441
- package/dist/index.js +161 -56
- package/dist/templates/default/.allagents/workspace.yaml +15 -15
- package/package.json +1 -1
- package/dist/templates/default/AGENTS.md +0 -14
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 EntityProcess
|
|
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.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EntityProcess
|
|
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.
|
package/README.md
CHANGED
|
@@ -1,441 +1,441 @@
|
|
|
1
|
-
# AllAgents
|
|
2
|
-
|
|
3
|
-
CLI tool for managing multi-repo AI agent workspaces with plugin synchronization across multiple AI clients.
|
|
4
|
-
|
|
5
|
-
## Why AllAgents?
|
|
6
|
-
|
|
7
|
-
**The Problem:** AI coding assistants (Claude, Copilot, Cursor, Codex, etc.) each have their own configuration formats and directory structures. If you want to share skills across multiple projects or use multiple AI clients, you need to manually copy and transform files.
|
|
8
|
-
|
|
9
|
-
**AllAgents solves this by:**
|
|
10
|
-
|
|
11
|
-
| Feature | Claude Code Plugins | AllAgents |
|
|
12
|
-
|---------|--------------------|-----------|
|
|
13
|
-
| Scope | Single project | Multi-repo workspace |
|
|
14
|
-
| Client support | Claude only | 23 AI clients |
|
|
15
|
-
| File location | Runtime lookup from cache | Copied to workspace (git-versioned) |
|
|
16
|
-
| Project structure | AI config mixed with code | Separate workspace repo |
|
|
17
|
-
|
|
18
|
-
### Key Differentiators
|
|
19
|
-
|
|
20
|
-
1. **Multi-repo workspaces** - One workspace references multiple project repositories. Your AI tooling lives separately from your application code.
|
|
21
|
-
|
|
22
|
-
2. **Multi-client distribution** - Write plugins once, sync to all clients. AllAgents transforms and copies files to each client's expected paths.
|
|
23
|
-
|
|
24
|
-
3. **Workspace is a git repo** - Unlike Claude's runtime plugin system, AllAgents copies files into your workspace. Team members get the same AI tooling via git.
|
|
25
|
-
|
|
26
|
-
4. **Clean separation** - Project repos stay clean. AI configuration lives in the workspace.
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
┌─────────────────┐
|
|
30
|
-
│ Marketplace │ (plugin source - GitHub repos)
|
|
31
|
-
└────────┬────────┘
|
|
32
|
-
│
|
|
33
|
-
▼
|
|
34
|
-
┌─────────────────┐
|
|
35
|
-
│ AllAgents │ (sync & transform)
|
|
36
|
-
│ workspace sync │
|
|
37
|
-
└────────┬────────┘
|
|
38
|
-
│
|
|
39
|
-
┌────┴────┬────────┬─────────┐
|
|
40
|
-
▼ ▼ ▼ ▼
|
|
41
|
-
.claude/ .agents/ .cursor/ .factory/ (client paths)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Installation
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
# Using bun
|
|
48
|
-
bun install -g allagents
|
|
49
|
-
|
|
50
|
-
# Or run directly
|
|
51
|
-
bunx allagents
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Quick Start
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
# Create a new workspace
|
|
58
|
-
allagents workspace init my-workspace
|
|
59
|
-
cd my-workspace
|
|
60
|
-
|
|
61
|
-
# Or initialize from a remote GitHub template
|
|
62
|
-
allagents workspace init my-workspace --from owner/repo/path/to/template
|
|
63
|
-
|
|
64
|
-
# Add a marketplace (or let auto-registration handle it)
|
|
65
|
-
allagents plugin marketplace add anthropics/claude-plugins-official
|
|
66
|
-
|
|
67
|
-
# Install plugins to workspace
|
|
68
|
-
allagents plugin install code-review@claude-plugins-official
|
|
69
|
-
allagents plugin install my-plugin@someuser/their-repo
|
|
70
|
-
|
|
71
|
-
# Sync plugins to workspace
|
|
72
|
-
allagents workspace sync
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Initialize from Remote Template
|
|
76
|
-
|
|
77
|
-
Start a new workspace instantly from any GitHub repository containing a `workspace.yaml`:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
# From GitHub URL
|
|
81
|
-
allagents workspace init ~/my-project --from https://github.com/myorg/templates/tree/main/nodejs
|
|
82
|
-
|
|
83
|
-
# From shorthand
|
|
84
|
-
allagents workspace init ~/my-project --from myorg/templates/nodejs
|
|
85
|
-
|
|
86
|
-
# From repo root (looks for .allagents/workspace.yaml or workspace.yaml)
|
|
87
|
-
allagents workspace init ~/my-project --from myorg/templates
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
This fetches the workspace configuration directly from GitHub - no cloning required.
|
|
91
|
-
|
|
92
|
-
## Commands
|
|
93
|
-
|
|
94
|
-
### Workspace Commands
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
# Initialize a new workspace from template
|
|
98
|
-
allagents workspace init <path>
|
|
99
|
-
allagents workspace init <path> --from <source> # From local path or GitHub URL
|
|
100
|
-
|
|
101
|
-
# Sync all plugins to workspace (non-destructive)
|
|
102
|
-
allagents workspace sync [options]
|
|
103
|
-
--force Force re-fetch of remote plugins even if cached
|
|
104
|
-
--dry-run Preview changes without applying
|
|
105
|
-
|
|
106
|
-
# Non-destructive sync: your files are safe
|
|
107
|
-
# - First sync overlays without deleting existing files
|
|
108
|
-
# - Subsequent syncs only remove files AllAgents previously synced
|
|
109
|
-
# - Tracked in .allagents/sync-state.json
|
|
110
|
-
|
|
111
|
-
# Show status of workspace and plugins
|
|
112
|
-
allagents workspace status
|
|
113
|
-
|
|
114
|
-
# Add a repository to the workspace (auto-detects git remote source)
|
|
115
|
-
allagents workspace repo add <path>
|
|
116
|
-
allagents workspace repo add <path> --description "My project"
|
|
117
|
-
|
|
118
|
-
# Remove a repository from the workspace
|
|
119
|
-
allagents workspace repo remove <path>
|
|
120
|
-
|
|
121
|
-
# List all repositories in the workspace
|
|
122
|
-
allagents workspace repo list
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### VSCode Workspace Generation
|
|
126
|
-
|
|
127
|
-
When `vscode` is included in the `clients` list, `workspace sync` automatically generates a `.code-workspace` file. Repository paths are resolved to absolute paths. Plugin folders are included with prompt/instruction file location settings for Copilot.
|
|
128
|
-
|
|
129
|
-
```yaml
|
|
130
|
-
# workspace.yaml
|
|
131
|
-
clients:
|
|
132
|
-
- vscode
|
|
133
|
-
- claude
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
#### Output filename
|
|
137
|
-
|
|
138
|
-
The output filename defaults to `<dirname>.code-workspace`. Override with `vscode.output`:
|
|
139
|
-
|
|
140
|
-
```yaml
|
|
141
|
-
# workspace.yaml
|
|
142
|
-
vscode:
|
|
143
|
-
output: my-project
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
#### Template file
|
|
147
|
-
|
|
148
|
-
Create `.allagents/template.code-workspace` for VSCode-specific settings, launch configurations, extensions, and extra folders. The template supports `{path:../...}` placeholders that resolve to absolute paths using repository paths from workspace.yaml.
|
|
149
|
-
|
|
150
|
-
```json
|
|
151
|
-
{
|
|
152
|
-
"folders": [
|
|
153
|
-
{ "path": "{path:../Shared}", "name": "SharedLib" }
|
|
154
|
-
],
|
|
155
|
-
"settings": {
|
|
156
|
-
"cSpell.words": ["myterm"],
|
|
157
|
-
"chat.agent.maxRequests": 999,
|
|
158
|
-
"chat.useClaudeSkills": true
|
|
159
|
-
},
|
|
160
|
-
"launch": {
|
|
161
|
-
"configurations": [
|
|
162
|
-
{
|
|
163
|
-
"type": "node",
|
|
164
|
-
"name": "dev",
|
|
165
|
-
"cwd": "{path:../myapp}/src",
|
|
166
|
-
"runtimeExecutable": "npm",
|
|
167
|
-
"runtimeArgs": ["run", "dev"]
|
|
168
|
-
}
|
|
169
|
-
]
|
|
170
|
-
},
|
|
171
|
-
"extensions": {
|
|
172
|
-
"recommendations": ["dbaeumer.vscode-eslint"]
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
The generated workspace includes:
|
|
178
|
-
- Repository folders from workspace.yaml (resolved to absolute paths, listed first)
|
|
179
|
-
- Template folders (deduplicated against repository folders)
|
|
180
|
-
- All other template content (settings, launch, extensions) with `{repo:..}` placeholders resolved
|
|
181
|
-
|
|
182
|
-
### Plugin Marketplace Commands
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
# List registered marketplaces
|
|
186
|
-
allagents plugin marketplace list
|
|
187
|
-
|
|
188
|
-
# Add a marketplace from GitHub or local path
|
|
189
|
-
allagents plugin marketplace add <source>
|
|
190
|
-
# Examples:
|
|
191
|
-
# allagents plugin marketplace add anthropics/claude-plugins-official
|
|
192
|
-
# allagents plugin marketplace add /path/to/local/marketplace
|
|
193
|
-
|
|
194
|
-
# Remove a marketplace
|
|
195
|
-
allagents plugin marketplace remove <name>
|
|
196
|
-
|
|
197
|
-
# Update marketplace(s) from remote
|
|
198
|
-
allagents plugin marketplace update [name]
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### Plugin Commands
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
# Install a plugin to .allagents/workspace.yaml (auto-registers marketplace if needed)
|
|
205
|
-
allagents plugin install <plugin@marketplace>
|
|
206
|
-
|
|
207
|
-
# Remove a plugin from .allagents/workspace.yaml
|
|
208
|
-
allagents plugin uninstall <plugin>
|
|
209
|
-
|
|
210
|
-
# List available plugins from marketplaces
|
|
211
|
-
allagents plugin list [marketplace]
|
|
212
|
-
|
|
213
|
-
# Validate a plugin or marketplace structure
|
|
214
|
-
allagents plugin validate <path>
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## .allagents/workspace.yaml
|
|
218
|
-
|
|
219
|
-
The workspace configuration file lives in `.allagents/workspace.yaml` and defines repositories, plugins, workspace files, and target clients:
|
|
220
|
-
|
|
221
|
-
```yaml
|
|
222
|
-
# Workspace file sync (optional) - copy files from a shared source
|
|
223
|
-
workspace:
|
|
224
|
-
source: ../shared-config # Default base for relative paths
|
|
225
|
-
files:
|
|
226
|
-
- AGENTS.md # String shorthand: same source and dest
|
|
227
|
-
- source: docs/guide.md # Object form: explicit source
|
|
228
|
-
dest: GUIDE.md # Optional dest (defaults to basename)
|
|
229
|
-
- dest: CUSTOM.md # File-level source override
|
|
230
|
-
source: ../other-config/CUSTOM.md
|
|
231
|
-
- dest: AGENTS.md # GitHub source
|
|
232
|
-
source: owner/repo/path/AGENTS.md
|
|
233
|
-
|
|
234
|
-
repositories:
|
|
235
|
-
- path: ../my-project
|
|
236
|
-
source: github
|
|
237
|
-
repo: myorg/my-project
|
|
238
|
-
description: Main project repository
|
|
239
|
-
- path: ../my-api
|
|
240
|
-
source: github
|
|
241
|
-
repo: myorg/my-api
|
|
242
|
-
description: API service
|
|
243
|
-
|
|
244
|
-
plugins:
|
|
245
|
-
- code-review@claude-plugins-official # plugin@marketplace format
|
|
246
|
-
- context7@claude-plugins-official
|
|
247
|
-
- my-plugin@someuser/their-repo # fully qualified for custom marketplaces
|
|
248
|
-
|
|
249
|
-
clients:
|
|
250
|
-
- claude
|
|
251
|
-
- copilot
|
|
252
|
-
- cursor
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Workspace File Sync
|
|
256
|
-
|
|
257
|
-
The `workspace:` section enables syncing files from external sources to your workspace root. This is useful for sharing agent configurations (AGENTS.md, CLAUDE.md) across multiple projects.
|
|
258
|
-
|
|
259
|
-
**Key behaviors:**
|
|
260
|
-
- **Source of truth is remote** - Local copies are overwritten on every sync
|
|
261
|
-
- **Deleted files are restored** - If you delete AGENTS.md locally, sync restores it
|
|
262
|
-
- **WORKSPACE-RULES injection** - AGENTS.md and CLAUDE.md automatically get workspace discovery rules injected
|
|
263
|
-
|
|
264
|
-
**Source resolution:**
|
|
265
|
-
| Format | Example | Resolves to |
|
|
266
|
-
|--------|---------|-------------|
|
|
267
|
-
| String shorthand | `AGENTS.md` | `{workspace.source}/AGENTS.md` |
|
|
268
|
-
| Relative source | `source: docs/guide.md` | `{workspace.source}/docs/guide.md` |
|
|
269
|
-
| File-level override | `source: ../other/file.md` | `../other/file.md` (relative to workspace) |
|
|
270
|
-
| GitHub source | `source: owner/repo/path/file.md` | Fetched from GitHub cache |
|
|
271
|
-
|
|
272
|
-
**GitHub sources** are fetched fresh on every sync (always pulls latest).
|
|
273
|
-
|
|
274
|
-
### Plugin Spec Format
|
|
275
|
-
|
|
276
|
-
Plugins use the `plugin@marketplace` format:
|
|
277
|
-
|
|
278
|
-
| Format | Example | Description |
|
|
279
|
-
|--------|---------|-------------|
|
|
280
|
-
| Well-known | `code-review@claude-plugins-official` | Uses known marketplace mapping |
|
|
281
|
-
| owner/repo | `my-plugin@owner/repo` | Auto-registers GitHub repo, looks in `plugins/` |
|
|
282
|
-
| owner/repo/subpath | `my-plugin@owner/repo/extensions` | Looks in custom subdirectory |
|
|
283
|
-
|
|
284
|
-
The subpath format is useful when plugins aren't in the standard `plugins/` directory:
|
|
285
|
-
|
|
286
|
-
```yaml
|
|
287
|
-
plugins:
|
|
288
|
-
- feature-dev@anthropics/claude-plugins-official/plugins # explicit plugins/ dir
|
|
289
|
-
- my-addon@someuser/repo/addons # custom addons/ dir
|
|
290
|
-
- tool@org/monorepo/packages/tools # nested path
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
### Well-Known Marketplaces
|
|
294
|
-
|
|
295
|
-
These marketplace names auto-resolve to their GitHub repos:
|
|
296
|
-
|
|
297
|
-
- `claude-plugins-official` → `anthropics/claude-plugins-official`
|
|
298
|
-
|
|
299
|
-
### Supported Clients
|
|
300
|
-
|
|
301
|
-
AllAgents supports 23 AI coding assistants:
|
|
302
|
-
|
|
303
|
-
#### Universal Clients (share `.agents/skills/`)
|
|
304
|
-
|
|
305
|
-
| Client | Skills | Agent File | Hooks | Commands | GitHub Overrides |
|
|
306
|
-
|--------|--------|------------|-------|----------|------------------|
|
|
307
|
-
| copilot | `.github/skills/` | `AGENTS.md` | `.github/hooks/` | No | `.github/` |
|
|
308
|
-
| codex | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
309
|
-
| opencode | `.agents/skills/` | `AGENTS.md` | No | `.opencode/commands/` | No |
|
|
310
|
-
| gemini | `.agents/skills/` | `GEMINI.md` | No | No | No |
|
|
311
|
-
| ampcode | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
312
|
-
| vscode | `.agents/skills/` | `AGENTS.md` | No | No | `.github/` |
|
|
313
|
-
| replit | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
314
|
-
| kimi | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
315
|
-
|
|
316
|
-
#### Provider-Specific Clients
|
|
317
|
-
|
|
318
|
-
| Client | Skills | Agent File | Hooks | Commands |
|
|
319
|
-
|--------|--------|------------|-------|----------|
|
|
320
|
-
| claude | `.claude/skills/` | `CLAUDE.md` | `.claude/hooks/` | `.claude/commands/` |
|
|
321
|
-
| cursor | `.cursor/skills/` | `AGENTS.md` | No | No |
|
|
322
|
-
| factory | `.factory/skills/` | `AGENTS.md` | `.factory/hooks/` | No |
|
|
323
|
-
| openclaw | `skills/` | `AGENTS.md` | No | No |
|
|
324
|
-
| windsurf | `.windsurf/skills/` | `AGENTS.md` | No | No |
|
|
325
|
-
| cline | `.cline/skills/` | `AGENTS.md` | No | No |
|
|
326
|
-
| continue | `.continue/skills/` | `AGENTS.md` | No | No |
|
|
327
|
-
| roo | `.roo/skills/` | `AGENTS.md` | No | No |
|
|
328
|
-
| kilo | `.kilocode/skills/` | `AGENTS.md` | No | No |
|
|
329
|
-
| trae | `.trae/skills/` | `AGENTS.md` | No | No |
|
|
330
|
-
| augment | `.augment/skills/` | `AGENTS.md` | No | No |
|
|
331
|
-
| zencoder | `.zencoder/skills/` | `AGENTS.md` | No | No |
|
|
332
|
-
| junie | `.junie/skills/` | `AGENTS.md` | No | No |
|
|
333
|
-
| openhands | `.openhands/skills/` | `AGENTS.md` | No | No |
|
|
334
|
-
| kiro | `.kiro/skills/` | `AGENTS.md` | No | No |
|
|
335
|
-
|
|
336
|
-
> **Note:** Universal clients share the same `.agents/skills/` directory. GitHub overrides (`.github/prompts/`, `.github/agents/`, `.github/hooks/`, `copilot-instructions.md`) are copied to Copilot/VSCode's `.github/` folder. Root `agents/` and `hooks/` also map to `.github/agents/` and `.github/hooks/` for Copilot.
|
|
337
|
-
|
|
338
|
-
## Marketplace Structure
|
|
339
|
-
|
|
340
|
-
Marketplaces contain multiple plugins:
|
|
341
|
-
|
|
342
|
-
```
|
|
343
|
-
my-marketplace/
|
|
344
|
-
├── plugins/
|
|
345
|
-
│ ├── code-review/
|
|
346
|
-
│ │ └── skills/
|
|
347
|
-
│ └── debugging/
|
|
348
|
-
│ └── skills/
|
|
349
|
-
└── README.md
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
## Plugin Structure
|
|
353
|
-
|
|
354
|
-
Each plugin follows this structure:
|
|
355
|
-
|
|
356
|
-
```
|
|
357
|
-
my-plugin/
|
|
358
|
-
├── skills/ # Skill directories with SKILL.md (all clients)
|
|
359
|
-
│ └── debugging/
|
|
360
|
-
│ └── SKILL.md
|
|
361
|
-
├── commands/ # Command files (.md) - Claude, OpenCode
|
|
362
|
-
│ ├── build.md
|
|
363
|
-
│ └── deploy.md
|
|
364
|
-
├── .github/ # GitHub overrides (Copilot, VSCode)
|
|
365
|
-
│ └── prompts/
|
|
366
|
-
│ └── review.md
|
|
367
|
-
├── hooks/ # Hook files (Claude/Factory only)
|
|
368
|
-
│ └── pre-commit.md
|
|
369
|
-
└── AGENTS.md # Agent configuration (optional)
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
### Skill Validation
|
|
373
|
-
|
|
374
|
-
Skills must have a valid `SKILL.md` file with YAML frontmatter:
|
|
375
|
-
|
|
376
|
-
```yaml
|
|
377
|
-
---
|
|
378
|
-
name: my-skill # Required: lowercase, alphanumeric + hyphens, max 64 chars
|
|
379
|
-
description: Description of the skill # Required
|
|
380
|
-
allowed-tools: # Optional
|
|
381
|
-
- Read
|
|
382
|
-
- Write
|
|
383
|
-
model: claude-3-opus # Optional
|
|
384
|
-
---
|
|
385
|
-
|
|
386
|
-
# Skill Content
|
|
387
|
-
|
|
388
|
-
Skill instructions go here...
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
### Self Commands
|
|
392
|
-
|
|
393
|
-
```bash
|
|
394
|
-
# Update to latest version (auto-detects package manager)
|
|
395
|
-
allagents self update
|
|
396
|
-
|
|
397
|
-
# Force a specific package manager
|
|
398
|
-
allagents self update --npm
|
|
399
|
-
allagents self update --bun
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
When using the interactive TUI, AllAgents automatically checks for newer versions in the background and shows a notice on startup when an update is available.
|
|
403
|
-
|
|
404
|
-
## Storage Locations
|
|
405
|
-
|
|
406
|
-
```
|
|
407
|
-
~/.allagents/
|
|
408
|
-
├── marketplaces.json # Registry of marketplaces
|
|
409
|
-
├── version-check.json # Cached update check (auto-managed)
|
|
410
|
-
└── marketplaces/ # Cloned marketplace repos
|
|
411
|
-
├── claude-plugins-official/
|
|
412
|
-
└── someuser-their-repo/
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
## Development
|
|
416
|
-
|
|
417
|
-
```bash
|
|
418
|
-
# Install dependencies
|
|
419
|
-
bun install
|
|
420
|
-
|
|
421
|
-
# Run in development
|
|
422
|
-
bun run dev workspace init test-ws
|
|
423
|
-
|
|
424
|
-
# Run tests
|
|
425
|
-
bun run test
|
|
426
|
-
|
|
427
|
-
# Type check
|
|
428
|
-
bun run typecheck
|
|
429
|
-
|
|
430
|
-
# Build
|
|
431
|
-
bun run build
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
## Related Projects
|
|
435
|
-
|
|
436
|
-
- [dotagents](https://github.com/iannuttall/dotagents) - Unified AI agent configuration management
|
|
437
|
-
- [vercel-labs/skills](https://github.com/vercel-labs/skills) - Universal skills for AI coding assistants
|
|
438
|
-
|
|
439
|
-
## License
|
|
440
|
-
|
|
441
|
-
MIT
|
|
1
|
+
# AllAgents
|
|
2
|
+
|
|
3
|
+
CLI tool for managing multi-repo AI agent workspaces with plugin synchronization across multiple AI clients.
|
|
4
|
+
|
|
5
|
+
## Why AllAgents?
|
|
6
|
+
|
|
7
|
+
**The Problem:** AI coding assistants (Claude, Copilot, Cursor, Codex, etc.) each have their own configuration formats and directory structures. If you want to share skills across multiple projects or use multiple AI clients, you need to manually copy and transform files.
|
|
8
|
+
|
|
9
|
+
**AllAgents solves this by:**
|
|
10
|
+
|
|
11
|
+
| Feature | Claude Code Plugins | AllAgents |
|
|
12
|
+
|---------|--------------------|-----------|
|
|
13
|
+
| Scope | Single project | Multi-repo workspace |
|
|
14
|
+
| Client support | Claude only | 23 AI clients |
|
|
15
|
+
| File location | Runtime lookup from cache | Copied to workspace (git-versioned) |
|
|
16
|
+
| Project structure | AI config mixed with code | Separate workspace repo |
|
|
17
|
+
|
|
18
|
+
### Key Differentiators
|
|
19
|
+
|
|
20
|
+
1. **Multi-repo workspaces** - One workspace references multiple project repositories. Your AI tooling lives separately from your application code.
|
|
21
|
+
|
|
22
|
+
2. **Multi-client distribution** - Write plugins once, sync to all clients. AllAgents transforms and copies files to each client's expected paths.
|
|
23
|
+
|
|
24
|
+
3. **Workspace is a git repo** - Unlike Claude's runtime plugin system, AllAgents copies files into your workspace. Team members get the same AI tooling via git.
|
|
25
|
+
|
|
26
|
+
4. **Clean separation** - Project repos stay clean. AI configuration lives in the workspace.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
┌─────────────────┐
|
|
30
|
+
│ Marketplace │ (plugin source - GitHub repos)
|
|
31
|
+
└────────┬────────┘
|
|
32
|
+
│
|
|
33
|
+
▼
|
|
34
|
+
┌─────────────────┐
|
|
35
|
+
│ AllAgents │ (sync & transform)
|
|
36
|
+
│ workspace sync │
|
|
37
|
+
└────────┬────────┘
|
|
38
|
+
│
|
|
39
|
+
┌────┴────┬────────┬─────────┐
|
|
40
|
+
▼ ▼ ▼ ▼
|
|
41
|
+
.claude/ .agents/ .cursor/ .factory/ (client paths)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Using bun
|
|
48
|
+
bun install -g allagents
|
|
49
|
+
|
|
50
|
+
# Or run directly
|
|
51
|
+
bunx allagents
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Quick Start
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Create a new workspace
|
|
58
|
+
allagents workspace init my-workspace
|
|
59
|
+
cd my-workspace
|
|
60
|
+
|
|
61
|
+
# Or initialize from a remote GitHub template
|
|
62
|
+
allagents workspace init my-workspace --from owner/repo/path/to/template
|
|
63
|
+
|
|
64
|
+
# Add a marketplace (or let auto-registration handle it)
|
|
65
|
+
allagents plugin marketplace add anthropics/claude-plugins-official
|
|
66
|
+
|
|
67
|
+
# Install plugins to workspace
|
|
68
|
+
allagents plugin install code-review@claude-plugins-official
|
|
69
|
+
allagents plugin install my-plugin@someuser/their-repo
|
|
70
|
+
|
|
71
|
+
# Sync plugins to workspace
|
|
72
|
+
allagents workspace sync
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Initialize from Remote Template
|
|
76
|
+
|
|
77
|
+
Start a new workspace instantly from any GitHub repository containing a `workspace.yaml`:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# From GitHub URL
|
|
81
|
+
allagents workspace init ~/my-project --from https://github.com/myorg/templates/tree/main/nodejs
|
|
82
|
+
|
|
83
|
+
# From shorthand
|
|
84
|
+
allagents workspace init ~/my-project --from myorg/templates/nodejs
|
|
85
|
+
|
|
86
|
+
# From repo root (looks for .allagents/workspace.yaml or workspace.yaml)
|
|
87
|
+
allagents workspace init ~/my-project --from myorg/templates
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
This fetches the workspace configuration directly from GitHub - no cloning required.
|
|
91
|
+
|
|
92
|
+
## Commands
|
|
93
|
+
|
|
94
|
+
### Workspace Commands
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Initialize a new workspace from template
|
|
98
|
+
allagents workspace init <path>
|
|
99
|
+
allagents workspace init <path> --from <source> # From local path or GitHub URL
|
|
100
|
+
|
|
101
|
+
# Sync all plugins to workspace (non-destructive)
|
|
102
|
+
allagents workspace sync [options]
|
|
103
|
+
--force Force re-fetch of remote plugins even if cached
|
|
104
|
+
--dry-run Preview changes without applying
|
|
105
|
+
|
|
106
|
+
# Non-destructive sync: your files are safe
|
|
107
|
+
# - First sync overlays without deleting existing files
|
|
108
|
+
# - Subsequent syncs only remove files AllAgents previously synced
|
|
109
|
+
# - Tracked in .allagents/sync-state.json
|
|
110
|
+
|
|
111
|
+
# Show status of workspace and plugins
|
|
112
|
+
allagents workspace status
|
|
113
|
+
|
|
114
|
+
# Add a repository to the workspace (auto-detects git remote source)
|
|
115
|
+
allagents workspace repo add <path>
|
|
116
|
+
allagents workspace repo add <path> --description "My project"
|
|
117
|
+
|
|
118
|
+
# Remove a repository from the workspace
|
|
119
|
+
allagents workspace repo remove <path>
|
|
120
|
+
|
|
121
|
+
# List all repositories in the workspace
|
|
122
|
+
allagents workspace repo list
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### VSCode Workspace Generation
|
|
126
|
+
|
|
127
|
+
When `vscode` is included in the `clients` list, `workspace sync` automatically generates a `.code-workspace` file. Repository paths are resolved to absolute paths. Plugin folders are included with prompt/instruction file location settings for Copilot.
|
|
128
|
+
|
|
129
|
+
```yaml
|
|
130
|
+
# workspace.yaml
|
|
131
|
+
clients:
|
|
132
|
+
- vscode
|
|
133
|
+
- claude
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### Output filename
|
|
137
|
+
|
|
138
|
+
The output filename defaults to `<dirname>.code-workspace`. Override with `vscode.output`:
|
|
139
|
+
|
|
140
|
+
```yaml
|
|
141
|
+
# workspace.yaml
|
|
142
|
+
vscode:
|
|
143
|
+
output: my-project
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Template file
|
|
147
|
+
|
|
148
|
+
Create `.allagents/template.code-workspace` for VSCode-specific settings, launch configurations, extensions, and extra folders. The template supports `{path:../...}` placeholders that resolve to absolute paths using repository paths from workspace.yaml.
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"folders": [
|
|
153
|
+
{ "path": "{path:../Shared}", "name": "SharedLib" }
|
|
154
|
+
],
|
|
155
|
+
"settings": {
|
|
156
|
+
"cSpell.words": ["myterm"],
|
|
157
|
+
"chat.agent.maxRequests": 999,
|
|
158
|
+
"chat.useClaudeSkills": true
|
|
159
|
+
},
|
|
160
|
+
"launch": {
|
|
161
|
+
"configurations": [
|
|
162
|
+
{
|
|
163
|
+
"type": "node",
|
|
164
|
+
"name": "dev",
|
|
165
|
+
"cwd": "{path:../myapp}/src",
|
|
166
|
+
"runtimeExecutable": "npm",
|
|
167
|
+
"runtimeArgs": ["run", "dev"]
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
"extensions": {
|
|
172
|
+
"recommendations": ["dbaeumer.vscode-eslint"]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
The generated workspace includes:
|
|
178
|
+
- Repository folders from workspace.yaml (resolved to absolute paths, listed first)
|
|
179
|
+
- Template folders (deduplicated against repository folders)
|
|
180
|
+
- All other template content (settings, launch, extensions) with `{repo:..}` placeholders resolved
|
|
181
|
+
|
|
182
|
+
### Plugin Marketplace Commands
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# List registered marketplaces
|
|
186
|
+
allagents plugin marketplace list
|
|
187
|
+
|
|
188
|
+
# Add a marketplace from GitHub or local path
|
|
189
|
+
allagents plugin marketplace add <source>
|
|
190
|
+
# Examples:
|
|
191
|
+
# allagents plugin marketplace add anthropics/claude-plugins-official
|
|
192
|
+
# allagents plugin marketplace add /path/to/local/marketplace
|
|
193
|
+
|
|
194
|
+
# Remove a marketplace
|
|
195
|
+
allagents plugin marketplace remove <name>
|
|
196
|
+
|
|
197
|
+
# Update marketplace(s) from remote
|
|
198
|
+
allagents plugin marketplace update [name]
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Plugin Commands
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# Install a plugin to .allagents/workspace.yaml (auto-registers marketplace if needed)
|
|
205
|
+
allagents plugin install <plugin@marketplace>
|
|
206
|
+
|
|
207
|
+
# Remove a plugin from .allagents/workspace.yaml
|
|
208
|
+
allagents plugin uninstall <plugin>
|
|
209
|
+
|
|
210
|
+
# List available plugins from marketplaces
|
|
211
|
+
allagents plugin list [marketplace]
|
|
212
|
+
|
|
213
|
+
# Validate a plugin or marketplace structure
|
|
214
|
+
allagents plugin validate <path>
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## .allagents/workspace.yaml
|
|
218
|
+
|
|
219
|
+
The workspace configuration file lives in `.allagents/workspace.yaml` and defines repositories, plugins, workspace files, and target clients:
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
# Workspace file sync (optional) - copy files from a shared source
|
|
223
|
+
workspace:
|
|
224
|
+
source: ../shared-config # Default base for relative paths
|
|
225
|
+
files:
|
|
226
|
+
- AGENTS.md # String shorthand: same source and dest
|
|
227
|
+
- source: docs/guide.md # Object form: explicit source
|
|
228
|
+
dest: GUIDE.md # Optional dest (defaults to basename)
|
|
229
|
+
- dest: CUSTOM.md # File-level source override
|
|
230
|
+
source: ../other-config/CUSTOM.md
|
|
231
|
+
- dest: AGENTS.md # GitHub source
|
|
232
|
+
source: owner/repo/path/AGENTS.md
|
|
233
|
+
|
|
234
|
+
repositories:
|
|
235
|
+
- path: ../my-project
|
|
236
|
+
source: github
|
|
237
|
+
repo: myorg/my-project
|
|
238
|
+
description: Main project repository
|
|
239
|
+
- path: ../my-api
|
|
240
|
+
source: github
|
|
241
|
+
repo: myorg/my-api
|
|
242
|
+
description: API service
|
|
243
|
+
|
|
244
|
+
plugins:
|
|
245
|
+
- code-review@claude-plugins-official # plugin@marketplace format
|
|
246
|
+
- context7@claude-plugins-official
|
|
247
|
+
- my-plugin@someuser/their-repo # fully qualified for custom marketplaces
|
|
248
|
+
|
|
249
|
+
clients:
|
|
250
|
+
- claude
|
|
251
|
+
- copilot
|
|
252
|
+
- cursor
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Workspace File Sync
|
|
256
|
+
|
|
257
|
+
The `workspace:` section enables syncing files from external sources to your workspace root. This is useful for sharing agent configurations (AGENTS.md, CLAUDE.md) across multiple projects.
|
|
258
|
+
|
|
259
|
+
**Key behaviors:**
|
|
260
|
+
- **Source of truth is remote** - Local copies are overwritten on every sync
|
|
261
|
+
- **Deleted files are restored** - If you delete AGENTS.md locally, sync restores it
|
|
262
|
+
- **WORKSPACE-RULES injection** - AGENTS.md and CLAUDE.md automatically get workspace discovery rules injected
|
|
263
|
+
|
|
264
|
+
**Source resolution:**
|
|
265
|
+
| Format | Example | Resolves to |
|
|
266
|
+
|--------|---------|-------------|
|
|
267
|
+
| String shorthand | `AGENTS.md` | `{workspace.source}/AGENTS.md` |
|
|
268
|
+
| Relative source | `source: docs/guide.md` | `{workspace.source}/docs/guide.md` |
|
|
269
|
+
| File-level override | `source: ../other/file.md` | `../other/file.md` (relative to workspace) |
|
|
270
|
+
| GitHub source | `source: owner/repo/path/file.md` | Fetched from GitHub cache |
|
|
271
|
+
|
|
272
|
+
**GitHub sources** are fetched fresh on every sync (always pulls latest).
|
|
273
|
+
|
|
274
|
+
### Plugin Spec Format
|
|
275
|
+
|
|
276
|
+
Plugins use the `plugin@marketplace` format:
|
|
277
|
+
|
|
278
|
+
| Format | Example | Description |
|
|
279
|
+
|--------|---------|-------------|
|
|
280
|
+
| Well-known | `code-review@claude-plugins-official` | Uses known marketplace mapping |
|
|
281
|
+
| owner/repo | `my-plugin@owner/repo` | Auto-registers GitHub repo, looks in `plugins/` |
|
|
282
|
+
| owner/repo/subpath | `my-plugin@owner/repo/extensions` | Looks in custom subdirectory |
|
|
283
|
+
|
|
284
|
+
The subpath format is useful when plugins aren't in the standard `plugins/` directory:
|
|
285
|
+
|
|
286
|
+
```yaml
|
|
287
|
+
plugins:
|
|
288
|
+
- feature-dev@anthropics/claude-plugins-official/plugins # explicit plugins/ dir
|
|
289
|
+
- my-addon@someuser/repo/addons # custom addons/ dir
|
|
290
|
+
- tool@org/monorepo/packages/tools # nested path
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Well-Known Marketplaces
|
|
294
|
+
|
|
295
|
+
These marketplace names auto-resolve to their GitHub repos:
|
|
296
|
+
|
|
297
|
+
- `claude-plugins-official` → `anthropics/claude-plugins-official`
|
|
298
|
+
|
|
299
|
+
### Supported Clients
|
|
300
|
+
|
|
301
|
+
AllAgents supports 23 AI coding assistants:
|
|
302
|
+
|
|
303
|
+
#### Universal Clients (share `.agents/skills/`)
|
|
304
|
+
|
|
305
|
+
| Client | Skills | Agent File | Hooks | Commands | GitHub Overrides |
|
|
306
|
+
|--------|--------|------------|-------|----------|------------------|
|
|
307
|
+
| copilot | `.github/skills/` | `AGENTS.md` | `.github/hooks/` | No | `.github/` |
|
|
308
|
+
| codex | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
309
|
+
| opencode | `.agents/skills/` | `AGENTS.md` | No | `.opencode/commands/` | No |
|
|
310
|
+
| gemini | `.agents/skills/` | `GEMINI.md` | No | No | No |
|
|
311
|
+
| ampcode | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
312
|
+
| vscode | `.agents/skills/` | `AGENTS.md` | No | No | `.github/` |
|
|
313
|
+
| replit | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
314
|
+
| kimi | `.agents/skills/` | `AGENTS.md` | No | No | No |
|
|
315
|
+
|
|
316
|
+
#### Provider-Specific Clients
|
|
317
|
+
|
|
318
|
+
| Client | Skills | Agent File | Hooks | Commands |
|
|
319
|
+
|--------|--------|------------|-------|----------|
|
|
320
|
+
| claude | `.claude/skills/` | `CLAUDE.md` | `.claude/hooks/` | `.claude/commands/` |
|
|
321
|
+
| cursor | `.cursor/skills/` | `AGENTS.md` | No | No |
|
|
322
|
+
| factory | `.factory/skills/` | `AGENTS.md` | `.factory/hooks/` | No |
|
|
323
|
+
| openclaw | `skills/` | `AGENTS.md` | No | No |
|
|
324
|
+
| windsurf | `.windsurf/skills/` | `AGENTS.md` | No | No |
|
|
325
|
+
| cline | `.cline/skills/` | `AGENTS.md` | No | No |
|
|
326
|
+
| continue | `.continue/skills/` | `AGENTS.md` | No | No |
|
|
327
|
+
| roo | `.roo/skills/` | `AGENTS.md` | No | No |
|
|
328
|
+
| kilo | `.kilocode/skills/` | `AGENTS.md` | No | No |
|
|
329
|
+
| trae | `.trae/skills/` | `AGENTS.md` | No | No |
|
|
330
|
+
| augment | `.augment/skills/` | `AGENTS.md` | No | No |
|
|
331
|
+
| zencoder | `.zencoder/skills/` | `AGENTS.md` | No | No |
|
|
332
|
+
| junie | `.junie/skills/` | `AGENTS.md` | No | No |
|
|
333
|
+
| openhands | `.openhands/skills/` | `AGENTS.md` | No | No |
|
|
334
|
+
| kiro | `.kiro/skills/` | `AGENTS.md` | No | No |
|
|
335
|
+
|
|
336
|
+
> **Note:** Universal clients share the same `.agents/skills/` directory. GitHub overrides (`.github/prompts/`, `.github/agents/`, `.github/hooks/`, `copilot-instructions.md`) are copied to Copilot/VSCode's `.github/` folder. Root `agents/` and `hooks/` also map to `.github/agents/` and `.github/hooks/` for Copilot.
|
|
337
|
+
|
|
338
|
+
## Marketplace Structure
|
|
339
|
+
|
|
340
|
+
Marketplaces contain multiple plugins:
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
my-marketplace/
|
|
344
|
+
├── plugins/
|
|
345
|
+
│ ├── code-review/
|
|
346
|
+
│ │ └── skills/
|
|
347
|
+
│ └── debugging/
|
|
348
|
+
│ └── skills/
|
|
349
|
+
└── README.md
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Plugin Structure
|
|
353
|
+
|
|
354
|
+
Each plugin follows this structure:
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
my-plugin/
|
|
358
|
+
├── skills/ # Skill directories with SKILL.md (all clients)
|
|
359
|
+
│ └── debugging/
|
|
360
|
+
│ └── SKILL.md
|
|
361
|
+
├── commands/ # Command files (.md) - Claude, OpenCode
|
|
362
|
+
│ ├── build.md
|
|
363
|
+
│ └── deploy.md
|
|
364
|
+
├── .github/ # GitHub overrides (Copilot, VSCode)
|
|
365
|
+
│ └── prompts/
|
|
366
|
+
│ └── review.md
|
|
367
|
+
├── hooks/ # Hook files (Claude/Factory only)
|
|
368
|
+
│ └── pre-commit.md
|
|
369
|
+
└── AGENTS.md # Agent configuration (optional)
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Skill Validation
|
|
373
|
+
|
|
374
|
+
Skills must have a valid `SKILL.md` file with YAML frontmatter:
|
|
375
|
+
|
|
376
|
+
```yaml
|
|
377
|
+
---
|
|
378
|
+
name: my-skill # Required: lowercase, alphanumeric + hyphens, max 64 chars
|
|
379
|
+
description: Description of the skill # Required
|
|
380
|
+
allowed-tools: # Optional
|
|
381
|
+
- Read
|
|
382
|
+
- Write
|
|
383
|
+
model: claude-3-opus # Optional
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
# Skill Content
|
|
387
|
+
|
|
388
|
+
Skill instructions go here...
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Self Commands
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
# Update to latest version (auto-detects package manager)
|
|
395
|
+
allagents self update
|
|
396
|
+
|
|
397
|
+
# Force a specific package manager
|
|
398
|
+
allagents self update --npm
|
|
399
|
+
allagents self update --bun
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
When using the interactive TUI, AllAgents automatically checks for newer versions in the background and shows a notice on startup when an update is available.
|
|
403
|
+
|
|
404
|
+
## Storage Locations
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
~/.allagents/
|
|
408
|
+
├── marketplaces.json # Registry of marketplaces
|
|
409
|
+
├── version-check.json # Cached update check (auto-managed)
|
|
410
|
+
└── marketplaces/ # Cloned marketplace repos
|
|
411
|
+
├── claude-plugins-official/
|
|
412
|
+
└── someuser-their-repo/
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## Development
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
# Install dependencies
|
|
419
|
+
bun install
|
|
420
|
+
|
|
421
|
+
# Run in development
|
|
422
|
+
bun run dev workspace init test-ws
|
|
423
|
+
|
|
424
|
+
# Run tests
|
|
425
|
+
bun run test
|
|
426
|
+
|
|
427
|
+
# Type check
|
|
428
|
+
bun run typecheck
|
|
429
|
+
|
|
430
|
+
# Build
|
|
431
|
+
bun run build
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
## Related Projects
|
|
435
|
+
|
|
436
|
+
- [dotagents](https://github.com/iannuttall/dotagents) - Unified AI agent configuration management
|
|
437
|
+
- [vercel-labs/skills](https://github.com/vercel-labs/skills) - Universal skills for AI coding assistants
|
|
438
|
+
|
|
439
|
+
## License
|
|
440
|
+
|
|
441
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -22963,10 +22963,6 @@ async function saveRegistry(registry) {
|
|
|
22963
22963
|
`);
|
|
22964
22964
|
}
|
|
22965
22965
|
function getSourceLocationKey(source) {
|
|
22966
|
-
if (source.type === "github") {
|
|
22967
|
-
const { owner, repo } = parseLocation(source.location);
|
|
22968
|
-
return `${owner}/${repo}`;
|
|
22969
|
-
}
|
|
22970
22966
|
return source.location;
|
|
22971
22967
|
}
|
|
22972
22968
|
function findBySourceLocation(registry, sourceLocation) {
|
|
@@ -23042,10 +23038,15 @@ async function addMarketplace(source, customName, branch) {
|
|
|
23042
23038
|
error: `Marketplace '${name}' already exists. Use 'update' to refresh it.`
|
|
23043
23039
|
};
|
|
23044
23040
|
}
|
|
23045
|
-
const sourceLocation =
|
|
23041
|
+
const sourceLocation = (() => {
|
|
23042
|
+
if (parsed.type !== "github")
|
|
23043
|
+
return parsed.location;
|
|
23044
|
+
const { owner, repo } = parseLocation(parsed.location);
|
|
23045
|
+
return effectiveBranch ? `${owner}/${repo}/${effectiveBranch}` : `${owner}/${repo}`;
|
|
23046
|
+
})();
|
|
23046
23047
|
const existingBySource = findBySourceLocation(registry, sourceLocation);
|
|
23047
23048
|
if (existingBySource) {
|
|
23048
|
-
return { success: true, marketplace: existingBySource };
|
|
23049
|
+
return { success: true, marketplace: existingBySource, alreadyRegistered: true };
|
|
23049
23050
|
}
|
|
23050
23051
|
let marketplacePath;
|
|
23051
23052
|
if (parsed.type === "github") {
|
|
@@ -23100,7 +23101,8 @@ async function addMarketplace(source, customName, branch) {
|
|
|
23100
23101
|
if (existing) {
|
|
23101
23102
|
return {
|
|
23102
23103
|
success: true,
|
|
23103
|
-
marketplace: existing
|
|
23104
|
+
marketplace: existing,
|
|
23105
|
+
alreadyRegistered: true
|
|
23104
23106
|
};
|
|
23105
23107
|
}
|
|
23106
23108
|
name = manifestName;
|
|
@@ -23489,12 +23491,14 @@ async function autoRegisterMarketplace(source) {
|
|
|
23489
23491
|
registeredSourceCache.set(source, existing.name);
|
|
23490
23492
|
return { success: true, name: existing.name };
|
|
23491
23493
|
}
|
|
23492
|
-
console.log(`Auto-registering GitHub marketplace: ${source}`);
|
|
23493
23494
|
const result = await addMarketplace(source);
|
|
23494
23495
|
if (!result.success) {
|
|
23495
23496
|
return { success: false, error: result.error || "Unknown error" };
|
|
23496
23497
|
}
|
|
23497
23498
|
const name = result.marketplace?.name ?? parts[1];
|
|
23499
|
+
if (!result.alreadyRegistered) {
|
|
23500
|
+
console.log(`Auto-registered GitHub marketplace: ${source}`);
|
|
23501
|
+
}
|
|
23498
23502
|
registeredSourceCache.set(source, name);
|
|
23499
23503
|
return { success: true, name };
|
|
23500
23504
|
}
|
|
@@ -26350,6 +26354,122 @@ var init_status2 = __esm(() => {
|
|
|
26350
26354
|
});
|
|
26351
26355
|
|
|
26352
26356
|
// src/cli/format-sync.ts
|
|
26357
|
+
function buildPathLookup() {
|
|
26358
|
+
const entries = [];
|
|
26359
|
+
const seen = new Set;
|
|
26360
|
+
for (const mappings of [CLIENT_MAPPINGS, USER_CLIENT_MAPPINGS]) {
|
|
26361
|
+
for (const [client, mapping] of Object.entries(mappings)) {
|
|
26362
|
+
const paths = [
|
|
26363
|
+
[mapping.skillsPath, "skill"],
|
|
26364
|
+
[mapping.commandsPath, "command"],
|
|
26365
|
+
[mapping.agentsPath, "agent"],
|
|
26366
|
+
[mapping.hooksPath, "hook"]
|
|
26367
|
+
];
|
|
26368
|
+
for (const [path, artifactType] of paths) {
|
|
26369
|
+
if (!path)
|
|
26370
|
+
continue;
|
|
26371
|
+
const key = `${path}|${artifactType}`;
|
|
26372
|
+
if (seen.has(key))
|
|
26373
|
+
continue;
|
|
26374
|
+
seen.add(key);
|
|
26375
|
+
entries.push({ path, client, artifactType });
|
|
26376
|
+
}
|
|
26377
|
+
}
|
|
26378
|
+
}
|
|
26379
|
+
entries.sort((a, b) => b.path.length - a.path.length);
|
|
26380
|
+
return entries;
|
|
26381
|
+
}
|
|
26382
|
+
function getPathLookup() {
|
|
26383
|
+
if (!cachedLookup)
|
|
26384
|
+
cachedLookup = buildPathLookup();
|
|
26385
|
+
return cachedLookup;
|
|
26386
|
+
}
|
|
26387
|
+
function classifyDestination(dest) {
|
|
26388
|
+
const normalized = dest.replace(/\\/g, "/");
|
|
26389
|
+
for (const entry of getPathLookup()) {
|
|
26390
|
+
if (normalized.includes(`/${entry.path}`) || normalized.startsWith(entry.path)) {
|
|
26391
|
+
return { client: entry.client, artifactType: entry.artifactType };
|
|
26392
|
+
}
|
|
26393
|
+
}
|
|
26394
|
+
return null;
|
|
26395
|
+
}
|
|
26396
|
+
function classifyCopyResults(copyResults) {
|
|
26397
|
+
const clientCounts = new Map;
|
|
26398
|
+
for (const result of copyResults) {
|
|
26399
|
+
if (result.action !== "copied")
|
|
26400
|
+
continue;
|
|
26401
|
+
const classification = classifyDestination(result.destination);
|
|
26402
|
+
if (!classification)
|
|
26403
|
+
continue;
|
|
26404
|
+
const { client, artifactType } = classification;
|
|
26405
|
+
let counts = clientCounts.get(client);
|
|
26406
|
+
if (!counts) {
|
|
26407
|
+
counts = { skills: 0, commands: 0, agents: 0, hooks: 0 };
|
|
26408
|
+
clientCounts.set(client, counts);
|
|
26409
|
+
}
|
|
26410
|
+
switch (artifactType) {
|
|
26411
|
+
case "skill":
|
|
26412
|
+
counts.skills++;
|
|
26413
|
+
break;
|
|
26414
|
+
case "command":
|
|
26415
|
+
counts.commands++;
|
|
26416
|
+
break;
|
|
26417
|
+
case "agent":
|
|
26418
|
+
counts.agents++;
|
|
26419
|
+
break;
|
|
26420
|
+
case "hook":
|
|
26421
|
+
counts.hooks++;
|
|
26422
|
+
break;
|
|
26423
|
+
}
|
|
26424
|
+
}
|
|
26425
|
+
return clientCounts;
|
|
26426
|
+
}
|
|
26427
|
+
function formatArtifactLines(clientCounts, indent = " ") {
|
|
26428
|
+
const lines = [];
|
|
26429
|
+
for (const [client, counts] of clientCounts) {
|
|
26430
|
+
const parts = [];
|
|
26431
|
+
if (counts.commands > 0)
|
|
26432
|
+
parts.push(`${counts.commands} ${counts.commands === 1 ? "command" : "commands"}`);
|
|
26433
|
+
if (counts.skills > 0)
|
|
26434
|
+
parts.push(`${counts.skills} ${counts.skills === 1 ? "skill" : "skills"}`);
|
|
26435
|
+
if (counts.agents > 0)
|
|
26436
|
+
parts.push(`${counts.agents} ${counts.agents === 1 ? "agent" : "agents"}`);
|
|
26437
|
+
if (counts.hooks > 0)
|
|
26438
|
+
parts.push(`${counts.hooks} ${counts.hooks === 1 ? "hook" : "hooks"}`);
|
|
26439
|
+
if (parts.length > 0) {
|
|
26440
|
+
lines.push(`${indent}${client}: ${parts.join(", ")}`);
|
|
26441
|
+
}
|
|
26442
|
+
}
|
|
26443
|
+
return lines;
|
|
26444
|
+
}
|
|
26445
|
+
function formatPluginArtifacts(copyResults, indent = " ") {
|
|
26446
|
+
const copied = copyResults.filter((r) => r.action === "copied");
|
|
26447
|
+
if (copied.length === 0)
|
|
26448
|
+
return [];
|
|
26449
|
+
const classified = classifyCopyResults(copied);
|
|
26450
|
+
if (classified.size === 0) {
|
|
26451
|
+
return [`${indent}Copied: ${copied.length} ${copied.length === 1 ? "file" : "files"}`];
|
|
26452
|
+
}
|
|
26453
|
+
return formatArtifactLines(classified, indent);
|
|
26454
|
+
}
|
|
26455
|
+
function formatSyncSummary(result, { dryRun = false, label = "Sync" } = {}) {
|
|
26456
|
+
const lines = [];
|
|
26457
|
+
const allCopied = result.pluginResults.flatMap((pr) => pr.copyResults.filter((r) => r.action === "copied"));
|
|
26458
|
+
lines.push(`${label} complete${dryRun ? " (dry run)" : ""}:`);
|
|
26459
|
+
const classified = classifyCopyResults(allCopied);
|
|
26460
|
+
if (classified.size > 0) {
|
|
26461
|
+
lines.push(...formatArtifactLines(classified));
|
|
26462
|
+
} else if (allCopied.length > 0) {
|
|
26463
|
+
lines.push(` Total ${dryRun ? "would copy" : "copied"}: ${result.totalCopied}`);
|
|
26464
|
+
}
|
|
26465
|
+
if (result.totalGenerated > 0)
|
|
26466
|
+
lines.push(` Total generated: ${result.totalGenerated}`);
|
|
26467
|
+
if (result.totalFailed > 0)
|
|
26468
|
+
lines.push(` Total failed: ${result.totalFailed}`);
|
|
26469
|
+
if (result.totalSkipped > 0)
|
|
26470
|
+
lines.push(` Total skipped: ${result.totalSkipped}`);
|
|
26471
|
+
return lines;
|
|
26472
|
+
}
|
|
26353
26473
|
function formatMcpResult(mcpResult, scope) {
|
|
26354
26474
|
const { added, overwritten, removed, skipped } = mcpResult;
|
|
26355
26475
|
if (added === 0 && overwritten === 0 && removed === 0 && skipped === 0) {
|
|
@@ -26439,6 +26559,10 @@ function buildSyncData(result) {
|
|
|
26439
26559
|
}
|
|
26440
26560
|
};
|
|
26441
26561
|
}
|
|
26562
|
+
var cachedLookup = null;
|
|
26563
|
+
var init_format_sync = __esm(() => {
|
|
26564
|
+
init_client_mapping();
|
|
26565
|
+
});
|
|
26442
26566
|
|
|
26443
26567
|
// node_modules/picocolors/picocolors.js
|
|
26444
26568
|
var require_picocolors = __commonJS((exports, module) => {
|
|
@@ -28819,7 +28943,7 @@ var package_default;
|
|
|
28819
28943
|
var init_package = __esm(() => {
|
|
28820
28944
|
package_default = {
|
|
28821
28945
|
name: "allagents",
|
|
28822
|
-
version: "0.
|
|
28946
|
+
version: "0.32.0-next.1",
|
|
28823
28947
|
description: "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
|
|
28824
28948
|
type: "module",
|
|
28825
28949
|
bin: {
|
|
@@ -29107,7 +29231,7 @@ async function runSync(context) {
|
|
|
29107
29231
|
} else {
|
|
29108
29232
|
const lines = result.pluginResults.map((pr) => `${pr.success ? "✓" : "✗"} ${pr.plugin}`);
|
|
29109
29233
|
lines.push("");
|
|
29110
|
-
lines.push(
|
|
29234
|
+
lines.push(...formatSyncSummary(result));
|
|
29111
29235
|
if (result.nativeResult) {
|
|
29112
29236
|
lines.push(...formatNativeResult(result.nativeResult));
|
|
29113
29237
|
}
|
|
@@ -29124,7 +29248,7 @@ async function runSync(context) {
|
|
|
29124
29248
|
} else {
|
|
29125
29249
|
const lines = userResult.pluginResults.map((pr) => `${pr.success ? "✓" : "✗"} ${pr.plugin}`);
|
|
29126
29250
|
lines.push("");
|
|
29127
|
-
lines.push(
|
|
29251
|
+
lines.push(...formatSyncSummary(userResult));
|
|
29128
29252
|
if (userResult.mcpResults) {
|
|
29129
29253
|
for (const [scope, mcpResult] of Object.entries(userResult.mcpResults)) {
|
|
29130
29254
|
if (!mcpResult)
|
|
@@ -29147,6 +29271,7 @@ async function runSync(context) {
|
|
|
29147
29271
|
var init_sync2 = __esm(() => {
|
|
29148
29272
|
init_dist2();
|
|
29149
29273
|
init_sync();
|
|
29274
|
+
init_format_sync();
|
|
29150
29275
|
});
|
|
29151
29276
|
|
|
29152
29277
|
// src/cli/tui/actions/init.ts
|
|
@@ -30433,6 +30558,7 @@ var repoListMeta = {
|
|
|
30433
30558
|
};
|
|
30434
30559
|
|
|
30435
30560
|
// src/cli/commands/workspace.ts
|
|
30561
|
+
init_format_sync();
|
|
30436
30562
|
function parseClientEntries(input) {
|
|
30437
30563
|
const validClients = ClientTypeSchema.options;
|
|
30438
30564
|
const validModes = InstallModeSchema.options;
|
|
@@ -30509,10 +30635,9 @@ Plugin sync results:`);
|
|
|
30509
30635
|
}
|
|
30510
30636
|
}
|
|
30511
30637
|
}
|
|
30512
|
-
console.log(
|
|
30513
|
-
|
|
30514
|
-
|
|
30515
|
-
console.log(` Failed: ${syncResult.totalFailed}`);
|
|
30638
|
+
console.log("");
|
|
30639
|
+
for (const line of formatSyncSummary(syncResult)) {
|
|
30640
|
+
console.log(line);
|
|
30516
30641
|
}
|
|
30517
30642
|
}
|
|
30518
30643
|
} catch (error) {
|
|
@@ -30612,11 +30737,11 @@ var syncCmd = import_cmd_ts2.command({
|
|
|
30612
30737
|
if (pluginResult.error) {
|
|
30613
30738
|
console.log(` Error: ${pluginResult.error}`);
|
|
30614
30739
|
}
|
|
30615
|
-
const
|
|
30740
|
+
for (const line of formatPluginArtifacts(pluginResult.copyResults)) {
|
|
30741
|
+
console.log(line);
|
|
30742
|
+
}
|
|
30616
30743
|
const generated = pluginResult.copyResults.filter((r) => r.action === "generated").length;
|
|
30617
30744
|
const failed = pluginResult.copyResults.filter((r) => r.action === "failed").length;
|
|
30618
|
-
if (copied > 0)
|
|
30619
|
-
console.log(` Copied: ${copied} files`);
|
|
30620
30745
|
if (generated > 0)
|
|
30621
30746
|
console.log(` Generated: ${generated} files`);
|
|
30622
30747
|
if (failed > 0) {
|
|
@@ -30662,15 +30787,10 @@ native:`);
|
|
|
30662
30787
|
}
|
|
30663
30788
|
}
|
|
30664
30789
|
}
|
|
30665
|
-
console.log(
|
|
30666
|
-
|
|
30667
|
-
|
|
30668
|
-
|
|
30669
|
-
console.log(` Total generated: ${result.totalGenerated}`);
|
|
30670
|
-
if (result.totalFailed > 0)
|
|
30671
|
-
console.log(` Total failed: ${result.totalFailed}`);
|
|
30672
|
-
if (result.totalSkipped > 0)
|
|
30673
|
-
console.log(` Total skipped: ${result.totalSkipped}`);
|
|
30790
|
+
console.log("");
|
|
30791
|
+
for (const line of formatSyncSummary(result, { dryRun })) {
|
|
30792
|
+
console.log(line);
|
|
30793
|
+
}
|
|
30674
30794
|
if (!result.success || result.totalFailed > 0) {
|
|
30675
30795
|
process.exit(1);
|
|
30676
30796
|
}
|
|
@@ -31645,6 +31765,7 @@ var skillsCmd = conciseSubcommands({
|
|
|
31645
31765
|
});
|
|
31646
31766
|
|
|
31647
31767
|
// src/cli/commands/plugin.ts
|
|
31768
|
+
init_format_sync();
|
|
31648
31769
|
init_workspace_config();
|
|
31649
31770
|
init_constants();
|
|
31650
31771
|
init_js_yaml();
|
|
@@ -31672,11 +31793,11 @@ Syncing workspace...
|
|
|
31672
31793
|
if (pluginResult.error) {
|
|
31673
31794
|
console.log(` Error: ${pluginResult.error}`);
|
|
31674
31795
|
}
|
|
31675
|
-
const
|
|
31796
|
+
for (const line of formatPluginArtifacts(pluginResult.copyResults)) {
|
|
31797
|
+
console.log(line);
|
|
31798
|
+
}
|
|
31676
31799
|
const generated = pluginResult.copyResults.filter((r) => r.action === "generated").length;
|
|
31677
31800
|
const failed = pluginResult.copyResults.filter((r) => r.action === "failed").length;
|
|
31678
|
-
if (copied > 0)
|
|
31679
|
-
console.log(` Copied: ${copied} files`);
|
|
31680
31801
|
if (generated > 0)
|
|
31681
31802
|
console.log(` Generated: ${generated} files`);
|
|
31682
31803
|
if (failed > 0) {
|
|
@@ -31696,17 +31817,9 @@ native:`);
|
|
|
31696
31817
|
}
|
|
31697
31818
|
}
|
|
31698
31819
|
}
|
|
31699
|
-
console.log(
|
|
31700
|
-
|
|
31701
|
-
|
|
31702
|
-
if (result.totalGenerated > 0) {
|
|
31703
|
-
console.log(` Total generated: ${result.totalGenerated}`);
|
|
31704
|
-
}
|
|
31705
|
-
if (result.totalFailed > 0) {
|
|
31706
|
-
console.log(` Total failed: ${result.totalFailed}`);
|
|
31707
|
-
}
|
|
31708
|
-
if (result.totalSkipped > 0) {
|
|
31709
|
-
console.log(` Total skipped: ${result.totalSkipped}`);
|
|
31820
|
+
console.log("");
|
|
31821
|
+
for (const line of formatSyncSummary(result)) {
|
|
31822
|
+
console.log(line);
|
|
31710
31823
|
}
|
|
31711
31824
|
}
|
|
31712
31825
|
return { ok: result.success && result.totalFailed === 0, syncData };
|
|
@@ -31732,11 +31845,11 @@ Syncing user workspace...
|
|
|
31732
31845
|
if (pluginResult.error) {
|
|
31733
31846
|
console.log(` Error: ${pluginResult.error}`);
|
|
31734
31847
|
}
|
|
31735
|
-
const
|
|
31848
|
+
for (const line of formatPluginArtifacts(pluginResult.copyResults)) {
|
|
31849
|
+
console.log(line);
|
|
31850
|
+
}
|
|
31736
31851
|
const generated = pluginResult.copyResults.filter((r) => r.action === "generated").length;
|
|
31737
31852
|
const failed = pluginResult.copyResults.filter((r) => r.action === "failed").length;
|
|
31738
|
-
if (copied > 0)
|
|
31739
|
-
console.log(` Copied: ${copied} files`);
|
|
31740
31853
|
if (generated > 0)
|
|
31741
31854
|
console.log(` Generated: ${generated} files`);
|
|
31742
31855
|
if (failed > 0) {
|
|
@@ -31769,17 +31882,9 @@ native:`);
|
|
|
31769
31882
|
}
|
|
31770
31883
|
}
|
|
31771
31884
|
}
|
|
31772
|
-
console.log(
|
|
31773
|
-
User sync
|
|
31774
|
-
|
|
31775
|
-
if (result.totalGenerated > 0) {
|
|
31776
|
-
console.log(` Total generated: ${result.totalGenerated}`);
|
|
31777
|
-
}
|
|
31778
|
-
if (result.totalFailed > 0) {
|
|
31779
|
-
console.log(` Total failed: ${result.totalFailed}`);
|
|
31780
|
-
}
|
|
31781
|
-
if (result.totalSkipped > 0) {
|
|
31782
|
-
console.log(` Total skipped: ${result.totalSkipped}`);
|
|
31885
|
+
console.log("");
|
|
31886
|
+
for (const line of formatSyncSummary(result, { label: "User sync" })) {
|
|
31887
|
+
console.log(line);
|
|
31783
31888
|
}
|
|
31784
31889
|
}
|
|
31785
31890
|
return { ok: result.success && result.totalFailed === 0, syncData };
|
|
@@ -32340,7 +32445,7 @@ Enabled skills: ${skills.join(", ")}`);
|
|
|
32340
32445
|
}
|
|
32341
32446
|
if (!isJsonMode()) {
|
|
32342
32447
|
if (result.autoRegistered) {
|
|
32343
|
-
console.log(
|
|
32448
|
+
console.log(` Resolved marketplace: ${result.autoRegistered}`);
|
|
32344
32449
|
}
|
|
32345
32450
|
console.log(`✓ Installed plugin (${isUser ? "user" : "project"} scope): ${displayPlugin}`);
|
|
32346
32451
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# Workspace root files (optional)
|
|
2
|
-
# workspace:
|
|
3
|
-
# source: ./path/to/config # local path, GitHub URL, or plugin@marketplace
|
|
4
|
-
# files:
|
|
5
|
-
# - CLAUDE.md
|
|
6
|
-
# - AGENTS.md
|
|
7
|
-
# - source: docs/CLAUDE.md # explicit source/dest mapping
|
|
8
|
-
# dest: CLAUDE.md
|
|
9
|
-
|
|
10
|
-
repositories: []
|
|
11
|
-
|
|
12
|
-
plugins: []
|
|
13
|
-
|
|
14
|
-
clients:
|
|
15
|
-
- universal
|
|
1
|
+
# Workspace root files (optional)
|
|
2
|
+
# workspace:
|
|
3
|
+
# source: ./path/to/config # local path, GitHub URL, or plugin@marketplace
|
|
4
|
+
# files:
|
|
5
|
+
# - CLAUDE.md
|
|
6
|
+
# - AGENTS.md
|
|
7
|
+
# - source: docs/CLAUDE.md # explicit source/dest mapping
|
|
8
|
+
# dest: CLAUDE.md
|
|
9
|
+
|
|
10
|
+
repositories: []
|
|
11
|
+
|
|
12
|
+
plugins: []
|
|
13
|
+
|
|
14
|
+
clients:
|
|
15
|
+
- universal
|
package/package.json
CHANGED