claude-code-workflow 7.2.28 → 7.2.30

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.
Files changed (348) hide show
  1. package/.ccw/workflows/cli-templates/schemas/plan-overview-base-schema.json +2 -2
  2. package/.ccw/workflows/cli-templates/schemas/task-schema.json +14 -7
  3. package/.claude/agents/action-planning-agent.md +7 -4
  4. package/.claude/agents/cli-explore-agent.md +77 -63
  5. package/.claude/agents/cli-lite-planning-agent.md +11 -10
  6. package/.claude/agents/issue-plan-agent.md +421 -426
  7. package/.claude/commands/workflow/spec/setup.md +1 -1
  8. package/.claude/skills/ccw-chain/SKILL.md +119 -0
  9. package/.claude/skills/ccw-chain/chains/ccw-cycle.json +21 -0
  10. package/.claude/skills/ccw-chain/chains/ccw-exploration.json +47 -0
  11. package/.claude/skills/ccw-chain/chains/ccw-issue.json +33 -0
  12. package/.claude/skills/ccw-chain/chains/ccw-lightweight.json +57 -0
  13. package/.claude/skills/ccw-chain/chains/ccw-main.json +52 -0
  14. package/.claude/skills/ccw-chain/chains/ccw-standard.json +39 -0
  15. package/.claude/skills/ccw-chain/chains/ccw-team.json +10 -0
  16. package/.claude/skills/ccw-chain/chains/ccw-with-file.json +31 -0
  17. package/.claude/skills/ccw-chain/phases/analyze-with-file.md +788 -0
  18. package/.claude/skills/ccw-chain/phases/brainstorm/SKILL.md +408 -0
  19. package/.claude/skills/ccw-chain/phases/brainstorm/phases/01-mode-routing.md +207 -0
  20. package/.claude/skills/ccw-chain/phases/brainstorm/phases/02-artifacts.md +567 -0
  21. package/.claude/skills/ccw-chain/phases/brainstorm/phases/03-role-analysis.md +748 -0
  22. package/.claude/skills/ccw-chain/phases/brainstorm/phases/04-synthesis.md +827 -0
  23. package/.claude/skills/ccw-chain/phases/brainstorm-with-file.md +482 -0
  24. package/.claude/skills/ccw-chain/phases/collaborative-plan-with-file.md +639 -0
  25. package/.claude/skills/ccw-chain/phases/debug-with-file.md +656 -0
  26. package/.claude/skills/ccw-chain/phases/integration-test-cycle.md +936 -0
  27. package/.claude/skills/ccw-chain/phases/issue-convert-to-plan.md +720 -0
  28. package/.claude/skills/ccw-chain/phases/issue-discover.md +483 -0
  29. package/.claude/skills/ccw-chain/phases/issue-execute.md +629 -0
  30. package/.claude/skills/ccw-chain/phases/issue-from-brainstorm.md +382 -0
  31. package/.claude/skills/ccw-chain/phases/issue-plan.md +343 -0
  32. package/.claude/skills/ccw-chain/phases/issue-queue.md +464 -0
  33. package/.claude/skills/ccw-chain/phases/refactor-cycle.md +852 -0
  34. package/.claude/skills/ccw-chain/phases/review-cycle/SKILL.md +132 -0
  35. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-fix.md +760 -0
  36. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-module.md +764 -0
  37. package/.claude/skills/ccw-chain/phases/review-cycle/phases/review-session.md +775 -0
  38. package/.claude/skills/ccw-chain/phases/roadmap-with-file.md +544 -0
  39. package/.claude/skills/ccw-chain/phases/spec-generator/SKILL.md +338 -0
  40. package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-5-requirement-clarification.md +404 -0
  41. package/.claude/skills/ccw-chain/phases/spec-generator/phases/01-discovery.md +257 -0
  42. package/.claude/skills/ccw-chain/phases/spec-generator/phases/02-product-brief.md +274 -0
  43. package/.claude/skills/ccw-chain/phases/spec-generator/phases/03-requirements.md +184 -0
  44. package/.claude/skills/ccw-chain/phases/spec-generator/phases/04-architecture.md +248 -0
  45. package/.claude/skills/ccw-chain/phases/spec-generator/phases/05-epics-stories.md +178 -0
  46. package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-5-auto-fix.md +144 -0
  47. package/.claude/skills/ccw-chain/phases/spec-generator/phases/06-readiness-check.md +480 -0
  48. package/.claude/skills/ccw-chain/phases/team-planex.md +123 -0
  49. package/.claude/skills/ccw-chain/phases/ui-design-explore-auto.md +678 -0
  50. package/.claude/skills/ccw-chain/phases/unified-execute-with-file.md +870 -0
  51. package/.claude/skills/ccw-chain/phases/workflow-execute/SKILL.md +625 -0
  52. package/.claude/skills/ccw-chain/phases/workflow-execute/phases/06-review.md +215 -0
  53. package/.claude/skills/ccw-chain/phases/workflow-lite-plan.md +616 -0
  54. package/.claude/skills/ccw-chain/phases/workflow-multi-cli-plan.md +424 -0
  55. package/.claude/skills/ccw-chain/phases/workflow-plan/SKILL.md +466 -0
  56. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/01-session-discovery.md +99 -0
  57. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/02-context-gathering.md +338 -0
  58. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/03-conflict-resolution.md +422 -0
  59. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/04-task-generation.md +440 -0
  60. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/05-plan-verify.md +395 -0
  61. package/.claude/skills/ccw-chain/phases/workflow-plan/phases/06-replan.md +594 -0
  62. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/SKILL.md +527 -0
  63. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/01-session-discovery.md +57 -0
  64. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/02-context-gathering.md +407 -0
  65. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/03-test-coverage-analysis.md +172 -0
  66. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -0
  67. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/05-tdd-task-generation.md +473 -0
  68. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/06-tdd-structure-validation.md +189 -0
  69. package/.claude/skills/ccw-chain/phases/workflow-tdd-plan/phases/07-tdd-verify.md +635 -0
  70. package/.claude/skills/ccw-chain/phases/workflow-test-fix/SKILL.md +482 -0
  71. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/01-session-start.md +60 -0
  72. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/02-test-context-gather.md +493 -0
  73. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/03-test-concept-enhanced.md +150 -0
  74. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/04-test-task-generate.md +346 -0
  75. package/.claude/skills/ccw-chain/phases/workflow-test-fix/phases/05-test-cycle-execute.md +538 -0
  76. package/.claude/skills/ccw-chain/specs/auto-mode.md +47 -0
  77. package/.claude/skills/ccw-chain/specs/intent-patterns.md +60 -0
  78. package/.claude/skills/chain-loader/SKILL.md +78 -0
  79. package/.claude/skills/chain-loader/phases/01-analyze-skill.md +53 -0
  80. package/.claude/skills/chain-loader/phases/02-design-graph.md +73 -0
  81. package/.claude/skills/chain-loader/phases/03-generate-validate.md +75 -0
  82. package/.claude/skills/chain-loader/specs/chain-schema.md +99 -0
  83. package/.claude/skills/chain-loader/specs/design-patterns.md +99 -0
  84. package/.claude/skills/chain-loader/templates/chain-json.md +63 -0
  85. package/.claude/skills/review-cycle/phases/review-module.md +764 -764
  86. package/.claude/skills/review-cycle/phases/review-session.md +775 -775
  87. package/.claude/skills/workflow-multi-cli-plan/SKILL.md +2 -2
  88. package/.claude/skills/workflow-plan/phases/03-conflict-resolution.md +422 -422
  89. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +395 -395
  90. package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +407 -407
  91. package/.claude/skills/workflow-tdd-plan/phases/04-conflict-resolution.md +426 -426
  92. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +493 -493
  93. package/.codex/skills/brainstorm/SKILL.md +3 -3
  94. package/.codex/skills/clean/SKILL.md +3 -3
  95. package/.codex/skills/issue-discover/SKILL.md +13 -13
  96. package/.codex/skills/issue-discover/phases/02-discover.md +4 -4
  97. package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +3 -3
  98. package/.codex/skills/parallel-dev-cycle/SKILL.md +4 -4
  99. package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +6 -6
  100. package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +10 -10
  101. package/.codex/skills/review-cycle/SKILL.md +10 -10
  102. package/.codex/skills/review-cycle/phases/02-parallel-review.md +6 -6
  103. package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +4 -4
  104. package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +4 -4
  105. package/.codex/skills/review-cycle/phases/08-fix-execution.md +2 -2
  106. package/.codex/skills/roadmap-with-file/SKILL.md +14 -14
  107. package/.codex/skills/spec-generator/README.md +1 -1
  108. package/.codex/skills/spec-generator/SKILL.md +184 -88
  109. package/.codex/skills/spec-generator/phases/01-5-requirement-clarification.md +4 -7
  110. package/.codex/skills/spec-generator/phases/01-discovery.md +30 -11
  111. package/.codex/skills/spec-generator/phases/02-product-brief.md +2 -5
  112. package/.codex/skills/spec-generator/phases/03-requirements.md +4 -6
  113. package/.codex/skills/spec-generator/phases/04-architecture.md +4 -6
  114. package/.codex/skills/spec-generator/phases/05-epics-stories.md +4 -6
  115. package/.codex/skills/spec-generator/phases/06-5-auto-fix.md +4 -5
  116. package/.codex/skills/spec-generator/phases/06-readiness-check.md +8 -8
  117. package/.codex/skills/spec-generator/phases/07-issue-export.md +2 -2
  118. package/.codex/skills/spec-setup/SKILL.md +4 -4
  119. package/.codex/skills/workflow-plan/SKILL.md +6 -6
  120. package/.codex/skills/workflow-tdd-plan/SKILL.md +5 -5
  121. package/.codex/skills/workflow-test-fix-cycle/SKILL.md +19 -19
  122. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +5 -5
  123. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +5 -5
  124. package/README.md +14 -0
  125. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  126. package/ccw/dist/core/routes/litellm-api-routes.js +0 -23
  127. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  128. package/ccw/dist/tools/chain-loader.d.ts +10 -0
  129. package/ccw/dist/tools/chain-loader.d.ts.map +1 -0
  130. package/ccw/dist/tools/chain-loader.js +642 -0
  131. package/ccw/dist/tools/chain-loader.js.map +1 -0
  132. package/ccw/dist/tools/index.d.ts.map +1 -1
  133. package/ccw/dist/tools/index.js +2 -0
  134. package/ccw/dist/tools/index.js.map +1 -1
  135. package/ccw/dist/tools/json-builder.js +20 -0
  136. package/ccw/dist/tools/json-builder.js.map +1 -1
  137. package/ccw/dist/types/chain-types.d.ts +72 -0
  138. package/ccw/dist/types/chain-types.d.ts.map +1 -0
  139. package/ccw/dist/types/chain-types.js +5 -0
  140. package/ccw/dist/types/chain-types.js.map +1 -0
  141. package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js → AlertDialog-exlTDW81.js} +3 -3
  142. package/ccw/frontend/dist/assets/{AlertDialog-BjP1ydDR.js.map → AlertDialog-exlTDW81.js.map} +1 -1
  143. package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js → AnalysisPage-cgV9LfAI.js} +2 -2
  144. package/ccw/frontend/dist/assets/{AnalysisPage-CAX3xqMf.js.map → AnalysisPage-cgV9LfAI.js.map} +1 -1
  145. package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js → ApiSettingsPage-Dk5jJdWt.js} +2 -2
  146. package/ccw/frontend/dist/assets/{ApiSettingsPage-CtWlmztq.js.map → ApiSettingsPage-Dk5jJdWt.js.map} +1 -1
  147. package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js → CliModeToggle-Be9xsPiv.js} +2 -2
  148. package/ccw/frontend/dist/assets/{CliModeToggle-hR4a-eLX.js.map → CliModeToggle-Be9xsPiv.js.map} +1 -1
  149. package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js → CliSessionSharePage-Bh9jBtPI.js} +2 -2
  150. package/ccw/frontend/dist/assets/{CliSessionSharePage-DzNPkFN9.js.map → CliSessionSharePage-Bh9jBtPI.js.map} +1 -1
  151. package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js → CliViewerPage-BrE-oyEq.js} +2 -2
  152. package/ccw/frontend/dist/assets/{CliViewerPage-BPEGN4TT.js.map → CliViewerPage-BrE-oyEq.js.map} +1 -1
  153. package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js → CodexLensPage-Cd3nrC93.js} +2 -2
  154. package/ccw/frontend/dist/assets/{CodexLensPage-Cf0r2RHY.js.map → CodexLensPage-Cd3nrC93.js.map} +1 -1
  155. package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js → Collapsible-DXFl3VKF.js} +2 -2
  156. package/ccw/frontend/dist/assets/{Collapsible-DEm1rJ4h.js.map → Collapsible-DXFl3VKF.js.map} +1 -1
  157. package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js → CommandsManagerPage-IV8zpjgX.js} +2 -2
  158. package/ccw/frontend/dist/assets/{CommandsManagerPage-BpeWw8HO.js.map → CommandsManagerPage-IV8zpjgX.js.map} +1 -1
  159. package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js → DeepWikiPage-CpDxtmRX.js} +2 -2
  160. package/ccw/frontend/dist/assets/{DeepWikiPage-BEsmh2vF.js.map → DeepWikiPage-CpDxtmRX.js.map} +1 -1
  161. package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js → EndpointsPage-BchjWe7s.js} +2 -2
  162. package/ccw/frontend/dist/assets/{EndpointsPage-B30SFdtU.js.map → EndpointsPage-BchjWe7s.js.map} +1 -1
  163. package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js → ExplorerPage-CbWvaJ0y.js} +2 -2
  164. package/ccw/frontend/dist/assets/{ExplorerPage-BVvMpg1O.js.map → ExplorerPage-CbWvaJ0y.js.map} +1 -1
  165. package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js → FixSessionPage-YMjVRiCk.js} +2 -2
  166. package/ccw/frontend/dist/assets/{FixSessionPage-CL73dHbh.js.map → FixSessionPage-YMjVRiCk.js.map} +1 -1
  167. package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js → FloatingFileBrowser-JW2ehYY_.js} +2 -2
  168. package/ccw/frontend/dist/assets/{FloatingFileBrowser-BL-28lMZ.js.map → FloatingFileBrowser-JW2ehYY_.js.map} +1 -1
  169. package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js → FloatingPanel-BtqzqDVq.js} +2 -2
  170. package/ccw/frontend/dist/assets/{FloatingPanel-BzZDciHZ.js.map → FloatingPanel-BtqzqDVq.js.map} +1 -1
  171. package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js → GraphExplorerPage-BsJL_W4d.js} +3 -3
  172. package/ccw/frontend/dist/assets/{GraphExplorerPage-CDp6-d8P.js.map → GraphExplorerPage-BsJL_W4d.js.map} +1 -1
  173. package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js → HistoryPage-BuWpQ7k5.js} +2 -2
  174. package/ccw/frontend/dist/assets/{HistoryPage-fZY_7O9n.js.map → HistoryPage-BuWpQ7k5.js.map} +1 -1
  175. package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js → HookManagerPage-D0BtMIWy.js} +2 -2
  176. package/ccw/frontend/dist/assets/{HookManagerPage-4LJeC9bq.js.map → HookManagerPage-D0BtMIWy.js.map} +1 -1
  177. package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js → InstallationsPage-C7dwsAKG.js} +2 -2
  178. package/ccw/frontend/dist/assets/{InstallationsPage-Bpigrbhw.js.map → InstallationsPage-C7dwsAKG.js.map} +1 -1
  179. package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js → IssueHubPage-D0nCNaeB.js} +2 -2
  180. package/ccw/frontend/dist/assets/{IssueHubPage-BP0zJc1R.js.map → IssueHubPage-D0nCNaeB.js.map} +1 -1
  181. package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js → LiteTasksPage-B5c2Kb9r.js} +3 -3
  182. package/ccw/frontend/dist/assets/{LiteTasksPage-CSt2oVKQ.js.map → LiteTasksPage-B5c2Kb9r.js.map} +1 -1
  183. package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js → McpManagerPage-C-S5CehM.js} +2 -2
  184. package/ccw/frontend/dist/assets/{McpManagerPage-B-xaMA0w.js.map → McpManagerPage-C-S5CehM.js.map} +1 -1
  185. package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js → MemoryPage-P_B0JVUQ.js} +2 -2
  186. package/ccw/frontend/dist/assets/{MemoryPage-CJqo_7DY.js.map → MemoryPage-P_B0JVUQ.js.map} +1 -1
  187. package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js → NotFoundPage-S4Jn9LUE.js} +2 -2
  188. package/ccw/frontend/dist/assets/{NotFoundPage-ibZeQA-Y.js.map → NotFoundPage-S4Jn9LUE.js.map} +1 -1
  189. package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js → OrchestratorPage-C2Zlr7AC.js} +2 -2
  190. package/ccw/frontend/dist/assets/{OrchestratorPage-DgJ4ctPQ.js.map → OrchestratorPage-C2Zlr7AC.js.map} +1 -1
  191. package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js → ProjectOverviewPage-CMVfz8s5.js} +2 -2
  192. package/ccw/frontend/dist/assets/{ProjectOverviewPage-Cit0Yq0D.js.map → ProjectOverviewPage-CMVfz8s5.js.map} +1 -1
  193. package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js → PromptHistoryPage-YEMjFARX.js} +3 -3
  194. package/ccw/frontend/dist/assets/{PromptHistoryPage-Ce1HDIK0.js.map → PromptHistoryPage-YEMjFARX.js.map} +1 -1
  195. package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js → ReviewSessionPage-DnTm55nG.js} +2 -2
  196. package/ccw/frontend/dist/assets/{ReviewSessionPage-J1KikNrk.js.map → ReviewSessionPage-DnTm55nG.js.map} +1 -1
  197. package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js → RulesManagerPage-CUwebtO2.js} +2 -2
  198. package/ccw/frontend/dist/assets/{RulesManagerPage-CdBjTmth.js.map → RulesManagerPage-CUwebtO2.js.map} +1 -1
  199. package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js → SessionDetailPage-0qyH1Z5P.js} +2 -2
  200. package/ccw/frontend/dist/assets/{SessionDetailPage-B9ZK7LvX.js.map → SessionDetailPage-0qyH1Z5P.js.map} +1 -1
  201. package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js → SessionsPage-BpgP4087.js} +2 -2
  202. package/ccw/frontend/dist/assets/{SessionsPage-CW_nS5UR.js.map → SessionsPage-BpgP4087.js.map} +1 -1
  203. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js +150 -0
  204. package/ccw/frontend/dist/assets/SettingsPage-C3SJajeT.js.map +1 -0
  205. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js +7 -0
  206. package/ccw/frontend/dist/assets/SkillsManagerPage-vD9PTsmy.js.map +1 -0
  207. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js → SpecsSettingsPage-DT-yTVkD.js} +4 -4
  208. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DJpi9XQL.js.map → SpecsSettingsPage-DT-yTVkD.js.map} +1 -1
  209. package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js → Switch-CYSPdqWk.js} +2 -2
  210. package/ccw/frontend/dist/assets/{Switch-Ac6Ov7uy.js.map → Switch-CYSPdqWk.js.map} +1 -1
  211. package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js → TabsNavigation-CPh6Zor1.js} +2 -2
  212. package/ccw/frontend/dist/assets/{TabsNavigation-DZAAspqR.js.map → TabsNavigation-CPh6Zor1.js.map} +1 -1
  213. package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js → TaskDrawer-Ds-8830B.js} +2 -2
  214. package/ccw/frontend/dist/assets/{TaskDrawer-BJkwfhIZ.js.map → TaskDrawer-Ds-8830B.js.map} +1 -1
  215. package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js → TeamPage-CJODUxBk.js} +2 -2
  216. package/ccw/frontend/dist/assets/{TeamPage-BJgjxBgb.js.map → TeamPage-CJODUxBk.js.map} +1 -1
  217. package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js → TerminalDashboardPage-Cn3fGUuO.js} +3 -3
  218. package/ccw/frontend/dist/assets/{TerminalDashboardPage-D1WekoOy.js.map → TerminalDashboardPage-Cn3fGUuO.js.map} +1 -1
  219. package/ccw/frontend/dist/assets/{archive-DxemgIhF.js → archive-CjwVpw6k.js} +2 -2
  220. package/ccw/frontend/dist/assets/{archive-DxemgIhF.js.map → archive-CjwVpw6k.js.map} +1 -1
  221. package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js → archive-restore-2vZa9Ic3.js} +2 -2
  222. package/ccw/frontend/dist/assets/{archive-restore-CjS83f1V.js.map → archive-restore-2vZa9Ic3.js.map} +1 -1
  223. package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js → arrow-right-CUU5XDgT.js} +2 -2
  224. package/ccw/frontend/dist/assets/{arrow-right-B5PUcn8I.js.map → arrow-right-CUU5XDgT.js.map} +1 -1
  225. package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js → bookmark-plus-Cc3nKRZ5.js} +2 -2
  226. package/ccw/frontend/dist/assets/{bookmark-plus-DCc9aPbb.js.map → bookmark-plus-Cc3nKRZ5.js.map} +1 -1
  227. package/ccw/frontend/dist/assets/{bot-DOwFtzak.js → bot-BwpSRDUa.js} +2 -2
  228. package/ccw/frontend/dist/assets/{bot-DOwFtzak.js.map → bot-BwpSRDUa.js.map} +1 -1
  229. package/ccw/frontend/dist/assets/{braces-96qH3aFh.js → braces-DBzUW1XC.js} +2 -2
  230. package/ccw/frontend/dist/assets/{braces-96qH3aFh.js.map → braces-DBzUW1XC.js.map} +1 -1
  231. package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js → circle-stop-CGNNsjvE.js} +2 -2
  232. package/ccw/frontend/dist/assets/{circle-stop-CCxSuil1.js.map → circle-stop-CGNNsjvE.js.map} +1 -1
  233. package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js → cpu-D27G86Ul.js} +2 -2
  234. package/ccw/frontend/dist/assets/{cpu-CZNSJFdq.js.map → cpu-D27G86Ul.js.map} +1 -1
  235. package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js → ellipsis-vertical-C1Ij47Yz.js} +2 -2
  236. package/ccw/frontend/dist/assets/{ellipsis-vertical-h8xtvw2_.js.map → ellipsis-vertical-C1Ij47Yz.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js → eye-C6MOB7Au.js} +2 -2
  238. package/ccw/frontend/dist/assets/{eye-D3NY0bm6.js.map → eye-C6MOB7Au.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js → eye-off-BxfBlZ26.js} +2 -2
  240. package/ccw/frontend/dist/assets/{eye-off-Cy2vkc8p.js.map → eye-off-BxfBlZ26.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js → file-json-NI237wA-.js} +2 -2
  242. package/ccw/frontend/dist/assets/{file-json-Bzq3U1Mx.js.map → file-json-NI237wA-.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js → file-text-Byn2_2v6.js} +2 -2
  244. package/ccw/frontend/dist/assets/{file-text-DwuwPDPi.js.map → file-text-Byn2_2v6.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{filter-q9g-bknU.js → filter-D-7PhZjx.js} +2 -2
  246. package/ccw/frontend/dist/assets/{filter-q9g-bknU.js.map → filter-D-7PhZjx.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{folder-CL6vb42J.js → folder-BoAsK_FL.js} +2 -2
  248. package/ccw/frontend/dist/assets/{folder-CL6vb42J.js.map → folder-BoAsK_FL.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js → gauge-DCSxJIS4.js} +2 -2
  250. package/ccw/frontend/dist/assets/{gauge-BkrcQBly.js.map → gauge-DCSxJIS4.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js → globe-CHS3prza.js} +2 -2
  252. package/ccw/frontend/dist/assets/{globe-BQbwyNeV.js.map → globe-CHS3prza.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js → grid-3x3-D7K35U7S.js} +2 -2
  254. package/ccw/frontend/dist/assets/{grid-3x3-x5_7DrN7.js.map → grid-3x3-D7K35U7S.js.map} +1 -1
  255. package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js → hard-drive-eq9xE07G.js} +2 -2
  256. package/ccw/frontend/dist/assets/{hard-drive-DTyWXwzf.js.map → hard-drive-eq9xE07G.js.map} +1 -1
  257. package/ccw/frontend/dist/assets/{hash-80O0kJO7.js → hash-C1DMpBua.js} +2 -2
  258. package/ccw/frontend/dist/assets/{hash-80O0kJO7.js.map → hash-C1DMpBua.js.map} +1 -1
  259. package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js → history-Di5SBCY-.js} +2 -2
  260. package/ccw/frontend/dist/assets/{history-DDlN2Bwa.js.map → history-Di5SBCY-.js.map} +1 -1
  261. package/ccw/frontend/dist/assets/{index-mbeo62f8.js → index--_R7COnA.js} +2 -2
  262. package/ccw/frontend/dist/assets/{index-mbeo62f8.js.map → index--_R7COnA.js.map} +1 -1
  263. package/ccw/frontend/dist/assets/{index-rLgoBCfV.js → index-BUol9HDD.js} +3 -3
  264. package/ccw/frontend/dist/assets/{index-rLgoBCfV.js.map → index-BUol9HDD.js.map} +1 -1
  265. package/ccw/frontend/dist/assets/{index-Bs80iCX0.js → index-CT9oykfw.js} +2 -2
  266. package/ccw/frontend/dist/assets/{index-Bs80iCX0.js.map → index-CT9oykfw.js.map} +1 -1
  267. package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js → index-Ddwvf87H.js} +2 -2
  268. package/ccw/frontend/dist/assets/{index-B9A3Hnrk.js.map → index-Ddwvf87H.js.map} +1 -1
  269. package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js → layout-grid-LiX0qZbN.js} +2 -2
  270. package/ccw/frontend/dist/assets/{layout-grid-C1niOWJx.js.map → layout-grid-LiX0qZbN.js.map} +1 -1
  271. package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js → lightbulb-CL3DVEwb.js} +2 -2
  272. package/ccw/frontend/dist/assets/{lightbulb-BTmI7SUg.js.map → lightbulb-CL3DVEwb.js.map} +1 -1
  273. package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js → link-2-CC5cFeq6.js} +2 -2
  274. package/ccw/frontend/dist/assets/{link-2-CB9HKeuZ.js.map → link-2-CC5cFeq6.js.map} +1 -1
  275. package/ccw/frontend/dist/assets/{link-koEYiemK.js → link-ngFQ9bs0.js} +2 -2
  276. package/ccw/frontend/dist/assets/{link-koEYiemK.js.map → link-ngFQ9bs0.js.map} +1 -1
  277. package/ccw/frontend/dist/assets/{list-v2_GaLdC.js → list-BEU6I0KK.js} +2 -2
  278. package/ccw/frontend/dist/assets/{list-v2_GaLdC.js.map → list-BEU6I0KK.js.map} +1 -1
  279. package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js → map-pin-BWZdLA6y.js} +2 -2
  280. package/ccw/frontend/dist/assets/{map-pin-BQNfAqG_.js.map → map-pin-BWZdLA6y.js.map} +1 -1
  281. package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js → messages-square-K6_Chm7n.js} +2 -2
  282. package/ccw/frontend/dist/assets/{messages-square-Dzq5LGg9.js.map → messages-square-K6_Chm7n.js.map} +1 -1
  283. package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js → minimize-2-CWkphauf.js} +2 -2
  284. package/ccw/frontend/dist/assets/{minimize-2-CtkoJXcz.js.map → minimize-2-CWkphauf.js.map} +1 -1
  285. package/ccw/frontend/dist/assets/{package-CH3smL37.js → package-DrNgkamn.js} +2 -2
  286. package/ccw/frontend/dist/assets/{package-CH3smL37.js.map → package-DrNgkamn.js.map} +1 -1
  287. package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js → plug-CMo3sw5_.js} +2 -2
  288. package/ccw/frontend/dist/assets/{plug-CZ0aL_yF.js.map → plug-CMo3sw5_.js.map} +1 -1
  289. package/ccw/frontend/dist/assets/{power-F2A_J4l6.js → power-DppNTW5e.js} +2 -2
  290. package/ccw/frontend/dist/assets/{power-F2A_J4l6.js.map → power-DppNTW5e.js.map} +1 -1
  291. package/ccw/frontend/dist/assets/{save-Byxot0YU.js → save-CD8aPMbZ.js} +2 -2
  292. package/ccw/frontend/dist/assets/{save-Byxot0YU.js.map → save-CD8aPMbZ.js.map} +1 -1
  293. package/ccw/frontend/dist/assets/{send-JjqhUkpw.js → send-B4z90fQD.js} +2 -2
  294. package/ccw/frontend/dist/assets/{send-JjqhUkpw.js.map → send-B4z90fQD.js.map} +1 -1
  295. package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js → settings-2-CAKRU_QC.js} +2 -2
  296. package/ccw/frontend/dist/assets/{settings-2--SuN9rAt.js.map → settings-2-CAKRU_QC.js.map} +1 -1
  297. package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js → square-check-big-KhI3HrzX.js} +2 -2
  298. package/ccw/frontend/dist/assets/{square-check-big-BbngGB2h.js.map → square-check-big-KhI3HrzX.js.map} +1 -1
  299. package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js → square-pen-BtdGIpuq.js} +2 -2
  300. package/ccw/frontend/dist/assets/{square-pen-CgrHgZSl.js.map → square-pen-BtdGIpuq.js.map} +1 -1
  301. package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js → star-ZoBUkXoD.js} +2 -2
  302. package/ccw/frontend/dist/assets/{star-BU3TQr7Z.js.map → star-ZoBUkXoD.js.map} +1 -1
  303. package/ccw/frontend/dist/assets/{style-CKs7nnn3.js → style-CltxQP-P.js} +2 -2
  304. package/ccw/frontend/dist/assets/{style-CKs7nnn3.js.map → style-CltxQP-P.js.map} +1 -1
  305. package/ccw/frontend/dist/assets/{target-DW5tsDW6.js → target-C32OUSGf.js} +2 -2
  306. package/ccw/frontend/dist/assets/{target-DW5tsDW6.js.map → target-C32OUSGf.js.map} +1 -1
  307. package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js → test-tube-0IxoyAVZ.js} +2 -2
  308. package/ccw/frontend/dist/assets/{test-tube-BHm7w3ON.js.map → test-tube-0IxoyAVZ.js.map} +1 -1
  309. package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js → upload-4eKCkyBn.js} +2 -2
  310. package/ccw/frontend/dist/assets/{upload-DYR7PWwt.js.map → upload-4eKCkyBn.js.map} +1 -1
  311. package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js → useApiSettings-zLTUWqhi.js} +2 -2
  312. package/ccw/frontend/dist/assets/{useApiSettings-D0TVgQD_.js.map → useApiSettings-zLTUWqhi.js.map} +1 -1
  313. package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js → useCli-BtN2vpOX.js} +2 -2
  314. package/ccw/frontend/dist/assets/{useCli-DfY8mAP8.js.map → useCli-BtN2vpOX.js.map} +1 -1
  315. package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js → useCommands-_spj49qL.js} +2 -2
  316. package/ccw/frontend/dist/assets/{useCommands-CGusDp0F.js.map → useCommands-_spj49qL.js.map} +1 -1
  317. package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js → useDebounce-Bm9KFZvd.js} +2 -2
  318. package/ccw/frontend/dist/assets/{useDebounce-CIwh0fF1.js.map → useDebounce-Bm9KFZvd.js.map} +1 -1
  319. package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js → useFileExplorer-DOmpm6v9.js} +2 -2
  320. package/ccw/frontend/dist/assets/{useFileExplorer-FMyFv39K.js.map → useFileExplorer-DOmpm6v9.js.map} +1 -1
  321. package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js → useLocale-D2rj4rea.js} +2 -2
  322. package/ccw/frontend/dist/assets/{useLocale-B2qhsoTb.js.map → useLocale-D2rj4rea.js.map} +1 -1
  323. package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js → useSkills-OskEpomF.js} +3 -3
  324. package/ccw/frontend/dist/assets/{useSkills-cxKXMBm3.js.map → useSkills-OskEpomF.js.map} +1 -1
  325. package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js → useSystemSettings-BjMgsNSF.js} +2 -2
  326. package/ccw/frontend/dist/assets/{useSystemSettings-B-xUT_z-.js.map → useSystemSettings-BjMgsNSF.js.map} +1 -1
  327. package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js → wand-sparkles-CLhyYWa7.js} +2 -2
  328. package/ccw/frontend/dist/assets/{wand-sparkles-DZV_3lPr.js.map → wand-sparkles-CLhyYWa7.js.map} +1 -1
  329. package/ccw/frontend/dist/index.html +1 -1
  330. package/ccw/scripts/prepublish-clean.mjs +0 -1
  331. package/package.json +1 -3
  332. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js +0 -150
  333. package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +0 -1
  334. package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js +0 -7
  335. package/ccw/frontend/dist/assets/SkillsManagerPage-CTnWrrwp.js.map +0 -1
  336. package/ccw-litellm/README.md +0 -180
  337. package/ccw-litellm/pyproject.toml +0 -35
  338. package/ccw-litellm/src/ccw_litellm/__init__.py +0 -47
  339. package/ccw-litellm/src/ccw_litellm/cli.py +0 -108
  340. package/ccw-litellm/src/ccw_litellm/clients/__init__.py +0 -12
  341. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +0 -270
  342. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +0 -198
  343. package/ccw-litellm/src/ccw_litellm/config/__init__.py +0 -22
  344. package/ccw-litellm/src/ccw_litellm/config/loader.py +0 -343
  345. package/ccw-litellm/src/ccw_litellm/config/models.py +0 -162
  346. package/ccw-litellm/src/ccw_litellm/interfaces/__init__.py +0 -14
  347. package/ccw-litellm/src/ccw_litellm/interfaces/embedder.py +0 -52
  348. package/ccw-litellm/src/ccw_litellm/interfaces/llm.py +0 -45
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillsManagerPage-vD9PTsmy.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/folder-input.js","../../src/hooks/useSkillHub.ts","../../../../node_modules/@radix-ui/react-toast/dist/index.mjs","../../src/components/ui/Toast.tsx","../../src/components/shared/SkillCard.tsx","../../src/utils/skill-files.ts","../../src/components/shared/SkillDetailPanel.tsx","../../src/components/shared/SkillCreateDialog.tsx","../../src/components/shared/SkillHubCard.tsx","../../src/hooks/useRealtimeUpdates.ts","../../src/pages/SkillsManagerPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FolderInput = createLucideIcon(\"FolderInput\", [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n]);\n\nexport { FolderInput as default };\n//# sourceMappingURL=folder-input.js.map\n","// ========================================\r\n// Skill Hub Hooks\r\n// ========================================\r\n// React Query hooks for Skill Hub API\r\n\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { fetchApi } from '@/lib/api';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type CliType = 'claude' | 'codex';\r\nexport type SkillSource = 'remote' | 'local';\r\n\r\nexport interface RemoteSkill {\r\n id: string;\r\n name: string;\r\n description: string;\r\n version: string;\r\n author: string;\r\n category: string;\r\n tags: string[];\r\n downloadUrl: string;\r\n readmeUrl?: string;\r\n homepage?: string;\r\n license?: string;\r\n updatedAt?: string;\r\n}\r\n\r\nexport interface LocalSkill {\r\n id: string;\r\n name: string;\r\n folderName: string;\r\n description: string;\r\n version: string;\r\n author?: string;\r\n category?: string;\r\n tags?: string[];\r\n path: string;\r\n source: 'local';\r\n updatedAt: string;\r\n}\r\n\r\nexport interface InstalledSkill {\r\n id: string;\r\n name: string;\r\n folderName: string;\r\n version: string;\r\n installedAt: string;\r\n installedTo: CliType;\r\n source: SkillSource;\r\n originalId: string;\r\n updatesAvailable?: boolean;\r\n latestVersion?: string;\r\n}\r\n\r\nexport interface RemoteSkillsResponse {\r\n success: boolean;\r\n data: RemoteSkill[];\r\n meta: {\r\n version: string;\r\n updated_at: string;\r\n source: 'github' | 'http' | 'local';\r\n };\r\n total: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface LocalSkillsResponse {\r\n success: boolean;\r\n data: LocalSkill[];\r\n total: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface InstalledSkillsResponse {\r\n success: boolean;\r\n data: InstalledSkill[];\r\n total: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface SkillInstallRequest {\r\n skillId: string;\r\n cliType: CliType;\r\n source: SkillSource;\r\n customName?: string;\r\n downloadUrl?: string;\r\n}\r\n\r\nexport interface SkillInstallResponse {\r\n success: boolean;\r\n message: string;\r\n installedPath?: string;\r\n error?: string;\r\n}\r\n\r\nexport interface SkillCacheRequest {\r\n skillId: string;\r\n downloadUrl: string;\r\n}\r\n\r\nexport interface SkillCacheResponse {\r\n success: boolean;\r\n message: string;\r\n path?: string;\r\n error?: string;\r\n}\r\n\r\nexport interface SkillHubStats {\r\n remoteTotal: number;\r\n localTotal: number;\r\n installedTotal: number;\r\n updatesAvailable: number;\r\n claudeInstalled: number;\r\n codexInstalled: number;\r\n}\r\n\r\n// ============================================================================\r\n// Query Keys\r\n// ============================================================================\r\n\r\nexport const skillHubKeys = {\r\n all: ['skill-hub'] as const,\r\n remote: () => [...skillHubKeys.all, 'remote'] as const,\r\n local: () => [...skillHubKeys.all, 'local'] as const,\r\n installed: (checkUpdates?: boolean) => [...skillHubKeys.all, 'installed', checkUpdates] as const,\r\n updates: () => [...skillHubKeys.all, 'updates'] as const,\r\n stats: () => [...skillHubKeys.all, 'stats'] as const,\r\n};\r\n\r\n// ============================================================================\r\n// Remote Skills Hook\r\n// ============================================================================\r\n\r\n/**\r\n * Fetch remote skills from GitHub/HTTP index\r\n */\r\nexport function useRemoteSkills(enabled = true) {\r\n return useQuery({\r\n queryKey: skillHubKeys.remote(),\r\n queryFn: () => fetchApi<RemoteSkillsResponse>('/api/skill-hub/remote'),\r\n enabled,\r\n staleTime: 5 * 60 * 1000, // 5 minutes\r\n refetchOnWindowFocus: false,\r\n select: (data) => ({\r\n skills: data.data,\r\n meta: data.meta,\r\n total: data.total,\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Local Skills Hook\r\n// ============================================================================\r\n\r\n/**\r\n * Fetch local shared skills\r\n */\r\nexport function useLocalSkills(enabled = true) {\r\n return useQuery({\r\n queryKey: skillHubKeys.local(),\r\n queryFn: () => fetchApi<LocalSkillsResponse>('/api/skill-hub/local'),\r\n enabled,\r\n select: (data) => ({\r\n skills: data.data,\r\n total: data.total,\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Installed Skills Hook\r\n// ============================================================================\r\n\r\n/**\r\n * Fetch installed skills from hub\r\n */\r\nexport function useInstalledSkills(options?: { checkUpdates?: boolean; enabled?: boolean }) {\r\n const { checkUpdates = false, enabled = true } = options || {};\r\n\r\n return useQuery({\r\n queryKey: skillHubKeys.installed(checkUpdates),\r\n queryFn: () => {\r\n const url = checkUpdates\r\n ? '/api/skill-hub/installed?checkUpdates=true'\r\n : '/api/skill-hub/installed';\r\n return fetchApi<InstalledSkillsResponse>(url);\r\n },\r\n enabled,\r\n select: (data) => ({\r\n skills: data.data,\r\n total: data.total,\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Updates Check Hook\r\n// ============================================================================\r\n\r\n/**\r\n * Check for available updates\r\n */\r\nexport function useSkillHubUpdates(enabled = true) {\r\n return useQuery({\r\n queryKey: skillHubKeys.updates(),\r\n queryFn: () => fetchApi<InstalledSkillsResponse>('/api/skill-hub/updates'),\r\n enabled,\r\n staleTime: 60 * 1000, // 1 minute\r\n select: (data) => ({\r\n updates: data.data,\r\n total: data.total,\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Install Skill Mutation\r\n// ============================================================================\r\n\r\n/**\r\n * Install skill mutation\r\n */\r\nexport function useInstallSkill() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: (request: SkillInstallRequest) =>\r\n fetchApi<SkillInstallResponse>('/api/skill-hub/install', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n }),\r\n onSuccess: () => {\r\n // Invalidate relevant queries\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.installed() });\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.updates() });\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.stats() });\r\n },\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Cache Skill Mutation\r\n// ============================================================================\r\n\r\n/**\r\n * Cache remote skill mutation\r\n */\r\nexport function useCacheSkill() {\r\n return useMutation({\r\n mutationFn: (request: SkillCacheRequest) =>\r\n fetchApi<SkillCacheResponse>('/api/skill-hub/cache', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Uninstall Skill Mutation\r\n// ============================================================================\r\n\r\n/**\r\n * Uninstall skill mutation\r\n */\r\nexport function useUninstallSkill() {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation({\r\n mutationFn: ({ skillId, cliType }: { skillId: string; cliType: CliType }) =>\r\n fetchApi<{ success: boolean; message: string }>(`/api/skill-hub/installed/${skillId}`, {\r\n method: 'DELETE',\r\n body: JSON.stringify({ cliType }),\r\n }),\r\n onSuccess: () => {\r\n // Invalidate relevant queries\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.installed() });\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.updates() });\r\n queryClient.invalidateQueries({ queryKey: skillHubKeys.stats() });\r\n },\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Stats Hook\r\n// ============================================================================\r\n\r\n/**\r\n * Get skill hub statistics\r\n * Combines data from multiple endpoints\r\n */\r\nexport function useSkillHubStats(enabled = true) {\r\n const { data: remoteData } = useRemoteSkills(enabled);\r\n const { data: localData } = useLocalSkills(enabled);\r\n const { data: installedData } = useInstalledSkills({ checkUpdates: true, enabled });\r\n\r\n return useQuery({\r\n queryKey: skillHubKeys.stats(),\r\n queryFn: (): SkillHubStats => {\r\n const installed = installedData?.skills || [];\r\n const updatesAvailable = installed.filter(s => s.updatesAvailable).length;\r\n const claudeInstalled = installed.filter(s => s.installedTo === 'claude').length;\r\n const codexInstalled = installed.filter(s => s.installedTo === 'codex').length;\r\n\r\n return {\r\n remoteTotal: remoteData?.total || 0,\r\n localTotal: localData?.total || 0,\r\n installedTotal: installed.length,\r\n updatesAvailable,\r\n claudeInstalled,\r\n codexInstalled,\r\n };\r\n },\r\n enabled: enabled && !!remoteData && !!localData && !!installedData,\r\n staleTime: 30 * 1000, // 30 seconds\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Combined Hooks\r\n// ============================================================================\r\n\r\n/**\r\n * Combined hook for all skill hub data\r\n */\r\nexport function useSkillHub(enabled = true) {\r\n const remote = useRemoteSkills(enabled);\r\n const local = useLocalSkills(enabled);\r\n const installed = useInstalledSkills({ checkUpdates: true, enabled });\r\n const stats = useSkillHubStats(enabled && remote.isSuccess && local.isSuccess && installed.isSuccess);\r\n\r\n const isLoading = remote.isLoading || local.isLoading || installed.isLoading;\r\n const isError = remote.isError || local.isError || installed.isError;\r\n const isFetching = remote.isFetching || local.isFetching || installed.isFetching;\r\n\r\n return {\r\n remote,\r\n local,\r\n installed,\r\n stats,\r\n isLoading,\r\n isError,\r\n isFetching,\r\n refetchAll: () => {\r\n remote.refetch();\r\n local.refetch();\r\n installed.refetch();\r\n },\r\n };\r\n}\r\n","\"use client\";\n\n// src/toast.tsx\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport * as DismissableLayer from \"@radix-ui/react-dismissable-layer\";\nimport { Portal } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar PROVIDER_NAME = \"ToastProvider\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(\"Toast\");\nvar [createToastContext, createToastScope] = createContextScope(\"Toast\", [createCollectionScope]);\nvar [ToastProviderProvider, useToastProviderContext] = createToastContext(PROVIDER_NAME);\nvar ToastProvider = (props) => {\n const {\n __scopeToast,\n label = \"Notification\",\n duration = 5e3,\n swipeDirection = \"right\",\n swipeThreshold = 50,\n children\n } = props;\n const [viewport, setViewport] = React.useState(null);\n const [toastCount, setToastCount] = React.useState(0);\n const isFocusedToastEscapeKeyDownRef = React.useRef(false);\n const isClosePausedRef = React.useRef(false);\n if (!label.trim()) {\n console.error(\n `Invalid prop \\`label\\` supplied to \\`${PROVIDER_NAME}\\`. Expected non-empty \\`string\\`.`\n );\n }\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: __scopeToast, children: /* @__PURE__ */ jsx(\n ToastProviderProvider,\n {\n scope: __scopeToast,\n label,\n duration,\n swipeDirection,\n swipeThreshold,\n toastCount,\n viewport,\n onViewportChange: setViewport,\n onToastAdd: React.useCallback(() => setToastCount((prevCount) => prevCount + 1), []),\n onToastRemove: React.useCallback(() => setToastCount((prevCount) => prevCount - 1), []),\n isFocusedToastEscapeKeyDownRef,\n isClosePausedRef,\n children\n }\n ) });\n};\nToastProvider.displayName = PROVIDER_NAME;\nvar VIEWPORT_NAME = \"ToastViewport\";\nvar VIEWPORT_DEFAULT_HOTKEY = [\"F8\"];\nvar VIEWPORT_PAUSE = \"toast.viewportPause\";\nvar VIEWPORT_RESUME = \"toast.viewportResume\";\nvar ToastViewport = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeToast,\n hotkey = VIEWPORT_DEFAULT_HOTKEY,\n label = \"Notifications ({hotkey})\",\n ...viewportProps\n } = props;\n const context = useToastProviderContext(VIEWPORT_NAME, __scopeToast);\n const getItems = useCollection(__scopeToast);\n const wrapperRef = React.useRef(null);\n const headFocusProxyRef = React.useRef(null);\n const tailFocusProxyRef = React.useRef(null);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n const hotkeyLabel = hotkey.join(\"+\").replace(/Key/g, \"\").replace(/Digit/g, \"\");\n const hasToasts = context.toastCount > 0;\n React.useEffect(() => {\n const handleKeyDown = (event) => {\n const isHotkeyPressed = hotkey.length !== 0 && hotkey.every((key) => event[key] || event.code === key);\n if (isHotkeyPressed) ref.current?.focus();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [hotkey]);\n React.useEffect(() => {\n const wrapper = wrapperRef.current;\n const viewport = ref.current;\n if (hasToasts && wrapper && viewport) {\n const handlePause = () => {\n if (!context.isClosePausedRef.current) {\n const pauseEvent = new CustomEvent(VIEWPORT_PAUSE);\n viewport.dispatchEvent(pauseEvent);\n context.isClosePausedRef.current = true;\n }\n };\n const handleResume = () => {\n if (context.isClosePausedRef.current) {\n const resumeEvent = new CustomEvent(VIEWPORT_RESUME);\n viewport.dispatchEvent(resumeEvent);\n context.isClosePausedRef.current = false;\n }\n };\n const handleFocusOutResume = (event) => {\n const isFocusMovingOutside = !wrapper.contains(event.relatedTarget);\n if (isFocusMovingOutside) handleResume();\n };\n const handlePointerLeaveResume = () => {\n const isFocusInside = wrapper.contains(document.activeElement);\n if (!isFocusInside) handleResume();\n };\n wrapper.addEventListener(\"focusin\", handlePause);\n wrapper.addEventListener(\"focusout\", handleFocusOutResume);\n wrapper.addEventListener(\"pointermove\", handlePause);\n wrapper.addEventListener(\"pointerleave\", handlePointerLeaveResume);\n window.addEventListener(\"blur\", handlePause);\n window.addEventListener(\"focus\", handleResume);\n return () => {\n wrapper.removeEventListener(\"focusin\", handlePause);\n wrapper.removeEventListener(\"focusout\", handleFocusOutResume);\n wrapper.removeEventListener(\"pointermove\", handlePause);\n wrapper.removeEventListener(\"pointerleave\", handlePointerLeaveResume);\n window.removeEventListener(\"blur\", handlePause);\n window.removeEventListener(\"focus\", handleResume);\n };\n }\n }, [hasToasts, context.isClosePausedRef]);\n const getSortedTabbableCandidates = React.useCallback(\n ({ tabbingDirection }) => {\n const toastItems = getItems();\n const tabbableCandidates = toastItems.map((toastItem) => {\n const toastNode = toastItem.ref.current;\n const toastTabbableCandidates = [toastNode, ...getTabbableCandidates(toastNode)];\n return tabbingDirection === \"forwards\" ? toastTabbableCandidates : toastTabbableCandidates.reverse();\n });\n return (tabbingDirection === \"forwards\" ? tabbableCandidates.reverse() : tabbableCandidates).flat();\n },\n [getItems]\n );\n React.useEffect(() => {\n const viewport = ref.current;\n if (viewport) {\n const handleKeyDown = (event) => {\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey;\n const isTabKey = event.key === \"Tab\" && !isMetaKey;\n if (isTabKey) {\n const focusedElement = document.activeElement;\n const isTabbingBackwards = event.shiftKey;\n const targetIsViewport = event.target === viewport;\n if (targetIsViewport && isTabbingBackwards) {\n headFocusProxyRef.current?.focus();\n return;\n }\n const tabbingDirection = isTabbingBackwards ? \"backwards\" : \"forwards\";\n const sortedCandidates = getSortedTabbableCandidates({ tabbingDirection });\n const index = sortedCandidates.findIndex((candidate) => candidate === focusedElement);\n if (focusFirst(sortedCandidates.slice(index + 1))) {\n event.preventDefault();\n } else {\n isTabbingBackwards ? headFocusProxyRef.current?.focus() : tailFocusProxyRef.current?.focus();\n }\n }\n };\n viewport.addEventListener(\"keydown\", handleKeyDown);\n return () => viewport.removeEventListener(\"keydown\", handleKeyDown);\n }\n }, [getItems, getSortedTabbableCandidates]);\n return /* @__PURE__ */ jsxs(\n DismissableLayer.Branch,\n {\n ref: wrapperRef,\n role: \"region\",\n \"aria-label\": label.replace(\"{hotkey}\", hotkeyLabel),\n tabIndex: -1,\n style: { pointerEvents: hasToasts ? void 0 : \"none\" },\n children: [\n hasToasts && /* @__PURE__ */ jsx(\n FocusProxy,\n {\n ref: headFocusProxyRef,\n onFocusFromOutsideViewport: () => {\n const tabbableCandidates = getSortedTabbableCandidates({\n tabbingDirection: \"forwards\"\n });\n focusFirst(tabbableCandidates);\n }\n }\n ),\n /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeToast, children: /* @__PURE__ */ jsx(Primitive.ol, { tabIndex: -1, ...viewportProps, ref: composedRefs }) }),\n hasToasts && /* @__PURE__ */ jsx(\n FocusProxy,\n {\n ref: tailFocusProxyRef,\n onFocusFromOutsideViewport: () => {\n const tabbableCandidates = getSortedTabbableCandidates({\n tabbingDirection: \"backwards\"\n });\n focusFirst(tabbableCandidates);\n }\n }\n )\n ]\n }\n );\n }\n);\nToastViewport.displayName = VIEWPORT_NAME;\nvar FOCUS_PROXY_NAME = \"ToastFocusProxy\";\nvar FocusProxy = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeToast, onFocusFromOutsideViewport, ...proxyProps } = props;\n const context = useToastProviderContext(FOCUS_PROXY_NAME, __scopeToast);\n return /* @__PURE__ */ jsx(\n VisuallyHidden,\n {\n tabIndex: 0,\n ...proxyProps,\n ref: forwardedRef,\n style: { position: \"fixed\" },\n onFocus: (event) => {\n const prevFocusedElement = event.relatedTarget;\n const isFocusFromOutsideViewport = !context.viewport?.contains(prevFocusedElement);\n if (isFocusFromOutsideViewport) onFocusFromOutsideViewport();\n }\n }\n );\n }\n);\nFocusProxy.displayName = FOCUS_PROXY_NAME;\nvar TOAST_NAME = \"Toast\";\nvar TOAST_SWIPE_START = \"toast.swipeStart\";\nvar TOAST_SWIPE_MOVE = \"toast.swipeMove\";\nvar TOAST_SWIPE_CANCEL = \"toast.swipeCancel\";\nvar TOAST_SWIPE_END = \"toast.swipeEnd\";\nvar Toast = React.forwardRef(\n (props, forwardedRef) => {\n const { forceMount, open: openProp, defaultOpen, onOpenChange, ...toastProps } = props;\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? true,\n onChange: onOpenChange,\n caller: TOAST_NAME\n });\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || open, children: /* @__PURE__ */ jsx(\n ToastImpl,\n {\n open,\n ...toastProps,\n ref: forwardedRef,\n onClose: () => setOpen(false),\n onPause: useCallbackRef(props.onPause),\n onResume: useCallbackRef(props.onResume),\n onSwipeStart: composeEventHandlers(props.onSwipeStart, (event) => {\n event.currentTarget.setAttribute(\"data-swipe\", \"start\");\n }),\n onSwipeMove: composeEventHandlers(props.onSwipeMove, (event) => {\n const { x, y } = event.detail.delta;\n event.currentTarget.setAttribute(\"data-swipe\", \"move\");\n event.currentTarget.style.setProperty(\"--radix-toast-swipe-move-x\", `${x}px`);\n event.currentTarget.style.setProperty(\"--radix-toast-swipe-move-y\", `${y}px`);\n }),\n onSwipeCancel: composeEventHandlers(props.onSwipeCancel, (event) => {\n event.currentTarget.setAttribute(\"data-swipe\", \"cancel\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-move-x\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-move-y\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-end-x\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-end-y\");\n }),\n onSwipeEnd: composeEventHandlers(props.onSwipeEnd, (event) => {\n const { x, y } = event.detail.delta;\n event.currentTarget.setAttribute(\"data-swipe\", \"end\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-move-x\");\n event.currentTarget.style.removeProperty(\"--radix-toast-swipe-move-y\");\n event.currentTarget.style.setProperty(\"--radix-toast-swipe-end-x\", `${x}px`);\n event.currentTarget.style.setProperty(\"--radix-toast-swipe-end-y\", `${y}px`);\n setOpen(false);\n })\n }\n ) });\n }\n);\nToast.displayName = TOAST_NAME;\nvar [ToastInteractiveProvider, useToastInteractiveContext] = createToastContext(TOAST_NAME, {\n onClose() {\n }\n});\nvar ToastImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeToast,\n type = \"foreground\",\n duration: durationProp,\n open,\n onClose,\n onEscapeKeyDown,\n onPause,\n onResume,\n onSwipeStart,\n onSwipeMove,\n onSwipeCancel,\n onSwipeEnd,\n ...toastProps\n } = props;\n const context = useToastProviderContext(TOAST_NAME, __scopeToast);\n const [node, setNode] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node2) => setNode(node2));\n const pointerStartRef = React.useRef(null);\n const swipeDeltaRef = React.useRef(null);\n const duration = durationProp || context.duration;\n const closeTimerStartTimeRef = React.useRef(0);\n const closeTimerRemainingTimeRef = React.useRef(duration);\n const closeTimerRef = React.useRef(0);\n const { onToastAdd, onToastRemove } = context;\n const handleClose = useCallbackRef(() => {\n const isFocusInToast = node?.contains(document.activeElement);\n if (isFocusInToast) context.viewport?.focus();\n onClose();\n });\n const startTimer = React.useCallback(\n (duration2) => {\n if (!duration2 || duration2 === Infinity) return;\n window.clearTimeout(closeTimerRef.current);\n closeTimerStartTimeRef.current = (/* @__PURE__ */ new Date()).getTime();\n closeTimerRef.current = window.setTimeout(handleClose, duration2);\n },\n [handleClose]\n );\n React.useEffect(() => {\n const viewport = context.viewport;\n if (viewport) {\n const handleResume = () => {\n startTimer(closeTimerRemainingTimeRef.current);\n onResume?.();\n };\n const handlePause = () => {\n const elapsedTime = (/* @__PURE__ */ new Date()).getTime() - closeTimerStartTimeRef.current;\n closeTimerRemainingTimeRef.current = closeTimerRemainingTimeRef.current - elapsedTime;\n window.clearTimeout(closeTimerRef.current);\n onPause?.();\n };\n viewport.addEventListener(VIEWPORT_PAUSE, handlePause);\n viewport.addEventListener(VIEWPORT_RESUME, handleResume);\n return () => {\n viewport.removeEventListener(VIEWPORT_PAUSE, handlePause);\n viewport.removeEventListener(VIEWPORT_RESUME, handleResume);\n };\n }\n }, [context.viewport, duration, onPause, onResume, startTimer]);\n React.useEffect(() => {\n if (open && !context.isClosePausedRef.current) startTimer(duration);\n }, [open, duration, context.isClosePausedRef, startTimer]);\n React.useEffect(() => {\n onToastAdd();\n return () => onToastRemove();\n }, [onToastAdd, onToastRemove]);\n const announceTextContent = React.useMemo(() => {\n return node ? getAnnounceTextContent(node) : null;\n }, [node]);\n if (!context.viewport) return null;\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n announceTextContent && /* @__PURE__ */ jsx(\n ToastAnnounce,\n {\n __scopeToast,\n role: \"status\",\n \"aria-live\": type === \"foreground\" ? \"assertive\" : \"polite\",\n children: announceTextContent\n }\n ),\n /* @__PURE__ */ jsx(ToastInteractiveProvider, { scope: __scopeToast, onClose: handleClose, children: ReactDOM.createPortal(\n /* @__PURE__ */ jsx(Collection.ItemSlot, { scope: __scopeToast, children: /* @__PURE__ */ jsx(\n DismissableLayer.Root,\n {\n asChild: true,\n onEscapeKeyDown: composeEventHandlers(onEscapeKeyDown, () => {\n if (!context.isFocusedToastEscapeKeyDownRef.current) handleClose();\n context.isFocusedToastEscapeKeyDownRef.current = false;\n }),\n children: /* @__PURE__ */ jsx(\n Primitive.li,\n {\n tabIndex: 0,\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-swipe-direction\": context.swipeDirection,\n ...toastProps,\n ref: composedRefs,\n style: { userSelect: \"none\", touchAction: \"none\", ...props.style },\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key !== \"Escape\") return;\n onEscapeKeyDown?.(event.nativeEvent);\n if (!event.nativeEvent.defaultPrevented) {\n context.isFocusedToastEscapeKeyDownRef.current = true;\n handleClose();\n }\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n if (event.button !== 0) return;\n pointerStartRef.current = { x: event.clientX, y: event.clientY };\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n if (!pointerStartRef.current) return;\n const x = event.clientX - pointerStartRef.current.x;\n const y = event.clientY - pointerStartRef.current.y;\n const hasSwipeMoveStarted = Boolean(swipeDeltaRef.current);\n const isHorizontalSwipe = [\"left\", \"right\"].includes(context.swipeDirection);\n const clamp = [\"left\", \"up\"].includes(context.swipeDirection) ? Math.min : Math.max;\n const clampedX = isHorizontalSwipe ? clamp(0, x) : 0;\n const clampedY = !isHorizontalSwipe ? clamp(0, y) : 0;\n const moveStartBuffer = event.pointerType === \"touch\" ? 10 : 2;\n const delta = { x: clampedX, y: clampedY };\n const eventDetail = { originalEvent: event, delta };\n if (hasSwipeMoveStarted) {\n swipeDeltaRef.current = delta;\n handleAndDispatchCustomEvent(TOAST_SWIPE_MOVE, onSwipeMove, eventDetail, {\n discrete: false\n });\n } else if (isDeltaInDirection(delta, context.swipeDirection, moveStartBuffer)) {\n swipeDeltaRef.current = delta;\n handleAndDispatchCustomEvent(TOAST_SWIPE_START, onSwipeStart, eventDetail, {\n discrete: false\n });\n event.target.setPointerCapture(event.pointerId);\n } else if (Math.abs(x) > moveStartBuffer || Math.abs(y) > moveStartBuffer) {\n pointerStartRef.current = null;\n }\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const delta = swipeDeltaRef.current;\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n swipeDeltaRef.current = null;\n pointerStartRef.current = null;\n if (delta) {\n const toast = event.currentTarget;\n const eventDetail = { originalEvent: event, delta };\n if (isDeltaInDirection(delta, context.swipeDirection, context.swipeThreshold)) {\n handleAndDispatchCustomEvent(TOAST_SWIPE_END, onSwipeEnd, eventDetail, {\n discrete: true\n });\n } else {\n handleAndDispatchCustomEvent(\n TOAST_SWIPE_CANCEL,\n onSwipeCancel,\n eventDetail,\n {\n discrete: true\n }\n );\n }\n toast.addEventListener(\"click\", (event2) => event2.preventDefault(), {\n once: true\n });\n }\n })\n }\n )\n }\n ) }),\n context.viewport\n ) })\n ] });\n }\n);\nvar ToastAnnounce = (props) => {\n const { __scopeToast, children, ...announceProps } = props;\n const context = useToastProviderContext(TOAST_NAME, __scopeToast);\n const [renderAnnounceText, setRenderAnnounceText] = React.useState(false);\n const [isAnnounced, setIsAnnounced] = React.useState(false);\n useNextFrame(() => setRenderAnnounceText(true));\n React.useEffect(() => {\n const timer = window.setTimeout(() => setIsAnnounced(true), 1e3);\n return () => window.clearTimeout(timer);\n }, []);\n return isAnnounced ? null : /* @__PURE__ */ jsx(Portal, { asChild: true, children: /* @__PURE__ */ jsx(VisuallyHidden, { ...announceProps, children: renderAnnounceText && /* @__PURE__ */ jsxs(Fragment, { children: [\n context.label,\n \" \",\n children\n ] }) }) });\n};\nvar TITLE_NAME = \"ToastTitle\";\nvar ToastTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeToast, ...titleProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { ...titleProps, ref: forwardedRef });\n }\n);\nToastTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"ToastDescription\";\nvar ToastDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeToast, ...descriptionProps } = props;\n return /* @__PURE__ */ jsx(Primitive.div, { ...descriptionProps, ref: forwardedRef });\n }\n);\nToastDescription.displayName = DESCRIPTION_NAME;\nvar ACTION_NAME = \"ToastAction\";\nvar ToastAction = React.forwardRef(\n (props, forwardedRef) => {\n const { altText, ...actionProps } = props;\n if (!altText.trim()) {\n console.error(\n `Invalid prop \\`altText\\` supplied to \\`${ACTION_NAME}\\`. Expected non-empty \\`string\\`.`\n );\n return null;\n }\n return /* @__PURE__ */ jsx(ToastAnnounceExclude, { altText, asChild: true, children: /* @__PURE__ */ jsx(ToastClose, { ...actionProps, ref: forwardedRef }) });\n }\n);\nToastAction.displayName = ACTION_NAME;\nvar CLOSE_NAME = \"ToastClose\";\nvar ToastClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeToast, ...closeProps } = props;\n const interactiveContext = useToastInteractiveContext(CLOSE_NAME, __scopeToast);\n return /* @__PURE__ */ jsx(ToastAnnounceExclude, { asChild: true, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, interactiveContext.onClose)\n }\n ) });\n }\n);\nToastClose.displayName = CLOSE_NAME;\nvar ToastAnnounceExclude = React.forwardRef((props, forwardedRef) => {\n const { __scopeToast, altText, ...announceExcludeProps } = props;\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-toast-announce-exclude\": \"\",\n \"data-radix-toast-announce-alt\": altText || void 0,\n ...announceExcludeProps,\n ref: forwardedRef\n }\n );\n});\nfunction getAnnounceTextContent(container) {\n const textContent = [];\n const childNodes = Array.from(container.childNodes);\n childNodes.forEach((node) => {\n if (node.nodeType === node.TEXT_NODE && node.textContent) textContent.push(node.textContent);\n if (isHTMLElement(node)) {\n const isHidden = node.ariaHidden || node.hidden || node.style.display === \"none\";\n const isExcluded = node.dataset.radixToastAnnounceExclude === \"\";\n if (!isHidden) {\n if (isExcluded) {\n const altText = node.dataset.radixToastAnnounceAlt;\n if (altText) textContent.push(altText);\n } else {\n textContent.push(...getAnnounceTextContent(node));\n }\n }\n }\n });\n return textContent;\n}\nfunction handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {\n const currentTarget = detail.originalEvent.currentTarget;\n const event = new CustomEvent(name, { bubbles: true, cancelable: true, detail });\n if (handler) currentTarget.addEventListener(name, handler, { once: true });\n if (discrete) {\n dispatchDiscreteCustomEvent(currentTarget, event);\n } else {\n currentTarget.dispatchEvent(event);\n }\n}\nvar isDeltaInDirection = (delta, direction, threshold = 0) => {\n const deltaX = Math.abs(delta.x);\n const deltaY = Math.abs(delta.y);\n const isDeltaX = deltaX > deltaY;\n if (direction === \"left\" || direction === \"right\") {\n return isDeltaX && deltaX > threshold;\n } else {\n return !isDeltaX && deltaY > threshold;\n }\n};\nfunction useNextFrame(callback = () => {\n}) {\n const fn = useCallbackRef(callback);\n useLayoutEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n raf1 = window.requestAnimationFrame(() => raf2 = window.requestAnimationFrame(fn));\n return () => {\n window.cancelAnimationFrame(raf1);\n window.cancelAnimationFrame(raf2);\n };\n }, [fn]);\n}\nfunction isHTMLElement(node) {\n return node.nodeType === node.ELEMENT_NODE;\n}\nfunction getTabbableCandidates(container) {\n const nodes = [];\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node) => {\n const isHiddenInput = node.tagName === \"INPUT\" && node.type === \"hidden\";\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while (walker.nextNode()) nodes.push(walker.currentNode);\n return nodes;\n}\nfunction focusFirst(candidates) {\n const previouslyFocusedElement = document.activeElement;\n return candidates.some((candidate) => {\n if (candidate === previouslyFocusedElement) return true;\n candidate.focus();\n return document.activeElement !== previouslyFocusedElement;\n });\n}\nvar Provider = ToastProvider;\nvar Viewport = ToastViewport;\nvar Root2 = Toast;\nvar Title = ToastTitle;\nvar Description = ToastDescription;\nvar Action = ToastAction;\nvar Close = ToastClose;\nexport {\n Action,\n Close,\n Description,\n Provider,\n Root2 as Root,\n Title,\n Toast,\n ToastAction,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n Viewport,\n createToastScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from \"react\";\r\nimport * as ToastPrimitives from \"@radix-ui/react-toast\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { X } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst ToastProvider = ToastPrimitives.Provider;\r\n\r\nconst ToastViewport = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Viewport>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Viewport\r\n ref={ref}\r\n className={cn(\r\n \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nToastViewport.displayName = ToastPrimitives.Viewport.displayName;\r\n\r\nconst toastVariants = cva(\r\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"border-border bg-card text-card-foreground\",\r\n success: \"border-success bg-success text-white\",\r\n warning: \"border-warning bg-warning text-white\",\r\n error: \"border-destructive bg-destructive text-destructive-foreground\",\r\n info: \"border-info bg-info text-white\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n },\r\n }\r\n);\r\n\r\nconst Toast = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Root>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\r\n VariantProps<typeof toastVariants>\r\n>(({ className, variant, ...props }, ref) => {\r\n return (\r\n <ToastPrimitives.Root\r\n ref={ref}\r\n className={cn(toastVariants({ variant }), className)}\r\n {...props}\r\n />\r\n );\r\n});\r\nToast.displayName = ToastPrimitives.Root.displayName;\r\n\r\nconst ToastAction = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Action>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Action\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.success]:border-white/20 group-[.success]:hover:bg-white/20 group-[.warning]:border-white/20 group-[.warning]:hover:bg-white/20 group-[.error]:border-white/20 group-[.error]:hover:bg-white/20\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nToastAction.displayName = ToastPrimitives.Action.displayName;\r\n\r\nconst ToastClose = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Close>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Close\r\n ref={ref}\r\n className={cn(\r\n \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.success]:text-white/50 group-[.success]:hover:text-white group-[.warning]:text-white/50 group-[.warning]:hover:text-white group-[.error]:text-white/50 group-[.error]:hover:text-white\",\r\n className\r\n )}\r\n toast-close=\"\"\r\n {...props}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </ToastPrimitives.Close>\r\n));\r\nToastClose.displayName = ToastPrimitives.Close.displayName;\r\n\r\nconst ToastTitle = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Title>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Title\r\n ref={ref}\r\n className={cn(\"text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n));\r\nToastTitle.displayName = ToastPrimitives.Title.displayName;\r\n\r\nconst ToastDescription = React.forwardRef<\r\n React.ElementRef<typeof ToastPrimitives.Description>,\r\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\r\n>(({ className, ...props }, ref) => (\r\n <ToastPrimitives.Description\r\n ref={ref}\r\n className={cn(\"text-sm opacity-90\", className)}\r\n {...props}\r\n />\r\n));\r\nToastDescription.displayName = ToastPrimitives.Description.displayName;\r\n\r\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;\r\n\r\ntype ToastActionElement = React.ReactElement<typeof ToastAction>;\r\n\r\nexport {\r\n type ToastProps,\r\n type ToastActionElement,\r\n ToastProvider,\r\n ToastViewport,\r\n Toast,\r\n ToastTitle,\r\n ToastDescription,\r\n ToastClose,\r\n ToastAction,\r\n};\r\n","// ========================================\r\n// SkillCard Component\r\n// ========================================\r\n// Card component for displaying skills with enable/disable toggle\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Sparkles,\r\n MoreVertical,\r\n Info,\r\n Settings,\r\n Power,\r\n PowerOff,\r\n User,\r\n Trash2,\r\n} from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@/components/ui/Dropdown';\r\nimport type { Skill } from '@/lib/api';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface SkillCardProps {\r\n skill: Skill;\r\n onToggle?: (skill: Skill, enabled: boolean) => void;\r\n onClick?: (skill: Skill) => void;\r\n onConfigure?: (skill: Skill) => void;\r\n onDelete?: (skill: Skill) => void;\r\n className?: string;\r\n compact?: boolean;\r\n showActions?: boolean;\r\n isToggling?: boolean;\r\n}\r\n\r\n// ========== Source Badge ==========\r\n\r\n// Source color configuration (without labels for i18n)\r\nconst sourceColorConfig: Record<NonNullable<Skill['source']>, { color: string }> = {\r\n builtin: { color: 'default' },\r\n custom: { color: 'secondary' },\r\n community: { color: 'outline' },\r\n};\r\n\r\n// Source label keys for i18n\r\nconst sourceLabelKeys: Record<NonNullable<Skill['source']>, string> = {\r\n builtin: 'skills.source.builtin',\r\n custom: 'skills.source.custom',\r\n community: 'skills.source.community',\r\n};\r\n\r\nexport function SourceBadge({ source }: { source?: Skill['source'] }) {\r\n const { formatMessage } = useIntl();\r\n const config = sourceColorConfig[source ?? 'builtin'];\r\n const label = sourceLabelKeys[source ?? 'builtin']\r\n ? formatMessage({ id: sourceLabelKeys[source ?? 'builtin'] })\r\n : source ?? 'builtin';\r\n return (\r\n <Badge variant={config.color as 'default' | 'secondary' | 'destructive' | 'outline'}>\r\n {label}\r\n </Badge>\r\n );\r\n}\r\n\r\n// ========== Main SkillCard Component ==========\r\n\r\nexport function SkillCard({\r\n skill,\r\n onToggle,\r\n onClick,\r\n onConfigure,\r\n onDelete,\r\n className,\r\n compact = false,\r\n showActions = true,\r\n isToggling = false,\r\n}: SkillCardProps) {\r\n const { formatMessage } = useIntl();\r\n const [isMenuOpen, setIsMenuOpen] = useState(false);\r\n\r\n const handleClick = () => {\r\n if (!isMenuOpen) {\r\n onClick?.(skill);\r\n }\r\n };\r\n\r\n const handleToggle = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onToggle?.(skill, !skill.enabled);\r\n };\r\n\r\n const handleConfigure = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(false);\r\n onConfigure?.(skill);\r\n };\r\n\r\n const handleDelete = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(false);\r\n onDelete?.(skill);\r\n };\r\n\r\n if (compact) {\r\n return (\r\n <div\r\n onClick={handleClick}\r\n className={cn(\r\n 'p-3 bg-card border rounded-lg cursor-pointer',\r\n 'hover:shadow-md transition-all hover-glow',\r\n skill.enabled ? 'border-border hover:border-primary/50' : 'border-dashed border-muted-foreground/50 bg-muted/50 grayscale-[0.5]',\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <Sparkles className={cn('w-4 h-4 flex-shrink-0', skill.enabled ? 'text-primary' : 'text-muted-foreground')} />\r\n <span className=\"text-sm font-medium text-foreground truncate\">{skill.name}</span>\r\n </div>\r\n <Button\r\n variant={skill.enabled ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"h-7 px-2\"\r\n onClick={handleToggle}\r\n disabled={isToggling}\r\n >\r\n {skill.enabled ? (\r\n <>\r\n <Power className=\"w-3 h-3 mr-1\" />\r\n {formatMessage({ id: 'skills.state.on' })}\r\n </>\r\n ) : (\r\n <>\r\n <PowerOff className=\"w-3 h-3 mr-1\" />\r\n {formatMessage({ id: 'skills.state.off' })}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <Card\r\n onClick={handleClick}\r\n className={cn(\r\n 'p-4 cursor-pointer transition-all hover-glow',\r\n skill.enabled\r\n ? 'border-primary/20 bg-primary/[0.02] hover:border-primary/40 hover:shadow-md'\r\n : 'border-border/50 hover:border-border hover:shadow-sm',\r\n className\r\n )}\r\n >\r\n {/* Header - Icon, Title, Version on left; Source Badge, Enable Button, Actions Menu on right */}\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\r\n {/* Icon */}\r\n <div className={cn(\r\n 'p-2 rounded-lg flex-shrink-0',\r\n skill.enabled ? 'bg-primary/10' : 'bg-muted'\r\n )}>\r\n <Sparkles className={cn('w-5 h-5', skill.enabled ? 'text-primary' : 'text-muted-foreground')} />\r\n </div>\r\n\r\n {/* Title and Version */}\r\n <div className=\"min-w-0\">\r\n <h3 className=\"text-sm font-medium text-foreground truncate\">{skill.name}</h3>\r\n {skill.version && (\r\n <p className=\"text-xs text-muted-foreground\">v{skill.version}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right side: Source Badge, Enable Icon Button, Actions Menu */}\r\n <div className=\"flex items-center gap-2 flex-shrink-0\">\r\n <SourceBadge source={skill.source} />\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 hover:bg-primary/10\"\r\n onClick={handleToggle}\r\n disabled={isToggling}\r\n title={skill.enabled ? formatMessage({ id: 'skills.state.enabled' }) : formatMessage({ id: 'skills.state.disabled' })}\r\n >\r\n {skill.enabled ? (\r\n <Power className=\"w-4 h-4 text-primary\" />\r\n ) : (\r\n <PowerOff className=\"w-4 h-4 text-muted-foreground\" />\r\n )}\r\n </Button>\r\n {showActions && (\r\n <DropdownMenu open={isMenuOpen} onOpenChange={setIsMenuOpen}>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0 flex-shrink-0\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <MoreVertical className=\"w-4 h-4\" />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={() => onClick?.(skill)}>\r\n <Info className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.viewDetails' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem onClick={handleConfigure}>\r\n <Settings className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.configure' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem onClick={handleToggle}>\r\n {skill.enabled ? (\r\n <>\r\n <PowerOff className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.disable' })}\r\n </>\r\n ) : (\r\n <>\r\n <Power className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.enable' })}\r\n </>\r\n )}\r\n </DropdownMenuItem>\r\n {onDelete && skill.source !== 'builtin' && (\r\n <DropdownMenuItem onClick={handleDelete} className=\"text-destructive focus:text-destructive\">\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.delete' })}\r\n </DropdownMenuItem>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n <p className=\"text-sm text-muted-foreground mt-3 line-clamp-2\">\r\n {skill.description}\r\n </p>\r\n\r\n {/* Footer - Tags, Category, Author */}\r\n <div className=\"flex items-center gap-2 mt-4 pt-3 border-t border-border flex-wrap\">\r\n {/* Tags (first 2 triggers) */}\r\n {skill.triggers && skill.triggers.length > 0 && (\r\n <>\r\n {skill.triggers.slice(0, 2).map((trigger) => (\r\n <Badge key={trigger} variant=\"outline\" className=\"text-xs\">\r\n {trigger}\r\n </Badge>\r\n ))}\r\n {skill.triggers.length > 2 && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n +{skill.triggers.length - 2}\r\n </Badge>\r\n )}\r\n </>\r\n )}\r\n {skill.category && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {skill.category}\r\n </Badge>\r\n )}\r\n {skill.author && (\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <User className=\"w-3 h-3\" />\r\n {skill.author}\r\n </div>\r\n )}\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default SkillCard;\r\n","// ========================================\r\n// Skill File Tree Utilities\r\n// ========================================\r\n// Convert flat supportingFiles array to tree structure\r\n\r\nimport type { FileSystemNode } from '@/types/file-explorer';\r\n\r\n/**\r\n * Build a file tree from a flat array of file paths\r\n *\r\n * @param supportingFiles - Array of file paths (e.g., ['components/', 'components/Button.tsx'])\r\n * @returns Tree structure of files and directories\r\n */\r\nexport function buildSkillFileTree(supportingFiles: string[]): FileSystemNode[] {\r\n // Map to store all nodes by their path\r\n const nodeMap = new Map<string, FileSystemNode>();\r\n\r\n for (const entry of supportingFiles) {\r\n const isDirectoryMarker = entry.endsWith('/');\r\n const cleanPath = isDirectoryMarker ? entry.slice(0, -1) : entry;\r\n const parts = cleanPath.split('/');\r\n\r\n if (!cleanPath || parts.length === 0) continue;\r\n\r\n // Build the path hierarchy for this entry\r\n let currentPath = '';\r\n\r\n // Process all parts except the last one (these are intermediate directories)\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n const parentPath = currentPath;\r\n currentPath = currentPath ? `${currentPath}/${part}` : part;\r\n\r\n // Create directory node if it doesn't exist\r\n if (!nodeMap.has(currentPath)) {\r\n nodeMap.set(currentPath, {\r\n name: part,\r\n path: currentPath,\r\n type: 'directory',\r\n children: [],\r\n });\r\n }\r\n\r\n // Add to parent's children\r\n if (parentPath) {\r\n const parent = nodeMap.get(parentPath);\r\n if (parent && parent.type === 'directory') {\r\n const existingChild = parent.children!.find(c => c.path === currentPath);\r\n if (!existingChild) {\r\n parent.children!.push(nodeMap.get(currentPath)!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Process the final part (file or empty directory marker)\r\n const finalName = parts[parts.length - 1];\r\n const finalPath = cleanPath;\r\n\r\n // Create or update the final node\r\n const existingNode = nodeMap.get(finalPath);\r\n const finalNode: FileSystemNode = existingNode\r\n ? { ...existingNode, name: finalName } // Keep children if already exists\r\n : {\r\n name: finalName,\r\n path: finalPath,\r\n type: isDirectoryMarker ? 'directory' : 'file',\r\n children: isDirectoryMarker ? [] : undefined,\r\n };\r\n\r\n nodeMap.set(finalPath, finalNode);\r\n\r\n // Add final node to parent's children\r\n const parentPath = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\r\n if (parentPath) {\r\n const parent = nodeMap.get(parentPath);\r\n if (parent && parent.type === 'directory') {\r\n const existingChild = parent.children!.find(c => c.path === finalPath);\r\n if (!existingChild) {\r\n parent.children!.push(finalNode);\r\n } else {\r\n // Update existing child if this is a file (not just a directory marker)\r\n if (!isDirectoryMarker) {\r\n existingChild.type = 'file';\r\n existingChild.children = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Collect root-level nodes (nodes with single-segment paths)\r\n const result: FileSystemNode[] = [];\r\n for (const [path, node] of nodeMap.entries()) {\r\n if (!path.includes('/')) {\r\n result.push(node);\r\n }\r\n }\r\n\r\n // Sort: directories first, then files, alphabetically\r\n result.sort((a, b) => {\r\n if (a.type === 'directory' && b.type === 'file') return -1;\r\n if (a.type === 'file' && b.type === 'directory') return 1;\r\n return a.name.localeCompare(b.name);\r\n });\r\n\r\n // Sort children recursively\r\n const sortChildren = (node: FileSystemNode) => {\r\n if (node.type === 'directory' && node.children) {\r\n node.children.sort((a, b) => {\r\n if (a.type === 'directory' && b.type === 'file') return -1;\r\n if (a.type === 'file' && b.type === 'directory') return 1;\r\n return a.name.localeCompare(b.name);\r\n });\r\n node.children.forEach(sortChildren);\r\n }\r\n };\r\n\r\n result.forEach(sortChildren);\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Get default expanded paths for a file tree\r\n * Expands all directories by default for skill details\r\n *\r\n * @param nodes - File tree nodes\r\n * @returns Set of all directory paths\r\n */\r\nexport function getDefaultExpandedPaths(nodes: FileSystemNode[]): Set<string> {\r\n const expanded = new Set<string>();\r\n\r\n const collectDirectories = (node: FileSystemNode) => {\r\n if (node.type === 'directory') {\r\n expanded.add(node.path);\r\n node.children?.forEach(collectDirectories);\r\n }\r\n };\r\n\r\n nodes.forEach(collectDirectories);\r\n\r\n return expanded;\r\n}\r\n\r\n/**\r\n * Format file path for display\r\n */\r\nexport function formatFilePath(path: string): string {\r\n const parts = path.split('/');\r\n return parts[parts.length - 1];\r\n}\r\n\r\n/**\r\n * Get file extension\r\n */\r\nexport function getFileExtension(path: string): string {\r\n const parts = path.split('.');\r\n return parts.length > 1 ? parts.pop()! : '';\r\n}\r\n","// ========================================\n// SkillDetailPanel Component\n// ========================================\n// Right-side slide-out panel for viewing skill details\n\nimport { useEffect, useState, useMemo, useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n X,\n FileText,\n Edit,\n Trash2,\n Folder,\n Lock,\n Tag,\n MapPin,\n Code,\n ChevronRight,\n ChevronDown,\n Eye,\n Loader2,\n Maximize2,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Badge } from '@/components/ui/Badge';\nimport { Card } from '@/components/ui/Card';\nimport type { Skill } from '@/lib/api';\nimport { buildSkillFileTree, getDefaultExpandedPaths } from '@/utils/skill-files';\nimport type { FileSystemNode } from '@/types/file-explorer';\nimport { readSkillFile } from '@/lib/api';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\n\nexport interface SkillDetailPanelProps {\n skill: Skill | null;\n isOpen: boolean;\n onClose: () => void;\n onEdit?: (skill: Skill) => void;\n onDelete?: (skill: Skill) => void;\n onEditFile?: (skillName: string, fileName: string, location: 'project' | 'user') => void;\n isLoading?: boolean;\n}\n\nexport function SkillDetailPanel({\n skill,\n isOpen,\n onClose,\n onEdit,\n onDelete,\n onEditFile,\n isLoading = false,\n}: SkillDetailPanelProps) {\n const { formatMessage } = useIntl();\n const projectPath = useWorkflowStore(selectProjectPath);\n const [cliMode] = useState<'claude' | 'codex'>('claude');\n\n // Tree view state\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set());\n const [selectedFile, setSelectedFile] = useState<string | null>(null);\n const [previewContent, setPreviewContent] = useState<string | null>(null);\n const [isPreviewLoading, setIsPreviewLoading] = useState(false);\n const [showPreviewPanel, setShowPreviewPanel] = useState(false);\n\n // Prevent body scroll when panel is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n // Build file tree from supportingFiles\n const fileTree = useMemo(() => {\n if (!skill?.supportingFiles) return [];\n return buildSkillFileTree(skill.supportingFiles);\n }, [skill?.supportingFiles]);\n\n // Initialize expanded paths when skill changes\n useEffect(() => {\n if (fileTree.length > 0) {\n setExpandedPaths(getDefaultExpandedPaths(fileTree));\n }\n }, [fileTree]);\n\n // Load file content for preview\n const loadFilePreview = useCallback(async (filePath: string) => {\n if (!skill) return;\n\n setIsPreviewLoading(true);\n setShowPreviewPanel(true);\n setSelectedFile(filePath);\n setPreviewContent(null);\n\n try {\n const data = await readSkillFile({\n skillName: skill.folderName || skill.name,\n fileName: filePath,\n location: skill.location || 'project',\n projectPath: projectPath,\n cliType: cliMode,\n });\n setPreviewContent(data.content);\n } catch (error) {\n console.error('Failed to load file preview:', error);\n setPreviewContent(`Error loading preview: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n setIsPreviewLoading(false);\n }\n }, [skill, projectPath, cliMode]);\n\n const handleClosePreview = () => {\n setShowPreviewPanel(false);\n };\n\n // Close preview on panel close\n useEffect(() => {\n if (!isOpen) {\n handleClosePreview();\n }\n }, [isOpen]);\n\n if (!isOpen || !skill) {\n return null;\n }\n\n const hasAllowedTools = skill.allowedTools && skill.allowedTools.length > 0;\n const hasSupportingFiles = skill.supportingFiles && skill.supportingFiles.length > 0;\n const folderName = skill.folderName || skill.name;\n\n const handleEditFile = (fileName: string) => {\n onEditFile?.(folderName, fileName, skill.location || 'project');\n };\n\n // Toggle directory expanded state\n const togglePath = (path: string) => {\n setExpandedPaths(prev => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n };\n\n return (\n <>\n {/* Overlay */}\n <div\n className=\"fixed inset-0 bg-black/50 z-50 transition-opacity\"\n onClick={onClose}\n />\n\n {/* Panel */}\n <div className=\"fixed top-0 right-0 w-full sm:w-[480px] md:w-[560px] lg:w-[640px] h-full bg-background border-l border-border shadow-xl z-50 flex flex-col transition-transform\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className={cn(\n 'p-2 rounded-lg flex-shrink-0',\n skill.enabled ? 'bg-primary/10' : 'bg-muted'\n )}>\n <Tag className={cn('w-5 h-5', skill.enabled ? 'text-primary' : 'text-muted-foreground')} />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"text-lg font-semibold text-foreground truncate\">{skill.name}</h3>\n {skill.version && (\n <p className=\"text-sm text-muted-foreground\">v{skill.version}</p>\n )}\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-48\">\n <div className=\"animate-spin text-muted-foreground\">\n <Tag className=\"w-8 h-8\" />\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Description */}\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\n <FileText className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.card.description' })}\n </h4>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {skill.description || formatMessage({ id: 'skills.noDescription' })}\n </p>\n </section>\n\n {/* Metadata */}\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\n <MapPin className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.metadata' })}\n </h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <Card className=\"p-3 bg-muted/50\">\n <span className=\"text-xs text-muted-foreground block mb-1\">\n {formatMessage({ id: 'skills.location' })}\n </span>\n <p className=\"text-sm font-medium text-foreground\">\n {skill.location === 'project' ? formatMessage({ id: 'skills.projectSkills' }) : formatMessage({ id: 'skills.userSkills' })}\n </p>\n </Card>\n {skill.version && (\n <Card className=\"p-3 bg-muted/50\">\n <span className=\"text-xs text-muted-foreground block mb-1\">\n {formatMessage({ id: 'skills.card.version' })}\n </span>\n <p className=\"text-sm font-medium text-foreground\">v{skill.version}</p>\n </Card>\n )}\n {skill.author && (\n <Card className=\"p-3 bg-muted/50\">\n <span className=\"text-xs text-muted-foreground block mb-1\">\n {formatMessage({ id: 'skills.card.author' })}\n </span>\n <p className=\"text-sm font-medium text-foreground\">{skill.author}</p>\n </Card>\n )}\n {skill.source && (\n <Card className=\"p-3 bg-muted/50\">\n <span className=\"text-xs text-muted-foreground block mb-1\">\n {formatMessage({ id: 'skills.card.source' })}\n </span>\n <p className=\"text-sm font-medium text-foreground\">\n {formatMessage({ id: `skills.source.${skill.source}` })}\n </p>\n </Card>\n )}\n </div>\n </section>\n\n {/* Triggers */}\n {skill.triggers && skill.triggers.length > 0 && (\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\n <Tag className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.card.triggers' })}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {skill.triggers.map((trigger) => (\n <Badge key={trigger} variant=\"secondary\" className=\"text-sm\">\n {trigger}\n </Badge>\n ))}\n </div>\n </section>\n )}\n\n {/* Allowed Tools */}\n {hasAllowedTools && (\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\n <Lock className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.allowedTools' })}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {skill.allowedTools!.map((tool) => (\n <Badge key={tool} variant=\"outline\" className=\"text-xs font-mono\">\n {tool}\n </Badge>\n ))}\n </div>\n </section>\n )}\n\n {/* Files */}\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\n <Folder className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.files' })}\n </h4>\n <div className=\"space-y-3\">\n {/* SKILL.md (main file) */}\n <div className=\"flex items-center justify-between p-3 bg-primary/5 border border-primary/20 rounded-lg hover:bg-primary/10 transition-colors\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"w-4 h-4 text-primary\" />\n <span className=\"text-sm font-mono text-foreground font-medium\">SKILL.md</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-primary hover:bg-primary/20\"\n onClick={() => loadFilePreview('SKILL.md')}\n >\n <Eye className=\"w-3.5 h-3.5\" />\n </Button>\n {onEditFile && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-primary hover:bg-primary/20\"\n onClick={() => handleEditFile('SKILL.md')}\n >\n <Edit className=\"w-3.5 h-3.5\" />\n </Button>\n )}\n </div>\n </div>\n\n {/* Supporting Files Tree */}\n {hasSupportingFiles && fileTree.length > 0 && (\n <div className=\"border border-border rounded-lg p-2 bg-muted/30\">\n <SkillFileTree\n nodes={fileTree}\n expandedPaths={expandedPaths}\n onTogglePath={togglePath}\n onEditFile={handleEditFile}\n onPreviewFile={loadFilePreview}\n depth={0}\n />\n </div>\n )}\n\n {/* Empty state */}\n {hasSupportingFiles && fileTree.length === 0 && (\n <div className=\"text-sm text-muted-foreground p-3\">\n {formatMessage({ id: 'skills.files.empty' })}\n </div>\n )}\n </div>\n </section>\n\n {/* File Preview Modal */}\n <FilePreviewModal\n fileName={selectedFile}\n content={previewContent}\n isLoading={isPreviewLoading}\n isOpen={showPreviewPanel}\n onClose={handleClosePreview}\n />\n\n {/* Path */}\n {skill.path && (\n <section>\n <h4 className=\"text-sm font-semibold text-foreground mb-2 flex items-center gap-2\">\n <Code className=\"w-4 h-4 text-muted-foreground\" />\n {formatMessage({ id: 'skills.path' })}\n </h4>\n <Card className=\"p-3 bg-muted\">\n <code className=\"text-xs font-mono text-muted-foreground break-all\">\n {skill.path}\n </code>\n </Card>\n </section>\n )}\n </div>\n )}\n </div>\n\n {/* Footer Actions */}\n <div className=\"px-6 py-4 border-t border-border flex justify-between\">\n {onDelete && (\n <Button\n variant=\"destructive\"\n onClick={() => onDelete(skill)}\n className=\"flex items-center gap-2\"\n >\n <Trash2 className=\"w-4 h-4\" />\n {formatMessage({ id: 'common.actions.delete' })}\n </Button>\n )}\n <div className=\"flex gap-2 ml-auto\">\n {onEdit && (\n <Button\n variant=\"outline\"\n onClick={() => onEdit(skill)}\n className=\"flex items-center gap-2\"\n >\n <Edit className=\"w-4 h-4\" />\n {formatMessage({ id: 'common.actions.edit' })}\n </Button>\n )}\n <Button onClick={onClose}>\n {formatMessage({ id: 'common.actions.close' })}\n </Button>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// ========================================\n// SkillFileTree Component\n// ========================================\n// Recursive tree view for skill files\n\ninterface SkillFileTreeNodeProps {\n node: FileSystemNode;\n depth: number;\n expandedPaths: Set<string>;\n onTogglePath: (path: string) => void;\n onEditFile: (fileName: string) => void;\n onPreviewFile: (fileName: string) => void;\n}\n\nfunction SkillFileTreeNode({\n node,\n depth,\n expandedPaths,\n onTogglePath,\n onEditFile,\n onPreviewFile,\n}: SkillFileTreeNodeProps) {\n const isDirectory = node.type === 'directory';\n const isExpanded = expandedPaths.has(node.path);\n const hasChildren = node.children && node.children.length > 0;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isDirectory) {\n onTogglePath(node.path);\n } else {\n // Preview file on click\n onPreviewFile(node.path);\n }\n };\n\n return (\n <div className=\"select-none group\">\n <div\n className={cn(\n 'flex items-center gap-2 px-2 py-1.5 rounded-sm hover:bg-muted transition-colors cursor-pointer',\n isDirectory && 'font-medium'\n )}\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={handleClick}\n >\n {/* Chevron for directories */}\n {isDirectory && (\n <span className=\"w-4 h-4 flex items-center justify-center text-muted-foreground\">\n {hasChildren && (\n isExpanded ? (\n <ChevronDown className=\"w-3.5 h-3.5\" />\n ) : (\n <ChevronRight className=\"w-3.5 h-3.5\" />\n )\n )}\n </span>\n )}\n\n {/* Icon */}\n {isDirectory ? (\n <Folder className={cn(\n 'w-4 h-4 flex-shrink-0',\n isExpanded ? 'text-blue-500' : 'text-blue-400'\n )} />\n ) : (\n <FileText className=\"w-4 h-4 flex-shrink-0 text-muted-foreground\" />\n )}\n\n {/* Name */}\n <span className=\"text-sm font-mono flex-1 truncate\">{node.name}</span>\n\n {/* Preview button for files */}\n {!isDirectory && (\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0 hover:bg-primary/20 hover:text-primary\"\n onClick={(e) => {\n e.stopPropagation();\n onPreviewFile(node.path);\n }}\n title=\"Preview file\"\n >\n <Eye className=\"w-3.5 h-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0 hover:bg-primary/20 hover:text-primary\"\n onClick={(e) => {\n e.stopPropagation();\n onEditFile(node.path);\n }}\n title=\"Edit file\"\n >\n <Edit className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n )}\n </div>\n\n {/* Children */}\n {isDirectory && isExpanded && hasChildren && (\n <div className=\"border-l border-border ml-4\">\n {node.children!.map((child) => (\n <SkillFileTreeNode\n key={child.path}\n node={child}\n depth={depth + 1}\n expandedPaths={expandedPaths}\n onTogglePath={onTogglePath}\n onEditFile={onEditFile}\n onPreviewFile={onPreviewFile}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface SkillFileTreeProps {\n nodes: FileSystemNode[];\n expandedPaths: Set<string>;\n onTogglePath: (path: string) => void;\n onEditFile: (fileName: string) => void;\n onPreviewFile: (fileName: string) => void;\n depth: number;\n}\n\nfunction SkillFileTree({\n nodes,\n expandedPaths,\n onTogglePath,\n onEditFile,\n onPreviewFile,\n depth,\n}: SkillFileTreeProps) {\n return (\n <div className=\"space-y-0.5\" role=\"tree\">\n {nodes.map((node) => (\n <SkillFileTreeNode\n key={node.path}\n node={node}\n depth={depth}\n expandedPaths={expandedPaths}\n onTogglePath={onTogglePath}\n onEditFile={onEditFile}\n onPreviewFile={onPreviewFile}\n />\n ))}\n </div>\n );\n}\n\n// ========================================\n// File Preview Modal Component\n// ========================================\n\ninterface FilePreviewModalProps {\n fileName: string | null;\n content: string | null;\n isLoading: boolean;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction FilePreviewModal({ fileName, content, isLoading, isOpen, onClose }: FilePreviewModalProps) {\n const { formatMessage } = useIntl();\n\n if (!isOpen) return null;\n\n return (\n <>\n {/* Overlay */}\n <div\n className=\"fixed inset-0 bg-black/50 z-50 transition-opacity\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-background rounded-lg shadow-2xl w-full max-w-3xl max-h-[80vh] flex flex-col animate-in fade-in zoom-in duration-200\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"w-4 h-4 text-primary\" />\n <span className=\"text-sm font-mono font-medium\">{fileName}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n // Full screen toggle could be implemented here\n }}\n className=\"h-8 w-8 p-0\"\n >\n <Maximize2 className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose} className=\"h-8 w-8 p-0\">\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4 min-h-[300px]\">\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <Loader2 className=\"w-8 h-8 animate-spin text-muted-foreground\" />\n </div>\n ) : content ? (\n <Card className=\"p-4 bg-muted/30\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-words text-foreground\">\n {content}\n </pre>\n </Card>\n ) : (\n <div className=\"text-sm text-muted-foreground py-8 text-center\">\n {formatMessage({ id: 'skills.files.preview.empty' })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-border flex justify-end\">\n <Button onClick={onClose}>\n {formatMessage({ id: 'common.actions.close' })}\n </Button>\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport default SkillDetailPanel;\n","// ========================================\r\n// Skill Create Dialog Component\r\n// ========================================\r\n// Modal dialog for creating/importing skills with two modes:\r\n// - Import: import existing skill folder\r\n// - CLI Generate: AI-generated skill from description\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Folder,\r\n User,\r\n FolderInput,\r\n Sparkles,\r\n CheckCircle,\r\n XCircle,\r\n Loader2,\r\n Info,\r\n FolderOpen,\r\n} from 'lucide-react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n} from '@/components/ui/Dialog';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Textarea } from '@/components/ui/Textarea';\r\nimport { Label } from '@/components/ui/Label';\r\nimport { validateSkillImport, createSkill } from '@/lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { FloatingFileBrowser } from '@/components/terminal-dashboard/FloatingFileBrowser';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface SkillCreateDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onCreated: () => void;\r\n cliType?: 'claude' | 'codex';\r\n}\r\n\r\ntype CreateMode = 'import' | 'cli-generate';\r\ntype SkillLocation = 'project' | 'user';\r\n\r\ninterface ValidationResult {\r\n valid: boolean;\r\n errors?: string[];\r\n skillInfo?: { name: string; description: string; version?: string; supportingFiles?: string[] };\r\n}\r\n\r\nexport function SkillCreateDialog({ open, onOpenChange, onCreated, cliType = 'claude' }: SkillCreateDialogProps) {\r\n const { formatMessage } = useIntl();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const [mode, setMode] = useState<CreateMode>('import');\r\n const [location, setLocation] = useState<SkillLocation>('project');\r\n\r\n // Import mode state\r\n const [sourcePath, setSourcePath] = useState('');\r\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);\r\n const [isValidating, setIsValidating] = useState(false);\r\n\r\n // CLI Generate mode state\r\n const [skillName, setSkillName] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n const [isCreating, setIsCreating] = useState(false);\r\n\r\n // File browser state\r\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\r\n\r\n const resetState = useCallback(() => {\r\n setMode('import');\r\n setLocation('project');\r\n setSourcePath('');\r\n setValidationResult(null);\r\n setIsValidating(false);\r\n setSkillName('');\r\n setDescription('');\r\n setIsCreating(false);\r\n setIsFileBrowserOpen(false);\r\n }, []);\r\n\r\n const handleOpenChange = useCallback((open: boolean) => {\r\n if (!open) {\r\n resetState();\r\n }\r\n onOpenChange(open);\r\n }, [onOpenChange, resetState]);\r\n\r\n const handleValidate = useCallback(async () => {\r\n if (!sourcePath.trim()) return;\r\n\r\n setIsValidating(true);\r\n setValidationResult(null);\r\n\r\n try {\r\n const result = await validateSkillImport(sourcePath.trim());\r\n setValidationResult(result);\r\n } catch (err) {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : String(err)],\r\n });\r\n } finally {\r\n setIsValidating(false);\r\n }\r\n }, [sourcePath]);\r\n\r\n const handleCreate = useCallback(async () => {\r\n if (mode === 'import') {\r\n if (!sourcePath.trim()) return;\r\n if (!validationResult?.valid) return;\r\n } else {\r\n if (!skillName.trim()) return;\r\n if (!description.trim()) return;\r\n }\r\n\r\n setIsCreating(true);\r\n\r\n try {\r\n await createSkill({\r\n mode,\r\n location,\r\n sourcePath: mode === 'import' ? sourcePath.trim() : undefined,\r\n skillName: mode === 'cli-generate' ? skillName.trim() : undefined,\r\n description: mode === 'cli-generate' ? description.trim() : undefined,\r\n generationType: mode === 'cli-generate' ? 'description' : undefined,\r\n projectPath,\r\n cliType,\r\n });\r\n\r\n handleOpenChange(false);\r\n onCreated();\r\n } catch (err) {\r\n console.error('Failed to create skill:', err);\r\n if (mode === 'import') {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : formatMessage({ id: 'skills.create.createError' })],\r\n });\r\n }\r\n } finally {\r\n setIsCreating(false);\r\n }\r\n }, [mode, location, sourcePath, skillName, description, validationResult, projectPath, handleOpenChange, onCreated, formatMessage]);\r\n\r\n const canCreate = mode === 'import'\r\n ? sourcePath.trim() && validationResult?.valid && !isCreating\r\n : skillName.trim() && description.trim() && !isCreating;\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={handleOpenChange}>\r\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\r\n <DialogHeader>\r\n <DialogTitle>{formatMessage({ id: 'skills.create.title' })}</DialogTitle>\r\n <DialogDescription>\r\n {formatMessage({ id: 'skills.description' })}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-5 py-2\">\r\n {/* Location Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'skills.create.location' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'project'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('project')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Folder className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'skills.create.locationProject' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`.${cliType}/skills/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'user'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('user')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <User className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'skills.create.locationUser' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`~/.${cliType}/skills/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Mode Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'skills.create.mode' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'import'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('import')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <FolderInput className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'skills.create.modeImport' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'skills.create.modeImportHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'cli-generate'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('cli-generate')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Sparkles className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'skills.create.modeGenerate' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'skills.create.modeGenerateHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Import Mode Content */}\r\n {mode === 'import' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"sourcePath\">{formatMessage({ id: 'skills.create.sourcePath' })}</Label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n id=\"sourcePath\"\r\n value={sourcePath}\r\n onChange={(e) => {\r\n setSourcePath(e.target.value);\r\n setValidationResult(null);\r\n }}\r\n placeholder={formatMessage({ id: 'skills.create.sourcePathPlaceholder' })}\r\n className=\"font-mono text-sm flex-1\"\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => setIsFileBrowserOpen(true)}\r\n title={formatMessage({ id: 'skills.create.browseFolder' })}\r\n >\r\n <FolderOpen className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'skills.create.sourcePathHint' })}</p>\r\n </div>\r\n\r\n {/* Validation Result */}\r\n {isValidating && (\r\n <div className=\"flex items-center gap-2 p-3 bg-muted/50 rounded-lg\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'skills.create.validating' })}</span>\r\n </div>\r\n )}\r\n {validationResult && !isValidating && (\r\n validationResult.valid ? (\r\n <div className=\"p-4 bg-green-500/10 border border-green-500/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-green-600 mb-2\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'skills.create.validSkill' })}</span>\r\n </div>\r\n {validationResult.skillInfo && (\r\n <div className=\"space-y-1 text-sm\">\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'skills.card.description' })}: </span>\r\n <span>{validationResult.skillInfo.name}</span>\r\n </div>\r\n {validationResult.skillInfo.description && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'skills.card.description' })}: </span>\r\n <span>{validationResult.skillInfo.description}</span>\r\n </div>\r\n )}\r\n {validationResult.skillInfo.version && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'skills.card.version' })}: </span>\r\n <span>{validationResult.skillInfo.version}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"p-4 bg-destructive/10 border border-destructive/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-destructive mb-2\">\r\n <XCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'skills.create.invalidSkill' })}</span>\r\n </div>\r\n {validationResult.errors && (\r\n <ul className=\"space-y-1 text-sm\">\r\n {validationResult.errors.map((error, i) => (\r\n <li key={i} className=\"text-destructive\">{error}</li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* CLI Generate Mode Content */}\r\n {mode === 'cli-generate' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"skillName\">\r\n {formatMessage({ id: 'skills.create.skillName' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Input\r\n id=\"skillName\"\r\n value={skillName}\r\n onChange={(e) => setSkillName(e.target.value)}\r\n placeholder={formatMessage({ id: 'skills.create.skillNamePlaceholder' })}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'skills.create.skillNameHint' })}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"description\">\r\n {formatMessage({ id: 'skills.create.descriptionLabel' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Textarea\r\n id=\"description\"\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={formatMessage({ id: 'skills.create.descriptionPlaceholder' })}\r\n rows={6}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'skills.create.descriptionHint' })}</p>\r\n </div>\r\n\r\n <div className=\"p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg\">\r\n <div className=\"flex items-start gap-2\">\r\n <Info className=\"w-4 h-4 text-blue-600 mt-0.5\" />\r\n <div className=\"text-sm text-blue-600\">\r\n <p className=\"font-medium\">{formatMessage({ id: 'skills.create.generateInfo' })}</p>\r\n <p className=\"text-xs mt-1\">{formatMessage({ id: 'skills.create.generateTimeHint' })}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <DialogFooter className=\"gap-2\">\r\n <Button variant=\"outline\" onClick={() => handleOpenChange(false)} disabled={isCreating}>\r\n {formatMessage({ id: 'skills.actions.cancel' })}\r\n </Button>\r\n {mode === 'import' && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleValidate}\r\n disabled={!sourcePath.trim() || isValidating || isCreating}\r\n >\r\n {isValidating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {formatMessage({ id: 'skills.create.validate' })}\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleCreate}\r\n disabled={!canCreate}\r\n >\r\n {isCreating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {isCreating\r\n ? formatMessage({ id: 'skills.create.creating' })\r\n : mode === 'import'\r\n ? formatMessage({ id: 'skills.create.import' })\r\n : formatMessage({ id: 'skills.create.generate' })\r\n }\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n\r\n {/* File Browser for selecting source folder */}\r\n <FloatingFileBrowser\r\n isOpen={isFileBrowserOpen}\r\n onClose={() => setIsFileBrowserOpen(false)}\r\n rootPath={projectPath}\r\n onInsertPath={(path) => {\r\n setSourcePath(path);\r\n setValidationResult(null);\r\n setIsFileBrowserOpen(false);\r\n }}\r\n initialSelectedPath={sourcePath || null}\r\n />\r\n </Dialog>\r\n );\r\n}\r\n\r\nexport default SkillCreateDialog;\r\n","// ========================================\r\n// SkillHubCard Component\r\n// ========================================\r\n// Card component for displaying skills from hub with install/uninstall actions\r\n\r\nimport { useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Download,\r\n RefreshCw,\r\n Check,\r\n Globe,\r\n Folder,\r\n Tag,\r\n User,\r\n Clock,\r\n MoreVertical,\r\n Info,\r\n Trash2,\r\n} from 'lucide-react';\r\nimport { toast } from 'sonner';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@/components/ui/Dropdown';\r\nimport { CliModeToggle, type CliMode } from '@/components/mcp/CliModeToggle';\r\nimport type { RemoteSkill, LocalSkill, InstalledSkill, CliType, SkillSource } from '@/hooks/useSkillHub';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface SkillHubCardProps {\r\n skill: RemoteSkill | LocalSkill;\r\n installedInfo?: InstalledSkill;\r\n source: SkillSource;\r\n onInstall?: (skill: RemoteSkill | LocalSkill, cliType: CliType) => Promise<void>;\r\n onUninstall?: (skill: RemoteSkill | LocalSkill, cliType: CliType) => Promise<void>;\r\n onViewDetails?: (skill: RemoteSkill | LocalSkill) => void;\r\n isInstalling?: boolean;\r\n className?: string;\r\n compact?: boolean;\r\n}\r\n\r\n// ========== Source Badge ==========\r\n\r\nfunction SkillSourceBadge({ source }: { source: SkillSource }) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (source === 'remote') {\r\n return (\r\n <Badge variant=\"default\" className=\"gap-1\">\r\n <Globe className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'skillHub.source.remote' })}\r\n </Badge>\r\n );\r\n }\r\n\r\n return (\r\n <Badge variant=\"secondary\" className=\"gap-1\">\r\n <Folder className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'skillHub.source.local' })}\r\n </Badge>\r\n );\r\n}\r\n\r\n// ========== Install Status Badge ==========\r\n\r\nfunction InstallStatusBadge({ installedInfo }: { installedInfo?: InstalledSkill }) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (!installedInfo) {\r\n return null;\r\n }\r\n\r\n if (installedInfo.updatesAvailable) {\r\n return (\r\n <Badge variant=\"outline\" className=\"gap-1 text-amber-500 border-amber-500\">\r\n <RefreshCw className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'skillHub.status.updateAvailable' })}\r\n </Badge>\r\n );\r\n }\r\n\r\n return (\r\n <Badge variant=\"outline\" className=\"gap-1 text-success border-success\">\r\n <Check className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'skillHub.status.installed' })}\r\n </Badge>\r\n );\r\n}\r\n\r\n// ========== Main SkillHubCard Component ==========\r\n\r\nexport function SkillHubCard({\r\n skill,\r\n installedInfo,\r\n source,\r\n onInstall,\r\n onUninstall,\r\n onViewDetails,\r\n isInstalling = false,\r\n className,\r\n compact = false,\r\n}: SkillHubCardProps) {\r\n const { formatMessage } = useIntl();\r\n const [cliMode, setCliMode] = useState<CliMode>('claude');\r\n const [isMenuOpen, setIsMenuOpen] = useState(false);\r\n const [localInstalling, setLocalInstalling] = useState(false);\r\n\r\n const isRemote = source === 'remote';\r\n const isInstalled = !!installedInfo;\r\n const isLoading = isInstalling || localInstalling;\r\n\r\n const handleInstall = async (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setLocalInstalling(true);\r\n try {\r\n await onInstall?.(skill, cliMode);\r\n toast.success(formatMessage({ id: 'skillHub.install.success' }, { name: skill.name }));\r\n } catch (error) {\r\n toast.error(formatMessage({ id: 'skillHub.install.error' }, { error: String(error) }));\r\n } finally {\r\n setLocalInstalling(false);\r\n }\r\n };\r\n\r\n const handleUninstall = async (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(false);\r\n try {\r\n await onUninstall?.(skill, installedInfo?.installedTo || cliMode);\r\n toast.success(formatMessage({ id: 'skillHub.uninstall.success' }, { name: skill.name }));\r\n } catch (error) {\r\n toast.error(formatMessage({ id: 'skillHub.uninstall.error' }, { error: String(error) }));\r\n }\r\n };\r\n\r\n const handleViewDetails = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(false);\r\n onViewDetails?.(skill);\r\n };\r\n\r\n // Compact view\r\n if (compact) {\r\n return (\r\n <div\r\n className={cn(\r\n 'p-3 bg-card border rounded-lg',\r\n 'hover:shadow-md transition-all',\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <Download className=\"w-4 h-4 flex-shrink-0 text-primary\" />\r\n <span className=\"text-sm font-medium text-foreground truncate\">{skill.name}</span>\r\n {skill.version && (\r\n <span className=\"text-xs text-muted-foreground\">v{skill.version}</span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <CliModeToggle currentMode={cliMode} onModeChange={setCliMode} />\r\n <Button\r\n variant={isInstalled ? 'outline' : 'default'}\r\n size=\"sm\"\r\n className=\"h-7 px-2\"\r\n onClick={handleInstall}\r\n disabled={isLoading}\r\n >\r\n {isLoading ? (\r\n <RefreshCw className=\"w-3 h-3 animate-spin\" />\r\n ) : isInstalled ? (\r\n <>\r\n <RefreshCw className=\"w-3 h-3 mr-1\" />\r\n {formatMessage({ id: 'skillHub.actions.update' })}\r\n </>\r\n ) : (\r\n <>\r\n <Download className=\"w-3 h-3 mr-1\" />\r\n {formatMessage({ id: 'skillHub.actions.install' })}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Full card view\r\n return (\r\n <Card\r\n className={cn(\r\n 'p-4 hover:shadow-md transition-all hover-glow hover:border-primary/50',\r\n className\r\n )}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex items-start gap-3 min-w-0\">\r\n <div className=\"p-2 rounded-lg flex-shrink-0 bg-primary/10\">\r\n <Download className=\"w-5 h-5 text-primary\" />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-sm font-medium text-foreground\">{skill.name}</h3>\r\n {skill.version && (\r\n <span className=\"text-xs text-muted-foreground\">v{skill.version}</span>\r\n )}\r\n </div>\r\n {skill.author && (\r\n <div className=\"flex items-center gap-1 mt-0.5 text-xs text-muted-foreground\">\r\n <User className=\"w-3 h-3\" />\r\n {skill.author}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <DropdownMenu open={isMenuOpen} onOpenChange={setIsMenuOpen}>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <MoreVertical className=\"w-4 h-4\" />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={handleViewDetails}>\r\n <Info className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skillHub.actions.viewDetails' })}\r\n </DropdownMenuItem>\r\n {isInstalled && (\r\n <DropdownMenuItem onClick={handleUninstall} className=\"text-destructive\">\r\n <Trash2 className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skillHub.actions.uninstall' })}\r\n </DropdownMenuItem>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n\r\n {/* Description */}\r\n <p className=\"text-sm text-muted-foreground mt-3 line-clamp-2\">\r\n {skill.description}\r\n </p>\r\n\r\n {/* Tags */}\r\n {skill.tags && skill.tags.length > 0 && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mb-1\">\r\n <Tag className=\"w-3 h-3\" />\r\n {formatMessage({ id: 'skillHub.card.tags' })}\r\n </div>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {skill.tags.slice(0, 4).map((tag) => (\r\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\r\n {tag}\r\n </Badge>\r\n ))}\r\n {skill.tags.length > 4 && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n +{skill.tags.length - 4}\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Updated date (for remote skills) */}\r\n {isRemote && (skill as RemoteSkill).updatedAt && (\r\n <div className=\"flex items-center gap-1 mt-2 text-xs text-muted-foreground\">\r\n <Clock className=\"w-3 h-3\" />\r\n {formatMessage(\r\n { id: 'skillHub.card.updated' },\r\n { date: new Date((skill as RemoteSkill).updatedAt as string).toLocaleDateString() }\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Footer */}\r\n <div className=\"flex items-center justify-between mt-4 pt-3 border-t border-border\">\r\n <div className=\"flex items-center gap-2\">\r\n <SkillSourceBadge source={source} />\r\n {skill.category && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {skill.category}\r\n </Badge>\r\n )}\r\n <InstallStatusBadge installedInfo={installedInfo} />\r\n </div>\r\n </div>\r\n\r\n {/* Install section */}\r\n <div className=\"flex items-center justify-between gap-2 mt-3\">\r\n <CliModeToggle currentMode={cliMode} onModeChange={setCliMode} />\r\n <Button\r\n variant={isInstalled ? 'outline' : 'default'}\r\n size=\"sm\"\r\n onClick={handleInstall}\r\n disabled={isLoading}\r\n >\r\n {isLoading ? (\r\n <>\r\n <RefreshCw className=\"w-4 h-4 mr-1 animate-spin\" />\r\n {formatMessage({ id: 'skillHub.actions.installing' })}\r\n </>\r\n ) : isInstalled ? (\r\n <>\r\n <RefreshCw className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'skillHub.actions.update' })}\r\n </>\r\n ) : (\r\n <>\r\n <Download className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'skillHub.actions.install' })}\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n </Card>\r\n );\r\n}\r\n\r\nexport default SkillHubCard;\r\n","// ========================================\r\n// useRealtimeUpdates Hook\r\n// ========================================\r\n// WebSocket hook for real-time ticker messages with typed handling and reconnection\r\n\r\nimport { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { z } from 'zod';\r\n\r\n// --- Types ---\r\n\r\nexport const TickerMessageSchema = z.object({\r\n id: z.string(),\r\n text: z.string(),\r\n type: z.enum(['session', 'task', 'workflow', 'status']),\r\n link: z.string().optional(),\r\n timestamp: z.number(),\r\n});\r\n\r\nexport type TickerMessage = z.infer<typeof TickerMessageSchema>;\r\n\r\nexport type ConnectionStatus = 'connecting' | 'connected' | 'disconnected' | 'reconnecting';\r\n\r\nexport interface RealtimeUpdatesResult {\r\n messages: TickerMessage[];\r\n connectionStatus: ConnectionStatus;\r\n reconnect: () => void;\r\n}\r\n\r\n// --- Constants ---\r\n\r\nconst RECONNECT_DELAY_BASE = 1000;\r\nconst RECONNECT_DELAY_MAX = 30000;\r\nconst RECONNECT_DELAY_MULTIPLIER = 1.5;\r\nconst MAX_MESSAGES = 50;\r\nconst MESSAGE_BATCH_DELAY = 500; // Batch messages every 500ms for performance\r\n\r\n// --- Hook ---\r\n\r\nexport function useRealtimeUpdates(endpoint: string): RealtimeUpdatesResult {\r\n const [messages, setMessages] = useState<TickerMessage[]>([]);\r\n const [connectionStatus, setConnectionStatus] = useState<ConnectionStatus>('disconnected');\r\n\r\n const wsRef = useRef<WebSocket | null>(null);\r\n const reconnectTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const reconnectDelayRef = useRef(RECONNECT_DELAY_BASE);\r\n\r\n // Message batching for performance: accumulate messages and flush every 500ms\r\n const messageBatchRef = useRef<TickerMessage[]>([]);\r\n const batchFlushTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // Flush batched messages to state\r\n const flushMessageBatch = useCallback(() => {\r\n if (messageBatchRef.current.length > 0) {\r\n const batch = [...messageBatchRef.current];\r\n messageBatchRef.current = [];\r\n\r\n setMessages((prev) => {\r\n const next = [...batch, ...prev];\r\n return next.length > MAX_MESSAGES ? next.slice(0, MAX_MESSAGES) : next;\r\n });\r\n }\r\n\r\n if (batchFlushTimeoutRef.current) {\r\n clearTimeout(batchFlushTimeoutRef.current);\r\n batchFlushTimeoutRef.current = null;\r\n }\r\n }, []);\r\n\r\n // Schedule a batch flush\r\n const scheduleBatchFlush = useCallback(() => {\r\n if (!batchFlushTimeoutRef.current) {\r\n batchFlushTimeoutRef.current = setTimeout(() => {\r\n flushMessageBatch();\r\n }, MESSAGE_BATCH_DELAY);\r\n }\r\n }, [flushMessageBatch]);\r\n\r\n const scheduleReconnect = useCallback(() => {\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current);\r\n }\r\n\r\n const delay = reconnectDelayRef.current;\r\n setConnectionStatus('reconnecting');\r\n\r\n reconnectTimeoutRef.current = setTimeout(() => {\r\n connectWs();\r\n }, delay);\r\n\r\n reconnectDelayRef.current = Math.min(\r\n reconnectDelayRef.current * RECONNECT_DELAY_MULTIPLIER,\r\n RECONNECT_DELAY_MAX\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const connectWs = useCallback(() => {\r\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\r\n const wsUrl = `${protocol}//${window.location.host}/${endpoint}`;\r\n\r\n try {\r\n setConnectionStatus('connecting');\r\n const ws = new WebSocket(wsUrl);\r\n wsRef.current = ws;\r\n\r\n ws.onopen = () => {\r\n setConnectionStatus('connected');\r\n reconnectDelayRef.current = RECONNECT_DELAY_BASE;\r\n };\r\n\r\n ws.onmessage = (event: MessageEvent) => {\r\n try {\r\n const data = JSON.parse(event.data);\r\n const parsed = TickerMessageSchema.safeParse(data);\r\n if (parsed.success) {\r\n // Add to batch instead of immediate state update\r\n messageBatchRef.current.push(parsed.data);\r\n // Schedule flush (debounced - only one timer active at a time)\r\n scheduleBatchFlush();\r\n }\r\n } catch {\r\n // Ignore malformed messages\r\n }\r\n };\r\n\r\n ws.onclose = () => {\r\n setConnectionStatus('disconnected');\r\n wsRef.current = null;\r\n scheduleReconnect();\r\n };\r\n\r\n ws.onerror = () => {\r\n setConnectionStatus('disconnected');\r\n };\r\n } catch {\r\n setConnectionStatus('disconnected');\r\n scheduleReconnect();\r\n }\r\n }, [endpoint, scheduleReconnect]);\r\n\r\n const reconnect = useCallback(() => {\r\n if (wsRef.current) {\r\n wsRef.current.close();\r\n }\r\n reconnectDelayRef.current = RECONNECT_DELAY_BASE;\r\n connectWs();\r\n }, [connectWs]);\r\n\r\n useEffect(() => {\r\n connectWs();\r\n\r\n return () => {\r\n // Flush any remaining batched messages\r\n flushMessageBatch();\r\n\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current);\r\n }\r\n if (batchFlushTimeoutRef.current) {\r\n clearTimeout(batchFlushTimeoutRef.current);\r\n }\r\n if (wsRef.current) {\r\n wsRef.current.close();\r\n wsRef.current = null;\r\n }\r\n };\r\n }, [connectWs, flushMessageBatch]);\r\n\r\n return { messages, connectionStatus, reconnect };\r\n}\r\n\r\nexport default useRealtimeUpdates;\r\n","// ========================================\r\n// Skills Manager Page\r\n// ========================================\r\n// Browse and manage skills library with search/filter\r\n\r\nimport { useState, useMemo, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { toast } from 'sonner';\r\nimport {\r\n Sparkles,\r\n Search,\r\n Plus,\r\n RefreshCw,\r\n Power,\r\n PowerOff,\r\n Tag,\r\n ChevronDown,\r\n ChevronRight,\r\n EyeOff,\r\n List,\r\n Grid3x3,\r\n Folder,\r\n User,\r\n AlertCircle,\r\n Maximize2,\r\n Minimize2,\r\n Globe,\r\n Download,\r\n} from 'lucide-react';\r\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/components/ui/Select';\r\nimport {\r\n AlertDialog,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n} from '@/components/ui';\r\nimport { SkillCard, SkillDetailPanel, SkillCreateDialog } from '@/components/shared';\r\nimport { SkillHubCard } from '@/components/shared/SkillHubCard';\r\nimport { CliModeToggle, type CliMode } from '@/components/mcp/CliModeToggle';\r\nimport { useSkills, useSkillMutations } from '@/hooks';\r\nimport {\r\n useSkillHub,\r\n useInstallSkill,\r\n useUninstallSkill,\r\n type RemoteSkill,\r\n type LocalSkill,\r\n type InstalledSkill,\r\n type CliType,\r\n type SkillSource,\r\n} from '@/hooks/useSkillHub';\r\nimport { fetchSkillDetail } from '@/lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport type { Skill } from '@/lib/api';\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ========== Skill Grid Component ==========\r\n\r\ninterface SkillGridProps {\r\n skills: Skill[];\r\n isLoading: boolean;\r\n onToggle: (skill: Skill, enabled: boolean) => void;\r\n onClick: (skill: Skill) => void;\r\n onDelete?: (skill: Skill) => void;\r\n isToggling: boolean;\r\n compact?: boolean;\r\n}\r\n\r\nfunction SkillGrid({ skills, isLoading, onToggle, onClick, onDelete, isToggling, compact }: SkillGridProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n if (isLoading) {\r\n return (\r\n <div className={cn(\r\n 'grid gap-4',\r\n compact ? 'grid-cols-1' : 'md:grid-cols-2 lg:grid-cols-3'\r\n )}>\r\n {[1, 2, 3, 4, 5, 6].map((i) => (\r\n <div key={i} className=\"h-48 bg-muted animate-pulse rounded-lg\" />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n if (skills.length === 0) {\r\n return (\r\n <Card className=\"p-8 text-center\">\r\n <Sparkles className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">{formatMessage({ id: 'skills.emptyState.title' })}</h3>\r\n <p className=\"mt-2 text-muted-foreground\">\r\n {formatMessage({ id: 'skills.emptyState.message' })}\r\n </p>\r\n </Card>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn(\r\n 'grid gap-4',\r\n compact ? 'grid-cols-1' : 'md:grid-cols-2 lg:grid-cols-3'\r\n )}>\r\n {skills.map((skill) => (\r\n <SkillCard\r\n key={skill.name}\r\n skill={skill}\r\n onToggle={onToggle}\r\n onClick={onClick}\r\n onDelete={onDelete}\r\n isToggling={isToggling}\r\n compact={compact}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Page Component ==========\r\n\r\nexport function SkillsManagerPage() {\r\n const { formatMessage } = useIntl();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const [searchParams] = useSearchParams();\r\n\r\n // Initialize locationFilter from URL tab parameter\r\n const tabFromUrl = searchParams.get('tab');\r\n const initialLocationFilter = tabFromUrl === 'hub' ? 'hub' : 'project';\r\n\r\n const [cliMode, setCliMode] = useState<CliMode>('claude');\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [categoryFilter, setCategoryFilter] = useState<string>('all');\r\n const [sourceFilter, setSourceFilter] = useState<string>('all');\r\n const [enabledFilter, setEnabledFilter] = useState<'all' | 'enabled' | 'disabled'>('all');\r\n const [viewMode, setViewMode] = useState<'grid' | 'compact'>('grid');\r\n const [showDisabledSection, setShowDisabledSection] = useState(false);\r\n const [confirmDisable, setConfirmDisable] = useState<{ skill: Skill; enable: boolean } | null>(null);\r\n const [confirmDelete, setConfirmDelete] = useState<Skill | null>(null);\r\n const [locationFilter, setLocationFilter] = useState<'project' | 'user' | 'hub'>(initialLocationFilter);\r\n\r\n // Skill Hub state\r\n const [hubTab, setHubTab] = useState<'remote' | 'local' | 'installed'>('remote');\r\n const [hubSearchQuery, setHubSearchQuery] = useState('');\r\n const [hubCategoryFilter, setHubCategoryFilter] = useState<string | null>(null);\r\n const [installingSkillId, setInstallingSkillId] = useState<string | null>(null);\r\n\r\n // Skill create dialog state\r\n const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);\r\n\r\n // Skill detail panel state\r\n const [selectedSkill, setSelectedSkill] = useState<Skill | null>(null);\r\n const [isDetailLoading, setIsDetailLoading] = useState(false);\r\n const [isDetailPanelOpen, setIsDetailPanelOpen] = useState(false);\r\n\r\n // Immersive mode state\r\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n\r\n const {\r\n skills,\r\n categories,\r\n projectSkills,\r\n userSkills,\r\n isLoading,\r\n isFetching,\r\n error,\r\n refetch,\r\n } = useSkills({\r\n filter: {\r\n search: searchQuery || undefined,\r\n category: categoryFilter !== 'all' ? categoryFilter : undefined,\r\n source: sourceFilter !== 'all' ? sourceFilter as Skill['source'] : undefined,\r\n enabledOnly: enabledFilter === 'enabled',\r\n location: locationFilter === 'hub' ? undefined : locationFilter,\r\n },\r\n cliType: cliMode,\r\n });\r\n\r\n const { toggleSkill, deleteSkill, isToggling, isDeleting } = useSkillMutations();\r\n\r\n // Skill Hub hooks\r\n const {\r\n remote: remoteSkills,\r\n local: localSkills,\r\n installed: installedSkills,\r\n stats: hubStats,\r\n isLoading: isHubLoading,\r\n isError: isHubError,\r\n isFetching: isHubFetching,\r\n refetchAll: refetchHub,\r\n } = useSkillHub(locationFilter === 'hub');\r\n\r\n const installSkillMutation = useInstallSkill();\r\n const uninstallSkillMutation = useUninstallSkill();\r\n\r\n // Build installed map for quick lookup\r\n const installedMap = useMemo(() => {\r\n const map = new Map<string, InstalledSkill>();\r\n installedSkills.data?.skills?.forEach((skill: InstalledSkill) => {\r\n map.set(skill.originalId, skill);\r\n });\r\n return map;\r\n }, [installedSkills.data]);\r\n\r\n // Extract unique categories from skill hub\r\n const hubCategories = useMemo(() => {\r\n const cats = new Set<string>();\r\n remoteSkills.data?.skills?.forEach((skill: RemoteSkill) => {\r\n if (skill.category) cats.add(skill.category);\r\n });\r\n localSkills.data?.skills?.forEach((skill: LocalSkill) => {\r\n if (skill.category) cats.add(skill.category);\r\n });\r\n return Array.from(cats).sort();\r\n }, [remoteSkills.data, localSkills.data]);\r\n\r\n // Filter hub skills based on search and category\r\n const filterHubSkills = <T extends RemoteSkill | LocalSkill | InstalledSkill>(skills: T[]): T[] => {\r\n return skills.filter((skill) => {\r\n const matchesSearch = !hubSearchQuery ||\r\n skill.name.toLowerCase().includes(hubSearchQuery.toLowerCase()) ||\r\n ('description' in skill && skill.description?.toLowerCase().includes(hubSearchQuery.toLowerCase())) ||\r\n ('tags' in skill && skill.tags?.some((tag: string) => tag.toLowerCase().includes(hubSearchQuery.toLowerCase())));\r\n\r\n const matchesCategory = !hubCategoryFilter || ('category' in skill && skill.category === hubCategoryFilter);\r\n\r\n return matchesSearch && matchesCategory;\r\n });\r\n };\r\n\r\n // Get filtered skills for current hub tab\r\n const filteredHubSkills = useMemo(() => {\r\n if (hubTab === 'remote') {\r\n return filterHubSkills(remoteSkills.data?.skills || []);\r\n }\r\n if (hubTab === 'local') {\r\n return filterHubSkills(localSkills.data?.skills || []);\r\n }\r\n return installedSkills.data?.skills || [];\r\n }, [hubTab, remoteSkills.data, localSkills.data, installedSkills.data, hubSearchQuery, hubCategoryFilter]);\r\n\r\n // Hub skill handlers\r\n const handleHubInstall = async (skill: RemoteSkill | LocalSkill, cliType: CliType) => {\r\n const source: SkillSource = 'downloadUrl' in skill ? 'remote' : 'local';\r\n setInstallingSkillId(skill.id);\r\n try {\r\n await installSkillMutation.mutateAsync({\r\n skillId: skill.id,\r\n cliType,\r\n source,\r\n downloadUrl: 'downloadUrl' in skill ? skill.downloadUrl : undefined,\r\n });\r\n // Show success toast\r\n toast.success(formatMessage({ id: 'skill-hub.install.success' }, { name: skill.name }));\r\n } catch (error) {\r\n // Show error toast\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n toast.error(formatMessage({ id: 'skill-hub.install.error' }, { error: errorMessage }));\r\n } finally {\r\n setInstallingSkillId(null);\r\n }\r\n };\r\n\r\n const handleHubUninstall = async (skill: RemoteSkill | LocalSkill, cliType: CliType) => {\r\n const installedInfo = installedMap.get(skill.id);\r\n if (installedInfo) {\r\n try {\r\n await uninstallSkillMutation.mutateAsync({\r\n skillId: installedInfo.id,\r\n cliType,\r\n });\r\n // Show success toast\r\n toast.success(formatMessage({ id: 'skill-hub.uninstall.success' }, { name: skill.name }));\r\n } catch (error) {\r\n // Show error toast\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n toast.error(formatMessage({ id: 'skill-hub.uninstall.error' }, { error: errorMessage }));\r\n }\r\n }\r\n };\r\n\r\n // Filter skills based on enabled filter\r\n const filteredSkills = useMemo(() => {\r\n if (enabledFilter === 'disabled') {\r\n return skills.filter((s) => !s.enabled);\r\n }\r\n return skills;\r\n }, [skills, enabledFilter]);\r\n\r\n // Calculate counts based on current location filter (from skills, not allSkills)\r\n const currentLocationEnabledCount = useMemo(() => skills.filter(s => s.enabled).length, [skills]);\r\n const currentLocationTotalCount = skills.length;\r\n const currentLocationDisabledCount = currentLocationTotalCount - currentLocationEnabledCount;\r\n\r\n const handleToggle = async (skill: Skill, enabled: boolean) => {\r\n // Use the skill's location property\r\n const location = skill.location || 'project';\r\n // Use folderName for API calls (actual folder name), fallback to name if not available\r\n const skillIdentifier = skill.folderName || skill.name;\r\n\r\n // Debug logging\r\n console.log('[SkillToggle] Toggling skill:', {\r\n name: skill.name,\r\n folderName: skill.folderName,\r\n location,\r\n enabled,\r\n skillIdentifier,\r\n cliMode\r\n });\r\n\r\n try {\r\n await toggleSkill(skillIdentifier, enabled, location, cliMode);\r\n } catch (error) {\r\n console.error('[SkillToggle] Toggle failed:', error);\r\n throw error;\r\n }\r\n };\r\n\r\n const handleToggleWithConfirm = (skill: Skill, enabled: boolean) => {\r\n if (!enabled) {\r\n // Show confirmation dialog when disabling\r\n setConfirmDisable({ skill, enable: false });\r\n } else {\r\n // Enable directly without confirmation\r\n handleToggle(skill, true);\r\n }\r\n };\r\n\r\n const handleConfirmDisable = async () => {\r\n if (confirmDisable) {\r\n await handleToggle(confirmDisable.skill, false);\r\n setConfirmDisable(null);\r\n }\r\n };\r\n\r\n const handleDelete = (skill: Skill) => {\r\n setConfirmDelete(skill);\r\n };\r\n\r\n const handleConfirmDelete = async () => {\r\n if (confirmDelete) {\r\n const location = confirmDelete.location || 'project';\r\n const skillIdentifier = confirmDelete.folderName || confirmDelete.name;\r\n\r\n try {\r\n await deleteSkill(skillIdentifier, location, projectPath, cliMode);\r\n toast.success(formatMessage({ id: 'skills.delete.success' }, { name: confirmDelete.name }));\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n toast.error(formatMessage({ id: 'skills.delete.error' }, { error: errorMessage }));\r\n } finally {\r\n setConfirmDelete(null);\r\n }\r\n }\r\n };\r\n\r\n // Skill detail panel handlers\r\n const handleSkillClick = useCallback(async (skill: Skill) => {\r\n setIsDetailLoading(true);\r\n setIsDetailPanelOpen(true);\r\n setSelectedSkill(skill);\r\n\r\n try {\r\n // Fetch full skill details from API\r\n const data = await fetchSkillDetail(\r\n skill.name,\r\n skill.location || 'project',\r\n projectPath,\r\n cliMode\r\n );\r\n setSelectedSkill(data.skill);\r\n } catch (error) {\r\n console.error('Failed to fetch skill details:', error);\r\n // Keep the basic skill info if fetch fails\r\n } finally {\r\n setIsDetailLoading(false);\r\n }\r\n }, [projectPath, cliMode]);\r\n\r\n const handleCloseDetailPanel = useCallback(() => {\r\n setIsDetailPanelOpen(false);\r\n setSelectedSkill(null);\r\n }, []);\r\n\r\n return (\r\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\r\n {/* Page Header */}\r\n <div className=\"flex flex-col gap-4\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\r\n <Sparkles className=\"w-6 h-6 text-primary\" />\r\n {formatMessage({ id: 'skills.title' })}\r\n </h1>\r\n <p className=\"text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'skills.description' })}\r\n </p>\r\n </div>\r\n {/* CLI Mode Badge Switcher */}\r\n <div className=\"ml-3 flex-shrink-0\">\r\n <CliModeToggle\r\n currentMode={cliMode}\r\n onModeChange={setCliMode}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={toggleImmersiveMode}\r\n className={cn(\r\n 'p-2 rounded-md transition-colors',\r\n isImmersiveMode\r\n ? 'bg-primary/10 text-primary'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\r\n >\r\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\r\n </button>\r\n <Button variant=\"outline\" onClick={() => locationFilter === 'hub' ? refetchHub() : refetch()} disabled={isFetching || isHubFetching}>\r\n <RefreshCw className={cn('w-4 h-4 mr-2', (isFetching || isHubFetching) && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n <Button onClick={() => setIsCreateDialogOpen(true)}>\r\n <Plus className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.actions.install' })}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Error alert */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'home.errors.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Location Tabs - styled like LiteTasksPage */}\r\n <TabsNavigation\r\n value={locationFilter}\r\n onValueChange={(v) => setLocationFilter(v as 'project' | 'user' | 'hub')}\r\n tabs={[\r\n {\r\n value: 'project',\r\n label: formatMessage({ id: 'skills.location.project' }),\r\n icon: <Folder className=\"h-4 w-4\" />,\r\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{projectSkills.length}</Badge>,\r\n disabled: isToggling,\r\n },\r\n {\r\n value: 'user',\r\n label: formatMessage({ id: 'skills.location.user' }),\r\n icon: <User className=\"h-4 w-4\" />,\r\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{userSkills.length}</Badge>,\r\n disabled: isToggling,\r\n },\r\n {\r\n value: 'hub',\r\n label: formatMessage({ id: 'skills.location.hub' }),\r\n icon: <Globe className=\"h-4 w-4\" />,\r\n disabled: isToggling,\r\n },\r\n ]}\r\n />\r\n </div>\r\n\r\n {/* Stats Cards */}\r\n {locationFilter === 'hub' ? (\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Globe className=\"w-5 h-5 text-primary\" />\r\n <span className=\"text-2xl font-bold\">{hubStats.data?.remoteTotal || 0}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skillHub.stats.remote' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Folder className=\"w-5 h-5 text-info\" />\r\n <span className=\"text-2xl font-bold\">{hubStats.data?.localTotal || 0}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skillHub.stats.local' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Download className=\"w-5 h-5 text-success\" />\r\n <span className=\"text-2xl font-bold\">{hubStats.data?.installedTotal || 0}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skillHub.stats.installed' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <RefreshCw className={cn('w-5 h-5', (hubStats.data?.updatesAvailable || 0) > 0 ? 'text-amber-500' : 'text-muted-foreground')} />\r\n <span className=\"text-2xl font-bold\">{hubStats.data?.updatesAvailable || 0}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skillHub.stats.updates' })}</p>\r\n </Card>\r\n </div>\r\n ) : (\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Sparkles className=\"w-5 h-5 text-primary\" />\r\n <span className=\"text-2xl font-bold\">{currentLocationTotalCount}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'common.stats.totalSkills' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Power className=\"w-5 h-5 text-success\" />\r\n <span className=\"text-2xl font-bold\">{currentLocationEnabledCount}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skills.state.enabled' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <PowerOff className=\"w-5 h-5 text-muted-foreground\" />\r\n <span className=\"text-2xl font-bold\">{currentLocationDisabledCount}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skills.state.disabled' })}</p>\r\n </Card>\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <Tag className=\"w-5 h-5 text-info\" />\r\n <span className=\"text-2xl font-bold\">{categories.length}</span>\r\n </div>\r\n <p className=\"text-sm text-muted-foreground mt-1\">{formatMessage({ id: 'skills.card.category' })}</p>\r\n </Card>\r\n </div>\r\n )}\r\n\r\n {/* Filters and Search */}\r\n {locationFilter === 'hub' ? (\r\n <>\r\n {/* Hub Sub-tabs */}\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <TabsNavigation\r\n value={hubTab}\r\n onValueChange={(v) => setHubTab(v as 'remote' | 'local' | 'installed')}\r\n tabs={[\r\n {\r\n value: 'remote',\r\n label: formatMessage({ id: 'skillHub.tabs.remote' }),\r\n icon: <Globe className=\"h-4 w-4\" />,\r\n badge: remoteSkills.data?.total ? <Badge variant=\"secondary\" className=\"ml-2\">{remoteSkills.data.total}</Badge> : undefined,\r\n },\r\n {\r\n value: 'local',\r\n label: formatMessage({ id: 'skillHub.tabs.local' }),\r\n icon: <Folder className=\"h-4 w-4\" />,\r\n badge: localSkills.data?.total ? <Badge variant=\"secondary\" className=\"ml-2\">{localSkills.data.total}</Badge> : undefined,\r\n },\r\n {\r\n value: 'installed',\r\n label: formatMessage({ id: 'skillHub.tabs.installed' }),\r\n icon: <Download className=\"h-4 w-4\" />,\r\n badge: installedSkills.data?.total ? <Badge variant=\"secondary\" className=\"ml-2\">{installedSkills.data.total}</Badge> : undefined,\r\n },\r\n ]}\r\n />\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n type=\"text\"\r\n placeholder={formatMessage({ id: 'skillHub.search.placeholder' })}\r\n value={hubSearchQuery}\r\n onChange={(e) => setHubSearchQuery(e.target.value)}\r\n className=\"pl-9 w-48\"\r\n />\r\n </div>\r\n {hubCategories.length > 0 && hubTab !== 'installed' && (\r\n <Select value={hubCategoryFilter || 'all'} onValueChange={(v) => setHubCategoryFilter(v === 'all' ? null : v)}>\r\n <SelectTrigger className=\"w-[140px]\">\r\n <SelectValue placeholder={formatMessage({ id: 'skillHub.filter.allCategories' })} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'skillHub.filter.allCategories' })}</SelectItem>\r\n {hubCategories.map((cat) => (\r\n <SelectItem key={cat} value={cat}>{cat}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Hub Error State */}\r\n {isHubError && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\r\n <span>{formatMessage({ id: 'skillHub.error.loadFailed' })}</span>\r\n </div>\r\n )}\r\n\r\n {/* Hub Skills Grid */}\r\n {isHubLoading ? (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {[1, 2, 3, 4, 5, 6].map((i) => (\r\n <div key={i} className=\"h-48 bg-muted animate-pulse rounded-lg\" />\r\n ))}\r\n </div>\r\n ) : filteredHubSkills.length === 0 ? (\r\n <Card className=\"p-8 text-center\">\r\n {hubTab === 'remote' ? (\r\n <>\r\n <Globe className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">{formatMessage({ id: 'skillHub.empty.remote.title' })}</h3>\r\n <p className=\"mt-2 text-muted-foreground\">{formatMessage({ id: 'skillHub.empty.remote.description' })}</p>\r\n </>\r\n ) : hubTab === 'local' ? (\r\n <>\r\n <Folder className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">{formatMessage({ id: 'skillHub.empty.local.title' })}</h3>\r\n <p className=\"mt-2 text-muted-foreground\">{formatMessage({ id: 'skillHub.empty.local.description' })}</p>\r\n </>\r\n ) : (\r\n <>\r\n <Download className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\r\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">{formatMessage({ id: 'skillHub.empty.installed.title' })}</h3>\r\n <p className=\"mt-2 text-muted-foreground\">{formatMessage({ id: 'skillHub.empty.installed.description' })}</p>\r\n </>\r\n )}\r\n </Card>\r\n ) : (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\r\n {filteredHubSkills.map((skill) => {\r\n const source: SkillSource = hubTab === 'remote' ? 'remote' : 'local';\r\n const installedInfo = installedMap.get(skill.id);\r\n const skillSource: SkillSource = hubTab === 'installed'\r\n ? ('source' in skill ? (skill as InstalledSkill).source : source)\r\n : source;\r\n\r\n return (\r\n <SkillHubCard\r\n key={skill.id}\r\n skill={skill as RemoteSkill | LocalSkill}\r\n installedInfo={installedInfo}\r\n source={skillSource}\r\n onInstall={handleHubInstall}\r\n onUninstall={handleHubUninstall}\r\n isInstalling={installingSkillId === skill.id}\r\n />\r\n );\r\n })}\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n {/* Regular Skills Filters */}\r\n <div className=\"flex flex-col sm:flex-row gap-3\">\r\n <div className=\"relative flex-1\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'skills.filters.searchPlaceholder' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <Select value={categoryFilter} onValueChange={setCategoryFilter}>\r\n <SelectTrigger className=\"w-[140px]\">\r\n <SelectValue placeholder={formatMessage({ id: 'skills.card.category' })} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'skills.filters.all' })}</SelectItem>\r\n {categories.map((cat) => (\r\n <SelectItem key={cat} value={cat}>{cat}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <Select value={sourceFilter} onValueChange={setSourceFilter}>\r\n <SelectTrigger className=\"w-[140px]\">\r\n <SelectValue placeholder={formatMessage({ id: 'skills.card.source' })} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'skills.filters.allSources' })}</SelectItem>\r\n <SelectItem value=\"builtin\">{formatMessage({ id: 'skills.source.builtin' })}</SelectItem>\r\n <SelectItem value=\"custom\">{formatMessage({ id: 'skills.source.custom' })}</SelectItem>\r\n <SelectItem value=\"community\">{formatMessage({ id: 'skills.source.community' })}</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n <Select value={enabledFilter} onValueChange={(v) => setEnabledFilter(v as 'all' | 'enabled' | 'disabled')}>\r\n <SelectTrigger className=\"w-[140px]\">\r\n <SelectValue placeholder={formatMessage({ id: 'skills.state.enabled' })} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"all\">{formatMessage({ id: 'skills.filters.all' })}</SelectItem>\r\n <SelectItem value=\"enabled\">{formatMessage({ id: 'skills.filters.enabled' })}</SelectItem>\r\n <SelectItem value=\"disabled\">{formatMessage({ id: 'skills.filters.disabled' })}</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n </div>\r\n\r\n {/* Quick Filters */}\r\n <div className=\"flex flex-wrap gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setEnabledFilter('all')}\r\n className={enabledFilter === 'all' ? 'bg-primary text-primary-foreground' : ''}\r\n >\r\n <Sparkles className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'skills.filters.all' })} ({currentLocationTotalCount})\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setEnabledFilter('enabled')}\r\n className={enabledFilter === 'enabled' ? 'bg-primary text-primary-foreground' : ''}\r\n >\r\n <Power className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'skills.state.enabled' })} ({currentLocationEnabledCount})\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setEnabledFilter('disabled')}\r\n className={enabledFilter === 'disabled' ? 'bg-primary text-primary-foreground' : ''}\r\n >\r\n <PowerOff className=\"w-4 h-4 mr-1\" />\r\n {formatMessage({ id: 'skills.state.disabled' })} ({currentLocationDisabledCount})\r\n </Button>\r\n <div className=\"flex-1\" />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => setViewMode(viewMode === 'grid' ? 'compact' : 'grid')}\r\n >\r\n {viewMode === 'grid' ? <List className=\"w-4 h-4 mr-1\" /> : <Grid3x3 className=\"w-4 h-4 mr-1\" />}\r\n {formatMessage({ id: viewMode === 'grid' ? 'skills.view.compact' : 'skills.view.grid' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Skills Grid */}\r\n <SkillGrid\r\n skills={filteredSkills}\r\n isLoading={isLoading}\r\n onToggle={handleToggleWithConfirm}\r\n onClick={handleSkillClick}\r\n onDelete={handleDelete}\r\n isToggling={isToggling || !!confirmDisable}\r\n compact={viewMode === 'compact'}\r\n />\r\n\r\n {/* Disabled Skills Section */}\r\n {enabledFilter === 'all' && currentLocationDisabledCount > 0 && (\r\n <div className=\"mt-6\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() => setShowDisabledSection(!showDisabledSection)}\r\n className=\"mb-4 text-muted-foreground hover:text-foreground\"\r\n >\r\n {showDisabledSection ? <ChevronDown className=\"w-4 h-4 mr-2\" /> : <ChevronRight className=\"w-4 h-4 mr-2\" />}\r\n <EyeOff className=\"w-4 h-4 mr-2\" />\r\n {formatMessage({ id: 'skills.disabledSkills.title' })} ({currentLocationDisabledCount})\r\n </Button>\r\n\r\n {showDisabledSection && (\r\n <SkillGrid\r\n skills={skills.filter((s) => !s.enabled)}\r\n isLoading={false}\r\n onToggle={handleToggleWithConfirm}\r\n onClick={handleSkillClick}\r\n onDelete={handleDelete}\r\n isToggling={isToggling || !!confirmDisable}\r\n compact={true}\r\n />\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Disable Confirmation Dialog */}\r\n <AlertDialog open={!!confirmDisable} onOpenChange={(open) => !open && setConfirmDisable(null)}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>{formatMessage({ id: 'skills.disableConfirm.title' })}</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n {formatMessage(\r\n { id: 'skills.disableConfirm.message' },\r\n { name: confirmDisable?.skill.name || '' }\r\n )}\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel>{formatMessage({ id: 'skills.actions.cancel' })}</AlertDialogCancel>\r\n <AlertDialogAction onClick={handleConfirmDisable} className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">\r\n {formatMessage({ id: 'skills.actions.confirmDisable' })}\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n\r\n {/* Delete Confirmation Dialog */}\r\n <AlertDialog open={!!confirmDelete} onOpenChange={(open) => !open && setConfirmDelete(null)}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>{formatMessage({ id: 'skills.deleteConfirm.title' })}</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n {formatMessage(\r\n { id: 'skills.deleteConfirm.message' },\r\n { name: confirmDelete?.name || '' }\r\n )}\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel disabled={isDeleting}>{formatMessage({ id: 'skills.actions.cancel' })}</AlertDialogCancel>\r\n <AlertDialogAction\r\n onClick={handleConfirmDelete}\r\n disabled={isDeleting}\r\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\r\n >\r\n {isDeleting ? formatMessage({ id: 'common.deleting' }) : formatMessage({ id: 'skills.actions.confirmDelete' })}\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n\r\n {/* Skill Detail Panel */}\r\n <SkillDetailPanel\r\n skill={selectedSkill}\r\n isOpen={isDetailPanelOpen}\r\n onClose={handleCloseDetailPanel}\r\n isLoading={isDetailLoading}\r\n />\r\n\r\n {/* Skill Create Dialog */}\r\n <SkillCreateDialog\r\n open={isCreateDialogOpen}\r\n onOpenChange={setIsCreateDialogOpen}\r\n onCreated={() => refetch()}\r\n cliType={cliMode}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default SkillsManagerPage;\r\n"],"names":["FolderInput","createLucideIcon","skillHubKeys","checkUpdates","useRemoteSkills","enabled","useQuery","fetchApi","data","useLocalSkills","useInstalledSkills","options","useInstallSkill","queryClient","useQueryClient","useMutation","request","useUninstallSkill","skillId","cliType","useSkillHubStats","remoteData","localData","installedData","installed","updatesAvailable","s","claudeInstalled","codexInstalled","useSkillHub","remote","local","stats","isLoading","isError","isFetching","PROVIDER_NAME","Collection","useCollection","createCollectionScope","createCollection","createToastContext","createContextScope","ToastProviderProvider","useToastProviderContext","VIEWPORT_NAME","VIEWPORT_DEFAULT_HOTKEY","VIEWPORT_PAUSE","VIEWPORT_RESUME","ToastViewport","React.forwardRef","props","forwardedRef","__scopeToast","hotkey","label","viewportProps","context","getItems","wrapperRef","React.useRef","headFocusProxyRef","tailFocusProxyRef","ref","composedRefs","useComposedRefs","hotkeyLabel","hasToasts","React.useEffect","handleKeyDown","event","key","_a","wrapper","viewport","handlePause","pauseEvent","handleResume","resumeEvent","handleFocusOutResume","handlePointerLeaveResume","getSortedTabbableCandidates","React.useCallback","tabbingDirection","tabbableCandidates","toastItem","toastNode","toastTabbableCandidates","getTabbableCandidates","isMetaKey","focusedElement","isTabbingBackwards","sortedCandidates","index","candidate","focusFirst","_b","_c","jsxs","DismissableLayer.Branch","jsx","FocusProxy","Primitive","FOCUS_PROXY_NAME","onFocusFromOutsideViewport","proxyProps","VisuallyHidden","prevFocusedElement","TOAST_NAME","TOAST_SWIPE_START","TOAST_SWIPE_MOVE","TOAST_SWIPE_CANCEL","TOAST_SWIPE_END","Toast","forceMount","openProp","defaultOpen","onOpenChange","toastProps","open","setOpen","useControllableState","Presence","ToastImpl","useCallbackRef","composeEventHandlers","x","y","ToastInteractiveProvider","useToastInteractiveContext","type","durationProp","onClose","onEscapeKeyDown","onPause","onResume","onSwipeStart","onSwipeMove","onSwipeCancel","onSwipeEnd","node","setNode","React.useState","node2","pointerStartRef","swipeDeltaRef","duration","closeTimerStartTimeRef","closeTimerRemainingTimeRef","closeTimerRef","onToastAdd","onToastRemove","handleClose","startTimer","duration2","elapsedTime","announceTextContent","React.useMemo","getAnnounceTextContent","Fragment","ToastAnnounce","ReactDOM.createPortal","DismissableLayer.Root","hasSwipeMoveStarted","isHorizontalSwipe","clamp","clampedX","clampedY","moveStartBuffer","delta","eventDetail","handleAndDispatchCustomEvent","isDeltaInDirection","target","toast","event2","children","announceProps","renderAnnounceText","setRenderAnnounceText","isAnnounced","setIsAnnounced","useNextFrame","timer","Portal","TITLE_NAME","ToastTitle","titleProps","DESCRIPTION_NAME","ToastDescription","descriptionProps","ACTION_NAME","ToastAction","altText","actionProps","ToastAnnounceExclude","ToastClose","CLOSE_NAME","closeProps","interactiveContext","announceExcludeProps","container","textContent","isHTMLElement","isHidden","isExcluded","name","handler","detail","discrete","currentTarget","dispatchDiscreteCustomEvent","direction","threshold","deltaX","deltaY","isDeltaX","callback","fn","useLayoutEffect","raf1","raf2","nodes","walker","isHiddenInput","candidates","previouslyFocusedElement","Viewport","Root2","Title","Description","Action","Close","className","ToastPrimitives.Viewport","cn","toastVariants","cva","variant","ToastPrimitives.Root","ToastPrimitives.Action","ToastPrimitives.Close","X","ToastPrimitives.Title","ToastPrimitives.Description","sourceColorConfig","sourceLabelKeys","SourceBadge","source","formatMessage","useIntl","config","Badge","SkillCard","skill","onToggle","onClick","onConfigure","onDelete","compact","showActions","isToggling","isMenuOpen","setIsMenuOpen","useState","handleClick","handleToggle","e","handleConfigure","handleDelete","Sparkles","Button","Power","PowerOff","Card","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","Info","Settings","Trash2","trigger","User","buildSkillFileTree","supportingFiles","nodeMap","entry","isDirectoryMarker","cleanPath","parts","currentPath","i","part","parentPath","parent","c","finalName","finalPath","existingNode","finalNode","existingChild","result","path","b","sortChildren","a","getDefaultExpandedPaths","expanded","collectDirectories","SkillDetailPanel","isOpen","onEdit","onEditFile","projectPath","useWorkflowStore","selectProjectPath","cliMode","expandedPaths","setExpandedPaths","selectedFile","setSelectedFile","previewContent","setPreviewContent","isPreviewLoading","setIsPreviewLoading","showPreviewPanel","setShowPreviewPanel","useEffect","fileTree","useMemo","loadFilePreview","useCallback","filePath","readSkillFile","error","handleClosePreview","hasAllowedTools","hasSupportingFiles","folderName","handleEditFile","fileName","togglePath","prev","next","Tag","FileText","MapPin","Lock","tool","Folder","Eye","Edit","SkillFileTree","FilePreviewModal","Code","SkillFileTreeNode","depth","onTogglePath","onPreviewFile","isDirectory","isExpanded","hasChildren","ChevronDown","ChevronRight","child","content","Maximize2","Loader2","SkillCreateDialog","onCreated","mode","setMode","location","setLocation","sourcePath","setSourcePath","validationResult","setValidationResult","isValidating","setIsValidating","skillName","setSkillName","description","setDescription","isCreating","setIsCreating","isFileBrowserOpen","setIsFileBrowserOpen","resetState","handleOpenChange","handleValidate","validateSkillImport","err","handleCreate","createSkill","canCreate","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Input","FolderOpen","CheckCircle","XCircle","Textarea","DialogFooter","FloatingFileBrowser","SkillSourceBadge","Globe","InstallStatusBadge","installedInfo","RefreshCw","Check","SkillHubCard","onInstall","onUninstall","onViewDetails","isInstalling","setCliMode","localInstalling","setLocalInstalling","isRemote","isInstalled","handleInstall","handleUninstall","handleViewDetails","Download","CliModeToggle","tag","Clock","z.object","z.string","z.enum","z.number","SkillGrid","skills","SkillsManagerPage","searchParams","useSearchParams","initialLocationFilter","searchQuery","setSearchQuery","categoryFilter","setCategoryFilter","sourceFilter","setSourceFilter","enabledFilter","setEnabledFilter","viewMode","setViewMode","showDisabledSection","setShowDisabledSection","confirmDisable","setConfirmDisable","confirmDelete","setConfirmDelete","locationFilter","setLocationFilter","hubTab","setHubTab","hubSearchQuery","setHubSearchQuery","hubCategoryFilter","setHubCategoryFilter","installingSkillId","setInstallingSkillId","isCreateDialogOpen","setIsCreateDialogOpen","selectedSkill","setSelectedSkill","isDetailLoading","setIsDetailLoading","isDetailPanelOpen","setIsDetailPanelOpen","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","categories","projectSkills","userSkills","refetch","useSkills","toggleSkill","deleteSkill","isDeleting","useSkillMutations","remoteSkills","localSkills","installedSkills","hubStats","isHubLoading","isHubError","isHubFetching","refetchHub","installSkillMutation","uninstallSkillMutation","installedMap","map","hubCategories","cats","_d","filterHubSkills","matchesSearch","matchesCategory","filteredHubSkills","handleHubInstall","errorMessage","handleHubUninstall","filteredSkills","currentLocationEnabledCount","currentLocationTotalCount","currentLocationDisabledCount","skillIdentifier","handleToggleWithConfirm","handleConfirmDisable","handleConfirmDelete","handleSkillClick","fetchSkillDetail","handleCloseDetailPanel","Minimize2","Plus","AlertCircle","TabsNavigation","v","_e","_f","_g","_h","Search","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","cat","skillSource","List","Grid3x3","EyeOff","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,2]}