craftdesk 0.3.0 → 0.4.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 +57 -0
- package/README.md +943 -46
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +302 -6
- 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/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 +72 -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 +198 -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/update.d.ts +8 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +369 -0
- package/dist/commands/update.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 +34 -3
- package/dist/index.js.map +1 -1
- 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 +189 -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 +29 -10
- package/dist/services/git-resolver.js.map +1 -1
- package/dist/services/installer.d.ts +51 -1
- package/dist/services/installer.d.ts.map +1 -1
- package/dist/services/installer.js +245 -14
- package/dist/services/installer.js.map +1 -1
- 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 +182 -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 +63 -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/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,16 @@ 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
|
|
17
20
|
- **Lock versions** for reproducible environments across teams
|
|
18
|
-
- **Manage dependencies** with automatic
|
|
21
|
+
- **Manage dependencies** with automatic recursive installation
|
|
19
22
|
- **Support monorepos** with subdirectory extraction
|
|
20
23
|
- **Auto-convert GitHub URLs** - paste any GitHub URL (tree/blob)
|
|
21
24
|
- **Direct file references** - install single files from repositories
|
|
25
|
+
- **Settings integration** - Automatic registration in `.claude/settings.json`
|
|
26
|
+
- **MCP server support** - Configure Model Context Protocol servers via plugins
|
|
22
27
|
|
|
23
28
|
Think of it as:
|
|
24
29
|
- **npm** for Node.js → **CraftDesk** for AI capabilities
|
|
@@ -40,7 +45,7 @@ npm install -g craftdesk
|
|
|
40
45
|
Verify installation:
|
|
41
46
|
```bash
|
|
42
47
|
craftdesk --version
|
|
43
|
-
# 0.
|
|
48
|
+
# 0.3.0
|
|
44
49
|
```
|
|
45
50
|
|
|
46
51
|
**Requirements:** Node.js >= 18.0.0, Git, npm or yarn
|
|
@@ -111,7 +116,24 @@ Total: 2 crafts installed
|
|
|
111
116
|
- [What is CraftDesk?](#what-is-craftdesk)
|
|
112
117
|
- [Quick Start](#quick-start)
|
|
113
118
|
- [Core Concepts](#core-concepts)
|
|
119
|
+
- [Crafts](#crafts)
|
|
120
|
+
- [Collections](#collections)
|
|
121
|
+
- [Plugin System](#plugin-system)
|
|
114
122
|
- [Command Reference](#command-reference)
|
|
123
|
+
- [init](#craftdesk-init-options)
|
|
124
|
+
- [install](#craftdesk-install-options)
|
|
125
|
+
- [add](#craftdesk-add-craft-options)
|
|
126
|
+
- [remove](#craftdesk-remove-craft)
|
|
127
|
+
- [list](#craftdesk-list-options)
|
|
128
|
+
- [search](#craftdesk-search-query-options)
|
|
129
|
+
- [info](#craftdesk-info-craft)
|
|
130
|
+
- [outdated](#craftdesk-outdated)
|
|
131
|
+
- [update](#craftdesk-update-craft)
|
|
132
|
+
- [publish](#craftdesk-publish-options)
|
|
133
|
+
- [Authentication](#authentication)
|
|
134
|
+
- [login](#craftdesk-login-options)
|
|
135
|
+
- [logout](#craftdesk-logout-options)
|
|
136
|
+
- [whoami](#craftdesk-whoami-options)
|
|
115
137
|
- [Dependency Sources](#dependency-sources)
|
|
116
138
|
- [Monorepo Support](#monorepo-support)
|
|
117
139
|
- [craftdesk.json Reference](#craftdeskjson-reference)
|
|
@@ -119,6 +141,7 @@ Total: 2 crafts installed
|
|
|
119
141
|
- [CI/CD Integration](#cicd-integration)
|
|
120
142
|
- [Troubleshooting](#troubleshooting)
|
|
121
143
|
- [Development](#development)
|
|
144
|
+
- [Documentation](#documentation)
|
|
122
145
|
|
|
123
146
|
---
|
|
124
147
|
|
|
@@ -131,7 +154,221 @@ A **craft** is any AI capability:
|
|
|
131
154
|
- **Agent** - Autonomous task executor (e.g., code-reviewer, test-runner)
|
|
132
155
|
- **Command** - Slash command (e.g., /deploy, /analyze)
|
|
133
156
|
- **Hook** - Event handler (e.g., pre-commit, post-install)
|
|
134
|
-
- **Plugin** -
|
|
157
|
+
- **Plugin** - Bundle of multiple crafts with dependencies and MCP server configuration
|
|
158
|
+
- **Collection** - Curated group of related crafts that work together (e.g., rails-enterprise-stack)
|
|
159
|
+
|
|
160
|
+
### Format Conversion
|
|
161
|
+
|
|
162
|
+
**Convert CraftDesk crafts to other AI editor formats** for cross-platform use.
|
|
163
|
+
|
|
164
|
+
**Supported Formats:**
|
|
165
|
+
- **Cursor** - Modern `.mdc` format in `.cursor/rules/` directory
|
|
166
|
+
- **Cursor Legacy** - Plain text `.cursorrules` format
|
|
167
|
+
- **Continue.dev** - Prompt and rule files in `.continue/prompts/` and `.continue/rules/`
|
|
168
|
+
|
|
169
|
+
**Why convert formats?**
|
|
170
|
+
- **Use any AI editor** - Write once, deploy to Cursor, Continue, Windsurf, etc.
|
|
171
|
+
- **Team flexibility** - Developers can use their preferred editors
|
|
172
|
+
- **Maximum reach** - Distribute crafts to wider audience
|
|
173
|
+
- **No lock-in** - Not tied to single platform
|
|
174
|
+
|
|
175
|
+
**Basic Usage:**
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Convert a craft to Cursor format
|
|
179
|
+
craftdesk convert ./my-craft --to cursor
|
|
180
|
+
|
|
181
|
+
# Convert to Continue.dev format
|
|
182
|
+
craftdesk convert ./my-craft --to continue
|
|
183
|
+
|
|
184
|
+
# Convert to legacy .cursorrules
|
|
185
|
+
craftdesk convert ./my-craft --to cursor-legacy
|
|
186
|
+
|
|
187
|
+
# Convert all installed crafts
|
|
188
|
+
craftdesk convert --all --to cursor --output .cursor/rules
|
|
189
|
+
|
|
190
|
+
# List available formats
|
|
191
|
+
craftdesk convert --list-formats
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Example: Rails Skill → Cursor**
|
|
195
|
+
|
|
196
|
+
Your `SKILL.md`:
|
|
197
|
+
```markdown
|
|
198
|
+
---
|
|
199
|
+
name: ruby-on-rails
|
|
200
|
+
description: Ruby on Rails development
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Instructions
|
|
204
|
+
Expert knowledge of Rails framework...
|
|
205
|
+
|
|
206
|
+
## Best Practices
|
|
207
|
+
- Use Strong Parameters
|
|
208
|
+
- Follow RESTful conventions
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Converted to `.cursor/rules/ruby-on-rails.mdc`:
|
|
212
|
+
```markdown
|
|
213
|
+
---
|
|
214
|
+
description: Ruby on Rails development
|
|
215
|
+
globs:
|
|
216
|
+
- "**/*.rb"
|
|
217
|
+
- "**/*.erb"
|
|
218
|
+
- "**/*.haml"
|
|
219
|
+
alwaysApply: true
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
# Ruby On Rails
|
|
223
|
+
|
|
224
|
+
## Overview
|
|
225
|
+
Expert knowledge of Rails framework...
|
|
226
|
+
|
|
227
|
+
## Best Practices
|
|
228
|
+
- Use Strong Parameters
|
|
229
|
+
- Follow RESTful conventions
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Advanced Options:**
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# Merge modes
|
|
236
|
+
craftdesk convert --to cursor --merge-mode skip # Skip existing files
|
|
237
|
+
craftdesk convert --to cursor --merge-mode append # Append to existing
|
|
238
|
+
craftdesk convert --to cursor --merge-mode overwrite # Overwrite (default)
|
|
239
|
+
|
|
240
|
+
# Custom output directory
|
|
241
|
+
craftdesk convert --to cursor --output /custom/path
|
|
242
|
+
|
|
243
|
+
# Convert specific craft type
|
|
244
|
+
craftdesk convert .claude/skills/ruby-rails --to continue
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**What Gets Converted:**
|
|
248
|
+
|
|
249
|
+
| Section | Cursor | Continue |
|
|
250
|
+
|---------|--------|----------|
|
|
251
|
+
| Instructions | ✓ Overview | ✓ Context |
|
|
252
|
+
| Code Patterns | ✓ Code Patterns | ✓ Patterns to Follow |
|
|
253
|
+
| Examples | ✓ Examples | ✓ Examples |
|
|
254
|
+
| Best Practices | ✓ Best Practices | ✓ Best Practices |
|
|
255
|
+
| Pitfalls | ✓ Mistakes to Avoid | ✓ Mistakes to Avoid |
|
|
256
|
+
| Workflows | ✓ Common Workflows | ✓ Step-by-Step Workflows |
|
|
257
|
+
|
|
258
|
+
**Language-Specific Features:**
|
|
259
|
+
|
|
260
|
+
Cursor converter automatically infers file globs based on content:
|
|
261
|
+
- **Ruby/Rails** → `**/*.rb`, `**/*.erb`, config files
|
|
262
|
+
- **TypeScript** → `**/*.ts`, `**/*.tsx`
|
|
263
|
+
- **Python** → `**/*.py`
|
|
264
|
+
- **JavaScript** → `**/*.js`, `**/*.jsx`
|
|
265
|
+
- **And more...** (Go, Rust, PHP, Java, etc.)
|
|
266
|
+
|
|
267
|
+
Continue converter generates:
|
|
268
|
+
- **Prompts** (invokable with `/`) - for manual use
|
|
269
|
+
- **Rules** (automatic) - applied to all matching files
|
|
270
|
+
|
|
271
|
+
**CI/CD Integration:**
|
|
272
|
+
|
|
273
|
+
```yaml
|
|
274
|
+
# .github/workflows/convert-crafts.yml
|
|
275
|
+
name: Convert Crafts to Multiple Formats
|
|
276
|
+
on: [push]
|
|
277
|
+
jobs:
|
|
278
|
+
convert:
|
|
279
|
+
runs-on: ubuntu-latest
|
|
280
|
+
steps:
|
|
281
|
+
- uses: actions/checkout@v2
|
|
282
|
+
- name: Install CraftDesk
|
|
283
|
+
run: npm install -g craftdesk
|
|
284
|
+
- name: Convert to Cursor
|
|
285
|
+
run: craftdesk convert --all --to cursor --output dist/cursor
|
|
286
|
+
- name: Convert to Continue
|
|
287
|
+
run: craftdesk convert --all --to continue --output dist/continue
|
|
288
|
+
- name: Upload artifacts
|
|
289
|
+
uses: actions/upload-artifact@v2
|
|
290
|
+
with:
|
|
291
|
+
name: converted-crafts
|
|
292
|
+
path: dist/
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Tips:**
|
|
296
|
+
|
|
297
|
+
1. **Test conversions** - Always verify converted files work in target editor
|
|
298
|
+
2. **Preserve originals** - Keep SKILL.md as source of truth
|
|
299
|
+
3. **Update together** - Convert after each craft update
|
|
300
|
+
4. **Version control** - Commit both source and converted formats
|
|
301
|
+
|
|
302
|
+
### Collections
|
|
303
|
+
|
|
304
|
+
**Collections** are crafts that group related capabilities together. Instead of installing 6 individual crafts, install one collection that includes all of them.
|
|
305
|
+
|
|
306
|
+
**Why use collections?**
|
|
307
|
+
- **Faster onboarding** - One command installs complete workflows
|
|
308
|
+
- **Curated quality** - Experts bundle best-of-breed tools
|
|
309
|
+
- **Consistent stacks** - Teams share identical setups
|
|
310
|
+
- **Versioned together** - Dependencies tested to work together
|
|
311
|
+
|
|
312
|
+
**Example: Rails Enterprise Stack**
|
|
313
|
+
|
|
314
|
+
Create a collection in `craftdesk.json`:
|
|
315
|
+
```json
|
|
316
|
+
{
|
|
317
|
+
"name": "rails-enterprise-stack",
|
|
318
|
+
"version": "1.0.0",
|
|
319
|
+
"type": "collection",
|
|
320
|
+
"description": "Complete Rails enterprise development setup",
|
|
321
|
+
"dependencies": {
|
|
322
|
+
"ruby-on-rails": "^7.0.0",
|
|
323
|
+
"rspec-testing": "^3.12.0",
|
|
324
|
+
"rubocop-linter": "^1.50.0",
|
|
325
|
+
"sidekiq-background-jobs": "^7.0.0",
|
|
326
|
+
"postgresql-expert": "^15.0.0",
|
|
327
|
+
"devise-auth": "^4.9.0"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**Installing a collection:**
|
|
333
|
+
```bash
|
|
334
|
+
craftdesk add git+https://github.com/company/rails-enterprise-stack.git
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**What happens:**
|
|
338
|
+
1. CraftDesk reads the collection's `craftdesk.json`
|
|
339
|
+
2. Recursively resolves all 6 dependencies
|
|
340
|
+
3. Installs the collection + all dependencies
|
|
341
|
+
4. Creates lockfile tracking everything
|
|
342
|
+
|
|
343
|
+
**Result:** 7 crafts installed (collection + 6 dependencies)
|
|
344
|
+
|
|
345
|
+
**How collections work:**
|
|
346
|
+
|
|
347
|
+
Collections leverage CraftDesk's **recursive dependency resolution**. When you install a craft with dependencies, CraftDesk:
|
|
348
|
+
1. Clones the repository
|
|
349
|
+
2. Reads `craftdesk.json`
|
|
350
|
+
3. Adds all dependencies to the resolution queue
|
|
351
|
+
4. Recursively resolves transitive dependencies
|
|
352
|
+
5. Installs everything with a single lockfile
|
|
353
|
+
|
|
354
|
+
This means **any craft with dependencies acts as a collection** - the `type: "collection"` field just improves discoverability in the registry.
|
|
355
|
+
|
|
356
|
+
**Nested collections:**
|
|
357
|
+
|
|
358
|
+
Collections can depend on other collections:
|
|
359
|
+
```json
|
|
360
|
+
{
|
|
361
|
+
"name": "full-stack-rails",
|
|
362
|
+
"type": "collection",
|
|
363
|
+
"dependencies": {
|
|
364
|
+
"rails-enterprise-stack": "^1.0.0", // Another collection!
|
|
365
|
+
"frontend-tooling": "^2.1.0", // Another collection!
|
|
366
|
+
"docker-deployment": "^1.5.0"
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
CraftDesk handles arbitrary nesting depth with circular dependency detection.
|
|
135
372
|
|
|
136
373
|
### Manifest File: craftdesk.json
|
|
137
374
|
|
|
@@ -172,11 +409,31 @@ Records exact versions installed (like package-lock.json or Gemfile.lock):
|
|
|
172
409
|
|
|
173
410
|
**Always commit this file to version control!**
|
|
174
411
|
|
|
412
|
+
### Security: Checksum Verification
|
|
413
|
+
|
|
414
|
+
CraftDesk automatically verifies the integrity of downloaded packages:
|
|
415
|
+
|
|
416
|
+
- **Registry packages**: SHA-256 checksums are computed when you first add a craft and stored in `craftdesk.lock`
|
|
417
|
+
- **Subsequent installs**: The downloaded file is verified against the stored checksum before extraction
|
|
418
|
+
- **MITM protection**: Prevents tampering during download by detecting any modifications
|
|
419
|
+
- **Git packages**: Git commit hashes serve as checksums - stored in the lockfile and verified during clone
|
|
420
|
+
|
|
421
|
+
**What happens on checksum mismatch:**
|
|
422
|
+
```
|
|
423
|
+
Error: Checksum verification failed for john/rails-api@2.1.0.
|
|
424
|
+
Expected: a1b2c3d4e5f6...
|
|
425
|
+
This may indicate a corrupted download or a security issue.
|
|
426
|
+
Try running 'craftdesk install --no-lockfile' to re-resolve dependencies.
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
The lockfile contains SHA-256 hashes that ensure reproducible and secure installations across all team members.
|
|
430
|
+
|
|
175
431
|
### Install Directory
|
|
176
432
|
|
|
177
433
|
By default, crafts install to `.claude/` in your project:
|
|
178
434
|
```
|
|
179
435
|
.claude/
|
|
436
|
+
├── settings.json # Plugin configuration (auto-generated)
|
|
180
437
|
├── skills/
|
|
181
438
|
│ ├── ruby-on-rails/
|
|
182
439
|
│ └── postgres-expert/
|
|
@@ -184,10 +441,195 @@ By default, crafts install to `.claude/` in your project:
|
|
|
184
441
|
│ └── code-reviewer/
|
|
185
442
|
├── commands/
|
|
186
443
|
│ └── deploy/
|
|
187
|
-
|
|
188
|
-
|
|
444
|
+
├── hooks/
|
|
445
|
+
│ └── pre-commit/
|
|
446
|
+
└── plugins/ # Flat plugin installation
|
|
447
|
+
├── company-rails-plugin/
|
|
448
|
+
│ ├── plugin.json
|
|
449
|
+
│ ├── PLUGIN.md
|
|
450
|
+
│ └── skills/...
|
|
451
|
+
└── my-skill-plugin/ # Wrapped skill
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Plugin System
|
|
457
|
+
|
|
458
|
+
**New in v0.3.0**: CraftDesk now supports a comprehensive plugin system for bundling multiple crafts with automatic dependency management.
|
|
459
|
+
|
|
460
|
+
### What are Plugins?
|
|
461
|
+
|
|
462
|
+
Plugins allow you to:
|
|
463
|
+
- **Bundle multiple crafts** (skills, agents, commands, hooks) together
|
|
464
|
+
- **Declare dependencies** that are automatically installed
|
|
465
|
+
- **Configure MCP servers** (Model Context Protocol) for external tools
|
|
466
|
+
- **Share configurations** and related files as a cohesive package
|
|
467
|
+
- **Wrap individual crafts** as plugins for better organization
|
|
468
|
+
|
|
469
|
+
### Installing Plugins
|
|
470
|
+
|
|
471
|
+
```bash
|
|
472
|
+
# Install a plugin from registry
|
|
473
|
+
craftdesk add company/rails-standards-plugin
|
|
474
|
+
|
|
475
|
+
# What happens automatically:
|
|
476
|
+
# 1. Plugin is installed to .claude/plugins/company-rails-standards-plugin/
|
|
477
|
+
# 2. Dependencies are resolved and auto-installed
|
|
478
|
+
# 3. Plugin is registered in .claude/settings.json
|
|
479
|
+
# 4. MCP server is configured (if provided)
|
|
480
|
+
# 5. Plugin tree is added to craftdesk.lock
|
|
189
481
|
```
|
|
190
482
|
|
|
483
|
+
**Example Output**:
|
|
484
|
+
```
|
|
485
|
+
Adding company/rails-standards-plugin...
|
|
486
|
+
Found company/rails-standards-plugin@2.1.0
|
|
487
|
+
Installing company/rails-standards-plugin...
|
|
488
|
+
Plugin detected - resolving dependencies...
|
|
489
|
+
Resolved 3 total dependencies
|
|
490
|
+
Installing plugin dependency: john/rspec-testing...
|
|
491
|
+
✓ Resolved john/rspec-testing@1.5.3
|
|
492
|
+
Installing plugin dependency: jane/postgres-toolkit...
|
|
493
|
+
✓ Resolved jane/postgres-toolkit@3.2.1
|
|
494
|
+
✓ Installed company/rails-standards-plugin@2.1.0
|
|
495
|
+
Craft added successfully!
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Plugin Structure
|
|
499
|
+
|
|
500
|
+
A plugin contains a `plugin.json` manifest:
|
|
501
|
+
|
|
502
|
+
```json
|
|
503
|
+
{
|
|
504
|
+
"name": "company-rails-plugin",
|
|
505
|
+
"version": "2.1.0",
|
|
506
|
+
"type": "plugin",
|
|
507
|
+
"description": "Rails development standards",
|
|
508
|
+
"author": "company",
|
|
509
|
+
"components": {
|
|
510
|
+
"skills": ["coding-standards", "rails-best-practices"],
|
|
511
|
+
"agents": ["standards-enforcer"],
|
|
512
|
+
"commands": ["check-standards"]
|
|
513
|
+
},
|
|
514
|
+
"dependencies": {
|
|
515
|
+
"john/rspec-testing": "^1.5.0",
|
|
516
|
+
"jane/postgres-toolkit": "^3.2.0"
|
|
517
|
+
},
|
|
518
|
+
"mcp": {
|
|
519
|
+
"type": "stdio",
|
|
520
|
+
"command": "/usr/bin/rails-standards-mcp",
|
|
521
|
+
"args": ["--config", ".claude/plugins/company-rails-plugin/config.json"]
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
### Automatic Dependency Resolution
|
|
527
|
+
|
|
528
|
+
When you install a plugin, **all dependencies are automatically installed**:
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
$ craftdesk add company/rails-plugin
|
|
532
|
+
|
|
533
|
+
# Installs dependency tree:
|
|
534
|
+
# company/rails-plugin (direct)
|
|
535
|
+
# ├── john/rspec-testing (dependency)
|
|
536
|
+
# └── jane/postgres-toolkit (dependency)
|
|
537
|
+
# └── jane/sql-helpers (nested dependency)
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
All dependencies are:
|
|
541
|
+
- ✅ Downloaded from their respective sources (registry/git)
|
|
542
|
+
- ✅ Installed to appropriate directories
|
|
543
|
+
- ✅ Verified with integrity checksums
|
|
544
|
+
- ✅ Marked as dependencies in lockfile
|
|
545
|
+
- ✅ Registered in `.claude/settings.json`
|
|
546
|
+
|
|
547
|
+
### Wrapping Individual Crafts
|
|
548
|
+
|
|
549
|
+
Convert any skill, agent, command, or hook into a plugin:
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
craftdesk add my-skill --as-plugin
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
**What happens**:
|
|
556
|
+
1. Original craft installed to `.claude/skills/my-skill/`
|
|
557
|
+
2. Plugin wrapper created at `.claude/plugins/my-skill-plugin/`
|
|
558
|
+
3. `plugin.json` and `PLUGIN.md` auto-generated
|
|
559
|
+
4. Craft files copied to plugin structure
|
|
560
|
+
5. Registered in settings as wrapped plugin
|
|
561
|
+
|
|
562
|
+
**Use cases**:
|
|
563
|
+
- Add MCP server to existing skill
|
|
564
|
+
- Bundle configuration with craft
|
|
565
|
+
- Prepare for publishing to marketplace
|
|
566
|
+
- Enable/disable craft from Claude Code UI
|
|
567
|
+
|
|
568
|
+
### Plugin Tree Visualization
|
|
569
|
+
|
|
570
|
+
View your plugin dependency tree:
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
$ craftdesk list
|
|
574
|
+
|
|
575
|
+
my-project@1.0.0
|
|
576
|
+
|
|
577
|
+
🔌 Plugins:
|
|
578
|
+
company/rails-standards@2.1.0
|
|
579
|
+
├── john/rspec-testing@1.5.3
|
|
580
|
+
└── jane/postgres-toolkit@3.2.1
|
|
581
|
+
my-skill-plugin@1.0.0
|
|
582
|
+
|
|
583
|
+
📚 Skills:
|
|
584
|
+
standalone-skill@1.0.0
|
|
585
|
+
|
|
586
|
+
Total: 5 crafts installed
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
### Removing Plugins with Dependencies
|
|
590
|
+
|
|
591
|
+
CraftDesk prevents accidental removal of required dependencies:
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
$ craftdesk remove john/rspec-testing
|
|
595
|
+
|
|
596
|
+
Warning: john/rspec-testing is required by:
|
|
597
|
+
- company/rails-standards@2.1.0
|
|
598
|
+
|
|
599
|
+
Use --force to remove anyway
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Force removal:
|
|
603
|
+
```bash
|
|
604
|
+
craftdesk remove john/rspec-testing --force
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
### Settings Integration
|
|
608
|
+
|
|
609
|
+
Plugins are automatically registered in `.claude/settings.json`:
|
|
610
|
+
|
|
611
|
+
```json
|
|
612
|
+
{
|
|
613
|
+
"version": "1.0.0",
|
|
614
|
+
"plugins": {
|
|
615
|
+
"company-rails-plugin": {
|
|
616
|
+
"name": "company-rails-plugin",
|
|
617
|
+
"version": "2.1.0",
|
|
618
|
+
"enabled": true,
|
|
619
|
+
"installPath": "plugins/company-rails-plugin",
|
|
620
|
+
"dependencies": ["john-rspec-testing", "jane-postgres-toolkit"],
|
|
621
|
+
"mcp": {
|
|
622
|
+
"type": "stdio",
|
|
623
|
+
"command": "/usr/bin/rails-standards-mcp",
|
|
624
|
+
"args": ["--config", ".claude/plugins/company-rails-plugin/config.json"]
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
**For complete details**, see [DEPENDENCY_MANAGEMENT.md](./DEPENDENCY_MANAGEMENT.md)
|
|
632
|
+
|
|
191
633
|
---
|
|
192
634
|
|
|
193
635
|
## Command Reference
|
|
@@ -200,7 +642,7 @@ Initialize a new craftdesk.json file.
|
|
|
200
642
|
- `-y, --yes` - Skip prompts and use defaults
|
|
201
643
|
- `-n, --name <name>` - Project name (default: directory name)
|
|
202
644
|
- `-v, --version <version>` - Project version (default: "1.0.0")
|
|
203
|
-
- `-t, --type <type>` - Project type: skill, agent, command, hook, or
|
|
645
|
+
- `-t, --type <type>` - Project type: skill, agent, command, hook, plugin, or collection (default: "skill")
|
|
204
646
|
- `-d, --description <desc>` - Project description
|
|
205
647
|
- `-a, --author <author>` - Author name
|
|
206
648
|
- `-l, --license <license>` - License (default: "MIT")
|
|
@@ -259,7 +701,7 @@ Add a new dependency and install it immediately.
|
|
|
259
701
|
- `-D, --save-dev` - Save as devDependency
|
|
260
702
|
- `-O, --save-optional` - Save as optionalDependency
|
|
261
703
|
- `-E, --save-exact` - Save exact version (no ^ or ~)
|
|
262
|
-
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook, plugin)
|
|
704
|
+
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook, plugin, collection)
|
|
263
705
|
|
|
264
706
|
**Examples:**
|
|
265
707
|
|
|
@@ -335,6 +777,253 @@ Total: 3 crafts installed
|
|
|
335
777
|
|
|
336
778
|
---
|
|
337
779
|
|
|
780
|
+
### `craftdesk search <query> [options]`
|
|
781
|
+
|
|
782
|
+
Search for crafts in the registry.
|
|
783
|
+
|
|
784
|
+
**Options:**
|
|
785
|
+
- `-t, --type <type>` - Filter by type (skill, agent, command, hook, plugin, collection)
|
|
786
|
+
|
|
787
|
+
**Examples:**
|
|
788
|
+
```bash
|
|
789
|
+
# Search for crafts
|
|
790
|
+
craftdesk search kafka
|
|
791
|
+
|
|
792
|
+
# Search for skills only
|
|
793
|
+
craftdesk search rails --type skill
|
|
794
|
+
|
|
795
|
+
# Search for plugins
|
|
796
|
+
craftdesk search standards --type plugin
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
**Example output:**
|
|
800
|
+
```
|
|
801
|
+
Search results for "kafka":
|
|
802
|
+
|
|
803
|
+
john/kafka-processing@2.1.0 (skill)
|
|
804
|
+
Expert knowledge for processing Kafka messages
|
|
805
|
+
|
|
806
|
+
jane/kafka-agent@1.5.3 (agent)
|
|
807
|
+
Autonomous agent for Kafka stream management
|
|
808
|
+
|
|
809
|
+
Found 2 crafts
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
---
|
|
813
|
+
|
|
814
|
+
### `craftdesk info <craft>`
|
|
815
|
+
|
|
816
|
+
Display detailed information about a craft from the registry.
|
|
817
|
+
|
|
818
|
+
**Examples:**
|
|
819
|
+
```bash
|
|
820
|
+
# Get info about a craft
|
|
821
|
+
craftdesk info john/rails-api
|
|
822
|
+
|
|
823
|
+
# Get info about a specific version
|
|
824
|
+
craftdesk info john/rails-api@2.1.0
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
**Example output:**
|
|
828
|
+
```
|
|
829
|
+
john/rails-api@2.1.0
|
|
830
|
+
|
|
831
|
+
Description: Rails API development best practices
|
|
832
|
+
Type: skill
|
|
833
|
+
Author: john
|
|
834
|
+
License: MIT
|
|
835
|
+
Downloads: 1,234
|
|
836
|
+
|
|
837
|
+
Versions:
|
|
838
|
+
2.1.0 (latest)
|
|
839
|
+
2.0.0
|
|
840
|
+
1.5.0
|
|
841
|
+
|
|
842
|
+
Dependencies:
|
|
843
|
+
jane/postgres-toolkit: ^1.0.0
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
### `craftdesk outdated`
|
|
849
|
+
|
|
850
|
+
Check for outdated dependencies that have newer versions available.
|
|
851
|
+
|
|
852
|
+
**Examples:**
|
|
853
|
+
```bash
|
|
854
|
+
# Check all dependencies
|
|
855
|
+
craftdesk outdated
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
**Example output:**
|
|
859
|
+
```
|
|
860
|
+
Checking for outdated dependencies...
|
|
861
|
+
|
|
862
|
+
Outdated crafts:
|
|
863
|
+
|
|
864
|
+
john/rails-api
|
|
865
|
+
Current: 2.0.0
|
|
866
|
+
Latest: 2.1.0
|
|
867
|
+
Type: skill
|
|
868
|
+
|
|
869
|
+
jane/postgres-toolkit
|
|
870
|
+
Current: 1.2.0
|
|
871
|
+
Latest: 1.5.0
|
|
872
|
+
Type: skill
|
|
873
|
+
|
|
874
|
+
2 outdated crafts found
|
|
875
|
+
Run 'craftdesk update' to update all, or 'craftdesk update <craft>' to update specific crafts.
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
---
|
|
879
|
+
|
|
880
|
+
### `craftdesk update [craft]`
|
|
881
|
+
|
|
882
|
+
Update dependencies to their latest compatible versions.
|
|
883
|
+
|
|
884
|
+
**Examples:**
|
|
885
|
+
```bash
|
|
886
|
+
# Update all outdated dependencies
|
|
887
|
+
craftdesk update
|
|
888
|
+
|
|
889
|
+
# Update a specific craft
|
|
890
|
+
craftdesk update john/rails-api
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
**What it does:**
|
|
894
|
+
1. Checks for newer versions in the registry
|
|
895
|
+
2. Downloads and installs updates
|
|
896
|
+
3. Updates craftdesk.lock with new versions
|
|
897
|
+
4. Verifies checksums for security
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
901
|
+
### `craftdesk publish [options]`
|
|
902
|
+
|
|
903
|
+
Publish a craft to the registry.
|
|
904
|
+
|
|
905
|
+
**Options:**
|
|
906
|
+
- `--visibility <level>` - Set visibility: public, private, or organization (default: public)
|
|
907
|
+
|
|
908
|
+
**Examples:**
|
|
909
|
+
```bash
|
|
910
|
+
# Publish the current craft
|
|
911
|
+
craftdesk publish
|
|
912
|
+
|
|
913
|
+
# Publish as private
|
|
914
|
+
craftdesk publish --visibility private
|
|
915
|
+
|
|
916
|
+
# Publish to organization only
|
|
917
|
+
craftdesk publish --visibility organization
|
|
918
|
+
```
|
|
919
|
+
|
|
920
|
+
**Prerequisites:**
|
|
921
|
+
- Must be logged in (`craftdesk login`)
|
|
922
|
+
- Must have a valid `craftdesk.json` in current directory
|
|
923
|
+
- Craft files must exist (SKILL.md, AGENT.md, etc.)
|
|
924
|
+
|
|
925
|
+
**What it does:**
|
|
926
|
+
1. Reads craftdesk.json for metadata
|
|
927
|
+
2. Collects all craft files
|
|
928
|
+
3. Creates a new version on the registry
|
|
929
|
+
4. Publishes with specified visibility
|
|
930
|
+
|
|
931
|
+
---
|
|
932
|
+
|
|
933
|
+
## Authentication
|
|
934
|
+
|
|
935
|
+
CraftDesk supports authenticated access to private registries.
|
|
936
|
+
|
|
937
|
+
### `craftdesk login [options]`
|
|
938
|
+
|
|
939
|
+
Authenticate with a registry using an API token.
|
|
940
|
+
|
|
941
|
+
**Options:**
|
|
942
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
943
|
+
|
|
944
|
+
**Examples:**
|
|
945
|
+
```bash
|
|
946
|
+
# Login to default registry
|
|
947
|
+
craftdesk login
|
|
948
|
+
|
|
949
|
+
# Login to a specific registry
|
|
950
|
+
craftdesk login --registry https://private.company.com
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
**How it works:**
|
|
954
|
+
1. Prompts for your API token
|
|
955
|
+
2. Verifies the token with the registry
|
|
956
|
+
3. Stores credentials in `~/.craftdesk/config.json`
|
|
957
|
+
4. Token is used for subsequent registry operations
|
|
958
|
+
|
|
959
|
+
**Getting an API token:**
|
|
960
|
+
- Log in to your CraftDesk registry web interface
|
|
961
|
+
- Navigate to Settings → API Tokens
|
|
962
|
+
- Generate a new token
|
|
963
|
+
|
|
964
|
+
---
|
|
965
|
+
|
|
966
|
+
### `craftdesk logout [options]`
|
|
967
|
+
|
|
968
|
+
Remove stored authentication credentials.
|
|
969
|
+
|
|
970
|
+
**Options:**
|
|
971
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
972
|
+
|
|
973
|
+
**Examples:**
|
|
974
|
+
```bash
|
|
975
|
+
# Logout from default registry
|
|
976
|
+
craftdesk logout
|
|
977
|
+
|
|
978
|
+
# Logout from specific registry
|
|
979
|
+
craftdesk logout --registry https://private.company.com
|
|
980
|
+
```
|
|
981
|
+
|
|
982
|
+
---
|
|
983
|
+
|
|
984
|
+
### `craftdesk whoami [options]`
|
|
985
|
+
|
|
986
|
+
Display the currently logged-in user.
|
|
987
|
+
|
|
988
|
+
**Options:**
|
|
989
|
+
- `-r, --registry <url>` - Registry URL (uses default from craftdesk.json if not specified)
|
|
990
|
+
|
|
991
|
+
**Examples:**
|
|
992
|
+
```bash
|
|
993
|
+
# Check current user
|
|
994
|
+
craftdesk whoami
|
|
995
|
+
|
|
996
|
+
# Check user for specific registry
|
|
997
|
+
craftdesk whoami --registry https://private.company.com
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
**Example output:**
|
|
1001
|
+
```
|
|
1002
|
+
Logged in to https://craftdesk.ai as john (john@example.com)
|
|
1003
|
+
Organization: acme-corp
|
|
1004
|
+
```
|
|
1005
|
+
|
|
1006
|
+
---
|
|
1007
|
+
|
|
1008
|
+
### Environment Variable Authentication
|
|
1009
|
+
|
|
1010
|
+
For CI/CD environments, you can use environment variables instead of `craftdesk login`:
|
|
1011
|
+
|
|
1012
|
+
```bash
|
|
1013
|
+
# For a registry named "company-private" in craftdesk.json
|
|
1014
|
+
export CRAFTDESK_AUTH_COMPANY_PRIVATE=your_api_token_here
|
|
1015
|
+
|
|
1016
|
+
# For the default registry
|
|
1017
|
+
export CRAFTDESK_AUTH_LOCALHOST_3000=your_api_token_here
|
|
1018
|
+
|
|
1019
|
+
# The variable name is derived from the registry URL:
|
|
1020
|
+
# https://example.com -> CRAFTDESK_AUTH_EXAMPLE_COM
|
|
1021
|
+
```
|
|
1022
|
+
|
|
1023
|
+
Environment variables take precedence over stored credentials.
|
|
1024
|
+
|
|
1025
|
+
---
|
|
1026
|
+
|
|
338
1027
|
### Global Options
|
|
339
1028
|
|
|
340
1029
|
Available for all commands:
|
|
@@ -354,9 +1043,75 @@ craftdesk init --help
|
|
|
354
1043
|
|
|
355
1044
|
## Dependency Sources
|
|
356
1045
|
|
|
357
|
-
CraftDesk
|
|
1046
|
+
CraftDesk supports both registry and git dependencies.
|
|
1047
|
+
|
|
1048
|
+
### 1. Registry Dependencies (CraftDesk Web API)
|
|
1049
|
+
|
|
1050
|
+
Install crafts from the CraftDesk registry using `author/name` format:
|
|
1051
|
+
|
|
1052
|
+
```bash
|
|
1053
|
+
# Search for crafts
|
|
1054
|
+
craftdesk search kafka
|
|
1055
|
+
|
|
1056
|
+
# Get information about a craft
|
|
1057
|
+
craftdesk info john/rails-api
|
|
358
1058
|
|
|
359
|
-
|
|
1059
|
+
# Add from registry
|
|
1060
|
+
craftdesk add john/rails-api
|
|
1061
|
+
craftdesk add john/rails-api@^2.1.0
|
|
1062
|
+
|
|
1063
|
+
# Add with specific version
|
|
1064
|
+
craftdesk add jane/postgres-expert@1.2.0
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
**Registry format in craftdesk.json:**
|
|
1068
|
+
|
|
1069
|
+
```json
|
|
1070
|
+
{
|
|
1071
|
+
"dependencies": {
|
|
1072
|
+
"john/rails-api": "^2.1.0",
|
|
1073
|
+
"jane/kafka-processing": "~1.5.2",
|
|
1074
|
+
"team/postgres-admin": "latest"
|
|
1075
|
+
},
|
|
1076
|
+
"registries": {
|
|
1077
|
+
"default": {
|
|
1078
|
+
"url": "http://localhost:3000"
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
```
|
|
1083
|
+
|
|
1084
|
+
**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.
|
|
1085
|
+
|
|
1086
|
+
**Private Registry Authentication:**
|
|
1087
|
+
|
|
1088
|
+
For private registries, set authentication tokens via environment variables:
|
|
1089
|
+
|
|
1090
|
+
```bash
|
|
1091
|
+
# For a registry named "company-private" in craftdesk.json
|
|
1092
|
+
export CRAFTDESK_AUTH_COMPANY_PRIVATE=your_token_here
|
|
1093
|
+
|
|
1094
|
+
# For default registry
|
|
1095
|
+
export CRAFTDESK_AUTH_DEFAULT=your_token_here
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
Example `craftdesk.json` with private registry:
|
|
1099
|
+
|
|
1100
|
+
```json
|
|
1101
|
+
{
|
|
1102
|
+
"registries": {
|
|
1103
|
+
"default": {
|
|
1104
|
+
"url": "https://your-registry.com"
|
|
1105
|
+
},
|
|
1106
|
+
"company-private": {
|
|
1107
|
+
"url": "https://private.company.com",
|
|
1108
|
+
"scope": "@company"
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
### 2. GitHub URLs (Easiest for Git)
|
|
360
1115
|
|
|
361
1116
|
Simply paste any GitHub URL - it auto-converts to the correct format:
|
|
362
1117
|
|
|
@@ -371,7 +1126,7 @@ craftdesk add https://github.com/user/repo/blob/main/agent.md
|
|
|
371
1126
|
craftdesk add https://github.com/user/repo
|
|
372
1127
|
```
|
|
373
1128
|
|
|
374
|
-
###
|
|
1129
|
+
### 3. Git Dependencies
|
|
375
1130
|
|
|
376
1131
|
From git repositories:
|
|
377
1132
|
|
|
@@ -402,26 +1157,60 @@ From git repositories:
|
|
|
402
1157
|
- `path` - Subdirectory within repo (for monorepos)
|
|
403
1158
|
- `file` - Direct file path (for single-file crafts)
|
|
404
1159
|
|
|
405
|
-
|
|
1160
|
+
---
|
|
406
1161
|
|
|
407
|
-
|
|
1162
|
+
## Monorepo Support
|
|
408
1163
|
|
|
409
|
-
|
|
1164
|
+
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
1165
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
1166
|
+
### Quick Start: Auto-Converting GitHub URLs
|
|
1167
|
+
|
|
1168
|
+
The easiest way to install from monorepos is to **paste GitHub web URLs directly**:
|
|
1169
|
+
|
|
1170
|
+
```bash
|
|
1171
|
+
# Subdirectory from monorepo - just paste the GitHub URL!
|
|
1172
|
+
craftdesk add https://github.com/company/monorepo/tree/main/skills/auth
|
|
1173
|
+
|
|
1174
|
+
# Single file from monorepo
|
|
1175
|
+
craftdesk add https://github.com/company/monorepo/blob/main/skills/auth/SKILL.md
|
|
1176
|
+
|
|
1177
|
+
# Works with any branch or tag
|
|
1178
|
+
craftdesk add https://github.com/company/monorepo/tree/v2.0.0/packages/deployer
|
|
418
1179
|
```
|
|
419
1180
|
|
|
420
|
-
|
|
1181
|
+
CraftDesk automatically converts these to the correct git syntax and extracts only the specified subdirectory or file.
|
|
421
1182
|
|
|
422
|
-
|
|
1183
|
+
### Git URL Syntax
|
|
1184
|
+
|
|
1185
|
+
For more control, use explicit git URL syntax with path or file specifiers:
|
|
1186
|
+
|
|
1187
|
+
```bash
|
|
1188
|
+
# Subdirectory with branch
|
|
1189
|
+
craftdesk add git+https://github.com/company/monorepo.git#main#path:skills/auth
|
|
423
1190
|
|
|
424
|
-
|
|
1191
|
+
# Subdirectory with tag
|
|
1192
|
+
craftdesk add git+https://github.com/company/monorepo.git#v2.0.0#path:packages/deployer
|
|
1193
|
+
|
|
1194
|
+
# Subdirectory with commit hash
|
|
1195
|
+
craftdesk add git+https://github.com/company/monorepo.git#abc123def#path:skills/auth
|
|
1196
|
+
|
|
1197
|
+
# Single file with branch
|
|
1198
|
+
craftdesk add git+https://github.com/company/monorepo.git#main#file:skills/auth/SKILL.md
|
|
1199
|
+
|
|
1200
|
+
# Just path (uses default branch)
|
|
1201
|
+
craftdesk add git+https://github.com/company/monorepo.git#path:skills/auth
|
|
1202
|
+
```
|
|
1203
|
+
|
|
1204
|
+
**Syntax breakdown:**
|
|
1205
|
+
- `#main` - Branch name
|
|
1206
|
+
- `#v2.0.0` - Git tag
|
|
1207
|
+
- `#abc123def` - Commit hash (full 40-char)
|
|
1208
|
+
- `#path:skills/auth` - Subdirectory to extract
|
|
1209
|
+
- `#file:skill.md` - Single file to extract
|
|
1210
|
+
|
|
1211
|
+
### Using in craftdesk.json
|
|
1212
|
+
|
|
1213
|
+
Multiple crafts from the same monorepo:
|
|
425
1214
|
|
|
426
1215
|
```json
|
|
427
1216
|
{
|
|
@@ -436,41 +1225,90 @@ Install multiple crafts from the same git repository using subdirectory paths:
|
|
|
436
1225
|
"tag": "v3.2.0",
|
|
437
1226
|
"path": "agents/processor"
|
|
438
1227
|
},
|
|
439
|
-
"
|
|
1228
|
+
"deploy-script": {
|
|
440
1229
|
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
441
1230
|
"tag": "v3.2.0",
|
|
442
|
-
"
|
|
1231
|
+
"file": "scripts/deploy.md"
|
|
443
1232
|
}
|
|
444
1233
|
}
|
|
445
1234
|
}
|
|
446
1235
|
```
|
|
447
1236
|
|
|
448
|
-
**
|
|
449
|
-
-
|
|
450
|
-
-
|
|
451
|
-
-
|
|
452
|
-
-
|
|
1237
|
+
**Each craft can:**
|
|
1238
|
+
- Use different subdirectories (`path`)
|
|
1239
|
+
- Reference single files (`file`)
|
|
1240
|
+
- Use the same or different tags/branches
|
|
1241
|
+
- Be versioned independently or together
|
|
1242
|
+
|
|
1243
|
+
### Benefits
|
|
1244
|
+
|
|
1245
|
+
✅ **Single repository** for multiple related crafts
|
|
1246
|
+
✅ **Version together** using git tags (or independently with branches)
|
|
1247
|
+
✅ **Efficient cloning** - repository is cloned once and reused
|
|
1248
|
+
✅ **Clear organization** - keep related crafts together
|
|
1249
|
+
✅ **Atomic updates** - update all crafts by changing the tag
|
|
1250
|
+
✅ **Works with private repos** - standard git authentication
|
|
1251
|
+
|
|
1252
|
+
### Monorepo Structure Example
|
|
453
1253
|
|
|
454
|
-
**Monorepo structure example:**
|
|
455
1254
|
```
|
|
456
1255
|
ai-crafts-monorepo/
|
|
457
1256
|
├── skills/
|
|
458
1257
|
│ ├── auth/
|
|
459
1258
|
│ │ ├── craftdesk.json
|
|
460
1259
|
│ │ └── SKILL.md
|
|
1260
|
+
│ ├── database/
|
|
1261
|
+
│ │ ├── craftdesk.json
|
|
1262
|
+
│ │ └── SKILL.md
|
|
461
1263
|
│ └── reporting/
|
|
462
1264
|
│ ├── craftdesk.json
|
|
463
1265
|
│ └── SKILL.md
|
|
464
1266
|
├── agents/
|
|
465
|
-
│
|
|
1267
|
+
│ ├── code-reviewer/
|
|
1268
|
+
│ │ ├── craftdesk.json
|
|
1269
|
+
│ │ └── AGENT.md
|
|
1270
|
+
│ └── test-runner/
|
|
466
1271
|
│ ├── craftdesk.json
|
|
467
1272
|
│ └── AGENT.md
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
1273
|
+
├── commands/
|
|
1274
|
+
│ └── deploy/
|
|
1275
|
+
│ ├── craftdesk.json
|
|
1276
|
+
│ └── COMMAND.md
|
|
1277
|
+
└── scripts/
|
|
1278
|
+
├── setup.md
|
|
1279
|
+
└── deploy.md
|
|
1280
|
+
```
|
|
1281
|
+
|
|
1282
|
+
### Lockfile Tracking
|
|
1283
|
+
|
|
1284
|
+
CraftDesk lockfile tracks the exact subdirectory and commit:
|
|
1285
|
+
|
|
1286
|
+
```json
|
|
1287
|
+
{
|
|
1288
|
+
"crafts": {
|
|
1289
|
+
"auth-handler": {
|
|
1290
|
+
"git": "https://github.com/company/monorepo.git",
|
|
1291
|
+
"tag": "v3.2.0",
|
|
1292
|
+
"commit": "abc123def456...",
|
|
1293
|
+
"path": "skills/auth",
|
|
1294
|
+
"type": "skill",
|
|
1295
|
+
"version": "3.2.0"
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
```
|
|
1300
|
+
|
|
1301
|
+
This ensures **reproducible installations** - the exact subdirectory from the exact commit is always installed.
|
|
1302
|
+
|
|
1303
|
+
### Real-World Example
|
|
1304
|
+
|
|
1305
|
+
```bash
|
|
1306
|
+
# Install from technicalpickles' monorepo
|
|
1307
|
+
craftdesk add https://github.com/technicalpickles/pickled-claude-plugins/tree/main/plugins/working-in-monorepos/skills/working-in-monorepos
|
|
472
1308
|
```
|
|
473
1309
|
|
|
1310
|
+
This installs only the `working-in-monorepos` skill from the deeply nested monorepo structure.
|
|
1311
|
+
|
|
474
1312
|
---
|
|
475
1313
|
|
|
476
1314
|
## craftdesk.json Reference
|
|
@@ -528,7 +1366,7 @@ Complete specification of the craftdesk.json format:
|
|
|
528
1366
|
|-------|------|----------|-------------|
|
|
529
1367
|
| `name` | string | Yes | Craft name (lowercase, no spaces) |
|
|
530
1368
|
| `version` | string | Yes | Semantic version (e.g., "1.0.0") |
|
|
531
|
-
| `type` | string | No | Craft type: skill, agent, command, hook, plugin |
|
|
1369
|
+
| `type` | string | No | Craft type: skill, agent, command, hook, plugin, collection |
|
|
532
1370
|
| `description` | string | No | Short description |
|
|
533
1371
|
| `author` | string | No | Author name and email |
|
|
534
1372
|
| `license` | string | No | License identifier (e.g., "MIT") |
|
|
@@ -740,11 +1578,46 @@ npm test
|
|
|
740
1578
|
|
|
741
1579
|
### Publishing
|
|
742
1580
|
|
|
1581
|
+
CraftDesk uses automated NPM publishing via GitHub Actions with provenance attestation.
|
|
1582
|
+
|
|
1583
|
+
**Quick release:**
|
|
1584
|
+
```bash
|
|
1585
|
+
./scripts/release.sh patch # 0.3.0 → 0.3.1
|
|
1586
|
+
./scripts/release.sh minor # 0.3.0 → 0.4.0
|
|
1587
|
+
./scripts/release.sh major # 0.3.0 → 1.0.0
|
|
1588
|
+
```
|
|
1589
|
+
|
|
1590
|
+
The script will:
|
|
1591
|
+
1. Bump version in package.json
|
|
1592
|
+
2. Prompt you to update CHANGELOG.md
|
|
1593
|
+
3. Commit and push changes
|
|
1594
|
+
4. Create GitHub release
|
|
1595
|
+
5. GitHub Actions automatically publishes to NPM with provenance
|
|
1596
|
+
|
|
1597
|
+
**Manual process:**
|
|
743
1598
|
```bash
|
|
744
1599
|
npm version patch
|
|
745
|
-
|
|
1600
|
+
git add package.json CHANGELOG.md
|
|
1601
|
+
git commit -m "Bump to 0.3.1"
|
|
1602
|
+
git push
|
|
1603
|
+
gh release create v0.3.1 --title "v0.3.1" --generate-notes
|
|
746
1604
|
```
|
|
747
1605
|
|
|
1606
|
+
See [NPM_PUBLISHING_GUIDE.md](./NPM_PUBLISHING_GUIDE.md) for complete setup instructions.
|
|
1607
|
+
|
|
1608
|
+
---
|
|
1609
|
+
|
|
1610
|
+
## Documentation
|
|
1611
|
+
|
|
1612
|
+
### Core Documentation
|
|
1613
|
+
- **[README.md](./README.md)** - This file, general overview and quick start
|
|
1614
|
+
- **[DEPENDENCY_MANAGEMENT.md](./DEPENDENCY_MANAGEMENT.md)** - Complete guide to dependency management
|
|
1615
|
+
- **[PLUGIN_IMPLEMENTATION_COMPLETE.md](./PLUGIN_IMPLEMENTATION_COMPLETE.md)** - Plugin system implementation details
|
|
1616
|
+
|
|
1617
|
+
### Additional Resources
|
|
1618
|
+
- **[Package.json](./package.json)** - Project metadata and scripts
|
|
1619
|
+
- **[TypeScript Source](./src/)** - Full source code
|
|
1620
|
+
|
|
748
1621
|
---
|
|
749
1622
|
|
|
750
1623
|
## License
|
|
@@ -757,22 +1630,46 @@ MIT
|
|
|
757
1630
|
|
|
758
1631
|
- **Repository**: [https://github.com/mensfeld/craftdesk](https://github.com/mensfeld/craftdesk)
|
|
759
1632
|
- **Issues**: [https://github.com/mensfeld/craftdesk/issues](https://github.com/mensfeld/craftdesk/issues)
|
|
760
|
-
- **Registry
|
|
1633
|
+
- **Registry**: Self-hosted registry server available at [CraftDesk Web](../web)
|
|
761
1634
|
|
|
762
1635
|
---
|
|
763
1636
|
|
|
764
1637
|
## Roadmap
|
|
765
1638
|
|
|
1639
|
+
### Completed (v0.3.0)
|
|
766
1640
|
- ✅ Git dependency support
|
|
767
1641
|
- ✅ GitHub URL auto-conversion
|
|
768
1642
|
- ✅ Direct file references
|
|
769
1643
|
- ✅ Monorepo support
|
|
770
1644
|
- ✅ Lockfile-based version control
|
|
771
|
-
-
|
|
772
|
-
-
|
|
773
|
-
-
|
|
774
|
-
-
|
|
1645
|
+
- ✅ Self-hosted registry server support
|
|
1646
|
+
- ✅ ZIP archive extraction for registry crafts
|
|
1647
|
+
- ✅ **Plugin system** with dependency management
|
|
1648
|
+
- ✅ **Auto-install plugin dependencies** (recursive)
|
|
1649
|
+
- ✅ **Settings integration** (.claude/settings.json)
|
|
1650
|
+
- ✅ **MCP server configuration** via plugins
|
|
1651
|
+
- ✅ **Craft wrapping** (--as-plugin flag)
|
|
1652
|
+
- ✅ **Plugin tree visualization**
|
|
1653
|
+
- ✅ **Dependency removal protection**
|
|
1654
|
+
- ✅ SHA-256 checksum verification (MITM protection)
|
|
1655
|
+
- ✅ Registry search and info commands
|
|
1656
|
+
- ✅ `craftdesk publish` command
|
|
1657
|
+
- ✅ `craftdesk outdated` command
|
|
1658
|
+
- ✅ `craftdesk update` command
|
|
1659
|
+
- ✅ **Authentication system** (login/logout/whoami)
|
|
1660
|
+
- ✅ **Private registry authentication** (token-based)
|
|
1661
|
+
- ✅ **Environment variable auth** (CI/CD support)
|
|
1662
|
+
- ✅ Semantic versioning for registry packages
|
|
1663
|
+
|
|
1664
|
+
### Planned
|
|
1665
|
+
- 🔲 Plugin marketplace/directory
|
|
1666
|
+
- 🔲 `craftdesk validate <plugin>` command
|
|
1667
|
+
- 🔲 Multiple dependency versions support
|
|
1668
|
+
- 🔲 Peer dependency warnings
|
|
1669
|
+
- 🔲 Persistent download cache
|
|
1670
|
+
- 🔲 Offline installation mode
|
|
1671
|
+
- 🔲 Interactive dependency conflict resolution
|
|
775
1672
|
|
|
776
1673
|
---
|
|
777
1674
|
|
|
778
|
-
Made for the AI development community
|
|
1675
|
+
Made for the AI development community
|