@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.
- package/README.md +509 -0
- package/dist/agent-browser-CERTMCDL.js +117 -0
- package/dist/agent-browser-CIRZRIY4.js +118 -0
- package/dist/agent-pack-LF3O5TR4.js +1236 -0
- package/dist/agent-pack-RQT27V7R.js +1235 -0
- package/dist/airtable-BG2Q75G2.js +82 -0
- package/dist/airtable-JCQXFM5D.js +83 -0
- package/dist/alipay-MZX2XCDB.js +52 -0
- package/dist/alipay-TZQI34RB.js +51 -0
- package/dist/amap-5RQB3VGC.js +45 -0
- package/dist/amap-KPCLZYYL.js +44 -0
- package/dist/atlassian-LGOEWYC7.js +54 -0
- package/dist/atlassian-TVS2A4IU.js +55 -0
- package/dist/baidu-appbuilder-6UMESXHW.js +41 -0
- package/dist/baidu-appbuilder-QRRL3ETM.js +42 -0
- package/dist/baidu-maps-HEPMVP5D.js +44 -0
- package/dist/baidu-maps-HXC4FBVP.js +45 -0
- package/dist/baidu-netdisk-G5Q6B5NH.js +45 -0
- package/dist/baidu-netdisk-RS2K5W2M.js +44 -0
- package/dist/baidu-smartprogram-EWTK5WKK.js +41 -0
- package/dist/baidu-smartprogram-JHD3XWF6.js +40 -0
- package/dist/browserbase-IUIYVYI7.js +67 -0
- package/dist/browserbase-JFO2PCIA.js +68 -0
- package/dist/canva-3YOFL7JS.js +62 -0
- package/dist/canva-FMYN65SM.js +61 -0
- package/dist/chunk-6P2K6QZR.js +529 -0
- package/dist/chunk-7VMRQ7MG.js +90 -0
- package/dist/chunk-AD3JTIU3.js +17 -0
- package/dist/chunk-BF6CV2Y4.js +64 -0
- package/dist/chunk-CTNUKOQE.js +439 -0
- package/dist/chunk-EEFMJYKB.js +97 -0
- package/dist/chunk-EJKFQ35I.js +739 -0
- package/dist/chunk-HUICDC56.js +62 -0
- package/dist/chunk-JUPAE5IA.js +527 -0
- package/dist/chunk-JY2HTT7Q.js +437 -0
- package/dist/chunk-KEPTCLUO.js +121 -0
- package/dist/chunk-KKK5H7YX.js +3622 -0
- package/dist/chunk-POSVEKIY.js +210 -0
- package/dist/chunk-QET4LT4J.js +5769 -0
- package/dist/chunk-QV4XWO3P.js +30 -0
- package/dist/chunk-R52J3PH2.js +120 -0
- package/dist/chunk-R5U7XKVJ.js +16 -0
- package/dist/chunk-RECNVWMT.js +212 -0
- package/dist/chunk-RTPBU5HF.js +92 -0
- package/dist/chunk-SUZ2ATT6.js +5774 -0
- package/dist/chunk-SVMXSIMG.js +98 -0
- package/dist/chunk-TV3CBM7R.js +28 -0
- package/dist/chunk-V2LU736V.js +3495 -0
- package/dist/chunk-ZUYL3W53.js +741 -0
- package/dist/claude-plugin-577TAQVS.js +1463 -0
- package/dist/claude-plugin-L3MXJJ6J.js +1464 -0
- package/dist/cli.js +7021 -0
- package/dist/cloudflare-HBBABPK6.js +114 -0
- package/dist/cloudflare-RDFPKMM5.js +115 -0
- package/dist/cnb-FLP3QX46.js +44 -0
- package/dist/cnb-YAVVEYFB.js +45 -0
- package/dist/console/index.html +12 -0
- package/dist/console/logo.png +0 -0
- package/dist/console/static/css/5079.f9e0918d.css +1 -0
- package/dist/console/static/css/index.7f91f806.css +1 -0
- package/dist/console/static/font/codicon.5b7d6fac.ttf +0 -0
- package/dist/console/static/js/5079.72a51ca2.js +699 -0
- package/dist/console/static/js/5079.72a51ca2.js.LICENSE.txt +35 -0
- package/dist/console/static/js/7426.f8d483ea.js +1 -0
- package/dist/console/static/js/async/1008.4df521b7.js +1 -0
- package/dist/console/static/js/async/102.1d473ec7.js +1 -0
- package/dist/console/static/js/async/1134.3f9fd9e7.js +1 -0
- package/dist/console/static/js/async/1318.4b8e48e7.js +1 -0
- package/dist/console/static/js/async/1360.5606da88.js +7 -0
- package/dist/console/static/js/async/1546.045f484f.js +1 -0
- package/dist/console/static/js/async/1562.187de2a8.js +1 -0
- package/dist/console/static/js/async/168.456d4813.js +1 -0
- package/dist/console/static/js/async/1750.e6dc2664.js +1 -0
- package/dist/console/static/js/async/1994.3fc86066.js +1 -0
- package/dist/console/static/js/async/2348.613ae3d9.js +1 -0
- package/dist/console/static/js/async/2390.1b890b9d.js +1 -0
- package/dist/console/static/js/async/2414.9d040212.js +1 -0
- package/dist/console/static/js/async/2454.4c1784ab.js +1 -0
- package/dist/console/static/js/async/2498.f5f92030.js +1 -0
- package/dist/console/static/js/async/2924.b823cd1a.js +1 -0
- package/dist/console/static/js/async/3062.63fddea6.js +1 -0
- package/dist/console/static/js/async/3078.dd712008.js +1 -0
- package/dist/console/static/js/async/3198.1f307065.js +1 -0
- package/dist/console/static/js/async/3246.3d5a899f.js +1 -0
- package/dist/console/static/js/async/3286.871676eb.js +1 -0
- package/dist/console/static/js/async/342.10bf3b90.js +1 -0
- package/dist/console/static/js/async/3446.9681a4d7.js +1 -0
- package/dist/console/static/js/async/3698.ccfaabec.js +1 -0
- package/dist/console/static/js/async/3790.2a1106a6.js +1 -0
- package/dist/console/static/js/async/4231.b29784d4.js +1 -0
- package/dist/console/static/js/async/4551.515bd41d.js +1 -0
- package/dist/console/static/js/async/4596.40f6e71b.js +1 -0
- package/dist/console/static/js/async/4600.4aaebe6d.js +1 -0
- package/dist/console/static/js/async/4718.1aae022f.js +1 -0
- package/dist/console/static/js/async/4846.a347c020.js +1 -0
- package/dist/console/static/js/async/4860.83dadf89.js +1 -0
- package/dist/console/static/js/async/500.fcfa37cb.js +1 -0
- package/dist/console/static/js/async/5096.b360203d.js +1 -0
- package/dist/console/static/js/async/5222.043274fe.js +1 -0
- package/dist/console/static/js/async/5362.f498001c.js +1 -0
- package/dist/console/static/js/async/54.c94f0755.js +1 -0
- package/dist/console/static/js/async/5478.50dd9ef0.js +2 -0
- package/dist/console/static/js/async/5478.50dd9ef0.js.LICENSE.txt +3 -0
- package/dist/console/static/js/async/5507.a6a1f793.js +1 -0
- package/dist/console/static/js/async/5638.bc6b102d.js +1 -0
- package/dist/console/static/js/async/5722.e0029049.js +1 -0
- package/dist/console/static/js/async/5942.74635c6b.js +1 -0
- package/dist/console/static/js/async/5994.1c5629c1.js +1 -0
- package/dist/console/static/js/async/6054.6bddf720.js +1 -0
- package/dist/console/static/js/async/6118.45e754e5.js +1 -0
- package/dist/console/static/js/async/6127.adcbcbb6.js +1 -0
- package/dist/console/static/js/async/614.3f434c20.js +1 -0
- package/dist/console/static/js/async/6234.ba3b002d.js +1 -0
- package/dist/console/static/js/async/6310.6546a9ba.js +1 -0
- package/dist/console/static/js/async/6378.9f805419.js +1 -0
- package/dist/console/static/js/async/6380.e4433c49.js +1 -0
- package/dist/console/static/js/async/6418.f23bcfda.js +1 -0
- package/dist/console/static/js/async/6428.77c86114.js +1 -0
- package/dist/console/static/js/async/6443.83318a6c.js +1 -0
- package/dist/console/static/js/async/6508.2b445d62.js +3 -0
- package/dist/console/static/js/async/6542.e82a26c8.js +1 -0
- package/dist/console/static/js/async/6544.62111ecb.js +1 -0
- package/dist/console/static/js/async/6612.a0c9fcf4.js +1 -0
- package/dist/console/static/js/async/6740.695aebf0.js +1 -0
- package/dist/console/static/js/async/6822.dbbb32bc.js +1 -0
- package/dist/console/static/js/async/6824.ad3540ab.js +1 -0
- package/dist/console/static/js/async/6930.585dab94.js +1 -0
- package/dist/console/static/js/async/6982.c81b95e6.js +1 -0
- package/dist/console/static/js/async/7046.ab2378c1.js +1 -0
- package/dist/console/static/js/async/7110.a603277f.js +1 -0
- package/dist/console/static/js/async/7142.4a21366f.js +1 -0
- package/dist/console/static/js/async/7348.15cc6148.js +1373 -0
- package/dist/console/static/js/async/7348.15cc6148.js.LICENSE.txt +14 -0
- package/dist/console/static/js/async/7374.b1ac5c44.js +1 -0
- package/dist/console/static/js/async/742.847f17ca.js +1 -0
- package/dist/console/static/js/async/7446.743954d8.js +1 -0
- package/dist/console/static/js/async/7673.59bbbaac.js +1 -0
- package/dist/console/static/js/async/7684.c5760c8c.js +1 -0
- package/dist/console/static/js/async/7714.c30d0f94.js +1 -0
- package/dist/console/static/js/async/8118.36d5a3bf.js +298 -0
- package/dist/console/static/js/async/8145.4bcf043a.js +1 -0
- package/dist/console/static/js/async/8246.408de938.js +1 -0
- package/dist/console/static/js/async/8390.bdae1f7d.js +1 -0
- package/dist/console/static/js/async/8422.fd94dbe1.js +1 -0
- package/dist/console/static/js/async/8434.94a0e2ae.js +1 -0
- package/dist/console/static/js/async/8518.3158de13.js +1 -0
- package/dist/console/static/js/async/8564.fc2eb841.js +1 -0
- package/dist/console/static/js/async/8678.73af4c9b.js +1 -0
- package/dist/console/static/js/async/8694.79747168.js +1 -0
- package/dist/console/static/js/async/8756.1de37b83.js +1 -0
- package/dist/console/static/js/async/8804.7fe6bdf9.js +3 -0
- package/dist/console/static/js/async/8883.e717ee94.js +1 -0
- package/dist/console/static/js/async/8886.fe6e876c.js +1 -0
- package/dist/console/static/js/async/9030.fc1ae402.js +1 -0
- package/dist/console/static/js/async/9094.5598d084.js +1 -0
- package/dist/console/static/js/async/9218.ee7b84b7.js +1 -0
- package/dist/console/static/js/async/94.9b80bc35.js +1 -0
- package/dist/console/static/js/async/9526.92aba34c.js +1 -0
- package/dist/console/static/js/async/9762.f83bc4f3.js +1 -0
- package/dist/console/static/js/async/984.e11c113a.js +1 -0
- package/dist/console/static/js/async/9846.246653cd.js +1 -0
- package/dist/console/static/js/index.4487e1ff.js +1 -0
- package/dist/console/static/js/lib-react.15d7ca9a.js +2 -0
- package/dist/console/static/js/lib-react.15d7ca9a.js.LICENSE.txt +49 -0
- package/dist/coze-C6PMDPBI.js +49 -0
- package/dist/coze-E6VGRNLV.js +48 -0
- package/dist/dashboard.command-J7XOZNXU.js +8 -0
- package/dist/dashboard.command-RV2NHDKW.js +7 -0
- package/dist/dingtalk-JNRNRN7E.js +77 -0
- package/dist/dingtalk-WZGGIAHJ.js +76 -0
- package/dist/douyin-miniprogram-AIJPPIZH.js +41 -0
- package/dist/douyin-miniprogram-HCYZ5NBW.js +42 -0
- package/dist/figma-2YYNSCDX.js +103 -0
- package/dist/figma-RYOBMENP.js +102 -0
- package/dist/firebase-2IJDDBXX.js +112 -0
- package/dist/firebase-OYSY6HPT.js +111 -0
- package/dist/firecrawl-2T3SBUW7.js +66 -0
- package/dist/firecrawl-IYYXLAZM.js +65 -0
- package/dist/flyai-7FJ4TRAG.js +81 -0
- package/dist/flyai-QS5Q6FJR.js +82 -0
- package/dist/gitagent-MWI75OIX.js +725 -0
- package/dist/gitagent-YBMWY7NZ.js +726 -0
- package/dist/gitee-3N7OFOM7.js +53 -0
- package/dist/gitee-KVNK6KLZ.js +54 -0
- package/dist/github-LUEC2LID.js +143 -0
- package/dist/github-XRO5Z3GC.js +142 -0
- package/dist/google-ads-A3QAJI4D.js +88 -0
- package/dist/google-ads-VPKWTX67.js +89 -0
- package/dist/google-analytics-C4UR5ZR2.js +50 -0
- package/dist/google-analytics-XDYZA2B7.js +49 -0
- package/dist/google-workspace-LL3EWVHH.js +320 -0
- package/dist/google-workspace-YX35SHHX.js +321 -0
- package/dist/huawei-xiaoyi-6BSMGJHR.js +40 -0
- package/dist/huawei-xiaoyi-KPWLTSHB.js +41 -0
- package/dist/hubspot-DIUHGEDI.js +45 -0
- package/dist/hubspot-FTIEMNZO.js +44 -0
- package/dist/huggingface-MJCOXA7E.js +116 -0
- package/dist/huggingface-UUXK2RHK.js +117 -0
- package/dist/index.d.ts +3013 -0
- package/dist/index.js +15649 -0
- package/dist/inference-ai-image-generation-CMI6R5T3.js +106 -0
- package/dist/inference-ai-image-generation-PXV6IG4U.js +107 -0
- package/dist/inference-sh-7AZOLEFI.js +94 -0
- package/dist/inference-sh-ABQOD3YF.js +95 -0
- package/dist/init.command-6E24K4H3.js +9 -0
- package/dist/init.command-O4HG4HKR.js +10 -0
- package/dist/klaviyo-6K5YEFNH.js +45 -0
- package/dist/klaviyo-LDPBWBSS.js +44 -0
- package/dist/kuaidi100-HGFM5VK2.js +42 -0
- package/dist/kuaidi100-UHPFCVXP.js +41 -0
- package/dist/lark-6LNA3LUQ.js +103 -0
- package/dist/lark-URVBZNS4.js +102 -0
- package/dist/linear-7QFSFPOD.js +57 -0
- package/dist/linear-T4ORUP7N.js +56 -0
- package/dist/lovart-PDUXRUHJ.js +99 -0
- package/dist/lovart-QO3SK55T.js +100 -0
- package/dist/meta-ads-SCNFI45S.js +42 -0
- package/dist/meta-ads-V6XPZWX3.js +41 -0
- package/dist/miclaw-5CNTW7VV.js +36 -0
- package/dist/miclaw-TPPPS2WN.js +35 -0
- package/dist/model-provider-AVSFJSZP.js +393 -0
- package/dist/model-provider-KFB76XV5.js +392 -0
- package/dist/notion-FZK76MN2.js +69 -0
- package/dist/notion-WFA7KGZZ.js +70 -0
- package/dist/oceanengine-3JZUS3PP.js +43 -0
- package/dist/oceanengine-5BRIJVJE.js +42 -0
- package/dist/opencli-PFXHGCS2.js +81 -0
- package/dist/opencli-VIGRJTGH.js +80 -0
- package/dist/paypal-33UADIPR.js +54 -0
- package/dist/paypal-Z5JYHIWD.js +55 -0
- package/dist/playwright-MG5WHK47.js +58 -0
- package/dist/playwright-SQAQ3DZG.js +59 -0
- package/dist/plugins-HZBWK3WQ.js +120 -0
- package/dist/plugins-I4GD5SZX.js +121 -0
- package/dist/posthog-MU5MAJOQ.js +79 -0
- package/dist/posthog-RJRRKDWB.js +80 -0
- package/dist/salesforce-34FVIJTG.js +82 -0
- package/dist/salesforce-3QZ6OFVO.js +83 -0
- package/dist/sentry-MCIRMACU.js +111 -0
- package/dist/sentry-PIWW46VA.js +110 -0
- package/dist/seo-suite-4SQ3I67Q.js +54 -0
- package/dist/seo-suite-WJXMA3S4.js +55 -0
- package/dist/serve.command-5FMIPQRY.js +10 -0
- package/dist/serve.command-DNE6GPMK.js +9 -0
- package/dist/shadowob-JELOWHWX.js +1068 -0
- package/dist/shadowob-PRSMI5MW.js +1069 -0
- package/dist/sherlock-2PKY2E2Y.js +66 -0
- package/dist/sherlock-C5ZWPPVT.js +67 -0
- package/dist/shopify-GL3NFVGE.js +94 -0
- package/dist/shopify-R4G3UXM6.js +93 -0
- package/dist/skill-discovery-7INAUP4D.js +77 -0
- package/dist/skill-discovery-YPXXV622.js +78 -0
- package/dist/state-7MCZBTR5.js +17 -0
- package/dist/state-FGOFLFBE.js +18 -0
- package/dist/stripe-C22RR4ZS.js +83 -0
- package/dist/stripe-LJNPQ3CQ.js +82 -0
- package/dist/supabase-IRNQ54FJ.js +98 -0
- package/dist/supabase-N4ONFJNQ.js +97 -0
- package/dist/taobao-aipaas-LRR4GMO3.js +45 -0
- package/dist/taobao-aipaas-RVKORSF4.js +46 -0
- package/dist/tapd-3JPVJ7XH.js +46 -0
- package/dist/tapd-TMQRSMFG.js +47 -0
- package/dist/tencent-ads-IGD33LO7.js +42 -0
- package/dist/tencent-ads-UHC6OPBV.js +43 -0
- package/dist/tencent-docs-C3A4J3CJ.js +47 -0
- package/dist/tencent-docs-O2SC4FHL.js +48 -0
- package/dist/tencent-maps-HMMWMNF4.js +37 -0
- package/dist/tencent-maps-OQOKHVW2.js +36 -0
- package/dist/vercel-KOXDDTHX.js +73 -0
- package/dist/vercel-OLNVDWMG.js +74 -0
- package/dist/webflow-FULU5Q2I.js +114 -0
- package/dist/webflow-OMJKZM54.js +115 -0
- package/dist/wechat-miniprogram-skyline-KYCDMQNW.js +74 -0
- package/dist/wechat-miniprogram-skyline-VR4FVIQL.js +75 -0
- package/dist/wechat-pay-BCMAJ6UW.js +50 -0
- package/dist/wechat-pay-YQQKXVUI.js +51 -0
- package/dist/wonda-NGWIORYN.js +81 -0
- package/dist/wonda-RBABXFNM.js +82 -0
- package/dist/wordpress-woocommerce-RDIUTHYT.js +57 -0
- package/dist/wordpress-woocommerce-RNA5HB3N.js +58 -0
- package/dist/wps-DAEFQHDE.js +47 -0
- package/dist/wps-LUWHMZQQ.js +48 -0
- package/dist/yuque-HCHTJWNI.js +72 -0
- package/dist/yuque-KRH5O74J.js +71 -0
- package/images/RUNNERS.md +270 -0
- package/images/cc-connect-runner/entrypoint.mjs +311 -0
- package/images/claude-runner/Dockerfile +88 -0
- package/images/claude-runner/RUNNER.md +222 -0
- package/images/claude-runner/entrypoint.mjs +2 -0
- package/images/codex-runner/Dockerfile +87 -0
- package/images/codex-runner/RUNNER.md +226 -0
- package/images/codex-runner/entrypoint.mjs +2 -0
- package/images/gemini-runner/Dockerfile +87 -0
- package/images/gemini-runner/RUNNER.md +218 -0
- package/images/gemini-runner/entrypoint.mjs +2 -0
- package/images/hermes-runner/Dockerfile +74 -0
- package/images/hermes-runner/RUNNER.md +243 -0
- package/images/hermes-runner/entrypoint.mjs +283 -0
- package/images/openclaw-runner/Dockerfile +212 -0
- package/images/openclaw-runner/RUNNER.md +170 -0
- package/images/openclaw-runner/entrypoint.mjs +1113 -0
- package/images/openclaw-runner/warm-runtime-deps.mjs +95 -0
- package/images/opencode-runner/Dockerfile +87 -0
- package/images/opencode-runner/RUNNER.md +202 -0
- package/images/opencode-runner/entrypoint.mjs +2 -0
- package/package.json +121 -0
- package/templates/agent-marketplace-buddy.template.json +131 -0
- package/templates/ai-werewolf.template.json +92 -0
- package/templates/bmad-method-buddy.template.json +123 -0
- package/templates/brain-fix.template.json +92 -0
- package/templates/claude-ads-buddy.template.json +123 -0
- package/templates/claude-financial-services-buddy.template.json +111 -0
- package/templates/claude-seo-buddy.template.json +123 -0
- package/templates/code-arena.template.json +92 -0
- package/templates/daily-brief.template.json +92 -0
- package/templates/e-wife.template.json +92 -0
- package/templates/everything-claude-code-buddy.template.json +125 -0
- package/templates/financial-freedom.template.json +92 -0
- package/templates/gitstory.template.json +92 -0
- package/templates/google-workspace-buddy.template.json +88 -0
- package/templates/gsd-buddy.template.json +119 -0
- package/templates/gstack-buddy.template.json +143 -0
- package/templates/gstack.template.json +92 -0
- package/templates/little-match-girl.template.json +114 -0
- package/templates/lovart-buddy.template.json +110 -0
- package/templates/marketingskills-buddy.template.json +102 -0
- package/templates/retire-buddy.template.json +92 -0
- package/templates/scientific-skills-buddy.template.json +119 -0
- package/templates/seomachine-buddy.template.json +113 -0
- package/templates/shadow-server-app-demo.template.json +105 -0
- package/templates/slavingia-skills-buddy.template.json +102 -0
- package/templates/superclaude-buddy.template.json +146 -0
- package/templates/superpowers-buddy.template.json +108 -0
- package/templates/world-pulse.template.json +92 -0
package/README.md
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
# shadowob-cloud
|
|
2
|
+
|
|
3
|
+
Deploy AI agents to Kubernetes with a single command.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
shadowob-cloud init --template gstack-buddy
|
|
7
|
+
shadowob-cloud validate
|
|
8
|
+
shadowob-cloud up
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g @shadowob/cloud
|
|
15
|
+
# or
|
|
16
|
+
pnpm add -g @shadowob/cloud
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Verify:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
shadowob-cloud --version
|
|
23
|
+
shadowob-cloud doctor # checks kubectl, docker, pulumi
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Getting Started
|
|
27
|
+
|
|
28
|
+
### 1. Create a config
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
shadowob-cloud init # interactive — creates shadowob-cloud.json
|
|
32
|
+
shadowob-cloud init --template gstack-buddy # from a preset template
|
|
33
|
+
shadowob-cloud init --list # list all available templates
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Set API keys
|
|
37
|
+
|
|
38
|
+
Templates use `${env:VAR_NAME}` to reference secrets. Set the required keys before deploying:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
42
|
+
export OPENAI_API_KEY="sk-..."
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. Validate
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
shadowob-cloud validate # schema + security + template ref checks
|
|
49
|
+
shadowob-cloud validate --strict # also fails on unresolvable env vars
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 4. Deploy
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
shadowob-cloud up # deploy to your current kubectl context
|
|
56
|
+
shadowob-cloud up --local # spin up a local Kind cluster first
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 5. Monitor
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
shadowob-cloud status # deployments & pods overview
|
|
63
|
+
shadowob-cloud logs <agent-id> # stream agent logs
|
|
64
|
+
shadowob-cloud dashboard # open the web dashboard
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 6. Manage
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
shadowob-cloud scale <agent-id> --replicas 3
|
|
71
|
+
shadowob-cloud down # tear down all resources
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Templates
|
|
75
|
+
|
|
76
|
+
Pre-built agent team templates:
|
|
77
|
+
|
|
78
|
+
| Template | Agents | Description |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `gstack-buddy` | 1 | Product strategy, office hours, CEO review, retros |
|
|
81
|
+
| `google-workspace-buddy` | 1 | Gmail, Calendar, Drive, Docs, and Sheets operations through `gws` |
|
|
82
|
+
| `superpowers-buddy` | 1 | Specs, TDD, planning, subagent execution, code review |
|
|
83
|
+
| `everything-claude-code-buddy` | 1 | Broad engineering harness with skills, commands, agents, hooks |
|
|
84
|
+
| `marketingskills-buddy` | 1 | CRO, copy, SEO, paid, email, and growth skills |
|
|
85
|
+
| `seomachine-buddy` | 1 | Keyword research, content briefs, on-page audits |
|
|
86
|
+
| `scientific-skills-buddy` | 1 | Scientific research, data analysis, and writing skills |
|
|
87
|
+
|
|
88
|
+
Write your own — see [Config Reference](#config-reference) below.
|
|
89
|
+
|
|
90
|
+
## CLI Commands
|
|
91
|
+
|
|
92
|
+
| Command | Description |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `shadowob-cloud init` | Generate an `shadowob-cloud.json` config |
|
|
95
|
+
| `shadowob-cloud validate` | Validate config (schema, security, refs) |
|
|
96
|
+
| `shadowob-cloud up` | Deploy agents to Kubernetes |
|
|
97
|
+
| `shadowob-cloud down` | Destroy all deployed resources |
|
|
98
|
+
| `shadowob-cloud status` | Show deployment & pod status |
|
|
99
|
+
| `shadowob-cloud logs <id>` | Stream agent logs |
|
|
100
|
+
| `shadowob-cloud scale <id>` | Scale agent replicas |
|
|
101
|
+
| `shadowob-cloud dashboard` | Open web dashboard |
|
|
102
|
+
| `shadowob-cloud serve` | Start API server + dashboard |
|
|
103
|
+
| `shadowob-cloud generate manifests` | Export K8s manifests (offline) |
|
|
104
|
+
| `shadowob-cloud generate openclaw-config` | Export OpenClaw configs (debug) |
|
|
105
|
+
| `shadowob-cloud doctor` | Check prerequisites |
|
|
106
|
+
| `shadowob-cloud build` | Build Docker images for Git agents |
|
|
107
|
+
| `shadowob-cloud images` | Manage runner images |
|
|
108
|
+
| `shadowob-cloud cluster init` | Bootstrap k3s on bare servers |
|
|
109
|
+
| `shadowob-cloud cluster import` | Register an existing kubeconfig locally |
|
|
110
|
+
| `shadowob-cloud cluster status` | Check SSH + k3s health on all nodes |
|
|
111
|
+
| `shadowob-cloud cluster list` | List all registered clusters |
|
|
112
|
+
| `shadowob-cloud cluster kubeconfig <name>` | Print kubeconfig path |
|
|
113
|
+
| `shadowob-cloud cluster destroy` | Uninstall k3s and remove local files |
|
|
114
|
+
|
|
115
|
+
## Bare-Server Cluster Management
|
|
116
|
+
|
|
117
|
+
Deploy to cloud servers (Ubuntu/Debian) over SSH with a single command — no existing K8s required.
|
|
118
|
+
|
|
119
|
+
### How it works
|
|
120
|
+
|
|
121
|
+
1. `cluster init` — SSH into each server, install k3s, form the cluster, store kubeconfig at `~/.shadow-cloud/clusters/<name>.yaml`
|
|
122
|
+
2. `up --cluster <name>` — Pulumi uses the stored kubeconfig to deploy agents to that cluster
|
|
123
|
+
|
|
124
|
+
### 1. Write a cluster.json
|
|
125
|
+
|
|
126
|
+
```jsonc
|
|
127
|
+
{
|
|
128
|
+
"name": "prod",
|
|
129
|
+
"install": {
|
|
130
|
+
"k3sVersion": "v1.35.4+k3s1",
|
|
131
|
+
"k3sMirror": "cn",
|
|
132
|
+
"systemDefaultRegistry": "registry.cn-hangzhou.aliyuncs.com",
|
|
133
|
+
"pauseImage": "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
|
|
134
|
+
},
|
|
135
|
+
"nodes": [
|
|
136
|
+
{
|
|
137
|
+
"role": "master",
|
|
138
|
+
"host": "1.2.3.4",
|
|
139
|
+
"user": "root",
|
|
140
|
+
"sshKeyPath": "~/.ssh/id_rsa"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"role": "worker",
|
|
144
|
+
"host": "1.2.3.5",
|
|
145
|
+
"user": "root",
|
|
146
|
+
"password": "${env:SERVER_PASSWORD}"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Credentials never stored on disk — use `${env:VAR}` for passwords.
|
|
153
|
+
|
|
154
|
+
`install` is optional. Use it when a server cannot reliably reach GitHub releases, or when you need
|
|
155
|
+
repeatable cluster builds:
|
|
156
|
+
|
|
157
|
+
| Field | Meaning |
|
|
158
|
+
| --- | --- |
|
|
159
|
+
| `k3sVersion` | Pins the k3s release. With Rancher's China mirror, `v1.35.4+k3s1` is normalized to the mirror's `v1.35.4-k3s1` path. |
|
|
160
|
+
| `k3sMirror` | Shortcut mirror name. `cn` maps to `https://rancher-mirror.rancher.cn/k3s`. |
|
|
161
|
+
| `k3sArtifactUrl` | Full artifact URL prefix passed to `INSTALL_K3S_ARTIFACT_URL`. |
|
|
162
|
+
| `k3sChannel` / `k3sChannelUrl` | Channel lookup settings for the official installer when not pinning a version. |
|
|
163
|
+
| `systemDefaultRegistry` | Registry prefix passed as `--system-default-registry` for bundled k3s system images. If omitted with `k3sMirror: "cn"`, Shadow uses `registry.cn-hangzhou.aliyuncs.com`. |
|
|
164
|
+
| `pauseImage` | k3s sandbox pause image passed as `--pause-image`. If omitted with `k3sMirror: "cn"`, Shadow uses `registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6` so Pod sandbox creation does not depend on Docker Hub. |
|
|
165
|
+
|
|
166
|
+
Environment variables override the same installer settings:
|
|
167
|
+
`INSTALL_K3S_VERSION`, `INSTALL_K3S_ARTIFACT_URL`, `INSTALL_K3S_CHANNEL`, and
|
|
168
|
+
`INSTALL_K3S_CHANNEL_URL`. `INSTALL_K3S_MIRROR=cn` is also accepted for local testing.
|
|
169
|
+
Use `INSTALL_K3S_PAUSE_IMAGE` or `K3S_PAUSE_IMAGE` to override the pause image, and
|
|
170
|
+
`INSTALL_K3S_SYSTEM_DEFAULT_REGISTRY` or `K3S_SYSTEM_DEFAULT_REGISTRY` to override the system image
|
|
171
|
+
registry.
|
|
172
|
+
|
|
173
|
+
### 2. Bootstrap k3s
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
shadowob-cloud cluster init # default: reads cluster.json
|
|
177
|
+
shadowob-cloud cluster init --config my-cluster.json
|
|
178
|
+
shadowob-cloud cluster init --force # reinstall k3s even if already present
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Re-initializing safely:** If k3s is already installed on a node, `init` skips that node by default. Pass `--force` to fully reinstall (uninstalls first, then reinstalls).
|
|
182
|
+
|
|
183
|
+
### 3. Deploy agents
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
shadowob-cloud up --cluster prod
|
|
187
|
+
shadowob-cloud up --cluster prod --stack prod # use a named Pulumi stack
|
|
188
|
+
shadowob-cloud up --cluster prod --skip-provision # skip Shadow resource provisioning
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 4. Manage the cluster
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
shadowob-cloud cluster status # SSH health + k3s version on each node
|
|
195
|
+
shadowob-cloud cluster list # list all registered clusters
|
|
196
|
+
shadowob-cloud cluster kubeconfig prod # print kubeconfig path (use with kubectl)
|
|
197
|
+
|
|
198
|
+
export KUBECONFIG=$(shadowob-cloud cluster kubeconfig prod)
|
|
199
|
+
kubectl get pods -n my-team
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 5. Share cluster access across machines
|
|
203
|
+
|
|
204
|
+
Another developer on a different machine can register the same cluster without running `init` again:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# On any machine that has the kubeconfig file:
|
|
208
|
+
shadowob-cloud cluster import --name prod --file ./prod.yaml
|
|
209
|
+
shadowob-cloud up --cluster prod
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 6. Tear down
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
shadowob-cloud cluster destroy # confirms prompt
|
|
216
|
+
shadowob-cloud cluster destroy --yes # skip confirmation
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Runs `k3s-uninstall.sh` (master) and `k3s-agent-uninstall.sh` (workers) over SSH, then removes `~/.shadow-cloud/clusters/prod.*`.
|
|
220
|
+
|
|
221
|
+
## Use `cluster.json` With Web SaaS
|
|
222
|
+
|
|
223
|
+
The Web SaaS UI in `apps/web` deploys through `apps/server`. By default, those deployments use the
|
|
224
|
+
server process's ambient Kubernetes target (`KUBECONFIG`). You can now point the server at the same
|
|
225
|
+
`cluster.json` used by the CLI:
|
|
226
|
+
|
|
227
|
+
1. Bootstrap or register the cluster:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
shadowob-cloud cluster init --config cluster.json
|
|
231
|
+
# or, if another machine already bootstrapped it:
|
|
232
|
+
shadowob-cloud cluster import --name prod --file ./prod.yaml
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2. Configure the server environment:
|
|
236
|
+
|
|
237
|
+
```env
|
|
238
|
+
CLOUD_SAAS_CLUSTER_CONFIG_HOST_PATH=/absolute/host/path/to/cluster.json
|
|
239
|
+
CLOUD_SAAS_CLUSTER_CONFIG=/app/cluster.json
|
|
240
|
+
CLOUD_SAAS_CLUSTER_KUBECONFIG_HOST_PATH=/absolute/host/path/to/prod.yaml
|
|
241
|
+
CLOUD_SAAS_CLUSTER_KUBECONFIG=/home/node/.shadow-cloud/clusters/prod.yaml
|
|
242
|
+
CLOUD_SAAS_WORKLOAD_BACKEND=deployment
|
|
243
|
+
SHADOW_AGENT_SERVER_URL=https://shadow.example.com
|
|
244
|
+
PULUMI_CONFIG_PASSPHRASE=change-me
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
On startup, `apps/server` reads `CLOUD_SAAS_CLUSTER_CONFIG`, resolves the cluster name to the stored
|
|
248
|
+
kubeconfig, sets `KUBECONFIG` for the embedded Cloud deployment processor, and fails fast if the
|
|
249
|
+
kubeconfig is missing.
|
|
250
|
+
|
|
251
|
+
This config controls where the server deploys workloads. If a template's agent needs Kubernetes
|
|
252
|
+
access at runtime, still provide `KUBECONFIG_B64` through the Cloud SaaS env var flow.
|
|
253
|
+
|
|
254
|
+
`CLOUD_SAAS_WORKLOAD_BACKEND=deployment` is the safe default for vanilla k3s clusters created from
|
|
255
|
+
`cluster.json`. Use `agent-sandbox` only on clusters where the `SandboxTemplate`/`SandboxClaim` CRDs
|
|
256
|
+
and controller are already installed.
|
|
257
|
+
|
|
258
|
+
For Docker Compose, mount both files into the server container:
|
|
259
|
+
|
|
260
|
+
```yaml
|
|
261
|
+
services:
|
|
262
|
+
server:
|
|
263
|
+
environment:
|
|
264
|
+
CLOUD_SAAS_CLUSTER_CONFIG: /app/cluster.json
|
|
265
|
+
CLOUD_SAAS_CLUSTER_KUBECONFIG: /home/node/.shadow-cloud/clusters/prod.yaml
|
|
266
|
+
CLOUD_SAAS_WORKLOAD_BACKEND: deployment
|
|
267
|
+
volumes:
|
|
268
|
+
- ./cluster.json:/app/cluster.json:ro
|
|
269
|
+
- ~/.shadow-cloud/clusters/prod.yaml:/home/node/.shadow-cloud/clusters/prod.yaml:ro
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Then start the product stack and deploy from Web at `/app/cloud`.
|
|
273
|
+
|
|
274
|
+
## Dashboard
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
shadowob-cloud dashboard # builds (if needed) and opens the web UI
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Pages:** Templates (browse & one-click deploy), Overview (deployment status), Settings (API keys & cluster config). Deploy progress is streamed in real-time via SSE.
|
|
281
|
+
|
|
282
|
+
## Config Reference
|
|
283
|
+
|
|
284
|
+
### File structure
|
|
285
|
+
|
|
286
|
+
```jsonc
|
|
287
|
+
{
|
|
288
|
+
"version": "1",
|
|
289
|
+
"name": "My Agent Team",
|
|
290
|
+
"description": "What this team does",
|
|
291
|
+
|
|
292
|
+
// Shadow server/channel/buddy config
|
|
293
|
+
"plugins": {
|
|
294
|
+
"shadowob": {
|
|
295
|
+
"servers": [{ "id": "srv1", "name": "Server" }],
|
|
296
|
+
"buddies": [{ "id": "bot1", "name": "Bot" }],
|
|
297
|
+
"bindings": [{
|
|
298
|
+
"targetId": "bot1",
|
|
299
|
+
"targetType": "buddy",
|
|
300
|
+
"servers": ["srv1"],
|
|
301
|
+
"channels": ["ch1"],
|
|
302
|
+
"agentId": "my-agent"
|
|
303
|
+
}]
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
// AI provider registry
|
|
308
|
+
"registry": {
|
|
309
|
+
"providers": [{
|
|
310
|
+
"id": "anthropic",
|
|
311
|
+
"api": "anthropic",
|
|
312
|
+
"baseUrl": "https://api.anthropic.com",
|
|
313
|
+
"apiKey": "${env:ANTHROPIC_API_KEY}",
|
|
314
|
+
"models": [{ "id": "claude-sonnet-4-5" }]
|
|
315
|
+
}],
|
|
316
|
+
"configurations": [{
|
|
317
|
+
"id": "base",
|
|
318
|
+
"openclaw": { "tools": [{ "name": "search", "enabled": true }] }
|
|
319
|
+
}]
|
|
320
|
+
},
|
|
321
|
+
|
|
322
|
+
// Agent deployments
|
|
323
|
+
"deployments": {
|
|
324
|
+
"namespace": "my-team",
|
|
325
|
+
"agents": [{
|
|
326
|
+
"id": "my-agent",
|
|
327
|
+
"runtime": "openclaw",
|
|
328
|
+
"identity": {
|
|
329
|
+
"name": "Agent Name",
|
|
330
|
+
"systemPrompt": "You are a helpful agent."
|
|
331
|
+
},
|
|
332
|
+
"configuration": { "extends": "base" },
|
|
333
|
+
"resources": {
|
|
334
|
+
"requests": { "cpu": "100m", "memory": "256Mi" },
|
|
335
|
+
"limits": { "cpu": "500m", "memory": "512Mi" }
|
|
336
|
+
}
|
|
337
|
+
}]
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Template variables
|
|
343
|
+
|
|
344
|
+
| Syntax | Description |
|
|
345
|
+
|---|---|
|
|
346
|
+
| `${env:VAR_NAME}` | Environment variable |
|
|
347
|
+
| `${secret:k8s/secret-name/key}` | Kubernetes Secret reference |
|
|
348
|
+
|
|
349
|
+
### API type normalization
|
|
350
|
+
|
|
351
|
+
| Config value | Normalized to |
|
|
352
|
+
|---|---|
|
|
353
|
+
| `anthropic` | `anthropic-messages` |
|
|
354
|
+
| `openai` | `openai-completions` |
|
|
355
|
+
| `google` | `google-generative-ai` |
|
|
356
|
+
| `bedrock` | `bedrock-converse-stream` |
|
|
357
|
+
|
|
358
|
+
### Configuration inheritance
|
|
359
|
+
|
|
360
|
+
```jsonc
|
|
361
|
+
{
|
|
362
|
+
"configuration": {
|
|
363
|
+
"extends": "base", // inherits from registry.configurations[id="base"]
|
|
364
|
+
"openclaw": { // deep-merged (arrays replaced, not appended)
|
|
365
|
+
"tools": [{ "name": "extra-tool", "enabled": true }]
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Managed Agents Features
|
|
372
|
+
|
|
373
|
+
### Vault — per-agent secret isolation
|
|
374
|
+
|
|
375
|
+
Each agent can reference a named vault, generating isolated K8s Secrets:
|
|
376
|
+
|
|
377
|
+
```jsonc
|
|
378
|
+
{
|
|
379
|
+
"vaults": {
|
|
380
|
+
"default": {
|
|
381
|
+
"providers": { "anthropic": { "apiKey": "${env:ANTHROPIC_API_KEY}" } },
|
|
382
|
+
"secrets": { "github-token": "${env:GITHUB_TOKEN}" }
|
|
383
|
+
},
|
|
384
|
+
"restricted": {
|
|
385
|
+
"providers": { "anthropic": { "apiKey": "${env:RESTRICTED_KEY}" } }
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"deployments": {
|
|
389
|
+
"agents": [
|
|
390
|
+
{ "id": "main-agent", "vault": "default", ... },
|
|
391
|
+
{ "id": "sandboxed", "vault": "restricted", ... }
|
|
392
|
+
]
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Per-tool permission policies
|
|
398
|
+
|
|
399
|
+
Control which tools auto-execute vs. require human approval:
|
|
400
|
+
|
|
401
|
+
```jsonc
|
|
402
|
+
{
|
|
403
|
+
"permissions": {
|
|
404
|
+
"default": "approve-reads",
|
|
405
|
+
"tools": {
|
|
406
|
+
"bash": "always-ask",
|
|
407
|
+
"web-fetch": "always-allow",
|
|
408
|
+
"mcp-*": "always-ask"
|
|
409
|
+
},
|
|
410
|
+
"nonInteractive": "deny"
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Levels: `always-allow` | `approve-reads` | `always-ask` | `deny-all`
|
|
416
|
+
|
|
417
|
+
### Per-agent networking
|
|
418
|
+
|
|
419
|
+
Each agent gets its own K8s NetworkPolicy:
|
|
420
|
+
|
|
421
|
+
```jsonc
|
|
422
|
+
{
|
|
423
|
+
"networking": {
|
|
424
|
+
"type": "limited", // "unrestricted" | "limited" | "deny-all"
|
|
425
|
+
"allowedHosts": ["api.anthropic.com"],
|
|
426
|
+
"allowMcpServers": true,
|
|
427
|
+
"allowPackageManagers": false
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Agent versioning
|
|
433
|
+
|
|
434
|
+
Version annotations on K8s Deployments for rollback tracking:
|
|
435
|
+
|
|
436
|
+
```jsonc
|
|
437
|
+
{
|
|
438
|
+
"id": "my-agent",
|
|
439
|
+
"version": "1.2.0",
|
|
440
|
+
"changelog": "Added web search tool"
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
Generates: `shadowob-cloud/agent-version`, `shadowob-cloud/deployed-at`, `shadowob-cloud/changelog` annotations.
|
|
445
|
+
|
|
446
|
+
## Security
|
|
447
|
+
|
|
448
|
+
All pods are hardened by default:
|
|
449
|
+
|
|
450
|
+
- **Non-root** — `runAsUser: 1000`, `runAsNonRoot: true`
|
|
451
|
+
- **Read-only rootfs** — writable only in `/tmp`, `/home/node/.openclaw`, `/var/log/openclaw`
|
|
452
|
+
- **Dropped capabilities** — `drop: ["ALL"]`, no privilege escalation
|
|
453
|
+
- **Seccomp** — `RuntimeDefault` profile
|
|
454
|
+
- **NetworkPolicy** — per-agent deny-all ingress with explicit allow rules
|
|
455
|
+
- **Inline key detection** — `shadowob-cloud validate` rejects configs with hardcoded API keys
|
|
456
|
+
|
|
457
|
+
## Architecture
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
┌──────────────────────────────────────┐
|
|
461
|
+
│ Interface Layer │
|
|
462
|
+
│ ┌──────────┐ ┌──────────────┐ │
|
|
463
|
+
│ │ CLI │ │ HTTP/REST │ │
|
|
464
|
+
│ │ commands │ │ + Dashboard │ │
|
|
465
|
+
│ └────┬─────┘ └──────┬───────┘ │
|
|
466
|
+
└────────┼─────────────────┼──────────┘
|
|
467
|
+
│ │
|
|
468
|
+
┌────────▼─────────────────▼──────────┐
|
|
469
|
+
│ Service Layer (IoC) │
|
|
470
|
+
│ ┌────────┐ ┌──────────┐ ┌───────┐ │
|
|
471
|
+
│ │ Config │ │ Manifest │ │Deploy │ │
|
|
472
|
+
│ │Service │ │ Service │ │Service│ │
|
|
473
|
+
│ ├────────┤ ├──────────┤ ├───────┤ │
|
|
474
|
+
│ │Provis- │ │ Template │ │ K8s │ │
|
|
475
|
+
│ │ioning │ │ Service │ │Service│ │
|
|
476
|
+
│ └────────┘ └──────────┘ └───────┘ │
|
|
477
|
+
└─────────────────────────────────────┘
|
|
478
|
+
│
|
|
479
|
+
┌───────────────▼─────────────────────┐
|
|
480
|
+
│ Core Modules │
|
|
481
|
+
│ config/ infra/ runtimes/ utils/ │
|
|
482
|
+
└─────────────────────────────────────┘
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
The service layer can be used as a programmatic SDK:
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
import { createContainer } from '@shadowob/cloud'
|
|
489
|
+
|
|
490
|
+
const container = createContainer()
|
|
491
|
+
const config = container.config.parseFile('shadowob-cloud.json')
|
|
492
|
+
const resolved = container.config.resolve(config)
|
|
493
|
+
const manifests = container.manifest.build({ config: resolved, namespace: 'shadowob-cloud' })
|
|
494
|
+
await container.deploy.up({ filePath: 'shadowob-cloud.json' })
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Development
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
pnpm install
|
|
501
|
+
pnpm --filter @shadowob/cloud build # build CLI
|
|
502
|
+
pnpm --filter @shadowob/cloud console:build # build dashboard
|
|
503
|
+
pnpm --filter @shadowob/cloud test # unit tests
|
|
504
|
+
pnpm --filter @shadowob/cloud test:e2e:cli # CLI E2E tests
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
## License
|
|
508
|
+
|
|
509
|
+
See [LICENSE](../../LICENSE).
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import {
|
|
2
|
+
attachConnectorRuntimeAssets,
|
|
3
|
+
connectorField,
|
|
4
|
+
connectorManifest,
|
|
5
|
+
installedCheck,
|
|
6
|
+
npmGlobalDependency
|
|
7
|
+
} from "./chunk-EEFMJYKB.js";
|
|
8
|
+
import "./chunk-POSVEKIY.js";
|
|
9
|
+
import {
|
|
10
|
+
defineConnectorPlugin
|
|
11
|
+
} from "./chunk-JY2HTT7Q.js";
|
|
12
|
+
import "./chunk-R5U7XKVJ.js";
|
|
13
|
+
|
|
14
|
+
// src/plugins/agent-browser/index.ts
|
|
15
|
+
var manifest = connectorManifest({
|
|
16
|
+
id: "agent-browser",
|
|
17
|
+
name: "Agent Browser",
|
|
18
|
+
description: "Agent Browser gives Buddies a browser automation CLI for QA, login flows, screenshots, scraping, visual checks, Electron apps, Slack automation, and remote browser sessions.",
|
|
19
|
+
category: "automation",
|
|
20
|
+
icon: "mouse-pointer-click",
|
|
21
|
+
website: "https://skills.sh/vercel-labs/agent-browser/agent-browser",
|
|
22
|
+
docs: "https://github.com/vercel-labs/agent-browser",
|
|
23
|
+
fields: [
|
|
24
|
+
connectorField("AGENT_BROWSER_PROVIDER", "Browser provider", {
|
|
25
|
+
description: "Optional remote browser provider.",
|
|
26
|
+
required: false,
|
|
27
|
+
sensitive: false,
|
|
28
|
+
placeholder: "browserless, browserbase, browseruse, kernel, agentcore"
|
|
29
|
+
}),
|
|
30
|
+
connectorField("BROWSERLESS_API_KEY", "Browserless API key", {
|
|
31
|
+
description: "Optional Browserless API key.",
|
|
32
|
+
required: false,
|
|
33
|
+
placeholder: "Browserless API key",
|
|
34
|
+
helpUrl: "https://browserless.io"
|
|
35
|
+
}),
|
|
36
|
+
connectorField("BROWSERBASE_API_KEY", "Browserbase API key", {
|
|
37
|
+
description: "Optional Browserbase API key.",
|
|
38
|
+
required: false,
|
|
39
|
+
placeholder: "Browserbase API key",
|
|
40
|
+
helpUrl: "https://browserbase.com"
|
|
41
|
+
}),
|
|
42
|
+
connectorField("BROWSER_USE_API_KEY", "Browser Use API key", {
|
|
43
|
+
description: "Optional Browser Use Cloud API key.",
|
|
44
|
+
required: false,
|
|
45
|
+
placeholder: "Browser Use API key",
|
|
46
|
+
helpUrl: "https://cloud.browser-use.com/settings?tab=api-keys"
|
|
47
|
+
}),
|
|
48
|
+
connectorField("KERNEL_API_KEY", "Kernel API key", {
|
|
49
|
+
description: "Optional Kernel API key.",
|
|
50
|
+
required: false,
|
|
51
|
+
placeholder: "Kernel API key",
|
|
52
|
+
helpUrl: "https://dashboard.onkernel.com"
|
|
53
|
+
}),
|
|
54
|
+
connectorField("AGENT_BROWSER_STORAGE_STATE_JSON", "Browser storage state", {
|
|
55
|
+
description: "Optional Playwright storageState JSON for reusing browser cookies and localStorage.",
|
|
56
|
+
required: false,
|
|
57
|
+
placeholder: '{"cookies":[],"origins":[]}'
|
|
58
|
+
})
|
|
59
|
+
],
|
|
60
|
+
authType: "api-key",
|
|
61
|
+
capabilities: ["tool", "data-source", "action", "cli"],
|
|
62
|
+
tags: ["browser", "automation", "qa", "scraping", "screenshots", "electron", "slack", "skills"],
|
|
63
|
+
popularity: 90
|
|
64
|
+
});
|
|
65
|
+
var runtimeDependencies = [
|
|
66
|
+
npmGlobalDependency("agent-browser", ["agent-browser"], "Agent Browser automation CLI")
|
|
67
|
+
];
|
|
68
|
+
var skillSources = [
|
|
69
|
+
{
|
|
70
|
+
id: "agent-browser-skill",
|
|
71
|
+
kind: "git",
|
|
72
|
+
url: "https://github.com/vercel-labs/agent-browser.git",
|
|
73
|
+
ref: "main",
|
|
74
|
+
from: "skills",
|
|
75
|
+
targetPath: "/workspace/.agents/plugin-skills/agent-browser",
|
|
76
|
+
include: ["agent-browser"],
|
|
77
|
+
description: "Agent Browser skill stub and runtime workflow loader"
|
|
78
|
+
}
|
|
79
|
+
];
|
|
80
|
+
var plugin = defineConnectorPlugin(manifest, {
|
|
81
|
+
cli: [
|
|
82
|
+
{
|
|
83
|
+
name: "agent-browser",
|
|
84
|
+
command: "agent-browser",
|
|
85
|
+
description: "Browser automation CLI for web, Electron, Slack, QA, and scraping workflows"
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
runtimeDependencies,
|
|
89
|
+
skillSources,
|
|
90
|
+
verificationChecks: [
|
|
91
|
+
installedCheck("agent-browser-installed", "Agent Browser CLI installed", [
|
|
92
|
+
"agent-browser",
|
|
93
|
+
"--version"
|
|
94
|
+
]),
|
|
95
|
+
{
|
|
96
|
+
id: "agent-browser-skill-mounted",
|
|
97
|
+
label: "Agent Browser skill mounted",
|
|
98
|
+
kind: "command",
|
|
99
|
+
command: [
|
|
100
|
+
"test",
|
|
101
|
+
"-f",
|
|
102
|
+
"/workspace/.agents/plugin-skills/agent-browser/agent-browser/SKILL.md"
|
|
103
|
+
],
|
|
104
|
+
timeoutMs: 5e3,
|
|
105
|
+
risk: "safe"
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
prompt: "Use Agent Browser for browser automation, QA, screenshots, scraping, login flows, console/network checks, visual diffs, Electron apps, Slack automation, and remote browser sessions. Confirm actions before submitting forms, making purchases, posting messages, or changing account state."
|
|
109
|
+
});
|
|
110
|
+
var agent_browser_default = attachConnectorRuntimeAssets(plugin, {
|
|
111
|
+
runtimeDependencies,
|
|
112
|
+
skillSources,
|
|
113
|
+
skillsMountPath: "/workspace/.agents/plugin-skills/agent-browser"
|
|
114
|
+
});
|
|
115
|
+
export {
|
|
116
|
+
agent_browser_default as default
|
|
117
|
+
};
|