nolo-cli 0.149.0-alpha.1 → 0.151.0-alpha.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/{_executeModel-OW3H7ICR.js → _executeModel-T7ANHTUW.js} +134 -91
- package/accountResolver-7RYB4D2P.js +300 -0
- package/action-SXJD5N5R.js +23 -0
- package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
- package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
- package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-4L5KCKFY.js} +181 -93
- package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-2IMMIRO2.js} +132 -112
- package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
- package/agentListCommands-TWFLUYIZ.js +802 -0
- package/{agentMachineCommands-DQPUIMAC.js → agentMachineCommands-KIWXWT6L.js} +58 -62
- package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
- package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
- package/agentRecordCommands-727NPCRW.js +154 -0
- package/agentRunCommand-JASIG3FZ.js +183 -0
- package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
- package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
- package/{agentSlice-O4RUQUMT.js → agentSlice-SLV57QGU.js} +23 -16
- package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
- package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
- package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
- package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
- package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
- package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
- package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
- package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
- package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
- package/chromeOpsCommands-3Z34RKSE.js +472 -0
- package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
- package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
- package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
- package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
- package/chunk-3PVYUPXK.js +40 -0
- package/chunk-3SZA4U64.js +1192 -0
- package/{chunk-ID7LNBWR.js → chunk-3T4ZG6AC.js} +1920 -644
- package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
- package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
- package/chunk-4LCOCOR5.js +50 -0
- package/chunk-4YRTZIVN.js +871 -0
- package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
- package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
- package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
- package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
- package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
- package/chunk-5MMAK75Q.js +15 -0
- package/{chunk-TXH4IWJL.js → chunk-626KHJNX.js} +20 -11
- package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
- package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
- package/chunk-6MJNEXUU.js +614 -0
- package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
- package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
- package/chunk-6QDYSCPW.js +223 -0
- package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
- package/chunk-7DPNBQSV.js +9 -0
- package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
- package/{chunk-OMRJYNCI.js → chunk-AG7MCDLR.js} +26 -31
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
- package/chunk-AJ3G7X2K.js +7012 -0
- package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
- package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
- package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
- package/{chunk-YAQJJDC2.js → chunk-BJEZC5RA.js} +214 -51
- package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
- package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
- package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
- package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
- package/chunk-CHOZJMJS.js +78 -0
- package/chunk-CYJWI3NH.js +119 -0
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
- package/{chunk-TZZ2WRBL.js → chunk-DFDXM2Y4.js} +20 -16
- package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
- package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
- package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
- package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
- package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
- package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
- package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
- package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
- package/chunk-G6OOUQWJ.js +417 -0
- package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
- package/chunk-GKXCHNTE.js +15 -0
- package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
- package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
- package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
- package/{chunk-UASIEDKM.js → chunk-I2XLRXVX.js} +36 -31
- package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
- package/chunk-I42VC5KR.js +15 -0
- package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
- package/chunk-IA7TRNNR.js +11 -0
- package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
- package/{chunk-BIDGLJQ3.js → chunk-IK2TSJQA.js} +45 -8
- package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
- package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
- package/chunk-IT3ZZRJE.js +12 -0
- package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
- package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
- package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
- package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
- package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
- package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
- package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
- package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
- package/{chunk-TB3MIBRC.js → chunk-PIDUNDFS.js} +572 -430
- package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
- package/chunk-PKZKOVA5.js +11507 -0
- package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
- package/chunk-PWTNI4N7.js +47 -0
- package/chunk-QFEW2ULV.js +42 -0
- package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
- package/chunk-QQ56R7KS.js +88 -0
- package/chunk-QYPE3TS3.js +43 -0
- package/{chunk-HTVYCXBP.js → chunk-RN2GPWN6.js} +354 -120
- package/{chunk-ATLTFRYJ.js → chunk-ROCUB2H2.js} +280 -98
- package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
- package/chunk-RVWMAFIT.js +134 -0
- package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
- package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
- package/chunk-SW4S4XYB.js +1794 -0
- package/{chunk-ZUEK6A6C.js → chunk-TTH4HOJD.js} +1973 -754
- package/chunk-TY3TIUJK.js +89 -0
- package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
- package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
- package/{chunk-MST6R3E4.js → chunk-U5GPBQDG.js} +34 -22
- package/chunk-U5ICMAFV.js +14110 -0
- package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
- package/chunk-UEILX4EV.js +15 -0
- package/chunk-UHTDNB5Y.js +140 -0
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
- package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
- package/chunk-UUPR3TD7.js +53 -0
- package/{chunk-3DAVPNFT.js → chunk-V4EE3D54.js} +122 -107
- package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
- package/chunk-VHGD6FHV.js +116 -0
- package/chunk-VIWDGTDA.js +8 -0
- package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
- package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
- package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
- package/{chunk-DXHL7G2L.js → chunk-VWW6O2TL.js} +274 -93
- package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
- package/chunk-WD4XYDYC.js +567 -0
- package/chunk-WJZOQR2J.js +151 -0
- package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
- package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
- package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
- package/chunk-XRUSXPCQ.js +514 -0
- package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
- package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
- package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
- package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
- package/chunk-YVPQATSC.js +709 -0
- package/chunk-ZEZC7IIM.js +126 -0
- package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
- package/chunk-ZIWPQEFU.js +165 -0
- package/chunk-ZRAU6T47.js +56 -0
- package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
- package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
- package/{commandRegistry-2KBOXZQC.js → commandRegistry-NBLZEMCW.js} +183 -107
- package/contentThunks-6AIWNSGO.js +84 -0
- package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
- package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-4BUS65DZ.js} +53 -44
- package/createDialogAction-QAIKSCG4.js +76 -0
- package/{createPageAction-CDLDKPRM.js → createPageAction-DXCZ334C.js} +65 -54
- package/cursorProvider-YGGNMVWX.js +6123 -0
- package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
- package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
- package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
- package/dialogCommands-YZLSJB6X.js +113 -0
- package/{dialogSlice-N3YB65G5.js → dialogSlice-PVUSMKFW.js} +53 -39
- package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
- package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
- package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
- package/{docStore-E3CEOV5Q.js → docStore-CSEBEMKP.js} +25 -16
- package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
- package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
- package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
- package/{handleSendMessageAction-DQAD5ERJ.js → handleSendMessageAction-G2TLYGC4.js} +422 -118
- package/index.js +11 -7
- package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
- package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
- package/localRuntimeAdapter-B4TAYYA7.js +244 -0
- package/localRuntimeAuthority-JDAD7CB6.js +16 -0
- package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
- package/{machineCommands-HAP75VSG.js → machineCommands-6OBFD3XF.js} +503 -161
- package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
- package/machineWsRunDispatch-OO7N3O3Y.js +169 -0
- package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
- package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
- package/package.json +1 -1
- package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
- package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
- package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
- package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
- package/{readlineWorkspace-7BC66QSX.js → readlineWorkspace-UIQN7JUR.js} +5017 -915
- package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
- package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-GS3SGG37.js} +154 -97
- package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
- package/secretCommands-ZXZRLR3R.js +700 -0
- package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
- package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
- package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
- package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
- package/{streamAgentChatTurn-3UXPYFNX.js → streamAgentChatTurn-4XYC33KE.js} +309 -165
- package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
- package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
- package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
- package/tools-P77EE7Q4.js +124 -0
- package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
- package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
- package/{updateDialogTitleAction-UPFV7TDT.js → updateDialogTitleAction-CIANVPZC.js} +102 -57
- package/workloadLifecycle-36DXRZKU.js +320 -0
- package/action-GI44T4DR.js +0 -31
- package/agentListCommands-IW3GQVUP.js +0 -427
- package/agentRecordCommands-VCA76W6B.js +0 -134
- package/agentRunCommand-YNLDKVR7.js +0 -161
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-TJRMXMYA.js +0 -186
- package/chromeOpsCommands-IXRLN57H.js +0 -289
- package/chunk-36KZDDO5.js +0 -2415
- package/chunk-ACQD6YI2.js +0 -25363
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-CYSYR67N.js +0 -93
- package/chunk-JBTJAPUF.js +0 -35
- package/chunk-K2CSUCHJ.js +0 -620
- package/chunk-LTRXGFMS.js +0 -83
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-OCZKATRC.js +0 -129
- package/chunk-OTGFTBLI.js +0 -13
- package/chunk-PUOC4YRO.js +0 -394
- package/chunk-PZZTFEKK.js +0 -34
- package/chunk-URMS4XY2.js +0 -10
- package/chunk-UV6VISQJ.js +0 -20
- package/chunk-VJVNU77E.js +0 -83
- package/chunk-XYJSY4KG.js +0 -13807
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/contentThunks-BDIQRZR6.js +0 -73
- package/createDialogAction-B7VGVEVU.js +0 -66
- package/dialogCommands-G7YBVAMC.js +0 -102
- package/levelLazyShim-GZBKODGI.js +0 -7
- package/machineWsRunDispatch-L32G7C4P.js +0 -149
- package/serverStoreFactory-YMXDF4NI.js +0 -20
- package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
- package/settingSlice-Q6EKL7EQ.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-MKYDMWA4.js +0 -111
- package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
- package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
- package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
- package/{offlineMarxistsAgentCommand-HGXZV4XJ.js → offlineMarxistsAgentCommand-2QTHJCHV.js} +4 -4
|
@@ -6,20 +6,20 @@ import {
|
|
|
6
6
|
buildBuiltinObjectSkillDbKey,
|
|
7
7
|
buildBuiltinObjectSkillPageContent,
|
|
8
8
|
buildCodeWorkDiscipline
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-JZX2XLKC.js";
|
|
10
10
|
import {
|
|
11
11
|
buildSkillDocMarkdown,
|
|
12
12
|
resolvePageSkillMetadata
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import {
|
|
15
|
-
canonicalizeToolNames
|
|
16
|
-
} from "./chunk-XUWRURDF.js";
|
|
13
|
+
} from "./chunk-XETG4RIX.js";
|
|
17
14
|
import {
|
|
18
15
|
nolotusId
|
|
19
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-GKXCHNTE.js";
|
|
17
|
+
import {
|
|
18
|
+
canonicalizeToolNames
|
|
19
|
+
} from "./chunk-5EBLANFT.js";
|
|
20
20
|
import {
|
|
21
21
|
asNonEmptyStringArray
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-I42VC5KR.js";
|
|
23
23
|
import {
|
|
24
24
|
asOptionalTrimmedString
|
|
25
25
|
} from "./chunk-G3SUCT4W.js";
|
|
@@ -301,6 +301,7 @@ var CODING_SKILL_SEEDS = [
|
|
|
301
301
|
"Verdict: APPROVE / WARNING / BLOCK",
|
|
302
302
|
"```",
|
|
303
303
|
"- APPROVE\uFF1A\u65E0 CRITICAL \u6216 HIGH\uFF0C\u542B\u96F6 finding \u5E72\u51C0 review\uFF1BWARNING\uFF1A\u4EC5 HIGH\uFF1BBLOCK\uFF1A\u6709 CRITICAL\u3002",
|
|
304
|
+
"- \u7ED3\u8BBA\u53EA\u7ED1\u5B9A\u88AB\u5BA1\u7684\u90A3\u4EFD diff\uFF1A\u88AB\u5BA1\u5185\u5BB9\u6B64\u540E\u6709\u4EFB\u4F55\u6539\u52A8\uFF08\u542B\u53EA\u91C7\u7EB3 nit\u3001\u542B\u53EA\u52A8\u6CE8\u91CA / \u6587\u6863\uFF09\u2192 \u672C\u6B21\u7ED3\u8BBA\u5931\u6548\uFF0C\u5FC5\u987B\u91CD\u5BA1\uFF1B\u4F5C\u8005\u81EA\u8BC4\u4E0D\u6784\u6210\u590D\u6838\u3002",
|
|
304
305
|
"\u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u4E25\u683C\u800C\u62D2\u7EDD\u6279\u51C6\u3002diff \u5E72\u51C0\u5C31 APPROVE\u3002"
|
|
305
306
|
].join("\n")
|
|
306
307
|
},
|
|
@@ -644,6 +645,12 @@ var SPECIALIST_SKILL_SEEDS = [
|
|
|
644
645
|
"\u53EA\u6709\u5F97\u5230\u660E\u786E\u786E\u8BA4\u540E\uFF0C\u624D\u8C03\u7528 createAgent \u521B\u5EFA\u771F\u5B9E Agent\u3002",
|
|
645
646
|
"\u7528\u6237\u53EA\u662F\u8BA8\u8BBA\u3001\u8865\u5145\u3001\u4FEE\u6539\u6216\u8BF4\u201C\u5148\u770B\u770B\u201D\u65F6\uFF0C\u4E0D\u8981\u8C03\u7528 createAgent\u3002",
|
|
646
647
|
"\u9ED8\u8BA4\u6A21\u578B\u4F7F\u7528 provider=nolo, model=deepseek-v4-flash\uFF1B\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4E14\u5E73\u53F0\u5DF2\u77E5\u652F\u6301\uFF0C\u4E0D\u8981\u9009\u62E9 Claude/Anthropic \u7B49\u5F53\u524D runtime \u4E0D\u652F\u6301\u7684 provider\u3002",
|
|
648
|
+
"\u81EA\u5E26\u8BA2\u9605\u4E0E API key \u8DEF\u7531\u89C4\u5219\uFF1A",
|
|
649
|
+
"- \u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u4F7F\u7528\u81EA\u5E26\u8BA2\u9605\uFF08\u5982 Step Plan\u3001Kimi Code\u3001OpenCode Go \u7B49\uFF09\u6216\u81EA\u5E26 API key / Custom Provider \u65F6\uFF0C\u4E25\u7981\u9759\u9ED8\u4F7F\u7528 createAgent \u521B\u5EFA\u5E73\u53F0\u9ED8\u8BA4\u8BA1\u8D39 Agent\u3002",
|
|
650
|
+
'- createAgent \u5DE5\u5177\u4EC5\u652F\u6301 apiSource="platform"\uFF08\u5E73\u53F0\u6258\u7BA1\u4E0E\u5E73\u53F0\u8BA1\u8D39\uFF09\uFF0C\u4E0D\u652F\u6301\u5B58\u50A8\u81EA\u5B9A\u4E49\u51ED\u636E\u6216\u914D\u7F6E\u79C1\u6709\u7AEF\u70B9\uFF1B\u81EA\u5E26\u8BA2\u9605\u4E0D\u66FF\u6362\u5E73\u53F0\u6309\u91CF\u8BA1\u8D39/\u5E73\u53F0\u6258\u7BA1\u6A21\u578B\u3002',
|
|
651
|
+
"- \u82E5\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u652F\u6301 loadSkill \u6216\u5177\u5907 shell \u6267\u884C\u80FD\u529B\uFF0C\u8F6C\u5165\u5DF2\u6CE8\u518C\u7684 agent-provider-setup \u5185\u7F6E skill \u8D70\u6570\u636E\u9A71\u52A8\u7684 CLI/TUI \u81EA\u5EFA Provider Agent \u6D41\u7A0B\uFF08\u901A\u8FC7 nolo agent providers \u8BFB\u53D6\u5B9E\u65F6\u9884\u8BBE\uFF09\uFF0C\u5207\u52FF\u786C\u7F16\u7801 provider \u5217\u8868\u3002",
|
|
652
|
+
"- \u82E5\u5F53\u524D\u8FD0\u884C\u73AF\u5883\u65E0 shell\uFF08\u65E0\u6CD5\u6267\u884C execShell\uFF09\uFF0C\u660E\u786E\u544A\u77E5\u65E0\u6CD5\u901A\u8FC7\u5F53\u524D\u5BF9\u8BDD\u5DE5\u5177\u4EE3\u529E\u914D\u7F6E\u81EA\u5E26\u5BC6\u94A5\uFF0C\u5207\u52FF\u865A\u6784\u65E0\u9700 shell \u7684\u76F4\u63A5\u521B\u5EFA\u80FD\u529B\uFF1B\u5F15\u5BFC\u7528\u6237\u8FDB\u5165 /create/agent \u9875\u9762\u8FDB\u884C\u81EA\u4E3B\u5B89\u5168\u914D\u7F6E\uFF0C\u5E76\u6E05\u6670\u8BF4\u660E\u6B64\u9650\u5236\u3002",
|
|
653
|
+
"- \u4EA4\u4E92\u4E2D\u4E0D\u7D22\u8981\u7528\u6237\u5C06\u5BC6\u94A5\u8D34\u5165\u5BF9\u8BDD\uFF0C\u4E0D\u56DE\u663E\u6216\u590D\u8FF0\u5BC6\u94A5\uFF0C\u9884\u89C8\u4E2D\u7EDD\u4E0D\u51FA\u73B0\u771F\u5B9E\u5BC6\u94A5\u3002",
|
|
647
654
|
"\u516C\u5F00\u72B6\u6001\u4FDD\u6301\u4FDD\u5B88\uFF1A\u4F60\u53EF\u4EE5\u5EFA\u8BAE\u516C\u5F00\uFF0C\u4F46\u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u516C\u5F00\u53D1\u5E03\u65F6\uFF0CcreateAgent \u7684 isPublic \u624D\u80FD\u4E3A true\u3002",
|
|
648
655
|
"\u5982\u679C\u7528\u6237\u60F3\u624B\u52A8\u5FAE\u8C03\u6A21\u578B\u3001\u5DE5\u5177\u3001\u77E5\u8BC6\u5F15\u7528\u6216\u53D1\u5E03\u72B6\u6001\uFF0C\u53EF\u4EE5\u5F15\u5BFC\u7528\u6237\u8FDB\u5165 /create/agent \u9AD8\u7EA7\u7F16\u8F91\u9875\u3002"
|
|
649
656
|
].join("\n"),
|
|
@@ -653,7 +660,8 @@ var SPECIALIST_SKILL_SEEDS = [
|
|
|
653
660
|
"createSkillDoc",
|
|
654
661
|
"readDoc",
|
|
655
662
|
"updateDoc",
|
|
656
|
-
"updateAgent"
|
|
663
|
+
"updateAgent",
|
|
664
|
+
"loadSkill"
|
|
657
665
|
]
|
|
658
666
|
},
|
|
659
667
|
{
|
|
@@ -1143,37 +1151,28 @@ function buildAutoReviewSkillConfig(slug) {
|
|
|
1143
1151
|
id: buildAutoReviewSkillId(slug),
|
|
1144
1152
|
name: "\u81EA\u52A8\u5BA1\u67E5\u5408\u5E76\uFF08auto-review\uFF09",
|
|
1145
1153
|
triggerMode: "explicit",
|
|
1146
|
-
description: "\
|
|
1154
|
+
description: "\u663E\u5F0F\u5F00\u542F\u540E\uFF0C\u5728\u7528\u6237\u6307\u5B9A\u7684\u4EFB\u52A1\u3001\u5F53\u524D\u5BF9\u8BDD\u6216\u9879\u76EE\u4F5C\u7528\u57DF\u6301\u7EED\u6267\u884C\u72EC\u7ACB review\u3001\u4FEE\u590D\u3001\u63D0\u4EA4\u4E0E\u672C\u5730\u96C6\u6210\u5206\u652F\u5408\u5E76\uFF1B\u4E0D\u9ED8\u8BA4\u63A8\u8350\u3002push \u662F\u72EC\u7ACB\u6743\u9650\u3002\u89E6\u53D1\u8BCD\uFF1Aauto-review\u3001\u81EA\u52A8\u5BA1\u67E5\u3001review \u540E\u81EA\u52A8\u5408\u5E76\u3001\u5BA1\u5B8C\u76F4\u63A5\u63D0\u4EA4\u5408\u5E76\u3001auto review\u3002\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u9002\u7528\u3002"
|
|
1147
1155
|
};
|
|
1148
1156
|
}
|
|
1149
1157
|
var BODY = [
|
|
1150
|
-
"\u4F60\u662F\u300C\u81EA\u52A8\u5BA1\u67E5\u5408\u5E76\u300D\u6D41\u7A0B\u7684\u6267\u884C\u8005\uFF1A\
|
|
1158
|
+
"\u4F60\u662F\u300C\u81EA\u52A8\u5BA1\u67E5\u5408\u5E76\u300D\u6D41\u7A0B\u7684\u6267\u884C\u8005\uFF1A\u7528\u6237\u663E\u5F0F\u5F00\u542F\u540E\uFF0C\u5728\u7528\u6237\u6307\u5B9A\u7684\u4F5C\u7528\u57DF\u6301\u7EED\u9002\u7528\uFF1B\u4E0D\u8981\u6C42\u6BCF\u4EFB\u52A1\u91CD\u590D\u5F00\u542F\u3002\u6388\u6743\u8986\u76D6\u7684\u672C\u5730 review\u3001\u4FEE\u590D\u3001\u63D0\u4EA4\u4E0E\u672C\u5730\u96C6\u6210\u5206\u652F\u5408\u5E76\u65E0\u9700\u9010\u6B65\u786E\u8BA4\u3002",
|
|
1151
1159
|
"",
|
|
1152
|
-
"## \
|
|
1153
|
-
"- \
|
|
1154
|
-
"- \
|
|
1155
|
-
"- \
|
|
1160
|
+
"## \u542F\u7528\u4E0E\u6743\u9650\u8FB9\u754C",
|
|
1161
|
+
"- \u7528\u6237\u53EF\u6307\u5B9A\u4EFB\u52A1\u3001\u5F53\u524D\u5BF9\u8BDD\u6216\u9879\u76EE\u4F5C\u7528\u57DF\u3002\u5355\u6B21\u8986\u76D6\u3001\u6682\u505C\u6216\u5173\u95ED\u4F18\u5148\uFF1B\u6536\u5230 stop/\u505C\u6B62\u7ACB\u5373\u505C\u6B62\uFF0C\u4E0D\u91CD\u65B0\u89C4\u5212\u65E2\u5B9A\u65B9\u5411\u3002",
|
|
1162
|
+
"- \u4F5C\u7528\u57DF\u6301\u7EED\u4E0D\u4EE3\u8868\u5E73\u53F0\u5DF2\u7ECF\u6301\u4E45\u4FDD\u5B58\u914D\u7F6E\u3002\u672A\u9A8C\u8BC1\u6301\u4E45\u914D\u7F6E\u80FD\u529B\u524D\uFF0C\u4E0D\u5F97\u58F0\u79F0\u8DE8\u5BF9\u8BDD\u81EA\u52A8\u4FDD\u5B58\u6216\u751F\u6548\uFF1B\u9879\u76EE\u542F\u7528\u6301\u4E45\u80FD\u529B\u4EE5\u73B0\u6709\u9879\u76EE\u914D\u7F6E\u5DF2\u52A0\u8F7D\u4E3A\u524D\u63D0\uFF0C\u4E0D\u65B0\u9020\u914D\u7F6E\u7CFB\u7EDF\u3002\u4FDD\u6301\u663E\u5F0F opt-in\uFF0C\u4E0D\u9ED8\u8BA4\u63A8\u8350\u6216\u81EA\u52A8\u542F\u7528\u4E8E\u6240\u6709\u9879\u76EE\u3002",
|
|
1163
|
+
"- push \u662F\u72EC\u7ACB\u6743\u9650\uFF0C\u9ED8\u8BA4\u672A\u6388\u6743\uFF1B\u7B26\u5408\u4E0A\u5C42\u89C4\u5219\u7684\u5F53\u6B21\u660E\u786E\u6388\u6743\u540E\uFF0C\u53EF\u5728\u672C\u5730\u5408\u5E76\u540E\u7EE7\u7EED\u9A8C\u6536\u3001\u8BC1\u636E\u9884\u68C0\u4E0E push\u3002\u4E0D\u5F97\u58F0\u79F0 skill \u6216\u4ED3\u5E93\u89C4\u5219\u6388\u4E88\u6301\u7EED push \u6743\u3002main/production \u5408\u5E76\u3001\u53D1\u5E03\u3001\u56DE\u6EDA\u53E6\u9700\u5F53\u6B21\u6279\u51C6\u3002",
|
|
1164
|
+
"- \u9700\u7528\u6237\u4EB2\u81EA\u9A8C\u6536\u7684\u6539\u52A8\uFF08\u5982 UI/\u4F53\u9A8C\uFF09\uFF1A\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\uFF1B\u7528\u6237\u660E\u786E\u51C6\u5907\u63D0\u4EA4\u540E\u518D\u8FDB\u5165\u6700\u7EC8 review\u3002",
|
|
1156
1165
|
"",
|
|
1157
1166
|
"## \u6D41\u7A0B",
|
|
1158
|
-
"1. **\u9694\u79BB**\uFF1A\u6539\u52A8\u5E94\
|
|
1159
|
-
"2. **\u6D3E reviewer**\uFF1A\u4E0E\u4F5C\u8005\u4E0D\u540C\u7684 agent \u5B9E\u4F8B\uFF0C\u53EA\u8BFB\u5BA1 diff\
|
|
1160
|
-
"3. **\u5224\u5B9A**\uFF1A",
|
|
1161
|
-
"
|
|
1162
|
-
"
|
|
1163
|
-
"
|
|
1164
|
-
" - \u7A7A\u56DE\u590D\u3001\u8D85\u65F6\u3001\u53EA\u8BF4\u300C\u6211\u5148\u68C0\u67E5\u300D\u90FD\u4E0D\u662F\u5BA1\u67E5\u8BC1\u636E\uFF1A\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF0C\u4ECD\u65E0\u7ED3\u8BBA\u5C31\u62A5\u544A `review incomplete`\uFF0C\u4EA4\u7528\u6237\u5904\u7406\u3002",
|
|
1165
|
-
"4. **\u63D0\u4EA4**\uFF1A\u6309\u9879\u76EE\u7684\u63D0\u4EA4\u89C4\u8303\u5199 message\uFF1B\u5982\u5B9E\u8BB0\u5F55\u8C01\u5BA1\u7684\u3001\u7ED3\u8BBA\u662F\u4EC0\u4E48\u3002\u65E0 review \u4E0D\u63D0\u4EA4\uFF08\u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u9664\u5916\uFF0C\u987B\u5728 message \u6CE8\u660E\u539F\u56E0\uFF09\u3002",
|
|
1166
|
-
"5. **\u5408\u5E76**\uFF1A\u5728\u4E3B\u4ED3\u7528 `git merge --no-ff <\u5206\u652F>` \u5408\u5E76\u5230\u672C\u5730\u96C6\u6210\u5206\u652F\uFF0C\u4FDD\u7559\u5206\u652F\u5386\u53F2\u3002",
|
|
1167
|
-
"6. **\u6E05\u7406**\uFF1A\u5408\u5E76\u6210\u529F\u540E\uFF0C\u4E3B\u52A8\u5217\u51FA\u672C\u6B21\u4EA7\u751F\u7684\u5F85\u6E05\u7406\u8D44\u6E90\u6E05\u5355\uFF08\u786E\u5207\u7684 worktree \u76F8\u5BF9\u8DEF\u5F84\u4E0E\u5206\u652F\u540D\u79F0\uFF09\uFF1B\u83B7\u5F97\u7528\u6237\u660E\u786E\u786E\u8BA4\u540E\uFF0C\u6267\u884C `git worktree remove <worktreePath>` \u4E0E `git branch -d <branchName>` \u5B8C\u6210\u6E05\u7406\u95ED\u73AF\uFF1B\u4E25\u7981\u9759\u9ED8\u5220\u9664\u6216\u5148\u5220\u540E\u62A5\u3002",
|
|
1168
|
-
"7. **\u6536\u5C3E**\uFF1A\u6C47\u62A5 commit\u3001\u5408\u5E76\u4E0E\u6E05\u7406\u7ED3\u679C\u3001reviewer \u4E0E Verdict\u3001\u672A\u5904\u7406\u7684 WARNING\u3002\u5230\u6B64\u4E3A\u6B62\uFF0C\u4E0D push\u3002",
|
|
1169
|
-
"",
|
|
1170
|
-
"## \u9009 reviewer",
|
|
1171
|
-
"- \u6309\u5E73\u53F0\u9009\u4EBA\u5951\u7EA6\uFF1A\u6536\u85CF\u7684\u79C1\u6709\u8BA2\u9605/\u81EA\u5E26 key agent \u4F18\u5148\uFF0C\u5176\u6B21\u5176\u4ED6\u6536\u85CF\uFF0C\u518D\u5176\u6B21\u672A\u6536\u85CF\u7684\u79C1\u6709 agent\uFF1B\u4F4E\u4EF7\u80DC\u4EFB\u8005\u5373\u53EF\u3002\u53EA\u6709\u67B6\u6784/\u8BA1\u8D39/\u5B89\u5168/\u6570\u636E\u5B8C\u6574\u6027\u9AD8\u98CE\u9669\u6539\u52A8\u624D\u7528\u9876\u6863\u3002",
|
|
1172
|
-
"- \u4F1A\u6D88\u8017\u5E73\u53F0\u79EF\u5206\u7684 agent \u5FC5\u987B\u5148\u5F81\u5F97\u7528\u6237\u5F53\u6B21\u540C\u610F\u3002",
|
|
1167
|
+
"1. **\u9694\u79BB**\uFF1A\u6539\u52A8\u5E94\u5728\u72EC\u7ACB worktree/\u5206\u652F\u4E2D\u8FDB\u884C\uFF1B\u4E0D\u5728\u5C31\u6309\u9879\u76EE\u65E2\u6709\u6D41\u7A0B\u5EFA\u7ACB\u3002",
|
|
1168
|
+
"2. **\u6D3E reviewer**\uFF1A\u4F7F\u7528\u4E0E\u4F5C\u8005\u4E0D\u540C\u7684 agent \u5B9E\u4F8B\uFF0C\u53EA\u8BFB\u5BA1 diff\uFF1Bbrief \u4EC5\u4F20 worktree \u8DEF\u5F84\u4E0E\u6587\u4EF6\u6E05\u5355\uFF0C\u4E0D\u5185\u5D4C diff\u3002\u8981\u6C42\u6700\u7EC8\u6587\u672C\u542B Verdict\uFF08APPROVE / WARNING / BLOCK\uFF09\u53CA\u5E26\u884C\u53F7 finding\u3002\u9075\u5FAA\u5E73\u53F0\u9009\u4EBA\u53CA\u8D39\u7528\u6388\u6743\u89C4\u5219\u3002",
|
|
1169
|
+
"3. **\u5224\u5B9A**\uFF1A\u6700\u7EC8\u6587\u672C\u660E\u786E APPROVE \u4E14\u65E0 CRITICAL/HIGH \u624D\u7EE7\u7EED\u3002BLOCK \u4FEE\u590D\u540E\u590D\u5BA1\uFF1BWARNING \u542B HIGH \u65F6\u505C\u4E0B\u62A5\u544A\u7528\u6237\u51B3\u5B9A\u3002APPROVE \u4EC5\u8986\u76D6\u8BE5\u7248\u672C\uFF0C\u4E4B\u540E\u4EFB\u4F55\u6539\u52A8\uFF08\u5305\u62EC\u6587\u6863/\u6CE8\u91CA\uFF09\u90FD\u987B\u590D\u5BA1\u3002\u7A7A\u56DE\u590D\u3001\u8D85\u65F6\u6216\u6CA1\u6709\u7ED3\u8BBA\u4E0D\u662F\u5BA1\u67E5\u8BC1\u636E\uFF1B\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF0C\u4ECD\u65E0\u7ED3\u8BBA\u5219\u62A5\u544A review incomplete \u5E76\u4EA4\u7528\u6237\u5904\u7406\u3002",
|
|
1170
|
+
"4. **\u63D0\u4EA4**\uFF1A\u6309\u9879\u76EE\u63D0\u4EA4\u89C4\u8303\u5199 message\uFF0C\u5982\u5B9E\u8BB0\u5F55 reviewer \u4E0E\u7ED3\u8BBA\u3002\u6CA1\u6709\u5408\u683C review \u4E0D\u63D0\u4EA4\uFF08\u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u4F8B\u5916\uFF0C\u987B\u5728 message \u6CE8\u660E\u539F\u56E0\uFF09\uFF1B\u9075\u5B88\u6D4B\u8BD5\u4E0E\u9879\u76EE\u95E8\u7981\u3002",
|
|
1171
|
+
"5. **\u672C\u5730\u5408\u5E76**\uFF1A\u6309\u9879\u76EE\u8981\u6C42\u7528 `git merge --no-ff <branch>` \u5408\u5E76\u81F3\u672C\u5730\u96C6\u6210\u5206\u652F\u5E76\u4FDD\u7559\u5386\u53F2\u3002\u7528\u6237\u5DF2\u660E\u786E\u6388\u6743 auto-review \u7684\u666E\u901A\u4EFB\u52A1\uFF0C\u4E0D\u91CD\u590D\u7D22\u8981\u6BCF\u6B65\u786E\u8BA4\u3002",
|
|
1172
|
+
"6. **\u6536\u5C3E**\uFF1A\u62A5\u544A review \u7ED3\u8BBA\u3001\u63D0\u4EA4/\u5408\u5E76\u7ED3\u679C\u53CA\u672A\u5904\u7406 finding\uFF1B\u6E05\u7406\u4E25\u683C\u9075\u5FAA\u5220\u9664\u5B89\u5168\u89C4\u5219\u3002push \u4EC5\u5728\u53D6\u5F97\u5F53\u6B21\u6388\u6743\u540E\u8FDB\u884C\uFF0C\u5E76\u9075\u5FAA\u9879\u76EE\u63A8\u524D\u8BC1\u636E\u9884\u68C0\u3002",
|
|
1173
1173
|
"",
|
|
1174
1174
|
"## Boundaries",
|
|
1175
|
-
"- \u4E0D\u66FF\u4EE3 reviewer \
|
|
1176
|
-
"- \u4E0D\u4F2A\u9020 review \u8BC1\u636E\uFF1B\u4E0D\u7528 `--no-verify` \u7ED5\u8FC7\u63D0\u4EA4\u6216\u5408\u5E76\u94A9\u5B50\u3002"
|
|
1175
|
+
"- \u4E0D\u66FF\u4EE3 reviewer \u8D28\u91CF\u95E8\u6216\u6D4B\u8BD5\uFF1B\u4E0D\u4F2A\u9020 review \u8BC1\u636E\uFF0C\u4E0D\u7ED5\u8FC7\u63D0\u4EA4/\u5408\u5E76\u4FDD\u62A4\u3002\u9879\u76EE\u7279\u6709\u547D\u4EE4\u3001trailer \u4E0E\u95E8\u7981\u7531\u9879\u76EE\u5C42\u8865\u5145\u3002"
|
|
1177
1176
|
].join("\n");
|
|
1178
1177
|
function buildAutoReviewSkillContentBySlug(slug) {
|
|
1179
1178
|
return buildSkillDocMarkdown({
|
|
@@ -1262,8 +1261,8 @@ function buildWorktreeSkillContentBySlug(slug) {
|
|
|
1262
1261
|
});
|
|
1263
1262
|
}
|
|
1264
1263
|
|
|
1265
|
-
// packages/ai/skills/
|
|
1266
|
-
var
|
|
1264
|
+
// packages/ai/skills/secretsManagerSkill.ts
|
|
1265
|
+
var SECRETS_MANAGER_SKILL_SLUGS = ["secrets-manager"];
|
|
1267
1266
|
function deterministicId8(prefix, seed) {
|
|
1268
1267
|
let h = 2166136261;
|
|
1269
1268
|
for (let i = 0; i < seed.length; i++) {
|
|
@@ -1276,9 +1275,99 @@ function deterministicId8(prefix, seed) {
|
|
|
1276
1275
|
function normalizeSkillSeed7(input) {
|
|
1277
1276
|
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1278
1277
|
}
|
|
1279
|
-
function
|
|
1278
|
+
function buildSecretsManagerSkillId(slug) {
|
|
1280
1279
|
return deterministicId8("01SK", normalizeSkillSeed7(slug) || slug);
|
|
1281
1280
|
}
|
|
1281
|
+
function buildSecretsManagerSkillPageKey(userId, slug) {
|
|
1282
|
+
return `page-${userId}-${buildSecretsManagerSkillId(slug)}`;
|
|
1283
|
+
}
|
|
1284
|
+
var SECRETS_MANAGER_SKILL_DEFINITIONS = {
|
|
1285
|
+
"secrets-manager": {
|
|
1286
|
+
slug: "secrets-manager",
|
|
1287
|
+
title: "Secrets Manager",
|
|
1288
|
+
description: "\u89E6\u53D1\u8BCD\uFF1A\u672C\u5730\u5BC6\u94A5\u3001\u4FDD\u5B58\u5BC6\u94A5\u3001secrets\u3001AMO\u7B7E\u540D\u51ED\u636E\u3001\u51ED\u636E\u4FDD\u5B58\u3001nolo secret\u3001\u6CE8\u5165\u73AF\u5883\u53D8\u91CF\u6267\u884C\u3002Nolo \u5E73\u53F0\u7EA7\u5F00\u53D1\u8005\u672C\u5730\u79D8\u5BC6\u7BA1\u7406\uFF08~/.nolo/credentials/secrets.json\uFF0C\u6743\u9650 0600\uFF09\u3002",
|
|
1289
|
+
body: `# Nolo Secrets Manager \u2014 \u672C\u5730\u5E73\u53F0\u7EA7\u5F00\u53D1\u8005\u51ED\u636E\u7BA1\u7406
|
|
1290
|
+
|
|
1291
|
+
\u7528\u4E8E\u7EDF\u4E00\u5B89\u5168\u7BA1\u7406\u5BBF\u4E3B\u673A\u672C\u5730\u8FD0\u7EF4\u3001\u6253\u5305\u3001\u90E8\u7F72\u7B49\u5F00\u53D1\u8005\u5916\u90E8\u51ED\u636E\uFF08\u5982 Mozilla AMO \u7B7E\u540D\u5BC6\u94A5\u3001Docker Hub Token\u3001\u53D1\u5E03\u5BC6\u94A5\u7B49\uFF09\uFF0C\u5F7B\u5E95\u544A\u522B\u5BF9\u8BDD\u6846\u624B\u52A8\u590D\u5236\u7C98\u8D34\u5BC6\u94A5\u3002
|
|
1292
|
+
|
|
1293
|
+
## \u5B58\u50A8\u5951\u7EA6\u4E0E\u5B89\u5168\u7EA2\u7EBF
|
|
1294
|
+
|
|
1295
|
+
1. **\u7EDD\u5BF9\u5B58\u50A8\u8DEF\u5F84**\uFF1A\`$NOLO_HOME/credentials/secrets.json\`\uFF08\u672A\u8BBE \`NOLO_HOME\` \u65F6\u56DE\u843D \`~/.nolo/credentials/secrets.json\`\uFF09\uFF0C\u6743\u9650\u4E25\u683C\u9501\u5B9A\u4E3A \`0600\`\uFF0C\u7236\u76EE\u5F55 \`0700\`\u3002
|
|
1296
|
+
2. **\u7981\u6B62\u56DE\u663E\u539F\u5219**\uFF1A
|
|
1297
|
+
- Agent \u65E0\u8BBA\u5728\u4EFB\u4F55\u60C5\u51B5\u4E0B\uFF0C**\u7EDD\u4E0D\u5728\u5BF9\u8BDD\u6D88\u606F\u3001\u65E5\u5FD7\u6216\u62A5\u544A\u4E2D\u6253\u5370\u4EFB\u4F55\u5BC6\u94A5\u660E\u6587**\uFF1B
|
|
1298
|
+
- \u67E5\u770B\u5DF2\u4FDD\u5B58\u7684\u51ED\u636E\u4E00\u5F8B\u4F7F\u7528 \`nolo secret list\`\uFF08\u4EC5\u8F93\u51FA\u51ED\u636E\u540D\u79F0\uFF0C\u4E0D\u8F93\u51FA\u5185\u5BB9\uFF09\uFF1B
|
|
1299
|
+
- Agent **\u4E0D\u5F97**\u6267\u884C \`nolo secret get\`\uFF08\u8BE5\u5B50\u547D\u4EE4\u53EA\u4F9B\u4EBA\u7C7B\u8C03\u8BD5\uFF09\uFF0C\u53EA\u5141\u8BB8 \`nolo secret run --with\`\u3002
|
|
1300
|
+
3. **\u7528\u6237\u6388\u6743\u95E8\u7981**\uFF1A
|
|
1301
|
+
- \u53EA\u6709\u5F53\u7528\u6237\u5728\u5BF9\u8BDD\u4E2D\u660E\u786E\u63D0\u5230\u201C\u5141\u8BB8\u83B7\u53D6 / \u4F7F\u7528\u672C\u5730\u4FDD\u5B58\u7684 xxx \u51ED\u636E\u201D\u65F6\uFF0CAgent \u624D\u88AB\u6388\u6743\u8C03\u7528\u8BE5\u51ED\u636E\uFF1B\u672A\u83B7\u7528\u6237\u660E\u786E\u6307\u793A\u65F6\uFF0C\u4E0D\u5F97\u8BFB\u53D6\u6216\u6CE8\u5165\u3002
|
|
1302
|
+
|
|
1303
|
+
## \u5E38\u7528 CLI \u547D\u4EE4
|
|
1304
|
+
|
|
1305
|
+
\`\`\`bash
|
|
1306
|
+
# 1. \u67E5\u770B\u5DF2\u6709\u79D8\u5BC6\uFF08\u5B89\u5168\uFF0C\u4EC5\u8F93\u51FA\u540D\u79F0\u5217\u8868\uFF0C\u7EDD\u4E0D\u6253\u5370\u5BC6\u94A5\u503C\uFF09
|
|
1307
|
+
nolo secret list
|
|
1308
|
+
|
|
1309
|
+
# 2. \u8BBE\u7F6E\u6216\u66F4\u65B0\u51ED\u636E\uFF08\u652F\u6301\u5B57\u7B26\u4E32\u6216 JSON \u5BF9\u8C61\uFF09
|
|
1310
|
+
nolo secret set amo '{"issuer":"user:<account-id>:<key-id>","secret":"<key>"}'
|
|
1311
|
+
nolo secret set docker_token 'my-secret-token'
|
|
1312
|
+
|
|
1313
|
+
# 3. \u5B89\u5168\u6CE8\u5165\u73AF\u5883\u53D8\u91CF\u5E76\u6267\u884C\u547D\u4EE4\uFF08\u63A8\u8350\u7528\u6CD5\uFF0C\u5B50\u8FDB\u7A0B\u7ED3\u675F\u540E\u53D8\u91CF\u81EA\u52A8\u9500\u6BC1\uFF09
|
|
1314
|
+
# \u4F8B\u5982: amo \u81EA\u52A8\u6620\u5C04\u51FA WEB_EXT_API_KEY / WEB_EXT_API_SECRET / AMO_JWT_ISSUER / AMO_JWT_SECRET
|
|
1315
|
+
nolo secret run --with amo -- bunx web-ext sign --channel unlisted ...
|
|
1316
|
+
|
|
1317
|
+
# 4. \u5220\u9664\u4E0D\u518D\u9700\u8981\u7684\u51ED\u636E
|
|
1318
|
+
nolo secret delete amo
|
|
1319
|
+
\`\`\`
|
|
1320
|
+
|
|
1321
|
+
## \u5DF2\u652F\u6301\u7684\u81EA\u52A8\u5316\u6620\u5C04\u670D\u52A1
|
|
1322
|
+
|
|
1323
|
+
- **\`amo\`**\uFF08Mozilla Add-ons\uFF09\uFF1A
|
|
1324
|
+
- \u5B58\u50A8\u683C\u5F0F\uFF1A\`{"issuer": "...", "secret": "..."}\`
|
|
1325
|
+
- \u81EA\u52A8\u6CE8\u5165\u73AF\u5883\u53D8\u91CF\uFF1A\`WEB_EXT_API_KEY\`, \`WEB_EXT_API_SECRET\`, \`AMO_JWT_ISSUER\`, \`AMO_JWT_SECRET\`
|
|
1326
|
+
- **\u901A\u7528\u51ED\u636E**\uFF1A
|
|
1327
|
+
- \u5B57\u7B26\u4E32\uFF1A\u81EA\u52A8\u8F6C\u4E3A\u5927\u5199\u4E0B\u5212\u7EBF\u73AF\u5883\u53D8\u91CF\uFF08\u5982 \`my_api_key\` \u2192 \`MY_API_KEY\`\uFF09
|
|
1328
|
+
- \u5BF9\u8C61\uFF1A\u81EA\u52A8\u5C55\u5F00\u4E3A\u524D\u7F00\u53D8\u91CF\uFF08\u5982 \`docker: { "user": "a", "token": "b" }\` \u2192 \`DOCKER_USER\`, \`DOCKER_TOKEN\`\uFF09
|
|
1329
|
+
`
|
|
1330
|
+
}
|
|
1331
|
+
};
|
|
1332
|
+
function buildSecretsManagerSkillConfig(slug) {
|
|
1333
|
+
const seed = SECRETS_MANAGER_SKILL_DEFINITIONS[slug];
|
|
1334
|
+
if (!seed) throw new Error(`Unknown secrets-manager skill slug: ${slug}`);
|
|
1335
|
+
return {
|
|
1336
|
+
version: "0.1",
|
|
1337
|
+
kind: "skill",
|
|
1338
|
+
id: buildSecretsManagerSkillId(slug),
|
|
1339
|
+
name: seed.title,
|
|
1340
|
+
description: seed.description,
|
|
1341
|
+
triggerMode: "manual"
|
|
1342
|
+
};
|
|
1343
|
+
}
|
|
1344
|
+
function buildSecretsManagerSkillContentBySlug(slug) {
|
|
1345
|
+
const seed = SECRETS_MANAGER_SKILL_DEFINITIONS[slug];
|
|
1346
|
+
if (!seed) throw new Error(`Unknown secrets-manager skill slug: ${slug}`);
|
|
1347
|
+
const skillConfig = buildSecretsManagerSkillConfig(slug);
|
|
1348
|
+
return buildSkillDocMarkdown({
|
|
1349
|
+
body: seed.body,
|
|
1350
|
+
skillConfig
|
|
1351
|
+
});
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
// packages/ai/skills/systematicInvestigationSkill.ts
|
|
1355
|
+
var SYSTEMATIC_INVESTIGATION_SKILL_SLUGS = ["systematic-investigation"];
|
|
1356
|
+
function deterministicId9(prefix, seed) {
|
|
1357
|
+
let h = 2166136261;
|
|
1358
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1359
|
+
h ^= seed.charCodeAt(i);
|
|
1360
|
+
h = h * 16777619 >>> 0;
|
|
1361
|
+
}
|
|
1362
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1363
|
+
return (prefix + suffix).slice(0, 26);
|
|
1364
|
+
}
|
|
1365
|
+
function normalizeSkillSeed8(input) {
|
|
1366
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1367
|
+
}
|
|
1368
|
+
function buildSystematicinvestigationSkillId(slug) {
|
|
1369
|
+
return deterministicId9("01SK", normalizeSkillSeed8(slug) || slug);
|
|
1370
|
+
}
|
|
1282
1371
|
function buildSystematicinvestigationSkillPageKey(userId, slug) {
|
|
1283
1372
|
return `page-${userId}-${buildSystematicinvestigationSkillId(slug)}`;
|
|
1284
1373
|
}
|
|
@@ -1301,7 +1390,7 @@ function buildSystematicinvestigationSkillContentBySlug(slug) {
|
|
|
1301
1390
|
|
|
1302
1391
|
// packages/ai/skills/showMeSkill.ts
|
|
1303
1392
|
var SHOW_ME_SKILL_SLUGS = ["show-me"];
|
|
1304
|
-
function
|
|
1393
|
+
function deterministicId10(prefix, seed) {
|
|
1305
1394
|
let h = 2166136261;
|
|
1306
1395
|
for (let i = 0; i < seed.length; i++) {
|
|
1307
1396
|
h ^= seed.charCodeAt(i);
|
|
@@ -1310,11 +1399,11 @@ function deterministicId9(prefix, seed) {
|
|
|
1310
1399
|
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1311
1400
|
return (prefix + suffix).slice(0, 26);
|
|
1312
1401
|
}
|
|
1313
|
-
function
|
|
1402
|
+
function normalizeSkillSeed9(input) {
|
|
1314
1403
|
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1315
1404
|
}
|
|
1316
1405
|
function buildShowmeSkillId(slug) {
|
|
1317
|
-
return
|
|
1406
|
+
return deterministicId10("01SK", normalizeSkillSeed9(slug) || slug);
|
|
1318
1407
|
}
|
|
1319
1408
|
function buildShowmeSkillPageKey(userId, slug) {
|
|
1320
1409
|
return `page-${userId}-${buildShowmeSkillId(slug)}`;
|
|
@@ -1326,19 +1415,19 @@ function buildShowmeSkillConfig(slug) {
|
|
|
1326
1415
|
id: buildShowmeSkillId(slug),
|
|
1327
1416
|
name: "\u89C6\u89C9\u5316\u89E3\u91CA\uFF08show-me\uFF09",
|
|
1328
1417
|
triggerMode: "recommended",
|
|
1329
|
-
description: "\u4EE5\u89C6\u89C9\u76F4\u89C2\u7684\u65B9\u5F0F\uFF08\u7CBE\u70BC\u4F2A\u4EE3\u7801\u3001\u8C03\u7528\u6811\u3001\u7EC4\u4EF6\u6811\u3001Mermaid \u56FE\u8868\u3001\u7ED3\u6784\u5316 Diff
|
|
1418
|
+
description: "\u4EE5\u89C6\u89C9\u76F4\u89C2\u7684\u65B9\u5F0F\uFF08\u7CBE\u70BC\u4F2A\u4EE3\u7801\u3001\u8C03\u7528\u6811\u3001\u7EC4\u4EF6\u6811\u3001Mermaid \u56FE\u8868\u3001\u7ED3\u6784\u5316 Diff\u3001\u5355\u6587\u4EF6 HTML \u539F\u578B\u6216\u5DE5\u4F5C\u53F0\u5206\u680F\u5C55\u793A\uFF09\u89E3\u91CA\u590D\u6742\u4E3B\u9898\u3001\u67B6\u6784\u903B\u8F91\u3001\u72B6\u6001\u6D41\u8F6C\u4E0E UI \u7ED3\u6784\u3002\u89E6\u53D1\u8BCD\uFF1A\u753B\u4E2A\u56FE\u3001\u753B\u56FE\u3001\u6D41\u7A0B\u56FE\u3001\u65F6\u5E8F\u56FE\u3001\u53EF\u89C6\u5316\u3001\u600E\u4E48\u8C03\u7528\u7684\u3001\u8C03\u7528\u94FE\u3001\u7EC4\u4EF6\u7ED3\u6784\u3001\u5BF9\u6BD4\u4E00\u4E0B\u3001show me\u3001visualize\u3001diagram\u3001artifact preview\u3002"
|
|
1330
1419
|
};
|
|
1331
1420
|
}
|
|
1332
1421
|
function buildShowmeSkillContentBySlug(slug) {
|
|
1333
1422
|
return buildSkillDocMarkdown({
|
|
1334
|
-
body:
|
|
1423
|
+
body: '# Show Me (Visual-First \u7ED3\u6784\u5316\u8868\u8FBE\u6307\u5357)\n\n\u5F53\u89E3\u91CA\u590D\u6742\u7CFB\u7EDF\u3001\u6D41\u7A0B\u3001\u67B6\u6784\u8BBE\u8BA1\u3001\u6392\u9519\u6839\u56E0\u6216 UI \u53D8\u52A8\u65F6\uFF0C\u9075\u5FAA **\u201C\u89C6\u89C9\u4F18\u5148\uFF08Visual-First\uFF09\u201D** \u539F\u5219\u3002\n\u8DF3\u8FC7\u5197\u957F\u5F00\u573A\u767D\uFF0C\u4FDD\u6301\u6B63\u6587\u7B80\u660E\u627C\u8981\uFF0C\u9009\u62E9\u80FD\u8BB2\u6E05\u6838\u5FC3\u89C2\u70B9\u7684**\u6700\u5C0F\u5FC5\u8981\u89C6\u56FE\uFF08Smallest View\uFF09**\u3002\n\n---\n\n## \u6838\u5FC3\u53EF\u89C6\u5316\u6A21\u5F0F\n\n### 1. \u903B\u8F91\u4E0E\u7B97\u6CD5\u4F2A\u4EE3\u7801\n\u5C55\u793A\u5173\u952E\u5206\u652F\u5224\u65AD\u3001\u8BA1\u7B97\u987A\u5E8F\u6216\u6838\u5FC3\u7B97\u6CD5\u6B65\u9AA4\uFF1A\n\n```text\non(save)\n if content is unchanged\n return cached result\n write new content\n return fresh result\n```\n\n### 2. \u8FD0\u884C\u65F6\u63A7\u5236\u6D41 / \u8C03\u7528\u6811 (Call Tree)\n\u5C55\u793A\u65B9\u6CD5\u8C03\u7528\u5C42\u7EA7\u4E0E\u6570\u636E\u63A8\u8FDB\u94FE\u8DEF\uFF1A\n\n```text\nsubmitForm\n validateInputs\n createSession\n persistPrompt\n launchAgent\n spawnWorker\n navigateToSession\n```\n\n### 3. \u7EC4\u4EF6\u6811\u4E0E\u72B6\u6001\u8FB9\u754C (Component Tree)\n\u5C55\u793A\u524D\u7AEF UI \u7EC4\u4EF6\u5C42\u7EA7\u3001Props \u4F20\u9012\u4EE5\u53CA\u5C40\u90E8/\u5168\u5C40\u72B6\u6001\u6240\u5C5E\uFF1A\n\n```tsx\n(apps/web/src/pages/WorkspacePage.tsx)\n<WorkspaceProvider> // \u5168\u5C40 workspace context\n <WorkspaceLayout>\n <Sidebar /> // activeNav, unreadBadges\n <MainContent>\n <ChatThread> // threadId, messages\n <MessageList>\n <MessageItem /> // content, sender\n </MessageList>\n <ChatInput /> // draft, isSending\n </ChatThread>\n </MainContent>\n </WorkspaceLayout>\n</WorkspaceProvider>\n```\n\n### 4. \u6D45\u5C42\u6587\u4EF6\u6811 (File Tree)\n\u5C55\u793A\u76EE\u5F55\u7EC4\u7EC7\u3001\u6A21\u5757\u5F52\u5C5E\u6216\u91CD\u6784\u8303\u56F4\uFF08\u4EC5\u4FDD\u7559\u4E0E\u95EE\u9898\u76F4\u63A5\u76F8\u5173\u7684\u5C42\u7EA7\uFF09\uFF1A\n\n```text\npackages/\n client/\n src/\n components/ // UI \u5C55\u793A\u7EC4\u4EF6\n hooks/ // \u6570\u636E\u6D41\u4E0E\u54CD\u5E94\u5F0F\u72B6\u6001\n server/\n src/\n routes/ // API \u8DEF\u7531\u5165\u53E3\n services/ // \u6838\u5FC3\u4E1A\u52A1\u5904\u7406\n```\n\n### 5. \u7ED3\u6784\u5316 Diff\n\u9664\u4E86\u4EE3\u7801\u53D8\u66F4\uFF0C\u8FD8\u53EF\u7528\u4E8E\u76F4\u89C2\u5BF9\u6BD4**\u67B6\u6784\u6F14\u8FDB\u3001\u8C03\u7528\u94FE\u4FEE\u6539\u3001\u6587\u4EF6\u91CD\u6784\u3001\u72B6\u6001\u7ED3\u6784\u53D8\u52A8**\uFF1A\n\n```diff\n submitForm\n validateInputs\n- syncDirectSave\n+ dispatchAsyncJob\n+ queueWorker\n+ pollStatus\n navigateToSession\n```\n\n### 6. Mermaid \u6D41\u7A0B\u56FE / \u65F6\u5E8F\u56FE / \u72B6\u6001\u673A\n\u7528\u4E8E\u8DE8\u670D\u52A1\u901A\u4FE1\u3001\u591A\u7AEF\u4EA4\u4E92\u3001\u751F\u547D\u5468\u671F\u4E0E\u72B6\u6001\u6D41\u8F6C\uFF08Web / Desktop \u5BA2\u6237\u7AEF\u53EF\u76F4\u63A5\u539F\u751F\u6E32\u67D3\uFF09\uFF1A\n\n```mermaid\nsequenceDiagram\n autonumber\n actor User as \u7528\u6237\n participant Client as \u5BA2\u6237\u7AEF (Web/Desktop)\n participant Server as Nolo Server\n participant Agent as Agent Runtime\n\n User->>Client: \u53D1\u9001\u6307\u4EE4\n Client->>Server: POST /api/dialog/message\n Server->>Agent: \u8C03\u5EA6 startAgentThread\n Agent-->>Client: SSE \u6D41\u5F0F\u54CD\u5E94 (Token / Artifact)\n Client-->>User: \u5B9E\u65F6\u754C\u9762\u66F4\u65B0\n```\n\n### 7. \u72EC\u7ACB HTML \u6E32\u67D3\u5DE5\u4EF6 (HTML Artifact) \u4E0E\u5DE5\u4F5C\u53F0\u5206\u680F\n\u5F53\u6587\u672C\u3001\u6811\u5F62\u56FE\u6216 Mermaid \u65E0\u6CD5\u5145\u5206\u8868\u8FBE\u4E30\u5BCC\u7684\u4EA4\u4E92\u539F\u578B\u3001\u590D\u6742 UI \u5E03\u5C40\u5BF9\u6BD4\u3001\u4FE1\u606F\u56FE\u8868\u6216\u5373\u7528\u5373\u5F03\u5355\u9875\u5E94\u7528\u65F6\uFF0C\u751F\u6210\u4E00\u4EFD\u81EA\u5305\u542B\u7684\u5355\u4E2A HTML \u6587\u4EF6\u3002\n- \u91C7\u7528\u7B26\u5408\u73B0\u4EE3\u4EA7\u54C1\u6807\u51C6\u7684\u914D\u8272\u3001\u5B57\u4F53\u3001\u95F4\u8DDD\u4E0E\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n- \u4F7F\u7528\u771F\u5B9E\u6807\u7B7E\u4E0E\u6A21\u62DF\u6570\u636E\uFF0C\u907F\u514D\u7A7A\u7070\u76D2\u3002\n- \u5448\u73B0\u65B9\u5F0F\uFF08\u9075\u5FAA\u4E09\u5C42\u5C55\u793A\u5A92\u4ECB\uFF09\uFF1A\n 1. \u6C14\u6CE1\u5185\u8054\u4E0E\u5361\u7247\uFF1A\u4F7F\u7528 ```html preview="true" \u4EE3\u7801\u5757\uFF0C\u5728\u6D88\u606F\u5185\u5C55\u793A\u7F29\u7565\u5361\u7247\uFF0C\u5E76\u63D0\u4F9B\u3010\u5728\u5DE5\u4F5C\u53F0\u6253\u5F00\u3011\u5165\u53E3\uFF1B\u7B80\u5355\u4EA4\u4E92\u63A7\u4EF6\u53EF\u4F7F\u7528 ```jsx preview="true"\uFF08\u542B `function Example()`\uFF09\uFF1B\n 2. \u5DE5\u4F5C\u53F0\u5206\u680F\uFF08WorkbenchSplit\uFF09\uFF1A\u5B8C\u6574\u9875\u9762\u4E0E\u5373\u7528\u5373\u5F03\u4EA4\u4E92\u539F\u578B\u5728\u53F3\u4FA7\u6216\u5DE6\u4FA7\u5206\u680F\u4EE5\u5B89\u5168\u6C99\u7BB1\uFF08sandbox="allow-scripts"\uFF09\u5168\u666F\u5C55\u793A\uFF0C\u652F\u6301\u8FB9\u804A\u8FB9\u6539\uFF0C\u65E0\u9700\u8DF3\u51FA\u5916\u90E8\u7A97\u53E3\uFF1B\n 3. \u5916\u90E8\u6D4F\u89C8\u5668\uFF1A\u4EC5\u5728\u9700\u8981\u771F\u5B9E\u767B\u5F55\u6001\u3001Cookie \u6216\u91CD\u578B\u5168\u5C4F\u7CFB\u7EDF\u65F6\u624D\u8C03\u7528\u5916\u90E8\u6D4F\u89C8\u5668\u6216 Browser Connector \u6253\u5F00\u3002\n\n---\n\n## \u5B9E\u8DF5\u539F\u5219 (Guidance)\n\n1. **\u56FE\u6587\u5E76\u8302\uFF0C\u56FE\u5728\u6587\u5148**\uFF1A\u8BA9\u7ED3\u6784\u56FE\u7D27\u6328\u7740\u5176\u89E3\u91CA\u7684\u7B80\u8FF0\u6587\u5B57\uFF0C\u5148\u5448\u73B0\u6E05\u6670\u56FE\u8868\uFF0C\u518D\u7528 1~3 \u53E5\u8BDD\u8BF4\u660E\u91CD\u70B9\u3002\n2. **\u514B\u5236\u4E0E\u805A\u7126 (Smallest View)**\uFF1A\u53EA\u4FDD\u7559\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u6240\u5FC5\u9700\u7684\u8C03\u7528\u3001\u5C5E\u6027\u3001\u72B6\u6001\u4E0E\u8FB9\u754C\uFF0C\u4E0D\u8981\u5806\u780C\u65E0\u610F\u4E49\u7684\u5168\u5C40\u5197\u4F59\u4EE3\u7801\u3002\n3. **\u9009\u578B\u6070\u5F53**\uFF1A\u901A\u5E38\u4E00\u6B21\u89E3\u91CA\u9009\u7528 1~2 \u79CD\u6700\u5951\u5408\u7684\u53EF\u89C6\u5316\u5F62\u5F0F\u5373\u53EF\uFF0C\u4E0D\u8981\u628A\u6240\u6709\u56FE\u8868\u90FD\u5806\u5728\u4E00\u8D77\u589E\u52A0\u8BA4\u77E5\u8D1F\u62C5\u3002\n4. **\u5BA2\u6237\u7AEF\u9002\u914D\u4E0E\u5C55\u793A\u5206\u5DE5**\uFF1A\n - \u5728 CLI / TUI \u7EC8\u7AEF\u4E2D\uFF0C\u4F18\u5148\u4F7F\u7528\u4F2A\u4EE3\u7801\u3001\u7F29\u8FDB\u8C03\u7528\u6811\u3001Unicode \u5B57\u7B26\u56FE\u4E0E Diff\uFF1B\n - \u5728 Web / Desktop \u56FE\u5F62\u5BA2\u6237\u7AEF\u4E2D\uFF0C\u5145\u5206\u5229\u7528 Mermaid \u6E32\u67D3\u3001\u6C14\u6CE1\u5185\u8054\u5361\u7247\u4E0E\u5DE5\u4F5C\u53F0\u5206\u680F\uFF08WorkbenchSplit\uFF09\u9884\u89C8\uFF1B\u9700\u8981\u5C55\u793A\u7F51\u9875\u6216\u539F\u578B\u65F6\u76F4\u63A5\u8FD4\u56DE\u94FE\u63A5\u6216\u751F\u6210\u5355\u6587\u4EF6\u5236\u54C1\uFF0C\u4E0D\u4E3B\u52A8\u8DF3\u51FA\u5916\u90E8\u72EC\u7ACB\u7A97\u53E3\u3002',
|
|
1335
1424
|
skillConfig: buildShowmeSkillConfig(slug)
|
|
1336
1425
|
});
|
|
1337
1426
|
}
|
|
1338
1427
|
|
|
1339
1428
|
// packages/ai/skills/cavemanSkill.ts
|
|
1340
1429
|
var CAVEMAN_SKILL_SLUGS = ["caveman"];
|
|
1341
|
-
function
|
|
1430
|
+
function deterministicId11(prefix, seed) {
|
|
1342
1431
|
let h = 2166136261;
|
|
1343
1432
|
for (let i = 0; i < seed.length; i++) {
|
|
1344
1433
|
h ^= seed.charCodeAt(i);
|
|
@@ -1347,11 +1436,11 @@ function deterministicId10(prefix, seed) {
|
|
|
1347
1436
|
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1348
1437
|
return (prefix + suffix).slice(0, 26);
|
|
1349
1438
|
}
|
|
1350
|
-
function
|
|
1439
|
+
function normalizeSkillSeed10(input) {
|
|
1351
1440
|
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1352
1441
|
}
|
|
1353
1442
|
function buildCavemanSkillId(slug) {
|
|
1354
|
-
return
|
|
1443
|
+
return deterministicId11("01SK", normalizeSkillSeed10(slug) || slug);
|
|
1355
1444
|
}
|
|
1356
1445
|
function buildCavemanSkillPageKey(userId, slug) {
|
|
1357
1446
|
return `page-${userId}-${buildCavemanSkillId(slug)}`;
|
|
@@ -1375,7 +1464,7 @@ function buildCavemanSkillContentBySlug(slug) {
|
|
|
1375
1464
|
|
|
1376
1465
|
// packages/ai/skills/skillCreatorSkill.ts
|
|
1377
1466
|
var SKILL_CREATOR_SKILL_SLUGS = ["skill-creator"];
|
|
1378
|
-
function
|
|
1467
|
+
function deterministicId12(prefix, seed) {
|
|
1379
1468
|
let h = 2166136261;
|
|
1380
1469
|
for (let i = 0; i < seed.length; i++) {
|
|
1381
1470
|
h ^= seed.charCodeAt(i);
|
|
@@ -1384,11 +1473,11 @@ function deterministicId11(prefix, seed) {
|
|
|
1384
1473
|
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1385
1474
|
return (prefix + suffix).slice(0, 26);
|
|
1386
1475
|
}
|
|
1387
|
-
function
|
|
1476
|
+
function normalizeSkillSeed11(input) {
|
|
1388
1477
|
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1389
1478
|
}
|
|
1390
1479
|
function buildSkillCreatorSkillId(slug) {
|
|
1391
|
-
return
|
|
1480
|
+
return deterministicId12("01SK", normalizeSkillSeed11(slug) || slug);
|
|
1392
1481
|
}
|
|
1393
1482
|
function buildSkillCreatorSkillPageKey(userId, slug) {
|
|
1394
1483
|
return `page-${userId}-${buildSkillCreatorSkillId(slug)}`;
|
|
@@ -1412,7 +1501,7 @@ function buildSkillCreatorSkillContentBySlug(slug) {
|
|
|
1412
1501
|
|
|
1413
1502
|
// packages/ai/skills/agentProviderSetupSkill.ts
|
|
1414
1503
|
var AGENT_PROVIDER_SETUP_SKILL_SLUGS = ["agent-provider-setup"];
|
|
1415
|
-
function
|
|
1504
|
+
function deterministicId13(prefix, seed) {
|
|
1416
1505
|
let h = 2166136261;
|
|
1417
1506
|
for (let i = 0; i < seed.length; i++) {
|
|
1418
1507
|
h ^= seed.charCodeAt(i);
|
|
@@ -1421,11 +1510,11 @@ function deterministicId12(prefix, seed) {
|
|
|
1421
1510
|
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1422
1511
|
return (prefix + suffix).slice(0, 26);
|
|
1423
1512
|
}
|
|
1424
|
-
function
|
|
1513
|
+
function normalizeSkillSeed12(input) {
|
|
1425
1514
|
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1426
1515
|
}
|
|
1427
1516
|
function buildAgentProviderSetupSkillId(slug) {
|
|
1428
|
-
return
|
|
1517
|
+
return deterministicId13("01SK", normalizeSkillSeed12(slug) || slug);
|
|
1429
1518
|
}
|
|
1430
1519
|
function buildAgentProviderSetupSkillPageKey(userId, slug) {
|
|
1431
1520
|
return `page-${userId}-${buildAgentProviderSetupSkillId(slug)}`;
|
|
@@ -1450,51 +1539,78 @@ function buildAgentProviderSetupSkillContentBySlug(slug) {
|
|
|
1450
1539
|
|
|
1451
1540
|
The preset catalog is DATA-DRIVEN \u2014 do not hardcode provider names or base URLs. Always read the live list first.
|
|
1452
1541
|
|
|
1542
|
+
## CLI Environment & Portability
|
|
1543
|
+
|
|
1544
|
+
- The \`nolo\` CLI is globally available once installed and logged in; execute commands directly without assuming the current working directory, a repo clone, or a repository nolo-cli skill.
|
|
1545
|
+
- **Shell-less environment check**: If the current runtime does NOT provide \`execShell\` (e.g. web chat without shell execution), you CANNOT directly create or configure custom-provider agents on behalf of the user. The platform \`createAgent\` tool only supports \`apiSource: "platform"\` with platform billing.
|
|
1546
|
+
- Do NOT pretend to create the agent directly without a shell, and do NOT fall back to platform billing.
|
|
1547
|
+
- Clearly explain this limitation to the user and direct them to the web configuration portal at \`/create/agent\` where they can securely configure their provider, model, and API key.
|
|
1548
|
+
|
|
1453
1549
|
## Step 1 \u2014 List available presets
|
|
1454
1550
|
|
|
1455
|
-
|
|
1551
|
+
When \`execShell\` is available, run:
|
|
1456
1552
|
\`\`\`
|
|
1457
1553
|
nolo agent providers --json
|
|
1458
1554
|
\`\`\`
|
|
1459
1555
|
This returns the registry presets grouped by \`group\`:
|
|
1460
1556
|
- \`subscription\` \u2014 token-plan subscriptions (Step Plan, Kimi Code, OpenCode Go\u2026): need an API key + a locked baseUrl.
|
|
1461
1557
|
- \`metered_api\` \u2014 pay-per-use own-key APIs (stepfun-api, deepseek-api, minimax\u2026).
|
|
1462
|
-
- \`subscription_oauth\` \u2014 OAuth brands (ChatGPT, Claude, Cursor\u2026): **cannot be created from a key here** \u2014 tell the user these require Nolo Desktop OAuth login, and stop.
|
|
1558
|
+
- \`subscription_oauth\` \u2014 OAuth brands (ChatGPT, Claude, Cursor\u2026): **cannot be created from a key here** \u2014 tell the user these require Nolo Desktop OAuth login (\`nolo auth <brand>\`), and stop.
|
|
1463
1559
|
|
|
1464
|
-
Match the user's request to a preset \`id\`. If the user already named one (e.g. "stepfun \u8BA2\u9605" \u2192 \`step-plan\`), skip straight to it. If ambiguous between subscription vs metered for the same vendor (e.g. \`step-plan\` vs \`stepfun-api\`), ask which they mean \u2014 subscription is
|
|
1560
|
+
Match the user's request to a preset \`id\`. If the user already named one (e.g. "stepfun \u8BA2\u9605" \u2192 \`step-plan\`), skip straight to it. If ambiguous between subscription vs metered for the same vendor (e.g. \`step-plan\` vs \`stepfun-api\`), ask which they mean \u2014 subscription is a periodic plan with token quota, metered is pay-per-token. Subscriptions do NOT replace platform billing for platform-hosted models.
|
|
1465
1561
|
|
|
1466
1562
|
## Step 2 \u2014 Model & reasoning effort: fork on how much the user knows
|
|
1467
1563
|
|
|
1468
|
-
- **User
|
|
1469
|
-
- **User
|
|
1564
|
+
- **User specifies a model**: Use the preset's \`models[]\` list to confirm the choice is valid. Do NOT interrogate the user about reasoning effort just because a model was named \u2014 use the model/preset's default effort unless the user explicitly requested a specific reasoning effort tier.
|
|
1565
|
+
- **User specifies reasoning effort**: Set it only among what the model supports (\`low/medium/high\`; check \`supportsReasoningEffort\`).
|
|
1566
|
+
- **User doesn't know / says "\u968F\u4FBF / \u4F60\u770B\u7740\u529E / \u9ED8\u8BA4"**: Just use the preset's \`defaultModel\` and default effort \u2014 do NOT interrogate them. The recommended model is already marked \`recommended:true\` in the list.
|
|
1567
|
+
- **Avoid redundant confirmations**: If the user has already made their preference or choice clear, do NOT re-ask the same question.
|
|
1470
1568
|
|
|
1471
|
-
## Step 3 \u2014
|
|
1569
|
+
## Step 3 \u2014 Safe credential handling
|
|
1472
1570
|
|
|
1473
|
-
Show the preset's \`keyFormatHint\` if present (it
|
|
1571
|
+
Show the preset's \`keyFormatHint\` if present (it explains where to obtain the key).
|
|
1572
|
+
- **Do not solicit raw keys in chat**: Do NOT prompt the user to paste their API key into the conversation transcript if avoidable.
|
|
1573
|
+
- **WARNING on \`--copy-provider-from\`**: Do NOT use or recommend \`--copy-provider-from\` for credential reuse. It does NOT copy API keys or \`credentialRef\` (leaving the new agent with 401 unconfigured credentials), and it silently overwrites explicit \`--model\` flags with the source agent's model.
|
|
1574
|
+
- **Recommended**: Guide the user to run the command directly in their local terminal:
|
|
1575
|
+
\`\`\`
|
|
1576
|
+
nolo agent create <slug> --preset <preset-id> [--model <model>] --api-key <YOUR_KEY> --verify
|
|
1577
|
+
\`\`\`
|
|
1578
|
+
- If the user explicitly provides a key in chat or requests execution via \`execShell\`:
|
|
1579
|
+
- **Never echo, quote, or repeat the key back** in messages.
|
|
1580
|
+
- **Never show the real key** in draft previews or confirmation summaries (mask as \`***\`).
|
|
1581
|
+
- Transparent security disclosure: Explain to the user that CLI \`--api-key\` passes the key via command line arguments (argv), which may be visible in process listings (\`ps\`) and tool execution logs. \`nolo agent create\` does not read \`CUSTOM_API_KEY\` from the environment, and setting an env var before running does NOT prevent argv exposure because the shell expands it. Do not claim environment variables make argv/logs naturally safe.
|
|
1474
1582
|
|
|
1475
|
-
## Step 4 \u2014 Confirm & create (
|
|
1476
|
-
|
|
1477
|
-
Show the user the exact command you will run, with the key masked, and get an explicit yes before executing. Then run it with the key passed via env so it never lands on the command line / in logs:
|
|
1583
|
+
## Step 4 \u2014 Confirm & create (when authorization is needed)
|
|
1478
1584
|
|
|
1585
|
+
Show the resolved command with the key masked (\`--api-key "***"\`):
|
|
1479
1586
|
\`\`\`
|
|
1480
|
-
|
|
1481
|
-
--preset <preset-id> --api-key "$CUSTOM_API_KEY" --verify
|
|
1587
|
+
nolo agent create <slug> --preset <preset-id> --api-key <KEY> --verify
|
|
1482
1588
|
\`\`\`
|
|
1483
|
-
|
|
1589
|
+
- **Confirmation gate**: If the user's current request has already clearly authorized the creation and its parameters (e.g. "\u5E2E\u6211\u7528 step-plan \u5EFA\u4E2A agent\uFF0Ckey \u662F ..."), proceed to execute directly without redundant re-confirmation. Only pause for confirmation when authorization is missing or when introducing new unexpected expense/permissions.
|
|
1484
1590
|
- \`--preset\` auto-fills provider/baseUrl/model from the registry; add \`--model <id>\` only if the user picked a non-default model.
|
|
1485
|
-
- \`--verify\` probes the endpoint end-to-end
|
|
1591
|
+
- \`--verify\` probes the endpoint end-to-end to verify that the key works.
|
|
1486
1592
|
- For a metered preset use its \`metered_api\` id the same way.
|
|
1487
1593
|
|
|
1488
|
-
## Step 5 \u2014
|
|
1594
|
+
## Step 5 \u2014 Verify behavior & report
|
|
1489
1595
|
|
|
1490
|
-
|
|
1596
|
+
Understand the behavior of \`--verify\`:
|
|
1597
|
+
- \`nolo agent create ... --verify\` saves the agent record to the database **before** running the verification probe.
|
|
1598
|
+
- **Creation success does NOT equal verify success**: If the verification probe fails, the agent has already been created.
|
|
1599
|
+
- If \`--verify\` fails:
|
|
1600
|
+
- **Do NOT blindly retry creation** \u2014 that will cause duplicate creation or overwrite errors.
|
|
1601
|
+
- **Never echo raw error output** that might contain secrets, tokens, or authorization headers. Provide a sanitized diagnostic message (e.g. endpoint unreachable, HTTP 401 unauthorized, or model not found).
|
|
1602
|
+
- Advise the user to verify their key, network, or plan tier, and update the existing agent via \`nolo agent update\` or \`/create/agent\` rather than re-creating it.
|
|
1603
|
+
- On complete success (both creation and probe passed), report the created agentKey and model.
|
|
1491
1604
|
|
|
1492
1605
|
## Hard rules
|
|
1493
1606
|
|
|
1494
|
-
-
|
|
1495
|
-
-
|
|
1496
|
-
-
|
|
1497
|
-
-
|
|
1607
|
+
- Never invent or hardcode provider lists; always read \`nolo agent providers --json\`.
|
|
1608
|
+
- Never claim environment variables eliminate argv or log exposure risks when passing keys to CLI.
|
|
1609
|
+
- Never echo raw API keys back to the conversation.
|
|
1610
|
+
- Without shell (\`execShell\`), never pretend to create custom-provider agents; direct to \`/create/agent\`.
|
|
1611
|
+
- Do NOT demand redundant confirmation if the user already explicitly authorized the creation in context; confirm only when authorization is missing or scope changes.
|
|
1612
|
+
- Do NOT recommend \`--copy-provider-from\` for credential reuse; warn that it does not copy keys and overwrites \`--model\`.
|
|
1613
|
+
- OAuth subscription presets \u2192 redirect to Nolo Desktop (\`nolo auth <brand>\`); do not attempt to create them via key.`
|
|
1498
1614
|
});
|
|
1499
1615
|
}
|
|
1500
1616
|
|
|
@@ -1570,6 +1686,13 @@ var SOURCES = [
|
|
|
1570
1686
|
buildConfig: buildWorktreeSkillConfig,
|
|
1571
1687
|
buildContent: buildWorktreeSkillContentBySlug
|
|
1572
1688
|
},
|
|
1689
|
+
{
|
|
1690
|
+
slugs: SECRETS_MANAGER_SKILL_SLUGS,
|
|
1691
|
+
buildSkillId: buildSecretsManagerSkillId,
|
|
1692
|
+
buildPageKey: buildSecretsManagerSkillPageKey,
|
|
1693
|
+
buildConfig: buildSecretsManagerSkillConfig,
|
|
1694
|
+
buildContent: buildSecretsManagerSkillContentBySlug
|
|
1695
|
+
},
|
|
1573
1696
|
{
|
|
1574
1697
|
slugs: SYSTEMATIC_INVESTIGATION_SKILL_SLUGS,
|
|
1575
1698
|
buildSkillId: buildSystematicinvestigationSkillId,
|
|
@@ -6,28 +6,39 @@ async function* readSseFrames(response) {
|
|
|
6
6
|
}
|
|
7
7
|
const decoder = new TextDecoder();
|
|
8
8
|
let buffer = "";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
try {
|
|
10
|
+
while (true) {
|
|
11
|
+
const { done, value } = await reader.read();
|
|
12
|
+
if (done) break;
|
|
13
|
+
buffer += decoder.decode(value, { stream: true });
|
|
14
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
15
|
+
while (boundary) {
|
|
16
|
+
yield buffer.slice(0, boundary.index);
|
|
17
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
18
|
+
boundary = findSseFrameBoundary(buffer);
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
const remaining = decoder.decode();
|
|
22
|
+
if (remaining) {
|
|
23
|
+
buffer += remaining;
|
|
24
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
25
|
+
while (boundary) {
|
|
26
|
+
yield buffer.slice(0, boundary.index);
|
|
27
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
28
|
+
boundary = findSseFrameBoundary(buffer);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (buffer.trim()) yield buffer;
|
|
32
|
+
} finally {
|
|
33
|
+
try {
|
|
34
|
+
await reader.cancel();
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
reader.releaseLock();
|
|
39
|
+
} catch {
|
|
28
40
|
}
|
|
29
41
|
}
|
|
30
|
-
if (buffer.trim()) yield buffer;
|
|
31
42
|
}
|
|
32
43
|
function findSseFrameBoundary(buffer) {
|
|
33
44
|
const lfLf = buffer.indexOf("\n\n");
|