@almyty/skills 1.0.10 → 1.0.12
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 +17 -17
- package/dist/client.js +42 -6
- package/dist/index.js +12 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Install and manage almyty skills in 30+ AI coding agents (Claude Code, Cursor, W
|
|
|
7
7
|
```bash
|
|
8
8
|
$ npx @almyty/auth login
|
|
9
9
|
$ npx @almyty/skills gateways
|
|
10
|
-
$ npx @almyty/skills install
|
|
10
|
+
$ npx @almyty/skills install org/gateway
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Commands
|
|
@@ -16,23 +16,23 @@ $ npx @almyty/skills install @org/gateway
|
|
|
16
16
|
|---------|-------------|
|
|
17
17
|
| `gateways` | List your gateways |
|
|
18
18
|
| `list` | List all available skills |
|
|
19
|
-
| `list
|
|
19
|
+
| `list org/gateway` | List skills from one gateway |
|
|
20
20
|
| `search <query>` | Search skills by keyword |
|
|
21
|
-
| `install
|
|
22
|
-
| `install
|
|
21
|
+
| `install org/gateway` | Install all skills from a gateway |
|
|
22
|
+
| `install org/gateway/skill` | Install a single skill |
|
|
23
23
|
| `installed` | Show locally installed skills |
|
|
24
24
|
| `remove` | Remove all installed skills |
|
|
25
|
-
| `run
|
|
25
|
+
| `run org/gateway/skill [--key value]` | Execute a skill |
|
|
26
26
|
| `daemon [--interval 60]` | Sync all skills on a schedule |
|
|
27
|
-
| `watch
|
|
27
|
+
| `watch org/gateway [--interval 60]` | Watch a specific gateway for changes |
|
|
28
28
|
|
|
29
29
|
## References
|
|
30
30
|
|
|
31
|
-
Skills are referenced as
|
|
31
|
+
Skills are referenced as `org/gateway` or `org/gateway/skill`:
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
$ npx @almyty/skills install
|
|
35
|
-
$ npx @almyty/skills run
|
|
34
|
+
$ npx @almyty/skills install acme/petstore
|
|
35
|
+
$ npx @almyty/skills run acme/petstore/get-pet --id 123
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
## Where skills get installed
|
|
@@ -77,14 +77,14 @@ Default behavior:
|
|
|
77
77
|
Examples:
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
|
-
$ npx @almyty/skills install
|
|
81
|
-
$ npx @almyty/skills install
|
|
82
|
-
$ npx @almyty/skills install
|
|
83
|
-
$ npx @almyty/skills install
|
|
84
|
-
$ npx @almyty/skills install
|
|
85
|
-
$ npx @almyty/skills install
|
|
86
|
-
$ npx @almyty/skills install
|
|
87
|
-
$ npx @almyty/skills install
|
|
80
|
+
$ npx @almyty/skills install acme/petstore # interactive picker
|
|
81
|
+
$ npx @almyty/skills install acme/petstore --all # every project-detected
|
|
82
|
+
$ npx @almyty/skills install acme/petstore --all --global # project AND home detected
|
|
83
|
+
$ npx @almyty/skills install acme/petstore --global # only home-detected agents
|
|
84
|
+
$ npx @almyty/skills install acme/petstore -a codex # codex at whichever scope it lives
|
|
85
|
+
$ npx @almyty/skills install acme/petstore -a codex --global # force codex at ~/.codex/skills
|
|
86
|
+
$ npx @almyty/skills install acme/petstore --agent '*' -y # every known agent at project
|
|
87
|
+
$ npx @almyty/skills install acme/petstore -p ./agents/skills # custom directory
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
The 25+ supported agents include Claude Code, Codex, Cursor, Windsurf,
|
package/dist/client.js
CHANGED
|
@@ -114,16 +114,52 @@ export class AlmytyClient {
|
|
|
114
114
|
}
|
|
115
115
|
async executeSkill(gatewayId, toolId, parameters) {
|
|
116
116
|
// The execute endpoint expects a UUID. If toolId is a name slug,
|
|
117
|
-
// resolve
|
|
117
|
+
// resolve by listing the gateway's tools and matching either
|
|
118
|
+
// the raw tool name, its kebab slug, OR the new
|
|
119
|
+
// `${gateway-slug}-${tool-slug}` composed form (with shared
|
|
120
|
+
// head segments deduped — the same rule the backend uses to
|
|
121
|
+
// generate SKILL.md names).
|
|
118
122
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
119
123
|
let resolvedId = toolId;
|
|
120
124
|
if (!uuidRegex.test(toolId)) {
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
|
|
125
|
+
const gateway = await this.request(`/gateways/${gatewayId}`).catch(() => null);
|
|
126
|
+
const gatewaySlug = gateway?.data?.endpoint?.replace(/^\/+/, '') || '';
|
|
127
|
+
// Walk every page — server caps limit at 100.
|
|
128
|
+
const allTools = [];
|
|
129
|
+
let page = 1;
|
|
130
|
+
while (true) {
|
|
131
|
+
const resp = await this.request(`/gateways/${gatewayId}/tools?limit=100&page=${page}`);
|
|
132
|
+
const data = resp?.data || resp;
|
|
133
|
+
const items = data?.gatewayTools || data?.data || (Array.isArray(data) ? data : []);
|
|
134
|
+
allTools.push(...(Array.isArray(items) ? items : []));
|
|
135
|
+
const totalPages = data?.totalPages ?? 1;
|
|
136
|
+
if (page >= totalPages || items.length === 0)
|
|
137
|
+
break;
|
|
138
|
+
page++;
|
|
139
|
+
if (page > 50)
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
const slugify = (s) => (s || '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
143
|
+
const dedupeShared = (head, tail) => {
|
|
144
|
+
const h = head.split('-').filter(Boolean);
|
|
145
|
+
const t = tail.split('-').filter(Boolean);
|
|
146
|
+
let i = 0;
|
|
147
|
+
while (i < t.length && i < h.length && t[i] === h[i])
|
|
148
|
+
i++;
|
|
149
|
+
return t.slice(i).join('-');
|
|
150
|
+
};
|
|
151
|
+
const match = allTools.find((gt) => {
|
|
124
152
|
const t = gt.tool || gt;
|
|
125
|
-
|
|
126
|
-
|
|
153
|
+
if (!t)
|
|
154
|
+
return false;
|
|
155
|
+
const rawName = t.name || '';
|
|
156
|
+
const slug = slugify(rawName);
|
|
157
|
+
const composed = gatewaySlug
|
|
158
|
+
? `${gatewaySlug}-${dedupeShared(gatewaySlug, slug)}`
|
|
159
|
+
: slug;
|
|
160
|
+
return (rawName === toolId ||
|
|
161
|
+
slug === toolId ||
|
|
162
|
+
composed === toolId);
|
|
127
163
|
});
|
|
128
164
|
if (!match) {
|
|
129
165
|
throw new Error(`Tool "${toolId}" not found in gateway ${gatewayId}`);
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { installSkills, removeSkills, listInstalledSkills } from './installer.js
|
|
|
6
6
|
import { loadConfig, resolveTargets } from './config.js';
|
|
7
7
|
import { generateMetaSkill } from './meta-skill.js';
|
|
8
8
|
import { selectInstallTargetsAuto, selectInstallTargetsInteractive, } from './target-selector.js';
|
|
9
|
-
const VERSION = '1.0.
|
|
9
|
+
const VERSION = '1.0.12';
|
|
10
10
|
function printHelp() {
|
|
11
11
|
console.log(`
|
|
12
12
|
almyty Skills CLI v${VERSION}
|
|
@@ -74,9 +74,9 @@ Target selection (install):
|
|
|
74
74
|
Examples:
|
|
75
75
|
npx @almyty/skills daemon
|
|
76
76
|
npx @almyty/skills install myorg/petstore/get-pet
|
|
77
|
-
npx @almyty/skills install
|
|
78
|
-
npx @almyty/skills install
|
|
79
|
-
npx @almyty/skills install
|
|
77
|
+
npx @almyty/skills install acme/petstore -a codex -a claude
|
|
78
|
+
npx @almyty/skills install acme/petstore --path ./tmp/skills --yes
|
|
79
|
+
npx @almyty/skills install acme/petstore --all
|
|
80
80
|
npx @almyty/skills search "weather"
|
|
81
81
|
npx @almyty/skills run myorg/petstore/get-pet --petId 123
|
|
82
82
|
`);
|
|
@@ -182,7 +182,7 @@ function requireRef(args, command) {
|
|
|
182
182
|
const ref = getRef(args);
|
|
183
183
|
if (!ref) {
|
|
184
184
|
console.error('Error: reference required');
|
|
185
|
-
console.error(` npx @almyty/skills ${command}
|
|
185
|
+
console.error(` npx @almyty/skills ${command} <org>/<gateway>`);
|
|
186
186
|
console.error(` npx @almyty/skills ${command} <skill-name>`);
|
|
187
187
|
process.exit(1);
|
|
188
188
|
}
|
|
@@ -239,7 +239,7 @@ async function main() {
|
|
|
239
239
|
const slug = gw.name.toLowerCase().replace(/\s+/g, '-');
|
|
240
240
|
console.log(` ${gw.name}`);
|
|
241
241
|
console.log(` Type: ${gw.type}`);
|
|
242
|
-
console.log(` Use: npx @almyty/skills install
|
|
242
|
+
console.log(` Use: npx @almyty/skills install <org>/${slug}`);
|
|
243
243
|
console.log('');
|
|
244
244
|
}
|
|
245
245
|
break;
|
|
@@ -256,7 +256,7 @@ async function main() {
|
|
|
256
256
|
}
|
|
257
257
|
console.log(`\n${allSkills.length} skills available:\n`);
|
|
258
258
|
for (const skill of allSkills) {
|
|
259
|
-
const label = skill.gateway ?
|
|
259
|
+
const label = skill.gateway ? `${skill.orgSlug}/${skill.gatewaySlug}/${skill.name}` : skill.name;
|
|
260
260
|
const desc = skill.description ? ` — ${skill.description}` : '';
|
|
261
261
|
console.log(` ${label}${desc}`);
|
|
262
262
|
}
|
|
@@ -283,7 +283,7 @@ async function main() {
|
|
|
283
283
|
}
|
|
284
284
|
console.log(`\n${allSkills.length} skills available:\n`);
|
|
285
285
|
for (const skill of allSkills) {
|
|
286
|
-
const label = skill.gateway ?
|
|
286
|
+
const label = skill.gateway ? `${skill.orgSlug}/${skill.gatewaySlug}/${skill.name}` : skill.name;
|
|
287
287
|
const desc = skill.description ? ` — ${skill.description}` : '';
|
|
288
288
|
console.log(` ${label}${desc}`);
|
|
289
289
|
}
|
|
@@ -332,10 +332,11 @@ async function main() {
|
|
|
332
332
|
}
|
|
333
333
|
else if (parsed.type === 'skill') {
|
|
334
334
|
console.log('Fetching skill...');
|
|
335
|
-
const gatewayRef =
|
|
335
|
+
const gatewayRef = `${parsed.orgSlug}/${parsed.gatewaySlug}`;
|
|
336
336
|
const fetched = await client.fetchSkills(gatewayRef);
|
|
337
337
|
const match = fetched.find(s => s.name === parsed.skillName ||
|
|
338
|
-
s.fileName === `almyty-${parsed.skillName}`
|
|
338
|
+
s.fileName === `almyty-${parsed.skillName}` ||
|
|
339
|
+
s.fileName === parsed.skillName);
|
|
339
340
|
if (!match) {
|
|
340
341
|
console.error(`Skill "${parsed.skillName}" not found in ${gatewayRef}`);
|
|
341
342
|
const available = fetched.map(s => s.name).join(', ');
|
|
@@ -511,7 +512,7 @@ async function main() {
|
|
|
511
512
|
}
|
|
512
513
|
if (totalFound === 0) {
|
|
513
514
|
console.log('No almyty skills installed in this directory.');
|
|
514
|
-
console.log('Install: npx @almyty/skills install
|
|
515
|
+
console.log('Install: npx @almyty/skills install <org>/<gateway>');
|
|
515
516
|
}
|
|
516
517
|
break;
|
|
517
518
|
}
|