@kaisers-io/refs 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/refs.mjs +1 -1
  2. package/package.json +1 -1
package/bin/refs.mjs CHANGED
@@ -400,5 +400,5 @@ Expecting one of '${n.join(`', '`)}'`);return this._lifeCycleHooks[e]?this._life
400
400
  - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
401
401
  - ${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=h.resolve(e,t);if(ie.existsSync(r))return r;if(n.includes(h.extname(t)))return;let i=n.find(e=>ie.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=ie.realpathSync(this._scriptPath)}catch{e=this._scriptPath}a=h.resolve(h.dirname(e),a)}if(a){let t=r(a,i);if(!t&&!e._executableFile&&this._scriptPath){let n=h.basename(this._scriptPath,h.extname(this._scriptPath));n!==this._name&&(t=r(a,`${n}-${e._name}`))}i=t||i}let o=n.includes(h.extname(i)),s;b.platform===`win32`?(this._checkForMissingExecutable(i,a,e._name),t.unshift(i),t=gT(b.execArgv).concat(t),s=ye.spawn(b.execPath,t,{stdio:`inherit`})):o?(t.unshift(i),t=gT(b.execArgv).concat(t),s=ye.spawn(b.argv[0],t,{stdio:`inherit`})):s=ye.spawn(i,t,{stdio:`inherit`}),s.killed||[`SIGUSR1`,`SIGUSR2`,`SIGTERM`,`SIGINT`,`SIGHUP`].forEach(e=>{b.on(e,()=>{s.killed===!1&&s.exitCode===null&&s.kill(e)})});let c=this._exitCallback;s.on(`close`,e=>{e??=1,c?c(new iT(e,`commander.executeSubCommandAsync`,`(close)`)):b.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)b.exit(1);else{let e=new iT(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?!1: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(`
