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.
Files changed (36) hide show
  1. skillup-0.4.0/.github/workflows/docs.yml +42 -0
  2. skillup-0.4.0/PKG-INFO +103 -0
  3. skillup-0.4.0/README.md +91 -0
  4. skillup-0.4.0/assets/logo-wordmark.svg +12 -0
  5. skillup-0.4.0/assets/logo.svg +8 -0
  6. skillup-0.4.0/docs/assets/extra.css +186 -0
  7. skillup-0.4.0/docs/assets/logo.svg +8 -0
  8. skillup-0.4.0/docs/changelog.md +13 -0
  9. skillup-0.4.0/docs/commands.md +135 -0
  10. skillup-0.4.0/docs/development.md +65 -0
  11. skillup-0.4.0/docs/index.md +59 -0
  12. skillup-0.4.0/docs/lock-file.md +54 -0
  13. skillup-0.4.0/docs/quickstart.md +77 -0
  14. skillup-0.4.0/docs/skill-definition.md +43 -0
  15. {skillup-0.3.2 → skillup-0.4.0}/pyproject.toml +1 -1
  16. {skillup-0.3.2 → skillup-0.4.0}/skillup/install.py +10 -4
  17. skillup-0.4.0/tests/test_install.py +151 -0
  18. skillup-0.4.0/zensical.toml +63 -0
  19. skillup-0.3.2/PKG-INFO +0 -113
  20. skillup-0.3.2/README.md +0 -101
  21. {skillup-0.3.2 → skillup-0.4.0}/.github/workflows/ci.yml +0 -0
  22. {skillup-0.3.2 → skillup-0.4.0}/.github/workflows/publish.yml +0 -0
  23. {skillup-0.3.2 → skillup-0.4.0}/.gitignore +0 -0
  24. {skillup-0.3.2 → skillup-0.4.0}/.python-version +0 -0
  25. {skillup-0.3.2 → skillup-0.4.0}/LICENSE +0 -0
  26. {skillup-0.3.2 → skillup-0.4.0}/skillup/__init__.py +0 -0
  27. {skillup-0.3.2 → skillup-0.4.0}/skillup/cli.py +0 -0
  28. {skillup-0.3.2 → skillup-0.4.0}/skillup/github.py +0 -0
  29. {skillup-0.3.2 → skillup-0.4.0}/skillup/lock.py +0 -0
  30. {skillup-0.3.2 → skillup-0.4.0}/skillup/settings.py +0 -0
  31. {skillup-0.3.2 → skillup-0.4.0}/tests/test_cli.py +0 -0
  32. {skillup-0.3.2 → skillup-0.4.0}/tests/test_e2e.py +0 -0
  33. {skillup-0.3.2 → skillup-0.4.0}/tests/test_github_auth.py +0 -0
  34. {skillup-0.3.2 → skillup-0.4.0}/tests/test_migrate.py +0 -0
  35. {skillup-0.3.2 → skillup-0.4.0}/tests/test_sync.py +0 -0
  36. {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> &nbsp;·&nbsp; <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
@@ -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> &nbsp;·&nbsp; <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. |