nolo-cli 0.148.0-alpha.1 → 0.151.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/{_executeModel-NFJAMAGJ.js → _executeModel-XHAFJ2MM.js} +134 -91
  2. package/accountResolver-7RYB4D2P.js +300 -0
  3. package/action-SXJD5N5R.js +23 -0
  4. package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
  5. package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
  6. package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-DPUUS56Z.js} +181 -93
  7. package/{agentEmailCommands-4KW33JII.js → agentEmailCommands-V4P5EFLP.js} +132 -112
  8. package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
  9. package/agentListCommands-TWFLUYIZ.js +802 -0
  10. package/{agentMachineCommands-CMQR4RQ4.js → agentMachineCommands-MELPAZZI.js} +58 -62
  11. package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
  12. package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
  13. package/agentRecordCommands-FSWSSQIO.js +154 -0
  14. package/agentRunCommand-GDBJVOAT.js +183 -0
  15. package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
  16. package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
  17. package/{agentSlice-OZ33K224.js → agentSlice-YO2ZLJMD.js} +23 -16
  18. package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
  19. package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
  20. package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
  21. package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
  22. package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
  23. package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
  24. package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
  25. package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
  26. package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
  27. package/chromeOpsCommands-3Z34RKSE.js +472 -0
  28. package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
  29. package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
  30. package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
  31. package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
  32. package/chunk-3PVYUPXK.js +40 -0
  33. package/chunk-3SZA4U64.js +1192 -0
  34. package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
  35. package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
  36. package/chunk-4LCOCOR5.js +50 -0
  37. package/chunk-4YRTZIVN.js +871 -0
  38. package/chunk-556RW72X.js +14110 -0
  39. package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
  40. package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
  41. package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
  42. package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
  43. package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
  44. package/chunk-5MMAK75Q.js +15 -0
  45. package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
  46. package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
  47. package/chunk-6MJNEXUU.js +614 -0
  48. package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
  49. package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
  50. package/chunk-6QDYSCPW.js +223 -0
  51. package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
  52. package/chunk-7DPNBQSV.js +9 -0
  53. package/chunk-7MOXKPHC.js +119 -0
  54. package/{chunk-523WHFSL.js → chunk-7XKL25PW.js} +1973 -754
  55. package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
  56. package/chunk-AGIM7IMJ.js +147 -0
  57. package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
  58. package/{chunk-P4BX6FFU.js → chunk-AOCM7HPT.js} +214 -51
  59. package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
  60. package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
  61. package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
  62. package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
  63. package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
  64. package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
  65. package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
  66. package/chunk-CHOZJMJS.js +78 -0
  67. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  68. package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
  69. package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
  70. package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
  71. package/{chunk-BKWMNZ2X.js → chunk-ES633ZS5.js} +280 -98
  72. package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
  73. package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
  74. package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
  75. package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
  76. package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
  77. package/chunk-FJMRBOPO.js +11507 -0
  78. package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
  79. package/chunk-G6OOUQWJ.js +417 -0
  80. package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
  81. package/chunk-GKXCHNTE.js +15 -0
  82. package/{chunk-T7F46O36.js → chunk-GQN2WLAI.js} +20 -11
  83. package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
  84. package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
  85. package/{chunk-YUWMM4US.js → chunk-HKX3ULQB.js} +34 -22
  86. package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
  87. package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
  88. package/chunk-I42VC5KR.js +15 -0
  89. package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
  90. package/chunk-IA7TRNNR.js +11 -0
  91. package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
  92. package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
  93. package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
  94. package/chunk-IT3ZZRJE.js +12 -0
  95. package/{chunk-LPVCRQMM.js → chunk-IZ7OJB6K.js} +20 -16
  96. package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
  97. package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
  98. package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
  99. package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
  100. package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
  101. package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
  102. package/{chunk-FWQEKRTD.js → chunk-LTRUTOHX.js} +36 -31
  103. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  104. package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
  105. package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
  106. package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
  107. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  108. package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
  109. package/{chunk-DIXLJWCD.js → chunk-PCKVQXYV.js} +274 -93
  110. package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
  111. package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
  112. package/{chunk-BIDGLJQ3.js → chunk-PLXDDGBK.js} +45 -8
  113. package/chunk-PWTNI4N7.js +47 -0
  114. package/chunk-QFEW2ULV.js +42 -0
  115. package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
  116. package/chunk-QQ56R7KS.js +88 -0
  117. package/chunk-QYPE3TS3.js +43 -0
  118. package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
  119. package/chunk-RVWMAFIT.js +134 -0
  120. package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
  121. package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
  122. package/{chunk-T767MPHB.js → chunk-SMENBO3M.js} +354 -120
  123. package/{chunk-PCVVZ2MH.js → chunk-SSFDFOVT.js} +26 -31
  124. package/chunk-SW4S4XYB.js +1794 -0
  125. package/{chunk-HUFPWXFW.js → chunk-T6X3D7NB.js} +572 -430
  126. package/chunk-TY3TIUJK.js +89 -0
  127. package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
  128. package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
  129. package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
  130. package/chunk-UEILX4EV.js +15 -0
  131. package/chunk-UHTDNB5Y.js +140 -0
  132. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  133. package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
  134. package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
  135. package/chunk-UUPR3TD7.js +53 -0
  136. package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
  137. package/chunk-VHGD6FHV.js +116 -0
  138. package/chunk-VIWDGTDA.js +8 -0
  139. package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
  140. package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
  141. package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
  142. package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
  143. package/chunk-WD4XYDYC.js +567 -0
  144. package/chunk-WJZOQR2J.js +151 -0
  145. package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
  146. package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
  147. package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
  148. package/chunk-XRUSXPCQ.js +514 -0
  149. package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
  150. package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
  151. package/{chunk-2JMMBU6V.js → chunk-Y2DXOPSO.js} +1920 -644
  152. package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
  153. package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
  154. package/chunk-YVPQATSC.js +709 -0
  155. package/{chunk-DCFPQW22.js → chunk-Z7OJUX6S.js} +122 -107
  156. package/chunk-ZEZC7IIM.js +126 -0
  157. package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
  158. package/chunk-ZIWPQEFU.js +165 -0
  159. package/chunk-ZKZ5X2HS.js +7012 -0
  160. package/chunk-ZRAU6T47.js +56 -0
  161. package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
  162. package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
  163. package/{commandRegistry-YOEQUA7T.js → commandRegistry-XN7C5GHO.js} +183 -107
  164. package/contentThunks-5L7YQI3S.js +84 -0
  165. package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
  166. package/{createAgentAutomationAction-5EJL6ROU.js → createAgentAutomationAction-QOPOLCRK.js} +53 -44
  167. package/createDialogAction-MZ66VY5Q.js +76 -0
  168. package/{createPageAction-75ELC64R.js → createPageAction-VQDJIXMY.js} +65 -54
  169. package/cursorProvider-YGGNMVWX.js +6123 -0
  170. package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
  171. package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
  172. package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
  173. package/dialogCommands-YZLSJB6X.js +113 -0
  174. package/{dialogSlice-KSXPGJB2.js → dialogSlice-6RODVYCK.js} +53 -39
  175. package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
  176. package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
  177. package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
  178. package/{docStore-AROBVRCR.js → docStore-ZZA3OPM5.js} +25 -16
  179. package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
  180. package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
  181. package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
  182. package/{handleSendMessageAction-EGNWHAUB.js → handleSendMessageAction-DVG5U26T.js} +619 -165
  183. package/index.js +11 -7
  184. package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
  185. package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
  186. package/localRuntimeAdapter-HXRHFKRC.js +244 -0
  187. package/localRuntimeAuthority-JDAD7CB6.js +16 -0
  188. package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
  189. package/{machineCommands-ARZYKGGE.js → machineCommands-5KBF4RCC.js} +503 -161
  190. package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
  191. package/machineWsRunDispatch-4OQDEDOR.js +169 -0
  192. package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
  193. package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
  194. package/package.json +1 -1
  195. package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
  196. package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
  197. package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
  198. package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
  199. package/{readlineWorkspace-3XOFVARF.js → readlineWorkspace-RIE62QVZ.js} +5022 -921
  200. package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
  201. package/{runAgentClientLoop-UMF7VZYZ.js → runAgentClientLoop-KLUUXBZS.js} +154 -97
  202. package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
  203. package/secretCommands-ZXZRLR3R.js +700 -0
  204. package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
  205. package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
  206. package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
  207. package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
  208. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  209. package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
  210. package/{streamAgentChatTurn-GYGMYOSM.js → streamAgentChatTurn-MN2SSPGA.js} +309 -165
  211. package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
  212. package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
  213. package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
  214. package/tools-W2MOLERY.js +124 -0
  215. package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
  216. package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
  217. package/{updateDialogTitleAction-4U5W4AMH.js → updateDialogTitleAction-Z4JX6REN.js} +102 -57
  218. package/workloadLifecycle-36DXRZKU.js +320 -0
  219. package/action-GI44T4DR.js +0 -31
  220. package/agentListCommands-IW3GQVUP.js +0 -427
  221. package/agentRecordCommands-4YBSYPIY.js +0 -134
  222. package/agentRunCommand-5MU5X5OT.js +0 -161
  223. package/browser-image-compression-MFDTD7K6.js +0 -1763
  224. package/chatQueueReduxAdapter-HVHA2HPM.js +0 -186
  225. package/chromeOpsCommands-IXRLN57H.js +0 -289
  226. package/chunk-42Z3EMC4.js +0 -25363
  227. package/chunk-CQ3WA2NE.js +0 -299
  228. package/chunk-CYSYR67N.js +0 -93
  229. package/chunk-IAG4FHOJ.js +0 -34
  230. package/chunk-JBTJAPUF.js +0 -35
  231. package/chunk-K2CSUCHJ.js +0 -620
  232. package/chunk-LTRXGFMS.js +0 -83
  233. package/chunk-M76ECQRD.js +0 -13658
  234. package/chunk-MEYIRKDN.js +0 -8967
  235. package/chunk-OCZKATRC.js +0 -129
  236. package/chunk-OTGFTBLI.js +0 -13
  237. package/chunk-PUOC4YRO.js +0 -394
  238. package/chunk-QU5A4LYX.js +0 -2415
  239. package/chunk-URMS4XY2.js +0 -10
  240. package/chunk-UV6VISQJ.js +0 -20
  241. package/chunk-VJVNU77E.js +0 -83
  242. package/chunk-WRMKCKZ3.js +0 -13807
  243. package/chunk-Y5GCAMGP.js +0 -9
  244. package/chunk-YPREESF4.js +0 -225
  245. package/contentThunks-AK2F3KNC.js +0 -73
  246. package/createDialogAction-F5WEWA47.js +0 -66
  247. package/dialogCommands-G7YBVAMC.js +0 -102
  248. package/levelLazyShim-GZBKODGI.js +0 -7
  249. package/machineWsRunDispatch-I7F4L532.js +0 -149
  250. package/serverStoreFactory-YMXDF4NI.js +0 -20
  251. package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
  252. package/settingSlice-Q6EKL7EQ.js +0 -204
  253. package/syncMapping-N6RGXGBW.js +0 -437
  254. package/tools-DU4JXVAV.js +0 -111
  255. package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
  256. package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
  257. package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
  258. 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-6TPOEJMQ.js";
