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
@@ -21,8 +21,8 @@ The beads plugin demonstrates selective command wrapping. It exposes key beads_r
21
21
  "resource": "install",
22
22
  "action": "steps",
23
23
  "description": "Show beads_rust installation steps for LLM automation",
24
- "adapter": "builtin",
25
- "adapterConfig": { "builtin": "beads_install_steps" },
24
+ "adapter": "shell",
25
+ "adapterConfig": { "script": "cat install-guidance.json", "unsafe": true },
26
26
  "args": []
27
27
  },
28
28
  {
@@ -126,7 +126,7 @@ The beads plugin demonstrates selective command wrapping. It exposes key beads_r
126
126
  **Key Points**:
127
127
  - Uses wrapped commands (selective exposure)
128
128
  - JSON parsing for automation
129
- - Installation step handling via builtin adapter
129
+ - Install guidance via isolated install-guidance.json file
130
130
  - Clear error messages with help guidance
131
131
  - Multiple related commands under same namespace/resource
132
132
 
@@ -159,8 +159,8 @@ The Google Workspace CLI plugin demonstrates full passthrough, giving access to
159
159
  "resource": "install",
160
160
  "action": "steps",
161
161
  "description": "Show gws installation steps for LLM automation",
162
- "adapter": "builtin",
163
- "adapterConfig": { "builtin": "gwc_install_steps" },
162
+ "adapter": "shell",
163
+ "adapterConfig": { "script": "cat install-guidance.json", "unsafe": true },
164
164
  "args": []
165
165
  },
166
166
  {
@@ -186,7 +186,7 @@ The Google Workspace CLI plugin demonstrates full passthrough, giving access to
186
186
  - Single `_` wildcard command captures all gws functionality
187
187
  - Longer timeout for complex operations
188
188
  - Passthrough mode passes all arguments directly
189
- - Builtin adapter for installation guidance
189
+ - Install guidance via isolated install-guidance.json file
190
190
  - Minimal manifest for maximum CLI access
191
191
 
192
192
  **Usage Examples**:
@@ -220,8 +220,8 @@ A minimal passthrough plugin for commit automation.
220
220
  "resource": "install",
221
221
  "action": "steps",
222
222
  "description": "Show commiat installation steps for LLM automation",
223
- "adapter": "builtin",
224
- "adapterConfig": { "builtin": "commiat_install_steps" },
223
+ "adapter": "shell",
224
+ "adapterConfig": { "script": "cat install-guidance.json", "unsafe": true },
225
225
  "args": []
226
226
  },
