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
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugin": "toml2json",
|
|
3
|
+
"binary": "toml2json",
|
|
4
|
+
"check": "which toml2json",
|
|
5
|
+
"install_steps": [
|
|
6
|
+
"cargo install toml2json",
|
|
7
|
+
"Verify: toml2json --version",
|
|
8
|
+
"supercli plugins install ./plugins/toml2json --on-conflict replace --json"
|
|
9
|
+
],
|
|
10
|
+
"note": "Tiny single-purpose tool available via crates.io."
|
|
11
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "toml2json",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Convert TOML to JSON from stdin or files",
|
|
5
|
+
"source": "https://github.com/woodruffw/toml2json",
|
|
6
|
+
"checks": [
|
|
7
|
+
{ "type": "binary", "name": "toml2json" }
|
|
8
|
+
],
|
|
9
|
+
"install_guidance": {
|
|
10
|
+
"plugin": "toml2json",
|
|
11
|
+
"binary": "toml2json",
|
|
12
|
+
"check": "which toml2json",
|
|
13
|
+
"install_steps": [
|
|
14
|
+
"cargo install toml2json",
|
|
15
|
+
"Verify: toml2json --version",
|
|
16
|
+
"supercli plugins install ./plugins/toml2json --on-conflict replace --json"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"learn": {
|
|
20
|
+
"file": "skills/quickstart/SKILL.md"
|
|
21
|
+
},
|
|
22
|
+
"commands": [
|
|
23
|
+
{
|
|
24
|
+
"namespace": "toml2json",
|
|
25
|
+
"resource": "self",
|
|
26
|
+
"action": "version",
|
|
27
|
+
"description": "Print toml2json version",
|
|
28
|
+
"adapter": "process",
|
|
29
|
+
"adapterConfig": {
|
|
30
|
+
"command": "toml2json",
|
|
31
|
+
"baseArgs": ["--version"],
|
|
32
|
+
"missingDependencyHelp": "Install toml2json: cargo install toml2json"
|
|
33
|
+
},
|
|
34
|
+
"args": []
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"namespace": "toml2json",
|
|
38
|
+
"resource": "convert",
|
|
39
|
+
"action": "file",
|
|
40
|
+
"description": "Convert a TOML file to JSON",
|
|
41
|
+
"adapter": "process",
|
|
42
|
+
"adapterConfig": {
|
|
43
|
+
"command": "toml2json",
|
|
44
|
+
"positionalArgs": ["file"],
|
|
45
|
+
"passthrough": true,
|
|
46
|
+
"timeout_ms": 30000,
|
|
47
|
+
"missingDependencyHelp": "Install toml2json"
|
|
48
|
+
},
|
|
49
|
+
"args": [
|
|
50
|
+
{ "name": "file", "type": "string", "required": true, "description": "Path to TOML file" }
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"namespace": "toml2json",
|
|
55
|
+
"resource": "convert",
|
|
56
|
+
"action": "pretty",
|
|
57
|
+
"description": "Convert TOML to pretty-printed JSON",
|
|
58
|
+
"adapter": "process",
|
|
59
|
+
"adapterConfig": {
|
|
60
|
+
"command": "toml2json",
|
|
61
|
+
"baseArgs": ["--pretty"],
|
|
62
|
+
"positionalArgs": ["file"],
|
|
63
|
+
"passthrough": true,
|
|
64
|
+
"timeout_ms": 30000,
|
|
65
|
+
"missingDependencyHelp": "Install toml2json"
|
|
66
|
+
},
|
|
67
|
+
"args": [
|
|
68
|
+
{ "name": "file", "type": "string", "required": false, "description": "Path to TOML file (reads stdin if omitted)" }
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"namespace": "toml2json",
|
|
73
|
+
"resource": "_",
|
|
74
|
+
"action": "_",
|
|
75
|
+
"description": "Passthrough to toml2json CLI",
|
|
76
|
+
"adapter": "process",
|
|
77
|
+
"adapterConfig": {
|
|
78
|
+
"command": "toml2json",
|
|
79
|
+
"passthrough": true,
|
|
80
|
+
"missingDependencyHelp": "Install toml2json"
|
|
81
|
+
},
|
|
82
|
+
"args": []
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: toml2json
|
|
3
|
+
description: Use this skill when the user wants to convert TOML files to JSON format, or pipe TOML data through stdin to get JSON output.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# toml2json Plugin
|
|
7
|
+
|
|
8
|
+
Very small CLI for converting TOML to JSON.
|
|
9
|
+
|
|
10
|
+
## Commands
|
|
11
|
+
|
|
12
|
+
### Convert
|
|
13
|
+
- `toml2json convert file` — Convert a TOML file to JSON
|
|
14
|
+
- `toml2json convert pretty` — Convert TOML to pretty-printed JSON
|
|
15
|
+
|
|
16
|
+
## Usage Examples
|
|
17
|
+
- "Convert a TOML file to JSON"
|
|
18
|
+
- "Pretty-print a TOML configuration as JSON"
|
|
19
|
+
- "Pipe TOML data and convert it"
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cargo install toml2json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Examples
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Convert a file
|
|
31
|
+
toml2json config.toml
|
|
32
|
+
|
|
33
|
+
# Pretty-print
|
|
34
|
+
toml2json --pretty config.toml
|
|
35
|
+
|
|
36
|
+
# Pipe from stdin
|
|
37
|
+
cat config.toml | toml2json
|
|
38
|
+
|
|
39
|
+
# Use with jq
|
|
40
|
+
toml2json config.toml | jq '.key'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Key Features
|
|
44
|
+
- Convert TOML to JSON
|
|
45
|
+
- Read from files or stdin
|
|
46
|
+
- Pretty-print output option
|
|
47
|
+
- Pipe-friendly for shell workflows
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugin": "worktrunk",
|
|
3
|
+
"binary": "wt",
|
|
4
|
+
"check": "which wt",
|
|
5
|
+
"install_steps": [
|
|
6
|
+
"cargo install worktrunk",
|
|
7
|
+
"wt config shell install",
|
|
8
|
+
"supercli plugins install ./plugins/worktrunk --on-conflict replace --json"
|
|
9
|
+
],
|
|
10
|
+
"note": "Also available via: brew, pacman, winget, conda. Binary name is 'wt'. Shell integration required for cd commands."
|
|
11
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "worktrunk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for Git worktree management, designed for parallel AI agent workflows",
|
|
5
|
+
"source": "https://github.com/max-sixty/worktrunk",
|
|
6
|
+
"checks": [
|
|
7
|
+
{ "type": "binary", "name": "wt" }
|
|
8
|
+
],
|
|
9
|
+
"install_guidance": {
|
|
10
|
+
"plugin": "worktrunk",
|
|
11
|
+
"binary": "wt",
|
|
12
|
+
"check": "which wt",
|
|
13
|
+
"install_steps": [
|
|
14
|
+
"cargo install worktrunk",
|
|
15
|
+
"wt config shell install",
|
|
16
|
+
"supercli plugins install ./plugins/worktrunk --on-conflict replace --json"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"learn": {
|
|
20
|
+
"file": "skills/quickstart/SKILL.md"
|
|
21
|
+
},
|
|
22
|
+
"commands": [
|
|
23
|
+
{
|
|
24
|
+
"namespace": "worktrunk",
|
|
25
|
+
"resource": "self",
|
|
26
|
+
"action": "version",
|
|
27
|
+
"description": "Print worktrunk version",
|
|
28
|
+
"adapter": "process",
|
|
29
|
+
"adapterConfig": {
|
|
30
|
+
"command": "wt",
|
|
31
|
+
"baseArgs": ["--version"],
|
|
32
|
+
"missingDependencyHelp": "Install worktrunk: cargo install worktrunk"
|
|
33
|
+
},
|
|
34
|
+
"args": []
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"namespace": "worktrunk",
|
|
38
|
+
"resource": "branch",
|
|
39
|
+
"action": "switch",
|
|
40
|
+
"description": "Switch to a worktree branch",
|
|
41
|
+
"adapter": "process",
|
|
42
|
+
"adapterConfig": {
|
|
43
|
+
"command": "wt",
|
|
44
|
+
"baseArgs": ["switch"],
|
|
45
|
+
"passthrough": true,
|
|
46
|
+
"timeout_ms": 30000,
|
|
47
|
+
"missingDependencyHelp": "Install worktrunk"
|
|
48
|
+
},
|
|
49
|
+
"args": [
|
|
50
|
+
{ "name": "branch", "type": "string", "required": true, "description": "Branch name to switch to" }
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"namespace": "worktrunk",
|
|
55
|
+
"resource": "branch",
|
|
56
|
+
"action": "create",
|
|
57
|
+
"description": "Create and switch to a new worktree branch",
|
|
58
|
+
"adapter": "process",
|
|
59
|
+
"adapterConfig": {
|
|
60
|
+
"command": "wt",
|
|
61
|
+
"baseArgs": ["switch", "-c"],
|
|
62
|
+
"passthrough": true,
|
|
63
|
+
"timeout_ms": 30000,
|
|
64
|
+
"missingDependencyHelp": "Install worktrunk"
|
|
65
|
+
},
|
|
66
|
+
"args": [
|
|
67
|
+
{ "name": "branch", "type": "string", "required": true, "description": "New branch name" }
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"namespace": "worktrunk",
|
|
72
|
+
"resource": "branch",
|
|
73
|
+
"action": "list",
|
|
74
|
+
"description": "List all worktree branches",
|
|
75
|
+
"adapter": "process",
|
|
76
|
+
"adapterConfig": {
|
|
77
|
+
"command": "wt",
|
|
78
|
+
"baseArgs": ["list"],
|
|
79
|
+
"passthrough": true,
|
|
80
|
+
"timeout_ms": 10000,
|
|
81
|
+
"missingDependencyHelp": "Install worktrunk"
|
|
82
|
+
},
|
|
83
|
+
"args": []
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"namespace": "worktrunk",
|
|
87
|
+
"resource": "branch",
|
|
88
|
+
"action": "remove",
|
|
89
|
+
"description": "Remove a worktree branch",
|
|
90
|
+
"adapter": "process",
|
|
91
|
+
"adapterConfig": {
|
|
92
|
+
"command": "wt",
|
|
93
|
+
"baseArgs": ["remove"],
|
|
94
|
+
"passthrough": true,
|
|
95
|
+
"timeout_ms": 30000,
|
|
96
|
+
"missingDependencyHelp": "Install worktrunk"
|
|
97
|
+
},
|
|
98
|
+
"args": [
|
|
99
|
+
{ "name": "branch", "type": "string", "required": false, "description": "Branch name to remove (uses current if omitted)" }
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"namespace": "worktrunk",
|
|
104
|
+
"resource": "_",
|
|
105
|
+
"action": "_",
|
|
106
|
+
"description": "Passthrough to wt CLI",
|
|
107
|
+
"adapter": "process",
|
|
108
|
+
"adapterConfig": {
|
|
109
|
+
"command": "wt",
|
|
110
|
+
"passthrough": true,
|
|
111
|
+
"missingDependencyHelp": "Install worktrunk"
|
|
112
|
+
},
|
|
113
|
+
"args": []
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: worktrunk
|
|
3
|
+
description: Use this skill when the user wants to manage Git worktrees, switch between parallel branches, or work with multiple worktrees.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# worktrunk Plugin
|
|
7
|
+
|
|
8
|
+
CLI for Git worktree management, designed for parallel AI agent workflows.
|
|
9
|
+
|
|
10
|
+
## Commands
|
|
11
|
+
|
|
12
|
+
### Branch
|
|
13
|
+
- `worktrunk branch switch` — Switch to a worktree branch
|
|
14
|
+
- `worktrunk branch create` — Create and switch to a new worktree branch
|
|
15
|
+
- `worktrunk branch list` — List all worktree branches
|
|
16
|
+
- `worktrunk branch remove` — Remove a worktree branch
|
|
17
|
+
|
|
18
|
+
## Usage Examples
|
|
19
|
+
- "Switch to a different worktree branch"
|
|
20
|
+
- "Create a new worktree for a feature branch"
|
|
21
|
+
- "List all my worktrees"
|
|
22
|
+
- "Remove a worktree I no longer need"
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cargo install worktrunk
|
|
28
|
+
wt config shell install
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Switch to existing branch
|
|
35
|
+
wt switch feature-branch
|
|
36
|
+
|
|
37
|
+
# Create and switch to new branch
|
|
38
|
+
wt switch -c new-feature
|
|
39
|
+
|
|
40
|
+
# Create with external tool execution
|
|
41
|
+
wt switch -c -x claude new-feature
|
|
42
|
+
|
|
43
|
+
# List all worktrees
|
|
44
|
+
wt list
|
|
45
|
+
|
|
46
|
+
# Remove current worktree
|
|
47
|
+
wt remove
|
|
48
|
+
|
|
49
|
+
# Remove specific worktree
|
|
50
|
+
wt remove old-branch
|
|
51
|
+
|
|
52
|
+
# Checkout PR
|
|
53
|
+
wt switch pr:123
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Key Features
|
|
57
|
+
- Branch-name based worktree addressing
|
|
58
|
+
- Automatic path computation
|
|
59
|
+
- Hooks for workflow automation
|
|
60
|
+
- LLM commit message generation
|
|
61
|
+
- PR checkout support
|
|
62
|
+
- Build cache sharing between worktrees
|
package/server/app.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const express = require("express");
|
|
2
2
|
const path = require("path");
|
|
3
3
|
const { getStorage } = require("./storage/adapter");
|
|
4
|
+
const { registerAllPluginResources, syncPluginResources } = require("./services/pluginResourceService");
|
|
5
|
+
const { requireAuth } = require("./middleware/auth");
|
|
4
6
|
|
|
5
7
|
const dashboardRouter = require("./routes/dashboard");
|
|
6
8
|
const adaptersRouter = require("./routes/adapters");
|
|
@@ -12,6 +14,9 @@ const plansRouter = require("./routes/plans");
|
|
|
12
14
|
const jobsRouter = require("./routes/jobs");
|
|
13
15
|
const askRouter = require("./routes/ask");
|
|
14
16
|
const pluginsRouter = require("./routes/plugins");
|
|
17
|
+
const docsRouter = require("./routes/docs");
|
|
18
|
+
const settingsRouter = require("./routes/settings");
|
|
19
|
+
const clientsRouter = require("./routes/clients");
|
|
15
20
|
|
|
16
21
|
const PORT = process.env.PORT || 3000;
|
|
17
22
|
|
|
@@ -23,22 +28,25 @@ app.use(express.urlencoded({ extended: true, limit: "20mb" }));
|
|
|
23
28
|
app.set("view engine", "ejs");
|
|
24
29
|
app.set("views", path.join(__dirname, "views"));
|
|
25
30
|
|
|
31
|
+
// Static file serving - must be before API routes
|
|
26
32
|
app.use("/static", express.static(path.join(__dirname, "public")));
|
|
33
|
+
app.use("/uploads", express.static(path.join(__dirname, "uploads")));
|
|
34
|
+
app.use("/docs", express.static(path.join(__dirname, "../docs")));
|
|
27
35
|
|
|
28
|
-
// API routes
|
|
29
|
-
app.use("/api/dashboard", dashboardRouter);
|
|
30
|
-
app.use("/api/adapters", adaptersRouter);
|
|
31
|
-
app.use("/api/
|
|
32
|
-
app.use("/api/
|
|
33
|
-
app.use("/api/
|
|
34
|
-
app.use("/api/
|
|
35
|
-
app.use("/api/
|
|
36
|
-
app.use("/api/
|
|
37
|
-
app.use("/api/ask", askRouter);
|
|
36
|
+
// API routes (with authentication)
|
|
37
|
+
app.use("/api/dashboard", requireAuth, dashboardRouter);
|
|
38
|
+
app.use("/api/adapters", requireAuth, adaptersRouter);
|
|
39
|
+
app.use("/api/commands", requireAuth, commandsRouter);
|
|
40
|
+
app.use("/api/specs", requireAuth, specsRouter);
|
|
41
|
+
app.use("/api/mcp", requireAuth, mcpRouter);
|
|
42
|
+
app.use("/api/plans", requireAuth, plansRouter);
|
|
43
|
+
app.use("/api/jobs", requireAuth, jobsRouter);
|
|
44
|
+
app.use("/api/ask", requireAuth, askRouter);
|
|
38
45
|
app.use("/api/plugins", pluginsRouter);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
app.use("/api",
|
|
46
|
+
app.use("/api/docs", requireAuth, docsRouter);
|
|
47
|
+
app.use("/api/clients", requireAuth, clientsRouter);
|
|
48
|
+
app.use("/api", settingsRouter);
|
|
49
|
+
app.use("/api/config", requireAuth, configRouter);
|
|
42
50
|
|
|
43
51
|
app.use("/", dashboardRouter);
|
|
44
52
|
|
|
@@ -66,12 +74,37 @@ app.get("/mcp", (req, res) => res.redirect("/api/mcp"));
|
|
|
66
74
|
app.get("/jobs", (req, res) => res.redirect("/api/jobs"));
|
|
67
75
|
app.get("/plugins", (req, res) => res.redirect("/api/plugins"));
|
|
68
76
|
app.get("/adapters", (req, res) => res.redirect("/api/adapters"));
|
|
77
|
+
app.get("/docs", (req, res) => res.redirect("/api/docs"));
|
|
78
|
+
|
|
79
|
+
// Doc sub-page redirects
|
|
80
|
+
app.get("/api/plugins.html", (req, res) => res.redirect("/docs/plugins.html"));
|
|
81
|
+
app.get("/api/adapters.html", (req, res) => res.redirect("/docs/adapters.html"));
|
|
82
|
+
app.get("/api/server.md", (req, res) => res.redirect("/docs/server.md"));
|
|
83
|
+
app.get("/api/changelog.html", (req, res) => res.redirect("/docs/changelog.html"));
|
|
69
84
|
|
|
70
85
|
async function start() {
|
|
71
86
|
try {
|
|
72
87
|
// Initialize storage singleton
|
|
73
88
|
getStorage();
|
|
74
89
|
|
|
90
|
+
// Sync plugin resources (cleanup orphaned)
|
|
91
|
+
console.log("[Plugin Resources] Syncing plugin resources...");
|
|
92
|
+
const syncResults = await syncPluginResources();
|
|
93
|
+
if (syncResults.removedMcp.length > 0 || syncResults.removedSpecs.length > 0) {
|
|
94
|
+
console.log(`[Plugin Resources] Cleaned up ${syncResults.removedMcp.length} MCP and ${syncResults.removedSpecs.length} orphaned specs`);
|
|
95
|
+
}
|
|
96
|
+
if (syncResults.errors.length > 0) {
|
|
97
|
+
console.warn(`[Plugin Resources] ${syncResults.errors.length} sync errors`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Register plugin resources (self-healing)
|
|
101
|
+
console.log("[Plugin Resources] Registering plugin resources...");
|
|
102
|
+
const resourceResults = await registerAllPluginResources();
|
|
103
|
+
if (resourceResults.totalErrors > 0) {
|
|
104
|
+
console.warn(`[Plugin Resources] ${resourceResults.totalErrors} errors during registration`);
|
|
105
|
+
}
|
|
106
|
+
console.log(`[Plugin Resources] Registered ${resourceResults.registeredMcp} MCP servers and ${resourceResults.registeredSpecs} OpenAPI specs`);
|
|
107
|
+
|
|
75
108
|
app.listen(PORT, () => {
|
|
76
109
|
console.log(`SUPERCLI server running on http://localhost:${PORT}`);
|
|
77
110
|
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const { getSettings } = require("../services/pluginsService");
|
|
2
|
+
|
|
3
|
+
// Cache settings for 30 seconds to avoid repeated storage reads
|
|
4
|
+
let cachedSettings = null;
|
|
5
|
+
let cacheExpiry = 0;
|
|
6
|
+
|
|
7
|
+
async function getCachedSettings() {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
if (cachedSettings && now < cacheExpiry) {
|
|
10
|
+
return cachedSettings;
|
|
11
|
+
}
|
|
12
|
+
cachedSettings = await getSettings();
|
|
13
|
+
cacheExpiry = now + 30000; // 30 seconds
|
|
14
|
+
return cachedSettings;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Authentication middleware for API endpoints
|
|
19
|
+
*
|
|
20
|
+
* Flow:
|
|
21
|
+
* 1. Check admin_mode_enabled - if true, skip all auth
|
|
22
|
+
* 2. Check public_access - if true, allow all requests
|
|
23
|
+
* 3. Allow settings endpoint when no API keys exist (for bootstrapping)
|
|
24
|
+
* 4. Check X-API-Key header - validate against stored API keys
|
|
25
|
+
* 5. Return 401 if no valid auth
|
|
26
|
+
*/
|
|
27
|
+
async function requireAuth(req, res, next) {
|
|
28
|
+
try {
|
|
29
|
+
const settings = await getCachedSettings();
|
|
30
|
+
|
|
31
|
+
// Admin mode - skip all authentication
|
|
32
|
+
if (settings.admin_mode_enabled === true) {
|
|
33
|
+
return next();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Public access - allow all requests
|
|
37
|
+
if (settings.public_access === true) {
|
|
38
|
+
return next();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Allow HTML views (browser navigation) without auth
|
|
42
|
+
// This allows users to navigate the UI without API keys
|
|
43
|
+
if (req.accepts("html") && !req.headers["x-requested-with"] && req.query.format !== "json") {
|
|
44
|
+
return next();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Check API key
|
|
48
|
+
const apiKey = req.headers["x-api-key"];
|
|
49
|
+
if (!apiKey) {
|
|
50
|
+
return res.status(401).json({ error: "Unauthorized: API key required" });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Validate API key against stored keys
|
|
54
|
+
const apiKeys = Array.isArray(settings.api_keys) ? settings.api_keys : [];
|
|
55
|
+
const isValid = apiKeys.some(k => k.key === apiKey);
|
|
56
|
+
|
|
57
|
+
if (!isValid) {
|
|
58
|
+
return res.status(401).json({ error: "Unauthorized: Invalid API key" });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Valid API key
|
|
62
|
+
next();
|
|
63
|
+
} catch (err) {
|
|
64
|
+
console.error("Auth middleware error:", err);
|
|
65
|
+
// Fail open on error to avoid breaking existing deployments
|
|
66
|
+
next();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
module.exports = { requireAuth, getCachedSettings };
|
|
@@ -55,6 +55,9 @@ router.get("/:name/packages", async (req, res, next) => {
|
|
|
55
55
|
return res.status(404).render("error", { message: `Adapter '${name}' not found` })
|
|
56
56
|
}
|
|
57
57
|
const packages = await adaptersService.getAdapterPackages(name)
|
|
58
|
+
if (req.headers.accept?.includes("application/json") || req.query.format === "json") {
|
|
59
|
+
return res.json({ packages })
|
|
60
|
+
}
|
|
58
61
|
res.render("adapter-packages", { adapter, packages })
|
|
59
62
|
} catch (err) {
|
|
60
63
|
next(err)
|
|
@@ -151,17 +154,6 @@ router.delete("/:name", async (req, res, next) => {
|
|
|
151
154
|
}
|
|
152
155
|
})
|
|
153
156
|
|
|
154
|
-
// Get adapter packages
|
|
155
|
-
router.get("/:name/packages", async (req, res, next) => {
|
|
156
|
-
try {
|
|
157
|
-
const { name } = req.params
|
|
158
|
-
const packages = await adaptersService.getAdapterPackages(name)
|
|
159
|
-
res.json({ packages })
|
|
160
|
-
} catch (err) {
|
|
161
|
-
next(err)
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
|
|
165
157
|
// Add package to adapter
|
|
166
158
|
router.post("/:name/packages", async (req, res, next) => {
|
|
167
159
|
try {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const { Router } = require("express");
|
|
2
|
+
const { getStorage } = require("../storage/adapter");
|
|
3
|
+
const { requireAuth } = require("../middleware/auth");
|
|
4
|
+
|
|
5
|
+
const router = Router();
|
|
6
|
+
|
|
7
|
+
// Helper function to handle errors
|
|
8
|
+
function handleError(res, err) {
|
|
9
|
+
console.error(err);
|
|
10
|
+
const status = err.status || 500;
|
|
11
|
+
const error = err.error || { code: 500, type: "internal_error", message: err.message || "Internal server error" };
|
|
12
|
+
res.status(status).json({ error });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// List clients endpoint
|
|
16
|
+
router.get("/", requireAuth, async (req, res) => {
|
|
17
|
+
try {
|
|
18
|
+
const storage = getStorage();
|
|
19
|
+
const clientKeys = await storage.listKeys("client:");
|
|
20
|
+
const clients = [];
|
|
21
|
+
|
|
22
|
+
for (const key of clientKeys) {
|
|
23
|
+
try {
|
|
24
|
+
const client = await storage.get(key);
|
|
25
|
+
if (client && client.client_id) {
|
|
26
|
+
clients.push(client);
|
|
27
|
+
}
|
|
28
|
+
} catch (err) {
|
|
29
|
+
// Skip if client read fails
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Sort by last_seen descending
|
|
34
|
+
clients.sort((a, b) => new Date(b.last_seen) - new Date(a.last_seen));
|
|
35
|
+
|
|
36
|
+
if (req.query.format !== "json" && req.accepts("html") && !req.xhr && !req.headers["x-requested-with"]) {
|
|
37
|
+
return res.render("clients", { clients });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
res.json({ clients });
|
|
41
|
+
} catch (err) {
|
|
42
|
+
handleError(res, err);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
module.exports = router;
|
package/server/routes/jobs.js
CHANGED
|
@@ -7,7 +7,7 @@ const router = Router()
|
|
|
7
7
|
router.post("/", async (req, res) => {
|
|
8
8
|
try {
|
|
9
9
|
const storage = getStorage()
|
|
10
|
-
const { command, args, status, duration_ms, timestamp, plan_id, error } = req.body
|
|
10
|
+
const { command, args, status, duration_ms, timestamp, plan_id, error, client_id } = req.body
|
|
11
11
|
|
|
12
12
|
// Generate a unique sequential-ish ID
|
|
13
13
|
const jobId = `job:${Date.now()}_${Math.random().toString(36).substring(2, 9)}`
|
|
@@ -20,7 +20,8 @@ router.post("/", async (req, res) => {
|
|
|
20
20
|
duration_ms: duration_ms || 0,
|
|
21
21
|
plan_id: plan_id || null,
|
|
22
22
|
error: error || null,
|
|
23
|
-
timestamp: timestamp || new Date().toISOString()
|
|
23
|
+
timestamp: timestamp || new Date().toISOString(),
|
|
24
|
+
client_id: client_id || null
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
await storage.set(jobId, doc)
|
package/server/routes/mcp.js
CHANGED
|
@@ -19,6 +19,7 @@ function sanitizeMcpPayload(payload, fallbackName) {
|
|
|
19
19
|
}
|
|
20
20
|
if (typeof payload.timeout_ms === "number" && payload.timeout_ms > 0) out.timeout_ms = payload.timeout_ms
|
|
21
21
|
if (payload.stateful === true || payload.stateful === "true" || payload.stateful === "on") out.stateful = true
|
|
22
|
+
if (typeof payload.pluginSource === "string") out.pluginSource = payload.pluginSource
|
|
22
23
|
return out
|
|
23
24
|
}
|
|
24
25
|
|