@spences10/pi-skills 0.0.8 → 0.0.10

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 CHANGED
@@ -54,22 +54,32 @@ detect local edits and upstream changes.
54
54
 
55
55
  ```text
56
56
  /skills
57
+ /skills enable <key|name|pattern>
58
+ /skills disable <key|name|pattern>
57
59
  /skills import <key-or-name>
58
60
  /skills sync <key-or-name>
61
+ /skills profile create <name>
62
+ /skills profile use <name>
59
63
  /skills refresh
60
64
  /skills defaults all-enabled
61
65
  /skills defaults all-disabled
62
66
  ```
63
67
 
64
68
  With a UI available, `/skills` opens a modal home menu for managing,
65
- importing, syncing, refreshing, and setting default policy. The no-arg
66
- `import`, `sync`, and `defaults` subcommands use modal pickers/forms
67
- in interactive mode. In headless mode, use the subcommands directly.
69
+ importing, syncing, refreshing, profile switching, and profile
70
+ baseline selection. The no-arg `import`, `sync`, and `defaults`
71
+ subcommands use modal pickers/forms in interactive mode. In headless
72
+ mode, use the subcommands directly.
68
73
 
69
74
  ## Skill enablement
70
75
 
71
- The extension tracks enabled/disabled state in its own config and
72
- contributes enabled managed skill paths during Pi resource discovery.
76
+ The extension treats profiles as named skill sets. The active profile
77
+ contains include/exclude rules for skill names, keys, sources, or
78
+ paths; `*` wildcards are supported. Legacy top-level enablement is
79
+ migrated into the `default` profile on load.
80
+
81
+ The extension contributes enabled managed skill paths during Pi
82
+ resource discovery.
73
83
 
74
84
  In a custom harness such as `my-pi`, this can be combined with a