227
227
  {
@@ -261,19 +261,6 @@ The most common adapter. Executes an external CLI binary.
261
261
  | `timeout_ms` | number | Execution timeout in milliseconds |
262
262
  | `missingDependencyHelp` | string | Message if binary not found |
263
263
 
264
- ### builtin Adapter
265
-
266
- For dcli-specific functionality (e.g., showing installation steps).
267
-
268
- ```json
269
- {
270
- "adapter": "builtin",
271
- "adapterConfig": {
272
- "builtin": "beads_install_steps" // Builtin handler key
273
- }
274
- }
275
- ```
276
-
277
264
  ## Argument Mapping
278
265
 
279
266
  ### Positional Arguments
package/docs/plugins.html CHANGED
@@ -30,39 +30,101 @@
30
30
  <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600&family=Inter:wght@400;500;600&display=swap" rel="stylesheet" />
31
31
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/daisyui@4.7.2/dist/full.min.css" />
32
32
  <style>
33
+ @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');
34
+
33
35
  body {
34
- font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
35
- background-color: #020617;
36
- color: #e2e8f0;
36
+ font-family: 'Geist', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
37
+ background-color: #FBFBFA;
38
+ color: #111111;
39
+ line-height: 1.6;
37
40
  }
38
41
  .sidebar-link {
39
- transition: background-color 0.2s ease, color 0.2s ease;
42
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
43
+ }
44
+ .editorial-heading {
45
+ font-family: 'Newsreader', serif;
46
+ letter-spacing: -0.03em;
47
+ line-height: 1.1;
48
+ }
49
+ .mono-text {
50
+ font-family: 'JetBrains Mono', monospace;
51
+ }
52
+ .bento-card {
53
+ border: 1px solid #EAEAEA;
54
+ border-radius: 12px;
55
+ background: #FFFFFF;
56
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
57
+ }
58
+ .bento-card:hover {
59
+ box-shadow: 0 2px 8px rgba(0,0,0,0.04);
40
60
  }
41
61
  .tag {
42
- transition: all 0.15s ease;
62
+ background: #EDF3EC;
63
+ color: #346538;
64
+ border-radius: 9999px;
65
+ font-size: 0.75rem;
66
+ letter-spacing: 0.05em;
67
+ text-transform: uppercase;
68
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
69
+ }
70
+ .tag.active {
71
+ background: #111111;
72
+ color: #FFFFFF;
73
+ }
74
+ .scroll-top-btn {
75
+ position: fixed;
76
+ bottom: 2rem;
77
+ right: 2rem;
78
+ width: 3rem;
79
+ height: 3rem;
80
+ background: #111111;
81
+ color: #FFFFFF;
82
+ border: 1px solid #EAEAEA;
83
+ border-radius: 50%;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ cursor: pointer;
88
+ opacity: 0;
89
+ visibility: hidden;
90
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
91
+ z-index: 50;
92
+ }
93
+ .scroll-top-btn.visible {
94
+ opacity: 1;
95
+ visibility: visible;
96
+ }
97
+ .scroll-top-btn:hover {
98
+ background: #333333;
99
+ transform: scale(1.05);
43
100
  }
44
101
  </style>
45
102
  </head>
46
- <body class="bg-slate-950">
103
+ <body class="bg-[#FBFBFA]">
47
104
  <div class="flex min-h-screen">
48
- <aside id="sidebar" class="w-72 flex-shrink-0 border-r border-slate-800 bg-slate-950/80 backdrop-blur hidden lg:block">
49
- <div class="p-6 space-y-8">
105
+ <aside id="sidebar" class="w-72 flex-shrink-0 border-r border-[#EAEAEA] bg-white hidden lg:block">
106
+ <div class="p-8 space-y-10">
50
107
  <div>
51
- <p class="text-xs uppercase tracking-[0.4em] text-brand-400">Docs</p>
52
- <h1 class="text-2xl font-display font-semibold mt-3 text-white">supercli</h1>
53
- <p class="text-sm text-slate-400">Plugin Directory</p>
108
+ <p class="text-xs uppercase tracking-[0.2em] text-[#787774]">Documentation</p>
109
+ <h1 class="text-2xl font-semibold mt-3 text-[#111111]">supercli</h1>
110
+ <p class="text-sm text-[#787774] mt-1">Plugin Directory</p>
54
111
  </div>
55
- <nav class="space-y-4">
112
+ <nav class="space-y-6">
56
113
  <div>
57
- <p class="text-xs uppercase tracking-widest text-slate-500 mb-2">Navigation</p>
58
- <ul class="space-y-2 text-sm">
59
- <li><a class="sidebar-link block rounded-lg px-3 py-2 hover:bg-brand-500/10 hover:text-brand-100" href="index.html">Documentation Home</a></li>
60
- <li><a class="sidebar-link block rounded-lg px-3 py-2 bg-brand-500/20 text-brand-100" href="plugins.html">Plugin Directory</a></li>
114
+ <p class="text-xs uppercase tracking-widest text-[#787774] mb-3">Navigation</p>
115
+ <ul class="space-y-1 text-sm">
116
+ <li><a class="sidebar-link block px-3 py-2 text-[#111111] hover:bg-[#F7F6F3] rounded-md" href="index.html">Documentation Home</a></li>
117
+ <li><a class="sidebar-link block px-3 py-2 bg-[#F7F6F3] text-[#111111] rounded-md" href="plugins.html">Plugin Directory</a></li>
61
118
  </ul>
62
119
  </div>
63
120
  <div>
64
- <p class="text-xs uppercase tracking-widest text-slate-500 mb-2">Popular Tags</p>
65
- <div id="sidebarTags" class="flex flex-wrap gap-2">
121
+ <p class="text-xs uppercase tracking-widest text-[#787774] mb-3">Popular Tags</p>
122
+ <div id="sidebarPopularTags" class="flex flex-wrap gap-2">
123
+ </div>
124
+ </div>
125
+ <div>
126
+ <p class="text-xs uppercase tracking-widest text-[#787774] mb-3">All Tags</p>
127
+ <div id="sidebarAllTags" class="flex flex-wrap gap-2 max-h-96 overflow-y-auto">
66
128
  </div>
67
129
  </div>
68
130
  </nav>
@@ -70,32 +132,32 @@
70
132
  </aside>
71
133
 
72
134
  <div class="flex-1 flex flex-col">
73
- <header class="border-b border-slate-800 px-6 py-4 flex items-center justify-between">
74
- <button id="mobileToggle" class="lg:hidden btn btn-sm btn-outline border-brand-400 text-brand-100" type="button">Menu</button>
135
+ <header class="border-b border-[#EAEAEA] px-8 py-6 flex items-center justify-between bg-white">
136
+ <button id="mobileToggle" class="lg:hidden px-4 py-2 text-sm border border-[#EAEAEA] rounded-md" type="button">Menu</button>
75
137
  <div>
76
- <p class="text-xs uppercase tracking-[0.4em] text-brand-400">Plugins</p>
77
- <h1 class="text-2xl font-display font-semibold text-white">Plugin Directory</h1>
138
+ <p class="text-xs uppercase tracking-[0.2em] text-[#787774]">Plugins</p>
139
+ <h1 class="text-2xl font-semibold text-[#111111]">Plugin Directory</h1>
78
140
  </div>
79
141
  </header>
80
142
 
81
- <main class="flex-1 overflow-y-auto">
82
- <section class="border-b border-slate-900 bg-slate-900/60 px-6 py-6">
143
+ <main class="flex-1 overflow-y-auto bg-[#FBFBFA]">
144
+ <section class="border-b border-[#EAEAEA] bg-white px-8 py-12">
83
145
  <div class="max-w-6xl">
84
- <div class="flex flex-col md:flex-row gap-4 items-start md:items-center justify-between">
85
- <div class="flex-1 w-full">
86
- <input id="searchInput" type="text" placeholder="Search plugins by name or description..." class="w-full rounded-2xl bg-slate-950/70 border border-slate-700 px-4 py-3 text-slate-100 placeholder:text-slate-500 focus:border-brand-400 focus:outline-none" />
146
+ <div class="flex flex-col gap-4">
147
+ <div class="w-full">
148
+ <input id="searchInput" type="text" placeholder="Search plugins by name or description..." class="w-full px-8 py-8 bg-[#F7F6F3] border border-[#EAEAEA] rounded-xl text-[#111111] placeholder:text-[#787774] focus:outline-none focus:border-[#111111] transition-colors text-2xl" />
87
149
  </div>
88
150
  <div class="flex flex-wrap gap-2" id="tagFilters">
89
151
  </div>
90
152
  </div>
91
- <p class="text-sm text-slate-500 mt-3"><span id="pluginCount">0</span> plugins</p>
153
+ <p class="text-sm text-[#787774] mt-3"><span id="pluginCount">0</span> plugins</p>
92
154
  </div>
93
155
  </section>
94
156
 
95
- <div class="max-w-6xl px-6 py-10">
157
+ <div class="max-w-6xl px-8 py-12">
96
158
  <div id="pluginGrid" class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
97
159
  </div>
98
- <div id="noResults" class="hidden text-center py-12 text-slate-500">
160
+ <div id="noResults" class="hidden text-center py-12 text-[#787774]">
99
161
  <p class="text-xl">No plugins found</p>
100
162
  <p class="text-sm mt-2">Try adjusting your search or filters</p>
101
163
  </div>
@@ -104,21 +166,27 @@
104
166
  </div>
105
167
  </div>
106
168
 
107
- <div id="mobileDrawer" class="fixed inset-0 bg-black/60 hidden z-40 lg:hidden">
108
- <div class="w-72 bg-slate-950 h-full border-r border-slate-800 p-6 overflow-y-auto">
109
- <div class="flex items-center justify-between mb-6">
110
- <h2 class="text-white text-xl font-display">Navigate</h2>
111
- <button id="drawerClose" class="btn btn-sm btn-ghost">Close</button>
169
+ <div id="mobileDrawer" class="fixed inset-0 bg-black/40 hidden z-40 lg:hidden">
170
+ <div class="w-72 bg-white h-full border-r border-[#EAEAEA] p-8 overflow-y-auto">
171
+ <div class="flex items-center justify-between mb-8">
172
+ <h2 class="text-[#111111] text-xl font-semibold">Navigate</h2>
173
+ <button id="drawerClose" class="text-[#787774] text-sm">Close</button>
112
174
  </div>
113
175
  <div id="drawerNav" class="space-y-6 text-sm">
114
- <ul class="space-y-2">
115
- <li><a class="sidebar-link block rounded-lg px-3 py-2 hover:bg-brand-500/10 hover:text-brand-100" href="index.html">Documentation Home</a></li>
116
- <li><a class="sidebar-link block rounded-lg px-3 py-2 bg-brand-500/20 text-brand-100" href="plugins.html">Plugin Directory</a></li>
176
+ <ul class="space-y-1">
177
+ <li><a class="sidebar-link block px-3 py-2 text-[#111111] hover:bg-[#F7F6F3] rounded-md" href="index.html">Documentation Home</a></li>
178
+ <li><a class="sidebar-link block px-3 py-2 bg-[#F7F6F3] text-[#111111] rounded-md" href="plugins.html">Plugin Directory</a></li>
117
179
  </ul>
118
180
  </div>
119
181
  </div>
120
182
  </div>
121
183
 
184
+ <button id="scrollTopBtn" class="scroll-top-btn" aria-label="Scroll to top">
185
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
186
+ <path d="M12 19V5M5 12l7-7 7 7"/>
187
+ </svg>
188
+ </button>
189
+
122
190
  <script>
123
191
  let allPlugins = [];
124
192
  let activeTags = new Set();
@@ -143,26 +211,35 @@
143
211
  });
