@shadowclone/cli 0.0.24 → 0.0.25

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.
@@ -578,7 +578,7 @@ ${p}`:p;return{markdown:f,appliedRuleKeys:r,appliedRuleCount:o.length,appliedRef
578
578
  `).flatMap((n)=>m2({line:n,facts:e.facts})),r=new Map;for(let n of t){let o=n.kind==="forbidden-text"?`${n.kind}:${n.name}`:n.kind,i=r.get(o);if(i?.kind==="file-length"&&n.kind==="file-length")r.set(o,{kind:"file-length",maximumLines:Math.min(i.maximumLines,n.maximumLines)});else if(i===void 0)r.set(o,n)}return[...r.values()]}function bC(e){let t=new Set;if(e.node!==null)for(let r of[".ts",".tsx",".js",".jsx",".mjs",".cjs"])t.add(r);if(e.python!==null)t.add(".py");if(e.rust)t.add(".rs");if(e.go)t.add(".go");return[...t]}var hC,c2,yC,d2,u2,p2;var zg=h(()=>{L();hC=go("kind",[C({kind:Y("file-length"),maximumLines:z().int().min(10).max(1e4)}),C({kind:Y("forbidden-text"),name:m().min(1),text:m().min(1)}),C({kind:Y("no-suppressions")}),C({kind:Y("no-comments"),language:Y("typescript")})]),c2=/\b(?:under|at most|no more than|fewer than|below|maximum of|max(?:imum)?)\s+(\d{2,5})\s+lines\b/i,yC=/\b(?:never|no|don't|do not|avoid|without)\b/i,d2=/\b(?:suppress(?:ion)?s?|eslint-disable|noqa)\b|@ts-(?:ignore|expect-error)|type:\s*ignore/i,u2=/\b(?:zero|no|never (?:write|add))\s+(?:code\s+)?comments\b/i,p2=/\bem[- ]?dash(?:es)?\b/i});var vC;var kC=h(()=>{L();vC=C({name:m().min(1).max(100),kind:O(["test","cli","ui"]),prerequisites:v(m().min(1).max(4096)).max(8).default([]),setup:v(m().min(1).max(4096)).max(8).default([]),run:v(m().min(1).max(4096)).min(1).max(16),evidence:v(m().min(1).max(1024)).max(16).default([]),cleanup:v(m().min(1).max(4096)).max(8).default([])})});import f2 from"path";async function Nt(e){let t=await b(f2.join(e,zs));if(t===null)return null;try{return xC.parse(JSON.parse(t))}catch{throw Error("The committed .shadowclone/harness.json is invalid; restore it from version control before refreshing the harness")}}function PC(e){return`${JSON.stringify(xC.parse(e),null,2).replace(/[^\x20-\x7e\n]/g,(r)=>`\\u${r.charCodeAt(0).toString(16).padStart(4,"0")}`)}
579
579
  `}var zs=".shadowclone/harness.json",xC;var Ni=h(()=>{L();A();zg();kC();xC=C({version:Y(1),gate:C({command:m().min(1),source:m().min(1),ciRunsGate:V()}).nullable(),personal:V(),conventions:v(hC),sourceExtensions:v(m().regex(/^\.[a-z]+$/)),skills:v(m().min(1)),ruleKeys:v(m().min(1)),artifacts:ee(m(),m().regex(/^[a-f0-9]{64}$/)),verification:v(vC).max(32).optional()})});import Gg from"path";function I2(e){return`'${e.replaceAll("'","'\\''")}'`}async function Fi(e){let t=e.paths,r=Gg.join(t.shadowcloneDirectory,"bin","shadowclone"),n=Gg.join(t.shadowcloneDirectory,"bin","shadowclone-owner.json"),o=await b(r),i=await b(n),a=i===null?null:_2.parse(JSON.parse(i));if(o!==null&&a?.fingerprint!==x(o))throw Error("The private hook launcher was edited; preserving it");let s=e.entry??process.argv[1],l=e.executable??process.execPath,d=`exec ${(s&&Gg.isAbsolute(s)&&/\.(?:mjs|js|ts)$/u.test(s)?[l,s]:[l]).map(I2).join(" ")} "$@"
580
580
  `;if(o===d)return;await je({paths:t,root:t.shadowcloneDirectory,kind:"environment",updates:[{filePath:r,previous:o,next:d},{filePath:n,previous:i,next:`${JSON.stringify({fingerprint:x(d)})}
581
- `}]})}var _2;var Ld=h(()=>{L();mt();A();_2=C({fingerprint:m()})});function Rt(e){let t=[e.explicit,e.triggered,e.saved],r=t.find((o)=>o?.engine)?.engine,n=t.find((o)=>o?.model&&(!o.engine||o.engine===r))?.model;return{...r?{engine:r}:{},...n?{model:n}:{}}}import J2 from"path";function m$(e){return e.kind==="skill"?e.body.replace(/^## /gm,"### "):e.body}function Ks(e){return{key:fn(e.id),title:e.title,body:m$(e),section:e.section,scope:"global",originDirectory:null,repositoryName:null,source:"declared",status:"active",proposal:null,appliesWhen:e.appliesWhen,evidence:{for:[],against:[]},observations:0,lastSeen:"declared",sessions:0,origins:[],importReference:null}}async function V2(e){let t=new Map;for(let r of new Set(e.relativePaths)){let n=Bun.file(J2.join(e.paths.profileDirectory,r));if(!await n.exists())continue;for(let o of Zf(await n.text()))t.set(o.key,o)}return t}async function ey(e){let t=new Set(e.selectedGuidance.map((l)=>fn(l.id))),r=new Map(e.library.guidance.map((l)=>[fn(l.id),l])),n=await D(e.paths);if(n){let l=n.records.map(({rule:u})=>u),c=e.selectedGuidance.map((u)=>{let p=Ks(u),f=l.find((y)=>y.key===p.key);return f&&(f.source==="user"||f.body!==p.body)?f:p}),d=l.filter((u)=>{let p=r.get(u.key);return p&&!t.has(u.key)&&u.source==="declared"&&u.body===m$(p)}).map((u)=>({key:u.key,relativePath:Te(u)}));return Ur({paths:e.paths,rules:c,retired:d})}let o=(await hr(e.paths.profileManifestFile)).filter((l)=>l.disposition==="present"&&l.source==="declared"&&r.has(l.key)),i=await V2({paths:e.paths,relativePaths:o.map((l)=>l.relativePath)}),a=e.selectedGuidance.map(Ks),s=[];for(let l of o){if(t.has(l.key))continue;let c=r.get(l.key);if(!c)continue;let d=i.get(l.key);if(!d){a.push(Ks(c));continue}if(d.edited||d.source==="user")continue;s.push({relativePath:l.relativePath,key:l.key})}return Ur({paths:e.paths,rules:a,retired:s})}var ty=h(()=>{he();re()});var Vi;var tu=h(()=>{Vi={name:"@shadowclone/cli",version:"0.0.24",module:"src/cli/index.ts",type:"module",packageManager:"bun@1.4.2",bin:{shadowclone:"bin/shadowclone.mjs"},scripts:{start:"bun run src/cli/index.ts",cli:"bun run src/cli/index.ts",check:"bun run typecheck && bun run lint && bun run knip && bun test",test:"bun test",typecheck:"tsc --noEmit",format:"prettier --write","format:check":"prettier --check",lint:"biome lint --error-on-warnings --diagnostic-level=warn . && bun run scripts/conventions.ts && bun run scripts/privacy.ts && bun run scripts/skills.ts && bun run scripts/skillVersions.ts","lint:fix":"biome lint --write .",knip:"knip",eval:"bun evals/run.ts","eval:work":"bun evals/work/run.ts",build:"bun run scripts/build.ts",prepack:"bun run build"},devDependencies:{"@biomejs/biome":"2.5.15","@types/bun":"latest",knip:"6.39.0",prettier:"3.9.9",typescript:"~5.9"},description:"Turns how you work into a portable, tested environment for the coding agents you already use.",license:"MIT",repository:{type:"git",url:"git+https://github.com/theonly1me/shadowclone.git"},homepage:"https://shadowclone.co",bugs:{url:"https://github.com/theonly1me/shadowclone/issues"},keywords:["claude-code","codex","cursor","agent","subagent","local-first"],files:["bin","dist","preferences","skills","plugins",".claude-plugin","README.md","PRIVACY.md","evals.md","LICENSE"],dependencies:{bun:"^1.4.2",commander:"^15.0.0","smol-toml":"^1.8.0",zod:"^4.5.4"}}});var G_={};lp(G_,{default:()=>_y});var _y;var q_=h(()=>{_y=Cw("{\"index\":\"_.._/web/client/index.html\",\"files\":[{\"input\":\"../web/client/index.html\",\"path\":\"./web/index-xsq72pnc.js\",\"loader\":\"js\",\"isEntry\":true,\"headers\":{\"etag\":\"Xdk3p6IWtcw\",\"content-type\":\"text/javascript;charset=utf-8\"}},{\"input\":\"../web/client/index.html\",\"path\":\"_.._/web/client/index.html\",\"loader\":\"html\",\"isEntry\":true,\"headers\":{\"etag\":\"wveXX5V1r5g\",\"content-type\":\"text/html;charset=utf-8\"}},{\"input\":\"../web/client/index.html\",\"path\":\"./web/index-t330dg8e.css\",\"loader\":\"css\",\"isEntry\":true,\"headers\":{\"etag\":\"-mOD4I1wiO4\",\"content-type\":\"text/css;charset=utf-8\"}},{\"input\":\"../web/client/assets/shadowclone-mark.svg\",\"path\":\"./web/shadowclone-mark-w6a76wqy.svg\",\"loader\":\"file\",\"isEntry\":false,\"headers\":{\"etag\":\"nCbKpyY8994\",\"content-type\":\"image/svg+xml\"}}]}")});function lu(e){let t=e.selected.filter((i)=>i.kind==="preference"),r=t.map((i)=>`## ${i.title}
581
+ `}]})}var _2;var Ld=h(()=>{L();mt();A();_2=C({fingerprint:m()})});function Rt(e){let t=[e.explicit,e.triggered,e.saved],r=t.find((o)=>o?.engine)?.engine,n=t.find((o)=>o?.model&&(!o.engine||o.engine===r))?.model;return{...r?{engine:r}:{},...n?{model:n}:{}}}import J2 from"path";function m$(e){return e.kind==="skill"?e.body.replace(/^## /gm,"### "):e.body}function Ks(e){return{key:fn(e.id),title:e.title,body:m$(e),section:e.section,scope:"global",originDirectory:null,repositoryName:null,source:"declared",status:"active",proposal:null,appliesWhen:e.appliesWhen,evidence:{for:[],against:[]},observations:0,lastSeen:"declared",sessions:0,origins:[],importReference:null}}async function V2(e){let t=new Map;for(let r of new Set(e.relativePaths)){let n=Bun.file(J2.join(e.paths.profileDirectory,r));if(!await n.exists())continue;for(let o of Zf(await n.text()))t.set(o.key,o)}return t}async function ey(e){let t=new Set(e.selectedGuidance.map((l)=>fn(l.id))),r=new Map(e.library.guidance.map((l)=>[fn(l.id),l])),n=await D(e.paths);if(n){let l=n.records.map(({rule:u})=>u),c=e.selectedGuidance.map((u)=>{let p=Ks(u),f=l.find((y)=>y.key===p.key);return f&&(f.source==="user"||f.body!==p.body)?f:p}),d=l.filter((u)=>{let p=r.get(u.key);return p&&!t.has(u.key)&&u.source==="declared"&&u.body===m$(p)}).map((u)=>({key:u.key,relativePath:Te(u)}));return Ur({paths:e.paths,rules:c,retired:d})}let o=(await hr(e.paths.profileManifestFile)).filter((l)=>l.disposition==="present"&&l.source==="declared"&&r.has(l.key)),i=await V2({paths:e.paths,relativePaths:o.map((l)=>l.relativePath)}),a=e.selectedGuidance.map(Ks),s=[];for(let l of o){if(t.has(l.key))continue;let c=r.get(l.key);if(!c)continue;let d=i.get(l.key);if(!d){a.push(Ks(c));continue}if(d.edited||d.source==="user")continue;s.push({relativePath:l.relativePath,key:l.key})}return Ur({paths:e.paths,rules:a,retired:s})}var ty=h(()=>{he();re()});var Vi;var tu=h(()=>{Vi={name:"@shadowclone/cli",version:"0.0.25",module:"src/cli/index.ts",type:"module",packageManager:"bun@1.4.2",bin:{shadowclone:"bin/shadowclone.mjs"},scripts:{start:"bun run src/cli/index.ts",cli:"bun run src/cli/index.ts",check:"bun run typecheck && bun run lint && bun run knip && bun test",test:"bun test",typecheck:"tsc --noEmit",format:"prettier --write","format:check":"prettier --check",lint:"biome lint --error-on-warnings --diagnostic-level=warn . && bun run scripts/conventions.ts && bun run scripts/privacy.ts && bun run scripts/skills.ts && bun run scripts/skillVersions.ts","lint:fix":"biome lint --write .",knip:"knip",eval:"bun evals/run.ts","eval:work":"bun evals/work/run.ts",build:"bun run scripts/build.ts",prepack:"bun run build"},devDependencies:{"@biomejs/biome":"2.5.15","@types/bun":"latest",knip:"6.39.0",prettier:"3.9.9",typescript:"~5.9"},description:"Turns how you work into a portable, tested environment for the coding agents you already use.",license:"MIT",repository:{type:"git",url:"git+https://github.com/theonly1me/shadowclone.git"},homepage:"https://shadowclone.co",bugs:{url:"https://github.com/theonly1me/shadowclone/issues"},keywords:["claude-code","codex","cursor","agent","subagent","local-first"],files:["bin","dist","preferences","skills","plugins",".claude-plugin","README.md","PRIVACY.md","evals.md","LICENSE"],dependencies:{bun:"^1.4.2",commander:"^15.0.0","smol-toml":"^1.8.0",zod:"^4.5.4"}}});var G_={};lp(G_,{default:()=>_y});var _y;var q_=h(()=>{_y=Cw("{\"index\":\"_.._/web/client/index.html\",\"files\":[{\"input\":\"../web/client/index.html\",\"path\":\"./web/index-xsq72pnc.js\",\"loader\":\"js\",\"isEntry\":true,\"headers\":{\"etag\":\"Xdk3p6IWtcw\",\"content-type\":\"text/javascript;charset=utf-8\"}},{\"input\":\"../web/client/index.html\",\"path\":\"_.._/web/client/index.html\",\"loader\":\"html\",\"isEntry\":true,\"headers\":{\"etag\":\"wveXX5V1r5g\",\"content-type\":\"text/html;charset=utf-8\"}},{\"input\":\"../web/client/index.html\",\"path\":\"./web/index-t330dg8e.css\",\"loader\":\"css\",\"isEntry\":true,\"headers\":{\"etag\":\"-mOD4I1wiO4\",\"content-type\":\"text/css;charset=utf-8\"}},{\"input\":\"../web/client/assets/shadowclone-mark.svg\",\"path\":\"./web/shadowclone-mark-w6a76wqy.svg\",\"loader\":\"file\",\"isEntry\":false,\"headers\":{\"etag\":\"nCbKpyY8994\",\"content-type\":\"image/svg+xml\"}}]}")});function lu(e){let t=e.selected.filter((i)=>i.kind==="preference"),r=t.map((i)=>`## ${i.title}
582
582
 
583
583
  ${e.input.edits[i.id]??i.text}`).join(`
584
584
 
@@ -1716,7 +1716,7 @@ ${t.marker.repeat(t.length)}`}function $h(e){let t=Ao(Lo(e.redactedText.replaceA
1716
1716
  `),!0}A();import Qq from"path";N();re();function eH(e){let t=!1,r=null;for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="--apply"&&!t){t=!0;continue}if(o==="--decisions"&&r===null){let i=e[n+1];if(i===void 0)return null;r=Qq.resolve(i),n+=1;continue}return null}return{apply:t,decisionsPath:r}}async function tH(e){if(e===null)return;let t=await b(e);if(t===null)throw Error("Claude memory decisions file was not found");return Uh(t)}function rH(e){let t=Map.groupBy(e.plan.manifest.files,(n)=>n.disposition),r=[`Claude memory migration: ${e.plan.manifest.files.length} file(s).`,...[...t].sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>` ${n}: ${o.length}`),...e.plan.reviewRequired.length===0?[]:["Feedback requiring reviewed dispositions:",...e.plan.reviewRequired.map((n)=>` ${n}`)]];if(e.plan.alreadyApplied)r.push("This source snapshot was already migrated.");else if(e.revisionId!==null)r.push(`Applied revision ${e.revisionId}.`);else r.push("Preview only. Use --decisions <file> --apply after reviewing feedback.");return r.push("Native Claude memory is never changed or removed."),`${r.join(`
