@skillkit/tui 1.8.1 → 1.10.0

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/index.js CHANGED
@@ -4324,6 +4324,293 @@ showing `), _el$32 = createTextNode(`-`), _el$33 = createTextNode(` of `);
4324
4324
  })();
4325
4325
  }
4326
4326
 
4327
+ // src/services/memory.service.ts
4328
+ async function loadMemories() {
4329
+ return {
4330
+ entries: [],
4331
+ status: { projectMemoryExists: false, globalMemoryExists: true },
4332
+ paths: { projectMemoryDir: ".skillkit/memory", globalMemoryDir: "~/.skillkit/memory" },
4333
+ loading: false,
4334
+ error: null
4335
+ };
4336
+ }
4337
+ async function deleteMemoryEntry(_key) {
4338
+ return true;
4339
+ }
4340
+ async function clearMemory(_path, _scope) {
4341
+ return true;
4342
+ }
4343
+ async function initializeMemory() {
4344
+ return true;
4345
+ }
4346
+
4347
+ // src/services/workflow.service.ts
4348
+ async function loadWorkflowsList(_projectPath) {
4349
+ return {
4350
+ workflows: [],
4351
+ current: null,
4352
+ progress: null,
4353
+ loading: false,
4354
+ error: null
4355
+ };
4356
+ }
4357
+ async function executeWorkflow(_name, _projectPath, _onProgress) {
4358
+ return { success: true, completedWaves: 0, totalWaves: 0, errors: [] };
4359
+ }
4360
+
4361
+ // src/services/plan.service.ts
4362
+ async function loadPlansList(_projectPath) {
4363
+ return {
4364
+ plans: [],
4365
+ current: null,
4366
+ validation: null,
4367
+ execution: null,
4368
+ loading: false,
4369
+ error: null
4370
+ };
4371
+ }
4372
+ async function loadPlan(_planPath) {
4373
+ return null;
4374
+ }
4375
+ async function validatePlan(_plan) {
4376
+ return { valid: true, errors: [], warnings: [], issues: [] };
4377
+ }
4378
+ async function executePlan(_plan, _projectPath, _onEvent, _dryRun) {
4379
+ return { success: true, completedTasks: [], failedTasks: [], totalTasks: 0, errors: [] };
4380
+ }
4381
+ async function executePlanDryRun(plan, projectPath, onEvent) {
4382
+ return executePlan(plan, projectPath, onEvent, true);
4383
+ }
4384
+
4385
+ // src/services/plugin.service.ts
4386
+ async function loadPluginsList(_projectPath) {
4387
+ return {
4388
+ plugins: [],
4389
+ manager: null,
4390
+ loading: false,
4391
+ error: null
4392
+ };
4393
+ }
4394
+ async function enablePlugin(_name, _manager) {
4395
+ return true;
4396
+ }
4397
+ async function disablePlugin(_name, _manager) {
4398
+ return true;
4399
+ }
4400
+ async function getPluginInfo(_name, _manager) {
4401
+ return null;
4402
+ }
4403
+
4404
+ // src/services/team.service.ts
4405
+ async function loadTeamConfig(_projectPath) {
4406
+ return {
4407
+ config: null,
4408
+ members: [],
4409
+ sharedSkills: [],
4410
+ loading: false,
4411
+ error: null
4412
+ };
4413
+ }
4414
+ async function initializeTeam(_teamName, _projectPath) {
4415
+ return true;
4416
+ }
4417
+
4418
+ // src/services/methodology.service.ts
4419
+ async function loadMethodologies() {
4420
+ return {
4421
+ packs: [],
4422
+ installedPacks: [],
4423
+ manager: null,
4424
+ loading: false,
4425
+ error: null
4426
+ };
4427
+ }
4428
+ async function installMethodologyPack(_name) {
4429
+ return true;
4430
+ }
4431
+ async function uninstallMethodologyPack(_name) {
4432
+ return true;
4433
+ }
4434
+ async function syncMethodologyPack(_name) {
4435
+ return true;
4436
+ }
4437
+
4438
+ // src/services/recommend.service.ts
4439
+ async function getRecommendations(_projectPath, _options) {
4440
+ return {
4441
+ recommendations: [],
4442
+ analyzing: false,
4443
+ loading: false,
4444
+ error: null,
4445
+ lastAnalyzed: (/* @__PURE__ */ new Date()).toISOString()
4446
+ };
4447
+ }
4448
+ async function analyzeProject(_projectPath) {
4449
+ return {
4450
+ languages: ["TypeScript", "JavaScript"],
4451
+ frameworks: ["Solid.js"],
4452
+ libraries: ["@opentui/solid"],
4453
+ patterns: []
4454
+ };
4455
+ }
4456
+
4457
+ // src/services/context.service.ts
4458
+ async function loadProjectContext() {
4459
+ return {
4460
+ context: {
4461
+ projectName: "skillkit",
4462
+ rootPath: process.cwd(),
4463
+ languages: ["TypeScript", "JavaScript"],
4464
+ frameworks: ["Solid.js", "React"],
4465
+ libraries: ["@opentui/solid"],
4466
+ patterns: {},
4467
+ lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
4468
+ },
4469
+ stack: null,
4470
+ loading: false,
4471
+ analyzing: false,
4472
+ error: null
4473
+ };
4474
+ }
4475
+ async function analyzeProjectContext() {
4476
+ return loadProjectContext();
4477
+ }
4478
+ async function refreshContext() {
4479
+ return loadProjectContext();
4480
+ }
4481
+ async function exportContext(_path, _format) {
4482
+ return true;
4483
+ }
4484
+ async function getStackTags() {
4485
+ return ["typescript", "solid-js", "cli"];
4486
+ }
4487
+
4488
+ // src/services/executor.service.ts
4489
+ async function getAgentAvailability() {
4490
+ return [
4491
+ { agent: "claude-code", available: true },
4492
+ { agent: "cursor", available: false },
4493
+ { agent: "codex", available: false }
4494
+ ];
4495
+ }
4496
+ async function executeSkillWithAgent(_skillPath, _agent, _options) {
4497
+ return { success: true, output: "Executed successfully" };
4498
+ }
4499
+
4500
+ // src/services/translator.service.ts
4501
+ function getSupportedAgents() {
4502
+ return [
4503
+ "claude-code",
4504
+ "cursor",
4505
+ "windsurf",
4506
+ "github-copilot",
4507
+ "codex",
4508
+ "gemini-cli",
4509
+ "opencode",
4510
+ "universal"
4511
+ ];
4512
+ }
4513
+ function checkCanTranslate(_from, _to) {
4514
+ return true;
4515
+ }
4516
+ function translate(_content, targetAgent, options) {
4517
+ return {
4518
+ sourceFormat: options?.sourceFilename || "SKILL.md",
4519
+ targetAgent,
4520
+ success: true,
4521
+ content: "",
4522
+ filename: void 0,
4523
+ warnings: [],
4524
+ incompatible: []
4525
+ };
4526
+ }
4527
+ function previewTranslation(_content, _targetAgent) {
4528
+ return {
4529
+ preview: "",
4530
+ compatible: true,
4531
+ issues: []
4532
+ };
4533
+ }
4534
+ function getAgentFormatInfo(agent) {
4535
+ const formatMap = {
4536
+ "claude-code": { extension: ".md", formatName: "SKILL.md", description: "Claude Code skills format" },
4537
+ cursor: { extension: ".mdc", formatName: "MDC", description: "Cursor rules format" },
4538
+ windsurf: { extension: ".md", formatName: "Markdown", description: "Windsurf rules format" },
4539
+ "github-copilot": { extension: ".md", formatName: "Markdown", description: "GitHub Copilot instructions" },
4540
+ codex: { extension: ".md", formatName: "Markdown", description: "Codex instructions" },
4541
+ "gemini-cli": { extension: ".md", formatName: "Markdown", description: "Gemini CLI instructions" },
4542
+ opencode: { extension: ".md", formatName: "Markdown", description: "OpenCode instructions" },
4543
+ universal: { extension: ".md", formatName: "SKILL.md", description: "Universal skill format" }
4544
+ };
4545
+ return formatMap[agent] || { extension: ".md", formatName: "Markdown", description: "Unknown format" };
4546
+ }
4547
+
4548
+ // src/services/tree.service.ts
4549
+ import { join as join3 } from "path";
4550
+ import { homedir } from "os";
4551
+ import {
4552
+ generateSkillTree,
4553
+ loadTree,
4554
+ saveTree,
4555
+ loadIndex
4556
+ } from "@skillkit/core";
4557
+ var TREE_PATH = join3(homedir(), ".skillkit", "skill-tree.json");
4558
+ async function loadOrGenerateTree() {
4559
+ try {
4560
+ let tree = loadTree(TREE_PATH);
4561
+ if (!tree) {
4562
+ const index = loadIndex();
4563
+ if (index && index.skills.length > 0) {
4564
+ tree = generateSkillTree(index.skills);
4565
+ saveTree(tree, TREE_PATH);
4566
+ }
4567
+ }
4568
+ if (!tree) {
4569
+ return {
4570
+ tree: null,
4571
+ currentNode: null,
4572
+ currentPath: [],
4573
+ loading: false,
4574
+ error: 'No skill index found. Run "skillkit recommend --update" first.'
4575
+ };
4576
+ }
4577
+ return {
4578
+ tree,
4579
+ currentNode: tree.rootNode,
4580
+ currentPath: [],
4581
+ loading: false,
4582
+ error: null
4583
+ };
4584
+ } catch (err) {
4585
+ return {
4586
+ tree: null,
4587
+ currentNode: null,
4588
+ currentPath: [],
4589
+ loading: false,
4590
+ error: err instanceof Error ? err.message : "Failed to load tree"
4591
+ };
4592
+ }
4593
+ }
4594
+ function getNodeChildren2(node) {
4595
+ return node.children.map((child) => ({
4596
+ id: child.id,
4597
+ name: child.name,
4598
+ description: child.description,
4599
+ skillCount: child.skillCount,
4600
+ childCount: child.children.length,
4601
+ depth: child.depth,
4602
+ isExpanded: false,
4603
+ isCategory: child.children.length > 0
4604
+ }));
4605
+ }
4606
+ function getNodeSkills(node) {
4607
+ return node.skills;
4608
+ }
4609
+ function formatTreePath(path) {
4610
+ if (path.length === 0) return "Root";
4611
+ return path.join(" > ");
4612
+ }
4613
+
4327
4614
  // src/screens/Marketplace.tsx
4328
4615
  var CATEGORIES = [{
4329
4616
  name: "Development",
@@ -4350,6 +4637,10 @@ function Marketplace(props) {
4350
4637
  const [error, setError] = createSignal(null);
4351
4638
  const [loadedRepos, setLoadedRepos] = createSignal([]);
4352
4639
  const [failedRepos, setFailedRepos] = createSignal([]);
4640
+ const [viewMode, setViewMode] = createSignal("list");
4641
+ const [treeState, setTreeState] = createSignal(null);
4642
+ const [currentPath, setCurrentPath] = createSignal([]);
4643
+ const [treeItems, setTreeItems] = createSignal([]);
4353
4644
  const rows = () => props.rows ?? 24;
4354
4645
  createEffect(() => {
4355
4646
  loadData();
@@ -4382,8 +4673,27 @@ function Marketplace(props) {
4382
4673
  } else if (failed.length > 0 && skills.length === 0) {
4383
4674
  setError(`Some repos failed (${failed.join(", ")}) and no skills loaded`);
4384
4675
  }
4676
+ try {
4677
+ const tree = await loadOrGenerateTree();
4678
+ setTreeState(tree);
4679
+ if (tree.tree && tree.currentNode) {
4680
+ updateTreeItems(tree.currentNode);
4681
+ }
4682
+ } catch (e) {
4683
+ console.error("Failed to load skill tree:", e);
4684
+ }
4385
4685
  setLoading(false);
4386
4686
  };
4687
+ const updateTreeItems = (node) => {
4688
+ const children2 = getNodeChildren2(node);
4689
+ const skills = getNodeSkills(node);
4690
+ const items = [...children2, ...skills.map((name) => ({
4691
+ type: "skill",
4692
+ name
4693
+ }))];
4694
+ setTreeItems(items);
4695
+ setSelectedIndex(0);
4696
+ };
4387
4697
  const filteredSkills = createMemo(() => {
4388
4698
  let skills = allSkills();
4389
4699
  if (selectedCategory()) {
@@ -4395,9 +4705,15 @@ function Marketplace(props) {
4395
4705
  return skills;
4396
4706
  });
4397
4707
  createEffect(() => {
4398
- const list = filteredSkills();
4399
- const maxIndex = Math.max(0, list.length - 1);
4400
- setSelectedIndex((prev) => Math.max(0, Math.min(prev, maxIndex)));
4708
+ if (viewMode() === "list") {
4709
+ const list = filteredSkills();
4710
+ const maxIndex = Math.max(0, list.length - 1);
4711
+ setSelectedIndex((prev) => Math.max(0, Math.min(prev, maxIndex)));
4712
+ } else {
4713
+ const items = treeItems();
4714
+ const maxIndex = Math.max(0, items.length - 1);
4715
+ setSelectedIndex((prev) => Math.max(0, Math.min(prev, maxIndex)));
4716
+ }
4401
4717
  });
4402
4718
  const maxVisible = () => Math.max(4, Math.floor((rows() - 14) / 2));
4403
4719
  const skillsWindow = createMemo(() => {
@@ -4416,9 +4732,30 @@ function Marketplace(props) {
4416
4732
  items: list.slice(start, start + visible)
4417
4733
  };
4418
4734
  });
4735
+ const treeWindow = createMemo(() => {
4736
+ const list = treeItems();
4737
+ const selected = selectedIndex();
4738
+ const visible = maxVisible();
4739
+ const total = list.length;
4740
+ if (total <= visible) return {
4741
+ start: 0,
4742
+ items: list
4743
+ };
4744
+ let start = Math.max(0, selected - Math.floor(visible / 2));
4745
+ start = Math.min(start, total - visible);
4746
+ return {
4747
+ start,
4748
+ items: list.slice(start, start + visible)
4749
+ };
4750
+ });
4419
4751
  const handleKeyNav = (delta) => {
4420
- const max = filteredSkills().length - 1;
4421
- setSelectedIndex((prev) => Math.max(0, Math.min(prev + delta, max)));
4752
+ if (viewMode() === "list") {
4753
+ const max = filteredSkills().length - 1;
4754
+ setSelectedIndex((prev) => Math.max(0, Math.min(prev + delta, max)));
4755
+ } else {
4756
+ const max = treeItems().length - 1;
4757
+ setSelectedIndex((prev) => Math.max(0, Math.min(prev + delta, max)));
4758
+ }
4422
4759
  };
4423
4760
  const handleInstall = () => {
4424
4761
  const skill = filteredSkills()[selectedIndex()];
@@ -4426,6 +4763,52 @@ function Marketplace(props) {
4426
4763
  props.onNavigate("installed");
4427
4764
  }
4428
4765
  };
4766
+ const handleTreeEnter = () => {
4767
+ const items = treeItems();
4768
+ const item = items[selectedIndex()];
4769
+ if (!item) return;
4770
+ if ("type" in item && item.type === "skill") {
4771
+ props.onNavigate("installed");
4772
+ } else if ("isCategory" in item && item.isCategory) {
4773
+ const state = treeState();
4774
+ if (state?.tree) {
4775
+ const newPath = [...currentPath(), item.name];
4776
+ setCurrentPath(newPath);
4777
+ let node = state.tree.rootNode;
4778
+ for (const segment of newPath) {
4779
+ const child = node.children.find((c) => c.name === segment);
4780
+ if (child) {
4781
+ node = child;
4782
+ } else {
4783
+ setCurrentPath([]);
4784
+ updateTreeItems(state.tree.rootNode);
4785
+ return;
4786
+ }
4787
+ }
4788
+ updateTreeItems(node);
4789
+ }
4790
+ }
4791
+ };
4792
+ const handleTreeBack = () => {
4793
+ const path = currentPath();
4794
+ if (path.length === 0) {
4795
+ setViewMode("list");
4796
+ return;
4797
+ }
4798
+ const newPath = path.slice(0, -1);
4799
+ setCurrentPath(newPath);
4800
+ const state = treeState();
4801
+ if (state?.tree) {
4802
+ let node = state.tree.rootNode;
4803
+ for (const segment of newPath) {
4804
+ const child = node.children.find((c) => c.name === segment);
4805
+ if (child) {
4806
+ node = child;
4807
+ }
4808
+ }
4809
+ updateTreeItems(node);
4810
+ }
4811
+ };
4429
4812
  const handleCategorySelect = (idx) => {
4430
4813
  const cat = CATEGORIES[idx];
4431
4814
  if (cat) {
@@ -4433,38 +4816,65 @@ function Marketplace(props) {
4433
4816
  setSelectedIndex(0);
4434
4817
  }
4435
4818
  };
4819
+ const toggleViewMode = () => {
4820
+ if (viewMode() === "list") {
4821
+ setViewMode("tree");
4822
+ setSelectedIndex(0);
4823
+ const state = treeState();
4824
+ if (state?.tree) {
4825
+ updateTreeItems(state.tree.rootNode);
4826
+ }
4827
+ } else {
4828
+ setViewMode("list");
4829
+ setCurrentPath([]);
4830
+ setSelectedIndex(0);
4831
+ }
4832
+ };
4436
4833
  useKeyboard((key) => {
4437
4834
  if (key.name === "j" || key.name === "down") handleKeyNav(1);
4438
4835
  else if (key.name === "k" || key.name === "up") handleKeyNav(-1);
4439
- else if (key.name === "return") handleInstall();
4440
- else if (key.name === "b") props.onNavigate("browse");
4836
+ else if (key.name === "return") {
4837
+ if (viewMode() === "tree") {
4838
+ handleTreeEnter();
4839
+ } else {
4840
+ handleInstall();
4841
+ }
4842
+ } else if (key.name === "b") props.onNavigate("browse");
4441
4843
  else if (key.name === "r") loadData();
4844
+ else if (key.sequence === "v") toggleViewMode();
4442
4845
  else if (key.sequence && ["1", "2", "3", "4", "5"].includes(key.sequence)) {
4443
- handleCategorySelect(parseInt(key.sequence) - 1);
4846
+ if (viewMode() === "list") {
4847
+ handleCategorySelect(parseInt(key.sequence) - 1);
4848
+ }
4444
4849
  } else if (key.name === "escape") {
4445
- if (searchQuery() || selectedCategory()) {
4850
+ if (viewMode() === "tree") {
4851
+ handleTreeBack();
4852
+ } else if (searchQuery() || selectedCategory()) {
4446
4853
  setSearchQuery("");
4447
4854
  setSelectedCategory(null);
4448
4855
  } else {
4449
4856
  props.onNavigate("home");
4450
4857
  }
4858
+ } else if (key.name === "left" && viewMode() === "tree") {
4859
+ handleTreeBack();
4860
+ } else if (key.name === "right" && viewMode() === "tree") {
4861
+ handleTreeEnter();
4451
4862
  }
4452
4863
  });
4453
- const selectedSkill = () => {
4454
- const skills = filteredSkills();
4455
- if (skills.length === 0) return null;
4456
- return skills[selectedIndex()];
4457
- };
4458
4864
  return (() => {
4459
4865
  var _el$ = createElement("box");
4460
4866
  setProp(_el$, "flexDirection", "column");
4461
4867
  setProp(_el$, "paddingLeft", 1);
4462
4868
  insert(_el$, createComponent2(Header, {
4463
4869
  title: "Marketplace",
4464
- subtitle: "Discover and install skills",
4465
- icon: "\u2605",
4870
+ get subtitle() {
4871
+ return memo2(() => viewMode() === "tree")() ? `Tree View: ${formatTreePath(currentPath())}` : "Discover and install skills";
4872
+ },
4873
+ get icon() {
4874
+ return viewMode() === "tree" ? "\u{1F333}" : "\u2605";
4875
+ },
4466
4876
  get count() {
4467
- return allSkills().length;
4877
+ return memo2(() => viewMode() === "tree")() ? treeState()?.tree?.totalSkills ?? 0 : allSkills().length;
4468
4878
  }
4469
4879
  }), null);
4470
4880
  insert(_el$, createComponent2(Show, {
@@ -4515,10 +4925,12 @@ function Marketplace(props) {
4515
4925
  },
4516
4926
  get children() {
4517
4927
  return [(() => {
4518
- var _el$5 = createElement("box"), _el$6 = createElement("text"), _el$7 = createTextNode(`\u25CF `), _el$8 = createTextNode(` repos`), _el$12 = createElement("text"), _el$14 = createElement("text"), _el$15 = createTextNode(` skills`);
4928
+ var _el$5 = createElement("box"), _el$6 = createElement("text"), _el$7 = createTextNode(`\u25CF `), _el$8 = createTextNode(` repos`), _el$12 = createElement("text"), _el$14 = createElement("text"), _el$15 = createTextNode(` skills`), _el$16 = createElement("text"), _el$18 = createElement("text"), _el$19 = createTextNode(`[v] `);
4519
4929
  insertNode(_el$5, _el$6);
4520
4930
  insertNode(_el$5, _el$12);
4521
4931
  insertNode(_el$5, _el$14);
4932
+ insertNode(_el$5, _el$16);
4933
+ insertNode(_el$5, _el$18);
4522
4934
  setProp(_el$5, "flexDirection", "row");
4523
4935
  setProp(_el$5, "marginBottom", 1);
4524
4936
  insertNode(_el$6, _el$7);
@@ -4547,215 +4959,350 @@ function Marketplace(props) {
4547
4959
  insertNode(_el$12, createTextNode(` | `));
4548
4960
  insertNode(_el$14, _el$15);
4549
4961
  insert(_el$14, () => allSkills().length, _el$15);
4962
+ insertNode(_el$16, createTextNode(` | `));
4963
+ insertNode(_el$18, _el$19);
4964
+ insert(_el$18, () => viewMode() === "tree" ? "\u{1F333} Tree" : "\u{1F4CB} List", null);
4550
4965
  effect((_p$) => {
4551
- var _v$ = terminalColors.success, _v$2 = terminalColors.textMuted, _v$3 = terminalColors.text;
4966
+ var _v$ = terminalColors.success, _v$2 = terminalColors.textMuted, _v$3 = terminalColors.text, _v$4 = terminalColors.textMuted, _v$5 = viewMode() === "tree" ? terminalColors.accent : terminalColors.textMuted;
4552
4967
  _v$ !== _p$.e && (_p$.e = setProp(_el$6, "fg", _v$, _p$.e));
4553
4968
  _v$2 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$2, _p$.t));
4554
4969
  _v$3 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$3, _p$.a));
4970
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$16, "fg", _v$4, _p$.o));
4971
+ _v$5 !== _p$.i && (_p$.i = setProp(_el$18, "fg", _v$5, _p$.i));
4555
4972
  return _p$;
4556
4973
  }, {
4557
4974
  e: void 0,
4558
4975
  t: void 0,
4559
- a: void 0
4976
+ a: void 0,
4977
+ o: void 0,
4978
+ i: void 0
4560
4979
  });
4561
4980
  return _el$5;
4562
4981
  })(), (() => {
4563
- var _el$16 = createElement("text");
4564
- insertNode(_el$16, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
4565
- effect((_$p) => setProp(_el$16, "fg", terminalColors.textMuted, _$p));
4566
- return _el$16;
4567
- })(), (() => {
4568
- var _el$18 = createElement("text");
4569
- insertNode(_el$18, createTextNode(` `));
4570
- return _el$18;
4571
- })(), (() => {
4572
- var _el$20 = createElement("box"), _el$21 = createElement("text");
4573
- insertNode(_el$20, _el$21);
4574
- setProp(_el$20, "flexDirection", "row");
4575
- setProp(_el$20, "marginBottom", 1);
4576
- insertNode(_el$21, createTextNode(`Categories: `));
4577
- insert(_el$20, createComponent2(For, {
4578
- each: CATEGORIES,
4579
- children: (cat, idx) => (() => {
4580
- var _el$47 = createElement("text"), _el$48 = createTextNode(`[`), _el$49 = createTextNode(`]`), _el$50 = createTextNode(` `);
4581
- insertNode(_el$47, _el$48);
4582
- insertNode(_el$47, _el$49);
4583
- insertNode(_el$47, _el$50);
4584
- insert(_el$47, () => idx() + 1, _el$49);
4585
- insert(_el$47, () => cat.name, _el$50);
4586
- effect((_$p) => setProp(_el$47, "fg", selectedCategory() === cat.tag ? terminalColors.accent : terminalColors.textMuted, _$p));
4587
- return _el$47;
4588
- })()
4589
- }), null);
4590
- effect((_$p) => setProp(_el$21, "fg", terminalColors.text, _$p));
4982
+ var _el$20 = createElement("text");
4983
+ insertNode(_el$20, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
4984
+ effect((_$p) => setProp(_el$20, "fg", terminalColors.textMuted, _$p));
4591
4985
  return _el$20;
4592
4986
  })(), (() => {
4593
- var _el$23 = createElement("text");
4594
- insertNode(_el$23, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
4595
- effect((_$p) => setProp(_el$23, "fg", terminalColors.textMuted, _$p));
4596
- return _el$23;
4597
- })(), (() => {
4598
- var _el$25 = createElement("text");
4599
- insertNode(_el$25, createTextNode(` `));
4600
- return _el$25;
4987
+ var _el$22 = createElement("text");
4988
+ insertNode(_el$22, createTextNode(` `));
4989
+ return _el$22;
4601
4990
  })(), createComponent2(Show, {
4602
4991
  get when() {
4603
- return filteredSkills().length > 0;
4604
- },
4605
- get fallback() {
4606
- return createComponent2(EmptyState, {
4607
- icon: "\u2605",
4608
- title: "No skills found",
4609
- get description() {
4610
- return searchQuery() || selectedCategory() ? "Try a different search or category" : "No skills loaded yet";
4611
- },
4612
- action: {
4613
- label: "Clear Filter",
4614
- key: "Esc"
4615
- }
4616
- });
4992
+ return viewMode() === "list";
4617
4993
  },
4618
4994
  get children() {
4619
4995
  return [(() => {
4620
- var _el$27 = createElement("text"), _el$28 = createElement("b"), _el$29 = createTextNode(` `), _el$30 = createElement("text"), _el$31 = createTextNode(`(`), _el$32 = createTextNode(` results)`);
4621
- insertNode(_el$27, _el$28);
4622
- insertNode(_el$27, _el$29);
4623
- insertNode(_el$27, _el$30);
4624
- insert(_el$28, (() => {
4625
- var _c$ = memo2(() => !!selectedCategory());
4626
- return () => _c$() ? `${selectedCategory()} Skills` : "Featured Skills";
4627
- })());
4628
- insertNode(_el$30, _el$31);
4629
- insertNode(_el$30, _el$32);
4630
- insert(_el$30, () => filteredSkills().length, _el$32);
4631
- effect((_p$) => {
4632
- var _v$4 = terminalColors.text, _v$5 = terminalColors.textMuted;
4633
- _v$4 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$4, _p$.e));
4634
- _v$5 !== _p$.t && (_p$.t = setProp(_el$30, "fg", _v$5, _p$.t));
4635
- return _p$;
4636
- }, {
4637
- e: void 0,
4638
- t: void 0
4639
- });
4996
+ var _el$24 = createElement("box"), _el$25 = createElement("text");
4997
+ insertNode(_el$24, _el$25);
4998
+ setProp(_el$24, "flexDirection", "row");
4999
+ setProp(_el$24, "marginBottom", 1);
5000
+ insertNode(_el$25, createTextNode(`Categories: `));
5001
+ insert(_el$24, createComponent2(For, {
5002
+ each: CATEGORIES,
5003
+ children: (cat, idx) => (() => {
5004
+ var _el$66 = createElement("text"), _el$67 = createTextNode(`[`), _el$68 = createTextNode(`]`), _el$69 = createTextNode(` `);
5005
+ insertNode(_el$66, _el$67);
5006
+ insertNode(_el$66, _el$68);
5007
+ insertNode(_el$66, _el$69);
5008
+ insert(_el$66, () => idx() + 1, _el$68);
5009
+ insert(_el$66, () => cat.name, _el$69);
5010
+ effect((_$p) => setProp(_el$66, "fg", selectedCategory() === cat.tag ? terminalColors.accent : terminalColors.textMuted, _$p));
5011
+ return _el$66;
5012
+ })()
5013
+ }), null);
5014
+ effect((_$p) => setProp(_el$25, "fg", terminalColors.text, _$p));
5015
+ return _el$24;
5016
+ })(), (() => {
5017
+ var _el$27 = createElement("text");
5018
+ insertNode(_el$27, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
5019
+ effect((_$p) => setProp(_el$27, "fg", terminalColors.textMuted, _$p));
4640
5020
  return _el$27;
4641
5021
  })(), (() => {
4642
- var _el$33 = createElement("text");
4643
- insertNode(_el$33, createTextNode(` `));
4644
- return _el$33;
5022
+ var _el$29 = createElement("text");
5023
+ insertNode(_el$29, createTextNode(` `));
5024
+ return _el$29;
4645
5025
  })(), createComponent2(Show, {
4646
5026
  get when() {
4647
- return skillsWindow().start > 0;
5027
+ return filteredSkills().length > 0;
4648
5028
  },
4649
- get children() {
4650
- var _el$35 = createElement("text"), _el$36 = createTextNode(` \u25B2 `), _el$37 = createTextNode(` more`);
4651
- insertNode(_el$35, _el$36);
4652
- insertNode(_el$35, _el$37);
4653
- insert(_el$35, () => skillsWindow().start, _el$37);
4654
- effect((_$p) => setProp(_el$35, "fg", terminalColors.textMuted, _$p));
4655
- return _el$35;
4656
- }
4657
- }), createComponent2(For, {
4658
- get each() {
4659
- return skillsWindow().items;
5029
+ get fallback() {
5030
+ return createComponent2(EmptyState, {
5031
+ icon: "\u2605",
5032
+ title: "No skills found",
5033
+ get description() {
5034
+ return searchQuery() || selectedCategory() ? "Try a different search or category" : "No skills loaded yet";
5035
+ },
5036
+ action: {
5037
+ label: "Clear Filter",
5038
+ key: "Esc"
5039
+ }
5040
+ });
4660
5041
  },
4661
- children: (skill, idx) => {
4662
- const originalIndex = () => skillsWindow().start + idx();
4663
- const isSelected = () => originalIndex() === selectedIndex();
4664
- return (() => {
4665
- var _el$51 = createElement("box"), _el$52 = createElement("box"), _el$53 = createElement("text"), _el$54 = createElement("text"), _el$55 = createElement("text");
4666
- insertNode(_el$51, _el$52);
4667
- setProp(_el$51, "flexDirection", "column");
4668
- setProp(_el$51, "marginBottom", 1);
4669
- insertNode(_el$52, _el$53);
4670
- insertNode(_el$52, _el$54);
4671
- insertNode(_el$52, _el$55);
4672
- setProp(_el$52, "flexDirection", "row");
4673
- setProp(_el$53, "width", 3);
4674
- insert(_el$53, () => isSelected() ? "\u25B8 " : " ");
4675
- setProp(_el$54, "width", 25);
4676
- insert(_el$54, () => skill.name);
4677
- insert(_el$55, () => skill.repoName);
4678
- insert(_el$51, createComponent2(Show, {
4679
- get when() {
4680
- return skill.description;
4681
- },
4682
- get children() {
4683
- var _el$56 = createElement("text"), _el$57 = createTextNode(` `);
4684
- insertNode(_el$56, _el$57);
4685
- insert(_el$56, () => skill.description?.slice(0, 50), null);
4686
- insert(_el$56, () => (skill.description?.length || 0) > 50 ? "..." : "", null);
4687
- effect((_$p) => setProp(_el$56, "fg", terminalColors.textMuted, _$p));
4688
- return _el$56;
4689
- }
4690
- }), null);
5042
+ get children() {
5043
+ return [(() => {
5044
+ var _el$31 = createElement("text"), _el$32 = createElement("b"), _el$33 = createTextNode(` `), _el$34 = createElement("text"), _el$35 = createTextNode(`(`), _el$36 = createTextNode(` results)`);
5045
+ insertNode(_el$31, _el$32);
5046
+ insertNode(_el$31, _el$33);
5047
+ insertNode(_el$31, _el$34);
5048
+ insert(_el$32, (() => {
5049
+ var _c$ = memo2(() => !!selectedCategory());
5050
+ return () => _c$() ? `${selectedCategory()} Skills` : "Featured Skills";
5051
+ })());
5052
+ insertNode(_el$34, _el$35);
5053
+ insertNode(_el$34, _el$36);
5054
+ insert(_el$34, () => filteredSkills().length, _el$36);
4691
5055
  effect((_p$) => {
4692
- var _v$6 = isSelected() ? terminalColors.accent : terminalColors.text, _v$7 = isSelected() ? terminalColors.accent : terminalColors.text, _v$8 = terminalColors.textMuted;
4693
- _v$6 !== _p$.e && (_p$.e = setProp(_el$53, "fg", _v$6, _p$.e));
4694
- _v$7 !== _p$.t && (_p$.t = setProp(_el$54, "fg", _v$7, _p$.t));
4695
- _v$8 !== _p$.a && (_p$.a = setProp(_el$55, "fg", _v$8, _p$.a));
5056
+ var _v$6 = terminalColors.text, _v$7 = terminalColors.textMuted;
5057
+ _v$6 !== _p$.e && (_p$.e = setProp(_el$31, "fg", _v$6, _p$.e));
5058
+ _v$7 !== _p$.t && (_p$.t = setProp(_el$34, "fg", _v$7, _p$.t));
4696
5059
  return _p$;
4697
5060
  }, {
4698
5061
  e: void 0,
4699
- t: void 0,
4700
- a: void 0
5062
+ t: void 0
4701
5063
  });
4702
- return _el$51;
4703
- })();
5064
+ return _el$31;
5065
+ })(), (() => {
5066
+ var _el$37 = createElement("text");
5067
+ insertNode(_el$37, createTextNode(` `));
5068
+ return _el$37;
5069
+ })(), createComponent2(Show, {
5070
+ get when() {
5071
+ return skillsWindow().start > 0;
5072
+ },
5073
+ get children() {
5074
+ var _el$39 = createElement("text"), _el$40 = createTextNode(` \u25B2 `), _el$41 = createTextNode(` more`);
5075
+ insertNode(_el$39, _el$40);
5076
+ insertNode(_el$39, _el$41);
5077
+ insert(_el$39, () => skillsWindow().start, _el$41);
5078
+ effect((_$p) => setProp(_el$39, "fg", terminalColors.textMuted, _$p));
5079
+ return _el$39;
5080
+ }
5081
+ }), createComponent2(For, {
5082
+ get each() {
5083
+ return skillsWindow().items;
5084
+ },
5085
+ children: (skill, idx) => {
5086
+ const originalIndex = () => skillsWindow().start + idx();
5087
+ const isSelected = () => originalIndex() === selectedIndex();
5088
+ return (() => {
5089
+ var _el$70 = createElement("box"), _el$71 = createElement("box"), _el$72 = createElement("text"), _el$73 = createElement("text"), _el$74 = createElement("text");
5090
+ insertNode(_el$70, _el$71);
5091
+ setProp(_el$70, "flexDirection", "column");
5092
+ setProp(_el$70, "marginBottom", 1);
5093
+ insertNode(_el$71, _el$72);
5094
+ insertNode(_el$71, _el$73);
5095
+ insertNode(_el$71, _el$74);
5096
+ setProp(_el$71, "flexDirection", "row");
5097
+ setProp(_el$72, "width", 3);
5098
+ insert(_el$72, () => isSelected() ? "\u25B8 " : " ");
5099
+ setProp(_el$73, "width", 25);
5100
+ insert(_el$73, () => skill.name);
5101
+ insert(_el$74, () => skill.repoName);
5102
+ insert(_el$70, createComponent2(Show, {
5103
+ get when() {
5104
+ return skill.description;
5105
+ },
5106
+ get children() {
5107
+ var _el$75 = createElement("text"), _el$76 = createTextNode(` `);
5108
+ insertNode(_el$75, _el$76);
5109
+ insert(_el$75, () => skill.description?.slice(0, 50), null);
5110
+ insert(_el$75, () => (skill.description?.length || 0) > 50 ? "..." : "", null);
5111
+ effect((_$p) => setProp(_el$75, "fg", terminalColors.textMuted, _$p));
5112
+ return _el$75;
5113
+ }
5114
+ }), null);
5115
+ effect((_p$) => {
5116
+ var _v$8 = isSelected() ? terminalColors.accent : terminalColors.text, _v$9 = isSelected() ? terminalColors.accent : terminalColors.text, _v$0 = terminalColors.textMuted;
5117
+ _v$8 !== _p$.e && (_p$.e = setProp(_el$72, "fg", _v$8, _p$.e));
5118
+ _v$9 !== _p$.t && (_p$.t = setProp(_el$73, "fg", _v$9, _p$.t));
5119
+ _v$0 !== _p$.a && (_p$.a = setProp(_el$74, "fg", _v$0, _p$.a));
5120
+ return _p$;
5121
+ }, {
5122
+ e: void 0,
5123
+ t: void 0,
5124
+ a: void 0
5125
+ });
5126
+ return _el$70;
5127
+ })();
5128
+ }
5129
+ }), createComponent2(Show, {
5130
+ get when() {
5131
+ return skillsWindow().start + maxVisible() < filteredSkills().length;
5132
+ },
5133
+ get children() {
5134
+ var _el$42 = createElement("text"), _el$43 = createTextNode(`\u25BC `), _el$44 = createTextNode(` more`);
5135
+ insertNode(_el$42, _el$43);
5136
+ insertNode(_el$42, _el$44);
5137
+ insert(_el$42, () => filteredSkills().length - skillsWindow().start - maxVisible(), _el$44);
5138
+ effect((_$p) => setProp(_el$42, "fg", terminalColors.textMuted, _$p));
5139
+ return _el$42;
5140
+ }
5141
+ })];
4704
5142
  }
4705
- }), createComponent2(Show, {
5143
+ })];
5144
+ }
5145
+ }), createComponent2(Show, {
5146
+ get when() {
5147
+ return viewMode() === "tree";
5148
+ },
5149
+ get children() {
5150
+ return [(() => {
5151
+ var _el$45 = createElement("box"), _el$46 = createElement("text"), _el$47 = createTextNode(`\u{1F4C1} `);
5152
+ insertNode(_el$45, _el$46);
5153
+ setProp(_el$45, "flexDirection", "row");
5154
+ setProp(_el$45, "marginBottom", 1);
5155
+ insertNode(_el$46, _el$47);
5156
+ insert(_el$46, (() => {
5157
+ var _c$2 = memo2(() => currentPath().length === 0);
5158
+ return () => _c$2() ? "Root" : currentPath().join(" > ");
5159
+ })(), null);
5160
+ effect((_$p) => setProp(_el$46, "fg", terminalColors.accent, _$p));
5161
+ return _el$45;
5162
+ })(), (() => {
5163
+ var _el$48 = createElement("text");
5164
+ insertNode(_el$48, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
5165
+ effect((_$p) => setProp(_el$48, "fg", terminalColors.textMuted, _$p));
5166
+ return _el$48;
5167
+ })(), (() => {
5168
+ var _el$50 = createElement("text");
5169
+ insertNode(_el$50, createTextNode(` `));
5170
+ return _el$50;
5171
+ })(), createComponent2(Show, {
4706
5172
  get when() {
4707
- return skillsWindow().start + maxVisible() < filteredSkills().length;
5173
+ return treeItems().length > 0;
5174
+ },
5175
+ get fallback() {
5176
+ return createComponent2(EmptyState, {
5177
+ icon: "\u{1F333}",
5178
+ title: "Empty category",
5179
+ description: "This category has no skills",
5180
+ action: {
5181
+ label: "Go Back",
5182
+ key: "Esc"
5183
+ }
5184
+ });
4708
5185
  },
4709
5186
  get children() {
4710
- var _el$38 = createElement("text"), _el$39 = createTextNode(`\u25BC `), _el$40 = createTextNode(` more`);
4711
- insertNode(_el$38, _el$39);
4712
- insertNode(_el$38, _el$40);
4713
- insert(_el$38, () => filteredSkills().length - skillsWindow().start - maxVisible(), _el$40);
4714
- effect((_$p) => setProp(_el$38, "fg", terminalColors.textMuted, _$p));
4715
- return _el$38;
5187
+ return [createComponent2(Show, {
5188
+ get when() {
5189
+ return treeWindow().start > 0;
5190
+ },
5191
+ get children() {
5192
+ var _el$52 = createElement("text"), _el$53 = createTextNode(` \u25B2 `), _el$54 = createTextNode(` more`);
5193
+ insertNode(_el$52, _el$53);
5194
+ insertNode(_el$52, _el$54);
5195
+ insert(_el$52, () => treeWindow().start, _el$54);
5196
+ effect((_$p) => setProp(_el$52, "fg", terminalColors.textMuted, _$p));
5197
+ return _el$52;
5198
+ }
5199
+ }), createComponent2(For, {
5200
+ get each() {
5201
+ return treeWindow().items;
5202
+ },
5203
+ children: (item, idx) => {
5204
+ const originalIndex = () => treeWindow().start + idx();
5205
+ const isSelected = () => originalIndex() === selectedIndex();
5206
+ const isCategory = () => "isCategory" in item && item.isCategory;
5207
+ const isSkill = () => "type" in item && item.type === "skill";
5208
+ return (() => {
5209
+ var _el$77 = createElement("box"), _el$78 = createElement("text"), _el$79 = createElement("text"), _el$80 = createElement("text");
5210
+ insertNode(_el$77, _el$78);
5211
+ insertNode(_el$77, _el$79);
5212
+ insertNode(_el$77, _el$80);
5213
+ setProp(_el$77, "flexDirection", "row");
5214
+ setProp(_el$77, "marginBottom", 1);
5215
+ setProp(_el$78, "width", 3);
5216
+ insert(_el$78, () => isSelected() ? "\u25B8 " : " ");
5217
+ setProp(_el$79, "width", 3);
5218
+ insert(_el$79, (() => {
5219
+ var _c$3 = memo2(() => !!isCategory());
5220
+ return () => _c$3() ? "\u{1F4C1}" : isSkill() ? "\u{1F4C4}" : "\u{1F4C1}";
5221
+ })());
5222
+ setProp(_el$80, "width", 25);
5223
+ insert(_el$80, (() => {
5224
+ var _c$4 = memo2(() => "name" in item);
5225
+ return () => _c$4() ? item.name : "";
5226
+ })());
5227
+ insert(_el$77, createComponent2(Show, {
5228
+ get when() {
5229
+ return memo2(() => !!isCategory())() && "skillCount" in item;
5230
+ },
5231
+ get children() {
5232
+ var _el$81 = createElement("text"), _el$82 = createTextNode(`(`), _el$83 = createTextNode(` skills)`);
5233
+ insertNode(_el$81, _el$82);
5234
+ insertNode(_el$81, _el$83);
5235
+ insert(_el$81, () => item.skillCount, _el$83);
5236
+ effect((_$p) => setProp(_el$81, "fg", terminalColors.textMuted, _$p));
5237
+ return _el$81;
5238
+ }
5239
+ }), null);
5240
+ effect((_p$) => {
5241
+ var _v$1 = isSelected() ? terminalColors.accent : terminalColors.text, _v$10 = isSelected() ? terminalColors.accent : terminalColors.textMuted, _v$11 = isSelected() ? terminalColors.accent : terminalColors.text;
5242
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$78, "fg", _v$1, _p$.e));
5243
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$79, "fg", _v$10, _p$.t));
5244
+ _v$11 !== _p$.a && (_p$.a = setProp(_el$80, "fg", _v$11, _p$.a));
5245
+ return _p$;
5246
+ }, {
5247
+ e: void 0,
5248
+ t: void 0,
5249
+ a: void 0
5250
+ });
5251
+ return _el$77;
5252
+ })();
5253
+ }
5254
+ }), createComponent2(Show, {
5255
+ get when() {
5256
+ return treeWindow().start + maxVisible() < treeItems().length;
5257
+ },
5258
+ get children() {
5259
+ var _el$55 = createElement("text"), _el$56 = createTextNode(`\u25BC `), _el$57 = createTextNode(` more`);
5260
+ insertNode(_el$55, _el$56);
5261
+ insertNode(_el$55, _el$57);
5262
+ insert(_el$55, () => treeItems().length - treeWindow().start - maxVisible(), _el$57);
5263
+ effect((_$p) => setProp(_el$55, "fg", terminalColors.textMuted, _$p));
5264
+ return _el$55;
5265
+ }
5266
+ })];
4716
5267
  }
4717
5268
  })];
4718
5269
  }
4719
5270
  }), (() => {
4720
- var _el$41 = createElement("text");
4721
- insertNode(_el$41, createTextNode(` `));
4722
- return _el$41;
5271
+ var _el$58 = createElement("text");
5272
+ insertNode(_el$58, createTextNode(` `));
5273
+ return _el$58;
4723
5274
  })(), (() => {
4724
- var _el$43 = createElement("text");
4725
- insertNode(_el$43, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
4726
- effect((_$p) => setProp(_el$43, "fg", terminalColors.textMuted, _$p));
4727
- return _el$43;
4728
- })(), (() => {
4729
- var _el$45 = createElement("text");
4730
- insertNode(_el$45, createTextNode(`j/k navigate Enter install 1-5 category b browse r refresh Esc back`));
4731
- effect((_$p) => setProp(_el$45, "fg", terminalColors.textMuted, _$p));
4732
- return _el$45;
4733
- })()];
5275
+ var _el$60 = createElement("text");
5276
+ insertNode(_el$60, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
5277
+ effect((_$p) => setProp(_el$60, "fg", terminalColors.textMuted, _$p));
5278
+ return _el$60;
5279
+ })(), createComponent2(Show, {
5280
+ get when() {
5281
+ return viewMode() === "list";
5282
+ },
5283
+ get children() {
5284
+ var _el$62 = createElement("text");
5285
+ insertNode(_el$62, createTextNode(`j/k navigate Enter install 1-5 category v tree view r refresh Esc back`));
5286
+ effect((_$p) => setProp(_el$62, "fg", terminalColors.textMuted, _$p));
5287
+ return _el$62;
5288
+ }
5289
+ }), createComponent2(Show, {
5290
+ get when() {
5291
+ return viewMode() === "tree";
5292
+ },
5293
+ get children() {
5294
+ var _el$64 = createElement("text");
5295
+ insertNode(_el$64, createTextNode(`j/k \u2191\u2193 navigate Enter/\u2192 open \u2190/Esc back v list view r refresh`));
5296
+ effect((_$p) => setProp(_el$64, "fg", terminalColors.textMuted, _$p));
5297
+ return _el$64;
5298
+ }
5299
+ })];
4734
5300
  }
4735
5301
  }), null);
4736
5302
  return _el$;
4737
5303
  })();
4738
5304
  }
4739
5305
 
4740
- // src/services/recommend.service.ts
4741
- async function getRecommendations(_projectPath, _options) {
4742
- return {
4743
- recommendations: [],
4744
- analyzing: false,
4745
- loading: false,
4746
- error: null,
4747
- lastAnalyzed: (/* @__PURE__ */ new Date()).toISOString()
4748
- };
4749
- }
4750
- async function analyzeProject(_projectPath) {
4751
- return {
4752
- languages: ["TypeScript", "JavaScript"],
4753
- frameworks: ["Solid.js"],
4754
- libraries: ["@opentui/solid"],
4755
- patterns: []
4756
- };
4757
- }
4758
-
4759
5306
  // src/screens/Recommend.tsx
4760
5307
  function Recommend(props) {
4761
5308
  const [state, setState] = createSignal({
@@ -5178,59 +5725,11 @@ function Recommend(props) {
5178
5725
  })();
5179
5726
  }
5180
5727
 
5181
- // src/services/translator.service.ts
5182
- function getSupportedAgents() {
5183
- return [
5184
- "claude-code",
5185
- "cursor",
5186
- "windsurf",
5187
- "github-copilot",
5188
- "codex",
5189
- "gemini-cli",
5190
- "opencode",
5191
- "universal"
5192
- ];
5193
- }
5194
- function checkCanTranslate(_from, _to) {
5195
- return true;
5196
- }
5197
- function translate(_content, targetAgent, options) {
5198
- return {
5199
- sourceFormat: options?.sourceFilename || "SKILL.md",
5200
- targetAgent,
5201
- success: true,
5202
- content: "",
5203
- filename: void 0,
5204
- warnings: [],
5205
- incompatible: []
5206
- };
5207
- }
5208
- function previewTranslation(_content, _targetAgent) {
5209
- return {
5210
- preview: "",
5211
- compatible: true,
5212
- issues: []
5213
- };
5214
- }
5215
- function getAgentFormatInfo(agent) {
5216
- const formatMap = {
5217
- "claude-code": { extension: ".md", formatName: "SKILL.md", description: "Claude Code skills format" },
5218
- cursor: { extension: ".mdc", formatName: "MDC", description: "Cursor rules format" },
5219
- windsurf: { extension: ".md", formatName: "Markdown", description: "Windsurf rules format" },
5220
- "github-copilot": { extension: ".md", formatName: "Markdown", description: "GitHub Copilot instructions" },
5221
- codex: { extension: ".md", formatName: "Markdown", description: "Codex instructions" },
5222
- "gemini-cli": { extension: ".md", formatName: "Markdown", description: "Gemini CLI instructions" },
5223
- opencode: { extension: ".md", formatName: "Markdown", description: "OpenCode instructions" },
5224
- universal: { extension: ".md", formatName: "SKILL.md", description: "Universal skill format" }
5225
- };
5226
- return formatMap[agent] || { extension: ".md", formatName: "Markdown", description: "Unknown format" };
5227
- }
5228
-
5229
5728
  // src/screens/Translate.tsx
5230
5729
  import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
5231
- import { join as join3 } from "path";
5730
+ import { join as join4 } from "path";
5232
5731
  function readSkillContent(skillPath) {
5233
- const skillMdPath = join3(skillPath, "SKILL.md");
5732
+ const skillMdPath = join4(skillPath, "SKILL.md");
5234
5733
  if (existsSync2(skillMdPath)) {
5235
5734
  return readFileSync3(skillMdPath, "utf-8");
5236
5735
  }
@@ -5758,37 +6257,6 @@ function Translate(props) {
5758
6257
  })();
5759
6258
  }
5760
6259
 
5761
- // src/services/context.service.ts
5762
- async function loadProjectContext() {
5763
- return {
5764
- context: {
5765
- projectName: "skillkit",
5766
- rootPath: process.cwd(),
5767
- languages: ["TypeScript", "JavaScript"],
5768
- frameworks: ["Solid.js", "React"],
5769
- libraries: ["@opentui/solid"],
5770
- patterns: {},
5771
- lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
5772
- },
5773
- stack: null,
5774
- loading: false,
5775
- analyzing: false,
5776
- error: null
5777
- };
5778
- }
5779
- async function analyzeProjectContext() {
5780
- return loadProjectContext();
5781
- }
5782
- async function refreshContext() {
5783
- return loadProjectContext();
5784
- }
5785
- async function exportContext(_path, _format) {
5786
- return true;
5787
- }
5788
- async function getStackTags() {
5789
- return ["typescript", "solid-js", "cli"];
5790
- }
5791
-
5792
6260
  // src/screens/Context.tsx
5793
6261
  function Context(props) {
5794
6262
  const [state, setState] = createSignal({
@@ -6286,18 +6754,6 @@ function Context(props) {
6286
6754
  })();
6287
6755
  }
6288
6756
 
6289
- // src/services/executor.service.ts
6290
- async function getAgentAvailability() {
6291
- return [
6292
- { agent: "claude-code", available: true },
6293
- { agent: "cursor", available: false },
6294
- { agent: "codex", available: false }
6295
- ];
6296
- }
6297
- async function executeSkillWithAgent(_skillPath, _agent, _options) {
6298
- return { success: true, output: "Executed successfully" };
6299
- }
6300
-
6301
6757
  // src/screens/Sync.tsx
6302
6758
  function Sync(props) {
6303
6759
  const [agents, setAgents] = createSignal([]);
@@ -6670,26 +7126,6 @@ function Sync(props) {
6670
7126
  })();
6671
7127
  }
6672
7128
 
6673
- // src/services/memory.service.ts
6674
- async function loadMemories() {
6675
- return {
6676
- entries: [],
6677
- status: { projectMemoryExists: false, globalMemoryExists: true },
6678
- paths: { projectMemoryDir: ".skillkit/memory", globalMemoryDir: "~/.skillkit/memory" },
6679
- loading: false,
6680
- error: null
6681
- };
6682
- }
6683
- async function deleteMemoryEntry(_key) {
6684
- return true;
6685
- }
6686
- async function clearMemory(_path, _scope) {
6687
- return true;
6688
- }
6689
- async function initializeMemory() {
6690
- return true;
6691
- }
6692
-
6693
7129
  // src/screens/Memory.tsx
6694
7130
  function Memory(props) {
6695
7131
  const [state, setState] = createSignal({
@@ -7055,20 +7491,6 @@ function Memory(props) {
7055
7491
  })();
7056
7492
  }
7057
7493
 
7058
- // src/services/workflow.service.ts
7059
- async function loadWorkflowsList(_projectPath) {
7060
- return {
7061
- workflows: [],
7062
- current: null,
7063
- progress: null,
7064
- loading: false,
7065
- error: null
7066
- };
7067
- }
7068
- async function executeWorkflow(_name, _projectPath, _onProgress) {
7069
- return { success: true, completedWaves: 0, totalWaves: 0, errors: [] };
7070
- }
7071
-
7072
7494
  // src/screens/Workflow.tsx
7073
7495
  function Workflow(props) {
7074
7496
  const [state, setState] = createSignal({
@@ -8021,20 +8443,6 @@ function History(props) {
8021
8443
  })();
8022
8444
  }
8023
8445
 
8024
- // src/services/team.service.ts
8025
- async function loadTeamConfig(_projectPath) {
8026
- return {
8027
- config: null,
8028
- members: [],
8029
- sharedSkills: [],
8030
- loading: false,
8031
- error: null
8032
- };
8033
- }
8034
- async function initializeTeam(_teamName, _projectPath) {
8035
- return true;
8036
- }
8037
-
8038
8446
  // src/screens/Team.tsx
8039
8447
  function Team(props) {
8040
8448
  const [state, setState] = createSignal({
@@ -8540,25 +8948,6 @@ function Team(props) {
8540
8948
  })();
8541
8949
  }
8542
8950
 
8543
- // src/services/plugin.service.ts
8544
- async function loadPluginsList(_projectPath) {
8545
- return {
8546
- plugins: [],
8547
- manager: null,
8548
- loading: false,
8549
- error: null
8550
- };
8551
- }
8552
- async function enablePlugin(_name, _manager) {
8553
- return true;
8554
- }
8555
- async function disablePlugin(_name, _manager) {
8556
- return true;
8557
- }
8558
- async function getPluginInfo(_name, _manager) {
8559
- return null;
8560
- }
8561
-
8562
8951
  // src/screens/Plugins.tsx
8563
8952
  function Plugins(props) {
8564
8953
  const [state, setState] = createSignal({
@@ -8904,26 +9293,6 @@ function Plugins(props) {
8904
9293
  })();
8905
9294
  }
8906
9295
 
8907
- // src/services/methodology.service.ts
8908
- async function loadMethodologies() {
8909
- return {
8910
- packs: [],
8911
- installedPacks: [],
8912
- manager: null,
8913
- loading: false,
8914
- error: null
8915
- };
8916
- }
8917
- async function installMethodologyPack(_name) {
8918
- return true;
8919
- }
8920
- async function uninstallMethodologyPack(_name) {
8921
- return true;
8922
- }
8923
- async function syncMethodologyPack(_name) {
8924
- return true;
8925
- }
8926
-
8927
9296
  // src/screens/Methodology.tsx
8928
9297
  function Methodology(props) {
8929
9298
  const [state, setState] = createSignal({
@@ -9394,30 +9763,6 @@ function ProgressBar(props) {
9394
9763
  })();
9395
9764
  }
9396
9765
 
9397
- // src/services/plan.service.ts
9398
- async function loadPlansList(_projectPath) {
9399
- return {
9400
- plans: [],
9401
- current: null,
9402
- validation: null,
9403
- execution: null,
9404
- loading: false,
9405
- error: null
9406
- };
9407
- }
9408
- async function loadPlan(_planPath) {
9409
- return null;
9410
- }
9411
- async function validatePlan(_plan) {
9412
- return { valid: true, errors: [], warnings: [], issues: [] };
9413
- }
9414
- async function executePlan(_plan, _projectPath, _onEvent, _dryRun) {
9415
- return { success: true, completedTasks: [], failedTasks: [], totalTasks: 0, errors: [] };
9416
- }
9417
- async function executePlanDryRun(plan, projectPath, onEvent) {
9418
- return executePlan(plan, projectPath, onEvent, true);
9419
- }
9420
-
9421
9766
  // src/screens/Plan.tsx
9422
9767
  function Plan(props) {
9423
9768
  const [state, setState] = createSignal({