autohand-cli 0.8.2 → 0.8.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/dist/{AgentRegistry-NQCLWABO.cjs → AgentRegistry-HRPN6ZOF.cjs} +1 -1
- package/dist/{AgentRegistry-7LDL5HJH.js → AgentRegistry-ODDXPAFR.js} +1 -1
- package/dist/{AutomodeManager-NYIZNODK.cjs → AutomodeManager-6ATBE7Q5.cjs} +1 -1
- package/dist/{AutomodeManager-MWLKGPZK.js → AutomodeManager-EOVHGRPP.js} +1 -1
- package/dist/{CommunitySkillsCache-GTQMOCCO.cjs → CommunitySkillsCache-KE435RAR.cjs} +1 -1
- package/dist/{CommunitySkillsCache-6QPRMTJO.js → CommunitySkillsCache-QLE57BN5.js} +1 -1
- package/dist/{GitHubRegistryFetcher-S7QFUEKV.cjs → GitHubRegistryFetcher-I45SESIL.cjs} +1 -1
- package/dist/{GitHubRegistryFetcher-6JQ5JEDZ.js → GitHubRegistryFetcher-NT5GFZXS.js} +1 -1
- package/dist/HookManager-B2F35M27.js +7 -0
- package/dist/HookManager-PFAFE3FK.cjs +7 -0
- package/dist/{ImportWizard-35YBJ4AM.cjs → ImportWizard-CJRZPPHL.cjs} +4 -4
- package/dist/{ImportWizard-XH7CINCH.js → ImportWizard-OHRKBANZ.js} +2 -2
- package/dist/LearnAdvisor-FLBA6FDD.js +9 -0
- package/dist/LearnAdvisor-GG3CXQF3.cjs +9 -0
- package/dist/{McpClientManager-RKD7C6OY.cjs → McpClientManager-NQ3EW2IF.cjs} +1 -1
- package/dist/{McpClientManager-7RM6YT35.js → McpClientManager-VBIMGKXU.js} +1 -1
- package/dist/{MemoryManager-GUNLRP5S.js → MemoryManager-2LAT7IHS.js} +1 -1
- package/dist/{MemoryManager-TNSGKDKX.cjs → MemoryManager-2LQPIYVE.cjs} +1 -1
- package/dist/{PermissionManager-ATUV34LQ.js → PermissionManager-7NQHRCHY.js} +2 -2
- package/dist/PermissionManager-X57BXHJ6.cjs +11 -0
- package/dist/{ProjectProfiler-UMJJSOCE.js → ProjectProfiler-P4QJQWWA.js} +1 -1
- package/dist/{ProjectProfiler-ZDWR2ODG.cjs → ProjectProfiler-UG42W6WD.cjs} +1 -1
- package/dist/{ProviderFactory-MR5B23QJ.js → ProviderFactory-2IYJ5OPW.js} +2 -2
- package/dist/ProviderFactory-KPJOGQWF.cjs +9 -0
- package/dist/{SessionManager-IKWAK2PI.js → SessionManager-4U4JFQ3C.js} +1 -1
- package/dist/{SessionManager-FEUAU3ZJ.cjs → SessionManager-YBJAZXNO.cjs} +1 -1
- package/dist/{SkillsRegistry-KPQFTRIT.cjs → SkillsRegistry-7O72A6TZ.cjs} +1 -1
- package/dist/{SkillsRegistry-XJSKPDF2.js → SkillsRegistry-RFEINXRT.js} +1 -1
- package/dist/{SubAgent-NYH6GWQ3.js → SubAgent-JT4HZHN7.js} +2 -2
- package/dist/{SubAgent-PZKBDUBA.cjs → SubAgent-VPNYDWAU.cjs} +3 -3
- package/dist/{SyncApiClient-LVIO4C2S.js → SyncApiClient-B5RT2ECG.js} +1 -1
- package/dist/{SyncApiClient-ZNYMT36M.cjs → SyncApiClient-HQXJL5BT.cjs} +1 -1
- package/dist/about-4DB5KTHW.js +12 -0
- package/dist/about-LXAOXZFT.cjs +12 -0
- package/dist/{actionExecutor-XT5FW3W6.js → actionExecutor-23JB2WUC.js} +5 -5
- package/dist/{actionExecutor-U6IBN2TU.cjs → actionExecutor-X5UEZSKH.cjs} +6 -6
- package/dist/{add-dir-247K3XRY.js → add-dir-TUJM3PG5.js} +1 -1
- package/dist/{add-dir-GS4DXKKH.cjs → add-dir-YC37DMSF.cjs} +1 -1
- package/dist/{agents-WJPQWQF2.js → agents-YF3BSUU5.js} +1 -1
- package/dist/{agents-R6ZEFTVR.cjs → agents-ZOUHPMYR.cjs} +1 -1
- package/dist/{agents-new-HKVEIBDJ.js → agents-new-HSH4GQPG.js} +1 -1
- package/dist/{agents-new-X6GTHIO6.cjs → agents-new-VYUDOCE7.cjs} +1 -1
- package/dist/{autoSkill-6TGBTEQD.js → autoSkill-LQEVQFIH.js} +2 -2
- package/dist/autoSkill-X5W52WOE.cjs +20 -0
- package/dist/{automode-BC6NVECO.js → automode-R6P3VHLS.js} +1 -1
- package/dist/{automode-WN2RSOGW.cjs → automode-SJGM7VEI.cjs} +1 -1
- package/dist/{cc-7LEIJ3KF.js → cc-AYEP2CA3.js} +1 -1
- package/dist/{cc-Q5MM4AWC.cjs → cc-S2QLQFBR.cjs} +1 -1
- package/dist/{chunk-6OYHF6MF.js → chunk-2UC22DJU.js} +3 -3
- package/dist/{chunk-N254NRHT.cjs → chunk-3HT76LNN.cjs} +9 -2
- package/dist/{chunk-LENHP55G.cjs → chunk-3O3MOK5C.cjs} +151 -44
- package/dist/{chunk-72FKPBT5.js → chunk-3VTAFAL2.js} +2 -2
- package/dist/{chunk-5P2NXKP3.js → chunk-3WICOC33.js} +27 -23
- package/dist/chunk-3WVJEL7K.cjs +568 -0
- package/dist/{chunk-O4IF4NJT.cjs → chunk-56SWIDEL.cjs} +7 -7
- package/dist/{chunk-CAMZTXV6.js → chunk-5K6NGAVM.js} +1 -1
- package/dist/{chunk-MSED7RH2.cjs → chunk-64H4FRM3.cjs} +95 -22
- package/dist/{chunk-G3V4SFET.cjs → chunk-7TQH3CL4.cjs} +3 -3
- package/dist/{chunk-IKGWDOGU.cjs → chunk-ADUFCS4Q.cjs} +1 -1
- package/dist/{chunk-ZVY2XD6T.js → chunk-B53A2NM2.js} +552 -129
- package/dist/{chunk-4PKF7WPD.js → chunk-BJXSNT46.js} +3 -3
- package/dist/{chunk-IVM5F2AE.js → chunk-BYONM7UM.js} +1 -1
- package/dist/{chunk-BWN2CLLM.cjs → chunk-CB4E2T5N.cjs} +19 -5
- package/dist/{chunk-RO6WYEWH.js → chunk-DNUOXBHL.js} +85 -0
- package/dist/{chunk-DN573ME7.cjs → chunk-DRWDEHE5.cjs} +4 -4
- package/dist/{chunk-Q7XSCYND.cjs → chunk-DV2ZHK7B.cjs} +13 -13
- package/dist/chunk-EFX2QSZX.cjs +33 -0
- package/dist/{chunk-HOAHWIQ5.cjs → chunk-EGPXJERY.cjs} +2 -2
- package/dist/{chunk-34M3HWLR.js → chunk-FTYY5JJD.js} +1 -1
- package/dist/{chunk-TXSDBGKX.cjs → chunk-GCXYXLRA.cjs} +1 -1
- package/dist/chunk-H2ZRHQQV.js +33 -0
- package/dist/{chunk-CWMZKFTT.js → chunk-HBZU3RBZ.js} +1 -1
- package/dist/{chunk-PRRCJFU3.cjs → chunk-HNRPK5MY.cjs} +2 -2
- package/dist/{chunk-LA7H35XM.cjs → chunk-HPHJ73GU.cjs} +1 -1
- package/dist/{chunk-33RSHBDH.js → chunk-IDFF5J2E.js} +1 -1
- package/dist/{chunk-OGV4WJ5L.cjs → chunk-J2GSFVUV.cjs} +5 -5
- package/dist/{chunk-ZQE72E6W.cjs → chunk-JJLYWH5Y.cjs} +7 -7
- package/dist/{chunk-WM5PAOTQ.cjs → chunk-K2C56QGS.cjs} +191 -43
- package/dist/{chunk-643VRA5S.cjs → chunk-KANW6OYC.cjs} +3 -3
- package/dist/{chunk-6HYLHBQG.cjs → chunk-KLWJIPU2.cjs} +4 -4
- package/dist/{chunk-FKSDEWDH.js → chunk-KQGPTCQJ.js} +1 -1
- package/dist/{chunk-H5SWOLG6.js → chunk-L3TWPROA.js} +3 -3
- package/dist/{chunk-JS7IPR7P.js → chunk-LIEXWM2M.js} +12 -1
- package/dist/{chunk-J6QET7EF.cjs → chunk-MERYP6AM.cjs} +89 -4
- package/dist/{chunk-AS6RTLN7.cjs → chunk-MZAPWNAC.cjs} +48 -44
- package/dist/{chunk-CDBPBM2K.cjs → chunk-N2BLVUPM.cjs} +1 -1
- package/dist/{chunk-SCXX4LW5.js → chunk-N7LI55V4.js} +1 -1
- package/dist/{chunk-FW774QXH.js → chunk-NA6WQDYW.js} +134 -27
- package/dist/{chunk-DRE2RXBZ.js → chunk-NAGQ2PDC.js} +164 -16
- package/dist/{chunk-MAKMSQMQ.cjs → chunk-NAJ4IZKD.cjs} +2 -2
- package/dist/{chunk-JX3DFKBI.js → chunk-NTSDP2WB.js} +1 -1
- package/dist/{chunk-3PCTTUNW.cjs → chunk-OUZQXMHL.cjs} +2 -2
- package/dist/{chunk-3OTU3RS3.cjs → chunk-PGESAU2W.cjs} +599 -176
- package/dist/{chunk-IQ5RXU6O.js → chunk-QEGOB6QV.js} +1 -1
- package/dist/{chunk-JSBRDJBE.js → chunk-QGM4M3NI.js} +8 -1
- package/dist/{chunk-DSPQEHDT.js → chunk-QXH5RCFI.js} +1 -1
- package/dist/{chunk-TBEGGJNC.cjs → chunk-RDF37HKB.cjs} +32 -16
- package/dist/{chunk-J4Q7XR3G.js → chunk-SJAVBCOA.js} +1 -1
- package/dist/{chunk-AYSFIUFW.js → chunk-SV2WA57F.js} +3 -3
- package/dist/{chunk-T73IDKDF.js → chunk-SZOLA6FR.js} +1 -1
- package/dist/{chunk-LNMYK2F5.cjs → chunk-T2M64VHA.cjs} +5 -5
- package/dist/{chunk-I5IW3T2Y.js → chunk-TUAITHWL.js} +31 -15
- package/dist/{chunk-HLQV64Y5.js → chunk-TUD3Z3BD.js} +1 -1
- package/dist/{chunk-PGRH5Q77.cjs → chunk-U55TWFJI.cjs} +12 -1
- package/dist/{chunk-6RF7UKUS.js → chunk-ULDM2SNB.js} +1 -1
- package/dist/{chunk-X5YJ34FZ.cjs → chunk-VEKDGU2Q.cjs} +3 -3
- package/dist/{chunk-HQ7YZKXE.js → chunk-VWDHR4HV.js} +2 -2
- package/dist/{chunk-L3WAH3EM.cjs → chunk-W7RYQJLO.cjs} +2 -2
- package/dist/{chunk-RD5XAJR2.cjs → chunk-X2YOZQIP.cjs} +6 -6
- package/dist/{chunk-QOXPOR5D.js → chunk-XVUHNWMX.js} +105 -32
- package/dist/{chunk-33A755XB.cjs → chunk-Y45G6ZO5.cjs} +3 -3
- package/dist/chunk-ZLSGXMGQ.js +568 -0
- package/dist/{chunk-X3WS5LDG.js → chunk-ZSPXQYG2.js} +2 -2
- package/dist/{chunk-P47WPOXN.js → chunk-ZYVS43MU.js} +17 -3
- package/dist/{clear-ZJ5NYP6E.js → clear-A3N4GK2S.js} +1 -1
- package/dist/{clear-UO4MNWZW.cjs → clear-GK4IEUUS.cjs} +1 -1
- package/dist/{communityInstaller-6KCFN7YZ.js → communityInstaller-LOP2EDH5.js} +1 -1
- package/dist/{communityInstaller-PVSOFDZD.cjs → communityInstaller-XXC7RLE4.cjs} +1 -1
- package/dist/{completion-MMF2PN2H.js → completion-HWABSAEL.js} +1 -1
- package/dist/{completion-UI5WKHXI.cjs → completion-IUUVQG4D.cjs} +1 -1
- package/dist/config-HF7WOLZF.cjs +18 -0
- package/dist/{config-ZN66VXPS.js → config-HPJPKTO6.js} +4 -4
- package/dist/{constants-UFM5B232.js → constants-LISJW3DD.js} +1 -1
- package/dist/{constants-6CPCJ3DY.cjs → constants-PEO3P2SJ.cjs} +1 -1
- package/dist/{defaultHooks-RCXPHF4M.cjs → defaultHooks-IHSJR2AX.cjs} +1 -1
- package/dist/{defaultHooks-RDRMER3Z.js → defaultHooks-KUKHK3AG.js} +1 -1
- package/dist/{export-W22L4D5C.js → export-QJAV2FCZ.js} +1 -1
- package/dist/{export-N4XIVDSL.cjs → export-XSRFXGWU.cjs} +1 -1
- package/dist/{extractSessionMemories-V7K42ZHW.js → extractSessionMemories-A2JX5WJ2.js} +1 -1
- package/dist/{extractSessionMemories-SDW2MVBQ.cjs → extractSessionMemories-XL3MS37F.cjs} +1 -1
- package/dist/{feedback-DR6ADSNE.cjs → feedback-4TCIL3ML.cjs} +4 -4
- package/dist/{feedback-FEEAP4QW.js → feedback-SJ6VVEY3.js} +3 -3
- package/dist/{filesystem-MCFXJQ6R.cjs → filesystem-W56QZUJF.cjs} +1 -1
- package/dist/{filesystem-3SGCW2BF.js → filesystem-Z7BWAWMZ.js} +1 -1
- package/dist/{formatters-6K7QVWQL.cjs → formatters-53XTCNGQ.cjs} +1 -1
- package/dist/{formatters-DQHO5I36.js → formatters-T6KV4BPP.js} +1 -1
- package/dist/{help-2BLR7L43.js → help-GFQXNZOK.js} +2 -2
- package/dist/help-ISBVQL3S.cjs +12 -0
- package/dist/{history-5FZ3M2AK.js → history-E3N6BJP7.js} +1 -1
- package/dist/{history-NIUDRMKA.cjs → history-XQ4GTSFU.cjs} +1 -1
- package/dist/{hooks-2EY4IPKV.js → hooks-CJNKJ5PF.js} +1 -1
- package/dist/{hooks-LJVORRIG.cjs → hooks-UTMBTAXT.cjs} +1 -1
- package/dist/{i18n-ARDG2SMC.cjs → i18n-N7QQ7A5M.cjs} +1 -1
- package/dist/{i18n-K7QOWIBH.js → i18n-SY7QRM22.js} +1 -1
- package/dist/{ide-GFW6IJHD.js → ide-RTA4UJV4.js} +1 -1
- package/dist/{ide-N2ZNSSB3.cjs → ide-VWVOLIFF.cjs} +1 -1
- package/dist/immediateCommandRouter-BW34JNXL.js +9 -0
- package/dist/immediateCommandRouter-SHOVNB5X.cjs +9 -0
- package/dist/{import-QEME3E4T.cjs → import-ADI37ZUR.cjs} +4 -4
- package/dist/{import-DFVN3KNZ.js → import-KGKKZ3B7.js} +2 -2
- package/dist/{import-UXM3VK7B.js → import-W7SVLSTC.js} +4 -4
- package/dist/import-ZLJVONXH.cjs +10 -0
- package/dist/index.cjs +1713 -1051
- package/dist/index.js +1185 -523
- package/dist/{init-QNMWLAVY.js → init-7MFK626E.js} +1 -1
- package/dist/{init-PY75HA3S.cjs → init-TBKAB4LZ.cjs} +1 -1
- package/dist/language-MDSHEXHB.cjs +18 -0
- package/dist/{language-UXMHEZUJ.js → language-PXTQSHIG.js} +5 -5
- package/dist/{learn-HJ3FLNZC.cjs → learn-623TW5EK.cjs} +5 -5
- package/dist/{learn-MVYS3RU5.js → learn-BCPV7GM2.js} +4 -4
- package/dist/{lint-D5UOJWIK.cjs → lint-4NDGCSCL.cjs} +1 -1
- package/dist/{lint-NJPZWVN2.js → lint-FZ7ZJUB3.js} +1 -1
- package/dist/{localProjectPermissions-UFSMNTBJ.cjs → localProjectPermissions-BHQXEWZJ.cjs} +1 -1
- package/dist/{localProjectPermissions-N77HA3XK.js → localProjectPermissions-GMOUYQM6.js} +1 -1
- package/dist/{login-DSE7H63A.js → login-QMVEETWJ.js} +6 -6
- package/dist/{login-V3MEWPKN.cjs → login-QYMXAL3K.cjs} +7 -7
- package/dist/{logout-BMVCLKKW.js → logout-2CMTDAOJ.js} +6 -6
- package/dist/logout-ZOHVZAUK.cjs +18 -0
- package/dist/{mcp-PYUR4PHO.js → mcp-IUVKK65S.js} +5 -5
- package/dist/mcp-TXC7PYG3.cjs +18 -0
- package/dist/{mcp-install-VESN42PI.js → mcp-install-2FEROZTL.js} +4 -4
- package/dist/{mcp-install-G27HSS3Z.cjs → mcp-install-WM6BQRI5.cjs} +5 -5
- package/dist/{memory-4ZMMEZ2Z.js → memory-J73WZH2I.js} +1 -1
- package/dist/{memory-QSGMVVGH.cjs → memory-WRIHDEPK.cjs} +1 -1
- package/dist/{message-ZJ5AYAMT.cjs → message-4OKO775J.cjs} +1 -1
- package/dist/{message-JUBOK2VU.js → message-X3LOAAM7.js} +1 -1
- package/dist/{model-ZXNV4AF7.js → model-AES267IN.js} +1 -1
- package/dist/{model-NANLBZ4Z.cjs → model-RLP75SF5.cjs} +1 -1
- package/dist/{new-5QJY5JP2.js → new-5CLF3MKH.js} +1 -1
- package/dist/{new-PMMG55UX.cjs → new-HLSFL6A4.cjs} +1 -1
- package/dist/{patch-MOD7QC3D.cjs → patch-DJ2GPFST.cjs} +1 -1
- package/dist/{patch-5F6VBIT3.js → patch-NIJWIRHS.js} +1 -1
- package/dist/{permissions-VP5VGIBL.js → permissions-GP6FTGZ2.js} +1 -1
- package/dist/{permissions-LECTCJ4H.cjs → permissions-O6EKKPOG.cjs} +1 -1
- package/dist/{plan-G5CEKJI4.js → plan-65HMS5HQ.js} +1 -1
- package/dist/{plan-QKOHE3LH.cjs → plan-MCAXDIM2.cjs} +1 -1
- package/dist/{quit-BKOOPHU5.cjs → quit-TQX6GXA5.cjs} +1 -1
- package/dist/{quit-FVFNYACP.js → quit-XDZYRSPU.js} +1 -1
- package/dist/{registry-YN4FQPOO.cjs → registry-IVT4G2RT.cjs} +1 -1
- package/dist/{registry-KWZGYJC2.js → registry-PTHWERKC.js} +1 -1
- package/dist/repeat-BSPS5TWD.cjs +13 -0
- package/dist/repeat-EVCWUL6Z.js +13 -0
- package/dist/{resume-PP2IQM5S.cjs → resume-2GOPDLL4.cjs} +1 -1
- package/dist/{resume-EXFQSQPH.js → resume-37IUVDA6.js} +1 -1
- package/dist/search-7KUSHIBL.cjs +17 -0
- package/dist/{search-XGZDYBF4.js → search-OJGDRIMA.js} +5 -5
- package/dist/{session-BSU2L5UI.cjs → session-LXKC4X5Q.cjs} +1 -1
- package/dist/{session-SZMRN5KG.js → session-NMMO4QOL.js} +1 -1
- package/dist/{sessions-54KI3F2Q.js → sessions-6GWEBMKS.js} +1 -1
- package/dist/{sessions-DDTSPNVW.cjs → sessions-CYYCHSQG.cjs} +1 -1
- package/dist/settings-2D7CAO66.cjs +30 -0
- package/dist/{settings-FHRDFPLK.js → settings-BXR6SBJP.js} +5 -5
- package/dist/{share-TGROUE6R.js → share-BXQY5IQU.js} +3 -3
- package/dist/share-OSFXZBGS.cjs +14 -0
- package/dist/skills-FL6O6AOM.cjs +26 -0
- package/dist/{skills-FYY6F2WV.cjs → skills-PG542VEB.cjs} +1 -1
- package/dist/{skills-S3GRN323.js → skills-PNKQZRNK.js} +2 -2
- package/dist/{skills-6OL4OSGA.js → skills-ZZCIAS7C.js} +1 -1
- package/dist/{skills-install-O3LZ2ETC.cjs → skills-install-67DOBPJC.cjs} +1 -1
- package/dist/{skills-install-6CSWC24P.js → skills-install-SRC3Z2MS.js} +1 -1
- package/dist/{skills-new-PWLKK7GW.cjs → skills-new-XFMEHHIF.cjs} +1 -1
- package/dist/{skills-new-ALD2PTHN.js → skills-new-ZNZPHUKS.js} +1 -1
- package/dist/{slashCommands-L4ZD33LJ.js → slashCommands-LLCNPK3X.js} +27 -26
- package/dist/{slashCommands-YY2VUUDF.cjs → slashCommands-RXZZS6RE.cjs} +28 -27
- package/dist/status-BCECUJXT.cjs +11 -0
- package/dist/{status-KCLVOYPD.js → status-EFO7MQU3.js} +3 -3
- package/dist/{sync-6SDWG5RK.js → sync-IJYJ6KKM.js} +5 -5
- package/dist/sync-LFT6SBPF.cjs +18 -0
- package/dist/{sync-7JMZVEQD.cjs → sync-U7SDPBNZ.cjs} +1 -1
- package/dist/{sync-KWX67OUN.js → sync-VU2NSJ4O.js} +1 -1
- package/dist/{tasks-5FPBIFLC.js → tasks-R5MBGAQ6.js} +1 -1
- package/dist/{tasks-TXGKGNH6.cjs → tasks-V4WB3MFR.cjs} +1 -1
- package/dist/{team-5YXP3JGR.js → team-JESCHGWB.js} +1 -1
- package/dist/{team-IIWEZKNR.cjs → team-VQQKWGZB.cjs} +1 -1
- package/dist/{teammate-L6EZQ3I2.js → teammate-SD26GR37.js} +7 -7
- package/dist/{teammate-2KMKJXAM.cjs → teammate-SXRVXNQV.cjs} +7 -7
- package/dist/theme-AWBHSG7J.cjs +18 -0
- package/dist/{theme-YMFCQP7J.js → theme-TQLBPJ2E.js} +5 -5
- package/dist/ui/questionModal.cjs +1 -1
- package/dist/ui/questionModal.js +1 -1
- package/dist/{undo-KZHUUZTD.cjs → undo-IBBGP7A2.cjs} +1 -1
- package/dist/{undo-NEIEHQVX.js → undo-OL2EDBRY.js} +1 -1
- package/dist/{update-TVAJMMBC.js → update-53WMKYVS.js} +1 -1
- package/dist/{update-Z6BIIQDC.cjs → update-NV6QRYY7.cjs} +1 -1
- package/package.json +1 -1
- package/dist/HookManager-Q2KYMCP4.cjs +0 -7
- package/dist/HookManager-TTP4Y6DC.js +0 -7
- package/dist/LearnAdvisor-A4Q5PPBI.js +0 -9
- package/dist/LearnAdvisor-GASQD7HT.cjs +0 -9
- package/dist/PermissionManager-KMN53FJP.cjs +0 -11
- package/dist/ProviderFactory-VFGCJJX6.cjs +0 -9
- package/dist/about-HHTF2YFL.js +0 -12
- package/dist/about-JGRVNNQC.cjs +0 -12
- package/dist/autoSkill-H4T6VVDA.cjs +0 -20
- package/dist/config-E7RINK4R.cjs +0 -18
- package/dist/help-AQHGTS7P.cjs +0 -12
- package/dist/import-ZS6DPGU5.cjs +0 -10
- package/dist/language-5UE4G2BT.cjs +0 -18
- package/dist/logout-XEG7FHOZ.cjs +0 -18
- package/dist/mcp-SG6JFLGC.cjs +0 -18
- package/dist/search-C56FBN67.cjs +0 -17
- package/dist/settings-BDO37TTO.cjs +0 -30
- package/dist/share-IERCTBGN.cjs +0 -14
- package/dist/skills-OM4IGBAA.cjs +0 -26
- package/dist/status-3PC5XWSS.cjs +0 -11
- package/dist/sync-WHURZL3U.cjs +0 -18
- package/dist/theme-BE5A4FPN.cjs +0 -18
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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; }// src/commands/repeat.ts
|
|
2
|
+
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
3
|
+
var metadata = {
|
|
4
|
+
command: "/repeat",
|
|
5
|
+
description: "Schedule a recurring prompt at a fixed interval",
|
|
6
|
+
implemented: true,
|
|
7
|
+
subcommands: [
|
|
8
|
+
{ name: "list", description: "Show all active recurring jobs" },
|
|
9
|
+
{ name: "cancel", description: "Cancel a recurring job by ID" },
|
|
10
|
+
{ name: "help", description: "Show usage and examples" }
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
var DEFAULT_INTERVAL = "5m";
|
|
14
|
+
var LEADING_INTERVAL_RE = /^\d+[smhd]$/;
|
|
15
|
+
var LEADING_EVERY_RE = /^every\s+(\d+)?\s*(s(?:ec(?:ond)?s?)?|m(?:in(?:ute)?s?)?|h(?:(?:ou)?rs?)?|d(?:ays?)?)\s+/i;
|
|
16
|
+
var TRAILING_EVERY_RE = /\s+every\s+(\d+)?\s*(s(?:ec(?:ond)?s?)?|m(?:in(?:ute)?s?)?|h(?:(?:ou)?rs?)?|d(?:ays?)?)$/i;
|
|
17
|
+
var MIDDLE_EVERY_RE = /\s+every\s+(\d+)?\s*(s(?:ec(?:ond)?s?)?|m(?:in(?:ute)?s?)?|h(?:(?:ou)?rs?)?|d(?:ays?)?)\s+/i;
|
|
18
|
+
var UNIT_MAP = {
|
|
19
|
+
s: "s",
|
|
20
|
+
sec: "s",
|
|
21
|
+
secs: "s",
|
|
22
|
+
second: "s",
|
|
23
|
+
seconds: "s",
|
|
24
|
+
m: "m",
|
|
25
|
+
min: "m",
|
|
26
|
+
mins: "m",
|
|
27
|
+
minute: "m",
|
|
28
|
+
minutes: "m",
|
|
29
|
+
h: "h",
|
|
30
|
+
hr: "h",
|
|
31
|
+
hrs: "h",
|
|
32
|
+
hour: "h",
|
|
33
|
+
hours: "h",
|
|
34
|
+
d: "d",
|
|
35
|
+
day: "d",
|
|
36
|
+
days: "d"
|
|
37
|
+
};
|
|
38
|
+
function parseInput(raw) {
|
|
39
|
+
const trimmed = raw.trim();
|
|
40
|
+
const parts = trimmed.split(/\s+/);
|
|
41
|
+
if (parts.length >= 1 && LEADING_INTERVAL_RE.test(parts[0])) {
|
|
42
|
+
return {
|
|
43
|
+
interval: parts[0],
|
|
44
|
+
prompt: parts.slice(1).join(" "),
|
|
45
|
+
explicit: true
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const leadingMatch = trimmed.match(LEADING_EVERY_RE);
|
|
49
|
+
if (leadingMatch) {
|
|
50
|
+
const n = leadingMatch[1] || "1";
|
|
51
|
+
const rawUnit = leadingMatch[2].toLowerCase();
|
|
52
|
+
const unit = UNIT_MAP[rawUnit];
|
|
53
|
+
if (unit) {
|
|
54
|
+
return {
|
|
55
|
+
interval: `${n}${unit}`,
|
|
56
|
+
prompt: trimmed.slice(leadingMatch[0].length).trim(),
|
|
57
|
+
explicit: true
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const trailingMatch = trimmed.match(TRAILING_EVERY_RE);
|
|
62
|
+
if (trailingMatch) {
|
|
63
|
+
const n = trailingMatch[1] || "1";
|
|
64
|
+
const rawUnit = trailingMatch[2].toLowerCase();
|
|
65
|
+
const unit = UNIT_MAP[rawUnit];
|
|
66
|
+
if (unit) {
|
|
67
|
+
return {
|
|
68
|
+
interval: `${n}${unit}`,
|
|
69
|
+
prompt: trimmed.slice(0, trailingMatch.index).trim(),
|
|
70
|
+
explicit: true
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const middleMatch = trimmed.match(MIDDLE_EVERY_RE);
|
|
75
|
+
if (middleMatch) {
|
|
76
|
+
const n = middleMatch[1] || "1";
|
|
77
|
+
const rawUnit = middleMatch[2].toLowerCase();
|
|
78
|
+
const unit = UNIT_MAP[rawUnit];
|
|
79
|
+
if (unit) {
|
|
80
|
+
const before = trimmed.slice(0, middleMatch.index).trim();
|
|
81
|
+
const after = trimmed.slice(middleMatch.index + middleMatch[0].length).trim();
|
|
82
|
+
const prompt = [before, after].filter(Boolean).join(" ");
|
|
83
|
+
return {
|
|
84
|
+
interval: `${n}${unit}`,
|
|
85
|
+
prompt,
|
|
86
|
+
explicit: true
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
interval: DEFAULT_INTERVAL,
|
|
92
|
+
prompt: trimmed,
|
|
93
|
+
explicit: false
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function intervalToCron(interval) {
|
|
97
|
+
const match = interval.match(/^(\d+)([smhd])$/);
|
|
98
|
+
if (!match) {
|
|
99
|
+
throw new Error(`Invalid interval format: ${interval}`);
|
|
100
|
+
}
|
|
101
|
+
let n = parseInt(match[1], 10);
|
|
102
|
+
const unit = match[2];
|
|
103
|
+
if (unit === "s") {
|
|
104
|
+
const minutes = Math.max(1, Math.ceil(n / 60));
|
|
105
|
+
const roundedNote = `Rounded ${n}s up to ${minutes}m (cron minimum granularity is 1 minute).`;
|
|
106
|
+
return intervalToCronMinutes(minutes, roundedNote);
|
|
107
|
+
}
|
|
108
|
+
if (unit === "m") {
|
|
109
|
+
return intervalToCronMinutes(n);
|
|
110
|
+
}
|
|
111
|
+
if (unit === "h") {
|
|
112
|
+
if (n <= 0) throw new Error("Hour interval must be >= 1");
|
|
113
|
+
if (n > 23) {
|
|
114
|
+
const days = Math.round(n / 24);
|
|
115
|
+
const roundedNote2 = `Rounded ${n}h to ${days}d (${days * 24}h).`;
|
|
116
|
+
return {
|
|
117
|
+
cronExpression: `0 0 */${days} * *`,
|
|
118
|
+
intervalMs: days * 24 * 60 * 60 * 1e3,
|
|
119
|
+
humanReadable: `every ${days} day${days > 1 ? "s" : ""} at midnight`,
|
|
120
|
+
roundedNote: roundedNote2
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
let roundedNote;
|
|
124
|
+
if (24 % n !== 0) {
|
|
125
|
+
const clean = nearestDivisor(n, 24);
|
|
126
|
+
roundedNote = `${n}h doesn't divide 24 evenly; rounded to every ${clean}h.`;
|
|
127
|
+
n = clean;
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
cronExpression: `0 */${n} * * *`,
|
|
131
|
+
intervalMs: n * 60 * 60 * 1e3,
|
|
132
|
+
humanReadable: `every ${n} hour${n > 1 ? "s" : ""}`,
|
|
133
|
+
roundedNote
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (n <= 0) throw new Error("Day interval must be >= 1");
|
|
137
|
+
return {
|
|
138
|
+
cronExpression: `0 0 */${n} * *`,
|
|
139
|
+
intervalMs: n * 24 * 60 * 60 * 1e3,
|
|
140
|
+
humanReadable: `every ${n} day${n > 1 ? "s" : ""} at midnight`
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function intervalToCronMinutes(n, roundedNote) {
|
|
144
|
+
if (n <= 0) throw new Error("Minute interval must be >= 1");
|
|
145
|
+
if (n < 60) {
|
|
146
|
+
let note2 = roundedNote;
|
|
147
|
+
if (60 % n !== 0) {
|
|
148
|
+
const clean = nearestDivisor(n, 60);
|
|
149
|
+
note2 = (note2 ? note2 + " " : "") + `${n}m doesn't divide 60 evenly; rounded to every ${clean}m.`;
|
|
150
|
+
n = clean;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
cronExpression: `*/${n} * * * *`,
|
|
154
|
+
intervalMs: n * 60 * 1e3,
|
|
155
|
+
humanReadable: `every ${n} minute${n > 1 ? "s" : ""}`,
|
|
156
|
+
roundedNote: note2
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
let hours = Math.round(n / 60);
|
|
160
|
+
if (hours <= 0) hours = 1;
|
|
161
|
+
let note = roundedNote;
|
|
162
|
+
if (24 % hours !== 0) {
|
|
163
|
+
const clean = nearestDivisor(hours, 24);
|
|
164
|
+
note = (note ? note + " " : "") + `${n}m rounds to ${hours}h which doesn't divide 24; using every ${clean}h.`;
|
|
165
|
+
hours = clean;
|
|
166
|
+
} else if (n !== hours * 60) {
|
|
167
|
+
note = (note ? note + " " : "") + `Rounded ${n}m to ${hours}h.`;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
cronExpression: `0 */${hours} * * *`,
|
|
171
|
+
intervalMs: hours * 60 * 60 * 1e3,
|
|
172
|
+
humanReadable: `every ${hours} hour${hours > 1 ? "s" : ""}`,
|
|
173
|
+
roundedNote: note
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function nearestDivisor(n, max) {
|
|
177
|
+
let best = 1;
|
|
178
|
+
for (let d = 1; d <= max; d++) {
|
|
179
|
+
if (max % d === 0 && Math.abs(d - n) < Math.abs(best - n)) {
|
|
180
|
+
best = d;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return best;
|
|
184
|
+
}
|
|
185
|
+
function shorthandToMs(shorthand) {
|
|
186
|
+
const match = shorthand.match(/^(\d+)([smhd])$/);
|
|
187
|
+
if (!match) return 3 * 24 * 60 * 60 * 1e3;
|
|
188
|
+
const n = parseInt(match[1], 10);
|
|
189
|
+
const unit = match[2];
|
|
190
|
+
switch (unit) {
|
|
191
|
+
case "s":
|
|
192
|
+
return n * 1e3;
|
|
193
|
+
case "m":
|
|
194
|
+
return n * 60 * 1e3;
|
|
195
|
+
case "h":
|
|
196
|
+
return n * 60 * 60 * 1e3;
|
|
197
|
+
case "d":
|
|
198
|
+
return n * 24 * 60 * 60 * 1e3;
|
|
199
|
+
default:
|
|
200
|
+
return 3 * 24 * 60 * 60 * 1e3;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function shorthandToHuman(shorthand) {
|
|
204
|
+
const match = shorthand.match(/^(\d+)([smhd])$/);
|
|
205
|
+
if (!match) return shorthand;
|
|
206
|
+
const n = parseInt(match[1], 10);
|
|
207
|
+
const unit = match[2];
|
|
208
|
+
const names = { s: "second", m: "minute", h: "hour", d: "day" };
|
|
209
|
+
const name = _nullishCoalesce(names[unit], () => ( unit));
|
|
210
|
+
return `${n} ${name}${n !== 1 ? "s" : ""}`;
|
|
211
|
+
}
|
|
212
|
+
var REPEAT_SYSTEM_PROMPT = `# Goal
|
|
213
|
+
Extract a recurring schedule from natural language. Return the interval and the actionable task as JSON.
|
|
214
|
+
|
|
215
|
+
# Persona
|
|
216
|
+
You are a scheduling intent parser for a CLI coding agent. You receive raw user input and decompose it into exactly two parts: how often (interval) and what to do (prompt). You are precise, never hallucinate fields, and always return valid JSON.
|
|
217
|
+
|
|
218
|
+
# Action
|
|
219
|
+
Return ONLY a JSON object with these fields:
|
|
220
|
+
- "interval": (required) shorthand format <number><unit> where unit is s, m, h, or d (e.g. "5m", "2h", "1d")
|
|
221
|
+
- "prompt": (required) the actionable task, cleaned of all scheduling language and conversational filler
|
|
222
|
+
- "maxRuns": (optional, integer) if the user specifies a finite execution count, include it. Omit if unlimited.
|
|
223
|
+
- "expiresIn": (optional, shorthand like interval) if the user specifies a custom duration/deadline, include it. Omit to use the default 3-day expiry.
|
|
224
|
+
|
|
225
|
+
## Interval extraction rules (in priority order)
|
|
226
|
+
|
|
227
|
+
1. Explicit frequency \u2192 convert directly:
|
|
228
|
+
"every 5 minutes" \u2192 "5m" | "every 2 hours" \u2192 "2h" | "every 30 seconds" \u2192 "30s" | "every 3 days" \u2192 "3d"
|
|
229
|
+
|
|
230
|
+
2. Named frequencies \u2192 map to interval:
|
|
231
|
+
"every minute" \u2192 "1m" | "every hour" \u2192 "1h" | "every day" \u2192 "1d" | "every second" \u2192 "1s"
|
|
232
|
+
"hourly" \u2192 "1h" | "daily" \u2192 "1d" | "every half hour" \u2192 "30m" | "every quarter hour" \u2192 "15m"
|
|
233
|
+
|
|
234
|
+
3. Multiplicative expressions \u2192 compute interval:
|
|
235
|
+
"twice an hour" \u2192 "30m" | "three times an hour" \u2192 "20m" | "once an hour" \u2192 "1h"
|
|
236
|
+
"twice a day" \u2192 "12h" | "three times a day" \u2192 "8h" | "once a day" \u2192 "1d"
|
|
237
|
+
|
|
238
|
+
4. Colloquial / vague frequencies \u2192 best-effort:
|
|
239
|
+
"every couple of minutes" \u2192 "2m" | "every few minutes" \u2192 "5m" | "every other hour" \u2192 "2h"
|
|
240
|
+
"continuously" / "nonstop" / "constantly" \u2192 "1m" | "periodically" / "frequently" / "regularly" \u2192 "5m"
|
|
241
|
+
|
|
242
|
+
5. Implied repetition words are scheduling intent \u2014 strip them from the prompt:
|
|
243
|
+
"keep running tests" \u2192 interval "1m", prompt "run tests"
|
|
244
|
+
"keep checking the build" \u2192 interval "1m", prompt "check the build"
|
|
245
|
+
"repeatedly lint the codebase" \u2192 interval "5m", prompt "lint the codebase"
|
|
246
|
+
|
|
247
|
+
6. Unsupported time scales \u2192 clamp to "1d":
|
|
248
|
+
"weekly" / "monthly" / "every week" / "every month" \u2192 "1d"
|
|
249
|
+
|
|
250
|
+
7. No frequency detected at all \u2192 use "5m" as default.
|
|
251
|
+
|
|
252
|
+
## Disambiguation: conflicting interval signals
|
|
253
|
+
|
|
254
|
+
When the input contains multiple time references that could be intervals, apply these rules:
|
|
255
|
+
1. The most specific/granular interval wins as the "interval" field.
|
|
256
|
+
2. The broader time reference becomes "expiresIn" context (if it specifies a duration).
|
|
257
|
+
|
|
258
|
+
Granularity order (most specific first): seconds \u2192 minutes \u2192 hours \u2192 days.
|
|
259
|
+
|
|
260
|
+
Examples:
|
|
261
|
+
- "every day run this command with intervals of 10 minutes per run" \u2192 interval: "10m", expiresIn: "1d"
|
|
262
|
+
("intervals of 10 minutes" is more specific than "every day")
|
|
263
|
+
- "check deploy every day for a week at 10 minute intervals" \u2192 interval: "10m", expiresIn: "7d"
|
|
264
|
+
- "run tests daily with 5 minute checks" \u2192 interval: "5m", expiresIn: "1d"
|
|
265
|
+
- "every hour check build every 2 minutes" \u2192 interval: "2m", expiresIn: "1h"
|
|
266
|
+
|
|
267
|
+
## Execution count extraction (maxRuns)
|
|
268
|
+
|
|
269
|
+
When the user specifies a finite number of executions, extract it as "maxRuns":
|
|
270
|
+
- "only 10 times" \u2192 maxRuns: 10
|
|
271
|
+
- "do this 5 times" \u2192 maxRuns: 5
|
|
272
|
+
- "repeat 3 times" \u2192 maxRuns: 3
|
|
273
|
+
- "just once" / "one time" \u2192 maxRuns: 1
|
|
274
|
+
- "twice" / "two times" \u2192 maxRuns: 2
|
|
275
|
+
- No count mentioned \u2192 omit maxRuns entirely
|
|
276
|
+
|
|
277
|
+
Strip the count language from the prompt (e.g. "only 10 times", "5 times", "twice").
|
|
278
|
+
|
|
279
|
+
## Custom expiry extraction (expiresIn)
|
|
280
|
+
|
|
281
|
+
When the user specifies a duration/deadline for how long the job should stay active, extract it as "expiresIn":
|
|
282
|
+
- "for the next week" / "for a week" \u2192 expiresIn: "7d"
|
|
283
|
+
- "for 2 days" \u2192 expiresIn: "2d"
|
|
284
|
+
- "for the next hour" \u2192 expiresIn: "1h"
|
|
285
|
+
- "until tomorrow" \u2192 expiresIn: "1d"
|
|
286
|
+
- "for 30 minutes" \u2192 expiresIn: "30m"
|
|
287
|
+
- No duration mentioned \u2192 omit expiresIn entirely (default: 3 days)
|
|
288
|
+
|
|
289
|
+
Strip the expiry language from the prompt.
|
|
290
|
+
|
|
291
|
+
## Prompt cleaning rules
|
|
292
|
+
|
|
293
|
+
1. Strip conversational filler: remove leading "can you", "could you", "please", "I want you to", "I need you to", "go ahead and", "make sure to", "try to".
|
|
294
|
+
2. Strip scheduling language: remove "every X minutes", "hourly", "daily", "continuously", "keep", "repeatedly", "nonstop", "on repeat", "periodically", etc.
|
|
295
|
+
3. Preserve slash commands and their arguments verbatim: "/deploy staging", "/babysit-prs", "/lint --fix".
|
|
296
|
+
4. Preserve technical content exactly: file paths, command flags, branch names, URLs.
|
|
297
|
+
5. Do NOT rephrase or summarize the task \u2014 keep the user's own words minus filler and scheduling.
|
|
298
|
+
|
|
299
|
+
## Disambiguation: "every" as quantifier vs frequency
|
|
300
|
+
|
|
301
|
+
"every" followed by a time expression (number + unit, or time noun) = frequency \u2192 extract it.
|
|
302
|
+
"every" followed by a non-time noun = quantifier (part of the task) \u2192 keep it in the prompt.
|
|
303
|
+
|
|
304
|
+
Frequency: "check deploy every 5 minutes", "run hourly", "every 2h run tests"
|
|
305
|
+
Quantifier: "check every PR", "review every file", "test every endpoint", "lint every module"
|
|
306
|
+
|
|
307
|
+
## Disambiguation: time words inside task names
|
|
308
|
+
|
|
309
|
+
If a time word (hourly, daily, etc.) is part of a compound noun or script name, it describes the TASK, not the frequency.
|
|
310
|
+
"run the hourly backup script" \u2192 interval "5m", prompt "run the hourly backup script"
|
|
311
|
+
"check the daily report" \u2192 interval "5m", prompt "check the daily report"
|
|
312
|
+
"execute the 5-minute health check" \u2192 interval "5m", prompt "execute the 5-minute health check"
|
|
313
|
+
|
|
314
|
+
# Examples
|
|
315
|
+
|
|
316
|
+
Input: "can you run tests every 5 minutes"
|
|
317
|
+
Output: {"interval":"5m","prompt":"run tests"}
|
|
318
|
+
|
|
319
|
+
Input: "please check the deploy hourly"
|
|
320
|
+
Output: {"interval":"1h","prompt":"check the deploy"}
|
|
321
|
+
|
|
322
|
+
Input: "navigate to my gh pr list and pick one item to work on every 2 minutes"
|
|
323
|
+
Output: {"interval":"2m","prompt":"navigate to my gh pr list and pick one item to work on"}
|
|
324
|
+
|
|
325
|
+
Input: "make a git commit with empty message to trigger ci cd hourly"
|
|
326
|
+
Output: {"interval":"1h","prompt":"make a git commit with empty message to trigger ci cd"}
|
|
327
|
+
|
|
328
|
+
Input: "check for new issues on github twice an hour"
|
|
329
|
+
Output: {"interval":"30m","prompt":"check for new issues on github"}
|
|
330
|
+
|
|
331
|
+
Input: "run the test suite"
|
|
332
|
+
Output: {"interval":"5m","prompt":"run the test suite"}
|
|
333
|
+
|
|
334
|
+
Input: "keep monitoring the logs"
|
|
335
|
+
Output: {"interval":"1m","prompt":"monitor the logs"}
|
|
336
|
+
|
|
337
|
+
Input: "check every PR for review comments"
|
|
338
|
+
Output: {"interval":"5m","prompt":"check every PR for review comments"}
|
|
339
|
+
|
|
340
|
+
Input: "I want you to continuously watch the build pipeline"
|
|
341
|
+
Output: {"interval":"1m","prompt":"watch the build pipeline"}
|
|
342
|
+
|
|
343
|
+
Input: "run the hourly backup script every 30m"
|
|
344
|
+
Output: {"interval":"30m","prompt":"run the hourly backup script"}
|
|
345
|
+
|
|
346
|
+
Input: "/deploy staging every 10m"
|
|
347
|
+
Output: {"interval":"10m","prompt":"/deploy staging"}
|
|
348
|
+
|
|
349
|
+
Input: "could you maybe check if the tests pass"
|
|
350
|
+
Output: {"interval":"5m","prompt":"check if the tests pass"}
|
|
351
|
+
|
|
352
|
+
Input: "check for git commits from origin every minute"
|
|
353
|
+
Output: {"interval":"1m","prompt":"check for git commits from origin"}
|
|
354
|
+
|
|
355
|
+
Input: "tell me a joke every 2 minutes only 10 times"
|
|
356
|
+
Output: {"interval":"2m","prompt":"tell me a joke","maxRuns":10}
|
|
357
|
+
|
|
358
|
+
Input: "check PRs every day for the next week"
|
|
359
|
+
Output: {"interval":"1d","prompt":"check PRs","expiresIn":"7d"}
|
|
360
|
+
|
|
361
|
+
Input: "run tests every 5m do this 3 times"
|
|
362
|
+
Output: {"interval":"5m","prompt":"run tests","maxRuns":3}
|
|
363
|
+
|
|
364
|
+
Input: "check build every hour only 5 times for 2 days"
|
|
365
|
+
Output: {"interval":"1h","prompt":"check build","maxRuns":5,"expiresIn":"2d"}
|
|
366
|
+
|
|
367
|
+
Input: "every day run echo hello world with intervals of 10 minutes per run"
|
|
368
|
+
Output: {"interval":"10m","prompt":"run echo hello world","expiresIn":"1d"}
|
|
369
|
+
|
|
370
|
+
Input: "every hour check build every 2 minutes"
|
|
371
|
+
Output: {"interval":"2m","prompt":"check build","expiresIn":"1h"}`;
|
|
372
|
+
async function llmParseInput(raw, llm) {
|
|
373
|
+
try {
|
|
374
|
+
const response = await llm.complete({
|
|
375
|
+
messages: [
|
|
376
|
+
{ role: "system", content: REPEAT_SYSTEM_PROMPT },
|
|
377
|
+
{ role: "user", content: raw }
|
|
378
|
+
],
|
|
379
|
+
maxTokens: 200,
|
|
380
|
+
temperature: 0
|
|
381
|
+
});
|
|
382
|
+
const text = response.content.trim();
|
|
383
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
384
|
+
if (!jsonMatch) return parseInput(raw);
|
|
385
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
386
|
+
const interval = typeof parsed.interval === "string" ? parsed.interval : DEFAULT_INTERVAL;
|
|
387
|
+
const prompt = typeof parsed.prompt === "string" ? parsed.prompt : "";
|
|
388
|
+
if (!/^\d+[smhd]$/.test(interval)) return parseInput(raw);
|
|
389
|
+
const maxRuns = typeof parsed.maxRuns === "number" && Number.isInteger(parsed.maxRuns) && parsed.maxRuns > 0 ? parsed.maxRuns : void 0;
|
|
390
|
+
const expiresIn = typeof parsed.expiresIn === "string" && /^\d+[smhd]$/.test(parsed.expiresIn) ? parsed.expiresIn : void 0;
|
|
391
|
+
return { interval, prompt, maxRuns, expiresIn };
|
|
392
|
+
} catch (e) {
|
|
393
|
+
return parseInput(raw);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async function repeat(ctx, args = []) {
|
|
397
|
+
if (!ctx.repeatManager) {
|
|
398
|
+
return _chalk2.default.yellow("Repeat manager not available.");
|
|
399
|
+
}
|
|
400
|
+
const raw = args.join(" ").trim();
|
|
401
|
+
if (_optionalChain([args, 'access', _ => _[0], 'optionalAccess', _2 => _2.toLowerCase, 'call', _3 => _3()]) === "help") {
|
|
402
|
+
return showUsage();
|
|
403
|
+
}
|
|
404
|
+
if (_optionalChain([args, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.toLowerCase, 'call', _6 => _6()]) === "cancel") {
|
|
405
|
+
const id = _optionalChain([args, 'access', _7 => _7[1], 'optionalAccess', _8 => _8.trim, 'call', _9 => _9()]);
|
|
406
|
+
if (!id) {
|
|
407
|
+
return _chalk2.default.yellow("Usage: /repeat cancel <job-id>");
|
|
408
|
+
}
|
|
409
|
+
const ok = ctx.repeatManager.cancel(id);
|
|
410
|
+
return ok ? _chalk2.default.green(`Cancelled recurring job ${_chalk2.default.bold(id)}.`) : _chalk2.default.yellow(`No active job with ID ${_chalk2.default.bold(id)}.`);
|
|
411
|
+
}
|
|
412
|
+
if (_optionalChain([args, 'access', _10 => _10[0], 'optionalAccess', _11 => _11.toLowerCase, 'call', _12 => _12()]) === "list") {
|
|
413
|
+
const jobs = ctx.repeatManager.list();
|
|
414
|
+
if (jobs.length === 0) {
|
|
415
|
+
return _chalk2.default.gray("No recurring jobs scheduled.");
|
|
416
|
+
}
|
|
417
|
+
const lines2 = [_chalk2.default.bold("Active recurring jobs:"), ""];
|
|
418
|
+
for (const job2 of jobs) {
|
|
419
|
+
const remaining = Math.max(0, job2.expiresAt - Date.now());
|
|
420
|
+
const hoursLeft = Math.round(remaining / (60 * 60 * 1e3));
|
|
421
|
+
lines2.push(
|
|
422
|
+
` ${_chalk2.default.cyan(job2.id)} ${_chalk2.default.white(job2.humanInterval)} ${_chalk2.default.gray(job2.cronExpression)}`,
|
|
423
|
+
` ${_chalk2.default.gray("prompt:")} ${job2.prompt}`
|
|
424
|
+
);
|
|
425
|
+
if (job2.maxRuns !== void 0) {
|
|
426
|
+
lines2.push(` ${_chalk2.default.gray(`runs: ${job2.runCount}/${job2.maxRuns}`)}`);
|
|
427
|
+
}
|
|
428
|
+
lines2.push(
|
|
429
|
+
` ${_chalk2.default.gray(`expires in ~${hoursLeft}h`)}`,
|
|
430
|
+
""
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
return lines2.join("\n");
|
|
434
|
+
}
|
|
435
|
+
if (!raw) {
|
|
436
|
+
return showUsage();
|
|
437
|
+
}
|
|
438
|
+
if (args.length === 1) {
|
|
439
|
+
const SUBCOMMANDS = ["list", "cancel", "help"];
|
|
440
|
+
const firstArg = args[0].toLowerCase();
|
|
441
|
+
if (!SUBCOMMANDS.includes(firstArg)) {
|
|
442
|
+
const closest = findClosestSubcommand(firstArg, SUBCOMMANDS);
|
|
443
|
+
if (closest) {
|
|
444
|
+
return _chalk2.default.yellow(`Unknown subcommand "${args[0]}". Did you mean ${_chalk2.default.bold(`/repeat ${closest}`)}?`) + "\n\n" + showUsage();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
let interval;
|
|
449
|
+
let prompt;
|
|
450
|
+
let maxRuns;
|
|
451
|
+
let expiresIn;
|
|
452
|
+
if (ctx.llm) {
|
|
453
|
+
console.log(_chalk2.default.gray("Parsing schedule..."));
|
|
454
|
+
const llmResult = await llmParseInput(raw, ctx.llm);
|
|
455
|
+
interval = llmResult.interval;
|
|
456
|
+
prompt = llmResult.prompt;
|
|
457
|
+
maxRuns = llmResult.maxRuns;
|
|
458
|
+
expiresIn = llmResult.expiresIn;
|
|
459
|
+
} else {
|
|
460
|
+
const regexResult = parseInput(raw);
|
|
461
|
+
interval = regexResult.interval;
|
|
462
|
+
prompt = regexResult.prompt;
|
|
463
|
+
}
|
|
464
|
+
if (!prompt) {
|
|
465
|
+
return showUsage();
|
|
466
|
+
}
|
|
467
|
+
let cron;
|
|
468
|
+
try {
|
|
469
|
+
cron = intervalToCron(interval);
|
|
470
|
+
} catch (err) {
|
|
471
|
+
return _chalk2.default.red(`Invalid interval "${interval}": ${err.message}`);
|
|
472
|
+
}
|
|
473
|
+
const expiresInMs = expiresIn ? shorthandToMs(expiresIn) : void 0;
|
|
474
|
+
const expiresInHuman = expiresIn ? shorthandToHuman(expiresIn) : void 0;
|
|
475
|
+
const job = ctx.repeatManager.schedule(prompt, cron.intervalMs, cron.cronExpression, cron.humanReadable, {
|
|
476
|
+
maxRuns,
|
|
477
|
+
expiresInMs
|
|
478
|
+
});
|
|
479
|
+
const lines = [
|
|
480
|
+
_chalk2.default.green("Recurring job scheduled!"),
|
|
481
|
+
"",
|
|
482
|
+
` ${_chalk2.default.gray("Job ID:")} ${_chalk2.default.cyan(job.id)}`,
|
|
483
|
+
` ${_chalk2.default.gray("Prompt:")} ${prompt}`,
|
|
484
|
+
` ${_chalk2.default.gray("Cadence:")} ${cron.humanReadable}`,
|
|
485
|
+
` ${_chalk2.default.gray("Cron:")} ${cron.cronExpression}`
|
|
486
|
+
];
|
|
487
|
+
if (maxRuns !== void 0) {
|
|
488
|
+
lines.push(` ${_chalk2.default.gray("Limit:")} ${maxRuns} runs`);
|
|
489
|
+
}
|
|
490
|
+
if (cron.roundedNote) {
|
|
491
|
+
lines.push(` ${_chalk2.default.yellow("Note:")} ${cron.roundedNote}`);
|
|
492
|
+
}
|
|
493
|
+
const expiryLabel = _nullishCoalesce(expiresInHuman, () => ( "3 days"));
|
|
494
|
+
lines.push(
|
|
495
|
+
"",
|
|
496
|
+
_chalk2.default.gray(`Recurring jobs auto-expire after ${expiryLabel}.`),
|
|
497
|
+
_chalk2.default.gray(`Cancel sooner with: /repeat cancel ${job.id}`),
|
|
498
|
+
""
|
|
499
|
+
);
|
|
500
|
+
return lines.join("\n");
|
|
501
|
+
}
|
|
502
|
+
function levenshtein(a, b) {
|
|
503
|
+
const m = a.length, n = b.length;
|
|
504
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
505
|
+
for (let i = 0; i <= m; i++) dp[i][0] = i;
|
|
506
|
+
for (let j = 0; j <= n; j++) dp[0][j] = j;
|
|
507
|
+
for (let i = 1; i <= m; i++) {
|
|
508
|
+
for (let j = 1; j <= n; j++) {
|
|
509
|
+
dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return dp[m][n];
|
|
513
|
+
}
|
|
514
|
+
function findClosestSubcommand(input, subcommands) {
|
|
515
|
+
let best = null;
|
|
516
|
+
let bestDist = 3;
|
|
517
|
+
for (const cmd of subcommands) {
|
|
518
|
+
const dist = levenshtein(input, cmd);
|
|
519
|
+
if (dist < bestDist) {
|
|
520
|
+
bestDist = dist;
|
|
521
|
+
best = cmd;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return best;
|
|
525
|
+
}
|
|
526
|
+
function showUsage() {
|
|
527
|
+
return `
|
|
528
|
+
${_chalk2.default.cyan("/repeat \u2014 Schedule a recurring prompt")}
|
|
529
|
+
|
|
530
|
+
${_chalk2.default.yellow("Usage:")}
|
|
531
|
+
/repeat [interval] <prompt> Schedule a recurring prompt
|
|
532
|
+
/repeat list Show active jobs
|
|
533
|
+
/repeat cancel <id> Cancel a job
|
|
534
|
+
|
|
535
|
+
${_chalk2.default.yellow("Interval formats:")}
|
|
536
|
+
5m every 5 minutes
|
|
537
|
+
2h every 2 hours
|
|
538
|
+
1d every day
|
|
539
|
+
30s every 30 seconds (rounded to 1m)
|
|
540
|
+
|
|
541
|
+
${_chalk2.default.yellow("Examples:")}
|
|
542
|
+
/repeat 5m run tests
|
|
543
|
+
/repeat check the deploy every 20m
|
|
544
|
+
/repeat run tests every 5 minutes
|
|
545
|
+
/repeat 2h check build status
|
|
546
|
+
/repeat list
|
|
547
|
+
/repeat cancel abc123
|
|
548
|
+
`;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
exports.metadata = metadata; exports.parseInput = parseInput; exports.intervalToCron = intervalToCron; exports.repeat = repeat;
|
|
557
|
+
/**
|
|
558
|
+
* @license
|
|
559
|
+
* Copyright 2025 Autohand AI LLC
|
|
560
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
561
|
+
*
|
|
562
|
+
* /repeat — schedule a recurring prompt at a fixed interval.
|
|
563
|
+
*
|
|
564
|
+
* Usage:
|
|
565
|
+
* /repeat [interval] <prompt>
|
|
566
|
+
* /repeat cancel <id>
|
|
567
|
+
* /repeat list
|
|
568
|
+
*/
|
|
@@ -7,7 +7,7 @@ var _chunkNNPAM4HCcjs = require('./chunk-NNPAM4HC.cjs');
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkCB4E2T5Ncjs = require('./chunk-CB4E2T5N.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
var _chunkSEKD5FH3cjs = require('./chunk-SEKD5FH3.cjs');
|
|
@@ -176,13 +176,13 @@ async function loadConfigForScope(scopeInput, workspaceRoot) {
|
|
|
176
176
|
throw new Error(`Invalid scope "${scopeInput}". Use: user or project.`);
|
|
177
177
|
}
|
|
178
178
|
if (scope === "user") {
|
|
179
|
-
return { config: await
|
|
179
|
+
return { config: await _chunkCB4E2T5Ncjs.loadConfig.call(void 0, ), scope };
|
|
180
180
|
}
|
|
181
181
|
if (!workspaceRoot) {
|
|
182
182
|
throw new Error("Workspace root is required for project scope.");
|
|
183
183
|
}
|
|
184
184
|
const projectConfigPath = _path2.default.join(workspaceRoot, _chunkSEKD5FH3cjs.PROJECT_DIR_NAME, "config.json");
|
|
185
|
-
return { config: await
|
|
185
|
+
return { config: await _chunkCB4E2T5Ncjs.loadConfig.call(void 0, projectConfigPath), scope };
|
|
186
186
|
}
|
|
187
187
|
function syncRuntimeConfig(runtimeConfig, updatedConfig) {
|
|
188
188
|
if (!runtimeConfig) return;
|
|
@@ -439,7 +439,7 @@ async function handleAdd(manager, config, args, workspaceRoot) {
|
|
|
439
439
|
if (wasAutoConnectDisabled) reenabledParts.push("auto-connect");
|
|
440
440
|
const reenabled = reenabledParts.join(" and ");
|
|
441
441
|
try {
|
|
442
|
-
await
|
|
442
|
+
await _chunkCB4E2T5Ncjs.saveConfig.call(void 0, targetConfig);
|
|
443
443
|
syncRuntimeConfig(config, targetConfig);
|
|
444
444
|
try {
|
|
445
445
|
await manager.connect(existing);
|
|
@@ -464,7 +464,7 @@ async function handleAdd(manager, config, args, workspaceRoot) {
|
|
|
464
464
|
}
|
|
465
465
|
existing.autoConnect = true;
|
|
466
466
|
try {
|
|
467
|
-
await
|
|
467
|
+
await _chunkCB4E2T5Ncjs.saveConfig.call(void 0, targetConfig);
|
|
468
468
|
syncRuntimeConfig(config, targetConfig);
|
|
469
469
|
try {
|
|
470
470
|
await manager.disconnect(name);
|
|
@@ -483,7 +483,7 @@ async function handleAdd(manager, config, args, workspaceRoot) {
|
|
|
483
483
|
}
|
|
484
484
|
targetConfig.mcp.servers.push(newServer);
|
|
485
485
|
try {
|
|
486
|
-
await
|
|
486
|
+
await _chunkCB4E2T5Ncjs.saveConfig.call(void 0, targetConfig);
|
|
487
487
|
syncRuntimeConfig(config, targetConfig);
|
|
488
488
|
try {
|
|
489
489
|
await manager.connect(newServer);
|
|
@@ -540,7 +540,7 @@ async function handleRemove(manager, config, args, workspaceRoot) {
|
|
|
540
540
|
}
|
|
541
541
|
targetConfig.mcp.servers.splice(serverIndex, 1);
|
|
542
542
|
try {
|
|
543
|
-
await
|
|
543
|
+
await _chunkCB4E2T5Ncjs.saveConfig.call(void 0, targetConfig);
|
|
544
544
|
syncRuntimeConfig(config, targetConfig);
|
|
545
545
|
return `Removed "${serverName}" from ${scopeLabel ? `${scopeLabel} config` : "config"}`;
|
|
546
546
|
} catch (error) {
|