skyboy 0.1.0__tar.gz
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.
- skyboy-0.1.0/LICENSE +21 -0
- skyboy-0.1.0/PKG-INFO +86 -0
- skyboy-0.1.0/README.md +71 -0
- skyboy-0.1.0/pyproject.toml +27 -0
- skyboy-0.1.0/setup.cfg +4 -0
- skyboy-0.1.0/skyboy/__init__.py +3 -0
- skyboy-0.1.0/skyboy/__main__.py +195 -0
- skyboy-0.1.0/skyboy.egg-info/PKG-INFO +86 -0
- skyboy-0.1.0/skyboy.egg-info/SOURCES.txt +10 -0
- skyboy-0.1.0/skyboy.egg-info/dependency_links.txt +1 -0
- skyboy-0.1.0/skyboy.egg-info/entry_points.txt +2 -0
- skyboy-0.1.0/skyboy.egg-info/top_level.txt +1 -0
skyboy-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Skyboy project contributors
|
|
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.
|
skyboy-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: skyboy
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The skyboy CLI: add portable SKILL.md skills to your project with one command.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://skyboy.in
|
|
7
|
+
Project-URL: Source, https://github.com/aijadugar/skyboy
|
|
8
|
+
Keywords: skills,claude,cursor,gemini,mcp,skboy,cli
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
11
|
+
Requires-Python: >=3.9
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
|
|
16
|
+
# skyboy (PyPI)
|
|
17
|
+
|
|
18
|
+
The native Python CLI for the skyboy.in skill directory. This is the Python
|
|
19
|
+
counterpart to the npm `skyboy` package. It intentionally avoids pulling in Node
|
|
20
|
+
at any point, so it reaches the Python-only audience (data science, Kaggle, ML
|
|
21
|
+
eval, etc.).
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pip install skyboy
|
|
27
|
+
# or
|
|
28
|
+
pipx install skyboy
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
skyboy add <slug> [--dir <path>]
|
|
35
|
+
skyboy search <query>
|
|
36
|
+
skyboy list
|
|
37
|
+
skyboy resolve <slug>
|
|
38
|
+
skyboy version
|
|
39
|
+
skyboy help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Add a skill to the Claude Code skills folder.
|
|
46
|
+
skyboy add nextjs-app-router-conventions
|
|
47
|
+
|
|
48
|
+
# Add a skill to a custom folder.
|
|
49
|
+
skyboy add context-window-management --dir .cursor/rules
|
|
50
|
+
|
|
51
|
+
# Search the catalog.
|
|
52
|
+
skyboy search "app router"
|
|
53
|
+
|
|
54
|
+
# List everything available.
|
|
55
|
+
skyboy list
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Parity with the npm CLI
|
|
59
|
+
|
|
60
|
+
This release ships real packaging plus the `add` command, which resolves a slug
|
|
61
|
+
from the shared `catalog.json` manifest (committed to the skyboy repo, fetched
|
|
62
|
+
from raw.githubusercontent.com) and downloads the skill folder files. It also
|
|
63
|
+
covers `search`, `list`, `resolve`, and `version`.
|
|
64
|
+
|
|
65
|
+
The following are documented follow-ups on the npm package, not yet in this
|
|
66
|
+
PyPI release:
|
|
67
|
+
|
|
68
|
+
- Agent-context detection (auto-detecting Claude Code vs. Cursor vs. Windsurf
|
|
69
|
+
from the current directory).
|
|
70
|
+
- The interactive target-folder picker.
|
|
71
|
+
|
|
72
|
+
To choose a target folder directly, pass `--dir` (default `.claude/skills`).
|
|
73
|
+
|
|
74
|
+
## Why a separate manifest?
|
|
75
|
+
|
|
76
|
+
The CLI runs in arbitrary user projects with no local copy of the skyboy repo.
|
|
77
|
+
To stay standalilone, it sources catalog data from a single shareable manifest:
|
|
78
|
+
|
|
79
|
+
`https://raw.githubusercontent.com/aijadugar/skyboy/main/catalog.json`
|
|
80
|
+
|
|
81
|
+
If a local `catalog.json` exists in the current directory, it is used instead
|
|
82
|
+
(useful for offline development and for the repo itself).
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
MIT
|
skyboy-0.1.0/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# skyboy (PyPI)
|
|
2
|
+
|
|
3
|
+
The native Python CLI for the skyboy.in skill directory. This is the Python
|
|
4
|
+
counterpart to the npm `skyboy` package. It intentionally avoids pulling in Node
|
|
5
|
+
at any point, so it reaches the Python-only audience (data science, Kaggle, ML
|
|
6
|
+
eval, etc.).
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install skyboy
|
|
12
|
+
# or
|
|
13
|
+
pipx install skyboy
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
skyboy add <slug> [--dir <path>]
|
|
20
|
+
skyboy search <query>
|
|
21
|
+
skyboy list
|
|
22
|
+
skyboy resolve <slug>
|
|
23
|
+
skyboy version
|
|
24
|
+
skyboy help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Add a skill to the Claude Code skills folder.
|
|
31
|
+
skyboy add nextjs-app-router-conventions
|
|
32
|
+
|
|
33
|
+
# Add a skill to a custom folder.
|
|
34
|
+
skyboy add context-window-management --dir .cursor/rules
|
|
35
|
+
|
|
36
|
+
# Search the catalog.
|
|
37
|
+
skyboy search "app router"
|
|
38
|
+
|
|
39
|
+
# List everything available.
|
|
40
|
+
skyboy list
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Parity with the npm CLI
|
|
44
|
+
|
|
45
|
+
This release ships real packaging plus the `add` command, which resolves a slug
|
|
46
|
+
from the shared `catalog.json` manifest (committed to the skyboy repo, fetched
|
|
47
|
+
from raw.githubusercontent.com) and downloads the skill folder files. It also
|
|
48
|
+
covers `search`, `list`, `resolve`, and `version`.
|
|
49
|
+
|
|
50
|
+
The following are documented follow-ups on the npm package, not yet in this
|
|
51
|
+
PyPI release:
|
|
52
|
+
|
|
53
|
+
- Agent-context detection (auto-detecting Claude Code vs. Cursor vs. Windsurf
|
|
54
|
+
from the current directory).
|
|
55
|
+
- The interactive target-folder picker.
|
|
56
|
+
|
|
57
|
+
To choose a target folder directly, pass `--dir` (default `.claude/skills`).
|
|
58
|
+
|
|
59
|
+
## Why a separate manifest?
|
|
60
|
+
|
|
61
|
+
The CLI runs in arbitrary user projects with no local copy of the skyboy repo.
|
|
62
|
+
To stay standalilone, it sources catalog data from a single shareable manifest:
|
|
63
|
+
|
|
64
|
+
`https://raw.githubusercontent.com/aijadugar/skyboy/main/catalog.json`
|
|
65
|
+
|
|
66
|
+
If a local `catalog.json` exists in the current directory, it is used instead
|
|
67
|
+
(useful for offline development and for the repo itself).
|
|
68
|
+
|
|
69
|
+
## License
|
|
70
|
+
|
|
71
|
+
MIT
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "skyboy"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "The skyboy CLI: add portable SKILL.md skills to your project with one command."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
keywords = ["skills", "claude", "cursor", "gemini", "mcp", "skboy", "cli"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Topic :: Software Development :: Libraries",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[project.urls]
|
|
20
|
+
Homepage = "https://skyboy.in"
|
|
21
|
+
Source = "https://github.com/aijadugar/skyboy"
|
|
22
|
+
|
|
23
|
+
[project.scripts]
|
|
24
|
+
skyboy = "skyboy.__main__:main"
|
|
25
|
+
|
|
26
|
+
[tool.setuptools]
|
|
27
|
+
packages = ["skyboy"]
|
skyboy-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""stdlib-only `skyboy` CLI for the skyboy.in skill directory (PyPI).
|
|
2
|
+
|
|
3
|
+
Publishing notes (see README): this is the native Python implementation of the
|
|
4
|
+
CLI. It intentionally avoids pulling in Node at any point, so it targets the
|
|
5
|
+
Python-only audience (data science, Kaggle, ML eval, etc.) that §8 method C
|
|
6
|
+
wants to reach. It shares the same install-manifest format (catalog.json) as the
|
|
7
|
+
npm CLI.
|
|
8
|
+
|
|
9
|
+
v2: catalog records are compact (id, d, c, t, a, v, h, o, y, p per
|
|
10
|
+
docs/skill-spec.md §6). Ids may be bare slugs (skyboy skills) or scoped
|
|
11
|
+
@owner/slug (vendor and community skills); the install folder is always the
|
|
12
|
+
slug part.
|
|
13
|
+
|
|
14
|
+
Scope for this release: `add`, `search`, `list`, `resolve`, `version`.
|
|
15
|
+
Agent-context detection and the interactive target-folder prompt are documented
|
|
16
|
+
follow-ups on the npm package; here we accept an explicit `--dir` or default to
|
|
17
|
+
`.claude/skills`. This keeps the dual-publish story honest.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
import urllib.request
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from . import __version__
|
|
26
|
+
|
|
27
|
+
MANIFEST_URL = "https://raw.githubusercontent.com/aijadugar/skyboy/main/catalog.json"
|
|
28
|
+
DEFAULT_TARGET_DIR = ".claude/skills"
|
|
29
|
+
RAW_BASE = "https://raw.githubusercontent.com/aijadugar/skyboy/main"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _fetch_json(url):
|
|
33
|
+
with urllib.request.urlopen(url, timeout=30) as resp:
|
|
34
|
+
return json.loads(resp.read().decode("utf-8"))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _resolve_manifest(cwd):
|
|
38
|
+
local = Path(cwd) / "catalog.json"
|
|
39
|
+
if local.exists():
|
|
40
|
+
return json.loads(local.read_text("utf-8"))
|
|
41
|
+
return _fetch_json(MANIFEST_URL)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _slug(record):
|
|
45
|
+
"""The slug part of an id: 'x' for bare, 'slug' for @owner/slug."""
|
|
46
|
+
rid = record.get("id", "")
|
|
47
|
+
return rid.split("/", 1)[1] if rid.startswith("@") else rid
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _skill_folder(record):
|
|
51
|
+
if record.get("p"):
|
|
52
|
+
return record["p"]
|
|
53
|
+
return "skills/{}/{}".format(record.get("c", "uncategorized").split("/")[0], _slug(record))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _add(args):
|
|
57
|
+
if not args:
|
|
58
|
+
print("skyboy: add requires a <slug>. Run 'skyboy help' for usage.")
|
|
59
|
+
return 1
|
|
60
|
+
skill_id = args[0]
|
|
61
|
+
target_dir = DEFAULT_TARGET_DIR
|
|
62
|
+
if "--dir" in args:
|
|
63
|
+
idx = args.index("--dir")
|
|
64
|
+
if idx + 1 < len(args):
|
|
65
|
+
target_dir = args[idx + 1]
|
|
66
|
+
|
|
67
|
+
catalog = _resolve_manifest(Path.cwd())
|
|
68
|
+
skills = catalog.get("skills", [])
|
|
69
|
+
match = next((s for s in skills if s.get("id") == skill_id or _slug(s) == skill_id), None)
|
|
70
|
+
if not match:
|
|
71
|
+
print("skyboy: could not resolve '{}' to a skill. Try 'skyboy search {}'.".format(skill_id, skill_id))
|
|
72
|
+
return 1
|
|
73
|
+
|
|
74
|
+
folder = _skill_folder(match)
|
|
75
|
+
dest = Path(target_dir) / _slug(match)
|
|
76
|
+
dest.mkdir(parents=True, exist_ok=True)
|
|
77
|
+
|
|
78
|
+
# Enumerate the folder with the GitHub contents API (recursive).
|
|
79
|
+
api = "https://api.github.com/repos/aijadugar/skyboy/contents/{}".format(folder)
|
|
80
|
+
stack = [folder]
|
|
81
|
+
entries = []
|
|
82
|
+
while stack:
|
|
83
|
+
d = stack.pop()
|
|
84
|
+
url = api if d == folder else d
|
|
85
|
+
payload = _fetch_json(url)
|
|
86
|
+
for child in payload:
|
|
87
|
+
if child["type"] == "dir":
|
|
88
|
+
stack.append(child["path"])
|
|
89
|
+
else:
|
|
90
|
+
entries.append(child)
|
|
91
|
+
|
|
92
|
+
written = 0
|
|
93
|
+
for entry in entries:
|
|
94
|
+
rel = entry["path"][len(folder) + 1 :]
|
|
95
|
+
local = dest / Path(rel)
|
|
96
|
+
local.parent.mkdir(parents=True, exist_ok=True)
|
|
97
|
+
local.write_bytes(_download(entry))
|
|
98
|
+
written += 1
|
|
99
|
+
|
|
100
|
+
print("skyboy: added '{}' to {}/{}.".format(match.get("id"), target_dir, _slug(match)))
|
|
101
|
+
print(" version: v{} | origin: {} | category: {}".format(
|
|
102
|
+
match.get("v", "1.0.0"), match.get("o", "community"), match.get("c", "uncategorized")))
|
|
103
|
+
print(" {} file(s) written.".format(written))
|
|
104
|
+
print(" next steps: https://skyboy.in/agents/mcp")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _download(entry):
|
|
108
|
+
url = entry["download_url"]
|
|
109
|
+
with urllib.request.urlopen(url, timeout=30) as resp:
|
|
110
|
+
return resp.read()
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _search(args):
|
|
114
|
+
if not args:
|
|
115
|
+
print("skyboy: search requires a <query>.")
|
|
116
|
+
return 1
|
|
117
|
+
query = args[0].lower()
|
|
118
|
+
catalog = _resolve_manifest(Path.cwd())
|
|
119
|
+
terms = [t for t in query.split() if t]
|
|
120
|
+
for s in catalog.get("skills", []):
|
|
121
|
+
hay = " ".join([s.get("id", ""), s.get("d", ""), " ".join(s.get("t", []))]).lower()
|
|
122
|
+
if all(t in hay for t in terms):
|
|
123
|
+
print("{}\t{}\t({})".format(s.get("id"), s.get("d", ""), s.get("c", "uncategorized")))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _list(_args):
|
|
127
|
+
catalog = _resolve_manifest(Path.cwd())
|
|
128
|
+
for s in sorted(catalog.get("skills", []), key=lambda x: x.get("id", "").lower()):
|
|
129
|
+
print("{}\t{}\t({})\tv{}".format(
|
|
130
|
+
s.get("id"), s.get("d", ""), s.get("c", "uncategorized"), s.get("v", "1.0.0")))
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _resolve(args):
|
|
134
|
+
if not args:
|
|
135
|
+
print("skyboy: resolve requires a <slug>.")
|
|
136
|
+
return 1
|
|
137
|
+
skill_id = args[0]
|
|
138
|
+
catalog = _resolve_manifest(Path.cwd())
|
|
139
|
+
match = next((s for s in catalog.get("skills", []) if s.get("id") == skill_id or _slug(s) == skill_id), None)
|
|
140
|
+
if not match:
|
|
141
|
+
print("skyboy: could not resolve '{}'.".format(skill_id))
|
|
142
|
+
return 1
|
|
143
|
+
folder = _skill_folder(match)
|
|
144
|
+
print("id:", match.get("id"))
|
|
145
|
+
print("path:", folder)
|
|
146
|
+
print("description:", match.get("d", ""))
|
|
147
|
+
print("version: v{}".format(match.get("v", "1.0.0")))
|
|
148
|
+
print("hash:", match.get("h", ""))
|
|
149
|
+
print("raw: {}/{}".format(RAW_BASE, folder) + "/SKILL.md")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _version(_args):
|
|
153
|
+
catalog = _resolve_manifest(Path.cwd())
|
|
154
|
+
print("skyboy {} (catalog v{}).".format(__version__, catalog.get("version", 1)))
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _help(_args):
|
|
158
|
+
print("""skyboy - add portable SKILL.md skills to your project.
|
|
159
|
+
|
|
160
|
+
Usage:
|
|
161
|
+
skyboy add <slug|@owner/slug> [--dir <path>]
|
|
162
|
+
skyboy search <query>
|
|
163
|
+
skyboy list
|
|
164
|
+
skyboy resolve <slug|@owner/slug>
|
|
165
|
+
skyboy version
|
|
166
|
+
skyboy help
|
|
167
|
+
|
|
168
|
+
Note: this PyPI CLI covers resolve + download. Agent-context detection and the
|
|
169
|
+
interactive target-folder prompt are a follow-up on the npm package; pass
|
|
170
|
+
--dir to choose a target folder directly.""")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def main(argv=None):
|
|
174
|
+
args = sys.argv[1:] if argv is None else argv
|
|
175
|
+
if not args:
|
|
176
|
+
return _help(args)
|
|
177
|
+
cmd, rest = args[0], args[1:]
|
|
178
|
+
handler = {
|
|
179
|
+
"add": _add,
|
|
180
|
+
"search": _search,
|
|
181
|
+
"list": _list,
|
|
182
|
+
"resolve": _resolve,
|
|
183
|
+
"version": _version,
|
|
184
|
+
"help": _help,
|
|
185
|
+
"--help": _help,
|
|
186
|
+
"-h": _help,
|
|
187
|
+
}.get(cmd)
|
|
188
|
+
if handler is None:
|
|
189
|
+
print("skyboy: unknown command '{}'. Run 'skyboy help'.".format(cmd))
|
|
190
|
+
return 1
|
|
191
|
+
return handler(rest)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
if __name__ == "__main__":
|
|
195
|
+
sys.exit(main())
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: skyboy
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The skyboy CLI: add portable SKILL.md skills to your project with one command.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://skyboy.in
|
|
7
|
+
Project-URL: Source, https://github.com/aijadugar/skyboy
|
|
8
|
+
Keywords: skills,claude,cursor,gemini,mcp,skboy,cli
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
11
|
+
Requires-Python: >=3.9
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
|
|
16
|
+
# skyboy (PyPI)
|
|
17
|
+
|
|
18
|
+
The native Python CLI for the skyboy.in skill directory. This is the Python
|
|
19
|
+
counterpart to the npm `skyboy` package. It intentionally avoids pulling in Node
|
|
20
|
+
at any point, so it reaches the Python-only audience (data science, Kaggle, ML
|
|
21
|
+
eval, etc.).
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pip install skyboy
|
|
27
|
+
# or
|
|
28
|
+
pipx install skyboy
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
skyboy add <slug> [--dir <path>]
|
|
35
|
+
skyboy search <query>
|
|
36
|
+
skyboy list
|
|
37
|
+
skyboy resolve <slug>
|
|
38
|
+
skyboy version
|
|
39
|
+
skyboy help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Add a skill to the Claude Code skills folder.
|
|
46
|
+
skyboy add nextjs-app-router-conventions
|
|
47
|
+
|
|
48
|
+
# Add a skill to a custom folder.
|
|
49
|
+
skyboy add context-window-management --dir .cursor/rules
|
|
50
|
+
|
|
51
|
+
# Search the catalog.
|
|
52
|
+
skyboy search "app router"
|
|
53
|
+
|
|
54
|
+
# List everything available.
|
|
55
|
+
skyboy list
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Parity with the npm CLI
|
|
59
|
+
|
|
60
|
+
This release ships real packaging plus the `add` command, which resolves a slug
|
|
61
|
+
from the shared `catalog.json` manifest (committed to the skyboy repo, fetched
|
|
62
|
+
from raw.githubusercontent.com) and downloads the skill folder files. It also
|
|
63
|
+
covers `search`, `list`, `resolve`, and `version`.
|
|
64
|
+
|
|
65
|
+
The following are documented follow-ups on the npm package, not yet in this
|
|
66
|
+
PyPI release:
|
|
67
|
+
|
|
68
|
+
- Agent-context detection (auto-detecting Claude Code vs. Cursor vs. Windsurf
|
|
69
|
+
from the current directory).
|
|
70
|
+
- The interactive target-folder picker.
|
|
71
|
+
|
|
72
|
+
To choose a target folder directly, pass `--dir` (default `.claude/skills`).
|
|
73
|
+
|
|
74
|
+
## Why a separate manifest?
|
|
75
|
+
|
|
76
|
+
The CLI runs in arbitrary user projects with no local copy of the skyboy repo.
|
|
77
|
+
To stay standalilone, it sources catalog data from a single shareable manifest:
|
|
78
|
+
|
|
79
|
+
`https://raw.githubusercontent.com/aijadugar/skyboy/main/catalog.json`
|
|
80
|
+
|
|
81
|
+
If a local `catalog.json` exists in the current directory, it is used instead
|
|
82
|
+
(useful for offline development and for the repo itself).
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
skyboy
|