@duckmind/dm-darwin-x64 0.50.0 → 0.50.9
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/dm +0 -0
- package/extensions/.dm-extensions.json +2 -183
- package/extensions/dm-image2/index.js +7 -7
- package/extensions/dm-image2/src/image-lib.mjs +1 -1
- package/package.json +1 -1
- package/CHANGELOG.md +0 -4796
- package/extensions/dm-ask-user/index.js +0 -10
- package/extensions/dm-ask-user/package.json +0 -18
- package/extensions/dm-cli-anything/index.js +0 -5
- package/extensions/dm-cli-anything/package.json +0 -22
- package/extensions/dm-cli-anything/skills/cli-anything/SKILL.md +0 -21
- package/extensions/dm-cli-anything/vendor/public_registry.json +0 -367
- package/extensions/dm-cli-anything/vendor/registry.json +0 -1232
- package/extensions/dm-grill-me/index.js +0 -174
- package/extensions/dm-grill-me/package.json +0 -23
- package/extensions/dm-tasks/package.json +0 -20
- package/extensions/dm-tasks/src/auto-clear.js +0 -1
- package/extensions/dm-tasks/src/index.js +0 -212
- package/extensions/dm-tasks/src/process-tracker.js +0 -1
- package/extensions/dm-tasks/src/task-store.js +0 -1
- package/extensions/dm-tasks/src/tasks-config.js +0 -1
- package/extensions/dm-tasks/src/types.js +0 -0
- package/extensions/dm-tasks/src/ui/settings-menu.js +0 -1
- package/extensions/dm-tasks/src/ui/task-widget.js +0 -1
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{Editor as _j,Key as N,matchesKey as P,Text as r,truncateToWidth as Dj,visibleWidth as $j}from"@duckmind/dm-tui";import{Type as Z}from"@sinclair/typebox";var zj=Z.Object({value:Z.String({description:"Value returned when selected"}),label:Z.String({description:"Display label"}),description:Z.Optional(Z.String({description:"Help text shown below the label"}))}),Nj=Z.Object({id:Z.String({description:"Unique identifier for this question"}),type:Z.Unsafe({type:"string",enum:["radio","checkbox","text"],description:"Question type: radio (single-select), checkbox (multi-select), or text (free input)"}),prompt:Z.String({description:"The question text to display"}),label:Z.Optional(Z.String({description:"Short label for tab bar (defaults to Q1, Q2...)"})),options:Z.Optional(Z.Array(zj,{description:"Options for radio/checkbox types"})),allowOther:Z.Optional(Z.Boolean({description:"Add an 'Other...' option with text input (default: true for radio/checkbox)"})),required:Z.Optional(Z.Boolean({description:"Whether an answer is required (default: true)"})),placeholder:Z.Optional(Z.String({description:"Placeholder for text inputs"})),default:Z.Optional(Z.Union([Z.String(),Z.Array(Z.String())],{description:"Default value(s). String for radio/text, string[] for checkbox"}))}),Pj=Z.Object({title:Z.Optional(Z.String({description:"Form title displayed at the top"})),description:Z.Optional(Z.String({description:"Brief context or instructions shown under the title"})),questions:Z.Array(Nj,{description:"One or more questions to ask. Use radio for single-select, checkbox for multi-select, text for free input"})});function Uj(y){return y.map((L,U)=>({...L,label:L.label||`Q${U+1}`,options:L.options||[],allowOther:L.type==="text"?!1:L.allowOther!==!1,required:L.required!==!1}))}function Vj(y,L){let U=y.split(" "),R=[],C="";for(let k of U)if(!C)C=k;else if(C.length+1+k.length<=L)C+=` ${k}`;else R.push(C),C=k;if(C)R.push(C);return R.length?R:[""]}function Fj(y){return{content:[{type:"text",text:y}],details:{questions:[],answers:[],cancelled:!0}}}var E={radioOn:"◉",radioOff:"○",checkOn:"☑",checkOff:"☐",pointer:"❯",dot:"·",check:"✓",pencil:"✎",submit:"✓"};function Oj(y){y.registerTool({name:"ask_user_question",label:"Ask User",description:`Ask the user one or more questions using an interactive form. Supports three question types:
|
|
2
|
-
- **radio**: Single-select from predefined options (like multiple choice)
|
|
3
|
-
- **checkbox**: Multi-select from options (pick all that apply)
|
|
4
|
-
- **text**: Free-form text input
|
|
5
|
-
|
|
6
|
-
Each radio/checkbox question can include an "Other..." option that lets the user type a custom answer.
|
|
7
|
-
|
|
8
|
-
Use this tool when you need user input to proceed — for clarifying requirements, getting preferences, confirming decisions, or choosing between alternatives. Prefer this over asking plain-text questions in your response.`,promptSnippet:"Ask the user interactive questions with radio, checkbox, or text inputs",promptGuidelines:["Use ask_user_question instead of asking questions in plain text when you need structured user input.","Prefer radio for single-choice, checkbox for multi-choice, text for open-ended answers.","Always include an 'Other' escape hatch (allowOther: true) unless the options are exhaustive.","Group related questions in a single call rather than making multiple separate calls."],parameters:Pj,async execute(L,U,R,C,k){if(!k.hasUI)return Fj("Error: UI not available (running in non-interactive mode)");if(!U.questions.length)return Fj("Error: No questions provided");let _=Uj(U.questions),$=_.length>1,q=_.length+($?1:0),x=await k.ui.custom((Y,D,o,T)=>{let Q=0,f=0,v=!1,A=null,p,K=new Map,l=new Map,c=new Map,S=new Map;for(let j of _)if(j.type==="checkbox"){let B=new Set;if(Array.isArray(j.default))for(let J of j.default)B.add(J);l.set(j.id,B)}else if(j.type==="text"&&typeof j.default==="string")S.set(j.id,j.default);else if(j.type==="radio"&&typeof j.default==="string"){let B=j.options.find((J)=>J.value===j.default);if(B)K.set(j.id,{value:B.value,label:B.label,wasCustom:!1})}let W=new _j(Y,{borderColor:(j)=>D.fg("accent",j),selectList:{selectedPrefix:(j)=>D.fg("accent",j),selectedText:(j)=>D.fg("accent",j),description:(j)=>D.fg("muted",j),scrollInfo:(j)=>D.fg("dim",j),noMatch:(j)=>D.fg("warning",j)}});function Gj(){if(Q<_.length-1)return Q+1;return _.length}function n(){if(!(_.length>1))i(!1);else u(Gj())}function w(){p=void 0,Y.requestRender()}function d(){return _[Q]}function e(){if(!v||!A)return;let j=W.getText().trim(),B=_.find((J)=>J.id===A);if(B?.type==="radio"&&j)K.set(B.id,{value:j,label:j,wasCustom:!0});else if(B?.type==="checkbox"&&j)c.set(B.id,j);v=!1,A=null,W.setText("")}function Hj(j){if(j.type==="text")return 0;return j.options.length+(j.allowOther?1:0)}function s(j){if(j.type==="radio")return K.has(j.id);if(j.type==="checkbox"){let B=l.get(j.id),J=c.get(j.id);return B!=null&&B.size>0||J!=null&&J.trim().length>0}if(j.type==="text")return(S.get(j.id)?.trim()??"").length>0;return!1}function a(){return _.every((j)=>!j.required||s(j))}function u(j){h(),Q=(j%q+q)%q,f=0,v=!1,A=null;let B=d();if(B?.type==="text")W.setText(S.get(B.id)??"");w()}function h(){let j=d();if(!j)return;if(j.type==="text"){let B=W.getText().trim();if(B)S.set(j.id,B);else S.delete(j.id)}}function i(j){h();let B=[];for(let J of _)if(J.type==="radio"){let F=K.get(J.id);B.push({id:J.id,type:"radio",value:F?.value??"",wasCustom:F?.wasCustom??!1})}else if(J.type==="checkbox"){let F=l.get(J.id)??new Set,V=c.get(J.id)?.trim(),H=[...F];if(V)H.push(V);B.push({id:J.id,type:"checkbox",value:H,wasCustom:!!V})}else{let F=S.get(J.id)??"";B.push({id:J.id,type:"text",value:F,wasCustom:!0})}T({title:U.title,questions:_,answers:B,cancelled:j})}W.onSubmit=(j)=>{let B=j.trim();if(v&&A){let F=_.find((V)=>V.id===A);if(F?.type==="radio"&&B)K.set(F.id,{value:B,label:B,wasCustom:!0});else if(F?.type==="checkbox"&&B)c.set(F.id,B);v=!1,A=null,W.setText(""),n();return}let J=d();if(J?.type==="text"){let F=j.trim();if(F)S.set(J.id,F);else S.delete(J.id);n()}};function Jj(j){if(v){if(P(j,N.escape)){v=!1,A=null,W.setText(""),w();return}if(P(j,N.enter)){e(),n();return}if($&&(P(j,N.tab)||P(j,N.shift("tab")))){e(),u(Q+(P(j,N.shift("tab"))?-1:1));return}W.handleInput(j),w();return}let B=d();if(B?.type==="text"){if(P(j,N.enter)){h(),n();return}if($&&(P(j,N.tab)||P(j,N.shift("tab")))){h(),u(Q+(P(j,N.shift("tab"))?-1:1));return}if(P(j,N.escape)){i(!0);return}W.handleInput(j),w();return}if($&&Q===_.length){if(P(j,N.enter)&&a()){i(!1);return}if(P(j,N.tab)||P(j,N.right)){u(0);return}if(P(j,N.shift("tab"))||P(j,N.left)){u(Q-1);return}if(P(j,N.escape)){i(!0);return}return}if(!B)return;if($){if(P(j,N.tab)||P(j,N.right)){u(Q+1);return}if(P(j,N.shift("tab"))||P(j,N.left)){u(Q-1);return}}let J=Hj(B);if(P(j,N.up)){f=Math.max(0,f-1),w();return}if(P(j,N.down)){f=Math.min(J-1,f+1),w();return}if(P(j,N.escape)){i(!0);return}if(B.type==="radio"&&P(j,N.enter)){if(B.allowOther&&f===B.options.length){v=!0,A=B.id;let H=K.get(B.id);W.setText(H?.wasCustom?H.label:""),w();return}let V=B.options[f];if(V)K.set(B.id,{value:V.value,label:V.label,wasCustom:!1}),n();return}if(B.type==="checkbox"&&P(j,N.space)){if(B.allowOther&&f===B.options.length){v=!0,A=B.id,W.setText(c.get(B.id)??""),w();return}let V=B.options[f];if(V){let H=l.get(B.id)??new Set;if(H.has(V.value))H.delete(V.value);else H.add(V.value);l.set(B.id,H),w()}return}if(B.type==="checkbox"&&P(j,N.enter)){n();return}}function Xj(j){if(p)return p;let B=[],J=Math.min(j,120),F=(G)=>B.push(Dj(G,J)),V=()=>F(D.fg("accent","─".repeat(J)));if(V(),U.title)F(` ${D.fg("accent",D.bold(U.title))}`);if(U.description)F(` ${D.fg("muted",U.description)}`);if(U.title||U.description)B.push("");if($){let G=[];for(let O=0;O<_.length;O++){let b=O===Q,M=s(_[O]),m=_[O].label,Bj=` ${M?D.fg("success",E.check):D.fg("dim",E.dot)} ${m} `;G.push(b?D.bg("selectedBg",D.fg("text",Bj)):D.fg(M?"success":"muted",Bj))}let X=Q===_.length,z=a(),g=` ${E.submit} Submit `;G.push(X?D.bg("selectedBg",D.fg("text",g)):D.fg(z?"success":"dim",g)),F(` ${G.join(D.fg("dim","│"))}`),B.push("")}let H=d();if($&&Q===_.length){F(` ${D.fg("accent",D.bold("Review & Submit"))}`),B.push("");for(let G of _){let X=D.fg("muted",`${G.label}:`);if(G.type==="radio"){let z=K.get(G.id);if(z){let g=z.wasCustom?D.fg("dim","(wrote) "):"";F(` ${X} ${g}${z.label}`)}else F(` ${X} ${D.fg("warning","(unanswered)")}`)}else if(G.type==="checkbox"){let z=l.get(G.id)??new Set,g=c.get(G.id)?.trim(),O=[...z];if(g)O.push(`${D.fg("dim","(wrote)")} ${g}`);if(O.length)F(` ${X} ${O.join(", ")}`);else F(` ${X} ${D.fg("warning","(unanswered)")}`)}else{let z=S.get(G.id)?.trim();if(z)F(` ${X} ${Dj(z,J-$j(G.label)-5)}`);else F(` ${X} ${D.fg("warning","(unanswered)")}`)}}if(B.push(""),a())F(` ${D.fg("success","Press Enter to submit")}`);else{let G=_.filter((X)=>X.required&&!s(X)).map((X)=>X.label).join(", ");F(` ${D.fg("warning",`Required: ${G}`)}`)}return B.push(""),F(D.fg("dim"," Tab/←→ navigate questions • Enter submit • Esc cancel")),V(),p=B,B}if(!H)return V(),p=B,B;let Zj=H.type==="radio"?D.fg("dim","[single-select]"):H.type==="checkbox"?D.fg("dim","[multi-select]"):D.fg("dim","[text]"),t=Vj(H.prompt,J-2);for(let G=0;G<t.length;G++){let X=G===t.length-1;F(` ${D.fg("text",D.bold(t[G]))}${X?` ${Zj}`:""}`)}if(H.required)F(` ${D.fg("warning","*required")}`);if(B.push(""),H.type==="radio"){let G=K.get(H.id);for(let X=0;X<H.options.length;X++){let z=H.options[X],g=X===f,O=G?.value===z.value&&!G.wasCustom,b=O?D.fg("accent",E.radioOn):D.fg("dim",E.radioOff),M=g?D.fg("accent",E.pointer):" ",m=g?"accent":O?"text":"muted";if(F(` ${M} ${b} ${D.fg(m,z.label)}`),z.description)F(` ${D.fg("dim",z.description)}`)}if(H.allowOther){let X=f===H.options.length,z=G?.wasCustom===!0,g=z?D.fg("accent",E.radioOn):D.fg("dim",E.radioOff),O=X?D.fg("accent",E.pointer):" ",b=z?`Other: ${G.label}`:"Other...";if(F(` ${O} ${g} ${D.fg(X?"accent":"muted",b)}`),v){B.push(""),F(` ${D.fg("muted"," Your answer:")}`);for(let M of W.render(J-6))F(` ${M}`)}}}if(H.type==="checkbox"){let G=l.get(H.id)??new Set;for(let X=0;X<H.options.length;X++){let z=H.options[X],g=X===f,O=G.has(z.value),b=O?D.fg("accent",E.checkOn):D.fg("dim",E.checkOff),M=g?D.fg("accent",E.pointer):" ",m=g?"accent":O?"text":"muted";if(F(` ${M} ${b} ${D.fg(m,z.label)}`),z.description)F(` ${D.fg("dim",z.description)}`)}if(H.allowOther){let X=f===H.options.length,z=c.get(H.id)?.trim(),g=z?D.fg("accent",E.checkOn):D.fg("dim",E.checkOff),O=X?D.fg("accent",E.pointer):" ",b=z?`Other: ${z}`:"Other...";if(F(` ${O} ${g} ${D.fg(X?"accent":"muted",b)}`),v){B.push(""),F(` ${D.fg("muted"," Your answer:")}`);for(let M of W.render(J-6))F(` ${M}`)}}}if(H.type==="text"){if(H.placeholder&&!W.getText())F(` ${D.fg("dim",H.placeholder)}`);for(let G of W.render(J-4))F(` ${G}`)}if(B.push(""),v)F(D.fg("dim"," Enter submit • Esc go back"));else if(H.type==="text"){let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ${G}Enter submit • Esc cancel`))}else if(H.type==="checkbox"){let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ↑↓ navigate • Space toggle • ${G}Enter ${$?"next":"submit"} • Esc cancel`))}else{let G=$?"Tab/←→ navigate • ":"";F(D.fg("dim",` ↑↓ navigate • ${G}Enter select • Esc cancel`))}return V(),p=B,B}let jj=_[0];if(jj?.type==="text")W.setText(S.get(jj.id)??"");return{render:Xj,invalidate:()=>{p=void 0},handleInput:Jj}});if(x.cancelled)return{content:[{type:"text",text:"User cancelled the form"}],details:x};let I=[];for(let Y of x.answers){let o=_.find((T)=>T.id===Y.id)?.label||Y.id;if(Y.type==="radio"){let T=Y.wasCustom?"(wrote) ":"";I.push(`${o}: ${T}${Y.value}`)}else if(Y.type==="checkbox"){let T=Array.isArray(Y.value)?Y.value:[Y.value];if(T.length===0)I.push(`${o}: (none selected)`);else I.push(`${o}: ${T.join(", ")}`)}else I.push(`${o}: ${Y.value||"(empty)"}`)}return{content:[{type:"text",text:I.join(`
|
|
9
|
-
`)}],details:x}},renderCall(L,U,R){let C=L.questions||[],k=L.title,_=U.fg("toolTitle",U.bold("ask_user_question "));if(k)_+=U.fg("accent",k)+" ";_+=U.fg("muted",`${C.length} question${C.length!==1?"s":""}`);let $=[...new Set(C.map((q)=>q.type))].join(", ");if($)_+=U.fg("dim",` (${$})`);return new r(_,0,0)},renderResult(L,U,R,C){let k=L.details;if(!k){let $=L.content[0];return new r($?.type==="text"?$.text:"",0,0)}if(k.cancelled)return new r(R.fg("warning","Cancelled"),0,0);let _=k.answers.map(($)=>{let x=k.questions.find((I)=>I.id===$.id)?.label||$.id;if($.type==="radio"){let I=$.wasCustom?R.fg("dim","(wrote) "):"";return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${I}${$.value}`}if($.type==="checkbox"){let I=Array.isArray($.value)?$.value:[$.value],Y=I.length?I.join(", "):R.fg("dim","(none)");return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${Y}`}return`${R.fg("success",E.check)} ${R.fg("accent",x)}: ${$.value||R.fg("dim","(empty)")}`});return new r(_.join(`
|
|
10
|
-
`),0,0)}})}export{Oj as default};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dm-ask-user",
|
|
3
|
-
"version": "1.7.2",
|
|
4
|
-
"description": "DM extension for asking users structured interactive questions",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"duckmind",
|
|
8
|
-
"dm",
|
|
9
|
-
"ask-user",
|
|
10
|
-
"interactive-form",
|
|
11
|
-
"questionnaire"
|
|
12
|
-
],
|
|
13
|
-
"dm": {
|
|
14
|
-
"extensions": [
|
|
15
|
-
"./index.js"
|
|
16
|
-
]
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import k from"node:fs";import g from"node:path";import{fileURLToPath as x}from"node:url";var L=g.dirname(x(import.meta.url)),w=g.join(L,"vendor"),S={type:"object",additionalProperties:!1,properties:{action:{type:"string",enum:["list","search","info","categories","install_command","launch_command"]},query:{type:"string",description:"Search query for CLI name, display name, description, or category."},name:{type:"string",description:"Exact CLI name or display name for info/install_command/launch_command."},category:{type:"string",description:"Optional category filter."},source:{type:"string",enum:["all","harness","public"],description:"Registry source filter. harness=CLI-Anything harnesses, public=public third-party CLIs."},limit:{type:"number",minimum:1,maximum:100,description:"Maximum items returned for list/search."}}};function q(e){return JSON.parse(k.readFileSync(e,"utf8"))}function A(e){return String(e??"").replace(/[\u0000-\u001f\u007f]/g," ").trim()}function a(e){return A(e).toLowerCase()}function f(e){return`'${String(e).replace(/'/g,"'\\''")}'`}function h(e,n){let o=q(g.join(w,n)),t=Array.isArray(o.clis)?o.clis:[];return{source:e,meta:o.meta||{},entries:t.map((s)=>({...s,_source:e}))}}function _(){let e=h("harness","registry.json"),n=h("public","public_registry.json"),o=[...e.entries,...n.entries].sort((t,s)=>a(t.name||t.display_name).localeCompare(a(s.name||s.display_name)));return{metas:{harness:e.meta,public:n.meta},counts:{harness:e.entries.length,public:n.entries.length,total:o.length},entries:o}}function E(e,n="all"){return!n||n==="all"||e._source===n}function N(e,n){return!n||a(e.category)===a(n)}function u(e,n={}){let o=n.source||"all";return e.filter((t)=>E(t,o)&&N(t,n.category))}function y(e,n,o={}){let t=a(n),s=u(e,o);if(!t)return s;return s.filter((i)=>{return[i.name,i.display_name,i.description,i.category,i.entry_point,i.homepage,i.source_url,i.package_manager,i.npm_package].map(a).join(" ").includes(t)})}function b(e,n,o={}){let t=a(n);if(!t)return null;let s=u(e,o);return s.find((i)=>a(i.name)===t)||s.find((i)=>a(i.display_name)===t)||s.find((i)=>a(i.entry_point)===t)||null}function d(e){let n=Number(e.limit??20);if(!Number.isFinite(n))return 20;return Math.max(1,Math.min(100,Math.trunc(n)))}function p(e){return{name:e.name,display_name:e.display_name,source:e._source,category:e.category,version:e.version,description:e.description,requires:e.requires,entry_point:e.entry_point,homepage:e.homepage,source_url:e.source_url,package_manager:e.package_manager,npm_package:e.npm_package,npx_cmd:e.npx_cmd,skill_md:e.skill_md}}function R(e){let n=[`${e.display_name||e.name} (${e.name}, ${e._source})`,`Category: ${e.category||"unknown"}; version: ${e.version||"unknown"}`,`Description: ${e.description||"n/a"}`];if(e.requires)n.push(`Requires: ${e.requires}`);if(e.entry_point)n.push(`Entry point: ${e.entry_point}`);if(e.homepage)n.push(`Homepage: ${e.homepage}`);if(e.source_url)n.push(`Source: ${e.source_url}`);if(e.skill_md)n.push(`Skill/guide: ${e.skill_md}`);if(e.npx_cmd)n.push(`npx: ${e.npx_cmd}`);return n.join(`
|
|
2
|
-
`)}function $(e,n,o){let t=e.length,s=e.slice(0,d(n)),i=[`source=${n.source||"all"}`];if(n.category)i.push(`category=${n.category}`);if(n.query)i.push(`query=${n.query}`);let r=[`Bundled DM CLI catalog: ${o.counts.total} CLIs (${o.counts.harness} harness, ${o.counts.public} public)`,`Matches: ${t}; showing ${s.length}; filters: ${i.join(", ")}`,"Note: install/launch actions return command suggestions only; they do not execute side effects.",""];for(let c of s)r.push(`- ${c.name} [${c._source}/${c.category||"unknown"}] — ${c.description||c.display_name||""}`);if(s.length<t)r.push(`... ${t-s.length} more; raise limit or narrow query/category.`);return r.join(`
|
|
3
|
-
`)}function v(e){let n=new Map;for(let t of e){let i=`${t.category||"unknown"} (${t._source})`;n.set(i,(n.get(i)||0)+1)}return["CLI-Anything categories:",...[...n.entries()].sort((t,s)=>t[0].localeCompare(s[0])).map(([t,s])=>`- ${t}: ${s}`)].join(`
|
|
4
|
-
`)}function C(e){let o=[{label:"cli-hub",command:`CLI_HUB_NO_ANALYTICS=1 cli-hub install ${f(e.name)}`,note:"Requires `pip install cli-anything-hub`; disables CLI-Hub analytics for the install command."}];if(e.install_cmd)o.push({label:"direct",command:e.install_cmd,note:"Direct upstream registry install command. Review before running because it can install global packages or execute shell commands."});if(e.npx_cmd)o.push({label:"npx",command:e.npx_cmd,note:"Runs through npx without preinstalling globally; still may download code."});return o}function I(e){let n=[];if(e.entry_point)n.push({label:"entry_point",command:e.entry_point});if(e.name)n.push({label:"cli-hub",command:`CLI_HUB_NO_ANALYTICS=1 cli-hub launch ${f(e.name)}`});return n}function M(e,n){let o=n==="install_command"?C(e):I(e);return{content:[{type:"text",text:[`${n==="install_command"?"Install":"Launch"} suggestions for ${e.name}:`,"These are suggestions only; dm-cli-anything does not execute install/update/uninstall/launch commands.","Ask the user before running commands with package installs, global writes, or shell side effects.","",...o.map((s)=>`- ${s.label}: ${s.command}${s.note?` (${s.note})`:""}`)].join(`
|
|
5
|
-
`)}],details:{status:"ok",action:n,entry:p(e),suggestions:o,side_effects_executed:!1},isError:!1}}function m(e,n){return{content:[{type:"text",text:e}],details:n,isError:!1}}function l(e,n={}){return{content:[{type:"text",text:`cli_anything_hub failed: ${e}`}],details:{status:"error",message:e,...n},isError:!0}}function j(e){e.registerTool({name:"cli_anything_hub",label:"CLI-Anything Hub",description:"Search and inspect the bundled DM CLI catalog. Install and launch actions return command suggestions only and never execute side effects.",promptSnippet:"Use cli_anything_hub to discover CLI-Anything harnesses and public CLIs by name, category, source, or query. Treat install_command and launch_command as suggestions only; ask before running global installs or shell commands.",promptGuidelines:["Use action=search for broad discovery, action=list with category/source filters for inventory, and action=info for a known CLI.","Do not execute install, update, uninstall, or launch commands from this tool without explicit user approval.","When suggesting CLI-Hub commands, prefer `CLI_HUB_NO_ANALYTICS=1` to avoid opt-out analytics side effects.","Mention that the catalog is a bundled snapshot and may need a DM update for newer entries."],parameters:S,async execute(n,o={}){let t=o.action||(o.query?"search":"list");try{let s=_();if(t==="categories"){let r=u(s.entries,o);return m(v(r),{status:"ok",action:t,categories_counted:r.length})}if(t==="list"||t==="search"){let r=t==="search"?y(s.entries,o.query||"",o):u(s.entries,o);return m($(r,o,s),{status:"ok",action:t,total_matches:r.length,shown:Math.min(r.length,d(o)),entries:r.slice(0,d(o)).map(p),counts:s.counts})}if(!o.name)return l(`${t} requires a name`,{action:t});let i=b(s.entries,o.name,o);if(!i)return l(`no CLI-Anything entry matched name=${o.name}`,{action:t,name:o.name,source:o.source||"all"});if(t==="info")return m(R(i),{status:"ok",action:t,entry:p(i)});if(t==="install_command"||t==="launch_command")return M(i,t);return l(`unsupported action=${t}`,{action:t})}catch(s){return l(s instanceof Error?s.message:String(s),{action:t})}}})}var O={loadRegistries:_,searchEntries:y,findEntry:b,installSuggestions:C,launchSuggestions:I,renderList:$};export{j as default,O as __test};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dm-cli-anything",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "DuckMind extension for safe discovery of HKUDS CLI-Anything/CLI-Hub harnesses.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "index.js",
|
|
7
|
-
"keywords": [
|
|
8
|
-
"duckmind",
|
|
9
|
-
"dm",
|
|
10
|
-
"cli-anything",
|
|
11
|
-
"cli-hub",
|
|
12
|
-
"registry"
|
|
13
|
-
],
|
|
14
|
-
"dm": {
|
|
15
|
-
"extensions": [
|
|
16
|
-
"./index.js"
|
|
17
|
-
],
|
|
18
|
-
"skills": [
|
|
19
|
-
"./skills"
|
|
20
|
-
]
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# CLI-Anything Hub
|
|
2
|
-
|
|
3
|
-
Use the `cli_anything_hub` tool when a user asks to discover or install
|
|
4
|
-
agent-native CLI interfaces from HKUDS CLI-Anything.
|
|
5
|
-
|
|
6
|
-
Core workflow:
|
|
7
|
-
|
|
8
|
-
1. Search first: `action=search`, with `query`, `category`, or `source`.
|
|
9
|
-
2. Inspect the chosen entry: `action=info`, `name=<entry>`.
|
|
10
|
-
3. If the user wants installation or launch help, call `install_command` or
|
|
11
|
-
`launch_command` and show the suggested command.
|
|
12
|
-
4. Do not run install/update/uninstall/launch commands unless the user clearly
|
|
13
|
-
approves the side effects.
|
|
14
|
-
|
|
15
|
-
Safety notes:
|
|
16
|
-
|
|
17
|
-
- The catalog is a bundled DM snapshot. Update DM to receive newer entries.
|
|
18
|
-
- CLI-Hub has optional analytics; prefer commands with
|
|
19
|
-
`CLI_HUB_NO_ANALYTICS=1`.
|
|
20
|
-
- Registry `install_cmd` values can install global packages or run shell
|
|
21
|
-
commands. Treat them as untrusted until reviewed.
|
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"meta": {
|
|
3
|
-
"repo": "https://github.com/HKUDS/CLI-Anything",
|
|
4
|
-
"description": "Public CLI Registry — Third-party and official CLIs managed by CLI-Hub across npm, bundled, brew, and other install methods",
|
|
5
|
-
"updated": "2026-04-18"
|
|
6
|
-
},
|
|
7
|
-
"clis": [
|
|
8
|
-
{
|
|
9
|
-
"name": "feishu",
|
|
10
|
-
"display_name": "Feishu/Lark CLI",
|
|
11
|
-
"version": "latest",
|
|
12
|
-
"description": "Official Lark (Feishu) CLI for managing Lark apps, bots, and cloud resources from the terminal",
|
|
13
|
-
"category": "communication",
|
|
14
|
-
"requires": "Node.js >= 16",
|
|
15
|
-
"homepage": "https://github.com/larksuite/cli",
|
|
16
|
-
"source_url": "https://github.com/larksuite/cli",
|
|
17
|
-
"package_manager": "npm",
|
|
18
|
-
"npm_package": "@larksuite/cli",
|
|
19
|
-
"install_cmd": "npm install -g @larksuite/cli",
|
|
20
|
-
"npx_cmd": "npx @larksuite/cli",
|
|
21
|
-
"skill_md": "npx skills add larksuite/cli -y -g",
|
|
22
|
-
"entry_point": "lark-cli",
|
|
23
|
-
"contributors": [
|
|
24
|
-
{
|
|
25
|
-
"name": "larksuite",
|
|
26
|
-
"url": "https://github.com/larksuite"
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"name": "minimax-cli",
|
|
32
|
-
"display_name": "MiniMax CLI",
|
|
33
|
-
"version": "latest",
|
|
34
|
-
"description": "MiniMax AI platform CLI for managing tokens, models, and API interactions from the command line",
|
|
35
|
-
"category": "ai",
|
|
36
|
-
"requires": "Node.js >= 16, MINIMAX_API_KEY",
|
|
37
|
-
"homepage": "https://platform.minimax.io",
|
|
38
|
-
"source_url": null,
|
|
39
|
-
"package_manager": "npm",
|
|
40
|
-
"npm_package": "minimax-cli",
|
|
41
|
-
"install_cmd": "npm install -g minimax-cli",
|
|
42
|
-
"npx_cmd": "npx minimax-cli",
|
|
43
|
-
"skill_md": "https://platform.minimax.io/docs/token-plan/minimax-cli",
|
|
44
|
-
"entry_point": "minimax-cli",
|
|
45
|
-
"contributors": [
|
|
46
|
-
{
|
|
47
|
-
"name": "MiniMax",
|
|
48
|
-
"url": "https://platform.minimax.io"
|
|
49
|
-
}
|
|
50
|
-
]
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"name": "wecom",
|
|
54
|
-
"display_name": "WeCom CLI",
|
|
55
|
-
"version": "latest",
|
|
56
|
-
"description": "Official WeCom open-platform CLI for contacts, todos, meetings, messages, calendars, docs, and smart sheets",
|
|
57
|
-
"category": "communication",
|
|
58
|
-
"requires": "Node.js >= 18, WeCom account (currently limited rollout), optional Bot ID + Secret for bot flows",
|
|
59
|
-
"homepage": "https://open.work.weixin.qq.com/",
|
|
60
|
-
"source_url": "https://github.com/WecomTeam/wecom-cli",
|
|
61
|
-
"package_manager": "npm",
|
|
62
|
-
"npm_package": "@wecom/cli",
|
|
63
|
-
"install_cmd": "npm install -g @wecom/cli",
|
|
64
|
-
"npx_cmd": "npx @wecom/cli",
|
|
65
|
-
"skill_md": "npx skills add WeComTeam/wecom-cli -y -g",
|
|
66
|
-
"entry_point": "wecom-cli",
|
|
67
|
-
"contributors": [
|
|
68
|
-
{
|
|
69
|
-
"name": "WecomTeam",
|
|
70
|
-
"url": "https://github.com/WecomTeam"
|
|
71
|
-
}
|
|
72
|
-
]
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"name": "contentful",
|
|
76
|
-
"display_name": "Contentful CLI",
|
|
77
|
-
"version": "latest",
|
|
78
|
-
"description": "Official Contentful CLI for spaces, migrations, imports, exports, seeding, and environment management",
|
|
79
|
-
"category": "web",
|
|
80
|
-
"requires": "Node.js LTS, Contentful account and space access",
|
|
81
|
-
"homepage": "https://www.contentful.com/",
|
|
82
|
-
"source_url": "https://github.com/contentful/contentful-cli",
|
|
83
|
-
"package_manager": "npm",
|
|
84
|
-
"npm_package": "contentful-cli",
|
|
85
|
-
"install_cmd": "npm install -g contentful-cli",
|
|
86
|
-
"npx_cmd": "npx contentful-cli",
|
|
87
|
-
"skill_md": "https://github.com/contentful/contentful-cli/tree/main/docs",
|
|
88
|
-
"entry_point": "contentful",
|
|
89
|
-
"contributors": [
|
|
90
|
-
{
|
|
91
|
-
"name": "Contentful",
|
|
92
|
-
"url": "https://github.com/contentful"
|
|
93
|
-
}
|
|
94
|
-
]
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"name": "sanity",
|
|
98
|
-
"display_name": "Sanity CLI",
|
|
99
|
-
"version": "latest",
|
|
100
|
-
"description": "Official Sanity CLI for studios, datasets, schemas, imports, exports, and structured content workflows",
|
|
101
|
-
"category": "web",
|
|
102
|
-
"requires": "Node.js and npm, Sanity account/project access",
|
|
103
|
-
"homepage": "https://www.sanity.io/",
|
|
104
|
-
"source_url": "https://github.com/sanity-io/sanity",
|
|
105
|
-
"package_manager": "npm",
|
|
106
|
-
"npm_package": "sanity",
|
|
107
|
-
"install_cmd": "npm install -g sanity",
|
|
108
|
-
"npx_cmd": "npx sanity@latest",
|
|
109
|
-
"skill_md": "https://www.sanity.io/docs/apis-and-sdks/cli",
|
|
110
|
-
"entry_point": "sanity",
|
|
111
|
-
"contributors": [
|
|
112
|
-
{
|
|
113
|
-
"name": "Sanity",
|
|
114
|
-
"url": "https://github.com/sanity-io"
|
|
115
|
-
}
|
|
116
|
-
]
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
"name": "shopify",
|
|
120
|
-
"display_name": "Shopify CLI",
|
|
121
|
-
"version": "latest",
|
|
122
|
-
"description": "Official Shopify CLI for apps, themes, functions, extensions, and Hydrogen storefront workflows",
|
|
123
|
-
"category": "web",
|
|
124
|
-
"requires": "Node.js and npm, Shopify Partner/store access",
|
|
125
|
-
"homepage": "https://shopify.dev/docs/api/shopify-cli",
|
|
126
|
-
"source_url": "https://github.com/Shopify/cli",
|
|
127
|
-
"package_manager": "npm",
|
|
128
|
-
"npm_package": "@shopify/cli",
|
|
129
|
-
"install_cmd": "npm install -g @shopify/cli",
|
|
130
|
-
"npx_cmd": "npx @shopify/cli@latest",
|
|
131
|
-
"skill_md": "https://github.com/Shopify/cli/blob/main/packages/cli/README.md#commands",
|
|
132
|
-
"entry_point": "shopify",
|
|
133
|
-
"contributors": [
|
|
134
|
-
{
|
|
135
|
-
"name": "Shopify",
|
|
136
|
-
"url": "https://github.com/Shopify"
|
|
137
|
-
}
|
|
138
|
-
]
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
"name": "sentry",
|
|
142
|
-
"display_name": "Sentry CLI",
|
|
143
|
-
"version": "latest",
|
|
144
|
-
"description": "Official Sentry CLI for releases, sourcemaps, debug files, monitors, and org/project automation",
|
|
145
|
-
"category": "devops",
|
|
146
|
-
"requires": "Sentry account plus auth token/org/project access for most operations",
|
|
147
|
-
"homepage": "https://docs.sentry.io/cli/",
|
|
148
|
-
"source_url": "https://github.com/getsentry/sentry-cli",
|
|
149
|
-
"package_manager": "npm",
|
|
150
|
-
"npm_package": "@sentry/cli",
|
|
151
|
-
"install_cmd": "npm install -g @sentry/cli",
|
|
152
|
-
"npx_cmd": "npx @sentry/cli",
|
|
153
|
-
"skill_md": "https://docs.sentry.io/cli/",
|
|
154
|
-
"entry_point": "sentry-cli",
|
|
155
|
-
"contributors": [
|
|
156
|
-
{
|
|
157
|
-
"name": "Sentry",
|
|
158
|
-
"url": "https://github.com/getsentry"
|
|
159
|
-
}
|
|
160
|
-
]
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"name": "1password-cli",
|
|
164
|
-
"display_name": "1Password CLI",
|
|
165
|
-
"version": "latest",
|
|
166
|
-
"description": "Official 1Password CLI for vault access, secrets retrieval, item automation, and desktop-app-backed authentication",
|
|
167
|
-
"category": "devops",
|
|
168
|
-
"requires": "1Password account; desktop app integration recommended for biometric/system-auth sign-in",
|
|
169
|
-
"homepage": "https://developer.1password.com/docs/cli/get-started/",
|
|
170
|
-
"source_url": null,
|
|
171
|
-
"package_manager": "brew",
|
|
172
|
-
"install_strategy": "command",
|
|
173
|
-
"install_cmd": "brew install --cask 1password-cli",
|
|
174
|
-
"uninstall_cmd": "brew uninstall --cask 1password-cli",
|
|
175
|
-
"update_cmd": "brew upgrade --cask 1password-cli",
|
|
176
|
-
"skill_md": "https://developer.1password.com/docs/cli/get-started/",
|
|
177
|
-
"entry_point": "op",
|
|
178
|
-
"contributors": [
|
|
179
|
-
{
|
|
180
|
-
"name": "1Password",
|
|
181
|
-
"url": "https://1password.com"
|
|
182
|
-
}
|
|
183
|
-
]
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"name": "android-cli",
|
|
187
|
-
"display_name": "Android CLI",
|
|
188
|
-
"version": "0.7",
|
|
189
|
-
"description": "Official Android terminal interface for SDK setup, project creation, emulator/device management, app run/deploy workflows, docs access, and skill management for any agent",
|
|
190
|
-
"category": "mobile",
|
|
191
|
-
"requires": "Preview release; Linux x86_64, macOS arm64, or Windows x86_64. Android SDK / JDK requirements depend on the workflow you run.",
|
|
192
|
-
"homepage": "https://developer.android.com/tools/agents/android-cli",
|
|
193
|
-
"docs_url": "https://android-developers.googleblog.com/2026/04/build-android-apps-3x-faster-using-any-agent.html",
|
|
194
|
-
"source_url": null,
|
|
195
|
-
"package_manager": "bundled",
|
|
196
|
-
"install_strategy": "bundled",
|
|
197
|
-
"install_notes": "Install Android CLI from the official archive page: Linux `curl -fsSL https://dl.google.com/android/cli/latest/linux_x86_64/install.sh | bash`; macOS `curl -fsSL https://dl.google.com/android/cli/latest/darwin_arm64/install.sh | bash`; Windows `curl.exe -fsSL https://dl.google.com/android/cli/latest/windows_x86_64/install.cmd -o \"%TEMP%\\i.cmd\" && \"%TEMP%\\i.cmd\"`.",
|
|
198
|
-
"uninstall_notes": "Remove the Android CLI binary from your PATH or rerun the official installer cleanup flow for your platform.",
|
|
199
|
-
"update_notes": "Run `android update` to fetch the latest Android CLI capabilities, or reinstall from the official archive page if needed.",
|
|
200
|
-
"skill_md": "https://developer.android.com/tools/agents/android-skills",
|
|
201
|
-
"entry_point": "android",
|
|
202
|
-
"detect_cmd": "android",
|
|
203
|
-
"contributors": [
|
|
204
|
-
{
|
|
205
|
-
"name": "Android Developers",
|
|
206
|
-
"url": "https://developer.android.com"
|
|
207
|
-
}
|
|
208
|
-
]
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
"name": "generate-veo-video",
|
|
212
|
-
"display_name": "Generate Veo Video",
|
|
213
|
-
"version": "0.2.5",
|
|
214
|
-
"description": "CLI for generating videos with Google Veo 3.1 via Vertex AI/Gemini — text-to-video, image-to-video, reference images, frame morphing, and video extension",
|
|
215
|
-
"category": "ai",
|
|
216
|
-
"requires": "Python >= 3.10, uv, GOOGLE_CLOUD_PROJECT env var (GEMINI_API_KEY optional)",
|
|
217
|
-
"homepage": "https://github.com/charles-forsyth/generate-veo-video",
|
|
218
|
-
"source_url": "https://github.com/charles-forsyth/generate-veo-video",
|
|
219
|
-
"package_manager": "uv",
|
|
220
|
-
"install_cmd": "uv tool install git+https://github.com/charles-forsyth/generate-veo-video.git",
|
|
221
|
-
"uninstall_cmd": "uv tool uninstall generate-veo-video",
|
|
222
|
-
"update_cmd": "uv tool upgrade generate-veo-video",
|
|
223
|
-
"skill_md": "https://github.com/charles-forsyth/generate-veo-video",
|
|
224
|
-
"entry_point": "generate-veo",
|
|
225
|
-
"contributors": [
|
|
226
|
-
{
|
|
227
|
-
"name": "charles-forsyth",
|
|
228
|
-
"url": "https://github.com/charles-forsyth"
|
|
229
|
-
}
|
|
230
|
-
]
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
"name": "suno",
|
|
234
|
-
"display_name": "Suno CLI",
|
|
235
|
-
"version": "latest",
|
|
236
|
-
"description": "CLI for generating music with Suno AI from lyrics and style prompts, with batch generation, status polling, downloads, and automatic MP3 tagging",
|
|
237
|
-
"category": "music",
|
|
238
|
-
"requires": "Python 3 and a Suno API key from sunoapi.org",
|
|
239
|
-
"homepage": "https://github.com/slauger/suno-cli",
|
|
240
|
-
"source_url": "https://github.com/slauger/suno-cli",
|
|
241
|
-
"package_manager": "pip",
|
|
242
|
-
"install_strategy": "command",
|
|
243
|
-
"install_cmd": "python3 -m pip install git+https://github.com/slauger/suno-cli.git",
|
|
244
|
-
"uninstall_cmd": "python3 -m pip uninstall -y suno-cli",
|
|
245
|
-
"update_cmd": "python3 -m pip install --upgrade --force-reinstall git+https://github.com/slauger/suno-cli.git",
|
|
246
|
-
"skill_md": "https://github.com/slauger/suno-cli/blob/main/docs/USAGE.md",
|
|
247
|
-
"entry_point": "suno",
|
|
248
|
-
"contributors": [
|
|
249
|
-
{
|
|
250
|
-
"name": "slauger",
|
|
251
|
-
"url": "https://github.com/slauger"
|
|
252
|
-
}
|
|
253
|
-
]
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
"name": "elevenlabs",
|
|
257
|
-
"display_name": "ElevenLabs CLI",
|
|
258
|
-
"version": "latest",
|
|
259
|
-
"description": "Official ElevenLabs CLI for managing voice agents as code with local configs, templates, auth, push/pull sync, tests, widgets, and branch-aware workflows",
|
|
260
|
-
"category": "audio",
|
|
261
|
-
"requires": "Node.js and npm, ELEVENLABS_API_KEY or interactive login",
|
|
262
|
-
"homepage": "https://github.com/elevenlabs/cli",
|
|
263
|
-
"source_url": "https://github.com/elevenlabs/cli",
|
|
264
|
-
"package_manager": "npm",
|
|
265
|
-
"npm_package": "@elevenlabs/cli",
|
|
266
|
-
"install_cmd": "npm install -g @elevenlabs/cli",
|
|
267
|
-
"npx_cmd": "npx @elevenlabs/cli@latest",
|
|
268
|
-
"skill_md": "https://github.com/elevenlabs/cli",
|
|
269
|
-
"entry_point": "elevenlabs",
|
|
270
|
-
"contributors": [
|
|
271
|
-
{
|
|
272
|
-
"name": "ElevenLabs",
|
|
273
|
-
"url": "https://github.com/elevenlabs"
|
|
274
|
-
}
|
|
275
|
-
]
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"name": "jimeng",
|
|
279
|
-
"display_name": "Jimeng / Dreamina CLI",
|
|
280
|
-
"version": "latest",
|
|
281
|
-
"description": "Official ByteDance AI image and video generation CLI — text-to-image, text-to-video, image-to-video, digital human, and intelligent canvas; domestic brand is Jimeng (即梦), international brand is Dreamina",
|
|
282
|
-
"category": "ai",
|
|
283
|
-
"requires": "Jimeng / Dreamina account and API key",
|
|
284
|
-
"homepage": "https://jimeng.jianying.com/",
|
|
285
|
-
"docs_url": "https://bytedance.larkoffice.com/wiki/FVTwwm0bGiishxkKOoScdHR2nsg",
|
|
286
|
-
"source_url": null,
|
|
287
|
-
"package_manager": "script",
|
|
288
|
-
"install_strategy": "command",
|
|
289
|
-
"install_cmd": "curl -s https://jimeng.jianying.com/cli | bash",
|
|
290
|
-
"skill_md": "https://bytedance.larkoffice.com/wiki/FVTwwm0bGiishxkKOoScdHR2nsg",
|
|
291
|
-
"entry_point": "dreamina",
|
|
292
|
-
"contributors": [
|
|
293
|
-
{
|
|
294
|
-
"name": "ByteDance",
|
|
295
|
-
"url": "https://www.bytedance.com"
|
|
296
|
-
}
|
|
297
|
-
]
|
|
298
|
-
},
|
|
299
|
-
{
|
|
300
|
-
"name": "obsidian-cli",
|
|
301
|
-
"display_name": "Obsidian CLI",
|
|
302
|
-
"version": "bundled",
|
|
303
|
-
"description": "Official Obsidian command line interface for vault automation, developer tools, screenshots, search, history, and plugin workflows",
|
|
304
|
-
"category": "knowledge",
|
|
305
|
-
"requires": "Obsidian 1.12.7+ installer, Obsidian desktop app running, and Command line interface enabled in Settings → General",
|
|
306
|
-
"homepage": "https://obsidian.md/help/cli",
|
|
307
|
-
"source_url": null,
|
|
308
|
-
"package_manager": "bundled",
|
|
309
|
-
"install_strategy": "bundled",
|
|
310
|
-
"install_notes": "Bundled within the Obsidian 1.12+ installer. Enable Command line interface in Obsidian settings and follow the registration prompt so `obsidian` is added to PATH.",
|
|
311
|
-
"uninstall_notes": "Disable Command line interface from Obsidian settings or remove/update the Obsidian installer to stop using the bundled CLI.",
|
|
312
|
-
"update_notes": "Update the Obsidian installer to a newer 1.12+ release to update the bundled CLI.",
|
|
313
|
-
"skill_md": "https://obsidian.md/help/cli",
|
|
314
|
-
"entry_point": "obsidian",
|
|
315
|
-
"detect_cmd": "obsidian",
|
|
316
|
-
"contributors": [
|
|
317
|
-
{
|
|
318
|
-
"name": "Obsidian",
|
|
319
|
-
"url": "https://obsidian.md"
|
|
320
|
-
}
|
|
321
|
-
]
|
|
322
|
-
},
|
|
323
|
-
{
|
|
324
|
-
"name": "py4csr",
|
|
325
|
-
"display_name": "TraceCSR / Py4CSR CLI",
|
|
326
|
-
"version": "latest",
|
|
327
|
-
"description": "GxP-compliant agent harness for CDISC Clinical Study Report (CSR) and Tables/Figures/Listings (TFL) generation",
|
|
328
|
-
"category": "data-science",
|
|
329
|
-
"requires": "Python >= 3.10",
|
|
330
|
-
"homepage": "https://github.com/yanmingyu92/py4csr",
|
|
331
|
-
"source_url": "https://github.com/yanmingyu92/py4csr",
|
|
332
|
-
"skill_md": "https://github.com/yanmingyu92/py4csr",
|
|
333
|
-
"package_manager": "pip",
|
|
334
|
-
"install_cmd": "pip install py4csr",
|
|
335
|
-
"entry_point": "tracecsr",
|
|
336
|
-
"contributors": [
|
|
337
|
-
{
|
|
338
|
-
"name": "yanmingyu92",
|
|
339
|
-
"url": "https://github.com/yanmingyu92"
|
|
340
|
-
}
|
|
341
|
-
]
|
|
342
|
-
},
|
|
343
|
-
{
|
|
344
|
-
"name": "deployhq",
|
|
345
|
-
"display_name": "DeployHQ CLI",
|
|
346
|
-
"version": "0.16.3",
|
|
347
|
-
"description": "Deploy code, manage projects/servers, run and monitor deployments via the DeployHQ platform — for humans and AI agents",
|
|
348
|
-
"category": "devops",
|
|
349
|
-
"requires": "DeployHQ account (free tier available); Homebrew for the default install path",
|
|
350
|
-
"homepage": "https://www.deployhq.com",
|
|
351
|
-
"source_url": "https://github.com/deployhq/deployhq-cli",
|
|
352
|
-
"package_manager": "brew",
|
|
353
|
-
"install_strategy": "command",
|
|
354
|
-
"install_cmd": "brew install deployhq/tap/dhq",
|
|
355
|
-
"uninstall_cmd": "brew uninstall dhq",
|
|
356
|
-
"update_cmd": "brew upgrade dhq",
|
|
357
|
-
"skill_md": "https://github.com/deployhq/deployhq-cli/blob/main/skills/deployhq/SKILL.md",
|
|
358
|
-
"entry_point": "dhq",
|
|
359
|
-
"contributors": [
|
|
360
|
-
{
|
|
361
|
-
"name": "MartaKar",
|
|
362
|
-
"url": "https://github.com/MartaKar"
|
|
363
|
-
}
|
|
364
|
-
]
|
|
365
|
-
}
|
|
366
|
-
]
|
|
367
|
-
}
|