overskill 1.0.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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/commands/add.d.ts +3 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +121 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/bundle.d.ts +3 -0
  8. package/dist/commands/bundle.d.ts.map +1 -0
  9. package/dist/commands/bundle.js +58 -0
  10. package/dist/commands/bundle.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +109 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/delete.d.ts +3 -0
  16. package/dist/commands/delete.d.ts.map +1 -0
  17. package/dist/commands/delete.js +64 -0
  18. package/dist/commands/delete.js.map +1 -0
  19. package/dist/commands/diff.d.ts +3 -0
  20. package/dist/commands/diff.d.ts.map +1 -0
  21. package/dist/commands/diff.js +93 -0
  22. package/dist/commands/diff.js.map +1 -0
  23. package/dist/commands/edit.d.ts +3 -0
  24. package/dist/commands/edit.d.ts.map +1 -0
  25. package/dist/commands/edit.js +69 -0
  26. package/dist/commands/edit.js.map +1 -0
  27. package/dist/commands/import.d.ts +3 -0
  28. package/dist/commands/import.d.ts.map +1 -0
  29. package/dist/commands/import.js +514 -0
  30. package/dist/commands/import.js.map +1 -0
  31. package/dist/commands/info.d.ts +3 -0
  32. package/dist/commands/info.d.ts.map +1 -0
  33. package/dist/commands/info.js +89 -0
  34. package/dist/commands/info.js.map +1 -0
  35. package/dist/commands/init.d.ts +3 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +88 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/list.d.ts +3 -0
  40. package/dist/commands/list.d.ts.map +1 -0
  41. package/dist/commands/list.js +84 -0
  42. package/dist/commands/list.js.map +1 -0
  43. package/dist/commands/login.d.ts +3 -0
  44. package/dist/commands/login.d.ts.map +1 -0
  45. package/dist/commands/login.js +143 -0
  46. package/dist/commands/login.js.map +1 -0
  47. package/dist/commands/new.d.ts +3 -0
  48. package/dist/commands/new.d.ts.map +1 -0
  49. package/dist/commands/new.js +262 -0
  50. package/dist/commands/new.js.map +1 -0
  51. package/dist/commands/publish.d.ts +3 -0
  52. package/dist/commands/publish.d.ts.map +1 -0
  53. package/dist/commands/publish.js +215 -0
  54. package/dist/commands/publish.js.map +1 -0
  55. package/dist/commands/push.d.ts +3 -0
  56. package/dist/commands/push.d.ts.map +1 -0
  57. package/dist/commands/push.js +151 -0
  58. package/dist/commands/push.js.map +1 -0
  59. package/dist/commands/registry.d.ts +3 -0
  60. package/dist/commands/registry.d.ts.map +1 -0
  61. package/dist/commands/registry.js +169 -0
  62. package/dist/commands/registry.js.map +1 -0
  63. package/dist/commands/remove.d.ts +3 -0
  64. package/dist/commands/remove.d.ts.map +1 -0
  65. package/dist/commands/remove.js +48 -0
  66. package/dist/commands/remove.js.map +1 -0
  67. package/dist/commands/search.d.ts +3 -0
  68. package/dist/commands/search.d.ts.map +1 -0
  69. package/dist/commands/search.js +48 -0
  70. package/dist/commands/search.js.map +1 -0
  71. package/dist/commands/sync.d.ts +3 -0
  72. package/dist/commands/sync.d.ts.map +1 -0
  73. package/dist/commands/sync.js +160 -0
  74. package/dist/commands/sync.js.map +1 -0
  75. package/dist/commands/update.d.ts +3 -0
  76. package/dist/commands/update.d.ts.map +1 -0
  77. package/dist/commands/update.js +130 -0
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/commands/validate.d.ts +3 -0
  80. package/dist/commands/validate.d.ts.map +1 -0
  81. package/dist/commands/validate.js +94 -0
  82. package/dist/commands/validate.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +56 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/lib/api.d.ts +60 -0
  88. package/dist/lib/api.d.ts.map +1 -0
  89. package/dist/lib/api.js +340 -0
  90. package/dist/lib/api.js.map +1 -0
  91. package/dist/lib/auth.d.ts +78 -0
  92. package/dist/lib/auth.d.ts.map +1 -0
  93. package/dist/lib/auth.js +241 -0
  94. package/dist/lib/auth.js.map +1 -0
  95. package/dist/lib/config.d.ts +94 -0
  96. package/dist/lib/config.d.ts.map +1 -0
  97. package/dist/lib/config.js +294 -0
  98. package/dist/lib/config.js.map +1 -0
  99. package/dist/lib/editor.d.ts +6 -0
  100. package/dist/lib/editor.d.ts.map +1 -0
  101. package/dist/lib/editor.js +60 -0
  102. package/dist/lib/editor.js.map +1 -0
  103. package/dist/lib/fs.d.ts +74 -0
  104. package/dist/lib/fs.d.ts.map +1 -0
  105. package/dist/lib/fs.js +235 -0
  106. package/dist/lib/fs.js.map +1 -0
  107. package/dist/lib/index-gen.d.ts +18 -0
  108. package/dist/lib/index-gen.d.ts.map +1 -0
  109. package/dist/lib/index-gen.js +75 -0
  110. package/dist/lib/index-gen.js.map +1 -0
  111. package/dist/lib/local-registry/index.d.ts +15 -0
  112. package/dist/lib/local-registry/index.d.ts.map +1 -0
  113. package/dist/lib/local-registry/index.js +18 -0
  114. package/dist/lib/local-registry/index.js.map +1 -0
  115. package/dist/lib/local-registry/objects.d.ts +51 -0
  116. package/dist/lib/local-registry/objects.d.ts.map +1 -0
  117. package/dist/lib/local-registry/objects.js +148 -0
  118. package/dist/lib/local-registry/objects.js.map +1 -0
  119. package/dist/lib/local-registry/paths.d.ts +53 -0
  120. package/dist/lib/local-registry/paths.d.ts.map +1 -0
  121. package/dist/lib/local-registry/paths.js +85 -0
  122. package/dist/lib/local-registry/paths.js.map +1 -0
  123. package/dist/lib/local-registry/skills.d.ts +83 -0
  124. package/dist/lib/local-registry/skills.d.ts.map +1 -0
  125. package/dist/lib/local-registry/skills.js +261 -0
  126. package/dist/lib/local-registry/skills.js.map +1 -0
  127. package/dist/lib/local-registry/types.d.ts +79 -0
  128. package/dist/lib/local-registry/types.d.ts.map +1 -0
  129. package/dist/lib/local-registry/types.js +5 -0
  130. package/dist/lib/local-registry/types.js.map +1 -0
  131. package/dist/lib/local-registry/versions.d.ts +61 -0
  132. package/dist/lib/local-registry/versions.d.ts.map +1 -0
  133. package/dist/lib/local-registry/versions.js +163 -0
  134. package/dist/lib/local-registry/versions.js.map +1 -0
  135. package/dist/lib/lockfile.d.ts +38 -0
  136. package/dist/lib/lockfile.d.ts.map +1 -0
  137. package/dist/lib/lockfile.js +102 -0
  138. package/dist/lib/lockfile.js.map +1 -0
  139. package/dist/lib/meta-skill.d.ts +6 -0
  140. package/dist/lib/meta-skill.d.ts.map +1 -0
  141. package/dist/lib/meta-skill.js +72 -0
  142. package/dist/lib/meta-skill.js.map +1 -0
  143. package/dist/lib/semver.d.ts +63 -0
  144. package/dist/lib/semver.d.ts.map +1 -0
  145. package/dist/lib/semver.js +107 -0
  146. package/dist/lib/semver.js.map +1 -0
  147. package/dist/types.d.ts +147 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +8 -0
  150. package/dist/types.js.map +1 -0
  151. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jacob Chase-Lubitz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,261 @@
