superacli 1.1.20 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/cli/adapter-schema.js +1 -6
  2. package/cli/config.js +95 -0
  3. package/cli/executor.js +90 -11
  4. package/cli/server-command.js +395 -0
  5. package/cli/supercli.js +82 -1
  6. package/docs/adapters.md +159 -0
  7. package/docs/changelog-2026-04.html +15 -0
  8. package/docs/index.html +314 -98
  9. package/docs/meta-plugins.json +24424 -1247
  10. package/docs/plugins-examples.md +8 -8
  11. package/docs/plugins-how-to.md +0 -13
  12. package/docs/plugins.html +165 -61
  13. package/docs/server.md +50 -0
  14. package/graphify-out/GRAPH_REPORT.md +141 -136
  15. package/graphify-out/cache/1821936911d6eb3130499b6b45b8e6d760d6c05328131e115ac9825a5e3061cd.json +1 -0
  16. package/graphify-out/cache/20b0e1261b41286d639e7b039c8143682001981f607e26eb2a492a06f12c233a.json +1 -0
  17. package/graphify-out/cache/21dc011c08a0813ac33c0520c9cf131d8922e6007df7d9b51df740974fee5fb3.json +1 -0
  18. package/graphify-out/cache/22d3d43c24fdff310ab8445bd442fbcf4714872c6950f15b90777e5a8358dcd9.json +1 -0
  19. package/graphify-out/cache/2b8a3fbc23afe7bbc1a5ecb60d4074f39afdf6cb42120922176c280f4cc4ab4b.json +1 -0
  20. package/graphify-out/cache/37418b8b152d9c436d75361969c39bc74a76260ab7209ceabf455f80452f1654.json +1 -0
  21. package/graphify-out/cache/3b9aae57e4326f5862f8153c13b7d809a34c422996993e7b491c5ea3a66b5e04.json +1 -0
  22. package/graphify-out/cache/448f8e0c5e77cfb15fa625ed40ee0dc1622d9814d24905fe4c12c4d175131dc9.json +1 -0
  23. package/graphify-out/cache/47dd42009ceac28b7a7fec5586e565e7bc850c80be96b8329e1ed7c49efbe34f.json +1 -0
  24. package/graphify-out/cache/492712949d38efbe312c303fe717e5c93e1ecc8888e1ceb855750afc48caffdb.json +1 -0
  25. package/graphify-out/cache/494fd6af80b6a1bb7a2a5641c6ad11e2fbe2a67b5a2b3ff57fd04bb49ccad1c4.json +1 -0
  26. package/graphify-out/cache/4b31b0de656deff083119780df64d17205c45e72233987e1c495f2121c4923fd.json +1 -0
  27. package/graphify-out/cache/5a16fa8cdd687a39661321adb39186ce8cf924a79ef936e42b365380b5e3543e.json +1 -0
  28. package/graphify-out/cache/644fcb129e595cfdb4e3a9757ed9658230347f5ed0652be45a894528a2b6585b.json +1 -0
  29. package/graphify-out/cache/6b8762db2c5f51408cf49d915f3e44bcc25c7ebb32abc635307fdf2a672b370c.json +1 -0
  30. package/graphify-out/cache/6db88050060880e56dd26ec58f29e3b56a409ace48e31bc75f54cab7dc74e409.json +1 -0
  31. package/graphify-out/cache/7932d1b6a9751b2cb2f4dc6b4e5f9fd7dcc2cee82d7866ec3d655482010533c0.json +1 -0
  32. package/graphify-out/cache/8140a76ff5b70dfdd0d020aeffff27f87af39da5b237c35baa938fcc4b288ba5.json +1 -0
  33. package/graphify-out/cache/8876638878758733a412bd4ca4cbd22863322689fbba9f037d92abfa877ea3ab.json +1 -0
  34. package/graphify-out/cache/90445359c448f8135207ddcd378c8391b9274460064cf998f1ea2ad6f2173703.json +1 -0
  35. package/graphify-out/cache/b01f675bb3942d2e8f359d11c38d52f28487544f54cdef518c60b7d8dfd2b383.json +1 -0
  36. package/graphify-out/cache/bc353b40b348d54c730d8498af675f57998b14ae796b4f952cdc200147008f13.json +1 -0
  37. package/graphify-out/cache/c38b2e784b1c441121b422db0c79b4911fb525d2a3cfad10d3fd561a07900bd5.json +1 -0
  38. package/graphify-out/cache/ce9df9bb2d36ecf310a53fb34526168bdf25773edf0826c1f55accebfa3c012d.json +1 -0
  39. package/graphify-out/cache/ceaeb0f99851d313b29cb1440240db1cf835de425b9b0c1e58fa3035355c2b2b.json +1 -0
  40. package/graphify-out/cache/d8f3e78931a41cd0f367fdab1d11b634bbffb2c90280c75a80a1a53a6b2d6bc7.json +1 -0
  41. package/graphify-out/cache/f574e4ce3bcb1250ca88410519fb4fd26c5b6cd786039410880fbd6e606ab23f.json +1 -0
  42. package/graphify-out/cache/faa65636d5f779b8b1c790dde11cc6470b48125bf42a12a77651827fd1653fd7.json +1 -0
  43. package/graphify-out/graph.json +4173 -2115
  44. package/ideal-plugins.csv +124 -0
  45. package/package.json +3 -2
  46. package/plugin-scores.csv +999 -0
  47. package/plugins/beads/plugin.json +2 -2
  48. package/plugins/biome/install-guidance.json +11 -0
  49. package/plugins/biome/meta.json +13 -0
  50. package/plugins/biome/plugin.json +83 -0
  51. package/plugins/biome/skills/quickstart/SKILL.md +25 -0
  52. package/plugins/bore/install-guidance.json +11 -0
  53. package/plugins/bore/meta.json +11 -0
  54. package/plugins/bore/plugin.json +65 -0
  55. package/plugins/bore/skills/quickstart/SKILL.md +25 -0
  56. package/plugins/ccf-deadlines/install-guidance.json +11 -0
  57. package/plugins/ccf-deadlines/meta.json +11 -0
  58. package/plugins/ccf-deadlines/plugin.json +28 -0
  59. package/plugins/ccf-deadlines/skills/quickstart/SKILL.md +25 -0
  60. package/plugins/code2prompt/install-guidance.json +11 -0
  61. package/plugins/code2prompt/meta.json +12 -0
  62. package/plugins/code2prompt/plugin.json +46 -0
  63. package/plugins/code2prompt/skills/quickstart/SKILL.md +25 -0
  64. package/plugins/commiat/install-guidance.json +10 -0
  65. package/plugins/commiat/plugin.json +2 -2
  66. package/plugins/dua-cli/install-guidance.json +11 -0
  67. package/plugins/dua-cli/meta.json +11 -0
  68. package/plugins/dua-cli/plugin.json +57 -0
  69. package/plugins/dua-cli/skills/quickstart/SKILL.md +25 -0
  70. package/plugins/forever/install-guidance.json +11 -0
  71. package/plugins/forever/meta.json +11 -0
  72. package/plugins/forever/plugin.json +75 -0
  73. package/plugins/forever/skills/quickstart/SKILL.md +25 -0
  74. package/plugins/gitmoji-cli/install-guidance.json +11 -0
  75. package/plugins/gitmoji-cli/meta.json +11 -0
  76. package/plugins/gitmoji-cli/plugin.json +49 -0
  77. package/plugins/gitmoji-cli/skills/quickstart/SKILL.md +25 -0
  78. package/plugins/google-maps-scraper/plugin.json +1 -1
  79. package/plugins/gwc/install-guidance.json +10 -0
  80. package/plugins/gwc/plugin.json +2 -2
  81. package/plugins/quarto/install-guidance.json +11 -0
  82. package/plugins/quarto/meta.json +11 -0
  83. package/plugins/quarto/plugin.json +61 -0
  84. package/plugins/quarto/skills/quickstart/SKILL.md +25 -0
  85. package/plugins/readme-md-generator/install-guidance.json +11 -0
  86. package/plugins/readme-md-generator/meta.json +11 -0
  87. package/plugins/readme-md-generator/plugin.json +28 -0
  88. package/plugins/readme-md-generator/skills/quickstart/SKILL.md +25 -0
  89. package/plugins/twarc/install-guidance.json +11 -0
  90. package/plugins/twarc/meta.json +13 -0
  91. package/plugins/twarc/plugin.json +165 -0
  92. package/plugins/twarc/skills/quickstart/SKILL.md +61 -0
  93. package/plugins/vale/install-guidance.json +11 -0
  94. package/plugins/vale/meta.json +12 -0
  95. package/plugins/vale/plugin.json +50 -0
  96. package/plugins/vale/skills/quickstart/SKILL.md +25 -0
  97. package/plugins/volta/install-guidance.json +11 -0
  98. package/plugins/volta/meta.json +12 -0
  99. package/plugins/volta/plugin.json +75 -0
  100. package/plugins/volta/skills/quickstart/SKILL.md +25 -0
  101. package/plugins/wgcf/install-guidance.json +11 -0
  102. package/plugins/wgcf/meta.json +12 -0
  103. package/plugins/wgcf/plugin.json +45 -0
  104. package/plugins/wgcf/skills/quickstart/SKILL.md +25 -0
  105. package/scripts/analyze-plugins.js +130 -0
  106. package/scripts/enrich-meta-plugins.js +67 -0
  107. package/server/app.js +23 -1
  108. package/server/routes/adapters.js +356 -0
  109. package/server/routes/dashboard.js +113 -0
  110. package/server/routes/jobs.js +26 -0
  111. package/server/services/adaptersService.js +284 -0
  112. package/server/services/pluginsService.js +4 -0
  113. package/server/views/adapter-edit.ejs +226 -0
  114. package/server/views/adapter-packages.ejs +191 -0
  115. package/server/views/adapters.ejs +112 -0
  116. package/server/views/command-edit.ejs +48 -21
  117. package/server/views/commands.ejs +25 -22
  118. package/server/views/dashboard.ejs +196 -0
  119. package/server/views/layout.ejs +94 -14
  120. package/server/views/mcp.ejs +38 -35
  121. package/server/views/partials/head.ejs +88 -12
  122. package/server/views/plugins.ejs +9 -0
  123. package/server/views/specs.ejs +33 -30
  124. package/cli/adapters/builtin.js +0 -43
  125. package/index.html +0 -384
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -8,31 +8,111 @@
8
8
  <script src="https://cdn.tailwindcss.com"></script>
