superacli 1.1.0 → 1.1.2

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 (261) hide show
  1. package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +57 -0
  2. package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +57 -0
  3. package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +57 -0
  4. package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +57 -0
  5. package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +57 -0
  6. package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +57 -0
  7. package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +57 -0
  8. package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +57 -0
  9. package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +57 -0
  10. package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +57 -0
  11. package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +57 -0
  12. package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +57 -0
  13. package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +57 -0
  14. package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +57 -0
  15. package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +57 -0
  16. package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +57 -0
  17. package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +57 -0
  18. package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +57 -0
  19. package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +57 -0
  20. package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +57 -0
  21. package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +57 -0
  22. package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +58 -0
  23. package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +59 -0
  24. package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +60 -0
  25. package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +60 -0
  26. package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +60 -0
  27. package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +60 -0
  28. package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +60 -0
  29. package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +60 -0
  30. package/.beads/issues.jsonl +20 -17
  31. package/README.md +1 -1
  32. package/__tests__/adapter-schema.test.js +3 -0
  33. package/__tests__/aws-plugin.test.js +84 -0
  34. package/__tests__/az-plugin.test.js +84 -0
  35. package/__tests__/builtin-adapter.test.js +29 -0
  36. package/__tests__/cline-plugin.test.js +109 -0
  37. package/__tests__/cline-skill.test.js +49 -0
  38. package/__tests__/docker-plugin.test.js +3 -1
  39. package/__tests__/eza-plugin.test.js +81 -0
  40. package/__tests__/gcloud-plugin.test.js +86 -0
  41. package/__tests__/gh-plugin.test.js +86 -0
  42. package/__tests__/helm-plugin.test.js +81 -0
  43. package/__tests__/http-adapter.test.js +118 -0
  44. package/__tests__/just-plugin.test.js +82 -0
  45. package/__tests__/kubectl-plugin.test.js +83 -0
  46. package/__tests__/linear-plugin.test.js +81 -0
  47. package/__tests__/mcp-adapter.test.js +187 -0
  48. package/__tests__/nextest-plugin.test.js +82 -0
  49. package/__tests__/npm-plugin.test.js +81 -0
  50. package/__tests__/nullclaw-plugin.test.js +157 -0
  51. package/__tests__/openapi-adapter.test.js +199 -0
  52. package/__tests__/plugin-agency-agents.test.js +6 -6
  53. package/__tests__/plugin-nullclaw.test.js +78 -0
  54. package/__tests__/plugin-visual-explainer.test.js +62 -0
  55. package/__tests__/plugins-manager.test.js +59 -10
  56. package/__tests__/pnpm-plugin.test.js +81 -0
  57. package/__tests__/poetry-plugin.test.js +83 -0
  58. package/__tests__/process-adapter.test.js +124 -90
  59. package/__tests__/pulumi-plugin.test.js +81 -0
  60. package/__tests__/railway-plugin.test.js +84 -0
  61. package/__tests__/server-app.test.js +67 -0
  62. package/__tests__/server-config-service.test.js +79 -0
  63. package/__tests__/server-routes-ask.test.js +89 -0
  64. package/__tests__/server-routes-commands.test.js +55 -0
  65. package/__tests__/server-routes-config.test.js +87 -0
  66. package/__tests__/server-routes-jobs.test.js +53 -0
  67. package/__tests__/server-routes-misc.test.js +112 -0
  68. package/__tests__/server-storage-adapter.test.js +40 -0
  69. package/__tests__/server-storage-file.test.js +73 -0
  70. package/__tests__/server-storage-mongo.test.js +74 -0
  71. package/__tests__/shell-adapter.test.js +81 -22
  72. package/__tests__/stripe-plugin.test.js +3 -1
  73. package/__tests__/supabase-plugin.test.js +86 -0
  74. package/__tests__/terraform-plugin.test.js +83 -0
  75. package/__tests__/uv-plugin.test.js +81 -0
  76. package/__tests__/vercel-plugin.test.js +81 -0
  77. package/__tests__/watchexec-plugin.test.js +80 -0
  78. package/cli/adapter-schema.js +5 -0
  79. package/cli/adapters/process.js +53 -2
  80. package/cli/plugin-install-guidance.js +320 -0
  81. package/cli/plugins-manager.js +272 -212
  82. package/cli/skills.js +16 -5
  83. package/cli/supercli.js +26 -2
  84. package/docs/plugins.md +2 -0
  85. package/docs/skills/cline-non-interactive/SKILL.md +59 -0
  86. package/docs/skills-catalog.md +35 -0
  87. package/docs/visual-overview.md +21 -0
  88. package/jest.config.js +4 -1
  89. package/package.json +4 -3
  90. package/plugins/agency-agents/plugin.json +5 -0
  91. package/{cli/plugin-agency-agents.js → plugins/agency-agents/scripts/post-install.js} +13 -3
  92. package/plugins/aws/README.md +46 -0
  93. package/plugins/aws/plugin.json +42 -0
  94. package/plugins/az/README.md +46 -0
  95. package/plugins/az/plugin.json +42 -0
  96. package/plugins/clickup/plugin.json +38 -0
  97. package/plugins/clickup/scripts/post-install.js +107 -0
  98. package/plugins/clickup/scripts/post-uninstall.js +30 -0
  99. package/plugins/cline/README.md +48 -0
  100. package/plugins/cline/plugin.json +92 -0
  101. package/plugins/eza/README.md +40 -0
  102. package/plugins/eza/plugin.json +42 -0
  103. package/plugins/gcloud/README.md +46 -0
  104. package/plugins/gcloud/plugin.json +42 -0
  105. package/plugins/gh/README.md +46 -0
  106. package/plugins/gh/plugin.json +43 -0
  107. package/plugins/helm/README.md +42 -0
  108. package/plugins/helm/plugin.json +42 -0
  109. package/plugins/just/README.md +42 -0
  110. package/plugins/just/plugin.json +42 -0
  111. package/plugins/kubectl/README.md +46 -0
  112. package/plugins/kubectl/plugin.json +42 -0
  113. package/plugins/linear/README.md +60 -0
  114. package/plugins/linear/plugin.json +42 -0
  115. package/plugins/nextest/README.md +42 -0
  116. package/plugins/nextest/plugin.json +42 -0
  117. package/plugins/npm/README.md +46 -0
  118. package/plugins/npm/plugin.json +42 -0
  119. package/plugins/nullclaw/README.md +45 -0
  120. package/plugins/nullclaw/plugin.json +64 -0
  121. package/plugins/nullclaw/scripts/post-install.js +189 -0
  122. package/plugins/nullclaw/scripts/post-uninstall.js +25 -0
  123. package/plugins/openfang/plugin.json +37 -0
  124. package/plugins/openfang/scripts/post-install.js +163 -0
  125. package/plugins/openfang/scripts/post-uninstall.js +30 -0
  126. package/plugins/plugins.json +234 -0
  127. package/plugins/pnpm/README.md +46 -0
  128. package/plugins/pnpm/plugin.json +42 -0
  129. package/plugins/poetry/README.md +46 -0
  130. package/plugins/poetry/plugin.json +42 -0
  131. package/plugins/pulumi/README.md +46 -0
  132. package/plugins/pulumi/plugin.json +42 -0
  133. package/plugins/railway/README.md +58 -0
  134. package/plugins/railway/plugin.json +43 -0
  135. package/plugins/supabase/README.md +55 -0
  136. package/plugins/supabase/plugin.json +42 -0
  137. package/plugins/superpowers/plugin.json +22 -0
  138. package/plugins/superpowers/scripts/post-install.js +124 -0
  139. package/plugins/superpowers/scripts/post-uninstall.js +30 -0
  140. package/plugins/terraform/README.md +46 -0
  141. package/plugins/terraform/plugin.json +42 -0
  142. package/plugins/uv/README.md +46 -0
  143. package/plugins/uv/plugin.json +42 -0
  144. package/plugins/vercel/README.md +47 -0
  145. package/plugins/vercel/plugin.json +42 -0
  146. package/plugins/visual-explainer/plugin.json +15 -0
  147. package/plugins/visual-explainer/scripts/post-install.js +111 -0
  148. package/plugins/watchexec/README.md +40 -0
  149. package/plugins/watchexec/plugin.json +42 -0
  150. package/tests/test-aws-smoke.sh +56 -0
  151. package/tests/test-az-smoke.sh +56 -0
  152. package/tests/test-cline-smoke.sh +37 -0
  153. package/tests/test-eza-smoke.sh +33 -0
  154. package/tests/test-gcloud-smoke.sh +56 -0
  155. package/tests/test-gh-smoke.sh +56 -0
  156. package/tests/test-helm-smoke.sh +33 -0
  157. package/tests/test-just-smoke.sh +40 -0
  158. package/tests/test-kubectl-smoke.sh +37 -0
  159. package/tests/test-linear-smoke.sh +97 -0
  160. package/tests/test-nextest-smoke.sh +33 -0
  161. package/tests/test-npm-smoke.sh +32 -0
  162. package/tests/test-nullclaw-smoke.sh +51 -0
  163. package/tests/test-plugins-registry.js +110 -0
  164. package/tests/test-pnpm-smoke.sh +33 -0
  165. package/tests/test-poetry-smoke.sh +33 -0
  166. package/tests/test-pulumi-smoke.sh +33 -0
  167. package/tests/test-railway-smoke.sh +95 -0
  168. package/tests/test-supabase-smoke.sh +95 -0
  169. package/tests/test-terraform-smoke.sh +33 -0
  170. package/tests/test-uv-smoke.sh +33 -0
  171. package/tests/test-vercel-smoke.sh +55 -0
  172. package/tests/test-watchexec-smoke.sh +33 -0
  173. package/.beads/.br_history/issues.20260308_180927_477542428.jsonl +0 -12
  174. package/.beads/.br_history/issues.20260308_181032_020230108.jsonl +0 -12
  175. package/.beads/.br_history/issues.20260308_181032_180539413.jsonl +0 -12
  176. package/.beads/.br_history/issues.20260308_181032_372621506.jsonl +0 -12
  177. package/.beads/.br_history/issues.20260308_181032_565142225.jsonl +0 -12
  178. package/.beads/.br_history/issues.20260308_181311_336346464.jsonl +0 -12
  179. package/.beads/.br_history/issues.20260308_181444_039234498.jsonl +0 -13
  180. package/.beads/.br_history/issues.20260308_181503_794764403.jsonl +0 -13
  181. package/.beads/.br_history/issues.20260308_181503_950163105.jsonl +0 -13
  182. package/.beads/.br_history/issues.20260308_192031_852553505.jsonl +0 -13
  183. package/.beads/.br_history/issues.20260308_193552_846920518.jsonl +0 -14
  184. package/.beads/.br_history/issues.20260308_194054_394884833.jsonl +0 -14
  185. package/.beads/.br_history/issues.20260308_194209_440472460.jsonl +0 -15
  186. package/.beads/.br_history/issues.20260308_195319_099391899.jsonl +0 -15
  187. package/.beads/.br_history/issues.20260308_195324_176987204.jsonl +0 -16
  188. package/.beads/.br_history/issues.20260308_195436_929114019.jsonl +0 -16
  189. package/.beads/.br_history/issues.20260308_195437_055808298.jsonl +0 -17
  190. package/.beads/.br_history/issues.20260308_195437_304297399.jsonl +0 -18
  191. package/.beads/.br_history/issues.20260308_195437_556007332.jsonl +0 -19
  192. package/.beads/.br_history/issues.20260308_195444_987209695.jsonl +0 -20
  193. package/.beads/.br_history/issues.20260308_195445_133350193.jsonl +0 -20
  194. package/.beads/.br_history/issues.20260308_195445_400185615.jsonl +0 -20
  195. package/.beads/.br_history/issues.20260308_195445_689886334.jsonl +0 -20
  196. package/.beads/.br_history/issues.20260308_195445_949947727.jsonl +0 -20
  197. package/.beads/.br_history/issues.20260308_195745_580473297.jsonl +0 -20
  198. package/.beads/.br_history/issues.20260308_195745_725920532.jsonl +0 -20
  199. package/.beads/.br_history/issues.20260308_195745_968227911.jsonl +0 -20
  200. package/.beads/.br_history/issues.20260308_195746_224276322.jsonl +0 -20
  201. package/.beads/.br_history/issues.20260308_200018_386890807.jsonl +0 -20
  202. package/ref-btcbot/.env.example +0 -19
  203. package/ref-btcbot/README.md +0 -3
  204. package/ref-btcbot/docs/bot.md +0 -72
  205. package/ref-btcbot/docs/skills/btcbot.backtest/SKILL.md +0 -70
  206. package/ref-btcbot/docs/skills/btcbot.config/SKILL.md +0 -79
  207. package/ref-btcbot/docs/skills/btcbot.orders/SKILL.md +0 -60
  208. package/ref-btcbot/docs/skills/btcbot.positions/SKILL.md +0 -54
  209. package/ref-btcbot/docs/skills/btcbot.risk/SKILL.md +0 -69
  210. package/ref-btcbot/docs/skills/btcbot.run-loop/SKILL.md +0 -63
  211. package/ref-btcbot/docs/skills/btcbot.run-once/SKILL.md +0 -63
  212. package/ref-btcbot/docs/skills/btcbot.status/SKILL.md +0 -59
  213. package/ref-btcbot/examples/sample-candles.json +0 -52
  214. package/ref-btcbot/package.json +0 -18
  215. package/ref-btcbot/plugin/plugin.json +0 -146
  216. package/ref-btcbot/src/cli.js +0 -104
  217. package/ref-btcbot/src/config.js +0 -80
  218. package/ref-btcbot/src/core/bot-runner.js +0 -78
  219. package/ref-btcbot/src/core/exchange-factory.js +0 -19
  220. package/ref-btcbot/src/core/live-exchange.js +0 -12
  221. package/ref-btcbot/src/core/paper-exchange.js +0 -82
  222. package/ref-btcbot/src/core/risk-engine.js +0 -42
  223. package/ref-btcbot/src/core/state-repository.js +0 -47
  224. package/ref-btcbot/src/services/backtest-service.js +0 -44
  225. package/ref-btcbot/src/services/market-data.js +0 -32
  226. package/ref-btcbot/src/storage/json-store.js +0 -45
  227. package/ref-btcbot/src/strategy/hedge-strategy.js +0 -65
  228. package/ref-btcbot/src/strategy/indicators.js +0 -56
  229. package/ref-btcbot/src/web/api.js +0 -50
  230. package/ref-btcbot/src/web/app.js +0 -51
  231. package/ref-btcbot/src/web/index.html +0 -70
  232. package/ref-btcbot/src/web/server.js +0 -33
  233. /package/.beads/.br_history/{issues.20260308_180927_477542428.jsonl.meta.json → issues.20260308_235202_180577215.jsonl.meta.json} +0 -0
  234. /package/.beads/.br_history/{issues.20260308_181032_020230108.jsonl.meta.json → issues.20260308_235202_387414163.jsonl.meta.json} +0 -0
  235. /package/.beads/.br_history/{issues.20260308_181032_180539413.jsonl.meta.json → issues.20260308_235202_564422794.jsonl.meta.json} +0 -0
  236. /package/.beads/.br_history/{issues.20260308_181032_372621506.jsonl.meta.json → issues.20260308_235202_742600597.jsonl.meta.json} +0 -0
  237. /package/.beads/.br_history/{issues.20260308_181032_565142225.jsonl.meta.json → issues.20260308_235208_133360069.jsonl.meta.json} +0 -0
  238. /package/.beads/.br_history/{issues.20260308_181311_336346464.jsonl.meta.json → issues.20260308_235505_473406307.jsonl.meta.json} +0 -0
  239. /package/.beads/.br_history/{issues.20260308_181444_039234498.jsonl.meta.json → issues.20260308_235505_662360489.jsonl.meta.json} +0 -0
  240. /package/.beads/.br_history/{issues.20260308_181503_794764403.jsonl.meta.json → issues.20260308_235505_843935624.jsonl.meta.json} +0 -0
  241. /package/.beads/.br_history/{issues.20260308_181503_950163105.jsonl.meta.json → issues.20260308_235506_044530221.jsonl.meta.json} +0 -0
  242. /package/.beads/.br_history/{issues.20260308_192031_852553505.jsonl.meta.json → issues.20260309_002618_115728731.jsonl.meta.json} +0 -0
  243. /package/.beads/.br_history/{issues.20260308_193552_846920518.jsonl.meta.json → issues.20260309_003748_878174586.jsonl.meta.json} +0 -0
  244. /package/.beads/.br_history/{issues.20260308_194054_394884833.jsonl.meta.json → issues.20260309_004057_868755623.jsonl.meta.json} +0 -0
  245. /package/.beads/.br_history/{issues.20260308_194209_440472460.jsonl.meta.json → issues.20260309_004058_512842163.jsonl.meta.json} +0 -0
  246. /package/.beads/.br_history/{issues.20260308_195319_099391899.jsonl.meta.json → issues.20260309_004058_994445226.jsonl.meta.json} +0 -0
  247. /package/.beads/.br_history/{issues.20260308_195324_176987204.jsonl.meta.json → issues.20260309_004059_475988596.jsonl.meta.json} +0 -0
  248. /package/.beads/.br_history/{issues.20260308_195436_929114019.jsonl.meta.json → issues.20260309_161902_566857851.jsonl.meta.json} +0 -0
  249. /package/.beads/.br_history/{issues.20260308_195437_055808298.jsonl.meta.json → issues.20260309_170512_277017739.jsonl.meta.json} +0 -0
  250. /package/.beads/.br_history/{issues.20260308_195437_304297399.jsonl.meta.json → issues.20260309_170512_477876921.jsonl.meta.json} +0 -0
  251. /package/.beads/.br_history/{issues.20260308_195437_556007332.jsonl.meta.json → issues.20260309_170512_664382701.jsonl.meta.json} +0 -0
  252. /package/.beads/.br_history/{issues.20260308_195444_987209695.jsonl.meta.json → issues.20260309_170512_859400333.jsonl.meta.json} +0 -0
  253. /package/.beads/.br_history/{issues.20260308_195445_133350193.jsonl.meta.json → issues.20260309_212326_082771164.jsonl.meta.json} +0 -0
  254. /package/.beads/.br_history/{issues.20260308_195445_400185615.jsonl.meta.json → issues.20260309_212326_245619716.jsonl.meta.json} +0 -0
  255. /package/.beads/.br_history/{issues.20260308_195445_689886334.jsonl.meta.json → issues.20260309_212326_403198317.jsonl.meta.json} +0 -0
  256. /package/.beads/.br_history/{issues.20260308_195445_949947727.jsonl.meta.json → issues.20260309_212332_539197678.jsonl.meta.json} +0 -0
  257. /package/.beads/.br_history/{issues.20260308_195745_580473297.jsonl.meta.json → issues.20260309_212332_731373599.jsonl.meta.json} +0 -0
  258. /package/.beads/.br_history/{issues.20260308_195745_725920532.jsonl.meta.json → issues.20260309_212332_928710953.jsonl.meta.json} +0 -0
  259. /package/.beads/.br_history/{issues.20260308_195745_968227911.jsonl.meta.json → issues.20260309_213021_341505240.jsonl.meta.json} +0 -0
  260. /package/.beads/.br_history/{issues.20260308_195746_224276322.jsonl.meta.json → issues.20260309_213022_023136934.jsonl.meta.json} +0 -0
  261. /package/.beads/.br_history/{issues.20260308_200018_386890807.jsonl.meta.json → issues.20260309_213022_400050719.jsonl.meta.json} +0 -0