144
212
  });
145
213
  return Object.entries(tags)
146
- .sort((a, b) => b[1] - a[1])
147
- .slice(0, 20)
148
- .map(([tag]) => tag);
214
+ .sort((a, b) => b[1] - a[1]);
149
215
  }
150
216
 
151
217
  function renderTagFilters() {
152
- const tags = getAllTags();
218
+ const tagsWithCounts = getAllTags();
219
+ const popularTags = tagsWithCounts.slice(0, 20).map(([tag]) => tag);
220
+ const allTags = tagsWithCounts.map(([tag]) => tag);
221
+
153
222
  const container = document.getElementById('tagFilters');
154
- const sidebarTags = document.getElementById('sidebarTags');
223
+ const sidebarPopularTags = document.getElementById('sidebarPopularTags');
224
+ const sidebarAllTags = document.getElementById('sidebarAllTags');
155
225
 
156
- container.innerHTML = tags.map(tag => `
157
- <button class="tag btn btn-sm ${activeTags.has(tag) ? 'btn-primary' : 'btn-outline border-slate-600 text-slate-300'} text-xs"
158
- data-tag="${tag}" onclick="toggleTag('${tag}')">
226
+ container.innerHTML = popularTags.map(tag => `
227
+ <button class="tag px-3 py-1 ${activeTags.has(tag) ? 'active' : ''}"
228
+ data-tag="${tag}" onclick="toggleTag('${tag}')" title="Filter by tag: ${tag}">
159
229
  ${tag}
160
230
  </button>
161
231
  `).join('');
162
232
 
163
- sidebarTags.innerHTML = tags.slice(0, 10).map(tag => `
164
- <button class="tag btn btn-xs ${activeTags.has(tag) ? 'btn-primary' : 'btn-ghost text-slate-400'} text-xs"
165
- data-tag="${tag}" onclick="toggleTag('${tag}')">
233
+ sidebarPopularTags.innerHTML = popularTags.map(tag => `
234
+ <button class="tag px-3 py-1 ${activeTags.has(tag) ? 'active' : ''}"
235
+ data-tag="${tag}" onclick="toggleTag('${tag}')" title="Filter by tag: ${tag}">
236
+ ${tag}
237
+ </button>
238
+ `).join('');
239
+
240
+ sidebarAllTags.innerHTML = allTags.map(tag => `
241
+ <button class="tag px-3 py-1 ${activeTags.has(tag) ? 'active' : ''}"
242
+ data-tag="${tag}" onclick="toggleTag('${tag}')" title="Filter by tag: ${tag}">
166
243
  ${tag}
167
244
  </button>
168
245
  `).join('');
@@ -198,12 +275,13 @@
198
275
 
199
276
  const grid = document.getElementById('pluginGrid');
200
277
  grid.innerHTML = filtered.map(p => `
201
- <div class="bg-slate-900 border border-slate-800 rounded-2xl p-5 hover:border-brand-500/50 transition-colors">
202
- <div class="flex items-start justify-between mb-3">
203
- <h3 class="text-lg font-display font-semibold text-white">${p.name}</h3>
278
+ <div class="bento-card p-6">
279
+ <div class="flex items-start justify-between mb-4">
280
+ <h3 class="text-lg font-semibold text-[#111111]">${p.name}</h3>
204
281
  <div class="flex items-center gap-2">
205
- ${p.has_learn ? '<span class="badge badge-sm badge-primary text-xs">learn</span>' : ''}
206
- <button class="copy-btn btn btn-xs btn-ghost text-slate-400 hover:text-brand-400"
282
+ ${p.score ? `<span class="px-2 py-0.5 bg-[#EDF3EC] text-[#346538] rounded-full text-xs font-semibold" title="Plugin quality score (out of 12)">${p.score.value}/12</span>` : ''}
283
+ ${p.has_learn ? '<span class="tag px-2 py-0.5 text-[10px]" title="Has quickstart skill guide">learn</span>' : ''}
284
+ <button class="copy-btn p-2 text-[#787774] hover:text-[#111111] transition-colors"
207
285
  data-cmd="supercli plugins install ${p.name}"
208
286
  onclick="copyCmd(this)"
209
287
  title="Copy install command">
@@ -213,10 +291,18 @@
213
291
  </button>
214
292
  </div>
215
293
  </div>
216
- <p class="text-slate-400 text-sm mb-3 line-clamp-2">${p.description}</p>
217
- <div class="bg-slate-950/50 rounded-lg px-3 py-2 mb-3 flex items-center justify-between">
218
- <code class="text-xs text-brand-400">supercli plugins install ${p.name}</code>
219
- <button class="copy-btn btn btn-xs btn-ghost text-slate-500 hover:text-brand-400"
294
+ <p class="text-[#2F3437] text-sm mb-4 line-clamp-2">${p.description}</p>
295
+ ${p.score ? `
296
+ <div class="flex flex-wrap gap-2 mb-4 text-xs">
297
+ <span class="px-2 py-1 rounded bg-[#F7F6F3] text-[#787774]" title="Programming language">${p.score.language}</span>
298
+ <span class="px-2 py-1 rounded bg-[#F7F6F3] text-[#787774]" title="Installation complexity">${p.score.complexity}</span>
299
+ ${p.score.json_support ? '<span class="px-2 py-1 rounded bg-[#E1F3FE] text-[#1F6C9F]" title="Supports JSON input/output">json</span>' : ''}
300
+ ${p.score.no_interactive ? '<span class="px-2 py-1 rounded bg-[#EDF3EC] text-[#346538]" title="No interactive prompts">no-interactive</span>' : ''}
301
+ </div>
302
+ ` : ''}
303
+ <div class="bg-[#F7F6F3] border border-[#EAEAEA] rounded-md px-3 py-2 mb-4 flex items-center justify-between">
304
+ <code class="text-xs mono-text text-[#1F6C9F]">supercli plugins install ${p.name}</code>
305
+ <button class="copy-btn p-1 text-[#787774] hover:text-[#111111] transition-colors"
220
306
  data-cmd="supercli plugins install ${p.name}"
221
307
  onclick="copyCmd(this)"
222
308
  title="Copy install command">
@@ -227,7 +313,7 @@
227
313
  </div>
228
314
  <div class="flex flex-wrap gap-1">
229
315
  ${p.tags.slice(0, 5).map(t => `
230
- <span class="text-xs px-2 py-1 rounded-full bg-slate-800 text-slate-400">${t}</span>
316
+ <span class="text-xs px-2 py-1 rounded-full bg-[#F7F6F3] text-[#787774]" title="Tag: ${t}">${t}</span>
231
317
  `).join('')}
232
318
  </div>
233
319
  </div>
@@ -239,8 +325,8 @@
239
325
  try {
240
326
  await navigator.clipboard.writeText(cmd);
241
327
  const svg = btn.querySelector('svg');
242
- svg.classList.add('text-green-400');
243
- setTimeout(() => svg.classList.remove('text-green-400'), 1000);
328
+ svg.classList.add('text-[#346538]');
329
+ setTimeout(() => svg.classList.remove('text-[#346538]'), 1000);
244
330
  } catch {
245
331
  console.error('Copy failed');
246
332
  }
@@ -259,6 +345,24 @@
259
345
  if (e.target === mobileDrawer) mobileDrawer.classList.add('hidden');
260
346
  });
261
347
 
348
+ // Scroll to top button
349
+ const scrollTopBtn = document.getElementById('scrollTopBtn');
350
+
351
+ window.addEventListener('scroll', () => {
352
+ if (window.scrollY > 300) {
353
+ scrollTopBtn.classList.add('visible');
354
+ } else {
355
+ scrollTopBtn.classList.remove('visible');
356
+ }
357
+ });
358
+
359
+ scrollTopBtn.addEventListener('click', () => {
360
+ window.scrollTo({
361
+ top: 0,
362
+ behavior: 'smooth'
363
+ });
364
+ });
365
+
262
366
  loadPlugins();
263
367
  </script>
264
368
  </body>
package/docs/server.md ADDED
@@ -0,0 +1,50 @@
1
+ # Server
2
+
3
+ The supercli server provides a web UI for managing custom commands, OpenAPI specs, MCP servers, plugins, and viewing execution history.
4
+
5
+ ## Commands
6
+
7
+ Create and manage custom commands through the server UI at `/commands`. Commands are indexed as `namespace.resource.action` and sync to the CLI via `sc sync`.
8
+
9
+ ### Shell Adapter
10
+
11
+ The shell adapter executes bash scripts with argument interpolation. Use `{{variable}}` syntax to reference command arguments:
12
+
13
+ ```json
14
+ {
15
+ "script": "echo 'Hello {{name}}'",
16
+ "timeout_ms": 5000,
17
+ "unsafe": true
18
+ }
19
+ ```
20
+
21
+ Arguments defined in the command schema are interpolated before execution. For example, with an argument named `name`:
22
+
23
+ - Command: `sc system test foo --name Pedro`
24
+ - Interpolated script: `echo 'Hello Pedro'`
25
+
26
+ **Important:** Shell adapter requires `adapterConfig.unsafe=true` for security policy reasons.
27
+
28
+ ### Other Adapters
29
+
30
+ - **http**: Raw HTTP requests with customizable method, headers, and body
31
+ - **openapi**: Auto-generates commands from OpenAPI specifications
32
+ - **mcp**: Exposes MCP server tools as commands
33
+ - **process**: Spawns external processes with arguments
34
+ - **custom**: User-defined JavaScript functions
35
+
36
+ ## OpenAPI
37
+
38
+ Manage OpenAPI specifications at `/specs`. Upload OpenAPI/Swagger JSON or YAML files to auto-generate command definitions for all endpoints.
39
+
40
+ ## MCP
41
+
42
+ Manage Model Context Protocol server connections at `/mcp`. Connect to MCP servers via SSE or stdio to expose their tools as supercli commands.
43
+
44
+ ## Plugins
45
+
46
+ Manage server plugins at `/plugins`. Upload plugin ZIP files, enable/disable plugins, and view plugin manifests. Server plugins extend CLI capabilities with custom commands and harnesses.
47
+
48
+ ## Jobs
49
+
50
+ View command execution history at `/jobs`. Tracks all command executions with timestamps, duration, status, and output for debugging and observability.