argsbarg 7.1.2 → 7.1.4

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 (59) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/README.md +7 -7
  3. package/docs/README.md +1 -1
  4. package/docs/cli-program.md +1 -1
  5. package/docs/configure.md +2 -2
  6. package/docs/mcp.md +20 -0
  7. package/docs/output-schema.md +6 -0
  8. package/examples/full-example/AGENTS.md +1 -1
  9. package/examples/full-example/bun.lock +83 -1
  10. package/examples/full-example/justfile +5 -3
  11. package/examples/full-example-json/AGENTS.md +1 -1
  12. package/examples/full-example-json/README.md +1 -0
  13. package/examples/full-example-json/bun.lock +83 -1
  14. package/examples/full-example-json/docs/cli-schema.json +284 -9
  15. package/examples/full-example-json/docs/cli.md +236 -18
  16. package/examples/full-example-json/docs/http.md +1 -0
  17. package/examples/full-example-json/docs/mcp.md +18 -0
  18. package/examples/full-example-json/docs/openapi.json +155 -0
  19. package/examples/full-example-json/justfile +5 -3
  20. package/examples/full-example-json/src/commands/shape-area/__generated__/ShapeAreaInputSchema.json +59 -0
  21. package/examples/full-example-json/src/commands/shape-area/__generated__/index.ts +5 -0
  22. package/examples/full-example-json/src/commands/shape-area/command.test.ts +34 -0
  23. package/examples/full-example-json/src/commands/shape-area/command.ts +31 -0
  24. package/examples/full-example-json/src/commands/shape-area/types.ts +28 -0
  25. package/examples/full-example-json/src/program.ts +2 -1
  26. package/examples/mcp-plugin/.claude-plugin/plugin.json +7 -1
  27. package/examples/mcp-plugin/.cursor-plugin/plugin.json +7 -1
  28. package/examples/mcp-plugin/AGENTS.md +12 -1
  29. package/examples/mcp-plugin/README.md +18 -9
  30. package/examples/mcp-plugin/bun.lock +83 -1
  31. package/examples/mcp-plugin/dist/mcp-plugin.mjs +385 -0
  32. package/examples/mcp-plugin/justfile +17 -12
  33. package/examples/mcp-plugin/package.json +2 -5
  34. package/examples/mcp-plugin/scripts/release.ts +17 -30
  35. package/examples/mcp-plugin/src/index.ts +0 -1
  36. package/package.json +1 -1
  37. package/src/cli-tool/create.test.ts +14 -0
  38. package/src/cli-tool/create.ts +9 -0
  39. package/src/cli-tool/main.ts +1 -1
  40. package/src/cli-tool/schemagen/run.ts +41 -2
  41. package/src/cli-tool/schemagen/schemagen.test.ts +87 -2
  42. package/src/config/validate.ts +13 -31
  43. package/src/core/json-pointer.ts +46 -0
  44. package/src/core/validate.ts +64 -1
  45. package/src/headless/tool-call.test.ts +74 -2
  46. package/src/headless/tool-call.ts +44 -22
  47. package/src/http/schema-deref.ts +1 -23
  48. package/src/mcp/tools.test.ts +137 -3
  49. package/src/mcp/tools.ts +50 -5
  50. package/examples/mcp-plugin/.mcp.json +0 -6
  51. package/examples/mcp-plugin/bunfig.toml +0 -3
  52. package/examples/mcp-plugin/mcp.json +0 -8
  53. package/examples/mcp-plugin/scripts/mcp.mjs +0 -11106
  54. package/examples/mcp-plugin/src/commands/render-json/__generated__/RenderJsonInputSchema.json +0 -15
  55. package/examples/mcp-plugin/src/commands/render-json/__generated__/index.ts +0 -5
  56. package/examples/mcp-plugin/src/commands/status/__generated__/StatusJsonOutputSchema.json +0 -15
  57. package/examples/mcp-plugin/src/commands/status/__generated__/index.ts +0 -5
  58. package/examples/mcp-plugin/src/commands/workspaces/__generated__/WorkspaceNameInputSchema.json +0 -15
  59. package/examples/mcp-plugin/src/commands/workspaces/__generated__/index.ts +0 -5
@@ -0,0 +1,385 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import{existsSync as existsSync6,mkdirSync as mkdirSync4,readFileSync as readFileSync2,rmSync as rmSync2,unlinkSync,writeFileSync as writeFileSync3}from"node:fs";import{dirname as dirname5,join as join5}from"node:path";var CliValueFormat;((CliValueFormat)=>{CliValueFormat.Duration="duration";CliValueFormat.CommaList="comma-list";CliValueFormat.Date="date";CliValueFormat.DateTime="date-time"})(CliValueFormat||={});function isCliLeaf(node){return"handler"in node&&typeof node.handler==="function"}function isDocumentLeaf(leaf){return leaf.kind==="document"||leaf.kind==="json"}function isCliRouter(node){return"commands"in node&&Array.isArray(node.commands)}function leafOutputSchema(leaf){return leaf.outputSchema}class CliSchemaValidationError extends Error{constructor(message){super(message);this.name="CliSchemaValidationError"}}function defaultConfigEntryTitle(key){return key}function defaultConfigEntrySensitive(key){return/key|token|secret|password/i.test(key)}function configEntryRequired(key,entry,jsonSchemaRequired){if(entry.required===!1)return!1;if(jsonSchemaRequired!==void 0)return jsonSchemaRequired.has(key);return!0}function configEntrySensitive(key,entry){return entry.sensitive??defaultConfigEntrySensitive(key)}function configUserConfigKey(key){return key.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")||"config_key"}function jsonSchemaRequiredKeys(jsonSchema){let required=jsonSchema.required;if(!Array.isArray(required))return;return new Set(required.filter((k)=>typeof k==="string"))}function configCommandsEnabled(program){if(!program.appConfig)return!1;let commands=program.appConfig.commands;if(commands===!1)return!1;if(typeof commands==="object"&&commands.enabled===!1)return!1;return!0}function configMcpSetEnabled(program){let commands=program.appConfig?.commands;if(typeof commands==="object"&&commands.mcpSet===!1)return!1;return!0}function resolveCapabilities(program){let configure=program.configure?.enabled!==!1;return{http:program.httpServer?.enabled===!0,completion:program.completion?.enabled!==!1,mcp:program.mcpServer?.enabled===!0,configure,docs:program.docs?.enabled!==!1,configCommands:configCommandsEnabled(program)}}function reservedCommandNames(caps){let names=["version"];if(caps.completion)names.unshift("completion");if(caps.configure)names.push("configure");if(caps.docs)names.push("docs");if(caps.mcp)names.push("mcp");if(caps.http)names.push("http");return names}function skipsRequiredAppConfigExit(path,caps){let root=path[0];if(root==="configure"&&caps.configure){let sub=path[1];if(!sub||sub==="get"||sub==="set"||sub==="install"||sub==="uninstall"||sub==="status")return!0}if(root==="docs"&&caps.docs)return!0;return!1}function capabilityDeniedMessage(feature){switch(feature){case"completion":return`Shell completion is not available for this app.
4
+ `;case"http":return`HTTP API is not available for this app.
5
+ `;case"mcp":return`MCP is not available for this app.
6
+ `;case"configure":return`Configure is not available for this app.
7
+ `;case"docs":return`Documentation commands are not available for this app.
8
+ `}}function assertBuiltinAllowed(argv,caps){if(argv.length<1)return;let first=argv[0];if(first==="completion"&&!caps.completion)process.stderr.write(capabilityDeniedMessage("completion")),process.exit(1);if(first==="mcp"&&!caps.mcp)process.stderr.write(capabilityDeniedMessage("mcp")),process.exit(1);if(first==="http"&&!caps.http)process.stderr.write(capabilityDeniedMessage("http")),process.exit(1);if(first==="configure"&&!caps.configure)process.stderr.write(capabilityDeniedMessage("configure")),process.exit(1);if(first==="docs"&&!caps.docs)process.stderr.write(capabilityDeniedMessage("docs")),process.exit(1)}function isCliHidden(node){return node.cli?.hidden===!0}function isOptionCliHidden(opt){return opt.cli?.hidden===!0}function isCliSchemaHidden(node){if(node.cli?.schema?.enabled===!1)return!0;if(node.cli?.schema?.hidden===!0)return!0;return isCliHidden(node)}function isMcpHidden(leaf){if(leaf.mcpTool?.enabled===!1)return!0;return leaf.mcpTool?.hidden===!0}function isCliCallable(node,parentEnabled=!0){if(!parentEnabled)return!1;if(node.cli?.enabled===!1)return!1;return!0}function isHttpHidden(node){return node.http?.hidden===!0}function isHttpDisabled(node){return node.http?.enabled===!1}function visibleOptions(options){return(options??[]).filter((o)=>!isOptionCliHidden(o))}function presentationNode(node){if(isCliHidden(node))return null;let options=visibleOptions(node.options);if(isCliRouter(node)){let commands=node.commands.map((ch)=>presentationNode(ch)).filter((ch)=>ch!==null);return{...node,options,commands}}return{...node,options}}function visibleSubcommands(cmds){return cmds.filter((c)=>!isCliHidden(c))}function leafHttpResponseDefaults(leaf){return{contentType:leaf.http?.successContentType,contentDisposition:leaf.http?.contentDisposition}}var DURATION_PATTERN="^\\d+[hdms]?$",MCP_WIRE_OMIT_PRESENCE=new Set(["json","yes","verbose"]);function optionProperty(opt){let base={description:opt.description};if(opt.default!==void 0)base.default=opt.default;switch(opt.kind){case"presence":return{type:"boolean",...base};case"string":{if(opt.format==="comma-list")return{oneOf:[{type:"string",...base},{type:"array",items:{type:"string"},...base}]};let stringBase={type:"string",...base};if(opt.format==="duration")return{...stringBase,pattern:DURATION_PATTERN};if(opt.format==="date")return{...stringBase,format:"date"};if(opt.format==="date-time")return{...stringBase,format:"date-time"};if(opt.pattern!==void 0)return{...stringBase,pattern:opt.pattern};return stringBase}case"number":return{type:"number",...base};case"enum":return{type:"string",enum:opt.choices,...base};case"json":return{type:"object",...base}}}function positionalProperty(p){let base={description:p.description},{argMax=1}=p;if(argMax===0)return{type:"array",items:{type:"string"},...base};return{type:"string",...base}}function leafWireOptions(leaf){return visibleOptions(leaf.options).filter((o)=>{if(o.kind==="presence"&&MCP_WIRE_OMIT_PRESENCE.has(o.name))return!1;return!0})}function buildLeafInputSchema(leaf){if(leaf.inputSchema!==void 0)return leaf.inputSchema;let properties={},required=[];for(let opt of leafWireOptions(leaf))if(properties[opt.name]=optionProperty(opt),opt.required)required.push(opt.name);for(let p of leaf.positionals??[]){properties[p.name]=positionalProperty(p);let{argMin=1,argMax=1}=p;if(argMax===1&&argMin>=1)required.push(p.name)}let schema={type:"object",properties,additionalProperties:!1};if(required.length>0)schema.required=required;return schema}var HTTP_RESERVED_TOP_LEVEL_SEGMENTS=new Set(["health","openapi.json","swagger","tools"]);function resolveHttpPathPrefix(program){let raw=program.httpServer?.pathPrefix;if(raw===void 0||raw==="")return"";return raw}function buildHttpUserPath(prefix,urlSegments){let tail=urlSegments.map((s)=>s.startsWith(":")?`{${s.slice(1)}}`:s).join("/");if(!prefix)return tail?`/${tail}`:"/";return tail?`${prefix}/${tail}`:prefix}function httpUserPathRegexPrefix(prefix){if(!prefix)return"";return prefix.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function httpUserPathGlob(prefix){return prefix?`${prefix}/*`:"/*"}var VERB_KEYS=new Set(["get","post","put","patch","delete"]);function isParamRouterKey(key){return key.startsWith(":")}function inferHttpMethod(leaf){if(leaf.http?.method)return leaf.http.method;let lower=leaf.key.toLowerCase();if(VERB_KEYS.has(lower))return lower.toUpperCase();return"POST"}function isVerbLeaf(leaf){return VERB_KEYS.has(leaf.key.toLowerCase())&&leaf.http?.method===void 0}function segmentForNode(node){return node.http?.segment??node.key}function leafHttpExposed(leaf){if(isHttpDisabled(leaf)||isHttpHidden(leaf))return!1;return!0}function pushRoute(routes,leaf,state,pathPrefix){let urlSegments=[...state.urlSegments],commandPath=[...state.commandPath];if(!isVerbLeaf(leaf)){let seg=segmentForNode(leaf);if(urlSegments[urlSegments.length-1]!==seg)urlSegments.push(seg);if(commandPath[commandPath.length-1]!==leaf.key)commandPath.push(leaf.key)}let openApiPath=buildHttpUserPath(pathPrefix,urlSegments),patternParts=urlSegments.map((s)=>s.startsWith(":")?"([^/]+)":escapeRegex(s)),regexPrefix=httpUserPathRegexPrefix(pathPrefix),tail=patternParts.length>0?`/${patternParts.join("/")}`:"",pathPattern=new RegExp(`^${regexPrefix}${tail}/?$`);routes.push({method:inferHttpMethod(leaf),openApiPath,pathPattern,commandPath,paramNames:[...state.paramNames],leaf})}function walk(node,state,routes,pathPrefix){if(isHttpDisabled(node)||isHttpHidden(node))return;if(isCliLeaf(node)){if(leafHttpExposed(node))pushRoute(routes,node,state,pathPrefix);return}for(let child of node.commands){if(isParamRouterKey(child.key)){let paramName=child.key.slice(1);walk(child,{urlSegments:[...state.urlSegments,child.key],commandPath:[...state.commandPath,child.key],paramNames:[...state.paramNames,paramName]},routes,pathPrefix);continue}if(isCliLeaf(child)){walk(child,{urlSegments:state.urlSegments,commandPath:[...state.commandPath,child.key],paramNames:state.paramNames},routes,pathPrefix);continue}let seg=segmentForNode(child);walk(child,{urlSegments:[...state.urlSegments,seg],commandPath:[...state.commandPath,child.key],paramNames:state.paramNames},routes,pathPrefix)}}function escapeRegex(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function collectHttpRoutes(program){let routes=[];if(!program.httpServer?.enabled)return routes;let pathPrefix=resolveHttpPathPrefix(program);if(isCliLeaf(program))return walk(program,{urlSegments:[],commandPath:[],paramNames:[]},routes,pathPrefix),routes;for(let child of program.commands){if(child.key==="completion"||child.key==="configure"||child.key==="docs"||child.key==="mcp"||child.key==="version"||child.key==="http")continue;if(isCliLeaf(child))walk(child,{urlSegments:[],commandPath:[child.key],paramNames:[]},routes,pathPrefix);else walk(child,{urlSegments:[segmentForNode(child)],commandPath:[child.key],paramNames:[]},routes,pathPrefix)}return routes}function matchHttpRoute(program,method,pathname){let routes=collectHttpRoutes(program),upper=method.toUpperCase(),best;for(let route of routes){if(route.method!==upper)continue;let m=route.pathPattern.exec(pathname);if(!m)continue;let pathParams={};for(let i=0;i<route.paramNames.length;i++){let name=route.paramNames[i],val=m[i+1];if(name&&val!==void 0)pathParams[name]=decodeURIComponent(val)}let score=route.openApiPath.length;if(!best||score>best.score)best={route,pathParams,score}}if(!best)return{ok:!1};return{ok:!0,route:best.route,pathParams:best.pathParams}}function httpRequestToArgv(_program,route,pathParams,query,body){let argv=[];for(let key of route.commandPath)if(isParamRouterKey(key)){let name=key.slice(1),val=pathParams[name];if(val===void 0||val.length===0)return{error:`Missing path parameter: ${name}`};argv.push(val)}else argv.push(key);let leaf=route.leaf;if(isDocumentLeaf(leaf))return argv;let merged={...body,...query};for(let[k,v]of Object.entries(query))if(typeof v==="string"&&(v.startsWith("{")||v.startsWith("[")))try{merged[k]=JSON.parse(v)}catch{merged[k]=v}for(let opt of leafWireOptions(leaf)){if(opt.kind==="json")continue;let val=merged[opt.name];if(val===void 0)continue;if(opt.kind==="presence"){if(val===!0||val==="true"||val==="1")argv.push(`--${opt.name}`);continue}let formatted=formatMcpOptionValue(opt,val);if(typeof formatted!=="string")return formatted;argv.push(`--${opt.name}`,formatted)}if(leafHasYesOption(leaf)&&!argv.includes("--yes"))argv.push("--yes");for(let p of leaf.positionals??[]){let val=merged[p.name]??pathParams[p.name],{argMin=1,argMax=1}=p;if(argMax===0){let raw=merged[p.name];if(raw===void 0){if(argMin>=1)return{error:`Missing argument: ${p.name} (use a JSON array)`};continue}if(!Array.isArray(raw))return{error:`Argument ${p.name} must be a JSON array of strings`};let items=raw.map(String).filter(Boolean);if(items.length===0&&argMin>=1)return{error:`Missing argument: ${p.name}`};argv.push(...items);continue}if(val===void 0||val===""){if(argMin>=1)return{error:`Missing argument: ${p.name}`};continue}argv.push(String(val))}return argv}function defaultSuccessStatus(method,hasBody){switch(method){case"GET":return 200;case"POST":return 201;case"PUT":case"PATCH":return 200;case"DELETE":return hasBody?200:204;default:return 200}}function decodeJsonPointerSegment(segment){let decoded=segment;try{decoded=decodeURIComponent(segment)}catch{}return decoded.replace(/~1/g,"/").replace(/~0/g,"~")}function resolveJsonPointer(root,ref){if(!ref.startsWith("#/"))return;let segments=ref.slice(2).split("/").filter((segment)=>segment.length>0).map(decodeJsonPointerSegment),current=root;for(let segment of segments){if(typeof current!=="object"||current===null||Array.isArray(current))return;current=current[segment]}return current}function isPlainObject(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}function derefValue(value,root,resolving){if(Array.isArray(value))return value.map((item)=>derefValue(item,root,resolving));if(!isPlainObject(value))return value;if(typeof value.$ref==="string"){let{$ref,...siblings}=value;if(resolving.has($ref))return value;let target=resolveJsonPointer(root,$ref);if(target===void 0)return value;resolving.add($ref);let resolved=derefValue(structuredClone(target),root,resolving);if(resolving.delete($ref),!isPlainObject(resolved))return resolved;if(Object.keys(siblings).length===0)return resolved;return{...resolved,...siblings}}let out={};for(let[key,child]of Object.entries(value)){if(key==="definitions"||key==="$defs")continue;out[key]=derefValue(child,root,resolving)}return out}function dereferenceJsonSchema(schema){let root=structuredClone(schema);return derefValue(root,root,new Set)}var JSON_CONTENT_TYPE="application/json; charset=utf-8";function defaultErrorSchema(){return{type:"object",properties:{error:{type:"string"}},required:["error"]}}function errorResponseSchema(program){let custom=program.httpServer?.errors?.errorSchema;return custom?dereferenceJsonSchema(custom):defaultErrorSchema()}function errorResponseEntry(program,description){return{description,content:{[JSON_CONTENT_TYPE]:{schema:errorResponseSchema(program)}}}}function buildSuccessResponses(route){let contentType=route.leaf.http?.successContentType??"application/json",media={},method=route.method;if(contentType.includes("application/json")){let outputSchema=route.leaf.outputSchema??{type:"object"};media[contentType]={schema:dereferenceJsonSchema(outputSchema)}}else if(contentType.includes("text/html"))media[contentType]={schema:{type:"string"}};else media[contentType]={schema:{type:"string",format:"binary"}};let status=String(route.leaf.http?.successStatus??defaultSuccessStatus(method,method!=="DELETE"));if(method==="DELETE"&&status==="204")return{"204":{description:"Successful invocation"}};return{[status]:{description:"Successful invocation",content:media}}}function methodLower(method){return method.toLowerCase()}var HEALTH_TAG="health",livenessResponseSchema={type:"object",properties:{ok:{type:"boolean",const:!0}},required:["ok"]},readinessCheckSchema={type:"object",properties:{ok:{type:"boolean"},error:{type:"string"},missing:{type:"array",items:{type:"string"}}},required:["ok"]},readinessResponseSchema={type:"object",properties:{ok:{type:"boolean"},checks:{type:"object",properties:{config_file:readinessCheckSchema,config_required:readinessCheckSchema,custom:readinessCheckSchema},required:["config_file","config_required","custom"]}},required:["ok","checks"]};function jsonResponseEntry(description,schema){return{description,content:{[JSON_CONTENT_TYPE]:{schema}}}}function livenessGetOp(){return{tags:[HEALTH_TAG],operationId:"health_liveness",summary:"Liveness probe",description:"Returns 200 when the HTTP server is online and accepting requests. Does not run config or readiness checks — use for orchestrator liveness probes only.",responses:{"200":jsonResponseEntry("Server is online",livenessResponseSchema)}}}function buildHealthPaths(){return{"/health/liveness":{get:livenessGetOp()},"/health/readiness":{get:{tags:[HEALTH_TAG],operationId:"health_readiness",summary:"Readiness probe",description:"Returns 200 when the server is online and all readiness checks pass (config file, required app config, and optional program.readiness). Returns 503 when any check fails — use for orchestrator readiness probes before routing traffic.",responses:{"200":jsonResponseEntry("Online and ready to serve traffic",readinessResponseSchema),"503":jsonResponseEntry("Online but not ready (one or more checks failed)",readinessResponseSchema)}}}}}function topLevelCommandKey(route,program){return route.commandPath.find((k)=>!k.startsWith(":"))??program.key}function findTopLevelCommand(program,key){if(isCliLeaf(program))return program.key===key?program:void 0;return program.commands.find((c)=>c.key===key)}function collectCommandTags(program,routes){return[...new Set(routes.map((route)=>topLevelCommandKey(route,program)))].sort().map((name)=>{let node=findTopLevelCommand(program,name);return node?.description?{name,description:node.description}:{name}})}function generateOpenApi(program){let routes=collectHttpRoutes(program),paths=program.httpServer?.enabled?buildHealthPaths():{},commandTags=collectCommandTags(program,routes);for(let route of routes){let pathKey=route.openApiPath,existing=paths[pathKey]??{},op={tags:[topLevelCommandKey(route,program)],operationId:route.openApiPath.replace(/\//g,"_").replace(/[{}]/g,""),summary:route.leaf.description??route.leaf.key,responses:{...buildSuccessResponses(route),"400":errorResponseEntry(program,"Invalid arguments or help requested"),"404":errorResponseEntry(program,"Not found"),"500":errorResponseEntry(program,"Handler error"),"503":errorResponseEntry(program,"Not ready or missing required config")}};if(route.paramNames.length>0)op.parameters=route.paramNames.map((name)=>({name,in:"path",required:!0,schema:{type:"string"}}));let method=methodLower(route.method);if(method==="get"||method==="delete")op.parameters=[...op.parameters??[],...leafWireOptions(route.leaf).map((opt)=>({name:opt.name,in:"query",required:opt.required??!1,schema:{type:"string"},description:opt.description}))];else op.requestBody={required:isDocumentLeaf(route.leaf),content:{[JSON_CONTENT_TYPE]:{schema:dereferenceJsonSchema(buildLeafInputSchema(route.leaf))}}};existing[method]=op,paths[pathKey]=existing}return{openapi:"3.1.0",info:{title:program.key,version:program.version,description:program.description},...program.httpServer?.enabled?{tags:[{name:HEALTH_TAG,description:"Orchestrator health probes — liveness (online) vs readiness (online + checks passed)."},...commandTags]}:{},paths}}function openApiJson(program){return`${JSON.stringify(generateOpenApi(program),null,2)}
9
+ `}var style={wrap(prefix,body,suffix){return prefix+body+suffix},red(msg){return this.wrap("\x1B[31m",msg,"\x1B[0m")},gray(msg){return this.wrap("\x1B[90m",msg,"\x1B[0m")},bold(msg){return this.wrap("\x1B[1m",msg,"\x1B[0m")},white(msg){return this.wrap("\x1B[37m",msg,"\x1B[0m")},aquaBold(msg){return this.wrap("\x1B[96m\x1B[1m",msg,"\x1B[0m")},greenBright(msg){return this.wrap("\x1B[92m",msg,"\x1B[0m")},grayBoldTitle(title){return this.gray(this.bold(title))}},kBoxTL="╭",kBoxTR="╮",kBoxV="│",kBoxBL="╰",kBoxBR="╯",kBoxH="─";function getHelpWidth(){return Math.max(40,process.stdout.columns||80)}function isOutputTTY(useStderr){return useStderr?!!process.stderr.isTTY:!!process.stdout.isTTY}function visibleWidth(s){let w=0,i=0;while(i<s.length){if(s[i]==="\x1B"&&i+1<s.length&&s[i+1]==="["){i+=2;while(i<s.length&&s[i]!=="m")i+=1;if(i<s.length)i+=1;continue}w+=1,i+=1}return w}function repeatBoxH(n){return kBoxH.repeat(Math.max(0,n))}function spaces(n){return" ".repeat(Math.max(0,n))}function padVisible(s,width){return s+spaces(Math.max(0,width-visibleWidth(s)))}function wrapParagraph(text,width){let available=Math.max(1,width),out=[],cur="";for(let word of text.split(/\s+/).filter((w)=>w.length>0)){if(cur.length===0){cur=word;continue}if(cur.length+1+word.length<=available)cur+=` ${word}`;else out.push(cur),cur=word}if(cur.length>0)out.push(cur);return out}function wrapText(text,width){let out=[],lines=text.split(`
10
+ `);for(let line of lines){if(line.trim().length===0){out.push("");continue}if(line[0]===" "||line[0]==="\t"){out.push(line);continue}out.push(...wrapParagraph(line,width))}if(out.length===0)out.push("");return out}function optKindLabel(k,o){switch(k){case"presence":return"";case"number":return" <number>";case"string":return" <string>";case"enum":{let choices=o?.choices??[];if(choices.length===0)return" <choice>";if(choices.length<=4)return` <${choices.join("|")}>`;return` <${choices.slice(0,3).join("|")}|…>`}case"json":return" <json>"}}function cliOptionLabel(o,color){let r=`--${o.name}${optKindLabel(o.kind,o)}`;if(o.shortName)r+=`, -${o.shortName}`;if(!color)return r;let sepIdx=r.indexOf(", ");if(sepIdx===-1)return style.aquaBold(r);let left=r.slice(0,sepIdx),right=r.slice(sepIdx+2);return`${style.aquaBold(left)} ${style.greenBright(right)}`}var CLI_NOTES_PROGRAM="{argsbarg:program}";function cliResolveNotes(notes,appKey){return notes.replaceAll(CLI_NOTES_PROGRAM,appKey)}function cliPositionalLabel(p,color){let{argMin=1,argMax=1}=p,r;if(argMax===1)r=argMin===0?`[${p.name}]`:`<${p.name}>`;else r=argMin===0?`[${p.name}...]`:`<${p.name}...>`;if(!color)return r;return style.aquaBold(r)}function renderTextBox(title,lines,hw,color){if(lines.length===0)return[];let titleLead=color?style.gray(`${kBoxH} `)+style.grayBoldTitle(title)+style.gray(" "):`${kBoxH} ${title} `,contentWidth=Math.max(visibleWidth(titleLead)+1,hw-4);for(let line of lines)contentWidth=Math.max(contentWidth,visibleWidth(line));let borderWidth=contentWidth+2,headerFill=Math.max(1,borderWidth-visibleWidth(titleLead)),out=[];out.push((color?style.gray(kBoxTL):kBoxTL)+titleLead+(color?style.gray(repeatBoxH(headerFill)+kBoxTR):repeatBoxH(headerFill)+kBoxTR));for(let line of lines){let padded=padVisible(line,contentWidth);out.push(`${color?style.gray(kBoxV):kBoxV} ${padded} ${color?style.gray(kBoxV):kBoxV}`)}return out.push(color?style.gray(kBoxBL+repeatBoxH(borderWidth)+kBoxBR):kBoxBL+repeatBoxH(borderWidth)+kBoxBR),out}function renderTableBox(title,rows,hw,color){if(rows.length===0)return[];let labelWidth=0;for(let row of rows)labelWidth=Math.max(labelWidth,visibleWidth(row.label));let titleLead;if(color)titleLead=style.gray(`${kBoxH} `)+style.grayBoldTitle(title)+style.gray(" ");else titleLead=`${kBoxH} ${title} `;let targetContentWidth=Math.max(visibleWidth(titleLead)+1,hw-4),descWidth=Math.max(1,targetContentWidth-labelWidth-2),bodyLines=[];for(let row of rows){let wrapped=wrapText(row.description,descWidth),first=`${row.label+spaces(labelWidth-visibleWidth(row.label))} ${color?style.white(wrapped[0]):wrapped[0]}`;bodyLines.push(first);for(let idx=1;idx<wrapped.length;idx++){let pad=color?style.gray(spaces(labelWidth)):spaces(labelWidth);bodyLines.push(`${pad} ${color?style.white(wrapped[idx]):wrapped[idx]}`)}}let contentWidth=targetContentWidth;for(let line of bodyLines)contentWidth=Math.max(contentWidth,visibleWidth(line));let borderWidth=contentWidth+2,headerFill=Math.max(1,borderWidth-visibleWidth(titleLead)),out=[];out.push((color?style.gray(kBoxTL):kBoxTL)+titleLead+(color?style.gray(repeatBoxH(headerFill)+kBoxTR):repeatBoxH(headerFill)+kBoxTR));for(let line of bodyLines){let padded=padVisible(line,contentWidth);out.push(`${color?style.gray(kBoxV):kBoxV} ${padded} ${color?style.gray(kBoxV):kBoxV}`)}return out.push(color?style.gray(kBoxBL+repeatBoxH(borderWidth)+kBoxBR):kBoxBL+repeatBoxH(borderWidth)+kBoxBR),out}function renderPlainSection(title,lines){if(lines.length===0)return[];let out=[`${title}:`];for(let line of lines)out.push(line.length>0?` ${line}`:"");return out}function renderPlainTable(title,rows,hw){if(rows.length===0)return[];let labelWidth=0;for(let row of rows)labelWidth=Math.max(labelWidth,visibleWidth(row.label));let descWidth=Math.max(20,hw-labelWidth-4),out=[`${title}:`];for(let row of rows){let wrapped=wrapText(row.description,descWidth),paddedLabel=padVisible(row.label,labelWidth);if(wrapped.length===0||wrapped[0].length===0)out.push(` ${row.label}`);else{out.push(` ${paddedLabel} ${wrapped[0]}`);for(let idx=1;idx<wrapped.length;idx++)out.push(` ${spaces(labelWidth)} ${wrapped[idx]}`)}}return out}function usageLines(appName,helpPath,hasCommands,hasArgs,documentLeaf,color,leafKind){let fullPath=appName;for(let seg of helpPath)fullPath+=` ${seg}`;let usageOpts=color?style.aquaBold("[OPTIONS]"):"[OPTIONS]",usageCmd=color?style.aquaBold("COMMAND"):"COMMAND",usageArgs=color?style.aquaBold("[ARGS]..."):"[ARGS]...",docTag=leafKind==="document"?"[DOCUMENT]":"[JSON]",usageDoc=color?style.aquaBold(docTag):docTag,out=[];if(helpPath.length===0){if(hasCommands)out.push(`${fullPath} ${usageOpts} ${usageCmd} ${usageArgs}`);else out.push(`${fullPath} ${usageOpts}`);return out}if(documentLeaf)return out.push(`${fullPath} ${usageDoc}`),out;if(out.push(`${fullPath} ${usageOpts}${hasArgs?` ${usageArgs}`:""}`),hasCommands)out.push(`${fullPath} ${usageCmd} ${usageArgs}`);return out}function rowsForJsonInput(inputSchema,kind){let rows=[{label:kind==="document"?"DOCUMENT":"JSON",description:"Pass a JSON or YAML document as an argument or pipe to stdin."}],props=inputSchema?.properties;if(!props||typeof props!=="object"||Array.isArray(props))return rows;let required=new Set(Array.isArray(inputSchema?.required)?inputSchema.required.map((k)=>String(k)):[]);for(let[name,prop]of Object.entries(props)){let desc=prop.description??"";rows.push({label:name,description:required.has(name)?`(required) ${desc}`:desc})}return rows}function rowsForOptions(defs,color){let rows=[],helpLabel=color?style.aquaBold("--help, ")+style.greenBright("-h"):"--help, -h";rows.push({label:helpLabel,description:"Show help for this command."});for(let o of defs){let desc=o.required?`(required) ${o.description}`:o.description;rows.push({label:cliOptionLabel(o,color),description:desc})}return rows}function rowsForPositionals(defs,color){return defs.map((p)=>({label:cliPositionalLabel(p,color),description:p.description}))}function rowsForSubcommands(cmds){return visibleSubcommands(cmds).sort((a,b)=>a.key.localeCompare(b.key)).map((c)=>({label:c.key,description:c.description}))}function resolveRef(ref,defs){let name=ref.replace(/^#\/(definitions|\$defs)\//,""),target=defs[name];if(typeof target==="object"&&target!==null)return target;return null}function formatType(schema,defs,seen){if(typeof schema.$ref==="string"){let name=schema.$ref.replace(/^#\/(definitions|\$defs)\//,"");if(seen.has(name))return name;seen.add(name);let resolved=resolveRef(schema.$ref,defs),res=resolved?formatType(resolved,defs,seen):name;return seen.delete(name),res}if(Array.isArray(schema.enum)&&schema.enum.length>0)return schema.enum.map((v)=>typeof v==="string"?JSON.stringify(v):String(v)).join(" | ");let union=schema.anyOf??schema.oneOf;if(Array.isArray(union)&&union.length>0){let parts=[],allSimple=!0;for(let variant of union)if(typeof variant==="object"&&variant!==null){let formatted=formatType(variant,defs,seen);if(formatted!==null)parts.push(formatted);else{allSimple=!1;break}}if(allSimple&&parts.length>0)return parts.join(" | ")}if(Array.isArray(schema.type))return schema.type.join(" | ");if(schema.type==="string"){if(typeof schema.format==="string")return`string (${schema.format})`;return"string"}if(schema.type==="number")return"number";if(schema.type==="integer")return"integer";if(schema.type==="boolean")return"boolean";if(schema.type==="null")return"null";if(schema.type==="array"&&schema.items&&typeof schema.items==="object"){let itemType=formatType(schema.items,defs,seen);if(itemType!==null){if(itemType.includes(" | "))return`(${itemType})[]`;return`${itemType}[]`}return null}if(schema.type==="object"||schema.properties!==void 0){if(schema.properties&&typeof schema.properties==="object"&&Object.keys(schema.properties).length>0)return null;if(schema.additionalProperties&&typeof schema.additionalProperties==="object")return`{ [key: string]: ${formatType(schema.additionalProperties,defs,seen)??"object"} }`;return"object"}return null}function formatSchemaLines(schema,defs,indent,seen){if(typeof schema.$ref==="string"){let name=schema.$ref.replace(/^#\/(definitions|\$defs)\//,"");if(seen.has(name))return[`${spaces(indent)}${name}`];seen.add(name);let resolved=resolveRef(schema.$ref,defs),res=resolved?formatSchemaLines(resolved,defs,indent,seen):[`${spaces(indent)}${name}`];return seen.delete(name),res}if(schema.type==="object"||schema.properties!==void 0){let props=schema.properties??{},required=new Set(Array.isArray(schema.required)?schema.required.map((k)=>String(k)):[]),propEntries=Object.entries(props);if(propEntries.length===0){let simple=formatType(schema,defs,seen);return simple?[`${spaces(indent)}${simple}`]:[`${spaces(indent)}{}`]}let lines=[];for(let[key,prop]of propEntries){if(typeof prop!=="object"||prop===null)continue;let desc=typeof prop.description==="string"?prop.description.trim():"";if(desc.length>0)for(let dLine of desc.split(`
11
+ `))lines.push(`${spaces(indent)}# ${dLine.trim()}`);let keyStr=required.has(key)?key:`${key}?`,simple=formatType(prop,defs,seen);if(simple!==null)lines.push(`${spaces(indent)}${keyStr}: ${simple}`);else if(prop.type==="array"&&prop.items&&typeof prop.items==="object"){lines.push(`${spaces(indent)}${keyStr}:`);let itemSchema=prop.items,itemLines=formatSchemaLines(itemSchema,defs,0,seen);if(itemLines.length>0){lines.push(`${spaces(indent+2)}- ${itemLines[0]}`);for(let i=1;i<itemLines.length;i++)lines.push(`${spaces(indent+4)}${itemLines[i]}`)}else lines.push(`${spaces(indent+2)}- {}`)}else{lines.push(`${spaces(indent)}${keyStr}:`);let childLines=formatSchemaLines(prop,defs,indent+2,seen);lines.push(...childLines)}}return lines}if(schema.type==="array"){if(schema.items&&typeof schema.items==="object"){let itemSchema=schema.items,simple=formatType(itemSchema,defs,seen);if(simple!==null)return[`${spaces(indent)}- ${simple}`];let itemLines=formatSchemaLines(itemSchema,defs,0,seen);if(itemLines.length>0){let out=[`${spaces(indent)}- ${itemLines[0]}`];for(let i=1;i<itemLines.length;i++)out.push(`${spaces(indent+2)}${itemLines[i]}`);return out}return[`${spaces(indent)}- {}`]}return[`${spaces(indent)}array`]}let fallback=formatType(schema,defs,seen);return fallback?[`${spaces(indent)}${fallback}`]:[`${spaces(indent)}object`]}function schemaToYamlLines(schema,indent=0){let defs=schema.definitions??schema.$defs??{},lines=[];if(typeof schema.description==="string"&&schema.description.trim().length>0)for(let dLine of schema.description.trim().split(`
12
+ `))lines.push(`${spaces(indent)}# ${dLine.trim()}`);return lines.push(...formatSchemaLines(schema,defs,indent,new Set)),lines}function appendNotesBox(lines,notes,appKey,hw,color,isTTY){if((notes??"").length===0)return;let resolved=cliResolveNotes(notes??"",appKey);if(lines.push(""),isTTY)lines.push(renderTextBox("Notes",wrapText(resolved,hw-4),hw,color).join(`
13
+ `));else lines.push(renderPlainSection("Notes",wrapText(resolved,hw-4)).join(`
14
+ `))}function cliHelpRender(schema,helpPath,useStderr,opts){let hw=getHelpWidth(),isTTY=opts?.isTTY??isOutputTTY(useStderr),color=isTTY,showSchema=opts?.showSchema??!isTTY;if(helpPath.length===0){let lines=[];if(lines.push(""),schema.description.length>0)lines.push(color?style.white(schema.description):schema.description),lines.push("");let usage=usageLines(schema.key,helpPath,(schema.commands??[]).length>0,!1,!1,color);if(isTTY)lines.push(renderTextBox("Usage",usage,hw,color).join(`
15
+ `));else lines.push(renderPlainSection("Usage",usage).join(`
16
+ `));let optRows=rowsForOptions(visibleOptions(schema.options),color),optBox=isTTY?renderTableBox("Options",optRows,hw,color):renderPlainTable("Options",optRows,hw);if(optBox.length>0)lines.push(""),lines.push(optBox.join(`
17
+ `));if((schema.commands??[]).length>0){let subRows=rowsForSubcommands(schema.commands??[]),subBox=isTTY?renderTableBox("Commands",subRows,hw,color):renderPlainTable("Commands",subRows,hw);lines.push(""),lines.push(subBox.join(`
18
+ `))}if(isCliLeaf(schema)&&showSchema){let leaf=schema;if(leaf.outputSchema!==void 0){let title=isDocumentLeaf(leaf)?"Output Schema (JSON)":"Output Schema (with --json)",yamlLines=schemaToYamlLines(leaf.outputSchema,0);if(yamlLines.length>0)if(lines.push(""),isTTY)lines.push(renderTextBox(title,yamlLines,hw,color).join(`
19
+ `));else lines.push(renderPlainSection(title,yamlLines).join(`
20
+ `))}}return appendNotesBox(lines,schema.notes,schema.key,hw,color,isTTY),`${lines.join(`
21
+ `)}
22
+
23
+ `}let layer=schema.commands??[],node;for(let seg of helpPath){let ch=layer.find((c)=>c.key===seg);if(!ch)return`${color?style.red("Unknown help path."):"Unknown help path."}
24
+ `;node=ch,layer=isCliRouter(ch)?ch.commands:[]}if(!node)return`${color?style.red("Unknown help path."):"Unknown help path."}
25
+ `;let lines=[];if(lines.push(""),node.description.length>0)lines.push(color?style.white(node.description):node.description),lines.push("");let nodeIsDocumentLeaf=isCliLeaf(node)&&isDocumentLeaf(node),usage=usageLines(schema.key,helpPath,isCliRouter(node)&&node.commands.length>0,isCliLeaf(node)&&(node.positionals??[]).length>0,nodeIsDocumentLeaf,color,isCliLeaf(node)?node.kind:void 0);if(isTTY)lines.push(renderTextBox("Usage",usage,hw,color).join(`
26
+ `));else lines.push(renderPlainSection("Usage",usage).join(`
27
+ `));if(nodeIsDocumentLeaf&&isCliLeaf(node)){let inputRows=rowsForJsonInput(node.inputSchema,node.kind),inputBox=isTTY?renderTableBox("Input",inputRows,hw,color):renderPlainTable("Input",inputRows,hw);if(inputBox.length>0)lines.push(""),lines.push(inputBox.join(`
28
+ `));if(showSchema&&node.inputSchema!==void 0){let yamlLines=schemaToYamlLines(node.inputSchema,0);if(yamlLines.length>0)if(lines.push(""),isTTY)lines.push(renderTextBox("Input Schema",yamlLines,hw,color).join(`
29
+ `));else lines.push(renderPlainSection("Input Schema",yamlLines).join(`
30
+ `))}}else{let optRows=rowsForOptions(visibleOptions(node.options),color),optBox=isTTY?renderTableBox("Options",optRows,hw,color):renderPlainTable("Options",optRows,hw);if(optBox.length>0)lines.push(""),lines.push(optBox.join(`
31
+ `));let posRows=rowsForPositionals(isCliLeaf(node)?node.positionals??[]:[],color),posBox=isTTY?renderTableBox("Arguments",posRows,hw,color):renderPlainTable("Arguments",posRows,hw);if(posBox.length>0)lines.push(""),lines.push(posBox.join(`
32
+ `))}let subcmds=isCliRouter(node)?node.commands:[],subRows=rowsForSubcommands(subcmds),subBox=isTTY?renderTableBox("Subcommands",subRows,hw,color):renderPlainTable("Subcommands",subRows,hw);if(subBox.length>0)lines.push(""),lines.push(subBox.join(`
33
+ `));if(isCliLeaf(node)&&node.outputSchema!==void 0&&showSchema){let title=nodeIsDocumentLeaf?"Output Schema (JSON)":"Output Schema (with --json)",yamlLines=schemaToYamlLines(node.outputSchema,0);if(yamlLines.length>0)if(lines.push(""),isTTY)lines.push(renderTextBox(title,yamlLines,hw,color).join(`
34
+ `));else lines.push(renderPlainSection(title,yamlLines).join(`
35
+ `))}if((node.notes??"").length>0)appendNotesBox(lines,node.notes,schema.key,hw,color,isTTY);return`${lines.join(`
36
+ `)}
37
+
38
+ `}function commandPath(rootKey,path){if(path.length===0)return rootKey;return[rootKey,...path].join(" ")}function optionType(opt){if(opt.kind==="presence")return"flag";if(opt.kind==="enum")return`enum (\`${(opt.choices??[]).join("`, `")}\`)`;return opt.kind}function optionFormatDefault(opt){let parts=[];if(opt.format!==void 0)parts.push(opt.format);if(opt.default!==void 0)parts.push(`default \`${opt.default}\``);if(opt.pattern!==void 0)parts.push(`pattern \`${opt.pattern}\``);return parts.length>0?parts.join("; "):"—"}function optionLabel(opt){let long=`\`--${opt.name}\``,short=opt.shortName?` (\`-${opt.shortName}\`)`:"";return`${long}${short}`}function formatOptionRow(opt){let req=opt.required?"required":"optional";return`| ${optionLabel(opt)} | ${optionType(opt)} | ${req} | ${optionFormatDefault(opt)} | ${opt.description} |`}function formatPositionalRow(p){let label=cliPositionalLabel(p,!1),req=(p.argMin??1)>0?"required":"optional";return`| \`${label}\` | ${p.kind} | ${req} | ${p.description} |`}function formatNotesBlockquote(notes,appKey){return cliResolveNotes(notes,appKey).split(`
39
+ `).map((line)=>`> ${line}`).join(`
40
+ `)}function formatOutputSchemaSection(schema){return["#### Output","","JSON Schema for output when/if handler emits JSON","","```json",JSON.stringify(schema,null,2),"```",""]}function fallbackLine(node){if(node.fallbackCommand===void 0)return null;let mode=node.fallbackMode??"missingOnly";return`**Default subcommand:** \`${node.fallbackCommand}\` (\`${mode}\`)`}function formatOutputSchemaPointer(rootKey){return["#### Output","",`See \`${rootKey} docs cli-schema\` for outputSchema when set.`,""]}function renderCommandNode(rootKey,path,node,lines,opts){let level=Math.min(path.length+2,6),heading="#".repeat(level),cmd=commandPath(rootKey,path);if(lines.push(`${heading} \`${cmd}\``,"",node.description,""),node.notes)lines.push(formatNotesBlockquote(node.notes,rootKey),"");let fb=fallbackLine(node);if(fb)lines.push(fb,"");if(opts.compact&&(node.options??[]).length===0&&(node.positionals??[]).length===0&&!node.commands?.length)lines.push(`Input shape: see \`${rootKey} docs cli-schema\`.`,"");else if((node.options??[]).length>0){lines.push("#### Options",""),lines.push("| Option | Type | Required | Format / default | Description |"),lines.push("| --- | --- | --- | --- | --- |");for(let opt of node.options??[])lines.push(formatOptionRow(opt));lines.push("")}if((node.positionals??[]).length>0){lines.push("#### Positionals",""),lines.push("| Argument | Type | Required | Description |"),lines.push("| --- | --- | --- | --- |");for(let p of node.positionals??[])lines.push(formatPositionalRow(p));lines.push("")}if(node.outputSchema!==void 0)if(opts.compact)lines.push(...formatOutputSchemaPointer(rootKey));else lines.push(...formatOutputSchemaSection(node.outputSchema));let children=node.commands??[];if(children.length>0){lines.push("#### Subcommands","");for(let child of children)lines.push(`- \`${child.key}\` — ${child.description}`);lines.push("")}for(let child of children)renderCommandNode(rootKey,[...path,child.key],child,lines,opts)}function generateCliGuideBody(program,opts={}){let schema=cliSchemaExport(program),lines=[];return renderCommandNode(program.key,[],schema,lines,opts),`${lines.join(`
41
+ `).trimEnd()}
42
+ `}function generateCliGuide(program,opts={}){let schema=cliSchemaExport(program),lines=[`# ${program.key} — CLI API reference`,"",schema.description,"",`Machine-readable export: \`${program.key} docs cli-schema\``,""];if(schema.notes)lines.push(formatNotesBlockquote(schema.notes,program.key),"");return lines.push(generateCliGuideBody(program,opts).trimEnd(),""),`${lines.join(`
43
+ `).trimEnd()}
44
+ `}import{randomUUID}from"node:crypto";import{readSync as readSync2}from"node:fs";import{readSync}from"node:fs";function readPromptLine(){let buf=Buffer.alloc(4096),n=readSync(0,buf,{length:4096});return buf.toString("utf8",0,n).replace(/\r?\n$/,"")}var BINDING_VALUES=new Set(["env","file","skip"]);function isFrameworkConfigKey(key){return key.startsWith("_")}function isPresent(value){if(value===void 0||value===null)return!1;if(typeof value==="string"&&value.length===0)return!1;return!0}function readBindings(fileData){let raw=fileData._bindings;if(typeof raw!=="object"||raw===null||Array.isArray(raw))return{};let out={};for(let[key,val]of Object.entries(raw))if(typeof val==="string"&&BINDING_VALUES.has(val))out[key]=val;return out}function validateBindingsShape(fileData,pathPrefix="$"){let raw=fileData._bindings;if(raw===void 0)return[];let errors=[];if(typeof raw!=="object"||raw===null||Array.isArray(raw))return errors.push(`${pathPrefix}._bindings: must be object`),errors;for(let[key,val]of Object.entries(raw))if(typeof val!=="string"||!BINDING_VALUES.has(val))errors.push(`${pathPrefix}._bindings.${key}: must be "env", "file", or "skip"`);return errors}function setBinding(fileData,key,binding){let bindings={...readBindings(fileData),[key]:binding};return{...fileData,["_bindings"]:bindings}}function clearFileValue(fileData,key){if(!(key in fileData))return fileData;let next={...fileData};return delete next[key],next}function isKeyAddressed(key,fileData,_entry){let bindings=readBindings(fileData);if(bindings[key]==="skip"||bindings[key]==="env"||bindings[key]==="file")return!0;return isPresent(fileData[key])}function bindingForKey(key,fileData,resolvedPresent){let b=readBindings(fileData)[key];if(b)return b;if(isPresent(fileData[key]))return"file";if(resolvedPresent)return"env";return"missing"}function synthesizeAllStringSchema(schema){let properties={},required=[];for(let[key,entry]of Object.entries(schema)){let prop={type:"string",description:entry.description};if(entry.default!==void 0)prop.default=entry.default;if(properties[key]=prop,entry.required!==!1)required.push(key)}let out={type:"object",additionalProperties:!1,properties};if(required.length>0)out.required=required;return out}function effectiveJsonSchema(program){let appConfig=program.appConfig;if(!appConfig)return;if(appConfig.jsonSchema!==void 0)return appConfig.jsonSchema;return synthesizeAllStringSchema(appConfig.entries)}function configPropertySchema(jsonSchema,key){let properties=jsonSchema.properties;if(typeof properties!=="object"||properties===null||Array.isArray(properties))return;let prop=properties[key];if(typeof prop!=="object"||prop===null||Array.isArray(prop))return;return prop}function schemaDefaultForKey(program,key){let appConfig=program.appConfig;if(!appConfig)return;let entry=appConfig.entries[key];if(!entry)return;let jsonSchema=effectiveJsonSchema(program);if(jsonSchema){let prop=configPropertySchema(jsonSchema,key);if(prop&&"default"in prop)return prop.default}return entry.default}function isPresent2(value){if(value===void 0||value===null)return!1;if(typeof value==="string"&&value.length===0)return!1;return!0}function captureMappedHostEnv(program){let out={},entries=program.appConfig?.entries;if(!entries)return out;for(let entry of Object.values(entries))if(entry.env)out[entry.env]=process.env[entry.env];return out}function envOverrideValue(envName,hostEnv){let val=hostEnv&&envName in hostEnv?hostEnv[envName]:process.env[envName];if(val===void 0||val.length===0)return;return val}function coerceEnvValue(program,key,raw){let jsonSchema=effectiveJsonSchema(program);if(!jsonSchema)return raw;let properties=jsonSchema.properties;if(typeof properties!=="object"||properties===null||Array.isArray(properties))return raw;let prop=properties[key];if(typeof prop!=="object"||prop===null||Array.isArray(prop))return raw;let type=prop.type;if(type==="number"||type==="integer"){let n=Number(raw);return Number.isNaN(n)?raw:n}if(type==="boolean"){let lower=raw.toLowerCase();if(lower==="true"||lower==="1")return!0;if(lower==="false"||lower==="0")return!1}return raw}function resolveAppConfig(program,fileData,hostEnv){let appConfig=program.appConfig;if(!appConfig)return{};let out={};for(let[key,entry]of Object.entries(appConfig.entries)){let value=resolveConfigKey(program,key,entry,fileData,hostEnv);if(value!==void 0)out[key]=value}return out}function tryEnvOverride(program,key,entry,hostEnv){if(!entry.env)return;let fromEnv=envOverrideValue(entry.env,hostEnv);if(fromEnv===void 0)return;return coerceEnvValue(program,key,fromEnv)}function buildResolveContext(program,key,entry,fileData,hostEnv){return{key,entry,program,fileValue:fileData[key],envValue:entry.env?envOverrideValue(entry.env,hostEnv):void 0}}function resolveConfigKey(program,key,entry,fileData,hostEnv){let fromEnv=tryEnvOverride(program,key,entry,hostEnv);if(fromEnv!==void 0)return fromEnv;if(key in fileData&&isPresent2(fileData[key]))return fileData[key];if(entry.resolve){let fromResolve=entry.resolve(buildResolveContext(program,key,entry,fileData,hostEnv));if(fromResolve!=null&&typeof fromResolve.then==="function")process.stderr.write(`[argsbarg] config "${key}": resolve() returned a Promise; use a synchronous resolver (e.g. Bun.spawnSync with piped stdout).
45
+ `);else if(isPresent2(fromResolve))return fromResolve}let fromEnvFallback=tryEnvOverride(program,key,entry,hostEnv);if(fromEnvFallback!==void 0)return fromEnvFallback;let def=schemaDefaultForKey(program,key);if(def!==void 0)return def;return}function exportConfigToEnv(program,resolved,hostEnv){let appConfig=program.appConfig;if(!appConfig)return;for(let[key,entry]of Object.entries(appConfig.entries)){if(!entry.env)continue;let captured=hostEnv?.[entry.env];if(captured!==void 0&&captured.length>0)continue;let existing=process.env[entry.env];if(existing!==void 0&&existing.length>0)continue;let value=resolved[key];if(!isPresent2(value))continue;process.env[entry.env]=stringifyConfigValue(value)}}function stringifyConfigValue(value){if(typeof value==="string")return value;if(typeof value==="number"||typeof value==="boolean")return String(value);return JSON.stringify(value)}function missingRequiredConfig(program,resolved){let appConfig=program.appConfig;if(!appConfig)return[];let jsonSchema=effectiveJsonSchema(program),fromSchema=jsonSchema?jsonSchemaRequiredKeys(jsonSchema):void 0,missing=[];for(let[key,entry]of Object.entries(appConfig.entries)){if(!configEntryRequired(key,entry,fromSchema))continue;if(!isPresent2(resolved[key]))missing.push(key)}return missing}function formatMissingConfigMessage(program,keys){let list=keys.join(", "),path=displayAppConfigPath(program);return[`Missing required configuration: ${list}`,`Configure interactively: ${program.key} configure install`,`Or set via: ${program.key} configure set <key> <value>`,`Config file: ${path}`,`See: ${program.key} docs mcp`].join(`
46
+ `)}function formatMcpMissingConfigMessage(program,keys){let list=keys.join(", "),path=displayAppConfigPath(program);return[`Missing required configuration: ${list}`,`Configure: ${program.key} configure`,`Or set via: ${program.key} configure set`,`Config file: ${path}`].join(`
47
+ `)}function deepCompareStrict(a,b){let typeofa=typeof a;if(typeofa!==typeof b)return!1;if(Array.isArray(a)){if(!Array.isArray(b))return!1;let length=a.length;if(length!==b.length)return!1;for(let i=0;i<length;i++)if(!deepCompareStrict(a[i],b[i]))return!1;return!0}if(typeofa==="object"){if(!a||!b)return a===b;let aKeys=Object.keys(a),bKeys=Object.keys(b);if(aKeys.length!==bKeys.length)return!1;for(let k of aKeys)if(!deepCompareStrict(a[k],b[k]))return!1;return!0}return a===b}function encodePointer(p){return encodeURI(escapePointer(p))}function escapePointer(p){return p.replace(/~/g,"~0").replace(/\//g,"~1")}var schemaArrayKeyword={prefixItems:!0,items:!0,allOf:!0,anyOf:!0,oneOf:!0},schemaMapKeyword={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependentSchemas:!0},ignoredKeyword={id:!0,$id:!0,$ref:!0,$schema:!0,$anchor:!0,$vocabulary:!0,$comment:!0,default:!0,enum:!0,const:!0,required:!0,type:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0},initialBaseURI=typeof self<"u"&&self.location&&self.location.origin!=="null"?new URL(self.location.origin+self.location.pathname+location.search):new URL("https://github.com/cfworker");function dereference(schema,lookup=Object.create(null),baseURI=initialBaseURI,basePointer=""){if(schema&&typeof schema==="object"&&!Array.isArray(schema)){let id=schema.$id||schema.id;if(id){let url=new URL(id,baseURI.href);if(url.hash.length>1)lookup[url.href]=schema;else if(url.hash="",basePointer==="")baseURI=url;else dereference(schema,lookup,baseURI)}}else if(schema!==!0&&schema!==!1)return lookup;let schemaURI=baseURI.href+(basePointer?"#"+basePointer:"");if(lookup[schemaURI]!==void 0)throw Error(`Duplicate schema URI "${schemaURI}".`);if(lookup[schemaURI]=schema,schema===!0||schema===!1)return lookup;if(schema.__absolute_uri__===void 0)Object.defineProperty(schema,"__absolute_uri__",{enumerable:!1,value:schemaURI});if(schema.$ref&&schema.__absolute_ref__===void 0){let url=new URL(schema.$ref,baseURI.href);url.hash=url.hash,Object.defineProperty(schema,"__absolute_ref__",{enumerable:!1,value:url.href})}if(schema.$recursiveRef&&schema.__absolute_recursive_ref__===void 0){let url=new URL(schema.$recursiveRef,baseURI.href);url.hash=url.hash,Object.defineProperty(schema,"__absolute_recursive_ref__",{enumerable:!1,value:url.href})}if(schema.$anchor){let url=new URL("#"+schema.$anchor,baseURI.href);lookup[url.href]=schema}for(let key in schema){if(ignoredKeyword[key])continue;let keyBase=`${basePointer}/${encodePointer(key)}`,subSchema=schema[key];if(Array.isArray(subSchema)){if(schemaArrayKeyword[key]){let length=subSchema.length;for(let i=0;i<length;i++)dereference(subSchema[i],lookup,baseURI,`${keyBase}/${i}`)}}else if(schemaMapKeyword[key])for(let subKey in subSchema)dereference(subSchema[subKey],lookup,baseURI,`${keyBase}/${encodePointer(subKey)}`);else dereference(subSchema,lookup,baseURI,keyBase)}return lookup}var DATE=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,DAYS=[0,31,28,31,30,31,30,31,31,30,31,30,31],TIME=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i,HOSTNAME=/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,URIREF=/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,URITEMPLATE=/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,URL_=/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,UUID=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,JSON_POINTER=/^(?:\/(?:[^~/]|~0|~1)*)*$/,JSON_POINTER_URI_FRAGMENT=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,RELATIVE_JSON_POINTER=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,EMAIL=(input)=>{if(input[0]==='"')return!1;let[name,host,...rest]=input.split("@");if(!name||!host||rest.length!==0||name.length>64||host.length>253)return!1;if(name[0]==="."||name.endsWith(".")||name.includes(".."))return!1;if(!/^[a-z0-9.-]+$/i.test(host)||!/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+$/i.test(name))return!1;return host.split(".").every((part)=>/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/i.test(part))},IPV4=/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,IPV6=/^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,DURATION=(input)=>input.length>1&&input.length<80&&(/^P\d+([.,]\d+)?W$/.test(input)||/^P[\dYMDTHS]*(\d[.,]\d+)?[YMDHS]$/.test(input)&&/^P([.,\d]+Y)?([.,\d]+M)?([.,\d]+D)?(T([.,\d]+H)?([.,\d]+M)?([.,\d]+S)?)?$/.test(input));function bind(r){return r.test.bind(r)}var format={date,time:time.bind(void 0,!1),"date-time":date_time,duration:DURATION,uri,"uri-reference":bind(URIREF),"uri-template":bind(URITEMPLATE),url:bind(URL_),email:EMAIL,hostname:bind(HOSTNAME),ipv4:bind(IPV4),ipv6:bind(IPV6),regex,uuid:bind(UUID),"json-pointer":bind(JSON_POINTER),"json-pointer-uri-fragment":bind(JSON_POINTER_URI_FRAGMENT),"relative-json-pointer":bind(RELATIVE_JSON_POINTER)};function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function date(str){let matches=str.match(DATE);if(!matches)return!1;let year=+matches[1],month=+matches[2],day=+matches[3];return month>=1&&month<=12&&day>=1&&day<=(month==2&&isLeapYear(year)?29:DAYS[month])}function time(full,str){let matches=str.match(TIME);if(!matches)return!1;let hour=+matches[1],minute=+matches[2],second=+matches[3],timeZone=!!matches[5];return(hour<=23&&minute<=59&&second<=59||hour==23&&minute==59&&second==60)&&(!full||timeZone)}var DATE_TIME_SEPARATOR=/t|\s/i;function date_time(str){let dateTime=str.split(DATE_TIME_SEPARATOR);return dateTime.length==2&&date(dateTime[0])&&time(!0,dateTime[1])}var NOT_URI_FRAGMENT=/\/|:/,URI_PATTERN=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;function uri(str){return NOT_URI_FRAGMENT.test(str)&&URI_PATTERN.test(str)}var Z_ANCHOR=/[^\\]\\Z/;function regex(str){if(Z_ANCHOR.test(str))return!1;try{return new RegExp(str,"u"),!0}catch(e){return!1}}function ucs2length(s){let result=0,length=s.length,index=0,charCode;while(index<length)if(result++,charCode=s.charCodeAt(index++),charCode>=55296&&charCode<=56319&&index<length){if(charCode=s.charCodeAt(index),(charCode&64512)==56320)index++}return result}function validate(instance,schema,draft="2019-09",lookup=dereference(schema),shortCircuit=!0,recursiveAnchor=null,instanceLocation="#",schemaLocation="#",evaluated=Object.create(null)){if(schema===!0)return{valid:!0,errors:[]};if(schema===!1)return{valid:!1,errors:[{instanceLocation,keyword:"false",keywordLocation:instanceLocation,error:"False boolean schema."}]};let rawInstanceType=typeof instance,instanceType;switch(rawInstanceType){case"boolean":case"number":case"string":instanceType=rawInstanceType;break;case"object":if(instance===null)instanceType="null";else if(Array.isArray(instance))instanceType="array";else instanceType="object";break;default:throw Error(`Instances of "${rawInstanceType}" type are not supported.`)}let{$ref,$recursiveRef,$recursiveAnchor,type:$type,const:$const,enum:$enum,required:$required,not:$not,anyOf:$anyOf,allOf:$allOf,oneOf:$oneOf,if:$if,then:$then,else:$else,format:$format,properties:$properties,patternProperties:$patternProperties,additionalProperties:$additionalProperties,unevaluatedProperties:$unevaluatedProperties,minProperties:$minProperties,maxProperties:$maxProperties,propertyNames:$propertyNames,dependentRequired:$dependentRequired,dependentSchemas:$dependentSchemas,dependencies:$dependencies,prefixItems:$prefixItems,items:$items,additionalItems:$additionalItems,unevaluatedItems:$unevaluatedItems,contains:$contains,minContains:$minContains,maxContains:$maxContains,minItems:$minItems,maxItems:$maxItems,uniqueItems:$uniqueItems,minimum:$minimum,maximum:$maximum,exclusiveMinimum:$exclusiveMinimum,exclusiveMaximum:$exclusiveMaximum,multipleOf:$multipleOf,minLength:$minLength,maxLength:$maxLength,pattern:$pattern,__absolute_ref__,__absolute_recursive_ref__}=schema,errors=[];if($recursiveAnchor===!0&&recursiveAnchor===null)recursiveAnchor=schema;if($recursiveRef==="#"){let refSchema=recursiveAnchor===null?lookup[__absolute_recursive_ref__]:recursiveAnchor,keywordLocation=`${schemaLocation}/$recursiveRef`,result=validate(instance,recursiveAnchor===null?schema:recursiveAnchor,draft,lookup,shortCircuit,refSchema,instanceLocation,keywordLocation,evaluated);if(!result.valid)errors.push({instanceLocation,keyword:"$recursiveRef",keywordLocation,error:"A subschema had errors."},...result.errors)}if($ref!==void 0){let refSchema=lookup[__absolute_ref__||$ref];if(refSchema===void 0){let message=`Unresolved $ref "${$ref}".`;if(__absolute_ref__&&__absolute_ref__!==$ref)message+=` Absolute URI "${__absolute_ref__}".`;throw message+=`
48
+ Known schemas:
49
+ - ${Object.keys(lookup).join(`
50
+ - `)}`,Error(message)}let keywordLocation=`${schemaLocation}/$ref`,result=validate(instance,refSchema,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,keywordLocation,evaluated);if(!result.valid)errors.push({instanceLocation,keyword:"$ref",keywordLocation,error:"A subschema had errors."},...result.errors);if(draft==="4"||draft==="7")return{valid:errors.length===0,errors}}if(Array.isArray($type)){let length=$type.length,valid=!1;for(let i=0;i<length;i++)if(instanceType===$type[i]||$type[i]==="integer"&&instanceType==="number"&&instance%1===0&&instance===instance){valid=!0;break}if(!valid)errors.push({instanceLocation,keyword:"type",keywordLocation:`${schemaLocation}/type`,error:`Instance type "${instanceType}" is invalid. Expected "${$type.join('", "')}".`})}else if($type==="integer"){if(instanceType!=="number"||instance%1||instance!==instance)errors.push({instanceLocation,keyword:"type",keywordLocation:`${schemaLocation}/type`,error:`Instance type "${instanceType}" is invalid. Expected "${$type}".`})}else if($type!==void 0&&instanceType!==$type)errors.push({instanceLocation,keyword:"type",keywordLocation:`${schemaLocation}/type`,error:`Instance type "${instanceType}" is invalid. Expected "${$type}".`});if($const!==void 0){if(instanceType==="object"||instanceType==="array"){if(!deepCompareStrict(instance,$const))errors.push({instanceLocation,keyword:"const",keywordLocation:`${schemaLocation}/const`,error:`Instance does not match ${JSON.stringify($const)}.`})}else if(instance!==$const)errors.push({instanceLocation,keyword:"const",keywordLocation:`${schemaLocation}/const`,error:`Instance does not match ${JSON.stringify($const)}.`})}if($enum!==void 0){if(instanceType==="object"||instanceType==="array"){if(!$enum.some((value)=>deepCompareStrict(instance,value)))errors.push({instanceLocation,keyword:"enum",keywordLocation:`${schemaLocation}/enum`,error:`Instance does not match any of ${JSON.stringify($enum)}.`})}else if(!$enum.some((value)=>instance===value))errors.push({instanceLocation,keyword:"enum",keywordLocation:`${schemaLocation}/enum`,error:`Instance does not match any of ${JSON.stringify($enum)}.`})}if($not!==void 0){let keywordLocation=`${schemaLocation}/not`;if(validate(instance,$not,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,keywordLocation).valid)errors.push({instanceLocation,keyword:"not",keywordLocation,error:'Instance matched "not" schema.'})}let subEvaluateds=[];if($anyOf!==void 0){let keywordLocation=`${schemaLocation}/anyOf`,errorsLength=errors.length,anyValid=!1;for(let i=0;i<$anyOf.length;i++){let subSchema=$anyOf[i],subEvaluated=Object.create(evaluated),result=validate(instance,subSchema,draft,lookup,shortCircuit,$recursiveAnchor===!0?recursiveAnchor:null,instanceLocation,`${keywordLocation}/${i}`,subEvaluated);if(errors.push(...result.errors),anyValid=anyValid||result.valid,result.valid)subEvaluateds.push(subEvaluated)}if(anyValid)errors.length=errorsLength;else errors.splice(errorsLength,0,{instanceLocation,keyword:"anyOf",keywordLocation,error:"Instance does not match any subschemas."})}if($allOf!==void 0){let keywordLocation=`${schemaLocation}/allOf`,errorsLength=errors.length,allValid=!0;for(let i=0;i<$allOf.length;i++){let subSchema=$allOf[i],subEvaluated=Object.create(evaluated),result=validate(instance,subSchema,draft,lookup,shortCircuit,$recursiveAnchor===!0?recursiveAnchor:null,instanceLocation,`${keywordLocation}/${i}`,subEvaluated);if(errors.push(...result.errors),allValid=allValid&&result.valid,result.valid)subEvaluateds.push(subEvaluated)}if(allValid)errors.length=errorsLength;else errors.splice(errorsLength,0,{instanceLocation,keyword:"allOf",keywordLocation,error:"Instance does not match every subschema."})}if($oneOf!==void 0){let keywordLocation=`${schemaLocation}/oneOf`,errorsLength=errors.length,matches=$oneOf.filter((subSchema,i)=>{let subEvaluated=Object.create(evaluated),result=validate(instance,subSchema,draft,lookup,shortCircuit,$recursiveAnchor===!0?recursiveAnchor:null,instanceLocation,`${keywordLocation}/${i}`,subEvaluated);if(errors.push(...result.errors),result.valid)subEvaluateds.push(subEvaluated);return result.valid}).length;if(matches===1)errors.length=errorsLength;else errors.splice(errorsLength,0,{instanceLocation,keyword:"oneOf",keywordLocation,error:`Instance does not match exactly one subschema (${matches} matches).`})}if(instanceType==="object"||instanceType==="array")Object.assign(evaluated,...subEvaluateds);if($if!==void 0){let keywordLocation=`${schemaLocation}/if`;if(validate(instance,$if,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,keywordLocation,evaluated).valid){if($then!==void 0){let thenResult=validate(instance,$then,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,`${schemaLocation}/then`,evaluated);if(!thenResult.valid)errors.push({instanceLocation,keyword:"if",keywordLocation,error:'Instance does not match "then" schema.'},...thenResult.errors)}}else if($else!==void 0){let elseResult=validate(instance,$else,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,`${schemaLocation}/else`,evaluated);if(!elseResult.valid)errors.push({instanceLocation,keyword:"if",keywordLocation,error:'Instance does not match "else" schema.'},...elseResult.errors)}}if(instanceType==="object"){if($required!==void 0){for(let key of $required)if(!(key in instance))errors.push({instanceLocation,keyword:"required",keywordLocation:`${schemaLocation}/required`,error:`Instance does not have required property "${key}".`})}let keys=Object.keys(instance);if($minProperties!==void 0&&keys.length<$minProperties)errors.push({instanceLocation,keyword:"minProperties",keywordLocation:`${schemaLocation}/minProperties`,error:`Instance does not have at least ${$minProperties} properties.`});if($maxProperties!==void 0&&keys.length>$maxProperties)errors.push({instanceLocation,keyword:"maxProperties",keywordLocation:`${schemaLocation}/maxProperties`,error:`Instance does not have at least ${$maxProperties} properties.`});if($propertyNames!==void 0){let keywordLocation=`${schemaLocation}/propertyNames`;for(let key in instance){let subInstancePointer=`${instanceLocation}/${encodePointer(key)}`,result=validate(key,$propertyNames,draft,lookup,shortCircuit,recursiveAnchor,subInstancePointer,keywordLocation);if(!result.valid)errors.push({instanceLocation,keyword:"propertyNames",keywordLocation,error:`Property name "${key}" does not match schema.`},...result.errors)}}if($dependentRequired!==void 0){let keywordLocation=`${schemaLocation}/dependantRequired`;for(let key in $dependentRequired)if(key in instance){let required=$dependentRequired[key];for(let dependantKey of required)if(!(dependantKey in instance))errors.push({instanceLocation,keyword:"dependentRequired",keywordLocation,error:`Instance has "${key}" but does not have "${dependantKey}".`})}}if($dependentSchemas!==void 0)for(let key in $dependentSchemas){let keywordLocation=`${schemaLocation}/dependentSchemas`;if(key in instance){let result=validate(instance,$dependentSchemas[key],draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,`${keywordLocation}/${encodePointer(key)}`,evaluated);if(!result.valid)errors.push({instanceLocation,keyword:"dependentSchemas",keywordLocation,error:`Instance has "${key}" but does not match dependant schema.`},...result.errors)}}if($dependencies!==void 0){let keywordLocation=`${schemaLocation}/dependencies`;for(let key in $dependencies)if(key in instance){let propsOrSchema=$dependencies[key];if(Array.isArray(propsOrSchema)){for(let dependantKey of propsOrSchema)if(!(dependantKey in instance))errors.push({instanceLocation,keyword:"dependencies",keywordLocation,error:`Instance has "${key}" but does not have "${dependantKey}".`})}else{let result=validate(instance,propsOrSchema,draft,lookup,shortCircuit,recursiveAnchor,instanceLocation,`${keywordLocation}/${encodePointer(key)}`);if(!result.valid)errors.push({instanceLocation,keyword:"dependencies",keywordLocation,error:`Instance has "${key}" but does not match dependant schema.`},...result.errors)}}}let thisEvaluated=Object.create(null),stop=!1;if($properties!==void 0){let keywordLocation=`${schemaLocation}/properties`;for(let key in $properties){if(!(key in instance))continue;let subInstancePointer=`${instanceLocation}/${encodePointer(key)}`,result=validate(instance[key],$properties[key],draft,lookup,shortCircuit,recursiveAnchor,subInstancePointer,`${keywordLocation}/${encodePointer(key)}`);if(result.valid)evaluated[key]=thisEvaluated[key]=!0;else if(stop=shortCircuit,errors.push({instanceLocation,keyword:"properties",keywordLocation,error:`Property "${key}" does not match schema.`},...result.errors),stop)break}}if(!stop&&$patternProperties!==void 0){let keywordLocation=`${schemaLocation}/patternProperties`;for(let pattern in $patternProperties){let regex=new RegExp(pattern,"u"),subSchema=$patternProperties[pattern];for(let key in instance){if(!regex.test(key))continue;let subInstancePointer=`${instanceLocation}/${encodePointer(key)}`,result=validate(instance[key],subSchema,draft,lookup,shortCircuit,recursiveAnchor,subInstancePointer,`${keywordLocation}/${encodePointer(pattern)}`);if(result.valid)evaluated[key]=thisEvaluated[key]=!0;else stop=shortCircuit,errors.push({instanceLocation,keyword:"patternProperties",keywordLocation,error:`Property "${key}" matches pattern "${pattern}" but does not match associated schema.`},...result.errors)}}}if(!stop&&$additionalProperties!==void 0){let keywordLocation=`${schemaLocation}/additionalProperties`;for(let key in instance){if(thisEvaluated[key])continue;let subInstancePointer=`${instanceLocation}/${encodePointer(key)}`,result=validate(instance[key],$additionalProperties,draft,lookup,shortCircuit,recursiveAnchor,subInstancePointer,keywordLocation);if(result.valid)evaluated[key]=!0;else stop=shortCircuit,errors.push({instanceLocation,keyword:"additionalProperties",keywordLocation,error:`Property "${key}" does not match additional properties schema.`},...result.errors)}}else if(!stop&&$unevaluatedProperties!==void 0){let keywordLocation=`${schemaLocation}/unevaluatedProperties`;for(let key in instance)if(!evaluated[key]){let subInstancePointer=`${instanceLocation}/${encodePointer(key)}`,result=validate(instance[key],$unevaluatedProperties,draft,lookup,shortCircuit,recursiveAnchor,subInstancePointer,keywordLocation);if(result.valid)evaluated[key]=!0;else errors.push({instanceLocation,keyword:"unevaluatedProperties",keywordLocation,error:`Property "${key}" does not match unevaluated properties schema.`},...result.errors)}}}else if(instanceType==="array"){if($maxItems!==void 0&&instance.length>$maxItems)errors.push({instanceLocation,keyword:"maxItems",keywordLocation:`${schemaLocation}/maxItems`,error:`Array has too many items (${instance.length} > ${$maxItems}).`});if($minItems!==void 0&&instance.length<$minItems)errors.push({instanceLocation,keyword:"minItems",keywordLocation:`${schemaLocation}/minItems`,error:`Array has too few items (${instance.length} < ${$minItems}).`});let length=instance.length,i=0,stop=!1;if($prefixItems!==void 0){let keywordLocation=`${schemaLocation}/prefixItems`,length2=Math.min($prefixItems.length,length);for(;i<length2;i++){let result=validate(instance[i],$prefixItems[i],draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${i}`,`${keywordLocation}/${i}`);if(evaluated[i]=!0,!result.valid){if(stop=shortCircuit,errors.push({instanceLocation,keyword:"prefixItems",keywordLocation,error:"Items did not match schema."},...result.errors),stop)break}}}if($items!==void 0){let keywordLocation=`${schemaLocation}/items`;if(Array.isArray($items)){let length2=Math.min($items.length,length);for(;i<length2;i++){let result=validate(instance[i],$items[i],draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${i}`,`${keywordLocation}/${i}`);if(evaluated[i]=!0,!result.valid){if(stop=shortCircuit,errors.push({instanceLocation,keyword:"items",keywordLocation,error:"Items did not match schema."},...result.errors),stop)break}}}else for(;i<length;i++){let result=validate(instance[i],$items,draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${i}`,keywordLocation);if(evaluated[i]=!0,!result.valid){if(stop=shortCircuit,errors.push({instanceLocation,keyword:"items",keywordLocation,error:"Items did not match schema."},...result.errors),stop)break}}if(!stop&&$additionalItems!==void 0){let keywordLocation=`${schemaLocation}/additionalItems`;for(;i<length;i++){let result=validate(instance[i],$additionalItems,draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${i}`,keywordLocation);if(evaluated[i]=!0,!result.valid)stop=shortCircuit,errors.push({instanceLocation,keyword:"additionalItems",keywordLocation,error:"Items did not match additional items schema."},...result.errors)}}}if($contains!==void 0)if(length===0&&$minContains===void 0)errors.push({instanceLocation,keyword:"contains",keywordLocation:`${schemaLocation}/contains`,error:"Array is empty. It must contain at least one item matching the schema."});else if($minContains!==void 0&&length<$minContains)errors.push({instanceLocation,keyword:"minContains",keywordLocation:`${schemaLocation}/minContains`,error:`Array has less items (${length}) than minContains (${$minContains}).`});else{let keywordLocation=`${schemaLocation}/contains`,errorsLength=errors.length,contained=0;for(let j=0;j<length;j++){let result=validate(instance[j],$contains,draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${j}`,keywordLocation);if(result.valid)evaluated[j]=!0,contained++;else errors.push(...result.errors)}if(contained>=($minContains||0))errors.length=errorsLength;if($minContains===void 0&&$maxContains===void 0&&contained===0)errors.splice(errorsLength,0,{instanceLocation,keyword:"contains",keywordLocation,error:"Array does not contain item matching schema."});else if($minContains!==void 0&&contained<$minContains)errors.push({instanceLocation,keyword:"minContains",keywordLocation:`${schemaLocation}/minContains`,error:`Array must contain at least ${$minContains} items matching schema. Only ${contained} items were found.`});else if($maxContains!==void 0&&contained>$maxContains)errors.push({instanceLocation,keyword:"maxContains",keywordLocation:`${schemaLocation}/maxContains`,error:`Array may contain at most ${$maxContains} items matching schema. ${contained} items were found.`})}if(!stop&&$unevaluatedItems!==void 0){let keywordLocation=`${schemaLocation}/unevaluatedItems`;for(i;i<length;i++){if(evaluated[i])continue;let result=validate(instance[i],$unevaluatedItems,draft,lookup,shortCircuit,recursiveAnchor,`${instanceLocation}/${i}`,keywordLocation);if(evaluated[i]=!0,!result.valid)errors.push({instanceLocation,keyword:"unevaluatedItems",keywordLocation,error:"Items did not match unevaluated items schema."},...result.errors)}}if($uniqueItems)for(let j=0;j<length;j++){let a=instance[j],ao=typeof a==="object"&&a!==null;for(let k=0;k<length;k++){if(j===k)continue;let b=instance[k];if(a===b||ao&&(typeof b==="object"&&b!==null)&&deepCompareStrict(a,b))errors.push({instanceLocation,keyword:"uniqueItems",keywordLocation:`${schemaLocation}/uniqueItems`,error:`Duplicate items at indexes ${j} and ${k}.`}),j=Number.MAX_SAFE_INTEGER,k=Number.MAX_SAFE_INTEGER}}}else if(instanceType==="number"){if(draft==="4"){if($minimum!==void 0&&($exclusiveMinimum===!0&&instance<=$minimum||instance<$minimum))errors.push({instanceLocation,keyword:"minimum",keywordLocation:`${schemaLocation}/minimum`,error:`${instance} is less than ${$exclusiveMinimum?"or equal to ":""} ${$minimum}.`});if($maximum!==void 0&&($exclusiveMaximum===!0&&instance>=$maximum||instance>$maximum))errors.push({instanceLocation,keyword:"maximum",keywordLocation:`${schemaLocation}/maximum`,error:`${instance} is greater than ${$exclusiveMaximum?"or equal to ":""} ${$maximum}.`})}else{if($minimum!==void 0&&instance<$minimum)errors.push({instanceLocation,keyword:"minimum",keywordLocation:`${schemaLocation}/minimum`,error:`${instance} is less than ${$minimum}.`});if($maximum!==void 0&&instance>$maximum)errors.push({instanceLocation,keyword:"maximum",keywordLocation:`${schemaLocation}/maximum`,error:`${instance} is greater than ${$maximum}.`});if($exclusiveMinimum!==void 0&&instance<=$exclusiveMinimum)errors.push({instanceLocation,keyword:"exclusiveMinimum",keywordLocation:`${schemaLocation}/exclusiveMinimum`,error:`${instance} is less than ${$exclusiveMinimum}.`});if($exclusiveMaximum!==void 0&&instance>=$exclusiveMaximum)errors.push({instanceLocation,keyword:"exclusiveMaximum",keywordLocation:`${schemaLocation}/exclusiveMaximum`,error:`${instance} is greater than or equal to ${$exclusiveMaximum}.`})}if($multipleOf!==void 0){let remainder=instance%$multipleOf;if(Math.abs(0-remainder)>=0.00000011920929&&Math.abs($multipleOf-remainder)>=0.00000011920929)errors.push({instanceLocation,keyword:"multipleOf",keywordLocation:`${schemaLocation}/multipleOf`,error:`${instance} is not a multiple of ${$multipleOf}.`})}}else if(instanceType==="string"){let length=$minLength===void 0&&$maxLength===void 0?0:ucs2length(instance);if($minLength!==void 0&&length<$minLength)errors.push({instanceLocation,keyword:"minLength",keywordLocation:`${schemaLocation}/minLength`,error:`String is too short (${length} < ${$minLength}).`});if($maxLength!==void 0&&length>$maxLength)errors.push({instanceLocation,keyword:"maxLength",keywordLocation:`${schemaLocation}/maxLength`,error:`String is too long (${length} > ${$maxLength}).`});if($pattern!==void 0&&!new RegExp($pattern,"u").test(instance))errors.push({instanceLocation,keyword:"pattern",keywordLocation:`${schemaLocation}/pattern`,error:"String does not match pattern."});if($format!==void 0&&format[$format]&&!format[$format](instance))errors.push({instanceLocation,keyword:"format",keywordLocation:`${schemaLocation}/format`,error:`String does not match format "${$format}".`})}return{valid:errors.length===0,errors}}class Validator{schema;draft;shortCircuit;lookup;constructor(schema,draft="2019-09",shortCircuit=!0){this.schema=schema,this.draft=draft,this.shortCircuit=shortCircuit,this.lookup=dereference(schema)}validate(instance){return validate(instance,this.schema,this.draft,this.lookup,this.shortCircuit)}addSchema(schema,id){if(id)schema={...schema,$id:id};dereference(schema,this.lookup)}}var DURATION_RE=/^\d+[hdms]?$/i,DATE_RE=/^\d{4}-\d{2}-\d{2}$/;function parseDurationMs(durationStr){let match=durationStr.trim().match(/^(\d+)([hdms]?)$/i);if(!match)throw Error("Invalid duration format. Use e.g. 30s, 20m, 1h, 2d");let amountText=match[1];if(!amountText)throw Error("Invalid duration format. Use e.g. 30s, 20m, 1h, 2d");let amount=Number.parseInt(amountText,10),unit=(match[2]||"m").toLowerCase();if(unit==="s")return amount*1000;if(unit==="m")return amount*60*1000;if(unit==="h")return amount*60*60*1000;if(unit==="d")return amount*24*60*60*1000;return amount*60*1000}function validateDuration(s){if(!DURATION_RE.test(s.trim()))throw Error("Invalid duration format. Use e.g. 30s, 20m, 1h, 2d");parseDurationMs(s)}function parseCommaList(s){return s.split(",").map((part)=>part.trim()).filter(Boolean)}function validateCommaList(s){if(parseCommaList(s).length===0)throw Error("Comma-separated list must contain at least one value")}function parseDate(s){let trimmed=s.trim();if(!DATE_RE.test(trimmed))throw Error("Invalid date. Use YYYY-MM-DD");let[y,m,d]=trimmed.split("-").map((part)=>Number.parseInt(part,10)),year=y??0,month=m??0,day=d??0,dt=new Date(Date.UTC(year,month-1,day));if(dt.getUTCFullYear()!==year||dt.getUTCMonth()!==month-1||dt.getUTCDate()!==day)throw Error("Invalid date. Use YYYY-MM-DD");return trimmed}function validateDate(s){parseDate(s)}var DATE_TIME_RE=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;function parseDateTime(s){let trimmed=s.trim();if(!DATE_TIME_RE.test(trimmed))throw Error("Invalid date-time. Use RFC 3339, e.g. 2026-06-22T15:00:00Z");let ms=Date.parse(trimmed);if(Number.isNaN(ms))throw Error("Invalid date-time. Use RFC 3339, e.g. 2026-06-22T15:00:00Z");return new Date(ms).toISOString()}function validateDateTime(s){parseDateTime(s)}function validatePattern(s,pattern){if(!new RegExp(pattern).test(s))throw Error(`Value does not match required pattern: ${pattern}`)}function formatValidationError(format,value){switch(format){case"duration":return`Invalid duration: ${value} (use e.g. 30s, 20m, 1h, 2d)`;case"comma-list":return`Invalid comma-separated list: ${value}`;case"date":return`Invalid date: ${value} (use YYYY-MM-DD)`;case"date-time":return`Invalid date-time: ${value} (use RFC 3339, e.g. 2026-06-22T15:00:00Z)`}}function validateFormatValue(value,format,pattern){if(format!==void 0)switch(format){case"duration":validateDuration(value);return;case"comma-list":validateCommaList(value);return;case"date":validateDate(value);return;case"date-time":validateDateTime(value);return}if(pattern!==void 0)validatePattern(value,pattern)}if(!format["comma-list"])format["comma-list"]=(value)=>{try{return validateCommaList(value),!0}catch{return!1}};function dataForSchemaValidation(data){if(typeof data!=="object"||data===null||Array.isArray(data))return data;let out={};for(let[key,value]of Object.entries(data)){if(isFrameworkConfigKey(key))continue;out[key]=value}return out}function schemaWithoutRequired(schema){if(typeof schema!=="object"||schema===null)return schema;if(Array.isArray(schema))return schema.map(schemaWithoutRequired);let out={};for(let[key,value]of Object.entries(schema)){if(key==="required")continue;out[key]=schemaWithoutRequired(value)}return out}function formatInstancePath(instanceLocation){if(instanceLocation.length===0||instanceLocation==="#")return"$";if(instanceLocation.startsWith("#/"))return instanceLocation.slice(2).replace(/\//g,".");return instanceLocation}var WRAPPER_KEYWORDS=new Set(["$ref","$recursiveRef","properties","items","prefixItems","additionalItems","allOf","anyOf","oneOf"]);function schemaAtPointer(root,keywordLocation){if(!keywordLocation.startsWith("#"))return;let segments=keywordLocation.slice(1).split("/").filter((segment)=>segment.length>0).map(decodeJsonPointerSegment),current=root;for(let segment of segments){if(segment==="$ref"){if(typeof current!=="object"||current===null||Array.isArray(current))return;let ref=current.$ref;if(typeof ref!=="string")return;current=resolveJsonPointer(root,ref);continue}if(typeof current!=="object"||current===null)return;current=current[segment]}return current}function instanceAtPointer(data,instanceLocation){if(!instanceLocation.startsWith("#"))return;let segments=instanceLocation.slice(1).split("/").filter((segment)=>segment.length>0).map(decodeJsonPointerSegment),current=data;for(let segment of segments){if(typeof current!=="object"||current===null)return;current=current[segment]}return current}function parentPointer(location2){let idx=location2.lastIndexOf("/");if(idx<0)return;return location2.slice(0,idx)||"#"}function unionDiscriminator(branches,root){let resolvedBranches=branches.map((b)=>{if(typeof b!=="object"||b===null||Array.isArray(b))return b;let ref=b.$ref;if(typeof ref!=="string")return b;return resolveJsonPointer(root,ref)??b}),objectBranches=resolvedBranches.filter((b)=>typeof b==="object"&&b!==null&&!Array.isArray(b));if(objectBranches.length===0||objectBranches.length!==resolvedBranches.length)return;let branchValuesFor=(prop)=>{let perBranch=[];for(let branch of objectBranches){let props=branch.properties,propSchema=typeof props==="object"&&props!==null&&!Array.isArray(props)?props[prop]:void 0;if(!propSchema||typeof propSchema!=="object")return;let values;if(typeof propSchema.const==="string")values=[propSchema.const];else if(Array.isArray(propSchema.enum)&&propSchema.enum.every((v)=>typeof v==="string"))values=propSchema.enum;if(!values||values.length===0)return;perBranch.push(values)}let seen=new Set;for(let values of perBranch)for(let v of values){if(seen.has(v))return;seen.add(v)}return perBranch},candidateProps=new Set;for(let branch of objectBranches){let props=branch.properties;if(typeof props==="object"&&props!==null&&!Array.isArray(props))for(let key of Object.keys(props))candidateProps.add(key)}let eligible=[];for(let prop of candidateProps)if(branchValuesFor(prop))eligible.push(prop);if(eligible.length===0)return;let prop=eligible.includes("kind")?"kind":eligible.includes("type")?"type":[...eligible].sort()[0],valuesByBranch=prop===void 0?void 0:branchValuesFor(prop);if(prop===void 0||valuesByBranch===void 0)return;return{prop,valuesByBranch}}function joinSorted(values){return[...new Set(values)].sort().join(", ")}function rewriteErrorMessage(err,root){let additionalPropsMatch=/^Property "(.+)" does not match additional properties schema\.$/.exec(err.error);if(additionalPropsMatch){let name=additionalPropsMatch[1]??"",parentLoc=parentPointer(err.keywordLocation),parentSchema=parentLoc?schemaAtPointer(root,parentLoc):void 0,props=parentSchema&&typeof parentSchema==="object"&&!Array.isArray(parentSchema)?parentSchema.properties:void 0,allowed=(props&&typeof props==="object"&&!Array.isArray(props)?Object.keys(props):[]).sort().slice(0,20).join(", ");return`unknown property "${name}"${allowed?` (allowed: ${allowed})`:""}`}let requiredMatch=/^Instance does not have required property "(.+)"\.$/.exec(err.error);if(requiredMatch)return`missing required property "${requiredMatch[1]}"`;let enumMatch=/^Instance does not match any of (\[.*\])\.$/.exec(err.error);if(enumMatch)try{return`must be one of: ${JSON.parse(enumMatch[1]??"").map((v)=>String(v)).join(", ")}`}catch{}let typeMatch=/^Instance type "(.+)" is invalid\. Expected "(.+)"\.$/.exec(err.error);if(typeMatch)return`must be ${typeMatch[2]} (got ${typeMatch[1]})`;return err.error}var MAX_NARROWED_ERRORS=10;function narrowUnionErrors(errors,root,data){let dropped=new Set,synthetic=[],syntheticReplacedLocations=[];for(let err of errors){if(err.keyword!=="anyOf"&&err.keyword!=="oneOf")continue;let branches=schemaAtPointer(root,err.keywordLocation);if(!Array.isArray(branches))continue;let discriminator=unionDiscriminator(branches,root);if(!discriminator)continue;let under=errors.filter((e)=>e!==err&&e.keywordLocation.startsWith(`${err.keywordLocation}/`)&&(e.instanceLocation===err.instanceLocation||e.instanceLocation.startsWith(`${err.instanceLocation}/`))),validValues=discriminator.valuesByBranch.flat(),instance=instanceAtPointer(data,err.instanceLocation);if(typeof instance!=="object"||instance===null||Array.isArray(instance)){dropped.add(err);for(let e of under)dropped.add(e);syntheticReplacedLocations.push({instanceLocation:err.instanceLocation,keywordLocation:err.keywordLocation}),synthetic.push({instanceLocation:err.instanceLocation,message:`expected an object with "${discriminator.prop}" (one of: ${joinSorted(validValues)})`});continue}let propValue=instance[discriminator.prop];if(propValue===void 0){dropped.add(err);for(let e of under)dropped.add(e);syntheticReplacedLocations.push({instanceLocation:err.instanceLocation,keywordLocation:err.keywordLocation}),synthetic.push({instanceLocation:err.instanceLocation,message:`missing "${discriminator.prop}" (expected one of: ${joinSorted(validValues)})`});continue}let branchIndex=discriminator.valuesByBranch.findIndex((values)=>typeof propValue==="string"&&values.includes(propValue));if(branchIndex<0){dropped.add(err);for(let e of under)dropped.add(e);syntheticReplacedLocations.push({instanceLocation:err.instanceLocation,keywordLocation:err.keywordLocation}),synthetic.push({instanceLocation:`${err.instanceLocation}/${discriminator.prop}`,message:`unknown ${discriminator.prop} "${String(propValue)}" (expected one of: ${joinSorted(validValues)})`});continue}let keepPrefix=`${err.keywordLocation}/${branchIndex}`;dropped.add(err);for(let e of under){if(e.keywordLocation===keepPrefix||e.keywordLocation.startsWith(`${keepPrefix}/`))continue;dropped.add(e)}}let survivingAfterStage1=errors.filter((e)=>!dropped.has(e)),nestsUnder=(candidateInstance,wrapperInstance)=>candidateInstance===wrapperInstance||candidateInstance.startsWith(`${wrapperInstance}/`);for(let err of survivingAfterStage1){if(!WRAPPER_KEYWORDS.has(err.keyword))continue;let prefix=`${err.keywordLocation}/`,hasDeeper=survivingAfterStage1.some((other)=>other!==err&&!dropped.has(other)&&other.keywordLocation.startsWith(prefix)&&nestsUnder(other.instanceLocation,err.instanceLocation)),hasSyntheticDeeper=syntheticReplacedLocations.some((s)=>s.keywordLocation.startsWith(prefix)&&nestsUnder(s.instanceLocation,err.instanceLocation));if(hasDeeper||hasSyntheticDeeper)dropped.add(err)}let additionalPropsInstanceLocations=new Set(errors.filter((e)=>e.keyword==="additionalProperties").map((e)=>e.instanceLocation));for(let err of errors){if(dropped.has(err))continue;if(err.keyword==="additionalProperties"){let name=/^Property "(.+)" does not match additional properties schema\.$/.exec(err.error)?.[1],parentLoc=parentPointer(err.keywordLocation),parentSchema=parentLoc?schemaAtPointer(root,parentLoc):void 0,props=name!==void 0&&parentSchema&&typeof parentSchema==="object"&&!Array.isArray(parentSchema)?parentSchema.properties:void 0;if(name!==void 0&&props&&typeof props==="object"&&!Array.isArray(props)?Object.hasOwn(props,name):!1)dropped.add(err);continue}if(err.keyword==="false"){let parent=parentPointer(err.instanceLocation);if(parent!==void 0&&additionalPropsInstanceLocations.has(parent))dropped.add(err)}}let kept=errors.filter((e)=>!dropped.has(e)).map((e)=>`${formatInstancePath(e.instanceLocation)}: ${rewriteErrorMessage(e,root)}`),all=[...synthetic.map((s)=>`${formatInstancePath(s.instanceLocation)}: ${s.message}`),...kept];if(all.length<=MAX_NARROWED_ERRORS)return all;return[...all.slice(0,MAX_NARROWED_ERRORS),`…and ${all.length-MAX_NARROWED_ERRORS} more errors`]}function resolveSchemaDraft(schema){let $schema=schema.$schema;if(typeof $schema!=="string")return"7";let normalized=$schema.toLowerCase();if(normalized.includes("2020-12"))return"2020-12";if(normalized.includes("2019-09"))return"2019-09";if(normalized.includes("draft-04")||normalized.includes("draft/4"))return"4";if(normalized.includes("draft-07")||normalized.includes("draft/7"))return"7";return"7"}function attachRootCompanionSchemas(validator,root,active){if(active===root)return;let companion={};if(typeof root.definitions==="object"&&root.definitions!==null&&!Array.isArray(root.definitions)&&Object.keys(root.definitions).length>0)companion.definitions=root.definitions;if(typeof root.$defs==="object"&&root.$defs!==null&&!Array.isArray(root.$defs)&&Object.keys(root.$defs).length>0)companion.$defs=root.$defs;if(Object.keys(companion).length>0)validator.addSchema(companion)}function validatorForSchema(schema,root,partial){let active=partial?schemaWithoutRequired(schema):schema,validator=new Validator(active,resolveSchemaDraft(root),!1);return attachRootCompanionSchemas(validator,root,active),validator}function validateInstance(data,schema,root,partial,stripFrameworkKeys){let validator=validatorForSchema(schema,root,partial),payload=stripFrameworkKeys?dataForSchemaValidation(data):data,result=validator.validate(payload);if(result.valid)return{valid:!0,errors:[]};return{valid:!1,errors:narrowUnionErrors(result.errors,root,payload)}}function validateAgainstSchema(data,rootSchema,partial){return validateInstance(data,rootSchema,rootSchema,partial,!0)}function validateConfigDocument(data,rootSchema){return validateAgainstSchema(data,rootSchema,!1)}function validateConfigDocumentPartial(data,rootSchema){return validateAgainstSchema(data,rootSchema,!0)}function resolveSchema(schema,root){let ref=schema.$ref;if(typeof ref!=="string"||!ref.startsWith("#/"))return schema;let target=resolveJsonPointer(root,ref);if(typeof target==="object"&&target!==null&&!Array.isArray(target))return target;return schema}function normalizeTypes(type){if(typeof type==="string")return[type];if(Array.isArray(type))return type.filter((t)=>typeof t==="string");return[]}function validateParsedConfigValue(parsed,propertySchema,rootSchema){if(!propertySchema)return parsed;let result=validateInstance(parsed,propertySchema,rootSchema,!1,!1);if(!result.valid)throw Error(result.errors[0]??"Invalid config value");return parsed}function parseJsonLiteral(raw,propertySchema,rootSchema){let parsed;try{parsed=JSON.parse(raw)}catch{throw Error("Invalid JSON")}return validateParsedConfigValue(parsed,propertySchema,rootSchema)}function homogeneousPrimitiveArrayItems(arraySchema,rootSchema){let items=arraySchema.items;if(typeof items!=="object"||items===null||Array.isArray(items))return;let resolved=resolveSchema(items,rootSchema);if(!resolved)return;let types=normalizeTypes(resolved.type);if(types.length!==1)return;let kind=types[0];if(kind==="string"||kind==="integer"||kind==="number"||kind==="boolean"){let format2=typeof resolved.format==="string"?resolved.format:void 0;return{kind,format:format2}}return}function parseBooleanToken(raw){let lower=raw.trim().toLowerCase();if(lower==="true"||lower==="1")return!0;if(lower==="false"||lower==="0")return!1;throw Error("Expected boolean: true, false, 1, or 0")}function parsePrimitiveArraySegment(segment,items){switch(items.kind){case"string":{if(items.format==="date")return parseDate(segment);if(items.format==="date-time")return parseDateTime(segment);return segment}case"integer":{let n=Number(segment);if(Number.isNaN(n)||!Number.isInteger(n))throw Error(`Expected integer: ${segment}`);return n}case"number":{let n=Number(segment);if(Number.isNaN(n))throw Error(`Expected number: ${segment}`);return n}case"boolean":return parseBooleanToken(segment)}}function parseHomogeneousPrimitiveArray(raw,arraySchema,rootSchema){let items=homogeneousPrimitiveArrayItems(arraySchema,rootSchema);if(!items)throw Error("Use --json for object or array config values");let segments=parseCommaList(raw);if(segments.length===0)throw Error("Comma-separated list must contain at least one value");return segments.map((segment)=>parsePrimitiveArraySegment(segment,items))}function configValueInputHint(propertySchema,rootSchema){if(!propertySchema)return;let resolved=resolveSchema(propertySchema,rootSchema);if(!resolved)return;let types=normalizeTypes(resolved.type);if(types.includes("array")&&homogeneousPrimitiveArrayItems(resolved,rootSchema))return"comma-separated or JSON array";if(types.includes("array")||types.includes("object"))return"JSON";return}function parseConfigSetValue(raw,propertySchema,rootSchema,useJson){if(useJson)return parseJsonLiteral(raw,propertySchema,rootSchema);let trimmed=raw.trim();if(trimmed.startsWith("[")||trimmed.startsWith("{"))return parseJsonLiteral(trimmed,propertySchema,rootSchema);let resolved=propertySchema?resolveSchema(propertySchema,rootSchema):void 0,types=resolved?normalizeTypes(resolved.type):["string"];if(types.includes("boolean"))return parseBooleanToken(trimmed);if(types.includes("number")||types.includes("integer")){let n=Number(trimmed);if(Number.isNaN(n))throw Error("Expected number");if(types.includes("integer")&&!Number.isInteger(n))throw Error("Expected integer");return n}if(types.includes("array")){if(!resolved)throw Error("Use --json for object or array config values");let parsed=parseHomogeneousPrimitiveArray(trimmed,resolved,rootSchema);return validateParsedConfigValue(parsed,propertySchema,rootSchema)}if(types.includes("object"))throw Error("Use --json for object or array config values");return raw}function bootstrapAppConfig(program,opts){let fileData;if(opts.validateFile===!0)fileData=readAppConfigFile(program);else if(opts.validateFile==="soft")try{if(fileData=readAppConfigFile(program),opts.runtime)delete opts.runtime.state.configFileError}catch(err){let message=err instanceof Error?err.message:String(err);if(fileData=readAppConfigFileRaw(resolveAppConfigPath(program)),opts.runtime)opts.runtime.state.configFileError=message;opts.emitter?.emit({level:"warn",message,action:"config.invalid"})}else fileData=readAppConfigFileRaw(resolveAppConfigPath(program));let hostEnv=captureMappedHostEnv(program),resolved=resolveAppConfig(program,fileData,hostEnv);return exportConfigToEnv(program,resolved,hostEnv),{fileData,resolved}}function readSensitiveLine(){let stdin=process.stdin,canRaw=stdin.isTTY&&typeof stdin.setRawMode==="function",wasRaw=canRaw&&stdin.isRaw;if(canRaw)try{stdin.setRawMode(!0)}catch{}try{let result="",buf=Buffer.alloc(1);while(!0){if(readSync2(0,buf,{length:1})<=0)break;let byte=buf[0];if(byte===3)process.stderr.write(`
51
+ `),process.exit(130);if(byte===4)break;if(byte===10||byte===13)break;if(byte===127||byte===8){if(result.length>0)result=result.slice(0,-1),process.stderr.write("\b \b");continue}result+=String.fromCharCode(byte),process.stderr.write("*")}return process.stderr.write(`
52
+ `),result}finally{if(canRaw)try{stdin.setRawMode(!!wasRaw)}catch{}}}function readPromptLine2(mask){if(mask)return readSensitiveLine();return readPromptLine()}function resolvedFromEnv(entry,hostEnv){if(!entry.env)return!1;let val=hostEnv[entry.env];return val!==void 0&&val.length>0}function promptConfigKey(key,entry,current,configure,jsonSchemaRequired,hostEnv,jsonSchema){let baseTitle=entry.title??defaultConfigEntryTitle(key),titleWithEnv=entry.env?`${baseTitle} (${entry.env})`:baseTitle,heading=configEntryRequired(key,entry,jsonSchemaRequired)||!configure?titleWithEnv:`${titleWithEnv} (optional)`,propSchema=jsonSchema?configPropertySchema(jsonSchema,key):void 0,valueHint=jsonSchema?configValueInputHint(propSchema,jsonSchema):void 0,valueHintSuffix=valueHint?` (${valueHint})`:"";process.stderr.write(`${heading}
53
+ `),process.stderr.write(` ${entry.description}
54
+ `);let hasCurrent=current!==void 0&&current!==null&&String(current).length>0,sensitive=configEntrySensitive(key,entry);if(hasCurrent){process.stderr.write(` Current: ${sensitive?"REDACTED":stringifyConfigValue(current)}
55
+ `);let acceptPrompt=resolvedFromEnv(entry,hostEnv)?` Value (Enter to use env)${valueHintSuffix}: `:` Value (Enter to keep)${valueHintSuffix}: `;process.stderr.write(acceptPrompt)}else process.stderr.write(` Value${valueHintSuffix}: `);let input=readPromptLine2(sensitive);if(input.length===0&&hasCurrent)return{value:current,userTyped:!1};if(input.length>0)return{value:parseConfigSetValue(input,propSchema,jsonSchema??{type:"object",properties:{}},!1),userTyped:!0};return{value:void 0,userTyped:!1}}function writeConfigureSetupHeading(){process.stderr.write(`
56
+ Configuration Setup
57
+
58
+ `)}function shouldShowConfigureSetupHeading(program){if(!program.appConfig)return!1;return Object.keys(program.appConfig.entries).length>0}function isPresent3(value){if(value===void 0||value===null)return!1;if(typeof value==="string"&&value.length===0)return!1;return!0}function bindingsDiffer(a,b){return JSON.stringify(readBindings(a))!==JSON.stringify(readBindings(b))}function shouldWizardPromptConfigKey(key,fileData,entry,resolved,opts){if(readBindings(fileData)[key]==="env"&&!isPresent3(resolved[key]))return!0;if(opts.rePromptAll)return!0;return!isKeyAddressed(key,fileData,entry)}function promptMissingRequired(program){let appConfig=program.appConfig,updates={};if(!appConfig)return updates;let jsonSchema=effectiveJsonSchema(program),fromSchema=jsonSchema?jsonSchemaRequiredKeys(jsonSchema):void 0,hostEnv=captureMappedHostEnv(program),path=resolveAppConfigPath(program),fileData=readAppConfigFileRaw(path),resolved=resolveAppConfig(program,fileData,hostEnv),headingWritten=!1;for(let[key,entry]of Object.entries(appConfig.entries)){if(!configEntryRequired(key,entry,fromSchema))continue;if(readBindings(fileData)[key]==="env"&&!isPresent3(resolved[key]));else if(isKeyAddressed(key,fileData,entry)&&isPresent3(resolved[key]))continue;let current=resolved[key];if(!headingWritten)writeConfigureSetupHeading(),headingWritten=!0;let{value,userTyped}=promptConfigKey(key,entry,current,!1,fromSchema,hostEnv,jsonSchema);if(userTyped&&value!==void 0&&String(value).length>0)updates[key]=value,Object.assign(updates,setBinding(updates,key,"file"))}return updates}function runConfigure(program,opts={}){if(!program.appConfig)throw Error("configure requires program.appConfig on the program root.");if(!process.stdin.isTTY){let{resolved}=bootstrapAppConfig(program,{validateFile:!1}),missing=missingRequiredConfig(program,resolved);if(missing.length>0)process.stderr.write(`${formatMissingConfigMessage(program,missing)}
59
+ `);else process.stderr.write(`configure requires an interactive terminal.
60
+ `);process.exit(1)}let path=resolveAppConfigPath(program),existing=readAppConfigFileRaw(path),hostEnv=captureMappedHostEnv(program),jsonSchema=effectiveJsonSchema(program),fromSchema=jsonSchema?jsonSchemaRequiredKeys(jsonSchema):void 0,resolved=resolveAppConfig(program,existing,hostEnv),next={...existing},changed=!1;if(opts.showHeading!==!1&&shouldShowConfigureSetupHeading(program))writeConfigureSetupHeading();for(let[key,entry]of Object.entries(program.appConfig.entries)){if(!shouldWizardPromptConfigKey(key,existing,entry,resolved,opts))continue;let before=next[key],bindingsBefore=readBindings(next),current=resolved[key],required=configEntryRequired(key,entry,fromSchema),{value,userTyped}=promptConfigKey(key,entry,current,!0,fromSchema,hostEnv,jsonSchema);if(userTyped&&value!==void 0&&String(value).length>0){if(JSON.stringify(value)!==JSON.stringify(before)||bindingsBefore[key]!=="file")changed=!0;next=setBinding({...next,[key]:value},key,"file");continue}if(!userTyped&&isPresent3(current)&&resolvedFromEnv(entry,hostEnv)){if(!((key in existing)&&existing[key]!==void 0&&existing[key]!==null&&String(existing[key]).length>0)){let withBinding=setBinding(clearFileValue(next,key),key,"env");if(bindingsDiffer(next,withBinding)||key in next)changed=!0;next=withBinding}continue}if(!userTyped&&!required&&!isPresent3(current)&&inputWasSkipped(value,userTyped)){let withBinding=setBinding(next,key,"skip");if(bindingsDiffer(next,withBinding))changed=!0;next=withBinding}}if(changed){writeAppConfigFile(program,next,{partial:!0});let updated=resolveAppConfig(program,next,hostEnv);return exportConfigToEnv(program,updated,hostEnv),{path,changed:!0}}return{path,changed:!1}}function inputWasSkipped(value,userTyped){return!userTyped&&(value===void 0||String(value).length===0)}function appConfigStatus(program){if(!program.appConfig)return;let path=displayAppConfigPath(program),fileData={};try{fileData=readAppConfigFile(program)}catch{fileData=readAppConfigFileRaw(resolveAppConfigPath(program))}let hostEnv=captureMappedHostEnv(program),resolved=resolveAppConfig(program,fileData,hostEnv);exportConfigToEnv(program,resolved,hostEnv);let jsonSchema=effectiveJsonSchema(program),fromSchema=jsonSchema?jsonSchemaRequiredKeys(jsonSchema):void 0,required=Object.entries(program.appConfig.entries).filter(([key,entry])=>configEntryRequired(key,entry,fromSchema)).map(([key])=>{let set=resolved[key]!==void 0&&resolved[key]!==null&&String(resolved[key]).length>0;return{key,set,binding:bindingForKey(key,fileData,set)}});return{path,exists:appConfigFileExists(program),required}}function ensureAppConfig(program,opts){if(!program.appConfig)return;let fileData;try{fileData=readAppConfigFile(program)}catch(err){let msg=err instanceof Error?err.message:String(err);process.stderr.write(`${msg}
61
+ `),process.exit(1)}let hostEnv=captureMappedHostEnv(program),resolved=resolveAppConfig(program,fileData,hostEnv);if(exportConfigToEnv(program,resolved,hostEnv),opts.interactive&&process.stdin.isTTY){if(opts.configure)return runConfigure(program,{context:"standalone",rePromptAll:!0}),fileData=readAppConfigFileRaw(resolveAppConfigPath(program)),resolved=resolveAppConfig(program,fileData,hostEnv),exportConfigToEnv(program,resolved,hostEnv),{fileData,resolved};let updates=promptMissingRequired(program);if(Object.keys(updates).length>0){let merged={...fileData,...updates};writeAppConfigFile(program,merged,{partial:!0}),fileData=merged,resolved=resolveAppConfig(program,fileData,hostEnv),exportConfigToEnv(program,resolved,hostEnv)}}let missing=missingRequiredConfig(program,resolved);if(missing.length===0)return{fileData,resolved};if(opts.exitOnMissing)process.stderr.write(`${formatMissingConfigMessage(program,missing)}
62
+ `),process.exit(1);return{fileData,resolved}}function fullStringIsDouble(s){if(s.trim().length===0)return!1;let num=Number(s);if(Number.isNaN(num))return!1;return!Number.isNaN(parseFloat(s))&&Number.isFinite(num)}function strictParseDouble(s){if(!fullStringIsDouble(s))return null;let num=Number(s);return Number.isNaN(num)?null:num}var isInteractiveTty=!!process.stdin.isTTY;var helpShort="-h",helpLong="--help";function isHelpTok(tok){return tok===helpShort||tok===helpLong}function findChild(cmds,name){return cmds.find((c)=>c.key===name)}function isParamRouterKey2(key){return key.startsWith(":")}function findStaticChild(cmds,name){let ch=cmds.find((c)=>c.key===name);if(!ch||isParamRouterKey2(ch.key))return;return ch}function findParamChild(cmds){return cmds.find((c)=>isParamRouterKey2(c.key))}function findOptionByName(defs,name){return defs.find((o)=>o.name===name)}function findOptionDefByShort(defs,short){return defs.find((o)=>o.shortName===short)}function consumeOptions(defs,lenientUnknown,argv,i,opts){let idx=i;function consumeLong(tok){let body=tok.slice(2),optName,inlineVal,eqIdx=body.indexOf("=");if(eqIdx!==-1)optName=body.slice(0,eqIdx),inlineVal=body.slice(eqIdx+1);else optName=body,inlineVal=void 0;let def=findOptionByName(defs,optName);if(!def){if(lenientUnknown)return"";return`Unknown option: --${optName}`}if(inlineVal!==void 0){if(def.kind==="presence")opts[def.name]="1";else opts[def.name]=inlineVal;return idx+=1,null}if(def.kind==="presence")opts[def.name]="1";else{if(idx+=1,idx>=argv.length)return`Missing value for option: --${optName}`;opts[def.name]=argv[idx]}return idx+=1,null}function consumeShort(tok){if(tok.length<2)return`Unexpected option token: ${tok}`;let shorts=tok.slice(1),j=0;while(j<shorts.length){let shortChar=shorts[j],def=findOptionDefByShort(defs,shortChar);if(!def){if(lenientUnknown)return"";return`Unknown option: -${shortChar}`}if(def.kind==="presence"){opts[def.name]="1",j+=1;continue}if(j!==0||j+1<shorts.length)return`Short option -${shortChar} requires a value and cannot be bundled: ${tok}`;if(idx+=1,idx>=argv.length)return`Missing value for option: -${shortChar}`;return opts[def.name]=argv[idx],idx+=1,null}return idx+=1,null}while(idx<argv.length){let tok=argv[idx];if(isHelpTok(tok))break;if(!tok.startsWith("-"))break;if(tok==="--")return idx+=1,{report:{err:null,stoppedOnUnknown:!1,sawDoubleDash:!0},nextIndex:idx};if(tok.startsWith("--")){let err=consumeLong(tok);if(err==="")return{report:{err:null,stoppedOnUnknown:!0,sawDoubleDash:!1},nextIndex:idx};if(err)return{report:{err,stoppedOnUnknown:!1,sawDoubleDash:!1},nextIndex:idx}}else{let err=consumeShort(tok);if(err==="")return{report:{err:null,stoppedOnUnknown:!0,sawDoubleDash:!1},nextIndex:idx};if(err)return{report:{err,stoppedOnUnknown:!1,sawDoubleDash:!1},nextIndex:idx}}}return{report:{err:null,stoppedOnUnknown:!1,sawDoubleDash:!1},nextIndex:idx}}function resolveNodeAtPath(root,path){if(path.length===0)return root;let node=root;for(let seg of path){if(!isCliRouter(node))return;let ch=findChild(node.commands,seg);if(!ch)return;node=ch}return node}function collectPathOptionDefs(root,path){let defs=[...root.options??[]],node=root;for(let seg of path){if(!isCliRouter(node))break;let ch=findChild(node.commands,seg);if(!ch)break;defs.push(...ch.options??[]),node=ch}return defs}function collectOptionDefs(root,path){let node=resolveNodeAtPath(root,path);if(!node||!isCliLeaf(node))return[];return[...node.options??[]]}function finishJsonLeaf(node,startIdx,argv,path,opts,pathParams){let idx=startIdx,args=[];if(idx<argv.length){let tok=argv[idx];if(isHelpTok(tok))return helpResult(path,!0,pathParams);if(tok==="--")return errorResult("Unexpected extra arguments",path,[],pathParams);if(tok.startsWith("-")){let kindLabel=node.kind==="document"?"Document":"JSON";return errorResult(`${kindLabel} commands do not accept options: ${tok}`,path,[],pathParams)}args.push(tok),idx+=1}if(idx<argv.length)return errorResult("Unexpected extra arguments",path,[],pathParams);return{kind:"ok",path,opts,args,pathParams,helpExplicit:!1,helpPath:[],errorMsg:"",errorHelpPath:[]}}function finishLeaf(node,startIdx,argv,path,opts,optionDefs,forcePositionalsIn,pathParams){let idx=startIdx,args=[],forcePositionals=forcePositionalsIn;function consumePendingOptions(){while(!forcePositionals&&idx<argv.length){let tok=argv[idx];if(tok==="--"){forcePositionals=!0,idx+=1;break}if(isHelpTok(tok))return helpResult(path,!0,pathParams);if(tok.startsWith("-")){let rep=consumeOptions(optionDefs,!1,argv,idx,opts);if(rep.report.err)return errorResult(rep.report.err,path,[],pathParams);if(rep.report.sawDoubleDash)forcePositionals=!0;if(rep.nextIndex>idx){idx=rep.nextIndex;continue}return errorResult(`Unexpected option token: ${tok}`,path,[],pathParams)}break}return null}for(let p of node.positionals??[]){let{argMin=1,argMax=1}=p;if(argMax===1){let pendingErr=consumePendingOptions();if(pendingErr)return pendingErr;if(argMin>=1){if(idx>=argv.length)return errorResult(`Missing positional argument: ${p.name}`,path,[],pathParams);args.push(argv[idx]),idx+=1}else if(idx<argv.length)args.push(argv[idx]),idx+=1;continue}let count=0;if(argMax===0)while(idx<argv.length){let pendingErr=consumePendingOptions();if(pendingErr)return pendingErr;if(idx>=argv.length)break;args.push(argv[idx]),idx+=1,count+=1}else while(count<argMax&&idx<argv.length){let pendingErr=consumePendingOptions();if(pendingErr)return pendingErr;if(idx>=argv.length)break;args.push(argv[idx]),idx+=1,count+=1}if(count<argMin)return errorResult(`Expected at least ${argMin} argument(s) for ${p.name}, got ${count}`,path,[],pathParams)}let trailingErr=consumePendingOptions();if(trailingErr)return trailingErr;if(idx<argv.length)return errorResult("Unexpected extra arguments",path,[],pathParams);return{kind:"ok",path,opts,args,pathParams,helpExplicit:!1,helpPath:[],errorMsg:"",errorHelpPath:[]}}function errorResult(errorMsg,errorHelpPath=[],path=errorHelpPath,pathParams={}){return{kind:"error",path,opts:{},args:[],pathParams,helpExplicit:!1,helpPath:[],errorMsg,errorHelpPath}}function helpResult(p,explicit,pathParams={}){return{kind:"help",path:[],opts:{},args:[],pathParams,helpExplicit:explicit,helpPath:p,errorMsg:"",errorHelpPath:[]}}function descendChild(parent,tok,path,pathParams,cliEnabled){let staticChild=findStaticChild(parent.commands,tok);if(staticChild){if(!isCliCallable(staticChild,cliEnabled))return{ok:!1,error:errorResult(`Unknown subcommand: ${tok}`,path,[],pathParams)};return path.push(tok),{ok:!0,node:staticChild,cliEnabled:isCliCallable(staticChild,cliEnabled)}}let paramChild=findParamChild(parent.commands);if(paramChild&&isCliCallable(paramChild,cliEnabled)){let paramName=paramChild.key.slice(1);return path.push(paramChild.key),pathParams[paramName]=tok,{ok:!0,node:paramChild,cliEnabled:isCliCallable(paramChild,cliEnabled)}}return{ok:!1,error:errorResult(`Unknown subcommand: ${tok}`,path,[],pathParams)}}function parse(root,argv){let i=0,path=[],pathParams={},opts={},cliEnabled=!0,rootLenient=isCliRouter(root)&&root.fallbackCommand!==void 0&&((root.fallbackMode??"missingOnly")==="missingOrUnknown"||(root.fallbackMode??"missingOnly")==="unknownOnly"),rootRep=consumeOptions(root.options??[],rootLenient,argv,i,opts);if(rootRep.report.err)return errorResult(rootRep.report.err);i=rootRep.nextIndex;let forcePositionals=rootRep.report.sawDoubleDash;if(i<argv.length&&!forcePositionals&&isHelpTok(argv[i]))return helpResult([],!0);let cmdName,node;if(isCliLeaf(root)){if(isDocumentLeaf(root))return finishJsonLeaf(root,i,argv,path,opts,pathParams);return finishLeaf(root,i,argv,path,opts,root.options??[],forcePositionals,pathParams)}if(i>=argv.length)if(root.fallbackCommand!==void 0&&((root.fallbackMode??"missingOnly")==="missingOnly"||(root.fallbackMode??"missingOnly")==="missingOrUnknown")){if(cmdName=root.fallbackCommand,node=findChild(root.commands,cmdName),!node)return errorResult(`Unknown command: ${cmdName}`,path,[])}else return helpResult([],!1);else{let peek=argv[i],childPick=!forcePositionals?findStaticChild(root.commands,peek):void 0;if(childPick!==void 0){if(!isCliCallable(childPick,cliEnabled))return errorResult(`Unknown command: ${peek}`,path,[],pathParams);cmdName=peek,i+=1,node=childPick,cliEnabled=isCliCallable(childPick,cliEnabled)}else if(!forcePositionals&&isCliRouter(root)){let paramChild=findParamChild(root.commands);if(paramChild&&isCliCallable(paramChild,cliEnabled))cmdName=paramChild.key,pathParams[paramChild.key.slice(1)]=peek,i+=1,node=paramChild,cliEnabled=isCliCallable(paramChild,cliEnabled);else{let fallbackCommand=root.fallbackCommand;if(fallbackCommand!==void 0&&((root.fallbackMode??"missingOnly")==="missingOrUnknown"||(root.fallbackMode??"missingOnly")==="unknownOnly")){if(cmdName=fallbackCommand,node=findChild(root.commands,cmdName),!node)return errorResult(`Unknown command: ${cmdName}`,path,[],pathParams)}else return errorResult(`Unknown command: ${peek}`,path,[],pathParams)}}else{let fallbackCommand=root.fallbackCommand;if(fallbackCommand!==void 0&&((root.fallbackMode??"missingOnly")==="missingOrUnknown"||(root.fallbackMode??"missingOnly")==="unknownOnly")){if(cmdName=fallbackCommand,node=findChild(root.commands,cmdName),!node)return errorResult(`Unknown command: ${cmdName}`,path,[])}else{if(cmdName=peek,!forcePositionals)i+=1;if(node=findChild(root.commands,cmdName),!node)return errorResult(forcePositionals?`Expected subcommand but got positional: ${cmdName}`:`Unknown command: ${cmdName}`,path,[])}}}if(path.push(cmdName),!node)return errorResult(`Unknown command: ${cmdName}`,path);let current=node;while(!0){if(isCliLeaf(current)&&isDocumentLeaf(current))return finishJsonLeaf(current,i,argv,path,opts,pathParams);if(!forcePositionals){let orep=consumeOptions(current.options??[],!1,argv,i,opts);if(orep.report.err)return errorResult(orep.report.err,path);if(i=orep.nextIndex,orep.report.sawDoubleDash)forcePositionals=!0}if(i<argv.length&&!forcePositionals&&isHelpTok(argv[i]))return helpResult(path,!0,pathParams);if(i>=argv.length){if(isCliRouter(current)&&current.commands.length>0){let fb=current.fallbackCommand,fm=current.fallbackMode??"missingOnly";if(fb!==void 0&&(fm==="missingOnly"||fm==="missingOrUnknown")){let fbNode=findChild(current.commands,fb);if(fbNode){path.push(fb),current=fbNode,cliEnabled=isCliCallable(fbNode,cliEnabled);continue}}return helpResult(path,!1,pathParams)}if(!isCliLeaf(current))return helpResult(path,!1,pathParams);return finishLeaf(current,i,argv,path,opts,current.options??[],forcePositionals,pathParams)}let tok=argv[i];if(!forcePositionals&&tok.startsWith("-"))return errorResult(`Unexpected option token: ${tok}`,path,[],pathParams);if(!forcePositionals&&isCliRouter(current)){let descended=descendChild(current,tok,path,pathParams,cliEnabled);if(descended.ok){i+=1,current=descended.node,cliEnabled=descended.cliEnabled;continue}}if(isCliRouter(current)&&current.commands.length>0){let fb=current.fallbackCommand,fm=current.fallbackMode??"missingOnly";if(fb!==void 0&&(fm==="missingOrUnknown"||fm==="unknownOnly")&&fb!==void 0){let fbNode=findChild(current.commands,fb);if(fbNode){path.push(fb),current=fbNode,cliEnabled=isCliCallable(fbNode,cliEnabled);continue}}return errorResult(forcePositionals?`Expected subcommand but got positional: ${tok}`:`Unknown subcommand: ${tok}`,path,[],pathParams)}if(!isCliLeaf(current))return helpResult(path,!1,pathParams);return finishLeaf(current,i,argv,path,opts,current.options??[],forcePositionals,pathParams)}}function postParseValidate(root,pr){if(pr.kind!=="ok")return pr;let defs=collectPathOptionDefs(root,pr.path),opts={...pr.opts};for(let d of defs)if(d.default!==void 0&&!(d.name in opts))opts[d.name]=d.default;for(let d of defs)if(d.required&&!(d.name in opts)){if(d.kind==="json")continue;return errorResult(`Missing required option: --${d.name}`,pr.path)}for(let[k,v]of Object.entries(opts)){let d=findOptionByName(defs,k);if(!d)return errorResult(`Unknown option key: ${k}`,pr.path);if(d.kind==="json"){try{JSON.parse(v)}catch{return errorResult(`Invalid JSON for option --${k}`,pr.path)}continue}if(d.kind==="number"){if(!fullStringIsDouble(v))return errorResult(`Invalid number for option --${k}: ${v}`,pr.path)}if(d.kind==="enum"){let choices=d.choices??[];if(!choices.includes(v))return errorResult(`Option --${k}: '${v}' is not one of: ${choices.join(", ")}`,pr.path)}if(d.kind==="string"&&(d.format!==void 0||d.pattern!==void 0))try{validateFormatValue(v,d.format,d.pattern)}catch(err){let msg=d.format!==void 0?formatValidationError(d.format,v):err instanceof Error?err.message:String(err);return errorResult(`Invalid value for option --${k}: ${msg}`,pr.path)}}return{...pr,opts}}class LeafInputError extends Error{constructor(message){super(message);this.name="LeafInputError"}}var DOCUMENT_LEAF_BODY_KEY="__documentLeafBody",JSON_LEAF_BODY_KEY=DOCUMENT_LEAF_BODY_KEY;function resolveLeaf(program,commandPath){let node=program;for(let seg of commandPath){if(!isCliRouter(node))return;let child=node.commands.find((c)=>c.key===seg);if(!child)return;node=child}return isCliLeaf(node)?node:void 0}function leafNode(ctx){return resolveLeaf(ctx.program,ctx.commandPath)}function parseJsonText(raw,label){let trimmed=raw.trim();if(trimmed.length===0)throw new LeafInputError(`${label}: JSON value is empty`);try{return JSON.parse(trimmed)}catch{throw new LeafInputError(`${label}: invalid JSON`)}}function parseDocumentText(raw,label){let trimmed=raw.trim();if(trimmed.length===0)throw new LeafInputError(`${label}: value is empty`);if(trimmed.startsWith("{")||trimmed.startsWith("["))try{return JSON.parse(trimmed)}catch{}try{return Bun.YAML.parse(trimmed)}catch{throw new LeafInputError(`${label}: invalid JSON or YAML`)}}async function readPipedJsonStdin(){let trimmed=(await new Response(Bun.stdin).text()).trim();if(trimmed.length===0)throw new LeafInputError("stdin is empty; pass JSON via the option flag or pipe a JSON document to stdin");try{return JSON.parse(trimmed)}catch{throw new LeafInputError("stdin is not valid JSON")}}function jsonLeafBodyHelp(kind="json"){if(kind==="document")return"Missing document input: pass a JSON or YAML document as an argument or pipe to stdin";return"Missing JSON input: pass a JSON document as an argument or pipe to stdin"}async function readPipedJsonStdinForJsonLeaf(kind="json"){let trimmed=(await new Response(Bun.stdin).text()).trim();if(trimmed.length===0)throw new LeafInputError(jsonLeafBodyHelp(kind));if(trimmed.startsWith("{")||trimmed.startsWith("["))try{return JSON.parse(trimmed)}catch{}try{return Bun.YAML.parse(trimmed)}catch{throw new LeafInputError("stdin is not valid JSON or YAML")}}function pipableJsonHelp(opt){return`Missing required option --${opt.name}: pass JSON via --${opt.name} '<json>' or pipe a JSON document to stdin`}function omitUndefinedInputs(out){let stripped={};for(let[key,value]of Object.entries(out))if(value!==void 0)stripped[key]=value;return stripped}function validateAgainstInputSchema(out,inputSchema){let result=validateConfigDocument(omitUndefinedInputs(out),inputSchema);if(!result.valid)throw new LeafInputError(result.errors.join("; "))}function readJsonOptionValue(ctx,name){let flagValue=ctx.stringOpt(name);if(flagValue!==void 0)return parseJsonText(flagValue,`--${name}`);if(name in ctx.preloadedJson)return ctx.preloadedJson[name];if(ctx.toolArgs!==void 0&&name in ctx.toolArgs)return ctx.toolArgs[name];return}async function preloadPipableJson(program,commandPath,opts,invocation,args=[]){if(invocation!=="cli"||isInteractiveTty)return{};let leaf=resolveLeaf(program,commandPath);if(leaf&&isDocumentLeaf(leaf)&&args.length===0)return{[JSON_LEAF_BODY_KEY]:await readPipedJsonStdinForJsonLeaf(leaf.kind)};for(let opt of collectOptionDefs(program,commandPath))if(opt.kind==="json"&&opt.pipable&&!(opt.name in opts))return{[opt.name]:await readPipedJsonStdin()};return{}}function readSyncOptionValue(ctx,opt){if(opt.kind==="presence")return ctx.hasFlag(opt.name);if(opt.kind==="number"){let n=ctx.numberOpt(opt.name);return n===null?void 0:n}if(opt.kind==="json")return readJsonOptionValue(ctx,opt.name);if(opt.format!==void 0){if(opt.format==="duration")return ctx.durationOpt(opt.name);if(opt.format==="comma-list")return ctx.commaListOpt(opt.name);if(opt.format==="date")return ctx.dateOpt(opt.name);if(opt.format==="date-time")return ctx.dateTimeOpt(opt.name)}return ctx.stringOpt(opt.name)}function loadLeafInputs(ctx){let leaf=leafNode(ctx);if(!leaf)return{};if(isDocumentLeaf(leaf)){let body;if(ctx.toolArgs!==void 0)body=ctx.toolArgs;else if(ctx.args.length>0){let[arg0]=ctx.args;if(arg0===void 0)throw new LeafInputError(jsonLeafBodyHelp(leaf.kind));let label=leaf.kind==="document"?"Document argument":"JSON argument";body=parseDocumentText(arg0,label)}else if(JSON_LEAF_BODY_KEY in ctx.preloadedJson)body=ctx.preloadedJson[JSON_LEAF_BODY_KEY];else throw new LeafInputError(jsonLeafBodyHelp(leaf.kind));if(typeof body!=="object"||body===null||Array.isArray(body)){if(leaf.kind==="document")throw new LeafInputError("Document input must be a JSON or YAML object");throw new LeafInputError("JSON input must be a JSON object")}let out=body;if(leaf.inputSchema!==void 0)validateAgainstInputSchema(out,leaf.inputSchema);return omitUndefinedInputs(out)}let out={},options=collectOptionDefs(ctx.program,ctx.commandPath);for(let opt of options)out[opt.name]=readSyncOptionValue(ctx,opt);for(let p of leaf.positionals??[]){let val=ctx.positional(p.name);if(val===void 0)out[p.name]=void 0;else if(Array.isArray(val))out[p.name]=val;else out[p.name]=val}for(let[name,value]of Object.entries(ctx.pathParams))if(out[name]===void 0)out[name]=value;if(ctx.toolArgs!==void 0){for(let[key,value]of Object.entries(ctx.toolArgs))if(out[key]===void 0)out[key]=value}for(let opt of options)if(opt.required&&out[opt.name]===void 0){if(opt.kind==="json"&&opt.pipable&&ctx.invocation==="cli"&&isInteractiveTty)throw new LeafInputError(pipableJsonHelp(opt));throw new LeafInputError(`Missing required option: --${opt.name}`)}if(leaf.inputSchema!==void 0)validateAgainstInputSchema(out,leaf.inputSchema);return omitUndefinedInputs(out)}function stripAnsi(text){let ansiEscape=new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`,"g");return text.replace(ansiEscape,"")}function firstErrorLine(text){return stripAnsi(text).split(`
63
+ `).map((part)=>part.trim()).find((part)=>part.length>0)??stripAnsi(text).trim()}var API_CORS_HEADERS={"access-control-allow-origin":"*","access-control-allow-methods":"GET, POST, PUT, PATCH, DELETE, OPTIONS","access-control-allow-headers":"Content-Type, Authorization","access-control-max-age":"86400"};function apiOptionsResponse(){return new Response(null,{status:204,headers:{...API_CORS_HEADERS}})}function resolveRespondContentType(response,leafApiResponse){return response.contentType??leafApiResponse?.contentType??(typeof response.body==="string"?"text/plain; charset=utf-8":"application/json; charset=utf-8")}function apiSuccessResponse(response,leafApiResponse,defaultStatus){let contentType=resolveRespondContentType(response,leafApiResponse),headers={...API_CORS_HEADERS,"content-type":contentType,...response.headers??{}};if(leafApiResponse?.contentDisposition&&!headers["content-disposition"])headers["content-disposition"]=leafApiResponse.contentDisposition;let status=response.status??defaultStatus??200,{body}=response;if(status===204)return new Response(null,{status:204,headers});if(body instanceof Uint8Array)return new Response(body.buffer.slice(body.byteOffset,body.byteOffset+body.byteLength),{status,headers});if(typeof body==="string")return new Response(body,{status,headers});return new Response(JSON.stringify(body),{status,headers})}function apiErrorResponse(status,body){return new Response(JSON.stringify(body),{status,headers:{...API_CORS_HEADERS,"content-type":"application/json; charset=utf-8"}})}function apiDocsHtml(){return`<!doctype html>
64
+ <html lang="en">
65
+ <head>
66
+ <meta charset="utf-8" />
67
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
68
+ <title>API Reference</title>
69
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css" />
70
+ </head>
71
+ <body>
72
+ <div id="swagger-ui"></div>
73
+ <script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js" crossorigin></script>
74
+ <script>
75
+ SwaggerUIBundle({
76
+ url: "/openapi.json",
77
+ dom_id: "#swagger-ui",
78
+ });
79
+ </script>
80
+ </body>
81
+ </html>`}import{appendFileSync,mkdirSync}from"node:fs";import{dirname}from"node:path";var PROTECTED_ECS_KEYS=new Set(["@timestamp","log.level","message","ecs.version","service.name","service.version"]);function errorFields(error){if(error instanceof Error)return{"error.message":error.message,"error.type":error.name,...error.stack?{"error.stack_trace":error.stack}:{}};return{"error.message":String(error)}}function buildEnrichContext(service,event){return{level:event.level,message:event.message,action:event.action,requestId:event.requestId,traceId:event.traceId,spanId:event.spanId,labels:event.labels,error:event.error,service,http:event.http}}function mergeEnrichFields(line,enrich){if(!enrich)return;for(let[key,value]of Object.entries(enrich)){if(PROTECTED_ECS_KEYS.has(key)||key in line)continue;line[key]=value}}function formatEcsLine(serviceOrOpts,event){let opts=event!==void 0?{service:serviceOrOpts,event}:serviceOrOpts,{service,event:ev}=opts,line={"@timestamp":new Date().toISOString(),"log.level":ev.level,message:ev.message,"ecs.version":"8.11.0","service.name":service.name,"service.version":service.version};if(ev.action)line["event.action"]=ev.action;if(ev.traceId)line["trace.id"]=ev.traceId;if(ev.spanId)line["span.id"]=ev.spanId;if(ev.labels&&Object.keys(ev.labels).length>0)line.labels={...ev.labels};if(ev.fields)Object.assign(line,ev.fields);if(ev.error!==void 0)Object.assign(line,errorFields(ev.error));return mergeEnrichFields(line,opts.enrich?.(buildEnrichContext(service,ev))),JSON.stringify(line)}function durationMsToEcsNanos(durationMs){return durationMs*1e6}var OBSCURE_CLIENT_MESSAGE="An unexpected error occurred.";function obscureUnexpectedClientMessage(){return OBSCURE_CLIENT_MESSAGE}class LogEmitter{service;resolved;constructor(opts){this.service={name:opts.program.key,version:opts.program.version},this.resolved=opts.resolved}get config(){return this.resolved}emit(event){let line=this.formatLine(event);process.stderr.write(`${line}
82
+ `),this.appendFile(line)}emitLifecycle(message,action,labels){if(this.resolved.format==="text"){process.stderr.write(`${message}
83
+ `),this.appendFile(message);return}this.emit({level:"info",message,action,labels})}emitAccess(fields){if(!this.resolved.access)return;if(this.resolved.format==="text"){let rid=fields.requestId?` ${fields.requestId}`:"",line=`${fields.method} ${fields.path} ${fields.status} ${fields.durationMs}ms${rid}`;process.stderr.write(`${line}
84
+ `),this.appendFile(line);return}let isHttp=fields.method!=="MCP",action=isHttp?"http.access":"mcp.access",httpFields=isHttp?{"http.request.method":fields.method,"url.path":fields.path,"http.response.status_code":fields.status,"event.duration":durationMsToEcsNanos(fields.durationMs)}:{"event.duration":durationMsToEcsNanos(fields.durationMs)};if(fields.clientIp&&fields.clientIp!=="unknown")httpFields["client.ip"]=fields.clientIp;this.emit({level:"info",message:`${fields.method} ${fields.path}`,action,requestId:fields.requestId,traceId:fields.traceId,spanId:fields.spanId,fields:httpFields,labels:{...fields.requestId?{request_id:fields.requestId}:{},...isHttp?{}:{rpc_method:fields.path}},http:{method:fields.method,path:fields.path,status:fields.status,durationMs:fields.durationMs,clientIp:fields.clientIp}})}emitInvokeError(failureKind,error,clientMessage,meta){if(!this.resolved.errors)return;if(this.emit({level:failureKind==="unexpected"?"error":"warn",message:clientMessage,action:"invoke.error",labels:{failure_kind:failureKind,...meta?.labels},requestId:meta?.requestId,traceId:meta?.traceId,spanId:meta?.spanId,error}),this.resolved.dev&&error instanceof Error&&error.stack)process.stderr.write(`${error.stack}
85
+ `),this.appendFile(error.stack)}formatLine(event){if(this.resolved.format==="text")return this.formatTextLine(event);let enrichCtx=this.buildEnrichContext(event);if(this.resolved.serialize)return this.resolved.serialize(enrichCtx);return formatEcsLine({service:this.service,event,enrich:this.resolved.enrich})}buildEnrichContext(event){return{level:event.level,message:event.message,action:event.action,requestId:event.requestId,traceId:event.traceId,spanId:event.spanId,labels:event.labels,error:event.error,service:this.service,http:event.http}}formatTextLine(event){let level=event.level.toUpperCase(),action=event.action?` [${event.action}]`:"",line=`${level}${action}: ${event.message}`;if(event.error instanceof Error&&event.error.stack)line=`${line}
86
+ ${event.error.stack}`;return line}appendFile(line){let file=this.resolved.file;if(!file)return;try{mkdirSync(dirname(file),{recursive:!0}),appendFileSync(file,`${line}
87
+ `,"utf8")}catch{}}}async function runHook(hook,label){if(!hook)return;try{return await Promise.resolve(hook())}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`${label} hook failed: ${message}`,{cause:err})}}function classifyFailureKind(err,opts){if(opts.help)return"help";if(opts.missingConfig)return"missing_config";if(opts.notReady)return"not_ready";if(opts.parseError||err instanceof LeafInputError)return"validation";if(err instanceof Error)return"validation";return"unexpected"}function failureKindHttpStatus(kind){switch(kind){case"validation":case"help":return 400;case"unknown_route":return 404;case"missing_config":case"not_ready":return 503;case"unexpected":return 500}}function buildInvokeHookContext(ctx,extras){return{invocation:ctx.invocation,path:extras.path,pathParams:{...ctx.pathParams},opts:ctx.opts,locals:ctx.locals,runtime:extras.runtime,appConfig:ctx.appConfig,http:extras.http,mcp:extras.mcp}}function defaultClientError(err,_failureKind){return{message:err instanceof Error?err.message:typeof err==="string"?err:firstErrorLine(String(err))||"Error",exitCode:1}}async function runErrorPipeline(hookCtx,err,failureKind,hooks,emitter,obscureUnexpected){let clientError=defaultClientError(err,failureKind);if(failureKind==="unexpected"&&obscureUnexpected)clientError={message:obscureUnexpectedClientMessage(),exitCode:1};let errorCtx={...hookCtx,failureKind,error:err,clientError:{...clientError}},formatted=await runHook(()=>hooks?.formatError?.(errorCtx),"formatError");if(formatted)clientError={...clientError,...formatted},errorCtx.clientError={...clientError};await runHook(()=>hooks?.onError?.(errorCtx),"onError");let displayMessage=failureKind==="unexpected"&&obscureUnexpected?obscureUnexpectedClientMessage():clientError.message;return emitter?.emitInvokeError(failureKind,err,displayMessage,{labels:{invocation:hookCtx.invocation,path:hookCtx.path.join(" ")},requestId:hookCtx.locals.requestId,traceId:hookCtx.http?.traceId,spanId:hookCtx.http?.spanId}),{failureKind,clientError,errorMsg:displayMessage}}function normalizeRespondOptions(opts){if(opts.contentType!==void 0)return opts;let body=opts.body;if(body instanceof Uint8Array)throw Error("ctx.respond() with Uint8Array body requires an explicit contentType");if(typeof body==="string")return{...opts,contentType:"text/plain; charset=utf-8"};return{...opts,contentType:"application/json; charset=utf-8"}}function writeRespondBodyToStdout(body){if(body instanceof Uint8Array){process.stdout.write(body);return}if(typeof body==="string"){if(process.stdout.write(body),!body.endsWith(`
88
+ `))process.stdout.write(`
89
+ `);return}process.stdout.write(`${JSON.stringify(body,null,2)}
90
+ `)}function encodeRespondBodyBase64(body){if(typeof Buffer<"u")return Buffer.from(body).toString("base64");let binary="";for(let byte of body)binary+=String.fromCharCode(byte);return btoa(binary)}function buildToolCallSuccessFromResponse(response){let{body,contentType="application/json; charset=utf-8"}=response,structuredContent,text="";if(body instanceof Uint8Array)structuredContent={data:encodeRespondBodyBase64(body),contentType,encoding:"base64"},text=`[Binary data: ${contentType}, ${body.length} bytes]`;else if(typeof body==="string")structuredContent={content:body,contentType},text=body;else structuredContent=body,text=typeof body==="object"&&body!==null?JSON.stringify(body,null,2):String(body??"");return{content:[{type:"text",text}],structuredContent,isError:!1}}function lookupHeadlessTool(program,toolName){let tool=collectMcpTools(program).find((t)=>t.name===toolName);if(!tool)return{ok:!1,kind:"unknown",message:`Unknown tool: ${toolName}`};let{resolved}=bootstrapAppConfig(program,{validateFile:!1}),missingConfig=missingRequiredConfig(program,resolved);if(missingConfig.length>0)return{ok:!1,kind:"missing_config",message:formatMcpMissingConfigMessage(program,missingConfig)};return{ok:!0,tool}}function invokeFailure(result){let message=result.errorMsg??(result.stderr.trim()||`Exit code ${result.exitCode}`);return{ok:!1,kind:result.kind==="help"?"help":"invoke",message,exitCode:result.exitCode,stdout:result.stdout,stderr:result.stderr,failureKind:result.failureKind,invokeResult:result}}function noResponseFailure(result){return{ok:!1,kind:"invoke",message:"Handler did not call ctx.respond() or return a value",exitCode:1,stdout:result.stdout,stderr:result.stderr,failureKind:"unexpected",invokeResult:result}}function argvFailure(message){return{ok:!1,kind:"argv",message,exitCode:1,stdout:"",stderr:"",failureKind:"validation"}}function unwrapToolArgs(args){let inner=args[MCP_INPUT_WRAPPER_KEY];if(!Object.keys(args).every((key)=>key===MCP_INPUT_WRAPPER_KEY)||typeof inner!=="object"||inner===null||Array.isArray(inner))return;return inner}async function executeHeadlessToolCall(cli,tool,args,invocation,mcp){let leafArgs=tool.inputWrapped?unwrapToolArgs(args):args;if(leafArgs===void 0)return argvFailure(`Tool arguments must be an object with a single "${MCP_INPUT_WRAPPER_KEY}" object property (see inputSchema)`);let argvResult=mcpToolCallToArgv(cli.program,tool,leafArgs);if("error"in argvResult)return argvFailure(argvResult.error);let invokeResult=await cli.invoke(argvResult,{invocation,toolArgs:leafArgs,mcp});if(invokeResult.kind==="help")return invokeFailure(invokeResult);if(invokeResult.kind==="ok"&&invokeResult.exitCode===0&&invokeResult.response){let mcpResult=buildToolCallSuccessFromResponse(invokeResult.response);return{ok:!0,response:invokeResult.response,mcpResult:tool.outputWrapped?{...mcpResult,structuredContent:{[MCP_OUTPUT_WRAPPER_KEY]:mcpResult.structuredContent}}:mcpResult}}if(invokeResult.kind==="ok"&&invokeResult.exitCode===0)return noResponseFailure(invokeResult);return invokeFailure(invokeResult)}async function executeHttpRouteCall(cli,route,pathParams,query,body,http){let argvResult=httpRequestToArgv(cli.program,route,pathParams,query,body);if("error"in argvResult)return argvFailure(argvResult.error);let toolArgs={...body,...query,...pathParams},invokeResult=await cli.invoke(argvResult,{invocation:"http",toolArgs,http});if(invokeResult.kind==="help")return invokeFailure(invokeResult);if(invokeResult.kind==="ok"&&invokeResult.exitCode===0&&invokeResult.response){let mcpResult=buildToolCallSuccessFromResponse(invokeResult.response);return{ok:!0,response:invokeResult.response,mcpResult}}if(invokeResult.kind==="ok"&&invokeResult.exitCode===0)return noResponseFailure(invokeResult);return invokeFailure(invokeResult)}function headlessSuccessToHttpResponse(result,leafApiResponse,defaultStatus){return apiSuccessResponse(result.response,leafApiResponse,defaultStatus)}function headlessFailureToHttpResponse(result,obscureUnexpected=!1){let status=resolveHttpErrorStatus(result);return apiErrorResponse(status,{error:formatHeadlessError(result,obscureUnexpected)})}function resolveHttpErrorStatus(result){if(result.failureKind)return failureKindHttpStatus(result.failureKind);if(result.kind==="argv"||result.kind==="help")return 400;if(result.kind==="invoke"&&result.message.includes("ctx.respond()"))return 500;if(result.exitCode===1)return 400;return 500}function headlessFailureMcpMessage(result,obscureUnexpected=!1){return formatHeadlessError(result,obscureUnexpected)}function formatHeadlessError(result,obscureUnexpected){if(obscureUnexpected&&result.failureKind==="unexpected")return obscureUnexpectedClientMessage();return stripAnsi(result.message).trim()}import{randomBytes}from"node:crypto";var TRACEPARENT_RE=/^[\da-f]{2}-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})$/i;function randomSpanId(){return randomBytes(8).toString("hex")}function parseTraceparent(header){let match=header.trim().match(TRACEPARENT_RE);if(!match)return;let[,traceId,spanId,flags]=match;if(!traceId||!spanId||!flags)return;let flagByte=Number.parseInt(flags,16);return{traceId:traceId.toLowerCase(),spanId:spanId.toLowerCase(),sampled:(flagByte&1)===1}}function extractTraceContext(request){let parsed=parseTraceparent(request.headers.get("traceparent")??"");if(!parsed)return;return{traceId:parsed.traceId,parentSpanId:parsed.spanId,spanId:randomSpanId(),sampled:parsed.sampled}}function formatTraceparent(ctx){let flags=ctx.sampled===!1?"00":"01";return`00-${ctx.traceId}-${ctx.spanId}-${flags}`}var READINESS_CACHE_MS=3000;function configFileCheck(runtime){let err=runtime.state.configFileError;if(typeof err==="string"&&err.length>0)return{ok:!1,error:err};return{ok:!0}}function configRequiredCheck(program,appConfig){if(!program.appConfig)return{ok:!0};let missing=missingRequiredConfig(program,appConfig.read());if(missing.length>0)return{ok:!1,missing};return{ok:!0}}async function customReadinessCheck(ctx){let fn=ctx.program.readiness;if(!fn)return{ok:!0};try{return await Promise.resolve(fn(ctx))?{ok:!0}:{ok:!1,error:"readiness check returned false"}}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function evaluateReadiness(program,surface,runtime,appConfig){let cached=runtime.state.readinessCache;if(cached&&Date.now()-cached.at<READINESS_CACHE_MS)return cached.result;let ctx={program,surface,appConfig,runtime},checks={config_file:configFileCheck(runtime),config_required:configRequiredCheck(program,appConfig),custom:await customReadinessCheck(ctx)},result={ok:Object.values(checks).every((c)=>c.ok),checks};return runtime.state.readinessCache={at:Date.now(),result},runtime.state.readiness=result,result}var DEFAULT_HOST="127.0.0.1",DEFAULT_PORT=3000;function resolveHttpListenAddress(program){let config=program.httpServer;return{hostname:config?.host??DEFAULT_HOST,port:config?.port??DEFAULT_PORT}}function resolveClientIp(request,trustProxy){if(trustProxy){let xff=request.headers.get("x-forwarded-for");if(xff)return xff.split(",")[0]?.trim()??"unknown"}return"unknown"}function jsonResponse(status,body){return new Response(JSON.stringify(body),{status,headers:{...API_CORS_HEADERS,"content-type":"application/json; charset=utf-8"}})}function parseQuery(url){let out={};for(let[k,v]of url.searchParams.entries())out[k]=v;return out}async function handleApiRequest(cli,request,resolved){let httpConfig=resolved??cli.server?.http,trustProxy=httpConfig?.trustProxy??cli.program.httpServer?.trustProxy??!1,requestId=randomUUID(),url=new URL(request.url),clientIp=resolveClientIp(request,trustProxy),trace=extractTraceContext(request),wireCtx={request,requestId,clientIp,path:url.pathname,method:request.method,...trace?{traceId:trace.traceId,spanId:trace.spanId}:{}},hooks=cli.server?.httpHooks??cli.program.httpServer?.hooks,emitter=cli.server?.emitter,started=performance.now(),finish=async(response,failureKind,error)=>{let durationMs=Math.round(performance.now()-started);if(failureKind&&error!==void 0)await hooks?.onError?.({...wireCtx,failureKind,error});else await hooks?.onResponse?.({...wireCtx,status:response.status,durationMs});if(emitter?.emitAccess({method:request.method,path:url.pathname,status:response.status,durationMs,requestId,clientIp,traceId:trace?.traceId,spanId:trace?.spanId}),!trace)return response;let headers=new Headers(response.headers);return headers.set("traceparent",formatTraceparent({traceId:trace.traceId,spanId:trace.spanId,sampled:trace.sampled})),new Response(response.body,{status:response.status,statusText:response.statusText,headers})};if(await hooks?.onRequest?.(wireCtx),request.method==="OPTIONS")return finish(apiOptionsResponse());let root=cli.program,path=url.pathname;if(request.method==="GET"&&path==="/health/liveness")return finish(jsonResponse(200,{ok:!0}));if(request.method==="GET"&&path==="/health/readiness"){let runtime=cli.server?.runtime;if(!runtime)return finish(jsonResponse(200,{ok:!0}));let readiness=await evaluateReadiness(root,"http",runtime,cli.appConfig);return finish(jsonResponse(readiness.ok?200:503,readiness))}if(request.method==="GET"&&path==="/openapi.json")return finish(jsonResponse(200,generateOpenApi(root)));if(request.method==="GET"&&path==="/swagger")return finish(new Response(apiDocsHtml(),{status:200,headers:{...API_CORS_HEADERS,"content-type":"text/html; charset=utf-8"}}));if(path.startsWith("/tools"))return finish(apiErrorResponse(404,{error:"Not found"}));let match=matchHttpRoute(root,request.method,path);if(match.ok){let body={};if(request.method==="POST"||request.method==="PUT"||request.method==="PATCH"){let rawBody=await request.text();if(rawBody.trim().length>0)try{let parsed=JSON.parse(rawBody);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))return finish(apiErrorResponse(400,{error:"Request body must be a JSON object"}));body=parsed}catch{try{let parsed=Bun.YAML.parse(rawBody);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))return finish(apiErrorResponse(400,{error:"Request body must be a JSON object"}));body=parsed}catch{return finish(apiErrorResponse(400,{error:"Invalid JSON body"}))}}}let query=parseQuery(url),result=await executeHttpRouteCall(cli,match.route,match.pathParams,query,body,{request,clientIp,requestId,...trace?{traceId:trace.traceId,spanId:trace.spanId}:{}});if(result.ok){let leafHttp=leafHttpResponseDefaults(match.route.leaf),hasBody=result.response.body!==void 0,methodDefault=match.route.leaf.http?.successStatus??defaultSuccessStatus(match.route.method,hasBody&&match.route.method!=="DELETE");return finish(headlessSuccessToHttpResponse(result,leafHttp,methodDefault))}let obscure=httpConfig?.obscureUnexpected??!1;return finish(headlessFailureToHttpResponse(result,obscure),result.invokeResult?.failureKind,result.message)}return finish(apiErrorResponse(404,{error:"Not found"}))}async function httpServeHttp(cli,resolved){let listen=resolved??{hostname:resolveHttpListenAddress(cli.program).hostname,port:resolveHttpListenAddress(cli.program).port,trustProxy:cli.program.httpServer?.trustProxy??!1,obscureUnexpected:cli.program.httpServer?.errors?.obscureUnexpected??!1,log:{format:"json",access:!0,errors:!0,dev:!1}},server=Bun.serve({hostname:listen.hostname,port:listen.port,fetch:(request)=>handleApiRequest(cli,request,listen)}),url=`http://${server.hostname}:${server.port}`,emitter=cli.server?.emitter;if(emitter&&listen.log.format==="text")emitter.emitLifecycle(`${cli.program.key} ${cli.program.version} — HTTP API listening on ${url}`,"http.server.start");else if(emitter?.emit({level:"info",message:`HTTP API listening on ${url}`,action:"http.server.start",labels:{url}}),!emitter)process.stderr.write(`HTTP API listening on ${url}
91
+ `);throw await new Promise(()=>{}),Error("HTTP API server stopped unexpectedly")}function formatRouteLine(root,route){let cliPath=route.commandPath.join(" "),line=`- \`${route.method} ${route.openApiPath}\` (CLI: \`${root.key} ${cliPath}\`) — ${route.leaf.description}`,flags=leafWireOptions(route.leaf).filter((o)=>o.kind==="presence").map((o)=>`--${o.name}`);if(flags.length>0)line+=` (flags: ${flags.join(", ")})`;return line}function generateHttpGuide(root){if(!root.httpServer)throw Error("HTTP API server not enabled");let routes=collectHttpRoutes(root),{hostname,port}=resolveHttpListenAddress(root),baseUrl=`http://${hostname}:${port}`,pathPrefix=resolveHttpPathPrefix(root),userGlob=httpUserPathGlob(pathPrefix),sampleWorkspaces=`${pathPrefix}/workspaces`,lines=[`# HTTP API (${root.key})`,"",`${root.key} exposes user commands over HTTP REST routes derived from the CLI tree.`,"","## Running","","```bash",`${root.key} http`,"```","",`Listens on **${baseUrl}** by default (\`httpServer.host\` / \`httpServer.port\`).`,"","Bind is localhost-only by default — use a reverse proxy for remote access.","","## Endpoints","","| Method | Path | Purpose |","| --- | --- | --- |","| `GET` | `/health/liveness` | Liveness — server is online and accepting requests |","| `GET` | `/health/readiness` | Readiness — online plus config and `program.readiness` checks passed |","| `GET` | `/openapi.json` | OpenAPI 3.1 REST paths |","| `GET` | `/swagger` | Interactive Swagger UI API reference |",`| * | \`${userGlob}\` | Invoke user commands (method per route) |`,"| `OPTIONS` | `*` | CORS preflight |","",`Discover paths from \`openapi.json\` (\`${userGlob}\`). Query binds options; POST/PUT/PATCH body binds options and \`inputSchema\` fields.`,"","## Examples","","```bash",`curl -s ${baseUrl}/health/liveness`,`curl -s ${baseUrl}/health/readiness`,`curl -s ${baseUrl}/openapi.json`,`curl -s ${baseUrl}${sampleWorkspaces}`,`curl -s -X POST ${baseUrl}${sampleWorkspaces} \\`,' -H "content-type: application/json" \\',` -d '{"name":"qa2"}'`,"```","","## Responses","","Success: status from handler → `http.successStatus` → method default (GET 200, POST 201, DELETE 204).","","Handlers must use `ctx.respond()` or return a value for API/MCP tool calls.","",'Errors use `{ "error": "..." }` with `400`, `404`, `503`, or `500`.',"","## Logging","","Server logs go to **stderr** (one JSON object per line by default).","","- Configure with `program.log` on the program root","- **`enrich`** — add custom JSON fields on top of the default line","- **`serialize`** — replace the formatter and emit your own line shape","","See the argsbarg [logging guide](https://github.com/bdombro/bun-argsbarg/blob/main/docs/logging.md) for examples and the full `LogEnrichContext` shape.",""];if(root.appConfig?.entries&&Object.keys(root.appConfig.entries).length>0){lines.push("## Configuration",""),lines.push(`Configure before first use: \`${root.key} configure\`.`,"",`Default config file: \`${displayAppConfigPath(root)}\`.`,"");for(let[key,entry]of Object.entries(root.appConfig.entries)){let label=entry.title??defaultConfigEntryTitle(key),req=entry.required===!1?"optional":"required",envNote=entry.env?` → env \`${entry.env}\``:"";lines.push(`- **${label}** (\`${key}\`, ${req}${envNote}) — ${entry.description}`)}lines.push("")}if(lines.push("## REST routes",""),routes.length===0)lines.push("(No routes exposed.)","");else{for(let route of routes)lines.push(formatRouteLine(root,route));lines.push("")}return lines.push("## Request bodies","","POST/PUT/PATCH bodies are a flat JSON object keyed by long option and positional names (hyphenated option names are valid keys).","","For HTTP clients, use **`GET /openapi.json`** (or **`GET /swagger`**) for per-route request shapes.","","Varargs positionals accept a JSON array of strings (not a comma-separated string).","Options with `format: comma-list` accept a comma-separated string or JSON array.","Options with a schema `default` are applied when omitted.","",`Shell invocation reference: \`${root.key} docs cli\`. Full CLI tree JSON: \`${root.key} docs cli-schema\`.`,"","## OpenAPI","","The HTTP API is described in OpenAPI 3.1.","",`- **Browse** — [${baseUrl}/swagger](${baseUrl}/swagger) (Swagger UI; loads \`/openapi.json\`)`,`- **Fetch** — \`curl -s ${baseUrl}/openapi.json\``,`- **Save offline** — \`${root.key} docs openapi --save\` → \`./docs/openapi.json\` (or \`just docgen\` in app repos)`,"",`Use the spec to discover REST paths and request/response shapes before calling \`${userGlob}\`.`,""),lines.join(`
92
+ `)}import{existsSync as existsSync2,mkdirSync as mkdirSync2,readFileSync,writeFileSync}from"node:fs";import{dirname as dirname2}from"node:path";import{existsSync}from"node:fs";import{userInfo}from"node:os";import{join}from"node:path";function userHome(){let user=process.env.USER??process.env.LOGNAME;return[process.env.TEST_USER_HOME,user&&`/Users/${user}`,user&&`/home/${user}`,process.env.USERPROFILE].find((p)=>p&&existsSync(p))??userInfo().homedir}function displayHomePath(absolutePath,home=userHome()){if(home.length>0&&absolutePath.startsWith(home))return`~${absolutePath.slice(home.length)}`;return absolutePath}function xdgConfigHome(home=userHome()){return process.env.XDG_CONFIG_HOME??join(home,".config")}function appConfigLibHome(home=userHome()){return join(home,".local","lib")}function expectedMcpEntry(root){return{command:root.key,args:["mcp"]}}function entriesEqual(a,b){return a.command===b.command&&JSON.stringify(a.args)===JSON.stringify(b.args)}function readMcpServerEntry(path,name){if(!existsSync2(path))return;try{return JSON.parse(readFileSync(path,"utf8")).mcpServers?.[name]}catch{return}}function installMcpServerEntry(path,name,entry){let existing=readMcpServerEntry(path,name);if(existing){if(entriesEqual(existing,entry))return"skipped-match";return process.stderr.write(`MCP server "${name}" in ${displayHomePath(path)} differs; leaving existing entry unchanged.
93
+ `),"skipped-conflict"}return mergeMcpConfig(path,name,entry,!1),"installed"}function mergeMcpConfig(path,name,entry,dry){if(dry)return;let data={};if(existsSync2(path))data=JSON.parse(readFileSync(path,"utf8"));let servers=data.mcpServers??{};servers[name]=entry,data.mcpServers=servers,mkdirSync2(dirname2(path),{recursive:!0}),writeFileSync(path,`${JSON.stringify(data,null,2)}
94
+ `,"utf8")}function removeMcpConfig(path,name,dry){if(dry||!existsSync2(path))return[];let data=JSON.parse(readFileSync(path,"utf8"));if(!data.mcpServers?.[name])return[];return delete data.mcpServers[name],writeFileSync(path,`${JSON.stringify(data,null,2)}
95
+ `,"utf8"),[path]}import{dirname as dirname3,join as join2}from"node:path";function skillDirName(programKey){return programKey.replace(/[/\\\s]/g,"_")}function displayInstallPath(path){return displayHomePath(path)}function resolveClaudeDesktopMcpPath(home){if(process.platform==="darwin")return join2(home,"Library","Application Support","Claude","claude_desktop_config.json");if(process.platform==="win32"){let appData=process.env.APPDATA??join2(home,"AppData","Roaming");return join2(appData,"Claude","claude_desktop_config.json")}return join2(xdgConfigHome(home),"Claude","claude_desktop_config.json")}function resolveInstallPaths(root){let home=userHome(),dirName=skillDirName(root.key);return{agentsSkillDir:join2(home,".agents","skills",dirName),agentsMcpPath:join2(home,".agents","mcp.json"),mcpName:mcpServerId(root),skillDirName:dirName}}function defaultDocsTopicResourceUri(mcpId,topicKey){return`${mcpId}://docs/${topicKey}`}function mcpIdFromProgram(program){return program.key.replace(/[^a-zA-Z0-9]/g,"_")}function resolveDocsTopicResourceUri(program,topicKey){return defaultDocsTopicResourceUri(mcpIdFromProgram(program),topicKey)}function docsMcpResources(program){if(!docsEnabled(program)||program.mcpServer?.enabled!==!0)return[];let docs=resolveDocsConfig(program),topics=docs.topics??{};return docsUserTopicKeys(docs).map((key)=>{let topic=topics[key];if(!topic)throw Error(`docs topic missing: ${key}`);return{uri:resolveDocsTopicResourceUri(program,key),name:key,description:docsTopicDescription(key,topic.description),mimeType:"text/markdown",load:()=>{let text=docsTopicText(program,key);return text.endsWith(`
96
+ `)?text:`${text}
97
+ `}}})}function reservedDocsTopicResourceUris(program){if(!docsEnabled(program)||program.mcpServer?.enabled!==!0)return[];let docs=resolveDocsConfig(program);return docsUserTopicKeys(docs).map((key)=>resolveDocsTopicResourceUri(program,key))}function appendManualClientSetup(lines,_root,serverId,entry){let home=userHome(),claudeDesktopPath=resolveClaudeDesktopMcpPath(home),mcpServersJson=JSON.stringify({mcpServers:{[serverId]:entry}},null,2);lines.push("### Manual client setup","","Many clients do not read `~/.agents/mcp.json` yet. Copy the `mcpServers` entry from that file, or paste:","","```json",mcpServersJson,"```","","| Client | Config file |","| --- | --- |","| **Cursor** | `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project) |","| **Claude Code** | `~/.claude.json` under `mcpServers`, or project `.mcp.json` |","| **Claude Desktop** | See platform paths below |","","Restart Cursor or reload MCP after editing. Restart Claude Desktop after config changes.","","Claude Desktop config paths:","","- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`","- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`","- **Linux:** `~/.config/Claude/claude_desktop_config.json`","",`On this machine (macOS/Linux): \`${claudeDesktopPath}\``,"")}function formatToolLine(root,tool){let line=`- \`${tool.path.length>0?`${root.key} ${tool.path.join(" ")}`:root.key}\` — ${tool.description}`,flags=leafWireOptions(tool.leaf).filter((o)=>o.kind==="presence").map((o)=>`--${o.name}`);if(flags.length>0)line+=` (flags: ${flags.join(", ")})`;return line}function generateMcpGuide(root){let tools=collectMcpTools(root),schemaUri=resolveMcpSchemaUri(root),serverId=mcpServerId(root),mcp=root.mcpServer;if(!mcp)throw Error("MCP server not enabled");let caps=resolveCapabilities(root),entry=expectedMcpEntry(root),lines=[`# MCP server (${root.key})`,"",`${root.key} exposes an MCP server with features similar to the CLI.`,"","## Installation","","### `.agents` auto-install","","When `mcpServer.enabled` is set, `configure install` merges this server into `~/.agents/mcp.json` per the https://dotagentsprotocol.com.",""];if(caps.configure)lines.push(`Install the CLI first so \`${root.key}\` is on your PATH (e.g. \`brew install ${root.key}\`).`,"");else lines.push(`The CLI binary \`${root.key}\` must already be on your PATH.`,"");if(lines.push("```bash",`${root.key} configure install`,"```","","Writes or updates `~/.agents/mcp.json` with a `mcpServers` entry for this app.",""),appendManualClientSetup(lines,root,serverId,entry),lines.push("### Manual `mcpServers` entry","","Same shape as in `~/.agents/mcp.json`:","","```json",JSON.stringify({mcpServers:{[serverId]:entry}},null,2),"```","","## Running directly","","Start the stdio MCP server without editing host config:","","```bash",`${root.key} mcp`,"```",""),lines.push("## Environment","","- **`shellEnv`** — on by default; captures login-shell environment at MCP startup (PATH, toolchain shims, exports). Opt out with `shellEnv: false`.",""),root.appConfig?.entries&&Object.keys(root.appConfig.entries).length>0){lines.push("## Configuration",""),lines.push(`Configure before first use in Cursor or Claude Desktop (MCP hosts are non-interactive): \`${root.key} configure\`.`,"",`Default config file: \`${displayAppConfigPath(root)}\` (flat JSON keys).`,"");for(let[key,entryConfig]of Object.entries(root.appConfig.entries)){let label=entryConfig.title??defaultConfigEntryTitle(key),req=entryConfig.required===!1?"optional":"required",envNote=entryConfig.env?` → env \`${entryConfig.env}\``:"";lines.push(`- **${label}** (\`${key}\`, ${req}${envNote}) — ${entryConfig.description}`)}lines.push("","Example:","","```typescript","config: {"," schema: {",' apiToken: { description: "…", env: "API_TOKEN", sensitive: true },'," },","},","```","")}if(lines.push("## What agents get","","| Mechanism | Purpose |","|-----------|---------|","| `tools/list` | Callable tools for exposed leaf commands |","| `tools/call` | Runs handlers headlessly; JSON stdout becomes `structuredContent` when valid |",`| Schema resource | \`${schemaUri}\` — same JSON as \`${root.key} docs cli-schema\` |`),mcp.instructions)lines.push(`| \`initialize.instructions\` | ${mcp.instructions} |`);if(docsEnabled(root)){let docs=resolveDocsConfig(root);for(let key of docsUserTopicKeys(docs)){let uri=resolveDocsTopicResourceUri(root,key);lines.push(`| Docs topic \`${key}\` | \`${uri}\` — same markdown as \`${root.key} docs ${key}\` |`)}}if(lines.push("","## Exposed tools",""),tools.length===0)lines.push("(No MCP tools exposed.)","");else{for(let tool of tools)lines.push(formatToolLine(root,tool));lines.push("")}let sizeReport=mcpSizeReport(root);if(sizeReport.tools.length>0){let limits={...DEFAULT_MCP_SIZE_LIMITS,...root.mcpServer?.sizeLimits};lines.push("## Tool sizes","","Clients read tool definitions with their own limits — a definition or description past those is truncated "+`or read incompletely. Default limits here: description ${limits.descriptionChars===!1?"unchecked":`${limits.descriptionChars.toLocaleString()} chars`}, definition ${limits.definitionBytes===!1?"unchecked":`${limits.definitionBytes.toLocaleString()} bytes`} / ${limits.definitionLines===!1?"unchecked":`${limits.definitionLines.toLocaleString()} lines`} (override with \`mcpServer.sizeLimits\`).`,"","| Tool | Description (chars) | Definition (bytes) | Definition (lines) | Status |","| --- | --- | --- | --- | --- |");for(let t of sizeReport.tools){let over=[];if(limits.descriptionChars!==!1&&t.descriptionChars>limits.descriptionChars)over.push("description");if(limits.definitionBytes!==!1&&t.definitionBytes>limits.definitionBytes||limits.definitionLines!==!1&&t.definitionLines>limits.definitionLines)over.push("definition");let status=over.length===0?"ok":`over: ${over.join(", ")}`;lines.push(`| \`${t.name}\` | ${t.descriptionChars.toLocaleString()} | ${t.definitionBytes.toLocaleString()} | ${t.definitionLines.toLocaleString()} | ${status} |`)}lines.push("")}return lines.push("## Tool arguments","","Arguments are a flat JSON object keyed by long option and positional names (hyphenated option names are valid keys).",`See \`${root.key} docs cli-schema\` or the schema resource for per-tool shapes.`,"","Varargs positionals accept a JSON array of strings (not a comma-separated string).","Options with `format: comma-list` accept a comma-separated string or JSON array.","Options with a schema `default` are applied when omitted.","","## Protocol","","Stdio NDJSON JSON-RPC. Help and `docs cli-schema` are not available through tool calls.",`Run \`${root.key} docs\` for bundled user documentation.`,""),lines.join(`
98
+ `)}var DOCS_BUILTIN_TOPIC_KEYS=["http","mcp","all","cli-schema","cli","openapi"],DOCS_ROUTER_DESCRIPTION="Print bundled CLI documentation.";function docsEnabled(program){return program.docs?.enabled!==!1}function resolveDocsConfig(program){return{description:program.docs?.description,topics:program.docs?.topics??{}}}function docsUserTopicKeys(docs){return Object.keys(docs.topics??{})}function docsIncludesMcpTopic(program){return docsEnabled(program)&&program.mcpServer?.enabled===!0}function docsIncludesHttpTopic(program){return docsEnabled(program)&&program.httpServer?.enabled===!0}function docsIncludesOpenApiTopic(program){return docsIncludesHttpTopic(program)}function docsTopicDescription(key,custom){if(custom)return custom;if(key==="readme")return"Print README (user guide).";return`Print ${key.replace(/[-_]+/g," ").replace(/\b\w/g,(c)=>c.toUpperCase())} documentation.`}function docsTopicText(program,topic){if(!docsEnabled(program))throw Error("docs not enabled");if(topic==="mcp"){if(!docsIncludesMcpTopic(program))throw Error("Unknown docs topic 'mcp'.");return generateMcpGuide(program)}if(topic==="http"){if(!docsIncludesHttpTopic(program))throw Error("Unknown docs topic 'http'.");return generateHttpGuide(program)}let entry=(program.docs?.topics??{})[topic];if(!entry)throw Error(`Unknown docs topic '${topic}'.`);return entry.text}function docsTopicContent(program,topic){if(topic==="cli-schema")return cliSchemaJson(program);if(topic==="openapi"){if(!docsIncludesOpenApiTopic(program))throw Error("Unknown docs topic 'openapi'.");return openApiJson(program)}if(topic==="cli")return generateCliGuide(program);let text=docsTopicText(program,topic);return text.endsWith(`
99
+ `)?text:`${text}
100
+ `}function printDocsTopic(program,topic){process.stdout.write(docsTopicContent(program,topic))}import{mkdirSync as mkdirSync3,writeFileSync as writeFileSync2}from"node:fs";import{dirname as dirname4,join as join3}from"node:path";var MARKDOWN_FRONTMATTER_RE=/^---\r?\n[\s\S]*?\r?\n---\r?\n/;function generatedFileHtmlComment(source){return`<!-- Generated by ${source}; do not edit. -->
101
+
102
+ `}function insertGeneratedHint(content,hint,options){if(options?.afterFrontmatter){let match=content.match(MARKDOWN_FRONTMATTER_RE);if(match)return`${match[0]}${hint}${content.slice(match[0].length)}`}return`${hint}${content}`}function skillBundleHint(program){return generatedFileHtmlComment(`${program.key} mcp bundle`)}function applyPluginSkillHint(program,skillMd){return insertGeneratedHint(skillMd,skillBundleHint(program),{afterFrontmatter:!0})}var DOCS_SAVE_DIR="docs",DOCS_GENERATED_SAVE_TOPICS=["mcp","cli","http"];function docsTopicIsGeneratedByArgsbarg(topic){return DOCS_GENERATED_SAVE_TOPICS.includes(topic)}function docsSaveGeneratedHint(program,topic){return generatedFileHtmlComment(`${program.key} docs ${topic} --save`)}function applySaveGeneratedHint(program,topic,content){if(!docsTopicIsGeneratedByArgsbarg(topic))return content;let hint=docsSaveGeneratedHint(program,topic);return insertGeneratedHint(content,hint)}function docsTopicContentForSave(program,topic){return applySaveGeneratedHint(program,topic,docsTopicContent(program,topic))}function docsSaveFilename(topic){if(topic==="cli-schema")return"cli-schema.json";if(topic==="openapi")return"openapi.json";return`${topic}.md`}function docsSaveRelativePath(topic,_program){return join3(DOCS_SAVE_DIR,docsSaveFilename(topic))}function saveDocsTopic(program,topic){let rel=docsSaveRelativePath(topic,program),abs=join3(process.cwd(),rel);return mkdirSync3(dirname4(abs),{recursive:!0}),writeFileSync2(abs,docsTopicContentForSave(program,topic),"utf8"),rel}var DOCS_SAVE_OPTION={name:"save",description:"Write documentation to ./docs/.",kind:"presence"};function runDocsTopic(program,topic,ctx){if(ctx.hasFlag("save")){process.stdout.write(`${saveDocsTopic(program,topic)}
103
+ `);return}printDocsTopic(program,topic)}function docsLeaf(program,key,description){return{key,description,options:[DOCS_SAVE_OPTION],mcpTool:{enabled:!1},handler:(ctx)=>{runDocsTopic(program,key,ctx)}}}function docsRouterNotes(){return"Topics print to stdout. Add --save to write files under ./docs/."}function cliBuiltinDocsGroup(program){let docs=resolveDocsConfig(program),topics=docs.topics??{},leaves=[];for(let key of docsUserTopicKeys(docs)){let topic=topics[key];if(!topic)throw Error(`docs topic missing: ${key}`);leaves.push(docsLeaf(program,key,docsTopicDescription(key,topic.description)))}if(docsIncludesMcpTopic(program))leaves.push(docsLeaf(program,"mcp","Print MCP server setup and tool guidance."));if(docsIncludesHttpTopic(program))leaves.push(docsLeaf(program,"http","Print HTTP API setup and tool guidance."));if(docsIncludesOpenApiTopic(program))leaves.push(docsLeaf(program,"openapi","Print the HTTP OpenAPI 3.1 document as JSON."));return leaves.push(docsLeaf(program,"cli-schema","Print the full CLI command tree as JSON."),docsLeaf(program,"cli","Print the full command reference as markdown.")),{key:"docs",description:docs.description??DOCS_ROUTER_DESCRIPTION,notes:docsRouterNotes(),options:[DOCS_SAVE_OPTION],commands:leaves}}function cliBuiltinDocsGroupIfEnabled(program){if(!docsEnabled(program))return null;return cliBuiltinDocsGroup(program)}function cliBuiltinCompletionGroup(program){let appName=program.key,router={key:"completion",cli:{hidden:!0},description:"Generate the autocompletion script for shells.",commands:[{key:"bash",description:"Print a bash tab-completion script.",notes:`Homebrew installs completions during \`brew install\` via generate_completions_from_executable.
104
+
105
+ Ensure your shell loads Homebrew completions:
106
+ https://docs.brew.sh/Shell-Completion
107
+
108
+ Try this session only:
109
+
110
+ source <(${appName} completion bash)`,handler:()=>{}},{key:"zsh",description:"Print a zsh tab-completion script.",notes:`Homebrew installs completions to $(brew --prefix)/share/zsh/site-functions.
111
+
112
+ Ensure brew shellenv + compinit are configured:
113
+ https://docs.brew.sh/Shell-Completion
114
+
115
+ Try this session only:
116
+
117
+ eval "$(${appName} completion zsh)"`,handler:()=>{}},{key:"fish",description:"Print a fish tab-completion script.",notes:`Homebrew installs completions to $(brew --prefix)/share/fish/vendor_completions.d.
118
+
119
+ See: https://docs.brew.sh/Shell-Completion
120
+
121
+ Try this session only:
122
+
123
+ ${appName} completion fish | source`,handler:()=>{}}]};return router.notes=`Completions are installed by Homebrew during formula install.
124
+
125
+ See: https://docs.brew.sh/Shell-Completion`,router}class InstallTarget{defaultIncludedInAll(){return!1}applyDetected(_paths,_root,_out){}detectedForSnapshot(detected){return this.isDetectedFromSnapshot(detected)}statusLine(paths,root,detected){if(!this.isDetectedFromInstalled(detected))return;return this.formatStatusLine(paths,root)}isDetectedFromInstalled(detected){return this.isDetectedFromSnapshot(detected)}planInstall(ctx){if(!ctx.include(this.key))return[];return this.buildInstallActions(ctx)}planUninstall(ctx){if(!ctx.include(this.key))return[];if(!this.isDetectedFromSnapshot(ctx.detected))return[];return this.buildUninstallActions(ctx)}contributeStatus(paths,root,detected,status){let line=this.statusLine(paths,root,detected);if(!line)return;this.assignStatusLine(status,line)}}function mcpConfigHasServer(path,name){return readMcpServerEntry(path,name)!==void 0}class McpJsonInstallTarget extends InstallTarget{key;actionKind;category="mcp";spec;constructor(spec){super();this.spec=spec,this.key=spec.key,this.actionKind=spec.actionKind}isAvailable(root,paths){return this.spec.isAvailable(root,paths)}isDetected(paths,_root){return mcpConfigHasServer(this.spec.configPath(paths),paths.mcpName)}applyDetected(paths,root,out){out[this.spec.detectedKey]=this.isDetected(paths,root)}isDetectedFromSnapshot(detected){return detected[this.spec.detectedKey]}formatStatusLine(paths,_root){let path=displayInstallPath(this.spec.configPath(paths));if(this.spec.statusIncludesServer)return`${path} (server "${paths.mcpName}")`;return path}assignStatusLine(status,line){status[this.spec.statusField]=line}preflight(_ctx){return null}buildInstallActions(ctx){let configPath=this.spec.configPath(ctx.paths),entry=expectedMcpEntry(ctx.root),displayPath=displayInstallPath(configPath);return[{kind:this.actionKind,summary:`${this.spec.label}: ${displayPath}`,message:`Merging MCP server "${ctx.paths.mcpName}" into ${displayPath}`,run:()=>{let result=installMcpServerEntry(configPath,ctx.paths.mcpName,entry);if(result==="installed")process.stdout.write(`Registered MCP server in ${displayPath}
126
+ `);return result==="installed"?[configPath]:[]}}]}buildUninstallActions(ctx){let configPath=this.spec.configPath(ctx.paths),displayPath=displayInstallPath(configPath);return[{kind:this.actionKind,summary:`${this.spec.label}: ${displayPath}`,message:`Removing MCP server "${ctx.paths.mcpName}" from ${displayPath}`,run:()=>{let changed=removeMcpConfig(configPath,ctx.paths.mcpName,ctx.dry);if(changed.length>0&&!ctx.dry)process.stdout.write(`Removed MCP server from ${displayPath}
127
+ `);return changed}}]}}var agentsMcpTarget=new McpJsonInstallTarget({key:"agentsMcp",actionKind:"agents-mcp",label:"agents mcp",configPath:(p)=>p.agentsMcpPath,detectedKey:"agentsMcp",statusField:"agentsMcp",isAvailable:(root)=>root.mcpServer?.enabled===!0});import{accessSync,constants,realpathSync}from"node:fs";import{delimiter,join as join4}from"node:path";function resolvePathCommand(key){let pathEnv=process.env.PATH??"";for(let dir of pathEnv.split(delimiter)){if(!dir)continue;let candidate=join4(dir,key);try{return accessSync(candidate,constants.F_OK),realpathSync(candidate)}catch{}}let found=Bun.which(key);if(found===null)return;try{return realpathSync(found)}catch{return found}}function realpathOrSelf(path){try{return realpathSync(path)}catch{return path}}function isExternallyManagedBinary(key,execPath=process.execPath){let resolved=resolvePathCommand(key);if(!resolved)return!1;return resolved===realpathOrSelf(execPath)}class AppInstallTarget extends InstallTarget{key="app";actionKind="app";category="core";defaultIncludedInAll(){return!1}isAvailable(_root,_paths){return!0}isDetected(_paths,root){return isExternallyManagedBinary(root.key)||!1}applyDetected(_paths,root,out){out.app=isExternallyManagedBinary(root.key)}isDetectedFromSnapshot(detected){return detected.app}formatStatusLine(_paths,root){if(isExternallyManagedBinary(root.key))return"system (PATH)";return"not installed (use Homebrew)"}assignStatusLine(status,line){status.app=line}buildInstallActions(_ctx){return[]}buildUninstallActions(_ctx){return[]}}var appTarget=new AppInstallTarget;class ConfigureInstallTarget extends InstallTarget{key="configure";actionKind="configure";category="core";isAvailable(_root,_paths){return!0}isDetected(_paths,root){return appConfigInstalled(root)}applyDetected(_paths,_root,_out){}isDetectedFromSnapshot(detected){return detected.appConfig??!1}formatStatusLine(_paths,root){return displayAppConfigPath(root)}assignStatusLine(_status,_line){}buildInstallActions(_ctx){return[]}buildUninstallActions(ctx){return[{kind:"configure",summary:`app config: ${displayAppConfigPath(ctx.root)}`,message:`Removing app config ${displayAppConfigPath(ctx.root)}`,run:()=>uninstallAppConfig(ctx.root,ctx.dry)}]}}var configureTarget=new ConfigureInstallTarget;import{existsSync as existsSync5}from"node:fs";import{existsSync as existsSync4}from"node:fs";import{existsSync as existsSync3,rmSync}from"node:fs";function buildUninstallPlan(root,paths,opts){return buildUninstallPlanFromTargets(root,paths,opts)}function uninstallSkillDir(dir,dry){if(!existsSync3(dir))return[];if(!dry)rmSync(dir,{recursive:!0,force:!0}),process.stdout.write(`Removed skill from ${displayHomePath(dir)}/
128
+ `);return[`${dir}/`]}class SkillInstallTarget extends InstallTarget{key;actionKind;category="skill";uninstallPrefix;spec;constructor(spec){super();this.spec=spec,this.key=spec.key,this.actionKind=spec.actionKind,this.uninstallPrefix=spec.uninstallPrefix}isAvailable(root,paths){return this.spec.isAvailable(root,paths)}isDetected(paths,_root){return existsSync4(this.spec.skillDir(paths))}applyDetected(paths,root,out){out[this.spec.detectedKey]=this.isDetected(paths,root)}isDetectedFromSnapshot(detected){return detected[this.spec.detectedKey]}formatStatusLine(paths,_root){return`${displayInstallPath(this.spec.skillDir(paths))}/`}assignStatusLine(status,line){status[this.spec.statusField]=line}skillDir(paths){return this.spec.skillDir(paths)}buildInstallActions(_ctx){return[]}buildUninstallActions(ctx){let dir=this.spec.skillDir(ctx.paths);return[{kind:this.actionKind,summary:`${this.uninstallPrefix}: ${displayInstallPath(dir)}/`,message:`Removing ${this.spec.label.toLowerCase()} ${displayInstallPath(dir)}/`,run:()=>uninstallSkillDir(dir,ctx.dry)}]}}var skillTarget=new SkillInstallTarget({key:"skill",actionKind:"agent-skill",label:"Agent skill",uninstallPrefix:"agent skill",skillDir:(p)=>p.agentsSkillDir,detectedKey:"skill",statusField:"skill",isAvailable:(_root,p)=>existsSync5(p.agentsSkillDir)});var INSTALL_TARGETS=[appTarget,skillTarget,agentsMcpTarget,configureTarget];var INSTALL_ARTIFACT_KEYS=INSTALL_TARGETS.map((t)=>t.key),SKILL_KEYS=INSTALL_TARGETS.filter((t)=>t.category==="skill").map((t)=>t.key),MCP_KEYS=INSTALL_TARGETS.filter((t)=>t.category==="mcp").map((t)=>t.key),ACTION_KIND_TO_ARTIFACT=Object.fromEntries(INSTALL_TARGETS.map((t)=>[t.actionKind,t.key])),targetByKey=new Map(INSTALL_TARGETS.map((t)=>[t.key,t]));function installTargetForKey(key){return targetByKey.get(key)}function isMcpArtifactKey(key){return installTargetForKey(key)?.category==="mcp"}function mcpServerRequiredForArtifact(key,mcpServerEnabled){return!isMcpArtifactKey(key)||mcpServerEnabled}function resolveInstallTargetSpec(spec,defaults){if(spec===void 0)return{...defaults};if(typeof spec==="boolean")return{enabled:spec,includedInAll:spec?defaults.includedInAll:!1};return{enabled:spec.enabled??defaults.enabled,includedInAll:spec.includedInAll??defaults.includedInAll}}function artifactDefaults(key,program){if(key==="skill")return{enabled:!1,includedInAll:!1};if(key==="agentsMcp"){let on=program?.mcpServer?.enabled===!0;return{enabled:on,includedInAll:on}}let target=installTargetForKey(key);if(!mcpServerRequiredForArtifact(key,program?.mcpServer?.enabled===!0))return{enabled:!1,includedInAll:!1};return{enabled:!0,includedInAll:target?.defaultIncludedInAll()??!1}}function resolveEffectiveInstallTargets(configure,program){let user=configure?.targets,out={};for(let key of INSTALL_ARTIFACT_KEYS){let userSpec=key==="skill"||key==="agentsMcp"?void 0:user?.[key];out[key]=resolveInstallTargetSpec(userSpec,artifactDefaults(key,program))}return out}function mcpCategoryEnabled(root){return resolveCapabilities(root).mcp}function resolveInstallPlanMode(opts){if(opts.reinstall)return"refresh";if(opts.uninstall)return opts.all?"uninstall-all":"uninstall-scoped";if(opts.all)return"install-all";return"install-scoped"}function emptyInstalledArtifacts(){return{app:!1,skill:!1,agentsMcp:!1}}function detectInstalledArtifacts(paths,root){let out=emptyInstalledArtifacts();for(let target of INSTALL_TARGETS)target.applyDetected(paths,root,out);return out}function resolveInstallScope(opts){return{all:opts.all,skill:opts.skill,mcp:opts.mcp,configure:opts.configure,uninstall:opts.uninstall}}function buildDetectedSnapshot(root,paths){return{...detectInstalledArtifacts(paths,root),appConfig:appConfigFileExists(root)}}function targetExplicitlyConfigured(user,key){if(key==="skill"||key==="agentsMcp")return!1;return user?.[key]!==void 0}function agentCategoryInScope(key,categoryKeys,category,effective,targets,root){if(!categoryKeys.includes(key))return!1;if(!effective[key].enabled)return!1;if(category==="mcp"&&!resolveCapabilities(root).mcp)return!1;return effective[key].includedInAll||targetExplicitlyConfigured(targets,key)}function isArtifactInScope(key,scope,effective,mode,root,targets){let userTargets=targets??root.configure?.targets;if(mode==="uninstall-all")return!0;if(mode==="refresh")return effective[key].enabled;if(mode==="install-all"){let t=effective[key];return t.enabled&&t.includedInAll}if(mode==="uninstall-scoped"||mode==="install-scoped"){if(!effective[key].enabled)return!1;let inScope=!1;if(scope.skill)inScope=inScope||agentCategoryInScope(key,SKILL_KEYS,"skill",effective,userTargets,root);if(scope.mcp)inScope=inScope||agentCategoryInScope(key,MCP_KEYS,"mcp",effective,userTargets,root);if(scope.configure&&key==="configure")inScope=!0;return inScope}return!1}function shouldIncludeArtifact(key,root,paths,scope,mode,effective,detected){let target=installTargetForKey(key),targets=root.configure?.targets;if(key!=="configure"&&target&&!target.isAvailable(root,paths))return!1;if(key==="configure"&&!root.appConfig)return!1;if(mode==="refresh"&&detected){if(key==="app");else if(!detected[key])return!1}if((mode==="uninstall-all"||mode==="uninstall-scoped")&&detected){let det=detected[key];if(key==="configure"){if(!det)return!1}else if(mode==="uninstall-scoped"){if(!isArtifactInScope(key,scope,effective,mode,root,targets))return!1;if(!det)return!1}else if(!det)return!1}if(mode==="uninstall-all")return!0;if(mode==="uninstall-scoped")return isArtifactInScope(key,scope,effective,mode,root,targets);if(mode==="refresh"){if(key==="app")return!1;return effective[key].enabled}return isArtifactInScope(key,scope,effective,mode,root,targets)}function buildTargetPlanContext(root,paths,opts,detected){let effective=resolveEffectiveInstallTargets(root.configure,root),mode=resolveInstallPlanMode(opts),scope=resolveInstallScope(opts),detPartial=Object.fromEntries(INSTALL_TARGETS.map((t)=>[t.key,t.detectedForSnapshot(detected)])),include=(key)=>shouldIncludeArtifact(key,root,paths,scope,mode,effective,detPartial);return{root,paths,opts,dry:!!opts.dry,detected,effective,scope,mode,include}}function resolveInstallTargetPreview(program,paths){let effective=resolveEffectiveInstallTargets(program.configure,program),keysForScope=(scope,mode)=>INSTALL_ARTIFACT_KEYS.filter((key)=>shouldIncludeArtifact(key,program,paths,scope,mode,effective));return{all:keysForScope({all:!0},"install-all"),mcp:keysForScope({mcp:!0},"install-scoped"),skill:keysForScope({skill:!0},"install-scoped")}}function buildInstallPlanFromTargets(root,paths,opts){let detected=buildDetectedSnapshot(root,paths),ctx=buildTargetPlanContext(root,paths,opts,detected),actions=[],mcpEnabled=mcpCategoryEnabled(root);for(let target of INSTALL_TARGETS){if(target.category==="mcp"&&!mcpEnabled)continue;actions.push(...target.planInstall(ctx))}return actions}function buildUninstallPlanFromTargets(root,paths,opts){let detected=buildDetectedSnapshot(root,paths),ctx=buildTargetPlanContext(root,paths,opts,detected),actions=[];for(let target of INSTALL_TARGETS){if(target.key==="configure")continue;actions.push(...target.planUninstall(ctx))}let configure=installTargetForKey("configure");if(configure)actions.push(...configure.planUninstall(ctx));return actions}function buildUpdatePlan(root,paths,opts){let refresh=buildInstallPlanFromTargets(root,paths,{...opts,reinstall:!0,all:!0});if(refresh.length>0)return refresh;return buildInstallPlanFromTargets(root,paths,{...opts,reinstall:!1,all:!0})}function buildInstallStatus(paths,detected,root){let status={};for(let target of INSTALL_TARGETS)target.contributeStatus(paths,root,detected,status);return status}function installOut(msg,opts){if(opts.json)return;process.stdout.write(`${msg}
129
+ `)}function installErr(msg){process.stderr.write(`${msg}
130
+ `)}function printInstallStatus(root,opts){let paths=resolveInstallPaths(root),detected=detectInstalledArtifacts(paths,root),status=buildInstallStatus(paths,detected,root);if(opts.json){let preview=resolveInstallTargetPreview(root,paths),json={effective:{all:preview.all,mcp:preview.mcp,skill:preview.skill}};if(status.app)json.app=status.app;if(status.skill)json.skill=status.skill;if(status.agentsMcp)json.agentsMcp=status.agentsMcp;process.stdout.write(`${JSON.stringify(json,null,2)}
131
+ `);return}installOut(`Installed artifacts for ${root.key}:`,opts);let lines=[["app",status.app],["agent skill",status.skill],[".agents mcp",status.agentsMcp]],any=!1;for(let[label,value]of lines)if(value)installOut(` ${label}: ${value}`,opts),any=!0;if(!any)installOut(" (none detected)",opts);let configStatus=appConfigStatus(root);if(configStatus)installOut(` app config: ${configStatus}`,opts)}function appConfigHasEntries(program){let entries=program.appConfig?.entries;return!!entries&&Object.keys(entries).length>0}function configureHookContext(root,paths){return{program:root,dry:!1,paths:{agentsSkillDir:paths.agentsSkillDir,agentsMcpPath:paths.agentsMcpPath,mcpName:paths.mcpName,skillDirName:paths.skillDirName}}}async function runConfigureLifecycleHook(hook,root,paths){if(!hook)return;await hook(configureHookContext(root,paths))}function executePlan(actions){for(let action of actions)action.run()}function runInstallWizard(root){if(!appConfigHasEntries(root))return;let{resolved}=bootstrapAppConfig(root,{validateFile:!1}),missing=missingRequiredConfig(root,resolved);if(process.stdin.isTTY){if(missing.length===0)return;runConfigure(root,{context:"after-install",showHeading:!0,rePromptAll:!1});return}if(missing.length>0)installErr(formatMissingConfigMessage(root,missing)),process.exit(1)}function confirmUninstall(root,yes){if(yes||!process.stdin.isTTY)return;process.stderr.write(`Remove agent artifacts for ${root.key}? [y/N]: `);let ans=readPromptLine().trim().toLowerCase();if(ans!=="y"&&ans!=="yes")process.exit(0)}async function cliConfigureInstall(root){let paths=resolveInstallPaths(root),installOpts={reinstall:!0,all:!0};try{if(ensureAppConfigFile(root,!1))process.stdout.write(`Initialized config: ${displayAppConfigPath(root)}
132
+ `);let actions=buildUpdatePlan(root,paths,installOpts);executePlan(actions),runInstallWizard(root),await runConfigureLifecycleHook(root.configure?.afterInstall,root,paths)}catch(err){installErr(err instanceof Error?err.message:String(err)),process.exit(1)}process.exit(0)}async function cliConfigureUninstall(root,opts){let paths=resolveInstallPaths(root),uninstallOpts={uninstall:!0,all:!0};confirmUninstall(root,!!opts.yes);try{await runConfigureLifecycleHook(root.configure?.beforeUninstall,root,paths);let actions=buildUninstallPlan(root,paths,uninstallOpts);executePlan(actions)}catch(err){installErr(err instanceof Error?err.message:String(err)),process.exit(1)}process.exit(0)}function cliConfigureStatus(root,opts){printInstallStatus(root,{status:!0,json:opts.json}),process.exit(0)}var JSON_OPTION={name:"json",description:"Emit JSON (compact).",kind:"presence"},PRETTY_OPTION={name:"pretty",description:"Pretty-print JSON (requires --json).",kind:"presence"};function configGetOutput(program,key,json,pretty){let appConfig=program.appConfig;if(!appConfig)return;let{resolved}=bootstrapAppConfig(program,{validateFile:!0}),entries=appConfig.entries;if(key!==void 0){if(!(key in entries))process.stderr.write(`Unknown configuration key: ${key}
133
+ `),process.exit(1);let entry=entries[key];if(!entry)process.exit(1);let value=resolved[key];if(json){let out=configEntrySensitive(key,entry)&&value!==void 0&&String(value).length>0?{set:!0}:value??null,space=pretty?2:void 0;process.stdout.write(`${JSON.stringify(out,null,space)}
134
+ `);return}if(configEntrySensitive(key,entry)){let set=value!==void 0&&value!==null&&String(value).length>0;process.stdout.write(set?`REDACTED
135
+ `:`(not set)
136
+ `);return}if(value===void 0){process.stdout.write(`(not set)
137
+ `);return}if(typeof value==="object"){process.stdout.write(`${JSON.stringify(value)}
138
+ `);return}process.stdout.write(`${String(value)}
139
+ `);return}let out={};for(let[k,entry]of Object.entries(entries)){let value=resolved[k];if(configEntrySensitive(k,entry))out[k]=value!==void 0&&value!==null&&String(value).length>0?json?{set:!0}:"REDACTED":json?null:"(not set)";else out[k]=value??(json?null:"(not set)")}if(json){let space=pretty?2:void 0;process.stdout.write(`${JSON.stringify(out,null,space)}
140
+ `);return}for(let[k,v]of Object.entries(out)){let title=entries[k]?.title??defaultConfigEntryTitle(k);process.stdout.write(`${title}: ${String(v)}
141
+ `)}}var FROM_ENV_OPTION={name:"from-env",description:"Bind this key to its mapped environment variable (no literal value stored).",kind:"presence"};function configSetFromEnv(program,key){let appConfig=program.appConfig;if(!appConfig)return;if(!appConfig.entries[key]?.env)process.stderr.write(`Configuration key '${key}' has no env mapping for --from-env.
142
+ `),process.exit(1);let hostEnv=captureMappedHostEnv(program),{fileData}=bootstrapAppConfig(program,{validateFile:!0}),next=clearFileValue(fileData,key);next=setBinding(next,key,"env"),writeAppConfigFile(program,next,{partial:!0});let resolved=resolveAppConfig(program,next,hostEnv);exportConfigToEnv(program,resolved,hostEnv)}function configSetRun(program,key,rawValue,useJson){let appConfig=program.appConfig;if(!appConfig)return;let entries=appConfig.entries;if(!(key in entries))process.stderr.write(`Unknown configuration key: ${key}
143
+ `),process.exit(1);let jsonSchema=effectiveJsonSchema(program);if(!jsonSchema)process.stderr.write(`Internal error: missing effective jsonSchema.
144
+ `),process.exit(1);let propSchema=configPropertySchema(jsonSchema,key),parsed;try{parsed=parseConfigSetValue(rawValue,propSchema,jsonSchema,useJson)}catch(err){let msg=err instanceof Error?err.message:String(err);process.stderr.write(`${msg}
145
+ `),process.exit(1)}let hostEnv=captureMappedHostEnv(program),{fileData}=bootstrapAppConfig(program,{validateFile:!0}),next=setBinding({...fileData,[key]:parsed},key,"file");writeAppConfigFile(program,next,{partial:!0});let resolved=resolveAppConfig(program,next,hostEnv);exportConfigToEnv(program,resolved,hostEnv)}function configGetLeaf(program){return{key:"get",description:"Print resolved configuration value(s).",options:[JSON_OPTION,PRETTY_OPTION],positionals:[{name:"key",description:"Schema key to read (omit for all keys).",kind:"string",argMin:0,argMax:1}],handler:(ctx)=>{let key=ctx.args[0];configGetOutput(program,key,ctx.hasFlag("json"),ctx.hasFlag("pretty"))}}}function configSetLeaf(program,mcpSetEnabled){return{key:"set",description:"Write one configuration key to the config file.",options:[JSON_OPTION,FROM_ENV_OPTION],mcpTool:mcpSetEnabled?void 0:{enabled:!1},positionals:[{name:"key",description:"Schema key to write.",kind:"string",argMin:1,argMax:1},{name:"value",description:"Value to store (comma-separated or JSON for primitive arrays; --json for objects and nested arrays).",kind:"string",argMin:0,argMax:1}],handler:(ctx)=>{let key=ctx.args[0];if(!key)process.stderr.write(`configure set requires a key.
146
+ `),process.exit(1);if(ctx.hasFlag("from-env")){let raw=ctx.args[1];if(raw!==void 0&&raw.length>0)process.stderr.write(`configure set --from-env does not accept a value.
147
+ `),process.exit(1);configSetFromEnv(program,key);return}let raw=ctx.args[1];if(raw===void 0||raw.length===0){if(!ctx.hasFlag("json"))process.stderr.write(`configure set requires a value (or --from-env).
148
+ `),process.exit(1);process.stderr.write(`configure set requires a value.
149
+ `),process.exit(1)}configSetRun(program,key,raw,ctx.hasFlag("json"))}}}function configureConfigSubcommands(program,mcpSetEnabled=configMcpSetEnabled(program)){if(!program.appConfig)throw Error("configure config subcommands require program.appConfig");return[configGetLeaf(program),configSetLeaf(program,mcpSetEnabled)]}var LABEL={mcp:{prose:"MCP config",short:"MCP"},config:{prose:"app config",short:"config"}};function enabledKinds(program,caps){let kinds=[];if(caps.mcp&&program.mcpServer?.enabled)kinds.push("mcp");if(program.appConfig&&Object.keys(program.appConfig.entries).length>0)kinds.push("config");return kinds}function joinEnglish(items){if(items.length===0)return"agent artifacts";if(items.length===1)return items[0]??"agent artifacts";if(items.length===2)return`${items[0]} and ${items[1]}`;return`${items.slice(0,-1).join(", ")}, and ${items[items.length-1]}`}function prose(program,caps){return joinEnglish(enabledKinds(program,caps).map((k)=>LABEL[k].prose))}function configureCommandDescription(program,caps){return`Set up ${prose(program,caps)} for this app (binary via Homebrew).`}function configureCommandNotes(program,_caps){let app=program.key,lines=["Set up agent artifacts after the binary is installed via Homebrew (see README for tap install).","","Homebrew installs the binary and shell completions only. Agent artifacts live under ~/.agents and are not written during brew install.","","After install or upgrade:",` ${app} configure install`,"","Upgrade:",` brew upgrade ${app}`,` ${app} configure install`,"","Shell completions are installed by Homebrew during brew install.","See: https://docs.brew.sh/Shell-Completion","","See what is installed:",` ${app} configure status`,"","Uninstall:",` ${app} configure uninstall`,` brew uninstall <tap>/${app}`,""];if(program.appConfig&&Object.keys(program.appConfig.entries).length>0)lines.push("Set configuration values:",` ${app} configure set <key> <value>`,"");return lines.push("Use `configure status --json` for machine-readable output."),lines.join(`
150
+ `)}var YES_OPTION={name:"yes",description:"Skip uninstall confirmation.",kind:"presence",shortName:"y"},JSON_OPTION2={name:"json",description:"Print status JSON on stdout.",kind:"presence"};function isConfigureConfigPath(path){return path.length>=2&&(path[1]==="get"||path[1]==="set")}function configureInstallLeaf(program){return{key:"install",description:"Install agent artifacts and bootstrap app config.",handler:async()=>{await cliConfigureInstall(program)}}}function configureUninstallLeaf(program){return{key:"uninstall",description:"Remove agent artifacts and app config.",options:[YES_OPTION],handler:async(ctx)=>{await cliConfigureUninstall(program,{yes:ctx.hasFlag("yes")})}}}function configureStatusLeaf(program){return{key:"status",description:"Print what is currently installed (read-only).",options:[JSON_OPTION2],handler:(ctx)=>{cliConfigureStatus(program,{json:ctx.hasFlag("json")})}}}function cliBuiltinConfigureCommand(root){let caps=resolveCapabilities(root),commands=[configureInstallLeaf(root),configureUninstallLeaf(root),configureStatusLeaf(root)];if(configCommandsEnabled(root))commands.push(...configureConfigSubcommands(root,configMcpSetEnabled(root)));return{key:"configure",description:configureCommandDescription(root,caps),notes:configureCommandNotes(root,caps),commands}}var HTTP_SERVE_OPTIONS=[{name:"host",description:"Listen host.",kind:"string"},{name:"port",description:"Listen port.",kind:"number"},{name:"trust-proxy",description:"Honor X-Forwarded-For for client IP.",kind:"presence"},{name:"obscure-errors",description:"Hide unexpected errors from clients.",kind:"presence"},{name:"log-format",description:"Log format: json (ECS Logging) or text.",kind:"enum",choices:["json","text"]},{name:"log-file",description:"Append logs to this file (relative → app config dir).",kind:"string"},{name:"no-access-log",description:"Disable HTTP access logs.",kind:"presence"},{name:"dev",description:"Print full stacks to stderr on errors.",kind:"presence"}];function cliBuiltinHttpCommand(program){let caps=resolveCapabilities(program),{hostname,port}=resolveHttpListenAddress(program),userGlob=httpUserPathGlob(resolveHttpPathPrefix(program)),lines=[`HTTP tool server on http://${hostname}:${port}.`,"",`Endpoints: GET /health/liveness, GET /health/readiness, GET /openapi.json, GET /swagger, ${userGlob}`,""];if(caps.configure)lines.push("Configure app settings:",""," {argsbarg:program} configure","");if(docsEnabled(program))lines.push("Full setup guide: {argsbarg:program} docs http");let serve={key:"serve",cli:{hidden:!0},description:"Run as an HTTP API server for tools.",handler:()=>{}};return{key:"http",description:"HTTP API server for tools.",notes:lines.join(`
151
+ `),options:[...HTTP_SERVE_OPTIONS],fallbackCommand:"serve",fallbackMode:"missingOnly",commands:[serve]}}var MCP_SERVE_OPTIONS=[{name:"obscure-errors",description:"Hide unexpected errors from clients.",kind:"presence"},{name:"log-format",description:"Log format: json (ECS Logging) or text.",kind:"enum",choices:["json","text"]},{name:"log-file",description:"Append logs to this file (relative → app config dir).",kind:"string"},{name:"dev",description:"Print full stacks to stderr on errors.",kind:"presence"}];function cliBuiltinMcpCommand(program){let caps=resolveCapabilities(program),lines=["Stdio MCP server. Add to Cursor, Claude Code, or Claude Desktop:",""," command: {argsbarg:program}"," args: mcp",""];if(caps.configure)lines.push("Or:",""," {argsbarg:program} configure","");if(docsEnabled(program))lines.push("Full setup guide: {argsbarg:program} docs mcp");let serve={key:"serve",cli:{hidden:!0},description:"Run as an MCP server over stdio for AI agents.",handler:()=>{}},bundle={key:"bundle",description:"Pack dist MCP artifacts (`.mcpb`, Claude Code plugin zip, Cursor plugin zip) from dist/<key>.",handler:()=>{}};return{key:"mcp",description:"MCP server and bundle tools.",notes:lines.join(`
152
+ `),options:[...MCP_SERVE_OPTIONS],fallbackCommand:"serve",fallbackMode:"missingOnly",commands:[serve,bundle]}}function cliBuiltinVersionCommand(){return{key:"version",description:"Print the program version.",handler:()=>{}}}function pushBuiltin(builtins,program,factory){if(!factory)return;let node=factory(program);if(node)builtins.push(node)}function resolveBuiltins(program,caps){let builtins=[];if(caps.completion)pushBuiltin(builtins,program,(p)=>cliBuiltinCompletionGroup(p));if(pushBuiltin(builtins,program,()=>cliBuiltinVersionCommand()),caps.configure)pushBuiltin(builtins,program,(p)=>cliBuiltinConfigureCommand(p));if(pushBuiltin(builtins,program,(p)=>cliBuiltinDocsGroupIfEnabled(p)??null),caps.mcp)pushBuiltin(builtins,program,(p)=>cliBuiltinMcpCommand(p));if(caps.http)pushBuiltin(builtins,program,(p)=>cliBuiltinHttpCommand(p));return builtins}function exportBuiltinNode(cmd){if(isCliSchemaHidden(cmd))return null;let out={key:cmd.key,description:cmd.description};if((cmd.notes??"").length>0)out.notes=cmd.notes;let options=visibleOptions(cmd.options);if(options.length>0)out.options=options;if(isCliRouter(cmd)){if(cmd.fallbackCommand!==void 0)out.fallbackCommand=cmd.fallbackCommand;if(cmd.fallbackMode!==void 0)out.fallbackMode=cmd.fallbackMode;let children=cmd.commands.map((ch)=>exportBuiltinNode(ch)).filter((ch)=>ch!==null);if(children.length>0)out.commands=children}return out}function exportPresentationBuiltins(program){let caps=resolveCapabilities(program);return resolveBuiltins(program,caps).map((cmd)=>exportBuiltinNode(cmd)).filter((node)=>node!==null)}var RESERVED=new Set(["http","completion","configure","docs","mcp","version"]);function exportCommand(cmd,root){if(isCliSchemaHidden(cmd))return null;let out={key:cmd.key,description:cmd.description};if((cmd.notes??"").length>0)out.notes=cmd.notes;let options=visibleOptions(cmd.options);if(options.length>0)out.options=options;if(isCliLeaf(cmd)){if((cmd.positionals??[]).length>0)out.positionals=cmd.positionals;out.inputSchema=buildLeafInputSchema(cmd);let outputSchema=leafOutputSchema(cmd);if(outputSchema!==void 0)out.outputSchema=outputSchema;else if(cmd.http?.successContentType!==void 0)out.outputContentType=cmd.http.successContentType;return out.commands=exportPresentationBuiltins(root),out}if(cmd.fallbackCommand!==void 0)out.fallbackCommand=cmd.fallbackCommand;if(cmd.fallbackMode!==void 0)out.fallbackMode=cmd.fallbackMode;let children=isCliRouter(cmd)?cmd.commands.filter((ch)=>!RESERVED.has(ch.key)):[];if(children.length>0)out.commands=children.map((ch)=>exportCommand(ch,root)).filter((ch)=>ch!==null);return out}function resolveSchemaNotes(node,appKey){let out={...node};if((out.notes??"").length>0&&out.notes!==void 0)out.notes=cliResolveNotes(out.notes,appKey);if(out.commands)out.commands=out.commands.map((ch)=>resolveSchemaNotes(ch,appKey));return out}function cliSchemaExport(root){let exported=exportCommand(root,root),errorSchema=root.httpServer?.errors?.errorSchema??root.mcpServer?.errors?.errorSchema,base=!exported?{key:root.key,description:root.description,commands:exportPresentationBuiltins(root)}:resolveSchemaNotes(exported,root.key);if(errorSchema!==void 0)base.errorSchema=errorSchema;return base}function cliSchemaJson(root){return`${JSON.stringify(cliSchemaExport(root),null,2)}
153
+ `}function defaultMcpSchemaUri(mcpId){return`${mcpId}://schema`}function sanitizeToolSegment(key){return key.replace(/[^a-zA-Z0-9]/g,"_")}function mcpServerId(root){return sanitizeToolSegment(root.key)}var MCP_INPUT_WRAPPER_KEY="input",MCP_OUTPUT_WRAPPER_KEY="result";function wrapMcpRootSchema(schema,key){if(schema.type==="object")return{schema,wrapped:!1};let{$schema,$id,definitions,$defs,...inner}=schema;return{schema:{...$schema===void 0?{}:{$schema},...$id===void 0?{}:{$id},type:"object",properties:{[key]:inner},required:[key],additionalProperties:!1,...definitions===void 0?{}:{definitions},...$defs===void 0?{}:{$defs}},wrapped:!0}}function mcpToolDescription(path,rootKey,description){return`${path.length>0?path.join(" "):rootKey} — ${description}`}function mcpToolName(root,path){if(path.length===0)return sanitizeToolSegment(root.key);return path.map(sanitizeToolSegment).join("_")}function leafHasYesOption(leaf){return visibleOptions(leaf.options).some((opt)=>opt.name==="yes"&&opt.kind==="presence")}function formatMcpOptionValue(opt,val){if(opt.format==="comma-list"){if(Array.isArray(val)){let items=val.map(String).filter(Boolean);if(items.length===0)return{error:`Option --${opt.name} requires at least one value`};return items.join(",")}if(typeof val==="string")return val;return{error:`Option --${opt.name} must be a string or array of strings`}}return String(val)}function resolveToolDescription(root,path,leaf){let desc;if(leaf.mcpTool?.description)desc=leaf.mcpTool.description;else desc=mcpToolDescription(path,root.key,leaf.description);let notesOverride=leaf.mcpTool?.notes;if(notesOverride===!1)return desc;let notes=(typeof notesOverride==="string"?notesOverride:leaf.notes??"").trim();if(notes.length>0)desc+=`
154
+
155
+ ${cliResolveNotes(notes,root.key)}`;return desc}function allMcpResources(root){let builtIn={uri:resolveMcpSchemaUri(root),name:"cli-schema",description:"Full CLI command tree (same as docs cli-schema).",mimeType:"application/json",load:()=>cliSchemaJson(root)},user=(root.mcpServer?.resources??[]).map((r)=>({uri:r.uri,name:r.name,description:r.description,mimeType:r.mimeType??"text/plain",load:r.load}));return[builtIn,...docsMcpResources(root),...user]}function collectMcpTools(root){let out=[];function walk(cmd,path){if(isCliLeaf(cmd)){if(cmd.key==="completion"||cmd.key==="configure"||cmd.key==="mcp"||cmd.key==="version")return;if(isMcpHidden(cmd))return;let input=wrapMcpRootSchema(buildLeafInputSchema(cmd),MCP_INPUT_WRAPPER_KEY),leafOutput=leafOutputSchema(cmd),output=leafOutput===void 0?void 0:wrapMcpRootSchema(leafOutput,MCP_OUTPUT_WRAPPER_KEY);out.push({name:mcpToolName(root,path),description:resolveToolDescription(root,path,cmd),path,leaf:cmd,inputSchema:input.schema,inputWrapped:input.wrapped,...output===void 0?{}:{outputSchema:output.schema},outputWrapped:output?.wrapped??!1});return}for(let ch of cmd.commands)walk(ch,[...path,ch.key])}if(isCliLeaf(root))walk(root,[]);else for(let ch of root.commands)walk(ch,[ch.key]);return out.sort((a,b)=>a.name.localeCompare(b.name))}function resolveMcpServerInfo(root){return{name:mcpServerId(root),version:root.version}}function resolveMcpSchemaUri(root){if(root.mcpServer?.schemaResourceUri)return root.mcpServer.schemaResourceUri;return defaultMcpSchemaUri(mcpServerId(root))}function mcpToolCallToArgv(_root,tool,args){if(isDocumentLeaf(tool.leaf))return[...tool.path];let argv=[...tool.path];for(let opt of leafWireOptions(tool.leaf)){if(opt.kind==="json")continue;let val=args[opt.name];if(val===void 0)continue;if(opt.kind==="presence"){if(val===!0)argv.push(`--${opt.name}`);continue}let formatted=formatMcpOptionValue(opt,val);if(typeof formatted!=="string")return formatted;argv.push(`--${opt.name}`,formatted)}if(leafHasYesOption(tool.leaf)&&!argv.includes("--yes"))argv.push("--yes");for(let p of tool.leaf.positionals??[]){let val=args[p.name],{argMin=1,argMax=1}=p;if(argMax===0){let raw=args[p.name];if(raw===void 0){if(argMin>=1)return{error:`Missing argument: ${p.name} (use a JSON array)`};continue}if(!Array.isArray(raw))return{error:`Argument ${p.name} must be a JSON array of strings (not a comma-separated string)`};let items=raw.map(String).filter(Boolean);if(items.length===0&&argMin>=1)return{error:`Missing argument: ${p.name}`};argv.push(...items);continue}if(val===void 0){if(argMin>=1)return{error:`Missing argument: ${p.name}`};continue}argv.push(String(val))}return argv}var DEFAULT_MCP_SIZE_LIMITS={definitionBytes:51200,definitionLines:2000,descriptionChars:2048,instructionsChars:2048};function mcpToolDefinitionJson(tool){return JSON.stringify({name:tool.name,description:tool.description,inputSchema:tool.inputSchema,...tool.outputSchema===void 0?{}:{outputSchema:tool.outputSchema}},null,2)}function mcpSizeReport(root){let limits={...DEFAULT_MCP_SIZE_LIMITS,...root.mcpServer?.sizeLimits},warnings=[],tools=collectMcpTools(root).map((tool)=>{let definitionJson=mcpToolDefinitionJson(tool),definitionBytes=Buffer.byteLength(definitionJson,"utf8"),definitionLines=definitionJson.split(`
156
+ `).length,descriptionChars=tool.description.length;if(limits.descriptionChars!==!1&&descriptionChars>limits.descriptionChars)warnings.push(`MCP tool "${tool.name}" description is ${descriptionChars.toLocaleString()} chars (limit ${limits.descriptionChars.toLocaleString()}; Claude Code truncates longer descriptions)`);let overBytes=limits.definitionBytes!==!1&&definitionBytes>limits.definitionBytes,overLines=limits.definitionLines!==!1&&definitionLines>limits.definitionLines;if(overBytes||overLines){let byteLimit=limits.definitionBytes===!1?"∞":limits.definitionBytes.toLocaleString(),lineLimit=limits.definitionLines===!1?"∞":limits.definitionLines.toLocaleString();warnings.push(`MCP tool "${tool.name}" definition is ${definitionBytes.toLocaleString()} bytes / ${definitionLines.toLocaleString()} lines pretty-printed (limit ${byteLimit} bytes / ${lineLimit} lines; Cursor reads tool definitions in chunks of at most that size)`)}return{definitionBytes,definitionLines,descriptionChars,name:tool.name}}),instructionsChars=(root.mcpServer?.instructions??"").length;if(limits.instructionsChars!==!1&&instructionsChars>limits.instructionsChars)warnings.push(`MCP instructions are ${instructionsChars.toLocaleString()} chars (limit ${limits.instructionsChars.toLocaleString()})`);return{instructionsChars,tools,warnings}}function resolveAppConfigPath(program){let dirName=sanitizeToolSegment(program.key);return join5(appConfigLibHome(),dirName,"config.json")}function resolveAppConfigDir(program){return dirname5(resolveAppConfigPath(program))}function displayAppConfigPath(program){return displayHomePath(resolveAppConfigPath(program))}function parseConfigJson(text,path){try{let parsed=JSON.parse(text);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))throw Error("root must be a JSON object");return parsed}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Invalid JSON in config file ${displayHomePath(path)}: ${msg}`)}}function readAppConfigFileRaw(path){if(!existsSync6(path))return{};let text;try{text=readFileSync2(path,"utf8")}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Could not read config file ${displayHomePath(path)}: ${msg}`)}return parseConfigJson(text,path)}function isEmptyConfigDocument(data){return Object.keys(data).every((k)=>isFrameworkConfigKey(k))}function appConfigFileExists(program){return existsSync6(resolveAppConfigPath(program))}function validateAppConfigData(program,data,pathLabel,opts={}){let appConfig=program.appConfig;if(!appConfig)throw Error("program.appConfig is not set");let where=pathLabel?displayHomePath(pathLabel):"config",bindingErrors=validateBindingsShape(data);if(bindingErrors.length>0)throw Error(`Invalid config in ${where}: ${bindingErrors.join("; ")}`);let allowed=new Set(Object.keys(appConfig.entries));for(let key of Object.keys(data)){if(isFrameworkConfigKey(key))continue;if(!allowed.has(key))throw Error(`Unknown config key '${key}' in ${where}`)}let jsonSchema=effectiveJsonSchema(program);if(!jsonSchema)return;if(opts.partial||isEmptyConfigDocument(data)){let result=validateConfigDocumentPartial(data,jsonSchema);if(!result.valid)throw Error(`Invalid config in ${where}: ${result.errors.join("; ")}`);return}let result=validateConfigDocument(data,jsonSchema);if(!result.valid)throw Error(`Invalid config in ${where}: ${result.errors.join("; ")}`)}function writeAppConfigFileRaw(program,data,dry=!1){let path=resolveAppConfigPath(program);if(dry)return;mkdirSync4(dirname5(path),{recursive:!0}),writeFileSync3(path,`${JSON.stringify(data,null,2)}
157
+ `,{mode:384})}function ensureAppConfigFile(program,dry=!1){let path=resolveAppConfigPath(program);if(existsSync6(path))return null;return writeAppConfigFileRaw(program,{},dry),path}function readAppConfigFile(program){let path=resolveAppConfigPath(program),data=readAppConfigFileRaw(path);if(isEmptyConfigDocument(data))return data;return validateAppConfigData(program,data,path),data}function writeAppConfigFile(program,data,opts={}){validateAppConfigData(program,data,displayAppConfigPath(program),opts),writeAppConfigFileRaw(program,data)}function appConfigInstalled(program){return appConfigFileExists(program)}function uninstallAppConfig(program,dry){let path=resolveAppConfigPath(program),dir=resolveAppConfigDir(program),hasFile=existsSync6(path),hasDir=existsSync6(dir);if(!hasFile&&!hasDir)return[];let changed=[];if(hasFile)changed.push(path);if(hasDir)changed.push(`${dir}/`);if(!dry){if(hasFile)unlinkSync(path);if(hasDir)rmSync2(dir,{recursive:!0,force:!0});process.stdout.write(`Removed app config ${displayAppConfigPath(program)}
158
+ `)}return changed}function rebuildResolved(program,fileData){let hostEnv=captureMappedHostEnv(program),resolved=resolveAppConfig(program,fileData,hostEnv);return exportConfigToEnv(program,resolved,hostEnv),resolved}class EmptyAppConfigSnapshot{program;fileData;constructor(program,fileData){this.program=program;this.fileData=fileData??readAppConfigFileRaw(resolveAppConfigPath(program))}get(_key){return}require(key){throw Error(`Configuration key '${key}' is not available (program.appConfig is not set)`)}set(_key,_value){throw Error("program.appConfig is not set")}read(){return{}}readUnsafe(){return{...this.fileData}}getUnsafe(key){return this.fileData[key]}setUnsafe(key,value){let next={...this.fileData,[key]:value};writeAppConfigFileRaw(this.program,next),this.fileData=next}get path(){return resolveAppConfigPath(this.program)}get dir(){return resolveAppConfigDir(this.program)}}class AppConfigSnapshot{program;snapshot;fileData;constructor(program,fileData,resolved){this.program=program;this.fileData={...fileData},this.snapshot={...resolved}}get(key){return this.assertEntryKey(key),this.snapshot[key]}require(key){let value=this.get(key);if(value===void 0||value===null||typeof value==="string"&&value.length===0)throw Error(`Missing required configuration: ${key}`);return value}set(key,value){this.assertEntryKey(key);let jsonSchema=effectiveJsonSchema(this.program);if(!jsonSchema)throw Error("Internal error: missing effective jsonSchema.");let propSchema=configPropertySchema(jsonSchema,key);validateParsedConfigValue(value,propSchema,jsonSchema);let next=setBinding({...this.fileData,[key]:value},key,"file");this.persistFileData(next)}read(){return{...this.snapshot}}readUnsafe(){return{...this.fileData}}getUnsafe(key){return this.fileData[key]}setUnsafe(key,value){this.assertUnsafeKey(key);let next={...this.fileData,[key]:value};this.persistFileData(next)}get path(){return resolveAppConfigPath(this.program)}get dir(){return resolveAppConfigDir(this.program)}refresh(fileData,resolved){this.fileData={...fileData},this.snapshot={...resolved}}persistFileData(next){writeAppConfigFile(this.program,next,{partial:!0}),this.fileData=next,this.snapshot=rebuildResolved(this.program,next)}assertEntryKey(key){let entries=this.program.appConfig?.entries;if(!entries||!(key in entries))throw Error(`Unknown configuration key: ${key}`)}assertUnsafeKey(key){if(isFrameworkConfigKey(key))return;this.assertEntryKey(key)}}function createAppConfigSnapshot(program,fileData,resolved){if(!program.appConfig)return new EmptyAppConfigSnapshot(program,fileData);return new AppConfigSnapshot(program,fileData,resolved)}class CliContext{appName;commandPath;args;program;opts;invocation;appConfig;toolArgs;pathParams;preloadedJson;locals;runtime;response;leafInputsCache;constructor(appName,commandPath,args,opts,program,invocation="cli",appConfig=new EmptyAppConfigSnapshot(program),toolArgs,preloadedJson={},pathParams={},locals={},runtime){this.appName=appName,this.commandPath=commandPath,this.args=args,this.opts=opts,this.program=program,this.invocation=invocation,this.appConfig=appConfig,this.toolArgs=toolArgs,this.preloadedJson=preloadedJson,this.pathParams=pathParams,this.locals=locals,this.runtime=runtime}respond(opts){if(this.response!==void 0)throw Error("ctx.respond() was already called for this invocation");let normalized=normalizeRespondOptions(opts);if(this.invocation==="cli"){writeRespondBodyToStdout(normalized.body);return}this.response=normalized}getResponse(){return this.response}hasFlag(name){return this.opts[name]!==void 0}stringOpt(name){return this.opts[name]}numberOpt(name){let s=this.opts[name];if(s===void 0)return null;return strictParseDouble(s)}typedOpt(name,parse){let s=this.opts[name];if(s===void 0)return null;try{return parse(s)}catch{return null}}durationOpt(name){let s=this.opts[name];if(s===void 0)return;return parseDurationMs(s)}commaListOpt(name){let s=this.opts[name];if(s===void 0)return;return parseCommaList(s)}dateOpt(name){let s=this.opts[name];if(s===void 0)return;return parseDate(s)}dateTimeOpt(name){let s=this.opts[name];if(s===void 0)return;return parseDateTime(s)}jsonOpt(name){return readJsonOptionValue(this,name)}positional(name){return this._positionalMap()[name]}get inputs(){if(this.leafInputsCache!==void 0)return this.leafInputsCache;return this.leafInputsCache=loadLeafInputs(this),this.leafInputsCache}inputsAs(){return this.inputs}_leafNode(){let node=this.program;for(let seg of this.commandPath){if(!isCliRouter(node))return;let child=node.commands.find((c)=>c.key===seg);if(!child)return;node=child}return isCliLeaf(node)?node:void 0}_posMap;_positionalMap(){if(this._posMap)return this._posMap;let leaf=this._leafNode();if(!leaf)return this._posMap={},{};let map={},argIdx=0;for(let p of leaf.positionals??[]){let{argMax=1}=p;if(argMax===0)map[p.name]=this.args.slice(argIdx),argIdx=this.args.length;else{let val=this.args[argIdx];if(val!==void 0)map[p.name]=val;argIdx++}}return this._posMap=map,map}}import{chmodSync as chmodSync3,cpSync as cpSync4,existsSync as existsSync10,mkdirSync as mkdirSync8,mkdtempSync as mkdtempSync3,readFileSync as readFileSync4,rmSync as rmSync5,writeFileSync as writeFileSync7}from"node:fs";import{tmpdir as tmpdir3}from"node:os";import{basename as basename3,join as join9,resolve as resolve4}from"node:path";function buildConfigUserConfigEntry(key,entry,jsonSchemaRequired){return{type:"string",title:entry.title??defaultConfigEntryTitle(key),description:entry.description,sensitive:configEntrySensitive(key,entry),required:configEntryRequired(key,entry,jsonSchemaRequired)}}function buildProgramUserConfig(program){let appConfig=program.appConfig;if(!appConfig)return;let jsonSchema=effectiveJsonSchema(program),fromSchema=jsonSchema?jsonSchemaRequiredKeys(jsonSchema):void 0,out={};for(let[key,entry]of Object.entries(appConfig.entries)){if(!entry.env)continue;out[configUserConfigKey(key)]=buildConfigUserConfigEntry(key,entry,fromSchema)}return Object.keys(out).length>0?out:void 0}function buildPluginMcpEnvMapping(program){let appConfig=program.appConfig;if(!appConfig)return;let out={};for(let[key,entry]of Object.entries(appConfig.entries)){if(!entry.env)continue;let manifestKey=configUserConfigKey(key);out[entry.env]=`\${user_config.${manifestKey}}`}return Object.keys(out).length>0?out:void 0}function buildCursorPluginMcpEnvMapping(program){let appConfig=program.appConfig;if(!appConfig)return;let out={};for(let entry of Object.values(appConfig.entries)){if(!entry.env)continue;out[entry.env]=`\${${entry.env}}`}return Object.keys(out).length>0?out:void 0}function buildCursorPluginVariables(program){let appConfig=program.appConfig;if(!appConfig)return;let properties={},required=[];for(let entry of Object.values(appConfig.entries)){if(!entry.env)continue;if(properties[entry.env]={type:"string",...entry.description?{description:entry.description}:{}},entry.required)required.push(entry.env)}if(Object.keys(properties).length===0)return;return{type:"object",properties,...required.length>0?{required}:{}}}import{chmodSync,cpSync as cpSync2,existsSync as existsSync8,mkdirSync as mkdirSync6,mkdtempSync,rmSync as rmSync3,writeFileSync as writeFileSync5}from"node:fs";import{tmpdir}from"node:os";import{basename,join as join7,resolve as resolve2}from"node:path";import{cpSync,existsSync as existsSync7,mkdirSync as mkdirSync5,readdirSync,readFileSync as readFileSync3,statSync,writeFileSync as writeFileSync4}from"node:fs";import{join as join6,relative,resolve}from"node:path";function truncate(text,maxLen){if(text.length<=maxLen)return text;return`${text.slice(0,maxLen-1)}…`}function pluginSkillDescription(root){let paths=collectMcpTools(root).map((t)=>t.path.length>0?t.path.join(" "):root.key),sample=paths.slice(0,5).join(", "),more=paths.length>5?`, and ${paths.length-5} more`:"",desc=`Use the ${root.key} MCP toolset (${sample}${more}). Use when the user mentions ${root.key}${paths.length>0?`, ${paths.slice(0,3).join(", ")}`:""}, or related tasks.`;return truncate(desc,1024)}function buildConfigurationSection(root){if(!root.appConfig||Object.keys(root.appConfig.entries).length===0)return[];let entries=root.appConfig.entries,lines=["## Configuration",""];for(let name of Object.keys(entries).sort()){let entry=entries[name];if(!entry)continue;let title=defaultConfigEntryTitle(name),envStr=entry.env?` (env: \`${entry.env}\`)`:"",desc=entry.description?` — ${entry.description}`:"";lines.push(`- **${name}** (\`${title}\`${envStr})${desc}`)}return lines.push(""),lines}function buildPluginSkillMd(root,dirName){let lines=["---",`name: ${dirName}`,`description: ${pluginSkillDescription(root)}`,"---","",`# ${root.key}`,"",root.description,"","## MCP Tools","",`Server id: \`${mcpServerId(root)}\``,"","Prefer using MCP tools over terminal commands when available.","",`- Run \`tools/list\` against \`${mcpServerId(root)}\` to discover tools.`,`- Read schema resource \`${resolveMcpSchemaUri(root)}\` for types.`,""],tools=collectMcpTools(root);if(tools.length>0){lines.push("### Available tools","");for(let tool of tools){let toolName=sanitizeToolSegment(tool.path.join("_")),desc=tool.leaf.description,wire=leafWireOptions(tool.leaf),flags=wire.length>0?` (flags: ${wire.map((o)=>`--${o.name}`).join(", ")})`:"";lines.push(`- \`${toolName}\` — ${desc}${flags}`)}lines.push("")}return lines.push(...buildConfigurationSection(root)),lines.push("## Claude Code plugin","",`Invoke with \`/${dirName}\` or let Claude auto-match from the description.`,""),lines.join(`
159
+ `)}function generatePluginSkillBundle(root){let dirName=sanitizeToolSegment(root.key);return{dirName,skillMd:buildPluginSkillMd(root,dirName)}}function collectZipEntries(rootDir,dir=rootDir){let entries=[];for(let ent of readdirSync(dir,{withFileTypes:!0})){let full=join6(dir,ent.name);if(ent.isDirectory()){entries.push(...collectZipEntries(rootDir,full));continue}if(!ent.isFile())continue;let rel=relative(rootDir,full).split("\\").join("/"),stMode=statSync(full).mode,entry={name:rel,data:readFileSync3(full)};if(stMode&73)entry.unixMode=stMode;entries.push(entry)}return entries}function defaultAuthor(bundle){return bundle?.author??{name:"Unknown"}}function pluginName(program){return program.key.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function stagePluginSkills(pluginRoot,program,cwd){let dirName=sanitizeToolSegment(program.key),repoSkillDir=program.mcpServer?.bundle?.skillsDir?resolve(cwd,program.mcpServer.bundle.skillsDir):join6(cwd,"skills",dirName);if(existsSync7(repoSkillDir)&&statSync(repoSkillDir).isDirectory()){let targetDir=join6(pluginRoot,"skills",dirName);mkdirSync5(join6(targetDir,".."),{recursive:!0}),cpSync(repoSkillDir,targetDir,{recursive:!0})}else{let bundle=generatePluginSkillBundle(program),skillMd=applyPluginSkillHint(program,bundle.skillMd);mkdirSync5(join6(pluginRoot,"skills",bundle.dirName),{recursive:!0}),writeFileSync4(join6(pluginRoot,"skills",bundle.dirName,"SKILL.md"),skillMd)}}function unixUxExtraField(uid,gid){let uidBuf=Buffer.alloc(4);uidBuf.writeUInt32LE(uid>>>0,0);let gidBuf=Buffer.alloc(4);gidBuf.writeUInt32LE(gid>>>0,0);let payload=Buffer.concat([Buffer.from([1,4]),uidBuf,Buffer.from([4]),gidBuf]),header=Buffer.alloc(4);return header.writeUInt16LE(30837,0),header.writeUInt16LE(payload.length,2),Buffer.concat([header,payload])}function unixUpExtraField(unixMode){let payload=Buffer.alloc(5);payload.writeUInt8(1,0),payload.writeUInt32LE(unixMode>>>0,1);let header=Buffer.alloc(4);return header.writeUInt16LE(30805,0),header.writeUInt16LE(payload.length,2),Buffer.concat([header,payload])}function unixExtraFields(unixMode){let{uid,gid}=defaultUnixIds();return Buffer.concat([unixUpExtraField(unixMode),unixUxExtraField(uid,gid)])}function defaultUnixIds(){let uid=typeof process.getuid==="function"?process.getuid():501,gid=typeof process.getgid==="function"?process.getgid():20;return{uid,gid}}function crc32(data){let crc=4294967295;for(let i=0;i<data.length;i++){let byte=data[i];if(byte===void 0)continue;crc^=byte;for(let j=0;j<8;j++)crc=crc>>>1^(crc&1?3988292384:0)}return(crc^4294967295)>>>0}function zipStore(files){let parts=[],central=[],offset=0;for(let file of files){let nameBuf=Buffer.from(file.name,"utf8"),crc=crc32(file.data),unixMode=file.unixMode,extra=unixMode!==void 0?unixExtraFields(unixMode):Buffer.alloc(0),local=Buffer.alloc(30+nameBuf.length+extra.length);local.writeUInt32LE(67324752,0),local.writeUInt16LE(unixMode!==void 0?10:20,4),local.writeUInt16LE(0,6),local.writeUInt16LE(0,8),local.writeUInt16LE(0,10),local.writeUInt16LE(0,12),local.writeUInt32LE(crc,14),local.writeUInt32LE(file.data.length,18),local.writeUInt32LE(file.data.length,22),local.writeUInt32LE(nameBuf.length,26),local.writeUInt16LE(extra.length,28),nameBuf.copy(local,30),extra.copy(local,30+nameBuf.length);let centralHdr=Buffer.alloc(46+nameBuf.length+extra.length);if(centralHdr.writeUInt32LE(33639248,0),centralHdr.writeUInt16LE(unixMode!==void 0?798:20,4),centralHdr.writeUInt16LE(unixMode!==void 0?10:20,6),centralHdr.writeUInt16LE(0,8),centralHdr.writeUInt16LE(0,10),centralHdr.writeUInt16LE(0,12),centralHdr.writeUInt16LE(0,14),centralHdr.writeUInt32LE(crc,16),centralHdr.writeUInt32LE(file.data.length,20),centralHdr.writeUInt32LE(file.data.length,24),centralHdr.writeUInt32LE(nameBuf.length,28),centralHdr.writeUInt16LE(extra.length,30),centralHdr.writeUInt16LE(0,32),centralHdr.writeUInt16LE(0,34),centralHdr.writeUInt16LE(0,36),unixMode!==void 0){let externalAttr=unixMode<<16>>>0;centralHdr.writeUInt32LE(externalAttr,38)}else centralHdr.writeUInt32LE(0,38);centralHdr.writeUInt32LE(offset,42),nameBuf.copy(centralHdr,46),extra.copy(centralHdr,46+nameBuf.length),parts.push(local,file.data),central.push(centralHdr),offset+=local.length+file.data.length}let centralStart=offset,centralBuf=Buffer.concat(central),end=Buffer.alloc(22);return end.writeUInt32LE(101010256,0),end.writeUInt16LE(0,4),end.writeUInt16LE(0,6),end.writeUInt16LE(files.length,8),end.writeUInt16LE(files.length,10),end.writeUInt32LE(centralBuf.length,12),end.writeUInt32LE(centralStart,16),end.writeUInt16LE(0,20),Buffer.concat([...parts,centralBuf,end])}var DIST_DIR="dist",CLAUDE_PLUGIN_DIR="claude-plugin";function defaultClaudePluginPaths(program,cwd=process.cwd()){let binaryName=program.key,dist=join7(cwd,DIST_DIR),name=pluginName(program);return{pluginZipPath:join7(dist,CLAUDE_PLUGIN_DIR,`${name}.zip`),binaryPath:join7(dist,binaryName),binaryName}}function generatePluginManifest(program,_binaryName){let bundle=program.mcpServer?.bundle,manifest={name:pluginName(program),version:program.version,description:program.description,author:defaultAuthor(bundle),mcpServers:".mcp.json"},userConfig=buildProgramUserConfig(program);if(userConfig)manifest.userConfig=userConfig;return manifest}function generatePluginMcpJson(program,binaryName){let mcp={command:`\${CLAUDE_PLUGIN_ROOT}/bin/${binaryName}`,args:["mcp"]},env=buildPluginMcpEnvMapping(program);if(env)mcp.env=env;return{[mcpServerId(program)]:mcp}}function writePluginTree(pluginRoot,program,binaryPath,binaryName,cwd){mkdirSync6(join7(pluginRoot,".claude-plugin"),{recursive:!0}),mkdirSync6(join7(pluginRoot,"bin"),{recursive:!0}),writeFileSync5(join7(pluginRoot,".claude-plugin","plugin.json"),`${JSON.stringify(generatePluginManifest(program,binaryName),null,2)}
160
+ `),writeFileSync5(join7(pluginRoot,".mcp.json"),`${JSON.stringify(generatePluginMcpJson(program,binaryName),null,2)}
161
+ `);let stagedBinary=join7(pluginRoot,"bin",binaryName);cpSync2(binaryPath,stagedBinary),chmodSync(stagedBinary,493),stagePluginSkills(pluginRoot,program,cwd)}function packClaudePlugin(program,opts={}){let cwd=opts.cwd??process.cwd(),defaults=defaultClaudePluginPaths(program,cwd),mcpDefaults=defaultMcpBundlePaths(program,cwd),binaryPath=resolve2(cwd,opts.binaryPath??mcpDefaults.binaryPath),pluginZipPath=resolve2(cwd,defaults.pluginZipPath),binaryName=basename(binaryPath);if(!existsSync8(binaryPath))throw Error(`Binary not found: ${binaryPath}. Build with compile first (expected dist/${program.key}).`);let staging=mkdtempSync(join7(tmpdir(),"claude-plugin-"));try{writePluginTree(staging,program,binaryPath,binaryName,cwd);let zip=zipStore(collectZipEntries(staging));return mkdirSync6(join7(pluginZipPath,".."),{recursive:!0}),writeFileSync5(pluginZipPath,zip),pluginZipPath}finally{rmSync3(staging,{recursive:!0,force:!0})}}import{chmodSync as chmodSync2,cpSync as cpSync3,existsSync as existsSync9,mkdirSync as mkdirSync7,mkdtempSync as mkdtempSync2,rmSync as rmSync4,writeFileSync as writeFileSync6}from"node:fs";import{tmpdir as tmpdir2}from"node:os";import{basename as basename2,join as join8,resolve as resolve3}from"node:path";var DIST_DIR2="dist",CURSOR_PLUGIN_DIR="cursor-plugin";function defaultCursorPluginPaths(program,cwd=process.cwd()){let binaryName=program.key,dist=join8(cwd,DIST_DIR2),name=pluginName(program);return{pluginZipPath:join8(dist,CURSOR_PLUGIN_DIR,`${name}.zip`),binaryPath:join8(dist,binaryName),binaryName}}function generateCursorPluginManifest(program,_binaryName){let bundle=program.mcpServer?.bundle,manifest={name:pluginName(program),version:program.version,description:program.description,author:defaultAuthor(bundle)};if(bundle?.displayName)manifest.displayName=bundle.displayName;if(bundle?.homepage)manifest.homepage=bundle.homepage;if(bundle?.repository)manifest.repository=bundle.repository;if(bundle?.license)manifest.license=bundle.license;let variables=buildCursorPluginVariables(program);if(variables)manifest.variables=variables;return manifest}function generateCursorPluginMcpJson(program,binaryName){let mcp={command:`\${CURSOR_PLUGIN_ROOT}/bin/${binaryName}`,args:["mcp"]},env=buildCursorPluginMcpEnvMapping(program);if(env)mcp.env=env;return{mcpServers:{[mcpServerId(program)]:mcp}}}function writePluginTree2(pluginRoot,program,binaryPath,binaryName,cwd){mkdirSync7(join8(pluginRoot,".cursor-plugin"),{recursive:!0}),mkdirSync7(join8(pluginRoot,"bin"),{recursive:!0}),writeFileSync6(join8(pluginRoot,".cursor-plugin","plugin.json"),`${JSON.stringify(generateCursorPluginManifest(program,binaryName),null,2)}
162
+ `),writeFileSync6(join8(pluginRoot,"mcp.json"),`${JSON.stringify(generateCursorPluginMcpJson(program,binaryName),null,2)}
163
+ `);let stagedBinary=join8(pluginRoot,"bin",binaryName);cpSync3(binaryPath,stagedBinary),chmodSync2(stagedBinary,493),stagePluginSkills(pluginRoot,program,cwd)}function packCursorPlugin(program,opts={}){let cwd=opts.cwd??process.cwd(),defaults=defaultCursorPluginPaths(program,cwd),mcpDefaults=defaultMcpBundlePaths(program,cwd),binaryPath=resolve3(cwd,opts.binaryPath??mcpDefaults.binaryPath),pluginZipPath=resolve3(cwd,defaults.pluginZipPath),binaryName=basename2(binaryPath);if(!existsSync9(binaryPath))throw Error(`Binary not found: ${binaryPath}. Build with compile first (expected dist/${program.key}).`);let staging=mkdtempSync2(join8(tmpdir2(),"cursor-plugin-"));try{writePluginTree2(staging,program,binaryPath,binaryName,cwd);let zip=zipStore(collectZipEntries(staging));return mkdirSync7(join8(pluginZipPath,".."),{recursive:!0}),writeFileSync6(pluginZipPath,zip),pluginZipPath}finally{rmSync4(staging,{recursive:!0,force:!0})}}var MANIFEST_VERSION="0.3",DIST_DIR3="dist";function defaultMcpBundlePaths(program,cwd=process.cwd()){let binaryName=program.key,dist=join9(cwd,DIST_DIR3);return{binaryName,binaryPath:join9(dist,binaryName),outPath:join9(dist,`${binaryName}.mcpb`)}}function buildUserConfig(program){return buildProgramUserConfig(program)}function defaultAuthor2(bundle){return bundle?.author??{name:"Unknown"}}function generateMcpManifest(program,binaryName){let bundle=program.mcpServer?.bundle,tools=collectMcpTools(program).map((t)=>({name:t.name,description:t.description.split(`
164
+ `)[0]??t.description})),manifest={manifest_version:MANIFEST_VERSION,name:mcpServerId(program),version:program.version,description:program.description,author:defaultAuthor2(bundle),server:{type:"binary",entry_point:binaryName,mcp_config:{command:`\${__dirname}/${binaryName}`,args:["mcp"]}},tools,tools_generated:!1,compatibility:{claude_desktop:">=0.10.0",platforms:["darwin"]}},longDescription=bundle?.longDescription??program.description;if(longDescription!==program.description)manifest.long_description=longDescription;let userConfig=buildUserConfig(program);if(userConfig)manifest.user_config=userConfig;if(bundle?.icon)manifest.icon=basename3(bundle.icon);return manifest}function packMcpBundle(program,opts={}){let cwd=opts.cwd??process.cwd(),defaults=defaultMcpBundlePaths(program,cwd),binaryPath=resolve4(cwd,opts.binaryPath??defaults.binaryPath),outPath=resolve4(cwd,opts.outPath??defaults.outPath),binaryName=basename3(binaryPath);if(!existsSync10(binaryPath))throw Error(`Binary not found: ${binaryPath}. Build with compile first (expected dist/${program.key}).`);let staging=mkdtempSync3(join9(tmpdir3(),"mcpb-"));try{let stagedBinary=join9(staging,binaryName);cpSync4(binaryPath,stagedBinary),chmodSync3(stagedBinary,493);let manifest=generateMcpManifest(program,binaryName),files=[{name:"manifest.json",data:Buffer.from(`${JSON.stringify(manifest,null,2)}
165
+ `,"utf8")},{name:binaryName,data:readFileSync4(stagedBinary)}],iconRel=program.mcpServer?.bundle?.icon;if(iconRel){let iconSrc=resolve4(cwd,iconRel);if(!existsSync10(iconSrc))throw Error(`Bundle icon not found: ${iconRel}`);let iconName=basename3(iconRel);files.push({name:iconName,data:readFileSync4(iconSrc)})}return mkdirSync8(join9(outPath,".."),{recursive:!0}),writeFileSync7(outPath,zipStore(files)),outPath}finally{rmSync5(staging,{recursive:!0,force:!0})}}function runMcpBundle(program){let mcp=program.mcpServer;if(!mcp?.mcpd&&!mcp?.claudePlugin&&!mcp?.cursorPlugin)throw Error("mcp bundle: enable mcpServer.mcpd, mcpServer.claudePlugin, and/or mcpServer.cursorPlugin on the program root.");let lines=[];if(mcp.mcpd)lines.push(packMcpBundle(program));if(mcp.claudePlugin)lines.push(packClaudePlugin(program));if(mcp.cursorPlugin)lines.push(packCursorPlugin(program));process.stdout.write(`${lines.join(`
166
+ `)}
167
+ `)}import{randomUUID as randomUUID3}from"node:crypto";import{format as format2}from"node:util";import{join as join10}from"node:path";function resolveLogFile(program,logFile){if(!logFile)return;if(logFile.startsWith("/")||logFile.startsWith("~"))return logFile;return join10(resolveAppConfigDir(program),logFile)}function resolveHttpServeConfig(program,overrides={}){let http=program.httpServer,obscureUnexpected=overrides.obscureErrors??http?.errors?.obscureUnexpected??!1;return{hostname:overrides.host??http?.host??"127.0.0.1",port:overrides.port??http?.port??3000,trustProxy:overrides.trustProxy??http?.trustProxy??!1,obscureUnexpected,log:{format:overrides.logFormat??program.log?.format??"json",file:resolveLogFile(program,overrides.logFile??program.log?.file),access:overrides.noAccessLog?!1:program.log?.access??!0,errors:program.log?.errors??!0,dev:overrides.dev??!1}}}function resolveMcpServeConfig(program,overrides={}){let mcp=program.mcpServer;return{obscureUnexpected:overrides.obscureErrors??mcp?.errors?.obscureUnexpected??!1,log:{format:overrides.logFormat??program.log?.format??"json",file:resolveLogFile(program,overrides.logFile??program.log?.file),access:program.log?.access??!0,errors:program.log?.errors??!0,dev:overrides.dev??!1}}}function serveOverridesFromOpts(opts,surface){let out={};if(opts.host)out.host=opts.host;if(opts.port){let port=Number(opts.port);if(!Number.isNaN(port))out.port=port}if(opts["trust-proxy"])out.trustProxy=!0;if(opts["obscure-errors"])out.obscureErrors=!0;if(opts["log-format"]==="json"||opts["log-format"]==="text")out.logFormat=opts["log-format"];if(opts["log-file"])out.logFile=opts["log-file"];if(opts["no-access-log"]&&surface==="http")out.noAccessLog=!0;if(opts.dev)out.dev=!0;return out}function identToken(s){return s.replace(/[^a-zA-Z0-9]/g,"_")}function escShellSingleQuoted(s){return s.replace(/'/g,"'\\''")}function escFishSingleQuoted(s){return s.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}function mainName(schemaName){return schemaName.replace(/[^a-zA-Z0-9]/g,"_")}var kHelpLong="--help",kHelpShort="-h";function emitConsumeLong(ident,scopes){let o="_${ident}_nac_consume_long() {\n".replace("${ident}",ident);o+=` local sid="$1" w="$2" nw="$3"
168
+ `,o+=` case $sid in
169
+ `;for(let[i,sc]of scopes.entries()){o+=` ${i})
170
+ `,o+=` case $w in
171
+ `,o+=" "+kHelpLong+"|${kHelpLong}=*|${kHelpShort}) echo 1 ;;\n".replace(/\$\{kHelpLong\}/g,kHelpLong).replace(/\$\{kHelpShort\}/g,kHelpShort);for(let op of sc.opts){let base=`--${op.name}`;if(op.kind==="presence")o+=` ${base}${"|${base}=*) echo 1 ;;\n".replace(/\$\{base\}/g,base)}`;else o+=` ${base}=*) echo 1 ;;
172
+ `,o+=` ${base}) echo 2 ;;
173
+ `}o+=` *) echo 0 ;;
174
+ `,o+=` esac
175
+ `,o+=` ;;
176
+ `}return o+=` *) echo 0 ;;
177
+ `,o+=` esac
178
+ `,o+=`}
179
+ `,o}function emitConsumeShort(ident,scopes,dialect){let firstChar=dialect==="bash"?"ch=${rest:0:1}":"ch=${rest[1,1]}",restAdvance=dialect==="bash"?"rest=${rest:1}":"rest=${rest[2,-1]}",o="_${ident}_nac_consume_short() {\n".replace("${ident}",ident);o+=` local sid="$1" w="$2"
180
+ `,o+=` case $sid in
181
+ `;for(let[i,sc]of scopes.entries()){o+=` ${i})
182
+ `,o+=" local rest=${w#-}\n",o+=` local ch
183
+ `,o+=` local saw=0
184
+ `,o+=` while [[ -n $rest ]]; do
185
+ `,o+=` ${firstChar}
186
+ `,o+=` ${restAdvance}
187
+ `,o+=` case $ch in
188
+ `;let boolChars="";for(let op of sc.opts){if(!op.shortName)continue;if(op.kind==="presence")boolChars+=`${op.shortName}|`;else o+=` ${op.shortName})
189
+ `,o+=` if [[ $saw -ne 0 || -n $rest ]]; then echo 0; return; fi
190
+ `,o+=` echo 2; return ;;
191
+ `}if(boolChars.length>0)boolChars=boolChars.slice(0,-1),o+=` ${boolChars}) ;;
192
+ `;o+=` *) echo 0; return ;;
193
+ `,o+=` esac
194
+ `,o+=` saw=1
195
+ `,o+=` done
196
+ `,o+=` echo 1
197
+ `,o+=` ;;
198
+ `}return o+=` *) echo 0 ;;
199
+ `,o+=` esac
200
+ `,o+=`}
201
+ `,o}function emitMatchChild(ident,scopes,pathIndex){let o="_${ident}_nac_match_child() {\n".replace("${ident}",ident);o+=` local sid="$1" w="$2"
202
+ `,o+=` case $sid in
203
+ `;for(let[sid,sc]of scopes.entries()){if(sc.kids.length===0)continue;o+=` ${sid})
204
+ `,o+=` case $w in
205
+ `;for(let ch of sc.kids){if(ch.key.startsWith(":"))continue;let childPath=sc.path===""?ch.key:`${sc.path}/${ch.key}`,cid=pathIndex[childPath]??0;o+=` ${ch.key}) echo ${cid}; return 0 ;;
206
+ `}let paramChild=sc.kids.find((ch)=>ch.key.startsWith(":"));if(paramChild){let childPath=sc.path===""?paramChild.key:`${sc.path}/${paramChild.key}`,cid=pathIndex[childPath]??0;o+=` *) echo ${cid}; return 0 ;;
207
+ `}o+=` esac
208
+ `,o+=` ;;
209
+ `}return o+=` esac
210
+ `,o+=` return 1
211
+ `,o+=`}
212
+ `,o}function hasPositionalArguments(cmd){return isCliLeaf(cmd)&&(cmd.positionals??[]).length>0}function walkScopes(cmdPath,cmd,acc){let kids=isCliRouter(cmd)?cmd.commands:[];acc.push({kids,opts:cmd.options??[],path:cmdPath,wantsFiles:hasPositionalArguments(cmd)});for(let ch of kids){let nextPath=cmdPath===""?ch.key:`${cmdPath}/${ch.key}`;walkScopes(nextPath,ch,acc)}}function collectScopes(schema){let acc=[];acc.push({kids:schema.commands??[],opts:schema.options??[],path:"",wantsFiles:!1});for(let c of schema.commands??[])walkScopes(c.key,c,acc);return acc}function emitSimulate(ident){let o="_${ident}_nac_simulate() {\n".replace("${ident}",ident);return o+=` local i=1 sid=0 w steps next
213
+ `,o+=` while (( i < COMP_CWORD )); do
214
+ `,o+=' w="${COMP_WORDS[i]}"\n',o+=` if [[ $w == ${kHelpShort} || $w == ${kHelpLong} ]]; then
215
+ `,o+=` ((i++)); continue
216
+ `,o+=` fi
217
+ `,o+=` if [[ $w == --* ]]; then
218
+ `,o+=' steps=$(_${ident}_nac_consume_long "$sid" "$w" "${COMP_WORDS[i+1]}")\n'.replace("${ident}",ident),o+=` case $steps in
219
+ `,o+=` 0) break ;;
220
+ `,o+=` 1) ((i++)) ;;
221
+ `,o+=` 2) ((i+=2)) ;;
222
+ `,o+=` *) break ;;
223
+ `,o+=` esac
224
+ `,o+=` continue
225
+ `,o+=` fi
226
+ `,o+=` if [[ $w == -* ]]; then
227
+ `,o+=' steps=$(_${ident}_nac_consume_short "$sid" "$w")\n'.replace("${ident}",ident),o+=` case $steps in
228
+ `,o+=` 0) break ;;
229
+ `,o+=` 1) ((i++)) ;;
230
+ `,o+=` 2) ((i++)); break ;;
231
+ `,o+=` *) break ;;
232
+ `,o+=` esac
233
+ `,o+=` continue
234
+ `,o+=` fi
235
+ `,o+=' next=$(_${ident}_nac_match_child "$sid" "$w") || break\n'.replace("${ident}",ident),o+=` sid=$next
236
+ `,o+=` ((i++))
237
+ `,o+=` done
238
+ `,o+=` REPLY_SID=$sid
239
+ `,o+=`}
240
+ `,o}function emitEnumReplyBash(ident,scopes){let o="_${ident}_nac_enum_reply() {\n".replace("${ident}",ident);o+=` local sid="$1" prev="$2" cur="$3"
241
+ `,o+=` case $sid in
242
+ `;for(let[i,sc]of scopes.entries()){let enumOpts=sc.opts.filter((op)=>op.kind==="enum"&&(op.choices?.length??0)>0);if(enumOpts.length===0)continue;o+=` ${i})
243
+ `,o+=` case $prev in
244
+ `;for(let op of enumOpts){let words=(op.choices??[]).map((c)=>escShellSingleQuoted(c)).join(" ");o+=` --${op.name}) COMPREPLY=( $(compgen -W '${words}' -- "$cur") ); return 0 ;;
245
+ `}o+=` esac
246
+ `,o+=` ;;
247
+ `}return o+=` esac
248
+ `,o+=` return 1
249
+ `,o+=`}
250
+ `,o}function emitMainBodyBash(schema,ident){let main=mainName(schema.key),o="_${main}() {\n".replace("${main}",main);return o+=' local cur="${COMP_WORDS[COMP_CWORD]}"\n',o+=' local prev="${COMP_WORDS[COMP_CWORD-1]:-}"\n',o+=" _${ident}_nac_simulate\n".replace("${ident}",ident),o+=` local sid=$REPLY_SID
251
+ `,o+=' if _${ident}_nac_enum_reply "$sid" "$prev" "$cur"; then return; fi\n'.replace("${ident}",ident),o+=` if [[ $cur == -* ]]; then
252
+ `,o+=' local oname="A_${ident}_${sid}_opts"\n'.replace("${ident}",ident),o+=` local -a optsarr
253
+ `,o+=` local -n optsref="$oname"
254
+ `,o+=' COMPREPLY=( $(compgen -W "${optsref[*]}" -- "$cur") )\n',o+=` else
255
+ `,o+=' local lname="A_${ident}_${sid}_leaf"\n'.replace("${ident}",ident),o+=` local -n leafref="$lname"
256
+ `,o+=` if [[ $leafref -eq 0 ]]; then
257
+ `,o+=' local cname="A_${ident}_${sid}_cmds"\n'.replace("${ident}",ident),o+=` local -a cmdsarr
258
+ `,o+=` local -n cmdsref="$cname"
259
+ `,o+=' COMPREPLY=( $(compgen -W "${cmdsref[*]}" -- "$cur") )\n',o+=` else
260
+ `,o+=' local pname="A_${ident}_${sid}_pos"\n'.replace("${ident}",ident),o+=` local -n posref="$pname"
261
+ `,o+=` if [[ $posref -eq 1 ]]; then
262
+ `,o+=` compopt -o filenames
263
+ `,o+=` fi
264
+ `,o+=` fi
265
+ `,o+=` fi
266
+ `,o+=`}
267
+
268
+ `,o+="complete -F _${main} ${schema.key}\n".replace("${main}",main).replace("${schema.key}",schema.key),o}function completionBashScript(schema){let ident=identToken(schema.key),scopes=collectScopes(schema),pathIndex={};for(let[i,s]of scopes.entries())pathIndex[s.path]=i;let out=`# Generated bash completion for ${schema.key}.
269
+
270
+ `;for(let[i,sc]of scopes.entries()){out+=`A_${ident}_${i}_opts=()
271
+ `,out+=`A_${ident}_${i}_opts+=('${kHelpLong}' '${kHelpShort}')
272
+ `;for(let o of sc.opts)if(out+=`A_${ident}_${i}_opts+=('--${o.name}')
273
+ `,o.shortName)out+=`A_${ident}_${i}_opts+=('-${o.shortName}')
274
+ `;if(out+=`A_${ident}_${i}_leaf=${sc.kids.length===0?"1":"0"}
275
+ `,out+=`A_${ident}_${i}_pos=${sc.wantsFiles?"1":"0"}
276
+ `,sc.kids.length>0){out+=`A_${ident}_${i}_cmds=(`;for(let ch of sc.kids)out+=` '${ch.key}'`;out+=`)
277
+ `}}return out+=emitConsumeLong(ident,scopes),out+=emitConsumeShort(ident,scopes,"bash"),out+=emitMatchChild(ident,scopes,pathIndex),out+=emitSimulate(ident),out+=emitEnumReplyBash(ident,scopes),out+=emitMainBodyBash(schema,ident),out}function scopeCondition(ident,scopeIndex,path){let body=`function ${`__${ident}_scope_${scopeIndex}`}
278
+ `;if(body+=` set -l tokens (commandline -opc)
279
+ `,path==="")body+=` test (count $tokens) -eq 0
280
+ `;else{let parts=path.split("/");body+=` test (count $tokens) -eq ${parts.length}
281
+ `;for(let i=0;i<parts.length;i++)body+=` and test $tokens[${i+1}] = ${parts[i]}
282
+ `}return body+=`end
283
+
284
+ `,body}function completionFishScript(schema){let ident=identToken(schema.key),app=schema.key,scopes=collectScopes(schema),out=`# Fish completion for ${app}
285
+
286
+ `;for(let[i,sc]of scopes.entries()){out+=scopeCondition(ident,i,sc.path);let cond=`__${ident}_scope_${i}`;for(let ch of sc.kids)out+=`complete -c ${app} -n '${cond}' -a '${escFishSingleQuoted(ch.key)}' -d '${escFishSingleQuoted(ch.description)}'
287
+ `;out+=`complete -c ${app} -n '${cond}' -s h -l help -d '${escFishSingleQuoted("Show help for this command.")}'
288
+ `;for(let op of sc.opts)if(op.kind==="presence"){let shortPart=op.shortName?`-s ${op.shortName} `:"";out+=`complete -c ${app} -n '${cond}' ${shortPart}-l ${op.name} -d '${escFishSingleQuoted(op.description)}'
289
+ `}else if(op.kind==="enum"&&(op.choices?.length??0)>0){let shortPart=op.shortName?`-s ${op.shortName} `:"";out+=`complete -c ${app} -n '${cond}' ${shortPart}-l ${op.name} -d '${escFishSingleQuoted(op.description)}'
290
+ `;let enumCond=`${cond}; and __fish_seen_argument -l ${op.name}`;for(let choice of op.choices??[])out+=`complete -c ${app} -n '${enumCond}' -a '${escFishSingleQuoted(choice)}'
291
+ `}else{let shortPart=op.shortName?`-s ${op.shortName} `:"";out+=`complete -c ${app} -n '${cond}' ${shortPart}-l ${op.name} -d '${escFishSingleQuoted(op.description)}' -r
292
+ `}if(sc.wantsFiles&&sc.kids.length===0)out+=`complete -c ${app} -n '${cond}' -F
293
+ `}return out}function emitScopeArraysZsh(ident,scopes){let out="";for(let[i,sc]of scopes.entries()){out+=`typeset -g A_${ident}_${i}_opts
294
+ `,out+=`A_${ident}_${i}_opts=(`,out+="'"+escShellSingleQuoted(kHelpLong)+":"+escShellSingleQuoted("Show help for this command.")+"' '"+escShellSingleQuoted(kHelpShort)+":"+escShellSingleQuoted("Show help for this command.")+"'";for(let o of sc.opts)if(out+=` '${escShellSingleQuoted(`--${o.name}`)}:${escShellSingleQuoted(o.description)}'`,o.shortName)out+=` '${escShellSingleQuoted(`-${o.shortName}`)}:${escShellSingleQuoted(o.description)}'`;if(out+=`)
295
+ `,out+=`typeset -g A_${ident}_${i}_leaf=${sc.kids.length===0?"1":"0"}
296
+ `,out+=`typeset -g A_${ident}_${i}_pos=${sc.wantsFiles?"1":"0"}
297
+ `,sc.kids.length>0){out+=`typeset -g A_${ident}_${i}_cmds=(`;for(let ch of sc.kids)out+=` '${escShellSingleQuoted(ch.key)}:${escShellSingleQuoted(ch.description)}'`;out+=`)
298
+ `}}return out}function emitSimulateZsh(ident){let o="_${ident}_nac_simulate() {\n".replace("${ident}",ident);return o+=` local i=2 sid=0 w steps next
299
+ `,o+=` while (( i < CURRENT )); do
300
+ `,o+=` w=$words[i]
301
+ `,o+=` if [[ $w == ${kHelpShort} || $w == ${kHelpLong} ]]; then
302
+ `,o+=` ((i++)); continue
303
+ `,o+=` fi
304
+ `,o+=` if [[ $w == --* ]]; then
305
+ `,o+=' steps=$(_${ident}_nac_consume_long "$sid" "$w" "${words[i+1]}")\n'.replace("${ident}",ident),o+=` case $steps in
306
+ `,o+=` 0) break ;;
307
+ `,o+=` 1) ((i++)) ;;
308
+ `,o+=` 2) ((i+=2)) ;;
309
+ `,o+=` *) break ;;
310
+ `,o+=` esac
311
+ `,o+=` continue
312
+ `,o+=` fi
313
+ `,o+=` if [[ $w == -* ]]; then
314
+ `,o+=' steps=$(_${ident}_nac_consume_short "$sid" "$w")\n'.replace("${ident}",ident),o+=` case $steps in
315
+ `,o+=` 0) break ;;
316
+ `,o+=` 1) ((i++)) ;;
317
+ `,o+=` 2) ((i++)); break ;;
318
+ `,o+=` *) break ;;
319
+ `,o+=` esac
320
+ `,o+=` continue
321
+ `,o+=` fi
322
+ `,o+=' next=$(_${ident}_nac_match_child "$sid" "$w") || break\n'.replace("${ident}",ident),o+=` sid=$next
323
+ `,o+=` ((i++))
324
+ `,o+=` done
325
+ `,o+=` REPLY_SID=$sid
326
+ `,o+=`}
327
+ `,o}function emitEnumReplyZsh(ident,scopes){let o="_${ident}_nac_enum_reply() {\n".replace("${ident}",ident);o+=` local sid=$1 prev=$2
328
+ `,o+=` case $sid in
329
+ `;for(let[i,sc]of scopes.entries()){let enumOpts=sc.opts.filter((op)=>op.kind==="enum"&&(op.choices?.length??0)>0);if(enumOpts.length===0)continue;o+=` ${i})
330
+ `,o+=` case $prev in
331
+ `;for(let op of enumOpts){let vals=(op.choices??[]).map((c)=>escShellSingleQuoted(c)).join(" ");o+=` --${op.name}) _values ${vals}; return 0 ;;
332
+ `}o+=` esac
333
+ `,o+=` ;;
334
+ `}return o+=` esac
335
+ `,o+=` return 1
336
+ `,o+=`}
337
+ `,o}function emitMainBodyZsh(schema,ident){let main=mainName(schema.key),o="_${main}() {\n".replace("${main}",main);return o+=` local curcontext="$curcontext" ret=1
338
+ `,o+=" _${ident}_nac_simulate\n".replace("${ident}",ident),o+=` local sid=$REPLY_SID
339
+ `,o+=' if _${ident}_nac_enum_reply "$sid" "$words[CURRENT-1]"; then return 0; fi\n'.replace("${ident}",ident),o+=` if [[ $PREFIX == -* ]]; then
340
+ `,o+=` local -a optsarr
341
+ `,o+=' local oname="A_${ident}_${sid}_opts"\n'.replace("${ident}",ident),o+=" optsarr=(${(@P)oname})\n",o+=` _describe -t options 'option' optsarr && ret=0
342
+ `,o+=` else
343
+ `,o+=' local lname="A_${ident}_${sid}_leaf"\n'.replace("${ident}",ident),o+=" if [[ ${(P)lname} -eq 0 ]]; then\n",o+=` local -a cmdsarr
344
+ `,o+=' local cname="A_${ident}_${sid}_cmds"\n'.replace("${ident}",ident),o+=" cmdsarr=(${(@P)cname})\n",o+=` _describe -t commands 'command' cmdsarr && ret=0
345
+ `,o+=` else
346
+ `,o+=' local pname="A_${ident}_${sid}_pos"\n'.replace("${ident}",ident),o+=" if [[ ${(P)pname} -eq 1 ]]; then\n",o+=` _files && ret=0
347
+ `,o+=` fi
348
+ `,o+=` fi
349
+ `,o+=` fi
350
+ `,o+=` return ret
351
+ `,o+=`}
352
+
353
+ `,o+="compdef _${main} ${schema.key}\n".replace("${main}",main).replace("${schema.key}",schema.key),o}function completionZshScript(schema){let ident=identToken(schema.key),scopes=collectScopes(schema),pathIndex={};for(let[i,s]of scopes.entries())pathIndex[s.path]=i;let out=`#compdef ${schema.key}
354
+
355
+ `;return out+=emitScopeArraysZsh(ident,scopes),out+=emitConsumeLong(ident,scopes),out+=emitConsumeShort(ident,scopes,"zsh"),out+=emitMatchChild(ident,scopes,pathIndex),out+=emitSimulateZsh(ident),out+=emitEnumReplyZsh(ident,scopes),out+=emitMainBodyZsh(schema,ident),out}function parseBuiltins(program,caps){return resolveBuiltins(program,caps)}function presentationBuiltins(program,caps){return parseBuiltins(program,caps).filter((b)=>!isCliHidden(b))}function cliParseRoot(program){let caps=resolveCapabilities(program),builtins=parseBuiltins(program,caps);if(isCliLeaf(program))return{key:program.key,description:program.description,notes:program.notes,options:program.options,commands:builtins};return{key:program.key,description:program.description,notes:program.notes,options:program.options,fallbackCommand:program.fallbackCommand,fallbackMode:program.fallbackMode,commands:[...program.commands,...builtins]}}function cliPresentationRoot(program){let caps=resolveCapabilities(program),builtins=presentationBuiltins(program,caps),notes=presentationRootNotes(program,caps);if(isCliLeaf(program))return{key:program.key,description:program.description,notes,options:visibleOptions(program.options),commands:builtins};let userCommands=program.commands.map((ch)=>presentationNode(ch)).filter((ch)=>ch!==null);return{key:program.key,description:program.description,notes,options:visibleOptions(program.options),fallbackCommand:program.fallbackCommand,fallbackMode:program.fallbackMode,commands:[...userCommands,...builtins]}}function presentationRootNotes(program,_caps){let parts=[];if((program.notes??"").trim().length>0)parts.push((program.notes??"").trim());if(parts.length===0)return;return parts.join(`
356
+
357
+ `)}function completionSchema(program,opts){if(opts.isLeafCompletionIntercept)return cliPresentationRoot(program);return opts.parseRoot}async function dispatchBuiltin(program,pr,opts){if(pr.kind!=="ok")return;let caps=resolveCapabilities(program);if(pr.path[0]==="completion"){if(!caps.completion)process.stderr.write(capabilityDeniedMessage("completion")),process.exit(1);let schemaForCompletion=completionSchema(program,opts);if(pr.path[1]==="bash")process.stdout.write(completionBashScript(schemaForCompletion)),process.exit(0);if(pr.path[1]==="zsh")process.stdout.write(completionZshScript(schemaForCompletion)),process.exit(0);if(pr.path[1]==="fish")process.stdout.write(completionFishScript(schemaForCompletion)),process.exit(0);return}if(pr.path[0]==="version"){if(pr.path.length!==1)process.stderr.write(`Unknown subcommand: version ${pr.path.slice(1).join(" ")}
358
+ `),process.exit(1);process.stdout.write(`${program.version}
359
+ `),process.exit(0)}if(pr.path[0]==="http"){if(!caps.http)process.stderr.write(capabilityDeniedMessage("http")),process.exit(1);let sub=pr.path[1];if(pr.path.length===1||sub==="serve")await new Cli(program).serveHttp(serveOverridesFromOpts(pr.opts,"http")),process.exit(0);process.stderr.write(`Unknown subcommand: http ${pr.path.slice(1).join(" ")}
360
+ `),process.exit(1)}if(pr.path[0]==="mcp"){if(!caps.mcp)process.stderr.write(capabilityDeniedMessage("mcp")),process.exit(1);let sub=pr.path[1];if(pr.path.length===1||sub==="serve")await new Cli(program).serveMcp(serveOverridesFromOpts(pr.opts,"mcp")),process.exit(0);if(pr.path.length===2&&sub==="bundle"){try{runMcpBundle(program)}catch(err){process.stderr.write(err instanceof Error?`${err.message}
361
+ `:`mcp bundle failed.
362
+ `),process.exit(1)}process.exit(0)}process.stderr.write(`Unknown subcommand: mcp ${pr.path.slice(1).join(" ")}
363
+ `),process.exit(1)}if(pr.path[0]==="configure"){if(!caps.configure)process.stderr.write(capabilityDeniedMessage("configure")),process.exit(1);if(isConfigureConfigPath(pr.path))return}}function builtinInterceptRoot(program,argv){if(!isCliLeaf(program)||argv.length<1)return{parseRoot:program,isLeafCompletionIntercept:!1};let caps=resolveCapabilities(program),first=argv[0];if(first==="completion")return{parseRoot:{key:program.key,description:program.description,commands:[cliBuiltinCompletionGroup(program)]},isLeafCompletionIntercept:!0};if(first==="configure"&&caps.configure)return{parseRoot:{key:program.key,description:program.description,commands:[cliBuiltinConfigureCommand(program)]},isLeafCompletionIntercept:!1};if(first==="http"&&caps.http)return{parseRoot:{key:program.key,description:program.description,commands:[cliBuiltinHttpCommand(program)]},isLeafCompletionIntercept:!1};if(first==="mcp"&&caps.mcp)return{parseRoot:{key:program.key,description:program.description,commands:[cliBuiltinMcpCommand(program)]},isLeafCompletionIntercept:!1};if(first==="version")return{parseRoot:{key:program.key,description:program.description,commands:[cliBuiltinVersionCommand()]},isLeafCompletionIntercept:!1};let docsGroup=cliBuiltinDocsGroupIfEnabled(program);if(first==="docs"&&docsGroup)return{parseRoot:{key:program.key,description:program.description,commands:[docsGroup]},isLeafCompletionIntercept:!1};return{parseRoot:program,isLeafCompletionIntercept:!1}}function validateDocsConfig(docs){let topics=docs.topics??{},keys=Object.keys(topics);for(let reserved of DOCS_BUILTIN_TOPIC_KEYS)if(reserved in topics)throw new CliSchemaValidationError(`docs.topics key '${reserved}' is reserved for the docs built-in`);for(let key of keys){let text=topics[key]?.text;if(text===void 0||text.length===0)throw new CliSchemaValidationError(`docs.topics['${key}'].text must be non-empty`)}}function validateConfigBlock(appConfigBlock){let entries=appConfigBlock.entries;if(typeof entries!=="object"||entries===null||Array.isArray(entries))throw new CliSchemaValidationError("program.appConfig.entries must be an object");let envNames=new Set;for(let[key,entry]of Object.entries(entries)){if(key.length===0)throw new CliSchemaValidationError("program.appConfig.entries keys must be non-empty strings");if(entry===void 0||typeof entry!=="object")throw new CliSchemaValidationError(`program.appConfig.entries['${key}'] must be an object`);let description=entry.description;if(typeof description!=="string"||description.trim().length===0)throw new CliSchemaValidationError(`program.appConfig.entries['${key}'].description must be a non-empty string`);if(entry.env!==void 0){if(typeof entry.env!=="string"||entry.env.length===0)throw new CliSchemaValidationError(`program.appConfig.entries['${key}'].env must be a non-empty string when set`);if(envNames.has(entry.env))throw new CliSchemaValidationError(`Duplicate program.appConfig env mapping: ${entry.env}`);envNames.add(entry.env)}if(entry.resolve!==void 0&&typeof entry.resolve!=="function")throw new CliSchemaValidationError(`program.appConfig.entries['${key}'].resolve must be a function when set`)}let jsonSchema=appConfigBlock.jsonSchema;if(jsonSchema!==void 0){if(typeof jsonSchema!=="object"||jsonSchema===null||Array.isArray(jsonSchema))throw new CliSchemaValidationError("program.appConfig.jsonSchema must be a JSON Schema object (not null or an array)");let properties=jsonSchema.properties;if(properties!==void 0){if(typeof properties!=="object"||properties===null||Array.isArray(properties))throw new CliSchemaValidationError("program.appConfig.jsonSchema.properties must be an object when set");for(let key of Object.keys(entries))if(!(key in properties))throw new CliSchemaValidationError(`program.appConfig.entries key '${key}' is missing from jsonSchema.properties`)}}}function validateConfigureConfig(program){let configure=program.configure;if(!configure)return;if("prefix"in configure)throw new CliSchemaValidationError("configure.prefix removed; app binary installs via Homebrew");if("agentIntegration"in configure)throw new CliSchemaValidationError("configure.agentIntegration removed; skills are authored under skills/<app>/SKILL.md");if(!configure.targets)return;let targets=configure.targets;if("allSkills"in targets||"allMcps"in targets)throw new CliSchemaValidationError("configure.targets.allSkills/allMcps removed; use per-key targets");let legacySkillKeys=["cursorSkill","claudeSkill","codexSkill","opencodeSkill","openclawSkill"];for(let key of legacySkillKeys)if(key in targets)throw new CliSchemaValidationError(`configure.targets.${key} removed; skills are authored under skills/<app>/SKILL.md`);let legacyMcpKeys=["cursorMcp","claudeCodeMcp","claudeDesktopMcp","codexMcp","chatgptMcp","openclawMcp","opencodeMcp","agentsMcp"];for(let key of legacyMcpKeys)if(key in targets)throw new CliSchemaValidationError(`configure.targets.${key} removed; MCP installs to ~/.agents/mcp.json when mcpServer.enabled`);let allowedKeys=new Set(["app","configure"]);for(let key of Object.keys(targets))if(!allowedKeys.has(key))throw new CliSchemaValidationError(`configure.targets.${key} is not a valid target key`)}function cliValidateProgram(program){if(!program.version||program.version.trim().length===0)throw new CliSchemaValidationError("CliProgram.version is required");if(program.mcpServer!==void 0&&program.mcpServer.enabled!==!0)throw new CliSchemaValidationError("mcpServer requires enabled: true; omit mcpServer to disable MCP");if(program.mcpServer?.instructions!==void 0&&program.mcpServer.instructions.trim().length===0)throw new CliSchemaValidationError("mcpServer.instructions must not be empty; omit it instead");if(program.httpServer!==void 0&&program.httpServer.enabled!==!0)throw new CliSchemaValidationError("httpServer requires enabled: true; omit httpServer to disable HTTP API");if(validateHttpPathPrefix(program),docsEnabled(program)&&program.docs?.topics!==void 0)validateDocsConfig(program.docs);if(program.appConfig!==void 0)validateConfigBlock(program.appConfig);if(program.configure!==void 0)validateConfigureConfig(program);let caps=resolveCapabilities(program),reserved=reservedCommandNames(caps);if(isCliRouter(program)){for(let child of program.commands)if(reserved.includes(child.key))throw new CliSchemaValidationError(`Reserved command name: ${child.key}`)}if(walkNode(program,program,!0),caps.mcp)validateMcpToolSchemas(program)}var SCHEMA_DATA_KEYWORDS=new Set(["const","default","enum","examples"]);function collectSchemaRefs(node,out){if(Array.isArray(node))for(let item of node)collectSchemaRefs(item,out);else if(typeof node==="object"&&node!==null){for(let[key,value]of Object.entries(node))if(key==="$ref"&&typeof value==="string")out.push(value);else if(!SCHEMA_DATA_KEYWORDS.has(key))collectSchemaRefs(value,out)}return out}function validateMcpToolSchemas(program){for(let tool of collectMcpTools(program)){let schemas=[{label:"inputSchema",schema:tool.inputSchema,wrapped:tool.inputWrapped},{label:"outputSchema",schema:tool.outputSchema,wrapped:tool.outputWrapped}];for(let{label,schema,wrapped}of schemas){if(schema===void 0)continue;for(let ref of collectSchemaRefs(schema,[])){if(ref==="#"&&wrapped)throw new CliSchemaValidationError(`MCP tool "${tool.name}" ${label} uses $ref "#" but its root is not type "object", so MCP wraps it; reference a named definition instead`);if(ref.startsWith("#/")&&resolveJsonPointer(schema,ref)===void 0)throw new CliSchemaValidationError(`MCP tool "${tool.name}" ${label} has an unresolved $ref: ${ref}`)}}}}var PARAM_ROUTER_KEY=/^:[a-zA-Z][a-zA-Z0-9_]*$/;function isParamRouterKey3(key){return key.startsWith(":")}function validateHttpPathPrefix(program){if(!program.httpServer?.enabled)return;let raw=program.httpServer.pathPrefix;if(raw!==void 0&&raw!==""){if(!raw.startsWith("/"))throw new CliSchemaValidationError(`httpServer.pathPrefix must start with / (got ${JSON.stringify(raw)})`);if(raw.length>1&&raw.endsWith("/"))throw new CliSchemaValidationError(`httpServer.pathPrefix must not end with / (got ${JSON.stringify(raw)})`);if(raw.includes("//"))throw new CliSchemaValidationError("httpServer.pathPrefix must not contain //");if(raw==="/health"||raw==="/swagger"||raw==="/openapi.json"||raw==="/tools")throw new CliSchemaValidationError(`httpServer.pathPrefix must not be a framework path (got ${JSON.stringify(raw)})`);return}if(!isCliRouter(program)){if(isCliLeaf(program)&&HTTP_RESERVED_TOP_LEVEL_SEGMENTS.has(program.key))throw new CliSchemaValidationError(`Reserved HTTP program key when httpServer.pathPrefix is empty: ${program.key}`);return}for(let child of program.commands)if(HTTP_RESERVED_TOP_LEVEL_SEGMENTS.has(child.key))throw new CliSchemaValidationError(`Reserved HTTP command name when httpServer.pathPrefix is empty: ${child.key} (set httpServer.pathPrefix or rename)`)}function walkNode(node,program,isRoot){if(!isRoot){let rogue=node;if(rogue.mcpServer!==void 0)throw new CliSchemaValidationError(`mcpServer is only supported on the program root (not on ${node.key})`);if(rogue.httpServer!==void 0)throw new CliSchemaValidationError(`httpServer is only supported on the program root (not on ${node.key})`);if(rogue.configure!==void 0)throw new CliSchemaValidationError(`configure is only supported on the program root (not on ${node.key})`);if(rogue.docs!==void 0)throw new CliSchemaValidationError(`docs is only supported on the program root (not on ${node.key})`);if(rogue.appConfig!==void 0)throw new CliSchemaValidationError(`appConfig is only supported on the program root (not on ${node.key})`)}if(isCliLeaf(node)){if(isRoot&&node.mcpTool!==void 0)throw new CliSchemaValidationError("mcpTool is only supported on leaf commands");if(isDocumentLeaf(node)){let kindStr=`kind: "${node.kind??"document"}"`;if(node.inputSchema===void 0)throw new CliSchemaValidationError(`${kindStr} requires inputSchema on ${node.key}`);if((node.options??[]).length>0)throw new CliSchemaValidationError(`${kindStr} forbids options on ${node.key}`);if((node.positionals??[]).length>0)throw new CliSchemaValidationError(`${kindStr} forbids positionals on ${node.key}`)}let outputSchema=node.outputSchema;if(outputSchema!==void 0&&(typeof outputSchema!=="object"||outputSchema===null||Array.isArray(outputSchema)))throw new CliSchemaValidationError("outputSchema must be a JSON Schema object (not null or an array)");let inputSchema=node.inputSchema;if(inputSchema!==void 0&&(typeof inputSchema!=="object"||inputSchema===null||Array.isArray(inputSchema)))throw new CliSchemaValidationError("inputSchema must be a JSON Schema object (not null or an array)");if(inputSchema!==void 0){let properties=inputSchema.properties;if(properties!==void 0&&(typeof properties!=="object"||properties===null||Array.isArray(properties)))throw new CliSchemaValidationError(`inputSchema.properties must be an object on ${node.key}`);if(properties){for(let opt of node.options??[])if(opt.kind==="json"&&!(opt.name in properties))throw new CliSchemaValidationError(`Json option '${opt.name}' is missing from inputSchema.properties on ${node.key}`)}}}else if(node.mcpTool!==void 0)throw new CliSchemaValidationError(`mcpTool is only supported on leaf commands (not on ${node.key})`);if(isRoot&&program.mcpServer?.enabled===!0&&program.mcpServer.resources){let schemaUri=resolveMcpSchemaUri(program),reserved=new Set([schemaUri,...reservedDocsTopicResourceUris(program)]),uris=program.mcpServer.resources.map((r)=>r.uri);for(let uri of uris)if(reserved.has(uri))throw new CliSchemaValidationError(`mcpServer.resources URI '${uri}' conflicts with ${uri===schemaUri?"built-in schema resource":"auto docs topic resource"}`);if(new Set(uris).size!==uris.length)throw new CliSchemaValidationError("mcpServer.resources URIs must be unique")}if(isCliRouter(node)){if(!isRoot&&(node.options??[]).length>0)throw new CliSchemaValidationError(`Options on routing group '${node.key}' are not supported — declare options on leaf commands`);let seenNames=new Set,paramRouterCount=0;for(let child of node.commands){if(seenNames.has(child.key))throw new CliSchemaValidationError(`Duplicate command name: ${child.key}`);if(seenNames.add(child.key),isParamRouterKey3(child.key)){if(!PARAM_ROUTER_KEY.test(child.key))throw new CliSchemaValidationError(`Param router key '${child.key}' must match :[a-zA-Z][a-zA-Z0-9_]* on '${node.key}'`);if(!isCliRouter(child))throw new CliSchemaValidationError(`Param router '${child.key}' must be a router with subcommands`);paramRouterCount++}}if(paramRouterCount>1)throw new CliSchemaValidationError(`At most one param router per level on '${node.key}'`);if(node.fallbackMode!==void 0&&node.fallbackCommand===void 0)throw new CliSchemaValidationError(`fallbackMode requires fallbackCommand on '${node.key}'`);if(node.fallbackCommand!==void 0){if(!node.commands.find((c)=>c.key===node.fallbackCommand))throw new CliSchemaValidationError(`fallbackCommand '${node.fallbackCommand}' is not a child of '${node.key}'`)}for(let child of node.commands)walkNode(child,program,!1)}if(isCliRouter(node)&&!isRoot)validatePositionals(node.key,[]);else{let positionals=isCliLeaf(node)?node.positionals??[]:[];validateOptions(node.key,node.options??[]),validatePositionals(node.key,positionals)}}function validateOptions(scopeKey,options){let seenShorts=new Set,pipableCount=0;for(let opt of options){if(opt.pipable){if(pipableCount++,opt.kind!=="json")throw new CliSchemaValidationError(`pipable is only valid on Json kind: ${scopeKey}/${opt.name}`)}if(opt.kind==="json"){if(opt.format!==void 0||opt.pattern!==void 0||opt.default!==void 0)throw new CliSchemaValidationError(`Json option cannot use format, pattern, or default: ${scopeKey}/${opt.name}`)}if(opt.required&&opt.kind==="presence")throw new CliSchemaValidationError(`Presence option cannot be required: ${scopeKey}/${opt.name}`);if(opt.shortName!==void 0){if(opt.shortName==="h")throw new CliSchemaValidationError(`Short alias -h is reserved for help: ${scopeKey}/${opt.name}`);if(seenShorts.has(opt.shortName))throw new CliSchemaValidationError(`Duplicate short alias -${opt.shortName} in scope ${scopeKey}`);seenShorts.add(opt.shortName)}if(opt.kind==="enum"){if(!opt.choices||opt.choices.length===0)throw new CliSchemaValidationError(`Option '${opt.name}' on '${scopeKey}': Enum kind requires non-empty choices`);if(new Set(opt.choices).size!==opt.choices.length)throw new CliSchemaValidationError(`Option '${opt.name}' on '${scopeKey}': Enum choices must be distinct`);for(let choice of opt.choices)if(choice.length===0)throw new CliSchemaValidationError(`Option '${opt.name}' on '${scopeKey}': Enum choices must be non-empty strings`)}else if(opt.choices!==void 0)throw new CliSchemaValidationError(`Option '${opt.name}' on '${scopeKey}': choices is only valid for Enum kind`);if(opt.format!==void 0||opt.pattern!==void 0||opt.default!==void 0)validateOptionValueMetadata(scopeKey,opt)}if(pipableCount>1)throw new CliSchemaValidationError(`At most one pipable Json option per command: ${scopeKey}`)}function validateOptionValueMetadata(scopeKey,opt){let label=`${scopeKey}/${opt.name}`;if(opt.default!==void 0){if(opt.kind==="presence")throw new CliSchemaValidationError(`default is not valid on presence option ${label}`);if(opt.required)throw new CliSchemaValidationError(`default cannot be set on required option ${label}`)}if(opt.format!==void 0&&opt.pattern!==void 0)throw new CliSchemaValidationError(`Option ${label}: format and pattern are mutually exclusive`);if(opt.format!==void 0){if(opt.kind!=="string")throw new CliSchemaValidationError(`Option ${label}: format is only valid on String kind`);if(!Object.values(CliValueFormat).includes(opt.format))throw new CliSchemaValidationError(`Option ${label}: unknown format '${opt.format}'`)}if(opt.pattern!==void 0){if(opt.kind!=="string")throw new CliSchemaValidationError(`Option ${label}: pattern is only valid on String kind`);try{new RegExp(opt.pattern)}catch{throw new CliSchemaValidationError(`Option ${label}: invalid pattern regex`)}}if(opt.default!==void 0)try{validateFormatValue(opt.default,opt.format,opt.pattern)}catch(err){let msg=err instanceof Error?err.message:String(err);throw new CliSchemaValidationError(`Option ${label}: invalid default: ${msg}`)}}function validatePositionals(scopeKey,positionals){for(let p of positionals){if(p.argMin!==void 0&&p.argMin<0)throw new CliSchemaValidationError(`argMin must be >= 0 for positional ${scopeKey}/${p.name}`);if(p.argMax!==void 0&&p.argMax<0)throw new CliSchemaValidationError(`argMax must be >= 0 (use 0 for unlimited) for positional ${scopeKey}/${p.name}`);let{argMin=1,argMax=1}=p;if(argMax>0&&argMin>argMax)throw new CliSchemaValidationError(`argMin must not exceed argMax for positional ${scopeKey}/${p.name}`)}let sawOptional=!1;for(let p of positionals){let{argMin=1}=p;if(argMin===0)sawOptional=!0;else if(sawOptional)throw new CliSchemaValidationError(`Required positional after optional in scope ${scopeKey}`)}for(let idx=0;idx<positionals.length;idx++){let positional=positionals[idx];if(!positional)continue;let{argMax=1}=positional;if(argMax===0&&idx+1<positionals.length)throw new CliSchemaValidationError(`Unlimited positional (argMax == 0) must be last in scope ${scopeKey}`)}}var BUILTIN_ROOTS=new Set(["completion","version","http","mcp","configure","docs"]);function isBuiltinInvokePath(path){let root=path[0];if(!root||!BUILTIN_ROOTS.has(root))return!1;if(root==="http")return path.length<=1||path[1]==="serve";if(root==="mcp")return path.length<=1||path[1]==="serve"||path[1]==="bundle";return!0}import{spawnSync}from"node:child_process";function captureShellEnv(shell){let result=spawnSync(shell,["-l","-c","env"],{encoding:"utf8",timeout:5000});if(result.error||result.status!==0)return{};let env={};for(let line of result.stdout.split(`
364
+ `)){let eq=line.indexOf("=");if(eq>0)env[line.slice(0,eq)]=line.slice(eq+1)}return env}function applyShellEnv(env){for(let[key,val]of Object.entries(env))if(key==="PATH"){let existing=process.env.PATH??"",existingParts=new Set(existing.split(":")),shellOnly=val.split(":").filter((p)=>p.length>0&&!existingParts.has(p));if(shellOnly.length>0)process.env.PATH=[...shellOnly,existing].join(":")}else if(process.env[key]===void 0)process.env[key]=val}function bootstrapMcpEnv(config){if(config.shellEnv===!1)return;let shellEnvCfg=config.shellEnv,shell=typeof shellEnvCfg==="string"?shellEnvCfg:process.env.SHELL??(process.platform==="darwin"?"/bin/zsh":"/bin/bash"),captured=captureShellEnv(shell);if(Object.keys(captured).length===0)process.stderr.write(`[argsbarg] shellEnv: failed to capture shell environment from ${shell}
365
+ `);else applyShellEnv(captured)}import{randomUUID as randomUUID2}from"node:crypto";var MCP_PROTOCOL_VERSIONS=["2025-06-18","2024-11-05"],MCP_STRUCTURED_OUTPUT_SINCE="2025-06-18";function writeResponse(msg){process.stdout.write(`${JSON.stringify(msg)}
366
+ `)}function writeError(id,code,message){if(id===void 0)return;writeResponse({jsonrpc:"2.0",id,error:{code,message}})}function supportsStructuredOutput(version){let idx=version?MCP_PROTOCOL_VERSIONS.indexOf(version):-1,sinceIdx=MCP_PROTOCOL_VERSIONS.indexOf(MCP_STRUCTURED_OUTPUT_SINCE);return idx!==-1&&idx<=sinceIdx}async function handleRequestLine(cli,line){let root=cli.program,requestId=randomUUID2(),started=performance.now(),hooks=cli.server?.mcpHooks??root.mcpServer?.hooks,emitter=cli.server?.emitter,obscureUnexpected=cli.server?.mcp?.obscureUnexpected??root.mcpServer?.errors?.obscureUnexpected??!1,req;try{req=JSON.parse(line)}catch{return}let id=req.id,hasId=id!==void 0,method=req.method??"",params=req.params??{},wireCtx={rpcMethod:method,requestId};await hooks?.onRequest?.(wireCtx);let finish=async(failureKind,error)=>{let durationMs=Math.round(performance.now()-started);if(failureKind&&error!==void 0)await hooks?.onError?.({...wireCtx,failureKind,error});else await hooks?.onResponse?.({...wireCtx,durationMs});emitter?.emitAccess({method:"MCP",path:method,status:failureKind?500:200,durationMs,requestId})};if(req.jsonrpc!=="2.0"){if(hasId)writeError(id,-32600,"Invalid Request");await finish("validation",Error("Invalid Request"));return}if(method==="notifications/initialized")return;if(!hasId)return;try{if(method==="initialize"){let info=resolveMcpServerInfo(root),requested=params.protocolVersion,negotiated=typeof requested==="string"&&MCP_PROTOCOL_VERSIONS.includes(requested)?requested:MCP_PROTOCOL_VERSIONS[0];if(cli.server)cli.server.mcpProtocolVersion=negotiated;let instructions=root.mcpServer?.instructions;writeResponse({jsonrpc:"2.0",id,result:{protocolVersion:negotiated,capabilities:{tools:{},resources:{}},serverInfo:{name:info.name,version:info.version},...instructions?{instructions}:{}}}),await finish();return}if(method==="ping"){writeResponse({jsonrpc:"2.0",id,result:{}}),await finish();return}if(method==="tools/list"){let structured=supportsStructuredOutput(cli.server?.mcpProtocolVersion),tools=collectMcpTools(root).map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema,...structured&&t.outputSchema!==void 0?{outputSchema:t.outputSchema}:{}}));writeResponse({jsonrpc:"2.0",id,result:{tools}}),await finish();return}if(method==="tools/call"){let name=params.name;if(typeof name!=="string"){writeError(id,-32602,"Invalid params: name required"),await finish("validation",Error("Invalid params: name required"));return}let rawArgs=params.arguments;if(rawArgs!==void 0&&(typeof rawArgs!=="object"||rawArgs===null||Array.isArray(rawArgs))){writeError(id,-32602,"Invalid params: arguments must be an object"),await finish("validation",Error("Invalid params: arguments must be an object"));return}let lookup=lookupHeadlessTool(root,name);if(!lookup.ok){if(lookup.kind==="unknown"){writeError(id,-32602,lookup.message),await finish("unknown_route",Error(lookup.message));return}writeResponse({jsonrpc:"2.0",id,result:{content:[{type:"text",text:lookup.message}],isError:!0}}),await finish("missing_config",Error(lookup.message));return}let invokeResult=await executeHeadlessToolCall(cli,lookup.tool,rawArgs??{},"mcp",{rpcMethod:method,toolName:name,requestId});if(invokeResult.ok){let structured=supportsStructuredOutput(cli.server?.mcpProtocolVersion),{structuredContent:_structuredContent,...rest}=invokeResult.mcpResult;writeResponse({jsonrpc:"2.0",id,result:structured?invokeResult.mcpResult:rest}),await finish();return}let text=headlessFailureMcpMessage(invokeResult,obscureUnexpected);writeResponse({jsonrpc:"2.0",id,result:{content:[{type:"text",text}],isError:!0}}),await finish(invokeResult.failureKind??"invoke",Error(invokeResult.message));return}if(method==="resources/list"){let resources=allMcpResources(root).map((r)=>({uri:r.uri,name:r.name,description:r.description,mimeType:r.mimeType}));writeResponse({jsonrpc:"2.0",id,result:{resources}}),await finish();return}if(method==="resources/read"){let uri=params.uri;if(typeof uri!=="string"){writeError(id,-32602,"Invalid params: uri required"),await finish("validation",Error("Invalid params: uri required"));return}let found=allMcpResources(root).find((r)=>r.uri===uri);if(!found){writeError(id,-32602,`Unknown resource: ${uri}`),await finish("unknown_route",Error(`Unknown resource: ${uri}`));return}let text;try{text=found.load()}catch(err){let message=err instanceof Error?err.message:String(err);writeError(id,-32603,`Resource load failed: ${message}`),await finish("unexpected",err);return}writeResponse({jsonrpc:"2.0",id,result:{contents:[{uri:found.uri,mimeType:found.mimeType,text}]}}),await finish();return}writeError(id,-32601,"Method not found"),await finish("unknown_route",Error("Method not found"))}catch(err){let message=err instanceof Error?err.message:"Internal error";writeError(id,-32603,message),await finish("unexpected",err)}}async function mcpServeStdioLoop(cli){let buffer="",decoder=new TextDecoder;for await(let chunk of process.stdin){buffer+=typeof chunk==="string"?chunk:decoder.decode(chunk);let nl=buffer.indexOf(`
367
+ `);while(nl!==-1){let line=buffer.slice(0,nl).trim();if(buffer=buffer.slice(nl+1),line.length===0){nl=buffer.indexOf(`
368
+ `);continue}await handleRequestLine(cli,line),nl=buffer.indexOf(`
369
+ `)}}let trailing=buffer.trim();if(trailing.length>0)await handleRequestLine(cli,trailing)}function createServerRuntime(program,surface){return{state:{},program,surface}}class CliInvokeExit extends Error{code;constructor(code){super(`process.exit(${code})`);this.name="CliInvokeExit",this.code=code}}class Cli{program;caps;parseRootMerged;presentationRoot;_appConfig;server;constructor(program){cliValidateProgram(program),Object.freeze(program),this.program=program,this.caps=resolveCapabilities(program),this.parseRootMerged=cliParseRoot(program),this.presentationRoot=cliPresentationRoot(program)}get appConfig(){if(this._appConfig===void 0)this._appConfig=this.buildAppConfigSnapshot({exitOnMissing:!1,interactive:!1});return this._appConfig}exportCommandSchema(){return cliSchemaExport(this.program)}exportAppConfigSchema(){return effectiveJsonSchema(this.program)}async run(argv=process.argv.slice(2)){assertBuiltinAllowed(argv,this.caps);let prep=this.prepareDispatch(argv);if("error"in prep){if(prep.error.kind==="help")process.stdout.write(cliHelpRender(this.parseRootMerged,prep.error.helpPath,!1)),process.exit(prep.error.helpExplicit?0:1);let msg=process.stderr.isTTY?`\x1B[31m${prep.error.errorMsg}\x1B[0m`:prep.error.errorMsg;process.stderr.write(`${msg}
370
+ `),process.stderr.write(cliHelpRender(this.presentationRoot,prep.error.errorHelpPath,!0)),process.exit(1)}let{pr,completionParseRoot,isLeafCompletionIntercept,leaf}=prep;if(pr.kind==="ok")await dispatchBuiltin(this.program,pr,{isLeafCompletionIntercept,parseRoot:completionParseRoot});let skipRequiredConfig=skipsRequiredAppConfigExit(pr.path,this.caps),snapshot=this.buildAppConfigSnapshot({interactive:!skipRequiredConfig&&!!process.stdin.isTTY,exitOnMissing:!skipRequiredConfig}),preloadedJson={};try{preloadedJson=await preloadPipableJson(this.program,pr.path,pr.opts,"cli",pr.args)}catch(err){if(err instanceof LeafInputError)this.exitLeafInputError(err,pr.path);let msg=err instanceof Error?err.message:String(err),color=process.stderr.isTTY;process.stderr.write(color?`\x1B[31m${msg}\x1B[0m
371
+ `:`${msg}
372
+ `),process.exit(1)}let ctx=new CliContext(this.program.key,pr.path,pr.args,pr.opts,this.program,"cli",snapshot,void 0,preloadedJson,pr.pathParams,{requestId:randomUUID3()});try{this.ensureValidatedLeafInputs(ctx,leaf);let handlerResult=await Promise.resolve(leaf.handler(ctx));if(handlerResult!==void 0&&ctx.getResponse()===void 0)ctx.respond({body:handlerResult});process.exit(0)}catch(err){if(err instanceof LeafInputError)this.exitLeafInputError(err,pr.path);if(err instanceof Error)process.stderr.write(`${err.message}
373
+ `);process.exit(1)}}async invoke(argv,opts){let invocation=opts?.invocation??"mcp",prep=this.prepareDispatch(argv,{presentationFallback:!0});if("error"in prep){if(prep.error.kind==="help")return{kind:"help",exitCode:1,stdout:"",stderr:"",errorMsg:"Help is not available via tool calls.",failureKind:"help"};return{kind:"error",exitCode:1,stdout:"",stderr:prep.error.errorMsg,errorMsg:prep.error.errorMsg,failureKind:"validation"}}let{pr,completionParseRoot,isLeafCompletionIntercept,leaf}=prep,snapshot=this.buildAppConfigSnapshot({interactive:!1,exitOnMissing:!1}),runtime=this.server?.runtime,requestId=opts?.requestId??opts?.http?.requestId??opts?.mcp?.requestId??randomUUID3(),ctx=new CliContext(this.program.key,pr.path,pr.args,pr.opts,this.program,invocation,snapshot,opts?.toolArgs,{},pr.pathParams,{requestId},runtime),skipHooks=isBuiltinInvokePath(pr.path),hooks=this.program.hooks,obscureUnexpected=invocation==="http"?this.server?.http?.obscureUnexpected??this.program.httpServer?.errors?.obscureUnexpected??!1:invocation==="mcp"?this.server?.mcp?.obscureUnexpected??this.program.mcpServer?.errors?.obscureUnexpected??!1:!1,emitter=this.server?.emitter,hookCtx=()=>buildInvokeHookContext(ctx,{path:pr.path,runtime,http:opts?.http,mcp:opts?.mcp}),stdout="",stderr="",origExit=process.exit,origStdoutWrite=process.stdout.write.bind(process.stdout),origStderrWrite=process.stderr.write.bind(process.stderr),{log:origConsoleLog,error:origConsoleError,info:origConsoleInfo,warn:origConsoleWarn}=console;process.exit=(code)=>{throw new CliInvokeExit(code??0)},process.stdout.write=(chunk,...args)=>{if(stdout+=typeof chunk==="string"?chunk:new TextDecoder().decode(chunk),typeof args[0]==="function")args[0]();return!0},process.stderr.write=(chunk,...args)=>{if(stderr+=typeof chunk==="string"?chunk:new TextDecoder().decode(chunk),typeof args[0]==="function")args[0]();return!0},console.log=(...args)=>{stdout+=`${format2(...args)}
374
+ `},console.info=(...args)=>{stdout+=`${format2(...args)}
375
+ `},console.warn=(...args)=>{stderr+=`${format2(...args)}
376
+ `},console.error=(...args)=>{stderr+=`${format2(...args)}
377
+ `};let finishError=async(err,kindOpts)=>{let failureKind=classifyFailureKind(err,kindOpts);if(!skipHooks){let piped=await runErrorPipeline(hookCtx(),err,failureKind,hooks,emitter,obscureUnexpected);return{kind:"error",exitCode:piped.clientError.exitCode??1,stdout,stderr:`${piped.errorMsg}
378
+ `,errorMsg:piped.errorMsg,failureKind:piped.failureKind}}let message=err instanceof Error?err.message:String(err);return{kind:"error",exitCode:1,stdout,stderr:`${message}
379
+ `,errorMsg:message,failureKind}};try{if(pr.kind==="ok")await dispatchBuiltin(this.program,pr,{isLeafCompletionIntercept,parseRoot:completionParseRoot});if(!skipHooks)await runHook(()=>hooks?.beforeInvoke?.(hookCtx()),"beforeInvoke");this.ensureValidatedLeafInputs(ctx,leaf);let handlerResult=await Promise.resolve(leaf.handler(ctx));if(handlerResult!==void 0&&ctx.getResponse()===void 0)ctx.respond({body:handlerResult});let response=ctx.getResponse(),okResult={kind:"ok",exitCode:0,stdout,stderr,...response?{response}:{}};if(!skipHooks)await runHook(()=>hooks?.afterInvoke?.({...hookCtx(),result:okResult}),"afterInvoke");return okResult}catch(err){if(err instanceof CliInvokeExit){if(err.code===0){let response=ctx.getResponse(),okResult={kind:"ok",exitCode:0,stdout,stderr,...response?{response}:{}};if(!skipHooks)await runHook(()=>hooks?.afterInvoke?.({...hookCtx(),result:okResult}),"afterInvoke");return okResult}return finishError(err,{})}if(err instanceof LeafInputError)return finishError(err,{parseError:!0});if(err instanceof Error)return finishError(err,{});return finishError(err,{})}finally{process.exit=origExit,process.stdout.write=origStdoutWrite,process.stderr.write=origStderrWrite,console.log=origConsoleLog,console.error=origConsoleError,console.info=origConsoleInfo,console.warn=origConsoleWarn}}async serveMcp(overrides={}){try{if(this.program.mcpServer)bootstrapMcpEnv(this.program.mcpServer);let resolved=resolveMcpServeConfig(this.program,overrides),runtime=createServerRuntime(this.program,"mcp"),emitter=new LogEmitter({program:this.program,resolved:resolved.log});this.server={runtime,emitter,mcp:resolved,mcpHooks:this.program.mcpServer?.hooks,mcpProtocolVersion:MCP_PROTOCOL_VERSIONS[0]},bootstrapAppConfig(this.program,{validateFile:"soft",runtime,emitter});let shutdown=()=>{emitter.emit({level:"info",message:"server stopping",action:"server.stop"}),process.exit(0)};process.once("SIGINT",shutdown),process.once("SIGTERM",shutdown);for(let message of mcpSizeReport(this.program).warnings)emitter.emit({level:"warn",message,action:"mcp.size"});emitter.emitLifecycle(`${this.program.key} ${this.program.version} — MCP ready (stdio)`,"mcp.server.ready"),await mcpServeStdioLoop(this),process.exit(0)}catch(err){if(err instanceof Error)process.stderr.write(`${err.message}
380
+ `);else process.stderr.write(`MCP server error.
381
+ `);process.exit(1)}}async serveHttp(overrides={}){try{let resolved=resolveHttpServeConfig(this.program,overrides),runtime=createServerRuntime(this.program,"http"),emitter=new LogEmitter({program:this.program,resolved:resolved.log});this.server={runtime,emitter,http:resolved,httpHooks:this.program.httpServer?.hooks},bootstrapAppConfig(this.program,{validateFile:"soft",runtime,emitter});let shutdown=()=>{emitter.emit({level:"info",message:"server stopping",action:"server.stop"}),process.exit(0)};process.once("SIGINT",shutdown),process.once("SIGTERM",shutdown),await httpServeHttp(this,resolved),process.exit(0)}catch(err){if(err instanceof Error)process.stderr.write(`${err.message}
382
+ `);else process.stderr.write(`HTTP API server error.
383
+ `);process.exit(1)}}ensureValidatedLeafInputs(ctx,leaf){if(leaf.inputSchema===void 0)return;ctx.inputs}exitLeafInputError(err,helpPath){let msg=process.stderr.isTTY?`\x1B[31m${err.message}\x1B[0m`:err.message;process.stderr.write(`${msg}
384
+ `),process.stderr.write(cliHelpRender(this.presentationRoot,helpPath,!0)),process.exit(1)}prepareDispatch(argv,opts){let program=this.program,parseRoot,completionParseRoot=opts?.presentationFallback?this.presentationRoot:this.parseRootMerged,isLeafCompletionIntercept=!1;if(isCliLeaf(program)){let intercept=builtinInterceptRoot(program,argv);if(intercept.isLeafCompletionIntercept||intercept.parseRoot!==program)parseRoot=intercept.parseRoot,completionParseRoot=isCliRouter(intercept.parseRoot)?intercept.parseRoot:opts?.presentationFallback?this.presentationRoot:this.parseRootMerged,isLeafCompletionIntercept=intercept.isLeafCompletionIntercept;else parseRoot=program}else parseRoot=this.parseRootMerged;let pr=parse(parseRoot,argv);if(pr=postParseValidate(parseRoot,pr),pr.kind!=="ok")return{error:pr};let current=parseRoot;for(let seg of pr.path){if(!isCliRouter(current))return{error:{kind:"error",path:pr.path,args:pr.args,opts:pr.opts,pathParams:pr.pathParams,helpExplicit:!1,helpPath:[],errorMsg:"Internal error: missing handler for path.",errorHelpPath:pr.path}};let ch=current.commands.find((candidate)=>candidate.key===seg);if(!ch)return{error:{kind:"error",path:pr.path,args:pr.args,opts:pr.opts,pathParams:pr.pathParams,helpExplicit:!1,helpPath:[],errorMsg:"Internal error: missing handler for path.",errorHelpPath:pr.path}};current=ch}if(!isCliLeaf(current)||!current.handler)return{error:{kind:"error",path:pr.path,args:pr.args,opts:pr.opts,pathParams:pr.pathParams,helpExplicit:!1,helpPath:[],errorMsg:"Internal error: missing handler for path.",errorHelpPath:pr.path}};return{pr,parseRoot,completionParseRoot,isLeafCompletionIntercept,leaf:current}}buildAppConfigSnapshot(opts){let bootstrap=ensureAppConfig(this.program,opts),snapshot=bootstrap?createAppConfigSnapshot(this.program,bootstrap.fileData,bootstrap.resolved):createAppConfigSnapshot(this.program,readAppConfigFileRaw(resolveAppConfigPath(this.program)),{});return this._appConfig=snapshot,snapshot}}function cliErrWithHelp(ctx,msg){if(ctx.invocation==="http"||ctx.invocation==="mcp")throw Error(msg);let line=process.stderr.isTTY?`\x1B[31m${msg}\x1B[0m`:msg;process.stderr.write(`${line}
385
+ `),process.stderr.write(cliHelpRender(cliPresentationRoot(ctx.program),ctx.commandPath,!0)),process.exit(1)}var README_default="# mcp-plugin\n\nArgsbarg MCP plugin template for Cursor and Claude Code marketplaces (@sg schemagen, JSON schemas, in-repo manifests).\n\n## Overview\n\n`mcp-plugin` packages an MCP server and agent skills directly for Cursor and Claude Code marketplaces:\n\n- **Cursor Plugin**: inline MCP configuration in `.cursor-plugin/plugin.json` runs `node ${CURSOR_PLUGIN_ROOT}/dist/mcp-plugin.mjs mcp`.\n- **Claude Code Plugin**: inline MCP configuration in `.claude-plugin/plugin.json` runs `node ${CLAUDE_PLUGIN_ROOT}/dist/mcp-plugin.mjs mcp`.\n- **In-repo skills**: `skills/mcp-plugin/SKILL.md` discovered and loaded by agent platforms.\n- **Committed Node bundle**: `dist/mcp-plugin.mjs` is self-contained (dependencies and schemas bundled), so a fresh clone runs with no install step.\n\n## Installation\n\nRequires Node >=20 on the host's PATH. Nothing is installed at startup; stdout contains only MCP messages. Maintainers need Bun to develop and rebuild the bundle (`just check`).\n\nThe in-repo example retains its `argsbarg: file:../..` development dependency. Before distributing a standalone copy, resolve that dependency for the destination repository and regenerate its lockfile; the parent-checkout path is not portable.\n\n### Cursor\n\nRecommended: import directly from GitHub — Cursor Dashboard → **Settings → Plugins → Team Marketplaces → Import**, then enter `https://github.com/bdombro/bun-argsbarg` (subdirectory `examples/mcp-plugin` once copied to its own repo). Once published to the [official marketplace](https://cursor.com/marketplace/publish), install via `/add-plugin mcp-plugin` or the Customize sidebar.\n\n### Claude Code\n\nRecommended: add the GitHub repo as a marketplace, then install:\n\n```bash\n/plugin marketplace add <owner>/<repo>\n/plugin install mcp-plugin@mcp-plugin\n```\n\nThe marketplace name comes from `.claude-plugin/marketplace.json`, not the repository name.\n\nOnce merged into [anthropics/claude-plugins-official](https://github.com/anthropics/claude-plugins-official), install via `/plugin install mcp-plugin@claude-plugins-official`.\n\n## Commands\n\n- `mcp-plugin echo` — Echo text back to stdout or inspect flags.\n- `mcp-plugin render-json` — Process structured JSON payloads with schema validation.\n- `mcp-plugin status` — Show application version with schemagen output schema (`--json`).\n- `mcp-plugin workspaces` — Manage workspace resources (REST CRUD with in-memory SQLite).\n\n### Built-in commands\n\n- `mcp-plugin completion` — Install or inspect shell tab completions (bash, zsh, fish).\n- `mcp-plugin configure` — Manage agent artifacts (skills, MCP, application configuration).\n- `mcp-plugin docs` — Browse bundled documentation topics (`cli`, `mcp`, `http`, `readme`).\n- `mcp-plugin mcp` — Start the Model Context Protocol (stdio) server for AI coding agents.\n- `mcp-plugin version` — Display version information.\n\n## Contributing / Local Development\n\n```bash\ngit clone https://github.com/bdombro/bun-argsbarg.git\ncd bun-argsbarg/examples/mcp-plugin\n\n# Install dependencies and generate schemas\njust setup\n\n# Rebuild the committed Node bundle and run the MCP server from it\njust build\nnode dist/mcp-plugin.mjs mcp\n\n# Link into local Cursor plugins for live testing\njust plugin-cursor-upsert\n\n# Register this checkout as a marketplace and install in Claude Code\njust plugin-claude-install\n```\n\nRestart Claude Code after installing. Use `bun src/index.ts <command>` for CLI commands from source. Commit `dist/mcp-plugin.mjs` whenever source changes; `just check` rebuilds it. In-repo development uses `just setup` to repair the local dependency's CLI executable link.\n\n## Documentation\n\n| Need | Resource |\n| --- | --- |\n| CLI reference | [docs/cli.md](docs/cli.md) or `mcp-plugin docs cli` |\n| MCP tools | [docs/mcp.md](docs/mcp.md) or `mcp-plugin docs mcp` |\n| HTTP API | [docs/http.md](docs/http.md) or `mcp-plugin docs http` |\n| OpenAPI 3.1 | [docs/openapi.json](docs/openapi.json) |\n";var createIdentity={key:"mcp-plugin",className:"McpPlugin",tap:"bdombro/bun-argsbarg",homepage:"https://github.com/bdombro/bun-argsbarg",releaseRepo:"bdombro/bun-argsbarg",desc:"Argsbarg MCP plugin template for Cursor and Claude Code marketplaces",envPrefix:"MCP_PLUGIN",template:"plugin"};var echoCommand={key:"echo",description:"Echo a message (MCP-friendly leaf).",options:[{name:"message",description:"Text to print.",kind:"string",required:!0}],handler:(ctx)=>{let message=ctx.stringOpt("message")??"";if(ctx.invocation==="cli"){console.log(message);return}return message}};var RenderJsonInputSchema_default={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{message:{type:"string",description:"Message to echo back."}},required:["message"],additionalProperties:!1,definitions:{}};var RenderJsonInputSchema=RenderJsonInputSchema_default;var renderJsonCommand={key:"render-json",description:"Echo a JSON message (schema-first JSON leaf demo).",kind:"json",inputSchema:RenderJsonInputSchema,handler:(ctx)=>{let{message}=ctx.inputsAs();if(ctx.invocation==="cli"){console.log(message);return}return{message}}};var StatusJsonOutputSchema_default={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{version:{type:"string",description:"App version from program root."}},required:["version"],additionalProperties:!1,definitions:{}};var StatusJsonOutputSchema=StatusJsonOutputSchema_default;var statusCommand={key:"status",description:"Show app version.",options:[{name:"json",description:"Emit JSON.",kind:"presence"}],outputSchema:StatusJsonOutputSchema,handler:(ctx)=>{let out={version:ctx.program.version};if(ctx.hasFlag("json"))console.log(JSON.stringify(out,null,2));else console.log(`version=${out.version}`)}};var WorkspaceNameInputSchema_default={$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{name:{type:"string",description:"Workspace display name."}},required:["name"],additionalProperties:!1,definitions:{}};var WorkspaceNameInputSchema=WorkspaceNameInputSchema_default;function notFound(ctx,id){cliErrWithHelp(ctx,`Workspace not found: ${id}`)}var workspacesCommand={key:"workspaces",description:"Workspace collection and CRUD.",commands:[{key:"get",description:"List workspaces.",handler:(ctx)=>({workspaces:ctx.locals.db.workspaces.list()})},{key:"post",description:"Create a workspace.",inputSchema:WorkspaceNameInputSchema,handler:(ctx)=>{let{name}=ctx.inputsAs();return ctx.locals.db.workspaces.create(name)}},{key:":id",description:"One workspace by id.",commands:[{key:"get",description:"Get one workspace.",handler:(ctx)=>{let id=ctx.inputsAs().id,ws=ctx.locals.db.workspaces.get(id);if(!ws)notFound(ctx,id);return ws}},{key:"put",description:"Replace a workspace.",inputSchema:WorkspaceNameInputSchema,handler:(ctx)=>{let{id,name}=ctx.inputsAs(),ws=ctx.locals.db.workspaces.replace(id,name);if(!ws)notFound(ctx,id);return ws}},{key:"patch",description:"Patch a workspace name.",inputSchema:WorkspaceNameInputSchema,handler:(ctx)=>{let{id,name}=ctx.inputsAs(),ws=ctx.locals.db.workspaces.patch(id,name);if(!ws)notFound(ctx,id);return ws}},{key:"delete",description:"Delete a workspace.",handler:(ctx)=>{let id=ctx.inputsAs().id;if(!ctx.locals.db.workspaces.delete(id))notFound(ctx,id);ctx.respond({status:204,body:""})}}]}]};class WorkspacesTable{items=new Map;list(){return Array.from(this.items.values())}get(id){return this.items.get(id)}create(name){let id=crypto.randomUUID(),workspace={id,name};return this.items.set(id,workspace),workspace}replace(id,name){if(!this.items.has(id))return;let updated={id,name};return this.items.set(id,updated),updated}patch(id,name){let existing=this.items.get(id);if(!existing)return;let updated={...existing,name};return this.items.set(id,updated),updated}delete(id){return this.items.delete(id)}}class AppDb{static db;workspaces;constructor(){this.workspaces=new WorkspacesTable}static open(){return new AppDb}static openWithRetry(_delayMs=200){return AppDb.open()}static openDb(){return AppDb.db??=AppDb.open(),AppDb.db}static resetForTests(){AppDb.db=AppDb.open()}close(){}ping(){}static attach(ctx){if(ctx.runtime&&(ctx.invocation==="http"||ctx.invocation==="mcp")){ctx.runtime.state.db??=AppDb.openWithRetry(),ctx.locals.db=ctx.runtime.state.db;return}ctx.locals.db=AppDb.openDb()}static checkReadiness(ctx){let appDb=ctx.runtime?.state?.db;if(!appDb)return!1;try{return appDb.ping(),!0}catch{return!1}}}var program={commands:[echoCommand,renderJsonCommand,statusCommand,workspacesCommand],description:createIdentity.desc,docs:{topics:{readme:{text:README_default}}},hooks:{beforeInvoke:AppDb.attach},httpServer:{enabled:!0},key:createIdentity.key,mcpServer:{enabled:!0},readiness:AppDb.checkReadiness,version:"1.0.0"};var cli=new Cli(program);await cli.run();