@@ -0,0 +1,80 @@
1
+ const fs = require("fs")
2
+ const os = require("os")
3
+ const path = require("path")
4
+ const { execSync } = require("child_process")
5
+
6
+ const CLI = path.join(__dirname, "..", "cli", "supercli.js")
7
+
8
+ function runNoServer(args, options = {}) {
9
+ try {
10
+ const env = { ...process.env }
11
+ delete env.SUPERCLI_SERVER
12
+ const out = execSync(`node ${CLI} ${args}`, {
13
+ encoding: "utf-8",
14
+ timeout: 15000,
15
+ env: { ...env, ...(options.env || {}) }
16
+ })
17
+ return { ok: true, output: out.trim(), code: 0 }
18
+ } catch (err) {
19
+ return {
20
+ ok: false,
21
+ output: (err.stdout || "").trim(),
22
+ stderr: (err.stderr || "").trim(),
23
+ code: err.status
24
+ }
25
+ }
26
+ }
27
+
28
+ function writeFakeWatchexecBinary(dir) {
29
+ const bin = path.join(dir, "watchexec")
30
+ fs.writeFileSync(bin, [
31
+ "#!/usr/bin/env node",
32
+ "const args = process.argv.slice(2);",
33
+ "if (args[0] === '--version') { console.log('watchexec 2.5.0-test'); process.exit(0); }",
34
+ "console.log(JSON.stringify({ ok: true, args }));"
35
+ ].join("\n"), "utf-8")
36
+ fs.chmodSync(bin, 0o755)
37
+ return bin
38
+ }
39
+
40
+ describe("watchexec plugin", () => {
41
+ const fakeDir = fs.mkdtempSync(path.join(os.tmpdir(), "dcli-watchexec-"))
42
+ const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "dcli-home-watchexec-"))
43
+ writeFakeWatchexecBinary(fakeDir)
44
+ const env = { ...process.env, PATH: `${fakeDir}:${process.env.PATH || ""}`, SUPERCLI_HOME: tempHome }
45
+
46
+ beforeAll(() => {
47
+ runNoServer("plugins install ./plugins/watchexec --on-conflict replace --json", { env })
48
+ })
49
+
50
+ afterAll(() => {
51
+ runNoServer("plugins remove watchexec --json", { env })
52
+ fs.rmSync(fakeDir, { recursive: true, force: true })
53
+ fs.rmSync(tempHome, { recursive: true, force: true })
54
+ })
55
+
56
+ test("routes cli version wrapped command", () => {
57
+ const r = runNoServer("watchexec cli version --json", { env })
58
+ expect(r.ok).toBe(true)
59
+ const data = JSON.parse(r.output)
60
+ expect(data.command).toBe("watchexec.cli.version")
61
+ expect(data.data.raw).toBe("watchexec 2.5.0-test")
62
+ })
63
+
64
+ test("supports namespace passthrough", () => {
65
+ const r = runNoServer("watchexec --help --json", { env })
66
+ expect(r.ok).toBe(true)
67
+ const data = JSON.parse(r.output)
68
+ expect(data.command).toBe("watchexec.passthrough")
69
+ expect(data.data.args).toContain("--help")
70
+ expect(data.data.args).toContain("--json")
71
+ })
72
+
73
+ test("doctor reports watchexec dependency as healthy", () => {
74
+ const r = runNoServer("plugins doctor watchexec --json", { env })
75
+ expect(r.ok).toBe(true)
76
+ const data = JSON.parse(r.output)
77
+ expect(data.ok).toBe(true)
78
+ expect(data.checks.some(c => c.type === "binary" && c.binary === "watchexec" && c.ok === true)).toBe(true)
79
+ })
80
+ })
@@ -22,6 +22,7 @@ function validateCommonConfig(adapterName, config) {
22
22
  assertType(config.non_interactive, "boolean", "non_interactive")
23
23
  assertType(config.cwd, "string", "cwd")
24
24
  assertType(config.safetyLevel, "string", "safetyLevel")
25
+ assertType(config.stream, "string", "stream")
25
26
  if (config.interactiveFlags !== undefined && !Array.isArray(config.interactiveFlags)) {
26
27
  throw asInvalid("adapterConfig.interactiveFlags must be an array")
27
28
  }
@@ -39,6 +40,10 @@ function validateCommonConfig(adapterName, config) {
39
40
  throw asInvalid("adapterConfig.timeout_ms cannot exceed 15000ms")
40
41
  }
41
42
  }