9
9
  <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
10
10
  <style>
11
- body { min-height: 100vh; }
12
- .nav-active { background: oklch(var(--p)/0.15); color: oklch(var(--p)); }
11
+ @import url('https://fonts.googleapis.com/css2?family=Newsreader:wght@400;500;600&family=Geist:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');
12
+
13
+ body {
14
+ font-family: 'Geist', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
15
+ background-color: #FBFBFA;
16
+ color: #111111;
17
+ line-height: 1.6;
18
+ min-height: 100vh;
19
+ }
20
+
21
+ .editorial-heading {
22
+ font-family: 'Newsreader', serif;
23
+ font-weight: 500;
24
+ letter-spacing: -0.02em;
25
+ }
26
+
27
+ .mono-text {
28
+ font-family: 'JetBrains Mono', monospace;
29
+ }
30
+
31
+ .nav-active {
32
+ background-color: #F7F6F3;
33
+ color: #111111;
34
+ }
35
+
36
+ .bento-card {
37
+ background: white;
38
+ border: 1px solid #EAEAEA;
39
+ border-radius: 0.5rem;
40
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
41
+ }
42
+
43
+ .bento-card:hover {
44
+ border-color: #111111;
45
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
46
+ }
47
+
48
+ .btn {
49
+ border: 1px solid #EAEAEA;
50
+ background: white;
51
+ color: #111111;
52
+ padding: 0.5rem 1rem;
53
+ border-radius: 0.375rem;
54
+ font-weight: 500;
55
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
56
+ }
57
+
58
+ .btn:hover {
59
+ border-color: #111111;
60
+ background: #F7F6F3;
61
+ }
62
+
63
+ .btn-primary {
64
+ background: #111111;
65
+ color: white;
66
+ border-color: #111111;
67
+ }
68
+
69
+ .btn-primary:hover {
70
+ background: #333333;
71
+ }
72
+
73
+ .badge {
74
+ display: inline-block;
75
+ padding: 0.25rem 0.5rem;
76
+ font-size: 0.75rem;
77
+ border-radius: 9999px;
78
+ background: #F7F6F3;
79
+ color: #787774;
80
+ }
81
+
82
+ .badge-outline {
83
+ background: transparent;
84
+ border: 1px solid #EAEAEA;
85
+ }
13
86
  </style>
