@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.
Files changed (3) hide show
  1. package/README.md +156 -47
  2. package/package.json +1 -1
  3. 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
- ## Install on another device
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
- SkillSync is an npm-style CLI package. Once published, the nice path will be:
69
+ ## Install on a new device
70
+
71
+ Install prerequisites on macOS:
24
72
 
25
73
  ```bash
26
- npx @akshar5/skillsync setup --repo AksharP5/skills
27
- npx @akshar5/skillsync add https://github.com/raroque/vibe-security-skill --skill vibe-security
74
+ brew install gh git node
75
+ gh auth login
28
76
  ```
29
77
 
30
- It is not published to the public npm registry yet. Install it from the private GitHub repo for now:
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
- # macOS
34
- brew install gh git node
83
+ npm install -g @akshar5/skillsync
84
+ ```
35
85
 
36
- gh auth login
37
- npm install -g git+ssh://git@github.com/AksharP5/skillsync.git
86
+ Connect to an existing vault:
87
+
88
+ ```bash
89
+ skillsync setup --repo AksharP5/skills
38
90
  ```
39
91
 
40
- If SSH is not set up on that device yet, use the clone/link fallback:
92
+ Or create/select a vault repo under your GitHub account:
41
93
 
42
94
  ```bash
43
- mkdir -p ~/projects
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
- Connect to an existing vault:
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
- Or create/select a different private vault repo name:
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 setup --name my-skills
158
+ skillsync install my-skill --target codex
159
+ skillsync uninstall my-skill
60
160
  ```
61
161
 
62
- If you run plain `skillsync setup` in an interactive terminal, it asks for the repo name and defaults to `skills`. `setup --name` creates `OWNER/my-skills` as a private GitHub repo if it does not exist. If it exists, SkillSync verifies it is private before using it.
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/raroque/vibe-security-skill --skill vibe-security
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akshar5/skillsync",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Local-first GitHub-backed skill vault sync client for AI agent skills.",
5
5
  "type": "module",
6
6
  "repository": {
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,sshUrl', '--jq', '.']);
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.sshUrl;
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,sshUrl', '--jq', '.']);
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.sshUrl;
139
+ repo = view.url;
140
140
  } else {
141
141
  repo = await resolveRepoCloneUrl(repo);
142
142
  }