1717
1717
  `)}
1718
1718
  `}async function IO(e){if(e.command!=="migrate"||e.arguments[0]!=="claude-memory")return!1;let t=eH(e.arguments.slice(1));if(await D(k))throw Error("Use migrate skills --apply --memory for recurring memory extraction into the learning environment.");if(t===null)throw Error("Use shadowclone migrate claude-memory [--decisions <file>] [--apply]");let r=await Zh({paths:k,cwd:process.cwd(),apply:t.apply,decisions:await tH(t.decisionsPath)});return await Bun.stdout.write(rH(r)),!0}N();function jO(e){let t=!1,r="human";for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="--changed")t=!0;else if(o==="--format"){let i=e[++n];if(i!=="human"&&i!=="json"&&i!=="claude-stop")return null;r=i}else return null}return{changed:t,format:r}}async function LO(e){let t=e.cwd??process.cwd();if(e.format==="claude-stop"){let o=na(e.stdin??await Bun.stdin.text());if(o.stop_hook_active===!0)return 0;t=Zo(o,"cwd")??t}let r=await Zu({cwd:_(t)}),n=Bh({report:await _A({root:r,changed:e.changed}),format:e.format});return await(e.write??nH)({stdout:n.stdout,stderr:n.stderr}),n.exitCode}async function nH(e){if(e.stdout.length>0)await Bun.write(Bun.stdout,e.stdout);if(e.stderr.length>0)await Bun.write(Bun.stderr,`${e.stderr}
1719
- `)}function AO(e){e.lines.push(e.heading);for(let t of e.axes){e.lines.push(` ${t.id}`);for(let r of t.guidance)e.lines.push(` ${r.id}: ${r.title}`)}}function oH(e){let t=e.axes.filter((o)=>o.guidance.every((i)=>i.kind==="preference")),r=e.axes.filter((o)=>o.guidance.every((i)=>i.kind==="skill")),n=[];AO({lines:n,heading:"Profile preference axes",axes:t}),n.push(""),AO({lines:n,heading:"Skill axes",axes:r}),n.push("","Optional skills");for(let o of e.independentSkills)n.push(` ${o.id}: ${o.title}`);return n}async function OO(){let e=await Ge();for(let t of oH(e))console.log(t)}Z();re();er();N();Qe();async function DO(e={}){let t=e.paths??k,r=e.writeLine??console.log;if(!await Bun.file(t.configFile).exists()){r("Shadowclone is not set up. Run shadowclone init to choose what it may read and install guidance.");return}let[{config:n},o,i,a]=await Promise.all([I({configPath:t.configFile,managedConfigPath:t.managedConfigFile}),Ie(t),Et(t),ce(t)]),s=o?.records.filter((c)=>c.rule.status==="active"&&c.rule.proposal===null&&o.dispositions.some((d)=>d.key===c.rule.key&&d.inputFingerprint===pe(c)&&(d.status==="published"||d.status==="covered"))).length??0,l=o===null?0:no({paths:t,state:o}).length;r(`Shadowclone: ${s} active learned rule(s), ${i.rules.length} awaiting review, ${l} awaiting scope or publication, ${a.length} agent installation(s).`),r(i.rules.length>0?"Next: shadowclone learning pending":l>0?"Next: shadowclone learning pending":n.distillation.deep&&s===0?"Next: shadowclone learn --deep":a.length===0?"Next: shadowclone install --agent claude-code|codex --global":"Next: start a new agent session to load active guidance. Run shadowclone learning status for the latest attempt.")}J();N();nt();wu();ku();ca();import ew from"path";async function TO(e){let[t,...r]=e;if(t==="status"&&r.length===0){console.log(JSON.stringify(await vu(k),null,2));return}if(t==="setup"){let n=r.indexOf("--repo"),o=n<0?void 0:r[n+1],i=n<0?r:r.filter((a,s)=>s!==n&&s!==n+1);if(n>=0&&!o?.match(/^[\w.-]+\/[\w.-]+$/)||i.some((a)=>a!=="--no-open"))throw Error("Use shadowclone bot setup [--repo owner/repository] [--no-open].");await Pn({bot:!0,targetRepository:o,open:!r.includes("--no-open")});return}if(t==="export"){let n=[],o=null;for(let c=0;c<r.length;c+=2){let d=r[c],u=r[c+1];if(!u||!["--skill","--output"].includes(d??""))throw Error("Use shadowclone bot export --skill shadowclone-work [--skill name] --output file.");if(d==="--skill")n.push(u);if(d==="--output")o=u}if(!o)throw Error("Choose a private output file outside the repository checkout.");let i=_(process.cwd()),a=_(o),s=ew.relative(i,a);if(!s||!s.startsWith(`..${ew.sep}`)&&!ew.isAbsolute(s))throw Error("The guidance output must stay outside the repository checkout.");let l=await Qi({paths:k,cwd:i,skills:n});await Oe({path:a,content:l.encoded}),console.log(JSON.stringify({output:a,skills:l.skills,bytes:Buffer.byteLength(l.encoded),fingerprint:l.fingerprint},null,2));return}console.log("shadowclone bot setup [--repo owner/repository] [--no-open]"),console.log("shadowclone bot export --skill shadowclone-work [--skill name] --output private-file"),console.log("shadowclone bot status")}Qa();gr();N();import RT from"path";L();xo();J();xr();import dH from"path";L();var tw=["high","medium","low"],iH=["correctness","security","performance","standards","tests"],aH=["investigation","rule","toolchain"],NO=m().regex(/^[a-f0-9]{40}$/),sH=["code","diff","doc","rule","toolchain"],lH=R({source:O(sH),location:m().min(1).max(500),quote:m().min(1).max(300)}),zO=R({path:m().min(1).max(500),line:z().int().positive(),severity:O(tw),category:O(iH),source:O(aH),title:m().min(1).max(100),explanation:m().min(1).max(400),failureScenario:m().min(1).max(300),evidence:v(lH).min(1).max(6),rule:m().max(300).nullable(),suggestion:m().max(300).nullable(),refutation:m().max(400),candidates:v(m().regex(/^[ST]\d{1,4}$/)).max(10)}),rw=R({findings:v(zO).max(20),dropped:v(R({id:m().regex(/^[ST]\d{1,4}$/),reason:m().min(1).max(300)})).max(220)}),wl=R({repository:m().regex(/^[\w.-]+\/[\w.-]+$/),number:z().int().positive(),title:m().max(1000),body:m().max(65536),baseRefName:m().min(1).max(255),baseSha:NO,headSha:NO}),nw=Zm([z().int().positive(),z().int().positive()]),cH=R({stack:m(),tool:m(),status:O(["ran","skipped","failed","timed-out"]),detail:m().max(1000),newDiagnostics:z().int().nonnegative()}),bl=R({version:Y(1),pull:wl,model:m().min(1),findings:v(zO).max(10),commentableLines:ee(m(),v(nw)),skippedPaths:v(m().max(500)),toolchain:v(cH),dropped:v(R({title:m().max(100),path:m().max(500),line:z().int().positive(),reason:m().max(300)})).max(20),candidates:R({dropped:v(R({id:m(),title:m().max(200),path:m().max(500),line:z().int().positive(),reason:m().max(300)})).max(220),undecided:v(R({id:m(),title:m().max(200),path:m().max(500),line:z().int().positive()})).max(220)}),rejections:v(m().max(600)).max(50),statistics:R({modelFindings:z().int().nonnegative(),droppedForEvidence:z().int().nonnegative(),correctionRound:O(["none","ran","failed"]),certainRuleHits:z().int().nonnegative(),signalRuleHits:z().int().nonnegative(),durationMilliseconds:z().int().nonnegative(),costUsd:z().nonnegative().nullable()})});async function ow(){let e=await Bun.file(dH.join(await kr(),"shadowclone-review","SKILL.md")).text(),t=/^---\n[\s\S]*?\n---\n([\s\S]*)$/.exec(e)?.[1];if(t===void 0)throw Error("The bundled shadowclone-review skill is missing its frontmatter");return t.trim()}async function iw(e){let t=await e.reviewModel.runner({prompt:e.prompt,cwd:e.checkout,execution:{purpose:"review",network:e.reviewModel.network},allowedTools:e.reviewModel.network?[...Ya,...hf]:Ya,permissionMode:"dontAsk",model:e.reviewModel.model,reasoningEffort:e.reviewModel.effort,outputSchema:si(rw,{target:"draft-7"})});if(t.isError){let r=B({text:t.errorMessage??"No diagnostic was returned."});throw Error(`The review run failed: ${r.slice(0,600)}`)}return{output:rw.parse(t.structured??JSON.parse(t.text)),costUsd:t.costUsd}}qt();import{mkdtemp as sW,rm as lW}from"fs/promises";import cW from"os";import hT from"path";var FO=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/;function uH(e){let t=e.replace(/\t$/,"");if(!t.startsWith('"')||!t.endsWith('"'))return t;return t.slice(1,-1).replaceAll("\\\"",'"').replaceAll("\\\\","\\")}function MO(e){let t=e.headerLines.find((n)=>n.startsWith(e.marker));if(!t)return null;let r=uH(t.slice(e.marker.length));return r.startsWith(e.prefix)?r.slice(e.prefix.length):null}function pH(e){return/^diff --git (?:"?a\/.*"?) "?b\/(.*?)"?$/.exec(e)?.[1]??e.slice(11)}function mH(e){let t=e.split(`
1719
+ `)}function AO(e){e.lines.push(e.heading);for(let t of e.axes){e.lines.push(` ${t.id}`);for(let r of t.guidance)e.lines.push(` ${r.id}: ${r.title}`)}}function oH(e){let t=e.axes.filter((o)=>o.guidance.every((i)=>i.kind==="preference")),r=e.axes.filter((o)=>o.guidance.every((i)=>i.kind==="skill")),n=[];AO({lines:n,heading:"Profile preference axes",axes:t}),n.push(""),AO({lines:n,heading:"Skill axes",axes:r}),n.push("","Optional skills");for(let o of e.independentSkills)n.push(` ${o.id}: ${o.title}`);return n}async function OO(){let e=await Ge();for(let t of oH(e))console.log(t)}Z();re();er();N();Qe();async function DO(e={}){let t=e.paths??k,r=e.writeLine??console.log;if(!await Bun.file(t.configFile).exists()){r("Shadowclone is not set up. Run shadowclone init to choose what it may read and install guidance.");return}let[{config:n},o,i,a]=await Promise.all([I({configPath:t.configFile,managedConfigPath:t.managedConfigFile}),Ie(t),Et(t),ce(t)]),s=o?.records.filter((c)=>c.rule.status==="active"&&c.rule.proposal===null&&o.dispositions.some((d)=>d.key===c.rule.key&&d.inputFingerprint===pe(c)&&(d.status==="published"||d.status==="covered"))).length??0,l=o===null?0:no({paths:t,state:o}).length;r(`Shadowclone: ${s} active learned rule(s), ${i.rules.length} awaiting review, ${l} awaiting scope or publication, ${a.length} agent installation(s).`),r(i.rules.length>0?"Next: shadowclone learning pending":l>0?"Next: shadowclone learning pending":n.distillation.deep&&s===0?"Next: shadowclone learn --deep":a.length===0?"Next: shadowclone install --agent claude-code|codex --global":"Next: start a new agent session to load active guidance. Run shadowclone learning status for the latest attempt.")}J();N();nt();wu();ku();ca();import ew from"path";async function TO(e){let[t,...r]=e;if(t==="status"&&r.length===0){console.log(JSON.stringify(await vu(k),null,2));return}if(t==="setup"){let n=r.indexOf("--repo"),o=n<0?void 0:r[n+1],i=n<0?r:r.filter((a,s)=>s!==n&&s!==n+1);if(n>=0&&!o?.match(/^[\w.-]+\/[\w.-]+$/)||i.some((a)=>a!=="--no-open"))throw Error("Use shadowclone bot setup [--repo owner/repository] [--no-open].");await Pn({bot:!0,targetRepository:o,open:!r.includes("--no-open")});return}if(t==="export"){let n=[],o=null;for(let c=0;c<r.length;c+=2){let d=r[c],u=r[c+1];if(!u||!["--skill","--output"].includes(d??""))throw Error("Use shadowclone bot export --skill shadowclone-work [--skill name] --output file.");if(d==="--skill")n.push(u);if(d==="--output")o=u}if(!o)throw Error("Choose a private output file outside the repository checkout.");let i=_(process.cwd()),a=_(o),s=ew.relative(i,a);if(!s||!s.startsWith(`..${ew.sep}`)&&!ew.isAbsolute(s))throw Error("The guidance output must stay outside the repository checkout.");let l=await Qi({paths:k,cwd:i,skills:n});await Oe({path:a,content:l.encoded}),console.log(JSON.stringify({output:a,skills:l.skills,bytes:Buffer.byteLength(l.encoded),fingerprint:l.fingerprint},null,2));return}console.log("shadowclone bot setup [--repo owner/repository] [--no-open]"),console.log("shadowclone bot export --skill shadowclone-work [--skill name] --output private-file"),console.log("shadowclone bot status")}Qa();gr();N();import RT from"path";L();xo();J();xr();import dH from"path";L();var tw=["high","medium","low"],iH=["correctness","security","performance","standards","tests"],aH=["investigation","rule","toolchain"],NO=m().regex(/^[a-f0-9]{40}$/),sH=["code","diff","doc","rule","toolchain"],lH=R({source:O(sH),location:m().min(1).max(500),quote:m().min(1).max(300)}),zO=R({path:m().min(1).max(500),line:z().int().positive(),severity:O(tw),category:O(iH),source:O(aH),title:m().min(1).max(100),explanation:m().min(1).max(400),failureScenario:m().min(1).max(300),evidence:v(lH).min(1).max(6),rule:m().max(300).nullable(),suggestion:m().max(300).nullable(),refutation:m().max(400),candidates:v(m().regex(/^[ST]\d{1,4}$/)).max(10)}),rw=R({findings:v(zO).max(20),dropped:v(R({id:m().regex(/^[ST]\d{1,4}$/),reason:m().min(1).max(300)})).max(220)}),wl=R({repository:m().regex(/^[\w.-]+\/[\w.-]+$/),number:z().int().positive(),title:m().max(1000),body:m().max(65536),baseRefName:m().min(1).max(255),baseSha:NO,headSha:NO}),nw=Zm([z().int().positive(),z().int().positive()]),cH=R({stack:m(),tool:m(),status:O(["ran","skipped","failed","timed-out"]),detail:m().max(1000),newDiagnostics:z().int().nonnegative()}),bl=R({version:Y(1),pull:wl,model:m().min(1),findings:v(zO).max(10),commentableLines:ee(m(),v(nw)),skippedPaths:v(m().max(500)),toolchain:v(cH),dropped:v(R({title:m().max(100),path:m().max(500),line:z().int().positive(),reason:m().max(300)})).max(20),candidates:R({dropped:v(R({id:m(),title:m().max(200),path:m().max(500),line:z().int().positive(),reason:m().max(300)})).max(220),undecided:v(R({id:m(),title:m().max(200),path:m().max(500),line:z().int().positive()})).max(220)}),rejections:v(m().max(600)).max(50),statistics:R({modelFindings:z().int().nonnegative(),droppedForEvidence:z().int().nonnegative(),correctionRound:O(["none","ran","failed"]),certainRuleHits:z().int().nonnegative(),signalRuleHits:z().int().nonnegative(),durationMilliseconds:z().int().nonnegative(),costUsd:z().nonnegative().nullable()})});async function ow(){let e=await Bun.file(dH.join(await kr(),"shadowclone-review","SKILL.md")).text(),t=/^---\n[\s\S]*?\n---\n([\s\S]*)$/.exec(e)?.[1];if(t===void 0)throw Error("The bundled shadowclone-review skill is missing its frontmatter");return t.trim()}async function iw(e){let t=await e.reviewModel.runner({prompt:e.prompt,cwd:e.checkout,execution:{purpose:"review",network:e.reviewModel.network},allowedTools:e.reviewModel.network?[...Ya,...hf]:Ya,permissionMode:"dontAsk",model:e.reviewModel.model,...e.reviewModel.effort===null?{}:{reasoningEffort:e.reviewModel.effort},outputSchema:si(rw,{target:"draft-7"})});if(t.isError){let r=B({text:t.errorMessage??"No diagnostic was returned."});throw Error(`The review run failed: ${r.slice(0,600)}`)}return{output:rw.parse(t.structured??JSON.parse(t.text)),costUsd:t.costUsd}}qt();import{mkdtemp as sW,rm as lW}from"fs/promises";import cW from"os";import hT from"path";var FO=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/;function uH(e){let t=e.replace(/\t$/,"");if(!t.startsWith('"')||!t.endsWith('"'))return t;return t.slice(1,-1).replaceAll("\\\"",'"').replaceAll("\\\\","\\")}function MO(e){let t=e.headerLines.find((n)=>n.startsWith(e.marker));if(!t)return null;let r=uH(t.slice(e.marker.length));return r.startsWith(e.prefix)?r.slice(e.prefix.length):null}function pH(e){return/^diff --git (?:"?a\/.*"?) "?b\/(.*?)"?$/.exec(e)?.[1]??e.slice(11)}function mH(e){let t=e.split(`
1720
1720
  `),r=t.findIndex((p)=>FO.test(p)),n=r<0?t:t.slice(0,r),[o=""]=n,i=n.includes("+++ /dev/null"),a=[],s=[],l=0,c=0;for(let p of r<0?[]:t.slice(r)){let f=FO.exec(p);if(f){let y=Number(f[1]),g=f[2]===void 0?1:Number(f[2]);if(g>0)a.push([y,y+g-1]);c=y;continue}if(p.startsWith("+"))s.push({line:c,text:p.slice(1)}),l+=1,c+=1;else if(p.startsWith("-"))l+=1;else if(p.startsWith(" "))c+=1}let d=MO({headerLines:n,marker:"+++ ",prefix:"b/"}),u=MO({headerLines:n,marker:"--- ",prefix:"a/"});return{path:(i?u:d)??pH(o),deleted:i,text:e,changedLines:l,ranges:a,added:s}}function BO(e){return e.split(/^(?=diff --git )/m).filter((t)=>t.startsWith("diff --git ")).map(mH)}gr();async function ht(e){let t=await He({arguments:["git","-c","core.quotePath=false",...e.arguments],cwd:e.checkout});if(t.exitCode!==0){let[r]=e.arguments;throw Error(`git ${r??""} failed: ${t.stderr.trim().slice(0,300)}`)}return t.stdout}J();var fH=15;async function UO(e){let t=[];for(let r of e.paths.slice(0,fH)){let n=await ht({checkout:e.checkout,arguments:["log","-n","3","--no-merges","--date=short","--format=%h %ad %s",e.baseSha,"--",r]});if(n.trim().length>0)t.push(`${r}
1721
1721
  ${n.trim()}`)}return B({text:t.join(`
1722
1722
 
@@ -1803,7 +1803,7 @@ ${_l({finding:p,target:n,refutation:!0})}`),a=e.dropped.length>0?["## Left out",
1803
1803
 
1804
1804
  ${_l({finding:i,target:n,refutation:!1})}`);return{commit_id:e.pull.headSha,event:"COMMENT",body:[bW({result:e,inlineCount:t.length}),...o,Pw].join(`
1805
1805
 
1806
- `),comments:t.map((i)=>({path:i.path,line:i.line,side:"RIGHT",body:_l({finding:i,target:n,refutation:!1})}))}}var vW=R({html_url:fo()});async function Sw(e){let{pull:t}=e.result,r=await Ce({arguments:["gh","api","--method","POST",`repos/${t.repository}/pulls/${t.number}/reviews`,"--input","-"],cwd:e.cwd,environment:zf({remote:!0}),input:JSON.stringify(op(e.result)),timeoutMilliseconds:60000});if(r.exitCode!==0)throw Error(`GitHub refused the review: ${r.stderr.trim().slice(0,300)}`);return vW.parse(JSON.parse(r.stdout)).html_url}nt();Mc();var Rw="claude-opus-5-5",ip="Use shadowclone review <pr-number> [--cloud] [--no-checks] [--offline] [--repo owner/repository] [--output file.md] [--model id] [--effort level].",kW=["--repo","--output","--model","--effort"],xW=["--cloud","--no-checks","--offline"];function PW(e){return Ro.some((t)=>t===e)}function bT(e){let t=new Map,r=new Set,n=[];for(let c=0;c<e.length;c+=1){let d=e[c]??"";if(xW.some((u)=>u===d)){r.add(d);continue}if(kW.some((u)=>u===d)){let u=e[c+1];if(u===void 0||t.has(d))throw Error(ip);t.set(d,u),c+=1;continue}if(d.startsWith("-"))throw Error(ip);n.push(d)}let[o,...i]=n,a=Number(o),s=t.get("--repo")??null,l=t.get("--effort")??"high";if(i.length>0||!Number.isInteger(a)||a<=0)throw Error(ip);if(s!==null&&!/^[\w.-]+\/[\w.-]+$/.test(s))throw Error(ip);if(!PW(l))throw Error(`Choose an effort from ${Ro.join(", ")}.`);return{number:a,repository:s,runChecks:!r.has("--no-checks"),network:!r.has("--offline"),cloud:r.has("--cloud"),output:t.get("--output")??null,model:t.get("--model")??Rw,effort:l}}L();ea();var SW=R({content:m(),encoding:Y("base64")}),RW=R({default_branch:m().min(1)});async function vT(e){let t=await fetch(`https://api.github.com${e.route}`,{headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:`Bearer ${e.token}`},signal:AbortSignal.timeout(30000)});if(t.status===404)return null;if(!t.ok)throw Error(`GitHub rejected the request (${t.status}). Check gh auth status and repository access.`);return t.json()}async function EW(e){let t=await vT({route:`/repos/${e.repository}/contents/${e.filePath}?ref=${encodeURIComponent(e.reference)}`,token:e.token});return t===null?null:Buffer.from(SW.parse(t).content,"base64").toString("utf8")}function CW(e){let t=/const config = (\{[\s\S]*?\n\s*\});/.exec(e)?.[1];if(t===void 0)throw Error("The clone relay workflow has no configuration block.");return eo.parse(JSON.parse(t))}async function kT(e){let t=RW.parse(await vT({route:`/repos/${e.repository}`,token:e.token})),r=(i)=>EW({repository:e.repository,reference:t.default_branch,filePath:i,token:e.token}),n=await r(".github/workflows/shadowclone-relay.yml");if(n===null)return null;let o=await r(".github/workflows/shadowclone.yml");return{clone:CW(n),hasReview:o?.includes("review-analyze:")??!1}}ih();ah();async function xT(e){let{clone:t,token:r,api:n}=e,o=await Ru({clone:t,token:r,api:n});if(o.tree.truncated)throw Error("The default branch tree is incomplete. Update the clone workflows by hand.");let i=`## What changed
1806
+ `),comments:t.map((i)=>({path:i.path,line:i.line,side:"RIGHT",body:_l({finding:i,target:n,refutation:!1})}))}}var vW=R({html_url:fo()});async function Sw(e){let{pull:t}=e.result,r=await Ce({arguments:["gh","api","--method","POST",`repos/${t.repository}/pulls/${t.number}/reviews`,"--input","-"],cwd:e.cwd,environment:zf({remote:!0}),input:JSON.stringify(op(e.result)),timeoutMilliseconds:60000});if(r.exitCode!==0)throw Error(`GitHub refused the review: ${r.stderr.trim().slice(0,300)}`);return vW.parse(JSON.parse(r.stdout)).html_url}nt();Mc();var Rw="claude-opus-5-5",ip="Use shadowclone review <pr-number> [--cloud] [--no-checks] [--offline] [--repo owner/repository] [--output file.md] [--model id] [--effort level].",kW=["--repo","--output","--model","--effort"],xW=["--cloud","--no-checks","--offline"];function PW(e){return Ro.some((t)=>t===e)}function bT(e){let t=new Map,r=new Set,n=[];for(let c=0;c<e.length;c+=1){let d=e[c]??"";if(xW.some((u)=>u===d)){r.add(d);continue}if(kW.some((u)=>u===d)){let u=e[c+1];if(u===void 0||t.has(d))throw Error(ip);t.set(d,u),c+=1;continue}if(d.startsWith("-"))throw Error(ip);n.push(d)}let[o,...i]=n,a=Number(o),s=t.get("--repo")??null,l=t.get("--effort")??null;if(i.length>0||!Number.isInteger(a)||a<=0)throw Error(ip);if(s!==null&&!/^[\w.-]+\/[\w.-]+$/.test(s))throw Error(ip);if(l!==null&&!PW(l))throw Error(`Choose an effort from ${Ro.join(", ")}.`);return{number:a,repository:s,runChecks:!r.has("--no-checks"),network:!r.has("--offline"),cloud:r.has("--cloud"),output:t.get("--output")??null,model:t.get("--model")??Rw,effort:l}}L();ea();var SW=R({content:m(),encoding:Y("base64")}),RW=R({default_branch:m().min(1)});async function vT(e){let t=await fetch(`https://api.github.com${e.route}`,{headers:{Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",Authorization:`Bearer ${e.token}`},signal:AbortSignal.timeout(30000)});if(t.status===404)return null;if(!t.ok)throw Error(`GitHub rejected the request (${t.status}). Check gh auth status and repository access.`);return t.json()}async function EW(e){let t=await vT({route:`/repos/${e.repository}/contents/${e.filePath}?ref=${encodeURIComponent(e.reference)}`,token:e.token});return t===null?null:Buffer.from(SW.parse(t).content,"base64").toString("utf8")}function CW(e){let t=/const config = (\{[\s\S]*?\n\s*\});/.exec(e)?.[1];if(t===void 0)throw Error("The clone relay workflow has no configuration block.");return eo.parse(JSON.parse(t))}async function kT(e){let t=RW.parse(await vT({route:`/repos/${e.repository}`,token:e.token})),r=(i)=>EW({repository:e.repository,reference:t.default_branch,filePath:i,token:e.token}),n=await r(".github/workflows/shadowclone-relay.yml");if(n===null)return null;let o=await r(".github/workflows/shadowclone.yml");return{clone:CW(n),hasReview:o?.includes("review-analyze:")??!1}}ih();ah();async function xT(e){let{clone:t,token:r,api:n}=e,o=await Ru({clone:t,token:r,api:n});if(o.tree.truncated)throw Error("The default branch tree is incomplete. Update the clone workflows by hand.");let i=`## What changed
1807
1807
 
1808
1808
  - [x] Render the clone workflows with Shadowclone ${oh.shadowclone}.
1809
1809
  - [x] Add pull request reviews. A requester asks with \`@shadowclone review\` on a pull request, and a requester's pull request gets one when it opens or becomes ready for review.
@@ -1826,5 +1826,5 @@ The toolchain job runs the pull request's code without secrets. The review job h
1826
1826
  ${sp}`);t.set(n,o)}return t}function Rr(e){let t=e.flags.get(e.name);if(t===void 0)throw Error(`Use:
1827
1827
  ${sp}`);return t}function jW(e){return Ro.some((t)=>t===e)}async function Ew(e){await Bun.write(Rn.resolve(e.file),JSON.stringify(e.value))}var ST={prepare:async(e)=>{let t=ap({arguments:e,allowed:["--repo","--pr","--checkout","--output","--head","--network"]}),r=Number(Rr({flags:t,name:"--pr"})),n=t.get("--head"),o=t.get("--network")??"on";if(!Number.isInteger(r)||r<=0||n!==void 0&&!/^[a-f0-9]{40}$/.test(n)||o!=="on"&&o!=="off")throw Error(`Use:
1828
1828
  ${sp}`);let i=await rp({repository:Rr({flags:t,name:"--repo"}),number:r,checkout:Rn.resolve(Rr({flags:t,name:"--checkout"})),cwd:process.cwd(),network:o==="on",...n===void 0?{}:{head:n}});await Ew({file:Rr({flags:t,name:"--output"}),value:i}),console.log(`Prepared ${i.context.files.length} changed files and ${i.ruleHits.length} rule hits.`)},checks:async(e)=>{let t=ap({arguments:e,allowed:["--packet","--checkout","--output"]}),r=tp.parse(await Bun.file(Rn.resolve(Rr({flags:t,name:"--packet"}))).json()),n=await $W(Rn.join(IW.tmpdir(),"shadowclone-checks-"));try{let o=await np({packet:r,repository:Rn.resolve(Rr({flags:t,name:"--checkout"})),workDirectory:n,onProgress:(i)=>console.error(i)});await Ew({file:Rr({flags:t,name:"--output"}),value:o}),console.log(o.reports.map((i)=>`${i.stack} ${i.tool}: ${i.status}, ${i.diagnostics.length} new`).join(`
1829
- `)||"No toolchain applies.")}finally{await _W(n,{recursive:!0,force:!0})}},analyze:async(e)=>{let t=ap({arguments:e,allowed:["--packet","--checks","--checkout","--output","--model","--effort","--network"]}),r=t.get("--effort")??"high",n=t.get("--checks"),o=t.get("--network")??"on";if(!jW(r))throw Error(`Choose an effort from ${Ro.join(", ")}.`);if(o!=="on"&&o!=="off")throw Error(`Use:
1829
+ `)||"No toolchain applies.")}finally{await _W(n,{recursive:!0,force:!0})}},analyze:async(e)=>{let t=ap({arguments:e,allowed:["--packet","--checks","--checkout","--output","--model","--effort","--network"]}),r=t.get("--effort")??null,n=t.get("--checks"),o=t.get("--network")??"on";if(r!==null&&!jW(r))throw Error(`Choose an effort from ${Ro.join(", ")}.`);if(o!=="on"&&o!=="off")throw Error(`Use:
1830
1830
  ${sp}`);let i=await Cl({packet:tp.parse(await Bun.file(Rn.resolve(Rr({flags:t,name:"--packet"}))).json()),checks:n===void 0?null:bw.parse(await Bun.file(Rn.resolve(n)).json()),checkout:Rn.resolve(Rr({flags:t,name:"--checkout"})),reviewModel:{runner:Po,model:t.get("--model")??Rw,effort:r,network:o==="on"}});await Ew({file:Rr({flags:t,name:"--output"}),value:i}),console.log(JSON.stringify({findings:i.findings.length,...i.statistics}))},publish:async(e)=>{let t=ap({arguments:e,allowed:["--input"]}),r=bl.parse(await Bun.file(Rn.resolve(Rr({flags:t,name:"--input"}))).json());console.log(await Sw({result:r,cwd:process.cwd()}))}};async function ET(e){let t=await He({arguments:e.arguments,cwd:e.cwd});if(t.exitCode!==0)throw Error(`${e.failure}: ${t.stderr.trim().slice(0,300)}`);return t.stdout.trim()}async function CT(e){let[t="",...r]=e,n=ST[t];if(n!==void 0){await n(r);return}let o=bT(e),i=process.cwd(),a=await ET({arguments:["git","rev-parse","--show-toplevel"],cwd:i,failure:"Run shadowclone review inside a Git repository"}),s=o.repository??await ET({arguments:["gh","repo","view","--json","nameWithOwner","--jq",".nameWithOwner"],cwd:a,failure:"gh could not find the GitHub repository for this checkout"});if(o.cloud){await PT({repository:s,number:o.number});return}let l=await vw({repository:s,number:o.number,checkout:a,reviewModel:{runner:Po,model:o.model,effort:o.effort,network:o.network},runChecks:o.runChecks,onProgress:(d)=>console.error(d)}),c=RT.resolve(o.output??RT.join(k.shadowcloneDirectory,"reviews",s.replace("/","-"),`pr-${l.pull.number}-${l.pull.headSha.slice(0,7)}.md`));await Oe({path:c,content:xw(l)}),console.log(`${l.findings.length} ${l.findings.length===1?"finding":"findings"}. Review written to ${c}`)}var LW="Usage: shadowclone <init [--advanced]|init --status [--json]|init (--learn|--no-learn) (--skill-maintenance|--no-skill-maintenance) (--background-learning|--no-background-learning)|init --repo [--personal|--no-personal] [--skill <name>] [--no-enforce]|check [--changed] [--format human|json|claude-stop]|import|wizard|skills|learn [--deep] [--dry-run] [--apply] [--engine <id>] [--model <id>] [--reasoning-effort <level>] [--max-calls <n>]|doctor|profile repair [--decisions <file>] [--apply]|migrate skills [--apply] [--automatic] [--memory] [--activate-only] [--repo <path>]|migrate claude-memory [--decisions <file>] [--apply]|install [--agent claude-code|codex|cursor|antigravity|pi|all] [--global|--local] [--subagent] [--auto-delegate]|uninstall [--agent <agent>] [--global|--local]|context [--explain [--json]]|recall <query> [--limit 1..10]|sync|mcp|forget --all>";function $T(){console.log(LW),console.log("Skill tree: wizard [--repo] [--no-open]; terminal setup: wizard --cli"),console.log("Preferences: remember [--repo|--global] <text>, history [revision-id], undo <revision-id>, learning enable|disable|status|list|pending|show <key>|apply <key>|reject <key>|repositories|bind <id>"),console.log("Review: learning retire|narrow <key>, learning replace <key> <guidance>, learning remove-source <source> [--apply --expected <fingerprint>]"),console.log("Behavior: learning probe <key> --agent claude-code|codex --task <synthetic task> --expect <exact response> [--model <model>] --yes; learning probe status; learning acknowledge <key>"),console.log("GitHub clone: bot setup [--repo owner/repository] [--no-open]; bot export; bot status"),console.log("Pull request review: review <pr-number> [--cloud] [--no-checks] [--repo owner/repository] [--output file.md] [--model <id>] [--effort <level>]; workflow stages: review prepare|checks|analyze|publish"),console.log("Skill maintenance: skills configure [--repo|--global], skills list|update|pending, skills show|apply|reject <id>, skills manage <skill-id>, skills disable")}function AW(){console.log(Vi.version)}async function OW(e){let[t,...r]=e;if(t===void 0){await DO();return}if(t==="--help"||t==="-h"||t==="help"){$T();return}if(t==="--version"||t==="-v"){AW();return}if(await Wu({command:t,arguments:r}))return;if(t==="check"){let n=jO(r);if(n===null)throw Error("Use check [--changed] [--format human|json|claude-stop]");process.exitCode=await LO(n);return}if(t==="import"&&r.length===0){await KA();return}if(t==="skills"&&r.length===0){await OO();return}if(t==="skills"&&await Ju(r))return;if(await vO({command:t,arguments:r}))return;if(t==="learn"){let n=EO(r);if(n){await RO({...n,workingDirectory:process.cwd()});return}}if(t==="doctor"&&r.length===0){await Gj();return}if(await _O({command:t,arguments:r}))return;if(await F_({command:t,arguments:r})||await IO({command:t,arguments:r}))return;if(t==="recall"){let n=CO(r);if(n!==null){await $O(n);return}}if(await GA({command:t,arguments:r}))return;if(t==="mcp"){await ch();return}if(t==="bot"){await TO(r);return}if(t==="review"){await CT(r);return}if(t==="hook"&&r[0]==="session-end"){await mh({input:await Bun.stdin.text()});return}if(t==="hook"&&r[0]==="session-start"){await uh({input:await Bun.stdin.text()});return}if(t==="forget"&&r[0]==="--all"){await Kj();return}if($T(),t!==void 0)process.exitCode=1}await OW(Bun.argv.slice(2)).catch((e)=>{let t=e instanceof Error?e.message:"Shadowclone could not complete this command";console.error(t.length<=1000?B({text:t}):"Shadowclone could not complete this command. Run shadowclone doctor and inspect learning status."),process.exitCode=1});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shadowclone/cli",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "module": "src/cli/index.ts",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.4.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadowclone",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "Set up and maintain portable coding-agent skills with explicit local consent.",
5
5
  "author": {
6
6
  "name": "Shadowclone"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadowclone",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "Set up and maintain portable coding-agent skills with explicit local consent.",
5
5
  "author": {
6
6
  "name": "Shadowclone",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "shadowclone",
4
- "version": "0.0.24",
4
+ "version": "0.0.25",
5
5
  "description": "Set up and maintain portable coding-agent skills with explicit local consent.",
6
6
  "author": {
7
7
  "name": "Shadowclone",