14
87
  </head>
15
- <body class="bg-base-200">
88
+ <body>
16
89
 
17
90
  <div class="flex min-h-screen">
18
91
  <!-- Sidebar -->
19
- <aside class="w-64 bg-base-300 p-4 flex flex-col gap-2 border-r border-base-content/10">
20
- <a href="/api/commands" class="text-xl font-bold px-3 py-2 mb-4 flex items-center gap-2">
21
- <span class="text-primary">⚡</span> SUPERCLI
92
+ <aside class="w-64 bg-white p-6 flex flex-col gap-2 border-r border-[#EAEAEA]">
93
+ <a href="/api/commands" class="text-xl editorial-heading px-3 py-2 mb-6 flex items-center gap-2">
94
+ <span>⚡</span> SUPERCLI
22
95
  </a>
23
- <a href="/api/commands" class="btn btn-ghost justify-start <%= typeof commands !== 'undefined' ? 'nav-active' : '' %>">
24
- 📋 Commands
96
+ <a href="/" class="btn justify-start">Dashboard</a>
97
+ <a href="/api/commands" class="btn justify-start <%= typeof commands !== 'undefined' ? 'nav-active' : '' %>">
98
+ Commands
25
99
  </a>
26
- <a href="/api/specs" class="btn btn-ghost justify-start <%= typeof specs !== 'undefined' ? 'nav-active' : '' %>">
27
- 📄 OpenAPI Specs
100
+ <a href="/api/specs" class="btn justify-start <%= typeof specs !== 'undefined' ? 'nav-active' : '' %>">
101
+ OpenAPI Specs
28
102
  </a>
