dunsocial 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +42 -38
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{mkdir as rn,readFile as Ie,writeFile as tn,chmod as mn,unlink as on}from"node:fs/promises";import{dirname as wn,join as ue}from"node:path";import{homedir as pe}from"node:os";var o={OK:0,USAGE:1,AUTH:2,FORBIDDEN:3,VALIDATION:4,NOT_FOUND:5,RATE_LIMITED:6,NETWORK:7};class w extends Error{code;details;constructor(e,n=o.USAGE,u){super(e);this.name="CliError",this.code=n,this.details=u}}function ne(e){if(e===401)return o.AUTH;if(e===403)return o.FORBIDDEN;if(e===404)return o.NOT_FOUND;if(e===429)return o.RATE_LIMITED;if(e>=400&&e<500)return o.VALIDATION;return o.NETWORK}var Ge="https://api.dunsocial.com",M="0.3.1";function Ve(){if(process.env.DUN_CONFIG)return process.env.DUN_CONFIG;let e=process.env.XDG_CONFIG_HOME,n=e?e:ue(pe(),".config");return ue(n,"dunsocial","config.json")}async function _e(){let e=Ve();try{let n=await Ie(e,"utf8");return JSON.parse(n)}catch(n){if(n.code==="ENOENT")return{};throw new w(`Failed to read config at ${e}: ${n.message}`,o.USAGE)}}async function de(e){let n=await _e(),u=(e.apiUrl||process.env.DUN_API_URL||n.apiUrl||Ge).replace(/\/$/,""),t=e.token||process.env.DUN_TOKEN||n.token,y=e.workspace||process.env.DUN_WORKSPACE_ID||n.defaultWorkspaceId||void 0,d=process.env.DUN_JSON==="0",i=!process.stdout.isTTY,r=d?!1:e.json===!0||process.env.DUN_JSON==="1"||process.env.CI==="true"||process.env.CI==="1"||i;return{apiUrl:u,token:t,workspaceId:y,json:r,debug:e.debug===!0||process.env.DUN_DEBUG==="1",quiet:e.quiet===!0,yes:e.yes===!0||process.env.CI==="true"||process.env.CI==="1",config:n}}function re(e){let n={},u=[],t=0,y=!0;while(t<e.length){let O=e[t];if(y&&O==="--"){y=!1,t+=1;continue}if(y&&O.startsWith("--")){let A=O.indexOf("=");if(A!==-1){n[O.slice(2,A)]=O.slice(A+1),t+=1;continue}let T=O.slice(2),U=e[t+1];if(U!==void 0&&!U.startsWith("-"))n[T]=U,t+=2;else n[T]=!0,t+=1;continue}if(y&&O.startsWith("-")&&O.length>1&&O!=="-"){let A=O.slice(1);if(A.length>1&&!A.includes("=")){for(let V of A)n[V]=!0;t+=1;continue}let T=A,U=e[t+1];if(U!==void 0&&!U.startsWith("-"))n[T]=U,t+=2;else n[T]=!0,t+=1;continue}u.push(O),t+=1}let d=u[0],i,r,m=1;if(d==="memory"&&(u[1]==="collections"||u[1]==="collection"))r="collections",i=u[2],m=i?3:2;else i=u[1],m=i?2:1;return{group:d,action:i,nest:r,flags:n,positionals:u.slice(m)}}function Q(e,...n){for(let u of n){let t=e[u];if(typeof t==="string"&&t.length>0)return t}return}function K(e,...n){for(let u of n){let t=e[u];if(t===!0)return!0;if(typeof t==="string"){let y=t.toLowerCase();if(y==="1"||y==="true"||y==="yes")return!0}}return!1}function q(e){return K(e,"help","h")}function h(e){return K(e,"version","v","V")}function s(e,n){if(n.quiet&&!n.json)return;if(n.json||!process.stdout.isTTY){process.stdout.write(`${JSON.stringify({ok:!0,data:e},null,2)}
3
+ import{mkdir as $n,readFile as Ge,writeFile as Nn,chmod as Un,unlink as Dn}from"node:fs/promises";import{dirname as bn,join as ue}from"node:path";import{homedir as Je}from"node:os";var y={OK:0,USAGE:1,AUTH:2,FORBIDDEN:3,VALIDATION:4,NOT_FOUND:5,RATE_LIMITED:6,NETWORK:7};class t extends Error{code;details;constructor(e,n=y.USAGE,u){super(e);this.name="CliError",this.code=n,this.details=u}}function ne(e){if(e===401)return y.AUTH;if(e===403)return y.FORBIDDEN;if(e===404)return y.NOT_FOUND;if(e===429)return y.RATE_LIMITED;if(e>=400&&e<500)return y.VALIDATION;return y.NETWORK}var _e="https://api.dunsocial.com",M="0.3.1";function He(){if(process.env.DUN_CONFIG)return process.env.DUN_CONFIG;let e=process.env.XDG_CONFIG_HOME,n=e?e:ue(Je(),".config");return ue(n,"dunsocial","config.json")}async function ze(){let e=He();try{let n=await Ge(e,"utf8");return JSON.parse(n)}catch(n){if(n.code==="ENOENT")return{};throw new t(`Failed to read config at ${e}: ${n.message}`,y.USAGE)}}async function de(e){let n=await ze(),u=(e.apiUrl||process.env.DUN_API_URL||n.apiUrl||_e).replace(/\/$/,""),r=e.token||process.env.DUN_TOKEN||n.token,w=e.workspace||process.env.DUN_WORKSPACE_ID||n.defaultWorkspaceId||void 0,d=process.env.DUN_JSON==="0",m=!process.stdout.isTTY,i=d?!1:e.json===!0||process.env.DUN_JSON==="1"||process.env.CI==="true"||process.env.CI==="1"||m;return{apiUrl:u,token:r,workspaceId:w,json:i,debug:e.debug===!0||process.env.DUN_DEBUG==="1",quiet:e.quiet===!0,yes:e.yes===!0||process.env.CI==="true"||process.env.CI==="1",config:n}}function re(e){let n={},u=[],r=0,w=!0;while(r<e.length){let O=e[r];if(w&&O==="--"){w=!1,r+=1;continue}if(w&&O.startsWith("--")){let N=O.indexOf("=");if(N!==-1){n[O.slice(2,N)]=O.slice(N+1),r+=1;continue}let T=O.slice(2),D=e[r+1];if(D!==void 0&&!D.startsWith("-"))n[T]=D,r+=2;else n[T]=!0,r+=1;continue}if(w&&O.startsWith("-")&&O.length>1&&O!=="-"){let N=O.slice(1);if(N.length>1&&!N.includes("=")){for(let W of N)n[W]=!0;r+=1;continue}let T=N,D=e[r+1];if(D!==void 0&&!D.startsWith("-"))n[T]=D,r+=2;else n[T]=!0,r+=1;continue}u.push(O),r+=1}let d=u[0],m,i,o=1;if(d==="memory"&&(u[1]==="collections"||u[1]==="collection"))i="collections",m=u[2],o=m?3:2;else m=u[1],o=m?2:1;return{group:d,action:m,nest:i,flags:n,positionals:u.slice(o)}}function Q(e,...n){for(let u of n){let r=e[u];if(typeof r==="string"&&r.length>0)return r}return}function G(e,...n){for(let u of n){let r=e[u];if(r===!0)return!0;if(typeof r==="string"){let w=r.toLowerCase();if(w==="1"||w==="true"||w==="yes")return!0}}return!1}function B(e){return G(e,"help","h")}function P(e){return G(e,"version","v","V")}function f(e,n){if(n.quiet&&!n.json)return;if(n.json||!process.stdout.isTTY){process.stdout.write(`${JSON.stringify({ok:!0,data:e},null,2)}
4
4
  `);return}if(e===void 0||e===null){process.stdout.write(`ok
5
5
  `);return}if(typeof e==="string"){process.stdout.write(`${e}
6
- `);return}process.stdout.write(`${Je(e)}
7
- `)}function ie(e,n){let{message:u,code:t,details:y}=Le(e);if(n.json||!process.stdout.isTTY)process.stdout.write(`${JSON.stringify({ok:!1,error:{code:Ke(t),message:u,details:y??null}},null,2)}
6
+ `);return}process.stdout.write(`${Me(e)}
7
+ `)}function me(e,n){let{message:u,code:r,details:w}=Ye(e);if(n.json||!process.stdout.isTTY)process.stdout.write(`${JSON.stringify({ok:!1,error:{code:We(r),message:u,details:w??null}},null,2)}
8
8
  `);else if(process.stderr.write(`error: ${u}
9
- `),y!==void 0&&process.env.DUN_DEBUG==="1")process.stderr.write(`${JSON.stringify(y,null,2)}
10
- `);return t}function Ke(e){switch(e){case o.AUTH:return"auth";case o.FORBIDDEN:return"forbidden";case o.VALIDATION:return"validation";case o.NOT_FOUND:return"not_found";case o.RATE_LIMITED:return"rate_limited";case o.NETWORK:return"network";default:return"usage"}}function Le(e){if(e instanceof w)return{message:e.message,code:e.code,details:e.details};if(e instanceof Error)return{message:e.message,code:o.USAGE};return{message:String(e),code:o.USAGE}}function Je(e){if(Array.isArray(e)){if(e.length===0)return"(empty)";if(e.every((n)=>n&&typeof n==="object"))return te(e);return e.map((n)=>`- ${P(n)}`).join(`
11
- `)}if(e&&typeof e==="object"){let n=e;if(Array.isArray(n.items)){let u=typeof n.total==="number"?`total=${n.total} showing=${n.items.length}`:void 0,t=te(n.items);return u?`${u}
12
- ${t}`:t}return Object.entries(n).map(([u,t])=>`${u}: ${P(t)}`).join(`
13
- `)}return String(e)}function te(e){if(e.length===0)return"(empty)";let n=["id","name","slug","status","providerName","username","displayName","role","scheduledAt","content","text","originalFilename","score","collectionId"],u=new Set;for(let m of e)for(let O of Object.keys(m))u.add(O);let t=[...n.filter((m)=>u.has(m)),...[...u].filter((m)=>!n.includes(m)).slice(0,6)].slice(0,8),y=e.map((m)=>t.map((O)=>He(P(m[O]),O==="content"||O==="text"?48:28))),d=t.map((m,O)=>Math.max(m.length,...y.map((A)=>A[O]?.length??0))),i=t.map((m,O)=>m.padEnd(d[O])).join(" "),r=y.map((m)=>m.map((O,A)=>O.padEnd(d[A])).join(" ")).join(`
14
- `);return`${i}
15
- ${r}`}function P(e){if(e===null||e===void 0)return"";if(typeof e==="string")return e.replace(/\s+/g," ").trim();if(typeof e==="number"||typeof e==="boolean")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e==="object"){let n=e;if(typeof n.id==="string"&&typeof n.name==="string")return`${n.name} (${n.id})`;if(typeof n.status==="string")return n.status;return JSON.stringify(e)}return String(e)}function He(e,n){if(e.length<=n)return e;return`${e.slice(0,Math.max(0,n-1))}…`}var G={OK:0,USAGE:1,AUTH:2,FORBIDDEN:3,VALIDATION:4,NOT_FOUND:5,RATE_LIMITED:6,NETWORK:7};class S extends Error{code;details;constructor(e,n=G.USAGE,u){super(e);this.name="CliError",this.code=n,this.details=u}}import{mkdir as Ye,readFile as bn,writeFile as ze,chmod as We,unlink as Me}from"node:fs/promises";import{dirname as Qe,join as me}from"node:path";import{homedir as Xe}from"node:os";var X="0.3.1";function E(){if(process.env.DUN_CONFIG)return process.env.DUN_CONFIG;let e=process.env.XDG_CONFIG_HOME,n=e?e:me(Xe(),".config");return me(n,"dunsocial","config.json")}function J(){return E()}async function H(e){let n=E();await Ye(Qe(n),{recursive:!0});let u={...e,updatedAt:new Date().toISOString()};await ze(n,`${JSON.stringify(u,null,2)}
16
- `,"utf8");try{await We(n,384)}catch{}}async function oe(){let e=E();try{await Me(e)}catch(n){if(n.code!=="ENOENT")throw new w(`Failed to clear config: ${n.message}`,o.USAGE)}}function R(e){if(!e.token)throw new w("Not authenticated. Run `dun auth login --token <token>` or set DUN_TOKEN.",o.AUTH);return e.token}function k(e){if(!e.workspaceId)throw new w("No workspace selected. Run `dun workspace use <id|slug>` or pass --workspace / DUN_WORKSPACE_ID.",o.VALIDATION);return e.workspaceId}var Z=`dun — DunSocial agent-first CLI v${X}
9
+ `),w!==void 0&&process.env.DUN_DEBUG==="1")process.stderr.write(`${JSON.stringify(w,null,2)}
10
+ `);return r}function We(e){switch(e){case y.AUTH:return"auth";case y.FORBIDDEN:return"forbidden";case y.VALIDATION:return"validation";case y.NOT_FOUND:return"not_found";case y.RATE_LIMITED:return"rate_limited";case y.NETWORK:return"network";default:return"usage"}}function Ye(e){if(e instanceof t)return{message:e.message,code:e.code,details:e.details};if(e instanceof Error)return{message:e.message,code:y.USAGE};return{message:String(e),code:y.USAGE}}function Me(e){if(Array.isArray(e)){if(e.length===0)return"(empty)";if(e.every((n)=>n&&typeof n==="object"))return ie(e);return e.map((n)=>`- ${s(n)}`).join(`
11
+ `)}if(e&&typeof e==="object"){let n=e;if(Array.isArray(n.items)){let u=typeof n.total==="number"?`total=${n.total} showing=${n.items.length}`:void 0,r=ie(n.items);return u?`${u}
12
+ ${r}`:r}return Object.entries(n).map(([u,r])=>`${u}: ${s(r)}`).join(`
13
+ `)}return String(e)}function ie(e){if(e.length===0)return"(empty)";let n=["id","name","slug","status","providerName","username","displayName","role","scheduledAt","content","text","originalFilename","score","collectionId"],u=new Set;for(let o of e)for(let O of Object.keys(o))u.add(O);let r=[...n.filter((o)=>u.has(o)),...[...u].filter((o)=>!n.includes(o)).slice(0,6)].slice(0,8),w=e.map((o)=>r.map((O)=>Qe(s(o[O]),O==="content"||O==="text"?48:28))),d=r.map((o,O)=>Math.max(o.length,...w.map((N)=>N[O]?.length??0))),m=r.map((o,O)=>o.padEnd(d[O])).join(" "),i=w.map((o)=>o.map((O,N)=>O.padEnd(d[N])).join(" ")).join(`
14
+ `);return`${m}
15
+ ${i}`}function s(e){if(e===null||e===void 0)return"";if(typeof e==="string")return e.replace(/\s+/g," ").trim();if(typeof e==="number"||typeof e==="boolean")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e==="object"){let n=e;if(typeof n.id==="string"&&typeof n.name==="string")return`${n.name} (${n.id})`;if(typeof n.status==="string")return n.status;return JSON.stringify(e)}return String(e)}function Qe(e,n){if(e.length<=n)return e;return`${e.slice(0,Math.max(0,n-1))}…`}var K={OK:0,USAGE:1,AUTH:2,FORBIDDEN:3,VALIDATION:4,NOT_FOUND:5,RATE_LIMITED:6,NETWORK:7};class h extends Error{code;details;constructor(e,n=K.USAGE,u){super(e);this.name="CliError",this.code=n,this.details=u}}import{mkdir as Xe,readFile as Gn,writeFile as Ze,chmod as Le,unlink as Fe}from"node:fs/promises";import{dirname as qe,join as oe}from"node:path";import{homedir as Be}from"node:os";var X="0.3.1";function S(){if(process.env.DUN_CONFIG)return process.env.DUN_CONFIG;let e=process.env.XDG_CONFIG_HOME,n=e?e:oe(Be(),".config");return oe(n,"dunsocial","config.json")}function J(){return S()}async function _(e){let n=S();await Xe(qe(n),{recursive:!0});let u={...e,updatedAt:new Date().toISOString()};await Ze(n,`${JSON.stringify(u,null,2)}
16
+ `,"utf8");try{await Le(n,384)}catch{}}async function ye(){let e=S();try{await Fe(e)}catch(n){if(n.code!=="ENOENT")throw new t(`Failed to clear config: ${n.message}`,y.USAGE)}}function R(e){if(!e.token)throw new t("Not authenticated. Run `dun auth login --token <token>` or set DUN_TOKEN.",y.AUTH);return e.token}function p(e){if(!e.workspaceId)throw new t("No workspace selected. Run `dun workspace use <id|slug>` or pass --workspace / DUN_WORKSPACE_ID.",y.VALIDATION);return e.workspaceId}var Z=`dun — DunSocial agent-first CLI v${X}
17
17
 
18
18
  Usage:
19
19
  dun <command> [flags]
@@ -66,9 +66,11 @@ Memory:
66
66
  dun memory delete <id> --collection <id> [--yes]
67
67
 
68
68
  Agent skills:
69
- dun skill install claude
70
- dun skill install codex
69
+ dun skill install <agent|all>
70
+ dun skill list
71
71
  dun skill path
72
+ # agents: claude codex cursor pi opencode agents copilot windsurf
73
+ # goose gemini amp grok continue antigravity
72
74
 
73
75
  Global flags:
74
76
  --json Machine-readable output (default when non-TTY / CI)
@@ -88,7 +90,7 @@ Exit codes:
88
90
  0 ok · 1 usage · 2 auth · 3 forbidden · 4 validation · 5 not found · 6 rate limit · 7 network
89
91
 
90
92
  Docs: https://dunsocial.com · MCP remains the remote-host path; CLI is local/CI.
91
- `;function f(e){return{auth:`dun auth
93
+ `;function E(e){return{auth:`dun auth
92
94
 
93
95
  login [--token] Device-code browser login (default) or --token for CI
94
96
  logout Clear local config
@@ -110,37 +112,39 @@ Docs: https://dunsocial.com · MCP remains the remote-host path; CLI is local/CI
110
112
  delete <id> [--yes]
111
113
  x-cap
112
114
  `,drafts:"dun drafts list|get|create|update|delete",media:"dun media list|get|upload|delete",memory:`dun memory collections list|create
113
- dun memory list|save|search|delete`,skill:`dun skill install claude|codex
114
- dun skill path`}[e]??Z}function N(e,n){if(n.quiet&&!n.json)return;if(n.json||!process.stdout.isTTY){process.stdout.write(`${JSON.stringify({ok:!0,data:e},null,2)}
115
+ dun memory list|save|search|delete`,skill:`dun skill install <claude|codex|cursor|pi|opencode|agents|copilot|windsurf|goose|gemini|amp|grok|continue|antigravity|all>
116
+ dun skill list
117
+ dun skill path`}[e]??Z}function $(e,n){if(n.quiet&&!n.json)return;if(n.json||!process.stdout.isTTY){process.stdout.write(`${JSON.stringify({ok:!0,data:e},null,2)}
115
118
  `);return}if(e===void 0||e===null){process.stdout.write(`ok
116
119
  `);return}if(typeof e==="string"){process.stdout.write(`${e}
117
- `);return}process.stdout.write(`${Ze(e)}
118
- `)}function Ze(e){if(Array.isArray(e)){if(e.length===0)return"(empty)";if(e.every((n)=>n&&typeof n==="object"))return ye(e);return e.map((n)=>`- ${v(n)}`).join(`
119
- `)}if(e&&typeof e==="object"){let n=e;if(Array.isArray(n.items)){let u=typeof n.total==="number"?`total=${n.total} showing=${n.items.length}`:void 0,t=ye(n.items);return u?`${u}
120
- ${t}`:t}return Object.entries(n).map(([u,t])=>`${u}: ${v(t)}`).join(`
121
- `)}return String(e)}function ye(e){if(e.length===0)return"(empty)";let n=["id","name","slug","status","providerName","username","displayName","role","scheduledAt","content","text","originalFilename","score","collectionId"],u=new Set;for(let m of e)for(let O of Object.keys(m))u.add(O);let t=[...n.filter((m)=>u.has(m)),...[...u].filter((m)=>!n.includes(m)).slice(0,6)].slice(0,8),y=e.map((m)=>t.map((O)=>Be(v(m[O]),O==="content"||O==="text"?48:28))),d=t.map((m,O)=>Math.max(m.length,...y.map((A)=>A[O]?.length??0))),i=t.map((m,O)=>m.padEnd(d[O])).join(" "),r=y.map((m)=>m.map((O,A)=>O.padEnd(d[A])).join(" ")).join(`
122
- `);return`${i}
123
- ${r}`}function v(e){if(e===null||e===void 0)return"";if(typeof e==="string")return e.replace(/\s+/g," ").trim();if(typeof e==="number"||typeof e==="boolean")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e==="object"){let n=e;if(typeof n.id==="string"&&typeof n.name==="string")return`${n.name} (${n.id})`;if(typeof n.status==="string")return n.status;return JSON.stringify(e)}return String(e)}function Be(e,n){if(e.length<=n)return e;return`${e.slice(0,Math.max(0,n-1))}…`}function Y(e,n,u){if(!e)return;if(u!==void 0){process.stderr.write(`[debug] ${n} ${JSON.stringify(u)}
120
+ `);return}process.stdout.write(`${Pe(e)}
121
+ `)}function Pe(e){if(Array.isArray(e)){if(e.length===0)return"(empty)";if(e.every((n)=>n&&typeof n==="object"))return we(e);return e.map((n)=>`- ${v(n)}`).join(`
122
+ `)}if(e&&typeof e==="object"){let n=e;if(Array.isArray(n.items)){let u=typeof n.total==="number"?`total=${n.total} showing=${n.items.length}`:void 0,r=we(n.items);return u?`${u}
123
+ ${r}`:r}return Object.entries(n).map(([u,r])=>`${u}: ${v(r)}`).join(`
124
+ `)}return String(e)}function we(e){if(e.length===0)return"(empty)";let n=["id","name","slug","status","providerName","username","displayName","role","scheduledAt","content","text","originalFilename","score","collectionId"],u=new Set;for(let o of e)for(let O of Object.keys(o))u.add(O);let r=[...n.filter((o)=>u.has(o)),...[...u].filter((o)=>!n.includes(o)).slice(0,6)].slice(0,8),w=e.map((o)=>r.map((O)=>se(v(o[O]),O==="content"||O==="text"?48:28))),d=r.map((o,O)=>Math.max(o.length,...w.map((N)=>N[O]?.length??0))),m=r.map((o,O)=>o.padEnd(d[O])).join(" "),i=w.map((o)=>o.map((O,N)=>O.padEnd(d[N])).join(" ")).join(`
125
+ `);return`${m}
126
+ ${i}`}function v(e){if(e===null||e===void 0)return"";if(typeof e==="string")return e.replace(/\s+/g," ").trim();if(typeof e==="number"||typeof e==="boolean")return String(e);if(e instanceof Date)return e.toISOString();if(typeof e==="object"){let n=e;if(typeof n.id==="string"&&typeof n.name==="string")return`${n.name} (${n.id})`;if(typeof n.status==="string")return n.status;return JSON.stringify(e)}return String(e)}function se(e,n){if(e.length<=n)return e;return`${e.slice(0,Math.max(0,n-1))}…`}function H(e,n,u){if(!e)return;if(u!==void 0){process.stderr.write(`[debug] ${n} ${JSON.stringify(u)}
124
127
  `);return}process.stderr.write(`[debug] ${n}
125
- `)}class we{ctx;constructor(e){this.ctx=e}async request(e){let n=e.method??"GET",u=new URL(e.path.startsWith("http")?e.path:`${this.ctx.apiUrl}${e.path}`);if(e.query)for(let[m,O]of Object.entries(e.query)){if(O===void 0||O===null||O==="")continue;u.searchParams.set(m,String(O))}let t={Accept:"application/json","User-Agent":`dunsocial-cli/${X}`,...e.headers??{}};if(e.auth!==!1)t.Authorization=`Bearer ${R(this.ctx)}`;if(e.workspace)t["X-Workspace-Id"]=k(this.ctx);let y;if(e.body!==void 0)t["Content-Type"]="application/json",y=JSON.stringify(e.body);Y(this.ctx.debug,`${n} ${u.toString()}`);let d;try{d=await fetch(u,{method:n,headers:t,body:y})}catch(m){throw new w(`Network error: ${m.message}`,o.NETWORK,{cause:String(m)})}let i=await d.text(),r=null;if(i)try{r=JSON.parse(i)}catch{r=null}if(Y(this.ctx.debug,`← ${d.status}`,{ok:d.ok,bodyPreview:i.slice(0,300)}),!d.ok){let m=r?.error||r?.message||(i?i.slice(0,300):`HTTP ${d.status}`);throw new w(m,ne(d.status),{status:d.status,body:r??i})}if(r&&typeof r==="object"&&"success"in r){if(r.success===!1)throw new w(r.error||r.message||"Request failed",o.VALIDATION,r);return r.data}return r??void 0}get(e,n){return this.request({...n,method:"GET",path:e})}post(e,n,u){return this.request({...u,method:"POST",path:e,body:n})}patch(e,n,u){return this.request({...u,method:"PATCH",path:e,body:n})}delete(e,n,u){return this.request({...u,method:"DELETE",path:e,body:n})}}function D(e){return new we(e)}function $(e,...n){for(let u of n){let t=e[u];if(typeof t==="string"&&t.length>0)return t}return}function j(e,...n){for(let u of n){let t=e[u];if(t===!0)return!0;if(typeof t==="string"){let y=t.toLowerCase();if(y==="1"||y==="true"||y==="yes")return!0}}return!1}function I(e,...n){let u=$(e,...n);if(u===void 0)return;let t=Number(u);if(!Number.isFinite(t))throw Error(`Invalid number for --${n[0]}: ${u}`);return t}function p(e,...n){let u=$(e,...n);if(u===void 0)return;return u.split(",").map((t)=>t.trim()).filter(Boolean)}async function Oe(e,n,u,t){switch(n){case"login":return Fe(e,u);case"logout":return Pe(e);case"whoami":return se(e);case"status":return Se(e);default:throw new w(`Unknown auth command "${n??""}". Try: login, logout, whoami, status`,o.USAGE)}}async function Fe(e,n){let u=$(n,"token")||process.env.DUN_TOKEN;if(u)return qe(e,u);return he(e,n)}async function qe(e,n){let u={...e,token:n},y=await D(u).get("/api/user/profile");await H({...e.config,apiUrl:e.apiUrl,token:n,defaultWorkspaceId:e.config.defaultWorkspaceId,defaultWorkspaceSlug:e.config.defaultWorkspaceSlug,defaultWorkspaceName:e.config.defaultWorkspaceName}),N({user:{id:y.id,name:y.name,email:y.email},configPath:J(),method:"token",message:"Logged in. Next: dun workspace list && dun workspace use <id|slug>"},e)}async function he(e,n){let u=D({...e,token:void 0}),t=await u.post("/api/cli/auth/start",{clientName:"dun-cli"},{auth:!1}),y=!j(n,"no-browser");if(!e.json)process.stderr.write(`
128
+ `)}class te{ctx;constructor(e){this.ctx=e}async request(e){let n=e.method??"GET",u=new URL(e.path.startsWith("http")?e.path:`${this.ctx.apiUrl}${e.path}`);if(e.query)for(let[o,O]of Object.entries(e.query)){if(O===void 0||O===null||O==="")continue;u.searchParams.set(o,String(O))}let r={Accept:"application/json","User-Agent":`dunsocial-cli/${X}`,...e.headers??{}};if(e.auth!==!1)r.Authorization=`Bearer ${R(this.ctx)}`;if(e.workspace)r["X-Workspace-Id"]=p(this.ctx);let w;if(e.body!==void 0)r["Content-Type"]="application/json",w=JSON.stringify(e.body);H(this.ctx.debug,`${n} ${u.toString()}`);let d;try{d=await fetch(u,{method:n,headers:r,body:w})}catch(o){throw new t(`Network error: ${o.message}`,y.NETWORK,{cause:String(o)})}let m=await d.text(),i=null;if(m)try{i=JSON.parse(m)}catch{i=null}if(H(this.ctx.debug,`← ${d.status}`,{ok:d.ok,bodyPreview:m.slice(0,300)}),!d.ok){let o=i?.error||i?.message||(m?m.slice(0,300):`HTTP ${d.status}`);throw new t(o,ne(d.status),{status:d.status,body:i??m})}if(i&&typeof i==="object"&&"success"in i){if(i.success===!1)throw new t(i.error||i.message||"Request failed",y.VALIDATION,i);return i.data}return i??void 0}get(e,n){return this.request({...n,method:"GET",path:e})}post(e,n,u){return this.request({...u,method:"POST",path:e,body:n})}patch(e,n,u){return this.request({...u,method:"PATCH",path:e,body:n})}delete(e,n,u){return this.request({...u,method:"DELETE",path:e,body:n})}}function A(e){return new te(e)}function U(e,...n){for(let u of n){let r=e[u];if(typeof r==="string"&&r.length>0)return r}return}function k(e,...n){for(let u of n){let r=e[u];if(r===!0)return!0;if(typeof r==="string"){let w=r.toLowerCase();if(w==="1"||w==="true"||w==="yes")return!0}}return!1}function V(e,...n){let u=U(e,...n);if(u===void 0)return;let r=Number(u);if(!Number.isFinite(r))throw Error(`Invalid number for --${n[0]}: ${u}`);return r}function I(e,...n){let u=U(e,...n);if(u===void 0)return;return u.split(",").map((r)=>r.trim()).filter(Boolean)}async function Oe(e,n,u,r){switch(n){case"login":return fe(e,u);case"logout":return Ee(e);case"whoami":return ve(e);case"status":return ce(e);default:throw new t(`Unknown auth command "${n??""}". Try: login, logout, whoami, status`,y.USAGE)}}async function fe(e,n){let u=U(n,"token")||process.env.DUN_TOKEN;if(u)return he(e,u);return Se(e,n)}async function he(e,n){let u={...e,token:n},w=await A(u).get("/api/user/profile");await _({...e.config,apiUrl:e.apiUrl,token:n,defaultWorkspaceId:e.config.defaultWorkspaceId,defaultWorkspaceSlug:e.config.defaultWorkspaceSlug,defaultWorkspaceName:e.config.defaultWorkspaceName}),$({user:{id:w.id,name:w.name,email:w.email},configPath:J(),method:"token",message:"Logged in. Next: dun workspace list && dun workspace use <id|slug>"},e)}async function Se(e,n){let u=A({...e,token:void 0}),r=await u.post("/api/cli/auth/start",{clientName:"dun-cli"},{auth:!1}),w=!k(n,"no-browser");if(!e.json)process.stderr.write(`
126
129
  DunSocial CLI login
127
130
  `),process.stderr.write(`───────────────────
128
131
  `),process.stderr.write(`In your browser, open:
129
- ${t.verificationUrlComplete}
132
+ ${r.verificationUrlComplete}
130
133
 
131
- `),process.stderr.write(`Or go to ${t.verificationUrl} and enter code:
132
- `),process.stderr.write(` ${t.userCode}
134
+ `),process.stderr.write(`Or go to ${r.verificationUrl} and enter code:
135
+ `),process.stderr.write(` ${r.userCode}
133
136
 
134
137
  `),process.stderr.write(`Waiting for approval…
135
- `);else process.stderr.write(JSON.stringify({ok:!0,phase:"waiting",userCode:t.userCode,verificationUrlComplete:t.verificationUrlComplete})+`
136
- `);if(y&&process.stdout.isTTY)try{await fe(t.verificationUrlComplete)}catch{}let d=Math.max(3,t.interval||5)*1000,i=Date.now()+(t.expiresIn||900)*1000;while(Date.now()<i){await Ee(d);let r=await u.post("/api/cli/auth/poll",{deviceCode:t.deviceCode},{auth:!1});if(r.status==="pending")continue;if(r.status==="expired")throw new w("Login expired. Run dun auth login again.",o.AUTH);if(r.status==="denied")throw new w("Login was denied in the browser.",o.AUTH);if(r.status==="approved"){let m=r.token,O={...e,token:m},A=D(O),T=await A.get("/api/user/profile"),U={...e.config,apiUrl:e.apiUrl,token:m,defaultWorkspaceId:r.workspaceId||e.config.defaultWorkspaceId,defaultWorkspaceSlug:e.config.defaultWorkspaceSlug,defaultWorkspaceName:e.config.defaultWorkspaceName};if(r.workspaceId)try{let b=(await A.get("/api/workspaces")).find((_)=>_.id===r.workspaceId);if(b)U.defaultWorkspaceId=b.id,U.defaultWorkspaceSlug=b.slug,U.defaultWorkspaceName=b.name}catch{}await H(U),N({user:{id:T.id,name:T.name,email:T.email},workspaceId:U.defaultWorkspaceId??null,configPath:J(),method:"device",message:U.defaultWorkspaceId?"Logged in.":"Logged in. Next: dun workspace list && dun workspace use <id|slug>"},e);return}}throw new w("Login timed out. Run dun auth login again.",o.AUTH)}async function Pe(e){await oe(),N({message:"Logged out. Config cleared.",configPath:J()},e)}async function se(e){R(e);let u=await D(e).get("/api/user/profile");N({id:u.id,name:u.name,email:u.email,image:u.image??null,apiUrl:e.apiUrl,workspaceId:e.workspaceId??null},e)}async function Se(e){let n=Boolean(e.token),u=null,t=null;if(n)try{u=await D(e).get("/api/user/profile")}catch(y){t=y instanceof Error?y.message:String(y)}N({authenticated:Boolean(u),tokenPresent:n,apiUrl:e.apiUrl,workspaceId:e.workspaceId??null,workspaceSlug:e.config.defaultWorkspaceSlug??null,workspaceName:e.config.defaultWorkspaceName??null,configPath:J(),user:u?{id:u.id,name:u.name,email:u.email}:null,error:t},e)}function Ee(e){return new Promise((n)=>setTimeout(n,e))}async function fe(e){let n=process.platform,u=n==="darwin"?["open",e]:n==="win32"?["cmd","/c","start","",e]:["xdg-open",e];await Bun.spawn(u,{stdout:"ignore",stderr:"ignore"}).exited}async function Ne(e,n,u,t){R(e);let y=D(e);switch(n){case"list":case"ls":{let d=await y.get("/api/workspaces");N(d.map((i)=>({id:i.id,name:i.name,slug:i.slug,role:i.role,timezone:i.timezone,plan:i.subscription?.planName??null,status:i.subscription?.status??null})),e);return}case"use":{let d=t[0];if(!d)throw new w("Usage: dun workspace use <id|slug>",o.USAGE);let r=(await y.get("/api/workspaces")).find((m)=>m.id===d||m.slug===d);if(!r)throw new w(`Workspace not found: ${d}. Run dun workspace list`,o.NOT_FOUND);await H({...e.config,apiUrl:e.apiUrl,token:e.token,defaultWorkspaceId:r.id,defaultWorkspaceSlug:r.slug,defaultWorkspaceName:r.name}),N({id:r.id,name:r.name,slug:r.slug,role:r.role,message:`Default workspace set to ${r.name}`},e);return}case"current":{if(!e.workspaceId&&!e.config.defaultWorkspaceId)throw new w("No workspace selected. Run dun workspace use <id|slug>",o.VALIDATION);let d=e.workspaceId||e.config.defaultWorkspaceId;try{let r=(await y.get("/api/workspaces")).find((m)=>m.id===d||m.slug===d);if(r){N({id:r.id,name:r.name,slug:r.slug,role:r.role,timezone:r.timezone},e);return}}catch{}N({id:d,name:e.config.defaultWorkspaceName??null,slug:e.config.defaultWorkspaceSlug??null},e);return}default:throw new w(`Unknown workspace command "${n??""}". Try: list, use, current`,o.USAGE)}}async function Ae(e,n,u,t){R(e),k(e);let y=D(e);switch(n){case void 0:case"list":case"ls":{let d=await y.get("/api/social-accounts",{workspace:!0}),i=$(u,"platform","p")?.toLowerCase(),r=i?d.filter((m)=>{let O=(m.providerName||"").toLowerCase();return({x:["x","twitter"],twitter:["x","twitter"],linkedin:["linkedin"],"linkedin-business":["linkedin business","linkedin-business","linkedin_business"],bluesky:["bluesky"],threads:["threads"],reddit:["reddit"],pinterest:["pinterest"],instagram:["instagram"],youtube:["youtube"]}[i]??[i]).some((U)=>O.includes(U))}):d;N(r.map((m)=>({id:m.id,providerName:m.providerName,username:m.username??null,displayName:m.displayName??null,isConnected:m.isConnected,expiresAt:m.expiresAt??null})),e);return}default:throw new w(`Unknown accounts command "${n}". Try: list`,o.USAGE)}}var ve=/^(\d+)\s*(s|sec|secs|second|seconds|m|min|mins|minute|minutes|h|hr|hrs|hour|hours|d|day|days|w|week|weeks)$/i;function C(e,n=new Date){let u=e.trim();if(!u)throw new w("Empty time value",o.VALIDATION);let t=u.match(ve);if(t){let i=Number(t[1]),r=t[2].toLowerCase(),m=Ce(r)*i;return new Date(n.getTime()+m)}let y=u.match(/^in\s+(.+)$/i);if(y)return C(y[1],n);let d=new Date(u);if(Number.isNaN(d.getTime()))throw new w(`Invalid time "${e}". Use ISO-8601 (2026-06-01T09:00:00Z) or relative (2h, 30m, 1d).`,o.VALIDATION);return d}function Ce(e){switch(e){case"s":case"sec":case"secs":case"second":case"seconds":return 1000;case"m":case"min":case"mins":case"minute":case"minutes":return 60000;case"h":case"hr":case"hrs":case"hour":case"hours":return 3600000;case"d":case"day":case"days":return 86400000;case"w":case"week":case"weeks":return 604800000;default:throw new w(`Unknown time unit: ${e}`,o.VALIDATION)}}function B(e){if(e.at&&e.in)throw new w("Pass only one of --at or --in",o.VALIDATION);if(e.at)return C(e.at).toISOString();if(e.in)return C(e.in).toISOString();throw new w("Schedule time required. Pass --at <iso> or --in <duration> (e.g. 2h).",o.VALIDATION)}function Ue(e){if(!e)return[];return e.split(",").map((n)=>n.trim()).filter(Boolean)}function $e(e){let n=$(e,"text","content","c","t");if(!n)throw new w("Missing --text",o.VALIDATION);return n}function c(e){let n=p(e,"accounts","account","a")??Ue($(e,"accounts","account","a"));if(!n||n.length===0)throw new w("Missing --accounts <id,id>",o.VALIDATION);return n}function l(e){return p(e,"media","media-urls")??Ue($(e,"media","media-urls"))}function z(e){let n=$(e,"meta","metadata","meta-json");if(!n)return;try{let u=JSON.parse(n);if(!u||typeof u!=="object"||Array.isArray(u))throw Error("metadata must be a JSON object");return u}catch(u){throw new w(`Invalid --meta JSON: ${u.message}`,o.VALIDATION)}}async function Te(e,n,u,t){R(e),k(e);let y=D(e);switch(n){case"list":case"ls":{let d=await y.get("/api/posts",{workspace:!0,query:{status:$(u,"status","s"),socialAccountId:$(u,"account","social-account"),groupId:$(u,"group"),limit:I(u,"limit")??50,offset:I(u,"offset")??0}});N(d,e);return}case"get":{let d=t[0];if(!d)throw new w("Usage: dun posts get <id>",o.USAGE);let i=await y.get(`/api/posts/${d}`,{workspace:!0});N(i,e);return}case"schedule":{let d=$e(u),i=c(u),r=B({at:$(u,"at"),in:$(u,"in")}),m=await y.post("/api/posts/schedule",{content:d,socialAccountIds:i,scheduledAt:r,mediaUrls:l(u),metadata:z(u)??{}},{workspace:!0});N(m,e);return}case"publish":case"publish-now":{let d=$e(u),i=c(u),r=await y.post("/api/posts/publish-now",{content:d,socialAccountIds:i,mediaUrls:l(u),metadata:z(u)??{},naturalPosting:j(u,"natural","natural-posting")},{workspace:!0});N(r,e);return}case"reschedule":{let d=t[0];if(!d)throw new w("Usage: dun posts reschedule <id> --at|--in",o.USAGE);let r={scheduledAt:B({at:$(u,"at"),in:$(u,"in")})},m=$(u,"text","content","c","t");if(m)r.content=m;let O=l(u);if(O.length)r.mediaUrls=O;let A=z(u);if(A)r.metadata=A;if(!r.content){let U=await y.get(`/api/posts/${d}`,{workspace:!0});if(r.content=U.content,!r.metadata&&U.metadata)r.metadata=U.metadata;if(!r.mediaUrls&&U.mediaUrls)r.mediaUrls=U.mediaUrls}let T=await y.post(`/api/posts/${d}/reschedule`,r,{workspace:!0});N(T,e);return}case"cancel":{let d=t[0];if(!d)throw new w("Usage: dun posts cancel <id>",o.USAGE);let i=await y.post(`/api/posts/${d}/cancel`,void 0,{workspace:!0});N(i??{id:d,status:"cancelled"},e);return}case"delete":case"rm":{let d=t[0];if(!d)throw new w("Usage: dun posts delete <id> [--yes]",o.USAGE);if(!e.yes&&!j(u,"yes","y"))throw new w("Refusing to delete without --yes (or CI/yes mode)",o.VALIDATION);let i=await y.delete(`/api/posts/${d}`,void 0,{workspace:!0});N(i??{id:d,deleted:!0},e);return}case"x-cap":case"xcap":{let d=await y.get("/api/posts/x-cap-usage",{workspace:!0});N(d,e);return}case"schedule-thread":case"publish-thread":case"publish-thread-now":{let d=$(u,"file","f"),i=$(u,"account","accounts","a")??c(u)[0];if(!i)throw new w("Missing --account <xAccountId>",o.VALIDATION);let r;if(d){let O=await Bun.file(d).text(),A=JSON.parse(O);if(Array.isArray(A))r=A;else if(A&&typeof A==="object"&&Array.isArray(A.tweets))r=A.tweets;else throw new w("Thread file must be an array of tweets or { tweets: [] }",o.VALIDATION)}else{let O=$(u,"text","content");if(!O)throw new w("Provide --file thread.json (array of {content}) or informal --text with || separators is not enough alone for threads — use --file",o.VALIDATION);r=O.split("||").map((A)=>({content:A.trim()})).filter((A)=>A.content)}if(r.length<2)throw new w("Threads require at least 2 tweets",o.VALIDATION);if(n==="schedule-thread"){let O=B({at:$(u,"at"),in:$(u,"in")}),A=await y.post("/api/posts/schedule-thread",{socialAccountId:i,tweets:r,scheduledAt:O,metadata:z(u)??{}},{workspace:!0});N(A,e);return}let m=await y.post("/api/posts/publish-thread-now",{socialAccountId:i,tweets:r,metadata:z(u)??{}},{workspace:!0});N(m,e);return}default:throw new w(`Unknown posts command "${n??""}". Try: list, get, schedule, publish, reschedule, cancel, delete, x-cap, schedule-thread, publish-thread`,o.USAGE)}}async function De(e,n,u,t){R(e),k(e);let y=D(e);switch(n){case"list":case"ls":{let d=await y.get("/api/drafts",{workspace:!0,query:{limit:I(u,"limit")??50,offset:I(u,"offset")??0}});N(d,e);return}case"get":{let d=t[0];if(!d)throw new w("Usage: dun drafts get <id>",o.USAGE);let i=await y.get(`/api/drafts/${d}`,{workspace:!0});N(i,e);return}case"create":{let d=$(u,"text","content","c","t");if(!d)throw new w("Missing --text",o.VALIDATION);let i=await y.post("/api/drafts",{content:d,name:$(u,"name","n"),socialAccountIds:p(u,"accounts","account","a")??[],selectedPlatforms:p(u,"platforms","platform","p")??[],mediaUrls:p(u,"media")??[]},{workspace:!0});N(i,e);return}case"update":{let d=t[0];if(!d)throw new w("Usage: dun drafts update <id> --text ...",o.USAGE);let i={id:d},r=$(u,"text","content","c","t");if(r)i.content=r;let m=$(u,"name","n");if(m!==void 0)i.name=m;let O=p(u,"accounts","account","a");if(O)i.socialAccountIds=O;let A=p(u,"platforms","platform","p");if(A)i.selectedPlatforms=A;let T=p(u,"media");if(T)i.mediaUrls=T;let U=await y.patch(`/api/drafts/${d}`,i,{workspace:!0});N(U,e);return}case"delete":case"rm":{let d=t[0];if(!d)throw new w("Usage: dun drafts delete <id> [--yes]",o.USAGE);if(!e.yes&&!j(u,"yes","y"))throw new w("Refusing to delete without --yes",o.VALIDATION);let i=await y.delete(`/api/drafts/${d}`,void 0,{workspace:!0});N(i??{id:d,deleted:!0},e);return}default:throw new w(`Unknown drafts command "${n??""}". Try: list, get, create, update, delete`,o.USAGE)}}import{basename as ce}from"node:path";function le(e){let n=e.split(".").pop()?.toLowerCase()??"";return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",mov:"video/quicktime",webm:"video/webm"}[n]??"application/octet-stream"}async function Re(e,n,u,t){R(e),k(e);let y=D(e);switch(n){case"list":case"ls":{let d=await y.get("/api/media",{workspace:!0,query:{limit:I(u,"limit")??50,offset:I(u,"offset")??0}});N(d,e);return}case"get":{let d=t[0];if(!d)throw new w("Usage: dun media get <id>",o.USAGE);let i=await y.get(`/api/media/${d}`,{workspace:!0});N(i,e);return}case"upload":{let d=t[0]||$(u,"file","f");if(!d)throw new w('Usage: dun media upload <file> [--alt "..."]',o.USAGE);let i=Bun.file(d);if(!await i.exists())throw new w(`File not found: ${d}`,o.VALIDATION);let m=ce(d),O=$(u,"mime","type","content-type")||i.type||le(m),A=i.size,T=$(u,"alt","alt-text"),U=await y.post("/api/media/upload-url",{filename:m,mimeType:O,fileSize:A},{workspace:!0});Y(e.debug,`PUT ${U.uploadUrl}`,{storageKey:U.storageKey,fileSize:A});let V=await i.arrayBuffer(),b;try{b=await fetch(U.uploadUrl,{method:"PUT",headers:{"Content-Type":O,"Content-Length":String(A)},body:V})}catch(W){throw new w(`Upload PUT failed: ${W.message}`,o.NETWORK)}if(!b.ok){let W=await b.text().catch(()=>"");throw new w(`Upload PUT failed with HTTP ${b.status}${W?`: ${W.slice(0,200)}`:""}`,o.NETWORK)}let _=await y.post("/api/media/complete",{storageKey:U.storageKey,originalFilename:m,mimeType:O,fileSize:A,altText:T},{workspace:!0});N(_,e);return}case"delete":case"rm":{let d=t[0];if(!d)throw new w("Usage: dun media delete <id> [--yes]",o.USAGE);if(!e.yes&&!j(u,"yes","y"))throw new w("Refusing to delete without --yes",o.VALIDATION);let i=await y.delete(`/api/media/${d}`,void 0,{workspace:!0});N(i??{id:d,deleted:!0},e);return}default:throw new w(`Unknown media command "${n??""}". Try: list, get, upload, delete`,o.USAGE)}}async function be(e,n,u,t){R(e),k(e);let y=D(e),d=n[0];if(d==="collections"||d==="collection"){let i=n[1]||"list";switch(i){case"list":case"ls":{let r=await y.get("/api/memory/collections",{workspace:!0});N(r,e);return}case"create":{let r=$(u,"name","n");if(!r)throw new w("Missing --name",o.VALIDATION);let m=await y.post("/api/memory/collections",{name:r,color:$(u,"color")??"blue",isPrivate:j(u,"private")},{workspace:!0});N(m,e);return}case"get":{let r=n[2]||t[0];if(!r)throw new w("Usage: dun memory collections get <id>",o.USAGE);let m=await y.get(`/api/memory/collections/${r}`,{workspace:!0});N(m,e);return}default:throw new w(`Unknown memory collections command "${i}". Try: list, create, get`,o.USAGE)}}switch(d){case"list":case"ls":{let i=$(u,"collection","collection-id","c");if(!i)throw new w("Missing --collection <id>",o.VALIDATION);let r=await y.get("/api/memory",{workspace:!0,query:{collectionId:i,limit:I(u,"limit")??100}});N(r,e);return}case"save":case"add":{let i=$(u,"collection","collection-id","c"),r=$(u,"text","t");if(!i)throw new w("Missing --collection <id>",o.VALIDATION);if(!r)throw new w("Missing --text",o.VALIDATION);let m=await y.post("/api/memory",{collectionId:i,text:r},{workspace:!0});N(m,e);return}case"search":{let i=$(u,"prompt","q","query","text"),r=p(u,"collections","collection","collection-ids","c")??[];if(!i)throw new w("Missing --prompt",o.VALIDATION);if(r.length===0)throw new w("Missing --collections <id,id>",o.VALIDATION);let m=await y.post("/api/memory/search",{prompt:i,collectionIds:r,topK:I(u,"top-k","topk","k")??5},{workspace:!0});N(m,e);return}case"delete":case"rm":{let i=n[1]||t[0],r=$(u,"collection","collection-id","c");if(!i)throw new w("Usage: dun memory delete <id> --collection <id>",o.USAGE);if(!r)throw new w("Missing --collection <id>",o.VALIDATION);if(!e.yes&&!j(u,"yes","y"))throw new w("Refusing to delete without --yes",o.VALIDATION);let m=await y.delete(`/api/memory/${i}`,{collectionId:r,memoryId:i},{workspace:!0});N(m??{id:i,deleted:!0},e);return}default:throw new w(`Unknown memory command "${d??""}". Try: collections, list, save, search, delete`,o.USAGE)}}import{existsSync as ge}from"node:fs";import{mkdir as g,writeFile as x,readFile as ke}from"node:fs/promises";import{dirname as F,join as L}from"node:path";import{homedir as a}from"node:os";import{fileURLToPath as xe}from"node:url";function ee(){let e=F(xe(import.meta.url)),n=L("skills","dunsocial","SKILL.md"),u=[L(e,"..",n),L(e,"..","..",n)];return u.find(ge)??u[0]}async function ae(){try{return await ke(ee(),"utf8")}catch{throw new w(`Bundled skill not found at ${ee()}. Reinstall dunsocial.`,o.USAGE)}}async function je(e,n,u,t){switch(n){case"path":{N({path:ee()},e);return}case"install":{let y=(t[0]||"").toLowerCase();if(!y||y!=="claude"&&y!=="codex")throw new w("Usage: dun skill install claude|codex",o.USAGE);let d=await ae();if(y==="claude"){let _=L(a(),".claude","skills","dunsocial","SKILL.md");await g(F(_),{recursive:!0}),await x(_,d,"utf8"),N({target:"claude",path:_,message:"Installed DunSocial skill for Claude Code. Restart or open a new session if needed."},e);return}let i=L(a(),".codex","skills","dunsocial","SKILL.md");await g(F(i),{recursive:!0}),await x(i,d,"utf8");let r=L(a(),".codex","AGENTS.md");await g(F(r),{recursive:!0});let m="";try{m=await ke(r,"utf8")}catch{m=""}let O=["<!-- BEGIN DUNSOCIAL CLI SKILL -->","## DunSocial CLI","","Use the `dun` CLI for DunSocial scheduling from the shell. Prefer `--json` output.",`Skill details: ${i}`,"","Common flow:","1. `dun auth status --json`","2. `dun workspace list --json` / `dun workspace use <id>`","3. `dun accounts list --json`",'4. `dun posts schedule --text "..." --accounts <id> --in 1h --json`',"<!-- END DUNSOCIAL CLI SKILL -->"].join(`
137
- `),A="<!-- BEGIN DUNSOCIAL CLI SKILL -->",T="<!-- END DUNSOCIAL CLI SKILL -->",U,V=m.indexOf(A),b=m.indexOf(T);if(V!==-1&&b!==-1&&b>V)U=m.slice(0,V)+O+m.slice(b+T.length);else if(m.trim())U=`${m.trimEnd()}
138
-
139
- ${O}
140
- `;else U=`${O}
141
- `;await x(r,U,"utf8"),N({target:"codex",skillPath:i,agentsPath:r,message:"Installed DunSocial skill for Codex."},e);return}default:throw new w(`Unknown skill command "${n??""}". Try: install, path`,o.USAGE)}}async function en(e){let n=re(e),{group:u,action:t,nest:y,flags:d,positionals:i}=n;if(h(d)&&!u)return process.stdout.write(`${M}
142
- `),G.OK;if(u==="help"||!u&&q(d)){let m=u==="help"?t||i[0]:void 0;return process.stdout.write(m?`${f(m)}
138
+ `);else process.stderr.write(JSON.stringify({ok:!0,phase:"waiting",userCode:r.userCode,verificationUrlComplete:r.verificationUrlComplete})+`
139
+ `);if(w&&process.stdout.isTTY)try{await ge(r.verificationUrlComplete)}catch{}let d=Math.max(3,r.interval||5)*1000,m=Date.now()+(r.expiresIn||900)*1000;while(Date.now()<m){await Ce(d);let i=await u.post("/api/cli/auth/poll",{deviceCode:r.deviceCode},{auth:!1});if(i.status==="pending")continue;if(i.status==="expired")throw new t("Login expired. Run dun auth login again.",y.AUTH);if(i.status==="denied")throw new t("Login was denied in the browser.",y.AUTH);if(i.status==="approved"){let o=i.token,O={...e,token:o},N=A(O),T=await N.get("/api/user/profile"),D={...e.config,apiUrl:e.apiUrl,token:o,defaultWorkspaceId:i.workspaceId||e.config.defaultWorkspaceId,defaultWorkspaceSlug:e.config.defaultWorkspaceSlug,defaultWorkspaceName:e.config.defaultWorkspaceName};if(i.workspaceId)try{let j=(await N.get("/api/workspaces")).find((q)=>q.id===i.workspaceId);if(j)D.defaultWorkspaceId=j.id,D.defaultWorkspaceSlug=j.slug,D.defaultWorkspaceName=j.name}catch{}await _(D),$({user:{id:T.id,name:T.name,email:T.email},workspaceId:D.defaultWorkspaceId??null,configPath:J(),method:"device",message:D.defaultWorkspaceId?"Logged in.":"Logged in. Next: dun workspace list && dun workspace use <id|slug>"},e);return}}throw new t("Login timed out. Run dun auth login again.",y.AUTH)}async function Ee(e){await ye(),$({message:"Logged out. Config cleared.",configPath:J()},e)}async function ve(e){R(e);let u=await A(e).get("/api/user/profile");$({id:u.id,name:u.name,email:u.email,image:u.image??null,apiUrl:e.apiUrl,workspaceId:e.workspaceId??null},e)}async function ce(e){let n=Boolean(e.token),u=null,r=null;if(n)try{u=await A(e).get("/api/user/profile")}catch(w){r=w instanceof Error?w.message:String(w)}$({authenticated:Boolean(u),tokenPresent:n,apiUrl:e.apiUrl,workspaceId:e.workspaceId??null,workspaceSlug:e.config.defaultWorkspaceSlug??null,workspaceName:e.config.defaultWorkspaceName??null,configPath:J(),user:u?{id:u.id,name:u.name,email:u.email}:null,error:r},e)}function Ce(e){return new Promise((n)=>setTimeout(n,e))}async function ge(e){let n=process.platform,u=n==="darwin"?["open",e]:n==="win32"?["cmd","/c","start","",e]:["xdg-open",e];await Bun.spawn(u,{stdout:"ignore",stderr:"ignore"}).exited}async function $e(e,n,u,r){R(e);let w=A(e);switch(n){case"list":case"ls":{let d=await w.get("/api/workspaces");$(d.map((m)=>({id:m.id,name:m.name,slug:m.slug,role:m.role,timezone:m.timezone,plan:m.subscription?.planName??null,status:m.subscription?.status??null})),e);return}case"use":{let d=r[0];if(!d)throw new t("Usage: dun workspace use <id|slug>",y.USAGE);let i=(await w.get("/api/workspaces")).find((o)=>o.id===d||o.slug===d);if(!i)throw new t(`Workspace not found: ${d}. Run dun workspace list`,y.NOT_FOUND);await _({...e.config,apiUrl:e.apiUrl,token:e.token,defaultWorkspaceId:i.id,defaultWorkspaceSlug:i.slug,defaultWorkspaceName:i.name}),$({id:i.id,name:i.name,slug:i.slug,role:i.role,message:`Default workspace set to ${i.name}`},e);return}case"current":{if(!e.workspaceId&&!e.config.defaultWorkspaceId)throw new t("No workspace selected. Run dun workspace use <id|slug>",y.VALIDATION);let d=e.workspaceId||e.config.defaultWorkspaceId;try{let i=(await w.get("/api/workspaces")).find((o)=>o.id===d||o.slug===d);if(i){$({id:i.id,name:i.name,slug:i.slug,role:i.role,timezone:i.timezone},e);return}}catch{}$({id:d,name:e.config.defaultWorkspaceName??null,slug:e.config.defaultWorkspaceSlug??null},e);return}default:throw new t(`Unknown workspace command "${n??""}". Try: list, use, current`,y.USAGE)}}async function Ne(e,n,u,r){R(e),p(e);let w=A(e);switch(n){case void 0:case"list":case"ls":{let d=await w.get("/api/social-accounts",{workspace:!0}),m=U(u,"platform","p")?.toLowerCase(),i=m?d.filter((o)=>{let O=(o.providerName||"").toLowerCase();return({x:["x","twitter"],twitter:["x","twitter"],linkedin:["linkedin"],"linkedin-business":["linkedin business","linkedin-business","linkedin_business"],bluesky:["bluesky"],threads:["threads"],reddit:["reddit"],pinterest:["pinterest"],instagram:["instagram"],youtube:["youtube"]}[m]??[m]).some((D)=>O.includes(D))}):d;$(i.map((o)=>({id:o.id,providerName:o.providerName,username:o.username??null,displayName:o.displayName??null,isConnected:o.isConnected,expiresAt:o.expiresAt??null})),e);return}default:throw new t(`Unknown accounts command "${n}". Try: list`,y.USAGE)}}var le=/^(\d+)\s*(s|sec|secs|second|seconds|m|min|mins|minute|minutes|h|hr|hrs|hour|hours|d|day|days|w|week|weeks)$/i;function c(e,n=new Date){let u=e.trim();if(!u)throw new t("Empty time value",y.VALIDATION);let r=u.match(le);if(r){let m=Number(r[1]),i=r[2].toLowerCase(),o=xe(i)*m;return new Date(n.getTime()+o)}let w=u.match(/^in\s+(.+)$/i);if(w)return c(w[1],n);let d=new Date(u);if(Number.isNaN(d.getTime()))throw new t(`Invalid time "${e}". Use ISO-8601 (2026-06-01T09:00:00Z) or relative (2h, 30m, 1d).`,y.VALIDATION);return d}function xe(e){switch(e){case"s":case"sec":case"secs":case"second":case"seconds":return 1000;case"m":case"min":case"mins":case"minute":case"minutes":return 60000;case"h":case"hr":case"hrs":case"hour":case"hours":return 3600000;case"d":case"day":case"days":return 86400000;case"w":case"week":case"weeks":return 604800000;default:throw new t(`Unknown time unit: ${e}`,y.VALIDATION)}}function L(e){if(e.at&&e.in)throw new t("Pass only one of --at or --in",y.VALIDATION);if(e.at)return c(e.at).toISOString();if(e.in)return c(e.in).toISOString();throw new t("Schedule time required. Pass --at <iso> or --in <duration> (e.g. 2h).",y.VALIDATION)}function De(e){if(!e)return[];return e.split(",").map((n)=>n.trim()).filter(Boolean)}function Ue(e){let n=U(e,"text","content","c","t");if(!n)throw new t("Missing --text",y.VALIDATION);return n}function C(e){let n=I(e,"accounts","account","a")??De(U(e,"accounts","account","a"));if(!n||n.length===0)throw new t("Missing --accounts <id,id>",y.VALIDATION);return n}function g(e){return I(e,"media","media-urls")??De(U(e,"media","media-urls"))}function z(e){let n=U(e,"meta","metadata","meta-json");if(!n)return;try{let u=JSON.parse(n);if(!u||typeof u!=="object"||Array.isArray(u))throw Error("metadata must be a JSON object");return u}catch(u){throw new t(`Invalid --meta JSON: ${u.message}`,y.VALIDATION)}}async function Ae(e,n,u,r){R(e),p(e);let w=A(e);switch(n){case"list":case"ls":{let d=await w.get("/api/posts",{workspace:!0,query:{status:U(u,"status","s"),socialAccountId:U(u,"account","social-account"),groupId:U(u,"group"),limit:V(u,"limit")??50,offset:V(u,"offset")??0}});$(d,e);return}case"get":{let d=r[0];if(!d)throw new t("Usage: dun posts get <id>",y.USAGE);let m=await w.get(`/api/posts/${d}`,{workspace:!0});$(m,e);return}case"schedule":{let d=Ue(u),m=C(u),i=L({at:U(u,"at"),in:U(u,"in")}),o=await w.post("/api/posts/schedule",{content:d,socialAccountIds:m,scheduledAt:i,mediaUrls:g(u),metadata:z(u)??{}},{workspace:!0});$(o,e);return}case"publish":case"publish-now":{let d=Ue(u),m=C(u),i=await w.post("/api/posts/publish-now",{content:d,socialAccountIds:m,mediaUrls:g(u),metadata:z(u)??{},naturalPosting:k(u,"natural","natural-posting")},{workspace:!0});$(i,e);return}case"reschedule":{let d=r[0];if(!d)throw new t("Usage: dun posts reschedule <id> --at|--in",y.USAGE);let i={scheduledAt:L({at:U(u,"at"),in:U(u,"in")})},o=U(u,"text","content","c","t");if(o)i.content=o;let O=g(u);if(O.length)i.mediaUrls=O;let N=z(u);if(N)i.metadata=N;if(!i.content){let D=await w.get(`/api/posts/${d}`,{workspace:!0});if(i.content=D.content,!i.metadata&&D.metadata)i.metadata=D.metadata;if(!i.mediaUrls&&D.mediaUrls)i.mediaUrls=D.mediaUrls}let T=await w.post(`/api/posts/${d}/reschedule`,i,{workspace:!0});$(T,e);return}case"cancel":{let d=r[0];if(!d)throw new t("Usage: dun posts cancel <id>",y.USAGE);let m=await w.post(`/api/posts/${d}/cancel`,void 0,{workspace:!0});$(m??{id:d,status:"cancelled"},e);return}case"delete":case"rm":{let d=r[0];if(!d)throw new t("Usage: dun posts delete <id> [--yes]",y.USAGE);if(!e.yes&&!k(u,"yes","y"))throw new t("Refusing to delete without --yes (or CI/yes mode)",y.VALIDATION);let m=await w.delete(`/api/posts/${d}`,void 0,{workspace:!0});$(m??{id:d,deleted:!0},e);return}case"x-cap":case"xcap":{let d=await w.get("/api/posts/x-cap-usage",{workspace:!0});$(d,e);return}case"schedule-thread":case"publish-thread":case"publish-thread-now":{let d=U(u,"file","f"),m=U(u,"account","accounts","a")??C(u)[0];if(!m)throw new t("Missing --account <xAccountId>",y.VALIDATION);let i;if(d){let O=await Bun.file(d).text(),N=JSON.parse(O);if(Array.isArray(N))i=N;else if(N&&typeof N==="object"&&Array.isArray(N.tweets))i=N.tweets;else throw new t("Thread file must be an array of tweets or { tweets: [] }",y.VALIDATION)}else{let O=U(u,"text","content");if(!O)throw new t("Provide --file thread.json (array of {content}) or informal --text with || separators is not enough alone for threads — use --file",y.VALIDATION);i=O.split("||").map((N)=>({content:N.trim()})).filter((N)=>N.content)}if(i.length<2)throw new t("Threads require at least 2 tweets",y.VALIDATION);if(n==="schedule-thread"){let O=L({at:U(u,"at"),in:U(u,"in")}),N=await w.post("/api/posts/schedule-thread",{socialAccountId:m,tweets:i,scheduledAt:O,metadata:z(u)??{}},{workspace:!0});$(N,e);return}let o=await w.post("/api/posts/publish-thread-now",{socialAccountId:m,tweets:i,metadata:z(u)??{}},{workspace:!0});$(o,e);return}default:throw new t(`Unknown posts command "${n??""}". Try: list, get, schedule, publish, reschedule, cancel, delete, x-cap, schedule-thread, publish-thread`,y.USAGE)}}async function be(e,n,u,r){R(e),p(e);let w=A(e);switch(n){case"list":case"ls":{let d=await w.get("/api/drafts",{workspace:!0,query:{limit:V(u,"limit")??50,offset:V(u,"offset")??0}});$(d,e);return}case"get":{let d=r[0];if(!d)throw new t("Usage: dun drafts get <id>",y.USAGE);let m=await w.get(`/api/drafts/${d}`,{workspace:!0});$(m,e);return}case"create":{let d=U(u,"text","content","c","t");if(!d)throw new t("Missing --text",y.VALIDATION);let m=await w.post("/api/drafts",{content:d,name:U(u,"name","n"),socialAccountIds:I(u,"accounts","account","a")??[],selectedPlatforms:I(u,"platforms","platform","p")??[],mediaUrls:I(u,"media")??[]},{workspace:!0});$(m,e);return}case"update":{let d=r[0];if(!d)throw new t("Usage: dun drafts update <id> --text ...",y.USAGE);let m={id:d},i=U(u,"text","content","c","t");if(i)m.content=i;let o=U(u,"name","n");if(o!==void 0)m.name=o;let O=I(u,"accounts","account","a");if(O)m.socialAccountIds=O;let N=I(u,"platforms","platform","p");if(N)m.selectedPlatforms=N;let T=I(u,"media");if(T)m.mediaUrls=T;let D=await w.patch(`/api/drafts/${d}`,m,{workspace:!0});$(D,e);return}case"delete":case"rm":{let d=r[0];if(!d)throw new t("Usage: dun drafts delete <id> [--yes]",y.USAGE);if(!e.yes&&!k(u,"yes","y"))throw new t("Refusing to delete without --yes",y.VALIDATION);let m=await w.delete(`/api/drafts/${d}`,void 0,{workspace:!0});$(m??{id:d,deleted:!0},e);return}default:throw new t(`Unknown drafts command "${n??""}". Try: list, get, create, update, delete`,y.USAGE)}}import{basename as ae}from"node:path";function en(e){let n=e.split(".").pop()?.toLowerCase()??"";return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",mov:"video/quicktime",webm:"video/webm"}[n]??"application/octet-stream"}async function Te(e,n,u,r){R(e),p(e);let w=A(e);switch(n){case"list":case"ls":{let d=await w.get("/api/media",{workspace:!0,query:{limit:V(u,"limit")??50,offset:V(u,"offset")??0}});$(d,e);return}case"get":{let d=r[0];if(!d)throw new t("Usage: dun media get <id>",y.USAGE);let m=await w.get(`/api/media/${d}`,{workspace:!0});$(m,e);return}case"upload":{let d=r[0]||U(u,"file","f");if(!d)throw new t('Usage: dun media upload <file> [--alt "..."]',y.USAGE);let m=Bun.file(d);if(!await m.exists())throw new t(`File not found: ${d}`,y.VALIDATION);let o=ae(d),O=U(u,"mime","type","content-type")||m.type||en(o),N=m.size,T=U(u,"alt","alt-text"),D=await w.post("/api/media/upload-url",{filename:o,mimeType:O,fileSize:N},{workspace:!0});H(e.debug,`PUT ${D.uploadUrl}`,{storageKey:D.storageKey,fileSize:N});let W=await m.arrayBuffer(),j;try{j=await fetch(D.uploadUrl,{method:"PUT",headers:{"Content-Type":O,"Content-Length":String(N)},body:W})}catch(Y){throw new t(`Upload PUT failed: ${Y.message}`,y.NETWORK)}if(!j.ok){let Y=await j.text().catch(()=>"");throw new t(`Upload PUT failed with HTTP ${j.status}${Y?`: ${Y.slice(0,200)}`:""}`,y.NETWORK)}let q=await w.post("/api/media/complete",{storageKey:D.storageKey,originalFilename:o,mimeType:O,fileSize:N,altText:T},{workspace:!0});$(q,e);return}case"delete":case"rm":{let d=r[0];if(!d)throw new t("Usage: dun media delete <id> [--yes]",y.USAGE);if(!e.yes&&!k(u,"yes","y"))throw new t("Refusing to delete without --yes",y.VALIDATION);let m=await w.delete(`/api/media/${d}`,void 0,{workspace:!0});$(m??{id:d,deleted:!0},e);return}default:throw new t(`Unknown media command "${n??""}". Try: list, get, upload, delete`,y.USAGE)}}async function Re(e,n,u,r){R(e),p(e);let w=A(e),d=n[0];if(d==="collections"||d==="collection"){let m=n[1]||"list";switch(m){case"list":case"ls":{let i=await w.get("/api/memory/collections",{workspace:!0});$(i,e);return}case"create":{let i=U(u,"name","n");if(!i)throw new t("Missing --name",y.VALIDATION);let o=await w.post("/api/memory/collections",{name:i,color:U(u,"color")??"blue",isPrivate:k(u,"private")},{workspace:!0});$(o,e);return}case"get":{let i=n[2]||r[0];if(!i)throw new t("Usage: dun memory collections get <id>",y.USAGE);let o=await w.get(`/api/memory/collections/${i}`,{workspace:!0});$(o,e);return}default:throw new t(`Unknown memory collections command "${m}". Try: list, create, get`,y.USAGE)}}switch(d){case"list":case"ls":{let m=U(u,"collection","collection-id","c");if(!m)throw new t("Missing --collection <id>",y.VALIDATION);let i=await w.get("/api/memory",{workspace:!0,query:{collectionId:m,limit:V(u,"limit")??100}});$(i,e);return}case"save":case"add":{let m=U(u,"collection","collection-id","c"),i=U(u,"text","t");if(!m)throw new t("Missing --collection <id>",y.VALIDATION);if(!i)throw new t("Missing --text",y.VALIDATION);let o=await w.post("/api/memory",{collectionId:m,text:i},{workspace:!0});$(o,e);return}case"search":{let m=U(u,"prompt","q","query","text"),i=I(u,"collections","collection","collection-ids","c")??[];if(!m)throw new t("Missing --prompt",y.VALIDATION);if(i.length===0)throw new t("Missing --collections <id,id>",y.VALIDATION);let o=await w.post("/api/memory/search",{prompt:m,collectionIds:i,topK:V(u,"top-k","topk","k")??5},{workspace:!0});$(o,e);return}case"delete":case"rm":{let m=n[1]||r[0],i=U(u,"collection","collection-id","c");if(!m)throw new t("Usage: dun memory delete <id> --collection <id>",y.USAGE);if(!i)throw new t("Missing --collection <id>",y.VALIDATION);if(!e.yes&&!k(u,"yes","y"))throw new t("Refusing to delete without --yes",y.VALIDATION);let o=await w.delete(`/api/memory/${m}`,{collectionId:i,memoryId:m},{workspace:!0});$(o??{id:m,deleted:!0},e);return}default:throw new t(`Unknown memory command "${d??""}". Try: collections, list, save, search, delete`,y.USAGE)}}import{existsSync as nn}from"node:fs";import{mkdir as Ve,writeFile as Ie,readFile as je}from"node:fs/promises";import{dirname as a,join as b}from"node:path";import{homedir as ee}from"node:os";import{fileURLToPath as un}from"node:url";var F=[{id:"claude",label:"Claude Code",aliases:["claude-code"],dest:(e)=>b(e,".claude","skills","dunsocial","SKILL.md")},{id:"codex",label:"Codex",dest:(e)=>b(e,".codex","skills","dunsocial","SKILL.md"),afterInstall:async(e)=>{return{agentsPath:await on(e)}}},{id:"cursor",label:"Cursor",dest:(e)=>b(e,".cursor","skills","dunsocial","SKILL.md")},{id:"pi",label:"Pi",dest:(e)=>b(e,".pi","agent","skills","dunsocial","SKILL.md")},{id:"opencode",label:"OpenCode",dest:(e)=>b(e,".config","opencode","skills","dunsocial","SKILL.md")},{id:"agents",label:"Universal (.agents)",aliases:["universal"],dest:(e)=>b(e,".agents","skills","dunsocial","SKILL.md")},{id:"copilot",label:"GitHub Copilot",aliases:["github-copilot","github"],dest:(e)=>b(e,".copilot","skills","dunsocial","SKILL.md")},{id:"windsurf",label:"Windsurf",dest:(e)=>b(e,".codeium","windsurf","skills","dunsocial","SKILL.md")},{id:"goose",label:"Goose",dest:(e)=>b(e,".config","goose","skills","dunsocial","SKILL.md")},{id:"gemini",label:"Gemini CLI",aliases:["gemini-cli"],dest:(e)=>b(e,".gemini","skills","dunsocial","SKILL.md")},{id:"amp",label:"Amp",dest:(e)=>b(e,".config","agents","skills","dunsocial","SKILL.md")},{id:"grok",label:"Grok Build",dest:(e)=>b(e,".grok","skills","dunsocial","SKILL.md")},{id:"continue",label:"Continue",dest:(e)=>b(e,".continue","skills","dunsocial","SKILL.md")},{id:"antigravity",label:"Antigravity",dest:(e)=>b(e,".gemini","antigravity","skills","dunsocial","SKILL.md")}],l=new Map;for(let e of F){l.set(e.id,e);for(let n of e.aliases??[])l.set(n,e)}var pe=`Usage: dun skill install <${F.map((e)=>e.id).join("|")}|all>`;function x(){let e=a(un(import.meta.url)),n=b("skills","dunsocial","SKILL.md"),u=[b(e,"..",n),b(e,"..","..",n)];return u.find(nn)??u[0]}function dn(){let e=ee();return F.map((n)=>({id:n.id,label:n.label,path:n.dest(e),aliases:n.aliases??[]}))}async function rn(){try{return await je(x(),"utf8")}catch{throw new t(`Bundled skill not found at ${x()}. Reinstall dunsocial.`,y.USAGE)}}async function mn(e,n){await Ve(a(e),{recursive:!0}),await Ie(e,n,"utf8")}async function on(e){let n=b(ee(),".codex","AGENTS.md");await Ve(a(n),{recursive:!0});let u="";try{u=await je(n,"utf8")}catch{u=""}let r=["<!-- BEGIN DUNSOCIAL CLI SKILL -->","## DunSocial CLI","","Use the `dun` CLI for DunSocial scheduling from the shell. Prefer `--json` output.",`Skill details: ${e}`,"","Common flow:","1. `dun auth status --json`","2. `dun workspace list --json` / `dun workspace use <id>`","3. `dun accounts list --json`",'4. `dun posts schedule --text "..." --accounts <id> --in 1h --json`',"<!-- END DUNSOCIAL CLI SKILL -->"].join(`
140
+ `),w="<!-- BEGIN DUNSOCIAL CLI SKILL -->",d="<!-- END DUNSOCIAL CLI SKILL -->",m,i=u.indexOf(w),o=u.indexOf(d);if(i!==-1&&o!==-1&&o>i)m=u.slice(0,i)+r+u.slice(o+d.length);else if(u.trim())m=`${u.trimEnd()}
141
+
142
+ ${r}
143
+ `;else m=`${r}
144
+ `;return await Ie(n,m,"utf8"),n}async function ke(e,n){let u=e.dest(ee());await mn(u,n);let r=e.afterInstall?await e.afterInstall(u):{};return{target:e.id,path:u,message:`Installed DunSocial skill for ${e.label}. Restart or open a new session if needed.`,...r}}async function Ke(e,n,u,r){switch(n){case"path":{$({path:x()},e);return}case"list":{$({targets:dn(),hint:"Install with: dun skill install <target|all>"},e);return}case"install":{let w=(r[0]||"").toLowerCase();if(!w)throw new t(pe,y.USAGE);let d=await rn();if(w==="all"){let o=[];for(let O of F){let N=await ke(O,d);o.push({target:N.target,path:N.path})}$({target:"all",count:o.length,installed:o,message:`Installed DunSocial skill for ${o.length} agents.`},e);return}let m=l.get(w);if(!m)throw new t(`Unknown agent "${w}". ${pe}
145
+ Try: dun skill list`,y.USAGE);let i=await ke(m,d);$(i,e);return}default:throw new t(`Unknown skill command "${n??""}". Try: install, list, path`,y.USAGE)}}async function yn(e){let n=re(e),{group:u,action:r,nest:w,flags:d,positionals:m}=n;if(P(d)&&!u)return process.stdout.write(`${M}
146
+ `),K.OK;if(u==="help"||!u&&B(d)){let o=u==="help"?r||m[0]:void 0;return process.stdout.write(o?`${E(o)}
143
147
  `:`${Z}
144
- `),G.OK}if(!u)return process.stdout.write(`${Z}
145
- `),G.OK;if(q(d))return process.stdout.write(`${f(u)}
146
- `),G.OK;let r=await de({apiUrl:Q(d,"api-url","apiUrl"),token:Q(d,"token"),workspace:Q(d,"workspace","w"),json:K(d,"json","j")?!0:void 0,debug:K(d,"debug"),quiet:K(d,"quiet","q"),yes:K(d,"yes","y")});if(h(d))return s({version:M},r),G.OK;try{switch(u){case"auth":await Oe(r,t,d,i);break;case"workspace":case"workspaces":await Ne(r,t,d,i);break;case"account":case"accounts":await Ae(r,t??"list",d,i);break;case"post":case"posts":await Te(r,t,d,i);break;case"draft":case"drafts":await De(r,t,d,i);break;case"media":await Re(r,t,d,i);break;case"memory":{let m=y?[y,t].filter(Boolean):t?[t]:[];await be(r,m,d,i);break}case"skill":case"skills":await je(r,t,d,i);break;case"version":s({version:M},r);break;default:throw new S(`Unknown command "${u}". Run dun --help`,G.USAGE)}return G.OK}catch(m){return ie(m,r)}}var nn=await en(process.argv.slice(2));process.exit(nn);
148
+ `),K.OK}if(!u)return process.stdout.write(`${Z}
149
+ `),K.OK;if(B(d))return process.stdout.write(`${E(u)}
150
+ `),K.OK;let i=await de({apiUrl:Q(d,"api-url","apiUrl"),token:Q(d,"token"),workspace:Q(d,"workspace","w"),json:G(d,"json","j")?!0:void 0,debug:G(d,"debug"),quiet:G(d,"quiet","q"),yes:G(d,"yes","y")});if(P(d))return f({version:M},i),K.OK;try{switch(u){case"auth":await Oe(i,r,d,m);break;case"workspace":case"workspaces":await $e(i,r,d,m);break;case"account":case"accounts":await Ne(i,r??"list",d,m);break;case"post":case"posts":await Ae(i,r,d,m);break;case"draft":case"drafts":await be(i,r,d,m);break;case"media":await Te(i,r,d,m);break;case"memory":{let o=w?[w,r].filter(Boolean):r?[r]:[];await Re(i,o,d,m);break}case"skill":case"skills":await Ke(i,r,d,m);break;case"version":f({version:M},i);break;default:throw new h(`Unknown command "${u}". Run dun --help`,K.USAGE)}return K.OK}catch(o){return me(o,i)}}var wn=await yn(process.argv.slice(2));process.exit(wn);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dunsocial",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "DunSocial agent-first CLI — schedule and publish social posts from the terminal, CI, and coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",