@shadowob/cloud 1.1.6-dev.311

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 (334) hide show
  1. package/README.md +509 -0
  2. package/dist/agent-browser-CERTMCDL.js +117 -0
  3. package/dist/agent-browser-CIRZRIY4.js +118 -0
  4. package/dist/agent-pack-LF3O5TR4.js +1236 -0
  5. package/dist/agent-pack-RQT27V7R.js +1235 -0
  6. package/dist/airtable-BG2Q75G2.js +82 -0
  7. package/dist/airtable-JCQXFM5D.js +83 -0
  8. package/dist/alipay-MZX2XCDB.js +52 -0
  9. package/dist/alipay-TZQI34RB.js +51 -0
  10. package/dist/amap-5RQB3VGC.js +45 -0
  11. package/dist/amap-KPCLZYYL.js +44 -0
  12. package/dist/atlassian-LGOEWYC7.js +54 -0
  13. package/dist/atlassian-TVS2A4IU.js +55 -0
  14. package/dist/baidu-appbuilder-6UMESXHW.js +41 -0
  15. package/dist/baidu-appbuilder-QRRL3ETM.js +42 -0
  16. package/dist/baidu-maps-HEPMVP5D.js +44 -0
  17. package/dist/baidu-maps-HXC4FBVP.js +45 -0
  18. package/dist/baidu-netdisk-G5Q6B5NH.js +45 -0
  19. package/dist/baidu-netdisk-RS2K5W2M.js +44 -0
  20. package/dist/baidu-smartprogram-EWTK5WKK.js +41 -0
  21. package/dist/baidu-smartprogram-JHD3XWF6.js +40 -0
  22. package/dist/browserbase-IUIYVYI7.js +67 -0
  23. package/dist/browserbase-JFO2PCIA.js +68 -0
  24. package/dist/canva-3YOFL7JS.js +62 -0
  25. package/dist/canva-FMYN65SM.js +61 -0
  26. package/dist/chunk-6P2K6QZR.js +529 -0
  27. package/dist/chunk-7VMRQ7MG.js +90 -0
  28. package/dist/chunk-AD3JTIU3.js +17 -0
  29. package/dist/chunk-BF6CV2Y4.js +64 -0
  30. package/dist/chunk-CTNUKOQE.js +439 -0
  31. package/dist/chunk-EEFMJYKB.js +97 -0
  32. package/dist/chunk-EJKFQ35I.js +739 -0
  33. package/dist/chunk-HUICDC56.js +62 -0
  34. package/dist/chunk-JUPAE5IA.js +527 -0
  35. package/dist/chunk-JY2HTT7Q.js +437 -0
  36. package/dist/chunk-KEPTCLUO.js +121 -0
  37. package/dist/chunk-KKK5H7YX.js +3622 -0
  38. package/dist/chunk-POSVEKIY.js +210 -0
  39. package/dist/chunk-QET4LT4J.js +5769 -0
  40. package/dist/chunk-QV4XWO3P.js +30 -0
  41. package/dist/chunk-R52J3PH2.js +120 -0
  42. package/dist/chunk-R5U7XKVJ.js +16 -0
  43. package/dist/chunk-RECNVWMT.js +212 -0
  44. package/dist/chunk-RTPBU5HF.js +92 -0
  45. package/dist/chunk-SUZ2ATT6.js +5774 -0
  46. package/dist/chunk-SVMXSIMG.js +98 -0
  47. package/dist/chunk-TV3CBM7R.js +28 -0
  48. package/dist/chunk-V2LU736V.js +3495 -0
  49. package/dist/chunk-ZUYL3W53.js +741 -0
  50. package/dist/claude-plugin-577TAQVS.js +1463 -0
  51. package/dist/claude-plugin-L3MXJJ6J.js +1464 -0
  52. package/dist/cli.js +7021 -0
  53. package/dist/cloudflare-HBBABPK6.js +114 -0
  54. package/dist/cloudflare-RDFPKMM5.js +115 -0
  55. package/dist/cnb-FLP3QX46.js +44 -0
  56. package/dist/cnb-YAVVEYFB.js +45 -0
  57. package/dist/console/index.html +12 -0
  58. package/dist/console/logo.png +0 -0
  59. package/dist/console/static/css/5079.f9e0918d.css +1 -0
  60. package/dist/console/static/css/index.7f91f806.css +1 -0
  61. package/dist/console/static/font/codicon.5b7d6fac.ttf +0 -0
  62. package/dist/console/static/js/5079.72a51ca2.js +699 -0
  63. package/dist/console/static/js/5079.72a51ca2.js.LICENSE.txt +35 -0
  64. package/dist/console/static/js/7426.f8d483ea.js +1 -0
  65. package/dist/console/static/js/async/1008.4df521b7.js +1 -0
  66. package/dist/console/static/js/async/102.1d473ec7.js +1 -0
  67. package/dist/console/static/js/async/1134.3f9fd9e7.js +1 -0
  68. package/dist/console/static/js/async/1318.4b8e48e7.js +1 -0
  69. package/dist/console/static/js/async/1360.5606da88.js +7 -0
  70. package/dist/console/static/js/async/1546.045f484f.js +1 -0
  71. package/dist/console/static/js/async/1562.187de2a8.js +1 -0
  72. package/dist/console/static/js/async/168.456d4813.js +1 -0
  73. package/dist/console/static/js/async/1750.e6dc2664.js +1 -0
  74. package/dist/console/static/js/async/1994.3fc86066.js +1 -0
  75. package/dist/console/static/js/async/2348.613ae3d9.js +1 -0
  76. package/dist/console/static/js/async/2390.1b890b9d.js +1 -0
  77. package/dist/console/static/js/async/2414.9d040212.js +1 -0
  78. package/dist/console/static/js/async/2454.4c1784ab.js +1 -0
  79. package/dist/console/static/js/async/2498.f5f92030.js +1 -0
  80. package/dist/console/static/js/async/2924.b823cd1a.js +1 -0
  81. package/dist/console/static/js/async/3062.63fddea6.js +1 -0
  82. package/dist/console/static/js/async/3078.dd712008.js +1 -0
  83. package/dist/console/static/js/async/3198.1f307065.js +1 -0
  84. package/dist/console/static/js/async/3246.3d5a899f.js +1 -0
  85. package/dist/console/static/js/async/3286.871676eb.js +1 -0
  86. package/dist/console/static/js/async/342.10bf3b90.js +1 -0
  87. package/dist/console/static/js/async/3446.9681a4d7.js +1 -0
  88. package/dist/console/static/js/async/3698.ccfaabec.js +1 -0
  89. package/dist/console/static/js/async/3790.2a1106a6.js +1 -0
  90. package/dist/console/static/js/async/4231.b29784d4.js +1 -0
  91. package/dist/console/static/js/async/4551.515bd41d.js +1 -0
  92. package/dist/console/static/js/async/4596.40f6e71b.js +1 -0
  93. package/dist/console/static/js/async/4600.4aaebe6d.js +1 -0
  94. package/dist/console/static/js/async/4718.1aae022f.js +1 -0
  95. package/dist/console/static/js/async/4846.a347c020.js +1 -0
  96. package/dist/console/static/js/async/4860.83dadf89.js +1 -0
  97. package/dist/console/static/js/async/500.fcfa37cb.js +1 -0
  98. package/dist/console/static/js/async/5096.b360203d.js +1 -0
  99. package/dist/console/static/js/async/5222.043274fe.js +1 -0
  100. package/dist/console/static/js/async/5362.f498001c.js +1 -0
  101. package/dist/console/static/js/async/54.c94f0755.js +1 -0
  102. package/dist/console/static/js/async/5478.50dd9ef0.js +2 -0
  103. package/dist/console/static/js/async/5478.50dd9ef0.js.LICENSE.txt +3 -0
  104. package/dist/console/static/js/async/5507.a6a1f793.js +1 -0
  105. package/dist/console/static/js/async/5638.bc6b102d.js +1 -0
  106. package/dist/console/static/js/async/5722.e0029049.js +1 -0
  107. package/dist/console/static/js/async/5942.74635c6b.js +1 -0
  108. package/dist/console/static/js/async/5994.1c5629c1.js +1 -0
  109. package/dist/console/static/js/async/6054.6bddf720.js +1 -0
  110. package/dist/console/static/js/async/6118.45e754e5.js +1 -0
  111. package/dist/console/static/js/async/6127.adcbcbb6.js +1 -0
  112. package/dist/console/static/js/async/614.3f434c20.js +1 -0
  113. package/dist/console/static/js/async/6234.ba3b002d.js +1 -0
  114. package/dist/console/static/js/async/6310.6546a9ba.js +1 -0
  115. package/dist/console/static/js/async/6378.9f805419.js +1 -0
  116. package/dist/console/static/js/async/6380.e4433c49.js +1 -0
  117. package/dist/console/static/js/async/6418.f23bcfda.js +1 -0
  118. package/dist/console/static/js/async/6428.77c86114.js +1 -0
  119. package/dist/console/static/js/async/6443.83318a6c.js +1 -0
  120. package/dist/console/static/js/async/6508.2b445d62.js +3 -0
  121. package/dist/console/static/js/async/6542.e82a26c8.js +1 -0
  122. package/dist/console/static/js/async/6544.62111ecb.js +1 -0
  123. package/dist/console/static/js/async/6612.a0c9fcf4.js +1 -0
  124. package/dist/console/static/js/async/6740.695aebf0.js +1 -0
  125. package/dist/console/static/js/async/6822.dbbb32bc.js +1 -0
  126. package/dist/console/static/js/async/6824.ad3540ab.js +1 -0
  127. package/dist/console/static/js/async/6930.585dab94.js +1 -0
  128. package/dist/console/static/js/async/6982.c81b95e6.js +1 -0
  129. package/dist/console/static/js/async/7046.ab2378c1.js +1 -0
  130. package/dist/console/static/js/async/7110.a603277f.js +1 -0
  131. package/dist/console/static/js/async/7142.4a21366f.js +1 -0
  132. package/dist/console/static/js/async/7348.15cc6148.js +1373 -0
  133. package/dist/console/static/js/async/7348.15cc6148.js.LICENSE.txt +14 -0
  134. package/dist/console/static/js/async/7374.b1ac5c44.js +1 -0
  135. package/dist/console/static/js/async/742.847f17ca.js +1 -0
  136. package/dist/console/static/js/async/7446.743954d8.js +1 -0
  137. package/dist/console/static/js/async/7673.59bbbaac.js +1 -0
  138. package/dist/console/static/js/async/7684.c5760c8c.js +1 -0
  139. package/dist/console/static/js/async/7714.c30d0f94.js +1 -0
  140. package/dist/console/static/js/async/8118.36d5a3bf.js +298 -0
  141. package/dist/console/static/js/async/8145.4bcf043a.js +1 -0
  142. package/dist/console/static/js/async/8246.408de938.js +1 -0
  143. package/dist/console/static/js/async/8390.bdae1f7d.js +1 -0
  144. package/dist/console/static/js/async/8422.fd94dbe1.js +1 -0
  145. package/dist/console/static/js/async/8434.94a0e2ae.js +1 -0
  146. package/dist/console/static/js/async/8518.3158de13.js +1 -0
  147. package/dist/console/static/js/async/8564.fc2eb841.js +1 -0
  148. package/dist/console/static/js/async/8678.73af4c9b.js +1 -0
  149. package/dist/console/static/js/async/8694.79747168.js +1 -0
  150. package/dist/console/static/js/async/8756.1de37b83.js +1 -0
  151. package/dist/console/static/js/async/8804.7fe6bdf9.js +3 -0
  152. package/dist/console/static/js/async/8883.e717ee94.js +1 -0
  153. package/dist/console/static/js/async/8886.fe6e876c.js +1 -0
  154. package/dist/console/static/js/async/9030.fc1ae402.js +1 -0
  155. package/dist/console/static/js/async/9094.5598d084.js +1 -0
  156. package/dist/console/static/js/async/9218.ee7b84b7.js +1 -0
  157. package/dist/console/static/js/async/94.9b80bc35.js +1 -0
  158. package/dist/console/static/js/async/9526.92aba34c.js +1 -0
  159. package/dist/console/static/js/async/9762.f83bc4f3.js +1 -0
  160. package/dist/console/static/js/async/984.e11c113a.js +1 -0
  161. package/dist/console/static/js/async/9846.246653cd.js +1 -0
  162. package/dist/console/static/js/index.4487e1ff.js +1 -0
  163. package/dist/console/static/js/lib-react.15d7ca9a.js +2 -0
  164. package/dist/console/static/js/lib-react.15d7ca9a.js.LICENSE.txt +49 -0
  165. package/dist/coze-C6PMDPBI.js +49 -0
  166. package/dist/coze-E6VGRNLV.js +48 -0
  167. package/dist/dashboard.command-J7XOZNXU.js +8 -0
  168. package/dist/dashboard.command-RV2NHDKW.js +7 -0
  169. package/dist/dingtalk-JNRNRN7E.js +77 -0
  170. package/dist/dingtalk-WZGGIAHJ.js +76 -0
  171. package/dist/douyin-miniprogram-AIJPPIZH.js +41 -0
  172. package/dist/douyin-miniprogram-HCYZ5NBW.js +42 -0
  173. package/dist/figma-2YYNSCDX.js +103 -0
  174. package/dist/figma-RYOBMENP.js +102 -0
  175. package/dist/firebase-2IJDDBXX.js +112 -0
  176. package/dist/firebase-OYSY6HPT.js +111 -0
  177. package/dist/firecrawl-2T3SBUW7.js +66 -0
  178. package/dist/firecrawl-IYYXLAZM.js +65 -0
  179. package/dist/flyai-7FJ4TRAG.js +81 -0
  180. package/dist/flyai-QS5Q6FJR.js +82 -0
  181. package/dist/gitagent-MWI75OIX.js +725 -0
  182. package/dist/gitagent-YBMWY7NZ.js +726 -0
  183. package/dist/gitee-3N7OFOM7.js +53 -0
  184. package/dist/gitee-KVNK6KLZ.js +54 -0
  185. package/dist/github-LUEC2LID.js +143 -0
  186. package/dist/github-XRO5Z3GC.js +142 -0
  187. package/dist/google-ads-A3QAJI4D.js +88 -0
  188. package/dist/google-ads-VPKWTX67.js +89 -0
  189. package/dist/google-analytics-C4UR5ZR2.js +50 -0
  190. package/dist/google-analytics-XDYZA2B7.js +49 -0
  191. package/dist/google-workspace-LL3EWVHH.js +320 -0
  192. package/dist/google-workspace-YX35SHHX.js +321 -0
  193. package/dist/huawei-xiaoyi-6BSMGJHR.js +40 -0
  194. package/dist/huawei-xiaoyi-KPWLTSHB.js +41 -0
  195. package/dist/hubspot-DIUHGEDI.js +45 -0
  196. package/dist/hubspot-FTIEMNZO.js +44 -0
  197. package/dist/huggingface-MJCOXA7E.js +116 -0
  198. package/dist/huggingface-UUXK2RHK.js +117 -0
  199. package/dist/index.d.ts +3013 -0
  200. package/dist/index.js +15649 -0
  201. package/dist/inference-ai-image-generation-CMI6R5T3.js +106 -0
  202. package/dist/inference-ai-image-generation-PXV6IG4U.js +107 -0
  203. package/dist/inference-sh-7AZOLEFI.js +94 -0
  204. package/dist/inference-sh-ABQOD3YF.js +95 -0
  205. package/dist/init.command-6E24K4H3.js +9 -0
  206. package/dist/init.command-O4HG4HKR.js +10 -0
  207. package/dist/klaviyo-6K5YEFNH.js +45 -0
  208. package/dist/klaviyo-LDPBWBSS.js +44 -0
  209. package/dist/kuaidi100-HGFM5VK2.js +42 -0
  210. package/dist/kuaidi100-UHPFCVXP.js +41 -0
  211. package/dist/lark-6LNA3LUQ.js +103 -0
  212. package/dist/lark-URVBZNS4.js +102 -0
  213. package/dist/linear-7QFSFPOD.js +57 -0
  214. package/dist/linear-T4ORUP7N.js +56 -0
  215. package/dist/lovart-PDUXRUHJ.js +99 -0
  216. package/dist/lovart-QO3SK55T.js +100 -0
  217. package/dist/meta-ads-SCNFI45S.js +42 -0
  218. package/dist/meta-ads-V6XPZWX3.js +41 -0
  219. package/dist/miclaw-5CNTW7VV.js +36 -0
  220. package/dist/miclaw-TPPPS2WN.js +35 -0
  221. package/dist/model-provider-AVSFJSZP.js +393 -0
  222. package/dist/model-provider-KFB76XV5.js +392 -0
  223. package/dist/notion-FZK76MN2.js +69 -0
  224. package/dist/notion-WFA7KGZZ.js +70 -0
  225. package/dist/oceanengine-3JZUS3PP.js +43 -0
  226. package/dist/oceanengine-5BRIJVJE.js +42 -0
  227. package/dist/opencli-PFXHGCS2.js +81 -0
  228. package/dist/opencli-VIGRJTGH.js +80 -0
  229. package/dist/paypal-33UADIPR.js +54 -0
  230. package/dist/paypal-Z5JYHIWD.js +55 -0
  231. package/dist/playwright-MG5WHK47.js +58 -0
  232. package/dist/playwright-SQAQ3DZG.js +59 -0
  233. package/dist/plugins-HZBWK3WQ.js +120 -0
  234. package/dist/plugins-I4GD5SZX.js +121 -0
  235. package/dist/posthog-MU5MAJOQ.js +79 -0
  236. package/dist/posthog-RJRRKDWB.js +80 -0
  237. package/dist/salesforce-34FVIJTG.js +82 -0
  238. package/dist/salesforce-3QZ6OFVO.js +83 -0
  239. package/dist/sentry-MCIRMACU.js +111 -0
  240. package/dist/sentry-PIWW46VA.js +110 -0
  241. package/dist/seo-suite-4SQ3I67Q.js +54 -0
  242. package/dist/seo-suite-WJXMA3S4.js +55 -0
  243. package/dist/serve.command-5FMIPQRY.js +10 -0
  244. package/dist/serve.command-DNE6GPMK.js +9 -0
  245. package/dist/shadowob-JELOWHWX.js +1068 -0
  246. package/dist/shadowob-PRSMI5MW.js +1069 -0
  247. package/dist/sherlock-2PKY2E2Y.js +66 -0
  248. package/dist/sherlock-C5ZWPPVT.js +67 -0
  249. package/dist/shopify-GL3NFVGE.js +94 -0
  250. package/dist/shopify-R4G3UXM6.js +93 -0
  251. package/dist/skill-discovery-7INAUP4D.js +77 -0
  252. package/dist/skill-discovery-YPXXV622.js +78 -0
  253. package/dist/state-7MCZBTR5.js +17 -0
  254. package/dist/state-FGOFLFBE.js +18 -0
  255. package/dist/stripe-C22RR4ZS.js +83 -0
  256. package/dist/stripe-LJNPQ3CQ.js +82 -0
  257. package/dist/supabase-IRNQ54FJ.js +98 -0
  258. package/dist/supabase-N4ONFJNQ.js +97 -0
  259. package/dist/taobao-aipaas-LRR4GMO3.js +45 -0
  260. package/dist/taobao-aipaas-RVKORSF4.js +46 -0
  261. package/dist/tapd-3JPVJ7XH.js +46 -0
  262. package/dist/tapd-TMQRSMFG.js +47 -0
  263. package/dist/tencent-ads-IGD33LO7.js +42 -0
  264. package/dist/tencent-ads-UHC6OPBV.js +43 -0
  265. package/dist/tencent-docs-C3A4J3CJ.js +47 -0
  266. package/dist/tencent-docs-O2SC4FHL.js +48 -0
  267. package/dist/tencent-maps-HMMWMNF4.js +37 -0
  268. package/dist/tencent-maps-OQOKHVW2.js +36 -0
  269. package/dist/vercel-KOXDDTHX.js +73 -0
  270. package/dist/vercel-OLNVDWMG.js +74 -0
  271. package/dist/webflow-FULU5Q2I.js +114 -0
  272. package/dist/webflow-OMJKZM54.js +115 -0
  273. package/dist/wechat-miniprogram-skyline-KYCDMQNW.js +74 -0
  274. package/dist/wechat-miniprogram-skyline-VR4FVIQL.js +75 -0
  275. package/dist/wechat-pay-BCMAJ6UW.js +50 -0
  276. package/dist/wechat-pay-YQQKXVUI.js +51 -0
  277. package/dist/wonda-NGWIORYN.js +81 -0
  278. package/dist/wonda-RBABXFNM.js +82 -0
  279. package/dist/wordpress-woocommerce-RDIUTHYT.js +57 -0
  280. package/dist/wordpress-woocommerce-RNA5HB3N.js +58 -0
  281. package/dist/wps-DAEFQHDE.js +47 -0
  282. package/dist/wps-LUWHMZQQ.js +48 -0
  283. package/dist/yuque-HCHTJWNI.js +72 -0
  284. package/dist/yuque-KRH5O74J.js +71 -0
  285. package/images/RUNNERS.md +270 -0
  286. package/images/cc-connect-runner/entrypoint.mjs +311 -0
  287. package/images/claude-runner/Dockerfile +88 -0
  288. package/images/claude-runner/RUNNER.md +222 -0
  289. package/images/claude-runner/entrypoint.mjs +2 -0
  290. package/images/codex-runner/Dockerfile +87 -0
  291. package/images/codex-runner/RUNNER.md +226 -0
  292. package/images/codex-runner/entrypoint.mjs +2 -0
  293. package/images/gemini-runner/Dockerfile +87 -0
  294. package/images/gemini-runner/RUNNER.md +218 -0
  295. package/images/gemini-runner/entrypoint.mjs +2 -0
  296. package/images/hermes-runner/Dockerfile +74 -0
  297. package/images/hermes-runner/RUNNER.md +243 -0
  298. package/images/hermes-runner/entrypoint.mjs +283 -0
  299. package/images/openclaw-runner/Dockerfile +212 -0
  300. package/images/openclaw-runner/RUNNER.md +170 -0
  301. package/images/openclaw-runner/entrypoint.mjs +1113 -0
  302. package/images/openclaw-runner/warm-runtime-deps.mjs +95 -0
  303. package/images/opencode-runner/Dockerfile +87 -0
  304. package/images/opencode-runner/RUNNER.md +202 -0
  305. package/images/opencode-runner/entrypoint.mjs +2 -0
  306. package/package.json +121 -0
  307. package/templates/agent-marketplace-buddy.template.json +131 -0
  308. package/templates/ai-werewolf.template.json +92 -0
  309. package/templates/bmad-method-buddy.template.json +123 -0
  310. package/templates/brain-fix.template.json +92 -0
  311. package/templates/claude-ads-buddy.template.json +123 -0
  312. package/templates/claude-financial-services-buddy.template.json +111 -0
  313. package/templates/claude-seo-buddy.template.json +123 -0
  314. package/templates/code-arena.template.json +92 -0
  315. package/templates/daily-brief.template.json +92 -0
  316. package/templates/e-wife.template.json +92 -0
  317. package/templates/everything-claude-code-buddy.template.json +125 -0
  318. package/templates/financial-freedom.template.json +92 -0
  319. package/templates/gitstory.template.json +92 -0
  320. package/templates/google-workspace-buddy.template.json +88 -0
  321. package/templates/gsd-buddy.template.json +119 -0
  322. package/templates/gstack-buddy.template.json +143 -0
  323. package/templates/gstack.template.json +92 -0
  324. package/templates/little-match-girl.template.json +114 -0
  325. package/templates/lovart-buddy.template.json +110 -0
  326. package/templates/marketingskills-buddy.template.json +102 -0
  327. package/templates/retire-buddy.template.json +92 -0
  328. package/templates/scientific-skills-buddy.template.json +119 -0
  329. package/templates/seomachine-buddy.template.json +113 -0
  330. package/templates/shadow-server-app-demo.template.json +105 -0
  331. package/templates/slavingia-skills-buddy.template.json +102 -0
  332. package/templates/superclaude-buddy.template.json +146 -0
  333. package/templates/superpowers-buddy.template.json +108 -0
  334. package/templates/world-pulse.template.json +92 -0