29
- <a href="/api/mcp" class="btn btn-ghost justify-start <%= typeof servers !== 'undefined' ? 'nav-active' : '' %>">
30
- 🔌 MCP Servers
103
+ <a href="/api/mcp" class="btn justify-start <%= typeof servers !== 'undefined' ? 'nav-active' : '' %>">
104
+ MCP Servers
105
+ </a>
106
+ <a href="/api/jobs" class="btn justify-start <%= typeof jobs !== 'undefined' ? 'nav-active' : '' %>">
107
+ Jobs
108
+ </a>
109
+ <a href="/api/plugins" class="btn justify-start <%= typeof plugins !== 'undefined' ? 'nav-active' : '' %>">
110
+ Plugins
31
111
  </a>
32
112
  </aside>
33
113
 
34
114
  <!-- Main content -->
35
- <main class="flex-1 p-8">
115
+ <main class="flex-1 p-8 bg-[#FBFBFA]">
36
116
  <%- body %>
37
117
  </main>
38
118
  </div>
@@ -1,60 +1,63 @@
1
1
  <%- include("partials/head", { title: "MCP Servers" }) %>
2
2
 
3
3
  <div id="mcp-app">
4
- <div class="flex justify-between items-center mb-6">
5
- <h1 class="text-2xl font-bold">MCP Servers</h1>
6
- <button @click="showForm=!showForm" class="btn btn-primary btn-sm">+ Add Server</button>
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">Management</p>
7
+ <h1 class="text-2xl editorial-heading text-[#111111]">MCP Servers</h1>
8
+ </div>
9
+ <button @click="showForm=!showForm" class="btn btn-primary">+ Add Server</button>
7
10
  </div>
8
11
 
9
12
  <!-- Add form -->
10
- <div v-if="showForm" class="card bg-base-300 p-4 mb-6">
13
+ <div v-if="showForm" class="bento-card p-6 mb-6">
11
14
  <form @submit.prevent="create">
12
- <div class="flex gap-4 items-end mb-3">
13
- <div class="form-control flex-1">
14
- <label class="label"><span class="label-text">Name</span></label>
15
- <input v-model="form.name" class="input input-bordered input-sm" required placeholder="e.g. context-mode">
15
+ <div class="flex flex-col md:flex-row gap-4 items-end mb-4">
16
+ <div class="flex-1 w-full">
17
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Name</label>
18
+ <input v-model="form.name" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" required placeholder="e.g. context-mode">
16
19
  </div>
