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,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.0.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Test Auth API",
|
|
5
|
+
"version": "1.0.0"
|
|
6
|
+
},
|
|
7
|
+
"servers": [
|
|
8
|
+
{
|
|
9
|
+
"url": "http://localhost:3001"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"paths": {
|
|
13
|
+
"/api/data": {
|
|
14
|
+
"get": {
|
|
15
|
+
"operationId": "getData",
|
|
16
|
+
"summary": "Get authenticated data",
|
|
17
|
+
"description": "Returns data when authenticated with Bearer token",
|
|
18
|
+
"responses": {
|
|
19
|
+
"200": {
|
|
20
|
+
"description": "Success",
|
|
21
|
+
"content": {
|
|
22
|
+
"application/json": {
|
|
23
|
+
"schema": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"properties": {
|
|
26
|
+
"message": {
|
|
27
|
+
"type": "string"
|
|
28
|
+
},
|
|
29
|
+
"data": {
|
|
30
|
+
"type": "object"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"401": {
|
|
38
|
+
"description": "Unauthorized"
|
|
39
|
+
},
|
|
40
|
+
"403": {
|
|
41
|
+
"description": "Forbidden"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"/api/key-data": {
|
|
47
|
+
"get": {
|
|
48
|
+
"operationId": "getKeyData",
|
|
49
|
+
"summary": "Get data with API key",
|
|
50
|
+
"description": "Returns data when authenticated with API key in X-Api-Key header",
|
|
51
|
+
"responses": {
|
|
52
|
+
"200": {
|
|
53
|
+
"description": "Success",
|
|
54
|
+
"content": {
|
|
55
|
+
"application/json": {
|
|
56
|
+
"schema": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"properties": {
|
|
59
|
+
"message": {
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
"data": {
|
|
63
|
+
"type": "object"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.0.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Test Auth API",
|
|
5
|
+
"version": "1.0.0"
|
|
6
|
+
},
|
|
7
|
+
"servers": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://httpbin.org"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"paths": {
|
|
13
|
+
"/bearer": {
|
|
14
|
+
"get": {
|
|
15
|
+
"operationId": "testBearerAuth",
|
|
16
|
+
"summary": "Test bearer auth",
|
|
17
|
+
"responses": {
|
|
18
|
+
"200": {
|
|
19
|
+
"description": "Returns authorization header"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"/headers": {
|
|
25
|
+
"get": {
|
|
26
|
+
"operationId": "testHeaderAuth",
|
|
27
|
+
"summary": "Returns request headers",
|
|
28
|
+
"responses": {
|
|
29
|
+
"200": {
|
|
30
|
+
"description": "Returns headers"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
<tr><td colspan="5" class="px-6 py-12 text-center text-[#787774]">No adapters yet. Create one to get started.</td></tr>
|
|
26
26
|
<% } %>
|
|
27
27
|
<% adapters.forEach(a => { %>
|
|
28
|
+
<% if (!a.name) return; %>
|
|
28
29
|
<tr class="border-b border-[#EAEAEA] hover:bg-[#F7F6F3] transition-colors">
|
|
29
30
|
<td class="px-6 py-4">
|
|
30
31
|
<div class="flex flex-col">
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
<%- include("partials/head", { title: "API Keys" }) %>
|
|
2
|
+
|
|
3
|
+
<div id="api-keys-app" class="max-w-4xl">
|
|
4
|
+
<div class="flex justify-between items-center mb-6">
|
|
5
|
+
<h1 class="text-2xl font-bold">API Keys</h1>
|
|
6
|
+
<div class="text-sm opacity-80">Manage API keys for CLI and programmatic access.</div>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div v-if="message.text" :class="['alert mb-4', message.type === 'error' ? 'alert-error' : 'alert-success']">
|
|
10
|
+
<span>{{ message.text }}</span>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="card bg-base-100 border border-base-300">
|
|
14
|
+
<div class="card-body">
|
|
15
|
+
<h2 class="card-title">Create New API Key</h2>
|
|
16
|
+
<div class="form-control">
|
|
17
|
+
<div class="label">
|
|
18
|
+
<span class="label-text">Key Name</span>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="flex gap-2">
|
|
21
|
+
<input v-model="newKeyName" class="input input-bordered flex-1" placeholder="e.g., 'CLI Agent' or 'Production'" />
|
|
22
|
+
<button class="btn btn-primary" @click="createApiKey">Create</button>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="card bg-base-100 border border-base-300 mt-4">
|
|
29
|
+
<div class="card-body">
|
|
30
|
+
<h2 class="card-title">Active API Keys</h2>
|
|
31
|
+
<div v-if="settings.api_keys && settings.api_keys.length > 0">
|
|
32
|
+
<table class="table table-zebra">
|
|
33
|
+
<thead>
|
|
34
|
+
<tr>
|
|
35
|
+
<th>Name</th>
|
|
36
|
+
<th>Key</th>
|
|
37
|
+
<th>Created</th>
|
|
38
|
+
<th>Action</th>
|
|
39
|
+
</tr>
|
|
40
|
+
</thead>
|
|
41
|
+
<tbody>
|
|
42
|
+
<tr v-for="apiKey in settings.api_keys" :key="apiKey.key">
|
|
43
|
+
<td>{{ apiKey.name }}</td>
|
|
44
|
+
<td>
|
|
45
|
+
<code>{{ apiKey.key.slice(0, 12) }}...</code>
|
|
46
|
+
<button class="btn btn-xs btn-ghost ml-2" @click="copyApiKey(apiKey.key)">📋</button>
|
|
47
|
+
</td>
|
|
48
|
+
<td>{{ new Date(apiKey.created_at).toLocaleString() }}</td>
|
|
49
|
+
<td>
|
|
50
|
+
<button class="btn btn-sm btn-error" @click="deleteApiKey(apiKey.key)">Delete</button>
|
|
51
|
+
</td>
|
|
52
|
+
</tr>
|
|
53
|
+
</tbody>
|
|
54
|
+
</table>
|
|
55
|
+
</div>
|
|
56
|
+
<div v-else class="text-center py-8 opacity-60">
|
|
57
|
+
<p>No API keys created yet</p>
|
|
58
|
+
<p class="text-sm mt-2">Create an API key to enable CLI and programmatic access to the server.</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<script>
|
|
65
|
+
const { createApp } = Vue
|
|
66
|
+
|
|
67
|
+
createApp({
|
|
68
|
+
data() {
|
|
69
|
+
return {
|
|
70
|
+
settings: {},
|
|
71
|
+
newKeyName: '',
|
|
72
|
+
message: { text: '', type: 'success' }
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
async mounted() {
|
|
76
|
+
await this.loadSettings()
|
|
77
|
+
},
|
|
78
|
+
methods: {
|
|
79
|
+
async loadSettings() {
|
|
80
|
+
try {
|
|
81
|
+
const res = await fetch('/api/settings?format=json')
|
|
82
|
+
const data = await res.json()
|
|
83
|
+
this.settings = data
|
|
84
|
+
} catch (err) {
|
|
85
|
+
this.setMessage('error', err.message)
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
async createApiKey() {
|
|
89
|
+
if (!this.newKeyName.trim()) {
|
|
90
|
+
this.setMessage('error', 'API key name is required')
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const res = await fetch('/api/api-keys', {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'Content-Type': 'application/json' },
|
|
97
|
+
body: JSON.stringify({ name: this.newKeyName })
|
|
98
|
+
})
|
|
99
|
+
const result = await res.json()
|
|
100
|
+
this.setMessage('success', `Created API key '${result.name}'`)
|
|
101
|
+
this.newKeyName = ''
|
|
102
|
+
await this.loadSettings()
|
|
103
|
+
} catch (err) {
|
|
104
|
+
this.setMessage('error', err.message)
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
async deleteApiKey(key) {
|
|
108
|
+
if (!confirm('Delete this API key?')) return
|
|
109
|
+
try {
|
|
110
|
+
await fetch(`/api/api-keys/${encodeURIComponent(key)}`, {
|
|
111
|
+
method: 'DELETE'
|
|
112
|
+
})
|
|
113
|
+
this.setMessage('success', 'API key deleted')
|
|
114
|
+
await this.loadSettings()
|
|
115
|
+
} catch (err) {
|
|
116
|
+
this.setMessage('error', err.message)
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
async copyApiKey(key) {
|
|
120
|
+
try {
|
|
121
|
+
// Fallback for non-HTTPS contexts
|
|
122
|
+
const textArea = document.createElement("textarea")
|
|
123
|
+
textArea.value = key
|
|
124
|
+
textArea.style.position = "fixed"
|
|
125
|
+
textArea.style.left = "-9999px"
|
|
126
|
+
document.body.appendChild(textArea)
|
|
127
|
+
textArea.select()
|
|
128
|
+
try {
|
|
129
|
+
document.execCommand("copy")
|
|
130
|
+
this.setMessage('success', 'API key copied to clipboard')
|
|
131
|
+
} catch (err) {
|
|
132
|
+
throw new Error('Copy failed')
|
|
133
|
+
}
|
|
134
|
+
document.body.removeChild(textArea)
|
|
135
|
+
} catch (err) {
|
|
136
|
+
this.setMessage('error', 'Failed to copy API key')
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
setMessage(type, text) {
|
|
140
|
+
this.message = { type, text }
|
|
141
|
+
setTimeout(() => this.message = { text: '', type: 'success' }, 3000)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}).mount('#api-keys-app')
|
|
145
|
+
</script>
|
|
146
|
+
|
|
147
|
+
<%- include("partials/foot") %>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<%- include("partials/head", { title: "Clients" }) %>
|
|
2
|
+
|
|
3
|
+
<div id="clients-app">
|
|
4
|
+
<div class="flex justify-between items-center mb-8">
|
|
5
|
+
<div>
|
|
6
|
+
<p class="text-xs uppercase tracking-[0.2em] text-[#787774] mb-1">Monitoring</p>
|
|
7
|
+
<h1 class="text-2xl editorial-heading text-[#111111]">Connected Clients</h1>
|
|
8
|
+
<p class="text-sm text-[#787774] mt-1">CLI clients that have synced plugin resources to this server</p>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="bento-card">
|
|
13
|
+
<div v-if="clients.length === 0" class="p-12 text-center text-[#787774]">
|
|
14
|
+
No clients have synced yet.
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<table v-else class="min-w-full divide-y divide-[#EAEAEA]">
|
|
18
|
+
<thead class="bg-[#F7F6F3]">
|
|
19
|
+
<tr>
|
|
20
|
+
<th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Client ID</th>
|
|
21
|
+
<th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Last Seen</th>
|
|
22
|
+
<th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Plugin Count</th>
|
|
23
|
+
</tr>
|
|
24
|
+
</thead>
|
|
25
|
+
<tbody class="bg-white divide-y divide-[#EAEAEA]">
|
|
26
|
+
<tr v-for="client in clients" :key="client.client_id" class="hover:bg-[#F7F6F3] transition-colors">
|
|
27
|
+
<td class="px-6 py-4">
|
|
28
|
+
<code class="mono-text text-sm text-[#1F6C9F]">{{ client.client_id.substring(0, 8) }}...</code>
|
|
29
|
+
</td>
|
|
30
|
+
<td class="px-6 py-4 text-sm text-[#2F3437]">
|
|
31
|
+
{{ formatLastSeen(client.last_seen) }}
|
|
32
|
+
</td>
|
|
33
|
+
<td class="px-6 py-4 text-sm text-[#2F3437]">
|
|
34
|
+
{{ client.plugin_count || 0 }}
|
|
35
|
+
</td>
|
|
36
|
+
</tr>
|
|
37
|
+
</tbody>
|
|
38
|
+
</table>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<script>
|
|
43
|
+
const { createApp } = Vue
|
|
44
|
+
|
|
45
|
+
createApp({
|
|
46
|
+
data() {
|
|
47
|
+
return {
|
|
48
|
+
clients: []
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
async mounted() {
|
|
52
|
+
await this.fetchClients()
|
|
53
|
+
},
|
|
54
|
+
methods: {
|
|
55
|
+
async fetchClients() {
|
|
56
|
+
try {
|
|
57
|
+
const r = await fetch('/api/plugins/clients?format=json')
|
|
58
|
+
const data = await r.json()
|
|
59
|
+
this.clients = data.clients || []
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.error('Failed to fetch clients:', err)
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
formatLastSeen(dateStr) {
|
|
65
|
+
if (!dateStr) return 'Never'
|
|
66
|
+
const date = new Date(dateStr)
|
|
67
|
+
const now = new Date()
|
|
68
|
+
const diffMs = now - date
|
|
69
|
+
const diffMins = Math.floor(diffMs / 60000)
|
|
70
|
+
const diffHours = Math.floor(diffMs / 3600000)
|
|
71
|
+
const diffDays = Math.floor(diffMs / 86400000)
|
|
72
|
+
|
|
73
|
+
if (diffMins < 1) return 'Just now'
|
|
74
|
+
if (diffMins < 60) return `${diffMins} min ago`
|
|
75
|
+
if (diffHours < 24) return `${diffHours}h ago`
|
|
76
|
+
if (diffDays < 7) return `${diffDays}d ago`
|
|
77
|
+
return date.toLocaleDateString()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}).mount('#clients-app')
|
|
81
|
+
</script>
|
|
82
|
+
|
package/server/views/jobs.ejs
CHANGED
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
<th>Status</th>
|
|
35
35
|
<th>Duration</th>
|
|
36
36
|
<th>Timestamp</th>
|
|
37
|
+
<th>Client</th>
|
|
37
38
|
</tr>
|
|
38
39
|
</thead>
|
|
39
40
|
<tbody>
|
|
40
|
-
<tr v-if="jobs.length===0"><td colspan="
|
|
41
|
+
<tr v-if="jobs.length===0"><td colspan="5" class="text-center opacity-60">No executions recorded yet.</td></tr>
|
|
41
42
|
<tr v-for="j in jobs" :key="j._id">
|
|
42
43
|
<td><code>{{ j.command }}</code></td>
|
|
43
44
|
<td>
|
|
@@ -46,7 +47,15 @@
|
|
|
46
47
|
</span>
|
|
47
48
|
</td>
|
|
48
49
|
<td>{{ j.duration_ms }}ms</td>
|
|
49
|
-
<td class="opacity-70">
|
|
50
|
+
<td class="opacity-70">
|
|
51
|
+
<span :title="new Date(j.timestamp).toLocaleString()" class="cursor-help">
|
|
52
|
+
{{ formatRelativeTime(j.timestamp) }}
|
|
53
|
+
</span>
|
|
54
|
+
</td>
|
|
55
|
+
<td class="opacity-70">
|
|
56
|
+
<code v-if="j.client_id" class="text-xs">{{ j.client_id.substring(0, 8) }}...</code>
|
|
57
|
+
<span v-else class="text-xs opacity-50">-</span>
|
|
58
|
+
</td>
|
|
50
59
|
</tr>
|
|
51
60
|
</tbody>
|
|
52
61
|
</table>
|
|
@@ -64,6 +73,21 @@
|
|
|
64
73
|
async loadStats() {
|
|
65
74
|
const r = await fetch('/api/jobs/stats')
|
|
66
75
|
this.stats = await r.json()
|
|
76
|
+
},
|
|
77
|
+
formatRelativeTime(dateStr) {
|
|
78
|
+
if (!dateStr) return 'Never'
|
|
79
|
+
const date = new Date(dateStr)
|
|
80
|
+
const now = new Date()
|
|
81
|
+
const diffMs = now - date
|
|
82
|
+
const diffMins = Math.floor(diffMs / 60000)
|
|
83
|
+
const diffHours = Math.floor(diffMs / 3600000)
|
|
84
|
+
const diffDays = Math.floor(diffMs / 86400000)
|
|
85
|
+
|
|
86
|
+
if (diffMins < 1) return 'Just now'
|
|
87
|
+
if (diffMins < 60) return `${diffMins}m ago`
|
|
88
|
+
if (diffHours < 24) return `${diffHours}h ago`
|
|
89
|
+
if (diffDays < 7) return `${diffDays}d ago`
|
|
90
|
+
return date.toLocaleDateString()
|
|
67
91
|
}
|
|
68
92
|
}
|
|
69
93
|
}).mount('#jobs-app')
|
package/server/views/layout.ejs
CHANGED
|
@@ -88,27 +88,41 @@
|
|
|
88
88
|
<body>
|
|
89
89
|
|
|
90
90
|
<div class="flex min-h-screen">
|
|
91
|
-
<!-- Sidebar -->
|
|
92
|
-
<aside class="w-64 bg-white
|
|
93
|
-
<
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
91
|
+
<!-- Sidebar navigation -->
|
|
92
|
+
<aside class="w-64 bg-white border-r border-[#EAEAEA] p-6">
|
|
93
|
+
<div class="mb-8">
|
|
94
|
+
<h1 class="text-xl font-bold editorial-heading">SUPERCLI</h1>
|
|
95
|
+
<p class="text-sm text-[#787774]">Command Control Plane</p>
|
|
96
|
+
</div>
|
|
97
|
+
<nav class="space-y-2">
|
|
98
|
+
<a href="/api/plugins" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
99
|
+
Plugins
|
|
100
|
+
</a>
|
|
101
|
+
<a href="/api/settings" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
102
|
+
Settings
|
|
103
|
+
</a>
|
|
104
|
+
<a href="/api/api-keys" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
105
|
+
API Keys
|
|
106
|
+
</a>
|
|
107
|
+
<a href="/api/commands" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
108
|
+
Commands
|
|
109
|
+
</a>
|
|
110
|
+
<a href="/api/jobs" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
111
|
+
Jobs
|
|
112
|
+
</a>
|
|
113
|
+
<a href="/api/clients" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
114
|
+
Clients
|
|
115
|
+
</a>
|
|
116
|
+
<a href="/api/adapters" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
117
|
+
Adapters
|
|
118
|
+
</a>
|
|
119
|
+
<a href="/api/specs" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
120
|
+
OpenAPI Specs
|
|
121
|
+
</a>
|
|
122
|
+
<a href="/api/mcp" class="block px-4 py-2 rounded-lg hover:bg-[#F7F6F3] transition-colors">
|
|
123
|
+
MCP Servers
|
|
124
|
+
</a>
|
|
125
|
+
</nav>
|
|
112
126
|
</aside>
|
|
113
127
|
|
|
114
128
|
<!-- Main content -->
|