402
402
  `),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 b.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()}`,b.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new uT(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=mT(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=mT(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=>sT(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=h.basename(e,h.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(b.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.
403
- 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 gT(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 _T(){if(b.env.NO_COLOR||b.env.FORCE_COLOR===`0`||b.env.FORCE_COLOR===`false`)return!1;if(b.env.FORCE_COLOR||b.env.CLICOLOR_FORCE!==void 0)return!0}new hT;const vT=[],yT=e=>Array.isArray(e)?e:[e],Q=(e,t,n,r,i)=>{if(t.json){let t={data:r,ok:!0,warnings:i??vT};e.out(JSON.stringify(t));return}for(let t of yT(n))e.out(t);for(let t of i??vT)e.errLine(`refs: warning: ${t}`)},bT=(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}`)},$=(e,t,n)=>async()=>{try{await n()}catch(n){let r=ct(n,{verbose:t.verbose});bT(e,t,r),process.exitCode=r.exitCode}};var xT=`0.1.0`;const ST=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`}},CT=/^v(?<major>\d+)\.(?<minor>\d+)/u,wT=e=>{let t=CT.exec(e),n=t?.groups?.major,r=t?.groups?.minor;if(!(n===void 0||r===void 0))return{major:Number(n),minor:Number(r)}},TT=e=>e===void 0?!1:e.major===24&&e.minor>=12,ET=e=>{let{nodeVersion:t}=e;return TT(wT(t))?{detail:t,name:`node`,status:`ok`}:{detail:`${t} does not satisfy the required range >=24.12 <25`,name:`node`,status:`fail`}},DT=e=>e instanceof Error?e.message:String(e),OT=()=>tc.parse({meta:{cli_version:`0.0.0`,schema_version:1},refs:{},settings:{}}),kT=async e=>{try{return{config:await H(e)}}catch(e){return{config:OT(),errorMessage:DT(e)}}},AT=e=>e===void 0?{detail:`config is present and matches the current schema`,name:`config`,status:`ok`}:{detail:e,name:`config`,status:`fail`},jT=[`.claude`,`skills`,`refs`,`SKILL.md`],MT=[`.codex`,`skills`,`refs`,`SKILL.md`],NT=e=>e===void 0?[]:[y(e,...jT),y(e,...MT)],PT=async e=>{try{return await t(e),!0}catch{return!1}},FT=async e=>{let t=NT(e.env.HOME);return(await Promise.all(t.map(e=>PT(e)))).some(Boolean)?{detail:`the refs skill is installed`,name:`skill`,status:`ok`}:{detail:`refs skill not found — install it: npx skills add kaisers-io/refs`,name:`skill`,status:`warn`}},IT=(e,t)=>Object.keys(t.refs).map(t=>({dest:V(e,Us.parse(t)),key:t})).filter(e=>U(e.dest)),LT=[`pre-commit`,`pre-push`],RT=async(e,n)=>{try{return await t(y(e.hooksDir,n),r.X_OK),!0}catch{return!1}},zT=async e=>{let t=await Promise.all(LT.map(t=>RT(e,t)));return LT.filter((e,n)=>!t[n])},BT=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},VT=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:`${LT.map(e=>`hooks/${e}`).join(`, `)} present; ${e.checkoutCount} checkout(s) guarded`,name:`hooks-guard`,status:`ok`},HT=async(e,t,n)=>{let r=IT(t,n),[i,a]=await Promise.all([zT(t),Promise.all(r.map(n=>BT(e,t,n.dest)))]),o=r.filter((e,t)=>!a[t]).map(e=>e.key);return VT({badKeys:o,checkoutCount:r.length,missingHooks:i})},UT=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}},WT=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`}},GT=async(e,t,n)=>{let r=IT(t,n),i=await Promise.all(r.map(t=>UT(e,t)));return WT(i)},KT=async e=>{try{return await Z(e)}catch{return Aw.parse({})}},qT=async e=>{try{return(await c(e,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(e){if(Lc(e))return[];throw e}},JT=async(e,t)=>{if(U(e))return[[...t]];let n=await qT(e);return(await Promise.all(n.map(n=>JT(y(e,n),[...t,n])))).flat()},YT=(e,t,n)=>{let r=e.refs[t]?.pending_proposal_at;return r===void 0?!1:n-Date.parse(r)<864e5},XT=(e,t,n)=>YT(t,e.key,n)?`${e.key}: pending add`:`${e.key}: orphan — remove with: rm -rf ${e.dest}`,ZT=(e,t)=>({dest:y(e.sourcesDir,...t),key:t.join(`/`)}),QT=async(e,t,n)=>{let r=(await JT(e.sourcesDir,[])).map(t=>ZT(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=>XT(e,n,i)).join(`; `),name:`orphans`,status:`warn`}},$T=/^(?<user>[^/\s@]+)@(?<host>[^:/\s]+):/u,eE=e=>e===``?{}:{user:e},tE=e=>e===``?{}:{port:e},nE=e=>{try{let t=new URL(e);return t.protocol===`ssh:`?{host:t.hostname,...eE(t.username),...tE(t.port)}:void 0}catch{return}},rE=e=>{let t=$T.exec(e),n=t?.groups?.host;return n===void 0?nE(e):{host:n,user:t?.groups?.user??`git`}},iE=e=>e.port===void 0?e.host:`${e.host}:${e.port}`,aE=e=>e.user===void 0?iE(e):`${e.user}@${iE(e)}`,oE=e=>{let t=Object.values(e.refs).map(e=>rE(e.url)).filter(e=>e!==void 0),n=new Map;for(let e of t)n.set(aE(e),e);return[...n.values()].toSorted((e,t)=>aE(e).localeCompare(aE(t)))},sE=/Permission denied/u,cE=[/Could not resolve hostname/u,/Connection refused/u,/Host key verification failed/u,/timed out/u],lE=e=>e.user===void 0?e.host:`${e.user}@${e.host}`,uE=e=>{let t=[`-o`,`ConnectTimeout=5`,`-o`,`BatchMode=yes`],n=lE(e);return e.port===void 0?[...t,`-T`,n]:[...t,`-p`,e.port,`-T`,n]},dE=async(e,t,n)=>{let r=aE(t),i=await e.runner.run(`ssh`,uE(t),{timeoutMs:n});return i.timedOut===!0?{host:r,outcome:`timeout`}:sE.test(i.stderr)?{host:r,outcome:`denied`}:cE.some(e=>e.test(i.stderr))?{detail:i.stderr.trim(),host:r,outcome:`connection-warn`}:{host:r,outcome:`ok`}},fE=(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`}},pE=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`}},mE=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`}},hE=e=>({detail:`ssh auth ok for: ${e.map(e=>e.host).join(`, `)}`,name:`ssh-auth`,status:`ok`}),gE=(e,t)=>fE(e,t)??pE(e)??mE(e)??hE(e),_E=async(e,t,n)=>{let r=oE(t);if(r.length===0)return;let i=n?.timeoutMs??1e4,a=await Promise.all(r.map(t=>dE(e,t,i)));return gE(a,i)},vE=async e=>{try{return await e.run()}catch(t){return{detail:`check crashed: ${DT(t)}`,name:e.name,status:`fail`}}},yE=async e=>{let[t,...n]=e;if(t===void 0)return[];let r=await vE(t),i=await yE(n);return r===void 0?i:[r,...i]},bE=e=>{let{configLoad:t,ctx:n,home:r,state:i}=e;return[{name:`git`,run:()=>ST(n)},{name:`node`,run:()=>Promise.resolve(ET(n))},{name:`config`,run:()=>Promise.resolve(AT(t.errorMessage))},{name:`hooks-guard`,run:()=>HT(n,r,t.config)},{name:`dirty-checkouts`,run:()=>GT(n,r,t.config)},{name:`orphans`,run:()=>QT(r,t.config,i)},{name:`skill`,run:()=>FT(n)},{name:`ssh-auth`,run:()=>_E(n,t.config)}]},xE=async e=>{let t=B(e.env),n=await kT(t),r=await KT(t);return yE(bE({configLoad:n,ctx:e,home:t,state:r}))},SE={fail:`FAIL`,ok:`OK`,warn:`WARN`},CE=e=>e.map(e=>`[${SE[e.status]}] ${e.name}: ${e.detail}`),wE=e=>e.some(e=>e.status===`fail`),TE=(e,t)=>{e.command(`doctor`).description(`Run environment/integrity checks (git, node, config, hooks, checkouts, ssh).`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await xE(t);Q(t,i,CE(e),{checks:e}),wE(e)&&(process.exitCode=it.UNEXPECTED)})()})},EE=async e=>{let t=B(e.env),n=await G(t,`home`,()=>sl(t,xT));return n===`migrated`?{backup:zc(t),result:n}:{backup:null,result:n}},DE=e=>e.result===`migrated`&&e.backup!==null?`config migrated (backup: ${g(e.backup)})`:e.result===`seeded`?`config seeded`:`config up to date`,OE=(e,t)=>{e.command(`migrate`).description(`Migrate the refs config to the current schema, seeding it if absent.`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await EE(t);Q(t,i,DE(e),e)})()})},kE=(e,t,n)=>e===void 0?!0:n-Date.parse(e)>t,AE=(e,t,n)=>{let r=e.state.refs[t],i=Gs(jw(`sync_ttl`,n,e.settings));return{clone_mode:jw(`clone_mode`,n,e.settings),description:n.description,key:t,missing:!U(V(e.home,Us.parse(t))),packages:Object.keys(n.packages??{}).toSorted(),stale:kE(r?.last_fetched_at,i,e.now)}},jE=e=>{let t={home:e.home,now:e.now,settings:e.config.settings,state:e.state};return Object.entries(e.config.refs).map(([e,n])=>AE(t,e,n)).toSorted((e,t)=>e.key.localeCompare(t.key))},ME=async e=>{let t=B(e.env),n=await H(t),r=await Z(t);return jE({config:n,home:t,now:Date.now(),state:r})},NE=e=>{let t=[];return e.stale&&t.push(`[stale]`),e.missing&&t.push(`[missing]`),t.length===0?``:` ${t.join(` `)}`},PE=e=>e.length===0?[`no refs configured — run: refs add <source>`]:e.map(e=>`${e.key} ${e.description}${NE(e)}`),FE=e=>e.split(`/`),IE=(e,t)=>{let n=FE(e);if(t.length>n.length)return!1;let r=n.length-t.length;return t.every((e,t)=>e===n[r+t])},LE=(e,t)=>{if(Object.hasOwn(e.refs,t))return Us.parse(t);let n=FE(t),r=Object.keys(e.refs).filter(e=>IE(e,n)).toSorted(),[i]=r;if(i===void 0)throw C(`no ref matches '${t}'`);if(r.length>1)throw w(`'${t}' matches more than one ref: ${r.join(`, `)}`);return Us.parse(i)},RE=(e,t)=>{e.command(`list`).description(`List configured refs with their staleness/missing checkout status.`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await ME(t);Q(t,i,PE(e),e)})()})},zE=e=>`ref:${e.replaceAll(`/`,`_`)}`,BE=e=>e.REFS_ALLOW_FILE_URLS===`1`,VE=(e,t)=>{let n=uu(t,{allowFileUrls:BE(e.env)});return{cloneUrl:n.cloneUrl,key:n.key}},HE=async(e,t)=>{if(t===``)throw w(`refs add npm: requires a package name, e.g. npm:left-pad`);let n=await fd(e.fetcher,t),r={cloneUrl:n.cloneUrl,key:n.key,npmPkgName:t};return n.directory!==void 0&&(r.npmDirectory=n.directory),r},UE=(e,t)=>t.startsWith(`npm:`)?HE(e,t.slice(4)):Promise.resolve(VE(e,t)),WE=(e,t)=>{if(e.npmPkgName===void 0)return e;let n=jw(`git_transport`,void 0,t);return{...e,cloneUrl:Su(e.cloneUrl,n)}},GE=e=>`ref '${e}' already exists — use refs edit or refs remove`,KE=(e,t)=>{if(e.refs[t]!==void 0)throw ot(GE(t))},qE=async e=>{try{return await c(e,{withFileTypes:!0})}catch(e){if(Lc(e))return;throw e}},JE=e=>e.filter(e=>e.isDirectory()).map(e=>e.name),YE=async(e,t)=>{let n=await qE(e);if(n===void 0)return{kind:`stop`};let r=JE(n);if(r.includes(t))return{kind:`continue`,nextDir:y(e,t)};let i=r.find(e=>e.toLowerCase()===t.toLowerCase());return i===void 0?{kind:`stop`}:{kind:`collision`,name:i}},XE=async(e,t,n)=>{let[r,...i]=t;if(r===void 0)return;let a=await YE(e,r);if(a.kind!==`stop`)return a.kind===`collision`?[...n,a.name].join(`/`):XE(a.nextDir,i,[...n,r])},ZE=[],QE=async(e,t)=>{let n=await XE(e.sourcesDir,t.split(`/`),ZE);if(n!==void 0)throw ot(`checkout path for '${t}' collides case-insensitively with existing '${n}'`)},$E=[],eD=e=>e===void 0?$E:[e],tD=async e=>{try{return await a(e),!0}catch(e){if(Lc(e))return!1;throw e}},nD=async e=>{try{return await c(e)}catch(e){if(Lc(e))return;throw e}},rD=async e=>{try{return(await a(e)).isDirectory()}catch(e){if(Lc(e))return;throw e}},iD=async e=>{let t=await nD(e);if(t===void 0)return!0;if(t.length!==0)return!1;try{await f(e)}catch(e){if(!Lc(e))throw e}return!0},aD=async e=>{let t=await rD(e);return t===void 0?!0:t?iD(e):!1},oD=async(e,t)=>{t!==e.sourcesDir&&await aD(t)&&await oD(e,_(t))},sD=async(e,t)=>await tD(t)?(Hc(e,t),await d(t,{force:!0,recursive:!0}),await oD(e,_(t)),{removedCheckout:!0}):{removedCheckout:!1,warning:`checkout was already missing`},cD=(e,t)=>Object.fromEntries(Object.entries(e).filter(([e])=>e!==t)),lD=async(e,t)=>{let n=await H(e);await Xc(e,{...n,refs:cD(n.refs,t)});let r=await Z(e);await Pw(e,{...r,refs:cD(r.refs,t)})},uD=async(e,t)=>{let n=B(e.env),r=LE(await H(n),t),i=V(n,r),{removedCheckout:a,warning:o}=await G(n,zE(r),()=>sD(n,i));return await G(n,`home`,()=>lD(n,r)),{data:{key:r,removed_checkout:a},warnings:eD(o)}},dD=e=>e.removed_checkout?[`removed ${e.key} (checkout deleted)`]:[`removed ${e.key} (checkout was already missing)`],fD=(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. next.js`).action((e,n,r)=>{let i=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let{data:n,warnings:r}=await uD(t,e);Q(t,a,dD(n),n,r)})()})},pD=e=>`no ref matches '${e}' — run refs list, or add it: refs add <url>`,mD=/^[a-z][a-z0-9+.-]*:\/\//iu,hD=/^git@[^:/\s]+:[^\s]+$/u,gD=e=>mD.test(e)||hD.test(e),_D=(e,t)=>{try{return uu(e,t)}catch{if(gD(e))throw T(`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}},vD=(e,t,n)=>{let r=_D(t,n);if(r!==void 0){if(Object.hasOwn(e.refs,r.key))return{key:r.key};throw C(pD(t))}},yD=(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:Us.parse(r)})}return n},bD=(e,t)=>`package '${e}' is registered by more than one ref: ${t.join(`, `)} — use the full ref key`,xD=(e,t)=>{let n=yD(e,t),[r]=n;if(r!==void 0){if(n.length>1)throw w(bD(t,n.map(e=>e.key)));return r}},SD=(e,t)=>{let n=t.split(`/`);for(let t=n.length-1;t>=1;--t){let r=n.slice(0,t).join(`/`),i=xD(e,r);if(i!==void 0)return{...i,name:r}}},CD=(e,t)=>{try{return LE(e,t)}catch(e){throw e instanceof at&&e.code===`not_found`?C(pD(t)):e}},wD=(e,t,n)=>{let r=vD(e,t,n);if(r!==void 0)return r;let i=xD(e,t);if(i!==void 0)return{key:i.key,packageMatch:{...i,name:t}};let a=SD(e,t);return a===void 0?{key:CD(e,t)}:{key:a.key,packageMatch:a}},TD=(e,t)=>{let n=e.refs[t];if(n===void 0)throw Error(`internal: resolved ref key '${t}' is missing from config.refs`);return n},ED=(e,t)=>{if(e.packageMatch===void 0)return null;let{entry:n,name:r}=e.packageMatch;return{local_path:y(t,n.path),name:r,path:n.path}},DD=async(e,t)=>{let n=B(e.env),r=await H(n),i=wD(r,t,{allowFileUrls:BE(e.env)}),a=TD(r,i.key),o=await Z(n),s=V(n,i.key),c=Gs(jw(`sync_ttl`,a,r.settings));return{key:i.key,local_path:s,missing:!U(s),package:ED(i,s),stale:kE(o.refs[i.key]?.last_fetched_at,c,Date.now())}},OD=e=>{let t=[e.key,`local_path: ${e.local_path}`];return e.package!==null&&t.push(`package: ${e.package.name}`,`local_path: ${e.package.local_path}`),t},kD=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let n=await DD(t,e);Q(t,a,OD(n),n)})()})},AD={},jD=(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},MD=e=>e instanceof Error?e.message:String(e),ND=async(e,t)=>{if(!U(t))return{tags:[]};try{return{tags:await Ol(e.runner,t,5)}}catch(e){return{tags:[],warning:`could not list tags: ${MD(e)}`}}},PD=[],FD=e=>e===void 0?PD:[e],ID=async(e,t)=>{let n=B(e.env),r=await H(n),i=LE(r,t),a=jD(r,i),o=await Z(n),s=V(n,i),{tags:c,warning:l}=await ND(e,s);return{data:{...a,key:i,local_path:s,sample_tags:c,state:o.refs[i]??AD},warnings:FD(l)}},LD=e=>{let t=[`${e.key} ${e.description}`,`url: ${e.url}`,`local_path: ${e.local_path}`];return e.sample_tags.length>0&&t.push(`tags: ${e.sample_tags.join(`, `)}`),t},RD=(e,t)=>{e.command(`show`).description(`Show a configured ref: full entry, state, local path, and sample tags.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. next.js`).action((e,n,r)=>{let i=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let{data:n,warnings:r}=await ID(t,e);Q(t,a,LD(n),n,r)})()})},zD=(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},BD=async(e,t,n)=>{let r=await H(e),i=r.refs[t];i!==void 0&&(r.refs[t]={...i,default_branch:n},await Xc(e,r))},VD=(e,t,n)=>G(e,`home`,async()=>{n.branchRenamedTo!==void 0&&await BD(e,t,n.branchRenamedTo);let r=await Z(e);r.refs[t]=zD(r.refs[t],n),await Pw(e,r)}),HD=async(e,t,n)=>{try{await G(e,`home`,async()=>{let r=await Z(e);r.refs[t]={...r.refs[t],last_error:n},await Pw(e,r)})}catch{}},UD=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()}}},WD=async(e,t)=>{await e.acquire();try{return await t()}finally{e.release()}},GD=(e,t,n)=>`checkout at ${e} points at '${W(t)}' — expected '${W(n)}'; remove the checkout directory or run refs remove before retrying`,KD=e=>e.exitCode===0?e.stdout.trim():`(no origin remote)`,qD=(e,t)=>{try{return uu(e,{allowFileUrls:t}).key}catch{return}},JD=async(e,t)=>{let n=await e.run(`git`,[`remote`,`get-url`,`origin`],{cwd:t.dest}),r=KD(n),i=qD(t.expectedUrl,t.allowFileUrls),a=qD(r,t.allowFileUrls);if(!(i!==void 0&&a===i))throw ot(GD(t.dest,r,t.expectedUrl))},YD=e=>`checkout at ${e} exists but is not refs-managed — remove it (rm -rf ${e}) and retry`,XD=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 ot(YD(t.dest))},ZD=async(e,t)=>{if(Hc(t.home,t.dest),U(t.dest))return await JD(e,{allowFileUrls:t.allowFileUrls,dest:t.dest,expectedUrl:t.cloneUrl}),await XD(e,{dest:t.dest,hooksDir:t.hooksDir}),{};await o(_(t.dest),{recursive:!0});let n=await yl(e,t);return n.warning===void 0?{effectiveMode:n.effectiveMode}:{effectiveMode:n.effectiveMode,warning:n.warning}},QD=(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`,$D=(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`,eO=async(e,t)=>{await JD(e,t),await XD(e,{dest:t.dest,hooksDir:t.hooksDir});let n=await e.run(`git`,[`rev-parse`,`HEAD`],{cwd:t.dest});if(n.exitCode!==0)throw T(QD(t.key,t.dest));let r=n.stdout.trim();if(!kw.shape.head_sha.safeParse(r).success)throw T($D(t.key,t.dest,r));return r},tO=(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`,nO=(e,t,n)=>{if(!kw.shape.head_sha.safeParse(n).success)throw T(tO(e,t,n));return n},rO=(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},iO=async(e,t,n)=>{await o(_(n),{recursive:!0});let r=jw(`clone_mode`,t.ref,t.settings),i=await yl(e.runner,{cloneUrl:t.ref.url,dest:n,hooksDir:t.home.hooksDir,mode:r}),a=await xl(e.runner,n),s=await eO(e.runner,{allowFileUrls:BE(e.env),dest:n,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.key});return rO(t,i,{actualBranch:a,headSha:s})},aO=async(e,t,n)=>{await XD(e.runner,{dest:n,hooksDir:t.home.hooksDir}),await JD(e.runner,{allowFileUrls:BE(e.env),dest:n,expectedUrl:t.ref.url});let r=await Dl(e.runner,{defaultBranch:t.ref.default_branch,dir:n}),i={headSha:nO(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},oO=(e,t)=>G(t.home,zE(t.key),()=>{let n=V(t.home,t.key);return Hc(t.home,n),U(n)?aO(e,t,n):iO(e,t,n)}),sO=e=>e instanceof Error?e.message:String(e),cO=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(` | `)},lO=(e,t)=>{let n={key:e,status:t.status},r=cO(t);return r!==void 0&&(n.warning=r),n},uO=async(e,t)=>{try{let n=await oO(e,t);return await VD(t.home,t.key,n),lO(t.key,n)}catch(e){let n=sO(e);return await HD(t.home,t.key,n),{error:n,key:t.key,status:`failed`}}},dO=(e,t)=>e.status===`fulfilled`?e.value:{error:sO(e.reason),key:t,status:`failed`},fO=async(e,t)=>{let n=UD(4);return(await Promise.allSettled(t.map(t=>WD(n,()=>uO(e,t))))).map((e,n)=>{let r=t[n];if(r===void 0)throw Error(`internal: sync target at index ${n} is missing`);return dO(e,r.key)})},pO=(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},mO=(e,t,n)=>({home:e,key:n,ref:pO(t,n),settings:t.settings}),hO=(e,t,n)=>n.length===0?Object.keys(t.refs).toSorted().map(n=>mO(e,t,Us.parse(n))):n.map(n=>mO(e,t,LE(t,n))),gO=(e,t,n)=>{let r=Date.now();return t.filter(t=>{let i=Gs(jw(`sync_ttl`,t.ref,t.settings)),a=kE(n.refs[t.key]?.last_fetched_at,i,r),o=!U(V(e,t.key));return a||o})},_O=async(e,t,n)=>{if(!n)return t;let r=await Z(e);return gO(e,t,r)},vO=async(e,t)=>{let n=B(e.env),r=await H(n),i=hO(n,r,t.refs),a=await fO(e,await _O(n,i,t.staleOnly));return{failedCount:a.filter(e=>e.status===`failed`).length,results:a}},yO=[`updated`,`fresh`,`cloned`,`restored`,`failed`],bO={cloned:`Cloned`,failed:`Failed`,fresh:`Fresh`,restored:`Restored`,updated:`Updated`},xO=e=>{let t={cloned:[],failed:[],fresh:[],restored:[],updated:[]};for(let n of e)t[n.status].push(n);return t},SO=e=>e.status===`failed`?` ${e.key}: ${e.error??`unknown error`}`:e.warning===void 0?` ${e.key}`:` ${e.key} (${e.warning})`,CO=e=>{let t=xO(e),n=[yO.map(e=>`${bO[e]} (${t[e].length})`).join(` / `)];for(let e of yO)for(let r of t[e])n.push(SO(r));return n},wO=(e,t)=>({refs:e,staleOnly:t.staleOnly===!0}),TO=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let r=await vO(t,wO(e,n));Q(t,a,CO(r.results),{results:r.results}),r.failedCount>0&&(process.exitCode=it.UNEXPECTED)})()})},EO=(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},DO=(e,t,n)=>{if(n===void 0)return e.tag_format;let r=e.packages?.[n];if(r===void 0)throw C(`no package '${n}' registered on ref '${t}'`);return r.tag_format??e.tag_format},OO=(e,t)=>{if(!U(e))throw C(`checkout for '${t}' is missing — run: refs sync ${t}`)},kO=async(e,t)=>{let n=B(e.env),r=await H(n),i=LE(r,t.query),a=EO(r,i),o=DO(a,i,t.opts.packageName),s=V(n,i);OO(s,i);let c=await Ul(e.runner,s,o,t.version);return{key:i,ref_path:`refs/tags/${c}`,tag:c,version:t.version}},AO=e=>[`${e.key}@${e.version} -> ${e.tag}`],jO=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},MO=[TE,OE,fD,kD,RD,TO,(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. next.js`).argument(`<version>`,`version to resolve, e.g. 15.3.0`).option(`--package <name>`,`resolve against this package's tag_format instead of the ref's`).action((e,n,r,i)=>{let a=i.optsWithGlobals(),o={json:a.json===!0,verbose:a.verbose===!0};return $(t,o,async()=>{let i=await kO(t,{opts:jO(r),query:e,version:n});Q(t,o,AO(i),i)})()})}],NO=e=>e.description===void 0?{path:e.path}:{description:e.description,path:e.path},PO=(e,t,n)=>e.length>0?Object.fromEntries(e.map(e=>[e.name,NO(e)])):n===void 0?{}:{[n]:{path:t??`.`}},FO=(e,t)=>{let n=e.description??t;return e.tag_format===void 0?{description:n,path:e.path}:{description:n,path:e.path,tag_format:e.tag_format}},IO=(e,t)=>{let n=Object.entries(e);if(n.length!==0)return Object.fromEntries(n.map(([e,n])=>[e,FO(n,t)]))},LO=e=>{if(Object.keys(e).length!==0)return e},RO=e=>{if(e===null)throw T(`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},zO=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},BO=[],VO=e=>e===void 0?[...BO]:[e],HO=async(e,t,n)=>{let r=await xl(e,t),i=Vl(await Ol(e,t));return{defaultBranch:r,packages:PO(await tT(t),n.npmDirectory,n.npmPkgName),tagFormatCandidate:i}},UO=(e,t)=>G(t.home,zE(t.resolved.key),async()=>{let n=await ZD(e.runner,{allowFileUrls:BE(e.env),cloneUrl:t.resolved.cloneUrl,dest:t.dest,home:t.home,hooksDir:t.home.hooksDir,mode:t.cloneMode}),r={fields:await HO(e.runner,t.dest,t.resolved)};return n.effectiveMode!==void 0&&(r.effectiveMode=n.effectiveMode),n.warning!==void 0&&(r.warning=n.warning),r}),WO=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},GO=async(e,t)=>{let n=B(e.env),r=await H(n),i=WE(await UE(e,t),r.settings);KE(r,i.key),await QE(n,i.key);let a=V(n,i.key),o=jw(`clone_mode`,void 0,r.settings),s=await UO(e,{cloneMode:o,dest:a,home:n,resolved:i});return WO({cloneResult:s,dest:a,resolved:i})},KO=(e,t,n)=>G(e,`home`,async()=>{KE(await H(e),t);let r=await Z(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 Pw(e,r)}),qO=(e,t)=>{let n=tc.safeParse(e);if(!n.success)throw T(k(n.error));let r=Aw.safeParse(t);if(!r.success)throw T(k(r.error));return{config:n.data,state:r.data}},JO=async(e,t)=>{let n=await H(e.home);KE(n,e.ref.key);let r=zO(e.ref);n.refs[e.ref.key]=r;let i=await Z(e.home);return i.refs[e.ref.key]={effective_clone_mode:e.effectiveCloneMode??i.refs[e.ref.key]?.effective_clone_mode??jw(`clone_mode`,void 0,n.settings),head_sha:t,last_fetched_at:new Date().toISOString()},{...qO(n,i),entry:r}},YO=async(e,t)=>{let n=BE(e.env),r=await G(t.home,zE(t.ref.key),()=>(Hc(t.home,t.dest),eO(e.runner,{allowFileUrls:n,dest:t.dest,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.ref.key})));return G(t.home,`home`,async()=>{let{config:e,entry:n,state:i}=await JO(t,r);return await Pw(t.home,i),await Xc(t.home,e),{entry:n,key:t.ref.key}})},XO=(e,t)=>t===`-`?e.readStdin():s(t,`utf8`),ZO=e=>e instanceof Error?e.message:String(e),QO=e=>{try{return JSON.parse(e)}catch(e){throw T(`invalid JSON in proposal: ${ZO(e)}`)}},$O=e=>{let t=Ow.safeParse(e);if(!t.success)throw T(k(t.error));return t.data},ek=async(e,t)=>{let n=await XO(e,t);return $O(QO(n))},tk=(e,t)=>[`refs add: dry-run proposal ready for '${e}' (checkout: ${t})`,`next: review the proposal, then run refs add --proposal <file> to finalize`],nk=async(e,t)=>{let n=await GO(e,t);await KO(B(e.env),n.proposal.key,n.effectiveCloneMode);let r=VO(n.warning);return{data:n.proposal,human:tk(n.proposal.key,n.dest),warnings:r}},rk=e=>[`refs add: '${e}' added to config`],ik=e=>{let t={default_branch:e.default_branch,description:e.description,key:e.key,tag_format:RO(e.tag_format_candidate),url:e.url},n=LO(e.packages);return n!==void 0&&(t.packages=n),t},ak=async(e,t)=>{let n=await ek(e,t),r=B(e.env),i=V(r,n.key);if(!U(i))throw C(`no checkout found at ${i} — run: refs add <source> --dry-run first`);let{entry:a,key:o}=await YO(e,{dest:i,home:r,ref:ik(n)});return{data:{entry:a,key:o},human:rk(o),warnings:[]}},ok=(e,t)=>{let n={default_branch:e.proposal.default_branch,description:t,key:e.proposal.key,tag_format:RO(e.proposal.tag_format_candidate),url:e.proposal.url},r=IO(e.proposal.packages,t);return r!==void 0&&(n.packages=r),n},sk=async(e,t,n)=>{let r=await GO(e,t),i=B(e.env),a=ok(r,n),o={dest:r.dest,home:i,ref:a};r.effectiveCloneMode!==void 0&&(o.effectiveCloneMode=r.effectiveCloneMode);let{entry:s,key:c}=await YO(e,o),l=VO(r.warning);return{data:{entry:s,key:c},human:rk(c),warnings:l}},ck=e=>{let t=[e.dryRun,e.proposal!==void 0,e.description!==void 0].filter(Boolean).length;if(t>1)throw w(`refs add: use only one of --dry-run, --proposal, or --description`);if(t===0)throw w(`refs add needs --dry-run, --proposal, or --description`)},lk=e=>{if(e===void 0||e===``)throw w(`refs add requires <source> (a git url or npm:<package>)`);return e},uk=(e,t)=>(ck(t),t.proposal===void 0?t.description===void 0?nk(e,lk(t.source)):sk(e,lk(t.source),t.description):ak(e,t.proposal)),dk=(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},fk=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let r=await uk(t,dk(e,n));Q(t,a,r.human,r.data,r.warnings)})()})},pk=e=>e===void 0?null:e,mk=()=>Object.keys($s.shape).toSorted().join(`, `),hk=e=>`unknown package field '${e}' — valid fields: ${mk()}`,gk=e=>Object.hasOwn($s.shape,e),_k=(e,t,n)=>{let r=e.packages?.[n];if(r===void 0)throw C(`no package '${n}' registered on ref '${t}'`);return r},vk=(e,t,n)=>{if(!gk(t))throw w(hk(t));let r=e[t],i=$s.safeParse({...e,[t]:n});if(!i.success)throw T(k(i.error));return{field:t,newValue:i.data[t],oldValue:r,updated:i.data}},yk=async e=>{let t=_k(e.entry,e.key,e.packageName),n=vk(t,e.field,e.value),r={...e.entry,packages:{...e.entry.packages,[e.packageName]:n.updated}};return await Xc(e.home,{...e.config,refs:{...e.config.refs,[e.key]:r}}),{field:n.field,key:e.key,new:pk(n.newValue),old:pk(n.oldValue)}},bk=`packages`,xk=(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},Sk=()=>Object.keys(ec.shape).filter(e=>e!==bk).toSorted().join(`, `),Ck=e=>`unknown ref field '${e}' — valid fields: ${Sk()}`,wk=e=>Object.hasOwn(ec.shape,e),Tk=(e,t,n)=>`failed to rewrite git remote at ${e} to '${W(t)}': ${n.trim()}`,Ek=async(e,t)=>{if(Hc(t.home,t.dest),!U(t.dest))return;let n=await e.runner.run(`git`,[`remote`,`set-url`,`origin`,t.cloneUrl],{cwd:t.dest});if(n.exitCode!==0)throw T(Tk(t.dest,t.cloneUrl,n.stderr))},Dk=async(e,t)=>{let n=uu(t.value,{allowFileUrls:BE(e.env)});if(n.key!==t.key)throw T(`new url derives a different key — remove and re-add instead`);let r=V(t.home,t.key);return await Ek(e,{cloneUrl:n.cloneUrl,dest:r,home:t.home}),{...t.entry,url:n.cloneUrl}},Ok=(e,t,n)=>{let r={...e,[t]:n},i=ec.safeParse(r);if(!i.success)throw T(k(i.error));return i.data},kk=(e,t)=>t.field===`url`?Dk(e,{entry:t.entry,home:t.home,key:t.key,value:t.value}):Promise.resolve(Ok(t.entry,t.field,t.value)),Ak=async(e,t)=>{let{field:n}=t;if(n===bk)throw w(`use --package <name> <field> <value>`);if(!wk(n))throw w(Ck(n));let r=t.entry[n],i=await kk(e,{entry:t.entry,field:n,home:t.home,key:t.key,value:t.value});return{new:i[n],old:r,updated:i}},jk=(e,t)=>{let n=B(e.env),{field:r,opts:i,query:a,value:o}=t;return G(n,`home`,async()=>{let t=await H(n),s=LE(t,a),c=xk(t,s);if(i.packageName!==void 0)return yk({config:t,entry:c,field:r,home:n,key:s,packageName:i.packageName,value:o});let l=await Ak(e,{entry:c,field:r,home:n,key:s,value:o});return await Xc(n,{...t,refs:{...t.refs,[s]:l.updated}}),{field:r,key:s,new:pk(l.new),old:pk(l.old)}})},Mk=`settings`,Nk=[],Pk=()=>Object.keys(Zs.shape).toSorted().join(`, `),Fk=e=>`unknown setting '${e}' — valid settings: ${Pk()}`,Ik=e=>Object.hasOwn(Zs.shape,e),Lk=e=>`note: 'settings' addressed the global settings, not ${e} — use the full ref key to edit that ref`,Rk=e=>{try{let t=LE(e,Mk);return[Lk(`ref '${t}'`)]}catch(e){if(e instanceof at&&e.code===`usage`)return[Lk("one of several matching refs — see `refs list`")];if(e instanceof at&&e.code===`not_found`)return Nk;throw e}},zk=e=>({data:{field:e.key,key:Mk,new:pk(e.parsed[e.key]),old:pk(e.old)},warnings:Rk(e.config)}),Bk=(e,t)=>{let n=B(e.env);return G(n,`home`,async()=>{let e=await H(n);if(!Ik(t.key))throw w(Fk(t.key));let r=e.settings[t.key],i={...e.settings,[t.key]:t.value},a=Zs.safeParse(i);if(!a.success)throw T(k(a.error));return await Xc(n,{...e,settings:a.data}),zk({config:e,key:t.key,old:r,parsed:a.data})})},Vk=[],Hk=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},Uk=async(e,t)=>{if(t.first===`settings`){if(t.opts.packageName!==void 0)throw w(`--package is not valid with 'refs edit settings ...' — it only applies to ref/package edits`);return Bk(e,{key:t.second,value:t.value})}return{data:await jk(e,{field:t.second,opts:t.opts,query:t.first,value:t.value}),warnings:Vk}},Wk=e=>e==null?`(unset)`:String(e),Gk=e=>[`${e.key}: ${e.field} '${Wk(e.old)}' -> '${Wk(e.new)}'`],Kk=(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=a.optsWithGlobals(),s={json:o.json===!0,verbose:o.verbose===!0};return $(t,s,async()=>{let{data:a,warnings:o}=await Uk(t,{first:e,opts:Hk(i),second:n,value:r});Q(t,s,Gk(a),a,o)})()})},qk=`Install the agent skill: npx skills add kaisers-io/refs (private phase: npx skills add <path-to-this-repo> --skill refs)`,Jk=async e=>{await o(e.root,{recursive:!0}),await o(e.sourcesDir,{recursive:!0}),await o(e.locksDir,{recursive:!0}),await o(e.hooksDir,{recursive:!0})},Yk=async e=>{let t=B(e.env);return await Jk(t),{config:await G(t,`home`,async()=>{let e=await sl(t,xT);return await jl(t),e}),home:t.root,skill_hint:qk}},Xk=[(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=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await Yk(t);Q(t,i,[`refs home: ${e.home} (${e.config})`,qk],e)})()})},fk,Kk,RE,...MO],Zk=(e,t)=>{for(let n of Xk)n(e,t)},Qk=[``,`Examples:`,` $ refs list --json`,` $ refs sync --stale-only --json`,` $ refs resolve next/navigation --json`,``,`Every command accepts --json for structured output and --verbose for stack traces on error.`].join(`
403
+ 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 gT(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 _T(){if(b.env.NO_COLOR||b.env.FORCE_COLOR===`0`||b.env.FORCE_COLOR===`false`)return!1;if(b.env.FORCE_COLOR||b.env.CLICOLOR_FORCE!==void 0)return!0}new hT;const vT=[],yT=e=>Array.isArray(e)?e:[e],Q=(e,t,n,r,i)=>{if(t.json){let t={data:r,ok:!0,warnings:i??vT};e.out(JSON.stringify(t));return}for(let t of yT(n))e.out(t);for(let t of i??vT)e.errLine(`refs: warning: ${t}`)},bT=(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}`)},$=(e,t,n)=>async()=>{try{await n()}catch(n){let r=ct(n,{verbose:t.verbose});bT(e,t,r),process.exitCode=r.exitCode}};var xT=`0.1.1`;const ST=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`}},CT=/^v(?<major>\d+)\.(?<minor>\d+)/u,wT=e=>{let t=CT.exec(e),n=t?.groups?.major,r=t?.groups?.minor;if(!(n===void 0||r===void 0))return{major:Number(n),minor:Number(r)}},TT=e=>e===void 0?!1:e.major===24&&e.minor>=12,ET=e=>{let{nodeVersion:t}=e;return TT(wT(t))?{detail:t,name:`node`,status:`ok`}:{detail:`${t} does not satisfy the required range >=24.12 <25`,name:`node`,status:`fail`}},DT=e=>e instanceof Error?e.message:String(e),OT=()=>tc.parse({meta:{cli_version:`0.0.0`,schema_version:1},refs:{},settings:{}}),kT=async e=>{try{return{config:await H(e)}}catch(e){return{config:OT(),errorMessage:DT(e)}}},AT=e=>e===void 0?{detail:`config is present and matches the current schema`,name:`config`,status:`ok`}:{detail:e,name:`config`,status:`fail`},jT=[`.claude`,`skills`,`refs`,`SKILL.md`],MT=[`.codex`,`skills`,`refs`,`SKILL.md`],NT=e=>e===void 0?[]:[y(e,...jT),y(e,...MT)],PT=async e=>{try{return await t(e),!0}catch{return!1}},FT=async e=>{let t=NT(e.env.HOME);return(await Promise.all(t.map(e=>PT(e)))).some(Boolean)?{detail:`the refs skill is installed`,name:`skill`,status:`ok`}:{detail:`refs skill not found — install it: npx skills add kaisers-io/refs`,name:`skill`,status:`warn`}},IT=(e,t)=>Object.keys(t.refs).map(t=>({dest:V(e,Us.parse(t)),key:t})).filter(e=>U(e.dest)),LT=[`pre-commit`,`pre-push`],RT=async(e,n)=>{try{return await t(y(e.hooksDir,n),r.X_OK),!0}catch{return!1}},zT=async e=>{let t=await Promise.all(LT.map(t=>RT(e,t)));return LT.filter((e,n)=>!t[n])},BT=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},VT=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:`${LT.map(e=>`hooks/${e}`).join(`, `)} present; ${e.checkoutCount} checkout(s) guarded`,name:`hooks-guard`,status:`ok`},HT=async(e,t,n)=>{let r=IT(t,n),[i,a]=await Promise.all([zT(t),Promise.all(r.map(n=>BT(e,t,n.dest)))]),o=r.filter((e,t)=>!a[t]).map(e=>e.key);return VT({badKeys:o,checkoutCount:r.length,missingHooks:i})},UT=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}},WT=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`}},GT=async(e,t,n)=>{let r=IT(t,n),i=await Promise.all(r.map(t=>UT(e,t)));return WT(i)},KT=async e=>{try{return await Z(e)}catch{return Aw.parse({})}},qT=async e=>{try{return(await c(e,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch(e){if(Lc(e))return[];throw e}},JT=async(e,t)=>{if(U(e))return[[...t]];let n=await qT(e);return(await Promise.all(n.map(n=>JT(y(e,n),[...t,n])))).flat()},YT=(e,t,n)=>{let r=e.refs[t]?.pending_proposal_at;return r===void 0?!1:n-Date.parse(r)<864e5},XT=(e,t,n)=>YT(t,e.key,n)?`${e.key}: pending add`:`${e.key}: orphan — remove with: rm -rf ${e.dest}`,ZT=(e,t)=>({dest:y(e.sourcesDir,...t),key:t.join(`/`)}),QT=async(e,t,n)=>{let r=(await JT(e.sourcesDir,[])).map(t=>ZT(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=>XT(e,n,i)).join(`; `),name:`orphans`,status:`warn`}},$T=/^(?<user>[^/\s@]+)@(?<host>[^:/\s]+):/u,eE=e=>e===``?{}:{user:e},tE=e=>e===``?{}:{port:e},nE=e=>{try{let t=new URL(e);return t.protocol===`ssh:`?{host:t.hostname,...eE(t.username),...tE(t.port)}:void 0}catch{return}},rE=e=>{let t=$T.exec(e),n=t?.groups?.host;return n===void 0?nE(e):{host:n,user:t?.groups?.user??`git`}},iE=e=>e.port===void 0?e.host:`${e.host}:${e.port}`,aE=e=>e.user===void 0?iE(e):`${e.user}@${iE(e)}`,oE=e=>{let t=Object.values(e.refs).map(e=>rE(e.url)).filter(e=>e!==void 0),n=new Map;for(let e of t)n.set(aE(e),e);return[...n.values()].toSorted((e,t)=>aE(e).localeCompare(aE(t)))},sE=/Permission denied/u,cE=[/Could not resolve hostname/u,/Connection refused/u,/Host key verification failed/u,/timed out/u],lE=e=>e.user===void 0?e.host:`${e.user}@${e.host}`,uE=e=>{let t=[`-o`,`ConnectTimeout=5`,`-o`,`BatchMode=yes`],n=lE(e);return e.port===void 0?[...t,`-T`,n]:[...t,`-p`,e.port,`-T`,n]},dE=async(e,t,n)=>{let r=aE(t),i=await e.runner.run(`ssh`,uE(t),{timeoutMs:n});return i.timedOut===!0?{host:r,outcome:`timeout`}:sE.test(i.stderr)?{host:r,outcome:`denied`}:cE.some(e=>e.test(i.stderr))?{detail:i.stderr.trim(),host:r,outcome:`connection-warn`}:{host:r,outcome:`ok`}},fE=(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`}},pE=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`}},mE=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`}},hE=e=>({detail:`ssh auth ok for: ${e.map(e=>e.host).join(`, `)}`,name:`ssh-auth`,status:`ok`}),gE=(e,t)=>fE(e,t)??pE(e)??mE(e)??hE(e),_E=async(e,t,n)=>{let r=oE(t);if(r.length===0)return;let i=n?.timeoutMs??1e4,a=await Promise.all(r.map(t=>dE(e,t,i)));return gE(a,i)},vE=async e=>{try{return await e.run()}catch(t){return{detail:`check crashed: ${DT(t)}`,name:e.name,status:`fail`}}},yE=async e=>{let[t,...n]=e;if(t===void 0)return[];let r=await vE(t),i=await yE(n);return r===void 0?i:[r,...i]},bE=e=>{let{configLoad:t,ctx:n,home:r,state:i}=e;return[{name:`git`,run:()=>ST(n)},{name:`node`,run:()=>Promise.resolve(ET(n))},{name:`config`,run:()=>Promise.resolve(AT(t.errorMessage))},{name:`hooks-guard`,run:()=>HT(n,r,t.config)},{name:`dirty-checkouts`,run:()=>GT(n,r,t.config)},{name:`orphans`,run:()=>QT(r,t.config,i)},{name:`skill`,run:()=>FT(n)},{name:`ssh-auth`,run:()=>_E(n,t.config)}]},xE=async e=>{let t=B(e.env),n=await kT(t),r=await KT(t);return yE(bE({configLoad:n,ctx:e,home:t,state:r}))},SE={fail:`FAIL`,ok:`OK`,warn:`WARN`},CE=e=>e.map(e=>`[${SE[e.status]}] ${e.name}: ${e.detail}`),wE=e=>e.some(e=>e.status===`fail`),TE=(e,t)=>{e.command(`doctor`).description(`Run environment/integrity checks (git, node, config, hooks, checkouts, ssh).`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await xE(t);Q(t,i,CE(e),{checks:e}),wE(e)&&(process.exitCode=it.UNEXPECTED)})()})},EE=async e=>{let t=B(e.env),n=await G(t,`home`,()=>sl(t,xT));return n===`migrated`?{backup:zc(t),result:n}:{backup:null,result:n}},DE=e=>e.result===`migrated`&&e.backup!==null?`config migrated (backup: ${g(e.backup)})`:e.result===`seeded`?`config seeded`:`config up to date`,OE=(e,t)=>{e.command(`migrate`).description(`Migrate the refs config to the current schema, seeding it if absent.`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await EE(t);Q(t,i,DE(e),e)})()})},kE=(e,t,n)=>e===void 0?!0:n-Date.parse(e)>t,AE=(e,t,n)=>{let r=e.state.refs[t],i=Gs(jw(`sync_ttl`,n,e.settings));return{clone_mode:jw(`clone_mode`,n,e.settings),description:n.description,key:t,missing:!U(V(e.home,Us.parse(t))),packages:Object.keys(n.packages??{}).toSorted(),stale:kE(r?.last_fetched_at,i,e.now)}},jE=e=>{let t={home:e.home,now:e.now,settings:e.config.settings,state:e.state};return Object.entries(e.config.refs).map(([e,n])=>AE(t,e,n)).toSorted((e,t)=>e.key.localeCompare(t.key))},ME=async e=>{let t=B(e.env),n=await H(t),r=await Z(t);return jE({config:n,home:t,now:Date.now(),state:r})},NE=e=>{let t=[];return e.stale&&t.push(`[stale]`),e.missing&&t.push(`[missing]`),t.length===0?``:` ${t.join(` `)}`},PE=e=>e.length===0?[`no refs configured — run: refs add <source>`]:e.map(e=>`${e.key} ${e.description}${NE(e)}`),FE=e=>e.split(`/`),IE=(e,t)=>{let n=FE(e);if(t.length>n.length)return!1;let r=n.length-t.length;return t.every((e,t)=>e===n[r+t])},LE=(e,t)=>{if(Object.hasOwn(e.refs,t))return Us.parse(t);let n=FE(t),r=Object.keys(e.refs).filter(e=>IE(e,n)).toSorted(),[i]=r;if(i===void 0)throw C(`no ref matches '${t}'`);if(r.length>1)throw w(`'${t}' matches more than one ref: ${r.join(`, `)}`);return Us.parse(i)},RE=(e,t)=>{e.command(`list`).description(`List configured refs with their staleness/missing checkout status.`).action((e,n)=>{let r=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await ME(t);Q(t,i,PE(e),e)})()})},zE=e=>`ref:${e.replaceAll(`/`,`_`)}`,BE=e=>e.REFS_ALLOW_FILE_URLS===`1`,VE=(e,t)=>{let n=uu(t,{allowFileUrls:BE(e.env)});return{cloneUrl:n.cloneUrl,key:n.key}},HE=async(e,t)=>{if(t===``)throw w(`refs add npm: requires a package name, e.g. npm:left-pad`);let n=await fd(e.fetcher,t),r={cloneUrl:n.cloneUrl,key:n.key,npmPkgName:t};return n.directory!==void 0&&(r.npmDirectory=n.directory),r},UE=(e,t)=>t.startsWith(`npm:`)?HE(e,t.slice(4)):Promise.resolve(VE(e,t)),WE=(e,t)=>{if(e.npmPkgName===void 0)return e;let n=jw(`git_transport`,void 0,t);return{...e,cloneUrl:Su(e.cloneUrl,n)}},GE=e=>`ref '${e}' already exists — use refs edit or refs remove`,KE=(e,t)=>{if(e.refs[t]!==void 0)throw ot(GE(t))},qE=async e=>{try{return await c(e,{withFileTypes:!0})}catch(e){if(Lc(e))return;throw e}},JE=e=>e.filter(e=>e.isDirectory()).map(e=>e.name),YE=async(e,t)=>{let n=await qE(e);if(n===void 0)return{kind:`stop`};let r=JE(n);if(r.includes(t))return{kind:`continue`,nextDir:y(e,t)};let i=r.find(e=>e.toLowerCase()===t.toLowerCase());return i===void 0?{kind:`stop`}:{kind:`collision`,name:i}},XE=async(e,t,n)=>{let[r,...i]=t;if(r===void 0)return;let a=await YE(e,r);if(a.kind!==`stop`)return a.kind===`collision`?[...n,a.name].join(`/`):XE(a.nextDir,i,[...n,r])},ZE=[],QE=async(e,t)=>{let n=await XE(e.sourcesDir,t.split(`/`),ZE);if(n!==void 0)throw ot(`checkout path for '${t}' collides case-insensitively with existing '${n}'`)},$E=[],eD=e=>e===void 0?$E:[e],tD=async e=>{try{return await a(e),!0}catch(e){if(Lc(e))return!1;throw e}},nD=async e=>{try{return await c(e)}catch(e){if(Lc(e))return;throw e}},rD=async e=>{try{return(await a(e)).isDirectory()}catch(e){if(Lc(e))return;throw e}},iD=async e=>{let t=await nD(e);if(t===void 0)return!0;if(t.length!==0)return!1;try{await f(e)}catch(e){if(!Lc(e))throw e}return!0},aD=async e=>{let t=await rD(e);return t===void 0?!0:t?iD(e):!1},oD=async(e,t)=>{t!==e.sourcesDir&&await aD(t)&&await oD(e,_(t))},sD=async(e,t)=>await tD(t)?(Hc(e,t),await d(t,{force:!0,recursive:!0}),await oD(e,_(t)),{removedCheckout:!0}):{removedCheckout:!1,warning:`checkout was already missing`},cD=(e,t)=>Object.fromEntries(Object.entries(e).filter(([e])=>e!==t)),lD=async(e,t)=>{let n=await H(e);await Xc(e,{...n,refs:cD(n.refs,t)});let r=await Z(e);await Pw(e,{...r,refs:cD(r.refs,t)})},uD=async(e,t)=>{let n=B(e.env),r=LE(await H(n),t),i=V(n,r),{removedCheckout:a,warning:o}=await G(n,zE(r),()=>sD(n,i));return await G(n,`home`,()=>lD(n,r)),{data:{key:r,removed_checkout:a},warnings:eD(o)}},dD=e=>e.removed_checkout?[`removed ${e.key} (checkout deleted)`]:[`removed ${e.key} (checkout was already missing)`],fD=(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. next.js`).action((e,n,r)=>{let i=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let{data:n,warnings:r}=await uD(t,e);Q(t,a,dD(n),n,r)})()})},pD=e=>`no ref matches '${e}' — run refs list, or add it: refs add <url>`,mD=/^[a-z][a-z0-9+.-]*:\/\//iu,hD=/^git@[^:/\s]+:[^\s]+$/u,gD=e=>mD.test(e)||hD.test(e),_D=(e,t)=>{try{return uu(e,t)}catch{if(gD(e))throw T(`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}},vD=(e,t,n)=>{let r=_D(t,n);if(r!==void 0){if(Object.hasOwn(e.refs,r.key))return{key:r.key};throw C(pD(t))}},yD=(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:Us.parse(r)})}return n},bD=(e,t)=>`package '${e}' is registered by more than one ref: ${t.join(`, `)} — use the full ref key`,xD=(e,t)=>{let n=yD(e,t),[r]=n;if(r!==void 0){if(n.length>1)throw w(bD(t,n.map(e=>e.key)));return r}},SD=(e,t)=>{let n=t.split(`/`);for(let t=n.length-1;t>=1;--t){let r=n.slice(0,t).join(`/`),i=xD(e,r);if(i!==void 0)return{...i,name:r}}},CD=(e,t)=>{try{return LE(e,t)}catch(e){throw e instanceof at&&e.code===`not_found`?C(pD(t)):e}},wD=(e,t,n)=>{let r=vD(e,t,n);if(r!==void 0)return r;let i=xD(e,t);if(i!==void 0)return{key:i.key,packageMatch:{...i,name:t}};let a=SD(e,t);return a===void 0?{key:CD(e,t)}:{key:a.key,packageMatch:a}},TD=(e,t)=>{let n=e.refs[t];if(n===void 0)throw Error(`internal: resolved ref key '${t}' is missing from config.refs`);return n},ED=(e,t)=>{if(e.packageMatch===void 0)return null;let{entry:n,name:r}=e.packageMatch;return{local_path:y(t,n.path),name:r,path:n.path}},DD=async(e,t)=>{let n=B(e.env),r=await H(n),i=wD(r,t,{allowFileUrls:BE(e.env)}),a=TD(r,i.key),o=await Z(n),s=V(n,i.key),c=Gs(jw(`sync_ttl`,a,r.settings));return{key:i.key,local_path:s,missing:!U(s),package:ED(i,s),stale:kE(o.refs[i.key]?.last_fetched_at,c,Date.now())}},OD=e=>{let t=[e.key,`local_path: ${e.local_path}`];return e.package!==null&&t.push(`package: ${e.package.name}`,`local_path: ${e.package.local_path}`),t},kD=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let n=await DD(t,e);Q(t,a,OD(n),n)})()})},AD={},jD=(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},MD=e=>e instanceof Error?e.message:String(e),ND=async(e,t)=>{if(!U(t))return{tags:[]};try{return{tags:await Ol(e.runner,t,5)}}catch(e){return{tags:[],warning:`could not list tags: ${MD(e)}`}}},PD=[],FD=e=>e===void 0?PD:[e],ID=async(e,t)=>{let n=B(e.env),r=await H(n),i=LE(r,t),a=jD(r,i),o=await Z(n),s=V(n,i),{tags:c,warning:l}=await ND(e,s);return{data:{...a,key:i,local_path:s,sample_tags:c,state:o.refs[i]??AD},warnings:FD(l)}},LD=e=>{let t=[`${e.key} ${e.description}`,`url: ${e.url}`,`local_path: ${e.local_path}`];return e.sample_tags.length>0&&t.push(`tags: ${e.sample_tags.join(`, `)}`),t},RD=(e,t)=>{e.command(`show`).description(`Show a configured ref: full entry, state, local path, and sample tags.`).argument(`<ref>`,`full ref key or a unique suffix, e.g. next.js`).action((e,n,r)=>{let i=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let{data:n,warnings:r}=await ID(t,e);Q(t,a,LD(n),n,r)})()})},zD=(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},BD=async(e,t,n)=>{let r=await H(e),i=r.refs[t];i!==void 0&&(r.refs[t]={...i,default_branch:n},await Xc(e,r))},VD=(e,t,n)=>G(e,`home`,async()=>{n.branchRenamedTo!==void 0&&await BD(e,t,n.branchRenamedTo);let r=await Z(e);r.refs[t]=zD(r.refs[t],n),await Pw(e,r)}),HD=async(e,t,n)=>{try{await G(e,`home`,async()=>{let r=await Z(e);r.refs[t]={...r.refs[t],last_error:n},await Pw(e,r)})}catch{}},UD=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()}}},WD=async(e,t)=>{await e.acquire();try{return await t()}finally{e.release()}},GD=(e,t,n)=>`checkout at ${e} points at '${W(t)}' — expected '${W(n)}'; remove the checkout directory or run refs remove before retrying`,KD=e=>e.exitCode===0?e.stdout.trim():`(no origin remote)`,qD=(e,t)=>{try{return uu(e,{allowFileUrls:t}).key}catch{return}},JD=async(e,t)=>{let n=await e.run(`git`,[`remote`,`get-url`,`origin`],{cwd:t.dest}),r=KD(n),i=qD(t.expectedUrl,t.allowFileUrls),a=qD(r,t.allowFileUrls);if(!(i!==void 0&&a===i))throw ot(GD(t.dest,r,t.expectedUrl))},YD=e=>`checkout at ${e} exists but is not refs-managed — remove it (rm -rf ${e}) and retry`,XD=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 ot(YD(t.dest))},ZD=async(e,t)=>{if(Hc(t.home,t.dest),U(t.dest))return await JD(e,{allowFileUrls:t.allowFileUrls,dest:t.dest,expectedUrl:t.cloneUrl}),await XD(e,{dest:t.dest,hooksDir:t.hooksDir}),{};await o(_(t.dest),{recursive:!0});let n=await yl(e,t);return n.warning===void 0?{effectiveMode:n.effectiveMode}:{effectiveMode:n.effectiveMode,warning:n.warning}},QD=(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`,$D=(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`,eO=async(e,t)=>{await JD(e,t),await XD(e,{dest:t.dest,hooksDir:t.hooksDir});let n=await e.run(`git`,[`rev-parse`,`HEAD`],{cwd:t.dest});if(n.exitCode!==0)throw T(QD(t.key,t.dest));let r=n.stdout.trim();if(!kw.shape.head_sha.safeParse(r).success)throw T($D(t.key,t.dest,r));return r},tO=(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`,nO=(e,t,n)=>{if(!kw.shape.head_sha.safeParse(n).success)throw T(tO(e,t,n));return n},rO=(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},iO=async(e,t,n)=>{await o(_(n),{recursive:!0});let r=jw(`clone_mode`,t.ref,t.settings),i=await yl(e.runner,{cloneUrl:t.ref.url,dest:n,hooksDir:t.home.hooksDir,mode:r}),a=await xl(e.runner,n),s=await eO(e.runner,{allowFileUrls:BE(e.env),dest:n,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.key});return rO(t,i,{actualBranch:a,headSha:s})},aO=async(e,t,n)=>{await XD(e.runner,{dest:n,hooksDir:t.home.hooksDir}),await JD(e.runner,{allowFileUrls:BE(e.env),dest:n,expectedUrl:t.ref.url});let r=await Dl(e.runner,{defaultBranch:t.ref.default_branch,dir:n}),i={headSha:nO(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},oO=(e,t)=>G(t.home,zE(t.key),()=>{let n=V(t.home,t.key);return Hc(t.home,n),U(n)?aO(e,t,n):iO(e,t,n)}),sO=e=>e instanceof Error?e.message:String(e),cO=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(` | `)},lO=(e,t)=>{let n={key:e,status:t.status},r=cO(t);return r!==void 0&&(n.warning=r),n},uO=async(e,t)=>{try{let n=await oO(e,t);return await VD(t.home,t.key,n),lO(t.key,n)}catch(e){let n=sO(e);return await HD(t.home,t.key,n),{error:n,key:t.key,status:`failed`}}},dO=(e,t)=>e.status===`fulfilled`?e.value:{error:sO(e.reason),key:t,status:`failed`},fO=async(e,t)=>{let n=UD(4);return(await Promise.allSettled(t.map(t=>WD(n,()=>uO(e,t))))).map((e,n)=>{let r=t[n];if(r===void 0)throw Error(`internal: sync target at index ${n} is missing`);return dO(e,r.key)})},pO=(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},mO=(e,t,n)=>({home:e,key:n,ref:pO(t,n),settings:t.settings}),hO=(e,t,n)=>n.length===0?Object.keys(t.refs).toSorted().map(n=>mO(e,t,Us.parse(n))):n.map(n=>mO(e,t,LE(t,n))),gO=(e,t,n)=>{let r=Date.now();return t.filter(t=>{let i=Gs(jw(`sync_ttl`,t.ref,t.settings)),a=kE(n.refs[t.key]?.last_fetched_at,i,r),o=!U(V(e,t.key));return a||o})},_O=async(e,t,n)=>{if(!n)return t;let r=await Z(e);return gO(e,t,r)},vO=async(e,t)=>{let n=B(e.env),r=await H(n),i=hO(n,r,t.refs),a=await fO(e,await _O(n,i,t.staleOnly));return{failedCount:a.filter(e=>e.status===`failed`).length,results:a}},yO=[`updated`,`fresh`,`cloned`,`restored`,`failed`],bO={cloned:`Cloned`,failed:`Failed`,fresh:`Fresh`,restored:`Restored`,updated:`Updated`},xO=e=>{let t={cloned:[],failed:[],fresh:[],restored:[],updated:[]};for(let n of e)t[n.status].push(n);return t},SO=e=>e.status===`failed`?` ${e.key}: ${e.error??`unknown error`}`:e.warning===void 0?` ${e.key}`:` ${e.key} (${e.warning})`,CO=e=>{let t=xO(e),n=[yO.map(e=>`${bO[e]} (${t[e].length})`).join(` / `)];for(let e of yO)for(let r of t[e])n.push(SO(r));return n},wO=(e,t)=>({refs:e,staleOnly:t.staleOnly===!0}),TO=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let r=await vO(t,wO(e,n));Q(t,a,CO(r.results),{results:r.results}),r.failedCount>0&&(process.exitCode=it.UNEXPECTED)})()})},EO=(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},DO=(e,t,n)=>{if(n===void 0)return e.tag_format;let r=e.packages?.[n];if(r===void 0)throw C(`no package '${n}' registered on ref '${t}'`);return r.tag_format??e.tag_format},OO=(e,t)=>{if(!U(e))throw C(`checkout for '${t}' is missing — run: refs sync ${t}`)},kO=async(e,t)=>{let n=B(e.env),r=await H(n),i=LE(r,t.query),a=EO(r,i),o=DO(a,i,t.opts.packageName),s=V(n,i);OO(s,i);let c=await Ul(e.runner,s,o,t.version);return{key:i,ref_path:`refs/tags/${c}`,tag:c,version:t.version}},AO=e=>[`${e.key}@${e.version} -> ${e.tag}`],jO=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},MO=[TE,OE,fD,kD,RD,TO,(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. next.js`).argument(`<version>`,`version to resolve, e.g. 15.3.0`).option(`--package <name>`,`resolve against this package's tag_format instead of the ref's`).action((e,n,r,i)=>{let a=i.optsWithGlobals(),o={json:a.json===!0,verbose:a.verbose===!0};return $(t,o,async()=>{let i=await kO(t,{opts:jO(r),query:e,version:n});Q(t,o,AO(i),i)})()})}],NO=e=>e.description===void 0?{path:e.path}:{description:e.description,path:e.path},PO=(e,t,n)=>e.length>0?Object.fromEntries(e.map(e=>[e.name,NO(e)])):n===void 0?{}:{[n]:{path:t??`.`}},FO=(e,t)=>{let n=e.description??t;return e.tag_format===void 0?{description:n,path:e.path}:{description:n,path:e.path,tag_format:e.tag_format}},IO=(e,t)=>{let n=Object.entries(e);if(n.length!==0)return Object.fromEntries(n.map(([e,n])=>[e,FO(n,t)]))},LO=e=>{if(Object.keys(e).length!==0)return e},RO=e=>{if(e===null)throw T(`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},zO=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},BO=[],VO=e=>e===void 0?[...BO]:[e],HO=async(e,t,n)=>{let r=await xl(e,t),i=Vl(await Ol(e,t));return{defaultBranch:r,packages:PO(await tT(t),n.npmDirectory,n.npmPkgName),tagFormatCandidate:i}},UO=(e,t)=>G(t.home,zE(t.resolved.key),async()=>{let n=await ZD(e.runner,{allowFileUrls:BE(e.env),cloneUrl:t.resolved.cloneUrl,dest:t.dest,home:t.home,hooksDir:t.home.hooksDir,mode:t.cloneMode}),r={fields:await HO(e.runner,t.dest,t.resolved)};return n.effectiveMode!==void 0&&(r.effectiveMode=n.effectiveMode),n.warning!==void 0&&(r.warning=n.warning),r}),WO=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},GO=async(e,t)=>{let n=B(e.env),r=await H(n),i=WE(await UE(e,t),r.settings);KE(r,i.key),await QE(n,i.key);let a=V(n,i.key),o=jw(`clone_mode`,void 0,r.settings),s=await UO(e,{cloneMode:o,dest:a,home:n,resolved:i});return WO({cloneResult:s,dest:a,resolved:i})},KO=(e,t,n)=>G(e,`home`,async()=>{KE(await H(e),t);let r=await Z(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 Pw(e,r)}),qO=(e,t)=>{let n=tc.safeParse(e);if(!n.success)throw T(k(n.error));let r=Aw.safeParse(t);if(!r.success)throw T(k(r.error));return{config:n.data,state:r.data}},JO=async(e,t)=>{let n=await H(e.home);KE(n,e.ref.key);let r=zO(e.ref);n.refs[e.ref.key]=r;let i=await Z(e.home);return i.refs[e.ref.key]={effective_clone_mode:e.effectiveCloneMode??i.refs[e.ref.key]?.effective_clone_mode??jw(`clone_mode`,void 0,n.settings),head_sha:t,last_fetched_at:new Date().toISOString()},{...qO(n,i),entry:r}},YO=async(e,t)=>{let n=BE(e.env),r=await G(t.home,zE(t.ref.key),()=>(Hc(t.home,t.dest),eO(e.runner,{allowFileUrls:n,dest:t.dest,expectedUrl:t.ref.url,hooksDir:t.home.hooksDir,key:t.ref.key})));return G(t.home,`home`,async()=>{let{config:e,entry:n,state:i}=await JO(t,r);return await Pw(t.home,i),await Xc(t.home,e),{entry:n,key:t.ref.key}})},XO=(e,t)=>t===`-`?e.readStdin():s(t,`utf8`),ZO=e=>e instanceof Error?e.message:String(e),QO=e=>{try{return JSON.parse(e)}catch(e){throw T(`invalid JSON in proposal: ${ZO(e)}`)}},$O=e=>{let t=Ow.safeParse(e);if(!t.success)throw T(k(t.error));return t.data},ek=async(e,t)=>{let n=await XO(e,t);return $O(QO(n))},tk=(e,t)=>[`refs add: dry-run proposal ready for '${e}' (checkout: ${t})`,`next: review the proposal, then run refs add --proposal <file> to finalize`],nk=async(e,t)=>{let n=await GO(e,t);await KO(B(e.env),n.proposal.key,n.effectiveCloneMode);let r=VO(n.warning);return{data:n.proposal,human:tk(n.proposal.key,n.dest),warnings:r}},rk=e=>[`refs add: '${e}' added to config`],ik=e=>{let t={default_branch:e.default_branch,description:e.description,key:e.key,tag_format:RO(e.tag_format_candidate),url:e.url},n=LO(e.packages);return n!==void 0&&(t.packages=n),t},ak=async(e,t)=>{let n=await ek(e,t),r=B(e.env),i=V(r,n.key);if(!U(i))throw C(`no checkout found at ${i} — run: refs add <source> --dry-run first`);let{entry:a,key:o}=await YO(e,{dest:i,home:r,ref:ik(n)});return{data:{entry:a,key:o},human:rk(o),warnings:[]}},ok=(e,t)=>{let n={default_branch:e.proposal.default_branch,description:t,key:e.proposal.key,tag_format:RO(e.proposal.tag_format_candidate),url:e.proposal.url},r=IO(e.proposal.packages,t);return r!==void 0&&(n.packages=r),n},sk=async(e,t,n)=>{let r=await GO(e,t),i=B(e.env),a=ok(r,n),o={dest:r.dest,home:i,ref:a};r.effectiveCloneMode!==void 0&&(o.effectiveCloneMode=r.effectiveCloneMode);let{entry:s,key:c}=await YO(e,o),l=VO(r.warning);return{data:{entry:s,key:c},human:rk(c),warnings:l}},ck=e=>{let t=[e.dryRun,e.proposal!==void 0,e.description!==void 0].filter(Boolean).length;if(t>1)throw w(`refs add: use only one of --dry-run, --proposal, or --description`);if(t===0)throw w(`refs add needs --dry-run, --proposal, or --description`)},lk=e=>{if(e===void 0||e===``)throw w(`refs add requires <source> (a git url or npm:<package>)`);return e},uk=(e,t)=>(ck(t),t.proposal===void 0?t.description===void 0?nk(e,lk(t.source)):sk(e,lk(t.source),t.description):ak(e,t.proposal)),dk=(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},fk=(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=r.optsWithGlobals(),a={json:i.json===!0,verbose:i.verbose===!0};return $(t,a,async()=>{let r=await uk(t,dk(e,n));Q(t,a,r.human,r.data,r.warnings)})()})},pk=e=>e===void 0?null:e,mk=()=>Object.keys($s.shape).toSorted().join(`, `),hk=e=>`unknown package field '${e}' — valid fields: ${mk()}`,gk=e=>Object.hasOwn($s.shape,e),_k=(e,t,n)=>{let r=e.packages?.[n];if(r===void 0)throw C(`no package '${n}' registered on ref '${t}'`);return r},vk=(e,t,n)=>{if(!gk(t))throw w(hk(t));let r=e[t],i=$s.safeParse({...e,[t]:n});if(!i.success)throw T(k(i.error));return{field:t,newValue:i.data[t],oldValue:r,updated:i.data}},yk=async e=>{let t=_k(e.entry,e.key,e.packageName),n=vk(t,e.field,e.value),r={...e.entry,packages:{...e.entry.packages,[e.packageName]:n.updated}};return await Xc(e.home,{...e.config,refs:{...e.config.refs,[e.key]:r}}),{field:n.field,key:e.key,new:pk(n.newValue),old:pk(n.oldValue)}},bk=`packages`,xk=(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},Sk=()=>Object.keys(ec.shape).filter(e=>e!==bk).toSorted().join(`, `),Ck=e=>`unknown ref field '${e}' — valid fields: ${Sk()}`,wk=e=>Object.hasOwn(ec.shape,e),Tk=(e,t,n)=>`failed to rewrite git remote at ${e} to '${W(t)}': ${n.trim()}`,Ek=async(e,t)=>{if(Hc(t.home,t.dest),!U(t.dest))return;let n=await e.runner.run(`git`,[`remote`,`set-url`,`origin`,t.cloneUrl],{cwd:t.dest});if(n.exitCode!==0)throw T(Tk(t.dest,t.cloneUrl,n.stderr))},Dk=async(e,t)=>{let n=uu(t.value,{allowFileUrls:BE(e.env)});if(n.key!==t.key)throw T(`new url derives a different key — remove and re-add instead`);let r=V(t.home,t.key);return await Ek(e,{cloneUrl:n.cloneUrl,dest:r,home:t.home}),{...t.entry,url:n.cloneUrl}},Ok=(e,t,n)=>{let r={...e,[t]:n},i=ec.safeParse(r);if(!i.success)throw T(k(i.error));return i.data},kk=(e,t)=>t.field===`url`?Dk(e,{entry:t.entry,home:t.home,key:t.key,value:t.value}):Promise.resolve(Ok(t.entry,t.field,t.value)),Ak=async(e,t)=>{let{field:n}=t;if(n===bk)throw w(`use --package <name> <field> <value>`);if(!wk(n))throw w(Ck(n));let r=t.entry[n],i=await kk(e,{entry:t.entry,field:n,home:t.home,key:t.key,value:t.value});return{new:i[n],old:r,updated:i}},jk=(e,t)=>{let n=B(e.env),{field:r,opts:i,query:a,value:o}=t;return G(n,`home`,async()=>{let t=await H(n),s=LE(t,a),c=xk(t,s);if(i.packageName!==void 0)return yk({config:t,entry:c,field:r,home:n,key:s,packageName:i.packageName,value:o});let l=await Ak(e,{entry:c,field:r,home:n,key:s,value:o});return await Xc(n,{...t,refs:{...t.refs,[s]:l.updated}}),{field:r,key:s,new:pk(l.new),old:pk(l.old)}})},Mk=`settings`,Nk=[],Pk=()=>Object.keys(Zs.shape).toSorted().join(`, `),Fk=e=>`unknown setting '${e}' — valid settings: ${Pk()}`,Ik=e=>Object.hasOwn(Zs.shape,e),Lk=e=>`note: 'settings' addressed the global settings, not ${e} — use the full ref key to edit that ref`,Rk=e=>{try{let t=LE(e,Mk);return[Lk(`ref '${t}'`)]}catch(e){if(e instanceof at&&e.code===`usage`)return[Lk("one of several matching refs — see `refs list`")];if(e instanceof at&&e.code===`not_found`)return Nk;throw e}},zk=e=>({data:{field:e.key,key:Mk,new:pk(e.parsed[e.key]),old:pk(e.old)},warnings:Rk(e.config)}),Bk=(e,t)=>{let n=B(e.env);return G(n,`home`,async()=>{let e=await H(n);if(!Ik(t.key))throw w(Fk(t.key));let r=e.settings[t.key],i={...e.settings,[t.key]:t.value},a=Zs.safeParse(i);if(!a.success)throw T(k(a.error));return await Xc(n,{...e,settings:a.data}),zk({config:e,key:t.key,old:r,parsed:a.data})})},Vk=[],Hk=e=>{let t={};return e.package!==void 0&&(t.packageName=e.package),t},Uk=async(e,t)=>{if(t.first===`settings`){if(t.opts.packageName!==void 0)throw w(`--package is not valid with 'refs edit settings ...' — it only applies to ref/package edits`);return Bk(e,{key:t.second,value:t.value})}return{data:await jk(e,{field:t.second,opts:t.opts,query:t.first,value:t.value}),warnings:Vk}},Wk=e=>e==null?`(unset)`:String(e),Gk=e=>[`${e.key}: ${e.field} '${Wk(e.old)}' -> '${Wk(e.new)}'`],Kk=(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=a.optsWithGlobals(),s={json:o.json===!0,verbose:o.verbose===!0};return $(t,s,async()=>{let{data:a,warnings:o}=await Uk(t,{first:e,opts:Hk(i),second:n,value:r});Q(t,s,Gk(a),a,o)})()})},qk=`Install the agent skill: npx skills add kaisers-io/refs (private phase: npx skills add <path-to-this-repo> --skill refs)`,Jk=async e=>{await o(e.root,{recursive:!0}),await o(e.sourcesDir,{recursive:!0}),await o(e.locksDir,{recursive:!0}),await o(e.hooksDir,{recursive:!0})},Yk=async e=>{let t=B(e.env);return await Jk(t),{config:await G(t,`home`,async()=>{let e=await sl(t,xT);return await jl(t),e}),home:t.root,skill_hint:qk}},Xk=[(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=n.optsWithGlobals(),i={json:r.json===!0,verbose:r.verbose===!0};return $(t,i,async()=>{let e=await Yk(t);Q(t,i,[`refs home: ${e.home} (${e.config})`,qk],e)})()})},fk,Kk,RE,...MO],Zk=(e,t)=>{for(let n of Xk)n(e,t)},Qk=[``,`Examples:`,` $ refs list --json`,` $ refs sync --stale-only --json`,` $ refs resolve next/navigation --json`,``,`Every command accepts --json for structured output and --verbose for stack traces on error.`].join(`
404
404
  `),$k=new Set([`commander.help`,`commander.helpDisplayed`,`commander.version`]),eA=`--json`,tA=`--verbose`,nA=/\n$/u,rA=/^error: /u,iA=e=>e.replace(rA,``),aA=(e,t)=>{for(let n of e){if(n===`--`)return!1;if(n===t)return!0}return!1},oA=e=>aA(e,eA),sA=e=>aA(e,tA),cA=(e,t,n)=>n&&t!==void 0?`${e}\n${t}`:e,lA=e=>{let t=new hT().name(`refs`).description(`Manage git-based reference checkouts shared across a workspace.`).version(xT).option(eA,`emit machine-readable JSON on stdout instead of human-readable text`).option(tA,`include stack traces in error output`).allowExcessArguments(!1).exitOverride().configureOutput({outputError:()=>{},writeErr:t=>{e.errLine(t.replace(nA,``))},writeOut:t=>{e.out(t.replace(nA,``))}});return t.addHelpText(`after`,Qk),Zk(t,e),t},uA=()=>{process.exitCode=it.OK},dA=(e,t,n)=>{bT(e,t,{code:`usage`,message:cA(iA(n.message),n.stack,t.verbose)}),process.exitCode=it.USAGE},fA=(e,t,n)=>{if($k.has(n.code)){uA();return}dA(e,t,n)},pA=(e,t,n)=>{let r=ct(n,{verbose:t.verbose});bT(e,t,r),process.exitCode=r.exitCode},mA=async(e,t,n)=>{let r={json:oA(n),verbose:sA(n)};try{await t.parseAsync(n)}catch(t){if(t instanceof iT){fA(e,r,t);return}pA(e,r,t)}},hA=(e,t)=>mA(e,lA(e),t);import.meta.main&&await hA(rT(),process.argv);export{lA as buildProgram,Q as emit,bT as emitError,rT as realContext,Zk as registerCommands,hA as run,mA as runProgram,$ as wrapAction};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaisers-io/refs",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Managed read-only git checkouts of reference repositories for coding agents.",
5
5
  "license": "MIT",
6
6
  "repository": {