17
- <div class="form-control flex-1">
18
- <label class="label"><span class="label-text">URL (HTTP MCP)</span></label>
19
- <input v-model="form.url" class="input input-bordered input-sm" placeholder="https://mcp.example.com">
20
+ <div class="flex-1 w-full">
21
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">URL (HTTP MCP)</label>
22
+ <input v-model="form.url" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="https://mcp.example.com">
20
23
  </div>
21
- <div class="form-control flex-1">
22
- <label class="label"><span class="label-text">Command (stdio MCP)</span></label>
23
- <input v-model="form.command" class="input input-bordered input-sm" placeholder="e.g. context-mode">
24
+ <div class="flex-1 w-full">
25
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Command (stdio MCP)</label>
26
+ <input v-model="form.command" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="e.g. context-mode">
24
27
  </div>
25
28
  </div>
26
29
  <div class="flex gap-4 items-center">
27
- <label class="label cursor-pointer gap-2">
28
- <input type="checkbox" v-model="form.stateful" class="checkbox checkbox-sm checkbox-primary">
29
- <span class="label-text">Stateful (requires daemon)</span>
30
+ <label class="flex items-center gap-2 cursor-pointer">
31
+ <input type="checkbox" v-model="form.stateful" class="w-4 h-4 accent-[#111111]">
32
+ <span class="text-sm text-[#2F3437]">Stateful (requires daemon)</span>
30
33
  </label>
31
- <button type="submit" class="btn btn-primary btn-sm">Save</button>
32
- <button type="button" @click="showForm=false" class="btn btn-ghost btn-sm">Cancel</button>
34
+ <button type="submit" class="btn btn-primary">Save</button>
35
+ <button type="button" @click="showForm=false" class="btn">Cancel</button>
33
36
  </div>
34
37
  </form>
35
38
  </div>
36
39
 
37
- <div class="overflow-x-auto">
38
- <table class="table table-zebra w-full">
40
+ <div class="bento-card overflow-hidden">
41
+ <table class="w-full">
39
42
  <thead>
40
- <tr>
41
- <th>Name</th>
42
- <th>Source</th>
43
- <th>Type</th>
44
- <th>Actions</th>
43
+ <tr class="border-b border-[#EAEAEA] bg-[#F7F6F3]">
44
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Name</th>
45
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Source</th>
46
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Type</th>
47
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Actions</th>
45
48
  </tr>
46
49
  </thead>
47
50
  <tbody>
48
- <tr v-if="servers.length===0"><td colspan="4" class="text-center opacity-60">No MCP servers registered.</td></tr>
49
- <tr v-for="s in servers" :key="s._id">
50
- <td><code>{{ s.name }}</code></td>
51
- <td class="max-w-xs truncate opacity-70">{{ s.url || s.command || '' }}</td>
52
- <td>
53
- <span v-if="s.stateful" class="badge badge-primary badge-sm">stateful</span>
54
- <span v-else class="badge badge-ghost badge-sm">{{ s.url ? 'http' : 'stdio' }}</span>
51
+ <tr v-if="servers.length===0"><td colspan="4" class="px-6 py-12 text-center text-[#787774]">No MCP servers registered.</td></tr>
52
+ <tr v-for="s in servers" :key="s._id" class="border-b border-[#EAEAEA] hover:bg-[#F7F6F3] transition-colors">
53
+ <td class="px-6 py-4"><code class="mono-text text-sm text-[#1F6C9F]">{{ s.name }}</code></td>
54
+ <td class="px-6 py-4 max-w-xs truncate text-[#2F3437]">{{ s.url || s.command || '' }}</td>
55
+ <td class="px-6 py-4">
56
+ <span v-if="s.stateful" class="badge bg-[#111111] text-white">stateful</span>
57
+ <span v-else class="badge">{{ s.url ? 'http' : 'stdio' }}</span>
55
58
  </td>
