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 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """skyboy - the PyPI CLI for the skyboy.in skill directory."""
2
+
3
+ __version__ = "0.1.0"
@@ -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,10 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ skyboy/__init__.py
5
+ skyboy/__main__.py
6
+ skyboy.egg-info/PKG-INFO
7
+ skyboy.egg-info/SOURCES.txt
8
+ skyboy.egg-info/dependency_links.txt
9
+ skyboy.egg-info/entry_points.txt
10
+ skyboy.egg-info/top_level.txt
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ skyboy = skyboy.__main__:main
@@ -0,0 +1 @@
1
+ skyboy