@sumrco/cli 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/ai/modules/kontract/resources/api-generation-standards.rf.md +83 -0
  2. package/ai/modules/kontract/resources/{configuration.rf.md → authoring/configuration.rf.md} +49 -11
  3. package/ai/modules/kontract/resources/authoring/design-profile/api-styles.rf.md +241 -0
  4. package/ai/modules/kontract/resources/authoring/design-profile/async-styles.rf.md +134 -0
  5. package/ai/modules/kontract/resources/authoring/design-profile/overview.md +64 -0
  6. package/ai/modules/kontract/resources/authoring/design-profile/schema-layout-styles.rf.md +356 -0
  7. package/ai/modules/kontract/resources/authoring/overview.md +56 -0
  8. package/ai/modules/kontract/resources/{schema-reuse.rf.md → authoring/schema-reuse.rf.md} +222 -46
  9. package/ai/modules/kontract/resources/{scope-and-splitting.rf.md → authoring/scope-and-splitting.rf.md} +113 -57
  10. package/ai/modules/kontract/resources/authoring/spec-layout.rf.md +492 -0
  11. package/ai/modules/kontract/resources/authoring/team-members/spec-author.tm.md +77 -0
  12. package/ai/modules/kontract/resources/{workflows/contract-change.wf.md → authoring/workflows/spec-change.wf.md} +21 -15
  13. package/ai/modules/kontract/resources/generated-output.rf.md +19 -14
  14. package/ai/modules/kontract/resources/openapi-sdk-generator-research.rf.md +17 -19
  15. package/ai/modules/kontract/resources/overview.md +115 -82
  16. package/ai/modules/kontract/resources/performance.rf.md +7 -7
  17. package/ai/modules/kontract/sumr.module.yaml +3 -0
  18. package/ai/modules/mission/sumr.module.yaml +6 -0
  19. package/ai/modules/playbook/resources/authoring/content-structure.rf.md +1 -1
  20. package/ai/modules/playbook/resources/authoring/cross-referencing.rf.md +1 -1
  21. package/ai/modules/playbook/resources/authoring/descriptions.rf.md +1 -1
  22. package/ai/modules/playbook/resources/authoring/extraction.rf.md +1 -1
  23. package/ai/modules/playbook/resources/authoring/flows.rf.md +1 -1
  24. package/ai/modules/playbook/resources/authoring/folder-structure.rf.md +1 -1
  25. package/ai/modules/playbook/resources/authoring/frontmatter.rf.md +4 -1
  26. package/ai/modules/playbook/resources/authoring/markdown.rf.md +1 -1
  27. package/ai/modules/playbook/resources/authoring/overview.md +1 -1
  28. package/ai/modules/playbook/resources/team-members/{playbook-technical-writer.tm.md → technical-writer.tm.md} +3 -2
  29. package/ai/modules/playbook/sumr.module.yaml +7 -2
  30. package/index.js +332 -276
  31. package/package.json +1 -1
  32. package/ai/modules/kontract/resources/language-sdk-generator-extension.rf.md +0 -62
  33. package/ai/modules/kontract/resources/openapi-generator-lessons.rf.md +0 -61
  34. package/ai/modules/kontract/resources/spec-layout.rf.md +0 -275
  35. package/ai/modules/kontract/resources/team-members/contract-author.tm.md +0 -60
package/index.js CHANGED
@@ -1,34 +1,35 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var hG=Object.defineProperty;var uG=($)=>$;function dG($,Q){this[$]=uG.bind(null,Q)}var p2=($,Q)=>{for(var Z in Q)hG($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:dG.bind(Q,Z)})};var c2=($,Q)=>()=>($&&(Q=$($=0)),Q);var M$=import.meta.require;var a0={};p2(a0,{writeSumrYamlTopLevelSection:()=>d1,writeSumrYamlDocument:()=>H0,writeFileAtomically:()=>i7,validateSumrYaml:()=>x4,sumrWarn:()=>O0,sumrTitle:()=>r,sumrText:()=>K0,sumrSuccess:()=>v,sumrStep:()=>F4,sumrSelect:()=>Q1,sumrNote:()=>d$,sumrList:()=>m$,sumrIsInteractive:()=>o0,sumrInfo:()=>$1,sumrError:()=>j$,sumrDone:()=>B1,sumrCancel:()=>s8,runModuleCli:()=>b4,renderNamespaceHelp:()=>t7,renderHelp:()=>m1,renderCommandLine:()=>p0,renderCommandHelp:()=>s7,recordActivation:()=>n0,readSumrYamlText:()=>i2,readActivations:()=>r8,parseArgv:()=>r2,mountModule:()=>o2,isActivated:()=>o8,defineModule:()=>L1,defineCommand:()=>E,createSliceValidator:()=>g4,createNamespaceCommand:()=>e7,coreModule:()=>k4,contractCommand:()=>$Z,composeSumrYamlSchema:()=>XZ,brandText:()=>S,brandSpinnerOptions:()=>q1,brandNoteOptions:()=>P$,brandLogOptions:()=>G$,activationFilePath:()=>i8,SumrYamlEnvelopeSchema:()=>ZZ,SUMR_YAML_FILENAMES:()=>c0,SUMR_YAML_FILE:()=>K1});import{existsSync as n2,mkdirSync as mG,readFileSync as p7,renameSync as lG,rmSync as pG,writeFileSync as cG}from"fs";import{homedir as nG}from"os";import{dirname as c7,join as V0,resolve as iG}from"path";import{existsSync as n7,readFileSync as rG,renameSync as oG,rmSync as aG,writeFileSync as sG}from"fs";import{intro as T4,log as i0,note as a8,outro as E4}from"@clack/prompts";import{cancel as y4,isCancel as QZ,select as f4,text as v4}from"@clack/prompts";import{z as l7}from"zod";function i7($,Q,Z){let X=`${$}.${process.pid}.${Date.now()}.tmp`;try{sG(X,Q,Z),oG(X,$)}catch(U){if(n7(X))aG(X,{force:!0});throw U}}function tG($){return $.endsWith(":")?$.slice(0,-1):$}function eG($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function $4($){return/^[A-Za-z][A-Za-z0-9_-]*:\s*(?:.*)$/.test($)}function g7($){let Q=[...$];while(Q.at(-1)?.trim()===u1)Q.pop();return Q}function Q4($){let Q=[...$];while(Q[0]?.trim()===u1)Q.shift();return Q}function h7($,Q){return $[Q]??u1}function Z4($,Q,Z){let X=tG(Q),U=new RegExp(`^${eG(X)}:\\s*(?:#.*)?$`),J=$.findIndex((G)=>U.test(G));if(J===-1)return;let W=Z&&$[J-1]?.trim()===Z?J-1:J,Y=$.length;for(let G=J+1;G<$.length;G+=1)if($4(h7($,G))){Y=G;break}while(Y>J+1){let G=h7($,Y-1).trim();if(G!==u1&&!G.startsWith("#"))break;Y-=1}return{start:W,end:Y}}function u7($,Q,Z){let X=[...$];if(X.length>0)X.push(u1);if(X.push(...Q),Z.length>0)X.push(u1,...Z);return X.push(u1),X.join(`
4
- `)}function X4($,Q,Z,X={}){let U=$.endsWith(`
5
- `),J=$.split(`
6
- `);if(U)J.pop();let W=Z4(J,Q,X.sectionComment);if(!W)return u7(g7(J),Z,[]);return u7(g7(J.slice(0,W.start)),Z,Q4(J.slice(W.end)))}function i2($,Q=`version: 1
7
- `){return n7($)?rG($,"utf8"):Q}function H0($,Q){i7($,Q,"utf8")}function d1($,Q,Z,X={}){let U=i2($,X.fallbackContent);H0($,X4(U,Q,Z,X))}function n8($){let Q=iG($);for(;;){for(let X of c0)if(n2(V0(Q,X)))return Q;let Z=c7(Q);if(Z===Q)return;Q=Z}}function i8($={}){let Q=$.cwd??process.cwd(),Z=$.home??nG(),X=n8(Q),U=X?V0(X,r7):V0(Z,U4);return V0(U,J4)}function W4(){return{version:o7,activated:{}}}function Y4($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.activated==="object"&&Q.activated!==null}function r8($={}){let Q=i8($);return G4(Q)??W4()}function G4($){if(!n2($))return;try{let Q=JSON.parse(p7($,"utf8"));if(!Y4(Q))return;return{version:o7,activated:{...Q.activated}}}catch{return}}function z4($,Q={}){let Z=Q.cwd??process.cwd(),X=n8(Z)??Z;return n2(V0(X,r7,$))}function _4($,Q={}){let Z=Q.cwd??process.cwd(),X=n8(Z);if(!X)return!1;let U=new RegExp(`^${H4($)}\\s*:`,"m");for(let J of c0){let W=V0(X,J);if(!n2(W))continue;try{if(U.test(p7(W,"utf8")))return!0}catch{return!1}}return!1}function o8($,Q={}){if(r8(Q).activated[$])return!0;return _4($,Q)||z4($,Q)}function n0($,Q={}){let Z=i8(Q),X=r8(Q);return X.activated[$]={at:new Date().toISOString()},V4(Z,X),X}function V4($,Q){let Z=`${$}.sumr-tmp-${Date.now()}`;mG(c7($),{recursive:!0});try{cG(Z,`${JSON.stringify(Q,null,2)}
8
- `,"utf8"),lG(Z,$)}finally{pG(Z,{force:!0})}}function H4($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function O4($,Q){let Z=$.find((J)=>J.startsWith(`${Q}=`));if(Z)return Z.slice(Q.length+1);let X=$.indexOf(Q);if(X===-1)return;let U=$[X+1];if(!U||U.startsWith("--"))return;return U}function B4($){let Q={};for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(!X?.startsWith("--"))continue;if(K4.has(X)||q4.has(X))continue;let U=X.indexOf("=");if(U!==-1){let Y=X.slice(2,U),G=X.slice(U+1);Q[Y]=G;continue}let J=$[Z+1],W=X.slice(2);if(J&&!J.startsWith("--"))Q[W]=J,Z+=1;else Q[W]=!0}return Q}function r2($){let[Q,...Z]=$,X=[];for(let U=0;U<Z.length;U+=1){let J=Z[U];if(!J)continue;if(J.startsWith("--")){if(J==="--profile")U+=1;continue}X.push(J)}return{command:Q,positionals:X,flags:{help:Z.includes("--help")||Z.includes("-h")||Q==="--help",profile:O4(Z,"--profile")},extras:B4(Z)}}function A4($=process.stdout){if(process.env.NO_COLOR)return!1;if(process.env.FORCE_COLOR)return process.env.FORCE_COLOR!=="0";return Boolean($?.isTTY&&process.env.TERM!=="dumb")}function S($,Q,Z=process.stdout){if(!A4(Z))return $;return`${(Array.isArray(Q)?Q:[Q]).map((J)=>d7[J]).join("")}${$}${d7.reset}`}function G$($,Q=process.stdout){let Z=L4[$];return{symbol:S(Z.symbol,Z.tone,Q)}}function P$($="mauve",Q=process.stdout){return{format:(Z)=>S(Z,$,Q)}}function q1($="purple",Q=process.stdout){return{styleFrame:(Z)=>S(Z,$,Q)}}function p0($){return $.trim().split(/\s+/).map((Z,X)=>{if(X===0&&Z==="sumr")return S(Z,M4);if((X===1||X===2)&&!Z.startsWith("-")&&!Z.startsWith("[")&&!Z.startsWith("<"))return S(Z,a7);return Z}).join(" ")}function s7($){let Q=[`${S($.name,[a7,"bold"])} ${S("\xB7","dim")} ${S($.description,"dim")}`,"","Usage:"];for(let Z of $.usage)Q.push(` ${p0(Z)}`);if($.options&&$.options.length>0){Q.push("","Options:");for(let Z of $.options)Q.push(` ${S(Z.flag.padEnd(18),j4)} ${S(Z.description,"dim")}`)}if($.examples&&$.examples.length>0){Q.push("","Examples:");for(let Z of $.examples)Q.push(` ${p0(Z)}`)}return Q.push(""),Q.join(`
9
- `)}function C4($){let Q=$?.filter((Z)=>Z.value!==void 0&&Z.value!==null&&String(Z.value).length>0).map((Z)=>`${S(`${Z.label}:`,["orchid","bold"])} ${String(Z.value)}`);return Q&&Q.length>0?Q.join(`
10
- `):void 0}function S4($){let Q=C4($.fields);if($.details&&Q)return`${Q}
11
- ${$.details}`;return $.details??Q}function r0($,Q){let Z=S4($);if(!Z)return;a8(Z,$.title??Q,P$("dim"))}function r($){T4($)}function B1($="Done"){E4($)}function $1($,Q={}){i0.info($,G$("info")),r0(Q,"Details")}function F4($,Q={}){i0.step($,G$("step")),r0(Q,"Details")}function v($,Q={}){i0.success($,G$("success")),r0(Q,"Details")}function O0($,Q={}){i0.warn($,G$("warn")),r0(Q,"Details")}function j$($,Q={}){i0.error($,{...G$("error",process.stderr),output:process.stderr}),r0(Q,"Details")}function d$($,Q="Details",Z="dim"){a8($,Q,P$(Z))}function m$($,Q="Items"){if($.length===0){$1("No items found.");return}a8($.join(`
12
- `),Q,P$("dim"))}function E($){return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,help:$.help,run:async(Q)=>{if(Q.args.flags.help)return r(`sumr ${$.help.name.split(/\s+/)[0]}`),console.log(s7($.help)),0;return $.execute(Q)}}}function D4($,Q){let Z=$.filter((U)=>Q==="private"||U.visibility==="public"),X=new Map;for(let U of Z){let J=X.get(U.group)??[];J.push(U),X.set(U.group,J)}return[...X.entries()].sort((U,J)=>c8[U[0]].order-c8[J[0]].order).map(([U,J])=>[U,J.sort((W,Y)=>W.name.localeCompare(Y.name))])}function m1($,Q){let Z=["","Options:","",` ${S("--help".padEnd(22),"orchid")} ${S("Show help","dim")}`,""];Z.push("Commands:"),Z.push("");for(let[X,U]of D4($,Q)){let J=c8[X];Z.push(`${S(`${J.label}:`,R4)}`);for(let W of U)Z.push(` ${S(W.name.padEnd(18),I4)} ${S(W.description,"dim")}`);Z.push("")}return Z.push(` ${S("<command> --help Show command help.","dim")}`),Z.push(""),Z.join(`
13
- `)}function t7($){let Q=[`${S($.name,["pink","bold"])} ${S("\xB7","dim")} ${S($.description,"dim")}`,"","Usage:",` ${p0(`sumr ${$.name} <command>`)}`,"","Options:",` ${S("--help, -h".padEnd(22),"orchid")} ${S("Show help","dim")}`,"","Commands:",""];for(let Z of $.commands)Q.push(` ${S(Z.name.padEnd(18),"pink")} ${S(Z.description,"dim")}`);return Q.push(""),Q.push(` ${p0(`sumr ${$.name} <command> --help`)} ${S("Show command help.","dim")}`),Q.push(""),Q.join(`
14
- `)}function N4($){return{...$,argv:$.argv.slice(1),args:{...$.args,positionals:$.args.positionals.slice(1)}}}function L1($){return $}function e7($){let Q=new Map($.commands.map((X)=>[X.name,X]));function Z(){return t7({name:$.name,description:$.description,commands:$.commands})}return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,run:async(X)=>{let[U]=X.args.positionals;if(!U)return r(`sumr ${$.name}`),console.log(Z()),0;let J=Q.get(U);if(!J)return r(`sumr ${$.name}`),j$(`Unknown ${$.unknownSubcommandLabel??$.name} command: ${U}`),console.log(Z()),1;return J.run(N4(X))}}}function o2($){return e7({name:$.name,description:$.description,group:$.group,visibility:$.visibility,commands:$.commands})}function P4($,Q){let[Z]=$;if(!Z)return[...$];if(Z===Q.name)return[...$];if(Z==="--help"||Z==="-h"||Z==="--version"||Z==="-v")return[...$];if(new Set(Q.commands.map((U)=>U.name)).has(Z))return[Q.name,...$];return[...$]}function m7($,Q,Z){r(`sumr ${$.name}`),console.log(m1(Q,Z))}async function b4($){let Q=$.visibility??$.module.visibility,Z=[o2($.module)],X=P4($.argv,$.module),U=r2(X),J=new Map(Z.map((Y)=>[Y.name,Y]));if(!U.command||U.command==="--help"||U.command==="-h")return m7($.module,Z,Q),0;if(U.command==="--version"||U.command==="-v"){if($.version)console.log($.version);else m7($.module,Z,Q);return 0}let W=J.get(U.command);if(!W)return r(`sumr ${$.module.name}`),j$(`Unknown command: ${U.command}`),console.log(m1(Z,Q)),1;try{return await W.run({argv:X,args:U,visibility:Q})}catch(Y){let G=Y instanceof Error?Y.message:"Unexpected error.";return r(`sumr ${$.module.name}`),j$(G),1}}function o0(){return Boolean(process.stdin.isTTY&&process.stdout.isTTY)}async function Q1($){let Q=await f4({message:$.message,options:$.options,initialValue:$.initialValue});if(QZ(Q)){s8();return}return Q}async function K0($){let Q=await v4($);if(QZ(Q)){s8();return}return Q}function s8($="Cancelled."){y4($)}function XZ($){return ZZ.extend(Object.fromEntries(Object.entries($).map(([Q,Z])=>[Q,Z.optional()]))).passthrough()}function x4($,Q){let X=XZ(Q).safeParse($);if(X.success)return{ok:!0,value:X.data};return{ok:!1,issues:X.error.issues.map((J)=>{return`${J.path.length>0?J.path.join("."):"(root)"}: ${J.message}`})}}function g4($){return(Q)=>{let Z=$.safeParse(Q);if(Z.success)return{ok:!0,value:Z.data};return{ok:!1,issues:Z.error.issues.map((U)=>{return`${U.path.length>0?U.path.join("."):"(root)"}: ${U.message}`})}}}var u1="",K1="sumr.yaml",c0,U4=".sumr",r7=".sumr-cache",J4="activations.json",o7=1,K4,q4,d7,L4,M4="purple",a7="pink",j4="orchid",I4="pink",R4="orchid",c8,w4="1.0.0",$Z,k4,ZZ;var N=c2(()=>{c0=["sumr.yaml","sumr.yml"];K4=new Set(["--profile"]),q4=new Set(["--help","-h","--version","-v"]);d7={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",purple:"\x1B[38;2;123;64;149m",pink:"\x1B[38;2;196;91;151m",orchid:"\x1B[38;2;161;100;182m",mauve:"\x1B[38;2;137;104;156m",soft:"\x1B[38;2;96;75;112m",orange:"\x1B[38;2;245;156;88m"},L4={info:{symbol:"\u25C8",tone:"purple"},success:{symbol:"\u25C6",tone:"pink"},warn:{symbol:"\u25B2",tone:"orchid"},error:{symbol:"\u25A0",tone:"pink"},step:{symbol:"\u25CF",tone:"purple"}};c8={auth:{label:"Sign-in",order:1},identity:{label:"Accounts",order:2},system:{label:"Environment",order:3},modules:{label:"Modules",order:4},internal:{label:"Development",order:5}};$Z=E({name:"contract",description:"Print the Core contract version",group:"internal",visibility:"private",help:{name:"core contract",description:"Print the Core contract version",usage:["sumr core contract"]},execute:async()=>{return console.log(w4),0}}),k4=L1({name:"core",description:"Shared SUMR CLI command contracts and UX helpers",group:"internal",visibility:"private",commands:[$Z]});ZZ=l7.object({version:l7.number().int().positive()}).passthrough()});var sU={};p2(sU,{kontractModule:()=>lL});import{cpus as K_}from"os";import{Buffer as y_}from"buffer";import{randomUUID as f_}from"crypto";import{access as v_,mkdir as x_,readdir as s5,rename as g_,rm as h_,stat as u_}from"fs/promises";import{join as Z$}from"path";import{mkdtemp as r_,rm as o_}from"fs/promises";import{tmpdir as a_}from"os";import{join as A9}from"path";import{join as q6}from"path";import{dirname as _3,isAbsolute as V3,join as b9,relative as y9,resolve as M6}from"path";import{mkdir as q3,readdir as B3,stat as L3}from"fs/promises";import{dirname as v9,join as WX,relative as A3,resolve as T1}from"path";import{access as D3,readFile as N3}from"fs/promises";import{dirname as E1,join as CX,relative as SX,resolve as T6}from"path";import{log as B0}from"@clack/prompts";import{join as ZV}from"path";import{bundle as XV,loadConfig as UV}from"@redocly/openapi-core";import{stringify as JV}from"yaml";import{mkdir as jV,writeFile as TV}from"fs/promises";import{dirname as W5,relative as EV,sep as CV}from"path";import{parse as SV,stringify as FV}from"yaml";import{basename as g6,join as fV,relative as d9}from"path";import{camelCase as mV,constantCase as lV,kebabCase as h6,pascalCase as J1}from"change-case";import{jsonSchemaToZod as IH}from"json-schema-to-zod";import{join as U2}from"path";import yH from"@asyncapi/parser/browser";import{log as lX}from"@clack/prompts";import{pascalCase as cX}from"change-case";import{pascalCase as rX}from"change-case";import{pascalCase as K5}from"change-case";import{pascalCase as S6}from"change-case";import{pascalCase as UU}from"change-case";import{pascalCase as YK}from"change-case";import{camelCase as a6,constantCase as BK,pascalCase as QQ,snakeCase as ZQ}from"change-case";import{pascalCase as JQ}from"change-case";import{pascalCase as VQ}from"change-case";import{camelCase as uK,pascalCase as n$}from"change-case";import{basename as sK,join as RU}from"path";import tK from"@apidevtools/swagger-parser";import{log as DU}from"@clack/prompts";import{camelCase as qq}from"change-case";import{access as yU,readdir as fU,rm as t6}from"fs/promises";import{basename as vU,join as a}from"path";import Fq from"@apidevtools/swagger-parser";import{log as M2}from"@clack/prompts";import{mkdir as N6,rm as _2}from"fs/promises";import{join as K$,resolve as T5}from"path";import{mkdir as EB,rm as lU,stat as CB}from"fs/promises";import{join as w6,resolve as SB}from"path";import{basename as rB,resolve as oB}from"path";import aB from"@apidevtools/swagger-parser";import{log as H6}from"@clack/prompts";import{existsSync as S5,mkdirSync as _L,readFileSync as VL,writeFileSync as HL,writeSync as OL}from"fs";import{dirname as KL,join as F5}from"path";import{existsSync as LL,readFileSync as AL}from"fs";import{join as ML}from"path";import{parse as jL}from"yaml";function O_($,Q){this[$]=H_.bind(null,Q)}function k_($){let Q=K6;return K6=$,()=>{K6=Q}}function w9(){return K6}function b($,Q=1){let Z=w9();if(!Z)return;Z.counters.set($,(Z.counters.get($)??0)+Q)}async function Q$($,Q){let Z=performance.now();try{return await Q()}finally{P_($,performance.now()-Z)}}function P_($,Q){let Z=w9();if(!Z)return;Z.phaseDurationsMs.set($,(Z.phaseDurationsMs.get($)??0)+Q),Z.phaseCounts.set($,(Z.phaseCounts.get($)??0)+1)}function b_($){let Q=w9();if(!Q)return;Q.subprocesses.push($)}function Z5($){if(typeof $==="bigint")return Number($);return $}function k9($){b_({name:$.name,command:$.command.join(" "),durationMs:$.durationMs,exitCode:$.exitCode,maxRSS:$.resourceUsage?.maxRSS,cpuUserUs:Z5($.resourceUsage?.cpuTime?.user),cpuSystemUs:Z5($.resourceUsage?.cpuTime?.system)})}function d_($,Q){if(!$.endsWith(".ts"))return Q;if(Q.includes(c5))return Q;return`${n5}${Q}`}async function m_($,Q){let Z=Z$($,"..");await x_(Z,{recursive:!0});let X=Z$(Z,`.${f_()}.tmp`);await Bun.write(X,Q),await g_(X,$)}async function s($,Q){let Z=d_($,Q);try{let X=await u_($),U=y_.byteLength(Z,"utf8");if(X.mtimeMs>0&&X.size===U){let W=await Bun.file($).text();if(Bun.hash(W)===Bun.hash(Z))return b("write.skipped"),!1}}catch{}return await m_($,Z),b("write.changed"),!0}async function y6($,Q){let Z;try{Z=await s5($,{withFileTypes:!0})}catch{return!1}let X=!1;return await Promise.all(Z.filter((U)=>U.isFile()&&U.name.endsWith(".ts")&&U.name!==P6&&!Q.has(U.name)).map(async(U)=>{await h_(Z$($,U.name),{force:!0}),X=!0})),X}async function F1($,Q){let Z=Q.length>0?Q.map((X)=>`export * from '${X}';`).join(`
15
- `):"export {};";return s(Z$($,"index.ts"),`${Z}
16
- `)}async function X1($){try{return await v_($),!0}catch{return!1}}async function l_($){let Q=[],Z=Z$($,"http","index.ts"),X=Z$($,"nats","index.ts");if(await X1(Z))Q.push("export * as HttpSchemas from './http';");if(await X1(X))Q.push("export * as NatsSchemas from './nats';");if(Q.length===0)return!1;return s(Z$($,"index.ts"),`${Q.join(`
3
+ var RH=Object.defineProperty;var DH=($)=>$;function NH($,Q){this[$]=DH.bind(null,Q)}var B8=($,Q)=>{for(var Z in Q)RH($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:NH.bind(Q,Z)})};var A8=($,Q)=>()=>($&&(Q=$($=0)),Q);var J$=import.meta.require;var I2={};B8(I2,{writeSumrYamlTopLevelSection:()=>Y0,writeSumrYamlDocument:()=>k1,writeFileAtomically:()=>M5,validateSumrYaml:()=>w3,sumrWarn:()=>Q$,sumrTitle:()=>n,sumrText:()=>P0,sumrSuccess:()=>P,sumrStep:()=>Y3,sumrSelect:()=>q1,sumrNote:()=>q$,sumrList:()=>i$,sumrIsInteractive:()=>S2,sumrInfo:()=>V1,sumrError:()=>r,sumrDone:()=>g$,sumrCancel:()=>r6,runModuleConfig:()=>z3,runModuleCli:()=>I3,runConfigMenu:()=>N5,renderNamespaceHelp:()=>b5,renderHelp:()=>W0,renderCommandLine:()=>z2,renderCommandHelp:()=>D5,recordActivation:()=>C2,readSumrYamlText:()=>D8,readActivations:()=>p6,parseArgv:()=>N8,mountModule:()=>w8,isActivated:()=>c6,defineModule:()=>P1,defineCommand:()=>E,createSliceValidator:()=>b3,createNamespaceCommand:()=>k5,coreModule:()=>M3,contractCommand:()=>P5,composeSumrYamlSchema:()=>x5,brandText:()=>F,brandSpinnerOptions:()=>H1,brandNoteOptions:()=>b$,brandLogOptions:()=>G$,activationFilePath:()=>l6,SumrYamlEnvelopeSchema:()=>y5,SUMR_YAML_FILENAMES:()=>E2,SUMR_YAML_FILE:()=>b1,ConfigMenuAction:()=>j2,ConfigFieldKind:()=>X0});import{existsSync as R8,mkdirSync as FV,readFileSync as E5,renameSync as MV,rmSync as SV,writeFileSync as IV}from"fs";import{homedir as RV}from"os";import{dirname as C5,join as k0,resolve as DV}from"path";import{existsSync as F5,readFileSync as NV,renameSync as wV,rmSync as bV,writeFileSync as kV}from"fs";import{intro as $3,log as F2,note as n6,outro as Q3}from"@clack/prompts";import{writeSync as J3}from"fs";import{cancel as R3,isCancel as f5,select as D3,text as N3}from"@clack/prompts";import{z as z5}from"zod";function jV($,Q){this[$]=zV.bind(null,Q)}function CV($=process.stdout){if(process.env.NO_COLOR)return!1;if(process.env.FORCE_COLOR)return process.env.FORCE_COLOR!=="0";return Boolean($?.isTTY&&process.env.TERM!=="dumb")}function F($,Q,Z=process.stdout){if(!CV(Z))return $;return`${(Array.isArray(Q)?Q:[Q]).map((W)=>u6[W]).join("")}${$}${u6.reset}`}function G$($,Q=process.stdout){let Z=T5[$];return{symbol:F(Z.symbol,Z.tone,Q)}}function b$($="mauve",Q=process.stdout){return{format:(Z)=>F(Z,$,Q)}}function H1($="purple",Q=process.stdout){return{styleFrame:(Z)=>F(Z,$,Q)}}function M5($,Q,Z){let X=`${$}.${process.pid}.${Date.now()}.tmp`;try{kV(X,Q,Z),wV(X,$)}catch(Y){if(F5(X))bV(X,{force:!0});throw Y}}function PV($){return $.endsWith(":")?$.slice(0,-1):$}function fV($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yV($){return/^[A-Za-z][A-Za-z0-9_-]*:\s*(?:.*)$/.test($)}function q5($){let Q=[...$];while(Q.at(-1)?.trim()===Z0)Q.pop();return Q}function xV($){let Q=[...$];while(Q[0]?.trim()===Z0)Q.shift();return Q}function K5($,Q){return $[Q]??Z0}function vV($,Q,Z){let X=PV(Q),Y=new RegExp(`^${fV(X)}:\\s*(?:#.*)?$`),W=$.findIndex((G)=>Y.test(G));if(W===-1)return;let U=Z&&$[W-1]?.trim()===Z?W-1:W,J=$.length;for(let G=W+1;G<$.length;G+=1)if(yV(K5($,G))){J=G;break}while(J>W+1){let G=K5($,J-1).trim();if(G!==Z0&&!G.startsWith("#"))break;J-=1}return{start:U,end:J}}function B5($,Q,Z){let X=[...$];if(X.length>0)X.push(Z0);if(X.push(...Q),Z.length>0)X.push(Z0,...Z);return X.push(Z0),X.join(`
4
+ `)}function gV($,Q,Z,X={}){let Y=$.endsWith(`
5
+ `),W=$.split(`
6
+ `);if(Y)W.pop();let U=vV(W,Q,X.sectionComment);if(!U)return B5(q5(W),Z,[]);return B5(q5(W.slice(0,U.start)),Z,xV(W.slice(U.end)))}function D8($,Q=`version: 1
7
+ `){return F5($)?NV($,"utf8"):Q}function k1($,Q){M5($,Q,"utf8")}function Y0($,Q,Z,X={}){let Y=D8($,X.fallbackContent);k1($,gV(Y,Q,Z,X))}function m6($){let Q=DV($);for(;;){for(let X of E2)if(R8(k0(Q,X)))return Q;let Z=C5(Q);if(Z===Q)return;Q=Z}}function l6($={}){let Q=$.cwd??process.cwd(),Z=$.home??RV(),X=m6(Q),Y=X?k0(X,S5):k0(Z,hV);return k0(Y,uV)}function dV(){return{version:I5,activated:{}}}function mV($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.activated==="object"&&Q.activated!==null}function p6($={}){let Q=l6($);return lV(Q)??dV()}function lV($){if(!R8($))return;try{let Q=JSON.parse(E5($,"utf8"));if(!mV(Q))return;return{version:I5,activated:{...Q.activated}}}catch{return}}function pV($,Q={}){let Z=Q.cwd??process.cwd(),X=m6(Z)??Z;return R8(k0(X,S5,$))}function cV($,Q={}){let Z=Q.cwd??process.cwd(),X=m6(Z);if(!X)return!1;let Y=new RegExp(`^${rV($)}\\s*:`,"m");for(let W of E2){let U=k0(X,W);if(!R8(U))continue;try{if(Y.test(E5(U,"utf8")))return!0}catch{return!1}}return!1}function c6($,Q={}){if(p6(Q).activated[$])return!0;return cV($,Q)||pV($,Q)}function C2($,Q={}){let Z=l6(Q),X=p6(Q);return X.activated[$]={at:new Date().toISOString()},nV(Z,X),X}function nV($,Q){let Z=`${$}.sumr-tmp-${Date.now()}`;FV(C5($),{recursive:!0});try{IV(Z,`${JSON.stringify(Q,null,2)}
8
+ `,"utf8"),MV(Z,$)}finally{SV(Z,{force:!0})}}function rV($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function iV($,Q){let Z=$.find((W)=>W.startsWith(`${Q}=`));if(Z)return Z.slice(Q.length+1);let X=$.indexOf(Q);if(X===-1)return;let Y=$[X+1];if(!Y||Y.startsWith("--"))return;return Y}function sV($){let Q={};for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(!X?.startsWith("--"))continue;if(oV.has(X)||aV.has(X))continue;let Y=X.indexOf("=");if(Y!==-1){let J=X.slice(2,Y),G=X.slice(Y+1);Q[J]=G;continue}let W=$[Z+1],U=X.slice(2);if(W&&!W.startsWith("--"))Q[U]=W,Z+=1;else Q[U]=!0}return Q}function N8($){let[Q,...Z]=$,X=[];for(let Y=0;Y<Z.length;Y+=1){let W=Z[Y];if(!W)continue;if(W.startsWith("--")){if(W==="--profile")Y+=1;continue}X.push(W)}return{command:Q,positionals:X,flags:{help:Z.includes("--help")||Z.includes("-h")||Q==="--help",profile:iV(Z,"--profile")},extras:sV(Z)}}function z2($){return $.trim().split(/\s+/).map((Z,X)=>{if(X===0&&Z==="sumr")return F(Z,tV);if((X===1||X===2)&&!Z.startsWith("-")&&!Z.startsWith("[")&&!Z.startsWith("<"))return F(Z,R5);return Z}).join(" ")}function D5($){let Q=[`${F($.name,[R5,"bold"])} ${F("\xB7","dim")} ${F($.description,"dim")}`,"","Usage:"];for(let Z of $.usage)Q.push(` ${z2(Z)}`);if($.options&&$.options.length>0){Q.push("","Options:");for(let Z of $.options)Q.push(` ${F(Z.flag.padEnd(18),eV)} ${F(Z.description,"dim")}`)}if($.examples&&$.examples.length>0){Q.push("","Examples:");for(let Z of $.examples)Q.push(` ${z2(Z)}`)}return Q.push(""),Q.join(`
9
+ `)}function Z3($){let Q=$?.filter((Z)=>Z.value!==void 0&&Z.value!==null&&String(Z.value).length>0).map((Z)=>`${F(`${Z.label}:`,["orchid","bold"])} ${String(Z.value)}`);return Q&&Q.length>0?Q.join(`
10
+ `):void 0}function X3($){let Q=Z3($.fields);if($.details&&Q)return`${Q}
11
+ ${$.details}`;return $.details??Q}function M2($,Q){let Z=X3($);if(!Z)return;n6(Z,$.title??Q,b$("dim"))}function n($){$3($)}function g$($="Done"){Q3($)}function V1($,Q={}){F2.info($,G$("info")),M2(Q,"Details")}function Y3($,Q={}){F2.step($,G$("step")),M2(Q,"Details")}function P($,Q={}){F2.success($,G$("success")),M2(Q,"Details")}function Q$($,Q={}){F2.warn($,G$("warn")),M2(Q,"Details")}function r($,Q={}){F2.error($,{...G$("error",process.stderr),output:process.stderr}),M2(Q,"Details")}function q$($,Q="Details",Z="dim"){n6($,Q,b$(Z))}function i$($,Q="Items"){if($.length===0){V1("No items found.");return}n6($.join(`
12
+ `),Q,b$("dim"))}function E($){return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,help:$.help,run:async(Q)=>{if(Q.args.flags.help)return n(`sumr ${$.help.name.split(/\s+/)[0]}`),console.log(D5($.help)),0;return $.execute(Q)}}}function W3($,Q,Z){return[...$.map((X)=>({value:X.key,label:X.label,hint:X.hint()})),{value:j2.SAVE,label:Q?"Save & exit *":"Save & exit",hint:Z?"creates config":"updates config"},{value:j2.DISCARD,label:"Exit without saving",hint:Q?"changes will be lost":""}]}async function U3($,Q,Z,X,Y,W,U,J){let{outro:G,log:_,isCancel:H}=U;if(H($))return G("Cancelled \u2014 no changes saved."),0;if($===j2.DISCARD){if(W.value)_.warn("Changes discarded.",J("warn"));return G("Exited without saving."),0}if($===j2.SAVE){let q=X(Z);return _.success(q,J("success")),G(`${Y??"Done."} \uD83C\uDF89`),0}let V=Q.find((q)=>q.key===$);if(V){if(await V.run()!==!1)W.value=!0}return}async function N5($){let{title:Q,items:Z,onSave:X,isNew:Y,outroAfterSave:W}=$,U=await import("@clack/prompts"),{brandLogOptions:J}=await Promise.resolve().then(()=>(T2(),j5)),{intro:G,select:_,log:H}=U;if(G(Q),!Y)H.info("Editing existing config \u2014 choose what to change.",J("info"));let V={value:!1};for(;;){let q=W3(Z,V.value,Y),K=await _({message:"What do you want to configure?",options:q}),B=await U3(K,Z,Y,X,W,V,U,J);if(B!==void 0)return B}}function G3($){J3(1,$)}function _3($){return $ instanceof Error?$.message:String($)}function w5($){return $.startsWith("--")?$.slice(2):$}function A5($,Q){$(`${JSON.stringify(Q,null,2)}
13
+ `)}function H3($){if(Array.isArray($))return $.length===0?"none":$.join(", ");return String($)}function V3($,Q){return $.hint?.(Q)??H3($.get(Q))}function q3($){return $.map((Q)=>Q.value)}function L5($,Q,Z){let X=q3($);if(X.includes(Q))return Q;throw Error(`${Z} must be one of: ${X.join(", ")}`)}function K3($,Q){if($==="true")return!0;if($==="false")return!1;throw Error(`${Q} must be true or false`)}function B3($,Q,Z){let X=$.flag?`--${w5($.flag)}`:$.key;if($.kind===X0.Boolean)return $.set(Q,K3(Z,X));if($.kind===X0.MultiSelect){let Y=Z.split(",").map((W)=>W.trim()).filter(Boolean).map((W)=>L5($.options,W,X));return $.set(Q,Y)}if($.kind===X0.Select)return $.set(Q,L5($.options,Z.trim(),X));return $.set(Q,Z)}function A3($,Q,Z){let X=Q,Y=!1;for(let W of $.fields){if(!W.flag)continue;let U=w5(W.flag),J=Z[U];if(J===void 0)continue;if(J===!0)throw Error(`--${U} requires a value`);X=B3(W,X,J),Y=!0}return{changed:Y,state:X}}async function L3($,Q){let Z=await import("@clack/prompts"),{isCancel:X,multiselect:Y,select:W,text:U}=Z;if($.kind===X0.Select){let G=await W({message:$.description,options:$.options.map((_)=>({value:_.value,label:_.label,hint:_.hint??_.description})),initialValue:$.get(Q)});if(X(G))return{changed:!1,state:Q};return{changed:!0,state:$.set(Q,String(G))}}if($.kind===X0.MultiSelect){let G=await Y({message:$.description,options:$.options.map((_)=>({value:_.value,label:_.label,hint:_.hint??_.description})),initialValues:[...$.get(Q)]});if(X(G))return{changed:!1,state:Q};return{changed:!0,state:$.set(Q,G)}}if($.kind===X0.Boolean){let G=await W({message:$.description,options:[{value:"true",label:"Enabled",hint:"true"},{value:"false",label:"Disabled",hint:"false"}],initialValue:$.get(Q)?"true":"false"});if(X(G))return{changed:!1,state:Q};return{changed:!0,state:$.set(Q,G==="true")}}let J=await U({message:$.description,placeholder:$.placeholder,initialValue:$.get(Q),validate:$.validate});if(X(J))return{changed:!1,state:Q};return{changed:!0,state:$.set(Q,String(J))}}async function O3($,Q,Z){let X=Z,Y=$.isNew?.(Q)??!1;return N5({title:$.title,isNew:Y,items:$.fields.map((W)=>({key:W.key,label:W.label,hint:()=>V3(W,X),run:async()=>{let U=await L3(W,X);return X=U.state,U.changed}})),onSave:(W)=>{return $.write(Q,X),$.savedMessage?.(X,W)??`${$.command} configuration saved.`},outroAfterSave:$.outroAfterSave})}async function z3($){let{cwd:Q,descriptor:Z,json:X,quiet:Y}=$,W=$.writeOutput??G3,U=$.flagValues??{},J,G=!1;try{J=Z.read(Q);let _=A3(Z,J,U);if(J=_.state,G=_.changed,G)Z.write(Q,J)}catch(_){let H=_3(_);if(X)A5(W,{ok:!1,command:Z.command,data:null,warnings:[],error:H});else if(!Y)r(`${Z.title} failed: ${H}`);return 1}if(X)return A5(W,{ok:!0,command:Z.command,data:Z.jsonData(J,G),warnings:[],error:null}),0;if(G){if(!Y)P(`${Z.title} updated.`,{details:Z.format(J).trimEnd()});return 0}if($.interactive&&!Y)return O3(Z,Q,J);if(!Y)W(Z.format(J));return 0}function E3($,Q){let Z=$.filter((Y)=>Q==="private"||Y.visibility==="public"),X=new Map;for(let Y of Z){let W=X.get(Y.group)??[];W.push(Y),X.set(Y.group,W)}return[...X.entries()].sort((Y,W)=>d6[Y[0]].order-d6[W[0]].order).map(([Y,W])=>[Y,W.sort((U,J)=>U.name.localeCompare(J.name))])}function W0($,Q){let Z=["","Options:","",` ${F("--help".padEnd(22),"orchid")} ${F("Show help","dim")}`,""];Z.push("Commands:"),Z.push("");for(let[X,Y]of E3($,Q)){let W=d6[X];Z.push(`${F(`${W.label}:`,T3)}`);for(let U of Y)Z.push(` ${F(U.name.padEnd(18),j3)} ${F(U.description,"dim")}`);Z.push("")}return Z.push(` ${F("<command> --help Show command help.","dim")}`),Z.push(""),Z.join(`
14
+ `)}function b5($){let Q=[`${F($.name,["pink","bold"])} ${F("\xB7","dim")} ${F($.description,"dim")}`,"","Usage:",` ${z2(`sumr ${$.name} <command>`)}`,"","Options:",` ${F("--help, -h".padEnd(22),"orchid")} ${F("Show help","dim")}`,"","Commands:",""];for(let Z of $.commands)Q.push(` ${F(Z.name.padEnd(18),"pink")} ${F(Z.description,"dim")}`);return Q.push(""),Q.push(` ${z2(`sumr ${$.name} <command> --help`)} ${F("Show command help.","dim")}`),Q.push(""),Q.join(`
15
+ `)}function C3($){return{...$,argv:$.argv.slice(1),args:{...$.args,positionals:$.args.positionals.slice(1)}}}function P1($){return $}function k5($){let Q=new Map($.commands.map((X)=>[X.name,X]));function Z(){return b5({name:$.name,description:$.description,commands:$.commands})}return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,run:async(X)=>{let[Y]=X.args.positionals;if(!Y)return n(`sumr ${$.name}`),console.log(Z()),0;let W=Q.get(Y);if(!W)return n(`sumr ${$.name}`),r(`Unknown ${$.unknownSubcommandLabel??$.name} command: ${Y}`),console.log(Z()),1;return W.run(C3(X))}}}function w8($){return k5({name:$.name,description:$.description,group:$.group,visibility:$.visibility,commands:$.commands})}function S3($,Q){let[Z]=$;if(!Z)return[...$];if(Z===Q.name)return[...$];if(Z==="--help"||Z==="-h"||Z==="--version"||Z==="-v")return[...$];if(new Set(Q.commands.map((Y)=>Y.name)).has(Z))return[Q.name,...$];return[...$]}function O5($,Q,Z){n(`sumr ${$.name}`),console.log(W0(Q,Z))}async function I3($){let Q=$.visibility??$.module.visibility,Z=[w8($.module)],X=S3($.argv,$.module),Y=N8(X),W=new Map(Z.map((J)=>[J.name,J]));if(!Y.command||Y.command==="--help"||Y.command==="-h")return O5($.module,Z,Q),0;if(Y.command==="--version"||Y.command==="-v"){if($.version)console.log($.version);else O5($.module,Z,Q);return 0}let U=W.get(Y.command);if(!U)return n(`sumr ${$.module.name}`),r(`Unknown command: ${Y.command}`),console.log(W0(Z,Q)),1;try{return await U.run({argv:X,args:Y,visibility:Q})}catch(J){let G=J instanceof Error?J.message:"Unexpected error.";return n(`sumr ${$.module.name}`),r(G),1}}function S2(){return Boolean(process.stdin.isTTY&&process.stdout.isTTY)}async function q1($){let Q=await D3({message:$.message,options:$.options,initialValue:$.initialValue});if(f5(Q)){r6();return}return Q}async function P0($){let Q=await N3($);if(f5(Q)){r6();return}return Q}function r6($="Cancelled."){R3($)}function x5($){return y5.extend(Object.fromEntries(Object.entries($).map(([Q,Z])=>[Q,Z.optional()]))).passthrough()}function w3($,Q){let X=x5(Q).safeParse($);if(X.success)return{ok:!0,value:X.data};return{ok:!1,issues:X.error.issues.map((W)=>{return`${W.path.length>0?W.path.join("."):"(root)"}: ${W.message}`})}}function b3($){return(Q)=>{let Z=$.safeParse(Q);if(Z.success)return{ok:!0,value:Z.data};return{ok:!1,issues:Z.error.issues.map((Y)=>{return`${Y.path.length>0?Y.path.join("."):"(root)"}: ${Y.message}`})}}}var OV,zV=($)=>$,TV=($,Q)=>{for(var Z in Q)OV($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:jV.bind(Q,Z)})},EV=($,Q)=>()=>($&&(Q=$($=0)),Q),j5,u6,T5,T2,Z0="",b1="sumr.yaml",E2,hV=".sumr",S5=".sumr-cache",uV="activations.json",I5=1,oV,aV,tV="purple",R5="pink",eV="orchid",j2,X0,j3="pink",T3="orchid",d6,F3="1.1.0",P5,M3,y5;var R=A8(()=>{OV=Object.defineProperty;j5={};TV(j5,{brandText:()=>F,brandSpinnerOptions:()=>H1,brandNoteOptions:()=>b$,brandLogOptions:()=>G$});T2=EV(()=>{u6={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",purple:"\x1B[38;2;123;64;149m",pink:"\x1B[38;2;196;91;151m",orchid:"\x1B[38;2;161;100;182m",mauve:"\x1B[38;2;137;104;156m",soft:"\x1B[38;2;96;75;112m",orange:"\x1B[38;2;245;156;88m"},T5={info:{symbol:"\u25C8",tone:"purple"},success:{symbol:"\u25C6",tone:"pink"},warn:{symbol:"\u25B2",tone:"orchid"},error:{symbol:"\u25A0",tone:"pink"},step:{symbol:"\u25CF",tone:"purple"}}}),E2=["sumr.yaml","sumr.yml"];oV=new Set(["--profile"]),aV=new Set(["--help","-h","--version","-v"]);T2();T2();T2();j2={DISCARD:"__discard__",SAVE:"__save__"},X0={Boolean:"boolean",MultiSelect:"multiSelect",Select:"select",Text:"text"};T2();d6={auth:{label:"Sign-in",order:1},identity:{label:"Accounts",order:2},system:{label:"Environment",order:3},modules:{label:"Modules",order:4},internal:{label:"Development",order:5}};P5=E({name:"contract",description:"Print the Core contract version",group:"internal",visibility:"private",help:{name:"core contract",description:"Print the Core contract version",usage:["sumr core contract"]},execute:async()=>{return console.log(F3),0}}),M3=P1({name:"core",description:"Shared SUMR CLI command contracts and UX helpers",group:"internal",visibility:"private",commands:[P5]});y5=z5.object({version:z5.number().int().positive()}).passthrough()});var yU={};B8(yU,{kontractModule:()=>BE});import{cpus as x4}from"os";import{Buffer as Jq}from"buffer";import{randomUUID as Gq}from"crypto";import{access as _q,mkdir as Hq,readdir as KY,rename as Vq,rm as qq,stat as Kq}from"fs/promises";import{join as X$}from"path";import{mkdtemp as Eq,rm as Cq}from"fs/promises";import{tmpdir as Fq}from"os";import{join as GQ}from"path";import{join as l8}from"path";import{dirname as vq,isAbsolute as gq,join as SQ,relative as IQ,resolve as r8}from"path";import{mkdir as mq,readdir as lq,stat as pq}from"fs/promises";import{dirname as RQ,join as CY,relative as cq,resolve as d1}from"path";import{parse as nq}from"yaml";import{access as XK,readFile as YK}from"fs/promises";import{dirname as m1,join as uY,relative as dY,resolve as a8}from"path";import{log as y0}from"@clack/prompts";import{basename as bQ,join as bK,relative as L9}from"path";import{join as hK}from"path";import{bundle as uK,loadConfig as dK}from"@redocly/openapi-core";import{stringify as mK}from"yaml";import{mkdir as XB}from"fs/promises";import{dirname as PQ,relative as YB,resolve as qQ,sep as WB}from"path";import{parse as UB,stringify as JB}from"yaml";import{mkdir as CB,writeFile as FB}from"fs/promises";import{dirname as BX,relative as MB,sep as SB}from"path";import{parse as IB,stringify as RB}from"yaml";import{mkdir as e8,rm as k2}from"fs/promises";import{join as $1}from"path";import{camelCase as nB,constantCase as rB,kebabCase as O9,pascalCase as z1}from"change-case";import{jsonSchemaToZod as wA}from"json-schema-to-zod";import{join as D2}from"path";import gA from"@asyncapi/parser/browser";import{log as AW}from"@clack/prompts";import{pascalCase as OW}from"change-case";import{pascalCase as TW}from"change-case";import{pascalCase as CX}from"change-case";import{pascalCase as $9}from"change-case";import{pascalCase as wW}from"change-case";import{access as yW,readdir as xW,rm as D9}from"fs/promises";import{join as iQ}from"path";import{pascalCase as AO}from"change-case";import{camelCase as w9,constantCase as MO,pascalCase as aQ,snakeCase as sQ}from"change-case";import{pascalCase as $Z}from"change-case";import{pascalCase as UZ}from"change-case";import{camelCase as iO,pascalCase as s$}from"change-case";import{basename as Wz,join as XU}from"path";import Uz from"@apidevtools/swagger-parser";import{log as YU}from"@clack/prompts";import{camelCase as Fz}from"change-case";import{basename as HU,join as B$}from"path";import Pz from"@apidevtools/swagger-parser";import{log as p2}from"@clack/prompts";import{join as N2,resolve as NX}from"path";import{mkdir as jj,rm as KU,stat as Tj}from"fs/promises";import{join as W9,resolve as Ej}from"path";import{mkdtemp as zU,rm as jU}from"fs/promises";import{tmpdir as TU}from"os";import{basename as cj,join as U9,resolve as nj}from"path";import rj from"@apidevtools/swagger-parser";import{log as u8}from"@clack/prompts";import{writeSync as JT}from"fs";import{readFileSync as EU}from"fs";import{parseDocument as CU}from"yaml";import{existsSync as GT,readFileSync as _T}from"fs";import{dirname as HT,join as kX,resolve as VT}from"path";import{parse as qT}from"yaml";import{existsSync as xX,mkdirSync as vT,readFileSync as gT,writeFileSync as hT,writeSync as uT}from"fs";import{dirname as dT,join as vX}from"path";import{isCancel as mT,select as lT}from"@clack/prompts";import{existsSync as pT,mkdirSync as cT,readFileSync as nT,writeFileSync as rT}from"fs";import{dirname as iT,join as oT}from"path";function y4($,Q){this[$]=f4.bind(null,Q)}function Yq($){let Q=m8;return m8=$,()=>{m8=Q}}function CQ(){return m8}function f($,Q=1){let Z=CQ();if(!Z)return;Z.counters.set($,(Z.counters.get($)??0)+Q)}async function Z$($,Q){let Z=performance.now();try{return await Q()}finally{Wq($,performance.now()-Z)}}function Wq($,Q){let Z=CQ();if(!Z)return;Z.phaseDurationsMs.set($,(Z.phaseDurationsMs.get($)??0)+Q),Z.phaseCounts.set($,(Z.phaseCounts.get($)??0)+1)}function Uq($){let Q=CQ();if(!Q)return;Q.subprocesses.push($)}function _X($){if(typeof $==="bigint")return Number($);return $}function FQ($){Uq({name:$.name,command:$.command.join(" "),durationMs:$.durationMs,exitCode:$.exitCode,maxRSS:$.resourceUsage?.maxRSS,cpuUserUs:_X($.resourceUsage?.cpuTime?.user),cpuSystemUs:_X($.resourceUsage?.cpuTime?.system)})}function Bq($,Q){if(!$.endsWith(".ts"))return Q;if(Q.includes(JY))return Q;return`${GY}${Q}`}async function Aq($,Q){let Z=X$($,"..");await Hq(Z,{recursive:!0});let X=X$(Z,`.${Gq()}.tmp`);await Bun.write(X,Q),await Vq(X,$)}async function e($,Q){let Z=Bq($,Q);try{let X=await Kq($),Y=Jq.byteLength(Z,"utf8");if(X.mtimeMs>0&&X.size===Y){let U=await Bun.file($).text();if(Bun.hash(U)===Bun.hash(Z))return f("write.skipped"),!1}}catch{}return await Aq($,Z),f("write.changed"),!0}async function H9($,Q){let Z;try{Z=await KY($,{withFileTypes:!0})}catch{return!1}let X=!1;return await Promise.all(Z.filter((Y)=>Y.isFile()&&Y.name.endsWith(".ts")&&Y.name!==G9&&!Q.has(Y.name)).map(async(Y)=>{await qq(X$($,Y.name),{force:!0}),X=!0})),X}async function p1($,Q){let Z=Q.length>0?Q.map((X)=>`export * from '${X}';`).join(`
16
+ `):"export {};";return e(X$($,"index.ts"),`${Z}
17
+ `)}async function A1($){try{return await _q($),!0}catch{return!1}}async function Lq($){let Q=[],Z=X$($,"http","index.ts"),X=X$($,"nats","index.ts");if(await A1(Z))Q.push("export * as HttpSchemas from './http';");if(await A1(X))Q.push("export * as NatsSchemas from './nats';");if(Q.length===0)return!1;return e(X$($,"index.ts"),`${Q.join(`
17
18
  `)}
18
- `)}async function p_($){let Q=Z$($,b6),Z=Z$(Q,"runtime.ts"),X=Z$(Q,"http","index.ts"),U=Z$(Q,"nats","index.ts"),J=[];if(await X1(X))J.push("export * as HttpSchemas from './http';");if(await X1(U))J.push("export * as NatsSchemas from './nats';");if(await X1(Z))J.push("export * from './runtime';");if(J.length===0)return!1;return s(Z$(Q,"index.ts"),`${J.join(`
19
+ `)}async function Oq($){let Q=X$($,_9),Z=X$(Q,"runtime.ts"),X=X$(Q,"http","index.ts"),Y=X$(Q,"nats","index.ts"),W=[];if(await A1(X))W.push("export * as HttpSchemas from './http';");if(await A1(Y))W.push("export * as NatsSchemas from './nats';");if(await A1(Z))W.push("export * from './runtime';");if(W.length===0)return!1;return e(X$(Q,"index.ts"),`${W.join(`
19
20
  `)}
20
- `)}function c_($,Q){let Z=$.replace(/[^A-Za-z0-9_$]/g,"_");if(Z.length===0)Z="_module";if(/^[0-9]/.test(Z))Z=`_${Z}`;let X=Z,U=2;while(Q.has(X))X=`${Z}_${U}`,U+=1;return Q.add(X),X}async function n_($){return t5($)}async function i_($){return await X1(Z$($,"http","index.ts"))||await X1(Z$($,"nats","index.ts"))}async function t5($){if(!await X1($))return!1;if(await i_($))return!1;let Z=(await s5($,{withFileTypes:!0})).filter((W)=>W.isDirectory()&&!W.name.startsWith(".")).map((W)=>W.name).sort((W,Y)=>W.localeCompare(Y)),X=new Set,U=[],J=!1;for(let W of Z){let Y=Z$($,W);J=await t5(Y)||J;let G=Z$(Y,"index.ts");if(!await X1(G))continue;let z=c_(W,X);U.push(`export * as ${z} from './${W}';`)}if(U.length===0)return J;return await s(Z$($,"index.ts"),`${U.join(`
21
+ `)}function zq($,Q){let Z=$.replace(/[^A-Za-z0-9_$]/g,"_");if(Z.length===0)Z="_module";if(/^[0-9]/.test(Z))Z=`_${Z}`;let X=Z,Y=2;while(Q.has(X))X=`${Z}_${Y}`,Y+=1;return Q.add(X),X}async function jq($){return BY($)}async function Tq($){return await A1(X$($,"http","index.ts"))||await A1(X$($,"nats","index.ts"))}async function BY($){if(!await A1($))return!1;if(await Tq($))return!1;let Z=(await KY($,{withFileTypes:!0})).filter((U)=>U.isDirectory()&&!U.name.startsWith(".")).map((U)=>U.name).sort((U,J)=>U.localeCompare(J)),X=new Set,Y=[],W=!1;for(let U of Z){let J=X$($,U);W=await BY(J)||W;let G=X$(J,"index.ts");if(!await A1(G))continue;let _=zq(U,X);Y.push(`export * as ${_} from './${U}';`)}if(Y.length===0)return W;return await e(X$($,"index.ts"),`${Y.join(`
21
22
  `)}
22
- `)||J}function e5(){return Bun.which(sZ)??A9(process.cwd(),"node_modules",".bin",sZ)}function P9($,Q){return $.length>0?$:`biome format failed with code ${Q}`}function s_($){return $.includes("No files were processed")&&$.includes("provided but ignored")}function t_($,Q,Z){return[`Could not format generated TypeScript for ${Z}.`,P9($,Q)].join(`
23
- `)}function e_($){if(XX.test($))return $;let Q=$.match(ZX);if(!Q?.groups)return $;let Z=Q.groups.before??"",U=(Q.groups.imports??"").trimEnd();if(U.split(`
24
- `).filter((Y)=>Y.trim().length>0).length<=5)return $;let W=$.slice(Q[0].length);return`${Z}//#region \uD83D\uDCE6 Imports
25
- ${U}
23
+ `)||W}function AY(){return Bun.which(UX)??GQ(process.cwd(),"node_modules",".bin",UX)}function MQ($,Q){return $.length>0?$:`biome format failed with code ${Q}`}function Mq($){return $.includes("No files were processed")&&$.includes("provided but ignored")}function Sq($,Q,Z){return[`Could not format generated TypeScript for ${Z}.`,MQ($,Q)].join(`
24
+ `)}function Iq($){if(jY.test($))return $;let Q=$.match(zY);if(!Q?.groups)return $;let Z=Q.groups.before??"",Y=(Q.groups.imports??"").trimEnd();if(Y.split(`
25
+ `).filter((J)=>J.trim().length>0).length<=5)return $;let U=$.slice(Q[0].length);return`${Z}//#region \uD83D\uDCE6 Imports
26
+ ${Y}
26
27
 
27
28
  //#endregion
28
- ${W}`}async function f6($,Q="file.ts"){let Z=[e5(),"format","--stdin-file-path","file.ts"],X=performance.now(),U=Bun.spawn(Z,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",env:{...process.env}}),J=await U.exited,W=U.resourceUsage(),Y=(await new Response(U.stderr).text()).trim();if(k9({name:"biome.formatFile",command:Z,durationMs:performance.now()-X,exitCode:J,resourceUsage:W}),b("format.fileSubprocesses"),J!==0)throw Error(t_(Y,J,Q));let G=await new Response(U.stdout).text();if(G.length===0)throw Error("biome format returned empty stdout");return e_(G)}async function $X($,Q,Z){let X=[e5(),"format","--write",...Q,$],U=performance.now(),J=Bun.spawn(X,{cwd:process.cwd(),stdout:"pipe",stderr:"pipe",env:{...process.env}}),W=await J.exited,Y=J.resourceUsage(),G=(await new Response(J.stdout).text()).trim(),z=(await new Response(J.stderr).text()).trim(),_=[G,z].filter(Boolean).join(`
29
- `).trim();return k9({name:Z,command:X,durationMs:performance.now()-U,exitCode:W,resourceUsage:Y}),b("format.directorySubprocesses"),{details:_,exitCode:W}}async function $3(){let $=await r_(A9(a_(),"kontract-biome-")),Q=A9($,"biome.json");return await Bun.write(Q,`${JSON.stringify(QX,null,2)}
30
- `),{configPath:Q,cleanup:()=>o_($,{recursive:!0,force:!0})}}async function Q3($){let{configPath:Q,cleanup:Z}=await $3();try{b("format.directoryConfigFallbacks");let{details:X,exitCode:U}=await $X($,["--config-path",Q],"biome.formatDirectoryIsolated");if(U!==0)return{success:!1,details:P9(X,U)};return{success:!0,details:["Consumer Biome config ignored the generated directory; formatted with Kontract isolated config.",X].filter((J)=>J.length>0).join(`
31
- `)}}finally{await Z()}}async function Z3($){let{details:Q,exitCode:Z}=await $X($,["--vcs-enabled=false"],"biome.formatDirectory");if(Z!==0){if(s_(Q))return Q3($);return{success:!1,details:P9(Q,Z)}}return{success:!0,details:Q.length>0?Q:void 0}}function X3(){return`import { HttpStatus, SetMetadata, applyDecorators } from '@nestjs/common';
29
+ ${U}`}async function V9($,Q="file.ts"){let Z=[AY(),"format","--stdin-file-path","file.ts"],X=performance.now(),Y=Bun.spawn(Z,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",env:{...process.env}}),W=await Y.exited,U=Y.resourceUsage(),J=(await new Response(Y.stderr).text()).trim();if(FQ({name:"biome.formatFile",command:Z,durationMs:performance.now()-X,exitCode:W,resourceUsage:U}),f("format.fileSubprocesses"),W!==0)throw Error(Sq(J,W,Q));let G=await new Response(Y.stdout).text();if(G.length===0)throw Error("biome format returned empty stdout");return Iq(G)}async function LY($,Q,Z){let X=[AY(),"format","--write",...Q,$],Y=performance.now(),W=Bun.spawn(X,{cwd:process.cwd(),stdout:"pipe",stderr:"pipe",env:{...process.env}}),U=await W.exited,J=W.resourceUsage(),G=(await new Response(W.stdout).text()).trim(),_=(await new Response(W.stderr).text()).trim(),H=[G,_].filter(Boolean).join(`
30
+ `).trim();return FQ({name:Z,command:X,durationMs:performance.now()-Y,exitCode:U,resourceUsage:J}),f("format.directorySubprocesses"),{details:H,exitCode:U}}async function Rq(){let $=await Eq(GQ(Fq(),"kontract-biome-")),Q=GQ($,"biome.json");return await Bun.write(Q,`${JSON.stringify(OY,null,2)}
31
+ `),{configPath:Q,cleanup:()=>Cq($,{recursive:!0,force:!0})}}async function Dq($){let{configPath:Q,cleanup:Z}=await Rq();try{f("format.directoryConfigFallbacks");let{details:X,exitCode:Y}=await LY($,["--config-path",Q],"biome.formatDirectoryIsolated");if(Y!==0)return{success:!1,details:MQ(X,Y)};return{success:!0,details:["Consumer Biome config ignored the generated directory; formatted with Kontract isolated config.",X].filter((W)=>W.length>0).join(`
32
+ `)}}finally{await Z()}}async function Nq($){let{details:Q,exitCode:Z}=await LY($,["--vcs-enabled=false"],"biome.formatDirectory");if(Z!==0){if(Mq(Q))return Dq($);return{success:!1,details:MQ(Q,Z)}}return{success:!0,details:Q.length>0?Q:void 0}}function wq(){return`import { HttpStatus, SetMetadata, applyDecorators } from '@nestjs/common';
32
33
  import {
33
34
  ApiBody,
34
35
  ApiExtension,
@@ -165,50 +166,50 @@ export function ApiDoc(operation: ApiDocOperation): MethodDecorator {
165
166
 
166
167
  return applyDecorators(...decorators);
167
168
  }
168
- `}function U3($){let Q=$.trim();if(!Q.startsWith("export ")||Q==="export {};")return null;return Q.endsWith(";")?Q:`${Q};`}async function J3($){try{return(await Bun.file($).text()).split(/\r?\n/).map(U3).filter((Z)=>Boolean(Z))}catch{return[]}}async function W3($){let Q=q6($,P6),Z=new Set(await J3(Q));return Z.add("export * from './decorators/api-doc';"),s(Q,`${[...Z].sort().join(`
169
+ `}function bq($){let Q=$.trim();if(!Q.startsWith("export ")||Q==="export {};")return null;return Q.endsWith(";")?Q:`${Q};`}async function kq($){try{return(await Bun.file($).text()).split(/\r?\n/).map(bq).filter((Z)=>Boolean(Z))}catch{return[]}}async function Pq($){let Q=l8($,G9),Z=new Set(await kq(Q));return Z.add("export * from './decorators/api-doc';"),e(Q,`${[...Z].sort().join(`
169
170
  `)}
170
- `)}async function Y3($,Q=!0){let Z=q6($,b6,"http"),X=q6(Z,"decorators"),U=q6(X,"api-doc.ts"),J=X3(),W=await s(U,Q?await f6(J,U):J);if(await F1(X,["./api-doc"]))W=!0;if(await W3(Z))W=!0;return W}async function z3($,Q,Z,X){try{if(await Q($))X.successCount+=1;else X.failedCount+=1}catch(U){X.failedCount+=1,X.errors.push(U instanceof Error?U:Error(String(U)))}finally{Z.done=!0}}async function M9($,Q,Z){let X=Number.isFinite(Z)&&Z>0?Math.floor(Z):1,U={successCount:0,failedCount:0,errors:[]},J=[];for(let W of $){let Y={done:!1,promise:Promise.resolve()};if(Y.promise=z3(W,Q,Y,U),J.push(Y),J.length>=X)await Promise.race(J.map((G)=>G.promise)),J=J.filter((G)=>!G.done)}return await Promise.all(J.map((W)=>W.promise)),{success:U.successCount,failed:U.failedCount,errors:U.errors}}function UX($){let Q=y9(process.cwd(),$);if(Q.length===0)return".";if(Q.startsWith(".."))return $;return Q.startsWith(".")?Q:`./${Q}`}function v6($,Q){let Z=y9($,Q);return Z.length===0||!Z.startsWith("..")&&!V3(Z)}function H3($){let Q=M6($[0]??process.cwd()),Z=$.map((X)=>M6(X));while(!Z.every((X)=>v6(Q,X))){let X=_3(Q);if(X===Q)return Q;Q=X}return Q}function O3($){let Q=process.env[q_]?.trim();if(Q)return M6(Q);let Z=M6(process.cwd()),X=$.flatMap((J)=>[J.inputDir,J.outputDir]),U=X.every((J)=>v6(Z,J))?Z:H3(X);return b9(U,w5)}function t1($){let Q=$.replace(/[^A-Za-z0-9._-]/g,"_").replace(/^_+|_+$/g,"");return Q.length>0?Q:"unnamed"}function r1($){return`${t1($)}.${T_}`}function x6($,Q){return b9($,k5,"bundles",t1(Q.sourceName),t1(Q.targetName))}function JX($,Q){return b9($,k5,"bundles",t1(Q),L_)}function K3($,Q){let Z=y9($,Q).replace(/\\/g,"/").replace(/\.ts$/,"");return Z.startsWith(".")?Z:`./${Z}`}function x9($){return $ instanceof Error&&"code"in $&&$.code==="ENOENT"}function YX($){let Q=new Bun.CryptoHasher("sha256");return Q.update($),`${I3}${Q.digest("hex")}`}function GX($){return YX($)}function j6($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return`[${$.map((X)=>j6(X)).join(",")}]`;return`{${Object.entries($).sort(([X],[U])=>X.localeCompare(U)).map(([X,U])=>`${JSON.stringify(X)}:${j6(U)}`).join(",")}}`}async function zX($){try{let Q=await L3($);return Q.isFile()?{size:Q.size}:null}catch(Q){if(!x9(Q))throw Q;return null}}async function g9($,Q){let Z=T1($),X=await zX(Z);if(!X)throw Error(`Cannot hash missing file '${Z}'`);let U=await Bun.file(Z).bytes();return{path:A3(Q,Z).replace(/\\/g,"/"),hash:YX(U),size:X.size}}function h9($){return GX(j6($))}async function _X($){let Q;try{Q=await B3($,{withFileTypes:!0})}catch(X){if(x9(X))return[];throw X}let Z=[];for(let X of Q){if(X.name.startsWith("."))continue;let U=WX($,X.name);if(X.isDirectory()){Z.push(...await _X(U));continue}if(X.isFile()&&X.name.endsWith(".ts"))Z.push(U)}return Z.sort((X,U)=>X.localeCompare(U))}function M3($){let Q=$.map((J)=>T1(J)),[Z]=Q;if(!Z)return process.cwd();let X=Z.split(/[\\/]+/),U=X.length;for(let J of Q.slice(1)){let W=J.split(/[\\/]+/);U=Math.min(U,W.length);for(let Y=0;Y<U;Y+=1){if(W[Y]===X[Y])continue;U=Y;break}}return X.slice(0,Math.max(U,1)).join("/")||"/"}async function j3($){let Q=[];for(let Z of $)if(await zX(Z))Q.push(T1(Z));return[...new Set(Q)].sort((Z,X)=>Z.localeCompare(X))}function T3($){let Q=[];for(let Z of $.matchAll(MX)){let X=Z[1];if(!X||X.startsWith("#"))continue;Q.push(X.split("#")[0]??X)}return Q}function E3($){return/\$ref\s*:\s*$/m.test($)||/\$ref\s*:\s*[|>]/.test($)}async function VX($,Q,Z){let X=T1($);if(Q.has(X))return[];Q.add(X);let U=await Bun.file(X).text();if(E3(U))Z.unsafe=!0;let J=[X];for(let W of T3(U)){if(/^[a-z][a-z0-9+.-]*:/i.test(W)){Z.unsafe=!0;continue}J.push(...await VX(T1(v9(X),W),Q,Z))}return J}async function HX(){if(X2)return X2;try{let $=await Bun.file(jX).json();X2=typeof $.version==="string"?$.version:eZ}catch{X2=eZ}return X2}async function OX($){return Q$("manifest.sourceHash",async()=>{let Q={unsafe:!1},Z=[],X=new Set;for(let Y of $)Z.push(...await VX(Y,X,Q));let U=await j3(Z),J=v9(T1($[0]??process.cwd())),W=await Promise.all(U.map((Y)=>g9(Y,J)));return{files:W.sort((Y,G)=>Y.path.localeCompare(G.path)),hash:h9(W),safe:!Q.unsafe}})}async function KX($,Q=[]){return Q$("manifest.outputHash",async()=>{let Z=[$,...Q].map((z)=>T1(z)),[X]=Z,U=Z.length===1&&X?X:M3(Z),J=await Promise.all(Z.map((z)=>_X(z))),W=[...new Set(J.flat())].sort((z,_)=>z.localeCompare(_)),G=(await Promise.all(W.map((z)=>g9(z,U)))).sort((z,_)=>z.path.localeCompare(_.path));return{files:G,hash:h9(G)}})}function qX($){return GX(j6({channel:$.channel,generator:$.generator,serviceName:$.serviceName,sourceName:$.sourceName,targetName:$.targetName}))}async function BX(){if(_6)return _6;let $=[];for(let X of TX){let U=new Bun.Glob(X);for await(let J of U.scan({cwd:process.cwd()}))$.push(T1(process.cwd(),J))}let Q=[...new Set($)].sort((X,U)=>X.localeCompare(U)),Z=await Promise.all(Q.map((X)=>g9(X,process.cwd())));return _6=h9(Z.sort((X,U)=>X.path.localeCompare(U.path))),_6}function LX($,Q,Z){let X=Z.split("/").map((U)=>t1(U));return WX($,B_,Q,...X,"manifest.json")}function C3($){if(typeof $!=="object"||$===null)return!1;let Q=$;return Q.version===b5&&typeof Q.sourceDependencyHash==="string"&&typeof Q.outputTreeHash==="string"&&typeof Q.generatorConfigHash==="string"&&typeof Q.generatorImplementationHash==="string"}async function S3($){try{return await Bun.file($).text()}catch(Q){if(x9(Q))return null;throw Q}}async function AX($){if(b("manifest.checks"),!$.source.safe)return b("manifest.unsafeSource"),{skipped:!1,reason:"unsafe-source-dependencies",source:$.source};let Q=await S3($.manifestPath);if(!Q)return{skipped:!1,reason:"missing-manifest",source:$.source};let Z;try{Z=JSON.parse(Q)}catch{return{skipped:!1,reason:"invalid-manifest-json",source:$.source}}if(!C3(Z))return{skipped:!1,reason:"invalid-manifest-shape",source:$.source};let[X,U,J]=await Promise.all([HX(),BX(),KX($.outputDir,$.additionalOutputDirs)]),W=qX($);if(!(Z.packageVersion===X&&Z.bunVersion===Bun.version&&Z.sourceDependencyHash===$.source.hash&&Z.outputTreeHash===J.hash&&Z.generatorConfigHash===W&&Z.generatorImplementationHash===U))return{skipped:!1,reason:"manifest-hash-mismatch",source:$.source};return b("manifest.skips"),{skipped:!0,reason:"manifest-hit",source:$.source}}async function F3($){if(!$.source.safe)return;let[Q,Z,X]=await Promise.all([HX(),BX(),KX($.outputDir,$.additionalOutputDirs)]),U={version:b5,packageVersion:Q,bunVersion:Bun.version,sourceName:$.sourceName,targetName:$.targetName,serviceName:$.serviceName,channel:$.channel,generatorConfigHash:qX($),generatorImplementationHash:Z,sourceDependencyHash:$.source.hash,outputTreeHash:X.hash,sourceFiles:$.source.files,outputFiles:X.files,generatedAt:new Date().toISOString()};await q3(v9($.manifestPath),{recursive:!0}),await Bun.write($.manifestPath,`${JSON.stringify(U,null,2)}
171
- `),b("manifest.writes")}async function w3($){let Q=T6($);for(;;){let Z=CX(Q,"package.json");try{return await D3(Z),Z}catch{}let X=E1(Q);if(X===Q)return null;Q=X}}async function k3($){let Q=[$.outputDir,$.inputDir,$.cwd];for(let Z of Q){let X=await w3(Z);if(X)return{target:await FX(X),workspaceRoot:await h3(E1(X))}}return null}async function FX($){let Q=await N3($,"utf8");return{path:$,shape:y3(JSON.parse(Q),$)}}function IX($){return{dependencies:new Set(Object.keys($.dependencies??{})),devDependencies:new Set(Object.keys($.devDependencies??{})),peerDependencies:new Set(Object.keys($.peerDependencies??{})),dependencyVersions:new Map(Object.entries($.dependencies??{}))}}function E6($){if(!$||typeof $!=="object"||Array.isArray($))return!1;return!0}function P3($){if(!E6($))return!1;return Object.values($).every((Q)=>typeof Q==="string")}function O9($,Q,Z){let X=$[Q];if(X===void 0)return;if(P3(X))return X;throw Error(`${Z}.${Q} must be an object with string version ranges`)}function b3($,Q){let Z=$.workspaces;if(Z===void 0)return;if(Array.isArray(Z)&&Z.every((X)=>typeof X==="string"))return Z;if(E6(Z)&&Z.packages===void 0)return{};if(E6(Z)&&Array.isArray(Z.packages)&&Z.packages.every((X)=>typeof X==="string"))return{packages:Z.packages};throw Error(`${Q}.workspaces must be an array of strings or packages object`)}function y3($,Q){if(!E6($))throw Error(`${Q} must contain a JSON object`);return{name:typeof $.name==="string"?$.name:void 0,dependencies:O9($,"dependencies",Q),devDependencies:O9($,"devDependencies",Q),peerDependencies:O9($,"peerDependencies",Q),workspaces:b3($,Q)}}function o1($,Q){let Z=SX(Q,$);if(!Z||Z.startsWith(".."))return $;return Z.startsWith(".")?Z:`./${Z}`}function f3($,Q){let Z=o1(E1($),Q);return Z==="./"?".":Z}function v3($,Q,Z){let X=[...Z].sort(),U=E1($),J=T6(Q);if(T6(U)===J)return`bun add ${X.join(" ")}`;return`cd ${f3($,Q)} && bun add ${X.join(" ")}`}function RX($){if(Array.isArray($))return $;return $?.packages??[]}function x3($,Q){if($===Q)return!0;if($.endsWith("/*"))return E1(Q)===$.slice(0,-2);return!1}function g3($,Q){if(!$||$.path===Q)return!1;let Z=SX(E1($.path),E1(Q));if(!Z||Z.startsWith(".."))return!1;return RX($.shape.workspaces).some((X)=>x3(X,Z))}async function h3($){let Q=T6($);for(;;){let Z=CX(Q,"package.json");try{let U=await FX(Z);if(RX(U.shape.workspaces).length>0)return U}catch{}let X=E1(Q);if(X===Q)return;Q=X}}function u3($){let Q=new Set;for(let Z of $){if(Z.type===w.TypeScriptNestJs)Q.add("nestjs-zod"),Q.add("zod");if(Z.type===w.AsyncApiNats)Q.add("rxjs"),Q.add("zod");if(Z.type===w.TypeScriptAxios)Q.add("axios");if(Z.type===w.TypeScriptAngular)Q.add("@angular/common"),Q.add("@angular/core"),Q.add("rxjs")}return Q}function d3($){return $.some((Q)=>Q.type===w.TypeScriptNestJs)}function m3($){let Q=$.match(/(\d+)\.(\d+)\.(\d+)/);if(!Q)return!0;let Z=Number(Q[1]),X=Number(Q[2]);if(Z>=4)return!0;if(Z!==3||X!==25)return!1;return Number(Q[3])>=76}function l3($,Q,Z){if(!Z)return[];let X=IX(Z.shape);return $.filter((U)=>!Q.dependencies.has(U)&&(X.dependencies.has(U)||X.devDependencies.has(U)||X.peerDependencies.has(U)))}function p3($,Q,Z,X){if(!Z||!g3(Z,$))return[];let U=[`Checked package: ${o1($,Q.cwd)}`,`Generated output: ${o1(Q.outputDir,Q.cwd)}`,`Workspace root: ${o1(Z.path,Q.cwd)}`];if(X.length>0)U.push(`Root declares ${[...X].sort().join(", ")}, but generated code belongs to this workspace package.`);return U}async function c3($,Q){try{let Z=await k3($);if(Z)return{ok:!0,resolution:Z}}catch(Z){return{ok:!1,warnings:[{title:"Cannot parse package.json for dependency checks.",details:Z instanceof Error?Z.message:String(Z)}]}}return{ok:!1,warnings:[{title:"Cannot verify generated contract runtime dependencies (package.json not found).",details:`Expected runtime deps: ${[...Q].sort().join(", ")}`}]}}function n3($,Q){let Z=[],X=[];for(let U of $){if(Q.dependencies.has(U))continue;if(Q.devDependencies.has(U)||Q.peerDependencies.has(U)){X.push(U);continue}Z.push(U)}return{missing:Z,wrongScope:X}}function i3($,Q,Z,X){if(X.length===0)return;let U=Q.target.path,J=l3(X,Z,Q.workspaceRoot),W=p3(U,$,Q.workspaceRoot,J);return{title:`Missing runtime deps for generated contracts in ${o1(U,$.cwd)}.`,details:[`Missing: ${[...X].sort().join(", ")}`,...W,`Install: ${v3(U,$.cwd,X)}`].join(`
172
- `)}}function r3($,Q,Z){if(Z.length===0)return;return{title:`Generated contract deps should be in dependencies in ${o1(Q,$)}.`,details:`Move to dependencies: ${[...Z].sort().join(", ")}`}}function o3($,Q,Z){let X=Z.dependencyVersions.get("zod");if(!d3($.generators)||!Z.dependencies.has("zod")||typeof X!=="string"||m3(X))return;return{title:`Generated OpenAPI Zod schemas require a zod/v4-compatible zod version in ${o1(Q,$.cwd)}.`,details:`Detected zod: ${X}
173
- Use zod >=3.25.76 or >=4.0.0, or disable generator.zod for this target.`}}function a3($,Q,Z){let X=Q.target.path,U=IX(Q.target.shape),{missing:J,wrongScope:W}=n3(Z,U);return[i3($,Q,U,J),r3($.cwd,X,W),o3($,X,U)].filter((Y)=>Y!==void 0)}async function s3($){let Q=u3($.generators);if(Q.size===0)return[];let Z=await c3($,Q);if(!Z.ok)return Z.warnings;return a3($,Z.resolution,Q)}function e3($,Q){let Z=Q.split(`
174
- `).map((J)=>J.trim()).filter((J)=>J.length>0),[X="Unexpected error",...U]=Z;return{title:`\u274C ${$}: ${X}`,details:U.length>0?U.join(`
175
- `):void 0}}function $V($,Q){return{printStep:(W)=>{if($)return;if(Q){Q.log.step(W,G$("step"));return}B0.step(W)},printInfo:(W)=>{if($)return;if(Q){Q.log.info(W,G$("info"));return}B0.info(W)},printWarning:(W,Y)=>{if($)return;if(Q){if(Q.log.warn(W,G$("warn")),Y)Q.note(Y,"Details",P$("dim"));return}if(B0.warn(W),Y)B0.warn(Y)},printFailure:(W)=>{if(!$&&Q){if(Q.log.error(W.title,{...G$("error"),symbol:"\u274C"}),W.details)Q.note(W.details,"Details",P$("dim"));return}if(B0.error(W.title),W.details)B0.error(W.details)}}}function WV($){return $.includes("Failed to link")&&$.includes("EEXIST")}function YV($){return new Promise((Q)=>{setTimeout(Q,$)})}async function GV($){let Q=j9,Z=()=>{};j9=new Promise((X)=>{Z=X}),await Q;try{return await $()}finally{Z()}}async function zV($,Q){let Z=performance.now(),X=Bun.spawn($,{stdout:"pipe",stderr:"pipe",env:{...process.env}}),U=await X.exited,J=X.resourceUsage(),W=await new Response(X.stdout).text(),Y=await new Response(X.stderr).text();return k9({name:Q,command:$,durationMs:performance.now()-Z,exitCode:U,resourceUsage:J}),b("bundle.subprocesses"),{exitCode:U,stdout:W,stderr:Y}}async function _V($,Q){let Z=$.indexOf("--output");if(Z===-1||Z+1>=$.length)return{success:!1,error:Error("Bundle args must include '--output <path>'")};let X=$[Z+1];if(!X)return{success:!1,error:Error("Bundle output path is missing")};return DX(X,Q)}async function DX($,Q){if(!(await Bun.file($).text()).includes(Q))return{success:!1,error:Error(`Bundle output missing '${Q}' marker`)};return{success:!0,outputPath:$}}function VV(){return J5??=UV(),J5}function HV(){return process.env[C_]!=="1"}function OV($){if($ instanceof Error)return $;return Error(String($))}function KV($){return $.map((Q)=>`${Q.severity}: ${Q.message}`).join(`
176
- `).trim()}async function qV($,Q){try{let Z=await XV({ref:$,config:await VV()}),X=Z.problems.filter((J)=>J.severity==="error");if(X.length>0)return{success:!1,error:Error(`OpenAPI bundle failed:
177
- ${KV(X)}`)};let U=Z.bundle.parsed;if(U===void 0)return{success:!1,error:Error("OpenAPI bundle produced an empty document")};if(await Bun.write(Q,JV(U)),b("bundle.inProcess"),Z.problems.length>X.length)b("bundle.warnings",Z.problems.length-X.length);return DX(Q,N9)}catch(Z){return{success:!1,error:OV(Z)}}}function BV($,Q,Z){let X=[Q,Z].filter((U)=>U.trim().length>0).join(`
178
- `).trim();return{success:!1,error:Error(`Bundle failed (exit ${$}): ${X}`)}}async function NX($,Q,Z){let X=$[0]==="bunx";for(let U=0;U<=U5;U+=1){let J=()=>zV($,Z),{exitCode:W,stdout:Y,stderr:G}=X?await GV(J):await J();if(W===0)return _V($,Q);if(!(X&&WV(G))||U>=U5)return BV(W,Y,G);await YV(AV*(U+1))}return{success:!1,error:Error("Bundle failed unexpectedly")}}async function LV($,Q){let Z=Bun.which("redocly");if(Z)return[Z,"bundle",$,"--output",Q];let X=ZV(process.cwd(),"node_modules",".bin","redocly");if(await Bun.file(X).exists())return[X,"bundle",$,"--output",Q];return["bunx",E_,"bundle",$,"--output",Q]}async function u9($,Q){if($.length!==1)return{success:!1,error:Error("OpenAPI bundling expects a single root spec file")};let Z=$[0];if(!Z)return{success:!1,error:Error("OpenAPI root spec file is missing")};if(HV())return qV(Z,Q);return NX(await LV(Z,Q),N9,"bundle.openapi")}async function X5($,Q){return NX(["bunx","@asyncapi/cli","bundle",...$,"--xOrigin","--output",Q],m5,"bundle.asyncapi")}function M0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function wX($,Q){let Z=EV($,Q).split(CV).join("/");return Z.startsWith(".")?Z:`./${Z}`}function kX($){return $.replace(/~/g,"~0").replace(/\//g,"~1")}function IV($){return{$ref:`${wX($.aggregateDir,$.file)}#/paths/${kX($.pathName)}`}}function RV($){return{$ref:`${wX($.aggregateDir,$.file)}#/components/${$.componentGroup}/${kX($.componentName)}`}}async function DV($){let Q=SV(await Bun.file($).text());if(!M0(Q))throw Error(`OpenAPI source '${$}' must parse to an object`);return Q}function NV($,Q){if(M0(Q?.info))return Q.info;return{title:`${$} Contracts`,version:"1.0.0"}}function wV($,Q,Z,X){if(!M0(X))return;for(let U of Object.keys(X).sort()){if(Q[U])throw Error(`Duplicate OpenAPI path '${U}' while grouping '${Z}'`);Q[U]=IV({aggregateDir:$,file:Z,pathName:U})}}function kV($,Q,Z,X,U){let J=U[X];if(!M0(J))return;let W=M0(Q[X])?Q[X]:{};for(let Y of Object.keys(J).sort()){if(W[Y])throw Error(`Duplicate OpenAPI component '${X}.${Y}'`);W[Y]=RV({aggregateDir:$,componentGroup:X,componentName:Y,file:Z})}Q[X]=W}function PV($,Q,Z,X){if(!M0(X))return;for(let U of v5)kV($,Q,Z,U,X)}async function Y5($){await jV(W5($.outputPath),{recursive:!0});let Q=W5($.outputPath),Z=await Promise.all($.files.map((W)=>DV(W))),X={},U={};$.files.forEach((W,Y)=>{let G=Z[Y];if(!G)return;wV(Q,X,W,G.paths),PV(Q,U,W,G.components)});let J={openapi:typeof Z[0]?.openapi==="string"?Z[0].openapi:"3.0.3",info:NV($.name,Z[0]),paths:X,components:U};return await TV($.outputPath,FV(J),"utf8"),$.outputPath}async function vV($,Q){let Z=new Set;for(let X of Q){let U=new Bun.Glob(X);for await(let J of U.scan({cwd:$}))Z.add(fV($,J))}return[...Z].sort()}function C6($){return $.replace(/\.openapi\.ya?ml$/,"").replace(/\.asyncapi\.ya?ml$/,"").replace(/\.schema\.ya?ml$/,"").replace(/^schema\.ya?ml$/,"schema")}function T9($){return/\.schema\.ya?ml$/.test($)||/^schema\.ya?ml$/.test($)}async function xV($){let Q=g6($);if(/\.openapi\.ya?ml$/.test(Q))return c1.OpenApi;if(/\.asyncapi\.ya?ml$/.test(Q))return c1.AsyncApi;if(!T9(Q))return null;let Z=await Bun.file($).text();if(Z.includes(N9))return c1.OpenApi;if(Z.includes(m5))return c1.AsyncApi;return null}async function PX($){let Q=[];for(let Z of await vV($,f5)){let X=await xV(Z);if(!X)continue;Q.push({file:Z,kind:X})}return Q.sort((Z,X)=>Z.file.localeCompare(X.file))}function gV($,Q){let X=d9($,Q).split("/"),U=g6(Q);if(!/\.openapi\.ya?ml$/.test(U))return null;if(X.length===1)return{name:C6(U),rootFile:Q,files:[Q]};let J=X.map(C6),W=J.at(-1),Y=J.at(-2);if(!W)return null;let z=(W===Y?J.slice(0,-1):J).filter(Boolean).join("/");return z.length>0?{name:z,rootFile:Q,files:[Q]}:null}function hV($,Q){let X=d9($,Q).split("/"),U=X[0];if(!U)return null;let J=g6(Q),W=X.length===1?C6(J):U;return W.length>0?{name:W,rootFile:Q,files:[Q]}:null}function uV($,Q){let Z=new Map;for(let X of Q){if(X.kind!==c1.OpenApi)continue;let U=g6(X.file),J=T9(U)?hV($,X.file):gV($,X.file);if(!J)continue;let W=Z.get(J.name);if(W){if(!T9(U))throw Error(`Multiple OpenAPI roots found for service '${J.name}': ${W.rootFile} and ${J.rootFile}`);Z.set(J.name,{...W,files:[...W.files,J.rootFile].sort()});continue}Z.set(J.name,J)}return[...Z.values()].sort((X,U)=>X.name.localeCompare(U.name))}function dV($,Q){let Z=new Map;for(let X of Q){if(X.kind!==c1.AsyncApi)continue;let J=d9($,X.file).split("/"),W=J[0];if(!W)continue;let Y=J.length===1?C6(W):W,G=Z.get(Y)??[];Z.set(Y,[...G,X.file])}return[...Z.entries()].map(([X,U])=>({name:X,files:U.sort()})).sort((X,U)=>X.name.localeCompare(U.name))}async function bX($){return uV($,await PX($))}async function yX($){return dV($,await PX($))}function q$($){let Q=J1($);return Q.endsWith("Message")?Q:`${Q}Message`}function u6($){let Q=J1($);return`${Q.endsWith("Message")?Q.slice(0,-7):Q}MessageInput`}function E0($){return lV($)}function $0($){let Q=J1($);return Q.endsWith("Dto")?Q:`${Q}Dto`}function xX($){let Q=J1($);return Q.endsWith("Schema")?Q:`${Q}Schema`}function m9($){return`${h6($)}.dto.ts`}function C1($){return J1($)}function d6($){return`${h6($)}.ts`}function l9($){return`${h6($)}.contract.ts`}function m6($){return`${h6($)}.enum.ts`}function C0($){return`${J1($)}Values`}function l6($){return`${J1($)}Map`}function p9($){return J1(String($))}function pV($){return J1($)}function K2($){return mV($)}function G5($){return typeof $==="string"?`'${$.replace(/'/g,"\\'")}'`:String($)}function gX($,Q){let Z=C0($.name),X=l6($.name),U=$.name,J=$.values.map((G)=>G5(G)).join(", "),W=$.members.map((G)=>` ${G.key}: ${G5(G.value)},`).join(`
179
- `),Y=$.values.map((G)=>String(G)).join(" | ");return["/**",` * ${Q} enum: ${$.name}`,` * Schema path: ${$.schemaPath}`,` * Values: ${Y}`," */",`export const ${Z} = [${J}] as const;`,"",`export type ${U} = (typeof ${Z})[number];`,"",`export const ${X} = {`,W,"} as const;"].join(`
180
- `)}function $H($){return $.trim().replace(/\.+$/,"")}function QH($){return $.trim().replace(/^\.+/,"")}function ZH($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function XH($){let Q=$?.trim();if(!Q)throw Error("AsyncAPI channel address is required");return Q}function W1($,Q){if(!$)return"";if(!Q||Q.trim().length===0)return $;let Z=$H(Q),X=QH($);if(!Z)return X;if(!X)return Z;if(X===Z)return X;if(X.startsWith(`${Z}.`))return X;return`${Z}.${X}`}function c9($,Q,Z,X){let U=W1(XH($),X),J=U.match(/\{(.*?)\}/g);if(!J)return U;return J.reduce((W,Y)=>{let G=Y.slice(1,-1),z=ZH(Z?.properties)?Z.properties:{};if(!Object.hasOwn(z,G))throw Error(`Param '${G}' not found in message schema for address '${U}'`);return W.replace(Y,`\${${Q}.${G}}`)},U)}function UH($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function n9($,Q){if(UH($))return $;throw Error(`${Q} metadata must be a JSON object`)}function dX($,Q){if($===void 0||$===null)return;return n9($,Q)}function z5($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function r$($){return $.split(`
181
- `).map((Q)=>Q.trim()).filter((Q)=>Q.length>0)}function JH($){return $.replaceAll("*/","*\\/")}function T$($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${JH(X)}`).join(`
171
+ `)}async function fq($,Q=!0){let Z=l8($,_9,"http"),X=l8(Z,"decorators"),Y=l8(X,"api-doc.ts"),W=wq(),U=await e(Y,Q?await V9(W,Y):W);if(await p1(X,["./api-doc"]))U=!0;if(await Pq(Z))U=!0;return U}async function xq($,Q,Z,X){try{if(await Q($))X.successCount+=1;else X.failedCount+=1}catch(Y){X.failedCount+=1,X.errors.push(Y instanceof Error?Y:Error(String(Y)))}finally{Z.done=!0}}async function _Q($,Q,Z){let X=Number.isFinite(Z)&&Z>0?Math.floor(Z):1,Y={successCount:0,failedCount:0,errors:[]},W=[];for(let U of $){let J={done:!1,promise:Promise.resolve()};if(J.promise=xq(U,Q,J,Y),W.push(J),W.length>=X)await Promise.race(W.map((G)=>G.promise)),W=W.filter((G)=>!G.done)}return await Promise.all(W.map((U)=>U.promise)),{success:Y.successCount,failed:Y.failedCount,errors:Y.errors}}function TY($){let Q=IQ(process.cwd(),$);if(Q.length===0)return".";if(Q.startsWith(".."))return $;return Q.startsWith(".")?Q:`./${Q}`}function q9($,Q){let Z=IQ($,Q);return Z.length===0||!Z.startsWith("..")&&!gq(Z)}function hq($){let Q=r8($[0]??process.cwd()),Z=$.map((X)=>r8(X));while(!Z.every((X)=>q9(Q,X))){let X=vq(Q);if(X===Q)return Q;Q=X}return Q}function uq($){let Q=process.env[v4]?.trim();if(Q)return r8(Q);let Z=r8(process.cwd()),X=$.flatMap((W)=>[W.inputDir,W.outputDir]),Y=X.every((W)=>q9(Z,W))?Z:hq(X);return SQ(Y,dX)}function V0($){let Q=$.replace(/[^A-Za-z0-9._-]/g,"_").replace(/^_+|_+$/g,"");return Q.length>0?Q:"unnamed"}function h1($){return`${V0($)}.${r4}`}function K9($,Q){return SQ($,mX,"bundles",V0(Q.sourceName),V0(Q.targetName))}function EY($,Q){return SQ($,mX,"bundles",V0(Q),h4)}function dq($,Q){let Z=IQ($,Q).replace(/\\/g,"/").replace(/\.ts$/,"");return Z.startsWith(".")?Z:`./${Z}`}function DQ($){return $ instanceof Error&&"code"in $&&$.code==="ENOENT"}function FY($){let Q=new Bun.CryptoHasher("sha256");return Q.update($),`${QK}${Q.digest("hex")}`}function MY($){return FY($)}function i8($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return`[${$.map((X)=>i8(X)).join(",")}]`;return`{${Object.entries($).sort(([X],[Y])=>X.localeCompare(Y)).map(([X,Y])=>`${JSON.stringify(X)}:${i8(Y)}`).join(",")}}`}async function SY($){try{let Q=await pq($);return Q.isFile()?{size:Q.size}:null}catch(Q){if(!DQ(Q))throw Q;return null}}async function NQ($,Q){let Z=d1($),X=await SY(Z);if(!X)throw Error(`Cannot hash missing file '${Z}'`);let Y=await Bun.file(Z).bytes();return{path:cq(Q,Z).replace(/\\/g,"/"),hash:FY(Y),size:X.size}}function wQ($){return MY(i8($))}async function IY($){let Q;try{Q=await lq($,{withFileTypes:!0})}catch(X){if(DQ(X))return[];throw X}let Z=[];for(let X of Q){if(X.name.startsWith("."))continue;let Y=CY($,X.name);if(X.isDirectory()){Z.push(...await IY(Y));continue}if(X.isFile()&&X.name.endsWith(".ts"))Z.push(Y)}return Z.sort((X,Y)=>X.localeCompare(Y))}function rq($){let Q=$.map((W)=>d1(W)),[Z]=Q;if(!Z)return process.cwd();let X=Z.split(/[\\/]+/),Y=X.length;for(let W of Q.slice(1)){let U=W.split(/[\\/]+/);Y=Math.min(Y,U.length);for(let J=0;J<Y;J+=1){if(U[J]===X[J])continue;Y=J;break}}return X.slice(0,Math.max(Y,1)).join("/")||"/"}async function iq($){let Q=[];for(let Z of $)if(await SY(Z))Q.push(d1(Z));return[...new Set(Q)].sort((Z,X)=>Z.localeCompare(X))}function o8($,Q){if(Q.startsWith("#"))return;let Z=Q.split("#")[0]??Q;if(Z.length>0)$.push(Z)}function RY($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function oq($,Q){if(!Array.isArray($))return;for(let Z of $){if(typeof Z==="string"){o8(Q,Z);continue}if(RY(Z)&&typeof Z.$ref==="string")o8(Q,Z.$ref)}}function HQ($,Q){if(Array.isArray($)){for(let X of $)HQ(X,Q);return}if(!RY($))return;let Z=$.$ref;if(typeof Z==="string")o8(Q,Z);oq($.$sets,Q);for(let X of Object.values($))HQ(X,Q)}function aq($){let Q=[];for(let Z of $.matchAll(xY)){let X=Z[1];if(X)o8(Q,X)}try{HQ(nq($),Q)}catch{return[...new Set(Q)]}return[...new Set(Q)]}function sq($){return/\$ref\s*:\s*$/m.test($)||/\$ref\s*:\s*[|>]/.test($)}async function DY($,Q,Z){let X=d1($);if(Q.has(X))return[];Q.add(X);let Y=await Bun.file(X).text();if(sq(Y))Z.unsafe=!0;let W=[X];for(let U of aq(Y)){if(/^[a-z][a-z0-9+.-]*:/i.test(U)){Z.unsafe=!0;continue}W.push(...await DY(d1(RQ(X),U),Q,Z))}return W}async function NY(){if(R2)return R2;try{let $=await Bun.file(vY).json();R2=typeof $.version==="string"?$.version:JX}catch{R2=JX}return R2}async function wY($){return Z$("manifest.sourceHash",async()=>{let Q={unsafe:!1},Z=[],X=new Set;for(let J of $)Z.push(...await DY(J,X,Q));let Y=await iq(Z),W=RQ(d1($[0]??process.cwd())),U=await Promise.all(Y.map((J)=>NQ(J,W)));return{files:U.sort((J,G)=>J.path.localeCompare(G.path)),hash:wQ(U),safe:!Q.unsafe}})}async function bY($,Q=[]){return Z$("manifest.outputHash",async()=>{let Z=[$,...Q].map((_)=>d1(_)),[X]=Z,Y=Z.length===1&&X?X:rq(Z),W=await Promise.all(Z.map((_)=>IY(_))),U=[...new Set(W.flat())].sort((_,H)=>_.localeCompare(H)),G=(await Promise.all(U.map((_)=>NQ(_,Y)))).sort((_,H)=>_.path.localeCompare(H.path));return{files:G,hash:wQ(G)}})}function kY($){return MY(i8({channel:$.channel,generator:$.generator,serviceName:$.serviceName,sourceName:$.sourceName,targetName:$.targetName}))}async function PY(){if(g8)return g8;let $=[];for(let X of gY){let Y=new Bun.Glob(X);for await(let W of Y.scan({cwd:process.cwd()}))$.push(d1(process.cwd(),W))}let Q=[...new Set($)].sort((X,Y)=>X.localeCompare(Y)),Z=await Promise.all(Q.map((X)=>NQ(X,process.cwd())));return g8=wQ(Z.sort((X,Y)=>X.path.localeCompare(Y.path))),g8}function fY($,Q,Z){let X=Z.split("/").map((Y)=>V0(Y));return CY($,g4,Q,...X,"manifest.json")}function tq($){if(typeof $!=="object"||$===null)return!1;let Q=$;return Q.version===pX&&typeof Q.sourceDependencyHash==="string"&&typeof Q.outputTreeHash==="string"&&typeof Q.generatorConfigHash==="string"&&typeof Q.generatorImplementationHash==="string"}async function eq($){try{return await Bun.file($).text()}catch(Q){if(DQ(Q))return null;throw Q}}async function yY($){if(f("manifest.checks"),!$.source.safe)return f("manifest.unsafeSource"),{skipped:!1,reason:"unsafe-source-dependencies",source:$.source};let Q=await eq($.manifestPath);if(!Q)return{skipped:!1,reason:"missing-manifest",source:$.source};let Z;try{Z=JSON.parse(Q)}catch{return{skipped:!1,reason:"invalid-manifest-json",source:$.source}}if(!tq(Z))return{skipped:!1,reason:"invalid-manifest-shape",source:$.source};let[X,Y,W]=await Promise.all([NY(),PY(),bY($.outputDir,$.additionalOutputDirs)]),U=kY($);if(!(Z.packageVersion===X&&Z.bunVersion===Bun.version&&Z.sourceDependencyHash===$.source.hash&&Z.outputTreeHash===W.hash&&Z.generatorConfigHash===U&&Z.generatorImplementationHash===Y))return{skipped:!1,reason:"manifest-hash-mismatch",source:$.source};return f("manifest.skips"),{skipped:!0,reason:"manifest-hit",source:$.source}}async function $K($){if(!$.source.safe)return;let[Q,Z,X]=await Promise.all([NY(),PY(),bY($.outputDir,$.additionalOutputDirs)]),Y={version:pX,packageVersion:Q,bunVersion:Bun.version,sourceName:$.sourceName,targetName:$.targetName,serviceName:$.serviceName,channel:$.channel,generatorConfigHash:kY($),generatorImplementationHash:Z,sourceDependencyHash:$.source.hash,outputTreeHash:X.hash,sourceFiles:$.source.files,outputFiles:X.files,generatedAt:new Date().toISOString()};await mq(RQ($.manifestPath),{recursive:!0}),await Bun.write($.manifestPath,`${JSON.stringify(Y,null,2)}
172
+ `),f("manifest.writes")}async function WK($){let Q=a8($);for(;;){let Z=uY(Q,"package.json");try{return await XK(Z),Z}catch{}let X=m1(Q);if(X===Q)return null;Q=X}}async function UK($){let Q=[$.outputDir,$.inputDir,$.cwd];for(let Z of Q){let X=await WK(Z);if(X)return{target:await mY(X),workspaceRoot:await BK(m1(X))}}return null}async function mY($){let Q=await YK($,"utf8");return{path:$,shape:_K(JSON.parse(Q),$)}}function lY($){return{dependencies:new Set(Object.keys($.dependencies??{})),devDependencies:new Set(Object.keys($.devDependencies??{})),peerDependencies:new Set(Object.keys($.peerDependencies??{})),dependencyVersions:new Map(Object.entries($.dependencies??{}))}}function s8($){if(!$||typeof $!=="object"||Array.isArray($))return!1;return!0}function JK($){if(!s8($))return!1;return Object.values($).every((Q)=>typeof Q==="string")}function e6($,Q,Z){let X=$[Q];if(X===void 0)return;if(JK(X))return X;throw Error(`${Z}.${Q} must be an object with string version ranges`)}function GK($,Q){let Z=$.workspaces;if(Z===void 0)return;if(Array.isArray(Z)&&Z.every((X)=>typeof X==="string"))return Z;if(s8(Z)&&Z.packages===void 0)return{};if(s8(Z)&&Array.isArray(Z.packages)&&Z.packages.every((X)=>typeof X==="string"))return{packages:Z.packages};throw Error(`${Q}.workspaces must be an array of strings or packages object`)}function _K($,Q){if(!s8($))throw Error(`${Q} must contain a JSON object`);return{name:typeof $.name==="string"?$.name:void 0,dependencies:e6($,"dependencies",Q),devDependencies:e6($,"devDependencies",Q),peerDependencies:e6($,"peerDependencies",Q),workspaces:GK($,Q)}}function _0($,Q){let Z=dY(Q,$);if(!Z||Z.startsWith(".."))return $;return Z.startsWith(".")?Z:`./${Z}`}function HK($,Q){let Z=_0(m1($),Q);return Z==="./"?".":Z}function VK($,Q,Z){let X=[...Z].sort(),Y=m1($),W=a8(Q);if(a8(Y)===W)return`bun add ${X.join(" ")}`;return`cd ${HK($,Q)} && bun add ${X.join(" ")}`}function pY($){if(Array.isArray($))return $;return $?.packages??[]}function qK($,Q){if($===Q)return!0;if($.endsWith("/*"))return m1(Q)===$.slice(0,-2);return!1}function KK($,Q){if(!$||$.path===Q)return!1;let Z=dY(m1($.path),m1(Q));if(!Z||Z.startsWith(".."))return!1;return pY($.shape.workspaces).some((X)=>qK(X,Z))}async function BK($){let Q=a8($);for(;;){let Z=uY(Q,"package.json");try{let Y=await mY(Z);if(pY(Y.shape.workspaces).length>0)return Y}catch{}let X=m1(Q);if(X===Q)return;Q=X}}function AK($){let Q=new Set;for(let Z of $){if(Z.type===w.TypeScriptNestJs)Q.add("nestjs-zod"),Q.add("zod");if(Z.type===w.AsyncApiNats)Q.add("rxjs"),Q.add("zod");if(Z.type===w.TypeScriptAxios)Q.add("axios");if(Z.type===w.TypeScriptAngular)Q.add("@angular/common"),Q.add("@angular/core"),Q.add("rxjs")}return Q}function LK($){return $.some((Q)=>Q.type===w.TypeScriptNestJs)}function OK($){let Q=$.match(/(\d+)\.(\d+)\.(\d+)/);if(!Q)return!0;let Z=Number(Q[1]),X=Number(Q[2]);if(Z>=4)return!0;if(Z!==3||X!==25)return!1;return Number(Q[3])>=76}function zK($,Q,Z){if(!Z)return[];let X=lY(Z.shape);return $.filter((Y)=>!Q.dependencies.has(Y)&&(X.dependencies.has(Y)||X.devDependencies.has(Y)||X.peerDependencies.has(Y)))}function jK($,Q,Z,X){if(!Z||!KK(Z,$))return[];let Y=[`Checked package: ${_0($,Q.cwd)}`,`Generated output: ${_0(Q.outputDir,Q.cwd)}`,`Workspace root: ${_0(Z.path,Q.cwd)}`];if(X.length>0)Y.push(`Root declares ${[...X].sort().join(", ")}, but generated code belongs to this workspace package.`);return Y}async function TK($,Q){try{let Z=await UK($);if(Z)return{ok:!0,resolution:Z}}catch(Z){return{ok:!1,warnings:[{title:"Cannot parse package.json for dependency checks.",details:Z instanceof Error?Z.message:String(Z)}]}}return{ok:!1,warnings:[{title:"Cannot verify generated contract runtime dependencies (package.json not found).",details:`Expected runtime deps: ${[...Q].sort().join(", ")}`}]}}function EK($,Q){let Z=[],X=[];for(let Y of $){if(Q.dependencies.has(Y))continue;if(Q.devDependencies.has(Y)||Q.peerDependencies.has(Y)){X.push(Y);continue}Z.push(Y)}return{missing:Z,wrongScope:X}}function CK($,Q,Z,X){if(X.length===0)return;let Y=Q.target.path,W=zK(X,Z,Q.workspaceRoot),U=jK(Y,$,Q.workspaceRoot,W);return{title:`Missing runtime deps for generated contracts in ${_0(Y,$.cwd)}.`,details:[`Missing: ${[...X].sort().join(", ")}`,...U,`Install: ${VK(Y,$.cwd,X)}`].join(`
173
+ `)}}function FK($,Q,Z){if(Z.length===0)return;return{title:`Generated contract deps should be in dependencies in ${_0(Q,$)}.`,details:`Move to dependencies: ${[...Z].sort().join(", ")}`}}function MK($,Q,Z){let X=Z.dependencyVersions.get("zod");if(!LK($.generators)||!Z.dependencies.has("zod")||typeof X!=="string"||OK(X))return;return{title:`Generated API Zod schemas require a zod/v4-compatible zod version in ${_0(Q,$.cwd)}.`,details:`Detected zod: ${X}
174
+ Use zod >=3.25.76 or >=4.0.0, or disable generator.zod for this target.`}}function SK($,Q,Z){let X=Q.target.path,Y=lY(Q.target.shape),{missing:W,wrongScope:U}=EK(Z,Y);return[CK($,Q,Y,W),FK($.cwd,X,U),MK($,X,Y)].filter((J)=>J!==void 0)}async function IK($){let Q=AK($.generators);if(Q.size===0)return[];let Z=await TK($,Q);if(!Z.ok)return Z.warnings;return SK($,Z.resolution,Q)}function DK($,Q){let Z=Q.split(`
175
+ `).map((W)=>W.trim()).filter((W)=>W.length>0),[X="Unexpected error",...Y]=Z;return{title:`\u274C ${$}: ${X}`,details:Y.length>0?Y.join(`
176
+ `):void 0}}function NK($,Q){return{printStep:(U)=>{if($)return;if(Q){Q.log.step(U,G$("step"));return}y0.step(U)},printInfo:(U)=>{if($)return;if(Q){Q.log.info(U,G$("info"));return}y0.info(U)},printWarning:(U,J)=>{if($)return;if(Q){if(Q.log.warn(U,G$("warn")),J)Q.note(J,"Details",b$("dim"));return}if(y0.warn(U),J)y0.warn(J)},printFailure:(U)=>{if(!$&&Q){if(Q.log.error(U.title,{...G$("error"),symbol:"\u274C"}),U.details)Q.note(U.details,"Details",b$("dim"));return}if(y0.error(U.title),U.details)y0.error(U.details)}}}async function cY($,Q){let Z=new Set;for(let X of Q){let Y=new Bun.Glob(X);for await(let W of Y.scan({cwd:$}))Z.add(bK($,W))}return[...Z].sort()}function nY($){return $.replace(/\.api\.ya?ml$/,"").replace(/\.async\.ya?ml$/,"")}function rY($){return/\.api\.ya?ml$/.test($)}function kK($){return/\.async\.ya?ml$/.test($)}function PK($){if(/\.openapi\.ya?ml$/.test($))return`Rename '${$}' to '${$.replace(/\.openapi(\.ya?ml)$/,".api$1")}'.`;if(/\.asyncapi\.ya?ml$/.test($))return`Rename '${$}' to '${$.replace(/\.asyncapi(\.ya?ml)$/,".async$1")}'.`;return`Rename '${$}' to a '*.api.yml' or '*.async.yml' source file.`}async function fK($){let Q=await cY($,oX),[Z]=Q;if(!Z)return;let X=bQ(Z),Y=L9($,Z);throw Error(`Legacy Kontract source '${Y}' is no longer supported. ${PK(X)}`)}function yK($){let Q=bQ($);if(rY(Q))return T$.OpenApi;if(kK(Q))return T$.AsyncApi;return null}async function iY($){await fK($);let Q=[];for(let Z of await cY($,iX)){let X=yK(Z);if(!X)continue;Q.push({file:Z,kind:X})}return Q.sort((Z,X)=>Z.file.localeCompare(X.file))}function xK($,Q){let X=L9($,Q).split("/"),Y=bQ(Q);if(!rY(Y))return null;if(X.length===1)return{name:nY(Y),rootFile:Q,files:[Q]};let[W]=X,U=W??"";return U.length>0?{name:U,rootFile:Q,files:[Q]}:null}function HX($,Q){return L9($,Q).split("/").length>1}function vK($,Q){let Z=new Map;for(let X of Q){if(X.kind!==T$.OpenApi)continue;let Y=xK($,X.file);if(!Y)continue;let W=Z.get(Y.name);if(W){if(HX($,W.rootFile)&&HX($,Y.rootFile)){Z.set(Y.name,{...W,files:[...W.files,Y.rootFile].sort()});continue}throw Error(`Multiple API schema roots found for service '${Y.name}': ${W.rootFile} and ${Y.rootFile}`)}Z.set(Y.name,Y)}return[...Z.values()].sort((X,Y)=>X.name.localeCompare(Y.name))}function gK($,Q){let Z=new Map;for(let X of Q){if(X.kind!==T$.AsyncApi)continue;let W=L9($,X.file).split("/"),U=W[0];if(!U)continue;let J=W.length===1?nY(U):U,G=Z.get(J)??[];Z.set(J,[...G,X.file])}return[...Z.entries()].map(([X,Y])=>({name:X,files:Y.sort()})).sort((X,Y)=>X.name.localeCompare(Y.name))}async function oY($){return vK($,await iY($))}async function aY($){return gK($,await iY($))}function lK($){return $.includes("Failed to link")&&$.includes("EEXIST")}function pK($){return new Promise((Q)=>{setTimeout(Q,$)})}async function cK($){let Q=VQ,Z=()=>{};VQ=new Promise((X)=>{Z=X}),await Q;try{return await $()}finally{Z()}}async function nK($,Q){let Z=performance.now(),X=Bun.spawn($,{stdout:"pipe",stderr:"pipe",env:{...process.env}}),Y=await X.exited,W=X.resourceUsage(),U=await new Response(X.stdout).text(),J=await new Response(X.stderr).text();return FQ({name:Q,command:$,durationMs:performance.now()-Z,exitCode:Y,resourceUsage:W}),f("bundle.subprocesses"),{exitCode:Y,stdout:U,stderr:J}}async function rK($,Q){let Z=$.indexOf("--output");if(Z===-1||Z+1>=$.length)return{success:!1,error:Error("Bundle args must include '--output <path>'")};let X=$[Z+1];if(!X)return{success:!1,error:Error("Bundle output path is missing")};return eY(X,Q)}async function eY($,Q){if(!(await Bun.file($).text()).includes(Q))return{success:!1,error:Error(`Bundle output missing '${Q}' marker`)};return{success:!0,outputPath:$}}function iK(){return KX??=dK(),KX}function oK(){return process.env[o4]!=="1"}function aK($){if($ instanceof Error)return $;return Error(String($))}function sK($){return $.map((Q)=>`${Q.severity}: ${Q.message}`).join(`
177
+ `).trim()}async function tK($,Q){try{let Z=await uK({ref:$,config:await iK()}),X=Z.problems.filter((W)=>W.severity==="error");if(X.length>0)return{success:!1,error:Error(`API schema bundle failed:
178
+ ${sK(X)}`)};let Y=Z.bundle.parsed;if(Y===void 0)return{success:!1,error:Error("API schema bundle produced an empty document")};if(await Bun.write(Q,mK(Y)),f("bundle.inProcess"),Z.problems.length>X.length)f("bundle.warnings",Z.problems.length-X.length);return eY(Q,YY)}catch(Z){return{success:!1,error:aK(Z)}}}function eK($,Q,Z){let X=[Q,Z].filter((Y)=>Y.trim().length>0).join(`
179
+ `).trim();return{success:!1,error:Error(`Bundle failed (exit ${$}): ${X}`)}}async function $W($,Q,Z){let X=$[0]==="bunx";for(let Y=0;Y<=qX;Y+=1){let W=()=>nK($,Z),{exitCode:U,stdout:J,stderr:G}=X?await cK(W):await W();if(U===0)return rK($,Q);if(!(X&&lK(G))||Y>=qX)return eK(U,J,G);await pK(QB*(Y+1))}return{success:!1,error:Error("Bundle failed unexpectedly")}}async function $B($,Q){let Z=Bun.which("redocly");if(Z)return[Z,"bundle",$,"--output",Q];let X=hK(process.cwd(),"node_modules",".bin","redocly");if(await Bun.file(X).exists())return[X,"bundle",$,"--output",Q];return["bunx",i4,"bundle",$,"--output",Q]}async function kQ($,Q){if($.length!==1)return{success:!1,error:Error("API schema bundling expects a single root spec file")};let Z=$[0];if(!Z)return{success:!1,error:Error("API schema root spec file is missing")};if(oK())return tK(Z,Q);return $W(await $B(Z,Q),YY,"bundle.openapi")}async function VX($,Q){return $W(["bunx","@asyncapi/cli","bundle",...$,"--xOrigin","--output",Q],t4,"bundle.asyncapi")}function m0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function GB($){return $.replace(/~/g,"~0").replace(/\//g,"~1")}function _B($){return $.replace(/~1/g,"/").replace(/~0/g,"~")}function HB($){return/^[a-z][a-z0-9+.-]*:/i.test($)}function VB($){let Q=$.indexOf("#");if(Q===-1)return{filePart:$,pointer:""};return{filePart:$.slice(0,Q),pointer:$.slice(Q+1)}}function QW($,Q){let Z=VB($);return{file:Z.filePart?qQ(PQ(Q),Z.filePart):qQ(Q),pointer:Z.pointer}}function qB($,Q){let Z=YB(PQ($),Q).split(WB).join("/");return Z.startsWith(".")?Z:`./${Z}`}function KB($,Q,Z,X){if(HB($))return $;if($.startsWith("#")&&!X)return $;let Y=QW($,Q),W=Y.pointer?`#${Y.pointer}`:"";if(Y.file===qQ(Z))return W||"#";return`${qB(Z,Y.file)}${W}`}function KQ($){if(Array.isArray($))return $.map(KQ);if(!m0($))return $;let Q={};for(let[Z,X]of Object.entries($))Q[Z]=KQ(X);return Q}function t8($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return`[${$.map(t8).join(",")}]`;return`{${Object.entries($).sort(([Z],[X])=>Z.localeCompare(X)).map(([Z,X])=>`${JSON.stringify(Z)}:${t8(X)}`).join(",")}}`}function BB($,Q,Z){if(!Q.startsWith("/"))throw Error(`Kontract set reference '${Z}' must include a JSON pointer`);let X=$;for(let Y of Q.slice(1).split("/").map(_B)){if(m0(X)){let W=X[Y];if(W===void 0)throw Error(`Kontract set reference '${Z}' points to missing key '${Y}'`);X=W;continue}if(Array.isArray(X)&&/^\d+$/.test(Y)){let W=X[Number(Y)];if(W===void 0)throw Error(`Kontract set reference '${Z}' points to missing index '${Y}'`);X=W;continue}throw Error(`Kontract set reference '${Z}' cannot traverse '${Y}'`)}return X}async function ZW($){let Q=UB(await Bun.file($).text());if(!m0(Q))throw Error(`Kontract schema '${$}' must parse to a YAML object`);return Q}function AB($){if(typeof $==="string"){if($.includes("#")||$.includes("/")||$.includes("."))return $;return`#/${aX}/${l4}/${GB($)}`}if(m0($)&&typeof $[BQ]==="string")return $[BQ];throw Error("Kontract $sets entries must be set names or {$ref: ...} objects")}async function LB($,Q){let Z=AB($),X=QW(Z,Q.sourceFile),Y=`${X.file}#${X.pointer}`;if(Q.stack.includes(Y))throw Error(`Kontract set cycle detected: ${[...Q.stack,Y].join(" -> ")}`);let W=await ZW(X.file),U=KQ(BB(W,`/${X.pointer.replace(/^\//,"")}`,Z)),J=await fQ(U,{rebaseLocalRefs:Q.rebaseLocalRefs||X.file!==Q.sourceFile,sourceFile:X.file,stack:[...Q.stack,Y],targetFile:Q.targetFile});if(!m0(J))throw Error(`Kontract set reference '${Z}' must resolve to a map`);return J}async function OB($,Q){if($===void 0)return{};if(!Array.isArray($))throw Error("Kontract $sets must be a list of set names or set references");let Z={};for(let X of $){let Y=await LB(X,Q);for(let[W,U]of Object.entries(Y)){let J=Z[W];if(J!==void 0&&t8(J)!==t8(U))throw Error(`Kontract $sets conflict on key '${W}'`);Z[W]=U}}return Z}async function XW($,Q){let X={...await OB($[GX],Q)};for(let[Y,W]of Object.entries($)){if(Y===GX||Y===aX)continue;X[Y]=Y===BQ&&typeof W==="string"?KB(W,Q.sourceFile,Q.targetFile,Q.rebaseLocalRefs):await fQ(W,Q)}return X}async function fQ($,Q){if(Array.isArray($)){let Z=[];for(let X of $)Z.push(await fQ(X,Q));return Z}if(m0($))return XW($,Q);return $}function zB($,Q,Z,X){if(Z in $)throw Error(`Kontract source '${X}' uses internal '${Z}'. Use '${Q}: <version>' in public source files.`);let Y=$[Q];if(typeof Y!=="string")throw Error(`Kontract source '${X}' must declare '${Q}: <version>'`);return Y}function jB($,Q){let Z=Q.kind===T$.OpenApi?p4:c4,X=Q.kind===T$.OpenApi?TB:EB,Y=zB($,Z,X,Q.inputFile),W={[X]:Y};for(let[U,J]of Object.entries($)){if(U===Z)continue;W[U]=J}return W}async function yQ($){let Q=await ZW($.inputFile),Z=await XW(Q,{rebaseLocalRefs:!1,sourceFile:$.inputFile,stack:[],targetFile:$.outputFile}),X=jB(Z,$);return await XB(PQ($.outputFile),{recursive:!0}),await Bun.write($.outputFile,JB(X)),$.outputFile}function h0($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function WW($,Q){let Z=MB($,Q).split(SB).join("/");return Z.startsWith(".")?Z:`./${Z}`}function UW($){return $.replace(/~/g,"~0").replace(/\//g,"~1")}function DB($){return{$ref:`${WW($.aggregateDir,$.file)}#/paths/${UW($.pathName)}`}}function NB($){return{$ref:`${WW($.aggregateDir,$.file)}#/components/${$.componentGroup}/${UW($.componentName)}`}}async function wB($){let Q=IB(await Bun.file($).text());if(!h0(Q))throw Error(`API schema source '${$}' must parse to an object`);return Q}function bB($,Q){if(h0(Q?.info))return Q.info;return{title:`${$} Contracts`,version:"1.0.0"}}function kB($,Q,Z,X){if(!h0(X))return;for(let Y of Object.keys(X).sort()){if(Q[Y])throw Error(`Duplicate API path '${Y}' while grouping '${Z}'`);Q[Y]=DB({aggregateDir:$,file:Z,pathName:Y})}}function PB($,Q,Z,X,Y){let W=Y[X];if(!h0(W))return;let U=h0(Q[X])?Q[X]:{};for(let J of Object.keys(W).sort()){if(U[J])throw Error(`Duplicate API component '${X}.${J}'`);U[J]=NB({aggregateDir:$,componentGroup:X,componentName:J,file:Z})}Q[X]=U}function fB($,Q,Z,X){if(!h0(X))return;for(let Y of tX)PB($,Q,Z,Y,X)}async function AX($){await CB(BX($.outputPath),{recursive:!0});let Q=BX($.outputPath),Z=await Promise.all($.files.map((U)=>wB(U))),X={},Y={};$.files.forEach((U,J)=>{let G=Z[J];if(!G)return;kB(Q,X,U,G.paths),fB(Q,Y,U,G.components)});let W={openapi:typeof Z[0]?.openapi==="string"?Z[0].openapi:"3.0.3",info:bB($.name,Z[0]),paths:X,components:Y};return await FB($.outputPath,RB(W),"utf8"),$.outputPath}function xB($,Q,Z){return $1($,"normalized",h1(`${Q}-${Z}`))}async function P2($,Q,Z){let X=[];for(let Y of $)X.push(await yQ({inputFile:Y,kind:Q,outputFile:xB(Z,Q,Y)}));return X}async function vB($,Q){if(await e8(Q,{recursive:!0}),$.files.length===0)throw Error(`No async schema files found for service '${$.name}'`);if($.files.length===1){let W=$.files[0];if(!W)throw Error(`Missing async schema file for service '${$.name}'`);let[U]=await P2([W],T$.AsyncApi,Q);if(!U)throw Error(`Missing normalized async schema for service '${$.name}'`);if(!await Z$("bundle.decision",()=>pB(U)))return f("bundle.skippedInternalRefs"),{specFile:U,cleanup:null};let G=$1(Q,h1($.name)),_=await Z$("bundle.asyncapi",()=>VX([U],G));if(!_.success)throw _.error;return{specFile:_.outputPath,cleanup:()=>k2(G,{force:!0})}}let Z=$1(Q,h1($.name)),X=await P2($.files,T$.AsyncApi,Q),Y=await VX(X,Z);if(!Y.success)throw Y.error;return{specFile:Y.outputPath,cleanup:()=>k2(Z,{force:!0})}}async function JW($,Q){let Z=p8.get(Q);if(Z)return f("bundle.cacheCoalescedHits"),Z;if(await Bun.file(Q).exists())return f("bundle.cacheHits"),{specFile:Q,cleanup:null};f("bundle.cacheMisses");let X=Z$("bundle.openapi",async()=>{let Y=await kQ([$],Q);if(!Y.success)throw Y.error;return{specFile:Y.outputPath,cleanup:null}});p8.set(Q,X);try{return await X}finally{p8.delete(Q)}}async function gB($,Q,Z,X){let Y=$1(Q,h1(`${$.name}-entrypoint`));if(X){let G=$1(Q,lX);await e8(G,{recursive:!0});let _=V0(Z).slice(0,24),H=$1(G,h1(`${$.name}-${_}`));if(await Bun.file(H).exists())return f("bundle.cacheHits"),{specFile:H,cleanup:null};let V=await P2($.files,T$.OpenApi,Q);return await AX({files:V,name:$.name,outputPath:Y}),JW(Y,H)}let W=await P2($.files,T$.OpenApi,Q);await AX({files:W,name:$.name,outputPath:Y});let U=$1(Q,h1($.name)),J=await Z$("bundle.openapi",()=>kQ([Y],U));if(!J.success)throw J.error;return{specFile:J.outputPath,cleanup:async()=>{await k2(Y,{force:!0}),await k2(U,{force:!0})}}}async function hB($,Q,Z,X){if(await e8(Q,{recursive:!0}),$.files.length>1)return gB($,Q,Z,X);let[Y]=await P2([$.rootFile],T$.OpenApi,Q);if(!Y)throw Error(`Missing normalized API schema for service '${$.name}'`);if(!await Z$("bundle.decision",()=>lB(Y)))return f("bundle.skippedInternalRefs"),{specFile:Y,cleanup:null};if(X){let G=$1(Q,lX);await e8(G,{recursive:!0});let _=V0(Z).slice(0,24),H=$1(G,h1(`${$.name}-${_}`));if(await Bun.file(H).exists())return f("bundle.cacheHits"),{specFile:H,cleanup:null};return JW(Y,H)}let U=$1(Q,h1($.name)),J=await Z$("bundle.openapi",()=>kQ([Y],U));if(!J.success)throw J.error;return{specFile:J.outputPath,cleanup:()=>k2(U,{force:!0})}}function uB($){return $.match(/\$ref\s*:\s*['"]?([^'"\s]+)['"]?\s*$/)?.[1]??null}function dB($){return/\$ref\s*:\s*$/.test($)||/\$ref\s*:\s*[|>]/.test($)}function mB($){for(let Q of $.split(/\r?\n/)){if(!Q.includes("$ref"))continue;if(dB(Q))return null;let Z=uB(Q);if(!Z)return null;if(!Z.startsWith("#"))return!0}return!1}async function lB($){return GW($)}async function pB($){return GW($)}async function GW($){try{let Q=mB(await Bun.file($).text());if(Q===null)return f("bundle.ambiguousRefs"),!0;return Q}catch{return!0}}function z$($){let Q=z1($);return Q.endsWith("Message")?Q:`${Q}Message`}function z9($){let Q=z1($);return`${Q.endsWith("Message")?Q.slice(0,-7):Q}MessageInput`}function l0($){return rB($)}function O0($){let Q=z1($);return Q.endsWith("Dto")?Q:`${Q}Dto`}function _W($){let Q=z1($);return Q.endsWith("Schema")?Q:`${Q}Schema`}function xQ($){return`${O9($)}.dto.ts`}function l1($){return z1($)}function j9($){return`${O9($)}.ts`}function vQ($){return`${O9($)}.contract.ts`}function T9($){return`${O9($)}.enum.ts`}function p0($){return`${z1($)}Values`}function E9($){return`${z1($)}Map`}function gQ($){return z1(String($))}function iB($){return z1($)}function g2($){return nB($)}function LX($){return typeof $==="string"?`'${$.replace(/'/g,"\\'")}'`:String($)}function HW($,Q){let Z=p0($.name),X=E9($.name),Y=$.name,W=$.values.map((G)=>LX(G)).join(", "),U=$.members.map((G)=>` ${G.key}: ${LX(G.value)},`).join(`
180
+ `),J=$.values.map((G)=>String(G)).join(" | ");return["/**",` * ${Q} enum: ${$.name}`,` * Schema path: ${$.schemaPath}`,` * Values: ${J}`," */",`export const ${Z} = [${W}] as const;`,"",`export type ${Y} = (typeof ${Z})[number];`,"",`export const ${X} = {`,U,"} as const;"].join(`
181
+ `)}function YA($){return $.trim().replace(/\.+$/,"")}function WA($){return $.trim().replace(/^\.+/,"")}function UA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function JA($){let Q=$?.trim();if(!Q)throw Error("Async schema channel address is required");return Q}function j1($,Q){if(!$)return"";if(!Q||Q.trim().length===0)return $;let Z=YA(Q),X=WA($);if(!Z)return X;if(!X)return Z;if(X===Z)return X;if(X.startsWith(`${Z}.`))return X;return`${Z}.${X}`}function hQ($,Q,Z,X){let Y=j1(JA($),X),W=Y.match(/\{(.*?)\}/g);if(!W)return Y;return W.reduce((U,J)=>{let G=J.slice(1,-1),_=UA(Z?.properties)?Z.properties:{};if(!Object.hasOwn(_,G))throw Error(`Param '${G}' not found in message schema for address '${Y}'`);return U.replace(J,`\${${Q}.${G}}`)},Y)}function GA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function uQ($,Q){if(GA($))return $;throw Error(`${Q} metadata must be a JSON object`)}function KW($,Q){if($===void 0||$===null)return;return uQ($,Q)}function OX($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function Q1($){return $.split(`
182
+ `).map((Q)=>Q.trim()).filter((Q)=>Q.length>0)}function _A($){return $.replaceAll("*/","*\\/")}function S$($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${_A(X)}`).join(`
182
183
  `)," */"].join(`
183
- `)}function q2($,Q=2){if(!$)return"";let Z=" ".repeat(Q);return $.split(`
184
+ `)}function h2($,Q=2){if(!$)return"";let Z=" ".repeat(Q);return $.split(`
184
185
  `).map((X)=>`${Z}${X}`).join(`
185
- `)}function mX($){return $.replace(/\{[^}]+\}/g,"*")}function I1($){let Q=$.channels().all();if(Q.length!==1)throw Error(`Operation '${$.id()}' must have exactly one channel`);let Z=$.messages().all();if(Z.length!==1)throw Error(`Operation '${$.id()}' must have exactly one message`);let X=Q[0],U=Z[0];if(!X||!U)throw Error(`Operation '${$.id()}' channel/message metadata is incomplete`);let J=$.reply(),W=J?.messages()??J?.channel()?.messages(),Y=W&&W.length>0?W[0]:null,G=$.id();if(!G)throw Error("Operation has no id");let z=X.address();if(!z||z.trim().length===0)throw Error(`Operation '${G}' channel address is required`);let _=U.id();if(!_)throw Error(`Message in operation '${G}' has no id`);let V=n9($.json(),`Operation '${G}'`),H=z5(V,"summary")??null,O=z5(V,"description")??null;return{operationId:G,address:z,msgId:_,payloadSchema:dX(U.payload()?.json(),`Message '${_}' payload`),replyMsgId:Y?.id()??null,summary:H,description:O}}function WH($,Q){let Z=new Map;for(let X of $.operations().all()){let{address:U,msgId:J,replyMsgId:W}=I1(X),Y=W1(U,Q),G=q$(J),z=X.isSend()?"void":W?q$(W):"CommandReturnType",_=Z.get(Y);if(!_){Z.set(Y,{address:Y,requestType:G,responseType:z});continue}let V=_.requestType===G?_.requestType:`${_.requestType} | ${G}`,H=_.responseType===z?_.responseType:`${_.responseType} | ${z}`;Z.set(Y,{address:Y,requestType:V,responseType:H})}return Z}function YH($){return $.replaceAll("'","\\'")}function _5($){if(typeof $!=="string")return null;let Q=$.trim().toLowerCase();if(Q==="command"||Q==="cmd")return B$.Command;if(Q==="query"||Q==="qry")return B$.Query;if(Q==="event"||Q==="evt")return B$.Event;return null}function GH($){let Q=$.trim().toLowerCase();if(Q.includes(".cmd.")||Q.includes(".command."))return B$.Command;if(Q.includes(".qry.")||Q.includes(".query."))return B$.Query;if(Q.includes(".evt.")||Q.includes(".event."))return B$.Event;return null}function p6($,Q){let{operationId:Z,address:X}=I1($),U=W1(X,Q),J=n9($.json(),`Operation '${Z}'`),Y=$.channels().all()[0],G=dX(Y?.json(),`Operation '${Z}' channel`),z=_5(J["x-sumr-intent"])??_5(G?.["x-sumr-intent"]);if(z)return z;let _=GH(U);if(_)return _;if($.isSend())return B$.Event;if($.isReceive()&&$.reply())return B$.Query;if($.isReceive())return B$.Command;throw Error(`Cannot infer operation intent for '${Z}'. Add x-sumr-intent or use an address segment like '.cmd.' or '.qry.'.`)}function zH($,Q){let X=$.operations().all().map((W)=>{let{operationId:Y,address:G}=I1(W),z=W1(G,Q);return{operationId:Y,key:E0(Y),address:z}}).map((W)=>[` /** ${W.operationId} */`,` ${W.key}: '${W.address}',`].join(`
186
+ `)}function BW($){return $.replace(/\{[^}]+\}/g,"*")}function c1($){let Q=$.channels().all();if(Q.length!==1)throw Error(`Operation '${$.id()}' must have exactly one channel`);let Z=$.messages().all();if(Z.length!==1)throw Error(`Operation '${$.id()}' must have exactly one message`);let X=Q[0],Y=Z[0];if(!X||!Y)throw Error(`Operation '${$.id()}' channel/message metadata is incomplete`);let W=$.reply(),U=W?.messages()??W?.channel()?.messages(),J=U&&U.length>0?U[0]:null,G=$.id();if(!G)throw Error("Operation has no id");let _=X.address();if(!_||_.trim().length===0)throw Error(`Operation '${G}' channel address is required`);let H=Y.id();if(!H)throw Error(`Message in operation '${G}' has no id`);let V=uQ($.json(),`Operation '${G}'`),q=OX(V,"summary")??null,K=OX(V,"description")??null;return{operationId:G,address:_,msgId:H,payloadSchema:KW(Y.payload()?.json(),`Message '${H}' payload`),replyMsgId:J?.id()??null,summary:q,description:K}}function HA($,Q){let Z=new Map;for(let X of $.operations().all()){let{address:Y,msgId:W,replyMsgId:U}=c1(X),J=j1(Y,Q),G=z$(W),_=X.isSend()?"void":U?z$(U):"CommandReturnType",H=Z.get(J);if(!H){Z.set(J,{address:J,requestType:G,responseType:_});continue}let V=H.requestType===G?H.requestType:`${H.requestType} | ${G}`,q=H.responseType===_?H.responseType:`${H.responseType} | ${_}`;Z.set(J,{address:J,requestType:V,responseType:q})}return Z}function VA($){return $.replaceAll("'","\\'")}function zX($){if(typeof $!=="string")return null;let Q=$.trim().toLowerCase();if(Q==="command"||Q==="cmd")return j$.Command;if(Q==="query"||Q==="qry")return j$.Query;if(Q==="event"||Q==="evt")return j$.Event;return null}function qA($){let Q=$.trim().toLowerCase();if(Q.includes(".cmd.")||Q.includes(".command."))return j$.Command;if(Q.includes(".qry.")||Q.includes(".query."))return j$.Query;if(Q.includes(".evt.")||Q.includes(".event."))return j$.Event;return null}function C9($,Q){let{operationId:Z,address:X}=c1($),Y=j1(X,Q),W=uQ($.json(),`Operation '${Z}'`),J=$.channels().all()[0],G=KW(J?.json(),`Operation '${Z}' channel`),_=zX(W["x-sumr-intent"])??zX(G?.["x-sumr-intent"]);if(_)return _;let H=qA(Y);if(H)return H;if($.isSend())return j$.Event;if($.isReceive()&&$.reply())return j$.Query;if($.isReceive())return j$.Command;throw Error(`Cannot infer operation intent for '${Z}'. Add x-sumr-intent or use an address segment like '.cmd.' or '.qry.'.`)}function KA($,Q){let X=$.operations().all().map((U)=>{let{operationId:J,address:G}=c1(U),_=j1(G,Q);return{operationId:J,key:l0(J),address:_}}).map((U)=>[` /** ${U.operationId} */`,` ${U.key}: '${U.address}',`].join(`
186
187
  `)).join(`
187
- `),U=T$(["NATS subjects for server handlers and client publish/send calls.","Named placeholders (for example {organizationId}) are preserved for client interpolation."]),J=T$(["Semantic aliases for NestJS controller decorators and event publishers."]);return[`${U}
188
+ `),Y=S$(["NATS subjects for server handlers and client publish/send calls.","Named placeholders (for example {organizationId}) are preserved for client interpolation."]),W=S$(["Semantic aliases for NestJS controller decorators and event publishers."]);return[`${Y}
188
189
  export const SUBJECTS = {
189
190
  ${X}
190
- } as const;`,[J,"export const SUBSCRIBE_ROUTES = SUBJECTS;","export const PUBLISH_ADDRESSES = SUBJECTS;"].join(`
191
+ } as const;`,[W,"export const SUBSCRIBE_ROUTES = SUBJECTS;","export const PUBLISH_ADDRESSES = SUBJECTS;"].join(`
191
192
  `)].join(`
192
193
 
193
- `)}function _H($,Q){let Z=WH($,Q);if(Z.size===0)return"";let X=[...Z.values()].map((J)=>[` '${YH(J.address)}': {`,` request: ${J.requestType};`,` response: ${J.responseType};`," };"].join(`
194
+ `)}function BA($,Q){let Z=HA($,Q);if(Z.size===0)return"";let X=[...Z.values()].map((W)=>[` '${VA(W.address)}': {`,` request: ${W.requestType};`,` response: ${W.responseType};`," };"].join(`
194
195
  `)).join(`
195
- `);return`${T$(["Route contracts used to strongly type client proxy send/emit calls."])}
196
+ `);return`${S$(["Route contracts used to strongly type client proxy send/emit calls."])}
196
197
  export interface ClientRouteContracts {
197
198
  ${X}
198
- }`}function VH($,Q){let Z=$.operations().all().filter((J)=>J.isReceive()&&p6(J,Q)===B$.Command);if(Z.length===0)return"";let X=Z.map((J)=>{let{operationId:W,address:Y,msgId:G,replyMsgId:z,summary:_,description:V}=I1(J),H=K2(W),O=W1(Y,Q),K=mX(O),q=z?q$(z):"CommandReturnType",B=[];if(_)B.push(...r$(_));if(V)B.push(...r$(V));B.push(`@subscribeRoute ${K}`),B.push(`@publishAddress ${O}`),B.push(`@param msg ${q$(G)}`),B.push(`@returns Promise<${q}>`);let F=T$(B);return[q2(F),` ${H}(msg: ${q$(G)}, ctx: IMsgContext): Promise<${q}>;`].filter(Boolean).join(`
199
+ }`}function AA($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&C9(W,Q)===j$.Command);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:U,address:J,msgId:G,replyMsgId:_,summary:H,description:V}=c1(W),q=g2(U),K=j1(J,Q),B=BW(K),L=_?z$(_):"CommandReturnType",O=[];if(H)O.push(...Q1(H));if(V)O.push(...Q1(V));O.push(`@subscribeRoute ${B}`),O.push(`@publishAddress ${K}`),O.push(`@param msg ${z$(G)}`),O.push(`@returns Promise<${L}>`);let S=S$(O);return[h2(S),` ${q}(msg: ${z$(G)}, ctx: IMsgContext): Promise<${L}>;`].filter(Boolean).join(`
199
200
  `)}).join(`
200
- `);return`${T$(["Server contract for command handlers."])}
201
+ `);return`${S$(["Server contract for command handlers."])}
201
202
  export interface ICommandServer {
202
203
  ${X}
203
- }`}function HH($,Q){let Z=$.operations().all().filter((J)=>J.isReceive()&&p6(J,Q)===B$.Query);if(Z.length===0)return"";let X=Z.map((J)=>{let{operationId:W,address:Y,msgId:G,replyMsgId:z,summary:_,description:V}=I1(J),H=K2(W),O=W1(Y,Q),K=mX(O),q=z?q$(z):"unknown",B=[];if(_)B.push(...r$(_));if(V)B.push(...r$(V));B.push(`@subscribeRoute ${K}`),B.push(`@publishAddress ${O}`),B.push(`@param msg ${q$(G)}`),B.push(`@returns Promise<${q}>`);let F=T$(B);return[q2(F),` ${H}(msg: ${q$(G)}, ctx: IMsgContext): Promise<${q}>;`].filter(Boolean).join(`
204
+ }`}function LA($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&C9(W,Q)===j$.Query);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:U,address:J,msgId:G,replyMsgId:_,summary:H,description:V}=c1(W),q=g2(U),K=j1(J,Q),B=BW(K),L=_?z$(_):"unknown",O=[];if(H)O.push(...Q1(H));if(V)O.push(...Q1(V));O.push(`@subscribeRoute ${B}`),O.push(`@publishAddress ${K}`),O.push(`@param msg ${z$(G)}`),O.push(`@returns Promise<${L}>`);let S=S$(O);return[h2(S),` ${q}(msg: ${z$(G)}, ctx: IMsgContext): Promise<${L}>;`].filter(Boolean).join(`
204
205
  `)}).join(`
205
- `);return`${T$(["Server contract for query handlers (receive operations with reply)."])}
206
+ `);return`${S$(["Server contract for query handlers (receive operations with reply)."])}
206
207
  export interface IQueryServer {
207
208
  ${X}
208
- }`}function OH($,Q){let Z=$.operations().all().filter((J)=>J.isReceive()&&p6(J,Q)===B$.Command);if(Z.length===0)return"";let X=Z.map((J)=>{let{operationId:W,address:Y,msgId:G,payloadSchema:z,replyMsgId:_,summary:V,description:H}=I1(J),O=c9(Y,"msg",z,Q),K=u6(G),q=q$(G),B=K2(W),F=E0(W),C=W1(Y,Q),T=C.includes("{"),R=T?`\`${O}\``:`SUBJECTS.${F}`,k=_?q$(_):"CommandReturnType",x=T?`this.proxy.send<${k}, ${q}>(${R}, validated, ctx);`:`this.proxy.send(${R}, validated, ctx);`,y=[];if(V)y.push(...r$(V));if(H)y.push(...r$(H));y.push(`@publishAddress ${C}`),y.push(`@param msg ${K}`),y.push(`@returns Observable<${k}>`);let Y$=T$(y);return[q2(Y$),` ${B}(msg: ${K}, ctx?: IMsgContext): Observable<${k}> {`,` const validated = ${q}.parse(msg);`,` return ${x}`," }"].filter(Boolean).join(`
209
+ }`}function OA($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&C9(W,Q)===j$.Command);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:U,address:J,msgId:G,payloadSchema:_,replyMsgId:H,summary:V,description:q}=c1(W),K=hQ(J,"msg",_,Q),B=z9(G),L=z$(G),O=g2(U),S=l0(U),M=j1(J,Q),C=M.includes("{"),D=C?`\`${K}\``:`SUBJECTS.${S}`,k=H?z$(H):"CommandReturnType",u=C?`this.proxy.send<${k}, ${L}>(${D}, validated, ctx);`:`this.proxy.send(${D}, validated, ctx);`,x=[];if(V)x.push(...Q1(V));if(q)x.push(...Q1(q));x.push(`@publishAddress ${M}`),x.push(`@param msg ${B}`),x.push(`@returns Observable<${k}>`);let V$=S$(x);return[h2(V$),` ${O}(msg: ${B}, ctx?: IMsgContext): Observable<${k}> {`,` const validated = ${L}.parse(msg);`,` return ${u}`," }"].filter(Boolean).join(`
209
210
  `)}).join(`
210
211
 
211
- `);return`${T$(["Client helper for command request/reply interactions."])}
212
+ `);return`${S$(["Client helper for command request/reply interactions."])}
212
213
  export class CommandClient {
213
214
  private readonly proxy: IClientProxy<ClientRouteContracts>;
214
215
 
@@ -217,10 +218,10 @@ export class CommandClient {
217
218
  }
218
219
 
219
220
  ${X}
220
- }`}function KH($,Q){let Z=$.operations().all().filter((J)=>J.isReceive()&&p6(J,Q)===B$.Query);if(Z.length===0)return"";let X=Z.map((J)=>{let{operationId:W,address:Y,msgId:G,payloadSchema:z,replyMsgId:_,summary:V,description:H}=I1(J),O=c9(Y,"msg",z,Q),K=u6(G),q=q$(G),B=K2(W),F=_?q$(_):"unknown",C=E0(W),T=W1(Y,Q),R=T.includes("{"),k=R?`\`${O}\``:`SUBJECTS.${C}`,x=R?`this.proxy.send<${F}, ${q}>(${k}, validated, ctx);`:`this.proxy.send(${k}, validated, ctx);`,y=[];if(V)y.push(...r$(V));if(H)y.push(...r$(H));y.push(`@publishAddress ${T}`),y.push(`@param msg ${K}`),y.push(`@returns Observable<${F}>`);let Y$=T$(y);return[q2(Y$),` ${B}(msg: ${K}, ctx?: IMsgContext): Observable<${F}> {`,` const validated = ${q}.parse(msg);`,` return ${x}`," }"].filter(Boolean).join(`
221
+ }`}function zA($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&C9(W,Q)===j$.Query);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:U,address:J,msgId:G,payloadSchema:_,replyMsgId:H,summary:V,description:q}=c1(W),K=hQ(J,"msg",_,Q),B=z9(G),L=z$(G),O=g2(U),S=H?z$(H):"unknown",M=l0(U),C=j1(J,Q),D=C.includes("{"),k=D?`\`${K}\``:`SUBJECTS.${M}`,u=D?`this.proxy.send<${S}, ${L}>(${k}, validated, ctx);`:`this.proxy.send(${k}, validated, ctx);`,x=[];if(V)x.push(...Q1(V));if(q)x.push(...Q1(q));x.push(`@publishAddress ${C}`),x.push(`@param msg ${B}`),x.push(`@returns Observable<${S}>`);let V$=S$(x);return[h2(V$),` ${O}(msg: ${B}, ctx?: IMsgContext): Observable<${S}> {`,` const validated = ${L}.parse(msg);`,` return ${u}`," }"].filter(Boolean).join(`
221
222
  `)}).join(`
222
223
 
223
- `);return`${T$(["Client helper for query request/reply interactions."])}
224
+ `);return`${S$(["Client helper for query request/reply interactions."])}
224
225
  export class QueryClient {
225
226
  private readonly proxy: IClientProxy<ClientRouteContracts>;
226
227
 
@@ -229,10 +230,10 @@ export class QueryClient {
229
230
  }
230
231
 
231
232
  ${X}
232
- }`}function qH($,Q){let Z=$.operations().all().filter((J)=>J.isSend());if(Z.length===0)return"";let X=Z.map((J)=>{let{operationId:W,address:Y,msgId:G,payloadSchema:z,summary:_,description:V}=I1(J),H=c9(Y,"msg",z,Q),O=u6(G),K=q$(G),q=K2(W),B=E0(W),F=W1(Y,Q),C=F.includes("{"),T=C?`\`${H}\``:`SUBJECTS.${B}`,R=C?`this.proxy.emit<void, ${K}>(${T}, validated, ctx);`:`this.proxy.emit(${T}, validated, ctx);`,k=[];if(_)k.push(...r$(_));if(V)k.push(...r$(V));k.push(`@publishAddress ${F}`),k.push(`@param msg ${O}`),k.push("@returns Observable<void>");let x=T$(k);return[q2(x),` ${q}(msg: ${O}, ctx?: IMsgContext): Observable<void> {`,` const validated = ${K}.parse(msg);`,` return ${R}`," }"].filter(Boolean).join(`
233
+ }`}function jA($,Q){let Z=$.operations().all().filter((W)=>W.isSend());if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:U,address:J,msgId:G,payloadSchema:_,summary:H,description:V}=c1(W),q=hQ(J,"msg",_,Q),K=z9(G),B=z$(G),L=g2(U),O=l0(U),S=j1(J,Q),M=S.includes("{"),C=M?`\`${q}\``:`SUBJECTS.${O}`,D=M?`this.proxy.emit<void, ${B}>(${C}, validated, ctx);`:`this.proxy.emit(${C}, validated, ctx);`,k=[];if(H)k.push(...Q1(H));if(V)k.push(...Q1(V));k.push(`@publishAddress ${S}`),k.push(`@param msg ${K}`),k.push("@returns Observable<void>");let u=S$(k);return[h2(u),` ${L}(msg: ${K}, ctx?: IMsgContext): Observable<void> {`,` const validated = ${B}.parse(msg);`,` return ${D}`," }"].filter(Boolean).join(`
233
234
  `)}).join(`
234
235
 
235
- `);return`${T$(["Client helper for fire-and-forget event publishing."])}
236
+ `);return`${S$(["Client helper for fire-and-forget event publishing."])}
236
237
  export class EventClient {
237
238
  private readonly proxy: IClientProxy<ClientRouteContracts>;
238
239
 
@@ -241,100 +242,107 @@ export class EventClient {
241
242
  }
242
243
 
243
244
  ${X}
244
- }`}function LH($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function AH($){let Q=$.enum;if(!Array.isArray(Q)||Q.length===0)return null;let Z=[];for(let X of Q){if(typeof X!=="string"&&typeof X!=="number")return null;Z.push(X)}return Z}function MH($,Q,Z){let X=Q.map((J)=>({key:p9(J),value:J})),U=new Set;for(let J of X){if(U.has(J.key))throw Error(`AsyncAPI enum '${$}' has duplicate normalized key '${J.key}' (path: ${Z})`);U.add(J.key)}return{name:$,schemaPath:Z,values:Q,members:X}}function jH($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function TH($){return $.values.every((Q)=>typeof Q==="string")}function K9($,Q,Z){if(!Q||$.has(Q))return;$.set(Q,Z)}function EH($){let Q=[];for(let X of $.components().schemas().all()){let U=X.id();if(!U||U.startsWith(R_))continue;let J=X.json();if(!LH(J))continue;let W=AH(J);if(!W)continue;Q.push({group:MH(U,W,`${D_}${U}`),origin:jH(J,l5)})}Q.sort((X,U)=>X.group.name.localeCompare(U.group.name));let Z=new Map;for(let{group:X,origin:U}of Q){if(!TH(X))continue;K9(Z,X.name,X),K9(Z,X.schemaPath,X),K9(Z,U,X)}return{groups:Q.map((X)=>X.group),identityIndex:Z}}function CH($,Q){return $.length===Q.values.length&&$.every((Z,X)=>Z===Q.values[X])}function SH($,Q){return(Z)=>{if(!Array.isArray(Z.enum))return;let X=[Z[I_],Z[l5]];for(let U of X){if(typeof U!=="string")continue;let J=$.get(U);if(!J||!CH(Z.enum,J))continue;let W=C0(J.name);return Q.add(W),`z.enum(${W})`}}}function RH($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function V5($,Q){if(RH($))return $;throw Error(`${Q} metadata must be a JSON object`)}function DH($,Q,Z){try{return IH(Q,{module:"none",parserOverride:Z}).replaceAll("z.any()","z.unknown()")}catch(X){let U=X instanceof Error?X.message:String(X);throw Error(`Failed to convert AsyncAPI message '${$}' payload to Zod: ${U}`)}}function q9($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function NH($){return $.replaceAll("*/","*\\/")}function wH($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${NH(X)}`).join(`
245
+ }`}function EA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function CA($){let Q=$.enum;if(!Array.isArray(Q)||Q.length===0)return null;let Z=[];for(let X of Q){if(typeof X!=="string"&&typeof X!=="number")return null;Z.push(X)}return Z}function FA($,Q,Z){let X=Q.map((W)=>({key:gQ(W),value:W})),Y=new Set;for(let W of X){if(Y.has(W.key))throw Error(`Async schema enum '${$}' has duplicate normalized key '${W.key}' (path: ${Z})`);Y.add(W.key)}return{name:$,schemaPath:Z,values:Q,members:X}}function MA($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function SA($){return $.values.every((Q)=>typeof Q==="string")}function $Q($,Q,Z){if(!Q||$.has(Q))return;$.set(Q,Z)}function IA($){let Q=[];for(let X of $.components().schemas().all()){let Y=X.id();if(!Y||Y.startsWith($q))continue;let W=X.json();if(!EA(W))continue;let U=CA(W);if(!U)continue;Q.push({group:FA(Y,U,`${Qq}${Y}`),origin:MA(W,WY)})}Q.sort((X,Y)=>X.group.name.localeCompare(Y.group.name));let Z=new Map;for(let{group:X,origin:Y}of Q){if(!SA(X))continue;$Q(Z,X.name,X),$Q(Z,X.schemaPath,X),$Q(Z,Y,X)}return{groups:Q.map((X)=>X.group),identityIndex:Z}}function RA($,Q){return $.length===Q.values.length&&$.every((Z,X)=>Z===Q.values[X])}function DA($,Q){return(Z)=>{if(!Array.isArray(Z.enum))return;let X=[Z[e4],Z[WY]];for(let Y of X){if(typeof Y!=="string")continue;let W=$.get(Y);if(!W||!RA(Z.enum,W))continue;let U=p0(W.name);return Q.add(U),`z.enum(${U})`}}}function bA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function jX($,Q){if(bA($))return $;throw Error(`${Q} metadata must be a JSON object`)}function kA($,Q,Z){try{return wA(Q,{module:"none",parserOverride:Z}).replaceAll("z.any()","z.unknown()")}catch(X){let Y=X instanceof Error?X.message:String(X);throw Error(`Failed to convert async message '${$}' payload to Zod: ${Y}`)}}function QQ($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function PA($){return $.replaceAll("*/","*\\/")}function fA($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${PA(X)}`).join(`
245
246
  `)," */"].join(`
246
- `)}function kH($,Q){let Z=$.id();if(!Z)throw Error("AsyncAPI message is missing an id");let X=$.payload();if(!X)throw Error(`AsyncAPI message '${Z}' is missing a payload schema`);let U=V5(X.json(),`AsyncAPI message '${Z}' payload`),J=DH(Z,U,Q),W=q$(Z),Y=u6(Z),G=V5($.json(),`AsyncAPI message '${Z}'`),z=q9(G,"summary"),_=q9(G,"description")??q9(U,"description");return[wH([...z?[z]:[],..._?[_]:[],`Runtime schema for ${W}.`]),`export const ${W} = ${J};`,`export type ${W} = z.infer<typeof ${W}>;`,`export type ${Y} = z.input<typeof ${W}>;`].filter(Boolean).join(`
247
- `)}function PH($,Q){return $.map((Z)=>kH(Z,Q)).filter(Boolean).join(`
247
+ `)}function yA($,Q){let Z=$.id();if(!Z)throw Error("Async message is missing an id");let X=$.payload();if(!X)throw Error(`Async message '${Z}' is missing a payload schema`);let Y=jX(X.json(),`Async message '${Z}' payload`),W=kA(Z,Y,Q),U=z$(Z),J=z9(Z),G=jX($.json(),`Async message '${Z}'`),_=QQ(G,"summary"),H=QQ(G,"description")??QQ(Y,"description");return[fA([..._?[_]:[],...H?[H]:[],`Runtime schema for ${U}.`]),`export const ${U} = ${W};`,`export type ${U} = z.infer<typeof ${U}>;`,`export type ${J} = z.input<typeof ${U}>;`].filter(Boolean).join(`
248
+ `)}function xA($,Q){return $.map((Z)=>yA(Z,Q)).filter(Boolean).join(`
248
249
 
249
- `)}async function E9($,Q,Z){return Z?f6($,Q):$}function A1($){return $.split(`
250
+ `)}async function AQ($,Q,Z){return Z?V9($,Q):$}function x1($){return $.split(`
250
251
  `).map((Q)=>Q?` ${Q}`:"").join(`
251
- `)}function fH($){return $.endsWith("Schema")?$:`${$}Schema`}function vH($){return $.message}async function xH($,Q,Z,X){let U=!1,J=[],W=new Set;for(let Y of $){let G=m6(Y.name);W.add(G);let z=U2(Q,G),_=await E9(gX(Y,"AsyncAPI"),z,X);if(await s(z,_))U=!0;if(J.push(`./${G.replace(/\.ts$/,"")}`),Z)lX.step(` \u2713 ${z}`)}if(await y6(Q,W))U=!0;if(await F1(Q,J.sort()))U=!0;return U}function gH($){if($.size===0)return[];return[`import { ${[...$].sort().join(", ")} } from './${B9}';`]}async function hH($,Q,Z,X){let U=$.replace(/\.asyncapi\.ya?ml$/,"").split("/").pop()??$;try{let J=new yH,W=U2(Q,"nats"),Y=U2(W,N_),G=X?.sharedTypesImportPath??"./shared",z=X?.sharedTypesOutputFile??U2(W,w_),_=X?.formatFiles!==!1,V=await Bun.file($).text(),{document:H,diagnostics:O}=await J.parse(V);if(!H){let gG=O.map(vH).join(", ");throw Error(`AsyncAPI parse failed: ${gG}`)}let K=pV(H.info().title()),q=fH(K),B=`${E0(K)}_NATS_CLIENT`,F=H.components().messages().all(),{groups:C,identityIndex:T}=EH(H),R=new Set,k=SH(T,R),x=PH(F,k),Y$=["import { z } from 'zod';","import { Observable } from 'rxjs';",`import { CommandReturnType, IClientProxy, IMsgContext, IRawClientProxy, createRouteTypedClientProxy } from '${G}';`,...gH(R),"",`export const ${B} = '${B}';`,"",`export * from './${B9}';`,"",`export namespace ${q} {`,A1(x),"",A1(zH(H,X?.addressPrefix)),"",A1(_H(H,X?.addressPrefix)),"",A1(VH(H,X?.addressPrefix)),"",A1(HH(H,X?.addressPrefix)),"",A1(OH(H,X?.addressPrefix)),"",A1(KH(H,X?.addressPrefix)),"",A1(qH(H,X?.addressPrefix)),"}"].join(`
252
- `),_0=await E9(Y$,Y,_),p8=await E9(uX,z,_),fG=await xH(C,U2(W,B9),Z,_),vG=await s(Y,_0),xG=await s(z,p8),x7=vG||xG||fG;if(Z&&x7)lX.step(` \u2713 ${Y}`);return{success:!0,service:U,changed:x7}}catch(J){return{success:!1,service:U,error:J instanceof Error?J:Error(String(J))}}}function C9($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function dH($,Q){let Z=0;for(let X=Q-1;X>=0&&$[X]==="\\";X-=1)Z+=1;return Z%2===1}function mH($){let Q="";for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(X==="/"&&!dH($,Z))Q+="\\/";else if(X==="\r")Q+="\\r";else if(X===`
253
- `)Q+="\\n";else if(X==="\u2028")Q+="\\u2028";else if(X==="\u2029")Q+="\\u2029";else Q+=X}return`/${Q}/`}function pX($,Q){return Q?`${$}.describe(${C9(Q)})`:$}function lH($){let Q=$.map((Z)=>typeof Z==="string"?C9(Z):`z.literal(${Z})`);if($.every((Z)=>typeof Z==="string"))return`z.enum([${$.map((Z)=>C9(String(Z))).join(", ")}])`;return`z.union([${Q.join(", ")}])`}function pH($){if($.scalar==="boolean")return"z.boolean()";if($.scalar==="integer")return H5($,!0);if($.scalar==="number")return H5($,!1);let Q="z.string()";if($.format==="uuid")Q+=".uuid()";if($.format==="email")Q+=".email()";if($.format==="uri"||$.format==="url")Q+=".url()";if($.format==="date-time")Q+=".datetime()";if($.minLength!==void 0)Q+=`.min(${$.minLength})`;if($.maxLength!==void 0)Q+=`.max(${$.maxLength})`;if($.pattern)Q+=`.regex(${mH($.pattern)})`;return Q}function H5($,Q){let Z=Q?"z.number().int()":"z.number()";if($.minimum!==void 0)Z+=`.min(${$.minimum})`;if($.maximum!==void 0)Z+=`.max(${$.maximum})`;return Z}function n1($,Q){if($.kind==="scalar")return pH($);if($.kind==="enum")return lH($.values);if($.kind==="array")return`z.array(${n1($.items,Q)})`;if($.kind==="unknown")return"z.unknown()";if($.kind==="object"){let J=Object.entries($.properties);if(J.length===0&&$.additionalProperties)return`z.record(z.string(), ${n1($.additionalProperties,Q)})`;if(J.length===0)return"z.record(z.string(), z.unknown())";let Y=`z.object({
254
- ${J.map(([G,z])=>{let _=pX(n1(z,Q),z.description);if(!$.required.includes(G))_+=".optional()";return` ${G}: ${_},`}).join(`
252
+ `)}function hA($){return $.endsWith("Schema")?$:`${$}Schema`}function uA($){return $.message}async function dA($,Q,Z,X){let Y=!1,W=[],U=new Set;for(let J of $){let G=T9(J.name);U.add(G);let _=D2(Q,G),H=await AQ(HW(J,"async schema"),_,X);if(await e(_,H))Y=!0;if(W.push(`./${G.replace(/\.ts$/,"")}`),Z)AW.step(` \u2713 ${_}`)}if(await H9(Q,U))Y=!0;if(await p1(Q,W.sort()))Y=!0;return Y}function mA($){if($.size===0)return[];return[`import { ${[...$].sort().join(", ")} } from './${UQ}';`]}async function lA($,Q,Z,X){let Y=$.replace(/\.async\.ya?ml$/,"").replace(/\.asyncapi\.ya?ml$/,"").split("/").pop()??$;try{let W=new gA,U=D2(Q,"nats"),J=D2(U,Zq),G=X?.sharedTypesImportPath??"./shared",_=X?.sharedTypesOutputFile??D2(U,Xq),H=X?.formatFiles!==!1,V=await Bun.file($).text(),{document:q,diagnostics:K}=await W.parse(V);if(!q){let IH=K.map(uA).join(", ");throw Error(`Async schema parse failed: ${IH}`)}let B=iB(q.info().title()),L=hA(B),O=`${l0(B)}_NATS_CLIENT`,S=q.components().messages().all(),{groups:M,identityIndex:C}=IA(q),D=new Set,k=DA(C,D),u=xA(S,k),V$=["import { z } from 'zod';","import { Observable } from 'rxjs';",`import { CommandReturnType, IClientProxy, IMsgContext, IRawClientProxy, createRouteTypedClientProxy } from '${G}';`,...mA(D),"",`export const ${O} = '${O}';`,"",`export * from './${UQ}';`,"",`export namespace ${L} {`,x1(u),"",x1(KA(q,X?.addressPrefix)),"",x1(BA(q,X?.addressPrefix)),"",x1(AA(q,X?.addressPrefix)),"",x1(LA(q,X?.addressPrefix)),"",x1(OA(q,X?.addressPrefix)),"",x1(zA(q,X?.addressPrefix)),"",x1(jA(q,X?.addressPrefix)),"}"].join(`
253
+ `),D0=await AQ(V$,J,H),R6=await AQ(qW,_,H),FH=await dA(M,D2(U,UQ),Z,H),MH=await e(J,D0),SH=await e(_,R6),v7=MH||SH||FH;if(Z&&v7)AW.step(` \u2713 ${J}`);return{success:!0,service:Y,changed:v7}}catch(W){return{success:!1,service:Y,error:W instanceof Error?W:Error(String(W))}}}function LQ($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function cA($,Q){let Z=0;for(let X=Q-1;X>=0&&$[X]==="\\";X-=1)Z+=1;return Z%2===1}function nA($){let Q="";for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(X==="/"&&!cA($,Z))Q+="\\/";else if(X==="\r")Q+="\\r";else if(X===`
254
+ `)Q+="\\n";else if(X==="\u2028")Q+="\\u2028";else if(X==="\u2029")Q+="\\u2029";else Q+=X}return`/${Q}/`}function LW($,Q){return Q?`${$}.describe(${LQ(Q)})`:$}function rA($){let Q=$.map((Z)=>typeof Z==="string"?LQ(Z):`z.literal(${Z})`);if($.every((Z)=>typeof Z==="string"))return`z.enum([${$.map((Z)=>LQ(String(Z))).join(", ")}])`;return`z.union([${Q.join(", ")}])`}function iA($){if($.scalar==="boolean")return"z.boolean()";if($.scalar==="integer")return TX($,!0);if($.scalar==="number")return TX($,!1);let Q="z.string()";if($.format==="uuid")Q+=".uuid()";if($.format==="email")Q+=".email()";if($.format==="uri"||$.format==="url")Q+=".url()";if($.format==="date-time")Q+=".datetime()";if($.minLength!==void 0)Q+=`.min(${$.minLength})`;if($.maxLength!==void 0)Q+=`.max(${$.maxLength})`;if($.pattern)Q+=`.regex(${nA($.pattern)})`;return Q}function TX($,Q){let Z=Q?"z.number().int()":"z.number()";if($.minimum!==void 0)Z+=`.min(${$.minimum})`;if($.maximum!==void 0)Z+=`.max(${$.maximum})`;return Z}function G0($,Q){if($.kind==="scalar")return iA($);if($.kind==="enum")return rA($.values);if($.kind==="array")return`z.array(${G0($.items,Q)})`;if($.kind==="unknown")return"z.unknown()";if($.kind==="object"){let W=Object.entries($.properties);if(W.length===0&&$.additionalProperties)return`z.record(z.string(), ${G0($.additionalProperties,Q)})`;if(W.length===0)return"z.record(z.string(), z.unknown())";let J=`z.object({
255
+ ${W.map(([G,_])=>{let H=LW(G0(_,Q),_.description);if(!$.required.includes(G))H+=".optional()";return` ${G}: ${H},`}).join(`
255
256
  `)}
256
- })`;return $.additionalProperties?`${Y}.catchall(${n1($.additionalProperties,Q)})`:Y}let Z=xX($.refName),X=`./${l9($.refName).replace(/\.ts$/,"")}`,U=Q.get(X)??new Set;return U.add(Z),Q.set(X,U),Z}function cH($,Q){let Z=n1($.schema,Q);if($.nullable)Z+=".nullable()";if($.optional)Z+=".optional()";return Z=pX(Z,$.description??$.schema.description),` ${$.name}: ${Z},`}function nH($){let Q=new Map,Z=xX($.schemaName),X=$0($.schemaName),U=C1($.schemaName),J=$.properties.length>0?`z.object({
257
- ${$.properties.map((z)=>cH(z,Q)).join(`
257
+ })`;return $.additionalProperties?`${J}.catchall(${G0($.additionalProperties,Q)})`:J}let Z=_W($.refName),X=`./${vQ($.refName).replace(/\.ts$/,"")}`,Y=Q.get(X)??new Set;return Y.add(Z),Q.set(X,Y),Z}function oA($,Q){let Z=G0($.schema,Q);if($.nullable)Z+=".nullable()";if($.optional)Z+=".optional()";return Z=LW(Z,$.description??$.schema.description),` ${$.name}: ${Z},`}function aA($){let Q=new Map,Z=_W($.schemaName),X=O0($.schemaName),Y=l1($.schemaName),W=$.properties.length>0?`z.object({
258
+ ${$.properties.map((_)=>oA(_,Q)).join(`
258
259
  `)}
259
- })`:null,W=$.schema?.kind==="object"?$.schema.additionalProperties:void 0,Y=J?W?`${J}.catchall(${n1(W,Q)})`:J:n1($.schema??{kind:"object",properties:{},required:[]},Q),G=["import { createZodDto } from 'nestjs-zod';","import { z } from 'zod';"];for(let[z,_]of[...Q.entries()].sort((V,H)=>V[0].localeCompare(H[0])))G.push(`import { ${[..._].sort().join(", ")} } from '${z}';`);return[G.join(`
260
- `),"",`export const ${Z} = ${Y};`,"",`export class ${X} extends createZodDto(${Z}) {}`,`export type ${U} = z.infer<typeof ${Z}>;`,""].join(`
261
- `)}function c6($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function j1($,Q){let Z=[];if($.optional)Q.validatorImports.add("IsOptional"),Z.push("@IsOptional()");else if($.nullable)Q.validatorImports.add("ValidateIf"),Z.push("@ValidateIf((_, value) => value !== null)");return Z}function rH($,Q,Z,X){if($==="uuid")X.validatorImports.add("IsUUID"),Z.push("@IsUUID()");else if($==="email")X.validatorImports.add("IsEmail"),Z.push("@IsEmail()");else if($==="uri"||$==="url")X.validatorImports.add("IsUrl"),Z.push("@IsUrl()");else if($==="date"||$==="date-time")X.validatorImports.add("IsDateString"),Z.push("@IsDateString()");if(typeof Q.minLength==="number")X.validatorImports.add("MinLength"),Z.push(`@MinLength(${Q.minLength})`);if(typeof Q.maxLength==="number")X.validatorImports.add("MaxLength"),Z.push(`@MaxLength(${Q.maxLength})`);if(typeof Q.pattern==="string")X.validatorImports.add("Matches"),Z.push(`@Matches(new RegExp(${c6(Q.pattern)}))`)}function i9($,Q,Z,X={}){let U=X.each?", { each: true }":"";if(typeof $.minimum==="number")Z.validatorImports.add("Min"),Q.push(`@Min(${$.minimum}${U})`);if(typeof $.maximum==="number")Z.validatorImports.add("Max"),Q.push(`@Max(${$.maximum}${U})`);let J=$.exclusiveMinimum,W=typeof $.minimum==="number"?$.minimum:void 0,Y=J===!0&&(W??0)>=0,G=typeof J==="number"&&J>=0;if(Y||G)Z.validatorImports.add("IsPositive"),Q.push(`@IsPositive(${X.each?"{ each: true }":""})`)}function oH($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString()");let X=typeof $.format==="string"?$.format:void 0;rH(X,$,Q,Z)}function aH($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsNumber"),Z.push("@IsNumber()"),i9(Q,Z,X)}function sH($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsInt"),Z.push("@IsInt()"),i9(Q,Z,X)}function tH($,Q,Z){if($)Z.transformerImports.add("Transform"),Q.push("@Transform(({ value }) => value === 'true' ? true : value === 'false' ? false : value)");Z.validatorImports.add("IsBoolean"),Q.push("@IsBoolean()")}function eH($,Q,Z,X){let U=j1($,X),J=$.source==="path"||$.source==="query";if(Q==="string")return oH(Z,U,X),U;if(Q==="number")return aH(J,Z,U,X),U;if(Q==="integer")return sH(J,Z,U,X),U;return tH(J,U,X),U}function $O($,Q,Z,X){let U=[];if(Q.format)U.push(`format: '${Q.format}'`);if(Q.minLength!==void 0)U.push(`minLength: ${Q.minLength}`);if(Q.maxLength!==void 0)U.push(`maxLength: ${Q.maxLength}`);if(Q.minimum!==void 0)U.push(`minimum: ${Q.minimum}`);if(Q.maximum!==void 0)U.push(`maximum: ${Q.maximum}`);if(Q.pattern)U.push(`pattern: ${c6(Q.pattern)}`);if($.nullable)U.push("nullable: true");let J=eH($,Q.scalar,{format:Q.format,minLength:Q.minLength,maxLength:Q.maxLength,minimum:Q.minimum,maximum:Q.maximum,exclusiveMinimum:Q.exclusiveMinimum,exclusiveMaximum:Q.exclusiveMaximum,pattern:Q.pattern},Z);return X(Z,$,U,J,$.optional),{typeName:Q.scalar==="integer"?"number":Q.scalar,decorators:J}}function QO($,Q,Z){if($.format==="uuid"){Z.validatorImports.add("IsUUID"),Q.push("@IsUUID('4', { each: true })");return}if($.format==="email"){Z.validatorImports.add("IsEmail"),Q.push("@IsEmail(undefined, { each: true })");return}if($.format==="uri"||$.format==="url"){Z.validatorImports.add("IsUrl"),Q.push("@IsUrl(undefined, { each: true })");return}if($.format==="date"||$.format==="date-time")Z.validatorImports.add("IsDateString"),Q.push("@IsDateString({}, { each: true })")}function ZO($,Q,Z){if($.minLength!==void 0)Z.validatorImports.add("MinLength"),Q.push(`@MinLength(${$.minLength}, { each: true })`);if($.maxLength!==void 0)Z.validatorImports.add("MaxLength"),Q.push(`@MaxLength(${$.maxLength}, { each: true })`);if($.pattern)Z.validatorImports.add("Matches"),Q.push(`@Matches(new RegExp(${c6($.pattern)}), { each: true })`)}function XO($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString({ each: true })"),QO($,Q,Z),ZO($,Q,Z)}function UO($,Q,Z){if($.scalar==="integer"){Z.validatorImports.add("IsInt"),Q.push("@IsInt({ each: true })");return}if($.scalar==="number"){Z.validatorImports.add("IsNumber"),Q.push("@IsNumber({}, { each: true })");return}if($.scalar==="boolean")Z.validatorImports.add("IsBoolean"),Q.push("@IsBoolean({ each: true })")}function JO($,Q,Z){if($.scalar==="string")XO($,Q,Z);else UO($,Q,Z);if($.scalar==="number"||$.scalar==="integer")i9({minimum:$.minimum,maximum:$.maximum,exclusiveMinimum:$.exclusiveMinimum,exclusiveMaximum:$.exclusiveMaximum},Q,Z,{each:!0})}function nX($,Q,Z,X,U){if(Z.kind==="scalar")return Z.scalar==="integer"?"number":Z.scalar;if(Z.kind==="enum")return U.addEnumImport(X,Z.enumName),Z.enumName;if(Z.kind==="ref")return U.addDtoImport(X,Z.refName);if(Z.kind==="unknown")return"unknown";if(Z.kind==="object"){if(Object.keys(Z.properties).length===0)return"unknown";let W=`${$}${cX(Q)}ValueDto`;return U.emitHelperDto(W,Z,X),W}return`${nX($,Q,Z.items,X,U)}[]`}function O5($,Q){let Z=[];if(typeof $.exclusiveMinimum==="number")Z.push(`${Q} > ${$.exclusiveMinimum}`);else if($.minimum!==void 0)Z.push(`${Q} ${$.exclusiveMinimum===!0?">":">="} ${$.minimum}`);else if($.exclusiveMinimum===!0)Z.push(`${Q} > 0`);if(typeof $.exclusiveMaximum==="number")Z.push(`${Q} < ${$.exclusiveMaximum}`);else if($.maximum!==void 0)Z.push(`${Q} ${$.exclusiveMaximum===!0?"<":"<="} ${$.maximum}`);return Z}function WO($,Q){if($.format==="uuid")return[`new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'i').test(${Q})`];if($.format==="email")return[`new RegExp('^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$').test(${Q})`];if($.format==="uri"||$.format==="url")return[`(() => { try { new URL(String(${Q})); return true; } catch { return false; } })()`];if($.format==="date")return[`new RegExp('^\\d{4}-\\d{2}-\\d{2}$').test(${Q})`];if($.format==="date-time")return[`new RegExp('^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$').test(${Q})`];return[]}function YO($,Q){if($.scalar==="boolean")return`typeof ${Q} === 'boolean'`;if($.scalar==="integer")return[`typeof ${Q} === 'number'`,`Number.isInteger(${Q})`,...O5($,Q)].join(" && ");if($.scalar==="number")return[`typeof ${Q} === 'number'`,...O5($,Q)].join(" && ");let Z=[`typeof ${Q} === 'string'`];if(Z.push(...WO($,Q)),$.minLength!==void 0)Z.push(`${Q}.length >= ${$.minLength}`);if($.maxLength!==void 0)Z.push(`${Q}.length <= ${$.maxLength}`);if($.pattern)Z.push(`new RegExp(${c6($.pattern)}).test(${Q})`);if($.format==="date"||$.format==="date-time")Z.push(`!Number.isNaN(Date.parse(${Q}))`);return Z.join(" && ")}function GO($,Q,Z,X,U,J){if(Object.keys(Z.properties).length===0)return null;let W=`${$}${cX(Q)}ValueDto`;return U.emitHelperDto(W,Z,X),X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${J}) && validateSync(plainToInstance(${W}, ${J})).length === 0`}function iX($,Q,Z,X,U,J="value"){if(Z.kind==="scalar")return YO(Z,J);if(Z.kind==="enum")return U.addEnumImport(X,Z.enumName),`(${C0(Z.enumName)} as readonly unknown[]).includes(${J})`;if(Z.kind==="ref"){let Y=U.addDtoImport(X,Z.refName);return X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${J}) && validateSync(plainToInstance(${Y}, ${J})).length === 0`}if(Z.kind==="unknown")return null;if(Z.kind==="object")return GO($,Q,Z,X,U,J);let W=iX($,Q,Z.items,X,U,"entry");return W?`Array.isArray(${J}) && ${J}.every((entry) => ${W})`:`Array.isArray(${J})`}function zO(){return["function isRecordValue(value: unknown): value is Record<string, unknown> {"," return typeof value === 'object' && value !== null && !Array.isArray(value);","}","","function ValidateRecordValues("," validateValue: (value: unknown) => boolean","): PropertyDecorator {"," return (target: object, propertyKey: string | symbol) => {"," registerDecorator({"," name: 'ValidateRecordValues',"," target: target.constructor,"," propertyName: String(propertyKey),"," validator: {"," validate(value: unknown): boolean {"," return isRecordValue(value) && Object.values(value).every(validateValue);"," },"," defaultMessage(): string {"," return 'record values must match the OpenAPI additionalProperties schema';"," },"," },"," });"," };","}"].join(`
262
- `)}function VO(){return{enumImports:new Map,enumTypeImports:new Map,dtoImports:new Map,validatorImports:new Set,transformerImports:new Set,usesApiPropertyOptional:!1,usesRecordValueValidator:!1,helperClassBlocks:[],seenHelpers:new Set}}function HO($){return $.map((Q)=>` ${Q}`)}function r9($,Q){let Z=`../enums/${m6(Q).replace(/\.ts$/,"")}`,X=$.enumImports.get(Z)??new Set;X.add(l6(Q)),X.add(C0(Q)),$.enumImports.set(Z,X);let U=$.enumTypeImports.get(Z)??new Set;U.add(Q),$.enumTypeImports.set(Z,U)}function o9($,Q){let Z=$0(Q);return $.dtoImports.set(Z,`./${m9(Q).replace(/\.ts$/,"")}`),Z}function U1($,Q,Z,X,U=!1){let J=U?"ApiPropertyOptional":"ApiProperty";if(U)$.usesApiPropertyOptional=!0;if(Z.length===0){X.push(`@${J}()`);return}X.push(`@${J}({`);for(let W of Z)X.push(` ${W},`);X.push("})")}function OO($,Q,Z){r9(Z,Q.enumName);let X=j1($,Z),U=[`enum: ${C0(Q.enumName)}`,`enumName: '${Q.enumName}'`];if($.nullable)U.push("nullable: true");return U1(Z,$,U,X,$.optional),Z.validatorImports.add("IsEnum"),X.push(`@IsEnum(${l6(Q.enumName)})`),{typeName:Q.enumName,decorators:X}}function KO($,Q,Z){let X=o9(Z,Q.refName),U=j1($,Z),J=[`type: () => ${X}`];if($.nullable)J.push("nullable: true");return U1(Z,$,J,U,$.optional),Z.validatorImports.add("ValidateNested"),U.push("@ValidateNested()"),Z.transformerImports.add("Type"),U.push(`@Type(() => ${X})`),{typeName:X,decorators:U}}function qO($,Q,Z,X){if(Object.keys(Z.properties).length===0&&Z.additionalProperties){let Y=nX($,Q.name,Z.additionalProperties,X,S9),G=j1(Q,X);X.validatorImports.add("IsObject"),G.push("@IsObject()");let z=iX($,Q.name,Z.additionalProperties,X,S9);if(z)X.validatorImports.add("registerDecorator"),X.usesRecordValueValidator=!0,G.push(`@ValidateRecordValues((value) => ${z})`);let _=["type: Object","additionalProperties: true"];if(Q.nullable)_.push("nullable: true");return U1(X,Q,_,G,Q.optional),{typeName:`Record<string, ${Y}>`,decorators:G}}if(Object.keys(Z.properties).length===0){let Y=j1(Q,X);X.validatorImports.add("IsObject"),Y.push("@IsObject()");let G=["type: Object"];if(Q.nullable)G.push("nullable: true");return U1(X,Q,G,Y,Q.optional),{typeName:"Record<string, unknown>",decorators:Y}}let U=`${$}${rX(Q.name)}Dto`;a9(U,Z,X);let J=j1(Q,X),W=[`type: () => ${U}`];if(Q.nullable)W.push("nullable: true");return U1(X,Q,W,J,Q.optional),X.validatorImports.add("ValidateNested"),J.push("@ValidateNested()"),X.transformerImports.add("Type"),J.push(`@Type(() => ${U})`),{typeName:U,decorators:J}}function BO($,Q,Z,X){if(Z.kind==="scalar")return $O(Q,Z,X,U1);if(Z.kind==="enum")return OO(Q,Z,X);if(Z.kind==="ref")return KO(Q,Z,X);if(Z.kind==="object")return qO($,Q,Z,X);if(Z.kind==="unknown"){let U=j1(Q,X),J=["type: Object"];if(Q.nullable)J.push("nullable: true");return U1(X,Q,J,U,Q.optional),{typeName:"unknown",decorators:U}}return LO($,Q,Z,X)}function LO($,Q,Z,X){let U=j1(Q,X);if(X.validatorImports.add("IsArray"),U.push("@IsArray()"),Z.minItems!==void 0)X.validatorImports.add("ArrayMinSize"),U.push(`@ArrayMinSize(${Z.minItems})`);if(Z.maxItems!==void 0)X.validatorImports.add("ArrayMaxSize"),U.push(`@ArrayMaxSize(${Z.maxItems})`);let J=["isArray: true"];if(Z.minItems!==void 0)J.push(`minItems: ${Z.minItems}`);if(Z.maxItems!==void 0)J.push(`maxItems: ${Z.maxItems}`);if(Q.nullable)J.push("nullable: true");let W="unknown";if(Z.items.kind==="enum")r9(X,Z.items.enumName),W=Z.items.enumName,X.validatorImports.add("IsEnum"),U.push(`@IsEnum(${l6(Z.items.enumName)}, { each: true })`),J.push(`enum: ${C0(Z.items.enumName)}`),J.push(`enumName: '${Z.items.enumName}'`);else if(Z.items.kind==="ref")W=o9(X,Z.items.refName),X.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),U.push(`@Type(() => ${W})`),J.push(`type: () => ${W}`);else if(Z.items.kind==="scalar")W=Z.items.scalar==="integer"?"number":Z.items.scalar,JO(Z.items,U,X),J.push(`type: '${W}'`);else if(Z.items.kind==="object"){if(Object.keys(Z.items.properties).length===0)return W="Record<string, unknown>",X.validatorImports.add("IsObject"),U.push("@IsObject({ each: true })"),J.push("type: Object"),U1(X,Q,J,U,Q.optional),{typeName:`${W}[]`,decorators:U};let Y=`${$}${rX(Q.name)}ItemDto`;a9(Y,Z.items,X),W=Y,X.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),U.push(`@Type(() => ${Y})`),J.push(`type: () => ${Y}`)}else throw Error(`Unsupported array item kind '${Z.items.kind}' for property '${Q.name}'`);return U1(X,Q,J,U,Q.optional),{typeName:`${W}[]`,decorators:U}}function AO($,Q,Z){let{decorators:X,typeName:U}=BO($,Q,Q.schema,Z),J=`${Q.name}${Q.optional?"?":"!"}`,W=!Q.optional&&Q.nullable?" | null":"";return Z.transformerImports.add("Expose"),[...X,"@Expose()",`${J}: ${U}${W};`]}function oX($,Q,Z,X,U){let J=[];if(Q)J.push(`/** ${Q.replace(/\*\//g,"*\\/")} */`);J.push(`export class ${$} {`);let W=Object.entries(Z.properties);for(let[Y,G]of W){let z=U?.get(Y),_={name:Y,schema:G,optional:z?.optional??!Z.required.includes(Y),nullable:z?.nullable??!1,description:z?.description,source:z?.source},V=AO($,_,X);J.push(...HO(V),"")}if(W.length===0)J.push(" // empty schema");if(J[J.length-1]==="")J.pop();return J.push("}"),J.join(`
263
- `)}function a9($,Q,Z){if(Z.seenHelpers.has($))return;Z.seenHelpers.add($),Z.helperClassBlocks.push(oX($,Q.description,Q,Z))}function MO($){let Q=VO(),Z=new Map($.properties.map((H)=>[H.name,H])),X={kind:"object",properties:Object.fromEntries($.properties.map((H)=>[H.name,H.schema])),required:$.properties.filter((H)=>!H.optional).map((H)=>H.name),description:$.description},U=oX($.dtoName,$.description,X,Q,Z),J=[],W=["ApiProperty"];if(Q.usesApiPropertyOptional)W.push("ApiPropertyOptional");J.push(`import { ${W.join(", ")} } from '@nestjs/swagger';`);let Y=[...Q.validatorImports].sort();if(Y.length>0)J.push(`import { ${Y.join(", ")} } from 'class-validator';`);let G=[...Q.transformerImports].sort();if(G.length>0)J.push(`import { ${G.join(", ")} } from 'class-transformer';`);for(let[H,O]of[...Q.enumImports.entries()].sort((K,q)=>K[0].localeCompare(q[0])))J.push(`import { ${[...O].sort().join(", ")} } from '${H}';`);for(let[H,O]of[...Q.enumTypeImports.entries()].sort((K,q)=>K[0].localeCompare(q[0])))J.push(`import type { ${[...O].sort().join(", ")} } from '${H}';`);let z=$.dtoName,_=[...Q.dtoImports.entries()].filter(([H])=>H!==z).sort(([H,O],[K,q])=>O.localeCompare(q)||H.localeCompare(K));for(let[H,O]of _)J.push(`import { ${H} } from '${O}';`);let V=[...Q.usesRecordValueValidator?[zO()]:[],...Q.helperClassBlocks,U].join(`
260
+ })`:null,U=$.schema?.kind==="object"?$.schema.additionalProperties:void 0,J=W?U?`${W}.catchall(${G0(U,Q)})`:W:G0($.schema??{kind:"object",properties:{},required:[]},Q),G=["import { createZodDto } from 'nestjs-zod';","import { z } from 'zod';"];for(let[_,H]of[...Q.entries()].sort((V,q)=>V[0].localeCompare(q[0])))G.push(`import { ${[...H].sort().join(", ")} } from '${_}';`);return[G.join(`
261
+ `),"",`export const ${Z} = ${J};`,"",`export class ${X} extends createZodDto(${Z}) {}`,`export type ${Y} = z.infer<typeof ${Z}>;`,""].join(`
262
+ `)}function F9($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function u1($,Q){let Z=[];if($.optional)Q.validatorImports.add("IsOptional"),Z.push("@IsOptional()");else if($.nullable)Q.validatorImports.add("ValidateIf"),Z.push("@ValidateIf((_, value) => value !== null)");return Z}function tA($,Q,Z,X){if($==="uuid")X.validatorImports.add("IsUUID"),Z.push("@IsUUID()");else if($==="email")X.validatorImports.add("IsEmail"),Z.push("@IsEmail()");else if($==="uri"||$==="url")X.validatorImports.add("IsUrl"),Z.push("@IsUrl()");else if($==="date"||$==="date-time")X.validatorImports.add("IsDateString"),Z.push("@IsDateString()");if(typeof Q.minLength==="number")X.validatorImports.add("MinLength"),Z.push(`@MinLength(${Q.minLength})`);if(typeof Q.maxLength==="number")X.validatorImports.add("MaxLength"),Z.push(`@MaxLength(${Q.maxLength})`);if(typeof Q.pattern==="string")X.validatorImports.add("Matches"),Z.push(`@Matches(new RegExp(${F9(Q.pattern)}))`)}function dQ($,Q,Z,X={}){let Y=X.each?", { each: true }":"";if(typeof $.minimum==="number")Z.validatorImports.add("Min"),Q.push(`@Min(${$.minimum}${Y})`);if(typeof $.maximum==="number")Z.validatorImports.add("Max"),Q.push(`@Max(${$.maximum}${Y})`);let W=$.exclusiveMinimum,U=typeof $.minimum==="number"?$.minimum:void 0,J=W===!0&&(U??0)>=0,G=typeof W==="number"&&W>=0;if(J||G)Z.validatorImports.add("IsPositive"),Q.push(`@IsPositive(${X.each?"{ each: true }":""})`)}function eA($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString()");let X=typeof $.format==="string"?$.format:void 0;tA(X,$,Q,Z)}function $L($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsNumber"),Z.push("@IsNumber()"),dQ(Q,Z,X)}function QL($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsInt"),Z.push("@IsInt()"),dQ(Q,Z,X)}function ZL($,Q,Z){if($)Z.transformerImports.add("Transform"),Q.push("@Transform(({ value }) => value === 'true' ? true : value === 'false' ? false : value)");Z.validatorImports.add("IsBoolean"),Q.push("@IsBoolean()")}function XL($,Q,Z,X){let Y=u1($,X),W=$.source==="path"||$.source==="query";if(Q==="string")return eA(Z,Y,X),Y;if(Q==="number")return $L(W,Z,Y,X),Y;if(Q==="integer")return QL(W,Z,Y,X),Y;return ZL(W,Y,X),Y}function YL($,Q,Z,X){let Y=[];if(Q.format)Y.push(`format: '${Q.format}'`);if(Q.minLength!==void 0)Y.push(`minLength: ${Q.minLength}`);if(Q.maxLength!==void 0)Y.push(`maxLength: ${Q.maxLength}`);if(Q.minimum!==void 0)Y.push(`minimum: ${Q.minimum}`);if(Q.maximum!==void 0)Y.push(`maximum: ${Q.maximum}`);if(Q.pattern)Y.push(`pattern: ${F9(Q.pattern)}`);if($.nullable)Y.push("nullable: true");let W=XL($,Q.scalar,{format:Q.format,minLength:Q.minLength,maxLength:Q.maxLength,minimum:Q.minimum,maximum:Q.maximum,exclusiveMinimum:Q.exclusiveMinimum,exclusiveMaximum:Q.exclusiveMaximum,pattern:Q.pattern},Z);return X(Z,$,Y,W,$.optional),{typeName:Q.scalar==="integer"?"number":Q.scalar,decorators:W}}function WL($,Q,Z){if($.format==="uuid"){Z.validatorImports.add("IsUUID"),Q.push("@IsUUID('4', { each: true })");return}if($.format==="email"){Z.validatorImports.add("IsEmail"),Q.push("@IsEmail(undefined, { each: true })");return}if($.format==="uri"||$.format==="url"){Z.validatorImports.add("IsUrl"),Q.push("@IsUrl(undefined, { each: true })");return}if($.format==="date"||$.format==="date-time")Z.validatorImports.add("IsDateString"),Q.push("@IsDateString({}, { each: true })")}function UL($,Q,Z){if($.minLength!==void 0)Z.validatorImports.add("MinLength"),Q.push(`@MinLength(${$.minLength}, { each: true })`);if($.maxLength!==void 0)Z.validatorImports.add("MaxLength"),Q.push(`@MaxLength(${$.maxLength}, { each: true })`);if($.pattern)Z.validatorImports.add("Matches"),Q.push(`@Matches(new RegExp(${F9($.pattern)}), { each: true })`)}function JL($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString({ each: true })"),WL($,Q,Z),UL($,Q,Z)}function GL($,Q,Z){if($.scalar==="integer"){Z.validatorImports.add("IsInt"),Q.push("@IsInt({ each: true })");return}if($.scalar==="number"){Z.validatorImports.add("IsNumber"),Q.push("@IsNumber({}, { each: true })");return}if($.scalar==="boolean")Z.validatorImports.add("IsBoolean"),Q.push("@IsBoolean({ each: true })")}function _L($,Q,Z){if($.scalar==="string")JL($,Q,Z);else GL($,Q,Z);if($.scalar==="number"||$.scalar==="integer")dQ({minimum:$.minimum,maximum:$.maximum,exclusiveMinimum:$.exclusiveMinimum,exclusiveMaximum:$.exclusiveMaximum},Q,Z,{each:!0})}function zW($,Q,Z,X,Y){if(Z.kind==="scalar")return Z.scalar==="integer"?"number":Z.scalar;if(Z.kind==="enum")return Y.addEnumImport(X,Z.enumName),Z.enumName;if(Z.kind==="ref")return Y.addDtoImport(X,Z.refName);if(Z.kind==="unknown")return"unknown";if(Z.kind==="object"){if(Object.keys(Z.properties).length===0)return"unknown";let U=`${$}${OW(Q)}ValueDto`;return Y.emitHelperDto(U,Z,X),U}return`${zW($,Q,Z.items,X,Y)}[]`}function EX($,Q){let Z=[];if(typeof $.exclusiveMinimum==="number")Z.push(`${Q} > ${$.exclusiveMinimum}`);else if($.minimum!==void 0)Z.push(`${Q} ${$.exclusiveMinimum===!0?">":">="} ${$.minimum}`);else if($.exclusiveMinimum===!0)Z.push(`${Q} > 0`);if(typeof $.exclusiveMaximum==="number")Z.push(`${Q} < ${$.exclusiveMaximum}`);else if($.maximum!==void 0)Z.push(`${Q} ${$.exclusiveMaximum===!0?"<":"<="} ${$.maximum}`);return Z}function HL($,Q){if($.format==="uuid")return[`new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'i').test(${Q})`];if($.format==="email")return[`new RegExp('^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$').test(${Q})`];if($.format==="uri"||$.format==="url")return[`(() => { try { new URL(String(${Q})); return true; } catch { return false; } })()`];if($.format==="date")return[`new RegExp('^\\d{4}-\\d{2}-\\d{2}$').test(${Q})`];if($.format==="date-time")return[`new RegExp('^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$').test(${Q})`];return[]}function VL($,Q){if($.scalar==="boolean")return`typeof ${Q} === 'boolean'`;if($.scalar==="integer")return[`typeof ${Q} === 'number'`,`Number.isInteger(${Q})`,...EX($,Q)].join(" && ");if($.scalar==="number")return[`typeof ${Q} === 'number'`,...EX($,Q)].join(" && ");let Z=[`typeof ${Q} === 'string'`];if(Z.push(...HL($,Q)),$.minLength!==void 0)Z.push(`${Q}.length >= ${$.minLength}`);if($.maxLength!==void 0)Z.push(`${Q}.length <= ${$.maxLength}`);if($.pattern)Z.push(`new RegExp(${F9($.pattern)}).test(${Q})`);if($.format==="date"||$.format==="date-time")Z.push(`!Number.isNaN(Date.parse(${Q}))`);return Z.join(" && ")}function qL($,Q,Z,X,Y,W){if(Object.keys(Z.properties).length===0)return null;let U=`${$}${OW(Q)}ValueDto`;return Y.emitHelperDto(U,Z,X),X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${W}) && validateSync(plainToInstance(${U}, ${W})).length === 0`}function jW($,Q,Z,X,Y,W="value"){if(Z.kind==="scalar")return VL(Z,W);if(Z.kind==="enum")return Y.addEnumImport(X,Z.enumName),`(${p0(Z.enumName)} as readonly unknown[]).includes(${W})`;if(Z.kind==="ref"){let J=Y.addDtoImport(X,Z.refName);return X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${W}) && validateSync(plainToInstance(${J}, ${W})).length === 0`}if(Z.kind==="unknown")return null;if(Z.kind==="object")return qL($,Q,Z,X,Y,W);let U=jW($,Q,Z.items,X,Y,"entry");return U?`Array.isArray(${W}) && ${W}.every((entry) => ${U})`:`Array.isArray(${W})`}function KL(){return["function isRecordValue(value: unknown): value is Record<string, unknown> {"," return typeof value === 'object' && value !== null && !Array.isArray(value);","}","","function ValidateRecordValues("," validateValue: (value: unknown) => boolean","): PropertyDecorator {"," return (target: object, propertyKey: string | symbol) => {"," registerDecorator({"," name: 'ValidateRecordValues',"," target: target.constructor,"," propertyName: String(propertyKey),"," validator: {"," validate(value: unknown): boolean {"," return isRecordValue(value) && Object.values(value).every(validateValue);"," },"," defaultMessage(): string {"," return 'record values must match the API additionalProperties schema';"," },"," },"," });"," };","}"].join(`
263
+ `)}function AL(){return{enumImports:new Map,enumTypeImports:new Map,dtoImports:new Map,validatorImports:new Set,transformerImports:new Set,usesApiPropertyOptional:!1,usesRecordValueValidator:!1,helperClassBlocks:[],seenHelpers:new Set}}function LL($){return $.map((Q)=>` ${Q}`)}function mQ($,Q){let Z=`../enums/${T9(Q).replace(/\.ts$/,"")}`,X=$.enumImports.get(Z)??new Set;X.add(E9(Q)),X.add(p0(Q)),$.enumImports.set(Z,X);let Y=$.enumTypeImports.get(Z)??new Set;Y.add(Q),$.enumTypeImports.set(Z,Y)}function lQ($,Q){let Z=O0(Q);return $.dtoImports.set(Z,`./${xQ(Q).replace(/\.ts$/,"")}`),Z}function L1($,Q,Z,X,Y=!1){let W=Y?"ApiPropertyOptional":"ApiProperty";if(Y)$.usesApiPropertyOptional=!0;if(Z.length===0){X.push(`@${W}()`);return}X.push(`@${W}({`);for(let U of Z)X.push(` ${U},`);X.push("})")}function OL($,Q,Z){mQ(Z,Q.enumName);let X=u1($,Z),Y=[`enum: ${p0(Q.enumName)}`,`enumName: '${Q.enumName}'`];if($.nullable)Y.push("nullable: true");return L1(Z,$,Y,X,$.optional),Z.validatorImports.add("IsEnum"),X.push(`@IsEnum(${E9(Q.enumName)})`),{typeName:Q.enumName,decorators:X}}function zL($,Q,Z){let X=lQ(Z,Q.refName),Y=u1($,Z),W=[`type: () => ${X}`];if($.nullable)W.push("nullable: true");return L1(Z,$,W,Y,$.optional),Z.validatorImports.add("ValidateNested"),Y.push("@ValidateNested()"),Z.transformerImports.add("Type"),Y.push(`@Type(() => ${X})`),{typeName:X,decorators:Y}}function jL($,Q,Z,X){if(Object.keys(Z.properties).length===0&&Z.additionalProperties){let J=zW($,Q.name,Z.additionalProperties,X,OQ),G=u1(Q,X);X.validatorImports.add("IsObject"),G.push("@IsObject()");let _=jW($,Q.name,Z.additionalProperties,X,OQ);if(_)X.validatorImports.add("registerDecorator"),X.usesRecordValueValidator=!0,G.push(`@ValidateRecordValues((value) => ${_})`);let H=["type: Object","additionalProperties: true"];if(Q.nullable)H.push("nullable: true");return L1(X,Q,H,G,Q.optional),{typeName:`Record<string, ${J}>`,decorators:G}}if(Object.keys(Z.properties).length===0){let J=u1(Q,X);X.validatorImports.add("IsObject"),J.push("@IsObject()");let G=["type: Object"];if(Q.nullable)G.push("nullable: true");return L1(X,Q,G,J,Q.optional),{typeName:"Record<string, unknown>",decorators:J}}let Y=`${$}${TW(Q.name)}Dto`;pQ(Y,Z,X);let W=u1(Q,X),U=[`type: () => ${Y}`];if(Q.nullable)U.push("nullable: true");return L1(X,Q,U,W,Q.optional),X.validatorImports.add("ValidateNested"),W.push("@ValidateNested()"),X.transformerImports.add("Type"),W.push(`@Type(() => ${Y})`),{typeName:Y,decorators:W}}function TL($,Q,Z,X){if(Z.kind==="scalar")return YL(Q,Z,X,L1);if(Z.kind==="enum")return OL(Q,Z,X);if(Z.kind==="ref")return zL(Q,Z,X);if(Z.kind==="object")return jL($,Q,Z,X);if(Z.kind==="unknown"){let Y=u1(Q,X),W=["type: Object"];if(Q.nullable)W.push("nullable: true");return L1(X,Q,W,Y,Q.optional),{typeName:"unknown",decorators:Y}}return EL($,Q,Z,X)}function EL($,Q,Z,X){let Y=u1(Q,X);if(X.validatorImports.add("IsArray"),Y.push("@IsArray()"),Z.minItems!==void 0)X.validatorImports.add("ArrayMinSize"),Y.push(`@ArrayMinSize(${Z.minItems})`);if(Z.maxItems!==void 0)X.validatorImports.add("ArrayMaxSize"),Y.push(`@ArrayMaxSize(${Z.maxItems})`);let W=["isArray: true"];if(Z.minItems!==void 0)W.push(`minItems: ${Z.minItems}`);if(Z.maxItems!==void 0)W.push(`maxItems: ${Z.maxItems}`);if(Q.nullable)W.push("nullable: true");let U="unknown";if(Z.items.kind==="enum")mQ(X,Z.items.enumName),U=Z.items.enumName,X.validatorImports.add("IsEnum"),Y.push(`@IsEnum(${E9(Z.items.enumName)}, { each: true })`),W.push(`enum: ${p0(Z.items.enumName)}`),W.push(`enumName: '${Z.items.enumName}'`);else if(Z.items.kind==="ref")U=lQ(X,Z.items.refName),X.validatorImports.add("ValidateNested"),Y.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),Y.push(`@Type(() => ${U})`),W.push(`type: () => ${U}`);else if(Z.items.kind==="scalar")U=Z.items.scalar==="integer"?"number":Z.items.scalar,_L(Z.items,Y,X),W.push(`type: '${U}'`);else if(Z.items.kind==="object"){if(Object.keys(Z.items.properties).length===0)return U="Record<string, unknown>",X.validatorImports.add("IsObject"),Y.push("@IsObject({ each: true })"),W.push("type: Object"),L1(X,Q,W,Y,Q.optional),{typeName:`${U}[]`,decorators:Y};let J=`${$}${TW(Q.name)}ItemDto`;pQ(J,Z.items,X),U=J,X.validatorImports.add("ValidateNested"),Y.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),Y.push(`@Type(() => ${J})`),W.push(`type: () => ${J}`)}else throw Error(`Unsupported array item kind '${Z.items.kind}' for property '${Q.name}'`);return L1(X,Q,W,Y,Q.optional),{typeName:`${U}[]`,decorators:Y}}function CL($,Q,Z){let{decorators:X,typeName:Y}=TL($,Q,Q.schema,Z),W=`${Q.name}${Q.optional?"?":"!"}`,U=!Q.optional&&Q.nullable?" | null":"";return Z.transformerImports.add("Expose"),[...X,"@Expose()",`${W}: ${Y}${U};`]}function EW($,Q,Z,X,Y){let W=[];if(Q)W.push(`/** ${Q.replace(/\*\//g,"*\\/")} */`);W.push(`export class ${$} {`);let U=Object.entries(Z.properties);for(let[J,G]of U){let _=Y?.get(J),H={name:J,schema:G,optional:_?.optional??!Z.required.includes(J),nullable:_?.nullable??!1,description:_?.description,source:_?.source},V=CL($,H,X);W.push(...LL(V),"")}if(U.length===0)W.push(" // empty schema");if(W[W.length-1]==="")W.pop();return W.push("}"),W.join(`
264
+ `)}function pQ($,Q,Z){if(Z.seenHelpers.has($))return;Z.seenHelpers.add($),Z.helperClassBlocks.push(EW($,Q.description,Q,Z))}function FL($){let Q=AL(),Z=new Map($.properties.map((q)=>[q.name,q])),X={kind:"object",properties:Object.fromEntries($.properties.map((q)=>[q.name,q.schema])),required:$.properties.filter((q)=>!q.optional).map((q)=>q.name),description:$.description},Y=EW($.dtoName,$.description,X,Q,Z),W=[],U=["ApiProperty"];if(Q.usesApiPropertyOptional)U.push("ApiPropertyOptional");W.push(`import { ${U.join(", ")} } from '@nestjs/swagger';`);let J=[...Q.validatorImports].sort();if(J.length>0)W.push(`import { ${J.join(", ")} } from 'class-validator';`);let G=[...Q.transformerImports].sort();if(G.length>0)W.push(`import { ${G.join(", ")} } from 'class-transformer';`);for(let[q,K]of[...Q.enumImports.entries()].sort((B,L)=>B[0].localeCompare(L[0])))W.push(`import { ${[...K].sort().join(", ")} } from '${q}';`);for(let[q,K]of[...Q.enumTypeImports.entries()].sort((B,L)=>B[0].localeCompare(L[0])))W.push(`import type { ${[...K].sort().join(", ")} } from '${q}';`);let _=$.dtoName,H=[...Q.dtoImports.entries()].filter(([q])=>q!==_).sort(([q,K],[B,L])=>K.localeCompare(L)||q.localeCompare(B));for(let[q,K]of H)W.push(`import { ${q} } from '${K}';`);let V=[...Q.usesRecordValueValidator?[KL()]:[],...Q.helperClassBlocks,Y].join(`
264
265
 
265
- `);return`${J.join(`
266
+ `);return`${W.join(`
266
267
  `)}
267
268
 
268
269
  ${V}
269
- `}function j($){return typeof $==="object"&&$!==null}function EO($){if(typeof $!=="string")throw Error("OpenAPI document missing valid openapi version");if($.startsWith("3.0."))return B6.V3_0;if($.startsWith("3.1."))return B6.V3_1;if($.startsWith("3.2."))return B6.V3_2;throw Error(`Unsupported OpenAPI version '${$}'. Supported families: 3.0.x, 3.1.x, 3.2.x`)}function t9($){let Q=$.match(/^#\/components\/schemas\/(.+)$/);if(!Q?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/schemas/<Name>'`);return Q[1]}function CO($,Q){let Z=`#/components/${Q}/`;if(!$.startsWith(Z))return null;return $.slice(Z.length).replace(/~1/g,"/").replace(/~0/g,"~")}function tX($,Q){if(Array.isArray($.oneOf))throw Error(`Unsupported oneOf at ${Q}`);if(Array.isArray($.anyOf))throw Error(`Unsupported anyOf at ${Q}`);if("not"in $)throw Error(`Unsupported not at ${Q}`);if("discriminator"in $)throw Error(`Unsupported discriminator at ${Q}`)}function n6($){let Q=$.nullable===!0,Z=$.type;if(!Array.isArray(Z))return{nullable:Q,normalizedType:typeof Z==="string"?Z:void 0};let X=Z.filter((J)=>typeof J==="string");if(X.length!==Z.length)throw Error("Unsupported mixed type array in OpenAPI schema");let U=X.filter((J)=>J!=="null");if(U.length!==1||X.length!==2||!X.includes("null"))throw Error(`Unsupported OpenAPI type array: [${X.join(", ")}]`);return{nullable:!0,normalizedType:U[0]}}function SO($,Q,Z,X){let U=t9(Q);if(X.has(U))throw Error(`Unsupported recursive schema cycle detected at ${Z} -> ${U}`);let J=$.schemas[U];if(!j(J))throw Error(`Missing referenced schema '${U}' at ${Z}`);return J}function FO($,Q,Z,X,U,J,W,Y){if(!j(Q))throw Error(`Invalid property '${$}' at ${Z}`);if(U[$])throw Error(`Duplicate property '${$}' while flattening ${X}`);let G=`${K5(X.split("/").pop()??"")}${K5($)}`;U[$]=Y(Q,J,`${Z}.properties.${$}`,G,W)}function IO($,Q,Z,X,U,J,W,Y){let{normalizedType:G}=n6($),z=$.properties;if(G!=="object"&&!j(z))throw Error(`Unsupported allOf part at ${Q}. Expected object-like schema`);if(j(z))for(let[V,H]of Object.entries(z))FO(V,H,Q,Z,X,J,W,Y);let _=$.required;if(Array.isArray(_)){for(let V of _)if(typeof V==="string")U.add(V)}}function RO($,Q,Z,X){for(let[U,J]of Object.entries($.properties)){if(Z[U])throw Error(`Duplicate property '${U}' while flattening ${Q}`);Z[U]=J}for(let U of $.required)X.add(U)}function DO($,Q,Z,X,U,J,W,Y){let G=$,z=null;if(typeof $.$ref==="string"){let _=$.$ref;z=t9(_),G=SO(J,_,Q,W),W.add(z)}try{if(tX(G,Q),Array.isArray(G.allOf)){let _=eX(G,J,Q,W,Y);RO(_,Z,X,U);return}IO(G,Q,Z,X,U,J,W,Y)}finally{if(z)W.delete(z)}}function eX($,Q,Z,X,U){let J=$.allOf;if(!Array.isArray(J))throw Error(`Expected allOf array at ${Z}`);let W={},Y=new Set,G={};for(let[_,V]of Object.entries($))if(_!=="allOf"&&_!=="description"&&_!=="nullable")G[_]=V;let z=[...J,G];for(let _=0;_<z.length;_++){let V=z[_];if(!j(V)||Object.keys(V).length===0)continue;let H=`${Z}.allOf[${_}]`;DO(V,H,Z,W,Y,Q,X,U)}return{kind:o$.Object,properties:W,required:[...Y],description:typeof $.description==="string"?$.description:void 0}}function $U($,Q){let Z=$.enum;if(!Array.isArray(Z))return null;if(Z.length===0)throw Error(`Enum at ${Q} cannot be empty`);let X=[];for(let U of Z){if(typeof U!=="string"&&typeof U!=="number")throw Error(`Enum at ${Q} must contain only string or number values`);X.push(U)}return X}function QU($,Q,Z,X){let U=Z.map((G)=>({key:p9(G),value:G})),J=new Set;for(let G of U){if(J.has(G.key))throw Error(`Enum '${Q}' has duplicate normalized key '${G.key}' (path: ${X})`);J.add(G.key)}let W=$.enumGroups.get(Q);if(!W){let G={name:Q,schemaPath:X,values:Z,members:U};return $.enumGroups.set(Q,G),G}if(!(W.values.length===Z.length&&W.values.every((G,z)=>G===Z[z])))throw Error(`Enum name collision for '${Q}'. Paths: ${W.schemaPath} and ${X}`);return W}function kO($){if($===void 0)return!1;return Object.values(aX).some((Q)=>Q===$)}function q5($){if($===!0||$===!1)return $;if(typeof $==="number")return $;return}function PO($,Q,Z){return{kind:o$.Scalar,scalar:Q,format:typeof $.format==="string"?$.format:void 0,minLength:typeof $.minLength==="number"?$.minLength:void 0,maxLength:typeof $.maxLength==="number"?$.maxLength:void 0,minimum:typeof $.minimum==="number"?$.minimum:void 0,maximum:typeof $.maximum==="number"?$.maximum:void 0,exclusiveMinimum:q5($.exclusiveMinimum),exclusiveMaximum:q5($.exclusiveMaximum),pattern:typeof $.pattern==="string"?$.pattern:void 0,description:Z}}function yO($,Q,Z,X){let U=typeof $.$ref==="string"?$.$ref:"";if(!U)throw Error(`Missing $ref at ${Z}`);let J=t9(U),W=Q.schemas[J];if(!j(W))throw Error(`Missing referenced schema '${J}' at ${Z}`);let Y=typeof $.description==="string"?$.description:void 0;if(X.has(J))return{kind:o$.Ref,ref:U,refName:J,description:Y};X.add(J);let G=e1(W,Q,`#/components/schemas/${J}`,S6(J),X);if(X.delete(J),G.kind!=="object"||Object.keys(G.properties).length===0)return G;return{kind:o$.Ref,ref:U,refName:J,description:Y}}function fO($,Q,Z,X,U,J){let W=$.properties,Y={};if(j(W))for(let[H,O]of Object.entries(W)){if(!j(O))throw Error(`Invalid property '${H}' at ${Z}`);let K=`${X}${S6(H)}`;Y[H]=e1(O,Q,`${Z}.properties.${H}`,K,J)}let G=$.required,z=Array.isArray(G)&&G.every((H)=>typeof H==="string")?G:[],_=$.additionalProperties,V;if(_===!0)V={kind:o$.Unknown};else if(j(_))V=e1(_,Q,`${Z}.additionalProperties`,`${X}Value`,J);else if(_!==void 0&&_!==!1)throw Error(`Unsupported additionalProperties at ${Z}`);return{kind:o$.Object,properties:Y,required:z,additionalProperties:V,description:U}}function vO($,Q,Z,X,U){let J=QU(Q,Z,X,U);return{kind:o$.Enum,enumName:J.name,values:J.values,description:typeof $.description==="string"?$.description:void 0}}function xO($,Q,Z,X,U,J){let W=$.items;if(!j(W))throw Error(`Array schema at ${Z} is missing items`);let Y=`${X}Item`;return{kind:o$.Array,items:e1(W,Q,`${Z}.items`,Y,J),minItems:typeof $.minItems==="number"?$.minItems:void 0,maxItems:typeof $.maxItems==="number"?$.maxItems:void 0,description:U}}function e1($,Q,Z,X,U){if(tX($,Z),typeof $.$ref==="string")return yO($,Q,Z,U);let J=$U($,Z);if(J)return vO($,Q,X,J,Z);if(Array.isArray($.allOf))return eX($,Q,Z,U,e1);let{normalizedType:W}=n6($),Y=typeof $.description==="string"?$.description:void 0;if(W==="array")return xO($,Q,Z,X,Y,U);if(W==="object"||j($.properties))return fO($,Q,Z,X,Y,U);if(kO(W))return PO($,W,Y);throw Error(`Unsupported schema at ${Z}`)}function gO($,Q,Z,X=Y2.Schema,U=s9.Schema){let J=$U(Q,`#/components/schemas/${$}`);if(J)return QU(Z,S6($),J,`#/components/schemas/${$}`),null;let W=e1(Q,Z,`#/components/schemas/${$}`,S6($),new Set);if(W.kind!=="object")return null;if(Object.keys(W.properties).length===0&&W.additionalProperties===void 0)return null;let Y=Object.entries(W.properties).map(([G,z])=>{let _=!W.required.includes(G),V=Q.nullable===!0,O=(j(Q.properties)?Q.properties:void 0)?.[G];if(j(O)){let{nullable:q}=n6(O);V=q||O.nullable===!0}let K=j(O)&&typeof O.description==="string"?O.description:void 0;return{name:G,schema:z,optional:_,nullable:V,source:X,description:K}});return{schemaName:$,dtoName:$0($),schema:W,description:typeof Q.description==="string"?Q.description:void 0,properties:Y,source:U}}function ZU($,Q){if(!Q.has($.schemaName))return Q.add($.schemaName),$;let Z=2;while(Q.has(`${$.schemaName}${Z}`))Z+=1;let X=`${$.schemaName}${Z}`;return Q.add(X),{...$,schemaName:X,dtoName:$0(X)}}function V6($){if(!j($))return null;return j($.schema)?$.schema:null}function i6($){if(!j($))return null;let Q=V6($[S_]);if(Q)return Q;for(let[X,U]of Object.entries($)){if(!x5.test(X))continue;let J=V6(U);if(J)return J}let Z=V6($[F_]);if(Z)return Z;for(let X of Object.keys($).sort((U,J)=>U.localeCompare(J))){let U=V6($[X]);if(U)return U}return null}function hO($,Q,Z){let X=typeof $.operationId==="string"?$.operationId.trim():"";return UU(X.length>0?X:`${Q} ${Z}`)}function JU($,Q,Z,X=new Set){if(!j($))return null;let U=$.$ref;if(typeof U!=="string")return $;if(X.has(U))return null;let J=CO(U,Z);if(!J)return null;let W=Q[Z];if(!j(W))return null;let Y=W[J];if(!j(Y))return null;return X.add(U),JU(Y,Q,Z,X)}function uO($,Q,Z,X){let U=new Map,J=(W)=>{if(!Array.isArray(W))return;for(let Y of W){let G=JU(Y,Z,"parameters");if(!G||G.in!==X||typeof G.name!=="string")continue;U.set(`${X}:${G.name}`,G)}};return J($),J(Q),[...U.values()].sort((W,Y)=>String(W.name).localeCompare(String(Y.name)))}function dO($){if(j($.schema))return $.schema;return i6($.content)}function mO($,Q){if(typeof Q.description!=="string"||typeof $.description==="string")return $;return{...$,description:Q.description}}function B5($,Q,Z,X,U,J,W){let Y=uO($.parameters,Q.parameters,Z,J);if(Y.length===0)return null;let G=[];for(let _ of Y){let V=_.name;if(typeof V!=="string")continue;let H=dO(_);if(!H)continue;let O=mO(H,_),{nullable:K}=n6(O),q=`${U}${W}${UU(V)}`;G.push({name:V,schema:e1(O,X,`paths.${U}.${W}.${V}`,q,new Set),optional:J===Y2.Path?!1:_.required!==!0,nullable:K,description:typeof _.description==="string"?_.description:void 0,source:J})}if(G.length===0)return null;let z=`${U}${W}`;return{schemaName:z,dtoName:$0(z),schema:{kind:o$.Object,properties:Object.fromEntries(G.map((_)=>[_.name,_.schema])),required:G.filter((_)=>!_.optional).map((_)=>_.name)},properties:G,source:s9.Operation}}function lO($,Q,Z,X,U){let J=[];for(let W of sX){let Y=Q[W];if(!j(Y))continue;let G=hO(Y,W,$),z=[B5(Q,Y,Z,X,G,Y2.Path,F9.Params),B5(Q,Y,Z,X,G,Y2.Query,F9.Query)];for(let _ of z)if(_)J.push(ZU(_,U))}return J}function pO($,Q,Z){if(!j($.paths))return[];let X=j($.components)?$.components:{},U=[];for(let[J,W]of Object.entries($.paths).sort(([Y],[G])=>Y.localeCompare(G))){if(!j(W))continue;U.push(...lO(J,W,X,Q,Z))}return U}function WU($,Q){if(!j($))return;for(let[Z,X]of Object.entries($)){if(!j(X)||!("schema"in X))continue;let U=X.schema;if(!j(U)||typeof U.$ref!=="string")throw Error(`Inline ${Q}.${Z}.schema`)}}function nO($,Q){if(!j(Q))return;WU(Q.content,`request schema is not allowed at ${$}.requestBody.content`)}function iO($,Q){if(!j(Q))return;for(let[Z,X]of Object.entries(Q)){if(!j(X))continue;WU(X.content,`response schema is not allowed at ${$}.responses.${Z}.content`)}}function rO($,Q,Z){let X=`paths.${$}.${Q}`;nO(X,Z.requestBody),iO(X,Z.responses)}function oO($,Q){if(!Q.enforceOperationSchemaRefs)return;let Z=$.paths;if(!j(Z))return;for(let[X,U]of Object.entries(Z)){if(!j(U))continue;for(let[J,W]of Object.entries(U)){if(!j(W))continue;if(J==="parameters")continue;rO(X,J,W)}}}function r6($,Q={}){if(!j($))throw Error("OpenAPI document must be an object");let Z=EO($.openapi);return oO($,{enforceOperationSchemaRefs:Q.enforceOperationSchemaRefs??!0}),Z}function aO($){let Q=$.components;if(!j(Q)||!j(Q.schemas))throw Error("OpenAPI document is missing components.schemas");return Q.schemas}function YU($){if(!j($))throw Error("OpenAPI document must be an object");let Q=r6($,{enforceOperationSchemaRefs:!0}),Z=aO($),X={schemas:Z,enumGroups:new Map},U=[],J=new Set;for(let[W,Y]of Object.entries(Z)){if(!j(Y))throw Error(`Invalid schema '${W}' in components.schemas`);let G=gO(W,Y,X);if(G)U.push(ZU(G,J))}return U.push(...pO($,X,J)),{family:Q,dtoModels:U,enumGroups:[...X.enumGroups.values()].sort((W,Y)=>W.name.localeCompare(Y.name))}}function sO($){return`./${d6($).replace(/\.ts$/,"")}`}function tO($){return`../enums/${m6($).replace(/\.ts$/,"")}`}function zU($,Q,Z){let X=$.imports.get(Q)??new Set;X.add(Z),$.imports.set(Q,X)}function eO($,Q){let Z=C1(Q);if(Z===$.currentName)return;zU($,sO(Q),Z)}function $K($,Q){zU($,tO(Q),C1(Q))}function _U($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)?$:JSON.stringify($)}function $Q($){return[...new Set($)].join(" | ")}function VU($,Q,Z,X){let U=a1($,Z,X);if(U==="unknown")return"unknown";return $Q([U,...Q])}function QK($,Q,Z){let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${a1($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let U=" ".repeat(Z),J=" ".repeat(Z+1),W=["{"];for(let[Y,G]of X){let z=$.required.includes(Y)?"":"?";W.push(`${J}${_U(Y)}${z}: ${a1(G,Q,Z+1)};`)}if($.additionalProperties){let Y=X.map(([G,z])=>{let _=$.required.includes(G)?[]:["undefined"];return $Q([a1(z,Q,Z+1),..._])});W.push(`${J}[key: string]: ${VU($.additionalProperties,Y,Q,Z+1)};`)}return W.push(`${U}}`),W.join(`
270
- `)}function a1($,Q,Z){if($.kind==="scalar")return $.scalar==="integer"?"number":$.scalar;if($.kind==="enum")return $K(Q,$.enumName),C1($.enumName);if($.kind==="ref")return eO(Q,$.refName),C1($.refName);if($.kind==="array")return`${a1($.items,Q,Z)}[]`;if($.kind==="unknown")return"unknown";return QK($,Q,Z)}function ZK($,Q){let Z=$.optional?"?":"",X=!$.optional&&$.nullable?" | null":"";return`${$.description?` /** ${$.description.replace(/\*\//g,"*\\/")} */
271
- `:""} ${_U($.name)}${Z}: ${a1($.schema,Q,1)}${X};`}function XK($,Q){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let Z=$.properties.map((X)=>{let U=X.optional?["undefined"]:[],J=!X.optional&&X.nullable?["null"]:[];return $Q([a1(X.schema,Q,1),...J,...U])});return` [key: string]: ${VU($.schema.additionalProperties,Z,Q,1)};`}function UK($){let Q=[...$.imports.entries()].sort(([Z],[X])=>Z.localeCompare(X)).map(([Z,X])=>{return`import type { ${[...X].sort((J,W)=>J.localeCompare(W)).join(", ")} } from '${Z}';`});return Q.length>0?`${Q.join(`
270
+ `}function T($){return typeof $==="object"&&$!==null}function IL($){if(typeof $!=="string")throw Error("API schema document missing valid version");if($.startsWith("3.0."))return c8.V3_0;if($.startsWith("3.1."))return c8.V3_1;if($.startsWith("3.2."))return c8.V3_2;throw Error(`Unsupported API schema version '${$}'. Supported families: 3.0.x, 3.1.x, 3.2.x`)}function nQ($){let Q=$.match(/^#\/components\/schemas\/(.+)$/);if(!Q?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/schemas/<Name>'`);return Q[1]}function RL($,Q){let Z=`#/components/${Q}/`;if(!$.startsWith(Z))return null;return $.slice(Z.length).replace(/~1/g,"/").replace(/~0/g,"~")}function MW($,Q){if(Array.isArray($.oneOf))throw Error(`Unsupported oneOf at ${Q}`);if(Array.isArray($.anyOf))throw Error(`Unsupported anyOf at ${Q}`);if("not"in $)throw Error(`Unsupported not at ${Q}`);if("discriminator"in $)throw Error(`Unsupported discriminator at ${Q}`)}function M9($){let Q=$.nullable===!0,Z=$.type;if(!Array.isArray(Z))return{nullable:Q,normalizedType:typeof Z==="string"?Z:void 0};let X=Z.filter((W)=>typeof W==="string");if(X.length!==Z.length)throw Error("Unsupported mixed type array in API schema");let Y=X.filter((W)=>W!=="null");if(Y.length!==1||X.length!==2||!X.includes("null"))throw Error(`Unsupported API schema type array: [${X.join(", ")}]`);return{nullable:!0,normalizedType:Y[0]}}function DL($,Q,Z,X){let Y=nQ(Q);if(X.has(Y))throw Error(`Unsupported recursive schema cycle detected at ${Z} -> ${Y}`);let W=$.schemas[Y];if(!T(W))throw Error(`Missing referenced schema '${Y}' at ${Z}`);return W}function NL($,Q,Z,X,Y,W,U,J){if(!T(Q))throw Error(`Invalid property '${$}' at ${Z}`);if(Y[$])throw Error(`Duplicate property '${$}' while flattening ${X}`);let G=`${CX(X.split("/").pop()??"")}${CX($)}`;Y[$]=J(Q,W,`${Z}.properties.${$}`,G,U)}function wL($,Q,Z,X,Y,W,U,J){let{normalizedType:G}=M9($),_=$.properties;if(G!=="object"&&!T(_))throw Error(`Unsupported allOf part at ${Q}. Expected object-like schema`);if(T(_))for(let[V,q]of Object.entries(_))NL(V,q,Q,Z,X,W,U,J);let H=$.required;if(Array.isArray(H)){for(let V of H)if(typeof V==="string")Y.add(V)}}function bL($,Q,Z,X){for(let[Y,W]of Object.entries($.properties)){if(Z[Y])throw Error(`Duplicate property '${Y}' while flattening ${Q}`);Z[Y]=W}for(let Y of $.required)X.add(Y)}function kL($,Q,Z,X,Y,W,U,J){let G=$,_=null;if(typeof $.$ref==="string"){let H=$.$ref;_=nQ(H),G=DL(W,H,Q,U),U.add(_)}try{if(MW(G,Q),Array.isArray(G.allOf)){let H=SW(G,W,Q,U,J);bL(H,Z,X,Y);return}wL(G,Q,Z,X,Y,W,U,J)}finally{if(_)U.delete(_)}}function SW($,Q,Z,X,Y){let W=$.allOf;if(!Array.isArray(W))throw Error(`Expected allOf array at ${Z}`);let U={},J=new Set,G={};for(let[H,V]of Object.entries($))if(H!=="allOf"&&H!=="description"&&H!=="nullable")G[H]=V;let _=[...W,G];for(let H=0;H<_.length;H++){let V=_[H];if(!T(V)||Object.keys(V).length===0)continue;let q=`${Z}.allOf[${H}]`;kL(V,q,Z,U,J,Q,X,Y)}return{kind:Z1.Object,properties:U,required:[...J],description:typeof $.description==="string"?$.description:void 0}}function IW($,Q){let Z=$.enum;if(!Array.isArray(Z))return null;if(Z.length===0)throw Error(`Enum at ${Q} cannot be empty`);let X=[];for(let Y of Z){if(typeof Y!=="string"&&typeof Y!=="number")throw Error(`Enum at ${Q} must contain only string or number values`);X.push(Y)}return X}function RW($,Q,Z,X){let Y=Z.map((G)=>({key:gQ(G),value:G})),W=new Set;for(let G of Y){if(W.has(G.key))throw Error(`Enum '${Q}' has duplicate normalized key '${G.key}' (path: ${X})`);W.add(G.key)}let U=$.enumGroups.get(Q);if(!U){let G={name:Q,schemaPath:X,values:Z,members:Y};return $.enumGroups.set(Q,G),G}if(!(U.values.length===Z.length&&U.values.every((G,_)=>G===Z[_])))throw Error(`Enum name collision for '${Q}'. Paths: ${U.schemaPath} and ${X}`);return U}function yL($){if($===void 0)return!1;return Object.values(CW).some((Q)=>Q===$)}function FX($){if($===!0||$===!1)return $;if(typeof $==="number")return $;return}function xL($,Q,Z){return{kind:Z1.Scalar,scalar:Q,format:typeof $.format==="string"?$.format:void 0,minLength:typeof $.minLength==="number"?$.minLength:void 0,maxLength:typeof $.maxLength==="number"?$.maxLength:void 0,minimum:typeof $.minimum==="number"?$.minimum:void 0,maximum:typeof $.maximum==="number"?$.maximum:void 0,exclusiveMinimum:FX($.exclusiveMinimum),exclusiveMaximum:FX($.exclusiveMaximum),pattern:typeof $.pattern==="string"?$.pattern:void 0,description:Z}}function gL($,Q,Z,X){let Y=typeof $.$ref==="string"?$.$ref:"";if(!Y)throw Error(`Missing $ref at ${Z}`);let W=nQ(Y),U=Q.schemas[W];if(!T(U))throw Error(`Missing referenced schema '${W}' at ${Z}`);let J=typeof $.description==="string"?$.description:void 0;if(X.has(W))return{kind:Z1.Ref,ref:Y,refName:W,description:J};X.add(W);let G=q0(U,Q,`#/components/schemas/${W}`,$9(W),X);if(X.delete(W),G.kind!=="object"||Object.keys(G.properties).length===0)return G;return{kind:Z1.Ref,ref:Y,refName:W,description:J}}function hL($,Q,Z,X,Y,W){let U=$.properties,J={};if(T(U))for(let[q,K]of Object.entries(U)){if(!T(K))throw Error(`Invalid property '${q}' at ${Z}`);let B=`${X}${$9(q)}`;J[q]=q0(K,Q,`${Z}.properties.${q}`,B,W)}let G=$.required,_=Array.isArray(G)&&G.every((q)=>typeof q==="string")?G:[],H=$.additionalProperties,V;if(H===!0)V={kind:Z1.Unknown};else if(T(H))V=q0(H,Q,`${Z}.additionalProperties`,`${X}Value`,W);else if(H!==void 0&&H!==!1)throw Error(`Unsupported additionalProperties at ${Z}`);return{kind:Z1.Object,properties:J,required:_,additionalProperties:V,description:Y}}function uL($,Q,Z,X,Y){let W=RW(Q,Z,X,Y);return{kind:Z1.Enum,enumName:W.name,values:W.values,description:typeof $.description==="string"?$.description:void 0}}function dL($,Q,Z,X,Y,W){let U=$.items;if(!T(U))throw Error(`Array schema at ${Z} is missing items`);let J=`${X}Item`;return{kind:Z1.Array,items:q0(U,Q,`${Z}.items`,J,W),minItems:typeof $.minItems==="number"?$.minItems:void 0,maxItems:typeof $.maxItems==="number"?$.maxItems:void 0,description:Y}}function q0($,Q,Z,X,Y){if(MW($,Z),typeof $.$ref==="string")return gL($,Q,Z,Y);let W=IW($,Z);if(W)return uL($,Q,X,W,Z);if(Array.isArray($.allOf))return SW($,Q,Z,Y,q0);let{normalizedType:U}=M9($),J=typeof $.description==="string"?$.description:void 0;if(U==="array")return dL($,Q,Z,X,J,Y);if(U==="object"||T($.properties))return hL($,Q,Z,X,J,Y);if(yL(U))return xL($,U,J);throw Error(`Unsupported schema at ${Z}`)}function mL($,Q,Z,X=f2.Schema,Y=cQ.Schema){let W=IW(Q,`#/components/schemas/${$}`);if(W)return RW(Z,$9($),W,`#/components/schemas/${$}`),null;let U=q0(Q,Z,`#/components/schemas/${$}`,$9($),new Set);if(U.kind!=="object")return null;if(Object.keys(U.properties).length===0&&U.additionalProperties===void 0)return null;let J=Object.entries(U.properties).map(([G,_])=>{let H=!U.required.includes(G),V=Q.nullable===!0,K=(T(Q.properties)?Q.properties:void 0)?.[G];if(T(K)){let{nullable:L}=M9(K);V=L||K.nullable===!0}let B=T(K)&&typeof K.description==="string"?K.description:void 0;return{name:G,schema:_,optional:H,nullable:V,source:X,description:B}});return{schemaName:$,dtoName:O0($),schema:U,description:typeof Q.description==="string"?Q.description:void 0,properties:J,source:Y}}function DW($,Q){if(!Q.has($.schemaName))return Q.add($.schemaName),$;let Z=2;while(Q.has(`${$.schemaName}${Z}`))Z+=1;let X=`${$.schemaName}${Z}`;return Q.add(X),{...$,schemaName:X,dtoName:O0(X)}}function h8($){if(!T($))return null;return T($.schema)?$.schema:null}function S9($){if(!T($))return null;let Q=h8($[a4]);if(Q)return Q;for(let[X,Y]of Object.entries($)){if(!eX.test(X))continue;let W=h8(Y);if(W)return W}let Z=h8($[s4]);if(Z)return Z;for(let X of Object.keys($).sort((Y,W)=>Y.localeCompare(W))){let Y=h8($[X]);if(Y)return Y}return null}function lL($,Q,Z){let X=typeof $.operationId==="string"?$.operationId.trim():"";return wW(X.length>0?X:`${Q} ${Z}`)}function bW($,Q,Z,X=new Set){if(!T($))return null;let Y=$.$ref;if(typeof Y!=="string")return $;if(X.has(Y))return null;let W=RL(Y,Z);if(!W)return null;let U=Q[Z];if(!T(U))return null;let J=U[W];if(!T(J))return null;return X.add(Y),bW(J,Q,Z,X)}function pL($,Q,Z,X){let Y=new Map,W=(U)=>{if(!Array.isArray(U))return;for(let J of U){let G=bW(J,Z,"parameters");if(!G||G.in!==X||typeof G.name!=="string")continue;Y.set(`${X}:${G.name}`,G)}};return W($),W(Q),[...Y.values()].sort((U,J)=>String(U.name).localeCompare(String(J.name)))}function cL($){if(T($.schema))return $.schema;return S9($.content)}function nL($,Q){if(typeof Q.description!=="string"||typeof $.description==="string")return $;return{...$,description:Q.description}}function MX($,Q,Z,X,Y,W,U){let J=pL($.parameters,Q.parameters,Z,W);if(J.length===0)return null;let G=[];for(let H of J){let V=H.name;if(typeof V!=="string")continue;let q=cL(H);if(!q)continue;let K=nL(q,H),{nullable:B}=M9(K),L=`${Y}${U}${wW(V)}`;G.push({name:V,schema:q0(K,X,`paths.${Y}.${U}.${V}`,L,new Set),optional:W===f2.Path?!1:H.required!==!0,nullable:B,description:typeof H.description==="string"?H.description:void 0,source:W})}if(G.length===0)return null;let _=`${Y}${U}`;return{schemaName:_,dtoName:O0(_),schema:{kind:Z1.Object,properties:Object.fromEntries(G.map((H)=>[H.name,H.schema])),required:G.filter((H)=>!H.optional).map((H)=>H.name)},properties:G,source:cQ.Operation}}function rL($,Q,Z,X,Y){let W=[];for(let U of FW){let J=Q[U];if(!T(J))continue;let G=lL(J,U,$),_=[MX(Q,J,Z,X,G,f2.Path,zQ.Params),MX(Q,J,Z,X,G,f2.Query,zQ.Query)];for(let H of _)if(H)W.push(DW(H,Y))}return W}function iL($,Q,Z){if(!T($.paths))return[];let X=T($.components)?$.components:{},Y=[];for(let[W,U]of Object.entries($.paths).sort(([J],[G])=>J.localeCompare(G))){if(!T(U))continue;Y.push(...rL(W,U,X,Q,Z))}return Y}function kW($,Q){if(!T($))return;for(let[Z,X]of Object.entries($)){if(!T(X)||!("schema"in X))continue;let Y=X.schema;if(!T(Y)||typeof Y.$ref!=="string")throw Error(`Inline ${Q}.${Z}.schema`)}}function aL($,Q){if(!T(Q))return;kW(Q.content,`request schema is not allowed at ${$}.requestBody.content`)}function sL($,Q){if(!T(Q))return;for(let[Z,X]of Object.entries(Q)){if(!T(X))continue;kW(X.content,`response schema is not allowed at ${$}.responses.${Z}.content`)}}function tL($,Q,Z){let X=`paths.${$}.${Q}`;aL(X,Z.requestBody),sL(X,Z.responses)}function eL($,Q){if(!Q.enforceOperationSchemaRefs)return;let Z=$.paths;if(!T(Z))return;for(let[X,Y]of Object.entries(Z)){if(!T(Y))continue;for(let[W,U]of Object.entries(Y)){if(!T(U))continue;if(W==="parameters")continue;tL(X,W,U)}}}function I9($,Q={}){if(!T($))throw Error("API schema document must be an object");let Z=IL($.openapi);return eL($,{enforceOperationSchemaRefs:Q.enforceOperationSchemaRefs??!0}),Z}function $O($){let Q=$.components;if(!T(Q)||!T(Q.schemas))throw Error("API schema document is missing components.schemas");return Q.schemas}function PW($){if(!T($))throw Error("API schema document must be an object");let Q=I9($,{enforceOperationSchemaRefs:!0}),Z=$O($),X={schemas:Z,enumGroups:new Map},Y=[],W=new Set;for(let[U,J]of Object.entries(Z)){if(!T(J))throw Error(`Invalid schema '${U}' in components.schemas`);let G=mL(U,J,X);if(G)Y.push(DW(G,W))}return Y.push(...iL($,X,W)),{family:Q,dtoModels:Y,enumGroups:[...X.enumGroups.values()].sort((U,J)=>U.name.localeCompare(J.name))}}async function QO($){let Q;try{Q=await xW($,{withFileTypes:!0})}catch{return!1}let Z=!1;return await Promise.all(Q.filter((X)=>X.isFile()&&X.name.endsWith(UY)).map(async(X)=>{await D9(iQ($,X.name),{force:!0}),Z=!0})),Z}async function vW($){try{await yW($)}catch{return!1}return await D9($,{force:!0}),!0}async function N9($){try{await yW($)}catch{return!1}return await D9($,{recursive:!0,force:!0}),!0}async function ZO($,Q){let Z;try{Z=await xW($,{withFileTypes:!0})}catch{return!1}let X=!1;return await Promise.all(Z.filter((Y)=>Y.isFile()&&Y.name.endsWith(".contract.ts")&&!Q.has(Y.name)).map(async(Y)=>{await D9(iQ($,Y.name),{force:!0}),X=!0})),X}async function d2($,Q,Z){return Z?V9($,Q):$}function gW($){return`export * from '${$}';`}function Q9($,Q){return`export * as ${$} from '${Q}';`}async function XO($,Q){let Z=Q.length>0?Q.sort().join(`
271
+ `):"export {};";return e(iQ($,G9),`${Z}
272
+ `)}function WO($){return`./${j9($).replace(/\.ts$/,"")}`}function UO($){return`../enums/${T9($).replace(/\.ts$/,"")}`}function hW($,Q,Z){let X=$.imports.get(Q)??new Set;X.add(Z),$.imports.set(Q,X)}function JO($,Q){let Z=l1(Q);if(Z===$.currentName)return;hW($,WO(Q),Z)}function GO($,Q){hW($,UO(Q),l1(Q))}function uW($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)?$:JSON.stringify($)}function oQ($){return[...new Set($)].join(" | ")}function dW($,Q,Z,X){let Y=H0($,Z,X);if(Y==="unknown")return"unknown";return oQ([Y,...Q])}function _O($,Q,Z){let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${H0($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let Y=" ".repeat(Z),W=" ".repeat(Z+1),U=["{"];for(let[J,G]of X){let _=$.required.includes(J)?"":"?";U.push(`${W}${uW(J)}${_}: ${H0(G,Q,Z+1)};`)}if($.additionalProperties){let J=X.map(([G,_])=>{let H=$.required.includes(G)?[]:["undefined"];return oQ([H0(_,Q,Z+1),...H])});U.push(`${W}[key: string]: ${dW($.additionalProperties,J,Q,Z+1)};`)}return U.push(`${Y}}`),U.join(`
273
+ `)}function H0($,Q,Z){if($.kind==="scalar")return $.scalar==="integer"?"number":$.scalar;if($.kind==="enum")return GO(Q,$.enumName),l1($.enumName);if($.kind==="ref")return JO(Q,$.refName),l1($.refName);if($.kind==="array")return`${H0($.items,Q,Z)}[]`;if($.kind==="unknown")return"unknown";return _O($,Q,Z)}function HO($,Q){let Z=$.optional?"?":"",X=!$.optional&&$.nullable?" | null":"";return`${$.description?` /** ${$.description.replace(/\*\//g,"*\\/")} */
274
+ `:""} ${uW($.name)}${Z}: ${H0($.schema,Q,1)}${X};`}function VO($,Q){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let Z=$.properties.map((X)=>{let Y=X.optional?["undefined"]:[],W=!X.optional&&X.nullable?["null"]:[];return oQ([H0(X.schema,Q,1),...W,...Y])});return` [key: string]: ${dW($.schema.additionalProperties,Z,Q,1)};`}function qO($){let Q=[...$.imports.entries()].sort(([Z],[X])=>Z.localeCompare(X)).map(([Z,X])=>{return`import type { ${[...X].sort((W,U)=>W.localeCompare(U)).join(", ")} } from '${Z}';`});return Q.length>0?`${Q.join(`
272
275
  `)}
273
276
 
274
- `:""}function JK($){let Q=C1($.schemaName),Z={currentName:Q,imports:new Map},X=$.description?`/** ${$.description.replace(/\*\//g,"*\\/")} */
275
- `:"",U=$.properties.map((G)=>ZK(G,Z)),J=XK($,Z),W=[...U,...J?[J]:[]],Y=W.length>0?W.join(`
276
- `):" // empty schema";return`${UK(Z)}${X}export interface ${Q} {
277
- ${Y}
277
+ `:""}function KO($){let Q=l1($.schemaName),Z={currentName:Q,imports:new Map},X=$.description?`/** ${$.description.replace(/\*\//g,"*\\/")} */
278
+ `:"",Y=$.properties.map((G)=>HO(G,Z)),W=VO($,Z),U=[...Y,...W?[W]:[]],J=U.length>0?U.join(`
279
+ `):" // empty schema";return`${qO(Z)}${X}export interface ${Q} {
280
+ ${J}
278
281
  }
279
- `}function GK($){return structuredClone($)}function zK($,Q,Z){if(typeof Z.operationId==="string"&&Z.operationId.trim().length>0)return Z.operationId;return`${$} ${Q.replaceAll("{","").replaceAll("}","")}`}function F6($){let Q=$.match(/[a-zA-Z0-9]+/g)??["Schema"];return YK(Q.join(" "))}function _K($,Q){let Z=Q,X=2;while(Object.hasOwn($,Z))Z=`${Q}${X}`,X++;return Z}function VK($){let Q=j($.components)?$.components:{},Z=j(Q.schemas)?Q.schemas:{};return Q.schemas=Z,$.components=Q,Z}function HK($,Q,Z){if(!j($))return!1;let X=$.schema;if(!j(X)||typeof X.$ref==="string")return!1;let U=_K(Q,Z);return Q[U]=X,$.schema={$ref:`#/components/schemas/${U}`},!0}function HU($,Q,Z){if(!j($))return 0;let X=0;for(let[U,J]of Object.entries($))if(HK(J,Q,Z(U)))X++;return X}function OK($,Q,Z){let X=$.requestBody;if(!j(X))return 0;return HU(X.content,Q,(U)=>`${Z}${F6(U)}Request`)}function KK($,Q,Z){let X=$.responses;if(!j(X))return 0;let U=0;for(let[J,W]of Object.entries(X)){if(!j(W))continue;U+=HU(W.content,Q,(Y)=>`${Z}${F6(J)}${F6(Y)}Response`)}return U}function qK($,Q,Z,X){let U=F6(zK($,Q,Z));return OK(Z,X,U)+KK(Z,X,U)}function OU($){let Q=GK($),Z=VK(Q),X=j(Q.paths)?Q.paths:{},U=0;for(let[J,W]of Object.entries(X)){if(!j(W))continue;for(let[Y,G]of Object.entries(W)){if(!KU.has(Y)||!j(G))continue;U+=qK(Y,J,G,Z)}}return{doc:Q,hoistedSchemaCount:U}}function p($){return typeof $==="object"&&$!==null}function I6($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function LK($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function a$($){return`'${LK($)}'`}function A0($){return`${TK}${$}}`}function XQ($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)}function L2($){return XQ($)?$:JSON.stringify($)}function BU($,Q){return XQ(Q)?`${$}.${Q}`:`${$}[${JSON.stringify(Q)}]`}function LU($,Q){if(Q==="PascalCase")return QQ($);if(Q==="snake_case")return ZQ($);if(Q==="original")return $;return a6($)}function AK($,Q){if(Q==="PascalCase")return QQ($);if(Q==="snake_case")return ZQ($);if(Q==="original")return $;return a6($)}function MK($,Q){if(Q==="camelCase")return a6(String($));if(Q==="snake_case")return ZQ(String($));if(Q==="UPPERCASE")return BK(String($));if(Q==="original")return String($);return QQ(String($))}function AU($){let Q=a6($);return/^[A-Za-z_$]/.test(Q)?Q:`_${Q}`}function jK($){let Q=XQ($)?$:AU($);return d5.has(Q)?`${Q}Value`:Q}function MU($){return $.modelPropertyNaming??($.type===w.TypeScriptAngular?"original":"camelCase")}function A2($){return $.useSingleRequestParameter??$.type===w.TypeScriptFetch}function UQ($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'`);return Z[1]}function WQ($){return $.map((Q)=>{let Z=Q.parameters.map((U)=>{let J=U.required?"":"?";return` ${L2(U.name)}${J}: ${U.typeName};`});if(Q.bodyType)Z.push(` body: ${Q.bodyType};`);let X=Z.length>0?Z.join(`
282
+ `}function LO($){return structuredClone($)}function OO($,Q,Z){if(typeof Z.operationId==="string"&&Z.operationId.trim().length>0)return Z.operationId;return`${$} ${Q.replaceAll("{","").replaceAll("}","")}`}function Z9($){let Q=$.match(/[a-zA-Z0-9]+/g)??["Schema"];return AO(Q.join(" "))}function zO($,Q){let Z=Q,X=2;while(Object.hasOwn($,Z))Z=`${Q}${X}`,X++;return Z}function jO($){let Q=T($.components)?$.components:{},Z=T(Q.schemas)?Q.schemas:{};return Q.schemas=Z,$.components=Q,Z}function TO($,Q,Z){if(!T($))return!1;let X=$.schema;if(!T(X)||typeof X.$ref==="string")return!1;let Y=zO(Q,Z);return Q[Y]=X,$.schema={$ref:`#/components/schemas/${Y}`},!0}function mW($,Q,Z){if(!T($))return 0;let X=0;for(let[Y,W]of Object.entries($))if(TO(W,Q,Z(Y)))X++;return X}function EO($,Q,Z){let X=$.requestBody;if(!T(X))return 0;return mW(X.content,Q,(Y)=>`${Z}${Z9(Y)}Request`)}function CO($,Q,Z){let X=$.responses;if(!T(X))return 0;let Y=0;for(let[W,U]of Object.entries(X)){if(!T(U))continue;Y+=mW(U.content,Q,(J)=>`${Z}${Z9(W)}${Z9(J)}Response`)}return Y}function FO($,Q,Z,X){let Y=Z9(OO($,Q,Z));return EO(Z,X,Y)+CO(Z,X,Y)}function lW($){let Q=LO($),Z=jO(Q),X=T(Q.paths)?Q.paths:{},Y=0;for(let[W,U]of Object.entries(X)){if(!T(U))continue;for(let[J,G]of Object.entries(U)){if(!pW.has(J)||!T(G))continue;Y+=FO(J,W,G,Z)}}return{doc:Q,hoistedSchemaCount:Y}}function i($){return typeof $==="object"&&$!==null}function X9($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function SO($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function X1($){return`'${SO($)}'`}function v0($){return`${NO}${$}}`}function tQ($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)}function m2($){return tQ($)?$:JSON.stringify($)}function nW($,Q){return tQ(Q)?`${$}.${Q}`:`${$}[${JSON.stringify(Q)}]`}function rW($,Q){if(Q==="PascalCase")return aQ($);if(Q==="snake_case")return sQ($);if(Q==="original")return $;return w9($)}function IO($,Q){if(Q==="PascalCase")return aQ($);if(Q==="snake_case")return sQ($);if(Q==="original")return $;return w9($)}function RO($,Q){if(Q==="camelCase")return w9(String($));if(Q==="snake_case")return sQ(String($));if(Q==="UPPERCASE")return MO(String($));if(Q==="original")return String($);return aQ(String($))}function iW($){let Q=w9($);return/^[A-Za-z_$]/.test(Q)?Q:`_${Q}`}function DO($){let Q=tQ($)?$:iW($);return XY.has(Q)?`${Q}Value`:Q}function oW($){return $.modelPropertyNaming??($.type===w.TypeScriptAngular?"original":"camelCase")}function l2($){return $.useSingleRequestParameter??$.type===w.TypeScriptFetch}function eQ($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'`);return Z[1]}function QZ($){return $.map((Q)=>{let Z=Q.parameters.map((Y)=>{let W=Y.required?"":"?";return` ${m2(Y.name)}${W}: ${Y.typeName};`});if(Q.bodyType)Z.push(` body: ${Q.bodyType};`);let X=Z.length>0?Z.join(`
280
283
  `):" [key: string]: never;";return`export interface ${Q.requestName} {
281
284
  ${X}
282
- }`})}function EK(){return["export interface DecodeJson {"," <T>(value: unknown, operationId: string): T;","}","","export interface RequestConfig {"," baseUrl?: string;"," headers?: HeadersInit;"," fetch?: typeof fetch;"," decodeJson?: DecodeJson;","}","","export function buildPath(template: string, params: Record<string, unknown>): string {"," return template.replace(/\\{([^}]+)\\}/g, (_match, key: string) => {"," const value = params[key];"," if (value === undefined || value === null) {",` throw new Error(\`Missing required path parameter '${A0("key")}'\`);`," }"," return encodeURIComponent(String(value));"," });","}","","export function buildQuery(params: Record<string, unknown>): string {"," const search = new URLSearchParams();"," for (const [key, value] of Object.entries(params)) {"," if (value === undefined || value === null) continue;"," if (Array.isArray(value)) {"," for (const item of value) search.append(key, String(item));"," continue;"," }"," search.set(key, String(value));"," }"," const query = search.toString();",` return query ? \`?${A0("query")}\` : '';`,"}","","export async function parseUnknownJsonResponse(response: Response): Promise<unknown> {"," if (response.status === 204) return undefined;"," const responseText = await response.text();"," return responseText.length > 0 ? JSON.parse(responseText) : undefined;","}","","export async function parseJsonResponse<T>("," response: Response,"," operationId: string,"," decodeJson: DecodeJson","): Promise<T> {"," const value = await parseUnknownJsonResponse(response);"," return decodeJson<T>(value, operationId);","}"].join(`
283
- `)}function YQ($){return{pathParams:$.parameters.filter((Q)=>Q.location===W$.Path),queryParams:$.parameters.filter((Q)=>Q.location===W$.Query)}}function G2($,Q){return $.map((Z)=>{let X=Q?BU("request",Z.name):Z.variableName;return`${L2(Z.wireName)}: ${X}`}).join(", ")}function CK($,Q){if($.length===0)return[];let Z=[" let params = new HttpParams();"];for(let X of $){let U=Q?BU("request",X.name):X.variableName;Z.push(` if (Array.isArray(${U})) {`,` for (const item of ${U}) params = params.append(${a$(X.wireName)}, String(item));`,` } else if (${U} !== undefined && ${U} !== null) {`,` params = params.set(${a$(X.wireName)}, String(${U}));`," }")}return Z}function GQ($,Q){if(A2(Q)){let U=$.parameters.length===0&&!$.bodyType?" = {}":"";return`request: ${$.requestName}${U}`}let X=$.parameters.map((U)=>{let J=U.required?"":"?";return`${U.variableName}${J}: ${U.typeName}`});if($.bodyType)X.push(`body: ${$.bodyType}`);return X.join(", ")}function zQ($){return A2($)?"request.body":"body"}function T0($){return $}function SK($){return $.some((Q)=>Q.responseType.includes("Enums.")||Q.bodyType?.includes("Enums.")||Q.parameters.some((Z)=>Z.typeName.includes("Enums.")))}function _Q($,Q,Z){if(Q===Z||!SK($))return[];return[`import type * as Enums from '${Q}';`]}function FK($){if($.responseType==="unknown")return[" return parseUnknownJsonResponse(response);"];return[" if (!this.config.decodeJson) {",` throw new Error(${a$(`Missing JSON decoder for operation '${$.operationId}'`)});`," }",` return parseJsonResponse<${T0($.responseType)}>(response, ${a$($.operationId)}, this.config.decodeJson);`]}function IK($,Q,Z,X){let U=X.modelImportPath??"./models",J=X.enumImportPath??U,W=["import type { RequestConfig } from './runtime';","import { buildPath, buildQuery, parseJsonResponse, parseUnknownJsonResponse } from './runtime';",`import type * as Models from '${U}';`,..._Q($,J,U),"",...WQ($),"",`export class ${JQ(Q)}FetchClient {`," constructor(private readonly config: RequestConfig = {}) {}"];for(let Y of $){let{pathParams:G,queryParams:z}=YQ(Y),_=A2(Z),V=Y.bodyType?`body: JSON.stringify(${zQ(Z)}),`:"",H=Y.bodyType?"headers: { 'content-type': 'application/json', ...this.config.headers },":"headers: this.config.headers,";W.push(` async ${Y.functionName}(${GQ(Y,Z)}): Promise<${T0(Y.responseType)}> {`,` const path = buildPath(${a$(Y.path)}, { ${G2(G,_)} });`,` const query = buildQuery({ ${G2(z,_)} });`," const fetchImpl = this.config.fetch ?? fetch;",` const response = await fetchImpl(\`${A0("this.config.baseUrl ?? ''")}${A0("path")}${A0("query")}\`, {`,` method: ${a$(Y.method)},`,` ${H}`,` ${V}`," });",` if (!response.ok) throw new Error(\`Request failed with status ${A0("response.status")}\`);`,...FK(Y)," }")}return W.push("}",""),`${W.join(`
285
+ }`})}function wO(){return["export interface DecodeJson {"," <T>(value: unknown, operationId: string): T;","}","","export interface RequestConfig {"," baseUrl?: string;"," headers?: HeadersInit;"," fetch?: typeof fetch;"," decodeJson?: DecodeJson;","}","","export function buildPath(template: string, params: Record<string, unknown>): string {"," return template.replace(/\\{([^}]+)\\}/g, (_match, key: string) => {"," const value = params[key];"," if (value === undefined || value === null) {",` throw new Error(\`Missing required path parameter '${v0("key")}'\`);`," }"," return encodeURIComponent(String(value));"," });","}","","export function buildQuery(params: Record<string, unknown>): string {"," const search = new URLSearchParams();"," for (const [key, value] of Object.entries(params)) {"," if (value === undefined || value === null) continue;"," if (Array.isArray(value)) {"," for (const item of value) search.append(key, String(item));"," continue;"," }"," search.set(key, String(value));"," }"," const query = search.toString();",` return query ? \`?${v0("query")}\` : '';`,"}","","export async function parseUnknownJsonResponse(response: Response): Promise<unknown> {"," if (response.status === 204) return undefined;"," const responseText = await response.text();"," return responseText.length > 0 ? JSON.parse(responseText) : undefined;","}","","export async function parseJsonResponse<T>("," response: Response,"," operationId: string,"," decodeJson: DecodeJson","): Promise<T> {"," const value = await parseUnknownJsonResponse(response);"," return decodeJson<T>(value, operationId);","}"].join(`
286
+ `)}function ZZ($){return{pathParams:$.parameters.filter((Q)=>Q.location===_$.Path),queryParams:$.parameters.filter((Q)=>Q.location===_$.Query)}}function y2($,Q){return $.map((Z)=>{let X=Q?nW("request",Z.name):Z.variableName;return`${m2(Z.wireName)}: ${X}`}).join(", ")}function bO($,Q){if($.length===0)return[];let Z=[" let params = new HttpParams();"];for(let X of $){let Y=Q?nW("request",X.name):X.variableName;Z.push(` if (Array.isArray(${Y})) {`,` for (const item of ${Y}) params = params.append(${X1(X.wireName)}, String(item));`,` } else if (${Y} !== undefined && ${Y} !== null) {`,` params = params.set(${X1(X.wireName)}, String(${Y}));`," }")}return Z}function XZ($,Q){if(l2(Q)){let Y=$.parameters.length===0&&!$.bodyType?" = {}":"";return`request: ${$.requestName}${Y}`}let X=$.parameters.map((Y)=>{let W=Y.required?"":"?";return`${Y.variableName}${W}: ${Y.typeName}`});if($.bodyType)X.push(`body: ${$.bodyType}`);return X.join(", ")}function YZ($){return l2($)?"request.body":"body"}function u0($){return $}function kO($){return $.some((Q)=>Q.responseType.includes("Enums.")||Q.bodyType?.includes("Enums.")||Q.parameters.some((Z)=>Z.typeName.includes("Enums.")))}function WZ($,Q,Z){if(Q===Z||!kO($))return[];return[`import type * as Enums from '${Q}';`]}function PO($){if($.responseType==="unknown")return[" return parseUnknownJsonResponse(response);"];return[" if (!this.config.decodeJson) {",` throw new Error(${X1(`Missing JSON decoder for operation '${$.operationId}'`)});`," }",` return parseJsonResponse<${u0($.responseType)}>(response, ${X1($.operationId)}, this.config.decodeJson);`]}function fO($,Q,Z,X){let Y=X.modelImportPath??"./models",W=X.enumImportPath??Y,U=["import type { RequestConfig } from './runtime';","import { buildPath, buildQuery, parseJsonResponse, parseUnknownJsonResponse } from './runtime';",`import type * as Models from '${Y}';`,...WZ($,W,Y),"",...QZ($),"",`export class ${$Z(Q)}FetchClient {`," constructor(private readonly config: RequestConfig = {}) {}"];for(let J of $){let{pathParams:G,queryParams:_}=ZZ(J),H=l2(Z),V=J.bodyType?`body: JSON.stringify(${YZ(Z)}),`:"",q=J.bodyType?"headers: { 'content-type': 'application/json', ...this.config.headers },":"headers: this.config.headers,";U.push(` async ${J.functionName}(${XZ(J,Z)}): Promise<${u0(J.responseType)}> {`,` const path = buildPath(${X1(J.path)}, { ${y2(G,H)} });`,` const query = buildQuery({ ${y2(_,H)} });`," const fetchImpl = this.config.fetch ?? fetch;",` const response = await fetchImpl(\`${v0("this.config.baseUrl ?? ''")}${v0("path")}${v0("query")}\`, {`,` method: ${X1(J.method)},`,` ${q}`,` ${V}`," });",` if (!response.ok) throw new Error(\`Request failed with status ${v0("response.status")}\`);`,...PO(J)," }")}return U.push("}",""),`${U.join(`
284
287
  `)}
285
- `}function RK($,Q,Z,X){let U=X.modelImportPath??"./models",J=X.enumImportPath??U,Y=["import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';",$.some((G)=>G.parameters.some((z)=>z.location===W$.Query))?"import { buildPath, buildQuery } from './runtime';":"import { buildPath } from './runtime';",`import type * as Models from '${U}';`,..._Q($,J,U),"","export interface AxiosClientConfig {"," baseURL?: string;"," axios?: AxiosInstance;"," requestConfig?: AxiosRequestConfig;","}","",...WQ($),"",`export class ${JQ(Q)}AxiosClient {`," private readonly client: AxiosInstance;",""," constructor(private readonly config: AxiosClientConfig = {}) {"," this.client = config.axios ?? axios.create({ baseURL: config.baseURL });"," }"];for(let G of $){let{pathParams:z,queryParams:_}=YQ(G),V=A2(Z),H=G.bodyType?`data: ${zQ(Z)},`:"",O=_.length?`params: { ${G2(_,V)} },`:"",K=_.length?"paramsSerializer: (params: Record<string, unknown>) => buildQuery(params).slice(1),":"";Y.push(` async ${G.functionName}(${GQ(G,Z)}): Promise<${T0(G.responseType)}> {`,` const url = buildPath(${a$(G.path)}, { ${G2(z,V)} });`,` const response = await this.client.request<${T0(G.responseType)}>({`," ...this.config.requestConfig,"," url,",` method: ${a$(G.method)},`,` ${O}`,` ${K}`,` ${H}`," });"," return response.data;"," }")}return Y.push("}",""),`${Y.join(`
288
+ `}function yO($,Q,Z,X){let Y=X.modelImportPath??"./models",W=X.enumImportPath??Y,J=["import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';",$.some((G)=>G.parameters.some((_)=>_.location===_$.Query))?"import { buildPath, buildQuery } from './runtime';":"import { buildPath } from './runtime';",`import type * as Models from '${Y}';`,...WZ($,W,Y),"","export interface AxiosClientConfig {"," baseURL?: string;"," axios?: AxiosInstance;"," requestConfig?: AxiosRequestConfig;","}","",...QZ($),"",`export class ${$Z(Q)}AxiosClient {`," private readonly client: AxiosInstance;",""," constructor(private readonly config: AxiosClientConfig = {}) {"," this.client = config.axios ?? axios.create({ baseURL: config.baseURL });"," }"];for(let G of $){let{pathParams:_,queryParams:H}=ZZ(G),V=l2(Z),q=G.bodyType?`data: ${YZ(Z)},`:"",K=H.length?`params: { ${y2(H,V)} },`:"",B=H.length?"paramsSerializer: (params: Record<string, unknown>) => buildQuery(params).slice(1),":"";J.push(` async ${G.functionName}(${XZ(G,Z)}): Promise<${u0(G.responseType)}> {`,` const url = buildPath(${X1(G.path)}, { ${y2(_,V)} });`,` const response = await this.client.request<${u0(G.responseType)}>({`," ...this.config.requestConfig,"," url,",` method: ${X1(G.method)},`,` ${K}`,` ${B}`,` ${q}`," });"," return response.data;"," }")}return J.push("}",""),`${J.join(`
286
289
  `)}
287
- `}function DK($,Q,Z,X,U){let J=U.modelImportPath??"./models",W=U.enumImportPath??J,z=["import { Injectable } from '@angular/core';",$.some((_)=>_.parameters.some((V)=>V.location===W$.Query))?"import { HttpClient, HttpParams } from '@angular/common/http';":"import { HttpClient } from '@angular/common/http';","import type { Observable } from 'rxjs';","import { buildPath } from './runtime';",`import type * as Models from '${J}';`,..._Q($,W,J),"",...WQ($),"",`@Injectable({ providedIn: ${a$(X)} })`,`export class ${JQ(Q)}ApiService {`," constructor(private readonly http: HttpClient, private readonly baseUrl = '') {}"];for(let _ of $){let{pathParams:V,queryParams:H}=YQ(_),O=A2(Z),K=H.length>0?"{ params }":"{}",q=_.bodyType?`${zQ(Z)}, `:"",B=_.method.toLowerCase(),F=_.bodyType||B!==O$.Get?`\`\${this.baseUrl}\${path}\`, ${q}${K}`:`\`\${this.baseUrl}\${path}\`, ${K}`;z.push(` ${_.functionName}(${GQ(_,Z)}): Observable<${T0(_.responseType)}> {`,` const path = buildPath(${a$(_.path)}, { ${G2(V,O)} });`,...CK(H,O),` return this.http.${B}<${T0(_.responseType)}>(${F});`," }")}return z.push("}",""),`${z.join(`
290
+ `}function xO($,Q,Z,X,Y){let W=Y.modelImportPath??"./models",U=Y.enumImportPath??W,_=["import { Injectable } from '@angular/core';",$.some((H)=>H.parameters.some((V)=>V.location===_$.Query))?"import { HttpClient, HttpParams } from '@angular/common/http';":"import { HttpClient } from '@angular/common/http';","import type { Observable } from 'rxjs';","import { buildPath } from './runtime';",`import type * as Models from '${W}';`,...WZ($,U,W),"",...QZ($),"",`@Injectable({ providedIn: ${X1(X)} })`,`export class ${$Z(Q)}ApiService {`," constructor(private readonly http: HttpClient, private readonly baseUrl = '') {}"];for(let H of $){let{pathParams:V,queryParams:q}=ZZ(H),K=l2(Z),B=q.length>0?"{ params }":"{}",L=H.bodyType?`${YZ(Z)}, `:"",O=H.method.toLowerCase(),S=H.bodyType||O!==O$.Get?`\`\${this.baseUrl}\${path}\`, ${L}${B}`:`\`\${this.baseUrl}\${path}\`, ${B}`;_.push(` ${H.functionName}(${XZ(H,Z)}): Observable<${u0(H.responseType)}> {`,` const path = buildPath(${X1(H.path)}, { ${y2(V,K)} });`,...bO(q,K),` return this.http.${O}<${u0(H.responseType)}>(${S});`," }")}return _.push("}",""),`${_.join(`
288
291
  `)}
289
- `}function NK($,Q,Z,X={}){if(Z.type===w.TypeScriptAxios)return RK($,Q,Z,X);if(Z.type===w.TypeScriptAngular)return DK($,Q,Z,Z.providedIn??"root",X);return IK($,Q,Z,X)}function R6($){return[...new Set($)].join(" | ")}function HQ($){if(!$)return"unknown";if(typeof $.$ref==="string")return VQ(UQ($.$ref,"schemas"));if(Array.isArray($.enum))return $.enum.map((Q)=>JSON.stringify(Q)).join(" | ");if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let Q=p($.items)?$.items:void 0;return`Array<${HQ(Q)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function kK($,Q,Z){if($.kind!=="object")return Z1($,Q,Z);let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${Z1($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let U=" ".repeat(Z),J=" ".repeat(Z+1),W=MU(Q),Y=X.map(([G,z])=>{let _=LU(G,W),V=$.required.includes(G)?"":"?";return`${J}${L2(_)}${V}: ${Z1(z,Q,Z+1)};`});if($.additionalProperties){let G=Z1($.additionalProperties,Q,Z+1),z=X.map(([_,V])=>{let H=$.required.includes(_)?[]:["undefined"];return R6([Z1(V,Q,Z+1),...H])});Y.push(`${J}[key: string]: ${G==="unknown"?"unknown":R6([G,...z])};`)}return`{
290
- ${Y.join(`
292
+ `}function vO($,Q,Z,X={}){if(Z.type===w.TypeScriptAxios)return yO($,Q,Z,X);if(Z.type===w.TypeScriptAngular)return xO($,Q,Z,Z.providedIn??"root",X);return fO($,Q,Z,X)}function Y9($){return[...new Set($)].join(" | ")}function JZ($){if(!$)return"unknown";if(typeof $.$ref==="string")return UZ(eQ($.$ref,"schemas"));if(Array.isArray($.enum))return $.enum.map((Q)=>JSON.stringify(Q)).join(" | ");if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let Q=i($.items)?$.items:void 0;return`Array<${JZ(Q)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function hO($,Q,Z){if($.kind!=="object")return B1($,Q,Z);let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${B1($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let Y=" ".repeat(Z),W=" ".repeat(Z+1),U=oW(Q),J=X.map(([G,_])=>{let H=rW(G,U),V=$.required.includes(G)?"":"?";return`${W}${m2(H)}${V}: ${B1(_,Q,Z+1)};`});if($.additionalProperties){let G=B1($.additionalProperties,Q,Z+1),_=X.map(([H,V])=>{let q=$.required.includes(H)?[]:["undefined"];return Y9([B1(V,Q,Z+1),...q])});J.push(`${W}[key: string]: ${G==="unknown"?"unknown":Y9([G,..._])};`)}return`{
293
+ ${J.join(`
291
294
  `)}
292
- ${U}}`}function Z1($,Q,Z=1){if($.kind==="ref")return C1($.refName);if($.kind==="enum")return VQ($.enumName);if($.kind==="array")return`Array<${Z1($.items,Q,Z)}>`;if($.kind==="object")return kK($,Q,Z);if($.kind==="unknown")return"unknown";if($.scalar==="integer")return"number";return $.scalar}function PK($,Q){let Z=[...$];if(Q.enumUnknownDefaultCase===!0&&Z.every((X)=>typeof X==="string"))Z.push(hK);return Z}function bK($,Q,Z){let X=VQ($),U=PK(Q,Z).map((W)=>({key:MK(W,Z.enumPropertyNaming),value:W}));return[`export const ${X} = {`,...U.map((W)=>` ${L2(W.key)}: ${JSON.stringify(W.value)},`),"} as const;",`export type ${X} = (typeof ${X})[keyof typeof ${X}];`].join(`
293
- `)}function yK($,Q){return Q.sortModelPropertiesByRequiredFlag===!1?$.properties:[...$.properties].sort((Z,X)=>Number(Z.optional)-Number(X.optional))}function fK($,Q,Z){let X=LU($.name,Z),U=Z1($.schema,Q),J=$.optional?"?":"",W=$.nullable?" | null":"";return` ${L2(X)}${J}: ${U}${W};`}function vK($,Q){let Z=$.optional?["undefined"]:[],X=$.nullable?["null"]:[];return R6([Z1($.schema,Q),...X,...Z])}function xK($,Q,Z){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let X=Z1($.schema.additionalProperties,Z),U=Q.map((J)=>vK(J,Z));return` [key: string]: ${X==="unknown"?"unknown":R6([X,...U])};`}function gK($,Q){let Z=MU(Q),X=yK($,Q),U=[`export interface ${C1($.schemaName)} {`];U.push(...X.map((W)=>fK(W,Q,Z)));let J=xK($,X,Q);if(J)U.push(J);if(X.length===0&&!J)U.push(" // empty schema");return U.push("}"),U.join(`
294
- `)}function jU($,Q){let Z=["/* Generated by Kontract. */"];for(let X of $.enumGroups)Z.push(bK(X.name,X.values,Q));for(let X of $.dtoModels)Z.push(gK(X,Q));return`${Z.join(`
295
+ ${Y}}`}function B1($,Q,Z=1){if($.kind==="ref")return l1($.refName);if($.kind==="enum")return UZ($.enumName);if($.kind==="array")return`Array<${B1($.items,Q,Z)}>`;if($.kind==="object")return hO($,Q,Z);if($.kind==="unknown")return"unknown";if($.scalar==="integer")return"number";return $.scalar}function uO($,Q){let Z=[...$];if(Q.enumUnknownDefaultCase===!0&&Z.every((X)=>typeof X==="string"))Z.push(rO);return Z}function dO($,Q,Z){let X=UZ($),Y=uO(Q,Z).map((U)=>({key:RO(U,Z.enumPropertyNaming),value:U}));return[`export const ${X} = {`,...Y.map((U)=>` ${m2(U.key)}: ${JSON.stringify(U.value)},`),"} as const;",`export type ${X} = (typeof ${X})[keyof typeof ${X}];`].join(`
296
+ `)}function mO($,Q){return Q.sortModelPropertiesByRequiredFlag===!1?$.properties:[...$.properties].sort((Z,X)=>Number(Z.optional)-Number(X.optional))}function lO($,Q,Z){let X=rW($.name,Z),Y=B1($.schema,Q),W=$.optional?"?":"",U=$.nullable?" | null":"";return` ${m2(X)}${W}: ${Y}${U};`}function pO($,Q){let Z=$.optional?["undefined"]:[],X=$.nullable?["null"]:[];return Y9([B1($.schema,Q),...X,...Z])}function cO($,Q,Z){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let X=B1($.schema.additionalProperties,Z),Y=Q.map((W)=>pO(W,Z));return` [key: string]: ${X==="unknown"?"unknown":Y9([X,...Y])};`}function nO($,Q){let Z=oW(Q),X=mO($,Q),Y=[`export interface ${l1($.schemaName)} {`];Y.push(...X.map((U)=>lO(U,Q,Z)));let W=cO($,X,Q);if(W)Y.push(W);if(X.length===0&&!W)Y.push(" // empty schema");return Y.push("}"),Y.join(`
297
+ `)}function aW($,Q){let Z=["/* Generated by Kontract. */"];for(let X of $.enumGroups)Z.push(dO(X.name,X.values,Q));for(let X of $.dtoModels)Z.push(nO(X,Q));return`${Z.join(`
295
298
 
296
299
  `)}
297
- `}function EU($,Q){let Z=Q===O$.Post?h5:g5;for(let U of Z){let J=$[U];if(j(J))return{statusCode:U,response:J}}let X=Object.keys($).filter((U)=>u5.test(U)).sort((U,J)=>Number(U)-Number(J));for(let U of X){let J=$[U];if(j(J))return{statusCode:U,response:J}}return null}function dK($){let Q=p($.components)?$.components:{};return{schemas:p(Q.schemas)?Q.schemas:{},parameters:p(Q.parameters)?Q.parameters:{},requestBodies:p(Q.requestBodies)?Q.requestBodies:{},responses:p(Q.responses)?Q.responses:{}}}function OQ($,Q,Z){if(!p($)||typeof $.$ref!=="string")return $;let X=UQ($.$ref,Z);return Q[Z][X]}function mK($,Q){return uK(`${$} ${Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ")}`)}function SU($){if(!Array.isArray($.enum))return null;let Q=[];for(let Z of $.enum){if(typeof Z!=="string"&&typeof Z!=="number")return null;Q.push(Z)}return Q.length>0?Q:null}function lK($,Q,Z,X){let U=n$(Q);if(X.inlineEnums==="literal")return Z.map((W)=>JSON.stringify(W)).join(" | ");let J=$.get(U);if(J){if(!(J.values.length===Z.length&&J.values.every((Y,G)=>Y===Z[G])))throw Error(`Inline SDK enum name collision for '${U}'`);return`${X.model}.${n$(J.name)}`}return $.set(U,{name:U,schemaPath:`sdk:inline:${U}`,values:Z,members:Z.map((W)=>({key:p9(W),value:W}))}),`${X.model}.${U}`}function pK($,Q,Z,X){let U=UQ($,"schemas"),J=Q.schemas[U];if(p(J)&&SU(J))return`${X.enum}.${n$(U)}`;if(p(J)&&J.type!=="object")return W2(J,Q,Z,n$(U),X)??"unknown";return`${X.model}.${n$(U)}`}function W2($,Q,Z,X,U){if(!$)return null;if(typeof $.$ref==="string")return pK($.$ref,Q,Z,U);let J=SU($);if(J)return lK(Z,X,J,U);if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let W=p($.items)?$.items:void 0;return`Array<${W2(W,Q,Z,`${X}Item`,U)??HQ(W)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function cK($,Q){let Z=OQ($,Q,"parameters");return p(Z)?Z:null}function nK($,Q){let Z=[...Array.isArray($)?$:[],...Array.isArray(Q)?Q:[]],X=new Map;for(let U of Z){if(!p(U))continue;if(typeof U.$ref==="string"){X.set(U.$ref,U);continue}let J=I6(U.in),W=I6(U.name);if(J&&W)X.set(`${J}:${W}`,U)}return[...X.values()]}function iK($,Q){let Z=OQ($.requestBody,Q,"requestBodies");if(!p(Z)||!p(Z.content))return;return i6(Z.content)??void 0}function rK($,Q,Z){let X=p($.responses)?$.responses:{},U=EU(X,Z);if(!U)return;let J=OQ(U.response,Q,"responses");if(!p(J)||!p(J.content))return;return i6(J.content)??void 0}function oK($,Q,Z=IU){let X=p($.paths)?$.paths:{},U=dK($),J=[],W=new Map;for(let[Y,G]of Object.entries(X)){if(!p(G))continue;for(let z of FU){let _=G[z];if(!p(_))continue;let V=I6(_.operationId)??mK(z,Y),O=nK(G.parameters,_.parameters).map((T)=>cK(T,U)).filter((T)=>Boolean(T)).filter((T)=>T.in===W$.Path||T.in===W$.Query).map((T)=>{let R=I6(T.name)??"param",k=AK(R,Q.paramNaming),x=T.in===W$.Path?W$.Path:W$.Query,y=p(T.schema)?T.schema:void 0,Y$=`${n$(V)}${n$(R)}`;return{name:k,variableName:jK(k),wireName:R,location:x,required:T.required===!0||x===W$.Path,typeName:W2(y,U,W,Y$,Z)??HQ(y)}}),K=Q.sortParamsByRequiredFlag===!1?O:O.sort((T,R)=>Number(!T.required)-Number(!R.required)),q=iK(_,U),B=rK(_,U,z),F=W2(B,U,W,`${n$(V)}Response`,Z)??"unknown",C=W2(q,U,W,`${n$(V)}RequestBody`,Z);J.push({operationId:V,method:z.toUpperCase(),path:Y,functionName:AU(V),requestName:`${n$(V)}Request`,responseType:F,bodyType:C,parameters:K})}}return{operations:J.sort((Y,G)=>Y.operationId.localeCompare(G.operationId)),inlineEnumGroups:[...W.values()].sort((Y,G)=>Y.name.localeCompare(G.name))}}async function NU($,Q,Z){return Z?f6($,Q):$}async function eK($,Q,Z,X,U){let J=!1,W=RU(Q,"models.ts"),Y=await NU(jU($,Z),W,U);if(await s(W,Y))J=!0;if(X)DU.step(` \u2713 ${W}`);if(await F1(Q,["./models"]))J=!0;return J}async function $q($){let Q=!1,Z={model:"Models",enum:$.enumImportPath===$.modelImportPath?"Models":"Enums",inlineEnums:$.inlineEnumsAsLiterals?"literal":"models"},{operations:X,inlineEnumGroups:U}=oK($.rawDoc,$.generator,Z),J=new Set($.extraction.enumGroups.map((z)=>z.name)),W={...$.extraction,enumGroups:[...$.extraction.enumGroups,...U.filter((z)=>!J.has(z.name))]},Y=[["runtime.ts",EK()],["api.ts",NK(X,$.service,$.generator,{modelImportPath:$.modelImportPath,enumImportPath:$.enumImportPath})]];if($.emitModels)Y.unshift(["models.ts",jU(W,$.generator)]);for(let[z,_]of Y){let V=RU($.outputDir,z),H=await NU(_,V,$.formatFiles);if(await s(V,H))Q=!0;if($.verbose)DU.step(` \u2713 ${V}`)}let G=$.emitModels?["./models","./api"]:["./api"];if(await F1($.outputDir,G))Q=!0;return Q}async function wU($){return $q($)}async function Qq($,Q,Z,X,U={}){let J=sK(Q);try{let W=await tK.parse($,{validate:{spec:!1}});if(!p(W))throw Error("OpenAPI document must be an object");let G=(Z.schemaMode??"normalize")==="normalize"?OU(W).doc:W;r6(G,{enforceOperationSchemaRefs:!0});let z=YU(G);if(Z.type===w.TypeScriptModels){let V=await eK(z,Q,Z,X,U.formatFiles!==!1);return{success:!0,service:J,changed:V}}let _=await wU({rawDoc:G,extraction:z,outputDir:Q,service:J,generator:Z,verbose:X,formatFiles:U.formatFiles!==!1,emitModels:U.emitModels!==!1,inlineEnumsAsLiterals:U.inlineEnumsAsLiterals===!0,modelImportPath:U.modelImportPath??"./models",enumImportPath:U.enumImportPath??U.modelImportPath??"./models"});return{success:!0,service:J,changed:_}}catch(W){return{success:!1,service:J,error:W instanceof Error?W:Error(String(W))}}}function f($){return typeof $==="object"&&$!==null}function p$($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function c$($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function z2($){if(typeof $==="string")return`'${c$($)}'`;if(typeof $==="number"||typeof $==="boolean")return String($);if($===null)return"null";if(Array.isArray($))return`[${$.map((Q)=>z2(Q)).join(", ")}]`;if(f($))return`{ ${Object.entries($).map(([Z,X])=>{return`${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(Z)?Z:`'${c$(Z)}'`}: ${z2(X)}`}).join(", ")} }`;return"undefined"}function F0($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/${Q}/<Name>'`);return Z[1]}function Xq($){let Q=f($.components)?$.components:{};return{schemas:f(Q.schemas)?Q.schemas:{},parameters:f(Q.parameters)?Q.parameters:{},requestBodies:f(Q.requestBodies)?Q.requestBodies:{},responses:f(Q.responses)?Q.responses:{}}}function Uq($,Q){if(!$)return;if(typeof $.$ref==="string"){let Z=F0($.$ref,Q0.Schemas),X=Q.schemas[Z];return f(X)?X:void 0}return $}function Jq($){if(!$)return!1;if(Array.isArray($.enum))return!1;if(Array.isArray($.allOf))return!0;if($.type!=="object"&&!f($.properties))return!1;return f($.properties)&&Object.keys($.properties).length>0}function L5($,Q,Z="dto"){if(!$||typeof $.$ref!=="string")return;let X=F0($.$ref,Q0.Schemas),U=Q.schemas[X];if(!f(U)||!Jq(U))return;return{name:$0(X),importPath:Wq($,Z)}}function Wq($,Q){if(!$||typeof $.$ref!=="string")throw Error("Expected schema $ref while building DTO import path");let Z=F0($.$ref,Q0.Schemas);if(Q==="zod")return`./zod/${l9(Z).replace(/\.ts$/,"")}`;return`./dto/${m9(Z).replace(/\.ts$/,"")}`}function A5($){return i6($)??void 0}function Yq($,Q){let Z=$.requestBody;if(!f(Z))return;if(typeof Z.$ref==="string"){let X=F0(Z.$ref,Q0.RequestBodies),U=Q.requestBodies[X];return f(U)?U:void 0}return Z}function Gq($,Q){if(!f($))return;if(typeof $.$ref==="string"){let Z=F0($.$ref,Q0.Responses),X=Q.responses[Z];return f(X)?X:void 0}return $}function zq($){if(!Array.isArray($))return;let Q=[];for(let Z of $){if(typeof Z!=="string"&&typeof Z!=="number"&&typeof Z!=="boolean")return;Q.push(Z)}return Q}function PU($,Q){let Z=Uq($,Q);if(!Z)return{};let X=Z.type,U=zq(Z.enum),J=Z.example;if(X==="array"){let W=f(Z.items)?Z.items:void 0,Y=PU(W,Q);return{typeCtor:Y.typeCtor??L0.String,isArray:!0,enumValues:Y.enumValues,example:J??Y.example}}if(X==="string")return{typeCtor:L0.String,enumValues:U,example:J};if(X==="number"||X==="integer")return{typeCtor:L0.Number,enumValues:U,example:J};if(X==="boolean")return{typeCtor:L0.Boolean,enumValues:U,example:J};if(X==="object")return{typeCtor:L0.Object,enumValues:U,example:J};return{enumValues:U,example:J}}function _q($,Q){if(!f($))return;if(typeof $.$ref==="string"){let Z=F0($.$ref,Q0.Parameters),X=Q.parameters[Z];return f(X)?X:void 0}return $}function Vq($,Q){let Z=_q($,Q);if(!Z)return;let X=Z.in;if(X!==W$.Path&&X!==W$.Query)return;let U=p$(Z.name);if(!U)return;let J=f(Z.schema)?Z.schema:void 0,W=PU(J,Q),Y=Z.required===!0||X===W$.Path,G=p$(Z.description),z=Z.example??W.example;return{location:X,name:U,required:Y,description:G,typeCtor:W.typeCtor,isArray:W.isArray,enumValues:W.enumValues,example:z}}function Hq($,Q){if(!Array.isArray($))return{path:[],query:[]};let Z=new Map;for(let J of $){let W=Vq(J,Q);if(!W)continue;Z.set(`${W.location}:${W.name}`,W)}let X=[],U=[];for(let J of Z.values()){if(J.location===W$.Path)X.push(J);if(J.location===W$.Query)U.push(J)}return{path:X.sort((J,W)=>J.name.localeCompare(W.name)),query:U.sort((J,W)=>J.name.localeCompare(W.name))}}function Oq($,Q){let Z=new Map,X=(U)=>{if(!Array.isArray(U))return;for(let J of U){if(!f(J))continue;if(typeof J.$ref==="string"){Z.set(J.$ref,J);continue}let W=p$(J.in),Y=p$(J.name);if(!W||!Y)continue;Z.set(`${W}:${Y}`,J)}};return X($),X(Q),[...Z.values()]}function Bq($,Q){let Z=Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ").trim(),X=`${$} ${Z||"root"}`;return qq(X)}function Lq($,Q){let Z=$,X=2;while(Q.has(Z))Z=`${$}_${X}`,X+=1;return Q.add(Z),Z}function Aq($,Q,Z,X,U,J,W,Y){let G=p$(Z.operationId)??Bq(Q,$),z=Lq(E0(G),W),_=Oq(U,Z.parameters),V=Hq(_,J),H=Yq(Z,J),O=f(H?.content)?H.content:void 0,K=O?A5(O):void 0,q=L5(K,J,Y),B=f(Z.responses)?Z.responses:{},F=EU(B,Q),C=F?Gq(F.response,J):void 0,T=f(C?.content)?C.content:void 0,R=T?A5(T):void 0,k=L5(R,J,Y),x=p$(C?.description),y=p$(Z.summary)??`${Q.toUpperCase()} ${$}`,Y$=p$(Z.description)??y,_0=p$(Z["x-kontract-surface"])??p$(X["x-kontract-surface"]),p8=Mq(Z.security??X.security);return{key:z,constantName:`SWG_${z}`,operationId:G,method:Q.toUpperCase(),path:$,summary:y,description:Y$,security:p8,successStatus:F?Number(F.statusCode):void 0,surface:_0,bodyDtoName:q?.name,bodyDtoImportPath:q?.importPath,responseDtoName:k?.name,responseDtoImportPath:k?.importPath,responseDescription:x,paramDto:V.path,queryDto:V.query}}function Mq($){if(!Array.isArray($))return;let Q=[];for(let Z of $){if(!f(Z))return;let X={};for(let[U,J]of Object.entries(Z)){if(!Array.isArray(J)||!J.every((W)=>typeof W==="string"))return;X[U]=J}Q.push(X)}return Q}function jq($,Q="dto"){let Z=f($.paths)?$.paths:{},X=Xq($),U=[],J=new Set;for(let[W,Y]of Object.entries(Z)){if(!f(Y))continue;let G=Y.parameters;for(let z of bU){let _=Y[z];if(!f(_))continue;U.push(Aq(W,z,_,$,G,X,J,Q))}}return U.sort((W,Y)=>{let G=W.path.localeCompare(Y.path);if(G!==0)return G;return W.method.localeCompare(Y.method)})}function M5($){let Q=[`name: '${c$($.name)}'`];if($.required===!0)Q.push("required: true");if($.description)Q.push(`description: '${c$($.description)}'`);if($.typeCtor)Q.push(`type: ${$.typeCtor}`);if($.isArray)Q.push("isArray: true");if($.enumValues&&$.enumValues.length>0)Q.push(`enum: ${z2($.enumValues)}`);if($.example!==void 0)Q.push(`example: ${z2($.example)}`);return`{ ${Q.join(", ")} }`}function Eq($){let Q=[];if(Q.push("/**"),Q.push(` * ${$.summary}`),Q.push(` * @operationId ${$.operationId}`),Q.push(` * @route ${$.method} ${$.path}`),Q.push(" */"),Q.push(`export const ${$.constantName} = {`),Q.push(` operationId: '${c$($.operationId)}',`),Q.push(` method: '${$.method}',`),Q.push(` path: '${c$($.path)}',`),Q.push(` summary: '${c$($.summary)}',`),Q.push(` description: '${c$($.description)}',`),$.surface)Q.push(` surface: '${c$($.surface)}',`);if($.security)Q.push(` security: ${z2($.security)},`);if(typeof $.successStatus==="number")Q.push(` successStatus: ${$.successStatus},`);if($.paramDto.length>0){let Z=$.paramDto.map((X)=>` ${M5(X)}`).join(`,
300
+ `}function tW($,Q){let Z=Q===O$.Post?QY:$Y;for(let Y of Z){let W=$[Y];if(T(W))return{statusCode:Y,response:W}}let X=Object.keys($).filter((Y)=>ZY.test(Y)).sort((Y,W)=>Number(Y)-Number(W));for(let Y of X){let W=$[Y];if(T(W))return{statusCode:Y,response:W}}return null}function oO($){let Q=i($.components)?$.components:{};return{schemas:i(Q.schemas)?Q.schemas:{},parameters:i(Q.parameters)?Q.parameters:{},requestBodies:i(Q.requestBodies)?Q.requestBodies:{},responses:i(Q.responses)?Q.responses:{}}}function GZ($,Q,Z){if(!i($)||typeof $.$ref!=="string")return $;let X=eQ($.$ref,Z);return Q[Z][X]}function aO($,Q){return iO(`${$} ${Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ")}`)}function $U($){if(!Array.isArray($.enum))return null;let Q=[];for(let Z of $.enum){if(typeof Z!=="string"&&typeof Z!=="number")return null;Q.push(Z)}return Q.length>0?Q:null}function sO($,Q,Z,X){let Y=s$(Q);if(X.inlineEnums==="literal")return Z.map((U)=>JSON.stringify(U)).join(" | ");let W=$.get(Y);if(W){if(!(W.values.length===Z.length&&W.values.every((J,G)=>J===Z[G])))throw Error(`Inline SDK enum name collision for '${Y}'`);return`${X.model}.${s$(W.name)}`}return $.set(Y,{name:Y,schemaPath:`sdk:inline:${Y}`,values:Z,members:Z.map((U)=>({key:gQ(U),value:U}))}),`${X.model}.${Y}`}function tO($,Q,Z,X){let Y=eQ($,"schemas"),W=Q.schemas[Y];if(i(W)&&$U(W))return`${X.enum}.${s$(Y)}`;if(i(W)&&W.type!=="object")return w2(W,Q,Z,s$(Y),X)??"unknown";return`${X.model}.${s$(Y)}`}function w2($,Q,Z,X,Y){if(!$)return null;if(typeof $.$ref==="string")return tO($.$ref,Q,Z,Y);let W=$U($);if(W)return sO(Z,X,W,Y);if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let U=i($.items)?$.items:void 0;return`Array<${w2(U,Q,Z,`${X}Item`,Y)??JZ(U)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function eO($,Q){let Z=GZ($,Q,"parameters");return i(Z)?Z:null}function $z($,Q){let Z=[...Array.isArray($)?$:[],...Array.isArray(Q)?Q:[]],X=new Map;for(let Y of Z){if(!i(Y))continue;if(typeof Y.$ref==="string"){X.set(Y.$ref,Y);continue}let W=X9(Y.in),U=X9(Y.name);if(W&&U)X.set(`${W}:${U}`,Y)}return[...X.values()]}function Qz($,Q){let Z=GZ($.requestBody,Q,"requestBodies");if(!i(Z)||!i(Z.content))return;return S9(Z.content)??void 0}function Zz($,Q,Z){let X=i($.responses)?$.responses:{},Y=tW(X,Z);if(!Y)return;let W=GZ(Y.response,Q,"responses");if(!i(W)||!i(W.content))return;return S9(W.content)??void 0}function Xz($,Q,Z=ZU){let X=i($.paths)?$.paths:{},Y=oO($),W=[],U=new Map;for(let[J,G]of Object.entries(X)){if(!i(G))continue;for(let _ of QU){let H=G[_];if(!i(H))continue;let V=X9(H.operationId)??aO(_,J),K=$z(G.parameters,H.parameters).map((C)=>eO(C,Y)).filter((C)=>Boolean(C)).filter((C)=>C.in===_$.Path||C.in===_$.Query).map((C)=>{let D=X9(C.name)??"param",k=IO(D,Q.paramNaming),u=C.in===_$.Path?_$.Path:_$.Query,x=i(C.schema)?C.schema:void 0,V$=`${s$(V)}${s$(D)}`;return{name:k,variableName:DO(k),wireName:D,location:u,required:C.required===!0||u===_$.Path,typeName:w2(x,Y,U,V$,Z)??JZ(x)}}),B=Q.sortParamsByRequiredFlag===!1?K:K.sort((C,D)=>Number(!C.required)-Number(!D.required)),L=Qz(H,Y),O=Zz(H,Y,_),S=w2(O,Y,U,`${s$(V)}Response`,Z)??"unknown",M=w2(L,Y,U,`${s$(V)}RequestBody`,Z);W.push({operationId:V,method:_.toUpperCase(),path:J,functionName:iW(V),requestName:`${s$(V)}Request`,responseType:S,bodyType:M,parameters:B})}}return{operations:W.sort((J,G)=>J.operationId.localeCompare(G.operationId)),inlineEnumGroups:[...U.values()].sort((J,G)=>J.name.localeCompare(G.name))}}async function WU($,Q,Z){return Z?V9($,Q):$}async function Jz($,Q,Z,X,Y){let W=!1,U=XU(Q,"models.ts"),J=await WU(aW($,Z),U,Y);if(await e(U,J))W=!0;if(X)YU.step(` \u2713 ${U}`);if(await p1(Q,["./models"]))W=!0;return W}async function Gz($){let Q=!1,Z={model:"Models",enum:$.enumImportPath===$.modelImportPath?"Models":"Enums",inlineEnums:$.inlineEnumsAsLiterals?"literal":"models"},{operations:X,inlineEnumGroups:Y}=Xz($.rawDoc,$.generator,Z),W=new Set($.extraction.enumGroups.map((_)=>_.name)),U={...$.extraction,enumGroups:[...$.extraction.enumGroups,...Y.filter((_)=>!W.has(_.name))]},J=[["runtime.ts",wO()],["api.ts",vO(X,$.service,$.generator,{modelImportPath:$.modelImportPath,enumImportPath:$.enumImportPath})]];if($.emitModels)J.unshift(["models.ts",aW(U,$.generator)]);for(let[_,H]of J){let V=XU($.outputDir,_),q=await WU(H,V,$.formatFiles);if(await e(V,q))Q=!0;if($.verbose)YU.step(` \u2713 ${V}`)}let G=$.emitModels?["./models","./api"]:["./api"];if(await p1($.outputDir,G))Q=!0;return Q}async function UU($){return Gz($)}async function _z($,Q,Z,X,Y={}){let W=Wz(Q);try{let U=await Uz.parse($,{validate:{spec:!1}});if(!i(U))throw Error("API schema document must be an object");let G=(Z.schemaMode??"normalize")==="normalize"?lW(U).doc:U;I9(G,{enforceOperationSchemaRefs:!0});let _=PW(G);if(Z.type===w.TypeScriptModels){let V=await Jz(_,Q,Z,X,Y.formatFiles!==!1);return{success:!0,service:W,changed:V}}let H=await UU({rawDoc:G,extraction:_,outputDir:Q,service:W,generator:Z,verbose:X,formatFiles:Y.formatFiles!==!1,emitModels:Y.emitModels!==!1,inlineEnumsAsLiterals:Y.inlineEnumsAsLiterals===!0,modelImportPath:Y.modelImportPath??"./models",enumImportPath:Y.enumImportPath??Y.modelImportPath??"./models"});return{success:!0,service:W,changed:H}}catch(U){return{success:!1,service:W,error:U instanceof Error?U:Error(String(U))}}}function v($){return typeof $==="object"&&$!==null}function o$($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function a$($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function x2($){if(typeof $==="string")return`'${a$($)}'`;if(typeof $==="number"||typeof $==="boolean")return String($);if($===null)return"null";if(Array.isArray($))return`[${$.map((Q)=>x2(Q)).join(", ")}]`;if(v($))return`{ ${Object.entries($).map(([Z,X])=>{return`${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(Z)?Z:`'${a$(Z)}'`}: ${x2(X)}`}).join(", ")} }`;return"undefined"}function n0($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/${Q}/<Name>'`);return Z[1]}function Vz($){let Q=v($.components)?$.components:{};return{schemas:v(Q.schemas)?Q.schemas:{},parameters:v(Q.parameters)?Q.parameters:{},requestBodies:v(Q.requestBodies)?Q.requestBodies:{},responses:v(Q.responses)?Q.responses:{}}}function qz($,Q){if(!$)return;if(typeof $.$ref==="string"){let Z=n0($.$ref,z0.Schemas),X=Q.schemas[Z];return v(X)?X:void 0}return $}function Kz($){if(!$)return!1;if(Array.isArray($.enum))return!1;if(Array.isArray($.allOf))return!0;if($.type!=="object"&&!v($.properties))return!1;return v($.properties)&&Object.keys($.properties).length>0}function SX($,Q,Z="dto"){if(!$||typeof $.$ref!=="string")return;let X=n0($.$ref,z0.Schemas),Y=Q.schemas[X];if(!v(Y)||!Kz(Y))return;return{name:O0(X),importPath:Bz($,Z)}}function Bz($,Q){if(!$||typeof $.$ref!=="string")throw Error("Expected schema $ref while building DTO import path");let Z=n0($.$ref,z0.Schemas);if(Q==="zod")return`./zod/${vQ(Z).replace(/\.ts$/,"")}`;return`./dto/${xQ(Z).replace(/\.ts$/,"")}`}function IX($){return S9($)??void 0}function Az($,Q){let Z=$.requestBody;if(!v(Z))return;if(typeof Z.$ref==="string"){let X=n0(Z.$ref,z0.RequestBodies),Y=Q.requestBodies[X];return v(Y)?Y:void 0}return Z}function Lz($,Q){if(!v($))return;if(typeof $.$ref==="string"){let Z=n0($.$ref,z0.Responses),X=Q.responses[Z];return v(X)?X:void 0}return $}function Oz($){if(!Array.isArray($))return;let Q=[];for(let Z of $){if(typeof Z!=="string"&&typeof Z!=="number"&&typeof Z!=="boolean")return;Q.push(Z)}return Q}function GU($,Q){let Z=qz($,Q);if(!Z)return{};let X=Z.type,Y=Oz(Z.enum),W=Z.example;if(X==="array"){let U=v(Z.items)?Z.items:void 0,J=GU(U,Q);return{typeCtor:J.typeCtor??x0.String,isArray:!0,enumValues:J.enumValues,example:W??J.example}}if(X==="string")return{typeCtor:x0.String,enumValues:Y,example:W};if(X==="number"||X==="integer")return{typeCtor:x0.Number,enumValues:Y,example:W};if(X==="boolean")return{typeCtor:x0.Boolean,enumValues:Y,example:W};if(X==="object")return{typeCtor:x0.Object,enumValues:Y,example:W};return{enumValues:Y,example:W}}function zz($,Q){if(!v($))return;if(typeof $.$ref==="string"){let Z=n0($.$ref,z0.Parameters),X=Q.parameters[Z];return v(X)?X:void 0}return $}function jz($,Q){let Z=zz($,Q);if(!Z)return;let X=Z.in;if(X!==_$.Path&&X!==_$.Query)return;let Y=o$(Z.name);if(!Y)return;let W=v(Z.schema)?Z.schema:void 0,U=GU(W,Q),J=Z.required===!0||X===_$.Path,G=o$(Z.description),_=Z.example??U.example;return{location:X,name:Y,required:J,description:G,typeCtor:U.typeCtor,isArray:U.isArray,enumValues:U.enumValues,example:_}}function Tz($,Q){if(!Array.isArray($))return{path:[],query:[]};let Z=new Map;for(let W of $){let U=jz(W,Q);if(!U)continue;Z.set(`${U.location}:${U.name}`,U)}let X=[],Y=[];for(let W of Z.values()){if(W.location===_$.Path)X.push(W);if(W.location===_$.Query)Y.push(W)}return{path:X.sort((W,U)=>W.name.localeCompare(U.name)),query:Y.sort((W,U)=>W.name.localeCompare(U.name))}}function Ez($,Q){let Z=new Map,X=(Y)=>{if(!Array.isArray(Y))return;for(let W of Y){if(!v(W))continue;if(typeof W.$ref==="string"){Z.set(W.$ref,W);continue}let U=o$(W.in),J=o$(W.name);if(!U||!J)continue;Z.set(`${U}:${J}`,W)}};return X($),X(Q),[...Z.values()]}function Mz($,Q){let Z=Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ").trim(),X=`${$} ${Z||"root"}`;return Fz(X)}function Sz($,Q){let Z=$,X=2;while(Q.has(Z))Z=`${$}_${X}`,X+=1;return Q.add(Z),Z}function Iz($,Q,Z,X,Y,W,U,J){let G=o$(Z.operationId)??Mz(Q,$),_=Sz(l0(G),U),H=Ez(Y,Z.parameters),V=Tz(H,W),q=Az(Z,W),K=v(q?.content)?q.content:void 0,B=K?IX(K):void 0,L=SX(B,W,J),O=v(Z.responses)?Z.responses:{},S=tW(O,Q),M=S?Lz(S.response,W):void 0,C=v(M?.content)?M.content:void 0,D=C?IX(C):void 0,k=SX(D,W,J),u=o$(M?.description),x=o$(Z.summary)??`${Q.toUpperCase()} ${$}`,V$=o$(Z.description)??x,D0=o$(Z["x-kontract-surface"])??o$(X["x-kontract-surface"]),R6=Rz(Z.security??X.security);return{key:_,constantName:`SWG_${_}`,operationId:G,method:Q.toUpperCase(),path:$,summary:x,description:V$,security:R6,successStatus:S?Number(S.statusCode):void 0,surface:D0,bodyDtoName:L?.name,bodyDtoImportPath:L?.importPath,responseDtoName:k?.name,responseDtoImportPath:k?.importPath,responseDescription:u,paramDto:V.path,queryDto:V.query}}function Rz($){if(!Array.isArray($))return;let Q=[];for(let Z of $){if(!v(Z))return;let X={};for(let[Y,W]of Object.entries(Z)){if(!Array.isArray(W)||!W.every((U)=>typeof U==="string"))return;X[Y]=W}Q.push(X)}return Q}function Dz($,Q="dto"){let Z=v($.paths)?$.paths:{},X=Vz($),Y=[],W=new Set;for(let[U,J]of Object.entries(Z)){if(!v(J))continue;let G=J.parameters;for(let _ of _U){let H=J[_];if(!v(H))continue;Y.push(Iz(U,_,H,$,G,X,W,Q))}}return Y.sort((U,J)=>{let G=U.path.localeCompare(J.path);if(G!==0)return G;return U.method.localeCompare(J.method)})}function RX($){let Q=[`name: '${a$($.name)}'`];if($.required===!0)Q.push("required: true");if($.description)Q.push(`description: '${a$($.description)}'`);if($.typeCtor)Q.push(`type: ${$.typeCtor}`);if($.isArray)Q.push("isArray: true");if($.enumValues&&$.enumValues.length>0)Q.push(`enum: ${x2($.enumValues)}`);if($.example!==void 0)Q.push(`example: ${x2($.example)}`);return`{ ${Q.join(", ")} }`}function wz($){let Q=[];if(Q.push("/**"),Q.push(` * ${$.summary}`),Q.push(` * @operationId ${$.operationId}`),Q.push(` * @route ${$.method} ${$.path}`),Q.push(" */"),Q.push(`export const ${$.constantName} = {`),Q.push(` operationId: '${a$($.operationId)}',`),Q.push(` method: '${$.method}',`),Q.push(` path: '${a$($.path)}',`),Q.push(` summary: '${a$($.summary)}',`),Q.push(` description: '${a$($.description)}',`),$.surface)Q.push(` surface: '${a$($.surface)}',`);if($.security)Q.push(` security: ${x2($.security)},`);if(typeof $.successStatus==="number")Q.push(` successStatus: ${$.successStatus},`);if($.paramDto.length>0){let Z=$.paramDto.map((X)=>` ${RX(X)}`).join(`,
298
301
  `);Q.push(` paramDto: [
299
302
  ${Z}
300
- ],`)}if($.queryDto.length>0){let Z=$.queryDto.map((X)=>` ${M5(X)}`).join(`,
303
+ ],`)}if($.queryDto.length>0){let Z=$.queryDto.map((X)=>` ${RX(X)}`).join(`,
301
304
  `);Q.push(` queryDto: [
302
305
  ${Z}
303
- ],`)}if($.bodyDtoName)Q.push(` bodyDto: ${$.bodyDtoName},`);if($.responseDtoName)Q.push(` responseDto: ${$.responseDtoName},`);if($.responseDescription)Q.push(` responseDescription: '${c$($.responseDescription)}',`);return Q.push("} as const;"),Q.join(`
304
- `)}function Cq($,Q){if(!f($))return`export const SWAGGER_OPERATIONS = {} as const;
305
- `;let Z=jq($,Q),X=new Map;for(let z of Z){if(z.bodyDtoName&&z.bodyDtoImportPath){let _=X.get(z.bodyDtoImportPath)??new Set;_.add(z.bodyDtoName),X.set(z.bodyDtoImportPath,_)}if(z.responseDtoName&&z.responseDtoImportPath){let _=X.get(z.responseDtoImportPath)??new Set;_.add(z.responseDtoName),X.set(z.responseDtoImportPath,_)}}let U=[...X.entries()].sort(([z],[_])=>z.localeCompare(_)).map(([z,_])=>{return`import { ${[..._].sort((H,O)=>H.localeCompare(O)).join(", ")} } from '${z}';`}).join(`
306
- `),J=U.length>0?`${U}
306
+ ],`)}if($.bodyDtoName)Q.push(` bodyDto: ${$.bodyDtoName},`);if($.responseDtoName)Q.push(` responseDto: ${$.responseDtoName},`);if($.responseDescription)Q.push(` responseDescription: '${a$($.responseDescription)}',`);return Q.push("} as const;"),Q.join(`
307
+ `)}function bz($,Q){if(!v($))return`export const SWAGGER_OPERATIONS = {} as const;
308
+ `;let Z=Dz($,Q),X=new Map;for(let _ of Z){if(_.bodyDtoName&&_.bodyDtoImportPath){let H=X.get(_.bodyDtoImportPath)??new Set;H.add(_.bodyDtoName),X.set(_.bodyDtoImportPath,H)}if(_.responseDtoName&&_.responseDtoImportPath){let H=X.get(_.responseDtoImportPath)??new Set;H.add(_.responseDtoName),X.set(_.responseDtoImportPath,H)}}let Y=[...X.entries()].sort(([_],[H])=>_.localeCompare(H)).map(([_,H])=>{return`import { ${[...H].sort((q,K)=>q.localeCompare(K)).join(", ")} } from '${_}';`}).join(`
309
+ `),W=Y.length>0?`${Y}
307
310
 
308
- `:"";if(Z.length===0)return`${J}export const SWAGGER_OPERATIONS = {} as const;
309
- `;let W=Z.map((z)=>Eq(z)).join(`
311
+ `:"";if(Z.length===0)return`${W}export const SWAGGER_OPERATIONS = {} as const;
312
+ `;let U=Z.map((_)=>wz(_)).join(`
310
313
 
311
- `),G=`/** Generated OpenAPI operation metadata map. */
314
+ `),G=`/** Generated API operation metadata map. */
312
315
  export const SWAGGER_OPERATIONS = {
313
- ${Z.map((z)=>` ${z.key}: ${z.constantName},`).join(`
316
+ ${Z.map((_)=>` ${_.key}: ${_.constantName},`).join(`
314
317
  `)}
315
- } as const;`;return`${J}${W}
318
+ } as const;`;return`${W}${U}
316
319
 
317
320
  ${G}
318
- `}async function Iq($){let Q;try{Q=await fU($,{withFileTypes:!0})}catch{return!1}let Z=!1;return await Promise.all(Q.filter((X)=>X.isFile()&&X.name.endsWith(p5)).map(async(X)=>{await t6(a($,X.name),{force:!0}),Z=!0})),Z}async function xU($){try{await yU($)}catch{return!1}return await t6($,{force:!0}),!0}function Rq($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function Dq($,Q){if(!Rq($))throw Error("OpenAPI document must be an object");if(Q==="normalize")return OU($).doc;return $}async function e6($){try{await yU($)}catch{return!1}return await t6($,{recursive:!0,force:!0}),!0}async function Nq($,Q){let Z;try{Z=await fU($,{withFileTypes:!0})}catch{return!1}let X=!1;return await Promise.all(Z.filter((U)=>U.isFile()&&U.name.endsWith(".contract.ts")&&!Q.has(U.name)).map(async(U)=>{await t6(a($,U.name),{force:!0}),X=!0})),X}async function j2($,Q,Z){return Z?f6($,Q):$}async function wq($,Q,Z,X){let U=!1,J=[],W=new Set;for(let Y of $.enumGroups){let G=m6(Y.name);W.add(G);let z=a(Q,G),_=await j2(gX(Y,"OpenAPI"),z,X);if(await s(z,_))U=!0;if(J.push(`./${G.replace(/\.ts$/,"")}`),Z)M2.step(` \u2713 ${z}`)}if(await y6(Q,W))U=!0;if(await F1(Q,J.sort()))U=!0;return U}async function kq($,Q,Z){let X=!1;for(let U of $.enumGroups){let J=d6(U.name);if(!Q.has(J)){let W=a(Z,J);if(await xU(W))X=!0}}return X}async function Pq($,Q,Z,X){let U=!1,J=[],W=new Set;for(let Y of $){let G=d6(Y.schemaName);if(W.has(G))throw Error(`Duplicate OpenAPI model output file '${G}'`);W.add(G);let z=a(Q,G),_=await j2(JK(Y),z,X);if(await s(z,_))U=!0;if(J.push(`./${G.replace(/\.ts$/,"")}`),Z)M2.step(` \u2713 ${z}`)}if(await y6(Q,W))U=!0;if(await F1(Q,J.sort()))U=!0;return U}async function bq($,Q,Z,X){let U=!1,J=[],W=new Set,Y=new Map;for(let G of $.dtoModels.filter((z)=>z.properties.length>0)){let z=m9(G.schemaName);if(W.has(z))throw Error(`Duplicate OpenAPI DTO output file '${z}'`);let _=$0(G.schemaName),V=Y.get(_);if(V)throw Error(`Duplicate OpenAPI DTO class symbol '${_}' from schemas '${V}' and '${G.schemaName}'`);Y.set(_,G.schemaName),W.add(z);let H=a(Q,z),O=await j2(MO(G),H,X);if(await s(H,O))U=!0;if(J.push(`./${z.replace(p5,".dto")}`),Z)M2.step(` \u2713 ${H}`)}if(await y6(Q,W))U=!0;return{changed:U,dtoExports:J}}async function yq($,Q,Z,X){let U=!1,J=[],W=new Set;for(let Y of $){let G=l9(Y.schemaName);if(W.has(G))throw Error(`Duplicate OpenAPI contract output file '${G}'`);W.add(G);let z=a(Q,G),_=await j2(nH(Y),z,X);if(await s(z,_))U=!0;if(J.push(`./${G.replace(/\.ts$/,"")}`),Z)M2.step(` \u2713 ${z}`)}if(await Nq(Q,W))U=!0;return{changed:U,contractExports:J}}async function fq($,Q,Z,X){let U=!1,J=await yq($,Q,Z,X);if(J.changed)U=!0;if(await F1(Q,J.contractExports.sort()))U=!0;return U}async function vq($,Q,Z,X,U){let J=await j2(Cq($,Z),Q,U),W=await s(Q,J);if(X)M2.step(` \u2713 ${Q}`);return W}function gU($){return`export * from '${$}';`}function D6($,Q){return`export * as ${$} from '${Q}';`}async function xq($,Q){let Z=Q.length>0?Q.sort().join(`
319
- `):"export {};";return s(a($,P6),`${Z}
320
- `)}async function gq($){return await Iq($)}async function hq($,Q,Z,X,U,J){if(!Z)return e6(Q);let W=await fq($,Q,X,U);return J.push(D6("ZodContracts","./zod")),W}async function uq($,Q,Z,X,U,J){if(!Z)return e6(Q);let W=await bq($,Q,X,U);return J.push(D6("Dtos","./dto")),await F1(Q,W.dtoExports.sort())||W.changed}async function dq($,Q,Z,X,U,J,W){if(!Z)return xU(Q);let G=await vq($,Q,X?"dto":"zod",U,J);return W.push(gU("./swagger")),G}async function mq($,Q,Z,X,U,J,W,Y,G,z){let{httpDir:_,dtoDir:V}=X,H=a(_,"zod"),O=a(_,"swagger.ts"),K=a(_,"decorators"),q=!1;if(await hq(Z,H,U,Y,G,z))q=!0;if(await uq($,V,J,Y,G,z))q=!0;if(await dq(Q,O,W,J,Y,G,z))q=!0;if(await e6(K))q=!0;return q}async function lq($,Q,Z,X,U,J){let W=a(Z,"http","sdk");return wU({rawDoc:Q,extraction:$,outputDir:W,service:X,generator:{type:"typescript-fetch",useSingleRequestParameter:!0},verbose:U,formatFiles:J,emitModels:!1,inlineEnumsAsLiterals:!0,modelImportPath:"../models",enumImportPath:"../enums"})}async function pq($,Q,Z,X,U){let{httpDir:J,enumDir:W,modelDir:Y}=Z,G=!1,z=await Fq.parse($,{validate:{spec:!1}}),_=U.schemaMode??"strict",V=Dq(z,_);r6(V,{enforceOperationSchemaRefs:!0});let H=YU(V),O=H.dtoModels.filter((x)=>x.source!=="operation"),K=new Set(O.map((x)=>d6(x.schemaName))),q=U.dtos===!0,B=U.zod===!0||!q,F=U.swagger===!0||q,C=U.sdk===!0,T=U.formatFiles!==!1;G=await gq(J)||G;let R=[D6("Models","./models"),gU("./enums")];if(await wq(H,W,X,T))G=!0;if(await kq(H,K,Y))G=!0;if(await Pq(O,Y,X,T))G=!0;if(await mq(H,V,O,Z,B,q,F,X,T,R))G=!0;let k=a(J,"sdk");if(C){if(await lq(H,V,Q,vU(Q),X,T))G=!0;R.push(D6("Sdk","./sdk"))}else if(await e6(k))G=!0;if(await xq(J,R))G=!0;if(await s(a(Q,P6),`export * as HttpSchemas from './http';
321
- `))G=!0;return G}async function cq($,Q,Z,X={}){let U=vU(Q);try{let J=a(Q,"http"),W={httpDir:J,dtoDir:a(J,"dto"),enumDir:a(J,"enums"),modelDir:a(J,"models")},Y=await pq($,Q,W,Z,X);return{success:!0,service:U,changed:Y}}catch(J){return{success:!1,service:U,error:J instanceof Error?J:Error(String(J))}}}function iq($){if($.success)return{success:!0,service:$.service,changed:$.changed};let Q=Error($.message);if($.stack)Q.stack=$.stack;return{success:!1,service:$.service,error:Q}}function rq(){let $=new Worker(new URL("./generate-worker.ts",import.meta.url).href),Q={worker:$,pending:new Map};return $.onmessage=(Z)=>{let X=Q.pending.get(Z.data.id);if(!X)return;Q.pending.delete(Z.data.id),X.resolve(iq(Z.data.result))},$.onerror=(Z)=>{let X=Error(Z.message||"Kontract worker failed");for(let U of Q.pending.values())U.reject(X);Q.pending.clear()},Q}function oq($){let Q=Math.max(1,Math.floor($)),Z=Array.from({length:Q},()=>rq()),X=1,U=0;return{run:(Y)=>{let G=Z[U]??Z[0];if(!G)return Promise.reject(Error("Kontract worker pool has no available workers"));U=(U+1)%Z.length;let z=X;X+=1;let _={id:z,task:Y};return new Promise((V,H)=>{b("worker.tasks"),G.pending.set(z,{resolve:V,reject:H}),G.worker.postMessage(_)})},close:async()=>{await Promise.all(Z.map((Y)=>Y.worker.terminate()))}}}function aq($){let Q=L6;return L6=$,()=>{L6=Q}}function sq($){return L6?.run($)??null}async function j5($){if($.kind===j0.OpenApiNestJs)return cq($.inputFile,$.outputDir,$.verbose,$.options);if($.kind===j0.OpenApiSdk)return Qq($.inputFile,$.outputDir,$.generator,$.verbose,{formatFiles:$.formatFiles});return hH($.inputFile,$.outputDir,$.verbose,{sharedTypesImportPath:$.sharedTypesImportPath,sharedTypesOutputFile:$.sharedTypesOutputFile,addressPrefix:$.addressPrefix,formatFiles:$.formatFiles})}async function I9($){let Q=sq($);if(!Q)return j5($);try{return await Q}catch{return b("worker.fallbacks"),j5($)}}function eq($){return $.type!==w.AsyncApiNats}function $B($){return $.type===w.AsyncApiNats}function QB($){return $.type===w.TypeScriptFetch||$.type===w.TypeScriptAxios||$.type===w.TypeScriptAngular}function ZB($){return QB($)||$.type===w.TypeScriptModels}function XB($){let Q=$.source?$.config.sources.filter((Z)=>Z.name===$.source):$.config.sources;if(Q.length===0)throw Error(`No kontract source named '${$.source}'`);return Q}function UB($){let Q=[];for(let Z of XB($)){let X=$.target?Z.targets.filter((U)=>U.name===$.target):Z.targets;for(let U of X)Q.push({sourceName:Z.name,targetName:U.name,inputDir:T5(Z.input),outputDir:T5(U.output),generator:U.generator})}if($.target&&Q.length===0)throw Error(`No kontract target named '${$.target}'`);return Q}async function JB($){let Q=new Map;for(let X of $)if(!Q.has(X.sourceName))Q.set(X.sourceName,X);let Z=[];for(let X of Q.values()){let[U,J]=await Q$("discovery",()=>Promise.all([bX(X.inputDir),yX(X.inputDir)]));Z.push({sourceName:X.sourceName,inputDir:X.inputDir,openApiRoots:U,asyncApiGroups:J})}return Z}function E5($,Q){return Q?$.filter((Z)=>Z.name===Q):[...$]}async function WB($,Q){if(await N6(Q,{recursive:!0}),$.files.length===0)throw Error(`No AsyncAPI files found for service '${$.name}'`);if($.files.length===1){let U=$.files[0];if(!U)throw Error(`Missing AsyncAPI file for service '${$.name}'`);if(!await Q$("bundle.decision",()=>OB(U)))return b("bundle.skippedInternalRefs"),{specFile:U,cleanup:null};let W=K$(Q,r1($.name)),Y=await Q$("bundle.asyncapi",()=>X5([U],W));if(!Y.success)throw Y.error;return{specFile:Y.outputPath,cleanup:()=>_2(W,{force:!0})}}let Z=K$(Q,r1($.name)),X=await X5($.files,Z);if(!X.success)throw X.error;return{specFile:X.outputPath,cleanup:()=>_2(Z,{force:!0})}}async function uU($,Q){let Z=A6.get(Q);if(Z)return b("bundle.cacheCoalescedHits"),Z;if(await Bun.file(Q).exists())return b("bundle.cacheHits"),{specFile:Q,cleanup:null};b("bundle.cacheMisses");let X=Q$("bundle.openapi",async()=>{let U=await u9([$],Q);if(!U.success)throw U.error;return{specFile:U.outputPath,cleanup:null}});A6.set(Q,X);try{return await X}finally{A6.delete(Q)}}async function YB($,Q,Z,X){let U=K$(Q,r1(`${$.name}-entrypoint`));if(X){let Y=K$(Q,P5);await N6(Y,{recursive:!0});let G=t1(Z).slice(0,24),z=K$(Y,r1(`${$.name}-${G}`));if(await Bun.file(z).exists())return b("bundle.cacheHits"),{specFile:z,cleanup:null};return await Y5({files:$.files,name:$.name,outputPath:U}),uU(U,z)}await Y5({files:$.files,name:$.name,outputPath:U});let J=K$(Q,r1($.name)),W=await Q$("bundle.openapi",()=>u9([U],J));if(!W.success)throw W.error;return{specFile:W.outputPath,cleanup:async()=>{await _2(U,{force:!0}),await _2(J,{force:!0})}}}async function GB($,Q,Z,X){if(await N6(Q,{recursive:!0}),$.files.length>1)return YB($,Q,Z,X);if(!await Q$("bundle.decision",()=>HB($.rootFile)))return b("bundle.skippedInternalRefs"),{specFile:$.rootFile,cleanup:null};if(X){let Y=K$(Q,P5);await N6(Y,{recursive:!0});let G=t1(Z).slice(0,24),z=K$(Y,r1(`${$.name}-${G}`));if(await Bun.file(z).exists())return b("bundle.cacheHits"),{specFile:z,cleanup:null};return uU($.rootFile,z)}let J=K$(Q,r1($.name)),W=await Q$("bundle.openapi",()=>u9([$.rootFile],J));if(!W.success)throw W.error;return{specFile:W.outputPath,cleanup:()=>_2(J,{force:!0})}}function zB($){return $.match(/\$ref\s*:\s*['"]?([^'"\s]+)['"]?\s*$/)?.[1]??null}function _B($){return/\$ref\s*:\s*$/.test($)||/\$ref\s*:\s*[|>]/.test($)}function VB($){for(let Q of $.split(/\r?\n/)){if(!Q.includes("$ref"))continue;if(_B(Q))return null;let Z=zB(Q);if(!Z)return null;if(!Z.startsWith("#"))return!0}return!1}async function HB($){return dU($)}async function OB($){return dU($)}async function dU($){try{let Q=VB(await Bun.file($).text());if(Q===null)return b("bundle.ambiguousRefs"),!0;return Q}catch{return!0}}function KB($,Q){let Z=Q.find((X)=>X.sourceName===$.sourceName);if(!Z)throw Error(`Missing discovery result for source '${$.sourceName}'`);return Z}function qB($){if($.generator.type===w.TypeScriptNestJs)return z$.Http;if($.generator.type===w.TypeScriptModels)return z$.Models;return z$.Sdk}async function BB($,Q,Z,X){if($.generator.type===w.TypeScriptNestJs)return I9({kind:j0.OpenApiNestJs,inputFile:Z.specFile,outputDir:Q,verbose:X.verbose,options:{zod:$.generator.zod===!0,dtos:$.generator.dtos===!0,sdk:$.generator.sdk===!0,swagger:$.generator.swagger===!0,formatFiles:!1}});if(!ZB($.generator))throw Error(`Generator '${$.generator.type}' cannot emit OpenAPI TypeScript`);return I9({kind:j0.OpenApiSdk,inputFile:Z.specFile,outputDir:Q,generator:$.generator,verbose:X.verbose,formatFiles:!1})}function LB($,Q,Z,X){let U=qB($);return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:U,run:async()=>{let J=null,W=x6(Z,$),Y=K$($.outputDir,Q.name),G=await OX(Q.files),z=LX(W,U,Q.name);if((await AX({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:U,generator:$.generator,manifestPath:z,source:G,outputDir:Y})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let V=G.safe?JX(Z,$.sourceName):W,H=await GB(Q,V,G.hash,G.safe);J=H.cleanup;let O=await BB($,Y,H,X);return O.success?{...O,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:U,generator:$.generator,manifestPath:z,source:G,outputDir:Y}}:O}finally{if(J)await J()}}}}function AB($,Q,Z){return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:z$.Nats,run:async()=>{let X=null,U=x6(Z,$),J=K$($.outputDir,Q.name),W=K$($.outputDir,b6),Y=await OX(Q.files),G=LX(U,z$.Nats,Q.name);if((await AX({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:z$.Nats,generator:$.generator,manifestPath:G,source:Y,outputDir:J,additionalOutputDirs:[W]})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let _=await WB(Q,U);X=_.cleanup;let V=K$(W,"runtime.ts"),H=K3(K$(J,"nats"),V),O=await I9({kind:j0.AsyncApiNats,inputFile:_.specFile,outputDir:J,verbose:!1,sharedTypesImportPath:H,sharedTypesOutputFile:V,addressPrefix:$.generator.type===w.AsyncApiNats?$.generator.prefix:void 0,formatFiles:!1});return O.success?{...O,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:z$.Nats,generator:$.generator,manifestPath:G,source:Y,outputDir:J,additionalOutputDirs:[W]}}:O}finally{if(X)await X()}}}}function MB($,Q,Z,X){let U=[];for(let J of $){let W=KB(J,Q);if(eq(J.generator)){let Y=E5(W.openApiRoots,X.specific);U.push(...Y.map((G)=>LB(J,G,Z,X)))}if($B(J.generator)){let Y=E5(W.asyncApiGroups,X.specific);U.push(...Y.map((G)=>AB(J,G,Z)))}}return U}async function jB($){let Q=UB($),Z=O3(Q),X=await JB(Q),U=MB(Q,X,Z,$);return{jobs:Q,discovered:X,workItems:U,cacheRoot:Z}}function FB($){if($===z$.Http)return z$.Http;if($===z$.Nats)return z$.Nats;if($===z$.Models)return z$.Models;return z$.Sdk}async function IB($,Q){let Z=new Set;for(let X of $){let U=await s3({cwd:process.cwd(),inputDir:X.inputDir,outputDir:X.outputDir,generators:[X.generator]});for(let J of U){let W=`${J.title}
322
- ${J.details??""}`;if(Z.has(W))continue;Z.add(W),Q(J.title,J.details)}}}async function RB($,Q,Z,X){let U=[...X,...$.map((J)=>x6(Z,J)),...cU($,Z),...Q.map((J)=>w6(J.outputDir,J.serviceName))];await Promise.all(U.map((J)=>EB(J,{recursive:!0}))),await Promise.all(X.map((J)=>lU(w6(J,".cache"),{recursive:!0,force:!0})))}function pU($){return[...new Set($)].sort((Q,Z)=>Q.localeCompare(Z))}function DB($){let Q=pU($.map((X)=>SB(X))).sort((X,U)=>X.length-U.length||X.localeCompare(U)),Z=[];for(let X of Q){if(Z.some((U)=>v6(U,X)))continue;Z.push(X)}return Z}function cU($,Q){let Z=$.filter((X)=>X.generator.type!==w.AsyncApiNats).map((X)=>X.sourceName);return pU(Z.map((X)=>JX(Q,X)))}async function NB($,Q,Z,X){let U=[...$.map((W)=>x6(Q,W)),...cU($,Q)],J=DB([...Z,...U]);X.printStep("Cleaning selected generated outputs and Kontract cache..."),await Promise.all(J.map((W)=>lU(W,{recursive:!0,force:!0})))}function wB($,Q,Z,X,U,J){let W=0,Y=(z,_)=>{if(W+=1,_===p1.Generated)$.generatedCount+=1;if(_===p1.Unchanged)$.unchangedCount+=1;if(_===p1.Failed)$.failedCount+=1;let V=`Generating contracts (${W}/${Q.length}) \u2022 ${z.sourceName}/${z.targetName}/${z.serviceName} (${FB(z.channel)}, ${_})`;if(Z){Z.message(V);return}if(!X&&U)J(V)},G=(z,_)=>{$.failures.push(e3(`${z.sourceName}/${z.targetName}/${z.serviceName}`,_)),Y(z,p1.Failed)};return async(z)=>{try{let _=await z.run();if($.results.push(_),_.success){if(_.skippedByManifest)b("generation.manifestSkipped");else $.touchedServiceDirs.add(w6(z.outputDir,z.serviceName));if(_.manifest)$.pendingManifestWrites.push(_.manifest);if(_.changed)$.changedOutputRoots.add(z.outputDir);return Y(z,_.changed?p1.Generated:p1.Unchanged),!0}return G(z,_.error.message),!1}catch(_){let V=_ instanceof Error?_:Error(String(_));return $.results.push({success:!1,service:z.serviceName,error:V}),G(z,V.message),!1}}}async function kB($,Q,Z,X,U){if(Q)Q.message("Formatting generated contracts...");else if(!Z&&X)U.printStep("Formatting generated contracts...");for(let J of $){let W=await Z3(J);if(!W.success)throw Error([`Could not run post-generation Biome format pass for ${UX(J)}.`,W.details].filter(Boolean).join(`
323
- `));else if(!Z&&X&&W.details)U.printInfo(W.details)}}async function PB($){let Q=[];for(let Z of $)try{if((await CB(Z)).isDirectory())Q.push(Z)}catch(X){if(X instanceof Error&&"code"in X&&X.code==="ENOENT")continue;throw X}return Q}function nU($,Q,Z){let X=$.find((U)=>v6(U,Z));if(X)Q.changedOutputRoots.add(X)}function bB(){return{results:[],touchedServiceDirs:new Set,changedOutputRoots:new Set,pendingManifestWrites:[],failures:[],generatedCount:0,unchangedCount:0,failedCount:0}}function yB($){return[...new Set($.map((Q)=>Q.outputDir))].sort((Q,Z)=>Q.localeCompare(Z))}function fB($){return $.generator.type===w.TypeScriptNestJs&&$.generator.swagger===!0}async function vB($,Q,Z){let X=[...new Set(Q.filter(fB).map((U)=>U.outputDir))].sort((U,J)=>U.localeCompare(J));for(let U of X){if(!await Y3(U,!1))continue;$.changedOutputRoots.add(U),nU(Z,$,U),$.touchedServiceDirs.add(w6(U,b6))}}async function xB($,Q){let Z=await Promise.all([...$.touchedServiceDirs].map(async(X)=>({serviceDir:X,changed:await l_(X)})));for(let X of Z)if(X.changed)nU(Q,$,X.serviceDir)}async function gB($,Q){let Z=await Promise.all(Q.map(async(U)=>({outputRoot:U,changed:await p_(U)}))),X=await Promise.all(Q.map(async(U)=>({outputRoot:U,changed:await n_(U)})));for(let U of[...Z,...X])if(U.changed)$.changedOutputRoots.add(U.outputRoot)}async function hB($,Q,Z,X,U){let J=[...$.changedOutputRoots],W=await PB(J);if(W.length===0)return;b("format.changedOutputRoots",W.length),await kB(W,Q,Z,X,U)}async function uB($){if($.pendingManifestWrites.length===0)return;await Promise.all($.pendingManifestWrites.map((Q)=>F3(Q)))}function dB($){return $>1&&process.env[y5]!=="1"&&process.env[A_]!=="1"}function mB($){if(!dB($))return b("worker.disabled"),null;try{let Q=oq($);return b("worker.enabled"),b("worker.count",$),Q}catch(Q){b("worker.startFailures");let Z=Q instanceof Error?Q.message:String(Q);throw Error(`Could not start Kontract worker pool: ${Z}. Set ${y5}=1 to run on the main thread.`)}}function lB($,Q,Z,X){let U=`Done: ${$.generatedCount} generated, ${$.unchangedCount} unchanged, ${$.failedCount} failed`;if(Q)if($.failedCount>0)Q.error(U);else Q.stop(U);else if(!Z)X.printStep(U);if($.failures.length>0)for(let J of $.failures)X.printFailure(J)}async function pB($){let Q=k_($.metrics??null);try{return await cB($)}finally{Q()}}async function cB($){let{concurrency:Q,verbose:Z,quiet:X}=$,U=X?null:await import("@clack/prompts"),J=U?.spinner(q1("purple"))??null,W=$V(X,U),{printStep:Y,printInfo:G,printFailure:z}=W,_;try{_=await Q$("plan",()=>jB($))}catch(R){let k=R instanceof Error?R:Error(String(R));return z({title:`\u2717 ${k.message}`}),1}let{jobs:V,workItems:H,cacheRoot:O}=_,K=V.map((R)=>`${R.sourceName}/${R.targetName} \u2192 ${UX(R.outputDir)}`).join(", ");if(Y(`Kontract generate: ${K}`),H.length===0)return G("No schema files found for selected sources and targets."),0;await Q$("dependencyWarnings",()=>IB(V,W.printWarning));let q=yB(V);if($.clean===!0)await Q$("clean",()=>NB(V,O,q,W));let B=bB();if(J)J.start(`Generating contracts (0/${H.length})...`);await Q$("prepareOutputDirectories",()=>RB(V,H,O,q));let F=wB(B,H,J,X,Z,Y),C=mB(Q),T=aq(C);try{await Q$("processItems",()=>M9(H,F,Q))}finally{T(),await C?.close()}await Q$("barrels",async()=>{if(await vB(B,V,q),B.touchedServiceDirs.size===0&&B.changedOutputRoots.size===0){b("barrels.skipped");return}await xB(B,q),await gB(B,q)});try{await Q$("format",()=>hB(B,J,X,Z,W)),await Q$("manifest.write",()=>uB(B))}catch(R){let k=R instanceof Error?R:Error(String(R));B.failures.push({title:`\u2717 ${k.message}`}),B.failedCount+=1}return lB(B,J,X,W),B.failedCount>0?1:0}function sB($,Q){let Z=Q.split(`
324
- `).map((J)=>J.trim()).filter((J)=>J.length>0),[X="Unexpected error",...U]=Z;return{title:`\u274C ${$}: ${X}`,details:U.length>0?U.join(`
325
- `):void 0}}function tB($){return $.type!==w.AsyncApiNats}function eB($){return $.type===w.AsyncApiNats}function $L($){let Q=$.source?$.config.sources.filter((U)=>U.name===$.source):$.config.sources;if(Q.length===0)throw Error(`No kontract source named '${$.source}'`);let Z=[],X=!1;for(let U of Q){let J=$.target?U.targets.filter((Y)=>Y.name===$.target):U.targets;if(J.length>0)X=!0;let W=J.map((Y)=>Y.generator);Z.push({source:U,inputDir:oB(U.input),validateOpenApi:W.some(tB),validateAsyncApi:W.some(eB)})}if($.target&&!X)throw Error(`No kontract target named '${$.target}'`);return Z.filter((U)=>U.validateOpenApi||U.validateAsyncApi)}async function QL($){let Q=Bun.spawn(["bunx","@asyncapi/cli","validate",$],{stdout:"pipe",stderr:"pipe",env:{...process.env}});if(await Q.exited!==0){let X=await new Response(Q.stderr).text();return{success:!1,file:$,kind:b$.AsyncApi,error:Error(X.trim())}}return{success:!0,file:$,kind:b$.AsyncApi}}async function ZL($){try{let Q=await aB.parse($,{validate:{spec:!1}});return r6(Q,{enforceOperationSchemaRefs:!0}),{success:!0,file:$,kind:b$.OpenApi}}catch(Q){return{success:!1,file:$,kind:b$.OpenApi,error:Q instanceof Error?Q:Error(String(Q))}}}function XL($,Q){return{printStep:(J)=>{if($)return;if(Q){Q.log.step(J,G$("step"));return}H6.step(J)},printInfo:(J)=>{if($)return;if(Q){Q.log.info(J,G$("info"));return}H6.info(J)},printFailure:(J)=>{if(!$&&Q){if(Q.log.error(J.title,{...G$("error"),symbol:"\u274C"}),J.details)Q.note(J.details,"Details",P$("dim"));return}if(H6.error(J.title),J.details)H6.error(J.details)}}}async function UL($){let Q=[],Z=[];for(let X of $){if(X.validateOpenApi){let U=await bX(X.inputDir);Q.push(...U.flatMap((J)=>J.files))}if(X.validateAsyncApi){let U=await yX(X.inputDir);Z.push(...U.flatMap((J)=>J.files))}}return{openApiFiles:Q,asyncApiFiles:Z}}function JL($){let Q=$.filter((J)=>J.success&&J.kind===b$.OpenApi).length,Z=$.filter((J)=>!J.success&&J.kind===b$.OpenApi).length,X=$.filter((J)=>J.success&&J.kind===b$.AsyncApi).length,U=$.filter((J)=>!J.success&&J.kind===b$.AsyncApi).length;return{summary:`OpenAPI: ${Q} passed, ${Z} failed | AsyncAPI: ${X} passed, ${U} failed`,failedCount:Z+U}}function C5($,Q,Z){return async(X)=>{let U=await Q(X);Z.results.push(U);let J=rB(X);if(U.success)return Z.updateProgress(J,$,R9.Passed),!0;return Z.failures.push(sB(`${J} (${$})`,U.error.message)),Z.updateProgress(J,$,R9.Failed),U.success}}function WL($,Q,Z,X,U){let J=0;return(W,Y,G)=>{J+=1;let z=`Validating schemas (${J}/${$}) \u2022 ${W} (${Y}, ${G})`;if(Q){Q.message(z);return}if(!Z&&X)U(z)}}function YL($,Q,Z,X,U){if(Z){if(Q>0)Z.error($);else Z.stop($);return}if(!X)U($)}async function GL($){let{concurrency:Q,verbose:Z,quiet:X}=$,U=X?null:await import("@clack/prompts"),J=U?.spinner(q1("purple"))??null,{printStep:W,printInfo:Y,printFailure:G}=XL(X,U),z;try{z=$L($)}catch(B){let F=B instanceof Error?B:Error(String(B));return G({title:`\u2717 ${F.message}`}),1}W(`Kontract validate: ${z.map((B)=>B.source.name).join(", ")}`);let _,V;try{({openApiFiles:_,asyncApiFiles:V}=await UL(z))}catch(B){let F=B instanceof Error?B:Error(String(B));return G({title:`\u2717 ${F.message}`}),1}let H=_.length+V.length;if(H===0)return Y("No schema files found for selected sources and targets."),0;if(J)J.start(`Validating schemas (0/${H})...`);let O={results:[],failures:[],updateProgress:WL(H,J,X,Z,W)};await Promise.all([M9(_,C5(b$.OpenApi,ZL,O),Q),M9(V,C5(b$.AsyncApi,QL,O),Q)]);let{summary:K,failedCount:q}=JL(O.results);if(YL(K,q,J,X,W),O.failures.length>0)for(let B of O.failures)G(B);return q>0?1:0}function qL($){let Q=F5($,j_);if(!S5(F5($,".git")))return!1;let Z=`${w5}/${M_}`,X=S5(Q)?VL(Q,"utf8"):"";if(X.split(/\r?\n/).includes(Z))return!1;return _L(KL(Q),{recursive:!0}),HL(Q,`${X.trimEnd()}
321
+ `}function fz($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function yz($,Q){if(!fz($))throw Error("API schema document must be an object");if(Q==="normalize")return lW($).doc;return $}async function xz($,Q,Z,X){let Y=!1,W=[],U=new Set;for(let J of $.enumGroups){let G=T9(J.name);U.add(G);let _=B$(Q,G),H=await d2(HW(J,"API schema"),_,X);if(await e(_,H))Y=!0;if(W.push(`./${G.replace(/\.ts$/,"")}`),Z)p2.step(` \u2713 ${_}`)}if(await H9(Q,U))Y=!0;if(await p1(Q,W.sort()))Y=!0;return Y}async function vz($,Q,Z){let X=!1;for(let Y of $.enumGroups){let W=j9(Y.name);if(!Q.has(W)){let U=B$(Z,W);if(await vW(U))X=!0}}return X}async function gz($,Q,Z,X){let Y=!1,W=[],U=new Set;for(let J of $){let G=j9(J.schemaName);if(U.has(G))throw Error(`Duplicate API model output file '${G}'`);U.add(G);let _=B$(Q,G),H=await d2(KO(J),_,X);if(await e(_,H))Y=!0;if(W.push(`./${G.replace(/\.ts$/,"")}`),Z)p2.step(` \u2713 ${_}`)}if(await H9(Q,U))Y=!0;if(await p1(Q,W.sort()))Y=!0;return Y}async function hz($,Q,Z,X){let Y=!1,W=[],U=new Set,J=new Map;for(let G of $.dtoModels.filter((_)=>_.properties.length>0)){let _=xQ(G.schemaName);if(U.has(_))throw Error(`Duplicate API DTO output file '${_}'`);let H=O0(G.schemaName),V=J.get(H);if(V)throw Error(`Duplicate API DTO class symbol '${H}' from schemas '${V}' and '${G.schemaName}'`);J.set(H,G.schemaName),U.add(_);let q=B$(Q,_),K=await d2(FL(G),q,X);if(await e(q,K))Y=!0;if(W.push(`./${_.replace(UY,".dto")}`),Z)p2.step(` \u2713 ${q}`)}if(await H9(Q,U))Y=!0;return{changed:Y,dtoExports:W}}async function uz($,Q,Z,X){let Y=!1,W=[],U=new Set;for(let J of $){let G=vQ(J.schemaName);if(U.has(G))throw Error(`Duplicate API contract output file '${G}'`);U.add(G);let _=B$(Q,G),H=await d2(aA(J),_,X);if(await e(_,H))Y=!0;if(W.push(`./${G.replace(/\.ts$/,"")}`),Z)p2.step(` \u2713 ${_}`)}if(await ZO(Q,U))Y=!0;return{changed:Y,contractExports:W}}async function dz($,Q,Z,X){let Y=!1,W=await uz($,Q,Z,X);if(W.changed)Y=!0;if(await p1(Q,W.contractExports.sort()))Y=!0;return Y}async function mz($,Q,Z,X,Y){let W=await d2(bz($,Z),Q,Y),U=await e(Q,W);if(X)p2.step(` \u2713 ${Q}`);return U}async function lz($){return await QO($)}async function pz($,Q,Z,X,Y,W){if(!Z)return N9(Q);let U=await dz($,Q,X,Y);return W.push(Q9("ZodContracts","./zod")),U}async function cz($,Q,Z,X,Y,W){if(!Z)return N9(Q);let U=await hz($,Q,X,Y);return W.push(Q9("Dtos","./dto")),await p1(Q,U.dtoExports.sort())||U.changed}async function nz($,Q,Z,X,Y,W,U){if(!Z)return vW(Q);let G=await mz($,Q,X?"dto":"zod",Y,W);return U.push(gW("./swagger")),G}async function rz($,Q,Z,X,Y,W,U,J,G,_){let{httpDir:H,dtoDir:V}=X,q=B$(H,"zod"),K=B$(H,"swagger.ts"),B=B$(H,"decorators"),L=!1;if(await pz(Z,q,Y,J,G,_))L=!0;if(await cz($,V,W,J,G,_))L=!0;if(await nz(Q,K,U,W,J,G,_))L=!0;if(await N9(B))L=!0;return L}async function iz($,Q,Z,X,Y,W){let U=B$(Z,"http","sdk");return UU({rawDoc:Q,extraction:$,outputDir:U,service:X,generator:{type:"typescript-fetch",useSingleRequestParameter:!0},verbose:Y,formatFiles:W,emitModels:!1,inlineEnumsAsLiterals:!0,modelImportPath:"../models",enumImportPath:"../enums"})}async function oz($,Q,Z,X,Y){let{httpDir:W,enumDir:U,modelDir:J}=Z,G=!1,_=await Pz.parse($,{validate:{spec:!1}}),H=Y.schemaMode??"strict",V=yz(_,H);I9(V,{enforceOperationSchemaRefs:!0});let q=PW(V),K=q.dtoModels.filter((u)=>u.source!=="operation"),B=new Set(K.map((u)=>j9(u.schemaName))),L=Y.dtos===!0,O=Y.zod===!0||!L,S=Y.swagger===!0||L,M=Y.sdk===!0,C=Y.formatFiles!==!1;G=await lz(W)||G;let D=[Q9("Models","./models"),gW("./enums")];if(await xz(q,U,X,C))G=!0;if(await vz(q,B,J))G=!0;if(await gz(K,J,X,C))G=!0;if(await rz(q,V,K,Z,O,L,S,X,C,D))G=!0;let k=B$(W,"sdk");if(M){if(await iz(q,V,Q,HU(Q),X,C))G=!0;D.push(Q9("Sdk","./sdk"))}else if(await N9(k))G=!0;if(await XO(W,D))G=!0;if(await e(B$(Q,G9),`export * as HttpSchemas from './http';
322
+ `))G=!0;return G}async function az($,Q,Z,X={}){let Y=HU(Q);try{let W=B$(Q,"http"),U={httpDir:W,dtoDir:B$(W,"dto"),enumDir:B$(W,"enums"),modelDir:B$(W,"models")},J=await oz($,Q,U,Z,X);return{success:!0,service:Y,changed:J}}catch(W){return{success:!1,service:Y,error:W instanceof Error?W:Error(String(W))}}}function tz($){if($.success)return{success:!0,service:$.service,changed:$.changed};let Q=Error($.message);if($.stack)Q.stack=$.stack;return{success:!1,service:$.service,error:Q}}function ez(){let $=new Worker(new URL("./generate-worker.ts",import.meta.url).href),Q={worker:$,pending:new Map};return $.onmessage=(Z)=>{let X=Q.pending.get(Z.data.id);if(!X)return;Q.pending.delete(Z.data.id),X.resolve(tz(Z.data.result))},$.onerror=(Z)=>{let X=Error(Z.message||"Kontract worker failed");for(let Y of Q.pending.values())Y.reject(X);Q.pending.clear()},Q}function $j($){let Q=Math.max(1,Math.floor($)),Z=Array.from({length:Q},()=>ez()),X=1,Y=0;return{run:(J)=>{let G=Z[Y]??Z[0];if(!G)return Promise.reject(Error("Kontract worker pool has no available workers"));Y=(Y+1)%Z.length;let _=X;X+=1;let H={id:_,task:J};return new Promise((V,q)=>{f("worker.tasks"),G.pending.set(_,{resolve:V,reject:q}),G.worker.postMessage(H)})},close:async()=>{await Promise.all(Z.map((J)=>J.worker.terminate()))}}}function Qj($){let Q=n8;return n8=$,()=>{n8=Q}}function Zj($){return n8?.run($)??null}async function DX($){if($.kind===g0.OpenApiNestJs)return az($.inputFile,$.outputDir,$.verbose,$.options);if($.kind===g0.OpenApiSdk)return _z($.inputFile,$.outputDir,$.generator,$.verbose,{formatFiles:$.formatFiles});return lA($.inputFile,$.outputDir,$.verbose,{sharedTypesImportPath:$.sharedTypesImportPath,sharedTypesOutputFile:$.sharedTypesOutputFile,addressPrefix:$.addressPrefix,formatFiles:$.formatFiles})}async function jQ($){let Q=Zj($);if(!Q)return DX($);try{return await Q}catch{return f("worker.fallbacks"),DX($)}}function Yj($){return $.type!==w.AsyncApiNats}function Wj($){return $.type===w.AsyncApiNats}function Uj($){return $.type===w.TypeScriptFetch||$.type===w.TypeScriptAxios||$.type===w.TypeScriptAngular}function Jj($){return Uj($)||$.type===w.TypeScriptModels}function Gj($){let Q=$.source?$.config.sources.filter((Z)=>Z.name===$.source):$.config.sources;if(Q.length===0)throw Error(`No kontract source named '${$.source}'`);return Q}function _j($){let Q=[];for(let Z of Gj($)){let X=$.target?Z.targets.filter((Y)=>Y.name===$.target):Z.targets;for(let Y of X)Q.push({sourceName:Z.name,targetName:Y.name,inputDir:NX(Z.input),outputDir:NX(Y.output),generator:Y.generator})}if($.target&&Q.length===0)throw Error(`No kontract target named '${$.target}'`);return Q}async function Hj($){let Q=new Map;for(let X of $)if(!Q.has(X.sourceName))Q.set(X.sourceName,X);let Z=[];for(let X of Q.values()){let[Y,W]=await Z$("discovery",()=>Promise.all([oY(X.inputDir),aY(X.inputDir)]));Z.push({sourceName:X.sourceName,inputDir:X.inputDir,openApiRoots:Y,asyncApiGroups:W})}return Z}function wX($,Q){return Q?$.filter((Z)=>Z.name===Q):[...$]}function Vj($,Q){let Z=Q.find((X)=>X.sourceName===$.sourceName);if(!Z)throw Error(`Missing discovery result for source '${$.sourceName}'`);return Z}function qj($){if($.generator.type===w.TypeScriptNestJs)return K$.Http;if($.generator.type===w.TypeScriptModels)return K$.Models;return K$.Sdk}async function Kj($,Q,Z,X){if($.generator.type===w.TypeScriptNestJs)return jQ({kind:g0.OpenApiNestJs,inputFile:Z.specFile,outputDir:Q,verbose:X.verbose,options:{zod:$.generator.zod===!0,dtos:$.generator.dtos===!0,sdk:$.generator.sdk===!0,swagger:$.generator.swagger===!0,formatFiles:!1}});if(!Jj($.generator))throw Error(`Generator '${$.generator.type}' cannot emit API TypeScript`);return jQ({kind:g0.OpenApiSdk,inputFile:Z.specFile,outputDir:Q,generator:$.generator,verbose:X.verbose,formatFiles:!1})}function Bj($,Q,Z,X){let Y=qj($);return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:Y,run:async()=>{let W=null,U=K9(Z,$),J=N2($.outputDir,Q.name),G=await wY(Q.files),_=fY(U,Y,Q.name);if((await yY({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:Y,generator:$.generator,manifestPath:_,source:G,outputDir:J})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let V=G.safe?EY(Z,$.sourceName):U,q=await hB(Q,V,G.hash,G.safe);W=q.cleanup;let K=await Kj($,J,q,X);return K.success?{...K,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:Y,generator:$.generator,manifestPath:_,source:G,outputDir:J}}:K}finally{if(W)await W()}}}}function Aj($,Q,Z){return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:K$.Nats,run:async()=>{let X=null,Y=K9(Z,$),W=N2($.outputDir,Q.name),U=N2($.outputDir,_9),J=await wY(Q.files),G=fY(Y,K$.Nats,Q.name);if((await yY({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:K$.Nats,generator:$.generator,manifestPath:G,source:J,outputDir:W,additionalOutputDirs:[U]})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let H=await vB(Q,Y);X=H.cleanup;let V=N2(U,"runtime.ts"),q=dq(N2(W,"nats"),V),K=await jQ({kind:g0.AsyncApiNats,inputFile:H.specFile,outputDir:W,verbose:!1,sharedTypesImportPath:q,sharedTypesOutputFile:V,addressPrefix:$.generator.type===w.AsyncApiNats?$.generator.prefix:void 0,formatFiles:!1});return K.success?{...K,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:K$.Nats,generator:$.generator,manifestPath:G,source:J,outputDir:W,additionalOutputDirs:[U]}}:K}finally{if(X)await X()}}}}function Lj($,Q,Z,X){let Y=[];for(let W of $){let U=Vj(W,Q);if(Yj(W.generator)){let J=wX(U.openApiRoots,X.specific);Y.push(...J.map((G)=>Bj(W,G,Z,X)))}if(Wj(W.generator)){let J=wX(U.asyncApiGroups,X.specific);Y.push(...J.map((G)=>Aj(W,G,Z)))}}return Y}async function Oj($){let Q=_j($),Z=uq(Q),X=await Hj(Q),Y=Lj(Q,X,Z,$);return{jobs:Q,discovered:X,workItems:Y,cacheRoot:Z}}function Cj($){if($===K$.Http)return K$.Http;if($===K$.Nats)return K$.Nats;if($===K$.Models)return K$.Models;return K$.Sdk}async function Fj($,Q){let Z=new Set;for(let X of $){let Y=await IK({cwd:process.cwd(),inputDir:X.inputDir,outputDir:X.outputDir,generators:[X.generator]});for(let W of Y){let U=`${W.title}
323
+ ${W.details??""}`;if(Z.has(U))continue;Z.add(U),Q(W.title,W.details)}}}async function Mj($,Q,Z,X){let Y=[...X,...$.map((W)=>K9(Z,W)),...AU($,Z),...Q.map((W)=>W9(W.outputDir,W.serviceName))];await Promise.all(Y.map((W)=>jj(W,{recursive:!0}))),await Promise.all(X.map((W)=>KU(W9(W,".cache"),{recursive:!0,force:!0})))}function BU($){return[...new Set($)].sort((Q,Z)=>Q.localeCompare(Z))}function Sj($){let Q=BU($.map((X)=>Ej(X))).sort((X,Y)=>X.length-Y.length||X.localeCompare(Y)),Z=[];for(let X of Q){if(Z.some((Y)=>q9(Y,X)))continue;Z.push(X)}return Z}function AU($,Q){let Z=$.filter((X)=>X.generator.type!==w.AsyncApiNats).map((X)=>X.sourceName);return BU(Z.map((X)=>EY(Q,X)))}async function Ij($,Q,Z,X){let Y=[...$.map((U)=>K9(Q,U)),...AU($,Q)],W=Sj([...Z,...Y]);X.printStep("Cleaning selected generated outputs and Kontract cache..."),await Promise.all(W.map((U)=>KU(U,{recursive:!0,force:!0})))}function Rj($,Q,Z,X,Y,W){let U=0,J=(_,H)=>{if(U+=1,H===J0.Generated)$.generatedCount+=1;if(H===J0.Unchanged)$.unchangedCount+=1;if(H===J0.Failed)$.failedCount+=1;let V=`Generating contracts (${U}/${Q.length}) \u2022 ${_.sourceName}/${_.targetName}/${_.serviceName} (${Cj(_.channel)}, ${H})`;if(Z){Z.message(V);return}if(!X&&Y)W(V)},G=(_,H)=>{$.failures.push(DK(`${_.sourceName}/${_.targetName}/${_.serviceName}`,H)),J(_,J0.Failed)};return async(_)=>{try{let H=await _.run();if($.results.push(H),H.success){if(H.skippedByManifest)f("generation.manifestSkipped");else $.touchedServiceDirs.add(W9(_.outputDir,_.serviceName));if(H.manifest)$.pendingManifestWrites.push(H.manifest);if(H.changed)$.changedOutputRoots.add(_.outputDir);return J(_,H.changed?J0.Generated:J0.Unchanged),!0}return G(_,H.error.message),!1}catch(H){let V=H instanceof Error?H:Error(String(H));return $.results.push({success:!1,service:_.serviceName,error:V}),G(_,V.message),!1}}}async function Dj($,Q,Z,X,Y){if(Q)Q.message("Formatting generated contracts...");else if(!Z&&X)Y.printStep("Formatting generated contracts...");for(let W of $){let U=await Nq(W);if(!U.success)throw Error([`Could not run post-generation Biome format pass for ${TY(W)}.`,U.details].filter(Boolean).join(`
324
+ `));else if(!Z&&X&&U.details)Y.printInfo(U.details)}}async function Nj($){let Q=[];for(let Z of $)try{if((await Tj(Z)).isDirectory())Q.push(Z)}catch(X){if(X instanceof Error&&"code"in X&&X.code==="ENOENT")continue;throw X}return Q}function LU($,Q,Z){let X=$.find((Y)=>q9(Y,Z));if(X)Q.changedOutputRoots.add(X)}function wj(){return{results:[],touchedServiceDirs:new Set,changedOutputRoots:new Set,pendingManifestWrites:[],failures:[],generatedCount:0,unchangedCount:0,failedCount:0}}function bj($){return[...new Set($.map((Q)=>Q.outputDir))].sort((Q,Z)=>Q.localeCompare(Z))}function kj($){return $.generator.type===w.TypeScriptNestJs&&$.generator.swagger===!0}async function Pj($,Q,Z){let X=[...new Set(Q.filter(kj).map((Y)=>Y.outputDir))].sort((Y,W)=>Y.localeCompare(W));for(let Y of X){if(!await fq(Y,!1))continue;$.changedOutputRoots.add(Y),LU(Z,$,Y),$.touchedServiceDirs.add(W9(Y,_9))}}async function fj($,Q){let Z=await Promise.all([...$.touchedServiceDirs].map(async(X)=>({serviceDir:X,changed:await Lq(X)})));for(let X of Z)if(X.changed)LU(Q,$,X.serviceDir)}async function yj($,Q){let Z=await Promise.all(Q.map(async(Y)=>({outputRoot:Y,changed:await Oq(Y)}))),X=await Promise.all(Q.map(async(Y)=>({outputRoot:Y,changed:await jq(Y)})));for(let Y of[...Z,...X])if(Y.changed)$.changedOutputRoots.add(Y.outputRoot)}async function xj($,Q,Z,X,Y){let W=[...$.changedOutputRoots],U=await Nj(W);if(U.length===0)return;f("format.changedOutputRoots",U.length),await Dj(U,Q,Z,X,Y)}async function vj($){if($.pendingManifestWrites.length===0)return;await Promise.all($.pendingManifestWrites.map((Q)=>$K(Q)))}function gj($){return $>1&&process.env[cX]!=="1"&&process.env[u4]!=="1"}function hj($){if(!gj($))return f("worker.disabled"),null;try{let Q=$j($);return f("worker.enabled"),f("worker.count",$),Q}catch(Q){f("worker.startFailures");let Z=Q instanceof Error?Q.message:String(Q);throw Error(`Could not start Kontract worker pool: ${Z}. Set ${cX}=1 to run on the main thread.`)}}function uj($,Q,Z,X){let Y=`Done: ${$.generatedCount} generated, ${$.unchangedCount} unchanged, ${$.failedCount} failed`;if(Q)if($.failedCount>0)Q.error(Y);else Q.stop(Y);else if(!Z)X.printStep(Y);if($.failures.length>0)for(let W of $.failures)X.printFailure(W)}async function dj($){let Q=Yq($.metrics??null);try{return await mj($)}finally{Q()}}async function mj($){let{concurrency:Q,verbose:Z,quiet:X}=$,Y=X?null:await import("@clack/prompts"),W=Y?.spinner(H1("purple"))??null,U=NK(X,Y),{printStep:J,printInfo:G,printFailure:_}=U,H;try{H=await Z$("plan",()=>Oj($))}catch(D){let k=D instanceof Error?D:Error(String(D));return _({title:`\u2717 ${k.message}`}),1}let{jobs:V,workItems:q,cacheRoot:K}=H,B=V.map((D)=>`${D.sourceName}/${D.targetName} \u2192 ${TY(D.outputDir)}`).join(", ");if(J(`Kontract generate: ${B}`),q.length===0)return G("No schema files found for selected sources and targets."),0;await Z$("dependencyWarnings",()=>Fj(V,U.printWarning));let L=bj(V);if($.clean===!0)await Z$("clean",()=>Ij(V,K,L,U));let O=wj();if(W)W.start(`Generating contracts (0/${q.length})...`);await Z$("prepareOutputDirectories",()=>Mj(V,q,K,L));let S=Rj(O,q,W,X,Z,J),M=hj(Q),C=Qj(M);try{await Z$("processItems",()=>_Q(q,S,Q))}finally{C(),await M?.close()}await Z$("barrels",async()=>{if(await Pj(O,V,L),O.touchedServiceDirs.size===0&&O.changedOutputRoots.size===0){f("barrels.skipped");return}await fj(O,L),await yj(O,L)});try{await Z$("format",()=>xj(O,W,X,Z,U)),await Z$("manifest.write",()=>vj(O))}catch(D){let k=D instanceof Error?D:Error(String(D));O.failures.push({title:`\u2717 ${k.message}`}),O.failedCount+=1}return uj(O,W,X,U),O.failedCount>0?1:0}function ij($,Q){let Z=Q.split(`
325
+ `).map((W)=>W.trim()).filter((W)=>W.length>0),[X="Unexpected error",...Y]=Z;return{title:`\u274C ${$}: ${X}`,details:Y.length>0?Y.join(`
326
+ `):void 0}}function oj($){return $.type!==w.AsyncApiNats}function aj($){return $.type===w.AsyncApiNats}function sj($){let Q=$.source?$.config.sources.filter((Y)=>Y.name===$.source):$.config.sources;if(Q.length===0)throw Error(`No kontract source named '${$.source}'`);let Z=[],X=!1;for(let Y of Q){let W=$.target?Y.targets.filter((J)=>J.name===$.target):Y.targets;if(W.length>0)X=!0;let U=W.map((J)=>J.generator);Z.push({source:Y,inputDir:nj(Y.input),validateOpenApi:U.some(oj),validateAsyncApi:U.some(aj)})}if($.target&&!X)throw Error(`No kontract target named '${$.target}'`);return Z.filter((Y)=>Y.validateOpenApi||Y.validateAsyncApi)}async function tj($){let Q=await zU(U9(TU(),"kontract-validate-"));try{let Z=await yQ({inputFile:$,kind:T$.AsyncApi,outputFile:U9(Q,"schema.asyncapi.yml")}),X=Bun.spawn(["bunx","@asyncapi/cli","validate",Z],{stdout:"pipe",stderr:"pipe",env:{...process.env}});if(await X.exited!==0){let W=await new Response(X.stderr).text();return{success:!1,file:$,kind:k$.AsyncApi,error:Error(W.trim())}}return{success:!0,file:$,kind:k$.AsyncApi}}catch(Z){return{success:!1,file:$,kind:k$.AsyncApi,error:Z instanceof Error?Z:Error(String(Z))}}finally{await jU(Q,{recursive:!0,force:!0})}}async function ej($){let Q=await zU(U9(TU(),"kontract-validate-"));try{let Z=await yQ({inputFile:$,kind:T$.OpenApi,outputFile:U9(Q,"schema.openapi.yml")}),X=await rj.parse(Z,{validate:{spec:!1}});return I9(X,{enforceOperationSchemaRefs:!0}),{success:!0,file:$,kind:k$.OpenApi}}catch(Z){return{success:!1,file:$,kind:k$.OpenApi,error:Z instanceof Error?Z:Error(String(Z))}}finally{await jU(Q,{recursive:!0,force:!0})}}function $T($,Q){return{printStep:(W)=>{if($)return;if(Q){Q.log.step(W,G$("step"));return}u8.step(W)},printInfo:(W)=>{if($)return;if(Q){Q.log.info(W,G$("info"));return}u8.info(W)},printFailure:(W)=>{if(!$&&Q){if(Q.log.error(W.title,{...G$("error"),symbol:"\u274C"}),W.details)Q.note(W.details,"Details",b$("dim"));return}if(u8.error(W.title),W.details)u8.error(W.details)}}}async function QT($){let Q=[],Z=[];for(let X of $){if(X.validateOpenApi){let Y=await oY(X.inputDir);Q.push(...Y.flatMap((W)=>W.files))}if(X.validateAsyncApi){let Y=await aY(X.inputDir);Z.push(...Y.flatMap((W)=>W.files))}}return{openApiFiles:Q,asyncApiFiles:Z}}function ZT($){let Q=$.filter((W)=>W.success&&W.kind===k$.OpenApi).length,Z=$.filter((W)=>!W.success&&W.kind===k$.OpenApi).length,X=$.filter((W)=>W.success&&W.kind===k$.AsyncApi).length,Y=$.filter((W)=>!W.success&&W.kind===k$.AsyncApi).length;return{summary:`API schemas: ${Q} passed, ${Z} failed | Async schemas: ${X} passed, ${Y} failed`,failedCount:Z+Y}}function bX($,Q,Z){return async(X)=>{let Y=await Q(X);Z.results.push(Y);let W=cj(X);if(Y.success)return Z.updateProgress(W,$,TQ.Passed),!0;return Z.failures.push(ij(`${W} (${$})`,Y.error.message)),Z.updateProgress(W,$,TQ.Failed),Y.success}}function XT($,Q,Z,X,Y){let W=0;return(U,J,G)=>{W+=1;let _=`Validating schemas (${W}/${$}) \u2022 ${U} (${J}, ${G})`;if(Q){Q.message(_);return}if(!Z&&X)Y(_)}}function YT($,Q,Z,X,Y){if(Z){if(Q>0)Z.error($);else Z.stop($);return}if(!X)Y($)}async function WT($){let{concurrency:Q,verbose:Z,quiet:X}=$,Y=X?null:await import("@clack/prompts"),W=Y?.spinner(H1("purple"))??null,{printStep:U,printInfo:J,printFailure:G}=$T(X,Y),_;try{_=sj($)}catch(O){let S=O instanceof Error?O:Error(String(O));return G({title:`\u2717 ${S.message}`}),1}U(`Kontract validate: ${_.map((O)=>O.source.name).join(", ")}`);let H,V;try{({openApiFiles:H,asyncApiFiles:V}=await QT(_))}catch(O){let S=O instanceof Error?O:Error(String(O));return G({title:`\u2717 ${S.message}`}),1}let q=H.length+V.length;if(q===0)return J("No schema files found for selected sources and targets."),0;if(W)W.start(`Validating schemas (0/${q})...`);let K={results:[],failures:[],updateProgress:XT(q,W,X,Z,U)};await Promise.all([_Q(H,bX(k$.OpenApi,ej,K),Q),_Q(V,bX(k$.AsyncApi,tj,K),Q)]);let{summary:B,failedCount:L}=ZT(K.results);if(YT(B,L,W,X,U),K.failures.length>0)for(let O of K.failures)G(O);return L>0?1:0}function k9($){let Q=VT($),Z=Q;for(;;){let X=kX(Z,b2);if(GT(X))return{cwd:Z,exists:!0,path:X};let Y=HT(Z);if(Y===Z)return{cwd:Q,exists:!1,path:kX(Q,b2)};Z=Y}}function FT($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function K0($,Q){if(!FT($))throw Error(`${Q} must be an object`);return $}function J9($,Q,Z){let X=$[Q];if(typeof X!=="string"||X.trim().length===0)throw Error(`${Z}.${Q} must be a non-empty string`);return X.trim()}function PX($,Q,Z){let X=$[Q];if(X===void 0)return;if(typeof X!=="string"||X.trim().length===0)throw Error(`${Z}.${Q} must be a non-empty string`);return X.trim()}function t$($,Q,Z){let X=$[Q];if(X===void 0)return;if(typeof X!=="boolean")throw Error(`${Z}.${Q} must be a boolean`);return X}function MU($,Q){if(!Array.isArray($)||$.length===0)throw Error(`${Q} must be a non-empty array`);return $}function e$($,Q,Z){let X=new Set(Q);for(let Y of Object.keys($))if(!X.has(Y))throw Error(`${Z}.${Y} is not supported`)}function MT($){for(let Q of KT)if(Q in $)throw Error(`kontract.${Q} is not supported. Use kontract.sources[].targets[]`)}function g1($,Q,Z,X){let Y=$[Q];if(Y===void 0)return;if(typeof Y!=="string")throw Error(`${X}.${Q} must be one of: ${Z.join(", ")}`);for(let W of Z)if(Y===W)return W;throw Error(`${X}.${Q} must be one of: ${Z.join(", ")}`)}function d8($,Q){return{schemaMode:g1($,"schemaMode",qY,Q),useSingleRequestParameter:t$($,"useSingleRequestParameter",Q),stringEnums:t$($,"stringEnums",Q),enumUnknownDefaultCase:t$($,"enumUnknownDefaultCase",Q),modelPropertyNaming:g1($,"modelPropertyNaming",_Y,Q),paramNaming:g1($,"paramNaming",HY,Q),enumPropertyNaming:g1($,"enumPropertyNaming",VY,Q),sortModelPropertiesByRequiredFlag:t$($,"sortModelPropertiesByRequiredFlag",Q),sortParamsByRequiredFlag:t$($,"sortParamsByRequiredFlag",Q)}}function ST($,Q){let Z=t$($,"dto",Q),X=t$($,"dtos",Q);if(Z!==void 0&&X!==void 0&&Z!==X)throw Error(`${Q}.dto conflicts with ${Q}.dtos. Use only one DTO option.`);return X??Z}function IT($,Q){let Z=g1($,"type",JQ,Q);if(!Z)throw Error(`${Q}.type must be one of: ${JQ.join(", ")}`);if(Z===w.AsyncApiNats)return e$($,jT,Q),{type:Z,prefix:PX($,"prefix",Q)};if(Z===w.TypeScriptNestJs){e$($,TT,Q);let X=t$($,"swagger",Q);return{type:Z,...d8($,Q),dtos:ST($,Q),sdk:t$($,"sdk",Q),swagger:X,zod:t$($,"zod",Q)}}if(Z===w.TypeScriptAngular)return e$($,ET,Q),{type:Z,...d8($,Q),providedIn:PX($,"providedIn",Q)};if(Z===w.TypeScriptModels)return e$($,CT,Q),{type:Z,...d8($,Q)};return e$($,FU,Q),{type:Z,...d8($,Q)}}function RT($,Q){let Z=K0($,Q);e$(Z,LT,Q);let X=IT(K0(Z.generator,`${Q}.generator`),`${Q}.generator`);return{name:J9(Z,"name",Q),output:J9(Z,"output",Q),generator:X}}function DT($,Q){let Z=K0($,Q);e$(Z,AT,Q);let X=MU(Z.targets,`${Q}.targets`).map((Y,W)=>RT(Y,`${Q}.targets[${W}]`));return{name:J9(Z,"name",Q),input:J9(Z,"input",Q),targets:X}}function NT($,Q){let Z=K0($,Q);return e$(Z,zT,Q),{apiStyle:g1(Z,"apiStyle",B0,Q)??v1.apiStyle,asyncStyle:g1(Z,"asyncStyle",A0,Q)??v1.asyncStyle,schemaLayoutStyle:g1(Z,"schemaLayoutStyle",L0,Q)??v1.schemaLayoutStyle}}function wT($,Q){if($===void 0)return;let Z=K0($,Q);return e$(Z,OT,Q),{profile:NT(Z.profile,`${Q}.profile`)}}function fX($,Q){let Z=new Set;for(let X of $){if(Z.has(X.name))throw Error(`Duplicate ${Q} name '${X.name}'`);Z.add(X.name)}}function bT($){let Q=qT($),Z=K0(Q,"sumr.yaml"),X=K0(Z.kontract,"kontract");MT(X),e$(X,BT,"kontract");let Y=MU(X.sources,"kontract.sources").map((J,G)=>DT(J,`kontract.sources[${G}]`));fX(Y,"source");let W=Y.flatMap((J)=>J.targets);fX(W,"target");let U=wT(X.guidance,"kontract.guidance");return U?{sources:Y,guidance:U}:{sources:Y}}function kT($){let Q=k9($);if(!Q.exists)throw Error(`${b2} not found. Define kontract.sources[].targets[]`);let Z=_T(Q.path,"utf8");return{config:bT(Z),configPath:Q.path,cwd:Q.cwd}}function PT($){return["kontract.guidance.profile",` apiStyle: ${$.apiStyle}`,` asyncStyle: ${$.asyncStyle}`,` schemaLayoutStyle: ${$.schemaLayoutStyle}`,""].join(`
327
+ `)}function fT($,Q){return $.some((Z)=>Z===Q)}function HZ($,Q){if(!$)return;let Z=$.trim();return fT(Q,Z)?Z:void 0}function ZQ($,Q,Z){if($===void 0)return;if(typeof $!=="string")throw Error(`${Z} must be one of: ${Q.join(", ")}`);let X=HZ($,Q);if(!X)throw Error(`${Z} must be one of: ${Q.join(", ")}`);return X}function XQ($,Q,Z){if($===void 0)return;let X=HZ($,Q);if(X)return X;throw Error(`${Z} must be one of: ${Q.join(", ")}`)}function DU($){let Q=k9($);if(!Q.exists)return v1;let Z=CU(EU(Q.path,"utf8"));if(Z.errors.length>0)throw Error(`${b2} is not valid YAML`);return{apiStyle:ZQ(Z.getIn(SU),B0,"kontract.guidance.profile.apiStyle")??v1.apiStyle,asyncStyle:ZQ(Z.getIn(IU),A0,"kontract.guidance.profile.asyncStyle")??v1.asyncStyle,schemaLayoutStyle:ZQ(Z.getIn(RU),L0,"kontract.guidance.profile.schemaLayoutStyle")??v1.schemaLayoutStyle}}function NU($,Q){return{apiStyle:XQ(Q.apiStyle,B0,"--api-style")??$.apiStyle,asyncStyle:XQ(Q.asyncStyle,A0,"--async-style")??$.asyncStyle,schemaLayoutStyle:XQ(Q.schemaLayoutStyle,L0,"--schema-layout-style")??$.schemaLayoutStyle}}function wU($,Q){let Z=k9($),X=Z.exists?EU(Z.path,"utf8"):`# SUMR per-repo configuration
328
+ version: 1
329
+ `,Y=CU(X);if(Y.errors.length>0)throw Error(`${b2} is not valid YAML`);Y.setIn(SU,Q.apiStyle),Y.setIn(IU,Q.asyncStyle),Y.setIn(RU,Q.schemaLayoutStyle),k1(Z.path,Y.toString())}function yT($,Q){return $.apiStyle===Q.apiStyle&&$.asyncStyle===Q.asyncStyle&&$.schemaLayoutStyle===Q.schemaLayoutStyle}function yX($,Q,Z,X,Y){$(`${JSON.stringify({ok:Q,command:"kontract config",data:Q?{profile:Z,changed:X}:null,warnings:[],error:Y},null,2)}
330
+ `)}async function xT($){let Q=$.writeOutput??((Z)=>{JT(1,Z)});try{let Z=DU($.cwd),X=NU(Z,$),Y=!yT(Z,X);if(Y)wU($.cwd,X);if($.json)return yX(Q,!0,X,Y,null),0;if(!$.quiet)P(Y?"Kontract guidance profile updated.":"Kontract guidance profile.",{details:PT(X).trimEnd()});return 0}catch(Z){let X=Z instanceof Error?Z.message:String(Z);if($.json)yX(Q,!1,null,!1,X);else if(!$.quiet)r(`Kontract config failed: ${X}`);return 1}}function aT($){for(let Q of $.split(/\r?\n/)){let Z=/^(\s+)"/.exec(Q);if(Z?.[1])return Z[1].length}return 2}function bU($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function sT($){let Q=oT($,n4);if(!pT(Q))return{indent:2,path:Q,settings:{},trailingNewline:!0};let Z=nT(Q,"utf8"),X=aT(Z),Y=Z.endsWith(`
331
+ `);try{let W=JSON.parse(Z);if(!bU(W))return{indent:X,path:Q,trailingNewline:Y};return{indent:X,path:Q,settings:W,trailingNewline:Y}}catch{return{indent:X,path:Q,trailingNewline:Y}}}function tT($,Q,Z,X){cT(iT($),{recursive:!0}),rT($,`${JSON.stringify(Q,null,Z)}${X?`
332
+ `:""}`,"utf8")}function eT($){let Q=$[WQ];if(!Object.hasOwn($,WQ))return{};return bU(Q)?Q:null}function $E($){let Q=[];for(let[Z,X]of Object.entries(sX)){if(Z in $)continue;$[Z]=X,Q.push(Z)}return Q}function QE($){let{path:Q,settings:Z,indent:X,trailingNewline:Y}=sT($);if(!Z)return{associationsAdded:[]};let W=eT(Z);if(!W)return{associationsAdded:[]};let U=$E(W);if(U.length===0)return{associationsAdded:U};return Z[WQ]=W,tT(Q,Z,X,Y),{associationsAdded:U}}function ZE($){let Q=vX($,m4);if(!xX(vX($,".git")))return!1;let Z=`${dX}/${d4}`,X=xX(Q)?gT(Q,"utf8"):"";if(X.split(/\r?\n/).includes(Z))return!1;return vT(dT(Q),{recursive:!0}),hT(Q,`${X.trimEnd()}
326
333
  ${Z}
327
- `,"utf8"),!0}function BL($){let{cwd:Q,json:Z,quiet:X}=$,U=$.writeOutput??((W)=>{OL(1,W)});n0($5,{cwd:Q});let J=qL(Q);if(Z)return U(`${JSON.stringify({ok:!0,command:"kontract init",data:{activated:$5,excludeUpdated:J,hint:Q5},warnings:[],error:null},null,2)}
328
- `),0;if(!X)v("Kontract is now active for this workspace.",{details:Q5});return 0}function DL($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function V2($,Q){if(!DL($))throw Error(`${Q} must be an object`);return $}function k6($,Q,Z){let X=$[Q];if(typeof X!=="string"||X.trim().length===0)throw Error(`${Z}.${Q} must be a non-empty string`);return X.trim()}function I5($,Q,Z){let X=$[Q];if(X===void 0)return;if(typeof X!=="string"||X.trim().length===0)throw Error(`${Z}.${Q} must be a non-empty string`);return X.trim()}function i$($,Q,Z){let X=$[Q];if(X===void 0)return;if(typeof X!=="boolean")throw Error(`${Z}.${Q} must be a boolean`);return X}function oU($,Q){if(!Array.isArray($)||$.length===0)throw Error(`${Q} must be a non-empty array`);return $}function M1($,Q,Z){let X=new Set(Q);for(let U of Object.keys($))if(!X.has(U))throw Error(`${Z}.${U} is not supported`)}function NL($){for(let Q of TL)if(Q in $)throw Error(`kontract.${Q} is not supported. Use kontract.sources[].targets[]`)}function J2($,Q,Z,X){let U=$[Q];if(U===void 0)return;if(typeof U!=="string")throw Error(`${X}.${Q} must be one of: ${Z.join(", ")}`);for(let J of Z)if(U===J)return J;throw Error(`${X}.${Q} must be one of: ${Z.join(", ")}`)}function O6($,Q){return{schemaMode:J2($,"schemaMode",a5,Q),useSingleRequestParameter:i$($,"useSingleRequestParameter",Q),stringEnums:i$($,"stringEnums",Q),enumUnknownDefaultCase:i$($,"enumUnknownDefaultCase",Q),modelPropertyNaming:J2($,"modelPropertyNaming",i5,Q),paramNaming:J2($,"paramNaming",r5,Q),enumPropertyNaming:J2($,"enumPropertyNaming",o5,Q),sortModelPropertiesByRequiredFlag:i$($,"sortModelPropertiesByRequiredFlag",Q),sortParamsByRequiredFlag:i$($,"sortParamsByRequiredFlag",Q)}}function wL($,Q){let Z=i$($,"dto",Q),X=i$($,"dtos",Q);if(Z!==void 0&&X!==void 0&&Z!==X)throw Error(`${Q}.dto conflicts with ${Q}.dtos. Use only one DTO option.`);return X??Z}function kL($,Q){let Z=J2($,"type",L9,Q);if(!Z)throw Error(`${Q}.type must be one of: ${L9.join(", ")}`);if(Z===w.AsyncApiNats)return M1($,SL,Q),{type:Z,prefix:I5($,"prefix",Q)};if(Z===w.TypeScriptNestJs){M1($,FL,Q);let X=i$($,"swagger",Q);return{type:Z,...O6($,Q),dtos:wL($,Q),sdk:i$($,"sdk",Q),swagger:X,zod:i$($,"zod",Q)}}if(Z===w.TypeScriptAngular)return M1($,IL,Q),{type:Z,...O6($,Q),providedIn:I5($,"providedIn",Q)};if(Z===w.TypeScriptModels)return M1($,RL,Q),{type:Z,...O6($,Q)};return M1($,rU,Q),{type:Z,...O6($,Q)}}function PL($,Q){let Z=V2($,Q);M1(Z,CL,Q);let X=kL(V2(Z.generator,`${Q}.generator`),`${Q}.generator`);return{name:k6(Z,"name",Q),output:k6(Z,"output",Q),generator:X}}function bL($,Q){let Z=V2($,Q);M1(Z,EL,Q);let X=oU(Z.targets,`${Q}.targets`).map((U,J)=>PL(U,`${Q}.targets[${J}]`));return{name:k6(Z,"name",Q),input:k6(Z,"input",Q),targets:X}}function R5($,Q){let Z=new Set;for(let X of $){if(Z.has(X.name))throw Error(`Duplicate ${Q} name '${X.name}'`);Z.add(X.name)}}function yL($){let Q=jL($),Z=V2(Q,"sumr.yaml"),X=V2(Z.kontract,"kontract");NL(X),M1(X,["sources"],"kontract");let U=oU(X.sources,"kontract.sources").map((W,Y)=>bL(W,`kontract.sources[${Y}]`));R5(U,"source");let J=U.flatMap((W)=>W.targets);return R5(J,"target"),{sources:U}}function fL($){let Q=ML($,tZ);if(!LL(Q))throw Error(`${tZ} not found. Define kontract.sources[].targets[]`);let Z=AL(Q,"utf8");return yL(Z)}function D5($,Q,Z){if(Z&&!Z.startsWith("-"))return $[Q]=Z,!0;return $[Q]=!0,!1}function hL($,Q,Z,X){if($.startsWith("--")){let U=$.indexOf("=");if(U!==-1)return Z[$.slice(2,U)]=$.slice(U+1),!1;return D5(Z,$.slice(2),Q)}if($.startsWith("-")&&$.length===2)return D5(Z,$.slice(1),Q);return X.push($),!1}function KQ($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let U=$[X];if(!U)continue;if(hL(U,$[X+1],Q,Z))X+=1}return{positionals:Z,options:Q}}function i1($,Q){for(let Z of Q){let X=$[Z];if(typeof X==="string")return X}return}function s1($,Q){return Q.some((Z)=>$[Z]===!0)}function qQ($,Q){if(Q.length===0)return 0;return r("sumr kontract"),j$(`Use \`sumr kontract ${$}\` with flags only.`),1}function aU(){try{return fL(process.cwd())}catch($){let Q=$ instanceof Error?$.message:String($);return r("sumr kontract"),j$(`Kontract config error: ${Q}`),null}}async function uL($){let Q=KQ($.argv.slice(1)),Z=qQ("generate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=aU();if(!U)return 1;let J=s1(Q.options,["quiet"])||X;if(!J)r("sumr kontract");let{runGenerate:W}=await Promise.resolve().then(()=>(nB(),mU));return W({config:U,concurrency:Number(i1(Q.options,["max-concurrent","concurrency","c"])??D9),source:i1(Q.options,["source"]),target:i1(Q.options,["target"]),specific:i1(Q.options,["specific","s"]),clean:s1(Q.options,["clean"]),verbose:s1(Q.options,["verbose"]),quiet:J})}async function dL($){let Q=KQ($.argv.slice(1)),Z=qQ("init",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=s1(Q.options,["quiet"])||X,J=s1(Q.options,["json"]);if(!U&&!J)r("sumr kontract");return BL({cwd:process.cwd(),json:J,quiet:U})}async function mL($){let Q=KQ($.argv.slice(1)),Z=qQ("validate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=aU();if(!U)return 1;let J=s1(Q.options,["quiet"])||X;if(!J)r("sumr kontract");let{runValidate:W}=await Promise.resolve().then(()=>(zL(),iU));return W({config:U,concurrency:Number(i1(Q.options,["concurrency","c"])??D9),source:i1(Q.options,["source"]),target:i1(Q.options,["target"]),verbose:s1(Q.options,["verbose"]),quiet:J})}var V_,H_=($)=>$,N5=($,Q)=>{for(var Z in Q)V_($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:O_.bind(Q,Z)})},M=($,Q)=>()=>($&&(Q=$($=0)),Q),sZ="biome",D9,tZ="sumr.yaml",q_="SUMR_CACHE_DIR",w5=".sumr-cache",k5="kontract",B_="manifests",P5="bundle-cache",L_="source-cache",b5=1,y5="KONTRACT_DISABLE_WORKERS",A_="KONTRACT_FORCE_MAIN_THREAD",eZ="0.0.0",M_="activations.json",$5="kontract",j_=".git/info/exclude",Q5="Run `sumr playbook sync` to install Kontract AI guidance into your AI tools.",f5,v5,T_="_bundle.yml",E_="@redocly/cli@2.28.1",C_="KONTRACT_DISABLE_REDOCLY_CORE",S_="application/json",F_="*/*",x5,g5,h5,u5,d5,N9="openapi:",m5="asyncapi:",I_="x-parser-schema-id",l5="x-origin",R_="<",D_="#/components/schemas/",p5=".dto.ts",N_="index.ts",w_="shared.ts",B9="enums",P6="index.ts",b6="shared",c5="<auto-generated>",n5,o,w,L9,i5,r5,o5,a5,b$,z$,S1,K6=null,H2,QX,ZX,XX,O2,G3,f9,MX,I3="sha256:",jX,TX,X2=null,_6=null,EX,p1,R3,t3,QV=()=>{},U5=2,AV=150,j9,J5,MV,bV,c1,yV,fX,j0,vX,X$=()=>{},hX,cV=`export interface IMsgContext {
334
+ `,"utf8"),!0}async function YQ($,Q,Z){let X=await lT({message:$,initialValue:Z,options:Q.map((Y)=>({value:Y,label:Y}))});if(mT(X))return Z;return HZ(X,Q)??Z}async function XE($){let Q=DU($.cwd),Z=NU(Q,$);if(!$.interactive)return Z;return{apiStyle:await YQ("Choose the API contract style",B0,Z.apiStyle),asyncStyle:await YQ("Choose the async contract style",A0,Z.asyncStyle),schemaLayoutStyle:await YQ("Choose the schema layout style",L0,Z.schemaLayoutStyle)}}function gX($,Q,Z,X,Y,W){$(`${JSON.stringify({ok:Q,command:"kontract init",data:Q?{activated:nX,excludeUpdated:X,hint:rX,profile:Z,vscodeIconAssociationsAdded:Y}:null,warnings:[],error:W},null,2)}
335
+ `)}async function YE($){let{json:Q,quiet:Z}=$,X=k9($.cwd).cwd,Y=$.writeOutput??((G)=>{uT(1,G)}),W;try{W=await XE({...$,cwd:X}),wU(X,W)}catch(G){let _=G instanceof Error?G.message:String(G);if(Q)gX(Y,!1,null,!1,[],_);else if(!Z)r(`Kontract init failed: ${_}`);return 1}C2(nX,{cwd:X});let U=ZE(X),J=QE(X);if(Q)return gX(Y,!0,W,U,J.associationsAdded,null),0;if(!Z)P("Kontract is now active for this workspace.",{details:[rX,`Profile: ${W.apiStyle}, ${W.asyncStyle}, ${W.schemaLayoutStyle}`,`VS Code icons: ${J.associationsAdded.length>0?`added ${J.associationsAdded.length} Kontract file associations`:"already in sync"}`].join(`
336
+ `)});return 0}function hX($,Q,Z){if(Z&&!Z.startsWith("-"))return $[Q]=Z,!0;return $[Q]=!0,!1}function _E($,Q,Z,X){if($.startsWith("--")){let Y=$.indexOf("=");if(Y!==-1)return Z[$.slice(2,Y)]=$.slice(Y+1),!1;return hX(Z,$.slice(2),Q)}if($.startsWith("-")&&$.length===2)return hX(Z,$.slice(1),Q);return X.push($),!1}function P9($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let Y=$[X];if(!Y)continue;if(_E(Y,$[X+1],Q,Z))X+=1}return{positionals:Z,options:Q}}function M$($,Q){for(let Z of Q){let X=$[Z];if(typeof X==="string")return X}return}function O1($,Q){return Q.some((Z)=>$[Z]===!0)}function f9($,Q){if(Q.length===0)return 0;return n("sumr kontract"),r(`Use \`sumr kontract ${$}\` with flags only.`),1}function PU($,Q,Z,X){let Y=new Set(Z),W=Object.keys(Q).find((U)=>!Y.has(U));if(!W)return 0;if(X)n("sumr kontract");return r(`Unknown option \`--${W}\` for \`sumr kontract ${$}\`.`),1}function fU(){try{return kT(process.cwd())}catch($){let Q=$ instanceof Error?$.message:String($);return n("sumr kontract"),r(`Kontract config error: ${Q}`),null}}async function HE($){let Q=P9($.argv.slice(1)),Z=f9("generate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",Y=fU();if(!Y)return 1;let W=process.cwd();process.chdir(Y.cwd);try{let{config:U}=Y,J=O1(Q.options,["quiet"])||X;if(!J)n("sumr kontract");let{runGenerate:G}=await Promise.resolve().then(()=>(lj(),qU));return await G({config:U,concurrency:Number(M$(Q.options,["max-concurrent","concurrency","c"])??EQ),source:M$(Q.options,["source"]),target:M$(Q.options,["target"]),specific:M$(Q.options,["specific","s"]),clean:O1(Q.options,["clean"]),verbose:O1(Q.options,["verbose"]),quiet:J})}finally{process.chdir(W)}}async function VE($){let Q=P9($.argv.slice(1)),Z=f9("init",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",Y=O1(Q.options,["quiet"])||X,W=O1(Q.options,["json"]),U=PU("init",Q.options,kU,!Y&&!W);if(U!==0)return U;if(!Y&&!W)n("sumr kontract");return YE({cwd:process.cwd(),json:W,quiet:Y,apiStyle:M$(Q.options,["api-style"]),asyncStyle:M$(Q.options,["async-style"]),schemaLayoutStyle:M$(Q.options,["schema-layout-style"]),interactive:!Y&&!W&&process.stdin.isTTY===!0&&process.stdout.isTTY===!0})}async function qE($){let Q=P9($.argv.slice(1)),Z=f9("config",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",Y=O1(Q.options,["quiet"])||X,W=O1(Q.options,["json"]),U=PU("config",Q.options,kU,!Y&&!W);if(U!==0)return U;if(!Y&&!W)n("sumr kontract");return xT({cwd:process.cwd(),json:W,quiet:Y,apiStyle:M$(Q.options,["api-style"]),asyncStyle:M$(Q.options,["async-style"]),schemaLayoutStyle:M$(Q.options,["schema-layout-style"])})}async function KE($){let Q=P9($.argv.slice(1)),Z=f9("validate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",Y=fU();if(!Y)return 1;let W=process.cwd();process.chdir(Y.cwd);try{let{config:U}=Y,J=O1(Q.options,["quiet"])||X;if(!J)n("sumr kontract");let{runValidate:G}=await Promise.resolve().then(()=>(UT(),OU));return await G({config:U,concurrency:Number(M$(Q.options,["concurrency","c"])??EQ),source:M$(Q.options,["source"]),target:M$(Q.options,["target"]),verbose:O1(Q.options,["verbose"]),quiet:J})}finally{process.chdir(W)}}var P4,f4=($)=>$,uX=($,Q)=>{for(var Z in Q)P4($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:y4.bind(Q,Z)})},j=($,Q)=>()=>($&&(Q=$($=0)),Q),UX="biome",EQ,b2="sumr.yaml",v4="SUMR_CACHE_DIR",dX=".sumr-cache",mX="kontract",g4="manifests",lX="bundle-cache",h4="source-cache",pX=1,cX="KONTRACT_DISABLE_WORKERS",u4="KONTRACT_FORCE_MAIN_THREAD",JX="0.0.0",d4="activations.json",nX="kontract",m4=".git/info/exclude",rX="Run `sumr playbook sync` to install Kontract AI guidance into your AI tools.",iX,oX,aX="kontract",l4="sets",GX="$sets",p4="api",c4="async",n4=".vscode/settings.json",WQ="material-icon-theme.files.associations",sX,tX,r4="_bundle.yml",i4="@redocly/cli@2.28.1",o4="KONTRACT_DISABLE_REDOCLY_CORE",a4="application/json",s4="*/*",eX,$Y,QY,ZY,XY,YY="openapi:",t4="asyncapi:",e4="x-parser-schema-id",WY="x-origin",$q="<",Qq="#/components/schemas/",UY=".dto.ts",Zq="index.ts",Xq="shared.ts",UQ="enums",G9="index.ts",_9="shared",JY="<auto-generated>",GY,m,w,JQ,_Y,HY,VY,qY,h$,B0,U0,A0,K1,L0,v1,k$,K$,u$,m8=null,d0,OY,zY,jY,v2,yq,B9,xY,QK="sha256:",vY,gY,R2=null,g8=null,hY,J0,ZK,RK,wK=()=>{},T$,A9,sY,g0,tY,qX=2,QB=150,VQ,KX,ZB,TB="openapi",EB="asyncapi",BQ="$ref",YW,yB,p8,cB,Y$=()=>{},VW,oB=`export interface IMsgContext {
329
337
  userId: string;
330
338
  orgId: string;
331
- }`,nV=`export interface IRouteContract<Req, Res> {
339
+ }`,aB=`export interface IRouteContract<Req, Res> {
332
340
  request: Req;
333
341
  response: Res;
334
- }`,iV=`export type IRouteContracts = Record<
342
+ }`,sB=`export type IRouteContracts = Record<
335
343
  string,
336
344
  IRouteContract<unknown, unknown>
337
- >;`,rV=`export interface IRawClientProxy {
345
+ >;`,tB=`export interface IRawClientProxy {
338
346
  emit<TResult = unknown, TInput = unknown>(
339
347
  router: unknown,
340
348
  message: TInput,
@@ -345,7 +353,7 @@ ${Z}
345
353
  message: TInput,
346
354
  ...extra: unknown[]
347
355
  ): Observable<TResult>;
348
- }`,oV=`export interface IClientProxy<
356
+ }`,eB=`export interface IClientProxy<
349
357
  TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> } = IRouteContracts,
350
358
  > {
351
359
  emit<Route extends keyof TRoutes & string>(
@@ -368,7 +376,7 @@ ${Z}
368
376
  message: Req,
369
377
  ctx?: IMsgContext,
370
378
  ): Observable<Res>;
371
- }`,aV=`class RouteTypedClientProxy<
379
+ }`,$A=`class RouteTypedClientProxy<
372
380
  TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
373
381
  > implements IClientProxy<TRoutes> {
374
382
  constructor(private readonly client: IRawClientProxy) {}
@@ -414,15 +422,15 @@ export function createRouteTypedClientProxy<
414
422
  TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
415
423
  >(client: IRawClientProxy): IClientProxy<TRoutes> {
416
424
  return new RouteTypedClientProxy<TRoutes>(client);
417
- }`,sV=`export interface CommandReturnType {
425
+ }`,QA=`export interface CommandReturnType {
418
426
  commandId: string;
419
- }`,uX,tV,B$,eV,BH,FH,bH,uH,iH,_O,S9,jO,B6,o$,aX,Y2,s9,B2,sX,F9,TO,R1,NO,wO,bO,XU,e9,cO,o6,GU,WK,O$,W$,L0,S0,KU,qU,TK="${",s6,wK,hK="unknown_default_open_api",TU,CU,FU,IU,aK,kU,Q0,Zq,Kq,bU,Tq,Sq,nq,L6=null,hU=()=>{},tq,A6,TB,mU,nB,R9,iB,iU,zL,TL,EL,CL,SL,FL,rU,IL,RL,vL,xL,gL,lL;var tU=c2(()=>{N();N();N();N();N();V_=Object.defineProperty;o=M(()=>{D9=Math.max(K_().length-1,2),f5=["**/*.{openapi,asyncapi,schema}.{yml,yaml}","**/schema.{yml,yaml}"],v5=["schemas","responses","parameters","examples","requestBodies","headers","securitySchemes","links","callbacks"],x5=/^application\/.+\+json$/i,g5=["200","201","202","204"],h5=["201","200","202","204"],u5=/^2\d\d$/,d5=new Set(["abstract","arguments","async","await","boolean","break","case","catch","class","const","continue",["debug","ger"].join(""),"declare","default","delete","do","else","enum","eval","export","extends","false","finally","for","from","function","if","implements","import","in","infer","instanceof","interface","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","return","satisfies","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield"]),n5=[`// ${c5}`,"// Generated by SUMR Kontract. Do not edit this file directly.","// Changes will be overwritten. Update the source OpenAPI/AsyncAPI spec and run:","// sumr kontract generate","// </auto-generated>","",""].join(`
420
- `)}),S1=M(()=>{w={AsyncApiNats:"asyncapi-nats",TypeScriptAngular:"typescript-angular",TypeScriptAxios:"typescript-axios",TypeScriptFetch:"typescript-fetch",TypeScriptModels:"typescript-models",TypeScriptNestJs:"typescript-nestjs"},L9=[w.TypeScriptNestJs,w.AsyncApiNats,w.TypeScriptFetch,w.TypeScriptAxios,w.TypeScriptAngular,w.TypeScriptModels],i5=["camelCase","PascalCase","snake_case","original"],r5=["camelCase","PascalCase","snake_case","original"],o5=["PascalCase","camelCase","snake_case","UPPERCASE","original"],a5=["normalize","strict"],b$={AsyncApi:"asyncapi",ContractLink:"contract-link",OpenApi:"openapi"},z$={Http:"http",Models:"models",Nats:"nats",Sdk:"sdk"}});H2=M(()=>{o()});O2=M(()=>{o(),QX={$schema:"https://biomejs.dev/schemas/2.4.15/schema.json",formatter:{enabled:!0,indentStyle:"space",indentWidth:2,lineWidth:100},javascript:{formatter:{quoteStyle:"single",semicolons:"always",trailingCommas:"es5"}}},ZX=/^(?<before>(?:#![^\n]*\n)?\n*)(?<imports>(?:import[\s\S]*?;\n(?:\n|$)*)+)/,XX=/^(?:#![^\n]*\n)?\n*\/\/#region \uD83D\uDCE6 Imports/});G3=M(()=>{o(),H2(),O2()});f9=M(()=>{o()});EX=M(()=>{f9(),o(),MX=/\$ref\s*:\s*['"]?([^'"\s#]+(?:#[^'"\s]+)?|#[^'"\s]+)['"]?/g,jX=new URL("../../package.json",import.meta.url),TX=["src/generators/**/*.ts","src/shared/**/*.ts","src/cli/generate*.ts"]}),R3=M(()=>{p1={Failed:"failed",Generated:"generated",Unchanged:"unchanged"}});t3=M(()=>{S1()});MV=M(()=>{o(),j9=Promise.resolve()});bV=M(()=>{o()}),yV=M(()=>{c1={AsyncApi:"asyncapi",OpenApi:"openapi"}});fX=M(()=>{o(),yV()}),vX=M(()=>{j0={AsyncApiNats:"asyncapi-nats",OpenApiNestJs:"openapi-nestjs",OpenApiSdk:"openapi-sdk"}});hX=M(()=>{X$()}),tV=M(()=>{uX=["import { Observable } from 'rxjs';","",cV,"",nV,"",iV,"",rV,"",oV,"",aV,"",sV].join(`
421
- `)}),eV=M(()=>{B$={Command:"command",Event:"event",Query:"query"}});BH=M(()=>{X$(),eV()});FH=M(()=>{o(),X$()});bH=M(()=>{X$()});uH=M(()=>{o(),hX(),H2(),O2(),tV(),X$(),BH(),FH(),bH()});iH=M(()=>{X$()});_O=M(()=>{X$()});jO=M(()=>{X$(),_O(),S9={addDtoImport:o9,addEnumImport:r9,emitHelperDto:a9}}),B2=M(()=>{B6={V3_0:"3.0",V3_1:"3.1",V3_2:"3.2"},o$={Array:"array",Enum:"enum",Object:"object",Ref:"ref",Scalar:"scalar",Unknown:"unknown"},aX={Boolean:"boolean",Integer:"integer",Number:"number",String:"string"},Y2={Body:"body",Path:"path",Query:"query",Schema:"schema"},s9={Operation:"operation",Schema:"schema"}}),TO=M(()=>{sX=["get","post","put","patch","delete","options","head","trace"],F9={Params:"Params",Query:"Query"}});R1=M(()=>{B2()});NO=M(()=>{B2(),R1()});wO=M(()=>{X$()});bO=M(()=>{B2()});XU=M(()=>{X$(),B2(),NO(),wO(),bO(),R1()});e9=M(()=>{o(),R1()});cO=M(()=>{X$(),B2(),TO(),XU(),R1(),e9()});o6=M(()=>{R1()});GU=M(()=>{cO(),XU(),R1(),o6()});WK=M(()=>{X$()}),S0=M(()=>{O$={Delete:"delete",Get:"get",Patch:"patch",Post:"post",Put:"put"},W$={Path:"path",Query:"query"},L0={Array:"Array",Boolean:"Boolean",Number:"Number",Object:"Object",String:"String"}});qU=M(()=>{S0(),R1(),KU=new Set(Object.values(O$))});s6=M(()=>{o(),S1()});wK=M(()=>{S1(),S0(),s6()});TU=M(()=>{X$(),s6()});CU=M(()=>{o(),S0(),R1()});aK=M(()=>{X$(),S0(),e9(),CU(),s6(),TU(),FU=[O$.Get,O$.Post,O$.Put,O$.Patch,O$.Delete],IU={model:"Models",enum:"Models",inlineEnums:"models"}});kU=M(()=>{H2(),O2(),S1(),GU(),o6(),qU(),wK(),s6(),TU(),aK()});Zq=M(()=>{Q0={Parameters:"parameters",RequestBodies:"requestBodies",Responses:"responses",Schemas:"schemas"}});Kq=M(()=>{X$(),S0(),Zq(),e9()});Tq=M(()=>{X$(),S0(),CU(),Kq(),bU=[O$.Get,O$.Post,O$.Put,O$.Patch,O$.Delete]});Sq=M(()=>{Tq()});nq=M(()=>{o(),hX(),H2(),O2(),X$(),iH(),jO(),GU(),o6(),WK(),qU(),kU(),Sq()});tq=M(()=>{uH(),nq(),kU(),vX(),hU()});TB=M(()=>{o(),MV(),EX(),bV(),fX(),S1(),vX(),f9(),tq(),A6=new Map}),mU={};N5(mU,{runGenerate:()=>pB});nB=M(()=>{G3(),o(),H2(),O2(),EX(),R3(),S1(),t3(),QV(),f9(),TB(),hU()}),iB=M(()=>{R9={Failed:"failed",Passed:"passed"}}),iU={};N5(iU,{runValidate:()=>GL});zL=M(()=>{o6(),fX(),iB(),S1()});o();o();S1();o();TL=["input","output","natsPrefix"],EL=["name","input","targets"],CL=["name","output","generator"],SL=["type","prefix"],FL=["type","dto","dtos","sdk","swagger","zod","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag","schemaMode"],rU=["type","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag","schemaMode"],IL=[...rU,"providedIn"],RL=["type","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","schemaMode"];vL={name:"kontract generate",description:"Generate configured contract artifacts from OpenAPI and AsyncAPI sources",usage:["sumr kontract generate","sumr kontract generate --source portal --target web-fetch"],options:[{flag:"--source <name>",description:"Generate only one configured source"},{flag:"--target <name>",description:"Generate only one configured target"},{flag:"-c, --concurrency <n>",description:"Max parallel generators"},{flag:"-s, --specific <name>",description:"Generate only schemas matching this name"},{flag:"--clean",description:"Delete selected outputs and Kontract cache before generate"},{flag:"--verbose",description:"Verbose output"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract generate --source portal --target api-nestjs"]},xL={name:"kontract init",description:"Activate Kontract AI guidance for this workspace",usage:["sumr kontract init","sumr kontract init --json"],options:[{flag:"--json",description:"Output a machine-readable JSON envelope"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract init"]},gL={name:"kontract validate",description:"Validate configured OpenAPI and AsyncAPI schema sources",usage:["sumr kontract validate","sumr kontract validate --source portal"],options:[{flag:"--source <name>",description:"Validate only one configured source"},{flag:"--target <name>",description:"Validate schemas needed by one target"},{flag:"--max-concurrent <n>",description:"Max parallel validators"},{flag:"-c, --concurrency <n>",description:"Alias for --max-concurrent"},{flag:"--verbose",description:"Show passing files"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract validate --source portal"]};lL=L1({name:"kontract",description:"Generate and validate API contract artifacts",group:"modules",visibility:"public",commands:[E({name:"init",description:"Activate Kontract AI guidance for this workspace",group:"modules",visibility:"public",help:xL,execute:dL}),E({name:"generate",description:"Generate configured contract artifacts from API specs",group:"modules",visibility:"public",help:vL,execute:uL}),E({name:"validate",description:"Validate API specifications",group:"modules",visibility:"public",help:gL,execute:mL})]})});var mJ={};p2(mJ,{missionModule:()=>FT});import{createHash as pL}from"crypto";import{existsSync as cL}from"fs";import{homedir as nL}from"os";import{join as N1}from"path";import{spawnSync as EA}from"child_process";import{createHash as IA}from"crypto";import{existsSync as kA,readFileSync as PA}from"fs";import{dirname as BJ,join as bA}from"path";import{z as L}from"zod";import{createHash as rA}from"crypto";import{existsSync as gM,readFileSync as hM,writeSync as uM}from"fs";import{join as dM}from"path";import{existsSync as _8,mkdirSync as V8,readdirSync as nM,readFileSync as FJ,rmSync as IJ,writeFileSync as QJ}from"fs";import{basename as iM,join as Z0}from"path";import{existsSync as Aj,mkdirSync as Mj,readFileSync as jj,writeFileSync as Tj}from"fs";import{dirname as Ej}from"path";import{mkdirSync as hJ,readFileSync as pj,writeFileSync as uJ}from"fs";import{join as F2}from"path";import{spawnSync as PQ}from"child_process";import{mkdirSync as XT,readFileSync as UT,writeFileSync as JT}from"fs";import{join as YJ}from"path";function w0($,Q){let Z=EA("git",[...Q],{cwd:$,stdio:"pipe",encoding:"utf8"});if(Z.status!==0)return;return Z.stdout.trim()||void 0}function CA($){return w0($,["rev-parse","--show-toplevel"])}function CQ($){return w0($,["branch","--show-current"])}function SA($){return w0($,["rev-parse","--short=12","HEAD"])}function SQ($){return w0($,["config","--get","remote.origin.url"])}function FA($){let Q=w0($,["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]);if(Q?.startsWith("origin/"))return Q.slice(7);return w0($,["config","--get","init.defaultBranch"])}function U8($){let Q=$.map((Z)=>Z.trim().toUpperCase()).filter((Z)=>KJ.test(Z));return[...new Set(Q)]}function qJ($){return $.map((Q)=>Q.trim()).filter((Q)=>Q.length>0&&!KJ.test(Q.toUpperCase()))}function AQ($){let Q=U8($);return Q.length>0?Q:[...RA]}function J8($){let Q=$.issueKey.trim();if(!Q)return{ok:!1,message:"Mission issue key cannot be empty."};let Z=AQ($.prefixes);if(Z.some((U)=>new RegExp(`^${wA(U)}-[0-9]+$`).test(Q)))return{ok:!0,issueKey:Q};if($.allowCustomKey&&DA.test(Q))return{ok:!0,issueKey:Q};return{ok:!1,message:`Mission issue key "${Q}" does not match configured prefixes (${Z.join(", ")}). Use --allow-custom-key for a slug.`}}function NA($){let Q=$.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80),Z=IA("sha256").update($).digest("hex").slice(0,8);return`${Q||"mission"}--${Z}`}function wA($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pA($,Q){return FQ(fA,$,Q)}function cA($,Q){return FQ(mA,$,Q)}function nA($,Q){return FQ(lA,$,Q)}function FQ($,Q,Z){let X=$.safeParse(Q);if(X.success)return X.data;throw Error(iA(Z,X.error))}function iA($,Q){let Z=Q.issues.map((X)=>{return`${X.path.length>0?X.path.join("."):"<root>"}: ${X.message}`}).join("; ");return`${$} is not valid Mission data: ${Z}`}function jJ($){return I2(zJ,$)}function TJ($){return I2(GJ,$)}function IQ($){return I2(EQ,$)}function oA($){return I2(VJ,$)}function aA($){return I2(_J,$)}function I2($,Q){return $.some((Z)=>Z===Q)}function MQ($){let Q=sA.find((Z)=>Z.id===$);if(Q)return Q;throw Error(`Unknown Mission action: ${$}`)}function tA($){let Q=G8($.flow);if(Q.length>0)throw Error(Q.join(`
422
- `));let Z=$.flow?.preset,X=Z&&IQ(Z)?Z:D$.Basic,U=$.flow?.steps?.length?$.flow.steps.map(JM):EJ[X];return{preset:X,steps:U}}function W8($){let Q=tA($),Z=XM(Q.steps);return{preset:Q.preset,hash:eA(Q.preset,Z),steps:Z.map((X)=>({uses:X.uses,enabled:X.enabled??!0,advance:X.advance??I.Manual,status:X.enabled===!1?f$.Skipped:f$.Pending}))}}function eA($,Q){return rA("sha256").update(JSON.stringify({preset:$,steps:Q})).digest("hex").slice(0,12)}function $M($){if(!$.flow)return $;let Q=$.flow.steps.map((Z)=>{let X=Z.enabled?GM($,Z.uses):f$.Skipped,U=zM($,Z.uses)??Z.artifactPath,J=X!==Z.status||U!==Z.artifactPath?new Date().toISOString():Z.updatedAt;return{...Z,status:X,artifactPath:U,updatedAt:J}});return{...$,flow:{...$.flow,steps:Q}}}function QM($){if(!$.flow)return;let Q=$.flow.steps.find((X)=>X.enabled&&X.status!==f$.Done);if(!Q)return"Close the mission.";if(Q.status===f$.Blocked)return`Resolve blocked step: ${MQ(Q.uses).label}.`;let Z=MQ(Q.uses);if(Q.advance===I.Human)return`${Z.nextAction} Human approval required.`;if(Q.advance===I.Ask)return`${Z.nextAction} Ask before continuing.`;return Z.nextAction}function Y8($){return $.steps.map((Q)=>{let Z=[];if(!Q.enabled||Q.status===f$.Skipped)Z.push(f$.Skipped);if(Q.advance!==I.Auto)Z.push(Q.advance);return Z.length>0?`${Q.uses}(${Z.join(", ")})`:Q.uses}).join(" -> ")}function G8($){let Q=[],Z=$?.preset;if(Z&&!IQ(Z))Q.push(`Unknown Mission flow preset: ${Z}`);for(let[X,U]of($?.steps??[]).entries()){if(!jJ(U.uses))Q.push(`Unknown Mission action at flow.steps[${X}]: ${U.uses}`);if(U.advance&&!TJ(U.advance))Q.push(`Invalid advance at flow.steps[${X}]: ${U.advance}`)}return Q}function ZM($){return EJ[$].map((Q)=>({...Q}))}function XM($){return $.map((Q)=>({uses:Q.uses,enabled:Q.enabled,advance:Q.advance??UM(Q.uses)}))}function UM($){return MQ($).externalWrite?I.Human:I.Manual}function JM($){if(!jJ($.uses))throw Error(`Unknown Mission action: ${$.uses}`);let{advance:Q}=$;return{uses:$.uses,enabled:$.enabled,advance:WM(Q)}}function WM($){if(!$)return;if(TJ($))return $;throw Error(`Invalid Mission flow advance: ${$}`)}function GM($,Q){if($.blocker)return f$.Blocked;let Z=YM[Q];if(!Z)return f$.Ready;return Z($)?f$.Done:f$.Ready}function zM($,Q){switch(Q){case A.PlanCreate:case A.PlanApprove:return $.plan?.latestPath;case A.ImplementationReport:return $.reports.implementation;case A.ReviewReport:return $.reports.review;case A.ValidationReport:return $.reports.validation;case A.QualityGate:return $.reports.quality;case A.PrPrepare:case A.PrCreate:return $.pr?.latestPath??$.pr?.url;default:return}}function _M($){let Q=VM($);if(!Q)return{mission:{issuePrefixes:[],retentionDays:RQ}};let Z=PA(Q,"utf8");return{filePath:Q,rootDir:BJ(Q),mission:SJ(Z)}}function VM($){let Q=$;while(!0){for(let X of c0){let U=bA(Q,X);if(kA(U))return U}let Z=BJ(Q);if(Z===Q)return;Q=Z}}function HM($,Q){let Z=U8(Q);if(Z.length===0)return;z8($,{issuePrefixes:Z})}function OM($,Q){if(!Q)return;z8($,{tracker:{provider:Q}})}function KM($,Q){if(!Q)return;z8($,{git:{provider:Q}})}function CJ($,Q){if(!Q)return;z8($,{flow:{preset:Q,steps:ZM(Q)}})}function z8($,Q){let Z=i2($),X=SJ(Z),U={...X,...Q,tracker:{...X.tracker,...Q.tracker},git:{...X.git,...Q.git},flow:{...X.flow,...Q.flow}};NM($,DM(U))}function w1($){$.inIssuePrefixes=!1,$.inTracker=!1,$.inGit=!1,$.inFlow=!1,$.inFlowSteps=!1}function qM($,Q){if(!/^\S/.test(Q))return!1;return $.inMission=/^mission:\s*$/.test(Q),w1($),$.currentFlowStepIndex=-1,!0}function BM($,Q){if(/^ {2}issuePrefixes:\s*$/.test(Q))return w1($),$.inIssuePrefixes=!0,$.mission.issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test(Q))return w1($),$.inTracker=!0,$.mission.tracker=$.mission.tracker??{},!0;if(/^ {2}git:\s*$/.test(Q))return w1($),$.inGit=!0,$.mission.git=$.mission.git??{},!0;if(/^ {2}flow:\s*$/.test(Q))return w1($),$.inFlow=!0,$.mission.flow=$.mission.flow??{},!0;return!1}function LM($,Q){if(!($.inTracker&&/^ {4}provider:\s*(.+)$/.test(Q)))return!1;let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X)$.mission.tracker={provider:X};return!0}function AM($,Q){if(!$.inGit)return!1;if(/^ {4}provider:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X)$.mission.git={...$.mission.git,provider:X};return!0}if(/^ {4}baseBranch:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}baseBranch:\s*(.+)$/)?.[1];if(Z)$.mission.git={...$.mission.git,baseBranch:G1(Z)};return!0}if(/^ {4}prMode:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}prMode:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X)$.mission.git={...$.mission.git,prMode:X};return!0}return!1}function MM($,Q){if(!$.inFlow)return!1;if(/^ {4}preset:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}preset:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X)$.mission.flow={...$.mission.flow,preset:X};return!0}if(/^ {4}steps:\s*$/.test(Q))return $.inFlowSteps=!0,$.currentFlowStepIndex=-1,$.mission.flow={...$.mission.flow,steps:[]},!0;return!1}function jM($,Q){if(!/^ {6}-\s+uses:\s*(.+)$/.test(Q))return!1;let Z=Q.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X)$.mission.flow=$.mission.flow??{},$.mission.flow.steps=$.mission.flow.steps??[],$.mission.flow.steps.push({uses:X}),$.currentFlowStepIndex=$.mission.flow.steps.length-1;return!0}function TM($,Q){if($.currentFlowStepIndex<0)return!1;if(/^ {8}enabled:\s*(true|false)/.test(Q)){let Z=/^ {8}enabled:\s*true/.test(Q),X=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(X)X.enabled=Z;return!0}if(/^ {8}advance:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {8}advance:\s*(.+)$/)?.[1],X=Z?G1(Z):void 0;if(X){let U=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(U)U.advance=X}return!0}return!1}function EM($,Q){if(!$.inFlowSteps)return!1;if(jM($,Q))return!0;return TM($,Q)}function CM($,Q){if(/^ {2}repoId:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {2}repoId:\s*(.+)$/)?.[1];if(Z)$.mission.repoId=G1(Z);return w1($),!0}if(/^ {2}retentionDays:\s*(\d+)/.test(Q)){let Z=Q.match(/^ {2}retentionDays:\s*(\d+)/)?.[1];if(Z)$.mission.retentionDays=Number(Z);return w1($),!0}return!1}function SM($,Q){let Z=Q.trimEnd();if(!Z||Z.trimStart().startsWith("#"))return;if(qM($,Z))return;if(!$.inMission)return;if(BM($,Z))return;if(LM($,Z))return;if(AM($,Z))return;if(MM($,Z))return;if(EM($,Z))return;if(CM($,Z))return;if(/^ {2}\S/.test(Z))w1($);if($.inIssuePrefixes&&/^ {4}-\s+(.+)$/.test(Z)){let X=Z.match(/^ {4}-\s+(.+)$/)?.[1];if(X)$.mission.issuePrefixes.push(G1(X).toUpperCase())}}function SJ($){let Q={mission:{issuePrefixes:[],retentionDays:RQ},inMission:!1,inIssuePrefixes:!1,inTracker:!1,inGit:!1,inFlow:!1,inFlowSteps:!1,currentFlowStepIndex:-1};for(let Z of $.split(/\r?\n/))SM(Q,Z);return pA(Q.mission,"sumr.yaml mission")}function G1($){let Q=$.replace(/\s+#.*$/,"").trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1).trim();return Q}function FM($){if(!($.git?.provider||$.git?.baseBranch||$.git?.prMode))return[];let Q=[" git:"];if($.git.provider)Q.push(` provider: ${$.git.provider}`);if($.git.baseBranch)Q.push(` baseBranch: ${$.git.baseBranch}`);if($.git.prMode)Q.push(` prMode: ${$.git.prMode}`);return Q}function IM($){if(!$.flow?.steps?.length)return[];let Q=[" steps:"];for(let Z of $.flow.steps){if(Q.push(` - uses: ${Z.uses}`),Z.enabled!==void 0)Q.push(` enabled: ${Z.enabled}`);if(Z.advance)Q.push(` advance: ${Z.advance}`)}return Q}function RM($){if(!($.flow?.preset||$.flow?.steps?.length))return[];let Q=[" flow:"];if($.flow.preset)Q.push(` preset: ${$.flow.preset}`);return Q.push(...IM($)),Q}function DM($){let Q=["# Mission","mission:"];if($.repoId)Q.push(` repoId: ${$.repoId}`);if($.tracker?.provider)Q.push(" tracker:"),Q.push(` provider: ${$.tracker.provider}`);if(Q.push(...FM($)),Q.push(...RM($)),$.issuePrefixes.length>0)Q.push(" issuePrefixes:"),Q.push(...$.issuePrefixes.map((Z)=>` - ${Z}`));if($.retentionDays!==RQ)Q.push(` retentionDays: ${$.retentionDays}`);return Q}function NM($,Q){d1($,"mission",Q,{sectionComment:"# Mission"})}function e($={}){let Q=$.cwd??process.cwd(),Z=$.home??nL(),X=_M(Q),U=CA(Q),J=yM({cwd:Q,gitRoot:U,configuredRepoId:X.mission.repoId}),W=X.rootDir?N0.Repo:N0.Global,Y=X.rootDir?N1(X.rootDir,kM,...bM):N1(Z,wM,...PM),G=N1(Y,"repos",J.repoId);return{cwd:Q,home:Z,storageScope:W,baseDir:Y,repoDir:G,missionsDir:N1(G,"missions"),repoId:J.repoId,repoLabel:J.repoLabel,config:X.mission,sumrConfigPath:X.filePath,sumrRootDir:X.rootDir,gitRoot:U}}function P1($,Q){let Z=NA(Q),X=N1($.missionsDir,Z);return{issueKey:Q,issuePathKey:Z,missionId:`${$.repoId}:${Q}`,missionDir:X,missionJsonPath:N1(X,"mission.json")}}function yM($){if($.configuredRepoId)return{repoId:vM($.configuredRepoId),repoLabel:$.configuredRepoId};let Q=SQ($.cwd);if(Q){let Z=fM(Q);return{repoId:eU(Z),repoLabel:Z}}if($.gitRoot){let Z=`path:${$.gitRoot}`;return{repoId:eU(Z),repoLabel:Z}}return{repoId:N0.Global,repoLabel:N0.Global}}function fM($){let Q=$.trim().replace(/\.git$/,""),Z=Q.match(/^git@([^:]+):(.+)$/);if(Z?.[1]&&Z[2])return`${Z[1]}/${Z[2]}`;try{let X=new URL(Q),U=X.pathname.replace(/^\/+/,"");return`${X.hostname}/${U}`}catch{return Q.replace(/^[^@]+@/,"")}}function eU($){return pL("sha256").update($).digest("hex").slice(0,12)}function vM($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"repo"}function xM($){if(!$.gitRoot)return;let Q=N1($.gitRoot,".git");if(!cL(Q))return;return N1(Q,"info","exclude")}function lM($,Q,Z){let X=Q.indexOf("="),U=X===-1?Q.slice(2):Q.slice(2,X),J=X===-1?void 0:Q.slice(X+1);if(J!==void 0)return $J($,U,J),!1;if(mM.has(U)&&Z&&!Z.startsWith("-"))return $J($,U,Z),!0;return $[U]=!0,!1}function pM($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let U=$[X];if(!U)continue;if(!U.startsWith("--")){Z.push(U);continue}if(lM(Q,U,$[X+1]))X+=1}return{positionals:Z,options:Q}}function $J($,Q,Z){if(Q!=="prefix"){$[Q]=Z;return}let X=$[Q];if(Array.isArray(X)){X.push(Z);return}if(typeof X==="string"){$[Q]=[X,Z];return}$[Q]=Z}function U$($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function cM($,Q){let Z=$[Q];if(Array.isArray(Z))return Z;if(typeof Z==="string")return[Z];return[]}function v$($,Q){return $[Q]===!0}function rM($){if($.status===m.Closed)return"Mission closed.";let Q=QM($);if(Q)return Q;if($.blocker)return`Resolve blocker: ${$.blocker.reason}`;if(!$.plan)return"Create and approve a plan.";if(!$.plan.approved)return"Approve the latest plan.";if(!$.claim)return"Claim the mission for implementation.";if(!$.reports.implementation)return"Create an implementation report.";if(!$.reports.review)return"Create a review report.";if(!$.reports.validation)return"Create a validation report.";if($.flow?.steps.some((Z)=>Z.uses===A.QualityGate)&&!$.reports.quality)return"Create a quality gate report.";return"Close the mission."}function oM($){if($.status===m.Closed)return m.Closed;if($.blocker)return m.Blocked;if($.reports.validation)return m.Validated;if($.reports.review)return m.Review;if($.claim)return m.InProgress;if($.plan?.approved)return m.Planned;return m.Planning}function X8(){return new Date().toISOString()}function k0($){V8($.missionsDir,{recursive:!0});let Q=Z0($.repoDir,"state.json");if(_8(Q)){let U=eM(Q),J={version:1,repoId:$.repoId,createdAt:U.createdAt,repoLabel:$.repoLabel,storageScope:$.storageScope,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:AQ($.config.issuePrefixes),updatedAt:X8()};return jQ(Q,J),J}let Z=X8(),X={version:1,repoId:$.repoId,repoLabel:$.repoLabel,storageScope:$.storageScope,createdAt:Z,updatedAt:Z,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:AQ($.config.issuePrefixes)};return jQ(Q,X),X}function RJ($,Q,Z){k0($);let X=P1($,Q),U=NJ(X);if(U)return U;V8(X.missionDir,{recursive:!0});let J=X8(),W=DJ({version:1,missionId:X.missionId,repoId:$.repoId,repoLabel:$.repoLabel,issueKey:Q,issuePathKey:X.issuePathKey,title:Z,status:m.Planning,storageScope:$.storageScope,createdAt:J,updatedAt:J,reports:{},flow:W8($.config),nextAction:"Create and approve a plan."});return s$($,W),W}function X0($,Q){return NJ(P1($,Q))}function aM($,Q){let Z=Q.includes(":")?Q.slice(Q.indexOf(":")+1):Q,X=X0($,Z);if(X)return X;for(let U of R2($,{allRepos:!1}))if(U.missionId===Q||U.issuePathKey===Q)return U;return}function s$($,Q){let Z=P1($,Q.issueKey);V8(Z.missionDir,{recursive:!0});let X=DJ({...Q,updatedAt:X8()});return jQ(Z.missionJsonPath,X),X}function R2($,Q){let Z=Q.allRepos?ZJ(Z0($.baseDir,"repos")):[$.repoDir],X=[];for(let U of Z){let J=Z0(U,"missions");for(let W of ZJ(J)){let Y=Z0(W,"mission.json");if(!_8(Y))continue;X.push(wJ(Y))}}return X.sort((U,J)=>J.updatedAt.localeCompare(U.updatedAt))}function sM($,Q,Z){if(!Z.force&&!Q.reports.validation)throw Error("Mission cannot close before a validation report exists. Use --force to override.");return s$($,{...Q,status:m.Closed,blocker:void 0,nextAction:"Mission closed."})}function tM($,Q){let Z=Date.now()-Q.olderThanDays*24*60*60*1000,X=[],U=[];for(let J of R2($,{allRepos:!0})){if(J.status!==m.Closed)continue;let W=Date.parse(J.updatedAt);if(Number.isNaN(W)||W>Z)continue;let Y=P1({...$,repoId:J.repoId,repoLabel:J.repoLabel,repoDir:Z0($.baseDir,"repos",J.repoId),missionsDir:Z0($.baseDir,"repos",J.repoId,"missions")},J.issueKey).missionDir;if(X.push(Y),!Q.dryRun)IJ(Y,{recursive:!0,force:!0}),U.push(Y)}return{eligible:X,removed:U}}function DJ($){let Q=$.status===m.Closed?m.Closed:oM($),Z=$M({...$,status:Q}),X=Q===m.Closed?"Mission closed.":rM(Z);return{...Z,nextAction:X}}function NJ($){if(!_8($.missionJsonPath))return;return wJ($.missionJsonPath)}function eM($){return cA(kJ($),$)}function wJ($){return nA(kJ($),$)}function kJ($){try{return JSON.parse(FJ($,"utf8"))}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);throw Error(`${$} contains invalid JSON: ${Z}`)}}function jQ($,Q){V8($j($),{recursive:!0});let Z=`${$}.sumr-tmp-${Date.now()}`;QJ(Z,`${JSON.stringify(Q,null,2)}
423
- `,"utf8"),QJ($,FJ(Z,"utf8"),"utf8"),IJ(Z,{force:!0})}function ZJ($){if(!_8($))return[];return nM($,{withFileTypes:!0}).filter((Q)=>Q.isDirectory()).map((Q)=>Z0($,Q.name))}function $j($){return $.slice(0,$.length-iM($).length-1)}function _$($){return pM($.argv.slice(1))}function h($){return v$($,"json")}function u($){uM(1,`${JSON.stringify($,null,2)}
424
- `)}function PJ($){return!h($)&&o0()}function b1($,Q,Z){if(!Z)return E$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let X=e(),U=J8({issueKey:Z,prefixes:X.config.issuePrefixes,allowCustomKey:v$(Q,"allow-custom-key")});if(!U.ok)return l(U.message),{ok:!1,code:1};return{ok:!0,issueKey:U.issueKey}}function DQ($,Q){let Z=e(),X=X0(Z,$);if(X)return X;return RJ(Z,$,Q??$)}function NQ($){return`${$.issueKey.padEnd(12)} ${$.status.padEnd(12)} ${$.nextAction}`}function Qj($,Q={}){let Z=[`Mission: ${$.issueKey}`,`Title: ${$.title}`,`Status: ${$.status}`,`Repo: ${$.repoLabel} (${$.repoId})`,`Next: ${$.nextAction}`];if(Zj(Z,$,Q.currentBranch),$.plan)Z.push(`Plan: ${$.plan.latestPath}${$.plan.approved?" (approved)":" (pending approval)"}`);if($.claim)Xj(Z,$.claim);if($.blocker)Z.push(`Blocker: ${$.blocker.reason}`);if($.flow)Z.push(`Flow: ${$.flow.preset} (${$.flow.hash})`),Z.push(`Flow steps: ${Y8($.flow)}`);return Uj(Z,$),Jj(Z,$),Z.join(`
425
- `)}function Zj($,Q,Z){if(Z)$.push(`Current branch: ${Z}`);if(Q.branch)$.push(`Mission branch: ${Q.branch}`);if(Q.sourceSha)$.push(`Mission source SHA: ${Q.sourceSha}`);let X=Q.claim?.branch??Q.branch;if(X&&Z&&Z!==X)$.push(`Branch warning: current branch ${Z} does not match mission branch ${X}. Switch to the recorded branch or intentionally reclaim the mission before implementation or PR creation.`)}function Xj($,Q){let Z=[`${Q.agent} at ${Q.startedAt}`];if(Q.branch)Z.push(`branch ${Q.branch}`);if(Q.sourceSha)Z.push(`sha ${Q.sourceSha}`);$.push(`Claim: ${Z.join(", ")}`)}function Uj($,Q){if(!(Q.pr?.latestPath||Q.pr?.url))return;if($.push("PR:"),Q.pr.latestPath)$.push(` preview: ${Q.pr.latestPath}`);if(Q.pr.url)$.push(` url: ${Q.pr.url}`)}function Jj($,Q){let Z=Object.entries(Q.reports);if(Z.length===0)return;$.push("Reports:");for(let[X,U]of Z)$.push(` ${X}: ${U}`)}function E$($,Q){l($,{title:"Usage",details:Q})}function l($,Q={}){j$($,Q)}function Wj($){let Q={[m.Blocked]:0,[m.Planning]:1,[m.Planned]:2,[m.InProgress]:3,[m.Review]:4,[m.Validated]:5};return[...$].sort((Z,X)=>{let U=(Q[Z.status]??99)-(Q[X.status]??99);if(U!==0)return U;return X.updatedAt.localeCompare(Z.updatedAt)})[0]}function wQ($,Q){return`${Vj()}-${$.issuePathKey}.${Q}.md`}function Yj($,Q){return`# Mission Plan: ${$}
427
+ }`,qW,ZA,j$,XA,TA,NA,vA,pA,sA,BL,OQ,ML,c8,Z1,CW,f2,cQ,u2,FW,zQ,SL,n1,PL,fL,vL,NW,rQ,oL,R9,fW,YO,BO,O$,_$,x0,c0,pW,cW,NO="${",b9,gO,rO="unknown_default_open_api",sW,eW,QU,ZU,Yz,JU,z0,Hz,Cz,_U,Nz,kz,sz,n8=null,VU=()=>{},Xj,zj,qU,lj,TQ,pj,OU,UT,KT,BT,AT,LT,OT,zT,jT,TT,FU,ET,CT,_Z,SU,IU,RU,WE,UE,kU,JE,GE,BE;var xU=A8(()=>{R();R();R();R();R();R();R();P4=Object.defineProperty;m=j(()=>{EQ=Math.max(x4().length-1,2),iX=["**/*.{api,async}.{yml,yaml}"],oX=["**/*.{openapi,asyncapi,schema}.{yml,yaml}","**/schema.{yml,yaml}"],sX={"*.api.yml":"http","*.api.yaml":"http","*.async.yml":"routing","*.async.yaml":"routing"},tX=["schemas","responses","parameters","examples","requestBodies","headers","securitySchemes","links","callbacks"],eX=/^application\/.+\+json$/i,$Y=["200","201","202","204"],QY=["201","200","202","204"],ZY=/^2\d\d$/,XY=new Set(["abstract","arguments","async","await","boolean","break","case","catch","class","const","continue",["debug","ger"].join(""),"declare","default","delete","do","else","enum","eval","export","extends","false","finally","for","from","function","if","implements","import","in","infer","instanceof","interface","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","return","satisfies","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield"]),GY=[`// ${JY}`,"// Generated by SUMR Kontract. Do not edit this file directly.","// Changes will be overwritten. Update the source API/async schema and run:","// sumr kontract generate","// </auto-generated>","",""].join(`
428
+ `)}),u$=j(()=>{w={AsyncApiNats:"asyncapi-nats",TypeScriptAngular:"typescript-angular",TypeScriptAxios:"typescript-axios",TypeScriptFetch:"typescript-fetch",TypeScriptModels:"typescript-models",TypeScriptNestJs:"typescript-nestjs"},JQ=[w.TypeScriptNestJs,w.AsyncApiNats,w.TypeScriptFetch,w.TypeScriptAxios,w.TypeScriptAngular,w.TypeScriptModels],_Y=["camelCase","PascalCase","snake_case","original"],HY=["camelCase","PascalCase","snake_case","original"],VY=["PascalCase","camelCase","snake_case","UPPERCASE","original"],qY=["normalize","strict"],h$={GraphqlHttp:"graphql-http",HypermediaRest:"hypermedia-rest",JsonApi:"json-api",Mixed:"mixed",OData:"odata",PragmaticRest:"pragmatic-rest",ResourceOriented:"resource-oriented",RpcAction:"rpc-action",WebhookCallback:"webhook-callback"},B0=[h$.PragmaticRest,h$.ResourceOriented,h$.JsonApi,h$.OData,h$.RpcAction,h$.GraphqlHttp,h$.HypermediaRest,h$.WebhookCallback,h$.Mixed],U0={CloudEvents:"cloud-events",CommandEvent:"command-event",EventDriven:"event-driven",Mixed:"mixed",RequestReply:"request-reply"},A0=[U0.CommandEvent,U0.EventDriven,U0.RequestReply,U0.CloudEvents,U0.Mixed],K1={ByApiSurface:"by-api-surface",ByMessageFamily:"by-message-family",ByProductCapability:"by-product-capability",ByResourceArea:"by-resource-area",ByServiceOwner:"by-service-owner",ByWorkflow:"by-workflow",Mixed:"mixed"},L0=[K1.ByProductCapability,K1.ByApiSurface,K1.ByServiceOwner,K1.ByResourceArea,K1.ByWorkflow,K1.ByMessageFamily,K1.Mixed],v1={apiStyle:h$.PragmaticRest,asyncStyle:U0.CommandEvent,schemaLayoutStyle:K1.ByProductCapability},k$={AsyncApi:"async",ContractLink:"contract-link",OpenApi:"api"},K$={Http:"http",Models:"models",Nats:"nats",Sdk:"sdk"}});d0=j(()=>{m()});v2=j(()=>{m(),OY={$schema:"https://biomejs.dev/schemas/2.4.15/schema.json",formatter:{enabled:!0,indentStyle:"space",indentWidth:2,lineWidth:100},javascript:{formatter:{quoteStyle:"single",semicolons:"always",trailingCommas:"es5"}}},zY=/^(?<before>(?:#![^\n]*\n)?\n*)(?<imports>(?:import[\s\S]*?;\n(?:\n|$)*)+)/,jY=/^(?:#![^\n]*\n)?\n*\/\/#region \uD83D\uDCE6 Imports/});yq=j(()=>{m(),d0(),v2()});B9=j(()=>{m()});hY=j(()=>{B9(),m(),xY=/\$ref\s*:\s*['"]?([^'"\s#]+(?:#[^'"\s]+)?|#[^'"\s]+)['"]?/g,vY=new URL("../../package.json",import.meta.url),gY=["src/generators/**/*.ts","src/shared/**/*.ts","src/cli/generate*.ts"]}),ZK=j(()=>{J0={Failed:"failed",Generated:"generated",Unchanged:"unchanged"}});RK=j(()=>{u$()});A9=j(()=>{T$={AsyncApi:"asyncapi",OpenApi:"openapi"}});sY=j(()=>{m(),A9()}),tY=j(()=>{g0={AsyncApiNats:"asyncapi-nats",OpenApiNestJs:"openapi-nestjs",OpenApiSdk:"openapi-sdk"}});ZB=j(()=>{m(),VQ=Promise.resolve()});YW=j(()=>{m(),A9()});yB=j(()=>{m()});cB=j(()=>{m(),ZB(),YW(),yB(),A9(),B9(),p8=new Map});VW=j(()=>{Y$()}),ZA=j(()=>{qW=["import { Observable } from 'rxjs';","",oB,"",aB,"",sB,"",tB,"",eB,"",$A,"",QA].join(`
429
+ `)}),XA=j(()=>{j$={Command:"command",Event:"event",Query:"query"}});TA=j(()=>{Y$(),XA()});NA=j(()=>{m(),Y$()});vA=j(()=>{Y$()});pA=j(()=>{m(),VW(),d0(),v2(),ZA(),Y$(),TA(),NA(),vA()});sA=j(()=>{Y$()});BL=j(()=>{Y$()});ML=j(()=>{Y$(),BL(),OQ={addDtoImport:lQ,addEnumImport:mQ,emitHelperDto:pQ}}),u2=j(()=>{c8={V3_0:"3.0",V3_1:"3.1",V3_2:"3.2"},Z1={Array:"array",Enum:"enum",Object:"object",Ref:"ref",Scalar:"scalar",Unknown:"unknown"},CW={Boolean:"boolean",Integer:"integer",Number:"number",String:"string"},f2={Body:"body",Path:"path",Query:"query",Schema:"schema"},cQ={Operation:"operation",Schema:"schema"}}),SL=j(()=>{FW=["get","post","put","patch","delete","options","head","trace"],zQ={Params:"Params",Query:"Query"}});n1=j(()=>{u2()});PL=j(()=>{u2(),n1()});fL=j(()=>{Y$()});vL=j(()=>{u2()});NW=j(()=>{Y$(),u2(),PL(),fL(),vL(),n1()});rQ=j(()=>{m(),n1()});oL=j(()=>{Y$(),u2(),SL(),NW(),n1(),rQ()});R9=j(()=>{n1()});fW=j(()=>{oL(),NW(),n1(),R9()});YO=j(()=>{m(),d0(),v2()});BO=j(()=>{Y$()}),c0=j(()=>{O$={Delete:"delete",Get:"get",Patch:"patch",Post:"post",Put:"put"},_$={Path:"path",Query:"query"},x0={Array:"Array",Boolean:"Boolean",Number:"Number",Object:"Object",String:"String"}});cW=j(()=>{c0(),n1(),pW=new Set(Object.values(O$))});b9=j(()=>{m(),u$()});gO=j(()=>{u$(),c0(),b9()});sW=j(()=>{Y$(),b9()});eW=j(()=>{m(),c0(),n1()});Yz=j(()=>{Y$(),c0(),rQ(),eW(),b9(),sW(),QU=[O$.Get,O$.Post,O$.Put,O$.Patch,O$.Delete],ZU={model:"Models",enum:"Models",inlineEnums:"models"}});JU=j(()=>{d0(),v2(),u$(),fW(),R9(),cW(),gO(),b9(),sW(),Yz()});Hz=j(()=>{z0={Parameters:"parameters",RequestBodies:"requestBodies",Responses:"responses",Schemas:"schemas"}});Cz=j(()=>{Y$(),c0(),Hz(),rQ()});Nz=j(()=>{Y$(),c0(),eW(),Cz(),_U=[O$.Get,O$.Post,O$.Put,O$.Patch,O$.Delete]});kz=j(()=>{Nz()});sz=j(()=>{m(),VW(),d0(),Y$(),sA(),ML(),fW(),R9(),YO(),BO(),cW(),JU(),kz()});Xj=j(()=>{pA(),sz(),JU(),tY(),VU()});zj=j(()=>{m(),hY(),sY(),u$(),tY(),B9(),cB(),Xj()}),qU={};uX(qU,{runGenerate:()=>dj});lj=j(()=>{yq(),m(),d0(),v2(),hY(),ZK(),u$(),RK(),wK(),B9(),zj(),VU()}),pj=j(()=>{TQ={Failed:"failed",Passed:"passed"}}),OU={};uX(OU,{runValidate:()=>WT});UT=j(()=>{R9(),YW(),sY(),pj(),u$(),A9()});m();u$();m();KT=["input","output","natsPrefix"],BT=["sources","guidance"],AT=["name","input","targets"],LT=["name","output","generator"],OT=["profile"],zT=["apiStyle","asyncStyle","schemaLayoutStyle"],jT=["type","prefix"],TT=["type","dto","dtos","sdk","swagger","zod","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag","schemaMode"],FU=["type","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag","schemaMode"],ET=[...FU,"providedIn"],CT=["type","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","schemaMode"];u$();_Z=["kontract","guidance","profile"],SU=[..._Z,"apiStyle"],IU=[..._Z,"asyncStyle"],RU=[..._Z,"schemaLayoutStyle"];m();m();u$();m();u$();WE={name:"kontract generate",description:"Generate configured contract artifacts from API and async schema sources",usage:["sumr kontract generate","sumr kontract generate --source portal --target web-fetch"],options:[{flag:"--source <name>",description:"Generate only one configured source"},{flag:"--target <name>",description:"Generate only one configured target"},{flag:"-c, --concurrency <n>",description:"Max parallel generators"},{flag:"-s, --specific <name>",description:"Generate only schemas matching this name"},{flag:"--clean",description:"Delete selected outputs and Kontract cache before generate"},{flag:"--verbose",description:"Verbose output"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract generate --source portal --target api-nestjs"]},UE={name:"kontract init",description:"Activate Kontract AI guidance for this workspace",usage:["sumr kontract init","sumr kontract init --json"],options:[{flag:"--api-style <style>",description:`API contract style guidance: ${B0.join(", ")}`},{flag:"--async-style <style>",description:`async contract style guidance: ${A0.join(", ")}`},{flag:"--schema-layout-style <style>",description:`Schema layout guidance: ${L0.join(", ")}`},{flag:"--json",description:"Output a machine-readable JSON envelope"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract init","sumr kontract init --api-style json-api --async-style cloud-events"]},kU=["async-style","api-style","json","quiet","schema-layout-style"],JE={name:"kontract config",description:"Show or update Kontract guidance profile settings",usage:["sumr kontract config","sumr kontract config --api-style json-api --async-style cloud-events"],options:[{flag:"--api-style <style>",description:`Set API example style: ${B0.join(", ")}`},{flag:"--async-style <style>",description:`Set async example style: ${A0.join(", ")}`},{flag:"--schema-layout-style <style>",description:`Set schema layout example style: ${L0.join(", ")}`},{flag:"--json",description:"Output a machine-readable JSON envelope"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract config","sumr kontract config --api-style rpc-action --schema-layout-style by-workflow"]},GE={name:"kontract validate",description:"Validate configured API and async schema sources",usage:["sumr kontract validate","sumr kontract validate --source portal"],options:[{flag:"--source <name>",description:"Validate only one configured source"},{flag:"--target <name>",description:"Validate schemas needed by one target"},{flag:"--max-concurrent <n>",description:"Max parallel validators"},{flag:"-c, --concurrency <n>",description:"Alias for --max-concurrent"},{flag:"--verbose",description:"Show passing files"},{flag:"--quiet",description:"Suppress all output except errors"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr kontract validate --source portal"]};BE=P1({name:"kontract",description:"Generate and validate API contract artifacts",group:"modules",visibility:"public",commands:[E({name:"init",description:"Activate Kontract AI guidance for this workspace",group:"modules",visibility:"public",help:UE,execute:VE}),E({name:"config",description:"Show or update Kontract guidance profile settings",group:"modules",visibility:"public",help:JE,execute:qE}),E({name:"generate",description:"Generate configured contract artifacts from API specs",group:"modules",visibility:"public",help:WE,execute:HE}),E({name:"validate",description:"Validate API specifications",group:"modules",visibility:"public",help:GE,execute:KE})]})});var NJ={};B8(NJ,{missionModule:()=>vS});import{createHash as AE}from"crypto";import{existsSync as LE}from"fs";import{homedir as OE}from"os";import{join as r1}from"path";import{spawnSync as nE}from"child_process";import{createHash as aE}from"crypto";import{existsSync as QC,readFileSync as ZC}from"fs";import{dirname as ZJ,join as XC}from"path";import{z as A}from"zod";import{createHash as TC}from"crypto";import{existsSync as HF,readFileSync as VF,writeSync as qF}from"fs";import{join as KF}from"path";import{existsSync as r9,mkdirSync as i9,readdirSync as zF,readFileSync as VJ,rmSync as qJ,writeFileSync as hU}from"fs";import{basename as jF,join as E0}from"path";import{existsSync as CF,readFileSync as FF}from"fs";import{existsSync as JM,mkdirSync as GM,readFileSync as _M,writeFileSync as HM}from"fs";import{dirname as VM}from"path";import{mkdirSync as NZ,readFileSync as PM,writeFileSync as wZ}from"fs";import{join as C0}from"path";import{spawnSync as s2}from"child_process";import{existsSync as fM,mkdirSync as yM,readFileSync as xM,renameSync as vM,rmSync as qZ}from"fs";import{join as jZ}from"path";import{spawnSync as PZ}from"child_process";import{mkdirSync as AS,readFileSync as LS,writeFileSync as OS}from"fs";import{join as iU}from"path";function a0($,Q){let Z=nE("git",[...Q],{cwd:$,stdio:"pipe",encoding:"utf8"});if(Z.status!==0)return;return Z.stdout.trim()||void 0}function rE($){return a0($,["rev-parse","--show-toplevel"])}function CZ($){return a0($,["branch","--show-current"])}function iE($){return a0($,["rev-parse","--short=12","HEAD"])}function u9($){return a0($,["config","--get","remote.origin.url"])}function oE($){let Q=a0($,["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]);if(Q?.startsWith("origin/"))return Q.slice(7);return a0($,["config","--get","init.defaultBranch"])}function d9($){let Q=$.map((Z)=>Z.trim().toUpperCase()).filter((Z)=>$J.test(Z));return[...new Set(Q)]}function QJ($){return $.map((Q)=>Q.trim()).filter((Q)=>Q.length>0&&!$J.test(Q.toUpperCase()))}function AZ($){let Q=d9($);return Q.length>0?Q:[...sE]}function m9($){let Q=$.issueKey.trim();if(!Q)return{ok:!1,message:"Mission issue key cannot be empty."};let Z=AZ($.prefixes);if(Z.some((Y)=>new RegExp(`^${$C(Y)}-[0-9]+$`).test(Q)))return{ok:!0,issueKey:Q};if($.allowCustomKey&&tE.test(Q))return{ok:!0,issueKey:Q};return{ok:!1,message:`Mission issue key "${Q}" does not match configured prefixes (${Z.join(", ")}). Use --allow-custom-key for a slug.`}}function eE($){let Q=$.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80),Z=aE("sha256").update($).digest("hex").slice(0,8);return`${Q||"mission"}--${Z}`}function $C($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function LC($,Q){return FZ(WC,$,Q)}function OC($,Q){return FZ(BC,$,Q)}function zC($,Q){return FZ(AC,$,Q)}function FZ($,Q,Z){let X=$.safeParse(Q);if(X.success)return X.data;throw Error(jC(Z,X.error))}function jC($,Q){let Z=Q.issues.map((X)=>{return`${X.path.length>0?X.path.join("."):"<root>"}: ${X.message}`}).join("; ");return`${$} is not valid Mission data: ${Z}`}function UJ($){return o2(aU,$)}function JJ($){return o2(oU,$)}function MZ($){return o2(TZ,$)}function EC($){return o2(sU,$)}function CC($){return o2(EZ,$)}function o2($,Q){return $.some((Z)=>Z===Q)}function LZ($){let Q=FC.find((Z)=>Z.id===$);if(Q)return Q;throw Error(`Unknown Mission action: ${$}`)}function MC($){let Q=c9($.flow);if(Q.length>0)throw Error(Q.join(`
430
+ `));let Z=$.flow?.preset,X=Z&&MZ(Z)?Z:f$.Basic,Y=$.flow?.steps?.length?$.flow.steps.map(bC):GJ[X];return{preset:X,steps:Y}}function l9($){let Q=MC($),Z=NC(Q.steps);return{preset:Q.preset,hash:SC(Q.preset,Z),steps:Z.map((X)=>({uses:X.uses,enabled:X.enabled??!0,advance:X.advance??I.Manual,status:X.enabled===!1?m$.Skipped:m$.Pending}))}}function SC($,Q){return TC("sha256").update(JSON.stringify({preset:$,steps:Q})).digest("hex").slice(0,12)}function IC($){if(!$.flow)return $;let Q=$.flow.steps.map((Z)=>{let X=Z.enabled?fC($,Z.uses):m$.Skipped,Y=yC($,Z.uses)??Z.artifactPath,W=X!==Z.status||Y!==Z.artifactPath?new Date().toISOString():Z.updatedAt;return{...Z,status:X,artifactPath:Y,updatedAt:W}});return{...$,flow:{...$.flow,steps:Q}}}function RC($){if(!$.flow)return;let Q=$.flow.steps.find((X)=>X.enabled&&X.status!==m$.Done);if(!Q)return"Close the mission.";if(Q.status===m$.Blocked)return`Resolve blocked step: ${LZ(Q.uses).label}.`;let Z=LZ(Q.uses);if($.qaFailure&&!$.reports.validation)return`Address QA failure and re-validate (${$.qaFailure.reason}). Next: ${Z.nextAction}`;if(Q.advance===I.Human)return`${Z.nextAction} Human approval required.`;if(Q.advance===I.Ask)return`${Z.nextAction} Ask before continuing.`;return Z.nextAction}function p9($){return $.steps.map((Q)=>{let Z=[];if(!Q.enabled||Q.status===m$.Skipped)Z.push(m$.Skipped);if(Q.advance!==I.Auto)Z.push(Q.advance);return Z.length>0?`${Q.uses}(${Z.join(", ")})`:Q.uses}).join(" -> ")}function c9($){let Q=[],Z=$?.preset;if(Z&&!MZ(Z))Q.push(`Unknown Mission flow preset: ${Z}`);for(let[X,Y]of($?.steps??[]).entries()){if(!UJ(Y.uses))Q.push(`Unknown Mission action at flow.steps[${X}]: ${Y.uses}`);if(Y.advance&&!JJ(Y.advance))Q.push(`Invalid advance at flow.steps[${X}]: ${Y.advance}`)}return Q}function DC($){return GJ[$].map((Q)=>({...Q}))}function NC($){return $.map((Q)=>({uses:Q.uses,enabled:Q.enabled,advance:Q.advance??wC(Q.uses)}))}function wC($){return LZ($).externalWrite?I.Human:I.Manual}function bC($){if(!UJ($.uses))throw Error(`Unknown Mission action: ${$.uses}`);let{advance:Q}=$;return{uses:$.uses,enabled:$.enabled,advance:kC(Q)}}function kC($){if(!$)return;if(JJ($))return $;throw Error(`Invalid Mission flow advance: ${$}`)}function fC($,Q){if($.blocker)return m$.Blocked;let Z=PC[Q];if(!Z)return m$.Ready;return Z($)?m$.Done:m$.Ready}function yC($,Q){switch(Q){case z.PlanCreate:case z.PlanApprove:return $.plan?.latestPath;case z.ImplementationReport:return $.reports.implementation;case z.ReviewReport:return $.reports.review;case z.ValidationReport:return $.reports.validation;case z.QualityGate:return $.reports.quality;case z.PrPrepare:case z.PrCreate:return $.pr?.latestPath??$.pr?.url;default:return}}function xC($){let Q=vC($);if(!Q)return{mission:{issuePrefixes:[],retentionDays:SZ}};let Z=ZC(Q,"utf8");return{filePath:Q,rootDir:ZJ(Q),mission:HJ(Z)}}function vC($){let Q=$;for(;;){for(let X of E2){let Y=XC(Q,X);if(QC(Y))return Y}let Z=ZJ(Q);if(Z===Q)return;Q=Z}}function gC($,Q){let Z=d9(Q);if(Z.length===0)return;n9($,{issuePrefixes:Z})}function hC($,Q){if(!Q)return;n9($,{tracker:{provider:Q}})}function uC($,Q){if(!Q)return;n9($,{git:{provider:Q}})}function _J($,Q){if(!Q)return;n9($,{flow:{preset:Q,steps:DC(Q)}})}function n9($,Q){let Z=D8($),X=HJ(Z),Y={...X,...Q,tracker:{...X.tracker,...Q.tracker},git:{...X.git,...Q.git},flow:{...X.flow,...Q.flow}};QF($,$F(Y))}function i1($){$.inIssuePrefixes=!1,$.inTracker=!1,$.inGit=!1,$.inFlow=!1,$.inFlowSteps=!1}function dC($,Q){if(!/^\S/.test(Q))return!1;return $.inMission=/^mission:\s*$/.test(Q),i1($),$.currentFlowStepIndex=-1,!0}function mC($,Q){if(/^ {2}issuePrefixes:\s*$/.test(Q))return i1($),$.inIssuePrefixes=!0,$.mission.issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test(Q))return i1($),$.inTracker=!0,$.mission.tracker=$.mission.tracker??{},!0;if(/^ {2}git:\s*$/.test(Q))return i1($),$.inGit=!0,$.mission.git=$.mission.git??{},!0;if(/^ {2}flow:\s*$/.test(Q))return i1($),$.inFlow=!0,$.mission.flow=$.mission.flow??{},!0;return!1}function lC($,Q){if(!($.inTracker&&/^ {4}provider:\s*(.+)$/.test(Q)))return!1;let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X)$.mission.tracker={provider:X};return!0}function pC($,Q){if(!$.inGit)return!1;if(/^ {4}provider:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X)$.mission.git={...$.mission.git,provider:X};return!0}if(/^ {4}baseBranch:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}baseBranch:\s*(.+)$/)?.[1];if(Z)$.mission.git={...$.mission.git,baseBranch:C1(Z)};return!0}if(/^ {4}prMode:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}prMode:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X)$.mission.git={...$.mission.git,prMode:X};return!0}return!1}function cC($,Q){if(!$.inFlow)return!1;if(/^ {4}preset:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}preset:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X)$.mission.flow={...$.mission.flow,preset:X};return!0}if(/^ {4}steps:\s*$/.test(Q))return $.inFlowSteps=!0,$.currentFlowStepIndex=-1,$.mission.flow={...$.mission.flow,steps:[]},!0;return!1}function nC($,Q){if(!/^ {6}-\s+uses:\s*(.+)$/.test(Q))return!1;let Z=Q.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X)$.mission.flow=$.mission.flow??{},$.mission.flow.steps=$.mission.flow.steps??[],$.mission.flow.steps.push({uses:X}),$.currentFlowStepIndex=$.mission.flow.steps.length-1;return!0}function rC($,Q){if($.currentFlowStepIndex<0)return!1;if(/^ {8}enabled:\s*(true|false)/.test(Q)){let Z=/^ {8}enabled:\s*true/.test(Q),X=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(X)X.enabled=Z;return!0}if(/^ {8}advance:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {8}advance:\s*(.+)$/)?.[1],X=Z?C1(Z):void 0;if(X){let Y=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(Y)Y.advance=X}return!0}return!1}function iC($,Q){if(!$.inFlowSteps)return!1;if(nC($,Q))return!0;return rC($,Q)}function oC($,Q){if(/^ {2}repoId:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {2}repoId:\s*(.+)$/)?.[1];if(Z)$.mission.repoId=C1(Z);return i1($),!0}if(/^ {2}retentionDays:\s*(\d+)/.test(Q)){let Z=Q.match(/^ {2}retentionDays:\s*(\d+)/)?.[1];if(Z)$.mission.retentionDays=Number(Z);return i1($),!0}return!1}function aC($,Q){let Z=Q.trimEnd();if(!Z||Z.trimStart().startsWith("#"))return;if(dC($,Z))return;if(!$.inMission)return;if(mC($,Z))return;if(lC($,Z))return;if(pC($,Z))return;if(cC($,Z))return;if(iC($,Z))return;if(oC($,Z))return;if(/^ {2}\S/.test(Z))i1($);if($.inIssuePrefixes&&/^ {4}-\s+(.+)$/.test(Z)){let X=Z.match(/^ {4}-\s+(.+)$/)?.[1];if(X)$.mission.issuePrefixes.push(C1(X).toUpperCase())}}function HJ($){let Q={mission:{issuePrefixes:[],retentionDays:SZ},inMission:!1,inIssuePrefixes:!1,inTracker:!1,inGit:!1,inFlow:!1,inFlowSteps:!1,currentFlowStepIndex:-1};for(let Z of $.split(/\r?\n/))aC(Q,Z);return LC(Q.mission,"sumr.yaml mission")}function C1($){let Q=$.replace(/\s+#.*$/,"").trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1).trim();return Q}function sC($){if(!($.git?.provider||$.git?.baseBranch||$.git?.prMode))return[];let Q=[" git:"];if($.git.provider)Q.push(` provider: ${$.git.provider}`);if($.git.baseBranch)Q.push(` baseBranch: ${$.git.baseBranch}`);if($.git.prMode)Q.push(` prMode: ${$.git.prMode}`);return Q}function tC($){if(!$.flow?.steps?.length)return[];let Q=[" steps:"];for(let Z of $.flow.steps){if(Q.push(` - uses: ${Z.uses}`),Z.enabled!==void 0)Q.push(` enabled: ${Z.enabled}`);if(Z.advance)Q.push(` advance: ${Z.advance}`)}return Q}function eC($){if(!($.flow?.preset||$.flow?.steps?.length))return[];let Q=[" flow:"];if($.flow.preset)Q.push(` preset: ${$.flow.preset}`);return Q.push(...tC($)),Q}function $F($){let Q=["# Mission","mission:"];if($.repoId)Q.push(` repoId: ${$.repoId}`);if($.tracker?.provider)Q.push(" tracker:"),Q.push(` provider: ${$.tracker.provider}`);if(Q.push(...sC($)),Q.push(...eC($)),$.issuePrefixes.length>0)Q.push(" issuePrefixes:"),Q.push(...$.issuePrefixes.map((Z)=>` - ${Z}`));if($.retentionDays!==SZ)Q.push(` retentionDays: ${$.retentionDays}`);return Q}function QF($,Q){Y0($,"mission",Q,{sectionComment:"# Mission"})}function a($={}){let Q=$.cwd??process.cwd(),Z=$.home??OE(),X=xC(Q),Y=rE(Q),W=UF({cwd:Q,gitRoot:Y,configuredRepoId:X.mission.repoId}),U=X.rootDir?o0.Repo:o0.Global,J=X.rootDir?r1(X.rootDir,XF,...WF):r1(Z,ZF,...YF),G=r1(J,"repos",W.repoId);return{cwd:Q,home:Z,storageScope:U,baseDir:J,repoDir:G,missionsDir:r1(G,"missions"),repoId:W.repoId,repoLabel:W.repoLabel,config:X.mission,sumrConfigPath:X.filePath,sumrRootDir:X.rootDir,gitRoot:Y}}function Y1($,Q){let Z=eE(Q),X=r1($.missionsDir,Z);return{issueKey:Q,issuePathKey:Z,missionId:`${$.repoId}:${Q}`,missionDir:X,missionJsonPath:r1(X,"mission.json")}}function UF($){if($.configuredRepoId)return{repoId:GF($.configuredRepoId),repoLabel:$.configuredRepoId};let Q=u9($.cwd);if(Q){let Z=JF(Q);return{repoId:vU(Z),repoLabel:Z}}if($.gitRoot){let Z=`path:${$.gitRoot}`;return{repoId:vU(Z),repoLabel:Z}}return{repoId:o0.Global,repoLabel:o0.Global}}function JF($){let Q=$.trim().replace(/\.git$/,""),Z=Q.match(/^git@([^:]+):(.+)$/);if(Z?.[1]&&Z[2])return`${Z[1]}/${Z[2]}`;try{let X=new URL(Q),Y=X.pathname.replace(/^\/+/,"");return`${X.hostname}/${Y}`}catch{return Q.replace(/^[^@]+@/,"")}}function vU($){return AE("sha256").update($).digest("hex").slice(0,12)}function GF($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"repo"}function _F($){if(!$.gitRoot)return;let Q=r1($.gitRoot,".git");if(!LE(Q))return;return r1(Q,"info","exclude")}function AF($,Q,Z){let X=Q.indexOf("="),Y=X===-1?Q.slice(2):Q.slice(2,X),W=X===-1?void 0:Q.slice(X+1);if(W!==void 0)return gU($,Y,W),!1;if(BF.has(Y)&&Z&&!Z.startsWith("-"))return gU($,Y,Z),!0;return $[Y]=!0,!1}function LF($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let Y=$[X];if(!Y)continue;if(!Y.startsWith("--")){Z.push(Y);continue}if(AF(Q,Y,$[X+1]))X+=1}return{positionals:Z,options:Q}}function gU($,Q,Z){if(Q!=="prefix"){$[Q]=Z;return}let X=$[Q];if(Array.isArray(X)){X.push(Z);return}if(typeof X==="string"){$[Q]=[X,Z];return}$[Q]=Z}function t($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function OF($,Q){let Z=$[Q];if(Array.isArray(Z))return Z;if(typeof Z==="string")return[Z];return[]}function l$($,Q){return $[Q]===!0}function TF($){if($.status===y.Closed)return"Mission closed.";let Q=RC($);if(Q)return Q;if($.blocker)return`Resolve blocker: ${$.blocker.reason}`;if($.qaFailure&&!$.reports.validation)return`Address QA failure and re-validate: ${$.qaFailure.reason}`;if(!$.plan)return"Create and approve a plan.";if(!$.plan.approved)return"Approve the latest plan.";if(!$.claim)return"Claim the mission for implementation.";if(!$.reports.implementation)return"Create an implementation report.";if(!$.reports.review)return"Create a review report.";if(!$.reports.validation)return"Create a validation report.";if($.flow?.steps.some((Z)=>Z.uses===z.QualityGate)&&!$.reports.quality)return"Create a quality gate report.";return"Close the mission."}function EF($){if($.status===y.Closed)return y.Closed;if($.blocker)return y.Blocked;if($.reports.validation)return y.Validated;if($.qaFailure)return y.QaFailed;if($.reports.review)return y.Review;if($.claim)return y.InProgress;if($.plan?.approved)return y.Planned;return y.Planning}function RF($){if(!CF($))return{ok:!1,reason:`Validation report file is missing: ${$}`};let Q;try{Q=FF($,"utf8")}catch(Z){return{ok:!1,reason:`Could not read validation report ${$}: ${Z instanceof Error?Z.message:String(Z)}`}}return DF(Q)}function DF($){let Q=uU($,MF);if(!dU(Q))return{ok:!1,reason:'Validation report needs a filled-in "Reproduction" section describing how the issue was reproduced. Replace the placeholder or pass --force.'};let Z=uU($,SF),X=dU(Z)?Z:$;if(!NF(X))return{ok:!1,reason:"Validation report needs at least one command, test, or UI-evidence reference (for example a `command`, test name, URL, or screenshot). Add evidence or pass --force."};return{ok:!0}}function uU($,Q){let Z=Q.exec($);if(!Z||Z.index===void 0)return"";let X=Z.index+Z[0].length,Y=$.slice(X),W=/^#{1,6}\s+\S/m.exec(Y);return W?Y.slice(0,W.index):Y}function dU($){return $.split(/\r?\n/).map((Z)=>Z.replace(/^[-*\d.\s]+/,"").trim()).filter((Z)=>Z.length>0).some((Z)=>!KJ.test(Z))}function NF($){return $.split(/\r?\n/).map((Q)=>Q.trim()).filter((Q)=>Q.length>0&&!KJ.test(Q)).some((Q)=>IF.test(Q))}function g9(){return new Date().toISOString()}function s0($){i9($.missionsDir,{recursive:!0});let Q=E0($.repoDir,"state.json");if(r9(Q)){let Y=PF(Q),W={version:1,repoId:$.repoId,createdAt:Y.createdAt,repoLabel:$.repoLabel,storageScope:$.storageScope,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:AZ($.config.issuePrefixes),updatedAt:g9()};return OZ(Q,W),W}let Z=g9(),X={version:1,repoId:$.repoId,repoLabel:$.repoLabel,storageScope:$.storageScope,createdAt:Z,updatedAt:Z,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:AZ($.config.issuePrefixes)};return OZ(Q,X),X}function BJ($,Q,Z){s0($);let X=Y1($,Q),Y=LJ(X);if(Y)return Y;i9(X.missionDir,{recursive:!0});let W=g9(),U=AJ({version:1,missionId:X.missionId,repoId:$.repoId,repoLabel:$.repoLabel,issueKey:Q,issuePathKey:X.issuePathKey,title:Z,status:y.Planning,storageScope:$.storageScope,createdAt:W,updatedAt:W,reports:{},flow:l9($.config),nextAction:"Create and approve a plan."});return I$($,U),U}function a1($,Q){return LJ(Y1($,Q))}function wF($,Q){let Z=Q.includes(":")?Q.slice(Q.indexOf(":")+1):Q,X=a1($,Z);if(X)return X;for(let Y of a2($,{allRepos:!1}))if(Y.missionId===Q||Y.issuePathKey===Q)return Y;return}function I$($,Q){let Z=Y1($,Q.issueKey);i9(Z.missionDir,{recursive:!0});let X=AJ({...Q,updatedAt:g9()});return OZ(Z.missionJsonPath,X),X}function a2($,Q){let Z=Q.allRepos?mU(E0($.baseDir,"repos")):[$.repoDir],X=[];for(let Y of Z){let W=E0(Y,"missions");for(let U of mU(W)){let J=E0(U,"mission.json");if(!r9(J))continue;X.push(OJ(J))}}return X.sort((Y,W)=>W.updatedAt.localeCompare(Y.updatedAt))}function bF($,Q,Z){if(!Z.force){if(!Q.reports.validation)throw Error("Mission cannot close before a validation report exists. Use --force to override.");let X=RF(Q.reports.validation);if(!X.ok)throw Error(`Mission cannot close: ${X.reason}`);if(Q.qaFailure)throw Error("Mission cannot close while a QA failure is unresolved. Record a fresh validation report after the corrective cycle, or use --force to override.")}return I$($,{...Q,status:y.Closed,blocker:void 0,nextAction:"Mission closed."})}function kF($,Q){let Z=Date.now()-Q.olderThanDays*24*60*60*1000,X=[],Y=[];for(let W of a2($,{allRepos:!0})){if(W.status!==y.Closed)continue;let U=Date.parse(W.updatedAt);if(Number.isNaN(U)||U>Z)continue;let J=Y1({...$,repoId:W.repoId,repoLabel:W.repoLabel,repoDir:E0($.baseDir,"repos",W.repoId),missionsDir:E0($.baseDir,"repos",W.repoId,"missions")},W.issueKey).missionDir;if(X.push(J),!Q.dryRun)qJ(J,{recursive:!0,force:!0}),Y.push(J)}return{eligible:X,removed:Y}}function AJ($){let Q=$.reports.validation?{...$,qaFailure:void 0}:$,Z=Q.status===y.Closed?y.Closed:EF(Q),X=IC({...Q,status:Z}),Y=Z===y.Closed?"Mission closed.":TF(X);return{...X,nextAction:Y}}function LJ($){if(!r9($.missionJsonPath))return;return OJ($.missionJsonPath)}function PF($){return OC(zJ($),$)}function OJ($){return zC(zJ($),$)}function zJ($){try{return JSON.parse(VJ($,"utf8"))}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);throw Error(`${$} contains invalid JSON: ${Z}`)}}function OZ($,Q){i9(fF($),{recursive:!0});let Z=`${$}.sumr-tmp-${Date.now()}`;hU(Z,`${JSON.stringify(Q,null,2)}
431
+ `,"utf8"),hU($,VJ(Z,"utf8"),"utf8"),qJ(Z,{force:!0})}function mU($){if(!r9($))return[];return zF($,{withFileTypes:!0}).filter((Q)=>Q.isDirectory()).map((Q)=>E0($,Q.name))}function fF($){return $.slice(0,$.length-jF($).length-1)}function W$($){return LF($.argv.slice(1))}function g($){return l$($,"json")}function h($){qF(1,`${JSON.stringify($,null,2)}
432
+ `)}function jJ($){return!g($)&&S2()}function W1($,Q,Z){if(!Z)return C$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let X=a(),Y=m9({issueKey:Z,prefixes:X.config.issuePrefixes,allowCustomKey:l$(Q,"allow-custom-key")});if(!Y.ok)return p(Y.message),{ok:!1,code:1};return{ok:!0,issueKey:Y.issueKey}}function o9($,Q){let Z=a(),X=a1(Z,$);if(X)return X;return BJ(Z,$,Q??$)}function IZ($){return`${$.issueKey.padEnd(12)} ${$.status.padEnd(12)} ${$.nextAction}`}function yF($,Q={}){let Z=[`Mission: ${$.issueKey}`,`Title: ${$.title}`,`Status: ${$.status}`,`Repo: ${$.repoLabel} (${$.repoId})`,`Next: ${$.nextAction}`];if(hF(Z,$,Q.currentBranch),gF(Z,$),$.plan)Z.push(`Plan: ${$.plan.latestPath}${$.plan.approved?" (approved)":" (pending approval)"}`);if($.claim)uF(Z,$.claim);if($.blocker)Z.push(`Blocker: ${$.blocker.reason}`);if(vF(Z,$),xF(Z,$),$.flow)Z.push(`Flow: ${$.flow.preset} (${$.flow.hash})`),Z.push(`Flow steps: ${p9($.flow)}`);return dF(Z,$),mF(Z,$),Z.join(`
433
+ `)}function xF($,Q){let Z=Q.issueContext;if(!Z)return;$.push("Issue context:"),$.push(` fetched: ${Z.fetchedAt}`),$.push(` comments: ${Z.comments.length}`),$.push(` attachments: ${Z.attachments.length}`);for(let X of Z.attachments)$.push(` - ${X.localPath} (${X.source})`)}function vF($,Q){let Z=Q.qaFailure;if(!Z)return;if($.push(`QA failure: ${Z.reason}`),Z.reproPointer)$.push(` re-repro: ${Z.reproPointer}`);$.push(` failed at: ${Z.failedAt}`)}function gF($,Q){if(!Q.boardStatus)return;if($.push(`Board status: ${Q.boardStatus}${Q.boardSyncedAt?` (synced ${Q.boardSyncedAt})`:""}`),RZ(Q.boardStatus,Q.status))$.push(`Board warning: board status "${Q.boardStatus}" diverges from local status "${Q.status}". The tracker may have reopened or moved this mission \u2014 re-sync before treating it as done.`)}function hF($,Q,Z){if(Z)$.push(`Current branch: ${Z}`);if(Q.branch)$.push(`Mission branch: ${Q.branch}`);if(Q.sourceSha)$.push(`Mission source SHA: ${Q.sourceSha}`);let X=Q.claim?.branch??Q.branch;if(X&&Z&&Z!==X)$.push(`Branch warning: current branch ${Z} does not match mission branch ${X}. Switch to the recorded branch or intentionally reclaim the mission before implementation or PR creation.`)}function uF($,Q){let Z=[`${Q.agent} at ${Q.startedAt}`];if(Q.branch)Z.push(`branch ${Q.branch}`);if(Q.sourceSha)Z.push(`sha ${Q.sourceSha}`);$.push(`Claim: ${Z.join(", ")}`)}function dF($,Q){if(!(Q.pr?.latestPath||Q.pr?.url))return;if($.push("PR:"),Q.pr.latestPath)$.push(` preview: ${Q.pr.latestPath}`);if(Q.pr.url)$.push(` url: ${Q.pr.url}`)}function mF($,Q){let Z=Object.entries(Q.reports);if(Z.length===0)return;$.push("Reports:");for(let[X,Y]of Z)$.push(` ${X}: ${Y}`)}function RZ($,Q){let Z=$.trim().toLowerCase();if((Q===y.Closed||Q===y.Validated)&&pF.includes(Z))return!0;if(Q!==y.Closed&&lF.includes(Z))return!0;return!1}function C$($,Q){p($,{title:"Usage",details:Q})}function p($,Q={}){r($,Q)}function lU($){if($.boardStatus&&RZ($.boardStatus,$.status))return 0.5;return cF[$.status]??99}function nF($){return[...$].sort((Q,Z)=>{let X=lU(Q)-lU(Z);if(X!==0)return X;return Z.updatedAt.localeCompare(Q.updatedAt)})[0]}function a9($,Q){return`${$M()}-${$.issuePathKey}.${Q}.md`}function rF($,Q){return`# Mission Plan: ${$}
426
434
 
427
435
  ## Objective
428
436
 
@@ -435,7 +443,7 @@ ${Q}
435
443
  ## Verification
436
444
 
437
445
  - TODO: list required checks.
438
- `}function Gj($,Q){return`# ${bJ($)} Report: ${Q.issueKey}
446
+ `}function iF($,Q){if($===i0.Validation)return oF(Q);if($===i0.QaFailure)return aF(Q);return`# ${TJ(sF($))} Report: ${Q.issueKey}
439
447
 
440
448
  ## Summary
441
449
 
@@ -449,17 +457,59 @@ TODO: summarize the ${$} result.
449
457
  ## Next Steps
450
458
 
451
459
  - ${Q.nextAction}
452
- `}function zj($){for(let Q of[".github/pull_request_template.md",".github/PULL_REQUEST_TEMPLATE.md","pull_request_template.md","PULL_REQUEST_TEMPLATE.md"]){let Z=dM($,Q);if(gM(Z))return hM(Z,"utf8")}return}function _j($){return OJ.includes($)}function bJ($){return`${$.charAt(0).toUpperCase()}${$.slice(1)}`}function Vj(){return new Date().toISOString().replace(/[:.]/g,"-")}function Hj($){let{positionals:Q,options:Z}=_$($),X=Q[0],U=e();if(!X||X===T2.SHOW)return Promise.resolve(Oj(U,Z));if(X===T2.LIST)return Promise.resolve(Kj(Z));if(X===T2.VALIDATE)return Promise.resolve(qj(U,Z));if(X===T2.EXPORT)return Promise.resolve(Bj(U,Z));if(X===T2.USE)return Promise.resolve(Lj(U,Z,Q[1]));return E$(`Unknown flow command: ${X}`,"sumr mission flow <list|show|use|validate|export>"),Promise.resolve(1)}function Oj($,Q){let Z=G8($.config.flow);if(Z.length>0){if(h(Q))u({ok:!1,errors:Z});else m$(Z,"Mission flow errors");return 1}let X=W8($.config);if(h(Q))u({ok:!0,preset:X.preset,hash:X.hash,steps:X.steps,errors:Z});else d$([`Preset: ${X.preset}`,`Hash: ${X.hash}`,`Flow: ${Y8(X)}`].join(`
453
- `),"Mission Flow");return 0}function Kj($){if(h($))u({ok:!0,presets:S2});else m$(S2,"Mission flow presets");return 0}function qj($,Q){let Z=G8($.config.flow);if(h(Q))u({ok:Z.length===0,errors:Z});else if(Z.length===0)v("Mission flow is valid.");else m$(Z,"Mission flow errors");return Z.length===0?0:1}function Bj($,Q){let Z=G8($.config.flow);if(Z.length>0){if(h(Q))u({ok:!1,errors:Z});else m$(Z,"Mission flow errors");return 1}let X=W8($.config);return u({ok:!0,preset:X.preset,hash:X.hash,text:Y8(X),steps:X.steps}),0}function Lj($,Q,Z){if(!Z||!IQ(Z))return E$("Missing or invalid flow preset.",`sumr mission flow use <preset>
454
- Allowed: ${S2.join(", ")}`),1;if(!$.sumrConfigPath)return l("No sumr.yaml found. Run Mission inside a SUMR repo to set a repo flow."),1;CJ($.sumrConfigPath,Z);let X=e(),U=W8(X.config);if(h(Q))u({ok:!0,preset:U.preset,hash:U.hash,steps:U.steps});else v(`Mission flow set: ${U.preset}`,{title:"Flow",fields:[{label:"Flow",value:Y8(U)}]});return 0}function Cj($){let Q=$.trim().toLowerCase();return oA(Q)?Q:void 0}function yJ($){if(!$)return"not configured";return kQ.find((Q)=>Q.value===$)?.label??$}function fJ($){if(!$)return;let Q=$.toLowerCase();if(Q.includes("github.com"))return t.Github;if(Q.includes("gitlab.com"))return t.Gitlab;if(Q.includes("bitbucket.org"))return t.Bitbucket;if(Q.includes("dev.azure.com")||Q.includes("visualstudio.com"))return t.AzureDevops;if(Q.includes("gitea"))return t.Gitea;if(Q.includes("codeberg.org"))return t.Codeberg;return}function vJ($){let Q=H8.find((Z)=>Z.value===$);if(!Q)throw Error(`Unsupported mission tracker: ${$}`);return Q}function xJ($){let Q=$.trim().toLowerCase();return aA(Q)?Q:void 0}function XJ($,Q,Z){let X=Sj.exec($);if(!X)return{ok:!1,message:Z};return{ok:!0,issueKey:`${Q}-${X[1]}`}}function UJ($,Q){let Z=$.toUpperCase();if(!Fj.test(Z))return{ok:!1,message:`Enter a ${Q} like PROJECT-123.`};return{ok:!0,issueKey:Z}}function Ij($){let Q=$.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80);if(Q.length<2)return{ok:!1,message:"Enter at least two letters or numbers."};return{ok:!0,issueKey:Q}}function Rj($,Q){if($===c.Github)return XJ(Q,"GH","Enter a GitHub issue number like 123 or #123.");if($===c.Gitlab)return XJ(Q,"GL","Enter a GitLab issue IID like 123 or #123.");if($===c.Jira)return UJ(Q,"Jira ticket key");if($===c.Linear)return UJ(Q,"Linear issue identifier");if($===c.AzureBoards){let Z=Q.match(/^(?:AB#?|work item\s+)?([0-9]+)$/i);if(Z?.[1])return{ok:!0,issueKey:`AB-${Z[1]}`}}return}function TQ($,Q){let Z=Q.trim();if(!Z)return{ok:!1,message:"Enter a mission ID."};return Rj($,Z)??Ij(Z)}async function Dj($){let{options:Q}=_$($),Z=e(),X=await gj(Q,Z);if(!X.ok)return X.code;if(Z.sumrConfigPath)Nj(Z.sumrConfigPath,X.config);let U=k0(Z);n0("mission",{cwd:Z.cwd});let J=xM(Z),W=wj(Z,J),Y={context:Z,config:X.config,root:U,excludePath:J,excludeUpdated:W,playbookSyncRecommended:Z.storageScope===N0.Repo};if(h(Q))kj(Y);else Pj(Y);return 0}function Nj($,Q){if(Q.tracker)OM($,Q.tracker);if(Q.gitProvider)KM($,Q.gitProvider);if(Q.flowPreset)CJ($,Q.flowPreset);if(Q.prefixes.length>0)HM($,Q.prefixes)}function wj($,Q){if(!(Q&&$.storageScope===N0.Repo))return!1;Mj(Ej(Q),{recursive:!0});let Z=[".sumr-cache/mission/",".sumr-cache/activations.json"],X=Aj(Q)?jj(Q,"utf8"):"",U=X.split(/\r?\n/),J=Z.filter((W)=>!U.includes(W));if(J.length===0)return!1;return Tj(Q,`${X.trimEnd()}
455
- ${J.join(`
460
+ `}function oF($){return`# Validation Report: ${$.issueKey}
461
+
462
+ ## Summary
463
+
464
+ TODO: summarize the validation result.
465
+
466
+ ## Reproduction
467
+
468
+ TODO: describe how you reproduced the original issue before the fix, and confirm the fix resolves it.
469
+
470
+ ## Evidence
471
+
472
+ - TODO: list the commands run and their results (for example \`bun test\`).
473
+ - TODO: add the test name(s) or UI/screenshot evidence that prove the fix.
474
+
475
+ ## Mission
476
+
477
+ - Mission: ${$.missionId}
478
+ - Status before report: ${$.status}
479
+ `}function aF($){return`# QA Failure Report: ${$.issueKey}
480
+
481
+ ## Rejection Reason
482
+
483
+ TODO: record exactly why QA rejected this work.
484
+
485
+ ## Re-repro Pointer
486
+
487
+ TODO: link the failing scenario, steps, or screenshot QA used so the corrective cycle can reproduce it.
488
+
489
+ ## Mission
490
+
491
+ - Mission: ${$.missionId}
492
+ - Status before report: ${$.status}
493
+ `}function sF($){return $===i0.QaFailure?"QA failure":$}function tF($){for(let Q of[".github/pull_request_template.md",".github/PULL_REQUEST_TEMPLATE.md","pull_request_template.md","PULL_REQUEST_TEMPLATE.md"]){let Z=KF($,Q);if(HF(Z))return VF(Z,"utf8")}return}function eF($){return eU.includes($)}function TJ($){return`${$.charAt(0).toUpperCase()}${$.slice(1)}`}function $M(){return new Date().toISOString().replace(/[:.]/g,"-")}function QM($){let{positionals:Q,options:Z}=W$($),X=Q[0],Y=a();if(!X||X===c2.SHOW)return Promise.resolve(ZM(Y,Z));if(X===c2.LIST)return Promise.resolve(XM(Z));if(X===c2.VALIDATE)return Promise.resolve(YM(Y,Z));if(X===c2.EXPORT)return Promise.resolve(WM(Y,Z));if(X===c2.USE)return Promise.resolve(UM(Y,Z,Q[1]));return C$(`Unknown flow command: ${X}`,"sumr mission flow <list|show|use|validate|export>"),Promise.resolve(1)}function ZM($,Q){let Z=c9($.config.flow);if(Z.length>0){if(g(Q))h({ok:!1,errors:Z});else i$(Z,"Mission flow errors");return 1}let X=l9($.config);if(g(Q))h({ok:!0,preset:X.preset,hash:X.hash,steps:X.steps,errors:Z});else q$([`Preset: ${X.preset}`,`Hash: ${X.hash}`,`Flow: ${p9(X)}`].join(`
494
+ `),"Mission Flow");return 0}function XM($){if(g($))h({ok:!0,presets:i2});else i$(i2,"Mission flow presets");return 0}function YM($,Q){let Z=c9($.config.flow);if(g(Q))h({ok:Z.length===0,errors:Z});else if(Z.length===0)P("Mission flow is valid.");else i$(Z,"Mission flow errors");return Z.length===0?0:1}function WM($,Q){let Z=c9($.config.flow);if(Z.length>0){if(g(Q))h({ok:!1,errors:Z});else i$(Z,"Mission flow errors");return 1}let X=l9($.config);return h({ok:!0,preset:X.preset,hash:X.hash,text:p9(X),steps:X.steps}),0}function UM($,Q,Z){if(!Z||!MZ(Z))return C$("Missing or invalid flow preset.",`sumr mission flow use <preset>
495
+ Allowed: ${i2.join(", ")}`),1;if(!$.sumrConfigPath)return p("No sumr.yaml found. Run Mission inside a SUMR repo to set a repo flow."),1;_J($.sumrConfigPath,Z);let X=a(),Y=l9(X.config);if(g(Q))h({ok:!0,preset:Y.preset,hash:Y.hash,steps:Y.steps});else P(`Mission flow set: ${Y.preset}`,{title:"Flow",fields:[{label:"Flow",value:p9(Y)}]});return 0}function qM($){let Q=$.trim().toLowerCase();return EC(Q)?Q:void 0}function EJ($){if(!$)return"not configured";return DZ.find((Q)=>Q.value===$)?.label??$}function CJ($){if(!$)return;let Q=$.toLowerCase();if(Q.includes("github.com"))return s.Github;if(Q.includes("gitlab.com"))return s.Gitlab;if(Q.includes("bitbucket.org"))return s.Bitbucket;if(Q.includes("dev.azure.com")||Q.includes("visualstudio.com"))return s.AzureDevops;if(Q.includes("gitea"))return s.Gitea;if(Q.includes("codeberg.org"))return s.Codeberg;return}function FJ($){let Q=s9.find((Z)=>Z.value===$);if(!Q)throw Error(`Unsupported mission tracker: ${$}`);return Q}function MJ($){let Q=$.trim().toLowerCase();return CC(Q)?Q:void 0}function pU($,Q,Z){let X=KM.exec($);if(!X)return{ok:!1,message:Z};return{ok:!0,issueKey:`${Q}-${X[1]}`}}function cU($,Q){let Z=$.toUpperCase();if(!BM.test(Z))return{ok:!1,message:`Enter a ${Q} like PROJECT-123.`};return{ok:!0,issueKey:Z}}function AM($){let Q=$.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80);if(Q.length<2)return{ok:!1,message:"Enter at least two letters or numbers."};return{ok:!0,issueKey:Q}}function LM($,Q){if($===l.Github)return pU(Q,"GH","Enter a GitHub issue number like 123 or #123.");if($===l.Gitlab)return pU(Q,"GL","Enter a GitLab issue IID like 123 or #123.");if($===l.Jira)return cU(Q,"Jira ticket key");if($===l.Linear)return cU(Q,"Linear issue identifier");if($===l.AzureBoards){let Z=Q.match(/^(?:AB#?|work item\s+)?([0-9]+)$/i);if(Z?.[1])return{ok:!0,issueKey:`AB-${Z[1]}`}}return}function zZ($,Q){let Z=Q.trim();if(!Z)return{ok:!1,message:"Enter a mission ID."};return LM($,Z)??AM(Z)}async function OM($){let{options:Q}=W$($),Z=a(),X=await RM(Q,Z);if(!X.ok)return X.code;if(Z.sumrConfigPath)zM(Z.sumrConfigPath,X.config);let Y=s0(Z);C2("mission",{cwd:Z.cwd});let W=_F(Z),U=jM(Z,W),J={context:Z,config:X.config,root:Y,excludePath:W,excludeUpdated:U,playbookSyncRecommended:Z.storageScope===o0.Repo};if(g(Q))TM(J);else EM(J);return 0}function zM($,Q){if(Q.tracker)hC($,Q.tracker);if(Q.gitProvider)uC($,Q.gitProvider);if(Q.flowPreset)_J($,Q.flowPreset);if(Q.prefixes.length>0)gC($,Q.prefixes)}function jM($,Q){if(!(Q&&$.storageScope===o0.Repo))return!1;GM(VM(Q),{recursive:!0});let Z=[".sumr-cache/mission/",".sumr-cache/activations.json"],X=JM(Q)?_M(Q,"utf8"):"",Y=X.split(/\r?\n/),W=Z.filter((U)=>!Y.includes(U));if(W.length===0)return!1;return HM(Q,`${X.trimEnd()}
496
+ ${W.join(`
456
497
  `)}
457
- `,"utf8"),!0}function kj($){let{context:Q,config:Z}=$;u({ok:!0,root:$.root,baseDir:Q.baseDir,excludePath:$.excludePath,excludeUpdated:$.excludeUpdated,tracker:Z.tracker??Q.config.tracker?.provider,gitProvider:Z.gitProvider??Q.config.git?.provider,flowPreset:Z.flowPreset??Q.config.flow?.preset??D$.Basic,issuePrefixes:Z.prefixes.length>0?Z.prefixes:Q.config.issuePrefixes,playbookSyncRecommended:$.playbookSyncRecommended})}function Pj($){let{context:Q,config:Z}=$;v("Mission initialized",{title:"Storage",fields:[{label:"Root",value:Q.baseDir},{label:"Repo",value:`${Q.repoLabel} (${Q.repoId})`},{label:"Work item source",value:mj(Z.tracker??Q.config.tracker?.provider)},{label:"Git provider",value:yJ(Z.gitProvider??Q.config.git?.provider)},{label:"Flow",value:Z.flowPreset??Q.config.flow?.preset??D$.Basic},{label:"Ticket prefixes",value:lj(Z.prefixes.length>0?Z.prefixes:Q.config.issuePrefixes)},{label:"Git exclude",value:$.excludeUpdated?$.excludePath:void 0},{label:"AI resources",value:$.playbookSyncRecommended?"Run `sumr playbook sync` to install Mission guidance into AI tools":void 0}]})}function bj($){let Q=U$($,"tracker")??U$($,"provider"),Z=Q?xJ(Q):void 0;if(Q&&!Z)return E$(`Unsupported tracker: ${Q}`,`Allowed trackers: ${H8.map((X)=>X.value).join(", ")}`),k1;return Z}function yj($){let Q=U$($,"git-provider"),Z=Q?Cj(Q):void 0;if(Q&&!Z)return E$(`Unsupported git provider: ${Q}`,`Allowed git providers: ${kQ.map((X)=>X.value).join(", ")}`),k1;return Z}function fj($){let Q=U$($,"flow"),Z=S2.find((X)=>X===Q);if(Q&&!Z)return E$(`Unsupported flow preset: ${Q}`,`Allowed flow presets: ${S2.join(", ")}`),k1;return Z}function vj($){let Q=cM($,"prefix");if(Q.length>0){let Z=qJ(Q);if(Z.length>0)return l(`Invalid issue prefix${Z.length===1?"":"es"}: ${Z.join(", ")}. Prefixes must start with a letter and contain only letters or numbers.`),k1}return Q}function xj($){let Q=bj($);if(Q===k1)return{error:!0};let Z=yj($);if(Z===k1)return{error:!0};let X=fj($);if(X===k1)return{error:!0};let U=vj($);if(U===k1)return{error:!0};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:U}}async function gj($,Q){let Z=xj($);if("error"in Z)return{ok:!1,code:1};if(Z.tracker||Z.gitProvider||Z.flowPreset||Z.prefixes.length>0)return{ok:!0,config:{tracker:Z.tracker,gitProvider:Z.gitProvider,flowPreset:Z.flowPreset,prefixes:U8(Z.prefixes)}};if(!Q.sumrConfigPath||Q.config.tracker?.provider||v$($,"yes")||!PJ($))return{ok:!0,config:{prefixes:[]}};return{ok:!0,config:await hj(Q)}}async function hj($){let Q=await Q1({message:"Where do this repo's work item IDs usually come from?",options:[...H8.map((J)=>({value:J.value,label:J.label,hint:J.hint})),{value:JJ.Skip,label:"Skip for now",hint:"Ask per mission"}],initialValue:c.Github});if(!Q||Q===JJ.Skip)return{prefixes:[]};let Z=await uj($),X=await dj();if(Q!==c.Jira&&Q!==c.Linear)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};let U=await K0({message:`${Q===c.Jira?"Jira project":"Linear team"} prefixes`,placeholder:"SUM, ENG, OPS",validate:(J)=>{let W=WJ(J??"");if(W.length===0)return"Enter at least one prefix, like SUM.";let Y=qJ(W);if(Y.length>0)return`Invalid prefix${Y.length===1?"":"es"}: ${Y.join(", ")}`;return}});if(!U)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:U8(WJ(U))}}async function uj($){let Q=fJ(SQ($.cwd));return await Q1({message:"Which git or PR provider should Mission recognize?",options:kQ.map((Z)=>({value:Z.value,label:Z.label,hint:Z.hint})),initialValue:Q??t.GenericGit})}async function dj(){return await Q1({message:"Which Mission flow should this repo use?",options:[{value:D$.StandardDelivery,label:"Standard delivery",hint:"Plan, approval, delivery, validation, PR preview"},{value:D$.PlanningOnly,label:"Planning only",hint:"Stop after a reviewable plan"},{value:D$.Basic,label:"Basic",hint:"Current lightweight Mission lifecycle"},{value:D$.FullDelivery,label:"Full delivery",hint:"Richer flow with research, quality gate, and PR assist"}],initialValue:D$.StandardDelivery})}function mj($){if(!$)return"not configured";return vJ($).label}function lj($){if($.length===0)return;return $.join(", ")}function WJ($){return $.split(/[,\s]+/).map((Q)=>Q.trim()).filter(Boolean)}function cj($){let{positionals:Q,options:Z}=_$($),X=e();if(k0(X),Q[0]){let J=aM(X,Q[0]);if(!J)return l(`Mission not found: ${Q[0]}`),Promise.resolve(1);if(h(Z))u({ok:!0,mission:J});else d$(Qj(J,{currentBranch:CQ(X.cwd)}),"Status");return Promise.resolve(0)}let U=R2(X,{allRepos:!1});if(h(Z))u({ok:!0,storage:X.baseDir,missions:U});else if($1("Mission workspace",{title:"Storage",fields:[{label:"Root",value:X.baseDir},{label:"Repo",value:`${X.repoLabel} (${X.repoId})`}]}),U.length===0)$1("No missions found.");else m$(U.map(NQ),"Missions");return Promise.resolve(0)}function nj($){let{options:Q}=_$($),Z=e();k0(Z);let X=v$(Q,"all"),U=R2(Z,{allRepos:X});if(h(Q))u({ok:!0,missions:U});else if(U.length===0)$1("No missions found.");else m$(U.map(NQ),X?"All missions":"Missions");return Promise.resolve(0)}function ij($){let{options:Q}=_$($),Z=e();k0(Z);let X=R2(Z,{allRepos:v$(Q,"all")}).filter((J)=>J.status!==m.Closed),U=Wj(X);if(h(Q))u({ok:!0,mission:U});else if(!U)$1("No open missions.");else d$(NQ(U),"Next mission");return Promise.resolve(0)}function rj($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=e(),J=DQ(X.issueKey),W=P1(U,X.issueKey),Y=F2(W.missionDir,"plans");hJ(Y,{recursive:!0});let G=U$(Z,"from"),z=F2(Y,wQ(J,"plan")),_=G?pj(G,"utf8"):Yj(J.issueKey,J.title);uJ(z,_,"utf8");let V=v$(Z,"approve"),H=s$(U,{...J,plan:{latestPath:z,approved:V,approvedAt:V?new Date().toISOString():void 0}});if(h(Z))u({ok:!0,mission:H,planPath:z});else v("Plan written",{title:"Plan",fields:[{label:"Path",value:z},{label:"Next",value:H.nextAction}]});return Promise.resolve(0)}function oj($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=e(),J=X0(U,X.issueKey);if(!J)return l(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!J.plan)return l("Create a plan before approving this mission."),Promise.resolve(1);if(J.plan.approved){if(h(Z))u({ok:!0,mission:J,alreadyApproved:!0});else v(`Plan already approved: ${J.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:J.plan.latestPath},{label:"Next",value:J.nextAction}]});return Promise.resolve(0)}let W=s$(U,{...J,plan:{...J.plan,approved:!0,approvedAt:new Date().toISOString()}});if(h(Z))u({ok:!0,mission:W,alreadyApproved:!1});else v(`Plan approved: ${W.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:W.plan?.latestPath??J.plan.latestPath},{label:"Next",value:W.nextAction}]});return Promise.resolve(0)}function aj($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=e(),J=X0(U,X.issueKey);if(!J)return l(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!J.plan?.approved)return l("Approve a plan before claiming this mission."),Promise.resolve(1);let W=CQ(U.cwd),Y=SA(U.cwd),G=U$(Z,"agent")??process.env.USER??"unknown",z=s$(U,{...J,branch:W,sourceSha:Y,claim:{agent:G,startedAt:new Date().toISOString(),branch:W,sourceSha:Y}});if(h(Z))u({ok:!0,mission:z});else v(`Mission claimed: ${z.issueKey}`,{title:"Claim",fields:[{label:"Agent",value:G},{label:"Next",value:z.nextAction}]});return Promise.resolve(0)}function sj($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=U$(Z,"type");if(!_j(U))return E$("Missing or invalid report type.",`sumr mission report <issueKey> --type <type>
458
- Allowed: ${OJ.join(", ")}`),Promise.resolve(1);let J=e(),W=DQ(X.issueKey),Y=P1(J,X.issueKey),G=ZT(U),z=F2(Y.missionDir,G);hJ(z,{recursive:!0});let _=F2(z,wQ(W,U));uJ(_,Gj(U,W),"utf8");let V=s$(J,{...W,reports:{...W.reports,[U]:_}});if(h(Z))u({ok:!0,mission:V,reportPath:_});else v(`${bJ(U)} report written`,{title:"Report",fields:[{label:"Path",value:_},{label:"Next",value:V.nextAction}]});return Promise.resolve(0)}function tj($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=U$(Z,"reason");if(!U)return E$("Missing blocker reason.","sumr mission block <issueKey> --reason <text>"),Promise.resolve(1);let J=e(),W=DQ(X.issueKey),Y=s$(J,{...W,blocker:{reason:U,blockedAt:new Date().toISOString()}});if(h(Z))u({ok:!0,mission:Y});else O0(`Mission blocked: ${Y.issueKey}`,{title:"Blocker",fields:[{label:"Reason",value:U},{label:"Next",value:Y.nextAction}]});return Promise.resolve(0)}function ej($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=e(),J=X0(U,X.issueKey);if(!J)return l(`Mission not found: ${X.issueKey}`),Promise.resolve(1);let W=s$(U,{...J,blocker:void 0});if(h(Z))u({ok:!0,mission:W});else v(`Mission unblocked: ${W.issueKey}`,{title:"Mission",fields:[{label:"Next",value:W.nextAction}]});return Promise.resolve(0)}function $T($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=e(),J=X0(U,X.issueKey);if(!J)return l(`Mission not found: ${X.issueKey}`),Promise.resolve(1);try{let W=sM(U,J,{force:v$(Z,"force")});if(h(Z))u({ok:!0,mission:W});else v(`Mission closed: ${W.issueKey}`);return Promise.resolve(0)}catch(W){return l(W instanceof Error?W.message:String(W)),Promise.resolve(1)}}function QT($){let{options:Q}=_$($),Z=Number(U$(Q,"older-than")??30),X=v$(Q,"dry-run"),U=e();k0(U);let J=tM(U,{olderThanDays:Number.isFinite(Z)?Z:30,dryRun:X});if(h(Q))u({ok:!0,dryRun:X,...J});else{let W=X?J.eligible.length:J.removed.length,Y=X?J.eligible:J.removed;if(v(`${X?"Eligible":"Removed"} closed mission cache directories: ${W}`),Y.length>0)m$(Y,X?"Eligible":"Removed")}return Promise.resolve(0)}function ZT($){return $===jA.Handoff?"handoffs":F2("reports",$)}async function YT($){let{positionals:Q,options:Z}=_$($),X=b1($,Z,Q[0]);if(!X.ok)return X.code;let U=e();if(U.config.git?.prMode===TA.Disabled)return l("PR assist is disabled for this repo by mission.git.prMode."),1;let J=X0(U,X.issueKey);if(!J)return l(`Mission not found: ${X.issueKey}`),1;let W=GT(Z),Y=zT(U,Z),G=P1(U,X.issueKey),z=YJ(G.missionDir,"prs");XT(z,{recursive:!0});let _=YJ(z,wQ(J,"pr")),V=OT(U,J,Y);JT(_,V,"utf8");let H=s$(U,{...J,pr:{...J.pr,latestPath:_,mode:_T(W),updatedAt:new Date().toISOString()}});if(W===y$.Preview)return VT(Z,H,_,V,Y),0;let O=await KT(U,H,_,Y,W);if(!O.ok)return O.code;return H=s$(U,{...H,pr:{...H.pr,url:O.url,updatedAt:new Date().toISOString()}}),HT(Z,H,_,O.url),0}function GT($){if(v$($,y$.Create))return y$.Create;if(v$($,y$.CreateDraft))return y$.CreateDraft;return y$.Preview}function zT($,Q){let Z=U$(Q,"base")??U$(Q,"base-branch");if(Z)return Z;if($.config.git?.baseBranch)return $.config.git.baseBranch;let X=FA($.cwd);if(!X)throw Error("Could not resolve a PR base branch. Pass --base <branch> or configure mission.git.baseBranch.");return X}function _T($){if($===y$.CreateDraft)return BQ.Draft;if($===y$.Create)return BQ.Ready;return BQ.Preview}function VT($,Q,Z,X,U){if(h($)){u({ok:!0,mission:Q,prPath:Z,body:X});return}v("PR preview written",{title:"Pull Request",fields:[{label:"Path",value:Z},{label:"Base branch",value:U},{label:"Next",value:Q.nextAction}]})}function HT($,Q,Z,X){if(h($)){u({ok:!0,mission:Q,prPath:Z,url:X});return}v("Pull request created",{title:"Pull Request",fields:[{label:"URL",value:X},{label:"Preview",value:Z}]})}function OT($,Q,Z){let X=zj($.cwd),U=Q.issueKey.match(/^(?:GH|GL)-(\d+)$/)?.[1],J=U?`Refs #${U}`:`Refs ${Q.issueKey}`;return`## Summary
498
+ `,"utf8"),!0}function TM($){let{context:Q,config:Z}=$;h({ok:!0,root:$.root,baseDir:Q.baseDir,excludePath:$.excludePath,excludeUpdated:$.excludeUpdated,tracker:Z.tracker??Q.config.tracker?.provider,gitProvider:Z.gitProvider??Q.config.git?.provider,flowPreset:Z.flowPreset??Q.config.flow?.preset??f$.Basic,issuePrefixes:Z.prefixes.length>0?Z.prefixes:Q.config.issuePrefixes,playbookSyncRecommended:$.playbookSyncRecommended})}function EM($){let{context:Q,config:Z}=$;P("Mission initialized",{title:"Storage",fields:[{label:"Root",value:Q.baseDir},{label:"Repo",value:`${Q.repoLabel} (${Q.repoId})`},{label:"Work item source",value:bM(Z.tracker??Q.config.tracker?.provider)},{label:"Git provider",value:EJ(Z.gitProvider??Q.config.git?.provider)},{label:"Flow",value:Z.flowPreset??Q.config.flow?.preset??f$.Basic},{label:"Ticket prefixes",value:kM(Z.prefixes.length>0?Z.prefixes:Q.config.issuePrefixes)},{label:"Git exclude",value:$.excludeUpdated?$.excludePath:void 0},{label:"AI resources",value:$.playbookSyncRecommended?"Run `sumr playbook sync` to install Mission guidance into AI tools":void 0}]})}function CM($){let Q=t($,"tracker")??t($,"provider"),Z=Q?MJ(Q):void 0;if(Q&&!Z)return C$(`Unsupported tracker: ${Q}`,`Allowed trackers: ${s9.map((X)=>X.value).join(", ")}`),o1;return Z}function FM($){let Q=t($,"git-provider"),Z=Q?qM(Q):void 0;if(Q&&!Z)return C$(`Unsupported git provider: ${Q}`,`Allowed git providers: ${DZ.map((X)=>X.value).join(", ")}`),o1;return Z}function MM($){let Q=t($,"flow"),Z=i2.find((X)=>X===Q);if(Q&&!Z)return C$(`Unsupported flow preset: ${Q}`,`Allowed flow presets: ${i2.join(", ")}`),o1;return Z}function SM($){let Q=OF($,"prefix");if(Q.length>0){let Z=QJ(Q);if(Z.length>0)return p(`Invalid issue prefix${Z.length===1?"":"es"}: ${Z.join(", ")}. Prefixes must start with a letter and contain only letters or numbers.`),o1}return Q}function IM($){let Q=CM($);if(Q===o1)return{error:!0};let Z=FM($);if(Z===o1)return{error:!0};let X=MM($);if(X===o1)return{error:!0};let Y=SM($);if(Y===o1)return{error:!0};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:Y}}async function RM($,Q){let Z=IM($);if("error"in Z)return{ok:!1,code:1};if(Z.tracker||Z.gitProvider||Z.flowPreset||Z.prefixes.length>0)return{ok:!0,config:{tracker:Z.tracker,gitProvider:Z.gitProvider,flowPreset:Z.flowPreset,prefixes:d9(Z.prefixes)}};if(!Q.sumrConfigPath||Q.config.tracker?.provider||l$($,"yes")||!jJ($))return{ok:!0,config:{prefixes:[]}};return{ok:!0,config:await DM(Q)}}async function DM($){let Q=await q1({message:"Where do this repo's work item IDs usually come from?",options:[...s9.map((W)=>({value:W.value,label:W.label,hint:W.hint})),{value:nU.Skip,label:"Skip for now",hint:"Ask per mission"}],initialValue:l.Github});if(!Q||Q===nU.Skip)return{prefixes:[]};let Z=await NM($),X=await wM();if(Q!==l.Jira&&Q!==l.Linear)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};let Y=await P0({message:`${Q===l.Jira?"Jira project":"Linear team"} prefixes`,placeholder:"SUM, ENG, OPS",validate:(W)=>{let U=rU(W??"");if(U.length===0)return"Enter at least one prefix, like SUM.";let J=QJ(U);if(J.length>0)return`Invalid prefix${J.length===1?"":"es"}: ${J.join(", ")}`;return}});if(!Y)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:d9(rU(Y))}}async function NM($){let Q=CJ(u9($.cwd));return await q1({message:"Which git or PR provider should Mission recognize?",options:DZ.map((Z)=>({value:Z.value,label:Z.label,hint:Z.hint})),initialValue:Q??s.GenericGit})}async function wM(){return await q1({message:"Which Mission flow should this repo use?",options:[{value:f$.StandardDelivery,label:"Standard delivery",hint:"Plan, approval, delivery, validation, PR preview"},{value:f$.PlanningOnly,label:"Planning only",hint:"Stop after a reviewable plan"},{value:f$.Basic,label:"Basic",hint:"Current lightweight Mission lifecycle"},{value:f$.FullDelivery,label:"Full delivery",hint:"Richer flow with research, quality gate, and PR assist"}],initialValue:f$.StandardDelivery})}function bM($){if(!$)return"not configured";return FJ($).label}function kM($){if($.length===0)return;return $.join(", ")}function rU($){return $.split(/[,\s]+/).map((Q)=>Q.trim()).filter(Boolean)}function bZ($){return gM.exec($)?.[1]}function IJ($,Q){if(Q.issueContext?.provider===l.Github)return!0;if($.config.tracker?.provider===l.Github)return!0;if($.config.git?.provider===s.Github)return!0;if(bZ(Q.issueKey)){if(u9($.cwd)?.toLowerCase().includes("github.com"))return!0}return!1}function dM($,Q){if(!IJ($,Q))return{ok:!1,reason:`Issue sync only supports GitHub-hosted missions. ${Q.issueKey} is not a recognized GitHub issue.`};let Z=bZ(Q.issueKey);if(!Z)return{ok:!1,reason:`Could not derive a GitHub issue number from ${Q.issueKey}. Expected a GH-<number> key.`};if(!kZ("gh"))return{ok:!1,reason:"GitHub CLI (gh) is not available. Install gh and authenticate to sync issue context."};let X=s2("gh",["issue","view",Z,"--json","title,body,comments"],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(X.status!==0)return{ok:!1,reason:`gh issue view ${Z} failed: ${(X.stderr||X.stdout||"").trim()||"unknown error"}`};let Y;try{Y=JSON.parse(X.stdout)}catch(_){return{ok:!1,reason:`Could not parse gh issue view output: ${_ instanceof Error?_.message:String(_)}`}}let W=Y.body??"",U=(Y.comments??[]).map((_)=>({author:_.author?.login,body:_.body??"",createdAt:_.createdAt})),J=cM(W,U),G=iM($,Q,J);return{ok:!0,context:{provider:l.Github,reference:Q.issueKey,title:Y.title,body:W,comments:U,attachments:G,fetchedAt:new Date().toISOString()}}}function mM($,Q){if(!IJ($,Q))return{ok:!1,reason:"Board status lookup only supports GitHub-hosted missions."};let Z=bZ(Q.issueKey);if(!Z)return{ok:!1,reason:`Could not derive a GitHub issue number from ${Q.issueKey}.`};if(!kZ("gh"))return{ok:!1,reason:"GitHub CLI (gh) is not available."};let X=s2("gh",["issue","view",Z,"--json","projectItems"],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(X.status!==0)return{ok:!1,reason:`gh issue view ${Z} failed: ${(X.stderr||X.stdout||"").trim()||"unknown error"}`};let Y=lM(X.stdout);if(!Y)return{ok:!1,reason:"No GitHub Project status found for this issue."};return{ok:!0,status:Y}}function lM($){let Q;try{Q=JSON.parse($)}catch{return}if(!h9(Q))return;let Z=Q.projectItems,X=Array.isArray(Z)?Z:h9(Z)?Z.nodes:void 0;if(!Array.isArray(X))return;for(let Y of X){let W=pM(Y);if(W)return W}return}function pM($){if(!h9($))return;let Q=$.status;if(typeof Q==="string")return Q;if(h9(Q)&&typeof Q.name==="string")return Q.name;return}function cM($,Q){let Z=[],X=new Set,Y=(W,U)=>{for(let J of nM(W)){if(X.has(J))continue;X.add(J),Z.push({url:J,source:U})}};Y($,"body");for(let W of Q)Y(W.body,"comment");return Z}function nM($){if(!$)return[];let Q=new Set,Z=/!\[[^\]]*\]\(\s*<?([^\s)>]+)>?\s*(?:"[^"]*")?\)/g;for(let W of $.matchAll(Z))if(W[1])Q.add(KZ(W[1]));let X=/<img[^>]*\ssrc\s*=\s*["']([^"']+)["'][^>]*>/gi;for(let W of $.matchAll(X))if(W[1])Q.add(KZ(W[1]));let Y=/https?:\/\/(?:github\.com\/user-attachments\/assets\/[^\s)>"'\]]+|[^\s)>"'\]]*githubusercontent\.com\/[^\s)>"'\]]+)/gi;for(let W of $.matchAll(Y))Q.add(KZ(W[0]));return[...Q].filter((W)=>rM(W))}function rM($){if(/user-attachments\/assets\//i.test($))return!0;if(/githubusercontent\.com\//i.test($))return!0;return/\.(png|jpe?g|gif|webp|bmp|svg)(?:[?#].*)?$/i.test($)}function KZ($){return $.replace(/[).,]+$/,"")}function iM($,Q,Z){if(Z.length===0)return[];let X=$S($.cwd),Y=jZ(Y1($,Q.issueKey).missionDir,hM);yM(Y,{recursive:!0});let W=[];return Z.forEach((U,J)=>{let G=oM(Y,U.url,J,X);if(G)W.push({url:U.url,localPath:G,source:U.source})}),W}function oM($,Q,Z,X){let Y=jZ($,`attachment-${Z}.download`);qZ(Y,{force:!0});let W=["-sSL","--fail","--max-time","60"];if(X)W.push("-H","@-");if(W.push(Q,"-o",Y),s2("curl",W,{cwd:$,stdio:"pipe",encoding:"utf8",input:X?`Authorization: Bearer ${X}`:void 0}).status!==0||!fM(Y)){qZ(Y,{force:!0});return}let J=aM(Y);if(!J){qZ(Y,{force:!0});return}let G=jZ($,`attachment-${Z}.${J}`);return vM(Y,G),G}function aM($){let Q;try{Q=xM($)}catch{return}if(Q.length===0)return;for(let Z of uM)if(sM(Q,Z.bytes)){if(Z.ext==="webp"&&!tM(Q))continue;return Z.ext}if(eM(Q))return"svg";return}function sM($,Q){if($.length<Q.length)return!1;return Q.every((Z,X)=>$[X]===Z)}function tM($){return $.length>=12&&$.toString("ascii",8,12)==="WEBP"}function eM($){let Q=$.toString("utf8",0,Math.min($.length,256)).trimStart();return Q.startsWith("<?xml")||Q.startsWith("<svg")}function $S($){if(!kZ("gh"))return;let Q=s2("gh",["auth","token"],{cwd:$,stdio:"pipe",encoding:"utf8"});if(Q.status!==0)return;return Q.stdout.trim()||void 0}function kZ($){return s2($,["--version"],{stdio:"ignore"}).status===0}function h9($){return typeof $==="object"&&$!==null}function QS($){let{positionals:Q,options:Z}=W$($),X=a();if(s0(X),Q[0]){let W=wF(X,Q[0]);if(!W)return p(`Mission not found: ${Q[0]}`),Promise.resolve(1);if(g(Z))h({ok:!0,mission:W});else q$(yF(W,{currentBranch:CZ(X.cwd)}),"Status");return Promise.resolve(0)}let Y=a2(X,{allRepos:!1});if(g(Z))h({ok:!0,storage:X.baseDir,missions:Y});else if(V1("Mission workspace",{title:"Storage",fields:[{label:"Root",value:X.baseDir},{label:"Repo",value:`${X.repoLabel} (${X.repoId})`}]}),Y.length===0)V1("No missions found.");else i$(Y.map(IZ),"Missions");return Promise.resolve(0)}function ZS($){let{options:Q}=W$($),Z=a();s0(Z);let X=l$(Q,"all"),Y=a2(Z,{allRepos:X});if(g(Q))h({ok:!0,missions:Y});else if(Y.length===0)V1("No missions found.");else i$(Y.map(IZ),X?"All missions":"Missions");return Promise.resolve(0)}function XS($){let{options:Q}=W$($),Z=a();s0(Z);let X=a2(Z,{allRepos:l$(Q,"all")}).filter((W)=>W.status!==y.Closed||W.boardStatus!==void 0&&RZ(W.boardStatus,W.status)),Y=nF(X);if(g(Q))h({ok:!0,mission:Y});else if(!Y)V1("No open missions.");else q$(IZ(Y),"Next mission");return Promise.resolve(0)}function YS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=o9(X.issueKey),U=Y1(Y,X.issueKey),J=C0(U.missionDir,"plans");NZ(J,{recursive:!0});let G=t(Z,"from"),_=C0(J,a9(W,"plan")),H=G?PM(G,"utf8"):rF(W.issueKey,W.title);wZ(_,H,"utf8");let V=l$(Z,"approve"),q=I$(Y,{...W,plan:{latestPath:_,approved:V,approvedAt:V?new Date().toISOString():void 0}});if(g(Z))h({ok:!0,mission:q,planPath:_});else P("Plan written",{title:"Plan",fields:[{label:"Path",value:_},{label:"Next",value:q.nextAction}]});return Promise.resolve(0)}function WS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=a1(Y,X.issueKey);if(!W)return p(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!W.plan)return p("Create a plan before approving this mission."),Promise.resolve(1);if(W.plan.approved){if(g(Z))h({ok:!0,mission:W,alreadyApproved:!0});else P(`Plan already approved: ${W.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:W.plan.latestPath},{label:"Next",value:W.nextAction}]});return Promise.resolve(0)}let U=I$(Y,{...W,plan:{...W.plan,approved:!0,approvedAt:new Date().toISOString()}});if(g(Z))h({ok:!0,mission:U,alreadyApproved:!1});else P(`Plan approved: ${U.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:U.plan?.latestPath??W.plan.latestPath},{label:"Next",value:U.nextAction}]});return Promise.resolve(0)}function US($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=a1(Y,X.issueKey);if(!W)return p(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!W.plan?.approved)return p("Approve a plan before claiming this mission."),Promise.resolve(1);let U=CZ(Y.cwd),J=iE(Y.cwd),G=t(Z,"agent")??process.env.USER??"unknown",_=I$(Y,{...W,branch:U,sourceSha:J,claim:{agent:G,startedAt:new Date().toISOString(),branch:U,sourceSha:J}});if(g(Z))h({ok:!0,mission:_});else P(`Mission claimed: ${_.issueKey}`,{title:"Claim",fields:[{label:"Agent",value:G},{label:"Next",value:_.nextAction}]});return Promise.resolve(0)}function JS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=t(Z,"type");if(!eF(Y))return C$("Missing or invalid report type.",`sumr mission report <issueKey> --type <type>
499
+ Allowed: ${eU.join(", ")}`),Promise.resolve(1);let W=a(),U=o9(X.issueKey),J=Y1(W,X.issueKey),G=RJ(Y),_=C0(J.missionDir,G);NZ(_,{recursive:!0});let H=C0(_,a9(U,Y));wZ(H,iF(Y,U),"utf8");let V=I$(W,{...U,reports:{...U.reports,[Y]:H}});if(g(Z))h({ok:!0,mission:V,reportPath:H});else P(`${TJ(Y)} report written`,{title:"Report",fields:[{label:"Path",value:H},{label:"Next",value:V.nextAction}]});return Promise.resolve(0)}function GS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=o9(X.issueKey),U=dM(Y,W);if(!U.ok){let H=I$(Y,{...W,blocker:{reason:`Issue sync could not fetch context: ${U.reason}`,blockedAt:new Date().toISOString()}});if(g(Z))h({ok:!1,mission:H,reason:U.reason});else Q$(`Issue sync incomplete: ${H.issueKey}`,{title:"Issue sync",fields:[{label:"Reason",value:U.reason},{label:"Next",value:H.nextAction}]});return Promise.resolve(0)}let J=mM(Y,W),G=W.title&&W.title!==W.issueKey?W.title:U.context.title?.trim()??W.title,_=I$(Y,{...W,title:G||W.title,issueContext:U.context,blocker:void 0,boardStatus:J.ok?J.status:W.boardStatus,boardSyncedAt:J.ok?new Date().toISOString():W.boardSyncedAt});if(g(Z))h({ok:!0,mission:_});else P(`Issue context synced: ${_.issueKey}`,{title:"Issue sync",fields:[{label:"Comments",value:String(U.context.comments.length)},{label:"Attachments",value:String(U.context.attachments.length)},{label:"Board status",value:J.ok?J.status:void 0},{label:"Next",value:_.nextAction}]});return Promise.resolve(0)}function _S($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=t(Z,"reason");if(!Y)return C$("Missing QA failure reason.","sumr mission reopen <issueKey> --reason <text> [--note <re-repro pointer>]"),Promise.resolve(1);let W=a(),U=a1(W,X.issueKey);if(!U)return p(`Mission not found: ${X.issueKey}`),Promise.resolve(1);let J=t(Z,"note"),G=new Date().toISOString(),_=Y1(W,X.issueKey),H=C0(_.missionDir,RJ(i0.QaFailure));NZ(H,{recursive:!0});let V=C0(H,a9(U,i0.QaFailure));wZ(V,BS(U.issueKey,Y,J),"utf8");let{validation:q,quality:K,...B}=U.reports,L=I$(W,{...U,status:y.QaFailed,reports:{...B,qaFailure:V},qaFailure:{reason:Y,reproPointer:J,reportPath:V,failedAt:G}});if(g(Z))h({ok:!0,mission:L,reportPath:V});else Q$(`Mission reopened after QA failure: ${L.issueKey}`,{title:"QA failure",fields:[{label:"Reason",value:Y},{label:"Re-repro",value:J},{label:"Report",value:V},{label:"Next",value:L.nextAction}]});return Promise.resolve(0)}function HS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=t(Z,"reason");if(!Y)return C$("Missing blocker reason.","sumr mission block <issueKey> --reason <text>"),Promise.resolve(1);let W=a(),U=o9(X.issueKey),J=I$(W,{...U,blocker:{reason:Y,blockedAt:new Date().toISOString()}});if(g(Z))h({ok:!0,mission:J});else Q$(`Mission blocked: ${J.issueKey}`,{title:"Blocker",fields:[{label:"Reason",value:Y},{label:"Next",value:J.nextAction}]});return Promise.resolve(0)}function VS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=a1(Y,X.issueKey);if(!W)return p(`Mission not found: ${X.issueKey}`),Promise.resolve(1);let U=I$(Y,{...W,blocker:void 0});if(g(Z))h({ok:!0,mission:U});else P(`Mission unblocked: ${U.issueKey}`,{title:"Mission",fields:[{label:"Next",value:U.nextAction}]});return Promise.resolve(0)}function qS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let Y=a(),W=a1(Y,X.issueKey);if(!W)return p(`Mission not found: ${X.issueKey}`),Promise.resolve(1);try{let U=bF(Y,W,{force:l$(Z,"force")});if(g(Z))h({ok:!0,mission:U});else P(`Mission closed: ${U.issueKey}`);return Promise.resolve(0)}catch(U){return p(U instanceof Error?U.message:String(U)),Promise.resolve(1)}}function KS($){let{options:Q}=W$($),Z=Number(t(Q,"older-than")??30),X=l$(Q,"dry-run"),Y=a();s0(Y);let W=kF(Y,{olderThanDays:Number.isFinite(Z)?Z:30,dryRun:X});if(g(Q))h({ok:!0,dryRun:X,...W});else{let U=X?W.eligible.length:W.removed.length,J=X?W.eligible:W.removed;if(P(`${X?"Eligible":"Removed"} closed mission cache directories: ${U}`),J.length>0)i$(J,X?"Eligible":"Removed")}return Promise.resolve(0)}function RJ($){return $===i0.Handoff?"handoffs":C0("reports",$)}function BS($,Q,Z){return`# QA Failure Report: ${$}
500
+
501
+ ## Rejection Reason
502
+
503
+ ${Q}
504
+
505
+ ## Re-repro Pointer
506
+
507
+ ${Z??"TODO: link the failing scenario, steps, or screenshot QA used."}
508
+ `}async function jS($){let{positionals:Q,options:Z}=W$($),X=W1($,Z,Q[0]);if(!X.ok)return X.code;let Y=a();if(Y.config.git?.prMode===cE.Disabled)return p("PR assist is disabled for this repo by mission.git.prMode."),1;let W=a1(Y,X.issueKey);if(!W)return p(`Mission not found: ${X.issueKey}`),1;let U=TS(Z),J=ES(Y,Z),G=Y1(Y,X.issueKey),_=iU(G.missionDir,"prs");AS(_,{recursive:!0});let H=iU(_,a9(W,"pr")),V=SS(Y,W,J);OS(H,V,"utf8");let q=I$(Y,{...W,pr:{...W.pr,latestPath:H,mode:CS(U),updatedAt:new Date().toISOString()}});if(U===d$.Preview)return FS(Z,q,H,V,J),0;let K=await IS(Y,q,H,J,U);if(!K.ok)return K.code;return q=I$(Y,{...q,pr:{...q.pr,url:K.url,updatedAt:new Date().toISOString()}}),MS(Z,q,H,K.url),0}function TS($){if(l$($,d$.Create))return d$.Create;if(l$($,d$.CreateDraft))return d$.CreateDraft;return d$.Preview}function ES($,Q){let Z=t(Q,"base")??t(Q,"base-branch");if(Z)return Z;if($.config.git?.baseBranch)return $.config.git.baseBranch;let X=oE($.cwd);if(!X)throw Error("Could not resolve a PR base branch. Pass --base <branch> or configure mission.git.baseBranch.");return X}function CS($){if($===d$.CreateDraft)return VZ.Draft;if($===d$.Create)return VZ.Ready;return VZ.Preview}function FS($,Q,Z,X,Y){if(g($)){h({ok:!0,mission:Q,prPath:Z,body:X});return}P("PR preview written",{title:"Pull Request",fields:[{label:"Path",value:Z},{label:"Base branch",value:Y},{label:"Next",value:Q.nextAction}]})}function MS($,Q,Z,X){if(g($)){h({ok:!0,mission:Q,prPath:Z,url:X});return}P("Pull request created",{title:"Pull Request",fields:[{label:"URL",value:X},{label:"Preview",value:Z}]})}function SS($,Q,Z){let X=tF($.cwd),Y=Q.issueKey.match(/^(?:GH|GL)-(\d+)$/)?.[1],W=Y?`Refs #${Y}`:`Refs ${Q.issueKey}`;return`## Summary
459
509
  - ${Q.title}
460
510
  - TODO: summarize the user-facing change.
461
511
  - TODO: summarize the main implementation change.
462
- - ${J}
512
+ - ${W}
463
513
 
464
514
  ## Verification
465
515
  - TODO: add commands run and results.
@@ -485,14 +535,14 @@ ${X?`
485
535
 
486
536
  ${X.trim()}
487
537
  `:""}
488
- `}async function KT($,Q,Z,X,U){let J=$.config.git?.provider??fJ(SQ($.cwd));if(J!==t.Github&&J!==t.Gitlab)return l(`PR creation is only implemented for GitHub and GitLab in V1. Current provider: ${yJ(J)}.`),{ok:!1,code:1};let W=CQ($.cwd);if(!W||MT(W))return l(`Refusing to create a PR from protected or empty branch: ${W??"(none)"}`),{ok:!1,code:1};let Y=AT(Q);if(Y&&W!==Y)return l(`Refusing to create a PR from branch ${W} because mission ${Q.issueKey} is recorded on branch ${Y}. Switch to ${Y}, or intentionally reclaim the mission on ${W} before creating the PR.`),{ok:!1,code:1};if(!await LT(U,W,X))return{ok:!1,code:1};let z=PQ("git",["push","-u","origin",W],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(z.status!==0)return l(`Could not push branch before PR creation.
489
- ${z.stderr.trim()}`),{ok:!1,code:1};let _=J===t.Github?qT($,Q,Z,X,U):BT($,Q,Z,X,W,U);if(_.status!==0)return l(`Could not create pull request.
490
- ${_.stderr.trim()}`),{ok:!1,code:1};return{ok:!0,url:_.stdout.trim()}}function qT($,Q,Z,X,U){let J=["pr","create","--base",X,"--title",dJ(Q),"--body-file",Z];if(U===gJ.CreateDraft)J.push("--draft");return PQ("gh",J,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}function BT($,Q,Z,X,U,J){let W=["mr","create","--base",X,"--source-branch",U,"--title",dJ(Q),"--description",UT(Z,"utf8")];if(J===gJ.CreateDraft)W.push("--draft");return PQ("glab",W,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}async function LT($,Q,Z){if(!o0())return l(`External write blocked. Re-run interactively to approve ${$} from ${Q} to ${Z}.`),!1;return await Q1({message:`Push ${Q} and ${$===y$.CreateDraft?"create a draft PR":"create a PR"} into ${Z}?`,options:[{value:$8.No,label:"No",hint:"Keep the PR preview only"},{value:$8.Yes,label:"Yes",hint:"Push branch and create PR"}],initialValue:$8.No})===$8.Yes}function dJ($){let Q=`${$.issueKey}: ${$.title}`.replace(/\s+/g," ").trim();return Q.length<=70?Q:`${Q.slice(0,67).trimEnd()}...`}function AT($){return $.claim?.branch??$.branch}function MT($){return WT.some((Q)=>Q===$)}async function jT($){let{positionals:Q,options:Z}=_$($),X=e(),U=PJ(Z),J=await TT($,Z,X,Q[0],U);if(!J.ok)return J.code;let W=await ST(Z,J.issueKey,U);if(!W.ok)return W.code;let Y=RJ(X,J.issueKey,W.title);if(h(Z))u({ok:!0,mission:Y});else v(`Mission ready: ${Y.issueKey}`,{title:"Mission",fields:[{label:"Title",value:Y.title},{label:"Storage",value:P1(X,Y.issueKey).missionDir},{label:"Next",value:Y.nextAction}]});return 0}async function TT($,Q,Z,X,U){let J=ET(Q,Z,X);if(J)return J;if(!X&&U){let Y=await CT(Z);if(!Y)return{ok:!1,code:0};return{ok:!0,issueKey:Y}}if(!X)return E$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let W=J8({issueKey:X,prefixes:Z.config.issuePrefixes,allowCustomKey:v$(Q,"allow-custom-key")});if(!W.ok)return l(W.message),{ok:!1,code:1};return{ok:!0,issueKey:W.issueKey}}function ET($,Q,Z){let X=U$($,"tracker")??U$($,"provider"),U=U$($,"issue")??U$($,"key");if(!X&&!U)return;if(Z)return E$("Use either a positional issue key or tracker options, not both.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};if(!U)return E$("Missing tracker issue parameters.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};let J=X?xJ(X):Q.config.tracker?.provider;if(!J)return E$(X?`Unsupported tracker: ${X}`:"Missing tracker issue source.","Set one with `sumr mission init --tracker <tracker>` or pass --tracker explicitly."),{ok:!1,code:1};let W=TQ(J,U);if(!W.ok)return l(W.message),{ok:!1,code:1};let Y=J8({issueKey:W.issueKey,prefixes:Q.config.issuePrefixes,allowCustomKey:!0});if(!Y.ok)return l(Y.message),{ok:!1,code:1};return{ok:!0,issueKey:Y.issueKey}}async function CT($){let Q=await Q1({message:"Where is this mission tracked?",options:H8.map((J)=>({value:J.value,label:J.label,hint:J.hint})),initialValue:$.config.tracker?.provider??c.Github});if(!Q)return;let Z=vJ(Q),X=await K0({message:Z.inputLabel,placeholder:Z.placeholder,validate:(J)=>{let W=TQ(Q,J??"");if(!W.ok)return W.message;let Y=J8({issueKey:W.issueKey,prefixes:$.config.issuePrefixes,allowCustomKey:!0});return Y.ok?void 0:Y.message}});if(!X)return;let U=TQ(Q,X);return U.ok?U.issueKey:void 0}async function ST($,Q,Z){let X=U$($,"title")??U$($,"name");if(X)return{ok:!0,title:X};if(!Z)return E$("Missing title.","sumr mission start <issueKey> --title <title>"),{ok:!1,code:1};let J=(await K0({message:"Mission title",placeholder:`Implement ${Q}`,validate:(W)=>{if(!W?.trim())return"Enter a mission title.";return}}))?.trim();return J?{ok:!0,title:J}:{ok:!1,code:0}}var E2,iL,I0,rL,C2,oL,L$,aL,D1,sL,R0,tL,R$,eL,Y1,$A,Q8,QA,LQ,ZA,Z8,XA,UA,GJ,JA,WA,YA,EQ,GA,zJ,zA,_A,D0,VA,HA,_J,OA,VJ,KA,qA,BA,HJ,LA,AA,I,f$,D$,MA,A,m,jA,OJ,c,t,TA,N0,BQ,RA,KJ,DA,LJ,AJ,yA,MJ,fA,vA,xA,gA,hA,uA,dA,mA,lA,sA,EJ,S2,YM,RQ=30,wM=".sumr",kM=".sumr-cache",PM,bM,mM,T2,kQ,H8,Sj,Fj,JJ,y$,gJ,$8,Ly,k1,WT,P,FT;var lJ=c2(()=>{N();N();N();N();N();N();N();N();E2={Auto:"auto",Ask:"ask",Human:"human",Manual:"manual"},iL=[E2.Auto,E2.Ask,E2.Human,E2.Manual],I0={Pending:"pending",Ready:"ready",Done:"done",Skipped:"skipped",Blocked:"blocked"},rL=[I0.Pending,I0.Ready,I0.Done,I0.Skipped,I0.Blocked],C2={Basic:"basic",PlanningOnly:"planning-only",StandardDelivery:"standard-delivery",FullDelivery:"full-delivery"},oL=[C2.Basic,C2.PlanningOnly,C2.StandardDelivery,C2.FullDelivery],L$={IssueSync:"issue.sync",ContextResearch:"context.research",PlanCreate:"plan.create",PlanApprove:"plan.approve",BranchCheck:"branch.check",WorkClaim:"work.claim",ImplementationReport:"implementation.report",ReviewReport:"review.report",ValidationReport:"validation.report",QualityGate:"quality.gate",PrPrepare:"pr.prepare",PrCreate:"pr.create",MissionClose:"mission.close"},aL=[L$.IssueSync,L$.ContextResearch,L$.PlanCreate,L$.PlanApprove,L$.BranchCheck,L$.WorkClaim,L$.ImplementationReport,L$.ReviewReport,L$.ValidationReport,L$.QualityGate,L$.PrPrepare,L$.PrCreate,L$.MissionClose],D1={Planning:"planning",Planned:"planned",InProgress:"in_progress",Review:"review",Validated:"validated",Blocked:"blocked",Closed:"closed"},sL=[D1.Planning,D1.Planned,D1.InProgress,D1.Review,D1.Validated,D1.Blocked,D1.Closed],R0={Implementation:"implementation",Review:"review",Validation:"validation",Quality:"quality",Handoff:"handoff"},tL=[R0.Implementation,R0.Review,R0.Validation,R0.Quality,R0.Handoff],R$={Github:"github",Gitlab:"gitlab",Jira:"jira",Linear:"linear",AzureBoards:"azure-boards",Shortcut:"shortcut",Clickup:"clickup",Asana:"asana",Trello:"trello",Notion:"notion",Custom:"custom"},eL=[R$.Github,R$.Gitlab,R$.Jira,R$.Linear,R$.AzureBoards,R$.Shortcut,R$.Clickup,R$.Asana,R$.Trello,R$.Notion,R$.Custom],Y1={Github:"github",Gitlab:"gitlab",Bitbucket:"bitbucket",AzureDevops:"azure-devops",Gitea:"gitea",Codeberg:"codeberg",GenericGit:"generic-git",None:"none"},$A=[Y1.Github,Y1.Gitlab,Y1.Bitbucket,Y1.AzureDevops,Y1.Gitea,Y1.Codeberg,Y1.GenericGit,Y1.None],Q8={Preview:"preview",Ask:"ask",Disabled:"disabled"},QA=[Q8.Preview,Q8.Ask,Q8.Disabled],LQ={Repo:"repo",Global:"global"},ZA=[LQ.Repo,LQ.Global],Z8={Preview:"preview",Draft:"draft",Ready:"ready"},XA=[Z8.Preview,Z8.Draft,Z8.Ready],UA=E2,GJ=iL,JA=I0,WA=rL,YA=C2,EQ=oL,GA=L$,zJ=aL,zA=D1,_A=sL,D0=R0,VA=tL,HA=R$,_J=eL,OA=Y1,VJ=$A,KA=Q8,qA=QA,BA=LQ,HJ=ZA,LA=Z8,AA=XA,I=UA,f$=JA,D$=YA,MA=EQ,A=GA,m=zA,jA=D0,OJ=VA,c=HA,t=OA,TA=KA,N0=BA,BQ=LA;RA=["ISSUE","GH","GL"],KJ=/^[A-Z][A-Z0-9]*$/,DA=/^[A-Za-z0-9][A-Za-z0-9._-]{1,80}$/;LJ=L.object({provider:L.enum(_J).optional()}).strict(),AJ=L.object({provider:L.enum(VJ).optional(),baseBranch:L.string().min(1).optional(),prMode:L.enum(qA).optional()}).strict(),yA=L.object({uses:L.string().min(1),enabled:L.boolean().optional(),advance:L.string().min(1).optional()}).strict(),MJ=L.object({preset:L.string().min(1).optional(),steps:L.array(yA).optional()}).strict(),fA=L.object({repoId:L.string().min(1).optional(),tracker:LJ.optional(),git:AJ.optional(),flow:MJ.optional(),issuePrefixes:L.array(L.string()),retentionDays:L.number().int().positive()}).strict(),vA=L.object({latestPath:L.string().min(1),approved:L.boolean(),approvedAt:L.string().optional()}).strict(),xA=L.object({agent:L.string().min(1),startedAt:L.string().min(1),branch:L.string().optional(),sourceSha:L.string().optional()}).strict(),gA=L.object({reason:L.string().min(1),blockedAt:L.string().min(1)}).strict(),hA=L.object({implementation:L.string().optional(),review:L.string().optional(),validation:L.string().optional(),quality:L.string().optional(),handoff:L.string().optional()}).strict(),uA=L.object({latestPath:L.string().optional(),url:L.string().optional(),mode:L.enum(AA).optional(),createdAt:L.string().optional(),updatedAt:L.string().optional()}).strict(),dA=L.object({preset:L.enum(EQ),hash:L.string().min(1),steps:L.array(L.object({uses:L.enum(zJ),enabled:L.boolean(),advance:L.enum(GJ),status:L.enum(WA),artifactPath:L.string().optional(),updatedAt:L.string().optional()}).strict())}).strict(),mA=L.object({version:L.literal(1),repoId:L.string().min(1),repoLabel:L.string().min(1),storageScope:L.enum(HJ),createdAt:L.string().min(1),updatedAt:L.string().min(1),tracker:LJ.optional(),git:AJ.optional(),flow:MJ.optional(),issuePrefixes:L.array(L.string())}).strict(),lA=L.object({version:L.literal(1),missionId:L.string().min(1),repoId:L.string().min(1),repoLabel:L.string().min(1),issueKey:L.string().min(1),issuePathKey:L.string().min(1),title:L.string().min(1),status:L.enum(_A),storageScope:L.enum(HJ),createdAt:L.string().min(1),updatedAt:L.string().min(1),branch:L.string().optional(),sourceSha:L.string().optional(),plan:vA.optional(),claim:xA.optional(),reports:hA,pr:uA.optional(),flow:dA.optional(),blocker:gA.optional(),nextAction:L.string().min(1)}).strict();sA=[{id:A.IssueSync,label:"Sync issue context",nextAction:"Sync or confirm issue context.",externalWrite:!1},{id:A.ContextResearch,label:"Research context",nextAction:"Research code and tracker context.",externalWrite:!1},{id:A.PlanCreate,label:"Create plan",nextAction:"Create and register a Mission plan.",externalWrite:!1},{id:A.PlanApprove,label:"Approve plan",nextAction:"Approve the latest plan.",externalWrite:!1},{id:A.BranchCheck,label:"Check branch",nextAction:"Confirm the implementation branch.",externalWrite:!1},{id:A.WorkClaim,label:"Claim work",nextAction:"Claim the mission for implementation.",externalWrite:!1},{id:A.ImplementationReport,label:"Implementation report",nextAction:"Create an implementation report.",externalWrite:!1},{id:A.ReviewReport,label:"Review report",nextAction:"Create a review report.",externalWrite:!1},{id:A.ValidationReport,label:"Validation report",nextAction:"Create a validation report.",externalWrite:!1},{id:A.QualityGate,label:"Quality gate",nextAction:"Create a quality gate report.",externalWrite:!1},{id:A.PrPrepare,label:"Prepare PR",nextAction:"Prepare a PR preview.",externalWrite:!1},{id:A.PrCreate,label:"Create PR",nextAction:"Ask for approval to create the PR.",externalWrite:!0},{id:A.MissionClose,label:"Close mission",nextAction:"Close the mission.",externalWrite:!1}],EJ={[D$.Basic]:[{uses:A.PlanCreate,advance:I.Auto},{uses:A.PlanApprove,advance:I.Human},{uses:A.WorkClaim,advance:I.Auto},{uses:A.ImplementationReport,advance:I.Manual},{uses:A.ReviewReport,advance:I.Manual},{uses:A.ValidationReport,advance:I.Manual},{uses:A.MissionClose,advance:I.Manual}],[D$.PlanningOnly]:[{uses:A.IssueSync,advance:I.Auto},{uses:A.ContextResearch,advance:I.Auto},{uses:A.PlanCreate,advance:I.Auto},{uses:A.PlanApprove,advance:I.Human}],[D$.StandardDelivery]:[{uses:A.IssueSync,advance:I.Auto},{uses:A.ContextResearch,enabled:!1,advance:I.Auto},{uses:A.PlanCreate,advance:I.Auto},{uses:A.PlanApprove,advance:I.Human},{uses:A.BranchCheck,advance:I.Ask},{uses:A.WorkClaim,advance:I.Auto},{uses:A.ImplementationReport,advance:I.Manual},{uses:A.ReviewReport,advance:I.Manual},{uses:A.ValidationReport,advance:I.Manual},{uses:A.QualityGate,advance:I.Manual},{uses:A.PrPrepare,advance:I.Ask},{uses:A.PrCreate,advance:I.Human}],[D$.FullDelivery]:[{uses:A.IssueSync,advance:I.Auto},{uses:A.ContextResearch,advance:I.Auto},{uses:A.PlanCreate,advance:I.Auto},{uses:A.PlanApprove,advance:I.Human},{uses:A.BranchCheck,advance:I.Ask},{uses:A.WorkClaim,advance:I.Auto},{uses:A.ImplementationReport,advance:I.Manual},{uses:A.ReviewReport,advance:I.Manual},{uses:A.ValidationReport,advance:I.Manual},{uses:A.QualityGate,advance:I.Manual},{uses:A.PrPrepare,advance:I.Ask},{uses:A.PrCreate,advance:I.Human},{uses:A.MissionClose,advance:I.Manual}]},S2=[...MA];YM={[A.IssueSync]:($)=>$.issueKey&&$.title,[A.ContextResearch]:($)=>$.reports.handoff,[A.PlanCreate]:($)=>$.plan,[A.PlanApprove]:($)=>$.plan?.approved,[A.BranchCheck]:($)=>$.branch||$.claim?.branch,[A.WorkClaim]:($)=>$.claim,[A.ImplementationReport]:($)=>$.reports.implementation,[A.ReviewReport]:($)=>$.reports.review,[A.ValidationReport]:($)=>$.reports.validation,[A.QualityGate]:($)=>$.reports.quality,[A.PrPrepare]:($)=>$.pr?.latestPath,[A.PrCreate]:($)=>$.pr?.url,[A.MissionClose]:($)=>$.status===m.Closed};PM=["cache","mission"],bM=["mission"];mM=new Set(["agent","from","flow","git-provider","issue","key","name","note","older-than","prefix","provider","reason","repo","title","tracker","type","base","base-branch"]);T2={SHOW:"show",LIST:"list",VALIDATE:"validate",EXPORT:"export",USE:"use"};kQ=[{value:t.Github,label:"GitHub",hint:"Create pull requests with gh"},{value:t.Gitlab,label:"GitLab",hint:"Create merge requests with glab later"},{value:t.Bitbucket,label:"Bitbucket",hint:"Recognized; manual PR flow in V1"},{value:t.AzureDevops,label:"Azure DevOps",hint:"Recognized; manual PR flow in V1"},{value:t.Gitea,label:"Gitea",hint:"Recognized; manual PR flow in V1"},{value:t.Codeberg,label:"Codeberg",hint:"Recognized; manual PR flow in V1"},{value:t.GenericGit,label:"Generic Git",hint:"No hosted PR automation"},{value:t.None,label:"None",hint:"Disable PR assistance"}];H8=[{value:c.Github,label:"GitHub",hint:"#123 becomes GH-123",inputLabel:"GitHub issue number",placeholder:"123"},{value:c.Gitlab,label:"GitLab",hint:"#123 becomes GL-123",inputLabel:"GitLab issue IID",placeholder:"123"},{value:c.Jira,label:"Jira",hint:"PROJECT-123",inputLabel:"Jira ticket key",placeholder:"PROJECT-123"},{value:c.Linear,label:"Linear",hint:"TEAM-123",inputLabel:"Linear issue identifier",placeholder:"TEAM-123"},{value:c.AzureBoards,label:"Azure Boards",hint:"AB#123 or work item 123",inputLabel:"Azure Boards work item",placeholder:"AB#123"},{value:c.Shortcut,label:"Shortcut",hint:"Story ID or task URL",inputLabel:"Shortcut story ID",placeholder:"12345"},{value:c.Clickup,label:"ClickUp",hint:"Task ID or task URL",inputLabel:"ClickUp task ID",placeholder:"abc123"},{value:c.Asana,label:"Asana",hint:"Task ID or task URL",inputLabel:"Asana task ID",placeholder:"1200000000000000"},{value:c.Trello,label:"Trello",hint:"Card ID or card URL",inputLabel:"Trello card ID",placeholder:"card-slug-or-id"},{value:c.Notion,label:"Notion",hint:"Task/page ID or title",inputLabel:"Notion task ID or title",placeholder:"release checklist"},{value:c.Custom,label:"Custom ID",hint:"Use any local mission label",inputLabel:"Custom mission ID",placeholder:"checkout race condition"}],Sj=/^(?:#|GH-|GL-)?([0-9]+)$/i,Fj=/^[A-Z][A-Z0-9]*-[0-9]+$/;JJ={Skip:"skip"},y$={Create:"create",CreateDraft:"create-draft",Preview:"preview"},gJ={Create:y$.Create,CreateDraft:y$.CreateDraft},$8={Yes:"yes",No:"no"},Ly={Plan:"plan",Implementation:D0.Implementation,Review:D0.Review,Validation:D0.Validation,Quality:D0.Quality,Handoff:D0.Handoff,Pr:"pr"},k1=Symbol("init-option-error");WT=["main","dev","uat","prod"];P={init:{name:"mission init",description:"Initialize Mission state for this repository or global workspace",usage:["sumr mission init","sumr mission init --tracker github --git-provider github --flow standard-delivery","sumr mission init --tracker jira --prefix SMR --prefix OPS --flow planning-only"],options:[{flag:"--tracker <type>",description:"Work source: github, gitlab, jira, linear, azure-boards, shortcut, clickup, asana, trello, notion, custom"},{flag:"--provider <type>",description:"Alias for --tracker"},{flag:"--git-provider <type>",description:"Git/PR provider: github, gitlab, bitbucket, azure-devops, gitea, codeberg, generic-git, none"},{flag:"--flow <preset>",description:"Mission flow: basic, planning-only, standard-delivery, full-delivery"},{flag:"--prefix <value>",description:"Accepted issue key prefix; repeatable"},{flag:"--yes",description:"Use defaults and skip interactive prefix setup"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},start:{name:"mission start",description:"Start or resume a mission",usage:["sumr mission start",'sumr mission start SMR-123 --title "Improve onboarding"','sumr mission start --tracker github --issue 123 --name "Fix checkout flow"'],options:[{flag:"--title <title>",description:"Mission title"},{flag:"--name <title>",description:"Alias for --title, useful for API payloads"},{flag:"--tracker <type>",description:"Tracker: github, gitlab, jira, linear, azure-boards, shortcut, clickup, asana, trello, notion, custom"},{flag:"--provider <type>",description:"Alias for --tracker"},{flag:"--issue <id>",description:"Raw tracker issue number, key, or custom ID"},{flag:"--key <id>",description:"Alias for --issue"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr mission start",'sumr mission start GH-123 --title "Fix checkout flow"','sumr mission start --tracker jira --key SMR-123 --name "Fix checkout flow" --json']},status:{name:"mission status",description:"Show Mission status and next action",usage:["sumr mission status","sumr mission status SMR-123"],options:[{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},next:{name:"mission next",description:"Show the next Mission action",usage:["sumr mission next","sumr mission next --all"],options:[{flag:"--all",description:"Include all repo namespaces in this storage root"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},list:{name:"mission list",description:"List missions",usage:["sumr mission list","sumr mission list --all"],options:[{flag:"--all",description:"Include all repo namespaces in this storage root"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},plan:{name:"mission plan",description:"Create or register a mission plan",usage:["sumr mission plan SMR-123","sumr mission plan SMR-123 --from plan.md","sumr mission plan SMR-123 --from plan.md --approve"],options:[{flag:"--from <file>",description:"Use an existing plan file as source"},{flag:"--approve",description:"Mark the plan approved in the same command"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},approve:{name:"mission approve",description:"Approve the current mission plan for implementation",usage:["sumr mission approve SMR-123"],options:[{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},claim:{name:"mission claim",description:"Claim a mission for implementation",usage:["sumr mission claim SMR-123 --agent codex"],options:[{flag:"--agent <name>",description:"Agent or session name"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},report:{name:"mission report",description:"Create a mission report",usage:["sumr mission report SMR-123 --type validation"],options:[{flag:"--type <kind>",description:"Report type: implementation, review, validation, quality, handoff"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},block:{name:"mission block",description:"Mark a mission as blocked",usage:['sumr mission block SMR-123 --reason "Waiting for design"'],options:[{flag:"--reason <text>",description:"Blocker reason"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},unblock:{name:"mission unblock",description:"Clear a mission blocker",usage:["sumr mission unblock SMR-123"],options:[{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},close:{name:"mission close",description:"Close a completed mission",usage:["sumr mission close SMR-123","sumr mission close SMR-123 --force"],options:[{flag:"--force",description:"Close without a validation report"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},clean:{name:"mission clean",description:"Remove expired closed mission cache",usage:["sumr mission clean --dry-run","sumr mission clean --older-than 30"],options:[{flag:"--older-than <days>",description:"Retention threshold for closed missions"},{flag:"--dry-run",description:"Show eligible cache without deleting"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},flow:{name:"mission flow",description:"Inspect and configure Mission flow presets",usage:["sumr mission flow list","sumr mission flow show","sumr mission flow use standard-delivery","sumr mission flow validate","sumr mission flow export --json"],options:[{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},pr:{name:"mission pr",description:"Prepare or create a pull request from Mission evidence",usage:["sumr mission pr SMR-123 --preview","sumr mission pr SMR-123 --create-draft","sumr mission pr SMR-123 --create"],options:[{flag:"--preview",description:"Write a PR preview artifact without external writes"},{flag:"--create-draft",description:"Ask approval, push branch, and create draft PR"},{flag:"--create",description:"Ask approval, push branch, and create PR"},{flag:"--base <branch>",description:"Target branch override"},{flag:"--base-branch <branch>",description:"Alias for --base"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]}},FT=L1({name:"mission",description:"Track AI-assisted work state and next actions",group:"modules",visibility:"public",commands:[E({name:"init",description:P.init.description,group:"modules",visibility:"public",help:P.init,execute:Dj}),E({name:"start",description:P.start.description,group:"modules",visibility:"public",help:P.start,execute:jT}),E({name:"status",description:P.status.description,group:"modules",visibility:"public",help:P.status,execute:cj}),E({name:"next",description:P.next.description,group:"modules",visibility:"public",help:P.next,execute:ij}),E({name:"list",description:P.list.description,group:"modules",visibility:"public",help:P.list,execute:nj}),E({name:"plan",description:P.plan.description,group:"modules",visibility:"public",help:P.plan,execute:rj}),E({name:"approve",description:P.approve.description,group:"modules",visibility:"public",help:P.approve,execute:oj}),E({name:"claim",description:P.claim.description,group:"modules",visibility:"public",help:P.claim,execute:aj}),E({name:"report",description:P.report.description,group:"modules",visibility:"public",help:P.report,execute:sj}),E({name:"block",description:P.block.description,group:"modules",visibility:"public",help:P.block,execute:tj}),E({name:"unblock",description:P.unblock.description,group:"modules",visibility:"public",help:P.unblock,execute:ej}),E({name:"close",description:P.close.description,group:"modules",visibility:"public",help:P.close,execute:$T}),E({name:"clean",description:P.clean.description,group:"modules",visibility:"public",help:P.clean,execute:QT}),E({name:"flow",description:P.flow.description,group:"modules",visibility:"public",help:P.flow,execute:Hj}),E({name:"pr",description:P.pr.description,group:"modules",visibility:"public",help:P.pr,execute:YT})]})});var FG={};p2(FG,{validatePlaybookSlice:()=>fW,playbookModule:()=>Hk,PlaybookSliceSchema:()=>yW});import{z as w$}from"zod";import{existsSync as vW,mkdirSync as RT,readdirSync as DT,writeFileSync as NT}from"fs";import{join as cQ,resolve as xW}from"path";import{existsSync as J7,readFileSync as wT}from"fs";import{join as kT}from"path";import{stdout as eE}from"process";import{log as WC}from"@clack/prompts";import{existsSync as z7,mkdirSync as YC,readdirSync as GC,readFileSync as zC,renameSync as _C,rmSync as iQ,statSync as VC,writeFileSync as HC}from"fs";import{dirname as OC,join as _7}from"path";import{existsSync as XY}from"fs";import{resolve as oQ}from"path";import{existsSync as cC,readdirSync as nC,readFileSync as iC,statSync as rC}from"fs";import{basename as oJ,dirname as b8,join as oC,relative as aC,resolve as sC}from"path";import{existsSync as q7,readdirSync as B7,readFileSync as yS,statSync as fS}from"fs";import{homedir as vS}from"os";import{basename as sQ,dirname as u0,join as k$,resolve as g1}from"path";import{fileURLToPath as HY}from"url";import{existsSync as uS,readFileSync as dS,realpathSync as tJ,statSync as mS}from"fs";import{isAbsolute as xQ,join as lS,relative as eJ,resolve as pS}from"path";import{existsSync as aS,realpathSync as sS,statSync as tS}from"fs";import{existsSync as mF}from"fs";import{relative as M7,resolve as j7,sep as LY}from"path";import{sep as HI}from"path";import{existsSync as jY,readFileSync as TY,rmSync as WW}from"fs";import{join as g2,relative as EY,resolve as $7,sep as E7}from"path";import{existsSync as ZR,readFileSync as XR}from"fs";import{join as UR}from"path";import{existsSync as PY,readFileSync as bY,writeFileSync as yY}from"fs";import{join as fY}from"path";import{existsSync as pY,mkdirSync as FR,readFileSync as IR,writeFileSync as RR}from"fs";import{join as cY}from"path";import{existsSync as aY,readdirSync as vR,rmSync as Z7}from"fs";import{basename as xR,join as z1}from"path";import{chmodSync as lR,existsSync as x8,readdirSync as g8,readFileSync as h8,rmSync as D7}from"fs";import{basename as N7,extname as u8,join as C$}from"path";import{basename as VD,join as CW}from"path";import{existsSync as BD,readFileSync as LD}from"fs";import{join as AD}from"path";import{chmodSync as pD,existsSync as cD,readFileSync as nD}from"fs";import{join as m2}from"path";import{existsSync as iD,readFileSync as rD}from"fs";import{join as oD}from"path";import{existsSync as aD,readFileSync as sD}from"fs";import{basename as tD,join as eD}from"path";import{join as wW}from"path";import{existsSync as Hw}from"fs";import{resolve as jG}from"path";import{existsSync as Cw}from"fs";import{dirname as Sw,resolve as EG}from"path";function fW($){let Q=yW.safeParse($);if(Q.success)return{ok:!0,value:Q.data};return{ok:!1,issues:Q.error.issues.map((X)=>{return`${X.path.length>0?X.path.join("."):"(root)"}: ${X.message}`})}}function N2($){return $.playbook.agentsMd??={},$.playbook.agentsMd}function h1($){return $.mission??={},$.mission}function gW($){let Q=h1($);return Q.git??={},Q.git}function mT($){let Q=h1($);return Q.tracker??={},Q.tracker}function A8($){let Q=h1($);return Q.flow??={},Q.flow}function lT($){let Q=A8($);return Q.steps??=[],Q.steps}function pT($){let Q=h1($);return Q.issuePrefixes??=[],Q.issuePrefixes}function cT($){return PT.includes($)}function nT($){return bT.includes($)}function iT($){return yT.includes($)}function rT($){return fT.includes($)}function oT($){return vT.includes($)}function $E($){let Q=[];Q.push("# SUMR per-repo configuration"),Q.push("# Run `sumr playbook config` to update this file."),Q.push(`version: ${$.version}`),Q.push(""),Q.push(...hW($));let Z=$.kontract?.input?.trim(),X=$.kontract?.output?.trim();if(Z||X){if(Q.push(""),Q.push("# Kontract"),Q.push("kontract:"),Z)Q.push(` input: ${Z}`);if(X)Q.push(` output: ${X}`)}return Q.push(""),Q.join(`
491
- `)}function QE($,Q){if($.push(" agentsMd:"),Q.enabled!==void 0)$.push(` enabled: ${Q.enabled}`);if(Q.claudeMd!==void 0)$.push(` claudeMd: ${Q.claudeMd}`);let Z=Q.targets??eT;if(Z.length>0){$.push(" targets:");for(let X of Z)$.push(` - ${X===aT?sT:X}`)}}function hW($){let Q=[];Q.push("# Playbook"),Q.push("playbook:"),Q.push(" channels:");for(let[Z,X]of Object.entries($.playbook.channels))Q.push(` ${Z}: ${X}`);Q.push(" sources:");for(let Z of $.playbook.sources)Q.push(` - ${Z}`);if($.playbook.hideGen!==void 0)Q.push(` hideGen: ${$.playbook.hideGen}`);if($.playbook.agentsMd)QE(Q,$.playbook.agentsMd);return Q}function W7($){return kT($,ZE)}function h2($){return J7(W7($))}function u2($){let Q=W7($);if(!J7(Q))throw Error(`No sumr.yaml found in ${$}. Run \`sumr playbook config\` to set up this repo.`);let Z=wT(Q,"utf8");return RE(Z)}function YE($,Q){let Z=W7($);if(!J7(Z)){H0(Z,$E(Q));return}d1(Z,"playbook",hW(Q),{sectionComment:tT})}function M8($){return Object.entries($.playbook.channels).filter(([,Q])=>Q).map(([Q])=>Q)}function j8(){return structuredClone(WE)}function O1($){let Q=$.trim();if(!Q)return;let Z=Q[0],X=Q.at(-1);if((Z===UE||Z===JE)&&X===Z&&Q.length>=2)return Q.slice(1,-1).trim()||void 0;return Q.replace(/\s+#.*$/,"").trim()||void 0}function GE($,Q,Z){if(/^ {4}enabled:\s*(true|false)/.test($))return N2(Z).enabled=/true/.test($),!0;if(/^ {4}claudeMd:\s*(true|false)/.test($))return N2(Z).claudeMd=/true/.test($),!0;if(/^ {4}targets:\s*$/.test($))return Q.playbookSection=V$.agentsMdTargets,N2(Z).targets=[],!0;return!1}function zE($,Q,Z){if(Q.playbookSection===V$.channels){let X=$.match(/^\s{4}(\w+):\s*(true|false)/),U=X?.[1],J=X?.[2];if(U&&J)Z.playbook.channels[U]=J===XE.TRUE}else if(Q.playbookSection===V$.sources){let U=$.match(/^(?: {2}| {4})-\s+(.+)/)?.[1];if(U)Z.playbook.sources.push(U.trim())}}function _E($,Q,Z){if(/^ {2}channels:/.test($))return Q.playbookSection=V$.channels,Z.playbook.channels={},!0;if(/^ {2}sources:/.test($))return Q.playbookSection=V$.sources,Z.playbook.sources=[],!0;if(/^ {2}hideGen:\s*(true|false)/.test($))return Z.playbook.hideGen=/true/.test($),Q.playbookSection=V$.none,!0;if(/^ {2}agentsMd:\s*$/.test($))return Q.playbookSection=V$.agentsMd,N2(Z),!0;return!1}function VE($,Q,Z){if(Q.playbookSection!==V$.agentsMdTargets||!/^ {6}-\s+/.test($))return!1;let U=$.match(/^ {6}-\s+(.+)$/)?.[1];if(U){let J=O1(U);if(J){let W=N2(Z);W.targets??=[],W.targets.push(J)}}return!0}function HE($,Q,Z){if(_E($,Q,Z))return!0;if(Q.playbookSection===V$.agentsMd)return GE($,Q,Z);if(VE($,Q,Z))return!0;if(/^ {2}[A-Za-z][A-Za-z0-9_-]*:/.test($))return Q.playbookSection=V$.none,!0;return zE($,Q,Z),!1}function OE($,Q){let Z=$.match(/^ {4}(provider|baseBranch|prMode):\s*(.+)$/);if(!Z?.[1]||!Z[2])return;let X=Z[1],U=O1(Z[2]),J=gW(Q);if(X===yQ.PROVIDER&&U&&nT(U))J.provider=U;else if(X===yQ.BASE_BRANCH&&U)J.baseBranch=U;else if(X===yQ.PR_MODE&&U&&iT(U))J.prMode=U}function KE($,Q,Z){if(/^ {4}preset:\s*(.+)$/.test($)){let X=$.match(/^ {4}preset:\s*(.+)$/)?.[1],U=X?O1(X):void 0;if(U&&rT(U))A8(Z).preset=U;return!0}if(/^ {4}steps:\s*$/.test($))return Q.missionSection=J$.flowSteps,Q.currentFlowStepIndex=-1,A8(Z).steps=[],!0;return!1}function qE($,Q){if(Q)Q.enabled=/^ {8}enabled:\s*true/.test($)}function BE($,Q){let Z=$.match(/^ {8}advance:\s*(.+)$/)?.[1],X=Z?O1(Z):void 0;if(X&&oT(X)&&Q)Q.advance=X}function LE($,Q,Z){if(/^ {6}-\s+uses:\s*(.+)$/.test($)){let X=$.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],U=X?O1(X):void 0;if(U){let J=lT(Z);J.push({uses:U}),Q.currentFlowStepIndex=J.length-1}return!0}if(Q.currentFlowStepIndex>=0&&/^ {8}enabled:\s*(true|false)/.test($))return qE($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;if(Q.currentFlowStepIndex>=0&&/^ {8}advance:\s*(.+)$/.test($))return BE($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;return!1}function AE($,Q,Z){if(/^ {2}issuePrefixes:\s*$/.test($))return Q.missionSection=J$.issuePrefixes,h1(Z).issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test($))return Q.missionSection=J$.tracker,mT(Z),!0;if(/^ {2}git:\s*$/.test($))return Q.missionSection=J$.git,gW(Z),!0;if(/^ {2}flow:\s*$/.test($))return Q.missionSection=J$.flow,Q.currentFlowStepIndex=-1,A8(Z),!0;return!1}function ME($,Q,Z){let X=$.match(/^ {2}(repoId|retentionDays):\s*(.+)$/);if(!X?.[1]||!X[2])return!1;let U=X[1],J=O1(X[2]),W=h1(Z);if(Q.missionSection=J$.none,U===pJ.REPO_ID&&J)W.repoId=J;else if(U===pJ.RETENTION_DAYS&&J&&/^\d+$/.test(J))W.retentionDays=Number(J);return!0}function jE($,Q,Z){if(Q.missionSection!==J$.tracker||!/^ {4}provider:\s*(.+)$/.test($))return!1;let X=$.match(/^ {4}provider:\s*(.+)$/)?.[1],U=X?O1(X)?.toLowerCase():void 0;if(U&&cT(U))h1(Z).tracker={provider:U};return!0}function TE($,Q,Z){if(jE($,Q,Z))return!0;if(Q.missionSection===J$.git)return OE($,Z),!0;if(Q.missionSection===J$.flow)return KE($,Q,Z);if(Q.missionSection===J$.flowSteps)return LE($,Q,Z);return}function EE($,Q,Z){if(Q.missionSection!==J$.issuePrefixes||!/^ {4}-\s+(.+)$/.test($))return;let X=$.match(/^ {4}-\s+(.+)$/)?.[1],U=X?O1(X):void 0;if(U)pT(Z).push(U.toUpperCase())}function CE($,Q,Z){if(AE($,Q,Z))return!0;let X=TE($,Q,Z);if(X!==void 0)return X;if(ME($,Q,Z))return!0;if(/^ {2}\S/.test($))Q.missionSection=J$.none;return EE($,Q,Z),!1}function SE($,Q,Z){if(/^playbook:/.test($))return Q.topSection=_1.playbook,Q.playbookSection=V$.none,Q.missionSection=J$.none,!0;if(/^kontract:/.test($))return Q.topSection=_1.kontract,Q.playbookSection=V$.none,Q.missionSection=J$.none,Z.kontract??={},!0;if(/^mission:/.test($))return Q.topSection=_1.mission,Q.playbookSection=V$.none,Q.missionSection=J$.none,h1(Z),!0;if(/^\w/.test($)&&$!==bQ.PLAYBOOK&&$!==bQ.KONTRACT&&$!==bQ.MISSION)Q.topSection=_1.root,Q.playbookSection=V$.none,Q.missionSection=J$.none;return!1}function FE($,Q){let Z=$.match(/^\s{2}(input|output):\s*(.+)$/),X=Z?.[1],U=Z?.[2];if(!X||!U)return;let J=O1(U);if(!J)return;if(Q.kontract??={},X===dT.INPUT)Q.kontract.input=J;else Q.kontract.output=J}function IE($,Q,Z){if(SE($,Q,Z))return;if(Q.topSection===_1.root){let X=$.match(/^version:\s*(\d+)/);if(X)Z.version=Number(X[1])}else if(Q.topSection===_1.playbook)HE($,Q,Z);else if(Q.topSection===_1.kontract)FE($,Z);else if(Q.topSection===_1.mission)CE($,Q,Z)}function RE($){let Q=j8(),Z=$.split(`
492
- `),X={topSection:_1.root,playbookSection:V$.none,missionSection:J$.none,currentFlowStepIndex:-1};for(let U of Z){let J=U.trimEnd();if(!J||J.startsWith("#"))continue;IE(J,X,Q)}return Q}async function x0($,Q,Z="mauve"){let{note:X}=await import("@clack/prompts");X(Q,$,P$(Z))}async function g0($,Q){await x0($,Q,"pink")}function cJ($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function wE($,Q,Z,X){let U=`name: ${Q}
538
+ `}async function IS($,Q,Z,X,Y){let W=$.config.git?.provider??CJ(u9($.cwd));if(W!==s.Github&&W!==s.Gitlab)return p(`PR creation is only implemented for GitHub and GitLab in V1. Current provider: ${EJ(W)}.`),{ok:!1,code:1};let U=CZ($.cwd);if(!U||bS(U))return p(`Refusing to create a PR from protected or empty branch: ${U??"(none)"}`),{ok:!1,code:1};let J=wS(Q);if(J&&U!==J)return p(`Refusing to create a PR from branch ${U} because mission ${Q.issueKey} is recorded on branch ${J}. Switch to ${J}, or intentionally reclaim the mission on ${U} before creating the PR.`),{ok:!1,code:1};if(!await NS(Y,U,X))return{ok:!1,code:1};let _=PZ("git",["push","-u","origin",U],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(_.status!==0)return p(`Could not push branch before PR creation.
539
+ ${_.stderr.trim()}`),{ok:!1,code:1};let H=W===s.Github?RS($,Q,Z,X,Y):DS($,Q,Z,X,U,Y);if(H.status!==0)return p(`Could not create pull request.
540
+ ${H.stderr.trim()}`),{ok:!1,code:1};return{ok:!0,url:H.stdout.trim()}}function RS($,Q,Z,X,Y){let W=["pr","create","--base",X,"--title",DJ(Q),"--body-file",Z];if(Y===SJ.CreateDraft)W.push("--draft");return PZ("gh",W,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}function DS($,Q,Z,X,Y,W){let U=["mr","create","--base",X,"--source-branch",Y,"--title",DJ(Q),"--description",LS(Z,"utf8")];if(W===SJ.CreateDraft)U.push("--draft");return PZ("glab",U,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}async function NS($,Q,Z){if(!S2())return p(`External write blocked. Re-run interactively to approve ${$} from ${Q} to ${Z}.`),!1;return await q1({message:`Push ${Q} and ${$===d$.CreateDraft?"create a draft PR":"create a PR"} into ${Z}?`,options:[{value:y9.No,label:"No",hint:"Keep the PR preview only"},{value:y9.Yes,label:"Yes",hint:"Push branch and create PR"}],initialValue:y9.No})===y9.Yes}function DJ($){let Q=`${$.issueKey}: ${$.title}`.replace(/\s+/g," ").trim();return Q.length<=70?Q:`${Q.slice(0,67).trimEnd()}...`}function wS($){return $.claim?.branch??$.branch}function bS($){return zS.some((Q)=>Q===$)}async function kS($){let{positionals:Q,options:Z}=W$($),X=a(),Y=jJ(Z),W=await PS($,Z,X,Q[0],Y);if(!W.ok)return W.code;let U=await xS(Z,W.issueKey,Y);if(!U.ok)return U.code;let J=BJ(X,W.issueKey,U.title);if(g(Z))h({ok:!0,mission:J});else P(`Mission ready: ${J.issueKey}`,{title:"Mission",fields:[{label:"Title",value:J.title},{label:"Storage",value:Y1(X,J.issueKey).missionDir},{label:"Next",value:J.nextAction}]});return 0}async function PS($,Q,Z,X,Y){let W=fS(Q,Z,X);if(W)return W;if(!X&&Y){let J=await yS(Z);if(!J)return{ok:!1,code:0};return{ok:!0,issueKey:J}}if(!X)return C$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let U=m9({issueKey:X,prefixes:Z.config.issuePrefixes,allowCustomKey:l$(Q,"allow-custom-key")});if(!U.ok)return p(U.message),{ok:!1,code:1};return{ok:!0,issueKey:U.issueKey}}function fS($,Q,Z){let X=t($,"tracker")??t($,"provider"),Y=t($,"issue")??t($,"key");if(!X&&!Y)return;if(Z)return C$("Use either a positional issue key or tracker options, not both.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};if(!Y)return C$("Missing tracker issue parameters.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};let W=X?MJ(X):Q.config.tracker?.provider;if(!W)return C$(X?`Unsupported tracker: ${X}`:"Missing tracker issue source.","Set one with `sumr mission init --tracker <tracker>` or pass --tracker explicitly."),{ok:!1,code:1};let U=zZ(W,Y);if(!U.ok)return p(U.message),{ok:!1,code:1};let J=m9({issueKey:U.issueKey,prefixes:Q.config.issuePrefixes,allowCustomKey:!0});if(!J.ok)return p(J.message),{ok:!1,code:1};return{ok:!0,issueKey:J.issueKey}}async function yS($){let Q=await q1({message:"Where is this mission tracked?",options:s9.map((W)=>({value:W.value,label:W.label,hint:W.hint})),initialValue:$.config.tracker?.provider??l.Github});if(!Q)return;let Z=FJ(Q),X=await P0({message:Z.inputLabel,placeholder:Z.placeholder,validate:(W)=>{let U=zZ(Q,W??"");if(!U.ok)return U.message;let J=m9({issueKey:U.issueKey,prefixes:$.config.issuePrefixes,allowCustomKey:!0});return J.ok?void 0:J.message}});if(!X)return;let Y=zZ(Q,X);return Y.ok?Y.issueKey:void 0}async function xS($,Q,Z){let X=t($,"title")??t($,"name");if(X)return{ok:!0,title:X};if(!Z)return C$("Missing title.","sumr mission start <issueKey> --title <title>"),{ok:!1,code:1};let W=(await P0({message:"Mission title",placeholder:`Implement ${Q}`,validate:(U)=>{if(!U?.trim())return"Enter a mission title.";return}}))?.trim();return W?{ok:!0,title:W}:{ok:!1,code:0}}var n2,zE,r0,jE,r2,TE,E$,EE,T1,CE,j0,FE,P$,ME,E1,SE,x9,IE,BZ,RE,v9,DE,NE,oU,wE,bE,kE,TZ,PE,aU,fE,yE,T0,xE,vE,EZ,gE,sU,hE,uE,dE,tU,mE,lE,I,m$,f$,pE,z,y,i0,eU,l,s,cE,o0,VZ,sE,$J,tE,XJ,YJ,YC,WJ,WC,UC,JC,GC,_C,HC,VC,qC,KC,BC,AC,FC,GJ,i2,PC,SZ=30,ZF=".sumr",XF=".sumr-cache",YF,WF,BF,KJ,MF,SF,IF,lF,pF,cF,c2,DZ,s9,KM,BM,nU,d$,SJ,y9,xh,o1,gM,hM="attachments",uM,zS,b,vS;var wJ=A8(()=>{R();R();R();R();R();R();R();R();n2={Auto:"auto",Ask:"ask",Human:"human",Manual:"manual"},zE=[n2.Auto,n2.Ask,n2.Human,n2.Manual],r0={Pending:"pending",Ready:"ready",Done:"done",Skipped:"skipped",Blocked:"blocked"},jE=[r0.Pending,r0.Ready,r0.Done,r0.Skipped,r0.Blocked],r2={Basic:"basic",PlanningOnly:"planning-only",StandardDelivery:"standard-delivery",FullDelivery:"full-delivery"},TE=[r2.Basic,r2.PlanningOnly,r2.StandardDelivery,r2.FullDelivery],E$={IssueSync:"issue.sync",ContextResearch:"context.research",PlanCreate:"plan.create",PlanApprove:"plan.approve",BranchCheck:"branch.check",WorkClaim:"work.claim",ImplementationReport:"implementation.report",ReviewReport:"review.report",ValidationReport:"validation.report",QualityGate:"quality.gate",PrPrepare:"pr.prepare",PrCreate:"pr.create",MissionClose:"mission.close"},EE=[E$.IssueSync,E$.ContextResearch,E$.PlanCreate,E$.PlanApprove,E$.BranchCheck,E$.WorkClaim,E$.ImplementationReport,E$.ReviewReport,E$.ValidationReport,E$.QualityGate,E$.PrPrepare,E$.PrCreate,E$.MissionClose],T1={Planning:"planning",Planned:"planned",InProgress:"in_progress",Review:"review",Validated:"validated",QaFailed:"qa_failed",Blocked:"blocked",Closed:"closed"},CE=[T1.Planning,T1.Planned,T1.InProgress,T1.Review,T1.Validated,T1.QaFailed,T1.Blocked,T1.Closed],j0={Implementation:"implementation",Review:"review",Validation:"validation",Quality:"quality",Handoff:"handoff",QaFailure:"qa_failure"},FE=[j0.Implementation,j0.Review,j0.Validation,j0.Quality,j0.Handoff,j0.QaFailure],P$={Github:"github",Gitlab:"gitlab",Jira:"jira",Linear:"linear",AzureBoards:"azure-boards",Shortcut:"shortcut",Clickup:"clickup",Asana:"asana",Trello:"trello",Notion:"notion",Custom:"custom"},ME=[P$.Github,P$.Gitlab,P$.Jira,P$.Linear,P$.AzureBoards,P$.Shortcut,P$.Clickup,P$.Asana,P$.Trello,P$.Notion,P$.Custom],E1={Github:"github",Gitlab:"gitlab",Bitbucket:"bitbucket",AzureDevops:"azure-devops",Gitea:"gitea",Codeberg:"codeberg",GenericGit:"generic-git",None:"none"},SE=[E1.Github,E1.Gitlab,E1.Bitbucket,E1.AzureDevops,E1.Gitea,E1.Codeberg,E1.GenericGit,E1.None],x9={Preview:"preview",Ask:"ask",Disabled:"disabled"},IE=[x9.Preview,x9.Ask,x9.Disabled],BZ={Repo:"repo",Global:"global"},RE=[BZ.Repo,BZ.Global],v9={Preview:"preview",Draft:"draft",Ready:"ready"},DE=[v9.Preview,v9.Draft,v9.Ready],NE=n2,oU=zE,wE=r0,bE=jE,kE=r2,TZ=TE,PE=E$,aU=EE,fE=T1,yE=CE,T0=j0,xE=FE,vE=P$,EZ=ME,gE=E1,sU=SE,hE=x9,uE=IE,dE=BZ,tU=RE,mE=v9,lE=DE,I=NE,m$=wE,f$=kE,pE=TZ,z=PE,y=fE,i0=T0,eU=xE,l=vE,s=gE,cE=hE,o0=dE,VZ=mE;sE=["ISSUE","GH","GL"],$J=/^[A-Z][A-Z0-9]*$/,tE=/^[A-Za-z0-9][A-Za-z0-9._-]{1,80}$/;XJ=A.object({provider:A.enum(EZ).optional()}).strict(),YJ=A.object({provider:A.enum(sU).optional(),baseBranch:A.string().min(1).optional(),prMode:A.enum(uE).optional()}).strict(),YC=A.object({uses:A.string().min(1),enabled:A.boolean().optional(),advance:A.string().min(1).optional()}).strict(),WJ=A.object({preset:A.string().min(1).optional(),steps:A.array(YC).optional()}).strict(),WC=A.object({repoId:A.string().min(1).optional(),tracker:XJ.optional(),git:YJ.optional(),flow:WJ.optional(),issuePrefixes:A.array(A.string()),retentionDays:A.number().int().positive()}).strict(),UC=A.object({latestPath:A.string().min(1),approved:A.boolean(),approvedAt:A.string().optional()}).strict(),JC=A.object({agent:A.string().min(1),startedAt:A.string().min(1),branch:A.string().optional(),sourceSha:A.string().optional()}).strict(),GC=A.object({reason:A.string().min(1),blockedAt:A.string().min(1)}).strict(),_C=A.object({implementation:A.string().optional(),review:A.string().optional(),validation:A.string().optional(),quality:A.string().optional(),handoff:A.string().optional(),qaFailure:A.string().optional()}).strict(),HC=A.object({provider:A.enum(EZ),reference:A.string().min(1),title:A.string().optional(),body:A.string(),comments:A.array(A.object({author:A.string().optional(),body:A.string(),createdAt:A.string().optional()}).strict()),attachments:A.array(A.object({url:A.string().min(1),localPath:A.string().min(1),source:A.enum(["body","comment"])}).strict()),fetchedAt:A.string().min(1)}).strict(),VC=A.object({reason:A.string().min(1),reproPointer:A.string().optional(),reportPath:A.string().optional(),failedAt:A.string().min(1)}).strict(),qC=A.object({latestPath:A.string().optional(),url:A.string().optional(),mode:A.enum(lE).optional(),createdAt:A.string().optional(),updatedAt:A.string().optional()}).strict(),KC=A.object({preset:A.enum(TZ),hash:A.string().min(1),steps:A.array(A.object({uses:A.enum(aU),enabled:A.boolean(),advance:A.enum(oU),status:A.enum(bE),artifactPath:A.string().optional(),updatedAt:A.string().optional()}).strict())}).strict(),BC=A.object({version:A.literal(1),repoId:A.string().min(1),repoLabel:A.string().min(1),storageScope:A.enum(tU),createdAt:A.string().min(1),updatedAt:A.string().min(1),tracker:XJ.optional(),git:YJ.optional(),flow:WJ.optional(),issuePrefixes:A.array(A.string())}).strict(),AC=A.object({version:A.literal(1),missionId:A.string().min(1),repoId:A.string().min(1),repoLabel:A.string().min(1),issueKey:A.string().min(1),issuePathKey:A.string().min(1),title:A.string().min(1),status:A.enum(yE),storageScope:A.enum(tU),createdAt:A.string().min(1),updatedAt:A.string().min(1),branch:A.string().optional(),sourceSha:A.string().optional(),plan:UC.optional(),claim:JC.optional(),reports:_C,pr:qC.optional(),flow:KC.optional(),blocker:GC.optional(),issueContext:HC.optional(),qaFailure:VC.optional(),boardStatus:A.string().optional(),boardSyncedAt:A.string().optional(),nextAction:A.string().min(1)}).strict();FC=[{id:z.IssueSync,label:"Sync issue context",nextAction:"Sync or confirm issue context.",externalWrite:!1},{id:z.ContextResearch,label:"Research context",nextAction:"Research code and tracker context.",externalWrite:!1},{id:z.PlanCreate,label:"Create plan",nextAction:"Create and register a Mission plan.",externalWrite:!1},{id:z.PlanApprove,label:"Approve plan",nextAction:"Approve the latest plan.",externalWrite:!1},{id:z.BranchCheck,label:"Check branch",nextAction:"Confirm the implementation branch.",externalWrite:!1},{id:z.WorkClaim,label:"Claim work",nextAction:"Claim the mission for implementation.",externalWrite:!1},{id:z.ImplementationReport,label:"Implementation report",nextAction:"Create an implementation report.",externalWrite:!1},{id:z.ReviewReport,label:"Review report",nextAction:"Create a review report.",externalWrite:!1},{id:z.ValidationReport,label:"Validation report",nextAction:"Create a validation report.",externalWrite:!1},{id:z.QualityGate,label:"Quality gate",nextAction:"Create a quality gate report.",externalWrite:!1},{id:z.PrPrepare,label:"Prepare PR",nextAction:"Prepare a PR preview.",externalWrite:!1},{id:z.PrCreate,label:"Create PR",nextAction:"Ask for approval to create the PR.",externalWrite:!0},{id:z.MissionClose,label:"Close mission",nextAction:"Close the mission.",externalWrite:!1}],GJ={[f$.Basic]:[{uses:z.PlanCreate,advance:I.Auto},{uses:z.PlanApprove,advance:I.Human},{uses:z.WorkClaim,advance:I.Auto},{uses:z.ImplementationReport,advance:I.Manual},{uses:z.ReviewReport,advance:I.Manual},{uses:z.ValidationReport,advance:I.Manual},{uses:z.MissionClose,advance:I.Manual}],[f$.PlanningOnly]:[{uses:z.IssueSync,advance:I.Auto},{uses:z.ContextResearch,advance:I.Auto},{uses:z.PlanCreate,advance:I.Auto},{uses:z.PlanApprove,advance:I.Human}],[f$.StandardDelivery]:[{uses:z.IssueSync,advance:I.Auto},{uses:z.ContextResearch,enabled:!1,advance:I.Auto},{uses:z.PlanCreate,advance:I.Auto},{uses:z.PlanApprove,advance:I.Human},{uses:z.BranchCheck,advance:I.Ask},{uses:z.WorkClaim,advance:I.Auto},{uses:z.ImplementationReport,advance:I.Manual},{uses:z.ReviewReport,advance:I.Manual},{uses:z.ValidationReport,advance:I.Manual},{uses:z.QualityGate,advance:I.Manual},{uses:z.PrPrepare,advance:I.Ask},{uses:z.PrCreate,advance:I.Human}],[f$.FullDelivery]:[{uses:z.IssueSync,advance:I.Auto},{uses:z.ContextResearch,advance:I.Auto},{uses:z.PlanCreate,advance:I.Auto},{uses:z.PlanApprove,advance:I.Human},{uses:z.BranchCheck,advance:I.Ask},{uses:z.WorkClaim,advance:I.Auto},{uses:z.ImplementationReport,advance:I.Manual},{uses:z.ReviewReport,advance:I.Manual},{uses:z.ValidationReport,advance:I.Manual},{uses:z.QualityGate,advance:I.Manual},{uses:z.PrPrepare,advance:I.Ask},{uses:z.PrCreate,advance:I.Human},{uses:z.MissionClose,advance:I.Manual}]},i2=[...pE];PC={[z.IssueSync]:($)=>$.issueContext?.fetchedAt,[z.ContextResearch]:($)=>$.reports.handoff,[z.PlanCreate]:($)=>$.plan,[z.PlanApprove]:($)=>$.plan?.approved,[z.BranchCheck]:($)=>$.branch||$.claim?.branch,[z.WorkClaim]:($)=>$.claim,[z.ImplementationReport]:($)=>$.reports.implementation,[z.ReviewReport]:($)=>$.reports.review,[z.ValidationReport]:($)=>$.reports.validation,[z.QualityGate]:($)=>$.reports.quality,[z.PrPrepare]:($)=>$.pr?.latestPath,[z.PrCreate]:($)=>$.pr?.url,[z.MissionClose]:($)=>$.status===y.Closed};YF=["cache","mission"],WF=["mission"];BF=new Set(["agent","from","flow","git-provider","issue","key","name","note","older-than","prefix","provider","reason","repo","title","tracker","type","base","base-branch"]);KJ=/\bTODO\b|<reproduction>|<evidence>|<command-or-test-or-ui-evidence>/i,MF=/^#{1,6}\s*reproduction\b/im,SF=/^#{1,6}\s*(evidence|verification)\b/im,IF=/(`[^`]+`|\$\s+\S|\bbun\b|\bnpm\b|\byarn\b|\bpnpm\b|\btest(s|ed|ing)?\b|\bran\b|\bpassed\b|\bhttps?:\/\/\S|\bscreenshot\b|\bmanual\b|\bUI\b)/i;lF=["done","closed","complete","completed","merged","shipped"],pF=["qa failed","qa-failed","failed","reopened","in progress","in-progress","todo","to do","backlog","in review","in-review"];cF={[y.Blocked]:0,[y.QaFailed]:1,[y.Planning]:2,[y.Planned]:3,[y.InProgress]:4,[y.Review]:5,[y.Validated]:6};c2={SHOW:"show",LIST:"list",VALIDATE:"validate",EXPORT:"export",USE:"use"};DZ=[{value:s.Github,label:"GitHub",hint:"Create pull requests with gh"},{value:s.Gitlab,label:"GitLab",hint:"Create merge requests with glab later"},{value:s.Bitbucket,label:"Bitbucket",hint:"Recognized; manual PR flow in V1"},{value:s.AzureDevops,label:"Azure DevOps",hint:"Recognized; manual PR flow in V1"},{value:s.Gitea,label:"Gitea",hint:"Recognized; manual PR flow in V1"},{value:s.Codeberg,label:"Codeberg",hint:"Recognized; manual PR flow in V1"},{value:s.GenericGit,label:"Generic Git",hint:"No hosted PR automation"},{value:s.None,label:"None",hint:"Disable PR assistance"}];s9=[{value:l.Github,label:"GitHub",hint:"#123 becomes GH-123",inputLabel:"GitHub issue number",placeholder:"123"},{value:l.Gitlab,label:"GitLab",hint:"#123 becomes GL-123",inputLabel:"GitLab issue IID",placeholder:"123"},{value:l.Jira,label:"Jira",hint:"PROJECT-123",inputLabel:"Jira ticket key",placeholder:"PROJECT-123"},{value:l.Linear,label:"Linear",hint:"TEAM-123",inputLabel:"Linear issue identifier",placeholder:"TEAM-123"},{value:l.AzureBoards,label:"Azure Boards",hint:"AB#123 or work item 123",inputLabel:"Azure Boards work item",placeholder:"AB#123"},{value:l.Shortcut,label:"Shortcut",hint:"Story ID or task URL",inputLabel:"Shortcut story ID",placeholder:"12345"},{value:l.Clickup,label:"ClickUp",hint:"Task ID or task URL",inputLabel:"ClickUp task ID",placeholder:"abc123"},{value:l.Asana,label:"Asana",hint:"Task ID or task URL",inputLabel:"Asana task ID",placeholder:"1200000000000000"},{value:l.Trello,label:"Trello",hint:"Card ID or card URL",inputLabel:"Trello card ID",placeholder:"card-slug-or-id"},{value:l.Notion,label:"Notion",hint:"Task/page ID or title",inputLabel:"Notion task ID or title",placeholder:"release checklist"},{value:l.Custom,label:"Custom ID",hint:"Use any local mission label",inputLabel:"Custom mission ID",placeholder:"checkout race condition"}],KM=/^(?:#|GH-|GL-)?([0-9]+)$/i,BM=/^[A-Z][A-Z0-9]*-[0-9]+$/;nU={Skip:"skip"},d$={Create:"create",CreateDraft:"create-draft",Preview:"preview"},SJ={Create:d$.Create,CreateDraft:d$.CreateDraft},y9={Yes:"yes",No:"no"},xh={Plan:"plan",Implementation:T0.Implementation,Review:T0.Review,Validation:T0.Validation,Quality:T0.Quality,Handoff:T0.Handoff,QaFailure:T0.QaFailure,Pr:"pr"},o1=Symbol("init-option-error");gM=/^GH-(\d+)$/,uM=[{ext:"png",bytes:[137,80,78,71]},{ext:"jpg",bytes:[255,216,255]},{ext:"gif",bytes:[71,73,70,56]},{ext:"webp",bytes:[82,73,70,70]},{ext:"bmp",bytes:[66,77]}];zS=["main","dev","uat","prod"];b={init:{name:"mission init",description:"Initialize Mission state for this repository or global workspace",usage:["sumr mission init","sumr mission init --tracker github --git-provider github --flow standard-delivery","sumr mission init --tracker jira --prefix SMR --prefix OPS --flow planning-only"],options:[{flag:"--tracker <type>",description:"Work source: github, gitlab, jira, linear, azure-boards, shortcut, clickup, asana, trello, notion, custom"},{flag:"--provider <type>",description:"Alias for --tracker"},{flag:"--git-provider <type>",description:"Git/PR provider: github, gitlab, bitbucket, azure-devops, gitea, codeberg, generic-git, none"},{flag:"--flow <preset>",description:"Mission flow: basic, planning-only, standard-delivery, full-delivery"},{flag:"--prefix <value>",description:"Accepted issue key prefix; repeatable"},{flag:"--yes",description:"Use defaults and skip interactive prefix setup"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},start:{name:"mission start",description:"Start or resume a mission",usage:["sumr mission start",'sumr mission start SMR-123 --title "Improve onboarding"','sumr mission start --tracker github --issue 123 --name "Fix checkout flow"'],options:[{flag:"--title <title>",description:"Mission title"},{flag:"--name <title>",description:"Alias for --title, useful for API payloads"},{flag:"--tracker <type>",description:"Tracker: github, gitlab, jira, linear, azure-boards, shortcut, clickup, asana, trello, notion, custom"},{flag:"--provider <type>",description:"Alias for --tracker"},{flag:"--issue <id>",description:"Raw tracker issue number, key, or custom ID"},{flag:"--key <id>",description:"Alias for --issue"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr mission start",'sumr mission start GH-123 --title "Fix checkout flow"','sumr mission start --tracker jira --key SMR-123 --name "Fix checkout flow" --json']},status:{name:"mission status",description:"Show Mission status and next action",usage:["sumr mission status","sumr mission status SMR-123"],options:[{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},next:{name:"mission next",description:"Show the next Mission action",usage:["sumr mission next","sumr mission next --all"],options:[{flag:"--all",description:"Include all repo namespaces in this storage root"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},sync:{name:"mission sync",description:"Fetch issue context (body, comments, screenshots) and board status from the tracker",usage:["sumr mission sync GH-123"],options:[{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},list:{name:"mission list",description:"List missions",usage:["sumr mission list","sumr mission list --all"],options:[{flag:"--all",description:"Include all repo namespaces in this storage root"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},plan:{name:"mission plan",description:"Create or register a mission plan",usage:["sumr mission plan SMR-123","sumr mission plan SMR-123 --from plan.md","sumr mission plan SMR-123 --from plan.md --approve"],options:[{flag:"--from <file>",description:"Use an existing plan file as source"},{flag:"--approve",description:"Mark the plan approved in the same command"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},approve:{name:"mission approve",description:"Approve the current mission plan for implementation",usage:["sumr mission approve SMR-123"],options:[{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},claim:{name:"mission claim",description:"Claim a mission for implementation",usage:["sumr mission claim SMR-123 --agent codex"],options:[{flag:"--agent <name>",description:"Agent or session name"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},report:{name:"mission report",description:"Create a mission report",usage:["sumr mission report SMR-123 --type validation"],options:[{flag:"--type <kind>",description:"Report type: implementation, review, validation, quality, handoff, qa_failure"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},reopen:{name:"mission reopen",description:"Record a QA failure, reset validation, and drive a corrective cycle",usage:['sumr mission reopen SMR-123 --reason "Checkout still 500s on empty cart"','sumr mission reopen SMR-123 --reason "Regression" --note "See QA video in issue comment"'],options:[{flag:"--reason <text>",description:"Why QA rejected this work"},{flag:"--note <text>",description:"Re-repro pointer (steps, link, or screenshot)"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},block:{name:"mission block",description:"Mark a mission as blocked",usage:['sumr mission block SMR-123 --reason "Waiting for design"'],options:[{flag:"--reason <text>",description:"Blocker reason"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},unblock:{name:"mission unblock",description:"Clear a mission blocker",usage:["sumr mission unblock SMR-123"],options:[{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},close:{name:"mission close",description:"Close a completed mission",usage:["sumr mission close SMR-123","sumr mission close SMR-123 --force"],options:[{flag:"--force",description:"Close without a validation report"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},clean:{name:"mission clean",description:"Remove expired closed mission cache",usage:["sumr mission clean --dry-run","sumr mission clean --older-than 30"],options:[{flag:"--older-than <days>",description:"Retention threshold for closed missions"},{flag:"--dry-run",description:"Show eligible cache without deleting"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},flow:{name:"mission flow",description:"Inspect and configure Mission flow presets",usage:["sumr mission flow list","sumr mission flow show","sumr mission flow use standard-delivery","sumr mission flow validate","sumr mission flow export --json"],options:[{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]},pr:{name:"mission pr",description:"Prepare or create a pull request from Mission evidence",usage:["sumr mission pr SMR-123 --preview","sumr mission pr SMR-123 --create-draft","sumr mission pr SMR-123 --create"],options:[{flag:"--preview",description:"Write a PR preview artifact without external writes"},{flag:"--create-draft",description:"Ask approval, push branch, and create draft PR"},{flag:"--create",description:"Ask approval, push branch, and create PR"},{flag:"--base <branch>",description:"Target branch override"},{flag:"--base-branch <branch>",description:"Alias for --base"},{flag:"--allow-custom-key",description:"Allow a non-prefixed slug key"},{flag:"--json",description:"Output machine-readable JSON"},{flag:"--help, -h",description:"Show command help"}]}},vS=P1({name:"mission",description:"Track AI-assisted work state and next actions",group:"modules",visibility:"public",commands:[E({name:"init",description:b.init.description,group:"modules",visibility:"public",help:b.init,execute:OM}),E({name:"start",description:b.start.description,group:"modules",visibility:"public",help:b.start,execute:kS}),E({name:"status",description:b.status.description,group:"modules",visibility:"public",help:b.status,execute:QS}),E({name:"next",description:b.next.description,group:"modules",visibility:"public",help:b.next,execute:XS}),E({name:"sync",description:b.sync.description,group:"modules",visibility:"public",help:b.sync,execute:GS}),E({name:"list",description:b.list.description,group:"modules",visibility:"public",help:b.list,execute:ZS}),E({name:"plan",description:b.plan.description,group:"modules",visibility:"public",help:b.plan,execute:YS}),E({name:"approve",description:b.approve.description,group:"modules",visibility:"public",help:b.approve,execute:WS}),E({name:"claim",description:b.claim.description,group:"modules",visibility:"public",help:b.claim,execute:US}),E({name:"report",description:b.report.description,group:"modules",visibility:"public",help:b.report,execute:JS}),E({name:"reopen",description:b.reopen.description,group:"modules",visibility:"public",help:b.reopen,execute:_S}),E({name:"block",description:b.block.description,group:"modules",visibility:"public",help:b.block,execute:HS}),E({name:"unblock",description:b.unblock.description,group:"modules",visibility:"public",help:b.unblock,execute:VS}),E({name:"close",description:b.close.description,group:"modules",visibility:"public",help:b.close,execute:qS}),E({name:"clean",description:b.clean.description,group:"modules",visibility:"public",help:b.clean,execute:KS}),E({name:"flow",description:b.flow.description,group:"modules",visibility:"public",help:b.flow,execute:QM}),E({name:"pr",description:b.pr.description,group:"modules",visibility:"public",help:b.pr,execute:jS})]})});var OH={};B8(OH,{validatePlaybookSlice:()=>FG,playbookModule:()=>fy,PlaybookSliceSchema:()=>CG});import{z as x$}from"zod";import{existsSync as MG,mkdirSync as hS,readdirSync as uS,writeFileSync as dS}from"fs";import{join as nZ,resolve as SG}from"path";import{existsSync as Y7,readFileSync as mS}from"fs";import{join as lS}from"path";import{stdout as VR}from"process";import{log as zR}from"@clack/prompts";import{existsSync as G7,mkdirSync as jR,readdirSync as TR,readFileSync as ER,renameSync as CR,rmSync as iZ,statSync as FR,writeFileSync as MR}from"fs";import{dirname as SR,join as _7}from"path";import{existsSync as pG}from"fs";import{resolve as aZ}from"path";import{existsSync as XD,readdirSync as YD,readFileSync as WD,statSync as UD}from"fs";import{basename as xJ,dirname as z6,join as JD,relative as GD,resolve as _D}from"path";import{existsSync as A7,readdirSync as L7,readFileSync as nD,statSync as rD}from"fs";import{homedir as iD}from"os";import{basename as eG,dirname as J2,join as v$,resolve as I0}from"path";import{fileURLToPath as $_}from"url";import{existsSync as tD,readFileSync as eD,realpathSync as hJ,statSync as $N}from"fs";import{isAbsolute as gZ,join as QN,relative as uJ,resolve as ZN}from"path";import{existsSync as GN,realpathSync as _N,statSync as HN}from"fs";import{existsSync as tN}from"fs";import{relative as j7,resolve as T7,sep as U_}from"path";import{sep as Cw}from"path";import{existsSync as __,readFileSync as H_,rmSync as rJ}from"fs";import{join as G8,relative as V_,resolve as eZ,sep as C7}from"path";import{existsSync as qb,readFileSync as Kb}from"fs";import{join as Bb}from"path";import{existsSync as E_,readFileSync as C_,writeFileSync as F_}from"fs";import{join as M_}from"path";import{existsSync as P_,mkdirSync as yb,readFileSync as xb,writeFileSync as vb}from"fs";import{join as f_}from"path";import{existsSync as h_,readdirSync as nb,rmSync as Q7}from"fs";import{basename as rb,join as M1}from"path";import{chmodSync as Wk,existsSync as C6,readdirSync as F6,readFileSync as M6,rmSync as D7}from"fs";import{basename as N7,extname as S6,join as R$}from"path";import{basename as Rk,join as HG}from"path";import{existsSync as kk,readFileSync as Pk}from"fs";import{join as fk}from"path";import{chmodSync as UP,existsSync as JP,readFileSync as GP}from"fs";import{join as q8}from"path";import{existsSync as qP,readFileSync as KP}from"fs";import{join as BP}from"path";import{existsSync as AP,readFileSync as LP}from"fs";import{basename as OP,join as zP}from"path";import{join as OG}from"path";import{existsSync as bf}from"fs";import{resolve as HH}from"path";import{existsSync as mf}from"fs";import{dirname as lf,resolve as qH}from"path";function FG($){let Q=CG.safeParse($);if(Q.success)return{ok:!0,value:Q.data};return{ok:!1,issues:Q.error.issues.map((X)=>{return`${X.path.length>0?X.path.join("."):"(root)"}: ${X.message}`})}}function e2($){return $.playbook.agentsMd??={},$.playbook.agentsMd}function e1($){return $.mission??={},$.mission}function IG($){let Q=e1($);return Q.git??={},Q.git}function $I($){let Q=e1($);return Q.tracker??={},Q.tracker}function X6($){let Q=e1($);return Q.flow??={},Q.flow}function QI($){let Q=X6($);return Q.steps??=[],Q.steps}function ZI($){let Q=e1($);return Q.issuePrefixes??=[],Q.issuePrefixes}function XI($){return pS.includes($)}function YI($){return cS.includes($)}function WI($){return nS.includes($)}function UI($){return rS.includes($)}function JI($){return iS.includes($)}function qI($){let Q=[];Q.push("# SUMR per-repo configuration"),Q.push("# Run `sumr playbook config` to update this file."),Q.push(`version: ${$.version}`),Q.push(""),Q.push(...RG($));let Z=$.kontract?.input?.trim(),X=$.kontract?.output?.trim();if(Z||X){if(Q.push(""),Q.push("# Kontract"),Q.push("kontract:"),Z)Q.push(` input: ${Z}`);if(X)Q.push(` output: ${X}`)}return Q.push(""),Q.join(`
541
+ `)}function KI($,Q){if($.push(" agentsMd:"),Q.enabled!==void 0)$.push(` enabled: ${Q.enabled}`);if(Q.claudeMd!==void 0)$.push(` claudeMd: ${Q.claudeMd}`);let Z=Q.targets??VI;if(Z.length>0){$.push(" targets:");for(let X of Z)$.push(` - ${X===GI?_I:X}`)}}function RG($){let Q=[];Q.push("# Playbook"),Q.push("playbook:"),Q.push(" channels:");for(let[Z,X]of Object.entries($.playbook.channels))Q.push(` ${Z}: ${X}`);Q.push(" sources:");for(let Z of $.playbook.sources)Q.push(` - ${Z}`);if($.playbook.hideGen!==void 0)Q.push(` hideGen: ${$.playbook.hideGen}`);if($.playbook.agentsMd)KI(Q,$.playbook.agentsMd);return Q}function W7($){return lS($,BI)}function _8($){return Y7(W7($))}function H8($){let Q=W7($);if(!Y7(Q))throw Error(`No sumr.yaml found in ${$}. Run \`sumr playbook config\` to set up this repo.`);let Z=mS(Q,"utf8");return hI(Z)}function jI($,Q){let Z=W7($);if(!Y7(Z)){k1(Z,qI(Q));return}Y0(Z,"playbook",RG(Q),{sectionComment:HI})}function Y6($){return Object.entries($.playbook.channels).filter(([,Q])=>Q).map(([Q])=>Q)}function W6(){return structuredClone(zI)}function D1($){let Q=$.trim();if(!Q)return;let Z=Q[0],X=Q.at(-1);if((Z===LI||Z===OI)&&X===Z&&Q.length>=2)return Q.slice(1,-1).trim()||void 0;return Q.replace(/\s+#.*$/,"").trim()||void 0}function TI($,Q,Z){if(/^ {4}enabled:\s*(true|false)/.test($))return e2(Z).enabled=/true/.test($),!0;if(/^ {4}claudeMd:\s*(true|false)/.test($))return e2(Z).claudeMd=/true/.test($),!0;if(/^ {4}targets:\s*$/.test($))return Q.playbookSection=L$.agentsMdTargets,e2(Z).targets=[],!0;return!1}function EI($,Q,Z){if(Q.playbookSection===L$.channels){let X=$.match(/^\s{4}(\w+):\s*(true|false)/),Y=X?.[1],W=X?.[2];if(Y&&W)Z.playbook.channels[Y]=W===AI.TRUE}else if(Q.playbookSection===L$.sources){let Y=$.match(/^(?: {2}| {4})-\s+(.+)/)?.[1];if(Y)Z.playbook.sources.push(Y.trim())}}function CI($,Q,Z){if(/^ {2}channels:/.test($))return Q.playbookSection=L$.channels,Z.playbook.channels={},!0;if(/^ {2}sources:/.test($))return Q.playbookSection=L$.sources,Z.playbook.sources=[],!0;if(/^ {2}hideGen:\s*(true|false)/.test($))return Z.playbook.hideGen=/true/.test($),Q.playbookSection=L$.none,!0;if(/^ {2}agentsMd:\s*$/.test($))return Q.playbookSection=L$.agentsMd,e2(Z),!0;return!1}function FI($,Q,Z){if(Q.playbookSection!==L$.agentsMdTargets||!/^ {6}-\s+/.test($))return!1;let Y=$.match(/^ {6}-\s+(.+)$/)?.[1];if(Y){let W=D1(Y);if(W){let U=e2(Z);U.targets??=[],U.targets.push(W)}}return!0}function MI($,Q,Z){if(CI($,Q,Z))return!0;if(Q.playbookSection===L$.agentsMd)return TI($,Q,Z);if(FI($,Q,Z))return!0;if(/^ {2}[A-Za-z][A-Za-z0-9_-]*:/.test($))return Q.playbookSection=L$.none,!0;return EI($,Q,Z),!1}function SI($,Q){let Z=$.match(/^ {4}(provider|baseBranch|prMode):\s*(.+)$/);if(!Z?.[1]||!Z[2])return;let X=Z[1],Y=D1(Z[2]),W=IG(Q);if(X===yZ.PROVIDER&&Y&&YI(Y))W.provider=Y;else if(X===yZ.BASE_BRANCH&&Y)W.baseBranch=Y;else if(X===yZ.PR_MODE&&Y&&WI(Y))W.prMode=Y}function II($,Q,Z){if(/^ {4}preset:\s*(.+)$/.test($)){let X=$.match(/^ {4}preset:\s*(.+)$/)?.[1],Y=X?D1(X):void 0;if(Y&&UI(Y))X6(Z).preset=Y;return!0}if(/^ {4}steps:\s*$/.test($))return Q.missionSection=U$.flowSteps,Q.currentFlowStepIndex=-1,X6(Z).steps=[],!0;return!1}function RI($,Q){if(Q)Q.enabled=/^ {8}enabled:\s*true/.test($)}function DI($,Q){let Z=$.match(/^ {8}advance:\s*(.+)$/)?.[1],X=Z?D1(Z):void 0;if(X&&JI(X)&&Q)Q.advance=X}function NI($,Q,Z){if(/^ {6}-\s+uses:\s*(.+)$/.test($)){let X=$.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],Y=X?D1(X):void 0;if(Y){let W=QI(Z);W.push({uses:Y}),Q.currentFlowStepIndex=W.length-1}return!0}if(Q.currentFlowStepIndex>=0&&/^ {8}enabled:\s*(true|false)/.test($))return RI($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;if(Q.currentFlowStepIndex>=0&&/^ {8}advance:\s*(.+)$/.test($))return DI($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;return!1}function wI($,Q,Z){if(/^ {2}issuePrefixes:\s*$/.test($))return Q.missionSection=U$.issuePrefixes,e1(Z).issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test($))return Q.missionSection=U$.tracker,$I(Z),!0;if(/^ {2}git:\s*$/.test($))return Q.missionSection=U$.git,IG(Z),!0;if(/^ {2}flow:\s*$/.test($))return Q.missionSection=U$.flow,Q.currentFlowStepIndex=-1,X6(Z),!0;return!1}function bI($,Q,Z){let X=$.match(/^ {2}(repoId|retentionDays):\s*(.+)$/);if(!X?.[1]||!X[2])return!1;let Y=X[1],W=D1(X[2]),U=e1(Z);if(Q.missionSection=U$.none,Y===bJ.REPO_ID&&W)U.repoId=W;else if(Y===bJ.RETENTION_DAYS&&W&&/^\d+$/.test(W))U.retentionDays=Number(W);return!0}function kI($,Q,Z){if(Q.missionSection!==U$.tracker||!/^ {4}provider:\s*(.+)$/.test($))return!1;let X=$.match(/^ {4}provider:\s*(.+)$/)?.[1],Y=X?D1(X)?.toLowerCase():void 0;if(Y&&XI(Y))e1(Z).tracker={provider:Y};return!0}function PI($,Q,Z){if(kI($,Q,Z))return!0;if(Q.missionSection===U$.git)return SI($,Z),!0;if(Q.missionSection===U$.flow)return II($,Q,Z);if(Q.missionSection===U$.flowSteps)return NI($,Q,Z);return}function fI($,Q,Z){if(Q.missionSection!==U$.issuePrefixes||!/^ {4}-\s+(.+)$/.test($))return;let X=$.match(/^ {4}-\s+(.+)$/)?.[1],Y=X?D1(X):void 0;if(Y)ZI(Z).push(Y.toUpperCase())}function yI($,Q,Z){if(wI($,Q,Z))return!0;let X=PI($,Q,Z);if(X!==void 0)return X;if(bI($,Q,Z))return!0;if(/^ {2}\S/.test($))Q.missionSection=U$.none;return fI($,Q,Z),!1}function xI($,Q,Z){if(/^playbook:/.test($))return Q.topSection=S1.playbook,Q.playbookSection=L$.none,Q.missionSection=U$.none,!0;if(/^kontract:/.test($))return Q.topSection=S1.kontract,Q.playbookSection=L$.none,Q.missionSection=U$.none,Z.kontract??={},!0;if(/^mission:/.test($))return Q.topSection=S1.mission,Q.playbookSection=L$.none,Q.missionSection=U$.none,e1(Z),!0;if(/^\w/.test($)&&$!==fZ.PLAYBOOK&&$!==fZ.KONTRACT&&$!==fZ.MISSION)Q.topSection=S1.root,Q.playbookSection=L$.none,Q.missionSection=U$.none;return!1}function vI($,Q){let Z=$.match(/^\s{2}(input|output):\s*(.+)$/),X=Z?.[1],Y=Z?.[2];if(!X||!Y)return;let W=D1(Y);if(!W)return;if(Q.kontract??={},X===eS.INPUT)Q.kontract.input=W;else Q.kontract.output=W}function gI($,Q,Z){if(xI($,Q,Z))return;if(Q.topSection===S1.root){let X=$.match(/^version:\s*(\d+)/);if(X)Z.version=Number(X[1])}else if(Q.topSection===S1.playbook)MI($,Q,Z);else if(Q.topSection===S1.kontract)vI($,Z);else if(Q.topSection===S1.mission)yI($,Q,Z)}function hI($){let Q=W6(),Z=$.split(`
542
+ `),X={topSection:S1.root,playbookSection:L$.none,missionSection:U$.none,currentFlowStepIndex:-1};for(let Y of Z){let W=Y.trimEnd();if(!W||W.startsWith("#"))continue;gI(W,X,Q)}return Q}async function Y2($,Q,Z="mauve"){let{note:X}=await import("@clack/prompts");X(Q,$,b$(Z))}async function W2($,Q){await Y2($,Q,"pink")}function kJ($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function mI($,Q,Z,X){let Y=`name: ${Q}
493
543
  title: ${Z}
494
- description: "${X}"`;if($===v1.SKILL)return`---
495
- ${U}
544
+ description: "${X}"`;if($===t1.SKILL)return`---
545
+ ${Y}
496
546
  tags: []
497
547
  ---
498
548
 
@@ -503,10 +553,11 @@ tags: []
503
553
  ## Overview
504
554
 
505
555
  TODO: add content.
506
- `;if($===v1.TEAM_MEMBER)return`---
556
+ `;if($===t1.TEAM_MEMBER)return`---
507
557
  category: team-member
508
- ${U}
558
+ ${Y}
509
559
  modelTier: coding
560
+ nicknames: [Atlas, Delta, Echo]
510
561
 
511
562
  # Codex CLI agent profile options
512
563
  codex:
@@ -537,9 +588,9 @@ TODO: describe the team-member role and responsibilities.
537
588
  ## Instructions
538
589
 
539
590
  TODO: add instructions.
540
- `;if($===v1.WORKFLOW)return`---
591
+ `;if($===t1.WORKFLOW)return`---
541
592
  category: workflow
542
- ${U}
593
+ ${Y}
543
594
  target: ${Q}.md
544
595
 
545
596
  # Claude Code slash command options
@@ -554,9 +605,9 @@ TODO: describe when the AI should run this user-invoked workflow.
554
605
  ## Instructions
555
606
 
556
607
  TODO: write the reusable prompt or procedure.
557
- `;if($===v1.LIFECYCLE)return`---
608
+ `;if($===t1.LIFECYCLE)return`---
558
609
  category: lifecycle
559
- ${U}
610
+ ${Y}
560
611
  event: SessionStart
561
612
  target: ${Q}.py
562
613
  ---
@@ -573,7 +624,7 @@ sys.exit(0)
573
624
  \`\`\`
574
625
  `;return`---
575
626
  category: reference
576
- ${U}
627
+ ${Y}
577
628
  label: ${Z}
578
629
  when: TODO: describe when to load this reference
579
630
  order: 10
@@ -582,17 +633,18 @@ order: 10
582
633
  ## Overview
583
634
 
584
635
  TODO: add reference content.
585
- `}function kE($){if($===v1.TEAM_MEMBER)return".tm.md";if($===v1.WORKFLOW)return".wf.md";if($===v1.LIFECYCLE)return".lc.md";if($===v1.REFERENCE)return".rf.md";return".md"}function PE($,Q){let Z=new Set;for(let X of $){let U=xW(Q,X);if(!vW(U))continue;Z.add(X);try{for(let J of DT(U,{withFileTypes:!0}))if(J.isDirectory()&&!J.name.startsWith("."))Z.add(cQ(X,J.name))}catch{}}return[...Z].sort()}async function bE($,Q,Z){let X=await $({message:"Topic type",options:[{value:"skill",label:"Skill",hint:"How-to guide or standards doc (.md)"},{value:"team-member",label:"Team member",hint:"Delegated AI role (.tm.md)"},{value:"workflow",label:"Workflow",hint:"User-invoked AI workflow (.wf.md)"},{value:"lifecycle",label:"Lifecycle",hint:"AI lifecycle automation (.lc.md)"},{value:"reference",label:"Reference",hint:"Supporting detail for a skill (.rf.md)"}]});if(Q(X))return Z("Cancelled"),null;return X}async function yE($,Q,Z){let X=await $({message:"Name (kebab-case identifier)",placeholder:"my-topic",validate(U){let J=cJ(U??DE);if(!J)return"Name cannot be empty";if(J.startsWith("sumr-"))return'The "sumr-" prefix is reserved for SUMR core resources';return}});if(Q(X))return Z("Cancelled"),null;return cJ(X)}async function fE($,Q,Z){let X=await $({message:"Title (human-readable)",placeholder:"My Topic",validate(U){if(!U.trim())return"Title cannot be empty";return}});if(Q(X))return Z("Cancelled"),null;return X.trim()}async function vE($,Q,Z){let X=await $({message:"Description (what + when)",placeholder:"Covers X, Y, and Z. Use when doing X.",validate(U){if(!U.trim())return"Description cannot be empty";return}});if(Q(X))return Z("Cancelled"),null;return X.trim()}async function xE($,Q,Z,X,U,J){if(typeof Z==="string")return Z;let Y=PE($,Q).map((z)=>({value:z,label:z})),G=await X({message:"Destination folder",options:Y.length>0?Y:[{value:$[0]??"docs",label:$[0]??"docs"}]});if(U(G))return J("Cancelled"),null;return G}async function gE($){let{extras:Q}=$.args,Z=process.cwd(),{intro:X,outro:U,select:J,text:W,isCancel:Y}=await import("@clack/prompts");X("Playbook \u2014 scaffold new doc");let G=h2(Z)?u2(Z).playbook.sources:["docs"],z=await bE(J,Y,U);if(!z)return 0;let _=await yE(W,Y,U);if(!_)return 0;let V=await fE(W,Y,U);if(!V)return 0;let H=await vE(W,Y,U);if(!H)return 0;let O=await xE(G,Z,Q.source,J,Y,U);if(!O)return 0;let K=kE(z),q=`${_}${K}`,B=xW(Z,O),F=cQ(B,q);if(vW(F))return await g0("File already exists",`${F}
636
+ `}function lI($){if($===t1.TEAM_MEMBER)return".tm.md";if($===t1.WORKFLOW)return".wf.md";if($===t1.LIFECYCLE)return".lc.md";if($===t1.REFERENCE)return".rf.md";return".md"}function pI($,Q){let Z=new Set;for(let X of $){let Y=SG(Q,X);if(!MG(Y))continue;Z.add(X);try{for(let W of uS(Y,{withFileTypes:!0}))if(W.isDirectory()&&!W.name.startsWith("."))Z.add(nZ(X,W.name))}catch{}}return[...Z].sort()}async function cI($,Q,Z){let X=await $({message:"Topic type",options:[{value:"skill",label:"Skill",hint:"How-to guide or standards doc (.md)"},{value:"team-member",label:"Team member",hint:"Delegated AI role (.tm.md)"},{value:"workflow",label:"Workflow",hint:"User-invoked AI workflow (.wf.md)"},{value:"lifecycle",label:"Lifecycle",hint:"AI lifecycle automation (.lc.md)"},{value:"reference",label:"Reference",hint:"Supporting detail for a skill (.rf.md)"}]});if(Q(X))return Z("Cancelled"),null;return X}async function nI($,Q,Z){let X=await $({message:"Name (kebab-case identifier)",placeholder:"my-topic",validate(Y){let W=kJ(Y??uI);if(!W)return"Name cannot be empty";if(W.startsWith("sumr-"))return'The "sumr-" prefix is reserved for SUMR core resources';return}});if(Q(X))return Z("Cancelled"),null;return kJ(X)}async function rI($,Q,Z){let X=await $({message:"Title (human-readable)",placeholder:"My Topic",validate(Y){if(!Y.trim())return"Title cannot be empty";return}});if(Q(X))return Z("Cancelled"),null;return X.trim()}async function iI($,Q,Z){let X=await $({message:"Description (what + when)",placeholder:"Covers X, Y, and Z. Use when doing X.",validate(Y){if(!Y.trim())return"Description cannot be empty";return}});if(Q(X))return Z("Cancelled"),null;return X.trim()}async function oI($,Q,Z,X,Y,W){if(typeof Z==="string")return Z;let J=pI($,Q).map((_)=>({value:_,label:_})),G=await X({message:"Destination folder",options:J.length>0?J:[{value:$[0]??"docs",label:$[0]??"docs"}]});if(Y(G))return W("Cancelled"),null;return G}async function aI($){let{extras:Q}=$.args,Z=process.cwd(),{intro:X,outro:Y,select:W,text:U,isCancel:J}=await import("@clack/prompts");X("Playbook \u2014 scaffold new doc");let G=_8(Z)?H8(Z).playbook.sources:["docs"],_=await cI(W,J,Y);if(!_)return 0;let H=await nI(U,J,Y);if(!H)return 0;let V=await rI(U,J,Y);if(!V)return 0;let q=await iI(U,J,Y);if(!q)return 0;let K=await oI(G,Z,Q.source,W,J,Y);if(!K)return 0;let B=lI(_),L=`${H}${B}`,O=SG(Z,K),S=nZ(O,L);if(MG(S))return await W2("File already exists",`${S}
586
637
 
587
- Choose a different name or folder.`),1;try{RT(B,{recursive:!0}),NT(F,wE(z,_,V,H),"utf8")}catch(C){return await g0("Could not write file",C instanceof Error?C.message:String(C)),1}return U(`Created ${cQ(O,q)} \uD83C\uDF89`),0}function rE($){return Y7.includes($)}function oE($){return G7.includes($)}function g$($,Q){let Z=Q.includes("```")?"````":"```";return[`${Z}${$}`,Q,Z].join(`
588
- `)}function dW($){let Q=["## Frontmatter Fields","","| Field | Required | Applies To | Rule |","|---|---:|---|---|"];for(let Z of $.fieldRules)Q.push(`| \`${Z.name}\` | ${Z.required?"yes":"no"} | ${Z.appliesTo} | ${Z.description} |`);return[Q.join(`
589
- `),"",aE()].join(`
590
- `)}function aE(){return["## Native Channel Props","","Use top-level channel blocks for AI-tool-specific features. Add a short comment above every block so the YAML is easy to scan. These comments are authoring guidance only; Playbook does not parse or require them.","",g$("yaml",`---
638
+ Choose a different name or folder.`),1;try{hS(O,{recursive:!0}),dS(S,mI(_,H,V,q),"utf8")}catch(M){return await W2("Could not write file",M instanceof Error?M.message:String(M)),1}return Y(`Created ${nZ(K,L)} \uD83C\uDF89`),0}function UR($){return U7.includes($)}function JR($){return J7.includes($)}function c$($,Q){let Z=Q.includes("```")?"````":"```";return[`${Z}${$}`,Q,Z].join(`
639
+ `)}function NG($){let Q=["## Frontmatter Fields","","| Field | Required | Applies To | Rule |","|---|---:|---|---|"];for(let Z of $.fieldRules)Q.push(`| \`${Z.name}\` | ${Z.required?"yes":"no"} | ${Z.appliesTo} | ${Z.description} |`);return[Q.join(`
640
+ `),"",GR()].join(`
641
+ `)}function GR(){return["## Native Channel Props","","Use top-level channel blocks for AI-tool-specific features. Add a short comment above every block so the YAML is easy to scan. These comments are authoring guidance only; Playbook does not parse or require them.","",c$("yaml",`---
591
642
  category: team-member
592
643
  name: codebase-reviewer
593
644
  title: Codebase Reviewer
594
645
  description: "Reviews code for correctness, security, behavior regressions, and missing tests."
595
646
  modelTier: reasoning
647
+ nicknames: [Atlas, Delta, Echo]
596
648
 
597
649
  # Codex CLI agent profile options
598
650
  codex:
@@ -621,10 +673,10 @@ gemini:
621
673
  opencode:
622
674
  mode: subagent
623
675
  ---`),"","Prefer `codex:`, `claude:`, `cursor:`, `copilot:`, `gemini:`, and `opencode:` for new docs. `channels:` remains supported as a legacy-compatible alias.","","## Team-Member Role Archetypes","","- `orchestrator`: coordinates mission state and handoffs.","- `product-owner`: clarifies problem, scope, and acceptance criteria.","- `researcher`: explores code/docs and reports evidence.","- `planner`: turns validated intent into an implementation plan.","- `implementer`: edits code according to an approved plan.","- `reviewer`: checks correctness, risks, and test gaps.","- `validator`: runs verification and records outcome.","","These archetypes are naming and authoring guidance, not a required `roleType` field."].join(`
624
- `)}function sE($){let Q=["## Categories","","| Value | Purpose | Required fields |","|---|---|---|"];for(let Z of $.categories)Q.push(`| \`${Z.value}\` | ${Z.purpose} | ${Z.requiredFields.map((X)=>`\`${X}\``).join(", ")} |`);return Q.join(`
625
- `)}function mW($){return["## Folder Structure","","Use one folder per topic/domain. References live beside the main doc. When splitting an existing file, choose the owning context folder before creating files.","","```text",$.folderStructure.pattern,"```","",`- ${$.folderStructure.mainDoc}`,`- ${$.folderStructure.references}`,"","Microconcept split example:","","```text",$.folderStructure.microconceptPattern,"```","","Context rules:",...$.folderStructure.contextRules.map((Q)=>`- ${Q}`),"","Split flow:",...$.folderStructure.splitFlow.map((Q,Z)=>`${Z+1}. ${Q}`),"","Do not:",...$.folderStructure.forbidden.map((Q)=>`- ${Q}`)].join(`
626
- `)}function lW($){return["## Extraction Markers","","Use extraction markers for dedicated examples, samples, templates, and long reusable blocks.","",g$("markdown",$.extraction.markerSyntax),"",$.extraction.generatedFile,"","Mandatory default: dedicated `## Examples` sections must be wrapped unless the snippet is truly inline and central to the instruction flow. Marker examples inside fenced code blocks are documentation and must not be extracted.","","Use extraction for:",...$.extraction.whenToUse.map((Q)=>`- ${Q}`),"","Keep inline:",...$.extraction.keepInline.map((Q)=>`- ${Q}`)].join(`
627
- `)}function pW($){return["## Flow Documentation","",$.sections.flows,"","Use a one-line arrow flow when the process is mostly linear:","",g$("text","\uD83D\uDD50 intake -> [researcher] -> \uD83D\uDCDD draft -> \u23F8 HUMAN APPROVES -> \u2705 ready -> [implementer] -> review -> done"),"","Use Mermaid when the process branches, loops, or has failure paths:","",g$("mermaid",`flowchart LR
676
+ `)}function _R($){let Q=["## Categories","","| Value | Purpose | Required fields |","|---|---|---|"];for(let Z of $.categories)Q.push(`| \`${Z.value}\` | ${Z.purpose} | ${Z.requiredFields.map((X)=>`\`${X}\``).join(", ")} |`);return Q.join(`
677
+ `)}function wG($){return["## Folder Structure","","Use one folder per topic/domain. References live beside the main doc. When splitting an existing file, choose the owning context folder before creating files.","","```text",$.folderStructure.pattern,"```","",`- ${$.folderStructure.mainDoc}`,`- ${$.folderStructure.references}`,"","Microconcept split example:","","```text",$.folderStructure.microconceptPattern,"```","","Context rules:",...$.folderStructure.contextRules.map((Q)=>`- ${Q}`),"","Split flow:",...$.folderStructure.splitFlow.map((Q,Z)=>`${Z+1}. ${Q}`),"","Do not:",...$.folderStructure.forbidden.map((Q)=>`- ${Q}`)].join(`
678
+ `)}function bG($){return["## Extraction Markers","","Use extraction markers for dedicated examples, samples, templates, and long reusable blocks.","",c$("markdown",$.extraction.markerSyntax),"",$.extraction.generatedFile,"","Mandatory default: dedicated `## Examples` sections must be wrapped unless the snippet is truly inline and central to the instruction flow. Marker examples inside fenced code blocks are documentation and must not be extracted.","","Use extraction for:",...$.extraction.whenToUse.map((Q)=>`- ${Q}`),"","Keep inline:",...$.extraction.keepInline.map((Q)=>`- ${Q}`)].join(`
679
+ `)}function kG($){return["## Flow Documentation","",$.sections.flows,"","Use a one-line arrow flow when the process is mostly linear:","",c$("text","\uD83D\uDD50 intake -> [researcher] -> \uD83D\uDCDD draft -> \u23F8 HUMAN APPROVES -> \u2705 ready -> [implementer] -> review -> done"),"","Use Mermaid when the process branches, loops, or has failure paths:","",c$("mermaid",`flowchart LR
628
680
  intake["intake"] --> research["researcher"]
629
681
  research --> draft["draft plan"]
630
682
  draft --> approval{"Human approves?"}
@@ -633,7 +685,7 @@ opencode:
633
685
  ready --> implement["implementer"]
634
686
  implement --> review["review"]
635
687
  review --> done["done"]`),"","Rules:","- Keep state names short and concrete.","- Use `[role-or-agent]` for the actor responsible for a transition.","- Label human decision gates explicitly, for example `\u23F8 HUMAN APPROVES`.","- Keep emojis optional and functional; use them for state scanning, not decoration.","- Add transition rules below the diagram when an AI must know what is forbidden."].join(`
636
- `)}function cW($){return["## AI Resources For Channel Output","",$.sections.codex,"","Canonical docs can live in the same domain folders as the rest of the Playbook:","","```text",`docs/
688
+ `)}function PG($){return["## AI Resources For Channel Output","",$.sections.codex,"","Canonical docs can live in the same domain folders as the rest of the Playbook:","","```text",`docs/
637
689
  -- team-members/
638
690
  |-- reviewer.tm.md
639
691
  -- docs-researcher.tm.md
@@ -641,7 +693,7 @@ opencode:
641
693
  -- ui-review.wf.md
642
694
  -- lifecycle/
643
695
  |-- pre-tool-use-policy.lc.md
644
- -- session-start-context.lc.md`,"```","","The Codex renderer updates .codex/config.toml automatically when lifecycle or team-member docs exist, writes a generated .codex/AGENTS.md startup guide for agent routing, and preserves unrelated settings. Claude renders workflow docs to .claude/commands. Gemini, OpenCode, and Copilot render team-member docs to their native agent profile folders.","",'When a user says "hook", "hooks", "run this when the AI stops", "after tool use", "before shell execution", "quality gate", or asks for automatic AI-tool behavior, start from a `category: lifecycle` source doc in `docs/lifecycle/`. Treat `.claude/hooks/*`, `.claude/settings.json` hook entries, `.codex/hooks.json`, and `.codex/hooks/*` as generated AI Channel output.',"","### Lifecycle","",g$("markdown",`---
696
+ -- session-start-context.lc.md`,"```","","The Codex renderer updates .codex/config.toml automatically when lifecycle or team-member docs exist, writes a generated .codex/AGENTS.md startup guide for agent routing, and preserves unrelated settings. Claude renders workflow docs to .claude/commands. Gemini, OpenCode, and Copilot render team-member docs to their native agent profile folders.","",'When a user says "hook", "hooks", "run this when the AI stops", "after tool use", "before shell execution", "quality gate", or asks for automatic AI-tool behavior, start from a `category: lifecycle` source doc in `docs/lifecycle/`. Treat `.claude/hooks/*`, `.claude/settings.json` hook entries, `.codex/hooks.json`, and `.codex/hooks/*` as generated AI Channel output.',"","### Lifecycle","",c$("markdown",`---
645
697
  name: session-start-context
646
698
  title: Session Start Context Lifecycle
647
699
  description: "Adds repository startup context to Codex sessions."
@@ -663,7 +715,7 @@ print(json.dumps({
663
715
  "additionalContext": "Load repository context before non-trivial work."
664
716
  }
665
717
  }))
666
- \`\`\``),"","### Workflow","",g$("markdown",`---
718
+ \`\`\``),"","### Workflow","",c$("markdown",`---
667
719
  name: ui-review
668
720
  title: UI Review Workflow
669
721
  description: "Runs browser UI review and reports pass/fail evidence."
@@ -685,13 +737,14 @@ Run browser UI review for selected user stories.
685
737
  - Discover relevant user story files.
686
738
  - Execute each story with browser automation.
687
739
  - Save screenshots under a gitignored run folder.
688
- - Report pass, fail, blocked, and untested steps explicitly.`),"","### Team Member","",g$("markdown",`---
740
+ - Report pass, fail, blocked, and untested steps explicitly.`),"","### Team Member","",c$("markdown",`---
689
741
  name: reviewer
690
742
  title: Reviewer Team Member
691
743
  description: "Read-only reviewer focused on correctness, security, and missing tests."
692
744
  category: team-member
693
745
  target: reviewer
694
746
  modelTier: reasoning
747
+ nicknames: [Atlas, Delta, Echo]
695
748
 
696
749
  # Codex CLI agent profile options
697
750
  codex:
@@ -716,12 +769,12 @@ opencode:
716
769
  Review code like an owner.
717
770
  Prioritize correctness, security, behavior regressions, and missing test coverage.
718
771
  Return findings first with file and line references.`),"","Rules:","- Keep canonical source docs in domain-oriented folders, not in generated output folders.","- Use lifecycle docs as the source of truth for hooks and automatic AI-session guardrails.","- The Codex renderer writes hook commands rooted through git rev-parse --show-toplevel.","- Do not hand-edit generated .codex/hooks.json, .codex/hooks/*, .codex/agents/*.toml, .gemini/agents/*.md, .opencode/agents/*.md, or .github/agents/*.md."].join(`
719
- `)}function nW($){return["## Checklist","",...$.checklist.map((Q)=>`- [ ] ${Q}`)].join(`
720
- `)}function iJ($,Q){if(Q)return[`## Example: ${Q}`,"",g$("markdown",$.examples[Q])].join(`
721
- `);return["## Examples","","### overview.md","",g$("markdown",$.examples.overview),"","### Reference File","",g$("markdown",$.examples.reference),"","### Folder","",g$("text",$.examples.folder)].join(`
722
- `)}function fQ($,Q){if(Q===x$.OVERVIEW)return["# SUMR Playbook Authoring","",$.sections.overview,"","## Source of Truth","",`- Local mode: ${$.sourceOfTruth.localMode}`,`- Cloud mode: ${$.sourceOfTruth.cloudMode}`,`- Generated output: ${$.sourceOfTruth.generatedOutput}`].join(`
723
- `);if(Q===x$.FRONTMATTER)return[dW($),"",sE($)].join(`
724
- `);if(Q===x$.STRUCTURE)return mW($);if(Q===x$.REFERENCES)return["## References","",$.sections.references,"","Reference file frontmatter:","","```yaml",`---
772
+ `)}function fG($){return["## Checklist","",...$.checklist.map((Q)=>`- [ ] ${Q}`)].join(`
773
+ `)}function fJ($,Q){if(Q)return[`## Example: ${Q}`,"",c$("markdown",$.examples[Q])].join(`
774
+ `);return["## Examples","","### overview.md","",c$("markdown",$.examples.overview),"","### Reference File","",c$("markdown",$.examples.reference),"","### Folder","",c$("text",$.examples.folder)].join(`
775
+ `)}function xZ($,Q){if(Q===p$.OVERVIEW)return["# SUMR Playbook Authoring","",$.sections.overview,"","## Source of Truth","",`- Local mode: ${$.sourceOfTruth.localMode}`,`- Cloud mode: ${$.sourceOfTruth.cloudMode}`,`- Generated output: ${$.sourceOfTruth.generatedOutput}`].join(`
776
+ `);if(Q===p$.FRONTMATTER)return[NG($),"",_R($)].join(`
777
+ `);if(Q===p$.STRUCTURE)return wG($);if(Q===p$.REFERENCES)return["## References","",$.sections.references,"","Reference file frontmatter:","","```yaml",`---
725
778
  category: reference
726
779
  name: my-topic-detail
727
780
  title: Detail Section Title
@@ -730,62 +783,62 @@ label: Detail
730
783
  when: Doing X, reviewing Y, adding Z
731
784
  order: 10
732
785
  ---`,"```","","Rules:","- References live in the same folder as the main doc.","- Do not create a references/ folder.","- Do not add a references frontmatter field."].join(`
733
- `);if(Q===x$.EXTRACTION)return lW($);if(Q===x$.FLOWS)return pW($);if(Q===x$.CODEX)return cW($);if(Q===x$.MODULE_RESOURCES)return["## Module AI Resources","",$.sections.moduleResources].join(`
734
- `);return nW($)}function iW($={}){let Q=uW;if($.example)return iJ(Q,$.example);if($.section)return fQ(Q,$.section);return[fQ(Q,x$.OVERVIEW),"",dW(Q),"",mW(Q),"",lW(Q),"",pW(Q),"",cW(Q),"",fQ(Q,x$.MODULE_RESOURCES),"",iJ(Q),"",nW(Q)].join(`
735
- `)}function tE($={}){return{contract:uW,selection:$,markdown:iW($)}}function V1($,Q,Z,X,U){return{version:1,ok:Q,command:$,data:Z,warnings:X,error:U}}function y2($){eE.write($)}function H1($){y2(`${JSON.stringify($,null,2)}
736
- `)}function ZC($){return $.args.positionals.find((Q)=>Q!==$C)}function XC($){let{extras:Q}=$.args,Z=ZC($),X=typeof Q.example==="string"?Q.example:void 0,U=typeof Q.section==="string"?Q.section:X?void 0:Z,J,W;if(U!==void 0){if(!rE(U))return{selection:{},error:{code:"INVALID_SECTION",message:`Unknown authoring section "${U}". Valid sections: ${Y7.join(", ")}`}};J=U}if(X!==void 0){if(!oE(X))return{selection:{},error:{code:"INVALID_EXAMPLE",message:`Unknown authoring example "${X}". Valid examples: ${G7.join(", ")}`}};W=X}if(J&&W)return{selection:{},error:{code:"CONFLICTING_SELECTION",message:"Choose either --section or --example, not both."}};return{selection:{section:J,example:W},error:null}}async function UC($){let Q=$.args.extras.json===!0,{selection:Z,error:X}=XC($);if(X){if(Q)H1(V1("playbook authoring",!1,null,[],X));else await g0("Invalid Playbook authoring request",X.message);return 1}if(Q)return H1(V1("playbook authoring",!0,tE(Z),[],null)),0;return y2(`${iW(Z)}
737
- `),0}function w8($){return S$.find((Q)=>Q.id===$)}function J0($,Q){let Z=$;for(let[X,U]of Object.entries(KC)){let J=Q[X];if(J!==void 0)Z=Z.replaceAll(U,J)}return Z}function rW($){return qC[$]??"Team member"}function B8($,Q){return J0($,{TEAM_MEMBER:rW(Q)})}function tW($){return $.source!==H$.LOCAL}function u$($){if(!tW($))return $.name;if($.name.startsWith(vQ))return $.name;if($.module)return`${vQ}${$.module}${aW}${$.name}`;return`${vQ}${$.name}`}function G0($){return u$($).replace(aW,"-")}function BC($){return tW($)?"core":"local"}function V7($){let Q={"created-by":sW,"content-source":BC($),"canonical-name":u$($)};if($.module)Q.module=$.module;if($.insight?.length)Q.insight=$.insight;if($.teamMembers?.length)Q["team-member"]=$.teamMembers.map((Z)=>u$({name:Z,source:$.source,module:$.module}));if($.review===!0)Q.review=!0;return Q}function eW($,Q){if(!$)throw Error(`Channel definition for "${Q}" not found`);return $}function h$($,Q){if(!Q)YC($,{recursive:!0})}function $$($,Q,Z){if(Z)return;let X=`${$}.sumr-tmp-${Date.now()}`;try{h$(OC($),!1),HC(X,Q,"utf8"),_C(X,$)}finally{if(z7(X))try{iQ(X,{force:!0})}catch{}}}function LC($,Q,Z,X,U){let J=_7($,Q),W;try{W=VC(J)}catch{return}if(!Z.test(Q)&&!AC(J,W.isDirectory()))return;if(U.push(J),X)return;try{if(W.isDirectory())iQ(J,{recursive:!0,force:!0});else iQ(J,{force:!0})}catch{}}function f2($,Q,Z,X){if(!z7($))return[];let U;try{U=GC($)}catch{return[]}let J=[];for(let W of U){if(Q.has(W))continue;LC($,W,Z,X,J)}return J}function AC($,Q){let Z=Q?_7($,"SKILL.md"):$;if(!z7(Z))return!1;try{let X=zC(Z,"utf8");return MC(X)}catch{return!1}}function MC($){let Q=$.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];if(!Q)return!1;return new RegExp(`^\\s{2}created-by:\\s*${k8(sW)}\\s*$`,"m").test(Q)}function k8($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function $Y($,Q,Z){if(!$.teamMembers?.length)return Q;let X=$.teamMembers.map((V)=>`\`${u$({name:V,source:$.source,module:$.module})}\``),U=X.length===1?X[0]:`${X.slice(0,-1).join(", ")} and ${X.at(-1)}`,J=jC(rW(Z)),W=["","","## Agent Delegation","",`This workflow is a delegation trigger for ${U} when the current runtime exposes delegation tools.`,`For user prompts that match this workflow, treat the request as authorization to use the listed generated ${J}; do not require a longer prompt.`,"If delegation is unavailable, state the reason explicitly and apply the same role checklists locally.",""].join(`
738
- `),Y=Q.match(/## When to Use\b/i);if(!Y||Y.index===void 0)return`${Q.trimEnd()}${W}`;let G=Y.index+Y[0].length,z=Q.indexOf(`
739
- ## `,G),_=z===-1?Q.length:z;return`${Q.slice(0,_).trimEnd()}${W}${Q.slice(_)}`}function jC($){if($==="Team member")return"team members";return`${$.toLowerCase()}s`}function l0($,Q){return{...$,description:B8($.description,Q),when:$.when?B8($.when,Q):$.when,body:B8($.body,Q),channels:TC($.channels,Q),references:$.references.map((Z)=>l0(Z,Q))}}function TC($,Q){if(!$)return $;return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,Z===Q?rQ(X,Q):X]))}function rQ($,Q){if(typeof $==="string")return B8($,Q);if(Array.isArray($))return $.map((Z)=>rQ(Z,Q));if(typeof $==="object"&&$!==null)return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,rQ(X,Q)]));return $}function EC($,Q,Z){if(Z.length===0){$.push(`${Q}: []`);return}$.push(`${Q}:`);for(let X of Z)$.push(` - ${T8(X)}`)}function CC($,Q,Z){$.push(`${Q}:`);for(let[X,U]of Object.entries(Z))if(Array.isArray(U)){$.push(` ${X}:`);for(let J of U)$.push(` - ${T8(J)}`)}else $.push(` ${X}: ${T8(U)}`)}function P8($){let Q=["---"];for(let[Z,X]of Object.entries($))if(typeof X==="boolean")Q.push(`${Z}: ${X}`);else if(Array.isArray(X))EC(Q,Z,X);else if(typeof X==="object")CC(Q,Z,X);else Q.push(`${Z}: ${T8(X)}`);return Q.push("---"),Q.join(`
740
- `)}function T8($){if(typeof $==="boolean"||typeof $==="number")return String($);return/[:#{}[\],&*?|<>=!%@`]/.test($)||$.trim()!==$?`"${$.replace(/"/g,"\\\"")}"`:$}function QY($,Q={}){let Z=RC($),X=[],U=$;for(let W of $.matchAll(SC)){if(W.index===void 0||DC(W.index,Z))continue;let[,Y,G]=W;if(!Y||G===void 0)continue;X.push({name:Y,content:G.trim()}),U=U.replace(W[0],"")}let J=NC(X);if(U=U.trim(),Q.addResourceLinks&&J.length>0)U=`${U}
786
+ `);if(Q===p$.EXTRACTION)return bG($);if(Q===p$.FLOWS)return kG($);if(Q===p$.CODEX)return PG($);if(Q===p$.MODULE_RESOURCES)return["## Module AI Resources","",$.sections.moduleResources].join(`
787
+ `);return fG($)}function yG($={}){let Q=DG;if($.example)return fJ(Q,$.example);if($.section)return xZ(Q,$.section);return[xZ(Q,p$.OVERVIEW),"",NG(Q),"",wG(Q),"",bG(Q),"",kG(Q),"",PG(Q),"",xZ(Q,p$.MODULE_RESOURCES),"",fJ(Q),"",fG(Q)].join(`
788
+ `)}function HR($={}){return{contract:DG,selection:$,markdown:yG($)}}function I1($,Q,Z,X,Y){return{version:1,ok:Q,command:$,data:Z,warnings:X,error:Y}}function Y8($){VR.write($)}function R1($){Y8(`${JSON.stringify($,null,2)}
789
+ `)}function BR($){return $.args.positionals.find((Q)=>Q!==qR)}function AR($){let{extras:Q}=$.args,Z=BR($),X=typeof Q.example==="string"?Q.example:void 0,Y=typeof Q.section==="string"?Q.section:X?void 0:Z,W,U;if(Y!==void 0){if(!UR(Y))return{selection:{},error:{code:"INVALID_SECTION",message:`Unknown authoring section "${Y}". Valid sections: ${U7.join(", ")}`}};W=Y}if(X!==void 0){if(!JR(X))return{selection:{},error:{code:"INVALID_EXAMPLE",message:`Unknown authoring example "${X}". Valid examples: ${J7.join(", ")}`}};U=X}if(W&&U)return{selection:{},error:{code:"CONFLICTING_SELECTION",message:"Choose either --section or --example, not both."}};return{selection:{section:W,example:U},error:null}}async function LR($){let Q=$.args.extras.json===!0,{selection:Z,error:X}=AR($);if(X){if(Q)R1(I1("playbook authoring",!1,null,[],X));else await W2("Invalid Playbook authoring request",X.message);return 1}if(Q)return R1(I1("playbook authoring",!0,HR(Z),[],null)),0;return Y8(`${yG(Z)}
790
+ `),0}function A6($){return D$.find((Q)=>Q.id===$)}function M0($,Q){let Z=$;for(let[X,Y]of Object.entries(IR)){let W=Q[X];if(W!==void 0)Z=Z.replaceAll(Y,W)}return Z}function xG($){return RR[$]??"Team member"}function Q6($,Q){return M0($,{TEAM_MEMBER:xG(Q)})}function uG($){return $.source!==H$.LOCAL}function _1($){if(!uG($))return $.name;if($.name.startsWith(vZ))return $.name;if($.module)return`${vZ}${$.module}${gG}${$.name}`;return`${vZ}${$.name}`}function N1($){return _1($).replace(gG,"-")}function DR($){return uG($)?"core":"local"}function H7($){let Q={"created-by":hG,"content-source":DR($),"canonical-name":_1($)};if($.module)Q.module=$.module;if($.insight?.length)Q.insight=$.insight;if($.teamMembers?.length)Q["team-member"]=$.teamMembers.map((Z)=>_1({name:Z,source:$.source,module:$.module}));if($.review===!0)Q.review=!0;return Q}function dG($,Q){if(!$)throw Error(`Channel definition for "${Q}" not found`);return $}function n$($,Q){if(!Q)jR($,{recursive:!0})}function $$($,Q,Z){if(Z)return;let X=`${$}.sumr-tmp-${Date.now()}`;try{n$(SR($),!1),MR(X,Q,"utf8"),CR(X,$)}finally{if(G7(X))try{iZ(X,{force:!0})}catch{}}}function NR($,Q,Z,X,Y){let W=_7($,Q),U;try{U=FR(W)}catch{return}if(!Z.test(Q)&&!wR(W,U.isDirectory()))return;if(Y.push(W),X)return;try{if(U.isDirectory())iZ(W,{recursive:!0,force:!0});else iZ(W,{force:!0})}catch{}}function W8($,Q,Z,X){if(!G7($))return[];let Y;try{Y=TR($)}catch{return[]}let W=[];for(let U of Y){if(Q.has(U))continue;NR($,U,Z,X,W)}return W}function wR($,Q){let Z=Q?_7($,"SKILL.md"):$;if(!G7(Z))return!1;try{let X=ER(Z,"utf8");return bR(X)}catch{return!1}}function bR($){let Q=$.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];if(!Q)return!1;return new RegExp(`^\\s{2}created-by:\\s*${L6(hG)}\\s*$`,"m").test(Q)}function L6($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function mG($,Q,Z){if(!$.teamMembers?.length)return Q;let X=$.teamMembers.map((V)=>`\`${_1({name:V,source:$.source,module:$.module})}\``),Y=X.length===1?X[0]:`${X.slice(0,-1).join(", ")} and ${X.at(-1)}`,W=kR(xG(Z)),U=["","","## Agent Delegation","",`This workflow is a delegation trigger for ${Y} when the current runtime exposes delegation tools.`,`For user prompts that match this workflow, treat the request as authorization to use the listed generated ${W}; do not require a longer prompt.`,"If delegation is unavailable, state the reason explicitly and apply the same role checklists locally.",""].join(`
791
+ `),J=Q.match(/## When to Use\b/i);if(!J||J.index===void 0)return`${Q.trimEnd()}${U}`;let G=J.index+J[0].length,_=Q.indexOf(`
792
+ ## `,G),H=_===-1?Q.length:_;return`${Q.slice(0,H).trimEnd()}${U}${Q.slice(H)}`}function kR($){if($==="Team member")return"team members";return`${$.toLowerCase()}s`}function V2($,Q){return{...$,description:Q6($.description,Q),when:$.when?Q6($.when,Q):$.when,body:Q6($.body,Q),channels:PR($.channels,Q),references:$.references.map((Z)=>V2(Z,Q))}}function PR($,Q){if(!$)return $;return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,Z===Q?oZ(X,Q):X]))}function oZ($,Q){if(typeof $==="string")return Q6($,Q);if(Array.isArray($))return $.map((Z)=>oZ(Z,Q));if(typeof $==="object"&&$!==null)return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,oZ(X,Q)]));return $}function fR($,Q,Z){if(Z.length===0){$.push(`${Q}: []`);return}$.push(`${Q}:`);for(let X of Z)$.push(` - ${U6(X)}`)}function yR($,Q,Z){$.push(`${Q}:`);for(let[X,Y]of Object.entries(Z))if(Array.isArray(Y)){$.push(` ${X}:`);for(let W of Y)$.push(` - ${U6(W)}`)}else $.push(` ${X}: ${U6(Y)}`)}function O6($){let Q=["---"];for(let[Z,X]of Object.entries($))if(typeof X==="boolean")Q.push(`${Z}: ${X}`);else if(Array.isArray(X))fR(Q,Z,X);else if(typeof X==="object")yR(Q,Z,X);else Q.push(`${Z}: ${U6(X)}`);return Q.push("---"),Q.join(`
793
+ `)}function U6($){if(typeof $==="boolean"||typeof $==="number")return String($);return/[:#{}[\],&*?|<>=!%@`]/.test($)||$.trim()!==$?`"${$.replace(/"/g,"\\\"")}"`:$}function V7($,Q={}){let Z=hR($),X=[],Y=$;for(let U of $.matchAll(xR)){if(U.index===void 0||uR(U.index,Z))continue;let[,J,G]=U;if(!J||G===void 0)continue;X.push({name:J,content:G.trim()}),Y=Y.replace(U[0],"")}let W=dR(X);if(Y=Y.trim(),Q.addResourceLinks&&W.length>0)Y=`${Y}
741
794
 
742
- ${wC(J)}`.trim();return{mainContent:U,sections:J}}function RC($){return Array.from($.matchAll(FC),(Q)=>({start:Q.index??0,end:(Q.index??0)+Q[0].length}))}function DC($,Q){return Q.some((Z)=>$>=Z.start&&$<Z.end)}function NC($){let Q=new Map;for(let Z of $){let X=Q.get(Z.name);if(X)X.push(Z.content);else Q.set(Z.name,[Z.content])}return Array.from(Q.entries(),([Z,X])=>({name:Z,content:X.join(`
795
+ ${mR(W)}`.trim();return{mainContent:Y,sections:W}}function hR($){return Array.from($.matchAll(vR),(Q)=>({start:Q.index??0,end:(Q.index??0)+Q[0].length}))}function uR($,Q){return Q.some((Z)=>$>=Z.start&&$<Z.end)}function dR($){let Q=new Map;for(let Z of $){let X=Q.get(Z.name);if(X)X.push(Z.content);else Q.set(Z.name,[Z.content])}return Array.from(Q.entries(),([Z,X])=>({name:Z,content:X.join(`
743
796
 
744
797
  ---
745
798
 
746
- `)}))}function wC($){return`## Additional resources
799
+ `)}))}function mR($){return`## Additional resources
747
800
 
748
- ${$.map((Z)=>{let X=`${Z.name}.md`;return`- For ${kC(Z.name)}, see [${X}](${X})`}).join(`
749
- `)}`}function kC($){return $.replace(/[-_]+/g," ").toLowerCase()}function PC($,Q,Z){return f2(_7(process.cwd(),$),new Set,Q,Z)}function bC($){return[$.outputDir,...yC($)]}function yC($){return $.legacyOutputDirs??IC}function H7($,Q){let Z=[];for(let X of $)for(let U of bC(X))Z.push(...PC(U,X.filePattern,Q));return Z}function ZY($){if($.length===0)return"";let Q=["","","## References","","| Topic | When |","|-------|------|"];for(let Z of $){let X=Z.label??Z.title,U=Z.when??Z.description;Q.push(`| **${X}** | ${U} |`)}return Q.join(`
750
- `)}async function vC($){let{extras:Q}=$.args,Z=Q.json===!0,X=typeof Q.channel==="string"?Q.channel:void 0;if(X!==void 0&&!e$.includes(X)){let _=`Unknown channel: "${X}". Valid channels: ${e$.join(", ")}`;if(Z)H1(V1("playbook clean",!1,null,[],{code:"INVALID_CHANNEL",message:_}));else await g0("Invalid Playbook channel",[`Requested: ${X}`,"",`Valid channels: ${e$.join(", ")}`].join(`
751
- `));return 1}let U=X?S$.filter((_)=>_.id===X):S$,J=H7(U,Q["dry-run"]===!0),W={channelsCleaned:U.map((_)=>_.id),filesRemoved:J};if(Z)return H1(V1("playbook clean",!0,W,[],null)),0;let Y=Q["dry-run"]===!0?" (dry run)":"",G=U.length===1?"":"s",z=J.length===1?"":"s";return WC.success(`Cleaned ${U.length} channel${G}${Y}: ${J.length} file${z} removed \uD83C\uDF89`),0}function gC($,Q,Z){return[...$.map((X)=>({value:X.key,label:X.label,hint:X.hint()})),{value:E8.SAVE,label:Q?"Save & exit *":"Save & exit",hint:Z?"creates config":"updates config"},{value:E8.DISCARD,label:"Exit without saving",hint:Q?"changes will be lost":""}]}async function hC($,Q,Z,X,U,J,W,Y){let{outro:G,log:z,isCancel:_}=W;if(_($))return G("Cancelled \u2014 no changes saved."),0;if($===E8.DISCARD){if(J.value)z.warn("Changes discarded.",Y("warn"));return G("Exited without saving."),0}if($===E8.SAVE){let H=X(Z);return z.success(H,Y("success")),G(`${U??"Done."} \uD83C\uDF89`),0}let V=Q.find((H)=>H.key===$);if(V){if(await V.run()!==!1)J.value=!0}return}async function uC($){let{title:Q,items:Z,onSave:X,isNew:U,outroAfterSave:J}=$,W=await import("@clack/prompts"),{brandLogOptions:Y}=await Promise.resolve().then(() => (N(),a0)),{intro:G,select:z,log:_}=W;if(G(Q),!U)_.info("Editing existing config \u2014 choose what to change.",Y("info"));let V={value:!1};for(;;){let H=gC(Z,V.value,U),O=await z({message:"What do you want to configure?",options:H}),K=await hC(O,Z,U,X,J,V,W,Y);if(K!==void 0)return K}}function mC($){let Q=Object.entries($).filter(([,Z])=>Z).map(([Z])=>Z);return Q.length===0?"none":Q.join(", ")}function rJ($){return $.length===0?"none":$.join(", ")}async function lC($){let Q=process.cwd(),Z=!h2(Q),X;try{X=Z?j8():u2(Q)}catch{X=j8()}let{multiselect:U,text:J,isCancel:W}=await import("@clack/prompts");return uC({title:"Playbook config",isNew:Z,items:[{key:"channels",label:"AI channels",hint:()=>mC(X.playbook.channels),run:async()=>{let Y=M8(X).filter((_)=>e$.includes(_)),G=await U({message:"Select AI assistants to enable in this repo:",options:S$.map((_)=>({value:_.id,label:_.displayName,hint:_.id})),initialValues:Y});if(W(G))return!1;let z={};for(let _ of e$)z[_]=G.includes(_);X={...X,playbook:{...X.playbook,channels:z}}}},{key:"sources",label:"Source paths",hint:()=>rJ(X.playbook.sources),run:async()=>{let Y=await J({message:"Source paths to scan for Playbook .md files (comma-separated):",placeholder:"docs",initialValue:X.playbook.sources.join(", ")||"docs",validate:(G)=>{if(!G?.trim())return"At least one source path is required."}});if(W(Y))return!1;X={...X,playbook:{...X.playbook,sources:String(Y).split(",").map((G)=>G.trim()).filter(Boolean)}}}}],onSave:()=>{YE(Q,X);let Y=M8(X);return`sumr.yaml ${Z?"created":"updated"} \u2014 ${Y.length} channel${Y.length===1?"":"s"} enabled, sources: ${rJ(X.playbook.sources)}`},outroAfterSave:"Run `sumr playbook sync` to generate AI tool files."})}function ZS($){let Q=$S.exec($);if(!Q)return{meta:{},body:$.trim()};let[,Z="",X=""]=Q;return{meta:HS(Z),body:X.trim()}}function JS($,Q){let Z=[],X=Q;while(X<$.length){let J=O7($,X).trim();if(!J.startsWith("-"))break;Z.push(J.slice(1).trim()),X+=1}return{items:Z,next:X}}function WS($,Q,Z,X,U){let J=VS(Q);if(Z.startsWith("["))return $[J]=JY(Z),U;let{items:W,next:Y}=JS(X,U);return $[J]=W,Y}function UY($,Q){let Z=[],X=Q;while(X<$.length){let U=O7($,X);if(!U.trim()){X+=1;continue}if(!U.match(/^\s+/))break;let J=U.trim();if(J.startsWith("#")){X+=1;continue}let W=J.indexOf(":");if(W===-1){X+=1;continue}Z.push({key:J.slice(0,W).trim(),value:J.slice(W+1).trim(),indent:U.match(/^(\s+)/)?.[1]?.length??0}),X+=1}return{entries:Z,next:X}}function YS($,Q,Z){let{entries:X,next:U}=UY(Q,Z),J="";for(let{key:W,value:Y,indent:G}of X)if(G<=2)J=W,$[J]={};else if(J){let z=$[J];if(z)z[W]=WY(Y)}return U}function GS($,Q,Z,X){let U={};$[Q]=U;let{entries:J,next:W}=UY(Z,X);for(let Y of J)U[Y.key]=WY(Y.value);return W}function zS($,Q,Z){let X=Object.keys(Q).length>0,U=Object.keys(Z).length>0;if(!X&&!U)return;let J={...Q};for(let[W,Y]of Object.entries(Z))J[W]={...OS(J,W),...Y};$.channels=J}function _S($,Q,Z,X,U){let{result:J,legacyChannels:W,nativeChannels:Y}=$;if(XS.has(Q))return WS(J,Q,Z,X,U);if(Q===f0.REVIEW)return J.review=Z===aQ.TRUE,U;if(Q===f0.CHANNELS)return YS(W,X,U);if(eC.has(Q))return GS(Y,Q,X,U);if(Q===f0.ORDER||Q===f0.TIMEOUT){let G=Number(Z);if(!Number.isNaN(G))J[Q]=G;return U}if(US.has(Q))J[Q]=K7(Z);return U}function VS($){if($===f0.TEAM_MEMBER)return y1.TEAM_MEMBERS;return $}function HS($){let Q={result:{},legacyChannels:{},nativeChannels:{}},Z=$.split(/\r?\n/),X=0;while(X<Z.length){let U=O7(Z,X);if(X+=1,!U.trim()||U.trimStart().startsWith("#"))continue;let J=U.indexOf(":");if(J===-1)continue;let W=U.slice(0,J).trim(),Y=U.slice(J+1).trim();X=_S(Q,W,Y,Z,X)}return zS(Q.result,Q.legacyChannels,Q.nativeChannels),Q.result}function JY($){return($.match(/^\[(.*?)\]/)?.[1]??$.replace(/^\[/,"").replace(/\]$/,"")).split(",").map((Z)=>K7(Z.trim())).filter(Boolean)}function O7($,Q){let Z=$[Q];if(Z===void 0)return QS;return Z}function OS($,Q){let Z=$[Q];if(Z===void 0)return{};return Z}function WY($){if($.startsWith("["))return JY($);if($===aQ.TRUE)return!0;if($===aQ.FALSE)return!1;let Q=Number($);if($!==""&&!Number.isNaN(Q))return Q;return K7($)}function K7($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function MS($){if($&&YY.has($))return $;return}function jS($){if($&&GY.has($))return $;return}function TS($){if($&&zY.has($))return $;return}function ES($){if(!$?.length)return;let Q=$.filter((Z)=>_Y.has(Z));return Q.length>0?Q:void 0}function CS($){let Q=[];if($.modelTier&&!YY.has($.modelTier))Q.push({field:"modelTier",value:$.modelTier,allowed:KS});if($.effort&&!GY.has($.effort))Q.push({field:"effort",value:$.effort,allowed:qS});if($.access&&!zY.has($.access))Q.push({field:"access",value:$.access,allowed:BS});for(let Z of $.tools??[])if(!_Y.has(Z))Q.push({field:"tools",value:Z,allowed:LS});return Q}function IS($){for(let[Q,Z]of Object.entries(FS))if($.endsWith(Q))return Z;return}function RS($,Q){let Z=[];for(let X of $){let U=sC(X);if(!cC(U)){Q.push(`Source path not found, skipping: ${W0(U)}`);continue}VY(U,Z,Q)}return Z}function DS($,Q,Z,X,U){return{name:$.name,title:$.title,description:$.description,category:$.category??IS(Z),framework:$.framework,tech:$.tech,guide:$.guide,insight:$.insight,topic:$.topic,teamMembers:$.teamMembers,review:$.review,target:$.target,event:$.event,matcher:$.matcher,statusMessage:$.statusMessage,label:$.label,when:$.when,order:$.order,timeout:$.timeout,modelTier:MS($.modelTier),effort:jS($.effort),access:TS($.access),tools:ES($.tools),invalidAgentFields:CS($),tags:$.tags??AS,channels:$.channels,body:Q,sourcePath:Z,source:X,module:U,references:[]}}function NS($,Q,Z,X){let U=new Map,J=[];for(let W of $){let Y;try{Y=iC(W,"utf8")}catch(O){X.push(`Could not read file, skipping: ${W0(W)} \u2014 ${O instanceof Error?O.message:String(O)}`);continue}let{meta:G,body:z}=ZS(Y);if(!bS(G))continue;let _=G.name,V=Buffer.byteLength(z,"utf8");if(V>SS)X.push(`Topic "${_}" exceeds recommended 64 KB (${Math.round(V/1024)} KB) \u2014 consider splitting it`);let H=U.get(_);if(H)throw Error(`Duplicate topic name "${_}" found:
752
- ${W0(H)}
753
- ${W0(W)}
801
+ ${$.map((Z)=>{let X=`${Z.name}.md`;return`- For ${lR(Z.name)}, see [${X}](${X})`}).join(`
802
+ `)}`}function lR($){return $.replace(/[-_]+/g," ").toLowerCase()}function pR($,Q,Z){return W8(_7(process.cwd(),$),new Set,Q,Z)}function cR($){return[$.outputDir,...nR($)]}function nR($){return $.legacyOutputDirs??gR}function q7($,Q){let Z=[];for(let X of $)for(let Y of cR(X))Z.push(...pR(Y,X.filePattern,Q));return Z}function lG($){if($.length===0)return"";let Q=["","","## References","","| Topic | When |","|-------|------|"];for(let Z of $){let X=Z.label??Z.title,Y=Z.when??Z.description;Q.push(`| **${X}** | ${Y} |`)}return Q.join(`
803
+ `)}async function iR($){let{extras:Q}=$.args,Z=Q.json===!0,X=typeof Q.channel==="string"?Q.channel:void 0;if(X!==void 0&&!G1.includes(X)){let H=`Unknown channel: "${X}". Valid channels: ${G1.join(", ")}`;if(Z)R1(I1("playbook clean",!1,null,[],{code:"INVALID_CHANNEL",message:H}));else await W2("Invalid Playbook channel",[`Requested: ${X}`,"",`Valid channels: ${G1.join(", ")}`].join(`
804
+ `));return 1}let Y=X?D$.filter((H)=>H.id===X):D$,W=q7(Y,Q["dry-run"]===!0),U={channelsCleaned:Y.map((H)=>H.id),filesRemoved:W};if(Z)return R1(I1("playbook clean",!0,U,[],null)),0;let J=Q["dry-run"]===!0?" (dry run)":"",G=Y.length===1?"":"s",_=W.length===1?"":"s";return zR.success(`Cleaned ${Y.length} channel${G}${J}: ${W.length} file${_} removed \uD83C\uDF89`),0}function aR($,Q,Z){return[...$.map((X)=>({value:X.key,label:X.label,hint:X.hint()})),{value:J6.SAVE,label:Q?"Save & exit *":"Save & exit",hint:Z?"creates config":"updates config"},{value:J6.DISCARD,label:"Exit without saving",hint:Q?"changes will be lost":""}]}async function sR($,Q,Z,X,Y,W,U,J){let{outro:G,log:_,isCancel:H}=U;if(H($))return G("Cancelled \u2014 no changes saved."),0;if($===J6.DISCARD){if(W.value)_.warn("Changes discarded.",J("warn"));return G("Exited without saving."),0}if($===J6.SAVE){let q=X(Z);return _.success(q,J("success")),G(`${Y??"Done."} \uD83C\uDF89`),0}let V=Q.find((q)=>q.key===$);if(V){if(await V.run()!==!1)W.value=!0}return}async function tR($){let{title:Q,items:Z,onSave:X,isNew:Y,outroAfterSave:W}=$,U=await import("@clack/prompts"),{brandLogOptions:J}=await Promise.resolve().then(() => (R(),I2)),{intro:G,select:_,log:H}=U;if(G(Q),!Y)H.info("Editing existing config \u2014 choose what to change.",J("info"));let V={value:!1};for(;;){let q=aR(Z,V.value,Y),K=await _({message:"What do you want to configure?",options:q}),B=await sR(K,Z,Y,X,W,V,U,J);if(B!==void 0)return B}}function $D($){let Q=Object.entries($).filter(([,Z])=>Z).map(([Z])=>Z);return Q.length===0?"none":Q.join(", ")}function yJ($){return $.length===0?"none":$.join(", ")}async function QD($){let Q=process.cwd(),Z=!_8(Q),X;try{X=Z?W6():H8(Q)}catch{X=W6()}let{multiselect:Y,text:W,isCancel:U}=await import("@clack/prompts");return tR({title:"Playbook config",isNew:Z,items:[{key:"channels",label:"AI channels",hint:()=>$D(X.playbook.channels),run:async()=>{let J=Y6(X).filter((H)=>G1.includes(H)),G=await Y({message:"Select AI assistants to enable in this repo:",options:D$.map((H)=>({value:H.id,label:H.displayName,hint:H.id})),initialValues:J});if(U(G))return!1;let _={};for(let H of G1)_[H]=G.includes(H);X={...X,playbook:{...X.playbook,channels:_}}}},{key:"sources",label:"Source paths",hint:()=>yJ(X.playbook.sources),run:async()=>{let J=await W({message:"Source paths to scan for Playbook .md files (comma-separated):",placeholder:"docs",initialValue:X.playbook.sources.join(", ")||"docs",validate:(G)=>{if(!G?.trim())return"At least one source path is required."}});if(U(J))return!1;X={...X,playbook:{...X.playbook,sources:String(J).split(",").map((G)=>G.trim()).filter(Boolean)}}}}],onSave:()=>{jI(Q,X);let J=Y6(X);return`sumr.yaml ${Z?"created":"updated"} \u2014 ${J.length} channel${J.length===1?"":"s"} enabled, sources: ${yJ(X.playbook.sources)}`},outroAfterSave:"Run `sumr playbook sync` to generate AI tool files."})}function BD($){let Q=qD.exec($);if(!Q)return{meta:{},body:$.trim()};let[,Z="",X=""]=Q;return{meta:MD(Z),body:X.trim()}}function OD($,Q){let Z=[],X=Q;while(X<$.length){let W=K7($,X).trim();if(!W.startsWith("-"))break;Z.push(W.slice(1).trim()),X+=1}return{items:Z,next:X}}function zD($,Q,Z,X,Y){let W=FD(Q);if(Z.startsWith("["))return $[W]=nG(Z),Y;let{items:U,next:J}=OD(X,Y);return $[W]=U,J}function cG($,Q){let Z=[],X=Q;while(X<$.length){let Y=K7($,X);if(!Y.trim()){X+=1;continue}if(!Y.match(/^\s+/))break;let W=Y.trim();if(W.startsWith("#")){X+=1;continue}let U=W.indexOf(":");if(U===-1){X+=1;continue}Z.push({key:W.slice(0,U).trim(),value:W.slice(U+1).trim(),indent:Y.match(/^(\s+)/)?.[1]?.length??0}),X+=1}return{entries:Z,next:X}}function jD($,Q,Z){let{entries:X,next:Y}=cG(Q,Z),W="";for(let{key:U,value:J,indent:G}of X)if(G<=2)W=U,$[W]={};else if(W){let _=$[W];if(_)_[U]=rG(J)}return Y}function TD($,Q,Z,X){let Y={};$[Q]=Y;let{entries:W,next:U}=cG(Z,X);for(let J of W)Y[J.key]=rG(J.value);return U}function ED($,Q,Z){let X=Object.keys(Q).length>0,Y=Object.keys(Z).length>0;if(!X&&!Y)return;let W={...Q};for(let[U,J]of Object.entries(Z))W[U]={...SD(W,U),...J};$.channels=W}function CD($,Q,Z,X,Y){let{result:W,legacyChannels:U,nativeChannels:J}=$;if(AD.has(Q))return zD(W,Q,Z,X,Y);if(Q===Q2.REVIEW)return W.review=Z===sZ.TRUE,Y;if(Q===Q2.CHANNELS)return jD(U,X,Y);if(VD.has(Q))return TD(J,Q,X,Y);if(Q===Q2.ORDER||Q===Q2.TIMEOUT){let G=Number(Z);if(!Number.isNaN(G))W[Q]=G;return Y}if(LD.has(Q))W[Q]=B7(Z);return Y}function FD($){if($===Q2.TEAM_MEMBER)return F1.TEAM_MEMBERS;return $}function MD($){let Q={result:{},legacyChannels:{},nativeChannels:{}},Z=$.split(/\r?\n/),X=0;while(X<Z.length){let Y=K7(Z,X);if(X+=1,!Y.trim()||Y.trimStart().startsWith("#"))continue;let W=Y.indexOf(":");if(W===-1)continue;let U=Y.slice(0,W).trim(),J=Y.slice(W+1).trim();X=CD(Q,U,J,Z,X)}return ED(Q.result,Q.legacyChannels,Q.nativeChannels),Q.result}function nG($){return($.match(/^\[(.*?)\]/)?.[1]??$.replace(/^\[/,"").replace(/\]$/,"")).split(",").map((Z)=>B7(Z.trim())).filter(Boolean)}function K7($,Q){let Z=$[Q];if(Z===void 0)return KD;return Z}function SD($,Q){let Z=$[Q];if(Z===void 0)return{};return Z}function rG($){if($.startsWith("["))return nG($);if($===sZ.TRUE)return!0;if($===sZ.FALSE)return!1;let Q=Number($);if($!==""&&!Number.isNaN(Q))return Q;return B7($)}function B7($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function bD($){if($&&iG.has($))return $;return}function kD($){if($&&oG.has($))return $;return}function PD($){if($&&aG.has($))return $;return}function fD($){if(!$?.length)return;let Q=$.filter((Z)=>sG.has(Z));return Q.length>0?Q:void 0}function yD($){let Q=[];if($.modelTier&&!iG.has($.modelTier))Q.push({field:"modelTier",value:$.modelTier,allowed:ID});if($.effort&&!oG.has($.effort))Q.push({field:"effort",value:$.effort,allowed:RD});if($.access&&!aG.has($.access))Q.push({field:"access",value:$.access,allowed:DD});for(let Z of $.tools??[])if(!sG.has(Z))Q.push({field:"tools",value:Z,allowed:ND});return Q}function gD($){for(let[Q,Z]of Object.entries(vD))if($.endsWith(Q))return Z;return}function hD($,Q){let Z=[];for(let X of $){let Y=_D(X);if(!XD(Y)){Q.push(`Source path not found, skipping: ${S0(Y)}`);continue}tG(Y,Z,Q)}return Z}function uD($,Q,Z,X,Y){return{name:$.name,title:$.title,description:$.description,category:$.category??gD(Z),framework:$.framework,tech:$.tech,guide:$.guide,insight:$.insight,topic:$.topic,teamMembers:$.teamMembers,review:$.review,target:$.target,event:$.event,matcher:$.matcher,statusMessage:$.statusMessage,label:$.label,when:$.when,order:$.order,timeout:$.timeout,modelTier:bD($.modelTier),effort:kD($.effort),access:PD($.access),tools:fD($.tools),nicknames:$.nicknames,invalidAgentFields:yD($),tags:$.tags??wD,channels:$.channels,body:Q,sourcePath:Z,source:X,module:Y,references:[]}}function dD($,Q,Z,X){let Y=new Map,W=[];for(let U of $){let J;try{J=WD(U,"utf8")}catch(K){X.push(`Could not read file, skipping: ${S0(U)} \u2014 ${K instanceof Error?K.message:String(K)}`);continue}let{meta:G,body:_}=BD(J);if(!cD(G))continue;let H=G.name,V=Buffer.byteLength(_,"utf8");if(V>xD)X.push(`Topic "${H}" exceeds recommended 64 KB (${Math.round(V/1024)} KB) \u2014 consider splitting it`);let q=Y.get(H);if(q)throw Error(`Duplicate topic name "${H}" found:
805
+ ${S0(q)}
806
+ ${S0(U)}
754
807
 
755
- Rename one of them or set a unique "name:" in frontmatter.`);U.set(_,W),J.push(DS(G,z,W,Q,Z))}return J}function wS($){let Q=new Map;for(let Z of $){let X=b8(Z.sourcePath),U=Q.get(X);if(U){U.push(Z);continue}Q.set(X,[Z])}return Q}function kS($,Q){let Z=new Map;for(let X of $){let U=b8(X.sourcePath);if(!Q.has(U))continue;let J=Z.get(U);if(!J)Z.set(U,X.sourcePath);else{let W=oJ(J);if(oJ(X.sourcePath)===sJ&&W!==sJ)Z.set(U,X.sourcePath)}}return Z}function W0($){let Q=aC(process.cwd(),$);return Q&&!Q.startsWith("..")?Q:$}function PS($,Q,Z){for(let[X,U]of $)if(!Q.some((W)=>b8(W.sourcePath)===X))for(let W of U)Z.push(`Orphan reference "${W.name}" in ${W0(X)} \u2014 no main doc found, skipped`)}function h0($,Q={}){let Z=[],X=Q.source??H$.LOCAL,U=RS($,Z),J=NS(U,X,Q.module,Z),W=J.filter((V)=>V.category===aJ),Y=J.filter((V)=>V.category!==aJ),G=wS(W),z=kS(Y,G),_=Y.map((V)=>{let H=b8(V.sourcePath);if(z.get(H)!==V.sourcePath)return V;let O=G.get(H);if(!O||O.length===0)return V;let K=[...O].sort((q,B)=>(q.order??Number.MAX_SAFE_INTEGER)-(B.order??Number.MAX_SAFE_INTEGER));return{...V,references:K}});return PS(G,Y,Z),_.sort((V,H)=>V.name.localeCompare(H.name)),{topics:_,warnings:Z}}function VY($,Q,Z){let X;try{X=nC($)}catch(U){Z.push(`Could not read directory ${W0($)}: ${U instanceof Error?U.message:String(U)}`);return}for(let U of X){let J=oC($,U),W;try{W=rC(J)}catch{Z.push(`Could not stat file, skipping: ${W0(J)}`);continue}if(W.isDirectory())VY(J,Q,Z);else if(W.isFile()&&U.endsWith(".md"))Q.push(J)}}function bS($){return Boolean($.name?.trim()&&$.title?.trim()&&$.description?.trim())}function KY($,Q=[]){if(!uS($))return;try{let Z=JSON.parse(dS($,"utf8"));if(!L7(Z)){Q.push(`Ignoring invalid package.json at ${$}: expected a JSON object.`);return}return{name:typeof Z.name==="string"?Z.name:void 0,sumr:Z.sumr}}catch(Z){let X=Z instanceof Error?Z.message:"unknown parse error";Q.push(`Ignoring invalid package.json at ${$}: ${X}`);return}}function cS($){return $?.startsWith("@sumr/")===!0}function L7($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function nS($,Q,Z,X){if($===void 0)return[];if(!Array.isArray($)||$.some((U)=>typeof U!=="string"))return X.push(`Ignoring invalid packages filter for playbook resource "${Z}" in ${Q}.`),null;return $}function iS($,Q,Z,X){if(xQ(Q)){X.push(`Ignoring unsafe absolute playbook resource path in ${Z}: ${Q}`);return}let U=pS($,Q),J=eJ($,U);if(J===$W||J.startsWith(QW)||xQ(J)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}try{if(!mS(U).isDirectory()){X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}let W=tJ($),Y=tJ(U),G=eJ(W,Y);if(G===$W||G.startsWith(QW)||xQ(G)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}return Y}catch{X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}}function rS($,Q){if($.length===0)return!0;if(!Q)return!1;return $.includes(Q)}function oS($,Q,Z,X,U,J){if(!L7($)){J.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let W=typeof $.label==="string"?$.label.trim():"",Y=typeof $.path==="string"?$.path.trim():"";if(!W||!Y){J.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let G=nS($.packages,Z,W,J);if(G===null||!rS(G,X))return;let z=iS(Q,Y,Z,J);if(z)U.push({label:W,root:z,packageName:Z})}function qY($,Q){let Z=[],X=KY(lS($,"package.json"),Z);if(!X||typeof X.name!=="string"||!cS(X.name))return{roots:[],warnings:Z};let U=X.name;if(!L7(X.sumr))return{roots:[],warnings:Z};let J=X.sumr.playbookResources;if(J===void 0)return{roots:[],warnings:Z};if(!Array.isArray(J))return{roots:[],warnings:[...Z,`Ignoring invalid playbookResources metadata in ${U}.`]};let W=[];for(let Y of J)oS(Y,$,U,Q,W,Z);return{roots:W,warnings:Z}}function C8($){if(!$||!aS($))return;try{return tS($).isDirectory()?sS($):void 0}catch{return}}function tQ($){let Q=C8($.root);return Q?{...$,root:Q}:void 0}function eS($){if($.packageName)return`${$.packageName}:${$.label??$.root}`;let Q=C8($.root);return Q?`path:${Q}`:void 0}function WF(){let $=process.env[QF]?.trim();if($)return g1($);return k$(vS(),".sumr","resources","playbook")}function YF(){return k$(WF(),"current")}function GF(){let $=u0(HY(import.meta.url));return[{label:"playbook",root:g1($,"..","..","resources")},{label:"playbook",root:g1($,"resources")}]}function zF($){let Q=g1($);for(;;){if(q7(k$(Q,"package.json")))return Q;let Z=u0(Q);if(Z===Q)return;Q=Z}}function _F($){return $.length-$.trimStart().length}function Y0($){let Q=$.trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1);return Q}function y8($){return JF.map((Q)=>k$($,Q)).find((Q)=>q7(Q))}function VF($,Q){let Z=/^name:\s*(.+)$/.exec($);if(Z?.[1]){Q.name=Y0(Z[1]);return}let X=/^package:\s*(.+)$/.exec($);if(X?.[1])Q.packageName=Y0(X[1])}function HF($,Q,Z,X){if(/^resources:\s*\[\]\s*$/.test($)){Z.section=n.exports;return}if($===x1.RESOURCES){Z.section=n.resources;return}if(Z.section===n.resources){let U=/^-\s+(.+)$/.exec($);if(U?.[1]){X.legacyResources.push(Y0(U[1]));return}Z.section=n.exports}if($===x1.AI_RESOURCES)Z.ai={roots:[],activationMode:k2.always},X.aiResources=Z.ai,Z.section=n.aiResources,Z.aiBaseIndent=Q}function OF($,Q,Z){let X=/^mode:\s*(.+)$/.exec($);if(X?.[1]){let J=Y0(X[1]);return Q.activationMode=J===k2.command?k2.command:k2.always,!0}let U=/^key:\s*(.+)$/.exec($);if(U?.[1])return Q.activationKey=Y0(U[1]),!0;if(/^initCommand:\s*(.+)$/.exec($))return!0;return Z.section=n.aiResources,!1}function KF($,Q,Z,X){if(Q<=Z.aiBaseIndent){if(Z.section=$===x1.AI_RESOURCES?n.aiResources:n.exports,$===x1.RESOURCES)Z.section=n.resources;return}if(Z.section===n.aiActivation){if(OF($,X,Z))return}let U=/^module:\s*(.+)$/.exec($);if(U?.[1]){X.module=Y0(U[1]);return}if($===x1.ROOTS)return;let J=/^-\s+(.+)$/.exec($);if(J?.[1]){X.roots.push(Y0(J[1]));return}if($===x1.ACTIVATION)Z.section=n.aiActivation}function qF($,Q,Z,X){if(Q===0){Z.section=$===x1.METADATA?n.metadata:n.none;return}if(Z.section===n.metadata){VF($,X);return}if($===x1.EXPORTS){Z.section=n.exports;return}if(Z.section===n.exports||Z.section===n.resources){HF($,Q,Z,X);return}if((Z.section===n.aiResources||Z.section===n.aiActivation)&&Z.ai)KF($,Q,Z,Z.ai)}function BF($){let Q=y8($);if(!Q)return;let Z=yS(Q,"utf8").split(/\r?\n/),X={legacyResources:[]},U={section:n.none,aiBaseIndent:0,ai:void 0};for(let J of Z){let W=J.trim();if(!W||W.startsWith("#"))continue;qF(W,_F(J),U,X)}return X}function LF($,Q,Z){if($.activationMode===k2.always)return!0;let X=$.activationKey??$.module??Q;return o8(X,{cwd:Z})}function AF($,Q){let Z=BF($);if(!Z)return[];if(Z.aiResources&&Z.aiResources.roots.length>0){let U=Z.aiResources,J=U.module??Z.name??sQ($);if(!LF(U,J,Q))return[];return U.roots.flatMap((W)=>{let Y=tQ({label:J,root:g1($,W),packageName:Z.packageName,module:J});return Y?[Y]:[]})}if((Z.packageName===ZF||Z.name===XF)&&Z.legacyResources.length>0){let U=Z.name??sQ($);return Z.legacyResources.flatMap((J)=>{let W=tQ({label:U,root:g1($,J),packageName:Z.packageName});return W?[W]:[]})}return[]}function f8($){try{return fS($).isDirectory()}catch{return!1}}function MF($){let Q=u0($),Z=sQ(Q).startsWith("@")?new Set([Q]):new Set([Q,u0(Q)]),X=new Set;for(let U of Z){let J;try{J=B7(U)}catch{continue}for(let W of J){let Y=k$(U,W);if(f8(Y)&&y8(Y))X.add(Y)}}return[...X]}function jF($){let Q=k$($,"ai","modules"),Z;try{Z=B7(Q)}catch{return[]}return Z.map((X)=>k$(Q,X)).filter((X)=>f8(X)&&y8(X))}function TF($){let Q=k$($,"node_modules","@sumr"),Z;try{Z=B7(Q)}catch{return[]}return Z.map((X)=>k$(Q,X)).filter((X)=>f8(X)&&y8(X))}function EF($,Q){let Z=Q.split("/"),X=g1($);for(;;){let U=k$(X,"node_modules",...Z);if(f8(U)&&q7(k$(U,"package.json")))return U;let J=u0(X);if(J===X)return;X=J}}function CF($){return KY(k$($,"package.json"))?.name}function S8($,Q,Z){if(!$||Q.has($.root))return;let X=eS($);if(X&&Z.has(X))return;if(Q.set($.root,$),X)Z.add(X)}function gQ($,Q,Z,X){for(let U of $)for(let J of AF(U,Q))S8(J,Z,X)}function SF($,Q,Z,X){let U=qY($,Q);for(let J of U.roots)S8(J,Z,X);return U.warnings}function FF($){let Q=u0(HY(import.meta.url)),Z=zF(Q),X=CF($),U=new Map,J=new Set,W=[];if(Z)W.push(...SF(Z,X,U,J)),gQ(jF(Z),$,U,J),gQ([Z,...MF(Z)],$,U,J);gQ(TF($),$,U,J);let Y=EF($,UF);if(Y){let z=qY(Y,X);for(let _ of z.roots)S8(_,U,J);W.push(...z.warnings)}for(let z of GF())S8(tQ(z),U,J);return{roots:[...U.values()].sort((z,_)=>z.label.localeCompare(_.label)),warnings:W}}function A7($=process.cwd()){let Q=process.env[$F]?.trim(),Z=C8(Q);if(Z)return{root:Z,roots:[{label:"override",root:Z}],source:D2.dev,warnings:[]};if(Q)return{roots:[],source:D2.missing,warnings:[`SUMR Playbook resources override not found, skipping: ${g1(Q)}`]};let X=C8(YF());if(X)return{root:X,roots:[{label:"cache",root:X}],source:D2.cache,warnings:[]};let U=FF($),J=U.roots;if(J.length>0)return{root:J[0]?.root,roots:J,source:D2.bundled,warnings:U.warnings};return{roots:[],source:D2.missing,warnings:[...U.warnings,"SUMR Playbook resources were not found in cache or bundled resources."]}}function RF($,Q){let Z=[];for(let X of $.playbook.sources){let U=oQ(Q,X),J=XY(U),W=0,Y=[];if(J){let G=h0([U],{source:H$.LOCAL});W=G.topics.length,Y.push(...G.warnings)}Z.push({path:X,exists:J,topics:W,warnings:Y})}return Z}function DF(){let $=A7(),Q=0;for(let Z of $.roots){let X=h0([Z.root],{source:H$.CORE,module:Z.module});Q+=X.topics.length}return Q}function NF($,Q,Z){let X=[];X.push(`Config: ${$.configFound?$.configPath:"not found \u2014 defaults used"}`),X.push(""),X.push("Channels:");for(let U of Q){let J=U.enabled?"enabled ":"disabled",W=U.outputExists?U.outputDir:`${U.outputDir} (not yet created)`;X.push(` ${J} ${U.displayName.padEnd(12)} ${W}`)}X.push(""),X.push("Sources:");for(let U of Z){let J=U.exists?"":" (not found)";X.push(` ${U.path}${J} \u2014 ${U.topics} local topic${U.topics===1?"":"s"}`)}if(X.push(""),X.push(`Topics: ${$.localTopics} local + ${$.coreTopics} SUMR core = ${$.totalTopics} total`),$.hideGen)X.push(""),X.push("VS Code hideGen: enabled \u2014 generated dirs added to files.exclude");return X}async function wF($){let{extras:Q}=$.args,Z=Q.json===!0,X=process.cwd(),U=h2(X),J=U?u2(X):j8(),W=M8(J),Y=S$.map((K)=>({id:K.id,displayName:K.displayName,enabled:W.includes(K.id),outputDir:K.outputDir,outputExists:XY(oQ(X,K.outputDir))})),G=RF(J,X),z=DF(),_=G.reduce((K,q)=>K+q.topics,0),V=z+_,H={configFound:U,configPath:oQ(X,"sumr.yaml"),channels:Y,sources:G,coreTopics:z,localTopics:_,totalTopics:V,hideGen:J.playbook.hideGen??!1};if(Z)return H1(V1("playbook status",!0,H,[],null)),0;let O=NF(H,Y,G);return await x0("Playbook status",O.join(`
756
- `),"mauve"),0}function vF($){let Q=$.split("-").map((Z)=>`${Z.charAt(0).toUpperCase()}${Z.slice(1)}`).join(" ");return{tracker:$,label:Q,softwareNames:[Q],nouns:["task","ticket","work item","card"],defaultPrefix:"TASK",rawIssueExample:"123",normalizedIssueKey:`${$}-123`,normalizedKeyPattern:"<local-label>",referenceExamples:[`${Q} task 123`,`${$}-123`],sourceGuidance:"This tracker is recognized by Mission, but V1 treats it as a manual work source unless a native adapter is added later.",apiGuidance:`When an MCP/API gives a ${Q} ID, pass it with \`--tracker ${$} --issue <id>\`.`}}class BY{create($){let Q=$.mission?.tracker?.provider,Z=dF($.mission?.issuePrefixes??fF);if(!Q)return this.createUnconfiguredProfile(Z);let X=PF[Q]??vF(Q);return{tracker:Q,label:X.label,prefixes:Z,triggerHints:this.triggerHints(X,Z),identifierGuidance:this.identifierGuidance(X,Z),startExamples:this.startExamples(X,Z)}}createUnconfiguredProfile($){let Q=UW($),Z=XW($),X=bF.join(", ");return{label:"Unconfigured",prefixes:[...$],triggerHints:JW(["tickets","issues","ticket keys","issue numbers",Q,"GitHub","GitLab","Jira","Linear","Azure DevOps","ClickUp","Asana","Trello","Notion"]),identifierGuidance:["This repo has no `mission.tracker.provider` configured.","If the user says `issue 4501`, do not assume GitHub, GitLab, Jira, Linear, or another tool. Ask for the tracker/source before creating Mission state.","If the user gives a full key such as `GH-4501`, `GL-4501`, or `PROJECT-123`, use that key directly.",`For non-native systems such as ${X}, ask for the canonical work item ID and use \`--tracker custom\` unless the repo adds a native Mission adapter later.`,Z].join(`
808
+ Rename one of them or set a unique "name:" in frontmatter.`);Y.set(H,U),W.push(uD(G,_,U,Q,Z))}return W}function mD($){let Q=new Map;for(let Z of $){let X=z6(Z.sourcePath),Y=Q.get(X);if(Y){Y.push(Z);continue}Q.set(X,[Z])}return Q}function lD($,Q){let Z=new Map;for(let X of $){let Y=z6(X.sourcePath);if(!Q.has(Y))continue;let W=Z.get(Y);if(!W)Z.set(Y,X.sourcePath);else{let U=xJ(W);if(xJ(X.sourcePath)===gJ&&U!==gJ)Z.set(Y,X.sourcePath)}}return Z}function S0($){let Q=GD(process.cwd(),$);return Q&&!Q.startsWith("..")?Q:$}function pD($,Q,Z){for(let[X,Y]of $)if(!Q.some((U)=>z6(U.sourcePath)===X))for(let U of Y)Z.push(`Orphan reference "${U.name}" in ${S0(X)} \u2014 no main doc found, skipped`)}function U2($,Q={}){let Z=[],X=Q.source??H$.LOCAL,Y=hD($,Z),W=dD(Y,X,Q.module,Z),U=W.filter((V)=>V.category===vJ),J=W.filter((V)=>V.category!==vJ),G=mD(U),_=lD(J,G),H=J.map((V)=>{let q=z6(V.sourcePath);if(_.get(q)!==V.sourcePath)return V;let K=G.get(q);if(!K||K.length===0)return V;let B=[...K].sort((L,O)=>(L.order??Number.MAX_SAFE_INTEGER)-(O.order??Number.MAX_SAFE_INTEGER));return{...V,references:B}});return pD(G,J,Z),H.sort((V,q)=>V.name.localeCompare(q.name)),{topics:H,warnings:Z}}function tG($,Q,Z){let X;try{X=YD($)}catch(Y){Z.push(`Could not read directory ${S0($)}: ${Y instanceof Error?Y.message:String(Y)}`);return}for(let Y of X){let W=JD($,Y),U;try{U=UD(W)}catch{Z.push(`Could not stat file, skipping: ${S0(W)}`);continue}if(U.isDirectory())tG(W,Q,Z);else if(U.isFile()&&Y.endsWith(".md"))Q.push(W)}}function cD($){return Boolean($.name?.trim()&&$.title?.trim()&&$.description?.trim())}function Z_($,Q=[]){if(!tD($))return;try{let Z=JSON.parse(eD($,"utf8"));if(!O7(Z)){Q.push(`Ignoring invalid package.json at ${$}: expected a JSON object.`);return}return{name:typeof Z.name==="string"?Z.name:void 0,sumr:Z.sumr}}catch(Z){let X=Z instanceof Error?Z.message:"unknown parse error";Q.push(`Ignoring invalid package.json at ${$}: ${X}`);return}}function XN($){return $?.startsWith("@sumr/")===!0}function O7($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function YN($,Q,Z,X){if($===void 0)return[];if(!Array.isArray($)||$.some((Y)=>typeof Y!=="string"))return X.push(`Ignoring invalid packages filter for playbook resource "${Z}" in ${Q}.`),null;return $}function WN($,Q,Z,X){if(gZ(Q)){X.push(`Ignoring unsafe absolute playbook resource path in ${Z}: ${Q}`);return}let Y=ZN($,Q),W=uJ($,Y);if(W===dJ||W.startsWith(mJ)||gZ(W)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}try{if(!$N(Y).isDirectory()){X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}let U=hJ($),J=hJ(Y),G=uJ(U,J);if(G===dJ||G.startsWith(mJ)||gZ(G)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}return J}catch{X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}}function UN($,Q){if($.length===0)return!0;if(!Q)return!1;return $.includes(Q)}function JN($,Q,Z,X,Y,W){if(!O7($)){W.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let U=typeof $.label==="string"?$.label.trim():"",J=typeof $.path==="string"?$.path.trim():"";if(!U||!J){W.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let G=YN($.packages,Z,U,W);if(G===null||!UN(G,X))return;let _=WN(Q,J,Z,W);if(_)Y.push({label:U,root:_,packageName:Z})}function X_($,Q){let Z=[],X=Z_(QN($,"package.json"),Z);if(!X||typeof X.name!=="string"||!XN(X.name))return{roots:[],warnings:Z};let Y=X.name;if(!O7(X.sumr))return{roots:[],warnings:Z};let W=X.sumr.playbookResources;if(W===void 0)return{roots:[],warnings:Z};if(!Array.isArray(W))return{roots:[],warnings:[...Z,`Ignoring invalid playbookResources metadata in ${Y}.`]};let U=[];for(let J of W)JN(J,$,Y,Q,U,Z);return{roots:U,warnings:Z}}function G6($){if(!$||!GN($))return;try{return HN($).isDirectory()?_N($):void 0}catch{return}}function Y_($){let Q=G6($.root);return Q?{...$,root:Q}:void 0}function VN($){if($.packageName)return`${$.packageName}:${$.label??$.root}`;let Q=G6($.root);return Q?`path:${Q}`:void 0}function LN(){let $=process.env[KN]?.trim();if($)return I0($);return v$(iD(),".sumr","resources","playbook")}function ON(){return v$(LN(),"current")}function zN(){let $=J2($_(import.meta.url));return[{label:"playbook",root:I0($,"..","..","resources")},{label:"playbook",root:I0($,"resources")}]}function jN($){let Q=I0($);for(;;){if(A7(v$(Q,"package.json")))return Q;let Z=J2(Q);if(Z===Q)return;Q=Z}}function TN($){return $.length-$.trimStart().length}function G2($){let Q=$.trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1);return Q}function j6($){return AN.map((Q)=>v$($,Q)).find((Q)=>A7(Q))}function EN($,Q){let Z=/^name:\s*(.+)$/.exec($);if(Z?.[1]){Q.name=G2(Z[1]);return}let X=/^package:\s*(.+)$/.exec($);if(X?.[1])Q.packageName=G2(X[1])}function CN($,Q,Z,X){if(/^resources:\s*/.test($)){Z.section=A$.exports;return}if($===X2.AI_RESOURCES)Z.ai={roots:[],activationMode:Q8.always},X.aiResources=Z.ai,Z.section=A$.aiResources,Z.aiBaseIndent=Q}function FN($,Q,Z){let X=/^mode:\s*(.+)$/.exec($);if(X?.[1]){let W=G2(X[1]);return Q.activationMode=W===Q8.command?Q8.command:Q8.always,!0}let Y=/^key:\s*(.+)$/.exec($);if(Y?.[1])return Q.activationKey=G2(Y[1]),!0;if(/^initCommand:\s*(.+)$/.exec($))return!0;return Z.section=A$.aiResources,!1}function MN($,Q,Z,X){if(Q<=Z.aiBaseIndent){Z.section=$===X2.AI_RESOURCES?A$.aiResources:A$.exports;return}if(Z.section===A$.aiActivation){if(FN($,X,Z))return}let Y=/^module:\s*(.+)$/.exec($);if(Y?.[1]){X.module=G2(Y[1]);return}if($===X2.ROOTS)return;let W=/^-\s+(.+)$/.exec($);if(W?.[1]){X.roots.push(G2(W[1]));return}if($===X2.ACTIVATION)Z.section=A$.aiActivation}function SN($,Q,Z,X){if(Q===0){Z.section=$===X2.METADATA?A$.metadata:A$.none;return}if(Z.section===A$.metadata){EN($,X);return}if($===X2.EXPORTS){Z.section=A$.exports;return}if(Z.section===A$.exports){CN($,Q,Z,X);return}if((Z.section===A$.aiResources||Z.section===A$.aiActivation)&&Z.ai)MN($,Q,Z,Z.ai)}function IN($){let Q=j6($);if(!Q)return;let Z=nD(Q,"utf8").split(/\r?\n/),X={},Y={section:A$.none,aiBaseIndent:0,ai:void 0};for(let W of Z){let U=W.trim();if(!U||U.startsWith("#"))continue;SN(U,TN(W),Y,X)}return X}function RN($,Q,Z){if($.activationMode===Q8.always)return!0;let X=$.activationKey??$.module??Q;return c6(X,{cwd:Z})}function DN($,Q){let Z=IN($);if(!Z?.aiResources||Z.aiResources.roots.length===0)return[];let X=Z.aiResources,Y=X.module??Z.name??eG($);if(!RN(X,Y,Q))return[];return X.roots.flatMap((W)=>{let U=Y_({label:Y,root:I0($,W),packageName:Z.packageName,module:Y});return U?[U]:[]})}function T6($){try{return rD($).isDirectory()}catch{return!1}}function NN($){let Q=J2($),Z=eG(Q).startsWith("@")?new Set([Q]):new Set([Q,J2(Q)]),X=new Set;for(let Y of Z){let W;try{W=L7(Y)}catch{continue}for(let U of W){let J=v$(Y,U);if(T6(J)&&j6(J))X.add(J)}}return[...X]}function wN($){let Q=v$($,"ai","modules"),Z;try{Z=L7(Q)}catch{return[]}return Z.map((X)=>v$(Q,X)).filter((X)=>T6(X)&&j6(X))}function bN($){let Q=v$($,"node_modules","@sumr"),Z;try{Z=L7(Q)}catch{return[]}return Z.map((X)=>v$(Q,X)).filter((X)=>T6(X)&&j6(X))}function kN($,Q){let Z=Q.split("/"),X=I0($);for(;;){let Y=v$(X,"node_modules",...Z);if(T6(Y)&&A7(v$(Y,"package.json")))return Y;let W=J2(X);if(W===X)return;X=W}}function PN($){return Z_(v$($,"package.json"))?.name}function _6($,Q,Z){if(!$||Q.has($.root))return;let X=VN($);if(X&&Z.has(X))return;if(Q.set($.root,$),X)Z.add(X)}function hZ($,Q,Z,X){for(let Y of $)for(let W of DN(Y,Q))_6(W,Z,X)}function fN($,Q,Z,X){let Y=X_($,Q);for(let W of Y.roots)_6(W,Z,X);return Y.warnings}function yN($){let Q=J2($_(import.meta.url)),Z=jN(Q),X=PN($),Y=new Map,W=new Set,U=[];if(Z)U.push(...fN(Z,X,Y,W)),hZ(wN(Z),$,Y,W),hZ([Z,...NN(Z)],$,Y,W);hZ(bN($),$,Y,W);let J=kN($,BN);if(J){let _=X_(J,X);for(let H of _.roots)_6(H,Y,W);U.push(..._.warnings)}for(let _ of zN())_6(Y_(_),Y,W);return{roots:[...Y.values()].sort((_,H)=>_.label.localeCompare(H.label)),warnings:U}}function z7($=process.cwd()){let Q=process.env[qN]?.trim(),Z=G6(Q);if(Z)return{root:Z,roots:[{label:"override",root:Z}],source:t2.dev,warnings:[]};if(Q)return{roots:[],source:t2.missing,warnings:[`SUMR Playbook resources override not found, skipping: ${I0(Q)}`]};let X=G6(ON());if(X)return{root:X,roots:[{label:"cache",root:X}],source:t2.cache,warnings:[]};let Y=yN($),W=Y.roots;if(W.length>0)return{root:W[0]?.root,roots:W,source:t2.bundled,warnings:Y.warnings};return{roots:[],source:t2.missing,warnings:[...Y.warnings,"SUMR Playbook resources were not found in cache or bundled resources."]}}function vN($,Q){let Z=[];for(let X of $.playbook.sources){let Y=aZ(Q,X),W=pG(Y),U=0,J=[];if(W){let G=U2([Y],{source:H$.LOCAL});U=G.topics.length,J.push(...G.warnings)}Z.push({path:X,exists:W,topics:U,warnings:J})}return Z}function gN(){let $=z7(),Q=0;for(let Z of $.roots){let X=U2([Z.root],{source:H$.CORE,module:Z.module});Q+=X.topics.length}return Q}function hN($,Q,Z){let X=[];X.push(`Config: ${$.configFound?$.configPath:"not found \u2014 defaults used"}`),X.push(""),X.push("Channels:");for(let Y of Q){let W=Y.enabled?"enabled ":"disabled",U=Y.outputExists?Y.outputDir:`${Y.outputDir} (not yet created)`;X.push(` ${W} ${Y.displayName.padEnd(12)} ${U}`)}X.push(""),X.push("Sources:");for(let Y of Z){let W=Y.exists?"":" (not found)";X.push(` ${Y.path}${W} \u2014 ${Y.topics} local topic${Y.topics===1?"":"s"}`)}if(X.push(""),X.push(`Topics: ${$.localTopics} local + ${$.coreTopics} SUMR core = ${$.totalTopics} total`),$.hideGen)X.push(""),X.push("VS Code hideGen: enabled \u2014 generated dirs added to files.exclude");return X}async function uN($){let{extras:Q}=$.args,Z=Q.json===!0,X=process.cwd(),Y=_8(X),W=Y?H8(X):W6(),U=Y6(W),J=D$.map((B)=>({id:B.id,displayName:B.displayName,enabled:U.includes(B.id),outputDir:B.outputDir,outputExists:pG(aZ(X,B.outputDir))})),G=vN(W,X),_=gN(),H=G.reduce((B,L)=>B+L.topics,0),V=_+H,q={configFound:Y,configPath:aZ(X,"sumr.yaml"),channels:J,sources:G,coreTopics:_,localTopics:H,totalTopics:V,hideGen:W.playbook.hideGen??!1};if(Z)return R1(I1("playbook status",!0,q,[],null)),0;let K=hN(q,J,G);return await Y2("Playbook status",K.join(`
809
+ `),"mauve"),0}function nN($){let Q=$.split("-").map((Z)=>`${Z.charAt(0).toUpperCase()}${Z.slice(1)}`).join(" ");return{tracker:$,label:Q,softwareNames:[Q],nouns:["task","ticket","work item","card"],defaultPrefix:"TASK",rawIssueExample:"123",normalizedIssueKey:`${$}-123`,normalizedKeyPattern:"<local-label>",referenceExamples:[`${Q} task 123`,`${$}-123`],sourceGuidance:"This tracker is recognized by Mission, but V1 treats it as a manual work source unless a native adapter is added later.",apiGuidance:`When an MCP/API gives a ${Q} ID, pass it with \`--tracker ${$} --issue <id>\`.`}}class W_{create($){let Q=$.mission?.tracker?.provider,Z=sN($.mission?.issuePrefixes??cN);if(!Q)return this.createUnconfiguredProfile(Z);let X=mN[Q]??nN(Q);return{tracker:Q,label:X.label,prefixes:Z,triggerHints:this.triggerHints(X,Z),identifierGuidance:this.identifierGuidance(X,Z),startExamples:this.startExamples(X,Z)}}createUnconfiguredProfile($){let Q=cJ($),Z=pJ($),X=lN.join(", ");return{label:"Unconfigured",prefixes:[...$],triggerHints:nJ(["tickets","issues","ticket keys","issue numbers",Q,"GitHub","GitLab","Jira","Linear","Azure DevOps","ClickUp","Asana","Trello","Notion"]),identifierGuidance:["This repo has no `mission.tracker.provider` configured.","If the user says `issue 4501`, do not assume GitHub, GitLab, Jira, Linear, or another tool. Ask for the tracker/source before creating Mission state.","If the user gives a full key such as `GH-4501`, `GL-4501`, or `PROJECT-123`, use that key directly.",`For non-native systems such as ${X}, ask for the canonical work item ID and use \`--tracker custom\` unless the repo adds a native Mission adapter later.`,Z].join(`
757
810
 
758
811
  `),startExamples:['sumr mission start --tracker github --issue 4501 --name "Fix checkout flow"',`sumr mission start --tracker jira --issue ${$[0]??"PROJECT"}-123 --name "Add mission playbook resources"`,'sumr mission start --tracker custom --issue "release-notes-pass" --name "Prepare release notes"'].join(`
759
- `)}}triggerHints($,Q){return JW([...$.softwareNames,...$.nouns,...this.referenceExamples($,Q),UW(Q)])}identifierGuidance($,Q){let Z=this.effectiveIssueKey($,Q),X=this.referenceExamples($,Q),U=uF(Q,$.defaultPrefix),J=$.tracker===v0.CUSTOM?`Recognize these custom work references as Mission IDs or custom ID candidates: ${F8(X)}.`:`Recognize these ${$.label} references as Mission issue key \`${Z}\`: ${F8(X)}.`,W=$.tracker===v0.CUSTOM?`${$.apiGuidance} Mission normalizes it into a safe local slug.`:`${$.apiGuidance} Mission normalizes it to \`${$.normalizedKeyPattern}\`.`;return[`This repo is configured with \`mission.tracker.provider: ${$.tracker}\` (${$.label}).`,J,$.sourceGuidance,W,"Use the normalized key in later `status`, `plan`, `claim`, `report`, `block`, `unblock`, `close`, worktree, and branch commands.",U,XW(Q)].join(`
760
-
761
- `)}startExamples($,Q){let Z=this.effectiveRawIssueExample($,Q),X=this.effectiveIssueKey($,Q),U=[`sumr mission start --tracker ${$.tracker} --issue ${Z} --name "Fix checkout flow"`,`sumr mission status ${X}`],J=v2(Q)[0];if(J&&J!==X)U.push(`sumr mission start ${J} --title "Fix checkout flow"`),U.push(`sumr mission status ${J}`);return U.join(`
762
- `)}referenceExamples($,Q){if(!hQ($.tracker))return $.referenceExamples;let Z=this.effectiveIssueKey($,Q),X=v2(Q).filter((J)=>J!==Z),U=$.tracker===v0.JIRA?"ticket":"issue";return[Z,...X,`${$.label} ${U} ${Z}`,$.tracker===v0.JIRA?`story ${Z}`:`cycle issue ${Z}`]}effectiveRawIssueExample($,Q){if(hQ($.tracker)&&Q[0])return`${Q[0]}-123`;return $.rawIssueExample}effectiveIssueKey($,Q){if(hQ($.tracker)&&Q[0])return`${Q[0]}-123`;return $.normalizedIssueKey}}function xF($){let Q=new BY().create($),Z=gF($);return{MISSION_TRIGGER_HINTS:Q.triggerHints,MISSION_IDENTIFIER_GUIDANCE:Q.identifierGuidance,MISSION_START_EXAMPLES:Q.startExamples,MISSION_FLOW_PRESET:Z.preset,MISSION_FLOW_TEXT:Z.text,MISSION_FLOW_STEPS:Z.steps,MISSION_PR_MODE:Z.prMode}}function gF($){let Q=$.mission?.flow?.preset??P0.BASIC,Z=$.mission?.flow?.steps??hF(Q),X=Z.map((U)=>{let J=[];if(U.enabled===!1)J.push("skipped");if(U.advance&&U.advance!==g.AUTO)J.push(U.advance);return J.length>0?`${U.uses}(${J.join(", ")})`:U.uses}).join(" -> ");return{preset:Q,text:X,steps:Z.map((U,J)=>`${J+1}. \`${U.uses}\`${U.enabled===!1?" (disabled)":""}${U.advance?` \u2014 ${U.advance}`:""}`).join(`
763
- `),prMode:$.mission?.git?.prMode??yF}}function hF($){if($===P0.PLANNING_ONLY)return[{uses:d.ISSUE_SYNC,advance:g.AUTO},{uses:d.CONTEXT_RESEARCH,advance:g.AUTO},{uses:d.PLAN_CREATE,advance:g.AUTO},{uses:d.PLAN_APPROVE,advance:g.HUMAN}];if($===P0.STANDARD_DELIVERY||$===P0.FULL_DELIVERY){let Q=[{uses:d.ISSUE_SYNC,advance:g.AUTO},{uses:d.CONTEXT_RESEARCH,enabled:$===P0.STANDARD_DELIVERY?!1:void 0,advance:g.AUTO},{uses:d.PLAN_CREATE,advance:g.AUTO},{uses:d.PLAN_APPROVE,advance:g.HUMAN},{uses:d.BRANCH_CHECK,advance:g.ASK},{uses:d.WORK_CLAIM,advance:g.AUTO},{uses:d.IMPLEMENTATION_REPORT,advance:g.MANUAL},{uses:d.REVIEW_REPORT,advance:g.MANUAL},{uses:d.VALIDATION_REPORT,advance:g.MANUAL},{uses:d.QUALITY_GATE,advance:g.MANUAL},{uses:d.PR_PREPARE,advance:g.ASK},{uses:d.PR_CREATE,advance:g.HUMAN}];if($===P0.FULL_DELIVERY)Q.push({uses:d.MISSION_CLOSE,advance:g.MANUAL});return Q}return[{uses:d.PLAN_CREATE,advance:g.AUTO},{uses:d.PLAN_APPROVE,advance:g.HUMAN},{uses:d.WORK_CLAIM,advance:g.AUTO},{uses:d.IMPLEMENTATION_REPORT,advance:g.MANUAL},{uses:d.REVIEW_REPORT,advance:g.MANUAL},{uses:d.VALIDATION_REPORT,advance:g.MANUAL},{uses:d.MISSION_CLOSE,advance:g.MANUAL}]}function hQ($){return $===v0.JIRA||$===v0.LINEAR}function XW($){if($.length===0)return"No repo-specific ticket prefixes are configured.";let Q=F8(v2($));return[`Repo ticket prefixes configured in \`sumr.yaml\`: ${$.map((Z)=>`\`${Z}\``).join(", ")}.`,`Treat these as immediate Mission trigger examples: ${Q}.`].join(" ")}function uF($,Q){let Z=$.filter((X)=>X!==Q);if(Z.length===0)return"If the user gives a full explicit key, keep that key; do not rewrite a project/team key into another tracker namespace.";return`If the user gives a configured full key such as ${F8(v2(Z))}, keep that explicit key; do not rewrite it into the configured tracker namespace.`}function UW($){if($.length===0)return;return`configured ticket keys ${v2($).join(", ")}`}function v2($){return $.slice(0,4).map((Q)=>`${Q}-123`)}function F8($){return $.map((Q)=>`\`${Q}\``).join(", ")}function JW($){return $.map((Q)=>Q?.trim()).filter((Q,Z,X)=>Boolean(Q)&&X.indexOf(Q)===Z).join(", ")}function dF($){return $.map((Q)=>Q.trim().toUpperCase()).filter((Q,Z,X)=>Q.length>0&&X.indexOf(Q)===Z)}function lF($,Q){if($.length===0)return"- none";return $.map((Z)=>`- ${T7(Z,Q)}`).join(`
764
- `)}function pF($){if($.length===0)return"";return["Warnings:",...$.map((Q)=>`- ${Q}`)].join(`
765
- `)}function cF($,Q,Z=[],X=[]){return $.map((U)=>w8(U)).filter((U)=>U!==void 0).map((U)=>{let J=QI(U,Q,Z),W=J.length>0?`
766
- legacy cleanup: ${J.join(", ")}`:"",Y=$I(U.id,Q,X,Z),G=Y.length>0?`
767
- resources: ${Y.join(", ")}`:"";return`- ${U.displayName}: ${U.outputDir}${G}${W}`}).join(`
768
- `)}function nF($){return`${$.length} warning${$.length===1?"":"s"}. Run with --verbose to see details.`}function iF($,Q,Z){return`Synced ${`${$} topic${$===1?"":"s"}`} across ${Q} channel${Q===1?"":"s"}${Z?" (dry run)":""} \uD83C\uDF89`}function eF($){return rF[$]??AY}function $I($,Q,Z,X){let U=[...Z,...X].map((W)=>x2(M7(Q,j7(Q,W)))),J=new Set;for(let W of eF($)){let Y=x2(W);if(U.some((G)=>G===Y||G.startsWith(`${Y}/`)))J.add(W)}return[...J]}function QI($,Q,Z){return ZI($).filter((X)=>{let U=j7(Q,X);return mF(U)||Z.some((J)=>J===U||J.startsWith(`${U}${LY}`))})}function ZI($){return $.legacyOutputDirs??AY}function XI($,Q,Z){let X=pF(Z);return["No Markdown files with Playbook frontmatter were found in the configured sources.","","Sources checked:",lF($,Q),"","Playbook topics require this frontmatter:","","---","name: my-topic","title: My Topic",'description: "What this topic covers. Use when doing X."',"---","","Reference files stay beside the main doc and set category: reference.","","Useful commands:","sumr playbook authoring --section structure","sumr playbook authoring --example overview","sumr playbook sync --dry-run",...X?["",X]:[]].join(`
769
- `)}function UI($,Q){let Z=$.local.paths.length===0?"none":$.local.paths.map((U)=>T7(U,Q)).join(", "),X=JI($.core,Q);return[`- Local docs: ${$.local.topics} topic${$.local.topics===1?"":"s"}; paths: ${Z}`,`- SUMR resources: ${$.core.topics} topic${$.core.topics===1?"":"s"}; source: ${X}`].join(`
770
- `)}function JI($,Q){if($.source===uQ.bundled){let Z=WI($);if(Z.length<=1)return"bundled core resources";return`bundled core resources (${Z.map((U)=>`${U.label}: ${U.topics}`).join(", ")})`}if($.source===uQ.cache)return"local cache";if($.source===uQ.dev)return $.path?`dev override (${T7($.path,Q)})`:"dev override";return"missing"}function WI($){return $.providers?.filter((Q)=>Q.topics>0)??oF}function T7($,Q){let Z=x2(M7(Q,j7(Q,$)));return Z===""?tF:Z}function MY($,Q){let Z=new Map,X=new Set;for(let J of Q){let W=x2(M7($,J));if(W===aF||W.startsWith(sF)){X.add(W);continue}let Y=YI(W);if(Y){let z=Z.get(Y.outputDir)??new Set;z.add(Y.name),Z.set(Y.outputDir,z);continue}let G=GI(W);if(G){let z=Z.get(G.outputDir)??new Set;z.add(G.name),Z.set(G.outputDir,z)}}let U=[...X];for(let[J,W]of Z)U.push(...zI(J,[...W]));return U}function YI($){for(let Q of[".codex/agents",".claude/agents",".claude/hooks",".claude/commands",".opencode/agents"]){if(!$.startsWith(`${Q}/`))continue;let Z=$.slice(Q.length+1).split("/")[0];if(!Z||Z.startsWith("sumr-"))return null;return{outputDir:Q,name:Z}}return null}function GI($){for(let Q of S$){let Z=x2(Q.outputDir);if(!$.startsWith(`${Z}/`))continue;let X=$.slice(Z.length+1).split("/")[0];if(!X||Q.filePattern.test(X))return null;return{outputDir:Z,name:X}}return null}function zI($,Q){let Z=[];for(let[X,U]of VI(Q)){let J=_I(U);if(U.length>1){let W=/\.[A-Za-z0-9]+$/.test(J);Z.push(`${$}/${X}*${W?"":"/"}`)}else{let W=/\.[A-Za-z0-9]+$/.test(J);Z.push(`${$}/${J}${W?"":"/"}`)}}return Z}function _I($){let Q=$[0];if(Q===void 0)throw Error("Cannot generate wildcard patterns for an empty name group.");return Q}function VI($){let Q=new Map;for(let Z of $){let X=Z.indexOf("-"),U=X>=0?Z.slice(0,X+1):Z,J=Q.get(U);if(J){J.push(Z);continue}Q.set(U,[Z])}return Q}function x2($){return $.split(LY).join("/")}function KI($,Q,Z,X){let U=CY($,["cmd","use"]);if(!U)return X.push({code:"AGENTSMD_MALFORMED_COMMAND",message:`command snippet in ${Z} is missing required labels "cmd:" or "use:"; skipped.`,sourcePath:Z}),null;let J={cmd:b2(U,"cmd"),use:b2(U,"use")};return{section:D.COMMAND,body:$,attributes:Q,sourcePath:Z,command:J}}function qI($,Q,Z,X){let U=CY($,["path","purpose","when"]);if(!U)return X.push({code:"AGENTSMD_MALFORMED_MAP",message:`map snippet in ${Z} is missing required labels "path:", "purpose:", or "when:"; skipped.`,sourcePath:Z}),null;let J={path:b2(U,"path"),purpose:b2(U,"purpose"),when:b2(U,"when")};return{section:D.MAP,body:$,attributes:Q,sourcePath:Z,map:J}}function BI($,Q,Z,X,U){if($===D.COMMAND)return KI(Q,Z,X,U);if($===D.MAP)return qI(Q,Z,X,U);return{section:$,body:Q,attributes:Z,sourcePath:X}}function GW($,Q){let Z=[],X=[],U;Q7.lastIndex=0;while((U=Q7.exec($))!==null){let J=dQ(U,1).toLowerCase(),W=dQ(U,2),Y=dQ(U,3).trim();if(!LI(J)){X.push({code:"AGENTSMD_UNKNOWN_SECTION",message:`Unknown agents-md section "${J}" \u2014 must be one of: ${C7.join(", ")}.`,sourcePath:Q});continue}let{attributes:G,attrWarnings:z}=MI(W,Q);X.push(...z);let _=BI(J,Y,G,Q,X);if(_)Z.push(_)}return{snippets:Z,warnings:X}}function LI($){return C7.includes($)}function dQ($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function b2($,Q){let Z=$[Q];if(Z===void 0)throw Error(`Missing required agents-md field "${Q}".`);return Z}function AI($,Q,Z,X){let U=$.indexOf("=");if(U===-1){X.push({code:"AGENTSMD_UNKNOWN_ATTRIBUTE",message:`Malformed attribute "${$}" in ${Z}; ignored.`,sourcePath:Z});return}let J=$.slice(0,U).toLowerCase(),W=$.slice(U+1);if(!YW.has(J)){X.push({code:"AGENTSMD_UNKNOWN_ATTRIBUTE",message:`Unknown attribute "${J}" in ${Z}; ignored. Supported: ${[...YW].join(", ")}.`,sourcePath:Z});return}if(J===L8.SCOPE){if(W)Q.scopes.push(W);return}if(J===L8.ORDER){let Y=Number(W);if(Number.isFinite(Y))Q.order=Y;return}if(J===L8.ID&&W)Q.id=W}function MI($,Q){let Z={scopes:[],order:100},X=[],U=$.trim();if(!U)return{attributes:{scopes:Z.scopes,order:Z.order},attrWarnings:X};for(let W of U.split(/\s+/))AI(W,Z,Q,X);return{attributes:{scopes:Z.scopes,order:Z.order,id:Z.id},attrWarnings:X}}function CY($,Q){let Z={};for(let X of $.split(/\r?\n/)){let U=X.trim();if(!U)continue;let J=U.indexOf(":");if(J===-1)continue;let W=U.slice(0,J).trim().toLowerCase(),Y=U.slice(J+1).trim();if(W&&!Z[W])Z[W]=Y;else if(W&&Z[W])Z[W]=`${Z[W]} ${Y}`.trim()}for(let X of Q)if(!Z[X])return null;return Z}function SY($){return $.replace(Q7,"")}function EI($,Q,Z){$.push(v8);let X=[...Z].sort();if(X.length===0)$.push("<!-- DO NOT EDIT \u2014 assembled by `bun run sync`. -->");else{$.push("<!-- DO NOT EDIT \u2014 assembled by `bun run sync` from:");for(let U of X)$.push(` - ${U}`);$.push("-->")}$.push(""),$.push(Q.path===jI?"# AGENTS.md":`# AGENTS.md \u2014 ${Q.path}`),$.push("")}function zW($,Q,Z){if(!Q)return;$.push(Z),$.push(""),$.push(Q.body),$.push("")}function _W($,Q,Z){if(Q.length===0)return;$.push(Z),$.push(""),Q.forEach((X,U)=>{$.push(`${U+1}. ${X.body.replace(/\n/g," ").trim()}`)}),$.push("")}function mQ($,Q,Z){if(Q.length===0)return;$.push(Z),$.push("");for(let X of Q)$.push(`- ${X.body.replace(/\n/g," ").trim()}`);$.push("")}function CI($,Q){if(Q.length===0)return;$.push("## 2. Repo map"),$.push(""),$.push("| Path | Purpose | When to read |"),$.push("|------|---------|--------------|");for(let Z of Q){let X=Z.map??{path:"",purpose:"",when:""};$.push(`| \`${X.path}\` | ${X.purpose} | ${X.when} |`)}$.push("")}function SI($,Q){if(Q.length===0)return;$.push("## 4. Common commands"),$.push(""),$.push("| Command | Use |"),$.push("|---------|-----|");for(let Z of Q){let X=Z.command??{cmd:"",use:""};$.push(`| \`${X.cmd}\` | ${X.use} |`)}$.push("")}function FI($,Q,Z){let X=[];return EI(X,$,Z),zW(X,VW(Q.get(D.OVERVIEW)),"## Purpose"),_W(X,U0(Q,D.STARTUP),"## 1. Before you start (mandatory)"),CI(X,U0(Q,D.MAP)),mQ(X,U0(Q,D.RULE),"## 3. Hard rules (non-negotiable)"),SI(X,U0(Q,D.COMMAND)),mQ(X,U0(Q,D.CONVENTION),"## 5. Code conventions"),mQ(X,U0(Q,D.SECURITY),"## 6. Security"),_W(X,U0(Q,D.CLOSEOUT),"## 7. Closeout"),zW(X,VW(Q.get(D.STUCK)),"## 8. If you're stuck"),`${X.join(`
812
+ `)}}triggerHints($,Q){return nJ([...$.softwareNames,...$.nouns,...this.referenceExamples($,Q),cJ(Q)])}identifierGuidance($,Q){let Z=this.effectiveIssueKey($,Q),X=this.referenceExamples($,Q),Y=aN(Q,$.defaultPrefix),W=$.tracker===Z2.CUSTOM?`Recognize these custom work references as Mission IDs or custom ID candidates: ${H6(X)}.`:`Recognize these ${$.label} references as Mission issue key \`${Z}\`: ${H6(X)}.`,U=$.tracker===Z2.CUSTOM?`${$.apiGuidance} Mission normalizes it into a safe local slug.`:`${$.apiGuidance} Mission normalizes it to \`${$.normalizedKeyPattern}\`.`;return[`This repo is configured with \`mission.tracker.provider: ${$.tracker}\` (${$.label}).`,W,$.sourceGuidance,U,"Use the normalized key in later `status`, `plan`, `claim`, `report`, `block`, `unblock`, `close`, worktree, and branch commands.",Y,pJ(Q)].join(`
813
+
814
+ `)}startExamples($,Q){let Z=this.effectiveRawIssueExample($,Q),X=this.effectiveIssueKey($,Q),Y=[`sumr mission start --tracker ${$.tracker} --issue ${Z} --name "Fix checkout flow"`,`sumr mission status ${X}`],W=U8(Q)[0];if(W&&W!==X)Y.push(`sumr mission start ${W} --title "Fix checkout flow"`),Y.push(`sumr mission status ${W}`);return Y.join(`
815
+ `)}referenceExamples($,Q){if(!uZ($.tracker))return $.referenceExamples;let Z=this.effectiveIssueKey($,Q),X=U8(Q).filter((W)=>W!==Z),Y=$.tracker===Z2.JIRA?"ticket":"issue";return[Z,...X,`${$.label} ${Y} ${Z}`,$.tracker===Z2.JIRA?`story ${Z}`:`cycle issue ${Z}`]}effectiveRawIssueExample($,Q){if(uZ($.tracker)&&Q[0])return`${Q[0]}-123`;return $.rawIssueExample}effectiveIssueKey($,Q){if(uZ($.tracker)&&Q[0])return`${Q[0]}-123`;return $.normalizedIssueKey}}function rN($){let Q=new W_().create($),Z=iN($);return{MISSION_TRIGGER_HINTS:Q.triggerHints,MISSION_IDENTIFIER_GUIDANCE:Q.identifierGuidance,MISSION_START_EXAMPLES:Q.startExamples,MISSION_FLOW_PRESET:Z.preset,MISSION_FLOW_TEXT:Z.text,MISSION_FLOW_STEPS:Z.steps,MISSION_PR_MODE:Z.prMode}}function iN($){let Q=$.mission?.flow?.preset??t0.BASIC,Z=$.mission?.flow?.steps??oN(Q),X=Z.map((Y)=>{let W=[];if(Y.enabled===!1)W.push("skipped");if(Y.advance&&Y.advance!==d.AUTO)W.push(Y.advance);return W.length>0?`${Y.uses}(${W.join(", ")})`:Y.uses}).join(" -> ");return{preset:Q,text:X,steps:Z.map((Y,W)=>`${W+1}. \`${Y.uses}\`${Y.enabled===!1?" (disabled)":""}${Y.advance?` \u2014 ${Y.advance}`:""}`).join(`
816
+ `),prMode:$.mission?.git?.prMode??pN}}function oN($){if($===t0.PLANNING_ONLY)return[{uses:c.ISSUE_SYNC,advance:d.AUTO},{uses:c.CONTEXT_RESEARCH,advance:d.AUTO},{uses:c.PLAN_CREATE,advance:d.AUTO},{uses:c.PLAN_APPROVE,advance:d.HUMAN}];if($===t0.STANDARD_DELIVERY||$===t0.FULL_DELIVERY){let Q=[{uses:c.ISSUE_SYNC,advance:d.AUTO},{uses:c.CONTEXT_RESEARCH,enabled:$===t0.STANDARD_DELIVERY?!1:void 0,advance:d.AUTO},{uses:c.PLAN_CREATE,advance:d.AUTO},{uses:c.PLAN_APPROVE,advance:d.HUMAN},{uses:c.BRANCH_CHECK,advance:d.ASK},{uses:c.WORK_CLAIM,advance:d.AUTO},{uses:c.IMPLEMENTATION_REPORT,advance:d.MANUAL},{uses:c.REVIEW_REPORT,advance:d.MANUAL},{uses:c.VALIDATION_REPORT,advance:d.MANUAL},{uses:c.QUALITY_GATE,advance:d.MANUAL},{uses:c.PR_PREPARE,advance:d.ASK},{uses:c.PR_CREATE,advance:d.HUMAN}];if($===t0.FULL_DELIVERY)Q.push({uses:c.MISSION_CLOSE,advance:d.MANUAL});return Q}return[{uses:c.PLAN_CREATE,advance:d.AUTO},{uses:c.PLAN_APPROVE,advance:d.HUMAN},{uses:c.WORK_CLAIM,advance:d.AUTO},{uses:c.IMPLEMENTATION_REPORT,advance:d.MANUAL},{uses:c.REVIEW_REPORT,advance:d.MANUAL},{uses:c.VALIDATION_REPORT,advance:d.MANUAL},{uses:c.MISSION_CLOSE,advance:d.MANUAL}]}function uZ($){return $===Z2.JIRA||$===Z2.LINEAR}function pJ($){if($.length===0)return"No repo-specific ticket prefixes are configured.";let Q=H6(U8($));return[`Repo ticket prefixes configured in \`sumr.yaml\`: ${$.map((Z)=>`\`${Z}\``).join(", ")}.`,`Treat these as immediate Mission trigger examples: ${Q}.`].join(" ")}function aN($,Q){let Z=$.filter((X)=>X!==Q);if(Z.length===0)return"If the user gives a full explicit key, keep that key; do not rewrite a project/team key into another tracker namespace.";return`If the user gives a configured full key such as ${H6(U8(Z))}, keep that explicit key; do not rewrite it into the configured tracker namespace.`}function cJ($){if($.length===0)return;return`configured ticket keys ${U8($).join(", ")}`}function U8($){return $.slice(0,4).map((Q)=>`${Q}-123`)}function H6($){return $.map((Q)=>`\`${Q}\``).join(", ")}function nJ($){return $.map((Q)=>Q?.trim()).filter((Q,Z,X)=>Boolean(Q)&&X.indexOf(Q)===Z).join(", ")}function sN($){return $.map((Q)=>Q.trim().toUpperCase()).filter((Q,Z,X)=>Q.length>0&&X.indexOf(Q)===Z)}function eN($,Q){if($.length===0)return"- none";return $.map((Z)=>`- ${E7(Z,Q)}`).join(`
817
+ `)}function $w($){if($.length===0)return"";return["Warnings:",...$.map((Q)=>`- ${Q}`)].join(`
818
+ `)}function Qw($,Q,Z=[],X=[]){return $.map((Y)=>A6(Y)).filter((Y)=>Y!==void 0).map((Y)=>{let W=Vw(Y,Q,Z),U=W.length>0?`
819
+ legacy cleanup: ${W.join(", ")}`:"",J=Hw(Y.id,Q,X,Z),G=J.length>0?`
820
+ resources: ${J.join(", ")}`:"";return`- ${Y.displayName}: ${Y.outputDir}${G}${U}`}).join(`
821
+ `)}function Zw($){return`${$.length} warning${$.length===1?"":"s"}. Run with --verbose to see details.`}function Xw($,Q,Z){return`Synced ${`${$} topic${$===1?"":"s"}`} across ${Q} channel${Q===1?"":"s"}${Z?" (dry run)":""} \uD83C\uDF89`}function _w($){return Yw[$]??J_}function Hw($,Q,Z,X){let Y=[...Z,...X].map((U)=>J8(j7(Q,T7(Q,U)))),W=new Set;for(let U of _w($)){let J=J8(U);if(Y.some((G)=>G===J||G.startsWith(`${J}/`)))W.add(U)}return[...W]}function Vw($,Q,Z){return qw($).filter((X)=>{let Y=T7(Q,X);return tN(Y)||Z.some((W)=>W===Y||W.startsWith(`${Y}${U_}`))})}function qw($){return $.legacyOutputDirs??J_}function Kw($,Q,Z){let X=$w(Z);return["No Markdown files with Playbook frontmatter were found in the configured sources.","","Sources checked:",eN($,Q),"","Playbook topics require this frontmatter:","","---","name: my-topic","title: My Topic",'description: "What this topic covers. Use when doing X."',"---","","Reference files stay beside the main doc and set category: reference.","","Useful commands:","sumr playbook authoring --section structure","sumr playbook authoring --example overview","sumr playbook sync --dry-run",...X?["",X]:[]].join(`
822
+ `)}function Bw($,Q){let Z=$.local.paths.length===0?"none":$.local.paths.map((Y)=>E7(Y,Q)).join(", "),X=Aw($.core,Q);return[`- Local docs: ${$.local.topics} topic${$.local.topics===1?"":"s"}; paths: ${Z}`,`- SUMR resources: ${$.core.topics} topic${$.core.topics===1?"":"s"}; source: ${X}`].join(`
823
+ `)}function Aw($,Q){if($.source===dZ.bundled){let Z=Lw($);if(Z.length<=1)return"bundled core resources";return`bundled core resources (${Z.map((Y)=>`${Y.label}: ${Y.topics}`).join(", ")})`}if($.source===dZ.cache)return"local cache";if($.source===dZ.dev)return $.path?`dev override (${E7($.path,Q)})`:"dev override";return"missing"}function Lw($){return $.providers?.filter((Q)=>Q.topics>0)??Ww}function E7($,Q){let Z=J8(j7(Q,T7(Q,$)));return Z===""?Gw:Z}function G_($,Q){let Z=new Map,X=new Set;for(let W of Q){let U=J8(j7($,W));if(U===Uw||U.startsWith(Jw)){X.add(U);continue}let J=Ow(U);if(J){let _=Z.get(J.outputDir)??new Set;_.add(J.name),Z.set(J.outputDir,_);continue}let G=zw(U);if(G){let _=Z.get(G.outputDir)??new Set;_.add(G.name),Z.set(G.outputDir,_)}}let Y=[...X];for(let[W,U]of Z)Y.push(...jw(W,[...U]));return Y}function Ow($){for(let Q of[".codex/agents",".claude/agents",".claude/hooks",".claude/commands",".opencode/agents"]){if(!$.startsWith(`${Q}/`))continue;let Z=$.slice(Q.length+1).split("/")[0];if(!Z||Z.startsWith("sumr-"))return null;return{outputDir:Q,name:Z}}return null}function zw($){for(let Q of D$){let Z=J8(Q.outputDir);if(!$.startsWith(`${Z}/`))continue;let X=$.slice(Z.length+1).split("/")[0];if(!X||Q.filePattern.test(X))return null;return{outputDir:Z,name:X}}return null}function jw($,Q){let Z=[];for(let[X,Y]of Ew(Q)){let W=Tw(Y);if(Y.length>1){let U=/\.[A-Za-z0-9]+$/.test(W);Z.push(`${$}/${X}*${U?"":"/"}`)}else{let U=/\.[A-Za-z0-9]+$/.test(W);Z.push(`${$}/${W}${U?"":"/"}`)}}return Z}function Tw($){let Q=$[0];if(Q===void 0)throw Error("Cannot generate wildcard patterns for an empty name group.");return Q}function Ew($){let Q=new Map;for(let Z of $){let X=Z.indexOf("-"),Y=X>=0?Z.slice(0,X+1):Z,W=Q.get(Y);if(W){W.push(Z);continue}Q.set(Y,[Z])}return Q}function J8($){return $.split(U_).join("/")}function Mw($,Q,Z,X){let Y=q_($,["cmd","use"]);if(!Y)return X.push({code:"AGENTSMD_MALFORMED_COMMAND",message:`command snippet in ${Z} is missing required labels "cmd:" or "use:"; skipped.`,sourcePath:Z}),null;let W={cmd:X8(Y,"cmd"),use:X8(Y,"use")};return{section:N.COMMAND,body:$,attributes:Q,sourcePath:Z,command:W}}function Sw($,Q,Z,X){let Y=q_($,["path","purpose","when"]);if(!Y)return X.push({code:"AGENTSMD_MALFORMED_MAP",message:`map snippet in ${Z} is missing required labels "path:", "purpose:", or "when:"; skipped.`,sourcePath:Z}),null;let W={path:X8(Y,"path"),purpose:X8(Y,"purpose"),when:X8(Y,"when")};return{section:N.MAP,body:$,attributes:Q,sourcePath:Z,map:W}}function Iw($,Q,Z,X,Y){if($===N.COMMAND)return Mw(Q,Z,X,Y);if($===N.MAP)return Sw(Q,Z,X,Y);return{section:$,body:Q,attributes:Z,sourcePath:X}}function oJ($,Q){let Z=[],X=[],Y;$7.lastIndex=0;while((Y=$7.exec($))!==null){let W=mZ(Y,1).toLowerCase(),U=mZ(Y,2),J=mZ(Y,3).trim();if(!Rw(W)){X.push({code:"AGENTSMD_UNKNOWN_SECTION",message:`Unknown agents-md section "${W}" \u2014 must be one of: ${F7.join(", ")}.`,sourcePath:Q});continue}let{attributes:G,attrWarnings:_}=Nw(U,Q);X.push(..._);let H=Iw(W,J,G,Q,X);if(H)Z.push(H)}return{snippets:Z,warnings:X}}function Rw($){return F7.includes($)}function mZ($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function X8($,Q){let Z=$[Q];if(Z===void 0)throw Error(`Missing required agents-md field "${Q}".`);return Z}function Dw($,Q,Z,X){let Y=$.indexOf("=");if(Y===-1){X.push({code:"AGENTSMD_UNKNOWN_ATTRIBUTE",message:`Malformed attribute "${$}" in ${Z}; ignored.`,sourcePath:Z});return}let W=$.slice(0,Y).toLowerCase(),U=$.slice(Y+1);if(!iJ.has(W)){X.push({code:"AGENTSMD_UNKNOWN_ATTRIBUTE",message:`Unknown attribute "${W}" in ${Z}; ignored. Supported: ${[...iJ].join(", ")}.`,sourcePath:Z});return}if(W===Z6.SCOPE){if(U)Q.scopes.push(U);return}if(W===Z6.ORDER){let J=Number(U);if(Number.isFinite(J))Q.order=J;return}if(W===Z6.ID&&U)Q.id=U}function Nw($,Q){let Z={scopes:[],order:100},X=[],Y=$.trim();if(!Y)return{attributes:{scopes:Z.scopes,order:Z.order},attrWarnings:X};for(let U of Y.split(/\s+/))Dw(U,Z,Q,X);return{attributes:{scopes:Z.scopes,order:Z.order,id:Z.id},attrWarnings:X}}function q_($,Q){let Z={};for(let X of $.split(/\r?\n/)){let Y=X.trim();if(!Y)continue;let W=Y.indexOf(":");if(W===-1)continue;let U=Y.slice(0,W).trim().toLowerCase(),J=Y.slice(W+1).trim();if(U&&!Z[U])Z[U]=J;else if(U&&Z[U])Z[U]=`${Z[U]} ${J}`.trim()}for(let X of Q)if(!Z[X])return null;return Z}function K_($){return $.replace($7,"")}function kw($,Q,Z){$.push(E6);let X=[...Z].sort();if(X.length===0)$.push("<!-- DO NOT EDIT \u2014 assembled by `bun run sync`. -->");else{$.push("<!-- DO NOT EDIT \u2014 assembled by `bun run sync` from:");for(let Y of X)$.push(` - ${Y}`);$.push("-->")}$.push(""),$.push(Q.path===ww?"# AGENTS.md":`# AGENTS.md \u2014 ${Q.path}`),$.push("")}function aJ($,Q,Z){if(!Q)return;$.push(Z),$.push(""),$.push(Q.body),$.push("")}function sJ($,Q,Z){if(Q.length===0)return;$.push(Z),$.push(""),Q.forEach((X,Y)=>{$.push(`${Y+1}. ${X.body.replace(/\n/g," ").trim()}`)}),$.push("")}function lZ($,Q,Z){if(Q.length===0)return;$.push(Z),$.push("");for(let X of Q)$.push(`- ${X.body.replace(/\n/g," ").trim()}`);$.push("")}function Pw($,Q){if(Q.length===0)return;$.push("## 2. Repo map"),$.push(""),$.push("| Path | Purpose | When to read |"),$.push("|------|---------|--------------|");for(let Z of Q){let X=Z.map??{path:"",purpose:"",when:""};$.push(`| \`${X.path}\` | ${X.purpose} | ${X.when} |`)}$.push("")}function fw($,Q){if(Q.length===0)return;$.push("## 4. Common commands"),$.push(""),$.push("| Command | Use |"),$.push("|---------|-----|");for(let Z of Q){let X=Z.command??{cmd:"",use:""};$.push(`| \`${X.cmd}\` | ${X.use} |`)}$.push("")}function yw($,Q,Z){let X=[];return kw(X,$,Z),aJ(X,tJ(Q.get(N.OVERVIEW)),"## Purpose"),sJ(X,F0(Q,N.STARTUP),"## 1. Before you start (mandatory)"),Pw(X,F0(Q,N.MAP)),lZ(X,F0(Q,N.RULE),"## 3. Hard rules (non-negotiable)"),fw(X,F0(Q,N.COMMAND)),lZ(X,F0(Q,N.CONVENTION),"## 5. Code conventions"),lZ(X,F0(Q,N.SECURITY),"## 6. Security"),sJ(X,F0(Q,N.CLOSEOUT),"## 7. Closeout"),aJ(X,tJ(Q.get(N.STUCK)),"## 8. If you're stuck"),`${X.join(`
771
824
  `).trimEnd()}
772
- `}function II($,Q="AGENTS.md"){let Z=["<!-- DO NOT EDIT \u2014 assembled by `bun run sync`. See AGENTS.md banner for sources. -->",v8,`@${Q}`];if($.length>0){Z.push(""),Z.push("<!-- Claude-specific additions below. -->"),Z.push("");for(let X of $)Z.push(`- ${X.body.replace(/\n/g," ").trim()}`)}return`${Z.join(`
825
+ `}function xw($,Q="AGENTS.md"){let Z=["<!-- DO NOT EDIT \u2014 assembled by `bun run sync`. See AGENTS.md banner for sources. -->",E6,`@${Q}`];if($.length>0){Z.push(""),Z.push("<!-- Claude-specific additions below. -->"),Z.push("");for(let X of $)Z.push(`- ${X.body.replace(/\n/g," ").trim()}`)}return`${Z.join(`
773
826
  `).trimEnd()}
774
- `}function U0($,Q){return $.get(Q)??TI}function VW($){if(!$||$.length===0)return;return $[0]}function IY($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},U=RY($,Q);if(X.warnings.push(...U.warnings),!U.enabled)return X;let J=U.config.targets.filter((z)=>z!==f1),W={...U.config,targets:J},Y=new Set,G=new Set;for(let z of J){let _=U.targets.get(z);if(!_)continue;let V=g2(process.cwd(),z,"AGENTS.md"),H=g2(process.cwd(),z,"CLAUDE.md");if(OW(V,X.warnings))$$(V,_.agentsMdContent,Z.dryRun),X.filesWritten.push(V),Y.add(V);if(U.config.claudeMd){let O=HW(_.sections,D.CLAUDE_ONLY),K=II(O,"AGENTS.md");if(OW(H,X.warnings))$$(H,K,Z.dryRun),X.filesWritten.push(H),G.add(H)}else if(HW(_.sections,D.CLAUDE_ONLY).length>0)X.warnings.push(`AGENTSMD_CLAUDE_ONLY_DROPPED: target "${z}" has claude-only snippets but claudeMd is false.`)}return X.filesRemoved.push(...cI(W,Y,G,Z.dryRun)),X}function kI($,Q){let Z=[];for(let X of $){let U=GW(X.body,X.sourcePath);Q.push(...U.warnings),Z.push(...U.snippets);for(let J of X.references){let W=GW(J.body,J.sourcePath);Q.push(...W.warnings),Z.push(...W.snippets)}}return Z}function PI($,Q,Z){let X=new Map,U=new Map;for(let J of Q.targets)X.set(J,new Map),U.set(J,new Set);for(let J of $){let W=uI(J,Q,Z);if(W.length===0){Z.push(`AGENTSMD_UNROUTABLE: snippet at ${J.sourcePath} routes to zero targets; consider adding 'scope=.' or a root '.' target.`);continue}for(let Y of W){let G=X.get(Y),z=U.get(Y);if(!G||!z)continue;let _=G.get(J.section);if(_)_.push(J);else G.set(J.section,[J]);z.add(J.sourcePath)}}return{snippetsByTarget:X,sourcesByTarget:U}}function yI($){for(let Q of bI){let Z=$.get(Q);if(Z)Z.sort((X,U)=>(X.attributes.order??100)-(U.attributes.order??100))}}function fI($,Q,Z){let X=Q.snippetsByTarget.get($)??new Map,U=Q.sourcesByTarget.get($)??new Set;if(U.size===0){Z.warnings.push(`AGENTSMD_EMPTY_TARGET: target "${$}" has zero snippets.`);return}if(yI(X),lI($,X,Z.warnings),!X.has(D.OVERVIEW))Z.warnings.push(`AGENTSMD_NO_OVERVIEW: target "${$}" has no overview snippet.`);let J=new Set([...U].map(mI)),W=FI({path:$},X,J);if(pI(W))Z.warnings.push(`AGENTSMD_LINE_BUDGET: ${g2($,"AGENTS.md")} exceeds 200 lines (${W.split(`
775
- `).length}); consider splitting or pruning.`);let Y=X.get(D.STARTUP)?.length??0;if(Y>5)Z.warnings.push(`AGENTSMD_STARTUP_OVERFLOW: target "${$}" has ${Y} startup steps; Anthropic recommends \u2264 5.`);Z.targets.set($,{target:$,sections:X,sources:U,agentsMdContent:W})}function RY($,Q){let Z=vI(Q),X={enabled:Z.enabled,config:Z,targets:new Map,warnings:[]};if(!Z.enabled)return X;let U=[],J=kI($,U);if(X.warnings.push(...U.map((Y)=>`${Y.code}: ${Y.message}`)),J.length===0)return X;let W=PI(J,Z,X.warnings);for(let Y of Z.targets)fI(Y,W,X);return X}function vI($){let Q=$.playbook.agentsMd??xI,Z=Q.enabled??!0,X=Q.targets&&Q.targets.length>0?Q.targets:[f1],U=Q.claudeMd??!0,J=$.playbook.sources.length>0?$.playbook.sources:[DI];return{enabled:Z,targets:X,claudeMd:U,sources:J}}function HW($,Q){return $.get(Q)??wI}function gI($,Q,Z){let X=new Set;for(let U of $.attributes.scopes){if(U===RI){for(let J of Q.targets)X.add(J);continue}if(!Q.targets.includes(U)){Z.push(`AGENTSMD_INVALID_SCOPE: scope="${U}" on snippet in ${$.sourcePath} is not a configured target (${Q.targets.join(", ")}); skipped for this scope.`);continue}X.add(U)}return[...X]}function hI($,Q){let Z=dI($.sourcePath,Q.sources);if(!Z)return Q.targets.includes(f1)?[f1]:[];let X;for(let U of Q.targets){if(U===f1)continue;let J=U.replace(/\/$/,""),W=`${J}${E7}`;if(Z===J||Z.startsWith(W)){if(!X||U.length>X.length)X=U}}if(X)return[X];return Q.targets.includes(f1)?[f1]:[]}function uI($,Q,Z){if($.attributes.scopes.length>0)return gI($,Q,Z);return hI($,Q)}function dI($,Q){let Z=process.cwd(),X=$7($);for(let U of Q){let J=$7(Z,U),W=EY(J,X);if(!W.startsWith(NI)&&!W.startsWith(E7)&&W!==FY)return W}return}function mI($){let Q=EY(process.cwd(),$7(process.cwd(),$));if(Q===FY)return f1;return Q.split(E7).join("/")}function lI($,Q,Z){for(let X of C7){if(!OI.has(X))continue;let U=Q.get(X)?.length??0;if(U<=1)continue;if(X===D.OVERVIEW)Z.push(`AGENTSMD_DUPLICATE_OVERVIEW: target "${$}" has ${U} overview snippets; the first one wins.`);else if(X===D.STUCK)Z.push(`AGENTSMD_DUPLICATE_STUCK: target "${$}" has ${U} stuck snippets; the first one wins.`)}}function pI($){return $.split(`
776
- `).length>200}function OW($,Q){if(!jY($))return!0;let Z;try{Z=TY($,"utf8").slice(0,300)}catch{return!0}if(Z.includes(v8))return!0;return Q.push(`AGENTSMD_UNMANAGED_EXISTS: ${$} exists but lacks the "sumr-playbook:managed" marker; leaving in place. Rename or delete it to let sumr-playbook take over.`),!1}function cI($,Q,Z,X){let U=[];for(let J of $.targets){let W=g2(process.cwd(),J,"AGENTS.md"),Y=g2(process.cwd(),J,"CLAUDE.md");if(!Q.has(W)&&KW(W)){if(U.push(W),!X)WW(W,{force:!0})}if(!Z.has(Y)&&KW(Y)){if(U.push(Y),!X)WW(Y,{force:!0})}}return U}function KW($){if(!jY($))return!1;try{return TY($,"utf8").slice(0,300).includes(v8)}catch{return!1}}function nI($,Q){let Z=new Map(Q.map((X)=>[X.id,X]));return{id:$.id,channelIds:$.channelIds,targetPath:$.targetPath,title:$.title,createItems:(X)=>iI(X,$,Z)}}function iI($,Q,Z){if(Q.appliesTo&&!Q.appliesTo($))return[];let X=[];for(let U of Q.sectionIds){let J=Z.get(U);if(!J)continue;if(J.appliesTo&&!J.appliesTo($,Q))continue;let W=qW(J.suggestedMarkdown,$,Q);if(!W?.trim())continue;let Y=J.exampleMarkdown?qW(J.exampleMarkdown,$,Q):W;X.push({id:J.id,title:J.title,detectionPatterns:[...rI(J.detectionPatterns,$,Q)],suggestedMarkdown:W,exampleMarkdown:Y?.trim()?Y:W})}return X}function qW($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function rI($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function NY($,Q){return{topics:$,config:Q,agentsMdTargets:RY($,Q).targets}}function wY(){let $=tI();return sI.map((Q)=>nI(Q,$))}function tI(){return[t$({id:"purpose",title:"Purpose / project AI guidance",sourceSection:"overview",detectionPatterns:["## Purpose","project ai guidance","quick reference","# AGENTS.md","# CLAUDE.md"],suggestedMarkdown:N$("Purpose",["This file is starter project guidance for AI assistants working in this repository.","Keep it concise, repo-specific, and aligned with the source docs, scripts, and team practices that are current here."].join(`
827
+ `}function F0($,Q){return $.get(Q)??bw}function tJ($){if(!$||$.length===0)return;return $[0]}function A_($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},Y=L_($,Q);if(X.warnings.push(...Y.warnings),!Y.enabled)return X;let W=Y.config.targets.filter((_)=>_!==s1),U={...Y.config,targets:W},J=new Set,G=new Set;for(let _ of W){let H=Y.targets.get(_);if(!H)continue;let V=G8(process.cwd(),_,"AGENTS.md"),q=G8(process.cwd(),_,"CLAUDE.md");if($G(V,X.warnings))$$(V,H.agentsMdContent,Z.dryRun),X.filesWritten.push(V),J.add(V);if(Y.config.claudeMd){let K=eJ(H.sections,N.CLAUDE_ONLY),B=xw(K,"AGENTS.md");if($G(q,X.warnings))$$(q,B,Z.dryRun),X.filesWritten.push(q),G.add(q)}else if(eJ(H.sections,N.CLAUDE_ONLY).length>0)X.warnings.push(`AGENTSMD_CLAUDE_ONLY_DROPPED: target "${_}" has claude-only snippets but claudeMd is false.`)}return X.filesRemoved.push(...Qb(U,J,G,Z.dryRun)),X}function dw($,Q){let Z=[];for(let X of $){let Y=oJ(X.body,X.sourcePath);Q.push(...Y.warnings),Z.push(...Y.snippets);for(let W of X.references){let U=oJ(W.body,W.sourcePath);Q.push(...U.warnings),Z.push(...U.snippets)}}return Z}function mw($,Q,Z){let X=new Map,Y=new Map;for(let W of Q.targets)X.set(W,new Map),Y.set(W,new Set);for(let W of $){let U=aw(W,Q,Z);if(U.length===0){Z.push(`AGENTSMD_UNROUTABLE: snippet at ${W.sourcePath} routes to zero targets; consider adding 'scope=.' or a root '.' target.`);continue}for(let J of U){let G=X.get(J),_=Y.get(J);if(!G||!_)continue;let H=G.get(W.section);if(H)H.push(W);else G.set(W.section,[W]);_.add(W.sourcePath)}}return{snippetsByTarget:X,sourcesByTarget:Y}}function pw($){for(let Q of lw){let Z=$.get(Q);if(Z)Z.sort((X,Y)=>(X.attributes.order??100)-(Y.attributes.order??100))}}function cw($,Q,Z){let X=Q.snippetsByTarget.get($)??new Map,Y=Q.sourcesByTarget.get($)??new Set;if(Y.size===0){Z.warnings.push(`AGENTSMD_EMPTY_TARGET: target "${$}" has zero snippets.`);return}if(pw(X),ew($,X,Z.warnings),!X.has(N.OVERVIEW))Z.warnings.push(`AGENTSMD_NO_OVERVIEW: target "${$}" has no overview snippet.`);let W=new Set([...Y].map(tw)),U=yw({path:$},X,W);if($b(U))Z.warnings.push(`AGENTSMD_LINE_BUDGET: ${G8($,"AGENTS.md")} exceeds 200 lines (${U.split(`
828
+ `).length}); consider splitting or pruning.`);let J=X.get(N.STARTUP)?.length??0;if(J>5)Z.warnings.push(`AGENTSMD_STARTUP_OVERFLOW: target "${$}" has ${J} startup steps; Anthropic recommends \u2264 5.`);Z.targets.set($,{target:$,sections:X,sources:Y,agentsMdContent:U})}function L_($,Q){let Z=nw(Q),X={enabled:Z.enabled,config:Z,targets:new Map,warnings:[]};if(!Z.enabled)return X;let Y=[],W=dw($,Y);if(X.warnings.push(...Y.map((J)=>`${J.code}: ${J.message}`)),W.length===0)return X;let U=mw(W,Z,X.warnings);for(let J of Z.targets)cw(J,U,X);return X}function nw($){let Q=$.playbook.agentsMd??rw,Z=Q.enabled??!0,X=Q.targets&&Q.targets.length>0?Q.targets:[s1],Y=Q.claudeMd??!0,W=$.playbook.sources.length>0?$.playbook.sources:[gw];return{enabled:Z,targets:X,claudeMd:Y,sources:W}}function eJ($,Q){return $.get(Q)??uw}function iw($,Q,Z){let X=new Set;for(let Y of $.attributes.scopes){if(Y===vw){for(let W of Q.targets)X.add(W);continue}if(!Q.targets.includes(Y)){Z.push(`AGENTSMD_INVALID_SCOPE: scope="${Y}" on snippet in ${$.sourcePath} is not a configured target (${Q.targets.join(", ")}); skipped for this scope.`);continue}X.add(Y)}return[...X]}function ow($,Q){let Z=sw($.sourcePath,Q.sources);if(!Z)return Q.targets.includes(s1)?[s1]:[];let X;for(let Y of Q.targets){if(Y===s1)continue;let W=Y.replace(/\/$/,""),U=`${W}${C7}`;if(Z===W||Z.startsWith(U)){if(!X||Y.length>X.length)X=Y}}if(X)return[X];return Q.targets.includes(s1)?[s1]:[]}function aw($,Q,Z){if($.attributes.scopes.length>0)return iw($,Q,Z);return ow($,Q)}function sw($,Q){let Z=process.cwd(),X=eZ($);for(let Y of Q){let W=eZ(Z,Y),U=V_(W,X);if(!U.startsWith(hw)&&!U.startsWith(C7)&&U!==B_)return U}return}function tw($){let Q=V_(process.cwd(),eZ(process.cwd(),$));if(Q===B_)return s1;return Q.split(C7).join("/")}function ew($,Q,Z){for(let X of F7){if(!Fw.has(X))continue;let Y=Q.get(X)?.length??0;if(Y<=1)continue;if(X===N.OVERVIEW)Z.push(`AGENTSMD_DUPLICATE_OVERVIEW: target "${$}" has ${Y} overview snippets; the first one wins.`);else if(X===N.STUCK)Z.push(`AGENTSMD_DUPLICATE_STUCK: target "${$}" has ${Y} stuck snippets; the first one wins.`)}}function $b($){return $.split(`
829
+ `).length>200}function $G($,Q){if(!__($))return!0;let Z;try{Z=H_($,"utf8").slice(0,300)}catch{return!0}if(Z.includes(E6))return!0;return Q.push(`AGENTSMD_UNMANAGED_EXISTS: ${$} exists but lacks the "sumr-playbook:managed" marker; leaving in place. Rename or delete it to let sumr-playbook take over.`),!1}function Qb($,Q,Z,X){let Y=[];for(let W of $.targets){let U=G8(process.cwd(),W,"AGENTS.md"),J=G8(process.cwd(),W,"CLAUDE.md");if(!Q.has(U)&&QG(U)){if(Y.push(U),!X)rJ(U,{force:!0})}if(!Z.has(J)&&QG(J)){if(Y.push(J),!X)rJ(J,{force:!0})}}return Y}function QG($){if(!__($))return!1;try{return H_($,"utf8").slice(0,300).includes(E6)}catch{return!1}}function Zb($,Q){let Z=new Map(Q.map((X)=>[X.id,X]));return{id:$.id,channelIds:$.channelIds,targetPath:$.targetPath,title:$.title,createItems:(X)=>Xb(X,$,Z)}}function Xb($,Q,Z){if(Q.appliesTo&&!Q.appliesTo($))return[];let X=[];for(let Y of Q.sectionIds){let W=Z.get(Y);if(!W)continue;if(W.appliesTo&&!W.appliesTo($,Q))continue;let U=ZG(W.suggestedMarkdown,$,Q);if(!U?.trim())continue;let J=W.exampleMarkdown?ZG(W.exampleMarkdown,$,Q):U;X.push({id:W.id,title:W.title,detectionPatterns:[...Yb(W.detectionPatterns,$,Q)],suggestedMarkdown:U,exampleMarkdown:J?.trim()?J:U})}return X}function ZG($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function Yb($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function z_($,Q){return{topics:$,config:Q,agentsMdTargets:L_($,Q).targets}}function j_(){let $=Gb();return Jb.map((Q)=>Zb(Q,$))}function Gb(){return[U1({id:"purpose",title:"Purpose / project AI guidance",sourceSection:"overview",detectionPatterns:["## Purpose","project ai guidance","quick reference","# AGENTS.md","# CLAUDE.md"],suggestedMarkdown:y$("Purpose",["This file is starter project guidance for AI assistants working in this repository.","Keep it concise, repo-specific, and aligned with the source docs, scripts, and team practices that are current here."].join(`
777
830
 
778
- `))}),t$({id:"before-you-start",title:"Before you start",sourceSection:"startup",detectionPatterns:["## Before You Start","before you start","run git status --short"],suggestedMarkdown:N$("Before You Start",MW(["Check repository status and treat existing changes as user-owned unless told otherwise.","Review the current task, nearby code, and relevant project docs before planning non-trivial changes.","Run the project setup or context command when this repository defines one.","Work on one user goal at a time and document blockers instead of guessing."]))}),{id:"mission-issue-routing",title:"Mission issue routing",appliesTo:eI,detectionPatterns:["## Mission Issue Routing","sumr mission status","sumr-mission-workflow",/Mission issue routing/i],suggestedMarkdown:N$("Mission Issue Routing",["When the user mentions an issue, ticket, work item, tracker URL, or phrase like `issue 336`, apply the generated `sumr-mission-workflow` skill before repo-specific planning docs.","Normalize the work item through this repo's `sumr.yaml` Mission config, then run `sumr mission status <issueKey>` before creating plans or editing code.",'If no Mission state exists and planning is requested, start the mission with tracker-aware input such as `sumr mission start --issue <number> --name "<title>"`, then create the durable plan with `sumr mission plan <issueKey> --from <file>` and stop for human approval unless explicitly authorized to run `sumr mission approve <issueKey>`.',"For new issue work, use Mission plan/report state instead of creating repo-local scratch planning artifacts."].join(`
831
+ `))}),U1({id:"before-you-start",title:"Before you start",sourceSection:"startup",detectionPatterns:["## Before You Start","before you start","run git status --short"],suggestedMarkdown:y$("Before You Start",UG(["Check repository status and treat existing changes as user-owned unless told otherwise.","Review the current task, nearby code, and relevant project docs before planning non-trivial changes.","Run the project setup or context command when this repository defines one.","Work on one user goal at a time and document blockers instead of guessing."]))}),{id:"mission-issue-routing",title:"Mission issue routing",appliesTo:_b,detectionPatterns:["## Mission Issue Routing","sumr mission status","sumr-mission-workflow",/Mission issue routing/i],suggestedMarkdown:y$("Mission Issue Routing",["When the user mentions an issue, ticket, work item, tracker URL, or phrase like `issue 336`, apply the generated `sumr-mission-workflow` skill before repo-specific planning docs.","Normalize the work item through this repo's `sumr.yaml` Mission config, then run `sumr mission status <issueKey>` before creating plans or editing code.",'If no Mission state exists and planning is requested, start the mission with tracker-aware input such as `sumr mission start --issue <number> --name "<title>"`, then create the durable plan with `sumr mission plan <issueKey> --from <file>` and stop for human approval unless explicitly authorized to run `sumr mission approve <issueKey>`.',"For new issue work, use Mission plan/report state instead of creating repo-local scratch planning artifacts."].join(`
779
832
 
780
- `)),exampleMarkdown:N$("Mission Issue Routing",["For `issue 336` in a GitHub-default repo, infer `GH-336`, run `sumr mission status GH-336`, then create or update Mission state before implementation."].join(`
833
+ `)),exampleMarkdown:y$("Mission Issue Routing",["For `issue 336` in a GitHub-default repo, infer `GH-336`, run `sumr mission status GH-336`, then create or update Mission state before implementation."].join(`
781
834
 
782
- `))},t$({id:"repo-map",title:"Repo map / project structure",sourceSection:"map",detectionPatterns:["## Repo Map","repo map","project structure","backend/"],suggestedMarkdown:N$("Repo Map",["Use this starter table to document the main folders and source-of-truth docs an AI assistant should check before changing them.","","| Path | Purpose | When to read |","|------|---------|--------------|","| `docs/` | Project standards, architecture notes, and product guidance. | Before planning non-trivial changes. |","| `src/` | Application or package source code. | Before editing behavior. |","| `tests/` | Regression and behavior coverage. | Before changing tested flows. |"].join(`
783
- `))}),t$({id:"hard-rules",title:"Hard rules",sourceSection:"rule",detectionPatterns:["## Hard Rules","hard rules","what not to do","preserve user changes"],suggestedMarkdown:N$("Hard Rules",O8(["Preserve user-owned changes and avoid destructive file operations unless explicitly requested.","Prefer the repository patterns, helpers, and conventions already in place.","Keep generated or tool-owned files separate from hand-authored source files.","Do not invent APIs, paths, product status, or commands; verify them locally."]))}),t$({id:"common-commands",title:"Common commands",sourceSection:"command",detectionPatterns:["## Common Commands","common commands","key commands"],suggestedMarkdown:N$("Common Commands",["Document the exact commands an AI assistant should run in this repository.","Fill in the real command for each role \u2014 do not leave placeholder text in this file:","","- **Install** \u2014 the dependency install command for this repo.","- **Test** \u2014 the focused test command for changed behavior.","- **Quality gate** \u2014 the lint, format, or typecheck command to run before closeout."].join(`
784
- `))}),t$({id:"code-conventions",title:"Code conventions",sourceSection:"convention",detectionPatterns:["## Code Conventions","code conventions","linting formatting","runtime and build"],suggestedMarkdown:N$("Code Conventions",O8(["Follow the style and architecture already used by the touched package or app.","Keep edits scoped to the user request and avoid opportunistic rewrites.","Use structured parsers or project utilities when they exist instead of brittle string handling.","Add or update focused tests when behavior, contracts, or generated output changes."]))}),t$({id:"security",title:"Security",sourceSection:"security",detectionPatterns:["## Security","security","never commit secrets","do not commit env files or secrets"],suggestedMarkdown:N$("Security",O8(["Do not commit secrets, tokens, credentials, local environment files, or private machine paths.","Validate file and path handling before writing, deleting, or moving user-owned content.","Avoid broad permissions, unsafe shell behavior, and unreviewed network calls.","Call out security-sensitive assumptions in the final handoff."]))}),t$({id:"closeout",title:"Closeout",sourceSection:"closeout",detectionPatterns:["## Closeout","closeout","before finishing","run relevant tests before committing"],suggestedMarkdown:N$("Closeout",MW(["Run the relevant focused checks for the files or behavior changed.","Summarize what changed, where it changed, and which validation ran.","Mention any skipped checks, residual risk, or follow-up work clearly.","Leave unrelated user changes untouched."]))}),t$({id:"if-stuck",title:"If you're stuck",sourceSection:"stuck",detectionPatterns:["## If You're Stuck","if you're stuck","error handling","debugging posture"],suggestedMarkdown:N$("If You're Stuck","State the blocker, what you tried, and the exact error or missing context. Prefer a small question or documented assumption over guessing.")}),t$({id:"claude-specific",title:"Claude-specific additions",sourceSection:"claude-only",detectionPatterns:["## Claude Code","claude-specific","plan mode"],suggestedMarkdown:N$("Claude Code",O8(["Keep root `CLAUDE.md` concise and stable; put detailed generated resources in their channel folders.","Use Claude project memory for durable repository guidance, not temporary task status.","Avoid duplicating generated Playbook skills, agents, hooks, or commands in this file."]))})]}function t$($){return{id:$.id,title:$.title,appliesTo:(Q)=>AW(Q,$.sourceSection).length>0,detectionPatterns:(Q)=>[...$.detectionPatterns,...QR(AW(Q,$.sourceSection))],suggestedMarkdown:$.suggestedMarkdown,exampleMarkdown:$.suggestedMarkdown}}function LW($){return $.agentsMdTargets.has(DY)}function eI($){return $.topics.some((Q)=>Q.name===oI)}function AW($,Q){return $.agentsMdTargets.get(DY)?.sections.get(Q)??aI}function N$($,Q){return`## ${$}
835
+ `))},U1({id:"repo-map",title:"Repo map / project structure",sourceSection:"map",detectionPatterns:["## Repo Map","repo map","project structure","backend/"],suggestedMarkdown:y$("Repo Map",["Use this starter table to document the main folders and source-of-truth docs an AI assistant should check before changing them.","","| Path | Purpose | When to read |","|------|---------|--------------|","| `docs/` | Project standards, architecture notes, and product guidance. | Before planning non-trivial changes. |","| `src/` | Application or package source code. | Before editing behavior. |","| `tests/` | Regression and behavior coverage. | Before changing tested flows. |"].join(`
836
+ `))}),U1({id:"hard-rules",title:"Hard rules",sourceSection:"rule",detectionPatterns:["## Hard Rules","hard rules","what not to do","preserve user changes"],suggestedMarkdown:y$("Hard Rules",t9(["Preserve user-owned changes and avoid destructive file operations unless explicitly requested.","Prefer the repository patterns, helpers, and conventions already in place.","Keep generated or tool-owned files separate from hand-authored source files.","Do not invent APIs, paths, product status, or commands; verify them locally."]))}),U1({id:"common-commands",title:"Common commands",sourceSection:"command",detectionPatterns:["## Common Commands","common commands","key commands"],suggestedMarkdown:y$("Common Commands",["Document the exact commands an AI assistant should run in this repository.","Fill in the real command for each role \u2014 do not leave placeholder text in this file:","","- **Install** \u2014 the dependency install command for this repo.","- **Test** \u2014 the focused test command for changed behavior.","- **Quality gate** \u2014 the lint, format, or typecheck command to run before closeout."].join(`
837
+ `))}),U1({id:"code-conventions",title:"Code conventions",sourceSection:"convention",detectionPatterns:["## Code Conventions","code conventions","linting formatting","runtime and build"],suggestedMarkdown:y$("Code Conventions",t9(["Follow the style and architecture already used by the touched package or app.","Keep edits scoped to the user request and avoid opportunistic rewrites.","Use structured parsers or project utilities when they exist instead of brittle string handling.","Add or update focused tests when behavior, contracts, or generated output changes."]))}),U1({id:"security",title:"Security",sourceSection:"security",detectionPatterns:["## Security","security","never commit secrets","do not commit env files or secrets"],suggestedMarkdown:y$("Security",t9(["Do not commit secrets, tokens, credentials, local environment files, or private machine paths.","Validate file and path handling before writing, deleting, or moving user-owned content.","Avoid broad permissions, unsafe shell behavior, and unreviewed network calls.","Call out security-sensitive assumptions in the final handoff."]))}),U1({id:"closeout",title:"Closeout",sourceSection:"closeout",detectionPatterns:["## Closeout","closeout","before finishing","run relevant tests before committing"],suggestedMarkdown:y$("Closeout",UG(["Run the relevant focused checks for the files or behavior changed.","Summarize what changed, where it changed, and which validation ran.","Mention any skipped checks, residual risk, or follow-up work clearly.","Leave unrelated user changes untouched."]))}),U1({id:"if-stuck",title:"If you're stuck",sourceSection:"stuck",detectionPatterns:["## If You're Stuck","if you're stuck","error handling","debugging posture"],suggestedMarkdown:y$("If You're Stuck","State the blocker, what you tried, and the exact error or missing context. Prefer a small question or documented assumption over guessing.")}),U1({id:"claude-specific",title:"Claude-specific additions",sourceSection:"claude-only",detectionPatterns:["## Claude Code","claude-specific","plan mode"],suggestedMarkdown:y$("Claude Code",t9(["Keep root `CLAUDE.md` concise and stable; put detailed generated resources in their channel folders.","Use Claude project memory for durable repository guidance, not temporary task status.","Avoid duplicating generated Playbook skills, agents, hooks, or commands in this file."]))})]}function U1($){return{id:$.id,title:$.title,appliesTo:(Q)=>WG(Q,$.sourceSection).length>0,detectionPatterns:(Q)=>[...$.detectionPatterns,...Vb(WG(Q,$.sourceSection))],suggestedMarkdown:$.suggestedMarkdown,exampleMarkdown:$.suggestedMarkdown}}function YG($){return $.agentsMdTargets.has(O_)}function _b($){return $.topics.some((Q)=>Q.name===Wb)}function WG($,Q){return $.agentsMdTargets.get(O_)?.sections.get(Q)??Ub}function y$($,Q){return`## ${$}
785
838
 
786
- ${Q.trim()}`}function MW($){return $.map((Q,Z)=>`${Z+1}. ${Q}`).join(`
787
- `)}function O8($){return $.map((Q)=>`- ${Q}`).join(`
788
- `)}function $R($){return $.body.replace(/\n/g," ").trim()}function QR($){return $.map((Q)=>$R(Q).slice(0,100)).filter((Q)=>Q.length>=20)}async function kY($){let Q={filesWritten:[],warnings:[],missing:[],accepted:[],skipped:[]},Z=YR($.specs,$.channelIds);for(let X of Z)await JR(X,$,Q);return Q}async function JR($,Q,Z){let X=UR(Q.cwd,$.targetPath),U=ZR(X)?XR(X,"utf8"):"",J=$.createItems(Q.context).filter((z)=>z.suggestedMarkdown.trim().length>0),W=GR(U,J);if(W.length===0)return;for(let z of W)Z.missing.push({specId:$.id,itemId:z.id,targetPath:X});if(Q.dryRun||!Q.interactive){Z.warnings.push(HR($,W));return}let Y=[];for(let z of W)await WR(z,$,X,Q,Z,Y);if(Y.length===0)return;let G=VR(U,Y);$$(X,G,!1),Z.filesWritten.push(X)}async function WR($,Q,Z,X,U,J){let W=zR($,await(X.confirmItem??OR)({spec:Q,item:$,targetPath:Z}));if(W.action===A$.APPEND)J.push(W.markdown),U.accepted.push({specId:Q.id,itemId:$.id,targetPath:Z,source:W.source});else if(U.skipped.push({specId:Q.id,itemId:$.id,targetPath:Z}),W.action===A$.CANCEL)U.warnings.push(`ADVISORY_FILE_CANCELLED: skipped ${$.title} for ${Q.targetPath}.`)}function YR($,Q){let Z=new Set(Q);return $.filter((X)=>X.channelIds.some((U)=>Z.has(U)))}function GR($,Q){return Q.filter((Z)=>!_R($,Z))}function zR($,Q){if(Q===!0)return{action:A$.APPEND,markdown:$.suggestedMarkdown,source:"suggested"};if(Q===!1)return{action:A$.SKIP};if(Q===A$.CANCEL)return{action:A$.CANCEL};if(Q.action===A$.APPEND){let Z=(Q.markdown??$.suggestedMarkdown).trim();if(!Z)return{action:A$.SKIP};return{action:A$.APPEND,markdown:Z,source:Q.source??(Q.markdown?"custom":"suggested")}}return{action:Q.action}}function _R($,Q){let Z=jW($);return Q.detectionPatterns.some((X)=>{if(typeof X==="string")return Z.includes(jW(X));return X.lastIndex=0,X.test($)})}function VR($,Q){let Z=Q.map((U)=>U.trim()).filter(Boolean).join(`
839
+ ${Q.trim()}`}function UG($){return $.map((Q,Z)=>`${Z+1}. ${Q}`).join(`
840
+ `)}function t9($){return $.map((Q)=>`- ${Q}`).join(`
841
+ `)}function Hb($){return $.body.replace(/\n/g," ").trim()}function Vb($){return $.map((Q)=>Hb(Q).slice(0,100)).filter((Q)=>Q.length>=20)}async function T_($){let Q={filesWritten:[],warnings:[],missing:[],accepted:[],skipped:[]},Z=Ob($.specs,$.channelIds);for(let X of Z)await Ab(X,$,Q);return Q}async function Ab($,Q,Z){let X=Bb(Q.cwd,$.targetPath),Y=qb(X)?Kb(X,"utf8"):"",W=$.createItems(Q.context).filter((_)=>_.suggestedMarkdown.trim().length>0),U=zb(Y,W);if(U.length===0)return;for(let _ of U)Z.missing.push({specId:$.id,itemId:_.id,targetPath:X});if(Q.dryRun||!Q.interactive){Z.warnings.push(Cb($,U));return}let J=[];for(let _ of U)await Lb(_,$,X,Q,Z,J);if(J.length===0)return;let G=Eb(Y,J);$$(X,G,!1),Z.filesWritten.push(X)}async function Lb($,Q,Z,X,Y,W){let U=jb($,await(X.confirmItem??Fb)({spec:Q,item:$,targetPath:Z}));if(U.action===F$.APPEND)W.push(U.markdown),Y.accepted.push({specId:Q.id,itemId:$.id,targetPath:Z,source:U.source});else if(Y.skipped.push({specId:Q.id,itemId:$.id,targetPath:Z}),U.action===F$.CANCEL)Y.warnings.push(`ADVISORY_FILE_CANCELLED: skipped ${$.title} for ${Q.targetPath}.`)}function Ob($,Q){let Z=new Set(Q);return $.filter((X)=>X.channelIds.some((Y)=>Z.has(Y)))}function zb($,Q){return Q.filter((Z)=>!Tb($,Z))}function jb($,Q){if(Q===!0)return{action:F$.APPEND,markdown:$.suggestedMarkdown,source:"suggested"};if(Q===!1)return{action:F$.SKIP};if(Q===F$.CANCEL)return{action:F$.CANCEL};if(Q.action===F$.APPEND){let Z=(Q.markdown??$.suggestedMarkdown).trim();if(!Z)return{action:F$.SKIP};return{action:F$.APPEND,markdown:Z,source:Q.source??(Q.markdown?"custom":"suggested")}}return{action:Q.action}}function Tb($,Q){let Z=JG($);return Q.detectionPatterns.some((X)=>{if(typeof X==="string")return Z.includes(JG(X));return X.lastIndex=0,X.test($)})}function Eb($,Q){let Z=Q.map((Y)=>Y.trim()).filter(Boolean).join(`
789
842
 
790
843
  `);if(!Z)return $;if(!$)return`${Z}
791
844
  `;let X=$.endsWith(`
@@ -795,93 +848,93 @@ ${Q.trim()}`}function MW($){return $.map((Q,Z)=>`${Z+1}. ${Q}`).join(`
795
848
  `:`
796
849
 
797
850
  `;return`${$}${X}${Z}
798
- `}function HR($,Q){let Z=Q.map((X)=>X.title).join(", ");return`ADVISORY_FILE_MISSING: ${$.targetPath} is missing ${Q.length} suggested item${Q.length===1?"":"s"}: ${Z}. Run interactively to add accepted suggestions.`}async function OR($){let{isCancel:Q,note:Z,select:X,text:U}=await import("@clack/prompts");Z(`Example suggestion. You can append it, write your own content, or skip it.
851
+ `}function Cb($,Q){let Z=Q.map((X)=>X.title).join(", ");return`ADVISORY_FILE_MISSING: ${$.targetPath} is missing ${Q.length} suggested item${Q.length===1?"":"s"}: ${Z}. Run interactively to add accepted suggestions.`}async function Fb($){let{isCancel:Q,note:Z,select:X,text:Y}=await import("@clack/prompts");Z(`Example suggestion. You can append it, write your own content, or skip it.
799
852
 
800
- ${KR($.item.exampleMarkdown??$.item.suggestedMarkdown)}`,`Suggested ${$.spec.title}: ${$.item.title}`);let J=await X({message:`How should ${$.item.title} be handled in ${$.spec.targetPath}?`,initialValue:"skip",options:[{value:"append",label:"Append suggested content",hint:"Use the suggested Markdown exactly."},{value:"custom",label:"Write my own text",hint:"Append custom Markdown for this section."},{value:"skip",label:"Skip",hint:"Leave this file unchanged."}]});if(Q(J))return A$.CANCEL;if(J===A$.SKIP)return{action:A$.SKIP};if(J===A$.APPEND)return{action:A$.APPEND,source:"suggested"};let W=await U({message:`Markdown to append to ${$.spec.targetPath}:`,placeholder:$.item.suggestedMarkdown,validate:(Y)=>{if(!Y?.trim())return"Enter Markdown to append, or cancel to skip.";return}});if(Q(W))return"cancel";return{action:"append",markdown:W.trim(),source:"custom"}}function KR($){let Q=$.trim().split(`
853
+ ${Mb($.item.exampleMarkdown??$.item.suggestedMarkdown)}`,`Suggested ${$.spec.title}: ${$.item.title}`);let W=await X({message:`How should ${$.item.title} be handled in ${$.spec.targetPath}?`,initialValue:"skip",options:[{value:"append",label:"Append suggested content",hint:"Use the suggested Markdown exactly."},{value:"custom",label:"Write my own text",hint:"Append custom Markdown for this section."},{value:"skip",label:"Skip",hint:"Leave this file unchanged."}]});if(Q(W))return F$.CANCEL;if(W===F$.SKIP)return{action:F$.SKIP};if(W===F$.APPEND)return{action:F$.APPEND,source:"suggested"};let U=await Y({message:`Markdown to append to ${$.spec.targetPath}:`,placeholder:$.item.suggestedMarkdown,validate:(J)=>{if(!J?.trim())return"Enter Markdown to append, or cancel to skip.";return}});if(Q(U))return"cancel";return{action:"append",markdown:U.trim(),source:"custom"}}function Mb($){let Q=$.trim().split(`
801
854
  `);if(Q.length<=18)return $.trim();return[...Q.slice(0,18),"..."].join(`
802
- `)}function jW($){return $.toLowerCase().replace(/<!--[\s\S]*?-->/g," ").replace(/[`*_>#|[\]{}()"']/g," ").replace(/[.,:;!?]/g," ").replace(/\s+/g," ").trim()}function S7($=[]){let Q=new Set,Z=[];for(let X of[...S$.flatMap((U)=>U.gitignorePatterns),...$]){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function uY($,Q,Z=[],X=".gitignore"){let U=fY($,X),J=S7(Z),W=PY(U)?bY(U,"utf8"):"",Y=lY(W,J),G=Y!==W;if(G&&!Q)yY(U,Y,"utf8");return{path:U,updated:G,entries:J}}function dY($,Q,Z=[],X=[]){let U=new Map,J=jR(X,Z);if(J.length>0)U.set(qR,J);for(let W of AR){if(!X.includes(W.channelId))continue;let Y=MR(U,W.file);Y.push(...ER(W,Z)),U.set(W.file,F7(Y))}return[...U].map(([W,Y])=>CR($,Q,Y,W))}function MR($,Q){let Z=$.get(Q);if(Z===void 0)return[];return[...Z]}function jR($,Q){if($.length===0)return[];let Z=S7(Q);return F7([...hY,...$.flatMap(TR),...Z.flatMap(mY)])}function TR($){return LR[$]??BR}function mY($){let Q=$.trim();if(!Q||Q.startsWith("#"))return[];let Z=Q.startsWith("!")?Q.slice(1):Q,U=(Z.endsWith("/")?Z.slice(0,-1):Z).split("/").filter(Boolean);if(U.length<=1)return[TW(Z)];let J=[];for(let W=1;W<U.length;W+=1)J.push(`!${U.slice(0,W).join("/")}/`);return[...J,TW(Z)]}function ER($,Q){return F7([...hY,...$.allowEntries,...S7(Q).filter((Z)=>$.extraEntryPrefixes.some((X)=>Z.startsWith(X))).flatMap(mY)])}function TW($){return $.startsWith("!")?$:`!${$}`}function CR($,Q,Z,X){let U=fY($,X),J=PY(U)?bY(U,"utf8"):"",W=lY(J,[...Z]),Y=W!==J;if(Y&&!Q)yY(U,W,"utf8");return{path:U,updated:Y,entries:[...Z]}}function lY($,Q){let Z=SR(Q),X=new RegExp(`${lQ(vY)}\\n${lQ(xY)}[\\s\\S]*?${lQ(gY)}\\n?`,"m");if(X.test($))return $.replace(X,Z);let U=$===""||$.endsWith(`
855
+ `)}function JG($){return $.toLowerCase().replace(/<!--[\s\S]*?-->/g," ").replace(/[`*_>#|[\]{}()"']/g," ").replace(/[.,:;!?]/g," ").replace(/\s+/g," ").trim()}function M7($=[]){let Q=new Set,Z=[];for(let X of[...D$.flatMap((Y)=>Y.gitignorePatterns),...$]){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function N_($,Q,Z=[],X=".gitignore"){let Y=M_($,X),W=M7(Z),U=E_(Y)?C_(Y,"utf8"):"",J=k_(U,W),G=J!==U;if(G&&!Q)F_(Y,J,"utf8");return{path:Y,updated:G,entries:W}}function w_($,Q,Z=[],X=[]){let Y=new Map,W=wb(X,Z);if(W.length>0)Y.set(Sb,W);for(let U of Db){if(!X.includes(U.channelId))continue;let J=Nb(Y,U.file);J.push(...kb(U,Z)),Y.set(U.file,S7(J))}return[...Y].map(([U,J])=>Pb($,Q,J,U))}function Nb($,Q){let Z=$.get(Q);if(Z===void 0)return[];return[...Z]}function wb($,Q){if($.length===0)return[];let Z=M7(Q);return S7([...D_,...$.flatMap(bb),...Z.flatMap(b_)])}function bb($){return Rb[$]??Ib}function b_($){let Q=$.trim();if(!Q||Q.startsWith("#"))return[];let Z=Q.startsWith("!")?Q.slice(1):Q,Y=(Z.endsWith("/")?Z.slice(0,-1):Z).split("/").filter(Boolean);if(Y.length<=1)return[GG(Z)];let W=[];for(let U=1;U<Y.length;U+=1)W.push(`!${Y.slice(0,U).join("/")}/`);return[...W,GG(Z)]}function kb($,Q){return S7([...D_,...$.allowEntries,...M7(Q).filter((Z)=>$.extraEntryPrefixes.some((X)=>Z.startsWith(X))).flatMap(b_)])}function GG($){return $.startsWith("!")?$:`!${$}`}function Pb($,Q,Z,X){let Y=M_($,X),W=E_(Y)?C_(Y,"utf8"):"",U=k_(W,[...Z]),J=U!==W;if(J&&!Q)F_(Y,U,"utf8");return{path:Y,updated:J,entries:[...Z]}}function k_($,Q){let Z=fb(Q),X=new RegExp(`${pZ(S_)}\\n${pZ(I_)}[\\s\\S]*?${pZ(R_)}\\n?`,"m");if(X.test($))return $.replace(X,Z);let Y=$===""||$.endsWith(`
803
856
  `)?"":`
804
- `;return`${$}${U}${Z}`}function SR($){return[vY,xY,...$,gY,""].join(`
805
- `)}function F7($){let Q=new Set,Z=[];for(let X of $){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function lQ($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nY($){let Q=cY($,DR);if(!pY(Q))return{path:Q,indent:2,trailingNewline:!0};let Z=IR(Q,"utf8"),X=wR(Z),U=Z.endsWith(`
806
- `);try{let J=JSON.parse(Z);if(typeof J!=="object"||J===null||Array.isArray(J))return{path:Q,indent:X,trailingNewline:U};return{path:Q,settings:J,indent:X,trailingNewline:U}}catch{return{path:Q,indent:X,trailingNewline:U}}}function wR($){for(let Q of $.split(/\r?\n/)){let Z=/^(\s+)"/.exec(Q);if(Z?.[1])return Z[1].length}return 2}function iY($,Q,Z,X){RR($,`${JSON.stringify(Q,null,Z)}${X?`
807
- `:""}`,"utf8")}function kR($,Q,Z){let X=!1;for(let U of Q)if(!$[U])$[U]=!0,Z.push(U),X=!0;return X}function PR($,Q,Z){let X=!1;for(let U of Q)if(U in $)delete $[U],Z.push(U),X=!0;return X}function bR($){let{path:Q,settings:Z,indent:X,trailingNewline:U}=nY($);if(!Z&&pY(Q))return;let J=yR(Z),W=J["files.exclude"],Y=Object.hasOwn(J,"files.exclude");if(Y&&(typeof W!=="object"||W===null||Array.isArray(W)))return;return{settingsPath:Q,nextSettings:J,existing:Y?W:{},indent:X,trailingNewline:U}}function yR($){if($===void 0)return{};return $}function fR($,Q,Z,X,U){if(Q){if(!kR($.existing,Z,X))return!1;return $.nextSettings["files.exclude"]=$.existing,!0}if(!PR($.existing,Z,U))return!1;if(Object.keys($.existing).length===0)delete $.nextSettings["files.exclude"];else $.nextSettings["files.exclude"]=$.existing;return!0}function rY($,Q,Z,X){let U=[],J=[],W=Q.map((G)=>G.vscodeExcludePattern).filter((G)=>typeof G==="string");if(W.length===0)return{patternsAdded:U,patternsRemoved:J};let Y=bR($);if(!Y)return{patternsAdded:U,patternsRemoved:J};if(!fR(Y,Z,W,U,J))return{patternsAdded:U,patternsRemoved:J};if(!X)FR(cY($,".vscode"),{recursive:!0}),iY(Y.settingsPath,Y.nextSettings,Y.indent,Y.trailingNewline);return{patternsAdded:U,patternsRemoved:J}}function oY($,Q){let{path:Z,settings:X,indent:U,trailingNewline:J}=nY($);if(!X)return{associationsAdded:[]};let W=X["material-icon-theme.files.associations"],Y=Object.hasOwn(X,"material-icon-theme.files.associations");if(Y&&(typeof W!=="object"||W===null||Array.isArray(W)))return{associationsAdded:[]};let G=Y?W:{},z=[];for(let[_,V]of Object.entries(NR)){if(_ in G)continue;G[_]=V,z.push(_)}if(z.length===0)return{associationsAdded:z};if(!Q)X["material-icon-theme.files.associations"]=G,iY(Z,X,U,J);return{associationsAdded:z}}function hR($){return gR.includes($)}function $G($){return hR($.category)}function I8($){return sY.includes($.category)}function R8($){return tY.includes($.category)}function QG($){return eY.includes($.category)}function I7($){return!$G($)}function R7($,Q,Z){let X=eW(w8($),$),{dryRun:U}=Z,J=z1(process.cwd(),X.outputDir),W=[],Y=[],G=[];h$(J,U);let z=new Set;for(let _ of Q.filter(I7)){let V=l0(_,$),H=G0(V);z.add(H);let O=z1(J,H);h$(O,U);let K=SY(V.body),{mainContent:q,sections:B}=QY($Y(V,K,$),{addResourceLinks:!0}),F=ZY(V.references),T=`${P8({name:u$(V),description:V.description||V.title,metadata:V7(V)})}
857
+ `;return`${$}${Y}${Z}`}function fb($){return[S_,I_,...$,R_,""].join(`
858
+ `)}function S7($){let Q=new Set,Z=[];for(let X of $){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function pZ($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function y_($){let Q=f_($,gb);if(!P_(Q))return{path:Q,indent:2,trailingNewline:!0};let Z=xb(Q,"utf8"),X=ub(Z),Y=Z.endsWith(`
859
+ `);try{let W=JSON.parse(Z);if(typeof W!=="object"||W===null||Array.isArray(W))return{path:Q,indent:X,trailingNewline:Y};return{path:Q,settings:W,indent:X,trailingNewline:Y}}catch{return{path:Q,indent:X,trailingNewline:Y}}}function ub($){for(let Q of $.split(/\r?\n/)){let Z=/^(\s+)"/.exec(Q);if(Z?.[1])return Z[1].length}return 2}function x_($,Q,Z,X){vb($,`${JSON.stringify(Q,null,Z)}${X?`
860
+ `:""}`,"utf8")}function db($,Q,Z){let X=!1;for(let Y of Q)if(!$[Y])$[Y]=!0,Z.push(Y),X=!0;return X}function mb($,Q,Z){let X=!1;for(let Y of Q)if(Y in $)delete $[Y],Z.push(Y),X=!0;return X}function lb($){let{path:Q,settings:Z,indent:X,trailingNewline:Y}=y_($);if(!Z&&P_(Q))return;let W=pb(Z),U=W["files.exclude"],J=Object.hasOwn(W,"files.exclude");if(J&&(typeof U!=="object"||U===null||Array.isArray(U)))return;return{settingsPath:Q,nextSettings:W,existing:J?U:{},indent:X,trailingNewline:Y}}function pb($){if($===void 0)return{};return $}function cb($,Q,Z,X,Y){if(Q){if(!db($.existing,Z,X))return!1;return $.nextSettings["files.exclude"]=$.existing,!0}if(!mb($.existing,Z,Y))return!1;if(Object.keys($.existing).length===0)delete $.nextSettings["files.exclude"];else $.nextSettings["files.exclude"]=$.existing;return!0}function v_($,Q,Z,X){let Y=[],W=[],U=Q.map((G)=>G.vscodeExcludePattern).filter((G)=>typeof G==="string");if(U.length===0)return{patternsAdded:Y,patternsRemoved:W};let J=lb($);if(!J)return{patternsAdded:Y,patternsRemoved:W};if(!cb(J,Z,U,Y,W))return{patternsAdded:Y,patternsRemoved:W};if(!X)yb(f_($,".vscode"),{recursive:!0}),x_(J.settingsPath,J.nextSettings,J.indent,J.trailingNewline);return{patternsAdded:Y,patternsRemoved:W}}function g_($,Q){let{path:Z,settings:X,indent:Y,trailingNewline:W}=y_($);if(!X)return{associationsAdded:[]};let U=X["material-icon-theme.files.associations"],J=Object.hasOwn(X,"material-icon-theme.files.associations");if(J&&(typeof U!=="object"||U===null||Array.isArray(U)))return{associationsAdded:[]};let G=J?U:{},_=[];for(let[H,V]of Object.entries(hb)){if(H in G)continue;G[H]=V,_.push(H)}if(_.length===0)return{associationsAdded:_};if(!Q)X["material-icon-theme.files.associations"]=G,x_(Z,X,Y,W);return{associationsAdded:_}}function ob($){return ib.includes($)}function l_($){return ob($.category)}function V6($){return u_.includes($.category)}function q6($){return d_.includes($.category)}function p_($){return m_.includes($.category)}function I7($){return!l_($)}function tb($){let Q=N1($);if(c_(Q,"skill"),Q.split("-").some((X)=>sb.has(X)))throw Error(`Claude skill name "${Q}" uses a reserved word. Rename the Playbook topic before syncing Claude skills.`);return Q}function eb($){let Q=N1($);return c_(Q,"subagent"),Q}function c_($,Q){if(!ab.test($))throw Error(`Claude ${Q} name "${$}" must be 1-64 characters and contain only lowercase letters, numbers, and hyphens.`)}function R7($,Q,Z){let X=dG(A6($),$),{dryRun:Y}=Z,W=M1(process.cwd(),X.outputDir),U=[],J=[],G=[];n$(W,Y);let _=new Set;for(let H of Q.filter(I7)){let V=V2(H,$),q=N1(V);_.add(q);let K=M1(W,q);n$(K,Y);let B=K_(V.body),{mainContent:L,sections:O}=V7(mG(V,B,$),{addResourceLinks:!0}),S=lG(V.references),C=`${O6({name:Zk(V,$),description:V.description||V.title,metadata:H7(V)})}
808
861
 
809
- ${q}${F}
810
- `,R=z1(O,X7);$$(R,T,U),W.push(R);let k=new Set([X7]);for(let x of B){let y=`${x.name}.md`;k.add(y);let Y$=z1(O,y);$$(Y$,`${x.content}
811
- `,U),W.push(Y$)}if(V.references.length>0){let x=z1(O,D8);h$(x,U);for(let y of V.references){let Y$=`${xR(y.sourcePath,N8)}${N8}`;k.add(`${D8}/${Y$}`);let _0=z1(x,Y$);$$(_0,`${y.body}
812
- `,U),W.push(_0)}}Y.push(...dR(O,k,U))}Y.push(...f2(J,z,X.filePattern,U));for(let _ of X.legacyOutputDirs??uR)Y.push(...f2(z1(process.cwd(),_),new Set,X.filePattern,U));return{filesWritten:W,filesRemoved:Y,warnings:G}}function dR($,Q,Z){if(!aY($))return[];let X=[];for(let U of ZG($)){if(U===X7)continue;let J=z1($,U);if(U===D8){X.push(...mR(J,Q,Z));continue}if(!U.endsWith(N8))continue;if(Q.has(U))continue;if(X.push(J),!Z)Z7(J,{force:!0})}return X}function mR($,Q,Z){if(!aY($))return[];let X=[],U=[],J=ZG($);for(let W of J){let Y=`${D8}/${W}`,G=z1($,W);if(!W.endsWith(N8)||Q.has(Y)){U.push(W);continue}if(X.push(G),!Z)Z7(G,{force:!0})}if(U.length===0){if(X.push($),!Z)Z7($,{recursive:!0,force:!0})}return X}function ZG($){try{return vR($)}catch{return[]}}function d8($){return pR[$]}function XG($,Q){return d8($)?.features[Q]??!1}function aR($,Q){let Z=process.env[`SUMR_MODEL_${$.toUpperCase()}_${Q.toUpperCase()}`];return Z?.trim()?Z.trim():void 0}function w7($,Q){if(!$)return;let Z=d8(Q);if(!Z?.features.model)return;return aR(Q,$)??Z.models[$]}function sR($,Q=[]){let Z=Q.filter((U)=>$.has(U)),X=[...$].filter((U)=>!Q.includes(U)).sort();return[...Z,...X]}function tR($,Q){let Z=Q??[];return[...$&&$!==d2.FULL?iR[$]??[]:[],...Z]}function eR($,Q,Z){let X=Z??[];if(!$?.toolMap||!$.toolFormat)return!1;if(!Q&&X.length===0)return!1;if(Q===d2.FULL&&X.length===0)return!1;return!0}function $D($,Q){let Z=new Set;for(let X of Q)for(let U of $.toolMap?.[X]??[])Z.add(U);return Z}function QD($,Q){let Z={};for(let X of nR)if($.has(X))Z[X]="allow";else if(Q&&Q!==d2.FULL)Z[X]="deny";return{permission:Z}}function ZD($,Q){if(Q==="claude")return[...cR];return Object.values($.toolMap??{}).flat()}function UG($,Q,Z){let X=d8($);if(!eR(X,Q,Z))return{};let U=$D(X,tR(Q,Z));if(U.size===0)return{};if(X.toolFormat==="permission")return QD(U,Q);let J=sR(U,ZD(X,$));if(X.toolFormat==="array")return{tools:J};return{tools:J.join(", ")}}function XD($,Q){let Z=UG("claude",$,Q).tools;return typeof Z==="string"?Z:void 0}function UD($,Q){if(!$||!XG(Q,"sandbox"))return;return rR[$]}function JD($,Q,Z){if(!XG(Z,"reasoningEffort"))return;return $??(Q?oR[Q]:void 0)}function WD($,Q){let Z=d8($);if(!Z)return[];let X=[];for(let U of Object.keys(EW)){if(Z.features[U])continue;for(let J of EW[U])if(J in Q)X.push(J)}return X}function YD($){let Q={},Z=w7($.modelTier,"claude");if(Z)Q.model=Z;let X=XD($.access,$.tools);if(X)Q.tools=X;return Q}function GD($){let Q={},Z=w7($.modelTier,"codex");if(Z)Q.model=Z;let X=JD($.effort,$.modelTier,"codex");if(X)Q.model_reasoning_effort=X;let U=UD($.access,"codex");if(U)Q.sandbox_mode=U;return Q}function zD($,Q){let Z={},X=w7($.modelTier,Q);if(X)Z.model=X;return Object.assign(Z,UG(Q,$.access,$.tools)),Z}function K8($){return typeof $==="string"||typeof $==="boolean"||typeof $==="number"}function KD($){if(K8($))return!0;if(Array.isArray($))return $.every(K8);if(typeof $==="object"&&$!==null)return Object.values($).every((Q)=>K8(Q)||Array.isArray(Q)&&Q.every(K8));return!1}function WG($,Q){let Z={},X=$.channels?.[Q]??JG;for(let[U,J]of Object.entries(X)){if(U===OD)continue;if(KD(J))Z[U]=J}return Z}function qD($,Q,Z){let X=$.target?.trim()||G0($),U=VD(X),W=`${U.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==U)Z.push(`${Q} agent "${$.name}" target was normalized to "${W}".`);return W}function k7($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},U=Q.filter(I8),J=CW(process.cwd(),$.outputDir),W=new Set;if(U.length>0)h$(J,Z.dryRun);for(let Y of U){let G=l0(Y,$.channelId),z=qD(G,$.channelId,X.warnings);W.add(z);let _=WG(G,$.channelId),V={name:u$(G),description:G.description,...$.defaultProps??JG,...zD(G,$.channelId),..._,metadata:V7(G)},H=`${P8(V)}
862
+ ${L}${S}
863
+ `,D=M1(K,Z7);$$(D,C,Y),U.push(D);let k=new Set([Z7]);for(let u of O){let x=`${u.name}.md`;k.add(x);let V$=M1(K,x);$$(V$,`${u.content}
864
+ `,Y),U.push(V$)}if(V.references.length>0){let u=M1(K,K6);n$(u,Y);for(let x of V.references){let V$=`${rb(x.sourcePath,B6)}${B6}`;k.add(`${K6}/${V$}`);let D0=M1(u,V$);$$(D0,`${x.body}
865
+ `,Y),U.push(D0)}}J.push(...Xk(K,k,Y))}J.push(...W8(W,_,X.filePattern,Y));for(let H of X.legacyOutputDirs??Qk)J.push(...W8(M1(process.cwd(),H),new Set,X.filePattern,Y));return{filesWritten:U,filesRemoved:J,warnings:G}}function Zk($,Q){if(Q===$k)return tb($);return _1($)}function Xk($,Q,Z){if(!h_($))return[];let X=[];for(let Y of n_($)){if(Y===Z7)continue;let W=M1($,Y);if(Y===K6){X.push(...Yk(W,Q,Z));continue}if(!Y.endsWith(B6))continue;if(Q.has(Y))continue;if(X.push(W),!Z)Q7(W,{force:!0})}return X}function Yk($,Q,Z){if(!h_($))return[];let X=[],Y=[],W=n_($);for(let U of W){let J=`${K6}/${U}`,G=M1($,U);if(!U.endsWith(B6)||Q.has(J)){Y.push(U);continue}if(X.push(G),!Z)Q7(G,{force:!0})}if(Y.length===0){if(X.push($),!Z)Q7($,{recursive:!0,force:!0})}return X}function n_($){try{return nb($)}catch{return[]}}function I6($){return Uk[$]}function r_($,Q){return I6($)?.features[Q]??!1}function qk($,Q){let Z=process.env[`SUMR_MODEL_${$.toUpperCase()}_${Q.toUpperCase()}`];return Z?.trim()?Z.trim():void 0}function w7($,Q){if(!$)return;let Z=I6(Q);if(!Z?.features.model)return;return qk(Q,$)??Z.models[$]}function Kk($,Q=[]){let Z=Q.filter((Y)=>$.has(Y)),X=[...$].filter((Y)=>!Q.includes(Y)).sort();return[...Z,...X]}function Bk($,Q){let Z=Q??[];return[...$&&$!==V8.FULL?_k[$]??[]:[],...Z]}function Ak($,Q,Z){let X=Z??[];if(!$?.toolMap||!$.toolFormat)return!1;if(!Q&&X.length===0)return!1;if(Q===V8.FULL&&X.length===0)return!1;return!0}function Lk($,Q){let Z=new Set;for(let X of Q)for(let Y of $.toolMap?.[X]??[])Z.add(Y);return Z}function Ok($,Q){let Z={};for(let X of Gk)if($.has(X))Z[X]="allow";else if(Q&&Q!==V8.FULL)Z[X]="deny";return{permission:Z}}function zk($,Q){if(Q==="claude")return[...Jk];return Object.values($.toolMap??{}).flat()}function i_($,Q,Z){let X=I6($);if(!Ak(X,Q,Z))return{};let Y=Lk(X,Bk(Q,Z));if(Y.size===0)return{};if(X.toolFormat==="permission")return Ok(Y,Q);let W=Kk(Y,zk(X,$));if(X.toolFormat==="array")return{tools:W};return{tools:W.join(", ")}}function jk($,Q){let Z=i_("claude",$,Q).tools;return typeof Z==="string"?Z:void 0}function Tk($,Q){if(!$||!r_(Q,"sandbox"))return;return Hk[$]}function Ek($,Q,Z){if(!r_(Z,"reasoningEffort"))return;return $??(Q?Vk[Q]:void 0)}function Ck($,Q){let Z=I6($);if(!Z)return[];let X=[];for(let Y of Object.keys(_G)){if(Z.features[Y])continue;for(let W of _G[Y])if(W in Q)X.push(W)}return X}function Fk($){let Q={},Z=w7($.modelTier,"claude");if(Z)Q.model=Z;let X=jk($.access,$.tools);if(X)Q.tools=X;return Q}function Mk($){let Q={},Z=w7($.modelTier,"codex");if(Z)Q.model=Z;let X=Ek($.effort,$.modelTier,"codex");if(X)Q.model_reasoning_effort=X;let Y=Tk($.access,"codex");if(Y)Q.sandbox_mode=Y;if($.nicknames?.length)Q.nickname_candidates=$.nicknames;return Q}function Sk($,Q){let Z={},X=w7($.modelTier,Q);if(X)Z.model=X;return Object.assign(Z,i_(Q,$.access,$.tools)),Z}function e9($){return typeof $==="string"||typeof $==="boolean"||typeof $==="number"}function wk($){if(e9($))return!0;if(Array.isArray($))return $.every(e9);if(typeof $==="object"&&$!==null)return Object.values($).every((Q)=>e9(Q)||Array.isArray(Q)&&Q.every(e9));return!1}function a_($,Q){let Z={},X=$.channels?.[Q]??o_;for(let[Y,W]of Object.entries(X)){if(Y===Nk)continue;if(wk(W))Z[Y]=W}return Z}function bk($,Q,Z){let X=$.target?.trim()||N1($),Y=Rk(X),U=`${Y.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==Y)Z.push(`${Q} agent "${$.name}" target was normalized to "${U}".`);return U}function b7($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},Y=Q.filter(V6),W=HG(process.cwd(),$.outputDir),U=new Set;if(Y.length>0)n$(W,Z.dryRun);for(let J of Y){let G=V2(J,$.channelId),_=bk(G,$.channelId,X.warnings);U.add(_);let H=a_(G,$.channelId),V={name:_1(G),description:G.description,...$.defaultProps??o_,...Sk(G,$.channelId),...H,metadata:H7(G)},q=`${O6(V)}
813
866
 
814
- ${HD}
867
+ ${Dk}
815
868
 
816
869
  ${G.body.trim()}
817
- `,O=CW(J,z);$$(O,H,Z.dryRun),X.filesWritten.push(O)}return X.filesRemoved.push(...f2(J,W,$.generatedFilePattern,Z.dryRun)),X}function P7(...$){return{filesWritten:$.flatMap((Q)=>Q.filesWritten),filesRemoved:$.flatMap((Q)=>Q.filesRemoved),warnings:$.flatMap((Q)=>Q.warnings)}}function MD($){return`"$CLAUDE_PROJECT_DIR"/.claude/hooks/${$}`}function SW($){let Q={type:"command",command:MD($.fileName)};if($.topic.timeout!==void 0)Q.timeout=$.topic.timeout;if($.topic.statusMessage)Q.statusMessage=$.topic.statusMessage;let Z={hooks:[Q]};if($.topic.matcher)Z.matcher=$.topic.matcher;return Z}function jD($,Q){if(!BD($))return{};try{let Z=JSON.parse(LD($,"utf8"));if(typeof Z==="object"&&Z!==null&&!Array.isArray(Z))return Z;Q.warnings.push(".claude/settings.json is not a JSON object; preserving the file and skipping generated hook settings.");return}catch{Q.warnings.push(".claude/settings.json could not be parsed as JSON; preserving the file and skipping generated hook settings.")}return}function TD($,Q){let Z=CD($.hooks)?$.hooks:{},X={};for(let[U,J]of Object.entries(Z)){if(!Array.isArray(J))continue;let W=[];for(let Y of J){if(!b7(Y))continue;let G=SD(Y,Q);if(G)W.push(G)}if(W.length>0)X[U]=W}return X}function ED($,Q,Z,X){let U=AD(process.cwd(),".claude","settings.json"),J=jD(U,X);if(!J)return;let W=new Set([...Q,...$.map((z)=>z.fileName)]),Y=TD(J,W);for(let z of $){let _=Y[z.event];if(_)_.push(SW(z));else Y[z.event]=[SW(z)]}if(Object.keys(Y).length===0){if("hooks"in J)delete J.hooks,$$(U,`${JSON.stringify(J,null,4)}
818
- `,Z.dryRun),X.filesWritten.push(U);return}let G={...J,hooks:Y};$$(U,`${JSON.stringify(G,null,4)}
819
- `,Z.dryRun),X.filesWritten.push(U)}function b7($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function CD($){return b7($)}function SD($,Q){if(!Array.isArray($.hooks))return;let Z=$.hooks.filter((X)=>{if(!b7(X))return!0;let U=X.command;if(typeof U!=="string")return!0;return!FD(U,Q)});if(Z.length===0)return;return{...$,hooks:Z}}function FD($,Q){for(let Z of Q)if($.includes(`.claude/hooks/${Z}`))return!0;return/[./]\.claude\/hooks\/[^"'\s]+/.test($)}function kD($,Q){let Z=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let X of $.matchAll(Z)){let U=IW(X,1).toLowerCase();if(Q.includes(U))return{lang:U,content:IW(X,2).trim()}}return null}function IW($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function PD($,Q,Z){let X=`${G0($)}.${Q}`,U=$.target?.trim()||X,J=N7(U);if(J!==U)Z.push(`Claude hook "${$.name}" target was normalized to "${J}" to keep output inside the managed directory.`);return J.endsWith(`.${Q}`)?J:`${J}.${Q}`}function bD($,Q){let Z=$.trim();if(Z.startsWith("#!")){let X=Z.indexOf(`
820
- `),U=X===-1?Z:Z.slice(0,X),J=X===-1?"":Z.slice(X+1).trimStart();if(J.startsWith("# Generated by SUMR Playbook"))return`${Z}
821
- `;return`${U}
822
- ${FW}${J}${J.endsWith(`
870
+ `,K=HG(W,_);$$(K,q,Z.dryRun),X.filesWritten.push(K)}return X.filesRemoved.push(...W8(W,U,$.generatedFilePattern,Z.dryRun)),X}function k7(...$){return{filesWritten:$.flatMap((Q)=>Q.filesWritten),filesRemoved:$.flatMap((Q)=>Q.filesRemoved),warnings:$.flatMap((Q)=>Q.warnings)}}function yk($){return`"$CLAUDE_PROJECT_DIR"/.claude/hooks/${$}`}function VG($){let Q={type:"command",command:yk($.fileName)};if($.topic.timeout!==void 0)Q.timeout=$.topic.timeout;if($.topic.statusMessage)Q.statusMessage=$.topic.statusMessage;let Z={hooks:[Q]};if($.topic.matcher)Z.matcher=$.topic.matcher;return Z}function xk($,Q){if(!kk($))return{};try{let Z=JSON.parse(Pk($,"utf8"));if(typeof Z==="object"&&Z!==null&&!Array.isArray(Z))return Z;Q.warnings.push(".claude/settings.json is not a JSON object; preserving the file and skipping generated hook settings.");return}catch{Q.warnings.push(".claude/settings.json could not be parsed as JSON; preserving the file and skipping generated hook settings.")}return}function vk($,Q){let Z=hk($.hooks)?$.hooks:{},X={};for(let[Y,W]of Object.entries(Z)){if(!Array.isArray(W))continue;let U=[];for(let J of W){if(!P7(J))continue;let G=uk(J,Q);if(G)U.push(G)}if(U.length>0)X[Y]=U}return X}function gk($,Q,Z,X){let Y=fk(process.cwd(),".claude","settings.json"),W=xk(Y,X);if(!W)return;let U=new Set([...Q,...$.map((_)=>_.fileName)]),J=vk(W,U);for(let _ of $){let H=J[_.event];if(H)H.push(VG(_));else J[_.event]=[VG(_)]}if(Object.keys(J).length===0){if("hooks"in W)delete W.hooks,$$(Y,`${JSON.stringify(W,null,4)}
871
+ `,Z.dryRun),X.filesWritten.push(Y);return}let G={...W,hooks:J};$$(Y,`${JSON.stringify(G,null,4)}
872
+ `,Z.dryRun),X.filesWritten.push(Y)}function P7($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function hk($){return P7($)}function uk($,Q){if(!Array.isArray($.hooks))return;let Z=$.hooks.filter((X)=>{if(!P7(X))return!0;let Y=X.command;if(typeof Y!=="string")return!0;return!dk(Y,Q)});if(Z.length===0)return;return{...$,hooks:Z}}function dk($,Q){for(let Z of Q)if($.includes(`.claude/hooks/${Z}`))return!0;return/[./]\.claude\/hooks\/[^"'\s]+/.test($)}function rk($,Q){let Z=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let X of $.matchAll(Z)){let Y=KG(X,1).toLowerCase();if(Q.includes(Y))return{lang:Y,content:KG(X,2).trim()}}return null}function KG($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function ik($,Q,Z){let X=`${N1($)}.${Q}`,Y=$.target?.trim()||X,W=N7(Y);if(W!==Y)Z.push(`Claude hook "${$.name}" target was normalized to "${W}" to keep output inside the managed directory.`);return W.endsWith(`.${Q}`)?W:`${W}.${Q}`}function ok($,Q){let Z=$.trim();if(Z.startsWith("#!")){let X=Z.indexOf(`
873
+ `),Y=X===-1?Z:Z.slice(0,X),W=X===-1?"":Z.slice(X+1).trimStart();if(W.startsWith("# Generated by SUMR Playbook"))return`${Z}
874
+ `;return`${Y}
875
+ ${qG}${W}${W.endsWith(`
823
876
  `)?"":`
824
877
  `}`}return`${Q}
825
- ${FW}${Z}
826
- `}function _G($){return/^#!.*\r?\n# Generated by SUMR Playbook/.test($)}function yD($,Q,Z){if(!x8($))return[];let X=[];for(let U of g8($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;let J=u8(U.name);if(!zG.has(J))continue;let W=C$($,U.name),Y;try{Y=h8(W,"utf8")}catch{continue}if(!_G(Y))continue;if(X.push(W),!Z)D7(W,{force:!0})}return X}function fD($){let Q=new Set;if(!x8($))return Q;for(let Z of g8($,{withFileTypes:!0})){if(!Z.isFile())continue;let X=u8(Z.name);if(!zG.has(X))continue;try{if(_G(h8(C$($,Z.name),"utf8")))Q.add(Z.name)}catch{}}return Q}function vD($,Q,Z){if(!x8($))return[];let X=[];for(let U of g8($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;if(u8(U.name)!==GG)continue;let J=C$($,U.name),W;try{W=h8(J,"utf8")}catch{continue}if(!xD(W))continue;if(X.push(J),!Z)D7(J,{force:!0})}return X}function xD($){return $.includes(YG)}function gD($,Q,Z){if(!x8($))return[];let X=[];for(let U of g8($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;if(u8(U.name)!==GG)continue;let J=C$($,U.name),W;try{W=h8(J,"utf8")}catch{continue}if(!W.includes(YG))continue;if(X.push(J),!Z)D7(J,{force:!0})}return X}function hD($,Q,Z){let X=kD($.body,_D);if(!X)return Z.warnings.push(`Claude hook "${$.name}" has no recognized code-fenced block (bash, sh, python, js, ts); skipped.`),null;if(!$.event?.trim())return Z.warnings.push(`Claude hook "${$.name}" is missing event frontmatter; skipped.`),null;let U=ND[X.lang],J=wD[X.lang],W=PD($,U,Z.warnings),Y=C$(process.cwd(),".claude","hooks",W);if($$(Y,bD(X.content,J),Q.dryRun),!Q.dryRun)try{lR(Y,493)}catch{}return Z.filesWritten.push(Y),{topic:$,fileName:W,event:$.event}}function uD($,Q,Z){let X=$.target?.trim()||G0($),U=N7(X),W=`${U.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==U)Z.warnings.push(`Claude subagent "${$.name}" target was normalized to "${W}".`);let Y=WG($,"claude"),z=`${P8({name:u$($),description:$.description,...YD($),...Y})}
878
+ ${qG}${Z}
879
+ `}function $H($){return/^#!.*\r?\n# Generated by SUMR Playbook/.test($)}function ak($,Q,Z){if(!C6($))return[];let X=[];for(let Y of F6($,{withFileTypes:!0})){if(!Y.isFile())continue;if(Q.has(Y.name))continue;let W=S6(Y.name);if(!e_.has(W))continue;let U=R$($,Y.name),J;try{J=M6(U,"utf8")}catch{continue}if(!$H(J))continue;if(X.push(U),!Z)D7(U,{force:!0})}return X}function sk($){let Q=new Set;if(!C6($))return Q;for(let Z of F6($,{withFileTypes:!0})){if(!Z.isFile())continue;let X=S6(Z.name);if(!e_.has(X))continue;try{if($H(M6(R$($,Z.name),"utf8")))Q.add(Z.name)}catch{}}return Q}function tk($,Q,Z){if(!C6($))return[];let X=[];for(let Y of F6($,{withFileTypes:!0})){if(!Y.isFile())continue;if(Q.has(Y.name))continue;if(S6(Y.name)!==t_)continue;let W=R$($,Y.name),U;try{U=M6(W,"utf8")}catch{continue}if(!ek(U))continue;if(X.push(W),!Z)D7(W,{force:!0})}return X}function ek($){return $.includes(s_)}function $P($,Q,Z){if(!C6($))return[];let X=[];for(let Y of F6($,{withFileTypes:!0})){if(!Y.isFile())continue;if(Q.has(Y.name))continue;if(S6(Y.name)!==t_)continue;let W=R$($,Y.name),U;try{U=M6(W,"utf8")}catch{continue}if(!U.includes(s_))continue;if(X.push(W),!Z)D7(W,{force:!0})}return X}function QP($,Q,Z){let X=rk($.body,Ik);if(!X)return Z.warnings.push(`Claude hook "${$.name}" has no recognized code-fenced block (bash, sh, python, js, ts); skipped.`),null;if(!$.event?.trim())return Z.warnings.push(`Claude hook "${$.name}" is missing event frontmatter; skipped.`),null;let Y=ck[X.lang],W=nk[X.lang],U=ik($,Y,Z.warnings),J=R$(process.cwd(),".claude","hooks",U);if($$(J,ok(X.content,W),Q.dryRun),!Q.dryRun)try{Wk(J,493)}catch{}return Z.filesWritten.push(J),{topic:$,fileName:U,event:$.event}}function ZP($,Q,Z){let X=$.target?.trim()||N1($),Y=N7(X),U=`${Y.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==Y)Z.warnings.push(`Claude subagent "${$.name}" target was normalized to "${U}".`);let J=a_($,"claude");delete J.name;let _=`${O6({name:eb($),description:$.description,...Fk($),...J})}
827
880
 
828
- ${ID}
881
+ ${mk}
829
882
 
830
883
  ${$.body.trim()}
831
- `,_=C$(process.cwd(),".claude","agents",W);return $$(_,z,Q.dryRun),Z.filesWritten.push(_),W}function dD($,Q,Z){let X=$.target?.trim()||G0($),U=N7(X),W=`${U.replace(/\.md$/i,"")}.md`;if(X!==U)Z.warnings.push(`Claude workflow "${$.name}" target was normalized to "${W}".`);let Y=$.channels?.claude??DD,G={description:$.description};for(let[H,O]of[["model","model"],["argumentHint","argument-hint"],["argument_hint","argument-hint"],["argument-hint","argument-hint"],["allowedTools","allowed-tools"],["allowed_tools","allowed-tools"],["allowed-tools","allowed-tools"]]){let K=Y[H];if(typeof K==="string"&&K.trim())G[O]=K}let z=["---"];for(let[H,O]of Object.entries(G))z.push(`${H}: ${JSON.stringify(O)}`);z.push("---");let _=`${z.join(`
884
+ `,H=R$(process.cwd(),".claude","agents",U);return $$(H,_,Q.dryRun),Z.filesWritten.push(H),U}function XP($,Q,Z){let X=$.target?.trim()||N1($),Y=N7(X),U=`${Y.replace(/\.md$/i,"")}.md`;if(X!==Y)Z.warnings.push(`Claude workflow "${$.name}" target was normalized to "${U}".`);let J=$.channels?.claude??pk,G={description:$.description};for(let[q,K]of[["model","model"],["argumentHint","argument-hint"],["argument_hint","argument-hint"],["argument-hint","argument-hint"],["allowedTools","allowed-tools"],["allowed_tools","allowed-tools"],["allowed-tools","allowed-tools"]]){let B=J[q];if(typeof B==="string"&&B.trim())G[K]=B}let _=["---"];for(let[q,K]of Object.entries(G))_.push(`${q}: ${JSON.stringify(K)}`);_.push("---");let H=`${_.join(`
832
885
  `)}
833
886
 
834
- ${RD}
887
+ ${lk}
835
888
 
836
889
  ${$.body.trim()}
837
- `,V=C$(process.cwd(),".claude","commands",W);return $$(V,_,Q.dryRun),Z.filesWritten.push(V),W}function mD($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=$.map((H)=>l0(H,"claude")).filter($G),U=X.filter(I8),J=X.filter(R8),W=X.filter(QG);if(U.length===0&&J.length===0&&W.length===0)return Z;h$(C$(process.cwd(),".claude"),Q.dryRun);let Y=C$(process.cwd(),".claude","hooks");if(J.length>0)h$(Y,Q.dryRun);if(U.length>0)h$(C$(process.cwd(),".claude","agents"),Q.dryRun);if(W.length>0)h$(C$(process.cwd(),".claude","commands"),Q.dryRun);let G=fD(Y),z=[];for(let H of J){let O=hD(H,Q,Z);if(O)z.push(O)}if(J.length>0||G.size>0)ED(z,G,Q,Z);let _=new Set;for(let H of U)_.add(uD(H,Q,Z));let V=new Set;for(let H of W)V.add(dD(H,Q,Z));return Z.filesRemoved.push(...yD(Y,new Set(z.map((H)=>H.fileName)),Q.dryRun)),Z.filesRemoved.push(...vD(C$(process.cwd(),".claude","agents"),_,Q.dryRun)),Z.filesRemoved.push(...gD(C$(process.cwd(),".claude","commands"),V,Q.dryRun)),Z}function lD($,Q){let Z=R7("claude",$,Q),X=mD($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function JN($,Q,Z=!0){let X=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g,U=[];for(let J of $.matchAll(X)){let W=d0(J,1).toLowerCase(),Y=d0(J,2);if(Q.includes(W))return Y.trim();U.push(Y.trim())}return Z?U[0]??null:null}function WN($){let Q=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let Z of $.matchAll(Q)){let X=d0(Z,1).toLowerCase();if($N.includes(X))return{lang:X,content:d0(Z,2).trim()}}return null}function d0($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function HG($,Q,Z){let X=`${G0($)}.${Q}`,U=$.target?.trim()||X,J=tD(U);if(J!==U)Z.push(`Codex resource "${$.name}" target was normalized to "${J}" to keep output inside the managed directory.`);return J.endsWith(`.${Q}`)?J:`${J}.${Q}`}function YN($=process.cwd()){let Q=GN($);return{syncCommand:Q,tomlHeader:`# Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`.
890
+ `,V=R$(process.cwd(),".claude","commands",U);return $$(V,H,Q.dryRun),Z.filesWritten.push(V),U}function YP($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=$.map((q)=>V2(q,"claude")).filter(l_),Y=X.filter(V6),W=X.filter(q6),U=X.filter(p_);if(Y.length===0&&W.length===0&&U.length===0)return Z;n$(R$(process.cwd(),".claude"),Q.dryRun);let J=R$(process.cwd(),".claude","hooks");if(W.length>0)n$(J,Q.dryRun);if(Y.length>0)n$(R$(process.cwd(),".claude","agents"),Q.dryRun);if(U.length>0)n$(R$(process.cwd(),".claude","commands"),Q.dryRun);let G=sk(J),_=[];for(let q of W){let K=QP(q,Q,Z);if(K)_.push(K)}if(W.length>0||G.size>0)gk(_,G,Q,Z);let H=new Set;for(let q of Y)H.add(ZP(q,Q,Z));let V=new Set;for(let q of U)V.add(XP(q,Q,Z));return Z.filesRemoved.push(...ak(J,new Set(_.map((q)=>q.fileName)),Q.dryRun)),Z.filesRemoved.push(...tk(R$(process.cwd(),".claude","agents"),H,Q.dryRun)),Z.filesRemoved.push(...$P(R$(process.cwd(),".claude","commands"),V,Q.dryRun)),Z}function WP($,Q){let Z=R7("claude",$,Q),X=YP($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function FP($,Q,Z=!0){let X=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g,Y=[];for(let W of $.matchAll(X)){let U=_2(W,1).toLowerCase(),J=_2(W,2);if(Q.includes(U))return J.trim();Y.push(J.trim())}return Z?Y[0]??null:null}function MP($){let Q=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let Z of $.matchAll(Q)){let X=_2(Z,1).toLowerCase();if(_P.includes(X))return{lang:X,content:_2(Z,2).trim()}}return null}function _2($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function ZH($,Q,Z){let X=`${N1($)}.${Q}`,Y=$.target?.trim()||X,W=OP(Y);if(W!==Y)Z.push(`Codex resource "${$.name}" target was normalized to "${W}" to keep output inside the managed directory.`);return W.endsWith(`.${Q}`)?W:`${W}.${Q}`}function SP($=process.cwd()){let Q=IP($);return{syncCommand:Q,tomlHeader:`# Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`.
838
891
  `,scriptHeader:`# Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`.
839
892
  `,markdownHeader:`<!-- Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`. -->
840
- `}}function GN($){let Q=eD($,"package.json");if(!aD(Q))return q8;try{let Z=JSON.parse(sD(Q,"utf8"));if(!DW(Z)||!DW(Z.scripts))return q8;let X=Z.scripts.sync;if(typeof X==="string"&&UN.test(X))return QN}catch{return q8}return q8}function DW($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function zN($,Q){let Z=$.trim();if(Z.startsWith(U7))return`${Z}
893
+ `}}function IP($){let Q=zP($,"package.json");if(!AP(Q))return $6;try{let Z=JSON.parse(LP(Q,"utf8"));if(!AG(Z)||!AG(Z.scripts))return $6;let X=Z.scripts.sync;if(typeof X==="string"&&CP.test(X))return jP}catch{return $6}return $6}function AG($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function RP($,Q){let Z=$.trim();if(Z.startsWith(X7))return`${Z}
841
894
  `;return`${Q.tomlHeader}${Z}
842
- `}function _N($,Q){let Z=$.trim();if(Z.startsWith(VG))return`${Z}
895
+ `}function DP($,Q){let Z=$.trim();if(Z.startsWith(QH))return`${Z}
843
896
  `;return`${Q.markdownHeader}
844
897
  ${Z}
845
- `}function VN($,Q,Z){let X=$.trim();if(X.startsWith("#!")){let U=X.indexOf(`
846
- `);if(U===-1)return`${X}
847
- ${Z.scriptHeader}`;let J=X.slice(0,U).trimEnd(),W=X.slice(U+1).trimStart();if(W.startsWith(U7))return`${X}
848
- `;return`${J}
849
- ${Z.scriptHeader}${W}
850
- `}if(X.startsWith(U7))return`${X}
898
+ `}function NP($,Q,Z){let X=$.trim();if(X.startsWith("#!")){let Y=X.indexOf(`
899
+ `);if(Y===-1)return`${X}
900
+ ${Z.scriptHeader}`;let W=X.slice(0,Y).trimEnd(),U=X.slice(Y+1).trimStart();if(U.startsWith(X7))return`${X}
901
+ `;return`${W}
902
+ ${Z.scriptHeader}${U}
903
+ `}if(X.startsWith(X7))return`${X}
851
904
  `;return`${Q}
852
905
  ${Z.scriptHeader}${X}
853
- `}function HN($){return $.startsWith(ZN)||$.startsWith(VG)||XN.test($)}function ON($){if(!RW.test($))return{content:$,stripped:!1};return{content:$.replace(RW,"").trimStart(),stripped:!0}}function KN($,Q,Z,X){if($.length===0)return!1;let U=oD(process.cwd(),".codex","AGENTS.md"),J;if(iD(U)){let W=rD(U,"utf8");if(!HN(W))return Z.warnings.push("Codex AGENTS.md exists and is not SUMR generated; leaving it untouched and not wiring model_instructions_file."),!1;J=W}return $$(U,_N(qN($,X,J),X),Q.dryRun),Z.filesWritten.push(U),!0}function qN($,Q,Z){let X=BN($,Z),U=X.map((Y)=>Y.name),J=["# SUMR Codex Agent Guide","","This file is generated from SUMR Playbook team-member docs. Use it as the Codex startup routing guide for generated SUMR agents.","","## Generated Resources","","- Skills live under `.agents/skills/sumr-*`.","- Agent profiles live under `.codex/agents/*.toml`.","- Generated resources are hidden and gitignored by design; inspect them with direct paths or `rg --hidden --files .codex .agents` before reporting they are absent.",`- Treat generated files as read-only outputs; edit the Playbook source docs and run \`${Q.syncCommand}\`.`,""],W=AN(U);if(W)J.push("## Quality Audit Orchestration","","When the user asks for `quality code`, `check quality code`, `review quality code`, `audit code`, `audit repo`, `quality audit`, `full repo audit`, or a `quality gate` report, treat that request as authorization to activate the generated SUMR audit team. Do not require the user to write a longer prompt or name the subagents.","","First load and apply the generated audit skill when it exists: `.agents/skills/sumr-devkit-code-audit/SKILL.md`.","","Do not invent scripts or tools such as `quality:agent`; inspect `package.json` and use the real module scripts.","","Use this flow when the current runtime exposes delegation tools:","",`1. Start \`${W.runner}\` for command evidence, standards coverage, managed-file drift, dependencies, secrets hygiene, and initial findings.`,`2. Start \`${W.reviewer}\` in parallel for read-only source review against SUMR standards.`,`3. Send both evidence sets to \`${W.qualityLead}\` for the final severity-based gate decision.`,"","If the runtime does not expose delegation tools, state `Delegation unavailable: <reason>` in the audit report, then run the same role sequence locally. Never silently skip the generated team.","","A quality audit is incomplete unless the report includes a `TypeScript & Engineering Principles` matrix. That matrix must cover explicit `any`, unsafe casts, interfaces/types in logic files, inline object types, TypeScript enums, string-union-only option sets, magic string comparisons, DRY duplicated concepts, file/function size, fallback chains, swallowed errors, validation boundaries, and schema/type duplication. If this evidence is missing, the gate is `Blocked`.","");J.push(OG,"","| Agent | Description |","| --- | --- |");for(let Y of X)J.push(`| \`${Y.name}\` | ${Y.description} |`);return J.join(`
854
- `)}function BN($,Q){let Z=$.map((J)=>({name:u$(J),description:MN(J.description)})),X=new Set(Z.map((J)=>J.name)),U=LN(Q).filter((J)=>!X.has(J.name));return[...Z,...U]}function LN($){if(!$)return[];let Q=$.indexOf(OG);if(Q===-1)return[];let Z=$.slice(Q).split(/\r?\n/),X=[];for(let U of Z){let J=U.match(/^\|\s*`([^`]+)`\s*\|\s*(.*?)\s*\|\s*$/);if(!J)continue;let W=d0(J,1).trim(),Y=d0(J,2).trim();if(!W||!Y)continue;X.push({name:W,description:Y})}return X}function AN($){let Q=pQ($,"code-audit-runner"),Z=pQ($,"codebase-reviewer"),X=pQ($,"quality-lead");if(!Q||!Z||!X)return null;return{runner:Q,reviewer:Z,qualityLead:X}}function pQ($,Q){return $.find((Z)=>Z===Q||Z===`sumr-${Q}`||Z.endsWith(`-${Q}`))}function MN($){return $.replace(/\|/g,"\\|").replace(/\r?\n/g," ").trim()}function m0($){return JSON.stringify($)}function TN($){return/^[A-Za-z0-9_-]+$/.test($)?$:JSON.stringify($)}function qG($){if(typeof $==="string")return m0($);if(typeof $==="boolean")return String($);if(typeof $==="number"&&Number.isFinite($))return String($);if(Array.isArray($)){let Q=$.map(qG);if(Q.some((Z)=>Z===null))return null;return`[${Q.join(", ")}]`}return null}function EN($){if($.includes("'''"))return m0($);return`'''
906
+ `}function wP($){return $.startsWith(TP)||$.startsWith(QH)||EP.test($)}function bP($){if(!BG.test($))return{content:$,stripped:!1};return{content:$.replace(BG,"").trimStart(),stripped:!0}}function kP($,Q,Z,X){if($.length===0)return!1;let Y=BP(process.cwd(),".codex","AGENTS.md"),W;if(qP(Y)){let U=KP(Y,"utf8");if(!wP(U))return Z.warnings.push("Codex AGENTS.md exists and is not SUMR generated; leaving it untouched and not wiring model_instructions_file."),!1;W=U}return $$(Y,DP(PP($,X,W),X),Q.dryRun),Z.filesWritten.push(Y),!0}function PP($,Q,Z){let X=fP($,Z),Y=X.map((J)=>J.name),W=["# SUMR Codex Agent Guide","","This file is generated from SUMR Playbook team-member docs. Use it as the Codex startup routing guide for generated SUMR agents.","","## Generated Resources","","- Skills live under `.agents/skills/sumr-*`.","- Agent profiles live under `.codex/agents/*.toml`.","- Generated resources are hidden and gitignored by design; inspect them with direct paths or `rg --hidden --files .codex .agents` before reporting they are absent.",`- Treat generated files as read-only outputs; edit the Playbook source docs and run \`${Q.syncCommand}\`.`,""],U=xP(Y);if(U)W.push("## Quality Audit Orchestration","","When the user asks for `quality code`, `check quality code`, `review quality code`, `audit code`, `audit repo`, `quality audit`, `full repo audit`, or a `quality gate` report, treat that request as authorization to activate the generated SUMR audit team. Do not require the user to write a longer prompt or name the subagents.","","First load and apply the generated audit skill when it exists: `.agents/skills/sumr-devkit-code-audit/SKILL.md`.","","Do not invent scripts or tools such as `quality:agent`; inspect `package.json` and use the real module scripts.","","Use this flow when the current runtime exposes delegation tools:","",`1. Start \`${U.runner}\` for command evidence, standards coverage, managed-file drift, dependencies, secrets hygiene, and initial findings.`,`2. Start \`${U.reviewer}\` in parallel for read-only source review against SUMR standards.`,`3. Send both evidence sets to \`${U.qualityLead}\` for the final severity-based gate decision.`,"","If the runtime does not expose delegation tools, state `Delegation unavailable: <reason>` in the audit report, then run the same role sequence locally. Never silently skip the generated team.","","A quality audit is incomplete unless the report includes a `TypeScript & Engineering Principles` matrix. That matrix must cover explicit `any`, unsafe casts, interfaces/types in logic files, inline object types, TypeScript enums, string-union-only option sets, magic string comparisons, DRY duplicated concepts, file/function size, fallback chains, swallowed errors, validation boundaries, and schema/type duplication. If this evidence is missing, the gate is `Blocked`.","");W.push(XH,"","| Agent | Description |","| --- | --- |");for(let J of X)W.push(`| \`${J.name}\` | ${J.description} |`);return W.join(`
907
+ `)}function fP($,Q){let Z=$.map((W)=>({name:_1(W),description:vP(W.description)})),X=new Set(Z.map((W)=>W.name)),Y=yP(Q).filter((W)=>!X.has(W.name));return[...Z,...Y]}function yP($){if(!$)return[];let Q=$.indexOf(XH);if(Q===-1)return[];let Z=$.slice(Q).split(/\r?\n/),X=[];for(let Y of Z){let W=Y.match(/^\|\s*`([^`]+)`\s*\|\s*(.*?)\s*\|\s*$/);if(!W)continue;let U=_2(W,1).trim(),J=_2(W,2).trim();if(!U||!J)continue;X.push({name:U,description:J})}return X}function xP($){let Q=cZ($,"code-audit-runner"),Z=cZ($,"codebase-reviewer"),X=cZ($,"quality-lead");if(!Q||!Z||!X)return null;return{runner:Q,reviewer:Z,qualityLead:X}}function cZ($,Q){return $.find((Z)=>Z===Q||Z===`sumr-${Q}`||Z.endsWith(`-${Q}`))}function vP($){return $.replace(/\|/g,"\\|").replace(/\r?\n/g," ").trim()}function H2($){return JSON.stringify($)}function hP($){return/^[A-Za-z0-9_-]+$/.test($)?$:JSON.stringify($)}function WH($){if(typeof $==="string")return H2($);if(typeof $==="boolean")return String($);if(typeof $==="number"&&Number.isFinite($))return String($);if(Array.isArray($)){let Q=$.map(WH);if(Q.some((Z)=>Z===null))return null;return`[${Q.join(", ")}]`}return null}function uP($){if($.includes("'''"))return H2($);return`'''
855
908
  ${$}
856
- '''`}function SN($,Q,Z){for(let[X,U]of CN){let J=Q[X];if(Z.add(X),typeof J==="string"&&J.trim())$.push(`${U} = ${m0(J)}`)}}function FN($,Q,Z){for(let[X,U]of Object.entries(Q)){if(Z.has(X))continue;let J=qG(U);if(J===null)continue;$.push(`${TN(X)} = ${J}`)}}function IN($,Q){let Z={...GD($),...$.channels?.codex??jN},X=typeof Z.name==="string"&&Z.name.trim()?Z.name:void 0,U=typeof Z.description==="string"&&Z.description.trim()?Z.description:void 0,J=[`${Q.trimEnd()}`,`name = ${m0(X??u$($))}`,`description = ${m0(U??$.description)}`],W=new Set(["name","description","developer_instructions"]);return SN(J,Z,W),FN(J,Z,W),J.push(`developer_instructions = ${EN($.body.trim())}`),`${J.join(`
909
+ '''`}function mP($,Q,Z){for(let[X,Y]of dP){let W=Q[X];if(Z.add(X),typeof W==="string"&&W.trim())$.push(`${Y} = ${H2(W)}`)}}function lP($,Q,Z){for(let[X,Y]of Object.entries(Q)){if(Z.has(X))continue;let W=WH(Y);if(W===null)continue;$.push(`${hP(X)} = ${W}`)}}function pP($,Q){let Z={...Mk($),...$.channels?.codex??gP},X=typeof Z.name==="string"&&Z.name.trim()?Z.name:void 0,Y=typeof Z.description==="string"&&Z.description.trim()?Z.description:void 0,W=[`${Q.trimEnd()}`,`name = ${H2(X??_1($))}`,`description = ${H2(Y??$.description)}`],U=new Set(["name","description","developer_instructions"]);return mP(W,Z,U),lP(W,Z,U),W.push(`developer_instructions = ${uP($.body.trim())}`),`${W.join(`
857
910
  `)}
858
- `}function RN($,Q,Z){let X=new RegExp(`^\\s*${k8(Q)}\\s*=`),U=$.findIndex((Y)=>X.test(Y));if(U>=0){$[U]=`${Q} = ${Z}`;return}let J=$.findIndex((Y)=>/^\s*\[[^\]]+\]\s*(?:#.*)?$/.test(Y));if(J===-1){if($.length>0&&$[$.length-1]?.trim())$.push("");$.push(`${Q} = ${Z}`);return}let W=[`${Q} = ${Z}`];if(J>0&&$[J-1]?.trim())W.push("");$.splice(J,0,...W)}function DN($,Q){let Z=$.split(/\r?\n/);if(LG(Z))Z.pop();for(let[X,U]of Object.entries(Q))RN(Z,X,U);return Z.join(`
859
- `).trimEnd()}function NN($,Q){let Z=new RegExp(`^\\s*\\[${k8(Q)}\\]\\s*(?:#.*)?$`),X=$.findIndex((U)=>Z.test(U));if(X===-1){if($.length>0&&$[$.length-1]?.trim())$.push("");X=$.length,$.push(`[${Q}]`)}return X}function wN($,Q){let Z=/^\s*\[[^\]]+\]\s*(?:#.*)?$/;for(let X=Q+1;X<$.length;X+=1)if(Z.test(BG($,X)))return X;return $.length}function kN($,Q,Z,X){let U=new Set(X),J=Z;for(let W=Q+1;W<J;W+=1){let G=BG($,W).match(/^\s*([A-Za-z0-9_-]+)\s*=/)?.[1];if(G&&U.has(G))$.splice(W,1),W-=1,J-=1}return J}function PN($,Q,Z,X){let U=Z;for(let[J,W]of Object.entries(X)){let Y=new RegExp(`^\\s*${k8(J)}\\s*=`),G=$.slice(Q+1,U).findIndex((z)=>Y.test(z));if(G>=0)$[Q+1+G]=`${J} = ${W}`;else $.splice(U,0,`${J} = ${W}`),U+=1}}function NW($,Q,Z,X=[]){let U=$.split(/\r?\n/);if(LG(U))U.pop();let J=NN(U,Q),W=wN(U,J),Y=kN(U,J,W,X);return PN(U,J,Y,Z),U.join(`
860
- `).trimEnd()}function BG($,Q){let Z=$[Q];if(Z===void 0)return KG;return Z}function LG($){return $.length===1&&$[0]===KG}function fN($,Q,Z,X){let U=WN($.body);if(!U)return Z.warnings.push(`Codex hook "${$.name}" has no recognized code-fenced block (bash, sh, python, js, ts); skipped.`),null;if(!$.event?.trim())return Z.warnings.push(`Codex hook "${$.name}" is missing event frontmatter; skipped.`),null;let J=bN[U.lang],W=yN[U.lang],Y=HG($,J,Z.warnings),G=m2(process.cwd(),".codex","hooks",Y);if($$(G,VN(U.content,W,X),Q.dryRun),!Q.dryRun)pD(G,493);return Z.filesWritten.push(G),{fileName:Y,event:$.event}}function vN($){return`"$(git rev-parse --show-toplevel)/.codex/hooks/${$}"`}function xN($,Q,Z,X){if($.length===0)return;let U={};for(let{topic:W,fileName:Y,event:G}of Q){let z={hooks:[{type:"command",command:vN(Y),...W.timeout!==void 0?{timeout:W.timeout}:{},...W.statusMessage?{statusMessage:W.statusMessage}:{}}]};if(W.matcher)z.matcher=W.matcher;let _=U[G];if(_)_.push(z);else U[G]=[z]}let J=m2(process.cwd(),".codex","hooks.json");$$(J,`${JSON.stringify({hooks:U},null,2)}
861
- `,Z.dryRun),X.filesWritten.push(J)}function gN($,Q,Z,X,U,J){if(!$&&!Q&&!Z)return;let W=m2(process.cwd(),".codex","config.toml"),Y=cD(W)?nD(W,"utf8"):"",G=Y.trim().length>0,z=ON(Y),_=z.stripped;if(Y=z.content,Y.trim()===J.tomlHeader.trim())Y="";if(Q)Y=NW(Y,"features",{hooks:"true"},["codex_hooks"]);if(Z)Y=DN(Y,{model_instructions_file:m0("AGENTS.md")});if($)Y=NW(Y,"agents",{max_threads:"6",max_depth:"1"});let V=!G||_?`${J.tomlHeader}${Y.trimEnd()}
862
- `:`${Y.trimEnd()}
863
- `;$$(W,V,X.dryRun),U.filesWritten.push(W)}function hN($,Q,Z,X){let U=HG($,"toml",Z.warnings),J=JN($.body,["toml"],!1),W=J?zN(J,X):IN($,X.tomlHeader),Y=m2(process.cwd(),".codex","agents",U);return $$(Y,W,Q.dryRun),Z.filesWritten.push(Y),U}function uN($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=YN(),U=$.map((z)=>l0(z,"codex")).filter((z)=>I8(z)||R8(z));if(U.length===0)return Z;h$(m2(process.cwd(),".codex"),Q.dryRun);let J=U.filter(I8),W=U.filter(R8),Y=[],G=KN(J,Q,Z,X);gN(J.length>0,W.length>0,G,Q,Z,X);for(let z of J)hN(z,Q,Z,X);for(let z of W){let _=fN(z,Q,Z,X);if(_)Y.push({topic:z,..._})}return xN(W,Y,Q,Z),Z}function dN($,Q){let Z=R7("codex",$,Q),X=uN($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function mN($,Q){return`${G0($)}.${Q}`}function y7($,Q,Z){let X=eW(w8($.channelId),$.channelId),{dryRun:U}=Z,J=wW(process.cwd(),X.outputDir),W=[],Y=[];h$(J,U);let G=new Set,z=$.includeTopic??I7;for(let V of Q.filter(z)){let H=l0(V,$.channelId),O=mN(H,$.extension);G.add(O);let K=SY(H.body),{mainContent:q,sections:B}=QY($Y(H,K,$.channelId)),F=ZY(H.references),C=B.map((y)=>`
911
+ `}function cP($,Q,Z){let X=new RegExp(`^\\s*${L6(Q)}\\s*=`),Y=$.findIndex((J)=>X.test(J));if(Y>=0){$[Y]=`${Q} = ${Z}`;return}let W=$.findIndex((J)=>/^\s*\[[^\]]+\]\s*(?:#.*)?$/.test(J));if(W===-1){if($.length>0&&$[$.length-1]?.trim())$.push("");$.push(`${Q} = ${Z}`);return}let U=[`${Q} = ${Z}`];if(W>0&&$[W-1]?.trim())U.push("");$.splice(W,0,...U)}function nP($,Q){let Z=$.split(/\r?\n/);if(JH(Z))Z.pop();for(let[X,Y]of Object.entries(Q))cP(Z,X,Y);return Z.join(`
912
+ `).trimEnd()}function rP($,Q){let Z=new RegExp(`^\\s*\\[${L6(Q)}\\]\\s*(?:#.*)?$`),X=$.findIndex((Y)=>Z.test(Y));if(X===-1){if($.length>0&&$[$.length-1]?.trim())$.push("");X=$.length,$.push(`[${Q}]`)}return X}function iP($,Q){let Z=/^\s*\[[^\]]+\]\s*(?:#.*)?$/;for(let X=Q+1;X<$.length;X+=1)if(Z.test(UH($,X)))return X;return $.length}function oP($,Q,Z,X){let Y=new Set(X),W=Z;for(let U=Q+1;U<W;U+=1){let G=UH($,U).match(/^\s*([A-Za-z0-9_-]+)\s*=/)?.[1];if(G&&Y.has(G))$.splice(U,1),U-=1,W-=1}return W}function aP($,Q,Z,X){let Y=Z;for(let[W,U]of Object.entries(X)){let J=new RegExp(`^\\s*${L6(W)}\\s*=`),G=$.slice(Q+1,Y).findIndex((_)=>J.test(_));if(G>=0)$[Q+1+G]=`${W} = ${U}`;else $.splice(Y,0,`${W} = ${U}`),Y+=1}}function LG($,Q,Z,X=[]){let Y=$.split(/\r?\n/);if(JH(Y))Y.pop();let W=rP(Y,Q),U=iP(Y,W),J=oP(Y,W,U,X);return aP(Y,W,J,Z),Y.join(`
913
+ `).trimEnd()}function UH($,Q){let Z=$[Q];if(Z===void 0)return YH;return Z}function JH($){return $.length===1&&$[0]===YH}function eP($,Q,Z,X){let Y=MP($.body);if(!Y)return Z.warnings.push(`Codex hook "${$.name}" has no recognized code-fenced block (bash, sh, python, js, ts); skipped.`),null;if(!$.event?.trim())return Z.warnings.push(`Codex hook "${$.name}" is missing event frontmatter; skipped.`),null;let W=sP[Y.lang],U=tP[Y.lang],J=ZH($,W,Z.warnings),G=q8(process.cwd(),".codex","hooks",J);if($$(G,NP(Y.content,U,X),Q.dryRun),!Q.dryRun)UP(G,493);return Z.filesWritten.push(G),{fileName:J,event:$.event}}function $f($){return`"$(git rev-parse --show-toplevel)/.codex/hooks/${$}"`}function Qf($,Q,Z,X){if(!$.matcher)return;if(HP.has(Q)){Z.matcher=$.matcher;return}if(VP.has(Q)){X.warnings.push(`Codex hook "${$.name}" uses matcher on ${Q}, but Codex ignores matchers for ${Q}; matcher omitted from .codex/hooks.json. Filter inside the hook script instead.`);return}Z.matcher=$.matcher}function Zf($,Q,Z,X){if($.length===0)return;let Y={};for(let{topic:U,fileName:J,event:G}of Q){let _={hooks:[{type:"command",command:$f(J),...U.timeout!==void 0?{timeout:U.timeout}:{},...U.statusMessage?{statusMessage:U.statusMessage}:{}}]};Qf(U,G,_,X);let H=Y[G];if(H)H.push(_);else Y[G]=[_]}let W=q8(process.cwd(),".codex","hooks.json");$$(W,`${JSON.stringify({hooks:Y},null,2)}
914
+ `,Z.dryRun),X.filesWritten.push(W)}function Xf($,Q,Z,X,Y,W){if(!$&&!Q&&!Z)return;let U=q8(process.cwd(),".codex","config.toml"),J=JP(U)?GP(U,"utf8"):"",G=J.trim().length>0,_=bP(J),H=_.stripped;if(J=_.content,J.trim()===W.tomlHeader.trim())J="";if(Q)J=LG(J,"features",{hooks:"true"},["codex_hooks"]);if(Z)J=nP(J,{model_instructions_file:H2("AGENTS.md")});if($)J=LG(J,"agents",{max_threads:"6",max_depth:"1"});let V=!G||H?`${W.tomlHeader}${J.trimEnd()}
915
+ `:`${J.trimEnd()}
916
+ `;$$(U,V,X.dryRun),Y.filesWritten.push(U)}function Yf($,Q,Z,X){let Y=ZH($,"toml",Z.warnings),W=FP($.body,["toml"],!1),U=W?RP(W,X):pP($,X.tomlHeader),J=q8(process.cwd(),".codex","agents",Y);return $$(J,U,Q.dryRun),Z.filesWritten.push(J),Y}function Wf($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=SP(),Y=$.map((_)=>V2(_,"codex")).filter((_)=>V6(_)||q6(_));if(Y.length===0)return Z;n$(q8(process.cwd(),".codex"),Q.dryRun);let W=Y.filter(V6),U=Y.filter(q6),J=[],G=kP(W,Q,Z,X);Xf(W.length>0,U.length>0,G,Q,Z,X);for(let _ of W)Yf(_,Q,Z,X);for(let _ of U){let H=eP(_,Q,Z,X);if(H)J.push({topic:_,...H})}return Zf(U,J,Q,Z),Z}function Uf($,Q){let Z=R7("codex",$,Q),X=Wf($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function Jf($,Q){return`${N1($)}.${Q}`}function f7($,Q,Z){let X=dG(A6($.channelId),$.channelId),{dryRun:Y}=Z,W=OG(process.cwd(),X.outputDir),U=[],J=[];n$(W,Y);let G=new Set,_=$.includeTopic??I7;for(let V of Q.filter(_)){let q=V2(V,$.channelId),K=Jf(q,$.extension);G.add(K);let B=K_(q.body),{mainContent:L,sections:O}=V7(mG(q,B,$.channelId)),S=lG(q.references),M=O.map((x)=>`
864
917
 
865
- ${y.content}`).join(""),T=P8({...$.frontmatter(H),metadata:V7(H)}),R=$.includeTitle?`
918
+ ${x.content}`).join(""),C=O6({...$.frontmatter(q),metadata:H7(q)}),D=$.includeTitle?`
866
919
 
867
- # ${H.title}`:"",k=`${T}${R}
920
+ # ${q.title}`:"",k=`${C}${D}
868
921
 
869
- ${q}${C}${F}
870
- `,x=wW(J,O);$$(x,k,U),W.push(x)}let _=f2(J,G,X.filePattern,U);return{filesWritten:W,filesRemoved:_,warnings:Y}}function lN($,Q){return P7(y7({channelId:"copilot",extension:"md",includeTitle:!0,frontmatter:()=>({applyTo:"**"})},$,Q),k7({channelId:"copilot",outputDir:".github/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function cN($,Q){return y7({channelId:"cursor",extension:"mdc",includeTitle:!1,frontmatter:(Z)=>{let X=Z.channels?.cursor??pN,U=Array.isArray(X.globs)?X.globs:[],J={description:Z.description||Z.title,alwaysApply:!1};if(U.length>0)J.globs=U;return J}},$,Q)}function nN($,Q){return P7(R7("gemini",$,Q),k7({channelId:"gemini",outputDir:".gemini/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function oN($,Q){return P7(y7({channelId:"opencode",extension:"md",includeTitle:!0,includeTopic:(Z)=>I7(Z)||QG(Z),frontmatter:(Z)=>({description:Z.description||Z.title})},$,Q),k7(rN,$,Q))}function z0($,Q="Unexpected error"){if($ instanceof Error)return $.message;if(typeof $==="string"&&$.trim().length>0)return $;return Q}function aN(){return process.stdin.isTTY===!0&&process.stdout.isTTY===!0}function MG($,Q,Z){let X=Z?"to write":"written",U=Z?"to remove":"removed";return[$>0?`${$} ${X}`:"",Q>0?`${Q} ${U}`:""].filter(Boolean).join(", ")||"no changes"}function sN($,Q,Z,X,U,J,W){let{log:Y,spinner:G,logOpts:z,spinOpts:_}=Q;for(let V of X){let H=w8(V);if(!H)continue;let O=AG[V];if(!O)continue;let K=G(_("purple"));K.start(`${H.displayName}${W}\u2026`);try{let q=O(Z,{dryRun:U});$.allWritten.push(...q.filesWritten),$.allRemoved.push(...q.filesRemoved),$.allWarnings.push(...q.warnings);let B=MG(q.filesWritten.length,q.filesRemoved.length,U);K.stop(`${H.displayName} \u2014 ${B}${J?`; target ${H.outputDir}`:""}`)}catch(q){$.hasError=!0,K.stop(`${H.displayName} \u2014 failed`),Y.error(z0(q),z("error"))}}}function tN($,Q,Z,X,U,J){let{log:W,spinner:Y,logOpts:G,spinOpts:z}=Q,_=Y(z("purple"));_.start(`Instruction assembly${J}\u2026`);try{let V=IY(Z,X,{dryRun:U});$.allWritten.push(...V.filesWritten),$.allRemoved.push(...V.filesRemoved),$.allWarnings.push(...V.warnings);let H=MG(V.filesWritten.length,V.filesRemoved.length,U);_.stop(`Instruction assembly \u2014 ${H}`)}catch(V){$.hasError=!0,_.stop("Instruction assembly \u2014 failed"),W.error(z0(V),G("error"))}}async function eN($,Q,Z,X,U,J,W){let{log:Y,logOpts:G}=Q;try{let z=await kY({cwd:W,channelIds:X,context:NY(Z,U),specs:wY(),dryRun:J,interactive:!J&&aN()});if($.allWritten.push(...z.filesWritten),$.allWarnings.push(...z.warnings),z.filesWritten.length>0)Y.info(`Advisory files \u2014 updated ${z.filesWritten.length} file${z.filesWritten.length===1?"":"s"}`,G("info"))}catch(z){$.hasError=!0,Y.error(z0(z,"Advisory file assistant failed"),G("error"))}}function $w($,Q,Z,X,U,J){let{spinner:W,spinOpts:Y}=Q,G=W(Y("purple"));G.start(`Ignore files${J}\u2026`);let z=MY(U,$.allWritten),_=uY(U,X,z),V=dY(U,X,z,Z),H=[_,...V],O=H.filter((K)=>K.updated).map((K)=>K.path.split(HI).pop()??K.path);for(let K of H)if(K.updated)$.allWritten.push(K.path);G.stop(O.length>0?`Ignore files \u2014 ${X?"to update":"updated"} ${O.join(", ")}`:"Ignore files \u2014 no changes")}function Qw($,Q,Z,X,U,J,W){let{log:Y,spinner:G,logOpts:z,spinOpts:_}=Q;if(X){let H=S$.filter((q)=>Z.includes(q.id)),O=G(_("purple"));O.start(`VS Code settings${W}\u2026`);let K=rY(J,H,!0,U);if(K.patternsAdded.length>0)$.allWritten.push(".vscode/settings.json"),O.stop(`VS Code settings \u2014 ${U?"to add":"added"} ${K.patternsAdded.length} exclude pattern${K.patternsAdded.length===1?"":"s"}`);else O.stop("VS Code settings \u2014 no changes")}let V=oY(J,U);if(V.associationsAdded.length>0)$.allWritten.push(".vscode/settings.json"),Y.info(`VS Code icons \u2014 ${U?"to add":"added"} ${V.associationsAdded.length} Playbook file association${V.associationsAdded.length===1?"":"s"}`,z("info"))}async function Zw($,Q,Z,X,U,J,W,Y){let{log:G,logOpts:z}=Q;if($.allWarnings.length>0)if(W)for(let _ of $.allWarnings)G.warn(_,z("warn"));else G.warn(nF($.allWarnings),z("warn"));if(!$.hasError){if(W){await x0("Sources",UI(U,Y));let _=cF(X,Y,$.allRemoved,$.allWritten);if(_)await x0("Generated outputs",_)}G.success(iF(Z.length,X.length,J),z("success")),Uw()}}async function Xw($,Q,Z,X,U,J,W,Y,G){let{log:z,spinner:_}=await import("@clack/prompts"),{brandLogOptions:V,brandSpinnerOptions:H}=await Promise.resolve().then(() => (N(),a0)),O={log:z,spinner:_,logOpts:V,spinOpts:H},K={allWarnings:[...X],allWritten:[],allRemoved:[],hasError:!1},q=process.cwd(),B=U?" (dry run)":"";return sN(K,O,$,Q,U,G,B),K.allRemoved.push(...H7(Z,U)),tN(K,O,$,Y,U,B),await eN(K,O,$,Q,Y,U,q),$w(K,O,Q,U,q,B),Qw(K,O,Q,W,U,q,B),await Zw(K,O,$,Q,J,U,G,q),K.hasError?1:0}function Uw(){y2(`
871
- `)}function Jw($){return{channel:$}}function Ww($,Q,Z,X){for(let U of Z){let J=AG[U];if(!J)continue;try{let W=J(Q,{dryRun:X});$.allWritten.push(...W.filesWritten),$.allRemoved.push(...W.filesRemoved),$.allWarnings.push(...W.warnings)}catch(W){$.errorResult={code:"RENDER_ERROR",message:z0(W,"Renderer failed"),details:Jw(U)}}}}function Yw($,Q,Z,X){try{let U=IY(Q,Z,{dryRun:X});$.allWritten.push(...U.filesWritten),$.allRemoved.push(...U.filesRemoved),$.allWarnings.push(...U.warnings)}catch(U){$.errorResult=$.errorResult??{code:"AGENTS_MD_RENDER_ERROR",message:z0(U,"AGENTS.md renderer failed"),details:{}}}}async function Gw($,Q,Z,X,U,J){try{let W=await kY({cwd:J,channelIds:Z,context:NY(Q,X),specs:wY(),dryRun:U,interactive:!1});$.allWritten.push(...W.filesWritten),$.allWarnings.push(...W.warnings)}catch(W){$.errorResult=$.errorResult??{code:"ADVISORY_FILE_ERROR",message:z0(W,"Advisory file assistant failed"),details:{}}}}function zw($,Q,Z,X){let U=MY(X,$.allWritten),J=uY(X,Z,U),W=dY(X,Z,U,Q),Y=[J,...W],G=[];for(let z of Y)if(z.updated)$.allWritten.push(z.path),G.push(z.path);return G}function _w($,Q,Z,X,U){if(Z){let W=S$.filter((G)=>Q.includes(G.id));if(rY(U,W,!0,X).patternsAdded.length>0)$.allWritten.push(".vscode/settings.json")}if(oY(U,X).associationsAdded.length>0)$.allWritten.push(".vscode/settings.json")}async function Vw($,Q,Z,X,U,J,W,Y){let G={allWarnings:[...X],allWritten:[],allRemoved:[],errorResult:null};Ww(G,$,Q,U),G.allRemoved.push(...H7(Z,U)),Yw(G,$,Y,U);let z=process.cwd();await Gw(G,$,Q,Y,U,z);let _=zw(G,Q,U,z);_w(G,Q,W,U,z);let V={topicsLoaded:$.length,channelsRun:Q,filesWritten:G.allWritten,filesRemoved:G.allRemoved,ignoreFilesUpdated:_,sources:J};return H1(V1("playbook sync",G.errorResult===null,V,G.allWarnings,G.errorResult)),G.errorResult===null?0:1}function Bw($,Q,Z){let X=[],U=$.slice(1);for(let J=0;J<U.length;J++){let W=U[J],Y=U[J+1];if(W===Ow&&Y&&!Y.startsWith("--"))X.push(Y),J++;else if(W?.startsWith(kW))X.push(W.slice(kW.length))}if(X.length===0&&typeof Q.source==="string")X.push(Q.source);if(X.length>0)return{paths:X,origin:P2.EXPLICIT};if(Z)return{paths:Z.playbook.sources,origin:P2.CONFIG};return{paths:[TG],origin:P2.DEFAULT}}function Lw($,Q){if($.origin===P2.DEFAULT&&!Hw(jG(Q,TG)))return[];return $.paths}function Aw($,Q){let Z=h0($.map((G)=>jG(Q,G)),{source:H$.LOCAL}),X=A7(),U=[...Z.warnings,...X.warnings],J=[],W=[];for(let G of X.roots){let z=h0([G.root],{source:H$.CORE,module:G.module});J=[...J,...z.topics],U.push(...z.warnings),W.push({label:Mw(G),path:G.root,topics:z.topics.length})}Tw(Z.topics);let Y=jw([{label:"SUMR resources",topics:J,duplicatePolicy:eQ.ERROR},{label:"local sources",topics:Z.topics,duplicatePolicy:eQ.SKIP}]);return U.push(...Y.warnings),{topics:Y.topics,warnings:U,breakdown:{local:{paths:$,topics:Z.topics.length},core:{source:X.source,path:X.root,paths:X.roots.map((G)=>G.root),providers:W,topics:J.length}}}}function Mw($){return $.label||$.packageName||qw}function jw($){let Q=new Map,Z=[],X=[];for(let U of $)for(let J of U.topics){if(!PW(J,U.label,Q,U.duplicatePolicy,X,ZW.TOPIC))continue;let W=[];for(let Y of J.references)if(PW(Y,U.label,Q,U.duplicatePolicy,X,ZW.REFERENCE))W.push(Y);Z.push({...J,references:W})}return{topics:Z.sort((U,J)=>U.name.localeCompare(J.name)),warnings:X}}function Tw($){let Q=Ew($).filter((X)=>X.source===H$.LOCAL&&X.name.startsWith(Kw));if(Q.length===0)return;let Z=Q.map((X)=>` - "${X.name}" in ${X.sourcePath}`);throw Error(`Reserved prefix "sumr-" is used in local Playbook docs:
922
+ ${L}${M}${S}
923
+ `,u=OG(W,K);$$(u,k,Y),U.push(u)}let H=W8(W,G,X.filePattern,Y);return{filesWritten:U,filesRemoved:H,warnings:J}}function Gf($,Q){return k7(f7({channelId:"copilot",extension:"md",includeTitle:!0,frontmatter:()=>({applyTo:"**"})},$,Q),b7({channelId:"copilot",outputDir:".github/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function Hf($,Q){return f7({channelId:"cursor",extension:"mdc",includeTitle:!1,frontmatter:(Z)=>{let X=Z.channels?.cursor??_f,Y=Array.isArray(X.globs)?X.globs:[],W={description:Z.description||Z.title,alwaysApply:!1};if(Y.length>0)W.globs=Y;return W}},$,Q)}function Vf($,Q){return k7(R7("gemini",$,Q),b7({channelId:"gemini",outputDir:".gemini/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function Bf($,Q){return k7(f7({channelId:"opencode",extension:"md",includeTitle:!0,includeTopic:(Z)=>I7(Z)||p_(Z),frontmatter:(Z)=>({description:Z.description||Z.title})},$,Q),b7(Kf,$,Q))}function R0($,Q="Unexpected error"){if($ instanceof Error)return $.message;if(typeof $==="string"&&$.trim().length>0)return $;return Q}function Af(){return process.stdin.isTTY===!0&&process.stdout.isTTY===!0}function _H($,Q,Z){let X=Z?"to write":"written",Y=Z?"to remove":"removed";return[$>0?`${$} ${X}`:"",Q>0?`${Q} ${Y}`:""].filter(Boolean).join(", ")||"no changes"}function Lf($,Q,Z,X,Y,W,U){let{log:J,spinner:G,logOpts:_,spinOpts:H}=Q;for(let V of X){let q=A6(V);if(!q)continue;let K=GH[V];if(!K)continue;let B=G(H("purple"));B.start(`${q.displayName}${U}\u2026`);try{let L=K(Z,{dryRun:Y});$.allWritten.push(...L.filesWritten),$.allRemoved.push(...L.filesRemoved),$.allWarnings.push(...L.warnings);let O=_H(L.filesWritten.length,L.filesRemoved.length,Y);B.stop(`${q.displayName} \u2014 ${O}${W?`; target ${q.outputDir}`:""}`)}catch(L){$.hasError=!0,B.stop(`${q.displayName} \u2014 failed`),J.error(R0(L),_("error"))}}}function Of($,Q,Z,X,Y,W){let{log:U,spinner:J,logOpts:G,spinOpts:_}=Q,H=J(_("purple"));H.start(`Instruction assembly${W}\u2026`);try{let V=A_(Z,X,{dryRun:Y});$.allWritten.push(...V.filesWritten),$.allRemoved.push(...V.filesRemoved),$.allWarnings.push(...V.warnings);let q=_H(V.filesWritten.length,V.filesRemoved.length,Y);H.stop(`Instruction assembly \u2014 ${q}`)}catch(V){$.hasError=!0,H.stop("Instruction assembly \u2014 failed"),U.error(R0(V),G("error"))}}async function zf($,Q,Z,X,Y,W,U){let{log:J,logOpts:G}=Q;try{let _=await T_({cwd:U,channelIds:X,context:z_(Z,Y),specs:j_(),dryRun:W,interactive:!W&&Af()});if($.allWritten.push(..._.filesWritten),$.allWarnings.push(..._.warnings),_.filesWritten.length>0)J.info(`Advisory files \u2014 updated ${_.filesWritten.length} file${_.filesWritten.length===1?"":"s"}`,G("info"))}catch(_){$.hasError=!0,J.error(R0(_,"Advisory file assistant failed"),G("error"))}}function jf($,Q,Z,X,Y,W){let{spinner:U,spinOpts:J}=Q,G=U(J("purple"));G.start(`Ignore files${W}\u2026`);let _=G_(Y,$.allWritten),H=N_(Y,X,_),V=w_(Y,X,_,Z),q=[H,...V],K=q.filter((B)=>B.updated).map((B)=>B.path.split(Cw).pop()??B.path);for(let B of q)if(B.updated)$.allWritten.push(B.path);G.stop(K.length>0?`Ignore files \u2014 ${X?"to update":"updated"} ${K.join(", ")}`:"Ignore files \u2014 no changes")}function Tf($,Q,Z,X,Y,W,U){let{log:J,spinner:G,logOpts:_,spinOpts:H}=Q;if(X){let q=D$.filter((L)=>Z.includes(L.id)),K=G(H("purple"));K.start(`VS Code settings${U}\u2026`);let B=v_(W,q,!0,Y);if(B.patternsAdded.length>0)$.allWritten.push(".vscode/settings.json"),K.stop(`VS Code settings \u2014 ${Y?"to add":"added"} ${B.patternsAdded.length} exclude pattern${B.patternsAdded.length===1?"":"s"}`);else K.stop("VS Code settings \u2014 no changes")}let V=g_(W,Y);if(V.associationsAdded.length>0)$.allWritten.push(".vscode/settings.json"),J.info(`VS Code icons \u2014 ${Y?"to add":"added"} ${V.associationsAdded.length} Playbook file association${V.associationsAdded.length===1?"":"s"}`,_("info"))}async function Ef($,Q,Z,X,Y,W,U,J){let{log:G,logOpts:_}=Q;if($.allWarnings.length>0)if(U)for(let H of $.allWarnings)G.warn(H,_("warn"));else G.warn(Zw($.allWarnings),_("warn"));if(!$.hasError){if(U){await Y2("Sources",Bw(Y,J));let H=Qw(X,J,$.allRemoved,$.allWritten);if(H)await Y2("Generated outputs",H)}G.success(Xw(Z.length,X.length,W),_("success")),Ff()}}async function Cf($,Q,Z,X,Y,W,U,J,G){let{log:_,spinner:H}=await import("@clack/prompts"),{brandLogOptions:V,brandSpinnerOptions:q}=await Promise.resolve().then(() => (R(),I2)),K={log:_,spinner:H,logOpts:V,spinOpts:q},B={allWarnings:[...X],allWritten:[],allRemoved:[],hasError:!1},L=process.cwd(),O=Y?" (dry run)":"";return Lf(B,K,$,Q,Y,G,O),B.allRemoved.push(...q7(Z,Y)),Of(B,K,$,J,Y,O),await zf(B,K,$,Q,J,Y,L),jf(B,K,Q,Y,L,O),Tf(B,K,Q,U,Y,L,O),await Ef(B,K,$,Q,W,Y,G,L),B.hasError?1:0}function Ff(){Y8(`
924
+ `)}function Mf($){return{channel:$}}function Sf($,Q,Z,X){for(let Y of Z){let W=GH[Y];if(!W)continue;try{let U=W(Q,{dryRun:X});$.allWritten.push(...U.filesWritten),$.allRemoved.push(...U.filesRemoved),$.allWarnings.push(...U.warnings)}catch(U){$.errorResult={code:"RENDER_ERROR",message:R0(U,"Renderer failed"),details:Mf(Y)}}}}function If($,Q,Z,X){try{let Y=A_(Q,Z,{dryRun:X});$.allWritten.push(...Y.filesWritten),$.allRemoved.push(...Y.filesRemoved),$.allWarnings.push(...Y.warnings)}catch(Y){$.errorResult=$.errorResult??{code:"AGENTS_MD_RENDER_ERROR",message:R0(Y,"AGENTS.md renderer failed"),details:{}}}}async function Rf($,Q,Z,X,Y,W){try{let U=await T_({cwd:W,channelIds:Z,context:z_(Q,X),specs:j_(),dryRun:Y,interactive:!1});$.allWritten.push(...U.filesWritten),$.allWarnings.push(...U.warnings)}catch(U){$.errorResult=$.errorResult??{code:"ADVISORY_FILE_ERROR",message:R0(U,"Advisory file assistant failed"),details:{}}}}function Df($,Q,Z,X){let Y=G_(X,$.allWritten),W=N_(X,Z,Y),U=w_(X,Z,Y,Q),J=[W,...U],G=[];for(let _ of J)if(_.updated)$.allWritten.push(_.path),G.push(_.path);return G}function Nf($,Q,Z,X,Y){if(Z){let U=D$.filter((G)=>Q.includes(G.id));if(v_(Y,U,!0,X).patternsAdded.length>0)$.allWritten.push(".vscode/settings.json")}if(g_(Y,X).associationsAdded.length>0)$.allWritten.push(".vscode/settings.json")}async function wf($,Q,Z,X,Y,W,U,J){let G={allWarnings:[...X],allWritten:[],allRemoved:[],errorResult:null};Sf(G,$,Q,Y),G.allRemoved.push(...q7(Z,Y)),If(G,$,J,Y);let _=process.cwd();await Rf(G,$,Q,J,Y,_);let H=Df(G,Q,Y,_);Nf(G,Q,U,Y,_);let V={topicsLoaded:$.length,channelsRun:Q,filesWritten:G.allWritten,filesRemoved:G.allRemoved,ignoreFilesUpdated:H,sources:W};return R1(I1("playbook sync",G.errorResult===null,V,G.allWarnings,G.errorResult)),G.errorResult===null?0:1}function yf($,Q,Z){let X=[],Y=$.slice(1);for(let W=0;W<Y.length;W++){let U=Y[W],J=Y[W+1];if(U===kf&&J&&!J.startsWith("--"))X.push(J),W++;else if(U?.startsWith(zG))X.push(U.slice(zG.length))}if(X.length===0&&typeof Q.source==="string")X.push(Q.source);if(X.length>0)return{paths:X,origin:Z8.EXPLICIT};if(Z)return{paths:Z.playbook.sources,origin:Z8.CONFIG};return{paths:[VH],origin:Z8.DEFAULT}}function xf($,Q){if($.origin===Z8.DEFAULT&&!bf(HH(Q,VH)))return[];return $.paths}function vf($,Q){let Z=U2($.map((G)=>HH(Q,G)),{source:H$.LOCAL}),X=z7(),Y=[...Z.warnings,...X.warnings],W=[],U=[];for(let G of X.roots){let _=U2([G.root],{source:H$.CORE,module:G.module});W=[...W,..._.topics],Y.push(..._.warnings),U.push({label:gf(G),path:G.root,topics:_.topics.length})}uf(Z.topics);let J=hf([{label:"SUMR resources",topics:W,duplicatePolicy:tZ.ERROR},{label:"local sources",topics:Z.topics,duplicatePolicy:tZ.SKIP}]);return Y.push(...J.warnings),{topics:J.topics,warnings:Y,breakdown:{local:{paths:$,topics:Z.topics.length},core:{source:X.source,path:X.root,paths:X.roots.map((G)=>G.root),providers:U,topics:W.length}}}}function gf($){return $.label||$.packageName||ff}function hf($){let Q=new Map,Z=[],X=[];for(let Y of $)for(let W of Y.topics){if(!jG(W,Y.label,Q,Y.duplicatePolicy,X,lJ.TOPIC))continue;let U=[];for(let J of W.references)if(jG(J,Y.label,Q,Y.duplicatePolicy,X,lJ.REFERENCE))U.push(J);Z.push({...W,references:U})}return{topics:Z.sort((Y,W)=>Y.name.localeCompare(W.name)),warnings:X}}function uf($){let Q=df($).filter((X)=>X.source===H$.LOCAL&&X.name.startsWith(Pf));if(Q.length===0)return;let Z=Q.map((X)=>` - "${X.name}" in ${X.sourcePath}`);throw Error(`Reserved prefix "sumr-" is used in local Playbook docs:
872
925
  ${Z.join(`
873
926
  `)}
874
927
 
875
- Use unprefixed names in source docs. SUMR adds managed prefixes during generation.`)}function Ew($){return $.flatMap((Q)=>[Q,...Q.references])}function PW($,Q,Z,X,U,J){let W=u$($),Y=Z.get(W);if(Y){if(X===eQ.SKIP)return U.push(`Skipped local Playbook ${J} "${$.name}" because it already exists in ${Y}.`),!1;throw Error(`Duplicate Playbook topic name "${W}" found in ${Y} and ${Q}.
928
+ Use unprefixed names in source docs. SUMR adds managed prefixes during generation.`)}function df($){return $.flatMap((Q)=>[Q,...Q.references])}function jG($,Q,Z,X,Y,W){let U=_1($),J=Z.get(U);if(J){if(X===tZ.SKIP)return Y.push(`Skipped local Playbook ${W} "${$.name}" because it already exists in ${J}.`),!1;throw Error(`Duplicate Playbook topic name "${U}" found in ${J} and ${Q}.
876
929
 
877
- Rename one of them or set a unique "name:" in frontmatter.`)}return Z.set(W,Q),!0}function Nw($){return $.flatMap((Q)=>[Q,...Q.references])}function ww($,Q,Z){let X=u$($),U=Q.get(X);if(U)Z.push({severity:i.ERROR,code:"DUPLICATE_NAME",topic:$.name,file:$.sourcePath,message:`Duplicate topic name "${X}" \u2014 already used in ${U}`});else Q.set(X,$.sourcePath)}function kw($,Q){if($.source===H$.LOCAL&&$.name.startsWith(Dw))Q.push({severity:i.ERROR,code:"RESERVED_PREFIX",topic:$.name,file:$.sourcePath,message:`Reserved prefix "sumr-" used in local topic "${$.name}". SUMR adds managed prefixes during generation.`})}function Pw($,Q){let Z=Buffer.byteLength($.body,"utf8");if(Z>Rw)Q.push({severity:i.WARNING,code:"TOPIC_TOO_LARGE",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" body is ${Math.round(Z/1024)} KB \u2014 consider splitting it (soft cap: 64 KB)`})}function bw($,Q){if($.category!==CG)return;if(!$.label)Q.push({severity:i.WARNING,code:"REFERENCE_MISSING_LABEL",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: label`});if(!$.when)Q.push({severity:i.WARNING,code:"REFERENCE_MISSING_WHEN",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: when`});if($.order===void 0)Q.push({severity:i.WARNING,code:"REFERENCE_MISSING_ORDER",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: order`})}function yw($,Q){if(R8($)&&!$.event)Q.push({severity:i.ERROR,code:"LIFECYCLE_MISSING_EVENT",topic:$.name,file:$.sourcePath,message:`Lifecycle resource "${$.name}" is missing required frontmatter field: event`})}function uw($,Q){if($.source!==H$.LOCAL)return;let Z=`${$.description}
878
- ${$.body}`;for(let X of fw){let U=Z.match(X);if(U){Q.push({severity:i.ERROR,code:"PLACEHOLDER_TEXT",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" still contains scaffold placeholder text: "${U[0]}". Replace it with the real value before syncing.`});return}}}function dw($,Q){if($.source!==H$.LOCAL)return;if($.category===CG)return;let Z=$.description.trim(),X=Z.length<xw,U=!vw.test(Z);if(!X&&!U)return;let J=X?`is only ${Z.length} characters`:"states what the doc covers but not when to use it";Q.push({severity:i.WARNING,code:"WEAK_DESCRIPTION",topic:$.name,file:$.sourcePath,message:`Description for "${$.name}" ${J}. The model loads a doc from its description \u2014 say what it covers AND when to use it (e.g. "\u2026 Use when \u2026").`})}function mw($,Q){if($.source!==H$.LOCAL||!$.channels)return;for(let[Z,X]of Object.entries($.channels))for(let U of WD(Z,X))Q.push({severity:i.WARNING,code:"UNSUPPORTED_CHANNEL_HINT",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" sets "${U}" under its "${Z}" block, but ${Z} does not honor it \u2014 the value will be ignored.`})}function lw($,Q){for(let Z of $.invalidAgentFields??[])Q.push({severity:i.ERROR,code:"INVALID_AGENT_FIELD",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" sets ${Z.field}: "${Z.value}", but allowed values are: ${Z.allowed.join(", ")}.`})}function pw($){return $.replace(hw,"$1")}function cw($){if(!$.endsWith(".md"))return!1;if(/^[a-z]+:\/\//i.test($))return!1;if($.startsWith("/"))return!1;return!0}function nw($,Q){if($.source!==H$.LOCAL)return;for(let Z of pw($.body).matchAll(gw)){let X=Z[1]?.trim();if(!X)continue;let U=X.split("#")[0]?.trim()??"";if(!cw(U))continue;if(Cw(EG(Sw($.sourcePath),U)))continue;Q.push({severity:i.ERROR,code:"BROKEN_REFERENCE",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" links to "${X}", which does not exist relative to its source file.`})}}function iw($,Q,Z){if($.source!==H$.LOCAL)return;for(let X of $.teamMembers??[]){if(Q.has(X))continue;Z.push({severity:i.ERROR,code:"UNKNOWN_TEAM_MEMBER",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" references team member "${X}", which is not a known topic.`})}}function SG($,Q){let Z=[];for(let W of Q)Z.push({severity:i.WARNING,code:"LOADER_WARNING",message:W});let X=Nw($),U=new Map,J=new Set(X.map((W)=>W.name));for(let W of X)ww(W,U,Z),kw(W,Z),Pw(W,Z),bw(W,Z),yw(W,Z),uw(W,Z),dw(W,Z),lw(W,Z),nw(W,Z),iw(W,J,Z),mw(W,Z);return Z}function rw($,Q,Z){if($)return[$];if(h2(Q)){let X=u2(Q),U=fW(X.playbook);if(!U.ok)for(let W of U.issues)Z.push({severity:i.WARNING,code:"CONFIG_SCHEMA_INVALID",message:`sumr.yaml.playbook: ${W}`});let J=X.playbook.sources;if(J.length===0)Z.push({severity:i.ERROR,code:"CONFIG_SOURCES_EMPTY",message:nQ});return J}return[Fw]}function ow($){let Q=A7(),Z=[];for(let X of Q.roots){let U=h0([X.root],{source:H$.CORE,module:X.module});Z=[...Z,...U.topics],$.push(...U.warnings)}return Z}function bW($,Q){return` ${S(`${$} [${Q.code}]`,"purple")} ${S(Q.message,"dim")}`}function aw($,Q,Z){let X=[];if($.length>0){X.push(S(`Errors (${$.length}):`,"pink"));for(let U of $)X.push(bW("\u2717",U))}if(Q.length>0){if(X.length>0)X.push("");X.push(S(`Warnings (${Q.length}):`,"orchid"));for(let U of Q)X.push(bW("\u26A0",U))}return X.push(""),X.push(S(`Sources: ${Z.join(", ")}`,"dim")),X.join(`
879
- `)}async function sw($,Q,Z){try{let X=h0($,{source:H$.LOCAL});return{topics:X.topics,warnings:X.warnings}}catch(X){Z?.stop("Could not load Playbook topics");let U=z0(X,"Failed to load Playbook topics.");if(Q)H1(V1("playbook validate",!1,null,[],{code:"LOAD_ERROR",message:U}));else await g0("Could not load Playbook topics",U);return 1}}async function tw($,Q,Z,X,U,J,W){let Y={valid:X,errors:Q.length,warnings:Z.length,issues:$};if(J)return H1(V1("playbook validate",X,Y,[],null)),X?0:1;if($.length===0){let G=W?["No issues found \uD83C\uDF89","",`Sources: ${U.join(", ")}`].join(`
880
- `):"No issues found \uD83C\uDF89";return await x0("Playbook valid",G,"mauve"),y2(`
881
- `),0}return await x0(X?"Playbook warnings":"Playbook validation failed",aw(Q,Z,U),X?"mauve":"pink"),y2(`
882
- `),X?0:1}async function ew(){let{spinner:$}=await import("@clack/prompts"),{brandSpinnerOptions:Q}=await Promise.resolve().then(() => (N(),a0));return $(Q("purple"))}async function $k($){let{extras:Q}=$.args,Z=Q.json===!0,X=Q.verbose===!0,U=process.cwd(),J=typeof Q.source==="string"?Q.source:void 0,W=[],Y=rw(J,U,W),G=Y.map((T)=>EG(U,T)),z=Z?void 0:await ew();z?.start("Loading Playbook topics\u2026");let _=await sw(G,Z,z);if(typeof _==="number")return _;let V=_.warnings;z?.message("Merging core resources\u2026");let H=ow(V);z?.message("Validating topics\u2026");let O=[...H,..._.topics],K=[...W,...SG(O,V)],q=K.filter((T)=>T.severity===i.ERROR),B=K.filter((T)=>T.severity===i.WARNING),F=q.length===0,C=`${O.length} topic${O.length===1?"":"s"}`;return z?.stop(`Checked ${C}`),tw(K,q,B,F,Y,Z,X)}async function b0($,Q,Z,X,U,J=[],W){if($)H1(V1("playbook sync",!1,null,J,{code:Q,message:Z,details:W}));else await g0(X,U)}function Uk($){return{issues:$.map((Q)=>({severity:Q.severity,code:Q.code,message:Q.message,topic:Q.topic,file:Q.file}))}}async function Jk($,Q,Z){let X=SG($,[]);for(let W of X)if(W.severity===i.WARNING)Q.push(`[${W.code}] ${W.message}`);let U=X.filter((W)=>W.severity===i.ERROR);if(U.length===0)return;let J=U.map((W)=>`\u2717 [${W.code}] ${W.message}`).join(`
883
- `);return await b0(Z,"VALIDATION_FAILED",`Validation failed with ${U.length} error(s). Run \`sumr playbook validate\` for detail.`,"Playbook validation failed",J,Q,Uk(U)),1}async function Wk($){if($)return;let{spinner:Q}=await import("@clack/prompts"),{brandSpinnerOptions:Z}=await Promise.resolve().then(() => (N(),a0)),X=Q(Z("purple"));return X.start("Loading Playbook sources\u2026"),X}async function Yk($,Q,Z){let{extras:X}=$.args,U=process.cwd(),J=_k(U);if(!J)return await b0(Q,"NO_CONFIG","No sumr.yaml found in the current directory. Run `sumr playbook config` to set up this repo.","No sumr.yaml found","No sumr.yaml found in the current directory. Run `sumr playbook config` to set up this repo."),1;let W=Bw($.argv,X,J);if(W.origin===P2.CONFIG&&W.paths.length===0)return await b0(Q,"INVALID_CONFIG",nQ,"Invalid Playbook configuration",nQ),1;let Y=Lw(W,U);if(Z!==void 0&&!e$.includes(Z)){let C=`Unknown channel: "${Z}". Valid channels: ${e$.join(", ")}`;return await b0(Q,"INVALID_CHANNEL",C,"Invalid Playbook channel",[`Requested: ${Z}`,"",`Valid channels: ${e$.join(", ")}`].join(`
884
- `)),1}let G,z=[],_=await Wk(Q);try{G=Aw(Y,U),z.push(...G.warnings)}catch(C){_?.stop("Could not load Playbook sources");let T=C instanceof Error?C.message:"Failed to load Playbook topics.";return await b0(Q,"LOAD_ERROR",T,"Could not load Playbook topics",T),1}if(G.topics.length===0){_?.stop("No Playbook topics found");let C=XI(W.paths,U,z);return await b0(Q,"NO_TOPICS",C,"No Playbook topics found",C,z),1}let H={PLAYBOOK_PATH:J.playbook.sources[0]??Zk,...xF(J)},O=zk(G.topics,H);_?.stop(`Loaded ${O.length} topic${O.length===1?"":"s"}`);let K=await Jk(O,z,Q);if(K!==void 0)return K;let q=M8(J),B=Z?S$.filter((C)=>C.id===Z):S$.filter((C)=>q.includes(C.id)),F=Z?[]:S$.filter((C)=>!q.includes(C.id));return{topics:O,channelsToRun:B,channelsToClean:F,hideGen:J.playbook.hideGen??!1,yamlConfig:J,allWarnings:z,breakdown:G.breakdown}}async function Gk($){let{extras:Q}=$.args,Z=Q["dry-run"]===!0,X=Q.json===!0,U=Q.verbose===!0,J=typeof Q.channel==="string"?Q.channel:void 0,W=await Yk($,X,J);if(typeof W==="number")return W;let{topics:Y,channelsToRun:G,channelsToClean:z,hideGen:_,yamlConfig:V,allWarnings:H,breakdown:O}=W;if(X)return Vw(Y,G.map((K)=>K.id),z,H,Z,O,_,V);return Xw(Y,G.map((K)=>K.id),z,H,Z,O,_,V,U)}function zk($,Q){return $.map((Z)=>({...Z,description:J0(Z.description,Q),when:Z.when?J0(Z.when,Q):Z.when,body:J0(Z.body,Q),references:Z.references.map((X)=>({...X,description:J0(X.description,Q),when:X.when?J0(X.when,Q):X.when,body:J0(X.body,Q)}))}))}function _k($){if(!h2($))return;try{return u2($)}catch{return}}var IT,yW,PT,bT,yT,fT,vT,xT,gT,hT,uT,bQ,yQ,pJ,dT,aT=".",sT="'.'",tT="# Playbook",eT,ZE,_1,V$,J$,XE,UE='"',JE="'",nQ,WE,v1,DE="",NE,hE,x$,uE,dE=`---
930
+ Rename one of them or set a unique "name:" in frontmatter.`)}return Z.set(U,Q),!0}function of($){return $.flatMap((Q)=>[Q,...Q.references])}function af($,Q,Z){let X=_1($),Y=Q.get(X);if(Y)Z.push({severity:o.ERROR,code:"DUPLICATE_NAME",topic:$.name,file:$.sourcePath,message:`Duplicate topic name "${X}" \u2014 already used in ${Y}`});else Q.set(X,$.sourcePath)}function sf($,Q){if($.source===H$.LOCAL&&$.name.startsWith(rf))Q.push({severity:o.ERROR,code:"RESERVED_PREFIX",topic:$.name,file:$.sourcePath,message:`Reserved prefix "sumr-" used in local topic "${$.name}". SUMR adds managed prefixes during generation.`})}function tf($,Q){let Z=Buffer.byteLength($.body,"utf8");if(Z>nf)Q.push({severity:o.WARNING,code:"TOPIC_TOO_LARGE",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" body is ${Math.round(Z/1024)} KB \u2014 consider splitting it (soft cap: 64 KB)`})}function ef($,Q){if($.category!==y7)return;if(!$.label)Q.push({severity:o.WARNING,code:"REFERENCE_MISSING_LABEL",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: label`});if(!$.when)Q.push({severity:o.WARNING,code:"REFERENCE_MISSING_WHEN",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: when`});if($.order===void 0)Q.push({severity:o.WARNING,code:"REFERENCE_MISSING_ORDER",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: order`})}function $y($,Q){if(q6($)&&!$.event)Q.push({severity:o.ERROR,code:"LIFECYCLE_MISSING_EVENT",topic:$.name,file:$.sourcePath,message:`Lifecycle resource "${$.name}" is missing required frontmatter field: event`})}function Jy($,Q){if($.source!==H$.LOCAL)return;let Z=`${$.description}
931
+ ${$.body}`;for(let X of Qy){let Y=Z.match(X);if(Y){Q.push({severity:o.ERROR,code:"PLACEHOLDER_TEXT",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" still contains scaffold placeholder text: "${Y[0]}". Replace it with the real value before syncing.`});return}}}function Gy($,Q){if($.source!==H$.LOCAL)return;if($.category===y7)return;let Z=$.description.trim(),X=Z.length<Xy,Y=!Zy.test(Z);if(!X&&!Y)return;let W=X?`is only ${Z.length} characters`:"states what the doc covers but not when to use it";Q.push({severity:o.WARNING,code:"WEAK_DESCRIPTION",topic:$.name,file:$.sourcePath,message:`Description for "${$.name}" ${W}. The model loads a doc from its description \u2014 say what it covers AND when to use it (e.g. "\u2026 Use when \u2026").`})}function _y($,Q){if($.source!==H$.LOCAL||!$.channels)return;for(let[Z,X]of Object.entries($.channels))for(let Y of Ck(Z,X))Q.push({severity:o.WARNING,code:"UNSUPPORTED_CHANNEL_HINT",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" sets "${Y}" under its "${Z}" block, but ${Z} does not honor it \u2014 the value will be ignored.`})}function Hy($,Q){for(let Z of $.invalidAgentFields??[])Q.push({severity:o.ERROR,code:"INVALID_AGENT_FIELD",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" sets ${Z.field}: "${Z.value}", but allowed values are: ${Z.allowed.join(", ")}.`})}function Vy($,Q){if($.source!==H$.LOCAL||!$.nicknames)return;let Z=new Set;for(let X of $.nicknames){let Y=X.trim(),W=Z.has(Y);if(Z.add(Y),Y&&!W&&Yy.test(Y))continue;let U=!Y?"is empty":W?"is duplicated":"contains unsupported characters";Q.push({severity:o.ERROR,code:"INVALID_NICKNAME",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" sets nickname "${X}", but it ${U}. Nicknames must be unique and use only ASCII letters, digits, spaces, hyphens, and underscores.`})}}function qy($){return $.replace(Uy,"$1")}function KH($){if(!$.endsWith(".md"))return!1;if(/^[a-z]+:\/\//i.test($))return!1;if($.startsWith("/"))return!1;return!0}function Ky($,Q){if($.source!==H$.LOCAL)return;for(let Z of AH($.body)){let X=BH(Z);if(!KH(X))continue;if(mf(qH(lf($.sourcePath),X)))continue;Q.push({severity:o.ERROR,code:"BROKEN_REFERENCE",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" links to "${Z}", which does not exist relative to its source file.`})}}function BH($){return $.split("#")[0]?.trim()??""}function AH($){let Q=[];for(let Z of qy($).matchAll(Wy)){let X=Z[1]?.trim();if(!X)continue;let Y=BH(X);if(KH(Y))Q.push(X)}return Q}function By($,Q){if($.category===y7)TG($,$.body,"reference file",Q);let Z=V7($.body).sections;for(let X of Z)TG($,X.content,`extracted "${X.name}" file`,Q)}function TG($,Q,Z,X){for(let Y of AH(Q))X.push({severity:o.ERROR,code:"NESTED_REFERENCE_LINK",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" ${Z} links to "${Y}". Claude Skills should keep support files one level deep from SKILL.md; link the file from the main topic or merge the detail into this support file.`})}function Ay($,Q,Z){if($.source!==H$.LOCAL)return;for(let X of $.teamMembers??[]){if(Q.has(X))continue;Z.push({severity:o.ERROR,code:"UNKNOWN_TEAM_MEMBER",topic:$.name,file:$.sourcePath,message:`Topic "${$.name}" references team member "${X}", which is not a known topic.`})}}function LH($,Q){let Z=[];for(let U of Q)Z.push({severity:o.WARNING,code:"LOADER_WARNING",message:U});let X=of($),Y=new Map,W=new Set(X.map((U)=>U.name));for(let U of X)af(U,Y,Z),sf(U,Z),tf(U,Z),ef(U,Z),$y(U,Z),Jy(U,Z),Gy(U,Z),Hy(U,Z),Vy(U,Z),Ky(U,Z),By(U,Z),Ay(U,W,Z),_y(U,Z);return Z}function Ly($,Q,Z){if($)return[$];if(_8(Q)){let X=H8(Q),Y=FG(X.playbook);if(!Y.ok)for(let U of Y.issues)Z.push({severity:o.WARNING,code:"CONFIG_SCHEMA_INVALID",message:`sumr.yaml.playbook: ${U}`});let W=X.playbook.sources;if(W.length===0)Z.push({severity:o.ERROR,code:"CONFIG_SOURCES_EMPTY",message:rZ});return W}return[pf]}function Oy($){let Q=z7(),Z=[];for(let X of Q.roots){let Y=U2([X.root],{source:H$.CORE,module:X.module});Z=[...Z,...Y.topics],$.push(...Y.warnings)}return Z}function EG($,Q){return` ${F(`${$} [${Q.code}]`,"purple")} ${F(Q.message,"dim")}`}function zy($,Q,Z){let X=[];if($.length>0){X.push(F(`Errors (${$.length}):`,"pink"));for(let Y of $)X.push(EG("\u2717",Y))}if(Q.length>0){if(X.length>0)X.push("");X.push(F(`Warnings (${Q.length}):`,"orchid"));for(let Y of Q)X.push(EG("\u26A0",Y))}return X.push(""),X.push(F(`Sources: ${Z.join(", ")}`,"dim")),X.join(`
932
+ `)}async function jy($,Q,Z){try{let X=U2($,{source:H$.LOCAL});return{topics:X.topics,warnings:X.warnings}}catch(X){Z?.stop("Could not load Playbook topics");let Y=R0(X,"Failed to load Playbook topics.");if(Q)R1(I1("playbook validate",!1,null,[],{code:"LOAD_ERROR",message:Y}));else await W2("Could not load Playbook topics",Y);return 1}}async function Ty($,Q,Z,X,Y,W,U){let J={valid:X,errors:Q.length,warnings:Z.length,issues:$};if(W)return R1(I1("playbook validate",X,J,[],null)),X?0:1;if($.length===0){let G=U?["No issues found \uD83C\uDF89","",`Sources: ${Y.join(", ")}`].join(`
933
+ `):"No issues found \uD83C\uDF89";return await Y2("Playbook valid",G,"mauve"),Y8(`
934
+ `),0}return await Y2(X?"Playbook warnings":"Playbook validation failed",zy(Q,Z,Y),X?"mauve":"pink"),Y8(`
935
+ `),X?0:1}async function Ey(){let{spinner:$}=await import("@clack/prompts"),{brandSpinnerOptions:Q}=await Promise.resolve().then(() => (R(),I2));return $(Q("purple"))}async function Cy($){let{extras:Q}=$.args,Z=Q.json===!0,X=Q.verbose===!0,Y=process.cwd(),W=typeof Q.source==="string"?Q.source:void 0,U=[],J=Ly(W,Y,U),G=J.map((C)=>qH(Y,C)),_=Z?void 0:await Ey();_?.start("Loading Playbook topics\u2026");let H=await jy(G,Z,_);if(typeof H==="number")return H;let V=H.warnings;_?.message("Merging core resources\u2026");let q=Oy(V);_?.message("Validating topics\u2026");let K=[...q,...H.topics],B=[...U,...LH(K,V)],L=B.filter((C)=>C.severity===o.ERROR),O=B.filter((C)=>C.severity===o.WARNING),S=L.length===0,M=`${K.length} topic${K.length===1?"":"s"}`;return _?.stop(`Checked ${M}`),Ty(B,L,O,S,J,Z,X)}async function e0($,Q,Z,X,Y,W=[],U){if($)R1(I1("playbook sync",!1,null,W,{code:Q,message:Z,details:U}));else await W2(X,Y)}function Iy($){return{issues:$.map((Q)=>({severity:Q.severity,code:Q.code,message:Q.message,topic:Q.topic,file:Q.file}))}}async function Ry($,Q,Z){let X=LH($,[]);for(let U of X)if(U.severity===o.WARNING)Q.push(`[${U.code}] ${U.message}`);let Y=X.filter((U)=>U.severity===o.ERROR);if(Y.length===0)return;let W=Y.map((U)=>`\u2717 [${U.code}] ${U.message}`).join(`
936
+ `);return await e0(Z,"VALIDATION_FAILED",`Validation failed with ${Y.length} error(s). Run \`sumr playbook validate\` for detail.`,"Playbook validation failed",W,Q,Iy(Y)),1}async function Dy($){if($)return;let{spinner:Q}=await import("@clack/prompts"),{brandSpinnerOptions:Z}=await Promise.resolve().then(() => (R(),I2)),X=Q(Z("purple"));return X.start("Loading Playbook sources\u2026"),X}async function Ny($,Q,Z){let{extras:X}=$.args,Y=process.cwd(),W=ky(Y);if(!W)return await e0(Q,"NO_CONFIG","No sumr.yaml found in the current directory. Run `sumr playbook config` to set up this repo.","No sumr.yaml found","No sumr.yaml found in the current directory. Run `sumr playbook config` to set up this repo."),1;let U=yf($.argv,X,W);if(U.origin===Z8.CONFIG&&U.paths.length===0)return await e0(Q,"INVALID_CONFIG",rZ,"Invalid Playbook configuration",rZ),1;let J=xf(U,Y);if(Z!==void 0&&!G1.includes(Z)){let M=`Unknown channel: "${Z}". Valid channels: ${G1.join(", ")}`;return await e0(Q,"INVALID_CHANNEL",M,"Invalid Playbook channel",[`Requested: ${Z}`,"",`Valid channels: ${G1.join(", ")}`].join(`
937
+ `)),1}let G,_=[],H=await Dy(Q);try{G=vf(J,Y),_.push(...G.warnings)}catch(M){H?.stop("Could not load Playbook sources");let C=M instanceof Error?M.message:"Failed to load Playbook topics.";return await e0(Q,"LOAD_ERROR",C,"Could not load Playbook topics",C),1}if(G.topics.length===0){H?.stop("No Playbook topics found");let M=Kw(U.paths,Y,_);return await e0(Q,"NO_TOPICS",M,"No Playbook topics found",M,_),1}let q={PLAYBOOK_PATH:W.playbook.sources[0]??My,...rN(W)},K=by(G.topics,q);H?.stop(`Loaded ${K.length} topic${K.length===1?"":"s"}`);let B=await Ry(K,_,Q);if(B!==void 0)return B;let L=Y6(W),O=Z?D$.filter((M)=>M.id===Z):D$.filter((M)=>L.includes(M.id)),S=Z?[]:D$.filter((M)=>!L.includes(M.id));return{topics:K,channelsToRun:O,channelsToClean:S,hideGen:W.playbook.hideGen??!1,yamlConfig:W,allWarnings:_,breakdown:G.breakdown}}async function wy($){let{extras:Q}=$.args,Z=Q["dry-run"]===!0,X=Q.json===!0,Y=Q.verbose===!0,W=typeof Q.channel==="string"?Q.channel:void 0,U=await Ny($,X,W);if(typeof U==="number")return U;let{topics:J,channelsToRun:G,channelsToClean:_,hideGen:H,yamlConfig:V,allWarnings:q,breakdown:K}=U;if(X)return wf(J,G.map((B)=>B.id),_,q,Z,K,H,V);return Cf(J,G.map((B)=>B.id),_,q,Z,K,H,V,Y)}function by($,Q){return $.map((Z)=>({...Z,description:M0(Z.description,Q),when:Z.when?M0(Z.when,Q):Z.when,body:M0(Z.body,Q),references:Z.references.map((X)=>({...X,description:M0(X.description,Q),when:X.when?M0(X.when,Q):X.when,body:M0(X.body,Q)}))}))}function ky($){if(!_8($))return;try{return H8($)}catch{return}}var gS,CG,pS,cS,nS,rS,iS,oS,aS,sS,tS,fZ,yZ,bJ,eS,GI=".",_I="'.'",HI="# Playbook",VI,BI,S1,L$,U$,AI,LI='"',OI="'",rZ,zI,t1,uI="",dI,sI,p$,tI,eI=`---
885
938
  name: my-topic
886
939
  title: My Topic
887
940
  description: "What this topic covers. Use when doing X."
@@ -898,7 +951,7 @@ tags: [optional, tags]
898
951
  ## Core Rules
899
952
 
900
953
  Keep the main doc concise. Put deep detail in category: reference files in the same folder.
901
- `,mE=`---
954
+ `,$R=`---
902
955
  category: reference
903
956
  name: my-topic-detail
904
957
  title: Detail Section Title
@@ -913,18 +966,18 @@ order: 10
913
966
  ## Section A
914
967
 
915
968
  Supporting detail that should load on demand.
916
- `,nJ=`docs/
969
+ `,PJ=`docs/
917
970
  -- my-topic/
918
971
  |-- overview.md
919
972
  |-- detail-a.md
920
973
  |-- detail-b.md
921
- -- detail-c.md`,lE=`docs/
974
+ -- detail-c.md`,QR=`docs/
922
975
  -- standards/
923
976
  -- testing/
924
977
  |-- overview.md
925
978
  -- playwright-cli/
926
979
  |-- overview.md \u2190 main topic and invoker
927
- -- command-catalog.md \u2190 category: reference`,pE=`## Flow
980
+ -- command-catalog.md \u2190 category: reference`,ZR=`## Flow
928
981
 
929
982
  Use compact arrows for a simple, mostly linear process:
930
983
 
@@ -949,14 +1002,14 @@ flowchart LR
949
1002
  Transition rules:
950
1003
  - Do not enter implementation until the approval gate is satisfied.
951
1004
  - If review finds missing context, return to draft instead of continuing.
952
- `,cE=`docs/
1005
+ `,XR=`docs/
953
1006
  -- team-members/
954
1007
  |-- orchestrator.tm.md \u2190 drives multi-domain tasks
955
1008
  |-- code-audit-runner.tm.md \u2190 repo-wide quality agent
956
1009
  -- quality-lead.tm.md \u2190 gate-keeper, not domain-specific
957
1010
  -- standards/
958
1011
  -- backend/
959
- -- overview.md`,nE=`docs/
1012
+ -- overview.md`,YR=`docs/
960
1013
  -- standards/
961
1014
  |-- backend/
962
1015
  | |-- overview.md
@@ -966,7 +1019,7 @@ Transition rules:
966
1019
  |-- overview.md
967
1020
  -- frontend-worker.tm.md \u2190 lives beside the frontend docs it follows
968
1021
  -- team-members/
969
- -- orchestrator.tm.md \u2190 cross-domain, stays at root`,iE=`docs/
1022
+ -- orchestrator.tm.md \u2190 cross-domain, stays at root`,WR=`docs/
970
1023
  -- architecture/ \u2190 system design, diagrams, ADRs
971
1024
  |-- system/
972
1025
  | -- overview.md
@@ -989,8 +1042,8 @@ Transition rules:
989
1042
  -- workflows/ \u2190 user-invoked AI workflows
990
1043
  -- ui-review.wf.md
991
1044
  -- lifecycle/ \u2190 optional lifecycle automations
992
- -- session-start.lc.md`,uW,Y7,G7,$C="authoring",QC,JC,S$,e$,KC,qC,H$,oW,w2,d2,y0,vQ="sumr-",aW=":",sW="sumr-playbook",SC,FC,IC,fC,xC,E8,dC,pC,y1,tC,f0,aQ,eC,$S,QS="",XS,US,YY,GY,zY,_Y,KS,qS,BS,LS,aJ="reference",sJ="overview.md",AS,SS=65536,FS,OY,xS,gS,hS,$W="",QW="..",$F="SUMR_PLAYBOOK_RESOURCES_DIR",QF="SUMR_PLAYBOOK_RESOURCES_CACHE_DIR",ZF="@sumr/cli-playbook",XF="playbook",UF="@sumr/devkit",D2,k2,n,x1,JF,IF,kF,P2,eQ,ZW,i,PF,bF,v0,P0,g,d,yF="ask",fF,rF,AY,oF,uQ,aF=".codex/hooks.json",sF=".codex/hooks/",tF=".",D,C7,L8,OI,YW,Q7,v8="<!-- sumr-playbook:managed -->",jI=".",TI,f1=".",RI="*",DI="docs",NI="..",FY="",wI,bI,xI,BW,DY=".",oI="mission-workflow",aI,sI,A$,vY="# SUMR Playbook generated files",xY="# sumr-playbook:start",gY="# sumr-playbook:end",qR=".ignore",BR,hY,LR,AR,DR=".vscode/settings.json",NR,sY,tY,eY,gR,X7="SKILL.md",D8="references",N8=".md",uR,pR,cR,nR,iR,rR,oR,EW,_D,HD="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",OD="metadata",JG,FW="# Generated by SUMR Playbook. Edit the source doc and run `bun run sync`.\n",ID="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",RD="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",YG="<!-- Generated by SUMR Playbook.",GG=".md",zG,DD,ND,wD,$N,q8="sumr playbook sync",QN="bun run sync",U7="# Generated by SUMR Playbook",ZN="# Generated by SUMR Playbook.",VG="<!-- Generated by SUMR Playbook.",XN,RW,UN,OG="## Available Agents",jN,KG="",CN,bN,yN,pN,iN,rN,AG,TG="docs",Ow="--source",kW="--source=",Kw="sumr-",qw="resources",Fw="docs",Iw,Rw=65536,Dw="sumr-",CG="reference",fw,vw,xw=25,gw,hw,Qk,Zk="docs",Xk,Vk,Hk;var IG=c2(()=>{N();N();N();N();N();N();N();N();N();N();N();IT=w$.object({enabled:w$.boolean().optional(),targets:w$.array(w$.string().min(1)).optional(),claudeMd:w$.boolean().optional()}).strict(),yW=w$.object({channels:w$.record(w$.string(),w$.boolean()),sources:w$.array(w$.string().min(1)),hideGen:w$.boolean().optional(),agentsMd:IT.optional()}).strict();PT=["github","gitlab","jira","linear","azure-boards","shortcut","clickup","asana","trello","notion","custom"],bT=["github","gitlab","bitbucket","azure-devops","gitea","codeberg","generic-git","none"],yT=["preview","ask","disabled"],fT=["basic","planning-only","standard-delivery","full-delivery"],vT=["auto","ask","human","manual"],xT={root:"root",playbook:"playbook",kontract:"kontract",mission:"mission",other:"other"},gT={none:"none",channels:"channels",sources:"sources",agentsMd:"agentsMd",agentsMdTargets:"agentsMdTargets"},hT={none:"none",tracker:"tracker",git:"git",flow:"flow",flowSteps:"flowSteps",issuePrefixes:"issuePrefixes"},uT={TRUE:"true",FALSE:"false"},bQ={KONTRACT:"kontract:",MISSION:"mission:",PLAYBOOK:"playbook:"},yQ={BASE_BRANCH:"baseBranch",PROVIDER:"provider",PR_MODE:"prMode"},pJ={REPO_ID:"repoId",RETENTION_DAYS:"retentionDays"},dT={INPUT:"input",OUTPUT:"output"};eT=[];ZE=K1,_1=xT,V$=gT,J$=hT,XE=uT,nQ=["`playbook.sources` is configured in sumr.yaml, but no source paths were found.","","Add at least one source path:"," playbook:"," sources:"," - docs"].join(`
993
- `),WE={version:1,playbook:{channels:{claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},sources:["docs"],agentsMd:{enabled:!0,targets:["."],claudeMd:!0}}};v1={SKILL:"skill",TEAM_MEMBER:"team-member",WORKFLOW:"workflow",LIFECYCLE:"lifecycle",REFERENCE:"reference"};NE={name:"playbook add",description:"Scaffold a new Playbook doc with correct frontmatter",usage:["sumr playbook add","sumr playbook add --source docs/standards/backend"],options:[{flag:"--source <path>",description:"Destination folder (skips the folder prompt)"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook add","sumr playbook add --source docs/standards/backend"]};hE=E({name:"add",description:"Scaffold a new Playbook doc with correct frontmatter",group:"modules",visibility:"public",help:NE,execute:gE}),x$={OVERVIEW:"overview",FRONTMATTER:"frontmatter",STRUCTURE:"structure",FOLDER_PATTERNS:"folderPatterns",REFERENCES:"references",EXTRACTION:"extraction",CODEX:"codex",FLOWS:"flows",FILE_EXTENSIONS:"fileExtensions",PLACEHOLDERS:"placeholders",MODULE_RESOURCES:"moduleResources",CHECKLIST:"checklist"},uE={OVERVIEW:"overview",REFERENCE:"reference",FOLDER:"folder",FLOW:"flow",TEAM_MEMBERS_ROOT:"teamMembersRoot",TEAM_MEMBERS_DOMAIN:"teamMembersDomain",FULL_STRUCTURE:"fullStructure"},uW={version:1,name:"playbook-authoring",description:"Canonical authoring contract for SUMR Playbook Markdown topics, references, and extraction markers.",sourceOfTruth:{localMode:"Canonical content lives in configured repo source paths such as docs/ or playbook/. Modules ship their consumer-facing AI resources from a resources/ root declared in sumr.module.yaml under spec.exports.aiResources.",cloudMode:"Canonical content lives in SUMR Playbook storage and is fetched by the CLI before rendering.",generatedOutput:"Generated AI tool folders are never source of truth. Codex repo skills render to .agents/skills; team-member docs render to native delegated-role folders such as .codex/agents, .claude/agents, .gemini/agents, .opencode/agents, and .github/agents. Codex also gets a generated .codex/AGENTS.md startup guide for routing. Platform topics shipped by Playbook generate flat sumr-<topic> names; module-shipped topics generate the namespaced canonical sumr-<module>:<topic> (filesystem artifacts use sumr-<module>-<topic>)."},sections:{overview:"A Playbook topic is canonical Markdown plus frontmatter. Renderers convert it into Claude, Codex, Cursor, Copilot, Gemini, and OpenCode output.",frontmatter:"Every main topic requires name, title, and description. Reference files also require category, label, when, and order. Advanced AI-tool features live in top-level channel blocks such as codex:, claude:, gemini:, opencode:, copilot:, and cursor:.",structure:"Use one folder per domain or topic context. Put overview.md as the main entry point and category: reference files beside it in the same folder. When splitting an existing file, decide the owning context folder first; do not just add another peer file to a broad folder. Team-members can live in a dedicated root folder (orchestrators, cross-domain agents) or inside their domain folder (domain-specific workers).",folderPatterns:"Root-level team-members/ for orchestrators and generalist agents. Domain-embedded .tm.md files for workers tightly coupled to a specific standards or architecture folder. Workflows live in workflows/ or beside their owning process. Lifecycle automations live in lifecycle/ or beside the domain they guard.",references:"Reference files are supporting detail for the main doc in the same folder. They attach by folder proximity; no references field is allowed.",extraction:"Use extract markers for long examples or templates that should become separate generated files inside skill folders.",codex:"Canonical AI resources use category: team-member for delegated roles, category: workflow for user-invoked prompts, and category: lifecycle for lifecycle automations. When a user asks about hooks, automatic AI checks, session start/stop behavior, or tool-use guardrails, create a lifecycle source doc before editing tool-native hook files. Codex renders team-member resources into .codex agent files plus a generated startup guide, and renders lifecycle resources into hook config/scripts. The legacy category: hook alias is still accepted.",flows:"Document simple workflows with one compact arrow flow. Use [role] for responsible agents or team members, visible gate labels for human decisions, and optional emojis only when they make state changes easier to scan. Use Mermaid for branching, loops, or failure paths.",fileExtensions:"Optional compound extensions imply category without frontmatter: .tm.md \u2192 team-member, .wf.md \u2192 workflow, .lc.md \u2192 lifecycle, .hk.md \u2192 lifecycle legacy alias, .rf.md \u2192 reference. Explicit frontmatter category always wins. Plain .md remains the default for skills.",placeholders:"Use {{PLAYBOOK_PATH}} in topic bodies to reference the user-configured docs directory without hard-coding a path. Use {{TEAM-MEMBER}} when source prose means a generated delegated role; Playbook replaces it per channel (for example Subagent for Claude/Codex/Gemini and Agent for Copilot/OpenCode).",moduleResources:"A SUMR CLI module ships consumer-facing AI resources (usage skills, references, workflows, team-members) from a resources/ directory declared in sumr.module.yaml under spec.exports.aiResources: { module, roots, activation }. Author source topic names UNPREFIXED (e.g. name: usage) \u2014 never start a module source name with sumr-. The renderer namespaces module topics as the canonical sumr-<module>:<topic> and the filesystem-safe sumr-<module>-<topic>, keeping them distinct from flat platform standards (sumr-<topic>) and generic non-SUMR skills. When activation.mode is command, resources install into a consumer repo only after the user runs the declared init command (e.g. `sumr <module> init`); mode always installs whenever the module is present.",checklist:"Before syncing, check required frontmatter, folder structure, reference fields, extraction markers, and generated-output boundaries."},fieldRules:[{name:"name",required:!0,appliesTo:"all",description:"Stable unique kebab-case identifier. Keep source docs unprefixed; SUMR adds managed prefixes to generated outputs (flat sumr-<name> for platform topics, namespaced sumr-<module>:<name> for module-shipped topics). Never start a source name with sumr-."},{name:"title",required:!0,appliesTo:"all",description:"Human-facing title. It may change without breaking generated output identity."},{name:"description",required:!0,appliesTo:"all",description:"AI retrieval summary. Write what the doc covers and when to use it. Quote it in YAML."},{name:"category",required:!1,appliesTo:"all",description:"Content type. Use reference for supporting files; use team-member, workflow, or lifecycle for canonical AI resources that render into tool-specific outputs. The hook value remains a lifecycle alias for older docs."},{name:"target",required:!1,appliesTo:"all",description:"Output file name for generated team-member, workflow, and lifecycle files. The renderer keeps it inside the managed channel directory."},{name:"event",required:!0,appliesTo:"main",description:"Lifecycle event name for category: lifecycle, for example SessionStart, PreToolUse, PostToolUse, UserPromptSubmit, or Stop."},{name:"matcher",required:!1,appliesTo:"main",description:"Optional lifecycle matcher regex or event source filter. For example startup|resume or Bash|apply_patch."},{name:"timeout",required:!1,appliesTo:"main",description:"Optional lifecycle automation timeout in seconds."},{name:"statusMessage",required:!1,appliesTo:"main",description:"Optional short status shown while a lifecycle command runs."},{name:"tags",required:!1,appliesTo:"main",description:"Optional lowercase discovery/scoping labels."},{name:"label",required:!0,appliesTo:"reference",description:"Short display label used in generated reference tables."},{name:"when",required:!0,appliesTo:"reference",description:"Action phrases that tell AI when to load the reference. Use verbs such as Creating, Reviewing, Debugging."},{name:"order",required:!0,appliesTo:"reference",description:"Integer sort order among sibling references. Use gaps such as 10, 20, 30."},{name:"modelTier",required:!1,appliesTo:"main",description:"Optional model class for a team-member: reasoning, coding, or fast. Resolves to a concrete model per channel (Claude \u2192 opus/sonnet/haiku). An env override (SUMR_MODEL_<CHANNEL>_<TIER>) or a native block always takes precedence."},{name:"effort",required:!1,appliesTo:"main",description:"Optional reasoning depth for a team-member: low, medium, or high. Maps to channels that support a native effort knob (Codex model_reasoning_effort). Defaults from modelTier when unset (reasoning\u2192high, coding\u2192medium, fast\u2192low)."},{name:"access",required:!1,appliesTo:"main",description:"Optional permission posture for a team-member: read-only, write, or full. Channels translate it into their sandbox, tools, or permission model (for example Codex sandbox_mode and OpenCode permission)."},{name:"tools",required:!1,appliesTo:"main",description:"Optional agnostic capability tokens for a team-member: read, edit, shell, web, todo, task. Channels translate them into native tool names or permission keys; channels without a tool or permission surface ignore them."},{name:"team-member",required:!1,appliesTo:"main",description:"Optional list of delegated team-member role names used by generated skills to show the agent flow for a workflow."},{name:"review",required:!1,appliesTo:"main",description:"Set true when a standard must be part of reviewer and audit checklists."},{name:"insight",required:!1,appliesTo:"main",description:"Optional discovery labels for conceptual standards, such as core, quality, testing, or security."},{name:"channels",required:!1,appliesTo:"main",description:"Legacy-compatible per-channel hints. Prefer top-level native channel blocks for new docs."},{name:"codex, claude, cursor, copilot, gemini, opencode",required:!1,appliesTo:"main",description:"Optional top-level native channel blocks. Add a short comment above each block that explains the tool and output purpose."}],categories:[{value:"omitted",purpose:"Default main topic/how-to document.",requiredFields:["name","title","description"]},{value:"topic",purpose:"General Playbook entry.",requiredFields:["name","title","description"]},{value:"how-to",purpose:"Procedural guide or reusable workflow.",requiredFields:["name","title","description"]},{value:"reference",purpose:"Supporting detail attached to the main doc in the same folder.",requiredFields:["category","name","title","description","label","when","order"]},{value:"role",purpose:"Role/profile guidance for recurring AI or team behavior.",requiredFields:["name","title","description"]},{value:"team-member",purpose:"Canonical delegated team-member role. Source prose should use {{TEAM-MEMBER}} for the role label; channels render to their native delegated-role profile format.",requiredFields:["name","title","description","category"]},{value:"workflow",purpose:"Canonical user-invoked AI workflow. Claude renders it as a slash command; other channels can map it to their command/prompt surface.",requiredFields:["name","title","description","category"]},{value:"lifecycle",purpose:"Canonical lifecycle guardrail or context automation. Use when a user asks for hooks, startup context, session stop checks, pre/post tool guards, or automatic AI-tool behavior. Codex renders the script, hooks.json binding, and hooks feature flag.",requiredFields:["name","title","description","category","event","target"]},{value:"hook",purpose:"Legacy alias for lifecycle. Prefer category: lifecycle in new docs.",requiredFields:["name","title","description","category","event","target"]}],folderStructure:{pattern:nJ,microconceptPattern:lE,mainDoc:"overview.md is the preferred main entry point for a topic folder.",references:"Reference files live beside overview.md and set category: reference in frontmatter.",contextRules:["If the current folder already has an overview.md and the split content only supports that topic, keep the new files in that folder as category: reference.","If the split content is a substantial subtopic with its own context, create a child folder and put its entry point in child-topic/overview.md.","If a split creates two or more files for one microconcept, promote that microconcept to a child folder; the child overview.md is the invoker/entry point and sibling files are references.","Avoid multiple unrelated main docs in one folder; broad folders should contain child topic folders, not many peer overview-like files.","Before creating a new file, check whether the content should be merged into an existing topic or reference instead."],splitFlow:["Analyze context: identify the domain, the current folder owner, and whether the file is a main topic or supporting detail.","Choose placement: same-folder reference for supporting detail; child folder with overview.md for a substantial standalone subtopic or any microconcept that now needs multiple files.","Split content: keep concise rules and navigation in overview.md; move deep examples, tables, and edge cases into references.","Check naming: use kebab-case filenames, stable name fields, overview.md for the entry point, label/when/order for references, and no generated prefixes in source docs.","Run validation: sumr playbook validate --source docs.","Preview generation: sumr playbook sync --source docs --dry-run --json; run normal sync only after the preview has no warnings or unexpected output."],forbidden:["Do not create references/ folders manually.","Do not split a large doc by adding another main doc beside an existing overview.md when a child topic folder is the real owner.","Do not leave multiple peer files in a broad parent folder when they all describe the same subtopic.","Do not add a references field to frontmatter.","Do not edit generated .claude/.agents/.cursor/.github/.gemini/.opencode output as source."],teamMemberPlacement:{root:"Place orchestrators and cross-domain agents in a dedicated docs/team-members/ folder. These agents are not owned by any one domain and benefit from being visible at the top level.",domainEmbedded:"Place domain-specific workers (e.g. frontend-worker, backend-worker) beside the standards or architecture docs they follow. Co-location reinforces the connection and keeps the agent updated when the domain docs change.",guidance:"Use root placement for agents that coordinate multiple domains or have no natural home. Use domain-embedded placement when the agent role is inseparable from one area of the codebase."},standardsNaming:[{name:"standards",purpose:"Technical rules, specs, and non-negotiable constraints. Clear and precise."},{name:"guidelines",purpose:"Softer guidance and recommendations. Good when rules allow judgment calls."},{name:"playbook",purpose:"Team playbook mixing process, culture, and technical conventions. Good all-in-one name."},{name:"handbook",purpose:"Team handbook including onboarding, culture, and practices alongside tech rules."},{name:"conventions",purpose:"Naming, structure, and pattern conventions. Good when the focus is consistency."},{name:"practices",purpose:"Engineering practices and ways of working. Implies lived habits, not just rules."}],recommendedTopLevel:[{name:"architecture",purpose:"System design, diagrams, ADRs, and infrastructure topology."},{name:"standards",purpose:"Domain-specific technical rules (backend/, frontend/, security/, etc.)."},{name:"team-members",purpose:"Orchestrators and cross-domain AI agents."},{name:"workflows",purpose:"User-invoked AI workflows (.wf.md files) such as PR prep or issue triage."},{name:"lifecycle",purpose:"Lifecycle automation scripts (.lc.md files) that guard or enrich AI sessions and generate AI Channel hooks."},{name:"processes",purpose:"Workflows, release checklists, incident runbooks, and repeatable procedures."}]},extraction:{markerSyntax:`<!-- extract:examples -->
1045
+ -- session-start.lc.md`,DG,U7,J7,qR="authoring",KR,OR,D$,G1,IR,RR,H$,vG,$8,V8,$2,vZ="sumr-",gG=":",hG="sumr-playbook",xR,vR,gR,rR,oR,J6,eR,ZD,F1,HD,Q2,sZ,VD,qD,KD="",AD,LD,iG,oG,aG,sG,ID,RD,DD,ND,vJ="reference",gJ="overview.md",wD,xD=65536,vD,Q_,oD,aD,sD,dJ="",mJ="..",qN="SUMR_PLAYBOOK_RESOURCES_DIR",KN="SUMR_PLAYBOOK_RESOURCES_CACHE_DIR",BN="@sumr/devkit",t2,Q8,A$,X2,AN,xN,dN,Z8,tZ,lJ,o,mN,lN,Z2,t0,d,c,pN="ask",cN,Yw,J_,Ww,dZ,Uw=".codex/hooks.json",Jw=".codex/hooks/",Gw=".",N,F7,Z6,Fw,iJ,$7,E6="<!-- sumr-playbook:managed -->",ww=".",bw,s1=".",vw="*",gw="docs",hw="..",B_="",uw,lw,rw,XG,O_=".",Wb="mission-workflow",Ub,Jb,F$,S_="# SUMR Playbook generated files",I_="# sumr-playbook:start",R_="# sumr-playbook:end",Sb=".ignore",Ib,D_,Rb,Db,gb=".vscode/settings.json",hb,u_,d_,m_,ib,ab,sb,$k="claude",Z7="SKILL.md",K6="references",B6=".md",Qk,Uk,Jk,Gk,_k,Hk,Vk,_G,Ik,Dk="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",Nk="metadata",o_,qG="# Generated by SUMR Playbook. Edit the source doc and run `bun run sync`.\n",mk="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",lk="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",s_="<!-- Generated by SUMR Playbook.",t_=".md",e_,pk,ck,nk,_P,J1,HP,VP,$6="sumr playbook sync",jP="bun run sync",X7="# Generated by SUMR Playbook",TP="# Generated by SUMR Playbook.",QH="<!-- Generated by SUMR Playbook.",EP,BG,CP,XH="## Available Agents",gP,YH="",dP,sP,tP,_f,qf,Kf,GH,VH="docs",kf="--source",zG="--source=",Pf="sumr-",ff="resources",pf="docs",cf,nf=65536,rf="sumr-",y7="reference",Qy,Zy,Xy=25,Yy,Wy,Uy,Fy,My="docs",Sy,Py,fy;var zH=A8(()=>{R();R();R();R();R();R();R();R();R();R();R();gS=x$.object({enabled:x$.boolean().optional(),targets:x$.array(x$.string().min(1)).optional(),claudeMd:x$.boolean().optional()}).strict(),CG=x$.object({channels:x$.record(x$.string(),x$.boolean()),sources:x$.array(x$.string().min(1)),hideGen:x$.boolean().optional(),agentsMd:gS.optional()}).strict();pS=["github","gitlab","jira","linear","azure-boards","shortcut","clickup","asana","trello","notion","custom"],cS=["github","gitlab","bitbucket","azure-devops","gitea","codeberg","generic-git","none"],nS=["preview","ask","disabled"],rS=["basic","planning-only","standard-delivery","full-delivery"],iS=["auto","ask","human","manual"],oS={root:"root",playbook:"playbook",kontract:"kontract",mission:"mission",other:"other"},aS={none:"none",channels:"channels",sources:"sources",agentsMd:"agentsMd",agentsMdTargets:"agentsMdTargets"},sS={none:"none",tracker:"tracker",git:"git",flow:"flow",flowSteps:"flowSteps",issuePrefixes:"issuePrefixes"},tS={TRUE:"true",FALSE:"false"},fZ={KONTRACT:"kontract:",MISSION:"mission:",PLAYBOOK:"playbook:"},yZ={BASE_BRANCH:"baseBranch",PROVIDER:"provider",PR_MODE:"prMode"},bJ={REPO_ID:"repoId",RETENTION_DAYS:"retentionDays"},eS={INPUT:"input",OUTPUT:"output"};VI=[];BI=b1,S1=oS,L$=aS,U$=sS,AI=tS,rZ=["`playbook.sources` is configured in sumr.yaml, but no source paths were found.","","Add at least one source path:"," playbook:"," sources:"," - docs"].join(`
1046
+ `),zI={version:1,playbook:{channels:{claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},sources:["docs"],agentsMd:{enabled:!0,targets:["."],claudeMd:!0}}};t1={SKILL:"skill",TEAM_MEMBER:"team-member",WORKFLOW:"workflow",LIFECYCLE:"lifecycle",REFERENCE:"reference"};dI={name:"playbook add",description:"Scaffold a new Playbook doc with correct frontmatter",usage:["sumr playbook add","sumr playbook add --source docs/standards/backend"],options:[{flag:"--source <path>",description:"Destination folder (skips the folder prompt)"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook add","sumr playbook add --source docs/standards/backend"]};sI=E({name:"add",description:"Scaffold a new Playbook doc with correct frontmatter",group:"modules",visibility:"public",help:dI,execute:aI}),p$={OVERVIEW:"overview",FRONTMATTER:"frontmatter",STRUCTURE:"structure",FOLDER_PATTERNS:"folderPatterns",REFERENCES:"references",EXTRACTION:"extraction",CODEX:"codex",FLOWS:"flows",FILE_EXTENSIONS:"fileExtensions",PLACEHOLDERS:"placeholders",MODULE_RESOURCES:"moduleResources",CHECKLIST:"checklist"},tI={OVERVIEW:"overview",REFERENCE:"reference",FOLDER:"folder",FLOW:"flow",TEAM_MEMBERS_ROOT:"teamMembersRoot",TEAM_MEMBERS_DOMAIN:"teamMembersDomain",FULL_STRUCTURE:"fullStructure"},DG={version:1,name:"authoring",description:"Canonical authoring contract for SUMR Playbook Markdown topics, references, and extraction markers.",sourceOfTruth:{localMode:"Canonical content lives in configured repo source paths such as docs/ or playbook/. Modules ship their consumer-facing AI resources from a resources/ root declared in sumr.module.yaml under spec.exports.aiResources.",cloudMode:"Canonical content lives in SUMR Playbook storage and is fetched by the CLI before rendering.",generatedOutput:"Generated AI tool folders are never source of truth. Codex repo skills render to .agents/skills; team-member docs render to native delegated-role folders such as .codex/agents, .claude/agents, .gemini/agents, .opencode/agents, and .github/agents. Codex also gets a generated .codex/AGENTS.md startup guide for routing. Module-shipped topics generate the namespaced canonical sumr-<module>:<topic> (filesystem artifacts use sumr-<module>-<topic>); non-SUMR local topics keep their authored names."},sections:{overview:"A Playbook topic is canonical Markdown plus frontmatter. Renderers convert it into Claude, Codex, Cursor, Copilot, Gemini, and OpenCode output.",frontmatter:"Every main topic requires name, title, and description. Reference files also require category, label, when, and order. Advanced AI-tool features live in top-level channel blocks such as codex:, claude:, gemini:, opencode:, copilot:, and cursor:.",structure:"Use one folder per domain or topic context. Put overview.md as the main entry point and category: reference files beside it in the same folder. When splitting an existing file, decide the owning context folder first; do not just add another peer file to a broad folder. Team-members can live in a dedicated root folder (orchestrators, cross-domain agents) or inside their domain folder (domain-specific workers).",folderPatterns:"Root-level team-members/ for orchestrators and generalist agents. Domain-embedded .tm.md files for workers tightly coupled to a specific standards or architecture folder. Workflows live in workflows/ or beside their owning process. Lifecycle automations live in lifecycle/ or beside the domain they guard.",references:"Reference files are supporting detail for the main doc in the same folder. They attach by folder proximity; no references field is allowed.",extraction:"Use extract markers for long examples or templates that should become separate generated files inside skill folders.",codex:"Canonical AI resources use category: team-member for delegated roles, category: workflow for user-invoked prompts, and category: lifecycle for lifecycle automations. When a user asks about hooks, automatic AI checks, session start/stop behavior, or tool-use guardrails, create a lifecycle source doc before editing tool-native hook files. Codex renders team-member resources into .codex agent files plus a generated startup guide, and renders lifecycle resources into hook config/scripts. The legacy category: hook alias is still accepted.",flows:"Document simple workflows with one compact arrow flow. Use [role] for responsible agents or team members, visible gate labels for human decisions, and optional emojis only when they make state changes easier to scan. Use Mermaid for branching, loops, or failure paths.",fileExtensions:"Optional compound extensions imply category without frontmatter: .tm.md \u2192 team-member, .wf.md \u2192 workflow, .lc.md \u2192 lifecycle, .hk.md \u2192 lifecycle legacy alias, .rf.md \u2192 reference. Explicit frontmatter category always wins. Plain .md remains the default for skills.",placeholders:"Use {{PLAYBOOK_PATH}} in topic bodies to reference the user-configured docs directory without hard-coding a path. Use {{TEAM-MEMBER}} when source prose means a generated delegated role; Playbook replaces it per channel (for example Subagent for Claude/Codex/Gemini and Agent for Copilot/OpenCode).",moduleResources:"A SUMR CLI module ships consumer-facing AI resources (usage skills, references, workflows, team-members) from a resources/ directory declared in sumr.module.yaml under spec.exports.aiResources: { module, roots, activation }. Author source topic names UNPREFIXED (e.g. name: usage) \u2014 never start a module source name with sumr- or the module prefix. The renderer namespaces module topics as the canonical sumr-<module>:<topic> and the filesystem-safe sumr-<module>-<topic>, keeping them distinct from generic non-SUMR skills. Do not use spec.exports.resources for module AI resources. When activation.mode is command, resources install into a consumer repo only after the user runs the declared init command (e.g. `sumr <module> init`); mode always installs whenever the module is present.",checklist:"Before syncing, check required frontmatter, folder structure, reference fields, extraction markers, and generated-output boundaries."},fieldRules:[{name:"name",required:!0,appliesTo:"all",description:"Stable unique kebab-case identifier. Keep module resource source docs unprefixed; SUMR adds managed prefixes to generated outputs (namespaced sumr-<module>:<name> for module-shipped topics). Never start a source name with sumr- or the module prefix."},{name:"title",required:!0,appliesTo:"all",description:"Human-facing title. It may change without breaking generated output identity."},{name:"description",required:!0,appliesTo:"all",description:"AI retrieval summary. Write what the doc covers and when to use it. Quote it in YAML."},{name:"category",required:!1,appliesTo:"all",description:"Content type. Use reference for supporting files; use team-member, workflow, or lifecycle for canonical AI resources that render into tool-specific outputs. The hook value remains a lifecycle alias for older docs."},{name:"target",required:!1,appliesTo:"all",description:"Output file name for generated team-member, workflow, and lifecycle files. The renderer keeps it inside the managed channel directory."},{name:"event",required:!0,appliesTo:"main",description:"Lifecycle event name for category: lifecycle, for example SessionStart, PreToolUse, PostToolUse, UserPromptSubmit, or Stop."},{name:"matcher",required:!1,appliesTo:"main",description:"Optional lifecycle matcher regex or event source filter. For example startup|resume or Bash|apply_patch."},{name:"timeout",required:!1,appliesTo:"main",description:"Optional lifecycle automation timeout in seconds."},{name:"statusMessage",required:!1,appliesTo:"main",description:"Optional short status shown while a lifecycle command runs."},{name:"tags",required:!1,appliesTo:"main",description:"Optional lowercase discovery/scoping labels."},{name:"label",required:!0,appliesTo:"reference",description:"Short display label used in generated reference tables."},{name:"when",required:!0,appliesTo:"reference",description:"Action phrases that tell AI when to load the reference. Use verbs such as Creating, Reviewing, Debugging."},{name:"order",required:!0,appliesTo:"reference",description:"Integer sort order among sibling references. Use gaps such as 10, 20, 30."},{name:"modelTier",required:!1,appliesTo:"main",description:"Optional model class for a team-member: reasoning, coding, or fast. Resolves to a concrete model per channel (Claude \u2192 opus/sonnet/haiku). An env override (SUMR_MODEL_<CHANNEL>_<TIER>) or a native block always takes precedence."},{name:"effort",required:!1,appliesTo:"main",description:"Optional reasoning depth for a team-member: low, medium, or high. Maps to channels that support a native effort knob (Codex model_reasoning_effort). Defaults from modelTier when unset (reasoning\u2192high, coding\u2192medium, fast\u2192low)."},{name:"access",required:!1,appliesTo:"main",description:"Optional permission posture for a team-member: read-only, write, or full. Channels translate it into their sandbox, tools, or permission model (for example Codex sandbox_mode and OpenCode permission)."},{name:"tools",required:!1,appliesTo:"main",description:"Optional agnostic capability tokens for a team-member: read, edit, shell, web, todo, task. Channels translate them into native tool names or permission keys; channels without a tool or permission surface ignore them."},{name:"nicknames",required:!1,appliesTo:"main",description:"Optional agnostic pool of friendly display names for spawned team-member instances. Codex renders this as nickname_candidates; other channels ignore it until they expose an equivalent."},{name:"team-member",required:!1,appliesTo:"main",description:"Optional list of delegated team-member role names used by generated skills to show the agent flow for a workflow."},{name:"review",required:!1,appliesTo:"main",description:"Set true when a standard must be part of reviewer and audit checklists."},{name:"insight",required:!1,appliesTo:"main",description:"Optional discovery labels for conceptual standards, such as core, quality, testing, or security."},{name:"channels",required:!1,appliesTo:"main",description:"Legacy-compatible per-channel hints. Prefer top-level native channel blocks for new docs."},{name:"codex, claude, cursor, copilot, gemini, opencode",required:!1,appliesTo:"main",description:"Optional top-level native channel blocks. Add a short comment above each block that explains the tool and output purpose."}],categories:[{value:"omitted",purpose:"Default main topic/how-to document.",requiredFields:["name","title","description"]},{value:"topic",purpose:"General Playbook entry.",requiredFields:["name","title","description"]},{value:"how-to",purpose:"Procedural guide or reusable workflow.",requiredFields:["name","title","description"]},{value:"reference",purpose:"Supporting detail attached to the main doc in the same folder.",requiredFields:["category","name","title","description","label","when","order"]},{value:"role",purpose:"Role/profile guidance for recurring AI or team behavior.",requiredFields:["name","title","description"]},{value:"team-member",purpose:"Canonical delegated team-member role. Source prose should use {{TEAM-MEMBER}} for the role label; channels render to their native delegated-role profile format.",requiredFields:["name","title","description","category"]},{value:"workflow",purpose:"Canonical user-invoked AI workflow. Claude renders it as a slash command; other channels can map it to their command/prompt surface.",requiredFields:["name","title","description","category"]},{value:"lifecycle",purpose:"Canonical lifecycle guardrail or context automation. Use when a user asks for hooks, startup context, session stop checks, pre/post tool guards, or automatic AI-tool behavior. Codex renders the script, hooks.json binding, and hooks feature flag.",requiredFields:["name","title","description","category","event","target"]},{value:"hook",purpose:"Legacy alias for lifecycle. Prefer category: lifecycle in new docs.",requiredFields:["name","title","description","category","event","target"]}],folderStructure:{pattern:PJ,microconceptPattern:QR,mainDoc:"overview.md is the preferred main entry point for a topic folder.",references:"Reference files live beside overview.md and set category: reference in frontmatter.",contextRules:["If the current folder already has an overview.md and the split content only supports that topic, keep the new files in that folder as category: reference.","If the split content is a substantial subtopic with its own context, create a child folder and put its entry point in child-topic/overview.md.","If a split creates two or more files for one microconcept, promote that microconcept to a child folder; the child overview.md is the invoker/entry point and sibling files are references.","Avoid multiple unrelated main docs in one folder; broad folders should contain child topic folders, not many peer overview-like files.","Before creating a new file, check whether the content should be merged into an existing topic or reference instead."],splitFlow:["Analyze context: identify the domain, the current folder owner, and whether the file is a main topic or supporting detail.","Choose placement: same-folder reference for supporting detail; child folder with overview.md for a substantial standalone subtopic or any microconcept that now needs multiple files.","Split content: keep concise rules and navigation in overview.md; move deep examples, tables, and edge cases into references.","Check naming: use kebab-case filenames, stable name fields, overview.md for the entry point, label/when/order for references, and no generated prefixes in source docs.","Run validation: sumr playbook validate --source docs.","Preview generation: sumr playbook sync --source docs --dry-run --json; run normal sync only after the preview has no warnings or unexpected output."],forbidden:["Do not create references/ folders manually.","Do not split a large doc by adding another main doc beside an existing overview.md when a child topic folder is the real owner.","Do not leave multiple peer files in a broad parent folder when they all describe the same subtopic.","Do not add a references field to frontmatter.","Do not edit generated .claude/.agents/.cursor/.github/.gemini/.opencode output as source."],teamMemberPlacement:{root:"Place orchestrators and cross-domain agents in a dedicated docs/team-members/ folder. These agents are not owned by any one domain and benefit from being visible at the top level.",domainEmbedded:"Place domain-specific workers (e.g. frontend-worker, backend-worker) beside the standards or architecture docs they follow. Co-location reinforces the connection and keeps the agent updated when the domain docs change.",guidance:"Use root placement for agents that coordinate multiple domains or have no natural home. Use domain-embedded placement when the agent role is inseparable from one area of the codebase."},standardsNaming:[{name:"standards",purpose:"Technical rules, specs, and non-negotiable constraints. Clear and precise."},{name:"guidelines",purpose:"Softer guidance and recommendations. Good when rules allow judgment calls."},{name:"playbook",purpose:"Team playbook mixing process, culture, and technical conventions. Good all-in-one name."},{name:"handbook",purpose:"Team handbook including onboarding, culture, and practices alongside tech rules."},{name:"conventions",purpose:"Naming, structure, and pattern conventions. Good when the focus is consistency."},{name:"practices",purpose:"Engineering practices and ways of working. Implies lived habits, not just rules."}],recommendedTopLevel:[{name:"architecture",purpose:"System design, diagrams, ADRs, and infrastructure topology."},{name:"standards",purpose:"Domain-specific technical rules (backend/, frontend/, security/, etc.)."},{name:"team-members",purpose:"Orchestrators and cross-domain AI agents."},{name:"workflows",purpose:"User-invoked AI workflows (.wf.md files) such as PR prep or issue triage."},{name:"lifecycle",purpose:"Lifecycle automation scripts (.lc.md files) that guard or enrich AI sessions and generate AI Channel hooks."},{name:"processes",purpose:"Workflows, release checklists, incident runbooks, and repeatable procedures."}]},extraction:{markerSyntax:`<!-- extract:examples -->
994
1047
  ## Examples
995
1048
 
996
1049
  \`\`\`text
@@ -1001,10 +1054,7 @@ Transition rules:
1001
1054
  \u251C\u2500\u2500 locators.md
1002
1055
  \u2514\u2500\u2500 fixtures.md
1003
1056
  \`\`\`
1004
- <!-- /extract:examples -->`,generatedFile:"The marker name becomes a generated section file, for example examples.md inside skill folders, and the skill gets an Additional resources link.",whenToUse:["Long examples","Reusable templates","Dedicated sample sections","Boilerplate that should be available on demand"],keepInline:["Short snippets that are central to the instruction","Small config examples","Directory trees","Schema outlines","ASCII diagrams"]},examples:{overview:dE,reference:mE,folder:nJ,flow:pE,teamMembersRoot:cE,teamMembersDomain:nE,fullStructure:iE},checklist:["Main topics have name, title, and description.","Descriptions explain what plus when and are quoted in YAML.","Main docs include a When to Use section.","Reference files set category: reference.","Reference files have label, when, and order.","Reference files live in the same folder as the main doc.","Splitting starts by choosing the owning context folder before creating files.","Standalone subtopics split into child folders with overview.md; supporting detail splits into same-folder references.","No references/ folder is created manually.","No references frontmatter field is used.","Dedicated examples, samples, and templates use extract markers.","Lifecycle docs include event, target, and optional matcher, timeout, and statusMessage.","When users ask for hooks or automatic AI-tool behavior, create or update a lifecycle doc first; do not hand-edit generated hook outputs as source.","Workflow docs define a user-invoked procedure and optional per-channel command metadata.","Simple workflow docs include a compact arrow flow; branching workflows use Mermaid plus transition rules.","Codex output is generated from canonical team-member/lifecycle docs and uses [features].hooks.","Team-member docs define name, description, and body instructions. Native channel blocks are the escape hatch for tool-specific agent features.","Add a short # comment above every native channel block so humans can scan which AI tool it configures.","Use role archetype names such as orchestrator, product-owner, researcher, planner, implementer, reviewer, and validator as guidance, not required frontmatter.","Generated AI tool folders are not edited as source.","Use {{PLAYBOOK_PATH}} instead of hard-coding docs/ or other source paths in topic bodies.","Module resources are declared in sumr.module.yaml spec.exports.aiResources (module, roots, activation), not hand-wired into Playbook.","Module source topic names are unprefixed; the renderer adds the sumr-<module>: namespace. Never author a source name starting with sumr-.","Command-activated modules document their init command; resources install only after the user runs it."]},Y7=Object.values(x$),G7=Object.values(uE);QC={name:"playbook authoring",description:"Print the canonical Playbook Markdown authoring contract",usage:["sumr playbook authoring","sumr playbook authoring --section structure","sumr playbook authoring --example reference","sumr playbook authoring --json"],options:[{flag:"--section <id>",description:`Only print one section (${Y7.join(", ")})`},{flag:"--example <id>",description:`Only print one example (${G7.join(", ")})`},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook authoring","sumr playbook authoring --section frontmatter","sumr playbook authoring --section structure --json","sumr playbook authoring --example overview"]};JC=E({name:"authoring",description:"Print the canonical Playbook Markdown authoring contract",group:"modules",visibility:"public",help:QC,execute:UC}),S$=[{id:"claude",displayName:"Claude Code",outputDir:".claude/skills",filePattern:/^sumr-.+$/,vscodeExcludePattern:".claude/skills/sumr-*",gitignorePatterns:[".claude/skills/sumr-*/",".claude/agents/sumr-*",".claude/hooks/sumr-*",".claude/commands/sumr-*",".claude/rules/sumr-*"]},{id:"codex",displayName:"Codex CLI",outputDir:".agents/skills",legacyOutputDirs:[".codex/skills"],filePattern:/^sumr-.+$/,vscodeExcludePattern:".agents/skills/sumr-*",gitignorePatterns:[".agents/skills/sumr-*/",".codex/skills/sumr-*/",".codex/agents/sumr-*.toml"]},{id:"cursor",displayName:"Cursor",outputDir:".cursor/rules",filePattern:/^sumr-.+\.mdc$/,vscodeExcludePattern:".cursor/rules/sumr-*",gitignorePatterns:[".cursor/rules/sumr-*"]},{id:"copilot",displayName:"GitHub Copilot",outputDir:".github/instructions",filePattern:/^sumr-.+\.md$/,vscodeExcludePattern:".github/instructions/sumr-*",gitignorePatterns:[".github/instructions/sumr-*",".github/agents/sumr-*"]},{id:"gemini",displayName:"Gemini CLI",outputDir:".gemini/skills",filePattern:/^sumr-.+$/,vscodeExcludePattern:".gemini/skills/sumr-*",gitignorePatterns:[".gemini/skills/sumr-*/",".gemini/agents/sumr-*"]},{id:"opencode",displayName:"OpenCode",outputDir:".opencode/commands",filePattern:/^sumr-.+\.md$/,vscodeExcludePattern:".opencode/commands/sumr-*",gitignorePatterns:[".opencode/commands/sumr-*",".opencode/agents/sumr-*"]}],e$=S$.map(($)=>$.id);KC={PLAYBOOK_PATH:"{{PLAYBOOK_PATH}}",TEAM_MEMBER:"{{TEAM-MEMBER}}",MISSION_TRIGGER_HINTS:"{{MISSION_TRIGGER_HINTS}}",MISSION_IDENTIFIER_GUIDANCE:"{{MISSION_IDENTIFIER_GUIDANCE}}",MISSION_START_EXAMPLES:"{{MISSION_START_EXAMPLES}}",MISSION_FLOW_PRESET:"{{MISSION_FLOW_PRESET}}",MISSION_FLOW_TEXT:"{{MISSION_FLOW_TEXT}}",MISSION_FLOW_STEPS:"{{MISSION_FLOW_STEPS}}",MISSION_PR_MODE:"{{MISSION_PR_MODE}}"};qC={claude:"Subagent",codex:"Subagent",cursor:"Subagent",copilot:"Agent",gemini:"Subagent",opencode:"Agent"};H$={CORE:"core",LOCAL:"local"},oW={REASONING:"reasoning",CODING:"coding",FAST:"fast"},w2={LOW:"low",MEDIUM:"medium",HIGH:"high"},d2={READ_ONLY:"read-only",WRITE:"write",FULL:"full"},y0={READ:"read",EDIT:"edit",SHELL:"shell",WEB:"web",TODO:"todo",TASK:"task"};SC=/\n?<!--\s*extract:(\w+)\s*-->([\s\S]*?)<!--\s*\/extract:\1\s*-->\n?/g,FC=/```[\s\S]*?```/g,IC=[];fC={name:"playbook clean",description:"Remove SUMR-managed Playbook outputs from the current repo",usage:["sumr playbook clean","sumr playbook clean --channel claude","sumr playbook clean --dry-run","sumr playbook clean --json"],options:[{flag:"--channel <id>",description:`Channel to clean (one of: ${e$.join(", ")})`},{flag:"--dry-run",description:"Preview deletions without writing to disk"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook clean","sumr playbook clean --channel claude","sumr playbook clean --dry-run"]};xC=E({name:"clean",description:"Remove SUMR-managed Playbook outputs from the current repo",group:"modules",visibility:"public",help:fC,execute:vC}),E8={DISCARD:"__discard__",SAVE:"__save__"};dC={name:"playbook config",description:"Set up or update Playbook configuration for this repo",usage:["sumr playbook config"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook config"]};pC=E({name:"config",description:"Set up or update Playbook configuration for this repo",group:"modules",visibility:"public",help:dC,execute:lC}),y1={TAGS:"tags",FRAMEWORK:"framework",TECH:"tech",GUIDE:"guide",INSIGHT:"insight",TOPIC:"topic",TEAM_MEMBERS:"teamMembers",TOOLS:"tools"},tC={NAME:"name",TITLE:"title",DESCRIPTION:"description",CATEGORY:"category",TARGET:"target",EVENT:"event",MATCHER:"matcher",STATUS_MESSAGE:"statusMessage",LABEL:"label",WHEN:"when",MODEL_TIER:"modelTier",EFFORT:"effort",ACCESS:"access"},f0={CHANNELS:"channels",ORDER:"order",REVIEW:"review",TEAM_MEMBER:"team-member",TIMEOUT:"timeout"},aQ={TRUE:"true",FALSE:"false"},eC=new Set(["claude","codex","cursor","copilot","gemini","opencode"]),$S=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;XS=new Set([y1.TAGS,y1.FRAMEWORK,y1.TECH,y1.GUIDE,y1.INSIGHT,y1.TOPIC,y1.TOOLS,f0.TEAM_MEMBER]),US=new Set(Object.values(tC));YY=new Set(Object.values(oW)),GY=new Set(Object.values(w2)),zY=new Set(Object.values(d2)),_Y=new Set(Object.values(y0)),KS=Object.values(oW),qS=Object.values(w2),BS=Object.values(d2),LS=Object.values(y0),AS=[];FS={".tm.md":"team-member",".lc.md":"lifecycle",".hk.md":"lifecycle",".wf.md":"workflow",".rf.md":"reference"};OY={dev:"dev",cache:"cache",bundled:"bundled",missing:"missing"},xS={always:"always",command:"command"},gS={none:"none",metadata:"metadata",exports:"exports",resources:"resources",aiResources:"aiResources",aiActivation:"aiActivation"},hS={ACTIVATION:"activation:",AI_RESOURCES:"aiResources:",EXPORTS:"exports:",METADATA:"metadata:",RESOURCES:"resources:",ROOTS:"roots:"};D2=OY,k2=xS,n=gS,x1=hS,JF=["sumr.module.yaml","sumr.module.yml","module.yaml","module.yml"];IF={name:"playbook status",description:"Show Playbook configuration and topic counts for the current repo",usage:["sumr playbook status","sumr playbook status --json"],options:[{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook status"]};kF=E({name:"status",description:"Show Playbook configuration and topic counts for the current repo",group:"modules",visibility:"public",help:IF,execute:wF}),P2={CONFIG:"config",DEFAULT:"default",EXPLICIT:"explicit"},eQ={ERROR:"error",SKIP:"skip"},ZW={REFERENCE:"reference",TOPIC:"topic"},i={ERROR:"error",WARNING:"warning"},PF={github:{tracker:"github",label:"GitHub",softwareNames:["GitHub issues","GitHub Projects"],nouns:["issue numbers","#123","GH-123","GitHub issue","GitHub ticket"],defaultPrefix:"GH",rawIssueExample:"4501",normalizedIssueKey:"GH-4501",normalizedKeyPattern:"GH-<number>",referenceExamples:["issue 4501","#4501","issue #4501","GitHub issue 4501","GitHub #4501","GH-4501","github.com/org/repo/issues/4501"],sourceGuidance:"GitHub issue numbers normalize to `GH-<number>`. GitHub Projects cards should still resolve to the underlying issue when one exists.",apiGuidance:"When an MCP/API gives a GitHub issue number, pass the raw number with `--tracker github --issue <number>`."},gitlab:{tracker:"gitlab",label:"GitLab",softwareNames:["GitLab issues"],nouns:["issue IIDs","#123","GL-123","GitLab issue","GitLab ticket"],defaultPrefix:"GL",rawIssueExample:"4501",normalizedIssueKey:"GL-4501",normalizedKeyPattern:"GL-<iid>",referenceExamples:["issue 4501","#4501","issue #4501","GitLab issue 4501","GitLab #4501","GL-4501","gitlab.com/org/repo/-/issues/4501"],sourceGuidance:"GitLab issue IIDs normalize to `GL-<iid>`. Prefer the project-local IID over a global database ID.",apiGuidance:"When an MCP/API gives a GitLab issue IID, pass the raw IID with `--tracker gitlab --issue <iid>`."},jira:{tracker:"jira",label:"Jira",softwareNames:["Jira","Jira Software"],nouns:["ticket","issue","story","bug","task","epic"],defaultPrefix:"PROJECT",rawIssueExample:"PROJECT-123",normalizedIssueKey:"PROJECT-123",normalizedKeyPattern:"<PROJECT>-<number>",referenceExamples:["PROJECT-123","Jira ticket PROJECT-123","story PROJECT-123"],sourceGuidance:"Jira references should use the full project key and number. A bare phrase like `issue 4501` is not enough unless trusted tracker context supplies the project key.",apiGuidance:"When an MCP/API gives a Jira issue key, pass the full key with `--tracker jira --issue <PROJECT-123>`."},linear:{tracker:"linear",label:"Linear",softwareNames:["Linear"],nouns:["issue","ticket","team key","project","cycle"],defaultPrefix:"TEAM",rawIssueExample:"TEAM-123",normalizedIssueKey:"TEAM-123",normalizedKeyPattern:"<TEAM>-<number>",referenceExamples:["TEAM-123","Linear issue TEAM-123","cycle issue TEAM-123"],sourceGuidance:"Linear references should use the full team key and number. A bare phrase like `issue 4501` is not enough unless trusted tracker context supplies the team key.",apiGuidance:"When an MCP/API gives a Linear issue identifier, pass the full key with `--tracker linear --issue <TEAM-123>`."},custom:{tracker:"custom",label:"Custom",softwareNames:["custom notes","local task lists"],nouns:["custom work ID","note","local slug","named task","non-ticket work"],defaultPrefix:"TASK",rawIssueExample:"release-notes-pass",normalizedIssueKey:"release-notes-pass",normalizedKeyPattern:"<local-label>",referenceExamples:["release-notes-pass","checkout race condition","manual QA pass","non-ticket task"],sourceGuidance:"Custom references become safe local Mission IDs. Use this for work that does not have a tracker-owned key.",apiGuidance:'When an MCP/API gives only a name or note title, pass it with `--tracker custom --issue "<local label>"`.'}},bF=["Azure DevOps work items (`AB#123`, `work item 123`)","ClickUp tasks","Asana tasks","Trello cards","Notion tasks"],v0={CUSTOM:"custom",JIRA:"jira",LINEAR:"linear"},P0={BASIC:"basic",PLANNING_ONLY:"planning-only",STANDARD_DELIVERY:"standard-delivery",FULL_DELIVERY:"full-delivery"},g={AUTO:"auto",ASK:"ask",HUMAN:"human",MANUAL:"manual"},d={ISSUE_SYNC:"issue.sync",CONTEXT_RESEARCH:"context.research",PLAN_CREATE:"plan.create",PLAN_APPROVE:"plan.approve",BRANCH_CHECK:"branch.check",WORK_CLAIM:"work.claim",IMPLEMENTATION_REPORT:"implementation.report",REVIEW_REPORT:"review.report",VALIDATION_REPORT:"validation.report",QUALITY_GATE:"quality.gate",PR_PREPARE:"pr.prepare",PR_CREATE:"pr.create",MISSION_CLOSE:"mission.close"},fF=[];rF={claude:[".claude/agents",".claude/hooks",".claude/commands"],codex:[".codex/agents",".codex/hooks"],opencode:[".opencode/agents"]},AY=[],oF=[],uQ=OY;D={CLAUDE_ONLY:"claude-only",CLOSEOUT:"closeout",COMMAND:"command",CONVENTION:"convention",MAP:"map",OVERVIEW:"overview",RULE:"rule",SECURITY:"security",STARTUP:"startup",STUCK:"stuck"},C7=[D.OVERVIEW,D.STARTUP,D.MAP,D.RULE,D.COMMAND,D.CONVENTION,D.SECURITY,D.CLOSEOUT,D.STUCK,D.CLAUDE_ONLY],L8={ID:"id",ORDER:"order",SCOPE:"scope"},OI=new Set([D.OVERVIEW,D.STUCK]),YW=new Set(Object.values(L8)),Q7=/<!--\s*agents-md:([a-z-]+)((?:\s+[a-z]+=[^\s>]+)*)\s*-->([\s\S]*?)<!--\s*\/agents-md:\1\s*-->/g;TI=[];wI=[];bI=[D.STARTUP,D.CLOSEOUT,D.MAP,D.RULE,D.COMMAND,D.CONVENTION,D.SECURITY];xI={};BW=["purpose","before-you-start","mission-issue-routing","repo-map","hard-rules","common-commands","code-conventions","security","closeout","if-stuck"],aI=[],sI=[{id:"root-claude-md",channelIds:["claude"],targetPath:"CLAUDE.md",title:"Claude project memory",sectionIds:[...BW,"claude-specific"],appliesTo:LW},{id:"root-agents-md",channelIds:["codex"],targetPath:"AGENTS.md",title:"Agent instructions",sectionIds:BW,appliesTo:LW}];A$={APPEND:"append",SKIP:"skip",CANCEL:"cancel"};BR=[],hY=["!docs/standards/devkit/","!docs/standards/devkit/**"],LR={claude:["!.claude/","!.claude/skills/","!.claude/skills/**","!.claude/agents/","!.claude/agents/**","!.claude/hooks/","!.claude/hooks/**","!.claude/commands/","!.claude/commands/**","!.claude/rules/","!.claude/rules/**"],codex:["!.agents/","!.agents/skills/","!.agents/skills/**","!.codex/","!.codex/AGENTS.md","!.codex/config.toml","!.codex/hooks.json","!.codex/agents/","!.codex/agents/**","!.codex/hooks/","!.codex/hooks/**"],cursor:["!.cursor/","!.cursor/rules/","!.cursor/rules/**"],copilot:["!.github/","!.github/instructions/","!.github/instructions/**","!.github/agents/","!.github/agents/**"],gemini:["!.gemini/","!.gemini/skills/","!.gemini/skills/**","!.gemini/agents/","!.gemini/agents/**"],opencode:["!.opencode/","!.opencode/commands/","!.opencode/commands/**","!.opencode/agents/","!.opencode/agents/**"]},AR=[{channelId:"cursor",file:".cursorignore",allowEntries:["!.cursor/","!.cursor/rules/","!.cursor/rules/**"],extraEntryPrefixes:[".cursor/"]},{channelId:"gemini",file:".geminiignore",allowEntries:["!.gemini/","!.gemini/skills/","!.gemini/skills/**","!.gemini/agents/","!.gemini/agents/**"],extraEntryPrefixes:[".gemini/"]}];NR={"*.tm.md":"robot","*.wf.md":"rocket","*.lc.md":"settings","*.hk.md":"settings","*.rf.md":"changelog"};sY=["team-member"],tY=["lifecycle","hook"],eY=["workflow"],gR=[...sY,...tY,...eY];uR=[];pR={claude:{id:"claude",models:{reasoning:"opus",coding:"sonnet",fast:"haiku"},toolMap:{read:["Read","Grep","Glob"],edit:["Read","Edit","Write"],shell:["Bash"],web:["WebFetch","WebSearch"],todo:["TodoWrite"],task:["Task"]},toolFormat:"comma-string",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},codex:{id:"codex",models:{},features:{model:!0,tools:!1,permissions:!1,reasoningEffort:!0,sandbox:!0}},gemini:{id:"gemini",models:{},toolMap:{read:["read_file","read_many_files","list_directory","glob","grep_search"],edit:["replace","write_file"],shell:["run_shell_command"],web:["web_fetch","google_web_search"],todo:["write_todos"]},toolFormat:"array",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},opencode:{id:"opencode",models:{},toolMap:{read:["read","glob","grep","list"],edit:["edit"],shell:["bash"],web:["webfetch","websearch"],todo:["todowrite"],task:["task"]},toolFormat:"permission",features:{model:!0,tools:!1,permissions:!0,reasoningEffort:!1,sandbox:!1}},copilot:{id:"copilot",models:{},toolMap:{read:["read","search"],edit:["edit"],shell:["execute"],web:["web"],todo:["todo"],task:["agent"]},toolFormat:"array",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},cursor:{id:"cursor",models:{},features:{model:!0,tools:!1,permissions:!1,reasoningEffort:!1,sandbox:!1}}},cR=["Read","Grep","Glob","Edit","Write","Bash","WebFetch","WebSearch","TodoWrite","Task"],nR=["read","glob","grep","list","edit","bash","webfetch","websearch","todowrite","task"],iR={"read-only":[y0.READ],write:[y0.READ,y0.EDIT,y0.SHELL]},rR={"read-only":"read-only",write:"workspace-write",full:"danger-full-access"},oR={reasoning:w2.HIGH,coding:w2.MEDIUM,fast:w2.LOW},EW={model:["model"],tools:["tools"],permissions:["permission"],reasoningEffort:["model_reasoning_effort","modelReasoningEffort"],sandbox:["sandbox_mode","sandboxMode","sandbox-mode"]};_D=["bash","sh","python","py","javascript","js","ts"],JG={};zG=new Set([".sh",".py",".js",".ts"]),DD={},ND={bash:"sh",sh:"sh",python:"py",py:"py",javascript:"js",js:"js",ts:"ts"},wD={bash:"#!/usr/bin/env bash",sh:"#!/bin/sh",python:"#!/usr/bin/env python3",py:"#!/usr/bin/env python3",javascript:"#!/usr/bin/env node",js:"#!/usr/bin/env node",ts:"#!/usr/bin/env bun"};$N=["bash","sh","python","py","javascript","js","ts"],XN=/^#!.*\r?\n# Generated by SUMR Playbook/,RW=/^# Generated by SUMR Playbook\.[^\r\n]*(?:\r?\n|$)/,UN=/\b(?:sumr-devkit\s+sync|sumr\s+playbook\s+sync)\b/;jN={};CN=[["model","model"],["modelReasoningEffort","model_reasoning_effort"],["model_reasoning_effort","model_reasoning_effort"],["sandboxMode","sandbox_mode"],["sandbox_mode","sandbox_mode"],["sandbox-mode","sandbox_mode"]];bN={bash:"sh",sh:"sh",python:"py",py:"py",javascript:"js",js:"js",ts:"ts"},yN={bash:"#!/usr/bin/env bash",sh:"#!/bin/sh",python:"#!/usr/bin/env python3",py:"#!/usr/bin/env python3",javascript:"#!/usr/bin/env node",js:"#!/usr/bin/env node",ts:"#!/usr/bin/env bun"};pN={};iN={mode:"subagent"},rN={channelId:"opencode",outputDir:".opencode/agents",generatedFilePattern:/^sumr-.+\.md$/,defaultProps:iN};AG={claude:lD,codex:dN,cursor:cN,copilot:lN,gemini:nN,opencode:oN};Iw={name:"playbook validate",description:"Check Playbook docs for errors without writing any files",usage:["sumr playbook validate","sumr playbook validate --source docs","sumr playbook validate --json"],options:[{flag:"--source <path>",description:"Path to docs folder (overrides sumr.yaml)"},{flag:"--verbose",description:"On success, also list every source that was checked"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook validate","sumr playbook validate --verbose","sumr playbook validate --json"]};fw=[/<[a-z][a-z0-9 _-]*command>/i,/<your[ -][^>]*>/i,/<placeholder[^>]*>/i,/\bREPLACE (?:THIS|ME|WITH)\b/i,/\bFILL IN\b/i],vw=/\b(?:use (?:when|this|it|for)|when (?:you|the|a|implementing|adding|debugging|reviewing|writing|creating|editing|working|changing|building)|before |after |during )/i,gw=/\[[^\]]*\]\(([^)]+)\)/g,hw=/(^|\n)( {0,3}```[\s\S]*?(?:\n {0,3}```|$))/g;Qk=E({name:"validate",description:"Check Playbook docs for errors without writing any files",group:"modules",visibility:"public",help:Iw,execute:$k}),Xk={name:"playbook sync",description:"Sync Playbook topics into AI tool channels",usage:["sumr playbook sync","sumr playbook sync --source docs","sumr playbook sync --source docs --channel claude","sumr playbook sync --dry-run","sumr playbook sync --json"],options:[{flag:"--source <path>",description:"Source directory containing canonical .md files (repeatable)"},{flag:"--channel <id>",description:`Channel to sync (one of: ${e$.join(", ")})`},{flag:"--dry-run",description:"Preview changes without writing to disk"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--verbose",description:"Show detailed warnings, sources, and generated outputs"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook sync","sumr playbook sync --source docs --channel claude","sumr playbook sync --dry-run"]};Vk=E({name:"sync",description:"Sync Playbook topics into AI tool channels",group:"modules",visibility:"public",help:Xk,execute:Gk}),Hk=L1({name:"playbook",description:"Sync Playbook docs into AI tools",group:"modules",visibility:"public",commands:[pC,Vk,Qk,kF,hE,xC,JC]})});import{log as yG}from"@clack/prompts";N();import{spawnSync as GZ}from"child_process";function l$($,Q){let Z=process.env[$];if(!Z)return Q;let X=Number(Z);return Number.isFinite(X)?X:Q}var t8=".sumr",UZ=".sumr-local-link",s0="1.1.0",e8="1.3.0",JZ=l$("SUMR_AWS_CREDENTIAL_TIMEOUT_MS",15000),a2=l$("SUMR_TOOL_VERSION_TIMEOUT_MS",5000),WZ=l$("SUMR_KEYCHAIN_COMMAND_TIMEOUT_MS",15000),kk=l$("SUMR_BUILD_COMMAND_TIMEOUT_MS",120000),Pk=l$("SUMR_CHECK_COMMAND_TIMEOUT_MS",30000),bk=l$("SUMR_NPM_COMMAND_TIMEOUT_MS",30000),yk=l$("SUMR_TARBALL_CONTENT_BUFFER_BYTES",16777216),s2="1",YZ="SUMR_NO_KEYCHAIN",$9="SUMR_ALLOW_PLAINTEXT_AUTH_FILE",fk=l$("SUMR_LOCAL_CLI_COMMAND_TIMEOUT_MS",120000),Q9=l$("SUMR_API_REQUEST_TIMEOUT_MS",30000),Z9=l$("SUMR_IDENTITY_REQUEST_TIMEOUT_MS",30000);function zZ(){return{...process.env}}function _Z(){return process.env.SUMR_AWS_BIN?.trim()||"aws"}function VZ(){return GZ(_Z(),["--version"],{stdio:"pipe",env:zZ(),timeout:JZ}).status===0}function HZ(){let $=GZ(_Z(),["--version"],{stdio:"pipe",encoding:"utf8",env:zZ(),timeout:a2});if($.status!==0)return;return`${$.stdout}
1005
- ${$.stderr}`.trim()||void 0}var BZ="Bun runtime",LZ="Bun version",h4="Bun recommended version";function OZ($){let Q=$.match(/^v?(\d+)\.(\d+)\.(\d+)/);if(!Q)return;return[Number(Q[1]),Number(Q[2]),Number(Q[3])]}function KZ($,Q){let Z=OZ($),X=OZ(Q);if(!Z||!X)return!1;if(Z[0]!==X[0])return Z[0]>X[0];if(Z[1]!==X[1])return Z[1]>X[1];return Z[2]>=X[2]}function qZ($,Q){return $.checks.some((Z)=>Z.label===Q&&Z.required&&!Z.ok)}async function t2(){let $=process.versions.bun,Q=process.versions.node,Z=Boolean($),X=$?KZ($,s0):!1,U=$?KZ($,e8):!1,J=[{label:BZ,ok:Z,required:!0,details:Z?`active (${$})`:`not active (running on Node ${Q})`},{label:LZ,ok:X,required:!0,details:$?`${$} (required >= ${s0})`:"unknown (Bun runtime not active)"},{label:h4,ok:U,required:!1,details:$?`${$} (recommended >= ${e8})`:"unknown (Bun runtime not active)"}];return{ok:J.filter((Y)=>Y.required).every((Y)=>Y.ok),bunVersion:$,nodeVersion:Q,checks:J}}function e2($,Q={}){let Z=Q.includeDoctorFollowUp??!0,X=["\u26A0 Runtime precheck failed."],U=qZ($,BZ),J=qZ($,LZ);if(U)X.push("- SUMR CLI runs on Bun runtime only."),X.push(`- Current runtime: Node ${$.nodeVersion}.`),X.push("- Install Bun: https://bun.sh/docs/installation"),X.push("- Reinstall SUMR with Bun: `bun add -g @sumrco/cli`.");else if(J)X.push(`- Bun ${$.bunVersion??"unknown"} is below required ${s0}.`),X.push(`- Upgrade Bun to >= ${s0}: \`bun upgrade\`.`);else X.push("- Runtime checks failed. Run `sumr doctor` for details.");if(Z)X.push("Run `sumr doctor` for full diagnostics.");return X}var u4={name:"doctor",description:"Check runtime and tool requirements",usage:["sumr doctor"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr doctor"]};function AZ($){if($.ok)return S("PASS",["pink","bold"]);return $.required?S("FAIL",["pink","bold"]):S("WARN",["orchid","bold"])}async function d4($){let Q=await t2(),Z=$.visibility==="private",X=Z?VZ():!0,U=Z?HZ():void 0;console.log(""),console.log(S("SUMR doctor",["purple","bold"])),console.log("");for(let J of Q.checks)console.log(`- ${AZ(J)} ${J.label}: ${J.details}`);if(Z)console.log(`- ${AZ({ok:X,required:!0})} AWS CLI: ${U??"not found"}`),console.log("");else console.log("");if(!Q.ok){for(let J of e2(Q,{includeDoctorFollowUp:!1}).slice(1))console.log(J);return 1}if(Z&&!X)return console.log(S("Install AWS CLI to use private team commands.","orchid")),1;return console.log(S(Z?"Environment looks good.":"Runtime looks good.","pink")),0}var $6=E({name:"doctor",description:"Check runtime and tool requirements",group:"system",visibility:"public",help:u4,execute:d4});N();import{existsSync as m4}from"fs";import{join as l4}from"path";import{log as X9}from"@clack/prompts";var U9=["docs"],p4=new Set(["source","yes"]),c4=new Set(["input","output"]),n4={claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},i4={name:"init",description:"Create a sumr.yaml config for this repository",usage:["sumr init","sumr init --yes","sumr init --source docs,standards"],options:[{flag:"--source <paths>",description:"Private mode: playbook source paths (comma-separated, e.g. docs,standards)"},{flag:"--yes",description:"Skip overwrite prompts and create/update sumr.yaml"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr init","sumr init --yes","sumr init --source docs,standards"]};function r4($,Q,Z,X){let U=$.indexOf("=");if(U!==-1)return X[$.slice(2,U)]=$.slice(U+1),0;let J=Q[Z+1];if(J&&!J.startsWith("-"))return X[$.slice(2)]=J,1;return X[$.slice(2)]=!0,0}function o4($,Q,Z,X){let U=Q[Z+1];if(U&&!U.startsWith("-"))return X[$.slice(1)]=U,1;return X[$.slice(1)]=!0,0}function a4($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let U=$[X];if(!U)continue;if(U.startsWith("--")){X+=r4(U,$,X,Q);continue}if(U.startsWith("-")&&U.length===2){X+=o4(U,$,X,Q);continue}Z.push(U)}return{positionals:Z,options:Q}}function s4($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function t4($,Q){return Object.hasOwn($,Q)}function e4($,Q){return $[Q]===!0}function $z($){if(!$)return[...U9];let Q=$.split(",").map((Z)=>Z.trim()).filter(Boolean);if(Q.length===0)return[...U9];return Q}function MZ(){let $=[];return $.push("# SUMR per-repo configuration"),$.push("# Add product-specific sections only when the repository needs them."),$.push("version: 1"),$.push(""),$.join(`
1006
- `)}function Qz($){let Q=[];Q.push("# Playbook"),Q.push("playbook:"),Q.push(" channels:");for(let[Z,X]of Object.entries(n4))Q.push(` ${Z}: ${X}`);Q.push(" sources:");for(let Z of $.sourcePaths)Q.push(` - ${Z}`);return Q}function Zz($){return Object.keys($).filter((Q)=>!p4.has(Q))}function Xz($){return $.length===1?`-${$}`:`--${$}`}function Uz($){let Q=$.map(Xz).join(", "),Z=$.length===1?"is":"are";if($.some((U)=>c4.has(U))){console.error(`${Q} ${Z} no longer supported by \`sumr init\`. Configure Kontract with \`kontract.sources\` in sumr.yaml or pass generation flags to \`sumr kontract generate\`.`);return}console.error(`Unsupported init option: ${Q}.`)}async function Jz($,Q){if($||!Q)return!0;let{confirm:Z,outro:X,isCancel:U}=await import("@clack/prompts"),J=await Z({message:"sumr.yaml already exists. Update it?",initialValue:!1});if(U(J)||!J)return X("Cancelled \u2014 existing sumr.yaml was not changed."),!1;return!0}function Wz($,Q,Z){if(!Q&&!Z.includePlaybook)return H0($,MZ()),!0;if(!Z.includePlaybook)return!1;return d1($,"playbook",Qz(Z),{fallbackContent:MZ(),sectionComment:"# Playbook"}),!0}function Yz($,Q){if(!$)return"Created";return Q?"Updated":"Kept existing"}function Gz($){return $?`${K1} kept existing module config.`:`${K1} created in this directory.`}function zz($){return $?["Next:"," sumr playbook sync"," sumr --help"]:["Next:"," sumr --help"]}async function _z($,Q,Z,X,U){if(Q){X9.success(`${Yz(Z,X)} ${K1} in ${$}`);return}let{note:J}=await import("@clack/prompts");J([Gz(Z),"",...zz(U)].join(`
1007
- `),"SUMR init")}async function Vz($){if($.args.flags.profile)return X9.error("Use `sumr init` without `--profile`."),1;let Q=a4($.argv.slice(1));if(Q.positionals.length>0)return X9.error("Use `sumr init` with flags only."),1;let Z=Zz(Q.options);if(Z.length>0)return Uz(Z),1;let X=process.cwd(),U=l4(X,K1),J=e4(Q.options,"yes"),W=t4(Q.options,"source"),Y=$.visibility==="private"&&W,G=s4(Q.options,"source");if($.visibility!=="private"&&W)return console.error("`--source` is only available in private mode (when playbook commands are present)."),1;let z={sourcePaths:Y?$z(G):[...U9],includePlaybook:Y},_=m4(U);if(!await Jz(J,_))return 0;let H=Wz(U,_,z);return await _z(X,J,_,H,Y),0}var jZ=E({name:"init",description:"Create a sumr.yaml config for this repository",group:"system",visibility:"public",help:i4,execute:Vz});N();import{chmodSync as CZ,existsSync as Y9,mkdirSync as Bz,readFileSync as SZ,rmSync as Lz}from"fs";import{homedir as FZ}from"os";import{join as IZ}from"path";import{existsSync as Hz,renameSync as Oz,rmSync as Kz,writeFileSync as qz}from"fs";function J9($,Q,Z){let X=`${$}.sumr-tmp-${process.pid}-${Date.now()}`;try{qz(X,Q,Z),Oz(X,$)}finally{if(Hz(X))Kz(X,{force:!0})}}var Az="auth.json",Z6="sumr-cli",X6="default",RZ="SUMR CLI authentication";function e0($=FZ()){return IZ($,t8,Az)}function DZ($=FZ()){Bz(IZ($,t8),{recursive:!0,mode:448})}function Mz($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.accessToken==="string"&&typeof Q.stage==="string"}function TZ($){try{let Q=JSON.parse($);return Mz(Q)?Q:null}catch{return null}}function t0($,Q){try{let Z=Bun.spawnSync({cmd:$,stdin:Q===void 0?void 0:new TextEncoder().encode(Q),stdout:"pipe",stderr:"ignore",env:{...process.env},timeout:WZ});return{code:Z.exitCode,stdout:new TextDecoder().decode(Z.stdout)}}catch{return{code:-1,stdout:""}}}var jz="$ErrorActionPreference='Stop'; Add-Type -AssemblyName System.Security; $p=[Console]::In.ReadToEnd(); $b=[System.Text.Encoding]::UTF8.GetBytes($p); $e=[System.Security.Cryptography.ProtectedData]::Protect($b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([System.Convert]::ToBase64String($e))",Tz="$ErrorActionPreference='Stop'; Add-Type -AssemblyName System.Security; $c=[Console]::In.ReadToEnd().Trim(); $e=[System.Convert]::FromBase64String($c); $b=[System.Security.Cryptography.ProtectedData]::Unprotect($e,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([System.Text.Encoding]::UTF8.GetString($b))";function EZ($,Q){if(!Bun.which("powershell"))return{code:-1,stdout:""};return t0(["powershell","-NoProfile","-NonInteractive","-Command",$],Q)}var Ez=`
1057
+ <!-- /extract:examples -->`,generatedFile:"The marker name becomes a generated section file, for example examples.md inside skill folders, and the skill gets an Additional resources link.",whenToUse:["Long examples","Reusable templates","Dedicated sample sections","Boilerplate that should be available on demand"],keepInline:["Short snippets that are central to the instruction","Small config examples","Directory trees","Schema outlines","ASCII diagrams"]},examples:{overview:eI,reference:$R,folder:PJ,flow:ZR,teamMembersRoot:XR,teamMembersDomain:YR,fullStructure:WR},checklist:["Main topics have name, title, and description.","Descriptions explain what plus when and are quoted in YAML.","Main docs include a When to Use section.","Reference files set category: reference.","Reference files have label, when, and order.","Reference files live in the same folder as the main doc.","Splitting starts by choosing the owning context folder before creating files.","Standalone subtopics split into child folders with overview.md; supporting detail splits into same-folder references.","No references/ folder is created manually.","No references frontmatter field is used.","Dedicated examples, samples, and templates use extract markers.","Lifecycle docs include event, target, and optional matcher, timeout, and statusMessage.","When users ask for hooks or automatic AI-tool behavior, create or update a lifecycle doc first; do not hand-edit generated hook outputs as source.","Workflow docs define a user-invoked procedure and optional per-channel command metadata.","Simple workflow docs include a compact arrow flow; branching workflows use Mermaid plus transition rules.","Codex output is generated from canonical team-member/lifecycle docs and uses [features].hooks.","Team-member docs define name, description, and body instructions. Native channel blocks are the escape hatch for tool-specific agent features.","Add a short # comment above every native channel block so humans can scan which AI tool it configures.","Use role archetype names such as orchestrator, product-owner, researcher, planner, implementer, reviewer, and validator as guidance, not required frontmatter.","Generated AI tool folders are not edited as source.","Use {{PLAYBOOK_PATH}} instead of hard-coding docs/ or other source paths in topic bodies.","Module resources are declared in sumr.module.yaml spec.exports.aiResources (module, roots, activation), not spec.exports.resources and not hand-wired into Playbook.","Module source topic names are unprefixed; the renderer adds the sumr-<module>: namespace. Never author a source name starting with sumr-.","Command-activated modules document their init command; resources install only after the user runs it."]},U7=Object.values(p$),J7=Object.values(tI);KR={name:"playbook authoring",description:"Print the canonical Playbook Markdown authoring contract",usage:["sumr playbook authoring","sumr playbook authoring --section structure","sumr playbook authoring --example reference","sumr playbook authoring --json"],options:[{flag:"--section <id>",description:`Only print one section (${U7.join(", ")})`},{flag:"--example <id>",description:`Only print one example (${J7.join(", ")})`},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook authoring","sumr playbook authoring --section frontmatter","sumr playbook authoring --section structure --json","sumr playbook authoring --example overview"]};OR=E({name:"authoring",description:"Print the canonical Playbook Markdown authoring contract",group:"modules",visibility:"public",help:KR,execute:LR}),D$=[{id:"claude",displayName:"Claude Code",outputDir:".claude/skills",filePattern:/^sumr-.+$/,vscodeExcludePattern:".claude/skills/sumr-*",gitignorePatterns:[".claude/skills/sumr-*/",".claude/agents/sumr-*",".claude/hooks/sumr-*",".claude/commands/sumr-*",".claude/rules/sumr-*"]},{id:"codex",displayName:"Codex CLI",outputDir:".agents/skills",legacyOutputDirs:[".codex/skills"],filePattern:/^sumr-.+$/,vscodeExcludePattern:".agents/skills/sumr-*",gitignorePatterns:[".agents/skills/sumr-*/",".codex/skills/sumr-*/",".codex/agents/sumr-*.toml"]},{id:"cursor",displayName:"Cursor",outputDir:".cursor/rules",filePattern:/^sumr-.+\.mdc$/,vscodeExcludePattern:".cursor/rules/sumr-*",gitignorePatterns:[".cursor/rules/sumr-*"]},{id:"copilot",displayName:"GitHub Copilot",outputDir:".github/instructions",filePattern:/^sumr-.+\.md$/,vscodeExcludePattern:".github/instructions/sumr-*",gitignorePatterns:[".github/instructions/sumr-*",".github/agents/sumr-*"]},{id:"gemini",displayName:"Gemini CLI",outputDir:".gemini/skills",filePattern:/^sumr-.+$/,vscodeExcludePattern:".gemini/skills/sumr-*",gitignorePatterns:[".gemini/skills/sumr-*/",".gemini/agents/sumr-*"]},{id:"opencode",displayName:"OpenCode",outputDir:".opencode/commands",filePattern:/^sumr-.+\.md$/,vscodeExcludePattern:".opencode/commands/sumr-*",gitignorePatterns:[".opencode/commands/sumr-*",".opencode/agents/sumr-*"]}],G1=D$.map(($)=>$.id);IR={PLAYBOOK_PATH:"{{PLAYBOOK_PATH}}",TEAM_MEMBER:"{{TEAM-MEMBER}}",MISSION_TRIGGER_HINTS:"{{MISSION_TRIGGER_HINTS}}",MISSION_IDENTIFIER_GUIDANCE:"{{MISSION_IDENTIFIER_GUIDANCE}}",MISSION_START_EXAMPLES:"{{MISSION_START_EXAMPLES}}",MISSION_FLOW_PRESET:"{{MISSION_FLOW_PRESET}}",MISSION_FLOW_TEXT:"{{MISSION_FLOW_TEXT}}",MISSION_FLOW_STEPS:"{{MISSION_FLOW_STEPS}}",MISSION_PR_MODE:"{{MISSION_PR_MODE}}"};RR={claude:"Subagent",codex:"Subagent",cursor:"Subagent",copilot:"Agent",gemini:"Subagent",opencode:"Agent"};H$={CORE:"core",LOCAL:"local"},vG={REASONING:"reasoning",CODING:"coding",FAST:"fast"},$8={LOW:"low",MEDIUM:"medium",HIGH:"high"},V8={READ_ONLY:"read-only",WRITE:"write",FULL:"full"},$2={READ:"read",EDIT:"edit",SHELL:"shell",WEB:"web",TODO:"todo",TASK:"task"};xR=/\n?<!--\s*extract:(\w+)\s*-->([\s\S]*?)<!--\s*\/extract:\1\s*-->\n?/g,vR=/```[\s\S]*?```/g,gR=[];rR={name:"playbook clean",description:"Remove SUMR-managed Playbook outputs from the current repo",usage:["sumr playbook clean","sumr playbook clean --channel claude","sumr playbook clean --dry-run","sumr playbook clean --json"],options:[{flag:"--channel <id>",description:`Channel to clean (one of: ${G1.join(", ")})`},{flag:"--dry-run",description:"Preview deletions without writing to disk"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook clean","sumr playbook clean --channel claude","sumr playbook clean --dry-run"]};oR=E({name:"clean",description:"Remove SUMR-managed Playbook outputs from the current repo",group:"modules",visibility:"public",help:rR,execute:iR}),J6={DISCARD:"__discard__",SAVE:"__save__"};eR={name:"playbook config",description:"Set up or update Playbook configuration for this repo",usage:["sumr playbook config"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook config"]};ZD=E({name:"config",description:"Set up or update Playbook configuration for this repo",group:"modules",visibility:"public",help:eR,execute:QD}),F1={TAGS:"tags",FRAMEWORK:"framework",TECH:"tech",GUIDE:"guide",INSIGHT:"insight",TOPIC:"topic",TEAM_MEMBERS:"teamMembers",TOOLS:"tools",NICKNAMES:"nicknames"},HD={NAME:"name",TITLE:"title",DESCRIPTION:"description",CATEGORY:"category",TARGET:"target",EVENT:"event",MATCHER:"matcher",STATUS_MESSAGE:"statusMessage",LABEL:"label",WHEN:"when",MODEL_TIER:"modelTier",EFFORT:"effort",ACCESS:"access"},Q2={CHANNELS:"channels",ORDER:"order",REVIEW:"review",TEAM_MEMBER:"team-member",TIMEOUT:"timeout"},sZ={TRUE:"true",FALSE:"false"},VD=new Set(["claude","codex","cursor","copilot","gemini","opencode"]),qD=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;AD=new Set([F1.TAGS,F1.FRAMEWORK,F1.TECH,F1.GUIDE,F1.INSIGHT,F1.TOPIC,F1.TOOLS,F1.NICKNAMES,Q2.TEAM_MEMBER]),LD=new Set(Object.values(HD));iG=new Set(Object.values(vG)),oG=new Set(Object.values($8)),aG=new Set(Object.values(V8)),sG=new Set(Object.values($2)),ID=Object.values(vG),RD=Object.values($8),DD=Object.values(V8),ND=Object.values($2),wD=[];vD={".tm.md":"team-member",".lc.md":"lifecycle",".hk.md":"lifecycle",".wf.md":"workflow",".rf.md":"reference"};Q_={dev:"dev",cache:"cache",bundled:"bundled",missing:"missing"},oD={always:"always",command:"command"},aD={none:"none",metadata:"metadata",exports:"exports",aiResources:"aiResources",aiActivation:"aiActivation"},sD={ACTIVATION:"activation:",AI_RESOURCES:"aiResources:",EXPORTS:"exports:",METADATA:"metadata:",ROOTS:"roots:"};t2=Q_,Q8=oD,A$=aD,X2=sD,AN=["sumr.module.yaml","sumr.module.yml","module.yaml","module.yml"];xN={name:"playbook status",description:"Show Playbook configuration and topic counts for the current repo",usage:["sumr playbook status","sumr playbook status --json"],options:[{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook status"]};dN=E({name:"status",description:"Show Playbook configuration and topic counts for the current repo",group:"modules",visibility:"public",help:xN,execute:uN}),Z8={CONFIG:"config",DEFAULT:"default",EXPLICIT:"explicit"},tZ={ERROR:"error",SKIP:"skip"},lJ={REFERENCE:"reference",TOPIC:"topic"},o={ERROR:"error",WARNING:"warning"},mN={github:{tracker:"github",label:"GitHub",softwareNames:["GitHub issues","GitHub Projects"],nouns:["issue numbers","#123","GH-123","GitHub issue","GitHub ticket"],defaultPrefix:"GH",rawIssueExample:"4501",normalizedIssueKey:"GH-4501",normalizedKeyPattern:"GH-<number>",referenceExamples:["issue 4501","#4501","issue #4501","GitHub issue 4501","GitHub #4501","GH-4501","github.com/org/repo/issues/4501"],sourceGuidance:"GitHub issue numbers normalize to `GH-<number>`. GitHub Projects cards should still resolve to the underlying issue when one exists.",apiGuidance:"When an MCP/API gives a GitHub issue number, pass the raw number with `--tracker github --issue <number>`."},gitlab:{tracker:"gitlab",label:"GitLab",softwareNames:["GitLab issues"],nouns:["issue IIDs","#123","GL-123","GitLab issue","GitLab ticket"],defaultPrefix:"GL",rawIssueExample:"4501",normalizedIssueKey:"GL-4501",normalizedKeyPattern:"GL-<iid>",referenceExamples:["issue 4501","#4501","issue #4501","GitLab issue 4501","GitLab #4501","GL-4501","gitlab.com/org/repo/-/issues/4501"],sourceGuidance:"GitLab issue IIDs normalize to `GL-<iid>`. Prefer the project-local IID over a global database ID.",apiGuidance:"When an MCP/API gives a GitLab issue IID, pass the raw IID with `--tracker gitlab --issue <iid>`."},jira:{tracker:"jira",label:"Jira",softwareNames:["Jira","Jira Software"],nouns:["ticket","issue","story","bug","task","epic"],defaultPrefix:"PROJECT",rawIssueExample:"PROJECT-123",normalizedIssueKey:"PROJECT-123",normalizedKeyPattern:"<PROJECT>-<number>",referenceExamples:["PROJECT-123","Jira ticket PROJECT-123","story PROJECT-123"],sourceGuidance:"Jira references should use the full project key and number. A bare phrase like `issue 4501` is not enough unless trusted tracker context supplies the project key.",apiGuidance:"When an MCP/API gives a Jira issue key, pass the full key with `--tracker jira --issue <PROJECT-123>`."},linear:{tracker:"linear",label:"Linear",softwareNames:["Linear"],nouns:["issue","ticket","team key","project","cycle"],defaultPrefix:"TEAM",rawIssueExample:"TEAM-123",normalizedIssueKey:"TEAM-123",normalizedKeyPattern:"<TEAM>-<number>",referenceExamples:["TEAM-123","Linear issue TEAM-123","cycle issue TEAM-123"],sourceGuidance:"Linear references should use the full team key and number. A bare phrase like `issue 4501` is not enough unless trusted tracker context supplies the team key.",apiGuidance:"When an MCP/API gives a Linear issue identifier, pass the full key with `--tracker linear --issue <TEAM-123>`."},custom:{tracker:"custom",label:"Custom",softwareNames:["custom notes","local task lists"],nouns:["custom work ID","note","local slug","named task","non-ticket work"],defaultPrefix:"TASK",rawIssueExample:"release-notes-pass",normalizedIssueKey:"release-notes-pass",normalizedKeyPattern:"<local-label>",referenceExamples:["release-notes-pass","checkout race condition","manual QA pass","non-ticket task"],sourceGuidance:"Custom references become safe local Mission IDs. Use this for work that does not have a tracker-owned key.",apiGuidance:'When an MCP/API gives only a name or note title, pass it with `--tracker custom --issue "<local label>"`.'}},lN=["Azure DevOps work items (`AB#123`, `work item 123`)","ClickUp tasks","Asana tasks","Trello cards","Notion tasks"],Z2={CUSTOM:"custom",JIRA:"jira",LINEAR:"linear"},t0={BASIC:"basic",PLANNING_ONLY:"planning-only",STANDARD_DELIVERY:"standard-delivery",FULL_DELIVERY:"full-delivery"},d={AUTO:"auto",ASK:"ask",HUMAN:"human",MANUAL:"manual"},c={ISSUE_SYNC:"issue.sync",CONTEXT_RESEARCH:"context.research",PLAN_CREATE:"plan.create",PLAN_APPROVE:"plan.approve",BRANCH_CHECK:"branch.check",WORK_CLAIM:"work.claim",IMPLEMENTATION_REPORT:"implementation.report",REVIEW_REPORT:"review.report",VALIDATION_REPORT:"validation.report",QUALITY_GATE:"quality.gate",PR_PREPARE:"pr.prepare",PR_CREATE:"pr.create",MISSION_CLOSE:"mission.close"},cN=[];Yw={claude:[".claude/agents",".claude/hooks",".claude/commands"],codex:[".codex/agents",".codex/hooks"],opencode:[".opencode/agents"]},J_=[],Ww=[],dZ=Q_;N={CLAUDE_ONLY:"claude-only",CLOSEOUT:"closeout",COMMAND:"command",CONVENTION:"convention",MAP:"map",OVERVIEW:"overview",RULE:"rule",SECURITY:"security",STARTUP:"startup",STUCK:"stuck"},F7=[N.OVERVIEW,N.STARTUP,N.MAP,N.RULE,N.COMMAND,N.CONVENTION,N.SECURITY,N.CLOSEOUT,N.STUCK,N.CLAUDE_ONLY],Z6={ID:"id",ORDER:"order",SCOPE:"scope"},Fw=new Set([N.OVERVIEW,N.STUCK]),iJ=new Set(Object.values(Z6)),$7=/<!--\s*agents-md:([a-z-]+)((?:\s+[a-z]+=[^\s>]+)*)\s*-->([\s\S]*?)<!--\s*\/agents-md:\1\s*-->/g;bw=[];uw=[];lw=[N.STARTUP,N.CLOSEOUT,N.MAP,N.RULE,N.COMMAND,N.CONVENTION,N.SECURITY];rw={};XG=["purpose","before-you-start","mission-issue-routing","repo-map","hard-rules","common-commands","code-conventions","security","closeout","if-stuck"],Ub=[],Jb=[{id:"root-claude-md",channelIds:["claude"],targetPath:"CLAUDE.md",title:"Claude project memory",sectionIds:[...XG,"claude-specific"],appliesTo:YG},{id:"root-agents-md",channelIds:["codex"],targetPath:"AGENTS.md",title:"Agent instructions",sectionIds:XG,appliesTo:YG}];F$={APPEND:"append",SKIP:"skip",CANCEL:"cancel"};Ib=[],D_=["!docs/standards/devkit/","!docs/standards/devkit/**"],Rb={claude:["!.claude/","!.claude/skills/","!.claude/skills/**","!.claude/agents/","!.claude/agents/**","!.claude/hooks/","!.claude/hooks/**","!.claude/commands/","!.claude/commands/**","!.claude/rules/","!.claude/rules/**"],codex:["!.agents/","!.agents/skills/","!.agents/skills/**","!.codex/","!.codex/AGENTS.md","!.codex/config.toml","!.codex/hooks.json","!.codex/agents/","!.codex/agents/**","!.codex/hooks/","!.codex/hooks/**"],cursor:["!.cursor/","!.cursor/rules/","!.cursor/rules/**"],copilot:["!.github/","!.github/instructions/","!.github/instructions/**","!.github/agents/","!.github/agents/**"],gemini:["!.gemini/","!.gemini/skills/","!.gemini/skills/**","!.gemini/agents/","!.gemini/agents/**"],opencode:["!.opencode/","!.opencode/commands/","!.opencode/commands/**","!.opencode/agents/","!.opencode/agents/**"]},Db=[{channelId:"cursor",file:".cursorignore",allowEntries:["!.cursor/","!.cursor/rules/","!.cursor/rules/**"],extraEntryPrefixes:[".cursor/"]},{channelId:"gemini",file:".geminiignore",allowEntries:["!.gemini/","!.gemini/skills/","!.gemini/skills/**","!.gemini/agents/","!.gemini/agents/**"],extraEntryPrefixes:[".gemini/"]}];hb={"*.tm.md":"robot","*.wf.md":"rocket","*.lc.md":"settings","*.hk.md":"settings","*.rf.md":"changelog"};u_=["team-member"],d_=["lifecycle","hook"],m_=["workflow"],ib=[...u_,...d_,...m_];ab=/^[a-z0-9-]{1,64}$/,sb=new Set(["anthropic","claude"]);Qk=[];Uk={claude:{id:"claude",models:{reasoning:"opus",coding:"sonnet",fast:"haiku"},toolMap:{read:["Read","Grep","Glob"],edit:["Read","Edit","Write"],shell:["Bash"],web:["WebFetch","WebSearch"],todo:["TodoWrite"],task:["Task"]},toolFormat:"comma-string",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},codex:{id:"codex",models:{},features:{model:!0,tools:!1,permissions:!1,reasoningEffort:!0,sandbox:!0}},gemini:{id:"gemini",models:{},toolMap:{read:["read_file","read_many_files","list_directory","glob","grep_search"],edit:["replace","write_file"],shell:["run_shell_command"],web:["web_fetch","google_web_search"],todo:["write_todos"]},toolFormat:"array",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},opencode:{id:"opencode",models:{},toolMap:{read:["read","glob","grep","list"],edit:["edit"],shell:["bash"],web:["webfetch","websearch"],todo:["todowrite"],task:["task"]},toolFormat:"permission",features:{model:!0,tools:!1,permissions:!0,reasoningEffort:!1,sandbox:!1}},copilot:{id:"copilot",models:{},toolMap:{read:["read","search"],edit:["edit"],shell:["execute"],web:["web"],todo:["todo"],task:["agent"]},toolFormat:"array",features:{model:!0,tools:!0,permissions:!1,reasoningEffort:!1,sandbox:!1}},cursor:{id:"cursor",models:{},features:{model:!0,tools:!1,permissions:!1,reasoningEffort:!1,sandbox:!1}}},Jk=["Read","Grep","Glob","Edit","Write","Bash","WebFetch","WebSearch","TodoWrite","Task"],Gk=["read","glob","grep","list","edit","bash","webfetch","websearch","todowrite","task"],_k={"read-only":[$2.READ],write:[$2.READ,$2.EDIT,$2.SHELL]},Hk={"read-only":"read-only",write:"workspace-write",full:"danger-full-access"},Vk={reasoning:$8.HIGH,coding:$8.MEDIUM,fast:$8.LOW},_G={model:["model"],tools:["tools"],permissions:["permission"],reasoningEffort:["model_reasoning_effort","modelReasoningEffort"],sandbox:["sandbox_mode","sandboxMode","sandbox-mode"]};Ik=["bash","sh","python","py","javascript","js","ts"],o_={};e_=new Set([".sh",".py",".js",".ts"]),pk={},ck={bash:"sh",sh:"sh",python:"py",py:"py",javascript:"js",js:"js",ts:"ts"},nk={bash:"#!/usr/bin/env bash",sh:"#!/bin/sh",python:"#!/usr/bin/env python3",py:"#!/usr/bin/env python3",javascript:"#!/usr/bin/env node",js:"#!/usr/bin/env node",ts:"#!/usr/bin/env bun"};_P=["bash","sh","python","py","javascript","js","ts"],J1={PERMISSION_REQUEST:"PermissionRequest",POST_COMPACT:"PostCompact",POST_TOOL_USE:"PostToolUse",PRE_COMPACT:"PreCompact",PRE_TOOL_USE:"PreToolUse",SESSION_START:"SessionStart",STOP:"Stop",SUBAGENT_START:"SubagentStart",SUBAGENT_STOP:"SubagentStop",USER_PROMPT_SUBMIT:"UserPromptSubmit"},HP=new Set([J1.PERMISSION_REQUEST,J1.POST_COMPACT,J1.POST_TOOL_USE,J1.PRE_COMPACT,J1.PRE_TOOL_USE,J1.SESSION_START,J1.SUBAGENT_START,J1.SUBAGENT_STOP]),VP=new Set([J1.STOP,J1.USER_PROMPT_SUBMIT]),EP=/^#!.*\r?\n# Generated by SUMR Playbook/,BG=/^# Generated by SUMR Playbook\.[^\r\n]*(?:\r?\n|$)/,CP=/\b(?:sumr-devkit\s+sync|sumr\s+playbook\s+sync)\b/;gP={};dP=[["model","model"],["modelReasoningEffort","model_reasoning_effort"],["model_reasoning_effort","model_reasoning_effort"],["sandboxMode","sandbox_mode"],["sandbox_mode","sandbox_mode"],["sandbox-mode","sandbox_mode"]];sP={bash:"sh",sh:"sh",python:"py",py:"py",javascript:"js",js:"js",ts:"ts"},tP={bash:"#!/usr/bin/env bash",sh:"#!/bin/sh",python:"#!/usr/bin/env python3",py:"#!/usr/bin/env python3",javascript:"#!/usr/bin/env node",js:"#!/usr/bin/env node",ts:"#!/usr/bin/env bun"};_f={};qf={mode:"subagent"},Kf={channelId:"opencode",outputDir:".opencode/agents",generatedFilePattern:/^sumr-.+\.md$/,defaultProps:qf};GH={claude:WP,codex:Uf,cursor:Hf,copilot:Gf,gemini:Vf,opencode:Bf};cf={name:"playbook validate",description:"Check Playbook docs for errors without writing any files",usage:["sumr playbook validate","sumr playbook validate --source docs","sumr playbook validate --json"],options:[{flag:"--source <path>",description:"Path to docs folder (overrides sumr.yaml)"},{flag:"--verbose",description:"On success, also list every source that was checked"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook validate","sumr playbook validate --verbose","sumr playbook validate --json"]};Qy=[/<[a-z][a-z0-9 _-]*command>/i,/<your[ -][^>]*>/i,/<placeholder[^>]*>/i,/\bREPLACE (?:THIS|ME|WITH)\b/i,/\bFILL IN\b/i],Zy=/\b(?:use (?:when|this|it|for)|when (?:you|the|a|implementing|adding|debugging|reviewing|writing|creating|editing|working|changing|building)|before |after |during )/i,Yy=/^[A-Za-z0-9 _-]+$/,Wy=/\[[^\]]*\]\(([^)]+)\)/g,Uy=/(^|\n)( {0,3}```[\s\S]*?(?:\n {0,3}```|$))/g;Fy=E({name:"validate",description:"Check Playbook docs for errors without writing any files",group:"modules",visibility:"public",help:cf,execute:Cy}),Sy={name:"playbook sync",description:"Sync Playbook topics into AI tool channels",usage:["sumr playbook sync","sumr playbook sync --source docs","sumr playbook sync --source docs --channel claude","sumr playbook sync --dry-run","sumr playbook sync --json"],options:[{flag:"--source <path>",description:"Source directory containing canonical .md files (repeatable)"},{flag:"--channel <id>",description:`Channel to sync (one of: ${G1.join(", ")})`},{flag:"--dry-run",description:"Preview changes without writing to disk"},{flag:"--json",description:"Output machine-readable JSON envelope"},{flag:"--verbose",description:"Show detailed warnings, sources, and generated outputs"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook sync","sumr playbook sync --source docs --channel claude","sumr playbook sync --dry-run"]};Py=E({name:"sync",description:"Sync Playbook topics into AI tool channels",group:"modules",visibility:"public",help:Sy,execute:wy}),fy=P1({name:"playbook",description:"Sync Playbook docs into AI tools",group:"modules",visibility:"public",commands:[ZD,Py,Fy,dN,sI,oR,OR]})});import{log as CH}from"@clack/prompts";import{chmodSync as p7,existsSync as P6,mkdirSync as fH,readFileSync as c7,rmSync as yH}from"fs";import{homedir as n7}from"os";import{join as r7}from"path";import{existsSync as wH,renameSync as bH,rmSync as kH,writeFileSync as PH}from"fs";function L8($,Q,Z){let X=`${$}.sumr-tmp-${process.pid}-${Date.now()}`;try{PH(X,Q,Z),bH(X,$)}finally{if(wH(X))kH(X,{force:!0})}}function r$($,Q){let Z=process.env[$];if(!Z)return Q;let X=Number(Z);return Number.isFinite(X)?X:Q}var O8=".sumr",g7=".sumr-local-link";var q2="1.1.0",D6="1.3.0",h7=r$("SUMR_AWS_CREDENTIAL_TIMEOUT_MS",15000),z8=r$("SUMR_TOOL_VERSION_TIMEOUT_MS",5000),u7=r$("SUMR_KEYCHAIN_COMMAND_TIMEOUT_MS",15000),cy=r$("SUMR_BUILD_COMMAND_TIMEOUT_MS",120000),ny=r$("SUMR_CHECK_COMMAND_TIMEOUT_MS",30000),ry=r$("SUMR_NPM_COMMAND_TIMEOUT_MS",30000),iy=r$("SUMR_TARBALL_CONTENT_BUFFER_BYTES",16777216),j8="1",d7="SUMR_NO_KEYCHAIN",N6="SUMR_ALLOW_PLAINTEXT_AUTH_FILE",oy=r$("SUMR_LOCAL_CLI_COMMAND_TIMEOUT_MS",120000),w6=r$("SUMR_API_REQUEST_TIMEOUT_MS",30000),b6=r$("SUMR_IDENTITY_REQUEST_TIMEOUT_MS",30000);var xH="auth.json",E8="sumr-cli",C8="default",i7="SUMR CLI authentication";function B2($=n7()){return r7($,O8,xH)}function o7($=n7()){fH(r7($,O8),{recursive:!0,mode:448})}function vH($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.accessToken==="string"&&typeof Q.stage==="string"}function m7($){try{let Q=JSON.parse($);return vH(Q)?Q:null}catch{return null}}function K2($,Q){try{let Z=Bun.spawnSync({cmd:$,stdin:Q===void 0?void 0:new TextEncoder().encode(Q),stdout:"pipe",stderr:"ignore",env:{...process.env},timeout:u7});return{code:Z.exitCode,stdout:new TextDecoder().decode(Z.stdout)}}catch{return{code:-1,stdout:""}}}var gH="$ErrorActionPreference='Stop'; Add-Type -AssemblyName System.Security; $p=[Console]::In.ReadToEnd(); $b=[System.Text.Encoding]::UTF8.GetBytes($p); $e=[System.Security.Cryptography.ProtectedData]::Protect($b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([System.Convert]::ToBase64String($e))",hH="$ErrorActionPreference='Stop'; Add-Type -AssemblyName System.Security; $c=[Console]::In.ReadToEnd().Trim(); $e=[System.Convert]::FromBase64String($c); $b=[System.Security.Cryptography.ProtectedData]::Unprotect($e,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); [Console]::Out.Write([System.Text.Encoding]::UTF8.GetString($b))";function l7($,Q){if(!Bun.which("powershell"))return{code:-1,stdout:""};return K2(["powershell","-NoProfile","-NonInteractive","-Command",$],Q)}var uH=`
1008
1058
  import Darwin
1009
1059
  import Foundation
1010
1060
  import Security
@@ -1066,8 +1116,14 @@ case "clear":
1066
1116
  default:
1067
1117
  exit(64)
1068
1118
  }
1069
- `;function Q6($){return JSON.stringify($).replace(/\$/g,"\\$")}function Cz($){return Ez.replace("__ACTION__",Q6($)).replace("__SERVICE__",Q6(Z6)).replace("__ACCOUNT__",Q6(X6)).replace("__LABEL__",Q6(RZ))}function W9($,Q){if(!Bun.which("swift"))return{code:-1,stdout:""};return t0(["swift","-e",Cz($)],Q)}var Sz={set:($)=>W9("set",$).code===0,get:()=>{let{code:$,stdout:Q}=W9("get");if($!==0)return null;let Z=Q.replace(/\n$/,"");return Z.length>0?Z:null},clear:()=>{W9("clear")}},Fz={set:($)=>{if(!Bun.which("secret-tool"))return!1;return t0(["secret-tool","store",`--label=${RZ}`,"service",Z6,"account",X6],$).code===0},get:()=>{if(!Bun.which("secret-tool"))return null;let{code:$,stdout:Q}=t0(["secret-tool","lookup","service",Z6,"account",X6]);if($!==0||Q.length===0)return null;return Q},clear:()=>{if(!Bun.which("secret-tool"))return;t0(["secret-tool","clear","service",Z6,"account",X6])}},NZ={set:($)=>{let{code:Q,stdout:Z}=EZ(jz,$);if(Q!==0)return!1;let X=Z.trim();if(X.length===0)return!1;try{Dz(X)}catch{return!1}return!0},get:()=>{let $=e0();if(!Y9($))return null;let Q=Nz($);if(Q===null||Q.trim().length===0)return null;let{code:Z,stdout:X}=EZ(Tz,Q);if(Z!==0)return null;let U=X.trim();return U.length>0?U:null},clear:()=>{z9()}};function G9($){if($!==void 0)return null;if(process.env[YZ]===s2)return null;if(process.platform==="darwin")return Sz;if(process.platform==="linux")return Fz;if(process.platform==="win32")return NZ;return null}function wZ($){return $!==void 0||process.env[$9]===s2}function Iz(){return Error(`SUMR auth keychain is unavailable. Refusing to write plaintext auth credentials. Set ${$9}=${s2} only for local development or CI isolation.`)}function kZ($,Q){if($!==NZ)z9(Q)}function Rz($,Q){DZ(Q);let Z=e0(Q);J9(Z,`${JSON.stringify($,null,2)}
1070
- `,{encoding:"utf8",mode:384}),CZ(Z,384)}function z9($){let Q=e0($);if(Y9(Q))Lz(Q,{force:!0})}function Dz($){DZ();let Q=e0();J9(Q,$,{encoding:"utf8",mode:384}),CZ(Q,384)}function Nz($){try{return SZ($,"utf8")}catch{return null}}function q0($){let Q=G9($);if(Q){let X=Q.get(),U=X?TZ(X):null;if(U)return U}let Z=e0($);if(!Y9(Z))return null;try{let X=TZ(SZ(Z,"utf8"));if(!X)return null;if(wZ($))return X;if(Q?.set(JSON.stringify(X)))return kZ(Q,$),X;return null}catch{return null}}function U6($,Q){let Z=G9(Q);if(Z?.set(JSON.stringify($))){kZ(Z,Q);return}if(!wZ(Q))throw Iz();Rz($,Q)}function J6($){let Q=G9($);if(Q)Q.clear();z9($)}function PZ($){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt}function bZ($,Q=300000){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt-Q}var $2={AuthorizationPending:"authorization_pending",SlowDown:"slow_down",AccessDenied:"access_denied",ExpiredToken:"expired_token"},_9={Team:"team",Personal:"personal"};class Q2 extends Error{constructor(){super("Login cancelled.");this.name="LoginCancelledError"}}function F$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function I$($){return $===void 0||typeof $==="string"}function W6($){return $ instanceof Error&&($.name==="AbortError"||$.message.toLowerCase().includes("aborted"))}function Z2($){return $ instanceof Error?$.message:String($)}var wz="urn:ietf:params:oauth:grant-type:device_code",kz="refresh_token";function Pz($){return $===void 0||typeof $==="number"}function bz($){if(!F$($))return!1;return I$($.sub)&&I$($.email)&&I$($.name)}function yz($){if(!F$($))return!1;return typeof $.deviceCode==="string"&&typeof $.userCode==="string"&&typeof $.verificationUri==="string"&&I$($.verificationUriComplete)&&typeof $.expiresIn==="number"&&typeof $.interval==="number"}function yZ($){if(!F$($))return!1;return typeof $.access_token==="string"&&I$($.refresh_token)&&I$($.id_token)&&I$($.token_type)&&Pz($.expires_in)}function fz($){if(!F$($))return!1;return typeof $.error==="string"&&I$($.error_description)}async function fZ($){try{return await $.text()}catch(Q){return`Unable to read response body: ${Z2(Q)}`}}async function Y6($,Q){try{return await $.json()}catch(Z){throw Error(`${Q} returned invalid JSON: ${Z2(Z)}`)}}function vZ($){try{let Q=$.split(".");if(Q.length!==3||!Q[1])return{};let Z=Q[1].replace(/-/g,"+").replace(/_/g,"/"),X=atob(Z),U=JSON.parse(X);return bz(U)?U:{}}catch{return{}}}function vz($){return new Promise((Q)=>setTimeout(Q,$))}function xz($,Q){switch($){case $2.AuthorizationPending:return Q;case $2.SlowDown:return Q+5;case $2.AccessDenied:throw Error("Access denied. You declined the login request in the browser.");case $2.ExpiredToken:throw Error("Device code expired. Run `sumr login` to try again.");default:throw Error(`Unexpected error from auth server: ${$}`)}}function V9($){if($?.aborted)throw new Q2}async function H9($,Q,Z){let X=new AbortController,U=setTimeout(()=>X.abort(),Z9),J=()=>X.abort();if(Z?.aborted)X.abort();else Z?.addEventListener("abort",J,{once:!0});try{return await fetch($,{...Q,signal:X.signal})}catch(W){if(W6(W))throw V9(Z),Error(`SUMR identity request timed out after ${Z9}ms.`);throw W}finally{clearTimeout(U),Z?.removeEventListener("abort",J)}}function gz($,Q){let Z=vZ(Q.access_token),X=Q.expires_in?Date.now()+Q.expires_in*1000:void 0;return{stage:$,accessToken:Q.access_token,refreshToken:Q.refresh_token,tokenType:Q.token_type??"Bearer",expiresAt:X,createdAt:new Date().toISOString(),user:{id:Z.sub,email:Z.email,name:Z.name}}}async function hz($){try{let Q=await Y6($,"Device token error response");if(!fz(Q))throw Error("Device token error response did not match the expected shape.");return Q.error}catch{throw Error(`Device token poll failed (${$.status})`)}}async function uz($,Q){let Z=await Y6($,"Device token response");if(!yZ(Z))throw Error("Device token response did not match the expected shape.");return gz(Q,Z)}async function dz($,Q,Z,X,U){let J=await H9(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:wz,deviceCode:X,clientId:Z})},U);if(J.ok)return{kind:"approved",session:await uz(J,$)};return{kind:"pending",errorCode:await hz(J)}}async function xZ($){let Q=`${$.apiBaseUrl}/v3/identity/device/code`,Z=await H9(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:$.clientId,scope:$.scope})});if(!Z.ok){let U=await fZ(Z);throw Error(`Device code request failed (${Z.status}): ${U}`)}let X=await Y6(Z,"Device code response");if(!yz(X))throw Error("Device code response did not match the expected shape.");return X}async function gZ($,Q,Z,X,U){let J=`${Q.apiBaseUrl}/v3/identity/device/token`,W=X;for(;;){V9(U),await vz(W*1000),V9(U);let Y=await dz($,J,Q.clientId,Z,U);if(Y.kind==="approved")return Y.session;W=xz(Y.errorCode,W)}}async function hZ($,Q){if(!$.refreshToken)throw Error("No refresh token available.");let Z=`${Q.apiBaseUrl}/v3/identity/oauth/token`,X=await H9(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:kz,clientId:Q.clientId,refreshToken:$.refreshToken})});if(!X.ok){let Y=await fZ(X);throw Error(`Token refresh failed (${X.status}): ${Y}`)}let U=await Y6(X,"Token refresh response");if(!yZ(U))throw Error("Token refresh response did not match the expected shape.");let J=vZ(U.access_token),W=U.expires_in?Date.now()+U.expires_in*1000:void 0;return{...$,accessToken:U.access_token,refreshToken:U.refresh_token??$.refreshToken,tokenType:U.token_type??$.tokenType,expiresAt:W,user:{id:J.sub??$.user?.id,email:J.email??$.user?.email,name:J.name??$.user?.name}}}import{log as mZ}from"@clack/prompts";class G6 extends Error{status;details;constructor($,Q){super(`SUMR API request failed (${$}).`);this.name="SumrApiError",this.status=$,this.details=Q}}function mz($){return`Bearer ${$.accessToken}`}function lz($,Q){return{accept:"application/json",authorization:mz($),...Q?{"content-type":"application/json"}:{}}}async function uZ($){try{return await $.text()}catch(Q){return Q instanceof Error?Q.message:String(Q)}}async function pz($){let Q=await uZ($);if(!Q)return;try{return JSON.parse(Q)}catch(Z){let X=Z instanceof Error?Z.message:String(Z);throw Error(`SUMR API returned invalid JSON: ${X}`)}}async function cz($,Q){let Z=new AbortController,X=setTimeout(()=>Z.abort(),Q9);try{return await fetch($,{...Q,signal:Z.signal})}catch(U){if(W6(U))throw Error(`SUMR API request timed out after ${Q9}ms.`);throw U}finally{clearTimeout(X)}}async function dZ($,Q,Z,X={}){let U=X.body===void 0?void 0:JSON.stringify(X.body),J=await cz(`${$.apiBaseUrl}${Z}`,{method:X.method??"GET",headers:lz(Q,U!==void 0),body:U});if(!J.ok)throw new G6(J.status,await uZ(J));return pz(J)}var pZ="prod",l1={apiBaseUrl:"https://api.sumr.co",clientId:"sumr-cli",scope:"openid offline organizations:read organizations:write api-keys:read api-keys:write"};async function lZ($,Q){if(!$.refreshToken)return null;try{let Z=await hZ($,l1);return U6(Z,Q),Z}catch(Z){return Z2(Z),null}}async function cZ($){let Q=q0($);if(!Q)throw mZ.error("Not signed in. Run `sumr login` first."),Error("Not signed in.");if(PZ(Q)){let Z=await lZ(Q,$);if(!Z)throw J6($),mZ.error("Session expired. Run `sumr login` to sign in again."),Error("Session expired.");return Z}if(bZ(Q))return await lZ(Q,$)??Q;return Q}async function nZ($,Q,Z={}){return dZ(l1,$,Q,Z)}var nz={name:"login",description:"Sign in to SUMR",usage:["sumr login"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr login"]};function iz($){try{return new URL($).protocol==="https:"}catch{return!1}}function rz($){if(!iz($))return;try{let Q=process.platform==="win32"?["cmd","/c","start","",$]:process.platform==="darwin"?["open",$]:["xdg-open",$];Bun.spawn(Q,{stdout:"ignore",stderr:"ignore",env:{...process.env},timeout:a2})}catch{}}function oz($){return/Unable to connect|access the url|typo in the url or port|fetch failed|Could not resolve host|getaddrinfo|ENOTFOUND|ECONNREFUSED|connection refused/i.test($)}function az($){if(!oz($))return{summary:$};return{summary:"Unable to connect to the prod auth API.",details:[`Target: ${l1.apiBaseUrl}`,"Retry later or contact SUMR support if the problem continues.",`Cause: ${$}`].join(`
1071
- `)}}async function sz($,Q){Q.start("Waiting for browser sign-in...");let Z=new AbortController,X=()=>{Z.abort()};process.on("SIGINT",X);try{let U=await gZ(pZ,l1,$.deviceCode,$.interval,Z.signal);return Q.stop("Sign-in approved."),{kind:"ok",session:U}}catch(U){if(Q.stop(""),U instanceof Q2||Z.signal.aborted)return{kind:"cancelled"};return{kind:"error",message:U instanceof Error?U.message:String(U)}}finally{process.off("SIGINT",X)}}async function tz(){let{spinner:$}=await import("@clack/prompts"),Q=$(q1("purple"));Q.start("Requesting sign-in code...");let Z;try{Z=await xZ(l1),Q.stop("Sign-in code ready.")}catch(X){return Q.stop(""),{kind:"error",message:X instanceof Error?X.message:String(X)}}return d$(["Open this URL in your browser:",` ${Z.verificationUriComplete??Z.verificationUri}`,"",`If prompted, enter this code: ${Z.userCode}`,"",`Code expires in ${Math.floor(Z.expiresIn/60)} minutes.`].join(`
1072
- `),"Sign in to SUMR","purple"),rz(Z.verificationUriComplete??Z.verificationUri),sz(Z,$(q1("purple")))}async function ez($){if($.args.flags.profile)return j$("`sumr login` does not accept --profile."),1;if($.argv.length>1)return j$("Unexpected argument: public login targets SUMR production only."),1;r("sumr");let Q=q0();if(Q){let U=Q.user?.email??Q.user?.name??"your account";return O0(`Already signed in as ${U}. Run \`sumr logout\` first.`),1}let Z=await tz();if(Z.kind==="cancelled")return O0("Sign-in cancelled."),1;if(Z.kind==="error"){let U=az(Z.message);return j$(`Sign-in failed: ${U.summary}`,{details:U.details,title:"Auth target"}),1}U6(Z.session);let X=Z.session.user?.email??Z.session.user?.name??`account on ${l1.apiBaseUrl.replace("https://","")}`;return v(`Signed in as ${X}.`),B1(),0}var iZ=E({name:"login",description:"Sign in to SUMR",group:"auth",visibility:"public",help:nz,execute:ez});N();var $_={name:"logout",description:"Sign out of SUMR",usage:["sumr logout"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr logout"]};async function Q_($){r("sumr");let Q=q0();if(!Q)return $1("Not signed in."),B1(),0;J6();let Z=Q.user?.email??Q.user?.name??"your account";return v(`Signed out of ${Z}.`),B1(),0}var rZ=E({name:"logout",description:"Sign out of SUMR",group:"auth",visibility:"public",help:$_,execute:Q_});N();function Z_($){return $===_9.Team||$===_9.Personal}function X_($){if(!F$($))return!1;return typeof $.id==="string"&&typeof $.organizationId==="string"&&typeof $.principalId==="string"&&typeof $.role==="string"&&typeof $.status==="string"&&I$($.invitedBy)&&I$($.acceptedAt)&&typeof $.createdAt==="string"}function U_($){if(!F$($))return!1;return typeof $.id==="string"&&typeof $.slug==="string"&&typeof $.name==="string"&&Z_($.kind)}function J_($){if(!F$($))return!1;return X_($.membership)&&U_($.organization)}function W_($){return F$($)&&Array.isArray($.data)&&$.data.every(J_)}function oZ($){if(!W_($))throw Error("SUMR API /v3/me/organizations response did not match the expected shape.");return $}var Y_={name:"whoami",description:"Show the currently signed-in user",usage:["sumr whoami"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr whoami"]};function G_($){if($===void 0)return"unknown";let Q=$-Date.now();if(Q<=0)return"expired";let Z=Math.floor(Q/60000);if(Z<60)return`in ${Z} minute${Z===1?"":"s"}`;let X=Math.floor(Z/60);return`in ${X} hour${X===1?"":"s"}`}async function z_($){r("sumr");let Q=await cZ(),Z=oZ(await nZ(Q,"/v3/me/organizations")),X=[];if(Q.user?.email)X.push(Q.user.email);if(Q.user?.name&&Q.user.name!==Q.user.email)X[0]=X[0]?`${X[0]} (${Q.user.name})`:Q.user.name;return X.push(`Stage: ${Q.stage}`),X.push(`Token expires: ${G_(Q.expiresAt)}`),X.push("API: connected"),X.push(`Organizations: ${Z.data.length}`),d$(X.join(`
1073
- `),"Signed in","purple"),B1(),0}function __($){if($ instanceof G6){let Q=$.details.trim();return Q?`API check failed (${$.status}): ${Q}`:`API check failed (${$.status}).`}return $ instanceof Error?$.message:"Unable to reach SUMR API."}var aZ=E({name:"whoami",description:"Show the currently signed-in user",group:"auth",visibility:"public",help:Y_,execute:async($)=>{try{return await z_($)}catch(Q){throw Error(__(Q))}}});N();function z6($,Q){let Z;async function X(){if(!Z)Z=o2(await $());return Z}return{name:Q.name,description:Q.description,group:Q.group,visibility:Q.visibility,run:async(U)=>(await X()).run(U)}}var Ok=z6(()=>Promise.resolve().then(() => (tU(),sU)).then(($)=>$.kontractModule),{name:"kontract",description:"Generate and validate API contract artifacts",group:"modules",visibility:"public"}),Kk=z6(()=>Promise.resolve().then(() => (lJ(),mJ)).then(($)=>$.missionModule),{name:"mission",description:"File-backed execution state for AI-assisted work",group:"modules",visibility:"public"}),qk=z6(()=>Promise.resolve().then(() => (IG(),FG)).then(($)=>$.playbookModule),{name:"playbook",description:"Sync Playbook docs into AI tools (Claude, Cursor, Codex, VS Code)",group:"modules",visibility:"public"});function RG(){return[iZ,rZ,aZ,jZ,$6,Ok,Kk,qk]}N();import{log as Ek}from"@clack/prompts";N();import{existsSync as NG,readFileSync as Bk}from"fs";import{dirname as DG,join as f7}from"path";import{fileURLToPath as Lk}from"url";var m8="0.0.0";function Ak($){if(!F$($))return;return typeof $.version==="string"?$.version:void 0}function l8($=import.meta.url){let Q=DG(Lk($));for(;;){if(NG(f7(Q,"package.json")))return Q;let Z=DG(Q);if(Z===Q)return;Q=Z}}function wG($){try{let Q=Bk(f7($,"package.json"),"utf8"),Z=JSON.parse(Q);return Ak(Z)??m8}catch{return m8}}function kG($=l8()){return Boolean($&&NG(f7($,UZ)))}var PG=[" _____ __ __ _____ _____ ","| __|__|__| | __ |","|__ | | | | | | -|","|_____|_____|_|_|_|__|__|"],Mk="\u2508".repeat(Math.max(...PG.map(($)=>$.length)));function v7(){if(typeof SUMR_CLI_VERSION==="string"&&SUMR_CLI_VERSION.trim())return SUMR_CLI_VERSION;let $=l8();if(!$)return m8;return wG($)}function jk(){let $=l8();if(!kG($))return"";return S("(Local-Test)","orange")}function Tk($){return $==="private"?"\uD83D\uDD12":"\uD83C\uDF10"}function l2($){console.log("");for(let J of PG)console.log(J);console.log(S(Mk,["mauve","dim"]));let Q=jk(),Z=Tk($),X=S("|",["mauve","dim"]),U=[Z,S(`v${v7()}`,["mauve","dim"]),Q].filter(Boolean).join(` ${X} `);console.log(U),console.log("")}async function bG($){let Q=r2($.argv),Z=new Map($.commands.map((U)=>[U.name,U]));if(!Q.command)return l2($.visibility),console.log(m1($.commands,$.visibility)),0;if(Q.command==="--help"||Q.command==="-h")return l2($.visibility),console.log(m1($.commands,$.visibility)),0;if(Q.command==="--version"||Q.command==="-v")return console.log(v7()),0;let X=Z.get(Q.command);if(!X)return l2($.visibility),console.error(`Unknown command: ${Q.command}`),console.log(m1($.commands,$.visibility)),1;if(X.name!==$6.name){let U=await t2();if(!U.ok){l2($.visibility);for(let J of e2(U))console.error(J);return 1}}try{return await X.run({argv:$.argv,args:Q,visibility:$.visibility})}catch(U){let J=U instanceof Error?U.message:"Unexpected error.";return Ek.error(J),1}}try{let $=await bG({argv:process.argv.slice(2),commands:RG(),visibility:"public"});process.exit($)}catch($){let Q=$ instanceof Error?$.message:String($);yG.error(`sumr: ${Q}`),yG.warn("Run `sumr doctor` to diagnose your installation."),process.exit(1)}
1119
+ `;function T8($){return JSON.stringify($).replace(/\$/g,"\\$")}function dH($){return uH.replace("__ACTION__",T8($)).replace("__SERVICE__",T8(E8)).replace("__ACCOUNT__",T8(C8)).replace("__LABEL__",T8(i7))}function k6($,Q){if(!Bun.which("swift"))return{code:-1,stdout:""};return K2(["swift","-e",dH($)],Q)}var mH={set:($)=>k6("set",$).code===0,get:()=>{let{code:$,stdout:Q}=k6("get");if($!==0)return null;let Z=Q.replace(/\n$/,"");return Z.length>0?Z:null},clear:()=>{k6("clear")}},lH={set:($)=>{if(!Bun.which("secret-tool"))return!1;return K2(["secret-tool","store",`--label=${i7}`,"service",E8,"account",C8],$).code===0},get:()=>{if(!Bun.which("secret-tool"))return null;let{code:$,stdout:Q}=K2(["secret-tool","lookup","service",E8,"account",C8]);if($!==0||Q.length===0)return null;return Q},clear:()=>{if(!Bun.which("secret-tool"))return;K2(["secret-tool","clear","service",E8,"account",C8])}},a7={set:($)=>{let{code:Q,stdout:Z}=l7(gH,$);if(Q!==0)return!1;let X=Z.trim();if(X.length===0)return!1;try{nH(X)}catch{return!1}return!0},get:()=>{let $=B2();if(!P6($))return null;let Q=rH($);if(Q===null||Q.trim().length===0)return null;let{code:Z,stdout:X}=l7(hH,Q);if(Z!==0)return null;let Y=X.trim();return Y.length>0?Y:null},clear:()=>{y6()}};function f6($){if($!==void 0)return null;if(process.env[d7]===j8)return null;if(process.platform==="darwin")return mH;if(process.platform==="linux")return lH;if(process.platform==="win32")return a7;return null}function s7($){return $!==void 0||process.env[N6]===j8}function pH(){return Error(`SUMR auth keychain is unavailable. Refusing to write plaintext auth credentials. Set ${N6}=${j8} only for local development or CI isolation.`)}function t7($,Q){if($!==a7)y6(Q)}function cH($,Q){o7(Q);let Z=B2(Q);L8(Z,`${JSON.stringify($,null,2)}
1120
+ `,{encoding:"utf8",mode:384}),p7(Z,384)}function y6($){let Q=B2($);if(P6(Q))yH(Q,{force:!0})}function nH($){o7();let Q=B2();L8(Q,$,{encoding:"utf8",mode:384}),p7(Q,384)}function rH($){try{return c7($,"utf8")}catch{return null}}function N0($){let Q=f6($);if(Q){let X=Q.get(),Y=X?m7(X):null;if(Y)return Y}let Z=B2($);if(!P6(Z))return null;try{let X=m7(c7(Z,"utf8"));if(!X)return null;if(s7($))return X;if(Q?.set(JSON.stringify(X)))return t7(Q,$),X;return null}catch{return null}}function w1($,Q){let Z=f6(Q);if(Z?.set(JSON.stringify($))){t7(Z,Q);return}if(!s7(Q))throw pH();cH($,Q)}function F8($){let Q=f6($);if(Q)Q.clear();y6($)}function e7($){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt}function $5($,Q=300000){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt-Q}import{log as _5}from"@clack/prompts";function N$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function w$($){return $===void 0||typeof $==="string"}function M8($){return $ instanceof Error&&($.name==="AbortError"||$.message.toLowerCase().includes("aborted"))}function A2($){return $ instanceof Error?$.message:String($)}class $0 extends Error{status;details;constructor($,Q){super(`SUMR API request failed (${$}).`);this.name="SumrApiError",this.status=$,this.details=Q}}function iH($){return`Bearer ${$.accessToken}`}function oH($,Q){return{accept:"application/json",authorization:iH($),...$.selectedAccount?{"x-sumr-account-id":$.selectedAccount.id}:{},...Q?{"content-type":"application/json"}:{}}}async function Q5($){try{return await $.text()}catch(Q){return Q instanceof Error?Q.message:String(Q)}}async function aH($){let Q=await Q5($);if(!Q)return;try{return JSON.parse(Q)}catch(Z){let X=Z instanceof Error?Z.message:String(Z);throw Error(`SUMR API returned invalid JSON: ${X}`)}}async function sH($,Q){let Z=new AbortController,X=setTimeout(()=>Z.abort(),w6);try{return await fetch($,{...Q,signal:Z.signal})}catch(Y){if(M8(Y))throw Error(`SUMR API request timed out after ${w6}ms.`);throw Y}finally{clearTimeout(X)}}async function x6($,Q,Z,X={}){let Y=X.body===void 0?void 0:JSON.stringify(X.body),W=await sH(`${$.apiBaseUrl}${Z}`,{method:X.method??"GET",headers:oH(Q,Y!==void 0),body:Y});if(!W.ok)throw new $0(W.status,await Q5(W));return aH(W)}var L2={AuthorizationPending:"authorization_pending",SlowDown:"slow_down",AccessDenied:"access_denied",ExpiredToken:"expired_token"},v6={Team:"team",Personal:"personal"};class O2 extends Error{constructor(){super("Login cancelled.");this.name="LoginCancelledError"}}var tH="urn:ietf:params:oauth:grant-type:device_code",eH="refresh_token";function $V($){return $===void 0||typeof $==="number"}function QV($){if(!N$($))return!1;return w$($.sub)&&w$($.email)&&w$($.name)}function ZV($){if(!N$($))return!1;return typeof $.deviceCode==="string"&&typeof $.userCode==="string"&&typeof $.verificationUri==="string"&&w$($.verificationUriComplete)&&typeof $.expiresIn==="number"&&typeof $.interval==="number"}function Z5($){if(!N$($))return!1;return typeof $.access_token==="string"&&w$($.refresh_token)&&w$($.id_token)&&w$($.token_type)&&$V($.expires_in)}function XV($){if(!N$($))return!1;return typeof $.error==="string"&&w$($.error_description)}async function X5($){try{return await $.text()}catch(Q){return`Unable to read response body: ${A2(Q)}`}}async function S8($,Q){try{return await $.json()}catch(Z){throw Error(`${Q} returned invalid JSON: ${A2(Z)}`)}}function Y5($){try{let Q=$.split(".");if(Q.length!==3||!Q[1])return{};let Z=Q[1].replace(/-/g,"+").replace(/_/g,"/"),X=atob(Z),Y=JSON.parse(X);return QV(Y)?Y:{}}catch{return{}}}function YV($){return new Promise((Q)=>setTimeout(Q,$))}function WV($,Q){switch($){case L2.AuthorizationPending:return Q;case L2.SlowDown:return Q+5;case L2.AccessDenied:throw Error("Access denied. You declined the login request in the browser.");case L2.ExpiredToken:throw Error("Device code expired. Run `sumr login` to try again.");default:throw Error(`Unexpected error from auth server: ${$}`)}}function g6($){if($?.aborted)throw new O2}async function h6($,Q,Z){let X=new AbortController,Y=setTimeout(()=>X.abort(),b6),W=()=>X.abort();if(Z?.aborted)X.abort();else Z?.addEventListener("abort",W,{once:!0});try{return await fetch($,{...Q,signal:X.signal})}catch(U){if(M8(U))throw g6(Z),Error(`SUMR identity request timed out after ${b6}ms.`);throw U}finally{clearTimeout(Y),Z?.removeEventListener("abort",W)}}function UV($,Q){let Z=Y5(Q.id_token??Q.access_token),X=Q.expires_in?Date.now()+Q.expires_in*1000:void 0;return{stage:$,accessToken:Q.access_token,idToken:Q.id_token,refreshToken:Q.refresh_token,tokenType:Q.token_type??"Bearer",expiresAt:X,createdAt:new Date().toISOString(),user:{id:Z.sub,email:Z.email,name:Z.name}}}async function JV($){try{let Q=await S8($,"Device token error response");if(!XV(Q))throw Error("Device token error response did not match the expected shape.");return Q.error}catch{throw Error(`Device token poll failed (${$.status})`)}}async function GV($,Q){let Z=await S8($,"Device token response");if(!Z5(Z))throw Error("Device token response did not match the expected shape.");return UV(Q,Z)}async function _V($,Q,Z,X,Y){let W=await h6(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:tH,deviceCode:X,clientId:Z})},Y);if(W.ok)return{kind:"approved",session:await GV(W,$)};return{kind:"pending",errorCode:await JV(W)}}async function W5($){let Q=`${$.apiBaseUrl}/v3/identity/device/code`,Z=await h6(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:$.clientId,scope:$.scope})});if(!Z.ok){let Y=await X5(Z);throw Error(`Device code request failed (${Z.status}): ${Y}`)}let X=await S8(Z,"Device code response");if(!ZV(X))throw Error("Device code response did not match the expected shape.");return X}async function U5($,Q,Z,X,Y){let W=`${Q.apiBaseUrl}/v3/identity/device/token`,U=X;for(;;){g6(Y),await YV(U*1000),g6(Y);let J=await _V($,W,Q.clientId,Z,Y);if(J.kind==="approved")return J.session;U=WV(J.errorCode,U)}}async function J5($,Q){if(!$.refreshToken)throw Error("No refresh token available.");let Z=`${Q.apiBaseUrl}/v3/identity/oauth/token`,X=await h6(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:eH,clientId:Q.clientId,refreshToken:$.refreshToken})});if(!X.ok){let J=await X5(X);throw Error(`Token refresh failed (${X.status}): ${J}`)}let Y=await S8(X,"Token refresh response");if(!Z5(Y))throw Error("Token refresh response did not match the expected shape.");let W=Y5(Y.id_token??Y.access_token),U=Y.expires_in?Date.now()+Y.expires_in*1000:void 0;return{...$,accessToken:Y.access_token,idToken:Y.id_token??$.idToken,refreshToken:Y.refresh_token??$.refreshToken,tokenType:Y.token_type??$.tokenType,expiresAt:U,user:{id:W.sub??$.user?.id,email:W.email??$.user?.email,name:W.name??$.user?.name}}}function HV($){return $===v6.Team||$===v6.Personal}function VV($){return $==="owner"||$==="admin"||$==="member"||$==="viewer"}function qV($){if(!N$($))return!1;return typeof $.id==="string"&&typeof $.accountId==="string"&&typeof $.principalId==="string"&&VV($.role)&&typeof $.status==="string"&&w$($.invitedBy)&&w$($.acceptedAt)&&typeof $.createdAt==="string"}function KV($){if(!N$($))return!1;return typeof $.id==="string"&&typeof $.slug==="string"&&typeof $.name==="string"&&HV($.kind)}function BV($){if(!N$($))return!1;return qV($.membership)&&KV($.account)}function AV($){return N$($)&&Array.isArray($.data)&&$.data.every(BV)}function G5($){if(!AV($))throw Error("SUMR API /v3/me/accounts response did not match the expected shape.");return $}function w0($){return{id:$.account.id,slug:$.account.slug,name:$.account.name,kind:$.account.kind,role:$.membership.role}}var V5="prod",Q0={apiBaseUrl:"https://api.sumr.co",clientId:"sumr-cli",scope:"openid profile email offline accounts:read accounts:write api-keys:read api-keys:write playbook:read playbook:write"};async function H5($,Q){if(!$.refreshToken)return null;try{let Z=await J5($,Q0);return w1(Z,Q),Z}catch(Z){return A2(Z),null}}async function I8($){let Q=N0($);if(!Q)throw _5.error("Not signed in. Run `sumr login` first."),Error("Not signed in.");if(e7(Q)){let Z=await H5(Q,$);if(!Z)throw F8($),_5.error("Session expired. Run `sumr login` to sign in again."),Error("Session expired.");return Z}if($5(Q))return await H5(Q,$)??Q;return Q}async function LV($,Q,Z={}){return x6(Q0,$,Q,Z)}async function b0($){return G5(await LV($,"/v3/me/accounts"))}R();function k3(){return Boolean(process.stdin.isTTY&&process.stdout.isTTY)}function y1($){return`${$.name} (${$.slug}) \xB7 ${$.role}`}function f1($,Q){return{...$,selectedAccount:Q}}function b8($,Q){let Z=Q.trim().toLowerCase();if(!Z)return;let X=$.find((Y)=>{let W=Y.account;return W.id.toLowerCase()===Z||W.slug.toLowerCase()===Z||W.name.toLowerCase()===Z});return X?w0(X):void 0}async function i6($){if(!k3())return;let{isCancel:Q,select:Z}=await import("@clack/prompts"),X=await Z({message:"Choose the SUMR account to use",options:$.map((Y)=>{let W=w0(Y);return{value:W.id,label:y1(W),hint:W.kind}})});if(Q(X)||typeof X!=="string")return;return b8($,X)}async function f0($,Q,Z={}){let Y=(await Q($)).data;if(Y.length===0)return{kind:"none",accounts:Y,session:f1($,void 0)};if($.selectedAccount){let W=b8(Y,$.selectedAccount.id);if(W)return{kind:"ready",accounts:Y,session:f1($,W),selectedAccount:W}}if(Y.length===1){let W=Y.at(0);if(!W)return{kind:"none",accounts:Y,session:f1($,void 0)};let U=w0(W);return{kind:"auto-selected",accounts:Y,session:f1($,U),selectedAccount:U}}if(Z.prompt){let W=await i6(Y);if(W)return{kind:"selected",accounts:Y,session:f1($,W),selectedAccount:W}}return{kind:"needs-selection",accounts:Y,session:f1($,void 0)}}import{existsSync as g5,readFileSync as P3}from"fs";import{dirname as v5,join as o6}from"path";import{fileURLToPath as f3}from"url";var k8="0.0.0";function y3($){if(!N$($))return;return typeof $.version==="string"?$.version:void 0}function P8($=import.meta.url){let Q=v5(f3($));for(;;){if(g5(o6(Q,"package.json")))return Q;let Z=v5(Q);if(Z===Q)return;Q=Z}}function h5($){try{let Q=P3(o6($,"package.json"),"utf8"),Z=JSON.parse(Q);return y3(Z)??k8}catch{return k8}}function a6($=P8()){return Boolean($&&g5(o6($,g7)))}var v3={name:"account",description:"Manage the SUMR account used by API requests",usage:["sumr account current","sumr account list","sumr account select","sumr account select <account-id-or-slug>"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr account current","sumr account list","sumr account select","sumr account select company-1"]};function u5($,Q){return $.map((Z)=>{let X=w0(Z);return`${X.id===Q?.id?"*":" "} ${X.slug.padEnd(24)} ${X.role.padEnd(8)} ${X.id} ${X.name}`})}function g3($){let Q=$[1],Z=$[2];if(!Q||Q==="current")return{action:"current"};if(Q==="list")return{action:"list"};if(Q==="select")return{action:"select",identifier:Z};if(Q==="--help"||Q==="-h")return{action:"help"};return{action:"unknown"}}function h3($){if($ instanceof $0){let Q=$.details.trim();return Q?`Account API check failed (${$.status}): ${Q}`:`Account API check failed (${$.status}).`}return $ instanceof Error?$.message:"Unable to reach SUMR API."}async function u3($){let Q=await $.requireSession(),Z=await f0(Q,$.listAccounts);if(Z.kind==="auto-selected"||Z.kind==="ready")$.writeSession(Z.session);if(!Z.selectedAccount){if(Z.accounts.length===0)return Q$("No SUMR accounts are available for this user."),1;return Q$("No account selected. Run `sumr account select` or `sumr account select <account-id-or-slug>`."),1}return q$([y1(Z.selectedAccount),`Account ID: ${Z.selectedAccount.id}`,`Kind: ${Z.selectedAccount.kind}`].join(`
1121
+ `),"Current account","purple"),0}async function d3($){let Q=await $.requireSession(),Z=await $.listAccounts(Q);if(Z.data.length===0)return Q$("No SUMR accounts are available for this user."),1;return q$(u5(Z.data,Q.selectedAccount).join(`
1122
+ `),"SUMR accounts","purple"),0}async function m3($,Q){if(Q)return b8($,Q);return i6($)}async function l3($,Q){let Z=await $.requireSession(),X=await $.listAccounts(Z);if(X.data.length===0)return Q$("No SUMR accounts are available for this user."),1;let Y=await m3(X.data,Q);if(!Y){if(Q)r(`Account not found: ${Q}`),q$(u5(X.data,Z.selectedAccount).join(`
1123
+ `),"Available accounts");else Q$("Account selection cancelled.");return 1}return $.writeSession(f1(Z,Y)),P(`Selected ${y1(Y)}.`),0}async function p3($,Q){let Z=g3(Q.argv);if(n("sumr"),Z.action==="help")return 0;if(Z.action==="unknown")return r("Unknown account command. Use `sumr account current`, `list`, or `select`."),1;if(Z.action==="list")return d3($);if(Z.action==="select"){let Y=await l3($,Z.identifier);if(Y===0)g$();return Y}let X=await u3($);if(X===0)g$();return X}function d5($){return E({name:"account",description:"Manage the SUMR account used by API requests",group:"auth",visibility:"public",help:v3,execute:async(Q)=>{try{return await p3($,Q)}catch(Z){throw Error(h3(Z))}}})}var m5=d5({listAccounts:b0,requireSession:I8,writeSession:w1});R();import{spawnSync as l5}from"child_process";function p5(){return{...process.env}}function c5(){return process.env.SUMR_AWS_BIN?.trim()||"aws"}function n5(){return l5(c5(),["--version"],{stdio:"pipe",env:p5(),timeout:h7}).status===0}function r5(){let $=l5(c5(),["--version"],{stdio:"pipe",encoding:"utf8",env:p5(),timeout:z8});if($.status!==0)return;return`${$.stdout}
1124
+ ${$.stderr}`.trim()||void 0}var s5="Bun runtime",t5="Bun version",c3="Bun recommended version";function i5($){let Q=$.match(/^v?(\d+)\.(\d+)\.(\d+)/);if(!Q)return;return[Number(Q[1]),Number(Q[2]),Number(Q[3])]}function o5($,Q){let Z=i5($),X=i5(Q);if(!Z||!X)return!1;if(Z[0]!==X[0])return Z[0]>X[0];if(Z[1]!==X[1])return Z[1]>X[1];return Z[2]>=X[2]}function a5($,Q){return $.checks.some((Z)=>Z.label===Q&&Z.required&&!Z.ok)}async function f8(){let $=process.versions.bun,Q=process.versions.node,Z=Boolean($),X=$?o5($,q2):!1,Y=$?o5($,D6):!1,W=[{label:s5,ok:Z,required:!0,details:Z?`active (${$})`:`not active (running on Node ${Q})`},{label:t5,ok:X,required:!0,details:$?`${$} (required >= ${q2})`:"unknown (Bun runtime not active)"},{label:c3,ok:Y,required:!1,details:$?`${$} (recommended >= ${D6})`:"unknown (Bun runtime not active)"}];return{ok:W.filter((J)=>J.required).every((J)=>J.ok),bunVersion:$,nodeVersion:Q,checks:W}}function y8($,Q={}){let Z=Q.includeDoctorFollowUp??!0,X=["\u26A0 Runtime precheck failed."],Y=a5($,s5),W=a5($,t5);if(Y)X.push("- SUMR CLI runs on Bun runtime only."),X.push(`- Current runtime: Node ${$.nodeVersion}.`),X.push("- Install Bun: https://bun.sh/docs/installation"),X.push("- Reinstall SUMR with Bun: `bun add -g @sumrco/cli`.");else if(W)X.push(`- Bun ${$.bunVersion??"unknown"} is below required ${q2}.`),X.push(`- Upgrade Bun to >= ${q2}: \`bun upgrade\`.`);else X.push("- Runtime checks failed. Run `sumr doctor` for details.");if(Z)X.push("Run `sumr doctor` for full diagnostics.");return X}var n3={name:"doctor",description:"Check runtime and tool requirements",usage:["sumr doctor"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr doctor"]};function e5($){if($.ok)return F("PASS",["pink","bold"]);return $.required?F("FAIL",["pink","bold"]):F("WARN",["orchid","bold"])}async function r3($){let Q=await f8(),Z=$.visibility==="private",X=Z?n5():!0,Y=Z?r5():void 0;console.log(""),console.log(F("SUMR doctor",["purple","bold"])),console.log("");for(let W of Q.checks)console.log(`- ${e5(W)} ${W.label}: ${W.details}`);if(Z)console.log(`- ${e5({ok:X,required:!0})} AWS CLI: ${Y??"not found"}`),console.log("");else console.log("");if(!Q.ok){for(let W of y8(Q,{includeDoctorFollowUp:!1}).slice(1))console.log(W);return 1}if(Z&&!X)return console.log(F("Install AWS CLI to use private team commands.","orchid")),1;return console.log(F(Z?"Environment looks good.":"Runtime looks good.","pink")),0}var x8=E({name:"doctor",description:"Check runtime and tool requirements",group:"system",visibility:"public",help:n3,execute:r3});R();import{existsSync as i3}from"fs";import{join as o3}from"path";import{log as s6}from"@clack/prompts";var t6=["docs"],a3=new Set(["source","yes"]),s3=new Set(["input","output"]),t3={claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},e3={name:"init",description:"Create a sumr.yaml config for this repository",usage:["sumr init","sumr init --yes","sumr init --source docs,standards"],options:[{flag:"--source <paths>",description:"Private mode: playbook source paths (comma-separated, e.g. docs,standards)"},{flag:"--yes",description:"Skip overwrite prompts and create/update sumr.yaml"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr init","sumr init --yes","sumr init --source docs,standards"]};function $4($,Q,Z,X){let Y=$.indexOf("=");if(Y!==-1)return X[$.slice(2,Y)]=$.slice(Y+1),0;let W=Q[Z+1];if(W&&!W.startsWith("-"))return X[$.slice(2)]=W,1;return X[$.slice(2)]=!0,0}function Q4($,Q,Z,X){let Y=Q[Z+1];if(Y&&!Y.startsWith("-"))return X[$.slice(1)]=Y,1;return X[$.slice(1)]=!0,0}function Z4($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let Y=$[X];if(!Y)continue;if(Y.startsWith("--")){X+=$4(Y,$,X,Q);continue}if(Y.startsWith("-")&&Y.length===2){X+=Q4(Y,$,X,Q);continue}Z.push(Y)}return{positionals:Z,options:Q}}function X4($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function Y4($,Q){return Object.hasOwn($,Q)}function W4($,Q){return $[Q]===!0}function U4($){if(!$)return[...t6];let Q=$.split(",").map((Z)=>Z.trim()).filter(Boolean);if(Q.length===0)return[...t6];return Q}function $X(){let $=[];return $.push("# SUMR per-repo configuration"),$.push("# Add product-specific sections only when the repository needs them."),$.push("version: 1"),$.push(""),$.join(`
1125
+ `)}function J4($){let Q=[];Q.push("# Playbook"),Q.push("playbook:"),Q.push(" channels:");for(let[Z,X]of Object.entries(t3))Q.push(` ${Z}: ${X}`);Q.push(" sources:");for(let Z of $.sourcePaths)Q.push(` - ${Z}`);return Q}function G4($){return Object.keys($).filter((Q)=>!a3.has(Q))}function _4($){return $.length===1?`-${$}`:`--${$}`}function H4($){let Q=$.map(_4).join(", "),Z=$.length===1?"is":"are";if($.some((Y)=>s3.has(Y))){console.error(`${Q} ${Z} no longer supported by \`sumr init\`. Configure Kontract with \`kontract.sources\` in sumr.yaml or pass generation flags to \`sumr kontract generate\`.`);return}console.error(`Unsupported init option: ${Q}.`)}async function V4($,Q){if($||!Q)return!0;let{confirm:Z,outro:X,isCancel:Y}=await import("@clack/prompts"),W=await Z({message:"sumr.yaml already exists. Update it?",initialValue:!1});if(Y(W)||!W)return X("Cancelled \u2014 existing sumr.yaml was not changed."),!1;return!0}function q4($,Q,Z){if(!Q&&!Z.includePlaybook)return k1($,$X()),!0;if(!Z.includePlaybook)return!1;return Y0($,"playbook",J4(Z),{fallbackContent:$X(),sectionComment:"# Playbook"}),!0}function K4($,Q){if(!$)return"Created";return Q?"Updated":"Kept existing"}function B4($){return $?`${b1} kept existing module config.`:`${b1} created in this directory.`}function A4($){return $?["Next:"," sumr playbook sync"," sumr --help"]:["Next:"," sumr --help"]}async function L4($,Q,Z,X,Y){if(Q){s6.success(`${K4(Z,X)} ${b1} in ${$}`);return}let{note:W}=await import("@clack/prompts");W([B4(Z),"",...A4(Y)].join(`
1126
+ `),"SUMR init")}async function O4($){if($.args.flags.profile)return s6.error("Use `sumr init` without `--profile`."),1;let Q=Z4($.argv.slice(1));if(Q.positionals.length>0)return s6.error("Use `sumr init` with flags only."),1;let Z=G4(Q.options);if(Z.length>0)return H4(Z),1;let X=process.cwd(),Y=o3(X,b1),W=W4(Q.options,"yes"),U=Y4(Q.options,"source"),J=$.visibility==="private"&&U,G=X4(Q.options,"source");if($.visibility!=="private"&&U)return console.error("`--source` is only available in private mode (when playbook commands are present)."),1;let _={sourcePaths:J?U4(G):[...t6],includePlaybook:J},H=i3(Y);if(!await V4(W,H))return 0;let q=q4(Y,H,_);return await L4(X,W,H,q,J),0}var QX=E({name:"init",description:"Create a sumr.yaml config for this repository",group:"system",visibility:"public",help:e3,execute:O4});R();var z4={name:"login",description:"Sign in to SUMR",usage:["sumr login"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr login"]};function j4($){try{return new URL($).protocol==="https:"}catch{return!1}}function T4($){if(!j4($))return;try{let Q=process.platform==="win32"?["cmd","/c","start","",$]:process.platform==="darwin"?["open",$]:["xdg-open",$];Bun.spawn(Q,{stdout:"ignore",stderr:"ignore",env:{...process.env},timeout:z8})}catch{}}function E4($){return/Unable to connect|access the url|typo in the url or port|fetch failed|Could not resolve host|getaddrinfo|ENOTFOUND|ECONNREFUSED|connection refused/i.test($)}function C4($){if(!E4($))return{summary:$};return{summary:"Unable to connect to the prod auth API.",details:[`Target: ${Q0.apiBaseUrl}`,"Retry later or contact SUMR support if the problem continues.",`Cause: ${$}`].join(`
1127
+ `)}}async function F4($,Q){Q.start("Waiting for browser sign-in...");let Z=new AbortController,X=()=>{Z.abort()};process.on("SIGINT",X);try{let Y=await U5(V5,Q0,$.deviceCode,$.interval,Z.signal);return Q.stop("Sign-in approved."),{kind:"ok",session:Y}}catch(Y){if(Q.stop(""),Y instanceof O2||Z.signal.aborted)return{kind:"cancelled"};return{kind:"error",message:Y instanceof Error?Y.message:String(Y)}}finally{process.off("SIGINT",X)}}async function M4(){let{spinner:$}=await import("@clack/prompts"),Q=$(H1("purple"));Q.start("Requesting sign-in code...");let Z;try{Z=await W5(Q0),Q.stop("Sign-in code ready.")}catch(X){return Q.stop(""),{kind:"error",message:X instanceof Error?X.message:String(X)}}return q$(["Open this URL in your browser:",` ${Z.verificationUriComplete??Z.verificationUri}`,"",`If prompted, enter this code: ${Z.userCode}`,"",`Code expires in ${Math.floor(Z.expiresIn/60)} minutes.`].join(`
1128
+ `),"Sign in to SUMR","purple"),T4(Z.verificationUriComplete??Z.verificationUri),F4(Z,$(H1("purple")))}async function S4($){if($.args.flags.profile)return r("`sumr login` does not accept --profile."),1;if($.argv.length>1)return r("Unexpected argument: public login targets SUMR production only."),1;n("sumr");let Q=N0();if(Q){let W=Q.user?.email??Q.user?.name??"your account";return Q$(`Already signed in as ${W}. Run \`sumr logout\` first.`),1}let Z=await M4();if(Z.kind==="cancelled")return Q$("Sign-in cancelled."),1;if(Z.kind==="error"){let W=C4(Z.message);return r(`Sign-in failed: ${W.summary}`,{details:W.details,title:"Auth target"}),1}let X=Z.session;try{let W=await f0(X,b0,{prompt:!0});if(X=W.session,(W.kind==="auto-selected"||W.kind==="selected")&&W.selectedAccount)q$(y1(W.selectedAccount),"Selected account","purple");else if(W.kind==="needs-selection")Q$("Multiple SUMR accounts are available. Run `sumr account select` before account-scoped API commands.");else if(W.kind==="none")Q$("Signed in, but no SUMR accounts are available for this user.")}catch(W){let U=W instanceof Error?W.message:String(W);Q$(`Signed in, but account discovery failed: ${U}`)}w1(X);let Y=X.user?.email??X.user?.name??`account on ${Q0.apiBaseUrl.replace("https://","")}`;return P(`Signed in as ${Y}.`),g$(),0}var ZX=E({name:"login",description:"Sign in to SUMR",group:"auth",visibility:"public",help:z4,execute:S4});R();var I4={name:"logout",description:"Sign out of SUMR",usage:["sumr logout"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr logout"]};async function R4($){n("sumr");let Q=N0();if(!Q)return V1("Not signed in."),g$(),0;F8();let Z=Q.user?.email??Q.user?.name??"your account";return P(`Signed out of ${Z}.`),g$(),0}var XX=E({name:"logout",description:"Sign out of SUMR",group:"auth",visibility:"public",help:I4,execute:R4});R();var D4={name:"whoami",description:"Show the currently signed-in user",usage:["sumr whoami"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr whoami"]};function N4($){if($===void 0)return"unknown";let Q=$-Date.now();if(Q<=0)return"expired";let Z=Math.floor(Q/60000);if(Z<60)return`in ${Z} minute${Z===1?"":"s"}`;let X=Math.floor(Z/60);return`in ${X} hour${X===1?"":"s"}`}function w4($,Q){return JSON.stringify($.selectedAccount)!==JSON.stringify(Q.selectedAccount)}async function b4($,Q){n("sumr");let Z=await $.requireSession(),X=await f0(Z,$.listAccounts);if(w4(Z,X.session))$.writeSession(X.session);let Y=[];if(Z.user?.email)Y.push(Z.user.email);if(Z.user?.name&&Z.user.name!==Z.user.email)Y[0]=Y[0]?`${Y[0]} (${Z.user.name})`:Z.user.name;if(Y.push(`Stage: ${Z.stage}`),Y.push(`Token expires: ${N4(Z.expiresAt)}`),Y.push("API: connected"),Y.push(`Accounts: ${X.accounts.length}`),X.selectedAccount)Y.push(`Current: ${y1(X.selectedAccount)}`);else if(X.accounts.length>1)Y.push("Current: not selected (run `sumr account select`)");return q$(Y.join(`
1129
+ `),"Signed in","purple"),g$(),0}function k4($){if($ instanceof $0){let Q=$.details.trim();return Q?`API check failed (${$.status}): ${Q}`:`API check failed (${$.status}).`}return $ instanceof Error?$.message:"Unable to reach SUMR API."}function YX($){return E({name:"whoami",description:"Show the currently signed-in user",group:"auth",visibility:"public",help:D4,execute:async(Q)=>{try{return await b4($,Q)}catch(Z){throw Error(k4(Z))}}})}var WX=YX({listAccounts:b0,requireSession:I8,writeSession:w1});R();function v8($,Q){let Z;async function X(){if(!Z)Z=w8(await $());return Z}return{name:Q.name,description:Q.description,group:Q.group,visibility:Q.visibility,run:async(Y)=>(await X()).run(Y)}}var yy=v8(()=>Promise.resolve().then(() => (xU(),yU)).then(($)=>$.kontractModule),{name:"kontract",description:"Generate and validate API contract artifacts",group:"modules",visibility:"public"}),xy=v8(()=>Promise.resolve().then(() => (wJ(),NJ)).then(($)=>$.missionModule),{name:"mission",description:"File-backed execution state for AI-assisted work",group:"modules",visibility:"public"}),vy=v8(()=>Promise.resolve().then(() => (zH(),OH)).then(($)=>$.playbookModule),{name:"playbook",description:"Sync Playbook docs into AI tools (Claude, Cursor, Codex, VS Code)",group:"modules",visibility:"public"});function jH(){return[ZX,XX,WX,m5,QX,x8,yy,xy,vy]}R();import{log as dy}from"@clack/prompts";R();var TH=[" _____ __ __ _____ _____ ","| __|__|__| | __ |","|__ | | | | | | -|","|_____|_____|_|_|_|__|__|"],gy="\u2508".repeat(Math.max(...TH.map(($)=>$.length)));function x7(){if(typeof SUMR_CLI_VERSION==="string"&&SUMR_CLI_VERSION.trim())return SUMR_CLI_VERSION;let $=P8();if(!$)return k8;return h5($)}function hy(){let $=P8();if(!a6($))return"";return F("(Local-Test)","orange")}function uy($){return $==="private"?"\uD83D\uDD12":"\uD83C\uDF10"}function K8($){console.log("");for(let W of TH)console.log(W);console.log(F(gy,["mauve","dim"]));let Q=hy(),Z=uy($),X=F("|",["mauve","dim"]),Y=[Z,F(`v${x7()}`,["mauve","dim"]),Q].filter(Boolean).join(` ${X} `);console.log(Y),console.log("")}async function EH($){let Q=N8($.argv),Z=new Map($.commands.map((Y)=>[Y.name,Y]));if(!Q.command)return K8($.visibility),console.log(W0($.commands,$.visibility)),0;if(Q.command==="--help"||Q.command==="-h")return K8($.visibility),console.log(W0($.commands,$.visibility)),0;if(Q.command==="--version"||Q.command==="-v")return console.log(x7()),0;let X=Z.get(Q.command);if(!X)return K8($.visibility),console.error(`Unknown command: ${Q.command}`),console.log(W0($.commands,$.visibility)),1;if(X.name!==x8.name){let Y=await f8();if(!Y.ok){K8($.visibility);for(let W of y8(Y))console.error(W);return 1}}try{return await X.run({argv:$.argv,args:Q,visibility:$.visibility})}catch(Y){let W=Y instanceof Error?Y.message:"Unexpected error.";return dy.error(W),1}}try{let $=await EH({argv:process.argv.slice(2),commands:jH(),visibility:"public"});process.exit($)}catch($){let Q=$ instanceof Error?$.message:String($);CH.error(`sumr: ${Q}`),CH.warn("Run `sumr doctor` to diagnose your installation."),process.exit(1)}