1
+ # Overskill
2
+
3
+ A CLI for managing skills across repositories.
4
+
5
+ ## Why Overskill over AI Agent Plugins?
6
+
7
+ Tools like Claude Code offer built-in plugin systems for distributing skills. Overskill takes a different approach — skills live in your repo as plain files — and this comes with meaningful advantages:
8
+
9
+ - **Agent-agnostic**: Overskill skills work with Claude Code, Cursor, Codex, Windsurf, and any agent that can read markdown. Plugins lock you into a single tool.
10
+ - **Transparent and auditable**: Skills are visible files in your project. You can read, diff, and review them like any other code. Plugin skills are buried in global cache directories.
11
+ - **Version-locked per repo**: `.skills.lock` pins exact versions and hashes to each commit, giving you reproducible builds. Plugins are installed globally or per-user with no per-repo lockfile.
12
+ - **Team-friendly**: `skill sync` works like `npm install` — clone the repo, run one command, and everyone has the same skills at the same versions. Plugins require each developer to install them separately.
13
+ - **Full control over activation**: You decide how and when skills are loaded via `CLAUDE.md`, `.cursor/rules`, or `AGENTS.md`. Plugin activation is controlled by the agent vendor.
14
+ - **Works offline**: Once synced, skills are local files with no runtime dependency on external services.
15
+ - **No vendor dependency**: Your skills aren't tied to a plugin API that could change or be deprecated. They're markdown files — the most durable format there is.
16
+
17
+ ## Requirements
18
+
19
+ - Node.js >= 18
20
+
21
+ ## Setup
22
+
23
+ ### CLI
24
+
25
+ 1. Install dependencies and build:
26
+
27
+ ```bash
28
+ cd cli
29
+ npm install
30
+ npm run build
31
+ ```
32
+
33
+ 2. Run the CLI:
34
+
35
+
36
+ ```bash
37
+ node dist/index.js --help
38
+ ```
39
+
40
+ Optional: link the CLI for a global `skill` command:
41
+
42
+ ```bash
43
+ npm link
44
+ skill --help
45
+ ```
46
+
47
+ ## CLI Quick Start
48
+
49
+ ### Local-Only Workflow (No Cloud)
50
+
51
+ 1. Initialize a local-only project:
52
+
53
+ ```bash
54
+ skill init
55
+ ```
56
+
57
+ 2. Create a new skill:
58
+
59
+ ```bash
60
+ skill new my-skill
61
+ ```
62
+
63
+ 3. Add skills from local cache:
64
+
65
+ ```bash
66
+ skill add my-skill
67
+ ```
68
+
69
+ 4. Import skills from other tools (Claude, Cursor, Codex):
70
+
71
+ ```bash
72
+ skill import
73
+ ```
74
+
75
+ ### Cloud Workflow (Coming Soon)
76
+
77
+ 1. Configure the API URL:
78
+
79
+ ```bash
80
+ skill config api_url https://your-domain.example/api
81
+ ```
82
+
83
+ 2. Initialize with cloud registry:
84
+
85
+ ```bash
86
+ skill init --cloud --registry your-registry
87
+ ```
88
+
89
+ 3. Log in:
90
+
91
+ ```bash
92
+ skill login
93
+ ```
94
+
95
+ 4. Add and sync skills:
96
+
97
+ ```bash
98
+ skill add my-skill
99
+ skill sync
100
+ ```
101
+
102
+ ## Commands
103
+
104
+ ### Configuration
105
+
106
+ - `skill config <key> [value]` - Get or set config (`api_url`, `editor`, `install_path`)
107
+ - `skill config show` - Show all config
108
+ - `skill config logout` - Clear authentication tokens
109
+
110
+ ### Project Setup
111
+
112
+ - `skill init [options]` - Initialize `.skills.yaml` in current directory. Also configures AI agent integration files (see [AI Agent Integration](#ai-agent-integration)).
113
+ - `--cloud` - Include a cloud registry source
114
+ - `-u, --url <url>` - API URL for cloud registry (requires `--cloud`)
115
+ - `-r, --registry <slug>` - Cloud registry slug (requires `--cloud`)
116
+ - `-p, --path <path>` - Custom install path (default: `.skills`)
117
+
118
+ ### Authentication
119
+
120
+ - `skill login [--manual]` - Authenticate with cloud registry (browser flow or manual code entry)
121
+
122
+ ### Skill Creation & Management
123
+
124
+ - `skill new <slug> [options]` - Create a new skill in local registry
125
+ - `-n, --name <name>` - Display name
126
+ - `-d, --description <desc>` - Description
127
+ - `-t, --tags <tags>` - Comma-separated tags
128
+ - `-c, --compat <compat>` - Compatibility list (e.g., `claude,gpt4`)
129
+ - `-v, --version <version>` - Initial version (default: `1.0.0`)
130
+ - `-m, --metadata <key=value>` - Custom frontmatter metadata (repeatable)
131
+ - `--content <file>` - Read content from file instead of editor
132
+ - `--blank` - Open editor with blank content (frontmatter only)
133
+ - `--no-editor` - Skip editor, create with template
134
+ - `--no-add` - Skip adding to current project
135
+ - `--no-sync` - Skip automatic sync
136
+
137
+ - `skill publish <slug> [options]` - Publish a new version of existing skill
138
+ - `-v, --version <version>` - Explicit version number
139
+ - `--patch` - Bump patch version (1.0.0 → 1.0.1)
140
+ - `--minor` - Bump minor version (1.0.0 → 1.1.0)
141
+ - `--major` - Bump major version (1.0.0 → 2.0.0)
142
+ - `-m, --message <message>` - Changelog message
143
+ - `--content <file>` - Read content from file
144
+ - `--no-editor` - Skip editor, use current content
145
+
146
+ - `skill import [path] [options]` - Import skills from other AI tools
147
+ - `[path]` - Custom path to scan (optional)
148
+ - `-f, --force` - Overwrite existing skills
149
+ - `--add` - Add imported skills to `.skills.yaml`
150
+ - `--sync` - Run sync after importing (requires `--add`)
151
+ - `--dry-run` - Preview without making changes
152
+ - `-y, --yes` - Import all without prompting
153
+
154
+ ### Project Operations
155
+
156
+ - `skill add [slugs...] [options]` - Add skills to project
157
+ - Interactive mode if no slugs provided (checkbox selection)
158
+ - `-v, --version <constraint>` - Version constraint (e.g., `>=1.0.0`, `^2.0.0`)
159
+ - `--no-sync` - Skip automatic sync after adding
160
+
161
+ - `skill remove <slugs...>` - Remove skills from project
162
+
163
+ - `skill sync [options]` - Sync configured skills to install directory. Also updates AI agent integration files (see [AI Agent Integration](#ai-agent-integration)).
164
+ - `-f, --force` - Force re-install even if unchanged
165
+
166
+ - `skill update [slug] [--check]` - Update to latest versions
167
+
168
+ ### Discovery & Information
169
+
170
+ - `skill list [options]` - List available skills
171
+ - `--installed` - Show only installed skills in current project
172
+ - `--local` - Show only local registry skills
173
+
174
+ - `skill search <query> [options]` - Search for skills
175
+ - `-t, --tags <tags>` - Filter by tags
176
+ - `-c, --compat <compat>` - Filter by compatibility
177
+
178
+ - `skill info <slug> [options]` - Show detailed skill information
179
+ - `-v, --version <version>` - Show info for specific version
180
+
181
+ ### Editing & Validation
182
+
183
+ - `skill edit <slug>` - Edit a local skill using configured editor
184
+
185
+ - `skill diff <slug>` - Show differences between local and registry versions
186
+
187
+ - `skill validate [slug]` - Validate skill files (validates all if no slug provided)
188
+
189
+ ## Project Files
190
+
191
+ - `.skills.yaml` - Project config (sources, install path, skills list)
192
+ - `.skills.lock` - Version lock file (like package-lock.json)
193
+ - `.skills/` - Installed skills directory (default, configurable)
194
+ - `SKILLS_INDEX.md` - Generated index of installed skills for AI discovery
195
+
196
+ ## AI Agent Integration
197
+
198
+ When you run `skill init` or `skill sync`, Overskill automatically configures your project so that AI coding agents discover and use your installed skills. It updates the following files:
199
+
200
+ - **`CLAUDE.md`** — Claude Code reads this file automatically. Overskill adds a managed section that points Claude to `SKILLS_INDEX.md`.
201
+ - **`AGENTS.md`** — Read by Codex and other agents. Same managed section as `CLAUDE.md`.
202
+ - **`.cursor/rules/overskill.mdc`** — Cursor rule with `alwaysApply: true` that tells Cursor to read the skills index.
203
+
204
+ The `CLAUDE.md` and `AGENTS.md` sections are wrapped in `<!-- overskill-start -->` / `<!-- overskill-end -->` comment markers so they can be updated idempotently without affecting the rest of the file. The Cursor rule is a standalone file that gets overwritten on each sync.
205
+
206
+
207
+ ## Local Registry
208
+
209
+ Skills are cached locally in `~/.local/share/overskill/cache/` (Linux/macOS) or equivalent on Windows. The local registry supports:
210
+
211
+ - Creating skills with `skill new`
212
+ - Publishing versions with `skill publish`
213
+ - Importing from other tools with `skill import`
214
+ - Version resolution with semver constraints
215
+
216
+ # Coming for Cloud
217
+
218
+ ### Commands for Cloud
219
+
220
+ - `skill login [--manual]` - Authenticate with cloud registry (browser flow or manual code entry)
221
+
222
+ - `skill config api_url <url>` - Set the API URL for the cloud registry
223
+
224
+ - `skill config registry <slug>` - Set the registry slug for the cloud registry
225
+
226
+ - `skill config install_path <path>` - Set the install path for the cloud registry
227
+
228
+ ### Publishing & Sharing
229
+
230
+ - `skill push [slug] [--create ...]` - Publish changes to cloud registry
231
+
232
+ - `skill bundle [slugs...] [options]` - Bundle skills into single markdown file
233
+ - `[slugs...]` - Specific skills to bundle (bundles all if omitted)
234
+ - `-o, --output <path>` - Output file path (default: `skills-bundle.md`)
235
+
236
+ - `skill delete <skill>` - Delete skill from registry
237
+ - Local: `skill delete <slug>`
238
+ - Remote: `skill delete <registry>/<slug>`
239
+
240
+ ### Registry Management
241
+
242
+ - `skill registry <subcommand>` - Manage registries and invitations
243
+ - See `skill registry --help` for subcommands
244
+
245
+
246
+
247
+ ## Development
248
+
249
+ - CLI dev mode:
250
+
251
+ ```bash
252
+ cd cli
253
+ npm run dev
254
+ ```
255
+
256
+ - Typecheck:
257
+
258
+ ```bash
259
+ cd cli
260
+ npm run typecheck
261
+ ```
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const addCommand: Command;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAsInB,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { checkbox } from '@inquirer/prompts';
5
+ import * as config from '../lib/config.js';
6
+ import * as localRegistry from '../lib/local-registry/index.js';
7
+ export const addCommand = new Command('add')
8
+ .description('Add one or more skills to the project')
9
+ .argument('[slugs...]', 'Skill slugs to add')
10
+ .option('-v, --version <constraint>', 'Version constraint (e.g., ">=1.0.0", "^2.0.0")')
11
+ .option('--no-sync', 'Skip automatic sync after adding')
12
+ .action(async (slugs, options) => {
13
+ try {
14
+ // Check if initialized
15
+ if (!config.configExists()) {
16
+ console.log(chalk.red('Error: Not in a skills project.'));
17
+ console.log(`Run ${chalk.cyan('skills init')} first.`);
18
+ process.exit(1);
19
+ }
20
+ const skillsConfig = config.readConfig();
21
+ // If no slugs provided, show interactive selection
22
+ if (!slugs || slugs.length === 0) {
23
+ const allSkills = localRegistry.listSkills();
24
+ if (allSkills.length === 0) {
25
+ console.log(chalk.yellow('No skills available in local cache.'));
26
+ console.log('');
27
+ console.log('To add skills, either:');
28
+ console.log(` ${chalk.cyan('skills new <slug>')} Create a new skill`);
29
+ console.log(` ${chalk.cyan('skills cache import <path>')} Import from a file`);
30
+ return;
31
+ }
32
+ // Filter out already added skills
33
+ const availableSkills = allSkills.filter((skill) => !skillsConfig.skills.find((s) => s.slug === skill.slug));
34
+ if (availableSkills.length === 0) {
35
+ console.log(chalk.yellow('All available skills are already added to this project.'));
36
+ return;
37
+ }
38
+ // Show interactive checkbox prompt
39
+ const selected = await checkbox({
40
+ message: 'Select skills to add (use spacebar to select, enter to confirm):',
41
+ choices: availableSkills.map((skill) => ({
42
+ name: `${chalk.green(skill.slug)} - ${skill.meta.description || 'No description'}`,
43
+ value: skill.slug,
44
+ })),
45
+ });
46
+ if (selected.length === 0) {
47
+ console.log(chalk.yellow('No skills selected.'));
48
+ return;
49
+ }
50
+ slugs = selected;
51
+ }
52
+ const addedSkills = [];
53
+ for (const slug of slugs) {
54
+ const spinner = ora(`Adding ${slug}...`).start();
55
+ try {
56
+ // Check if skill exists in local registry
57
+ if (!localRegistry.skillExists(slug)) {
58
+ spinner.fail(`Skill '${slug}' not found in local cache.`);
59
+ console.log('');
60
+ console.log('To add this skill, either:');
61
+ console.log(` ${chalk.cyan(`skills new ${slug}`)} Create it locally`);
62
+ console.log(` ${chalk.cyan(`skills cache import <path>`)} Import from a file`);
63
+ continue;
64
+ }
65
+ // Get skill info from local registry
66
+ const skillInfo = localRegistry.getSkillInfo(slug);
67
+ if (!skillInfo) {
68
+ spinner.fail(`Could not read skill '${slug}' from cache.`);
69
+ continue;
70
+ }
71
+ // Check if already added
72
+ const existing = skillsConfig.skills.find((s) => s.slug === slug);
73
+ if (existing) {
74
+ spinner.warn(`${slug} already added to project`);
75
+ continue;
76
+ }
77
+ // Resolve version if constraint provided
78
+ let resolvedVersion = null;
79
+ if (options.version) {
80
+ resolvedVersion = localRegistry.resolveVersion(slug, options.version);
81
+ if (!resolvedVersion) {
82
+ const availableVersions = localRegistry.getVersionStrings(slug);
83
+ spinner.fail(`No cached version of '${slug}' satisfies '${options.version}'.`);
84
+ console.log(` Available versions: ${availableVersions.join(', ')}`);
85
+ continue;
86
+ }
87
+ }
88
+ else {
89
+ resolvedVersion = localRegistry.getLatestVersion(slug);
90
+ }
91
+ // Add to config
92
+ const entry = {
93
+ slug,
94
+ };
95
+ if (options.version) {
96
+ entry.version = options.version;
97
+ }
98
+ config.addSkill(entry);
99
+ addedSkills.push(slug);
100
+ const displayVersion = resolvedVersion || localRegistry.getLatestVersion(slug);
101
+ spinner.succeed(`Added ${chalk.cyan(slug)} (v${displayVersion})`);
102
+ }
103
+ catch (error) {
104
+ spinner.fail(error instanceof Error ? error.message : String(error));
105
+ }
106
+ }
107
+ // Sync if skills were added
108
+ if (addedSkills.length > 0 && options.sync !== false) {
109
+ console.log('');
110
+ console.log('Running sync...');
111
+ // Import sync command and run it
112
+ const { syncCommand } = await import('./sync.js');
113
+ await syncCommand.parseAsync(['node', 'skills', 'sync']);
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
118
+ process.exit(1);
119
+ }
120
+ });
121
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const bundleCommand: Command;
3
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SA8DtB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Command } from 'commander';
2
+ import * as nodefs from 'fs';
3
+ import * as path from 'path';
4
+ import chalk from 'chalk';
5
+ import * as config from '../lib/config.js';
6
+ import * as fs from '../lib/fs.js';
7
+ import * as lockfile from '../lib/lockfile.js';
8
+ export const bundleCommand = new Command('bundle')
9
+ .description('Bundle all or selected skills into a single markdown file')
10
+ .argument('[slugs...]', 'Skill slugs to bundle (optional, bundles all if not provided)')
11
+ .option('-o, --output <path>', 'Output file path', 'skills-bundle.md')
12
+ .action(async (slugs, options) => {
13
+ try {
14
+ // Check if initialized
15
+ if (!config.configExists()) {
16
+ console.log(chalk.red('Error: Not in a skills project.'));
17
+ console.log(`Run ${chalk.cyan('skills init')} first.`);
18
+ process.exit(1);
19
+ }
20
+ const skillsToBundle = slugs.length > 0 ? slugs : fs.listLocalSkills();
21
+ if (skillsToBundle.length === 0) {
22
+ console.log(chalk.yellow('No skills to bundle.'));
23
+ return;
24
+ }
25
+ const lock = lockfile.readLockfile();
26
+ const bundleLines = [];
27
+ for (const slug of skillsToBundle) {
28
+ const content = fs.readSkillContent(slug);
29
+ if (!content) {
30
+ console.log(chalk.yellow(`Skipping ${slug}: not found locally`));
31
+ continue;
32
+ }
33
+ const locked = lock?.skills.find((s) => s.slug === slug);
34
+ const registry = locked?.registry || 'unknown';
35
+ const version = locked?.version || 'unknown';
36
+ // Add separator and skill content
37
+ bundleLines.push(`<!-- === SKILL: ${slug} (${registry} v${version}) === -->`);
38
+ bundleLines.push('');
39
+ bundleLines.push(content.trim());
40
+ bundleLines.push('');
41
+ bundleLines.push('');
42
+ }
43
+ // Write bundle file
44
+ const projectRoot = config.findProjectRoot() || process.cwd();
45
+ const outputPath = path.isAbsolute(options.output)
46
+ ? options.output
47
+ : path.join(projectRoot, options.output);
48
+ const bundleContent = bundleLines.join('\n');
49
+ nodefs.writeFileSync(outputPath, bundleContent, 'utf-8');
50
+ const sizeKb = (Buffer.byteLength(bundleContent, 'utf-8') / 1024).toFixed(1);
51
+ console.log(chalk.green(`Bundled ${skillsToBundle.length} skills into ${chalk.cyan(options.output)} (${sizeKb} KB)`));
52
+ }
53
+ catch (error) {
54
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
55
+ process.exit(1);
56
+ }
57
+ });
58
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SA4EtB,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import * as auth from "../lib/auth.js";
4
+ export const configCommand = new Command("config")
5
+ .description("Get or set CLI configuration")
6
+ .argument("<key>", "Configuration key (api_url, web_app_url, editor, install_path)")
7
+ .argument("[value]", "Value to set (omit to get current value)")
8
+ .action(async (key, value) => {
9
+ try {
10
+ const validKeys = [
11
+ "api_url",
12
+ // "api_key",
13
+ "web_app_url",
14
+ "editor",
15
+ "install_path",
16
+ ];
17
+ if (!validKeys.includes(key)) {
18
+ console.log(chalk.red(`Error: Invalid config key '${key}'`));
19
+ console.log(`Valid keys: ${validKeys.join(", ")}`);
20
+ process.exit(1);
21
+ }
22
+ if (value === undefined) {
23
+ // Get value
24
+ let currentValue;
25
+ switch (key) {
26
+ case "api_url":
27
+ currentValue = auth.getApiUrl();
28
+ break;
29
+ // case 'api_key':
30
+ // currentValue = auth.getApiKey();
31
+ // break;
32
+ case "web_app_url":
33
+ currentValue = auth.getWebAppUrl();
34
+ break;
35
+ case "editor":
36
+ currentValue = auth.getEditor();
37
+ break;
38
+ case "install_path":
39
+ currentValue = auth.getDefaultInstallPath();
40
+ break;
41
+ }
42
+ if (currentValue) {
43
+ console.log(currentValue);
44
+ }
45
+ else {
46
+ console.log(chalk.gray("(not set)"));
47
+ }
48
+ }
49
+ else {
50
+ // Set value
51
+ switch (key) {
52
+ case "api_url":
53
+ auth.setApiUrl(value);
54
+ break;
55
+ case "web_app_url":
56
+ auth.setWebAppUrl(value);
57
+ break;
58
+ case "editor":
59
+ auth.setEditor(value);
60
+ break;
61
+ case "install_path":
62
+ auth.setDefaultInstallPath(value);
63
+ break;
64
+ }
65
+ console.log(chalk.green(`Set ${key} = ${value}`));
66
+ }
67
+ }
68
+ catch (error) {
69
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : error);
70
+ process.exit(1);
71
+ }
72
+ });
73
+ // Add subcommand to show all config
74
+ configCommand
75
+ .command("show")
76
+ .description("Show all configuration")
77
+ .action(() => {
78
+ const allConfig = auth.getAll();
79
+ console.log(chalk.bold("CLI Configuration:"));
80
+ console.log(` Config file: ${chalk.gray(auth.getConfigPath())}`);
81
+ console.log("");
82
+ if (allConfig.api_url) {
83
+ console.log(` api_url: ${allConfig.api_url}`);
84
+ }
85
+ if (allConfig.web_app_url) {
86
+ console.log(` web_app_url: ${allConfig.web_app_url}`);
87
+ }
88
+ if (allConfig.editor) {
89
+ console.log(` editor: ${allConfig.editor}`);
90
+ }
91
+ if (allConfig.install_path) {
92
+ console.log(` install_path: ${allConfig.install_path}`);
93
+ }
94
+ if (allConfig.access_token) {
95
+ console.log(` logged_in: ${chalk.green("yes")}`);
96
+ }
97
+ else {
98
+ console.log(` logged_in: ${chalk.gray("no")}`);
99
+ }
100
+ });
101
+ // Add logout subcommand
102
+ configCommand
103
+ .command("logout")
104
+ .description("Clear authentication tokens")
105
+ .action(() => {
106
+ auth.clearTokens();
107
+ console.log(chalk.green("Logged out successfully."));
108
+ });
109
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const deleteCommand: Command;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA2DtB,CAAC"}