craftdesk 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -0
- package/README.md +1609 -132
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +306 -8
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/convert.d.ts +8 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +146 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/detect-agents.d.ts +14 -0
- package/dist/commands/detect-agents.d.ts.map +1 -0
- package/dist/commands/detect-agents.js +86 -0
- package/dist/commands/detect-agents.js.map +1 -0
- package/dist/commands/embed.d.ts +14 -0
- package/dist/commands/embed.d.ts.map +1 -0
- package/dist/commands/embed.js +147 -0
- package/dist/commands/embed.js.map +1 -0
- package/dist/commands/info.d.ts +8 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +66 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +75 -7
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +158 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +8 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +51 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/outdated.d.ts +23 -0
- package/dist/commands/outdated.d.ts.map +1 -0
- package/dist/commands/outdated.js +268 -0
- package/dist/commands/outdated.js.map +1 -0
- package/dist/commands/publish.d.ts +8 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +203 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +5 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +51 -10
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +60 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup-multi-agent.d.ts +17 -0
- package/dist/commands/setup-multi-agent.d.ts.map +1 -0
- package/dist/commands/setup-multi-agent.js +188 -0
- package/dist/commands/setup-multi-agent.js.map +1 -0
- package/dist/commands/sync.d.ts +14 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +144 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/unembed.d.ts +14 -0
- package/dist/commands/unembed.d.ts.map +1 -0
- package/dist/commands/unembed.js +96 -0
- package/dist/commands/unembed.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +372 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +14 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +143 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/converters/base-converter.d.ts +89 -0
- package/dist/converters/base-converter.d.ts.map +1 -0
- package/dist/converters/base-converter.js +249 -0
- package/dist/converters/base-converter.js.map +1 -0
- package/dist/converters/continue-converter.d.ts +53 -0
- package/dist/converters/continue-converter.d.ts.map +1 -0
- package/dist/converters/continue-converter.js +243 -0
- package/dist/converters/continue-converter.js.map +1 -0
- package/dist/converters/cursor-converter.d.ts +70 -0
- package/dist/converters/cursor-converter.d.ts.map +1 -0
- package/dist/converters/cursor-converter.js +272 -0
- package/dist/converters/cursor-converter.js.map +1 -0
- package/dist/index.js +56 -3
- package/dist/index.js.map +1 -1
- package/dist/services/agent-detector.d.ts +57 -0
- package/dist/services/agent-detector.d.ts.map +1 -0
- package/dist/services/agent-detector.js +146 -0
- package/dist/services/agent-detector.js.map +1 -0
- package/dist/services/config-manager.d.ts +128 -10
- package/dist/services/config-manager.d.ts.map +1 -1
- package/dist/services/config-manager.js +190 -18
- package/dist/services/config-manager.js.map +1 -1
- package/dist/services/converter.d.ts +53 -0
- package/dist/services/converter.d.ts.map +1 -0
- package/dist/services/converter.js +185 -0
- package/dist/services/converter.js.map +1 -0
- package/dist/services/craft-wrapper.d.ts +108 -0
- package/dist/services/craft-wrapper.d.ts.map +1 -0
- package/dist/services/craft-wrapper.js +268 -0
- package/dist/services/craft-wrapper.js.map +1 -0
- package/dist/services/git-resolver.d.ts +9 -3
- package/dist/services/git-resolver.d.ts.map +1 -1
- package/dist/services/git-resolver.js +44 -20
- package/dist/services/git-resolver.js.map +1 -1
- package/dist/services/gitignore-manager.d.ts +74 -0
- package/dist/services/gitignore-manager.d.ts.map +1 -0
- package/dist/services/gitignore-manager.js +188 -0
- package/dist/services/gitignore-manager.js.map +1 -0
- package/dist/services/installer.d.ts +60 -1
- package/dist/services/installer.d.ts.map +1 -1
- package/dist/services/installer.js +295 -20
- package/dist/services/installer.js.map +1 -1
- package/dist/services/multi-agent-sync.d.ts +88 -0
- package/dist/services/multi-agent-sync.d.ts.map +1 -0
- package/dist/services/multi-agent-sync.js +316 -0
- package/dist/services/multi-agent-sync.js.map +1 -0
- package/dist/services/plugin-resolver.d.ts +80 -0
- package/dist/services/plugin-resolver.d.ts.map +1 -0
- package/dist/services/plugin-resolver.js +183 -0
- package/dist/services/plugin-resolver.js.map +1 -0
- package/dist/services/registry-client.d.ts +132 -5
- package/dist/services/registry-client.d.ts.map +1 -1
- package/dist/services/registry-client.js +239 -34
- package/dist/services/registry-client.js.map +1 -1
- package/dist/services/settings-manager.d.ts +151 -0
- package/dist/services/settings-manager.d.ts.map +1 -0
- package/dist/services/settings-manager.js +333 -0
- package/dist/services/settings-manager.js.map +1 -0
- package/dist/types/claude-settings.d.ts +155 -0
- package/dist/types/claude-settings.d.ts.map +1 -0
- package/dist/types/claude-settings.js +20 -0
- package/dist/types/claude-settings.js.map +1 -0
- package/dist/types/converter.d.ts +98 -0
- package/dist/types/converter.d.ts.map +1 -0
- package/dist/types/converter.js +6 -0
- package/dist/types/converter.js.map +1 -0
- package/dist/types/craftdesk-json.d.ts +76 -3
- package/dist/types/craftdesk-json.d.ts.map +1 -1
- package/dist/types/craftdesk-lock.d.ts +62 -1
- package/dist/types/craftdesk-lock.d.ts.map +1 -1
- package/dist/types/multi-agent.d.ts +85 -0
- package/dist/types/multi-agent.d.ts.map +1 -0
- package/dist/types/multi-agent.js +6 -0
- package/dist/types/multi-agent.js.map +1 -0
- package/dist/utils/crypto.d.ts +23 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +52 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/file-system.d.ts +43 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +45 -2
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +76 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/version-utils.d.ts +63 -0
- package/dist/utils/version-utils.d.ts.map +1 -0
- package/dist/utils/version-utils.js +130 -0
- package/dist/utils/version-utils.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -19
- package/.github/workflows/ci.yml +0 -94
- package/API.md +0 -414
- package/TESTING.md +0 -263
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -56
- package/dist/commands/config.js.map +0 -1
- package/dist/types/config.d.ts +0 -17
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -3
- package/dist/types/config.js.map +0 -1
- package/docs/DEPENDENCY_RESOLUTION.md +0 -237
- package/examples/craftdesk-all-sources.json +0 -79
- package/examples/craftdesk-git-monorepo.json +0 -41
- package/examples/craftdesk-multi-registry.json +0 -40
- package/examples/craftdesk-with-registries.json +0 -49
- package/examples/simple-craftdesk.json +0 -10
- package/src/commands/add.ts +0 -314
- package/src/commands/init.ts +0 -55
- package/src/commands/install.ts +0 -126
- package/src/commands/list.ts +0 -126
- package/src/commands/remove.ts +0 -82
- package/src/index.ts +0 -56
- package/src/services/config-manager.ts +0 -150
- package/src/services/git-resolver.ts +0 -373
- package/src/services/installer.ts +0 -314
- package/src/services/registry-client.ts +0 -163
- package/src/types/craftdesk-json.ts +0 -53
- package/src/types/craftdesk-lock.ts +0 -38
- package/src/utils/file-system.ts +0 -55
- package/src/utils/logger.ts +0 -82
- package/tests/fixtures/craftdesk-git.json +0 -17
- package/tests/fixtures/craftdesk.json +0 -15
- package/tests/helpers/test-utils.ts +0 -60
- package/tests/integration/init-command.test.ts +0 -70
- package/tests/integration/list-command.test.ts +0 -77
- package/tests/unit/config-manager.test.ts +0 -228
- package/tests/unit/git-resolver.test.ts +0 -303
- package/tests/unit/installer.test.ts +0 -105
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -29
package/README.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> **Dependency management for AI capabilities** - Install, manage, and version control your Claude Code skills, agents, commands, hooks, and plugins.
|
|
4
4
|
|
|
5
|
-
The
|
|
5
|
+
The command-line interface for managing your Coding AI capabilities. Similar to npm for JavaScript or bundler for Ruby, CraftDesk CLI provides a complete package management solution for AI-powered development tools.
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/craftdesk)
|
|
8
|
+
[](https://github.com/mensfeld/craftdesk/actions/workflows/ci.yml)
|
|
8
9
|
[](https://opensource.org/licenses/MIT)
|
|
9
10
|
|
|
10
11
|
---
|
|
@@ -13,12 +14,17 @@ The official command-line interface for managing CraftDesk AI capabilities. Simi
|
|
|
13
14
|
|
|
14
15
|
CraftDesk is a package manager for AI capabilities used in Claude Code and other AI development environments. It allows you to:
|
|
15
16
|
|
|
16
|
-
- **Install AI skills, agents, commands, hooks, and
|
|
17
|
+
- **Install AI skills, agents, commands, hooks, plugins, and collections** from git repositories or registries
|
|
18
|
+
- **Collections** - Curate and share groups of related crafts that work together
|
|
19
|
+
- **Plugin system** - Bundle multiple crafts with automatic dependency resolution
|
|
20
|
+
- **Multi-agent sync** - Share skills across multiple AI assistants (Claude, Cursor, Windsurf, etc.)
|
|
17
21
|
- **Lock versions** for reproducible environments across teams
|
|
18
|
-
- **Manage dependencies** with automatic
|
|
22
|
+
- **Manage dependencies** with automatic recursive installation
|
|
19
23
|
- **Support monorepos** with subdirectory extraction
|
|
20
24
|
- **Auto-convert GitHub URLs** - paste any GitHub URL (tree/blob)
|
|
21
25
|
- **Direct file references** - install single files from repositories
|
|
26
|
+
- **Settings integration** - Automatic registration in `.claude/settings.json`
|
|
27
|
+
- **MCP server support** - Configure Model Context Protocol servers via plugins
|
|
22
28
|
|
|
23
29
|
Think of it as:
|
|
24
30
|
- **npm** for Node.js → **CraftDesk** for AI capabilities
|
|
@@ -40,7 +46,7 @@ npm install -g craftdesk
|
|
|
40
46
|
Verify installation:
|
|
41
47
|
```bash
|
|
42
48
|
craftdesk --version
|
|
43
|
-
# 0.
|
|
49
|
+
# 0.3.0
|
|
44
50
|
```
|
|
45
51
|
|
|
46
52
|
**Requirements:** Node.js >= 18.0.0, Git, npm or yarn
|
|
@@ -111,7 +117,27 @@ Total: 2 crafts installed
|
|
|
111
117
|
- [What is CraftDesk?](#what-is-craftdesk)
|
|
112
118
|
- [Quick Start](#quick-start)
|
|
113
119
|
- [Core Concepts](#core-concepts)
|
|
120
|
+
- [Crafts](#crafts)
|
|
121
|
+
- [Collections](#collections)
|
|
122
|
+
- [Plugin System](#plugin-system)
|
|
114
123
|
- [Command Reference](#command-reference)
|
|
124
|
+
- [init](#craftdesk-init-options)
|
|
125
|
+
- [install](#craftdesk-install-options)
|
|
126
|
+
- [add](#craftdesk-add-craft-options)
|
|
127
|
+
- [remove](#craftdesk-remove-craft)
|
|
128
|
+
- [list](#craftdesk-list-options)
|
|
129
|
+
- [search](#craftdesk-search-query-options)
|
|
130
|
+
- [info](#craftdesk-info-craft)
|
|
131
|
+
- [outdated](#craftdesk-outdated)
|
|
132
|
+
- [update](#craftdesk-update-craft)
|
|
133
|
+
- [publish](#craftdesk-publish-options)
|
|
134
|
+
- [Embedded/Local Skills](#embeddedlocal-skills)
|
|
135
|
+
- [embed](#craftdesk-embed-name-options)
|
|
136
|
+
- [unembed](#craftdesk-unembed-name-options)
|
|
137
|
+
- [Authentication](#authentication)
|
|
138
|
+
- [login](#craftdesk-login-options)
|
|
139
|
+
- [logout](#craftdesk-logout-options)
|
|
140
|
+
- [whoami](#craftdesk-whoami-options)
|
|
115
141
|
- [Dependency Sources](#dependency-sources)
|
|
116
142
|
- [Monorepo Support](#monorepo-support)
|
|
117
143
|
- [craftdesk.json Reference](#craftdeskjson-reference)
|
|
@@ -119,6 +145,7 @@ Total: 2 crafts installed
|
|
|
119
145
|
- [CI/CD Integration](#cicd-integration)
|
|
120
146
|
- [Troubleshooting](#troubleshooting)
|
|
121
147
|
- [Development](#development)
|
|
148
|
+
- [Documentation](#documentation)
|
|
122
149
|
|
|
123
150
|
---
|
|
124
151
|
|
|
@@ -131,7 +158,618 @@ A **craft** is any AI capability:
|
|
|
131
158
|
- **Agent** - Autonomous task executor (e.g., code-reviewer, test-runner)
|
|
132
159
|
- **Command** - Slash command (e.g., /deploy, /analyze)
|
|
133
160
|
- **Hook** - Event handler (e.g., pre-commit, post-install)
|
|
134
|
-
- **Plugin** -
|
|
161
|
+
- **Plugin** - Bundle of multiple crafts with dependencies and MCP server configuration
|
|
162
|
+
- **Collection** - Curated group of related crafts that work together (e.g., rails-enterprise-stack)
|
|
163
|
+
|
|
164
|
+
### Format Conversion
|
|
165
|
+
|
|
166
|
+
**Convert CraftDesk crafts to other AI editor formats** for cross-platform use.
|
|
167
|
+
|
|
168
|
+
**Supported Formats:**
|
|
169
|
+
- **Cursor** - Modern `.mdc` format in `.cursor/rules/` directory
|
|
170
|
+
- **Cursor Legacy** - Plain text `.cursorrules` format
|
|
171
|
+
- **Continue.dev** - Prompt and rule files in `.continue/prompts/` and `.continue/rules/`
|
|
172
|
+
|
|
173
|
+
**Why convert formats?**
|
|
174
|
+
- **Use any AI editor** - Write once, deploy to Cursor, Continue, Windsurf, etc.
|
|
175
|
+
- **Team flexibility** - Developers can use their preferred editors
|
|
176
|
+
- **Maximum reach** - Distribute crafts to wider audience
|
|
177
|
+
- **No lock-in** - Not tied to single platform
|
|
178
|
+
|
|
179
|
+
**Basic Usage:**
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Convert a craft to Cursor format
|
|
183
|
+
craftdesk convert ./my-craft --to cursor
|
|
184
|
+
|
|
185
|
+
# Convert to Continue.dev format
|
|
186
|
+
craftdesk convert ./my-craft --to continue
|
|
187
|
+
|
|
188
|
+
# Convert to legacy .cursorrules
|
|
189
|
+
craftdesk convert ./my-craft --to cursor-legacy
|
|
190
|
+
|
|
191
|
+
# Convert all installed crafts
|
|
192
|
+
craftdesk convert --all --to cursor --output .cursor/rules
|
|
193
|
+
|
|
194
|
+
# List available formats
|
|
195
|
+
craftdesk convert --list-formats
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Example: Rails Skill → Cursor**
|
|
199
|
+
|
|
200
|
+
Your `SKILL.md`:
|
|
201
|
+
```markdown
|
|
202
|
+
---
|
|
203
|
+
name: ruby-on-rails
|
|
204
|
+
description: Ruby on Rails development
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Instructions
|
|
208
|
+
Expert knowledge of Rails framework...
|
|
209
|
+
|
|
210
|
+
## Best Practices
|
|
211
|
+
- Use Strong Parameters
|
|
212
|
+
- Follow RESTful conventions
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Converted to `.cursor/rules/ruby-on-rails.mdc`:
|
|
216
|
+
```markdown
|
|
217
|
+
---
|
|
218
|
+
description: Ruby on Rails development
|
|
219
|
+
globs:
|
|
220
|
+
- "**/*.rb"
|
|
221
|
+
- "**/*.erb"
|
|
222
|
+
- "**/*.haml"
|
|
223
|
+
alwaysApply: true
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
# Ruby On Rails
|
|
227
|
+
|
|
228
|
+
## Overview
|
|
229
|
+
Expert knowledge of Rails framework...
|
|
230
|
+
|
|
231
|
+
## Best Practices
|
|
232
|
+
- Use Strong Parameters
|
|
233
|
+
- Follow RESTful conventions
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Advanced Options:**
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Merge modes
|
|
240
|
+
craftdesk convert --to cursor --merge-mode skip # Skip existing files
|
|
241
|
+
craftdesk convert --to cursor --merge-mode append # Append to existing
|
|
242
|
+
craftdesk convert --to cursor --merge-mode overwrite # Overwrite (default)
|
|
243
|
+
|
|
244
|
+
# Custom output directory
|
|
245
|
+
craftdesk convert --to cursor --output /custom/path
|
|
246
|
+
|
|
247
|
+
# Convert specific craft type
|
|
248
|
+
craftdesk convert .claude/skills/ruby-rails --to continue
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**What Gets Converted:**
|
|
252
|
+
|
|
253
|
+
| Section | Cursor | Continue |
|
|
254
|
+
|---------|--------|----------|
|
|
255
|
+
| Instructions | ✓ Overview | ✓ Context |
|
|
256
|
+
| Code Patterns | ✓ Code Patterns | ✓ Patterns to Follow |
|
|
257
|
+
| Examples | ✓ Examples | ✓ Examples |
|
|
258
|
+
| Best Practices | ✓ Best Practices | ✓ Best Practices |
|
|
259
|
+
| Pitfalls | ✓ Mistakes to Avoid | ✓ Mistakes to Avoid |
|
|
260
|
+
| Workflows | ✓ Common Workflows | ✓ Step-by-Step Workflows |
|
|
261
|
+
|
|
262
|
+
**Language-Specific Features:**
|
|
263
|
+
|
|
264
|
+
Cursor converter automatically infers file globs based on content:
|
|
265
|
+
- **Ruby/Rails** → `**/*.rb`, `**/*.erb`, config files
|
|
266
|
+
- **TypeScript** → `**/*.ts`, `**/*.tsx`
|
|
267
|
+
- **Python** → `**/*.py`
|
|
268
|
+
- **JavaScript** → `**/*.js`, `**/*.jsx`
|
|
269
|
+
- **And more...** (Go, Rust, PHP, Java, etc.)
|
|
270
|
+
|
|
271
|
+
Continue converter generates:
|
|
272
|
+
- **Prompts** (invokable with `/`) - for manual use
|
|
273
|
+
- **Rules** (automatic) - applied to all matching files
|
|
274
|
+
|
|
275
|
+
**CI/CD Integration:**
|
|
276
|
+
|
|
277
|
+
```yaml
|
|
278
|
+
# .github/workflows/convert-crafts.yml
|
|
279
|
+
name: Convert Crafts to Multiple Formats
|
|
280
|
+
on: [push]
|
|
281
|
+
jobs:
|
|
282
|
+
convert:
|
|
283
|
+
runs-on: ubuntu-latest
|
|
284
|
+
steps:
|
|
285
|
+
- uses: actions/checkout@v2
|
|
286
|
+
- name: Install CraftDesk
|
|
287
|
+
run: npm install -g craftdesk
|
|
288
|
+
- name: Convert to Cursor
|
|
289
|
+
run: craftdesk convert --all --to cursor --output dist/cursor
|
|
290
|
+
- name: Convert to Continue
|
|
291
|
+
run: craftdesk convert --all --to continue --output dist/continue
|
|
292
|
+
- name: Upload artifacts
|
|
293
|
+
uses: actions/upload-artifact@v2
|
|
294
|
+
with:
|
|
295
|
+
name: converted-crafts
|
|
296
|
+
path: dist/
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Tips:**
|
|
300
|
+
|
|
301
|
+
1. **Test conversions** - Always verify converted files work in target editor
|
|
302
|
+
2. **Preserve originals** - Keep SKILL.md as source of truth
|
|
303
|
+
3. **Update together** - Convert after each craft update
|
|
304
|
+
4. **Version control** - Commit both source and converted formats
|
|
305
|
+
|
|
306
|
+
### Multi-Agent Sync
|
|
307
|
+
|
|
308
|
+
**Share skills across multiple AI coding assistants** - Sync your crafts to Claude Code, Cursor, Windsurf, Continue.dev, and more with automatic copy management and drift detection.
|
|
309
|
+
|
|
310
|
+
**Why use multi-agent sync?**
|
|
311
|
+
- **Single source of truth** - Maintain skills in one location (`.claude/skills/`)
|
|
312
|
+
- **Cross-editor compatibility** - Use the same skills in Claude, Cursor, Windsurf, etc.
|
|
313
|
+
- **Team flexibility** - Developers can use their preferred AI assistant
|
|
314
|
+
- **Automatic sync** - Install once, sync everywhere
|
|
315
|
+
- **Drift detection** - SHA-256 checksums detect modifications
|
|
316
|
+
- **Windows compatible** - Copy-based (no symlinks required)
|
|
317
|
+
|
|
318
|
+
**Quick Start:**
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# 1. Interactive setup (recommended)
|
|
322
|
+
craftdesk setup-multi-agent
|
|
323
|
+
|
|
324
|
+
# 2. Detect available AI assistants
|
|
325
|
+
craftdesk detect-agents
|
|
326
|
+
|
|
327
|
+
# 3. Sync all crafts to configured agents
|
|
328
|
+
craftdesk sync
|
|
329
|
+
|
|
330
|
+
# 4. Verify sync status (check for drift)
|
|
331
|
+
craftdesk verify
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Configuration:**
|
|
335
|
+
|
|
336
|
+
Add to your `craftdesk.json`:
|
|
337
|
+
|
|
338
|
+
```json
|
|
339
|
+
{
|
|
340
|
+
"name": "my-project",
|
|
341
|
+
"version": "1.0.0",
|
|
342
|
+
"dependencies": {
|
|
343
|
+
"ruby-expert": "^1.0.0"
|
|
344
|
+
},
|
|
345
|
+
"multiAgent": {
|
|
346
|
+
"enabled": true,
|
|
347
|
+
"canonical": ".claude",
|
|
348
|
+
"targets": [
|
|
349
|
+
".claude/skills",
|
|
350
|
+
".cursor/skills",
|
|
351
|
+
".windsurf/skills"
|
|
352
|
+
],
|
|
353
|
+
"autoSync": true
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**How it works:**
|
|
359
|
+
|
|
360
|
+
1. **Canonical Location** - Skills are installed to `.claude/skills/` (source of truth)
|
|
361
|
+
2. **Target Directories** - Copies are created in `.cursor/skills/`, `.windsurf/skills/`, etc.
|
|
362
|
+
3. **Checksum Tracking** - Each copy has a `.craftdesk-checksum` file (SHA-256)
|
|
363
|
+
4. **Drift Detection** - `craftdesk verify` compares checksums to detect modifications
|
|
364
|
+
5. **Re-sync** - `craftdesk sync` updates all copies from canonical
|
|
365
|
+
|
|
366
|
+
**Example Workflow:**
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
# Install a new skill
|
|
370
|
+
craftdesk add git+https://github.com/user/ruby-expert.git
|
|
371
|
+
|
|
372
|
+
# Skills auto-sync to all agents (if autoSync: true)
|
|
373
|
+
# ✓ Installed to .claude/skills/ruby-expert
|
|
374
|
+
# ✓ Synced to .cursor/skills/ruby-expert
|
|
375
|
+
# ✓ Synced to .windsurf/skills/ruby-expert
|
|
376
|
+
|
|
377
|
+
# Verify everything is in sync
|
|
378
|
+
craftdesk verify
|
|
379
|
+
# ✅ All 3 craft(s) are in sync!
|
|
380
|
+
|
|
381
|
+
# Later, check for drift
|
|
382
|
+
craftdesk verify
|
|
383
|
+
# ⚠️ ruby-expert
|
|
384
|
+
# Out of sync: .cursor/skills/ruby-expert (modified)
|
|
385
|
+
|
|
386
|
+
# Re-sync to fix drift
|
|
387
|
+
craftdesk sync --craft ruby-expert
|
|
388
|
+
# ✅ Synced ruby-expert to 3 location(s)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**Supported AI Assistants:**
|
|
392
|
+
|
|
393
|
+
| Assistant | Directory | Auto-Detected |
|
|
394
|
+
|-----------|-----------|---------------|
|
|
395
|
+
| **Claude Code** | `.claude/skills/` | ✅ Always enabled (canonical) |
|
|
396
|
+
| **Cursor** | `.cursor/skills/` | ✅ Yes |
|
|
397
|
+
| **Windsurf** | `.windsurf/skills/` | ✅ Yes |
|
|
398
|
+
| **Continue.dev** | `.continue/skills/` | ✅ Yes |
|
|
399
|
+
| **Generic .agents** | `.agents/skills/` | ✅ Yes |
|
|
400
|
+
|
|
401
|
+
**Commands:**
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
# Setup wizard (interactive)
|
|
405
|
+
craftdesk setup-multi-agent
|
|
406
|
+
|
|
407
|
+
# Detect AI assistants in project
|
|
408
|
+
craftdesk detect-agents
|
|
409
|
+
craftdesk detect-agents --verbose
|
|
410
|
+
craftdesk detect-agents --format json
|
|
411
|
+
|
|
412
|
+
# Sync all crafts to all targets
|
|
413
|
+
craftdesk sync
|
|
414
|
+
craftdesk sync --craft ruby-expert # Sync specific craft
|
|
415
|
+
craftdesk sync --dry-run # Preview changes
|
|
416
|
+
craftdesk sync --force # Force re-sync
|
|
417
|
+
|
|
418
|
+
# Verify sync status
|
|
419
|
+
craftdesk verify
|
|
420
|
+
craftdesk verify --craft ruby-expert # Verify specific craft
|
|
421
|
+
craftdesk verify --verbose # Show checksums
|
|
422
|
+
craftdesk verify --format json # JSON output
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Best Practices:**
|
|
426
|
+
|
|
427
|
+
1. **Use canonical as source of truth** - Always edit skills in `.claude/skills/`
|
|
428
|
+
2. **Enable autoSync** - New installs automatically sync to all agents
|
|
429
|
+
3. **Run verify regularly** - Check for drift, especially in teams
|
|
430
|
+
4. **Sync after manual edits** - If you edit a skill, run `craftdesk sync`
|
|
431
|
+
5. **Commit canonical only** - Add target directories to `.gitignore`
|
|
432
|
+
|
|
433
|
+
**gitignore Example:**
|
|
434
|
+
|
|
435
|
+
```gitignore
|
|
436
|
+
# Only track canonical location
|
|
437
|
+
.cursor/skills/*
|
|
438
|
+
.windsurf/skills/*
|
|
439
|
+
.continue/skills/*
|
|
440
|
+
|
|
441
|
+
# Track canonical
|
|
442
|
+
!.claude/skills/
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
**Why copy instead of symlinks?**
|
|
446
|
+
|
|
447
|
+
We use copy-based sync instead of symlinks for maximum compatibility:
|
|
448
|
+
- ✅ **Windows compatible** - No admin privileges or Developer Mode required
|
|
449
|
+
- ✅ **Git-friendly** - No `core.symlinks` complications
|
|
450
|
+
- ✅ **Reliable** - Works consistently across all platforms
|
|
451
|
+
- ✅ **Simple** - Easy to understand and debug
|
|
452
|
+
- ✅ **Verifiable** - Checksums detect any modifications
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### Embedded/Local Skills
|
|
457
|
+
|
|
458
|
+
**Commit project-specific skills to your repository** alongside managed dependencies for a hybrid approach to skill management.
|
|
459
|
+
|
|
460
|
+
**What are embedded skills?**
|
|
461
|
+
|
|
462
|
+
Embedded skills are local, project-specific AI capabilities that are:
|
|
463
|
+
- ✅ **Committed to git** - Part of your repository, versioned with your code
|
|
464
|
+
- ✅ **Project-specific** - Custom skills unique to your project
|
|
465
|
+
- ✅ **Team-shared** - Distributed via `git clone` (not `craftdesk install`)
|
|
466
|
+
- ✅ **Auto-synced** - Sync to other AI assistants with multi-agent support
|
|
467
|
+
- ⚠️ **Not managed** - No version updates via `craftdesk update`
|
|
468
|
+
|
|
469
|
+
**When to embed vs. manage:**
|
|
470
|
+
|
|
471
|
+
| Use Case | Embedded | Managed (dependencies) |
|
|
472
|
+
|----------|----------|------------------------|
|
|
473
|
+
| Project-specific business logic | ✅ | ❌ |
|
|
474
|
+
| Custom team workflows | ✅ | ❌ |
|
|
475
|
+
| Proprietary domain knowledge | ✅ | ❌ |
|
|
476
|
+
| Shared/reusable skills | ❌ | ✅ |
|
|
477
|
+
| Skills that need updates | ❌ | ✅ |
|
|
478
|
+
| Skills from registry/git repos | ❌ | ✅ |
|
|
479
|
+
|
|
480
|
+
**Quick Start:**
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
# 1. Create a local skill manually
|
|
484
|
+
mkdir -p .claude/skills/my-project-skill
|
|
485
|
+
cat > .claude/skills/my-project-skill/SKILL.md <<EOF
|
|
486
|
+
---
|
|
487
|
+
skill: my-project-skill
|
|
488
|
+
version: 1.0.0
|
|
489
|
+
---
|
|
490
|
+
# My Project Skill
|
|
491
|
+
|
|
492
|
+
Project-specific knowledge about our custom architecture...
|
|
493
|
+
EOF
|
|
494
|
+
|
|
495
|
+
# 2. Register it as embedded
|
|
496
|
+
craftdesk embed my-project-skill
|
|
497
|
+
|
|
498
|
+
# 3. Commit to git
|
|
499
|
+
git add .claude/skills/my-project-skill craftdesk.json
|
|
500
|
+
git commit -m "Add my-project-skill as embedded skill"
|
|
501
|
+
|
|
502
|
+
# Team members get it via git clone (not craftdesk install!)
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
**Configuration:**
|
|
506
|
+
|
|
507
|
+
Your `craftdesk.json` tracks embedded skills separately from dependencies:
|
|
508
|
+
|
|
509
|
+
```json
|
|
510
|
+
{
|
|
511
|
+
"name": "my-project",
|
|
512
|
+
"version": "1.0.0",
|
|
513
|
+
"dependencies": {
|
|
514
|
+
"ruby-expert": "^1.0.0", // Managed, from registry
|
|
515
|
+
"postgres-expert": "^2.0.0" // Managed, from git
|
|
516
|
+
},
|
|
517
|
+
"embedded": [
|
|
518
|
+
"my-project-skill", // Embedded, committed to git
|
|
519
|
+
"team-coding-standards" // Embedded, team-specific
|
|
520
|
+
]
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
**How .gitignore works:**
|
|
525
|
+
|
|
526
|
+
CraftDesk automatically generates `.claude/skills/.gitignore` to:
|
|
527
|
+
- ✅ **Ignore managed skills** - Not committed (installed via `craftdesk install`)
|
|
528
|
+
- ✅ **Allow embedded skills** - Committed with your code
|
|
529
|
+
- ✅ **Track orphans** - Skills not in either list (commented warnings)
|
|
530
|
+
|
|
531
|
+
Example generated `.gitignore`:
|
|
532
|
+
|
|
533
|
+
```gitignore
|
|
534
|
+
# Auto-generated by CraftDesk - DO NOT EDIT
|
|
535
|
+
# This file is managed automatically based on craftdesk.json and craftdesk.lock
|
|
536
|
+
|
|
537
|
+
# Managed dependencies (from craftdesk.lock)
|
|
538
|
+
# These are installed via `craftdesk install` and should not be committed
|
|
539
|
+
postgres-expert/
|
|
540
|
+
ruby-expert/
|
|
541
|
+
|
|
542
|
+
# Embedded/local skills (committed to git)
|
|
543
|
+
# These are project-specific and should be committed
|
|
544
|
+
# NOT ignored: my-project-skill/
|
|
545
|
+
# NOT ignored: team-coding-standards/
|
|
546
|
+
|
|
547
|
+
# Untracked (not in craftdesk.json or craftdesk.lock)
|
|
548
|
+
# Add these to dependencies or embedded list, or delete them
|
|
549
|
+
# orphaned-old-skill/
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
**Commands:**
|
|
553
|
+
|
|
554
|
+
#### `craftdesk embed <name> [options]`
|
|
555
|
+
|
|
556
|
+
Register a skill as embedded (committed to git).
|
|
557
|
+
|
|
558
|
+
**Options:**
|
|
559
|
+
- `--type <type>` - Craft type: skill, agent, command, hook (default: skill)
|
|
560
|
+
- `--skip-sync` - Skip multi-agent sync after embedding
|
|
561
|
+
|
|
562
|
+
**Examples:**
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
# Embed a skill
|
|
566
|
+
craftdesk embed my-local-skill
|
|
567
|
+
|
|
568
|
+
# Embed an agent
|
|
569
|
+
craftdesk embed my-automation-agent --type agent
|
|
570
|
+
|
|
571
|
+
# Embed without syncing to other agents
|
|
572
|
+
craftdesk embed team-workflow --skip-sync
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
**What happens:**
|
|
576
|
+
1. ✅ Adds skill to `craftdesk.json` `embedded` array
|
|
577
|
+
2. ✅ Updates `.claude/skills/.gitignore` to allow the skill
|
|
578
|
+
3. ✅ Syncs to other AI assistants (if multi-agent enabled)
|
|
579
|
+
|
|
580
|
+
**Requirements:**
|
|
581
|
+
- Skill directory must exist (`.claude/skills/my-local-skill/`)
|
|
582
|
+
- Cannot embed a managed dependency (remove from `dependencies` first)
|
|
583
|
+
- Cannot embed the same skill twice
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
#### `craftdesk unembed <name> [options]`
|
|
588
|
+
|
|
589
|
+
Unregister an embedded skill (no longer committed).
|
|
590
|
+
|
|
591
|
+
**Options:**
|
|
592
|
+
- `--remove` - Also delete the skill files from disk
|
|
593
|
+
|
|
594
|
+
**Examples:**
|
|
595
|
+
|
|
596
|
+
```bash
|
|
597
|
+
# Unembed a skill (files remain on disk)
|
|
598
|
+
craftdesk unembed my-local-skill
|
|
599
|
+
|
|
600
|
+
# Unembed and delete files
|
|
601
|
+
craftdesk unembed old-skill --remove
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**What happens:**
|
|
605
|
+
1. ✅ Removes skill from `craftdesk.json` `embedded` array
|
|
606
|
+
2. ✅ Updates `.claude/skills/.gitignore` (skill becomes orphaned)
|
|
607
|
+
3. ⚠️ Skill files remain unless `--remove` is used
|
|
608
|
+
|
|
609
|
+
**After unembedding:**
|
|
610
|
+
- Skill becomes "orphaned" (commented in `.gitignore`)
|
|
611
|
+
- Manually delete files or re-embed it
|
|
612
|
+
- Or add it to `dependencies` to manage it
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
**Workflow Examples:**
|
|
617
|
+
|
|
618
|
+
**1. Create and embed a new skill:**
|
|
619
|
+
|
|
620
|
+
```bash
|
|
621
|
+
# Create skill directory and file
|
|
622
|
+
mkdir -p .claude/skills/deployment-guide
|
|
623
|
+
cat > .claude/skills/deployment-guide/SKILL.md <<'EOF'
|
|
624
|
+
---
|
|
625
|
+
skill: deployment-guide
|
|
626
|
+
version: 1.0.0
|
|
627
|
+
---
|
|
628
|
+
# Deployment Guide
|
|
629
|
+
|
|
630
|
+
Our custom deployment process...
|
|
631
|
+
EOF
|
|
632
|
+
|
|
633
|
+
# Embed it
|
|
634
|
+
craftdesk embed deployment-guide
|
|
635
|
+
|
|
636
|
+
# Commit
|
|
637
|
+
git add .claude/skills/deployment-guide craftdesk.json
|
|
638
|
+
git commit -m "Add deployment-guide skill"
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
**2. Convert managed skill to embedded:**
|
|
642
|
+
|
|
643
|
+
```bash
|
|
644
|
+
# You have: ruby-expert@1.0.0 (from registry)
|
|
645
|
+
# You want: Modify it and commit to your repo
|
|
646
|
+
|
|
647
|
+
# 1. Remove from dependencies
|
|
648
|
+
craftdesk remove ruby-expert
|
|
649
|
+
|
|
650
|
+
# 2. Skill files are now orphaned (but still on disk)
|
|
651
|
+
|
|
652
|
+
# 3. Embed it
|
|
653
|
+
craftdesk embed ruby-expert
|
|
654
|
+
|
|
655
|
+
# 4. Commit your customized version
|
|
656
|
+
git add .claude/skills/ruby-expert craftdesk.json
|
|
657
|
+
git commit -m "Embed ruby-expert with custom modifications"
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**3. List and identify embedded skills:**
|
|
661
|
+
|
|
662
|
+
```bash
|
|
663
|
+
craftdesk list
|
|
664
|
+
|
|
665
|
+
# Output shows embedded badge:
|
|
666
|
+
# 📚 Skills:
|
|
667
|
+
# ruby-expert@1.0.0
|
|
668
|
+
# postgres-expert@2.0.0
|
|
669
|
+
# my-project-skill@1.0.0 📌 (embedded)
|
|
670
|
+
# team-workflow@1.0.0 📌 (embedded)
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
**4. Team collaboration:**
|
|
674
|
+
|
|
675
|
+
```bash
|
|
676
|
+
# Developer A: Creates and embeds skill
|
|
677
|
+
craftdesk embed new-feature-guide
|
|
678
|
+
git add .claude/skills/new-feature-guide craftdesk.json .claude/skills/.gitignore
|
|
679
|
+
git commit -m "Add new-feature-guide"
|
|
680
|
+
git push
|
|
681
|
+
|
|
682
|
+
# Developer B: Pulls and gets skill automatically
|
|
683
|
+
git pull
|
|
684
|
+
# ✅ Skill is ready to use (no craftdesk install needed!)
|
|
685
|
+
|
|
686
|
+
# Multi-agent sync works too (if enabled)
|
|
687
|
+
craftdesk verify
|
|
688
|
+
# ✅ new-feature-guide synced to .cursor/skills/
|
|
689
|
+
# ✅ new-feature-guide synced to .windsurf/skills/
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
**Best Practices:**
|
|
693
|
+
|
|
694
|
+
1. **Use embedded for project-specific knowledge** - Custom workflows, business logic, proprietary info
|
|
695
|
+
2. **Use managed for reusable skills** - Generic skills that can be shared across projects
|
|
696
|
+
3. **Always commit .gitignore** - CraftDesk auto-generates it, keep it in git
|
|
697
|
+
4. **Document embedded skills** - Add README explaining their purpose
|
|
698
|
+
5. **Version embedded skills** - Update version in skill frontmatter when modified
|
|
699
|
+
6. **Verify multi-agent sync** - Run `craftdesk verify` after embedding
|
|
700
|
+
|
|
701
|
+
---
|
|
702
|
+
|
|
703
|
+
### Collections
|
|
704
|
+
|
|
705
|
+
**Collections** are crafts that group related capabilities together. Instead of installing 6 individual crafts, install one collection that includes all of them.
|
|
706
|
+
|
|
707
|
+
**Why use collections?**
|
|
708
|
+
- **Faster onboarding** - One command installs complete workflows
|
|
709
|
+
- **Curated quality** - Experts bundle best-of-breed tools
|
|
710
|
+
- **Consistent stacks** - Teams share identical setups
|
|
711
|
+
- **Versioned together** - Dependencies tested to work together
|
|
712
|
+
|
|
713
|
+
**Example: Rails Enterprise Stack**
|
|
714
|
+
|
|
715
|
+
Create a collection in `craftdesk.json`:
|
|
716
|
+
```json
|
|
717
|
+
{
|
|
718
|
+
"name": "rails-enterprise-stack",
|
|
719
|
+
"version": "1.0.0",
|
|
720
|
+
"type": "collection",
|
|
721
|
+
"description": "Complete Rails enterprise development setup",
|
|
722
|
+
"dependencies": {
|
|
723
|
+
"ruby-on-rails": "^7.0.0",
|
|
724
|
+
"rspec-testing": "^3.12.0",
|
|
725
|
+
"rubocop-linter": "^1.50.0",
|
|
726
|
+
"sidekiq-background-jobs": "^7.0.0",
|
|
727
|
+
"postgresql-expert": "^15.0.0",
|
|
728
|
+
"devise-auth": "^4.9.0"
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
**Installing a collection:**
|
|
734
|
+
```bash
|
|
735
|
+
craftdesk add git+https://github.com/company/rails-enterprise-stack.git
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
**What happens:**
|
|
739
|
+
1. CraftDesk reads the collection's `craftdesk.json`
|
|
740
|
+
2. Recursively resolves all 6 dependencies
|
|
741
|
+
3. Installs the collection + all dependencies
|
|
742
|
+
4. Creates lockfile tracking everything
|
|
743
|
+
|
|
744
|
+
**Result:** 7 crafts installed (collection + 6 dependencies)
|
|
745
|
+
|
|
746
|
+
**How collections work:**
|
|
747
|
+
|
|
748
|
+
Collections leverage CraftDesk's **recursive dependency resolution**. When you install a craft with dependencies, CraftDesk:
|
|
749
|
+
1. Clones the repository
|
|
750
|
+
2. Reads `craftdesk.json`
|
|
751
|
+
3. Adds all dependencies to the resolution queue
|
|
752
|
+
4. Recursively resolves transitive dependencies
|
|
753
|
+
5. Installs everything with a single lockfile
|
|
754
|
+
|
|
755
|
+
This means **any craft with dependencies acts as a collection** - the `type: "collection"` field just improves discoverability in the registry.
|
|
756
|
+
|
|
757
|
+
**Nested collections:**
|
|
758
|
+
|
|
759
|
+
Collections can depend on other collections:
|
|
760
|
+
```json
|
|
761
|
+
{
|
|
762
|
+
"name": "full-stack-rails",
|
|
763
|
+
"type": "collection",
|
|
764
|
+
"dependencies": {
|
|
765
|
+
"rails-enterprise-stack": "^1.0.0", // Another collection!
|
|
766
|
+
"frontend-tooling": "^2.1.0", // Another collection!
|
|
767
|
+
"docker-deployment": "^1.5.0"
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
CraftDesk handles arbitrary nesting depth with circular dependency detection.
|
|
135
773
|
|
|
136
774
|
### Manifest File: craftdesk.json
|
|
137
775
|
|
|
@@ -170,169 +808,800 @@ Records exact versions installed (like package-lock.json or Gemfile.lock):
|
|
|
170
808
|
}
|
|
171
809
|
```
|
|
172
810
|
|
|
173
|
-
**Always commit this file to version control!**
|
|
811
|
+
**Always commit this file to version control!**
|
|
812
|
+
|
|
813
|
+
### Security: Checksum Verification
|
|
814
|
+
|
|
815
|
+
CraftDesk automatically verifies the integrity of downloaded packages:
|
|
816
|
+
|
|
817
|
+
- **Registry packages**: SHA-256 checksums are computed when you first add a craft and stored in `craftdesk.lock`
|
|
818
|
+
- **Subsequent installs**: The downloaded file is verified against the stored checksum before extraction
|
|
819
|
+
- **MITM protection**: Prevents tampering during download by detecting any modifications
|
|
820
|
+
- **Git packages**: Git commit hashes serve as checksums - stored in the lockfile and verified during clone
|
|
821
|
+
|
|
822
|
+
**What happens on checksum mismatch:**
|
|
823
|
+
```
|
|
824
|
+
Error: Checksum verification failed for john/rails-api@2.1.0.
|
|
825
|
+
Expected: a1b2c3d4e5f6...
|
|
826
|
+
This may indicate a corrupted download or a security issue.
|
|
827
|
+
Try running 'craftdesk install --no-lockfile' to re-resolve dependencies.
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
The lockfile contains SHA-256 hashes that ensure reproducible and secure installations across all team members.
|
|
831
|
+
|
|
832
|
+
### Install Directory
|
|
833
|
+
|
|
834
|
+
By default, crafts install to `.claude/` in your project:
|
|
835
|
+
```
|
|
836
|
+
.claude/
|
|
837
|
+
├── settings.json # Plugin configuration (auto-generated)
|
|
838
|
+
├── skills/
|
|
839
|
+
│ ├── ruby-on-rails/
|
|
840
|
+
│ └── postgres-expert/
|
|
841
|
+
├── agents/
|
|
842
|
+
│ └── code-reviewer/
|
|
843
|
+
├── commands/
|
|
844
|
+
│ └── deploy/
|
|
845
|
+
├── hooks/
|
|
846
|
+
│ └── pre-commit/
|
|
847
|
+
└── plugins/ # Flat plugin installation
|
|
848
|
+
├── company-rails-plugin/
|
|
849
|
+
│ ├── plugin.json
|
|
850
|
+
│ ├── PLUGIN.md
|
|
851
|
+
│ └── skills/...
|
|
852
|
+
└── my-skill-plugin/ # Wrapped skill
|
|
853
|
+
```
|
|
854
|
+
|
|
855
|
+
---
|
|
856
|
+
|
|
857
|
+
## Plugin System
|
|
858
|
+
|
|
859
|
+
**New in v0.3.0**: CraftDesk now supports a comprehensive plugin system for bundling multiple crafts with automatic dependency management.
|
|
860
|
+
|
|
861
|
+
### What are Plugins?
|
|
862
|
+
|
|
863
|
+
Plugins allow you to:
|
|
864
|
+
- **Bundle multiple crafts** (skills, agents, commands, hooks) together
|
|
865
|
+
- **Declare dependencies** that are automatically installed
|
|
866
|
+
- **Configure MCP servers** (Model Context Protocol) for external tools
|
|
867
|
+
- **Share configurations** and related files as a cohesive package
|
|
868
|
+
- **Wrap individual crafts** as plugins for better organization
|
|
869
|
+
|
|
870
|
+
### Installing Plugins
|
|
871
|
+
|
|
872
|
+
```bash
|
|
873
|
+
# Install a plugin from registry
|
|
874
|
+
craftdesk add company/rails-standards-plugin
|
|
875
|
+
|
|
876
|
+
# What happens automatically:
|
|
877
|
+
# 1. Plugin is installed to .claude/plugins/company-rails-standards-plugin/
|
|
878
|
+
# 2. Dependencies are resolved and auto-installed
|
|
879
|
+
# 3. Plugin is registered in .claude/settings.json
|
|
880
|
+
# 4. MCP server is configured (if provided)
|
|
881
|
+
# 5. Plugin tree is added to craftdesk.lock
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
**Example Output**:
|
|
885
|
+
```
|
|
886
|
+
Adding company/rails-standards-plugin...
|
|
887
|
+
Found company/rails-standards-plugin@2.1.0
|
|
888
|
+
Installing company/rails-standards-plugin...
|
|
889
|
+
Plugin detected - resolving dependencies...
|
|
890
|
+
Resolved 3 total dependencies
|
|
891
|
+
Installing plugin dependency: john/rspec-testing...
|
|
892
|
+
✓ Resolved john/rspec-testing@1.5.3
|
|
893
|
+
Installing plugin dependency: jane/postgres-toolkit...
|
|
894
|
+
✓ Resolved jane/postgres-toolkit@3.2.1
|
|
895
|
+
✓ Installed company/rails-standards-plugin@2.1.0
|
|
896
|
+
Craft added successfully!
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
### Plugin Structure
|
|
900
|
+
|
|
901
|
+
A plugin contains a `plugin.json` manifest:
|
|
902
|
+
|
|
903
|
+
```json
|
|
904
|
+
{
|
|
905
|
+
"name": "company-rails-plugin",
|
|
906
|
+
"version": "2.1.0",
|
|
907
|
+
"type": "plugin",
|
|
908
|
+
"description": "Rails development standards",
|
|
909
|
+
"author": "company",
|
|
910
|
+
"components": {
|
|
911
|
+
"skills": ["coding-standards", "rails-best-practices"],
|
|
912
|
+
"agents": ["standards-enforcer"],
|
|
913
|
+
"commands": ["check-standards"]
|
|
914
|
+
},
|
|
915
|
+
"dependencies": {
|
|
916
|
+
"john/rspec-testing": "^1.5.0",
|
|
917
|
+
"jane/postgres-toolkit": "^3.2.0"
|
|
918
|
+
},
|
|
919
|
+
"mcp": {
|
|
920
|
+
"type": "stdio",
|
|
921
|
+
"command": "/usr/bin/rails-standards-mcp",
|
|
922
|
+
"args": ["--config", ".claude/plugins/company-rails-plugin/config.json"]
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
### Automatic Dependency Resolution
|
|
928
|
+
|
|
929
|
+
When you install a plugin, **all dependencies are automatically installed**:
|
|
930
|
+
|
|
931
|
+
```bash
|
|
932
|
+
$ craftdesk add company/rails-plugin
|
|
933
|
+
|
|
934
|
+
# Installs dependency tree:
|
|
935
|
+
# company/rails-plugin (direct)
|
|
936
|
+
# ├── john/rspec-testing (dependency)
|
|
937
|
+
# └── jane/postgres-toolkit (dependency)
|
|
938
|
+
# └── jane/sql-helpers (nested dependency)
|
|
939
|
+
```
|
|
940
|
+
|
|
941
|
+
All dependencies are:
|
|
942
|
+
- ✅ Downloaded from their respective sources (registry/git)
|
|
943
|
+
- ✅ Installed to appropriate directories
|
|
944
|
+
- ✅ Verified with integrity checksums
|
|
945
|
+
- ✅ Marked as dependencies in lockfile
|
|
946
|
+
- ✅ Registered in `.claude/settings.json`
|
|
947
|
+
|
|
948
|
+
### Wrapping Individual Crafts
|
|
949
|
+
|
|
950
|
+
Convert any skill, agent, command, or hook into a plugin:
|
|
951
|
+
|
|
952
|
+
```bash
|
|
953
|
+
craftdesk add my-skill --as-plugin
|
|
954
|
+
```
|
|
955
|
+
|
|
956
|
+
**What happens**:
|
|
957
|
+
1. Original craft installed to `.claude/skills/my-skill/`
|
|
958
|
+
2. Plugin wrapper created at `.claude/plugins/my-skill-plugin/`
|
|
959
|
+
3. `plugin.json` and `PLUGIN.md` auto-generated
|
|
960
|
+
4. Craft files copied to plugin structure
|
|
961
|
+
5. Registered in settings as wrapped plugin
|
|
962
|
+
|
|
963
|
+
**Use cases**:
|
|
964
|
+
- Add MCP server to existing skill
|
|
965
|
+
- Bundle configuration with craft
|
|
966
|
+
- Prepare for publishing to marketplace
|
|
967
|
+
- Enable/disable craft from Claude Code UI
|
|
968
|
+
|
|
969
|
+
### Plugin Tree Visualization
|
|
970
|
+
|
|
971
|
+
View your plugin dependency tree:
|
|
972
|
+
|
|
973
|
+
```bash
|
|
974
|
+
$ craftdesk list
|
|
975
|
+
|
|
976
|
+
my-project@1.0.0
|
|
977
|
+
|
|
978
|
+
🔌 Plugins:
|
|
979
|
+
company/rails-standards@2.1.0
|
|
980
|
+
├── john/rspec-testing@1.5.3
|
|
981
|
+
└── jane/postgres-toolkit@3.2.1
|
|
982
|
+
my-skill-plugin@1.0.0
|
|
983
|
+
|
|
984
|
+
📚 Skills:
|
|
985
|
+
standalone-skill@1.0.0
|
|
986
|
+
|
|
987
|
+
Total: 5 crafts installed
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
### Removing Plugins with Dependencies
|
|
991
|
+
|
|
992
|
+
CraftDesk prevents accidental removal of required dependencies:
|
|
993
|
+
|
|
994
|
+
```bash
|
|
995
|
+
$ craftdesk remove john/rspec-testing
|
|
996
|
+
|
|
997
|
+
Warning: john/rspec-testing is required by:
|
|
998
|
+
- company/rails-standards@2.1.0
|
|
999
|
+
|
|
1000
|
+
Use --force to remove anyway
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
Force removal:
|
|
1004
|
+
```bash
|
|
1005
|
+
craftdesk remove john/rspec-testing --force
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### Settings Integration
|
|
1009
|
+
|
|
1010
|
+
Plugins are automatically registered in `.claude/settings.json`:
|
|
1011
|
+
|
|
1012
|
+
```json
|
|
1013
|
+
{
|
|
1014
|
+
"version": "1.0.0",
|
|
1015
|
+
"plugins": {
|
|
1016
|
+
"company-rails-plugin": {
|
|
1017
|
+
"name": "company-rails-plugin",
|
|
1018
|
+
"version": "2.1.0",
|
|
1019
|
+
"enabled": true,
|
|
1020
|
+
"installPath": "plugins/company-rails-plugin",
|
|
1021
|
+
"dependencies": ["john-rspec-testing", "jane-postgres-toolkit"],
|
|
1022
|
+
"mcp": {
|
|
1023
|
+
"type": "stdio",
|
|
1024
|
+
"command": "/usr/bin/rails-standards-mcp",
|
|
1025
|
+
"args": ["--config", ".claude/plugins/company-rails-plugin/config.json"]
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
**For complete details**, see [DEPENDENCY_MANAGEMENT.md](./DEPENDENCY_MANAGEMENT.md)
|
|
1033
|
+
|
|
1034
|
+
---
|
|
1035
|
+
|
|
1036
|
+
## Command Reference
|
|
1037
|
+
|
|
1038
|
+
### `craftdesk init [options]`
|
|
1039
|
+
|
|
1040
|
+
Initialize a new craftdesk.json file.
|
|
1041
|
+
|
|
1042
|
+
**Options:**
|
|
1043
|
+
- `-y, --yes` - Skip prompts and use defaults
|
|
1044
|
+
- `-n, --name <name>` - Project name (default: directory name)
|
|
1045
|
+
- `-v, --version <version>` - Project version (default: "1.0.0")
|
|
1046
|
+
- `-t, --type <type>` - Project type: skill, agent, command, hook, plugin, or collection (default: "skill")
|
|
1047
|
+
- `-d, --description <desc>` - Project description
|
|
1048
|
+
- `-a, --author <author>` - Author name
|
|
1049
|
+
- `-l, --license <license>` - License (default: "MIT")
|
|
1050
|
+
|
|
1051
|
+
**Examples:**
|
|
1052
|
+
```bash
|
|
1053
|
+
# Interactive initialization
|
|
1054
|
+
craftdesk init
|
|
1055
|
+
|
|
1056
|
+
# Quick init with defaults
|
|
1057
|
+
craftdesk init -y
|
|
1058
|
+
|
|
1059
|
+
# Specify options
|
|
1060
|
+
craftdesk init --name my-skill --type skill --author "Your Name"
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
---
|
|
1064
|
+
|
|
1065
|
+
### `craftdesk install [options]`
|
|
1066
|
+
|
|
1067
|
+
Install all dependencies from craftdesk.json.
|
|
1068
|
+
|
|
1069
|
+
**Options:**
|
|
1070
|
+
- `--no-lockfile` - Ignore craftdesk.lock and re-resolve dependencies
|
|
1071
|
+
- `--production` - Skip devDependencies
|
|
1072
|
+
|
|
1073
|
+
**Examples:**
|
|
1074
|
+
```bash
|
|
1075
|
+
# Install all dependencies
|
|
1076
|
+
craftdesk install
|
|
1077
|
+
|
|
1078
|
+
# Or use the alias
|
|
1079
|
+
craftdesk i
|
|
1080
|
+
|
|
1081
|
+
# Production install (skip dev dependencies)
|
|
1082
|
+
craftdesk install --production
|
|
1083
|
+
|
|
1084
|
+
# Force re-resolve (ignore lockfile)
|
|
1085
|
+
craftdesk install --no-lockfile
|
|
1086
|
+
```
|
|
1087
|
+
|
|
1088
|
+
**What it does:**
|
|
1089
|
+
1. Reads craftdesk.json
|
|
1090
|
+
2. Uses craftdesk.lock if present (ensures reproducibility)
|
|
1091
|
+
3. Resolves dependencies (registry + git sources)
|
|
1092
|
+
4. Installs to .claude/ directory
|
|
1093
|
+
5. Updates/creates craftdesk.lock
|
|
1094
|
+
|
|
1095
|
+
---
|
|
1096
|
+
|
|
1097
|
+
### `craftdesk add <craft> [options]`
|
|
1098
|
+
|
|
1099
|
+
Add a new dependency and install it immediately.
|
|
1100
|
+
|
|
1101
|
+
**Options:**
|
|
1102
|
+
- `-D, --save-dev` - Save as devDependency
|
|
1103
|
+
- `-O, --save-optional` - Save as optionalDependency
|
|
1104
|
+
- `-E, --save-exact` - Save exact version (no ^ or ~)
|
|
1105
|
+
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook, plugin, collection)
|
|
1106
|
+
|
|
1107
|
+
**Examples:**
|
|
1108
|
+
|
|
1109
|
+
```bash
|
|
1110
|
+
# GitHub web URLs (auto-converted)
|
|
1111
|
+
craftdesk add https://github.com/user/repo/blob/main/skill.md
|
|
1112
|
+
craftdesk add https://github.com/user/repo/tree/main/skills/auth
|
|
1113
|
+
|
|
1114
|
+
# With explicit type
|
|
1115
|
+
craftdesk add https://github.com/user/repo/blob/main/agent.md --type agent
|
|
1116
|
+
|
|
1117
|
+
# Git dependencies (manual format)
|
|
1118
|
+
craftdesk add git+https://github.com/user/repo.git
|
|
1119
|
+
craftdesk add git+https://github.com/user/repo.git#develop
|
|
1120
|
+
craftdesk add git+https://github.com/user/repo.git#v2.0.0
|
|
1121
|
+
|
|
1122
|
+
# Direct file reference
|
|
1123
|
+
craftdesk add git+https://github.com/user/repo.git#main#file:skill.md
|
|
1124
|
+
|
|
1125
|
+
# Subdirectory (monorepo)
|
|
1126
|
+
craftdesk add git+https://github.com/company/monorepo.git#main#path:skills/auth
|
|
1127
|
+
```
|
|
1128
|
+
|
|
1129
|
+
---
|
|
1130
|
+
|
|
1131
|
+
### `craftdesk remove <craft>`
|
|
1132
|
+
|
|
1133
|
+
Remove a dependency from craftdesk.json and the filesystem.
|
|
1134
|
+
|
|
1135
|
+
**Examples:**
|
|
1136
|
+
```bash
|
|
1137
|
+
craftdesk remove my-skill
|
|
1138
|
+
craftdesk remove my-agent
|
|
1139
|
+
```
|
|
1140
|
+
|
|
1141
|
+
---
|
|
1142
|
+
|
|
1143
|
+
### `craftdesk list [options]`
|
|
1144
|
+
|
|
1145
|
+
List installed crafts.
|
|
1146
|
+
|
|
1147
|
+
**Options:**
|
|
1148
|
+
- `--tree` - Show dependency tree
|
|
1149
|
+
- `--depth <n>` - Limit tree depth
|
|
1150
|
+
- `--json` - Output as JSON
|
|
1151
|
+
|
|
1152
|
+
**Examples:**
|
|
1153
|
+
```bash
|
|
1154
|
+
# Simple list
|
|
1155
|
+
craftdesk list
|
|
1156
|
+
|
|
1157
|
+
# Show dependency tree
|
|
1158
|
+
craftdesk list --tree
|
|
1159
|
+
|
|
1160
|
+
# Limit tree depth
|
|
1161
|
+
craftdesk list --tree --depth 2
|
|
1162
|
+
|
|
1163
|
+
# JSON output (for scripts)
|
|
1164
|
+
craftdesk list --json
|
|
1165
|
+
```
|
|
1166
|
+
|
|
1167
|
+
**Example output:**
|
|
1168
|
+
```
|
|
1169
|
+
my-project@1.0.0
|
|
1170
|
+
|
|
1171
|
+
Installed crafts:
|
|
1172
|
+
• my-skill@main (skill)
|
|
1173
|
+
• code-reviewer@v2.0.1 (agent)
|
|
1174
|
+
• postgres-expert@main (skill)
|
|
1175
|
+
|
|
1176
|
+
Total: 3 crafts installed
|
|
1177
|
+
```
|
|
1178
|
+
|
|
1179
|
+
---
|
|
1180
|
+
|
|
1181
|
+
### `craftdesk search <query> [options]`
|
|
1182
|
+
|
|
1183
|
+
Search for crafts in the registry.
|
|
1184
|
+
|
|
1185
|
+
**Options:**
|
|
1186
|
+
- `-t, --type <type>` - Filter by type (skill, agent, command, hook, plugin, collection)
|
|
1187
|
+
|
|
1188
|
+
**Examples:**
|
|
1189
|
+
```bash
|
|
1190
|
+
# Search for crafts
|
|
1191
|
+
craftdesk search kafka
|
|
1192
|
+
|
|
1193
|
+
# Search for skills only
|
|
1194
|
+
craftdesk search rails --type skill
|
|
1195
|
+
|
|
1196
|
+
# Search for plugins
|
|
1197
|
+
craftdesk search standards --type plugin
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
**Example output:**
|
|
1201
|
+
```
|
|
1202
|
+
Search results for "kafka":
|
|
1203
|
+
|
|
1204
|
+
john/kafka-processing@2.1.0 (skill)
|
|
1205
|
+
Expert knowledge for processing Kafka messages
|
|
1206
|
+
|
|
1207
|
+
jane/kafka-agent@1.5.3 (agent)
|
|
1208
|
+
Autonomous agent for Kafka stream management
|
|
1209
|
+
|
|
1210
|
+
Found 2 crafts
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
---
|
|
1214
|
+
|
|
1215
|
+
### `craftdesk info <craft>`
|
|
1216
|
+
|
|
1217
|
+
Display detailed information about a craft from the registry.
|
|
1218
|
+
|
|
1219
|
+
**Examples:**
|
|
1220
|
+
```bash
|
|
1221
|
+
# Get info about a craft
|
|
1222
|
+
craftdesk info john/rails-api
|
|
1223
|
+
|
|
1224
|
+
# Get info about a specific version
|
|
1225
|
+
craftdesk info john/rails-api@2.1.0
|
|
1226
|
+
```
|
|
1227
|
+
|
|
1228
|
+
**Example output:**
|
|
1229
|
+
```
|
|
1230
|
+
john/rails-api@2.1.0
|
|
1231
|
+
|
|
1232
|
+
Description: Rails API development best practices
|
|
1233
|
+
Type: skill
|
|
1234
|
+
Author: john
|
|
1235
|
+
License: MIT
|
|
1236
|
+
Downloads: 1,234
|
|
1237
|
+
|
|
1238
|
+
Versions:
|
|
1239
|
+
2.1.0 (latest)
|
|
1240
|
+
2.0.0
|
|
1241
|
+
1.5.0
|
|
1242
|
+
|
|
1243
|
+
Dependencies:
|
|
1244
|
+
jane/postgres-toolkit: ^1.0.0
|
|
1245
|
+
```
|
|
1246
|
+
|
|
1247
|
+
---
|
|
1248
|
+
|
|
1249
|
+
### `craftdesk outdated`
|
|
1250
|
+
|
|
1251
|
+
Check for outdated dependencies that have newer versions available.
|
|
1252
|
+
|
|
1253
|
+
**Examples:**
|
|
1254
|
+
```bash
|
|
1255
|
+
# Check all dependencies
|
|
1256
|
+
craftdesk outdated
|
|
1257
|
+
```
|
|
1258
|
+
|
|
1259
|
+
**Example output:**
|
|
1260
|
+
```
|
|
1261
|
+
Checking for outdated dependencies...
|
|
1262
|
+
|
|
1263
|
+
Outdated crafts:
|
|
1264
|
+
|
|
1265
|
+
john/rails-api
|
|
1266
|
+
Current: 2.0.0
|
|
1267
|
+
Latest: 2.1.0
|
|
1268
|
+
Type: skill
|
|
1269
|
+
|
|
1270
|
+
jane/postgres-toolkit
|
|
1271
|
+
Current: 1.2.0
|
|
1272
|
+
Latest: 1.5.0
|
|
1273
|
+
Type: skill
|
|
1274
|
+
|
|
1275
|
+
2 outdated crafts found
|
|
1276
|
+
Run 'craftdesk update' to update all, or 'craftdesk update <craft>' to update specific crafts.
|
|
1277
|
+
```
|
|
1278
|
+
|
|
1279
|
+
---
|
|
1280
|
+
|
|
1281
|
+
### `craftdesk update [craft]`
|
|
1282
|
+
|
|
1283
|
+
Update dependencies to their latest compatible versions.
|
|
1284
|
+
|
|
1285
|
+
**Examples:**
|
|
1286
|
+
```bash
|
|
1287
|
+
# Update all outdated dependencies
|
|
1288
|
+
craftdesk update
|
|
1289
|
+
|
|
1290
|
+
# Update a specific craft
|
|
1291
|
+
craftdesk update john/rails-api
|
|
1292
|
+
```
|
|
1293
|
+
|
|
1294
|
+
**What it does:**
|
|
1295
|
+
1. Checks for newer versions in the registry
|
|
1296
|
+
2. Downloads and installs updates
|
|
1297
|
+
3. Updates craftdesk.lock with new versions
|
|
1298
|
+
4. Verifies checksums for security
|
|
1299
|
+
|
|
1300
|
+
---
|
|
1301
|
+
|
|
1302
|
+
### `craftdesk publish [options]`
|
|
1303
|
+
|
|
1304
|
+
Publish a craft to the registry.
|
|
1305
|
+
|
|
1306
|
+
**Options:**
|
|
1307
|
+
- `--visibility <level>` - Set visibility: public, private, or organization (default: public)
|
|
1308
|
+
|
|
1309
|
+
**Examples:**
|
|
1310
|
+
```bash
|
|
1311
|
+
# Publish the current craft
|
|
1312
|
+
craftdesk publish
|
|
174
1313
|
|
|
175
|
-
|
|
1314
|
+
# Publish as private
|
|
1315
|
+
craftdesk publish --visibility private
|
|
176
1316
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
.claude/
|
|
180
|
-
├── skills/
|
|
181
|
-
│ ├── ruby-on-rails/
|
|
182
|
-
│ └── postgres-expert/
|
|
183
|
-
├── agents/
|
|
184
|
-
│ └── code-reviewer/
|
|
185
|
-
├── commands/
|
|
186
|
-
│ └── deploy/
|
|
187
|
-
└── hooks/
|
|
188
|
-
└── pre-commit/
|
|
1317
|
+
# Publish to organization only
|
|
1318
|
+
craftdesk publish --visibility organization
|
|
189
1319
|
```
|
|
190
1320
|
|
|
1321
|
+
**Prerequisites:**
|
|
1322
|
+
- Must be logged in (`craftdesk login`)
|
|
1323
|
+
- Must have a valid `craftdesk.json` in current directory
|
|
1324
|
+
- Craft files must exist (SKILL.md, AGENT.md, etc.)
|
|
1325
|
+
|
|
1326
|
+
**What it does:**
|
|
1327
|
+
1. Reads craftdesk.json for metadata
|
|
1328
|
+
2. Collects all craft files
|
|
1329
|
+
3. Creates a new version on the registry
|
|
1330
|
+
4. Publishes with specified visibility
|
|
1331
|
+
|
|
191
1332
|
---
|
|
192
1333
|
|
|
193
|
-
|
|
1334
|
+
### `craftdesk setup-multi-agent [options]`
|
|
194
1335
|
|
|
195
|
-
|
|
1336
|
+
Interactive wizard to configure multi-agent sync.
|
|
196
1337
|
|
|
197
|
-
|
|
1338
|
+
**Options:**
|
|
1339
|
+
- `--auto-sync` - Enable automatic sync on install/update
|
|
1340
|
+
- `--skip-sync` - Skip initial sync after setup
|
|
1341
|
+
|
|
1342
|
+
**Examples:**
|
|
1343
|
+
```bash
|
|
1344
|
+
# Interactive setup (recommended)
|
|
1345
|
+
craftdesk setup-multi-agent
|
|
1346
|
+
|
|
1347
|
+
# Setup with auto-sync enabled
|
|
1348
|
+
craftdesk setup-multi-agent --auto-sync
|
|
1349
|
+
|
|
1350
|
+
# Setup without initial sync
|
|
1351
|
+
craftdesk setup-multi-agent --skip-sync
|
|
1352
|
+
```
|
|
1353
|
+
|
|
1354
|
+
**What it does:**
|
|
1355
|
+
1. Detects AI coding assistants in your project
|
|
1356
|
+
2. Lets you choose which agents to sync to
|
|
1357
|
+
3. Updates `craftdesk.json` with multiAgent configuration
|
|
1358
|
+
4. Optionally performs initial sync of existing crafts
|
|
1359
|
+
|
|
1360
|
+
---
|
|
1361
|
+
|
|
1362
|
+
### `craftdesk detect-agents [options]`
|
|
1363
|
+
|
|
1364
|
+
Detect AI coding assistants installed in the project.
|
|
198
1365
|
|
|
199
1366
|
**Options:**
|
|
200
|
-
- `-
|
|
201
|
-
- `-
|
|
202
|
-
- `-v, --version <version>` - Project version (default: "1.0.0")
|
|
203
|
-
- `-t, --type <type>` - Project type: skill, agent, command, hook, or plugin (default: "skill")
|
|
204
|
-
- `-d, --description <desc>` - Project description
|
|
205
|
-
- `-a, --author <author>` - Author name
|
|
206
|
-
- `-l, --license <license>` - License (default: "MIT")
|
|
1367
|
+
- `-v, --verbose` - Show detailed detection information
|
|
1368
|
+
- `-f, --format <format>` - Output format: text or json (default: text)
|
|
207
1369
|
|
|
208
1370
|
**Examples:**
|
|
209
1371
|
```bash
|
|
210
|
-
#
|
|
211
|
-
craftdesk
|
|
1372
|
+
# Detect agents
|
|
1373
|
+
craftdesk detect-agents
|
|
212
1374
|
|
|
213
|
-
#
|
|
214
|
-
craftdesk
|
|
1375
|
+
# Verbose output
|
|
1376
|
+
craftdesk detect-agents --verbose
|
|
215
1377
|
|
|
216
|
-
#
|
|
217
|
-
craftdesk
|
|
1378
|
+
# JSON output for scripting
|
|
1379
|
+
craftdesk detect-agents --format json
|
|
1380
|
+
```
|
|
1381
|
+
|
|
1382
|
+
**Example output:**
|
|
1383
|
+
```
|
|
1384
|
+
🔍 AI Coding Assistant Detection
|
|
1385
|
+
|
|
1386
|
+
Detected Agents:
|
|
1387
|
+
✓ Claude Code
|
|
1388
|
+
Directory: .claude/skills
|
|
1389
|
+
Status: ✅ Enabled
|
|
1390
|
+
|
|
1391
|
+
○ Cursor
|
|
1392
|
+
Directory: .cursor/skills
|
|
1393
|
+
Status: ⚪ Available
|
|
1394
|
+
|
|
1395
|
+
Summary:
|
|
1396
|
+
Detected: 2 agent(s)
|
|
1397
|
+
Enabled: 1 agent(s)
|
|
1398
|
+
|
|
1399
|
+
💡 Tip:
|
|
1400
|
+
You have multiple agents but sync is only enabled for one.
|
|
1401
|
+
Run `craftdesk setup-multi-agent` to sync across all agents.
|
|
218
1402
|
```
|
|
219
1403
|
|
|
220
1404
|
---
|
|
221
1405
|
|
|
222
|
-
### `craftdesk
|
|
1406
|
+
### `craftdesk sync [options]`
|
|
223
1407
|
|
|
224
|
-
|
|
1408
|
+
Sync crafts to all configured AI agents.
|
|
225
1409
|
|
|
226
1410
|
**Options:**
|
|
227
|
-
-
|
|
228
|
-
-
|
|
1411
|
+
- `-c, --craft <name>` - Sync specific craft by name
|
|
1412
|
+
- `-f, --force` - Force sync even if checksums match
|
|
1413
|
+
- `--dry-run` - Show what would be synced without making changes
|
|
229
1414
|
|
|
230
1415
|
**Examples:**
|
|
231
1416
|
```bash
|
|
232
|
-
#
|
|
233
|
-
craftdesk
|
|
1417
|
+
# Sync all crafts
|
|
1418
|
+
craftdesk sync
|
|
234
1419
|
|
|
235
|
-
#
|
|
236
|
-
craftdesk
|
|
1420
|
+
# Sync specific craft
|
|
1421
|
+
craftdesk sync --craft ruby-expert
|
|
237
1422
|
|
|
238
|
-
#
|
|
239
|
-
craftdesk
|
|
1423
|
+
# Dry run (preview changes)
|
|
1424
|
+
craftdesk sync --dry-run
|
|
240
1425
|
|
|
241
|
-
# Force
|
|
242
|
-
craftdesk
|
|
1426
|
+
# Force sync
|
|
1427
|
+
craftdesk sync --force
|
|
243
1428
|
```
|
|
244
1429
|
|
|
245
1430
|
**What it does:**
|
|
246
|
-
1. Reads craftdesk.json
|
|
247
|
-
2.
|
|
248
|
-
3.
|
|
249
|
-
4.
|
|
250
|
-
|
|
1431
|
+
1. Reads multiAgent configuration from craftdesk.json
|
|
1432
|
+
2. Copies crafts from canonical location to all targets
|
|
1433
|
+
3. Calculates and stores SHA-256 checksums
|
|
1434
|
+
4. Reports sync status for each location
|
|
1435
|
+
|
|
1436
|
+
**Example output:**
|
|
1437
|
+
```
|
|
1438
|
+
✅ Synced 5 craft(s)
|
|
1439
|
+
|
|
1440
|
+
✓ ruby-expert: 3 location(s)
|
|
1441
|
+
✓ python-expert: 3 location(s)
|
|
1442
|
+
✓ postgres-expert: 3 location(s)
|
|
1443
|
+
✓ docker-expert: 3 location(s)
|
|
1444
|
+
✓ git-expert: 3 location(s)
|
|
1445
|
+
|
|
1446
|
+
Summary:
|
|
1447
|
+
Total synced: 15 location(s)
|
|
1448
|
+
```
|
|
251
1449
|
|
|
252
1450
|
---
|
|
253
1451
|
|
|
254
|
-
### `craftdesk
|
|
1452
|
+
### `craftdesk verify [options]`
|
|
255
1453
|
|
|
256
|
-
|
|
1454
|
+
Verify sync status of crafts across AI agents using checksum validation.
|
|
257
1455
|
|
|
258
1456
|
**Options:**
|
|
259
|
-
- `-
|
|
260
|
-
- `-
|
|
261
|
-
- `-
|
|
262
|
-
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook, plugin)
|
|
1457
|
+
- `-c, --craft <name>` - Verify specific craft by name
|
|
1458
|
+
- `-v, --verbose` - Show detailed checksum information
|
|
1459
|
+
- `-f, --format <format>` - Output format: text or json (default: text)
|
|
263
1460
|
|
|
264
1461
|
**Examples:**
|
|
265
|
-
|
|
266
1462
|
```bash
|
|
267
|
-
#
|
|
268
|
-
craftdesk
|
|
269
|
-
craftdesk add https://github.com/user/repo/tree/main/skills/auth
|
|
1463
|
+
# Verify all crafts
|
|
1464
|
+
craftdesk verify
|
|
270
1465
|
|
|
271
|
-
#
|
|
272
|
-
craftdesk
|
|
1466
|
+
# Verify specific craft
|
|
1467
|
+
craftdesk verify --craft ruby-expert
|
|
273
1468
|
|
|
274
|
-
#
|
|
275
|
-
craftdesk
|
|
276
|
-
craftdesk add git+https://github.com/user/repo.git#develop
|
|
277
|
-
craftdesk add git+https://github.com/user/repo.git#v2.0.0
|
|
1469
|
+
# Verbose output with checksums
|
|
1470
|
+
craftdesk verify --verbose
|
|
278
1471
|
|
|
279
|
-
#
|
|
280
|
-
craftdesk
|
|
1472
|
+
# JSON output
|
|
1473
|
+
craftdesk verify --format json
|
|
1474
|
+
```
|
|
281
1475
|
|
|
282
|
-
|
|
283
|
-
|
|
1476
|
+
**What it does:**
|
|
1477
|
+
1. Reads multiAgent configuration
|
|
1478
|
+
2. Calculates SHA-256 checksums for all copies
|
|
1479
|
+
3. Compares checksums to detect drift
|
|
1480
|
+
4. Reports which copies are in sync vs. out of sync
|
|
1481
|
+
|
|
1482
|
+
**Example output (in sync):**
|
|
1483
|
+
```
|
|
1484
|
+
🔍 Sync Status: All Crafts
|
|
1485
|
+
|
|
1486
|
+
Summary:
|
|
1487
|
+
Total crafts: 5
|
|
1488
|
+
In sync: 5
|
|
1489
|
+
Out of sync: 0
|
|
1490
|
+
|
|
1491
|
+
✅ All 5 craft(s) are in sync!
|
|
1492
|
+
```
|
|
1493
|
+
|
|
1494
|
+
**Example output (drift detected):**
|
|
1495
|
+
```
|
|
1496
|
+
🔍 Sync Status: All Crafts
|
|
1497
|
+
|
|
1498
|
+
Summary:
|
|
1499
|
+
Total crafts: 5
|
|
1500
|
+
In sync: 4
|
|
1501
|
+
Out of sync: 1
|
|
1502
|
+
|
|
1503
|
+
❌ Out of Sync (1):
|
|
1504
|
+
|
|
1505
|
+
ruby-expert
|
|
1506
|
+
⚠️ .cursor/skills/ruby-expert (modified)
|
|
1507
|
+
|
|
1508
|
+
💡 Run `craftdesk sync` to fix all issues
|
|
284
1509
|
```
|
|
285
1510
|
|
|
286
1511
|
---
|
|
287
1512
|
|
|
288
|
-
|
|
1513
|
+
## Authentication
|
|
289
1514
|
|
|
290
|
-
|
|
1515
|
+
CraftDesk supports authenticated access to private registries.
|
|
1516
|
+
|
|
1517
|
+
### `craftdesk login [options]`
|
|
1518
|
+
|
|
1519
|
+
Authenticate with a registry using an API token.
|
|
1520
|
+
|
|
1521
|
+
**Options:**
|
|
1522
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
291
1523
|
|
|
292
1524
|
**Examples:**
|
|
293
1525
|
```bash
|
|
294
|
-
|
|
295
|
-
craftdesk
|
|
1526
|
+
# Login to default registry
|
|
1527
|
+
craftdesk login
|
|
1528
|
+
|
|
1529
|
+
# Login to a specific registry
|
|
1530
|
+
craftdesk login --registry https://private.company.com
|
|
296
1531
|
```
|
|
297
1532
|
|
|
1533
|
+
**How it works:**
|
|
1534
|
+
1. Prompts for your API token
|
|
1535
|
+
2. Verifies the token with the registry
|
|
1536
|
+
3. Stores credentials in `~/.craftdesk/config.json`
|
|
1537
|
+
4. Token is used for subsequent registry operations
|
|
1538
|
+
|
|
1539
|
+
**Getting an API token:**
|
|
1540
|
+
- Log in to your CraftDesk registry web interface
|
|
1541
|
+
- Navigate to Settings → API Tokens
|
|
1542
|
+
- Generate a new token
|
|
1543
|
+
|
|
298
1544
|
---
|
|
299
1545
|
|
|
300
|
-
### `craftdesk
|
|
1546
|
+
### `craftdesk logout [options]`
|
|
301
1547
|
|
|
302
|
-
|
|
1548
|
+
Remove stored authentication credentials.
|
|
303
1549
|
|
|
304
1550
|
**Options:**
|
|
305
|
-
-
|
|
306
|
-
- `--depth <n>` - Limit tree depth
|
|
307
|
-
- `--json` - Output as JSON
|
|
1551
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
308
1552
|
|
|
309
1553
|
**Examples:**
|
|
310
1554
|
```bash
|
|
311
|
-
#
|
|
312
|
-
craftdesk
|
|
1555
|
+
# Logout from default registry
|
|
1556
|
+
craftdesk logout
|
|
313
1557
|
|
|
314
|
-
#
|
|
315
|
-
craftdesk
|
|
1558
|
+
# Logout from specific registry
|
|
1559
|
+
craftdesk logout --registry https://private.company.com
|
|
1560
|
+
```
|
|
316
1561
|
|
|
317
|
-
|
|
318
|
-
craftdesk list --tree --depth 2
|
|
1562
|
+
---
|
|
319
1563
|
|
|
320
|
-
|
|
321
|
-
|
|
1564
|
+
### `craftdesk whoami [options]`
|
|
1565
|
+
|
|
1566
|
+
Display the currently logged-in user.
|
|
1567
|
+
|
|
1568
|
+
**Options:**
|
|
1569
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
1570
|
+
|
|
1571
|
+
**Examples:**
|
|
1572
|
+
```bash
|
|
1573
|
+
# Check current user
|
|
1574
|
+
craftdesk whoami
|
|
1575
|
+
|
|
1576
|
+
# Check user for specific registry
|
|
1577
|
+
craftdesk whoami --registry https://private.company.com
|
|
322
1578
|
```
|
|
323
1579
|
|
|
324
1580
|
**Example output:**
|
|
325
1581
|
```
|
|
326
|
-
|
|
1582
|
+
Logged in to https://craftdesk.ai as john (john@example.com)
|
|
1583
|
+
Organization: acme-corp
|
|
1584
|
+
```
|
|
327
1585
|
|
|
328
|
-
|
|
329
|
-
• my-skill@main (skill)
|
|
330
|
-
• code-reviewer@v2.0.1 (agent)
|
|
331
|
-
• postgres-expert@main (skill)
|
|
1586
|
+
---
|
|
332
1587
|
|
|
333
|
-
|
|
1588
|
+
### Environment Variable Authentication
|
|
1589
|
+
|
|
1590
|
+
For CI/CD environments, you can use environment variables instead of `craftdesk login`:
|
|
1591
|
+
|
|
1592
|
+
```bash
|
|
1593
|
+
# For a registry named "company-private" in craftdesk.json
|
|
1594
|
+
export CRAFTDESK_AUTH_COMPANY_PRIVATE=your_api_token_here
|
|
1595
|
+
|
|
1596
|
+
# For the default registry
|
|
1597
|
+
export CRAFTDESK_AUTH_LOCALHOST_3000=your_api_token_here
|
|
1598
|
+
|
|
1599
|
+
# The variable name is derived from the registry URL:
|
|
1600
|
+
# https://example.com -> CRAFTDESK_AUTH_EXAMPLE_COM
|
|
334
1601
|
```
|
|
335
1602
|
|
|
1603
|
+
Environment variables take precedence over stored credentials.
|
|
1604
|
+
|
|
336
1605
|
---
|
|
337
1606
|
|
|
338
1607
|
### Global Options
|
|
@@ -354,9 +1623,75 @@ craftdesk init --help
|
|
|
354
1623
|
|
|
355
1624
|
## Dependency Sources
|
|
356
1625
|
|
|
357
|
-
CraftDesk
|
|
1626
|
+
CraftDesk supports both registry and git dependencies.
|
|
1627
|
+
|
|
1628
|
+
### 1. Registry Dependencies (CraftDesk Web API)
|
|
1629
|
+
|
|
1630
|
+
Install crafts from the CraftDesk registry using `author/name` format:
|
|
1631
|
+
|
|
1632
|
+
```bash
|
|
1633
|
+
# Search for crafts
|
|
1634
|
+
craftdesk search kafka
|
|
1635
|
+
|
|
1636
|
+
# Get information about a craft
|
|
1637
|
+
craftdesk info john/rails-api
|
|
358
1638
|
|
|
359
|
-
|
|
1639
|
+
# Add from registry
|
|
1640
|
+
craftdesk add john/rails-api
|
|
1641
|
+
craftdesk add john/rails-api@^2.1.0
|
|
1642
|
+
|
|
1643
|
+
# Add with specific version
|
|
1644
|
+
craftdesk add jane/postgres-expert@1.2.0
|
|
1645
|
+
```
|
|
1646
|
+
|
|
1647
|
+
**Registry format in craftdesk.json:**
|
|
1648
|
+
|
|
1649
|
+
```json
|
|
1650
|
+
{
|
|
1651
|
+
"dependencies": {
|
|
1652
|
+
"john/rails-api": "^2.1.0",
|
|
1653
|
+
"jane/kafka-processing": "~1.5.2",
|
|
1654
|
+
"team/postgres-admin": "latest"
|
|
1655
|
+
},
|
|
1656
|
+
"registries": {
|
|
1657
|
+
"default": {
|
|
1658
|
+
"url": "http://localhost:3000"
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
```
|
|
1663
|
+
|
|
1664
|
+
**Important:** You must configure your registry URL in `craftdesk.json` to use registry-based crafts. Git-based dependencies (GitHub URLs) work without any registry configuration.
|
|
1665
|
+
|
|
1666
|
+
**Private Registry Authentication:**
|
|
1667
|
+
|
|
1668
|
+
For private registries, set authentication tokens via environment variables:
|
|
1669
|
+
|
|
1670
|
+
```bash
|
|
1671
|
+
# For a registry named "company-private" in craftdesk.json
|
|
1672
|
+
export CRAFTDESK_AUTH_COMPANY_PRIVATE=your_token_here
|
|
1673
|
+
|
|
1674
|
+
# For default registry
|
|
1675
|
+
export CRAFTDESK_AUTH_DEFAULT=your_token_here
|
|
1676
|
+
```
|
|
1677
|
+
|
|
1678
|
+
Example `craftdesk.json` with private registry:
|
|
1679
|
+
|
|
1680
|
+
```json
|
|
1681
|
+
{
|
|
1682
|
+
"registries": {
|
|
1683
|
+
"default": {
|
|
1684
|
+
"url": "https://your-registry.com"
|
|
1685
|
+
},
|
|
1686
|
+
"company-private": {
|
|
1687
|
+
"url": "https://private.company.com",
|
|
1688
|
+
"scope": "@company"
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
```
|
|
1693
|
+
|
|
1694
|
+
### 2. GitHub URLs (Easiest for Git)
|
|
360
1695
|
|
|
361
1696
|
Simply paste any GitHub URL - it auto-converts to the correct format:
|
|
362
1697
|
|
|
@@ -371,7 +1706,7 @@ craftdesk add https://github.com/user/repo/blob/main/agent.md
|
|
|
371
1706
|
craftdesk add https://github.com/user/repo
|
|
372
1707
|
```
|
|
373
1708
|
|
|
374
|
-
###
|
|
1709
|
+
### 3. Git Dependencies
|
|
375
1710
|
|
|
376
1711
|
From git repositories:
|
|
377
1712
|
|
|
@@ -402,26 +1737,60 @@ From git repositories:
|
|
|
402
1737
|
- `path` - Subdirectory within repo (for monorepos)
|
|
403
1738
|
- `file` - Direct file path (for single-file crafts)
|
|
404
1739
|
|
|
405
|
-
|
|
1740
|
+
---
|
|
406
1741
|
|
|
407
|
-
|
|
1742
|
+
## Monorepo Support
|
|
408
1743
|
|
|
409
|
-
|
|
1744
|
+
CraftDesk has **full support for monorepo workflows**, allowing you to install crafts from subdirectories within a repository. This is perfect for teams maintaining multiple related crafts in one repository.
|
|
410
1745
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
1746
|
+
### Quick Start: Auto-Converting GitHub URLs
|
|
1747
|
+
|
|
1748
|
+
The easiest way to install from monorepos is to **paste GitHub web URLs directly**:
|
|
1749
|
+
|
|
1750
|
+
```bash
|
|
1751
|
+
# Subdirectory from monorepo - just paste the GitHub URL!
|
|
1752
|
+
craftdesk add https://github.com/company/monorepo/tree/main/skills/auth
|
|
1753
|
+
|
|
1754
|
+
# Single file from monorepo
|
|
1755
|
+
craftdesk add https://github.com/company/monorepo/blob/main/skills/auth/SKILL.md
|
|
1756
|
+
|
|
1757
|
+
# Works with any branch or tag
|
|
1758
|
+
craftdesk add https://github.com/company/monorepo/tree/v2.0.0/packages/deployer
|
|
418
1759
|
```
|
|
419
1760
|
|
|
420
|
-
|
|
1761
|
+
CraftDesk automatically converts these to the correct git syntax and extracts only the specified subdirectory or file.
|
|
421
1762
|
|
|
422
|
-
|
|
1763
|
+
### Git URL Syntax
|
|
1764
|
+
|
|
1765
|
+
For more control, use explicit git URL syntax with path or file specifiers:
|
|
1766
|
+
|
|
1767
|
+
```bash
|
|
1768
|
+
# Subdirectory with branch
|
|
1769
|
+
craftdesk add git+https://github.com/company/monorepo.git#main#path:skills/auth
|
|
423
1770
|
|
|
424
|
-
|
|
1771
|
+
# Subdirectory with tag
|
|
1772
|
+
craftdesk add git+https://github.com/company/monorepo.git#v2.0.0#path:packages/deployer
|
|
1773
|
+
|
|
1774
|
+
# Subdirectory with commit hash
|
|
1775
|
+
craftdesk add git+https://github.com/company/monorepo.git#abc123def#path:skills/auth
|
|
1776
|
+
|
|
1777
|
+
# Single file with branch
|
|
1778
|
+
craftdesk add git+https://github.com/company/monorepo.git#main#file:skills/auth/SKILL.md
|
|
1779
|
+
|
|
1780
|
+
# Just path (uses default branch)
|
|
1781
|
+
craftdesk add git+https://github.com/company/monorepo.git#path:skills/auth
|
|
1782
|
+
```
|
|
1783
|
+
|
|
1784
|
+
**Syntax breakdown:**
|
|
1785
|
+
- `#main` - Branch name
|
|
1786
|
+
- `#v2.0.0` - Git tag
|
|
1787
|
+
- `#abc123def` - Commit hash (full 40-char)
|
|
1788
|
+
- `#path:skills/auth` - Subdirectory to extract
|
|
1789
|
+
- `#file:skill.md` - Single file to extract
|
|
1790
|
+
|
|
1791
|
+
### Using in craftdesk.json
|
|
1792
|
+
|
|
1793
|
+
Multiple crafts from the same monorepo:
|
|
425
1794
|
|
|
426
1795
|
```json
|
|
427
1796
|
{
|
|
@@ -436,41 +1805,90 @@ Install multiple crafts from the same git repository using subdirectory paths:
|
|
|
436
1805
|
"tag": "v3.2.0",
|
|
437
1806
|
"path": "agents/processor"
|
|
438
1807
|
},
|
|
439
|
-
"
|
|
1808
|
+
"deploy-script": {
|
|
440
1809
|
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
441
1810
|
"tag": "v3.2.0",
|
|
442
|
-
"
|
|
1811
|
+
"file": "scripts/deploy.md"
|
|
443
1812
|
}
|
|
444
1813
|
}
|
|
445
1814
|
}
|
|
446
1815
|
```
|
|
447
1816
|
|
|
448
|
-
**
|
|
449
|
-
-
|
|
450
|
-
-
|
|
451
|
-
-
|
|
452
|
-
-
|
|
1817
|
+
**Each craft can:**
|
|
1818
|
+
- Use different subdirectories (`path`)
|
|
1819
|
+
- Reference single files (`file`)
|
|
1820
|
+
- Use the same or different tags/branches
|
|
1821
|
+
- Be versioned independently or together
|
|
1822
|
+
|
|
1823
|
+
### Benefits
|
|
1824
|
+
|
|
1825
|
+
✅ **Single repository** for multiple related crafts
|
|
1826
|
+
✅ **Version together** using git tags (or independently with branches)
|
|
1827
|
+
✅ **Efficient cloning** - repository is cloned once and reused
|
|
1828
|
+
✅ **Clear organization** - keep related crafts together
|
|
1829
|
+
✅ **Atomic updates** - update all crafts by changing the tag
|
|
1830
|
+
✅ **Works with private repos** - standard git authentication
|
|
1831
|
+
|
|
1832
|
+
### Monorepo Structure Example
|
|
453
1833
|
|
|
454
|
-
**Monorepo structure example:**
|
|
455
1834
|
```
|
|
456
1835
|
ai-crafts-monorepo/
|
|
457
1836
|
├── skills/
|
|
458
1837
|
│ ├── auth/
|
|
459
1838
|
│ │ ├── craftdesk.json
|
|
460
1839
|
│ │ └── SKILL.md
|
|
1840
|
+
│ ├── database/
|
|
1841
|
+
│ │ ├── craftdesk.json
|
|
1842
|
+
│ │ └── SKILL.md
|
|
461
1843
|
│ └── reporting/
|
|
462
1844
|
│ ├── craftdesk.json
|
|
463
1845
|
│ └── SKILL.md
|
|
464
1846
|
├── agents/
|
|
465
|
-
│
|
|
1847
|
+
│ ├── code-reviewer/
|
|
1848
|
+
│ │ ├── craftdesk.json
|
|
1849
|
+
│ │ └── AGENT.md
|
|
1850
|
+
│ └── test-runner/
|
|
466
1851
|
│ ├── craftdesk.json
|
|
467
1852
|
│ └── AGENT.md
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
1853
|
+
├── commands/
|
|
1854
|
+
│ └── deploy/
|
|
1855
|
+
│ ├── craftdesk.json
|
|
1856
|
+
│ └── COMMAND.md
|
|
1857
|
+
└── scripts/
|
|
1858
|
+
├── setup.md
|
|
1859
|
+
└── deploy.md
|
|
472
1860
|
```
|
|
473
1861
|
|
|
1862
|
+
### Lockfile Tracking
|
|
1863
|
+
|
|
1864
|
+
CraftDesk lockfile tracks the exact subdirectory and commit:
|
|
1865
|
+
|
|
1866
|
+
```json
|
|
1867
|
+
{
|
|
1868
|
+
"crafts": {
|
|
1869
|
+
"auth-handler": {
|
|
1870
|
+
"git": "https://github.com/company/monorepo.git",
|
|
1871
|
+
"tag": "v3.2.0",
|
|
1872
|
+
"commit": "abc123def456...",
|
|
1873
|
+
"path": "skills/auth",
|
|
1874
|
+
"type": "skill",
|
|
1875
|
+
"version": "3.2.0"
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
}
|
|
1879
|
+
```
|
|
1880
|
+
|
|
1881
|
+
This ensures **reproducible installations** - the exact subdirectory from the exact commit is always installed.
|
|
1882
|
+
|
|
1883
|
+
### Real-World Example
|
|
1884
|
+
|
|
1885
|
+
```bash
|
|
1886
|
+
# Install from technicalpickles' monorepo
|
|
1887
|
+
craftdesk add https://github.com/technicalpickles/pickled-claude-plugins/tree/main/plugins/working-in-monorepos/skills/working-in-monorepos
|
|
1888
|
+
```
|
|
1889
|
+
|
|
1890
|
+
This installs only the `working-in-monorepos` skill from the deeply nested monorepo structure.
|
|
1891
|
+
|
|
474
1892
|
---
|
|
475
1893
|
|
|
476
1894
|
## craftdesk.json Reference
|
|
@@ -528,7 +1946,7 @@ Complete specification of the craftdesk.json format:
|
|
|
528
1946
|
|-------|------|----------|-------------|
|
|
529
1947
|
| `name` | string | Yes | Craft name (lowercase, no spaces) |
|
|
530
1948
|
| `version` | string | Yes | Semantic version (e.g., "1.0.0") |
|
|
531
|
-
| `type` | string | No | Craft type: skill, agent, command, hook, plugin |
|
|
1949
|
+
| `type` | string | No | Craft type: skill, agent, command, hook, plugin, collection |
|
|
532
1950
|
| `description` | string | No | Short description |
|
|
533
1951
|
| `author` | string | No | Author name and email |
|
|
534
1952
|
| `license` | string | No | License identifier (e.g., "MIT") |
|
|
@@ -740,11 +2158,46 @@ npm test
|
|
|
740
2158
|
|
|
741
2159
|
### Publishing
|
|
742
2160
|
|
|
2161
|
+
CraftDesk uses automated NPM publishing via GitHub Actions with provenance attestation.
|
|
2162
|
+
|
|
2163
|
+
**Quick release:**
|
|
2164
|
+
```bash
|
|
2165
|
+
./scripts/release.sh patch # 0.3.0 → 0.3.1
|
|
2166
|
+
./scripts/release.sh minor # 0.3.0 → 0.4.0
|
|
2167
|
+
./scripts/release.sh major # 0.3.0 → 1.0.0
|
|
2168
|
+
```
|
|
2169
|
+
|
|
2170
|
+
The script will:
|
|
2171
|
+
1. Bump version in package.json
|
|
2172
|
+
2. Prompt you to update CHANGELOG.md
|
|
2173
|
+
3. Commit and push changes
|
|
2174
|
+
4. Create GitHub release
|
|
2175
|
+
5. GitHub Actions automatically publishes to NPM with provenance
|
|
2176
|
+
|
|
2177
|
+
**Manual process:**
|
|
743
2178
|
```bash
|
|
744
2179
|
npm version patch
|
|
745
|
-
|
|
2180
|
+
git add package.json CHANGELOG.md
|
|
2181
|
+
git commit -m "Bump to 0.3.1"
|
|
2182
|
+
git push
|
|
2183
|
+
gh release create v0.3.1 --title "v0.3.1" --generate-notes
|
|
746
2184
|
```
|
|
747
2185
|
|
|
2186
|
+
See [NPM_PUBLISHING_GUIDE.md](./NPM_PUBLISHING_GUIDE.md) for complete setup instructions.
|
|
2187
|
+
|
|
2188
|
+
---
|
|
2189
|
+
|
|
2190
|
+
## Documentation
|
|
2191
|
+
|
|
2192
|
+
### Core Documentation
|
|
2193
|
+
- **[README.md](./README.md)** - This file, general overview and quick start
|
|
2194
|
+
- **[DEPENDENCY_MANAGEMENT.md](./DEPENDENCY_MANAGEMENT.md)** - Complete guide to dependency management
|
|
2195
|
+
- **[PLUGIN_IMPLEMENTATION_COMPLETE.md](./PLUGIN_IMPLEMENTATION_COMPLETE.md)** - Plugin system implementation details
|
|
2196
|
+
|
|
2197
|
+
### Additional Resources
|
|
2198
|
+
- **[Package.json](./package.json)** - Project metadata and scripts
|
|
2199
|
+
- **[TypeScript Source](./src/)** - Full source code
|
|
2200
|
+
|
|
748
2201
|
---
|
|
749
2202
|
|
|
750
2203
|
## License
|
|
@@ -757,22 +2210,46 @@ MIT
|
|
|
757
2210
|
|
|
758
2211
|
- **Repository**: [https://github.com/mensfeld/craftdesk](https://github.com/mensfeld/craftdesk)
|
|
759
2212
|
- **Issues**: [https://github.com/mensfeld/craftdesk/issues](https://github.com/mensfeld/craftdesk/issues)
|
|
760
|
-
- **Registry
|
|
2213
|
+
- **Registry**: Self-hosted registry server available at [CraftDesk Web](../web)
|
|
761
2214
|
|
|
762
2215
|
---
|
|
763
2216
|
|
|
764
2217
|
## Roadmap
|
|
765
2218
|
|
|
2219
|
+
### Completed (v0.3.0)
|
|
766
2220
|
- ✅ Git dependency support
|
|
767
2221
|
- ✅ GitHub URL auto-conversion
|
|
768
2222
|
- ✅ Direct file references
|
|
769
2223
|
- ✅ Monorepo support
|
|
770
2224
|
- ✅ Lockfile-based version control
|
|
771
|
-
-
|
|
772
|
-
-
|
|
773
|
-
-
|
|
774
|
-
-
|
|
2225
|
+
- ✅ Self-hosted registry server support
|
|
2226
|
+
- ✅ ZIP archive extraction for registry crafts
|
|
2227
|
+
- ✅ **Plugin system** with dependency management
|
|
2228
|
+
- ✅ **Auto-install plugin dependencies** (recursive)
|
|
2229
|
+
- ✅ **Settings integration** (.claude/settings.json)
|
|
2230
|
+
- ✅ **MCP server configuration** via plugins
|
|
2231
|
+
- ✅ **Craft wrapping** (--as-plugin flag)
|
|
2232
|
+
- ✅ **Plugin tree visualization**
|
|
2233
|
+
- ✅ **Dependency removal protection**
|
|
2234
|
+
- ✅ SHA-256 checksum verification (MITM protection)
|
|
2235
|
+
- ✅ Registry search and info commands
|
|
2236
|
+
- ✅ `craftdesk publish` command
|
|
2237
|
+
- ✅ `craftdesk outdated` command
|
|
2238
|
+
- ✅ `craftdesk update` command
|
|
2239
|
+
- ✅ **Authentication system** (login/logout/whoami)
|
|
2240
|
+
- ✅ **Private registry authentication** (token-based)
|
|
2241
|
+
- ✅ **Environment variable auth** (CI/CD support)
|
|
2242
|
+
- ✅ Semantic versioning for registry packages
|
|
2243
|
+
|
|
2244
|
+
### Planned
|
|
2245
|
+
- 🔲 Plugin marketplace/directory
|
|
2246
|
+
- 🔲 `craftdesk validate <plugin>` command
|
|
2247
|
+
- 🔲 Multiple dependency versions support
|
|
2248
|
+
- 🔲 Peer dependency warnings
|
|
2249
|
+
- 🔲 Persistent download cache
|
|
2250
|
+
- 🔲 Offline installation mode
|
|
2251
|
+
- 🔲 Interactive dependency conflict resolution
|
|
775
2252
|
|
|
776
2253
|
---
|
|
777
2254
|
|
|
778
|
-
Made for the AI development community
|
|
2255
|
+
Made for the AI development community
|