@kaisers-io/refs 0.7.0 → 0.8.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.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/bin/refs.mjs +6 -4
- package/dist/refs.mjs +3 -3
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] - 2026-08-04
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Lowered the supported Node.js floor from `>=24.12` to `>=24.2`. The real requirement was
|
|
15
|
+
always `import.meta.main` (used by the CLI's entry-point check), which Node added in 24.2.0 —
|
|
16
|
+
the higher number had no other reason behind it. Users on Node 24.2 through 24.11 were
|
|
17
|
+
previously blocked for no reason and can now run `refs` as-is.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- The agent skill's citation contract now binds every source reference, not only
|
|
22
|
+
worker-relayed ones. An inline investigation (no worker dispatched, per the step 3
|
|
23
|
+
dosing rule) previously fell outside the contract and could emit bare absolute paths
|
|
24
|
+
instead of clickable relative-text links.
|
|
25
|
+
|
|
26
|
+
### Removed
|
|
27
|
+
|
|
28
|
+
- The Claude Code and Codex plugin packaging (`.claude-plugin/`, `.codex-plugin/`, and the
|
|
29
|
+
`.agents/plugins/marketplace.json` mirror). Neither manifest carried a payload beyond the
|
|
30
|
+
`refs` skill, so installing one produced a second copy that could drift from the one
|
|
31
|
+
`skills add` installs — observed in practice: two `refs` entries in the Codex skill picker,
|
|
32
|
+
and an icon that reached only one of them. `refs` now ships exactly two ways: the CLI from
|
|
33
|
+
npm (`@kaisers-io/refs`) and the skill from git (`skills add`).
|
|
34
|
+
|
|
35
|
+
If you installed the plugin, uninstall it (Claude Code: `/plugin`; Codex CLI: `/plugins`)
|
|
36
|
+
and install the skill instead — see the install section in the README, which covers the
|
|
37
|
+
repository still being private. The `@refs` plugin-mention gap in Codex (codex-cli 0.146.0,
|
|
38
|
+
[openai/codex#22078](https://github.com/openai/codex/issues/22078)) no longer applies: there
|
|
39
|
+
is no plugin to mention. Invoke the skill with `/refs` in Claude Code or `$refs` in Codex.
|
|
40
|
+
|
|
10
41
|
## [0.7.0] - 2026-08-03
|
|
11
42
|
|
|
12
43
|
### Changed
|
|
@@ -313,6 +344,7 @@ trusted-publishing pipeline end to end.
|
|
|
313
344
|
- Agent skill (`skills/refs/`) documenting the investigate/add/maintain workflows.
|
|
314
345
|
|
|
315
346
|
[Unreleased]: https://github.com/kaisers-io/refs/compare/v0.7.0...HEAD
|
|
347
|
+
[0.8.0]: https://github.com/kaisers-io/refs/compare/v0.7.0...v0.8.0
|
|
316
348
|
[0.7.0]: https://github.com/kaisers-io/refs/compare/v0.6.1...v0.7.0
|
|
317
349
|
[0.6.1]: https://github.com/kaisers-io/refs/compare/v0.6.0...v0.6.1
|
|
318
350
|
[0.6.0]: https://github.com/kaisers-io/refs/compare/v0.5.1...v0.6.0
|
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ through anyway — but this is discipline enforced by convention and tooling, no
|
|
|
22
22
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
25
|
-
Requirements: Node.js `>=24.
|
|
25
|
+
Requirements: Node.js `>=24.2` and git. macOS, Linux, and Windows are fully supported —
|
|
26
26
|
every command, locking, sync, and the read-only guards behave the same on all three (on
|
|
27
27
|
Windows, use [Git for Windows](https://gitforwindows.org/)).
|
|
28
28
|
|
package/bin/refs.mjs
CHANGED
|
@@ -7,8 +7,12 @@ import { existsSync } from 'node:fs';
|
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { pathToFileURL } from 'node:url';
|
|
9
9
|
|
|
10
|
+
// The floor is `import.meta.main`, which Node added in 24.2.0. `src/index.ts` uses it as its
|
|
11
|
+
// entry-point check; on an older Node the expression is `undefined` (falsy), so the CLI never
|
|
12
|
+
// runs and the process exits 0 with no output at all — silently, not with an error. That silent
|
|
13
|
+
// no-op is exactly what this check exists to turn into an actionable message.
|
|
10
14
|
const REQUIRED_NODE_MAJOR = 24;
|
|
11
|
-
const REQUIRED_NODE_MINOR_MIN =
|
|
15
|
+
const REQUIRED_NODE_MINOR_MIN = 2;
|
|
12
16
|
const EXIT_FAILURE = 1;
|
|
13
17
|
const FALLBACK_VERSION_PART = 0;
|
|
14
18
|
|
|
@@ -29,9 +33,7 @@ if (
|
|
|
29
33
|
major < REQUIRED_NODE_MAJOR ||
|
|
30
34
|
(major === REQUIRED_NODE_MAJOR && minor < REQUIRED_NODE_MINOR_MIN)
|
|
31
35
|
) {
|
|
32
|
-
console.error(
|
|
33
|
-
`refs requires Node.js >=24.12 — you are running Node.js ${process.versions.node}.`,
|
|
34
|
-
);
|
|
36
|
+
console.error(`refs requires Node.js >=24.2 — you are running Node.js ${process.versions.node}.`);
|
|
35
37
|
console.error('Install a matching version, e.g.: nvm install 24');
|
|
36
38
|
process.exit(EXIT_FAILURE);
|
|
37
39
|
}
|
package/dist/refs.mjs
CHANGED
|
@@ -187,7 +187,7 @@ function vs(e,t=0,n=e.length){let r=e.indexOf(`
|
|
|
187
187
|
`)return n;if(r===`\r`&&e[n+1]===`
|
|
188
188
|
`)return n+1;if(r<` `&&r!==` `||r===``)throw new B(`control characters are not allowed in comments`,{toml:e,ptr:t})}return e.length}function bs(e,t,n,r){let i;for(;;){for(;(i=e[t])===` `||i===` `||!n&&(i===`
|
|
189
189
|
`||i===`\r`&&e[t+1]===`
|
|
190
|
-
`);)t++;if(r||i!==`#`)break;t=ys(e,t)}return t}function xs(e,t,n,r,i=!1){if(!r)return t=vs(e,t),t<0?e.length:t;for(let a=t;a<e.length;a++){let t=e[a];if(t===`#`)a=vs(e,a)
|
|
190
|
+
`);)t++;if(r||i!==`#`)break;t=ys(e,t)}return t}function xs(e,t,n,r,i=!1){if(!r)return t=vs(e,t),t<0?e.length:t;for(let a=t;a<e.length;a++){let t=e[a];if(t===`#`){if(a=vs(e,a),a<0)break}else if(t===n)return a+1;else if(t===r||i&&(t===`
|
|
191
191
|
`||t===`\r`&&e[a+1]===`
|
|
192
192
|
`))return a}throw new B(`cannot find end of structure`,{toml:e,ptr:t})}
|
|
193
193
|
/*!
|
|
@@ -347,7 +347,7 @@ sync_ttl = "1h"
|
|
|
347
347
|
`).map(e=>e.trim()).filter(e=>e!==``).slice(0,n),Ac=async(e,t,n)=>(await e.run(`git`,[`show-ref`,`--verify`,`--`,`refs/tags/${n}`],{cwd:t})).exitCode===0,jc=[`#!/bin/sh`,`echo "refs: this checkout is a managed read-only reference — commits are blocked" >&2`,`exit 1`,``].join(`
|
|
348
348
|
`),Mc=async e=>{await Promise.all([`pre-commit`,`pre-push`].map(async n=>{let r=h(e.hooksDir,n);await Bs(r,jc),await t(r,493)}))},Nc=/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?/u,Pc=/\d+\.\d+\.\d+/gu,Fc=e=>ts.safeParse(e).success,Ic=e=>{let t=e.match(Pc);return t!==null&&t.length>1},Lc=e=>{let t=Nc.exec(e);if(!t||Ic(e))return;let[n]=t,r=e.replace(n,`{version}`);if(Fc(r))return r},Rc=(e,t,n)=>{let r=e.get(t);r===void 0?e.set(t,{count:1,index:n}):r.count+=1},zc=e=>{let t=new Map;for(let[n,r]of e.entries()){let e=Lc(r);e&&Rc(t,e,n)}return t},Bc=(e,t)=>e.count>t.count||e.count===t.count&&e.index<t.index,Vc=e=>{let t=[...e.entries()],[n]=t;if(n===void 0)return null;let[r,i]=n;return t.slice(1).reduce(({format:e,data:t},[n,r])=>Bc(r,t)?{data:r,format:n}:{data:t,format:e},{data:i,format:r}).format},Hc=e=>{let t=zc(e);return Vc(t)},Uc=(e,t)=>e.replaceAll(`{version}`,()=>t),Wc=async(e,t,n,r)=>{let i=Uc(n,r);if(!await Ac(e,t,i))throw y(`tag '${i}' not found in ${t} — check the version or tag_format`);return i},Gc=/^(?<scheme>[a-z][a-z0-9+.-]*:\/\/)?[\s\S]*@/iu,q=e=>{let t=e.replace(Gc,`$<scheme><redacted>@`);return t.length<=200?t:`${t.slice(0,200)}…`},Kc=/^git@(?<host>[^:/\s]+):(?<path>[^\s]+)$/u,qc=/^git\+/u,Jc={"https:":`443`,"ssh:":`22`},Yc=e=>e.replace(/\.git$/u,``),Xc=e=>e.split(`/`).some(e=>e===`.`||e===`..`),Zc=e=>e.includes(`\\`),Qc=e=>e.includes(`%`),$c=e=>{let t=z.safeParse(e);if(!t.success)throw x(`not a supported git url: derived key '${q(e)}' is invalid`);return t.data},el=({host:e,port:t,protocol:n})=>{let r=Jc[n];return t===``||t===r?e.toLowerCase():`${e.toLowerCase()}_${t}`},tl=e=>{let t=Yc(e.path.replace(/^\/+/u,``).replace(/\/+$/u,``));return $c(`${el(e)}/${t}`)},nl=e=>{let t=decodeURIComponent(e).split(`/`).filter(e=>e!==``);if(t.length<2)throw x(`not a supported git url: file url path must have at least 2 segments`);let n=t.at(-2)??``,r=t.at(-1)??``;return $c(`local/${n}/${r}`)},rl=(e,t)=>{try{return new URL(e)}catch{throw x(`not a supported git url: ${q(t)}`)}},il=e=>{if(e.password!==``)throw x(`not a supported git url: credentials embedded in url`);if(e.protocol===`https:`&&e.username!==``)throw x(`not a supported git url: credentials embedded in https url`)},al=(e,t)=>{if(e.protocol===`file:`){if(!t)throw x(`not a supported git url: unsupported protocol ${e.protocol}`);return nl(e.pathname)}if(e.protocol!==`https:`&&e.protocol!==`ssh:`)throw x(`not a supported git url: unsupported protocol ${e.protocol}`);return il(e),tl({host:e.hostname,path:e.pathname,port:e.port,protocol:e.protocol})},ol=(e,t)=>{if(Qc(e))throw x(`not a supported git url: percent-encoding not supported in ${q(t)}`);if(e.includes(`:`))throw x(`not a supported git url: ambiguous ':' in scp-style path ${q(t)}; use the ssh:// url form instead`);if(e.startsWith(`/`)||e.startsWith(`~`))throw x(`not a supported git url: ambiguous absolute/home-relative scp path in ${q(t)}; use the ssh:// url form instead`)},sl=(e,t)=>{let n=e.groups?.path??``;return ol(n,t),tl({host:e.groups?.host??``,path:n,port:``,protocol:`ssh:`})},cl=(e,t)=>{if(Zc(e))throw x(`not a supported git url: backslash not allowed in ${q(t)}`)},ll=(e,t)=>{if(Xc(e))throw x(`not a supported git url: path traversal segment in ${q(t)}`)},ul=(e,t,n)=>{if(e.protocol!==`file:`&&Qc(t))throw x(`not a supported git url: percent-encoding not supported in ${q(n)}`)},dl=(e,t)=>{let n=t?.allowFileUrls??!1,r=e.replace(qc,``);cl(r,e),ll(r,e);let i=Kc.exec(r);if(i?.groups!==void 0)return{cloneUrl:r,key:sl(i,e)};let a=rl(r,e);return ul(a,r,e),{cloneUrl:r,key:al(a,n)}},fl=`.git`,pl=e=>e.replace(/^\/+/u,``).replace(/\/+$/u,``),ml=e=>e.endsWith(fl)?e:`${e}${fl}`,hl=(e,t)=>`https://${e.toLowerCase()}/${pl(t)}`,gl=(e,t)=>`git@${e.toLowerCase()}:${ml(pl(t))}`,_l=e=>{if(e===`https:`)return`https`;if(e===`ssh:`)return`ssh`;throw x(`not a supported git url: unsupported protocol ${e}`)},vl=(e,t,n)=>{let r=Jc[e.protocol];if(e.port!==``&&e.port!==r)throw x(`cannot apply git_transport=${t} to ${q(n)}: its non-default port ${e.port} cannot be expressed in the ${t} url form — add the repo with an explicit url instead`)},yl=(e,t)=>t===`https`?hl(e.hostname,e.pathname):gl(e.hostname,e.pathname),bl=(e,t,n)=>{let r=dl(t).key;if(r!==n)throw x(`git_transport transform changed repo identity: '${q(e)}' → '${t}' (key '${n}' → '${r}')`);return t},xl=(e,t)=>{if(t.transport===`ssh`)return t.cloneUrl;let n=e.groups?.host??``,r=e.groups?.path??``;return bl(t.cloneUrl,hl(n,r),t.originalKey)},Sl=e=>{let t=rl(e.cloneUrl,e.cloneUrl);return _l(t.protocol)===e.transport?e.cloneUrl:(vl(t,e.transport,e.cloneUrl),bl(e.cloneUrl,yl(t,e.transport),e.originalKey))},Cl=(e,t)=>{if(e.startsWith(`file:`))return e;let n={cloneUrl:e,originalKey:dl(e).key,transport:t},r=Kc.exec(e);return r?.groups===void 0?Sl(n):xl(r,n)},wl=`meta.json`,Tl=e=>{if(typeof e==`object`&&e&&`code`in e){let{code:t}=e;if(typeof t==`string`)return t}},El=e=>{try{return process.kill(e,0),!0}catch(e){return Tl(e)!==`ESRCH`}},Dl=e=>{try{return JSON.parse(e)}catch{return}},Ol=async e=>{try{return await o(e,`utf8`)}catch{return}},kl=e=>{if(typeof e!=`string`)return;let t=Date.parse(e);if(!Number.isNaN(t))return t},Al=e=>{if(typeof e!=`object`||!e)return;let t=e,{pid:n}=t,r=kl(t.acquired_at);if(typeof n==`number`&&r!==void 0)return{acquiredAtMs:r,pid:n}},jl=async e=>{let t=await Ol(h(e,wl));if(t!==void 0)return Al(Dl(t))},Ml=e=>{if(typeof e!=`object`||!e)return;let{token:t}=e;if(typeof t==`string`)return t},Nl=async e=>{let t=await Ol(h(e,wl));if(t!==void 0)return Ml(Dl(t))},Pl=async e=>{try{return(await f(e)).mtimeMs}catch{return}},Fl=async(e,t)=>{let n=h(e,wl),r=`${n}.tmp-${se()}`;await p(r,t,`utf8`),await l(r,n)},Il=async(e,t)=>{await Fl(e,JSON.stringify({acquired_at:new Date().toISOString(),pid:process.pid,token:t}))},Ll=new Set([`EEXIST`,`EPERM`,`EACCES`,`EBUSY`]),Rl=new Set([`ENOENT`,`EPERM`,`EACCES`,`EBUSY`]),zl=async e=>{try{return await a(e,{recursive:!1}),!0}catch(e){let t=Tl(e);if(t!==void 0&&Ll.has(t))return!1;throw e}},Bl=async(e,t)=>{try{return await l(e,t),!0}catch(e){let t=Tl(e);if(t!==void 0&&Rl.has(t))return!1;throw e}},Vl=/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/u,Hl=async e=>{let t=await jl(e);if(t===void 0){let t=await Pl(e);return t!==void 0&&Date.now()-t>5e3}return Date.now()-t.acquiredAtMs>6e5||!El(t.pid)},Ul=async(e,t)=>{try{await Il(e,t)}catch(e){if(Tl(e)===`ENOENT`)return`retry`;throw e}return t},Wl=async e=>{if(!await zl(e))return;let t=await Ul(e,se());return t===`retry`?Wl(e):t},Gl=e=>h(e.locksDir,`${e.name}.steal-claim`),Kl=e=>h(e.locksDir,`${e.name}.steal.${se()}`),ql=async e=>{let t=await Pl(e);return t!==void 0&&Date.now()-t>2e3},Jl=async e=>await zl(e)?!0:await ql(e)?(await u(e,{force:!0,recursive:!0}),zl(e)):!1,Yl=async e=>{let t=Kl(e);return await Bl(e.lockPath,t)?t:void 0},Xl=async e=>{if(!await Hl(e.lockPath))return;let t=await Yl(e);t!==void 0&&await u(t,{force:!0,recursive:!0})},Zl=async e=>{let t=Gl(e);if(await Jl(t))try{await Xl(e)}finally{await u(t,{force:!0,recursive:!0})}},Ql=async(e,t)=>{if(await Hl(e.lockPath)){await Zl(e);return}if(Date.now()>=t)throw ve(`lock ${e.name} is held — another refs process is running`);await fe(100)},$l=async(e,t)=>{let n=await Wl(e.lockPath);return n===void 0?(await Ql(e,t),$l(e,t)):n},eu=async(e,t)=>{await Nl(e)===t&&await u(e,{force:!0,recursive:!0})},tu=e=>{if(e===`.`||e===`..`||!Vl.test(e))throw x(`lock name must not contain "/" or other unsafe characters — only letters, digits, and "_.-" are allowed, and it may not be "." or "..": ${e}`)},J=async(e,t,n,r)=>{tu(t);let i={lockPath:h(e.locksDir,t),locksDir:e.locksDir,name:t};await a(e.locksDir,{recursive:!0});let o=Date.now()+(r?.timeoutMs??1e4),s=await $l(i,o);try{return await n()}finally{await eu(i.lockPath,s)}},nu=ro({directory:L().optional(),url:L().optional()}),ru=ro({repository:ao([L(),nu]).optional()}),iu=/^(?:@[a-z0-9-~][a-z0-9._~-]*\/)?[a-z0-9-~][a-z0-9._~-]*$/u,au=new Set([`node_modules`,`favicon.ico`]),ou=e=>y(`package '${e}' has no usable repository field — find the repository and run: refs add <git-url>`),su=e=>{let[t,n]=e.split(`/`);return n??t??e},cu=e=>{if(e.length>214)throw b(`invalid package name: '${e}' exceeds maximum length of 214 characters`);if(!iu.test(e))throw b(`invalid package name: '${e}' does not match npm naming rules`);let t=su(e);if(au.has(t))throw b(`invalid package name: '${e}' uses a reserved name`)},lu=e=>e.replace(`/`,`%2F`),uu=e=>typeof e==`string`?e:e?.url,du=e=>{if(typeof e==`object`&&e?.directory){let t=ns.safeParse(e.directory);if(t.success)return t.data}},fu=async(e,t)=>{try{return await e.json()}catch{throw x(`invalid npm registry response for '${t}': not parseable JSON`)}},pu=async(e,t)=>{let n=await e(`https://registry.npmjs.org/${lu(t)}`);if(n.status===404)throw y(`npm package '${t}' not found`);if(n.status!==200)throw x(`failed to fetch npm package '${t}': status ${n.status}`);let r=await fu(n,t),i=ru.safeParse(r);if(!i.success)throw x(`invalid npm package response for '${t}'`);return i.data},mu=(e,t)=>{try{return dl(e)}catch{throw ou(t)}},hu=async(e,t)=>{cu(t);let n=await pu(e,t),r=uu(n.repository);if(r===void 0||r===``)throw ou(t);let{cloneUrl:i,key:a}=mu(r,t),o=du(n.repository);return o===void 0?{cloneUrl:i,key:a}:{cloneUrl:i,directory:o,key:a}},gu=new Set;let _u=!1;const vu=()=>{for(let e of gu)try{e.kill(`SIGKILL`)}catch{}},yu=[`SIGINT`,`SIGTERM`,`SIGHUP`,`SIGBREAK`],bu=e=>{let t=()=>{vu(),process.removeListener(e,t),process.kill(process.pid,e)};process.on(e,t)},xu=()=>{_u||(_u=!0,yu.forEach(e=>{bu(e)}),process.on(`exit`,vu))},Su=()=>{let e=[],t=0,n=!1;return{finish:()=>({text:Buffer.concat(e).toString(`utf8`),truncated:n}),push:r=>{if(n)return;let i=67108864-t;if(r.length<=i){e.push(r),t+=r.length;return}i>0&&e.push(r.subarray(0,i)),n=!0}}},Cu=(e,t)=>[e.replace(/\r?\n$/u,``),t].filter(e=>e!==``).join(`
|
|
349
349
|
`),wu=(e,t,n)=>{let r=e;return t.truncated&&(r=Cu(r,`refs: stdout exceeded 67108864 bytes, truncated`)),n.truncated&&(r=Cu(r,`refs: stderr exceeded 67108864 bytes, truncated`)),r},Tu={clear:()=>{},markedTimedOut:()=>!1},Eu=(e,t)=>{if(t===void 0)return Tu;let n=!1,r,i=setTimeout(()=>{n=!0,e.kill(`SIGTERM`),r=setTimeout(()=>{e.kill(`SIGKILL`)},2e3)},t);return{clear:()=>{clearTimeout(i),r!==void 0&&clearTimeout(r)},markedTimedOut:()=>n}},Du=e=>e===void 0?{}:{cwd:e},Ou=(e,t)=>Cu(e,`refs: command timed out after ${String(t)}ms`),ku=(e,t)=>({exitCode:124,stderr:Ou(e,t),stdout:``,timedOut:!0}),Au=(e,t,n)=>{let r=ge(e,t,{...Du(n?.cwd),stdio:[`ignore`,`pipe`,`pipe`]});gu.add(r);let i=Su(),a=Su();return r.stdout.on(`data`,e=>{i.push(e)}),r.stderr.on(`data`,e=>{a.push(e)}),{child:r,stderrCollector:a,stdoutCollector:i,timeout:Eu(r,n?.timeoutMs)}},ju=(e,t,n)=>{try{return Au(e,t,n)}catch(e){return{exitCode:127,stderr:Nu(e),stdout:``}}},Mu=e=>!(`child`in e),Nu=e=>e instanceof Error?e.message:String(e),Pu=async e=>{try{let[t]=await me(e,`close`);return{code:t}}catch(e){return{code:null,errorMessage:Nu(e)}}},Fu=e=>e===null?1:e,Iu=(e,t)=>t.truncated?{...e,stdoutTruncated:!0}:e,Lu=e=>e.timedOut?ku(e.stderr.text,e.timeoutMs):e.errorMessage===void 0?Iu({exitCode:Fu(e.code),stderr:wu(e.stderr.text,e.stdout,e.stderr),stdout:e.stdout.text},e.stdout):Iu({exitCode:127,stderr:Cu(e.stderr.text,e.errorMessage),stdout:e.stdout.text},e.stdout);var Ru=class{async run(e,t,n){xu();let r=ju(e,t,n);if(Mu(r))return r;let i=await Pu(r.child);return gu.delete(r.child),r.timeout.clear(),Lu({code:i.code,errorMessage:i.errorMessage,stderr:r.stderrCollector.finish(),stdout:r.stdoutCollector.finish(),timedOut:r.timeout.markedTimedOut(),timeoutMs:n?.timeoutMs})}};const zu=os.partial({description:!0}),Bu=no({default_branch:L().min(1),key:z,tag_format_candidate:ts.nullable(),url:L().min(1)});Bu.extend({description:L().default(``),packages:Vo(zu)});const Vu=Bu.extend({description:L().min(1),packages:Vo(os)}),Hu=no({effective_clone_mode:$o.optional(),head_sha:L().regex(/^[0-9a-f]{40}$/u,`head_sha must be a 40-character lowercase hex string`).optional(),last_error:L().optional(),last_fetched_at:ra().optional(),pending_proposal_at:ra().optional()}),Uu=no({refs:zo(e=>e.length>0&&!Ro.has(e),()=>`state ref key must be non-empty and not "__proto__", "constructor", or "prototype"`,lo(L(),Hu)).default({})}),Y=(e,t,n)=>t?.[e]??n[e],Wu=async e=>{try{return await o(e.statePath,`utf8`)}catch(e){if(V(e))return;throw e}},Gu=e=>{try{return JSON.parse(e)}catch{return}},X=async e=>{let t=await Wu(e);if(t===void 0)return Uu.parse({});let n=Gu(t);if(n===void 0)return Uu.parse({});let r=Uu.safeParse(n);return r.success?r.data:Uu.parse({})},Ku=async(e,t)=>{let n=Uu.safeParse(t);if(!n.success)throw x(k(n.error));await Bs(e.statePath,`${JSON.stringify(n.data,void 0,2)}\n`)},qu=/[/\\]/u,Ju={kind:`ignore`},Yu=e=>!ne(e)&&e.split(qu).every(e=>e!==`.`&&e!==`..`),Xu=e=>Yu(e)&&!e.startsWith(`!`)&&!e.includes(`**`)&&(e.match(/\*/gu)??[]).length<=1,Zu=e=>Xu(e)?e.endsWith(`/*`)?{baseDir:e.slice(0,-2),kind:`expand-children`}:e===`*`?{baseDir:`.`,kind:`expand-children`}:e.includes(`*`)?Ju:{dir:e,kind:`probe-dir`}:Ju,Qu=(e,t)=>{if(t&&e===``)return!0;let n=e===`..`||e.startsWith(`..`+oe);return e!==``&&!n&&!ne(e)},$u=(e,t,n)=>t.filter((e,t)=>n[t]===!0).map(t=>re.join(e,t)),ed=(e,t)=>t?.name?{description:t.description,name:t.name,path:e}:void 0,td=e=>{let t=e.map(e=>[e.path,e]),n=[...new Map(t).values()];return n.sort((e,t)=>e.path.localeCompare(t.path)),n},nd=/^\s*-\s+["']?(?<pattern>[^"'#]+)["']?/u,rd=/^packages:\s*(?:#.*)?$/u,id=e=>typeof e==`object`&&!!e&&!Array.isArray(e),ad=e=>{if(Array.isArray(e))return e.filter(e=>typeof e==`string`);if(!id(e))return[];let{packages:t}=e;return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]},od=Symbol(`end-of-section`),sd=e=>{let t=e.trim();if(t&&!t.startsWith(`-`)&&t.includes(`:`)&&!rd.test(e))return od;if(!t.startsWith(`-`))return;let n=nd.exec(e)?.groups?.pattern?.trim();if(n)return n},cd=e=>{let t=[];for(let n of e){let e=sd(n);if(e===od)break;e!==void 0&&t.push(e)}return t},ld=e=>{let t=e.findIndex(e=>rd.test(e));return t===-1?[]:cd(e.slice(t+1))},ud=e=>{let{name:t}=e;if(typeof t==`string`)return t},dd=e=>{let{description:t}=e;if(typeof t==`string`)return t},fd=async(e,t,n=!1)=>{try{return Qu(ie(await c(e),await c(t)),n)}catch{return!1}},pd=async(e,t)=>{try{let n=h(t,`package.json`);return await fd(e,n)?(await o(n,`utf8`),!0):!1}catch{return!1}},md=async(e,t)=>{try{let n=h(e,t);if(!await fd(e,n,t===`.`))return[];let r=(await s(n,{withFileTypes:!0})).filter(e=>e.isDirectory()),i=await Promise.all(r.map(t=>pd(e,h(n,t.name))));return $u(t,r.map(e=>e.name),i)}catch{return[]}},hd=async(e,t)=>{let n=Zu(t);if(n.kind===`expand-children`)return md(e,n.baseDir);if(n.kind===`probe-dir`){let t=h(e,n.dir);if(await fd(e,t)&&await pd(e,t))return[n.dir]}return[]},gd=async(e,t)=>{try{let n=h(t,`package.json`);if(!await fd(e,n))return;let r=await o(n,`utf8`),i=JSON.parse(r);return{description:dd(i),name:ud(i)}}catch{return}},_d=async(e,t)=>{let n=new Set;try{if(!await fd(e,t))return n;let r=await o(t,`utf8`);ad(JSON.parse(r).workspaces).forEach(e=>n.add(e))}catch{}return n},vd=async(e,t)=>{let n=new Set;try{if(!await fd(e,t))return n;ld((await o(t,`utf8`)).split(`
|
|
350
|
-
`)).forEach(e=>n.add(e))}catch{}return n},yd=async(e,t)=>{let n=new Set,r=[...t].map(t=>hd(e,t));return(await Promise.all(r)).forEach(e=>{e.forEach(e=>n.add(e))}),n},bd=async(e,t)=>{let n=h(e,t);if(await fd(e,n))return ed(t,await gd(e,n))},xd=async(e,t)=>{let n=[...t].map(t=>bd(e,t));return(await Promise.all(n)).filter(e=>e!==void 0)},Sd=async e=>{let t=h(e,`package.json`),n=h(e,`pnpm-workspace.yaml`),r=await _d(e,t),i=await vd(e,n),a=new Set([...r,...i]);if(a.size===0)return[];let o=await yd(e,a);return td(await xd(e,o))};var Cd=`0.
|
|
350
|
+
`)).forEach(e=>n.add(e))}catch{}return n},yd=async(e,t)=>{let n=new Set,r=[...t].map(t=>hd(e,t));return(await Promise.all(r)).forEach(e=>{e.forEach(e=>n.add(e))}),n},bd=async(e,t)=>{let n=h(e,t);if(await fd(e,n))return ed(t,await gd(e,n))},xd=async(e,t)=>{let n=[...t].map(t=>bd(e,t));return(await Promise.all(n)).filter(e=>e!==void 0)},Sd=async e=>{let t=h(e,`package.json`),n=h(e,`pnpm-workspace.yaml`),r=await _d(e,t),i=await vd(e,n),a=new Set([...r,...i]);if(a.size===0)return[];let o=await yd(e,a);return td(await xd(e,o))};var Cd=`0.8.0`;const wd=async()=>{let e=[];for await(let t of process.stdin)e.push(Buffer.from(t));return Buffer.concat(e).toString(`utf8`)},Td=()=>({cliVersion:Cd,cwd:process.cwd(),env:process.env,errLine:e=>{process.stderr.write(`${e}\n`)},fetcher:e=>fetch(e),nodeVersion:process.version,out:e=>{process.stdout.write(`${e}\n`)},readStdin:wd,runner:new Ru});var Ed=class extends Error{constructor(e,t,n){super(n),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},Dd=class extends Ed{constructor(e){super(1,`commander.invalidArgument`,e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}},Od=class{constructor(e,t){switch(this.description=t||``,this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case`<`:this.required=!0,this._name=e.slice(1,-1);break;case`[`:this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.endsWith(`...`)&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:(t.push(e),t)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(e,t)=>{if(!this.argChoices.includes(e))throw new Dd(`Allowed choices are ${this.argChoices.join(`, `)}.`);return this.variadic?this._collectValue(e,t):e},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function kd(e){let t=e.name()+(e.variadic===!0?`...`:``);return e.required?`<`+t+`>`:`[`+t+`]`}var Ad=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(e){this.helpWidth=this.helpWidth??e.helpWidth??80}visibleCommands(e){let t=e.commands.filter(e=>!e._hidden),n=e._getHelpCommand();return n&&!n._hidden&&t.push(n),this.sortSubcommands&&t.sort((e,t)=>e.name().localeCompare(t.name())),t}compareOptions(e,t){let n=e=>e.short?e.short.replace(/^-/,``):e.long.replace(/^--/,``);return n(e).localeCompare(n(t))}visibleOptions(e){let t=e.options.filter(e=>!e.hidden),n=e._getHelpOption();if(n&&!n.hidden){let r=n.short&&e._findOption(n.short),i=n.long&&e._findOption(n.long);!r&&!i?t.push(n):n.long&&!i?t.push(e.createOption(n.long,n.description)):n.short&&!r&&t.push(e.createOption(n.short,n.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let n=e.parent;n;n=n.parent){let e=n.options.filter(e=>!e.hidden);t.push(...e)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||``}),e.registeredArguments.find(e=>e.description)?e.registeredArguments:[]}subcommandTerm(e){let t=e.registeredArguments.map(e=>kd(e)).join(` `);return e._name+(e._aliases[0]?`|`+e._aliases[0]:``)+(e.options.length?` [options]`:``)+(t?` `+t:``)}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleSubcommandTerm(t.subcommandTerm(n)))),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleOptionTerm(t.optionTerm(n)))),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleOptionTerm(t.optionTerm(n)))),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleArgumentTerm(t.argumentTerm(n)))),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+`|`+e._aliases[0]);let n=``;for(let t=e.parent;t;t=t.parent)n=t.name()+` `+n;return n+t+` `+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(e=>JSON.stringify(e)).join(`, `)}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue==`boolean`)&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0){let n=`(${t.join(`, `)})`;return e.description?`${e.description} ${n}`:n}return e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(e=>JSON.stringify(e)).join(`, `)}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let n=`(${t.join(`, `)})`;return e.description?`${e.description} ${n}`:n}return e.description}formatItemList(e,t,n){return t.length===0?[]:[n.styleTitle(e),...t,``]}groupItems(e,t,n){let r=new Map;return e.forEach(e=>{let t=n(e);r.has(t)||r.set(t,[])}),t.forEach(e=>{let t=n(e);r.has(t)||r.set(t,[]),r.get(t).push(e)}),r}formatHelp(e,t){let n=t.padWidth(e,t),r=t.helpWidth??80;function i(e,r){return t.formatItem(e,n,r,t)}let a=[`${t.styleTitle(`Usage:`)} ${t.styleUsage(t.commandUsage(e))}`,``],o=t.commandDescription(e);o.length>0&&(a=a.concat([t.boxWrap(t.styleCommandDescription(o),r),``]));let s=t.visibleArguments(e).map(e=>i(t.styleArgumentTerm(t.argumentTerm(e)),t.styleArgumentDescription(t.argumentDescription(e))));if(a=a.concat(this.formatItemList(`Arguments:`,s,t)),this.groupItems(e.options,t.visibleOptions(e),e=>e.helpGroupHeading??`Options:`).forEach((e,n)=>{let r=e.map(e=>i(t.styleOptionTerm(t.optionTerm(e)),t.styleOptionDescription(t.optionDescription(e))));a=a.concat(this.formatItemList(n,r,t))}),t.showGlobalOptions){let n=t.visibleGlobalOptions(e).map(e=>i(t.styleOptionTerm(t.optionTerm(e)),t.styleOptionDescription(t.optionDescription(e))));a=a.concat(this.formatItemList(`Global Options:`,n,t))}return this.groupItems(e.commands,t.visibleCommands(e),e=>e.helpGroup()||`Commands:`).forEach((e,n)=>{let r=e.map(e=>i(t.styleSubcommandTerm(t.subcommandTerm(e)),t.styleSubcommandDescription(t.subcommandDescription(e))));a=a.concat(this.formatItemList(n,r,t))}),a.join(`
|
|
351
351
|
`)}displayWidth(e){return _e(e).length}styleTitle(e){return e}styleUsage(e){return e.split(` `).map(e=>e===`[options]`?this.styleOptionText(e):e===`[command]`?this.styleSubcommandText(e):e[0]===`[`||e[0]===`<`?this.styleArgumentText(e):this.styleCommandText(e)).join(` `)}styleCommandDescription(e){return this.styleDescriptionText(e)}styleOptionDescription(e){return this.styleDescriptionText(e)}styleSubcommandDescription(e){return this.styleDescriptionText(e)}styleArgumentDescription(e){return this.styleDescriptionText(e)}styleDescriptionText(e){return e}styleOptionTerm(e){return this.styleOptionText(e)}styleSubcommandTerm(e){return e.split(` `).map(e=>e===`[options]`?this.styleOptionText(e):e[0]===`[`||e[0]===`<`?this.styleArgumentText(e):this.styleSubcommandText(e)).join(` `)}styleArgumentTerm(e){return this.styleArgumentText(e)}styleOptionText(e){return e}styleArgumentText(e){return e}styleSubcommandText(e){return e}styleCommandText(e){return e}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}preformatted(e){return/\n[^\S\r\n]/.test(e)}formatItem(e,t,n,r){let i=` `.repeat(2);if(!n)return i+e;let a=e.padEnd(t+e.length-r.displayWidth(e)),o=(this.helpWidth??80)-t-2-2,s;return s=o<this.minWidthToWrap||r.preformatted(n)?n:r.boxWrap(n,o).replace(/\n/g,`
|
|
352
352
|
`+` `.repeat(t+2)),i+a+` `.repeat(2)+s.replace(/\n/g,`\n${i}`)}boxWrap(e,t){if(t<this.minWidthToWrap)return e;let n=e.split(/\r\n|\n/),r=/[\s]*[^\s]+/g,i=[];return n.forEach(e=>{let n=e.match(r);if(n===null){i.push(``);return}let a=[n.shift()],o=this.displayWidth(a[0]);n.forEach(e=>{let n=this.displayWidth(e);if(o+n<=t){a.push(e),o+=n;return}i.push(a.join(``));let r=e.trimStart();a=[r],o=this.displayWidth(r)}),i.push(a.join(``))}),i.join(`
|
|
353
353
|
`)}},jd=class{constructor(e,t){this.flags=e,this.description=t||``,this.required=e.includes(`<`),this.optional=e.includes(`[`),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let n=Pd(e);this.short=n.shortFlag,this.long=n.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith(`--no-`)),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0,this.helpGroupHeading=void 0}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let t=e;return typeof e==`string`&&(t={[e]:!0}),this.implied=Object.assign(this.implied||{},t),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_collectValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:(t.push(e),t)}choices(e){return this.argChoices=e.slice(),this.parseArg=(e,t)=>{if(!this.argChoices.includes(e))throw new Dd(`Allowed choices are ${this.argChoices.join(`, `)}.`);return this.variadic?this._collectValue(e,t):e},this}name(){return this.long?this.long.replace(/^--/,``):this.short.replace(/^-/,``)}attributeName(){return this.negate?Nd(this.name().replace(/^no-/,``)):Nd(this.name())}helpGroup(e){return this.helpGroupHeading=e,this}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},Md=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(e=>{e.negate?this.negativeOptions.set(e.attributeName(),e):this.positiveOptions.set(e.attributeName(),e)}),this.negativeOptions.forEach((e,t)=>{this.positiveOptions.has(t)&&this.dualOptions.add(t)})}valueFromOption(e,t){let n=t.attributeName();if(!this.dualOptions.has(n))return!0;let r=this.negativeOptions.get(n).presetArg,i=r!==void 0&&r;return t.negate===(i===e)}};function Nd(e){return e.split(`-`).reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function Pd(e){let t,n,r=/^-[^-]$/,i=/^--[^-]/,a=e.split(/[ |,]+/).concat(`guard`);if(r.test(a[0])&&(t=a.shift()),i.test(a[0])&&(n=a.shift()),!t&&r.test(a[0])&&(t=a.shift()),!t&&i.test(a[0])&&(t=n,n=a.shift()),a[0].startsWith(`-`)){let t=a[0],n=`option creation failed due to '${t}' in option flags '${e}'`;throw/^-[^-][^-]/.test(t)?Error(`${n}
|
|
@@ -365,6 +365,6 @@ Expecting one of '${n.join(`', '`)}'`);return this._lifeCycleHooks[e]?this._life
|
|
|
365
365
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
366
366
|
- ${t?`searched for local subcommand relative to directory '${t}'`:`no directory for search for local subcommand, use .executableDir() to supply a custom directory`}`;throw Error(r)}_executeSubCommand(e,t){t=t.slice();let n=[`.js`,`.ts`,`.tsx`,`.mjs`,`.cjs`];function r(e,t){let r=m.resolve(e,t);if(ce.existsSync(r))return r;if(n.includes(m.extname(t)))return;let i=n.find(e=>ce.existsSync(`${r}${e}`));if(i)return`${r}${i}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let i=e._executableFile||`${this._name}-${e._name}`,a=this._executableDir||``;if(this._scriptPath){let e;try{e=ce.realpathSync(this._scriptPath)}catch{e=this._scriptPath}a=m.resolve(m.dirname(e),a)}if(a){let t=r(a,i);if(!t&&!e._executableFile&&this._scriptPath){let n=m.basename(this._scriptPath,m.extname(this._scriptPath));n!==this._name&&(t=r(a,`${n}-${e._name}`))}i=t||i}let o=n.includes(m.extname(i)),s;g.platform===`win32`?(this._checkForMissingExecutable(i,a,e._name),t.unshift(i),t=Rd(g.execArgv).concat(t),s=he.spawn(g.execPath,t,{stdio:`inherit`})):o?(t.unshift(i),t=Rd(g.execArgv).concat(t),s=he.spawn(g.argv[0],t,{stdio:`inherit`})):s=he.spawn(i,t,{stdio:`inherit`}),s.killed||[`SIGUSR1`,`SIGUSR2`,`SIGTERM`,`SIGINT`,`SIGHUP`].forEach(e=>{g.on(e,()=>{s.killed===!1&&s.exitCode===null&&s.kill(e)})});let c=this._exitCallback;s.on(`close`,e=>{e??=1,c?c(new Ed(e,`commander.executeSubCommandAsync`,`(close)`)):g.exit(e)}),s.on(`error`,t=>{if(t.code===`ENOENT`)this._checkForMissingExecutable(i,a,e._name);else if(t.code===`EACCES`)throw Error(`'${i}' not executable`);if(!c)g.exit(1);else{let e=new Ed(1,`commander.executeSubCommandAsync`,`(error)`);e.nestedError=t,c(e)}}),this.runningCommand=s}_dispatchSubcommand(e,t,n){let r=this._findCommand(e);r||this.help({error:!0}),r._prepareForParse();let i;return i=this._chainOrCallSubCommandHook(i,r,`preSubcommand`),i=this._chainOrCall(i,()=>{if(r._executableHandler)this._executeSubCommand(r,t.concat(n));else return r._parseCommand(t,n)}),i}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??`--help`])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(e,t,n)=>{let r=t;if(t!==null&&e.parseArg){let i=`error: command-argument value '${t}' is invalid for argument '${e.name()}'.`;r=this._callParseArg(e,t,n,i)}return r};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((n,r)=>{let i=n.defaultValue;n.variadic?r<this.args.length?(i=this.args.slice(r),n.parseArg&&(i=i.reduce((t,r)=>e(n,r,t),n.defaultValue))):i===void 0&&(i=[]):r<this.args.length&&(i=this.args[r],n.parseArg&&(i=e(n,i,n.defaultValue))),t[r]=i}),this.processedArgs=t}_chainOrCall(e,t){return e?.then&&typeof e.then==`function`?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let n=e,r=[];return this._getCommandAndAncestors().reverse().filter(e=>e._lifeCycleHooks[t]!==void 0).forEach(e=>{e._lifeCycleHooks[t].forEach(t=>{r.push({hookedCommand:e,callback:t})})}),t===`postAction`&&r.reverse(),r.forEach(e=>{n=this._chainOrCall(n,()=>e.callback(e.hookedCommand,this))}),n}_chainOrCallSubCommandHook(e,t,n){let r=e;return this._lifeCycleHooks[n]!==void 0&&this._lifeCycleHooks[n].forEach(e=>{r=this._chainOrCall(r,()=>e(this,t))}),r}_parseCommand(e,t){let n=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(n.operands),t=n.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(n.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let r=()=>{n.unknown.length>0&&this.unknownOption(n.unknown[0])},i=`command:${this.name()}`;if(this._actionHandler){r(),this._processArguments();let n;return n=this._chainOrCallHooks(n,`preAction`),n=this._chainOrCall(n,()=>this._actionHandler(this.processedArgs)),this.parent&&(n=this._chainOrCall(n,()=>{this.parent.emit(i,e,t)})),n=this._chainOrCallHooks(n,`postAction`),n}if(this.parent?.listenerCount(i))r(),this._processArguments(),this.parent.emit(i,e,t);else if(e.length){if(this._findCommand(`*`))return this._dispatchSubcommand(`*`,e,t);this.listenerCount(`command:*`)?this.emit(`command:*`,e,t):this.commands.length?this.unknownCommand():(r(),this._processArguments())}else this.commands.length?(r(),this.help({error:!0})):(r(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(e=>{let t=e.attributeName();return this.getOptionValue(t)!==void 0&&this.getOptionValueSource(t)!=="default"});e.filter(e=>e.conflictsWith.length>0).forEach(t=>{let n=e.find(e=>t.conflictsWith.includes(e.attributeName()));n&&this._conflictingOption(t,n)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],n=[],r=t;function i(e){return e.length>1&&e[0]===`-`}let a=e=>/^-(\d+|\d*\.\d+)(e[+-]?\d+)?$/.test(e)?!this._getCommandAndAncestors().some(e=>e.options.map(e=>e.short).some(e=>/^-\d$/.test(e))):!1,o=null,s=null,c=0;for(;c<e.length||s;){let l=s??e[c++];if(s=null,l===`--`){r===n&&r.push(l),r.push(...e.slice(c));break}if(o&&(!i(l)||a(l))){this.emit(`option:${o.name()}`,l);continue}if(o=null,i(l)){let t=this._findOption(l);if(t){if(t.required){let n=e[c++];n===void 0&&this.optionMissingArgument(t),this.emit(`option:${t.name()}`,n)}else if(t.optional){let n=null;c<e.length&&(!i(e[c])||a(e[c]))&&(n=e[c++]),this.emit(`option:${t.name()}`,n)}else this.emit(`option:${t.name()}`);o=t.variadic?t:null;continue}}if(l.length>2&&l[0]===`-`&&l[1]!==`-`){let e=this._findOption(`-${l[1]}`);if(e){e.required||e.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${e.name()}`,l.slice(2)):(this.emit(`option:${e.name()}`),s=`-${l.slice(2)}`);continue}}if(/^--[^=]+=/.test(l)){let e=l.indexOf(`=`),t=this._findOption(l.slice(0,e));if(t&&(t.required||t.optional)){this.emit(`option:${t.name()}`,l.slice(e+1));continue}}if(r===t&&i(l)&&!(this.commands.length===0&&a(l))&&(r=n),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&n.length===0){if(this._findCommand(l)){t.push(l),n.push(...e.slice(c));break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){t.push(l,...e.slice(c));break}else if(this._defaultCommandName){n.push(l,...e.slice(c));break}}if(this._passThroughOptions){r.push(l,...e.slice(c));break}r.push(l)}return{operands:t,unknown:n}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let n=0;n<t;n++){let t=this.options[n].attributeName();e[t]=t===this._versionOptionName?this._version:this[t]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}\n`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==`string`?this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
|
|
367
367
|
`),this.outputHelp({error:!0}));let n=t||{},r=n.exitCode||1,i=n.code||`commander.error`;this._exit(r,i,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in g.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||[`default`,`config`,`env`].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,g.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new Md(this.options),t=e=>this.getOptionValue(e)!==void 0&&![`default`,`implied`].includes(this.getOptionValueSource(e));this.options.filter(n=>n.implied!==void 0&&t(n.attributeName())&&e.valueFromOption(this.getOptionValue(n.attributeName()),n)).forEach(e=>{Object.keys(e.implied).filter(e=>!t(e)).forEach(t=>{this.setOptionValueWithSource(t,e.implied[t],`implied`)})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:`commander.missingArgument`})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:`commander.optionMissingArgument`})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:`commander.missingMandatoryOptionValue`})}_conflictingOption(e,t){let n=e=>{let t=e.attributeName(),n=this.getOptionValue(t),r=this.options.find(e=>e.negate&&t===e.attributeName()),i=this.options.find(e=>!e.negate&&t===e.attributeName());return r&&(r.presetArg===void 0&&n===!1||r.presetArg!==void 0&&n===r.presetArg)?r:i||e},r=e=>{let t=n(e),r=t.attributeName();return this.getOptionValueSource(r)===`env`?`environment variable '${t.envVar}'`:`option '${t.flags}'`},i=`error: ${r(e)} cannot be used with ${r(t)}`;this.error(i,{code:`commander.conflictingOption`})}unknownOption(e){if(this._allowUnknownOption)return;let t=``;if(e.startsWith(`--`)&&this._showSuggestionAfterError){let n=[],r=this;do{let e=r.createHelp().visibleOptions(r).filter(e=>e.long).map(e=>e.long);n=n.concat(e),r=r.parent}while(r&&!r._enablePositionalOptions);t=Id(e,n)}let n=`error: unknown option '${e}'${t}`;this.error(n,{code:`commander.unknownOption`})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,n=t===1?``:`s`,r=e.length,i=`error: too many arguments${this.parent?` for '${this.name()}'`:``}. Expected ${t} argument${n} but got ${r}: ${e.join(`, `)}.`;this.error(i,{code:`commander.excessArguments`})}unknownCommand(){let e=this.args[0],t=``;if(this._showSuggestionAfterError){let n=[];this.createHelp().visibleCommands(this).forEach(e=>{n.push(e.name()),e.alias()&&n.push(e.alias())}),t=Id(e,n)}let n=`error: unknown command '${e}'${t}`;this.error(n,{code:`commander.unknownCommand`})}version(e,t,n){if(e===void 0)return this._version;this._version=e,t||=`-V, --version`,n||=`output the version number`;let r=this.createOption(t,n);return this._versionOptionName=r.attributeName(),this._registerOption(r),this.on(`option:`+r.name(),()=>{this._outputConfiguration.writeOut(`${e}\n`),this._exit(0,`commander.version`,e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw Error(`Command alias can't be the same as its name`);let n=this.parent?._findCommand(e);if(n){let t=[n.name()].concat(n.aliases()).join(`|`);throw Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${t}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(e=>this.alias(e)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let e=this.registeredArguments.map(e=>kd(e));return[].concat(this.options.length||this._helpOption!==null?`[options]`:[],this.commands.length?`[command]`:[],this.registeredArguments.length?e:[]).join(` `)}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}helpGroup(e){return e===void 0?this._helpGroupHeading??``:(this._helpGroupHeading=e,this)}commandsGroup(e){return e===void 0?this._defaultCommandGroup??``:(this._defaultCommandGroup=e,this)}optionsGroup(e){return e===void 0?this._defaultOptionGroup??``:(this._defaultOptionGroup=e,this)}_initOptionGroup(e){this._defaultOptionGroup&&!e.helpGroupHeading&&e.helpGroup(this._defaultOptionGroup)}_initCommandGroup(e){this._defaultCommandGroup&&!e.helpGroup()&&e.helpGroup(this._defaultCommandGroup)}nameFromFilename(e){return this._name=m.basename(e,m.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp(),n=this._getOutputContext(e);t.prepareContext({error:n.error,helpWidth:n.helpWidth,outputHasColors:n.hasColors});let r=t.formatHelp(this,t);return n.hasColors?r:this._outputConfiguration.stripColor(r)}_getOutputContext(e){e||={};let t=!!e.error,n,r,i;return t?(n=e=>this._outputConfiguration.writeErr(e),r=this._outputConfiguration.getErrHasColors(),i=this._outputConfiguration.getErrHelpWidth()):(n=e=>this._outputConfiguration.writeOut(e),r=this._outputConfiguration.getOutHasColors(),i=this._outputConfiguration.getOutHelpWidth()),{error:t,write:e=>(r||(e=this._outputConfiguration.stripColor(e)),n(e)),hasColors:r,helpWidth:i}}outputHelp(e){let t;typeof e==`function`&&(t=e,e=void 0);let n=this._getOutputContext(e),r={error:n.error,write:n.write,command:this};this._getCommandAndAncestors().reverse().forEach(e=>e.emit(`beforeAllHelp`,r)),this.emit(`beforeHelp`,r);let i=this.helpInformation({error:n.error});if(t&&(i=t(i),typeof i!=`string`&&!Buffer.isBuffer(i)))throw Error(`outputHelp callback must return a string or a Buffer`);n.write(i),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit(`afterHelp`,r),this._getCommandAndAncestors().forEach(e=>e.emit(`afterAllHelp`,r))}helpOption(e,t){return typeof e==`boolean`?(e?(this._helpOption===null&&(this._helpOption=void 0),this._defaultOptionGroup&&this._initOptionGroup(this._getHelpOption())):this._helpOption=null,this):(this._helpOption=this.createOption(e??`-h, --help`,t??`display help for command`),(e||t)&&this._initOptionGroup(this._helpOption),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this._initOptionGroup(e),this}help(e){this.outputHelp(e);let t=Number(g.exitCode??0);t===0&&e&&typeof e!=`function`&&e.error&&(t=1),this._exit(t,`commander.help`,`(outputHelp)`)}addHelpText(e,t){let n=[`beforeAll`,`before`,`after`,`afterAll`];if(!n.includes(e))throw Error(`Unexpected value for position to addHelpText.
|
|
368
|
-
Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(e=>t.is(e))&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function Rd(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function zd(){if(g.env.NO_COLOR||g.env.FORCE_COLOR===`0`||g.env.FORCE_COLOR===`false`)return!1;if(g.env.FORCE_COLOR||g.env.CLICOLOR_FORCE!==void 0)return!0}new Ld;const Bd=[],Vd=e=>Array.isArray(e)?e:[e],Hd=e=>e===void 0?Bd:[e],Ud=e=>e instanceof Error?e.message:String(e),Z=e=>{let t=e.optsWithGlobals();return{json:t.json===!0,verbose:t.verbose===!0}},Q=(e,t,n,r,i)=>{if(t.json){let t={data:r,ok:!0,warnings:i??Bd};e.out(JSON.stringify(t));return}for(let t of Vd(n))e.out(t);for(let t of i??Bd)e.errLine(`refs: warning: ${t}`)},Wd=(e,t,n)=>{if(t.json){let t={error:{code:n.code,message:n.message},ok:!1};e.out(JSON.stringify(t));return}e.errLine(`refs: ${n.message}`)},Gd=(e,t)=>{e.errLine(`refs: ${t}`)},$=(e,t,n)=>async()=>{try{await n()}catch(n){let r=be(n,{verbose:t.verbose});Wd(e,t,r),process.exitCode=r.exitCode}},Kd=async e=>{let t=await e.runner.run(`git`,[`--version`]);return t.exitCode===0?{detail:t.stdout.trim(),name:`git`,status:`ok`}:{detail:t.stderr.trim()||`git --version exited with code ${t.exitCode}`,name:`git`,status:`fail`}},qd=/^v(?<major>\d+)\.(?<minor>\d+)/u,Jd=e=>{let t=qd.exec(e),n=t?.groups?.major,r=t?.groups?.minor;if(n!==void 0&&r!==void 0)return{major:Number(n),minor:Number(r)}},Yd=e=>e===void 0?!1:e.major>24||e.major===24&&e.minor>=12,Xd=e=>{let{nodeVersion:t}=e;return Yd(Jd(t))?{detail:t,name:`node`,status:`ok`}:{detail:`${t} does not satisfy the required range >=24.12`,name:`node`,status:`fail`}},Zd=()=>cs.parse({meta:{cli_version:`0.0.0`,schema_version:1},refs:{},settings:{}}),Qd=async e=>{try{return{config:await W(e)}}catch(e){return{config:Zd(),errorMessage:Ud(e)}}},$d=e=>e===void 0?{detail:`config is present and matches the current schema`,name:`config`,status:`ok`}:{detail:e,name:`config`,status:`fail`},ef=(e,t)=>Object.keys(t.refs).map(t=>({dest:U(e,z.parse(t)),key:t})).filter(e=>G(e.dest)),tf=[`pre-commit`,`pre-push`],nf=async(t,r)=>{try{return await e(h(t.hooksDir,r),n.X_OK),!0}catch{return!1}},rf=async e=>{let t=await Promise.all(tf.map(t=>nf(e,t)));return tf.filter((e,n)=>!t[n])},af=async(e,t,n)=>{let r=await e.runner.run(`git`,[`config`,`--local`,`--get`,`core.hooksPath`],{cwd:n});return r.exitCode===0&&r.stdout.trim()===t.hooksDir},of=e=>e.missingHooks.length>0?{detail:`${e.missingHooks.map(e=>`hooks/${e}`).join(`, `)} missing or not executable — run: refs init`,name:`hooks-guard`,status:`fail`}:e.badKeys.length>0?{detail:`core.hooksPath not set for: ${e.badKeys.join(`, `)} — run: refs init`,name:`hooks-guard`,status:`fail`}:{detail:`${tf.map(e=>`hooks/${e}`).join(`, `)} present; ${e.checkoutCount} checkout(s) guarded`,name:`hooks-guard`,status:`ok`},sf=async(e,t,n)=>{let r=ef(t,n),[i,a]=await Promise.all([rf(t),Promise.all(r.map(n=>af(e,t,n.dest)))]),o=r.filter((e,t)=>!a[t]).map(e=>e.key);return of({badKeys:o,checkoutCount:r.length,missingHooks:i})},cf=async(e,t)=>{let n=await e.runner.run(`git`,[`status`,`--porcelain`],{cwd:t.dest});return n.exitCode===0?{broken:!1,detail:``,dirty:n.stdout.trim()!==``,key:t.key}:{broken:!0,detail:n.stderr.trim(),dirty:!1,key:t.key}},lf=e=>{let t=e.filter(e=>e.broken);if(t.length>0)return{detail:t.map(e=>`${e.key}: git status failed — ${e.detail}`).join(`; `),name:`dirty-checkouts`,status:`fail`};let n=e.filter(e=>e.dirty).map(e=>e.key);return n.length===0?{detail:`no local changes in any checkout`,name:`dirty-checkouts`,status:`ok`}:{detail:`local changes will be discarded on next sync: ${n.join(`, `)}`,name:`dirty-checkouts`,status:`warn`}},uf=async(e,t,n)=>{let r=ef(t,n),i=await Promise.all(r.map(t=>cf(e,t)));return lf(i)},df=async e=>{try{return await X(e)}catch{return Uu.parse({})}},ff=async e=>{try{return(await s(e,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(e){if(V(e))return[];throw e}},pf=async(e,t)=>{if(G(e))return[[...t]];let n=await ff(e);return(await Promise.all(n.map(n=>pf(h(e,n),[...t,n])))).flat()},mf=(e,t,n)=>{let r=e.refs[t]?.pending_proposal_at;return r!==void 0&&n-Date.parse(r)<864e5},hf=(e,t,n)=>mf(t,e.key,n)?`${e.key}: pending add`:`${e.key}: orphan — remove with: rm -rf ${e.dest}`,gf=(e,t)=>({dest:h(e.sourcesDir,...t),key:t.join(`/`)}),_f=async(e,t,n)=>{let r=(await pf(e.sourcesDir,[])).map(t=>gf(e,t)).filter(e=>!Object.hasOwn(t.refs,e.key));if(r.length===0)return{detail:`no orphaned checkouts under sources/`,name:`orphans`,status:`ok`};let i=Date.now();return{detail:r.map(e=>hf(e,n,i)).join(`; `),name:`orphans`,status:`warn`}},vf=[`.agents`,`skills`,`refs`,`SKILL.md`],yf=[`skills`,`refs`,`SKILL.md`],bf=[`.claude`,`skills`,`refs`,`SKILL.md`],xf=`npx skills add kaisers-io/refs`,Sf=`npm i -g @kaisers-io/refs@latest`,Cf=(e,t)=>e===void 0?void 0:{display:t,path:e},wf=e=>{let{dirName:t,env:n,home:r,overrideName:i}=e,a=n[i]?.trim();return a!==void 0&&a.length>0?{display:a,path:a}:Cf(r===void 0?void 0:h(r,t),`~/${t}`)},Tf=e=>{let t=e.env.HOME;return[{label:`shared ~/.agents`,root:Cf(t,`~/.agents`),segments:vf},{label:`Claude Code`,root:wf({dirName:`.claude`,env:e.env,home:t,overrideName:`CLAUDE_CONFIG_DIR`}),segments:yf},{label:`Codex`,root:wf({dirName:`.codex`,env:e.env,home:t,overrideName:`CODEX_HOME`}),segments:yf},{label:`project ./.agents`,root:Cf(e.cwd,`./.agents`),segments:vf},{label:`project ./.claude`,root:Cf(e.cwd,`./.claude`),segments:bf}].flatMap(({label:e,root:t,segments:n})=>t===void 0?[]:[{display:t.display,label:e,path:h(t.path,...n)}])},Ef=async(e,t)=>{try{let n=await c(e);return{label:t,realPath:n,source:await o(n,`utf8`)}}catch{return}},Df=e=>{let t=new Map;for(let n of e)t.has(n.realPath)||t.set(n.realPath,n);return[...t.values()]},Of=/^---\r?\n(?<body>[\s\S]*?)\r?\n---/u,kf=/^\s*cli_version:\s*["']?(?<version>[^"'\s]+)["']?\s*$/mu,Af=e=>{let t=Of.exec(e)?.groups?.body;if(t!==void 0)return kf.exec(t)?.groups?.version},jf=/^\d+\.\d+\.\d+$/u,Mf=e=>{if(jf.test(e))return e.split(`.`).map(Number)},Nf=(e,t)=>{if(e===t)return`match`;let n=Mf(e),r=Mf(t);if(n===void 0||r===void 0)return`unknown`;let i=n.findIndex((e,t)=>e!==r[t]);return i===-1?`match`:(n[i]??0)>(r[i]??0)?`cli-older`:`skill-older`},Pf={"cli-older":(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — update the CLI: ${Sf}`,match:(e,t)=>`the refs skill is installed and matches this CLI (${t})`,"skill-older":(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — update the skill: ${xf}`,unknown:(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — reinstall both: ${Sf} and ${xf}`},Ff=e=>{let{cliVersion:t,label:n,skillVersion:r}=e;if(r===void 0)return{detail:`the refs skill (${n}) predates the version gate — update it: ${xf}`,name:`skill`,status:`warn`};let i=Nf(r,t);return{detail:`${n}: ${Pf[i](r,t)}`,name:`skill`,status:i===`match`?`ok`:`warn`}},If=e=>({detail:`refs skill not found in the locations this check knows about (${e.map(e=>e.display).join(`, `)}) — an install anywhere else is invisible here and still works; if it really is missing: ${xf}`,name:`skill`,status:`warn`}),Lf=async e=>{let t=Tf(e),n=await Promise.all(t.map(e=>Ef(e.path,e.label))),r=Df(n.filter(e=>e!==void 0)).map(t=>Ff({cliVersion:e.cliVersion,label:t.label,skillVersion:Af(t.source)}));return r.find(e=>e.status!==`ok`)??r[0]??If(t)},Rf=/^(?<user>[^/\s@]+)@(?<host>[^:/\s]+):/u,zf=e=>e===``?{}:{user:e},Bf=e=>e===``?{}:{port:e},Vf=e=>{try{let t=new URL(e);return t.protocol===`ssh:`?{host:t.hostname,...zf(t.username),...Bf(t.port)}:void 0}catch{return}},Hf=e=>{let t=Rf.exec(e),n=t?.groups?.host;return n===void 0?Vf(e):{host:n,user:t?.groups?.user??`git`}},Uf=e=>e.port===void 0?e.host:`${e.host}:${e.port}`,Wf=e=>e.user===void 0?Uf(e):`${e.user}@${Uf(e)}`,Gf=e=>{let t=Object.values(e.refs).map(e=>Hf(e.url)).filter(e=>e!==void 0),n=new Map;for(let e of t)n.set(Wf(e),e);return[...n.values()].toSorted((e,t)=>Wf(e).localeCompare(Wf(t)))},Kf=/Permission denied/u,qf=[/Could not resolve hostname/u,/Connection refused/u,/Host key verification failed/u,/timed out/u],Jf=e=>e.user===void 0?e.host:`${e.user}@${e.host}`,Yf=e=>{let t=[`-o`,`ConnectTimeout=5`,`-o`,`BatchMode=yes`],n=Jf(e);return e.port===void 0?[...t,`-T`,n]:[...t,`-p`,e.port,`-T`,n]},Xf=async(e,t,n)=>{let r=Wf(t),i=await e.runner.run(`ssh`,Yf(t),{timeoutMs:n});return i.timedOut===!0?{host:r,outcome:`timeout`}:Kf.test(i.stderr)?{host:r,outcome:`denied`}:qf.some(e=>e.test(i.stderr))?{detail:i.stderr.trim(),host:r,outcome:`connection-warn`}:{host:r,outcome:`ok`}},Zf=(e,t)=>{let n=e.filter(e=>e.outcome===`timeout`).map(e=>e.host);if(n.length!==0)return{detail:`ssh probe timed out after ${t/1e3}s: ${n.join(`, `)}`,name:`ssh-auth`,status:`fail`}},Qf=e=>{let t=e.filter(e=>e.outcome===`denied`).map(e=>e.host);if(t.length!==0)return{detail:`ssh permission denied for: ${t.join(`, `)}`,name:`ssh-auth`,status:`fail`}},$f=e=>{let t=e.filter(e=>e.outcome===`connection-warn`);if(t.length!==0)return{detail:`ssh connection issue, treated as warn: ${t.map(e=>`${e.host} (${e.detail??``})`).join(`; `)}`,name:`ssh-auth`,status:`warn`}},ep=e=>({detail:`ssh auth ok for: ${e.map(e=>e.host).join(`, `)}`,name:`ssh-auth`,status:`ok`}),tp=(e,t)=>Zf(e,t)??Qf(e)??$f(e)??ep(e),np=async(e,t,n)=>{let r=Gf(t);if(r.length===0)return;let i=n?.timeoutMs??1e4,a=await Promise.all(r.map(t=>Xf(e,t,i)));return tp(a,i)},rp=async e=>{try{return await e.run()}catch(t){return{detail:`check crashed: ${Ud(t)}`,name:e.name,status:`fail`}}},ip=async e=>{let[t,...n]=e;if(t===void 0)return[];let r=await rp(t),i=await ip(n);return r===void 0?i:[r,...i]},ap=e=>{let{configLoad:t,ctx:n,home:r,state:i}=e;return[{name:`git`,run:()=>Kd(n)},{name:`node`,run:()=>Promise.resolve(Xd(n))},{name:`config`,run:()=>Promise.resolve($d(t.errorMessage))},{name:`hooks-guard`,run:()=>sf(n,r,t.config)},{name:`dirty-checkouts`,run:()=>uf(n,r,t.config)},{name:`orphans`,run:()=>_f(r,t.config,i)},{name:`skill`,run:()=>Lf(n)},{name:`ssh-auth`,run:()=>np(n,t.config)}]},op=async e=>{let t=H(e.env),n=await Qd(t),r=await df(t);return ip(ap({configLoad:n,ctx:e,home:t,state:r}))},sp={fail:`FAIL`,ok:`OK`,warn:`WARN`},cp=e=>e.map(e=>`[${sp[e.status]}] ${e.name}: ${e.detail}`),lp=e=>e.some(e=>e.status===`fail`),up=(e,t)=>{e.command(`doctor`).description(`Run environment/integrity checks (git, node, config, hooks, checkouts, ssh).`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let e=await op(t);Q(t,r,cp(e),{checks:e}),lp(e)&&(process.exitCode=_.UNEXPECTED)})()})},dp=async e=>{let t=H(e.env),n=await J(t,`home`,()=>lc(t,Cd));return n===`migrated`?{backup:Vs(t),result:n}:{backup:null,result:n}},fp=e=>e.result===`migrated`&&e.backup!==null?`config migrated (backup: ${ee(e.backup)})`:e.result===`seeded`?`config seeded`:`config up to date`,pp=(e,t)=>{e.command(`migrate`).description(`Migrate the refs config to the current schema, seeding it if absent.`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let e=await dp(t);Q(t,r,fp(e),e)})()})},mp=`never`,hp=(e,t,n)=>e===void 0||n-Date.parse(e)>t,gp=(e,t)=>`${e} ${t}${e===1?``:`s`} ago`,_p=(e,t)=>{if(e===void 0)return mp;let n=t-Date.parse(e);if(Number.isNaN(n))return mp;let r=Math.floor(n/1e3);if(r<60)return`just now`;let i=Math.floor(r/60);if(i<60)return gp(i,`minute`);let a=Math.floor(i/60);if(a<24)return gp(a,`hour`);let o=Math.floor(a/24);return o<365?gp(o,`day`):gp(Math.floor(o/365),`year`)},vp=e=>{let t=_p(e.lastFetchedAt,e.now),n=[`synced: ${t}`];return e.stale&&t!==mp&&n.push(`status: stale`),e.missing&&n.push(`missing: checkout not found — run: refs sync`),n},yp=(e,t,n)=>{let r=e.state.refs[t],i=Qo(Y(`sync_ttl`,n,e.settings)),a=Object.keys(n.packages??{}).toSorted();return{clone_mode:Y(`clone_mode`,n,e.settings),description:n.description,key:t,...r?.last_fetched_at===void 0?{}:{last_fetched_at:r.last_fetched_at},missing:!G(U(e.home,z.parse(t))),...e.includePackages?{packages:a}:{},packages_count:a.length,stale:hp(r?.last_fetched_at,i,e.now)}},bp=e=>{let t={home:e.home,includePackages:e.includePackages,now:e.now,settings:e.config.settings,state:e.state};return Object.entries(e.config.refs).map(([e,n])=>yp(t,e,n)).toSorted((e,t)=>e.key.localeCompare(t.key))},xp=async(e,t,n)=>{let r=H(e.env),i=await W(r),a=await X(r);return bp({config:i,home:r,includePackages:t,now:n,state:a})},Sp=(e,t)=>[`ref: ${e.key}`,`description: ${e.description}`,...vp({lastFetchedAt:e.last_fetched_at,missing:e.missing,now:t,stale:e.stale})],Cp=(e,t)=>e.length===0?[`no refs configured — run: refs add <source>`]:e.reduce((e,n,r)=>(r>0&&e.push(``),e.push(...Sp(n,t)),e),[]),wp=e=>e.split(`/`),Tp=(e,t)=>{let n=wp(e);if(t.length>n.length)return!1;let r=n.length-t.length;return t.every((e,t)=>e===n[r+t])},Ep=(e,t)=>{if(Object.hasOwn(e.refs,t))return z.parse(t);let n=wp(t),r=Object.keys(e.refs).filter(e=>Tp(e,n)).toSorted(),[i]=r;if(i===void 0)throw y(`no ref matches '${t}'`);if(r.length>1)throw b(`'${t}' matches more than one ref: ${r.join(`, `)}`);return z.parse(i)},Dp=(e,t)=>{e.command(`list`).description(`List configured refs with their staleness/missing checkout status.`).option(`--packages`,`include each ref's package names in --json output (off by default)`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let n=Date.now(),i=await xp(t,e.packages===!0,n);Q(t,r,Cp(i,n),i)})()})},Op=e=>`ref.${e.replaceAll(`/`,`_`)}`,kp=e=>e.REFS_ALLOW_FILE_URLS===`1`,Ap=(e,t)=>{let n=dl(t,{allowFileUrls:kp(e.env)});return{cloneUrl:n.cloneUrl,key:n.key}},jp=async(e,t)=>{if(t===``)throw b(`refs add npm: requires a package name, e.g. npm:left-pad`);Gd(e,`resolving npm package '${t}'…`);let n=await hu(e.fetcher,t),r={cloneUrl:n.cloneUrl,key:n.key,npmPkgName:t};return n.directory!==void 0&&(r.npmDirectory=n.directory),r},Mp=(e,t)=>t.startsWith(`npm:`)?jp(e,t.slice(4)):Promise.resolve(Ap(e,t)),Np=(e,t)=>{if(e.npmPkgName===void 0)return e;let n=Y(`git_transport`,void 0,t);return{...e,cloneUrl:Cl(e.cloneUrl,n)}},Pp=e=>`ref '${e}' already exists — use refs edit or refs remove`,Fp=(e,t)=>{if(e.refs[t]!==void 0)throw ve(Pp(t))},Ip=async e=>{try{return await s(e,{withFileTypes:!0})}catch(e){if(V(e))return;throw e}},Lp=e=>e.filter(e=>e.isDirectory()).map(e=>e.name),Rp=async(e,t)=>{let n=await Ip(e);if(n===void 0)return{kind:`stop`};let r=Lp(n);if(r.includes(t))return{kind:`continue`,nextDir:h(e,t)};let i=r.find(e=>e.toLowerCase()===t.toLowerCase());return i===void 0?{kind:`stop`}:{kind:`collision`,name:i}},zp=async(e,t,n)=>{let[r,...i]=t;if(r===void 0)return;let a=await Rp(e,r);if(a.kind!==`stop`)return a.kind===`collision`?[...n,a.name].join(`/`):zp(a.nextDir,i,[...n,r])},Bp=[],Vp=async(e,t)=>{let n=await zp(e.sourcesDir,t.split(`/`),Bp);if(n!==void 0)throw ve(`checkout path for '${t}' collides case-insensitively with existing '${n}'`)},Hp=async e=>{try{return await i(e),!0}catch(e){if(V(e))return!1;throw e}},Up=async e=>{try{return await s(e)}catch(e){if(V(e))return;throw e}},Wp=async e=>{try{return(await i(e)).isDirectory()}catch(e){if(V(e))return;throw e}},Gp=async e=>{let t=await Up(e);if(t===void 0)return!0;if(t.length>0)return!1;try{await d(e)}catch(e){if(!V(e))throw e}return!0},Kp=async e=>{let t=await Wp(e);return t===void 0?!0:t?Gp(e):!1},qp=async(e,t)=>{t!==e.sourcesDir&&await Kp(t)&&await qp(e,te(t))},Jp=async(e,t)=>await Hp(t)?(Gs(e,t),await u(t,{force:!0,recursive:!0}),await qp(e,te(t)),{removedCheckout:!0}):{removedCheckout:!1,warning:`checkout was already missing`},Yp=(e,t)=>Object.fromEntries(Object.entries(e).filter(([e])=>e!==t)),Xp=async(e,t)=>{let n=await W(e);await $s(e,{...n,refs:Yp(n.refs,t)});let r=await X(e);await Ku(e,{...r,refs:Yp(r.refs,t)})},Zp=async(e,t)=>{let n=H(e.env),r=Ep(await W(n),t),i=U(n,r),{removedCheckout:a,warning:o}=await J(n,Op(r),()=>Jp(n,i));return await J(n,`home`,()=>Xp(n,r)),{data:{key:r,removed_checkout:a},warnings:Hd(o)}},Qp=e=>e.removed_checkout?[`removed ${e.key} (checkout deleted)`]:[`removed ${e.key} (checkout was already missing)`],$p=(e,t)=>{e.command(`remove`).description(`Remove a configured ref: its config/state entry AND its checkout directory.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let{data:n,warnings:r}=await Zp(t,e);Q(t,i,Qp(n),n,r)})()})},em=(e,t)=>{let n=e.refs[t];if(n===void 0)throw Error(`internal: matched ref key '${t}' is missing from config.refs`);return n},tm=(e,t)=>{if(!G(e))throw y(`checkout for '${t}' is missing — run: refs sync ${t}`)},nm=(e,t,n)=>{let r=e.packages?.[n];if(r===void 0)throw y(`no package '${n}' registered on ref '${t}'`);return r},rm=e=>`no ref matches '${e}' — run refs list, or add it: refs add <url>`,im=/^[a-z][a-z0-9+.-]*:\/\//iu,am=/^git@[^:/\s]+:[^\s]+$/u,om=e=>im.test(e)||am.test(e),sm=(e,t)=>{try{return dl(e,t)}catch{if(om(e))throw x(`query looks like a git url but is not a supported form — check the url (credentials are never accepted) or run: refs resolve <package|ref-suffix>`);return}},cm=(e,t,n)=>{let r=sm(t,n);if(r!==void 0){if(Object.hasOwn(e.refs,r.key))return{key:r.key};throw y(rm(t))}},lm=(e,t)=>{let n=[];for(let r of Object.keys(e.refs).toSorted()){let i=e.refs[r]?.packages?.[t];i!==void 0&&n.push({entry:i,key:z.parse(r)})}return n},um=(e,t)=>`package '${e}' is registered by more than one ref: ${t.join(`, `)} — use the full ref key`,dm=(e,t)=>{let n=lm(e,t),[r]=n;if(r!==void 0){if(n.length>1)throw b(um(t,n.map(e=>e.key)));return r}},fm=(e,t)=>{let n=t.split(`/`);for(let t=n.length-1;t>=1;--t){let r=n.slice(0,t).join(`/`),i=dm(e,r);if(i!==void 0)return{...i,name:r}}},pm=(e,t)=>{try{return Ep(e,t)}catch(e){throw e instanceof v&&e.code===`not_found`?y(rm(t)):e}},mm=(e,t,n)=>{let r=cm(e,t,n);if(r!==void 0)return r;let i=dm(e,t);if(i!==void 0)return{key:i.key,packageMatch:{...i,name:t}};let a=fm(e,t);return a===void 0?{key:pm(e,t)}:{key:a.key,packageMatch:a}},hm=(e,t)=>{if(e.packageMatch===void 0)return null;let{entry:n,name:r}=e.packageMatch;return{local_path:h(t,n.path),name:r,path:n.path}},gm=async(e,t,n)=>{let r=H(e.env),i=await W(r),a=mm(i,t,{allowFileUrls:kp(e.env)}),o=em(i,a.key),s=await X(r),c=U(r,a.key),l=Qo(Y(`sync_ttl`,o,i.settings)),u=s.refs[a.key]?.last_fetched_at;return{key:a.key,...u===void 0?{}:{last_fetched_at:u},local_path:c,missing:!G(c),package:hm(a,c),stale:hp(u,l,n)}},_m=(e,t)=>{let n=[`ref: ${e.key}`,`path: ${e.local_path}`,...vp({lastFetchedAt:e.last_fetched_at,missing:e.missing,now:t,stale:e.stale})];return e.package!==null&&n.push(`package: ${e.package.name}`,`package path: ${e.package.local_path}`),n},vm=(e,t)=>{e.command(`resolve`).description(`Resolve a git url, npm package name, import path, or ref-key suffix to its ref/package.`).argument(`<query>`,`git url, npm package name, import path, or unique ref-key suffix`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let n=Date.now(),r=await gm(t,e,n);Q(t,i,_m(r,n),r)})()})},ym={},bm=async(e,t)=>{if(!G(t))return{tags:[]};try{return{tags:await kc(e.runner,t,5)}}catch(e){return{tags:[],warning:`could not list tags: ${Ud(e)}`}}},xm=async(e,t,n,r)=>{let i=H(e.env),a=await W(i),o=Ep(a,t),s=em(a,o),c=await X(i),l=U(i,o),{packages:u,...d}=s,f=n.tags?await bm(e,l):void 0,p=c.refs[o]??ym;return{data:{...d,key:o,local_path:l,missing:!G(l),...n.packages?{packages:u??{}}:{},packages_count:Object.keys(u??{}).length,...f===void 0?{}:{sample_tags:f.tags},stale:hp(p.last_fetched_at,Qo(Y(`sync_ttl`,s,a.settings)),r),state:p},warnings:Hd(f?.warning)}},Sm=(e,t)=>{let n=[`ref: ${e.key}`,`description: ${e.description}`,`url: ${e.url}`,`path: ${e.local_path}`,...vp({lastFetchedAt:e.state.last_fetched_at,missing:e.missing,now:t,stale:e.stale})];return e.sample_tags!==void 0&&e.sample_tags.length>0&&n.push(`tags: ${e.sample_tags.join(`, `)}`),n},Cm=(e,t)=>{e.command(`show`).description(`Show a configured ref: entry, state, local path, package count; --packages/--tags add the package map and sample tags to --json.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).option(`--packages`,`include the ref's full package map in --json output (off by default)`).option(`--tags`,`include sample tags in --json output (human output always probes for them)`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let r={packages:n.packages===!0,tags:!i.json||n.tags===!0},a=Date.now(),{data:o,warnings:s}=await xm(t,e,r,a);Q(t,i,Sm(o,a),o,s)})()})},wm=(e,t)=>{let n={head_sha:t.headSha,last_fetched_at:new Date().toISOString()},r=t.effectiveCloneMode??e?.effective_clone_mode;return r!==void 0&&(n.effective_clone_mode=r),n},Tm=async(e,t,n)=>{let r=await W(e),i=r.refs[t];i!==void 0&&(r.refs[t]={...i,default_branch:n},await $s(e,r))},Em=(e,t,n)=>J(e,`home`,async()=>{n.branchRenamedTo!==void 0&&await Tm(e,t,n.branchRenamedTo);let r=await X(e);r.refs[t]=wm(r.refs[t],n),await Ku(e,r)}),Dm=async(e,t,n)=>{try{await J(e,`home`,async()=>{let r=await X(e);r.refs[t]={...r.refs[t],last_error:n},await Ku(e,r)})}catch{}},Om=e=>{let t=0,n=[];return{acquire:()=>{if(t<e)return t+=1,Promise.resolve();let{promise:r,resolve:i}=Promise.withResolvers();return n.push(()=>{t+=1,i()}),r},release:()=>{--t;let e=n.shift();e!==void 0&&e()}}},km=async(e,t)=>{await e.acquire();try{return await t()}finally{e.release()}},Am=(e,t,n)=>`checkout at ${e} points at '${q(t)}' — expected '${q(n)}'; remove the checkout directory or run refs remove before retrying`,jm=e=>e.exitCode===0?e.stdout.trim():`(no origin remote)`,Mm=(e,t)=>{try{return dl(e,{allowFileUrls:t}).key}catch{return}},Nm=async(e,t)=>{let n=await e.run(`git`,[`remote`,`get-url`,`origin`],{cwd:t.dest}),r=jm(n),i=Mm(t.expectedUrl,t.allowFileUrls),a=Mm(r,t.allowFileUrls);if(i===void 0||a!==i)throw ve(Am(t.dest,r,t.expectedUrl))},Pm=e=>`checkout at ${e} exists but is not refs-managed — remove it (rm -rf ${e}) and retry`,Fm=async(e,t)=>{let n=await e.run(`git`,[`config`,`--local`,`core.hooksPath`],{cwd:t.dest});if(n.exitCode!==0||n.stdout.trim()!==t.hooksDir)throw ve(Pm(t.dest))},Im=async(e,t)=>{await a(te(t.dest),{recursive:!0}),Gd(e,`cloning ${q(t.cloneUrl)} into ${t.dest}…`);let n=await bc(e.runner,t);return n.warning===void 0?{effectiveMode:n.effectiveMode}:{effectiveMode:n.effectiveMode,warning:n.warning}},Lm=async(e,t)=>(Gs(t.home,t.dest),G(t.dest)?(await Nm(e.runner,{allowFileUrls:t.allowFileUrls,dest:t.dest,expectedUrl:t.cloneUrl}),await Fm(e.runner,{dest:t.dest,hooksDir:t.hooksDir}),{}):Im(e,t)),Rm=(e,t)=>`checkout for '${e}' at ${t} is missing or corrupt (git rev-parse HEAD failed) — run: refs remove ${e}, then refs add <source> --dry-run again`,zm=(e,t,n)=>`checkout for '${e}' at ${t} has a HEAD sha refs cannot store yet (${n.length} hex chars, expected 40) — only SHA-1 repositories are supported for now; \`--object-format=sha256\` repositories are not yet supported`,Bm=async(e,t)=>{await Nm(e,t),await Fm(e,{dest:t.dest,hooksDir:t.hooksDir});let n=await e.run(`git`,[`rev-parse`,`HEAD`],{cwd:t.dest});if(n.exitCode!==0)throw x(Rm(t.key,t.dest));let r=n.stdout.trim();if(!Hu.shape.head_sha.safeParse(r).success)throw x(zm(t.key,t.dest,r));return r},Vm=(e,t,n)=>`sync produced a HEAD sha for '${e}' at ${t} that refs cannot store yet (${n.length} hex chars) — only SHA-1 repositories are supported for now`,Hm=(e,t,n)=>{if(!Hu.shape.head_sha.safeParse(n).success)throw x(Vm(e,t,n));return n},Um=(e,t,n)=>{let r={effectiveCloneMode:t.effectiveMode,headSha:n.headSha,status:`cloned`};return n.actualBranch!==e.ref.default_branch&&(r.branchRenamedTo=n.actualBranch),t.warning!==void 0&&(r.warning=t.warning),r},Wm=async(e,t,n)=>{await a(te(n),{recursive:!0});let r=Y(`clone_mode`,t.ref,t.settings),i=await bc(e.runner,{cloneUrl:t.ref.url,dest:n,hooksDir:t.home.hooksDir,mode:r}),o=await Sc(e.runner,n),s=await Bm(e.runner,{allowFileUrls:kp(e.env),dest:n,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.key});return Um(t,i,{actualBranch:o,headSha:s})},Gm=async(e,t,n)=>{await Fm(e.runner,{dest:n,hooksDir:t.home.hooksDir}),await Nm(e.runner,{allowFileUrls:kp(e.env),dest:n,expectedUrl:t.ref.url});let r=await Oc(e.runner,{defaultBranch:t.ref.default_branch,dir:n}),i={headSha:Hm(t.key,n,r.newSha),status:r.status};return r.branchRenamedTo!==void 0&&(i.branchRenamedTo=r.branchRenamedTo),r.warning!==void 0&&(i.warning=r.warning),i},Km=(e,t)=>J(t.home,Op(t.key),()=>{let n=U(t.home,t.key);return Gs(t.home,n),G(n)?Gm(e,t,n):Wm(e,t,n)}),qm=e=>{let t=[];e.branchRenamedTo!==void 0&&t.push(`default branch renamed to ${e.branchRenamedTo}`),e.warning!==void 0&&t.push(e.warning);let[n]=t;if(n!==void 0)return t.join(` | `)},Jm=(e,t)=>{let n={key:e,status:t.status},r=qm(t);return r!==void 0&&(n.warning=r),n},Ym=async(e,t)=>{try{let n=await Km(e,t);return await Em(t.home,t.key,n),Jm(t.key,n)}catch(e){let n=Ud(e);return await Dm(t.home,t.key,n),{error:n,key:t.key,status:`failed`}}},Xm=(e,t)=>e.status===`rejected`?{error:Ud(e.reason),key:t,status:`failed`}:e.value,Zm=async(e,t)=>{let n=Om(4);return(await Promise.allSettled(t.map(t=>km(n,()=>Ym(e,t))))).map((e,n)=>{let r=t[n];if(r===void 0)throw Error(`internal: sync target at index ${n} is missing`);return Xm(e,r.key)})},Qm=(e,t,n)=>({home:e,key:n,ref:em(t,n),settings:t.settings}),$m=(e,t,n)=>n.length===0?Object.keys(t.refs).toSorted().map(n=>Qm(e,t,z.parse(n))):n.map(n=>Qm(e,t,Ep(t,n))),eh=(e,t,n)=>{let r=Date.now();return t.filter(t=>{let i=Qo(Y(`sync_ttl`,t.ref,t.settings)),a=hp(n.refs[t.key]?.last_fetched_at,i,r),o=!G(U(e,t.key));return a||o})},th=async(e,t,n)=>{if(!n)return t;let r=await X(e);return eh(e,t,r)},nh=async(e,t)=>{let n=H(e.env),r=await W(n),i=$m(n,r,t.refs),a=await Zm(e,await th(n,i,t.staleOnly));return{failedCount:a.filter(e=>e.status===`failed`).length,results:a}},rh=[`updated`,`fresh`,`cloned`,`restored`,`failed`],ih={cloned:`Cloned`,failed:`Failed`,fresh:`Fresh`,restored:`Restored`,updated:`Updated`},ah=e=>{let t={cloned:[],failed:[],fresh:[],restored:[],updated:[]};for(let n of e)t[n.status].push(n);return t},oh=e=>e.status===`failed`?` ${e.key}: ${e.error??`unknown error`}`:e.warning===void 0?` ${e.key}`:` ${e.key} (${e.warning})`,sh=e=>{let t=ah(e),n=[rh.map(e=>`${ih[e]} (${t[e].length})`).join(` / `)];for(let e of rh)for(let r of t[e])n.push(oh(r));return n},ch=(e,t)=>({refs:e,staleOnly:t.staleOnly===!0}),lh=(e,t)=>{e.command(`sync`).description(`Fetch (or re-clone, if the checkout is missing) configured refs — all by default.`).argument(`[refs...]`,`ref keys or unique suffixes to sync (default: every configured ref)`).option(`--stale-only`,`skip refs whose last sync is still within their ref's sync_ttl`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let r=await nh(t,ch(e,n));Q(t,i,sh(r.results),{results:r.results}),r.failedCount>0&&(process.exitCode=_.UNEXPECTED)})()})},uh=(e,t,n)=>n===void 0?e.tag_format:nm(e,t,n).tag_format??e.tag_format,dh=async(e,t)=>{let n=H(e.env),r=await W(n),i=Ep(r,t.query),a=em(r,i),o=uh(a,i,t.opts.packageName),s=U(n,i);tm(s,i);let c=await Wc(e.runner,s,o,t.version);return{key:i,ref_path:`refs/tags/${c}`,tag:c,version:t.version}},fh=e=>[`${e.key}@${e.version} -> ${e.tag}`],ph=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},mh=[up,pp,$p,vm,Cm,lh,(e,t)=>{e.command(`tag`).description(`Resolve a version to its git tag, via the ref's (or a package's) tag_format.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).argument(`<version>`,`version to resolve, e.g. 4.1.0`).option(`--package <name>`,`resolve against this package's tag_format instead of the ref's`).action((e,n,r,i)=>{let a=Z(i);return $(t,a,async()=>{let i=await dh(t,{opts:ph(r),query:e,version:n});Q(t,a,fh(i),i)})()})}],hh=e=>e.description===void 0?{path:e.path}:{description:e.description,path:e.path},gh=(e,t,n)=>e.length>0?Object.fromEntries(e.map(e=>[e.name,hh(e)])):n===void 0?{}:{[n]:{path:t??`.`}},_h=e=>{let t=e.description??``;return e.tag_format===void 0?{description:t,path:e.path}:{description:t,path:e.path,tag_format:e.tag_format}},vh=e=>{let t=Object.entries(e);if(t.length!==0)return Object.fromEntries(t.map(([e,t])=>[e,_h(t)]))},yh=e=>e.description===void 0||e.description===``,bh=e=>Object.entries(e).filter(([,e])=>yh(e)).map(([e])=>e).toSorted(),xh=e=>{let t=bh(e);if(t.length!==0)throw x(`packages without a detected description: ${t.join(`, `)} — run the two-phase flow instead: refs add <source> --dry-run --json > proposal.json, fill in the package descriptions, then refs add --proposal proposal.json`)},Sh=e=>{if(Object.keys(e).length!==0)return e},Ch=e=>{if(e===null)throw x(`tag_format_candidate must be set to a valid tag format (containing '{version}') before finalizing — edit the proposal and provide one, or add the ref manually`);return e},wh=e=>e.packages===void 0?{default_branch:e.default_branch,description:e.description,tag_format:e.tag_format,url:e.url}:{default_branch:e.default_branch,description:e.description,packages:e.packages,tag_format:e.tag_format,url:e.url},Th=async(e,t,n)=>{let r=await Sc(e.runner,t),i=Hc(await kc(e.runner,t));return Gd(e,`detecting workspace packages…`),{defaultBranch:r,packages:gh(await Sd(t),n.npmDirectory,n.npmPkgName),tagFormatCandidate:i}},Eh=(e,t)=>J(t.home,Op(t.resolved.key),async()=>{let n=await Lm(e,{allowFileUrls:kp(e.env),cloneUrl:t.resolved.cloneUrl,dest:t.dest,home:t.home,hooksDir:t.home.hooksDir,mode:t.cloneMode}),r={fields:await Th(e,t.dest,t.resolved)};return n.effectiveMode!==void 0&&(r.effectiveMode=n.effectiveMode),n.warning!==void 0&&(r.warning=n.warning),r}),Dh=e=>{let t={default_branch:e.cloneResult.fields.defaultBranch,description:``,key:e.resolved.key,packages:e.cloneResult.fields.packages,tag_format_candidate:e.cloneResult.fields.tagFormatCandidate,url:e.resolved.cloneUrl},n={dest:e.dest,proposal:t};return e.cloneResult.effectiveMode!==void 0&&(n.effectiveCloneMode=e.cloneResult.effectiveMode),e.cloneResult.warning!==void 0&&(n.warning=e.cloneResult.warning),n},Oh=async(e,t)=>{let n=H(e.env),r=await W(n),i=Np(await Mp(e,t),r.settings);Fp(r,i.key),await Vp(n,i.key);let a=U(n,i.key),o=Y(`clone_mode`,void 0,r.settings),s=await Eh(e,{cloneMode:o,dest:a,home:n,resolved:i});return Dh({cloneResult:s,dest:a,resolved:i})},kh=(e,t,n)=>J(e,`home`,async()=>{Fp(await W(e),t);let r=await X(e),i=r.refs[t],a=n??i?.effective_clone_mode,o={...i,pending_proposal_at:new Date().toISOString()};a!==void 0&&(o.effective_clone_mode=a),r.refs[t]=o,await Ku(e,r)}),Ah=(e,t)=>{let n=cs.safeParse(e);if(!n.success)throw x(k(n.error));let r=Uu.safeParse(t);if(!r.success)throw x(k(r.error));return{config:n.data,state:r.data}},jh=async(e,t)=>{let n=await W(e.home);Fp(n,e.ref.key);let r=wh(e.ref);n.refs[e.ref.key]=r;let i=await X(e.home);return i.refs[e.ref.key]={effective_clone_mode:e.effectiveCloneMode??i.refs[e.ref.key]?.effective_clone_mode??Y(`clone_mode`,void 0,n.settings),head_sha:t,last_fetched_at:new Date().toISOString()},{...Ah(n,i),entry:r}},Mh=async(e,t)=>{let n=kp(e.env),r=await J(t.home,Op(t.ref.key),()=>(Gs(t.home,t.dest),Bm(e.runner,{allowFileUrls:n,dest:t.dest,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.ref.key})));return J(t.home,`home`,async()=>{let{config:e,entry:n,state:i}=await jh(t,r);return await Ku(t.home,i),await $s(t.home,e),{entry:n,key:t.ref.key}})},Nh=(e,t)=>t===`-`?e.readStdin():o(t,`utf8`),Ph=e=>{try{return JSON.parse(e)}catch(e){throw x(`invalid JSON in proposal: ${Ud(e)}`)}},Fh=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Ih=e=>Fh(e)&&`ok`in e&&!(`key`in e),Lh=e=>{if(!Ih(e))return e;if(e.ok===!1)throw x(`proposal file contains a failed refs envelope (ok is false) — re-run the dry-run`);if(Fh(e.data))return e.data;throw x(`proposal file is a refs envelope without a usable data object — re-run the dry-run`)},Rh=e=>e.code===`unrecognized_keys`,zh=e=>e.path.length===0,Bh=(e,t)=>{let n=t.toSorted().map(e=>`"${e}"`).join(`, `);return e===``?`✖ unrecognized key(s) in proposal: ${n}`:`✖ unrecognized key(s) in proposal at ${e}: ${n}`},Vh=e=>{let t=new Map;for(let n of e){let e=ct(n.path);t.set(e,[...t.get(e)??[],...n.keys])}return[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>Bh(e,t))},Hh=e=>`✖ invalid proposal: ${e.message}`,Uh=e=>{let t=e.issues.filter(e=>Rh(e)),n=e.issues.filter(e=>!Rh(e)),r=n.filter(e=>zh(e));if(t.length===0&&r.length===0)return k(e);let i=n.filter(e=>!zh(e)),a=[...Vh(t),...r.map(e=>Hh(e))];return i.length>0&&a.push(k({issues:i})),a.join(`
|
|
368
|
+
Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(e=>t.is(e))&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function Rd(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function zd(){if(g.env.NO_COLOR||g.env.FORCE_COLOR===`0`||g.env.FORCE_COLOR===`false`)return!1;if(g.env.FORCE_COLOR||g.env.CLICOLOR_FORCE!==void 0)return!0}new Ld;const Bd=[],Vd=e=>Array.isArray(e)?e:[e],Hd=e=>e===void 0?Bd:[e],Ud=e=>e instanceof Error?e.message:String(e),Z=e=>{let t=e.optsWithGlobals();return{json:t.json===!0,verbose:t.verbose===!0}},Q=(e,t,n,r,i)=>{if(t.json){let t={data:r,ok:!0,warnings:i??Bd};e.out(JSON.stringify(t));return}for(let t of Vd(n))e.out(t);for(let t of i??Bd)e.errLine(`refs: warning: ${t}`)},Wd=(e,t,n)=>{if(t.json){let t={error:{code:n.code,message:n.message},ok:!1};e.out(JSON.stringify(t));return}e.errLine(`refs: ${n.message}`)},Gd=(e,t)=>{e.errLine(`refs: ${t}`)},$=(e,t,n)=>async()=>{try{await n()}catch(n){let r=be(n,{verbose:t.verbose});Wd(e,t,r),process.exitCode=r.exitCode}},Kd=async e=>{let t=await e.runner.run(`git`,[`--version`]);return t.exitCode===0?{detail:t.stdout.trim(),name:`git`,status:`ok`}:{detail:t.stderr.trim()||`git --version exited with code ${t.exitCode}`,name:`git`,status:`fail`}},qd=/^v(?<major>\d+)\.(?<minor>\d+)/u,Jd=e=>{let t=qd.exec(e),n=t?.groups?.major,r=t?.groups?.minor;if(n!==void 0&&r!==void 0)return{major:Number(n),minor:Number(r)}},Yd=e=>e===void 0?!1:e.major>24||e.major===24&&e.minor>=2,Xd=e=>{let{nodeVersion:t}=e;return Yd(Jd(t))?{detail:t,name:`node`,status:`ok`}:{detail:`${t} does not satisfy the required range >=24.2`,name:`node`,status:`fail`}},Zd=()=>cs.parse({meta:{cli_version:`0.0.0`,schema_version:1},refs:{},settings:{}}),Qd=async e=>{try{return{config:await W(e)}}catch(e){return{config:Zd(),errorMessage:Ud(e)}}},$d=e=>e===void 0?{detail:`config is present and matches the current schema`,name:`config`,status:`ok`}:{detail:e,name:`config`,status:`fail`},ef=(e,t)=>Object.keys(t.refs).map(t=>({dest:U(e,z.parse(t)),key:t})).filter(e=>G(e.dest)),tf=[`pre-commit`,`pre-push`],nf=async(t,r)=>{try{return await e(h(t.hooksDir,r),n.X_OK),!0}catch{return!1}},rf=async e=>{let t=await Promise.all(tf.map(t=>nf(e,t)));return tf.filter((e,n)=>!t[n])},af=async(e,t,n)=>{let r=await e.runner.run(`git`,[`config`,`--local`,`--get`,`core.hooksPath`],{cwd:n});return r.exitCode===0&&r.stdout.trim()===t.hooksDir},of=e=>e.missingHooks.length>0?{detail:`${e.missingHooks.map(e=>`hooks/${e}`).join(`, `)} missing or not executable — run: refs init`,name:`hooks-guard`,status:`fail`}:e.badKeys.length>0?{detail:`core.hooksPath not set for: ${e.badKeys.join(`, `)} — run: refs init`,name:`hooks-guard`,status:`fail`}:{detail:`${tf.map(e=>`hooks/${e}`).join(`, `)} present; ${e.checkoutCount} checkout(s) guarded`,name:`hooks-guard`,status:`ok`},sf=async(e,t,n)=>{let r=ef(t,n),[i,a]=await Promise.all([rf(t),Promise.all(r.map(n=>af(e,t,n.dest)))]),o=r.filter((e,t)=>!a[t]).map(e=>e.key);return of({badKeys:o,checkoutCount:r.length,missingHooks:i})},cf=async(e,t)=>{let n=await e.runner.run(`git`,[`status`,`--porcelain`],{cwd:t.dest});return n.exitCode===0?{broken:!1,detail:``,dirty:n.stdout.trim()!==``,key:t.key}:{broken:!0,detail:n.stderr.trim(),dirty:!1,key:t.key}},lf=e=>{let t=e.filter(e=>e.broken);if(t.length>0)return{detail:t.map(e=>`${e.key}: git status failed — ${e.detail}`).join(`; `),name:`dirty-checkouts`,status:`fail`};let n=e.filter(e=>e.dirty).map(e=>e.key);return n.length===0?{detail:`no local changes in any checkout`,name:`dirty-checkouts`,status:`ok`}:{detail:`local changes will be discarded on next sync: ${n.join(`, `)}`,name:`dirty-checkouts`,status:`warn`}},uf=async(e,t,n)=>{let r=ef(t,n),i=await Promise.all(r.map(t=>cf(e,t)));return lf(i)},df=async e=>{try{return await X(e)}catch{return Uu.parse({})}},ff=async e=>{try{return(await s(e,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(e){if(V(e))return[];throw e}},pf=async(e,t)=>{if(G(e))return[[...t]];let n=await ff(e);return(await Promise.all(n.map(n=>pf(h(e,n),[...t,n])))).flat()},mf=(e,t,n)=>{let r=e.refs[t]?.pending_proposal_at;return r!==void 0&&n-Date.parse(r)<864e5},hf=(e,t,n)=>mf(t,e.key,n)?`${e.key}: pending add`:`${e.key}: orphan — remove with: rm -rf ${e.dest}`,gf=(e,t)=>({dest:h(e.sourcesDir,...t),key:t.join(`/`)}),_f=async(e,t,n)=>{let r=(await pf(e.sourcesDir,[])).map(t=>gf(e,t)).filter(e=>!Object.hasOwn(t.refs,e.key));if(r.length===0)return{detail:`no orphaned checkouts under sources/`,name:`orphans`,status:`ok`};let i=Date.now();return{detail:r.map(e=>hf(e,n,i)).join(`; `),name:`orphans`,status:`warn`}},vf=[`.agents`,`skills`,`refs`,`SKILL.md`],yf=[`skills`,`refs`,`SKILL.md`],bf=[`.claude`,`skills`,`refs`,`SKILL.md`],xf=`npx skills add kaisers-io/refs`,Sf=`npm i -g @kaisers-io/refs@latest`,Cf=(e,t)=>e===void 0?void 0:{display:t,path:e},wf=e=>{let{dirName:t,env:n,home:r,overrideName:i}=e,a=n[i]?.trim();return a!==void 0&&a.length>0?{display:a,path:a}:Cf(r===void 0?void 0:h(r,t),`~/${t}`)},Tf=e=>{let t=e.env.HOME;return[{label:`shared ~/.agents`,root:Cf(t,`~/.agents`),segments:vf},{label:`Claude Code`,root:wf({dirName:`.claude`,env:e.env,home:t,overrideName:`CLAUDE_CONFIG_DIR`}),segments:yf},{label:`Codex`,root:wf({dirName:`.codex`,env:e.env,home:t,overrideName:`CODEX_HOME`}),segments:yf},{label:`project ./.agents`,root:Cf(e.cwd,`./.agents`),segments:vf},{label:`project ./.claude`,root:Cf(e.cwd,`./.claude`),segments:bf}].flatMap(({label:e,root:t,segments:n})=>t===void 0?[]:[{display:t.display,label:e,path:h(t.path,...n)}])},Ef=async(e,t)=>{try{let n=await c(e);return{label:t,realPath:n,source:await o(n,`utf8`)}}catch{return}},Df=e=>{let t=new Map;for(let n of e)t.has(n.realPath)||t.set(n.realPath,n);return[...t.values()]},Of=/^---\r?\n(?<body>[\s\S]*?)\r?\n---/u,kf=/^\s*cli_version:\s*["']?(?<version>[^"'\s]+)["']?\s*$/mu,Af=e=>{let t=Of.exec(e)?.groups?.body;if(t!==void 0)return kf.exec(t)?.groups?.version},jf=/^\d+\.\d+\.\d+$/u,Mf=e=>{if(jf.test(e))return e.split(`.`).map(Number)},Nf=(e,t)=>{if(e===t)return`match`;let n=Mf(e),r=Mf(t);if(n===void 0||r===void 0)return`unknown`;let i=n.findIndex((e,t)=>e!==r[t]);return i===-1?`match`:(n[i]??0)>(r[i]??0)?`cli-older`:`skill-older`},Pf={"cli-older":(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — update the CLI: ${Sf}`,match:(e,t)=>`the refs skill is installed and matches this CLI (${t})`,"skill-older":(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — update the skill: ${xf}`,unknown:(e,t)=>`the refs skill targets CLI ${e} but this CLI is ${t} — reinstall both: ${Sf} and ${xf}`},Ff=e=>{let{cliVersion:t,label:n,skillVersion:r}=e;if(r===void 0)return{detail:`the refs skill (${n}) predates the version gate — update it: ${xf}`,name:`skill`,status:`warn`};let i=Nf(r,t);return{detail:`${n}: ${Pf[i](r,t)}`,name:`skill`,status:i===`match`?`ok`:`warn`}},If=e=>({detail:`refs skill not found in the locations this check knows about (${e.map(e=>e.display).join(`, `)}) — an install anywhere else is invisible here and still works; if it really is missing: ${xf}`,name:`skill`,status:`warn`}),Lf=async e=>{let t=Tf(e),n=await Promise.all(t.map(e=>Ef(e.path,e.label))),r=Df(n.filter(e=>e!==void 0)).map(t=>Ff({cliVersion:e.cliVersion,label:t.label,skillVersion:Af(t.source)}));return r.find(e=>e.status!==`ok`)??r[0]??If(t)},Rf=/^(?<user>[^/\s@]+)@(?<host>[^:/\s]+):/u,zf=e=>e===``?{}:{user:e},Bf=e=>e===``?{}:{port:e},Vf=e=>{try{let t=new URL(e);return t.protocol===`ssh:`?{host:t.hostname,...zf(t.username),...Bf(t.port)}:void 0}catch{return}},Hf=e=>{let t=Rf.exec(e),n=t?.groups?.host;return n===void 0?Vf(e):{host:n,user:t?.groups?.user??`git`}},Uf=e=>e.port===void 0?e.host:`${e.host}:${e.port}`,Wf=e=>e.user===void 0?Uf(e):`${e.user}@${Uf(e)}`,Gf=e=>{let t=Object.values(e.refs).map(e=>Hf(e.url)).filter(e=>e!==void 0),n=new Map;for(let e of t)n.set(Wf(e),e);return[...n.values()].toSorted((e,t)=>Wf(e).localeCompare(Wf(t)))},Kf=/Permission denied/u,qf=[/Could not resolve hostname/u,/Connection refused/u,/Host key verification failed/u,/timed out/u],Jf=e=>e.user===void 0?e.host:`${e.user}@${e.host}`,Yf=e=>{let t=[`-o`,`ConnectTimeout=5`,`-o`,`BatchMode=yes`],n=Jf(e);return e.port===void 0?[...t,`-T`,n]:[...t,`-p`,e.port,`-T`,n]},Xf=async(e,t,n)=>{let r=Wf(t),i=await e.runner.run(`ssh`,Yf(t),{timeoutMs:n});return i.timedOut===!0?{host:r,outcome:`timeout`}:Kf.test(i.stderr)?{host:r,outcome:`denied`}:qf.some(e=>e.test(i.stderr))?{detail:i.stderr.trim(),host:r,outcome:`connection-warn`}:{host:r,outcome:`ok`}},Zf=(e,t)=>{let n=e.filter(e=>e.outcome===`timeout`).map(e=>e.host);if(n.length!==0)return{detail:`ssh probe timed out after ${t/1e3}s: ${n.join(`, `)}`,name:`ssh-auth`,status:`fail`}},Qf=e=>{let t=e.filter(e=>e.outcome===`denied`).map(e=>e.host);if(t.length!==0)return{detail:`ssh permission denied for: ${t.join(`, `)}`,name:`ssh-auth`,status:`fail`}},$f=e=>{let t=e.filter(e=>e.outcome===`connection-warn`);if(t.length!==0)return{detail:`ssh connection issue, treated as warn: ${t.map(e=>`${e.host} (${e.detail??``})`).join(`; `)}`,name:`ssh-auth`,status:`warn`}},ep=e=>({detail:`ssh auth ok for: ${e.map(e=>e.host).join(`, `)}`,name:`ssh-auth`,status:`ok`}),tp=(e,t)=>Zf(e,t)??Qf(e)??$f(e)??ep(e),np=async(e,t,n)=>{let r=Gf(t);if(r.length===0)return;let i=n?.timeoutMs??1e4,a=await Promise.all(r.map(t=>Xf(e,t,i)));return tp(a,i)},rp=async e=>{try{return await e.run()}catch(t){return{detail:`check crashed: ${Ud(t)}`,name:e.name,status:`fail`}}},ip=async e=>{let[t,...n]=e;if(t===void 0)return[];let r=await rp(t),i=await ip(n);return r===void 0?i:[r,...i]},ap=e=>{let{configLoad:t,ctx:n,home:r,state:i}=e;return[{name:`git`,run:()=>Kd(n)},{name:`node`,run:()=>Promise.resolve(Xd(n))},{name:`config`,run:()=>Promise.resolve($d(t.errorMessage))},{name:`hooks-guard`,run:()=>sf(n,r,t.config)},{name:`dirty-checkouts`,run:()=>uf(n,r,t.config)},{name:`orphans`,run:()=>_f(r,t.config,i)},{name:`skill`,run:()=>Lf(n)},{name:`ssh-auth`,run:()=>np(n,t.config)}]},op=async e=>{let t=H(e.env),n=await Qd(t),r=await df(t);return ip(ap({configLoad:n,ctx:e,home:t,state:r}))},sp={fail:`FAIL`,ok:`OK`,warn:`WARN`},cp=e=>e.map(e=>`[${sp[e.status]}] ${e.name}: ${e.detail}`),lp=e=>e.some(e=>e.status===`fail`),up=(e,t)=>{e.command(`doctor`).description(`Run environment/integrity checks (git, node, config, hooks, checkouts, ssh).`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let e=await op(t);Q(t,r,cp(e),{checks:e}),lp(e)&&(process.exitCode=_.UNEXPECTED)})()})},dp=async e=>{let t=H(e.env),n=await J(t,`home`,()=>lc(t,Cd));return n===`migrated`?{backup:Vs(t),result:n}:{backup:null,result:n}},fp=e=>e.result===`migrated`&&e.backup!==null?`config migrated (backup: ${ee(e.backup)})`:e.result===`seeded`?`config seeded`:`config up to date`,pp=(e,t)=>{e.command(`migrate`).description(`Migrate the refs config to the current schema, seeding it if absent.`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let e=await dp(t);Q(t,r,fp(e),e)})()})},mp=`never`,hp=(e,t,n)=>e===void 0||n-Date.parse(e)>t,gp=(e,t)=>`${e} ${t}${e===1?``:`s`} ago`,_p=(e,t)=>{if(e===void 0)return mp;let n=t-Date.parse(e);if(Number.isNaN(n))return mp;let r=Math.floor(n/1e3);if(r<60)return`just now`;let i=Math.floor(r/60);if(i<60)return gp(i,`minute`);let a=Math.floor(i/60);if(a<24)return gp(a,`hour`);let o=Math.floor(a/24);return o<365?gp(o,`day`):gp(Math.floor(o/365),`year`)},vp=e=>{let t=_p(e.lastFetchedAt,e.now),n=[`synced: ${t}`];return e.stale&&t!==mp&&n.push(`status: stale`),e.missing&&n.push(`missing: checkout not found — run: refs sync`),n},yp=(e,t,n)=>{let r=e.state.refs[t],i=Qo(Y(`sync_ttl`,n,e.settings)),a=Object.keys(n.packages??{}).toSorted();return{clone_mode:Y(`clone_mode`,n,e.settings),description:n.description,key:t,...r?.last_fetched_at===void 0?{}:{last_fetched_at:r.last_fetched_at},missing:!G(U(e.home,z.parse(t))),...e.includePackages?{packages:a}:{},packages_count:a.length,stale:hp(r?.last_fetched_at,i,e.now)}},bp=e=>{let t={home:e.home,includePackages:e.includePackages,now:e.now,settings:e.config.settings,state:e.state};return Object.entries(e.config.refs).map(([e,n])=>yp(t,e,n)).toSorted((e,t)=>e.key.localeCompare(t.key))},xp=async(e,t,n)=>{let r=H(e.env),i=await W(r),a=await X(r);return bp({config:i,home:r,includePackages:t,now:n,state:a})},Sp=(e,t)=>[`ref: ${e.key}`,`description: ${e.description}`,...vp({lastFetchedAt:e.last_fetched_at,missing:e.missing,now:t,stale:e.stale})],Cp=(e,t)=>e.length===0?[`no refs configured — run: refs add <source>`]:e.reduce((e,n,r)=>(r>0&&e.push(``),e.push(...Sp(n,t)),e),[]),wp=e=>e.split(`/`),Tp=(e,t)=>{let n=wp(e);if(t.length>n.length)return!1;let r=n.length-t.length;return t.every((e,t)=>e===n[r+t])},Ep=(e,t)=>{if(Object.hasOwn(e.refs,t))return z.parse(t);let n=wp(t),r=Object.keys(e.refs).filter(e=>Tp(e,n)).toSorted(),[i]=r;if(i===void 0)throw y(`no ref matches '${t}'`);if(r.length>1)throw b(`'${t}' matches more than one ref: ${r.join(`, `)}`);return z.parse(i)},Dp=(e,t)=>{e.command(`list`).description(`List configured refs with their staleness/missing checkout status.`).option(`--packages`,`include each ref's package names in --json output (off by default)`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let n=Date.now(),i=await xp(t,e.packages===!0,n);Q(t,r,Cp(i,n),i)})()})},Op=e=>`ref.${e.replaceAll(`/`,`_`)}`,kp=e=>e.REFS_ALLOW_FILE_URLS===`1`,Ap=(e,t)=>{let n=dl(t,{allowFileUrls:kp(e.env)});return{cloneUrl:n.cloneUrl,key:n.key}},jp=async(e,t)=>{if(t===``)throw b(`refs add npm: requires a package name, e.g. npm:left-pad`);Gd(e,`resolving npm package '${t}'…`);let n=await hu(e.fetcher,t),r={cloneUrl:n.cloneUrl,key:n.key,npmPkgName:t};return n.directory!==void 0&&(r.npmDirectory=n.directory),r},Mp=(e,t)=>t.startsWith(`npm:`)?jp(e,t.slice(4)):Promise.resolve(Ap(e,t)),Np=(e,t)=>{if(e.npmPkgName===void 0)return e;let n=Y(`git_transport`,void 0,t);return{...e,cloneUrl:Cl(e.cloneUrl,n)}},Pp=e=>`ref '${e}' already exists — use refs edit or refs remove`,Fp=(e,t)=>{if(e.refs[t]!==void 0)throw ve(Pp(t))},Ip=async e=>{try{return await s(e,{withFileTypes:!0})}catch(e){if(V(e))return;throw e}},Lp=e=>e.filter(e=>e.isDirectory()).map(e=>e.name),Rp=async(e,t)=>{let n=await Ip(e);if(n===void 0)return{kind:`stop`};let r=Lp(n);if(r.includes(t))return{kind:`continue`,nextDir:h(e,t)};let i=r.find(e=>e.toLowerCase()===t.toLowerCase());return i===void 0?{kind:`stop`}:{kind:`collision`,name:i}},zp=async(e,t,n)=>{let[r,...i]=t;if(r===void 0)return;let a=await Rp(e,r);if(a.kind!==`stop`)return a.kind===`collision`?[...n,a.name].join(`/`):zp(a.nextDir,i,[...n,r])},Bp=[],Vp=async(e,t)=>{let n=await zp(e.sourcesDir,t.split(`/`),Bp);if(n!==void 0)throw ve(`checkout path for '${t}' collides case-insensitively with existing '${n}'`)},Hp=async e=>{try{return await i(e),!0}catch(e){if(V(e))return!1;throw e}},Up=async e=>{try{return await s(e)}catch(e){if(V(e))return;throw e}},Wp=async e=>{try{return(await i(e)).isDirectory()}catch(e){if(V(e))return;throw e}},Gp=async e=>{let t=await Up(e);if(t===void 0)return!0;if(t.length>0)return!1;try{await d(e)}catch(e){if(!V(e))throw e}return!0},Kp=async e=>{let t=await Wp(e);return t===void 0?!0:t?Gp(e):!1},qp=async(e,t)=>{t!==e.sourcesDir&&await Kp(t)&&await qp(e,te(t))},Jp=async(e,t)=>await Hp(t)?(Gs(e,t),await u(t,{force:!0,recursive:!0}),await qp(e,te(t)),{removedCheckout:!0}):{removedCheckout:!1,warning:`checkout was already missing`},Yp=(e,t)=>Object.fromEntries(Object.entries(e).filter(([e])=>e!==t)),Xp=async(e,t)=>{let n=await W(e);await $s(e,{...n,refs:Yp(n.refs,t)});let r=await X(e);await Ku(e,{...r,refs:Yp(r.refs,t)})},Zp=async(e,t)=>{let n=H(e.env),r=Ep(await W(n),t),i=U(n,r),{removedCheckout:a,warning:o}=await J(n,Op(r),()=>Jp(n,i));return await J(n,`home`,()=>Xp(n,r)),{data:{key:r,removed_checkout:a},warnings:Hd(o)}},Qp=e=>e.removed_checkout?[`removed ${e.key} (checkout deleted)`]:[`removed ${e.key} (checkout was already missing)`],$p=(e,t)=>{e.command(`remove`).description(`Remove a configured ref: its config/state entry AND its checkout directory.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let{data:n,warnings:r}=await Zp(t,e);Q(t,i,Qp(n),n,r)})()})},em=(e,t)=>{let n=e.refs[t];if(n===void 0)throw Error(`internal: matched ref key '${t}' is missing from config.refs`);return n},tm=(e,t)=>{if(!G(e))throw y(`checkout for '${t}' is missing — run: refs sync ${t}`)},nm=(e,t,n)=>{let r=e.packages?.[n];if(r===void 0)throw y(`no package '${n}' registered on ref '${t}'`);return r},rm=e=>`no ref matches '${e}' — run refs list, or add it: refs add <url>`,im=/^[a-z][a-z0-9+.-]*:\/\//iu,am=/^git@[^:/\s]+:[^\s]+$/u,om=e=>im.test(e)||am.test(e),sm=(e,t)=>{try{return dl(e,t)}catch{if(om(e))throw x(`query looks like a git url but is not a supported form — check the url (credentials are never accepted) or run: refs resolve <package|ref-suffix>`);return}},cm=(e,t,n)=>{let r=sm(t,n);if(r!==void 0){if(Object.hasOwn(e.refs,r.key))return{key:r.key};throw y(rm(t))}},lm=(e,t)=>{let n=[];for(let r of Object.keys(e.refs).toSorted()){let i=e.refs[r]?.packages?.[t];i!==void 0&&n.push({entry:i,key:z.parse(r)})}return n},um=(e,t)=>`package '${e}' is registered by more than one ref: ${t.join(`, `)} — use the full ref key`,dm=(e,t)=>{let n=lm(e,t),[r]=n;if(r!==void 0){if(n.length>1)throw b(um(t,n.map(e=>e.key)));return r}},fm=(e,t)=>{let n=t.split(`/`);for(let t=n.length-1;t>=1;--t){let r=n.slice(0,t).join(`/`),i=dm(e,r);if(i!==void 0)return{...i,name:r}}},pm=(e,t)=>{try{return Ep(e,t)}catch(e){throw e instanceof v&&e.code===`not_found`?y(rm(t)):e}},mm=(e,t,n)=>{let r=cm(e,t,n);if(r!==void 0)return r;let i=dm(e,t);if(i!==void 0)return{key:i.key,packageMatch:{...i,name:t}};let a=fm(e,t);return a===void 0?{key:pm(e,t)}:{key:a.key,packageMatch:a}},hm=(e,t)=>{if(e.packageMatch===void 0)return null;let{entry:n,name:r}=e.packageMatch;return{local_path:h(t,n.path),name:r,path:n.path}},gm=async(e,t,n)=>{let r=H(e.env),i=await W(r),a=mm(i,t,{allowFileUrls:kp(e.env)}),o=em(i,a.key),s=await X(r),c=U(r,a.key),l=Qo(Y(`sync_ttl`,o,i.settings)),u=s.refs[a.key]?.last_fetched_at;return{key:a.key,...u===void 0?{}:{last_fetched_at:u},local_path:c,missing:!G(c),package:hm(a,c),stale:hp(u,l,n)}},_m=(e,t)=>{let n=[`ref: ${e.key}`,`path: ${e.local_path}`,...vp({lastFetchedAt:e.last_fetched_at,missing:e.missing,now:t,stale:e.stale})];return e.package!==null&&n.push(`package: ${e.package.name}`,`package path: ${e.package.local_path}`),n},vm=(e,t)=>{e.command(`resolve`).description(`Resolve a git url, npm package name, import path, or ref-key suffix to its ref/package.`).argument(`<query>`,`git url, npm package name, import path, or unique ref-key suffix`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let n=Date.now(),r=await gm(t,e,n);Q(t,i,_m(r,n),r)})()})},ym={},bm=async(e,t)=>{if(!G(t))return{tags:[]};try{return{tags:await kc(e.runner,t,5)}}catch(e){return{tags:[],warning:`could not list tags: ${Ud(e)}`}}},xm=async(e,t,n,r)=>{let i=H(e.env),a=await W(i),o=Ep(a,t),s=em(a,o),c=await X(i),l=U(i,o),{packages:u,...d}=s,f=n.tags?await bm(e,l):void 0,p=c.refs[o]??ym;return{data:{...d,key:o,local_path:l,missing:!G(l),...n.packages?{packages:u??{}}:{},packages_count:Object.keys(u??{}).length,...f===void 0?{}:{sample_tags:f.tags},stale:hp(p.last_fetched_at,Qo(Y(`sync_ttl`,s,a.settings)),r),state:p},warnings:Hd(f?.warning)}},Sm=(e,t)=>{let n=[`ref: ${e.key}`,`description: ${e.description}`,`url: ${e.url}`,`path: ${e.local_path}`,...vp({lastFetchedAt:e.state.last_fetched_at,missing:e.missing,now:t,stale:e.stale})];return e.sample_tags!==void 0&&e.sample_tags.length>0&&n.push(`tags: ${e.sample_tags.join(`, `)}`),n},Cm=(e,t)=>{e.command(`show`).description(`Show a configured ref: entry, state, local path, package count; --packages/--tags add the package map and sample tags to --json.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).option(`--packages`,`include the ref's full package map in --json output (off by default)`).option(`--tags`,`include sample tags in --json output (human output always probes for them)`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let r={packages:n.packages===!0,tags:!i.json||n.tags===!0},a=Date.now(),{data:o,warnings:s}=await xm(t,e,r,a);Q(t,i,Sm(o,a),o,s)})()})},wm=(e,t)=>{let n={head_sha:t.headSha,last_fetched_at:new Date().toISOString()},r=t.effectiveCloneMode??e?.effective_clone_mode;return r!==void 0&&(n.effective_clone_mode=r),n},Tm=async(e,t,n)=>{let r=await W(e),i=r.refs[t];i!==void 0&&(r.refs[t]={...i,default_branch:n},await $s(e,r))},Em=(e,t,n)=>J(e,`home`,async()=>{n.branchRenamedTo!==void 0&&await Tm(e,t,n.branchRenamedTo);let r=await X(e);r.refs[t]=wm(r.refs[t],n),await Ku(e,r)}),Dm=async(e,t,n)=>{try{await J(e,`home`,async()=>{let r=await X(e);r.refs[t]={...r.refs[t],last_error:n},await Ku(e,r)})}catch{}},Om=e=>{let t=0,n=[];return{acquire:()=>{if(t<e)return t+=1,Promise.resolve();let{promise:r,resolve:i}=Promise.withResolvers();return n.push(()=>{t+=1,i()}),r},release:()=>{--t;let e=n.shift();e!==void 0&&e()}}},km=async(e,t)=>{await e.acquire();try{return await t()}finally{e.release()}},Am=(e,t,n)=>`checkout at ${e} points at '${q(t)}' — expected '${q(n)}'; remove the checkout directory or run refs remove before retrying`,jm=e=>e.exitCode===0?e.stdout.trim():`(no origin remote)`,Mm=(e,t)=>{try{return dl(e,{allowFileUrls:t}).key}catch{return}},Nm=async(e,t)=>{let n=await e.run(`git`,[`remote`,`get-url`,`origin`],{cwd:t.dest}),r=jm(n),i=Mm(t.expectedUrl,t.allowFileUrls),a=Mm(r,t.allowFileUrls);if(i===void 0||a!==i)throw ve(Am(t.dest,r,t.expectedUrl))},Pm=e=>`checkout at ${e} exists but is not refs-managed — remove it (rm -rf ${e}) and retry`,Fm=async(e,t)=>{let n=await e.run(`git`,[`config`,`--local`,`core.hooksPath`],{cwd:t.dest});if(n.exitCode!==0||n.stdout.trim()!==t.hooksDir)throw ve(Pm(t.dest))},Im=async(e,t)=>{await a(te(t.dest),{recursive:!0}),Gd(e,`cloning ${q(t.cloneUrl)} into ${t.dest}…`);let n=await bc(e.runner,t);return n.warning===void 0?{effectiveMode:n.effectiveMode}:{effectiveMode:n.effectiveMode,warning:n.warning}},Lm=async(e,t)=>(Gs(t.home,t.dest),G(t.dest)?(await Nm(e.runner,{allowFileUrls:t.allowFileUrls,dest:t.dest,expectedUrl:t.cloneUrl}),await Fm(e.runner,{dest:t.dest,hooksDir:t.hooksDir}),{}):Im(e,t)),Rm=(e,t)=>`checkout for '${e}' at ${t} is missing or corrupt (git rev-parse HEAD failed) — run: refs remove ${e}, then refs add <source> --dry-run again`,zm=(e,t,n)=>`checkout for '${e}' at ${t} has a HEAD sha refs cannot store yet (${n.length} hex chars, expected 40) — only SHA-1 repositories are supported for now; \`--object-format=sha256\` repositories are not yet supported`,Bm=async(e,t)=>{await Nm(e,t),await Fm(e,{dest:t.dest,hooksDir:t.hooksDir});let n=await e.run(`git`,[`rev-parse`,`HEAD`],{cwd:t.dest});if(n.exitCode!==0)throw x(Rm(t.key,t.dest));let r=n.stdout.trim();if(!Hu.shape.head_sha.safeParse(r).success)throw x(zm(t.key,t.dest,r));return r},Vm=(e,t,n)=>`sync produced a HEAD sha for '${e}' at ${t} that refs cannot store yet (${n.length} hex chars) — only SHA-1 repositories are supported for now`,Hm=(e,t,n)=>{if(!Hu.shape.head_sha.safeParse(n).success)throw x(Vm(e,t,n));return n},Um=(e,t,n)=>{let r={effectiveCloneMode:t.effectiveMode,headSha:n.headSha,status:`cloned`};return n.actualBranch!==e.ref.default_branch&&(r.branchRenamedTo=n.actualBranch),t.warning!==void 0&&(r.warning=t.warning),r},Wm=async(e,t,n)=>{await a(te(n),{recursive:!0});let r=Y(`clone_mode`,t.ref,t.settings),i=await bc(e.runner,{cloneUrl:t.ref.url,dest:n,hooksDir:t.home.hooksDir,mode:r}),o=await Sc(e.runner,n),s=await Bm(e.runner,{allowFileUrls:kp(e.env),dest:n,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.key});return Um(t,i,{actualBranch:o,headSha:s})},Gm=async(e,t,n)=>{await Fm(e.runner,{dest:n,hooksDir:t.home.hooksDir}),await Nm(e.runner,{allowFileUrls:kp(e.env),dest:n,expectedUrl:t.ref.url});let r=await Oc(e.runner,{defaultBranch:t.ref.default_branch,dir:n}),i={headSha:Hm(t.key,n,r.newSha),status:r.status};return r.branchRenamedTo!==void 0&&(i.branchRenamedTo=r.branchRenamedTo),r.warning!==void 0&&(i.warning=r.warning),i},Km=(e,t)=>J(t.home,Op(t.key),()=>{let n=U(t.home,t.key);return Gs(t.home,n),G(n)?Gm(e,t,n):Wm(e,t,n)}),qm=e=>{let t=[];e.branchRenamedTo!==void 0&&t.push(`default branch renamed to ${e.branchRenamedTo}`),e.warning!==void 0&&t.push(e.warning);let[n]=t;if(n!==void 0)return t.join(` | `)},Jm=(e,t)=>{let n={key:e,status:t.status},r=qm(t);return r!==void 0&&(n.warning=r),n},Ym=async(e,t)=>{try{let n=await Km(e,t);return await Em(t.home,t.key,n),Jm(t.key,n)}catch(e){let n=Ud(e);return await Dm(t.home,t.key,n),{error:n,key:t.key,status:`failed`}}},Xm=(e,t)=>e.status===`rejected`?{error:Ud(e.reason),key:t,status:`failed`}:e.value,Zm=async(e,t)=>{let n=Om(4);return(await Promise.allSettled(t.map(t=>km(n,()=>Ym(e,t))))).map((e,n)=>{let r=t[n];if(r===void 0)throw Error(`internal: sync target at index ${n} is missing`);return Xm(e,r.key)})},Qm=(e,t,n)=>({home:e,key:n,ref:em(t,n),settings:t.settings}),$m=(e,t,n)=>n.length===0?Object.keys(t.refs).toSorted().map(n=>Qm(e,t,z.parse(n))):n.map(n=>Qm(e,t,Ep(t,n))),eh=(e,t,n)=>{let r=Date.now();return t.filter(t=>{let i=Qo(Y(`sync_ttl`,t.ref,t.settings)),a=hp(n.refs[t.key]?.last_fetched_at,i,r),o=!G(U(e,t.key));return a||o})},th=async(e,t,n)=>{if(!n)return t;let r=await X(e);return eh(e,t,r)},nh=async(e,t)=>{let n=H(e.env),r=await W(n),i=$m(n,r,t.refs),a=await Zm(e,await th(n,i,t.staleOnly));return{failedCount:a.filter(e=>e.status===`failed`).length,results:a}},rh=[`updated`,`fresh`,`cloned`,`restored`,`failed`],ih={cloned:`Cloned`,failed:`Failed`,fresh:`Fresh`,restored:`Restored`,updated:`Updated`},ah=e=>{let t={cloned:[],failed:[],fresh:[],restored:[],updated:[]};for(let n of e)t[n.status].push(n);return t},oh=e=>e.status===`failed`?` ${e.key}: ${e.error??`unknown error`}`:e.warning===void 0?` ${e.key}`:` ${e.key} (${e.warning})`,sh=e=>{let t=ah(e),n=[rh.map(e=>`${ih[e]} (${t[e].length})`).join(` / `)];for(let e of rh)for(let r of t[e])n.push(oh(r));return n},ch=(e,t)=>({refs:e,staleOnly:t.staleOnly===!0}),lh=(e,t)=>{e.command(`sync`).description(`Fetch (or re-clone, if the checkout is missing) configured refs — all by default.`).argument(`[refs...]`,`ref keys or unique suffixes to sync (default: every configured ref)`).option(`--stale-only`,`skip refs whose last sync is still within their ref's sync_ttl`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let r=await nh(t,ch(e,n));Q(t,i,sh(r.results),{results:r.results}),r.failedCount>0&&(process.exitCode=_.UNEXPECTED)})()})},uh=(e,t,n)=>n===void 0?e.tag_format:nm(e,t,n).tag_format??e.tag_format,dh=async(e,t)=>{let n=H(e.env),r=await W(n),i=Ep(r,t.query),a=em(r,i),o=uh(a,i,t.opts.packageName),s=U(n,i);tm(s,i);let c=await Wc(e.runner,s,o,t.version);return{key:i,ref_path:`refs/tags/${c}`,tag:c,version:t.version}},fh=e=>[`${e.key}@${e.version} -> ${e.tag}`],ph=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},mh=[up,pp,$p,vm,Cm,lh,(e,t)=>{e.command(`tag`).description(`Resolve a version to its git tag, via the ref's (or a package's) tag_format.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. zod`).argument(`<version>`,`version to resolve, e.g. 4.1.0`).option(`--package <name>`,`resolve against this package's tag_format instead of the ref's`).action((e,n,r,i)=>{let a=Z(i);return $(t,a,async()=>{let i=await dh(t,{opts:ph(r),query:e,version:n});Q(t,a,fh(i),i)})()})}],hh=e=>e.description===void 0?{path:e.path}:{description:e.description,path:e.path},gh=(e,t,n)=>e.length>0?Object.fromEntries(e.map(e=>[e.name,hh(e)])):n===void 0?{}:{[n]:{path:t??`.`}},_h=e=>{let t=e.description??``;return e.tag_format===void 0?{description:t,path:e.path}:{description:t,path:e.path,tag_format:e.tag_format}},vh=e=>{let t=Object.entries(e);if(t.length!==0)return Object.fromEntries(t.map(([e,t])=>[e,_h(t)]))},yh=e=>e.description===void 0||e.description===``,bh=e=>Object.entries(e).filter(([,e])=>yh(e)).map(([e])=>e).toSorted(),xh=e=>{let t=bh(e);if(t.length!==0)throw x(`packages without a detected description: ${t.join(`, `)} — run the two-phase flow instead: refs add <source> --dry-run --json > proposal.json, fill in the package descriptions, then refs add --proposal proposal.json`)},Sh=e=>{if(Object.keys(e).length!==0)return e},Ch=e=>{if(e===null)throw x(`tag_format_candidate must be set to a valid tag format (containing '{version}') before finalizing — edit the proposal and provide one, or add the ref manually`);return e},wh=e=>e.packages===void 0?{default_branch:e.default_branch,description:e.description,tag_format:e.tag_format,url:e.url}:{default_branch:e.default_branch,description:e.description,packages:e.packages,tag_format:e.tag_format,url:e.url},Th=async(e,t,n)=>{let r=await Sc(e.runner,t),i=Hc(await kc(e.runner,t));return Gd(e,`detecting workspace packages…`),{defaultBranch:r,packages:gh(await Sd(t),n.npmDirectory,n.npmPkgName),tagFormatCandidate:i}},Eh=(e,t)=>J(t.home,Op(t.resolved.key),async()=>{let n=await Lm(e,{allowFileUrls:kp(e.env),cloneUrl:t.resolved.cloneUrl,dest:t.dest,home:t.home,hooksDir:t.home.hooksDir,mode:t.cloneMode}),r={fields:await Th(e,t.dest,t.resolved)};return n.effectiveMode!==void 0&&(r.effectiveMode=n.effectiveMode),n.warning!==void 0&&(r.warning=n.warning),r}),Dh=e=>{let t={default_branch:e.cloneResult.fields.defaultBranch,description:``,key:e.resolved.key,packages:e.cloneResult.fields.packages,tag_format_candidate:e.cloneResult.fields.tagFormatCandidate,url:e.resolved.cloneUrl},n={dest:e.dest,proposal:t};return e.cloneResult.effectiveMode!==void 0&&(n.effectiveCloneMode=e.cloneResult.effectiveMode),e.cloneResult.warning!==void 0&&(n.warning=e.cloneResult.warning),n},Oh=async(e,t)=>{let n=H(e.env),r=await W(n),i=Np(await Mp(e,t),r.settings);Fp(r,i.key),await Vp(n,i.key);let a=U(n,i.key),o=Y(`clone_mode`,void 0,r.settings),s=await Eh(e,{cloneMode:o,dest:a,home:n,resolved:i});return Dh({cloneResult:s,dest:a,resolved:i})},kh=(e,t,n)=>J(e,`home`,async()=>{Fp(await W(e),t);let r=await X(e),i=r.refs[t],a=n??i?.effective_clone_mode,o={...i,pending_proposal_at:new Date().toISOString()};a!==void 0&&(o.effective_clone_mode=a),r.refs[t]=o,await Ku(e,r)}),Ah=(e,t)=>{let n=cs.safeParse(e);if(!n.success)throw x(k(n.error));let r=Uu.safeParse(t);if(!r.success)throw x(k(r.error));return{config:n.data,state:r.data}},jh=async(e,t)=>{let n=await W(e.home);Fp(n,e.ref.key);let r=wh(e.ref);n.refs[e.ref.key]=r;let i=await X(e.home);return i.refs[e.ref.key]={effective_clone_mode:e.effectiveCloneMode??i.refs[e.ref.key]?.effective_clone_mode??Y(`clone_mode`,void 0,n.settings),head_sha:t,last_fetched_at:new Date().toISOString()},{...Ah(n,i),entry:r}},Mh=async(e,t)=>{let n=kp(e.env),r=await J(t.home,Op(t.ref.key),()=>(Gs(t.home,t.dest),Bm(e.runner,{allowFileUrls:n,dest:t.dest,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.ref.key})));return J(t.home,`home`,async()=>{let{config:e,entry:n,state:i}=await jh(t,r);return await Ku(t.home,i),await $s(t.home,e),{entry:n,key:t.ref.key}})},Nh=(e,t)=>t===`-`?e.readStdin():o(t,`utf8`),Ph=e=>{try{return JSON.parse(e)}catch(e){throw x(`invalid JSON in proposal: ${Ud(e)}`)}},Fh=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Ih=e=>Fh(e)&&`ok`in e&&!(`key`in e),Lh=e=>{if(!Ih(e))return e;if(e.ok===!1)throw x(`proposal file contains a failed refs envelope (ok is false) — re-run the dry-run`);if(Fh(e.data))return e.data;throw x(`proposal file is a refs envelope without a usable data object — re-run the dry-run`)},Rh=e=>e.code===`unrecognized_keys`,zh=e=>e.path.length===0,Bh=(e,t)=>{let n=t.toSorted().map(e=>`"${e}"`).join(`, `);return e===``?`✖ unrecognized key(s) in proposal: ${n}`:`✖ unrecognized key(s) in proposal at ${e}: ${n}`},Vh=e=>{let t=new Map;for(let n of e){let e=ct(n.path);t.set(e,[...t.get(e)??[],...n.keys])}return[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>Bh(e,t))},Hh=e=>`✖ invalid proposal: ${e.message}`,Uh=e=>{let t=e.issues.filter(e=>Rh(e)),n=e.issues.filter(e=>!Rh(e)),r=n.filter(e=>zh(e));if(t.length===0&&r.length===0)return k(e);let i=n.filter(e=>!zh(e)),a=[...Vh(t),...r.map(e=>Hh(e))];return i.length>0&&a.push(k({issues:i})),a.join(`
|
|
369
369
|
`)},Wh=e=>{let t=Vu.safeParse(e);if(!t.success)throw x(Uh(t.error));return t.data},Gh=async(e,t)=>{let n=await Nh(e,t);return Wh(Lh(Ph(n)))},Kh=(e,t)=>[`refs add: dry-run proposal ready for '${e}' (checkout: ${t})`,`next: review the proposal, then run refs add --proposal <file> to finalize`],qh=async(e,t)=>{let n=await Oh(e,t);await kh(H(e.env),n.proposal.key,n.effectiveCloneMode);let r=Hd(n.warning);return{data:n.proposal,human:Kh(n.proposal.key,n.dest),warnings:r}},Jh=e=>[`refs add: '${e}' added to config`],Yh=e=>{let t={default_branch:e.default_branch,description:e.description,key:e.key,tag_format:Ch(e.tag_format_candidate),url:e.url},n=Sh(e.packages);return n!==void 0&&(t.packages=n),t},Xh=async(e,t)=>{let n=await Gh(e,t),r=H(e.env),i=U(r,n.key);if(!G(i))throw y(`no checkout found at ${i} — run: refs add <source> --dry-run first`);let{entry:a,key:o}=await Mh(e,{dest:i,home:r,ref:Yh(n)});return{data:{entry:a,key:o},human:Jh(o),warnings:[]}},Zh=(e,t)=>{xh(e.proposal.packages);let n={default_branch:e.proposal.default_branch,description:t,key:e.proposal.key,tag_format:Ch(e.proposal.tag_format_candidate),url:e.proposal.url},r=vh(e.proposal.packages);return r!==void 0&&(n.packages=r),n},Qh=async(e,t,n)=>{let r=await Oh(e,t),i=H(e.env),a=Zh(r,n),o={dest:r.dest,home:i,ref:a};r.effectiveCloneMode!==void 0&&(o.effectiveCloneMode=r.effectiveCloneMode);let{entry:s,key:c}=await Mh(e,o),l=Hd(r.warning);return{data:{entry:s,key:c},human:Jh(c),warnings:l}},$h=e=>{let t=[e.dryRun,e.proposal!==void 0,e.description!==void 0].filter(Boolean).length;if(t>1)throw b(`refs add: use only one of --dry-run, --proposal, or --description`);if(t===0)throw b(`refs add needs --dry-run, --proposal, or --description`)},eg=e=>{if(e===void 0||e===``)throw b(`refs add requires <source> (a git url or npm:<package>)`);return e},tg=(e,t)=>($h(t),t.proposal===void 0?t.description===void 0?qh(e,eg(t.source)):Qh(e,eg(t.source),t.description):Xh(e,t.proposal)),ng=(e,t)=>{let n={dryRun:t.dryRun===!0};return e!==void 0&&(n.source=e),t.proposal!==void 0&&(n.proposal=t.proposal),t.description!==void 0&&(n.description=t.description),n},rg=(e,t)=>{e.command(`add`).description(`Add a git reference in two phases: propose (--dry-run), then finalize (--proposal).`).argument(`[source]`,`git url or npm:<package> (omit when finalizing with --proposal)`).option(`--dry-run`,`resolve and clone the source, writing a reviewable proposal`).option(`--proposal <file>`,`finalize from a completed proposal JSON file (- for stdin)`).option(`--description <text>`,`one-shot: dry-run then finalize immediately with this description`).action((e,n,r)=>{let i=Z(r);return $(t,i,async()=>{let r=await tg(t,ng(e,n));Q(t,i,r.human,r.data,r.warnings)})()})},ig=e=>e===void 0?null:e,ag=()=>Object.keys(os.shape).toSorted().join(`, `),og=e=>`unknown package field '${e}' — valid fields: ${ag()}`,sg=e=>Object.hasOwn(os.shape,e),cg=(e,t,n)=>{if(!sg(t))throw b(og(t));let r=e[t],i=os.safeParse({...e,[t]:n});if(!i.success)throw x(k(i.error));return{field:t,newValue:i.data[t],oldValue:r,updated:i.data}},lg=async e=>{let t=nm(e.entry,e.key,e.packageName),n=cg(t,e.field,e.value),r={...e.entry,packages:{...e.entry.packages,[e.packageName]:n.updated}};return await $s(e.home,{...e.config,refs:{...e.config.refs,[e.key]:r}}),{field:n.field,key:e.key,new:ig(n.newValue),old:ig(n.oldValue)}},ug=`packages`,dg=()=>Object.keys(ss.shape).filter(e=>e!==ug).toSorted().join(`, `),fg=e=>`unknown ref field '${e}' — valid fields: ${dg()}`,pg=e=>Object.hasOwn(ss.shape,e),mg=(e,t,n)=>`failed to rewrite git remote at ${e} to '${q(t)}': ${n.trim()}`,hg=async(e,t)=>{if(Gs(t.home,t.dest),!G(t.dest))return;let n=await e.runner.run(`git`,[`remote`,`set-url`,`origin`,t.cloneUrl],{cwd:t.dest});if(n.exitCode!==0)throw x(mg(t.dest,t.cloneUrl,n.stderr))},gg=async(e,t)=>{let n=dl(t.value,{allowFileUrls:kp(e.env)});if(n.key!==t.key)throw x(`new url derives a different key — remove and re-add instead`);let r=U(t.home,t.key);return await hg(e,{cloneUrl:n.cloneUrl,dest:r,home:t.home}),{...t.entry,url:n.cloneUrl}},_g=(e,t,n)=>{let r={...e,[t]:n},i=ss.safeParse(r);if(!i.success)throw x(k(i.error));return i.data},vg=(e,t)=>t.field===`url`?gg(e,{entry:t.entry,home:t.home,key:t.key,value:t.value}):Promise.resolve(_g(t.entry,t.field,t.value)),yg=async(e,t)=>{let{field:n}=t;if(n===ug)throw b(`use --package <name> <field> <value>`);if(!pg(n))throw b(fg(n));let r=t.entry[n],i=await vg(e,{entry:t.entry,field:n,home:t.home,key:t.key,value:t.value});return{new:i[n],old:r,updated:i}},bg=(e,t)=>{let n=H(e.env),{field:r,opts:i,query:a,value:o}=t;return J(n,`home`,async()=>{let t=await W(n),s=Ep(t,a),c=em(t,s);if(i.packageName!==void 0)return lg({config:t,entry:c,field:r,home:n,key:s,packageName:i.packageName,value:o});let l=await yg(e,{entry:c,field:r,home:n,key:s,value:o});return await $s(n,{...t,refs:{...t.refs,[s]:l.updated}}),{field:r,key:s,new:ig(l.new),old:ig(l.old)}})},xg=`settings`,Sg=[],Cg=()=>Object.keys(is.shape).toSorted().join(`, `),wg=e=>`unknown setting '${e}' — valid settings: ${Cg()}`,Tg=e=>Object.hasOwn(is.shape,e),Eg=e=>`note: 'settings' addressed the global settings, not ${e} — use the full ref key to edit that ref`,Dg=e=>{try{let t=Ep(e,xg);return[Eg(`ref '${t}'`)]}catch(e){if(e instanceof v&&e.code===`usage`)return[Eg("one of several matching refs — see `refs list`")];if(e instanceof v&&e.code===`not_found`)return Sg;throw e}},Og=e=>({data:{field:e.key,key:xg,new:ig(e.parsed[e.key]),old:ig(e.old)},warnings:Dg(e.config)}),kg=(e,t)=>{let n=H(e.env);return J(n,`home`,async()=>{let e=await W(n);if(!Tg(t.key))throw b(wg(t.key));let r=e.settings[t.key],i={...e.settings,[t.key]:t.value},a=is.safeParse(i);if(!a.success)throw x(k(a.error));return await $s(n,{...e,settings:a.data}),Og({config:e,key:t.key,old:r,parsed:a.data})})},Ag=[],jg=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},Mg=async(e,t)=>{if(t.first===`settings`){if(t.opts.packageName!==void 0)throw b(`--package is not valid with 'refs edit settings ...' — it only applies to ref/package edits`);return kg(e,{key:t.second,value:t.value})}return{data:await bg(e,{field:t.second,opts:t.opts,query:t.first,value:t.value}),warnings:Ag}},Ng=e=>e==null?`(unset)`:String(e),Pg=e=>[`${e.key}: ${e.field} '${Ng(e.old)}' -> '${Ng(e.new)}'`],Fg=(e,t)=>{e.command(`edit`).description(`Edit one field: 'refs edit settings <key> <value>' for a global setting, or 'refs edit <ref> <field> <value> [--package <name>]' for a ref or package field.`).argument(`<ref-or-settings>`,`a ref key/unique suffix, or the literal 'settings'`).argument(`<field-or-key>`,`field to edit (or, in settings mode, the setting key)`).argument(`<value>`,`the new value`).option(`--package <name>`,`edit this package's field instead of a top-level ref field`).action((e,n,r,i,a)=>{let o=Z(a);return $(t,o,async()=>{let{data:a,warnings:s}=await Mg(t,{first:e,opts:jg(i),second:n,value:r});Q(t,o,Pg(a),a,s)})()})},Ig=`Install the agent skill: npx skills add kaisers-io/refs (private phase: npx skills add <path-to-this-repo> --skill refs)`,Lg={migrated:`migrated`,noop:`unchanged`,seeded:`seeded`},Rg=async e=>{await a(e.root,{recursive:!0}),await a(e.sourcesDir,{recursive:!0}),await a(e.locksDir,{recursive:!0}),await a(e.hooksDir,{recursive:!0})},zg=async e=>{let t=H(e.env);return await Rg(t),{config:await J(t,`home`,async()=>{let e=await lc(t,Cd);return await Mc(t),e}),home:t.root,skill_hint:Ig}},Bg=[(e,t)=>{e.command(`init`).description(`Seed or migrate the refs home directory, its config, and the git hooks guard.`).action((e,n)=>{let r=Z(n);return $(t,r,async()=>{let e=await zg(t);Q(t,r,[`home: ${e.home}`,`config: ${Lg[e.config]}`,``,Ig],e)})()})},rg,Fg,Dp,...mh],Vg=(e,t)=>{for(let n of Bg)n(e,t)},Hg=[``,`Examples:`,` $ refs list --json`,` $ refs sync --stale-only --json`,` $ refs resolve zod/mini --json`,``,`Every command accepts --json for structured output and --verbose for stack traces on error.`].join(`
|
|
370
370
|
`),Ug=new Set([`commander.help`,`commander.helpDisplayed`,`commander.version`]),Wg=`--json`,Gg=`--verbose`,Kg=/\n$/u,qg=/^error: /u,Jg=e=>e.replace(qg,``),Yg=(e,t)=>{for(let n of e){if(n===`--`)return!1;if(n===t)return!0}return!1},Xg=e=>Yg(e,Wg),Zg=e=>Yg(e,Gg),Qg=(e,t,n)=>n&&t!==void 0?`${e}\n${t}`:e,$g=e=>{let t=new Ld().name(`refs`).description(`Manage git-based reference checkouts shared across a workspace.`).version(Cd).option(Wg,`emit machine-readable JSON on stdout instead of human-readable text`).option(Gg,`include stack traces in error output`).allowExcessArguments(!1).exitOverride().configureOutput({outputError:()=>{},writeErr:t=>{e.errLine(t.replace(Kg,``))},writeOut:t=>{e.out(t.replace(Kg,``))}});return t.addHelpText(`after`,Hg),Vg(t,e),t},e_=()=>{process.exitCode=_.OK},t_=(e,t,n)=>{Wd(e,t,{code:`usage`,message:Qg(Jg(n.message),n.stack,t.verbose)}),process.exitCode=_.USAGE},n_=(e,t,n)=>{if(Ug.has(n.code)){e_();return}t_(e,t,n)},r_=(e,t,n)=>{let r=be(n,{verbose:t.verbose});Wd(e,t,r),process.exitCode=r.exitCode},i_=async(e,t,n)=>{let r={json:Xg(n),verbose:Zg(n)};try{await t.parseAsync(n)}catch(t){if(t instanceof Ed){n_(e,r,t);return}r_(e,r,t)}},a_=(e,t)=>i_(e,$g(e),t);import.meta.main&&await a_(Td(),process.argv);export{$g as buildProgram,Z as cliOptsOf,Q as emit,Wd as emitError,Ud as errorMessageOf,Gd as progress,Td as realContext,Vg as registerCommands,a_ as run,i_ as runProgram,Hd as warningsFor,$ as wrapAction};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaisers-io/refs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Managed read-only git checkouts of reference repositories for coding agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"@kaisers-io/refs-core": "workspace:*",
|
|
46
46
|
"@types/node": "24.13.3",
|
|
47
47
|
"commander": "15.0.0",
|
|
48
|
-
"smol-toml": "1.7.
|
|
48
|
+
"smol-toml": "1.7.1",
|
|
49
49
|
"zod": "4.4.3"
|
|
50
50
|
},
|
|
51
51
|
"engines": {
|
|
52
|
-
"node": ">=24.
|
|
52
|
+
"node": ">=24.2"
|
|
53
53
|
}
|
|
54
54
|
}
|