@spences10/pi-skills 0.0.14 → 0.0.15
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 +18 -4
- package/dist/commands.js +110 -5
- package/dist/commands.js.map +1 -1
- package/dist/gh-skill.d.ts +26 -0
- package/dist/gh-skill.js +115 -0
- package/dist/gh-skill.js.map +1 -0
- package/dist/skills-ui/github.d.ts +3 -0
- package/dist/skills-ui/github.js +221 -0
- package/dist/skills-ui/github.js.map +1 -0
- package/dist/skills-ui/home.d.ts +2 -0
- package/dist/skills-ui/home.js +41 -0
- package/dist/skills-ui/home.js.map +1 -0
- package/dist/skills-ui/importable.d.ts +3 -0
- package/dist/skills-ui/importable.js +91 -0
- package/dist/skills-ui/importable.js.map +1 -0
- package/dist/skills-ui/manage.d.ts +3 -0
- package/dist/skills-ui/manage.js +46 -0
- package/dist/skills-ui/manage.js.map +1 -0
- package/dist/skills-ui/profiles.d.ts +6 -0
- package/dist/skills-ui/profiles.js +165 -0
- package/dist/skills-ui/profiles.js.map +1 -0
- package/dist/skills-ui/skill-list.d.ts +10 -0
- package/dist/skills-ui/skill-list.js +39 -0
- package/dist/skills-ui/skill-list.js.map +1 -0
- package/dist/skills-ui.d.ts +6 -17
- package/dist/skills-ui.js +6 -351
- package/dist/skills-ui.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { show_input_modal, show_picker_modal, show_text_modal, } from '@spences10/pi-tui-modal';
|
|
2
|
+
import { has_gh_skill, list_github_repository_skills, run_gh_skill_install, run_gh_skill_update, } from '../gh-skill.js';
|
|
3
|
+
function is_already_installed_error(error) {
|
|
4
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
5
|
+
return message.includes('already installed');
|
|
6
|
+
}
|
|
7
|
+
export async function show_add_github_skill_modal(ctx) {
|
|
8
|
+
if (!has_gh_skill()) {
|
|
9
|
+
ctx.ui.notify('Add GitHub skill requires gh v2.90.0+ with `gh skill` support.', 'warning');
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const repository = await show_input_modal(ctx, {
|
|
13
|
+
title: 'Add GitHub skill',
|
|
14
|
+
subtitle: 'Example: spences10/skills',
|
|
15
|
+
label: 'Repository (owner/repo)',
|
|
16
|
+
trim: true,
|
|
17
|
+
});
|
|
18
|
+
if (!repository)
|
|
19
|
+
return false;
|
|
20
|
+
const action = await show_picker_modal(ctx, {
|
|
21
|
+
title: 'Add GitHub skill',
|
|
22
|
+
subtitle: repository,
|
|
23
|
+
items: [
|
|
24
|
+
{
|
|
25
|
+
value: 'one',
|
|
26
|
+
label: 'Choose one skill',
|
|
27
|
+
description: 'Enter a skill name or exact path to install',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
value: 'all',
|
|
31
|
+
label: 'Install all skills from repo',
|
|
32
|
+
description: 'List SKILL.md files through gh api, install each one, then reload',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
value: 'preview',
|
|
36
|
+
label: 'Preview/browse',
|
|
37
|
+
description: 'Coming later: preview repository skills before installing',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
if (!action)
|
|
42
|
+
return false;
|
|
43
|
+
if (action === 'preview') {
|
|
44
|
+
await show_text_modal(ctx, {
|
|
45
|
+
title: 'Preview/browse coming later',
|
|
46
|
+
text: `For now, use:\n\ngh skill preview ${repository}`,
|
|
47
|
+
});
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (action === 'one') {
|
|
51
|
+
const skill = await show_input_modal(ctx, {
|
|
52
|
+
title: 'Add one GitHub skill',
|
|
53
|
+
subtitle: `${repository} • example: svelte-runes or svelte-runes@v1.0.0`,
|
|
54
|
+
label: 'Skill name, optionally @tag-or-sha',
|
|
55
|
+
trim: true,
|
|
56
|
+
});
|
|
57
|
+
if (!skill)
|
|
58
|
+
return false;
|
|
59
|
+
try {
|
|
60
|
+
const output = run_gh_skill_install({
|
|
61
|
+
repository,
|
|
62
|
+
skill,
|
|
63
|
+
flags: [],
|
|
64
|
+
});
|
|
65
|
+
await show_text_modal(ctx, {
|
|
66
|
+
title: 'GitHub skill added',
|
|
67
|
+
text: `${output || `Installed ${skill} from ${repository}`}\n\nReloading...`,
|
|
68
|
+
});
|
|
69
|
+
await ctx.reload();
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const ref_mode = await show_picker_modal(ctx, {
|
|
78
|
+
title: 'Install all GitHub skills',
|
|
79
|
+
subtitle: repository,
|
|
80
|
+
items: [
|
|
81
|
+
{
|
|
82
|
+
value: 'default',
|
|
83
|
+
label: 'Use default branch',
|
|
84
|
+
description: 'Install current default branch without a pin',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
value: 'pin',
|
|
88
|
+
label: 'Pin to tag, branch, or commit SHA',
|
|
89
|
+
description: 'Recommended for reviewed/reproducible installs',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
if (!ref_mode)
|
|
94
|
+
return false;
|
|
95
|
+
const pin = ref_mode === 'pin'
|
|
96
|
+
? await show_input_modal(ctx, {
|
|
97
|
+
title: 'Install all GitHub skills',
|
|
98
|
+
subtitle: repository,
|
|
99
|
+
label: 'Pin tag, branch, or commit SHA',
|
|
100
|
+
trim: true,
|
|
101
|
+
})
|
|
102
|
+
: undefined;
|
|
103
|
+
if (ref_mode === 'pin' && !pin)
|
|
104
|
+
return false;
|
|
105
|
+
const existing_mode = await show_picker_modal(ctx, {
|
|
106
|
+
title: 'Install all GitHub skills',
|
|
107
|
+
subtitle: 'When a skill is already installed',
|
|
108
|
+
items: [
|
|
109
|
+
{
|
|
110
|
+
value: 'skip',
|
|
111
|
+
label: 'Skip existing skills',
|
|
112
|
+
description: 'Leave installed skills unchanged',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
value: 'overwrite',
|
|
116
|
+
label: 'Overwrite existing skills',
|
|
117
|
+
description: 'Pass --force to gh skill install',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
if (!existing_mode)
|
|
122
|
+
return false;
|
|
123
|
+
try {
|
|
124
|
+
const skills = list_github_repository_skills(repository, pin);
|
|
125
|
+
if (skills.length === 0) {
|
|
126
|
+
ctx.ui.notify(`No SKILL.md files found in ${repository}`, 'warning');
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const lines = [];
|
|
130
|
+
let installed = 0;
|
|
131
|
+
let skipped = 0;
|
|
132
|
+
let failed = 0;
|
|
133
|
+
for (const skill of skills) {
|
|
134
|
+
const flags = [
|
|
135
|
+
...(pin ? ['--pin', pin] : []),
|
|
136
|
+
...(existing_mode === 'overwrite' ? ['--force'] : []),
|
|
137
|
+
];
|
|
138
|
+
try {
|
|
139
|
+
const output = run_gh_skill_install({
|
|
140
|
+
repository,
|
|
141
|
+
skill: skill.path,
|
|
142
|
+
flags,
|
|
143
|
+
});
|
|
144
|
+
installed += 1;
|
|
145
|
+
lines.push(`✓ ${skill.name}`);
|
|
146
|
+
if (output)
|
|
147
|
+
lines.push(output.split('\n')[0] ?? output);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (existing_mode === 'skip' &&
|
|
151
|
+
is_already_installed_error(error)) {
|
|
152
|
+
skipped += 1;
|
|
153
|
+
lines.push(`⊘ ${skill.name} already installed`);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
failed += 1;
|
|
157
|
+
lines.push(`! ${skill.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
await show_text_modal(ctx, {
|
|
161
|
+
title: 'GitHub skills added',
|
|
162
|
+
text: `Installed ${installed}, skipped ${skipped}, failed ${failed} from ${repository}.\n\n${lines.join('\n')}${installed > 0 ? '\n\nReloading...' : ''}`,
|
|
163
|
+
});
|
|
164
|
+
if (installed > 0) {
|
|
165
|
+
await ctx.reload();
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export async function show_update_github_skills_modal(ctx) {
|
|
176
|
+
if (!has_gh_skill()) {
|
|
177
|
+
ctx.ui.notify('Update GitHub skills requires gh v2.90.0+ with `gh skill` support.', 'warning');
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const check_output = run_gh_skill_update(['--dry-run']);
|
|
182
|
+
const selected = await show_picker_modal(ctx, {
|
|
183
|
+
title: 'Update GitHub skills',
|
|
184
|
+
subtitle: 'Dry-run result',
|
|
185
|
+
items: [
|
|
186
|
+
{
|
|
187
|
+
value: 'apply',
|
|
188
|
+
label: 'Apply updates',
|
|
189
|
+
description: 'Run gh skill update --all and reload',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
value: 'check-only',
|
|
193
|
+
label: 'Check only',
|
|
194
|
+
description: 'Show dry-run output without modifying files',
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
footer: check_output || 'No output from gh skill update --dry-run.',
|
|
198
|
+
});
|
|
199
|
+
if (!selected)
|
|
200
|
+
return false;
|
|
201
|
+
if (selected === 'check-only') {
|
|
202
|
+
await show_text_modal(ctx, {
|
|
203
|
+
title: 'GitHub skill update check',
|
|
204
|
+
text: check_output || 'No output from gh skill update --dry-run.',
|
|
205
|
+
});
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
const output = run_gh_skill_update(['--all']);
|
|
209
|
+
await show_text_modal(ctx, {
|
|
210
|
+
title: 'GitHub skills updated',
|
|
211
|
+
text: `${output || 'gh skill update --all completed.'}\n\nReloading...`,
|
|
212
|
+
});
|
|
213
|
+
await ctx.reload();
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/skills-ui/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { show_picker_modal } from '@spences10/pi-tui-modal';
|
|
2
|
+
export async function show_skills_home_modal(ctx, managed_count, importable_count, active_profile) {
|
|
3
|
+
return await show_picker_modal(ctx, {
|
|
4
|
+
title: 'Skills',
|
|
5
|
+
subtitle: `${managed_count} managed • ${importable_count} importable • profile ${active_profile}`,
|
|
6
|
+
items: [
|
|
7
|
+
{
|
|
8
|
+
value: 'manage',
|
|
9
|
+
label: 'Manage skills',
|
|
10
|
+
description: 'Search and enable/disable managed skills',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
value: 'importable',
|
|
14
|
+
label: 'Importable skills',
|
|
15
|
+
description: 'Batch import external skills or sync imported copies',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
value: 'add',
|
|
19
|
+
label: 'Add GitHub skill',
|
|
20
|
+
description: 'Install a skill from owner/repo using gh skill',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
value: 'update',
|
|
24
|
+
label: 'Update GitHub skills',
|
|
25
|
+
description: 'Check GitHub-installed skills and apply updates',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
value: 'profiles',
|
|
29
|
+
label: 'Profiles',
|
|
30
|
+
description: 'Switch profiles and edit profile rules',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
value: 'refresh',
|
|
34
|
+
label: 'Refresh discovery',
|
|
35
|
+
description: 'Rescan managed and importable skills',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
footer: 'enter opens • esc close/back',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/skills-ui/home.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,GAA4B,EAC5B,aAAqB,EACrB,gBAAwB,EACxB,cAAsB;IAEtB,OAAO,MAAM,iBAAiB,CAAC,GAAG,EAAE;QACnC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,GAAG,aAAa,cAAc,gBAAgB,yBAAyB,cAAc,EAAE;QACjG,KAAK,EAAE;YACN;gBACC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,0CAA0C;aACvD;YACD;gBACC,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,mBAAmB;gBAC1B,WAAW,EACV,sDAAsD;aACvD;YACD;gBACC,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,WAAW,EAAE,gDAAgD;aAC7D;YACD;gBACC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,sBAAsB;gBAC7B,WAAW,EACV,iDAAiD;aAClD;YACD;gBACC,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU;gBACjB,WAAW,EAAE,wCAAwC;aACrD;YACD;gBACC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,mBAAmB;gBAC1B,WAAW,EAAE,sCAAsC;aACnD;SACD;QACD,MAAM,EAAE,8BAA8B;KACtC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { show_settings_modal } from '@spences10/pi-tui-modal';
|
|
2
|
+
import { find_matching_imported_skill, find_skill, get_importable_state, sort_skills, } from '../skill-utils.js';
|
|
3
|
+
const IMPORT_SELECTED = '● import';
|
|
4
|
+
const SYNC_SELECTED = '● sync';
|
|
5
|
+
const SKIP_SELECTED = '○ skip';
|
|
6
|
+
function importable_action_label(state) {
|
|
7
|
+
if (state.action === 'import')
|
|
8
|
+
return 'Import';
|
|
9
|
+
if (state.action === 'sync')
|
|
10
|
+
return 'Sync available';
|
|
11
|
+
return state.label === 'managed'
|
|
12
|
+
? 'Already managed'
|
|
13
|
+
: 'Already imported';
|
|
14
|
+
}
|
|
15
|
+
export async function show_importable_skills_modal(ctx, mgr) {
|
|
16
|
+
const managed = sort_skills(mgr.discover());
|
|
17
|
+
const importable = sort_skills(mgr.discover_importable());
|
|
18
|
+
if (importable.length === 0) {
|
|
19
|
+
ctx.ui.notify('No importable skills found');
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const selected = new Map();
|
|
23
|
+
const metadata_by_id = new Map();
|
|
24
|
+
const items = importable.map((skill) => {
|
|
25
|
+
const state = get_importable_state(managed, skill);
|
|
26
|
+
metadata_by_id.set(skill.key, [
|
|
27
|
+
`${importable_action_label(state)} • ${skill.source} • ${skill.key}`,
|
|
28
|
+
skill.description,
|
|
29
|
+
state.detail,
|
|
30
|
+
skill.baseDir,
|
|
31
|
+
].join('\n'));
|
|
32
|
+
const values = state.action === 'import'
|
|
33
|
+
? [SKIP_SELECTED, IMPORT_SELECTED]
|
|
34
|
+
: state.action === 'sync'
|
|
35
|
+
? [SKIP_SELECTED, SYNC_SELECTED]
|
|
36
|
+
: [state.label];
|
|
37
|
+
return {
|
|
38
|
+
id: skill.key,
|
|
39
|
+
label: skill.name,
|
|
40
|
+
description: '',
|
|
41
|
+
currentValue: values[0],
|
|
42
|
+
values,
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
await show_settings_modal(ctx, {
|
|
46
|
+
title: 'Importable skills',
|
|
47
|
+
subtitle: () => {
|
|
48
|
+
const actions = [...selected.values()].filter((value) => value !== SKIP_SELECTED).length;
|
|
49
|
+
return `${importable.length} external skills • ${actions} selected`;
|
|
50
|
+
},
|
|
51
|
+
items,
|
|
52
|
+
max_visible: Math.min(Math.max(items.length + 4, 8), 12),
|
|
53
|
+
enable_search: true,
|
|
54
|
+
metadata: (item) => item ? metadata_by_id.get(item.id)?.split('\n') : undefined,
|
|
55
|
+
on_change: (id, new_value) => {
|
|
56
|
+
if (new_value === SKIP_SELECTED)
|
|
57
|
+
selected.delete(id);
|
|
58
|
+
else
|
|
59
|
+
selected.set(id, new_value);
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
let changed = false;
|
|
63
|
+
for (const [key, action] of selected) {
|
|
64
|
+
const skill = find_skill(importable, key);
|
|
65
|
+
try {
|
|
66
|
+
if (action === IMPORT_SELECTED) {
|
|
67
|
+
mgr.import_skill(skill.key);
|
|
68
|
+
changed = true;
|
|
69
|
+
}
|
|
70
|
+
else if (action === SYNC_SELECTED) {
|
|
71
|
+
const imported_skill = find_matching_imported_skill(managed, skill);
|
|
72
|
+
if (!imported_skill) {
|
|
73
|
+
ctx.ui.notify(`Imported copy for ${skill.name} was not found`, 'warning');
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
changed =
|
|
77
|
+
mgr.sync_skill(imported_skill.key).changed || changed;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (changed) {
|
|
85
|
+
ctx.ui.notify('Updated importable skills. Reloading...', 'info');
|
|
86
|
+
await ctx.reload();
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=importable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importable.js","sourceRoot":"","sources":["../../src/skills-ui/importable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { show_settings_modal } from '@spences10/pi-tui-modal';
|
|
2
|
+
import { ENABLED, sets_equal, sort_skills, to_setting_item, } from '../skill-utils.js';
|
|
3
|
+
export async function show_skills_manager_modal(ctx, mgr) {
|
|
4
|
+
const discovered = sort_skills(mgr.discover());
|
|
5
|
+
if (discovered.length === 0) {
|
|
6
|
+
ctx.ui.notify('No managed skills found');
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const initial_enabled = new Set(discovered
|
|
10
|
+
.filter((skill) => skill.enabled)
|
|
11
|
+
.map((skill) => skill.key));
|
|
12
|
+
const current_enabled = new Set(initial_enabled);
|
|
13
|
+
const items = discovered.map(to_setting_item);
|
|
14
|
+
const metadata_by_id = new Map(items.map((item) => [item.id, item.description ?? '']));
|
|
15
|
+
for (const item of items)
|
|
16
|
+
item.description = '';
|
|
17
|
+
await show_settings_modal(ctx, {
|
|
18
|
+
title: 'Manage skills',
|
|
19
|
+
subtitle: () => {
|
|
20
|
+
const enabled = current_enabled.size;
|
|
21
|
+
const disabled = discovered.length - enabled;
|
|
22
|
+
return `profile ${mgr.get_active_profile()} • ${enabled} enabled • ${disabled} disabled`;
|
|
23
|
+
},
|
|
24
|
+
items,
|
|
25
|
+
max_visible: Math.min(Math.max(items.length + 4, 8), 12),
|
|
26
|
+
enable_search: true,
|
|
27
|
+
metadata: (item) => item ? metadata_by_id.get(item.id)?.split('\n') : undefined,
|
|
28
|
+
on_change: (id, new_value) => {
|
|
29
|
+
if (new_value === ENABLED) {
|
|
30
|
+
current_enabled.add(id);
|
|
31
|
+
mgr.enable(id);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
current_enabled.delete(id);
|
|
35
|
+
mgr.disable(id);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
if (!sets_equal(initial_enabled, current_enabled)) {
|
|
40
|
+
ctx.ui.notify('Reloading to apply updated skills...', 'info');
|
|
41
|
+
await ctx.reload();
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../src/skills-ui/manage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACN,OAAO,EACP,UAAU,EACV,WAAW,EACX,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,GAA4B,EAC5B,GAAkB;IAElB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAC9B,UAAU;SACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;SAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAC3B,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,CAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CACtD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAEhD,MAAM,mBAAmB,CAAC,GAAG,EAAE;QAC9B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,GAAG,EAAE;YACd,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC;YACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;YAC7C,OAAO,WAAW,GAAG,CAAC,kBAAkB,EAAE,MAAM,OAAO,cAAc,QAAQ,WAAW,CAAC;QAC1F,CAAC;QACD,KAAK;QACL,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxD,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5D,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE;YAC5B,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC3B,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACP,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3B,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACF,CAAC;KACD,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { SkillsManager } from '../manager.js';
|
|
3
|
+
export declare function show_refresh_summary(ctx: ExtensionCommandContext, mgr: SkillsManager): Promise<void>;
|
|
4
|
+
export declare function show_defaults_modal(ctx: ExtensionCommandContext, mgr: SkillsManager): Promise<void>;
|
|
5
|
+
export declare function pick_profile(ctx: ExtensionCommandContext, mgr: SkillsManager, title: string): Promise<string | undefined>;
|
|
6
|
+
export declare function show_profiles_modal(ctx: ExtensionCommandContext, mgr: SkillsManager): Promise<boolean>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { show_input_modal, show_picker_modal, show_text_modal, } from '@spences10/pi-tui-modal';
|
|
2
|
+
import { format_profile_detail, profile_description, } from '../skill-utils.js';
|
|
3
|
+
export async function show_refresh_summary(ctx, mgr) {
|
|
4
|
+
mgr.refresh();
|
|
5
|
+
ctx.ui.notify(`Skills refreshed: ${mgr.discover().length} managed, ${mgr.discover_importable().length} importable`, 'info');
|
|
6
|
+
}
|
|
7
|
+
export async function show_defaults_modal(ctx, mgr) {
|
|
8
|
+
const selected = await show_picker_modal(ctx, {
|
|
9
|
+
title: 'Default skill policy',
|
|
10
|
+
subtitle: `Active profile: ${mgr.get_active_profile()}`,
|
|
11
|
+
items: [
|
|
12
|
+
{
|
|
13
|
+
value: 'all-enabled',
|
|
14
|
+
label: 'Enable by default',
|
|
15
|
+
description: 'Start with matching skills enabled; exclude rules turn skills off',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
value: 'all-disabled',
|
|
19
|
+
label: 'Disable by default',
|
|
20
|
+
description: 'Start with skills disabled; include rules turn skills on',
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
if (!selected)
|
|
25
|
+
return;
|
|
26
|
+
mgr.set_defaults(selected);
|
|
27
|
+
await show_text_modal(ctx, {
|
|
28
|
+
title: 'Default skill policy updated',
|
|
29
|
+
text: `Active profile now starts from: ${selected}`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export async function pick_profile(ctx, mgr, title) {
|
|
33
|
+
return await show_picker_modal(ctx, {
|
|
34
|
+
title,
|
|
35
|
+
subtitle: `Active: ${mgr.get_active_profile()}`,
|
|
36
|
+
items: mgr.list_profiles().map((profile) => ({
|
|
37
|
+
value: profile.name,
|
|
38
|
+
label: `${profile.active ? '● ' : '○ '}${profile.name}`,
|
|
39
|
+
description: profile_description(profile),
|
|
40
|
+
})),
|
|
41
|
+
empty_message: 'No skill profiles found',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function show_profiles_modal(ctx, mgr) {
|
|
45
|
+
while (true) {
|
|
46
|
+
const selected = await show_picker_modal(ctx, {
|
|
47
|
+
title: 'Skill profiles',
|
|
48
|
+
subtitle: `Active: ${mgr.get_active_profile()}`,
|
|
49
|
+
items: [
|
|
50
|
+
{
|
|
51
|
+
value: 'use',
|
|
52
|
+
label: 'Use profile',
|
|
53
|
+
description: 'Switch the active skill profile and reload',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
value: 'create',
|
|
57
|
+
label: 'Create profile',
|
|
58
|
+
description: 'Create a named skill profile',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
value: 'include',
|
|
62
|
+
label: 'Add include rule',
|
|
63
|
+
description: 'Turn on skills that match a profile pattern',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
value: 'exclude',
|
|
67
|
+
label: 'Add exclude rule',
|
|
68
|
+
description: 'Turn off skills that match a profile pattern',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
value: 'defaults',
|
|
72
|
+
label: 'Default skill policy',
|
|
73
|
+
description: 'Choose the profile starting point before rules apply',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
value: 'show',
|
|
77
|
+
label: 'Show profile details',
|
|
78
|
+
description: 'Inspect include/exclude patterns',
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
footer: 'patterns match skill names, keys, sources, or paths; * is supported',
|
|
82
|
+
});
|
|
83
|
+
if (!selected)
|
|
84
|
+
return false;
|
|
85
|
+
if (selected === 'use') {
|
|
86
|
+
const profile = await pick_profile(ctx, mgr, 'Use skill profile');
|
|
87
|
+
if (!profile)
|
|
88
|
+
continue;
|
|
89
|
+
try {
|
|
90
|
+
mgr.use_profile(profile);
|
|
91
|
+
ctx.ui.notify(`Using skill profile ${profile}. Reloading...`, 'info');
|
|
92
|
+
await ctx.reload();
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (selected === 'create') {
|
|
100
|
+
const name = await show_input_modal(ctx, {
|
|
101
|
+
title: 'Create skill profile',
|
|
102
|
+
label: 'Profile name',
|
|
103
|
+
trim: true,
|
|
104
|
+
});
|
|
105
|
+
if (!name)
|
|
106
|
+
continue;
|
|
107
|
+
try {
|
|
108
|
+
mgr.create_profile(name);
|
|
109
|
+
await show_text_modal(ctx, {
|
|
110
|
+
title: 'Skill profile created',
|
|
111
|
+
text: `Created empty profile ${name}. Use /skills profile use ${name} to activate it, then /skills enable <skill> to add skills.`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (selected === 'include' || selected === 'exclude') {
|
|
119
|
+
const profile = await pick_profile(ctx, mgr, selected === 'include'
|
|
120
|
+
? 'Choose profile for include rule'
|
|
121
|
+
: 'Choose profile for exclude rule');
|
|
122
|
+
if (!profile)
|
|
123
|
+
continue;
|
|
124
|
+
const pattern = await show_input_modal(ctx, {
|
|
125
|
+
title: selected === 'include'
|
|
126
|
+
? 'Add include rule'
|
|
127
|
+
: 'Add exclude rule',
|
|
128
|
+
subtitle: `Profile: ${profile}`,
|
|
129
|
+
label: 'Skill name, key, or pattern',
|
|
130
|
+
trim: true,
|
|
131
|
+
});
|
|
132
|
+
if (!pattern)
|
|
133
|
+
continue;
|
|
134
|
+
try {
|
|
135
|
+
if (selected === 'include')
|
|
136
|
+
mgr.include_in_profile(profile, pattern);
|
|
137
|
+
else
|
|
138
|
+
mgr.exclude_from_profile(profile, pattern);
|
|
139
|
+
ctx.ui.notify(`Updated ${profile}. Reloading...`, 'info');
|
|
140
|
+
await ctx.reload();
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (selected === 'defaults') {
|
|
148
|
+
await show_defaults_modal(ctx, mgr);
|
|
149
|
+
}
|
|
150
|
+
else if (selected === 'show') {
|
|
151
|
+
const profile_name = await pick_profile(ctx, mgr, 'Show skill profile');
|
|
152
|
+
const profile = mgr
|
|
153
|
+
.list_profiles()
|
|
154
|
+
.find((p) => p.name === profile_name);
|
|
155
|
+
if (!profile)
|
|
156
|
+
continue;
|
|
157
|
+
await show_text_modal(ctx, {
|
|
158
|
+
title: profile.name,
|
|
159
|
+
subtitle: profile_description(profile),
|
|
160
|
+
text: format_profile_detail(profile),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/skills-ui/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { ManagedSkill, SkillsManager } from '../manager.js';
|
|
3
|
+
export declare function pick_skill(ctx: ExtensionCommandContext, options: {
|
|
4
|
+
title: string;
|
|
5
|
+
subtitle: string;
|
|
6
|
+
skills: ManagedSkill[];
|
|
7
|
+
empty_message: string;
|
|
8
|
+
}): Promise<string | undefined>;
|
|
9
|
+
export declare function show_skill_detail_modal(ctx: ExtensionCommandContext, skill: ManagedSkill): Promise<void>;
|
|
10
|
+
export declare function show_skill_list_modal(ctx: ExtensionCommandContext, mgr: SkillsManager): Promise<void>;
|