cognova 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/-AsXrBBy.js +1 -0
- package/.output/public/_nuxt/2W1RPpXM.js +71 -0
- package/.output/public/_nuxt/{C4pxqdgg.js → 5UFq_rDn.js} +1 -1
- package/.output/public/_nuxt/5Zh-9l8_.js +1 -0
- package/.output/public/_nuxt/{DK9jxJ0g.js → 90UksHlj.js} +1 -1
- package/.output/public/_nuxt/{9IQmsEjr.js → 9QKmiSP_.js} +1 -1
- package/.output/public/_nuxt/{BOj6t-oo.js → ARbTpeGy.js} +1 -1
- package/.output/public/_nuxt/{DyRelyfs.js → ApfLnl06.js} +1 -1
- package/.output/public/_nuxt/{DznawRFW.js → B-2BuR5g.js} +1 -1
- package/.output/public/_nuxt/B4u7Mczo.js +1 -0
- package/.output/public/_nuxt/{DAQhmSv4.js → B5dI_yLq.js} +1 -1
- package/.output/public/_nuxt/{Bm9LyG4F.js → B6fnZcA6.js} +1 -1
- package/.output/public/_nuxt/{9QnH0xQM.js → B7uMSBlN.js} +1 -1
- package/.output/public/_nuxt/BBiRyPlN.js +1 -0
- package/.output/public/_nuxt/{iBGCpHdw.js → BF7413u4.js} +2 -2
- package/.output/public/_nuxt/{4MiwzAAt.js → BGtUoCgi.js} +2 -2
- package/.output/public/_nuxt/{CxuZBC8n.js → BHe4VLtR.js} +1 -1
- package/.output/public/_nuxt/{D3RiUGdz.js → BIMBp1Tj.js} +1 -1
- package/.output/public/_nuxt/{g20UHUCv.js → BIvPdoE3.js} +1 -1
- package/.output/public/_nuxt/BKaRtCjP.js +1 -0
- package/.output/public/_nuxt/BLmc9T7l.js +1 -0
- package/.output/public/_nuxt/BMdnU6BF.js +1 -0
- package/.output/public/_nuxt/{CKkC3Ptm.js → BOgdaA_8.js} +1 -1
- package/.output/public/_nuxt/{BffWCM73.js → BQZfTrUg.js} +1 -1
- package/.output/public/_nuxt/BQnublTW.js +1 -0
- package/.output/public/_nuxt/BSsvedap.js +1 -0
- package/.output/public/_nuxt/{Ci7UEZQh.js → BVypxKRT.js} +1 -1
- package/.output/public/_nuxt/{CYP_MLH8.js → BWqJFnZy.js} +1 -1
- package/.output/public/_nuxt/BXxYdXMr.js +1 -0
- package/.output/public/_nuxt/{D_3Rq1BS.js → B_17gAr_.js} +1 -1
- package/.output/public/_nuxt/B_qzFVK_.js +1 -0
- package/.output/public/_nuxt/{BqKFIuRj.js → BbRPwpIX.js} +1 -1
- package/.output/public/_nuxt/BhrzKbv9.js +1 -0
- package/.output/public/_nuxt/{Cqy_L_ip.js → Bl6LNGlA.js} +1 -1
- package/.output/public/_nuxt/{Fukkqjkf.js → BlPToGni.js} +1 -1
- package/.output/public/_nuxt/{DHKLCQRG.js → BlwHr46F.js} +1 -1
- package/.output/public/_nuxt/{C6aqGHu1.js → BnmwiZbF.js} +1 -1
- package/.output/public/_nuxt/BqtxLJaf.js +1 -0
- package/.output/public/_nuxt/{eko-0FUm.js → BrEXdify.js} +1 -1
- package/.output/public/_nuxt/{D3e44mCL.js → BtNnS4m3.js} +1 -1
- package/.output/public/_nuxt/{BCtfQCzC.js → BtVIBBUN.js} +1 -1
- package/.output/public/_nuxt/Bw5h4Jaf.js +1 -0
- package/.output/public/_nuxt/{FvlxxmNk.js → Bwcpy7gC.js} +2 -2
- package/.output/public/_nuxt/{Db2v8O7O.js → C0TUK31m.js} +1 -1
- package/.output/public/_nuxt/C1T4GK6c.js +1 -0
- package/.output/public/_nuxt/C2ANDZen.js +1 -0
- package/.output/public/_nuxt/{CqU2XbzO.js → C2RZSTuy.js} +1 -1
- package/.output/public/_nuxt/C3dYlP5x.js +1 -0
- package/.output/public/_nuxt/{m5kGCDpI.js → C3sh_tLi.js} +3 -3
- package/.output/public/_nuxt/{BjjCvHLT.js → C4zyxZG7.js} +1 -1
- package/.output/public/_nuxt/{C3FxIITy.js → C5I-XBZT.js} +1 -1
- package/.output/public/_nuxt/{yuf23kh9.js → CC4Goztu.js} +1 -1
- package/.output/public/_nuxt/CC77iplr.js +1 -0
- package/.output/public/_nuxt/{xuzLdW-o.js → CFyD2NHP.js} +1 -1
- package/.output/public/_nuxt/{CsJ9KhQ4.js → CGQDTeaO.js} +1 -1
- package/.output/public/_nuxt/{DnjGH3SQ.js → CHpwuMSk.js} +1 -1
- package/.output/public/_nuxt/CLzcRUcs.js +1 -0
- package/.output/public/_nuxt/CM2phu_3.js +1 -0
- package/.output/public/_nuxt/{Cr8ixbr1.js → CQpYRq61.js} +1 -1
- package/.output/public/_nuxt/{C0JKNMDO.js → CUN4bYcg.js} +1 -1
- package/.output/public/_nuxt/{CmzH6R-N.js → CXoITXft.js} +19 -19
- package/.output/public/_nuxt/CYjcQPl-.js +1 -0
- package/.output/public/_nuxt/{DGX0tzL8.js → CZ32KfaS.js} +1 -1
- package/.output/public/_nuxt/CclZMdca.js +1 -0
- package/.output/public/_nuxt/{C69W7k2j.js → CdpT_Vb6.js} +1 -1
- package/.output/public/_nuxt/CflRLvFC.js +1 -0
- package/.output/public/_nuxt/{gBC9k4Qj.js → CkqNv7sq.js} +2 -2
- package/.output/public/_nuxt/ClXDAYjE.js +1 -0
- package/.output/public/_nuxt/CrZGoMo_.js +1 -0
- package/.output/public/_nuxt/{BZXMQuYP.js → CvJtd2Af.js} +1 -1
- package/.output/public/_nuxt/{DKZxeXDQ.js → Cwtd8e-P.js} +1 -1
- package/.output/public/_nuxt/{nIU2F7ia.js → Cx44SSNp.js} +3 -3
- package/.output/public/_nuxt/{BzOqrmGa.js → CxEVzuCn.js} +3 -3
- package/.output/public/_nuxt/{Dy_Cq5LQ.js → CzIMQevQ.js} +1 -1
- package/.output/public/_nuxt/{D6t3dcTl.js → D0P9llU7.js} +1 -1
- package/.output/public/_nuxt/{JJ3634gV.js → D1DYuOOm.js} +1 -1
- package/.output/public/_nuxt/{BAIz-dEB.js → D1dDc8Vw.js} +1 -1
- package/.output/public/_nuxt/{DSRrg8JT.js → D1r0uqf3.js} +1 -1
- package/.output/public/_nuxt/{CNnJrDvu.js → D3a8R1T6.js} +1 -1
- package/.output/public/_nuxt/{B1X4Bzcy.js → D5EZbuub.js} +1 -1
- package/.output/public/_nuxt/D9V13KTK.js +1 -0
- package/.output/public/_nuxt/DAE2hbP7.js +1 -0
- package/.output/public/_nuxt/{Cvp7FI3T.js → DAIbdyS6.js} +1 -1
- package/.output/public/_nuxt/{EuOqK1A6.js → DAvlXjt0.js} +1 -1
- package/.output/public/_nuxt/DBKzwexZ.js +1 -0
- package/.output/public/_nuxt/{wCGVE8_e.js → DEATxnaF.js} +1 -1
- package/.output/public/_nuxt/{cABRLVee.js → DFg8PvHV.js} +1 -1
- package/.output/public/_nuxt/DM4MyqI-.js +1 -0
- package/.output/public/_nuxt/{Cdt3I3Go.js → DNE7kw9s.js} +1 -1
- package/.output/public/_nuxt/DO0oG4fG.js +1 -0
- package/.output/public/_nuxt/{B6S_ob86.js → DPFugPaB.js} +1 -1
- package/.output/public/_nuxt/{DJjDvbZE.js → DQlXU6_H.js} +1 -1
- package/.output/public/_nuxt/DQvuQpwh.js +1 -0
- package/.output/public/_nuxt/{sf57orEk.js → DRlG_bnX.js} +1 -1
- package/.output/public/_nuxt/{C6RC3lA1.js → DSQj-oMk.js} +1 -1
- package/.output/public/_nuxt/{CeIVm4A3.js → DU6ewLkE.js} +1 -1
- package/.output/public/_nuxt/{Cp2MA0cm.js → DWhzQg7B.js} +1 -1
- package/.output/public/_nuxt/{DJMS2og1.js → D_vK6VPK.js} +1 -1
- package/.output/public/_nuxt/{CihWZmJe.js → DaBp0Gba.js} +2 -2
- package/.output/public/_nuxt/DaH2FbAy.js +1 -0
- package/.output/public/_nuxt/{CtYFj7k1.js → DaJo0CeV.js} +1 -1
- package/.output/public/_nuxt/DauLdT7p.js +1 -0
- package/.output/public/_nuxt/{DG-T44jj.js → DdPA4eTX.js} +1 -1
- package/.output/public/_nuxt/{YuTZB7sD.js → DeAGWdWK.js} +1 -1
- package/.output/public/_nuxt/{CitkKxhw.js → DfF1qofg.js} +1 -1
- package/.output/public/_nuxt/{Daz4MeL6.js → DiGBA-aA.js} +1 -1
- package/.output/public/_nuxt/DiJxF69i.js +1 -0
- package/.output/public/_nuxt/{DIoI0uJm.js → DkBIU-1F.js} +1 -1
- package/.output/public/_nuxt/DmAM6bZ0.js +1 -0
- package/.output/public/_nuxt/DmeAKr3J.js +1 -0
- package/.output/public/_nuxt/DmmTnMzZ.js +1 -0
- package/.output/public/_nuxt/{Lwdv_RKd.js → DqsUSndS.js} +1 -1
- package/.output/public/_nuxt/Dvw-hR3Y.js +1 -0
- package/.output/public/_nuxt/{CVgTJeSq.js → Dz6sfh81.js} +1 -1
- package/.output/public/_nuxt/{BYjadNrw.js → FNhYm5FX.js} +1 -1
- package/.output/public/_nuxt/{Nb2jBtYT.js → HOeKUnra.js} +1 -1
- package/.output/public/_nuxt/{CtchsY6e.js → IR1jkN7B.js} +1 -1
- package/.output/public/_nuxt/{DCzfkCGa.js → MpTk6K7N.js} +1 -1
- package/.output/public/_nuxt/NZ7Wz6LP.js +1 -0
- package/.output/public/_nuxt/{DfQu3kEw.js → PqWbiAD2.js} +1 -1
- package/.output/public/_nuxt/{Jez9DHn7.js → Tu4FhMRc.js} +1 -1
- package/.output/public/_nuxt/{B3y_Qqox.js → UKPXYG4z.js} +1 -1
- package/.output/public/_nuxt/{BlAZO7nq.js → UO2Y9Nve.js} +1 -1
- package/.output/public/_nuxt/{KKK6HVeG.js → XHiJSquP.js} +1 -1
- package/.output/public/_nuxt/YGWAImQo.js +1 -0
- package/.output/public/_nuxt/{ghuJ76mD.js → ZR87XvwB.js} +1 -1
- package/.output/public/_nuxt/{yNrp2XvX.js → _E89BQAO.js} +1 -1
- package/.output/public/_nuxt/{C_BdYLzz.js → aiXk7zRt.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/91727fcc-bf7f-407f-9b1e-092017fcfee0.json +1 -0
- package/.output/public/_nuxt/cL7whuPe.js +1 -0
- package/.output/public/_nuxt/{BasgsT_S.js → ct6_k5IW.js} +1 -1
- package/.output/public/_nuxt/entry._7ZkP07A.css +1 -0
- package/.output/public/_nuxt/{DTDgHTuh.js → fEUQvmn8.js} +2 -2
- package/.output/public/_nuxt/{FNC8XZTk.js → gGlaVUMD.js} +1 -1
- package/.output/public/_nuxt/gjmGkVlL.js +1 -0
- package/.output/public/_nuxt/{IRSbVPIu.js → m5001Uvl.js} +1 -1
- package/.output/public/_nuxt/{_CYZi8HN.js → mQkFCz_M.js} +1 -1
- package/.output/public/_nuxt/{BxXOsXrM.js → p9l1LjVc.js} +10 -10
- package/.output/public/_nuxt/{BsEZoHd1.js → qR_K5W8V.js} +1 -1
- package/.output/public/_nuxt/{BrNqhp1a.js → t_9QQ4MF.js} +7 -7
- package/.output/public/_nuxt/{pcUI-zuY.js → uc4c4mfb.js} +1 -1
- package/.output/public/_nuxt/{usage.vakN1lvi.css → usage.BDeyCZwW.css} +1 -1
- package/.output/public/_nuxt/wPSLEMBw.js +1 -0
- package/.output/public/_nuxt/xKRwul0f.js +1 -0
- package/.output/public/_nuxt/{BWhMnjID.js → xgpiGSxb.js} +1 -1
- package/.output/public/_nuxt/xxnk7j0F.js +1 -0
- package/.output/public/favicon.svg +1 -0
- package/.output/server/chunks/build/A-BWukSPjS.mjs +1 -0
- package/.output/server/chunks/build/Accordion-BaJYea6e.mjs +1 -0
- package/.output/server/chunks/build/AccordionItem-DdG2zgcN.mjs +1 -0
- package/.output/server/chunks/build/Badge-BrU9UkCv.mjs +1 -0
- package/.output/server/chunks/build/Blockquote-DND8wTkU.mjs +1 -0
- package/.output/server/chunks/build/Callout-1halpaEg.mjs +1 -0
- package/.output/server/chunks/build/Card-BHCSDKDt.mjs +1 -0
- package/.output/server/chunks/build/CardGroup-BOuJcNGp.mjs +1 -0
- package/.output/server/chunks/build/Caution-BP3y-TcC.mjs +1 -0
- package/.output/server/chunks/build/Code-B1xkAS5a.mjs +1 -0
- package/.output/server/chunks/build/CodeCollapse-BIhaNa22.mjs +1 -0
- package/.output/server/chunks/build/CodeGroup-BviYyCuo.mjs +1 -0
- package/.output/server/chunks/build/CodeIcon-CWD5HcV7.mjs +2 -1
- package/.output/server/chunks/build/CodePreview-D8PsCQ6m.mjs +1 -0
- package/.output/server/chunks/build/CodeTree-BUTLupmL.mjs +1 -0
- package/.output/server/chunks/build/Collapsible-BIvXNaSq.mjs +1 -0
- package/.output/server/chunks/build/DropdownMenu-BBrV9nXz.mjs +1 -1
- package/.output/server/chunks/build/EditorToolbar-DIfb5arC.mjs +1 -1
- package/.output/server/chunks/build/Em-DsIz_BnD.mjs +1 -0
- package/.output/server/chunks/build/Field-cwwmSQDT.mjs +1 -0
- package/.output/server/chunks/build/FieldGroup-CAIpQv8s.mjs +1 -0
- package/.output/server/chunks/build/H1-BbFNsPyP.mjs +1 -0
- package/.output/server/chunks/build/H2-vHTl_pWr.mjs +1 -0
- package/.output/server/chunks/build/H3-7eTcfO3s.mjs +1 -0
- package/.output/server/chunks/build/H4-C89p_PKO.mjs +1 -0
- package/.output/server/chunks/build/Hr-Bm8RlL3O.mjs +1 -0
- package/.output/server/chunks/build/Icon-Dp9iy0BI.mjs +1 -0
- package/.output/server/chunks/build/Img-CWLmvN1t.mjs +2 -1
- package/.output/server/chunks/build/Kbd-CQG6I_Ch.mjs +1 -0
- package/.output/server/chunks/build/Li-Bw1QUaGv.mjs +1 -0
- package/.output/server/chunks/build/MDC-Dx0YPDhe.mjs +1 -1
- package/.output/server/chunks/build/Note-CHkjm9jm.mjs +1 -0
- package/.output/server/chunks/build/Ol-D-fPnfFM.mjs +1 -0
- package/.output/server/chunks/build/P-B5YI1V9y.mjs +1 -0
- package/.output/server/chunks/build/Pre-ChiJcf3C.mjs +1 -0
- package/.output/server/chunks/build/ProseH5-DahJyv8h.mjs +1 -0
- package/.output/server/chunks/build/ProseH6-C4Is5h6c.mjs +1 -0
- package/.output/server/chunks/build/Select-BB1oLrCD.mjs +1 -1
- package/.output/server/chunks/build/SelectMenu-DPssg6zD.mjs +1 -1
- package/.output/server/chunks/build/Steps-BZpvXfzb.mjs +1 -0
- package/.output/server/chunks/build/Strong-DXJqOWL3.mjs +1 -0
- package/.output/server/chunks/build/Table-BSrLZ7dt.mjs +1 -0
- package/.output/server/chunks/build/Table-DCwTlhCj.mjs +1 -1
- package/.output/server/chunks/build/Tabs-Dk3nvOFF.mjs +1 -0
- package/.output/server/chunks/build/TabsItem-CDhyuBtJ.mjs +1 -0
- package/.output/server/chunks/build/Tbody-CjMT5oH-.mjs +1 -0
- package/.output/server/chunks/build/Td-ZBVaEjFN.mjs +1 -0
- package/.output/server/chunks/build/Th-D317icbd.mjs +1 -0
- package/.output/server/chunks/build/Thead-Ca_ZESTK.mjs +1 -0
- package/.output/server/chunks/build/Tip-CP3oTARR.mjs +1 -0
- package/.output/server/chunks/build/Tooltip-TRyl6dje.mjs +1 -1
- package/.output/server/chunks/build/Tr-6jI8j9gD.mjs +1 -0
- package/.output/server/chunks/build/{docs-Dk2JnYq3.mjs → Tree-DUhXKd8y.mjs} +46 -2235
- package/.output/server/chunks/build/Tree-DUhXKd8y.mjs.map +1 -0
- package/.output/server/chunks/build/Ul-BUGj_CPb.mjs +1 -0
- package/.output/server/chunks/build/Warning-BJ8G6cxC.mjs +1 -0
- package/.output/server/chunks/build/_id_-DN00UDdO.mjs +1 -0
- package/.output/server/chunks/build/_id_-DN00UDdO.mjs.map +1 -1
- package/.output/server/chunks/build/_name_-BnS_KEfX.mjs +1592 -0
- package/.output/server/chunks/build/_name_-BnS_KEfX.mjs.map +1 -0
- package/.output/server/chunks/build/{_uuid_-0UgdUhfY.mjs → _uuid_-DfJaumTE.mjs} +5 -4
- package/.output/server/chunks/build/{_uuid_-0UgdUhfY.mjs.map → _uuid_-DfJaumTE.mjs.map} +1 -1
- package/.output/server/chunks/build/auth-BGPNH2QJ.mjs +20 -0
- package/.output/server/chunks/build/auth-BGPNH2QJ.mjs.map +1 -0
- package/.output/server/chunks/build/auth-CvD7MqKW.mjs +1 -0
- package/.output/server/chunks/build/auth-CvD7MqKW.mjs.map +1 -1
- package/.output/server/chunks/build/chat-CZMiB68R.mjs +1 -0
- package/.output/server/chunks/build/chat-CZMiB68R.mjs.map +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/cookie-C_iulBi6.mjs +1 -1
- package/.output/server/chunks/build/{dashboard-YEscLBQN.mjs → dashboard-CLk1NlbR.mjs} +15 -4
- package/.output/server/chunks/build/dashboard-CLk1NlbR.mjs.map +1 -0
- package/.output/server/chunks/build/{dashboard-CpMVYnDV.mjs → dashboard-CiVTAZuF.mjs} +12 -4
- package/.output/server/chunks/build/{dashboard-CpMVYnDV.mjs.map → dashboard-CiVTAZuF.mjs.map} +1 -1
- package/.output/server/chunks/build/docs-ChGwOPg5.mjs +2204 -0
- package/.output/server/chunks/build/docs-ChGwOPg5.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-BzbcNcdU.mjs +1 -0
- package/.output/server/chunks/build/error-500-uCDjGRW8.mjs +1 -0
- package/.output/server/chunks/build/fetch-BB7Qzkwe.mjs +1 -1
- package/.output/server/chunks/build/{hooks-DP8WoUPS.mjs → hooks-D328DcO6.mjs} +3 -2
- package/.output/server/chunks/build/hooks-D328DcO6.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DVx-QlhP.mjs → index-Byt-3Yq6.mjs} +3 -2
- package/.output/server/chunks/build/{index-DVx-QlhP.mjs.map → index-Byt-3Yq6.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-Ba_bPJgk.mjs → index-C9PuieXh.mjs} +3 -2
- package/.output/server/chunks/build/index-C9PuieXh.mjs.map +1 -0
- package/.output/server/chunks/build/index-C_LcBBgO.mjs +1508 -0
- package/.output/server/chunks/build/index-C_LcBBgO.mjs.map +1 -0
- package/.output/server/chunks/build/index-CxDxc9fm.mjs +1 -1
- package/.output/server/chunks/build/index-DzdvIi8V.mjs +1 -0
- package/.output/server/chunks/build/library-CbWcF5wT.mjs +601 -0
- package/.output/server/chunks/build/library-CbWcF5wT.mjs.map +1 -0
- package/.output/server/chunks/build/{login-BAysbpyX.mjs → login-DnnElTl2.mjs} +15 -7
- package/.output/server/chunks/build/{login-BAysbpyX.mjs.map → login-DnnElTl2.mjs.map} +1 -1
- package/.output/server/chunks/build/memories-BqA719O1.mjs +1 -0
- package/.output/server/chunks/build/memories-BqA719O1.mjs.map +1 -1
- package/.output/server/chunks/build/server.mjs +62 -34
- package/.output/server/chunks/build/server.mjs.map +1 -1
- package/.output/server/chunks/build/settings-DdkKCJ00.mjs +1 -0
- package/.output/server/chunks/build/settings-DdkKCJ00.mjs.map +1 -1
- package/.output/server/chunks/build/styles.mjs +2 -2
- package/.output/server/chunks/build/{tasks-DiOi1HG_.mjs → tasks-DnAFqbtt.mjs} +3 -2
- package/.output/server/chunks/build/tasks-DnAFqbtt.mjs.map +1 -0
- package/.output/server/chunks/build/{usage-H_mcd_fz.mjs → usage-CSrBh4Or.mjs} +159 -44
- package/.output/server/chunks/build/{usage-H_mcd_fz.mjs.map → usage-CSrBh4Or.mjs.map} +1 -1
- package/.output/server/chunks/build/{usePreferences-CzC8fRzd.mjs → usePreferences-DH1QjxOj.mjs} +7 -1
- package/.output/server/chunks/build/usePreferences-DH1QjxOj.mjs.map +1 -0
- package/.output/server/chunks/build/{view-Dc8mvzCB.mjs → view-n2sYa4Zh.mjs} +4 -3
- package/.output/server/chunks/build/{view-Dc8mvzCB.mjs.map → view-n2sYa4Zh.mjs.map} +1 -1
- package/.output/server/chunks/build/virtual_nuxt__Users_tony_Documents_GitHub_second-brain_node_modules_.cache_nuxt_.nuxt_mdc-imports-PtwWlZ2H.mjs +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1247 -824
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/_ws/chat.mjs +2 -1
- package/.output/server/chunks/routes/_ws/chat.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/cancel.post.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/cancel.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/run.post.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/run.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/runs.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/runs.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/_id_.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/agents/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/agents/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/_...all_.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/_...all_.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/conversations/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/conversations/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/dashboard/overview.get.mjs +1 -0
- package/.output/server/chunks/routes/api/dashboard/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/_id/public.get.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/_id/public.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/_id/restore.post.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/_id/restore.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/by-path.post.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/by-path.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/documents/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/documents/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/delete.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/delete.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/list.get.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/list.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/mkdir.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/mkdir.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/move.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/move.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/read.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/read.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/rename.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/rename.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/fs/write.post.mjs +1 -0
- package/.output/server/chunks/routes/api/fs/write.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/home.get.mjs +1 -0
- package/.output/server/chunks/routes/api/home.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/hooks/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/hooks/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get6.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get7.mjs +40 -38
- package/.output/server/chunks/routes/api/index.get7.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get8.mjs +33 -38
- package/.output/server/chunks/routes/api/index.get8.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get9.mjs +83 -0
- package/.output/server/chunks/routes/api/index.get9.mjs.map +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -0
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/context.get.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/extract.post.mjs +2 -1
- package/.output/server/chunks/routes/api/memory/extract.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/search.get.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/memory/store.post.mjs +1 -0
- package/.output/server/chunks/routes/api/memory/store.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/secrets/_key_.put.mjs +1 -0
- package/.output/server/chunks/routes/api/secrets/_key_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/skills/_name/export.get.mjs +72 -0
- package/.output/server/chunks/routes/api/skills/_name/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/create.post.mjs +73 -0
- package/.output/server/chunks/routes/api/skills/_name/files/create.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/delete.post.mjs +71 -0
- package/.output/server/chunks/routes/api/skills/_name/files/delete.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/read.post.mjs +69 -0
- package/.output/server/chunks/routes/api/skills/_name/files/read.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/files/write.post.mjs +69 -0
- package/.output/server/chunks/routes/api/skills/_name/files/write.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/index.get.mjs +60 -0
- package/.output/server/chunks/routes/api/skills/_name/index.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/rename.post.mjs +87 -0
- package/.output/server/chunks/routes/api/skills/_name/rename.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/_name/toggle.post.mjs +62 -0
- package/.output/server/chunks/routes/api/skills/_name/toggle.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/create.post.mjs +79 -0
- package/.output/server/chunks/routes/api/skills/create.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/generate.post.mjs +143 -0
- package/.output/server/chunks/routes/api/skills/generate.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/import.post.mjs +96 -0
- package/.output/server/chunks/routes/api/skills/import.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/index.get.mjs +82 -0
- package/.output/server/chunks/routes/api/skills/index.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/index.get2.mjs +83 -0
- package/.output/server/chunks/routes/api/skills/index.get2.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/library/check-updates.get.mjs +72 -0
- package/.output/server/chunks/routes/api/skills/library/check-updates.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/skills/library/install.post.mjs +90 -0
- package/.output/server/chunks/routes/api/skills/library/install.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/tasks/_id/restore.post.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/_id/restore.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/index.put.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/index.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tasks/tags.get.mjs +1 -0
- package/.output/server/chunks/routes/api/tasks/tags.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/usage/stats.get.mjs +4 -1
- package/.output/server/chunks/routes/api/usage/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/user/email.patch.mjs +2 -1
- package/.output/server/chunks/routes/api/user/email.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/notifications.mjs +2 -1
- package/.output/server/chunks/routes/notifications.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/routes/terminal.mjs +2 -1
- package/.output/server/chunks/routes/terminal.mjs.map +1 -1
- package/.output/server/index.mjs +2 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/adm-zip/adm-zip.js +949 -0
- package/.output/server/node_modules/adm-zip/headers/entryHeader.js +374 -0
- package/.output/server/node_modules/adm-zip/headers/index.js +2 -0
- package/.output/server/node_modules/adm-zip/headers/mainHeader.js +130 -0
- package/.output/server/node_modules/adm-zip/methods/deflater.js +33 -0
- package/.output/server/node_modules/adm-zip/methods/index.js +3 -0
- package/.output/server/node_modules/adm-zip/methods/inflater.js +34 -0
- package/.output/server/node_modules/adm-zip/methods/zipcrypto.js +175 -0
- package/.output/server/node_modules/adm-zip/package.json +49 -0
- package/.output/server/node_modules/adm-zip/util/constants.js +142 -0
- package/.output/server/node_modules/adm-zip/util/decoder.js +5 -0
- package/.output/server/node_modules/adm-zip/util/errors.js +63 -0
- package/.output/server/node_modules/adm-zip/util/fattr.js +76 -0
- package/.output/server/node_modules/adm-zip/util/index.js +5 -0
- package/.output/server/node_modules/adm-zip/util/utils.js +336 -0
- package/.output/server/node_modules/adm-zip/zipEntry.js +405 -0
- package/.output/server/node_modules/adm-zip/zipFile.js +446 -0
- package/.output/server/package.json +2 -1
- package/Claude/CLAUDE.md +9 -4
- package/Claude/skills/environment/SKILL.md +6 -0
- package/Claude/skills/memory/SKILL.md +6 -0
- package/Claude/skills/project/SKILL.md +6 -0
- package/Claude/skills/secret/SKILL.md +85 -0
- package/Claude/skills/secret/secret.py +146 -0
- package/Claude/skills/skill-creator/SKILL.md +30 -0
- package/Claude/skills/task/SKILL.md +6 -0
- package/README.md +3 -0
- package/app/app.vue +1 -1
- package/app/components/dashboard/StatCards.vue +21 -2
- package/app/components/skills/Card.vue +82 -0
- package/app/components/skills/CreateModal.vue +156 -0
- package/app/components/skills/Editor.vue +135 -0
- package/app/components/skills/FileTree.vue +336 -0
- package/app/components/skills/LibraryCard.vue +122 -0
- package/app/components/skills/RenameModal.vue +84 -0
- package/app/components/usage/UsageCostChart.client.vue +59 -23
- package/app/components/usage/UsageCostChart.server.vue +1 -0
- package/app/components/usage/UsageSourceDonut.client.vue +17 -5
- package/app/components/usage/UsageSourceDonut.server.vue +1 -0
- package/app/components/usage/UsageTopConsumers.vue +13 -3
- package/app/composables/usePreferences.ts +9 -1
- package/app/layouts/auth.vue +0 -10
- package/app/layouts/dashboard.vue +7 -0
- package/app/pages/login.vue +18 -8
- package/app/pages/skills/[name].vue +210 -0
- package/app/pages/skills/index.vue +204 -0
- package/app/pages/skills/library.vue +209 -0
- package/app/pages/usage.vue +43 -16
- package/dist/cli/index.js +35 -36
- package/nuxt.config.ts +9 -0
- package/package.json +5 -3
- package/server/api/skills/[name]/export.get.ts +45 -0
- package/server/api/skills/[name]/files/create.post.ts +45 -0
- package/server/api/skills/[name]/files/delete.post.ts +45 -0
- package/server/api/skills/[name]/files/index.get.ts +28 -0
- package/server/api/skills/[name]/files/read.post.ts +41 -0
- package/server/api/skills/[name]/files/write.post.ts +42 -0
- package/server/api/skills/[name]/index.get.ts +54 -0
- package/server/api/skills/[name]/rename.post.ts +64 -0
- package/server/api/skills/[name]/toggle.post.ts +32 -0
- package/server/api/skills/create.post.ts +51 -0
- package/server/api/skills/generate.post.ts +126 -0
- package/server/api/skills/import.post.ts +87 -0
- package/server/api/skills/index.get.ts +57 -0
- package/server/api/skills/library/check-updates.get.ts +46 -0
- package/server/api/skills/library/index.get.ts +56 -0
- package/server/api/skills/library/install.post.ts +73 -0
- package/server/api/usage/stats.get.ts +4 -2
- package/server/db/schema.ts +17 -0
- package/server/drizzle/migrations/0012_good_deadpool.sql +12 -0
- package/server/drizzle/migrations/0013_swift_snowbird.sql +1 -0
- package/server/drizzle/migrations/meta/0012_snapshot.json +1713 -0
- package/server/drizzle/migrations/meta/0013_snapshot.json +1720 -0
- package/server/drizzle/migrations/meta/_journal.json +14 -0
- package/server/middleware/auth.ts +0 -1
- package/server/plugins/05.skills-catalog.ts +105 -0
- package/server/utils/skills-path.ts +197 -0
- package/shared/types/index.ts +65 -1
- package/.output/public/_nuxt/5ZXA0Ckq.js +0 -1
- package/.output/public/_nuxt/BIIJhjQO.js +0 -1
- package/.output/public/_nuxt/BIckl6wA.js +0 -1
- package/.output/public/_nuxt/BJ3o57WW.js +0 -1
- package/.output/public/_nuxt/BNetzZzF.js +0 -1
- package/.output/public/_nuxt/BS0ofHJK.js +0 -1
- package/.output/public/_nuxt/B_3_hrpn.js +0 -1
- package/.output/public/_nuxt/BaBZjmMC.js +0 -1
- package/.output/public/_nuxt/BaMqDm5u.js +0 -1
- package/.output/public/_nuxt/BhzMoffi.js +0 -1
- package/.output/public/_nuxt/BlhFigLL.js +0 -1
- package/.output/public/_nuxt/BoIxv-gM.js +0 -1
- package/.output/public/_nuxt/Br19oYkq.js +0 -1
- package/.output/public/_nuxt/C0kh_F7v.js +0 -1
- package/.output/public/_nuxt/C61KgSco.js +0 -1
- package/.output/public/_nuxt/CJUdYEdO.js +0 -1
- package/.output/public/_nuxt/CVJQGP1Q.js +0 -1
- package/.output/public/_nuxt/CWMUi89H.js +0 -1
- package/.output/public/_nuxt/Cdu2qGgq.js +0 -1
- package/.output/public/_nuxt/CeIu7z4p.js +0 -1
- package/.output/public/_nuxt/D2689qk4.js +0 -1
- package/.output/public/_nuxt/D31L7Ks6.js +0 -1
- package/.output/public/_nuxt/DB359q8R.js +0 -1
- package/.output/public/_nuxt/DHG66LPS.js +0 -1
- package/.output/public/_nuxt/DJ5V-y_x.js +0 -1
- package/.output/public/_nuxt/DLETdGFL.js +0 -1
- package/.output/public/_nuxt/DOICd-Ld.js +0 -1
- package/.output/public/_nuxt/DPEcH-gi.js +0 -65
- package/.output/public/_nuxt/Db8-_gO7.js +0 -1
- package/.output/public/_nuxt/DgV-EDJ9.js +0 -1
- package/.output/public/_nuxt/Dp2X5R2m.js +0 -1
- package/.output/public/_nuxt/DqB723Z0.js +0 -1
- package/.output/public/_nuxt/Q8Ps7oN5.js +0 -1
- package/.output/public/_nuxt/SXTDhzp6.js +0 -1
- package/.output/public/_nuxt/Sg2Lwc46.js +0 -1
- package/.output/public/_nuxt/_J_7XIn-.js +0 -1
- package/.output/public/_nuxt/builds/meta/a1e9100c-1a4f-4f7e-bb53-9dbe0d07effb.json +0 -1
- package/.output/public/_nuxt/entry.CGxIBGAf.css +0 -1
- package/.output/public/_nuxt/inmzPrjz.js +0 -1
- package/.output/public/_nuxt/oIX-ZDN6.js +0 -1
- package/.output/server/chunks/build/auth-CDHRohj4.mjs +0 -77
- package/.output/server/chunks/build/auth-CDHRohj4.mjs.map +0 -1
- package/.output/server/chunks/build/dashboard-YEscLBQN.mjs.map +0 -1
- package/.output/server/chunks/build/docs-Dk2JnYq3.mjs.map +0 -1
- package/.output/server/chunks/build/hooks-DP8WoUPS.mjs.map +0 -1
- package/.output/server/chunks/build/index-Ba_bPJgk.mjs.map +0 -1
- package/.output/server/chunks/build/tasks-DiOi1HG_.mjs.map +0 -1
- package/.output/server/chunks/build/usePreferences-CzC8fRzd.mjs.map +0 -1
- /package/.output/public/_nuxt/{useCopyToClipboard.Be_IvFWy.css → CodeEditor.Be_IvFWy.css} +0 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SkillCatalogItem } from '~~/shared/types'
|
|
3
|
+
|
|
4
|
+
definePageMeta({
|
|
5
|
+
layout: 'dashboard',
|
|
6
|
+
middleware: 'auth'
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
const toast = useToast()
|
|
10
|
+
const skills = ref<SkillCatalogItem[]>([])
|
|
11
|
+
const loading = ref(true)
|
|
12
|
+
const installing = ref<string | null>(null)
|
|
13
|
+
const search = ref('')
|
|
14
|
+
const activeTag = ref<string | null>(null)
|
|
15
|
+
|
|
16
|
+
// Collect all unique tags across skills
|
|
17
|
+
const allTags = computed(() => {
|
|
18
|
+
const tagSet = new Set<string>()
|
|
19
|
+
for (const s of skills.value) {
|
|
20
|
+
for (const t of s.tags) tagSet.add(t)
|
|
21
|
+
}
|
|
22
|
+
return [...tagSet].sort()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const filteredSkills = computed(() => {
|
|
26
|
+
let result = skills.value
|
|
27
|
+
|
|
28
|
+
if (activeTag.value) {
|
|
29
|
+
result = result.filter(s => s.tags.includes(activeTag.value!))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (search.value.trim()) {
|
|
33
|
+
const q = search.value.toLowerCase()
|
|
34
|
+
result = result.filter(s =>
|
|
35
|
+
s.name.toLowerCase().includes(q)
|
|
36
|
+
|| s.description.toLowerCase().includes(q)
|
|
37
|
+
|| s.author.toLowerCase().includes(q)
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return result
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
function toggleTag(tag: string) {
|
|
45
|
+
activeTag.value = activeTag.value === tag ? null : tag
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function loadLibrary() {
|
|
49
|
+
loading.value = true
|
|
50
|
+
try {
|
|
51
|
+
const res = await $fetch<{ data: SkillCatalogItem[] }>('/api/skills/library')
|
|
52
|
+
skills.value = res.data
|
|
53
|
+
} catch {
|
|
54
|
+
toast.add({ title: 'Failed to load skills library', color: 'error' })
|
|
55
|
+
} finally {
|
|
56
|
+
loading.value = false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function handleInstall(name: string) {
|
|
61
|
+
installing.value = name
|
|
62
|
+
try {
|
|
63
|
+
await $fetch('/api/skills/library/install', {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
body: { name }
|
|
66
|
+
})
|
|
67
|
+
toast.add({ title: `Installed ${name}`, color: 'success' })
|
|
68
|
+
await loadLibrary()
|
|
69
|
+
} catch (e: unknown) {
|
|
70
|
+
const message = e instanceof Error ? e.message : 'Failed to install skill'
|
|
71
|
+
toast.add({ title: message, color: 'error' })
|
|
72
|
+
} finally {
|
|
73
|
+
installing.value = null
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function handleUpdate(name: string) {
|
|
78
|
+
installing.value = name
|
|
79
|
+
try {
|
|
80
|
+
// Remove existing first
|
|
81
|
+
await $fetch(`/api/skills/${name}/files/delete`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
body: { path: '.' }
|
|
84
|
+
}).catch(() => {})
|
|
85
|
+
|
|
86
|
+
await $fetch('/api/skills/library/install', {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
body: { name }
|
|
89
|
+
})
|
|
90
|
+
toast.add({ title: `Updated ${name}`, color: 'success' })
|
|
91
|
+
await loadLibrary()
|
|
92
|
+
} catch {
|
|
93
|
+
toast.add({ title: `Failed to update ${name}`, color: 'error' })
|
|
94
|
+
} finally {
|
|
95
|
+
installing.value = null
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
onMounted(() => loadLibrary())
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<div class="flex flex-1 min-w-0">
|
|
104
|
+
<UDashboardPanel
|
|
105
|
+
id="skills-library"
|
|
106
|
+
grow
|
|
107
|
+
>
|
|
108
|
+
<template #header>
|
|
109
|
+
<UDashboardNavbar title="Skills Library">
|
|
110
|
+
<template #right>
|
|
111
|
+
<UInput
|
|
112
|
+
v-model="search"
|
|
113
|
+
icon="i-lucide-search"
|
|
114
|
+
placeholder="Search library..."
|
|
115
|
+
size="sm"
|
|
116
|
+
class="w-48"
|
|
117
|
+
/>
|
|
118
|
+
<NuxtLink to="/skills">
|
|
119
|
+
<UButton
|
|
120
|
+
icon="i-lucide-arrow-left"
|
|
121
|
+
variant="ghost"
|
|
122
|
+
color="neutral"
|
|
123
|
+
size="sm"
|
|
124
|
+
>
|
|
125
|
+
My Skills
|
|
126
|
+
</UButton>
|
|
127
|
+
</NuxtLink>
|
|
128
|
+
</template>
|
|
129
|
+
</UDashboardNavbar>
|
|
130
|
+
</template>
|
|
131
|
+
|
|
132
|
+
<template #body>
|
|
133
|
+
<div class="p-4">
|
|
134
|
+
<!-- Tag filter bar -->
|
|
135
|
+
<div
|
|
136
|
+
v-if="allTags.length > 0 && !loading"
|
|
137
|
+
class="flex flex-wrap gap-1.5 mb-4"
|
|
138
|
+
>
|
|
139
|
+
<UButton
|
|
140
|
+
v-for="tag in allTags"
|
|
141
|
+
:key="tag"
|
|
142
|
+
size="xs"
|
|
143
|
+
:variant="activeTag === tag ? 'solid' : 'outline'"
|
|
144
|
+
:color="tag === 'official' ? 'primary' : 'neutral'"
|
|
145
|
+
@click="toggleTag(tag)"
|
|
146
|
+
>
|
|
147
|
+
{{ tag }}
|
|
148
|
+
</UButton>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<!-- Loading -->
|
|
152
|
+
<div
|
|
153
|
+
v-if="loading"
|
|
154
|
+
class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3"
|
|
155
|
+
>
|
|
156
|
+
<div
|
|
157
|
+
v-for="i in 6"
|
|
158
|
+
:key="i"
|
|
159
|
+
class="p-4 rounded-lg border border-default bg-elevated/50"
|
|
160
|
+
>
|
|
161
|
+
<USkeleton class="h-4 w-24 mb-2" />
|
|
162
|
+
<USkeleton class="h-3 w-full mb-1" />
|
|
163
|
+
<USkeleton class="h-3 w-2/3" />
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- Empty -->
|
|
168
|
+
<div
|
|
169
|
+
v-else-if="skills.length === 0"
|
|
170
|
+
class="flex flex-col items-center justify-center py-16 text-dimmed"
|
|
171
|
+
>
|
|
172
|
+
<UIcon
|
|
173
|
+
name="i-lucide-library"
|
|
174
|
+
class="size-12 mb-4"
|
|
175
|
+
/>
|
|
176
|
+
<p class="text-lg font-medium">
|
|
177
|
+
No community skills available
|
|
178
|
+
</p>
|
|
179
|
+
<p class="text-sm mt-1">
|
|
180
|
+
The skills registry is empty or hasn't synced yet.
|
|
181
|
+
</p>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<!-- No results -->
|
|
185
|
+
<div
|
|
186
|
+
v-else-if="filteredSkills.length === 0"
|
|
187
|
+
class="text-center py-12 text-muted text-sm"
|
|
188
|
+
>
|
|
189
|
+
No skills matching {{ activeTag ? `"${activeTag}"` : '' }} {{ search ? `"${search}"` : '' }}
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<!-- Grid -->
|
|
193
|
+
<div
|
|
194
|
+
v-else
|
|
195
|
+
class="grid gap-4 sm:grid-cols-2 lg:grid-cols-3"
|
|
196
|
+
>
|
|
197
|
+
<SkillsLibraryCard
|
|
198
|
+
v-for="skill in filteredSkills"
|
|
199
|
+
:key="skill.name"
|
|
200
|
+
:skill="skill"
|
|
201
|
+
@install="handleInstall"
|
|
202
|
+
@update="handleUpdate"
|
|
203
|
+
/>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
</template>
|
|
207
|
+
</UDashboardPanel>
|
|
208
|
+
</div>
|
|
209
|
+
</template>
|
package/app/pages/usage.vue
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import type { StatsPeriod, UsageStats } from '~~/shared/types'
|
|
2
|
+
import type { StatsPeriod, UsageStats, UsageDisplayMode } from '~~/shared/types'
|
|
3
3
|
|
|
4
4
|
definePageMeta({
|
|
5
5
|
layout: 'dashboard',
|
|
6
6
|
middleware: 'auth'
|
|
7
7
|
})
|
|
8
8
|
|
|
9
|
-
const { usageStatsPeriod } = usePreferences()
|
|
9
|
+
const { usageStatsPeriod, usageDisplayMode } = usePreferences()
|
|
10
10
|
const period = ref<StatsPeriod>(usageStatsPeriod.value)
|
|
11
|
+
const displayMode = ref<UsageDisplayMode>(usageDisplayMode.value)
|
|
11
12
|
const granularity = ref<'daily' | 'hourly'>('daily')
|
|
12
13
|
const stats = ref<UsageStats | null>(null)
|
|
13
14
|
const loading = ref(false)
|
|
@@ -18,6 +19,11 @@ const periodOptions = [
|
|
|
18
19
|
{ label: '30d', value: '30d' as StatsPeriod }
|
|
19
20
|
]
|
|
20
21
|
|
|
22
|
+
const displayModeOptions = [
|
|
23
|
+
{ label: 'Tokens', value: 'tokens' as UsageDisplayMode },
|
|
24
|
+
{ label: 'Cost', value: 'cost' as UsageDisplayMode }
|
|
25
|
+
]
|
|
26
|
+
|
|
21
27
|
async function loadStats() {
|
|
22
28
|
loading.value = true
|
|
23
29
|
try {
|
|
@@ -41,6 +47,10 @@ watch(period, (value) => {
|
|
|
41
47
|
loadStats()
|
|
42
48
|
})
|
|
43
49
|
|
|
50
|
+
watch(displayMode, (value) => {
|
|
51
|
+
usageDisplayMode.value = value
|
|
52
|
+
})
|
|
53
|
+
|
|
44
54
|
watch(granularity, () => {
|
|
45
55
|
loadStats()
|
|
46
56
|
})
|
|
@@ -59,18 +69,32 @@ onMounted(() => {
|
|
|
59
69
|
<template #header>
|
|
60
70
|
<UDashboardNavbar title="Token Usage">
|
|
61
71
|
<template #right>
|
|
62
|
-
<
|
|
63
|
-
<
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
<div class="flex items-center gap-4">
|
|
73
|
+
<UFieldGroup>
|
|
74
|
+
<UButton
|
|
75
|
+
v-for="opt in displayModeOptions"
|
|
76
|
+
:key="opt.value"
|
|
77
|
+
:color="displayMode === opt.value ? 'primary' : 'neutral'"
|
|
78
|
+
:variant="displayMode === opt.value ? 'solid' : 'ghost'"
|
|
79
|
+
size="sm"
|
|
80
|
+
@click="displayMode = opt.value"
|
|
81
|
+
>
|
|
82
|
+
{{ opt.label }}
|
|
83
|
+
</UButton>
|
|
84
|
+
</UFieldGroup>
|
|
85
|
+
<UFieldGroup>
|
|
86
|
+
<UButton
|
|
87
|
+
v-for="opt in periodOptions"
|
|
88
|
+
:key="opt.value"
|
|
89
|
+
:color="period === opt.value ? 'primary' : 'neutral'"
|
|
90
|
+
:variant="period === opt.value ? 'solid' : 'ghost'"
|
|
91
|
+
size="sm"
|
|
92
|
+
@click="period = opt.value"
|
|
93
|
+
>
|
|
94
|
+
{{ opt.label }}
|
|
95
|
+
</UButton>
|
|
96
|
+
</UFieldGroup>
|
|
97
|
+
</div>
|
|
74
98
|
</template>
|
|
75
99
|
</UDashboardNavbar>
|
|
76
100
|
</template>
|
|
@@ -86,19 +110,22 @@ onMounted(() => {
|
|
|
86
110
|
v-if="stats && stats.dailyUsage.length > 0"
|
|
87
111
|
v-model:granularity="granularity"
|
|
88
112
|
:data="stats.dailyUsage"
|
|
89
|
-
|
|
113
|
+
:display-mode="displayMode"
|
|
114
|
+
:title="displayMode === 'tokens' ? 'Tokens Over Time' : 'Cost Over Time'"
|
|
90
115
|
/>
|
|
91
116
|
|
|
92
117
|
<div class="grid gap-6 lg:grid-cols-2">
|
|
93
118
|
<UsageSourceDonut
|
|
94
119
|
v-if="stats && stats.bySource.length > 0"
|
|
95
120
|
:data="stats.bySource"
|
|
96
|
-
|
|
121
|
+
:display-mode="displayMode"
|
|
122
|
+
:title="displayMode === 'tokens' ? 'Tokens by Source' : 'Cost by Source'"
|
|
97
123
|
/>
|
|
98
124
|
|
|
99
125
|
<UsageTopConsumers
|
|
100
126
|
v-if="stats && stats.topConsumers.length > 0"
|
|
101
127
|
:data="stats.topConsumers"
|
|
128
|
+
:display-mode="displayMode"
|
|
102
129
|
title="Top Consumers"
|
|
103
130
|
/>
|
|
104
131
|
</div>
|
package/dist/cli/index.js
CHANGED
|
@@ -154,11 +154,6 @@ var require_src = __commonJS({
|
|
|
154
154
|
}
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
// src/index.ts
|
|
158
|
-
import { readFileSync as readFileSync4 } from "fs";
|
|
159
|
-
import { join as join11, dirname as dirname2 } from "path";
|
|
160
|
-
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
161
|
-
|
|
162
157
|
// src/commands/init.ts
|
|
163
158
|
import { execSync as execSync5 } from "child_process";
|
|
164
159
|
import { join as join7 } from "path";
|
|
@@ -1357,6 +1352,14 @@ var __dirname = dirname(__filename);
|
|
|
1357
1352
|
function getPackageDir() {
|
|
1358
1353
|
return join(__dirname, "..", "..");
|
|
1359
1354
|
}
|
|
1355
|
+
function getPackageVersion() {
|
|
1356
|
+
try {
|
|
1357
|
+
const pkg = JSON.parse(readFileSync(join(getPackageDir(), "package.json"), "utf-8"));
|
|
1358
|
+
return pkg.version || "0.0.0";
|
|
1359
|
+
} catch {
|
|
1360
|
+
return "0.0.0";
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1360
1363
|
function getClaudeDir() {
|
|
1361
1364
|
return join(homedir(), ".claude");
|
|
1362
1365
|
}
|
|
@@ -1694,6 +1697,7 @@ You run as a persistent service managed by PM2. Your conversations are streamed
|
|
|
1694
1697
|
| Task Management | \`/task\` | Create, list, update, complete tasks |
|
|
1695
1698
|
| Project Management | \`/project\` | Organize tasks into projects |
|
|
1696
1699
|
| Memory | \`/memory\` | Search past decisions, store insights |
|
|
1700
|
+
| Secrets | \`/secret\` | Store, retrieve, list, delete encrypted API keys and credentials |
|
|
1697
1701
|
| Environment | \`/environment\` | Check system status, troubleshoot issues |
|
|
1698
1702
|
| Skill Creator | \`/skill-creator\` | Create new Claude Code skills |
|
|
1699
1703
|
|
|
@@ -1749,11 +1753,15 @@ Memory is your most important tool. You are stateless between sessions \u2014 wi
|
|
|
1749
1753
|
**Rule: When in doubt, store it.** A redundant memory is harmless. A forgotten one wastes ${p.userName}'s time.
|
|
1750
1754
|
|
|
1751
1755
|
### Secrets & Sensitive Data
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
-
|
|
1755
|
-
-
|
|
1756
|
+
|
|
1757
|
+
**CRITICAL \u2014 Zero tolerance for leaked secrets:**
|
|
1758
|
+
- NEVER store passwords, tokens, API keys, or credentials in memory, notes, conversation, or any file
|
|
1759
|
+
- NEVER write secrets to files \u2014 use \`/secret set KEY\` or the Cognova settings UI instead
|
|
1760
|
+
- NEVER embed API keys, tokens, or credentials in SKILL.md files or Python scripts when creating or modifying skills \u2014 always use \`get_secret()\` from \`_lib/api.py\`
|
|
1761
|
+
- If ${p.userName} shares a credential in chat, warn them and store it via \`/secret set KEY\` immediately
|
|
1762
|
+
- When you need a token for an integration, check with \`/secret list\` and \`/secret get KEY\` before asking ${p.userName}
|
|
1756
1763
|
- Treat any string that looks like a key, token, or password as sensitive \u2014 do not echo it back
|
|
1764
|
+
- When creating skills that need external API keys, declare them in \`metadata.requires-secrets\` frontmatter and use \`get_secret()\` in the script
|
|
1757
1765
|
|
|
1758
1766
|
### Troubleshooting
|
|
1759
1767
|
- Use \`/environment status\` or \`/environment health\` to diagnose issues
|
|
@@ -2205,7 +2213,7 @@ async function init() {
|
|
|
2205
2213
|
s.start("Installing Claude Code configuration");
|
|
2206
2214
|
await installClaudeConfig(config);
|
|
2207
2215
|
s.stop("Claude config installed to ~/.claude/");
|
|
2208
|
-
writeMetadata(resolvedInstallDir, vault.path,
|
|
2216
|
+
writeMetadata(resolvedInstallDir, vault.path, getPackageVersion());
|
|
2209
2217
|
R2.step(import_picocolors5.default.bold("Setup"));
|
|
2210
2218
|
s.start("Installing dependencies");
|
|
2211
2219
|
execSync5("pnpm install", { cwd: resolvedInstallDir, stdio: "pipe" });
|
|
@@ -2331,25 +2339,24 @@ async function update() {
|
|
|
2331
2339
|
}
|
|
2332
2340
|
if (latestVersion === metadata.version) {
|
|
2333
2341
|
s.stop(`Already on latest version (${metadata.version})`);
|
|
2334
|
-
|
|
2335
|
-
|
|
2342
|
+
Le("Nothing to update.");
|
|
2343
|
+
return;
|
|
2336
2344
|
}
|
|
2345
|
+
s.stop(`Update available: ${metadata.version} \u2192 ${import_picocolors6.default.green(latestVersion)}`);
|
|
2337
2346
|
s.start("Creating backup");
|
|
2338
2347
|
const backupDir = createBackup(installDir);
|
|
2339
2348
|
s.stop("Backup created");
|
|
2340
2349
|
let updateFailed = false;
|
|
2341
2350
|
try {
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
rmSync(tmpDir, { recursive: true, force: true });
|
|
2352
|
-
}
|
|
2351
|
+
s.start("Downloading latest version");
|
|
2352
|
+
const tmpDir = execSync7("mktemp -d", { encoding: "utf-8" }).trim();
|
|
2353
|
+
try {
|
|
2354
|
+
execSync7(`npm pack cognova@${latestVersion} --pack-destination ${tmpDir}`, { stdio: "pipe" });
|
|
2355
|
+
execSync7(`tar -xzf ${tmpDir}/cognova-${latestVersion}.tgz -C ${tmpDir}`, { stdio: "pipe" });
|
|
2356
|
+
copyAppSource(`${tmpDir}/package`, installDir);
|
|
2357
|
+
s.stop("Source files updated");
|
|
2358
|
+
} finally {
|
|
2359
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
2353
2360
|
}
|
|
2354
2361
|
s.start("Syncing Claude config");
|
|
2355
2362
|
syncClaudeConfig(installDir);
|
|
@@ -2387,8 +2394,10 @@ async function update() {
|
|
|
2387
2394
|
process.exit(1);
|
|
2388
2395
|
}
|
|
2389
2396
|
}
|
|
2390
|
-
if (!updateFailed)
|
|
2397
|
+
if (!updateFailed) {
|
|
2398
|
+
writeMetadata(installDir, metadata.vaultPath, latestVersion);
|
|
2391
2399
|
cleanupBackup(backupDir);
|
|
2400
|
+
}
|
|
2392
2401
|
if (updateFailed) {
|
|
2393
2402
|
Le("Update failed. Previous version has been restored. Try again later.");
|
|
2394
2403
|
process.exit(1);
|
|
@@ -2612,18 +2621,8 @@ async function reset() {
|
|
|
2612
2621
|
}
|
|
2613
2622
|
|
|
2614
2623
|
// src/index.ts
|
|
2615
|
-
var __filename2 = fileURLToPath2(import.meta.url);
|
|
2616
|
-
var __dirname2 = dirname2(__filename2);
|
|
2617
|
-
function getVersion() {
|
|
2618
|
-
try {
|
|
2619
|
-
const pkg = JSON.parse(readFileSync4(join11(__dirname2, "..", "..", "package.json"), "utf-8"));
|
|
2620
|
-
return pkg.version || "0.0.0";
|
|
2621
|
-
} catch {
|
|
2622
|
-
return "0.0.0";
|
|
2623
|
-
}
|
|
2624
|
-
}
|
|
2625
2624
|
var HELP_TEXT = `
|
|
2626
|
-
cognova v${
|
|
2625
|
+
cognova v${getPackageVersion()} \u2014 Personal knowledge management with Claude Code
|
|
2627
2626
|
|
|
2628
2627
|
Usage: cognova <command> [options]
|
|
2629
2628
|
|
|
@@ -2720,7 +2719,7 @@ var args = process.argv.slice(2);
|
|
|
2720
2719
|
var command = args.find((a) => !a.startsWith("-"));
|
|
2721
2720
|
var flags = new Set(args.filter((a) => a.startsWith("-")));
|
|
2722
2721
|
if (flags.has("--version") || flags.has("-v")) {
|
|
2723
|
-
console.log(
|
|
2722
|
+
console.log(getPackageVersion());
|
|
2724
2723
|
process.exit(0);
|
|
2725
2724
|
}
|
|
2726
2725
|
if (flags.has("--help") || flags.has("-h")) {
|
package/nuxt.config.ts
CHANGED
|
@@ -10,6 +10,15 @@ export default defineNuxtConfig({
|
|
|
10
10
|
enabled: true
|
|
11
11
|
},
|
|
12
12
|
|
|
13
|
+
app: {
|
|
14
|
+
head: {
|
|
15
|
+
link: [
|
|
16
|
+
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
|
|
17
|
+
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
|
|
13
22
|
css: ['~/assets/css/main.css'],
|
|
14
23
|
|
|
15
24
|
mdc: {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cognova",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.3",
|
|
5
5
|
"description": "Personal knowledge management system with Claude Code integration",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -75,12 +75,14 @@
|
|
|
75
75
|
"@xterm/addon-fit": "^0.11.0",
|
|
76
76
|
"@xterm/addon-web-links": "^0.12.0",
|
|
77
77
|
"@xterm/xterm": "^6.0.0",
|
|
78
|
+
"adm-zip": "^0.5.16",
|
|
78
79
|
"better-auth": "^1.4.17",
|
|
79
80
|
"chokidar": "^5.0.0",
|
|
80
81
|
"codemirror": "^6.0.2",
|
|
81
82
|
"cron": "^4.4.0",
|
|
82
83
|
"date-fns": "^4.1.0",
|
|
83
84
|
"dotenv": "^17.2.3",
|
|
85
|
+
"drizzle-kit": "^0.31.8",
|
|
84
86
|
"drizzle-orm": "^0.45.1",
|
|
85
87
|
"gray-matter": "^4.0.3",
|
|
86
88
|
"node-pty": "^1.1.0",
|
|
@@ -88,11 +90,11 @@
|
|
|
88
90
|
"postgres": "^3.4.8",
|
|
89
91
|
"shiki": "^3.21.0",
|
|
90
92
|
"sortablejs": "^1.15.6",
|
|
91
|
-
"tailwindcss": "^4.0.0"
|
|
92
|
-
"drizzle-kit": "^0.31.8"
|
|
93
|
+
"tailwindcss": "^4.0.0"
|
|
93
94
|
},
|
|
94
95
|
"devDependencies": {
|
|
95
96
|
"@nuxt/eslint": "^1.12.1",
|
|
97
|
+
"@types/adm-zip": "^0.5.7",
|
|
96
98
|
"@types/node": "^25.0.8",
|
|
97
99
|
"@types/sortablejs": "^1.15.9",
|
|
98
100
|
"eslint": "^9.39.2",
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { stat } from 'fs/promises'
|
|
2
|
+
import { join } from 'path'
|
|
3
|
+
import AdmZip from 'adm-zip'
|
|
4
|
+
import { getSkillsDir, getInactiveSkillsDir, validateSkillName } from '~~/server/utils/skills-path'
|
|
5
|
+
|
|
6
|
+
export default defineEventHandler(async (event) => {
|
|
7
|
+
const name = getRouterParam(event, 'name')
|
|
8
|
+
if (!name)
|
|
9
|
+
throw createError({ statusCode: 400, message: 'Skill name required' })
|
|
10
|
+
|
|
11
|
+
const nameError = validateSkillName(name)
|
|
12
|
+
if (nameError)
|
|
13
|
+
throw createError({ statusCode: 400, message: nameError })
|
|
14
|
+
|
|
15
|
+
// Check active first, then inactive
|
|
16
|
+
const activeDir = join(getSkillsDir(), name)
|
|
17
|
+
const inactiveDir = join(getInactiveSkillsDir(), name)
|
|
18
|
+
|
|
19
|
+
let skillDir = ''
|
|
20
|
+
|
|
21
|
+
const activeStat = await stat(activeDir).catch(() => null)
|
|
22
|
+
if (activeStat?.isDirectory()) {
|
|
23
|
+
skillDir = activeDir
|
|
24
|
+
} else {
|
|
25
|
+
const inactiveStat = await stat(inactiveDir).catch(() => null)
|
|
26
|
+
if (inactiveStat?.isDirectory())
|
|
27
|
+
skillDir = inactiveDir
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!skillDir)
|
|
31
|
+
throw createError({ statusCode: 404, message: `Skill '${name}' not found` })
|
|
32
|
+
|
|
33
|
+
const zip = new AdmZip()
|
|
34
|
+
zip.addLocalFolder(skillDir, name, /^(?!.*(__pycache__|\.pyc))/)
|
|
35
|
+
|
|
36
|
+
const buffer = zip.toBuffer()
|
|
37
|
+
|
|
38
|
+
setResponseHeaders(event, {
|
|
39
|
+
'Content-Type': 'application/zip',
|
|
40
|
+
'Content-Disposition': `attachment; filename="${name}.zip"`,
|
|
41
|
+
'Content-Length': String(buffer.length)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
return send(event, buffer)
|
|
45
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { mkdir, writeFile, stat } from 'fs/promises'
|
|
2
|
+
import { join, normalize } from 'path'
|
|
3
|
+
import { getSkillsDir, getInactiveSkillsDir } from '~~/server/utils/skills-path'
|
|
4
|
+
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
const name = getRouterParam(event, 'name')
|
|
7
|
+
if (!name)
|
|
8
|
+
throw createError({ statusCode: 400, message: 'Skill name required' })
|
|
9
|
+
|
|
10
|
+
const body = await readBody<{ path: string, type: 'file' | 'directory' }>(event)
|
|
11
|
+
if (!body?.path)
|
|
12
|
+
throw createError({ statusCode: 400, message: 'Path is required' })
|
|
13
|
+
|
|
14
|
+
const skillDir = await findSkillDir(name)
|
|
15
|
+
if (!skillDir)
|
|
16
|
+
throw createError({ statusCode: 404, message: `Skill '${name}' not found` })
|
|
17
|
+
|
|
18
|
+
const targetPath = normalize(join(skillDir, body.path))
|
|
19
|
+
if (!targetPath.startsWith(skillDir))
|
|
20
|
+
throw createError({ statusCode: 403, message: 'Path traversal not allowed' })
|
|
21
|
+
|
|
22
|
+
const existing = await stat(targetPath).catch(() => null)
|
|
23
|
+
if (existing)
|
|
24
|
+
throw createError({ statusCode: 409, message: 'Already exists' })
|
|
25
|
+
|
|
26
|
+
if (body.type === 'directory') {
|
|
27
|
+
await mkdir(targetPath, { recursive: true })
|
|
28
|
+
} else {
|
|
29
|
+
await writeFile(targetPath, '', 'utf-8')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return { data: { path: body.path, type: body.type || 'file' } }
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
async function findSkillDir(name: string): Promise<string | null> {
|
|
36
|
+
const activeDir = join(getSkillsDir(), name)
|
|
37
|
+
const activeStat = await stat(activeDir).catch(() => null)
|
|
38
|
+
if (activeStat?.isDirectory()) return activeDir
|
|
39
|
+
|
|
40
|
+
const inactiveDir = join(getInactiveSkillsDir(), name)
|
|
41
|
+
const inactiveStat = await stat(inactiveDir).catch(() => null)
|
|
42
|
+
if (inactiveStat?.isDirectory()) return inactiveDir
|
|
43
|
+
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { rm, stat } from 'fs/promises'
|
|
2
|
+
import { join, normalize } from 'path'
|
|
3
|
+
import { getSkillsDir, getInactiveSkillsDir } from '~~/server/utils/skills-path'
|
|
4
|
+
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
const name = getRouterParam(event, 'name')
|
|
7
|
+
if (!name)
|
|
8
|
+
throw createError({ statusCode: 400, message: 'Skill name required' })
|
|
9
|
+
|
|
10
|
+
const body = await readBody<{ path: string }>(event)
|
|
11
|
+
if (!body?.path)
|
|
12
|
+
throw createError({ statusCode: 400, message: 'Path is required' })
|
|
13
|
+
|
|
14
|
+
const skillDir = await findSkillDir(name)
|
|
15
|
+
if (!skillDir)
|
|
16
|
+
throw createError({ statusCode: 404, message: `Skill '${name}' not found` })
|
|
17
|
+
|
|
18
|
+
const targetPath = normalize(join(skillDir, body.path))
|
|
19
|
+
if (!targetPath.startsWith(skillDir))
|
|
20
|
+
throw createError({ statusCode: 403, message: 'Path traversal not allowed' })
|
|
21
|
+
|
|
22
|
+
// Prevent deleting SKILL.md
|
|
23
|
+
if (body.path === 'SKILL.md')
|
|
24
|
+
throw createError({ statusCode: 403, message: 'Cannot delete SKILL.md' })
|
|
25
|
+
|
|
26
|
+
const targetStat = await stat(targetPath).catch(() => null)
|
|
27
|
+
if (!targetStat)
|
|
28
|
+
throw createError({ statusCode: 404, message: 'File not found' })
|
|
29
|
+
|
|
30
|
+
await rm(targetPath, { recursive: true })
|
|
31
|
+
|
|
32
|
+
return { data: { path: body.path, deleted: true } }
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
async function findSkillDir(name: string): Promise<string | null> {
|
|
36
|
+
const activeDir = join(getSkillsDir(), name)
|
|
37
|
+
const activeStat = await stat(activeDir).catch(() => null)
|
|
38
|
+
if (activeStat?.isDirectory()) return activeDir
|
|
39
|
+
|
|
40
|
+
const inactiveDir = join(getInactiveSkillsDir(), name)
|
|
41
|
+
const inactiveStat = await stat(inactiveDir).catch(() => null)
|
|
42
|
+
if (inactiveStat?.isDirectory()) return inactiveDir
|
|
43
|
+
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { stat } from 'fs/promises'
|
|
2
|
+
import { join } from 'path'
|
|
3
|
+
import { getSkillsDir, getInactiveSkillsDir, buildSkillFileTree } from '~~/server/utils/skills-path'
|
|
4
|
+
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
const name = getRouterParam(event, 'name')
|
|
7
|
+
if (!name)
|
|
8
|
+
throw createError({ statusCode: 400, message: 'Skill name required' })
|
|
9
|
+
|
|
10
|
+
const skillDir = await findSkillDir(name)
|
|
11
|
+
if (!skillDir)
|
|
12
|
+
throw createError({ statusCode: 404, message: `Skill '${name}' not found` })
|
|
13
|
+
|
|
14
|
+
const files = await buildSkillFileTree(skillDir)
|
|
15
|
+
return { data: files }
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
async function findSkillDir(name: string): Promise<string | null> {
|
|
19
|
+
const activeDir = join(getSkillsDir(), name)
|
|
20
|
+
const activeStat = await stat(activeDir).catch(() => null)
|
|
21
|
+
if (activeStat?.isDirectory()) return activeDir
|
|
22
|
+
|
|
23
|
+
const inactiveDir = join(getInactiveSkillsDir(), name)
|
|
24
|
+
const inactiveStat = await stat(inactiveDir).catch(() => null)
|
|
25
|
+
if (inactiveStat?.isDirectory()) return inactiveDir
|
|
26
|
+
|
|
27
|
+
return null
|
|
28
|
+
}
|