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 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 = parsed.type === "github" ? `${parseLocation(parsed.location).owner}/${parseLocation(parsed.location).repo}` : parsed.location;
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.31.2",
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(`Copied: ${result.totalCopied} Failed: ${result.totalFailed} Skipped: ${result.totalSkipped}`);
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(`Copied: ${userResult.totalCopied} Failed: ${userResult.totalFailed} Skipped: ${userResult.totalSkipped}`);
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
- Sync complete: ${syncResult.totalCopied} files copied`);
30514
- if (syncResult.totalFailed > 0) {
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 copied = pluginResult.copyResults.filter((r) => r.action === "copied").length;
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
- Sync complete${dryRun ? " (dry run)" : ""}:`);
30667
- console.log(` Total ${dryRun ? "would copy" : "copied"}: ${result.totalCopied}`);
30668
- if (result.totalGenerated > 0)
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 copied = pluginResult.copyResults.filter((r) => r.action === "copied").length;
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
- Sync complete:`);
31701
- console.log(` Total copied: ${result.totalCopied}`);
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 copied = pluginResult.copyResults.filter((r) => r.action === "copied").length;
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 complete:`);
31774
- console.log(` Total copied: ${result.totalCopied}`);
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(`✓ Auto-registered marketplace: ${result.autoRegistered}`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "allagents",
3
- "version": "0.31.2",
3
+ "version": "0.32.0-next.1",
4
4
  "description": "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,14 +0,0 @@
1
- # Workspace
2
-
3
- ## Development
4
-
5
- To run tests:
6
- ```bash
7
- npm test
8
- ```
9
-
10
- ## Guidelines
11
-
12
- - Add project-specific coding conventions here
13
- - Document architectural decisions
14
- - Include workflow preferences