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,237 @@
|
|
|
1
|
+
const fs = require("fs")
|
|
2
|
+
const os = require("os")
|
|
3
|
+
const path = require("path")
|
|
4
|
+
const { spawnSync } = require("child_process")
|
|
5
|
+
|
|
6
|
+
function dcliDir() {
|
|
7
|
+
return process.env.SUPERCLI_HOME || path.join(os.homedir(), ".dcli")
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function providersFile() {
|
|
11
|
+
return path.join(dcliDir(), "skills-providers.json")
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function indexFile() {
|
|
15
|
+
return path.join(dcliDir(), "skills-index.json")
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function ensureDir() {
|
|
19
|
+
const dir = dcliDir()
|
|
20
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function defaultProviders() {
|
|
24
|
+
const home = os.homedir()
|
|
25
|
+
const cwd = process.cwd()
|
|
26
|
+
return [
|
|
27
|
+
{ name: "opencode", type: "local_fs", roots: [path.join(home, ".config", "opencode", "skills")], enabled: true },
|
|
28
|
+
{ name: "codex", type: "local_fs", roots: [path.join(home, ".config", "codex", "skills")], enabled: true },
|
|
29
|
+
{ name: "windsurf", type: "local_fs", roots: [path.join(home, ".config", "windsurf", "skills")], enabled: true },
|
|
30
|
+
{ name: "cursor", type: "local_fs", roots: [path.join(home, ".config", "cursor", "skills")], enabled: true },
|
|
31
|
+
{ name: "repo", type: "repo_fs", roots: [path.join(cwd, ".agents", "skills"), path.join(cwd, "docs", "skills")], enabled: true }
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function readJson(file, fallback) {
|
|
36
|
+
try {
|
|
37
|
+
if (!fs.existsSync(file)) return fallback
|
|
38
|
+
return JSON.parse(fs.readFileSync(file, "utf-8"))
|
|
39
|
+
} catch {
|
|
40
|
+
return fallback
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function writeJson(file, value) {
|
|
45
|
+
ensureDir()
|
|
46
|
+
fs.writeFileSync(file, JSON.stringify(value, null, 2))
|
|
47
|
+
return value
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function listProviders() {
|
|
51
|
+
const providers = readJson(providersFile(), defaultProviders())
|
|
52
|
+
return Array.isArray(providers) ? providers : defaultProviders()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function setProviders(providers) {
|
|
56
|
+
return writeJson(providersFile(), providers)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function addProvider(entry) {
|
|
60
|
+
const providers = listProviders()
|
|
61
|
+
const idx = providers.findIndex(p => p.name === entry.name)
|
|
62
|
+
if (idx >= 0) providers[idx] = entry
|
|
63
|
+
else providers.push(entry)
|
|
64
|
+
setProviders(providers)
|
|
65
|
+
return entry
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function removeProvider(name) {
|
|
69
|
+
const providers = listProviders()
|
|
70
|
+
const next = providers.filter(p => p.name !== name)
|
|
71
|
+
const removed = next.length !== providers.length
|
|
72
|
+
setProviders(next)
|
|
73
|
+
return removed
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getProvider(name) {
|
|
77
|
+
return listProviders().find(p => p.name === name) || null
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function readIndex() {
|
|
81
|
+
const empty = { version: 1, updated_at: null, skills: [] }
|
|
82
|
+
const idx = readJson(indexFile(), empty)
|
|
83
|
+
if (!idx || typeof idx !== "object") return empty
|
|
84
|
+
if (!Array.isArray(idx.skills)) idx.skills = []
|
|
85
|
+
return idx
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function walkDir(dir) {
|
|
89
|
+
const files = []
|
|
90
|
+
if (!fs.existsSync(dir)) return files
|
|
91
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true })
|
|
92
|
+
for (const entry of entries) {
|
|
93
|
+
const full = path.join(dir, entry.name)
|
|
94
|
+
if (entry.isDirectory()) {
|
|
95
|
+
files.push(...walkDir(full))
|
|
96
|
+
continue
|
|
97
|
+
}
|
|
98
|
+
if (entry.isFile() && entry.name === "SKILL.md") files.push(full)
|
|
99
|
+
}
|
|
100
|
+
return files
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function parseFrontmatter(markdown) {
|
|
104
|
+
if (!markdown.startsWith("---\n")) return { frontmatter: {}, body: markdown }
|
|
105
|
+
const end = markdown.indexOf("\n---\n", 4)
|
|
106
|
+
if (end < 0) return { frontmatter: {}, body: markdown }
|
|
107
|
+
const raw = markdown.slice(4, end)
|
|
108
|
+
const body = markdown.slice(end + 5)
|
|
109
|
+
const frontmatter = {}
|
|
110
|
+
for (const line of raw.split("\n")) {
|
|
111
|
+
const idx = line.indexOf(":")
|
|
112
|
+
if (idx < 0) continue
|
|
113
|
+
const key = line.slice(0, idx).trim()
|
|
114
|
+
const value = line.slice(idx + 1).trim().replace(/^"|"$/g, "")
|
|
115
|
+
if (key) frontmatter[key] = value
|
|
116
|
+
}
|
|
117
|
+
return { frontmatter, body }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function baseSkillId(filePath, frontmatter, root) {
|
|
121
|
+
if (frontmatter.skill_name) return frontmatter.skill_name
|
|
122
|
+
const rel = path.relative(root, filePath)
|
|
123
|
+
return rel.replace(/\\/g, "/").replace(/\/SKILL\.md$/, "").replace(/\//g, ".")
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function syncCatalog() {
|
|
127
|
+
const providers = listProviders()
|
|
128
|
+
const skills = []
|
|
129
|
+
|
|
130
|
+
for (const provider of providers) {
|
|
131
|
+
if (!provider.enabled) continue
|
|
132
|
+
|
|
133
|
+
if (provider.type === "remote_static") {
|
|
134
|
+
const entries = Array.isArray(provider.entries) ? provider.entries : []
|
|
135
|
+
for (const entry of entries) {
|
|
136
|
+
if (!entry || !entry.id || !entry.source_url) continue
|
|
137
|
+
skills.push({
|
|
138
|
+
id: `${provider.name}:${entry.id}`,
|
|
139
|
+
provider: provider.name,
|
|
140
|
+
name: entry.name || entry.id,
|
|
141
|
+
description: entry.description || "",
|
|
142
|
+
source_url: entry.source_url,
|
|
143
|
+
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
|
144
|
+
updated_at: new Date().toISOString()
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
continue
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const roots = Array.isArray(provider.roots) ? provider.roots : []
|
|
151
|
+
for (const root of roots) {
|
|
152
|
+
const files = walkDir(root)
|
|
153
|
+
for (const filePath of files) {
|
|
154
|
+
const markdown = fs.readFileSync(filePath, "utf-8")
|
|
155
|
+
const { frontmatter, body } = parseFrontmatter(markdown)
|
|
156
|
+
const baseId = baseSkillId(filePath, frontmatter, root)
|
|
157
|
+
const heading = body.split("\n").find(l => l.startsWith("# "))
|
|
158
|
+
const name = frontmatter.skill_name || (heading ? heading.slice(2).trim() : baseId)
|
|
159
|
+
const description = frontmatter.description || ""
|
|
160
|
+
const tags = typeof frontmatter.tags === "string" ? frontmatter.tags.split(",").map(t => t.trim()).filter(Boolean) : []
|
|
161
|
+
|
|
162
|
+
skills.push({
|
|
163
|
+
id: `${provider.name}:${baseId}`,
|
|
164
|
+
provider: provider.name,
|
|
165
|
+
name,
|
|
166
|
+
description,
|
|
167
|
+
source_path: filePath,
|
|
168
|
+
tags,
|
|
169
|
+
updated_at: new Date().toISOString()
|
|
170
|
+
})
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
skills.sort((a, b) => a.id.localeCompare(b.id))
|
|
176
|
+
const next = {
|
|
177
|
+
version: 1,
|
|
178
|
+
updated_at: new Date().toISOString(),
|
|
179
|
+
providers: providers.map(p => p.name),
|
|
180
|
+
skills
|
|
181
|
+
}
|
|
182
|
+
writeJson(indexFile(), next)
|
|
183
|
+
return next
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function listCatalogSkills(options = {}) {
|
|
187
|
+
const idx = readIndex()
|
|
188
|
+
let items = idx.skills || []
|
|
189
|
+
if (options.provider) items = items.filter(s => s.provider === options.provider)
|
|
190
|
+
return items.map(s => ({ id: s.id, name: s.name, description: s.description, provider: s.provider }))
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function searchCatalog(query, options = {}) {
|
|
194
|
+
const q = String(query || "").trim().toLowerCase()
|
|
195
|
+
if (!q) return []
|
|
196
|
+
const items = listCatalogSkills(options)
|
|
197
|
+
return items.filter(s =>
|
|
198
|
+
s.id.toLowerCase().includes(q) ||
|
|
199
|
+
s.name.toLowerCase().includes(q) ||
|
|
200
|
+
String(s.description || "").toLowerCase().includes(q)
|
|
201
|
+
)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function getCatalogSkill(providerId) {
|
|
205
|
+
const idx = readIndex()
|
|
206
|
+
const hit = (idx.skills || []).find(s => s.id === providerId)
|
|
207
|
+
if (!hit) return null
|
|
208
|
+
let markdown = null
|
|
209
|
+
|
|
210
|
+
if (hit.source_path) {
|
|
211
|
+
if (!fs.existsSync(hit.source_path)) return null
|
|
212
|
+
markdown = fs.readFileSync(hit.source_path, "utf-8")
|
|
213
|
+
} else if (hit.source_url) {
|
|
214
|
+
const res = spawnSync("curl", ["-fsSL", hit.source_url], { encoding: "utf-8", timeout: 15000 })
|
|
215
|
+
if (res.error || res.status !== 0) return null
|
|
216
|
+
markdown = (res.stdout || "").trim()
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (!markdown) return null
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
...hit,
|
|
223
|
+
markdown
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
module.exports = {
|
|
228
|
+
listProviders,
|
|
229
|
+
addProvider,
|
|
230
|
+
removeProvider,
|
|
231
|
+
getProvider,
|
|
232
|
+
readIndex,
|
|
233
|
+
syncCatalog,
|
|
234
|
+
listCatalogSkills,
|
|
235
|
+
searchCatalog,
|
|
236
|
+
getCatalogSkill
|
|
237
|
+
}
|
package/cli/skills.js
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
const { createPlan } = require("./planner")
|
|
2
2
|
|
|
3
|
+
const PLUGINS_USAGE_SKILL_ID = "plugins.registry.usage"
|
|
4
|
+
const {
|
|
5
|
+
listProviders,
|
|
6
|
+
addProvider,
|
|
7
|
+
removeProvider,
|
|
8
|
+
getProvider,
|
|
9
|
+
readIndex,
|
|
10
|
+
syncCatalog,
|
|
11
|
+
listCatalogSkills,
|
|
12
|
+
searchCatalog,
|
|
13
|
+
getCatalogSkill
|
|
14
|
+
} = require("./skills-catalog")
|
|
15
|
+
|
|
3
16
|
function normalizeSkillId(input) {
|
|
4
17
|
if (!input || typeof input !== "string") return null
|
|
5
18
|
const parts = input.trim().split(".")
|
|
@@ -163,14 +176,61 @@ function buildTeachSkillMarkdown(options = {}) {
|
|
|
163
176
|
]
|
|
164
177
|
}
|
|
165
178
|
|
|
166
|
-
return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nThis skill teaches LLMs how to discover and use SuperCLI skills:\n\n1. List available skills:\n\n\`\`\`bash\nsupercli skills list --json\n\`\`\`\n\n2. Fetch a specific skill:\n\n\`\`\`bash\nsupercli skills get <namespace.resource.action> --format skill.md\n\`\`\`\n\n3. Parse YAML frontmatter to understand command, arguments, output schema, and metadata.\n\n4. Execute the command with validated arguments:\n\n\`\`\`bash\nsupercli <namespace> <resource> <action> --arg value --json\n\`\`\`\n\n# Examples\n\n\`\`\`bash\nsupercli skills teach --format skill.md\nsupercli skills teach --format skill.md --show-dag\n\`\`\``
|
|
179
|
+
return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nThis skill teaches LLMs how to discover and use SuperCLI skills:\n\n1. List available skills:\n\n\`\`\`bash\nsupercli skills list --json\n\`\`\`\n\n2. Fetch a specific skill:\n\n\`\`\`bash\nsupercli skills get <namespace.resource.action> --format skill.md\n\`\`\`\n\n3. Parse YAML frontmatter to understand command, arguments, output schema, and metadata.\n\n4. Execute the command with validated arguments:\n\n\`\`\`bash\nsupercli <namespace> <resource> <action> --arg value --json\n\`\`\`\n\n5. For plugin discovery and remote plugin installs, use:\n\n\`\`\`bash\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md\n\`\`\`\n\n6. To index skills from a local directory (e.g., a project with docs/skills):\n\n\`\`\`bash\n# List current providers\nsupercli skills providers list --json\n\n# Add a local provider for a project\nsupercli skills providers add --name myproject --type local_fs --roots ./myproject/docs/skills\n\n# Sync the catalog to index new skills\nsupercli skills sync\n\n# Search skills from the new provider\nsupercli skills search <query> --provider myproject\n\n# Remove a provider if needed\nsupercli skills providers remove --name myproject\n\`\`\`\n\n# Examples\n\n\`\`\`bash\nsupercli skills teach --format skill.md\nsupercli skills teach --format skill.md --show-dag\nsupercli skills providers add --name myproject --type local_fs --roots ./myproject/docs/skills\nsupercli skills sync\nsupercli skills search btc --provider myproject\n\`\`\``
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function buildPluginsUsageSkillMarkdown(options = {}) {
|
|
183
|
+
const includeDag = !!options.showDag
|
|
184
|
+
const frontmatter = {
|
|
185
|
+
skill_name: "plugins_registry_usage",
|
|
186
|
+
description: "Explains plugin discovery from plugins/plugins.json and local/remote plugin installation flows.",
|
|
187
|
+
command: `skills get ${PLUGINS_USAGE_SKILL_ID}`,
|
|
188
|
+
arguments: [
|
|
189
|
+
{
|
|
190
|
+
name: "format",
|
|
191
|
+
type: "string",
|
|
192
|
+
required: false,
|
|
193
|
+
description: "Output format, default skill.md"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: "show-dag",
|
|
197
|
+
type: "boolean",
|
|
198
|
+
required: false,
|
|
199
|
+
description: "Include internal DAG for agent reasoning"
|
|
200
|
+
}
|
|
201
|
+
],
|
|
202
|
+
output_schema: {
|
|
203
|
+
instruction: "string",
|
|
204
|
+
examples: "array"
|
|
205
|
+
},
|
|
206
|
+
metadata: {
|
|
207
|
+
side_effects: false,
|
|
208
|
+
risk_level: "safe",
|
|
209
|
+
dag_supported: true
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (includeDag) {
|
|
214
|
+
frontmatter.dag = [
|
|
215
|
+
{ id: 1, type: "load_plugin_registry" },
|
|
216
|
+
{ id: 2, type: "resolve_install_method", depends_on: [1] },
|
|
217
|
+
{ id: 3, type: "emit_plugin_usage_instructions", depends_on: [2] }
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return `---\n${renderYamlObject(frontmatter)}\n---\n\n# Instruction\n\nUse this workflow for plugin discovery and installation:\n\n1. Explore registry metadata (name/description/tags):\n\n\`\`\`bash\nsupercli plugins explore --json\nsupercli plugins explore --name commiat --json\nsupercli plugins explore --tags git,ai --json\n\`\`\`\n\n2. Install by registry name:\n\n\`\`\`bash\nsupercli plugins install commiat --json\n\`\`\`\n\n3. Install directly from a remote git repository:\n\n\`\`\`bash\nsupercli plugins install --git https://github.com/org/repo.git --manifest-path plugins/supercli/plugin.json --ref main --json\n\`\`\`\n\n4. Validate installed plugin health and guidance:\n\n\`\`\`bash\nsupercli plugins doctor commiat --json\nsupercli plugins show commiat --json\n\`\`\`\n\n5. Use the namespace command exposed by the plugin.\n\n# Examples\n\n\`\`\`bash\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md\nsupercli skills get ${PLUGINS_USAGE_SKILL_ID} --format skill.md --show-dag\n\`\`\``
|
|
167
222
|
}
|
|
168
223
|
|
|
169
224
|
function listSkillsMetadata(config) {
|
|
170
|
-
|
|
225
|
+
const commandSkills = (config.commands || []).map(cmd => ({
|
|
171
226
|
name: `${cmd.namespace}.${cmd.resource}.${cmd.action}`,
|
|
172
227
|
description: cmd.description || ""
|
|
173
228
|
}))
|
|
229
|
+
commandSkills.push({
|
|
230
|
+
name: PLUGINS_USAGE_SKILL_ID,
|
|
231
|
+
description: "Discover and install plugins from the registry or remote git repos"
|
|
232
|
+
})
|
|
233
|
+
return commandSkills
|
|
174
234
|
}
|
|
175
235
|
|
|
176
236
|
function handleSkillsCommand(options) {
|
|
@@ -178,8 +238,102 @@ function handleSkillsCommand(options) {
|
|
|
178
238
|
const subcommand = positional[1]
|
|
179
239
|
const format = flags.format || "skill.md"
|
|
180
240
|
|
|
241
|
+
if (subcommand === "providers") {
|
|
242
|
+
const action = positional[2]
|
|
243
|
+
if (action === "list") {
|
|
244
|
+
const providers = listProviders()
|
|
245
|
+
if (humanMode && !flags.json) {
|
|
246
|
+
console.log("\n ⚡ Skill Providers\n")
|
|
247
|
+
outputHumanTable(providers, [
|
|
248
|
+
{ key: "name", label: "Name" },
|
|
249
|
+
{ key: "type", label: "Type" },
|
|
250
|
+
{ key: "enabled", label: "Enabled" }
|
|
251
|
+
])
|
|
252
|
+
console.log("")
|
|
253
|
+
} else {
|
|
254
|
+
output({ providers })
|
|
255
|
+
}
|
|
256
|
+
return true
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (action === "add") {
|
|
260
|
+
const name = flags.name || positional[3]
|
|
261
|
+
const type = flags.type || "local_fs"
|
|
262
|
+
const rootsRaw = flags.roots || flags.root
|
|
263
|
+
if (!name || !rootsRaw) {
|
|
264
|
+
outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers add --name <provider> --roots <path1,path2> [--type local_fs|repo_fs]", recoverable: false })
|
|
265
|
+
return true
|
|
266
|
+
}
|
|
267
|
+
const roots = String(rootsRaw).split(",").map(r => r.trim()).filter(Boolean)
|
|
268
|
+
const provider = addProvider({ name, type, roots, enabled: flags.enabled !== "false" })
|
|
269
|
+
output({ ok: true, provider })
|
|
270
|
+
return true
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (action === "remove") {
|
|
274
|
+
const name = flags.name || positional[3]
|
|
275
|
+
if (!name) {
|
|
276
|
+
outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers remove --name <provider>", recoverable: false })
|
|
277
|
+
return true
|
|
278
|
+
}
|
|
279
|
+
output({ ok: true, removed: removeProvider(name) })
|
|
280
|
+
return true
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (action === "show") {
|
|
284
|
+
const name = flags.name || positional[3]
|
|
285
|
+
if (!name) {
|
|
286
|
+
outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills providers show --name <provider>", recoverable: false })
|
|
287
|
+
return true
|
|
288
|
+
}
|
|
289
|
+
const provider = getProvider(name)
|
|
290
|
+
if (!provider) {
|
|
291
|
+
outputError({ code: 92, type: "resource_not_found", message: `Provider '${name}' not found`, suggestions: ["Run: supercli skills providers list"] })
|
|
292
|
+
return true
|
|
293
|
+
}
|
|
294
|
+
output({ provider })
|
|
295
|
+
return true
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
outputError({ code: 85, type: "invalid_argument", message: "Unknown providers subcommand. Use: list, add, remove, show", recoverable: false })
|
|
299
|
+
return true
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (subcommand === "sync") {
|
|
303
|
+
const index = syncCatalog()
|
|
304
|
+
output({ ok: true, updated_at: index.updated_at, providers: index.providers, skills: index.skills.length })
|
|
305
|
+
return true
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (subcommand === "search") {
|
|
309
|
+
const query = flags.query || positional.slice(2).join(" ")
|
|
310
|
+
if (!query) {
|
|
311
|
+
outputError({ code: 85, type: "invalid_argument", message: "Usage: supercli skills search --query <text> [--provider <provider>]", recoverable: false })
|
|
312
|
+
return true
|
|
313
|
+
}
|
|
314
|
+
const skills = searchCatalog(query, { provider: flags.provider })
|
|
315
|
+
output({ skills })
|
|
316
|
+
return true
|
|
317
|
+
}
|
|
318
|
+
|
|
181
319
|
if (subcommand === "list") {
|
|
182
|
-
const
|
|
320
|
+
const useCatalog = flags.catalog === true || flags.catalog === "true" || !!flags.provider
|
|
321
|
+
if (flags["no-catalog"] || flags.catalog === false || flags.catalog === "false" || !useCatalog) {
|
|
322
|
+
const skills = listSkillsMetadata(config)
|
|
323
|
+
if (humanMode && !flags.json) {
|
|
324
|
+
console.log("\n ⚡ Skills (command-level only)\n")
|
|
325
|
+
outputHumanTable(skills, [
|
|
326
|
+
{ key: "name", label: "Name" },
|
|
327
|
+
{ key: "description", label: "Description" }
|
|
328
|
+
])
|
|
329
|
+
console.log("")
|
|
330
|
+
} else {
|
|
331
|
+
output({ skills })
|
|
332
|
+
}
|
|
333
|
+
return true
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const skills = listCatalogSkills({ provider: flags.provider })
|
|
183
337
|
if (humanMode && !flags.json) {
|
|
184
338
|
console.log("\n ⚡ Skills\n")
|
|
185
339
|
outputHumanTable(skills, [
|
|
@@ -188,7 +342,8 @@ function handleSkillsCommand(options) {
|
|
|
188
342
|
])
|
|
189
343
|
console.log("")
|
|
190
344
|
} else {
|
|
191
|
-
|
|
345
|
+
const index = readIndex() || {}
|
|
346
|
+
output({ skills, index: { updated_at: index.updated_at || null } })
|
|
192
347
|
}
|
|
193
348
|
return true
|
|
194
349
|
}
|
|
@@ -208,6 +363,17 @@ function handleSkillsCommand(options) {
|
|
|
208
363
|
return true
|
|
209
364
|
}
|
|
210
365
|
|
|
366
|
+
const skillId = positional[2] || ""
|
|
367
|
+
if (skillId.includes(":")) {
|
|
368
|
+
const skill = getCatalogSkill(skillId)
|
|
369
|
+
if (!skill) {
|
|
370
|
+
outputError({ code: 92, type: "resource_not_found", message: `Skill ${skillId} not found in local catalog`, suggestions: ["Run: supercli skills sync", "Run: supercli skills list --catalog --json"] })
|
|
371
|
+
return true
|
|
372
|
+
}
|
|
373
|
+
console.log(skill.markdown)
|
|
374
|
+
return true
|
|
375
|
+
}
|
|
376
|
+
|
|
211
377
|
const dottedId = positional[2] || (positional[3] && positional[4] ? `${positional[2]}.${positional[3]}.${positional[4]}` : "")
|
|
212
378
|
const parsed = normalizeSkillId(dottedId)
|
|
213
379
|
if (!parsed) {
|
|
@@ -215,6 +381,11 @@ function handleSkillsCommand(options) {
|
|
|
215
381
|
return true
|
|
216
382
|
}
|
|
217
383
|
|
|
384
|
+
if (parsed.id === PLUGINS_USAGE_SKILL_ID) {
|
|
385
|
+
console.log(buildPluginsUsageSkillMarkdown({ showDag: !!flags["show-dag"] }))
|
|
386
|
+
return true
|
|
387
|
+
}
|
|
388
|
+
|
|
218
389
|
const cmd = config.commands.find(c =>
|
|
219
390
|
c.namespace === parsed.namespace && c.resource === parsed.resource && c.action === parsed.action
|
|
220
391
|
)
|
|
@@ -227,14 +398,17 @@ function handleSkillsCommand(options) {
|
|
|
227
398
|
return true
|
|
228
399
|
}
|
|
229
400
|
|
|
230
|
-
outputError({ code: 85, type: "invalid_argument", message: "Unknown skills subcommand. Use: list, get, teach", recoverable: false })
|
|
401
|
+
outputError({ code: 85, type: "invalid_argument", message: "Unknown skills subcommand. Use: list, get, teach, sync, search, providers", recoverable: false })
|
|
231
402
|
return true
|
|
232
403
|
}
|
|
233
404
|
|
|
234
405
|
module.exports = {
|
|
406
|
+
PLUGINS_USAGE_SKILL_ID,
|
|
235
407
|
normalizeSkillId,
|
|
236
408
|
buildCommandSkillMarkdown,
|
|
237
409
|
buildTeachSkillMarkdown,
|
|
410
|
+
buildPluginsUsageSkillMarkdown,
|
|
238
411
|
listSkillsMetadata,
|
|
239
|
-
handleSkillsCommand
|
|
412
|
+
handleSkillsCommand,
|
|
413
|
+
renderYamlObject // Export for testing coverage
|
|
240
414
|
}
|