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,146 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Manage encrypted secrets in Cognova."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
# Add parent directory for _lib imports
|
|
9
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
10
|
+
from _lib.api import get, post, put, delete, get_secret
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def cmd_list(args):
|
|
14
|
+
"""List all stored secrets."""
|
|
15
|
+
success, data = get("/secrets")
|
|
16
|
+
if not success:
|
|
17
|
+
print(f"Error: {data}")
|
|
18
|
+
sys.exit(1)
|
|
19
|
+
|
|
20
|
+
secrets = data if isinstance(data, list) else []
|
|
21
|
+
if not secrets:
|
|
22
|
+
print("No secrets stored.")
|
|
23
|
+
print("\nUse: python3 secret.py set KEY --value VALUE")
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
# Calculate column widths
|
|
27
|
+
key_width = max(len(s.get("key", "")) for s in secrets)
|
|
28
|
+
key_width = max(key_width, 3)
|
|
29
|
+
|
|
30
|
+
print(f"{'Key':<{key_width}} {'Description':<40} {'Updated'}")
|
|
31
|
+
print(f"{'-' * key_width} {'-' * 40} {'-' * 19}")
|
|
32
|
+
|
|
33
|
+
for s in secrets:
|
|
34
|
+
key = s.get("key", "")
|
|
35
|
+
desc = s.get("description", "") or ""
|
|
36
|
+
updated = s.get("updatedAt", s.get("createdAt", ""))[:19] if s.get("updatedAt") or s.get("createdAt") else ""
|
|
37
|
+
# Truncate description if too long
|
|
38
|
+
if len(desc) > 40:
|
|
39
|
+
desc = desc[:37] + "..."
|
|
40
|
+
print(f"{key:<{key_width}} {desc:<40} {updated}")
|
|
41
|
+
|
|
42
|
+
print(f"\n{len(secrets)} secret(s) stored.")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def cmd_get(args):
|
|
46
|
+
"""Get a secret value."""
|
|
47
|
+
success, value = get_secret(args.key)
|
|
48
|
+
if not success:
|
|
49
|
+
print(f"Error: {value}")
|
|
50
|
+
print(f"\nSecret '{args.key}' not found. Use 'list' to see available secrets.")
|
|
51
|
+
sys.exit(1)
|
|
52
|
+
|
|
53
|
+
if args.raw:
|
|
54
|
+
# Raw output for piping to other commands
|
|
55
|
+
print(value, end="")
|
|
56
|
+
else:
|
|
57
|
+
print(f"Secret '{args.key}' retrieved successfully.")
|
|
58
|
+
print(f"Value: {value}")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def cmd_set(args):
|
|
62
|
+
"""Create or update a secret."""
|
|
63
|
+
if not args.value:
|
|
64
|
+
print("Error: --value is required")
|
|
65
|
+
sys.exit(1)
|
|
66
|
+
|
|
67
|
+
data = {
|
|
68
|
+
"key": args.key,
|
|
69
|
+
"value": args.value,
|
|
70
|
+
}
|
|
71
|
+
if args.description:
|
|
72
|
+
data["description"] = args.description
|
|
73
|
+
|
|
74
|
+
# Try to check if it exists first
|
|
75
|
+
check_success, _ = get_secret(args.key)
|
|
76
|
+
|
|
77
|
+
if check_success:
|
|
78
|
+
# Update existing
|
|
79
|
+
success, result = put(f"/secrets/{args.key}", data)
|
|
80
|
+
action = "updated"
|
|
81
|
+
else:
|
|
82
|
+
# Create new
|
|
83
|
+
success, result = post("/secrets", data)
|
|
84
|
+
action = "created"
|
|
85
|
+
|
|
86
|
+
if not success:
|
|
87
|
+
print(f"Error: {result}")
|
|
88
|
+
sys.exit(1)
|
|
89
|
+
|
|
90
|
+
print(f"Secret '{args.key}' {action} successfully.")
|
|
91
|
+
if args.description:
|
|
92
|
+
print(f"Description: {args.description}")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def cmd_delete(args):
|
|
96
|
+
"""Delete a secret."""
|
|
97
|
+
success, result = delete(f"/secrets/{args.key}")
|
|
98
|
+
if not success:
|
|
99
|
+
print(f"Error: {result}")
|
|
100
|
+
sys.exit(1)
|
|
101
|
+
|
|
102
|
+
print(f"Secret '{args.key}' deleted successfully.")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def main():
|
|
106
|
+
parser = argparse.ArgumentParser(
|
|
107
|
+
description="Manage encrypted secrets in Cognova"
|
|
108
|
+
)
|
|
109
|
+
subparsers = parser.add_subparsers(dest="command", help="Command to run")
|
|
110
|
+
|
|
111
|
+
# list
|
|
112
|
+
subparsers.add_parser("list", help="List all secrets")
|
|
113
|
+
|
|
114
|
+
# get
|
|
115
|
+
get_parser = subparsers.add_parser("get", help="Get a secret value")
|
|
116
|
+
get_parser.add_argument("key", help="Secret key name")
|
|
117
|
+
get_parser.add_argument("--raw", action="store_true", help="Output raw value only")
|
|
118
|
+
|
|
119
|
+
# set
|
|
120
|
+
set_parser = subparsers.add_parser("set", help="Create or update a secret")
|
|
121
|
+
set_parser.add_argument("key", help="Secret key name (SCREAMING_SNAKE_CASE)")
|
|
122
|
+
set_parser.add_argument("--value", required=True, help="Secret value")
|
|
123
|
+
set_parser.add_argument("--description", help="Description of what this secret is for")
|
|
124
|
+
|
|
125
|
+
# delete
|
|
126
|
+
del_parser = subparsers.add_parser("delete", help="Delete a secret")
|
|
127
|
+
del_parser.add_argument("key", help="Secret key name")
|
|
128
|
+
|
|
129
|
+
args = parser.parse_args()
|
|
130
|
+
|
|
131
|
+
if not args.command:
|
|
132
|
+
parser.print_help()
|
|
133
|
+
sys.exit(1)
|
|
134
|
+
|
|
135
|
+
commands = {
|
|
136
|
+
"list": cmd_list,
|
|
137
|
+
"get": cmd_get,
|
|
138
|
+
"set": cmd_set,
|
|
139
|
+
"delete": cmd_delete,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
commands[args.command](args)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
if __name__ == "__main__":
|
|
146
|
+
main()
|
|
@@ -3,6 +3,12 @@ name: skill-creator
|
|
|
3
3
|
description: Assists users in creating new Claude Code skills. Uses web search to find latest conventions and suggests alternative approaches (existing MCPs, plugins) when appropriate.
|
|
4
4
|
allowed-tools: Bash, Read, Write, WebSearch, WebFetch
|
|
5
5
|
disable-model-invocation: true
|
|
6
|
+
metadata:
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
requires-secrets: []
|
|
9
|
+
author: Cognova
|
|
10
|
+
repository: ""
|
|
11
|
+
installed-from: ""
|
|
6
12
|
---
|
|
7
13
|
|
|
8
14
|
# Skill Creator
|
|
@@ -11,6 +17,8 @@ Assists in creating new Claude Code skills for Cognova or personal use.
|
|
|
11
17
|
|
|
12
18
|
## Process
|
|
13
19
|
|
|
20
|
+
> **CRITICAL: Skills must NEVER contain hardcoded secrets.** Always use `get_secret()` from `_lib/api.py` for API keys, tokens, and credentials. If the user provides a key/token during skill creation, store it via `/secret set KEY` first, then reference it by key name in the script. Declare required secrets in `metadata.requires-secrets` frontmatter.
|
|
21
|
+
|
|
14
22
|
When a user asks to create a new skill:
|
|
15
23
|
|
|
16
24
|
### 1. Understand the Requirement
|
|
@@ -193,6 +201,28 @@ my_var = os.environ.get('MY_CUSTOM_VAR', 'default')
|
|
|
193
201
|
| `user-invocable` | false | Claude-only, hidden from user menu |
|
|
194
202
|
| `context` | fork | Run in subagent |
|
|
195
203
|
| `agent` | Explore, Plan, general-purpose | Agent type for subagent |
|
|
204
|
+
| `metadata` | object | Custom metadata (version, author, etc.) |
|
|
205
|
+
|
|
206
|
+
#### Metadata Fields
|
|
207
|
+
|
|
208
|
+
Nest under `metadata:` in frontmatter:
|
|
209
|
+
|
|
210
|
+
```yaml
|
|
211
|
+
metadata:
|
|
212
|
+
version: "1.0.0"
|
|
213
|
+
requires-secrets: ["API_KEY_NAME"]
|
|
214
|
+
author: Your Name
|
|
215
|
+
repository: ""
|
|
216
|
+
installed-from: ""
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
| Field | Type | Description |
|
|
220
|
+
|-------|------|-------------|
|
|
221
|
+
| `version` | string | Semantic version |
|
|
222
|
+
| `requires-secrets` | string[] | Secret keys the skill needs (fetched via `get_secret()`) |
|
|
223
|
+
| `author` | string | Skill author name |
|
|
224
|
+
| `repository` | string | Source repository URL |
|
|
225
|
+
| `installed-from` | string | Library name if installed from community |
|
|
196
226
|
|
|
197
227
|
### 7. Skill Locations
|
|
198
228
|
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
name: task
|
|
3
3
|
description: Manage Cognova tasks - create, list, update, complete tasks. Use when the user wants to track work items, todos, or action items. Can search for and associate tasks with projects.
|
|
4
4
|
allowed-tools: Bash, Read
|
|
5
|
+
metadata:
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
requires-secrets: []
|
|
8
|
+
author: Cognova
|
|
9
|
+
repository: ""
|
|
10
|
+
installed-from: ""
|
|
5
11
|
---
|
|
6
12
|
|
|
7
13
|
# Task Management Skill
|
package/README.md
CHANGED
|
@@ -13,6 +13,9 @@ Personal knowledge management system with an embedded AI terminal. Built for a u
|
|
|
13
13
|
- **Task Management** - Track tasks with status, priority, and project tags
|
|
14
14
|
- **Scheduled Agents** - Cron-based Claude agents with cost tracking and real-time status
|
|
15
15
|
- **Memory Dashboard** - View and manage Claude's memory context
|
|
16
|
+
- **Skills Management** - Browse, enable/disable, edit, and create skills with a built-in file editor
|
|
17
|
+
- **Community Skills Library** - Install skills from a [GitHub-hosted registry](https://github.com/Patrity/cognova-skills) with tag filtering and one-click updates
|
|
18
|
+
- **Encrypted Secrets** - AES-256-GCM key-value store with a `/secret` skill for agent access
|
|
16
19
|
- **Dashboard** - Overview of recent activity and quick capture
|
|
17
20
|
- **Custom Homepage** - Override the landing page by creating `index.md` in your vault
|
|
18
21
|
- **Public Document Sharing** - Share vault documents via unique link (no auth required)
|
package/app/app.vue
CHANGED
|
@@ -10,13 +10,19 @@ function formatCurrency(value: number): string {
|
|
|
10
10
|
if (value < 0.01 && value > 0) return '<$0.01'
|
|
11
11
|
return `$${value.toFixed(2)}`
|
|
12
12
|
}
|
|
13
|
+
|
|
14
|
+
function formatTokens(value: number): string {
|
|
15
|
+
if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`
|
|
16
|
+
if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`
|
|
17
|
+
return String(value)
|
|
18
|
+
}
|
|
13
19
|
</script>
|
|
14
20
|
|
|
15
21
|
<template>
|
|
16
|
-
<div class="grid gap-4 grid-cols-2 lg:grid-cols-
|
|
22
|
+
<div class="grid gap-4 grid-cols-2 sm:grid-cols-3 lg:grid-cols-5">
|
|
17
23
|
<template v-if="loading">
|
|
18
24
|
<div
|
|
19
|
-
v-for="i in
|
|
25
|
+
v-for="i in 5"
|
|
20
26
|
:key="i"
|
|
21
27
|
class="p-4 rounded-lg bg-elevated border border-default"
|
|
22
28
|
>
|
|
@@ -77,6 +83,19 @@ function formatCurrency(value: number): string {
|
|
|
77
83
|
{{ overview.usage.totalCalls7d }}
|
|
78
84
|
</p>
|
|
79
85
|
</div>
|
|
86
|
+
|
|
87
|
+
<div class="p-4 rounded-lg bg-elevated border border-default">
|
|
88
|
+
<div class="flex items-center gap-2 text-muted text-sm mb-1">
|
|
89
|
+
<UIcon
|
|
90
|
+
name="i-lucide-text-cursor-input"
|
|
91
|
+
class="size-4"
|
|
92
|
+
/>
|
|
93
|
+
<span>7d Tokens</span>
|
|
94
|
+
</div>
|
|
95
|
+
<p class="text-2xl font-semibold">
|
|
96
|
+
{{ formatTokens(overview.usage.totalInputTokens7d + overview.usage.totalOutputTokens7d) }}
|
|
97
|
+
</p>
|
|
98
|
+
</div>
|
|
80
99
|
</template>
|
|
81
100
|
</div>
|
|
82
101
|
</template>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { SkillListItem } from '~~/shared/types'
|
|
3
|
+
|
|
4
|
+
const props = defineProps<{
|
|
5
|
+
skill: SkillListItem
|
|
6
|
+
}>()
|
|
7
|
+
|
|
8
|
+
const emit = defineEmits<{
|
|
9
|
+
toggle: [name: string]
|
|
10
|
+
}>()
|
|
11
|
+
|
|
12
|
+
const toggling = ref(false)
|
|
13
|
+
|
|
14
|
+
async function handleToggle() {
|
|
15
|
+
toggling.value = true
|
|
16
|
+
emit('toggle', props.skill.name)
|
|
17
|
+
toggling.value = false
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<template>
|
|
22
|
+
<NuxtLink
|
|
23
|
+
:to="`/skills/${skill.name}`"
|
|
24
|
+
class="block p-4 rounded-lg border border-default bg-elevated/50 hover:bg-elevated transition-colors"
|
|
25
|
+
>
|
|
26
|
+
<div class="flex items-start justify-between gap-3">
|
|
27
|
+
<div class="flex-1 min-w-0">
|
|
28
|
+
<div class="flex items-center gap-2 mb-1">
|
|
29
|
+
<span class="font-medium text-sm truncate">{{ skill.name }}</span>
|
|
30
|
+
<UBadge
|
|
31
|
+
v-if="skill.core"
|
|
32
|
+
variant="subtle"
|
|
33
|
+
color="primary"
|
|
34
|
+
size="xs"
|
|
35
|
+
>
|
|
36
|
+
Core
|
|
37
|
+
</UBadge>
|
|
38
|
+
<UBadge
|
|
39
|
+
v-if="!skill.active"
|
|
40
|
+
variant="subtle"
|
|
41
|
+
color="neutral"
|
|
42
|
+
size="xs"
|
|
43
|
+
>
|
|
44
|
+
Disabled
|
|
45
|
+
</UBadge>
|
|
46
|
+
</div>
|
|
47
|
+
<p class="text-xs text-muted line-clamp-2">
|
|
48
|
+
{{ skill.description }}
|
|
49
|
+
</p>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<USwitch
|
|
53
|
+
v-if="!skill.core"
|
|
54
|
+
:model-value="skill.active"
|
|
55
|
+
size="sm"
|
|
56
|
+
:loading="toggling"
|
|
57
|
+
@update:model-value="handleToggle"
|
|
58
|
+
@click.prevent.stop
|
|
59
|
+
/>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="flex items-center gap-2 mt-3">
|
|
63
|
+
<UBadge
|
|
64
|
+
v-if="skill.version"
|
|
65
|
+
variant="soft"
|
|
66
|
+
color="neutral"
|
|
67
|
+
size="xs"
|
|
68
|
+
>
|
|
69
|
+
v{{ skill.version }}
|
|
70
|
+
</UBadge>
|
|
71
|
+
<UBadge
|
|
72
|
+
v-if="skill.author"
|
|
73
|
+
variant="soft"
|
|
74
|
+
color="neutral"
|
|
75
|
+
size="xs"
|
|
76
|
+
>
|
|
77
|
+
{{ skill.author }}
|
|
78
|
+
</UBadge>
|
|
79
|
+
<span class="text-xs text-dimmed ml-auto">{{ skill.fileCount }} file{{ skill.fileCount !== 1 ? 's' : '' }}</span>
|
|
80
|
+
</div>
|
|
81
|
+
</NuxtLink>
|
|
82
|
+
</template>
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{
|
|
3
|
+
open: boolean
|
|
4
|
+
}>()
|
|
5
|
+
|
|
6
|
+
const emit = defineEmits<{
|
|
7
|
+
'update:open': [value: boolean]
|
|
8
|
+
'created': [name: string]
|
|
9
|
+
}>()
|
|
10
|
+
|
|
11
|
+
const router = useRouter()
|
|
12
|
+
const toast = useToast()
|
|
13
|
+
|
|
14
|
+
const mode = ref<'blank' | 'generate'>('blank')
|
|
15
|
+
const name = ref('')
|
|
16
|
+
const description = ref('')
|
|
17
|
+
const loading = ref(false)
|
|
18
|
+
|
|
19
|
+
function resetForm() {
|
|
20
|
+
mode.value = 'blank'
|
|
21
|
+
name.value = ''
|
|
22
|
+
description.value = ''
|
|
23
|
+
loading.value = false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function close() {
|
|
27
|
+
emit('update:open', false)
|
|
28
|
+
resetForm()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function handleCreate() {
|
|
32
|
+
if (!name.value.trim()) return
|
|
33
|
+
|
|
34
|
+
loading.value = true
|
|
35
|
+
try {
|
|
36
|
+
if (mode.value === 'blank') {
|
|
37
|
+
await $fetch('/api/skills/create', {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
body: { name: name.value.trim(), description: description.value.trim() || undefined }
|
|
40
|
+
})
|
|
41
|
+
toast.add({ title: `Skill '${name.value}' created`, color: 'success' })
|
|
42
|
+
emit('created', name.value.trim())
|
|
43
|
+
close()
|
|
44
|
+
router.push(`/skills/${name.value.trim()}`)
|
|
45
|
+
} else {
|
|
46
|
+
if (!description.value.trim()) {
|
|
47
|
+
toast.add({ title: 'Description is required for AI generation', color: 'warning' })
|
|
48
|
+
loading.value = false
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
const res = await $fetch<{ data: { name: string, costUsd: number } }>('/api/skills/generate', {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
body: { name: name.value.trim(), description: description.value.trim() }
|
|
54
|
+
})
|
|
55
|
+
toast.add({
|
|
56
|
+
title: `Skill '${name.value}' generated`,
|
|
57
|
+
description: `Cost: $${res.data.costUsd.toFixed(4)} — created in inactive state for review`,
|
|
58
|
+
color: 'success'
|
|
59
|
+
})
|
|
60
|
+
emit('created', name.value.trim())
|
|
61
|
+
close()
|
|
62
|
+
router.push(`/skills/${name.value.trim()}`)
|
|
63
|
+
}
|
|
64
|
+
} catch (e: unknown) {
|
|
65
|
+
const message = e instanceof Error ? e.message : 'Failed to create skill'
|
|
66
|
+
toast.add({ title: message, color: 'error' })
|
|
67
|
+
} finally {
|
|
68
|
+
loading.value = false
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<template>
|
|
74
|
+
<UModal
|
|
75
|
+
:open="props.open"
|
|
76
|
+
@update:open="emit('update:open', $event)"
|
|
77
|
+
>
|
|
78
|
+
<template #header>
|
|
79
|
+
<span class="font-semibold">Create Skill</span>
|
|
80
|
+
</template>
|
|
81
|
+
|
|
82
|
+
<template #body>
|
|
83
|
+
<div class="space-y-4">
|
|
84
|
+
<div class="flex gap-2">
|
|
85
|
+
<UButton
|
|
86
|
+
:variant="mode === 'blank' ? 'solid' : 'outline'"
|
|
87
|
+
color="neutral"
|
|
88
|
+
size="sm"
|
|
89
|
+
icon="i-lucide-file-plus"
|
|
90
|
+
@click="mode = 'blank'"
|
|
91
|
+
>
|
|
92
|
+
Blank Skill
|
|
93
|
+
</UButton>
|
|
94
|
+
<UButton
|
|
95
|
+
:variant="mode === 'generate' ? 'solid' : 'outline'"
|
|
96
|
+
color="neutral"
|
|
97
|
+
size="sm"
|
|
98
|
+
icon="i-lucide-sparkles"
|
|
99
|
+
@click="mode = 'generate'"
|
|
100
|
+
>
|
|
101
|
+
AI Generate
|
|
102
|
+
</UButton>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<UFormField label="Name">
|
|
106
|
+
<UInput
|
|
107
|
+
v-model="name"
|
|
108
|
+
placeholder="my-skill"
|
|
109
|
+
:disabled="loading"
|
|
110
|
+
class="w-full"
|
|
111
|
+
/>
|
|
112
|
+
</UFormField>
|
|
113
|
+
|
|
114
|
+
<UFormField
|
|
115
|
+
label="Description"
|
|
116
|
+
:required="mode === 'generate'"
|
|
117
|
+
>
|
|
118
|
+
<UTextarea
|
|
119
|
+
v-model="description"
|
|
120
|
+
:placeholder="mode === 'generate' ? 'Describe what this skill should do...' : 'Optional description'"
|
|
121
|
+
:rows="3"
|
|
122
|
+
:disabled="loading"
|
|
123
|
+
class="w-full"
|
|
124
|
+
/>
|
|
125
|
+
</UFormField>
|
|
126
|
+
|
|
127
|
+
<p
|
|
128
|
+
v-if="mode === 'generate'"
|
|
129
|
+
class="text-xs text-muted"
|
|
130
|
+
>
|
|
131
|
+
AI-generated skills are created in an inactive state so you can review them before enabling.
|
|
132
|
+
</p>
|
|
133
|
+
</div>
|
|
134
|
+
</template>
|
|
135
|
+
|
|
136
|
+
<template #footer>
|
|
137
|
+
<div class="flex justify-end gap-2">
|
|
138
|
+
<UButton
|
|
139
|
+
variant="ghost"
|
|
140
|
+
color="neutral"
|
|
141
|
+
:disabled="loading"
|
|
142
|
+
@click="close"
|
|
143
|
+
>
|
|
144
|
+
Cancel
|
|
145
|
+
</UButton>
|
|
146
|
+
<UButton
|
|
147
|
+
:loading="loading"
|
|
148
|
+
:disabled="!name.trim()"
|
|
149
|
+
@click="handleCreate"
|
|
150
|
+
>
|
|
151
|
+
{{ mode === 'generate' ? 'Generate' : 'Create' }}
|
|
152
|
+
</UButton>
|
|
153
|
+
</div>
|
|
154
|
+
</template>
|
|
155
|
+
</UModal>
|
|
156
|
+
</template>
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { CodeLanguage } from '~~/shared/types'
|
|
3
|
+
|
|
4
|
+
const props = defineProps<{
|
|
5
|
+
skillName: string
|
|
6
|
+
filePath: string
|
|
7
|
+
}>()
|
|
8
|
+
|
|
9
|
+
const emit = defineEmits<{
|
|
10
|
+
saved: []
|
|
11
|
+
}>()
|
|
12
|
+
|
|
13
|
+
const toast = useToast()
|
|
14
|
+
const content = ref('')
|
|
15
|
+
const originalContent = ref('')
|
|
16
|
+
const loading = ref(true)
|
|
17
|
+
const saving = ref(false)
|
|
18
|
+
|
|
19
|
+
const isDirty = computed(() => content.value !== originalContent.value)
|
|
20
|
+
|
|
21
|
+
const language = computed<CodeLanguage>(() => {
|
|
22
|
+
const ext = props.filePath.split('.').pop()?.toLowerCase()
|
|
23
|
+
switch (ext) {
|
|
24
|
+
case 'py': return 'python'
|
|
25
|
+
case 'md': return 'markdown'
|
|
26
|
+
case 'json': return 'json'
|
|
27
|
+
case 'ts': return 'typescript'
|
|
28
|
+
case 'js': return 'javascript'
|
|
29
|
+
case 'yaml':
|
|
30
|
+
case 'yml': return 'yaml'
|
|
31
|
+
case 'sh':
|
|
32
|
+
case 'bash': return 'bash'
|
|
33
|
+
default: return 'plaintext'
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
async function loadFile() {
|
|
38
|
+
loading.value = true
|
|
39
|
+
try {
|
|
40
|
+
const res = await $fetch<{ data: { content: string } }>(`/api/skills/${props.skillName}/files/read`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
body: { path: props.filePath }
|
|
43
|
+
})
|
|
44
|
+
content.value = res.data.content
|
|
45
|
+
originalContent.value = res.data.content
|
|
46
|
+
} catch {
|
|
47
|
+
toast.add({ title: 'Failed to load file', color: 'error' })
|
|
48
|
+
} finally {
|
|
49
|
+
loading.value = false
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function save() {
|
|
54
|
+
saving.value = true
|
|
55
|
+
try {
|
|
56
|
+
await $fetch(`/api/skills/${props.skillName}/files/write`, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
body: { path: props.filePath, content: content.value }
|
|
59
|
+
})
|
|
60
|
+
originalContent.value = content.value
|
|
61
|
+
toast.add({ title: 'File saved', color: 'success' })
|
|
62
|
+
emit('saved')
|
|
63
|
+
} catch {
|
|
64
|
+
toast.add({ title: 'Failed to save file', color: 'error' })
|
|
65
|
+
} finally {
|
|
66
|
+
saving.value = false
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Ctrl+S / Cmd+S keyboard shortcut
|
|
71
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
72
|
+
if ((e.metaKey || e.ctrlKey) && e.key === 's') {
|
|
73
|
+
e.preventDefault()
|
|
74
|
+
if (isDirty.value) save()
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
onMounted(() => {
|
|
79
|
+
loadFile()
|
|
80
|
+
window.addEventListener('keydown', handleKeydown)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
onUnmounted(() => {
|
|
84
|
+
window.removeEventListener('keydown', handleKeydown)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
watch(() => props.filePath, () => loadFile())
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<template>
|
|
91
|
+
<div class="flex flex-col h-full">
|
|
92
|
+
<div class="flex items-center justify-between px-4 py-2 border-b border-default">
|
|
93
|
+
<div class="flex items-center gap-2 text-sm text-muted">
|
|
94
|
+
<UIcon
|
|
95
|
+
name="i-lucide-file-code"
|
|
96
|
+
class="size-4"
|
|
97
|
+
/>
|
|
98
|
+
<span>{{ filePath }}</span>
|
|
99
|
+
<UBadge
|
|
100
|
+
v-if="isDirty"
|
|
101
|
+
variant="soft"
|
|
102
|
+
color="warning"
|
|
103
|
+
size="xs"
|
|
104
|
+
>
|
|
105
|
+
Modified
|
|
106
|
+
</UBadge>
|
|
107
|
+
</div>
|
|
108
|
+
<UButton
|
|
109
|
+
size="xs"
|
|
110
|
+
:loading="saving"
|
|
111
|
+
:disabled="!isDirty"
|
|
112
|
+
@click="save"
|
|
113
|
+
>
|
|
114
|
+
Save
|
|
115
|
+
</UButton>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div
|
|
119
|
+
v-if="loading"
|
|
120
|
+
class="flex-1 flex items-center justify-center"
|
|
121
|
+
>
|
|
122
|
+
<UIcon
|
|
123
|
+
name="i-lucide-loader-2"
|
|
124
|
+
class="size-6 animate-spin text-dimmed"
|
|
125
|
+
/>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<EditorCodeEditor
|
|
129
|
+
v-else
|
|
130
|
+
v-model="content"
|
|
131
|
+
:language="language"
|
|
132
|
+
class="flex-1"
|
|
133
|
+
/>
|
|
134
|
+
</div>
|
|
135
|
+
</template>
|