75
85
  resource filter to enforce disabled skills. In vanilla `pi`, Pi's own
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from '@mariozechner/pi-coding-agent';
2
+ export default function skills(pi: ExtensionAPI): Promise<void>;
@@ -0,0 +1,481 @@
1
+ import { show_input_modal, show_text_modal, } from '@spences10/pi-tui-modal';
2
+ import { create_skills_manager } from './manager.js';
3
+ import { find_skill, format_profile_detail, format_skill_detail, format_skill_list, profile_description, sort_skills, } from './skill-utils.js';
4
+ import { pick_profile, pick_skill, show_defaults_modal, show_profiles_modal, show_refresh_summary, show_skill_detail_modal, show_skill_list_modal, show_skills_home_modal, show_skills_manager_modal, } from './skills-ui.js';
5
+ export default async function skills(pi) {
6
+ const mgr = create_skills_manager();
7
+ const subs = [
8
+ 'list',
9
+ 'show',
10
+ 'enable',
11
+ 'disable',
12
+ 'import',
13
+ 'sync',
14
+ 'profile',
15
+ 'refresh',
16
+ 'defaults',
17
+ ];
18
+ pi.registerCommand('skills', {
19
+ description: 'Manage pi-native skills and import external skills',
20
+ getArgumentCompletions: (prefix) => {
21
+ const parts = prefix.trimStart().split(/\s+/);
22
+ const has_trailing_space = /\s$/.test(prefix);
23
+ if (parts.length <= 1 && !has_trailing_space) {
24
+ return subs
25
+ .filter((s) => s.startsWith(parts[0] || ''))
26
+ .map((s) => ({ value: s, label: s }));
27
+ }
28
+ if (['show', 'enable', 'disable'].includes(parts[0] ?? '')) {
29
+ const q = parts.slice(1).join(' ').toLowerCase();
30
+ const skills = parts[0] === 'show'
31
+ ? [...mgr.discover(), ...mgr.discover_importable()]
32
+ : mgr.discover();
33
+ return sort_skills(skills)
34
+ .filter((s) => s.key.toLowerCase().includes(q) ||
35
+ s.name.toLowerCase().includes(q))
36
+ .slice(0, 20)
37
+ .map((s) => ({
38
+ value: `${parts[0]} ${s.key}`,
39
+ label: s.key,
40
+ }));
41
+ }
42
+ if (parts[0] === 'import') {
43
+ const q = parts.slice(1).join(' ').toLowerCase();
44
+ return sort_skills(mgr.discover_importable())
45
+ .filter((s) => s.key.toLowerCase().includes(q) ||
46
+ s.name.toLowerCase().includes(q))
47
+ .slice(0, 20)
48
+ .map((s) => ({
49
+ value: `${parts[0]} ${s.key}`,
50
+ label: s.key,
51
+ }));
52
+ }
53
+ if (parts[0] === 'sync') {
54
+ const q = parts.slice(1).join(' ').toLowerCase();
55
+ return sort_skills(mgr
56
+ .discover()
57
+ .filter((skill) => Boolean(skill.import_meta)))
58
+ .filter((s) => s.key.toLowerCase().includes(q) ||
59
+ s.name.toLowerCase().includes(q))
60
+ .slice(0, 20)
61
+ .map((s) => ({
62
+ value: `${parts[0]} ${s.key}`,
63
+ label: s.key,
64
+ }));
65
+ }
66
+ if (parts[0] === 'profile') {
67
+ const profile_subs = [
68
+ 'list',
69
+ 'show',
70
+ 'use',
71
+ 'create',
72
+ 'include',
73
+ 'exclude',
74
+ ];
75
+ if (parts.length <= 2 && !has_trailing_space) {
76
+ return profile_subs
77
+ .filter((s) => s.startsWith(parts[1] || ''))
78
+ .map((s) => ({ value: `profile ${s}`, label: s }));
79
+ }
80
+ if (['show', 'use', 'include', 'exclude'].includes(parts[1] ?? '')) {
81
+ const q = parts.slice(2).join(' ').toLowerCase();
82
+ return mgr
83
+ .list_profiles()
84
+ .filter((profile) => profile.name.toLowerCase().includes(q))
85
+ .slice(0, 20)
86
+ .map((profile) => ({
87
+ value: `profile ${parts[1]} ${profile.name}`,
88
+ label: profile.name,
89
+ }));
90
+ }
91
+ }
92
+ return null;
93
+ },
94
+ handler: async (args, ctx) => {
95
+ const trimmed = args.trim();
96
+ if (!trimmed && ctx.hasUI) {
97
+ while (true) {
98
+ const managed_count = mgr.discover().length;
99
+ const importable_count = mgr.discover_importable().length;
100
+ const selected = await show_skills_home_modal(ctx, managed_count, importable_count, mgr.get_active_profile());
101
+ if (!selected)
102
+ return;
103
+ if (selected === 'manage') {
104
+ if (await show_skills_manager_modal(ctx, mgr))
105
+ return;
106
+ }
107
+ else if (selected === 'browse') {
108
+ await show_skill_list_modal(ctx, mgr);
109
+ }
110
+ else if (selected === 'import') {
111
+ const key = await pick_skill(ctx, {
112
+ title: 'Import skill',
113
+ subtitle: 'Copy an external skill into Pi-native storage',
114
+ skills: sort_skills(mgr.discover_importable()),
115
+ empty_message: 'No importable skills found',
116
+ });
117
+ if (!key)
118
+ continue;
119
+ try {
120
+ const result = mgr.import_skill(key);
121
+ ctx.ui.notify(`Imported ${key} to ${result.skillDir}. Reloading...`, 'info');
122
+ await ctx.reload();
123
+ return;
124
+ }
125
+ catch (error) {
126
+ ctx.ui.notify(error instanceof Error
127
+ ? error.message
128
+ : String(error), 'warning');
129
+ }
130
+ }
131
+ else if (selected === 'sync') {
132
+ const key = await pick_skill(ctx, {
133
+ title: 'Sync imported skill',
134
+ subtitle: 'Update an imported skill from its upstream source',
135
+ skills: sort_skills(mgr
136
+ .discover()
137
+ .filter((skill) => Boolean(skill.import_meta))),
138
+ empty_message: 'No imported skills found',
139
+ });
140
+ if (!key)
141
+ continue;
142
+ try {
143
+ const result = mgr.sync_skill(key);
144
+ if (result.changed) {
145
+ ctx.ui.notify(`Synced ${key}. Reloading...`, 'info');
146
+ await ctx.reload();
147
+ return;
148
+ }
149
+ await show_text_modal(ctx, {
150
+ title: 'Skill already up to date',
151
+ text: `${key} is already up to date.`,
152
+ });
153
+ }
154
+ catch (error) {
155
+ ctx.ui.notify(error instanceof Error
156
+ ? error.message
157
+ : String(error), 'warning');
158
+ }
159
+ }
160
+ else if (selected === 'profiles') {
161
+ if (await show_profiles_modal(ctx, mgr))
162
+ return;
163
+ }
164
+ else if (selected === 'refresh') {
165
+ await show_refresh_summary(ctx, mgr);
166
+ }
167
+ else if (selected === 'defaults') {
168
+ await show_defaults_modal(ctx, mgr);
169
+ }
170
+ }
171
+ }
172
+ const [sub, ...rest] = (trimmed || 'list').split(/\s+/);
173
+ const arg = rest.join(' ');
174
+ switch (sub) {
175
+ case 'list': {
176
+ const skills = [
177
+ ...mgr.discover(),
178
+ ...mgr.discover_importable(),
179
+ ];
180
+ if (ctx.hasUI) {
181
+ await show_skill_list_modal(ctx, mgr);
182
+ }
183
+ else {
184
+ ctx.ui.notify(format_skill_list(skills));
185
+ }
186
+ break;
187
+ }
188
+ case 'show': {
189
+ const skills = [
190
+ ...mgr.discover(),
191
+ ...mgr.discover_importable(),
192
+ ];
193
+ let target = arg;
194
+ if (!target && ctx.hasUI) {
195
+ target =
196
+ (await pick_skill(ctx, {
197
+ title: 'Show skill details',
198
+ subtitle: 'Open a read-only skill detail view',
199
+ skills: sort_skills(skills),
200
+ empty_message: 'No skills found',
201
+ })) ?? '';
202
+ if (!target)
203
+ return;
204
+ }
205
+ if (!target) {
206
+ ctx.ui.notify('Usage: /skills show <key|name>', 'warning');
207
+ return;
208
+ }
209
+ try {
210
+ const skill = find_skill(skills, target);
211
+ if (ctx.hasUI) {
212
+ await show_skill_detail_modal(ctx, skill);
213
+ }
214
+ else {
215
+ ctx.ui.notify(format_skill_detail(skill));
216
+ }
217
+ }
218
+ catch (error) {
219
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
220
+ }
221
+ break;
222
+ }
223
+ case 'enable':
224
+ case 'disable': {
225
+ let target = arg;
226
+ if (!target && ctx.hasUI) {
227
+ target =
228
+ (await pick_skill(ctx, {
229
+ title: sub === 'enable'
230
+ ? 'Enable skill in active profile'
231
+ : 'Disable skill in active profile',
232
+ subtitle: `Profile: ${mgr.get_active_profile()}`,
233
+ skills: sort_skills(mgr.discover()),
234
+ empty_message: 'No managed skills found',
235
+ })) ?? '';
236
+ if (!target)
237
+ return;
238
+ }
239
+ if (!target) {
240
+ ctx.ui.notify(`Usage: /skills ${sub} <key|name|pattern>`, 'warning');
241
+ return;
242
+ }
243
+ let pattern = target;
244
+ try {
245
+ pattern = find_skill(mgr.discover(), target).key;
246
+ }
247
+ catch {
248
+ // Treat misses as patterns, e.g. design-* or *@plugin:vendor.
249
+ }
250
+ if (sub === 'enable')
251
+ mgr.enable(pattern);
252
+ else
253
+ mgr.disable(pattern);
254
+ ctx.ui.notify(`Updated ${mgr.get_active_profile()} profile. Reloading...`, 'info');
255
+ await ctx.reload();
256
+ return;
257
+ }
258
+ case 'import': {
259
+ let target = arg;
260
+ if (!target && ctx.hasUI) {
261
+ target =
262
+ (await pick_skill(ctx, {
263
+ title: 'Import skill',
264
+ subtitle: 'Copy an external skill into Pi-native storage',
265
+ skills: sort_skills(mgr.discover_importable()),
266
+ empty_message: 'No importable skills found',
267
+ })) ?? '';
268
+ if (!target)
269
+ return;
270
+ }
271
+ if (!target) {
272
+ ctx.ui.notify('Usage: /skills import <key|name>', 'warning');
273
+ return;
274
+ }
275
+ try {
276
+ const result = mgr.import_skill(target);
277
+ ctx.ui.notify(`Imported ${target} to ${result.skillDir}. Reloading...`, 'info');
278
+ await ctx.reload();
279
+ return;
280
+ }
281
+ catch (error) {
282
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
283
+ return;
284
+ }
285
+ }
286
+ case 'sync': {
287
+ let target = arg;
288
+ if (!target && ctx.hasUI) {
289
+ target =
290
+ (await pick_skill(ctx, {
291
+ title: 'Sync imported skill',
292
+ subtitle: 'Update an imported skill from its upstream source',
293
+ skills: sort_skills(mgr
294
+ .discover()
295
+ .filter((skill) => Boolean(skill.import_meta))),
296
+ empty_message: 'No imported skills found',
297
+ })) ?? '';
298
+ if (!target)
299
+ return;
300
+ }
301
+ if (!target) {
302
+ ctx.ui.notify('Usage: /skills sync <key|name>', 'warning');
303
+ return;
304
+ }
305
+ try {
306
+ const result = mgr.sync_skill(target);
307
+ if (result.changed) {
308
+ ctx.ui.notify(`Synced ${target}. Reloading...`, 'info');
309
+ await ctx.reload();
310
+ return;
311
+ }
312
+ if (ctx.hasUI) {
313
+ await show_text_modal(ctx, {
314
+ title: 'Skill already up to date',
315
+ text: `${target} is already up to date.`,
316
+ });
317
+ }
318
+ else {
319
+ ctx.ui.notify(`${target} is already up to date.`, 'info');
320
+ }
321
+ return;
322
+ }
323
+ catch (error) {
324
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
325
+ return;
326
+ }
327
+ }
328
+ case 'profile': {
329
+ const [action = 'list', name, ...pattern_parts] = rest;
330
+ const pattern = pattern_parts.join(' ');
331
+ if (!args.trim().startsWith('profile') && ctx.hasUI) {
332
+ if (await show_profiles_modal(ctx, mgr))
333
+ return;
334
+ break;
335
+ }
336
+ if (action === 'list') {
337
+ const text = mgr
338
+ .list_profiles()
339
+ .map((profile) => `${profile.active ? 'active' : ' '} ${profile.name} — ${profile_description(profile)}`)
340
+ .join('\n');
341
+ if (ctx.hasUI) {
342
+ await show_text_modal(ctx, {
343
+ title: 'Skill profiles',
344
+ text: text || 'No skill profiles found',
345
+ });
346
+ }
347
+ else {
348
+ ctx.ui.notify(text || 'No skill profiles found');
349
+ }
350
+ break;
351
+ }
352
+ if (action === 'show') {
353
+ let target = name;
354
+ if (!target && ctx.hasUI) {
355
+ target = await pick_profile(ctx, mgr, 'Show skill profile');
356
+ }
357
+ const profile = mgr
358
+ .list_profiles()
359
+ .find((candidate) => candidate.name === target);
360
+ if (!profile) {
361
+ ctx.ui.notify('Usage: /skills profile show <name>', 'warning');
362
+ break;
363
+ }
364
+ if (ctx.hasUI) {
365
+ await show_text_modal(ctx, {
366
+ title: profile.name,
367
+ text: format_profile_detail(profile),
368
+ });
369
+ }
370
+ else {
371
+ ctx.ui.notify(format_profile_detail(profile));
372
+ }
373
+ break;
374
+ }
375
+ if (action === 'use') {
376
+ let target = name;
377
+ if (!target && ctx.hasUI) {
378
+ target = await pick_profile(ctx, mgr, 'Use skill profile');
379
+ }
380
+ if (!target) {
381
+ ctx.ui.notify('Usage: /skills profile use <name>', 'warning');
382
+ break;
383
+ }
384
+ try {
385
+ mgr.use_profile(target);
386
+ ctx.ui.notify(`Using skill profile ${target}. Reloading...`, 'info');
387
+ await ctx.reload();
388
+ return;
389
+ }
390
+ catch (error) {
391
+ ctx.ui.notify(error instanceof Error
392
+ ? error.message
393
+ : String(error), 'warning');
394
+ }
395
+ break;
396
+ }
397
+ if (action === 'create') {
398
+ let target = name;
399
+ if (!target && ctx.hasUI) {
400
+ target = await show_input_modal(ctx, {
401
+ title: 'Create skill profile',
402
+ label: 'Profile name',
403
+ trim: true,
404
+ });
405
+ }
406
+ if (!target) {
407
+ ctx.ui.notify('Usage: /skills profile create <name>', 'warning');
408
+ break;
409
+ }
410
+ try {
411
+ mgr.create_profile(target);
412
+ ctx.ui.notify(`Created empty skill profile ${target}`);
413
+ }
414
+ catch (error) {
415
+ ctx.ui.notify(error instanceof Error
416
+ ? error.message
417
+ : String(error), 'warning');
418
+ }
419
+ break;
420
+ }
421
+ if (action === 'include' || action === 'exclude') {
422
+ if (!name || !pattern) {
423
+ ctx.ui.notify(`Usage: /skills profile ${action} <name> <pattern>`, 'warning');
424
+ break;
425
+ }
426
+ try {
427
+ if (action === 'include')
428
+ mgr.include_in_profile(name, pattern);
429
+ else
430
+ mgr.exclude_from_profile(name, pattern);
431
+ ctx.ui.notify(`Updated skill profile ${name}. Reloading...`, 'info');
432
+ await ctx.reload();
433
+ return;
434
+ }
435
+ catch (error) {
436
+ ctx.ui.notify(error instanceof Error
437
+ ? error.message
438
+ : String(error), 'warning');
439
+ }
440
+ break;
441
+ }
442
+ ctx.ui.notify('Usage: /skills profile <list|show|use|create|include|exclude>', 'warning');
443
+ break;
444
+ }
445
+ case 'refresh': {
446
+ if (ctx.hasUI) {
447
+ await show_refresh_summary(ctx, mgr);
448
+ break;
449
+ }
450
+ mgr.refresh();
451
+ ctx.ui.notify(`Rescanned: ${mgr.discover().length} managed skills, ${mgr.discover_importable().length} importable skills found`);
452
+ break;
453
+ }
454
+ case 'defaults': {
455
+ if (!arg && ctx.hasUI) {
456
+ await show_defaults_modal(ctx, mgr);
457
+ break;
458
+ }
459
+ if (arg !== 'all-enabled' && arg !== 'all-disabled') {
460
+ ctx.ui.notify('Usage: /skills defaults <all-enabled|all-disabled>', 'warning');
461
+ return;
462
+ }
463
+ mgr.set_defaults(arg);
464
+ if (ctx.hasUI) {
465
+ await show_text_modal(ctx, {
466
+ title: 'Skill profile baseline updated',
467
+ text: `Active profile baseline: ${arg}`,
468
+ });
469
+ }
470
+ else {
471
+ ctx.ui.notify(`Active profile baseline: ${arg}`);
472
+ }
473
+ break;
474
+ }
475
+ default:
476
+ ctx.ui.notify(`Unknown: ${sub}. Use: ${subs.join(', ')}`, 'warning');
477
+ }
478
+ },
479
+ });
480
+ }
481
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,9 +1,21 @@
1
+ export type SkillDefaultPolicy = 'all-enabled' | 'all-disabled';
2
+ export interface SkillProfileConfig {
3
+ description?: string;
4
+ extends?: string | string[];
5
+ include?: string[];
6
+ exclude?: string[];
7
+ }
1
8
  export interface SkillsConfig {
2
9
  version: number;
10
+ /** Legacy global enablement map. v3 stores enablement in profiles. */
3
11
  enabled: Record<string, boolean>;
4
- defaults: 'all-enabled' | 'all-disabled';
12
+ /** Legacy fallback policy. v3 stores baseline behavior as profile rules. */
13
+ defaults: SkillDefaultPolicy;
14
+ current_profile?: string;
15
+ profiles: Record<string, SkillProfileConfig>;
5
16
  }
6
17
  export declare function get_config_path(): string;
18
+ export declare function safe_profile_name(value: string): string | undefined;
7
19
  export declare function load_skills_config(): SkillsConfig;
8
20
  export declare function save_skills_config(config: SkillsConfig): void;
9
21
  export declare function make_skill_key(name: string, source: string): string;