43
+
44
+ if (config.stream !== undefined && !["jsonl"].includes(config.stream)) {
45
+ throw asInvalid("adapterConfig.stream must be 'jsonl'")
46
+ }
42
47
  }
43
48
 
44
49
  function validateAdapterConfig(cmd) {
@@ -77,7 +77,27 @@ function validateNonTtySafety(cfg, args) {
77
77
  }
78
78
  }
79
79
 
80
- async function execute(cmd, flags) {
80
+ function parseJsonLine(text) {
81
+ try {
82
+ return JSON.parse(text)
83
+ } catch {
84
+ return { raw: text }
85
+ }
86
+ }
87
+
88
+ function flushStreamBuffer(buffer, onLine) {
89
+ let pending = buffer
90
+ let newlineIndex = pending.indexOf("\n")
91
+ while (newlineIndex >= 0) {
92
+ const line = pending.slice(0, newlineIndex).trim()
93
+ pending = pending.slice(newlineIndex + 1)
94
+ if (line) onLine(line)
95
+ newlineIndex = pending.indexOf("\n")
96
+ }
97
+ return pending
98
+ }
99
+
100
+ async function execute(cmd, flags, context = {}) {
81
101
  const cfg = cmd.adapterConfig || {}
82
102
  const binary = cfg.command
83
103
  if (!binary) throw new Error("Process adapter requires adapterConfig.command")
@@ -93,6 +113,8 @@ async function execute(cmd, flags) {
93
113
  const passthroughInteractive = passthroughMode && flags.__passthroughInteractive === true
94
114
  const cwd = typeof cfg.cwd === "string" ? cfg.cwd : undefined
95
115
  const env = (cfg.env && typeof cfg.env === "object") ? { ...process.env, ...cfg.env } : process.env
116
+ const streamMode = cfg.stream || null
117
+ const onStreamEvent = typeof context.onStreamEvent === "function" ? context.onStreamEvent : null
96
118
 
97
119
  const check = preflightBinary(binary)
98
120
  if (!check.ok) {
@@ -136,6 +158,9 @@ async function execute(cmd, flags) {
136
158
  const child = spawn(binary, args, { stdio: passthroughInteractive ? "inherit" : ["ignore", "pipe", "pipe"], cwd, env })
137
159
  let out = ""
138
160
  let err = ""
161
+ let streamBuffer = ""
162
+ let streamEventCount = 0
163
+ let lastStreamEvent = null
139
164
  let settled = false
140
165
 
141
166
  const timer = setTimeout(() => {
@@ -152,7 +177,16 @@ async function execute(cmd, flags) {
152
177
  if (!passthroughInteractive) {
153
178
  child.stdout.setEncoding("utf-8")
154
179
  child.stderr.setEncoding("utf-8")
155
- child.stdout.on("data", chunk => { out += chunk })
180
+ child.stdout.on("data", chunk => {
181
+ out += chunk
182
+ if (streamMode !== "jsonl") return
183
+ streamBuffer = flushStreamBuffer(streamBuffer + chunk, line => {
184
+ const event = parseJsonLine(line)
185
+ streamEventCount += 1
186
+ lastStreamEvent = event
187
+ if (onStreamEvent) onStreamEvent(event)
188
+ })
189
+ })
156
190
  child.stderr.on("data", chunk => { err += chunk })
157
191
  }
158
192
 
@@ -194,6 +228,23 @@ async function execute(cmd, flags) {
194
228
  return
195
229
  }
196
230
 
231
+ if (streamMode === "jsonl") {
232
+ const trailing = streamBuffer.trim()
233
+ if (trailing) {
234
+ const event = parseJsonLine(trailing)
235
+ streamEventCount += 1
236
+ lastStreamEvent = event
237
+ if (onStreamEvent) onStreamEvent(event)
238
+ }
239
+ resolve({
240
+ streamed: true,
241
+ stream: streamMode,
242
+ event_count: streamEventCount,
243
+ last_event: lastStreamEvent
244
+ })
245
+ return
246
+ }
247
+
197
248
  const text = out.trim()
198
249
  if (!parsedAsJson) {
199
250
  resolve({ raw: text })
@@ -0,0 +1,320 @@
1
+ const PLUGIN_INSTALL_GUIDANCE = {
2
+ beads: {
3
+ plugin: "beads",
4
+ binary: "br",
5
+ check: "br --version",
6
+ install_steps: [
7
+ "curl -fsSL \"https://raw.githubusercontent.com/Dicklesworthstone/beads_rust/main/install.sh?$(date +%s)\" | bash",
8
+ "br --version"
9
+ ],
10
+ note: "Installation is intentionally delegated to your LLM/automation flow (dcli/scli/supercli)."
11
+ },
12
+ gwc: {
13
+ plugin: "gwc",
14
+ binary: "gws",
15
+ check: "gws --version",
16
+ install_steps: [
17
+ "npm install -g @googleworkspace/cli",
18
+ "gws --version"
19
+ ],
20
+ note: "Installation is intentionally delegated to your LLM/automation flow (dcli/scli/supercli)."
21
+ },
22
+ commiat: {
23
+ plugin: "commiat",
24
+ binary: "commiat",
25
+ check: "commiat --version",
26
+ install_steps: [
27
+ "npm install -g commiat",
28
+ "commiat --version"
29
+ ],
30
+ note: "Installation is intentionally delegated to your LLM/automation flow (dcli/scli/supercli)."
31
+ },
32
+ docker: {
33
+ plugin: "docker",
34
+ binary: "docker",
35
+ check: "docker --version",
36
+ install_steps: [
37
+ "docker --version"
38
+ ],
39
+ note: "Install Docker Engine/Desktop using your OS package manager, then verify with docker --version."
40
+ },
41
+ stripe: {
42
+ plugin: "stripe",
43
+ binary: "stripe",
44
+ check: "stripe --version",
45
+ install_steps: [
46
+ "brew install stripe/stripe-cli/stripe",
47
+ "stripe --version",
48
+ "stripe login"
49
+ ],
50
+ note: "Install Stripe CLI and authenticate with stripe login before running API commands."
51
+ },
52
+ vercel: {
53
+ plugin: "vercel",
54
+ binary: "vercel",
55
+ check: "vercel --version",
56
+ install_steps: [
57
+ "npm install -g vercel",
58
+ "vercel --version",
59
+ "vercel login"
60
+ ],
61
+ note: "Install Vercel CLI and authenticate with vercel login before running account or project commands."
62
+ },
63
+ linear: {
64
+ plugin: "linear",
65
+ binary: "linear",
66
+ check: "linear --version",
67
+ install_steps: [
68
+ "npm install -g @schpet/linear-cli",
69
+ "npm install -D @schpet/linear-cli",
70
+ "linear --version",
71
+ "linear auth login"
72
+ ],
73
+ note: "Targets community package @schpet/linear-cli; if installed locally, invoke via npx --no-install linear."
74
+ },
75
+ railway: {
76
+ plugin: "railway",
77
+ binary: "railway",
78
+ check: "railway --version",
79
+ install_steps: [
80
+ "npm install -g @railway/cli",
81
+ "npm install -D @railway/cli",
82
+ "railway --version",
83
+ "railway login"
84
+ ],
85
+ note: "If installed locally, use npx --no-install railway and ensure node_modules/.bin is in PATH for dcli plugin execution."
86
+ },
87
+ supabase: {
88
+ plugin: "supabase",
89
+ binary: "supabase",
90
+ check: "supabase --version",
91
+ install_steps: [
92
+ "npm install -g supabase",
93
+ "npm install -D supabase",
94
+ "supabase --version",
95
+ "supabase login"
96
+ ],
97
+ note: "If installed locally, use npx --no-install supabase and ensure node_modules/.bin is in PATH for dcli plugin execution."
98
+ },
99
+ gh: {
100
+ plugin: "gh",
101
+ binary: "gh",
102
+ check: "gh --version",
103
+ install_steps: [
104
+ "gh --version",
105
+ "gh auth login"
106
+ ],
107
+ note: "Install GitHub CLI with your platform package manager and authenticate with gh auth login before using account or repo commands."
108
+ },
109
+ kubectl: {
110
+ plugin: "kubectl",
111
+ binary: "kubectl",
112
+ check: "kubectl version --client",
113
+ install_steps: [
114
+ "kubectl version --client",
115
+ "kubectl config current-context"
116
+ ],
117
+ note: "Install kubectl with your platform package manager and ensure your kubeconfig is already configured before using cluster commands."
118
+ },
119
+ terraform: {
120
+ plugin: "terraform",
121
+ binary: "terraform",
122
+ check: "terraform version -json",
123
+ install_steps: [
124
+ "terraform version -json",
125
+ "terraform init"
126
+ ],
127
+ note: "Install Terraform with your platform package manager. For state-dependent commands, run inside an initialized Terraform working directory."
128
+ },
129
+ aws: {
130
+ plugin: "aws",
131
+ binary: "aws",
132
+ check: "aws --version",
133
+ install_steps: [
134
+ "aws --version",
135
+ "aws configure"
136
+ ],
137
+ note: "Install AWS CLI with your platform package manager and configure credentials before using account or service commands."
138
+ },
139
+ gcloud: {
140
+ plugin: "gcloud",
141
+ binary: "gcloud",
142
+ check: "gcloud --version",
143
+ install_steps: [
144
+ "gcloud --version",
145
+ "gcloud auth login"
146
+ ],
147
+ note: "Install Google Cloud CLI with your platform package manager and authenticate with gcloud auth login before using account or project commands."
148
+ },
149
+ az: {
150
+ plugin: "az",
151
+ binary: "az",
152
+ check: "az version",
153
+ install_steps: [
154
+ "az version",
155
+ "az login"
156
+ ],
157
+ note: "Install Azure CLI with your platform package manager and authenticate with az login before using account or resource commands."
158
+ },
159
+ helm: {
160
+ plugin: "helm",
161
+ binary: "helm",
162
+ check: "helm version --short",
163
+ install_steps: [
164
+ "helm version --short",
165
+ "kubectl config current-context"
166
+ ],
167
+ note: "Install Helm with your platform package manager. For release and cluster-backed commands, ensure your Kubernetes context is already configured."
168
+ },
169
+ npm: {
170
+ plugin: "npm",
171
+ binary: "npm",
172
+ check: "npm --version",
173
+ install_steps: [
174
+ "npm --version",
175
+ "npm login"
176
+ ],
177
+ note: "npm is usually installed with Node.js. Run npm login only if you need authenticated registry operations."
178
+ },
179
+ pulumi: {
180
+ plugin: "pulumi",
181
+ binary: "pulumi",
182
+ check: "pulumi version",
183
+ install_steps: [
184
+ "pulumi version",
185
+ "pulumi login"
186
+ ],
187
+ note: "Install Pulumi with your platform package manager and authenticate with pulumi login before using stack or cloud-backed commands."
188
+ },
189
+ pnpm: {
190
+ plugin: "pnpm",
191
+ binary: "pnpm",
192
+ check: "pnpm --version",
193
+ install_steps: [
194
+ "pnpm --version",
195
+ "pnpm login"
196
+ ],
197
+ note: "Install pnpm with your platform package manager or via corepack. Run pnpm login only if you need authenticated registry operations."
198
+ },
199
+ uv: {
200
+ plugin: "uv",
201
+ binary: "uv",
202
+ check: "uv --version",
203
+ install_steps: [
204
+ "curl -LsSf https://astral.sh/uv/install.sh | sh",
205
+ "uv --version"
206
+ ],
207
+ note: "Install uv with the official installer or your platform package manager. Run uv auth login only if you need private index authentication."
208
+ },
209
+ poetry: {
210
+ plugin: "poetry",
211
+ binary: "poetry",
212
+ check: "poetry --version",
213
+ install_steps: [
214
+ "curl -sSL https://install.python-poetry.org | python3 -",
215
+ "poetry --version"
216
+ ],
217
+ note: "Install Poetry with the official installer or pipx. Configure repository credentials only if you need private package publishing or installs."
218
+ },
219
+ eza: {
220
+ plugin: "eza",
221
+ binary: "eza",
222
+ check: "eza --version",
223
+ install_steps: [
224
+ "cargo install eza",
225
+ "eza --version"
226
+ ],
227
+ note: "Install eza with your platform package manager or cargo. It is a non-interactive ls replacement, so no login or account setup is required."
228
+ },
229
+ just: {
230
+ plugin: "just",
231
+ binary: "just",
232
+ check: "just --version",
233
+ install_steps: [
234
+ "cargo install just",
235
+ "just --version"
236
+ ],
237
+ note: "Install just with your platform package manager or cargo. Most useful commands operate on a nearby justfile, but help and version commands work anywhere."
238
+ },
239
+ watchexec: {
240
+ plugin: "watchexec",
241
+ binary: "watchexec",
242
+ check: "watchexec --version",
243
+ install_steps: [
244
+ "cargo install --locked watchexec-cli",
245
+ "watchexec --version"
246
+ ],
247
+ note: "Install watchexec with your platform package manager, cargo binstall, or cargo. It is non-interactive and works well for scripted file-watching workflows."
248
+ },
249
+ nextest: {
250
+ plugin: "nextest",
251
+ binary: "cargo-nextest",
252
+ check: "cargo-nextest --version",
253
+ install_steps: [
254
+ "cargo install cargo-nextest --locked",
255
+ "cargo-nextest --version"
256
+ ],
257
+ note: "Install cargo-nextest with prebuilt binaries or cargo. Most commands are intended for Rust workspaces, but version and help commands work anywhere."
258
+ },
259
+ cline: {
260
+ plugin: "cline",
261
+ binary: "cline",
262
+ check: "cline --version",
263
+ install_steps: [
264
+ "npm install -g cline",
265
+ "cline --version",
266
+ "supercli plugins install cline",
267
+ "supercli cline cli version --json",
268
+ "supercli cline task run --prompt \"List files with more LOC in cwd\" --cwd . --timeout 30 --json",
269
+ "supercli skills sync --json",
270
+ "supercli skills get repo:cline-non-interactive"
271
+ ],
272
+ note: "Prefer the wrapped cline task run/plan commands for unattended automation. They bake in documented non-interactive defaults with JSON streaming support and are easier for agents to parse than raw passthrough."
273
+ },
274
+ nullclaw: {
275
+ plugin: "nullclaw",
276
+ binary: "nullclaw",
277
+ check: "nullclaw --version",
278
+ install_steps: [
279
+ "supercli plugins install nullclaw",
280
+ "curl --version",
281
+ "brew install nullclaw",
282
+ "nullclaw --version",
283
+ "supercli skills list --catalog --provider nullclaw --json",
284
+ "supercli skills get nullclaw:root.agents",
285
+ "supercli nullclaw cli version --json",
286
+ "supercli nullclaw system status --json"
287
+ ],
288
+ note: "This hybrid plugin indexes remote NullClaw docs into the local skills catalog and exposes the local nullclaw binary through wrapped commands plus passthrough. curl is required for remote doc retrieval."
289
+ },
290
+ "agency-agents": {
291
+ plugin: "agency-agents",
292
+ binary: "curl",
293
+ check: "curl --version",
294
+ install_steps: [
295
+ "supercli plugins install agency-agents",
296
+ "supercli skills list --catalog --provider agency-agents --json",
297
+ "supercli skills get agency-agents:engineering.engineering-frontend-developer"
298
+ ],
299
+ note: "Install indexes remote markdown skills from https://github.com/msitarzewski/agency-agents (best effort, upstream paths may change)."
300
+ },
301
+ "visual-explainer": {
302
+ plugin: "visual-explainer",
303
+ binary: "curl",
304
+ check: "curl --version",
305
+ install_steps: [
306
+ "supercli plugins install visual-explainer",
307
+ "supercli skills list --catalog --provider visual-explainer --json",
308
+ "supercli skills get visual-explainer:visual-explainer.skill"
309
+ ],
310
+ note: "Install indexes normalized markdown skills from https://github.com/javimosch/visual-explainer (plugins/visual-explainer-normalized)."
311
+ }
312
+ }
313
+
314
+ function getPluginInstallGuidance(name) {
315
+ return PLUGIN_INSTALL_GUIDANCE[name] || null
316
+ }
317
+
318
+ module.exports = {
319
+ getPluginInstallGuidance
320
+ }