autohand-cli 0.7.14 → 0.8.2
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/README.md +97 -2
- package/assets/icon.png +0 -0
- package/dist/AgentRegistry-7LDL5HJH.js +10 -0
- package/dist/AgentRegistry-NQCLWABO.cjs +10 -0
- package/dist/{AutomodeManager-NGRAO2MH.js → AutomodeManager-MWLKGPZK.js} +2 -0
- package/dist/{AutomodeManager-ZKQMBM4T.cjs → AutomodeManager-NYIZNODK.cjs} +3 -1
- package/dist/CommunitySkillsCache-6QPRMTJO.js +8 -0
- package/dist/CommunitySkillsCache-GTQMOCCO.cjs +8 -0
- package/dist/{GitHubRegistryFetcher-US2JJID4.js → GitHubRegistryFetcher-6JQ5JEDZ.js} +1 -0
- package/dist/{GitHubRegistryFetcher-K744NNAJ.cjs → GitHubRegistryFetcher-S7QFUEKV.cjs} +1 -0
- package/dist/HookManager-Q2KYMCP4.cjs +7 -0
- package/dist/HookManager-TTP4Y6DC.js +7 -0
- package/dist/ImportWizard-35YBJ4AM.cjs +466 -0
- package/dist/ImportWizard-XH7CINCH.js +466 -0
- package/dist/LearnAdvisor-A4Q5PPBI.js +9 -0
- package/dist/LearnAdvisor-GASQD7HT.cjs +9 -0
- package/dist/McpClientManager-7RM6YT35.js +8 -0
- package/dist/McpClientManager-RKD7C6OY.cjs +8 -0
- package/dist/MemoryManager-GUNLRP5S.js +8 -0
- package/dist/MemoryManager-TNSGKDKX.cjs +8 -0
- package/dist/{PermissionManager-U5OMGR3L.js → PermissionManager-ATUV34LQ.js} +4 -3
- package/dist/PermissionManager-KMN53FJP.cjs +11 -0
- package/dist/ProjectProfiler-UMJJSOCE.js +194 -0
- package/dist/ProjectProfiler-ZDWR2ODG.cjs +194 -0
- package/dist/ProviderFactory-MR5B23QJ.js +9 -0
- package/dist/ProviderFactory-VFGCJJX6.cjs +9 -0
- package/dist/SessionManager-FEUAU3ZJ.cjs +10 -0
- package/dist/SessionManager-IKWAK2PI.js +10 -0
- package/dist/SkillsRegistry-KPQFTRIT.cjs +9 -0
- package/dist/SkillsRegistry-XJSKPDF2.js +9 -0
- package/dist/SubAgent-NYH6GWQ3.js +11 -0
- package/dist/SubAgent-PZKBDUBA.cjs +11 -0
- package/dist/{SyncApiClient-AYXYSOJM.js → SyncApiClient-LVIO4C2S.js} +1 -0
- package/dist/{SyncApiClient-ID3KXEMA.cjs → SyncApiClient-ZNYMT36M.cjs} +1 -0
- package/dist/about-HHTF2YFL.js +12 -0
- package/dist/about-JGRVNNQC.cjs +12 -0
- package/dist/actionExecutor-U6IBN2TU.cjs +19 -0
- package/dist/actionExecutor-XT5FW3W6.js +19 -0
- package/dist/add-dir-247K3XRY.js +10 -0
- package/dist/add-dir-GS4DXKKH.cjs +10 -0
- package/dist/agents/builtin/code-cleaner.md +14 -0
- package/dist/agents/builtin/docs-writer.md +14 -0
- package/dist/agents/builtin/researcher.md +14 -0
- package/dist/agents/builtin/reviewer.md +15 -0
- package/dist/agents/builtin/tester.md +15 -0
- package/dist/agents/builtin/todo-resolver.md +15 -0
- package/dist/agents-R6ZEFTVR.cjs +12 -0
- package/dist/agents-WJPQWQF2.js +12 -0
- package/dist/agents-new-HKVEIBDJ.js +14 -0
- package/dist/agents-new-X6GTHIO6.cjs +14 -0
- package/dist/assets/icon.png +0 -0
- package/dist/autoSkill-6TGBTEQD.js +20 -0
- package/dist/autoSkill-H4T6VVDA.cjs +20 -0
- package/dist/automode-BC6NVECO.js +10 -0
- package/dist/automode-WN2RSOGW.cjs +10 -0
- package/dist/{cc-UTTLESTY.js → cc-7LEIJ3KF.js} +1 -0
- package/dist/{cc-2W6M7J45.cjs → cc-Q5MM4AWC.cjs} +1 -0
- package/dist/{chunk-N4ZSG6JJ.cjs → chunk-22D2CNTP.cjs} +2 -2
- package/dist/chunk-245KJE5Y.cjs +55 -0
- package/dist/chunk-24QIWILL.js +51 -0
- package/dist/{chunk-MYNHJHDZ.js → chunk-2AA5MFES.js} +1 -1
- package/dist/{chunk-TSY7JHIV.cjs → chunk-33A755XB.cjs} +2 -2
- package/dist/chunk-33RSHBDH.js +131 -0
- package/dist/{chunk-QRGPAUST.js → chunk-34M3HWLR.js} +2 -2
- package/dist/{chunk-U7CZFKPL.cjs → chunk-3K2ESU53.cjs} +2 -2
- package/dist/{chunk-SIGWDEPS.cjs → chunk-3L53OA4E.cjs} +10 -10
- package/dist/chunk-3OEDGIFW.js +42 -0
- package/dist/chunk-3OTU3RS3.cjs +1607 -0
- package/dist/{chunk-MNSTWHK3.cjs → chunk-3PCTTUNW.cjs} +11 -11
- package/dist/{chunk-P5VDZ6PV.js → chunk-3PDTTAKJ.js} +1 -1
- package/dist/chunk-47CKWKEX.cjs +59 -0
- package/dist/{chunk-Z4J4W6YQ.cjs → chunk-4JNNTOGF.cjs} +2 -48
- package/dist/{chunk-GVZPIQWB.js → chunk-4PKF7WPD.js} +11 -5
- package/dist/{chunk-3S4DEIJP.cjs → chunk-5IXII4HX.cjs} +2 -2
- package/dist/{chunk-CRQKDBLD.js → chunk-5P2NXKP3.js} +98 -64
- package/dist/{chunk-DSKVMFRM.cjs → chunk-643VRA5S.cjs} +12 -4
- package/dist/{chunk-VVBBEYTH.cjs → chunk-6HYLHBQG.cjs} +10 -10
- package/dist/{chunk-L5ZFPWHY.js → chunk-6OYHF6MF.js} +12 -4
- package/dist/{chunk-BPTBKO7D.js → chunk-6RF7UKUS.js} +224 -37
- package/dist/{chunk-YHGTBPEC.js → chunk-6ZCULLCA.js} +1 -1
- package/dist/{chunk-VHBUKGRG.js → chunk-72FKPBT5.js} +4 -4
- package/dist/{chunk-2U5HFVRO.cjs → chunk-7BTSG4ME.cjs} +5165 -2194
- package/dist/chunk-7UOUW76C.js +603 -0
- package/dist/{chunk-FEVHH525.cjs → chunk-A4IJHHV7.cjs} +11 -5
- package/dist/{chunk-B6EBHCK2.cjs → chunk-AEJH23FO.cjs} +6 -6
- package/dist/{chunk-WLTVF77A.js → chunk-ALYU6VTM.js} +1 -1
- package/dist/{chunk-NMWEDN4Z.js → chunk-APIXPPMT.js} +5165 -2194
- package/dist/chunk-AS6RTLN7.cjs +203 -0
- package/dist/{chunk-BHV7CBNT.js → chunk-AYS2ASM7.js} +1 -1
- package/dist/{chunk-GRSVQ5YZ.js → chunk-AYSFIUFW.js} +44 -12
- package/dist/{chunk-NUHYCFHW.cjs → chunk-BVKXEQVG.cjs} +54 -65
- package/dist/chunk-BWN2CLLM.cjs +298 -0
- package/dist/{chunk-4HA7IHLJ.cjs → chunk-C5IJIM2V.cjs} +38 -16
- package/dist/{chunk-SRLY7K6J.js → chunk-CAMZTXV6.js} +2 -2
- package/dist/chunk-CDBPBM2K.cjs +29 -0
- package/dist/chunk-CNBKZEX5.cjs +109 -0
- package/dist/{chunk-WQUQ5JMM.js → chunk-CWMZKFTT.js} +4 -4
- package/dist/{chunk-CKN2BLHK.cjs → chunk-CZXGCVTR.cjs} +2 -2
- package/dist/{chunk-SZP4ULM5.cjs → chunk-DJDE4DTT.cjs} +17 -17
- package/dist/chunk-DN573ME7.cjs +1675 -0
- package/dist/chunk-DRE2RXBZ.js +4498 -0
- package/dist/chunk-DSPQEHDT.js +29 -0
- package/dist/{chunk-SFNT5DYE.cjs → chunk-DVUHHH3B.cjs} +4 -4
- package/dist/chunk-DVZOENQ7.cjs +58 -0
- package/dist/{chunk-PWLLLJHU.js → chunk-EGFT4PGW.js} +3 -1
- package/dist/chunk-EGMZDTSL.js +55 -0
- package/dist/chunk-EZMINVLU.js +123 -0
- package/dist/chunk-FHK7UDOJ.cjs +42 -0
- package/dist/{chunk-KWRUQRXR.js → chunk-FKSDEWDH.js} +44 -10
- package/dist/chunk-FMB3TSWP.cjs +218 -0
- package/dist/chunk-FW774QXH.js +1838 -0
- package/dist/{chunk-MY3TZER2.js → chunk-G27PQQFD.js} +1 -1
- package/dist/{chunk-Y2ZSH3YF.cjs → chunk-G3V4SFET.cjs} +57 -23
- package/dist/chunk-G4CAKI3V.js +58 -0
- package/dist/{chunk-FB6JWNJS.js → chunk-GBHDROGL.js} +54 -65
- package/dist/{chunk-DEAEO7RI.js → chunk-GJH7XMSK.js} +15 -1
- package/dist/chunk-GLBAF54O.js +218 -0
- package/dist/{chunk-S47TCZDL.js → chunk-H5SWOLG6.js} +7 -7
- package/dist/chunk-HBXAA3XB.js +83 -0
- package/dist/{chunk-63BXZQZW.js → chunk-HIVRCQS2.js} +26 -4
- package/dist/{chunk-WOGJXDBU.cjs → chunk-HLHTG5ZU.cjs} +18 -4
- package/dist/{chunk-FK2DVRPJ.js → chunk-HLQV64Y5.js} +170 -4
- package/dist/chunk-HOAHWIQ5.cjs +260 -0
- package/dist/{chunk-D2XFTCRP.js → chunk-HQ7YZKXE.js} +1 -1
- package/dist/{chunk-L42HTMMR.cjs → chunk-HTLINWX6.cjs} +2 -2
- package/dist/{chunk-PKOAXQKW.cjs → chunk-HVKOZ2VP.cjs} +11 -11
- package/dist/chunk-HXGBSJL5.cjs +27 -0
- package/dist/chunk-I5IW3T2Y.js +310 -0
- package/dist/chunk-IETRBBMP.cjs +603 -0
- package/dist/{chunk-MTALRU7R.cjs → chunk-IFFXSTOM.cjs} +3 -3
- package/dist/{chunk-V7YTCNMN.cjs → chunk-IKGWDOGU.cjs} +174 -8
- package/dist/chunk-IQ5RXU6O.js +1675 -0
- package/dist/{chunk-ZBIBLOZL.js → chunk-IVM5F2AE.js} +500 -317
- package/dist/chunk-J4Q7XR3G.js +260 -0
- package/dist/{chunk-XL77XYI2.cjs → chunk-J6QET7EF.cjs} +27 -7
- package/dist/{chunk-TQB222ZB.js → chunk-JCLYQ2JC.js} +2 -2
- package/dist/chunk-JSBRDJBE.js +30 -0
- package/dist/{chunk-XPOHYKR3.js → chunk-JX3DFKBI.js} +2 -2
- package/dist/chunk-JYTDYJVW.js +27 -0
- package/dist/{chunk-6SHHB2VD.js → chunk-KPELYZ6L.js} +2 -2
- package/dist/{chunk-ZLOTP56B.cjs → chunk-KWXVKLQ5.cjs} +5 -5
- package/dist/chunk-L3WAH3EM.cjs +131 -0
- package/dist/{chunk-ZXIQCYYV.cjs → chunk-LA7H35XM.cjs} +9 -9
- package/dist/chunk-LENHP55G.cjs +1838 -0
- package/dist/chunk-LJFUXC56.cjs +123 -0
- package/dist/{chunk-R5OO7MEB.cjs → chunk-LNMYK2F5.cjs} +22 -22
- package/dist/chunk-LQGVEP3E.js +109 -0
- package/dist/{chunk-KXAAEROY.js → chunk-LWUJFGOZ.js} +2 -2
- package/dist/chunk-MAKMSQMQ.cjs +504 -0
- package/dist/{chunk-BG4OQUKP.js → chunk-MBBY4ZIK.js} +1 -1
- package/dist/chunk-MSED7RH2.cjs +267 -0
- package/dist/{chunk-NMGF2KUN.js → chunk-MYISNQH4.js} +1 -1
- package/dist/chunk-N23UAW4I.js +59 -0
- package/dist/chunk-N254NRHT.cjs +30 -0
- package/dist/{chunk-TOTDRAWG.js → chunk-NDMIPTV4.js} +1 -1
- package/dist/{chunk-AIH6GUGB.cjs → chunk-NNPAM4HC.cjs} +5 -5
- package/dist/{chunk-HSPWX4Z2.cjs → chunk-O4IF4NJT.cjs} +231 -44
- package/dist/{chunk-DZHR34H6.cjs → chunk-OGV4WJ5L.cjs} +8 -8
- package/dist/chunk-OHUZKDGX.js +348 -0
- package/dist/{chunk-BRXIEKJ3.cjs → chunk-OLSBBZW6.cjs} +5 -5
- package/dist/{chunk-MILZEEUV.js → chunk-OOKY3HPZ.js} +9 -3
- package/dist/chunk-P47WPOXN.js +298 -0
- package/dist/{chunk-ULMPJUJW.cjs → chunk-PRRCJFU3.cjs} +23 -23
- package/dist/{chunk-SMHY3Q7B.cjs → chunk-Q7XSCYND.cjs} +54 -22
- package/dist/chunk-QCLYBIMM.cjs +51 -0
- package/dist/chunk-QMAKTSZB.cjs +48 -0
- package/dist/{chunk-DTFR3WD6.js → chunk-QNGEW5TC.js} +1 -1
- package/dist/chunk-QOXPOR5D.js +267 -0
- package/dist/chunk-R33VKSH5.cjs +348 -0
- package/dist/{chunk-RJP3SZ7Q.cjs → chunk-RD5XAJR2.cjs} +492 -309
- package/dist/chunk-RGR6ME5J.cjs +844 -0
- package/dist/{chunk-EOGKE5GD.cjs → chunk-RKJTGGMU.cjs} +221 -126
- package/dist/{chunk-GD4AFYJ3.js → chunk-RO6WYEWH.js} +24 -4
- package/dist/chunk-S52YW5ZQ.js +844 -0
- package/dist/{chunk-6DWXHBAY.js → chunk-SAHBLB3E.js} +222 -127
- package/dist/{chunk-JHOQABEF.js → chunk-SCXX4LW5.js} +5 -5
- package/dist/{chunk-GIZL57FE.cjs → chunk-SEKD5FH3.cjs} +3 -1
- package/dist/{chunk-JWPI6O5Z.js → chunk-SKV2F3NM.js} +31 -4
- package/dist/{chunk-FHUNAB2K.cjs → chunk-SKYG33B2.cjs} +33 -6
- package/dist/{chunk-BISFR6ZL.js → chunk-SLQAYV3W.js} +1 -1
- package/dist/{chunk-RFNCTE4V.cjs → chunk-SYVYLZZF.cjs} +2 -2
- package/dist/{chunk-3XJD56Z4.js → chunk-T73IDKDF.js} +10 -3
- package/dist/chunk-TBEGGJNC.cjs +310 -0
- package/dist/{chunk-RRZS5A53.js → chunk-TNZRZQ7Q.js} +1 -1
- package/dist/{chunk-CH4SPVFD.cjs → chunk-TXSDBGKX.cjs} +10 -3
- package/dist/chunk-U3WDY42C.cjs +42 -0
- package/dist/{chunk-425MT6Y5.cjs → chunk-U46VYPLR.cjs} +9 -9
- package/dist/{chunk-OLG7LZBD.js → chunk-VG34MG2U.js} +1 -1
- package/dist/{chunk-XDVG3NM4.js → chunk-W3X6PAC7.js} +2 -48
- package/dist/{chunk-LYMTYC67.js → chunk-WHE2SWHU.js} +2 -2
- package/dist/chunk-WM5PAOTQ.cjs +4498 -0
- package/dist/chunk-WNUVPKBW.js +42 -0
- package/dist/{chunk-EV53SLSB.cjs → chunk-WPVWQSL7.cjs} +4 -4
- package/dist/chunk-WQ3VJXZB.js +118 -0
- package/dist/{chunk-HMRDNRTH.js → chunk-X2MSVKDV.js} +2 -2
- package/dist/chunk-X3WS5LDG.js +504 -0
- package/dist/{chunk-43XS26AQ.cjs → chunk-X5VSP65C.cjs} +4 -4
- package/dist/{chunk-DSCQPWUB.cjs → chunk-X5YJ34FZ.cjs} +15 -15
- package/dist/chunk-XAV24VYN.js +48 -0
- package/dist/chunk-XDLH4EDL.cjs +118 -0
- package/dist/{chunk-X765A7J5.js → chunk-XRZEUWKF.js} +1 -1
- package/dist/{chunk-ZKZRFH37.cjs → chunk-XTB6VJVQ.cjs} +6 -6
- package/dist/{chunk-H3GBSPK5.js → chunk-XX2ZO7DS.js} +14 -6
- package/dist/{chunk-RUZB43HU.cjs → chunk-Y72HH2TF.cjs} +22 -14
- package/dist/chunk-YFXTE422.cjs +92 -0
- package/dist/{chunk-OSUWEUZE.js → chunk-YGN4CQIP.js} +1 -1
- package/dist/{chunk-KC5FPUOF.cjs → chunk-YRLYSQEQ.cjs} +2 -2
- package/dist/{chunk-3KBBARKO.js → chunk-YZXUDM5X.js} +85 -28
- package/dist/chunk-Z36XBUMX.cjs +83 -0
- package/dist/chunk-ZK6HOR62.js +92 -0
- package/dist/{chunk-PDKNHU5G.cjs → chunk-ZQE72E6W.cjs} +22 -16
- package/dist/chunk-ZVY2XD6T.js +1607 -0
- package/dist/{chunk-XBUMKEFN.cjs → chunk-ZYQMLKOK.cjs} +91 -34
- package/dist/clear-UO4MNWZW.cjs +12 -0
- package/dist/clear-ZJ5NYP6E.js +12 -0
- package/dist/communityInstaller-6KCFN7YZ.js +19 -0
- package/dist/communityInstaller-PVSOFDZD.cjs +19 -0
- package/dist/completion-MMF2PN2H.js +14 -0
- package/dist/completion-UI5WKHXI.cjs +14 -0
- package/dist/config-E7RINK4R.cjs +18 -0
- package/dist/config-ZN66VXPS.js +18 -0
- package/dist/constants-6CPCJ3DY.cjs +21 -0
- package/dist/{constants-V6J54N3X.js → constants-UFM5B232.js} +2 -1
- package/dist/{defaultHooks-WLMRQUXG.cjs → defaultHooks-RCXPHF4M.cjs} +3 -1
- package/dist/{defaultHooks-R56VYG7I.js → defaultHooks-RDRMER3Z.js} +2 -0
- package/dist/export-N4XIVDSL.cjs +12 -0
- package/dist/export-W22L4D5C.js +12 -0
- package/dist/extractSessionMemories-SDW2MVBQ.cjs +7 -0
- package/dist/extractSessionMemories-V7K42ZHW.js +7 -0
- package/dist/feedback-DR6ADSNE.cjs +15 -0
- package/dist/feedback-FEEAP4QW.js +15 -0
- package/dist/filesystem-3SGCW2BF.js +10 -0
- package/dist/filesystem-MCFXJQ6R.cjs +10 -0
- package/dist/formatters-6K7QVWQL.cjs +10 -0
- package/dist/formatters-DQHO5I36.js +10 -0
- package/dist/{help-LKKQU2TN.js → help-2BLR7L43.js} +3 -2
- package/dist/help-AQHGTS7P.cjs +12 -0
- package/dist/{history-AV4XBFRK.js → history-5FZ3M2AK.js} +3 -2
- package/dist/history-NIUDRMKA.cjs +14 -0
- package/dist/hooks-2EY4IPKV.js +13 -0
- package/dist/hooks-LJVORRIG.cjs +13 -0
- package/dist/i18n-ARDG2SMC.cjs +33 -0
- package/dist/{i18n-BSAPXM56.js → i18n-K7QOWIBH.js} +2 -1
- package/dist/ide-GFW6IJHD.js +12 -0
- package/dist/ide-N2ZNSSB3.cjs +12 -0
- package/dist/import-DFVN3KNZ.js +10 -0
- package/dist/import-QEME3E4T.cjs +170 -0
- package/dist/import-UXM3VK7B.js +170 -0
- package/dist/import-ZS6DPGU5.cjs +10 -0
- package/dist/index.cjs +11233 -11804
- package/dist/index.js +12594 -13165
- package/dist/init-PY75HA3S.cjs +10 -0
- package/dist/init-QNMWLAVY.js +10 -0
- package/dist/language-5UE4G2BT.cjs +18 -0
- package/dist/language-UXMHEZUJ.js +18 -0
- package/dist/learn-HJ3FLNZC.cjs +20 -0
- package/dist/learn-MVYS3RU5.js +20 -0
- package/dist/{lint-44UQJ673.cjs → lint-D5UOJWIK.cjs} +1 -0
- package/dist/{lint-TA2ZHVLM.js → lint-NJPZWVN2.js} +1 -0
- package/dist/{localProjectPermissions-WQYMGI42.js → localProjectPermissions-N77HA3XK.js} +3 -2
- package/dist/localProjectPermissions-UFSMNTBJ.cjs +18 -0
- package/dist/login-DSE7H63A.js +20 -0
- package/dist/login-V3MEWPKN.cjs +20 -0
- package/dist/logout-BMVCLKKW.js +18 -0
- package/dist/logout-XEG7FHOZ.cjs +18 -0
- package/dist/mcp-PYUR4PHO.js +18 -0
- package/dist/mcp-SG6JFLGC.cjs +18 -0
- package/dist/{mcp-install-2KVKRAMQ.cjs → mcp-install-G27HSS3Z.cjs} +26 -14
- package/dist/{mcp-install-77UXRN6R.js → mcp-install-VESN42PI.js} +21 -9
- package/dist/memory-4ZMMEZ2Z.js +10 -0
- package/dist/memory-QSGMVVGH.cjs +10 -0
- package/dist/message-JUBOK2VU.js +9 -0
- package/dist/message-ZJ5AYAMT.cjs +9 -0
- package/dist/model-NANLBZ4Z.cjs +10 -0
- package/dist/model-ZXNV4AF7.js +10 -0
- package/dist/new-5QJY5JP2.js +12 -0
- package/dist/new-PMMG55UX.cjs +12 -0
- package/dist/{patch-BAAQIYSW.js → patch-5F6VBIT3.js} +2 -0
- package/dist/{patch-J32X2QQP.cjs → patch-MOD7QC3D.cjs} +3 -1
- package/dist/permissions-LECTCJ4H.cjs +13 -0
- package/dist/permissions-VP5VGIBL.js +13 -0
- package/dist/{plan-JFGNRL2S.js → plan-G5CEKJI4.js} +1 -0
- package/dist/{plan-B3CW5DXJ.cjs → plan-QKOHE3LH.cjs} +1 -0
- package/dist/quit-BKOOPHU5.cjs +10 -0
- package/dist/quit-FVFNYACP.js +10 -0
- package/dist/registry-KWZGYJC2.js +2108 -0
- package/dist/registry-YN4FQPOO.cjs +2108 -0
- package/dist/resume-EXFQSQPH.js +13 -0
- package/dist/resume-PP2IQM5S.cjs +13 -0
- package/dist/search-C56FBN67.cjs +17 -0
- package/dist/search-XGZDYBF4.js +17 -0
- package/dist/{session-T3TAZ5ZU.cjs → session-BSU2L5UI.cjs} +1 -0
- package/dist/{session-H5QWKE5E.js → session-SZMRN5KG.js} +1 -0
- package/dist/sessions-54KI3F2Q.js +10 -0
- package/dist/sessions-DDTSPNVW.cjs +10 -0
- package/dist/settings-BDO37TTO.cjs +30 -0
- package/dist/settings-FHRDFPLK.js +30 -0
- package/dist/share-IERCTBGN.cjs +14 -0
- package/dist/share-TGROUE6R.js +14 -0
- package/dist/skills-6OL4OSGA.js +76 -0
- package/dist/skills-FYY6F2WV.cjs +76 -0
- package/dist/skills-OM4IGBAA.cjs +26 -0
- package/dist/skills-S3GRN323.js +26 -0
- package/dist/{skills-install-MQINL3EC.js → skills-install-6CSWC24P.js} +97 -26
- package/dist/{skills-install-IKJZN4G2.cjs → skills-install-O3LZ2ETC.cjs} +106 -35
- package/dist/skills-new-ALD2PTHN.js +15 -0
- package/dist/skills-new-PWLKK7GW.cjs +15 -0
- package/dist/slashCommands-L4ZD33LJ.js +75 -0
- package/dist/slashCommands-YY2VUUDF.cjs +75 -0
- package/dist/status-3PC5XWSS.cjs +11 -0
- package/dist/status-KCLVOYPD.js +11 -0
- package/dist/sync-6SDWG5RK.js +18 -0
- package/dist/sync-7JMZVEQD.cjs +40 -0
- package/dist/{sync-EXYX7HXW.js → sync-KWX67OUN.js} +3 -2
- package/dist/sync-WHURZL3U.cjs +18 -0
- package/dist/tasks-5FPBIFLC.js +9 -0
- package/dist/tasks-TXGKGNH6.cjs +9 -0
- package/dist/team-5YXP3JGR.js +9 -0
- package/dist/team-IIWEZKNR.cjs +9 -0
- package/dist/teammate-2KMKJXAM.cjs +139 -0
- package/dist/teammate-L6EZQ3I2.js +139 -0
- package/dist/theme-BE5A4FPN.cjs +18 -0
- package/dist/theme-YMFCQP7J.js +18 -0
- package/dist/ui/questionModal.cjs +7 -25
- package/dist/ui/questionModal.js +6 -24
- package/dist/undo-KZHUUZTD.cjs +10 -0
- package/dist/undo-NEIEHQVX.js +10 -0
- package/dist/update-TVAJMMBC.js +82 -0
- package/dist/update-Z6BIIQDC.cjs +82 -0
- package/package.json +10 -3
- package/dist/CommunitySkillsCache-ILWHWE5P.js +0 -7
- package/dist/CommunitySkillsCache-KHC6RUJW.cjs +0 -7
- package/dist/HookManager-X47HCM5G.cjs +0 -6
- package/dist/HookManager-ZXKHCD7U.js +0 -6
- package/dist/MemoryManager-6ZT7IDO5.cjs +0 -7
- package/dist/MemoryManager-AJGS5AKB.js +0 -7
- package/dist/PermissionManager-HG6W2DGU.cjs +0 -10
- package/dist/SessionManager-BJ2G6VV4.cjs +0 -9
- package/dist/SessionManager-ENPGYK5J.js +0 -9
- package/dist/SkillsRegistry-6ZFOCT25.cjs +0 -8
- package/dist/SkillsRegistry-C2SHOZ5D.js +0 -8
- package/dist/about-3BJTNSLK.js +0 -11
- package/dist/about-EABQNJGV.cjs +0 -11
- package/dist/add-dir-7FD4DMDA.cjs +0 -9
- package/dist/add-dir-LOYJ4YB5.js +0 -9
- package/dist/agents-2Y6ASV7C.js +0 -10
- package/dist/agents-UOSPKLQL.cjs +0 -10
- package/dist/agents-new-23NSGAM5.js +0 -13
- package/dist/agents-new-WI2EL7IJ.cjs +0 -13
- package/dist/automode-LGWTY3UX.js +0 -9
- package/dist/automode-WLBQ7MN7.cjs +0 -9
- package/dist/chunk-5UBW2BGC.js +0 -33
- package/dist/chunk-I6DBWNLN.cjs +0 -169
- package/dist/chunk-IZBCMJHJ.cjs +0 -33
- package/dist/completion-7WGMHKOR.cjs +0 -13
- package/dist/completion-KH33NSGP.js +0 -13
- package/dist/constants-RBQTR32A.cjs +0 -20
- package/dist/export-3QN3IH7A.js +0 -11
- package/dist/export-BI54X3MP.cjs +0 -11
- package/dist/feedback-CI4OIPOS.cjs +0 -14
- package/dist/feedback-GFPL5STE.js +0 -14
- package/dist/formatters-N5IJKYZY.cjs +0 -8
- package/dist/formatters-UG6VZJJ5.js +0 -8
- package/dist/help-CWMUGD3V.cjs +0 -11
- package/dist/history-73VBEMSI.cjs +0 -13
- package/dist/hooks-62UDQBGH.cjs +0 -12
- package/dist/hooks-XORDJD5X.js +0 -12
- package/dist/i18n-X2IU2EZD.cjs +0 -32
- package/dist/ide-RPKZALQV.js +0 -11
- package/dist/ide-YMNXJB6A.cjs +0 -11
- package/dist/init-J5HR4R7U.js +0 -9
- package/dist/init-JCC7RVMC.cjs +0 -9
- package/dist/language-AZISJCEZ.js +0 -16
- package/dist/language-F65RA6FZ.cjs +0 -16
- package/dist/localProjectPermissions-2EATUDZM.cjs +0 -17
- package/dist/login-5HLPMECE.js +0 -18
- package/dist/login-ISWYYBXP.cjs +0 -18
- package/dist/logout-3EKZM5J3.cjs +0 -16
- package/dist/logout-GE7TSZ24.js +0 -16
- package/dist/mcp-EW64QRFA.cjs +0 -15
- package/dist/mcp-VHS7AMF2.js +0 -15
- package/dist/memory-2I473RU3.js +0 -9
- package/dist/memory-JZ6NPSP3.cjs +0 -9
- package/dist/model-GXZLARPT.js +0 -9
- package/dist/model-Y274DBDO.cjs +0 -9
- package/dist/new-BG5VIGZ7.cjs +0 -9
- package/dist/new-YXFDQOA7.js +0 -9
- package/dist/permissions-QILEAGBP.cjs +0 -12
- package/dist/permissions-WVEOVMWO.js +0 -12
- package/dist/quit-NC32OEJG.cjs +0 -9
- package/dist/quit-WRRIGU33.js +0 -9
- package/dist/resume-GJIKIDPR.cjs +0 -12
- package/dist/resume-RMJNCAOK.js +0 -12
- package/dist/search-UIWIXB73.js +0 -14
- package/dist/search-WQNXDA2E.cjs +0 -14
- package/dist/sessions-HPFX2GDD.js +0 -9
- package/dist/sessions-SAQU6MFA.cjs +0 -9
- package/dist/share-2WH5ZVOO.cjs +0 -13
- package/dist/share-PSSWWVV5.js +0 -13
- package/dist/skills-LJZA6PVJ.js +0 -13
- package/dist/skills-YTYGART7.cjs +0 -13
- package/dist/skills-new-3WCU3CWB.js +0 -14
- package/dist/skills-new-O5LFVFZU.cjs +0 -14
- package/dist/slashCommands-7IRDOXOQ.cjs +0 -55
- package/dist/slashCommands-C6CAQA25.js +0 -55
- package/dist/status-4EDV2LSY.cjs +0 -10
- package/dist/status-NU7TJDCE.js +0 -10
- package/dist/sync-3GFSEIAZ.js +0 -16
- package/dist/sync-6M3WRKMH.cjs +0 -39
- package/dist/sync-CQNQDNTJ.cjs +0 -16
- package/dist/theme-EMJGULMI.cjs +0 -16
- package/dist/theme-FGDSXNU3.js +0 -16
- package/dist/undo-CTXQYE7C.cjs +0 -9
- package/dist/undo-HX2ZMECP.js +0 -9
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkMAKMSQMQcjs = require('./chunk-MAKMSQMQ.cjs');
|
|
4
|
+
|
|
5
|
+
// src/skills/learnPrompts.ts
|
|
6
|
+
function buildLearnSystemPrompt() {
|
|
7
|
+
return `You are an expert developer tool advisor for Autohand, an AI coding agent.
|
|
8
|
+
|
|
9
|
+
Your task: Analyze a project, audit its existing skills, and recommend the most valuable community skills from the catalog.
|
|
10
|
+
|
|
11
|
+
## Analysis Steps
|
|
12
|
+
|
|
13
|
+
1. **Summarize the project** in one sentence (stack, purpose, patterns)
|
|
14
|
+
2. **Audit installed skills**: flag any that are:
|
|
15
|
+
- "redundant": overlaps significantly with another installed skill
|
|
16
|
+
- "outdated": no longer relevant to the current project stack
|
|
17
|
+
- "conflicting": contradicts or interferes with another skill
|
|
18
|
+
Only include entries where there is a genuine issue. Empty array if all skills are fine.
|
|
19
|
+
3. **Rank catalog skills** by relevance (0-100):
|
|
20
|
+
- Language/framework match (40 pts)
|
|
21
|
+
- Pattern relevance (30 pts)
|
|
22
|
+
- Gap filling \u2014 addresses what installed skills don't cover (20 pts)
|
|
23
|
+
- Specificity (10 pts)
|
|
24
|
+
4. **Gap analysis**: if no catalog skill scores above 60, describe the most impactful missing capability in 1-2 sentences. Set to null if good matches exist.
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
- Do NOT inflate scores \u2014 a React skill scores 0 for a Rust project
|
|
28
|
+
- Do NOT recommend skills that duplicate already-installed ones
|
|
29
|
+
- Return ALL catalog skills with their scores, even low ones \u2014 the client filters by threshold
|
|
30
|
+
- Be honest \u2014 if the catalog is poor for this project, say so in gapAnalysis
|
|
31
|
+
|
|
32
|
+
## Response Format
|
|
33
|
+
Return ONLY a JSON object:
|
|
34
|
+
{
|
|
35
|
+
"projectSummary": "...",
|
|
36
|
+
"audit": [{ "skill": "name", "status": "redundant|outdated|conflicting", "reason": "..." }],
|
|
37
|
+
"recommendations": [{ "slug": "id", "score": 0-100, "reason": "..." }],
|
|
38
|
+
"gapAnalysis": "..." | null
|
|
39
|
+
}`;
|
|
40
|
+
}
|
|
41
|
+
function buildLearnUserPrompt(analysis, installedSkills, registrySkills) {
|
|
42
|
+
const parts = [];
|
|
43
|
+
parts.push("# Project Analysis");
|
|
44
|
+
parts.push(`**Project:** ${analysis.projectName}`);
|
|
45
|
+
parts.push(`**Languages:** ${analysis.languages.length > 0 ? analysis.languages.join(", ") : "none detected"}`);
|
|
46
|
+
parts.push(`**Frameworks:** ${analysis.frameworks.length > 0 ? analysis.frameworks.join(", ") : "none detected"}`);
|
|
47
|
+
parts.push(`**Patterns:** ${analysis.patterns.length > 0 ? analysis.patterns.join(", ") : "none detected"}`);
|
|
48
|
+
parts.push(`**Package Manager:** ${_nullishCoalesce(analysis.packageManager, () => ( "unknown"))}`);
|
|
49
|
+
parts.push(`**Has Tests:** ${analysis.hasTests ? "Yes" : "No"}`);
|
|
50
|
+
parts.push(`**Has CI/CD:** ${analysis.hasCI ? "Yes" : "No"}`);
|
|
51
|
+
if (analysis.dependencies.length > 0) {
|
|
52
|
+
const topDeps = analysis.dependencies.slice(0, 30);
|
|
53
|
+
parts.push(`**Key Dependencies:** ${topDeps.join(", ")}`);
|
|
54
|
+
}
|
|
55
|
+
parts.push("");
|
|
56
|
+
parts.push("# Currently Installed Skills");
|
|
57
|
+
if (installedSkills.length === 0) {
|
|
58
|
+
parts.push("No skills currently installed.");
|
|
59
|
+
} else {
|
|
60
|
+
for (const skill of installedSkills) {
|
|
61
|
+
parts.push(`- **${skill.name}**: ${skill.description} [source: ${skill.source}]`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
parts.push("");
|
|
65
|
+
parts.push("# Available Community Skills Catalog");
|
|
66
|
+
if (registrySkills.length === 0) {
|
|
67
|
+
parts.push("No community skills available in the catalog.");
|
|
68
|
+
} else {
|
|
69
|
+
const skillWord = registrySkills.length === 1 ? "community skill" : "community skills";
|
|
70
|
+
parts.push(`${registrySkills.length} ${skillWord} available.`);
|
|
71
|
+
const projectLanguages = new Set(analysis.languages.map((l) => l.toLowerCase()));
|
|
72
|
+
const projectFrameworks = new Set(analysis.frameworks.map((f) => f.toLowerCase()));
|
|
73
|
+
const relevant = registrySkills.filter((skill) => {
|
|
74
|
+
const skillLangs = (_nullishCoalesce(skill.languages, () => ( []))).map((l) => l.toLowerCase());
|
|
75
|
+
const skillFw = (_nullishCoalesce(skill.frameworks, () => ( []))).map((f) => f.toLowerCase());
|
|
76
|
+
return skillLangs.some((l) => projectLanguages.has(l)) || skillFw.some((f) => projectFrameworks.has(f));
|
|
77
|
+
});
|
|
78
|
+
if (relevant.length > 0) {
|
|
79
|
+
parts.push("");
|
|
80
|
+
parts.push(`## Matching Skills (${relevant.length} match project stack)`);
|
|
81
|
+
for (const skill of relevant.slice(0, 15)) {
|
|
82
|
+
const tags = _nullishCoalesce(_optionalChain([skill, 'access', _ => _.tags, 'optionalAccess', _2 => _2.join, 'call', _3 => _3(", ")]), () => ( ""));
|
|
83
|
+
const languages = _nullishCoalesce(_optionalChain([skill, 'access', _4 => _4.languages, 'optionalAccess', _5 => _5.join, 'call', _6 => _6(", ")]), () => ( ""));
|
|
84
|
+
const frameworks = _nullishCoalesce(_optionalChain([skill, 'access', _7 => _7.frameworks, 'optionalAccess', _8 => _8.join, 'call', _9 => _9(", ")]), () => ( ""));
|
|
85
|
+
parts.push(
|
|
86
|
+
`- **${skill.id}**: ${skill.description} [category: ${skill.category}] [tags: ${tags}] [languages: ${languages}] [frameworks: ${frameworks}]`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
if (relevant.length > 15) {
|
|
90
|
+
parts.push(` ... and ${relevant.length - 15} more matching skills`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
parts.push("");
|
|
94
|
+
parts.push("Use the `find_agent_skills` tool to search for additional skills by keyword, category, or framework.");
|
|
95
|
+
}
|
|
96
|
+
parts.push("");
|
|
97
|
+
parts.push("Analyze this project, audit installed skills, and rank the catalog.");
|
|
98
|
+
return parts.join("\n");
|
|
99
|
+
}
|
|
100
|
+
function buildLearnGenerationSystemPrompt() {
|
|
101
|
+
return `You are an expert at creating Agent Skills for Autohand, an AI coding assistant.
|
|
102
|
+
|
|
103
|
+
## Your Task
|
|
104
|
+
Generate exactly 1 high-quality, actionable skill tailored to this specific project. The skill should address the most impactful gap \u2014 something this project clearly needs but no existing community skill covers.
|
|
105
|
+
|
|
106
|
+
## Skill Quality Guidelines
|
|
107
|
+
1. **Clear Purpose**: Solve a specific, recurring problem for this exact stack
|
|
108
|
+
2. **Concrete Examples**: Include 2-3 usage examples showing exact prompts
|
|
109
|
+
3. **Actionable Steps**: Provide step-by-step workflows, not vague guidance
|
|
110
|
+
4. **Tool Awareness**: Specify which tools the skill needs in allowed-tools
|
|
111
|
+
5. **Platform Aware**: Use appropriate commands for the detected OS
|
|
112
|
+
|
|
113
|
+
## Response Format
|
|
114
|
+
Return ONLY a JSON object:
|
|
115
|
+
{
|
|
116
|
+
"name": "kebab-case-name",
|
|
117
|
+
"description": "1-2 sentences explaining when to use this skill",
|
|
118
|
+
"allowedTools": ["tool1", "tool2"],
|
|
119
|
+
"body": "Full markdown body with sections: overview, ## When to Use, ## How to Use (with example prompts), ## Workflow (numbered steps), ## Tips"
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
Return ONLY the JSON object, no other text.`;
|
|
123
|
+
}
|
|
124
|
+
function buildLearnGenerationUserPrompt(analysis, gapAnalysis, lowScoringSkills) {
|
|
125
|
+
const parts = [];
|
|
126
|
+
parts.push(_chunkMAKMSQMQcjs.buildSkillGenerationPrompt.call(void 0, analysis));
|
|
127
|
+
parts.push("");
|
|
128
|
+
parts.push("## Context");
|
|
129
|
+
parts.push("No existing community skills matched well for this project.");
|
|
130
|
+
const topThree = lowScoringSkills.slice(0, 3);
|
|
131
|
+
if (topThree.length > 0) {
|
|
132
|
+
parts.push("The closest matches were:");
|
|
133
|
+
for (const rec of topThree) {
|
|
134
|
+
parts.push(`- **${rec.slug}** (score: ${rec.score}): ${rec.reason}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
parts.push("");
|
|
138
|
+
if (gapAnalysis !== null) {
|
|
139
|
+
parts.push(`Gap analysis: ${gapAnalysis}`);
|
|
140
|
+
parts.push("");
|
|
141
|
+
}
|
|
142
|
+
parts.push("Generate a skill that fills the most important gap for this project.");
|
|
143
|
+
return parts.join("\n");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/skills/LearnAdvisor.ts
|
|
147
|
+
function toKebabCase(name) {
|
|
148
|
+
return name.trim().replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").replace(/[^a-zA-Z0-9-]/g, "").replace(/-+/g, "-").replace(/^-|-$/g, "").toLowerCase();
|
|
149
|
+
}
|
|
150
|
+
var VALID_AUDIT_STATUSES = /* @__PURE__ */ new Set(["redundant", "outdated", "conflicting"]);
|
|
151
|
+
var LearnAdvisor = class {
|
|
152
|
+
constructor(llm) {
|
|
153
|
+
this.llm = llm;
|
|
154
|
+
}
|
|
155
|
+
/* ── Phase 1: Analyze + rank + audit ──────────────────────── */
|
|
156
|
+
/**
|
|
157
|
+
* Analyze the project, audit installed skills, and rank registry catalog.
|
|
158
|
+
*
|
|
159
|
+
* Returns a validated `LearnAnalysisResponse`. On any error (LLM failure,
|
|
160
|
+
* invalid JSON, malformed fields) returns a safe empty fallback.
|
|
161
|
+
*/
|
|
162
|
+
async analyze(analysis, installedSkills, registrySkills) {
|
|
163
|
+
const fallback = {
|
|
164
|
+
projectSummary: "",
|
|
165
|
+
audit: [],
|
|
166
|
+
recommendations: [],
|
|
167
|
+
gapAnalysis: null
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
const response = await this.llm.complete({
|
|
171
|
+
messages: [
|
|
172
|
+
{ role: "system", content: buildLearnSystemPrompt() },
|
|
173
|
+
{ role: "user", content: buildLearnUserPrompt(analysis, installedSkills, registrySkills) }
|
|
174
|
+
],
|
|
175
|
+
maxTokens: 4e3,
|
|
176
|
+
temperature: 0.2
|
|
177
|
+
});
|
|
178
|
+
const json = this.extractJson(response.content);
|
|
179
|
+
if (json === null) return fallback;
|
|
180
|
+
const parsed = JSON.parse(json);
|
|
181
|
+
const projectSummary = typeof parsed.projectSummary === "string" ? parsed.projectSummary : "";
|
|
182
|
+
const gapAnalysis = typeof parsed.gapAnalysis === "string" ? parsed.gapAnalysis : null;
|
|
183
|
+
const recommendations = Array.isArray(parsed.recommendations) ? parsed.recommendations.filter(
|
|
184
|
+
(r) => this.isValidRecommendation(r)
|
|
185
|
+
) : [];
|
|
186
|
+
const audit = Array.isArray(parsed.audit) ? parsed.audit.filter(
|
|
187
|
+
(e) => this.isValidAuditEntry(e)
|
|
188
|
+
) : [];
|
|
189
|
+
return { projectSummary, audit, recommendations, gapAnalysis };
|
|
190
|
+
} catch (e2) {
|
|
191
|
+
return fallback;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/* ── Phase 2: Generate custom skill ──────────────────────── */
|
|
195
|
+
/**
|
|
196
|
+
* Generate a custom skill when no catalog entry scores well.
|
|
197
|
+
*
|
|
198
|
+
* Returns a validated `LearnGeneratedSkill`. On error, returns an object
|
|
199
|
+
* with `{ error: string }` describing what went wrong, or `null` if
|
|
200
|
+
* the LLM call itself fails.
|
|
201
|
+
*/
|
|
202
|
+
async generateSkill(analysis, gapAnalysis, lowScoringSkills) {
|
|
203
|
+
try {
|
|
204
|
+
const response = await this.llm.complete({
|
|
205
|
+
messages: [
|
|
206
|
+
{ role: "system", content: buildLearnGenerationSystemPrompt() },
|
|
207
|
+
{
|
|
208
|
+
role: "user",
|
|
209
|
+
content: buildLearnGenerationUserPrompt(analysis, gapAnalysis, lowScoringSkills)
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
maxTokens: 6e3,
|
|
213
|
+
temperature: 0.3
|
|
214
|
+
});
|
|
215
|
+
const json = this.extractJson(response.content);
|
|
216
|
+
if (json === null) return null;
|
|
217
|
+
const parsed = JSON.parse(json);
|
|
218
|
+
if (typeof parsed.name !== "string") return null;
|
|
219
|
+
if (typeof parsed.description !== "string") return null;
|
|
220
|
+
if (typeof parsed.body !== "string") return null;
|
|
221
|
+
const normalizedName = toKebabCase(parsed.name);
|
|
222
|
+
if (!normalizedName) return null;
|
|
223
|
+
const allowedTools = Array.isArray(parsed.allowedTools) ? parsed.allowedTools.filter((t) => typeof t === "string") : [];
|
|
224
|
+
return {
|
|
225
|
+
name: normalizedName,
|
|
226
|
+
description: parsed.description,
|
|
227
|
+
allowedTools,
|
|
228
|
+
body: parsed.body
|
|
229
|
+
};
|
|
230
|
+
} catch (error) {
|
|
231
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
232
|
+
if (process.env.DEBUG) {
|
|
233
|
+
console.error(`[LearnAdvisor] generateSkill failed: ${msg}`);
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/* ── Private helpers ─────────────────────────────────────── */
|
|
239
|
+
/**
|
|
240
|
+
* Extract a JSON string from LLM output that may contain markdown
|
|
241
|
+
* code fences or surrounding prose.
|
|
242
|
+
*
|
|
243
|
+
* Strategy:
|
|
244
|
+
* 1. If content starts with `{` or `[`, return as-is (already JSON).
|
|
245
|
+
* 2. Try extracting from ` ```json ... ``` ` blocks.
|
|
246
|
+
* 3. Try finding `{...}` in the text via greedy regex.
|
|
247
|
+
* 4. Return null if nothing found.
|
|
248
|
+
*/
|
|
249
|
+
extractJson(content) {
|
|
250
|
+
const trimmed = content.trim();
|
|
251
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
252
|
+
return trimmed;
|
|
253
|
+
}
|
|
254
|
+
const fenceMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
|
|
255
|
+
if (_optionalChain([fenceMatch, 'optionalAccess', _10 => _10[1]])) {
|
|
256
|
+
return fenceMatch[1].trim();
|
|
257
|
+
}
|
|
258
|
+
const braceMatch = trimmed.match(/\{[\s\S]*\}/);
|
|
259
|
+
if (braceMatch) {
|
|
260
|
+
return braceMatch[0];
|
|
261
|
+
}
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate that an unknown value looks like a `LearnRecommendation`.
|
|
266
|
+
*/
|
|
267
|
+
isValidRecommendation(rec) {
|
|
268
|
+
if (rec === null || typeof rec !== "object") return false;
|
|
269
|
+
const r = rec;
|
|
270
|
+
return typeof r.slug === "string" && typeof r.score === "number" && typeof r.reason === "string";
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Validate that an unknown value looks like a `LearnAuditEntry`.
|
|
274
|
+
*/
|
|
275
|
+
isValidAuditEntry(entry) {
|
|
276
|
+
if (entry === null || typeof entry !== "object") return false;
|
|
277
|
+
const e = entry;
|
|
278
|
+
return typeof e.skill === "string" && typeof e.status === "string" && VALID_AUDIT_STATUSES.has(e.status) && typeof e.reason === "string";
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
exports.LearnAdvisor = LearnAdvisor;
|
|
285
|
+
/**
|
|
286
|
+
* @license
|
|
287
|
+
* Copyright 2025 Autohand AI LLC
|
|
288
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
289
|
+
*
|
|
290
|
+
* Learn Prompts — LLM prompt builders for the /learn advisor
|
|
291
|
+
*
|
|
292
|
+
* Phase 1: Analyze project, audit installed skills, rank catalog
|
|
293
|
+
* Phase 2: Generate a custom skill when no catalog match is good enough
|
|
294
|
+
*/
|
|
295
|
+
/**
|
|
296
|
+
* @license
|
|
297
|
+
* Copyright 2025 Autohand AI LLC
|
|
298
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
299
|
+
*
|
|
300
|
+
* LearnAdvisor — LLM orchestration for the /learn command.
|
|
301
|
+
*
|
|
302
|
+
* Phase 1 (`analyze`): Analyze the project, audit installed skills,
|
|
303
|
+
* and rank community catalog entries by relevance.
|
|
304
|
+
*
|
|
305
|
+
* Phase 2 (`generateSkill`): When no catalog skill scores well, generate
|
|
306
|
+
* a custom skill tailored to the project.
|
|
307
|
+
*
|
|
308
|
+
* This class does NO file I/O, registry fetching, or skill installation.
|
|
309
|
+
* It only calls the LLM and parses structured JSON responses.
|
|
310
|
+
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// package.json
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "autohand-cli",
|
|
4
|
-
version: "0.
|
|
4
|
+
version: "0.8.2",
|
|
5
5
|
license: "Apache-2.0",
|
|
6
6
|
description: "Autohand interactive coding agent CLI powered by LLMs.",
|
|
7
7
|
repository: {
|
|
@@ -18,7 +18,8 @@ var package_default = {
|
|
|
18
18
|
},
|
|
19
19
|
main: "dist/index.js",
|
|
20
20
|
files: [
|
|
21
|
-
"dist"
|
|
21
|
+
"dist",
|
|
22
|
+
"assets"
|
|
22
23
|
],
|
|
23
24
|
scripts: {
|
|
24
25
|
postinstall: "node scripts/fix-ansi-styles.js || true && node scripts/fix-ink-devtools.js || true && node scripts/fix-yoga-wasm.js || true",
|
|
@@ -27,6 +28,7 @@ var package_default = {
|
|
|
27
28
|
dev: "bun src/index.ts",
|
|
28
29
|
typecheck: "tsc --noEmit",
|
|
29
30
|
lint: "eslint .",
|
|
31
|
+
proof: "bun run lint && bun run typecheck && bun run test",
|
|
30
32
|
test: "vitest run",
|
|
31
33
|
start: "node dist/index.js",
|
|
32
34
|
"compile:macos-arm64": "bun build ./src/index.ts --compile --target=bun-darwin-arm64 --outfile ./binaries/autohand-macos-arm64",
|
|
@@ -58,25 +60,30 @@ var package_default = {
|
|
|
58
60
|
ink: "^4.4.1",
|
|
59
61
|
"ink-spinner": "^5.0.0",
|
|
60
62
|
minimatch: "^10.1.1",
|
|
63
|
+
"node-notifier": "^10.0.1",
|
|
61
64
|
open: "^10.1.0",
|
|
62
65
|
ora: "^9.0.0",
|
|
63
66
|
react: "^18.2.0",
|
|
67
|
+
"string-width": "^8.2.0",
|
|
64
68
|
"terminal-link": "^3.0.0",
|
|
65
69
|
yaml: "^2.8.2",
|
|
66
70
|
zod: "^4.1.12"
|
|
67
71
|
},
|
|
68
72
|
devDependencies: {
|
|
69
73
|
"@types/diff": "^8.0.0",
|
|
70
|
-
"react-devtools-core": "^7.0.1",
|
|
71
74
|
"@types/fs-extra": "^11.0.4",
|
|
72
75
|
"@types/minimatch": "^6.0.0",
|
|
73
76
|
"@types/node": "^24.10.1",
|
|
77
|
+
"@types/node-notifier": "^8.0.5",
|
|
74
78
|
"@types/react": "^18.3.3",
|
|
75
79
|
"@types/terminal-link": "^1.2.0",
|
|
76
80
|
"@typescript-eslint/eslint-plugin": "^8.48.1",
|
|
77
81
|
"@typescript-eslint/parser": "^8.48.1",
|
|
78
82
|
eslint: "^9.39.1",
|
|
83
|
+
"ink-testing-library": "^3.0.0",
|
|
79
84
|
memfs: "^4.51.1",
|
|
85
|
+
"react-devtools-core": "^7.0.1",
|
|
86
|
+
"strip-ansi": "^7.1.2",
|
|
80
87
|
tsup: "^8.5.1",
|
|
81
88
|
tsx: "^4.20.6",
|
|
82
89
|
typescript: "^5.9.3",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/commands/tasks.ts
|
|
2
|
+
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
3
|
+
var metadata = {
|
|
4
|
+
command: "/tasks",
|
|
5
|
+
description: "Show team task list with status and owners",
|
|
6
|
+
implemented: true
|
|
7
|
+
};
|
|
8
|
+
async function tasks(ctx) {
|
|
9
|
+
if (!ctx.teamManager) {
|
|
10
|
+
return _chalk2.default.yellow("Team manager not available.");
|
|
11
|
+
}
|
|
12
|
+
const team = ctx.teamManager.getTeam();
|
|
13
|
+
if (!team) {
|
|
14
|
+
return _chalk2.default.yellow("No active team. Create one first.");
|
|
15
|
+
}
|
|
16
|
+
const allTasks = ctx.teamManager.tasks.listTasks();
|
|
17
|
+
if (allTasks.length === 0) {
|
|
18
|
+
return _chalk2.default.gray("No tasks in the current team.");
|
|
19
|
+
}
|
|
20
|
+
const done = allTasks.filter((t) => t.status === "completed").length;
|
|
21
|
+
const lines = [
|
|
22
|
+
_chalk2.default.bold(`Tasks [${done}/${allTasks.length} done]`),
|
|
23
|
+
""
|
|
24
|
+
];
|
|
25
|
+
for (const task of allTasks) {
|
|
26
|
+
const icon = task.status === "completed" ? _chalk2.default.green("\u2713") : task.status === "in_progress" ? _chalk2.default.yellow("\u25CF") : _chalk2.default.gray("\u25CB");
|
|
27
|
+
const owner = task.owner ? _chalk2.default.cyan(` \u2192 ${task.owner}`) : "";
|
|
28
|
+
const blocked = task.blockedBy.length > 0 ? _chalk2.default.red(` (blocked by: ${task.blockedBy.join(", ")})`) : "";
|
|
29
|
+
lines.push(` ${icon} ${_chalk2.default.white(task.id)} ${task.subject}${owner}${blocked}`);
|
|
30
|
+
}
|
|
31
|
+
return lines.join("\n");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
exports.metadata = metadata; exports.tasks = tasks;
|
|
38
|
+
/**
|
|
39
|
+
* @license
|
|
40
|
+
* Copyright 2025 Autohand AI LLC
|
|
41
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
42
|
+
*/
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
var _chunkJHGIWNHLcjs = require('./chunk-JHGIWNHL.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkOLSBBZW6cjs = require('./chunk-OLSBBZW6.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkSEKD5FH3cjs = require('./chunk-SEKD5FH3.cjs');
|
|
10
10
|
|
|
11
11
|
// src/commands/skills-new.ts
|
|
12
12
|
var _path = require('path'); var _path2 = _interopRequireDefault(_path);
|
|
@@ -25,7 +25,7 @@ async function createSkill(ctx) {
|
|
|
25
25
|
console.log(_chalk2.default.red("Skills registry not available."));
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
|
-
const answers = await
|
|
28
|
+
const answers = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, [
|
|
29
29
|
{
|
|
30
30
|
type: "input",
|
|
31
31
|
name: "name",
|
|
@@ -65,7 +65,7 @@ async function createSkill(ctx) {
|
|
|
65
65
|
console.log(_chalk2.default.gray("Canceled: no name provided."));
|
|
66
66
|
return null;
|
|
67
67
|
}
|
|
68
|
-
const storageResult = await
|
|
68
|
+
const storageResult = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, {
|
|
69
69
|
type: "select",
|
|
70
70
|
name: "level",
|
|
71
71
|
message: "Where should this skill be saved?",
|
|
@@ -81,7 +81,7 @@ async function createSkill(ctx) {
|
|
|
81
81
|
const storageLevel = storageResult.level;
|
|
82
82
|
if (skillsRegistry.hasSkill(name)) {
|
|
83
83
|
console.log(_chalk2.default.yellow(`A skill named "${name}" already exists.`));
|
|
84
|
-
const result = await
|
|
84
|
+
const result = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, {
|
|
85
85
|
type: "confirm",
|
|
86
86
|
name: "overwrite",
|
|
87
87
|
message: "Do you want to overwrite it?",
|
|
@@ -100,7 +100,7 @@ async function createSkill(ctx) {
|
|
|
100
100
|
console.log(_chalk2.default.gray(` Similarity: ${(match.score * 100).toFixed(0)}%`));
|
|
101
101
|
}
|
|
102
102
|
console.log();
|
|
103
|
-
const result = await
|
|
103
|
+
const result = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, {
|
|
104
104
|
type: "select",
|
|
105
105
|
name: "proceed",
|
|
106
106
|
message: "How would you like to proceed?",
|
|
@@ -150,7 +150,7 @@ Output only the raw markdown content, no code fences.`
|
|
|
150
150
|
console.log(content.length > 800 ? content.slice(0, 800) + "\n...(truncated)" : content);
|
|
151
151
|
console.log(_chalk2.default.gray("\u2500".repeat(50)));
|
|
152
152
|
console.log();
|
|
153
|
-
const confirmResult = await
|
|
153
|
+
const confirmResult = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, {
|
|
154
154
|
type: "confirm",
|
|
155
155
|
name: "confirm",
|
|
156
156
|
message: "Save this skill?",
|
|
@@ -160,7 +160,7 @@ Output only the raw markdown content, no code fences.`
|
|
|
160
160
|
console.log(_chalk2.default.gray("Canceled."));
|
|
161
161
|
return null;
|
|
162
162
|
}
|
|
163
|
-
const baseDir = storageLevel === "project" ? _path2.default.join(ctx.workspaceRoot, ".autohand", "skills") :
|
|
163
|
+
const baseDir = storageLevel === "project" ? _path2.default.join(ctx.workspaceRoot, ".autohand", "skills") : _chunkSEKD5FH3cjs.AUTOHAND_PATHS.skills;
|
|
164
164
|
const skillDir = _path2.default.join(baseDir, name);
|
|
165
165
|
const skillPath = _path2.default.join(skillDir, "SKILL.md");
|
|
166
166
|
try {
|
|
@@ -169,7 +169,7 @@ Output only the raw markdown content, no code fences.`
|
|
|
169
169
|
console.log(_chalk2.default.green(`\u2713 Saved new skill to ${skillPath}`));
|
|
170
170
|
const success = await skillsRegistry.saveSkill(name, content);
|
|
171
171
|
if (success) {
|
|
172
|
-
const activateResult = await
|
|
172
|
+
const activateResult = await _chunkOLSBBZW6cjs.safePrompt.call(void 0, {
|
|
173
173
|
type: "confirm",
|
|
174
174
|
name: "activate",
|
|
175
175
|
message: "Activate this skill now?",
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// src/commands/formatters.ts
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
|
|
4
1
|
// src/actions/formatters.ts
|
|
5
2
|
import { spawn } from "child_process";
|
|
6
3
|
import path from "path";
|
|
@@ -282,47 +279,9 @@ async function applyFormatter(name, contents, file, workspaceRoot) {
|
|
|
282
279
|
throw new Error(`Formatter "${name}" is not available. Run /formatters to see available formatters.`);
|
|
283
280
|
}
|
|
284
281
|
|
|
285
|
-
// src/commands/formatters.ts
|
|
286
|
-
var metadata = {
|
|
287
|
-
command: "/formatters",
|
|
288
|
-
description: "List available code formatters",
|
|
289
|
-
implemented: true
|
|
290
|
-
};
|
|
291
|
-
async function execute() {
|
|
292
|
-
console.log();
|
|
293
|
-
console.log(chalk.cyan.bold("Available Code Formatters"));
|
|
294
|
-
console.log(chalk.gray("\u2500".repeat(60)));
|
|
295
|
-
console.log();
|
|
296
|
-
const formatters = await listFormatters();
|
|
297
|
-
const builtIn = formatters.filter((f) => f.command === "built-in");
|
|
298
|
-
const external = formatters.filter((f) => f.command !== "built-in");
|
|
299
|
-
console.log(chalk.yellow.bold("Built-in Formatters (always available):"));
|
|
300
|
-
console.log();
|
|
301
|
-
for (const f of builtIn) {
|
|
302
|
-
console.log(` ${chalk.green("\u2713")} ${chalk.white.bold(f.name)}`);
|
|
303
|
-
console.log(` ${chalk.gray(f.description)}`);
|
|
304
|
-
console.log(` ${chalk.gray("Extensions:")} ${f.extensions.join(", ")}`);
|
|
305
|
-
console.log();
|
|
306
|
-
}
|
|
307
|
-
console.log(chalk.yellow.bold("External Formatters:"));
|
|
308
|
-
console.log();
|
|
309
|
-
for (const f of external) {
|
|
310
|
-
const status = f.installed ? chalk.green("\u2713 installed") : chalk.red("\u2717 not found");
|
|
311
|
-
console.log(` ${f.installed ? chalk.green("\u2713") : chalk.red("\u2717")} ${chalk.white.bold(f.name)} ${chalk.gray(`(${f.command})`)} - ${status}`);
|
|
312
|
-
console.log(` ${chalk.gray(f.description)}`);
|
|
313
|
-
console.log(` ${chalk.gray("Extensions:")} ${f.extensions.join(", ")}`);
|
|
314
|
-
console.log();
|
|
315
|
-
}
|
|
316
|
-
console.log(chalk.gray("\u2500".repeat(60)));
|
|
317
|
-
console.log(chalk.gray("Usage: The agent can use format_file action with any installed formatter."));
|
|
318
|
-
console.log(chalk.gray("Install missing formatters via your package manager (npm, pip, cargo, etc.)"));
|
|
319
|
-
console.log();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
282
|
export {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
execute
|
|
283
|
+
listFormatters,
|
|
284
|
+
applyFormatter
|
|
326
285
|
};
|
|
327
286
|
/**
|
|
328
287
|
* @license
|
|
@@ -332,8 +291,3 @@ export {
|
|
|
332
291
|
* Code Formatters
|
|
333
292
|
* Supports prettier, black, rustfmt, gofmt, and more
|
|
334
293
|
*/
|
|
335
|
-
/**
|
|
336
|
-
* @license
|
|
337
|
-
* Copyright 2025 Autohand AI LLC
|
|
338
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
339
|
-
*/
|
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
} from "./chunk-QHPFA6OE.js";
|
|
4
4
|
import {
|
|
5
5
|
safePrompt
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6ZCULLCA.js";
|
|
7
7
|
import {
|
|
8
8
|
AUTOHAND_PATHS
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-EGFT4PGW.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/skills-new.ts
|
|
12
12
|
import path from "path";
|