@@ -0,0 +1,218 @@
1
+ # Gemini Runner Research
2
+
3
+ Research date: 2026-05-14.
4
+
5
+ ## Target role
6
+
7
+ `gemini` should run through the ShadowOB `cc-connect` fork, not through OpenClaw
8
+ gateway or ACPX. The runner process should be:
9
+
10
+ ```text
11
+ cc-connect fork -> agent type "gemini" -> gemini CLI
12
+ ```
13
+
14
+ Shadow transport should come from the cc-connect ShadowOB platform.
15
+
16
+ ## Current repository state
17
+
18
+ The Gemini adapter and image now use the cc-connect fork path. The runtime
19
+ package emits `cc-connect-config.toml`, `.gemini/settings.json`, `GEMINI.md`,
20
+ workspace bootstrap files, and ShadowOB skill files through
21
+ `runtime-files.json`.
22
+
23
+ ## Native Gemini CLI configuration
24
+
25
+ Gemini CLI uses JSON settings files with explicit precedence:
26
+
27
+ | Concern | Native Gemini CLI surface |
28
+ | --- | --- |
29
+ | System defaults | System-wide defaults file. |
30
+ | User settings | `~/.gemini/settings.json`. |
31
+ | Project settings | `.gemini/settings.json` in the project root. |
32
+ | System overrides | `/etc/gemini-cli/settings.json` on Linux, platform equivalents on Windows/macOS. |
33
+ | Context files | `.gemini` project directory and `GEMINI.md` discovery, configurable via context settings. |
34
+ | Models/auth | Gemini model config, `GEMINI_API_KEY`, `GOOGLE_API_KEY`, Google auth options. |
35
+ | MCP | `mcpServers.<SERVER_NAME>` in settings. |
36
+ | Commands | Built-in slash commands and custom commands loaded from `.toml` command files. |
37
+ | Hooks | `hooksConfig` plus hook arrays such as `BeforeTool`, `AfterTool`, `BeforeAgent`, `AfterAgent`, `SessionStart`, `SessionEnd`, `BeforeModel`, and `AfterModel`. |
38
+ | Extensions | Extension install/load policy and extension settings. |
39
+ | Checkpointing | `general.checkpointing.enabled`. |
40
+ | Telemetry/logs | `telemetry.enabled`, `telemetry.target`, `telemetry.logPrompts`, `telemetry.outfile`, and debug env/flags. |
41
+
42
+ The researched Gemini CLI docs do not describe a direct `SKILL.md` skill system
43
+ like Codex, Claude Code, OpenCode, or Hermes. Treat skills as Cloud-authored
44
+ prompts/context, Gemini extensions, or custom commands until a native Gemini
45
+ skill standard exists.
46
+
47
+ ## Shadow slash command bridge
48
+
49
+ The runner package always materializes `/etc/shadowob/slash-commands.json` so
50
+ Shadow can load a stable command index. The Gemini runner owns its catalog in
51
+ `apps/cloud/src/runtimes/slash-commands/gemini.ts`; this is intentionally not a
52
+ common runtime artifact.
53
+
54
+ Official Gemini CLI slash commands researched from the reference include
55
+ `/about`, `/agents`, `/auth`, `/bug`, `/chat`, `/clear`, `/commands`,
56
+ `/compress`, `/copy`, `/directory`, `/docs`, `/editor`, `/extensions`,
57
+ `/help`, `/hooks`, `/ide`, `/init`, `/mcp`, `/memory`, `/model`,
58
+ `/permissions`, `/plan`, `/policies`, `/privacy`, `/quit`, `/restore`,
59
+ `/rewind`, `/resume`, `/settings`, `/shells`, `/setup-github`, `/skills`,
60
+ `/stats`, `/terminal-setup`, `/theme`, `/tools`, `/upgrade`, and `/vim`.
61
+
62
+ Current Cloud injection registers only names that do not collide with
63
+ cc-connect's universal bot commands. Examples include `/about`, `/agents`,
64
+ `/auth`, `/bug`, `/chat`, `/clear`, `/copy`, `/directory`, `/docs`, `/editor`,
65
+ `/extensions`, `/hooks`, `/ide`, `/init`, `/mcp`, `/permissions`, `/plan`,
66
+ `/policies`, `/privacy`, `/quit`, `/restore`, `/rewind`, `/resume`,
67
+ `/settings`, `/shells`, `/setup-github`, `/stats`, `/terminal-setup`,
68
+ `/theme`, `/tools`, and `/vim`. Overlapping names such as `/commands`,
69
+ `/compress`, `/help`, `/memory`, `/model`, `/skills`, and `/upgrade` remain
70
+ cc-connect-managed.
71
+
72
+ cc-connect local commands are prompt-backed. Native Gemini TUI passthrough and
73
+ custom TOML command discovery should be implemented inside the cc-connect Gemini
74
+ agent before Cloud treats them as exact CLI control commands.
75
+
76
+ ## Schema and type anchors
77
+
78
+ - Settings schema URL:
79
+ `https://raw.githubusercontent.com/google-gemini/gemini-cli/main/schemas/settings.schema.json`.
80
+ - Schema `$id` matches that same raw GitHub URL and uses JSON Schema draft
81
+ 2020-12.
82
+ - Type surface: JSON `settings.json`, `.gemini` project files, command TOML
83
+ files, context file settings, and extension config.
84
+ - cc-connect type anchor: `../cc-connect/agent/gemini/gemini.go`.
85
+ - Test rule: generated `.gemini/settings.json` must validate against the schema
86
+ and then survive a Gemini CLI startup smoke test.
87
+
88
+ ## Provider and authentication notes
89
+
90
+ - Gemini CLI has three primary auth families: Google login, Gemini API key, and
91
+ Vertex AI. Google login is recommended for AI Pro/Ultra subscription usage but
92
+ requires browser/localhost interaction, so it is not the default Cloud
93
+ bootstrap path.
94
+ - AI Studio API-key mode uses `GEMINI_API_KEY`. Store it as a Kubernetes Secret
95
+ and never bake it into `.gemini/settings.json`.
96
+ - Vertex AI needs `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION`, then one
97
+ of ADC, a service-account JSON key, or `GOOGLE_API_KEY`. The docs require
98
+ unsetting `GOOGLE_API_KEY`/`GEMINI_API_KEY` when using ADC/service-account
99
+ flows.
100
+ - Gemini CLI settings do not expose a generic OpenAI-compatible provider block.
101
+ A Cloud adapter that needs non-Google models must use a different runner or a
102
+ separate gateway integration instead of faking Gemini config keys.
103
+ - Headless smoke tests should assert the selected auth mode and required env
104
+ keys without making a provider call unless the test environment explicitly
105
+ supplies real credentials.
106
+
107
+ ## Security, audit, cost, network, and tools
108
+
109
+ - Approval: `general.defaultApprovalMode` supports `default`, `auto_edit`, and
110
+ `plan`; YOLO can only be enabled via CLI flags, so Cloud must not silently
111
+ encode YOLO in settings.
112
+ - Tools: `tools.exclude`, custom tool discovery/call commands, and MCP
113
+ `includeTools`/`excludeTools` define the effective tool surface.
114
+ - MCP: `mcpServers.<name>.trust = true` bypasses confirmations for that server;
115
+ do not emit it unless Cloud policy explicitly trusts the server.
116
+ - Browser/network: browser agent `allowedDomains`, sensitive action
117
+ confirmation, upload blocking, and max actions per task are the main network
118
+ controls found in the schema.
119
+ - Workspace trust: `security.folderTrust.enabled` and
120
+ `GEMINI_CLI_TRUST_THIS_FOLDER` matter for headless containers.
121
+ - Secrets: `security.environmentVariableRedaction.*` and
122
+ `advanced.excludedEnvVars` should be generated when audit policy requires
123
+ env filtering.
124
+ - Cost/audit: `model.maxSessionTurns`, `model.summarizeToolOutput.*.tokenBudget`,
125
+ telemetry `logPrompts`, telemetry target/outfile, and MCP tool count need
126
+ audit coverage.
127
+ - Logs: shell history is under `~/.gemini/tmp/<project_hash>/shell_history`;
128
+ chat/session data is under Gemini's `~/.gemini/tmp/<project_hash>/chats/`.
129
+
130
+ ## cc-connect mapping
131
+
132
+ The local fork exposes `core.RegisterAgent("gemini", New)`. Important options
133
+ from `../cc-connect/agent/gemini/gemini.go`:
134
+
135
+ - `work_dir`
136
+ - `model`
137
+ - `mode`: `default`, `auto_edit`, `yolo`, `plan`
138
+ - `cmd`
139
+ - `timeout_mins`
140
+
141
+ The fork drives Gemini CLI with prompt mode and stream JSON output. It also knows
142
+ how to list sessions from Gemini's native chat storage under
143
+ `~/.gemini/tmp/<project_hash>/chats/`.
144
+
145
+ Example generated project shape:
146
+
147
+ ```toml
148
+ [[projects]]
149
+ name = "agent-id"
150
+
151
+ [projects.agent]
152
+ type = "gemini"
153
+
154
+ [projects.agent.options]
155
+ work_dir = "/workspace"
156
+
157
+ [[projects.platforms]]
158
+ type = "shadowob"
159
+ ```
160
+
161
+ ## Capability notes
162
+
163
+ - Models: map Cloud model preferences to Gemini CLI model selection and
164
+ provider environment variables.
165
+ - Skills: no native `SKILL.md` surface was found; use `GEMINI.md`, custom
166
+ commands, and extensions for phase 1.
167
+ - MCP: write `mcpServers` in `.gemini/settings.json`.
168
+ - Cron/routine: no native CLI cron surface found in the researched config docs;
169
+ Cloud should own scheduling for phase 1.
170
+ - Hooks: write `hooksConfig` and `hooks.*` in Gemini settings.
171
+ - Subagents: Gemini settings expose agent override and hook points around agent
172
+ execution, but cc-connect currently drives the main Gemini CLI agent only.
173
+ - Logs: use Gemini telemetry local output when enabled, Gemini native chat
174
+ storage, and cc-connect daemon logs.
175
+
176
+ ## Migration implications
177
+
178
+ - OpenClaw, ACPX, and `@shadowob/openclaw-shadowob` are not used by the Gemini
179
+ runner image.
180
+ - The image embeds the cc-connect fork plus `@google/gemini-cli`.
181
+ - Generate `~/.gemini/settings.json`, project `.gemini/settings.json`,
182
+ `GEMINI.md`, custom command files, and MCP/telemetry settings as native
183
+ artifacts.
184
+ - Runtime package smoke tests verify native config/file generation; a Docker
185
+ smoke should still verify Gemini CLI startup and stream JSON through
186
+ cc-connect before publishing an image tag.
187
+
188
+ ## Adapter and smoke tests
189
+
190
+ Unit tests:
191
+
192
+ - `.gemini/settings.json` validates against the official schema.
193
+ - Approval mode, MCP trust/include/exclude, browser domain restrictions, upload
194
+ blocking, telemetry, and env redaction map correctly.
195
+ - Skills are not emitted as fake `SKILL.md` Gemini config; they are represented
196
+ as context, command, or extension artifacts.
197
+ - cc-connect TOML contains `type = "gemini"` and no OpenClaw artifacts.
198
+
199
+ Container smoke:
200
+
201
+ - `cc-connect --version` and `gemini --version` work.
202
+ - `.gemini/settings.json`, `GEMINI.md`, command files, and extension files are
203
+ materialized.
204
+ - Schema validation runs inside the container or in the package test before
205
+ image build.
206
+ - Start cc-connect with `type = "gemini"` and inspect session/log paths.
207
+ - Assert headless trust settings are explicit and no provider secret is printed.
208
+
209
+ ## Sources
210
+
211
+ - Gemini CLI configuration:
212
+ https://github.com/google-gemini/gemini-cli/blob/main/docs/reference/configuration.md
213
+ - Gemini CLI authentication:
214
+ https://google-gemini.github.io/gemini-cli/docs/get-started/authentication.html
215
+ - Gemini CLI commands:
216
+ https://github.com/google-gemini/gemini-cli/blob/main/docs/reference/commands.md
217
+ - Gemini CLI repository: https://github.com/google-gemini/gemini-cli
218
+ - cc-connect fork source: https://github.com/buggyblues/cc-connect
@@ -0,0 +1,2 @@
1
+ process.env.SHADOW_RUNNER_NAME ??= 'gemini-runner'
2
+ await import('../cc-connect-runner/entrypoint.mjs')
@@ -0,0 +1,74 @@
1
+ # syntax=docker/dockerfile:1.7
2
+
3
+ # ─── Hermes Runner ────────────────────────────────────────────────────────
4
+ # Native Hermes gateway runner with ShadowOB plugin materialized by Cloud.
5
+ #
6
+ # Build from the repository root:
7
+ # docker build -t ghcr.io/buggyblues/hermes-runner:latest \
8
+ # -f apps/cloud/images/hermes-runner/Dockerfile .
9
+ # ──────────────────────────────────────────────────────────────────────────
10
+
11
+ FROM nousresearch/hermes-agent:latest AS runner
12
+
13
+ LABEL org.opencontainers.image.source="https://github.com/nicepkg/shadow"
14
+ LABEL org.opencontainers.image.description="Shadow Cloud Hermes Runner"
15
+
16
+ ARG NODE_VERSION=22.21.1
17
+
18
+ USER root
19
+
20
+ WORKDIR /app
21
+
22
+ RUN apt-get update && \
23
+ apt-get install -y --no-install-recommends ca-certificates curl xz-utils && \
24
+ rm -rf /var/lib/apt/lists/* && \
25
+ arch="$(dpkg --print-architecture)" && \
26
+ case "$arch" in \
27
+ amd64) node_arch="x64" ;; \
28
+ arm64) node_arch="arm64" ;; \
29
+ *) echo "Unsupported architecture for Node.js: $arch" >&2; exit 1 ;; \
30
+ esac && \
31
+ curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
32
+ -o /tmp/node.tar.xz && \
33
+ tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 && \
34
+ rm -f /tmp/node.tar.xz && \
35
+ node --version
36
+
37
+ RUN npm init -y && \
38
+ npm install --no-audit --fund=false @shadowob/cli@latest @shadowob/connector@latest && \
39
+ ln -sf /opt/hermes/.venv/bin/hermes /usr/local/bin/hermes && \
40
+ ln -s /app/node_modules/.bin/shadowob /usr/local/bin/shadowob && \
41
+ ln -s /app/node_modules/.bin/shadowob-connector /usr/local/bin/shadowob-connector
42
+
43
+ RUN existing_user="$(getent passwd 1000 | cut -d: -f1 || true)" && \
44
+ if [ -n "$existing_user" ]; then \
45
+ if command -v groupmod >/dev/null 2>&1; then groupmod -n shadow "$existing_user" 2>/dev/null || true; fi; \
46
+ usermod -l shadow -d /home/shadow -m "$existing_user" 2>/dev/null || true; \
47
+ else \
48
+ groupadd -g 1000 shadow 2>/dev/null || groupadd shadow; \
49
+ useradd -u 1000 -g shadow -m -d /home/shadow -s /usr/sbin/nologin shadow; \
50
+ fi && \
51
+ mkdir -p /home/shadow/.hermes /etc/openclaw /etc/shadowob /var/log/shadowob \
52
+ /workspace /tmp/npm-cache && \
53
+ if [ ! -e /home/openclaw ]; then ln -s /home/shadow /home/openclaw; fi && \
54
+ chown -R 1000:1000 /home/shadow /etc/shadowob /var/log/shadowob \
55
+ /workspace /tmp/npm-cache /app
56
+
57
+ COPY --chown=1000:1000 apps/cloud/images/hermes-runner/entrypoint.mjs /app/entrypoint.mjs
58
+
59
+ HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \
60
+ CMD curl -f http://localhost:3100/health || exit 1
61
+
62
+ EXPOSE 3100
63
+
64
+ ENV NODE_ENV=production
65
+ ENV HOME=/home/shadow
66
+ ENV SHADOW_RUNNER_HEALTH_PORT=3100
67
+ ENV OPENCLAW_NO_RESPAWN=1
68
+ ENV HERMES_HOME=/home/shadow/.hermes
69
+ ENV npm_config_cache=/tmp/npm-cache
70
+
71
+ USER shadow
72
+
73
+ ENTRYPOINT ["tini", "--"]
74
+ CMD ["node", "/app/entrypoint.mjs"]
@@ -0,0 +1,243 @@
1
+ # Hermes Runner Research
2
+
3
+ Research date: 2026-05-14.
4
+
5
+ ## Target role
6
+
7
+ `hermes` is a new Cloud runner. It should run Hermes Agent's native gateway with
8
+ the bundled ShadowOB Hermes platform plugin, not OpenClaw and not cc-connect:
9
+
10
+ ```text
11
+ hermes gateway -> shadowob Hermes platform plugin
12
+ ```
13
+
14
+ This directory now contains the Hermes runner Dockerfile and entrypoint. The
15
+ runtime loader and package generator emit Hermes-native files through
16
+ `runtime-files.json` and keep ShadowOB token material in Kubernetes Secret data.
17
+
18
+ ## Native Hermes configuration
19
+
20
+ Hermes stores its runtime state under `~/.hermes/`:
21
+
22
+ | Concern | Native Hermes surface |
23
+ | --- | --- |
24
+ | Main config | `~/.hermes/config.yaml`. |
25
+ | Secrets | `~/.hermes/.env`. |
26
+ | Auth | `~/.hermes/auth.json`. |
27
+ | Personality | `~/.hermes/SOUL.md`. |
28
+ | Memory | `~/.hermes/memories/`. |
29
+ | Skills | `~/.hermes/skills/`, managed by Hermes skill tools. |
30
+ | Cron | `~/.hermes/cron/jobs.json` and outputs under `~/.hermes/cron/output/<job_id>/<timestamp>.md`. |
31
+ | Sessions | `~/.hermes/sessions/`. |
32
+ | Logs | `~/.hermes/logs/`, including gateway/error logs with secret redaction. |
33
+ | Plugins | `~/.hermes/plugins/` and `plugins.enabled` in config. |
34
+
35
+ Hermes supports local, Docker, SSH, Modal, Daytona, Vercel Sandbox, and
36
+ Singularity/Apptainer terminal backends. The Cloud runner should start with a
37
+ container-local backend and explicitly decide later whether to expose remote
38
+ backends.
39
+
40
+ ## Schema and type anchors
41
+
42
+ - Static JSON Schema URL: none found in the official docs.
43
+ - Runtime schema source: Hermes web dashboard docs say all config fields are
44
+ auto-discovered from `DEFAULT_CONFIG` and exposed through `GET
45
+ /api/config/schema`.
46
+ - Config type: YAML `config.yaml` plus `.env` and profile directories.
47
+ - Plugin type anchor: `packages/connector/hermes-shadowob-plugin/plugin.yaml`
48
+ and its adapter code.
49
+ - Test rule: generated `config.yaml` must parse as YAML, load through Hermes,
50
+ and, when the dashboard/API is enabled, match the runtime schema endpoint.
51
+
52
+ ## Provider and authentication notes
53
+
54
+ - Hermes requires at least one inference provider. The interactive
55
+ `hermes model` flow can configure providers, but Cloud should generate
56
+ `~/.hermes/config.yaml` and `~/.hermes/.env` directly from deployment
57
+ provider refs.
58
+ - Official provider paths include Nous Portal OAuth/subscription, Codex ChatGPT
59
+ OAuth, GitHub Copilot OAuth or tokens, Anthropic OAuth/API key/manual token,
60
+ OpenRouter, AI Gateway, z.ai/GLM, Kimi/Moonshot, and other provider-specific
61
+ API keys.
62
+ - API-key providers belong in `~/.hermes/.env`, for example
63
+ `OPENROUTER_API_KEY`, `AI_GATEWAY_API_KEY`, or provider-specific keys. The
64
+ adapter must not place raw model keys in ConfigMaps.
65
+ - Custom provider/base-url routing belongs in Hermes `model.default`,
66
+ `model.provider`, and `model.base_url` fields, plus routing/fallback config
67
+ when enabled.
68
+ - Hermes model auth and ShadowOB platform auth are separate. `SHADOW_TOKEN`
69
+ enables the messaging platform plugin; model provider keys enable inference.
70
+
71
+ ## Models, tools, and extensions
72
+
73
+ | Concern | Hermes feature |
74
+ | --- | --- |
75
+ | Models | Primary model slots plus auxiliary models for side jobs. Providers include Nous Portal, OpenRouter, OpenAI, Anthropic, Google, and OpenAI-compatible endpoints. |
76
+ | Skills | Built-in and user-created skills with progressive disclosure, skill management, and curator maintenance. |
77
+ | MCP | Hermes MCP feature with server and tool filtering. |
78
+ | Cron/routine | Native cron jobs via `/cron`, `hermes cron`, and the `cronjob` tool; jobs can attach one or more skills. |
79
+ | Hooks | Plugin lifecycle hooks such as session start/end and tool/agent lifecycle callbacks. |
80
+ | Subagents | `delegate_task`, child agents, Kanban multi-agent board, and profile/worktree patterns. |
81
+ | Logs | Native logs in `~/.hermes/logs`; cron outputs are separate durable markdown artifacts. |
82
+
83
+ ## Security, audit, cost, network, and tools
84
+
85
+ - User authorization: gateway access is deny-by-default unless allowlists,
86
+ pairing, or explicit allow-all are configured.
87
+ - Command approvals: `approvals.mode` supports `manual`, `smart`, and `off`;
88
+ `off` is equivalent to yolo and should be blocked by Cloud policy unless
89
+ explicitly requested.
90
+ - Hardline blocklist: catastrophic commands are denied even in yolo/off modes.
91
+ - Containers: Docker backend drops capabilities, sets no-new-privileges, caps
92
+ PIDs, and uses tmpfs for temp dirs; Cloud should start here for production
93
+ gateway deployments.
94
+ - Resources: container CPU, memory, disk, and persistence flags belong in
95
+ `terminal.*` config and must be auditable.
96
+ - Secrets: terminal/docker env passthrough is explicit allowlist only; credential
97
+ files are mounted read-only when declared by skills.
98
+ - MCP: Hermes filters MCP environment separately from terminal passthrough; use
99
+ MCP `env` config for MCP secrets.
100
+ - Cost/audit: native cron jobs, tool gateway use, delegate/subagent work,
101
+ auxiliary models, container resources, and logs under `~/.hermes/logs` need
102
+ Cloud audit labels.
103
+ - Network: provider endpoints, tool gateway, MCP remote endpoints, messaging
104
+ platform endpoints, and Docker/remote backend egress should be captured in the
105
+ runner package.
106
+
107
+ ## Shadow integration
108
+
109
+ The repository already includes a Hermes ShadowOB platform plugin at
110
+ `packages/connector/hermes-shadowob-plugin`. It currently supports:
111
+
112
+ - channel, direct, and thread inbound messages
113
+ - outbound text and media replies
114
+ - Socket.IO receive with REST polling fallback
115
+ - startup catch-up window
116
+ - typing/activity and heartbeat status
117
+ - dynamic channel and policy discovery through Shadow APIs
118
+ - optional slash command registration through `SHADOW_SLASH_COMMANDS_JSON`
119
+ - the runner package materializes `/etc/shadowob/slash-commands.json` from the
120
+ Hermes-owned catalog in `apps/cloud/src/runtimes/slash-commands/hermes.ts`
121
+ - interactive component metadata forwarding
122
+ - cron/send_message delivery through `SHADOW_HOME_CHANNEL`
123
+
124
+ Hermes publishes both CLI and messaging slash command surfaces. Researched CLI
125
+ commands include session commands such as `/new`, `/clear`, `/history`,
126
+ `/save`, `/retry`, `/undo`, `/compress`, `/rollback`, `/queue`, `/steer`,
127
+ `/goal`, `/resume`, `/sessions`, `/agents`, `/background`, and `/branch`;
128
+ configuration commands such as `/model`, `/codex-runtime`, `/personality`,
129
+ `/verbose`, `/fast`, `/reasoning`, `/skin`, `/statusbar`, `/voice`, `/yolo`,
130
+ `/footer`, and `/busy`; tool commands such as `/tools`, `/toolsets`,
131
+ `/browser`, `/skills`, `/cron`, `/curator`, `/kanban`, `/reload-mcp`,
132
+ `/reload-skills`, and `/plugins`; and info/exit commands such as `/usage`,
133
+ `/platforms`, `/paste`, `/copy`, `/image`, `/debug`, `/profile`, `/gquota`,
134
+ and `/quit`.
135
+
136
+ Current Cloud injection exposes the messaging-safe subset documented by Hermes:
137
+ `/new`, `/reset`, `/status`, `/stop`, `/model`, `/codex-runtime`,
138
+ `/personality`, `/fast`, `/retry`, `/undo`, `/sethome`, `/compress`, `/title`,
139
+ `/resume`, `/usage`, `/insights`, `/reasoning`, `/voice`, `/rollback`,
140
+ `/background`, `/queue`, `/steer`, `/goal`, `/footer`, `/curator`, `/kanban`,
141
+ `/reload-mcp`, `/yolo`, `/commands`, `/approve`, `/deny`, `/update`,
142
+ `/restart`, `/debug`, and `/help`. Hermes documents `/cron` as CLI-only, so it
143
+ is not registered into Shadow until the gateway supports messaging cron safely.
144
+
145
+ Example generated config:
146
+
147
+ ```yaml
148
+ plugins:
149
+ enabled:
150
+ - shadowob
151
+
152
+ platforms:
153
+ shadowob:
154
+ enabled: true
155
+ token: "${SHADOW_TOKEN}"
156
+ extra:
157
+ base_url: "${SHADOW_BASE_URL}"
158
+ mention_only: false
159
+ rest_only: false
160
+ catchup_minutes: 0
161
+ download_media: true
162
+ slash_commands: []
163
+ ```
164
+
165
+ Required environment:
166
+
167
+ ```bash
168
+ SHADOW_BASE_URL=<shadow-api-url>
169
+ SHADOW_TOKEN=...
170
+ ```
171
+
172
+ ## Capability notes
173
+
174
+ - Models: generate Hermes provider/model config natively in `config.yaml`.
175
+ - Skills: materialize Hermes skills under `~/.hermes/skills` when Cloud owns the
176
+ runner profile.
177
+ - MCP: write Hermes MCP config rather than OpenClaw or Codex MCP formats.
178
+ - Cron/routine: Hermes has the strongest native cron surface among the target
179
+ runners; keep cron jobs in Hermes native storage when the agent runtime is
180
+ Hermes.
181
+ - Hooks: expose plugin hooks through `plugins.enabled` and plugin files, not a
182
+ central OpenClaw hook adapter.
183
+ - Subagents: support Hermes delegation later as native Hermes multi-agent
184
+ features, not as OpenClaw `agents.list`.
185
+ - Logs: collect `~/.hermes/logs` and cron output directories separately.
186
+
187
+ ## Migration implications
188
+
189
+ - `hermes` is included in the `AgentRuntime` schema and runtime loader.
190
+ - `hermes-runner` installs Hermes Agent, ShadowOB CLI/connector packages, and
191
+ copies/enables the ShadowOB Hermes plugin.
192
+ - Generate `~/.hermes/config.yaml`, `.env`, `SOUL.md`, skills, MCP config, and
193
+ cron config as native artifacts.
194
+ - Keep this runner out of the cc-connect narrowed binary. Hermes already has a
195
+ native gateway/platform plugin boundary.
196
+ - Runtime package smoke tests verify Hermes config/file generation; an
197
+ end-to-end Docker smoke should still start `hermes gateway`, resolve the Buddy
198
+ id through Shadow, register slash commands, and send a DM response before
199
+ publishing an image tag.
200
+
201
+ ## Adapter and smoke tests
202
+
203
+ Unit tests:
204
+
205
+ - `config.yaml` parses and contains expected provider/model, terminal,
206
+ approvals, gateway, plugin, MCP, cron, and skill fields.
207
+ - ShadowOB plugin env/config is generated from Cloud fields without leaking
208
+ `SHADOW_TOKEN` into non-secret config.
209
+ - `approvals.mode: off`, allow-all gateway access, unrestricted env passthrough,
210
+ and persistent containers require explicit Cloud policy opt-in.
211
+ - Cron jobs use sanitized IDs and cannot write outside the Hermes cron store.
212
+
213
+ Container smoke:
214
+
215
+ - `hermes --version` works and plugin dependencies are installed.
216
+ - `hermes gateway` starts with `plugins.enabled: ["shadowob"]`.
217
+ - `~/.hermes/config.yaml`, `.env`, `SOUL.md`, `skills`, `cron`, `sessions`, and
218
+ `logs` directories are created.
219
+ - Dashboard/API schema endpoint is checked when enabled.
220
+ - Logs show plugin startup and deny/allow policy without raw Shadow token.
221
+
222
+ ## Sources
223
+
224
+ - Hermes docs index: https://hermes-agent.nousresearch.com/docs/llms.txt
225
+ - Configuration:
226
+ https://hermes-agent.nousresearch.com/docs/user-guide/configuration
227
+ - Security: https://hermes-agent.nousresearch.com/docs/user-guide/security
228
+ - Tool gateway:
229
+ https://hermes-agent.nousresearch.com/docs/user-guide/features/tool-gateway
230
+ - Configuring models:
231
+ https://hermes-agent.nousresearch.com/docs/user-guide/configuring-models
232
+ - AI providers:
233
+ https://hermes-agent.nousresearch.com/docs/integrations/providers
234
+ - Skills:
235
+ https://hermes-agent.nousresearch.com/docs/user-guide/features/skills
236
+ - MCP: https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp
237
+ - Cron: https://hermes-agent.nousresearch.com/docs/user-guide/features/cron
238
+ - Hooks: https://hermes-agent.nousresearch.com/docs/user-guide/features/hooks
239
+ - Delegation:
240
+ https://hermes-agent.nousresearch.com/docs/user-guide/features/delegation
241
+ - Sessions: https://hermes-agent.nousresearch.com/docs/user-guide/sessions
242
+ - Slash commands:
243
+ https://github.com/NousResearch/hermes-agent/blob/main/website/docs/reference/slash-commands.md