56
- <td>
57
- <button @click="remove(s._id)" class="btn btn-xs btn-error btn-outline">Delete</button>
59
+ <td class="px-6 py-4">
60
+ <button @click="remove(s._id)" class="btn text-xs border-red-200 text-red-600 hover:bg-red-50 hover:border-red-300">Delete</button>
58
61
  </td>
59
62
  </tr>
60
63
  </tbody>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -8,21 +8,97 @@
8
8
  <script src="https://cdn.tailwindcss.com"></script>
9
9
  <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
10
10
  <style>
11
- .nav-active { background: oklch(var(--p)/0.15); color: oklch(var(--p)); }
11
+ @import url('https://fonts.googleapis.com/css2?family=Newsreader:wght@400;500;600&family=Geist:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');
12
+
13
+ body {
14
+ font-family: 'Geist', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
15
+ background-color: #FBFBFA;
16
+ color: #111111;
17
+ line-height: 1.6;
18
+ min-height: 100vh;
19
+ }
20
+
21
+ .editorial-heading {
22
+ font-family: 'Newsreader', serif;
23
+ font-weight: 500;
24
+ letter-spacing: -0.02em;
25
+ }
26
+
27
+ .mono-text {
28
+ font-family: 'JetBrains Mono', monospace;
29
+ }
30
+
31
+ .nav-active {
32
+ background-color: #F7F6F3;
33
+ color: #111111;
34
+ }
35
+
36
+ .bento-card {
37
+ background: white;
38
+ border: 1px solid #EAEAEA;
39
+ border-radius: 0.5rem;
40
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
41
+ }
42
+
43
+ .bento-card:hover {
44
+ border-color: #111111;
45
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
46
+ }
47
+
48
+ .btn {
49
+ border: 1px solid #EAEAEA;
50
+ background: white;
51
+ color: #111111;
52
+ padding: 0.5rem 1rem;
53
+ border-radius: 0.375rem;
54
+ font-weight: 500;
55
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
56
+ }
57
+
58
+ .btn:hover {
59
+ border-color: #111111;
60
+ background: #F7F6F3;
61
+ }
62
+
63
+ .btn-primary {
64
+ background: #111111;
65
+ color: white;
66
+ border-color: #111111;
67
+ }
68
+
69
+ .btn-primary:hover {
70
+ background: #333333;
71
+ }
72
+
73
+ .badge {
74
+ display: inline-block;
75
+ padding: 0.25rem 0.5rem;
76
+ font-size: 0.75rem;
77
+ border-radius: 9999px;
78
+ background: #F7F6F3;
79
+ color: #787774;
80
+ }
81
+
82
+ .badge-outline {
83
+ background: transparent;
84
+ border: 1px solid #EAEAEA;
85
+ }
12
86
  </style>
13
87
  </head>
14
- <body class="bg-base-200 min-h-screen">
88
+ <body>
15
89
  <div class="flex min-h-screen">
16
90
  <!-- Sidebar -->
17
- <aside class="w-64 bg-base-300 p-4 flex flex-col gap-2 border-r border-base-content/10">
18
- <a href="/api/commands" class="text-xl font-bold px-3 py-2 mb-4 flex items-center gap-2">
19
- <span class="text-primary">⚡</span> SUPERCLI
91
+ <aside class="w-64 bg-white p-6 flex flex-col gap-2 border-r border-[#EAEAEA]">
92
+ <a href="/api/commands" class="text-xl editorial-heading px-3 py-2 mb-6 flex items-center gap-2">
93
+ <span>⚡</span> SUPERCLI
20
94
  </a>
21
- <a href="/api/commands" class="btn btn-ghost justify-start" id="nav-commands">📋 Commands</a>
22
- <a href="/api/specs" class="btn btn-ghost justify-start" id="nav-specs">📄 OpenAPI Specs</a>
23
- <a href="/api/mcp" class="btn btn-ghost justify-start" id="nav-mcp">🔌 MCP Servers</a>
24
- <a href="/api/plugins" class="btn btn-ghost justify-start" id="nav-plugins">🧩 Server Plugins</a>
25
- <a href="/api/jobs" class="btn btn-ghost justify-start" id="nav-jobs">📊 Jobs</a>
95
+ <a href="/" class="btn justify-start" id="nav-dashboard">Dashboard</a>
96
+ <a href="/api/commands" class="btn justify-start" id="nav-commands">Commands</a>
97
+ <a href="/api/adapters" class="btn justify-start" id="nav-adapters">Adapters</a>
98
+ <a href="/api/specs" class="btn justify-start" id="nav-specs">OpenAPI Specs</a>
99
+ <a href="/api/mcp" class="btn justify-start" id="nav-mcp">MCP Servers</a>
100
+ <a href="/api/plugins" class="btn justify-start" id="nav-plugins">Server Plugins</a>
101
+ <a href="/api/jobs" class="btn justify-start" id="nav-jobs">Jobs</a>
26
102
  </aside>
