@akshar5/skillsync 0.1.0 → 0.1.1
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.
- package/README.md +156 -47
- package/package.json +1 -1
- package/src/cli.js +4 -4
package/README.md
CHANGED
|
@@ -2,7 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
Local-first skill manager for AI agent skills.
|
|
4
4
|
|
|
5
|
-
SkillSync uses a private GitHub repo as your cloud vault, then keeps selected skills linked into local agent skill folders on each device.
|
|
5
|
+
SkillSync uses a private GitHub repo as your cloud vault, then keeps selected skills linked into local agent skill folders on each device. Install it once with npm, connect it to your vault, and use the `skillsync` command anywhere.
|
|
6
|
+
|
|
7
|
+
## Quick start
|
|
8
|
+
|
|
9
|
+
Install the CLI:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g @akshar5/skillsync
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Connect this device to an existing private skills vault:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
skillsync setup --repo AksharP5/skills
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Add a local skill folder to the vault:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
skillsync add ~/path/to/my-skill --skill my-skill
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Add a skill from a GitHub repository:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
skillsync add https://github.com/example-org/example-skill --skill example-skill
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Install a vaulted skill into a local agent target:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
skillsync target add codex ~/.codex/skills
|
|
37
|
+
skillsync install my-skill --target codex
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Open the interactive UI:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
skillsync
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Requirements
|
|
47
|
+
|
|
48
|
+
- Node.js 20 or newer
|
|
49
|
+
- Git
|
|
50
|
+
- GitHub CLI (`gh`) authenticated with `gh auth login`
|
|
51
|
+
- A private GitHub repo for the skills vault
|
|
6
52
|
|
|
7
53
|
## What it manages
|
|
8
54
|
|
|
@@ -18,56 +64,124 @@ devices/*.json # generated, do not edit
|
|
|
18
64
|
|
|
19
65
|
User-owned files are the skill folders under `skills/`. SkillSync owns `registry.json` and `devices/*.json`.
|
|
20
66
|
|
|
21
|
-
|
|
67
|
+
Local target folders are per-device. For example, one laptop can install a skill into `~/.codex/skills`, while another can install the same vault skill into a different agent folder.
|
|
22
68
|
|
|
23
|
-
|
|
69
|
+
## Install on a new device
|
|
70
|
+
|
|
71
|
+
Install prerequisites on macOS:
|
|
24
72
|
|
|
25
73
|
```bash
|
|
26
|
-
|
|
27
|
-
|
|
74
|
+
brew install gh git node
|
|
75
|
+
gh auth login
|
|
28
76
|
```
|
|
29
77
|
|
|
30
|
-
|
|
78
|
+
SkillSync clones vault repos over HTTPS using your GitHub CLI authentication, so a GitHub SSH key is not required.
|
|
79
|
+
|
|
80
|
+
Install SkillSync:
|
|
31
81
|
|
|
32
82
|
```bash
|
|
33
|
-
|
|
34
|
-
|
|
83
|
+
npm install -g @akshar5/skillsync
|
|
84
|
+
```
|
|
35
85
|
|
|
36
|
-
|
|
37
|
-
|
|
86
|
+
Connect to an existing vault:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
skillsync setup --repo AksharP5/skills
|
|
38
90
|
```
|
|
39
91
|
|
|
40
|
-
|
|
92
|
+
Or create/select a vault repo under your GitHub account:
|
|
41
93
|
|
|
42
94
|
```bash
|
|
43
|
-
|
|
44
|
-
gh repo clone AksharP5/skillsync ~/projects/skillsync
|
|
45
|
-
cd ~/projects/skillsync
|
|
46
|
-
npm install
|
|
47
|
-
npm link
|
|
95
|
+
skillsync setup --name skills
|
|
48
96
|
```
|
|
49
97
|
|
|
50
|
-
|
|
98
|
+
If you run plain `skillsync setup` in an interactive terminal, it asks for the repo name and defaults to `skills`. `setup --name` creates `OWNER/skills` as a private GitHub repo if it does not exist. If it exists, SkillSync verifies it is private before using it.
|
|
99
|
+
|
|
100
|
+
You can also run commands without a global install:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx @akshar5/skillsync setup --repo AksharP5/skills
|
|
104
|
+
npx @akshar5/skillsync add https://github.com/example-org/example-skill --skill example-skill
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
If an older SkillSync version failed with `git@github.com: Permission denied (publickey)`, update the CLI and rerun setup:
|
|
51
108
|
|
|
52
109
|
```bash
|
|
110
|
+
npm install -g @akshar5/skillsync@latest
|
|
53
111
|
skillsync setup --repo AksharP5/skills
|
|
54
112
|
```
|
|
55
113
|
|
|
56
|
-
|
|
114
|
+
## Common workflows
|
|
115
|
+
|
|
116
|
+
List available skills:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
skillsync list
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Check current vault/device state:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
skillsync status
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Add local agent targets:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
skillsync target add codex ~/.codex/skills
|
|
132
|
+
skillsync target add claude ~/.claude/skills
|
|
133
|
+
skillsync target add hermes ~/.hermes/skills/personal --scan-path ~/.hermes/skills
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Add a skill folder to the vault:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
skillsync add ~/Developer/skills/my-skill --skill my-skill
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Add from a GitHub repo:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
skillsync add https://github.com/example-org/example-skill --skill example-skill
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
If the source repo contains multiple skills, omit `--skill` in an interactive terminal and SkillSync will ask which ones to add. Add `--target codex` or `--target '*'` to install immediately after importing:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
skillsync add https://github.com/example-org/example-skill --target codex
|
|
152
|
+
skillsync add https://github.com/example-org/example-skill --target '*'
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Install or uninstall a vaulted skill on this device:
|
|
57
156
|
|
|
58
157
|
```bash
|
|
59
|
-
skillsync
|
|
158
|
+
skillsync install my-skill --target codex
|
|
159
|
+
skillsync uninstall my-skill
|
|
60
160
|
```
|
|
61
161
|
|
|
62
|
-
|
|
162
|
+
Sync the vault and reapply local links:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
skillsync sync
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Scan configured target folders for already-installed local skills:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
skillsync scan
|
|
172
|
+
```
|
|
63
173
|
|
|
64
174
|
## Commands
|
|
65
175
|
|
|
66
176
|
```bash
|
|
67
177
|
skillsync setup
|
|
178
|
+
skillsync setup --repo owner/repo
|
|
179
|
+
skillsync setup --name skills
|
|
68
180
|
skillsync
|
|
181
|
+
skillsync status
|
|
182
|
+
skillsync list
|
|
69
183
|
skillsync add <skill-folder-or-git-url> --skill <name>
|
|
70
|
-
skillsync add https://github.com/
|
|
184
|
+
skillsync add https://github.com/example-org/example-skill --skill example-skill
|
|
71
185
|
skillsync import hermes
|
|
72
186
|
skillsync install <skill> --target codex
|
|
73
187
|
skillsync uninstall <skill>
|
|
@@ -77,6 +191,7 @@ skillsync target add hermes ~/.hermes/skills/personal --scan-path ~/.hermes/skil
|
|
|
77
191
|
skillsync scan
|
|
78
192
|
skillsync sync
|
|
79
193
|
skillsync service install
|
|
194
|
+
skillsync daemon
|
|
80
195
|
```
|
|
81
196
|
|
|
82
197
|
## Removal model
|
|
@@ -84,32 +199,6 @@ skillsync service install
|
|
|
84
199
|
- `skillsync uninstall <skill>` removes the skill from the current device only.
|
|
85
200
|
- `skillsync delete <skill>` removes the skill from the vault and all device manifests.
|
|
86
201
|
|
|
87
|
-
## Add from GitHub
|
|
88
|
-
|
|
89
|
-
You can import a skill directly from a GitHub repo into your private vault:
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
skillsync add https://github.com/raroque/vibe-security-skill --skill vibe-security
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
If the repo has multiple skills, omit `--skill` in an interactive terminal and SkillSync will ask which ones to add. Add `--target codex` or `--target '*'` to install it on the current device immediately after importing.
|
|
96
|
-
|
|
97
|
-
## Publishing to npm
|
|
98
|
-
|
|
99
|
-
Clone the project on the machine where your npm account is configured:
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
gh repo clone AksharP5/skillsync ~/projects/skillsync
|
|
103
|
-
cd ~/projects/skillsync
|
|
104
|
-
npm install
|
|
105
|
-
npm test
|
|
106
|
-
npm pack --dry-run
|
|
107
|
-
npm login
|
|
108
|
-
npm publish --access public
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
The package name is `@akshar5/skillsync` because `skillsync` is already taken on npm. The installed command is still `skillsync`.
|
|
112
|
-
|
|
113
202
|
## Detected versus managed skills
|
|
114
203
|
|
|
115
204
|
`installed` skills are SkillSync-managed projections into a target folder. `detected` skills are already present in a local agent's skill tree, such as bundled Hermes skills under `~/.hermes/skills`.
|
|
@@ -129,3 +218,23 @@ skillsync scan
|
|
|
129
218
|
- Linux: systemd user service
|
|
130
219
|
|
|
131
220
|
The service periodically pulls/pushes the GitHub vault and reapplies symlinks.
|
|
221
|
+
|
|
222
|
+
## Development
|
|
223
|
+
|
|
224
|
+
Clone and test locally:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
git clone https://github.com/AksharP5/skillsync.git
|
|
228
|
+
cd skillsync
|
|
229
|
+
npm install
|
|
230
|
+
npm test
|
|
231
|
+
npm pack --dry-run
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
The npm package name is `@akshar5/skillsync` because `skillsync` is already taken on npm. The installed command is still `skillsync`.
|
|
235
|
+
|
|
236
|
+
Future releases are managed by Release Please and GitHub Actions. Use conventional commits:
|
|
237
|
+
|
|
238
|
+
- `fix:` creates a patch release.
|
|
239
|
+
- `feat:` creates a minor release.
|
|
240
|
+
- `feat!:` or `BREAKING CHANGE:` creates a major release.
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -97,10 +97,10 @@ async function resolveRepoCloneUrl(repo) {
|
|
|
97
97
|
if (/^(git@|https?:\/\/|ssh:\/\/)/.test(repo)) return repo;
|
|
98
98
|
if (!repo.includes('/')) return repo;
|
|
99
99
|
if (!await commandExists('gh')) return repo;
|
|
100
|
-
const { stdout } = await gh(['repo', 'view', repo, '--json', 'isPrivate,
|
|
100
|
+
const { stdout } = await gh(['repo', 'view', repo, '--json', 'isPrivate,url', '--jq', '.']);
|
|
101
101
|
const view = JSON.parse(stdout);
|
|
102
102
|
if (!view.isPrivate) throw new Error(`${repo} exists but is not private. Make it private before using it as a skill vault.`);
|
|
103
|
-
return view.
|
|
103
|
+
return view.url;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
async function setup(rest) {
|
|
@@ -133,10 +133,10 @@ async function setup(rest) {
|
|
|
133
133
|
console.log(`Creating private GitHub repo ${repo}...`);
|
|
134
134
|
await gh(['repo', 'create', repo, '--private', '--description', 'Private AI agent skills vault'], undefined, { inherit: true });
|
|
135
135
|
}
|
|
136
|
-
const { stdout: viewOut } = await gh(['repo', 'view', repo, '--json', 'isPrivate,
|
|
136
|
+
const { stdout: viewOut } = await gh(['repo', 'view', repo, '--json', 'isPrivate,url', '--jq', '.']);
|
|
137
137
|
const view = JSON.parse(viewOut);
|
|
138
138
|
if (!view.isPrivate) throw new Error(`${repo} exists but is not private. Make it private before using it as a skill vault.`);
|
|
139
|
-
repo = view.
|
|
139
|
+
repo = view.url;
|
|
140
140
|
} else {
|
|
141
141
|
repo = await resolveRepoCloneUrl(repo);
|
|
142
142
|
}
|