@aexol/opencode-wizard 0.1.12 → 0.1.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/dist/tui.js CHANGED
@@ -9,7 +9,7 @@ import { createElement as _$createElement } from "@opentui/solid";
9
9
  /** @jsxImportSource @opentui/solid */
10
10
 
11
11
  import { createEffect, createMemo, createSignal } from 'solid-js';
12
- import { PLUGIN_ID, resolvePluginStatusSnapshotWithAuthBootstrap } from './server.js';
12
+ import { PLUGIN_ID, resolvePluginStatusSnapshotWithAuthBootstrap, setPublishedSkillInstalled, setPublishedSkillIgnored } from './server.js';
13
13
  const STATUS_TIMEOUT_MS = 5_000;
14
14
  const STATUS_REFRESH_INTERVAL_MS = 5_000;
15
15
  const MAX_STATUS_MESSAGE_LENGTH = 80;
@@ -214,40 +214,118 @@ const getSkillTags = skill => {
214
214
  if (tagLabels.length === 0) return 'no tags';
215
215
  return tagLabels.join(', ');
216
216
  };
217
- const getSkillMeta = skill => `${skill.policyLabel} · ${skill.contextKind} · ${getSkillTags(skill)}`;
217
+ const getSkillMeta = (skill, state) => `${skill.policyLabel} · ${state} · ${getSkillTags(skill)}`;
218
+ const getRowStateLabel = row => {
219
+ if (row.ignored) return 'ignored';
220
+ if (row.state === 'installable') return 'not installed';
221
+ return row.state === 'installed-global' ? 'installed global' : 'installed project';
222
+ };
218
223
  const SkillCatalogRow = props => {
219
- const description = getSkillDescription(props.skill);
224
+ const skill = props.row.skill;
225
+ const description = getSkillDescription(skill);
226
+ const canUninstall = skill.assignmentSource === 'USER_GLOBAL' || skill.assignmentSource === 'USER_WORKSPACE';
220
227
  return (() => {
221
228
  var _el$18 = _$createElement("box"),
222
- _el$19 = _$createElement("text"),
223
- _el$20 = _$createElement("b"),
224
- _el$21 = _$createElement("text");
229
+ _el$19 = _$createElement("box"),
230
+ _el$20 = _$createElement("text"),
231
+ _el$21 = _$createElement("b"),
232
+ _el$22 = _$createTextNode(` (`),
233
+ _el$24 = _$createTextNode(`)`),
234
+ _el$25 = _$createElement("box"),
235
+ _el$26 = _$createElement("text");
225
236
  _$insertNode(_el$18, _el$19);
226
- _$insertNode(_el$18, _el$21);
237
+ _$insertNode(_el$18, _el$26);
227
238
  _$setProp(_el$18, "width", "100%");
228
239
  _$setProp(_el$18, "flexDirection", "column");
229
240
  _$setProp(_el$18, "overflow", "hidden");
230
241
  _$setProp(_el$18, "marginBottom", 1);
231
242
  _$insertNode(_el$19, _el$20);
232
- _$setProp(_el$19, "wrapMode", "none");
243
+ _$insertNode(_el$19, _el$25);
244
+ _$setProp(_el$19, "width", "100%");
245
+ _$setProp(_el$19, "flexDirection", "row");
246
+ _$setProp(_el$19, "justifyContent", "space-between");
233
247
  _$setProp(_el$19, "overflow", "hidden");
234
- _$insert(_el$20, () => compactSkillName(getSkillDisplayName(props.skill)));
235
- _$setProp(_el$21, "wrapMode", "none");
236
- _$setProp(_el$21, "overflow", "hidden");
237
- _$insert(_el$21, () => compactSkillMeta(getSkillMeta(props.skill)));
248
+ _$insertNode(_el$20, _el$21);
249
+ _$insertNode(_el$20, _el$22);
250
+ _$insertNode(_el$20, _el$24);
251
+ _$setProp(_el$20, "wrapMode", "none");
252
+ _$setProp(_el$20, "overflow", "hidden");
253
+ _$insert(_el$21, () => compactSkillName(getSkillDisplayName(skill)));
254
+ _$insert(_el$20, () => getRowStateLabel(props.row), _el$24);
255
+ _$setProp(_el$25, "flexDirection", "row");
256
+ _$setProp(_el$25, "flexShrink", 0);
257
+ _$insert(_el$25, (() => {
258
+ var _c$ = _$memo(() => props.row.state === 'installable');
259
+ return () => _c$() ? [(() => {
260
+ var _el$27 = _$createElement("box"),
261
+ _el$28 = _$createElement("text");
262
+ _$insertNode(_el$27, _el$28);
263
+ _$setProp(_el$27, "onMouseUp", () => props.onInstall(props.row, 'global'));
264
+ _$setProp(_el$27, "flexShrink", 0);
265
+ _$insertNode(_el$28, _$createTextNode(`Global`));
266
+ _$setProp(_el$28, "wrapMode", "none");
267
+ _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
268
+ return _el$27;
269
+ })(), (() => {
270
+ var _el$30 = _$createElement("text");
271
+ _$insertNode(_el$30, _$createTextNode(` / `));
272
+ _$setProp(_el$30, "wrapMode", "none");
273
+ _$effect(_$p => _$setProp(_el$30, "fg", props.theme.textMuted, _$p));
274
+ return _el$30;
275
+ })(), (() => {
276
+ var _el$32 = _$createElement("box"),
277
+ _el$33 = _$createElement("text");
278
+ _$insertNode(_el$32, _el$33);
279
+ _$setProp(_el$32, "onMouseUp", () => props.onInstall(props.row, 'project'));
280
+ _$setProp(_el$32, "flexShrink", 0);
281
+ _$insertNode(_el$33, _$createTextNode(`Project`));
282
+ _$setProp(_el$33, "wrapMode", "none");
283
+ _$effect(_$p => _$setProp(_el$33, "fg", props.theme.textMuted, _$p));
284
+ return _el$32;
285
+ })()] : [(() => {
286
+ var _el$35 = _$createElement("box"),
287
+ _el$36 = _$createElement("text");
288
+ _$insertNode(_el$35, _el$36);
289
+ _$setProp(_el$35, "onMouseUp", () => props.onIgnore(props.row));
290
+ _$setProp(_el$35, "flexShrink", 0);
291
+ _$setProp(_el$36, "wrapMode", "none");
292
+ _$insert(_el$36, () => props.row.ignored ? 'Unignore' : 'Ignore');
293
+ _$effect(_$p => _$setProp(_el$36, "fg", props.theme.textMuted, _$p));
294
+ return _el$35;
295
+ })(), canUninstall ? [(() => {
296
+ var _el$37 = _$createElement("text");
297
+ _$insertNode(_el$37, _$createTextNode(` / `));
298
+ _$setProp(_el$37, "wrapMode", "none");
299
+ _$effect(_$p => _$setProp(_el$37, "fg", props.theme.textMuted, _$p));
300
+ return _el$37;
301
+ })(), (() => {
302
+ var _el$39 = _$createElement("box"),
303
+ _el$40 = _$createElement("text");
304
+ _$insertNode(_el$39, _el$40);
305
+ _$setProp(_el$39, "onMouseUp", () => props.onUninstall(props.row));
306
+ _$setProp(_el$39, "flexShrink", 0);
307
+ _$insertNode(_el$40, _$createTextNode(`Uninstall`));
308
+ _$setProp(_el$40, "wrapMode", "none");
309
+ _$effect(_$p => _$setProp(_el$40, "fg", props.theme.textMuted, _$p));
310
+ return _el$39;
311
+ })()] : null];
312
+ })());
313
+ _$setProp(_el$26, "wrapMode", "none");
314
+ _$setProp(_el$26, "overflow", "hidden");
315
+ _$insert(_el$26, () => compactSkillMeta(getSkillMeta(skill, props.row.state)));
238
316
  _$insert(_el$18, description ? (() => {
239
- var _el$22 = _$createElement("text");
240
- _$setProp(_el$22, "wrapMode", "none");
241
- _$setProp(_el$22, "overflow", "hidden");
242
- _$insert(_el$22, () => compactSkillDescription(description));
243
- _$effect(_$p => _$setProp(_el$22, "fg", props.theme.text, _$p));
244
- return _el$22;
317
+ var _el$42 = _$createElement("text");
318
+ _$setProp(_el$42, "wrapMode", "none");
319
+ _$setProp(_el$42, "overflow", "hidden");
320
+ _$insert(_el$42, () => compactSkillDescription(description));
321
+ _$effect(_$p => _$setProp(_el$42, "fg", props.theme.text, _$p));
322
+ return _el$42;
245
323
  })() : null, null);
246
324
  _$effect(_p$ => {
247
- var _v$6 = props.theme.text,
325
+ var _v$6 = props.row.ignored ? props.theme.textMuted : props.theme.text,
248
326
  _v$7 = props.theme.textMuted;
249
- _v$6 !== _p$.e && (_p$.e = _$setProp(_el$19, "fg", _v$6, _p$.e));
250
- _v$7 !== _p$.t && (_p$.t = _$setProp(_el$21, "fg", _v$7, _p$.t));
327
+ _v$6 !== _p$.e && (_p$.e = _$setProp(_el$20, "fg", _v$6, _p$.e));
328
+ _v$7 !== _p$.t && (_p$.t = _$setProp(_el$26, "fg", _v$7, _p$.t));
251
329
  return _p$;
252
330
  }, {
253
331
  e: undefined,
@@ -262,46 +340,61 @@ const WizardSkillsDialogContent = props => {
262
340
  const currentStatus = props.status();
263
341
  if (currentStatus.kind === 'loading') {
264
342
  return (() => {
265
- var _el$23 = _$createElement("text");
266
- _$insertNode(_el$23, _$createTextNode(`Refreshing published skills…`));
267
- _$setProp(_el$23, "wrapMode", "none");
268
- _$setProp(_el$23, "overflow", "hidden");
269
- _$effect(_$p => _$setProp(_el$23, "fg", props.theme.textMuted, _$p));
270
- return _el$23;
343
+ var _el$43 = _$createElement("text");
344
+ _$insertNode(_el$43, _$createTextNode(`Refreshing published skills…`));
345
+ _$setProp(_el$43, "wrapMode", "none");
346
+ _$setProp(_el$43, "overflow", "hidden");
347
+ _$effect(_$p => _$setProp(_el$43, "fg", props.theme.textMuted, _$p));
348
+ return _el$43;
271
349
  })();
272
350
  }
273
351
  if (currentStatus.kind === 'error') {
274
352
  return (() => {
275
- var _el$25 = _$createElement("text"),
276
- _el$26 = _$createTextNode(`unavailable: `);
277
- _$insertNode(_el$25, _el$26);
278
- _$setProp(_el$25, "wrapMode", "none");
279
- _$setProp(_el$25, "overflow", "hidden");
280
- _$insert(_el$25, () => compactStatusMessage(currentStatus.message), null);
281
- _$effect(_$p => _$setProp(_el$25, "fg", props.theme.warning, _$p));
282
- return _el$25;
353
+ var _el$45 = _$createElement("text"),
354
+ _el$46 = _$createTextNode(`unavailable: `);
355
+ _$insertNode(_el$45, _el$46);
356
+ _$setProp(_el$45, "wrapMode", "none");
357
+ _$setProp(_el$45, "overflow", "hidden");
358
+ _$insert(_el$45, () => compactStatusMessage(currentStatus.message), null);
359
+ _$effect(_$p => _$setProp(_el$45, "fg", props.theme.warning, _$p));
360
+ return _el$45;
283
361
  })();
284
362
  }
285
363
  if (!currentStatus.snapshot.catalog) {
286
364
  return (() => {
287
- var _el$27 = _$createElement("text"),
288
- _el$28 = _$createTextNode(`catalog `);
289
- _$insertNode(_el$27, _el$28);
290
- _$setProp(_el$27, "wrapMode", "none");
291
- _$setProp(_el$27, "overflow", "hidden");
292
- _$insert(_el$27, () => formatSkillsCatalogUnavailableMessage(currentStatus.snapshot), null);
293
- _$effect(_$p => _$setProp(_el$27, "fg", props.theme.textMuted, _$p));
294
- return _el$27;
365
+ var _el$47 = _$createElement("text"),
366
+ _el$48 = _$createTextNode(`catalog `);
367
+ _$insertNode(_el$47, _el$48);
368
+ _$setProp(_el$47, "wrapMode", "none");
369
+ _$setProp(_el$47, "overflow", "hidden");
370
+ _$insert(_el$47, () => formatSkillsCatalogUnavailableMessage(currentStatus.snapshot), null);
371
+ _$effect(_$p => _$setProp(_el$47, "fg", props.theme.textMuted, _$p));
372
+ return _el$47;
295
373
  })();
296
374
  }
297
375
  const {
298
376
  catalog
299
377
  } = currentStatus.snapshot;
300
- const totalPages = Math.max(1, Math.ceil(catalog.skills.length / SKILLS_PAGE_SIZE));
378
+ const activeSkillSlugs = new Set(catalog.skills.map(skill => skill.skillSlug));
379
+ const ignoredSkillSlugs = new Set(currentStatus.snapshot.ignoredPublishedSkills.skills.map(skill => skill.skillSlug));
380
+ const rows = [...catalog.skills.map(skill => ({
381
+ skill,
382
+ ignored: false,
383
+ state: skill.contextKind === 'global' ? 'installed-global' : 'installed-project'
384
+ })), ...currentStatus.snapshot.ignoredPublishedSkills.skills.map(skill => ({
385
+ skill,
386
+ ignored: true,
387
+ state: skill.contextKind === 'global' ? 'installed-global' : 'installed-project'
388
+ })), ...(currentStatus.snapshot.installableCatalog?.skills ?? []).filter(skill => !activeSkillSlugs.has(skill.skillSlug) && !ignoredSkillSlugs.has(skill.skillSlug)).map(skill => ({
389
+ skill,
390
+ ignored: false,
391
+ state: 'installable'
392
+ }))];
393
+ const totalPages = Math.max(1, Math.ceil(rows.length / SKILLS_PAGE_SIZE));
301
394
  const currentPage = Math.min(page(), totalPages - 1);
302
395
  const startIndex = currentPage * SKILLS_PAGE_SIZE;
303
- const endIndex = Math.min(startIndex + SKILLS_PAGE_SIZE, catalog.skills.length);
304
- const visibleSkills = catalog.skills.slice(startIndex, endIndex);
396
+ const endIndex = Math.min(startIndex + SKILLS_PAGE_SIZE, rows.length);
397
+ const visibleRows = rows.slice(startIndex, endIndex);
305
398
  const canGoBack = currentPage > 0;
306
399
  const canGoForward = currentPage < totalPages - 1;
307
400
  const goBack = () => {
@@ -313,94 +406,109 @@ const WizardSkillsDialogContent = props => {
313
406
  setPage(currentPage + 1);
314
407
  };
315
408
  return (() => {
316
- var _el$29 = _$createElement("box"),
317
- _el$30 = _$createElement("box"),
318
- _el$31 = _$createElement("text"),
319
- _el$32 = _$createElement("b"),
320
- _el$33 = _$createTextNode(` skills`),
321
- _el$34 = _$createTextNode(`&nbsp;· `),
322
- _el$35 = _$createTextNode(` global · `),
323
- _el$36 = _$createTextNode(` workspace`),
324
- _el$37 = _$createElement("text"),
325
- _el$38 = _$createTextNode(`page `),
326
- _el$39 = _$createTextNode(`/`),
327
- _el$40 = _$createElement("box"),
328
- _el$41 = _$createElement("box"),
329
- _el$42 = _$createElement("box"),
330
- _el$43 = _$createElement("text"),
331
- _el$45 = _$createElement("text"),
332
- _el$46 = _$createTextNode(` shown`),
333
- _el$47 = _$createElement("box"),
334
- _el$48 = _$createElement("text");
335
- _$insertNode(_el$29, _el$30);
336
- _$insertNode(_el$29, _el$40);
337
- _$insertNode(_el$29, _el$41);
338
- _$setProp(_el$29, "width", "100%");
339
- _$setProp(_el$29, "flexDirection", "column");
340
- _$setProp(_el$29, "overflow", "hidden");
341
- _$insertNode(_el$30, _el$31);
342
- _$insertNode(_el$30, _el$37);
343
- _$setProp(_el$30, "width", "100%");
344
- _$setProp(_el$30, "flexDirection", "row");
345
- _$setProp(_el$30, "justifyContent", "space-between");
346
- _$setProp(_el$30, "overflow", "hidden");
347
- _$insertNode(_el$31, _el$32);
348
- _$insertNode(_el$31, _el$34);
349
- _$insertNode(_el$31, _el$35);
350
- _$insertNode(_el$31, _el$36);
351
- _$setProp(_el$31, "wrapMode", "none");
352
- _$setProp(_el$31, "overflow", "hidden");
353
- _$insertNode(_el$32, _el$33);
354
- _$insert(_el$32, () => catalog.publishedSkillCount, _el$33);
355
- _$insert(_el$31, () => catalog.assignmentCounts.global, _el$35);
356
- _$insert(_el$31, () => catalog.assignmentCounts.project, _el$36);
357
- _$insertNode(_el$37, _el$38);
358
- _$insertNode(_el$37, _el$39);
359
- _$setProp(_el$37, "wrapMode", "none");
360
- _$insert(_el$37, currentPage + 1, _el$39);
361
- _$insert(_el$37, totalPages, null);
362
- _$setProp(_el$40, "width", "100%");
363
- _$setProp(_el$40, "flexDirection", "column");
364
- _$setProp(_el$40, "marginTop", 1);
365
- _$setProp(_el$40, "overflow", "hidden");
366
- _$insert(_el$40, () => visibleSkills.map(skill => _$createComponent(SkillCatalogRow, {
367
- skill: skill,
409
+ var _el$49 = _$createElement("box"),
410
+ _el$50 = _$createElement("box"),
411
+ _el$51 = _$createElement("text"),
412
+ _el$52 = _$createElement("b"),
413
+ _el$53 = _$createTextNode(` skills`),
414
+ _el$54 = _$createTextNode(`&nbsp;· `),
415
+ _el$55 = _$createTextNode(` global · `),
416
+ _el$56 = _$createTextNode(` workspace &nbsp;· `),
417
+ _el$57 = _$createTextNode(` ignored &nbsp;· `),
418
+ _el$58 = _$createTextNode(` installable`),
419
+ _el$59 = _$createElement("text"),
420
+ _el$60 = _$createTextNode(`page `),
421
+ _el$61 = _$createTextNode(`/`),
422
+ _el$62 = _$createElement("box"),
423
+ _el$63 = _$createElement("box"),
424
+ _el$64 = _$createElement("box"),
425
+ _el$65 = _$createElement("text"),
426
+ _el$67 = _$createElement("text"),
427
+ _el$68 = _$createTextNode(` shown`),
428
+ _el$69 = _$createElement("box"),
429
+ _el$70 = _$createElement("text");
430
+ _$insertNode(_el$49, _el$50);
431
+ _$insertNode(_el$49, _el$62);
432
+ _$insertNode(_el$49, _el$63);
433
+ _$setProp(_el$49, "width", "100%");
434
+ _$setProp(_el$49, "flexDirection", "column");
435
+ _$setProp(_el$49, "overflow", "hidden");
436
+ _$insertNode(_el$50, _el$51);
437
+ _$insertNode(_el$50, _el$59);
438
+ _$setProp(_el$50, "width", "100%");
439
+ _$setProp(_el$50, "flexDirection", "row");
440
+ _$setProp(_el$50, "justifyContent", "space-between");
441
+ _$setProp(_el$50, "overflow", "hidden");
442
+ _$insertNode(_el$51, _el$52);
443
+ _$insertNode(_el$51, _el$54);
444
+ _$insertNode(_el$51, _el$55);
445
+ _$insertNode(_el$51, _el$56);
446
+ _$insertNode(_el$51, _el$57);
447
+ _$insertNode(_el$51, _el$58);
448
+ _$setProp(_el$51, "wrapMode", "none");
449
+ _$setProp(_el$51, "overflow", "hidden");
450
+ _$insertNode(_el$52, _el$53);
451
+ _$insert(_el$52, () => catalog.publishedSkillCount, _el$53);
452
+ _$insert(_el$51, () => catalog.assignmentCounts.global, _el$55);
453
+ _$insert(_el$51, () => catalog.assignmentCounts.project, _el$56);
454
+ _$insert(_el$51, () => currentStatus.snapshot.ignoredPublishedSkills.count, _el$57);
455
+ _$insert(_el$51, () => currentStatus.snapshot.installableCatalog?.count ?? 0, _el$58);
456
+ _$insertNode(_el$59, _el$60);
457
+ _$insertNode(_el$59, _el$61);
458
+ _$setProp(_el$59, "wrapMode", "none");
459
+ _$insert(_el$59, currentPage + 1, _el$61);
460
+ _$insert(_el$59, totalPages, null);
461
+ _$setProp(_el$62, "width", "100%");
462
+ _$setProp(_el$62, "flexDirection", "column");
463
+ _$setProp(_el$62, "marginTop", 1);
464
+ _$setProp(_el$62, "overflow", "hidden");
465
+ _$insert(_el$62, () => visibleRows.map(row => _$createComponent(SkillCatalogRow, {
466
+ row: row,
368
467
  get theme() {
369
468
  return props.theme;
469
+ },
470
+ get onIgnore() {
471
+ return props.onIgnoreSkill;
472
+ },
473
+ get onInstall() {
474
+ return props.onInstallSkill;
475
+ },
476
+ get onUninstall() {
477
+ return props.onUninstallSkill;
370
478
  }
371
479
  })));
372
- _$insertNode(_el$41, _el$42);
373
- _$insertNode(_el$41, _el$45);
374
- _$insertNode(_el$41, _el$47);
375
- _$setProp(_el$41, "width", "100%");
376
- _$setProp(_el$41, "flexDirection", "row");
377
- _$setProp(_el$41, "justifyContent", "space-between");
378
- _$setProp(_el$41, "overflow", "hidden");
379
- _$insertNode(_el$42, _el$43);
380
- _$setProp(_el$42, "onMouseUp", goBack);
381
- _$setProp(_el$42, "flexShrink", 0);
382
- _$insertNode(_el$43, _$createTextNode(`← Prev`));
383
- _$setProp(_el$43, "wrapMode", "none");
384
- _$insertNode(_el$45, _el$46);
385
- _$setProp(_el$45, "wrapMode", "none");
386
- _$setProp(_el$45, "overflow", "hidden");
387
- _$insert(_el$45, () => visibleSkills.length, _el$46);
388
- _$insertNode(_el$47, _el$48);
389
- _$setProp(_el$47, "onMouseUp", goForward);
390
- _$setProp(_el$47, "flexShrink", 0);
391
- _$insertNode(_el$48, _$createTextNode(`Next →`));
392
- _$setProp(_el$48, "wrapMode", "none");
480
+ _$insertNode(_el$63, _el$64);
481
+ _$insertNode(_el$63, _el$67);
482
+ _$insertNode(_el$63, _el$69);
483
+ _$setProp(_el$63, "width", "100%");
484
+ _$setProp(_el$63, "flexDirection", "row");
485
+ _$setProp(_el$63, "justifyContent", "space-between");
486
+ _$setProp(_el$63, "overflow", "hidden");
487
+ _$insertNode(_el$64, _el$65);
488
+ _$setProp(_el$64, "onMouseUp", goBack);
489
+ _$setProp(_el$64, "flexShrink", 0);
490
+ _$insertNode(_el$65, _$createTextNode(`← Prev`));
491
+ _$setProp(_el$65, "wrapMode", "none");
492
+ _$insertNode(_el$67, _el$68);
493
+ _$setProp(_el$67, "wrapMode", "none");
494
+ _$setProp(_el$67, "overflow", "hidden");
495
+ _$insert(_el$67, () => visibleRows.length, _el$68);
496
+ _$insertNode(_el$69, _el$70);
497
+ _$setProp(_el$69, "onMouseUp", goForward);
498
+ _$setProp(_el$69, "flexShrink", 0);
499
+ _$insertNode(_el$70, _$createTextNode(`Next →`));
500
+ _$setProp(_el$70, "wrapMode", "none");
393
501
  _$effect(_p$ => {
394
502
  var _v$8 = props.theme.text,
395
503
  _v$9 = props.theme.textMuted,
396
504
  _v$0 = canGoBack ? props.theme.text : props.theme.textMuted,
397
505
  _v$1 = props.theme.textMuted,
398
506
  _v$10 = canGoForward ? props.theme.text : props.theme.textMuted;
399
- _v$8 !== _p$.e && (_p$.e = _$setProp(_el$31, "fg", _v$8, _p$.e));
400
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$37, "fg", _v$9, _p$.t));
401
- _v$0 !== _p$.a && (_p$.a = _$setProp(_el$43, "fg", _v$0, _p$.a));
402
- _v$1 !== _p$.o && (_p$.o = _$setProp(_el$45, "fg", _v$1, _p$.o));
403
- _v$10 !== _p$.i && (_p$.i = _$setProp(_el$48, "fg", _v$10, _p$.i));
507
+ _v$8 !== _p$.e && (_p$.e = _$setProp(_el$51, "fg", _v$8, _p$.e));
508
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$59, "fg", _v$9, _p$.t));
509
+ _v$0 !== _p$.a && (_p$.a = _$setProp(_el$65, "fg", _v$0, _p$.a));
510
+ _v$1 !== _p$.o && (_p$.o = _$setProp(_el$67, "fg", _v$1, _p$.o));
511
+ _v$10 !== _p$.i && (_p$.i = _$setProp(_el$70, "fg", _v$10, _p$.i));
404
512
  return _p$;
405
513
  }, {
406
514
  e: undefined,
@@ -409,7 +517,7 @@ const WizardSkillsDialogContent = props => {
409
517
  o: undefined,
410
518
  i: undefined
411
519
  });
412
- return _el$29;
520
+ return _el$49;
413
521
  })();
414
522
  };
415
523
  return _$memo(content);
@@ -440,12 +548,12 @@ const ReadyRows = props => {
440
548
  })];
441
549
  if (!props.snapshot.catalog) {
442
550
  return (() => {
443
- var _el$50 = _$createElement("box");
444
- _$setProp(_el$50, "width", "100%");
445
- _$setProp(_el$50, "flexDirection", "column");
446
- _$setProp(_el$50, "overflow", "hidden");
447
- _$insert(_el$50, statusRows, null);
448
- _$insert(_el$50, _$createComponent(Row, {
551
+ var _el$72 = _$createElement("box");
552
+ _$setProp(_el$72, "width", "100%");
553
+ _$setProp(_el$72, "flexDirection", "column");
554
+ _$setProp(_el$72, "overflow", "hidden");
555
+ _$insert(_el$72, statusRows, null);
556
+ _$insert(_el$72, _$createComponent(Row, {
449
557
  label: "catalog",
450
558
  get value() {
451
559
  return formatSkillsCatalogUnavailableMessage(props.snapshot);
@@ -457,22 +565,22 @@ const ReadyRows = props => {
457
565
  return props.theme.text;
458
566
  }
459
567
  }), null);
460
- return _el$50;
568
+ return _el$72;
461
569
  })();
462
570
  }
463
571
  const counts = props.snapshot.catalog.assignmentCounts;
464
572
  return (() => {
465
- var _el$51 = _$createElement("box"),
466
- _el$52 = _$createElement("text");
467
- _$insertNode(_el$51, _el$52);
468
- _$setProp(_el$51, "width", "100%");
469
- _$setProp(_el$51, "flexDirection", "column");
470
- _$setProp(_el$51, "overflow", "hidden");
471
- _$insert(_el$51, statusRows, _el$52);
472
- _$insertNode(_el$52, _$createTextNode(`catalog:`));
473
- _$setProp(_el$52, "wrapMode", "none");
474
- _$setProp(_el$52, "overflow", "hidden");
475
- _$insert(_el$51, _$createComponent(CatalogBullet, {
573
+ var _el$73 = _$createElement("box"),
574
+ _el$74 = _$createElement("text");
575
+ _$insertNode(_el$73, _el$74);
576
+ _$setProp(_el$73, "width", "100%");
577
+ _$setProp(_el$73, "flexDirection", "column");
578
+ _$setProp(_el$73, "overflow", "hidden");
579
+ _$insert(_el$73, statusRows, _el$74);
580
+ _$insertNode(_el$74, _$createTextNode(`catalog:`));
581
+ _$setProp(_el$74, "wrapMode", "none");
582
+ _$setProp(_el$74, "overflow", "hidden");
583
+ _$insert(_el$73, _$createComponent(CatalogBullet, {
476
584
  get value() {
477
585
  return `${props.snapshot.catalog.publishedSkillCount} loaded`;
478
586
  },
@@ -480,7 +588,7 @@ const ReadyRows = props => {
480
588
  return props.theme;
481
589
  }
482
590
  }), null);
483
- _$insert(_el$51, _$createComponent(CatalogBullet, {
591
+ _$insert(_el$73, _$createComponent(CatalogBullet, {
484
592
  get value() {
485
593
  return `${counts.global} global`;
486
594
  },
@@ -488,7 +596,7 @@ const ReadyRows = props => {
488
596
  return props.theme;
489
597
  }
490
598
  }), null);
491
- _$insert(_el$51, _$createComponent(CatalogBullet, {
599
+ _$insert(_el$73, _$createComponent(CatalogBullet, {
492
600
  get value() {
493
601
  return `${counts.project} workspace`;
494
602
  },
@@ -496,70 +604,126 @@ const ReadyRows = props => {
496
604
  return props.theme;
497
605
  }
498
606
  }), null);
499
- _$effect(_$p => _$setProp(_el$52, "fg", props.theme.textMuted, _$p));
500
- return _el$51;
607
+ _$insert(_el$73, _$createComponent(CatalogBullet, {
608
+ get value() {
609
+ return `${props.snapshot.ignoredPublishedSkills.count} ignored`;
610
+ },
611
+ get theme() {
612
+ return props.theme;
613
+ }
614
+ }), null);
615
+ _$effect(_$p => _$setProp(_el$74, "fg", props.theme.textMuted, _$p));
616
+ return _el$73;
501
617
  })();
502
618
  };
503
619
  const WizardSkillsDialog = props => {
504
620
  const theme = createMemo(() => props.api.theme.current);
621
+ const refreshAfterPreferenceChange = () => {
622
+ props.refreshStatus({
623
+ showLoading: false
624
+ });
625
+ requestRender(props.api);
626
+ };
627
+ const ignoreSkill = row => {
628
+ const currentStatus = props.status();
629
+ if (currentStatus.kind !== 'ready') return;
630
+ const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
631
+ void setPublishedSkillIgnored({
632
+ worktree: props.api.state.path.worktree,
633
+ directory: props.api.state.path.directory,
634
+ scopeKey,
635
+ skillSlug: row.skill.skillSlug,
636
+ ignored: !row.ignored,
637
+ preferenceScope: row.state === 'installed-global' ? 'global' : 'project'
638
+ }).then(refreshAfterPreferenceChange).catch(refreshAfterPreferenceChange);
639
+ };
640
+ const installSkill = (row, preferenceScope) => {
641
+ const currentStatus = props.status();
642
+ if (currentStatus.kind !== 'ready') return;
643
+ const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
644
+ void setPublishedSkillInstalled({
645
+ worktree: props.api.state.path.worktree,
646
+ directory: props.api.state.path.directory,
647
+ scopeKey,
648
+ skillSlug: row.skill.skillSlug,
649
+ installed: true,
650
+ preferenceScope
651
+ }).then(refreshAfterPreferenceChange).catch(refreshAfterPreferenceChange);
652
+ };
653
+ const uninstallSkill = row => {
654
+ const currentStatus = props.status();
655
+ if (currentStatus.kind !== 'ready') return;
656
+ const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
657
+ void setPublishedSkillInstalled({
658
+ worktree: props.api.state.path.worktree,
659
+ directory: props.api.state.path.directory,
660
+ scopeKey,
661
+ skillSlug: row.skill.skillSlug,
662
+ installed: false,
663
+ preferenceScope: row.state === 'installed-global' ? 'global' : 'project'
664
+ }).then(refreshAfterPreferenceChange).catch(refreshAfterPreferenceChange);
665
+ };
505
666
  createEffect(() => {
506
667
  props.api.ui?.dialog?.setSize?.('xlarge');
507
668
  });
508
669
  return (() => {
509
- var _el$54 = _$createElement("box"),
510
- _el$55 = _$createElement("box"),
511
- _el$56 = _$createElement("text"),
512
- _el$57 = _$createElement("b"),
513
- _el$59 = _$createElement("box"),
514
- _el$60 = _$createElement("text"),
515
- _el$62 = _$createElement("box");
516
- _$insertNode(_el$54, _el$55);
517
- _$insertNode(_el$54, _el$62);
518
- _$setProp(_el$54, "width", "100%");
519
- _$setProp(_el$54, "flexDirection", "column");
520
- _$setProp(_el$54, "paddingLeft", 1);
521
- _$setProp(_el$54, "paddingRight", 1);
522
- _$setProp(_el$54, "paddingBottom", 1);
523
- _$insertNode(_el$55, _el$56);
524
- _$insertNode(_el$55, _el$59);
525
- _$setProp(_el$55, "width", "100%");
526
- _$setProp(_el$55, "flexDirection", "row");
527
- _$setProp(_el$55, "justifyContent", "space-between");
528
- _$setProp(_el$55, "overflow", "hidden");
529
- _$insertNode(_el$56, _el$57);
530
- _$setProp(_el$56, "wrapMode", "none");
531
- _$setProp(_el$56, "overflow", "hidden");
532
- _$insertNode(_el$57, _$createTextNode(`Wizard Skills`));
533
- _$insertNode(_el$59, _el$60);
534
- _$setProp(_el$59, "flexShrink", 0);
535
- _$insertNode(_el$60, _$createTextNode(`Close`));
536
- _$setProp(_el$60, "wrapMode", "none");
537
- _$setProp(_el$62, "width", "100%");
538
- _$setProp(_el$62, "flexDirection", "column");
539
- _$setProp(_el$62, "marginTop", 1);
540
- _$setProp(_el$62, "overflow", "hidden");
541
- _$insert(_el$62, _$createComponent(WizardSkillsDialogContent, {
670
+ var _el$76 = _$createElement("box"),
671
+ _el$77 = _$createElement("box"),
672
+ _el$78 = _$createElement("text"),
673
+ _el$79 = _$createElement("b"),
674
+ _el$81 = _$createElement("box"),
675
+ _el$82 = _$createElement("text"),
676
+ _el$84 = _$createElement("box");
677
+ _$insertNode(_el$76, _el$77);
678
+ _$insertNode(_el$76, _el$84);
679
+ _$setProp(_el$76, "width", "100%");
680
+ _$setProp(_el$76, "flexDirection", "column");
681
+ _$setProp(_el$76, "paddingLeft", 1);
682
+ _$setProp(_el$76, "paddingRight", 1);
683
+ _$setProp(_el$76, "paddingBottom", 1);
684
+ _$insertNode(_el$77, _el$78);
685
+ _$insertNode(_el$77, _el$81);
686
+ _$setProp(_el$77, "width", "100%");
687
+ _$setProp(_el$77, "flexDirection", "row");
688
+ _$setProp(_el$77, "justifyContent", "space-between");
689
+ _$setProp(_el$77, "overflow", "hidden");
690
+ _$insertNode(_el$78, _el$79);
691
+ _$setProp(_el$78, "wrapMode", "none");
692
+ _$setProp(_el$78, "overflow", "hidden");
693
+ _$insertNode(_el$79, _$createTextNode(`Wizard Skills`));
694
+ _$insertNode(_el$81, _el$82);
695
+ _$setProp(_el$81, "flexShrink", 0);
696
+ _$insertNode(_el$82, _$createTextNode(`Close`));
697
+ _$setProp(_el$82, "wrapMode", "none");
698
+ _$setProp(_el$84, "width", "100%");
699
+ _$setProp(_el$84, "flexDirection", "column");
700
+ _$setProp(_el$84, "marginTop", 1);
701
+ _$setProp(_el$84, "overflow", "hidden");
702
+ _$insert(_el$84, _$createComponent(WizardSkillsDialogContent, {
542
703
  get status() {
543
704
  return props.status;
544
705
  },
545
706
  get theme() {
546
707
  return theme();
547
- }
708
+ },
709
+ onIgnoreSkill: ignoreSkill,
710
+ onInstallSkill: installSkill,
711
+ onUninstallSkill: uninstallSkill
548
712
  }));
549
713
  _$effect(_p$ => {
550
714
  var _v$11 = theme().text,
551
715
  _v$12 = props.onClose,
552
716
  _v$13 = theme().textMuted;
553
- _v$11 !== _p$.e && (_p$.e = _$setProp(_el$56, "fg", _v$11, _p$.e));
554
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$59, "onMouseUp", _v$12, _p$.t));
555
- _v$13 !== _p$.a && (_p$.a = _$setProp(_el$60, "fg", _v$13, _p$.a));
717
+ _v$11 !== _p$.e && (_p$.e = _$setProp(_el$78, "fg", _v$11, _p$.e));
718
+ _v$12 !== _p$.t && (_p$.t = _$setProp(_el$81, "onMouseUp", _v$12, _p$.t));
719
+ _v$13 !== _p$.a && (_p$.a = _$setProp(_el$82, "fg", _v$13, _p$.a));
556
720
  return _p$;
557
721
  }, {
558
722
  e: undefined,
559
723
  t: undefined,
560
724
  a: undefined
561
725
  });
562
- return _el$54;
726
+ return _el$76;
563
727
  })();
564
728
  };
565
729
  const openWizardSkillsDialog = (api, status, refreshStatus) => {
@@ -571,6 +735,7 @@ const openWizardSkillsDialog = (api, status, refreshStatus) => {
571
735
  dialog.replace(() => _$createComponent(WizardSkillsDialog, {
572
736
  api: api,
573
737
  status: status,
738
+ refreshStatus: refreshStatus,
574
739
  onClose: () => {
575
740
  dialog.clear?.();
576
741
  requestRender(api);