@sumrco/cli 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai/modules/playbook/sumr.module.yaml +9 -9
- package/index.js +671 -161
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
`)}function
|
|
5
|
-
`),
|
|
6
|
-
`);if(U)
|
|
7
|
-
`){return
|
|
8
|
-
`,"utf8"),
|
|
9
|
-
`)}function
|
|
10
|
-
`):void 0}function
|
|
11
|
-
${$.details}`;return $.details??
|
|
12
|
-
`),
|
|
13
|
-
`)}function
|
|
14
|
-
`)}function
|
|
15
|
-
`):"export {};";return
|
|
16
|
-
`)}async function
|
|
3
|
+
var wG=Object.defineProperty;var bG=($)=>$;function kG($,Q){this[$]=bG.bind(null,Q)}var N2=($,Q)=>{for(var Z in Q)wG($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:kG.bind(Q,Z)})};var w2=($,Q)=>()=>($&&(Q=$($=0)),Q);var N$=import.meta.require;var I6={};N2(I6,{writeSumrYamlTopLevelSection:()=>g1,writeSumrYamlDocument:()=>J0,writeFileAtomically:()=>TQ,validateSumrYaml:()=>R_,sumrWarn:()=>G0,sumrTitle:()=>i,sumrText:()=>_0,sumrSuccess:()=>P,sumrStep:()=>L_,sumrSelect:()=>a$,sumrNote:()=>h$,sumrList:()=>u$,sumrIsInteractive:()=>u0,sumrInfo:()=>o$,sumrError:()=>K$,sumrDone:()=>O1,sumrCancel:()=>F6,runModuleCli:()=>C_,renderNamespaceHelp:()=>IQ,renderHelp:()=>h1,renderCommandLine:()=>y0,renderCommandHelp:()=>FQ,recordActivation:()=>x0,readSumrYamlText:()=>k2,readActivations:()=>j6,parseArgv:()=>P2,mountModule:()=>f2,isActivated:()=>S6,defineModule:()=>K1,defineCommand:()=>E,createSliceValidator:()=>N_,createNamespaceCommand:()=>DQ,coreModule:()=>j_,contractCommand:()=>RQ,composeSumrYamlSchema:()=>bQ,brandText:()=>C,brandSpinnerOptions:()=>V1,brandNoteOptions:()=>w$,brandLogOptions:()=>U$,activationFilePath:()=>T6,SumrYamlEnvelopeSchema:()=>wQ,SUMR_YAML_FILENAMES:()=>v0,SUMR_YAML_FILE:()=>H1});import{existsSync as b2,mkdirSync as PG,readFileSync as AQ,renameSync as fG,rmSync as yG,writeFileSync as vG}from"fs";import{homedir as xG}from"os";import{dirname as MQ,join as W0,resolve as gG}from"path";import{existsSync as EQ,readFileSync as hG,renameSync as uG,rmSync as dG,writeFileSync as mG}from"fs";import{intro as V_,log as g0,note as C6,outro as O_}from"@clack/prompts";import{cancel as F_,isCancel as NQ,select as I_,text as D_}from"@clack/prompts";import{z as BQ}from"zod";function TQ($,Q,Z){let X=`${$}.${process.pid}.${Date.now()}.tmp`;try{mG(X,Q,Z),uG(X,$)}catch(U){if(EQ(X))dG(X,{force:!0});throw U}}function lG($){return $.endsWith(":")?$.slice(0,-1):$}function pG($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cG($){return/^[A-Za-z][A-Za-z0-9_-]*:\s*(?:.*)$/.test($)}function VQ($){let Q=[...$];while(Q.at(-1)?.trim()===x1)Q.pop();return Q}function nG($){let Q=[...$];while(Q[0]?.trim()===x1)Q.shift();return Q}function OQ($,Q){return $[Q]??x1}function iG($,Q,Z){let X=lG(Q),U=new RegExp(`^${pG(X)}:\\s*(?:#.*)?$`),W=$.findIndex((_)=>U.test(_));if(W===-1)return;let J=Z&&$[W-1]?.trim()===Z?W-1:W,G=$.length;for(let _=W+1;_<$.length;_+=1)if(cG(OQ($,_))){G=_;break}while(G>W+1){let _=OQ($,G-1).trim();if(_!==x1&&!_.startsWith("#"))break;G-=1}return{start:J,end:G}}function KQ($,Q,Z){let X=[...$];if(X.length>0)X.push(x1);if(X.push(...Q),Z.length>0)X.push(x1,...Z);return X.push(x1),X.join(`
|
|
4
|
+
`)}function rG($,Q,Z,X={}){let U=$.endsWith(`
|
|
5
|
+
`),W=$.split(`
|
|
6
|
+
`);if(U)W.pop();let J=iG(W,Q,X.sectionComment);if(!J)return KQ(VQ(W),Z,[]);return KQ(VQ(W.slice(0,J.start)),Z,nG(W.slice(J.end)))}function k2($,Q=`version: 1
|
|
7
|
+
`){return EQ($)?hG($,"utf8"):Q}function J0($,Q){TQ($,Q,"utf8")}function g1($,Q,Z,X={}){let U=k2($,X.fallbackContent);J0($,rG(U,Q,Z,X))}function E6($){let Q=gG($);for(;;){for(let X of v0)if(b2(W0(Q,X)))return Q;let Z=MQ(Q);if(Z===Q)return;Q=Z}}function T6($={}){let Q=$.cwd??process.cwd(),Z=$.home??xG(),X=E6(Q),U=X?W0(X,jQ):W0(Z,oG);return W0(U,aG)}function sG(){return{version:SQ,activated:{}}}function tG($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.activated==="object"&&Q.activated!==null}function j6($={}){let Q=T6($);return eG(Q)??sG()}function eG($){if(!b2($))return;try{let Q=JSON.parse(AQ($,"utf8"));if(!tG(Q))return;return{version:SQ,activated:{...Q.activated}}}catch{return}}function $_($,Q={}){let Z=Q.cwd??process.cwd(),X=E6(Z)??Z;return b2(W0(X,jQ,$))}function Q_($,Q={}){let Z=Q.cwd??process.cwd(),X=E6(Z);if(!X)return!1;let U=new RegExp(`^${X_($)}\\s*:`,"m");for(let W of v0){let J=W0(X,W);if(!b2(J))continue;try{if(U.test(AQ(J,"utf8")))return!0}catch{return!1}}return!1}function S6($,Q={}){if(j6(Q).activated[$])return!0;return Q_($,Q)||$_($,Q)}function x0($,Q={}){let Z=T6(Q),X=j6(Q);return X.activated[$]={at:new Date().toISOString()},Z_(Z,X),X}function Z_($,Q){let Z=`${$}.sumr-tmp-${Date.now()}`;PG(MQ($),{recursive:!0});try{vG(Z,`${JSON.stringify(Q,null,2)}
|
|
8
|
+
`,"utf8"),fG(Z,$)}finally{yG(Z,{force:!0})}}function X_($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function U_($,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 U=$[X+1];if(!U||U.startsWith("--"))return;return U}function G_($){let Q={};for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(!X?.startsWith("--"))continue;if(W_.has(X)||J_.has(X))continue;let U=X.indexOf("=");if(U!==-1){let G=X.slice(2,U),_=X.slice(U+1);Q[G]=_;continue}let W=$[Z+1],J=X.slice(2);if(W&&!W.startsWith("--"))Q[J]=W,Z+=1;else Q[J]=!0}return Q}function P2($){let[Q,...Z]=$,X=[];for(let U=0;U<Z.length;U+=1){let W=Z[U];if(!W)continue;if(W.startsWith("--")){if(W==="--profile")U+=1;continue}X.push(W)}return{command:Q,positionals:X,flags:{help:Z.includes("--help")||Z.includes("-h")||Q==="--help",profile:U_(Z,"--profile")},extras:G_(Z)}}function Y_($=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 C($,Q,Z=process.stdout){if(!Y_(Z))return $;return`${(Array.isArray(Q)?Q:[Q]).map((W)=>qQ[W]).join("")}${$}${qQ.reset}`}function U$($,Q=process.stdout){let Z=__[$];return{symbol:C(Z.symbol,Z.tone,Q)}}function w$($="mauve",Q=process.stdout){return{format:(Z)=>C(Z,$,Q)}}function V1($="purple",Q=process.stdout){return{styleFrame:(Z)=>C(Z,$,Q)}}function y0($){return $.trim().split(/\s+/).map((Z,X)=>{if(X===0&&Z==="sumr")return C(Z,z_);if((X===1||X===2)&&!Z.startsWith("-")&&!Z.startsWith("[")&&!Z.startsWith("<"))return C(Z,CQ);return Z}).join(" ")}function FQ($){let Q=[`${C($.name,[CQ,"bold"])} ${C("\xB7","dim")} ${C($.description,"dim")}`,"","Usage:"];for(let Z of $.usage)Q.push(` ${y0(Z)}`);if($.options&&$.options.length>0){Q.push("","Options:");for(let Z of $.options)Q.push(` ${C(Z.flag.padEnd(18),H_)} ${C(Z.description,"dim")}`)}if($.examples&&$.examples.length>0){Q.push("","Examples:");for(let Z of $.examples)Q.push(` ${y0(Z)}`)}return Q.push(""),Q.join(`
|
|
9
|
+
`)}function K_($){let Q=$?.filter((Z)=>Z.value!==void 0&&Z.value!==null&&String(Z.value).length>0).map((Z)=>`${C(`${Z.label}:`,["orchid","bold"])} ${String(Z.value)}`);return Q&&Q.length>0?Q.join(`
|
|
10
|
+
`):void 0}function q_($){let Q=K_($.fields);if($.details&&Q)return`${Q}
|
|
11
|
+
${$.details}`;return $.details??Q}function h0($,Q){let Z=q_($);if(!Z)return;C6(Z,$.title??Q,w$("dim"))}function i($){V_($)}function O1($="Done"){O_($)}function o$($,Q={}){g0.info($,U$("info")),h0(Q,"Details")}function L_($,Q={}){g0.step($,U$("step")),h0(Q,"Details")}function P($,Q={}){g0.success($,U$("success")),h0(Q,"Details")}function G0($,Q={}){g0.warn($,U$("warn")),h0(Q,"Details")}function K$($,Q={}){g0.error($,{...U$("error",process.stderr),output:process.stderr}),h0(Q,"Details")}function h$($,Q="Details",Z="dim"){C6($,Q,w$(Z))}function u$($,Q="Items"){if($.length===0){o$("No items found.");return}C6($.join(`
|
|
12
|
+
`),Q,w$("dim"))}function E($){return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,help:$.help,run:async(Q)=>{if(Q.args.flags.help)return i(`sumr ${$.help.name.split(/\s+/)[0]}`),console.log(FQ($.help)),0;return $.execute(Q)}}}function M_($,Q){let Z=$.filter((U)=>Q==="private"||U.visibility==="public"),X=new Map;for(let U of Z){let W=X.get(U.group)??[];W.push(U),X.set(U.group,W)}return[...X.entries()].sort((U,W)=>M6[U[0]].order-M6[W[0]].order).map(([U,W])=>[U,W.sort((J,G)=>J.name.localeCompare(G.name))])}function h1($,Q){let Z=["","Options:","",` ${C("--help".padEnd(22),"orchid")} ${C("Show help","dim")}`,""];Z.push("Commands:"),Z.push("");for(let[X,U]of M_($,Q)){let W=M6[X];Z.push(`${C(`${W.label}:`,A_)}`);for(let J of U)Z.push(` ${C(J.name.padEnd(18),B_)} ${C(J.description,"dim")}`);Z.push("")}return Z.push(` ${C("<command> --help Show command help.","dim")}`),Z.push(""),Z.join(`
|
|
13
|
+
`)}function IQ($){let Q=[`${C($.name,["pink","bold"])} ${C("\xB7","dim")} ${C($.description,"dim")}`,"","Usage:",` ${y0(`sumr ${$.name} <command>`)}`,"","Options:",` ${C("--help, -h".padEnd(22),"orchid")} ${C("Show help","dim")}`,"","Commands:",""];for(let Z of $.commands)Q.push(` ${C(Z.name.padEnd(18),"pink")} ${C(Z.description,"dim")}`);return Q.push(""),Q.push(` ${y0(`sumr ${$.name} <command> --help`)} ${C("Show command help.","dim")}`),Q.push(""),Q.join(`
|
|
14
|
+
`)}function E_($){return{...$,argv:$.argv.slice(1),args:{...$.args,positionals:$.args.positionals.slice(1)}}}function K1($){return $}function DQ($){let Q=new Map($.commands.map((X)=>[X.name,X]));function Z(){return IQ({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 i(`sumr ${$.name}`),console.log(Z()),0;let W=Q.get(U);if(!W)return i(`sumr ${$.name}`),K$(`Unknown ${$.unknownSubcommandLabel??$.name} command: ${U}`),console.log(Z()),1;return W.run(E_(X))}}}function f2($){return DQ({name:$.name,description:$.description,group:$.group,visibility:$.visibility,commands:$.commands})}function S_($,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 LQ($,Q,Z){i(`sumr ${$.name}`),console.log(h1(Q,Z))}async function C_($){let Q=$.visibility??$.module.visibility,Z=[f2($.module)],X=S_($.argv,$.module),U=P2(X),W=new Map(Z.map((G)=>[G.name,G]));if(!U.command||U.command==="--help"||U.command==="-h")return LQ($.module,Z,Q),0;if(U.command==="--version"||U.command==="-v"){if($.version)console.log($.version);else LQ($.module,Z,Q);return 0}let J=W.get(U.command);if(!J)return i(`sumr ${$.module.name}`),K$(`Unknown command: ${U.command}`),console.log(h1(Z,Q)),1;try{return await J.run({argv:X,args:U,visibility:Q})}catch(G){let _=G instanceof Error?G.message:"Unexpected error.";return i(`sumr ${$.module.name}`),K$(_),1}}function u0(){return Boolean(process.stdin.isTTY&&process.stdout.isTTY)}async function a$($){let Q=await I_({message:$.message,options:$.options,initialValue:$.initialValue});if(NQ(Q)){F6();return}return Q}async function _0($){let Q=await D_($);if(NQ(Q)){F6();return}return Q}function F6($="Cancelled."){F_($)}function bQ($){return wQ.extend(Object.fromEntries(Object.entries($).map(([Q,Z])=>[Q,Z.optional()]))).passthrough()}function R_($,Q){let X=bQ(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 N_($){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 x1="",H1="sumr.yaml",v0,oG=".sumr",jQ=".sumr-cache",aG="activations.json",SQ=1,W_,J_,qQ,__,z_="purple",CQ="pink",H_="orchid",B_="pink",A_="orchid",M6,T_="1.0.0",RQ,j_,wQ;var D=w2(()=>{v0=["sumr.yaml","sumr.yml"];W_=new Set(["--profile"]),J_=new Set(["--help","-h","--version","-v"]);qQ={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"},__={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"}};M6={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}};RQ=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(T_),0}}),j_=K1({name:"core",description:"Shared SUMR CLI command contracts and UX helpers",group:"internal",visibility:"private",commands:[RQ]});wQ=BQ.object({version:BQ.number().int().positive()}).passthrough()});var UU={};N2(UU,{kontractModule:()=>dq});import{cpus as W4}from"os";import{Buffer as D4}from"buffer";import{randomUUID as R4}from"crypto";import{access as N4,mkdir as w4,readdir as b4,rename as k4,stat as P4}from"fs/promises";import{join as $$}from"path";import{mkdtemp as d4,rm as m4}from"fs/promises";import{tmpdir as l4}from"os";import{join as i6}from"path";import{dirname as o4,isAbsolute as a4,join as z9,relative as H9,resolve as W8}from"path";import{mkdir as $3,readdir as Q3,stat as Z3}from"fs/promises";import{dirname as O9,join as IZ,relative as X3,resolve as T1}from"path";import{access as O3,readFile as K3}from"fs/promises";import{dirname as j1,join as lZ,relative as pZ,resolve as G8}from"path";import{log as z0}from"@clack/prompts";import{join as d3}from"path";import{bundle as m3,loadConfig as l3}from"@redocly/openapi-core";import{stringify as p3}from"yaml";import{basename as Jz,join as Gz,relative as sZ}from"path";import{camelCase as Mz,constantCase as Ez,kebabCase as A8,pascalCase as Z1}from"change-case";import{jsonSchemaToZod as uz}from"json-schema-to-zod";import{join as p6}from"path";import rz from"@asyncapi/parser/browser";import{log as oz}from"@clack/prompts";import{pascalCase as zX}from"change-case";import{pascalCase as OX}from"change-case";import{pascalCase as u5}from"change-case";import{pascalCase as Y8}from"change-case";import{pascalCase as SX}from"change-case";import{camelCase as yV}from"change-case";import{access as yX,readdir as N9,rm as Z2}from"fs/promises";import{basename as pV,join as Q$}from"path";import cV from"@apidevtools/swagger-parser";import{log as X2}from"@clack/prompts";import{camelCase as R8,constantCase as GO,pascalCase as b9,snakeCase as k9}from"change-case";import{pascalCase as y9}from"change-case";import{pascalCase as u9}from"change-case";import{camelCase as wO,pascalCase as L1}from"change-case";import{basename as dO,join as cX}from"path";import mO from"@apidevtools/swagger-parser";import{log as nX}from"@clack/prompts";import{mkdir as Q9,rm as oX}from"fs/promises";import{join as e$,resolve as r5}from"path";import{mkdir as TK,rm as sX,stat as jK}from"fs/promises";import{join as Z9,resolve as SK}from"path";import{basename as nK,resolve as iK}from"path";import rK from"@apidevtools/swagger-parser";import{log as s2}from"@clack/prompts";import{existsSync as s5,mkdirSync as _q,readFileSync as Yq,writeFileSync as zq,writeSync as Hq}from"fs";import{dirname as Vq,join as t5}from"path";import{existsSync as qq,readFileSync as Lq}from"fs";import{join as Bq}from"path";import{parse as Aq}from"yaml";function U4($,Q){this[$]=X4.bind(null,Q)}async function S4($,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 n6($,Q,Z){let X=Number.isFinite(Z)&&Z>0?Math.floor(Z):1,U={successCount:0,failedCount:0,errors:[]},W=[];for(let J of $){let G={done:!1,promise:Promise.resolve()};if(G.promise=S4(J,Q,G,U),W.push(G),W.length>=X)await Promise.race(W.map((_)=>_.promise)),W=W.filter((_)=>!_.done)}return await Promise.all(W.map((J)=>J.promise)),{success:U.successCount,failed:U.failedCount,errors:U.errors}}function C4($){let Q=e2;return e2=$,()=>{e2=Q}}function J9(){return e2}function k($,Q=1){let Z=J9();if(!Z)return;Z.counters.set($,(Z.counters.get($)??0)+Q)}async function Y$($,Q){let Z=performance.now();try{return await Q()}finally{F4($,performance.now()-Z)}}function F4($,Q){let Z=J9();if(!Z)return;Z.phaseDurationsMs.set($,(Z.phaseDurationsMs.get($)??0)+Q),Z.phaseCounts.set($,(Z.phaseCounts.get($)??0)+1)}function I4($){let Q=J9();if(!Q)return;Q.subprocesses.push($)}function w5($){if(typeof $==="bigint")return Number($);return $}function G9($){I4({name:$.name,command:$.command.join(" "),durationMs:$.durationMs,exitCode:$.exitCode,maxRSS:$.resourceUsage?.maxRSS,cpuUserUs:w5($.resourceUsage?.cpuTime?.user),cpuSystemUs:w5($.resourceUsage?.cpuTime?.system)})}function f4($,Q){if(!$.endsWith(".ts"))return Q;if(Q.includes(qZ))return Q;return`${LZ}${Q}`}async function y4($,Q){let Z=$$($,"..");await w4(Z,{recursive:!0});let X=$$(Z,`.${R4()}.tmp`);await Bun.write(X,Q),await k4(X,$)}async function J$($,Q){let Z=f4($,Q);try{let X=await P4($),U=D4.byteLength(Z,"utf8");if(X.mtimeMs>0&&X.size===U){let J=await Bun.file($).text();if(Bun.hash(J)===Bun.hash(Z))return k("write.skipped"),!1}}catch{}return await y4($,Z),k("write.changed"),!0}async function L0($,Q){let Z=Q.length>0?Q.map((X)=>`export * from '${X}';`).join(`
|
|
15
|
+
`):"export {};";return J$($$($,"index.ts"),`${Z}
|
|
16
|
+
`)}async function $1($){try{return await N4($),!0}catch{return!1}}async function v4($){let Q=[],Z=$$($,"http","index.ts"),X=$$($,"nats","index.ts");if(await $1(Z))Q.push("export * as HttpSchemas from './http';");if(await $1(X))Q.push("export * as NatsSchemas from './nats';");if(Q.length===0)return!1;return J$($$($,"index.ts"),`${Q.join(`
|
|
17
17
|
`)}
|
|
18
|
-
`)}async function
|
|
18
|
+
`)}async function x4($){let Q=$$($,KZ),Z=$$(Q,"runtime.ts"),X=$$(Q,"http","index.ts"),U=$$(Q,"nats","index.ts"),W=[];if(await $1(X))W.push("export * as HttpSchemas from './http';");if(await $1(U))W.push("export * as NatsSchemas from './nats';");if(await $1(Z))W.push("export * from './runtime';");if(W.length===0)return!1;return J$($$(Q,"index.ts"),`${W.join(`
|
|
19
19
|
`)}
|
|
20
|
-
`)}function
|
|
20
|
+
`)}function g4($,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 h4($){return EZ($)}async function u4($){return await $1($$($,"http","index.ts"))||await $1($$($,"nats","index.ts"))}async function EZ($){if(!await $1($))return!1;if(await u4($))return!1;let Z=(await b4($,{withFileTypes:!0})).filter((J)=>J.isDirectory()&&!J.name.startsWith(".")).map((J)=>J.name).sort((J,G)=>J.localeCompare(G)),X=new Set,U=[],W=!1;for(let J of Z){let G=$$($,J);W=await EZ(G)||W;let _=$$(G,"index.ts");if(!await $1(_))continue;let Y=g4(J,X);U.push(`export * as ${Y} from './${J}';`)}if(U.length===0)return W;return await J$($$($,"index.ts"),`${U.join(`
|
|
21
21
|
`)}
|
|
22
|
-
`)||
|
|
23
|
-
`)}async function
|
|
24
|
-
`).trim();return
|
|
25
|
-
`),{configPath:
|
|
26
|
-
`)}}finally{await
|
|
27
|
-
`),
|
|
28
|
-
`)}}function
|
|
29
|
-
Use zod >=3.25.76 or >=4.0.0, or disable generator.zod for this target.`}}function
|
|
30
|
-
`).map((
|
|
31
|
-
`):void 0}}function
|
|
32
|
-
`).trim()}async function
|
|
33
|
-
${
|
|
34
|
-
`).trim();return{success:!1,error:Error(`Bundle failed (exit ${$}): ${
|
|
35
|
-
`).map((
|
|
22
|
+
`)||W}function TZ(){return Bun.which(F5)??i6(process.cwd(),"node_modules",".bin",F5)}function _9($,Q){return $.length>0?$:`biome format failed with code ${Q}`}function p4($){return $.includes("No files were processed")&&$.includes("provided but ignored")}function c4($,Q,Z){return[`Could not format generated TypeScript for ${Z}.`,_9($,Q)].join(`
|
|
23
|
+
`)}async function Y9($,Q="file.ts"){let Z=[TZ(),"format","--stdin-file-path","file.ts"],X=performance.now(),U=Bun.spawn(Z,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",env:{...process.env}}),W=await U.exited,J=U.resourceUsage(),G=(await new Response(U.stderr).text()).trim();if(G9({name:"biome.formatFile",command:Z,durationMs:performance.now()-X,exitCode:W,resourceUsage:J}),k("format.fileSubprocesses"),W!==0)throw Error(c4(G,W,Q));let _=await new Response(U.stdout).text();if(_.length===0)throw Error("biome format returned empty stdout");return _}async function jZ($,Q,Z){let X=[TZ(),"format","--write",...Q,$],U=performance.now(),W=Bun.spawn(X,{cwd:process.cwd(),stdout:"pipe",stderr:"pipe",env:{...process.env}}),J=await W.exited,G=W.resourceUsage(),_=(await new Response(W.stdout).text()).trim(),Y=(await new Response(W.stderr).text()).trim(),z=[_,Y].filter(Boolean).join(`
|
|
24
|
+
`).trim();return G9({name:Z,command:X,durationMs:performance.now()-U,exitCode:J,resourceUsage:G}),k("format.directorySubprocesses"),{details:z,exitCode:J}}async function n4(){let $=await d4(i6(l4(),"kontract-biome-")),Q=i6($,"biome.json");return await Bun.write(Q,`${JSON.stringify(SZ,null,2)}
|
|
25
|
+
`),{configPath:Q,cleanup:()=>m4($,{recursive:!0,force:!0})}}async function i4($){let{configPath:Q,cleanup:Z}=await n4();try{k("format.directoryConfigFallbacks");let{details:X,exitCode:U}=await jZ($,["--config-path",Q],"biome.formatDirectoryIsolated");if(U!==0)return{success:!1,details:_9(X,U)};return{success:!0,details:["Consumer Biome config ignored the generated directory; formatted with Kontract isolated config.",X].filter((W)=>W.length>0).join(`
|
|
26
|
+
`)}}finally{await Z()}}async function r4($){let{details:Q,exitCode:Z}=await jZ($,["--vcs-enabled=false"],"biome.formatDirectory");if(Z!==0){if(p4(Q))return i4($);return{success:!1,details:_9(Q,Z)}}return{success:!0,details:Q.length>0?Q:void 0}}function CZ($){let Q=H9(process.cwd(),$);if(Q.length===0)return".";if(Q.startsWith(".."))return $;return Q.startsWith(".")?Q:`./${Q}`}function L8($,Q){let Z=H9($,Q);return Z.length===0||!Z.startsWith("..")&&!a4(Z)}function s4($){let Q=W8($[0]??process.cwd()),Z=$.map((X)=>W8(X));while(!Z.every((X)=>L8(Q,X))){let X=o4(Q);if(X===Q)return Q;Q=X}return Q}function t4($){let Q=process.env[J4]?.trim();if(Q)return W8(Q);let Z=W8(process.cwd()),X=$.flatMap((W)=>[W.inputDir,W.outputDir]),U=X.every((W)=>L8(Z,W))?Z:s4(X);return z9(U,XZ)}function O0($){let Q=$.replace(/[^A-Za-z0-9._-]/g,"_").replace(/^_+|_+$/g,"");return Q.length>0?Q:"unnamed"}function r6($){return`${O0($)}.${q4}`}function B8($,Q){return z9($,UZ,"bundles",O0(Q.sourceName),O0(Q.targetName))}function FZ($,Q){return z9($,UZ,"bundles",O0(Q),Y4)}function e4($,Q){let Z=H9($,Q).replace(/\\/g,"/").replace(/\.ts$/,"");return Z.startsWith(".")?Z:`./${Z}`}function K9($){return $ instanceof Error&&"code"in $&&$.code==="ENOENT"}function DZ($){let Q=new Bun.CryptoHasher("sha256");return Q.update($),`${H3}${Q.digest("hex")}`}function RZ($){return DZ($)}function J8($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return`[${$.map((X)=>J8(X)).join(",")}]`;return`{${Object.entries($).sort(([X],[U])=>X.localeCompare(U)).map(([X,U])=>`${JSON.stringify(X)}:${J8(U)}`).join(",")}}`}async function NZ($){try{let Q=await Z3($);return Q.isFile()?{size:Q.size}:null}catch(Q){if(!K9(Q))throw Q;return null}}async function q9($,Q){let Z=T1($),X=await NZ(Z);if(!X)throw Error(`Cannot hash missing file '${Z}'`);let U=await Bun.file(Z).bytes();return{path:X3(Q,Z).replace(/\\/g,"/"),hash:DZ(U),size:X.size}}function L9($){return RZ(J8($))}async function wZ($){let Q;try{Q=await Q3($,{withFileTypes:!0})}catch(X){if(K9(X))return[];throw X}let Z=[];for(let X of Q){if(X.name.startsWith("."))continue;let U=IZ($,X.name);if(X.isDirectory()){Z.push(...await wZ(U));continue}if(X.isFile()&&X.name.endsWith(".ts"))Z.push(U)}return Z.sort((X,U)=>X.localeCompare(U))}function U3($){let Q=$.map((W)=>T1(W)),[Z]=Q;if(!Z)return process.cwd();let X=Z.split(/[\\/]+/),U=X.length;for(let W of Q.slice(1)){let J=W.split(/[\\/]+/);U=Math.min(U,J.length);for(let G=0;G<U;G+=1){if(J[G]===X[G])continue;U=G;break}}return X.slice(0,Math.max(U,1)).join("/")||"/"}async function W3($){let Q=[];for(let Z of $)if(await NZ(Z))Q.push(T1(Z));return[...new Set(Q)].sort((Z,X)=>Z.localeCompare(X))}function J3($){let Q=[],Z=null;while(!0){if(Z=hZ.exec($),!Z)break;let X=Z[1];if(!X||X.startsWith("#"))continue;Q.push(X.split("#")[0]??X)}return Q}function G3($){return/\$ref\s*:\s*$/m.test($)||/\$ref\s*:\s*[|>]/.test($)}async function bZ($,Q,Z){let X=T1($);if(Q.has(X))return[];Q.add(X);let U=await Bun.file(X).text();if(G3(U))Z.unsafe=!0;let W=[X];for(let J of J3(U)){if(/^[a-z][a-z0-9+.-]*:/i.test(J)){Z.unsafe=!0;continue}W.push(...await bZ(T1(O9(X),J),Q,Z))}return W}async function kZ(){if(i0)return i0;try{let $=await Bun.file(uZ).json();i0=typeof $.version==="string"?$.version:D5}catch{i0=D5}return i0}async function PZ($){return Y$("manifest.sourceHash",async()=>{let Q={unsafe:!1},Z=[],X=new Set;for(let G of $)Z.push(...await bZ(G,X,Q));let U=await W3(Z),W=O9(T1($[0]??process.cwd())),J=await Promise.all(U.map((G)=>q9(G,W)));return{files:J.sort((G,_)=>G.path.localeCompare(_.path)),hash:L9(J),safe:!Q.unsafe}})}async function fZ($,Q=[]){return Y$("manifest.outputHash",async()=>{let Z=[$,...Q].map((Y)=>T1(Y)),[X]=Z,U=Z.length===1&&X?X:U3(Z),W=await Promise.all(Z.map((Y)=>wZ(Y))),J=[...new Set(W.flat())].sort((Y,z)=>Y.localeCompare(z)),_=(await Promise.all(J.map((Y)=>q9(Y,U)))).sort((Y,z)=>Y.path.localeCompare(z.path));return{files:_,hash:L9(_)}})}function yZ($){return RZ(J8({channel:$.channel,generator:$.generator,serviceName:$.serviceName,sourceName:$.sourceName,targetName:$.targetName}))}async function vZ(){if(o2)return o2;let $=[];for(let X of dZ){let U=new Bun.Glob(X);for await(let W of U.scan({cwd:process.cwd()}))$.push(T1(process.cwd(),W))}let Q=[...new Set($)].sort((X,U)=>X.localeCompare(U)),Z=await Promise.all(Q.map((X)=>q9(X,process.cwd())));return o2=L9(Z.sort((X,U)=>X.path.localeCompare(U.path))),o2}function xZ($,Q,Z){let X=Z.split("/").map((U)=>O0(U));return IZ($,G4,Q,...X,"manifest.json")}function _3($){if(typeof $!=="object"||$===null)return!1;let Q=$;return Q.version===WZ&&typeof Q.sourceDependencyHash==="string"&&typeof Q.outputTreeHash==="string"&&typeof Q.generatorConfigHash==="string"&&typeof Q.generatorImplementationHash==="string"}async function Y3($){try{return await Bun.file($).text()}catch(Q){if(K9(Q))return null;throw Q}}async function gZ($){if(k("manifest.checks"),!$.source.safe)return k("manifest.unsafeSource"),{skipped:!1,reason:"unsafe-source-dependencies",source:$.source};let Q=await Y3($.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(!_3(Z))return{skipped:!1,reason:"invalid-manifest-shape",source:$.source};let[X,U,W]=await Promise.all([kZ(),vZ(),fZ($.outputDir,$.additionalOutputDirs)]),J=yZ($);if(!(Z.packageVersion===X&&Z.bunVersion===Bun.version&&Z.sourceDependencyHash===$.source.hash&&Z.outputTreeHash===W.hash&&Z.generatorConfigHash===J&&Z.generatorImplementationHash===U))return{skipped:!1,reason:"manifest-hash-mismatch",source:$.source};return k("manifest.skips"),{skipped:!0,reason:"manifest-hit",source:$.source}}async function z3($){if(!$.source.safe)return;let[Q,Z,X]=await Promise.all([kZ(),vZ(),fZ($.outputDir,$.additionalOutputDirs)]),U={version:WZ,packageVersion:Q,bunVersion:Bun.version,sourceName:$.sourceName,targetName:$.targetName,serviceName:$.serviceName,channel:$.channel,generatorConfigHash:yZ($),generatorImplementationHash:Z,sourceDependencyHash:$.source.hash,outputTreeHash:X.hash,sourceFiles:$.source.files,outputFiles:X.files,generatedAt:new Date().toISOString()};await $3(O9($.manifestPath),{recursive:!0}),await Bun.write($.manifestPath,`${JSON.stringify(U,null,2)}
|
|
27
|
+
`),k("manifest.writes")}async function q3($){let Q=G8($);while(!0){let Z=lZ(Q,"package.json");try{return await O3(Z),Z}catch{}let X=j1(Q);if(X===Q)return null;Q=X}}async function L3($){let Q=[$.outputDir,$.inputDir,$.cwd];for(let Z of Q){let X=await q3(Z);if(X)return{target:await cZ(X),workspaceRoot:await C3(j1(X))}}return null}async function cZ($){let Q=await K3($,"utf8");return{path:$,shape:M3(JSON.parse(Q),$)}}function nZ($){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 _8($){if(!$||typeof $!=="object"||Array.isArray($))return!1;return!0}function B3($){if(!_8($))return!1;return Object.values($).every((Q)=>typeof Q==="string")}function m6($,Q,Z){let X=$[Q];if(X===void 0)return;if(B3(X))return X;throw Error(`${Z}.${Q} must be an object with string version ranges`)}function A3($,Q){let Z=$.workspaces;if(Z===void 0)return;if(Array.isArray(Z)&&Z.every((X)=>typeof X==="string"))return Z;if(_8(Z)&&Z.packages===void 0)return{};if(_8(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 M3($,Q){if(!_8($))throw Error(`${Q} must contain a JSON object`);return{name:typeof $.name==="string"?$.name:void 0,dependencies:m6($,"dependencies",Q),devDependencies:m6($,"devDependencies",Q),peerDependencies:m6($,"peerDependencies",Q),workspaces:A3($,Q)}}function p1($,Q){let Z=pZ(Q,$);if(!Z||Z.startsWith(".."))return $;return Z.startsWith(".")?Z:`./${Z}`}function E3($,Q){let Z=p1(j1($),Q);return Z==="./"?".":Z}function T3($,Q,Z){let X=[...Z].sort(),U=j1($),W=G8(Q);if(G8(U)===W)return`bun add ${X.join(" ")}`;return`cd ${E3($,Q)} && bun add ${X.join(" ")}`}function iZ($){if(Array.isArray($))return $;return $?.packages??[]}function j3($,Q){if($===Q)return!0;if($.endsWith("/*"))return j1(Q)===$.slice(0,-2);return!1}function S3($,Q){if(!$||$.path===Q)return!1;let Z=pZ(j1($.path),j1(Q));if(!Z||Z.startsWith(".."))return!1;return iZ($.shape.workspaces).some((X)=>j3(X,Z))}async function C3($){let Q=G8($);while(!0){let Z=lZ(Q,"package.json");try{let U=await cZ(Z);if(iZ(U.shape.workspaces).length>0)return U}catch{}let X=j1(Q);if(X===Q)return;Q=X}}function F3($){let Q=new Set;for(let Z of $){if(Z.type===R.TypeScriptNestJs)Q.add("nestjs-zod"),Q.add("zod");if(Z.type===R.AsyncApiNats)Q.add("rxjs"),Q.add("zod");if(Z.type===R.TypeScriptAxios)Q.add("axios");if(Z.type===R.TypeScriptAngular)Q.add("@angular/common"),Q.add("@angular/core"),Q.add("rxjs")}return Q}function I3($){return $.some((Q)=>Q.type===R.TypeScriptNestJs)}function D3($){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 R3($,Q,Z){if(!Z)return[];let X=nZ(Z.shape);return $.filter((U)=>!Q.dependencies.has(U)&&(X.dependencies.has(U)||X.devDependencies.has(U)||X.peerDependencies.has(U)))}function N3($,Q,Z,X){if(!Z||!S3(Z,$))return[];let U=[`Checked package: ${p1($,Q.cwd)}`,`Generated output: ${p1(Q.outputDir,Q.cwd)}`,`Workspace root: ${p1(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 w3($,Q){try{let Z=await L3($);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 b3($,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 k3($,Q,Z,X){if(X.length===0)return;let U=Q.target.path,W=R3(X,Z,Q.workspaceRoot),J=N3(U,$,Q.workspaceRoot,W);return{title:`Missing runtime deps for generated contracts in ${p1(U,$.cwd)}.`,details:[`Missing: ${[...X].sort().join(", ")}`,...J,`Install: ${T3(U,$.cwd,X)}`].join(`
|
|
28
|
+
`)}}function P3($,Q,Z){if(Z.length===0)return;return{title:`Generated contract deps should be in dependencies in ${p1(Q,$)}.`,details:`Move to dependencies: ${[...Z].sort().join(", ")}`}}function f3($,Q,Z){let X=Z.dependencyVersions.get("zod");if(!I3($.generators)||!Z.dependencies.has("zod")||typeof X!=="string"||D3(X))return;return{title:`Generated OpenAPI Zod schemas require a zod/v4-compatible zod version in ${p1(Q,$.cwd)}.`,details:`Detected zod: ${X}
|
|
29
|
+
Use zod >=3.25.76 or >=4.0.0, or disable generator.zod for this target.`}}function y3($,Q,Z){let X=Q.target.path,U=nZ(Q.target.shape),{missing:W,wrongScope:J}=b3(Z,U);return[k3($,Q,U,W),P3($.cwd,X,J),f3($,X,U)].filter((G)=>G!==void 0)}async function v3($){let Q=F3($.generators);if(Q.size===0)return[];let Z=await w3($,Q);if(!Z.ok)return Z.warnings;return y3($,Z.resolution,Q)}function g3($,Q){let Z=Q.split(`
|
|
30
|
+
`).map((W)=>W.trim()).filter((W)=>W.length>0),[X="Unexpected error",...U]=Z;return{title:`\u274C ${$}: ${X}`,details:U.length>0?U.join(`
|
|
31
|
+
`):void 0}}function h3($,Q){return{printStep:(J)=>{if($)return;if(Q){Q.log.step(J,U$("step"));return}z0.step(J)},printInfo:(J)=>{if($)return;if(Q){Q.log.info(J,U$("info"));return}z0.info(J)},printWarning:(J,G)=>{if($)return;if(Q){if(Q.log.warn(J,U$("warn")),G)Q.note(G,"Details",w$("dim"));return}if(z0.warn(J),G)z0.warn(G)},printFailure:(J)=>{if(!$&&Q){if(Q.log.error(J.title,{...U$("error"),symbol:"\u274C"}),J.details)Q.note(J.details,"Details",w$("dim"));return}if(z0.error(J.title),J.details)z0.error(J.details)}}}function c3($){return $.includes("Failed to link")&&$.includes("EEXIST")}function n3($){return new Promise((Q)=>{setTimeout(Q,$)})}async function i3($){let Q=o6,Z=()=>{};o6=new Promise((X)=>{Z=X}),await Q;try{return await $()}finally{Z()}}async function r3($,Q){let Z=performance.now(),X=Bun.spawn($,{stdout:"pipe",stderr:"pipe",env:{...process.env}}),U=await X.exited,W=X.resourceUsage(),J=await new Response(X.stdout).text(),G=await new Response(X.stderr).text();return G9({name:Q,command:$,durationMs:performance.now()-Z,exitCode:U,resourceUsage:W}),k("bundle.subprocesses"),{exitCode:U,stdout:J,stderr:G}}async function o3($,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 rZ(X,Q)}async function rZ($,Q){if(!(await Bun.file($).text()).includes(Q))return{success:!1,error:Error(`Bundle output missing '${Q}' marker`)};return{success:!0,outputPath:$}}function a3(){return k5??=l3(),k5}function s3(){return process.env[B4]!=="1"}function t3($){if($ instanceof Error)return $;return Error(String($))}function e3($){return $.map((Q)=>`${Q.severity}: ${Q.message}`).join(`
|
|
32
|
+
`).trim()}async function $z($,Q){try{let Z=await m3({ref:$,config:await a3()}),X=Z.problems.filter((W)=>W.severity==="error");if(X.length>0)return{success:!1,error:Error(`OpenAPI bundle failed:
|
|
33
|
+
${e3(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,p3(U)),k("bundle.inProcess"),Z.problems.length>X.length)k("bundle.warnings",Z.problems.length-X.length);return rZ(Q,VZ)}catch(Z){return{success:!1,error:t3(Z)}}}function Qz($,Q,Z){let X=[Q,Z].filter((U)=>U.trim().length>0).join(`
|
|
34
|
+
`).trim();return{success:!1,error:Error(`Bundle failed (exit ${$}): ${X}`)}}async function oZ($,Q,Z){let X=$[0]==="bunx";for(let U=0;U<=b5;U+=1){let W=()=>r3($,Z),{exitCode:J,stdout:G,stderr:_}=X?await i3(W):await W();if(J===0)return o3($,Q);if(!(X&&c3(_))||U>=b5)return Qz(J,G,_);await n3(Uz*(U+1))}return{success:!1,error:Error("Bundle failed unexpectedly")}}async function Zz($,Q){let Z=Bun.which("redocly");if(Z)return[Z,"bundle",$,"--output",Q];let X=d3(process.cwd(),"node_modules",".bin","redocly");if(await Bun.file(X).exists())return[X,"bundle",$,"--output",Q];return["bunx",L4,"bundle",$,"--output",Q]}async function aZ($,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(s3())return $z(Z,Q);return oZ(await Zz(Z,Q),VZ,"bundle.openapi")}async function Xz($,Q){return oZ(["bunx","@asyncapi/cli","bundle",...$,"--output",Q],E4,"bundle.asyncapi")}async function tZ($,Q){let Z=[],X=new Bun.Glob(Q);for await(let U of X.scan({cwd:$}))Z.push(Gz($,U));return Z.sort()}function _z($,Q){let X=sZ($,Q).split("/"),U=Jz(Q);if(!/\.openapi\.ya?ml$/.test(U))return null;if(X.length===1)return{name:U.replace(/\.openapi\.ya?ml$/,""),rootFile:Q};let W=X.map((z)=>z.replace(/\.openapi\.ya?ml$/,"")),J=W.at(-1),G=W.at(-2);if(!J)return null;let Y=(J===G?W.slice(0,-1):W).filter(Boolean).join("/");return Y.length>0?{name:Y,rootFile:Q}:null}function Yz($,Q){let Z=new Map;for(let X of Q){let U=_z($,X);if(!U)continue;let W=Z.get(U.name);if(W)throw Error(`Multiple OpenAPI roots found for service '${U.name}': ${W} and ${U.rootFile}`);Z.set(U.name,U.rootFile)}return[...Z.entries()].map(([X,U])=>({name:X,rootFile:U})).sort((X,U)=>X.name.localeCompare(U.name))}function zz($,Q){let Z=new Map;for(let X of Q){let W=sZ($,X).split("/"),J=W[0];if(!J)continue;let G=W.length===1?J.replace(/\.asyncapi\.ya?ml$/,""):J,_=Z.get(G)??[];Z.set(G,[..._,X])}return[...Z.entries()].map(([X,U])=>({name:X,files:U.sort()})).sort((X,U)=>X.name.localeCompare(U.name))}async function eZ($){return Yz($,await tZ($,O4))}async function $X($){return zz($,await tZ($,K4))}function z$($){let Q=Z1($);return Q.endsWith("Message")?Q:`${Q}Message`}function M8($){let Q=Z1($);return`${Q.endsWith("Message")?Q.slice(0,-7):Q}MessageInput`}function B0($){return Ez($)}function r1($){let Q=Z1($);return Q.endsWith("Dto")?Q:`${Q}Dto`}function UX($){let Q=Z1($);return Q.endsWith("Schema")?Q:`${Q}Schema`}function B9($){return`${A8($)}.dto.ts`}function S1($){return Z1($)}function E8($){return`${A8($)}.ts`}function WX($){return`${A8($)}.contract.ts`}function A9($){return`${A8($)}.enum.ts`}function s0($){return`${Z1($)}Values`}function T8($){return`${Z1($)}Map`}function JX($){return Z1(String($))}function Tz($){return Z1($)}function t0($){return Mz($)}function Sz($){return $.trim().replace(/\.+$/,"")}function Cz($){return $.trim().replace(/^\.+/,"")}function Fz($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function Iz($){let Q=$?.trim();if(!Q)throw Error("AsyncAPI channel address is required");return Q}function X1($,Q){if(!$)return"";if(!Q||Q.trim().length===0)return $;let Z=Sz(Q),X=Cz($);if(!Z)return X;if(!X)return Z;if(X===Z)return X;if(X.startsWith(`${Z}.`))return X;return`${Z}.${X}`}function M9($,Q,Z,X){let U=X1(Iz($),X),W=U.match(/\{(.*?)\}/g);if(!W)return U;return W.reduce((J,G)=>{let _=G.slice(1,-1),Y=Fz(Z?.properties)?Z.properties:{};if(!Object.hasOwn(Y,_))throw Error(`Param '${_}' not found in message schema for address '${U}'`);return J.replace(G,`\${${Q}.${_}}`)},U)}function Dz($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function E9($,Q){if(Dz($))return $;throw Error(`${Q} metadata must be a JSON object`)}function GX($,Q){if($===void 0||$===null)return;return E9($,Q)}function P5($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function m$($){return $.split(`
|
|
35
|
+
`).map((Q)=>Q.trim()).filter((Q)=>Q.length>0)}function Rz($){return $.replaceAll("*/","*\\/")}function j$($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${Rz(X)}`).join(`
|
|
36
36
|
`)," */"].join(`
|
|
37
|
-
`)}function
|
|
38
|
-
`).map((
|
|
39
|
-
`)}function
|
|
37
|
+
`)}function e0($,Q=2){if(!$)return"";let Z=" ".repeat(Q);return $.split(`
|
|
38
|
+
`).map((X)=>`${Z}${X}`).join(`
|
|
39
|
+
`)}function _X($){return $.replace(/\{[^}]+\}/g,"*")}function F1($){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 W=$.reply(),J=W?.messages()??W?.channel()?.messages(),G=J&&J.length>0?J[0]:null,_=$.id();if(!_)throw Error("Operation has no id");let Y=X.address();if(!Y||Y.trim().length===0)throw Error(`Operation '${_}' channel address is required`);let z=U.id();if(!z)throw Error(`Message in operation '${_}' has no id`);let H=E9($.json(),`Operation '${_}'`),V=P5(H,"summary")??null,O=P5(H,"description")??null;return{operationId:_,address:Y,msgId:z,payloadSchema:GX(U.payload()?.json(),`Message '${z}' payload`),replyMsgId:G?.id()??null,summary:V,description:O}}function Nz($,Q){let Z=new Map;for(let X of $.operations().all()){let{address:U,msgId:W,replyMsgId:J}=F1(X),G=X1(U,Q),_=z$(W),Y=X.isSend()?"void":J?z$(J):"CommandReturnType",z=Z.get(G);if(!z){Z.set(G,{address:G,requestType:_,responseType:Y});continue}let H=z.requestType===_?z.requestType:`${z.requestType} | ${_}`,V=z.responseType===Y?z.responseType:`${z.responseType} | ${Y}`;Z.set(G,{address:G,requestType:H,responseType:V})}return Z}function wz($){return $.replaceAll("'","\\'")}function f5($){if(typeof $!=="string")return null;let Q=$.trim().toLowerCase();if(Q==="command"||Q==="cmd")return H$.Command;if(Q==="query"||Q==="qry")return H$.Query;if(Q==="event"||Q==="evt")return H$.Event;return null}function bz($){let Q=$.trim().toLowerCase();if(Q.includes(".cmd.")||Q.includes(".command."))return H$.Command;if(Q.includes(".qry.")||Q.includes(".query."))return H$.Query;if(Q.includes(".evt.")||Q.includes(".event."))return H$.Event;return null}function j8($,Q){let{operationId:Z,address:X}=F1($),U=X1(X,Q),W=E9($.json(),`Operation '${Z}'`),G=$.channels().all()[0],_=GX(G?.json(),`Operation '${Z}' channel`),Y=f5(W["x-sumr-intent"])??f5(_?.["x-sumr-intent"]);if(Y)return Y;let z=bz(U);if(z)return z;if($.isSend())return H$.Event;if($.isReceive()&&$.reply())return H$.Query;if($.isReceive())return H$.Command;throw Error(`Cannot infer operation intent for '${Z}'. Add x-sumr-intent or use an address segment like '.cmd.' or '.qry.'.`)}function kz($,Q){let X=$.operations().all().map((W)=>{let{operationId:J,address:G}=F1(W),_=X1(G,Q);return{operationId:J,key:B0(J),address:_}}).map((W)=>[` /** ${W.operationId} */`,` ${W.key}: '${W.address}',`].join(`
|
|
40
40
|
`)).join(`
|
|
41
|
-
`);return`${
|
|
41
|
+
`);return`${j$(["NATS subjects for server handlers and client publish/send calls.","Named placeholders (for example {organizationId}) are preserved for client interpolation."])}
|
|
42
42
|
export const SUBJECTS = {
|
|
43
|
-
${
|
|
44
|
-
} as const;`}function
|
|
43
|
+
${X}
|
|
44
|
+
} as const;`}function Pz($,Q){let Z=Nz($,Q);if(Z.size===0)return"";let X=[...Z.values()].map((W)=>[` '${wz(W.address)}': {`,` request: ${W.requestType};`,` response: ${W.responseType};`," };"].join(`
|
|
45
45
|
`)).join(`
|
|
46
|
-
`);return`${
|
|
46
|
+
`);return`${j$(["Route contracts used to strongly type client proxy send/emit calls."])}
|
|
47
47
|
export interface ClientRouteContracts {
|
|
48
|
-
${
|
|
49
|
-
}`}function
|
|
48
|
+
${X}
|
|
49
|
+
}`}function fz($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&j8(W,Q)===H$.Command);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:J,address:G,msgId:_,replyMsgId:Y,summary:z,description:H}=F1(W),V=t0(J),O=X1(G,Q),K=_X(O),L=Y?z$(Y):"CommandReturnType",q=[];if(z)q.push(...m$(z));if(H)q.push(...m$(H));q.push(`@subscribeRoute ${K}`),q.push(`@publishAddress ${O}`),q.push(`@param msg ${z$(_)}`),q.push(`@returns Promise<${L}>`);let S=j$(q);return[e0(S),` ${V}(msg: ${z$(_)}, ctx: IMsgContext): Promise<${L}>;`].filter(Boolean).join(`
|
|
50
50
|
`)}).join(`
|
|
51
|
-
`);return`${
|
|
51
|
+
`);return`${j$(["Server contract for command handlers."])}
|
|
52
52
|
export interface ICommandServer {
|
|
53
|
-
${
|
|
54
|
-
}`}function
|
|
53
|
+
${X}
|
|
54
|
+
}`}function yz($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&j8(W,Q)===H$.Query);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:J,address:G,msgId:_,replyMsgId:Y,summary:z,description:H}=F1(W),V=t0(J),O=X1(G,Q),K=_X(O),L=Y?z$(Y):"unknown",q=[];if(z)q.push(...m$(z));if(H)q.push(...m$(H));q.push(`@subscribeRoute ${K}`),q.push(`@publishAddress ${O}`),q.push(`@param msg ${z$(_)}`),q.push(`@returns Promise<${L}>`);let S=j$(q);return[e0(S),` ${V}(msg: ${z$(_)}, ctx: IMsgContext): Promise<${L}>;`].filter(Boolean).join(`
|
|
55
55
|
`)}).join(`
|
|
56
|
-
`);return`${
|
|
56
|
+
`);return`${j$(["Server contract for query handlers (receive operations with reply)."])}
|
|
57
57
|
export interface IQueryServer {
|
|
58
|
-
${
|
|
59
|
-
}`}function
|
|
58
|
+
${X}
|
|
59
|
+
}`}function vz($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&j8(W,Q)===H$.Command);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:J,address:G,msgId:_,payloadSchema:Y,replyMsgId:z,summary:H,description:V}=F1(W),O=M9(G,"msg",Y,Q),K=M8(_),L=z$(_),q=t0(J),S=B0(J),I=X1(G,Q),y=I.includes("{"),N=y?`\`${O}\``:`SUBJECTS.${S}`,w=z?z$(z):"CommandReturnType",l=y?`this.proxy.send<${w}, ${L}>(${N}, validated, ctx);`:`this.proxy.send(${N}, validated, ctx);`,v=[];if(H)v.push(...m$(H));if(V)v.push(...m$(V));v.push(`@publishAddress ${I}`),v.push(`@param msg ${K}`),v.push(`@returns Observable<${w}>`);let M$=j$(v);return[e0(M$),` ${q}(msg: ${K}, ctx?: IMsgContext): Observable<${w}> {`,` const validated = ${L}.parse(msg);`,` return ${l}`," }"].filter(Boolean).join(`
|
|
60
60
|
`)}).join(`
|
|
61
61
|
|
|
62
|
-
`);return`${
|
|
62
|
+
`);return`${j$(["Client helper for command request/reply interactions."])}
|
|
63
63
|
export class CommandClient {
|
|
64
64
|
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
65
65
|
|
|
@@ -67,11 +67,11 @@ export class CommandClient {
|
|
|
67
67
|
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
${
|
|
71
|
-
}`}function
|
|
70
|
+
${X}
|
|
71
|
+
}`}function xz($,Q){let Z=$.operations().all().filter((W)=>W.isReceive()&&j8(W,Q)===H$.Query);if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:J,address:G,msgId:_,payloadSchema:Y,replyMsgId:z,summary:H,description:V}=F1(W),O=M9(G,"msg",Y,Q),K=M8(_),L=z$(_),q=t0(J),S=z?z$(z):"unknown",I=B0(J),y=X1(G,Q),N=y.includes("{"),w=N?`\`${O}\``:`SUBJECTS.${I}`,l=N?`this.proxy.send<${S}, ${L}>(${w}, validated, ctx);`:`this.proxy.send(${w}, validated, ctx);`,v=[];if(H)v.push(...m$(H));if(V)v.push(...m$(V));v.push(`@publishAddress ${y}`),v.push(`@param msg ${K}`),v.push(`@returns Observable<${S}>`);let M$=j$(v);return[e0(M$),` ${q}(msg: ${K}, ctx?: IMsgContext): Observable<${S}> {`,` const validated = ${L}.parse(msg);`,` return ${l}`," }"].filter(Boolean).join(`
|
|
72
72
|
`)}).join(`
|
|
73
73
|
|
|
74
|
-
`);return`${
|
|
74
|
+
`);return`${j$(["Client helper for query request/reply interactions."])}
|
|
75
75
|
export class QueryClient {
|
|
76
76
|
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
77
77
|
|
|
@@ -79,11 +79,11 @@ export class QueryClient {
|
|
|
79
79
|
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
${
|
|
83
|
-
}`}function
|
|
82
|
+
${X}
|
|
83
|
+
}`}function gz($,Q){let Z=$.operations().all().filter((W)=>W.isSend());if(Z.length===0)return"";let X=Z.map((W)=>{let{operationId:J,address:G,msgId:_,payloadSchema:Y,summary:z,description:H}=F1(W),V=M9(G,"msg",Y,Q),O=M8(_),K=z$(_),L=t0(J),q=B0(J),S=X1(G,Q),I=S.includes("{"),y=I?`\`${V}\``:`SUBJECTS.${q}`,N=I?`this.proxy.emit<void, ${K}>(${y}, validated, ctx);`:`this.proxy.emit(${y}, validated, ctx);`,w=[];if(z)w.push(...m$(z));if(H)w.push(...m$(H));w.push(`@publishAddress ${S}`),w.push(`@param msg ${O}`),w.push("@returns Observable<void>");let l=j$(w);return[e0(l),` ${L}(msg: ${O}, ctx?: IMsgContext): Observable<void> {`,` const validated = ${K}.parse(msg);`,` return ${N}`," }"].filter(Boolean).join(`
|
|
84
84
|
`)}).join(`
|
|
85
85
|
|
|
86
|
-
`);return`${
|
|
86
|
+
`);return`${j$(["Client helper for fire-and-forget event publishing."])}
|
|
87
87
|
export class EventClient {
|
|
88
88
|
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
89
89
|
|
|
@@ -91,101 +91,101 @@ export class EventClient {
|
|
|
91
91
|
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
${
|
|
95
|
-
}`}function
|
|
94
|
+
${X}
|
|
95
|
+
}`}function dz($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function y5($,Q){if(dz($))return $;throw Error(`${Q} metadata must be a JSON object`)}function mz($,Q){try{return uz(Q,{module:"none"})}catch(Z){let X=Z instanceof Error?Z.message:String(Z);throw Error(`Failed to convert AsyncAPI message '${$}' payload to Zod: ${X}`)}}function l6($,Q){let Z=$[Q];if(typeof Z!=="string")return;let X=Z.trim();return X.length>0?X:void 0}function lz($){return $.replaceAll("*/","*\\/")}function pz($){let Q=$.map((X)=>X.trim()).filter((X)=>X.length>0);if(Q.length===0)return"";return["/**",Q.map((X)=>` * ${lz(X)}`).join(`
|
|
96
96
|
`)," */"].join(`
|
|
97
|
-
`)}function
|
|
98
|
-
`)}function
|
|
99
|
-
|
|
100
|
-
`)}async function
|
|
101
|
-
`).map((
|
|
102
|
-
`)}function
|
|
103
|
-
`),
|
|
104
|
-
`)
|
|
105
|
-
${
|
|
97
|
+
`)}function cz($){let Q=$.id();if(!Q)throw Error("AsyncAPI message is missing an id");let Z=$.payload();if(!Z)throw Error(`AsyncAPI message '${Q}' is missing a payload schema`);let X=y5(Z.json(),`AsyncAPI message '${Q}' payload`),U=mz(Q,X),W=z$(Q),J=M8(Q),G=y5($.json(),`AsyncAPI message '${Q}'`),_=l6(G,"summary"),Y=l6(G,"description")??l6(X,"description");return[pz([..._?[_]:[],...Y?[Y]:[],`Runtime schema for ${W}.`]),`export const ${W} = ${U};`,`export type ${W} = z.infer<typeof ${W}>;`,`export type ${J} = z.input<typeof ${W}>;`].filter(Boolean).join(`
|
|
98
|
+
`)}function nz($){return $.map((Q)=>cz(Q)).filter(Boolean).join(`
|
|
99
|
+
|
|
100
|
+
`)}async function v5($,Q,Z){return Z?Y9($,Q):$}function q1($){return $.split(`
|
|
101
|
+
`).map((Q)=>Q?` ${Q}`:"").join(`
|
|
102
|
+
`)}function az($){return $.endsWith("Schema")?$:`${$}Schema`}function sz($){return $.message}async function tz($,Q,Z,X){let U=$.replace(/\.asyncapi\.ya?ml$/,"").split("/").pop()??$;try{let W=new rz,J=p6(Q,"nats"),G=p6(J,T4),_=X?.sharedTypesImportPath??"./shared",Y=X?.sharedTypesOutputFile??p6(J,j4),z=X?.formatFiles!==!1,H=await Bun.file($).text(),{document:V,diagnostics:O}=await W.parse(H);if(!V){let R2=O.map(sz).join(", ");throw Error(`AsyncAPI parse failed: ${R2}`)}let K=Tz(V.info().title()),L=az(K),q=`${B0(K)}_NATS_CLIENT`,S=V.components().messages().all(),y=["import { z } from 'zod';","import { Observable } from 'rxjs';",`import { CommandReturnType, IClientProxy, IMsgContext, IRawClientProxy, createRouteTypedClientProxy } from '${_}';`,"",`export const ${q} = '${q}';`,"",`export namespace ${L} {`,q1(nz(S)),"",q1(kz(V,X?.addressPrefix)),"",q1(Pz(V,X?.addressPrefix)),"",q1(fz(V,X?.addressPrefix)),"",q1(yz(V,X?.addressPrefix)),"",q1(vz(V,X?.addressPrefix)),"",q1(xz(V,X?.addressPrefix)),"",q1(gz(V,X?.addressPrefix)),"}"].join(`
|
|
103
|
+
`),N=await v5(y,G,z),w=await v5(XX,Y,z),l=await J$(G,N),v=await J$(Y,w),M$=l||v;if(Z&&M$)oz.step(` \u2713 ${G}`);return{success:!0,service:U,changed:M$}}catch(W){return{success:!1,service:U,error:W instanceof Error?W:Error(String(W))}}}function a6($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function $H($,Q){let Z=0;for(let X=Q-1;X>=0&&$[X]==="\\";X-=1)Z+=1;return Z%2===1}function QH($){let Q="";for(let Z=0;Z<$.length;Z+=1){let X=$[Z];if(X==="/"&&!$H($,Z))Q+="\\/";else if(X==="\r")Q+="\\r";else if(X===`
|
|
104
|
+
`)Q+="\\n";else if(X==="\u2028")Q+="\\u2028";else if(X==="\u2029")Q+="\\u2029";else Q+=X}return`/${Q}/`}function YX($,Q){return Q?`${$}.describe(${a6(Q)})`:$}function ZH($){let Q=$.map((Z)=>typeof Z==="string"?a6(Z):`z.literal(${Z})`);if($.every((Z)=>typeof Z==="string"))return`z.enum([${$.map((Z)=>a6(String(Z))).join(", ")}])`;return`z.union([${Q.join(", ")}])`}function XH($){if($.scalar==="boolean")return"z.boolean()";if($.scalar==="integer")return x5($,!0);if($.scalar==="number")return x5($,!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(${QH($.pattern)})`;return Q}function x5($,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 m1($,Q){if($.kind==="scalar")return XH($);if($.kind==="enum")return ZH($.values);if($.kind==="array")return`z.array(${m1($.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(), ${m1($.additionalProperties,Q)})`;if(W.length===0)return"z.record(z.string(), z.unknown())";let G=`z.object({
|
|
105
|
+
${W.map(([_,Y])=>{let z=YX(m1(Y,Q),Y.description);if(!$.required.includes(_))z+=".optional()";return` ${_}: ${z},`}).join(`
|
|
106
106
|
`)}
|
|
107
|
-
})`;return $.additionalProperties?`${G}.catchall(${
|
|
108
|
-
${$.properties.map((
|
|
107
|
+
})`;return $.additionalProperties?`${G}.catchall(${m1($.additionalProperties,Q)})`:G}let Z=UX($.refName),X=`./${WX($.refName).replace(/\.ts$/,"")}`,U=Q.get(X)??new Set;return U.add(Z),Q.set(X,U),Z}function UH($,Q){let Z=m1($.schema,Q);if($.nullable)Z+=".nullable()";if($.optional)Z+=".optional()";return Z=YX(Z,$.description??$.schema.description),` ${$.name}: ${Z},`}function WH($){let Q=new Map,Z=UX($.schemaName),X=r1($.schemaName),U=S1($.schemaName),W=$.properties.length>0?`z.object({
|
|
108
|
+
${$.properties.map((Y)=>UH(Y,Q)).join(`
|
|
109
109
|
`)}
|
|
110
|
-
})`:null,
|
|
111
|
-
`),"",`export const ${
|
|
112
|
-
`)}function
|
|
113
|
-
`)}function
|
|
114
|
-
`)}function
|
|
110
|
+
})`:null,J=$.schema?.kind==="object"?$.schema.additionalProperties:void 0,G=W?J?`${W}.catchall(${m1(J,Q)})`:W:m1($.schema??{kind:"object",properties:{},required:[]},Q),_=["import { createZodDto } from 'nestjs-zod';","import { z } from 'zod';"];for(let[Y,z]of[...Q.entries()].sort((H,V)=>H[0].localeCompare(V[0])))_.push(`import { ${[...z].sort().join(", ")} } from '${Y}';`);return[_.join(`
|
|
111
|
+
`),"",`export const ${Z} = ${G};`,"",`export class ${X} extends createZodDto(${Z}) {}`,`export type ${U} = z.infer<typeof ${Z}>;`,""].join(`
|
|
112
|
+
`)}function S8($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function E1($,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 GH($,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(${S8(Q.pattern)}))`)}function T9($,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 W=$.exclusiveMinimum,J=typeof $.minimum==="number"?$.minimum:void 0,G=W===!0&&(J??0)>=0,_=typeof W==="number"&&W>=0;if(G||_)Z.validatorImports.add("IsPositive"),Q.push(`@IsPositive(${X.each?"{ each: true }":""})`)}function _H($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString()");let X=typeof $.format==="string"?$.format:void 0;GH(X,$,Q,Z)}function YH($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsNumber"),Z.push("@IsNumber()"),T9(Q,Z,X)}function zH($,Q,Z,X){if($)X.transformerImports.add("Type"),Z.push("@Type(() => Number)");X.validatorImports.add("IsInt"),Z.push("@IsInt()"),T9(Q,Z,X)}function HH($,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 VH($,Q,Z,X){let U=E1($,X),W=$.source==="path"||$.source==="query";if(Q==="string")return _H(Z,U,X),U;if(Q==="number")return YH(W,Z,U,X),U;if(Q==="integer")return zH(W,Z,U,X),U;return HH(W,U,X),U}function OH($,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: ${S8(Q.pattern)}`);if($.nullable)U.push("nullable: true");let W=VH($,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,W,$.optional),{typeName:Q.scalar==="integer"?"number":Q.scalar,decorators:W}}function KH($,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 qH($,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(${S8($.pattern)}), { each: true })`)}function LH($,Q,Z){Z.validatorImports.add("IsString"),Q.push("@IsString({ each: true })"),KH($,Q,Z),qH($,Q,Z)}function BH($,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 AH($,Q,Z){if($.scalar==="string")LH($,Q,Z);else BH($,Q,Z);if($.scalar==="number"||$.scalar==="integer")T9({minimum:$.minimum,maximum:$.maximum,exclusiveMinimum:$.exclusiveMinimum,exclusiveMaximum:$.exclusiveMaximum},Q,Z,{each:!0})}function HX($,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 J=`${$}${zX(Q)}ValueDto`;return U.emitHelperDto(J,Z,X),J}return`${HX($,Q,Z.items,X,U)}[]`}function g5($,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 MH($,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 EH($,Q){if($.scalar==="boolean")return`typeof ${Q} === 'boolean'`;if($.scalar==="integer")return[`typeof ${Q} === 'number'`,`Number.isInteger(${Q})`,...g5($,Q)].join(" && ");if($.scalar==="number")return[`typeof ${Q} === 'number'`,...g5($,Q)].join(" && ");let Z=[`typeof ${Q} === 'string'`];if(Z.push(...MH($,Q)),$.minLength!==void 0)Z.push(`${Q}.length >= ${$.minLength}`);if($.maxLength!==void 0)Z.push(`${Q}.length <= ${$.maxLength}`);if($.pattern)Z.push(`new RegExp(${S8($.pattern)}).test(${Q})`);if($.format==="date"||$.format==="date-time")Z.push(`!Number.isNaN(Date.parse(${Q}))`);return Z.join(" && ")}function TH($,Q,Z,X,U,W){if(Object.keys(Z.properties).length===0)return null;let J=`${$}${zX(Q)}ValueDto`;return U.emitHelperDto(J,Z,X),X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${W}) && validateSync(plainToInstance(${J}, ${W})).length === 0`}function VX($,Q,Z,X,U,W="value"){if(Z.kind==="scalar")return EH(Z,W);if(Z.kind==="enum")return U.addEnumImport(X,Z.enumName),`(${s0(Z.enumName)} as readonly unknown[]).includes(${W})`;if(Z.kind==="ref"){let G=U.addDtoImport(X,Z.refName);return X.validatorImports.add("validateSync"),X.transformerImports.add("plainToInstance"),`isRecordValue(${W}) && validateSync(plainToInstance(${G}, ${W})).length === 0`}if(Z.kind==="unknown")return null;if(Z.kind==="object")return TH($,Q,Z,X,U,W);let J=VX($,Q,Z.items,X,U,"entry");return J?`Array.isArray(${W}) && ${W}.every((entry) => ${J})`:`Array.isArray(${W})`}function jH(){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(`
|
|
113
|
+
`)}function CH(){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 FH($){return $.map((Q)=>` ${Q}`)}function j9($,Q){let Z=`../enums/${A9(Q).replace(/\.ts$/,"")}`,X=$.enumImports.get(Z)??new Set;X.add(T8(Q)),X.add(s0(Q)),$.enumImports.set(Z,X);let U=$.enumTypeImports.get(Z)??new Set;U.add(Q),$.enumTypeImports.set(Z,U)}function S9($,Q){let Z=r1(Q);return $.dtoImports.set(Z,`./${B9(Q).replace(/\.ts$/,"")}`),Z}function Q1($,Q,Z,X,U=!1){let W=U?"ApiPropertyOptional":"ApiProperty";if(U)$.usesApiPropertyOptional=!0;if(Z.length===0){X.push(`@${W}()`);return}X.push(`@${W}({`);for(let J of Z)X.push(` ${J},`);X.push("})")}function IH($,Q,Z){j9(Z,Q.enumName);let X=E1($,Z),U=[`enum: ${s0(Q.enumName)}`,`enumName: '${Q.enumName}'`];if($.nullable)U.push("nullable: true");return Q1(Z,$,U,X,$.optional),Z.validatorImports.add("IsEnum"),X.push(`@IsEnum(${T8(Q.enumName)})`),{typeName:Q.enumName,decorators:X}}function DH($,Q,Z){let X=S9(Z,Q.refName),U=E1($,Z),W=[`type: () => ${X}`];if($.nullable)W.push("nullable: true");return Q1(Z,$,W,U,$.optional),Z.validatorImports.add("ValidateNested"),U.push("@ValidateNested()"),Z.transformerImports.add("Type"),U.push(`@Type(() => ${X})`),{typeName:X,decorators:U}}function RH($,Q,Z,X){if(Object.keys(Z.properties).length===0&&Z.additionalProperties){let G=HX($,Q.name,Z.additionalProperties,X,s6),_=E1(Q,X);X.validatorImports.add("IsObject"),_.push("@IsObject()");let Y=VX($,Q.name,Z.additionalProperties,X,s6);if(Y)X.validatorImports.add("registerDecorator"),X.usesRecordValueValidator=!0,_.push(`@ValidateRecordValues((value) => ${Y})`);let z=["type: Object","additionalProperties: true"];if(Q.nullable)z.push("nullable: true");return Q1(X,Q,z,_,Q.optional),{typeName:`Record<string, ${G}>`,decorators:_}}if(Object.keys(Z.properties).length===0){let G=E1(Q,X);X.validatorImports.add("IsObject"),G.push("@IsObject()");let _=["type: Object"];if(Q.nullable)_.push("nullable: true");return Q1(X,Q,_,G,Q.optional),{typeName:"Record<string, unknown>",decorators:G}}let U=`${$}${OX(Q.name)}Dto`;C9(U,Z,X);let W=E1(Q,X),J=[`type: () => ${U}`];if(Q.nullable)J.push("nullable: true");return Q1(X,Q,J,W,Q.optional),X.validatorImports.add("ValidateNested"),W.push("@ValidateNested()"),X.transformerImports.add("Type"),W.push(`@Type(() => ${U})`),{typeName:U,decorators:W}}function NH($,Q,Z,X){if(Z.kind==="scalar")return OH(Q,Z,X,Q1);if(Z.kind==="enum")return IH(Q,Z,X);if(Z.kind==="ref")return DH(Q,Z,X);if(Z.kind==="object")return RH($,Q,Z,X);if(Z.kind==="unknown"){let U=E1(Q,X),W=["type: Object"];if(Q.nullable)W.push("nullable: true");return Q1(X,Q,W,U,Q.optional),{typeName:"unknown",decorators:U}}return wH($,Q,Z,X)}function wH($,Q,Z,X){let U=E1(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 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 J="unknown";if(Z.items.kind==="enum")j9(X,Z.items.enumName),J=Z.items.enumName,X.validatorImports.add("IsEnum"),U.push(`@IsEnum(${T8(Z.items.enumName)}, { each: true })`),W.push(`enum: ${s0(Z.items.enumName)}`),W.push(`enumName: '${Z.items.enumName}'`);else if(Z.items.kind==="ref")J=S9(X,Z.items.refName),X.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),U.push(`@Type(() => ${J})`),W.push(`type: () => ${J}`);else if(Z.items.kind==="scalar")J=Z.items.scalar==="integer"?"number":Z.items.scalar,AH(Z.items,U,X),W.push(`type: '${J}'`);else if(Z.items.kind==="object"){if(Object.keys(Z.items.properties).length===0)return J="Record<string, unknown>",X.validatorImports.add("IsObject"),U.push("@IsObject({ each: true })"),W.push("type: Object"),Q1(X,Q,W,U,Q.optional),{typeName:`${J}[]`,decorators:U};let G=`${$}${OX(Q.name)}ItemDto`;C9(G,Z.items,X),J=G,X.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),X.transformerImports.add("Type"),U.push(`@Type(() => ${G})`),W.push(`type: () => ${G}`)}else throw Error(`Unsupported array item kind '${Z.items.kind}' for property '${Q.name}'`);return Q1(X,Q,W,U,Q.optional),{typeName:`${J}[]`,decorators:U}}function bH($,Q,Z){let{decorators:X,typeName:U}=NH($,Q,Q.schema,Z),W=`${Q.name}${Q.optional?"?":"!"}`,J=!Q.optional&&Q.nullable?" | null":"";return Z.transformerImports.add("Expose"),[...X,"@Expose()",`${W}: ${U}${J};`]}function KX($,Q,Z,X,U){let W=[];if(Q)W.push(`/** ${Q.replace(/\*\//g,"*\\/")} */`);W.push(`export class ${$} {`);let J=Object.entries(Z.properties);for(let[G,_]of J){let Y=U?.get(G),z={name:G,schema:_,optional:Y?.optional??!Z.required.includes(G),nullable:Y?.nullable??!1,description:Y?.description,source:Y?.source},H=bH($,z,X);W.push(...FH(H),"")}if(J.length===0)W.push(" // empty schema");if(W[W.length-1]==="")W.pop();return W.push("}"),W.join(`
|
|
114
|
+
`)}function C9($,Q,Z){if(Z.seenHelpers.has($))return;Z.seenHelpers.add($),Z.helperClassBlocks.push(KX($,Q.description,Q,Z))}function kH($){let Q=CH(),Z=new Map($.properties.map((V)=>[V.name,V])),X={kind:"object",properties:Object.fromEntries($.properties.map((V)=>[V.name,V.schema])),required:$.properties.filter((V)=>!V.optional).map((V)=>V.name),description:$.description},U=KX($.dtoName,$.description,X,Q,Z),W=[],J=["ApiProperty"];if(Q.usesApiPropertyOptional)J.push("ApiPropertyOptional");W.push(`import { ${J.join(", ")} } from '@nestjs/swagger';`);let G=[...Q.validatorImports].sort();if(G.length>0)W.push(`import { ${G.join(", ")} } from 'class-validator';`);let _=[...Q.transformerImports].sort();if(_.length>0)W.push(`import { ${_.join(", ")} } from 'class-transformer';`);for(let[V,O]of[...Q.enumImports.entries()].sort((K,L)=>K[0].localeCompare(L[0])))W.push(`import { ${[...O].sort().join(", ")} } from '${V}';`);for(let[V,O]of[...Q.enumTypeImports.entries()].sort((K,L)=>K[0].localeCompare(L[0])))W.push(`import type { ${[...O].sort().join(", ")} } from '${V}';`);let Y=$.dtoName,z=[...Q.dtoImports.entries()].filter(([V])=>V!==Y).sort(([V,O],[K,L])=>O.localeCompare(L)||V.localeCompare(K));for(let[V,O]of z)W.push(`import { ${V} } from '${O}';`);let H=[...Q.usesRecordValueValidator?[jH()]:[],...Q.helperClassBlocks,U].join(`
|
|
115
115
|
|
|
116
|
-
`);return`${
|
|
116
|
+
`);return`${W.join(`
|
|
117
117
|
`)}
|
|
118
118
|
|
|
119
|
-
${
|
|
120
|
-
`}function
|
|
121
|
-
`),
|
|
122
|
-
`)}function B($){return typeof $==="object"&&$!==null}function CO($){if(typeof $!=="string")throw Error("OpenAPI document missing valid openapi version");if($.startsWith("3.0."))return x0.V3_0;if($.startsWith("3.1."))return x0.V3_1;if($.startsWith("3.2."))return x0.V3_2;throw Error(`Unsupported OpenAPI version '${$}'. Supported families: 3.0.x, 3.1.x, 3.2.x`)}function b8($){let _=$.match(/^#\/components\/schemas\/(.+)$/);if(!_?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/schemas/<Name>'`);return _[1]}function zO($,_){let W=`#/components/${_}/`;if(!$.startsWith(W))return null;return $.slice(W.length).replace(/~1/g,"/").replace(/~0/g,"~")}function E5($,_){if(Array.isArray($.oneOf))throw Error(`Unsupported oneOf at ${_}`);if(Array.isArray($.anyOf))throw Error(`Unsupported anyOf at ${_}`);if("not"in $)throw Error(`Unsupported not at ${_}`);if("discriminator"in $)throw Error(`Unsupported discriminator at ${_}`)}function O2($){let _=$.nullable===!0,W=$.type;if(!Array.isArray(W))return{nullable:_,normalizedType:typeof W==="string"?W:void 0};let Q=W.filter((Z)=>typeof Z==="string");if(Q.length!==W.length)throw Error("Unsupported mixed type array in OpenAPI schema");let U=Q.filter((Z)=>Z!=="null");if(U.length!==1||Q.length!==2||!Q.includes("null"))throw Error(`Unsupported OpenAPI type array: [${Q.join(", ")}]`);return{nullable:!0,normalizedType:U[0]}}function LO($,_,W,Q){let U=b8(_);if(Q.has(U))throw Error(`Unsupported recursive schema cycle detected at ${W} -> ${U}`);let Z=$.schemas[U];if(!B(Z))throw Error(`Missing referenced schema '${U}' at ${W}`);return Z}function VO($,_,W,Q,U,Z,X,G){if(!B(_))throw Error(`Invalid property '${$}' at ${W}`);if(U[$])throw Error(`Duplicate property '${$}' while flattening ${Q}`);let O=`${c6(Q.split("/").pop()??"")}${c6($)}`;U[$]=G(_,Z,`${W}.properties.${$}`,O,X)}function EO($,_,W,Q,U,Z,X,G){let{normalizedType:O}=O2($),M=$.properties;if(O!=="object"&&!B(M))throw Error(`Unsupported allOf part at ${_}. Expected object-like schema`);if(B(M))for(let[T,Y]of Object.entries(M))VO(T,Y,_,W,Q,Z,X,G);let J=$.required;if(Array.isArray(J)){for(let T of J)if(typeof T==="string")U.add(T)}}function KO($,_,W,Q){for(let[U,Z]of Object.entries($.properties)){if(W[U])throw Error(`Duplicate property '${U}' while flattening ${_}`);W[U]=Z}for(let U of $.required)Q.add(U)}function BO($,_,W,Q,U,Z,X,G){let O=$,M=null;if(typeof $.$ref==="string"){let J=$.$ref;M=b8(J),O=LO(Z,J,_,X),X.add(M)}try{if(E5(O,_),Array.isArray(O.allOf)){let J=K5(O,Z,_,X,G);KO(J,W,Q,U);return}EO(O,_,W,Q,U,Z,X,G)}finally{if(M)X.delete(M)}}function K5($,_,W,Q,U){let Z=$.allOf;if(!Array.isArray(Z))throw Error(`Expected allOf array at ${W}`);let X={},G=new Set,O={};for(let[J,T]of Object.entries($))if(J!=="allOf"&&J!=="description"&&J!=="nullable")O[J]=T;let M=[...Z,O];for(let J=0;J<M.length;J++){let T=M[J];if(!B(T)||Object.keys(T).length===0)continue;let Y=`${W}.allOf[${J}]`;BO(T,Y,W,X,G,_,Q,U)}return{kind:K$.Object,properties:X,required:[...G],description:typeof $.description==="string"?$.description:void 0}}function B5($,_){let W=$.enum;if(!Array.isArray(W))return null;if(W.length===0)throw Error(`Enum at ${_} cannot be empty`);let Q=[];for(let U of W){if(typeof U!=="string"&&typeof U!=="number")throw Error(`Enum at ${_} must contain only string or number values`);Q.push(U)}return Q}function R5($,_,W,Q){let U=W.map((O)=>({key:O5(O),value:O})),Z=new Set;for(let O of U){if(Z.has(O.key))throw Error(`Enum '${_}' has duplicate normalized key '${O.key}' (path: ${Q})`);Z.add(O.key)}let X=$.enumGroups.get(_);if(!X){let O={name:_,schemaPath:Q,values:W,members:U};return $.enumGroups.set(_,O),O}if(!(X.values.length===W.length&&X.values.every((O,M)=>O===W[M])))throw Error(`Enum name collision for '${_}'. Paths: ${X.schemaPath} and ${Q}`);return X}function qO($){if($===void 0)return!1;return Object.values(L5).some((_)=>_===$)}function n6($){if($===!0||$===!1)return $;if(typeof $==="number")return $;return}function IO($,_,W){return{kind:K$.Scalar,scalar:_,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:n6($.exclusiveMinimum),exclusiveMaximum:n6($.exclusiveMaximum),pattern:typeof $.pattern==="string"?$.pattern:void 0,description:W}}function FO($,_,W,Q){let U=typeof $.$ref==="string"?$.$ref:"";if(!U)throw Error(`Missing $ref at ${W}`);let Z=b8(U),X=_.schemas[Z];if(!B(X))throw Error(`Missing referenced schema '${Z}' at ${W}`);let G=typeof $.description==="string"?$.description:void 0;if(Q.has(Z))return{kind:K$.Ref,ref:U,refName:Z,description:G};Q.add(Z);let O=J1(X,_,`#/components/schemas/${Z}`,i0(Z),Q);if(Q.delete(Z),O.kind!=="object"||Object.keys(O.properties).length===0)return O;return{kind:K$.Ref,ref:U,refName:Z,description:G}}function wO($,_,W,Q,U,Z){let X=$.properties,G={};if(B(X))for(let[Y,A]of Object.entries(X)){if(!B(A))throw Error(`Invalid property '${Y}' at ${W}`);let E=`${Q}${i0(Y)}`;G[Y]=J1(A,_,`${W}.properties.${Y}`,E,Z)}let O=$.required,M=Array.isArray(O)&&O.every((Y)=>typeof Y==="string")?O:[],J=$.additionalProperties,T;if(J===!0)T={kind:K$.Unknown};else if(B(J))T=J1(J,_,`${W}.additionalProperties`,`${Q}Value`,Z);else if(J!==void 0&&J!==!1)throw Error(`Unsupported additionalProperties at ${W}`);return{kind:K$.Object,properties:G,required:M,additionalProperties:T,description:U}}function fO($,_,W,Q,U){let Z=R5(_,W,Q,U);return{kind:K$.Enum,enumName:Z.name,values:Z.values,description:typeof $.description==="string"?$.description:void 0}}function DO($,_,W,Q,U,Z){let X=$.items;if(!B(X))throw Error(`Array schema at ${W} is missing items`);let G=`${Q}Item`;return{kind:K$.Array,items:J1(X,_,`${W}.items`,G,Z),minItems:typeof $.minItems==="number"?$.minItems:void 0,maxItems:typeof $.maxItems==="number"?$.maxItems:void 0,description:U}}function J1($,_,W,Q,U){if(E5($,W),typeof $.$ref==="string")return FO($,_,W,U);let Z=B5($,W);if(Z)return fO($,_,Q,Z,W);if(Array.isArray($.allOf))return K5($,_,W,U,J1);let{normalizedType:X}=O2($),G=typeof $.description==="string"?$.description:void 0;if(X==="array")return DO($,_,W,Q,G,U);if(X==="object"||B($.properties))return wO($,_,W,Q,G,U);if(qO(X))return IO($,X,G);throw Error(`Unsupported schema at ${W}`)}function NO($,_,W,Q=m1.Schema,U=P8.Schema){let Z=B5(_,`#/components/schemas/${$}`);if(Z)return R5(W,i0($),Z,`#/components/schemas/${$}`),null;let X=J1(_,W,`#/components/schemas/${$}`,i0($),new Set);if(X.kind!=="object")return null;if(Object.keys(X.properties).length===0&&X.additionalProperties===void 0)return null;let G=Object.entries(X.properties).map(([O,M])=>{let J=!X.required.includes(O),T=_.nullable===!0,A=(B(_.properties)?_.properties:void 0)?.[O];if(B(A)){let{nullable:V}=O2(A);T=V||A.nullable===!0}let E=B(A)&&typeof A.description==="string"?A.description:void 0;return{name:O,schema:M,optional:J,nullable:T,source:Q,description:E}});return{schemaName:$,dtoName:Y1($),schema:X,description:typeof _.description==="string"?_.description:void 0,properties:G,source:U}}function S5($,_){if(!_.has($.schemaName))return _.add($.schemaName),$;let W=2;while(_.has(`${$.schemaName}${W}`))W+=1;let Q=`${$.schemaName}${W}`;return _.add(Q),{...$,schemaName:Q,dtoName:Y1(Q)}}function P0($){if(!B($))return null;return B($.schema)?$.schema:null}function M2($){if(!B($))return null;let _=P0($[oU]);if(_)return _;for(let[Q,U]of Object.entries($)){if(!MW.test(Q))continue;let Z=P0(U);if(Z)return Z}let W=P0($[tU]);if(W)return W;for(let Q of Object.keys($).sort((U,Z)=>U.localeCompare(Z))){let U=P0($[Q]);if(U)return U}return null}function yO($,_,W){let Q=typeof $.operationId==="string"?$.operationId.trim():"";return I5(Q.length>0?Q:`${_} ${W}`)}function j5($,_,W,Q=new Set){if(!B($))return null;let U=$.$ref;if(typeof U!=="string")return $;if(Q.has(U))return null;let Z=zO(U,W);if(!Z)return null;let X=_[W];if(!B(X))return null;let G=X[Z];if(!B(G))return null;return Q.add(U),j5(G,_,W,Q)}function kO($,_,W,Q){let U=new Map,Z=(X)=>{if(!Array.isArray(X))return;for(let G of X){let O=j5(G,W,"parameters");if(!O||O.in!==Q||typeof O.name!=="string")continue;U.set(`${Q}:${O.name}`,O)}};return Z($),Z(_),[...U.values()].sort((X,G)=>String(X.name).localeCompare(String(G.name)))}function PO($){if(B($.schema))return $.schema;return M2($.content)}function bO($,_){if(typeof _.description!=="string"||typeof $.description==="string")return $;return{...$,description:_.description}}function m6($,_,W,Q,U,Z,X){let G=kO($.parameters,_.parameters,W,Z);if(G.length===0)return null;let O=[];for(let J of G){let T=J.name;if(typeof T!=="string")continue;let Y=PO(J);if(!Y)continue;let A=bO(Y,J),{nullable:E}=O2(A),V=`${U}${X}${I5(T)}`;O.push({name:T,schema:J1(A,Q,`paths.${U}.${X}.${T}`,V,new Set),optional:Z===m1.Path?!1:J.required!==!0,nullable:E,description:typeof J.description==="string"?J.description:void 0,source:Z})}if(O.length===0)return null;let M=`${U}${X}`;return{schemaName:M,dtoName:Y1(M),schema:{kind:K$.Object,properties:Object.fromEntries(O.map((J)=>[J.name,J.schema])),required:O.filter((J)=>!J.optional).map((J)=>J.name)},properties:O,source:P8.Operation}}function gO($,_,W,Q,U){let Z=[];for(let X of V5){let G=_[X];if(!B(G))continue;let O=yO(G,X,$),M=[m6(_,G,W,Q,O,m1.Path,G8.Params),m6(_,G,W,Q,O,m1.Query,G8.Query)];for(let J of M)if(J)Z.push(S5(J,U))}return Z}function vO($,_,W){if(!B($.paths))return[];let Q=B($.components)?$.components:{},U=[];for(let[Z,X]of Object.entries($.paths).sort(([G],[O])=>G.localeCompare(O))){if(!B(X))continue;U.push(...gO(Z,X,Q,_,W))}return U}function F5($,_){if(!B($))return;for(let[W,Q]of Object.entries($)){if(!B(Q)||!("schema"in Q))continue;let U=Q.schema;if(!B(U)||typeof U.$ref!=="string")throw Error(`Inline ${_}.${W}.schema`)}}function uO($,_){if(!B(_))return;F5(_.content,`request schema is not allowed at ${$}.requestBody.content`)}function hO($,_){if(!B(_))return;for(let[W,Q]of Object.entries(_)){if(!B(Q))continue;F5(Q.content,`response schema is not allowed at ${$}.responses.${W}.content`)}}function dO($,_,W){let Q=`paths.${$}.${_}`;uO(Q,W.requestBody),hO(Q,W.responses)}function lO($,_){if(!_.enforceOperationSchemaRefs)return;let W=$.paths;if(!B(W))return;for(let[Q,U]of Object.entries(W)){if(!B(U))continue;for(let[Z,X]of Object.entries(U)){if(!B(X))continue;if(Z==="parameters")continue;dO(Q,Z,X)}}}function J2($,_={}){if(!B($))throw Error("OpenAPI document must be an object");let W=CO($.openapi);return lO($,{enforceOperationSchemaRefs:_.enforceOperationSchemaRefs??!0}),W}function cO($){let _=$.components;if(!B(_)||!B(_.schemas))throw Error("OpenAPI document is missing components.schemas");return _.schemas}function w5($){if(!B($))throw Error("OpenAPI document must be an object");let _=J2($,{enforceOperationSchemaRefs:!0}),W=cO($),Q={schemas:W,enumGroups:new Map},U=[],Z=new Set;for(let[X,G]of Object.entries(W)){if(!B(G))throw Error(`Invalid schema '${X}' in components.schemas`);let O=NO(X,G,Q);if(O)U.push(S5(O,Z))}return U.push(...vO($,Q,Z)),{family:_,dtoModels:U,enumGroups:[...Q.enumGroups.values()].sort((X,G)=>X.name.localeCompare(G.name))}}function nO($){return`./${U2($).replace(/\.ts$/,"")}`}function mO($){return`../enums/${F8($).replace(/\.ts$/,"")}`}function D5($,_,W){let Q=$.imports.get(_)??new Set;Q.add(W),$.imports.set(_,Q)}function pO($,_){let W=m$(_);if(W===$.currentName)return;D5($,nO(_),W)}function iO($,_){D5($,mO(_),m$(_))}function N5($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)?$:JSON.stringify($)}function v8($){return[...new Set($)].join(" | ")}function y5($,_,W,Q){let U=O1($,W,Q);if(U==="unknown")return"unknown";return v8([U,..._])}function rO($,_,W){let Q=Object.entries($.properties);if(Q.length===0)return $.additionalProperties?`Record<string, ${O1($.additionalProperties,_,W)}>`:"Record<string, unknown>";let U=" ".repeat(W),Z=" ".repeat(W+1),X=["{"];for(let[G,O]of Q){let M=$.required.includes(G)?"":"?";X.push(`${Z}${N5(G)}${M}: ${O1(O,_,W+1)};`)}if($.additionalProperties){let G=Q.map(([O,M])=>{let J=$.required.includes(O)?[]:["undefined"];return v8([O1(M,_,W+1),...J])});X.push(`${Z}[key: string]: ${y5($.additionalProperties,G,_,W+1)};`)}return X.push(`${U}}`),X.join(`
|
|
123
|
-
`)}function
|
|
124
|
-
`:""} ${
|
|
119
|
+
${H}
|
|
120
|
+
`}function h5($){return typeof $==="string"?`'${$.replace(/'/g,"\\'")}'`:String($)}function fH($){let Q=s0($.name),Z=T8($.name),X=$.name,U=$.values.map((G)=>h5(G)).join(", "),W=$.members.map((G)=>` ${G.key}: ${h5(G.value)},`).join(`
|
|
121
|
+
`),J=$.values.map((G)=>String(G)).join(" | ");return["/**",` * OpenAPI enum: ${$.name}`,` * Schema path: ${$.schemaPath}`,` * Values: ${J}`," */",`export const ${Q} = [${U}] as const;`,"",`export type ${X} = (typeof ${Q})[number];`,"",`export const ${Z} = {`,W,"} as const;"].join(`
|
|
122
|
+
`)}function j($){return typeof $==="object"&&$!==null}function xH($){if(typeof $!=="string")throw Error("OpenAPI document missing valid openapi version");if($.startsWith("3.0."))return $8.V3_0;if($.startsWith("3.1."))return $8.V3_1;if($.startsWith("3.2."))return $8.V3_2;throw Error(`Unsupported OpenAPI version '${$}'. Supported families: 3.0.x, 3.1.x, 3.2.x`)}function I9($){let Q=$.match(/^#\/components\/schemas\/(.+)$/);if(!Q?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/schemas/<Name>'`);return Q[1]}function gH($,Q){let Z=`#/components/${Q}/`;if(!$.startsWith(Z))return null;return $.slice(Z.length).replace(/~1/g,"/").replace(/~0/g,"~")}function BX($,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 C8($){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 OpenAPI schema");let U=X.filter((W)=>W!=="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 hH($,Q,Z,X){let U=I9(Q);if(X.has(U))throw Error(`Unsupported recursive schema cycle detected at ${Z} -> ${U}`);let W=$.schemas[U];if(!j(W))throw Error(`Missing referenced schema '${U}' at ${Z}`);return W}function uH($,Q,Z,X,U,W,J,G){if(!j(Q))throw Error(`Invalid property '${$}' at ${Z}`);if(U[$])throw Error(`Duplicate property '${$}' while flattening ${X}`);let _=`${u5(X.split("/").pop()??"")}${u5($)}`;U[$]=G(Q,W,`${Z}.properties.${$}`,_,J)}function dH($,Q,Z,X,U,W,J,G){let{normalizedType:_}=C8($),Y=$.properties;if(_!=="object"&&!j(Y))throw Error(`Unsupported allOf part at ${Q}. Expected object-like schema`);if(j(Y))for(let[H,V]of Object.entries(Y))uH(H,V,Q,Z,X,W,J,G);let z=$.required;if(Array.isArray(z)){for(let H of z)if(typeof H==="string")U.add(H)}}function mH($,Q,Z,X){for(let[U,W]of Object.entries($.properties)){if(Z[U])throw Error(`Duplicate property '${U}' while flattening ${Q}`);Z[U]=W}for(let U of $.required)X.add(U)}function lH($,Q,Z,X,U,W,J,G){let _=$,Y=null;if(typeof $.$ref==="string"){let z=$.$ref;Y=I9(z),_=hH(W,z,Q,J),J.add(Y)}try{if(BX(_,Q),Array.isArray(_.allOf)){let z=AX(_,W,Q,J,G);mH(z,Z,X,U);return}dH(_,Q,Z,X,U,W,J,G)}finally{if(Y)J.delete(Y)}}function AX($,Q,Z,X,U){let W=$.allOf;if(!Array.isArray(W))throw Error(`Expected allOf array at ${Z}`);let J={},G=new Set,_={};for(let[z,H]of Object.entries($))if(z!=="allOf"&&z!=="description"&&z!=="nullable")_[z]=H;let Y=[...W,_];for(let z=0;z<Y.length;z++){let H=Y[z];if(!j(H)||Object.keys(H).length===0)continue;let V=`${Z}.allOf[${z}]`;lH(H,V,Z,J,G,Q,X,U)}return{kind:l$.Object,properties:J,required:[...G],description:typeof $.description==="string"?$.description:void 0}}function MX($,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 EX($,Q,Z,X){let U=Z.map((_)=>({key:JX(_),value:_})),W=new Set;for(let _ of U){if(W.has(_.key))throw Error(`Enum '${Q}' has duplicate normalized key '${_.key}' (path: ${X})`);W.add(_.key)}let J=$.enumGroups.get(Q);if(!J){let _={name:Q,schemaPath:X,values:Z,members:U};return $.enumGroups.set(Q,_),_}if(!(J.values.length===Z.length&&J.values.every((_,Y)=>_===Z[Y])))throw Error(`Enum name collision for '${Q}'. Paths: ${J.schemaPath} and ${X}`);return J}function nH($){if($===void 0)return!1;return Object.values(qX).some((Q)=>Q===$)}function d5($){if($===!0||$===!1)return $;if(typeof $==="number")return $;return}function iH($,Q,Z){return{kind:l$.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:d5($.exclusiveMinimum),exclusiveMaximum:d5($.exclusiveMaximum),pattern:typeof $.pattern==="string"?$.pattern:void 0,description:Z}}function oH($,Q,Z,X){let U=typeof $.$ref==="string"?$.$ref:"";if(!U)throw Error(`Missing $ref at ${Z}`);let W=I9(U),J=Q.schemas[W];if(!j(J))throw Error(`Missing referenced schema '${W}' at ${Z}`);let G=typeof $.description==="string"?$.description:void 0;if(X.has(W))return{kind:l$.Ref,ref:U,refName:W,description:G};X.add(W);let _=i1(J,Q,`#/components/schemas/${W}`,Y8(W),X);if(X.delete(W),_.kind!=="object"||Object.keys(_.properties).length===0)return _;return{kind:l$.Ref,ref:U,refName:W,description:G}}function aH($,Q,Z,X,U,W){let J=$.properties,G={};if(j(J))for(let[V,O]of Object.entries(J)){if(!j(O))throw Error(`Invalid property '${V}' at ${Z}`);let K=`${X}${Y8(V)}`;G[V]=i1(O,Q,`${Z}.properties.${V}`,K,W)}let _=$.required,Y=Array.isArray(_)&&_.every((V)=>typeof V==="string")?_:[],z=$.additionalProperties,H;if(z===!0)H={kind:l$.Unknown};else if(j(z))H=i1(z,Q,`${Z}.additionalProperties`,`${X}Value`,W);else if(z!==void 0&&z!==!1)throw Error(`Unsupported additionalProperties at ${Z}`);return{kind:l$.Object,properties:G,required:Y,additionalProperties:H,description:U}}function sH($,Q,Z,X,U){let W=EX(Q,Z,X,U);return{kind:l$.Enum,enumName:W.name,values:W.values,description:typeof $.description==="string"?$.description:void 0}}function tH($,Q,Z,X,U,W){let J=$.items;if(!j(J))throw Error(`Array schema at ${Z} is missing items`);let G=`${X}Item`;return{kind:l$.Array,items:i1(J,Q,`${Z}.items`,G,W),minItems:typeof $.minItems==="number"?$.minItems:void 0,maxItems:typeof $.maxItems==="number"?$.maxItems:void 0,description:U}}function i1($,Q,Z,X,U){if(BX($,Z),typeof $.$ref==="string")return oH($,Q,Z,U);let W=MX($,Z);if(W)return sH($,Q,X,W,Z);if(Array.isArray($.allOf))return AX($,Q,Z,U,i1);let{normalizedType:J}=C8($),G=typeof $.description==="string"?$.description:void 0;if(J==="array")return tH($,Q,Z,X,G,U);if(J==="object"||j($.properties))return aH($,Q,Z,X,G,U);if(nH(J))return iH($,J,G);throw Error(`Unsupported schema at ${Z}`)}function eH($,Q,Z,X=r0.Schema,U=F9.Schema){let W=MX(Q,`#/components/schemas/${$}`);if(W)return EX(Z,Y8($),W,`#/components/schemas/${$}`),null;let J=i1(Q,Z,`#/components/schemas/${$}`,Y8($),new Set);if(J.kind!=="object")return null;if(Object.keys(J.properties).length===0&&J.additionalProperties===void 0)return null;let G=Object.entries(J.properties).map(([_,Y])=>{let z=!J.required.includes(_),H=Q.nullable===!0,O=(j(Q.properties)?Q.properties:void 0)?.[_];if(j(O)){let{nullable:L}=C8(O);H=L||O.nullable===!0}let K=j(O)&&typeof O.description==="string"?O.description:void 0;return{name:_,schema:Y,optional:z,nullable:H,source:X,description:K}});return{schemaName:$,dtoName:r1($),schema:J,description:typeof Q.description==="string"?Q.description:void 0,properties:G,source:U}}function TX($,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:r1(X)}}function a2($){if(!j($))return null;return j($.schema)?$.schema:null}function F8($){if(!j($))return null;let Q=a2($[A4]);if(Q)return Q;for(let[X,U]of Object.entries($)){if(!GZ.test(X))continue;let W=a2(U);if(W)return W}let Z=a2($[M4]);if(Z)return Z;for(let X of Object.keys($).sort((U,W)=>U.localeCompare(W))){let U=a2($[X]);if(U)return U}return null}function $V($,Q,Z){let X=typeof $.operationId==="string"?$.operationId.trim():"";return SX(X.length>0?X:`${Q} ${Z}`)}function CX($,Q,Z,X=new Set){if(!j($))return null;let U=$.$ref;if(typeof U!=="string")return $;if(X.has(U))return null;let W=gH(U,Z);if(!W)return null;let J=Q[Z];if(!j(J))return null;let G=J[W];if(!j(G))return null;return X.add(U),CX(G,Q,Z,X)}function QV($,Q,Z,X){let U=new Map,W=(J)=>{if(!Array.isArray(J))return;for(let G of J){let _=CX(G,Z,"parameters");if(!_||_.in!==X||typeof _.name!=="string")continue;U.set(`${X}:${_.name}`,_)}};return W($),W(Q),[...U.values()].sort((J,G)=>String(J.name).localeCompare(String(G.name)))}function ZV($){if(j($.schema))return $.schema;return F8($.content)}function XV($,Q){if(typeof Q.description!=="string"||typeof $.description==="string")return $;return{...$,description:Q.description}}function m5($,Q,Z,X,U,W,J){let G=QV($.parameters,Q.parameters,Z,W);if(G.length===0)return null;let _=[];for(let z of G){let H=z.name;if(typeof H!=="string")continue;let V=ZV(z);if(!V)continue;let O=XV(V,z),{nullable:K}=C8(O),L=`${U}${J}${SX(H)}`;_.push({name:H,schema:i1(O,X,`paths.${U}.${J}.${H}`,L,new Set),optional:W===r0.Path?!1:z.required!==!0,nullable:K,description:typeof z.description==="string"?z.description:void 0,source:W})}if(_.length===0)return null;let Y=`${U}${J}`;return{schemaName:Y,dtoName:r1(Y),schema:{kind:l$.Object,properties:Object.fromEntries(_.map((z)=>[z.name,z.schema])),required:_.filter((z)=>!z.optional).map((z)=>z.name)},properties:_,source:F9.Operation}}function UV($,Q,Z,X,U){let W=[];for(let J of LX){let G=Q[J];if(!j(G))continue;let _=$V(G,J,$),Y=[m5(Q,G,Z,X,_,r0.Path,t6.Params),m5(Q,G,Z,X,_,r0.Query,t6.Query)];for(let z of Y)if(z)W.push(TX(z,U))}return W}function WV($,Q,Z){if(!j($.paths))return[];let X=j($.components)?$.components:{},U=[];for(let[W,J]of Object.entries($.paths).sort(([G],[_])=>G.localeCompare(_))){if(!j(J))continue;U.push(...UV(W,J,X,Q,Z))}return U}function FX($,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 GV($,Q){if(!j(Q))return;FX(Q.content,`request schema is not allowed at ${$}.requestBody.content`)}function _V($,Q){if(!j(Q))return;for(let[Z,X]of Object.entries(Q)){if(!j(X))continue;FX(X.content,`response schema is not allowed at ${$}.responses.${Z}.content`)}}function YV($,Q,Z){let X=`paths.${$}.${Q}`;GV(X,Z.requestBody),_V(X,Z.responses)}function zV($,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[W,J]of Object.entries(U)){if(!j(J))continue;if(W==="parameters")continue;YV(X,W,J)}}}function I8($,Q={}){if(!j($))throw Error("OpenAPI document must be an object");let Z=xH($.openapi);return zV($,{enforceOperationSchemaRefs:Q.enforceOperationSchemaRefs??!0}),Z}function HV($){let Q=$.components;if(!j(Q)||!j(Q.schemas))throw Error("OpenAPI document is missing components.schemas");return Q.schemas}function IX($){if(!j($))throw Error("OpenAPI document must be an object");let Q=I8($,{enforceOperationSchemaRefs:!0}),Z=HV($),X={schemas:Z,enumGroups:new Map},U=[],W=new Set;for(let[J,G]of Object.entries(Z)){if(!j(G))throw Error(`Invalid schema '${J}' in components.schemas`);let _=eH(J,G,X);if(_)U.push(TX(_,W))}return U.push(...WV($,X,W)),{family:Q,dtoModels:U,enumGroups:[...X.enumGroups.values()].sort((J,G)=>J.name.localeCompare(G.name))}}function VV($){return`./${E8($).replace(/\.ts$/,"")}`}function OV($){return`../enums/${A9($).replace(/\.ts$/,"")}`}function RX($,Q,Z){let X=$.imports.get(Q)??new Set;X.add(Z),$.imports.set(Q,X)}function KV($,Q){let Z=S1(Q);if(Z===$.currentName)return;RX($,VV(Q),Z)}function qV($,Q){RX($,OV(Q),S1(Q))}function NX($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)?$:JSON.stringify($)}function R9($){return[...new Set($)].join(" | ")}function wX($,Q,Z,X){let U=c1($,Z,X);if(U==="unknown")return"unknown";return R9([U,...Q])}function LV($,Q,Z){let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${c1($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let U=" ".repeat(Z),W=" ".repeat(Z+1),J=["{"];for(let[G,_]of X){let Y=$.required.includes(G)?"":"?";J.push(`${W}${NX(G)}${Y}: ${c1(_,Q,Z+1)};`)}if($.additionalProperties){let G=X.map(([_,Y])=>{let z=$.required.includes(_)?[]:["undefined"];return R9([c1(Y,Q,Z+1),...z])});J.push(`${W}[key: string]: ${wX($.additionalProperties,G,Q,Z+1)};`)}return J.push(`${U}}`),J.join(`
|
|
123
|
+
`)}function c1($,Q,Z){if($.kind==="scalar")return $.scalar==="integer"?"number":$.scalar;if($.kind==="enum")return qV(Q,$.enumName),S1($.enumName);if($.kind==="ref")return KV(Q,$.refName),S1($.refName);if($.kind==="array")return`${c1($.items,Q,Z)}[]`;if($.kind==="unknown")return"unknown";return LV($,Q,Z)}function BV($,Q){let Z=$.optional?"?":"",X=!$.optional&&$.nullable?" | null":"";return`${$.description?` /** ${$.description.replace(/\*\//g,"*\\/")} */
|
|
124
|
+
`:""} ${NX($.name)}${Z}: ${c1($.schema,Q,1)}${X};`}function AV($,Q){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let Z=$.properties.map((X)=>{let U=X.optional?["undefined"]:[],W=!X.optional&&X.nullable?["null"]:[];return R9([c1(X.schema,Q,1),...W,...U])});return` [key: string]: ${wX($.schema.additionalProperties,Z,Q,1)};`}function MV($){let Q=[...$.imports.entries()].sort(([Z],[X])=>Z.localeCompare(X)).map(([Z,X])=>{return`import type { ${[...X].sort((W,J)=>W.localeCompare(J)).join(", ")} } from '${Z}';`});return Q.length>0?`${Q.join(`
|
|
125
125
|
`)}
|
|
126
126
|
|
|
127
|
-
`:""}function
|
|
128
|
-
`:"",U=$.properties.map((
|
|
129
|
-
`):" // empty schema";return`${
|
|
127
|
+
`:""}function EV($){let Q=S1($.schemaName),Z={currentName:Q,imports:new Map},X=$.description?`/** ${$.description.replace(/\*\//g,"*\\/")} */
|
|
128
|
+
`:"",U=$.properties.map((_)=>BV(_,Z)),W=AV($,Z),J=[...U,...W?[W]:[]],G=J.length>0?J.join(`
|
|
129
|
+
`):" // empty schema";return`${MV(Z)}${X}export interface ${Q} {
|
|
130
130
|
${G}
|
|
131
131
|
}
|
|
132
|
-
`}function f($){return typeof $==="object"&&$!==null}function
|
|
133
|
-
`);
|
|
134
|
-
${
|
|
135
|
-
],`)}if($.queryDto.length>0){let
|
|
136
|
-
`);
|
|
137
|
-
${
|
|
138
|
-
],`)}if($.bodyDtoName)
|
|
139
|
-
`)}function
|
|
140
|
-
`;let
|
|
141
|
-
`),U=
|
|
142
|
-
|
|
143
|
-
`:"";if(
|
|
144
|
-
`;let
|
|
132
|
+
`}function f($){return typeof $==="object"&&$!==null}function M1($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function s$($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function z8($){if(typeof $==="string")return`'${s$($)}'`;if(typeof $==="number"||typeof $==="boolean")return String($);if($===null)return"null";if(Array.isArray($))return`[${$.map((Q)=>z8(Q)).join(", ")}]`;if(f($))return`{ ${Object.entries($).map(([Z,X])=>{return`${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(Z)?Z:`'${s$(Z)}'`}: ${z8(X)}`}).join(", ")} }`;return"undefined"}function A0($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/${Q}/<Name>'`);return Z[1]}function bX($,Q){let Z=Q===q$.Post?YZ:_Z;for(let U of Z){let W=$[U];if(j(W))return{statusCode:U,response:W}}let X=Object.keys($).filter((U)=>zZ.test(U)).sort((U,W)=>Number(U)-Number(W));for(let U of X){let W=$[U];if(j(W))return{statusCode:U,response:W}}return null}function SV($){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 CV($,Q){if(!$)return;if(typeof $.$ref==="string"){let Z=A0($.$ref,a1.Schemas),X=Q.schemas[Z];return f(X)?X:void 0}return $}function FV($){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){if(!$||typeof $.$ref!=="string")return;let Z=A0($.$ref,a1.Schemas),X=Q.schemas[Z];if(!f(X)||!FV(X))return;return{name:r1(Z),importPath:IV($)}}function IV($){if(!$||typeof $.$ref!=="string")throw Error("Expected schema $ref while building DTO import path");let Q=A0($.$ref,a1.Schemas);return`./dto/${B9(Q).replace(/\.ts$/,"")}`}function p5($){return F8($)??void 0}function DV($,Q){let Z=$.requestBody;if(!f(Z))return;if(typeof Z.$ref==="string"){let X=A0(Z.$ref,a1.RequestBodies),U=Q.requestBodies[X];return f(U)?U:void 0}return Z}function RV($,Q){if(!f($))return;if(typeof $.$ref==="string"){let Z=A0($.$ref,a1.Responses),X=Q.responses[Z];return f(X)?X:void 0}return $}function NV($){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 PX($,Q){let Z=CV($,Q);if(!Z)return{};let X=Z.type,U=NV(Z.enum),W=Z.example;if(X==="array"){let J=f(Z.items)?Z.items:void 0,G=PX(J,Q);return{typeCtor:G.typeCtor??H0.String,isArray:!0,enumValues:G.enumValues,example:W??G.example}}if(X==="string")return{typeCtor:H0.String,enumValues:U,example:W};if(X==="number"||X==="integer")return{typeCtor:H0.Number,enumValues:U,example:W};if(X==="boolean")return{typeCtor:H0.Boolean,enumValues:U,example:W};if(X==="object")return{typeCtor:H0.Object,enumValues:U,example:W};return{enumValues:U,example:W}}function wV($,Q){if(!f($))return;if(typeof $.$ref==="string"){let Z=A0($.$ref,a1.Parameters),X=Q.parameters[Z];return f(X)?X:void 0}return $}function bV($,Q){let Z=wV($,Q);if(!Z)return;let X=Z.in;if(X!==e.Path&&X!==e.Query)return;let U=M1(Z.name);if(!U)return;let W=f(Z.schema)?Z.schema:void 0,J=PX(W,Q),G=Z.required===!0||X===e.Path,_=M1(Z.description),Y=Z.example??J.example;return{location:X,name:U,required:G,description:_,typeCtor:J.typeCtor,isArray:J.isArray,enumValues:J.enumValues,example:Y}}function kV($,Q){if(!Array.isArray($))return{path:[],query:[]};let Z=new Map;for(let W of $){let J=bV(W,Q);if(!J)continue;Z.set(`${J.location}:${J.name}`,J)}let X=[],U=[];for(let W of Z.values()){if(W.location===e.Path)X.push(W);if(W.location===e.Query)U.push(W)}return{path:X.sort((W,J)=>W.name.localeCompare(J.name)),query:U.sort((W,J)=>W.name.localeCompare(J.name))}}function PV($,Q){let Z=new Map,X=(U)=>{if(!Array.isArray(U))return;for(let W of U){if(!f(W))continue;if(typeof W.$ref==="string"){Z.set(W.$ref,W);continue}let J=M1(W.in),G=M1(W.name);if(!J||!G)continue;Z.set(`${J}:${G}`,W)}};return X($),X(Q),[...Z.values()]}function vV($,Q){let Z=Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ").trim(),X=`${$} ${Z||"root"}`;return yV(X)}function xV($,Q){let Z=$,X=2;while(Q.has(Z))Z=`${$}_${X}`,X+=1;return Q.add(Z),Z}function gV($,Q,Z,X,U,W){let J=M1(Z.operationId)??vV(Q,$),G=xV(B0(J),W),_=PV(X,Z.parameters),Y=kV(_,U),z=DV(Z,U),H=f(z?.content)?z.content:void 0,V=H?p5(H):void 0,O=l5(V,U),K=f(Z.responses)?Z.responses:{},L=bX(K,Q),q=L?RV(L.response,U):void 0,S=f(q?.content)?q.content:void 0,I=S?p5(S):void 0,y=l5(I,U),N=M1(q?.description),w=M1(Z.summary)??`${Q.toUpperCase()} ${$}`,l=M1(Z.description)??w;return{key:G,constantName:`SWG_${G}`,operationId:J,method:Q.toUpperCase(),path:$,summary:w,description:l,bodyDtoName:O?.name,bodyDtoImportPath:O?.importPath,responseDtoName:y?.name,responseDtoImportPath:y?.importPath,responseDescription:N,paramDto:Y.path,queryDto:Y.query}}function hV($){let Q=f($.paths)?$.paths:{},Z=SV($),X=[],U=new Set;for(let[W,J]of Object.entries(Q)){if(!f(J))continue;let G=J.parameters;for(let _ of fX){let Y=J[_];if(!f(Y))continue;X.push(gV(W,_,Y,G,Z,U))}}return X.sort((W,J)=>{let G=W.path.localeCompare(J.path);if(G!==0)return G;return W.method.localeCompare(J.method)})}function c5($){let Q=[`name: '${s$($.name)}'`];if($.required===!0)Q.push("required: true");if($.description)Q.push(`description: '${s$($.description)}'`);if($.typeCtor)Q.push(`type: ${$.typeCtor}`);if($.isArray)Q.push("isArray: true");if($.enumValues&&$.enumValues.length>0)Q.push(`enum: ${z8($.enumValues)}`);if($.example!==void 0)Q.push(`example: ${z8($.example)}`);return`{ ${Q.join(", ")} }`}function dV($){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: '${s$($.operationId)}',`),Q.push(` method: '${$.method}',`),Q.push(` path: '${s$($.path)}',`),Q.push(` summary: '${s$($.summary)}',`),Q.push(` description: '${s$($.description)}',`),$.paramDto.length>0){let Z=$.paramDto.map((X)=>` ${c5(X)}`).join(`,
|
|
133
|
+
`);Q.push(` paramDto: [
|
|
134
|
+
${Z}
|
|
135
|
+
],`)}if($.queryDto.length>0){let Z=$.queryDto.map((X)=>` ${c5(X)}`).join(`,
|
|
136
|
+
`);Q.push(` queryDto: [
|
|
137
|
+
${Z}
|
|
138
|
+
],`)}if($.bodyDtoName)Q.push(` bodyDto: ${$.bodyDtoName},`);if($.responseDtoName)Q.push(` responseDto: ${$.responseDtoName},`);if($.responseDescription)Q.push(` responseDescription: '${s$($.responseDescription)}',`);return Q.push("} as const;"),Q.join(`
|
|
139
|
+
`)}function mV($){if(!f($))return`export const SWAGGER_OPERATIONS = {} as const;
|
|
140
|
+
`;let Q=hV($),Z=new Map;for(let _ of Q){if(_.bodyDtoName&&_.bodyDtoImportPath){let Y=Z.get(_.bodyDtoImportPath)??new Set;Y.add(_.bodyDtoName),Z.set(_.bodyDtoImportPath,Y)}if(_.responseDtoName&&_.responseDtoImportPath){let Y=Z.get(_.responseDtoImportPath)??new Set;Y.add(_.responseDtoName),Z.set(_.responseDtoImportPath,Y)}}let X=[...Z.entries()].sort(([_],[Y])=>_.localeCompare(Y)).map(([_,Y])=>{return`import { ${[...Y].sort((H,V)=>H.localeCompare(V)).join(", ")} } from '${_}';`}).join(`
|
|
141
|
+
`),U=X.length>0?`${X}
|
|
142
|
+
|
|
143
|
+
`:"";if(Q.length===0)return`${U}export const SWAGGER_OPERATIONS = {} as const;
|
|
144
|
+
`;let W=Q.map((_)=>dV(_)).join(`
|
|
145
145
|
|
|
146
146
|
`),G=`/** Generated OpenAPI operation metadata map. */
|
|
147
147
|
export const SWAGGER_OPERATIONS = {
|
|
148
|
-
${
|
|
148
|
+
${Q.map((_)=>` ${_.key}: ${_.constantName},`).join(`
|
|
149
149
|
`)}
|
|
150
|
-
} as const;`;return`${U}${
|
|
150
|
+
} as const;`;return`${U}${W}
|
|
151
151
|
|
|
152
152
|
${G}
|
|
153
|
-
`}async function
|
|
154
|
-
`):"export {};";return
|
|
155
|
-
`)}async function
|
|
156
|
-
`))
|
|
157
|
-
`):" [key: string]: never;";return`export interface ${
|
|
158
|
-
${
|
|
159
|
-
}`})}function
|
|
160
|
-
`)}function
|
|
153
|
+
`}async function nV($){let Q;try{Q=await N9($,{withFileTypes:!0})}catch{return!1}let Z=!1;return await Promise.all(Q.filter((X)=>X.isFile()&&X.name.endsWith(OZ)).map(async(X)=>{await Z2(Q$($,X.name),{force:!0}),Z=!0})),Z}async function vX($){try{await yX($)}catch{return!1}return await Z2($,{force:!0}),!0}async function n5($){try{await yX($)}catch{return!1}return await Z2($,{recursive:!0,force:!0}),!0}async function w9($,Q){let Z;try{Z=await N9($,{withFileTypes:!0})}catch{return!1}let X=!1;return await Promise.all(Z.filter((U)=>U.isFile()&&U.name.endsWith(".ts")&&U.name!==W9&&!Q.has(U.name)).map(async(U)=>{await Z2(Q$($,U.name),{force:!0}),X=!0})),X}async function iV($,Q){let Z;try{Z=await N9($,{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 Z2(Q$($,U.name),{force:!0}),X=!0})),X}async function U2($,Q,Z){return Z?Y9($,Q):$}async function rV($,Q,Z,X){let U=!1,W=[],J=new Set;for(let G of $.enumGroups){let _=A9(G.name);J.add(_);let Y=Q$(Q,_),z=await U2(fH(G),Y,X);if(await J$(Y,z))U=!0;if(W.push(`./${_.replace(/\.ts$/,"")}`),Z)X2.step(` \u2713 ${Y}`)}if(await w9(Q,J))U=!0;if(await L0(Q,W.sort()))U=!0;return U}async function oV($,Q,Z){let X=!1;for(let U of $.enumGroups){let W=E8(U.name);if(!Q.has(W)){let J=Q$(Z,W);if(await vX(J))X=!0}}return X}async function aV($,Q,Z,X){let U=!1,W=[],J=new Set;for(let G of $){let _=E8(G.schemaName);if(J.has(_))throw Error(`Duplicate OpenAPI model output file '${_}'`);J.add(_);let Y=Q$(Q,_),z=await U2(EV(G),Y,X);if(await J$(Y,z))U=!0;if(W.push(`./${_.replace(/\.ts$/,"")}`),Z)X2.step(` \u2713 ${Y}`)}if(await w9(Q,J))U=!0;if(await L0(Q,W.sort()))U=!0;return U}async function sV($,Q,Z,X){let U=!1,W=[],J=new Set,G=new Map;for(let _ of $.dtoModels.filter((Y)=>Y.properties.length>0)){let Y=B9(_.schemaName);if(J.has(Y))throw Error(`Duplicate OpenAPI DTO output file '${Y}'`);let z=r1(_.schemaName),H=G.get(z);if(H)throw Error(`Duplicate OpenAPI DTO class symbol '${z}' from schemas '${H}' and '${_.schemaName}'`);G.set(z,_.schemaName),J.add(Y);let V=Q$(Q,Y),O=await U2(kH(_),V,X);if(await J$(V,O))U=!0;if(W.push(`./${Y.replace(OZ,".dto")}`),Z)X2.step(` \u2713 ${V}`)}if(await w9(Q,J))U=!0;return{changed:U,dtoExports:W}}async function tV($,Q,Z,X){let U=!1,W=[],J=new Set;for(let G of $){let _=WX(G.schemaName);if(J.has(_))throw Error(`Duplicate OpenAPI contract output file '${_}'`);J.add(_);let Y=Q$(Q,_),z=await U2(WH(G),Y,X);if(await J$(Y,z))U=!0;if(W.push(`./${_.replace(/\.ts$/,"")}`),Z)X2.step(` \u2713 ${Y}`)}if(await iV(Q,J))U=!0;return{changed:U,contractExports:W}}async function eV($,Q,Z,X){let U=!1,W=await tV($,Q,Z,X);if(W.changed)U=!0;if(await L0(Q,W.contractExports.sort()))U=!0;return U}async function $O($,Q,Z,X,U,W){let J=!1,G=await sV($,Z,U,W);if(G.changed)J=!0;if(await L0(Z,G.dtoExports.sort()))J=!0;let _=await U2(mV(Q),X,W);if(await J$(X,_))J=!0;if(U)X2.step(` \u2713 ${X}`);return J}function xX($){return`export * from '${$}';`}function e6($,Q){return`export * as ${$} from '${Q}';`}async function QO($,Q){let Z=Q.length>0?Q.sort().join(`
|
|
154
|
+
`):"export {};";return J$(Q$($,W9),`${Z}
|
|
155
|
+
`)}async function ZO($){return await nV($)}async function XO($,Q,Z,X,U,W,J,G,_){let{httpDir:Y,dtoDir:z}=X,H=Q$(Y,"zod"),V=Q$(Y,"swagger.ts"),O=!1;if(U){if(await eV(Z,H,J,G))O=!0;_.push(e6("ZodContracts","./zod"))}else if(await n5(H))O=!0;if(W){if(await $O($,Q,z,V,J,G))O=!0;_.push(e6("Dtos","./dto"),xX("./swagger"))}else{let K=await n5(z),L=await vX(V);if(K||L)O=!0}return O}async function UO($,Q,Z,X,U){let{httpDir:W,enumDir:J,modelDir:G}=Z,_=!1,Y=await cV.parse($,{validate:{spec:!1}});I8(Y,{enforceOperationSchemaRefs:!0});let z=IX(Y),H=z.dtoModels.filter((S)=>S.source!=="operation"),V=new Set(H.map((S)=>E8(S.schemaName))),O=U.dtos===!0,K=U.zod===!0||!O,L=U.formatFiles!==!1;_=await ZO(W)||_;let q=[e6("Models","./models"),xX("./enums")];if(await rV(z,J,X,L))_=!0;if(await oV(z,V,G))_=!0;if(await aV(H,G,X,L))_=!0;if(await XO(z,Y,H,Z,K,O,X,L,q))_=!0;if(await QO(W,q))_=!0;if(await J$(Q$(Q,W9),`export * as HttpSchemas from './http';
|
|
156
|
+
`))_=!0;return _}async function WO($,Q,Z,X={}){let U=pV(Q);try{let W=Q$(Q,"http"),J={httpDir:W,dtoDir:Q$(W,"dto"),enumDir:Q$(W,"enums"),modelDir:Q$(W,"models")},G=await UO($,Q,J,Z,X);return{success:!0,service:U,changed:G}}catch(W){return{success:!1,service:U,error:W instanceof Error?W:Error(String(W))}}}function c($){return typeof $==="object"&&$!==null}function H8($){if(typeof $!=="string")return;let Q=$.trim();return Q.length>0?Q:void 0}function _O($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function p$($){return`'${_O($)}'`}function V0($){return`${VO}${$}}`}function P9($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)}function W2($){return P9($)?$:JSON.stringify($)}function gX($,Q){return P9(Q)?`${$}.${Q}`:`${$}[${JSON.stringify(Q)}]`}function hX($,Q){if(Q==="PascalCase")return b9($);if(Q==="snake_case")return k9($);if(Q==="original")return $;return R8($)}function YO($,Q){if(Q==="PascalCase")return b9($);if(Q==="snake_case")return k9($);if(Q==="original")return $;return R8($)}function zO($,Q){if(Q==="camelCase")return R8(String($));if(Q==="snake_case")return k9(String($));if(Q==="UPPERCASE")return GO(String($));if(Q==="original")return String($);return b9(String($))}function uX($){let Q=R8($);return/^[A-Za-z_$]/.test(Q)?Q:`_${Q}`}function HO($){let Q=P9($)?$:uX($);return HZ.has(Q)?`${Q}Value`:Q}function dX($){return $.modelPropertyNaming??($.type===R.TypeScriptAngular?"original":"camelCase")}function J2($){return $.useSingleRequestParameter??$.type===R.TypeScriptFetch}function f9($,Q){let Z=$.match(new RegExp(`^#/components/${Q}/(.+)$`));if(!Z?.[1])throw Error(`Unsupported $ref '${$}'`);return Z[1]}function v9($){return $.map((Q)=>{let Z=Q.parameters.map((U)=>{let W=U.required?"":"?";return` ${W2(U.name)}${W}: ${U.typeName};`});if(Q.bodyType)Z.push(` body: ${Q.bodyType};`);let X=Z.length>0?Z.join(`
|
|
157
|
+
`):" [key: string]: never;";return`export interface ${Q.requestName} {
|
|
158
|
+
${X}
|
|
159
|
+
}`})}function OO(){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(`
|
|
160
|
+
`)}function x9($){return{pathParams:$.parameters.filter((Q)=>Q.location===e.Path),queryParams:$.parameters.filter((Q)=>Q.location===e.Query)}}function o0($,Q){return $.map((Z)=>{let X=Q?gX("request",Z.name):Z.variableName;return`${W2(Z.wireName)}: ${X}`}).join(", ")}function KO($,Q){if($.length===0)return[];let Z=[" let params = new HttpParams();"];for(let X of $){let U=Q?gX("request",X.name):X.variableName;Z.push(` if (Array.isArray(${U})) {`,` for (const item of ${U}) params = params.append(${p$(X.wireName)}, String(item));`,` } else if (${U} !== undefined && ${U} !== null) {`,` params = params.set(${p$(X.wireName)}, String(${U}));`," }")}return Z}function g9($,Q){if(J2(Q)){let U=$.parameters.length===0&&!$.bodyType?" = {}":"";return`request: ${$.requestName}${U}`}let X=$.parameters.map((U)=>{let W=U.required?"":"?";return`${U.variableName}${W}: ${U.typeName}`});if($.bodyType)X.push(`body: ${$.bodyType}`);return X.join(", ")}function h9($){return J2($)?"request.body":"body"}function q0($){return $}function qO($){if($.responseType==="unknown")return[" return parseUnknownJsonResponse(response);"];return[" if (!this.config.decodeJson) {",` throw new Error(${p$(`Missing JSON decoder for operation '${$.operationId}'`)});`," }",` return parseJsonResponse<${q0($.responseType)}>(response, ${p$($.operationId)}, this.config.decodeJson);`]}function LO($,Q,Z){let X=["import type { RequestConfig } from './runtime';","import { buildPath, buildQuery, parseJsonResponse, parseUnknownJsonResponse } from './runtime';","import type * as Models from './models';","",...v9($),"",`export class ${y9(Q)}FetchClient {`," constructor(private readonly config: RequestConfig = {}) {}"];for(let U of $){let{pathParams:W,queryParams:J}=x9(U),G=J2(Z),_=U.bodyType?`body: JSON.stringify(${h9(Z)}),`:"",Y=U.bodyType?"headers: { 'content-type': 'application/json', ...this.config.headers },":"headers: this.config.headers,";X.push(` async ${U.functionName}(${g9(U,Z)}): Promise<${q0(U.responseType)}> {`,` const path = buildPath(${p$(U.path)}, { ${o0(W,G)} });`,` const query = buildQuery({ ${o0(J,G)} });`," const fetchImpl = this.config.fetch ?? fetch;",` const response = await fetchImpl(\`${V0("this.config.baseUrl ?? ''")}${V0("path")}${V0("query")}\`, {`,` method: ${p$(U.method)},`,` ${Y}`,` ${_}`," });",` if (!response.ok) throw new Error(\`Request failed with status ${V0("response.status")}\`);`,...qO(U)," }")}return X.push("}",""),`${X.join(`
|
|
161
161
|
`)}
|
|
162
|
-
`}function
|
|
162
|
+
`}function BO($,Q,Z){let U=["import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';",$.some((W)=>W.parameters.some((J)=>J.location===e.Query))?"import { buildPath, buildQuery } from './runtime';":"import { buildPath } from './runtime';","import type * as Models from './models';","","export interface AxiosClientConfig {"," baseURL?: string;"," axios?: AxiosInstance;"," requestConfig?: AxiosRequestConfig;","}","",...v9($),"",`export class ${y9(Q)}AxiosClient {`," private readonly client: AxiosInstance;",""," constructor(private readonly config: AxiosClientConfig = {}) {"," this.client = config.axios ?? axios.create({ baseURL: config.baseURL });"," }"];for(let W of $){let{pathParams:J,queryParams:G}=x9(W),_=J2(Z),Y=W.bodyType?`data: ${h9(Z)},`:"",z=G.length?`params: { ${o0(G,_)} },`:"",H=G.length?"paramsSerializer: (params: Record<string, unknown>) => buildQuery(params).slice(1),":"";U.push(` async ${W.functionName}(${g9(W,Z)}): Promise<${q0(W.responseType)}> {`,` const url = buildPath(${p$(W.path)}, { ${o0(J,_)} });`,` const response = await this.client.request<${q0(W.responseType)}>({`," ...this.config.requestConfig,"," url,",` method: ${p$(W.method)},`,` ${z}`,` ${H}`,` ${Y}`," });"," return response.data;"," }")}return U.push("}",""),`${U.join(`
|
|
163
163
|
`)}
|
|
164
|
-
`}function
|
|
164
|
+
`}function AO($,Q,Z,X){let J=["import { Injectable } from '@angular/core';",$.some((G)=>G.parameters.some((_)=>_.location===e.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 './models';","",...v9($),"",`@Injectable({ providedIn: ${p$(X)} })`,`export class ${y9(Q)}ApiService {`," constructor(private readonly http: HttpClient, private readonly baseUrl = '') {}"];for(let G of $){let{pathParams:_,queryParams:Y}=x9(G),z=J2(Z),H=Y.length>0?"{ params }":"{}",V=G.bodyType?`${h9(Z)}, `:"",O=G.method.toLowerCase(),K=G.bodyType||O!==q$.Get?`\`\${this.baseUrl}\${path}\`, ${V}${H}`:`\`\${this.baseUrl}\${path}\`, ${H}`;J.push(` ${G.functionName}(${g9(G,Z)}): Observable<${q0(G.responseType)}> {`,` const path = buildPath(${p$(G.path)}, { ${o0(_,z)} });`,...KO(Y,z),` return this.http.${O}<${q0(G.responseType)}>(${K});`," }")}return J.push("}",""),`${J.join(`
|
|
165
165
|
`)}
|
|
166
|
-
`}function
|
|
166
|
+
`}function MO($,Q,Z){if(Z.type===R.TypeScriptAxios)return BO($,Q,Z);if(Z.type===R.TypeScriptAngular)return AO($,Q,Z,Z.providedIn??"root");return LO($,Q,Z)}function V8($){return[...new Set($)].join(" | ")}function d9($){if(!$)return"unknown";if(typeof $.$ref==="string")return u9(f9($.$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=c($.items)?$.items:void 0;return`Array<${d9(Q)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function TO($,Q,Z){if($.kind!=="object")return t$($,Q,Z);let X=Object.entries($.properties);if(X.length===0)return $.additionalProperties?`Record<string, ${t$($.additionalProperties,Q,Z)}>`:"Record<string, unknown>";let U=" ".repeat(Z),W=" ".repeat(Z+1),J=dX(Q),G=X.map(([_,Y])=>{let z=hX(_,J),H=$.required.includes(_)?"":"?";return`${W}${W2(z)}${H}: ${t$(Y,Q,Z+1)};`});if($.additionalProperties){let _=t$($.additionalProperties,Q,Z+1),Y=X.map(([z,H])=>{let V=$.required.includes(z)?[]:["undefined"];return V8([t$(H,Q,Z+1),...V])});G.push(`${W}[key: string]: ${_==="unknown"?"unknown":V8([_,...Y])};`)}return`{
|
|
167
167
|
${G.join(`
|
|
168
168
|
`)}
|
|
169
|
-
${U}}`}function
|
|
169
|
+
${U}}`}function t$($,Q,Z=1){if($.kind==="ref")return S1($.refName);if($.kind==="enum")return u9($.enumName);if($.kind==="array")return`Array<${t$($.items,Q,Z)}>`;if($.kind==="object")return TO($,Q,Z);if($.kind==="unknown")return"unknown";if($.scalar==="integer")return"number";return $.scalar}function jO($,Q){let Z=[...$];if(Q.enumUnknownDefaultCase===!0&&Z.every((X)=>typeof X==="string"))Z.push(NO);return Z}function SO($,Q,Z){let X=u9($),U=jO(Q,Z).map((W)=>({key:zO(W,Z.enumPropertyNaming),value:W}));return[`export const ${X} = {`,...U.map((W)=>` ${W2(W.key)}: ${JSON.stringify(W.value)},`),"} as const;",`export type ${X} = (typeof ${X})[keyof typeof ${X}];`]}function CO($,Q){return Q.sortModelPropertiesByRequiredFlag===!1?$.properties:[...$.properties].sort((Z,X)=>Number(Z.optional)-Number(X.optional))}function FO($,Q,Z){let X=hX($.name,Z),U=t$($.schema,Q),W=$.optional?"?":"",J=$.nullable?" | null":"";return` ${W2(X)}${W}: ${U}${J};`}function IO($,Q){let Z=$.optional?["undefined"]:[],X=$.nullable?["null"]:[];return V8([t$($.schema,Q),...X,...Z])}function DO($,Q,Z){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let X=t$($.schema.additionalProperties,Z),U=Q.map((W)=>IO(W,Z));return` [key: string]: ${X==="unknown"?"unknown":V8([X,...U])};`}function RO($,Q){let Z=dX(Q),X=CO($,Q),U=[`export interface ${S1($.schemaName)} {`];U.push(...X.map((J)=>FO(J,Q,Z)));let W=DO($,X,Q);if(W)U.push(W);if(X.length===0&&!W)U.push(" // empty schema");return U.push("}"),U}function mX($,Q){let Z=["/* Generated by Kontract. */"];for(let X of $.enumGroups)Z.push(...SO(X.name,X.values,Q));for(let X of $.dtoModels)Z.push(...RO(X,Q));return`${Z.join(`
|
|
170
170
|
|
|
171
171
|
`)}
|
|
172
|
-
`}function MJ($){let _=h($.components)?$.components:{};return{schemas:h(_.schemas)?_.schemas:{},parameters:h(_.parameters)?_.parameters:{},requestBodies:h(_.requestBodies)?_.requestBodies:{},responses:h(_.responses)?_.responses:{}}}function t8($,_,W){if(!h($)||typeof $.$ref!=="string")return $;let Q=c8($.$ref,W);return _[W][Q]}function JJ($,_){return OJ(`${$} ${_.replaceAll("{","").replaceAll("}","").replace(/\//g," ")}`)}function YJ($){if(!Array.isArray($.enum))return null;let _=[];for(let W of $.enum){if(typeof W!=="string"&&typeof W!=="number")return null;_.push(W)}return _.length>0?_:null}function TJ($,_,W){let Q=x$(_),U=$.get(Q);if(U){if(!(U.values.length===W.length&&U.values.every((X,G)=>X===W[G])))throw Error(`Inline SDK enum name collision for '${Q}'`);return`Models.${x$(U.name)}`}return $.set(Q,{name:Q,schemaPath:`sdk:inline:${Q}`,values:W,members:W.map((Z)=>({key:O5(Z),value:Z}))}),`Models.${Q}`}function u0($,_,W){if(!$)return null;if(typeof $.$ref==="string")return`Models.${x$(c8($.$ref,"schemas"))}`;let Q=YJ($);if(Q)return TJ(_,W,Q);if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let U=h($.items)?$.items:void 0;return`Array<${u0(U,_,`${W}Item`)??o8(U)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function AJ($,_){let W=t8($,_,"parameters");return h(W)?W:null}function HJ($,_){let W=[...Array.isArray($)?$:[],...Array.isArray(_)?_:[]],Q=new Map;for(let U of W){if(!h(U))continue;if(typeof U.$ref==="string"){Q.set(U.$ref,U);continue}let Z=s0(U.in),X=s0(U.name);if(Z&&X)Q.set(`${Z}:${X}`,U)}return[...Q.values()]}function CJ($,_){let W=t8($.requestBody,_,"requestBodies");if(!h(W)||!h(W.content))return;return M2(W.content)??void 0}function zJ($,_,W){let Q=h($.responses)?$.responses:{},U=k5(Q,W);if(!U)return;let Z=t8(U.response,_,"responses");if(!h(Z)||!h(Z.content))return;return M2(Z.content)??void 0}function LJ($,_){let W=h($.paths)?$.paths:{},Q=MJ($),U=[],Z=new Map;for(let[X,G]of Object.entries(W)){if(!h(G))continue;for(let O of p5){let M=G[O];if(!h(M))continue;let J=s0(M.operationId)??JJ(O,X),Y=HJ(G.parameters,M.parameters).map((F)=>AJ(F,Q)).filter((F)=>Boolean(F)).filter((F)=>F.in===m.Path||F.in===m.Query).map((F)=>{let x=s0(F.name)??"param",w=dM(x,_.paramNaming),N=F.in===m.Path?m.Path:m.Query,G$=h(F.schema)?F.schema:void 0,c=`${x$(J)}${x$(x)}`;return{name:w,variableName:cM(w),wireName:x,location:N,required:F.required===!0||N===m.Path,typeName:u0(G$,Z,c)??o8(G$)}}),A=_.sortParamsByRequiredFlag===!1?Y:Y.sort((F,x)=>Number(!F.required)-Number(!x.required)),E=CJ(M,Q),V=zJ(M,Q,O),z=u0(V,Z,`${x$(J)}Response`)??"unknown",j=u0(E,Z,`${x$(J)}RequestBody`);U.push({operationId:J,method:O.toUpperCase(),path:X,functionName:l5(J),requestName:`${x$(J)}Request`,responseType:z,bodyType:j,parameters:A})}}return{operations:U.sort((X,G)=>X.operationId.localeCompare(G.operationId)),inlineEnumGroups:[...Z.values()].sort((X,G)=>X.name.localeCompare(G.name))}}async function s5($,_,W){return W?V8($,_):$}async function BJ($,_,W,Q,U){let Z=!1,X=i5(_,"models.ts"),G=await s5(n5($,W),X,U);if(await a(X,G))Z=!0;if(Q)r5.step(` \u2713 ${X}`);if(await q1(_,["./models"]))Z=!0;return Z}async function RJ($,_,W,Q,U,Z,X){let G=!1,{operations:O,inlineEnumGroups:M}=LJ($,U),J=new Set(_.enumGroups.map((A)=>A.name)),T={..._,enumGroups:[..._.enumGroups,...M.filter((A)=>!J.has(A.name))]},Y=[["models.ts",n5(T,U)],["runtime.ts",mM()],["api.ts",tM(O,Q,U)]];for(let[A,E]of Y){let V=i5(W,A),z=await s5(E,V,X);if(await a(V,z))G=!0;if(Z)r5.step(` \u2713 ${V}`)}if(await q1(W,["./models","./api"]))G=!0;return G}async function SJ($,_,W,Q,U={}){let Z=EJ(_);try{let X=await KJ.parse($,{validate:{spec:!1}});if(J2(X,{enforceOperationSchemaRefs:!0}),!h(X))throw Error("OpenAPI document must be an object");let G=w5(X);if(W.type===S.TypeScriptModels){let M=await BJ(G,_,W,Q,U.formatFiles!==!1);return{success:!0,service:Z,changed:M}}let O=await RJ(X,G,_,Z,W,Q,U.formatFiles!==!1);return{success:!0,service:Z,changed:O}}catch(X){return{success:!1,service:Z,error:X instanceof Error?X:Error(String(X))}}}function IJ($){if($.success)return{success:!0,service:$.service,changed:$.changed};let _=Error($.message);if($.stack)_.stack=$.stack;return{success:!1,service:$.service,error:_}}function jJ(){let $=new Worker(new URL("./generate-worker.ts",import.meta.url).href),_={worker:$,pending:new Map};return $.onmessage=(W)=>{let Q=_.pending.get(W.data.id);if(!Q)return;_.pending.delete(W.data.id),Q.resolve(IJ(W.data.result))},$.onerror=(W)=>{let Q=Error(W.message||"Kontract worker failed");for(let U of _.pending.values())U.reject(Q);_.pending.clear()},_}function FJ($){let _=Math.max(1,Math.floor($)),W=Array.from({length:_},()=>jJ()),Q=1,U=0;return{run:(G)=>{let O=W[U]??W[0];if(!O)return Promise.reject(Error("Kontract worker pool has no available workers"));U=(U+1)%W.length;let M=Q;Q+=1;let J={id:M,task:G};return new Promise((T,Y)=>{D("worker.tasks"),O.pending.set(M,{resolve:T,reject:Y}),O.worker.postMessage(J)})},close:async()=>{await Promise.all(W.map((G)=>G.worker.terminate()))}}}function wJ($){let _=h0;return h0=$,()=>{h0=_}}function fJ($){return h0?.run($)??null}async function DJ($){if($.kind===R1.OpenApiNestJs)return vM($.inputFile,$.outputDir,$.verbose,$.options);if($.kind===R1.OpenApiSdk)return SJ($.inputFile,$.outputDir,$.generator,$.verbose,{formatFiles:$.formatFiles});return DG($.inputFile,$.outputDir,$.verbose,{sharedTypesImportPath:$.sharedTypesImportPath,sharedTypesOutputFile:$.sharedTypesOutputFile,addressPrefix:$.addressPrefix,formatFiles:$.formatFiles})}async function M8($){return fJ($)??DJ($)}function yJ($){return $.type!==S.AsyncApiNats}function kJ($){return $.type===S.AsyncApiNats}function PJ($){return $.type===S.TypeScriptFetch||$.type===S.TypeScriptAxios||$.type===S.TypeScriptAngular}function bJ($){return PJ($)||$.type===S.TypeScriptModels}function gJ($){let _=$.source?$.config.sources.filter((W)=>W.name===$.source):$.config.sources;if(_.length===0)throw Error(`No kontract source named '${$.source}'`);return _}function vJ($){let _=[];for(let W of gJ($)){let Q=$.target?W.targets.filter((U)=>U.name===$.target):W.targets;for(let U of Q)_.push({sourceName:W.name,targetName:U.name,inputDir:o6(W.input),outputDir:o6(U.output),generator:U.generator})}if($.target&&_.length===0)throw Error(`No kontract target named '${$.target}'`);return _}async function xJ($){let _=new Map;for(let Q of $)if(!_.has(Q.sourceName))_.set(Q.sourceName,Q);let W=[];for(let Q of _.values()){let[U,Z]=await $$("discovery",()=>Promise.all([_5(Q.inputDir),W5(Q.inputDir)]));W.push({sourceName:Q.sourceName,inputDir:Q.inputDir,openApiRoots:U,asyncApiGroups:Z})}return W}function t6($,_){return _?$.filter((W)=>W.name===_):[...$]}async function uJ($,_){if(await J8(_,{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}'`);return{specFile:U,cleanup:null}}let W=F$(_,Q8($.name)),Q=await bX($.files,W);if(!Q.success)throw Q.error;return{specFile:Q.outputPath,cleanup:()=>t5(W,{force:!0})}}async function hJ($,_){let W=d0.get(_);if(W)return D("bundle.cacheCoalescedHits"),W;if(await Bun.file(_).exists())return D("bundle.cacheHits"),{specFile:_,cleanup:null};D("bundle.cacheMisses");let Q=$$("bundle.openapi",async()=>{let U=await aW([$.rootFile],_);if(!U.success)throw U.error;return{specFile:U.outputPath,cleanup:null}});d0.set(_,Q);try{return await Q}finally{d0.delete(_)}}async function dJ($,_,W,Q){if(await J8(_,{recursive:!0}),!await $$("bundle.decision",()=>mJ($.rootFile)))return D("bundle.skippedInternalRefs"),{specFile:$.rootFile,cleanup:null};if(Q){let G=F$(_,hU);await J8(G,{recursive:!0});let O=B1(W).slice(0,24),M=F$(G,Q8(`${$.name}-${O}`));if(await Bun.file(M).exists())return D("bundle.cacheHits"),{specFile:M,cleanup:null};return hJ($,M)}let Z=F$(_,Q8($.name)),X=await $$("bundle.openapi",()=>aW([$.rootFile],Z));if(!X.success)throw X.error;return{specFile:X.outputPath,cleanup:()=>t5(Z,{force:!0})}}function lJ($){return $.match(/\$ref\s*:\s*['"]?([^'"\s]+)['"]?\s*$/)?.[1]??null}function cJ($){return/\$ref\s*:\s*$/.test($)||/\$ref\s*:\s*[|>]/.test($)}function nJ($){for(let _ of $.split(/\r?\n/)){if(!_.includes("$ref"))continue;if(cJ(_))return null;let W=lJ(_);if(!W)return null;if(!W.startsWith("#"))return!0}return!1}async function mJ($){try{let _=nJ(await Bun.file($).text());if(_===null)return D("bundle.ambiguousRefs"),!0;return _}catch{return!0}}function pJ($,_){let W=_.find((Q)=>Q.sourceName===$.sourceName);if(!W)throw Error(`Missing discovery result for source '${$.sourceName}'`);return W}function iJ($){if($.generator.type===S.TypeScriptNestJs)return t.Http;if($.generator.type===S.TypeScriptModels)return t.Models;return t.Sdk}async function rJ($,_,W,Q){if($.generator.type===S.TypeScriptNestJs)return M8({kind:R1.OpenApiNestJs,inputFile:W.specFile,outputDir:_,verbose:Q.verbose,options:{zod:$.generator.zod===!0,dtos:$.generator.dtos===!0,formatFiles:!1}});if(!bJ($.generator))throw Error(`Generator '${$.generator.type}' cannot emit OpenAPI TypeScript`);return M8({kind:R1.OpenApiSdk,inputFile:W.specFile,outputDir:_,generator:$.generator,verbose:Q.verbose,formatFiles:!1})}function sJ($,_,W,Q){let U=iJ($);return{sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,outputDir:$.outputDir,channel:U,run:async()=>{let Z=null,X=_2(W,$),G=F$($.outputDir,_.name),O=await bW([_.rootFile]),M=uW(X,U,_.name);if((await hW({sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,channel:U,generator:$.generator,manifestPath:M,source:O,outputDir:G})).skipped)return{success:!0,service:_.name,changed:!1,skippedByManifest:!0};try{let T=O.safe?FW(W,$.sourceName):X,Y=await dJ(_,T,O.hash,O.safe);Z=Y.cleanup;let A=await rJ($,G,Y,Q);return A.success?{...A,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,channel:U,generator:$.generator,manifestPath:M,source:O,outputDir:G}}:A}finally{if(Z)await Z()}}}}function oJ($,_,W){return{sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,outputDir:$.outputDir,channel:t.Nats,run:async()=>{let Q=null,U=_2(W,$),Z=F$($.outputDir,_.name),X=F$($.outputDir,zW),G=await bW(_.files),O=uW(U,t.Nats,_.name);if((await hW({sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,channel:t.Nats,generator:$.generator,manifestPath:O,source:G,outputDir:Z,additionalOutputDirs:[X]})).skipped)return{success:!0,service:_.name,changed:!1,skippedByManifest:!0};try{let J=await uJ(_,U);Q=J.cleanup;let T=F$(X,"runtime.ts"),Y=NZ(F$(Z,"nats"),T),A=await M8({kind:R1.AsyncApiNats,inputFile:J.specFile,outputDir:Z,verbose:!1,sharedTypesImportPath:Y,sharedTypesOutputFile:T,addressPrefix:$.generator.type===S.AsyncApiNats?$.generator.prefix:void 0,formatFiles:!1});return A.success?{...A,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:_.name,channel:t.Nats,generator:$.generator,manifestPath:O,source:G,outputDir:Z,additionalOutputDirs:[X]}}:A}finally{if(Q)await Q()}}}}function tJ($,_,W,Q){let U=[];for(let Z of $){let X=pJ(Z,_);if(yJ(Z.generator)){let G=t6(X.openApiRoots,Q.specific);U.push(...G.map((O)=>sJ(Z,O,W,Q)))}if(kJ(Z.generator)){let G=t6(X.asyncApiGroups,Q.specific);U.push(...G.map((O)=>oJ(Z,O,W)))}}return U}async function aJ($){let _=vJ($),W=DZ(_),Q=await xJ(_),U=tJ(_,Q,W,$);return{jobs:_,discovered:Q,workItems:U,cacheRoot:W}}function QY($){if($===t.Http)return t.Http;if($===t.Nats)return t.Nats;if($===t.Models)return t.Models;return t.Sdk}async function UY($,_){let W=new Set;for(let Q of $){let U=await HX({cwd:process.cwd(),inputDir:Q.inputDir,outputDir:Q.outputDir,generators:[Q.generator]});for(let Z of U){let X=`${Z.title}
|
|
173
|
-
${
|
|
174
|
-
`));else if(!
|
|
175
|
-
`).map((
|
|
176
|
-
`):void 0}}function
|
|
177
|
-
${
|
|
178
|
-
`,"utf8"),!0}function
|
|
179
|
-
`),0;if(!
|
|
172
|
+
`}function bO($){let Q=c($.components)?$.components:{};return{schemas:c(Q.schemas)?Q.schemas:{},parameters:c(Q.parameters)?Q.parameters:{},requestBodies:c(Q.requestBodies)?Q.requestBodies:{},responses:c(Q.responses)?Q.responses:{}}}function m9($,Q,Z){if(!c($)||typeof $.$ref!=="string")return $;let X=f9($.$ref,Z);return Q[Z][X]}function kO($,Q){return wO(`${$} ${Q.replaceAll("{","").replaceAll("}","").replace(/\//g," ")}`)}function PO($){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 fO($,Q,Z){let X=L1(Q),U=$.get(X);if(U){if(!(U.values.length===Z.length&&U.values.every((J,G)=>J===Z[G])))throw Error(`Inline SDK enum name collision for '${X}'`);return`Models.${L1(U.name)}`}return $.set(X,{name:X,schemaPath:`sdk:inline:${X}`,values:Z,members:Z.map((W)=>({key:JX(W),value:W}))}),`Models.${X}`}function Q8($,Q,Z){if(!$)return null;if(typeof $.$ref==="string")return`Models.${L1(f9($.$ref,"schemas"))}`;let X=PO($);if(X)return fO(Q,Z,X);if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let U=c($.items)?$.items:void 0;return`Array<${Q8(U,Q,`${Z}Item`)??d9(U)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function yO($,Q){let Z=m9($,Q,"parameters");return c(Z)?Z:null}function vO($,Q){let Z=[...Array.isArray($)?$:[],...Array.isArray(Q)?Q:[]],X=new Map;for(let U of Z){if(!c(U))continue;if(typeof U.$ref==="string"){X.set(U.$ref,U);continue}let W=H8(U.in),J=H8(U.name);if(W&&J)X.set(`${W}:${J}`,U)}return[...X.values()]}function xO($,Q){let Z=m9($.requestBody,Q,"requestBodies");if(!c(Z)||!c(Z.content))return;return F8(Z.content)??void 0}function gO($,Q,Z){let X=c($.responses)?$.responses:{},U=bX(X,Z);if(!U)return;let W=m9(U.response,Q,"responses");if(!c(W)||!c(W.content))return;return F8(W.content)??void 0}function hO($,Q){let Z=c($.paths)?$.paths:{},X=bO($),U=[],W=new Map;for(let[J,G]of Object.entries(Z)){if(!c(G))continue;for(let _ of pX){let Y=G[_];if(!c(Y))continue;let z=H8(Y.operationId)??kO(_,J),V=vO(G.parameters,Y.parameters).map((I)=>yO(I,X)).filter((I)=>Boolean(I)).filter((I)=>I.in===e.Path||I.in===e.Query).map((I)=>{let y=H8(I.name)??"param",N=YO(y,Q.paramNaming),w=I.in===e.Path?e.Path:e.Query,l=c(I.schema)?I.schema:void 0,v=`${L1(z)}${L1(y)}`;return{name:N,variableName:HO(N),wireName:y,location:w,required:I.required===!0||w===e.Path,typeName:Q8(l,W,v)??d9(l)}}),O=Q.sortParamsByRequiredFlag===!1?V:V.sort((I,y)=>Number(!I.required)-Number(!y.required)),K=xO(Y,X),L=gO(Y,X,_),q=Q8(L,W,`${L1(z)}Response`)??"unknown",S=Q8(K,W,`${L1(z)}RequestBody`);U.push({operationId:z,method:_.toUpperCase(),path:J,functionName:uX(z),requestName:`${L1(z)}Request`,responseType:q,bodyType:S,parameters:O})}}return{operations:U.sort((J,G)=>J.operationId.localeCompare(G.operationId)),inlineEnumGroups:[...W.values()].sort((J,G)=>J.name.localeCompare(G.name))}}async function iX($,Q,Z){return Z?Y9($,Q):$}async function lO($,Q,Z,X,U){let W=!1,J=cX(Q,"models.ts"),G=await iX(mX($,Z),J,U);if(await J$(J,G))W=!0;if(X)nX.step(` \u2713 ${J}`);if(await L0(Q,["./models"]))W=!0;return W}async function pO($,Q,Z,X,U,W,J){let G=!1,{operations:_,inlineEnumGroups:Y}=hO($,U),z=new Set(Q.enumGroups.map((O)=>O.name)),H={...Q,enumGroups:[...Q.enumGroups,...Y.filter((O)=>!z.has(O.name))]},V=[["models.ts",mX(H,U)],["runtime.ts",OO()],["api.ts",MO(_,X,U)]];for(let[O,K]of V){let L=cX(Z,O),q=await iX(K,L,J);if(await J$(L,q))G=!0;if(W)nX.step(` \u2713 ${L}`)}if(await L0(Z,["./models","./api"]))G=!0;return G}async function cO($,Q,Z,X,U={}){let W=dO(Q);try{let J=await mO.parse($,{validate:{spec:!1}});if(I8(J,{enforceOperationSchemaRefs:!0}),!c(J))throw Error("OpenAPI document must be an object");let G=IX(J);if(Z.type===R.TypeScriptModels){let Y=await lO(G,Q,Z,X,U.formatFiles!==!1);return{success:!0,service:W,changed:Y}}let _=await pO(J,G,Q,W,Z,X,U.formatFiles!==!1);return{success:!0,service:W,changed:_}}catch(J){return{success:!1,service:W,error:J instanceof Error?J:Error(String(J))}}}function iO($){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 rO(){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(iO(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 oO($){let Q=Math.max(1,Math.floor($)),Z=Array.from({length:Q},()=>rO()),X=1,U=0;return{run:(G)=>{let _=Z[U]??Z[0];if(!_)return Promise.reject(Error("Kontract worker pool has no available workers"));U=(U+1)%Z.length;let Y=X;X+=1;let z={id:Y,task:G};return new Promise((H,V)=>{k("worker.tasks"),_.pending.set(Y,{resolve:H,reject:V}),_.worker.postMessage(z)})},close:async()=>{await Promise.all(Z.map((G)=>G.worker.terminate()))}}}function aO($){let Q=Z8;return Z8=$,()=>{Z8=Q}}function sO($){return Z8?.run($)??null}async function i5($){if($.kind===K0.OpenApiNestJs)return WO($.inputFile,$.outputDir,$.verbose,$.options);if($.kind===K0.OpenApiSdk)return cO($.inputFile,$.outputDir,$.generator,$.verbose,{formatFiles:$.formatFiles});return tz($.inputFile,$.outputDir,$.verbose,{sharedTypesImportPath:$.sharedTypesImportPath,sharedTypesOutputFile:$.sharedTypesOutputFile,addressPrefix:$.addressPrefix,formatFiles:$.formatFiles})}async function $9($){let Q=sO($);if(!Q)return i5($);try{return await Q}catch{return k("worker.fallbacks"),i5($)}}function eO($){return $.type!==R.AsyncApiNats}function $K($){return $.type===R.AsyncApiNats}function QK($){return $.type===R.TypeScriptFetch||$.type===R.TypeScriptAxios||$.type===R.TypeScriptAngular}function ZK($){return QK($)||$.type===R.TypeScriptModels}function XK($){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 UK($){let Q=[];for(let Z of XK($)){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:r5(Z.input),outputDir:r5(U.output),generator:U.generator})}if($.target&&Q.length===0)throw Error(`No kontract target named '${$.target}'`);return Q}async function WK($){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,W]=await Y$("discovery",()=>Promise.all([eZ(X.inputDir),$X(X.inputDir)]));Z.push({sourceName:X.sourceName,inputDir:X.inputDir,openApiRoots:U,asyncApiGroups:W})}return Z}function o5($,Q){return Q?$.filter((Z)=>Z.name===Q):[...$]}async function JK($,Q){if(await Q9(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}'`);return{specFile:U,cleanup:null}}let Z=e$(Q,r6($.name)),X=await Xz($.files,Z);if(!X.success)throw X.error;return{specFile:X.outputPath,cleanup:()=>oX(Z,{force:!0})}}async function GK($,Q){let Z=X8.get(Q);if(Z)return k("bundle.cacheCoalescedHits"),Z;if(await Bun.file(Q).exists())return k("bundle.cacheHits"),{specFile:Q,cleanup:null};k("bundle.cacheMisses");let X=Y$("bundle.openapi",async()=>{let U=await aZ([$.rootFile],Q);if(!U.success)throw U.error;return{specFile:U.outputPath,cleanup:null}});X8.set(Q,X);try{return await X}finally{X8.delete(Q)}}async function _K($,Q,Z,X){if(await Q9(Q,{recursive:!0}),!await Y$("bundle.decision",()=>VK($.rootFile)))return k("bundle.skippedInternalRefs"),{specFile:$.rootFile,cleanup:null};if(X){let G=e$(Q,_4);await Q9(G,{recursive:!0});let _=O0(Z).slice(0,24),Y=e$(G,r6(`${$.name}-${_}`));if(await Bun.file(Y).exists())return k("bundle.cacheHits"),{specFile:Y,cleanup:null};return GK($,Y)}let W=e$(Q,r6($.name)),J=await Y$("bundle.openapi",()=>aZ([$.rootFile],W));if(!J.success)throw J.error;return{specFile:J.outputPath,cleanup:()=>oX(W,{force:!0})}}function YK($){return $.match(/\$ref\s*:\s*['"]?([^'"\s]+)['"]?\s*$/)?.[1]??null}function zK($){return/\$ref\s*:\s*$/.test($)||/\$ref\s*:\s*[|>]/.test($)}function HK($){for(let Q of $.split(/\r?\n/)){if(!Q.includes("$ref"))continue;if(zK(Q))return null;let Z=YK(Q);if(!Z)return null;if(!Z.startsWith("#"))return!0}return!1}async function VK($){try{let Q=HK(await Bun.file($).text());if(Q===null)return k("bundle.ambiguousRefs"),!0;return Q}catch{return!0}}function OK($,Q){let Z=Q.find((X)=>X.sourceName===$.sourceName);if(!Z)throw Error(`Missing discovery result for source '${$.sourceName}'`);return Z}function KK($){if($.generator.type===R.TypeScriptNestJs)return W$.Http;if($.generator.type===R.TypeScriptModels)return W$.Models;return W$.Sdk}async function qK($,Q,Z,X){if($.generator.type===R.TypeScriptNestJs)return $9({kind:K0.OpenApiNestJs,inputFile:Z.specFile,outputDir:Q,verbose:X.verbose,options:{zod:$.generator.zod===!0,dtos:$.generator.dtos===!0,formatFiles:!1}});if(!ZK($.generator))throw Error(`Generator '${$.generator.type}' cannot emit OpenAPI TypeScript`);return $9({kind:K0.OpenApiSdk,inputFile:Z.specFile,outputDir:Q,generator:$.generator,verbose:X.verbose,formatFiles:!1})}function LK($,Q,Z,X){let U=KK($);return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:U,run:async()=>{let W=null,J=B8(Z,$),G=e$($.outputDir,Q.name),_=await PZ([Q.rootFile]),Y=xZ(J,U,Q.name);if((await gZ({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:U,generator:$.generator,manifestPath:Y,source:_,outputDir:G})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let H=_.safe?FZ(Z,$.sourceName):J,V=await _K(Q,H,_.hash,_.safe);W=V.cleanup;let O=await qK($,G,V,X);return O.success?{...O,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:U,generator:$.generator,manifestPath:Y,source:_,outputDir:G}}:O}finally{if(W)await W()}}}}function BK($,Q,Z){return{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,outputDir:$.outputDir,channel:W$.Nats,run:async()=>{let X=null,U=B8(Z,$),W=e$($.outputDir,Q.name),J=e$($.outputDir,KZ),G=await PZ(Q.files),_=xZ(U,W$.Nats,Q.name);if((await gZ({sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:W$.Nats,generator:$.generator,manifestPath:_,source:G,outputDir:W,additionalOutputDirs:[J]})).skipped)return{success:!0,service:Q.name,changed:!1,skippedByManifest:!0};try{let z=await JK(Q,U);X=z.cleanup;let H=e$(J,"runtime.ts"),V=e4(e$(W,"nats"),H),O=await $9({kind:K0.AsyncApiNats,inputFile:z.specFile,outputDir:W,verbose:!1,sharedTypesImportPath:V,sharedTypesOutputFile:H,addressPrefix:$.generator.type===R.AsyncApiNats?$.generator.prefix:void 0,formatFiles:!1});return O.success?{...O,manifest:{sourceName:$.sourceName,targetName:$.targetName,serviceName:Q.name,channel:W$.Nats,generator:$.generator,manifestPath:_,source:G,outputDir:W,additionalOutputDirs:[J]}}:O}finally{if(X)await X()}}}}function AK($,Q,Z,X){let U=[];for(let W of $){let J=OK(W,Q);if(eO(W.generator)){let G=o5(J.openApiRoots,X.specific);U.push(...G.map((_)=>LK(W,_,Z,X)))}if($K(W.generator)){let G=o5(J.asyncApiGroups,X.specific);U.push(...G.map((_)=>BK(W,_,Z)))}}return U}async function MK($){let Q=UK($),Z=t4(Q),X=await WK(Q),U=AK(Q,X,Z,$);return{jobs:Q,discovered:X,workItems:U,cacheRoot:Z}}function CK($){if($===W$.Http)return W$.Http;if($===W$.Nats)return W$.Nats;if($===W$.Models)return W$.Models;return W$.Sdk}async function FK($,Q){let Z=new Set;for(let X of $){let U=await v3({cwd:process.cwd(),inputDir:X.inputDir,outputDir:X.outputDir,generators:[X.generator]});for(let W of U){let J=`${W.title}
|
|
173
|
+
${W.details??""}`;if(Z.has(J))continue;Z.add(J),Q(W.title,W.details)}}}async function IK($,Q,Z,X){let U=[...X,...$.map((W)=>B8(Z,W)),...eX($,Z),...Q.map((W)=>Z9(W.outputDir,W.serviceName))];await Promise.all(U.map((W)=>TK(W,{recursive:!0}))),await Promise.all(X.map((W)=>sX(Z9(W,".cache"),{recursive:!0,force:!0})))}function tX($){return[...new Set($)].sort((Q,Z)=>Q.localeCompare(Z))}function DK($){let Q=tX($.map((X)=>SK(X))).sort((X,U)=>X.length-U.length||X.localeCompare(U)),Z=[];for(let X of Q){if(Z.some((U)=>L8(U,X)))continue;Z.push(X)}return Z}function eX($,Q){let Z=$.filter((X)=>X.generator.type!==R.AsyncApiNats).map((X)=>X.sourceName);return tX(Z.map((X)=>FZ(Q,X)))}async function RK($,Q,Z,X){let U=[...$.map((J)=>B8(Q,J)),...eX($,Q)],W=DK([...Z,...U]);X.printStep("Cleaning selected generated outputs and Kontract cache..."),await Promise.all(W.map((J)=>sX(J,{recursive:!0,force:!0})))}function NK($,Q,Z,X,U,W){let J=0,G=(Y,z)=>{if(J+=1,z===d1.Generated)$.generatedCount+=1;if(z===d1.Unchanged)$.unchangedCount+=1;if(z===d1.Failed)$.failedCount+=1;let H=`Generating contracts (${J}/${Q.length}) \u2022 ${Y.sourceName}/${Y.targetName}/${Y.serviceName} (${CK(Y.channel)}, ${z})`;if(Z){Z.message(H);return}if(!X&&U)W(H)},_=(Y,z)=>{$.failures.push(g3(`${Y.sourceName}/${Y.targetName}/${Y.serviceName}`,z)),G(Y,d1.Failed)};return async(Y)=>{try{let z=await Y.run();if($.results.push(z),z.success){if(z.skippedByManifest)k("generation.manifestSkipped");else $.touchedServiceDirs.add(Z9(Y.outputDir,Y.serviceName));if(z.manifest)$.pendingManifestWrites.push(z.manifest);if(z.changed)$.changedOutputRoots.add(Y.outputDir);return G(Y,z.changed?d1.Generated:d1.Unchanged),!0}return _(Y,z.error.message),!1}catch(z){let H=z instanceof Error?z:Error(String(z));return $.results.push({success:!1,service:Y.serviceName,error:H}),_(Y,H.message),!1}}}async function wK($,Q,Z,X,U){if(Q)Q.message("Formatting generated contracts...");else if(!Z&&X)U.printStep("Formatting generated contracts...");for(let W of $){let J=await r4(W);if(!J.success)throw Error([`Could not run post-generation Biome format pass for ${CZ(W)}.`,J.details].filter(Boolean).join(`
|
|
174
|
+
`));else if(!Z&&X&&J.details)U.printInfo(J.details)}}async function bK($){let Q=[];for(let Z of $)try{if((await jK(Z)).isDirectory())Q.push(Z)}catch(X){if(X instanceof Error&&"code"in X&&X.code==="ENOENT")continue;throw X}return Q}function kK($,Q,Z){let X=$.find((U)=>L8(U,Z));if(X)Q.changedOutputRoots.add(X)}function PK(){return{results:[],touchedServiceDirs:new Set,changedOutputRoots:new Set,pendingManifestWrites:[],failures:[],generatedCount:0,unchangedCount:0,failedCount:0}}function fK($){return[...new Set($.map((Q)=>Q.outputDir))].sort((Q,Z)=>Q.localeCompare(Z))}async function yK($,Q){let Z=await Promise.all([...$.touchedServiceDirs].map(async(X)=>({serviceDir:X,changed:await v4(X)})));for(let X of Z)if(X.changed)kK(Q,$,X.serviceDir)}async function vK($,Q){let Z=await Promise.all(Q.map(async(U)=>({outputRoot:U,changed:await x4(U)}))),X=await Promise.all(Q.map(async(U)=>({outputRoot:U,changed:await h4(U)})));for(let U of[...Z,...X])if(U.changed)$.changedOutputRoots.add(U.outputRoot)}async function xK($,Q,Z,X,U){let W=[...$.changedOutputRoots],J=await bK(W);if(J.length===0)return;k("format.changedOutputRoots",J.length),await wK(J,Q,Z,X,U)}async function gK($){if($.pendingManifestWrites.length===0)return;await Promise.all($.pendingManifestWrites.map((Q)=>z3(Q)))}function hK($){return $>1&&process.env[JZ]!=="1"&&process.env[z4]!=="1"}function uK($){if(!hK($))return k("worker.disabled"),null;try{let Q=oO($);return k("worker.enabled"),k("worker.count",$),Q}catch(Q){k("worker.startFailures");let Z=Q instanceof Error?Q.message:String(Q);throw Error(`Could not start Kontract worker pool: ${Z}. Set ${JZ}=1 to run on the main thread.`)}}function dK($,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 W of $.failures)X.printFailure(W)}async function mK($){let Q=C4($.metrics??null);try{return await lK($)}finally{Q()}}async function lK($){let{concurrency:Q,verbose:Z,quiet:X}=$,U=X?null:await import("@clack/prompts"),W=U?.spinner(V1("purple"))??null,J=h3(X,U),{printStep:G,printInfo:_,printFailure:Y}=J,z;try{z=await Y$("plan",()=>MK($))}catch(N){let w=N instanceof Error?N:Error(String(N));return Y({title:`\u2717 ${w.message}`}),1}let{jobs:H,workItems:V,cacheRoot:O}=z,K=H.map((N)=>`${N.sourceName}/${N.targetName} \u2192 ${CZ(N.outputDir)}`).join(", ");if(G(`Kontract generate: ${K}`),V.length===0)return _("No schema files found for selected sources and targets."),0;await Y$("dependencyWarnings",()=>FK(H,J.printWarning));let L=fK(H);if($.clean===!0)await Y$("clean",()=>RK(H,O,L,J));let q=PK();if(W)W.start(`Generating contracts (0/${V.length})...`);await Y$("prepareOutputDirectories",()=>IK(H,V,O,L));let S=NK(q,V,W,X,Z,G),I=uK(Q),y=aO(I);try{await Y$("processItems",()=>n6(V,S,Q))}finally{y(),await I?.close()}await Y$("barrels",async()=>{if(q.touchedServiceDirs.size===0&&q.changedOutputRoots.size===0){k("barrels.skipped");return}await yK(q,L),await vK(q,L)});try{await Y$("format",()=>xK(q,W,X,Z,J)),await Y$("manifest.write",()=>gK(q))}catch(N){let w=N instanceof Error?N:Error(String(N));q.failures.push({title:`\u2717 ${w.message}`}),q.failedCount+=1}return dK(q,W,X,J),q.failedCount>0?1:0}function oK($,Q){let Z=Q.split(`
|
|
175
|
+
`).map((W)=>W.trim()).filter((W)=>W.length>0),[X="Unexpected error",...U]=Z;return{title:`\u274C ${$}: ${X}`,details:U.length>0?U.join(`
|
|
176
|
+
`):void 0}}function aK($){return $.type!==R.AsyncApiNats}function sK($){return $.type===R.AsyncApiNats}function tK($){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 W=$.target?U.targets.filter((G)=>G.name===$.target):U.targets;if(W.length>0)X=!0;let J=W.map((G)=>G.generator);Z.push({source:U,inputDir:iK(U.input),validateOpenApi:J.some(aK),validateAsyncApi:J.some(sK)})}if($.target&&!X)throw Error(`No kontract target named '${$.target}'`);return Z.filter((U)=>U.validateOpenApi||U.validateAsyncApi)}async function eK($){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 $q($){try{let Q=await rK.parse($,{validate:{spec:!1}});return I8(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 Qq($,Q){return{printStep:(W)=>{if($)return;if(Q){Q.log.step(W,U$("step"));return}s2.step(W)},printInfo:(W)=>{if($)return;if(Q){Q.log.info(W,U$("info"));return}s2.info(W)},printFailure:(W)=>{if(!$&&Q){if(Q.log.error(W.title,{...U$("error"),symbol:"\u274C"}),W.details)Q.note(W.details,"Details",w$("dim"));return}if(s2.error(W.title),W.details)s2.error(W.details)}}}async function Zq($){let Q=[],Z=[];for(let X of $){if(X.validateOpenApi){let U=await eZ(X.inputDir);Q.push(...U.map((W)=>W.rootFile))}if(X.validateAsyncApi){let U=await $X(X.inputDir);Z.push(...U.flatMap((W)=>W.files))}}return{openApiFiles:Q,asyncApiFiles:Z}}function Xq($){let Q=$.filter((W)=>W.success&&W.kind===b$.OpenApi).length,Z=$.filter((W)=>!W.success&&W.kind===b$.OpenApi).length,X=$.filter((W)=>W.success&&W.kind===b$.AsyncApi).length,U=$.filter((W)=>!W.success&&W.kind===b$.AsyncApi).length;return{summary:`OpenAPI: ${Q} passed, ${Z} failed | AsyncAPI: ${X} passed, ${U} failed`,failedCount:Z+U}}function a5($,Q,Z){return async(X)=>{let U=await Q(X);Z.results.push(U);let W=nK(X);if(U.success)return Z.updateProgress(W,$,X9.Passed),!0;return Z.failures.push(oK(`${W} (${$})`,U.error.message)),Z.updateProgress(W,$,X9.Failed),U.success}}function Uq($,Q,Z,X,U){let W=0;return(J,G,_)=>{W+=1;let Y=`Validating schemas (${W}/${$}) \u2022 ${J} (${G}, ${_})`;if(Q){Q.message(Y);return}if(!Z&&X)U(Y)}}function Wq($,Q,Z,X,U){if(Z){if(Q>0)Z.error($);else Z.stop($);return}if(!X)U($)}async function Jq($){let{concurrency:Q,verbose:Z,quiet:X}=$,U=X?null:await import("@clack/prompts"),W=U?.spinner(V1("purple"))??null,{printStep:J,printInfo:G,printFailure:_}=Qq(X,U),Y;try{Y=tK($)}catch(q){let S=q instanceof Error?q:Error(String(q));return _({title:`\u2717 ${S.message}`}),1}J(`Kontract validate: ${Y.map((q)=>q.source.name).join(", ")}`);let z,H;try{({openApiFiles:z,asyncApiFiles:H}=await Zq(Y))}catch(q){let S=q instanceof Error?q:Error(String(q));return _({title:`\u2717 ${S.message}`}),1}let V=z.length+H.length;if(V===0)return G("No schema files found for selected sources and targets."),0;if(W)W.start(`Validating schemas (0/${V})...`);let O={results:[],failures:[],updateProgress:Uq(V,W,X,Z,J)};await Promise.all([n6(z,a5(b$.OpenApi,$q,O),Q),n6(H,a5(b$.AsyncApi,eK,O),Q)]);let{summary:K,failedCount:L}=Xq(O.results);if(Wq(K,L,W,X,J),O.failures.length>0)for(let q of O.failures)_(q);return L>0?1:0}function Oq($){let Q=t5($,V4);if(!s5(t5($,".git")))return!1;let Z=`${XZ}/${H4}`,X=s5(Q)?Yq(Q,"utf8"):"";if(X.split(/\r?\n/).includes(Z))return!1;return _q(Vq(Q),{recursive:!0}),zq(Q,`${X.trimEnd()}
|
|
177
|
+
${Z}
|
|
178
|
+
`,"utf8"),!0}function Kq($){let{cwd:Q,json:Z,quiet:X}=$,U=$.writeOutput??((J)=>{Hq(1,J)});x0(R5,{cwd:Q});let W=Oq(Q);if(Z)return U(`${JSON.stringify({ok:!0,command:"kontract init",data:{activated:R5,excludeUpdated:W,hint:N5},warnings:[],error:null},null,2)}
|
|
179
|
+
`),0;if(!X)P("Kontract is now active for this workspace.",{details:N5});return 0}function Iq($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function a0($,Q){if(!Iq($))throw Error(`${Q} must be an object`);return $}function O8($,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 e5($,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 B1($,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 ZU($,Q){if(!Array.isArray($)||$.length===0)throw Error(`${Q} must be a non-empty array`);return $}function A1($,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 Dq($){for(let Q of Mq)if(Q in $)throw Error(`kontract.${Q} is not supported. Use kontract.sources[].targets[]`)}function U8($,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 W of Z)if(U===W)return W;throw Error(`${X}.${Q} must be one of: ${Z.join(", ")}`)}function t2($,Q){return{useSingleRequestParameter:B1($,"useSingleRequestParameter",Q),stringEnums:B1($,"stringEnums",Q),enumUnknownDefaultCase:B1($,"enumUnknownDefaultCase",Q),modelPropertyNaming:U8($,"modelPropertyNaming",BZ,Q),paramNaming:U8($,"paramNaming",AZ,Q),enumPropertyNaming:U8($,"enumPropertyNaming",MZ,Q),sortModelPropertiesByRequiredFlag:B1($,"sortModelPropertiesByRequiredFlag",Q),sortParamsByRequiredFlag:B1($,"sortParamsByRequiredFlag",Q)}}function Rq($,Q){let Z=B1($,"dto",Q),X=B1($,"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 Nq($,Q){let Z=U8($,"type",c6,Q);if(!Z)throw Error(`${Q}.type must be one of: ${c6.join(", ")}`);if(Z===R.AsyncApiNats)return A1($,jq,Q),{type:Z,prefix:e5($,"prefix",Q)};if(Z===R.TypeScriptNestJs)return A1($,Sq,Q),{type:Z,...t2($,Q),dtos:Rq($,Q),zod:B1($,"zod",Q)};if(Z===R.TypeScriptAngular)return A1($,Cq,Q),{type:Z,...t2($,Q),providedIn:e5($,"providedIn",Q)};if(Z===R.TypeScriptModels)return A1($,Fq,Q),{type:Z,...t2($,Q)};return A1($,QU,Q),{type:Z,...t2($,Q)}}function wq($,Q){let Z=a0($,Q);A1(Z,Tq,Q);let X=Nq(a0(Z.generator,`${Q}.generator`),`${Q}.generator`);return{name:O8(Z,"name",Q),output:O8(Z,"output",Q),generator:X}}function bq($,Q){let Z=a0($,Q);A1(Z,Eq,Q);let X=ZU(Z.targets,`${Q}.targets`).map((U,W)=>wq(U,`${Q}.targets[${W}]`));return{name:O8(Z,"name",Q),input:O8(Z,"input",Q),targets:X}}function $Z($,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 kq($){let Q=Aq($),Z=a0(Q,"sumr.yaml"),X=a0(Z.kontract,"kontract");Dq(X),A1(X,["sources"],"kontract");let U=ZU(X.sources,"kontract.sources").map((J,G)=>bq(J,`kontract.sources[${G}]`));$Z(U,"source");let W=U.flatMap((J)=>J.targets);return $Z(W,"target"),{sources:U}}function Pq($){let Q=Bq($,I5);if(!qq(Q))throw Error(`${I5} not found. Define kontract.sources[].targets[]`);let Z=Lq(Q,"utf8");return kq(Z)}function QZ($,Q,Z){if(Z&&!Z.startsWith("-"))return $[Q]=Z,!0;return $[Q]=!0,!1}function xq($,Q,Z,X){if($.startsWith("--")){let U=$.indexOf("=");if(U!==-1)return Z[$.slice(2,U)]=$.slice(U+1),!1;return QZ(Z,$.slice(2),Q)}if($.startsWith("-")&&$.length===2)return QZ(Z,$.slice(1),Q);return X.push($),!1}function l9($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let U=$[X];if(!U)continue;if(xq(U,$[X+1],Q,Z))X+=1}return{positionals:Z,options:Q}}function l1($,Q){for(let Z of Q){let X=$[Z];if(typeof X==="string")return X}return}function n1($,Q){return Q.some((Z)=>$[Z]===!0)}function p9($,Q){if(Q.length===0)return 0;return i("sumr kontract"),K$(`Use \`sumr kontract ${$}\` with flags only.`),1}function XU(){try{return Pq(process.cwd())}catch($){let Q=$ instanceof Error?$.message:String($);return i("sumr kontract"),K$(`Kontract config error: ${Q}`),null}}async function gq($){let Q=l9($.argv.slice(1)),Z=p9("generate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=XU();if(!U)return 1;let W=n1(Q.options,["quiet"])||X;if(!W)i("sumr kontract");let{runGenerate:J}=await Promise.resolve().then(()=>(pK(),aX));return J({config:U,concurrency:Number(l1(Q.options,["max-concurrent","concurrency","c"])??U9),source:l1(Q.options,["source"]),target:l1(Q.options,["target"]),specific:l1(Q.options,["specific","s"]),clean:n1(Q.options,["clean"]),verbose:n1(Q.options,["verbose"]),quiet:W})}async function hq($){let Q=l9($.argv.slice(1)),Z=p9("init",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=n1(Q.options,["quiet"])||X,W=n1(Q.options,["json"]);if(!U&&!W)i("sumr kontract");return Kq({cwd:process.cwd(),json:W,quiet:U})}async function uq($){let Q=l9($.argv.slice(1)),Z=p9("validate",Q.positionals);if(Z!==0)return Z;let X=process.env.CI==="true",U=XU();if(!U)return 1;let W=n1(Q.options,["quiet"])||X;if(!W)i("sumr kontract");let{runValidate:J}=await Promise.resolve().then(()=>(Gq(),$U));return J({config:U,concurrency:Number(l1(Q.options,["concurrency","c"])??U9),source:l1(Q.options,["source"]),target:l1(Q.options,["target"]),verbose:n1(Q.options,["verbose"]),quiet:W})}var Z4,X4=($)=>$,ZZ=($,Q)=>{for(var Z in Q)Z4($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:U4.bind(Q,Z)})},M=($,Q)=>()=>($&&(Q=$($=0)),Q),F5="biome",U9,I5="sumr.yaml",J4="SUMR_CACHE_DIR",XZ=".sumr-cache",UZ="kontract",G4="manifests",_4="bundle-cache",Y4="source-cache",WZ=1,JZ="KONTRACT_DISABLE_WORKERS",z4="KONTRACT_FORCE_MAIN_THREAD",D5="0.0.0",H4="activations.json",R5="kontract",V4=".git/info/exclude",N5="Run `sumr playbook sync` to install Kontract AI guidance into your AI tools.",O4="**/*.openapi.{yml,yaml}",K4="**/*.asyncapi.{yml,yaml}",q4="_bundle.yml",L4="@redocly/cli@2.28.1",B4="KONTRACT_DISABLE_REDOCLY_CORE",A4="application/json",M4="*/*",GZ,_Z,YZ,zZ,HZ,VZ="openapi:",E4="asyncapi:",OZ=".dto.ts",T4="index.ts",j4="shared.ts",W9="index.ts",KZ="shared",qZ="<auto-generated>",LZ,Z$,R,c6,BZ,AZ,MZ,b$,W$,C1,e2=null,K8,SZ,q8,V9,hZ,H3="sha256:",uZ,dZ,i0=null,o2=null,mZ,d1,V3,x3,u3=()=>{},b5=2,Uz=150,o6,k5,Wz,QX,K0,ZX,Hz=`export interface IMsgContext {
|
|
180
180
|
userId: string;
|
|
181
181
|
orgId: string;
|
|
182
|
-
}`,
|
|
182
|
+
}`,Vz=`export interface IRouteContract<Req, Res> {
|
|
183
183
|
request: Req;
|
|
184
184
|
response: Res;
|
|
185
|
-
}`,
|
|
185
|
+
}`,Oz=`export type IRouteContracts = Record<
|
|
186
186
|
string,
|
|
187
187
|
IRouteContract<unknown, unknown>
|
|
188
|
-
>;`,
|
|
188
|
+
>;`,Kz=`export interface IRawClientProxy {
|
|
189
189
|
emit<TResult = unknown, TInput = unknown>(
|
|
190
190
|
router: unknown,
|
|
191
191
|
message: TInput,
|
|
@@ -196,7 +196,7 @@ ${W}
|
|
|
196
196
|
message: TInput,
|
|
197
197
|
...extra: unknown[]
|
|
198
198
|
): Observable<TResult>;
|
|
199
|
-
}`,
|
|
199
|
+
}`,qz=`export interface IClientProxy<
|
|
200
200
|
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> } = IRouteContracts,
|
|
201
201
|
> {
|
|
202
202
|
emit<Route extends keyof TRoutes & string>(
|
|
@@ -219,7 +219,7 @@ ${W}
|
|
|
219
219
|
message: Req,
|
|
220
220
|
ctx?: IMsgContext,
|
|
221
221
|
): Observable<Res>;
|
|
222
|
-
}`,
|
|
222
|
+
}`,Lz=`class RouteTypedClientProxy<
|
|
223
223
|
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
|
|
224
224
|
> implements IClientProxy<TRoutes> {
|
|
225
225
|
constructor(private readonly client: IRawClientProxy) {}
|
|
@@ -265,19 +265,19 @@ export function createRouteTypedClientProxy<
|
|
|
265
265
|
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
|
|
266
266
|
>(client: IRawClientProxy): IClientProxy<TRoutes> {
|
|
267
267
|
return new RouteTypedClientProxy<TRoutes>(client);
|
|
268
|
-
}`,
|
|
268
|
+
}`,Bz=`export interface CommandReturnType {
|
|
269
269
|
commandId: string;
|
|
270
|
-
}`,
|
|
271
|
-
`)}),
|
|
272
|
-
`)})
|
|
273
|
-
`));let W=$.flow?.preset,Q=W&&J_(W)?W:T$.Basic,U=$.flow?.steps?.length?$.flow.steps.map(gA):N9[Q];return{preset:Q,steps:U}}function K2($){let _=fA($),W=PA(_.steps);return{preset:_.preset,hash:DA(_.preset,W),steps:W.map((Q)=>({uses:Q.uses,enabled:Q.enabled??!0,advance:Q.advance??K.Manual,status:Q.enabled===!1?C$.Skipped:C$.Pending}))}}function DA($,_){return IA("sha256").update(JSON.stringify({preset:$,steps:_})).digest("hex").slice(0,12)}function NA($){if(!$.flow)return $;let _=$.flow.steps.map((W)=>{let Q=W.enabled?uA($,W.uses):C$.Skipped,U=hA($,W.uses)??W.artifactPath,Z=Q!==W.status||U!==W.artifactPath?new Date().toISOString():W.updatedAt;return{...W,status:Q,artifactPath:U,updatedAt:Z}});return{...$,flow:{...$.flow,steps:_}}}function yA($){if(!$.flow)return;let _=$.flow.steps.find((Q)=>Q.enabled&&Q.status!==C$.Done);if(!_)return"Close the mission.";if(_.status===C$.Blocked)return`Resolve blocked step: ${Q_(_.uses).label}.`;let W=Q_(_.uses);if(_.advance===K.Human)return`${W.nextAction} Human approval required.`;if(_.advance===K.Ask)return`${W.nextAction} Ask before continuing.`;return W.nextAction}function B2($){return $.steps.map((_)=>{let W=[];if(!_.enabled||_.status===C$.Skipped)W.push(C$.Skipped);if(_.advance!==K.Auto)W.push(_.advance);return W.length>0?`${_.uses}(${W.join(", ")})`:_.uses}).join(" -> ")}function R2($){let _=[],W=$?.preset;if(W&&!J_(W))_.push(`Unknown Mission flow preset: ${W}`);for(let[Q,U]of($?.steps??[]).entries()){if(!f9(U.uses))_.push(`Unknown Mission action at flow.steps[${Q}]: ${U.uses}`);if(U.advance&&!D9(U.advance))_.push(`Invalid advance at flow.steps[${Q}]: ${U.advance}`)}return _}function kA($){return N9[$].map((_)=>({..._}))}function PA($){return $.map((_)=>({uses:_.uses,enabled:_.enabled,advance:_.advance??bA(_.uses)}))}function bA($){return Q_($).externalWrite?K.Human:K.Manual}function gA($){if(!f9($.uses))throw Error(`Unknown Mission action: ${$.uses}`);let{advance:_}=$;return{uses:$.uses,enabled:$.enabled,advance:vA(_)}}function vA($){if(!$)return;if(D9($))return $;throw Error(`Invalid Mission flow advance: ${$}`)}function uA($,_){if($.blocker)return C$.Blocked;let W=xA[_];if(!W)return C$.Ready;return W($)?C$.Done:C$.Ready}function hA($,_){switch(_){case C.PlanCreate:case C.PlanApprove:return $.plan?.latestPath;case C.ImplementationReport:return $.reports.implementation;case C.ReviewReport:return $.reports.review;case C.ValidationReport:return $.reports.validation;case C.QualityGate:return $.reports.quality;case C.PrPrepare:case C.PrCreate:return $.pr?.latestPath??$.pr?.url;default:return}}function dA($){let _=lA($);if(!_)return{mission:{issuePrefixes:[],retentionDays:Y_}};let W=MA(_,"utf8");return{filePath:_,rootDir:I9(_),mission:k9(W)}}function lA($){let _=$;while(!0){for(let Q of N2){let U=JA(_,Q);if(OA(U))return U}let W=I9(_);if(W===_)return;_=W}}function cA($,_){let W=V2(_);if(W.length===0)return;S2($,{issuePrefixes:W})}function nA($,_){if(!_)return;S2($,{tracker:{provider:_}})}function mA($,_){if(!_)return;S2($,{git:{provider:_}})}function y9($,_){if(!_)return;S2($,{flow:{preset:_,steps:kA(_)}})}function S2($,_){let W=y2($),Q=k9(W),U={...Q,..._,tracker:{...Q.tracker,..._.tracker},git:{...Q.git,..._.git},flow:{...Q.flow,..._.flow}};XH($,ZH(U))}function o$($){$.inIssuePrefixes=!1,$.inTracker=!1,$.inGit=!1,$.inFlow=!1,$.inFlowSteps=!1}function pA($,_){if(!/^\S/.test(_))return!1;return $.inMission=/^mission:\s*$/.test(_),o$($),$.currentFlowStepIndex=-1,!0}function iA($,_){if(/^ {2}issuePrefixes:\s*$/.test(_))return o$($),$.inIssuePrefixes=!0,$.mission.issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test(_))return o$($),$.inTracker=!0,$.mission.tracker=$.mission.tracker??{},!0;if(/^ {2}git:\s*$/.test(_))return o$($),$.inGit=!0,$.mission.git=$.mission.git??{},!0;if(/^ {2}flow:\s*$/.test(_))return o$($),$.inFlow=!0,$.mission.flow=$.mission.flow??{},!0;return!1}function rA($,_){if(!($.inTracker&&/^ {4}provider:\s*(.+)$/.test(_)))return!1;let W=_.match(/^ {4}provider:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q)$.mission.tracker={provider:Q};return!0}function sA($,_){if(!$.inGit)return!1;if(/^ {4}provider:\s*(.+)$/.test(_)){let W=_.match(/^ {4}provider:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q)$.mission.git={...$.mission.git,provider:Q};return!0}if(/^ {4}baseBranch:\s*(.+)$/.test(_)){let W=_.match(/^ {4}baseBranch:\s*(.+)$/)?.[1];if(W)$.mission.git={...$.mission.git,baseBranch:k$(W)};return!0}if(/^ {4}prMode:\s*(.+)$/.test(_)){let W=_.match(/^ {4}prMode:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q)$.mission.git={...$.mission.git,prMode:Q};return!0}return!1}function oA($,_){if(!$.inFlow)return!1;if(/^ {4}preset:\s*(.+)$/.test(_)){let W=_.match(/^ {4}preset:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q)$.mission.flow={...$.mission.flow,preset:Q};return!0}if(/^ {4}steps:\s*$/.test(_))return $.inFlowSteps=!0,$.currentFlowStepIndex=-1,$.mission.flow={...$.mission.flow,steps:[]},!0;return!1}function tA($,_){if(!/^ {6}-\s+uses:\s*(.+)$/.test(_))return!1;let W=_.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q)$.mission.flow=$.mission.flow??{},$.mission.flow.steps=$.mission.flow.steps??[],$.mission.flow.steps.push({uses:Q}),$.currentFlowStepIndex=$.mission.flow.steps.length-1;return!0}function aA($,_){if($.currentFlowStepIndex<0)return!1;if(/^ {8}enabled:\s*(true|false)/.test(_)){let W=/^ {8}enabled:\s*true/.test(_),Q=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(Q)Q.enabled=W;return!0}if(/^ {8}advance:\s*(.+)$/.test(_)){let W=_.match(/^ {8}advance:\s*(.+)$/)?.[1],Q=W?k$(W):void 0;if(Q){let U=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(U)U.advance=Q}return!0}return!1}function eA($,_){if(!$.inFlowSteps)return!1;if(tA($,_))return!0;return aA($,_)}function $H($,_){if(/^ {2}repoId:\s*(.+)$/.test(_)){let W=_.match(/^ {2}repoId:\s*(.+)$/)?.[1];if(W)$.mission.repoId=k$(W);return o$($),!0}if(/^ {2}retentionDays:\s*(\d+)/.test(_)){let W=_.match(/^ {2}retentionDays:\s*(\d+)/)?.[1];if(W)$.mission.retentionDays=Number(W);return o$($),!0}return!1}function _H($,_){let W=_.trimEnd();if(!W||W.trimStart().startsWith("#"))return;if(pA($,W))return;if(!$.inMission)return;if(iA($,W))return;if(rA($,W))return;if(sA($,W))return;if(oA($,W))return;if(eA($,W))return;if($H($,W))return;if(/^ {2}\S/.test(W))o$($);if($.inIssuePrefixes&&/^ {4}-\s+(.+)$/.test(W)){let Q=W.match(/^ {4}-\s+(.+)$/)?.[1];if(Q)$.mission.issuePrefixes.push(k$(Q).toUpperCase())}}function k9($){let _={mission:{issuePrefixes:[],retentionDays:Y_},inMission:!1,inIssuePrefixes:!1,inTracker:!1,inGit:!1,inFlow:!1,inFlowSteps:!1,currentFlowStepIndex:-1};for(let W of $.split(/\r?\n/))_H(_,W);return BA(_.mission,"sumr.yaml mission")}function k$($){let _=$.replace(/\s+#.*$/,"").trim();if(_.startsWith('"')&&_.endsWith('"')||_.startsWith("'")&&_.endsWith("'"))return _.slice(1,-1).trim();return _}function WH($){if(!($.git?.provider||$.git?.baseBranch||$.git?.prMode))return[];let _=[" git:"];if($.git.provider)_.push(` provider: ${$.git.provider}`);if($.git.baseBranch)_.push(` baseBranch: ${$.git.baseBranch}`);if($.git.prMode)_.push(` prMode: ${$.git.prMode}`);return _}function QH($){if(!$.flow?.steps?.length)return[];let _=[" steps:"];for(let W of $.flow.steps){if(_.push(` - uses: ${W.uses}`),W.enabled!==void 0)_.push(` enabled: ${W.enabled}`);if(W.advance)_.push(` advance: ${W.advance}`)}return _}function UH($){if(!($.flow?.preset||$.flow?.steps?.length))return[];let _=[" flow:"];if($.flow.preset)_.push(` preset: ${$.flow.preset}`);return _.push(...QH($)),_}function ZH($){let _=["# Mission","mission:"];if($.repoId)_.push(` repoId: ${$.repoId}`);if($.tracker?.provider)_.push(" tracker:"),_.push(` provider: ${$.tracker.provider}`);if(_.push(...WH($)),_.push(...UH($)),$.issuePrefixes.length>0)_.push(" issuePrefixes:"),_.push(...$.issuePrefixes.map((W)=>` - ${W}`));if($.retentionDays!==Y_)_.push(` retentionDays: ${$.retentionDays}`);return _}function XH($,_){H0($,"mission",_,{sectionComment:"# Mission"})}function l($={}){let _=$.cwd??process.cwd(),W=$.home??ST(),Q=dA(_),U=$A(_),Z=YH({cwd:_,gitRoot:U,configuredRepoId:Q.mission.repoId}),X=Q.rootDir?D1.Repo:D1.Global,G=Q.rootDir?s$(Q.rootDir,OH,...JH):s$(W,GH,...MH),O=s$(G,"repos",Z.repoId);return{cwd:_,home:W,storageScope:X,baseDir:G,repoDir:O,missionsDir:s$(O,"missions"),repoId:Z.repoId,repoLabel:Z.repoLabel,config:Q.mission,sumrConfigPath:Q.filePath,sumrRootDir:Q.rootDir,gitRoot:U}}function a$($,_){let W=XA(_),Q=s$($.missionsDir,W);return{issueKey:_,issuePathKey:W,missionId:`${$.repoId}:${_}`,missionDir:Q,missionJsonPath:s$(Q,"mission.json")}}function YH($){if($.configuredRepoId)return{repoId:AH($.configuredRepoId),repoLabel:$.configuredRepoId};let _=O_($.cwd);if(_){let W=TH(_);return{repoId:O9(W),repoLabel:W}}if($.gitRoot){let W=`path:${$.gitRoot}`;return{repoId:O9(W),repoLabel:W}}return{repoId:D1.Global,repoLabel:D1.Global}}function TH($){let _=$.trim().replace(/\.git$/,""),W=_.match(/^git@([^:]+):(.+)$/);if(W?.[1]&&W[2])return`${W[1]}/${W[2]}`;try{let Q=new URL(_),U=Q.pathname.replace(/^\/+/,"");return`${Q.hostname}/${U}`}catch{return _.replace(/^[^@]+@/,"")}}function O9($){return BT("sha256").update($).digest("hex").slice(0,12)}function AH($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"repo"}function HH($){if(!$.gitRoot)return;let _=s$($.gitRoot,".git");if(!RT(_))return;return s$(_,"info","exclude")}function KH($,_,W){let Q=_.indexOf("="),U=Q===-1?_.slice(2):_.slice(2,Q),Z=Q===-1?void 0:_.slice(Q+1);if(Z!==void 0)return M9($,U,Z),!1;if(EH.has(U)&&W&&!W.startsWith("-"))return M9($,U,W),!0;return $[U]=!0,!1}function BH($){let _={},W=[];for(let Q=0;Q<$.length;Q+=1){let U=$[Q];if(!U)continue;if(!U.startsWith("--")){W.push(U);continue}if(KH(_,U,$[Q+1]))Q+=1}return{positionals:W,options:_}}function M9($,_,W){if(_!=="prefix"){$[_]=W;return}let Q=$[_];if(Array.isArray(Q)){Q.push(W);return}if(typeof Q==="string"){$[_]=[Q,W];return}$[_]=W}function n($,_){let W=$[_];return typeof W==="string"?W:void 0}function RH($,_){let W=$[_];if(Array.isArray(W))return W;if(typeof W==="string")return[W];return[]}function z$($,_){return $[_]===!0}function IH($){if($.status===b.Closed)return"Mission closed.";let _=yA($);if(_)return _;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((W)=>W.uses===C.QualityGate)&&!$.reports.quality)return"Create a quality gate report.";return"Close the mission."}function jH($){if($.status===b.Closed)return b.Closed;if($.blocker)return b.Blocked;if($.reports.validation)return b.Validated;if($.reports.review)return b.Review;if($.claim)return b.InProgress;if($.plan?.approved)return b.Planned;return b.Planning}function L2(){return new Date().toISOString()}function y1($){I2($.missionsDir,{recursive:!0});let _=H1($.repoDir,"state.json");if(q2(_)){let U=DH(_),Z={version:1,repoId:$.repoId,createdAt:U.createdAt,repoLabel:$.repoLabel,storageScope:$.storageScope,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:W_($.config.issuePrefixes),updatedAt:L2()};return U_(_,Z),Z}let W=L2(),Q={version:1,repoId:$.repoId,repoLabel:$.repoLabel,storageScope:$.storageScope,createdAt:W,updatedAt:W,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:W_($.config.issuePrefixes)};return U_(_,Q),Q}function g9($,_,W){y1($);let Q=a$($,_),U=x9(Q);if(U)return U;I2(Q.missionDir,{recursive:!0});let Z=L2(),X=v9({version:1,missionId:Q.missionId,repoId:$.repoId,repoLabel:$.repoLabel,issueKey:_,issuePathKey:Q.issuePathKey,title:W,status:b.Planning,storageScope:$.storageScope,createdAt:Z,updatedAt:Z,reports:{},flow:K2($.config),nextAction:"Create and approve a plan."});return R$($,X),X}function C1($,_){return x9(a$($,_))}function FH($,_){let W=_.includes(":")?_.slice(_.indexOf(":")+1):_,Q=C1($,W);if(Q)return Q;for(let U of J0($,{allRepos:!1}))if(U.missionId===_||U.issuePathKey===_)return U;return}function R$($,_){let W=a$($,_.issueKey);I2(W.missionDir,{recursive:!0});let Q=v9({..._,updatedAt:L2()});return U_(W.missionJsonPath,Q),Q}function J0($,_){let W=_.allRepos?Y9(H1($.baseDir,"repos")):[$.repoDir],Q=[];for(let U of W){let Z=H1(U,"missions");for(let X of Y9(Z)){let G=H1(X,"mission.json");if(!q2(G))continue;Q.push(u9(G))}}return Q.sort((U,Z)=>Z.updatedAt.localeCompare(U.updatedAt))}function wH($,_,W){if(!W.force&&!_.reports.validation)throw Error("Mission cannot close before a validation report exists. Use --force to override.");return R$($,{..._,status:b.Closed,blocker:void 0,nextAction:"Mission closed."})}function fH($,_){let W=Date.now()-_.olderThanDays*24*60*60*1000,Q=[],U=[];for(let Z of J0($,{allRepos:!0})){if(Z.status!==b.Closed)continue;let X=Date.parse(Z.updatedAt);if(Number.isNaN(X)||X>W)continue;let G=a$({...$,repoId:Z.repoId,repoLabel:Z.repoLabel,repoDir:H1($.baseDir,"repos",Z.repoId),missionsDir:H1($.baseDir,"repos",Z.repoId,"missions")},Z.issueKey).missionDir;if(Q.push(G),!_.dryRun)b9(G,{recursive:!0,force:!0}),U.push(G)}return{eligible:Q,removed:U}}function v9($){let _=$.status===b.Closed?b.Closed:jH($),W=NA({...$,status:_}),Q=_===b.Closed?"Mission closed.":IH(W);return{...W,nextAction:Q}}function x9($){if(!q2($.missionJsonPath))return;return u9($.missionJsonPath)}function DH($){return RA(h9($),$)}function u9($){return SA(h9($),$)}function h9($){try{return JSON.parse(P9($,"utf8"))}catch(_){let W=_ instanceof Error?_.message:String(_);throw Error(`${$} contains invalid JSON: ${W}`)}}function U_($,_){I2(NH($),{recursive:!0});let W=`${$}.sumr-tmp-${Date.now()}`;J9(W,`${JSON.stringify(_,null,2)}
|
|
274
|
-
`,"utf8"),
|
|
275
|
-
`)}function
|
|
276
|
-
`)}function
|
|
270
|
+
}`,XX,Az,X$=()=>{},H$,jz,hz,iz,ez,JH,SH,s6,PH,yH,$8,l$,qX,r0,F9,$2,LX,t6,vH,o1,pH,cH,rH,jX,D9,JV,D8,DX,TV,q$,e,H0,Q2,kX,a1,jV,fV,fX,uV,lV,JO,VO="${",N8,EO,NO="unknown_default_open_api",lX,pX,uO,nO,Z8=null,rX=()=>{},tO,X8,EK,aX,pK,X9,cK,$U,Gq,Mq,Eq,Tq,jq,Sq,QU,Cq,Fq,fq,yq,vq,dq;var WU=w2(()=>{D();D();D();D();D();Z4=Object.defineProperty;Z$=M(()=>{U9=Math.max(W4().length-1,2),GZ=/^application\/.+\+json$/i,_Z=["200","201","202","204"],YZ=["201","200","202","204"],zZ=/^2\d\d$/,HZ=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"]),LZ=[`// ${qZ}`,"// 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(`
|
|
271
|
+
`)}),C1=M(()=>{R={AsyncApiNats:"asyncapi-nats",TypeScriptAngular:"typescript-angular",TypeScriptAxios:"typescript-axios",TypeScriptFetch:"typescript-fetch",TypeScriptModels:"typescript-models",TypeScriptNestJs:"typescript-nestjs"},c6=[R.TypeScriptNestJs,R.AsyncApiNats,R.TypeScriptFetch,R.TypeScriptAxios,R.TypeScriptAngular,R.TypeScriptModels],BZ=["camelCase","PascalCase","snake_case","original"],AZ=["camelCase","PascalCase","snake_case","original"],MZ=["PascalCase","camelCase","snake_case","UPPERCASE","original"],b$={AsyncApi:"asyncapi",ContractLink:"contract-link",OpenApi:"openapi"},W$={Http:"http",Models:"models",Nats:"nats",Sdk:"sdk"}});K8=M(()=>{Z$()});q8=M(()=>{Z$(),SZ={$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"}}}});V9=M(()=>{Z$()});mZ=M(()=>{V9(),Z$(),hZ=/\$ref\s*:\s*['"]?([^'"\s#]+(?:#[^'"\s]+)?|#[^'"\s]+)['"]?/g,uZ=new URL("../../package.json",import.meta.url),dZ=["src/generators/**/*.ts","src/shared/**/*.ts","src/cli/generate*.ts"]}),V3=M(()=>{d1={Failed:"failed",Generated:"generated",Unchanged:"unchanged"}});x3=M(()=>{C1()});Wz=M(()=>{Z$(),o6=Promise.resolve()});QX=M(()=>{Z$()}),ZX=M(()=>{K0={AsyncApiNats:"asyncapi-nats",OpenApiNestJs:"openapi-nestjs",OpenApiSdk:"openapi-sdk"}}),Az=M(()=>{XX=["import { Observable } from 'rxjs';","",Hz,"",Vz,"",Oz,"",Kz,"",qz,"",Lz,"",Bz].join(`
|
|
272
|
+
`)});jz=M(()=>{H$={Command:"command",Event:"event",Query:"query"}});hz=M(()=>{X$(),jz()});iz=M(()=>{X$()});ez=M(()=>{Z$(),K8(),q8(),Az(),X$(),hz(),iz()});JH=M(()=>{X$()});SH=M(()=>{X$()});PH=M(()=>{X$(),SH(),s6={addDtoImport:S9,addEnumImport:j9,emitHelperDto:C9}});yH=M(()=>{X$()}),$2=M(()=>{$8={V3_0:"3.0",V3_1:"3.1",V3_2:"3.2"},l$={Array:"array",Enum:"enum",Object:"object",Ref:"ref",Scalar:"scalar",Unknown:"unknown"},qX={Boolean:"boolean",Integer:"integer",Number:"number",String:"string"},r0={Body:"body",Path:"path",Query:"query",Schema:"schema"},F9={Operation:"operation",Schema:"schema"}}),vH=M(()=>{LX=["get","post","put","patch","delete","options","head","trace"],t6={Params:"Params",Query:"Query"}});o1=M(()=>{$2()});pH=M(()=>{$2(),o1()});cH=M(()=>{X$()});rH=M(()=>{$2()});jX=M(()=>{X$(),$2(),pH(),cH(),rH(),o1()});D9=M(()=>{Z$(),o1()});JV=M(()=>{X$(),$2(),vH(),jX(),o1(),D9()});D8=M(()=>{o1()});DX=M(()=>{JV(),jX(),o1(),D8()});TV=M(()=>{X$()});Q2=M(()=>{q$={Delete:"delete",Get:"get",Patch:"patch",Post:"post",Put:"put"},e={Path:"path",Query:"query"},H0={Array:"Array",Boolean:"Boolean",Number:"Number",Object:"Object",String:"String"}});kX=M(()=>{Z$(),Q2(),o1()}),jV=M(()=>{a1={Parameters:"parameters",RequestBodies:"requestBodies",Responses:"responses",Schemas:"schemas"}});fV=M(()=>{X$(),Q2(),jV(),D9()});uV=M(()=>{X$(),Q2(),kX(),fV(),fX=[q$.Get,q$.Post,q$.Put,q$.Patch,q$.Delete]});lV=M(()=>{uV()});JO=M(()=>{Z$(),K8(),q8(),X$(),JH(),PH(),yH(),DX(),D8(),TV(),lV()});N8=M(()=>{Z$(),C1()});EO=M(()=>{C1(),Q2(),N8()});lX=M(()=>{X$(),N8()});uO=M(()=>{X$(),Q2(),D9(),kX(),N8(),lX(),pX=[q$.Get,q$.Post,q$.Put,q$.Patch,q$.Delete]});nO=M(()=>{K8(),q8(),C1(),DX(),D8(),EO(),N8(),lX(),uO()});tO=M(()=>{ez(),JO(),nO(),ZX(),rX()});EK=M(()=>{Z$(),Wz(),mZ(),QX(),C1(),ZX(),V9(),tO(),X8=new Map}),aX={};ZZ(aX,{runGenerate:()=>mK});pK=M(()=>{Z$(),K8(),q8(),mZ(),V3(),C1(),x3(),u3(),V9(),EK(),rX()}),cK=M(()=>{X9={Failed:"failed",Passed:"passed"}}),$U={};ZZ($U,{runValidate:()=>Jq});Gq=M(()=>{D8(),QX(),cK(),C1()});Z$();Z$();C1();Z$();Mq=["input","output","natsPrefix"],Eq=["name","input","targets"],Tq=["name","output","generator"],jq=["type","prefix"],Sq=["type","dto","dtos","zod","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag"],QU=["type","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag"],Cq=[...QU,"providedIn"],Fq=["type","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag"];fq={name:"kontract generate",description:"Generate TypeScript contracts and SDKs from configured 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"]},yq={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"]},vq={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"]};dq=K1({name:"kontract",description:"Generate and validate API contract code",group:"modules",visibility:"public",commands:[E({name:"init",description:"Activate Kontract AI guidance for this workspace",group:"modules",visibility:"public",help:yq,execute:hq}),E({name:"generate",description:"Generate TypeScript contracts from API specs",group:"modules",visibility:"public",help:fq,execute:gq}),E({name:"validate",description:"Validate API specifications",group:"modules",visibility:"public",help:vq,execute:uq})]})});var oU={};N2(oU,{missionModule:()=>SM});import{createHash as mq}from"crypto";import{existsSync as lq}from"fs";import{homedir as pq}from"os";import{join as D1}from"path";import{spawnSync as EL}from"child_process";import{createHash as CL}from"crypto";import{existsSync as NL,readFileSync as wL}from"fs";import{dirname as SU,join as bL}from"path";import{z as B}from"zod";import{createHash as nL}from"crypto";import{existsSync as vB,readFileSync as xB,writeSync as gB}from"fs";import{join as hB}from"path";import{existsSync as u8,mkdirSync as d8,readdirSync as pB,readFileSync as kU,rmSync as PU,writeFileSync as _U}from"fs";import{basename as cB,join as s1}from"path";import{existsSync as LA,mkdirSync as BA,readFileSync as AA,writeFileSync as MA}from"fs";import{dirname as EA}from"path";import{mkdirSync as nU,readFileSync as mA,writeFileSync as iU}from"fs";import{join as H2}from"path";import{spawnSync as G7}from"child_process";import{mkdirSync as QM,readFileSync as ZM,writeFileSync as XM}from"fs";import{join as KU}from"path";function S0($,Q){let Z=EL("git",[...Q],{cwd:$,stdio:"pipe",encoding:"utf8"});if(Z.status!==0)return;return Z.stdout.trim()||void 0}function TL($){return S0($,["rev-parse","--show-toplevel"])}function t9($){return S0($,["branch","--show-current"])}function jL($){return S0($,["rev-parse","--short=12","HEAD"])}function e9($){return S0($,["config","--get","remote.origin.url"])}function SL($){let Q=S0($,["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]);if(Q?.startsWith("origin/"))return Q.slice(7);return S0($,["config","--get","init.defaultBranch"])}function f8($){let Q=$.map((Z)=>Z.trim().toUpperCase()).filter((Z)=>TU.test(Z));return[...new Set(Q)]}function jU($){return $.map((Q)=>Q.trim()).filter((Q)=>Q.length>0&&!TU.test(Q.toUpperCase()))}function i9($){let Q=f8($);return Q.length>0?Q:[...FL]}function y8($){let Q=$.issueKey.trim();if(!Q)return{ok:!1,message:"Mission issue key cannot be empty."};let Z=i9($.prefixes);if(Z.some((U)=>new RegExp(`^${RL(U)}-[0-9]+$`).test(Q)))return{ok:!0,issueKey:Q};if($.allowCustomKey&&IL.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 DL($){let Q=$.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80),Z=CL("sha256").update($).digest("hex").slice(0,8);return`${Q||"mission"}--${Z}`}function RL($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function mL($,Q){return $7(PL,$,Q)}function lL($,Q){return $7(uL,$,Q)}function pL($,Q){return $7(dL,$,Q)}function $7($,Q,Z){let X=$.safeParse(Q);if(X.success)return X.data;throw Error(cL(Z,X.error))}function cL($,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 DU($){return V2(LU,$)}function RU($){return V2(qU,$)}function Q7($){return V2(s9,$)}function iL($){return V2(AU,$)}function rL($){return V2(BU,$)}function V2($,Q){return $.some((Z)=>Z===Q)}function r9($){let Q=oL.find((Z)=>Z.id===$);if(Q)return Q;throw Error(`Unknown Mission action: ${$}`)}function aL($){let Q=g8($.flow);if(Q.length>0)throw Error(Q.join(`
|
|
273
|
+
`));let Z=$.flow?.preset,X=Z&&Q7(Z)?Z:C$.Basic,U=$.flow?.steps?.length?$.flow.steps.map(XB):NU[X];return{preset:X,steps:U}}function v8($){let Q=aL($),Z=QB(Q.steps);return{preset:Q.preset,hash:sL(Q.preset,Z),steps:Z.map((X)=>({uses:X.uses,enabled:X.enabled??!0,advance:X.advance??T.Manual,status:X.enabled===!1?P$.Skipped:P$.Pending}))}}function sL($,Q){return nL("sha256").update(JSON.stringify({preset:$,steps:Q})).digest("hex").slice(0,12)}function tL($){if(!$.flow)return $;let Q=$.flow.steps.map((Z)=>{let X=Z.enabled?JB($,Z.uses):P$.Skipped,U=GB($,Z.uses)??Z.artifactPath,W=X!==Z.status||U!==Z.artifactPath?new Date().toISOString():Z.updatedAt;return{...Z,status:X,artifactPath:U,updatedAt:W}});return{...$,flow:{...$.flow,steps:Q}}}function eL($){if(!$.flow)return;let Q=$.flow.steps.find((X)=>X.enabled&&X.status!==P$.Done);if(!Q)return"Close the mission.";if(Q.status===P$.Blocked)return`Resolve blocked step: ${r9(Q.uses).label}.`;let Z=r9(Q.uses);if(Q.advance===T.Human)return`${Z.nextAction} Human approval required.`;if(Q.advance===T.Ask)return`${Z.nextAction} Ask before continuing.`;return Z.nextAction}function x8($){return $.steps.map((Q)=>{let Z=[];if(!Q.enabled||Q.status===P$.Skipped)Z.push(P$.Skipped);if(Q.advance!==T.Auto)Z.push(Q.advance);return Z.length>0?`${Q.uses}(${Z.join(", ")})`:Q.uses}).join(" -> ")}function g8($){let Q=[],Z=$?.preset;if(Z&&!Q7(Z))Q.push(`Unknown Mission flow preset: ${Z}`);for(let[X,U]of($?.steps??[]).entries()){if(!DU(U.uses))Q.push(`Unknown Mission action at flow.steps[${X}]: ${U.uses}`);if(U.advance&&!RU(U.advance))Q.push(`Invalid advance at flow.steps[${X}]: ${U.advance}`)}return Q}function $B($){return NU[$].map((Q)=>({...Q}))}function QB($){return $.map((Q)=>({uses:Q.uses,enabled:Q.enabled,advance:Q.advance??ZB(Q.uses)}))}function ZB($){return r9($).externalWrite?T.Human:T.Manual}function XB($){if(!DU($.uses))throw Error(`Unknown Mission action: ${$.uses}`);let{advance:Q}=$;return{uses:$.uses,enabled:$.enabled,advance:UB(Q)}}function UB($){if(!$)return;if(RU($))return $;throw Error(`Invalid Mission flow advance: ${$}`)}function JB($,Q){if($.blocker)return P$.Blocked;let Z=WB[Q];if(!Z)return P$.Ready;return Z($)?P$.Done:P$.Ready}function GB($,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 _B($){let Q=YB($);if(!Q)return{mission:{issuePrefixes:[],retentionDays:Z7}};let Z=wL(Q,"utf8");return{filePath:Q,rootDir:SU(Q),mission:bU(Z)}}function YB($){let Q=$;while(!0){for(let X of v0){let U=bL(Q,X);if(NL(U))return U}let Z=SU(Q);if(Z===Q)return;Q=Z}}function zB($,Q){let Z=f8(Q);if(Z.length===0)return;h8($,{issuePrefixes:Z})}function HB($,Q){if(!Q)return;h8($,{tracker:{provider:Q}})}function VB($,Q){if(!Q)return;h8($,{git:{provider:Q}})}function wU($,Q){if(!Q)return;h8($,{flow:{preset:Q,steps:$B(Q)}})}function h8($,Q){let Z=k2($),X=bU(Z),U={...X,...Q,tracker:{...X.tracker,...Q.tracker},git:{...X.git,...Q.git},flow:{...X.flow,...Q.flow}};DB($,IB(U))}function R1($){$.inIssuePrefixes=!1,$.inTracker=!1,$.inGit=!1,$.inFlow=!1,$.inFlowSteps=!1}function OB($,Q){if(!/^\S/.test(Q))return!1;return $.inMission=/^mission:\s*$/.test(Q),R1($),$.currentFlowStepIndex=-1,!0}function KB($,Q){if(/^ {2}issuePrefixes:\s*$/.test(Q))return R1($),$.inIssuePrefixes=!0,$.mission.issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test(Q))return R1($),$.inTracker=!0,$.mission.tracker=$.mission.tracker??{},!0;if(/^ {2}git:\s*$/.test(Q))return R1($),$.inGit=!0,$.mission.git=$.mission.git??{},!0;if(/^ {2}flow:\s*$/.test(Q))return R1($),$.inFlow=!0,$.mission.flow=$.mission.flow??{},!0;return!1}function qB($,Q){if(!($.inTracker&&/^ {4}provider:\s*(.+)$/.test(Q)))return!1;let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?W1(Z):void 0;if(X)$.mission.tracker={provider:X};return!0}function LB($,Q){if(!$.inGit)return!1;if(/^ {4}provider:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}provider:\s*(.+)$/)?.[1],X=Z?W1(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:W1(Z)};return!0}if(/^ {4}prMode:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}prMode:\s*(.+)$/)?.[1],X=Z?W1(Z):void 0;if(X)$.mission.git={...$.mission.git,prMode:X};return!0}return!1}function BB($,Q){if(!$.inFlow)return!1;if(/^ {4}preset:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {4}preset:\s*(.+)$/)?.[1],X=Z?W1(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 AB($,Q){if(!/^ {6}-\s+uses:\s*(.+)$/.test(Q))return!1;let Z=Q.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],X=Z?W1(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 MB($,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?W1(Z):void 0;if(X){let U=$.mission.flow?.steps?.[$.currentFlowStepIndex];if(U)U.advance=X}return!0}return!1}function EB($,Q){if(!$.inFlowSteps)return!1;if(AB($,Q))return!0;return MB($,Q)}function TB($,Q){if(/^ {2}repoId:\s*(.+)$/.test(Q)){let Z=Q.match(/^ {2}repoId:\s*(.+)$/)?.[1];if(Z)$.mission.repoId=W1(Z);return R1($),!0}if(/^ {2}retentionDays:\s*(\d+)/.test(Q)){let Z=Q.match(/^ {2}retentionDays:\s*(\d+)/)?.[1];if(Z)$.mission.retentionDays=Number(Z);return R1($),!0}return!1}function jB($,Q){let Z=Q.trimEnd();if(!Z||Z.trimStart().startsWith("#"))return;if(OB($,Z))return;if(!$.inMission)return;if(KB($,Z))return;if(qB($,Z))return;if(LB($,Z))return;if(BB($,Z))return;if(EB($,Z))return;if(TB($,Z))return;if(/^ {2}\S/.test(Z))R1($);if($.inIssuePrefixes&&/^ {4}-\s+(.+)$/.test(Z)){let X=Z.match(/^ {4}-\s+(.+)$/)?.[1];if(X)$.mission.issuePrefixes.push(W1(X).toUpperCase())}}function bU($){let Q={mission:{issuePrefixes:[],retentionDays:Z7},inMission:!1,inIssuePrefixes:!1,inTracker:!1,inGit:!1,inFlow:!1,inFlowSteps:!1,currentFlowStepIndex:-1};for(let Z of $.split(/\r?\n/))jB(Q,Z);return mL(Q.mission,"sumr.yaml mission")}function W1($){let Q=$.replace(/\s+#.*$/,"").trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1).trim();return Q}function SB($){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 CB($){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 FB($){if(!($.flow?.preset||$.flow?.steps?.length))return[];let Q=[" flow:"];if($.flow.preset)Q.push(` preset: ${$.flow.preset}`);return Q.push(...CB($)),Q}function IB($){let Q=["# Mission","mission:"];if($.repoId)Q.push(` repoId: ${$.repoId}`);if($.tracker?.provider)Q.push(" tracker:"),Q.push(` provider: ${$.tracker.provider}`);if(Q.push(...SB($)),Q.push(...FB($)),$.issuePrefixes.length>0)Q.push(" issuePrefixes:"),Q.push(...$.issuePrefixes.map((Z)=>` - ${Z}`));if($.retentionDays!==Z7)Q.push(` retentionDays: ${$.retentionDays}`);return Q}function DB($,Q){g1($,"mission",Q,{sectionComment:"# Mission"})}function o($={}){let Q=$.cwd??process.cwd(),Z=$.home??pq(),X=_B(Q),U=TL(Q),W=kB({cwd:Q,gitRoot:U,configuredRepoId:X.mission.repoId}),J=X.rootDir?j0.Repo:j0.Global,G=X.rootDir?D1(X.rootDir,NB,...bB):D1(Z,RB,...wB),_=D1(G,"repos",W.repoId);return{cwd:Q,home:Z,storageScope:J,baseDir:G,repoDir:_,missionsDir:D1(_,"missions"),repoId:W.repoId,repoLabel:W.repoLabel,config:X.mission,sumrConfigPath:X.filePath,sumrRootDir:X.rootDir,gitRoot:U}}function w1($,Q){let Z=DL(Q),X=D1($.missionsDir,Z);return{issueKey:Q,issuePathKey:Z,missionId:`${$.repoId}:${Q}`,missionDir:X,missionJsonPath:D1(X,"mission.json")}}function kB($){if($.configuredRepoId)return{repoId:fB($.configuredRepoId),repoLabel:$.configuredRepoId};let Q=e9($.cwd);if(Q){let Z=PB(Q);return{repoId:JU(Z),repoLabel:Z}}if($.gitRoot){let Z=`path:${$.gitRoot}`;return{repoId:JU(Z),repoLabel:Z}}return{repoId:j0.Global,repoLabel:j0.Global}}function PB($){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 JU($){return mq("sha256").update($).digest("hex").slice(0,12)}function fB($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"repo"}function yB($){if(!$.gitRoot)return;let Q=D1($.gitRoot,".git");if(!lq(Q))return;return D1(Q,"info","exclude")}function dB($,Q,Z){let X=Q.indexOf("="),U=X===-1?Q.slice(2):Q.slice(2,X),W=X===-1?void 0:Q.slice(X+1);if(W!==void 0)return GU($,U,W),!1;if(uB.has(U)&&Z&&!Z.startsWith("-"))return GU($,U,Z),!0;return $[U]=!0,!1}function mB($){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(dB(Q,U,$[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 s($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function lB($,Q){let Z=$[Q];if(Array.isArray(Z))return Z;if(typeof Z==="string")return[Z];return[]}function f$($,Q){return $[Q]===!0}function nB($){if($.status===d.Closed)return"Mission closed.";let Q=eL($);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 iB($){if($.status===d.Closed)return d.Closed;if($.blocker)return d.Blocked;if($.reports.validation)return d.Validated;if($.reports.review)return d.Review;if($.claim)return d.InProgress;if($.plan?.approved)return d.Planned;return d.Planning}function P8(){return new Date().toISOString()}function C0($){d8($.missionsDir,{recursive:!0});let Q=s1($.repoDir,"state.json");if(u8(Q)){let U=sB(Q),W={version:1,repoId:$.repoId,createdAt:U.createdAt,repoLabel:$.repoLabel,storageScope:$.storageScope,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:i9($.config.issuePrefixes),updatedAt:P8()};return o9(Q,W),W}let Z=P8(),X={version:1,repoId:$.repoId,repoLabel:$.repoLabel,storageScope:$.storageScope,createdAt:Z,updatedAt:Z,tracker:$.config.tracker,git:$.config.git,flow:$.config.flow,issuePrefixes:i9($.config.issuePrefixes)};return o9(Q,X),X}function fU($,Q,Z){C0($);let X=w1($,Q),U=vU(X);if(U)return U;d8(X.missionDir,{recursive:!0});let W=P8(),J=yU({version:1,missionId:X.missionId,repoId:$.repoId,repoLabel:$.repoLabel,issueKey:Q,issuePathKey:X.issuePathKey,title:Z,status:d.Planning,storageScope:$.storageScope,createdAt:W,updatedAt:W,reports:{},flow:v8($.config),nextAction:"Create and approve a plan."});return c$($,J),J}function t1($,Q){return vU(w1($,Q))}function rB($,Q){let Z=Q.includes(":")?Q.slice(Q.indexOf(":")+1):Q,X=t1($,Z);if(X)return X;for(let U of O2($,{allRepos:!1}))if(U.missionId===Q||U.issuePathKey===Q)return U;return}function c$($,Q){let Z=w1($,Q.issueKey);d8(Z.missionDir,{recursive:!0});let X=yU({...Q,updatedAt:P8()});return o9(Z.missionJsonPath,X),X}function O2($,Q){let Z=Q.allRepos?YU(s1($.baseDir,"repos")):[$.repoDir],X=[];for(let U of Z){let W=s1(U,"missions");for(let J of YU(W)){let G=s1(J,"mission.json");if(!u8(G))continue;X.push(xU(G))}}return X.sort((U,W)=>W.updatedAt.localeCompare(U.updatedAt))}function oB($,Q,Z){if(!Z.force&&!Q.reports.validation)throw Error("Mission cannot close before a validation report exists. Use --force to override.");return c$($,{...Q,status:d.Closed,blocker:void 0,nextAction:"Mission closed."})}function aB($,Q){let Z=Date.now()-Q.olderThanDays*24*60*60*1000,X=[],U=[];for(let W of O2($,{allRepos:!0})){if(W.status!==d.Closed)continue;let J=Date.parse(W.updatedAt);if(Number.isNaN(J)||J>Z)continue;let G=w1({...$,repoId:W.repoId,repoLabel:W.repoLabel,repoDir:s1($.baseDir,"repos",W.repoId),missionsDir:s1($.baseDir,"repos",W.repoId,"missions")},W.issueKey).missionDir;if(X.push(G),!Q.dryRun)PU(G,{recursive:!0,force:!0}),U.push(G)}return{eligible:X,removed:U}}function yU($){let Q=$.status===d.Closed?d.Closed:iB($),Z=tL({...$,status:Q}),X=Q===d.Closed?"Mission closed.":nB(Z);return{...Z,nextAction:X}}function vU($){if(!u8($.missionJsonPath))return;return xU($.missionJsonPath)}function sB($){return lL(gU($),$)}function xU($){return pL(gU($),$)}function gU($){try{return JSON.parse(kU($,"utf8"))}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);throw Error(`${$} contains invalid JSON: ${Z}`)}}function o9($,Q){d8(tB($),{recursive:!0});let Z=`${$}.sumr-tmp-${Date.now()}`;_U(Z,`${JSON.stringify(Q,null,2)}
|
|
274
|
+
`,"utf8"),_U($,kU(Z,"utf8"),"utf8"),PU(Z,{force:!0})}function YU($){if(!u8($))return[];return pB($,{withFileTypes:!0}).filter((Q)=>Q.isDirectory()).map((Q)=>s1($,Q.name))}function tB($){return $.slice(0,$.length-cB($).length-1)}function G$($){return mB($.argv.slice(1))}function g($){return f$($,"json")}function h($){gB(1,`${JSON.stringify($,null,2)}
|
|
275
|
+
`)}function hU($){return!g($)&&u0()}function b1($,Q,Z){if(!Z)return L$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let X=o(),U=y8({issueKey:Z,prefixes:X.config.issuePrefixes,allowCustomKey:f$(Q,"allow-custom-key")});if(!U.ok)return m(U.message),{ok:!1,code:1};return{ok:!0,issueKey:U.issueKey}}function X7($,Q){let Z=o(),X=t1(Z,$);if(X)return X;return fU(Z,$,Q??$)}function U7($){return`${$.issueKey.padEnd(12)} ${$.status.padEnd(12)} ${$.nextAction}`}function eB($,Q={}){let Z=[`Mission: ${$.issueKey}`,`Title: ${$.title}`,`Status: ${$.status}`,`Repo: ${$.repoLabel} (${$.repoId})`,`Next: ${$.nextAction}`];if($A(Z,$,Q.currentBranch),$.plan)Z.push(`Plan: ${$.plan.latestPath}${$.plan.approved?" (approved)":" (pending approval)"}`);if($.claim)QA(Z,$.claim);if($.blocker)Z.push(`Blocker: ${$.blocker.reason}`);if($.flow)Z.push(`Flow: ${$.flow.preset} (${$.flow.hash})`),Z.push(`Flow steps: ${x8($.flow)}`);return ZA(Z,$),XA(Z,$),Z.join(`
|
|
276
|
+
`)}function $A($,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 QA($,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 ZA($,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 XA($,Q){let Z=Object.entries(Q.reports);if(Z.length===0)return;$.push("Reports:");for(let[X,U]of Z)$.push(` ${X}: ${U}`)}function L$($,Q){m($,{title:"Usage",details:Q})}function m($,Q={}){K$($,Q)}function UA($){let Q={[d.Blocked]:0,[d.Planning]:1,[d.Planned]:2,[d.InProgress]:3,[d.Review]:4,[d.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 W7($,Q){return`${YA()}-${$.issuePathKey}.${Q}.md`}function WA($,Q){return`# Mission Plan: ${$}
|
|
277
277
|
|
|
278
278
|
## Objective
|
|
279
279
|
|
|
280
|
-
${
|
|
280
|
+
${Q}
|
|
281
281
|
|
|
282
282
|
## Implementation Plan
|
|
283
283
|
|
|
@@ -286,7 +286,7 @@ ${_}
|
|
|
286
286
|
## Verification
|
|
287
287
|
|
|
288
288
|
- TODO: list required checks.
|
|
289
|
-
`}function
|
|
289
|
+
`}function JA($,Q){return`# ${uU($)} Report: ${Q.issueKey}
|
|
290
290
|
|
|
291
291
|
## Summary
|
|
292
292
|
|
|
@@ -294,54 +294,564 @@ TODO: summarize the ${$} result.
|
|
|
294
294
|
|
|
295
295
|
## Evidence
|
|
296
296
|
|
|
297
|
-
- Mission: ${
|
|
298
|
-
- Status before report: ${
|
|
297
|
+
- Mission: ${Q.missionId}
|
|
298
|
+
- Status before report: ${Q.status}
|
|
299
299
|
|
|
300
300
|
## Next Steps
|
|
301
301
|
|
|
302
|
-
- ${
|
|
303
|
-
`}function
|
|
304
|
-
`),"Mission Flow");return 0}function
|
|
305
|
-
Allowed: ${
|
|
306
|
-
${
|
|
302
|
+
- ${Q.nextAction}
|
|
303
|
+
`}function GA($){for(let Q of[".github/pull_request_template.md",".github/PULL_REQUEST_TEMPLATE.md","pull_request_template.md","PULL_REQUEST_TEMPLATE.md"]){let Z=hB($,Q);if(vB(Z))return xB(Z,"utf8")}return}function _A($){return EU.includes($)}function uU($){return`${$.charAt(0).toUpperCase()}${$.slice(1)}`}function YA(){return new Date().toISOString().replace(/[:.]/g,"-")}function zA($){let{positionals:Q,options:Z}=G$($),X=Q[0],U=o();if(!X||X===G2.SHOW)return Promise.resolve(HA(U,Z));if(X===G2.LIST)return Promise.resolve(VA(Z));if(X===G2.VALIDATE)return Promise.resolve(OA(U,Z));if(X===G2.EXPORT)return Promise.resolve(KA(U,Z));if(X===G2.USE)return Promise.resolve(qA(U,Z,Q[1]));return L$(`Unknown flow command: ${X}`,"sumr mission flow <list|show|use|validate|export>"),Promise.resolve(1)}function HA($,Q){let Z=g8($.config.flow);if(Z.length>0){if(g(Q))h({ok:!1,errors:Z});else u$(Z,"Mission flow errors");return 1}let X=v8($.config);if(g(Q))h({ok:!0,preset:X.preset,hash:X.hash,steps:X.steps,errors:Z});else h$([`Preset: ${X.preset}`,`Hash: ${X.hash}`,`Flow: ${x8(X)}`].join(`
|
|
304
|
+
`),"Mission Flow");return 0}function VA($){if(g($))h({ok:!0,presets:z2});else u$(z2,"Mission flow presets");return 0}function OA($,Q){let Z=g8($.config.flow);if(g(Q))h({ok:Z.length===0,errors:Z});else if(Z.length===0)P("Mission flow is valid.");else u$(Z,"Mission flow errors");return Z.length===0?0:1}function KA($,Q){let Z=g8($.config.flow);if(Z.length>0){if(g(Q))h({ok:!1,errors:Z});else u$(Z,"Mission flow errors");return 1}let X=v8($.config);return h({ok:!0,preset:X.preset,hash:X.hash,text:x8(X),steps:X.steps}),0}function qA($,Q,Z){if(!Z||!Q7(Z))return L$("Missing or invalid flow preset.",`sumr mission flow use <preset>
|
|
305
|
+
Allowed: ${z2.join(", ")}`),1;if(!$.sumrConfigPath)return m("No sumr.yaml found. Run Mission inside a SUMR repo to set a repo flow."),1;wU($.sumrConfigPath,Z);let X=o(),U=v8(X.config);if(g(Q))h({ok:!0,preset:U.preset,hash:U.hash,steps:U.steps});else P(`Mission flow set: ${U.preset}`,{title:"Flow",fields:[{label:"Flow",value:x8(U)}]});return 0}function TA($){let Q=$.trim().toLowerCase();return iL(Q)?Q:void 0}function dU($){if(!$)return"not configured";return J7.find((Q)=>Q.value===$)?.label??$}function mU($){if(!$)return;let Q=$.toLowerCase();if(Q.includes("github.com"))return r.Github;if(Q.includes("gitlab.com"))return r.Gitlab;if(Q.includes("bitbucket.org"))return r.Bitbucket;if(Q.includes("dev.azure.com")||Q.includes("visualstudio.com"))return r.AzureDevops;if(Q.includes("gitea"))return r.Gitea;if(Q.includes("codeberg.org"))return r.Codeberg;return}function lU($){let Q=m8.find((Z)=>Z.value===$);if(!Q)throw Error(`Unsupported mission tracker: ${$}`);return Q}function pU($){let Q=$.trim().toLowerCase();return rL(Q)?Q:void 0}function zU($,Q,Z){let X=jA.exec($);if(!X)return{ok:!1,message:Z};return{ok:!0,issueKey:`${Q}-${X[1]}`}}function HU($,Q){let Z=$.toUpperCase();if(!SA.test(Z))return{ok:!1,message:`Enter a ${Q} like PROJECT-123.`};return{ok:!0,issueKey:Z}}function CA($){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 FA($,Q){if($===p.Github)return zU(Q,"GH","Enter a GitHub issue number like 123 or #123.");if($===p.Gitlab)return zU(Q,"GL","Enter a GitLab issue IID like 123 or #123.");if($===p.Jira)return HU(Q,"Jira ticket key");if($===p.Linear)return HU(Q,"Linear issue identifier");if($===p.AzureBoards){let Z=Q.match(/^(?:AB#?|work item\s+)?([0-9]+)$/i);if(Z?.[1])return{ok:!0,issueKey:`AB-${Z[1]}`}}return}function a9($,Q){let Z=Q.trim();if(!Z)return{ok:!1,message:"Enter a mission ID."};return FA($,Z)??CA(Z)}async function IA($){let{options:Q}=G$($),Z=o(),X=await vA(Q,Z);if(!X.ok)return X.code;if(Z.sumrConfigPath)DA(Z.sumrConfigPath,X.config);let U=C0(Z);x0("mission",{cwd:Z.cwd});let W=yB(Z),J=RA(Z,W),G={context:Z,config:X.config,root:U,excludePath:W,excludeUpdated:J,playbookSyncRecommended:Z.storageScope===j0.Repo};if(g(Q))NA(G);else wA(G);return 0}function DA($,Q){if(Q.tracker)HB($,Q.tracker);if(Q.gitProvider)VB($,Q.gitProvider);if(Q.flowPreset)wU($,Q.flowPreset);if(Q.prefixes.length>0)zB($,Q.prefixes)}function RA($,Q){if(!(Q&&$.storageScope===j0.Repo))return!1;BA(EA(Q),{recursive:!0});let Z=[".sumr-cache/mission/",".sumr-cache/activations.json"],X=LA(Q)?AA(Q,"utf8"):"",U=X.split(/\r?\n/),W=Z.filter((J)=>!U.includes(J));if(W.length===0)return!1;return MA(Q,`${X.trimEnd()}
|
|
306
|
+
${W.join(`
|
|
307
307
|
`)}
|
|
308
|
-
`,"utf8"),!0}function
|
|
309
|
-
Allowed: ${
|
|
310
|
-
- ${
|
|
308
|
+
`,"utf8"),!0}function NA($){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??C$.Basic,issuePrefixes:Z.prefixes.length>0?Z.prefixes:Q.config.issuePrefixes,playbookSyncRecommended:$.playbookSyncRecommended})}function wA($){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:uA(Z.tracker??Q.config.tracker?.provider)},{label:"Git provider",value:dU(Z.gitProvider??Q.config.git?.provider)},{label:"Flow",value:Z.flowPreset??Q.config.flow?.preset??C$.Basic},{label:"Ticket prefixes",value:dA(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 bA($){let Q=s($,"tracker")??s($,"provider"),Z=Q?pU(Q):void 0;if(Q&&!Z)return L$(`Unsupported tracker: ${Q}`,`Allowed trackers: ${m8.map((X)=>X.value).join(", ")}`),N1;return Z}function kA($){let Q=s($,"git-provider"),Z=Q?TA(Q):void 0;if(Q&&!Z)return L$(`Unsupported git provider: ${Q}`,`Allowed git providers: ${J7.map((X)=>X.value).join(", ")}`),N1;return Z}function PA($){let Q=s($,"flow"),Z=z2.find((X)=>X===Q);if(Q&&!Z)return L$(`Unsupported flow preset: ${Q}`,`Allowed flow presets: ${z2.join(", ")}`),N1;return Z}function fA($){let Q=lB($,"prefix");if(Q.length>0){let Z=jU(Q);if(Z.length>0)return m(`Invalid issue prefix${Z.length===1?"":"es"}: ${Z.join(", ")}. Prefixes must start with a letter and contain only letters or numbers.`),N1}return Q}function yA($){let Q=bA($);if(Q===N1)return{error:!0};let Z=kA($);if(Z===N1)return{error:!0};let X=PA($);if(X===N1)return{error:!0};let U=fA($);if(U===N1)return{error:!0};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:U}}async function vA($,Q){let Z=yA($);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:f8(Z.prefixes)}};if(!Q.sumrConfigPath||Q.config.tracker?.provider||f$($,"yes")||!hU($))return{ok:!0,config:{prefixes:[]}};return{ok:!0,config:await xA(Q)}}async function xA($){let Q=await a$({message:"Where do this repo's work item IDs usually come from?",options:[...m8.map((W)=>({value:W.value,label:W.label,hint:W.hint})),{value:VU.Skip,label:"Skip for now",hint:"Ask per mission"}],initialValue:p.Github});if(!Q||Q===VU.Skip)return{prefixes:[]};let Z=await gA($),X=await hA();if(Q!==p.Jira&&Q!==p.Linear)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};let U=await _0({message:`${Q===p.Jira?"Jira project":"Linear team"} prefixes`,placeholder:"SUM, ENG, OPS",validate:(W)=>{let J=OU(W??"");if(J.length===0)return"Enter at least one prefix, like SUM.";let G=jU(J);if(G.length>0)return`Invalid prefix${G.length===1?"":"es"}: ${G.join(", ")}`;return}});if(!U)return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:[]};return{tracker:Q,gitProvider:Z,flowPreset:X,prefixes:f8(OU(U))}}async function gA($){let Q=mU(e9($.cwd));return await a$({message:"Which git or PR provider should Mission recognize?",options:J7.map((Z)=>({value:Z.value,label:Z.label,hint:Z.hint})),initialValue:Q??r.GenericGit})}async function hA(){return await a$({message:"Which Mission flow should this repo use?",options:[{value:C$.StandardDelivery,label:"Standard delivery",hint:"Plan, approval, delivery, validation, PR preview"},{value:C$.PlanningOnly,label:"Planning only",hint:"Stop after a reviewable plan"},{value:C$.Basic,label:"Basic",hint:"Current lightweight Mission lifecycle"},{value:C$.FullDelivery,label:"Full delivery",hint:"Richer flow with research, quality gate, and PR assist"}],initialValue:C$.StandardDelivery})}function uA($){if(!$)return"not configured";return lU($).label}function dA($){if($.length===0)return;return $.join(", ")}function OU($){return $.split(/[,\s]+/).map((Q)=>Q.trim()).filter(Boolean)}function lA($){let{positionals:Q,options:Z}=G$($),X=o();if(C0(X),Q[0]){let W=rB(X,Q[0]);if(!W)return m(`Mission not found: ${Q[0]}`),Promise.resolve(1);if(g(Z))h({ok:!0,mission:W});else h$(eB(W,{currentBranch:t9(X.cwd)}),"Status");return Promise.resolve(0)}let U=O2(X,{allRepos:!1});if(g(Z))h({ok:!0,storage:X.baseDir,missions:U});else if(o$("Mission workspace",{title:"Storage",fields:[{label:"Root",value:X.baseDir},{label:"Repo",value:`${X.repoLabel} (${X.repoId})`}]}),U.length===0)o$("No missions found.");else u$(U.map(U7),"Missions");return Promise.resolve(0)}function pA($){let{options:Q}=G$($),Z=o();C0(Z);let X=f$(Q,"all"),U=O2(Z,{allRepos:X});if(g(Q))h({ok:!0,missions:U});else if(U.length===0)o$("No missions found.");else u$(U.map(U7),X?"All missions":"Missions");return Promise.resolve(0)}function cA($){let{options:Q}=G$($),Z=o();C0(Z);let X=O2(Z,{allRepos:f$(Q,"all")}).filter((W)=>W.status!==d.Closed),U=UA(X);if(g(Q))h({ok:!0,mission:U});else if(!U)o$("No open missions.");else h$(U7(U),"Next mission");return Promise.resolve(0)}function nA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=o(),W=X7(X.issueKey),J=w1(U,X.issueKey),G=H2(J.missionDir,"plans");nU(G,{recursive:!0});let _=s(Z,"from"),Y=H2(G,W7(W,"plan")),z=_?mA(_,"utf8"):WA(W.issueKey,W.title);iU(Y,z,"utf8");let H=f$(Z,"approve"),V=c$(U,{...W,plan:{latestPath:Y,approved:H,approvedAt:H?new Date().toISOString():void 0}});if(g(Z))h({ok:!0,mission:V,planPath:Y});else P("Plan written",{title:"Plan",fields:[{label:"Path",value:Y},{label:"Next",value:V.nextAction}]});return Promise.resolve(0)}function iA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=o(),W=t1(U,X.issueKey);if(!W)return m(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!W.plan)return m("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 J=c$(U,{...W,plan:{...W.plan,approved:!0,approvedAt:new Date().toISOString()}});if(g(Z))h({ok:!0,mission:J,alreadyApproved:!1});else P(`Plan approved: ${J.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:J.plan?.latestPath??W.plan.latestPath},{label:"Next",value:J.nextAction}]});return Promise.resolve(0)}function rA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=o(),W=t1(U,X.issueKey);if(!W)return m(`Mission not found: ${X.issueKey}`),Promise.resolve(1);if(!W.plan?.approved)return m("Approve a plan before claiming this mission."),Promise.resolve(1);let J=t9(U.cwd),G=jL(U.cwd),_=s(Z,"agent")??process.env.USER??"unknown",Y=c$(U,{...W,branch:J,sourceSha:G,claim:{agent:_,startedAt:new Date().toISOString(),branch:J,sourceSha:G}});if(g(Z))h({ok:!0,mission:Y});else P(`Mission claimed: ${Y.issueKey}`,{title:"Claim",fields:[{label:"Agent",value:_},{label:"Next",value:Y.nextAction}]});return Promise.resolve(0)}function oA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=s(Z,"type");if(!_A(U))return L$("Missing or invalid report type.",`sumr mission report <issueKey> --type <type>
|
|
309
|
+
Allowed: ${EU.join(", ")}`),Promise.resolve(1);let W=o(),J=X7(X.issueKey),G=w1(W,X.issueKey),_=$M(U),Y=H2(G.missionDir,_);nU(Y,{recursive:!0});let z=H2(Y,W7(J,U));iU(z,JA(U,J),"utf8");let H=c$(W,{...J,reports:{...J.reports,[U]:z}});if(g(Z))h({ok:!0,mission:H,reportPath:z});else P(`${uU(U)} report written`,{title:"Report",fields:[{label:"Path",value:z},{label:"Next",value:H.nextAction}]});return Promise.resolve(0)}function aA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=s(Z,"reason");if(!U)return L$("Missing blocker reason.","sumr mission block <issueKey> --reason <text>"),Promise.resolve(1);let W=o(),J=X7(X.issueKey),G=c$(W,{...J,blocker:{reason:U,blockedAt:new Date().toISOString()}});if(g(Z))h({ok:!0,mission:G});else G0(`Mission blocked: ${G.issueKey}`,{title:"Blocker",fields:[{label:"Reason",value:U},{label:"Next",value:G.nextAction}]});return Promise.resolve(0)}function sA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=o(),W=t1(U,X.issueKey);if(!W)return m(`Mission not found: ${X.issueKey}`),Promise.resolve(1);let J=c$(U,{...W,blocker:void 0});if(g(Z))h({ok:!0,mission:J});else P(`Mission unblocked: ${J.issueKey}`,{title:"Mission",fields:[{label:"Next",value:J.nextAction}]});return Promise.resolve(0)}function tA($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return Promise.resolve(X.code);let U=o(),W=t1(U,X.issueKey);if(!W)return m(`Mission not found: ${X.issueKey}`),Promise.resolve(1);try{let J=oB(U,W,{force:f$(Z,"force")});if(g(Z))h({ok:!0,mission:J});else P(`Mission closed: ${J.issueKey}`);return Promise.resolve(0)}catch(J){return m(J instanceof Error?J.message:String(J)),Promise.resolve(1)}}function eA($){let{options:Q}=G$($),Z=Number(s(Q,"older-than")??30),X=f$(Q,"dry-run"),U=o();C0(U);let W=aB(U,{olderThanDays:Number.isFinite(Z)?Z:30,dryRun:X});if(g(Q))h({ok:!0,dryRun:X,...W});else{let J=X?W.eligible.length:W.removed.length,G=X?W.eligible:W.removed;if(P(`${X?"Eligible":"Removed"} closed mission cache directories: ${J}`),G.length>0)u$(G,X?"Eligible":"Removed")}return Promise.resolve(0)}function $M($){return $===AL.Handoff?"handoffs":H2("reports",$)}async function WM($){let{positionals:Q,options:Z}=G$($),X=b1($,Z,Q[0]);if(!X.ok)return X.code;let U=o();if(U.config.git?.prMode===ML.Disabled)return m("PR assist is disabled for this repo by mission.git.prMode."),1;let W=t1(U,X.issueKey);if(!W)return m(`Mission not found: ${X.issueKey}`),1;let J=JM(Z),G=GM(U,Z),_=w1(U,X.issueKey),Y=KU(_.missionDir,"prs");QM(Y,{recursive:!0});let z=KU(Y,W7(W,"pr")),H=HM(U,W,G);XM(z,H,"utf8");let V=c$(U,{...W,pr:{...W.pr,latestPath:z,mode:_M(J),updatedAt:new Date().toISOString()}});if(J===k$.Preview)return YM(Z,V,z,H,G),0;let O=await VM(U,V,z,G,J);if(!O.ok)return O.code;return V=c$(U,{...V,pr:{...V.pr,url:O.url,updatedAt:new Date().toISOString()}}),zM(Z,V,z,O.url),0}function JM($){if(f$($,k$.Create))return k$.Create;if(f$($,k$.CreateDraft))return k$.CreateDraft;return k$.Preview}function GM($,Q){let Z=s(Q,"base")??s(Q,"base-branch");if(Z)return Z;if($.config.git?.baseBranch)return $.config.git.baseBranch;let X=SL($.cwd);if(!X)throw Error("Could not resolve a PR base branch. Pass --base <branch> or configure mission.git.baseBranch.");return X}function _M($){if($===k$.CreateDraft)return c9.Draft;if($===k$.Create)return c9.Ready;return c9.Preview}function YM($,Q,Z,X,U){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:U},{label:"Next",value:Q.nextAction}]})}function zM($,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 HM($,Q,Z){let X=GA($.cwd),U=Q.issueKey.match(/^(?:GH|GL)-(\d+)$/)?.[1],W=U?`Refs #${U}`:`Refs ${Q.issueKey}`;return`## Summary
|
|
310
|
+
- ${Q.title}
|
|
311
311
|
- TODO: summarize the user-facing change.
|
|
312
312
|
- TODO: summarize the main implementation change.
|
|
313
|
-
- ${
|
|
313
|
+
- ${W}
|
|
314
314
|
|
|
315
315
|
## Verification
|
|
316
316
|
- TODO: add commands run and results.
|
|
317
317
|
- TODO: add manual or UI checks when relevant.
|
|
318
318
|
|
|
319
319
|
## Scope Review
|
|
320
|
-
- Base branch: \`${
|
|
320
|
+
- Base branch: \`${Z}\`.
|
|
321
321
|
- TODO: list any required support work, or write "None".
|
|
322
322
|
- TODO: split unrelated dependency, audit, tooling, infrastructure, or cleanup changes.
|
|
323
323
|
|
|
324
324
|
## Mission Evidence
|
|
325
|
-
- Mission: \`${
|
|
326
|
-
- Plan: ${
|
|
327
|
-
- Implementation report: ${
|
|
328
|
-
- Review report: ${
|
|
329
|
-
- Validation report: ${
|
|
330
|
-
- Quality report: ${
|
|
325
|
+
- Mission: \`${Q.missionId}\`
|
|
326
|
+
- Plan: ${Q.plan?Q.plan.approved?"recorded and approved":"recorded, pending approval":"not recorded"}
|
|
327
|
+
- Implementation report: ${Q.reports.implementation?"recorded":"not recorded"}
|
|
328
|
+
- Review report: ${Q.reports.review?"recorded":"not recorded"}
|
|
329
|
+
- Validation report: ${Q.reports.validation?"recorded":"not recorded"}
|
|
330
|
+
- Quality report: ${Q.reports.quality?"recorded":"not recorded"}
|
|
331
331
|
|
|
332
332
|
## Risk
|
|
333
333
|
- TODO: document known gaps, skipped checks, and rollback notes.
|
|
334
|
-
${
|
|
334
|
+
${X?`
|
|
335
335
|
## Repository PR Template
|
|
336
336
|
|
|
337
|
-
${
|
|
337
|
+
${X.trim()}
|
|
338
338
|
`:""}
|
|
339
|
-
`}async function
|
|
340
|
-
${
|
|
341
|
-
${J.stderr.trim()}`),{ok:!1,code:1};return{ok:!0,url:J.stdout.trim()}}function p3($,_,W,Q,U){let Z=["pr","create","--base",Q,"--title",o9(_),"--body-file",W];if(U===i9.CreateDraft)Z.push("--draft");return z_("gh",Z,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}function i3($,_,W,Q,U,Z){let X=["mr","create","--base",Q,"--source-branch",U,"--title",o9(_),"--description",b3(W,"utf8")];if(Z===i9.CreateDraft)X.push("--draft");return z_("glab",X,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}async function r3($,_,W){if(!E0())return g(`External write blocked. Re-run interactively to approve ${$} from ${_} to ${W}.`),!1;return await g$({message:`Push ${_} and ${$===H$.CreateDraft?"create a draft PR":"create a PR"} into ${W}?`,options:[{value:H2.No,label:"No",hint:"Keep the PR preview only"},{value:H2.Yes,label:"Yes",hint:"Push branch and create PR"}],initialValue:H2.No})===H2.Yes}function o9($){let _=`${$.issueKey}: ${$.title}`.replace(/\s+/g," ").trim();return _.length<=70?_:`${_.slice(0,67).trimEnd()}...`}function s3($){return $.claim?.branch??$.branch}function o3($){return v3.some((_)=>_===$)}async function t3($){let{positionals:_,options:W}=e($),Q=l(),U=d9(W),Z=await a3($,W,Q,_[0],U);if(!Z.ok)return Z.code;let X=await _4(W,Z.issueKey,U);if(!X.ok)return X.code;let G=g9(Q,Z.issueKey,X.title);if(k(W))P({ok:!0,mission:G});else y(`Mission ready: ${G.issueKey}`,{title:"Mission",fields:[{label:"Title",value:G.title},{label:"Storage",value:a$(Q,G.issueKey).missionDir},{label:"Next",value:G.nextAction}]});return 0}async function a3($,_,W,Q,U){let Z=e3(_,W,Q);if(Z)return Z;if(!Q&&U){let G=await $4(W);if(!G)return{ok:!1,code:0};return{ok:!0,issueKey:G}}if(!Q)return X$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let X=E2({issueKey:Q,prefixes:W.config.issuePrefixes,allowCustomKey:z$(_,"allow-custom-key")});if(!X.ok)return g(X.message),{ok:!1,code:1};return{ok:!0,issueKey:X.issueKey}}function e3($,_,W){let Q=n($,"tracker")??n($,"provider"),U=n($,"issue")??n($,"key");if(!Q&&!U)return;if(W)return X$("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 X$("Missing tracker issue parameters.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};let Z=Q?p9(Q):_.config.tracker?.provider;if(!Z)return X$(Q?`Unsupported tracker: ${Q}`:"Missing tracker issue source.","Set one with `sumr mission init --tracker <tracker>` or pass --tracker explicitly."),{ok:!1,code:1};let X=Z_(Z,U);if(!X.ok)return g(X.message),{ok:!1,code:1};let G=E2({issueKey:X.issueKey,prefixes:_.config.issuePrefixes,allowCustomKey:!0});if(!G.ok)return g(G.message),{ok:!1,code:1};return{ok:!0,issueKey:G.issueKey}}async function $4($){let _=await g$({message:"Where is this mission tracked?",options:j2.map((Z)=>({value:Z.value,label:Z.label,hint:Z.hint})),initialValue:$.config.tracker?.provider??u.Github});if(!_)return;let W=m9(_),Q=await v1({message:W.inputLabel,placeholder:W.placeholder,validate:(Z)=>{let X=Z_(_,Z??"");if(!X.ok)return X.message;let G=E2({issueKey:X.issueKey,prefixes:$.config.issuePrefixes,allowCustomKey:!0});return G.ok?void 0:G.message}});if(!Q)return;let U=Z_(_,Q);return U.ok?U.issueKey:void 0}async function _4($,_,W){let Q=n($,"title")??n($,"name");if(Q)return{ok:!0,title:Q};if(!W)return X$("Missing title.","sumr mission start <issueKey> --title <title>"),{ok:!1,code:1};let Z=(await v1({message:"Mission title",placeholder:`Implement ${_}`,validate:(X)=>{if(!X?.trim())return"Enter a mission title.";return}}))?.trim();return Z?{ok:!0,title:Z}:{ok:!1,code:0}}var Z0,qT,F1,IT,X0,jT,Q$,FT,r$,wT,w1,fT,Y$,DT,y$,NT,C2,yT,__,kT,z2,PT,bT,L9,gT,vT,xT,X_,uT,V9,hT,dT,f1,lT,cT,E9,nT,K9,mT,pT,iT,B9,rT,sT,K,C$,T$,oT,C,b,tT,R9,u,d,aT,D1,$_,UA,S9,ZA,j9,F9,YA,w9,TA,AA,HA,CA,zA,LA,VA,EA,KA,wA,N9,G0,xA,Y_=30,GH=".sumr",OH=".sumr-cache",MH,JH,EH,U0,C_,j2,_3,W3,H9,H$,i9,H2,UL,t$,v3,I,W4;var a9=f2(()=>{v();v();v();v();v();v();v();v();Z0={Auto:"auto",Ask:"ask",Human:"human",Manual:"manual"},qT=[Z0.Auto,Z0.Ask,Z0.Human,Z0.Manual],F1={Pending:"pending",Ready:"ready",Done:"done",Skipped:"skipped",Blocked:"blocked"},IT=[F1.Pending,F1.Ready,F1.Done,F1.Skipped,F1.Blocked],X0={Basic:"basic",PlanningOnly:"planning-only",StandardDelivery:"standard-delivery",FullDelivery:"full-delivery"},jT=[X0.Basic,X0.PlanningOnly,X0.StandardDelivery,X0.FullDelivery],Q$={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"},FT=[Q$.IssueSync,Q$.ContextResearch,Q$.PlanCreate,Q$.PlanApprove,Q$.BranchCheck,Q$.WorkClaim,Q$.ImplementationReport,Q$.ReviewReport,Q$.ValidationReport,Q$.QualityGate,Q$.PrPrepare,Q$.PrCreate,Q$.MissionClose],r$={Planning:"planning",Planned:"planned",InProgress:"in_progress",Review:"review",Validated:"validated",Blocked:"blocked",Closed:"closed"},wT=[r$.Planning,r$.Planned,r$.InProgress,r$.Review,r$.Validated,r$.Blocked,r$.Closed],w1={Implementation:"implementation",Review:"review",Validation:"validation",Quality:"quality",Handoff:"handoff"},fT=[w1.Implementation,w1.Review,w1.Validation,w1.Quality,w1.Handoff],Y$={Github:"github",Gitlab:"gitlab",Jira:"jira",Linear:"linear",AzureBoards:"azure-boards",Shortcut:"shortcut",Clickup:"clickup",Asana:"asana",Trello:"trello",Notion:"notion",Custom:"custom"},DT=[Y$.Github,Y$.Gitlab,Y$.Jira,Y$.Linear,Y$.AzureBoards,Y$.Shortcut,Y$.Clickup,Y$.Asana,Y$.Trello,Y$.Notion,Y$.Custom],y$={Github:"github",Gitlab:"gitlab",Bitbucket:"bitbucket",AzureDevops:"azure-devops",Gitea:"gitea",Codeberg:"codeberg",GenericGit:"generic-git",None:"none"},NT=[y$.Github,y$.Gitlab,y$.Bitbucket,y$.AzureDevops,y$.Gitea,y$.Codeberg,y$.GenericGit,y$.None],C2={Preview:"preview",Ask:"ask",Disabled:"disabled"},yT=[C2.Preview,C2.Ask,C2.Disabled],__={Repo:"repo",Global:"global"},kT=[__.Repo,__.Global],z2={Preview:"preview",Draft:"draft",Ready:"ready"},PT=[z2.Preview,z2.Draft,z2.Ready],bT=Z0,L9=qT,gT=F1,vT=IT,xT=X0,X_=jT,uT=Q$,V9=FT,hT=r$,dT=wT,f1=w1,lT=fT,cT=Y$,E9=DT,nT=y$,K9=NT,mT=C2,pT=yT,iT=__,B9=kT,rT=z2,sT=PT,K=bT,C$=gT,T$=xT,oT=X_,C=uT,b=hT,tT=f1,R9=lT,u=cT,d=nT,aT=mT,D1=iT,$_=rT;UA=["ISSUE","GH","GL"],S9=/^[A-Z][A-Z0-9]*$/,ZA=/^[A-Za-z0-9][A-Za-z0-9._-]{1,80}$/;j9=H.object({provider:H.enum(E9).optional()}).strict(),F9=H.object({provider:H.enum(K9).optional(),baseBranch:H.string().min(1).optional(),prMode:H.enum(pT).optional()}).strict(),YA=H.object({uses:H.string().min(1),enabled:H.boolean().optional(),advance:H.string().min(1).optional()}).strict(),w9=H.object({preset:H.string().min(1).optional(),steps:H.array(YA).optional()}).strict(),TA=H.object({repoId:H.string().min(1).optional(),tracker:j9.optional(),git:F9.optional(),flow:w9.optional(),issuePrefixes:H.array(H.string()),retentionDays:H.number().int().positive()}).strict(),AA=H.object({latestPath:H.string().min(1),approved:H.boolean(),approvedAt:H.string().optional()}).strict(),HA=H.object({agent:H.string().min(1),startedAt:H.string().min(1),branch:H.string().optional(),sourceSha:H.string().optional()}).strict(),CA=H.object({reason:H.string().min(1),blockedAt:H.string().min(1)}).strict(),zA=H.object({implementation:H.string().optional(),review:H.string().optional(),validation:H.string().optional(),quality:H.string().optional(),handoff:H.string().optional()}).strict(),LA=H.object({latestPath:H.string().optional(),url:H.string().optional(),mode:H.enum(sT).optional(),createdAt:H.string().optional(),updatedAt:H.string().optional()}).strict(),VA=H.object({preset:H.enum(X_),hash:H.string().min(1),steps:H.array(H.object({uses:H.enum(V9),enabled:H.boolean(),advance:H.enum(L9),status:H.enum(vT),artifactPath:H.string().optional(),updatedAt:H.string().optional()}).strict())}).strict(),EA=H.object({version:H.literal(1),repoId:H.string().min(1),repoLabel:H.string().min(1),storageScope:H.enum(B9),createdAt:H.string().min(1),updatedAt:H.string().min(1),tracker:j9.optional(),git:F9.optional(),flow:w9.optional(),issuePrefixes:H.array(H.string())}).strict(),KA=H.object({version:H.literal(1),missionId:H.string().min(1),repoId:H.string().min(1),repoLabel:H.string().min(1),issueKey:H.string().min(1),issuePathKey:H.string().min(1),title:H.string().min(1),status:H.enum(dT),storageScope:H.enum(B9),createdAt:H.string().min(1),updatedAt:H.string().min(1),branch:H.string().optional(),sourceSha:H.string().optional(),plan:AA.optional(),claim:HA.optional(),reports:zA,pr:LA.optional(),flow:VA.optional(),blocker:CA.optional(),nextAction:H.string().min(1)}).strict();wA=[{id:C.IssueSync,label:"Sync issue context",nextAction:"Sync or confirm issue context.",externalWrite:!1},{id:C.ContextResearch,label:"Research context",nextAction:"Research code and tracker context.",externalWrite:!1},{id:C.PlanCreate,label:"Create plan",nextAction:"Create and register a Mission plan.",externalWrite:!1},{id:C.PlanApprove,label:"Approve plan",nextAction:"Approve the latest plan.",externalWrite:!1},{id:C.BranchCheck,label:"Check branch",nextAction:"Confirm the implementation branch.",externalWrite:!1},{id:C.WorkClaim,label:"Claim work",nextAction:"Claim the mission for implementation.",externalWrite:!1},{id:C.ImplementationReport,label:"Implementation report",nextAction:"Create an implementation report.",externalWrite:!1},{id:C.ReviewReport,label:"Review report",nextAction:"Create a review report.",externalWrite:!1},{id:C.ValidationReport,label:"Validation report",nextAction:"Create a validation report.",externalWrite:!1},{id:C.QualityGate,label:"Quality gate",nextAction:"Create a quality gate report.",externalWrite:!1},{id:C.PrPrepare,label:"Prepare PR",nextAction:"Prepare a PR preview.",externalWrite:!1},{id:C.PrCreate,label:"Create PR",nextAction:"Ask for approval to create the PR.",externalWrite:!0},{id:C.MissionClose,label:"Close mission",nextAction:"Close the mission.",externalWrite:!1}],N9={[T$.Basic]:[{uses:C.PlanCreate,advance:K.Auto},{uses:C.PlanApprove,advance:K.Human},{uses:C.WorkClaim,advance:K.Auto},{uses:C.ImplementationReport,advance:K.Manual},{uses:C.ReviewReport,advance:K.Manual},{uses:C.ValidationReport,advance:K.Manual},{uses:C.MissionClose,advance:K.Manual}],[T$.PlanningOnly]:[{uses:C.IssueSync,advance:K.Auto},{uses:C.ContextResearch,advance:K.Auto},{uses:C.PlanCreate,advance:K.Auto},{uses:C.PlanApprove,advance:K.Human}],[T$.StandardDelivery]:[{uses:C.IssueSync,advance:K.Auto},{uses:C.ContextResearch,enabled:!1,advance:K.Auto},{uses:C.PlanCreate,advance:K.Auto},{uses:C.PlanApprove,advance:K.Human},{uses:C.BranchCheck,advance:K.Ask},{uses:C.WorkClaim,advance:K.Auto},{uses:C.ImplementationReport,advance:K.Manual},{uses:C.ReviewReport,advance:K.Manual},{uses:C.ValidationReport,advance:K.Manual},{uses:C.QualityGate,advance:K.Manual},{uses:C.PrPrepare,advance:K.Ask},{uses:C.PrCreate,advance:K.Human}],[T$.FullDelivery]:[{uses:C.IssueSync,advance:K.Auto},{uses:C.ContextResearch,advance:K.Auto},{uses:C.PlanCreate,advance:K.Auto},{uses:C.PlanApprove,advance:K.Human},{uses:C.BranchCheck,advance:K.Ask},{uses:C.WorkClaim,advance:K.Auto},{uses:C.ImplementationReport,advance:K.Manual},{uses:C.ReviewReport,advance:K.Manual},{uses:C.ValidationReport,advance:K.Manual},{uses:C.QualityGate,advance:K.Manual},{uses:C.PrPrepare,advance:K.Ask},{uses:C.PrCreate,advance:K.Human},{uses:C.MissionClose,advance:K.Manual}]},G0=[...oT];xA={[C.IssueSync]:($)=>$.issueKey&&$.title,[C.ContextResearch]:($)=>$.reports.handoff,[C.PlanCreate]:($)=>$.plan,[C.PlanApprove]:($)=>$.plan?.approved,[C.BranchCheck]:($)=>$.branch||$.claim?.branch,[C.WorkClaim]:($)=>$.claim,[C.ImplementationReport]:($)=>$.reports.implementation,[C.ReviewReport]:($)=>$.reports.review,[C.ValidationReport]:($)=>$.reports.validation,[C.QualityGate]:($)=>$.reports.quality,[C.PrPrepare]:($)=>$.pr?.latestPath,[C.PrCreate]:($)=>$.pr?.url,[C.MissionClose]:($)=>$.status===b.Closed};MH=["cache","mission"],JH=["mission"];EH=new Set(["agent","from","flow","git-provider","issue","key","name","note","older-than","prefix","provider","reason","repo","title","tracker","type","base","base-branch"]);U0={SHOW:"show",LIST:"list",VALIDATE:"validate",EXPORT:"export",USE:"use"};C_=[{value:d.Github,label:"GitHub",hint:"Create pull requests with gh"},{value:d.Gitlab,label:"GitLab",hint:"Create merge requests with glab later"},{value:d.Bitbucket,label:"Bitbucket",hint:"Recognized; manual PR flow in V1"},{value:d.AzureDevops,label:"Azure DevOps",hint:"Recognized; manual PR flow in V1"},{value:d.Gitea,label:"Gitea",hint:"Recognized; manual PR flow in V1"},{value:d.Codeberg,label:"Codeberg",hint:"Recognized; manual PR flow in V1"},{value:d.GenericGit,label:"Generic Git",hint:"No hosted PR automation"},{value:d.None,label:"None",hint:"Disable PR assistance"}];j2=[{value:u.Github,label:"GitHub",hint:"#123 becomes GH-123",inputLabel:"GitHub issue number",placeholder:"123"},{value:u.Gitlab,label:"GitLab",hint:"#123 becomes GL-123",inputLabel:"GitLab issue IID",placeholder:"123"},{value:u.Jira,label:"Jira",hint:"PROJECT-123",inputLabel:"Jira ticket key",placeholder:"PROJECT-123"},{value:u.Linear,label:"Linear",hint:"TEAM-123",inputLabel:"Linear issue identifier",placeholder:"TEAM-123"},{value:u.AzureBoards,label:"Azure Boards",hint:"AB#123 or work item 123",inputLabel:"Azure Boards work item",placeholder:"AB#123"},{value:u.Shortcut,label:"Shortcut",hint:"Story ID or task URL",inputLabel:"Shortcut story ID",placeholder:"12345"},{value:u.Clickup,label:"ClickUp",hint:"Task ID or task URL",inputLabel:"ClickUp task ID",placeholder:"abc123"},{value:u.Asana,label:"Asana",hint:"Task ID or task URL",inputLabel:"Asana task ID",placeholder:"1200000000000000"},{value:u.Trello,label:"Trello",hint:"Card ID or card URL",inputLabel:"Trello card ID",placeholder:"card-slug-or-id"},{value:u.Notion,label:"Notion",hint:"Task/page ID or title",inputLabel:"Notion task ID or title",placeholder:"release checklist"},{value:u.Custom,label:"Custom ID",hint:"Use any local mission label",inputLabel:"Custom mission ID",placeholder:"checkout race condition"}],_3=/^(?:#|GH-|GL-)?([0-9]+)$/i,W3=/^[A-Z][A-Z0-9]*-[0-9]+$/;H9={Skip:"skip"},H$={Create:"create",CreateDraft:"create-draft",Preview:"preview"},i9={Create:H$.Create,CreateDraft:H$.CreateDraft},H2={Yes:"yes",No:"no"},UL={Plan:"plan",Implementation:f1.Implementation,Review:f1.Review,Validation:f1.Validation,Quality:f1.Quality,Handoff:f1.Handoff,Pr:"pr"},t$=Symbol("init-option-error");v3=["main","dev","staging","prod"];I={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"}]}},W4=g1({name:"mission",description:"Track AI-assisted work state and next actions",group:"modules",visibility:"public",commands:[q({name:"init",description:I.init.description,group:"modules",visibility:"public",help:I.init,execute:Z3}),q({name:"start",description:I.start.description,group:"modules",visibility:"public",help:I.start,execute:t3}),q({name:"status",description:I.status.description,group:"modules",visibility:"public",help:I.status,execute:R3}),q({name:"next",description:I.next.description,group:"modules",visibility:"public",help:I.next,execute:q3}),q({name:"list",description:I.list.description,group:"modules",visibility:"public",help:I.list,execute:S3}),q({name:"plan",description:I.plan.description,group:"modules",visibility:"public",help:I.plan,execute:I3}),q({name:"approve",description:I.approve.description,group:"modules",visibility:"public",help:I.approve,execute:j3}),q({name:"claim",description:I.claim.description,group:"modules",visibility:"public",help:I.claim,execute:F3}),q({name:"report",description:I.report.description,group:"modules",visibility:"public",help:I.report,execute:w3}),q({name:"block",description:I.block.description,group:"modules",visibility:"public",help:I.block,execute:f3}),q({name:"unblock",description:I.unblock.description,group:"modules",visibility:"public",help:I.unblock,execute:D3}),q({name:"close",description:I.close.description,group:"modules",visibility:"public",help:I.close,execute:N3}),q({name:"clean",description:I.clean.description,group:"modules",visibility:"public",help:I.clean,execute:y3}),q({name:"flow",description:I.flow.description,group:"modules",visibility:"public",help:I.flow,execute:cH}),q({name:"pr",description:I.pr.description,group:"modules",visibility:"public",help:I.pr,execute:x3})]})});import{log as X7}from"@clack/prompts";v();import{spawnSync as u_}from"child_process";function V$($,_){let W=process.env[$];if(!W)return _;let Q=Number(W);return Number.isFinite(Q)?Q:_}var b2=".sumr",b_=".sumr-local-link",x1="1.1.0",g2="1.3.0",g_=V$("SUMR_AWS_CREDENTIAL_TIMEOUT_MS",15000),K0=V$("SUMR_TOOL_VERSION_TIMEOUT_MS",5000),v_=V$("SUMR_KEYCHAIN_COMMAND_TIMEOUT_MS",15000),S4=V$("SUMR_BUILD_COMMAND_TIMEOUT_MS",120000),q4=V$("SUMR_CHECK_COMMAND_TIMEOUT_MS",30000),I4=V$("SUMR_NPM_COMMAND_TIMEOUT_MS",30000),j4=V$("SUMR_TARBALL_CONTENT_BUFFER_BYTES",16777216),B0="1",x_="SUMR_NO_KEYCHAIN",v2="SUMR_ALLOW_PLAINTEXT_AUTH_FILE",F4=V$("SUMR_LOCAL_CLI_COMMAND_TIMEOUT_MS",120000),x2=V$("SUMR_API_REQUEST_TIMEOUT_MS",30000),u2=V$("SUMR_IDENTITY_REQUEST_TIMEOUT_MS",30000);function h_(){return{...process.env}}function d_(){return process.env.SUMR_AWS_BIN?.trim()||"aws"}function l_(){return u_(d_(),["--version"],{stdio:"pipe",env:h_(),timeout:g_}).status===0}function c_(){let $=u_(d_(),["--version"],{stdio:"pipe",encoding:"utf8",env:h_(),timeout:K0});if($.status!==0)return;return`${$.stdout}
|
|
342
|
-
|
|
343
|
-
`)
|
|
344
|
-
|
|
339
|
+
`}async function VM($,Q,Z,X,U){let W=$.config.git?.provider??mU(e9($.cwd));if(W!==r.Github&&W!==r.Gitlab)return m(`PR creation is only implemented for GitHub and GitLab in V1. Current provider: ${dU(W)}.`),{ok:!1,code:1};let J=t9($.cwd);if(!J||BM(J))return m(`Refusing to create a PR from protected or empty branch: ${J??"(none)"}`),{ok:!1,code:1};let G=LM(Q);if(G&&J!==G)return m(`Refusing to create a PR from branch ${J} because mission ${Q.issueKey} is recorded on branch ${G}. Switch to ${G}, or intentionally reclaim the mission on ${J} before creating the PR.`),{ok:!1,code:1};if(!await qM(U,J,X))return{ok:!1,code:1};let Y=G7("git",["push","-u","origin",J],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(Y.status!==0)return m(`Could not push branch before PR creation.
|
|
340
|
+
${Y.stderr.trim()}`),{ok:!1,code:1};let z=W===r.Github?OM($,Q,Z,X,U):KM($,Q,Z,X,J,U);if(z.status!==0)return m(`Could not create pull request.
|
|
341
|
+
${z.stderr.trim()}`),{ok:!1,code:1};return{ok:!0,url:z.stdout.trim()}}function OM($,Q,Z,X,U){let W=["pr","create","--base",X,"--title",rU(Q),"--body-file",Z];if(U===cU.CreateDraft)W.push("--draft");return G7("gh",W,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}function KM($,Q,Z,X,U,W){let J=["mr","create","--base",X,"--source-branch",U,"--title",rU(Q),"--description",ZM(Z,"utf8")];if(W===cU.CreateDraft)J.push("--draft");return G7("glab",J,{cwd:$.cwd,stdio:"pipe",encoding:"utf8"})}async function qM($,Q,Z){if(!u0())return m(`External write blocked. Re-run interactively to approve ${$} from ${Q} to ${Z}.`),!1;return await a$({message:`Push ${Q} and ${$===k$.CreateDraft?"create a draft PR":"create a PR"} into ${Z}?`,options:[{value:w8.No,label:"No",hint:"Keep the PR preview only"},{value:w8.Yes,label:"Yes",hint:"Push branch and create PR"}],initialValue:w8.No})===w8.Yes}function rU($){let Q=`${$.issueKey}: ${$.title}`.replace(/\s+/g," ").trim();return Q.length<=70?Q:`${Q.slice(0,67).trimEnd()}...`}function LM($){return $.claim?.branch??$.branch}function BM($){return UM.some((Q)=>Q===$)}async function AM($){let{positionals:Q,options:Z}=G$($),X=o(),U=hU(Z),W=await MM($,Z,X,Q[0],U);if(!W.ok)return W.code;let J=await jM(Z,W.issueKey,U);if(!J.ok)return J.code;let G=fU(X,W.issueKey,J.title);if(g(Z))h({ok:!0,mission:G});else P(`Mission ready: ${G.issueKey}`,{title:"Mission",fields:[{label:"Title",value:G.title},{label:"Storage",value:w1(X,G.issueKey).missionDir},{label:"Next",value:G.nextAction}]});return 0}async function MM($,Q,Z,X,U){let W=EM(Q,Z,X);if(W)return W;if(!X&&U){let G=await TM(Z);if(!G)return{ok:!1,code:0};return{ok:!0,issueKey:G}}if(!X)return L$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let J=y8({issueKey:X,prefixes:Z.config.issuePrefixes,allowCustomKey:f$(Q,"allow-custom-key")});if(!J.ok)return m(J.message),{ok:!1,code:1};return{ok:!0,issueKey:J.issueKey}}function EM($,Q,Z){let X=s($,"tracker")??s($,"provider"),U=s($,"issue")??s($,"key");if(!X&&!U)return;if(Z)return L$("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 L$("Missing tracker issue parameters.","sumr mission start --tracker <tracker> --issue <id> --title <title>"),{ok:!1,code:1};let W=X?pU(X):Q.config.tracker?.provider;if(!W)return L$(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 J=a9(W,U);if(!J.ok)return m(J.message),{ok:!1,code:1};let G=y8({issueKey:J.issueKey,prefixes:Q.config.issuePrefixes,allowCustomKey:!0});if(!G.ok)return m(G.message),{ok:!1,code:1};return{ok:!0,issueKey:G.issueKey}}async function TM($){let Q=await a$({message:"Where is this mission tracked?",options:m8.map((W)=>({value:W.value,label:W.label,hint:W.hint})),initialValue:$.config.tracker?.provider??p.Github});if(!Q)return;let Z=lU(Q),X=await _0({message:Z.inputLabel,placeholder:Z.placeholder,validate:(W)=>{let J=a9(Q,W??"");if(!J.ok)return J.message;let G=y8({issueKey:J.issueKey,prefixes:$.config.issuePrefixes,allowCustomKey:!0});return G.ok?void 0:G.message}});if(!X)return;let U=a9(Q,X);return U.ok?U.issueKey:void 0}async function jM($,Q,Z){let X=s($,"title")??s($,"name");if(X)return{ok:!0,title:X};if(!Z)return L$("Missing title.","sumr mission start <issueKey> --title <title>"),{ok:!1,code:1};let W=(await _0({message:"Mission title",placeholder:`Implement ${Q}`,validate:(J)=>{if(!J?.trim())return"Enter a mission title.";return}}))?.trim();return W?{ok:!0,title:W}:{ok:!1,code:0}}var _2,cq,M0,nq,Y2,iq,V$,rq,I1,oq,E0,aq,S$,sq,U1,tq,b8,eq,n9,$L,k8,QL,ZL,qU,XL,UL,WL,s9,JL,LU,GL,_L,T0,YL,zL,BU,HL,AU,VL,OL,KL,MU,qL,LL,T,P$,C$,BL,A,d,AL,EU,p,r,ML,j0,c9,FL,TU,IL,CU,FU,kL,IU,PL,fL,yL,vL,xL,gL,hL,uL,dL,oL,NU,z2,WB,Z7=30,RB=".sumr",NB=".sumr-cache",wB,bB,uB,G2,J7,m8,jA,SA,VU,k$,cU,w8,Tb,N1,UM,b,SM;var aU=w2(()=>{D();D();D();D();D();D();D();D();_2={Auto:"auto",Ask:"ask",Human:"human",Manual:"manual"},cq=[_2.Auto,_2.Ask,_2.Human,_2.Manual],M0={Pending:"pending",Ready:"ready",Done:"done",Skipped:"skipped",Blocked:"blocked"},nq=[M0.Pending,M0.Ready,M0.Done,M0.Skipped,M0.Blocked],Y2={Basic:"basic",PlanningOnly:"planning-only",StandardDelivery:"standard-delivery",FullDelivery:"full-delivery"},iq=[Y2.Basic,Y2.PlanningOnly,Y2.StandardDelivery,Y2.FullDelivery],V$={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"},rq=[V$.IssueSync,V$.ContextResearch,V$.PlanCreate,V$.PlanApprove,V$.BranchCheck,V$.WorkClaim,V$.ImplementationReport,V$.ReviewReport,V$.ValidationReport,V$.QualityGate,V$.PrPrepare,V$.PrCreate,V$.MissionClose],I1={Planning:"planning",Planned:"planned",InProgress:"in_progress",Review:"review",Validated:"validated",Blocked:"blocked",Closed:"closed"},oq=[I1.Planning,I1.Planned,I1.InProgress,I1.Review,I1.Validated,I1.Blocked,I1.Closed],E0={Implementation:"implementation",Review:"review",Validation:"validation",Quality:"quality",Handoff:"handoff"},aq=[E0.Implementation,E0.Review,E0.Validation,E0.Quality,E0.Handoff],S$={Github:"github",Gitlab:"gitlab",Jira:"jira",Linear:"linear",AzureBoards:"azure-boards",Shortcut:"shortcut",Clickup:"clickup",Asana:"asana",Trello:"trello",Notion:"notion",Custom:"custom"},sq=[S$.Github,S$.Gitlab,S$.Jira,S$.Linear,S$.AzureBoards,S$.Shortcut,S$.Clickup,S$.Asana,S$.Trello,S$.Notion,S$.Custom],U1={Github:"github",Gitlab:"gitlab",Bitbucket:"bitbucket",AzureDevops:"azure-devops",Gitea:"gitea",Codeberg:"codeberg",GenericGit:"generic-git",None:"none"},tq=[U1.Github,U1.Gitlab,U1.Bitbucket,U1.AzureDevops,U1.Gitea,U1.Codeberg,U1.GenericGit,U1.None],b8={Preview:"preview",Ask:"ask",Disabled:"disabled"},eq=[b8.Preview,b8.Ask,b8.Disabled],n9={Repo:"repo",Global:"global"},$L=[n9.Repo,n9.Global],k8={Preview:"preview",Draft:"draft",Ready:"ready"},QL=[k8.Preview,k8.Draft,k8.Ready],ZL=_2,qU=cq,XL=M0,UL=nq,WL=Y2,s9=iq,JL=V$,LU=rq,GL=I1,_L=oq,T0=E0,YL=aq,zL=S$,BU=sq,HL=U1,AU=tq,VL=b8,OL=eq,KL=n9,MU=$L,qL=k8,LL=QL,T=ZL,P$=XL,C$=WL,BL=s9,A=JL,d=GL,AL=T0,EU=YL,p=zL,r=HL,ML=VL,j0=KL,c9=qL;FL=["ISSUE","GH","GL"],TU=/^[A-Z][A-Z0-9]*$/,IL=/^[A-Za-z0-9][A-Za-z0-9._-]{1,80}$/;CU=B.object({provider:B.enum(BU).optional()}).strict(),FU=B.object({provider:B.enum(AU).optional(),baseBranch:B.string().min(1).optional(),prMode:B.enum(OL).optional()}).strict(),kL=B.object({uses:B.string().min(1),enabled:B.boolean().optional(),advance:B.string().min(1).optional()}).strict(),IU=B.object({preset:B.string().min(1).optional(),steps:B.array(kL).optional()}).strict(),PL=B.object({repoId:B.string().min(1).optional(),tracker:CU.optional(),git:FU.optional(),flow:IU.optional(),issuePrefixes:B.array(B.string()),retentionDays:B.number().int().positive()}).strict(),fL=B.object({latestPath:B.string().min(1),approved:B.boolean(),approvedAt:B.string().optional()}).strict(),yL=B.object({agent:B.string().min(1),startedAt:B.string().min(1),branch:B.string().optional(),sourceSha:B.string().optional()}).strict(),vL=B.object({reason:B.string().min(1),blockedAt:B.string().min(1)}).strict(),xL=B.object({implementation:B.string().optional(),review:B.string().optional(),validation:B.string().optional(),quality:B.string().optional(),handoff:B.string().optional()}).strict(),gL=B.object({latestPath:B.string().optional(),url:B.string().optional(),mode:B.enum(LL).optional(),createdAt:B.string().optional(),updatedAt:B.string().optional()}).strict(),hL=B.object({preset:B.enum(s9),hash:B.string().min(1),steps:B.array(B.object({uses:B.enum(LU),enabled:B.boolean(),advance:B.enum(qU),status:B.enum(UL),artifactPath:B.string().optional(),updatedAt:B.string().optional()}).strict())}).strict(),uL=B.object({version:B.literal(1),repoId:B.string().min(1),repoLabel:B.string().min(1),storageScope:B.enum(MU),createdAt:B.string().min(1),updatedAt:B.string().min(1),tracker:CU.optional(),git:FU.optional(),flow:IU.optional(),issuePrefixes:B.array(B.string())}).strict(),dL=B.object({version:B.literal(1),missionId:B.string().min(1),repoId:B.string().min(1),repoLabel:B.string().min(1),issueKey:B.string().min(1),issuePathKey:B.string().min(1),title:B.string().min(1),status:B.enum(_L),storageScope:B.enum(MU),createdAt:B.string().min(1),updatedAt:B.string().min(1),branch:B.string().optional(),sourceSha:B.string().optional(),plan:fL.optional(),claim:yL.optional(),reports:xL,pr:gL.optional(),flow:hL.optional(),blocker:vL.optional(),nextAction:B.string().min(1)}).strict();oL=[{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}],NU={[C$.Basic]:[{uses:A.PlanCreate,advance:T.Auto},{uses:A.PlanApprove,advance:T.Human},{uses:A.WorkClaim,advance:T.Auto},{uses:A.ImplementationReport,advance:T.Manual},{uses:A.ReviewReport,advance:T.Manual},{uses:A.ValidationReport,advance:T.Manual},{uses:A.MissionClose,advance:T.Manual}],[C$.PlanningOnly]:[{uses:A.IssueSync,advance:T.Auto},{uses:A.ContextResearch,advance:T.Auto},{uses:A.PlanCreate,advance:T.Auto},{uses:A.PlanApprove,advance:T.Human}],[C$.StandardDelivery]:[{uses:A.IssueSync,advance:T.Auto},{uses:A.ContextResearch,enabled:!1,advance:T.Auto},{uses:A.PlanCreate,advance:T.Auto},{uses:A.PlanApprove,advance:T.Human},{uses:A.BranchCheck,advance:T.Ask},{uses:A.WorkClaim,advance:T.Auto},{uses:A.ImplementationReport,advance:T.Manual},{uses:A.ReviewReport,advance:T.Manual},{uses:A.ValidationReport,advance:T.Manual},{uses:A.QualityGate,advance:T.Manual},{uses:A.PrPrepare,advance:T.Ask},{uses:A.PrCreate,advance:T.Human}],[C$.FullDelivery]:[{uses:A.IssueSync,advance:T.Auto},{uses:A.ContextResearch,advance:T.Auto},{uses:A.PlanCreate,advance:T.Auto},{uses:A.PlanApprove,advance:T.Human},{uses:A.BranchCheck,advance:T.Ask},{uses:A.WorkClaim,advance:T.Auto},{uses:A.ImplementationReport,advance:T.Manual},{uses:A.ReviewReport,advance:T.Manual},{uses:A.ValidationReport,advance:T.Manual},{uses:A.QualityGate,advance:T.Manual},{uses:A.PrPrepare,advance:T.Ask},{uses:A.PrCreate,advance:T.Human},{uses:A.MissionClose,advance:T.Manual}]},z2=[...BL];WB={[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===d.Closed};wB=["cache","mission"],bB=["mission"];uB=new Set(["agent","from","flow","git-provider","issue","key","name","note","older-than","prefix","provider","reason","repo","title","tracker","type","base","base-branch"]);G2={SHOW:"show",LIST:"list",VALIDATE:"validate",EXPORT:"export",USE:"use"};J7=[{value:r.Github,label:"GitHub",hint:"Create pull requests with gh"},{value:r.Gitlab,label:"GitLab",hint:"Create merge requests with glab later"},{value:r.Bitbucket,label:"Bitbucket",hint:"Recognized; manual PR flow in V1"},{value:r.AzureDevops,label:"Azure DevOps",hint:"Recognized; manual PR flow in V1"},{value:r.Gitea,label:"Gitea",hint:"Recognized; manual PR flow in V1"},{value:r.Codeberg,label:"Codeberg",hint:"Recognized; manual PR flow in V1"},{value:r.GenericGit,label:"Generic Git",hint:"No hosted PR automation"},{value:r.None,label:"None",hint:"Disable PR assistance"}];m8=[{value:p.Github,label:"GitHub",hint:"#123 becomes GH-123",inputLabel:"GitHub issue number",placeholder:"123"},{value:p.Gitlab,label:"GitLab",hint:"#123 becomes GL-123",inputLabel:"GitLab issue IID",placeholder:"123"},{value:p.Jira,label:"Jira",hint:"PROJECT-123",inputLabel:"Jira ticket key",placeholder:"PROJECT-123"},{value:p.Linear,label:"Linear",hint:"TEAM-123",inputLabel:"Linear issue identifier",placeholder:"TEAM-123"},{value:p.AzureBoards,label:"Azure Boards",hint:"AB#123 or work item 123",inputLabel:"Azure Boards work item",placeholder:"AB#123"},{value:p.Shortcut,label:"Shortcut",hint:"Story ID or task URL",inputLabel:"Shortcut story ID",placeholder:"12345"},{value:p.Clickup,label:"ClickUp",hint:"Task ID or task URL",inputLabel:"ClickUp task ID",placeholder:"abc123"},{value:p.Asana,label:"Asana",hint:"Task ID or task URL",inputLabel:"Asana task ID",placeholder:"1200000000000000"},{value:p.Trello,label:"Trello",hint:"Card ID or card URL",inputLabel:"Trello card ID",placeholder:"card-slug-or-id"},{value:p.Notion,label:"Notion",hint:"Task/page ID or title",inputLabel:"Notion task ID or title",placeholder:"release checklist"},{value:p.Custom,label:"Custom ID",hint:"Use any local mission label",inputLabel:"Custom mission ID",placeholder:"checkout race condition"}],jA=/^(?:#|GH-|GL-)?([0-9]+)$/i,SA=/^[A-Z][A-Z0-9]*-[0-9]+$/;VU={Skip:"skip"},k$={Create:"create",CreateDraft:"create-draft",Preview:"preview"},cU={Create:k$.Create,CreateDraft:k$.CreateDraft},w8={Yes:"yes",No:"no"},Tb={Plan:"plan",Implementation:T0.Implementation,Review:T0.Review,Validation:T0.Validation,Quality:T0.Quality,Handoff:T0.Handoff,Pr:"pr"},N1=Symbol("init-option-error");UM=["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"}]},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"}]}},SM=K1({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:IA}),E({name:"start",description:b.start.description,group:"modules",visibility:"public",help:b.start,execute:AM}),E({name:"status",description:b.status.description,group:"modules",visibility:"public",help:b.status,execute:lA}),E({name:"next",description:b.next.description,group:"modules",visibility:"public",help:b.next,execute:cA}),E({name:"list",description:b.list.description,group:"modules",visibility:"public",help:b.list,execute:pA}),E({name:"plan",description:b.plan.description,group:"modules",visibility:"public",help:b.plan,execute:nA}),E({name:"approve",description:b.approve.description,group:"modules",visibility:"public",help:b.approve,execute:iA}),E({name:"claim",description:b.claim.description,group:"modules",visibility:"public",help:b.claim,execute:rA}),E({name:"report",description:b.report.description,group:"modules",visibility:"public",help:b.report,execute:oA}),E({name:"block",description:b.block.description,group:"modules",visibility:"public",help:b.block,execute:aA}),E({name:"unblock",description:b.unblock.description,group:"modules",visibility:"public",help:b.unblock,execute:sA}),E({name:"close",description:b.close.description,group:"modules",visibility:"public",help:b.close,execute:tA}),E({name:"clean",description:b.clean.description,group:"modules",visibility:"public",help:b.clean,execute:eA}),E({name:"flow",description:b.flow.description,group:"modules",visibility:"public",help:b.flow,execute:zA}),E({name:"pr",description:b.pr.description,group:"modules",visibility:"public",help:b.pr,execute:WM})]})});var EG={};N2(EG,{validatePlaybookSlice:()=>uW,playbookModule:()=>TR,PlaybookSliceSchema:()=>hW});import{z as I$}from"zod";import{existsSync as dW,mkdirSync as FM,readdirSync as IM,writeFileSync as DM}from"fs";import{join as E7,resolve as mW}from"path";import{existsSync as f7,readFileSync as RM}from"fs";import{join as NM}from"path";import{stdout as sE}from"process";import{log as UT}from"@clack/prompts";import{existsSync as h7,mkdirSync as WT,readdirSync as JT,readFileSync as GT,renameSync as _T,rmSync as j7,statSync as YT,writeFileSync as zT}from"fs";import{dirname as HT,join as u7}from"path";import{existsSync as GJ}from"fs";import{resolve as C7}from"path";import{existsSync as pT,readdirSync as cT,readFileSync as nT,statSync as iT}from"fs";import{basename as ZW,dirname as Y6,join as rT,resolve as oT}from"path";import{existsSync as c7,readdirSync as n7,readFileSync as Fj,statSync as Ij}from"fs";import{homedir as Dj}from"os";import{basename as I7,dirname as b0,join as R$,resolve as y1}from"path";import{fileURLToPath as VJ}from"url";import{existsSync as bj,readFileSync as kj,realpathSync as WW,statSync as Pj}from"fs";import{isAbsolute as V7,join as fj,relative as JW,resolve as yj}from"path";import{existsSync as dj,realpathSync as mj,statSync as lj}from"fs";import{existsSync as PS}from"fs";import{relative as o7,resolve as a7,sep as BJ}from"path";import{sep as XC}from"path";import{existsSync as EJ,readFileSync as TJ,rmSync as OW}from"fs";import{join as S2,relative as jJ,resolve as N7,sep as t7}from"path";import{existsSync as iC,readFileSync as rC}from"fs";import{join as oC}from"path";import{existsSync as kJ,readFileSync as PJ,writeFileSync as fJ}from"fs";import{join as yJ}from"path";import{existsSync as pJ,mkdirSync as LF,readFileSync as BF,writeFileSync as AF}from"fs";import{join as cJ}from"path";import{existsSync as aJ,readdirSync as DF,rmSync as b7}from"fs";import{basename as RF,join as J1}from"path";import{chmodSync as fF,existsSync as O6,readdirSync as K6,readFileSync as q6,rmSync as UQ}from"fs";import{basename as WQ,extname as L6,join as B$}from"path";import{basename as vF,join as NW}from"path";import{existsSync as dF,readFileSync as mF}from"fs";import{join as lF}from"path";import{chmodSync as qI,existsSync as LI,readFileSync as BI}from"fs";import{join as I2}from"path";import{existsSync as AI,readFileSync as MI}from"fs";import{join as EI}from"path";import{existsSync as TI,readFileSync as jI}from"fs";import{basename as SI,join as CI}from"path";import{join as vW}from"path";import{existsSync as xD}from"fs";import{resolve as AG}from"path";import{resolve as QR}from"path";function uW($){let Q=hW.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 L2($){return $.playbook.agentsMd??={},$.playbook.agentsMd}function v1($){return $.mission??={},$.mission}function lW($){let Q=v1($);return Q.git??={},Q.git}function uM($){let Q=v1($);return Q.tracker??={},Q.tracker}function r8($){let Q=v1($);return Q.flow??={},Q.flow}function dM($){let Q=r8($);return Q.steps??=[],Q.steps}function mM($){let Q=v1($);return Q.issuePrefixes??=[],Q.issuePrefixes}function lM($){return wM.includes($)}function pM($){return bM.includes($)}function cM($){return kM.includes($)}function nM($){return PM.includes($)}function iM($){return fM.includes($)}function tM($){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(...pW($));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(`
|
|
342
|
+
`)}function eM($,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??sM;if(Z.length>0){$.push(" targets:");for(let X of Z)$.push(` - ${X===rM?oM:X}`)}}function pW($){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)eM(Q,$.playbook.agentsMd);return Q}function y7($){return NM($,$E)}function C2($){return f7(y7($))}function F2($){let Q=y7($);if(!f7(Q))throw Error(`No sumr.yaml found in ${$}. Run \`sumr playbook config\` to set up this repo.`);let Z=RM(Q,"utf8");return FE(Z)}function WE($,Q){let Z=y7($);if(!f7(Z)){J0(Z,tM(Q));return}g1(Z,"playbook",pW(Q),{sectionComment:aM})}function o8($){return Object.entries($.playbook.channels).filter(([,Q])=>Q).map(([Q])=>Q)}function a8(){return structuredClone(UE)}function z1($){let Q=$.trim();if(!Q)return;let Z=Q[0],X=Q.at(-1);if((Z===ZE||Z===XE)&&X===Z&&Q.length>=2)return Q.slice(1,-1).trim()||void 0;return Q.replace(/\s+#.*$/,"").trim()||void 0}function JE($,Q,Z){if(/^ {4}enabled:\s*(true|false)/.test($))return L2(Z).enabled=/true/.test($),!0;if(/^ {4}claudeMd:\s*(true|false)/.test($))return L2(Z).claudeMd=/true/.test($),!0;if(/^ {4}targets:\s*$/.test($))return Q.playbookSection=_$.agentsMdTargets,L2(Z).targets=[],!0;return!1}function GE($,Q,Z){if(Q.playbookSection===_$.channels){let X=$.match(/^\s{4}(\w+):\s*(true|false)/),U=X?.[1],W=X?.[2];if(U&&W)Z.playbook.channels[U]=W===QE.TRUE}else if(Q.playbookSection===_$.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=_$.channels,Z.playbook.channels={},!0;if(/^ {2}sources:/.test($))return Q.playbookSection=_$.sources,Z.playbook.sources=[],!0;if(/^ {2}hideGen:\s*(true|false)/.test($))return Z.playbook.hideGen=/true/.test($),Q.playbookSection=_$.none,!0;if(/^ {2}agentsMd:\s*$/.test($))return Q.playbookSection=_$.agentsMd,L2(Z),!0;return!1}function YE($,Q,Z){if(Q.playbookSection!==_$.agentsMdTargets||!/^ {6}-\s+/.test($))return!1;let U=$.match(/^ {6}-\s+(.+)$/)?.[1];if(U){let W=z1(U);if(W){let J=L2(Z);J.targets??=[],J.targets.push(W)}}return!0}function zE($,Q,Z){if(_E($,Q,Z))return!0;if(Q.playbookSection===_$.agentsMd)return JE($,Q,Z);if(YE($,Q,Z))return!0;if(/^ {2}[A-Za-z][A-Za-z0-9_-]*:/.test($))return Q.playbookSection=_$.none,!0;return GE($,Q,Z),!1}function HE($,Q){let Z=$.match(/^ {4}(provider|baseBranch|prMode):\s*(.+)$/);if(!Z?.[1]||!Z[2])return;let X=Z[1],U=z1(Z[2]),W=lW(Q);if(X===Y7.PROVIDER&&U&&pM(U))W.provider=U;else if(X===Y7.BASE_BRANCH&&U)W.baseBranch=U;else if(X===Y7.PR_MODE&&U&&cM(U))W.prMode=U}function VE($,Q,Z){if(/^ {4}preset:\s*(.+)$/.test($)){let X=$.match(/^ {4}preset:\s*(.+)$/)?.[1],U=X?z1(X):void 0;if(U&&nM(U))r8(Z).preset=U;return!0}if(/^ {4}steps:\s*$/.test($))return Q.missionSection=t.flowSteps,Q.currentFlowStepIndex=-1,r8(Z).steps=[],!0;return!1}function OE($,Q){if(Q)Q.enabled=/^ {8}enabled:\s*true/.test($)}function KE($,Q){let Z=$.match(/^ {8}advance:\s*(.+)$/)?.[1],X=Z?z1(Z):void 0;if(X&&iM(X)&&Q)Q.advance=X}function qE($,Q,Z){if(/^ {6}-\s+uses:\s*(.+)$/.test($)){let X=$.match(/^ {6}-\s+uses:\s*(.+)$/)?.[1],U=X?z1(X):void 0;if(U){let W=dM(Z);W.push({uses:U}),Q.currentFlowStepIndex=W.length-1}return!0}if(Q.currentFlowStepIndex>=0&&/^ {8}enabled:\s*(true|false)/.test($))return OE($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;if(Q.currentFlowStepIndex>=0&&/^ {8}advance:\s*(.+)$/.test($))return KE($,Z.mission?.flow?.steps?.[Q.currentFlowStepIndex]),!0;return!1}function LE($,Q,Z){if(/^ {2}issuePrefixes:\s*$/.test($))return Q.missionSection=t.issuePrefixes,v1(Z).issuePrefixes=[],!0;if(/^ {2}tracker:\s*$/.test($))return Q.missionSection=t.tracker,uM(Z),!0;if(/^ {2}git:\s*$/.test($))return Q.missionSection=t.git,lW(Z),!0;if(/^ {2}flow:\s*$/.test($))return Q.missionSection=t.flow,Q.currentFlowStepIndex=-1,r8(Z),!0;return!1}function BE($,Q,Z){let X=$.match(/^ {2}(repoId|retentionDays):\s*(.+)$/);if(!X?.[1]||!X[2])return!1;let U=X[1],W=z1(X[2]),J=v1(Z);if(Q.missionSection=t.none,U===sU.REPO_ID&&W)J.repoId=W;else if(U===sU.RETENTION_DAYS&&W&&/^\d+$/.test(W))J.retentionDays=Number(W);return!0}function AE($,Q,Z){if(Q.missionSection!==t.tracker||!/^ {4}provider:\s*(.+)$/.test($))return!1;let X=$.match(/^ {4}provider:\s*(.+)$/)?.[1],U=X?z1(X)?.toLowerCase():void 0;if(U&&lM(U))v1(Z).tracker={provider:U};return!0}function ME($,Q,Z){if(AE($,Q,Z))return!0;if(Q.missionSection===t.git)return HE($,Z),!0;if(Q.missionSection===t.flow)return VE($,Q,Z);if(Q.missionSection===t.flowSteps)return qE($,Q,Z);return}function EE($,Q,Z){if(Q.missionSection!==t.issuePrefixes||!/^ {4}-\s+(.+)$/.test($))return;let X=$.match(/^ {4}-\s+(.+)$/)?.[1],U=X?z1(X):void 0;if(U)mM(Z).push(U.toUpperCase())}function TE($,Q,Z){if(LE($,Q,Z))return!0;let X=ME($,Q,Z);if(X!==void 0)return X;if(BE($,Q,Z))return!0;if(/^ {2}\S/.test($))Q.missionSection=t.none;return EE($,Q,Z),!1}function jE($,Q,Z){if(/^playbook:/.test($))return Q.topSection=G1.playbook,Q.playbookSection=_$.none,Q.missionSection=t.none,!0;if(/^kontract:/.test($))return Q.topSection=G1.kontract,Q.playbookSection=_$.none,Q.missionSection=t.none,Z.kontract??={},!0;if(/^mission:/.test($))return Q.topSection=G1.mission,Q.playbookSection=_$.none,Q.missionSection=t.none,v1(Z),!0;if(/^\w/.test($)&&$!==_7.PLAYBOOK&&$!==_7.KONTRACT&&$!==_7.MISSION)Q.topSection=G1.root,Q.playbookSection=_$.none,Q.missionSection=t.none;return!1}function SE($,Q){let Z=$.match(/^\s{2}(input|output):\s*(.+)$/),X=Z?.[1],U=Z?.[2];if(!X||!U)return;let W=z1(U);if(!W)return;if(Q.kontract??={},X===hM.INPUT)Q.kontract.input=W;else Q.kontract.output=W}function CE($,Q,Z){if(jE($,Q,Z))return;if(Q.topSection===G1.root){let X=$.match(/^version:\s*(\d+)/);if(X)Z.version=Number(X[1])}else if(Q.topSection===G1.playbook)zE($,Q,Z);else if(Q.topSection===G1.kontract)SE($,Z);else if(Q.topSection===G1.mission)TE($,Q,Z)}function FE($){let Q=a8(),Z=$.split(`
|
|
343
|
+
`),X={topSection:G1.root,playbookSection:_$.none,missionSection:t.none,currentFlowStepIndex:-1};for(let U of Z){let W=U.trimEnd();if(!W||W.startsWith("#"))continue;CE(W,X,Q)}return Q}async function R0($,Q,Z="mauve"){let{note:X}=await import("@clack/prompts");X(Q,$,w$(Z))}async function N0($,Q){await R0($,Q,"pink")}function tU($){return $.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function RE($,Q,Z,X){let U=`name: ${Q}
|
|
344
|
+
title: ${Z}
|
|
345
|
+
description: "${X}"`;if($===P1.SKILL)return`---
|
|
346
|
+
${U}
|
|
347
|
+
tags: []
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## When to Use
|
|
351
|
+
|
|
352
|
+
- TODO: describe when to use this skill.
|
|
353
|
+
|
|
354
|
+
## Overview
|
|
355
|
+
|
|
356
|
+
TODO: add content.
|
|
357
|
+
`;if($===P1.TEAM_MEMBER)return`---
|
|
358
|
+
category: team-member
|
|
359
|
+
${U}
|
|
360
|
+
modelTier: coding
|
|
361
|
+
|
|
362
|
+
# Codex CLI agent profile options
|
|
363
|
+
codex:
|
|
364
|
+
sandbox_mode: read-only
|
|
365
|
+
|
|
366
|
+
# Claude Code subagent options
|
|
367
|
+
claude:
|
|
368
|
+
tools: Read, Grep, Glob
|
|
369
|
+
mode: subagent
|
|
370
|
+
|
|
371
|
+
# Gemini CLI subagent options
|
|
372
|
+
gemini:
|
|
373
|
+
kind: generalist
|
|
374
|
+
|
|
375
|
+
# GitHub Copilot custom agent options
|
|
376
|
+
copilot:
|
|
377
|
+
tools: read
|
|
378
|
+
|
|
379
|
+
# OpenCode agent options
|
|
380
|
+
opencode:
|
|
381
|
+
mode: subagent
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Role
|
|
385
|
+
|
|
386
|
+
TODO: describe the team-member role and responsibilities.
|
|
387
|
+
|
|
388
|
+
## Instructions
|
|
389
|
+
|
|
390
|
+
TODO: add instructions.
|
|
391
|
+
`;if($===P1.WORKFLOW)return`---
|
|
392
|
+
category: workflow
|
|
393
|
+
${U}
|
|
394
|
+
target: ${Q}.md
|
|
395
|
+
|
|
396
|
+
# Claude Code slash command options
|
|
397
|
+
claude:
|
|
398
|
+
argument-hint: "[optional-args]"
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
# Purpose
|
|
402
|
+
|
|
403
|
+
TODO: describe when the AI should run this user-invoked workflow.
|
|
404
|
+
|
|
405
|
+
## Instructions
|
|
406
|
+
|
|
407
|
+
TODO: write the reusable prompt or procedure.
|
|
408
|
+
`;if($===P1.LIFECYCLE)return`---
|
|
409
|
+
category: lifecycle
|
|
410
|
+
${U}
|
|
411
|
+
event: SessionStart
|
|
412
|
+
target: ${Q}.py
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
## Purpose
|
|
416
|
+
|
|
417
|
+
TODO: describe what this lifecycle automation does.
|
|
418
|
+
|
|
419
|
+
\`\`\`python
|
|
420
|
+
#!/usr/bin/env python3
|
|
421
|
+
# TODO: implement lifecycle logic
|
|
422
|
+
import sys
|
|
423
|
+
sys.exit(0)
|
|
424
|
+
\`\`\`
|
|
425
|
+
`;return`---
|
|
426
|
+
category: reference
|
|
427
|
+
${U}
|
|
428
|
+
label: ${Z}
|
|
429
|
+
when: TODO: describe when to load this reference
|
|
430
|
+
order: 10
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## Overview
|
|
434
|
+
|
|
435
|
+
TODO: add reference content.
|
|
436
|
+
`}function NE($){if($===P1.TEAM_MEMBER)return".tm.md";if($===P1.WORKFLOW)return".wf.md";if($===P1.LIFECYCLE)return".lc.md";if($===P1.REFERENCE)return".rf.md";return".md"}function wE($,Q){let Z=new Set;for(let X of $){let U=mW(Q,X);if(!dW(U))continue;Z.add(X);try{for(let W of IM(U,{withFileTypes:!0}))if(W.isDirectory()&&!W.name.startsWith("."))Z.add(E7(X,W.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 kE($,Q,Z){let X=await $({message:"Name (kebab-case identifier)",placeholder:"my-topic",validate(U){let W=tU(U??IE);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 tU(X)}async function PE($,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 fE($,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 yE($,Q,Z,X,U,W){if(typeof Z==="string")return Z;let G=wE($,Q).map((Y)=>({value:Y,label:Y})),_=await X({message:"Destination folder",options:G.length>0?G:[{value:$[0]??"docs",label:$[0]??"docs"}]});if(U(_))return W("Cancelled"),null;return _}async function vE($){let{extras:Q}=$.args,Z=process.cwd(),{intro:X,outro:U,select:W,text:J,isCancel:G}=await import("@clack/prompts");X("Playbook \u2014 scaffold new doc");let _=C2(Z)?F2(Z).playbook.sources:["docs"],Y=await bE(W,G,U);if(!Y)return 0;let z=await kE(J,G,U);if(!z)return 0;let H=await PE(J,G,U);if(!H)return 0;let V=await fE(J,G,U);if(!V)return 0;let O=await yE(_,Z,Q.source,W,G,U);if(!O)return 0;let K=NE(Y),L=`${z}${K}`,q=mW(Z,O),S=E7(q,L);if(dW(S))return await N0("File already exists",`${S}
|
|
437
|
+
|
|
438
|
+
Choose a different name or folder.`),1;try{FM(q,{recursive:!0}),DM(S,RE(Y,z,H,V),"utf8")}catch(I){return await N0("Could not write file",I instanceof Error?I.message:String(I)),1}return U(`Created ${E7(O,L)}`),0}function nE($){return v7.includes($)}function iE($){return x7.includes($)}function v$($,Q){let Z=Q.includes("```")?"````":"```";return[`${Z}${$}`,Q,Z].join(`
|
|
439
|
+
`)}function nW($){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(`
|
|
440
|
+
`),"",rE()].join(`
|
|
441
|
+
`)}function rE(){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.","",v$("yaml",`---
|
|
442
|
+
category: team-member
|
|
443
|
+
name: codebase-reviewer
|
|
444
|
+
title: Codebase Reviewer
|
|
445
|
+
description: "Reviews code for correctness, security, behavior regressions, and missing tests."
|
|
446
|
+
modelTier: reasoning
|
|
447
|
+
|
|
448
|
+
# Codex CLI agent profile options
|
|
449
|
+
codex:
|
|
450
|
+
sandbox_mode: read-only
|
|
451
|
+
model_reasoning_effort: high
|
|
452
|
+
|
|
453
|
+
# Claude Code subagent options
|
|
454
|
+
claude:
|
|
455
|
+
tools: Read, Grep, Glob
|
|
456
|
+
mode: subagent
|
|
457
|
+
|
|
458
|
+
# Cursor project rule options
|
|
459
|
+
cursor:
|
|
460
|
+
globs: [src/**/*.ts, tests/**/*.ts]
|
|
461
|
+
|
|
462
|
+
# GitHub Copilot custom agent options
|
|
463
|
+
copilot:
|
|
464
|
+
tools: read
|
|
465
|
+
|
|
466
|
+
# Gemini CLI subagent options
|
|
467
|
+
gemini:
|
|
468
|
+
kind: codebase_investigator
|
|
469
|
+
max_turns: 20
|
|
470
|
+
|
|
471
|
+
# OpenCode agent options
|
|
472
|
+
opencode:
|
|
473
|
+
mode: subagent
|
|
474
|
+
---`),"","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(`
|
|
475
|
+
`)}function oE($){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(`
|
|
476
|
+
`)}function iW($){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(`
|
|
477
|
+
`)}function rW($){return["## Extraction Markers","","Use extraction markers for dedicated examples, samples, templates, and long reusable blocks.","",v$("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(`
|
|
478
|
+
`)}function oW($){return["## Flow Documentation","",$.sections.flows,"","Use a one-line arrow flow when the process is mostly linear:","",v$("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:","",v$("mermaid",`flowchart LR
|
|
479
|
+
intake["intake"] --> research["researcher"]
|
|
480
|
+
research --> draft["draft plan"]
|
|
481
|
+
draft --> approval{"Human approves?"}
|
|
482
|
+
approval -->|yes| ready["ready"]
|
|
483
|
+
approval -->|changes requested| draft
|
|
484
|
+
ready --> implement["implementer"]
|
|
485
|
+
implement --> review["review"]
|
|
486
|
+
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(`
|
|
487
|
+
`)}function aW($){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/
|
|
488
|
+
-- team-members/
|
|
489
|
+
|-- reviewer.tm.md
|
|
490
|
+
-- docs-researcher.tm.md
|
|
491
|
+
-- workflows/
|
|
492
|
+
-- ui-review.wf.md
|
|
493
|
+
-- lifecycle/
|
|
494
|
+
|-- pre-tool-use-policy.lc.md
|
|
495
|
+
-- 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.","","### Lifecycle","",v$("markdown",`---
|
|
496
|
+
name: session-start-context
|
|
497
|
+
title: Session Start Context Lifecycle
|
|
498
|
+
description: "Adds repository startup context to Codex sessions."
|
|
499
|
+
category: lifecycle
|
|
500
|
+
event: SessionStart
|
|
501
|
+
matcher: startup|resume
|
|
502
|
+
timeout: 10
|
|
503
|
+
statusMessage: "Loading repository context"
|
|
504
|
+
target: session_start_context.py
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
\`\`\`python
|
|
508
|
+
#!/usr/bin/env python3
|
|
509
|
+
import json
|
|
510
|
+
|
|
511
|
+
print(json.dumps({
|
|
512
|
+
"hookSpecificOutput": {
|
|
513
|
+
"hookEventName": "SessionStart",
|
|
514
|
+
"additionalContext": "Load repository context before non-trivial work."
|
|
515
|
+
}
|
|
516
|
+
}))
|
|
517
|
+
\`\`\``),"","### Workflow","",v$("markdown",`---
|
|
518
|
+
name: ui-review
|
|
519
|
+
title: UI Review Workflow
|
|
520
|
+
description: "Runs browser UI review and reports pass/fail evidence."
|
|
521
|
+
category: workflow
|
|
522
|
+
target: ui-review.md
|
|
523
|
+
|
|
524
|
+
# Claude Code slash command options
|
|
525
|
+
claude:
|
|
526
|
+
model: opus
|
|
527
|
+
argument-hint: "[headed] [filename-filter]"
|
|
528
|
+
---
|
|
529
|
+
|
|
530
|
+
# Purpose
|
|
531
|
+
|
|
532
|
+
Run browser UI review for selected user stories.
|
|
533
|
+
|
|
534
|
+
## Instructions
|
|
535
|
+
|
|
536
|
+
- Discover relevant user story files.
|
|
537
|
+
- Execute each story with browser automation.
|
|
538
|
+
- Save screenshots under a gitignored run folder.
|
|
539
|
+
- Report pass, fail, blocked, and untested steps explicitly.`),"","### Team Member","",v$("markdown",`---
|
|
540
|
+
name: reviewer
|
|
541
|
+
title: Reviewer Team Member
|
|
542
|
+
description: "Read-only reviewer focused on correctness, security, and missing tests."
|
|
543
|
+
category: team-member
|
|
544
|
+
target: reviewer
|
|
545
|
+
modelTier: reasoning
|
|
546
|
+
|
|
547
|
+
# Codex CLI agent profile options
|
|
548
|
+
codex:
|
|
549
|
+
sandbox_mode: read-only
|
|
550
|
+
model_reasoning_effort: high
|
|
551
|
+
|
|
552
|
+
# Claude Code subagent options
|
|
553
|
+
claude:
|
|
554
|
+
tools: Read, Grep, Glob
|
|
555
|
+
mode: subagent
|
|
556
|
+
|
|
557
|
+
# Gemini CLI subagent options
|
|
558
|
+
gemini:
|
|
559
|
+
kind: codebase_investigator
|
|
560
|
+
max_turns: 20
|
|
561
|
+
|
|
562
|
+
# OpenCode agent options
|
|
563
|
+
opencode:
|
|
564
|
+
mode: subagent
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
Review code like an owner.
|
|
568
|
+
Prioritize correctness, security, behavior regressions, and missing test coverage.
|
|
569
|
+
Return findings first with file and line references.`),"","Rules:","- Keep canonical source docs in domain-oriented folders, not in generated output folders.","- 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(`
|
|
570
|
+
`)}function sW($){return["## Checklist","",...$.checklist.map((Q)=>`- [ ] ${Q}`)].join(`
|
|
571
|
+
`)}function $W($,Q){if(Q)return[`## Example: ${Q}`,"",v$("markdown",$.examples[Q])].join(`
|
|
572
|
+
`);return["## Examples","","### overview.md","",v$("markdown",$.examples.overview),"","### Reference File","",v$("markdown",$.examples.reference),"","### Folder","",v$("text",$.examples.folder)].join(`
|
|
573
|
+
`)}function z7($,Q){if(Q===y$.OVERVIEW)return["# SUMR Playbook Authoring","",$.sections.overview,"","## Source of Truth","",`- Local mode: ${$.sourceOfTruth.localMode}`,`- Cloud mode: ${$.sourceOfTruth.cloudMode}`,`- Generated output: ${$.sourceOfTruth.generatedOutput}`].join(`
|
|
574
|
+
`);if(Q===y$.FRONTMATTER)return[nW($),"",oE($)].join(`
|
|
575
|
+
`);if(Q===y$.STRUCTURE)return iW($);if(Q===y$.REFERENCES)return["## References","",$.sections.references,"","Reference file frontmatter:","","```yaml",`---
|
|
576
|
+
category: reference
|
|
577
|
+
name: my-topic-detail
|
|
578
|
+
title: Detail Section Title
|
|
579
|
+
description: "Specific supporting detail for my topic."
|
|
580
|
+
label: Detail
|
|
581
|
+
when: Doing X, reviewing Y, adding Z
|
|
582
|
+
order: 10
|
|
583
|
+
---`,"```","","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(`
|
|
584
|
+
`);if(Q===y$.EXTRACTION)return rW($);if(Q===y$.FLOWS)return oW($);if(Q===y$.CODEX)return aW($);if(Q===y$.MODULE_RESOURCES)return["## Module AI Resources","",$.sections.moduleResources].join(`
|
|
585
|
+
`);return sW($)}function tW($={}){let Q=cW;if($.example)return $W(Q,$.example);if($.section)return z7(Q,$.section);return[z7(Q,y$.OVERVIEW),"",nW(Q),"",iW(Q),"",rW(Q),"",oW(Q),"",aW(Q),"",z7(Q,y$.MODULE_RESOURCES),"",$W(Q),"",sW(Q)].join(`
|
|
586
|
+
`)}function aE($={}){return{contract:cW,selection:$,markdown:tW($)}}function _1($,Q,Z,X,U){return{version:1,ok:Q,command:$,data:Z,warnings:X,error:U}}function g7($){sE.write($)}function Y1($){g7(`${JSON.stringify($,null,2)}
|
|
587
|
+
`)}function $T($){return $.args.positionals.find((Q)=>Q!==tE)}function QT($){let{extras:Q}=$.args,Z=$T($),X=typeof Q.example==="string"?Q.example:void 0,U=typeof Q.section==="string"?Q.section:X?void 0:Z,W,J;if(U!==void 0){if(!nE(U))return{selection:{},error:{code:"INVALID_SECTION",message:`Unknown authoring section "${U}". Valid sections: ${v7.join(", ")}`}};W=U}if(X!==void 0){if(!iE(X))return{selection:{},error:{code:"INVALID_EXAMPLE",message:`Unknown authoring example "${X}". Valid examples: ${x7.join(", ")}`}};J=X}if(W&&J)return{selection:{},error:{code:"CONFLICTING_SELECTION",message:"Choose either --section or --example, not both."}};return{selection:{section:W,example:J},error:null}}async function ZT($){let Q=$.args.extras.json===!0,{selection:Z,error:X}=QT($);if(X){if(Q)Y1(_1("playbook authoring",!1,null,[],X));else await N0("Invalid Playbook authoring request",X.message);return 1}if(Q)return Y1(_1("playbook authoring",!0,aE(Z),[],null)),0;return g7(`${tW(Z)}
|
|
588
|
+
`),0}function J6($){return A$.find((Q)=>Q.id===$)}function $0($,Q){let Z=$;for(let[X,U]of Object.entries(VT)){let W=Q[X];if(W!==void 0)Z=Z.replaceAll(U,W)}return Z}function eW($){return OT[$]??"Team member"}function n8($,Q){return $0($,{TEAM_MEMBER:eW(Q)})}function ZJ($){return $.source!==r$.LOCAL}function g$($){if(!ZJ($))return $.name;if($.name.startsWith(H7))return $.name;if($.module)return`${H7}${$.module}${$J}${$.name}`;return`${H7}${$.name}`}function X0($){return g$($).replace($J,"-")}function qT($){return ZJ($)?"core":"local"}function d7($){let Q={"created-by":QJ,"content-source":qT($),"canonical-name":g$($)};if($.module)Q.module=$.module;if($.insight?.length)Q.insight=$.insight;if($.teamMembers?.length)Q["team-member"]=$.teamMembers.map((Z)=>g$({name:Z,source:$.source,module:$.module}));if($.review===!0)Q.review=!0;return Q}function XJ($,Q){if(!$)throw Error(`Channel definition for "${Q}" not found`);return $}function x$($,Q){if(!Q)WT($,{recursive:!0})}function a($,Q,Z){if(Z)return;let X=`${$}.sumr-tmp-${Date.now()}`;try{x$(HT($),!1),zT(X,Q,"utf8"),_T(X,$)}finally{if(h7(X))try{j7(X,{force:!0})}catch{}}}function LT($,Q,Z,X,U){let W=u7($,Q),J;try{J=YT(W)}catch{return}if(!Z.test(Q)&&!BT(W,J.isDirectory()))return;if(U.push(W),X)return;try{if(J.isDirectory())j7(W,{recursive:!0,force:!0});else j7(W,{force:!0})}catch{}}function E2($,Q,Z,X){if(!h7($))return[];let U;try{U=JT($)}catch{return[]}let W=[];for(let J of U){if(Q.has(J))continue;LT($,J,Z,X,W)}return W}function BT($,Q){let Z=Q?u7($,"SKILL.md"):$;if(!h7(Z))return!1;try{let X=GT(Z,"utf8");return AT(X)}catch{return!1}}function AT($){let Q=$.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];if(!Q)return!1;return new RegExp(`^\\s{2}created-by:\\s*${G6(QJ)}\\s*$`,"m").test(Q)}function G6($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function UJ($,Q,Z){if(!$.teamMembers?.length)return Q;let X=$.teamMembers.map((H)=>`\`${g$({name:H,source:$.source,module:$.module})}\``),U=X.length===1?X[0]:`${X.slice(0,-1).join(", ")} and ${X.at(-1)}`,W=MT(eW(Z)),J=["","","## 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 ${W}; do not require a longer prompt.`,"If delegation is unavailable, state the reason explicitly and apply the same role checklists locally.",""].join(`
|
|
589
|
+
`),G=Q.match(/## When to Use\b/i);if(!G||G.index===void 0)return`${Q.trimEnd()}${J}`;let _=G.index+G[0].length,Y=Q.indexOf(`
|
|
590
|
+
## `,_),z=Y===-1?Q.length:Y;return`${Q.slice(0,z).trimEnd()}${J}${Q.slice(z)}`}function MT($){if($==="Team member")return"team members";return`${$.toLowerCase()}s`}function f0($,Q){return{...$,description:n8($.description,Q),when:$.when?n8($.when,Q):$.when,body:n8($.body,Q),channels:ET($.channels,Q),references:$.references.map((Z)=>f0(Z,Q))}}function ET($,Q){if(!$)return $;return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,Z===Q?S7(X,Q):X]))}function S7($,Q){if(typeof $==="string")return n8($,Q);if(Array.isArray($))return $.map((Z)=>S7(Z,Q));if(typeof $==="object"&&$!==null)return Object.fromEntries(Object.entries($).map(([Z,X])=>[Z,S7(X,Q)]));return $}function TT($,Q,Z){if(Z.length===0){$.push(`${Q}: []`);return}$.push(`${Q}:`);for(let X of Z)$.push(` - ${s8(X)}`)}function jT($,Q,Z){$.push(`${Q}:`);for(let[X,U]of Object.entries(Z))if(Array.isArray(U)){$.push(` ${X}:`);for(let W of U)$.push(` - ${s8(W)}`)}else $.push(` ${X}: ${s8(U)}`)}function _6($){let Q=["---"];for(let[Z,X]of Object.entries($))if(typeof X==="boolean")Q.push(`${Z}: ${X}`);else if(Array.isArray(X))TT(Q,Z,X);else if(typeof X==="object")jT(Q,Z,X);else Q.push(`${Z}: ${s8(X)}`);return Q.push("---"),Q.join(`
|
|
591
|
+
`)}function s8($){if(typeof $==="boolean"||typeof $==="number")return String($);return/[:#{}[\],&*?|<>=!%@`]/.test($)||$.trim()!==$?`"${$.replace(/"/g,"\\\"")}"`:$}function WJ($,Q={}){let Z=IT($),X=[],U=$;for(let J of $.matchAll(ST)){if(J.index===void 0||DT(J.index,Z))continue;let[,G,_]=J;if(!G||_===void 0)continue;X.push({name:G,content:_.trim()}),U=U.replace(J[0],"")}let W=RT(X);if(U=U.trim(),Q.addResourceLinks&&W.length>0)U=`${U}
|
|
592
|
+
|
|
593
|
+
${NT(W)}`.trim();return{mainContent:U,sections:W}}function IT($){return Array.from($.matchAll(CT),(Q)=>({start:Q.index??0,end:(Q.index??0)+Q[0].length}))}function DT($,Q){return Q.some((Z)=>$>=Z.start&&$<Z.end)}function RT($){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(`
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
`)}))}function NT($){return`## Additional resources
|
|
598
|
+
|
|
599
|
+
${$.map((Z)=>{let X=`${Z.name}.md`;return`- For ${wT(Z.name)}, see [${X}](${X})`}).join(`
|
|
600
|
+
`)}`}function wT($){return $.replace(/[-_]+/g," ").toLowerCase()}function bT($,Q,Z){return E2(u7(process.cwd(),$),new Set,Q,Z)}function kT($){return[$.outputDir,...PT($)]}function PT($){return $.legacyOutputDirs??FT}function m7($,Q){let Z=[];for(let X of $)for(let U of kT(X))Z.push(...bT(U,X.filePattern,Q));return Z}function JJ($){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(`
|
|
601
|
+
`)}async function yT($){let{extras:Q}=$.args,Z=Q.json===!0,X=typeof Q.channel==="string"?Q.channel:void 0;if(X!==void 0&&!i$.includes(X)){let z=`Unknown channel: "${X}". Valid channels: ${i$.join(", ")}`;if(Z)Y1(_1("playbook clean",!1,null,[],{code:"INVALID_CHANNEL",message:z}));else await N0("Invalid Playbook channel",[`Requested: ${X}`,"",`Valid channels: ${i$.join(", ")}`].join(`
|
|
602
|
+
`));return 1}let U=X?A$.filter((z)=>z.id===X):A$,W=m7(U,Q["dry-run"]===!0),J={channelsCleaned:U.map((z)=>z.id),filesRemoved:W};if(Z)return Y1(_1("playbook clean",!0,J,[],null)),0;let G=Q["dry-run"]===!0?" (dry run)":"",_=U.length===1?"":"s",Y=W.length===1?"":"s";return UT.success(`Cleaned ${U.length} channel${_}${G}: ${W.length} file${Y} removed.`),0}function xT($,Q,Z){return[...$.map((X)=>({value:X.key,label:X.label,hint:X.hint()})),{value:t8.SAVE,label:Q?"Save & exit *":"Save & exit",hint:Z?"creates config":"updates config"},{value:t8.DISCARD,label:"Exit without saving",hint:Q?"changes will be lost":""}]}async function gT($,Q,Z,X,U,W,J,G){let{outro:_,log:Y,isCancel:z}=J;if(z($))return _("Cancelled \u2014 no changes saved."),0;if($===t8.DISCARD){if(W.value)Y.warn("Changes discarded.",G("warn"));return _("Exited without saving."),0}if($===t8.SAVE){let V=X(Z);return Y.success(V,G("success")),_(U??"Done."),0}let H=Q.find((V)=>V.key===$);if(H){if(await H.run()!==!1)W.value=!0}return}async function hT($){let{title:Q,items:Z,onSave:X,isNew:U,outroAfterSave:W}=$,J=await import("@clack/prompts"),{brandLogOptions:G}=await Promise.resolve().then(() => (D(),I6)),{intro:_,select:Y,log:z}=J;if(_(Q),!U)z.info("Editing existing config \u2014 choose what to change.",G("info"));let H={value:!1};for(;;){let V=xT(Z,H.value,U),O=await Y({message:"What do you want to configure?",options:V}),K=await gT(O,Z,U,X,W,H,J,G);if(K!==void 0)return K}}function dT($){let Q=Object.entries($).filter(([,Z])=>Z).map(([Z])=>Z);return Q.length===0?"none":Q.join(", ")}function QW($){return $.length===0?"none":$.join(", ")}async function mT($){let Q=process.cwd(),Z=!C2(Q),X;try{X=Z?a8():F2(Q)}catch{X=a8()}let{multiselect:U,text:W,isCancel:J}=await import("@clack/prompts");return hT({title:"Playbook config",isNew:Z,items:[{key:"channels",label:"AI channels",hint:()=>dT(X.playbook.channels),run:async()=>{let G=o8(X).filter((z)=>i$.includes(z)),_=await U({message:"Select AI assistants to enable in this repo:",options:A$.map((z)=>({value:z.id,label:z.displayName,hint:z.id})),initialValues:G});if(J(_))return!1;let Y={};for(let z of i$)Y[z]=_.includes(z);X={...X,playbook:{...X.playbook,channels:Y}}}},{key:"sources",label:"Source paths",hint:()=>QW(X.playbook.sources),run:async()=>{let G=await W({message:"Source paths to scan for Playbook .md files (comma-separated):",placeholder:"docs",initialValue:X.playbook.sources.join(", ")||"docs",validate:(_)=>{if(!_?.trim())return"At least one source path is required."}});if(J(G))return!1;X={...X,playbook:{...X.playbook,sources:String(G).split(",").map((_)=>_.trim()).filter(Boolean)}}}}],onSave:()=>{WE(Q,X);let G=o8(X);return`sumr.yaml ${Z?"created":"updated"} \u2014 ${G.length} channel${G.length===1?"":"s"} enabled, sources: ${QW(X.playbook.sources)}`},outroAfterSave:"Run `sumr playbook sync` to generate AI tool files."})}function $j($){let Q=tT.exec($);if(!Q)return{meta:{},body:$.trim()};let[,Z="",X=""]=Q;return{meta:zj(Z),body:X.trim()}}function Xj($,Q){let Z=[],X=Q;while(X<$.length){let W=l7($,X).trim();if(!W.startsWith("-"))break;Z.push(W.slice(1).trim()),X+=1}return{items:Z,next:X}}function Uj($,Q,Z,X,U){let W=Yj(Q);if(Z.startsWith("["))return $[W]=YJ(Z),U;let{items:J,next:G}=Xj(X,U);return $[W]=J,G}function _J($,Q){let Z=[],X=Q;while(X<$.length){let U=l7($,X);if(!U.trim()){X+=1;continue}if(!U.match(/^\s+/))break;let W=U.trim();if(W.startsWith("#")){X+=1;continue}let J=W.indexOf(":");if(J===-1){X+=1;continue}Z.push({key:W.slice(0,J).trim(),value:W.slice(J+1).trim(),indent:U.match(/^(\s+)/)?.[1]?.length??0}),X+=1}return{entries:Z,next:X}}function Wj($,Q,Z){let{entries:X,next:U}=_J(Q,Z),W="";for(let{key:J,value:G,indent:_}of X)if(_<=2)W=J,$[W]={};else if(W){let Y=$[W];if(Y)Y[J]=zJ(G)}return U}function Jj($,Q,Z,X){let U={};$[Q]=U;let{entries:W,next:J}=_J(Z,X);for(let G of W)U[G.key]=zJ(G.value);return J}function Gj($,Q,Z){let X=Object.keys(Q).length>0,U=Object.keys(Z).length>0;if(!X&&!U)return;let W={...Q};for(let[J,G]of Object.entries(Z))W[J]={...Hj(W,J),...G};$.channels=W}function _j($,Q,Z,X,U){let{result:W,legacyChannels:J,nativeChannels:G}=$;if(Qj.has(Q))return Uj(W,Q,Z,X,U);if(Q===I0.REVIEW)return W.review=Z===F7.TRUE,U;if(Q===I0.CHANNELS)return Wj(J,X,U);if(sT.has(Q))return Jj(G,Q,X,U);if(Q===I0.ORDER||Q===I0.TIMEOUT){let _=Number(Z);if(!Number.isNaN(_))W[Q]=_;return U}if(Zj.has(Q))W[Q]=p7(Z);return U}function Yj($){if($===I0.TEAM_MEMBER)return Q0.TEAM_MEMBERS;return $}function zj($){let Q={result:{},legacyChannels:{},nativeChannels:{}},Z=$.split(/\r?\n/),X=0;while(X<Z.length){let U=l7(Z,X);if(X+=1,!U.trim()||U.trimStart().startsWith("#"))continue;let W=U.indexOf(":");if(W===-1)continue;let J=U.slice(0,W).trim(),G=U.slice(W+1).trim();X=_j(Q,J,G,Z,X)}return Gj(Q.result,Q.legacyChannels,Q.nativeChannels),Q.result}function YJ($){return($.match(/^\[(.*?)\]/)?.[1]??$.replace(/^\[/,"").replace(/\]$/,"")).split(",").map((Z)=>p7(Z.trim())).filter(Boolean)}function l7($,Q){let Z=$[Q];if(Z===void 0)return eT;return Z}function Hj($,Q){let Z=$[Q];if(Z===void 0)return{};return Z}function zJ($){if($.startsWith("["))return YJ($);if($===F7.TRUE)return!0;if($===F7.FALSE)return!1;let Q=Number($);if($!==""&&!Number.isNaN(Q))return Q;return p7($)}function p7($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function Kj($){if($&&Vj.has($))return $;return}function Bj($){for(let[Q,Z]of Object.entries(Lj))if($.endsWith(Q))return Z;return}function Aj($,Q){let Z=[];for(let X of $){let U=oT(X);if(!pT(U)){Q.push(`Source path not found, skipping: ${U}`);continue}HJ(U,Z,Q)}return Z}function Mj($,Q,Z,X,U){return{name:$.name,title:$.title,description:$.description,category:$.category??Bj(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:Kj($.modelTier),tags:$.tags??Oj,channels:$.channels,body:Q,sourcePath:Z,source:X,module:U,references:[]}}function Ej($,Q,Z,X){let U=new Map,W=[],J=0;for(let G of $){let _;try{_=nT(G,"utf8")}catch(K){X.push(`Could not read file, skipping: ${G} \u2014 ${K instanceof Error?K.message:String(K)}`);continue}let{meta:Y,body:z}=$j(_);if(!Cj(Y)){J+=1;continue}let H=Y.name,V=Buffer.byteLength(z,"utf8");if(V>qj)X.push(`Topic "${H}" exceeds recommended 64 KB (${Math.round(V/1024)} KB) \u2014 consider splitting it`);let O=U.get(H);if(O)throw Error(`Duplicate topic name "${H}" found:
|
|
603
|
+
${O}
|
|
604
|
+
${G}
|
|
605
|
+
|
|
606
|
+
Rename one of them or set a unique "name:" in frontmatter.`);U.set(H,G),W.push(Mj(Y,z,G,Q,Z))}if(J>0)X.push(`Skipped ${J} Markdown file${J===1?"":"s"} without Playbook frontmatter (name, title, description).`);return W}function Tj($){let Q=new Map;for(let Z of $){let X=Y6(Z.sourcePath),U=Q.get(X);if(U){U.push(Z);continue}Q.set(X,[Z])}return Q}function jj($,Q){let Z=new Map;for(let X of $){let U=Y6(X.sourcePath);if(!Q.has(U))continue;let W=Z.get(U);if(!W)Z.set(U,X.sourcePath);else{let J=ZW(W);if(ZW(X.sourcePath)===UW&&J!==UW)Z.set(U,X.sourcePath)}}return Z}function Sj($,Q,Z){for(let[X,U]of $)if(!Q.some((J)=>Y6(J.sourcePath)===X))for(let J of U)Z.push(`Orphan reference "${J.name}" in ${X} \u2014 no main doc found, skipped`)}function w0($,Q={}){let Z=[],X=Q.source??r$.LOCAL,U=Aj($,Z),W=Ej(U,X,Q.module,Z),J=W.filter((H)=>H.category===XW),G=W.filter((H)=>H.category!==XW),_=Tj(J),Y=jj(G,_),z=G.map((H)=>{let V=Y6(H.sourcePath);if(Y.get(V)!==H.sourcePath)return H;let O=_.get(V);if(!O||O.length===0)return H;let K=[...O].sort((L,q)=>(L.order??Number.MAX_SAFE_INTEGER)-(q.order??Number.MAX_SAFE_INTEGER));return{...H,references:K}});return Sj(_,G,Z),z.sort((H,V)=>H.name.localeCompare(V.name)),{topics:z,warnings:Z}}function HJ($,Q,Z){let X;try{X=cT($)}catch(U){Z.push(`Could not read directory ${$}: ${U instanceof Error?U.message:String(U)}`);return}for(let U of X){let W=rT($,U),J;try{J=iT(W)}catch{Z.push(`Could not stat file, skipping: ${W}`);continue}if(J.isDirectory())HJ(W,Q,Z);else if(J.isFile()&&U.endsWith(".md"))Q.push(W)}}function Cj($){return Boolean($.name?.trim()&&$.title?.trim()&&$.description?.trim())}function KJ($,Q=[]){if(!bj($))return;try{let Z=JSON.parse(kj($,"utf8"));if(!i7(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 vj($){return $?.startsWith("@sumr/")===!0}function i7($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function xj($,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 gj($,Q,Z,X){if(V7(Q)){X.push(`Ignoring unsafe absolute playbook resource path in ${Z}: ${Q}`);return}let U=yj($,Q),W=JW($,U);if(W===GW||W.startsWith(_W)||V7(W)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}try{if(!Pj(U).isDirectory()){X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}let J=WW($),G=WW(U),_=JW(J,G);if(_===GW||_.startsWith(_W)||V7(_)){X.push(`Ignoring unsafe playbook resource path in ${Z}: ${Q}`);return}return G}catch{X.push(`Ignoring missing playbook resource directory in ${Z}: ${Q}`);return}}function hj($,Q){if($.length===0)return!0;if(!Q)return!1;return $.includes(Q)}function uj($,Q,Z,X,U,W){if(!i7($)){W.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let J=typeof $.label==="string"?$.label.trim():"",G=typeof $.path==="string"?$.path.trim():"";if(!J||!G){W.push(`Ignoring invalid playbook resource entry in ${Z}.`);return}let _=xj($.packages,Z,J,W);if(_===null||!hj(_,X))return;let Y=gj(Q,G,Z,W);if(Y)U.push({label:J,root:Y,packageName:Z})}function qJ($,Q){let Z=[],X=KJ(fj($,"package.json"),Z);if(!X||typeof X.name!=="string"||!vj(X.name))return{roots:[],warnings:Z};let U=X.name;if(!i7(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 ${U}.`]};let J=[];for(let G of W)uj(G,$,U,Q,J,Z);return{roots:J,warnings:Z}}function e8($){if(!$||!dj($))return;try{return lj($).isDirectory()?mj($):void 0}catch{return}}function D7($){let Q=e8($.root);return Q?{...$,root:Q}:void 0}function pj($){if($.packageName)return`${$.packageName}:${$.label??$.root}`;let Q=e8($.root);return Q?`path:${Q}`:void 0}function sj(){let $=process.env[nj]?.trim();if($)return y1($);return R$(Dj(),".sumr","resources","playbook")}function tj(){return R$(sj(),"current")}function ej(){let $=b0(VJ(import.meta.url));return[{label:"playbook",root:y1($,"..","..","resources")},{label:"playbook",root:y1($,"resources")}]}function $S($){let Q=y1($);for(;;){if(c7(R$(Q,"package.json")))return Q;let Z=b0(Q);if(Z===Q)return;Q=Z}}function QS($){return $.length-$.trimStart().length}function Z0($){let Q=$.trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))return Q.slice(1,-1);return Q}function z6($){return aj.map((Q)=>R$($,Q)).find((Q)=>c7(Q))}function ZS($,Q){let Z=/^name:\s*(.+)$/.exec($);if(Z?.[1]){Q.name=Z0(Z[1]);return}let X=/^package:\s*(.+)$/.exec($);if(X?.[1])Q.packageName=Z0(X[1])}function XS($,Q,Z,X){if(/^resources:\s*\[\]\s*$/.test($)){Z.section=n.exports;return}if($===f1.RESOURCES){Z.section=n.resources;return}if(Z.section===n.resources){let U=/^-\s+(.+)$/.exec($);if(U?.[1]){X.legacyResources.push(Z0(U[1]));return}Z.section=n.exports}if($===f1.AI_RESOURCES)Z.ai={roots:[],activationMode:B2.always},X.aiResources=Z.ai,Z.section=n.aiResources,Z.aiBaseIndent=Q}function US($,Q,Z){let X=/^mode:\s*(.+)$/.exec($);if(X?.[1]){let W=Z0(X[1]);return Q.activationMode=W===B2.command?B2.command:B2.always,!0}let U=/^key:\s*(.+)$/.exec($);if(U?.[1])return Q.activationKey=Z0(U[1]),!0;if(/^initCommand:\s*(.+)$/.exec($))return!0;return Z.section=n.aiResources,!1}function WS($,Q,Z,X){if(Q<=Z.aiBaseIndent){if(Z.section=$===f1.AI_RESOURCES?n.aiResources:n.exports,$===f1.RESOURCES)Z.section=n.resources;return}if(Z.section===n.aiActivation){if(US($,X,Z))return}let U=/^module:\s*(.+)$/.exec($);if(U?.[1]){X.module=Z0(U[1]);return}if($===f1.ROOTS)return;let W=/^-\s+(.+)$/.exec($);if(W?.[1]){X.roots.push(Z0(W[1]));return}if($===f1.ACTIVATION)Z.section=n.aiActivation}function JS($,Q,Z,X){if(Q===0){Z.section=$===f1.METADATA?n.metadata:n.none;return}if(Z.section===n.metadata){ZS($,X);return}if($===f1.EXPORTS){Z.section=n.exports;return}if(Z.section===n.exports||Z.section===n.resources){XS($,Q,Z,X);return}if((Z.section===n.aiResources||Z.section===n.aiActivation)&&Z.ai)WS($,Q,Z,Z.ai)}function GS($){let Q=z6($);if(!Q)return;let Z=Fj(Q,"utf8").split(/\r?\n/),X={legacyResources:[]},U={section:n.none,aiBaseIndent:0,ai:void 0};for(let W of Z){let J=W.trim();if(!J||J.startsWith("#"))continue;JS(J,QS(W),U,X)}return X}function _S($,Q,Z){if($.activationMode===B2.always)return!0;let X=$.activationKey??$.module??Q;return S6(X,{cwd:Z})}function YS($,Q){let Z=GS($);if(!Z)return[];if(Z.aiResources&&Z.aiResources.roots.length>0){let U=Z.aiResources,W=U.module??Z.name??I7($);if(!_S(U,W,Q))return[];return U.roots.flatMap((J)=>{let G=D7({label:W,root:y1($,J),packageName:Z.packageName,module:W});return G?[G]:[]})}if((Z.packageName===ij||Z.name===rj)&&Z.legacyResources.length>0){let U=Z.name??I7($);return Z.legacyResources.flatMap((W)=>{let J=D7({label:U,root:y1($,W),packageName:Z.packageName});return J?[J]:[]})}return[]}function H6($){try{return Ij($).isDirectory()}catch{return!1}}function zS($){let Q=b0($),Z=I7(Q).startsWith("@")?new Set([Q]):new Set([Q,b0(Q)]),X=new Set;for(let U of Z){let W;try{W=n7(U)}catch{continue}for(let J of W){let G=R$(U,J);if(H6(G)&&z6(G))X.add(G)}}return[...X]}function HS($){let Q=R$($,"ai","modules"),Z;try{Z=n7(Q)}catch{return[]}return Z.map((X)=>R$(Q,X)).filter((X)=>H6(X)&&z6(X))}function VS($){let Q=R$($,"node_modules","@sumr"),Z;try{Z=n7(Q)}catch{return[]}return Z.map((X)=>R$(Q,X)).filter((X)=>H6(X)&&z6(X))}function OS($,Q){let Z=Q.split("/"),X=y1($);for(;;){let U=R$(X,"node_modules",...Z);if(H6(U)&&c7(R$(U,"package.json")))return U;let W=b0(X);if(W===X)return;X=W}}function KS($){return KJ(R$($,"package.json"))?.name}function $6($,Q,Z){if(!$||Q.has($.root))return;let X=pj($);if(X&&Z.has(X))return;if(Q.set($.root,$),X)Z.add(X)}function O7($,Q,Z,X){for(let U of $)for(let W of YS(U,Q))$6(W,Z,X)}function qS($,Q,Z,X){let U=qJ($,Q);for(let W of U.roots)$6(W,Z,X);return U.warnings}function LS($){let Q=b0(VJ(import.meta.url)),Z=$S(Q),X=KS($),U=new Map,W=new Set,J=[];if(Z)J.push(...qS(Z,X,U,W)),O7(HS(Z),$,U,W),O7([Z,...zS(Z)],$,U,W);O7(VS($),$,U,W);let G=OS($,oj);if(G){let Y=qJ(G,X);for(let z of Y.roots)$6(z,U,W);J.push(...Y.warnings)}for(let Y of ej())$6(D7(Y),U,W);return{roots:[...U.values()].sort((Y,z)=>Y.label.localeCompare(z.label)),warnings:J}}function r7($=process.cwd()){let Q=process.env[cj]?.trim(),Z=e8(Q);if(Z)return{root:Z,roots:[{label:"override",root:Z}],source:K2.dev,warnings:[]};if(Q)return{roots:[],source:K2.missing,warnings:[`SUMR Playbook resources override not found, skipping: ${y1(Q)}`]};let X=e8(tj());if(X)return{root:X,roots:[{label:"cache",root:X}],source:K2.cache,warnings:[]};let U=LS($),W=U.roots;if(W.length>0)return{root:W[0]?.root,roots:W,source:K2.bundled,warnings:U.warnings};return{roots:[],source:K2.missing,warnings:[...U.warnings,"SUMR Playbook resources were not found in cache or bundled resources."]}}function AS($,Q){let Z=[];for(let X of $.playbook.sources){let U=C7(Q,X),W=GJ(U),J=0,G=[];if(W){let _=w0([U],{source:r$.LOCAL});J=_.topics.length,G.push(..._.warnings)}Z.push({path:X,exists:W,topics:J,warnings:G})}return Z}function MS(){let $=r7(),Q=0;for(let Z of $.roots){let X=w0([Z.root],{source:r$.CORE,module:Z.module});Q+=X.topics.length}return Q}function ES($,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 W=U.enabled?"enabled ":"disabled",J=U.outputExists?U.outputDir:`${U.outputDir} (not yet created)`;X.push(` ${W} ${U.displayName.padEnd(12)} ${J}`)}X.push(""),X.push("Sources:");for(let U of Z){let W=U.exists?"":" (not found)";X.push(` ${U.path}${W} \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 TS($){let{extras:Q}=$.args,Z=Q.json===!0,X=process.cwd(),U=C2(X),W=U?F2(X):a8(),J=o8(W),G=A$.map((K)=>({id:K.id,displayName:K.displayName,enabled:J.includes(K.id),outputDir:K.outputDir,outputExists:GJ(C7(X,K.outputDir))})),_=AS(W,X),Y=MS(),z=_.reduce((K,L)=>K+L.topics,0),H=Y+z,V={configFound:U,configPath:C7(X,"sumr.yaml"),channels:G,sources:_,coreTopics:Y,localTopics:z,totalTopics:H,hideGen:W.playbook.hideGen??!1};if(Z)return Y1(_1("playbook status",!0,V,[],null)),0;let O=ES(V,G,_);return await R0("Playbook status",O.join(`
|
|
607
|
+
`),"mauve"),0}function DS($){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 LJ{create($){let Q=$.mission?.tracker?.provider,Z=kS($.mission?.issuePrefixes??IS);if(!Q)return this.createUnconfiguredProfile(Z);let X=SS[Q]??DS(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=HW($),Z=zW($),X=CS.join(", ");return{label:"Unconfigured",prefixes:[...$],triggerHints:VW(["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(`
|
|
608
|
+
|
|
609
|
+
`),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(`
|
|
610
|
+
`)}}triggerHints($,Q){return VW([...$.softwareNames,...$.nouns,...this.referenceExamples($,Q),HW(Q)])}identifierGuidance($,Q){let Z=this.effectiveIssueKey($,Q),X=this.referenceExamples($,Q),U=bS(Q,$.defaultPrefix),W=$.tracker===D0.CUSTOM?`Recognize these custom work references as Mission IDs or custom ID candidates: ${Q6(X)}.`:`Recognize these ${$.label} references as Mission issue key \`${Z}\`: ${Q6(X)}.`,J=$.tracker===D0.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,J,"Use the normalized key in later `status`, `plan`, `claim`, `report`, `block`, `unblock`, `close`, worktree, and branch commands.",U,zW(Q)].join(`
|
|
611
|
+
|
|
612
|
+
`)}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}`],W=T2(Q)[0];if(W&&W!==X)U.push(`sumr mission start ${W} --title "Fix checkout flow"`),U.push(`sumr mission status ${W}`);return U.join(`
|
|
613
|
+
`)}referenceExamples($,Q){if(!K7($.tracker))return $.referenceExamples;let Z=this.effectiveIssueKey($,Q),X=T2(Q).filter((W)=>W!==Z),U=$.tracker===D0.JIRA?"ticket":"issue";return[Z,...X,`${$.label} ${U} ${Z}`,$.tracker===D0.JIRA?`story ${Z}`:`cycle issue ${Z}`]}effectiveRawIssueExample($,Q){if(K7($.tracker)&&Q[0])return`${Q[0]}-123`;return $.rawIssueExample}effectiveIssueKey($,Q){if(K7($.tracker)&&Q[0])return`${Q[0]}-123`;return $.normalizedIssueKey}}function RS($){let Q=new LJ().create($),Z=NS($);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 NS($){let Q=$.mission?.flow?.preset??F0.BASIC,Z=$.mission?.flow?.steps??wS(Q),X=Z.map((U)=>{let W=[];if(U.enabled===!1)W.push("skipped");if(U.advance&&U.advance!==x.AUTO)W.push(U.advance);return W.length>0?`${U.uses}(${W.join(", ")})`:U.uses}).join(" -> ");return{preset:Q,text:X,steps:Z.map((U,W)=>`${W+1}. \`${U.uses}\`${U.enabled===!1?" (disabled)":""}${U.advance?` \u2014 ${U.advance}`:""}`).join(`
|
|
614
|
+
`),prMode:$.mission?.git?.prMode??FS}}function wS($){if($===F0.PLANNING_ONLY)return[{uses:u.ISSUE_SYNC,advance:x.AUTO},{uses:u.CONTEXT_RESEARCH,advance:x.AUTO},{uses:u.PLAN_CREATE,advance:x.AUTO},{uses:u.PLAN_APPROVE,advance:x.HUMAN}];if($===F0.STANDARD_DELIVERY||$===F0.FULL_DELIVERY){let Q=[{uses:u.ISSUE_SYNC,advance:x.AUTO},{uses:u.CONTEXT_RESEARCH,enabled:$===F0.STANDARD_DELIVERY?!1:void 0,advance:x.AUTO},{uses:u.PLAN_CREATE,advance:x.AUTO},{uses:u.PLAN_APPROVE,advance:x.HUMAN},{uses:u.BRANCH_CHECK,advance:x.ASK},{uses:u.WORK_CLAIM,advance:x.AUTO},{uses:u.IMPLEMENTATION_REPORT,advance:x.MANUAL},{uses:u.REVIEW_REPORT,advance:x.MANUAL},{uses:u.VALIDATION_REPORT,advance:x.MANUAL},{uses:u.QUALITY_GATE,advance:x.MANUAL},{uses:u.PR_PREPARE,advance:x.ASK},{uses:u.PR_CREATE,advance:x.HUMAN}];if($===F0.FULL_DELIVERY)Q.push({uses:u.MISSION_CLOSE,advance:x.MANUAL});return Q}return[{uses:u.PLAN_CREATE,advance:x.AUTO},{uses:u.PLAN_APPROVE,advance:x.HUMAN},{uses:u.WORK_CLAIM,advance:x.AUTO},{uses:u.IMPLEMENTATION_REPORT,advance:x.MANUAL},{uses:u.REVIEW_REPORT,advance:x.MANUAL},{uses:u.VALIDATION_REPORT,advance:x.MANUAL},{uses:u.MISSION_CLOSE,advance:x.MANUAL}]}function K7($){return $===D0.JIRA||$===D0.LINEAR}function zW($){if($.length===0)return"No repo-specific ticket prefixes are configured.";let Q=Q6(T2($));return[`Repo ticket prefixes configured in \`sumr.yaml\`: ${$.map((Z)=>`\`${Z}\``).join(", ")}.`,`Treat these as immediate Mission trigger examples: ${Q}.`].join(" ")}function bS($,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 ${Q6(T2(Z))}, keep that explicit key; do not rewrite it into the configured tracker namespace.`}function HW($){if($.length===0)return;return`configured ticket keys ${T2($).join(", ")}`}function T2($){return $.slice(0,4).map((Q)=>`${Q}-123`)}function Q6($){return $.map((Q)=>`\`${Q}\``).join(", ")}function VW($){return $.map((Q)=>Q?.trim()).filter((Q,Z,X)=>Boolean(Q)&&X.indexOf(Q)===Z).join(", ")}function kS($){return $.map((Q)=>Q.trim().toUpperCase()).filter((Q,Z,X)=>Q.length>0&&X.indexOf(Q)===Z)}function fS($,Q){if($.length===0)return"- none";return $.map((Z)=>`- ${s7(Z,Q)}`).join(`
|
|
615
|
+
`)}function yS($){if($.length===0)return"";return["Warnings:",...$.map((Q)=>`- ${Q}`)].join(`
|
|
616
|
+
`)}function vS($,Q,Z=[],X=[]){return $.map((U)=>J6(U)).filter((U)=>U!==void 0).map((U)=>{let W=nS(U,Q,Z),J=W.length>0?`
|
|
617
|
+
legacy cleanup: ${W.join(", ")}`:"",G=cS(U.id,Q,X,Z),_=G.length>0?`
|
|
618
|
+
resources: ${G.join(", ")}`:"";return`- ${U.displayName}: ${U.outputDir}${_}${J}`}).join(`
|
|
619
|
+
`)}function xS($){return`${$.length} warning${$.length===1?"":"s"}. Run with --verbose to see details.`}function gS($,Q,Z){return`\uD83C\uDF89 Synced ${`${$} topic${$===1?"":"s"}`} across ${Q} channel${Q===1?"":"s"}${Z?" (dry run)":""}.`}function pS($){return hS[$]??AJ}function cS($,Q,Z,X){let U=[...Z,...X].map((J)=>j2(o7(Q,a7(Q,J)))),W=new Set;for(let J of pS($)){let G=j2(J);if(U.some((_)=>_===G||_.startsWith(`${G}/`)))W.add(J)}return[...W]}function nS($,Q,Z){return iS($).filter((X)=>{let U=a7(Q,X);return PS(U)||Z.some((W)=>W===U||W.startsWith(`${U}${BJ}`))})}function iS($){return $.legacyOutputDirs??AJ}function rS($,Q,Z){let X=yS(Z);return["No Markdown files with Playbook frontmatter were found in the configured sources.","","Sources checked:",fS($,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(`
|
|
620
|
+
`)}function oS($,Q){let Z=$.local.paths.length===0?"none":$.local.paths.map((U)=>s7(U,Q)).join(", "),X=aS($.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(`
|
|
621
|
+
`)}function aS($,Q){if($.source===q7.bundled){let Z=sS($);if(Z.length<=1)return"bundled core resources";return`bundled core resources (${Z.map((U)=>`${U.label}: ${U.topics}`).join(", ")})`}if($.source===q7.cache)return"local cache";if($.source===q7.dev)return $.path?`dev override (${s7($.path,Q)})`:"dev override";return"missing"}function sS($){return $.providers?.filter((Q)=>Q.topics>0)??uS}function s7($,Q){let Z=j2(o7(Q,a7(Q,$)));return Z===""?lS:Z}function MJ($,Q){let Z=new Map,X=new Set;for(let W of Q){let J=j2(o7($,W));if(J===dS||J.startsWith(mS)){X.add(J);continue}let G=tS(J);if(G){let Y=Z.get(G.outputDir)??new Set;Y.add(G.name),Z.set(G.outputDir,Y);continue}let _=eS(J);if(_){let Y=Z.get(_.outputDir)??new Set;Y.add(_.name),Z.set(_.outputDir,Y)}}let U=[...X];for(let[W,J]of Z)U.push(...$C(W,[...J]));return U}function tS($){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 eS($){for(let Q of A$){let Z=j2(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 $C($,Q){let Z=[];for(let[X,U]of ZC(Q)){let W=QC(U);if(U.length>1){let J=/\.[A-Za-z0-9]+$/.test(W);Z.push(`${$}/${X}*${J?"":"/"}`)}else{let J=/\.[A-Za-z0-9]+$/.test(W);Z.push(`${$}/${W}${J?"":"/"}`)}}return Z}function QC($){let Q=$[0];if(Q===void 0)throw Error("Cannot generate wildcard patterns for an empty name group.");return Q}function ZC($){let Q=new Map;for(let Z of $){let X=Z.indexOf("-"),U=X>=0?Z.slice(0,X+1):Z,W=Q.get(U);if(W){W.push(Z);continue}Q.set(U,[Z])}return Q}function j2($){return $.split(BJ).join("/")}function WC($,Q,Z,X){let U=SJ($,["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 W={cmd:M2(U,"cmd"),use:M2(U,"use")};return{section:F.COMMAND,body:$,attributes:Q,sourcePath:Z,command:W}}function JC($,Q,Z,X){let U=SJ($,["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 W={path:M2(U,"path"),purpose:M2(U,"purpose"),when:M2(U,"when")};return{section:F.MAP,body:$,attributes:Q,sourcePath:Z,map:W}}function GC($,Q,Z,X,U){if($===F.COMMAND)return WC(Q,Z,X,U);if($===F.MAP)return JC(Q,Z,X,U);return{section:$,body:Q,attributes:Z,sourcePath:X}}function qW($,Q){let Z=[],X=[],U;w7.lastIndex=0;while((U=w7.exec($))!==null){let W=L7(U,1).toLowerCase(),J=L7(U,2),G=L7(U,3).trim();if(!_C(W)){X.push({code:"AGENTSMD_UNKNOWN_SECTION",message:`Unknown agents-md section "${W}" \u2014 must be one of: ${e7.join(", ")}.`,sourcePath:Q});continue}let{attributes:_,attrWarnings:Y}=zC(J,Q);X.push(...Y);let z=GC(W,G,_,Q,X);if(z)Z.push(z)}return{snippets:Z,warnings:X}}function _C($){return e7.includes($)}function L7($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function M2($,Q){let Z=$[Q];if(Z===void 0)throw Error(`Missing required agents-md field "${Q}".`);return Z}function YC($,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 W=$.slice(0,U).toLowerCase(),J=$.slice(U+1);if(!KW.has(W)){X.push({code:"AGENTSMD_UNKNOWN_ATTRIBUTE",message:`Unknown attribute "${W}" in ${Z}; ignored. Supported: ${[...KW].join(", ")}.`,sourcePath:Z});return}if(W===i8.SCOPE){if(J)Q.scopes.push(J);return}if(W===i8.ORDER){let G=Number(J);if(Number.isFinite(G))Q.order=G;return}if(W===i8.ID&&J)Q.id=J}function zC($,Q){let Z={scopes:[],order:100},X=[],U=$.trim();if(!U)return{attributes:{scopes:Z.scopes,order:Z.order},attrWarnings:X};for(let J of U.split(/\s+/))YC(J,Z,Q,X);return{attributes:{scopes:Z.scopes,order:Z.order,id:Z.id},attrWarnings:X}}function SJ($,Q){let Z={};for(let X of $.split(/\r?\n/)){let U=X.trim();if(!U)continue;let W=U.indexOf(":");if(W===-1)continue;let J=U.slice(0,W).trim().toLowerCase(),G=U.slice(W+1).trim();if(J&&!Z[J])Z[J]=G;else if(J&&Z[J])Z[J]=`${Z[J]} ${G}`.trim()}for(let X of Q)if(!Z[X])return null;return Z}function CJ($){return $.replace(w7,"")}function OC($,Q,Z){$.push(V6);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===HC?"# AGENTS.md":`# AGENTS.md \u2014 ${Q.path}`),$.push("")}function LW($,Q,Z){if(!Q)return;$.push(Z),$.push(""),$.push(Q.body),$.push("")}function BW($,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 B7($,Q,Z){if(Q.length===0)return;$.push(Z),$.push("");for(let X of Q)$.push(`- ${X.body.replace(/\n/g," ").trim()}`);$.push("")}function KC($,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 qC($,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 LC($,Q,Z){let X=[];return OC(X,$,Z),LW(X,AW(Q.get(F.OVERVIEW)),"## Purpose"),BW(X,e1(Q,F.STARTUP),"## 1. Before you start (mandatory)"),KC(X,e1(Q,F.MAP)),B7(X,e1(Q,F.RULE),"## 3. Hard rules (non-negotiable)"),qC(X,e1(Q,F.COMMAND)),B7(X,e1(Q,F.CONVENTION),"## 5. Code conventions"),B7(X,e1(Q,F.SECURITY),"## 6. Security"),BW(X,e1(Q,F.CLOSEOUT),"## 7. Closeout"),LW(X,AW(Q.get(F.STUCK)),"## 8. If you're stuck"),`${X.join(`
|
|
622
|
+
`).trimEnd()}
|
|
623
|
+
`}function BC($,Q="AGENTS.md"){let Z=["<!-- DO NOT EDIT \u2014 assembled by `bun run sync`. See AGENTS.md banner for sources. -->",V6,`@${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(`
|
|
624
|
+
`).trimEnd()}
|
|
625
|
+
`}function e1($,Q){return $.get(Q)??VC}function AW($){if(!$||$.length===0)return;return $[0]}function IJ($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},U=DJ($,Q);if(X.warnings.push(...U.warnings),!U.enabled)return X;let W=U.config.targets.filter((Y)=>Y!==k1),J={...U.config,targets:W},G=new Set,_=new Set;for(let Y of W){let z=U.targets.get(Y);if(!z)continue;let H=S2(process.cwd(),Y,"AGENTS.md"),V=S2(process.cwd(),Y,"CLAUDE.md");if(EW(H,X.warnings))a(H,z.agentsMdContent,Z.dryRun),X.filesWritten.push(H),G.add(H);if(U.config.claudeMd){let O=MW(z.sections,F.CLAUDE_ONLY),K=BC(O,"AGENTS.md");if(EW(V,X.warnings))a(V,K,Z.dryRun),X.filesWritten.push(V),_.add(V)}else if(MW(z.sections,F.CLAUDE_ONLY).length>0)X.warnings.push(`AGENTSMD_CLAUDE_ONLY_DROPPED: target "${Y}" has claude-only snippets but claudeMd is false.`)}return X.filesRemoved.push(...vC(J,G,_,Z.dryRun)),X}function jC($,Q){let Z=[];for(let X of $){let U=qW(X.body,X.sourcePath);Q.push(...U.warnings),Z.push(...U.snippets);for(let W of X.references){let J=qW(W.body,W.sourcePath);Q.push(...J.warnings),Z.push(...J.snippets)}}return Z}function SC($,Q,Z){let X=new Map,U=new Map;for(let W of Q.targets)X.set(W,new Map),U.set(W,new Set);for(let W of $){let J=bC(W,Q,Z);if(J.length===0){Z.push(`AGENTSMD_UNROUTABLE: snippet at ${W.sourcePath} routes to zero targets; consider adding 'scope=.' or a root '.' target.`);continue}for(let G of J){let _=X.get(G),Y=U.get(G);if(!_||!Y)continue;let z=_.get(W.section);if(z)z.push(W);else _.set(W.section,[W]);Y.add(W.sourcePath)}}return{snippetsByTarget:X,sourcesByTarget:U}}function FC($){for(let Q of CC){let Z=$.get(Q);if(Z)Z.sort((X,U)=>(X.attributes.order??100)-(U.attributes.order??100))}}function IC($,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(FC(X),fC($,X,Z.warnings),!X.has(F.OVERVIEW))Z.warnings.push(`AGENTSMD_NO_OVERVIEW: target "${$}" has no overview snippet.`);let W=new Set([...U].map(PC)),J=LC({path:$},X,W);if(yC(J))Z.warnings.push(`AGENTSMD_LINE_BUDGET: ${S2($,"AGENTS.md")} exceeds 200 lines (${J.split(`
|
|
626
|
+
`).length}); consider splitting or pruning.`);let G=X.get(F.STARTUP)?.length??0;if(G>5)Z.warnings.push(`AGENTSMD_STARTUP_OVERFLOW: target "${$}" has ${G} startup steps; Anthropic recommends \u2264 5.`);Z.targets.set($,{target:$,sections:X,sources:U,agentsMdContent:J})}function DJ($,Q){let Z=DC(Q),X={enabled:Z.enabled,config:Z,targets:new Map,warnings:[]};if(!Z.enabled)return X;let U=[],W=jC($,U);if(X.warnings.push(...U.map((G)=>`${G.code}: ${G.message}`)),W.length===0)return X;let J=SC(W,Z,X.warnings);for(let G of Z.targets)IC(G,J,X);return X}function DC($){let Q=$.playbook.agentsMd??RC,Z=Q.enabled??!0,X=Q.targets&&Q.targets.length>0?Q.targets:[k1],U=Q.claudeMd??!0,W=$.playbook.sources.length>0?$.playbook.sources:[MC];return{enabled:Z,targets:X,claudeMd:U,sources:W}}function MW($,Q){return $.get(Q)??TC}function NC($,Q,Z){let X=new Set;for(let U of $.attributes.scopes){if(U===AC){for(let W of Q.targets)X.add(W);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 wC($,Q){let Z=kC($.sourcePath,Q.sources);if(!Z)return Q.targets.includes(k1)?[k1]:[];let X;for(let U of Q.targets){if(U===k1)continue;let W=U.replace(/\/$/,""),J=`${W}${t7}`;if(Z===W||Z.startsWith(J)){if(!X||U.length>X.length)X=U}}if(X)return[X];return Q.targets.includes(k1)?[k1]:[]}function bC($,Q,Z){if($.attributes.scopes.length>0)return NC($,Q,Z);return wC($,Q)}function kC($,Q){let Z=process.cwd(),X=N7($);for(let U of Q){let W=N7(Z,U),J=jJ(W,X);if(!J.startsWith(EC)&&!J.startsWith(t7)&&J!==FJ)return J}return}function PC($){let Q=jJ(process.cwd(),N7(process.cwd(),$));if(Q===FJ)return k1;return Q.split(t7).join("/")}function fC($,Q,Z){for(let X of e7){if(!UC.has(X))continue;let U=Q.get(X)?.length??0;if(U<=1)continue;if(X===F.OVERVIEW)Z.push(`AGENTSMD_DUPLICATE_OVERVIEW: target "${$}" has ${U} overview snippets; the first one wins.`);else if(X===F.STUCK)Z.push(`AGENTSMD_DUPLICATE_STUCK: target "${$}" has ${U} stuck snippets; the first one wins.`)}}function yC($){return $.split(`
|
|
627
|
+
`).length>200}function EW($,Q){if(!EJ($))return!0;let Z;try{Z=TJ($,"utf8").slice(0,300)}catch{return!0}if(Z.includes(V6))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 vC($,Q,Z,X){let U=[];for(let W of $.targets){let J=S2(process.cwd(),W,"AGENTS.md"),G=S2(process.cwd(),W,"CLAUDE.md");if(!Q.has(J)&&TW(J)){if(U.push(J),!X)OW(J,{force:!0})}if(!Z.has(G)&&TW(G)){if(U.push(G),!X)OW(G,{force:!0})}}return U}function TW($){if(!EJ($))return!1;try{return TJ($,"utf8").slice(0,300).includes(V6)}catch{return!1}}function xC($,Q){let Z=new Map(Q.map((X)=>[X.id,X]));return{id:$.id,channelIds:$.channelIds,targetPath:$.targetPath,title:$.title,createItems:(X)=>gC(X,$,Z)}}function gC($,Q,Z){if(Q.appliesTo&&!Q.appliesTo($))return[];let X=[];for(let U of Q.sectionIds){let W=Z.get(U);if(!W)continue;if(W.appliesTo&&!W.appliesTo($,Q))continue;let J=jW(W.suggestedMarkdown,$,Q);if(!J?.trim())continue;let G=W.exampleMarkdown?jW(W.exampleMarkdown,$,Q):J;X.push({id:W.id,title:W.title,detectionPatterns:[...hC(W.detectionPatterns,$,Q)],suggestedMarkdown:J,exampleMarkdown:G?.trim()?G:J})}return X}function jW($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function hC($,Q,Z){if(typeof $==="function")return $(Q,Z);return $}function NJ($,Q){return{topics:$,config:Q,agentsMdTargets:DJ($,Q).targets}}function wJ(){let $=lC();return mC.map((Q)=>xC(Q,$))}function lC(){return[n$({id:"purpose",title:"Purpose / project AI guidance",sourceSection:"overview",detectionPatterns:["## Purpose","project ai guidance","quick reference","# AGENTS.md","# CLAUDE.md"],suggestedMarkdown:F$("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(`
|
|
628
|
+
|
|
629
|
+
`))}),n$({id:"before-you-start",title:"Before you start",sourceSection:"startup",detectionPatterns:["## Before You Start","before you start","run git status --short"],suggestedMarkdown:F$("Before You Start",IW(["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:pC,detectionPatterns:["## Mission Issue Routing","sumr mission status","sumr-mission-workflow",/Mission issue routing/i],suggestedMarkdown:F$("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(`
|
|
630
|
+
|
|
631
|
+
`)),exampleMarkdown:F$("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(`
|
|
632
|
+
|
|
633
|
+
`))},n$({id:"repo-map",title:"Repo map / project structure",sourceSection:"map",detectionPatterns:["## Repo Map","repo map","project structure","backend/"],suggestedMarkdown:F$("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(`
|
|
634
|
+
`))}),n$({id:"hard-rules",title:"Hard rules",sourceSection:"rule",detectionPatterns:["## Hard Rules","hard rules","what not to do","preserve user changes"],suggestedMarkdown:F$("Hard Rules",l8(["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."]))}),n$({id:"common-commands",title:"Common commands",sourceSection:"command",detectionPatterns:["## Common Commands","common commands","key commands"],suggestedMarkdown:F$("Common Commands",["Replace these placeholders with the exact commands this repository expects agents to run.","","| Command | Use |","|---------|-----|","| `<install command>` | Install dependencies when needed. |","| `<test command>` | Run focused tests for changed behavior. |","| `<check command>` | Run the project quality gate before closeout. |"].join(`
|
|
635
|
+
`))}),n$({id:"code-conventions",title:"Code conventions",sourceSection:"convention",detectionPatterns:["## Code Conventions","code conventions","linting formatting","runtime and build"],suggestedMarkdown:F$("Code Conventions",l8(["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."]))}),n$({id:"security",title:"Security",sourceSection:"security",detectionPatterns:["## Security","security","never commit secrets","do not commit env files or secrets"],suggestedMarkdown:F$("Security",l8(["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."]))}),n$({id:"closeout",title:"Closeout",sourceSection:"closeout",detectionPatterns:["## Closeout","closeout","before finishing","run relevant tests before committing"],suggestedMarkdown:F$("Closeout",IW(["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."]))}),n$({id:"if-stuck",title:"If you're stuck",sourceSection:"stuck",detectionPatterns:["## If You're Stuck","if you're stuck","error handling","debugging posture"],suggestedMarkdown:F$("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.")}),n$({id:"claude-specific",title:"Claude-specific additions",sourceSection:"claude-only",detectionPatterns:["## Claude Code","claude-specific","plan mode"],suggestedMarkdown:F$("Claude Code",l8(["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 n$($){return{id:$.id,title:$.title,appliesTo:(Q)=>FW(Q,$.sourceSection).length>0,detectionPatterns:(Q)=>[...$.detectionPatterns,...nC(FW(Q,$.sourceSection))],suggestedMarkdown:$.suggestedMarkdown,exampleMarkdown:$.suggestedMarkdown}}function CW($){return $.agentsMdTargets.has(RJ)}function pC($){return $.topics.some((Q)=>Q.name===uC)}function FW($,Q){return $.agentsMdTargets.get(RJ)?.sections.get(Q)??dC}function F$($,Q){return`## ${$}
|
|
636
|
+
|
|
637
|
+
${Q.trim()}`}function IW($){return $.map((Q,Z)=>`${Z+1}. ${Q}`).join(`
|
|
638
|
+
`)}function l8($){return $.map((Q)=>`- ${Q}`).join(`
|
|
639
|
+
`)}function cC($){return $.body.replace(/\n/g," ").trim()}function nC($){return $.map((Q)=>cC(Q).slice(0,100)).filter((Q)=>Q.length>=20)}async function bJ($){let Q={filesWritten:[],warnings:[],missing:[],accepted:[],skipped:[]},Z=tC($.specs,$.channelIds);for(let X of Z)await aC(X,$,Q);return Q}async function aC($,Q,Z){let X=oC(Q.cwd,$.targetPath),U=iC(X)?rC(X,"utf8"):"",W=$.createItems(Q.context).filter((Y)=>Y.suggestedMarkdown.trim().length>0),J=eC(U,W);if(J.length===0)return;for(let Y of J)Z.missing.push({specId:$.id,itemId:Y.id,targetPath:X});if(Q.dryRun||!Q.interactive){Z.warnings.push(XF($,J));return}let G=[];for(let Y of J)await sC(Y,$,X,Q,Z,G);if(G.length===0)return;let _=ZF(U,G);a(X,_,!1),Z.filesWritten.push(X)}async function sC($,Q,Z,X,U,W){let J=$F($,await(X.confirmItem??UF)({spec:Q,item:$,targetPath:Z}));if(J.action===O$.APPEND)W.push(J.markdown),U.accepted.push({specId:Q.id,itemId:$.id,targetPath:Z,source:J.source});else if(U.skipped.push({specId:Q.id,itemId:$.id,targetPath:Z}),J.action===O$.CANCEL)U.warnings.push(`ADVISORY_FILE_CANCELLED: skipped ${$.title} for ${Q.targetPath}.`)}function tC($,Q){let Z=new Set(Q);return $.filter((X)=>X.channelIds.some((U)=>Z.has(U)))}function eC($,Q){return Q.filter((Z)=>!QF($,Z))}function $F($,Q){if(Q===!0)return{action:O$.APPEND,markdown:$.suggestedMarkdown,source:"suggested"};if(Q===!1)return{action:O$.SKIP};if(Q===O$.CANCEL)return{action:O$.CANCEL};if(Q.action===O$.APPEND){let Z=(Q.markdown??$.suggestedMarkdown).trim();if(!Z)return{action:O$.SKIP};return{action:O$.APPEND,markdown:Z,source:Q.source??(Q.markdown?"custom":"suggested")}}return{action:Q.action}}function QF($,Q){let Z=DW($);return Q.detectionPatterns.some((X)=>{if(typeof X==="string")return Z.includes(DW(X));return X.lastIndex=0,X.test($)})}function ZF($,Q){let Z=Q.map((U)=>U.trim()).filter(Boolean).join(`
|
|
640
|
+
|
|
641
|
+
`);if(!Z)return $;if(!$)return`${Z}
|
|
642
|
+
`;let X=$.endsWith(`
|
|
643
|
+
|
|
644
|
+
`)?"":$.endsWith(`
|
|
645
|
+
`)?`
|
|
646
|
+
`:`
|
|
647
|
+
|
|
648
|
+
`;return`${$}${X}${Z}
|
|
649
|
+
`}function XF($,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 UF($){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.
|
|
650
|
+
|
|
651
|
+
${WF($.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 O$.CANCEL;if(W===O$.SKIP)return{action:O$.SKIP};if(W===O$.APPEND)return{action:O$.APPEND,source:"suggested"};let J=await U({message:`Markdown to append to ${$.spec.targetPath}:`,placeholder:$.item.suggestedMarkdown,validate:(G)=>{if(!G?.trim())return"Enter Markdown to append, or cancel to skip.";return}});if(Q(J))return"cancel";return{action:"append",markdown:J.trim(),source:"custom"}}function WF($){let Q=$.trim().split(`
|
|
652
|
+
`);if(Q.length<=18)return $.trim();return[...Q.slice(0,18),"..."].join(`
|
|
653
|
+
`)}function DW($){return $.toLowerCase().replace(/<!--[\s\S]*?-->/g," ").replace(/[`*_>#|[\]{}()"']/g," ").replace(/[.,:;!?]/g," ").replace(/\s+/g," ").trim()}function $Q($=[]){let Q=new Set,Z=[];for(let X of[...A$.flatMap((U)=>U.gitignorePatterns),...$]){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function uJ($,Q,Z=[],X=".gitignore"){let U=yJ($,X),W=$Q(Z),J=kJ(U)?PJ(U,"utf8"):"",G=lJ(J,W),_=G!==J;if(_&&!Q)fJ(U,G,"utf8");return{path:U,updated:_,entries:W}}function dJ($,Q,Z=[],X=[]){let U=new Map,W=HF(X,Z);if(W.length>0)U.set(JF,W);for(let J of YF){if(!X.includes(J.channelId))continue;let G=zF(U,J.file);G.push(...OF(J,Z)),U.set(J.file,QQ(G))}return[...U].map(([J,G])=>KF($,Q,G,J))}function zF($,Q){let Z=$.get(Q);if(Z===void 0)return[];return[...Z]}function HF($,Q){if($.length===0)return[];let Z=$Q(Q);return QQ([...hJ,...$.flatMap(VF),...Z.flatMap(mJ)])}function VF($){return _F[$]??GF}function mJ($){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[RW(Z)];let W=[];for(let J=1;J<U.length;J+=1)W.push(`!${U.slice(0,J).join("/")}/`);return[...W,RW(Z)]}function OF($,Q){return QQ([...hJ,...$.allowEntries,...$Q(Q).filter((Z)=>$.extraEntryPrefixes.some((X)=>Z.startsWith(X))).flatMap(mJ)])}function RW($){return $.startsWith("!")?$:`!${$}`}function KF($,Q,Z,X){let U=yJ($,X),W=kJ(U)?PJ(U,"utf8"):"",J=lJ(W,[...Z]),G=J!==W;if(G&&!Q)fJ(U,J,"utf8");return{path:U,updated:G,entries:[...Z]}}function lJ($,Q){let Z=qF(Q),X=new RegExp(`${A7(vJ)}\\n${A7(xJ)}[\\s\\S]*?${A7(gJ)}\\n?`,"m");if(X.test($))return $.replace(X,Z);let U=$===""||$.endsWith(`
|
|
654
|
+
`)?"":`
|
|
655
|
+
`;return`${$}${U}${Z}`}function qF($){return[vJ,xJ,...$,gJ,""].join(`
|
|
656
|
+
`)}function QQ($){let Q=new Set,Z=[];for(let X of $){if(Q.has(X))continue;Q.add(X),Z.push(X)}return Z}function A7($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function nJ($){let Q=cJ($,MF);if(!pJ(Q))return{path:Q,indent:2,trailingNewline:!0};let Z=BF(Q,"utf8"),X=TF(Z),U=Z.endsWith(`
|
|
657
|
+
`);try{let W=JSON.parse(Z);if(typeof W!=="object"||W===null||Array.isArray(W))return{path:Q,indent:X,trailingNewline:U};return{path:Q,settings:W,indent:X,trailingNewline:U}}catch{return{path:Q,indent:X,trailingNewline:U}}}function TF($){for(let Q of $.split(/\r?\n/)){let Z=/^(\s+)"/.exec(Q);if(Z?.[1])return Z[1].length}return 2}function iJ($,Q,Z,X){AF($,`${JSON.stringify(Q,null,Z)}${X?`
|
|
658
|
+
`:""}`,"utf8")}function jF($,Q,Z){let X=!1;for(let U of Q)if(!$[U])$[U]=!0,Z.push(U),X=!0;return X}function SF($,Q,Z){let X=!1;for(let U of Q)if(U in $)delete $[U],Z.push(U),X=!0;return X}function CF($){let{path:Q,settings:Z,indent:X,trailingNewline:U}=nJ($);if(!Z&&pJ(Q))return;let W=FF(Z),J=W["files.exclude"],G=Object.hasOwn(W,"files.exclude");if(G&&(typeof J!=="object"||J===null||Array.isArray(J)))return;return{settingsPath:Q,nextSettings:W,existing:G?J:{},indent:X,trailingNewline:U}}function FF($){if($===void 0)return{};return $}function IF($,Q,Z,X,U){if(Q){if(!jF($.existing,Z,X))return!1;return $.nextSettings["files.exclude"]=$.existing,!0}if(!SF($.existing,Z,U))return!1;if(Object.keys($.existing).length===0)delete $.nextSettings["files.exclude"];else $.nextSettings["files.exclude"]=$.existing;return!0}function rJ($,Q,Z,X){let U=[],W=[],J=Q.map((_)=>_.vscodeExcludePattern).filter((_)=>typeof _==="string");if(J.length===0)return{patternsAdded:U,patternsRemoved:W};let G=CF($);if(!G)return{patternsAdded:U,patternsRemoved:W};if(!IF(G,Z,J,U,W))return{patternsAdded:U,patternsRemoved:W};if(!X)LF(cJ($,".vscode"),{recursive:!0}),iJ(G.settingsPath,G.nextSettings,G.indent,G.trailingNewline);return{patternsAdded:U,patternsRemoved:W}}function oJ($,Q){let{path:Z,settings:X,indent:U,trailingNewline:W}=nJ($);if(!X)return{associationsAdded:[]};let J=X["material-icon-theme.files.associations"],G=Object.hasOwn(X,"material-icon-theme.files.associations");if(G&&(typeof J!=="object"||J===null||Array.isArray(J)))return{associationsAdded:[]};let _=G?J:{},Y=[];for(let[z,H]of Object.entries(EF)){if(z in _)continue;_[z]=H,Y.push(z)}if(Y.length===0)return{associationsAdded:Y};if(!Q)X["material-icon-theme.files.associations"]=_,iJ(Z,X,U,W);return{associationsAdded:Y}}function wF($){return NF.includes($)}function $G($){return wF($.category)}function Z6($){return sJ.includes($.category)}function X6($){return tJ.includes($.category)}function QG($){return eJ.includes($.category)}function ZQ($){return!$G($)}function XQ($,Q,Z){let X=XJ(J6($),$),{dryRun:U}=Z,W=J1(process.cwd(),X.outputDir),J=[],G=[],_=[];x$(W,U);let Y=new Set;for(let z of Q.filter(ZQ)){let H=f0(z,$),V=X0(H);Y.add(V);let O=J1(W,V);x$(O,U);let K=CJ(H.body),{mainContent:L,sections:q}=WJ(UJ(H,K,$),{addResourceLinks:!0}),S=JJ(H.references),y=`${_6({name:g$(H),description:H.description||H.title,metadata:d7(H)})}
|
|
659
|
+
|
|
660
|
+
${L}${S}
|
|
661
|
+
`,N=J1(O,k7);a(N,y,U),J.push(N);let w=new Set([k7]);for(let l of q){let v=`${l.name}.md`;w.add(v);let M$=J1(O,v);a(M$,`${l.content}
|
|
662
|
+
`,U),J.push(M$)}if(H.references.length>0){let l=J1(O,U6);x$(l,U);for(let v of H.references){let M$=`${RF(v.sourcePath,W6)}${W6}`;w.add(`${U6}/${M$}`);let R2=J1(l,M$);a(R2,`${v.body}
|
|
663
|
+
`,U),J.push(R2)}}G.push(...kF(O,w,U))}G.push(...E2(W,Y,X.filePattern,U));for(let z of X.legacyOutputDirs??bF)G.push(...E2(J1(process.cwd(),z),new Set,X.filePattern,U));return{filesWritten:J,filesRemoved:G,warnings:_}}function kF($,Q,Z){if(!aJ($))return[];let X=[];for(let U of ZG($)){if(U===k7)continue;let W=J1($,U);if(U===U6){X.push(...PF(W,Q,Z));continue}if(!U.endsWith(W6))continue;if(Q.has(U))continue;if(X.push(W),!Z)b7(W,{force:!0})}return X}function PF($,Q,Z){if(!aJ($))return[];let X=[],U=[],W=ZG($);for(let J of W){let G=`${U6}/${J}`,_=J1($,J);if(!J.endsWith(W6)||Q.has(G)){U.push(J);continue}if(X.push(_),!Z)b7(_,{force:!0})}if(U.length===0){if(X.push($),!Z)b7($,{recursive:!0,force:!0})}return X}function ZG($){try{return DF($)}catch{return[]}}function p8($){return typeof $==="string"||typeof $==="boolean"||typeof $==="number"}function hF($){if(p8($))return!0;if(Array.isArray($))return $.every(p8);if(typeof $==="object"&&$!==null)return Object.values($).every((Q)=>p8(Q)||Array.isArray(Q)&&Q.every(p8));return!1}function UG($,Q){let Z={},X=$.channels?.[Q]??XG;for(let[U,W]of Object.entries(X)){if(U===gF)continue;if(hF(W))Z[U]=W}return Z}function uF($,Q,Z){let X=$.target?.trim()||X0($),U=vF(X),J=`${U.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==U)Z.push(`${Q} agent "${$.name}" target was normalized to "${J}".`);return J}function JQ($,Q,Z){let X={filesWritten:[],filesRemoved:[],warnings:[]},U=Q.filter(Z6),W=NW(process.cwd(),$.outputDir),J=new Set;if(U.length>0)x$(W,Z.dryRun);for(let G of U){let _=f0(G,$.channelId),Y=uF(_,$.channelId,X.warnings);J.add(Y);let z=UG(_,$.channelId),H={name:g$(_),description:_.description,...$.defaultProps??XG,...z,metadata:d7(_)},V=`${_6(H)}
|
|
664
|
+
|
|
665
|
+
${xF}
|
|
666
|
+
|
|
667
|
+
${_.body.trim()}
|
|
668
|
+
`,O=NW(W,Y);a(O,V,Z.dryRun),X.filesWritten.push(O)}return X.filesRemoved.push(...E2(W,J,$.generatedFilePattern,Z.dryRun)),X}function GQ(...$){return{filesWritten:$.flatMap((Q)=>Q.filesWritten),filesRemoved:$.flatMap((Q)=>Q.filesRemoved),warnings:$.flatMap((Q)=>Q.warnings)}}function pF($){return`"$CLAUDE_PROJECT_DIR"/.claude/hooks/${$}`}function wW($){let Q={type:"command",command:pF($.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 cF($,Q){if(!dF($))return{};try{let Z=JSON.parse(mF($,"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 nF($,Q){let Z=rF($.hooks)?$.hooks:{},X={};for(let[U,W]of Object.entries(Z)){if(!Array.isArray(W))continue;let J=[];for(let G of W){if(!_Q(G))continue;let _=oF(G,Q);if(_)J.push(_)}if(J.length>0)X[U]=J}return X}function iF($,Q,Z,X){let U=lF(process.cwd(),".claude","settings.json"),W=cF(U,X);if(!W)return;let J=new Set([...Q,...$.map((Y)=>Y.fileName)]),G=nF(W,J);for(let Y of $){let z=G[Y.event];if(z)z.push(wW(Y));else G[Y.event]=[wW(Y)]}if(Object.keys(G).length===0){if("hooks"in W)delete W.hooks,a(U,`${JSON.stringify(W,null,4)}
|
|
669
|
+
`,Z.dryRun),X.filesWritten.push(U);return}let _={...W,hooks:G};a(U,`${JSON.stringify(_,null,4)}
|
|
670
|
+
`,Z.dryRun),X.filesWritten.push(U)}function _Q($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function rF($){return _Q($)}function oF($,Q){if(!Array.isArray($.hooks))return;let Z=$.hooks.filter((X)=>{if(!_Q(X))return!0;let U=X.command;if(typeof U!=="string")return!0;return!aF(U,Q)});if(Z.length===0)return;return{...$,hooks:Z}}function aF($,Q){for(let Z of Q)if($.includes(`.claude/hooks/${Z}`))return!0;return/[./]\.claude\/hooks\/[^"'\s]+/.test($)}function ZI($,Q){let Z=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let X of $.matchAll(Z)){let U=kW(X,1).toLowerCase();if(Q.includes(U))return{lang:U,content:kW(X,2).trim()}}return null}function kW($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function XI($,Q,Z){let X=`${X0($)}.${Q}`,U=$.target?.trim()||X,W=WQ(U);if(W!==U)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 UI($,Q){let Z=$.trim();if(Z.startsWith("#!")){let X=Z.indexOf(`
|
|
671
|
+
`),U=X===-1?Z:Z.slice(0,X),W=X===-1?"":Z.slice(X+1).trimStart();if(W.startsWith("# Generated by SUMR Playbook"))return`${Z}
|
|
672
|
+
`;return`${U}
|
|
673
|
+
${bW}${W}${W.endsWith(`
|
|
674
|
+
`)?"":`
|
|
675
|
+
`}`}return`${Q}
|
|
676
|
+
${bW}${Z}
|
|
677
|
+
`}function _G($){return/^#!.*\r?\n# Generated by SUMR Playbook/.test($)}function WI($,Q,Z){if(!O6($))return[];let X=[];for(let U of K6($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;let W=L6(U.name);if(!GG.has(W))continue;let J=B$($,U.name),G;try{G=q6(J,"utf8")}catch{continue}if(!_G(G))continue;if(X.push(J),!Z)UQ(J,{force:!0})}return X}function JI($){let Q=new Set;if(!O6($))return Q;for(let Z of K6($,{withFileTypes:!0})){if(!Z.isFile())continue;let X=L6(Z.name);if(!GG.has(X))continue;try{if(_G(q6(B$($,Z.name),"utf8")))Q.add(Z.name)}catch{}}return Q}function GI($,Q,Z){if(!O6($))return[];let X=[];for(let U of K6($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;if(L6(U.name)!==JG)continue;let W=B$($,U.name),J;try{J=q6(W,"utf8")}catch{continue}if(!_I(J))continue;if(X.push(W),!Z)UQ(W,{force:!0})}return X}function _I($){return $.includes(WG)}function YI($,Q,Z){if(!O6($))return[];let X=[];for(let U of K6($,{withFileTypes:!0})){if(!U.isFile())continue;if(Q.has(U.name))continue;if(L6(U.name)!==JG)continue;let W=B$($,U.name),J;try{J=q6(W,"utf8")}catch{continue}if(!J.includes(WG))continue;if(X.push(W),!Z)UQ(W,{force:!0})}return X}function zI($,Q,Z){let X=ZI($.body,yF);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=$I[X.lang],W=QI[X.lang],J=XI($,U,Z.warnings),G=B$(process.cwd(),".claude","hooks",J);if(a(G,UI(X.content,W),Q.dryRun),!Q.dryRun)try{fF(G,493)}catch{}return Z.filesWritten.push(G),{topic:$,fileName:J,event:$.event}}function HI($,Q,Z){let X=$.target?.trim()||X0($),U=WQ(X),J=`${U.replace(/\.(toml|md|yaml|yml)$/i,"")}.md`;if(X!==U)Z.warnings.push(`Claude subagent "${$.name}" target was normalized to "${J}".`);let G=UG($,"claude"),Y=`${_6({name:g$($),description:$.description,...G})}
|
|
678
|
+
|
|
679
|
+
${sF}
|
|
680
|
+
|
|
681
|
+
${$.body.trim()}
|
|
682
|
+
`,z=B$(process.cwd(),".claude","agents",J);return a(z,Y,Q.dryRun),Z.filesWritten.push(z),J}function VI($,Q,Z){let X=$.target?.trim()||X0($),U=WQ(X),J=`${U.replace(/\.md$/i,"")}.md`;if(X!==U)Z.warnings.push(`Claude workflow "${$.name}" target was normalized to "${J}".`);let G=$.channels?.claude??eF,_={description:$.description};for(let[V,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=G[V];if(typeof K==="string"&&K.trim())_[O]=K}let Y=["---"];for(let[V,O]of Object.entries(_))Y.push(`${V}: ${JSON.stringify(O)}`);Y.push("---");let z=`${Y.join(`
|
|
683
|
+
`)}
|
|
684
|
+
|
|
685
|
+
${tF}
|
|
686
|
+
|
|
687
|
+
${$.body.trim()}
|
|
688
|
+
`,H=B$(process.cwd(),".claude","commands",J);return a(H,z,Q.dryRun),Z.filesWritten.push(H),J}function OI($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=$.map((V)=>f0(V,"claude")).filter($G),U=X.filter(Z6),W=X.filter(X6),J=X.filter(QG);if(U.length===0&&W.length===0&&J.length===0)return Z;x$(B$(process.cwd(),".claude"),Q.dryRun);let G=B$(process.cwd(),".claude","hooks");if(W.length>0)x$(G,Q.dryRun);if(U.length>0)x$(B$(process.cwd(),".claude","agents"),Q.dryRun);if(J.length>0)x$(B$(process.cwd(),".claude","commands"),Q.dryRun);let _=JI(G),Y=[];for(let V of W){let O=zI(V,Q,Z);if(O)Y.push(O)}if(W.length>0||_.size>0)iF(Y,_,Q,Z);let z=new Set;for(let V of U)z.add(HI(V,Q,Z));let H=new Set;for(let V of J)H.add(VI(V,Q,Z));return Z.filesRemoved.push(...WI(G,new Set(Y.map((V)=>V.fileName)),Q.dryRun)),Z.filesRemoved.push(...GI(B$(process.cwd(),".claude","agents"),z,Q.dryRun)),Z.filesRemoved.push(...YI(B$(process.cwd(),".claude","commands"),H,Q.dryRun)),Z}function KI($,Q){let Z=XQ("claude",$,Q),X=OI($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function wI($,Q,Z=!0){let X=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g,U=[];for(let W of $.matchAll(X)){let J=k0(W,1).toLowerCase(),G=k0(W,2);if(Q.includes(J))return G.trim();U.push(G.trim())}return Z?U[0]??null:null}function bI($){let Q=/```([A-Za-z0-9_-]*)\r?\n([\s\S]*?)\r?\n```/g;for(let Z of $.matchAll(Q)){let X=k0(Z,1).toLowerCase();if(FI.includes(X))return{lang:X,content:k0(Z,2).trim()}}return null}function k0($,Q){let Z=$[Q];if(Z===void 0)return"";return Z}function zG($,Q,Z){let X=`${X0($)}.${Q}`,U=$.target?.trim()||X,W=SI(U);if(W!==U)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 kI($=process.cwd()){let Q=PI($);return{syncCommand:Q,tomlHeader:`# Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`.
|
|
689
|
+
`,scriptHeader:`# Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`.
|
|
690
|
+
`,markdownHeader:`<!-- Generated by SUMR Playbook. Edit the source doc and run \`${Q}\`. -->
|
|
691
|
+
`}}function PI($){let Q=CI($,"package.json");if(!TI(Q))return c8;try{let Z=JSON.parse(jI(Q,"utf8"));if(!fW(Z)||!fW(Z.scripts))return c8;let X=Z.scripts.sync;if(typeof X==="string"&&NI.test(X))return II}catch{return c8}return c8}function fW($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function fI($,Q){let Z=$.trim();if(Z.startsWith(P7))return`${Z}
|
|
692
|
+
`;return`${Q.tomlHeader}${Z}
|
|
693
|
+
`}function yI($,Q){let Z=$.trim();if(Z.startsWith(YG))return`${Z}
|
|
694
|
+
`;return`${Q.markdownHeader}
|
|
695
|
+
${Z}
|
|
696
|
+
`}function vI($,Q,Z){let X=$.trim();if(X.startsWith("#!")){let U=X.indexOf(`
|
|
697
|
+
`);if(U===-1)return`${X}
|
|
698
|
+
${Z.scriptHeader}`;let W=X.slice(0,U).trimEnd(),J=X.slice(U+1).trimStart();if(J.startsWith(P7))return`${X}
|
|
699
|
+
`;return`${W}
|
|
700
|
+
${Z.scriptHeader}${J}
|
|
701
|
+
`}if(X.startsWith(P7))return`${X}
|
|
702
|
+
`;return`${Q}
|
|
703
|
+
${Z.scriptHeader}${X}
|
|
704
|
+
`}function xI($){return $.startsWith(DI)||$.startsWith(YG)||RI.test($)}function gI($){if(!PW.test($))return{content:$,stripped:!1};return{content:$.replace(PW,"").trimStart(),stripped:!0}}function hI($,Q,Z,X){if($.length===0)return!1;let U=EI(process.cwd(),".codex","AGENTS.md"),W;if(AI(U)){let J=MI(U,"utf8");if(!xI(J))return Z.warnings.push("Codex AGENTS.md exists and is not SUMR generated; leaving it untouched and not wiring model_instructions_file."),!1;W=J}return a(U,yI(uI($,X,W),X),Q.dryRun),Z.filesWritten.push(U),!0}function uI($,Q,Z){let X=dI($,Z),U=X.map((G)=>G.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}\`.`,""],J=lI(U);if(J)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 \`${J.runner}\` for command evidence, standards coverage, managed-file drift, dependencies, secrets hygiene, and initial findings.`,`2. Start \`${J.reviewer}\` in parallel for read-only source review against SUMR standards.`,`3. Send both evidence sets to \`${J.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(HG,"","| Agent | Description |","| --- | --- |");for(let G of X)W.push(`| \`${G.name}\` | ${G.description} |`);return W.join(`
|
|
705
|
+
`)}function dI($,Q){let Z=$.map((W)=>({name:g$(W),description:pI(W.description)})),X=new Set(Z.map((W)=>W.name)),U=mI(Q).filter((W)=>!X.has(W.name));return[...Z,...U]}function mI($){if(!$)return[];let Q=$.indexOf(HG);if(Q===-1)return[];let Z=$.slice(Q).split(/\r?\n/),X=[];for(let U of Z){let W=U.match(/^\|\s*`([^`]+)`\s*\|\s*(.*?)\s*\|\s*$/);if(!W)continue;let J=k0(W,1).trim(),G=k0(W,2).trim();if(!J||!G)continue;X.push({name:J,description:G})}return X}function lI($){let Q=M7($,"code-audit-runner"),Z=M7($,"codebase-reviewer"),X=M7($,"quality-lead");if(!Q||!Z||!X)return null;return{runner:Q,reviewer:Z,qualityLead:X}}function M7($,Q){return $.find((Z)=>Z===Q||Z===`sumr-${Q}`||Z.endsWith(`-${Q}`))}function pI($){return $.replace(/\|/g,"\\|").replace(/\r?\n/g," ").trim()}function P0($){return JSON.stringify($)}function nI($){return/^[A-Za-z0-9_-]+$/.test($)?$:JSON.stringify($)}function OG($){if(typeof $==="string")return P0($);if(typeof $==="boolean")return String($);if(typeof $==="number"&&Number.isFinite($))return String($);if(Array.isArray($)){let Q=$.map(OG);if(Q.some((Z)=>Z===null))return null;return`[${Q.join(", ")}]`}return null}function iI($){if($.includes("'''"))return P0($);return`'''
|
|
706
|
+
${$}
|
|
707
|
+
'''`}function oI($,Q,Z){for(let[X,U]of rI){let W=Q[X];if(Z.add(X),typeof W==="string"&&W.trim())$.push(`${U} = ${P0(W)}`)}}function aI($,Q,Z){for(let[X,U]of Object.entries(Q)){if(Z.has(X))continue;let W=OG(U);if(W===null)continue;$.push(`${nI(X)} = ${W}`)}}function sI($,Q){let Z=$.channels?.codex??cI,X=typeof Z.name==="string"&&Z.name.trim()?Z.name:void 0,U=typeof Z.description==="string"&&Z.description.trim()?Z.description:void 0,W=[`${Q.trimEnd()}`,`name = ${P0(X??g$($))}`,`description = ${P0(U??$.description)}`],J=new Set(["name","description","developer_instructions"]);return oI(W,Z,J),aI(W,Z,J),W.push(`developer_instructions = ${iI($.body.trim())}`),`${W.join(`
|
|
708
|
+
`)}
|
|
709
|
+
`}function tI($,Q,Z){let X=new RegExp(`^\\s*${G6(Q)}\\s*=`),U=$.findIndex((G)=>X.test(G));if(U>=0){$[U]=`${Q} = ${Z}`;return}let W=$.findIndex((G)=>/^\s*\[[^\]]+\]\s*(?:#.*)?$/.test(G));if(W===-1){if($.length>0&&$[$.length-1]?.trim())$.push("");$.push(`${Q} = ${Z}`);return}let J=[`${Q} = ${Z}`];if(W>0&&$[W-1]?.trim())J.push("");$.splice(W,0,...J)}function eI($,Q){let Z=$.split(/\r?\n/);if(qG(Z))Z.pop();for(let[X,U]of Object.entries(Q))tI(Z,X,U);return Z.join(`
|
|
710
|
+
`).trimEnd()}function $D($,Q){let Z=new RegExp(`^\\s*\\[${G6(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 QD($,Q){let Z=/^\s*\[[^\]]+\]\s*(?:#.*)?$/;for(let X=Q+1;X<$.length;X+=1)if(Z.test(KG($,X)))return X;return $.length}function ZD($,Q,Z,X){let U=new Set(X),W=Z;for(let J=Q+1;J<W;J+=1){let _=KG($,J).match(/^\s*([A-Za-z0-9_-]+)\s*=/)?.[1];if(_&&U.has(_))$.splice(J,1),J-=1,W-=1}return W}function XD($,Q,Z,X){let U=Z;for(let[W,J]of Object.entries(X)){let G=new RegExp(`^\\s*${G6(W)}\\s*=`),_=$.slice(Q+1,U).findIndex((Y)=>G.test(Y));if(_>=0)$[Q+1+_]=`${W} = ${J}`;else $.splice(U,0,`${W} = ${J}`),U+=1}}function yW($,Q,Z,X=[]){let U=$.split(/\r?\n/);if(qG(U))U.pop();let W=$D(U,Q),J=QD(U,W),G=ZD(U,W,J,X);return XD(U,W,G,Z),U.join(`
|
|
711
|
+
`).trimEnd()}function KG($,Q){let Z=$[Q];if(Z===void 0)return VG;return Z}function qG($){return $.length===1&&$[0]===VG}function JD($,Q,Z,X){let U=bI($.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 W=UD[U.lang],J=WD[U.lang],G=zG($,W,Z.warnings),_=I2(process.cwd(),".codex","hooks",G);if(a(_,vI(U.content,J,X),Q.dryRun),!Q.dryRun)qI(_,493);return Z.filesWritten.push(_),{fileName:G,event:$.event}}function GD($){return`"$(git rev-parse --show-toplevel)/.codex/hooks/${$}"`}function _D($,Q,Z,X){if($.length===0)return;let U={};for(let{topic:J,fileName:G,event:_}of Q){let Y={hooks:[{type:"command",command:GD(G),...J.timeout!==void 0?{timeout:J.timeout}:{},...J.statusMessage?{statusMessage:J.statusMessage}:{}}]};if(J.matcher)Y.matcher=J.matcher;let z=U[_];if(z)z.push(Y);else U[_]=[Y]}let W=I2(process.cwd(),".codex","hooks.json");a(W,`${JSON.stringify({hooks:U},null,2)}
|
|
712
|
+
`,Z.dryRun),X.filesWritten.push(W)}function YD($,Q,Z,X,U,W){if(!$&&!Q&&!Z)return;let J=I2(process.cwd(),".codex","config.toml"),G=LI(J)?BI(J,"utf8"):"",_=G.trim().length>0,Y=gI(G),z=Y.stripped;if(G=Y.content,G.trim()===W.tomlHeader.trim())G="";if(Q)G=yW(G,"features",{hooks:"true"},["codex_hooks"]);if(Z)G=eI(G,{model_instructions_file:P0("AGENTS.md")});if($)G=yW(G,"agents",{max_threads:"6",max_depth:"1"});let H=!_||z?`${W.tomlHeader}${G.trimEnd()}
|
|
713
|
+
`:`${G.trimEnd()}
|
|
714
|
+
`;a(J,H,X.dryRun),U.filesWritten.push(J)}function zD($,Q,Z,X){let U=zG($,"toml",Z.warnings),W=wI($.body,["toml"],!1),J=W?fI(W,X):sI($,X.tomlHeader),G=I2(process.cwd(),".codex","agents",U);return a(G,J,Q.dryRun),Z.filesWritten.push(G),U}function HD($,Q){let Z={filesWritten:[],filesRemoved:[],warnings:[]},X=kI(),U=$.map((Y)=>f0(Y,"codex")).filter((Y)=>Z6(Y)||X6(Y));if(U.length===0)return Z;x$(I2(process.cwd(),".codex"),Q.dryRun);let W=U.filter(Z6),J=U.filter(X6),G=[],_=hI(W,Q,Z,X);YD(W.length>0,J.length>0,_,Q,Z,X);for(let Y of W)zD(Y,Q,Z,X);for(let Y of J){let z=JD(Y,Q,Z,X);if(z)G.push({topic:Y,...z})}return _D(J,G,Q,Z),Z}function VD($,Q){let Z=XQ("codex",$,Q),X=HD($,Q);return{filesWritten:[...Z.filesWritten,...X.filesWritten],filesRemoved:[...Z.filesRemoved,...X.filesRemoved],warnings:[...Z.warnings,...X.warnings]}}function OD($,Q){return`${X0($)}.${Q}`}function YQ($,Q,Z){let X=XJ(J6($.channelId),$.channelId),{dryRun:U}=Z,W=vW(process.cwd(),X.outputDir),J=[],G=[];x$(W,U);let _=new Set,Y=$.includeTopic??ZQ;for(let H of Q.filter(Y)){let V=f0(H,$.channelId),O=OD(V,$.extension);_.add(O);let K=CJ(V.body),{mainContent:L,sections:q}=WJ(UJ(V,K,$.channelId)),S=JJ(V.references),I=q.map((v)=>`
|
|
715
|
+
|
|
716
|
+
${v.content}`).join(""),y=_6({...$.frontmatter(V),metadata:d7(V)}),N=$.includeTitle?`
|
|
717
|
+
|
|
718
|
+
# ${V.title}`:"",w=`${y}${N}
|
|
719
|
+
|
|
720
|
+
${L}${I}${S}
|
|
721
|
+
`,l=vW(W,O);a(l,w,U),J.push(l)}let z=E2(W,_,X.filePattern,U);return{filesWritten:J,filesRemoved:z,warnings:G}}function KD($,Q){return GQ(YQ({channelId:"copilot",extension:"md",includeTitle:!0,frontmatter:()=>({applyTo:"**"})},$,Q),JQ({channelId:"copilot",outputDir:".github/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function LD($,Q){return YQ({channelId:"cursor",extension:"mdc",includeTitle:!1,frontmatter:(Z)=>{let X=Z.channels?.cursor??qD,U=Array.isArray(X.globs)?X.globs:[],W={description:Z.description||Z.title,alwaysApply:!1};if(U.length>0)W.globs=U;return W}},$,Q)}function BD($,Q){return GQ(XQ("gemini",$,Q),JQ({channelId:"gemini",outputDir:".gemini/agents",generatedFilePattern:/^sumr-.+\.md$/},$,Q))}function ED($,Q){return GQ(YQ({channelId:"opencode",extension:"md",includeTitle:!0,includeTopic:(Z)=>ZQ(Z)||QG(Z),frontmatter:(Z)=>({description:Z.description||Z.title})},$,Q),JQ(MD,$,Q))}function U0($,Q="Unexpected error"){if($ instanceof Error)return $.message;if(typeof $==="string"&&$.trim().length>0)return $;return Q}function TD(){return process.stdin.isTTY===!0&&process.stdout.isTTY===!0}function BG($,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 jD($,Q,Z,X,U,W,J){let{log:G,spinner:_,logOpts:Y,spinOpts:z}=Q;for(let H of X){let V=J6(H);if(!V)continue;let O=LG[H];if(!O)continue;let K=_(z("purple"));K.start(`${V.displayName}${J}\u2026`);try{let L=O(Z,{dryRun:U});$.allWritten.push(...L.filesWritten),$.allRemoved.push(...L.filesRemoved),$.allWarnings.push(...L.warnings);let q=BG(L.filesWritten.length,L.filesRemoved.length,U);K.stop(`${V.displayName} \u2014 ${q}${W?`; target ${V.outputDir}`:""}`)}catch(L){$.hasError=!0,K.stop(`${V.displayName} \u2014 failed`),G.error(U0(L),Y("error"))}}}function SD($,Q,Z,X,U,W){let{log:J,spinner:G,logOpts:_,spinOpts:Y}=Q,z=G(Y("purple"));z.start(`Instruction assembly${W}\u2026`);try{let H=IJ(Z,X,{dryRun:U});$.allWritten.push(...H.filesWritten),$.allRemoved.push(...H.filesRemoved),$.allWarnings.push(...H.warnings);let V=BG(H.filesWritten.length,H.filesRemoved.length,U);z.stop(`Instruction assembly \u2014 ${V}`)}catch(H){$.hasError=!0,z.stop("Instruction assembly \u2014 failed"),J.error(U0(H),_("error"))}}async function CD($,Q,Z,X,U,W,J){let{log:G,logOpts:_}=Q;try{let Y=await bJ({cwd:J,channelIds:X,context:NJ(Z,U),specs:wJ(),dryRun:W,interactive:!W&&TD()});if($.allWritten.push(...Y.filesWritten),$.allWarnings.push(...Y.warnings),Y.filesWritten.length>0)G.info(`Advisory files \u2014 updated ${Y.filesWritten.length} file${Y.filesWritten.length===1?"":"s"}`,_("info"))}catch(Y){$.hasError=!0,G.error(U0(Y,"Advisory file assistant failed"),_("error"))}}function FD($,Q,Z,X,U,W){let{spinner:J,spinOpts:G}=Q,_=J(G("purple"));_.start(`Ignore files${W}\u2026`);let Y=MJ(U,$.allWritten),z=uJ(U,X,Y),H=dJ(U,X,Y,Z),V=[z,...H],O=V.filter((K)=>K.updated).map((K)=>K.path.split(XC).pop()??K.path);for(let K of V)if(K.updated)$.allWritten.push(K.path);_.stop(O.length>0?`Ignore files \u2014 ${X?"to update":"updated"} ${O.join(", ")}`:"Ignore files \u2014 no changes")}function ID($,Q,Z,X,U,W,J){let{log:G,spinner:_,logOpts:Y,spinOpts:z}=Q;if(X){let V=A$.filter((L)=>Z.includes(L.id)),O=_(z("purple"));O.start(`VS Code settings${J}\u2026`);let K=rJ(W,V,!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 H=oJ(W,U);if(H.associationsAdded.length>0)$.allWritten.push(".vscode/settings.json"),G.info(`VS Code icons \u2014 ${U?"to add":"added"} ${H.associationsAdded.length} Playbook file association${H.associationsAdded.length===1?"":"s"}`,Y("info"))}async function DD($,Q,Z,X,U,W,J,G){let{log:_,logOpts:Y}=Q;if($.allWarnings.length>0)if(J)for(let z of $.allWarnings)_.warn(z,Y("warn"));else _.warn(xS($.allWarnings),Y("warn"));if(!$.hasError){if(J){await R0("Sources",oS(U,G));let z=vS(X,G,$.allRemoved,$.allWritten);if(z)await R0("Generated outputs",z)}_.success(gS(Z.length,X.length,W),Y("success")),ND()}}async function RD($,Q,Z,X,U,W,J,G,_){let{log:Y,spinner:z}=await import("@clack/prompts"),{brandLogOptions:H,brandSpinnerOptions:V}=await Promise.resolve().then(() => (D(),I6)),O={log:Y,spinner:z,logOpts:H,spinOpts:V},K={allWarnings:[...X],allWritten:[],allRemoved:[],hasError:!1},L=process.cwd(),q=U?" (dry run)":"";return jD(K,O,$,Q,U,_,q),K.allRemoved.push(...m7(Z,U)),SD(K,O,$,G,U,q),await CD(K,O,$,Q,G,U,L),FD(K,O,Q,U,L,q),ID(K,O,Q,J,U,L,q),await DD(K,O,$,Q,W,U,_,L),K.hasError?1:0}function ND(){g7(`
|
|
722
|
+
`)}function wD($){return{channel:$}}function bD($,Q,Z,X){for(let U of Z){let W=LG[U];if(!W)continue;try{let J=W(Q,{dryRun:X});$.allWritten.push(...J.filesWritten),$.allRemoved.push(...J.filesRemoved),$.allWarnings.push(...J.warnings)}catch(J){$.errorResult={code:"RENDER_ERROR",message:U0(J,"Renderer failed"),details:wD(U)}}}}function kD($,Q,Z,X){try{let U=IJ(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:U0(U,"AGENTS.md renderer failed"),details:{}}}}async function PD($,Q,Z,X,U,W){try{let J=await bJ({cwd:W,channelIds:Z,context:NJ(Q,X),specs:wJ(),dryRun:U,interactive:!1});$.allWritten.push(...J.filesWritten),$.allWarnings.push(...J.warnings)}catch(J){$.errorResult=$.errorResult??{code:"ADVISORY_FILE_ERROR",message:U0(J,"Advisory file assistant failed"),details:{}}}}function fD($,Q,Z,X){let U=MJ(X,$.allWritten),W=uJ(X,Z,U),J=dJ(X,Z,U,Q),G=[W,...J],_=[];for(let Y of G)if(Y.updated)$.allWritten.push(Y.path),_.push(Y.path);return _}function yD($,Q,Z,X,U){if(Z){let J=A$.filter((_)=>Q.includes(_.id));if(rJ(U,J,!0,X).patternsAdded.length>0)$.allWritten.push(".vscode/settings.json")}if(oJ(U,X).associationsAdded.length>0)$.allWritten.push(".vscode/settings.json")}async function vD($,Q,Z,X,U,W,J,G){let _={allWarnings:[...X],allWritten:[],allRemoved:[],errorResult:null};bD(_,$,Q,U),_.allRemoved.push(...m7(Z,U)),kD(_,$,G,U);let Y=process.cwd();await PD(_,$,Q,G,U,Y);let z=fD(_,Q,U,Y);yD(_,Q,J,U,Y);let H={topicsLoaded:$.length,channelsRun:Q,filesWritten:_.allWritten,filesRemoved:_.allRemoved,ignoreFilesUpdated:z,sources:W};return Y1(_1("playbook sync",_.errorResult===null,H,_.allWarnings,_.errorResult)),_.errorResult===null?0:1}function dD($,Q,Z){let X=[],U=$.slice(1);for(let W=0;W<U.length;W++){let J=U[W],G=U[W+1];if(J===gD&&G&&!G.startsWith("--"))X.push(G),W++;else if(J?.startsWith(xW))X.push(J.slice(xW.length))}if(X.length===0&&typeof Q.source==="string")X.push(Q.source);if(X.length>0)return{paths:X,origin:A2.EXPLICIT};if(Z)return{paths:Z.playbook.sources,origin:A2.CONFIG};return{paths:[MG],origin:A2.DEFAULT}}function mD($,Q){if($.origin===A2.DEFAULT&&!xD(AG(Q,MG)))return[];return $.paths}function lD($,Q){let Z=w0($.map((_)=>AG(Q,_)),{source:r$.LOCAL}),X=r7(),U=[...Z.warnings,...X.warnings],W=[],J=[];for(let _ of X.roots){let Y=w0([_.root],{source:r$.CORE,module:_.module});W=[...W,...Y.topics],U.push(...Y.warnings),J.push({label:pD(_),path:_.root,topics:Y.topics.length})}nD(Z.topics);let G=cD([{label:"SUMR resources",topics:W,duplicatePolicy:R7.ERROR},{label:"local sources",topics:Z.topics,duplicatePolicy:R7.SKIP}]);return U.push(...G.warnings),{topics:G.topics,warnings:U,breakdown:{local:{paths:$,topics:Z.topics.length},core:{source:X.source,path:X.root,paths:X.roots.map((_)=>_.root),providers:J,topics:W.length}}}}function pD($){return $.label||$.packageName||uD}function cD($){let Q=new Map,Z=[],X=[];for(let U of $)for(let W of U.topics){if(!gW(W,U.label,Q,U.duplicatePolicy,X,YW.TOPIC))continue;let J=[];for(let G of W.references)if(gW(G,U.label,Q,U.duplicatePolicy,X,YW.REFERENCE))J.push(G);Z.push({...W,references:J})}return{topics:Z.sort((U,W)=>U.name.localeCompare(W.name)),warnings:X}}function nD($){let Q=iD($).filter((X)=>X.source===r$.LOCAL&&X.name.startsWith(hD));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:
|
|
723
|
+
${Z.join(`
|
|
724
|
+
`)}
|
|
725
|
+
|
|
726
|
+
Use unprefixed names in source docs. SUMR adds managed prefixes during generation.`)}function iD($){return $.flatMap((Q)=>[Q,...Q.references])}function gW($,Q,Z,X,U,W){let J=g$($),G=Z.get(J);if(G){if(X===R7.SKIP)return U.push(`Skipped local Playbook ${W} "${$.name}" because it already exists in ${G}.`),!1;throw Error(`Duplicate Playbook topic name "${J}" found in ${G} and ${Q}.
|
|
727
|
+
|
|
728
|
+
Rename one of them or set a unique "name:" in frontmatter.`)}return Z.set(J,Q),!0}async function q2($,Q,Z,X,U,W=[]){if($)Y1(_1("playbook sync",!1,null,W,{code:Q,message:Z}));else await N0(X,U)}async function aD($,Q,Z){let{extras:X}=$.args,U=process.cwd(),W=eD(U);if(!W)return await q2(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 J=dD($.argv,X,W);if(J.origin===A2.CONFIG&&J.paths.length===0)return await q2(Q,"INVALID_CONFIG",T7,"Invalid Playbook configuration",T7),1;let G=mD(J,U);if(Z!==void 0&&!i$.includes(Z)){let q=`Unknown channel: "${Z}". Valid channels: ${i$.join(", ")}`;return await q2(Q,"INVALID_CHANNEL",q,"Invalid Playbook channel",[`Requested: ${Z}`,"",`Valid channels: ${i$.join(", ")}`].join(`
|
|
729
|
+
`)),1}let _,Y=[];try{_=lD(G,U),Y.push(..._.warnings)}catch(q){let S=q instanceof Error?q.message:"Failed to load Playbook topics.";return await q2(Q,"LOAD_ERROR",S,"Could not load Playbook topics",S),1}if(_.topics.length===0){let q=rS(J.paths,U,Y);return await q2(Q,"NO_TOPICS",q,"No Playbook topics found",q,Y),1}let H={PLAYBOOK_PATH:W.playbook.sources[0]??rD,...RS(W)},V=tD(_.topics,H),O=o8(W),K=Z?A$.filter((q)=>q.id===Z):A$.filter((q)=>O.includes(q.id)),L=Z?[]:A$.filter((q)=>!O.includes(q.id));return{topics:V,channelsToRun:K,channelsToClean:L,hideGen:W.playbook.hideGen??!1,yamlConfig:W,allWarnings:Y,breakdown:_.breakdown}}async function sD($){let{extras:Q}=$.args,Z=Q["dry-run"]===!0,X=Q.json===!0,U=Q.verbose===!0,W=typeof Q.channel==="string"?Q.channel:void 0,J=await aD($,X,W);if(typeof J==="number")return J;let{topics:G,channelsToRun:_,channelsToClean:Y,hideGen:z,yamlConfig:H,allWarnings:V,breakdown:O}=J;if(X)return vD(G,_.map((K)=>K.id),Y,V,Z,O,z,H);return RD(G,_.map((K)=>K.id),Y,V,Z,O,z,H,U)}function tD($,Q){return $.map((Z)=>({...Z,description:$0(Z.description,Q),when:Z.when?$0(Z.when,Q):Z.when,body:$0(Z.body,Q),references:Z.references.map((X)=>({...X,description:$0(X.description,Q),when:X.when?$0(X.when,Q):X.when,body:$0(X.body,Q)}))}))}function eD($){if(!C2($))return;try{return F2($)}catch{return}}function GR($){return $.flatMap((Q)=>[Q,...Q.references])}function _R($,Q,Z){let X=g$($),U=Q.get(X);if(U)Z.push({severity:D$.ERROR,code:"DUPLICATE_NAME",topic:$.name,file:$.sourcePath,message:`Duplicate topic name "${X}" \u2014 already used in ${U}`});else Q.set(X,$.sourcePath)}function YR($,Q){if($.source===r$.LOCAL&&$.name.startsWith(WR))Q.push({severity:D$.ERROR,code:"RESERVED_PREFIX",topic:$.name,file:$.sourcePath,message:`Reserved prefix "sumr-" used in local topic "${$.name}". SUMR adds managed prefixes during generation.`})}function zR($,Q){let Z=Buffer.byteLength($.body,"utf8");if(Z>UR)Q.push({severity:D$.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 HR($,Q){if($.category!==JR)return;if(!$.label)Q.push({severity:D$.WARNING,code:"REFERENCE_MISSING_LABEL",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: label`});if(!$.when)Q.push({severity:D$.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:D$.WARNING,code:"REFERENCE_MISSING_ORDER",topic:$.name,file:$.sourcePath,message:`Reference "${$.name}" is missing required frontmatter field: order`})}function VR($,Q){if(X6($)&&!$.event)Q.push({severity:D$.ERROR,code:"LIFECYCLE_MISSING_EVENT",topic:$.name,file:$.sourcePath,message:`Lifecycle resource "${$.name}" is missing required frontmatter field: event`})}function OR($,Q){let Z=[];for(let W of Q)Z.push({severity:D$.WARNING,code:"LOADER_WARNING",message:W});let X=GR($),U=new Map;for(let W of X)_R(W,U,Z),YR(W,Z),zR(W,Z),HR(W,Z),VR(W,Z);return Z}function KR($,Q,Z){if($)return[$];if(C2(Q)){let X=F2(Q),U=uW(X.playbook);if(!U.ok)for(let J of U.issues)Z.push({severity:D$.WARNING,code:"CONFIG_SCHEMA_INVALID",message:`sumr.yaml.playbook: ${J}`});let W=X.playbook.sources;if(W.length===0)Z.push({severity:D$.ERROR,code:"CONFIG_SOURCES_EMPTY",message:T7});return W}return[ZR]}function qR($){let Q=r7(),Z=[];for(let X of Q.roots){let U=w0([X.root],{source:r$.CORE,module:X.module});Z=[...Z,...U.topics],$.push(...U.warnings)}return Z}function LR($,Q,Z){let X=[];if($.length>0){X.push(`Errors (${$.length}):`);for(let U of $)X.push(` \u2717 [${U.code}] ${U.message}`)}if(Q.length>0){if(X.length>0)X.push("");X.push(`Warnings (${Q.length}):`);for(let U of Q)X.push(` \u26A0 [${U.code}] ${U.message}`)}return X.push(""),X.push(`Sources: ${Z.join(", ")}`),X.join(`
|
|
730
|
+
`)}async function BR($,Q){try{let Z=w0($,{source:r$.LOCAL});return{topics:Z.topics,warnings:Z.warnings}}catch(Z){let X=U0(Z,"Failed to load Playbook topics.");if(Q)Y1(_1("playbook validate",!1,null,[],{code:"LOAD_ERROR",message:X}));else await N0("Could not load Playbook topics",X);return 1}}async function AR($,Q,Z,X,U,W,J){let G={valid:X,errors:Q.length,warnings:Z.length,issues:$};if(J)return Y1(_1("playbook validate",X,G,[],null)),X?0:1;if($.length===0)return await R0("Playbook valid",[`Checked ${U} topic${U===1?"":"s"} \u2014 no issues found.`,"",`Sources: ${W.join(", ")}`].join(`
|
|
731
|
+
`),"mauve"),0;return await R0(X?"Playbook warnings":"Playbook validation failed",LR(Q,Z,W),X?"mauve":"pink"),X?0:1}async function MR($){let{extras:Q}=$.args,Z=Q.json===!0,X=process.cwd(),U=typeof Q.source==="string"?Q.source:void 0,W=[],J=KR(U,X,W),G=J.map((q)=>QR(X,q)),_=await BR(G,Z);if(typeof _==="number")return _;let Y=_.warnings,H=[...qR(Y),..._.topics],V=[...W,...OR(H,Y)],O=V.filter((q)=>q.severity===D$.ERROR),K=V.filter((q)=>q.severity===D$.WARNING),L=O.length===0;return AR(V,O,K,L,H.length,J,Z)}var CM,hW,wM,bM,kM,PM,fM,yM,vM,xM,gM,_7,Y7,sU,hM,rM=".",oM="'.'",aM="# Playbook",sM,$E,G1,_$,t,QE,ZE='"',XE="'",T7,UE,P1,IE="",DE,xE,y$,gE,hE=`---
|
|
732
|
+
name: my-topic
|
|
733
|
+
title: My Topic
|
|
734
|
+
description: "What this topic covers. Use when doing X."
|
|
735
|
+
tags: [optional, tags]
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
# My Topic
|
|
739
|
+
|
|
740
|
+
## When to Use
|
|
741
|
+
|
|
742
|
+
- Creating or changing X.
|
|
743
|
+
- Reviewing Y.
|
|
744
|
+
|
|
745
|
+
## Core Rules
|
|
746
|
+
|
|
747
|
+
Keep the main doc concise. Put deep detail in category: reference files in the same folder.
|
|
748
|
+
`,uE=`---
|
|
749
|
+
category: reference
|
|
750
|
+
name: my-topic-detail
|
|
751
|
+
title: Detail Section Title
|
|
752
|
+
description: "Specific supporting detail for my topic."
|
|
753
|
+
label: Detail
|
|
754
|
+
when: Doing X, reviewing Y, adding Z
|
|
755
|
+
order: 10
|
|
756
|
+
---
|
|
757
|
+
|
|
758
|
+
# Detail Section Title
|
|
759
|
+
|
|
760
|
+
## Section A
|
|
761
|
+
|
|
762
|
+
Supporting detail that should load on demand.
|
|
763
|
+
`,eU=`docs/
|
|
764
|
+
-- my-topic/
|
|
765
|
+
|-- overview.md
|
|
766
|
+
|-- detail-a.md
|
|
767
|
+
|-- detail-b.md
|
|
768
|
+
-- detail-c.md`,dE=`docs/
|
|
769
|
+
-- standards/
|
|
770
|
+
-- testing/
|
|
771
|
+
|-- overview.md
|
|
772
|
+
-- playwright-cli/
|
|
773
|
+
|-- overview.md \u2190 main topic and invoker
|
|
774
|
+
-- command-catalog.md \u2190 category: reference`,mE=`## Flow
|
|
775
|
+
|
|
776
|
+
Use compact arrows for a simple, mostly linear process:
|
|
777
|
+
|
|
778
|
+
\`\`\`text
|
|
779
|
+
\uD83D\uDD50 intake -> [researcher] -> \uD83D\uDCDD draft -> \u23F8 HUMAN APPROVES -> \u2705 ready -> [implementer] -> review -> done
|
|
780
|
+
\`\`\`
|
|
781
|
+
|
|
782
|
+
For branching or failure paths, use Mermaid plus short transition rules:
|
|
783
|
+
|
|
784
|
+
\`\`\`mermaid
|
|
785
|
+
flowchart LR
|
|
786
|
+
intake["intake"] --> research["researcher"]
|
|
787
|
+
research --> draft["draft plan"]
|
|
788
|
+
draft --> approval{"Human approves?"}
|
|
789
|
+
approval -->|yes| ready["ready"]
|
|
790
|
+
approval -->|changes requested| draft
|
|
791
|
+
ready --> implement["implementer"]
|
|
792
|
+
implement --> review["review"]
|
|
793
|
+
review --> done["done"]
|
|
794
|
+
\`\`\`
|
|
795
|
+
|
|
796
|
+
Transition rules:
|
|
797
|
+
- Do not enter implementation until the approval gate is satisfied.
|
|
798
|
+
- If review finds missing context, return to draft instead of continuing.
|
|
799
|
+
`,lE=`docs/
|
|
800
|
+
-- team-members/
|
|
801
|
+
|-- orchestrator.tm.md \u2190 drives multi-domain tasks
|
|
802
|
+
|-- code-audit-runner.tm.md \u2190 repo-wide quality agent
|
|
803
|
+
-- quality-lead.tm.md \u2190 gate-keeper, not domain-specific
|
|
804
|
+
-- standards/
|
|
805
|
+
-- backend/
|
|
806
|
+
-- overview.md`,pE=`docs/
|
|
807
|
+
-- standards/
|
|
808
|
+
|-- backend/
|
|
809
|
+
| |-- overview.md
|
|
810
|
+
| |-- testing.md
|
|
811
|
+
| -- backend-worker.tm.md \u2190 knows backend standards intimately
|
|
812
|
+
-- frontend/
|
|
813
|
+
|-- overview.md
|
|
814
|
+
-- frontend-worker.tm.md \u2190 lives beside the frontend docs it follows
|
|
815
|
+
-- team-members/
|
|
816
|
+
-- orchestrator.tm.md \u2190 cross-domain, stays at root`,cE=`docs/
|
|
817
|
+
-- architecture/ \u2190 system design, diagrams, ADRs
|
|
818
|
+
|-- system/
|
|
819
|
+
| -- overview.md
|
|
820
|
+
-- auth/
|
|
821
|
+
|-- overview.md
|
|
822
|
+
-- session-model.md (category: reference)
|
|
823
|
+
-- standards/ \u2190 (or: guidelines/ playbook/ handbook/ conventions/)
|
|
824
|
+
|-- backend/
|
|
825
|
+
| |-- overview.md
|
|
826
|
+
| |-- testing.md
|
|
827
|
+
| -- backend-worker.tm.md
|
|
828
|
+
|-- frontend/
|
|
829
|
+
| |-- overview.md
|
|
830
|
+
| -- frontend-worker.tm.md
|
|
831
|
+
-- security/
|
|
832
|
+
-- overview.md
|
|
833
|
+
-- team-members/ \u2190 orchestrators and cross-domain agents
|
|
834
|
+
|-- orchestrator.tm.md
|
|
835
|
+
-- code-audit-runner.tm.md
|
|
836
|
+
-- workflows/ \u2190 user-invoked AI workflows
|
|
837
|
+
-- ui-review.wf.md
|
|
838
|
+
-- lifecycle/ \u2190 optional lifecycle automations
|
|
839
|
+
-- session-start.lc.md`,cW,v7,x7,tE="authoring",eE,XT,A$,i$,VT,OT,r$,KT,H7="sumr-",$J=":",QJ="sumr-playbook",ST,CT,FT,fT,vT,t8,uT,lT,Q0,aT,I0,F7,sT,tT,eT="",Qj,Zj,Vj,XW="reference",UW="overview.md",Oj,qj=65536,Lj,OJ,Rj,Nj,wj,GW="",_W="..",cj="SUMR_PLAYBOOK_RESOURCES_DIR",nj="SUMR_PLAYBOOK_RESOURCES_CACHE_DIR",ij="@sumr/cli-playbook",rj="playbook",oj="@sumr/devkit",K2,B2,n,f1,aj,BS,jS,A2,R7,YW,SS,CS,D0,F0,x,u,FS="ask",IS,hS,AJ,uS,q7,dS=".codex/hooks.json",mS=".codex/hooks/",lS=".",F,e7,i8,UC,KW,w7,V6="<!-- sumr-playbook:managed -->",HC=".",VC,k1=".",AC="*",MC="docs",EC="..",FJ="",TC,CC,RC,SW,RJ=".",uC="mission-workflow",dC,mC,O$,vJ="# SUMR Playbook generated files",xJ="# sumr-playbook:start",gJ="# sumr-playbook:end",JF=".ignore",GF,hJ,_F,YF,MF=".vscode/settings.json",EF,sJ,tJ,eJ,NF,k7="SKILL.md",U6="references",W6=".md",bF,yF,xF="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",gF="metadata",XG,bW="# Generated by SUMR Playbook. Edit the source doc and run `bun run sync`.\n",sF="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",tF="<!-- Generated by SUMR Playbook. Edit the source doc and run `bun run sync`. -->",WG="<!-- Generated by SUMR Playbook.",JG=".md",GG,eF,$I,QI,FI,c8="sumr playbook sync",II="bun run sync",P7="# Generated by SUMR Playbook",DI="# Generated by SUMR Playbook.",YG="<!-- Generated by SUMR Playbook.",RI,PW,NI,HG="## Available Agents",cI,VG="",rI,UD,WD,qD,AD,MD,LG,MG="docs",gD="--source",xW="--source=",hD="sumr-",uD="resources",rD="docs",oD,$R,D$,ZR="docs",XR,UR=65536,WR="sumr-",JR="reference",ER,TR;var TG=w2(()=>{D();D();D();D();D();D();D();D();D();D();D();CM=I$.object({enabled:I$.boolean().optional(),targets:I$.array(I$.string().min(1)).optional(),claudeMd:I$.boolean().optional()}).strict(),hW=I$.object({channels:I$.record(I$.string(),I$.boolean()),sources:I$.array(I$.string().min(1)),hideGen:I$.boolean().optional(),agentsMd:CM.optional()}).strict();wM=["github","gitlab","jira","linear","azure-boards","shortcut","clickup","asana","trello","notion","custom"],bM=["github","gitlab","bitbucket","azure-devops","gitea","codeberg","generic-git","none"],kM=["preview","ask","disabled"],PM=["basic","planning-only","standard-delivery","full-delivery"],fM=["auto","ask","human","manual"],yM={root:"root",playbook:"playbook",kontract:"kontract",mission:"mission",other:"other"},vM={none:"none",channels:"channels",sources:"sources",agentsMd:"agentsMd",agentsMdTargets:"agentsMdTargets"},xM={none:"none",tracker:"tracker",git:"git",flow:"flow",flowSteps:"flowSteps",issuePrefixes:"issuePrefixes"},gM={TRUE:"true",FALSE:"false"},_7={KONTRACT:"kontract:",MISSION:"mission:",PLAYBOOK:"playbook:"},Y7={BASE_BRANCH:"baseBranch",PROVIDER:"provider",PR_MODE:"prMode"},sU={REPO_ID:"repoId",RETENTION_DAYS:"retentionDays"},hM={INPUT:"input",OUTPUT:"output"};sM=[];$E=H1,G1=yM,_$=vM,t=xM,QE=gM,T7=["`playbook.sources` is configured in sumr.yaml, but no source paths were found.","","Add at least one source path:"," playbook:"," sources:"," - docs"].join(`
|
|
840
|
+
`),UE={version:1,playbook:{channels:{claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},sources:["docs"],agentsMd:{enabled:!0,targets:["."],claudeMd:!0}}};P1={SKILL:"skill",TEAM_MEMBER:"team-member",WORKFLOW:"workflow",LIFECYCLE:"lifecycle",REFERENCE:"reference"};DE={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"]};xE=E({name:"add",description:"Scaffold a new Playbook doc with correct frontmatter",group:"modules",visibility:"public",help:DE,execute:vE}),y$={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"},gE={OVERVIEW:"overview",REFERENCE:"reference",FOLDER:"folder",FLOW:"flow",TEAM_MEMBERS_ROOT:"teamMembersRoot",TEAM_MEMBERS_DOMAIN:"teamMembersDomain",FULL_STRUCTURE:"fullStructure"},cW={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. 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 hint: reasoning, coding, or fast. Channels that support model selection use this to pick the right model class. Per-channel native blocks always take precedence."},{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. 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:eU,microconceptPattern:dE,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."},{name:"processes",purpose:"Workflows, release checklists, incident runbooks, and repeatable procedures."}]},extraction:{markerSyntax:`<!-- extract:examples -->
|
|
841
|
+
## Examples
|
|
842
|
+
|
|
843
|
+
\`\`\`text
|
|
844
|
+
{{PLAYBOOK_PATH}}/standards/testing/
|
|
845
|
+
\u251C\u2500\u2500 overview.md
|
|
846
|
+
\u2514\u2500\u2500 playwright/
|
|
847
|
+
\u251C\u2500\u2500 overview.md
|
|
848
|
+
\u251C\u2500\u2500 locators.md
|
|
849
|
+
\u2514\u2500\u2500 fixtures.md
|
|
850
|
+
\`\`\`
|
|
851
|
+
<!-- /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:hE,reference:uE,folder:eU,flow:mE,teamMembersRoot:lE,teamMembersDomain:pE,fullStructure:cE},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.","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."]},v7=Object.values(y$),x7=Object.values(gE);eE={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 (${v7.join(", ")})`},{flag:"--example <id>",description:`Only print one example (${x7.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"]};XT=E({name:"authoring",description:"Print the canonical Playbook Markdown authoring contract",group:"modules",visibility:"public",help:eE,execute:ZT}),A$=[{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-*"]}],i$=A$.map(($)=>$.id);VT={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}}"};OT={claude:"Subagent",codex:"Subagent",cursor:"Subagent",copilot:"Agent",gemini:"Subagent",opencode:"Agent"};r$={CORE:"core",LOCAL:"local"},KT={REASONING:"reasoning",CODING:"coding",FAST:"fast"};ST=/\n?<!--\s*extract:(\w+)\s*-->([\s\S]*?)<!--\s*\/extract:\1\s*-->\n?/g,CT=/```[\s\S]*?```/g,FT=[];fT={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: ${i$.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"]};vT=E({name:"clean",description:"Remove SUMR-managed Playbook outputs from the current repo",group:"modules",visibility:"public",help:fT,execute:yT}),t8={DISCARD:"__discard__",SAVE:"__save__"};uT={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"]};lT=E({name:"config",description:"Set up or update Playbook configuration for this repo",group:"modules",visibility:"public",help:uT,execute:mT}),Q0={TAGS:"tags",FRAMEWORK:"framework",TECH:"tech",GUIDE:"guide",INSIGHT:"insight",TOPIC:"topic",TEAM_MEMBERS:"teamMembers"},aT={NAME:"name",TITLE:"title",DESCRIPTION:"description",CATEGORY:"category",TARGET:"target",EVENT:"event",MATCHER:"matcher",STATUS_MESSAGE:"statusMessage",LABEL:"label",WHEN:"when",MODEL_TIER:"modelTier"},I0={CHANNELS:"channels",ORDER:"order",REVIEW:"review",TEAM_MEMBER:"team-member",TIMEOUT:"timeout"},F7={TRUE:"true",FALSE:"false"},sT=new Set(["claude","codex","cursor","copilot","gemini","opencode"]),tT=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;Qj=new Set([Q0.TAGS,Q0.FRAMEWORK,Q0.TECH,Q0.GUIDE,Q0.INSIGHT,Q0.TOPIC,I0.TEAM_MEMBER]),Zj=new Set(Object.values(aT));Vj=new Set(Object.values(KT)),Oj=[];Lj={".tm.md":"team-member",".lc.md":"lifecycle",".hk.md":"lifecycle",".wf.md":"workflow",".rf.md":"reference"};OJ={dev:"dev",cache:"cache",bundled:"bundled",missing:"missing"},Rj={always:"always",command:"command"},Nj={none:"none",metadata:"metadata",exports:"exports",resources:"resources",aiResources:"aiResources",aiActivation:"aiActivation"},wj={ACTIVATION:"activation:",AI_RESOURCES:"aiResources:",EXPORTS:"exports:",METADATA:"metadata:",RESOURCES:"resources:",ROOTS:"roots:"};K2=OJ,B2=Rj,n=Nj,f1=wj,aj=["sumr.module.yaml","sumr.module.yml","module.yaml","module.yml"];BS={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"]};jS=E({name:"status",description:"Show Playbook configuration and topic counts for the current repo",group:"modules",visibility:"public",help:BS,execute:TS}),A2={CONFIG:"config",DEFAULT:"default",EXPLICIT:"explicit"},R7={ERROR:"error",SKIP:"skip"},YW={REFERENCE:"reference",TOPIC:"topic"},SS={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>"`.'}},CS=["Azure DevOps work items (`AB#123`, `work item 123`)","ClickUp tasks","Asana tasks","Trello cards","Notion tasks"],D0={CUSTOM:"custom",JIRA:"jira",LINEAR:"linear"},F0={BASIC:"basic",PLANNING_ONLY:"planning-only",STANDARD_DELIVERY:"standard-delivery",FULL_DELIVERY:"full-delivery"},x={AUTO:"auto",ASK:"ask",HUMAN:"human",MANUAL:"manual"},u={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"},IS=[];hS={claude:[".claude/agents",".claude/hooks",".claude/commands"],codex:[".codex/agents",".codex/hooks"],opencode:[".opencode/agents"]},AJ=[],uS=[],q7=OJ;F={CLAUDE_ONLY:"claude-only",CLOSEOUT:"closeout",COMMAND:"command",CONVENTION:"convention",MAP:"map",OVERVIEW:"overview",RULE:"rule",SECURITY:"security",STARTUP:"startup",STUCK:"stuck"},e7=[F.OVERVIEW,F.STARTUP,F.MAP,F.RULE,F.COMMAND,F.CONVENTION,F.SECURITY,F.CLOSEOUT,F.STUCK,F.CLAUDE_ONLY],i8={ID:"id",ORDER:"order",SCOPE:"scope"},UC=new Set([F.OVERVIEW,F.STUCK]),KW=new Set(Object.values(i8)),w7=/<!--\s*agents-md:([a-z-]+)((?:\s+[a-z]+=[^\s>]+)*)\s*-->([\s\S]*?)<!--\s*\/agents-md:\1\s*-->/g;VC=[];TC=[];CC=[F.STARTUP,F.CLOSEOUT,F.MAP,F.RULE,F.COMMAND,F.CONVENTION,F.SECURITY];RC={};SW=["purpose","before-you-start","mission-issue-routing","repo-map","hard-rules","common-commands","code-conventions","security","closeout","if-stuck"],dC=[],mC=[{id:"root-claude-md",channelIds:["claude"],targetPath:"CLAUDE.md",title:"Claude project memory",sectionIds:[...SW,"claude-specific"],appliesTo:CW},{id:"root-agents-md",channelIds:["codex"],targetPath:"AGENTS.md",title:"Agent instructions",sectionIds:SW,appliesTo:CW}];O$={APPEND:"append",SKIP:"skip",CANCEL:"cancel"};GF=[],hJ=["!docs/standards/devkit/","!docs/standards/devkit/**"],_F={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/**"]},YF=[{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/"]}];EF={"*.tm.md":"robot","*.wf.md":"rocket","*.lc.md":"settings","*.hk.md":"settings","*.rf.md":"changelog"};sJ=["team-member"],tJ=["lifecycle","hook"],eJ=["workflow"],NF=[...sJ,...tJ,...eJ];bF=[];yF=["bash","sh","python","py","javascript","js","ts"],XG={};GG=new Set([".sh",".py",".js",".ts"]),eF={},$I={bash:"sh",sh:"sh",python:"py",py:"py",javascript:"js",js:"js",ts:"ts"},QI={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"};FI=["bash","sh","python","py","javascript","js","ts"],RI=/^#!.*\r?\n# Generated by SUMR Playbook/,PW=/^# Generated by SUMR Playbook\.[^\r\n]*(?:\r?\n|$)/,NI=/\b(?:sumr-devkit\s+sync|sumr\s+playbook\s+sync)\b/;cI={};rI=[["model","model"],["modelReasoningEffort","model_reasoning_effort"],["model_reasoning_effort","model_reasoning_effort"],["sandboxMode","sandbox_mode"],["sandbox_mode","sandbox_mode"],["sandbox-mode","sandbox_mode"]];UD={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"};qD={};AD={mode:"subagent"},MD={channelId:"opencode",outputDir:".opencode/agents",generatedFilePattern:/^sumr-.+\.md$/,defaultProps:AD};LG={claude:KI,codex:VD,cursor:LD,copilot:KD,gemini:BD,opencode:ED};oD={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: ${i$.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"]};$R=E({name:"sync",description:"Sync Playbook topics into AI tool channels",group:"modules",visibility:"public",help:oD,execute:sD}),D$={ERROR:"error",WARNING:"warning"},XR={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:"--json",description:"Output machine-readable JSON envelope"},{flag:"--help, -h",description:"Show command help"}],examples:["sumr playbook validate","sumr playbook validate --json"]};ER=E({name:"validate",description:"Check Playbook docs for errors without writing any files",group:"modules",visibility:"public",help:XR,execute:MR}),TR=K1({name:"playbook",description:"Sync Playbook docs into AI tools",group:"modules",visibility:"public",commands:[lT,$R,ER,jS,xE,vT,XT]})});import{log as NG}from"@clack/prompts";D();import{spawnSync as vQ}from"child_process";function d$($,Q){let Z=process.env[$];if(!Z)return Q;let X=Number(Z);return Number.isFinite(X)?X:Q}var D6=".sumr",kQ=".sumr-local-link",d0="1.1.0",R6="1.3.0",PQ=d$("SUMR_AWS_CREDENTIAL_TIMEOUT_MS",15000),y2=d$("SUMR_TOOL_VERSION_TIMEOUT_MS",5000),fQ=d$("SUMR_KEYCHAIN_COMMAND_TIMEOUT_MS",15000),uR=d$("SUMR_BUILD_COMMAND_TIMEOUT_MS",120000),dR=d$("SUMR_CHECK_COMMAND_TIMEOUT_MS",30000),mR=d$("SUMR_NPM_COMMAND_TIMEOUT_MS",30000),lR=d$("SUMR_TARBALL_CONTENT_BUFFER_BYTES",16777216),v2="1",yQ="SUMR_NO_KEYCHAIN",N6="SUMR_ALLOW_PLAINTEXT_AUTH_FILE",pR=d$("SUMR_LOCAL_CLI_COMMAND_TIMEOUT_MS",120000),w6=d$("SUMR_API_REQUEST_TIMEOUT_MS",30000),b6=d$("SUMR_IDENTITY_REQUEST_TIMEOUT_MS",30000);function xQ(){return{...process.env}}function gQ(){return process.env.SUMR_AWS_BIN?.trim()||"aws"}function hQ(){return vQ(gQ(),["--version"],{stdio:"pipe",env:xQ(),timeout:PQ}).status===0}function uQ(){let $=vQ(gQ(),["--version"],{stdio:"pipe",encoding:"utf8",env:xQ(),timeout:y2});if($.status!==0)return;return`${$.stdout}
|
|
852
|
+
${$.stderr}`.trim()||void 0}var pQ="Bun runtime",cQ="Bun version",w_="Bun recommended version";function dQ($){let Q=$.match(/^v?(\d+)\.(\d+)\.(\d+)/);if(!Q)return;return[Number(Q[1]),Number(Q[2]),Number(Q[3])]}function mQ($,Q){let Z=dQ($),X=dQ(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 lQ($,Q){return $.checks.some((Z)=>Z.label===Q&&Z.required&&!Z.ok)}async function x2(){let $=process.versions.bun,Q=process.versions.node,Z=Boolean($),X=$?mQ($,d0):!1,U=$?mQ($,R6):!1,W=[{label:pQ,ok:Z,required:!0,details:Z?`active (${$})`:`not active (running on Node ${Q})`},{label:cQ,ok:X,required:!0,details:$?`${$} (required >= ${d0})`:"unknown (Bun runtime not active)"},{label:w_,ok:U,required:!1,details:$?`${$} (recommended >= ${R6})`:"unknown (Bun runtime not active)"}];return{ok:W.filter((G)=>G.required).every((G)=>G.ok),bunVersion:$,nodeVersion:Q,checks:W}}function g2($,Q={}){let Z=Q.includeDoctorFollowUp??!0,X=["\u26A0 Runtime precheck failed."],U=lQ($,pQ),W=lQ($,cQ);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(W)X.push(`- Bun ${$.bunVersion??"unknown"} is below required ${d0}.`),X.push(`- Upgrade Bun to >= ${d0}: \`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 b_={name:"doctor",description:"Check runtime and tool requirements",usage:["sumr doctor"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr doctor"]};function nQ($){if($.ok)return C("PASS",["pink","bold"]);return $.required?C("FAIL",["pink","bold"]):C("WARN",["orchid","bold"])}async function k_($){let Q=await x2(),Z=$.visibility==="private",X=Z?hQ():!0,U=Z?uQ():void 0;console.log(""),console.log(C("SUMR doctor",["purple","bold"])),console.log("");for(let W of Q.checks)console.log(`- ${nQ(W)} ${W.label}: ${W.details}`);if(Z)console.log(`- ${nQ({ok:X,required:!0})} AWS CLI: ${U??"not found"}`),console.log("");else console.log("");if(!Q.ok){for(let W of g2(Q,{includeDoctorFollowUp:!1}).slice(1))console.log(W);return 1}if(Z&&!X)return console.log(C("Install AWS CLI to use private team commands.","orchid")),1;return console.log(C(Z?"Environment looks good.":"Runtime looks good.","pink")),0}var h2=E({name:"doctor",description:"Check runtime and tool requirements",group:"system",visibility:"public",help:b_,execute:k_});D();import{existsSync as P_}from"fs";import{join as f_}from"path";import{log as k6}from"@clack/prompts";var P6=["docs"],y_=new Set(["source","yes"]),v_=new Set(["input","output"]),x_={claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},g_={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 h_($,Q,Z,X){let U=$.indexOf("=");if(U!==-1)return X[$.slice(2,U)]=$.slice(U+1),0;let W=Q[Z+1];if(W&&!W.startsWith("-"))return X[$.slice(2)]=W,1;return X[$.slice(2)]=!0,0}function u_($,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 d_($){let Q={},Z=[];for(let X=0;X<$.length;X+=1){let U=$[X];if(!U)continue;if(U.startsWith("--")){X+=h_(U,$,X,Q);continue}if(U.startsWith("-")&&U.length===2){X+=u_(U,$,X,Q);continue}Z.push(U)}return{positionals:Z,options:Q}}function m_($,Q){let Z=$[Q];return typeof Z==="string"?Z:void 0}function l_($,Q){return Object.hasOwn($,Q)}function p_($,Q){return $[Q]===!0}function c_($){if(!$)return[...P6];let Q=$.split(",").map((Z)=>Z.trim()).filter(Boolean);if(Q.length===0)return[...P6];return Q}function iQ(){let $=[];return $.push("# SUMR per-repo configuration"),$.push("# Add product-specific sections only when the repository needs them."),$.push("version: 1"),$.push(""),$.join(`
|
|
853
|
+
`)}function n_($){let Q=[];Q.push("# Playbook"),Q.push("playbook:"),Q.push(" channels:");for(let[Z,X]of Object.entries(x_))Q.push(` ${Z}: ${X}`);Q.push(" sources:");for(let Z of $.sourcePaths)Q.push(` - ${Z}`);return Q}function i_($){return Object.keys($).filter((Q)=>!y_.has(Q))}function r_($){return $.length===1?`-${$}`:`--${$}`}function o_($){let Q=$.map(r_).join(", "),Z=$.length===1?"is":"are";if($.some((U)=>v_.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 a_($,Q){if($||!Q)return!0;let{confirm:Z,outro:X,isCancel:U}=await import("@clack/prompts"),W=await Z({message:"sumr.yaml already exists. Update it?",initialValue:!1});if(U(W)||!W)return X("Cancelled \u2014 existing sumr.yaml was not changed."),!1;return!0}function s_($,Q,Z){if(!Q&&!Z.includePlaybook)return J0($,iQ()),!0;if(!Z.includePlaybook)return!1;return g1($,"playbook",n_(Z),{fallbackContent:iQ(),sectionComment:"# Playbook"}),!0}function t_($,Q){if(!$)return"Created";return Q?"Updated":"Kept existing"}function e_($){return $?`${H1} kept existing module config.`:`${H1} created in this directory.`}function $Y($){return $?["Next:"," sumr playbook sync"," sumr --help"]:["Next:"," sumr --help"]}async function QY($,Q,Z,X,U){if(Q){k6.success(`${t_(Z,X)} ${H1} in ${$}`);return}let{note:W}=await import("@clack/prompts");W([e_(Z),"",...$Y(U)].join(`
|
|
854
|
+
`),"SUMR init")}async function ZY($){if($.args.flags.profile)return k6.error("Use `sumr init` without `--profile`."),1;let Q=d_($.argv.slice(1));if(Q.positionals.length>0)return k6.error("Use `sumr init` with flags only."),1;let Z=i_(Q.options);if(Z.length>0)return o_(Z),1;let X=process.cwd(),U=f_(X,H1),W=p_(Q.options,"yes"),J=l_(Q.options,"source"),G=$.visibility==="private"&&J,_=m_(Q.options,"source");if($.visibility!=="private"&&J)return console.error("`--source` is only available in private mode (when playbook commands are present)."),1;let Y={sourcePaths:G?c_(_):[...P6],includePlaybook:G},z=P_(U);if(!await a_(W,z))return 0;let V=s_(U,z,Y);return await QY(X,W,z,V,G),0}var rQ=E({name:"init",description:"Create a sumr.yaml config for this repository",group:"system",visibility:"public",help:g_,execute:ZY});D();import{chmodSync as sQ,existsSync as v6,mkdirSync as GY,readFileSync as tQ,rmSync as _Y}from"fs";import{homedir as eQ}from"os";import{join as $5}from"path";import{existsSync as XY,renameSync as UY,rmSync as WY,writeFileSync as JY}from"fs";function f6($,Q,Z){let X=`${$}.sumr-tmp-${process.pid}-${Date.now()}`;try{JY(X,Q,Z),UY(X,$)}finally{if(XY(X))WY(X,{force:!0})}}var YY="auth.json",d2="sumr-cli",m2="default",Q5="SUMR CLI authentication";function l0($=eQ()){return $5($,D6,YY)}function Z5($=eQ()){GY($5($,D6),{recursive:!0,mode:448})}function zY($){if(typeof $!=="object"||$===null)return!1;let Q=$;return typeof Q.accessToken==="string"&&typeof Q.stage==="string"}function oQ($){try{let Q=JSON.parse($);return zY(Q)?Q:null}catch{return null}}function m0($,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:fQ});return{code:Z.exitCode,stdout:new TextDecoder().decode(Z.stdout)}}catch{return{code:-1,stdout:""}}}var HY="$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))",VY="$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 aQ($,Q){if(!Bun.which("powershell"))return{code:-1,stdout:""};return m0(["powershell","-NoProfile","-NonInteractive","-Command",$],Q)}var OY=`
|
|
345
855
|
import Darwin
|
|
346
856
|
import Foundation
|
|
347
857
|
import Security
|
|
@@ -403,8 +913,8 @@ case "clear":
|
|
|
403
913
|
default:
|
|
404
914
|
exit(64)
|
|
405
915
|
}
|
|
406
|
-
`;function
|
|
407
|
-
`,{encoding:"utf8",mode:384})
|
|
408
|
-
`)}}async function
|
|
409
|
-
`),"Sign in to SUMR","purple"),
|
|
410
|
-
`),"Signed in","purple"),
|
|
916
|
+
`;function u2($){return JSON.stringify($).replace(/\$/g,"\\$")}function KY($){return OY.replace("__ACTION__",u2($)).replace("__SERVICE__",u2(d2)).replace("__ACCOUNT__",u2(m2)).replace("__LABEL__",u2(Q5))}function y6($,Q){if(!Bun.which("swift"))return{code:-1,stdout:""};return m0(["swift","-e",KY($)],Q)}var qY={set:($)=>y6("set",$).code===0,get:()=>{let{code:$,stdout:Q}=y6("get");if($!==0)return null;let Z=Q.replace(/\n$/,"");return Z.length>0?Z:null},clear:()=>{y6("clear")}},LY={set:($)=>{if(!Bun.which("secret-tool"))return!1;return m0(["secret-tool","store",`--label=${Q5}`,"service",d2,"account",m2],$).code===0},get:()=>{if(!Bun.which("secret-tool"))return null;let{code:$,stdout:Q}=m0(["secret-tool","lookup","service",d2,"account",m2]);if($!==0||Q.length===0)return null;return Q},clear:()=>{if(!Bun.which("secret-tool"))return;m0(["secret-tool","clear","service",d2,"account",m2])}},X5={set:($)=>{let{code:Q,stdout:Z}=aQ(HY,$);if(Q!==0)return!1;let X=Z.trim();if(X.length===0)return!1;try{MY(X)}catch{return!1}return!0},get:()=>{let $=l0();if(!v6($))return null;let Q=EY($);if(Q===null||Q.trim().length===0)return null;let{code:Z,stdout:X}=aQ(VY,Q);if(Z!==0)return null;let U=X.trim();return U.length>0?U:null},clear:()=>{g6()}};function x6($){if($!==void 0)return null;if(process.env[yQ]===v2)return null;if(process.platform==="darwin")return qY;if(process.platform==="linux")return LY;if(process.platform==="win32")return X5;return null}function U5($){return $!==void 0||process.env[N6]===v2}function BY(){return Error(`SUMR auth keychain is unavailable. Refusing to write plaintext auth credentials. Set ${N6}=${v2} only for local development or CI isolation.`)}function W5($,Q){if($!==X5)g6(Q)}function AY($,Q){Z5(Q);let Z=l0(Q);f6(Z,`${JSON.stringify($,null,2)}
|
|
917
|
+
`,{encoding:"utf8",mode:384}),sQ(Z,384)}function g6($){let Q=l0($);if(v6(Q))_Y(Q,{force:!0})}function MY($){Z5();let Q=l0();f6(Q,$,{encoding:"utf8",mode:384}),sQ(Q,384)}function EY($){try{return tQ($,"utf8")}catch{return null}}function Y0($){let Q=x6($);if(Q){let X=Q.get(),U=X?oQ(X):null;if(U)return U}let Z=l0($);if(!v6(Z))return null;try{let X=oQ(tQ(Z,"utf8"));if(!X)return null;if(U5($))return X;if(Q?.set(JSON.stringify(X)))return W5(Q,$),X;return null}catch{return null}}function l2($,Q){let Z=x6(Q);if(Z?.set(JSON.stringify($))){W5(Z,Q);return}if(!U5(Q))throw BY();AY($,Q)}function p2($){let Q=x6($);if(Q)Q.clear();g6($)}function J5($){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt}function G5($,Q=300000){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt-Q}var p0={AuthorizationPending:"authorization_pending",SlowDown:"slow_down",AccessDenied:"access_denied",ExpiredToken:"expired_token"},h6={Team:"team",Personal:"personal"};class c0 extends Error{constructor(){super("Login cancelled.");this.name="LoginCancelledError"}}function E$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function T$($){return $===void 0||typeof $==="string"}function c2($){return $ instanceof Error&&($.name==="AbortError"||$.message.toLowerCase().includes("aborted"))}function n0($){return $ instanceof Error?$.message:String($)}var TY="urn:ietf:params:oauth:grant-type:device_code",jY="refresh_token";function SY($){return $===void 0||typeof $==="number"}function CY($){if(!E$($))return!1;return T$($.sub)&&T$($.email)&&T$($.name)}function FY($){if(!E$($))return!1;return typeof $.deviceCode==="string"&&typeof $.userCode==="string"&&typeof $.verificationUri==="string"&&T$($.verificationUriComplete)&&typeof $.expiresIn==="number"&&typeof $.interval==="number"}function _5($){if(!E$($))return!1;return typeof $.access_token==="string"&&T$($.refresh_token)&&T$($.id_token)&&T$($.token_type)&&SY($.expires_in)}function IY($){if(!E$($))return!1;return typeof $.error==="string"&&T$($.error_description)}async function Y5($){try{return await $.text()}catch(Q){return`Unable to read response body: ${n0(Q)}`}}async function n2($,Q){try{return await $.json()}catch(Z){throw Error(`${Q} returned invalid JSON: ${n0(Z)}`)}}function z5($){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 CY(U)?U:{}}catch{return{}}}function DY($){return new Promise((Q)=>setTimeout(Q,$))}function RY($,Q){switch($){case p0.AuthorizationPending:return Q;case p0.SlowDown:return Q+5;case p0.AccessDenied:throw Error("Access denied. You declined the login request in the browser.");case p0.ExpiredToken:throw Error("Device code expired. Run `sumr login` to try again.");default:throw Error(`Unexpected error from auth server: ${$}`)}}function u6($){if($?.aborted)throw new c0}async function d6($,Q,Z){let X=new AbortController,U=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(J){if(c2(J))throw u6(Z),Error(`SUMR identity request timed out after ${b6}ms.`);throw J}finally{clearTimeout(U),Z?.removeEventListener("abort",W)}}function NY($,Q){let Z=z5(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 wY($){try{let Q=await n2($,"Device token error response");if(!IY(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 bY($,Q){let Z=await n2($,"Device token response");if(!_5(Z))throw Error("Device token response did not match the expected shape.");return NY(Q,Z)}async function kY($,Q,Z,X,U){let W=await d6(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:TY,deviceCode:X,clientId:Z})},U);if(W.ok)return{kind:"approved",session:await bY(W,$)};return{kind:"pending",errorCode:await wY(W)}}async function H5($){let Q=`${$.apiBaseUrl}/v3/identity/device/code`,Z=await d6(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:$.clientId,scope:$.scope})});if(!Z.ok){let U=await Y5(Z);throw Error(`Device code request failed (${Z.status}): ${U}`)}let X=await n2(Z,"Device code response");if(!FY(X))throw Error("Device code response did not match the expected shape.");return X}async function V5($,Q,Z,X,U){let W=`${Q.apiBaseUrl}/v3/identity/device/token`,J=X;for(;;){u6(U),await DY(J*1000),u6(U);let G=await kY($,W,Q.clientId,Z,U);if(G.kind==="approved")return G.session;J=RY(G.errorCode,J)}}async function O5($,Q){if(!$.refreshToken)throw Error("No refresh token available.");let Z=`${Q.apiBaseUrl}/v3/identity/oauth/token`,X=await d6(Z,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:jY,clientId:Q.clientId,refreshToken:$.refreshToken})});if(!X.ok){let G=await Y5(X);throw Error(`Token refresh failed (${X.status}): ${G}`)}let U=await n2(X,"Token refresh response");if(!_5(U))throw Error("Token refresh response did not match the expected shape.");let W=z5(U.access_token),J=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:J,user:{id:W.sub??$.user?.id,email:W.email??$.user?.email,name:W.name??$.user?.name}}}import{log as L5}from"@clack/prompts";class i2 extends Error{status;details;constructor($,Q){super(`SUMR API request failed (${$}).`);this.name="SumrApiError",this.status=$,this.details=Q}}function PY($){return`Bearer ${$.accessToken}`}function fY($,Q){return{accept:"application/json",authorization:PY($),...Q?{"content-type":"application/json"}:{}}}async function K5($){try{return await $.text()}catch(Q){return Q instanceof Error?Q.message:String(Q)}}async function yY($){let Q=await K5($);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 vY($,Q){let Z=new AbortController,X=setTimeout(()=>Z.abort(),w6);try{return await fetch($,{...Q,signal:Z.signal})}catch(U){if(c2(U))throw Error(`SUMR API request timed out after ${w6}ms.`);throw U}finally{clearTimeout(X)}}async function q5($,Q,Z,X={}){let U=X.body===void 0?void 0:JSON.stringify(X.body),W=await vY(`${$.apiBaseUrl}${Z}`,{method:X.method??"GET",headers:fY(Q,U!==void 0),body:U});if(!W.ok)throw new i2(W.status,await K5(W));return yY(W)}var A5="prod",u1={apiBaseUrl:"https://api.sumr.co",clientId:"sumr-cli",scope:"openid offline organizations:read organizations:write api-keys:read api-keys:write"};async function B5($,Q){if(!$.refreshToken)return null;try{let Z=await O5($,u1);return l2(Z,Q),Z}catch(Z){return n0(Z),null}}async function M5($){let Q=Y0($);if(!Q)throw L5.error("Not signed in. Run `sumr login` first."),Error("Not signed in.");if(J5(Q)){let Z=await B5(Q,$);if(!Z)throw p2($),L5.error("Session expired. Run `sumr login` to sign in again."),Error("Session expired.");return Z}if(G5(Q))return await B5(Q,$)??Q;return Q}async function E5($,Q,Z={}){return q5(u1,$,Q,Z)}var xY={name:"login",description:"Sign in to SUMR",usage:["sumr login"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr login"]};function gY($){try{return new URL($).protocol==="https:"}catch{return!1}}function hY($){if(!gY($))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:y2})}catch{}}function uY($){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 dY($){if(!uY($))return{summary:$};return{summary:"Unable to connect to the prod auth API.",details:[`Target: ${u1.apiBaseUrl}`,"Retry later or contact SUMR support if the problem continues.",`Cause: ${$}`].join(`
|
|
918
|
+
`)}}async function mY($,Q){Q.start("Waiting for browser sign-in...");let Z=new AbortController,X=()=>{Z.abort()};process.on("SIGINT",X);try{let U=await V5(A5,u1,$.deviceCode,$.interval,Z.signal);return Q.stop("Sign-in approved."),{kind:"ok",session:U}}catch(U){if(Q.stop(""),U instanceof c0||Z.signal.aborted)return{kind:"cancelled"};return{kind:"error",message:U instanceof Error?U.message:String(U)}}finally{process.off("SIGINT",X)}}async function lY(){let{spinner:$}=await import("@clack/prompts"),Q=$(V1("purple"));Q.start("Requesting sign-in code...");let Z;try{Z=await H5(u1),Q.stop("Sign-in code ready.")}catch(X){return Q.stop(""),{kind:"error",message:X instanceof Error?X.message:String(X)}}return h$(["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(`
|
|
919
|
+
`),"Sign in to SUMR","purple"),hY(Z.verificationUriComplete??Z.verificationUri),mY(Z,$(V1("purple")))}async function pY($){if($.args.flags.profile)return K$("`sumr login` does not accept --profile."),1;if($.argv.length>1)return K$("Unexpected argument: public login targets SUMR production only."),1;i("sumr");let Q=Y0();if(Q){let U=Q.user?.email??Q.user?.name??"your account";return G0(`Already signed in as ${U}. Run \`sumr logout\` first.`),1}let Z=await lY();if(Z.kind==="cancelled")return G0("Sign-in cancelled."),1;if(Z.kind==="error"){let U=dY(Z.message);return K$(`Sign-in failed: ${U.summary}`,{details:U.details,title:"Auth target"}),1}l2(Z.session);let X=Z.session.user?.email??Z.session.user?.name??`account on ${u1.apiBaseUrl.replace("https://","")}`;return P(`Signed in as ${X}.`),O1(),0}var T5=E({name:"login",description:"Sign in to SUMR",group:"auth",visibility:"public",help:xY,execute:pY});D();var cY={name:"logout",description:"Sign out of SUMR",usage:["sumr logout"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr logout"]};async function nY($){i("sumr");let Q=Y0();if(!Q)return o$("Not signed in."),O1(),0;p2();let Z=Q.user?.email??Q.user?.name??"your account";return P(`Signed out of ${Z}.`),O1(),0}var j5=E({name:"logout",description:"Sign out of SUMR",group:"auth",visibility:"public",help:cY,execute:nY});D();function iY($){return $===h6.Team||$===h6.Personal}function rY($){if(!E$($))return!1;return typeof $.id==="string"&&typeof $.organizationId==="string"&&typeof $.principalId==="string"&&typeof $.role==="string"&&typeof $.status==="string"&&T$($.invitedBy)&&T$($.acceptedAt)&&typeof $.createdAt==="string"}function oY($){if(!E$($))return!1;return typeof $.id==="string"&&typeof $.slug==="string"&&typeof $.name==="string"&&iY($.kind)}function aY($){if(!E$($))return!1;return rY($.membership)&&oY($.organization)}function sY($){return E$($)&&Array.isArray($.data)&&$.data.every(aY)}function S5($){if(!sY($))throw Error("SUMR API /v3/me/organizations response did not match the expected shape.");return $}var tY={name:"whoami",description:"Show the currently signed-in user",usage:["sumr whoami"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr whoami"]};function eY($){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 $4($){i("sumr");let Q=await M5(),Z=S5(await E5(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: ${eY(Q.expiresAt)}`),X.push("API: connected"),X.push(`Organizations: ${Z.data.length}`),h$(X.join(`
|
|
920
|
+
`),"Signed in","purple"),O1(),0}function Q4($){if($ instanceof i2){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 C5=E({name:"whoami",description:"Show the currently signed-in user",group:"auth",visibility:"public",help:tY,execute:async($)=>{try{return await $4($)}catch(Q){throw Error(Q4(Q))}}});D();function r2($,Q){let Z;async function X(){if(!Z)Z=f2(await $());return Z}return{name:Q.name,description:Q.description,group:Q.group,visibility:Q.visibility,run:async(U)=>(await X()).run(U)}}var jR=r2(()=>Promise.resolve().then(() => (WU(),UU)).then(($)=>$.kontractModule),{name:"kontract",description:"Generate and validate API contract code",group:"modules",visibility:"public"}),SR=r2(()=>Promise.resolve().then(() => (aU(),oU)).then(($)=>$.missionModule),{name:"mission",description:"File-backed execution state for AI-assisted work",group:"modules",visibility:"public"}),CR=r2(()=>Promise.resolve().then(() => (TG(),EG)).then(($)=>$.playbookModule),{name:"playbook",description:"Sync Playbook docs into AI tools (Claude, Cursor, Codex, VS Code)",group:"modules",visibility:"public"});function jG(){return[T5,j5,C5,rQ,h2,jR,SR,CR]}D();import{log as bR}from"@clack/prompts";D();import{existsSync as CG,readFileSync as FR}from"fs";import{dirname as SG,join as zQ}from"path";import{fileURLToPath as IR}from"url";var B6="0.0.0";function DR($){if(!E$($))return;return typeof $.version==="string"?$.version:void 0}function A6($=import.meta.url){let Q=SG(IR($));for(;;){if(CG(zQ(Q,"package.json")))return Q;let Z=SG(Q);if(Z===Q)return;Q=Z}}function FG($){try{let Q=FR(zQ($,"package.json"),"utf8"),Z=JSON.parse(Q);return DR(Z)??B6}catch{return B6}}function IG($=A6()){return Boolean($&&CG(zQ($,kQ)))}var DG=[" _____ __ __ _____ _____ ","| __|__|__| | __ |","|__ | | | | | | -|","|_____|_____|_|_|_|__|__|"],RR="\u2508".repeat(Math.max(...DG.map(($)=>$.length)));function HQ(){let $=A6();if(!$)return B6;return FG($)}function NR(){let $=A6();if(!IG($))return"";return C("(Local-Test)","orange")}function wR($){return $==="private"?"\uD83D\uDD12":"\uD83C\uDF10"}function D2($){console.log("");for(let W of DG)console.log(W);console.log(C(RR,["mauve","dim"]));let Q=NR(),Z=wR($),X=C("|",["mauve","dim"]),U=[Z,C(`v${HQ()}`,["mauve","dim"]),Q].filter(Boolean).join(` ${X} `);console.log(U),console.log("")}async function RG($){let Q=P2($.argv),Z=new Map($.commands.map((U)=>[U.name,U]));if(!Q.command)return D2($.visibility),console.log(h1($.commands,$.visibility)),0;if(Q.command==="--help"||Q.command==="-h")return D2($.visibility),console.log(h1($.commands,$.visibility)),0;if(Q.command==="--version"||Q.command==="-v")return console.log(HQ()),0;let X=Z.get(Q.command);if(!X)return D2($.visibility),console.error(`Unknown command: ${Q.command}`),console.log(h1($.commands,$.visibility)),1;if(X.name!==h2.name){let U=await x2();if(!U.ok){D2($.visibility);for(let W of g2(U))console.error(W);return 1}}try{return await X.run({argv:$.argv,args:Q,visibility:$.visibility})}catch(U){let W=U instanceof Error?U.message:"Unexpected error.";return bR.error(W),1}}try{let $=await RG({argv:process.argv.slice(2),commands:jG(),visibility:"public"});process.exit($)}catch($){let Q=$ instanceof Error?$.message:String($);NG.error(`sumr: ${Q}`),NG.warn("Run `sumr doctor` to diagnose your installation."),process.exit(1)}
|