27
103
  <!-- Main content -->
28
- <main class="flex-1 p-8">
104
+ <main class="flex-1 p-8 bg-[#FBFBFA]">
@@ -10,6 +10,11 @@
10
10
  <span>{{ message.text }}</span>
11
11
  </div>
12
12
 
13
+ <div v-if="settings.admin_mode_enabled" class="alert alert-error mb-4">
14
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 shrink-0 stroke-current" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>
15
+ <span><strong>Admin Mode Enabled:</strong> CLI clients can modify server state without authentication. Disable when not needed.</span>
16
+ </div>
17
+
13
18
  <div class="grid grid-cols-1 lg:grid-cols-3 gap-4 mb-6">
14
19
  <div class="card bg-base-100 border border-base-300">
15
20
  <div class="card-body p-4">
@@ -25,6 +30,10 @@
25
30
  <option value="allow">allow</option>
26
31
  </select>
27
32
  </label>
33
+ <label class="label cursor-pointer justify-start gap-2 mb-3">
34
+ <input type="checkbox" v-model="settings.admin_mode_enabled" class="checkbox checkbox-error checkbox-sm" />
35
+ <span class="label-text text-xs text-error font-semibold">Admin Mode (allows CLI modifications)</span>
36
+ </label>
28
37
  <button class="btn btn-sm btn-primary" @click="saveSettings">Save Settings</button>
29
38
  </div>
30
39
  </div>
@@ -1,54 +1,57 @@
1
1
  <%- include("partials/head", { title: "OpenAPI Specs" }) %>
2
2
 
3
3
  <div id="specs-app">
4
- <div class="flex justify-between items-center mb-6">
5
- <h1 class="text-2xl font-bold">OpenAPI Specs</h1>
6
- <button @click="showForm=!showForm" class="btn btn-primary btn-sm">+ Add Spec</button>
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">Management</p>
7
+ <h1 class="text-2xl editorial-heading text-[#111111]">OpenAPI Specs</h1>
8
+ </div>
9
+ <button @click="showForm=!showForm" class="btn btn-primary">+ Add Spec</button>
7
10
  </div>
8
11
 
9
12
  <!-- Add form -->
10
- <div v-if="showForm" class="card bg-base-300 p-4 mb-6">
11
- <form @submit.prevent="create" class="flex gap-4 items-end">
12
- <div class="form-control flex-1">
13
- <label class="label"><span class="label-text">Name</span></label>
14
- <input v-model="form.name" class="input input-bordered input-sm" required placeholder="e.g. referential-api">
13
+ <div v-if="showForm" class="bento-card p-6 mb-6">
14
+ <form @submit.prevent="create" class="flex flex-col md:flex-row gap-4 items-end">
15
+ <div class="flex-1 w-full">
16
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Name</label>
17
+ <input v-model="form.name" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" required placeholder="e.g. referential-api">
15
18
  </div>
16
- <div class="form-control flex-1">
17
- <label class="label"><span class="label-text">URL</span></label>
18
- <input v-model="form.url" class="input input-bordered input-sm" required placeholder="https://api.example.com/openapi.json">
19
+ <div class="flex-1 w-full">
20
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">URL</label>
21
+ <input v-model="form.url" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" required placeholder="https://api.example.com/openapi.json">
19
22
  </div>
20
- <div class="form-control">
21
- <label class="label"><span class="label-text">Auth</span></label>
22
- <select v-model="form.auth" class="select select-bordered select-sm">
23
+ <div class="w-full md:w-32">
24
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Auth</label>
25
+ <select v-model="form.auth" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors">
23
26
  <option value="none">none</option>
24
27
  <option value="oauth">oauth</option>