9
+ } from "./chunk-JZX2XLKC.js";
10
10
  import {
11
11
  buildSkillDocMarkdown,
12
12
  resolvePageSkillMetadata
13
- } from "./chunk-AUDNYVRC.js";
14
- import {
15
- canonicalizeToolNames
16
- } from "./chunk-XUWRURDF.js";
13
+ } from "./chunk-XETG4RIX.js";
17
14
  import {
18
15
  nolotusId
19
- } from "./chunk-QDSINZM3.js";
16
+ } from "./chunk-GKXCHNTE.js";
17
+ import {
18
+ canonicalizeToolNames
19
+ } from "./chunk-5EBLANFT.js";
20
20
  import {
21
21
  asNonEmptyStringArray
22
- } from "./chunk-3AH7LNUB.js";
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: "\u6539\u52A8\u5B8C\u6210\u540E\u81EA\u52A8\u8D70\u5B8C\u300C\u72EC\u7ACB reviewer \u5BA1\u67E5 \u2192 \u4FEE\u590D \u2192 \u63D0\u4EA4 \u2192 \u5408\u5E76\u5230\u672C\u5730\u96C6\u6210\u5206\u652F\u300D\u3002\u5F00\u542F\u5373\u6388\u6743 review \u901A\u8FC7\u540E\u81EA\u52A8\u63D0\u4EA4\u4E0E\u672C\u5730\u5408\u5E76\uFF0C\u4F46\u7EDD\u4E0D\u81EA\u52A8 push\u3001\u4E0D\u5408\u5E76\u8FDC\u7AEF\u6216\u4E3B\u5E72\u3001\u4E0D\u53D1\u5E03\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\u4E0D\u9002\u7528\uFF1A\u53EA\u8BFB\u4EFB\u52A1\u3001\u7528\u6237\u8981\u5148\u9A8C\u6536\u6548\u679C\u7684\u6539\u52A8\uFF08\u5148\u4EA4\u4ED8\u4EA7\u7269\u7B49\u53CD\u9988\uFF09\u3002"
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\u6539\u52A8\u505A\u5B8C\u540E\uFF0C\u4E0D\u7B49\u7528\u6237\u9010\u6B65\u70B9\u5934\uFF0C\u81EA\u5DF1\u628A\u5BA1\u67E5\u3001\u63D0\u4EA4\u3001\u672C\u5730\u5408\u5E76\u8D70\u5B8C\u3002",
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
- "## \u5F00\u542F\u6761\u4EF6\u4E0E\u8FB9\u754C",
1153
- "- \u4EC5\u5728\u7528\u6237\u663E\u5F0F\u5F00\u542F\uFF08\u8BF4 auto-review / \u81EA\u52A8\u5BA1\u67E5\u5408\u5E76\uFF09\u540E\u4F7F\u7528\uFF1B\u5F00\u542F\u53EA\u6388\u6743**\u672C\u5730\u63D0\u4EA4\u4E0E\u672C\u5730\u96C6\u6210\u5206\u652F\u5408\u5E76**\u3002",
1154
- "- \u6C38\u8FDC\u9700\u8981\u5F53\u6B21\u660E\u786E\u6279\u51C6\uFF1A`git push`\u3001\u5408\u5E76\u5230\u8FDC\u7AEF\u6216\u4E3B\u5E72\u5206\u652F\u3001\u53D1\u5E03/\u90E8\u7F72\u3001\u56DE\u6EDA\u3002\u5F00\u542F\u672C skill \u4E0D\u653E\u5BBD\u8FD9\u4E9B\u3002",
1155
- "- \u9700\u8981\u7528\u6237\u4EB2\u81EA\u9A8C\u6536\u7684\u6539\u52A8\uFF08UI\u3001\u4F53\u9A8C\u7C7B\uFF09\uFF1A\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\u5E76\u505C\u4E0B\uFF0C\u7B49\u7528\u6237\u786E\u8BA4\u300C\u53EF\u4EE5\u300D\u518D\u8FDB\u5165\u4E0B\u9762\u6D41\u7A0B\u3002",
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\u5DF2\u5728\u72EC\u7ACB worktree/\u5206\u652F\u91CC\uFF08\u89C1 `worktree-isolation`\uFF09\uFF1B\u4E0D\u5728\u5C31\u5148\u5EFA\u3002",
1159
- "2. **\u6D3E reviewer**\uFF1A\u4E0E\u4F5C\u8005\u4E0D\u540C\u7684 agent \u5B9E\u4F8B\uFF0C\u53EA\u8BFB\u5BA1 diff\uFF0C\u53EA\u4F20 worktree \u8DEF\u5F84\u4E0E\u6587\u4EF6\u6E05\u5355\uFF0C\u4E0D\u5185\u5D4C diff\u3002brief \u8981\u6C42\u6700\u7EC8\u6587\u672C\u542B Verdict\uFF08APPROVE / WARNING / BLOCK\uFF09\u4E0E\u5E26\u884C\u53F7\u7684 finding\u3002",
1160
- "3. **\u5224\u5B9A**\uFF1A",
1161
- " - \u6700\u7EC8\u6587\u672C\u542B\u660E\u786E APPROVE \u4E14\u65E0 CRITICAL/HIGH \u2192 \u7EE7\u7EED\uFF1B",
1162
- " - BLOCK \u2192 \u4FEE\u590D\u540E\u590D\u5BA1\uFF0C\u5FAA\u73AF\u76F4\u5230 APPROVE\uFF1B",
1163
- " - WARNING\uFF08\u6709 HIGH\uFF09\u2192 \u505C\u4E0B\uFF0C\u628A finding \u62A5\u7ED9\u7528\u6237\u51B3\u5B9A\uFF0C\u4E0D\u81EA\u52A8\u5408\u5E76\uFF1B",
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 \u4FA7\u7684\u8D28\u91CF\u95E8\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u6D4B\u8BD5\uFF1B\u6D4B\u8BD5\u6CA1\u8DD1\u8FC7\u4E0D\u8981\u5408\u5E76\u3002",
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/systematicInvestigationSkill.ts
1266
- var SYSTEMATIC_INVESTIGATION_SKILL_SLUGS = ["systematic-investigation"];
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 buildSystematicinvestigationSkillId(slug) {
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 deterministicId9(prefix, seed) {
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 normalizeSkillSeed8(input) {
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 deterministicId9("01SK", normalizeSkillSeed8(slug) || slug);
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 \u6216\u72EC\u7ACB HTML \u6E32\u67D3\u5DE5\u4EF6\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"
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: "# 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)\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\u7B80\u62A5\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- \u5199\u5165\u6587\u4EF6\u5E76\u901A\u8FC7\u7CFB\u7EDF\u6216 Browser Connector \u6253\u5F00\u7ED9\u7528\u6237\u9884\u89C8\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**\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\u4E0E HTML Artifacts \u9884\u89C8\u3002",
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 deterministicId10(prefix, seed) {
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 normalizeSkillSeed9(input) {
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 deterministicId10("01SK", normalizeSkillSeed9(slug) || slug);
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 deterministicId11(prefix, seed) {
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 normalizeSkillSeed10(input) {
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 deterministicId11("01SK", normalizeSkillSeed10(slug) || slug);
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 deterministicId12(prefix, seed) {
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 normalizeSkillSeed11(input) {
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 deterministicId12("01SK", normalizeSkillSeed11(slug) || slug);
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
- Run (via execShell):
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 the monthly-Credit plan, metered is pay-per-token.
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 is specific** (names a model or effort): use the preset's \`models[]\` list to confirm the choice is valid, and ask for reasoning effort only among what that model supports (\`low/medium/high\` for stepfun; check \`supportsReasoningEffort\`).
1469
- - **User doesn't know / says "\u968F\u4FBF / \u4F60\u770B\u7740\u529E"**: 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.
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 Collect the API key
1569
+ ## Step 3 \u2014 Safe credential handling
1472
1570
 
1473
- Show the preset's \`keyFormatHint\` if present (it says where to get the key). Ask the user to paste their API key. Never invent one.
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 (sensitive \u2014 confirm first)
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
- CUSTOM_API_KEY='<the-key>' nolo agent create <slug> \\
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 and confirms the key works.
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 Report
1594
+ ## Step 5 \u2014 Verify behavior & report
1489
1595
 
1490
- On success report the created agentKey and model. If \`--verify\` fails, relay the endpoint's error verbatim and suggest checking the key / plan tier.
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
- - API key goes through the \`CUSTOM_API_KEY\` env var, never as a literal arg, never echoed back.
1495
- - Always show the resolved command (key masked) and get confirmation before running \u2014 creating an agent + storing a credential is a sensitive action.
1496
- - OAuth subscription presets \u2192 redirect to Nolo Desktop; do not attempt to create them via key.
1497
- - If \`nolo agent providers\` fails or the list is empty, say so and ask the user for the provider's base URL + key to build a manual custom agent instead.`
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,
@@ -1,27 +1,28 @@
1
1
  import {
2
2
  refreshSubscriptionQuotas
3
3
  } from "./chunk-U4STABYN.js";
4
+ import {
5
+ getReadableCliDb
6
+ } from "./chunk-P5QACQDK.js";
4
7
  import {
5
8
  clearCliLocalRuntimePreparedAgentCache
6
- } from "./chunk-WRMKCKZ3.js";
9
+ } from "./chunk-FJMRBOPO.js";
7
10
  import {
8
11
  readCredentialAvailability
9
- } from "./chunk-62IL3KQV.js";
10
- import {
11
- getReadableCliDb
12
- } from "./chunk-CTUQJVQM.js";
12
+ } from "./chunk-6MXDOUMH.js";
13
13
  import {
14
14
  buildCreatedAgentRecord,
15
15
  buildUpdatedAgentRecord,
16
16
  normalizeAgentRecordForOutput,
17
17
  parseAgentUpdateArgs,
18
+ refreshAgentRecordCache,
18
19
  resolveAgentRecordFromHybridStore,
19
20
  sanitizeAgentRecordForCliOutput,
20
21
  writeAgentRecord
21
- } from "./chunk-ALGORS6Y.js";
22
+ } from "./chunk-ZF6526IQ.js";
22
23
  import {
23
24
  resolveCliAgentKeyInput
24
- } from "./chunk-SV5IJK6K.js";
25
+ } from "./chunk-NBTY7YJF.js";
25
26
  import {
26
27
  toErrorMessage
27
28
  } from "./chunk-HNMXYYJR.js";
@@ -160,10 +161,10 @@ async function runAgentUpdateCommand(args, deps = {}) {
160
161
  userId,
161
162
  record: built.nextRecord
162
163
  });
163
- await db.put(built.agentKey, {
164
- ...built.nextRecord,
165
- dbKey: built.agentKey,
166
- key: built.nextRecord?.key || built.agentKey,
164
+ await refreshAgentRecordCache({
165
+ db,
166
+ agentKey: built.agentKey,
167
+ record: built.nextRecord,
167
168
  serverOrigin: built.serverUrl
168
169
  });
169
170
  clearCliLocalRuntimePreparedAgentCache();
@@ -242,16 +243,25 @@ async function runAgentCreateCommand(args, deps = {}) {
242
243
  clearCliLocalRuntimePreparedAgentCache();
243
244
  let verifyResult;
244
245
  if (parsed.verify) {
245
- const { verifyCustomProvider } = await import("./agentProviderCommands-YK2BIIXZ.js");
246
- const rec = built.nextRecord;
247
- verifyResult = await verifyCustomProvider({
248
- providerUrl: rec.customProviderUrl,
249
- apiKey: rec.apiKey,
250
- model: rec.model,
251
- prompt: parsed.verifyPrompt,
252
- fetchImpl
253
- });
246
+ try {
247
+ const { verifyCustomProvider } = await import("./agentProviderCommands-HL6MBLCL.js");
248
+ const rec = built.nextRecord;
249
+ verifyResult = await verifyCustomProvider({
250
+ providerUrl: rec.customProviderUrl,
251
+ apiKey: rec.apiKey,
252
+ model: rec.model,
253
+ prompt: parsed.verifyPrompt,
254
+ fetchImpl
255
+ });
256
+ } catch (error) {
257
+ verifyResult = {
258
+ ok: false,
259
+ reason: toErrorMessage(error)
260
+ };
261
+ }
254
262
  }
263
+ const isVerifyFailure = parsed.verify ? !verifyResult || !verifyResult.ok : false;
264
+ const verified = parsed.verify ? Boolean(verifyResult?.ok) : null;
255
265
  const apiKeyRef = String(built.updates?.apiKeyRef || "").trim();
256
266
  let authHint;
257
267
  const OAUTH_REFS = /* @__PURE__ */ new Set(["claude", "chatgpt", "xai", "antigravity", "cloudflare"]);
@@ -266,7 +276,9 @@ async function runAgentCreateCommand(args, deps = {}) {
266
276
  }
267
277
  }
268
278
  output.write(JSON.stringify({
269
- ok: true,
279
+ ok: !isVerifyFailure,
280
+ created: true,
281
+ verified,
270
282
  agentKey: built.agentKey,
271
283
  baseUrl: built.serverUrl,
272
284
  updates: sanitizeAgentRecordForCliOutput(built.updates),
@@ -280,7 +292,7 @@ async function runAgentCreateCommand(args, deps = {}) {
280
292
  errorOutput.write(`[nolo] Hint: ${authHint}
281
293
  `);
282
294
  }
283
- return 0;
295
+ return isVerifyFailure ? 2 : 0;
284
296
  } catch (error) {
285
297
  output.write(
286
298
  `[nolo] agent create failed: ${toErrorMessage(error)}