skillup 0.3.2__tar.gz → 0.4.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.
- skillup-0.4.0/.github/workflows/docs.yml +42 -0
- skillup-0.4.0/PKG-INFO +103 -0
- skillup-0.4.0/README.md +91 -0
- skillup-0.4.0/assets/logo-wordmark.svg +12 -0
- skillup-0.4.0/assets/logo.svg +8 -0
- skillup-0.4.0/docs/assets/extra.css +186 -0
- skillup-0.4.0/docs/assets/logo.svg +8 -0
- skillup-0.4.0/docs/changelog.md +13 -0
- skillup-0.4.0/docs/commands.md +135 -0
- skillup-0.4.0/docs/development.md +65 -0
- skillup-0.4.0/docs/index.md +59 -0
- skillup-0.4.0/docs/lock-file.md +54 -0
- skillup-0.4.0/docs/quickstart.md +77 -0
- skillup-0.4.0/docs/skill-definition.md +43 -0
- {skillup-0.3.2 → skillup-0.4.0}/pyproject.toml +1 -1
- {skillup-0.3.2 → skillup-0.4.0}/skillup/install.py +10 -4
- skillup-0.4.0/tests/test_install.py +151 -0
- skillup-0.4.0/zensical.toml +63 -0
- skillup-0.3.2/PKG-INFO +0 -113
- skillup-0.3.2/README.md +0 -101
- {skillup-0.3.2 → skillup-0.4.0}/.github/workflows/ci.yml +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/.github/workflows/publish.yml +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/.gitignore +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/.python-version +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/LICENSE +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/skillup/__init__.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/skillup/cli.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/skillup/github.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/skillup/lock.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/skillup/settings.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/tests/test_cli.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/tests/test_e2e.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/tests/test_github_auth.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/tests/test_migrate.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/tests/test_sync.py +0 -0
- {skillup-0.3.2 → skillup-0.4.0}/uv.lock +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Deploy Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- 'docs/**'
|
|
8
|
+
- 'zensical.toml'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
pages: write
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: "pages"
|
|
18
|
+
cancel-in-progress: false
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
deploy:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
environment:
|
|
24
|
+
name: github-pages
|
|
25
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/configure-pages@v5
|
|
28
|
+
with:
|
|
29
|
+
enablement: true
|
|
30
|
+
- uses: actions/checkout@v5
|
|
31
|
+
- uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: '3.12'
|
|
34
|
+
- name: Install Zensical
|
|
35
|
+
run: pip install zensical
|
|
36
|
+
- name: Build docs
|
|
37
|
+
run: zensical build --clean
|
|
38
|
+
- uses: actions/upload-pages-artifact@v4
|
|
39
|
+
with:
|
|
40
|
+
path: site
|
|
41
|
+
- uses: actions/deploy-pages@v4
|
|
42
|
+
id: deployment
|
skillup-0.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: skillup
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: A minimal CLI to manage agent skills from GitHub releases.
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: questionary
|
|
8
|
+
Requires-Dist: requests
|
|
9
|
+
Requires-Dist: rich
|
|
10
|
+
Requires-Dist: typer
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<img src="assets/logo-wordmark.svg" alt="skillup" height="72" />
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<strong>Skill your agents up.</strong><br/>
|
|
19
|
+
A minimal CLI to install, version, and sync skills for your AI agents.<br/>
|
|
20
|
+
Local-first · GitHub-backed · Works with Claude, Gemini, and more.
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
<p align="center">
|
|
24
|
+
<code>pip install skillup</code> · <code>uv tool install skillup</code>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Features
|
|
30
|
+
|
|
31
|
+
- **Interactive install** — pick skills from any GitHub repo release
|
|
32
|
+
- **Multi-repo** — manage skills from multiple sources independently
|
|
33
|
+
- **Lock file** — pins commit SHAs for reproducible installs (`~/.agents/skills.lock.json`)
|
|
34
|
+
- **Auto-update** — upgrade all or specific repos to their latest release or branch head
|
|
35
|
+
- **Smart cache** — skips redundant downloads; override with `SKILLUP_CACHE_DIR`
|
|
36
|
+
- **gh integration** — uses `gh` CLI when available, falls back to `requests`
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install skillup
|
|
42
|
+
# or
|
|
43
|
+
uv tool install skillup
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Usage
|
|
47
|
+
|
|
48
|
+
### Add skills
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
skillup add google/gemini-cli-skills
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
No releases? Falls back to `main` automatically. Pin a branch explicitly:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
skillup add anthropics/skills --branch main --skill pdf
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Remove skills
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
skillup remove
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Update skills
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
skillup update # all repos
|
|
70
|
+
skillup update --repo google/gemini-cli-skills # one repo
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Sync (restore from lock file)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
skillup sync
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Installs skills at the exact pinned SHAs from the lock file — useful for new machines.
|
|
80
|
+
|
|
81
|
+
### Migrate from NPX skills CLI
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
skillup migrate # reads skills-lock.json from repo root
|
|
85
|
+
skillup migrate path/to/skills-lock.json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Skill definition
|
|
89
|
+
|
|
90
|
+
A folder is recognized as a skill when it lives inside a `skills/` directory at the repo root and contains a `SKILL.md` file.
|
|
91
|
+
|
|
92
|
+
## Development
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
uv sync # install deps
|
|
96
|
+
uv run skillup --help
|
|
97
|
+
uv run pytest
|
|
98
|
+
uv run pyright skillup
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
MIT
|
skillup-0.4.0/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo-wordmark.svg" alt="skillup" height="72" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>Skill your agents up.</strong><br/>
|
|
7
|
+
A minimal CLI to install, version, and sync skills for your AI agents.<br/>
|
|
8
|
+
Local-first · GitHub-backed · Works with Claude, Gemini, and more.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<code>pip install skillup</code> · <code>uv tool install skillup</code>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- **Interactive install** — pick skills from any GitHub repo release
|
|
20
|
+
- **Multi-repo** — manage skills from multiple sources independently
|
|
21
|
+
- **Lock file** — pins commit SHAs for reproducible installs (`~/.agents/skills.lock.json`)
|
|
22
|
+
- **Auto-update** — upgrade all or specific repos to their latest release or branch head
|
|
23
|
+
- **Smart cache** — skips redundant downloads; override with `SKILLUP_CACHE_DIR`
|
|
24
|
+
- **gh integration** — uses `gh` CLI when available, falls back to `requests`
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install skillup
|
|
30
|
+
# or
|
|
31
|
+
uv tool install skillup
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
### Add skills
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
skillup add google/gemini-cli-skills
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
No releases? Falls back to `main` automatically. Pin a branch explicitly:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
skillup add anthropics/skills --branch main --skill pdf
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Remove skills
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
skillup remove
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Update skills
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
skillup update # all repos
|
|
58
|
+
skillup update --repo google/gemini-cli-skills # one repo
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Sync (restore from lock file)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
skillup sync
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Installs skills at the exact pinned SHAs from the lock file — useful for new machines.
|
|
68
|
+
|
|
69
|
+
### Migrate from NPX skills CLI
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
skillup migrate # reads skills-lock.json from repo root
|
|
73
|
+
skillup migrate path/to/skills-lock.json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Skill definition
|
|
77
|
+
|
|
78
|
+
A folder is recognized as a skill when it lives inside a `skills/` directory at the repo root and contains a `SKILL.md` file.
|
|
79
|
+
|
|
80
|
+
## Development
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
uv sync # install deps
|
|
84
|
+
uv run skillup --help
|
|
85
|
+
uv run pytest
|
|
86
|
+
uv run pyright skillup
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg viewBox="0 0 288 64" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- Mark -->
|
|
3
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="#0a0a0a"/>
|
|
4
|
+
<path d="M14 22 L23 32 L14 42" stroke="#ffffff" stroke-width="4" fill="none" stroke-linecap="square" stroke-linejoin="miter"/>
|
|
5
|
+
<rect x="27" y="40" width="11" height="3.5" fill="#ffffff"/>
|
|
6
|
+
<rect x="42" y="34" width="4" height="8" fill="#00d26a"/>
|
|
7
|
+
<rect x="48" y="28" width="4" height="14" fill="#00d26a"/>
|
|
8
|
+
<rect x="54" y="22" width="4" height="20" fill="#00d26a"/>
|
|
9
|
+
<!-- Wordmark -->
|
|
10
|
+
<text x="79" y="46" font-family="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace" font-weight="700" font-size="40" letter-spacing="-1.6" fill="#0a0a0a">skill</text>
|
|
11
|
+
<text x="191" y="46" font-family="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace" font-weight="700" font-size="40" letter-spacing="-1.6" fill="#00d26a">up</text>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="#0a0a0a"/>
|
|
3
|
+
<path d="M14 22 L23 32 L14 42" stroke="#ffffff" stroke-width="4" fill="none" stroke-linecap="square" stroke-linejoin="miter"/>
|
|
4
|
+
<rect x="27" y="40" width="11" height="3.5" fill="#ffffff"/>
|
|
5
|
+
<rect x="42" y="34" width="4" height="8" fill="#00d26a"/>
|
|
6
|
+
<rect x="48" y="28" width="4" height="14" fill="#00d26a"/>
|
|
7
|
+
<rect x="54" y="22" width="4" height="20" fill="#00d26a"/>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap');
|
|
2
|
+
|
|
3
|
+
/* ── Brand tokens ─────────────────────────────── */
|
|
4
|
+
:root {
|
|
5
|
+
--su-ink: #0a0a0a;
|
|
6
|
+
--su-ink-2: #141414;
|
|
7
|
+
--su-ink-3: #1a1a1a;
|
|
8
|
+
--su-ink-4: #262626;
|
|
9
|
+
--su-paper: #fafaf9;
|
|
10
|
+
--su-bone: #f5f5f4;
|
|
11
|
+
--su-line: #e7e5e4;
|
|
12
|
+
--su-mute: #78716c;
|
|
13
|
+
--su-green: #00d26a;
|
|
14
|
+
--su-green-dark: #00a854;
|
|
15
|
+
--su-amber: #fbbf24;
|
|
16
|
+
--su-cyan: #22d3ee;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* ── Typography ───────────────────────────────── */
|
|
20
|
+
body,
|
|
21
|
+
.md-typeset {
|
|
22
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
code,
|
|
26
|
+
pre,
|
|
27
|
+
kbd,
|
|
28
|
+
.md-typeset code,
|
|
29
|
+
.md-typeset pre {
|
|
30
|
+
font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace !important;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* tight tracking on headings — matches brand */
|
|
34
|
+
.md-typeset h1,
|
|
35
|
+
.md-typeset h2,
|
|
36
|
+
.md-typeset h3 {
|
|
37
|
+
font-family: 'JetBrains Mono', ui-monospace, monospace;
|
|
38
|
+
font-weight: 700;
|
|
39
|
+
letter-spacing: -0.03em;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* ── Header — always ink ──────────────────────── */
|
|
43
|
+
.md-header {
|
|
44
|
+
background-color: var(--su-ink) !important;
|
|
45
|
+
border-bottom: 1px solid var(--su-ink-4);
|
|
46
|
+
box-shadow: none;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.md-header__title {
|
|
50
|
+
font-family: 'JetBrains Mono', monospace;
|
|
51
|
+
font-weight: 700;
|
|
52
|
+
letter-spacing: -0.03em;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* "up" green accent in site title */
|
|
56
|
+
.md-header__title::after {
|
|
57
|
+
content: '';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* ── Dark mode (slate scheme) ─────────────────── */
|
|
61
|
+
[data-md-color-scheme="slate"] {
|
|
62
|
+
--md-default-bg-color: var(--su-ink);
|
|
63
|
+
--md-default-bg-color--light: var(--su-ink-2);
|
|
64
|
+
--md-default-fg-color: #e5e5e5;
|
|
65
|
+
--md-default-fg-color--light: #a3a3a3;
|
|
66
|
+
--md-default-fg-color--lighter: #737373;
|
|
67
|
+
--md-default-fg-color--lightest: #404040;
|
|
68
|
+
--md-code-bg-color: var(--su-ink-3);
|
|
69
|
+
--md-code-fg-color: #e5e5e5;
|
|
70
|
+
--md-typeset-a-color: var(--su-green);
|
|
71
|
+
--md-accent-fg-color: var(--su-green);
|
|
72
|
+
--md-primary-fg-color: var(--su-green);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* nav sidebar in dark mode */
|
|
76
|
+
[data-md-color-scheme="slate"] .md-sidebar {
|
|
77
|
+
background-color: var(--su-ink-2);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
[data-md-color-scheme="slate"] .md-nav__link--active,
|
|
81
|
+
[data-md-color-scheme="slate"] .md-nav__link:hover {
|
|
82
|
+
color: var(--su-green) !important;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* ── Light mode (default scheme) ─────────────── */
|
|
86
|
+
[data-md-color-scheme="default"] {
|
|
87
|
+
--md-default-bg-color: var(--su-paper);
|
|
88
|
+
--md-code-bg-color: var(--su-bone);
|
|
89
|
+
--md-typeset-a-color: var(--su-green-dark);
|
|
90
|
+
--md-accent-fg-color: var(--su-green-dark);
|
|
91
|
+
--md-primary-fg-color: var(--su-green-dark);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
[data-md-color-scheme="default"] .md-nav__link--active,
|
|
95
|
+
[data-md-color-scheme="default"] .md-nav__link:hover {
|
|
96
|
+
color: var(--su-green-dark) !important;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ── Code blocks — terminal feel ─────────────── */
|
|
100
|
+
.md-typeset .highlight {
|
|
101
|
+
border-radius: 4px;
|
|
102
|
+
border: 1px solid var(--su-ink-4);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[data-md-color-scheme="slate"] .md-typeset .highlight {
|
|
106
|
+
background-color: var(--su-ink-3) !important;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* shell prompt color */
|
|
110
|
+
[data-md-color-scheme="slate"] .md-typeset .highlight .gp {
|
|
111
|
+
color: #525252;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* ── Inline code ──────────────────────────────── */
|
|
115
|
+
[data-md-color-scheme="slate"] .md-typeset code:not(.highlight code) {
|
|
116
|
+
background-color: var(--su-ink-3);
|
|
117
|
+
border: 1px solid var(--su-ink-4);
|
|
118
|
+
color: var(--su-green);
|
|
119
|
+
padding: 0.1em 0.35em;
|
|
120
|
+
border-radius: 3px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* ── Admonition / callout accents ────────────── */
|
|
124
|
+
.md-typeset .admonition,
|
|
125
|
+
.md-typeset details {
|
|
126
|
+
border-radius: 4px;
|
|
127
|
+
border-left-width: 3px;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.md-typeset .note > .admonition-title,
|
|
131
|
+
.md-typeset .note > summary {
|
|
132
|
+
border-left-color: var(--su-cyan);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.md-typeset .tip > .admonition-title,
|
|
136
|
+
.md-typeset .tip > summary {
|
|
137
|
+
border-left-color: var(--su-green);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.md-typeset .warning > .admonition-title,
|
|
141
|
+
.md-typeset .warning > summary {
|
|
142
|
+
border-left-color: var(--su-amber);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* ── Tables ───────────────────────────────────── */
|
|
146
|
+
[data-md-color-scheme="slate"] .md-typeset table:not([class]) th {
|
|
147
|
+
background-color: var(--su-ink-3);
|
|
148
|
+
color: var(--su-green);
|
|
149
|
+
font-family: 'JetBrains Mono', monospace;
|
|
150
|
+
font-size: 0.75rem;
|
|
151
|
+
letter-spacing: 0.08em;
|
|
152
|
+
text-transform: uppercase;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
[data-md-color-scheme="slate"] .md-typeset table:not([class]) td {
|
|
156
|
+
border-color: var(--su-ink-4);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* ── Footer ───────────────────────────────────── */
|
|
160
|
+
.md-footer {
|
|
161
|
+
background-color: var(--su-ink) !important;
|
|
162
|
+
border-top: 1px solid var(--su-ink-4);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.md-footer-meta {
|
|
166
|
+
background-color: var(--su-ink) !important;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* ── Scrollbar (dark) ─────────────────────────── */
|
|
170
|
+
[data-md-color-scheme="slate"] ::-webkit-scrollbar {
|
|
171
|
+
width: 6px;
|
|
172
|
+
height: 6px;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
[data-md-color-scheme="slate"] ::-webkit-scrollbar-track {
|
|
176
|
+
background: var(--su-ink-2);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
[data-md-color-scheme="slate"] ::-webkit-scrollbar-thumb {
|
|
180
|
+
background: var(--su-ink-4);
|
|
181
|
+
border-radius: 3px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
[data-md-color-scheme="slate"] ::-webkit-scrollbar-thumb:hover {
|
|
185
|
+
background: #404040;
|
|
186
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="#0a0a0a"/>
|
|
3
|
+
<path d="M14 22 L23 32 L14 42" stroke="#ffffff" stroke-width="4" fill="none" stroke-linecap="square" stroke-linejoin="miter"/>
|
|
4
|
+
<rect x="27" y="40" width="11" height="3.5" fill="#ffffff"/>
|
|
5
|
+
<rect x="42" y="34" width="4" height="8" fill="#00d26a"/>
|
|
6
|
+
<rect x="48" y="28" width="4" height="14" fill="#00d26a"/>
|
|
7
|
+
<rect x="54" y="22" width="4" height="20" fill="#00d26a"/>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- Added Zensical documentation site
|
|
6
|
+
- Added brand assets (`assets/logo.svg`, `assets/logo-wordmark.svg`)
|
|
7
|
+
|
|
8
|
+
## v0.4.1
|
|
9
|
+
|
|
10
|
+
- Renamed CLI from `bms-skills` to `skillup`
|
|
11
|
+
- Added `migrate` command to import `skills-lock.json` from the NPX skills CLI
|
|
12
|
+
- Fixed `migrate` default input path to repo root
|
|
13
|
+
- Refactored `cli.py` into focused modules (`install`, `lock`, `settings`, `github`)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Commands
|
|
2
|
+
|
|
3
|
+
## Global flag
|
|
4
|
+
|
|
5
|
+
All commands accept a `--global` / `-g` flag that switches the lock file and base directory to your home directory instead of the current working directory.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
skillup --global add myorg/skills
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `add`
|
|
14
|
+
|
|
15
|
+
Add skills from a GitHub release or branch.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
skillup add <owner/repo> [OPTIONS]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
| Option | Short | Description |
|
|
22
|
+
|--------|-------|-------------|
|
|
23
|
+
| `--skill TEXT` | `-s` | Skill name to add (repeatable). Skips interactive picker. |
|
|
24
|
+
| `--branch TEXT` | `-b` | Install from this branch instead of the latest release. |
|
|
25
|
+
|
|
26
|
+
**Examples**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Interactive picker — choose from all available skills
|
|
30
|
+
skillup add google/gemini-cli-skills
|
|
31
|
+
|
|
32
|
+
# Add one skill non-interactively
|
|
33
|
+
skillup add anthropics/skills --skill pdf
|
|
34
|
+
|
|
35
|
+
# Add multiple skills at once
|
|
36
|
+
skillup add anthropics/skills --skill pdf --skill code-review
|
|
37
|
+
|
|
38
|
+
# Pin to a branch
|
|
39
|
+
skillup add myorg/skills --branch main
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Behavior**
|
|
43
|
+
|
|
44
|
+
- Fetches the latest GitHub release. If none exists, falls back to `main`.
|
|
45
|
+
- Downloads the release zip (cached in `TEMP`/`/tmp` or `SKILLUP_CACHE_DIR`).
|
|
46
|
+
- Installs selected skills to `~/.agents/skills` and `~/.claude/skills`.
|
|
47
|
+
- Writes the resolved tag/commit to the lock file.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## `remove`
|
|
52
|
+
|
|
53
|
+
Interactively remove installed skills.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
skillup remove
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Shows a checkbox list of all installed skills across all tracked repos. Selected skills are deleted from disk and removed from the lock file. Repos with no remaining skills are dropped from the lock file entirely.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## `update`
|
|
64
|
+
|
|
65
|
+
Update installed skills to the latest release or branch head.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
skillup update [OPTIONS]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Option | Description |
|
|
72
|
+
|--------|-------------|
|
|
73
|
+
| `--repo TEXT` | Update only this repository (`owner/repo`). |
|
|
74
|
+
|
|
75
|
+
**Examples**
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Update everything
|
|
79
|
+
skillup update
|
|
80
|
+
|
|
81
|
+
# Update one repo
|
|
82
|
+
skillup update --repo google/gemini-cli-skills
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Behavior**
|
|
86
|
+
|
|
87
|
+
- Resolves the current latest source for each repo (release or branch head).
|
|
88
|
+
- If the resolved commit/tag matches what's in the lock file, skips with "already up-to-date".
|
|
89
|
+
- Re-installs all skills from the new source and updates the lock file.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## `sync`
|
|
94
|
+
|
|
95
|
+
Install all skills exactly as defined in the lock file.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
skillup sync
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Uses the pinned commit SHAs from the lock file — no network resolution of "latest". Useful for:
|
|
102
|
+
|
|
103
|
+
- Setting up a new machine from a shared or committed lock file.
|
|
104
|
+
- CI environments that need deterministic installs.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## `migrate`
|
|
109
|
+
|
|
110
|
+
Import a `skills-lock.json` from the Claude Code NPX skills CLI.
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
skillup migrate [INPUT_FILE]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
| Argument | Description |
|
|
117
|
+
|----------|-------------|
|
|
118
|
+
| `INPUT_FILE` | Path to `skills-lock.json`. Defaults to `<base_dir>/skills-lock.json`. |
|
|
119
|
+
|
|
120
|
+
**Example**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Default path
|
|
124
|
+
skillup migrate
|
|
125
|
+
|
|
126
|
+
# Custom path
|
|
127
|
+
skillup migrate path/to/skills-lock.json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Behavior**
|
|
131
|
+
|
|
132
|
+
- Reads each GitHub-sourced skill from the input file.
|
|
133
|
+
- Resolves the current latest release/branch for each repo.
|
|
134
|
+
- Merges into the skillup lock file without overwriting existing entries.
|
|
135
|
+
- Skips skills with unsupported `sourceType` (non-GitHub).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Development
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
This project uses [uv](https://github.com/astral-sh/uv) for dependency management.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/bmsuisse/skillup
|
|
9
|
+
cd skillup
|
|
10
|
+
uv sync
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Running locally
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
uv run skillup --help
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Tests
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv run pytest
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Run a specific test file:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
uv run pytest tests/test_cli.py
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Type checking
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
uv run pyright skillup
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Project structure
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
skillup/
|
|
41
|
+
├── skillup/
|
|
42
|
+
│ ├── cli.py # Typer commands (add, remove, update, sync, migrate)
|
|
43
|
+
│ ├── install.py # Download, unzip, and copy skill folders
|
|
44
|
+
│ ├── lock.py # Lock file read/write and source normalization
|
|
45
|
+
│ ├── settings.py # Paths and environment config
|
|
46
|
+
│ └── github.py # GitHub release/branch resolution
|
|
47
|
+
├── tests/
|
|
48
|
+
├── docs/ # This documentation (built with Zensical)
|
|
49
|
+
├── zensical.toml # Docs config
|
|
50
|
+
└── pyproject.toml
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Building the docs locally
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install zensical
|
|
57
|
+
zensical serve # live-reload dev server
|
|
58
|
+
zensical build # static output → site/
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Environment variables
|
|
62
|
+
|
|
63
|
+
| Variable | Default | Description |
|
|
64
|
+
|----------|---------|-------------|
|
|
65
|
+
| `SKILLUP_CACHE_DIR` | system temp | Override the download cache directory. |
|