craftdesk 0.2.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 +968 -92
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +303 -7
- 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 +9 -3
- 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 +52 -11
- 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 +35 -4
- 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 +35 -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 -17
- 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 -370
- 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
|
@@ -1,42 +1,29 @@
|
|
|
1
1
|
# CraftDesk CLI
|
|
2
2
|
|
|
3
|
-
> **Dependency management for AI capabilities** - Install, manage, and version control your Claude Code skills, agents, commands, and
|
|
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
|
---
|
|
11
12
|
|
|
12
|
-
## Table of Contents
|
|
13
|
-
|
|
14
|
-
- [What is CraftDesk?](#what-is-craftdesk)
|
|
15
|
-
- [Installation](#installation)
|
|
16
|
-
- [Quick Start](#quick-start)
|
|
17
|
-
- [Core Concepts](#core-concepts)
|
|
18
|
-
- [Command Reference](#command-reference)
|
|
19
|
-
- [Dependency Sources](#dependency-sources)
|
|
20
|
-
- [Multi-Registry Setup](#multi-registry-setup)
|
|
21
|
-
- [Monorepo Support](#monorepo-support)
|
|
22
|
-
- [craftdesk.json Reference](#craftdeskjson-reference)
|
|
23
|
-
- [craftdesk.lock](#craftdesklock)
|
|
24
|
-
- [CI/CD Integration](#cicd-integration)
|
|
25
|
-
- [Troubleshooting](#troubleshooting)
|
|
26
|
-
- [Development](#development)
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
13
|
## What is CraftDesk?
|
|
31
14
|
|
|
32
15
|
CraftDesk is a package manager for AI capabilities used in Claude Code and other AI development environments. It allows you to:
|
|
33
16
|
|
|
34
|
-
- **Install AI skills, agents, commands, 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
|
|
35
20
|
- **Lock versions** for reproducible environments across teams
|
|
36
|
-
- **Manage dependencies** with automatic
|
|
21
|
+
- **Manage dependencies** with automatic recursive installation
|
|
37
22
|
- **Support monorepos** with subdirectory extraction
|
|
38
23
|
- **Auto-convert GitHub URLs** - paste any GitHub URL (tree/blob)
|
|
39
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
|
|
40
27
|
|
|
41
28
|
Think of it as:
|
|
42
29
|
- **npm** for Node.js → **CraftDesk** for AI capabilities
|
|
@@ -47,9 +34,9 @@ Think of it as:
|
|
|
47
34
|
|
|
48
35
|
---
|
|
49
36
|
|
|
50
|
-
##
|
|
37
|
+
## Quick Start
|
|
51
38
|
|
|
52
|
-
###
|
|
39
|
+
### Install CraftDesk
|
|
53
40
|
|
|
54
41
|
```bash
|
|
55
42
|
npm install -g craftdesk
|
|
@@ -58,30 +45,10 @@ npm install -g craftdesk
|
|
|
58
45
|
Verify installation:
|
|
59
46
|
```bash
|
|
60
47
|
craftdesk --version
|
|
61
|
-
# 0.
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Local Development Setup
|
|
65
|
-
|
|
66
|
-
Clone and link for development:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
git clone https://github.com/mensfeld/craftdesk.git
|
|
70
|
-
cd craftdesk
|
|
71
|
-
npm install
|
|
72
|
-
npm link
|
|
73
|
-
craftdesk --version
|
|
48
|
+
# 0.3.0
|
|
74
49
|
```
|
|
75
50
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- Node.js >= 18.0.0
|
|
79
|
-
- Git (for git dependencies)
|
|
80
|
-
- npm or yarn
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Quick Start
|
|
51
|
+
**Requirements:** Node.js >= 18.0.0, Git, npm or yarn
|
|
85
52
|
|
|
86
53
|
### 1. Initialize a New Project
|
|
87
54
|
|
|
@@ -104,17 +71,17 @@ This creates a `craftdesk.json` file:
|
|
|
104
71
|
### 2. Add Dependencies
|
|
105
72
|
|
|
106
73
|
```bash
|
|
107
|
-
# Add from GitHub (auto-converts web URLs)
|
|
108
|
-
craftdesk add https://github.com/
|
|
74
|
+
# Add a single skill file from GitHub (auto-converts web URLs)
|
|
75
|
+
craftdesk add https://github.com/aviflombaum/rspec-rails-agents/blob/main/rspec-dry-agent.md
|
|
109
76
|
|
|
110
77
|
# Add from git repository
|
|
111
|
-
craftdesk add git+https://github.com/
|
|
78
|
+
craftdesk add git+https://github.com/aviflombaum/rspec-rails-agents.git
|
|
112
79
|
|
|
113
80
|
# Add from monorepo subdirectory
|
|
114
|
-
craftdesk add https://github.com/
|
|
81
|
+
craftdesk add https://github.com/technicalpickles/pickled-claude-plugins/tree/main/plugins/working-in-monorepos/skills/working-in-monorepos
|
|
115
82
|
|
|
116
83
|
# Add with explicit type
|
|
117
|
-
craftdesk add https://github.com/
|
|
84
|
+
craftdesk add https://github.com/aviflombaum/rspec-rails-agents/blob/main/rspec-dry-agent.md --type agent
|
|
118
85
|
```
|
|
119
86
|
|
|
120
87
|
### 3. Install Everything
|
|
@@ -144,6 +111,40 @@ Total: 2 crafts installed
|
|
|
144
111
|
|
|
145
112
|
---
|
|
146
113
|
|
|
114
|
+
## Table of Contents
|
|
115
|
+
|
|
116
|
+
- [What is CraftDesk?](#what-is-craftdesk)
|
|
117
|
+
- [Quick Start](#quick-start)
|
|
118
|
+
- [Core Concepts](#core-concepts)
|
|
119
|
+
- [Crafts](#crafts)
|
|
120
|
+
- [Collections](#collections)
|
|
121
|
+
- [Plugin System](#plugin-system)
|
|
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)
|
|
137
|
+
- [Dependency Sources](#dependency-sources)
|
|
138
|
+
- [Monorepo Support](#monorepo-support)
|
|
139
|
+
- [craftdesk.json Reference](#craftdeskjson-reference)
|
|
140
|
+
- [craftdesk.lock](#craftdesklock)
|
|
141
|
+
- [CI/CD Integration](#cicd-integration)
|
|
142
|
+
- [Troubleshooting](#troubleshooting)
|
|
143
|
+
- [Development](#development)
|
|
144
|
+
- [Documentation](#documentation)
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
147
148
|
## Core Concepts
|
|
148
149
|
|
|
149
150
|
### Crafts
|
|
@@ -153,6 +154,221 @@ A **craft** is any AI capability:
|
|
|
153
154
|
- **Agent** - Autonomous task executor (e.g., code-reviewer, test-runner)
|
|
154
155
|
- **Command** - Slash command (e.g., /deploy, /analyze)
|
|
155
156
|
- **Hook** - Event handler (e.g., pre-commit, post-install)
|
|
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.
|
|
156
372
|
|
|
157
373
|
### Manifest File: craftdesk.json
|
|
158
374
|
|
|
@@ -193,11 +409,31 @@ Records exact versions installed (like package-lock.json or Gemfile.lock):
|
|
|
193
409
|
|
|
194
410
|
**Always commit this file to version control!**
|
|
195
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
|
+
|
|
196
431
|
### Install Directory
|
|
197
432
|
|
|
198
433
|
By default, crafts install to `.claude/` in your project:
|
|
199
434
|
```
|
|
200
435
|
.claude/
|
|
436
|
+
├── settings.json # Plugin configuration (auto-generated)
|
|
201
437
|
├── skills/
|
|
202
438
|
│ ├── ruby-on-rails/
|
|
203
439
|
│ └── postgres-expert/
|
|
@@ -205,10 +441,195 @@ By default, crafts install to `.claude/` in your project:
|
|
|
205
441
|
│ └── code-reviewer/
|
|
206
442
|
├── commands/
|
|
207
443
|
│ └── deploy/
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
481
|
+
```
|
|
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
|
|
210
600
|
```
|
|
211
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
|
+
|
|
212
633
|
---
|
|
213
634
|
|
|
214
635
|
## Command Reference
|
|
@@ -221,7 +642,7 @@ Initialize a new craftdesk.json file.
|
|
|
221
642
|
- `-y, --yes` - Skip prompts and use defaults
|
|
222
643
|
- `-n, --name <name>` - Project name (default: directory name)
|
|
223
644
|
- `-v, --version <version>` - Project version (default: "1.0.0")
|
|
224
|
-
- `-t, --type <type>` - Project type: skill, agent, command, or
|
|
645
|
+
- `-t, --type <type>` - Project type: skill, agent, command, hook, plugin, or collection (default: "skill")
|
|
225
646
|
- `-d, --description <desc>` - Project description
|
|
226
647
|
- `-a, --author <author>` - Author name
|
|
227
648
|
- `-l, --license <license>` - License (default: "MIT")
|
|
@@ -280,7 +701,7 @@ Add a new dependency and install it immediately.
|
|
|
280
701
|
- `-D, --save-dev` - Save as devDependency
|
|
281
702
|
- `-O, --save-optional` - Save as optionalDependency
|
|
282
703
|
- `-E, --save-exact` - Save exact version (no ^ or ~)
|
|
283
|
-
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook)
|
|
704
|
+
- `-t, --type <type>` - Specify craft type (skill, agent, command, hook, plugin, collection)
|
|
284
705
|
|
|
285
706
|
**Examples:**
|
|
286
707
|
|
|
@@ -356,6 +777,253 @@ Total: 3 crafts installed
|
|
|
356
777
|
|
|
357
778
|
---
|
|
358
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
|
+
|
|
359
1027
|
### Global Options
|
|
360
1028
|
|
|
361
1029
|
Available for all commands:
|
|
@@ -375,9 +1043,75 @@ craftdesk init --help
|
|
|
375
1043
|
|
|
376
1044
|
## Dependency Sources
|
|
377
1045
|
|
|
378
|
-
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
|
|
1058
|
+
|
|
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.
|
|
379
1085
|
|
|
380
|
-
|
|
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)
|
|
381
1115
|
|
|
382
1116
|
Simply paste any GitHub URL - it auto-converts to the correct format:
|
|
383
1117
|
|
|
@@ -392,7 +1126,7 @@ craftdesk add https://github.com/user/repo/blob/main/agent.md
|
|
|
392
1126
|
craftdesk add https://github.com/user/repo
|
|
393
1127
|
```
|
|
394
1128
|
|
|
395
|
-
###
|
|
1129
|
+
### 3. Git Dependencies
|
|
396
1130
|
|
|
397
1131
|
From git repositories:
|
|
398
1132
|
|
|
@@ -423,26 +1157,60 @@ From git repositories:
|
|
|
423
1157
|
- `path` - Subdirectory within repo (for monorepos)
|
|
424
1158
|
- `file` - Direct file path (for single-file crafts)
|
|
425
1159
|
|
|
426
|
-
|
|
1160
|
+
---
|
|
427
1161
|
|
|
428
|
-
|
|
1162
|
+
## Monorepo Support
|
|
429
1163
|
|
|
430
|
-
|
|
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.
|
|
431
1165
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
|
439
1179
|
```
|
|
440
1180
|
|
|
441
|
-
|
|
1181
|
+
CraftDesk automatically converts these to the correct git syntax and extracts only the specified subdirectory or file.
|
|
442
1182
|
|
|
443
|
-
|
|
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
|
|
1190
|
+
|
|
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
|
|
444
1212
|
|
|
445
|
-
|
|
1213
|
+
Multiple crafts from the same monorepo:
|
|
446
1214
|
|
|
447
1215
|
```json
|
|
448
1216
|
{
|
|
@@ -457,41 +1225,90 @@ Install multiple crafts from the same git repository using subdirectory paths:
|
|
|
457
1225
|
"tag": "v3.2.0",
|
|
458
1226
|
"path": "agents/processor"
|
|
459
1227
|
},
|
|
460
|
-
"
|
|
1228
|
+
"deploy-script": {
|
|
461
1229
|
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
462
1230
|
"tag": "v3.2.0",
|
|
463
|
-
"
|
|
1231
|
+
"file": "scripts/deploy.md"
|
|
464
1232
|
}
|
|
465
1233
|
}
|
|
466
1234
|
}
|
|
467
1235
|
```
|
|
468
1236
|
|
|
469
|
-
**
|
|
470
|
-
-
|
|
471
|
-
-
|
|
472
|
-
-
|
|
473
|
-
-
|
|
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
|
|
474
1253
|
|
|
475
|
-
**Monorepo structure example:**
|
|
476
1254
|
```
|
|
477
1255
|
ai-crafts-monorepo/
|
|
478
1256
|
├── skills/
|
|
479
1257
|
│ ├── auth/
|
|
480
1258
|
│ │ ├── craftdesk.json
|
|
481
1259
|
│ │ └── SKILL.md
|
|
1260
|
+
│ ├── database/
|
|
1261
|
+
│ │ ├── craftdesk.json
|
|
1262
|
+
│ │ └── SKILL.md
|
|
482
1263
|
│ └── reporting/
|
|
483
1264
|
│ ├── craftdesk.json
|
|
484
1265
|
│ └── SKILL.md
|
|
485
1266
|
├── agents/
|
|
486
|
-
│
|
|
1267
|
+
│ ├── code-reviewer/
|
|
1268
|
+
│ │ ├── craftdesk.json
|
|
1269
|
+
│ │ └── AGENT.md
|
|
1270
|
+
│ └── test-runner/
|
|
487
1271
|
│ ├── craftdesk.json
|
|
488
1272
|
│ └── AGENT.md
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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
|
+
}
|
|
493
1299
|
```
|
|
494
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
|
|
1308
|
+
```
|
|
1309
|
+
|
|
1310
|
+
This installs only the `working-in-monorepos` skill from the deeply nested monorepo structure.
|
|
1311
|
+
|
|
495
1312
|
---
|
|
496
1313
|
|
|
497
1314
|
## craftdesk.json Reference
|
|
@@ -549,7 +1366,7 @@ Complete specification of the craftdesk.json format:
|
|
|
549
1366
|
|-------|------|----------|-------------|
|
|
550
1367
|
| `name` | string | Yes | Craft name (lowercase, no spaces) |
|
|
551
1368
|
| `version` | string | Yes | Semantic version (e.g., "1.0.0") |
|
|
552
|
-
| `type` | string | No | Craft type: skill, agent, command, hook |
|
|
1369
|
+
| `type` | string | No | Craft type: skill, agent, command, hook, plugin, collection |
|
|
553
1370
|
| `description` | string | No | Short description |
|
|
554
1371
|
| `author` | string | No | Author name and email |
|
|
555
1372
|
| `license` | string | No | License identifier (e.g., "MIT") |
|
|
@@ -761,11 +1578,46 @@ npm test
|
|
|
761
1578
|
|
|
762
1579
|
### Publishing
|
|
763
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:**
|
|
764
1598
|
```bash
|
|
765
1599
|
npm version patch
|
|
766
|
-
|
|
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
|
|
767
1604
|
```
|
|
768
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
|
+
|
|
769
1621
|
---
|
|
770
1622
|
|
|
771
1623
|
## License
|
|
@@ -778,22 +1630,46 @@ MIT
|
|
|
778
1630
|
|
|
779
1631
|
- **Repository**: [https://github.com/mensfeld/craftdesk](https://github.com/mensfeld/craftdesk)
|
|
780
1632
|
- **Issues**: [https://github.com/mensfeld/craftdesk/issues](https://github.com/mensfeld/craftdesk/issues)
|
|
781
|
-
- **Registry
|
|
1633
|
+
- **Registry**: Self-hosted registry server available at [CraftDesk Web](../web)
|
|
782
1634
|
|
|
783
1635
|
---
|
|
784
1636
|
|
|
785
1637
|
## Roadmap
|
|
786
1638
|
|
|
1639
|
+
### Completed (v0.3.0)
|
|
787
1640
|
- ✅ Git dependency support
|
|
788
1641
|
- ✅ GitHub URL auto-conversion
|
|
789
1642
|
- ✅ Direct file references
|
|
790
1643
|
- ✅ Monorepo support
|
|
791
1644
|
- ✅ Lockfile-based version control
|
|
792
|
-
-
|
|
793
|
-
-
|
|
794
|
-
-
|
|
795
|
-
-
|
|
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
|
|
796
1672
|
|
|
797
1673
|
---
|
|
798
1674
|
|
|
799
|
-
Made for the AI development community
|
|
1675
|
+
Made for the AI development community
|