superacli 1.1.22 → 1.1.26
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/.beads/.br_history/{issues.20260427_104638_898729442.jsonl → issues.20260427_114912_061702372.jsonl} +65 -65
- package/.beads/.br_history/{issues.20260427_104638_209211116.jsonl → issues.20260427_115013_063113906.jsonl} +66 -66
- package/.beads/.br_history/{issues.20260427_104637_752744777.jsonl → issues.20260427_115114_208497343.jsonl} +67 -67
- package/.beads/.br_history/{issues.20260427_104615_669652069.jsonl → issues.20260427_115215_176080241.jsonl} +68 -68
- package/.beads/.br_history/issues.20260427_115316_481573328.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115335_866978652.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115436_866087391.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115538_016094860.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115638_932947449.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115739_982932603.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115840_963681039.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115941_912431509.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120043_043356448.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120144_955596968.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120246_060733977.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120307_717985017.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120408_871846736.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121003_963750732.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121006_018509431.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121019_617062931.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121021_689536311.jsonl +261 -0
- package/.beads/.br_history/issues.20260428_172005_240631447.jsonl +261 -0
- package/.beads/.br_history/issues.20260430_073641_144807989.jsonl +262 -0
- package/.beads/.br_history/issues.20260430_073642_807075699.jsonl +263 -0
- package/.beads/.br_history/issues.20260430_073645_625754223.jsonl +264 -0
- package/.beads/.br_history/issues.20260430_090639_154646058.jsonl +265 -0
- package/.beads/.br_history/issues.20260430_090640_350560318.jsonl +266 -0
- package/.beads/.br_history/issues.20260430_090641_509319001.jsonl +267 -0
- package/.beads/.br_history/issues.20260430_095140_396749398.jsonl +268 -0
- package/.beads/.br_history/issues.20260501_230041_334056077.jsonl +269 -0
- package/.beads/.br_recovery/beads.db-wal.20260427_121006_010373120.rebuild-failed +0 -0
- package/.beads/.br_recovery/beads.db.20260427_121006_010373120.rebuild-failed +0 -0
- package/.beads/beads.db.corrupted +0 -0
- package/.beads/issues.jsonl +46 -37
- package/.supercli/adapters/test-cli-adapter.js +19 -0
- package/cli/adapters/mcp.js +89 -3
- package/cli/adapters/openapi.js +71 -2
- package/cli/config.js +69 -1
- package/cli/daemon.js +349 -0
- package/cli/plugins-manager.js +41 -1
- package/cli/server-command.js +174 -4
- package/cli/supercli.js +35 -15
- package/docs/changelog-2026-04.html +6 -0
- package/docs/index.html +95 -8
- package/docs/plugins.html +30 -0
- package/docs/server.md +80 -0
- package/graphify-out/GRAPH_REPORT.md +140 -128
- package/graphify-out/cache/036077d325d5aa25fc6ad7f01ca32721b02e3f981231f67fb22f59380063572b.json +1 -0
- package/graphify-out/cache/11938479cfbdb8e52bf5f0f3c132d56204245ebb19aefe89bb0394feb36dbd5e.json +1 -0
- package/graphify-out/cache/141362b25039dee7a4959ef475befea0a25671aae66f3d14917e711e597ffbf6.json +1 -0
- package/graphify-out/cache/362adb1b6b483f56d09feaf652f4122366e568aaede752f48383b76d61f5d9d6.json +1 -0
- package/graphify-out/cache/42bc8f64d69d2cd9ecf64e92e38f89f7ea479f69c947de5984919e2fd5a716ee.json +1 -0
- package/graphify-out/cache/4b5cffce31d9193b7d0a8f15e8a41c66f6733a6490ebaeff2c8ca19701c72c0e.json +1 -0
- package/graphify-out/cache/5262fb95a8855fc90efbfff767eb3aacca82c4da5799605a969554580a255404.json +1 -0
- package/graphify-out/cache/5ef4e31750d9e7bc4ff4a7b535f247d9ab5ab9627d72e20794779ec4be424c66.json +1 -0
- package/graphify-out/cache/68e2b11c95ede4f05b88d001040008cb3ac72d7bd27f351497c87e128fb3b221.json +1 -0
- package/graphify-out/cache/6d5023ecffa52382d31152c8c06e86e286789228a3d4f7fde72087f3eafa11bc.json +1 -0
- package/graphify-out/cache/6e5776e123142a78f50fa0bfd5ae2d289282051a9b392ae507de7aa9017f95d4.json +1 -0
- package/graphify-out/cache/75982dc60fa7353600ca48a3b33f5ba497eea9d5743daac6e61e9cf4f64774be.json +1 -0
- package/graphify-out/cache/7796066b51d3a99071debdfb5f40c854400b5bf3aa7c1e83dd6ae88eddca0370.json +1 -0
- package/graphify-out/cache/8308aa47b396b929d5b896051ca91422afdde4861108d6f18f5094901093df79.json +1 -0
- package/graphify-out/cache/8ccd3b557a1ea98005fba84433f160ccd4a951fbdb6a4c9b7d7ba894f905b06b.json +1 -0
- package/graphify-out/cache/90ab53b8f1f3306e7c3a1f92ec628717ea90f4e684db764f7d7aa8e884fe2cae.json +1 -0
- package/graphify-out/cache/9832101a7622924f58b9e7d7752b41518049447171f7955e4c50dfd386574e12.json +1 -0
- package/graphify-out/cache/9fa6604cc820f3857c55c753ca0024788e4cbb61c4e12ba7ce0e4a1ce4ee0655.json +1 -0
- package/graphify-out/cache/a1e24a07beede2876e688cdb6c14e2d24abb22064862a6420cac321efabd3efd.json +1 -0
- package/graphify-out/cache/a418312f2805259c33007a18b36b6ae3b6a4da376ccae6006a3b9999262495db.json +1 -0
- package/graphify-out/cache/a6d9c029bd31a99b67357291305e27b01c5ef388925f7f2a6e985fec4efa8024.json +1 -0
- package/graphify-out/cache/a6ed52b709dd79f98adf72c483e8dfb6098203d7327470b82feb5e11390a5cf4.json +1 -0
- package/graphify-out/cache/b045ae4443d972ee8f47b91a0d61c984a190195b38ae1d331430b4c51c43acfd.json +1 -0
- package/graphify-out/cache/b849fb88344c2f88f3d22e42b67516e071c7d1e65f77f4ca23f25af6edfca3b3.json +1 -0
- package/graphify-out/cache/bc514f4074f89d2f7e7834670602e50bba0f24b8cd8c9d21ff4d361d3fd4d558.json +1 -0
- package/graphify-out/cache/be3fc87936f9f24d2d4f4b22b9d2a16f33f538cef1a181663120e23ecf16b81a.json +1 -0
- package/graphify-out/cache/c5a4822edbe3a95a56f9f943eed1567e5a5c913d59b1fa3df4ad54ffd9b02697.json +1 -0
- package/graphify-out/cache/cf411f1ddde50ee97c1c501f59ed7985bcdc022134574816bcce37ac20848e64.json +1 -0
- package/graphify-out/cache/d88625b5813742ca941ce8155cb77afb02425632002f621aca34f217440a392d.json +1 -0
- package/graphify-out/cache/da97fdc8af2a3306c292921110f84648bba2b0e85d27473b460b0e8a862ff225.json +1 -0
- package/graphify-out/cache/e88de9f1ae117f26fd217c3717eff7e525a284cc942b5f4d26ef2c4d65db59bd.json +1 -0
- package/graphify-out/cache/ebf6bd96ef2d8d396389ac7199e6ba818ee2d0c5dfc131fab7cdece9fb710f11.json +1 -0
- package/graphify-out/cache/f2a302550a6fe0649d36b8ef0b04b77673bca9f115732af8ae89751944dc9cc6.json +1 -0
- package/graphify-out/cache/f9ee11f4395cb41b6f6900079cb7e94297c89b1b0b4798398d2f7a2e244c683b.json +1 -0
- package/graphify-out/cache/fb46bd3ef530273918fc8915842453f21b418d536653d3b705b75b417255c246.json +1 -0
- package/graphify-out/cache/fcfdab94fe91af1f21fcefdba5a96674b9a16bb768288f3573fe68765163c765.json +1 -0
- package/graphify-out/graph.json +2420 -1157
- package/package.json +1 -1
- package/plugins/bluebuild/install-guidance.json +11 -0
- package/plugins/bluebuild/meta.json +5 -0
- package/plugins/bluebuild/plugin.json +99 -0
- package/plugins/bluebuild/skills/quickstart/SKILL.md +47 -0
- package/plugins/cargo-public-api/install-guidance.json +11 -0
- package/plugins/cargo-public-api/meta.json +5 -0
- package/plugins/cargo-public-api/plugin.json +88 -0
- package/plugins/cargo-public-api/skills/quickstart/SKILL.md +51 -0
- package/plugins/context-mode/plugin.json +10 -0
- package/plugins/context-mode/scripts/post-install.js +1 -1
- package/plugins/csview/install-guidance.json +11 -0
- package/plugins/csview/meta.json +5 -0
- package/plugins/csview/plugin.json +67 -0
- package/plugins/csview/skills/quickstart/SKILL.md +51 -0
- package/plugins/cymbal/install-guidance.json +11 -0
- package/plugins/cymbal/meta.json +5 -0
- package/plugins/cymbal/plugin.json +121 -0
- package/plugins/cymbal/skills/quickstart/SKILL.md +54 -0
- package/plugins/difftastic/install-guidance.json +11 -0
- package/plugins/difftastic/meta.json +5 -0
- package/plugins/difftastic/plugin.json +87 -0
- package/plugins/difftastic/skills/quickstart/SKILL.md +53 -0
- package/plugins/dlm/install-guidance.json +11 -0
- package/plugins/dlm/meta.json +5 -0
- package/plugins/dlm/plugin.json +85 -0
- package/plugins/dlm/skills/quickstart/SKILL.md +49 -0
- package/plugins/dofigen/install-guidance.json +11 -0
- package/plugins/dofigen/meta.json +5 -0
- package/plugins/dofigen/plugin.json +84 -0
- package/plugins/dofigen/skills/quickstart/SKILL.md +50 -0
- package/plugins/example-server-resources/meta.json +11 -0
- package/plugins/example-server-resources/plugin.json +46 -0
- package/plugins/http-nu/install-guidance.json +11 -0
- package/plugins/http-nu/meta.json +5 -0
- package/plugins/http-nu/plugin.json +84 -0
- package/plugins/http-nu/skills/quickstart/SKILL.md +52 -0
- package/plugins/hwatch/install-guidance.json +11 -0
- package/plugins/hwatch/meta.json +5 -0
- package/plugins/hwatch/plugin.json +100 -0
- package/plugins/hwatch/skills/quickstart/SKILL.md +54 -0
- package/plugins/hyperfine/install-guidance.json +3 -3
- package/plugins/hyperfine/meta.json +2 -2
- package/plugins/hyperfine/plugin.json +39 -16
- package/plugins/hyperfine/skills/quickstart/SKILL.md +33 -61
- package/plugins/json5/install-guidance.json +12 -0
- package/plugins/json5/meta.json +5 -0
- package/plugins/json5/plugin.json +88 -0
- package/plugins/json5/skills/quickstart/SKILL.md +55 -0
- package/plugins/mdsf/install-guidance.json +11 -0
- package/plugins/mdsf/meta.json +5 -0
- package/plugins/mdsf/plugin.json +101 -0
- package/plugins/mdsf/skills/quickstart/SKILL.md +55 -0
- package/plugins/oha/install-guidance.json +11 -0
- package/plugins/oha/meta.json +5 -0
- package/plugins/oha/plugin.json +67 -0
- package/plugins/oha/skills/quickstart/SKILL.md +44 -0
- package/plugins/pv-migrate/install-guidance.json +11 -0
- package/plugins/pv-migrate/meta.json +5 -0
- package/plugins/pv-migrate/plugin.json +102 -0
- package/plugins/pv-migrate/skills/quickstart/SKILL.md +58 -0
- package/plugins/rash/install-guidance.json +11 -0
- package/plugins/rash/meta.json +5 -0
- package/plugins/rash/plugin.json +85 -0
- package/plugins/rash/skills/quickstart/SKILL.md +46 -0
- package/plugins/rsonpath/install-guidance.json +11 -0
- package/plugins/rsonpath/meta.json +5 -0
- package/plugins/rsonpath/plugin.json +87 -0
- package/plugins/rsonpath/skills/quickstart/SKILL.md +44 -0
- package/plugins/rsql/install-guidance.json +11 -0
- package/plugins/rsql/meta.json +5 -0
- package/plugins/rsql/plugin.json +84 -0
- package/plugins/rsql/skills/quickstart/SKILL.md +52 -0
- package/plugins/temporal/install-guidance.json +11 -0
- package/plugins/temporal/meta.json +5 -0
- package/plugins/temporal/plugin.json +95 -0
- package/plugins/temporal/skills/quickstart/SKILL.md +49 -0
- package/plugins/tkn/install-guidance.json +11 -0
- package/plugins/tkn/meta.json +5 -0
- package/plugins/tkn/plugin.json +98 -0
- package/plugins/tkn/skills/quickstart/SKILL.md +50 -0
- package/plugins/toml2json/install-guidance.json +11 -0
- package/plugins/toml2json/meta.json +5 -0
- package/plugins/toml2json/plugin.json +85 -0
- package/plugins/toml2json/skills/quickstart/SKILL.md +47 -0
- package/plugins/worktrunk/install-guidance.json +11 -0
- package/plugins/worktrunk/meta.json +5 -0
- package/plugins/worktrunk/plugin.json +116 -0
- package/plugins/worktrunk/skills/quickstart/SKILL.md +62 -0
- package/server/app.js +46 -13
- package/server/middleware/auth.js +70 -0
- package/server/routes/adapters.js +3 -11
- package/server/routes/clients.js +46 -0
- package/server/routes/docs.js +10 -0
- package/server/routes/jobs.js +3 -2
- package/server/routes/mcp.js +1 -0
- package/server/routes/plugins.js +109 -26
- package/server/routes/settings.js +93 -0
- package/server/routes/specs.js +8 -3
- package/server/services/adaptersService.js +1 -0
- package/server/services/pluginResourceService.js +262 -0
- package/server/services/pluginsService.js +24 -0
- package/server/uploads/superbackend-openapi.json +47 -0
- package/server/uploads/test-auth-openapi.json +74 -0
- package/server/uploads/test-auth-spec.json +36 -0
- package/server/views/adapters.ejs +1 -0
- package/server/views/api-keys.ejs +147 -0
- package/server/views/clients.ejs +82 -0
- package/server/views/docs.ejs +7 -0
- package/server/views/jobs.ejs +26 -2
- package/server/views/layout.ejs +35 -21
- package/server/views/mcp.ejs +278 -21
- package/server/views/partials/head.ejs +4 -0
- package/server/views/plugins.ejs +33 -32
- package/server/views/settings.ejs +99 -0
- package/server/views/specs.ejs +217 -22
- package/.beads/.br_history/issues.20260427_103259_082222986.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103400_358332602.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103419_681839669.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103522_226669683.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103623_568379011.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103724_772051154.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103825_935228905.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_103927_159626780.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104028_436388960.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104129_670562810.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104230_885162615.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104332_071213892.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104349_051129644.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104450_358444507.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104555_654123963.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104559_805009051.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104600_255068030.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104600_717042012.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104601_215845416.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104601_899140331.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104606_172300551.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104606_658098709.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104607_085798670.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104607_627598880.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104608_071298223.jsonl +0 -261
- package/.beads/.br_history/issues.20260427_104615_198124329.jsonl +0 -261
- package/scripts/post-tweet-issues.js +0 -161
- /package/.beads/.br_history/{issues.20260427_103259_082222986.jsonl.meta.json → issues.20260427_114912_061702372.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103400_358332602.jsonl.meta.json → issues.20260427_115013_063113906.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103419_681839669.jsonl.meta.json → issues.20260427_115114_208497343.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103522_226669683.jsonl.meta.json → issues.20260427_115215_176080241.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103623_568379011.jsonl.meta.json → issues.20260427_115316_481573328.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103724_772051154.jsonl.meta.json → issues.20260427_115335_866978652.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103825_935228905.jsonl.meta.json → issues.20260427_115436_866087391.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_103927_159626780.jsonl.meta.json → issues.20260427_115538_016094860.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104028_436388960.jsonl.meta.json → issues.20260427_115638_932947449.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104129_670562810.jsonl.meta.json → issues.20260427_115739_982932603.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104230_885162615.jsonl.meta.json → issues.20260427_115840_963681039.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104332_071213892.jsonl.meta.json → issues.20260427_115941_912431509.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104349_051129644.jsonl.meta.json → issues.20260427_120043_043356448.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104450_358444507.jsonl.meta.json → issues.20260427_120144_955596968.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104555_654123963.jsonl.meta.json → issues.20260427_120246_060733977.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104559_805009051.jsonl.meta.json → issues.20260427_120307_717985017.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104600_255068030.jsonl.meta.json → issues.20260427_120408_871846736.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104600_717042012.jsonl.meta.json → issues.20260427_121003_963750732.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104601_215845416.jsonl.meta.json → issues.20260427_121006_018509431.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104601_899140331.jsonl.meta.json → issues.20260427_121019_617062931.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104606_172300551.jsonl.meta.json → issues.20260427_121021_689536311.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104606_658098709.jsonl.meta.json → issues.20260428_172005_240631447.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104607_085798670.jsonl.meta.json → issues.20260430_073641_144807989.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104607_627598880.jsonl.meta.json → issues.20260430_073642_807075699.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104608_071298223.jsonl.meta.json → issues.20260430_073645_625754223.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104615_198124329.jsonl.meta.json → issues.20260430_090639_154646058.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104615_669652069.jsonl.meta.json → issues.20260430_090640_350560318.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104637_752744777.jsonl.meta.json → issues.20260430_090641_509319001.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104638_209211116.jsonl.meta.json → issues.20260430_095140_396749398.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260427_104638_898729442.jsonl.meta.json → issues.20260501_230041_334056077.jsonl.meta.json} +0 -0
package/cli/plugins-manager.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const fs = require("fs")
|
|
2
2
|
const path = require("path")
|
|
3
|
-
const os = require("os")
|
|
4
3
|
const { spawnSync } = require("child_process")
|
|
5
4
|
const { SUPPORTED_ADAPTERS } = require("./adapter-schema")
|
|
6
5
|
const { getRegistryPlugin } = require("./plugins-registry")
|
|
7
6
|
const { getPluginInstallGuidance } = require("./plugin-install-guidance")
|
|
7
|
+
const { syncClientPluginResources } = require("./config")
|
|
8
8
|
const {
|
|
9
9
|
readPluginsLock,
|
|
10
10
|
writePluginsLock,
|
|
@@ -78,6 +78,36 @@ function parseManifestFile(manifestPath) {
|
|
|
78
78
|
recoverable: false
|
|
79
79
|
})
|
|
80
80
|
}
|
|
81
|
+
|
|
82
|
+
// Validate server_resources if present
|
|
83
|
+
if (raw.server_resources) {
|
|
84
|
+
if (typeof raw.server_resources !== "object" || Array.isArray(raw.server_resources)) {
|
|
85
|
+
throw Object.assign(new Error("Invalid plugin manifest: server_resources must be an object"), {
|
|
86
|
+
code: 85,
|
|
87
|
+
type: "invalid_argument",
|
|
88
|
+
recoverable: false
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Validate mcp resources
|
|
93
|
+
if (raw.server_resources.mcp && !Array.isArray(raw.server_resources.mcp)) {
|
|
94
|
+
throw Object.assign(new Error("Invalid plugin manifest: server_resources.mcp must be an array"), {
|
|
95
|
+
code: 85,
|
|
96
|
+
type: "invalid_argument",
|
|
97
|
+
recoverable: false
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Validate spec resources
|
|
102
|
+
if (raw.server_resources.specs && !Array.isArray(raw.server_resources.specs)) {
|
|
103
|
+
throw Object.assign(new Error("Invalid plugin manifest: server_resources.specs must be an array"), {
|
|
104
|
+
code: 85,
|
|
105
|
+
type: "invalid_argument",
|
|
106
|
+
recoverable: false
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
81
111
|
return raw
|
|
82
112
|
}
|
|
83
113
|
|
|
@@ -504,6 +534,7 @@ function installPlugin(ref, options = {}) {
|
|
|
504
534
|
installed_at: new Date().toISOString(),
|
|
505
535
|
commands: installedCommands,
|
|
506
536
|
checks: manifest.checks || [],
|
|
537
|
+
server_resources: manifest.server_resources || {},
|
|
507
538
|
lifecycle_hooks: {
|
|
508
539
|
post_uninstall: serializeHook(loaded.manifestPath, manifest.post_uninstall, "post_uninstall")
|
|
509
540
|
}
|
|
@@ -511,6 +542,15 @@ function installPlugin(ref, options = {}) {
|
|
|
511
542
|
|
|
512
543
|
const postInstall = runPostInstall(manifest, loaded.manifestPath)
|
|
513
544
|
writePluginsLock(lock)
|
|
545
|
+
|
|
546
|
+
// Sync client plugin resources to server if SUPERCLI_SERVER is set (fire and forget)
|
|
547
|
+
const server = process.env.SUPERCLI_SERVER
|
|
548
|
+
if (server && manifest.server_resources) {
|
|
549
|
+
syncClientPluginResources(server).catch(err => {
|
|
550
|
+
console.warn(`[Plugin ${manifest.name}] Failed to sync resources to server:`, err.message)
|
|
551
|
+
})
|
|
552
|
+
}
|
|
553
|
+
|
|
514
554
|
return {
|
|
515
555
|
plugin: manifest.name,
|
|
516
556
|
version: manifest.version || "0.0.0",
|
package/cli/server-command.js
CHANGED
|
@@ -2,6 +2,7 @@ const fs = require("fs")
|
|
|
2
2
|
const path = require("path")
|
|
3
3
|
|
|
4
4
|
const SERVER = process.env.SUPERCLI_SERVER
|
|
5
|
+
const API_KEY = process.env.SUPERCLI_API_KEY
|
|
5
6
|
|
|
6
7
|
function getServerUrl() {
|
|
7
8
|
return SERVER ? SERVER.replace(/\/$/, "") : null
|
|
@@ -13,12 +14,17 @@ async function serverFetch(endpoint, options = {}) {
|
|
|
13
14
|
throw new Error("SUPERCLI_SERVER not set. Set it to your server URL.")
|
|
14
15
|
}
|
|
15
16
|
const url = `${base}${endpoint}`
|
|
17
|
+
const headers = {
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
"Accept": "application/json",
|
|
20
|
+
...options.headers,
|
|
21
|
+
}
|
|
22
|
+
if (API_KEY) {
|
|
23
|
+
headers["X-API-Key"] = API_KEY
|
|
24
|
+
}
|
|
16
25
|
const res = await fetch(url, {
|
|
17
26
|
...options,
|
|
18
|
-
headers
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...options.headers,
|
|
21
|
-
},
|
|
27
|
+
headers,
|
|
22
28
|
})
|
|
23
29
|
if (!res.ok) {
|
|
24
30
|
const text = await res.text()
|
|
@@ -76,6 +82,8 @@ async function handleServerCommand(options) {
|
|
|
76
82
|
return await handleOpenapi({ action, arg, flags, humanMode, output })
|
|
77
83
|
case "jobs":
|
|
78
84
|
return await handleJobs({ action, flags, humanMode, output, outputHumanTable })
|
|
85
|
+
case "adapters":
|
|
86
|
+
return await handleAdapters({ action, arg, flags, humanMode, output, outputHumanTable, positional })
|
|
79
87
|
default:
|
|
80
88
|
outputError({ code: 85, type: "invalid_argument", message: `Unknown server resource: ${resource}`, recoverable: false })
|
|
81
89
|
return true
|
|
@@ -392,4 +400,166 @@ async function handleJobs({ action, flags, humanMode, output, outputHumanTable }
|
|
|
392
400
|
throw new Error(`Unknown jobs action: ${action}. Use: list, prune`)
|
|
393
401
|
}
|
|
394
402
|
|
|
403
|
+
async function handleAdapters({ action, arg, flags, humanMode, output, outputHumanTable, positional }) {
|
|
404
|
+
if (action === "list") {
|
|
405
|
+
const data = await serverFetch("/api/adapters?format=json")
|
|
406
|
+
if (humanMode) {
|
|
407
|
+
console.log("\n ⚡ Adapters\n")
|
|
408
|
+
outputHumanTable(data.adapters, [
|
|
409
|
+
{ key: "name", label: "Name" },
|
|
410
|
+
{ key: "execution_context", label: "Context" },
|
|
411
|
+
{ key: "timeout_ms", label: "Timeout" },
|
|
412
|
+
{ key: "allow_network", label: "Network" },
|
|
413
|
+
])
|
|
414
|
+
console.log("")
|
|
415
|
+
} else {
|
|
416
|
+
output(data)
|
|
417
|
+
}
|
|
418
|
+
return true
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (action === "add") {
|
|
422
|
+
let payload
|
|
423
|
+
const jsonPath = flags["from-file"]
|
|
424
|
+
const sourcePath = flags["source-file"]
|
|
425
|
+
const jsonData = positional[3]
|
|
426
|
+
|
|
427
|
+
if (jsonPath) {
|
|
428
|
+
payload = readJsonFile(jsonPath)
|
|
429
|
+
if (sourcePath) {
|
|
430
|
+
payload.source = fs.readFileSync(path.resolve(sourcePath), "utf-8")
|
|
431
|
+
}
|
|
432
|
+
} else if (sourcePath) {
|
|
433
|
+
if (!jsonData) {
|
|
434
|
+
throw new Error("Usage: supercli server adapters add '{metadata}' --source-file <path>")
|
|
435
|
+
}
|
|
436
|
+
payload = JSON.parse(jsonData)
|
|
437
|
+
payload.source = fs.readFileSync(path.resolve(sourcePath), "utf-8")
|
|
438
|
+
} else if (flags["from-stdin"]) {
|
|
439
|
+
let stdinData = ""
|
|
440
|
+
for await (const chunk of process.stdin) {
|
|
441
|
+
stdinData += chunk
|
|
442
|
+
}
|
|
443
|
+
payload = JSON.parse(stdinData)
|
|
444
|
+
} else if (jsonData) {
|
|
445
|
+
payload = JSON.parse(jsonData)
|
|
446
|
+
} else {
|
|
447
|
+
throw new Error("Usage: supercli server adapters add '{json}' or --from-file <path> or --source-file <path>")
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (!payload.name || !payload.source) {
|
|
451
|
+
throw new Error("Adapter requires 'name' and 'source' fields")
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const result = await serverFetch("/api/adapters", {
|
|
455
|
+
method: "POST",
|
|
456
|
+
body: JSON.stringify(payload),
|
|
457
|
+
})
|
|
458
|
+
output(result)
|
|
459
|
+
return true
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (action === "remove") {
|
|
463
|
+
const adapterName = positional[3]
|
|
464
|
+
if (!adapterName) {
|
|
465
|
+
throw new Error("Usage: supercli server adapters remove <name>")
|
|
466
|
+
}
|
|
467
|
+
const result = await serverFetch(`/api/adapters/${encodeURIComponent(adapterName)}`, {
|
|
468
|
+
method: "DELETE",
|
|
469
|
+
})
|
|
470
|
+
output(result)
|
|
471
|
+
return true
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (action === "update") {
|
|
475
|
+
const adapterName = positional[3]
|
|
476
|
+
const updateData = positional[4]
|
|
477
|
+
if (!adapterName) {
|
|
478
|
+
throw new Error("Usage: supercli server adapters update <name> '{json}' or --from-file <path>")
|
|
479
|
+
}
|
|
480
|
+
let payload
|
|
481
|
+
const jsonPath = flags["from-file"]
|
|
482
|
+
const sourcePath = flags["source-file"]
|
|
483
|
+
|
|
484
|
+
if (jsonPath) {
|
|
485
|
+
payload = readJsonFile(jsonPath)
|
|
486
|
+
if (sourcePath) {
|
|
487
|
+
payload.source = fs.readFileSync(path.resolve(sourcePath), "utf-8")
|
|
488
|
+
}
|
|
489
|
+
} else if (sourcePath) {
|
|
490
|
+
payload = JSON.parse(updateData || "{}")
|
|
491
|
+
payload.source = fs.readFileSync(path.resolve(sourcePath), "utf-8")
|
|
492
|
+
} else if (flags["from-stdin"]) {
|
|
493
|
+
let stdinData = ""
|
|
494
|
+
for await (const chunk of process.stdin) {
|
|
495
|
+
stdinData += chunk
|
|
496
|
+
}
|
|
497
|
+
payload = JSON.parse(stdinData)
|
|
498
|
+
} else {
|
|
499
|
+
payload = JSON.parse(updateData || "{}")
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const result = await serverFetch(`/api/adapters/${encodeURIComponent(adapterName)}`, {
|
|
503
|
+
method: "PUT",
|
|
504
|
+
body: JSON.stringify(payload),
|
|
505
|
+
})
|
|
506
|
+
output(result)
|
|
507
|
+
return true
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
if (action === "packages") {
|
|
511
|
+
const packageAction = arg
|
|
512
|
+
const targetAdapterName = positional[4]
|
|
513
|
+
|
|
514
|
+
if (!targetAdapterName) {
|
|
515
|
+
throw new Error("Usage: supercli server adapters packages <list|add|remove> <name>")
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (packageAction === "list") {
|
|
519
|
+
const data = await serverFetch(`/api/adapters/${encodeURIComponent(targetAdapterName)}/packages?format=json`)
|
|
520
|
+
if (humanMode) {
|
|
521
|
+
console.log(`\n ⚡ Packages for ${targetAdapterName}\n`)
|
|
522
|
+
outputHumanTable(data.packages || [], [
|
|
523
|
+
{ key: "package", label: "Package" },
|
|
524
|
+
{ key: "version", label: "Version" },
|
|
525
|
+
])
|
|
526
|
+
console.log("")
|
|
527
|
+
} else {
|
|
528
|
+
output(data)
|
|
529
|
+
}
|
|
530
|
+
return true
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
if (packageAction === "add") {
|
|
534
|
+
const packageName = flags.package
|
|
535
|
+
const version = flags.version
|
|
536
|
+
if (!packageName) {
|
|
537
|
+
throw new Error("Usage: supercli server adapters packages add <name> --package <pkg> --version <ver>")
|
|
538
|
+
}
|
|
539
|
+
const result = await serverFetch(`/api/adapters/${encodeURIComponent(targetAdapterName)}/packages`, {
|
|
540
|
+
method: "POST",
|
|
541
|
+
body: JSON.stringify({ package: packageName, version }),
|
|
542
|
+
})
|
|
543
|
+
output(result)
|
|
544
|
+
return true
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
if (packageAction === "remove") {
|
|
548
|
+
const packageName = flags.package
|
|
549
|
+
if (!packageName) {
|
|
550
|
+
throw new Error("Usage: supercli server adapters packages remove <name> --package <pkg>")
|
|
551
|
+
}
|
|
552
|
+
const result = await serverFetch(`/api/adapters/${encodeURIComponent(targetAdapterName)}/packages/${encodeURIComponent(packageName)}`, {
|
|
553
|
+
method: "DELETE",
|
|
554
|
+
})
|
|
555
|
+
output(result)
|
|
556
|
+
return true
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
throw new Error(`Unknown packages action: ${packageAction}. Use: list, add, remove`)
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
throw new Error(`Unknown adapters action: ${action}. Use: list, add, remove, update, packages`)
|
|
563
|
+
}
|
|
564
|
+
|
|
395
565
|
module.exports = { handleServerCommand }
|
package/cli/supercli.js
CHANGED
|
@@ -9,6 +9,7 @@ const {
|
|
|
9
9
|
removeMcpServer,
|
|
10
10
|
listMcpServers,
|
|
11
11
|
upsertCommand,
|
|
12
|
+
getClientId,
|
|
12
13
|
} = require("./config");
|
|
13
14
|
const { execute } = require("./executor");
|
|
14
15
|
const { buildCapabilities } = require("./help-json");
|
|
@@ -25,6 +26,7 @@ const { handleAskCommand } = require("./ask");
|
|
|
25
26
|
const { handleSkillsCommand } = require("./skills");
|
|
26
27
|
const { findNamespacePassthrough } = require("./namespace-passthrough");
|
|
27
28
|
const { discoverPluginsByIntent } = require("./discover");
|
|
29
|
+
const { startDaemon, stopDaemon, getDaemonStatus, writeLog } = require("./daemon");
|
|
28
30
|
|
|
29
31
|
const SERVER = process.env.SUPERCLI_SERVER;
|
|
30
32
|
const hasServer = !!SERVER;
|
|
@@ -236,7 +238,7 @@ function renderTopLevelHelp(config) {
|
|
|
236
238
|
console.log(' AI: supercli ask "<your natural language query>" # LLM-powered suggestions (no execution)');
|
|
237
239
|
}
|
|
238
240
|
console.log(" Server: supercli --server");
|
|
239
|
-
console.log(" Server CLI: supercli server status | supercli server plugins <list|add|remove> | supercli server mcp <list|add|remove> | supercli server commands <list|add|remove> | supercli server jobs <list|prune>");
|
|
241
|
+
console.log(" Server CLI: supercli server status | supercli server plugins <list|add|remove> | supercli server mcp <list|add|remove> | supercli server commands <list|add|remove> | supercli server jobs <list|prune> | supercli server adapters <list|add|remove|update> | supercli server adapters packages <list|add|remove> <name>");
|
|
240
242
|
console.log(
|
|
241
243
|
" Flags: --help | --json | --human | --compact | --schema | --help-json | --server\n",
|
|
242
244
|
);
|
|
@@ -570,6 +572,29 @@ async function main() {
|
|
|
570
572
|
return;
|
|
571
573
|
}
|
|
572
574
|
|
|
575
|
+
if (positional[0] === "daemon") {
|
|
576
|
+
const subcommand = positional[1] || "status";
|
|
577
|
+
switch (subcommand) {
|
|
578
|
+
case "start":
|
|
579
|
+
output(startDaemon());
|
|
580
|
+
break;
|
|
581
|
+
case "stop":
|
|
582
|
+
output(stopDaemon());
|
|
583
|
+
break;
|
|
584
|
+
case "status":
|
|
585
|
+
output(getDaemonStatus());
|
|
586
|
+
break;
|
|
587
|
+
default:
|
|
588
|
+
outputError({
|
|
589
|
+
code: 85,
|
|
590
|
+
type: "invalid_argument",
|
|
591
|
+
message: "Unknown daemon subcommand. Use: start|stop|status",
|
|
592
|
+
recoverable: false,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
|
|
573
598
|
if (positional[0] === "commands") {
|
|
574
599
|
const config = await loadConfig(SERVER);
|
|
575
600
|
const namespaceFilter = flags.namespace
|
|
@@ -959,20 +984,15 @@ async function main() {
|
|
|
959
984
|
data: result,
|
|
960
985
|
};
|
|
961
986
|
|
|
962
|
-
//
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
duration_ms: duration,
|
|
972
|
-
timestamp: new Date().toISOString(),
|
|
973
|
-
}),
|
|
974
|
-
}).catch(() => {}); // silent fail
|
|
975
|
-
}
|
|
987
|
+
// Write job record to local log (daemon will sync to server)
|
|
988
|
+
writeLog({
|
|
989
|
+
command: `${namespace}.${resource}.${action}`,
|
|
990
|
+
args: uFlags,
|
|
991
|
+
status: "success",
|
|
992
|
+
duration_ms: duration,
|
|
993
|
+
timestamp: new Date().toISOString(),
|
|
994
|
+
client_id: getClientId(),
|
|
995
|
+
});
|
|
976
996
|
|
|
977
997
|
if (humanMode) {
|
|
978
998
|
process.stderr.write(
|
|
@@ -158,6 +158,11 @@
|
|
|
158
158
|
<li>Add server dashboard with command overview and job monitoring</li>
|
|
159
159
|
<li>Add adapter management UI with package installation and configuration</li>
|
|
160
160
|
<li>Add 12 new plugins: biome, bore, ccf-deadlines, code2prompt, dua-cli, forever, gitmoji-cli, quarto, readme-md-generator, vale, volta, wgcf</li>
|
|
161
|
+
<li>Add authentication system for API endpoints with public_access flag and API key management</li>
|
|
162
|
+
<li>Add daemon for background job log syncing to server</li>
|
|
163
|
+
<li>Add client tracking with client_id in job records</li>
|
|
164
|
+
<li>Add API keys management UI with create, list, copy, and delete functionality</li>
|
|
165
|
+
<li>Add clients.ejs for client management view</li>
|
|
161
166
|
</ul>
|
|
162
167
|
</section>
|
|
163
168
|
|
|
@@ -188,6 +193,7 @@
|
|
|
188
193
|
</h2>
|
|
189
194
|
<ul class="space-y-2 text-slate-300">
|
|
190
195
|
<li>Bump version to 1.1.14</li>
|
|
196
|
+
<li>Bump version to 1.1.23</li>
|
|
191
197
|
</ul>
|
|
192
198
|
</section>
|
|
193
199
|
|
package/docs/index.html
CHANGED
|
@@ -103,6 +103,9 @@
|
|
|
103
103
|
background: #333333;
|
|
104
104
|
transform: scale(1.05);
|
|
105
105
|
}
|
|
106
|
+
.radial-gradient {
|
|
107
|
+
background: radial-gradient(circle at 30% 50%, rgba(0, 0, 0, 0.03) 0%, transparent 70%);
|
|
108
|
+
}
|
|
106
109
|
</style>
|
|
107
110
|
</head>
|
|
108
111
|
<body class="bg-[#FBFBFA]">
|
|
@@ -114,6 +117,9 @@
|
|
|
114
117
|
<h1 class="text-2xl font-semibold mt-3 text-[#111111]">supercli</h1>
|
|
115
118
|
<p class="text-sm text-[#787774] mt-1">Universal Capability Router</p>
|
|
116
119
|
</div>
|
|
120
|
+
<div id="backToServerUI" class="hidden">
|
|
121
|
+
<a href="/" class="block px-3 py-2 text-sm text-[#1F6C9F] hover:bg-[#F7F6F3] rounded-md">← Back to Server UI</a>
|
|
122
|
+
</div>
|
|
117
123
|
<nav class="space-y-6">
|
|
118
124
|
<div>
|
|
119
125
|
<p class="text-xs uppercase tracking-widest text-[#787774] mb-3">Overview</p>
|
|
@@ -155,6 +161,46 @@
|
|
|
155
161
|
</header>
|
|
156
162
|
|
|
157
163
|
<main class="flex-1 overflow-y-auto bg-[#FBFBFA]">
|
|
164
|
+
<!-- Hero Section -->
|
|
165
|
+
<section class="relative px-8 py-20 bg-[#FBFBFA]">
|
|
166
|
+
<div class="absolute inset-0 opacity-[0.03] radial-gradient"></div>
|
|
167
|
+
<div class="max-w-5xl relative z-10">
|
|
168
|
+
<div class="space-y-8 scroll-reveal">
|
|
169
|
+
<div class="space-y-4">
|
|
170
|
+
<span class="tag px-3 py-1 inline-block">The Capability Layer</span>
|
|
171
|
+
<h2 class="editorial-heading text-6xl font-medium text-[#111111] leading-[1.1]">
|
|
172
|
+
Turn every tool into<br/>a discoverable capability
|
|
173
|
+
</h2>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<div class="max-w-2xl space-y-4 text-[#2F3437] text-lg">
|
|
177
|
+
<p>supercli standardizes inputs, outputs, and execution across 999+ bundled plugins — from AWS, GitHub, Docker, to Kubernetes and beyond.</p>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="flex flex-wrap gap-8 pt-4">
|
|
181
|
+
<div class="space-y-1">
|
|
182
|
+
<p class="text-4xl font-semibold text-[#111111]">999+</p>
|
|
183
|
+
<p class="text-sm text-[#787774]">Bundled plugins</p>
|
|
184
|
+
</div>
|
|
185
|
+
<div class="space-y-1">
|
|
186
|
+
<p class="text-4xl font-semibold text-[#111111]">Zero</p>
|
|
187
|
+
<p class="text-sm text-[#787774]">Setup required</p>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="space-y-1">
|
|
190
|
+
<p class="text-4xl font-semibold text-[#111111]">One</p>
|
|
191
|
+
<p class="text-sm text-[#787774]">Consistent interface</p>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div class="pt-6">
|
|
196
|
+
<a href="plugins.html" class="inline-block px-8 py-4 bg-[#111111] text-white text-sm font-medium rounded-md hover:bg-[#333333] transition-colors">
|
|
197
|
+
Explore 999+ Plugins
|
|
198
|
+
</a>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</section>
|
|
203
|
+
|
|
158
204
|
<section class="border-b border-[#EAEAEA] bg-white px-8 py-12">
|
|
159
205
|
<div class="max-w-5xl">
|
|
160
206
|
<p class="text-xs uppercase tracking-[0.2em] text-[#787774] mb-4">Quick filter</p>
|
|
@@ -195,14 +241,21 @@ supercli skills get beads.issue.create</code></pre>
|
|
|
195
241
|
<h2 class="editorial-heading text-5xl font-medium text-[#111111]">Capability Sources</h2>
|
|
196
242
|
</div>
|
|
197
243
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
244
|
+
<div class="bento-card p-6 md:col-span-2 bg-[#E1F3FE]/10 border-[#E1F3FE]/30">
|
|
245
|
+
<div class="flex items-start justify-between gap-4">
|
|
246
|
+
<div class="space-y-3">
|
|
247
|
+
<h3 class="font-semibold text-[#111111]">Plugin Harnesses</h3>
|
|
248
|
+
<p class="text-[#2F3437] text-sm">999 bundled plugins (gh, aws, gcloud, az, docker, kubectl, terraform, stripe, supabase, and many more) via <code class="mono-text bg-[#F7F6F3] px-1 py-0.5 rounded text-xs border border-[#EAEAEA]">supercli plugins install</code>.</p>
|
|
249
|
+
</div>
|
|
250
|
+
<a href="plugins.html" class="inline-flex items-center px-4 py-2 bg-[#111111] text-white text-sm font-medium rounded-md hover:bg-[#333333] transition-colors whitespace-nowrap">
|
|
251
|
+
Explore Plugins
|
|
252
|
+
</a>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
198
255
|
<div class="bento-card p-6">
|
|
199
256
|
<h3 class="font-semibold text-[#111111] mb-2">Built-in Adapters</h3>
|
|
200
257
|
<p class="text-[#2F3437] text-sm">OpenAPI specs, raw HTTP, and MCP servers become capabilities automatically.</p>
|
|
201
258
|
</div>
|
|
202
|
-
<div class="bento-card p-6">
|
|
203
|
-
<h3 class="font-semibold text-[#111111] mb-2">Plugin Harnesses</h3>
|
|
204
|
-
<p class="text-[#2F3437] text-sm">999 bundled plugins (gh, aws, gcloud, az, docker, kubectl, terraform, stripe, supabase, and many more) via <code class="mono-text bg-[#F7F6F3] px-1 py-0.5 rounded text-xs border border-[#EAEAEA]">supercli plugins install</code>.</p>
|
|
205
|
-
</div>
|
|
206
259
|
<div class="bento-card p-6">
|
|
207
260
|
<h3 class="font-semibold text-[#111111] mb-2">AI Plans / Workflows</h3>
|
|
208
261
|
<p class="text-[#2F3437] text-sm">Natural language <code class="mono-text bg-[#F7F6F3] px-1 py-0.5 rounded text-xs border border-[#EAEAEA]">ask</code> and <code class="mono-text bg-[#F7F6F3] px-1 py-0.5 rounded text-xs border border-[#EAEAEA]">plan</code> commands create DAGs of capabilities.</p>
|
|
@@ -281,14 +334,21 @@ supercli plugins show <name></code></pre>
|
|
|
281
334
|
<h2 class="editorial-heading text-5xl font-medium text-[#111111]">More Documentation</h2>
|
|
282
335
|
</div>
|
|
283
336
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
337
|
+
<a href="plugins.html" class="bento-card p-6 md:col-span-2 bg-[#E1F3FE]/10 border-[#E1F3FE]/30 hover:border-[#E1F3FE]/50 transition-colors">
|
|
338
|
+
<div class="flex items-start justify-between gap-4">
|
|
339
|
+
<div class="space-y-2">
|
|
340
|
+
<h3 class="font-semibold text-[#111111] mono-text text-sm">Plugin Directory</h3>
|
|
341
|
+
<p class="text-[#2F3437] text-sm">Browse all 999+ plugins — from AWS and GitHub to Docker, Kubernetes, and beyond.</p>
|
|
342
|
+
</div>
|
|
343
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#111111" stroke-width="2" class="flex-shrink-0 mt-1">
|
|
344
|
+
<path d="M5 12h14M12 5l7 7-7 7"/>
|
|
345
|
+
</svg>
|
|
346
|
+
</div>
|
|
347
|
+
</a>
|
|
284
348
|
<div class="bento-card p-6">
|
|
285
349
|
<h3 class="font-semibold text-[#111111] mb-2 mono-text text-sm">README.md</h3>
|
|
286
350
|
<p class="text-[#2F3437] text-sm">Repository root documentation</p>
|
|
287
351
|
</div>
|
|
288
|
-
<a href="plugins.html" class="bento-card p-6 hover:border-[#111111] transition-colors">
|
|
289
|
-
<h3 class="font-semibold text-[#111111] mb-2 mono-text text-sm">Plugin Directory</h3>
|
|
290
|
-
<p class="text-[#2F3437] text-sm">Browse all 999 plugins</p>
|
|
291
|
-
</a>
|
|
292
352
|
<div class="bento-card p-6">
|
|
293
353
|
<h3 class="font-semibold text-[#111111] mb-2 mono-text text-sm">docs/skills-catalog.md</h3>
|
|
294
354
|
<p class="text-[#2F3437] text-sm">Skills reference catalog</p>
|
|
@@ -434,6 +494,33 @@ supercli plugins show <name></code></pre>
|
|
|
434
494
|
}
|
|
435
495
|
loadServerDocs();
|
|
436
496
|
|
|
497
|
+
// Show "Back to Server UI" link if fromServerUI parameter is present
|
|
498
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
499
|
+
const fromServerUI = urlParams.get('fromServerUI') === '1';
|
|
500
|
+
|
|
501
|
+
if (fromServerUI) {
|
|
502
|
+
const backToServerUI = document.getElementById('backToServerUI');
|
|
503
|
+
if (backToServerUI) {
|
|
504
|
+
backToServerUI.classList.remove('hidden');
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Propagate fromServerUI parameter to all sidebar links (except back to server UI)
|
|
508
|
+
const sidebarLinks = document.querySelectorAll('#sidebar a');
|
|
509
|
+
sidebarLinks.forEach(link => {
|
|
510
|
+
const href = link.getAttribute('href');
|
|
511
|
+
// Skip the back to server UI link
|
|
512
|
+
if (link.closest('#backToServerUI')) return;
|
|
513
|
+
|
|
514
|
+
if (href && !href.startsWith('http') && !href.startsWith('#')) {
|
|
515
|
+
// Get current path to preserve /docs/ base
|
|
516
|
+
const currentPath = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);
|
|
517
|
+
const url = new URL(currentPath + href, window.location.origin);
|
|
518
|
+
url.searchParams.set('fromServerUI', '1');
|
|
519
|
+
link.setAttribute('href', url.pathname + url.search);
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
|
|
437
524
|
// Load adapters documentation dynamically
|
|
438
525
|
async function loadAdaptersDocs() {
|
|
439
526
|
try {
|
package/docs/plugins.html
CHANGED
|
@@ -109,6 +109,9 @@
|
|
|
109
109
|
<h1 class="text-2xl font-semibold mt-3 text-[#111111]">supercli</h1>
|
|
110
110
|
<p class="text-sm text-[#787774] mt-1">Plugin Directory</p>
|
|
111
111
|
</div>
|
|
112
|
+
<div id="backToServerUI" class="hidden">
|
|
113
|
+
<a href="/" class="block px-3 py-2 text-sm text-[#1F6C9F] hover:bg-[#F7F6F3] rounded-md">← Back to Server UI</a>
|
|
114
|
+
</div>
|
|
112
115
|
<nav class="space-y-6">
|
|
113
116
|
<div>
|
|
114
117
|
<p class="text-xs uppercase tracking-widest text-[#787774] mb-3">Navigation</p>
|
|
@@ -345,6 +348,33 @@
|
|
|
345
348
|
if (e.target === mobileDrawer) mobileDrawer.classList.add('hidden');
|
|
346
349
|
});
|
|
347
350
|
|
|
351
|
+
// Show "Back to Server UI" link if fromServerUI parameter is present
|
|
352
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
353
|
+
const fromServerUI = urlParams.get('fromServerUI') === '1';
|
|
354
|
+
|
|
355
|
+
if (fromServerUI) {
|
|
356
|
+
const backToServerUI = document.getElementById('backToServerUI');
|
|
357
|
+
if (backToServerUI) {
|
|
358
|
+
backToServerUI.classList.remove('hidden');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Propagate fromServerUI parameter to all sidebar links (except back to server UI)
|
|
362
|
+
const sidebarLinks = document.querySelectorAll('#sidebar a');
|
|
363
|
+
sidebarLinks.forEach(link => {
|
|
364
|
+
const href = link.getAttribute('href');
|
|
365
|
+
// Skip the back to server UI link
|
|
366
|
+
if (link.closest('#backToServerUI')) return;
|
|
367
|
+
|
|
368
|
+
if (href && !href.startsWith('http') && !href.startsWith('#')) {
|
|
369
|
+
// Get current path to preserve /docs/ base
|
|
370
|
+
const currentPath = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);
|
|
371
|
+
const url = new URL(currentPath + href, window.location.origin);
|
|
372
|
+
url.searchParams.set('fromServerUI', '1');
|
|
373
|
+
link.setAttribute('href', url.pathname + url.search);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
348
378
|
// Scroll to top button
|
|
349
379
|
const scrollTopBtn = document.getElementById('scrollTopBtn');
|
|
350
380
|
|
package/docs/server.md
CHANGED
|
@@ -41,6 +41,86 @@ Manage OpenAPI specifications at `/specs`. Upload OpenAPI/Swagger JSON or YAML f
|
|
|
41
41
|
|
|
42
42
|
Manage Model Context Protocol server connections at `/mcp`. Connect to MCP servers via SSE or stdio to expose their tools as supercli commands.
|
|
43
43
|
|
|
44
|
+
### MCP Transport Modes
|
|
45
|
+
|
|
46
|
+
The supercli MCP adapter supports multiple transport modes:
|
|
47
|
+
|
|
48
|
+
#### HTTP/SSE MCP
|
|
49
|
+
- Use `adapterConfig.url` for HTTP-based MCP servers
|
|
50
|
+
- Supercli MCP adapter automatically supports SSE streaming
|
|
51
|
+
- Sends `Accept: text/event-stream, application/json` header
|
|
52
|
+
- Parses SSE responses and returns accumulated results
|
|
53
|
+
- Uses JSON-RPC 2.0 format for requests
|
|
54
|
+
|
|
55
|
+
Example configuration:
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"adapterConfig": {
|
|
59
|
+
"url": "http://localhost:3002",
|
|
60
|
+
"tool": "get_deep_directory_tree"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### Stdio MCP with Daemon
|
|
66
|
+
- Use `adapterConfig.server` + `adapterConfig.stateful: true` for stdio MCPs
|
|
67
|
+
- Best for local stdio MCP servers
|
|
68
|
+
- Routes through MCP daemon for stateful stdio handling
|
|
69
|
+
- **Daemon runs on CLI side** (not server) - starts on-demand when first command is executed via CLI
|
|
70
|
+
- Daemon runs as detached background process with Unix socket at `~/.supercli/mcp-daemon.sock`
|
|
71
|
+
- Persists across command executions to maintain MCP server sessions
|
|
72
|
+
- Manual control: `supercli mcp daemon start/stop/status`
|
|
73
|
+
|
|
74
|
+
Example configuration:
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"adapterConfig": {
|
|
78
|
+
"server": "deep-directory-tree",
|
|
79
|
+
"tool": "tool_name",
|
|
80
|
+
"stateful": true,
|
|
81
|
+
"timeout_ms": 60000
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### Stdio MCP Direct
|
|
87
|
+
- Use `adapterConfig.command` for direct stdio calls
|
|
88
|
+
- May have compatibility issues with different MCP implementations
|
|
89
|
+
|
|
90
|
+
### Using mcp-proxy with Supercli
|
|
91
|
+
|
|
92
|
+
The mcp-proxy tool transforms stdio MCPs into HTTP/SSE. Here's how to use it:
|
|
93
|
+
|
|
94
|
+
1. Start mcp-proxy:
|
|
95
|
+
```bash
|
|
96
|
+
npx -y mcp-proxy --port 3002 -- npx -y @andredezzy/deep-directory-tree-mcp
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
2. Add MCP server to supercli:
|
|
100
|
+
```bash
|
|
101
|
+
supercli server mcp add '{"name":"deep-tree","url":"http://localhost:3002"}'
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
3. Create command:
|
|
105
|
+
```bash
|
|
106
|
+
supercli server commands add '{"namespace":"tree","resource":"deep","action":"list","adapter":"mcp","adapterConfig":{"url":"http://localhost:3002","tool":"get_deep_directory_tree"}}'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
4. Sync and use:
|
|
110
|
+
```bash
|
|
111
|
+
supercli sync
|
|
112
|
+
supercli tree deep list --path /some/dir --depth 3
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Note:** Use space syntax for arguments: `--path /dir` not `--path=/dir`
|
|
116
|
+
|
|
117
|
+
### MCP Adapter Features
|
|
118
|
+
|
|
119
|
+
- **Auto-detection**: Automatically detects SSE responses and falls back to JSON
|
|
120
|
+
- **JSON-RPC Support**: Uses JSON-RPC 2.0 format for HTTP MCP calls
|
|
121
|
+
- **SSE Parsing**: Parses Server-Sent Events and accumulates results
|
|
122
|
+
- **Stream Flag**: Reserved for future streaming output support (`--stream`)
|
|
123
|
+
|
|
44
124
|
## Plugins
|
|
45
125
|
|
|
46
126
|
Manage server plugins at `/plugins`. Upload plugin ZIP files, enable/disable plugins, and view plugin manifests. Server plugins extend CLI capabilities with custom commands and harnesses.
|