superacli 1.0.1 → 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.
- package/.beads/.br_history/issues.20260308_200823_636718328.jsonl +20 -0
- package/.beads/.br_history/issues.20260308_200823_636718328.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_200827_033159453.jsonl +21 -0
- package/.beads/.br_history/issues.20260308_200827_033159453.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_200829_595900053.jsonl +22 -0
- package/.beads/.br_history/issues.20260308_200829_595900053.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_200834_079930100.jsonl +23 -0
- package/.beads/.br_history/issues.20260308_200834_079930100.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_200858_370924996.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_200858_370924996.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201031_019730855.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201031_019730855.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201031_578974884.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201031_578974884.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201054_780345548.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201054_780345548.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201054_896980019.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201054_896980019.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201128_599819688.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201128_599819688.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201128_710221699.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201128_710221699.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201204_745649213.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201204_745649213.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201338_908436144.jsonl +24 -0
- package/.beads/.br_history/issues.20260308_201338_908436144.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201344_734860714.jsonl +25 -0
- package/.beads/.br_history/issues.20260308_201344_734860714.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_201630_819282295.jsonl +25 -0
- package/.beads/.br_history/issues.20260308_201630_819282295.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203538_054279699.jsonl +25 -0
- package/.beads/.br_history/issues.20260308_203538_054279699.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203547_597113070.jsonl +26 -0
- package/.beads/.br_history/issues.20260308_203547_597113070.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203547_775139216.jsonl +27 -0
- package/.beads/.br_history/issues.20260308_203547_775139216.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203547_950724773.jsonl +28 -0
- package/.beads/.br_history/issues.20260308_203547_950724773.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203548_107684523.jsonl +29 -0
- package/.beads/.br_history/issues.20260308_203548_107684523.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203548_310389993.jsonl +30 -0
- package/.beads/.br_history/issues.20260308_203548_310389993.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_203825_953337320.jsonl +31 -0
- package/.beads/.br_history/issues.20260308_203825_953337320.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_204056_071377736.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_204056_071377736.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205141_517616844.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205141_517616844.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205141_648994024.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205141_648994024.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205141_867598036.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205141_867598036.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205142_094157355.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205142_094157355.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205142_327315677.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205142_327315677.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205142_545563822.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205142_545563822.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205213_061989333.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205213_061989333.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205213_181103364.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205213_181103364.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205213_408872234.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205213_408872234.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205213_616681652.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205213_616681652.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205213_821507069.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205213_821507069.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205214_026661112.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205214_026661112.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205454_955250554.jsonl +32 -0
- package/.beads/.br_history/issues.20260308_205454_955250554.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205556_337800392.jsonl +33 -0
- package/.beads/.br_history/issues.20260308_205556_337800392.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_205824_274686694.jsonl +33 -0
- package/.beads/.br_history/issues.20260308_205824_274686694.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_210240_583768328.jsonl +34 -0
- package/.beads/.br_history/issues.20260308_210240_583768328.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212223_641541494.jsonl +34 -0
- package/.beads/.br_history/issues.20260308_212223_641541494.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212227_735550996.jsonl +35 -0
- package/.beads/.br_history/issues.20260308_212227_735550996.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212232_547298548.jsonl +36 -0
- package/.beads/.br_history/issues.20260308_212232_547298548.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212528_843628125.jsonl +37 -0
- package/.beads/.br_history/issues.20260308_212528_843628125.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212529_094530502.jsonl +38 -0
- package/.beads/.br_history/issues.20260308_212529_094530502.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212529_331000853.jsonl +39 -0
- package/.beads/.br_history/issues.20260308_212529_331000853.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212529_587925652.jsonl +40 -0
- package/.beads/.br_history/issues.20260308_212529_587925652.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212804_927764103.jsonl +41 -0
- package/.beads/.br_history/issues.20260308_212804_927764103.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212805_153673453.jsonl +42 -0
- package/.beads/.br_history/issues.20260308_212805_153673453.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212805_415982363.jsonl +43 -0
- package/.beads/.br_history/issues.20260308_212805_415982363.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212805_657497741.jsonl +44 -0
- package/.beads/.br_history/issues.20260308_212805_657497741.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212805_952838724.jsonl +45 -0
- package/.beads/.br_history/issues.20260308_212805_952838724.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212806_325433779.jsonl +46 -0
- package/.beads/.br_history/issues.20260308_212806_325433779.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212806_584685598.jsonl +47 -0
- package/.beads/.br_history/issues.20260308_212806_584685598.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212806_827817208.jsonl +48 -0
- package/.beads/.br_history/issues.20260308_212806_827817208.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212807_111320451.jsonl +49 -0
- package/.beads/.br_history/issues.20260308_212807_111320451.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212807_409545536.jsonl +50 -0
- package/.beads/.br_history/issues.20260308_212807_409545536.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212807_625063294.jsonl +51 -0
- package/.beads/.br_history/issues.20260308_212807_625063294.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212807_843906551.jsonl +52 -0
- package/.beads/.br_history/issues.20260308_212807_843906551.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212808_100304073.jsonl +53 -0
- package/.beads/.br_history/issues.20260308_212808_100304073.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212808_324723976.jsonl +54 -0
- package/.beads/.br_history/issues.20260308_212808_324723976.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212808_557513104.jsonl +55 -0
- package/.beads/.br_history/issues.20260308_212808_557513104.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_212808_788048322.jsonl +56 -0
- package/.beads/.br_history/issues.20260308_212808_788048322.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213702_613249728.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213702_613249728.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213715_115792063.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213715_115792063.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213715_462220666.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213715_462220666.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213727_191258923.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213727_191258923.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213727_684383652.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213727_684383652.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_213735_751882991.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_213735_751882991.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_222052_279844960.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_222052_279844960.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_222056_873282114.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_222056_873282114.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_222103_402410761.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_222103_402410761.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235202_180577215.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235202_180577215.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235202_387414163.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235202_387414163.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235202_564422794.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235202_564422794.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235202_742600597.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235202_742600597.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235208_133360069.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235208_133360069.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235505_473406307.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235505_473406307.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235505_662360489.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235505_662360489.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235505_843935624.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235505_843935624.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260308_235506_044530221.jsonl +57 -0
- package/.beads/.br_history/issues.20260308_235506_044530221.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_002618_115728731.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_002618_115728731.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_003748_878174586.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_003748_878174586.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_004057_868755623.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_004057_868755623.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_004058_512842163.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_004058_512842163.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_004058_994445226.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_004058_994445226.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_004059_475988596.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_004059_475988596.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_161902_566857851.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_161902_566857851.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_170512_277017739.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_170512_277017739.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_170512_477876921.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_170512_477876921.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_170512_664382701.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_170512_664382701.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_170512_859400333.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_170512_859400333.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212326_082771164.jsonl +57 -0
- package/.beads/.br_history/issues.20260309_212326_082771164.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212326_245619716.jsonl +58 -0
- package/.beads/.br_history/issues.20260309_212326_245619716.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212326_403198317.jsonl +59 -0
- package/.beads/.br_history/issues.20260309_212326_403198317.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212332_539197678.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_212332_539197678.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212332_731373599.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_212332_731373599.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_212332_928710953.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_212332_928710953.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_213021_341505240.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_213021_341505240.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_213022_023136934.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_213022_023136934.jsonl.meta.json +1 -0
- package/.beads/.br_history/issues.20260309_213022_400050719.jsonl +60 -0
- package/.beads/.br_history/issues.20260309_213022_400050719.jsonl.meta.json +1 -0
- package/.beads/config.yaml +4 -0
- package/.beads/issues.jsonl +60 -0
- package/.beads/metadata.json +4 -0
- package/README.md +226 -43
- package/__tests__/adapter-schema.test.js +119 -0
- package/__tests__/ask.test.js +327 -0
- package/__tests__/aws-plugin.test.js +84 -0
- package/__tests__/az-plugin.test.js +84 -0
- package/__tests__/builtin-adapter.test.js +29 -0
- package/__tests__/cline-plugin.test.js +109 -0
- package/__tests__/cline-skill.test.js +49 -0
- package/__tests__/config.test.js +297 -0
- package/__tests__/docker-plugin.test.js +95 -0
- package/__tests__/executor.test.js +303 -0
- package/__tests__/eza-plugin.test.js +81 -0
- package/__tests__/gcloud-plugin.test.js +86 -0
- package/__tests__/gh-plugin.test.js +86 -0
- package/__tests__/helm-plugin.test.js +81 -0
- package/__tests__/help-json.test.js +19 -0
- package/__tests__/http-adapter.test.js +118 -0
- package/__tests__/just-plugin.test.js +82 -0
- package/__tests__/kubectl-plugin.test.js +83 -0
- package/__tests__/linear-plugin.test.js +81 -0
- package/__tests__/mcp-adapter.test.js +187 -0
- package/__tests__/mcp-local.test.js +105 -0
- package/__tests__/namespace-passthrough.test.js +69 -0
- package/__tests__/nextest-plugin.test.js +82 -0
- package/__tests__/npm-plugin.test.js +81 -0
- package/__tests__/nullclaw-plugin.test.js +157 -0
- package/__tests__/openapi-adapter.test.js +199 -0
- package/__tests__/plan-runtime.test.js +43 -0
- package/__tests__/planner.test.js +47 -0
- package/__tests__/plugin-agency-agents.test.js +62 -0
- package/__tests__/plugin-nullclaw.test.js +78 -0
- package/__tests__/plugin-visual-explainer.test.js +62 -0
- package/__tests__/plugins-command.test.js +220 -0
- package/__tests__/plugins-manager.test.js +353 -0
- package/__tests__/plugins-registry.test.js +114 -0
- package/__tests__/plugins-store.test.js +115 -0
- package/__tests__/pnpm-plugin.test.js +81 -0
- package/__tests__/poetry-plugin.test.js +83 -0
- package/__tests__/process-adapter.test.js +143 -0
- package/__tests__/pulumi-plugin.test.js +81 -0
- package/__tests__/railway-plugin.test.js +84 -0
- package/__tests__/server-app.test.js +67 -0
- package/__tests__/server-config-service.test.js +79 -0
- package/__tests__/server-routes-ask.test.js +89 -0
- package/__tests__/server-routes-commands.test.js +55 -0
- package/__tests__/server-routes-config.test.js +87 -0
- package/__tests__/server-routes-jobs.test.js +53 -0
- package/__tests__/server-routes-misc.test.js +112 -0
- package/__tests__/server-storage-adapter.test.js +40 -0
- package/__tests__/server-storage-file.test.js +73 -0
- package/__tests__/server-storage-mongo.test.js +74 -0
- package/__tests__/shell-adapter.test.js +90 -0
- package/__tests__/skills-catalog.test.js +98 -0
- package/__tests__/skills.test.js +442 -0
- package/__tests__/stripe-plugin.test.js +81 -0
- package/__tests__/supabase-plugin.test.js +86 -0
- package/__tests__/terraform-plugin.test.js +83 -0
- package/__tests__/uv-plugin.test.js +81 -0
- package/__tests__/vercel-plugin.test.js +81 -0
- package/__tests__/watchexec-plugin.test.js +80 -0
- package/cli/adapter-schema.js +108 -0
- package/cli/adapters/builtin.js +43 -0
- package/cli/adapters/process.js +262 -0
- package/cli/adapters/shell.js +82 -0
- package/cli/config.js +12 -9
- package/cli/executor.js +6 -1
- package/cli/help-json.js +3 -1
- package/cli/namespace-passthrough.js +38 -0
- package/cli/plugin-install-guidance.js +320 -0
- package/cli/plugins-command.js +138 -0
- package/cli/plugins-manager.js +552 -0
- package/cli/plugins-registry.js +80 -0
- package/cli/plugins-store.js +56 -0
- package/cli/skills-catalog.js +237 -0
- package/cli/skills.js +180 -6
- package/cli/supercli.js +150 -58
- package/docs/docs.html +224 -0
- package/docs/feature-gaps.md +16 -0
- package/docs/index.html +164 -0
- package/docs/plugin-examples.md +397 -0
- package/docs/plugin-harness-guide.md +452 -0
- package/docs/plugins.md +44 -0
- package/docs/skills/cline-non-interactive/SKILL.md +59 -0
- package/docs/skills-catalog.md +81 -0
- package/docs/supported-harnesses.md +277 -0
- package/docs/visual-overview.md +21 -0
- package/jest.config.js +25 -0
- package/package.json +9 -3
- package/plugins/agency-agents/plugin.json +15 -0
- package/plugins/agency-agents/scripts/post-install.js +122 -0
- package/plugins/aws/README.md +46 -0
- package/plugins/aws/plugin.json +42 -0
- package/plugins/az/README.md +46 -0
- package/plugins/az/plugin.json +42 -0
- package/plugins/beads/plugin.json +202 -0
- package/plugins/clickup/plugin.json +38 -0
- package/plugins/clickup/scripts/post-install.js +107 -0
- package/plugins/clickup/scripts/post-uninstall.js +30 -0
- package/plugins/cline/README.md +48 -0
- package/plugins/cline/plugin.json +92 -0
- package/plugins/commiat/plugin.json +36 -0
- package/plugins/docker/MANIFEST.md +39 -0
- package/plugins/docker/README.md +35 -0
- package/plugins/docker/examples/build-image.sh +7 -0
- package/plugins/docker/examples/inspect-container.sh +6 -0
- package/plugins/docker/examples/list-containers.sh +4 -0
- package/plugins/docker/examples/multi-step-workflow.sh +10 -0
- package/plugins/docker/examples/run-container.sh +7 -0
- package/plugins/docker/plugin.json +266 -0
- package/plugins/eza/README.md +40 -0
- package/plugins/eza/plugin.json +42 -0
- package/plugins/gcloud/README.md +46 -0
- package/plugins/gcloud/plugin.json +42 -0
- package/plugins/gh/README.md +46 -0
- package/plugins/gh/plugin.json +43 -0
- package/plugins/gwc/plugin.json +35 -0
- package/plugins/helm/README.md +42 -0
- package/plugins/helm/plugin.json +42 -0
- package/plugins/just/README.md +42 -0
- package/plugins/just/plugin.json +42 -0
- package/plugins/kubectl/README.md +46 -0
- package/plugins/kubectl/plugin.json +42 -0
- package/plugins/linear/README.md +60 -0
- package/plugins/linear/plugin.json +42 -0
- package/plugins/nextest/README.md +42 -0
- package/plugins/nextest/plugin.json +42 -0
- package/plugins/npm/README.md +46 -0
- package/plugins/npm/plugin.json +42 -0
- package/plugins/nullclaw/README.md +45 -0
- package/plugins/nullclaw/plugin.json +64 -0
- package/plugins/nullclaw/scripts/post-install.js +189 -0
- package/plugins/nullclaw/scripts/post-uninstall.js +25 -0
- package/plugins/openfang/plugin.json +37 -0
- package/plugins/openfang/scripts/post-install.js +163 -0
- package/plugins/openfang/scripts/post-uninstall.js +30 -0
- package/plugins/plugins.json +295 -0
- package/plugins/pnpm/README.md +46 -0
- package/plugins/pnpm/plugin.json +42 -0
- package/plugins/poetry/README.md +46 -0
- package/plugins/poetry/plugin.json +42 -0
- package/plugins/pulumi/README.md +46 -0
- package/plugins/pulumi/plugin.json +42 -0
- package/plugins/railway/README.md +58 -0
- package/plugins/railway/plugin.json +43 -0
- package/plugins/stripe/README.md +49 -0
- package/plugins/stripe/plugin.json +52 -0
- package/plugins/supabase/README.md +55 -0
- package/plugins/supabase/plugin.json +42 -0
- package/plugins/superpowers/plugin.json +22 -0
- package/plugins/superpowers/scripts/post-install.js +124 -0
- package/plugins/superpowers/scripts/post-uninstall.js +30 -0
- package/plugins/terraform/README.md +46 -0
- package/plugins/terraform/plugin.json +42 -0
- package/plugins/uv/README.md +46 -0
- package/plugins/uv/plugin.json +42 -0
- package/plugins/vercel/README.md +47 -0
- package/plugins/vercel/plugin.json +42 -0
- package/plugins/visual-explainer/plugin.json +15 -0
- package/plugins/visual-explainer/scripts/post-install.js +111 -0
- package/plugins/watchexec/README.md +40 -0
- package/plugins/watchexec/plugin.json +42 -0
- package/tests/test-aws-smoke.sh +56 -0
- package/tests/test-az-smoke.sh +56 -0
- package/tests/test-cli.js +116 -2
- package/tests/test-cline-smoke.sh +37 -0
- package/tests/test-eza-smoke.sh +33 -0
- package/tests/test-gcloud-smoke.sh +56 -0
- package/tests/test-gh-smoke.sh +56 -0
- package/tests/test-helm-smoke.sh +33 -0
- package/tests/test-just-smoke.sh +40 -0
- package/tests/test-kubectl-smoke.sh +37 -0
- package/tests/test-linear-smoke.sh +97 -0
- package/tests/test-nextest-smoke.sh +33 -0
- package/tests/test-npm-smoke.sh +32 -0
- package/tests/test-nullclaw-smoke.sh +51 -0
- package/tests/test-plugins-registry.js +212 -0
- package/tests/test-pnpm-smoke.sh +33 -0
- package/tests/test-poetry-smoke.sh +33 -0
- package/tests/test-pulumi-smoke.sh +33 -0
- package/tests/test-railway-smoke.sh +95 -0
- package/tests/test-stripe-smoke.sh +55 -0
- package/tests/test-supabase-smoke.sh +95 -0
- package/tests/test-terraform-smoke.sh +33 -0
- package/tests/test-uv-smoke.sh +33 -0
- package/tests/test-vercel-smoke.sh +55 -0
- package/tests/test-watchexec-smoke.sh +33 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const { spawnSync } = require("child_process")
|
|
2
|
+
const { addProvider, syncCatalog } = require("../../../cli/skills-catalog")
|
|
3
|
+
|
|
4
|
+
const OWNER = "javimosch"
|
|
5
|
+
const REPO = "visual-explainer"
|
|
6
|
+
const REF = "main"
|
|
7
|
+
const SOURCE_REPO = `https://github.com/${OWNER}/${REPO}`
|
|
8
|
+
const TREE_URL = `https://api.github.com/repos/${OWNER}/${REPO}/git/trees/${REF}?recursive=1`
|
|
9
|
+
const RAW_BASE_URL = `https://raw.githubusercontent.com/${OWNER}/${REPO}/${REF}`
|
|
10
|
+
const NORMALIZED_PREFIX = "plugins/visual-explainer-normalized/"
|
|
11
|
+
|
|
12
|
+
function integrationError(message, suggestions = []) {
|
|
13
|
+
return Object.assign(new Error(message), {
|
|
14
|
+
code: 105,
|
|
15
|
+
type: "integration_error",
|
|
16
|
+
recoverable: true,
|
|
17
|
+
suggestions
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function fetchJson(url) {
|
|
22
|
+
const res = spawnSync("curl", ["-fsSL", url], { encoding: "utf-8", timeout: 15000 })
|
|
23
|
+
if (res.error) {
|
|
24
|
+
throw integrationError(`Failed to fetch visual-explainer metadata: ${res.error.message}`, ["Check internet connectivity", "Retry: supercli plugins install visual-explainer"])
|
|
25
|
+
}
|
|
26
|
+
if (res.status !== 0) {
|
|
27
|
+
throw integrationError(`Failed to fetch visual-explainer metadata: ${(res.stderr || "").trim() || `exit ${res.status}`}`, ["Check internet connectivity", "Retry: supercli plugins install visual-explainer"])
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse((res.stdout || "").trim() || "{}")
|
|
31
|
+
} catch (err) {
|
|
32
|
+
throw integrationError(`Invalid visual-explainer metadata response: ${err.message}`)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isNormalizedSkillFile(filePath) {
|
|
37
|
+
return filePath.startsWith(NORMALIZED_PREFIX) && filePath.endsWith(".md")
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function toSkillId(relativePath) {
|
|
41
|
+
if (relativePath === "SKILL.md") return "visual-explainer.skill"
|
|
42
|
+
return `visual-explainer.${relativePath.replace(/\.md$/, "").replace(/\//g, ".")}`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function toSkillName(relativePath) {
|
|
46
|
+
const base = relativePath.split("/").pop() || relativePath
|
|
47
|
+
return base
|
|
48
|
+
.replace(/\.md$/, "")
|
|
49
|
+
.split("-")
|
|
50
|
+
.map(part => (part ? part[0].toUpperCase() + part.slice(1) : part))
|
|
51
|
+
.join(" ")
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function buildRemoteEntriesFromTree(treeResponse) {
|
|
55
|
+
const tree = Array.isArray(treeResponse.tree) ? treeResponse.tree : []
|
|
56
|
+
const entries = []
|
|
57
|
+
|
|
58
|
+
for (const node of tree) {
|
|
59
|
+
if (!node || node.type !== "blob" || typeof node.path !== "string") continue
|
|
60
|
+
if (!isNormalizedSkillFile(node.path)) continue
|
|
61
|
+
const relativePath = node.path.slice(NORMALIZED_PREFIX.length)
|
|
62
|
+
entries.push({
|
|
63
|
+
id: toSkillId(relativePath),
|
|
64
|
+
name: toSkillName(relativePath),
|
|
65
|
+
path: node.path,
|
|
66
|
+
source_url: `${RAW_BASE_URL}/${node.path}`
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
entries.sort((a, b) => a.id.localeCompare(b.id))
|
|
71
|
+
return entries
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function run() {
|
|
75
|
+
const treeResponse = fetchJson(TREE_URL)
|
|
76
|
+
const entries = buildRemoteEntriesFromTree(treeResponse)
|
|
77
|
+
if (entries.length === 0) {
|
|
78
|
+
throw integrationError("visual-explainer plugin found no normalized remote skill files to index")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
addProvider({
|
|
82
|
+
name: "visual-explainer",
|
|
83
|
+
type: "remote_static",
|
|
84
|
+
enabled: true,
|
|
85
|
+
source_repo: SOURCE_REPO,
|
|
86
|
+
ref: REF,
|
|
87
|
+
entries
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const index = syncCatalog()
|
|
91
|
+
return {
|
|
92
|
+
provider: "visual-explainer",
|
|
93
|
+
entries: entries.length,
|
|
94
|
+
synced_skills: Array.isArray(index.skills) ? index.skills.length : 0
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (require.main === module) {
|
|
99
|
+
try {
|
|
100
|
+
const result = run()
|
|
101
|
+
process.stdout.write(JSON.stringify(result))
|
|
102
|
+
} catch (err) {
|
|
103
|
+
process.stderr.write(err.message)
|
|
104
|
+
process.exit(1)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
module.exports = {
|
|
109
|
+
run,
|
|
110
|
+
buildRemoteEntriesFromTree
|
|
111
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# watchexec Plugin Harness
|
|
2
|
+
|
|
3
|
+
This plugin integrates the watchexec CLI into dcli with one wrapped core command and full namespace passthrough.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Ensure watchexec is available on your machine:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
watchexec --version
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Available Commands
|
|
14
|
+
|
|
15
|
+
### CLI Version (Wrapped)
|
|
16
|
+
|
|
17
|
+
Returns the watchexec CLI version via `watchexec --version`.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
dcli watchexec cli version --json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Full Passthrough
|
|
24
|
+
|
|
25
|
+
You can run any watchexec command through the `watchexec` namespace.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Show help
|
|
29
|
+
dcli watchexec --help
|
|
30
|
+
|
|
31
|
+
# Print the manual
|
|
32
|
+
dcli watchexec --manual
|
|
33
|
+
|
|
34
|
+
# Run a watcher command directly
|
|
35
|
+
dcli watchexec -e js -- echo changed
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Output
|
|
39
|
+
|
|
40
|
+
Wrapped commands and passthrough responses are returned in dcli envelope format when `--json` is used with dcli-level commands.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "watchexec",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "watchexec CLI plugin for dcli",
|
|
5
|
+
"source": "https://github.com/watchexec/watchexec",
|
|
6
|
+
"checks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "binary",
|
|
9
|
+
"name": "watchexec"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"commands": [
|
|
13
|
+
{
|
|
14
|
+
"namespace": "watchexec",
|
|
15
|
+
"resource": "cli",
|
|
16
|
+
"action": "version",
|
|
17
|
+
"description": "Show watchexec CLI version",
|
|
18
|
+
"adapter": "process",
|
|
19
|
+
"adapterConfig": {
|
|
20
|
+
"command": "watchexec",
|
|
21
|
+
"baseArgs": ["--version"],
|
|
22
|
+
"parseJson": false,
|
|
23
|
+
"missingDependencyHelp": "Please install watchexec to use this command."
|
|
24
|
+
},
|
|
25
|
+
"args": []
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"namespace": "watchexec",
|
|
29
|
+
"resource": "_",
|
|
30
|
+
"action": "_",
|
|
31
|
+
"description": "Passthrough command to execute any watchexec CLI command",
|
|
32
|
+
"adapter": "process",
|
|
33
|
+
"adapterConfig": {
|
|
34
|
+
"command": "watchexec",
|
|
35
|
+
"passthrough": true,
|
|
36
|
+
"parseJson": true,
|
|
37
|
+
"missingDependencyHelp": "Please install watchexec to use this command."
|
|
38
|
+
},
|
|
39
|
+
"args": []
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== AWS CLI smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v aws >/dev/null 2>&1; then
|
|
11
|
+
echo "AWS CLI not found in PATH."
|
|
12
|
+
echo "Install it first: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing aws plugin..."
|
|
22
|
+
node "${CLI}" plugins install aws --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Checking AWS authentication (aws sts get-caller-identity)..."
|
|
25
|
+
if ! aws sts get-caller-identity >/dev/null 2>&1; then
|
|
26
|
+
if [[ ! -t 0 ]]; then
|
|
27
|
+
echo "No working AWS credentials found and no TTY available. Run 'aws configure' manually, then rerun this script."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
echo "AWS credentials are required for live smoke tests."
|
|
32
|
+
read -r -p "Run 'aws configure' now? [Y/n] " ANSWER
|
|
33
|
+
ANSWER="${ANSWER:-Y}"
|
|
34
|
+
if [[ "${ANSWER}" =~ ^[Yy]$ ]]; then
|
|
35
|
+
aws configure
|
|
36
|
+
else
|
|
37
|
+
echo "Cancelled. Run 'aws configure' and retry when ready."
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if ! aws sts get-caller-identity >/dev/null 2>&1; then
|
|
42
|
+
echo "AWS authentication check still failed after configure."
|
|
43
|
+
echo "Verify with: aws sts get-caller-identity"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
else
|
|
47
|
+
echo "AWS CLI is already authenticated. Skipping configuration."
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "Running wrapped command smoke test..."
|
|
51
|
+
node "${CLI}" aws account identity --json
|
|
52
|
+
|
|
53
|
+
echo "Running passthrough smoke test..."
|
|
54
|
+
node "${CLI}" aws s3api list-buckets
|
|
55
|
+
|
|
56
|
+
echo "Smoke test completed."
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== Azure CLI smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v az >/dev/null 2>&1; then
|
|
11
|
+
echo "Azure CLI not found in PATH."
|
|
12
|
+
echo "Install it first: https://learn.microsoft.com/cli/azure/install-azure-cli"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing az plugin..."
|
|
22
|
+
node "${CLI}" plugins install az --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Checking Azure authentication (az account show)..."
|
|
25
|
+
if ! az account show >/dev/null 2>&1; then
|
|
26
|
+
if [[ ! -t 0 ]]; then
|
|
27
|
+
echo "No working Azure login found and no TTY available. Run 'az login' manually, then rerun this script."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
echo "Azure authentication is required for live smoke tests."
|
|
32
|
+
read -r -p "Run 'az login' now? [Y/n] " ANSWER
|
|
33
|
+
ANSWER="${ANSWER:-Y}"
|
|
34
|
+
if [[ "${ANSWER}" =~ ^[Yy]$ ]]; then
|
|
35
|
+
az login
|
|
36
|
+
else
|
|
37
|
+
echo "Cancelled. Run 'az login' and retry when ready."
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if ! az account show >/dev/null 2>&1; then
|
|
42
|
+
echo "Azure authentication check still failed after login."
|
|
43
|
+
echo "Verify with: az account show"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
else
|
|
47
|
+
echo "Azure CLI is already authenticated. Skipping login."
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "Running wrapped command smoke test..."
|
|
51
|
+
node "${CLI}" az account show --json
|
|
52
|
+
|
|
53
|
+
echo "Running passthrough smoke test..."
|
|
54
|
+
node "${CLI}" az group list
|
|
55
|
+
|
|
56
|
+
echo "Smoke test completed."
|
package/tests/test-cli.js
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
const { execSync } = require("child_process");
|
|
9
|
+
const fs = require("fs");
|
|
10
|
+
const os = require("os");
|
|
9
11
|
const path = require("path");
|
|
10
12
|
|
|
11
13
|
const SERVER = process.env.SUPERCLI_SERVER || "http://127.0.0.1:3000";
|
|
@@ -134,6 +136,18 @@ test("help --json returns namespaces", () => {
|
|
|
134
136
|
assert(Array.isArray(d.namespaces), "should have namespaces array");
|
|
135
137
|
});
|
|
136
138
|
|
|
139
|
+
test("no-args non-tty returns agent bootstrap payload", () => {
|
|
140
|
+
const r = runNoServer("--json");
|
|
141
|
+
assert(r.ok, "no-args json should succeed");
|
|
142
|
+
const d = JSON.parse(r.output);
|
|
143
|
+
assert(d.mode === "agent_bootstrap", "should return agent bootstrap mode");
|
|
144
|
+
assert(Array.isArray(d.next), "should include next commands");
|
|
145
|
+
assert(
|
|
146
|
+
d.next.includes("supercli skills teach --format skill.md"),
|
|
147
|
+
"should point agents to skills teach",
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
|
|
137
151
|
// ── --help-json ──
|
|
138
152
|
test("--help-json returns capability discovery", () => {
|
|
139
153
|
run("sync --json");
|
|
@@ -163,8 +177,8 @@ test("sync is unavailable when SUPERCLI_SERVER is not set", () => {
|
|
|
163
177
|
});
|
|
164
178
|
|
|
165
179
|
test("plan works in local mode without SUPERCLI_SERVER", () => {
|
|
166
|
-
|
|
167
|
-
const r = runNoServer("plan
|
|
180
|
+
runNoServer("plugins install beads --json");
|
|
181
|
+
const r = runNoServer("plan beads install steps --json");
|
|
168
182
|
assert(r.ok, "local plan should succeed");
|
|
169
183
|
const d = JSON.parse(r.output);
|
|
170
184
|
assert(d.execution_mode === "local", "execution_mode should be local");
|
|
@@ -173,6 +187,7 @@ test("plan works in local mode without SUPERCLI_SERVER", () => {
|
|
|
173
187
|
Array.isArray(d.steps) && d.steps.length > 0,
|
|
174
188
|
"should include plan steps",
|
|
175
189
|
);
|
|
190
|
+
runNoServer("plugins remove beads --json");
|
|
176
191
|
});
|
|
177
192
|
|
|
178
193
|
test("local mcp registry can add/list/remove without SUPERCLI_SERVER", () => {
|
|
@@ -197,6 +212,95 @@ test("local mcp registry can add/list/remove without SUPERCLI_SERVER", () => {
|
|
|
197
212
|
assert(remove.ok, "mcp remove should succeed");
|
|
198
213
|
});
|
|
199
214
|
|
|
215
|
+
test("plugins install/list/show/remove works locally", () => {
|
|
216
|
+
const install = runNoServer("plugins install ./plugins/beads --json");
|
|
217
|
+
assert(install.ok, "plugins install should succeed");
|
|
218
|
+
const installData = JSON.parse(install.output);
|
|
219
|
+
assert(installData.ok === true, "install should return ok");
|
|
220
|
+
|
|
221
|
+
const list = runNoServer("plugins list --json");
|
|
222
|
+
assert(list.ok, "plugins list should succeed");
|
|
223
|
+
const listData = JSON.parse(list.output);
|
|
224
|
+
assert(Array.isArray(listData.plugins), "plugins list should return array");
|
|
225
|
+
assert(listData.plugins.find((p) => p.name === "beads"), "beads plugin should be listed");
|
|
226
|
+
|
|
227
|
+
const show = runNoServer("plugins show beads --json");
|
|
228
|
+
assert(show.ok, "plugins show should succeed");
|
|
229
|
+
const showData = JSON.parse(show.output);
|
|
230
|
+
assert(showData.plugin.name === "beads", "plugins show should return beads plugin");
|
|
231
|
+
|
|
232
|
+
const doctor = runNoServer("plugins doctor beads --json");
|
|
233
|
+
assert(doctor.ok, "plugins doctor should succeed");
|
|
234
|
+
const doctorData = JSON.parse(doctor.output);
|
|
235
|
+
assert(doctorData.plugin === "beads", "doctor should target beads plugin");
|
|
236
|
+
assert(Array.isArray(doctorData.checks), "doctor should include checks array");
|
|
237
|
+
|
|
238
|
+
const remove = runNoServer("plugins remove beads --json");
|
|
239
|
+
assert(remove.ok, "plugins remove should succeed");
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("beads install steps command works after plugin install", () => {
|
|
243
|
+
runNoServer("plugins install beads --json");
|
|
244
|
+
const r = runNoServer("beads install steps --json");
|
|
245
|
+
assert(r.ok, "beads install steps should succeed");
|
|
246
|
+
const d = JSON.parse(r.output);
|
|
247
|
+
assert(d.data && Array.isArray(d.data.install_steps), "should include install steps array");
|
|
248
|
+
runNoServer("plugins remove beads --json");
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("gwc plugin supports install/show/doctor and passthrough", () => {
|
|
252
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "dcli-gws-"));
|
|
253
|
+
const gwsPath = path.join(dir, "gws");
|
|
254
|
+
fs.writeFileSync(
|
|
255
|
+
gwsPath,
|
|
256
|
+
[
|
|
257
|
+
"#!/usr/bin/env node",
|
|
258
|
+
"const args = process.argv.slice(2);",
|
|
259
|
+
"if (args.includes('--version')) { console.log('gws 0.0.0-test'); process.exit(0); }",
|
|
260
|
+
"if (args.length === 0 || args.includes('--help')) { console.log('gws-help-ok'); process.exit(0); }",
|
|
261
|
+
"console.log(JSON.stringify({ ok: true, args }));"
|
|
262
|
+
].join("\n"),
|
|
263
|
+
"utf-8",
|
|
264
|
+
);
|
|
265
|
+
fs.chmodSync(gwsPath, 0o755);
|
|
266
|
+
|
|
267
|
+
const env = { ...process.env, PATH: `${dir}:${process.env.PATH || ""}` };
|
|
268
|
+
|
|
269
|
+
const install = runNoServer("plugins install ./plugins/gwc --json", { env });
|
|
270
|
+
assert(install.ok, "gwc install should succeed");
|
|
271
|
+
|
|
272
|
+
const show = runNoServer("plugins show gwc --json", { env });
|
|
273
|
+
assert(show.ok, "plugins show gwc should succeed");
|
|
274
|
+
const showData = JSON.parse(show.output);
|
|
275
|
+
assert(showData.plugin.name === "gwc", "plugins show should return gwc plugin");
|
|
276
|
+
|
|
277
|
+
const doctor = runNoServer("plugins doctor gwc --json", { env });
|
|
278
|
+
assert(doctor.ok, "plugins doctor gwc should succeed");
|
|
279
|
+
const doctorData = JSON.parse(doctor.output);
|
|
280
|
+
assert(doctorData.ok === true, "gwc doctor should pass with mocked gws binary");
|
|
281
|
+
|
|
282
|
+
const passthroughHelp = runNoServer("gwc --help --json", { env });
|
|
283
|
+
assert(passthroughHelp.ok, "gwc passthrough help should succeed");
|
|
284
|
+
const helpData = JSON.parse(passthroughHelp.output);
|
|
285
|
+
assert(helpData.data && helpData.data.raw.includes("gws-help-ok"), "gwc help should passthrough to gws");
|
|
286
|
+
|
|
287
|
+
const passthrough = runNoServer("gwc drive files list --params '{\"pageSize\":1}' --json", { env });
|
|
288
|
+
assert(passthrough.ok, "gwc passthrough call should succeed");
|
|
289
|
+
const passData = JSON.parse(passthrough.output);
|
|
290
|
+
assert(passData.data && passData.data.ok === true, "gwc passthrough should return gws JSON");
|
|
291
|
+
assert(Array.isArray(passData.data.args), "gwc passthrough should include forwarded args");
|
|
292
|
+
assert(passData.data.args[0] === "drive", "gwc passthrough should preserve positional args");
|
|
293
|
+
|
|
294
|
+
const installSteps = runNoServer("gwc install steps --json", { env });
|
|
295
|
+
assert(installSteps.ok, "gwc install steps should use builtin command");
|
|
296
|
+
const installData = JSON.parse(installSteps.output);
|
|
297
|
+
assert(Array.isArray(installData.data.install_steps), "gwc install steps should include install steps");
|
|
298
|
+
|
|
299
|
+
const remove = runNoServer("plugins remove gwc --json", { env });
|
|
300
|
+
assert(remove.ok, "plugins remove gwc should succeed");
|
|
301
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
302
|
+
});
|
|
303
|
+
|
|
200
304
|
// ── config show ──
|
|
201
305
|
test("config show returns cache info", () => {
|
|
202
306
|
// First sync
|
|
@@ -237,6 +341,10 @@ test("skills list --json returns minimal metadata", () => {
|
|
|
237
341
|
Object.keys(first).sort().join(",") === "description,name",
|
|
238
342
|
"skill metadata should only include name and description",
|
|
239
343
|
);
|
|
344
|
+
assert(
|
|
345
|
+
d.skills.some((s) => s.name === "plugins.registry.usage"),
|
|
346
|
+
"skills list should include plugins registry usage skill",
|
|
347
|
+
);
|
|
240
348
|
});
|
|
241
349
|
|
|
242
350
|
// ── skills teach ──
|
|
@@ -267,6 +375,12 @@ test("skills get can include DAG section", () => {
|
|
|
267
375
|
assert(r.output.includes("dag:"), "should include dag section");
|
|
268
376
|
});
|
|
269
377
|
|
|
378
|
+
test("skills get plugins registry usage skill", () => {
|
|
379
|
+
const r = run("skills get plugins.registry.usage");
|
|
380
|
+
assert(r.ok, "plugins registry skill should succeed");
|
|
381
|
+
assert(r.output.includes("plugins explore"), "plugins registry skill should include explore guidance");
|
|
382
|
+
});
|
|
383
|
+
|
|
270
384
|
// ── namespace listing ──
|
|
271
385
|
test("namespace listing returns resources", () => {
|
|
272
386
|
const r = run("test --json");
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== cline smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v cline >/dev/null 2>&1; then
|
|
11
|
+
echo "cline not found in PATH."
|
|
12
|
+
echo "Install it first and verify with: cline --version"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing cline plugin..."
|
|
22
|
+
node "${CLI}" plugins install cline --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Running wrapped version command..."
|
|
25
|
+
node "${CLI}" cline cli version --json
|
|
26
|
+
|
|
27
|
+
echo "Running wrapped non-interactive task command..."
|
|
28
|
+
node "${CLI}" cline task run --prompt "List files with more LOC in cwd" --cwd . --timeout 30 --json
|
|
29
|
+
|
|
30
|
+
echo "Running passthrough smoke test..."
|
|
31
|
+
node "${CLI}" cline --help
|
|
32
|
+
|
|
33
|
+
echo "Syncing and checking local skill catalog..."
|
|
34
|
+
node "${CLI}" skills sync --json >/dev/null
|
|
35
|
+
node "${CLI}" skills get repo:cline-non-interactive >/dev/null
|
|
36
|
+
|
|
37
|
+
echo "Smoke test completed."
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== eza smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v eza >/dev/null 2>&1; then
|
|
11
|
+
echo "eza not found in PATH."
|
|
12
|
+
echo "Install it first: https://eza.rocks"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing eza plugin..."
|
|
22
|
+
node "${CLI}" plugins install eza --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Checking eza CLI availability (eza --version)..."
|
|
25
|
+
eza --version >/dev/null
|
|
26
|
+
|
|
27
|
+
echo "Running wrapped command smoke test..."
|
|
28
|
+
node "${CLI}" eza cli version --json
|
|
29
|
+
|
|
30
|
+
echo "Running passthrough smoke test..."
|
|
31
|
+
node "${CLI}" eza --oneline --color=never
|
|
32
|
+
|
|
33
|
+
echo "Smoke test completed."
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== Google Cloud CLI smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v gcloud >/dev/null 2>&1; then
|
|
11
|
+
echo "gcloud not found in PATH."
|
|
12
|
+
echo "Install it first: https://cloud.google.com/sdk/docs/install"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing gcloud plugin..."
|
|
22
|
+
node "${CLI}" plugins install gcloud --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Checking Google Cloud authentication (gcloud auth list --format=json)..."
|
|
25
|
+
if ! gcloud auth list --format=json >/dev/null 2>&1; then
|
|
26
|
+
if [[ ! -t 0 ]]; then
|
|
27
|
+
echo "No working gcloud auth found and no TTY available. Run 'gcloud auth login' manually, then rerun this script."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
echo "Google Cloud authentication is required for live smoke tests."
|
|
32
|
+
read -r -p "Run 'gcloud auth login' now? [Y/n] " ANSWER
|
|
33
|
+
ANSWER="${ANSWER:-Y}"
|
|
34
|
+
if [[ "${ANSWER}" =~ ^[Yy]$ ]]; then
|
|
35
|
+
gcloud auth login
|
|
36
|
+
else
|
|
37
|
+
echo "Cancelled. Run 'gcloud auth login' and retry when ready."
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if ! gcloud auth list --format=json >/dev/null 2>&1; then
|
|
42
|
+
echo "Google Cloud authentication check still failed after login."
|
|
43
|
+
echo "Verify with: gcloud auth list --format=json"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
else
|
|
47
|
+
echo "Google Cloud CLI is already authenticated. Skipping login."
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "Running wrapped command smoke test..."
|
|
51
|
+
node "${CLI}" gcloud account list --json
|
|
52
|
+
|
|
53
|
+
echo "Running passthrough smoke test..."
|
|
54
|
+
node "${CLI}" gcloud projects list --format=json
|
|
55
|
+
|
|
56
|
+
echo "Smoke test completed."
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
CLI="${ROOT_DIR}/cli/supercli.js"
|
|
7
|
+
|
|
8
|
+
echo "== GitHub CLI smoke test (interactive) =="
|
|
9
|
+
|
|
10
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
11
|
+
echo "GitHub CLI not found in PATH (expected binary: gh)."
|
|
12
|
+
echo "Install it first: https://cli.github.com/"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
17
|
+
echo "Node.js not found in PATH"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
echo "Installing/refreshing gh plugin..."
|
|
22
|
+
node "${CLI}" plugins install gh --on-conflict replace --json >/dev/null
|
|
23
|
+
|
|
24
|
+
echo "Checking GitHub authentication (gh auth status)..."
|
|
25
|
+
if ! gh auth status >/dev/null 2>&1; then
|
|
26
|
+
if [[ ! -t 0 ]]; then
|
|
27
|
+
echo "Not authenticated and no TTY available. Run 'gh auth login' manually, then rerun this script."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
echo "GitHub login is required for live smoke tests."
|
|
32
|
+
read -r -p "Run 'gh auth login' now? [Y/n] " ANSWER
|
|
33
|
+
ANSWER="${ANSWER:-Y}"
|
|
34
|
+
if [[ "${ANSWER}" =~ ^[Yy]$ ]]; then
|
|
35
|
+
gh auth login
|
|
36
|
+
else
|
|
37
|
+
echo "Cancelled. Run 'gh auth login' and retry when ready."
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if ! gh auth status >/dev/null 2>&1; then
|
|
42
|
+
echo "GitHub authentication check still failed after login."
|
|
43
|
+
echo "Verify with: gh auth status"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
else
|
|
47
|
+
echo "GitHub CLI is already authenticated. Skipping login."
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "Running wrapped command smoke test..."
|
|
51
|
+
node "${CLI}" gh account status --json
|
|
52
|
+
|
|
53
|
+
echo "Running passthrough smoke test..."
|
|
54
|
+
node "${CLI}" gh repo list --limit 1 --json name,nameWithOwner,url
|
|
55
|
+
|
|
56
|
+
echo "Smoke test completed."
|