25
28
  <option value="apiKey">apiKey</option>
26
29
  <option value="jwt">jwt</option>
27
30
  </select>
28
31
  </div>
29
- <button type="submit" class="btn btn-primary btn-sm">Save</button>
30
- <button type="button" @click="showForm=false" class="btn btn-ghost btn-sm">Cancel</button>
32
+ <button type="submit" class="btn btn-primary">Save</button>
33
+ <button type="button" @click="showForm=false" class="btn">Cancel</button>
31
34
  </form>
32
35
  </div>
33
36
 
34
- <div class="overflow-x-auto">
35
- <table class="table table-zebra w-full">
37
+ <div class="bento-card overflow-hidden">
38
+ <table class="w-full">
36
39
  <thead>
37
- <tr>
38
- <th>Name</th>
39
- <th>URL</th>
40
- <th>Auth</th>
41
- <th>Actions</th>
40
+ <tr class="border-b border-[#EAEAEA] bg-[#F7F6F3]">
41
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Name</th>
42
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">URL</th>
43
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Auth</th>
44
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Actions</th>
42
45
  </tr>
43
46
  </thead>
44
47
  <tbody>
45
- <tr v-if="specs.length===0"><td colspan="4" class="text-center opacity-60">No specs registered.</td></tr>
46
- <tr v-for="s in specs" :key="s._id">
47
- <td><code>{{ s.name }}</code></td>
48
- <td class="max-w-xs truncate opacity-70">{{ s.url }}</td>
49
- <td><span class="badge badge-ghost badge-sm">{{ s.auth }}</span></td>
50
- <td>
51
- <button @click="remove(s._id)" class="btn btn-xs btn-error btn-outline">Delete</button>
48
+ <tr v-if="specs.length===0"><td colspan="4" class="px-6 py-12 text-center text-[#787774]">No specs registered.</td></tr>
49
+ <tr v-for="s in specs" :key="s._id" class="border-b border-[#EAEAEA] hover:bg-[#F7F6F3] transition-colors">
50
+ <td class="px-6 py-4"><code class="mono-text text-sm text-[#1F6C9F]">{{ s.name }}</code></td>
51
+ <td class="px-6 py-4 max-w-xs truncate text-[#2F3437]">{{ s.url }}</td>
52
+ <td class="px-6 py-4"><span class="badge">{{ s.auth }}</span></td>
53
+ <td class="px-6 py-4">
54
+ <button @click="remove(s._id)" class="btn text-xs border-red-200 text-red-600 hover:bg-red-50 hover:border-red-300">Delete</button>
52
55
  </td>
53
56
  </tr>
54
57
  </tbody>
@@ -1,43 +0,0 @@
1
- function execute(cmd) {
2
- const cfg = cmd.adapterConfig || {}
3
- if (cfg.builtin === "beads_install_steps") {
4
- return {
5
- plugin: "beads",
6
- binary: "br",
7
- install_steps: [
8
- "curl -fsSL \"https://raw.githubusercontent.com/Dicklesworthstone/beads_rust/main/install.sh?$(date +%s)\" | bash",
9
- "br --version"
10
- ],
11
- note: "Install execution is delegated to your LLM automation (dcli/scli/supercli)."
12
- }
13
- }
14
- if (cfg.builtin === "gwc_install_steps") {
15
- return {
16
- plugin: "gwc",
17
- binary: "gws",
18
- install_steps: [
19
- "npm install -g @googleworkspace/cli",
20
- "gws --version"
21
- ],
22
- note: "Install execution is delegated to your LLM automation (dcli/scli/supercli)."
23
- }
24
- }
25
- if (cfg.builtin === "commiat_install_steps") {
26
- return {
27
- plugin: "commiat",
28
- binary: "commiat",
29
- install_steps: [
30
- "npm install -g commiat",
31
- "commiat --version"
32
- ],
33
- note: "Install execution is delegated to your LLM automation (dcli/scli/supercli)."
34
- }
35
- }
36
- throw Object.assign(new Error(`Unknown builtin action: ${cfg.builtin || "(missing)"}`), {
37
- code: 85,
38
- type: "invalid_argument",
39
- recoverable: false
40
- })
41
- }
42
-
43
- module.exports = { execute }