@sumrco/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/ai/modules/kontract/resources/configuration.rf.md +123 -0
- package/ai/modules/kontract/resources/generated-output.rf.md +179 -0
- package/ai/modules/kontract/resources/openapi-generator-lessons.rf.md +61 -0
- package/ai/modules/kontract/resources/overview.md +115 -0
- package/ai/modules/kontract/resources/performance.rf.md +90 -0
- package/ai/modules/kontract/resources/schema-reuse.rf.md +233 -0
- package/ai/modules/kontract/resources/scope-and-splitting.rf.md +147 -0
- package/ai/modules/kontract/resources/spec-layout.rf.md +69 -0
- package/ai/modules/kontract/resources/team-members/contract-author.tm.md +52 -0
- package/ai/modules/kontract/resources/workflows/contract-change.wf.md +60 -0
- package/ai/modules/kontract/sumr.module.yaml +42 -0
- package/ai/modules/mission/resources/flow-actions.rf.md +40 -0
- package/ai/modules/mission/resources/flow-config.rf.md +39 -0
- package/ai/modules/mission/resources/flow-safety-boundaries.rf.md +23 -0
- package/ai/modules/mission/resources/overview.md +69 -0
- package/ai/modules/mission/resources/stage-closeout.rf.md +21 -0
- package/ai/modules/mission/resources/stage-delivery.rf.md +36 -0
- package/ai/modules/mission/resources/stage-intake.rf.md +39 -0
- package/ai/modules/mission/resources/stage-planning.rf.md +21 -0
- package/ai/modules/mission/resources/stage-pull-request.rf.md +50 -0
- package/ai/modules/mission/resources/stage-quality.rf.md +22 -0
- package/ai/modules/mission/resources/team-members/delivery-lead.tm.md +39 -0
- package/ai/modules/mission/resources/team-members/implementer.tm.md +25 -0
- package/ai/modules/mission/resources/team-members/planner.tm.md +102 -0
- package/ai/modules/mission/resources/team-members/pr-writer.tm.md +57 -0
- package/ai/modules/mission/resources/team-members/product-owner.tm.md +37 -0
- package/ai/modules/mission/resources/team-members/quality-lead.tm.md +34 -0
- package/ai/modules/mission/resources/workflows/daily-triage.wf.md +117 -0
- package/ai/modules/mission/resources/workflows/full-delivery.wf.md +18 -0
- package/ai/modules/mission/resources/workflows/mission-cycle.wf.md +30 -0
- package/ai/modules/mission/resources/workflows/planning-only.wf.md +68 -0
- package/ai/modules/mission/resources/workflows/pr-assist.wf.md +21 -0
- package/ai/modules/mission/resources/workflows/standard-delivery.wf.md +18 -0
- package/ai/modules/mission/sumr.module.yaml +78 -0
- package/ai/modules/playbook/resources/authoring/content-structure.rf.md +148 -0
- package/ai/modules/playbook/resources/authoring/cross-referencing.rf.md +57 -0
- package/ai/modules/playbook/resources/authoring/descriptions.rf.md +71 -0
- package/ai/modules/playbook/resources/authoring/extraction.rf.md +81 -0
- package/ai/modules/playbook/resources/authoring/flows.rf.md +55 -0
- package/ai/modules/playbook/resources/authoring/folder-structure.rf.md +148 -0
- package/ai/modules/playbook/resources/authoring/frontmatter.rf.md +251 -0
- package/ai/modules/playbook/resources/authoring/markdown.rf.md +108 -0
- package/ai/modules/playbook/resources/authoring/overview.md +213 -0
- package/ai/modules/playbook/resources/team-members/playbook-technical-writer.tm.md +31 -0
- package/ai/modules/playbook/sumr.module.yaml +47 -0
- package/ai/registry.json +18 -0
- package/bin/_sumr +4 -0
- package/bin/sumr +7 -0
- package/index.js +410 -0
- package/package.json +52 -0
package/index.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
var O7=Object.defineProperty;var M7=($)=>$;function J7($,_){this[$]=M7.bind(null,_)}var E_=($,_)=>{for(var W in _)O7($,W,{get:_[W],enumerable:!0,configurable:!0,set:J7.bind(_,W)})};var f2=($,_)=>()=>($&&(_=$($=0)),_);var k1=import.meta.require;import{existsSync as I_,mkdirSync as Y7,readFileSync as T7,renameSync as A7,rmSync as H7,writeFileSync as C7}from"fs";import{homedir as z7}from"os";import{dirname as j_,join as T0,resolve as L7}from"path";import{existsSync as F_,readFileSync as V7,renameSync as E7,rmSync as K7,writeFileSync as B7}from"fs";import{intro as i7,log as z0,note as P2,outro as r7}from"@clack/prompts";import{cancel as ZQ,isCancel as k_,select as XQ,text as GQ}from"@clack/prompts";import{z as q_}from"zod";function R7($,_,W){let Q=`${$}.${process.pid}.${Date.now()}.tmp`;try{B7(Q,_,W),E7(Q,$)}catch(U){if(F_(Q))K7(Q,{force:!0});throw U}}function S7($){return $.endsWith(":")?$.slice(0,-1):$}function q7($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function I7($){return/^[A-Za-z][A-Za-z0-9_-]*:\s*(?:.*)$/.test($)}function K_($){let _=[...$];while(_.at(-1)?.trim()===$1)_.pop();return _}function j7($){let _=[...$];while(_[0]?.trim()===$1)_.shift();return _}function B_($,_){return $[_]??$1}function F7($,_,W){let Q=S7(_),U=new RegExp(`^${q7(Q)}:\\s*(?:#.*)?$`),Z=$.findIndex((O)=>U.test(O));if(Z===-1)return;let X=W&&$[Z-1]?.trim()===W?Z-1:Z,G=$.length;for(let O=Z+1;O<$.length;O+=1)if(I7(B_($,O))){G=O;break}while(G>Z+1){let O=B_($,G-1).trim();if(O!==$1&&!O.startsWith("#"))break;G-=1}return{start:X,end:G}}function R_($,_,W){let Q=[...$];if(Q.length>0)Q.push($1);if(Q.push(..._),W.length>0)Q.push($1,...W);return Q.push($1),Q.join(`
|
|
4
|
+
`)}function w7($,_,W,Q={}){let U=$.endsWith(`
|
|
5
|
+
`),Z=$.split(`
|
|
6
|
+
`);if(U)Z.pop();let X=F7(Z,_,Q.sectionComment);if(!X)return R_(K_(Z),W,[]);return R_(K_(Z.slice(0,X.start)),W,j7(Z.slice(X.end)))}function y2($,_=`version: 1
|
|
7
|
+
`){return F_($)?V7($,"utf8"):_}function k2($,_){R7($,_,"utf8")}function H0($,_,W,Q={}){let U=y2($,Q.fallbackContent);k2($,w7(U,_,W,Q))}function y7($){let _=L7($);for(;;){for(let Q of N2)if(I_(T0(_,Q)))return _;let W=j_(_);if(W===_)return;_=W}}function f_($={}){let _=$.cwd??process.cwd(),W=$.home??z7(),Q=y7(_),U=Q?T0(Q,D7):T0(W,f7);return T0(U,N7)}function k7(){return{version:w_,activated:{}}}function P7($){if(typeof $!=="object"||$===null)return!1;let _=$;return typeof _.activated==="object"&&_.activated!==null}function b7($={}){let _=f_($);return g7(_)??k7()}function g7($){if(!I_($))return;try{let _=JSON.parse(T7($,"utf8"));if(!P7(_))return;return{version:w_,activated:{..._.activated}}}catch{return}}function C0($,_={}){let W=f_(_),Q=b7(_);return Q.activated[$]={at:new Date().toISOString()},v7(W,Q),Q}function v7($,_){let W=`${$}.sumr-tmp-${Date.now()}`;Y7(j_($),{recursive:!0});try{C7(W,`${JSON.stringify(_,null,2)}
|
|
8
|
+
`,"utf8"),A7(W,$)}finally{H7(W,{force:!0})}}function x7($,_){let W=$.find((Z)=>Z.startsWith(`${_}=`));if(W)return W.slice(_.length+1);let Q=$.indexOf(_);if(Q===-1)return;let U=$[Q+1];if(!U||U.startsWith("--"))return;return U}function d7($){let _={};for(let W=0;W<$.length;W+=1){let Q=$[W];if(!Q?.startsWith("--"))continue;if(u7.has(Q)||h7.has(Q))continue;let U=Q.indexOf("=");if(U!==-1){let G=Q.slice(2,U),O=Q.slice(U+1);_[G]=O;continue}let Z=$[W+1],X=Q.slice(2);if(Z&&!Z.startsWith("--"))_[X]=Z,W+=1;else _[X]=!0}return _}function D_($){let[_,...W]=$,Q=[];for(let U=0;U<W.length;U+=1){let Z=W[U];if(!Z)continue;if(Z.startsWith("--")){if(Z==="--profile")U+=1;continue}Q.push(Z)}return{command:_,positionals:Q,flags:{help:W.includes("--help")||W.includes("-h")||_==="--help",profile:x7(W,"--profile")},extras:d7(W)}}function c7($=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 R($,_,W=process.stdout){if(!c7(W))return $;return`${(Array.isArray(_)?_:[_]).map((Z)=>S_[Z]).join("")}${$}${S_.reset}`}function U$($,_=process.stdout){let W=l7[$];return{symbol:R(W.symbol,W.tone,_)}}function P$($="mauve",_=process.stdout){return{format:(W)=>R(W,$,_)}}function _1($="purple",_=process.stdout){return{styleFrame:(W)=>R(W,$,_)}}function A0($){return $.trim().split(/\s+/).map((W,Q)=>{if(Q===0&&W==="sumr")return R(W,n7);if((Q===1||Q===2)&&!W.startsWith("-")&&!W.startsWith("[")&&!W.startsWith("<"))return R(W,N_);return W}).join(" ")}function p7($){let _=[`${R($.name,[N_,"bold"])} ${R("\xB7","dim")} ${R($.description,"dim")}`,"","Usage:"];for(let W of $.usage)_.push(` ${A0(W)}`);if($.options&&$.options.length>0){_.push("","Options:");for(let W of $.options)_.push(` ${R(W.flag.padEnd(18),m7)} ${R(W.description,"dim")}`)}if($.examples&&$.examples.length>0){_.push("","Examples:");for(let W of $.examples)_.push(` ${A0(W)}`)}return _.push(""),_.join(`
|
|
9
|
+
`)}function s7($){let _=$?.filter((W)=>W.value!==void 0&&W.value!==null&&String(W.value).length>0).map((W)=>`${R(`${W.label}:`,["orchid","bold"])} ${String(W.value)}`);return _&&_.length>0?_.join(`
|
|
10
|
+
`):void 0}function o7($){let _=s7($.fields);if($.details&&_)return`${_}
|
|
11
|
+
${$.details}`;return $.details??_}function L0($,_){let W=o7($);if(!W)return;P2(W,$.title??_,P$("dim"))}function o($){i7($)}function W1($="Done"){r7($)}function b$($,_={}){z0.info($,U$("info")),L0(_,"Details")}function y($,_={}){z0.success($,U$("success")),L0(_,"Details")}function b1($,_={}){z0.warn($,U$("warn")),L0(_,"Details")}function L$($,_={}){z0.error($,{...U$("error",process.stderr),output:process.stderr}),L0(_,"Details")}function S$($,_="Details",W="dim"){P2($,_,P$(W))}function q$($,_="Items"){if($.length===0){b$("No items found.");return}P2($.join(`
|
|
12
|
+
`),_,P$("dim"))}function q($){return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,help:$.help,run:async(_)=>{if(_.args.flags.help)return o(`sumr ${$.help.name.split(/\s+/)[0]}`),console.log(p7($.help)),0;return $.execute(_)}}}function e7($,_){let W=$.filter((U)=>_==="private"||U.visibility==="public"),Q=new Map;for(let U of W){let Z=Q.get(U.group)??[];Z.push(U),Q.set(U.group,Z)}return[...Q.entries()].sort((U,Z)=>D2[U[0]].order-D2[Z[0]].order).map(([U,Z])=>[U,Z.sort((X,G)=>X.name.localeCompare(G.name))])}function V0($,_){let W=["","Options:","",` ${R("--help".padEnd(22),"orchid")} ${R("Show help","dim")}`,""];W.push("Commands:"),W.push("");for(let[Q,U]of e7($,_)){let Z=D2[Q];W.push(`${R(`${Z.label}:`,a7)}`);for(let X of U)W.push(` ${R(X.name.padEnd(18),t7)} ${R(X.description,"dim")}`);W.push("")}return W.push(` ${R("<command> --help Show command help.","dim")}`),W.push(""),W.join(`
|
|
13
|
+
`)}function $Q($){let _=[`${R($.name,["pink","bold"])} ${R("\xB7","dim")} ${R($.description,"dim")}`,"","Usage:",` ${A0(`sumr ${$.name} <command>`)}`,"","Options:",` ${R("--help, -h".padEnd(22),"orchid")} ${R("Show help","dim")}`,"","Commands:",""];for(let W of $.commands)_.push(` ${R(W.name.padEnd(18),"pink")} ${R(W.description,"dim")}`);return _.push(""),_.push(` ${A0(`sumr ${$.name} <command> --help`)} ${R("Show command help.","dim")}`),_.push(""),_.join(`
|
|
14
|
+
`)}function _Q($){return{...$,argv:$.argv.slice(1),args:{...$.args,positionals:$.args.positionals.slice(1)}}}function g1($){return $}function WQ($){let _=new Map($.commands.map((Q)=>[Q.name,Q]));function W(){return $Q({name:$.name,description:$.description,commands:$.commands})}return{name:$.name,description:$.description,group:$.group,visibility:$.visibility,run:async(Q)=>{let[U]=Q.args.positionals;if(!U)return o(`sumr ${$.name}`),console.log(W()),0;let Z=_.get(U);if(!Z)return o(`sumr ${$.name}`),L$(`Unknown ${$.unknownSubcommandLabel??$.name} command: ${U}`),console.log(W()),1;return Z.run(_Q(Q))}}}function y_($){return WQ({name:$.name,description:$.description,group:$.group,visibility:$.visibility,commands:$.commands})}function E0(){return Boolean(process.stdin.isTTY&&process.stdout.isTTY)}async function g$($){let _=await XQ({message:$.message,options:$.options,initialValue:$.initialValue});if(k_(_)){P_();return}return _}async function v1($){let _=await GQ($);if(k_(_)){P_();return}return _}function P_($="Cancelled."){ZQ($)}var $1="",P1="sumr.yaml",N2,f7=".sumr",D7=".sumr-cache",N7="activations.json",w_=1,u7,h7,S_,l7,n7="purple",N_="pink",m7="orchid",t7="pink",a7="orchid",D2,QQ="1.0.0",UQ,V4,B4;var v=f2(()=>{N2=["sumr.yaml","sumr.yml"];u7=new Set(["--profile"]),h7=new Set(["--help","-h","--version","-v"]);S_={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"},l7={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"}};D2={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}};UQ=q({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(QQ),0}}),V4=g1({name:"core",description:"Shared SUMR CLI command contracts and UX helpers",group:"internal",visibility:"private",commands:[UQ]});B4=q_.object({version:q_.number().int().positive()}).passthrough()});var X9={};E_(X9,{kontractModule:()=>KT});import{cpus as vU}from"os";import{Buffer as ZZ}from"buffer";import{randomUUID as XZ}from"crypto";import{access as GZ,mkdir as OZ,readdir as MZ,rename as JZ,stat as YZ}from"fs/promises";import{join as p}from"path";import{mkdtemp as EZ,rm as KZ}from"fs/promises";import{tmpdir as BZ}from"os";import{join as W8}from"path";import{dirname as FZ,isAbsolute as wZ,join as E8,relative as K8,resolve as c0}from"path";import{mkdir as yZ,readdir as kZ,stat as PZ}from"fs/promises";import{dirname as R8,join as wW,relative as bZ,resolve as c$}from"path";import{access as mZ,readFile as pZ}from"fs/promises";import{dirname as n$,join as mW,relative as pW,resolve as m0}from"path";import{log as V1}from"@clack/prompts";import{join as EX}from"path";import{bundle as KX,loadConfig as BX}from"@redocly/openapi-core";import{stringify as RX}from"yaml";import{basename as xX,join as uX,relative as eW}from"path";import{camelCase as tX,constantCase as aX,kebabCase as W2,pascalCase as D$}from"change-case";import{jsonSchemaToZod as VG}from"json-schema-to-zod";import{join as e2}from"path";import jG from"@asyncapi/parser/browser";import{log as FG}from"@clack/prompts";import{pascalCase as T5}from"change-case";import{pascalCase as C5}from"change-case";import{pascalCase as c6}from"change-case";import{pascalCase as i0}from"change-case";import{pascalCase as I5}from"change-case";import{camelCase as AM}from"change-case";import{access as v5,readdir as x8,rm as e1}from"fs/promises";import{basename as RM,join as i}from"path";import SM from"@apidevtools/swagger-parser";import{log as $0}from"@clack/prompts";import{camelCase as T2,constantCase as uM,pascalCase as h8,snakeCase as d8}from"change-case";import{pascalCase as n8}from"change-case";import{pascalCase as s8}from"change-case";import{camelCase as OJ,pascalCase as x$}from"change-case";import{basename as EJ,join as i5}from"path";import KJ from"@apidevtools/swagger-parser";import{log as r5}from"@clack/prompts";import{mkdir as J8,rm as t5}from"fs/promises";import{join as F$,resolve as o6}from"path";import{mkdir as $Y,rm as e5,stat as _Y}from"fs/promises";import{join as Y8,resolve as WY}from"path";import{basename as IY,resolve as jY}from"path";import FY from"@apidevtools/swagger-parser";import{log as b0}from"@clack/prompts";import{existsSync as e6,mkdirSync as dY,readFileSync as lY,writeFileSync as cY,writeSync as nY}from"fs";import{dirname as mY,join as $W}from"path";import{existsSync as rY,readFileSync as sY}from"fs";import{join as oY}from"path";import{parse as tY}from"yaml";function gU($,_){this[$]=bU.bind(null,_)}async function _Z($,_,W,Q){try{if(await _($))Q.successCount+=1;else Q.failedCount+=1}catch(U){Q.failedCount+=1,Q.errors.push(U instanceof Error?U:Error(String(U)))}finally{W.done=!0}}async function _8($,_,W){let Q=Number.isFinite(W)&&W>0?Math.floor(W):1,U={successCount:0,failedCount:0,errors:[]},Z=[];for(let X of $){let G={done:!1,promise:Promise.resolve()};if(G.promise=_Z(X,_,G,U),Z.push(G),Z.length>=Q)await Promise.race(Z.map((O)=>O.promise)),Z=Z.filter((O)=>!O.done)}return await Promise.all(Z.map((X)=>X.promise)),{success:U.successCount,failed:U.failedCount,errors:U.errors}}function WZ($){let _=v0;return v0=$,()=>{v0=_}}function C8(){return v0}function D($,_=1){let W=C8();if(!W)return;W.counters.set($,(W.counters.get($)??0)+_)}async function $$($,_){let W=performance.now();try{return await _()}finally{QZ($,performance.now()-W)}}function QZ($,_){let W=C8();if(!W)return;W.phaseDurationsMs.set($,(W.phaseDurationsMs.get($)??0)+_),W.phaseCounts.set($,(W.phaseCounts.get($)??0)+1)}function UZ($){let _=C8();if(!_)return;_.subprocesses.push($)}function k6($){if(typeof $==="bigint")return Number($);return $}function z8($){UZ({name:$.name,command:$.command.join(" "),durationMs:$.durationMs,exitCode:$.exitCode,maxRSS:$.resourceUsage?.maxRSS,cpuUserUs:k6($.resourceUsage?.cpuTime?.user),cpuSystemUs:k6($.resourceUsage?.cpuTime?.system)})}function TZ($,_){if(!$.endsWith(".ts"))return _;if(_.includes(LW))return _;return`${VW}${_}`}async function AZ($,_){let W=p($,"..");await OZ(W,{recursive:!0});let Q=p(W,`.${XZ()}.tmp`);await Bun.write(Q,_),await JZ(Q,$)}async function a($,_){let W=TZ($,_);try{let Q=await YZ($),U=ZZ.byteLength(W,"utf8");if(Q.mtimeMs>0&&Q.size===U){let X=await Bun.file($).text();if(Bun.hash(X)===Bun.hash(W))return D("write.skipped"),!1}}catch{}return await AZ($,W),D("write.changed"),!0}async function q1($,_){let W=_.length>0?_.map((Q)=>`export * from '${Q}';`).join(`
|
|
15
|
+
`):"export {};";return a(p($,"index.ts"),`${W}
|
|
16
|
+
`)}async function w$($){try{return await GZ($),!0}catch{return!1}}async function HZ($){let _=[],W=p($,"http","index.ts"),Q=p($,"nats","index.ts");if(await w$(W))_.push("export * as HttpSchemas from './http';");if(await w$(Q))_.push("export * as NatsSchemas from './nats';");if(_.length===0)return!1;return a(p($,"index.ts"),`${_.join(`
|
|
17
|
+
`)}
|
|
18
|
+
`)}async function CZ($){let _=p($,zW),W=p(_,"runtime.ts"),Q=p(_,"http","index.ts"),U=p(_,"nats","index.ts"),Z=[];if(await w$(Q))Z.push("export * as HttpSchemas from './http';");if(await w$(U))Z.push("export * as NatsSchemas from './nats';");if(await w$(W))Z.push("export * from './runtime';");if(Z.length===0)return!1;return a(p(_,"index.ts"),`${Z.join(`
|
|
19
|
+
`)}
|
|
20
|
+
`)}function zZ($,_){let W=$.replace(/[^A-Za-z0-9_$]/g,"_");if(W.length===0)W="_module";if(/^[0-9]/.test(W))W=`_${W}`;let Q=W,U=2;while(_.has(Q))Q=`${W}_${U}`,U+=1;return _.add(Q),Q}async function LZ($){return RW($)}async function VZ($){return await w$(p($,"http","index.ts"))||await w$(p($,"nats","index.ts"))}async function RW($){if(!await w$($))return!1;if(await VZ($))return!1;let W=(await MZ($,{withFileTypes:!0})).filter((X)=>X.isDirectory()&&!X.name.startsWith(".")).map((X)=>X.name).sort((X,G)=>X.localeCompare(G)),Q=new Set,U=[],Z=!1;for(let X of W){let G=p($,X);Z=await RW(G)||Z;let O=p(G,"index.ts");if(!await w$(O))continue;let M=zZ(X,Q);U.push(`export * as ${M} from './${X}';`)}if(U.length===0)return Z;return await a(p($,"index.ts"),`${U.join(`
|
|
21
|
+
`)}
|
|
22
|
+
`)||Z}function SW(){return Bun.which(w6)??W8(process.cwd(),"node_modules",".bin",w6)}function L8($,_){return $.length>0?$:`biome format failed with code ${_}`}function RZ($){return $.includes("No files were processed")&&$.includes("provided but ignored")}function SZ($,_,W){return[`Could not format generated TypeScript for ${W}.`,L8($,_)].join(`
|
|
23
|
+
`)}async function V8($,_="file.ts"){let W=[SW(),"format","--stdin-file-path","file.ts"],Q=performance.now(),U=Bun.spawn(W,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",env:{...process.env}}),Z=await U.exited,X=U.resourceUsage(),G=(await new Response(U.stderr).text()).trim();if(z8({name:"biome.formatFile",command:W,durationMs:performance.now()-Q,exitCode:Z,resourceUsage:X}),D("format.fileSubprocesses"),Z!==0)throw Error(SZ(G,Z,_));let O=await new Response(U.stdout).text();if(O.length===0)throw Error("biome format returned empty stdout");return O}async function qW($,_,W){let Q=[SW(),"format","--write",..._,$],U=performance.now(),Z=Bun.spawn(Q,{cwd:process.cwd(),stdout:"pipe",stderr:"pipe",env:{...process.env}}),X=await Z.exited,G=Z.resourceUsage(),O=(await new Response(Z.stdout).text()).trim(),M=(await new Response(Z.stderr).text()).trim(),J=[O,M].filter(Boolean).join(`
|
|
24
|
+
`).trim();return z8({name:W,command:Q,durationMs:performance.now()-U,exitCode:X,resourceUsage:G}),D("format.directorySubprocesses"),{details:J,exitCode:X}}async function qZ(){let $=await EZ(W8(BZ(),"kontract-biome-")),_=W8($,"biome.json");return await Bun.write(_,`${JSON.stringify(IW,null,2)}
|
|
25
|
+
`),{configPath:_,cleanup:()=>KZ($,{recursive:!0,force:!0})}}async function IZ($){let{configPath:_,cleanup:W}=await qZ();try{D("format.directoryConfigFallbacks");let{details:Q,exitCode:U}=await qW($,["--config-path",_],"biome.formatDirectoryIsolated");if(U!==0)return{success:!1,details:L8(Q,U)};return{success:!0,details:["Consumer Biome config ignored the generated directory; formatted with Kontract isolated config.",Q].filter((Z)=>Z.length>0).join(`
|
|
26
|
+
`)}}finally{await W()}}async function jZ($){let{details:_,exitCode:W}=await qW($,["--vcs-enabled=false"],"biome.formatDirectory");if(W!==0){if(RZ(_))return IZ($);return{success:!1,details:L8(_,W)}}return{success:!0,details:_.length>0?_:void 0}}function jW($){let _=K8(process.cwd(),$);if(_.length===0)return".";if(_.startsWith(".."))return $;return _.startsWith(".")?_:`./${_}`}function $2($,_){let W=K8($,_);return W.length===0||!W.startsWith("..")&&!wZ(W)}function fZ($){let _=c0($[0]??process.cwd()),W=$.map((Q)=>c0(Q));while(!W.every((Q)=>$2(_,Q))){let Q=FZ(_);if(Q===_)return _;_=Q}return _}function DZ($){let _=process.env[xU]?.trim();if(_)return c0(_);let W=c0(process.cwd()),Q=$.flatMap((Z)=>[Z.inputDir,Z.outputDir]),U=Q.every((Z)=>$2(W,Z))?W:fZ(Q);return E8(U,ZW)}function B1($){let _=$.replace(/[^A-Za-z0-9._-]/g,"_").replace(/^_+|_+$/g,"");return _.length>0?_:"unnamed"}function Q8($){return`${B1($)}.${iU}`}function _2($,_){return E8($,XW,"bundles",B1(_.sourceName),B1(_.targetName))}function FW($,_){return E8($,XW,"bundles",B1(_),dU)}function NZ($,_){let W=K8($,_).replace(/\\/g,"/").replace(/\.ts$/,"");return W.startsWith(".")?W:`./${W}`}function S8($){return $ instanceof Error&&"code"in $&&$.code==="ENOENT"}function fW($){let _=new Bun.CryptoHasher("sha256");return _.update($),`${cZ}${_.digest("hex")}`}function DW($){return fW($)}function n0($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return`[${$.map((Q)=>n0(Q)).join(",")}]`;return`{${Object.entries($).sort(([Q],[U])=>Q.localeCompare(U)).map(([Q,U])=>`${JSON.stringify(Q)}:${n0(U)}`).join(",")}}`}async function NW($){try{let _=await PZ($);return _.isFile()?{size:_.size}:null}catch(_){if(!S8(_))throw _;return null}}async function q8($,_){let W=c$($),Q=await NW(W);if(!Q)throw Error(`Cannot hash missing file '${W}'`);let U=await Bun.file(W).bytes();return{path:bZ(_,W).replace(/\\/g,"/"),hash:fW(U),size:Q.size}}function I8($){return DW(n0($))}async function yW($){let _;try{_=await kZ($,{withFileTypes:!0})}catch(Q){if(S8(Q))return[];throw Q}let W=[];for(let Q of _){if(Q.name.startsWith("."))continue;let U=wW($,Q.name);if(Q.isDirectory()){W.push(...await yW(U));continue}if(Q.isFile()&&Q.name.endsWith(".ts"))W.push(U)}return W.sort((Q,U)=>Q.localeCompare(U))}function gZ($){let _=$.map((Z)=>c$(Z)),[W]=_;if(!W)return process.cwd();let Q=W.split(/[\\/]+/),U=Q.length;for(let Z of _.slice(1)){let X=Z.split(/[\\/]+/);U=Math.min(U,X.length);for(let G=0;G<U;G+=1){if(X[G]===Q[G])continue;U=G;break}}return Q.slice(0,Math.max(U,1)).join("/")||"/"}async function vZ($){let _=[];for(let W of $)if(await NW(W))_.push(c$(W));return[...new Set(_)].sort((W,Q)=>W.localeCompare(Q))}function xZ($){let _=[],W=null;while(!0){if(W=dW.exec($),!W)break;let Q=W[1];if(!Q||Q.startsWith("#"))continue;_.push(Q.split("#")[0]??Q)}return _}function uZ($){return/\$ref\s*:\s*$/m.test($)||/\$ref\s*:\s*[|>]/.test($)}async function kW($,_,W){let Q=c$($);if(_.has(Q))return[];_.add(Q);let U=await Bun.file(Q).text();if(uZ(U))W.unsafe=!0;let Z=[Q];for(let X of xZ(U)){if(/^[a-z][a-z0-9+.-]*:/i.test(X)){W.unsafe=!0;continue}Z.push(...await kW(c$(R8(Q),X),_,W))}return Z}async function PW(){if(n1)return n1;try{let $=await Bun.file(lW).json();n1=typeof $.version==="string"?$.version:D6}catch{n1=D6}return n1}async function bW($){return $$("manifest.sourceHash",async()=>{let _={unsafe:!1},W=[],Q=new Set;for(let G of $)W.push(...await kW(G,Q,_));let U=await vZ(W),Z=R8(c$($[0]??process.cwd())),X=await Promise.all(U.map((G)=>q8(G,Z)));return{files:X.sort((G,O)=>G.path.localeCompare(O.path)),hash:I8(X),safe:!_.unsafe}})}async function gW($,_=[]){return $$("manifest.outputHash",async()=>{let W=[$,..._].map((M)=>c$(M)),[Q]=W,U=W.length===1&&Q?Q:gZ(W),Z=await Promise.all(W.map((M)=>yW(M))),X=[...new Set(Z.flat())].sort((M,J)=>M.localeCompare(J)),O=(await Promise.all(X.map((M)=>q8(M,U)))).sort((M,J)=>M.path.localeCompare(J.path));return{files:O,hash:I8(O)}})}function vW($){return DW(n0({channel:$.channel,generator:$.generator,serviceName:$.serviceName,sourceName:$.sourceName,targetName:$.targetName}))}async function xW(){if(k0)return k0;let $=[];for(let Q of cW){let U=new Bun.Glob(Q);for await(let Z of U.scan({cwd:process.cwd()}))$.push(c$(process.cwd(),Z))}let _=[...new Set($)].sort((Q,U)=>Q.localeCompare(U)),W=await Promise.all(_.map((Q)=>q8(Q,process.cwd())));return k0=I8(W.sort((Q,U)=>Q.path.localeCompare(U.path))),k0}function uW($,_,W){let Q=W.split("/").map((U)=>B1(U));return wW($,uU,_,...Q,"manifest.json")}function hZ($){if(typeof $!=="object"||$===null)return!1;let _=$;return _.version===GW&&typeof _.sourceDependencyHash==="string"&&typeof _.outputTreeHash==="string"&&typeof _.generatorConfigHash==="string"&&typeof _.generatorImplementationHash==="string"}async function dZ($){try{return await Bun.file($).text()}catch(_){if(S8(_))return null;throw _}}async function hW($){if(D("manifest.checks"),!$.source.safe)return D("manifest.unsafeSource"),{skipped:!1,reason:"unsafe-source-dependencies",source:$.source};let _=await dZ($.manifestPath);if(!_)return{skipped:!1,reason:"missing-manifest",source:$.source};let W;try{W=JSON.parse(_)}catch{return{skipped:!1,reason:"invalid-manifest-json",source:$.source}}if(!hZ(W))return{skipped:!1,reason:"invalid-manifest-shape",source:$.source};let[Q,U,Z]=await Promise.all([PW(),xW(),gW($.outputDir,$.additionalOutputDirs)]),X=vW($);if(!(W.packageVersion===Q&&W.bunVersion===Bun.version&&W.sourceDependencyHash===$.source.hash&&W.outputTreeHash===Z.hash&&W.generatorConfigHash===X&&W.generatorImplementationHash===U))return{skipped:!1,reason:"manifest-hash-mismatch",source:$.source};return D("manifest.skips"),{skipped:!0,reason:"manifest-hit",source:$.source}}async function lZ($){if(!$.source.safe)return;let[_,W,Q]=await Promise.all([PW(),xW(),gW($.outputDir,$.additionalOutputDirs)]),U={version:GW,packageVersion:_,bunVersion:Bun.version,sourceName:$.sourceName,targetName:$.targetName,serviceName:$.serviceName,channel:$.channel,generatorConfigHash:vW($),generatorImplementationHash:W,sourceDependencyHash:$.source.hash,outputTreeHash:Q.hash,sourceFiles:$.source.files,outputFiles:Q.files,generatedAt:new Date().toISOString()};await yZ(R8($.manifestPath),{recursive:!0}),await Bun.write($.manifestPath,`${JSON.stringify(U,null,2)}
|
|
27
|
+
`),D("manifest.writes")}async function iZ($){let _=m0($);while(!0){let W=mW(_,"package.json");try{return await mZ(W),W}catch{}let Q=n$(_);if(Q===_)return null;_=Q}}async function rZ($){let _=[$.outputDir,$.inputDir,$.cwd];for(let W of _){let Q=await iZ(W);if(Q)return{target:await iW(Q),workspaceRoot:await WX(n$(Q))}}return null}async function iW($){let _=await pZ($,"utf8");return{path:$,shape:tZ(JSON.parse(_),$)}}function rW($){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 p0($){if(!$||typeof $!=="object"||Array.isArray($))return!1;return!0}function sZ($){if(!p0($))return!1;return Object.values($).every((_)=>typeof _==="string")}function t2($,_,W){let Q=$[_];if(Q===void 0)return;if(sZ(Q))return Q;throw Error(`${W}.${_} must be an object with string version ranges`)}function oZ($,_){let W=$.workspaces;if(W===void 0)return;if(Array.isArray(W)&&W.every((Q)=>typeof Q==="string"))return W;if(p0(W)&&W.packages===void 0)return{};if(p0(W)&&Array.isArray(W.packages)&&W.packages.every((Q)=>typeof Q==="string"))return{packages:W.packages};throw Error(`${_}.workspaces must be an array of strings or packages object`)}function tZ($,_){if(!p0($))throw Error(`${_} must contain a JSON object`);return{name:typeof $.name==="string"?$.name:void 0,dependencies:t2($,"dependencies",_),devDependencies:t2($,"devDependencies",_),peerDependencies:t2($,"peerDependencies",_),workspaces:oZ($,_)}}function G1($,_){let W=pW(_,$);if(!W||W.startsWith(".."))return $;return W.startsWith(".")?W:`./${W}`}function aZ($,_){let W=G1(n$($),_);return W==="./"?".":W}function eZ($,_,W){let Q=[...W].sort(),U=n$($),Z=m0(_);if(m0(U)===Z)return`bun add ${Q.join(" ")}`;return`cd ${aZ($,_)} && bun add ${Q.join(" ")}`}function sW($){if(Array.isArray($))return $;return $?.packages??[]}function $X($,_){if($===_)return!0;if($.endsWith("/*"))return n$(_)===$.slice(0,-2);return!1}function _X($,_){if(!$||$.path===_)return!1;let W=pW(n$($.path),n$(_));if(!W||W.startsWith(".."))return!1;return sW($.shape.workspaces).some((Q)=>$X(Q,W))}async function WX($){let _=m0($);while(!0){let W=mW(_,"package.json");try{let U=await iW(W);if(sW(U.shape.workspaces).length>0)return U}catch{}let Q=n$(_);if(Q===_)return;_=Q}}function QX($){let _=new Set;for(let W of $){if(W.type===S.TypeScriptNestJs)_.add("nestjs-zod"),_.add("zod");if(W.type===S.AsyncApiNats)_.add("rxjs"),_.add("zod");if(W.type===S.TypeScriptAxios)_.add("axios");if(W.type===S.TypeScriptAngular)_.add("@angular/common"),_.add("@angular/core"),_.add("rxjs")}return _}function UX($){return $.some((_)=>_.type===S.TypeScriptNestJs)}function ZX($){let _=$.match(/(\d+)\.(\d+)\.(\d+)/);if(!_)return!0;let W=Number(_[1]),Q=Number(_[2]);if(W>=4)return!0;if(W!==3||Q!==25)return!1;return Number(_[3])>=76}function XX($,_,W){if(!W)return[];let Q=rW(W.shape);return $.filter((U)=>!_.dependencies.has(U)&&(Q.dependencies.has(U)||Q.devDependencies.has(U)||Q.peerDependencies.has(U)))}function GX($,_,W,Q){if(!W||!_X(W,$))return[];let U=[`Checked package: ${G1($,_.cwd)}`,`Generated output: ${G1(_.outputDir,_.cwd)}`,`Workspace root: ${G1(W.path,_.cwd)}`];if(Q.length>0)U.push(`Root declares ${[...Q].sort().join(", ")}, but generated code belongs to this workspace package.`);return U}async function OX($,_){try{let W=await rZ($);if(W)return{ok:!0,resolution:W}}catch(W){return{ok:!1,warnings:[{title:"Cannot parse package.json for dependency checks.",details:W instanceof Error?W.message:String(W)}]}}return{ok:!1,warnings:[{title:"Cannot verify generated contract runtime dependencies (package.json not found).",details:`Expected runtime deps: ${[..._].sort().join(", ")}`}]}}function MX($,_){let W=[],Q=[];for(let U of $){if(_.dependencies.has(U))continue;if(_.devDependencies.has(U)||_.peerDependencies.has(U)){Q.push(U);continue}W.push(U)}return{missing:W,wrongScope:Q}}function JX($,_,W,Q){if(Q.length===0)return;let U=_.target.path,Z=XX(Q,W,_.workspaceRoot),X=GX(U,$,_.workspaceRoot,Z);return{title:`Missing runtime deps for generated contracts in ${G1(U,$.cwd)}.`,details:[`Missing: ${[...Q].sort().join(", ")}`,...X,`Install: ${eZ(U,$.cwd,Q)}`].join(`
|
|
28
|
+
`)}}function YX($,_,W){if(W.length===0)return;return{title:`Generated contract deps should be in dependencies in ${G1(_,$)}.`,details:`Move to dependencies: ${[...W].sort().join(", ")}`}}function TX($,_,W){let Q=W.dependencyVersions.get("zod");if(!UX($.generators)||!W.dependencies.has("zod")||typeof Q!=="string"||ZX(Q))return;return{title:`Generated OpenAPI Zod schemas require a zod/v4-compatible zod version in ${G1(_,$.cwd)}.`,details:`Detected zod: ${Q}
|
|
29
|
+
Use zod >=3.25.76 or >=4.0.0, or disable generator.zod for this target.`}}function AX($,_,W){let Q=_.target.path,U=rW(_.target.shape),{missing:Z,wrongScope:X}=MX(W,U);return[JX($,_,U,Z),YX($.cwd,Q,X),TX($,Q,U)].filter((G)=>G!==void 0)}async function HX($){let _=QX($.generators);if(_.size===0)return[];let W=await OX($,_);if(!W.ok)return W.warnings;return AX($,W.resolution,_)}function zX($,_){let W=_.split(`
|
|
30
|
+
`).map((Z)=>Z.trim()).filter((Z)=>Z.length>0),[Q="Unexpected error",...U]=W;return{title:`\u274C ${$}: ${Q}`,details:U.length>0?U.join(`
|
|
31
|
+
`):void 0}}function LX($,_){return{printStep:(X)=>{if($)return;if(_){_.log.step(X,U$("step"));return}V1.step(X)},printInfo:(X)=>{if($)return;if(_){_.log.info(X,U$("info"));return}V1.info(X)},printWarning:(X,G)=>{if($)return;if(_){if(_.log.warn(X,U$("warn")),G)_.note(G,"Details",P$("dim"));return}if(V1.warn(X),G)V1.warn(G)},printFailure:(X)=>{if(!$&&_){if(_.log.error(X.title,{...U$("error"),symbol:"\u274C"}),X.details)_.note(X.details,"Details",P$("dim"));return}if(V1.error(X.title),X.details)V1.error(X.details)}}}function SX($){return $.includes("Failed to link")&&$.includes("EEXIST")}function qX($){return new Promise((_)=>{setTimeout(_,$)})}async function IX($){let _=U8,W=()=>{};U8=new Promise((Q)=>{W=Q}),await _;try{return await $()}finally{W()}}async function jX($,_){let W=performance.now(),Q=Bun.spawn($,{stdout:"pipe",stderr:"pipe",env:{...process.env}}),U=await Q.exited,Z=Q.resourceUsage(),X=await new Response(Q.stdout).text(),G=await new Response(Q.stderr).text();return z8({name:_,command:$,durationMs:performance.now()-W,exitCode:U,resourceUsage:Z}),D("bundle.subprocesses"),{exitCode:U,stdout:X,stderr:G}}async function FX($,_){let W=$.indexOf("--output");if(W===-1||W+1>=$.length)return{success:!1,error:Error("Bundle args must include '--output <path>'")};let Q=$[W+1];if(!Q)return{success:!1,error:Error("Bundle output path is missing")};return oW(Q,_)}async function oW($,_){if(!(await Bun.file($).text()).includes(_))return{success:!1,error:Error(`Bundle output missing '${_}' marker`)};return{success:!0,outputPath:$}}function wX(){return b6??=BX(),b6}function fX(){return process.env[sU]!=="1"}function DX($){if($ instanceof Error)return $;return Error(String($))}function NX($){return $.map((_)=>`${_.severity}: ${_.message}`).join(`
|
|
32
|
+
`).trim()}async function yX($,_){try{let W=await KX({ref:$,config:await wX()}),Q=W.problems.filter((Z)=>Z.severity==="error");if(Q.length>0)return{success:!1,error:Error(`OpenAPI bundle failed:
|
|
33
|
+
${NX(Q)}`)};let U=W.bundle.parsed;if(U===void 0)return{success:!1,error:Error("OpenAPI bundle produced an empty document")};if(await Bun.write(_,RX(U)),D("bundle.inProcess"),W.problems.length>Q.length)D("bundle.warnings",W.problems.length-Q.length);return oW(_,HW)}catch(W){return{success:!1,error:DX(W)}}}function kX($,_,W){let Q=[_,W].filter((U)=>U.trim().length>0).join(`
|
|
34
|
+
`).trim();return{success:!1,error:Error(`Bundle failed (exit ${$}): ${Q}`)}}async function tW($,_,W){let Q=$[0]==="bunx";for(let U=0;U<=P6;U+=1){let Z=()=>jX($,W),{exitCode:X,stdout:G,stderr:O}=Q?await IX(Z):await Z();if(X===0)return FX($,_);if(!(Q&&SX(O))||U>=P6)return kX(X,G,O);await qX(gX*(U+1))}return{success:!1,error:Error("Bundle failed unexpectedly")}}async function PX($,_){let W=Bun.which("redocly");if(W)return[W,"bundle",$,"--output",_];let Q=EX(process.cwd(),"node_modules",".bin","redocly");if(await Bun.file(Q).exists())return[Q,"bundle",$,"--output",_];return["bunx",rU,"bundle",$,"--output",_]}async function aW($,_){if($.length!==1)return{success:!1,error:Error("OpenAPI bundling expects a single root spec file")};let W=$[0];if(!W)return{success:!1,error:Error("OpenAPI root spec file is missing")};if(fX())return yX(W,_);return tW(await PX(W,_),HW,"bundle.openapi")}async function bX($,_){return tW(["bunx","@asyncapi/cli","bundle",...$,"--output",_],aU,"bundle.asyncapi")}async function $5($,_){let W=[],Q=new Bun.Glob(_);for await(let U of Q.scan({cwd:$}))W.push(uX($,U));return W.sort()}function hX($,_){let Q=eW($,_).split("/"),U=xX(_);if(!/\.openapi\.ya?ml$/.test(U))return null;if(Q.length===1)return{name:U.replace(/\.openapi\.ya?ml$/,""),rootFile:_};let Z=Q.map((J)=>J.replace(/\.openapi\.ya?ml$/,"")),X=Z.at(-1),G=Z.at(-2);if(!X)return null;let M=(X===G?Z.slice(0,-1):Z).filter(Boolean).join("/");return M.length>0?{name:M,rootFile:_}:null}function dX($,_){let W=new Map;for(let Q of _){let U=hX($,Q);if(!U)continue;let Z=W.get(U.name);if(Z)throw Error(`Multiple OpenAPI roots found for service '${U.name}': ${Z} and ${U.rootFile}`);W.set(U.name,U.rootFile)}return[...W.entries()].map(([Q,U])=>({name:Q,rootFile:U})).sort((Q,U)=>Q.name.localeCompare(U.name))}function lX($,_){let W=new Map;for(let Q of _){let Z=eW($,Q).split("/"),X=Z[0];if(!X)continue;let G=Z.length===1?X.replace(/\.asyncapi\.ya?ml$/,""):X,O=W.get(G)??[];W.set(G,[...O,Q])}return[...W.entries()].map(([Q,U])=>({name:Q,files:U.sort()})).sort((Q,U)=>Q.name.localeCompare(U.name))}async function _5($){return dX($,await $5($,mU))}async function W5($){return lX($,await $5($,pU))}function _$($){let _=D$($);return _.endsWith("Message")?_:`${_}Message`}function Q2($){let _=D$($);return`${_.endsWith("Message")?_.slice(0,-7):_}MessageInput`}function I1($){return aX($)}function Y1($){let _=D$($);return _.endsWith("Dto")?_:`${_}Dto`}function X5($){let _=D$($);return _.endsWith("Schema")?_:`${_}Schema`}function j8($){return`${W2($)}.dto.ts`}function m$($){return D$($)}function U2($){return`${W2($)}.ts`}function G5($){return`${W2($)}.contract.ts`}function F8($){return`${W2($)}.enum.ts`}function r1($){return`${D$($)}Values`}function Z2($){return`${D$($)}Map`}function O5($){return D$(String($))}function eX($){return D$($)}function s1($){return tX($)}function _G($){return $.trim().replace(/\.+$/,"")}function WG($){return $.trim().replace(/^\.+/,"")}function QG($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function UG($){let _=$?.trim();if(!_)throw Error("AsyncAPI channel address is required");return _}function N$($,_){if(!$)return"";if(!_||_.trim().length===0)return $;let W=_G(_),Q=WG($);if(!W)return Q;if(!Q)return W;if(Q===W)return Q;if(Q.startsWith(`${W}.`))return Q;return`${W}.${Q}`}function w8($,_,W,Q){let U=N$(UG($),Q),Z=U.match(/\{(.*?)\}/g);if(!Z)return U;return Z.reduce((X,G)=>{let O=G.slice(1,-1),M=QG(W?.properties)?W.properties:{};if(!Object.hasOwn(M,O))throw Error(`Param '${O}' not found in message schema for address '${U}'`);return X.replace(G,`\${${_}.${O}}`)},U)}function ZG($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function f8($,_){if(ZG($))return $;throw Error(`${_} metadata must be a JSON object`)}function M5($,_){if($===void 0||$===null)return;return f8($,_)}function g6($,_){let W=$[_];if(typeof W!=="string")return;let Q=W.trim();return Q.length>0?Q:void 0}function E$($){return $.split(`
|
|
35
|
+
`).map((_)=>_.trim()).filter((_)=>_.length>0)}function XG($){return $.replaceAll("*/","*\\/")}function J$($){let _=$.map((Q)=>Q.trim()).filter((Q)=>Q.length>0);if(_.length===0)return"";return["/**",_.map((Q)=>` * ${XG(Q)}`).join(`
|
|
36
|
+
`)," */"].join(`
|
|
37
|
+
`)}function o1($,_=2){if(!$)return"";let W=" ".repeat(_);return $.split(`
|
|
38
|
+
`).map((Q)=>`${W}${Q}`).join(`
|
|
39
|
+
`)}function J5($){return $.replace(/\{[^}]+\}/g,"*")}function i$($){let _=$.channels().all();if(_.length!==1)throw Error(`Operation '${$.id()}' must have exactly one channel`);let W=$.messages().all();if(W.length!==1)throw Error(`Operation '${$.id()}' must have exactly one message`);let Q=_[0],U=W[0];if(!Q||!U)throw Error(`Operation '${$.id()}' channel/message metadata is incomplete`);let Z=$.reply(),X=Z?.messages()??Z?.channel()?.messages(),G=X&&X.length>0?X[0]:null,O=$.id();if(!O)throw Error("Operation has no id");let M=Q.address();if(!M||M.trim().length===0)throw Error(`Operation '${O}' channel address is required`);let J=U.id();if(!J)throw Error(`Message in operation '${O}' has no id`);let T=f8($.json(),`Operation '${O}'`),Y=g6(T,"summary")??null,A=g6(T,"description")??null;return{operationId:O,address:M,msgId:J,payloadSchema:M5(U.payload()?.json(),`Message '${J}' payload`),replyMsgId:G?.id()??null,summary:Y,description:A}}function GG($,_){let W=new Map;for(let Q of $.operations().all()){let{address:U,msgId:Z,replyMsgId:X}=i$(Q),G=N$(U,_),O=_$(Z),M=Q.isSend()?"void":X?_$(X):"CommandReturnType",J=W.get(G);if(!J){W.set(G,{address:G,requestType:O,responseType:M});continue}let T=J.requestType===O?J.requestType:`${J.requestType} | ${O}`,Y=J.responseType===M?J.responseType:`${J.responseType} | ${M}`;W.set(G,{address:G,requestType:T,responseType:Y})}return W}function OG($){return $.replaceAll("'","\\'")}function v6($){if(typeof $!=="string")return null;let _=$.trim().toLowerCase();if(_==="command"||_==="cmd")return W$.Command;if(_==="query"||_==="qry")return W$.Query;if(_==="event"||_==="evt")return W$.Event;return null}function MG($){let _=$.trim().toLowerCase();if(_.includes(".cmd.")||_.includes(".command."))return W$.Command;if(_.includes(".qry.")||_.includes(".query."))return W$.Query;if(_.includes(".evt.")||_.includes(".event."))return W$.Event;return null}function X2($,_){let{operationId:W,address:Q}=i$($),U=N$(Q,_),Z=f8($.json(),`Operation '${W}'`),G=$.channels().all()[0],O=M5(G?.json(),`Operation '${W}' channel`),M=v6(Z["x-sumr-intent"])??v6(O?.["x-sumr-intent"]);if(M)return M;let J=MG(U);if(J)return J;if($.isSend())return W$.Event;if($.isReceive()&&$.reply())return W$.Query;if($.isReceive())return W$.Command;throw Error(`Cannot infer operation intent for '${W}'. Add x-sumr-intent or use an address segment like '.cmd.' or '.qry.'.`)}function JG($,_){let Q=$.operations().all().map((Z)=>{let{operationId:X,address:G}=i$(Z),O=N$(G,_);return{operationId:X,key:I1(X),address:O}}).map((Z)=>[` /** ${Z.operationId} */`,` ${Z.key}: '${Z.address}',`].join(`
|
|
40
|
+
`)).join(`
|
|
41
|
+
`);return`${J$(["NATS subjects for server handlers and client publish/send calls.","Named placeholders (for example {organizationId}) are preserved for client interpolation."])}
|
|
42
|
+
export const SUBJECTS = {
|
|
43
|
+
${Q}
|
|
44
|
+
} as const;`}function YG($,_){let W=GG($,_);if(W.size===0)return"";let Q=[...W.values()].map((Z)=>[` '${OG(Z.address)}': {`,` request: ${Z.requestType};`,` response: ${Z.responseType};`," };"].join(`
|
|
45
|
+
`)).join(`
|
|
46
|
+
`);return`${J$(["Route contracts used to strongly type client proxy send/emit calls."])}
|
|
47
|
+
export interface ClientRouteContracts {
|
|
48
|
+
${Q}
|
|
49
|
+
}`}function TG($,_){let W=$.operations().all().filter((Z)=>Z.isReceive()&&X2(Z,_)===W$.Command);if(W.length===0)return"";let Q=W.map((Z)=>{let{operationId:X,address:G,msgId:O,replyMsgId:M,summary:J,description:T}=i$(Z),Y=s1(X),A=N$(G,_),E=J5(A),V=M?_$(M):"CommandReturnType",z=[];if(J)z.push(...E$(J));if(T)z.push(...E$(T));z.push(`@subscribeRoute ${E}`),z.push(`@publishAddress ${A}`),z.push(`@param msg ${_$(O)}`),z.push(`@returns Promise<${V}>`);let j=J$(z);return[o1(j),` ${Y}(msg: ${_$(O)}, ctx: IMsgContext): Promise<${V}>;`].filter(Boolean).join(`
|
|
50
|
+
`)}).join(`
|
|
51
|
+
`);return`${J$(["Server contract for command handlers."])}
|
|
52
|
+
export interface ICommandServer {
|
|
53
|
+
${Q}
|
|
54
|
+
}`}function AG($,_){let W=$.operations().all().filter((Z)=>Z.isReceive()&&X2(Z,_)===W$.Query);if(W.length===0)return"";let Q=W.map((Z)=>{let{operationId:X,address:G,msgId:O,replyMsgId:M,summary:J,description:T}=i$(Z),Y=s1(X),A=N$(G,_),E=J5(A),V=M?_$(M):"unknown",z=[];if(J)z.push(...E$(J));if(T)z.push(...E$(T));z.push(`@subscribeRoute ${E}`),z.push(`@publishAddress ${A}`),z.push(`@param msg ${_$(O)}`),z.push(`@returns Promise<${V}>`);let j=J$(z);return[o1(j),` ${Y}(msg: ${_$(O)}, ctx: IMsgContext): Promise<${V}>;`].filter(Boolean).join(`
|
|
55
|
+
`)}).join(`
|
|
56
|
+
`);return`${J$(["Server contract for query handlers (receive operations with reply)."])}
|
|
57
|
+
export interface IQueryServer {
|
|
58
|
+
${Q}
|
|
59
|
+
}`}function HG($,_){let W=$.operations().all().filter((Z)=>Z.isReceive()&&X2(Z,_)===W$.Command);if(W.length===0)return"";let Q=W.map((Z)=>{let{operationId:X,address:G,msgId:O,payloadSchema:M,replyMsgId:J,summary:T,description:Y}=i$(Z),A=w8(G,"msg",M,_),E=Q2(O),V=_$(O),z=s1(X),j=I1(X),F=N$(G,_),x=F.includes("{"),w=x?`\`${A}\``:`SUBJECTS.${j}`,N=J?_$(J):"CommandReturnType",G$=x?`this.proxy.send<${N}, ${V}>(${w}, validated, ctx);`:`this.proxy.send(${w}, validated, ctx);`,c=[];if(T)c.push(...E$(T));if(Y)c.push(...E$(Y));c.push(`@publishAddress ${F}`),c.push(`@param msg ${E}`),c.push(`@returns Observable<${N}>`);let z1=J$(c);return[o1(z1),` ${z}(msg: ${E}, ctx?: IMsgContext): Observable<${N}> {`,` const validated = ${V}.parse(msg);`,` return ${G$}`," }"].filter(Boolean).join(`
|
|
60
|
+
`)}).join(`
|
|
61
|
+
|
|
62
|
+
`);return`${J$(["Client helper for command request/reply interactions."])}
|
|
63
|
+
export class CommandClient {
|
|
64
|
+
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
65
|
+
|
|
66
|
+
constructor(client: IRawClientProxy) {
|
|
67
|
+
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
${Q}
|
|
71
|
+
}`}function CG($,_){let W=$.operations().all().filter((Z)=>Z.isReceive()&&X2(Z,_)===W$.Query);if(W.length===0)return"";let Q=W.map((Z)=>{let{operationId:X,address:G,msgId:O,payloadSchema:M,replyMsgId:J,summary:T,description:Y}=i$(Z),A=w8(G,"msg",M,_),E=Q2(O),V=_$(O),z=s1(X),j=J?_$(J):"unknown",F=I1(X),x=N$(G,_),w=x.includes("{"),N=w?`\`${A}\``:`SUBJECTS.${F}`,G$=w?`this.proxy.send<${j}, ${V}>(${N}, validated, ctx);`:`this.proxy.send(${N}, validated, ctx);`,c=[];if(T)c.push(...E$(T));if(Y)c.push(...E$(Y));c.push(`@publishAddress ${x}`),c.push(`@param msg ${E}`),c.push(`@returns Observable<${j}>`);let z1=J$(c);return[o1(z1),` ${z}(msg: ${E}, ctx?: IMsgContext): Observable<${j}> {`,` const validated = ${V}.parse(msg);`,` return ${G$}`," }"].filter(Boolean).join(`
|
|
72
|
+
`)}).join(`
|
|
73
|
+
|
|
74
|
+
`);return`${J$(["Client helper for query request/reply interactions."])}
|
|
75
|
+
export class QueryClient {
|
|
76
|
+
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
77
|
+
|
|
78
|
+
constructor(client: IRawClientProxy) {
|
|
79
|
+
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
${Q}
|
|
83
|
+
}`}function zG($,_){let W=$.operations().all().filter((Z)=>Z.isSend());if(W.length===0)return"";let Q=W.map((Z)=>{let{operationId:X,address:G,msgId:O,payloadSchema:M,summary:J,description:T}=i$(Z),Y=w8(G,"msg",M,_),A=Q2(O),E=_$(O),V=s1(X),z=I1(X),j=N$(G,_),F=j.includes("{"),x=F?`\`${Y}\``:`SUBJECTS.${z}`,w=F?`this.proxy.emit<void, ${E}>(${x}, validated, ctx);`:`this.proxy.emit(${x}, validated, ctx);`,N=[];if(J)N.push(...E$(J));if(T)N.push(...E$(T));N.push(`@publishAddress ${j}`),N.push(`@param msg ${A}`),N.push("@returns Observable<void>");let G$=J$(N);return[o1(G$),` ${V}(msg: ${A}, ctx?: IMsgContext): Observable<void> {`,` const validated = ${E}.parse(msg);`,` return ${w}`," }"].filter(Boolean).join(`
|
|
84
|
+
`)}).join(`
|
|
85
|
+
|
|
86
|
+
`);return`${J$(["Client helper for fire-and-forget event publishing."])}
|
|
87
|
+
export class EventClient {
|
|
88
|
+
private readonly proxy: IClientProxy<ClientRouteContracts>;
|
|
89
|
+
|
|
90
|
+
constructor(client: IRawClientProxy) {
|
|
91
|
+
this.proxy = createRouteTypedClientProxy<ClientRouteContracts>(client);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
${Q}
|
|
95
|
+
}`}function EG($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function x6($,_){if(EG($))return $;throw Error(`${_} metadata must be a JSON object`)}function KG($,_){try{return VG(_,{module:"none"})}catch(W){let Q=W instanceof Error?W.message:String(W);throw Error(`Failed to convert AsyncAPI message '${$}' payload to Zod: ${Q}`)}}function a2($,_){let W=$[_];if(typeof W!=="string")return;let Q=W.trim();return Q.length>0?Q:void 0}function BG($){return $.replaceAll("*/","*\\/")}function RG($){let _=$.map((Q)=>Q.trim()).filter((Q)=>Q.length>0);if(_.length===0)return"";return["/**",_.map((Q)=>` * ${BG(Q)}`).join(`
|
|
96
|
+
`)," */"].join(`
|
|
97
|
+
`)}function SG($){let _=$.id();if(!_)throw Error("AsyncAPI message is missing an id");let W=$.payload();if(!W)throw Error(`AsyncAPI message '${_}' is missing a payload schema`);let Q=x6(W.json(),`AsyncAPI message '${_}' payload`),U=KG(_,Q),Z=_$(_),X=Q2(_),G=x6($.json(),`AsyncAPI message '${_}'`),O=a2(G,"summary"),M=a2(G,"description")??a2(Q,"description");return[RG([...O?[O]:[],...M?[M]:[],`Runtime schema for ${Z}.`]),`export const ${Z} = ${U};`,`export type ${Z} = z.infer<typeof ${Z}>;`,`export type ${X} = z.input<typeof ${Z}>;`].filter(Boolean).join(`
|
|
98
|
+
`)}function qG($){return $.map((_)=>SG(_)).filter(Boolean).join(`
|
|
99
|
+
|
|
100
|
+
`)}async function u6($,_,W){return W?V8($,_):$}function v$($){return $.split(`
|
|
101
|
+
`).map((_)=>_?` ${_}`:"").join(`
|
|
102
|
+
`)}function wG($){return $.endsWith("Schema")?$:`${$}Schema`}function fG($){return $.message}async function DG($,_,W,Q){let U=$.replace(/\.asyncapi\.ya?ml$/,"").split("/").pop()??$;try{let Z=new jG,X=e2(_,"nats"),G=e2(X,eU),O=Q?.sharedTypesImportPath??"./shared",M=Q?.sharedTypesOutputFile??e2(X,$Z),J=Q?.formatFiles!==!1,T=await Bun.file($).text(),{document:Y,diagnostics:A}=await Z.parse(T);if(!Y){let G7=A.map(fG).join(", ");throw Error(`AsyncAPI parse failed: ${G7}`)}let E=eX(Y.info().title()),V=wG(E),z=`${I1(E)}_NATS_CLIENT`,j=Y.components().messages().all(),x=["import { z } from 'zod';","import { Observable } from 'rxjs';",`import { CommandReturnType, IClientProxy, IMsgContext, IRawClientProxy, createRouteTypedClientProxy } from '${O}';`,"",`export const ${z} = '${z}';`,"",`export namespace ${V} {`,v$(qG(j)),"",v$(JG(Y,Q?.addressPrefix)),"",v$(YG(Y,Q?.addressPrefix)),"",v$(TG(Y,Q?.addressPrefix)),"",v$(AG(Y,Q?.addressPrefix)),"",v$(HG(Y,Q?.addressPrefix)),"",v$(CG(Y,Q?.addressPrefix)),"",v$(zG(Y,Q?.addressPrefix)),"}"].join(`
|
|
103
|
+
`),w=await u6(x,G,J),N=await u6(Z5,M,J),G$=await a(G,w),c=await a(M,N),z1=G$||c;if(W&&z1)FG.step(` \u2713 ${G}`);return{success:!0,service:U,changed:z1}}catch(Z){return{success:!1,service:U,error:Z instanceof Error?Z:Error(String(Z))}}}function Z8($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function yG($,_){let W=0;for(let Q=_-1;Q>=0&&$[Q]==="\\";Q-=1)W+=1;return W%2===1}function kG($){let _="";for(let W=0;W<$.length;W+=1){let Q=$[W];if(Q==="/"&&!yG($,W))_+="\\/";else if(Q==="\r")_+="\\r";else if(Q===`
|
|
104
|
+
`)_+="\\n";else if(Q==="\u2028")_+="\\u2028";else if(Q==="\u2029")_+="\\u2029";else _+=Q}return`/${_}/`}function Y5($,_){return _?`${$}.describe(${Z8(_)})`:$}function PG($){let _=$.map((W)=>typeof W==="string"?Z8(W):`z.literal(${W})`);if($.every((W)=>typeof W==="string"))return`z.enum([${$.map((W)=>Z8(String(W))).join(", ")}])`;return`z.union([${_.join(", ")}])`}function bG($){if($.scalar==="boolean")return"z.boolean()";if($.scalar==="integer")return h6($,!0);if($.scalar==="number")return h6($,!1);let _="z.string()";if($.format==="uuid")_+=".uuid()";if($.format==="email")_+=".email()";if($.format==="uri"||$.format==="url")_+=".url()";if($.format==="date-time")_+=".datetime()";if($.minLength!==void 0)_+=`.min(${$.minLength})`;if($.maxLength!==void 0)_+=`.max(${$.maxLength})`;if($.pattern)_+=`.regex(${kG($.pattern)})`;return _}function h6($,_){let W=_?"z.number().int()":"z.number()";if($.minimum!==void 0)W+=`.min(${$.minimum})`;if($.maximum!==void 0)W+=`.max(${$.maximum})`;return W}function Z1($,_){if($.kind==="scalar")return bG($);if($.kind==="enum")return PG($.values);if($.kind==="array")return`z.array(${Z1($.items,_)})`;if($.kind==="unknown")return"z.unknown()";if($.kind==="object"){let Z=Object.entries($.properties);if(Z.length===0&&$.additionalProperties)return`z.record(z.string(), ${Z1($.additionalProperties,_)})`;if(Z.length===0)return"z.record(z.string(), z.unknown())";let G=`z.object({
|
|
105
|
+
${Z.map(([O,M])=>{let J=Y5(Z1(M,_),M.description);if(!$.required.includes(O))J+=".optional()";return` ${O}: ${J},`}).join(`
|
|
106
|
+
`)}
|
|
107
|
+
})`;return $.additionalProperties?`${G}.catchall(${Z1($.additionalProperties,_)})`:G}let W=X5($.refName),Q=`./${G5($.refName).replace(/\.ts$/,"")}`,U=_.get(Q)??new Set;return U.add(W),_.set(Q,U),W}function gG($,_){let W=Z1($.schema,_);if($.nullable)W+=".nullable()";if($.optional)W+=".optional()";return W=Y5(W,$.description??$.schema.description),` ${$.name}: ${W},`}function vG($){let _=new Map,W=X5($.schemaName),Q=Y1($.schemaName),U=m$($.schemaName),Z=$.properties.length>0?`z.object({
|
|
108
|
+
${$.properties.map((M)=>gG(M,_)).join(`
|
|
109
|
+
`)}
|
|
110
|
+
})`:null,X=$.schema?.kind==="object"?$.schema.additionalProperties:void 0,G=Z?X?`${Z}.catchall(${Z1(X,_)})`:Z:Z1($.schema??{kind:"object",properties:{},required:[]},_),O=["import { createZodDto } from 'nestjs-zod';","import { z } from 'zod';"];for(let[M,J]of[..._.entries()].sort((T,Y)=>T[0].localeCompare(Y[0])))O.push(`import { ${[...J].sort().join(", ")} } from '${M}';`);return[O.join(`
|
|
111
|
+
`),"",`export const ${W} = ${G};`,"",`export class ${Q} extends createZodDto(${W}) {}`,`export type ${U} = z.infer<typeof ${W}>;`,""].join(`
|
|
112
|
+
`)}function G2($){return`'${$.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}'`}function l$($,_){let W=[];if($.optional)_.validatorImports.add("IsOptional"),W.push("@IsOptional()");else if($.nullable)_.validatorImports.add("ValidateIf"),W.push("@ValidateIf((_, value) => value !== null)");return W}function uG($,_,W,Q){if($==="uuid")Q.validatorImports.add("IsUUID"),W.push("@IsUUID()");else if($==="email")Q.validatorImports.add("IsEmail"),W.push("@IsEmail()");else if($==="uri"||$==="url")Q.validatorImports.add("IsUrl"),W.push("@IsUrl()");else if($==="date"||$==="date-time")Q.validatorImports.add("IsDateString"),W.push("@IsDateString()");if(typeof _.minLength==="number")Q.validatorImports.add("MinLength"),W.push(`@MinLength(${_.minLength})`);if(typeof _.maxLength==="number")Q.validatorImports.add("MaxLength"),W.push(`@MaxLength(${_.maxLength})`);if(typeof _.pattern==="string")Q.validatorImports.add("Matches"),W.push(`@Matches(new RegExp(${G2(_.pattern)}))`)}function D8($,_,W,Q={}){let U=Q.each?", { each: true }":"";if(typeof $.minimum==="number")W.validatorImports.add("Min"),_.push(`@Min(${$.minimum}${U})`);if(typeof $.maximum==="number")W.validatorImports.add("Max"),_.push(`@Max(${$.maximum}${U})`);let Z=$.exclusiveMinimum,X=typeof $.minimum==="number"?$.minimum:void 0,G=Z===!0&&(X??0)>=0,O=typeof Z==="number"&&Z>=0;if(G||O)W.validatorImports.add("IsPositive"),_.push(`@IsPositive(${Q.each?"{ each: true }":""})`)}function hG($,_,W){W.validatorImports.add("IsString"),_.push("@IsString()");let Q=typeof $.format==="string"?$.format:void 0;uG(Q,$,_,W)}function dG($,_,W,Q){if($)Q.transformerImports.add("Type"),W.push("@Type(() => Number)");Q.validatorImports.add("IsNumber"),W.push("@IsNumber()"),D8(_,W,Q)}function lG($,_,W,Q){if($)Q.transformerImports.add("Type"),W.push("@Type(() => Number)");Q.validatorImports.add("IsInt"),W.push("@IsInt()"),D8(_,W,Q)}function cG($,_,W){if($)W.transformerImports.add("Transform"),_.push("@Transform(({ value }) => value === 'true' ? true : value === 'false' ? false : value)");W.validatorImports.add("IsBoolean"),_.push("@IsBoolean()")}function nG($,_,W,Q){let U=l$($,Q),Z=$.source==="path"||$.source==="query";if(_==="string")return hG(W,U,Q),U;if(_==="number")return dG(Z,W,U,Q),U;if(_==="integer")return lG(Z,W,U,Q),U;return cG(Z,U,Q),U}function mG($,_,W,Q){let U=[];if(_.format)U.push(`format: '${_.format}'`);if(_.minLength!==void 0)U.push(`minLength: ${_.minLength}`);if(_.maxLength!==void 0)U.push(`maxLength: ${_.maxLength}`);if(_.minimum!==void 0)U.push(`minimum: ${_.minimum}`);if(_.maximum!==void 0)U.push(`maximum: ${_.maximum}`);if(_.pattern)U.push(`pattern: ${G2(_.pattern)}`);if($.nullable)U.push("nullable: true");let Z=nG($,_.scalar,{format:_.format,minLength:_.minLength,maxLength:_.maxLength,minimum:_.minimum,maximum:_.maximum,exclusiveMinimum:_.exclusiveMinimum,exclusiveMaximum:_.exclusiveMaximum,pattern:_.pattern},W);return Q(W,$,U,Z,$.optional),{typeName:_.scalar==="integer"?"number":_.scalar,decorators:Z}}function pG($,_,W){if($.format==="uuid"){W.validatorImports.add("IsUUID"),_.push("@IsUUID('4', { each: true })");return}if($.format==="email"){W.validatorImports.add("IsEmail"),_.push("@IsEmail(undefined, { each: true })");return}if($.format==="uri"||$.format==="url"){W.validatorImports.add("IsUrl"),_.push("@IsUrl(undefined, { each: true })");return}if($.format==="date"||$.format==="date-time")W.validatorImports.add("IsDateString"),_.push("@IsDateString({}, { each: true })")}function iG($,_,W){if($.minLength!==void 0)W.validatorImports.add("MinLength"),_.push(`@MinLength(${$.minLength}, { each: true })`);if($.maxLength!==void 0)W.validatorImports.add("MaxLength"),_.push(`@MaxLength(${$.maxLength}, { each: true })`);if($.pattern)W.validatorImports.add("Matches"),_.push(`@Matches(new RegExp(${G2($.pattern)}), { each: true })`)}function rG($,_,W){W.validatorImports.add("IsString"),_.push("@IsString({ each: true })"),pG($,_,W),iG($,_,W)}function sG($,_,W){if($.scalar==="integer"){W.validatorImports.add("IsInt"),_.push("@IsInt({ each: true })");return}if($.scalar==="number"){W.validatorImports.add("IsNumber"),_.push("@IsNumber({}, { each: true })");return}if($.scalar==="boolean")W.validatorImports.add("IsBoolean"),_.push("@IsBoolean({ each: true })")}function oG($,_,W){if($.scalar==="string")rG($,_,W);else sG($,_,W);if($.scalar==="number"||$.scalar==="integer")D8({minimum:$.minimum,maximum:$.maximum,exclusiveMinimum:$.exclusiveMinimum,exclusiveMaximum:$.exclusiveMaximum},_,W,{each:!0})}function A5($,_,W,Q,U){if(W.kind==="scalar")return W.scalar==="integer"?"number":W.scalar;if(W.kind==="enum")return U.addEnumImport(Q,W.enumName),W.enumName;if(W.kind==="ref")return U.addDtoImport(Q,W.refName);if(W.kind==="unknown")return"unknown";if(W.kind==="object"){if(Object.keys(W.properties).length===0)return"unknown";let X=`${$}${T5(_)}ValueDto`;return U.emitHelperDto(X,W,Q),X}return`${A5($,_,W.items,Q,U)}[]`}function d6($,_){let W=[];if(typeof $.exclusiveMinimum==="number")W.push(`${_} > ${$.exclusiveMinimum}`);else if($.minimum!==void 0)W.push(`${_} ${$.exclusiveMinimum===!0?">":">="} ${$.minimum}`);else if($.exclusiveMinimum===!0)W.push(`${_} > 0`);if(typeof $.exclusiveMaximum==="number")W.push(`${_} < ${$.exclusiveMaximum}`);else if($.maximum!==void 0)W.push(`${_} ${$.exclusiveMaximum===!0?"<":"<="} ${$.maximum}`);return W}function tG($,_){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(${_})`];if($.format==="email")return[`new RegExp('^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$').test(${_})`];if($.format==="uri"||$.format==="url")return[`(() => { try { new URL(String(${_})); return true; } catch { return false; } })()`];if($.format==="date")return[`new RegExp('^\\d{4}-\\d{2}-\\d{2}$').test(${_})`];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(${_})`];return[]}function aG($,_){if($.scalar==="boolean")return`typeof ${_} === 'boolean'`;if($.scalar==="integer")return[`typeof ${_} === 'number'`,`Number.isInteger(${_})`,...d6($,_)].join(" && ");if($.scalar==="number")return[`typeof ${_} === 'number'`,...d6($,_)].join(" && ");let W=[`typeof ${_} === 'string'`];if(W.push(...tG($,_)),$.minLength!==void 0)W.push(`${_}.length >= ${$.minLength}`);if($.maxLength!==void 0)W.push(`${_}.length <= ${$.maxLength}`);if($.pattern)W.push(`new RegExp(${G2($.pattern)}).test(${_})`);if($.format==="date"||$.format==="date-time")W.push(`!Number.isNaN(Date.parse(${_}))`);return W.join(" && ")}function eG($,_,W,Q,U,Z){if(Object.keys(W.properties).length===0)return null;let X=`${$}${T5(_)}ValueDto`;return U.emitHelperDto(X,W,Q),Q.validatorImports.add("validateSync"),Q.transformerImports.add("plainToInstance"),`isRecordValue(${Z}) && validateSync(plainToInstance(${X}, ${Z})).length === 0`}function H5($,_,W,Q,U,Z="value"){if(W.kind==="scalar")return aG(W,Z);if(W.kind==="enum")return U.addEnumImport(Q,W.enumName),`(${r1(W.enumName)} as readonly unknown[]).includes(${Z})`;if(W.kind==="ref"){let G=U.addDtoImport(Q,W.refName);return Q.validatorImports.add("validateSync"),Q.transformerImports.add("plainToInstance"),`isRecordValue(${Z}) && validateSync(plainToInstance(${G}, ${Z})).length === 0`}if(W.kind==="unknown")return null;if(W.kind==="object")return eG($,_,W,Q,U,Z);let X=H5($,_,W.items,Q,U,"entry");return X?`Array.isArray(${Z}) && ${Z}.every((entry) => ${X})`:`Array.isArray(${Z})`}function $O(){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 WO(){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 QO($){return $.map((_)=>` ${_}`)}function N8($,_){let W=`../enums/${F8(_).replace(/\.ts$/,"")}`,Q=$.enumImports.get(W)??new Set;Q.add(Z2(_)),Q.add(r1(_)),$.enumImports.set(W,Q);let U=$.enumTypeImports.get(W)??new Set;U.add(_),$.enumTypeImports.set(W,U)}function y8($,_){let W=Y1(_);return $.dtoImports.set(W,`./${j8(_).replace(/\.ts$/,"")}`),W}function f$($,_,W,Q,U=!1){let Z=U?"ApiPropertyOptional":"ApiProperty";if(U)$.usesApiPropertyOptional=!0;if(W.length===0){Q.push(`@${Z}()`);return}Q.push(`@${Z}({`);for(let X of W)Q.push(` ${X},`);Q.push("})")}function UO($,_,W){N8(W,_.enumName);let Q=l$($,W),U=[`enum: ${r1(_.enumName)}`,`enumName: '${_.enumName}'`];if($.nullable)U.push("nullable: true");return f$(W,$,U,Q,$.optional),W.validatorImports.add("IsEnum"),Q.push(`@IsEnum(${Z2(_.enumName)})`),{typeName:_.enumName,decorators:Q}}function ZO($,_,W){let Q=y8(W,_.refName),U=l$($,W),Z=[`type: () => ${Q}`];if($.nullable)Z.push("nullable: true");return f$(W,$,Z,U,$.optional),W.validatorImports.add("ValidateNested"),U.push("@ValidateNested()"),W.transformerImports.add("Type"),U.push(`@Type(() => ${Q})`),{typeName:Q,decorators:U}}function XO($,_,W,Q){if(Object.keys(W.properties).length===0&&W.additionalProperties){let G=A5($,_.name,W.additionalProperties,Q,X8),O=l$(_,Q);Q.validatorImports.add("IsObject"),O.push("@IsObject()");let M=H5($,_.name,W.additionalProperties,Q,X8);if(M)Q.validatorImports.add("registerDecorator"),Q.usesRecordValueValidator=!0,O.push(`@ValidateRecordValues((value) => ${M})`);let J=["type: Object","additionalProperties: true"];if(_.nullable)J.push("nullable: true");return f$(Q,_,J,O,_.optional),{typeName:`Record<string, ${G}>`,decorators:O}}if(Object.keys(W.properties).length===0){let G=l$(_,Q);Q.validatorImports.add("IsObject"),G.push("@IsObject()");let O=["type: Object"];if(_.nullable)O.push("nullable: true");return f$(Q,_,O,G,_.optional),{typeName:"Record<string, unknown>",decorators:G}}let U=`${$}${C5(_.name)}Dto`;k8(U,W,Q);let Z=l$(_,Q),X=[`type: () => ${U}`];if(_.nullable)X.push("nullable: true");return f$(Q,_,X,Z,_.optional),Q.validatorImports.add("ValidateNested"),Z.push("@ValidateNested()"),Q.transformerImports.add("Type"),Z.push(`@Type(() => ${U})`),{typeName:U,decorators:Z}}function GO($,_,W,Q){if(W.kind==="scalar")return mG(_,W,Q,f$);if(W.kind==="enum")return UO(_,W,Q);if(W.kind==="ref")return ZO(_,W,Q);if(W.kind==="object")return XO($,_,W,Q);if(W.kind==="unknown"){let U=l$(_,Q),Z=["type: Object"];if(_.nullable)Z.push("nullable: true");return f$(Q,_,Z,U,_.optional),{typeName:"unknown",decorators:U}}return OO($,_,W,Q)}function OO($,_,W,Q){let U=l$(_,Q);if(Q.validatorImports.add("IsArray"),U.push("@IsArray()"),W.minItems!==void 0)Q.validatorImports.add("ArrayMinSize"),U.push(`@ArrayMinSize(${W.minItems})`);if(W.maxItems!==void 0)Q.validatorImports.add("ArrayMaxSize"),U.push(`@ArrayMaxSize(${W.maxItems})`);let Z=["isArray: true"];if(W.minItems!==void 0)Z.push(`minItems: ${W.minItems}`);if(W.maxItems!==void 0)Z.push(`maxItems: ${W.maxItems}`);if(_.nullable)Z.push("nullable: true");let X="unknown";if(W.items.kind==="enum")N8(Q,W.items.enumName),X=W.items.enumName,Q.validatorImports.add("IsEnum"),U.push(`@IsEnum(${Z2(W.items.enumName)}, { each: true })`),Z.push(`enum: ${r1(W.items.enumName)}`),Z.push(`enumName: '${W.items.enumName}'`);else if(W.items.kind==="ref")X=y8(Q,W.items.refName),Q.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),Q.transformerImports.add("Type"),U.push(`@Type(() => ${X})`),Z.push(`type: () => ${X}`);else if(W.items.kind==="scalar")X=W.items.scalar==="integer"?"number":W.items.scalar,oG(W.items,U,Q),Z.push(`type: '${X}'`);else if(W.items.kind==="object"){if(Object.keys(W.items.properties).length===0)return X="Record<string, unknown>",Q.validatorImports.add("IsObject"),U.push("@IsObject({ each: true })"),Z.push("type: Object"),f$(Q,_,Z,U,_.optional),{typeName:`${X}[]`,decorators:U};let G=`${$}${C5(_.name)}ItemDto`;k8(G,W.items,Q),X=G,Q.validatorImports.add("ValidateNested"),U.push("@ValidateNested({ each: true })"),Q.transformerImports.add("Type"),U.push(`@Type(() => ${G})`),Z.push(`type: () => ${G}`)}else throw Error(`Unsupported array item kind '${W.items.kind}' for property '${_.name}'`);return f$(Q,_,Z,U,_.optional),{typeName:`${X}[]`,decorators:U}}function MO($,_,W){let{decorators:Q,typeName:U}=GO($,_,_.schema,W),Z=`${_.name}${_.optional?"?":"!"}`,X=!_.optional&&_.nullable?" | null":"";return W.transformerImports.add("Expose"),[...Q,"@Expose()",`${Z}: ${U}${X};`]}function z5($,_,W,Q,U){let Z=[];if(_)Z.push(`/** ${_.replace(/\*\//g,"*\\/")} */`);Z.push(`export class ${$} {`);let X=Object.entries(W.properties);for(let[G,O]of X){let M=U?.get(G),J={name:G,schema:O,optional:M?.optional??!W.required.includes(G),nullable:M?.nullable??!1,description:M?.description,source:M?.source},T=MO($,J,Q);Z.push(...QO(T),"")}if(X.length===0)Z.push(" // empty schema");if(Z[Z.length-1]==="")Z.pop();return Z.push("}"),Z.join(`
|
|
114
|
+
`)}function k8($,_,W){if(W.seenHelpers.has($))return;W.seenHelpers.add($),W.helperClassBlocks.push(z5($,_.description,_,W))}function JO($){let _=WO(),W=new Map($.properties.map((Y)=>[Y.name,Y])),Q={kind:"object",properties:Object.fromEntries($.properties.map((Y)=>[Y.name,Y.schema])),required:$.properties.filter((Y)=>!Y.optional).map((Y)=>Y.name),description:$.description},U=z5($.dtoName,$.description,Q,_,W),Z=[],X=["ApiProperty"];if(_.usesApiPropertyOptional)X.push("ApiPropertyOptional");Z.push(`import { ${X.join(", ")} } from '@nestjs/swagger';`);let G=[..._.validatorImports].sort();if(G.length>0)Z.push(`import { ${G.join(", ")} } from 'class-validator';`);let O=[..._.transformerImports].sort();if(O.length>0)Z.push(`import { ${O.join(", ")} } from 'class-transformer';`);for(let[Y,A]of[..._.enumImports.entries()].sort((E,V)=>E[0].localeCompare(V[0])))Z.push(`import { ${[...A].sort().join(", ")} } from '${Y}';`);for(let[Y,A]of[..._.enumTypeImports.entries()].sort((E,V)=>E[0].localeCompare(V[0])))Z.push(`import type { ${[...A].sort().join(", ")} } from '${Y}';`);let M=$.dtoName,J=[..._.dtoImports.entries()].filter(([Y])=>Y!==M).sort(([Y,A],[E,V])=>A.localeCompare(V)||Y.localeCompare(E));for(let[Y,A]of J)Z.push(`import { ${Y} } from '${A}';`);let T=[..._.usesRecordValueValidator?[$O()]:[],..._.helperClassBlocks,U].join(`
|
|
115
|
+
|
|
116
|
+
`);return`${Z.join(`
|
|
117
|
+
`)}
|
|
118
|
+
|
|
119
|
+
${T}
|
|
120
|
+
`}function l6($){return typeof $==="string"?`'${$.replace(/'/g,"\\'")}'`:String($)}function TO($){let _=r1($.name),W=Z2($.name),Q=$.name,U=$.values.map((G)=>l6(G)).join(", "),Z=$.members.map((G)=>` ${G.key}: ${l6(G.value)},`).join(`
|
|
121
|
+
`),X=$.values.map((G)=>String(G)).join(" | ");return["/**",` * OpenAPI enum: ${$.name}`,` * Schema path: ${$.schemaPath}`,` * Values: ${X}`," */",`export const ${_} = [${U}] as const;`,"",`export type ${Q} = (typeof ${_})[number];`,"",`export const ${W} = {`,Z,"} as const;"].join(`
|
|
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 O1($,_,W){if($.kind==="scalar")return $.scalar==="integer"?"number":$.scalar;if($.kind==="enum")return iO(_,$.enumName),m$($.enumName);if($.kind==="ref")return pO(_,$.refName),m$($.refName);if($.kind==="array")return`${O1($.items,_,W)}[]`;if($.kind==="unknown")return"unknown";return rO($,_,W)}function sO($,_){let W=$.optional?"?":"",Q=!$.optional&&$.nullable?" | null":"";return`${$.description?` /** ${$.description.replace(/\*\//g,"*\\/")} */
|
|
124
|
+
`:""} ${N5($.name)}${W}: ${O1($.schema,_,1)}${Q};`}function oO($,_){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let W=$.properties.map((Q)=>{let U=Q.optional?["undefined"]:[],Z=!Q.optional&&Q.nullable?["null"]:[];return v8([O1(Q.schema,_,1),...Z,...U])});return` [key: string]: ${y5($.schema.additionalProperties,W,_,1)};`}function tO($){let _=[...$.imports.entries()].sort(([W],[Q])=>W.localeCompare(Q)).map(([W,Q])=>{return`import type { ${[...Q].sort((Z,X)=>Z.localeCompare(X)).join(", ")} } from '${W}';`});return _.length>0?`${_.join(`
|
|
125
|
+
`)}
|
|
126
|
+
|
|
127
|
+
`:""}function aO($){let _=m$($.schemaName),W={currentName:_,imports:new Map},Q=$.description?`/** ${$.description.replace(/\*\//g,"*\\/")} */
|
|
128
|
+
`:"",U=$.properties.map((O)=>sO(O,W)),Z=oO($,W),X=[...U,...Z?[Z]:[]],G=X.length>0?X.join(`
|
|
129
|
+
`):" // empty schema";return`${tO(W)}${Q}export interface ${_} {
|
|
130
|
+
${G}
|
|
131
|
+
}
|
|
132
|
+
`}function f($){return typeof $==="object"&&$!==null}function d$($){if(typeof $!=="string")return;let _=$.trim();return _.length>0?_:void 0}function I$($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function r0($){if(typeof $==="string")return`'${I$($)}'`;if(typeof $==="number"||typeof $==="boolean")return String($);if($===null)return"null";if(Array.isArray($))return`[${$.map((_)=>r0(_)).join(", ")}]`;if(f($))return`{ ${Object.entries($).map(([W,Q])=>{return`${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(W)?W:`'${I$(W)}'`}: ${r0(Q)}`}).join(", ")} }`;return"undefined"}function j1($,_){let W=$.match(new RegExp(`^#/components/${_}/(.+)$`));if(!W?.[1])throw Error(`Unsupported $ref '${$}'. Expected '#/components/${_}/<Name>'`);return W[1]}function k5($,_){let W=_===Z$.Post?YW:JW;for(let U of W){let Z=$[U];if(B(Z))return{statusCode:U,response:Z}}let Q=Object.keys($).filter((U)=>TW.test(U)).sort((U,Z)=>Number(U)-Number(Z));for(let U of Q){let Z=$[U];if(B(Z))return{statusCode:U,response:Z}}return null}function _M($){let _=f($.components)?$.components:{};return{schemas:f(_.schemas)?_.schemas:{},parameters:f(_.parameters)?_.parameters:{},requestBodies:f(_.requestBodies)?_.requestBodies:{},responses:f(_.responses)?_.responses:{}}}function WM($,_){if(!$)return;if(typeof $.$ref==="string"){let W=j1($.$ref,A1.Schemas),Q=_.schemas[W];return f(Q)?Q:void 0}return $}function QM($){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 p6($,_){if(!$||typeof $.$ref!=="string")return;let W=j1($.$ref,A1.Schemas),Q=_.schemas[W];if(!f(Q)||!QM(Q))return;return{name:Y1(W),importPath:UM($)}}function UM($){if(!$||typeof $.$ref!=="string")throw Error("Expected schema $ref while building DTO import path");let _=j1($.$ref,A1.Schemas);return`./dto/${j8(_).replace(/\.ts$/,"")}`}function i6($){return M2($)??void 0}function ZM($,_){let W=$.requestBody;if(!f(W))return;if(typeof W.$ref==="string"){let Q=j1(W.$ref,A1.RequestBodies),U=_.requestBodies[Q];return f(U)?U:void 0}return W}function XM($,_){if(!f($))return;if(typeof $.$ref==="string"){let W=j1($.$ref,A1.Responses),Q=_.responses[W];return f(Q)?Q:void 0}return $}function GM($){if(!Array.isArray($))return;let _=[];for(let W of $){if(typeof W!=="string"&&typeof W!=="number"&&typeof W!=="boolean")return;_.push(W)}return _}function b5($,_){let W=WM($,_);if(!W)return{};let Q=W.type,U=GM(W.enum),Z=W.example;if(Q==="array"){let X=f(W.items)?W.items:void 0,G=b5(X,_);return{typeCtor:G.typeCtor??E1.String,isArray:!0,enumValues:G.enumValues,example:Z??G.example}}if(Q==="string")return{typeCtor:E1.String,enumValues:U,example:Z};if(Q==="number"||Q==="integer")return{typeCtor:E1.Number,enumValues:U,example:Z};if(Q==="boolean")return{typeCtor:E1.Boolean,enumValues:U,example:Z};if(Q==="object")return{typeCtor:E1.Object,enumValues:U,example:Z};return{enumValues:U,example:Z}}function OM($,_){if(!f($))return;if(typeof $.$ref==="string"){let W=j1($.$ref,A1.Parameters),Q=_.parameters[W];return f(Q)?Q:void 0}return $}function MM($,_){let W=OM($,_);if(!W)return;let Q=W.in;if(Q!==m.Path&&Q!==m.Query)return;let U=d$(W.name);if(!U)return;let Z=f(W.schema)?W.schema:void 0,X=b5(Z,_),G=W.required===!0||Q===m.Path,O=d$(W.description),M=W.example??X.example;return{location:Q,name:U,required:G,description:O,typeCtor:X.typeCtor,isArray:X.isArray,enumValues:X.enumValues,example:M}}function JM($,_){if(!Array.isArray($))return{path:[],query:[]};let W=new Map;for(let Z of $){let X=MM(Z,_);if(!X)continue;W.set(`${X.location}:${X.name}`,X)}let Q=[],U=[];for(let Z of W.values()){if(Z.location===m.Path)Q.push(Z);if(Z.location===m.Query)U.push(Z)}return{path:Q.sort((Z,X)=>Z.name.localeCompare(X.name)),query:U.sort((Z,X)=>Z.name.localeCompare(X.name))}}function YM($,_){let W=new Map,Q=(U)=>{if(!Array.isArray(U))return;for(let Z of U){if(!f(Z))continue;if(typeof Z.$ref==="string"){W.set(Z.$ref,Z);continue}let X=d$(Z.in),G=d$(Z.name);if(!X||!G)continue;W.set(`${X}:${G}`,Z)}};return Q($),Q(_),[...W.values()]}function HM($,_){let W=_.replaceAll("{","").replaceAll("}","").replace(/\//g," ").trim(),Q=`${$} ${W||"root"}`;return AM(Q)}function CM($,_){let W=$,Q=2;while(_.has(W))W=`${$}_${Q}`,Q+=1;return _.add(W),W}function zM($,_,W,Q,U,Z){let X=d$(W.operationId)??HM(_,$),G=CM(I1(X),Z),O=YM(Q,W.parameters),M=JM(O,U),J=ZM(W,U),T=f(J?.content)?J.content:void 0,Y=T?i6(T):void 0,A=p6(Y,U),E=f(W.responses)?W.responses:{},V=k5(E,_),z=V?XM(V.response,U):void 0,j=f(z?.content)?z.content:void 0,F=j?i6(j):void 0,x=p6(F,U),w=d$(z?.description),N=d$(W.summary)??`${_.toUpperCase()} ${$}`,G$=d$(W.description)??N;return{key:G,constantName:`SWG_${G}`,operationId:X,method:_.toUpperCase(),path:$,summary:N,description:G$,bodyDtoName:A?.name,bodyDtoImportPath:A?.importPath,responseDtoName:x?.name,responseDtoImportPath:x?.importPath,responseDescription:w,paramDto:M.path,queryDto:M.query}}function LM($){let _=f($.paths)?$.paths:{},W=_M($),Q=[],U=new Set;for(let[Z,X]of Object.entries(_)){if(!f(X))continue;let G=X.parameters;for(let O of g5){let M=X[O];if(!f(M))continue;Q.push(zM(Z,O,M,G,W,U))}}return Q.sort((Z,X)=>{let G=Z.path.localeCompare(X.path);if(G!==0)return G;return Z.method.localeCompare(X.method)})}function r6($){let _=[`name: '${I$($.name)}'`];if($.required===!0)_.push("required: true");if($.description)_.push(`description: '${I$($.description)}'`);if($.typeCtor)_.push(`type: ${$.typeCtor}`);if($.isArray)_.push("isArray: true");if($.enumValues&&$.enumValues.length>0)_.push(`enum: ${r0($.enumValues)}`);if($.example!==void 0)_.push(`example: ${r0($.example)}`);return`{ ${_.join(", ")} }`}function EM($){let _=[];if(_.push("/**"),_.push(` * ${$.summary}`),_.push(` * @operationId ${$.operationId}`),_.push(` * @route ${$.method} ${$.path}`),_.push(" */"),_.push(`export const ${$.constantName} = {`),_.push(` operationId: '${I$($.operationId)}',`),_.push(` method: '${$.method}',`),_.push(` path: '${I$($.path)}',`),_.push(` summary: '${I$($.summary)}',`),_.push(` description: '${I$($.description)}',`),$.paramDto.length>0){let W=$.paramDto.map((Q)=>` ${r6(Q)}`).join(`,
|
|
133
|
+
`);_.push(` paramDto: [
|
|
134
|
+
${W}
|
|
135
|
+
],`)}if($.queryDto.length>0){let W=$.queryDto.map((Q)=>` ${r6(Q)}`).join(`,
|
|
136
|
+
`);_.push(` queryDto: [
|
|
137
|
+
${W}
|
|
138
|
+
],`)}if($.bodyDtoName)_.push(` bodyDto: ${$.bodyDtoName},`);if($.responseDtoName)_.push(` responseDto: ${$.responseDtoName},`);if($.responseDescription)_.push(` responseDescription: '${I$($.responseDescription)}',`);return _.push("} as const;"),_.join(`
|
|
139
|
+
`)}function KM($){if(!f($))return`export const SWAGGER_OPERATIONS = {} as const;
|
|
140
|
+
`;let _=LM($),W=new Map;for(let O of _){if(O.bodyDtoName&&O.bodyDtoImportPath){let M=W.get(O.bodyDtoImportPath)??new Set;M.add(O.bodyDtoName),W.set(O.bodyDtoImportPath,M)}if(O.responseDtoName&&O.responseDtoImportPath){let M=W.get(O.responseDtoImportPath)??new Set;M.add(O.responseDtoName),W.set(O.responseDtoImportPath,M)}}let Q=[...W.entries()].sort(([O],[M])=>O.localeCompare(M)).map(([O,M])=>{return`import { ${[...M].sort((T,Y)=>T.localeCompare(Y)).join(", ")} } from '${O}';`}).join(`
|
|
141
|
+
`),U=Q.length>0?`${Q}
|
|
142
|
+
|
|
143
|
+
`:"";if(_.length===0)return`${U}export const SWAGGER_OPERATIONS = {} as const;
|
|
144
|
+
`;let Z=_.map((O)=>EM(O)).join(`
|
|
145
|
+
|
|
146
|
+
`),G=`/** Generated OpenAPI operation metadata map. */
|
|
147
|
+
export const SWAGGER_OPERATIONS = {
|
|
148
|
+
${_.map((O)=>` ${O.key}: ${O.constantName},`).join(`
|
|
149
|
+
`)}
|
|
150
|
+
} as const;`;return`${U}${Z}
|
|
151
|
+
|
|
152
|
+
${G}
|
|
153
|
+
`}async function qM($){let _;try{_=await x8($,{withFileTypes:!0})}catch{return!1}let W=!1;return await Promise.all(_.filter((Q)=>Q.isFile()&&Q.name.endsWith(CW)).map(async(Q)=>{await e1(i($,Q.name),{force:!0}),W=!0})),W}async function x5($){try{await v5($)}catch{return!1}return await e1($,{force:!0}),!0}async function s6($){try{await v5($)}catch{return!1}return await e1($,{recursive:!0,force:!0}),!0}async function u8($,_){let W;try{W=await x8($,{withFileTypes:!0})}catch{return!1}let Q=!1;return await Promise.all(W.filter((U)=>U.isFile()&&U.name.endsWith(".ts")&&U.name!==H8&&!_.has(U.name)).map(async(U)=>{await e1(i($,U.name),{force:!0}),Q=!0})),Q}async function IM($,_){let W;try{W=await x8($,{withFileTypes:!0})}catch{return!1}let Q=!1;return await Promise.all(W.filter((U)=>U.isFile()&&U.name.endsWith(".contract.ts")&&!_.has(U.name)).map(async(U)=>{await e1(i($,U.name),{force:!0}),Q=!0})),Q}async function _0($,_,W){return W?V8($,_):$}async function jM($,_,W,Q){let U=!1,Z=[],X=new Set;for(let G of $.enumGroups){let O=F8(G.name);X.add(O);let M=i(_,O),J=await _0(TO(G),M,Q);if(await a(M,J))U=!0;if(Z.push(`./${O.replace(/\.ts$/,"")}`),W)$0.step(` \u2713 ${M}`)}if(await u8(_,X))U=!0;if(await q1(_,Z.sort()))U=!0;return U}async function FM($,_,W){let Q=!1;for(let U of $.enumGroups){let Z=U2(U.name);if(!_.has(Z)){let X=i(W,Z);if(await x5(X))Q=!0}}return Q}async function wM($,_,W,Q){let U=!1,Z=[],X=new Set;for(let G of $){let O=U2(G.schemaName);if(X.has(O))throw Error(`Duplicate OpenAPI model output file '${O}'`);X.add(O);let M=i(_,O),J=await _0(aO(G),M,Q);if(await a(M,J))U=!0;if(Z.push(`./${O.replace(/\.ts$/,"")}`),W)$0.step(` \u2713 ${M}`)}if(await u8(_,X))U=!0;if(await q1(_,Z.sort()))U=!0;return U}async function fM($,_,W,Q){let U=!1,Z=[],X=new Set,G=new Map;for(let O of $.dtoModels.filter((M)=>M.properties.length>0)){let M=j8(O.schemaName);if(X.has(M))throw Error(`Duplicate OpenAPI DTO output file '${M}'`);let J=Y1(O.schemaName),T=G.get(J);if(T)throw Error(`Duplicate OpenAPI DTO class symbol '${J}' from schemas '${T}' and '${O.schemaName}'`);G.set(J,O.schemaName),X.add(M);let Y=i(_,M),A=await _0(JO(O),Y,Q);if(await a(Y,A))U=!0;if(Z.push(`./${M.replace(CW,".dto")}`),W)$0.step(` \u2713 ${Y}`)}if(await u8(_,X))U=!0;return{changed:U,dtoExports:Z}}async function DM($,_,W,Q){let U=!1,Z=[],X=new Set;for(let G of $){let O=G5(G.schemaName);if(X.has(O))throw Error(`Duplicate OpenAPI contract output file '${O}'`);X.add(O);let M=i(_,O),J=await _0(vG(G),M,Q);if(await a(M,J))U=!0;if(Z.push(`./${O.replace(/\.ts$/,"")}`),W)$0.step(` \u2713 ${M}`)}if(await IM(_,X))U=!0;return{changed:U,contractExports:Z}}async function NM($,_,W,Q){let U=!1,Z=await DM($,_,W,Q);if(Z.changed)U=!0;if(await q1(_,Z.contractExports.sort()))U=!0;return U}async function yM($,_,W,Q,U,Z){let X=!1,G=await fM($,W,U,Z);if(G.changed)X=!0;if(await q1(W,G.dtoExports.sort()))X=!0;let O=await _0(KM(_),Q,Z);if(await a(Q,O))X=!0;if(U)$0.step(` \u2713 ${Q}`);return X}function u5($){return`export * from '${$}';`}function O8($,_){return`export * as ${$} from '${_}';`}async function kM($,_){let W=_.length>0?_.sort().join(`
|
|
154
|
+
`):"export {};";return a(i($,H8),`${W}
|
|
155
|
+
`)}async function PM($){return await qM($)}async function bM($,_,W,Q,U,Z,X,G,O){let{httpDir:M,dtoDir:J}=Q,T=i(M,"zod"),Y=i(M,"swagger.ts"),A=!1;if(U){if(await NM(W,T,X,G))A=!0;O.push(O8("ZodContracts","./zod"))}else if(await s6(T))A=!0;if(Z){if(await yM($,_,J,Y,X,G))A=!0;O.push(O8("Dtos","./dto"),u5("./swagger"))}else{let E=await s6(J),V=await x5(Y);if(E||V)A=!0}return A}async function gM($,_,W,Q,U){let{httpDir:Z,enumDir:X,modelDir:G}=W,O=!1,M=await SM.parse($,{validate:{spec:!1}});J2(M,{enforceOperationSchemaRefs:!0});let J=w5(M),T=J.dtoModels.filter((j)=>j.source!=="operation"),Y=new Set(T.map((j)=>U2(j.schemaName))),A=U.dtos===!0,E=U.zod===!0||!A,V=U.formatFiles!==!1;O=await PM(Z)||O;let z=[O8("Models","./models"),u5("./enums")];if(await jM(J,X,Q,V))O=!0;if(await FM(J,Y,G))O=!0;if(await wM(T,G,Q,V))O=!0;if(await bM(J,M,T,W,E,A,Q,V,z))O=!0;if(await kM(Z,z))O=!0;if(await a(i(_,H8),`export * as HttpSchemas from './http';
|
|
156
|
+
`))O=!0;return O}async function vM($,_,W,Q={}){let U=RM(_);try{let Z=i(_,"http"),X={httpDir:Z,dtoDir:i(Z,"dto"),enumDir:i(Z,"enums"),modelDir:i(Z,"models")},G=await gM($,_,X,W,Q);return{success:!0,service:U,changed:G}}catch(Z){return{success:!1,service:U,error:Z instanceof Error?Z:Error(String(Z))}}}function h($){return typeof $==="object"&&$!==null}function s0($){if(typeof $!=="string")return;let _=$.trim();return _.length>0?_:void 0}function hM($){return $.replaceAll("\\","\\\\").replaceAll("'","\\'")}function B$($){return`'${hM($)}'`}function K1($){return`${nM}${$}}`}function l8($){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test($)}function W0($){return l8($)?$:JSON.stringify($)}function h5($,_){return l8(_)?`${$}.${_}`:`${$}[${JSON.stringify(_)}]`}function d5($,_){if(_==="PascalCase")return h8($);if(_==="snake_case")return d8($);if(_==="original")return $;return T2($)}function dM($,_){if(_==="PascalCase")return h8($);if(_==="snake_case")return d8($);if(_==="original")return $;return T2($)}function lM($,_){if(_==="camelCase")return T2(String($));if(_==="snake_case")return d8(String($));if(_==="UPPERCASE")return uM(String($));if(_==="original")return String($);return h8(String($))}function l5($){let _=T2($);return/^[A-Za-z_$]/.test(_)?_:`_${_}`}function cM($){let _=l8($)?$:l5($);return AW.has(_)?`${_}Value`:_}function c5($){return $.modelPropertyNaming??($.type===S.TypeScriptAngular?"original":"camelCase")}function Q0($){return $.useSingleRequestParameter??$.type===S.TypeScriptFetch}function c8($,_){let W=$.match(new RegExp(`^#/components/${_}/(.+)$`));if(!W?.[1])throw Error(`Unsupported $ref '${$}'`);return W[1]}function m8($){return $.map((_)=>{let W=_.parameters.map((U)=>{let Z=U.required?"":"?";return` ${W0(U.name)}${Z}: ${U.typeName};`});if(_.bodyType)W.push(` body: ${_.bodyType};`);let Q=W.length>0?W.join(`
|
|
157
|
+
`):" [key: string]: never;";return`export interface ${_.requestName} {
|
|
158
|
+
${Q}
|
|
159
|
+
}`})}function mM(){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 '${K1("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 ? \`?${K1("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 p8($){return{pathParams:$.parameters.filter((_)=>_.location===m.Path),queryParams:$.parameters.filter((_)=>_.location===m.Query)}}function p1($,_){return $.map((W)=>{let Q=_?h5("request",W.name):W.variableName;return`${W0(W.wireName)}: ${Q}`}).join(", ")}function pM($,_){if($.length===0)return[];let W=[" let params = new HttpParams();"];for(let Q of $){let U=_?h5("request",Q.name):Q.variableName;W.push(` if (Array.isArray(${U})) {`,` for (const item of ${U}) params = params.append(${B$(Q.wireName)}, String(item));`,` } else if (${U} !== undefined && ${U} !== null) {`,` params = params.set(${B$(Q.wireName)}, String(${U}));`," }")}return W}function i8($,_){if(Q0(_)){let U=$.parameters.length===0&&!$.bodyType?" = {}":"";return`request: ${$.requestName}${U}`}let Q=$.parameters.map((U)=>{let Z=U.required?"":"?";return`${U.variableName}${Z}: ${U.typeName}`});if($.bodyType)Q.push(`body: ${$.bodyType}`);return Q.join(", ")}function r8($){return Q0($)?"request.body":"body"}function S1($){return $}function iM($){if($.responseType==="unknown")return[" return parseUnknownJsonResponse(response);"];return[" if (!this.config.decodeJson) {",` throw new Error(${B$(`Missing JSON decoder for operation '${$.operationId}'`)});`," }",` return parseJsonResponse<${S1($.responseType)}>(response, ${B$($.operationId)}, this.config.decodeJson);`]}function rM($,_,W){let Q=["import type { RequestConfig } from './runtime';","import { buildPath, buildQuery, parseJsonResponse, parseUnknownJsonResponse } from './runtime';","import type * as Models from './models';","",...m8($),"",`export class ${n8(_)}FetchClient {`," constructor(private readonly config: RequestConfig = {}) {}"];for(let U of $){let{pathParams:Z,queryParams:X}=p8(U),G=Q0(W),O=U.bodyType?`body: JSON.stringify(${r8(W)}),`:"",M=U.bodyType?"headers: { 'content-type': 'application/json', ...this.config.headers },":"headers: this.config.headers,";Q.push(` async ${U.functionName}(${i8(U,W)}): Promise<${S1(U.responseType)}> {`,` const path = buildPath(${B$(U.path)}, { ${p1(Z,G)} });`,` const query = buildQuery({ ${p1(X,G)} });`," const fetchImpl = this.config.fetch ?? fetch;",` const response = await fetchImpl(\`${K1("this.config.baseUrl ?? ''")}${K1("path")}${K1("query")}\`, {`,` method: ${B$(U.method)},`,` ${M}`,` ${O}`," });",` if (!response.ok) throw new Error(\`Request failed with status ${K1("response.status")}\`);`,...iM(U)," }")}return Q.push("}",""),`${Q.join(`
|
|
161
|
+
`)}
|
|
162
|
+
`}function sM($,_,W){let U=["import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';",$.some((Z)=>Z.parameters.some((X)=>X.location===m.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;","}","",...m8($),"",`export class ${n8(_)}AxiosClient {`," private readonly client: AxiosInstance;",""," constructor(private readonly config: AxiosClientConfig = {}) {"," this.client = config.axios ?? axios.create({ baseURL: config.baseURL });"," }"];for(let Z of $){let{pathParams:X,queryParams:G}=p8(Z),O=Q0(W),M=Z.bodyType?`data: ${r8(W)},`:"",J=G.length?`params: { ${p1(G,O)} },`:"",T=G.length?"paramsSerializer: (params: Record<string, unknown>) => buildQuery(params).slice(1),":"";U.push(` async ${Z.functionName}(${i8(Z,W)}): Promise<${S1(Z.responseType)}> {`,` const url = buildPath(${B$(Z.path)}, { ${p1(X,O)} });`,` const response = await this.client.request<${S1(Z.responseType)}>({`," ...this.config.requestConfig,"," url,",` method: ${B$(Z.method)},`,` ${J}`,` ${T}`,` ${M}`," });"," return response.data;"," }")}return U.push("}",""),`${U.join(`
|
|
163
|
+
`)}
|
|
164
|
+
`}function oM($,_,W,Q){let X=["import { Injectable } from '@angular/core';",$.some((G)=>G.parameters.some((O)=>O.location===m.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';","",...m8($),"",`@Injectable({ providedIn: ${B$(Q)} })`,`export class ${n8(_)}ApiService {`," constructor(private readonly http: HttpClient, private readonly baseUrl = '') {}"];for(let G of $){let{pathParams:O,queryParams:M}=p8(G),J=Q0(W),T=M.length>0?"{ params }":"{}",Y=G.bodyType?`${r8(W)}, `:"",A=G.method.toLowerCase(),E=G.bodyType||A!==Z$.Get?`\`\${this.baseUrl}\${path}\`, ${Y}${T}`:`\`\${this.baseUrl}\${path}\`, ${T}`;X.push(` ${G.functionName}(${i8(G,W)}): Observable<${S1(G.responseType)}> {`,` const path = buildPath(${B$(G.path)}, { ${p1(O,J)} });`,...pM(M,J),` return this.http.${A}<${S1(G.responseType)}>(${E});`," }")}return X.push("}",""),`${X.join(`
|
|
165
|
+
`)}
|
|
166
|
+
`}function tM($,_,W){if(W.type===S.TypeScriptAxios)return sM($,_,W);if(W.type===S.TypeScriptAngular)return oM($,_,W,W.providedIn??"root");return rM($,_,W)}function o0($){return[...new Set($)].join(" | ")}function o8($){if(!$)return"unknown";if(typeof $.$ref==="string")return s8(c8($.$ref,"schemas"));if(Array.isArray($.enum))return $.enum.map((_)=>JSON.stringify(_)).join(" | ");if($.type==="integer"||$.type==="number")return"number";if($.type==="boolean")return"boolean";if($.type==="array"){let _=h($.items)?$.items:void 0;return`Array<${o8(_)}>`}if($.type==="object")return"Record<string, unknown>";return"string"}function eM($,_,W){if($.kind!=="object")return j$($,_,W);let Q=Object.entries($.properties);if(Q.length===0)return $.additionalProperties?`Record<string, ${j$($.additionalProperties,_,W)}>`:"Record<string, unknown>";let U=" ".repeat(W),Z=" ".repeat(W+1),X=c5(_),G=Q.map(([O,M])=>{let J=d5(O,X),T=$.required.includes(O)?"":"?";return`${Z}${W0(J)}${T}: ${j$(M,_,W+1)};`});if($.additionalProperties){let O=j$($.additionalProperties,_,W+1),M=Q.map(([J,T])=>{let Y=$.required.includes(J)?[]:["undefined"];return o0([j$(T,_,W+1),...Y])});G.push(`${Z}[key: string]: ${O==="unknown"?"unknown":o0([O,...M])};`)}return`{
|
|
167
|
+
${G.join(`
|
|
168
|
+
`)}
|
|
169
|
+
${U}}`}function j$($,_,W=1){if($.kind==="ref")return m$($.refName);if($.kind==="enum")return s8($.enumName);if($.kind==="array")return`Array<${j$($.items,_,W)}>`;if($.kind==="object")return eM($,_,W);if($.kind==="unknown")return"unknown";if($.scalar==="integer")return"number";return $.scalar}function $J($,_){let W=[...$];if(_.enumUnknownDefaultCase===!0&&W.every((Q)=>typeof Q==="string"))W.push(GJ);return W}function _J($,_,W){let Q=s8($),U=$J(_,W).map((Z)=>({key:lM(Z,W.enumPropertyNaming),value:Z}));return[`export const ${Q} = {`,...U.map((Z)=>` ${W0(Z.key)}: ${JSON.stringify(Z.value)},`),"} as const;",`export type ${Q} = (typeof ${Q})[keyof typeof ${Q}];`]}function WJ($,_){return _.sortModelPropertiesByRequiredFlag===!1?$.properties:[...$.properties].sort((W,Q)=>Number(W.optional)-Number(Q.optional))}function QJ($,_,W){let Q=d5($.name,W),U=j$($.schema,_),Z=$.optional?"?":"",X=$.nullable?" | null":"";return` ${W0(Q)}${Z}: ${U}${X};`}function UJ($,_){let W=$.optional?["undefined"]:[],Q=$.nullable?["null"]:[];return o0([j$($.schema,_),...Q,...W])}function ZJ($,_,W){if($.schema?.kind!=="object"||!$.schema.additionalProperties)return null;let Q=j$($.schema.additionalProperties,W),U=_.map((Z)=>UJ(Z,W));return` [key: string]: ${Q==="unknown"?"unknown":o0([Q,...U])};`}function XJ($,_){let W=c5(_),Q=WJ($,_),U=[`export interface ${m$($.schemaName)} {`];U.push(...Q.map((X)=>QJ(X,_,W)));let Z=ZJ($,Q,_);if(Z)U.push(Z);if(Q.length===0&&!Z)U.push(" // empty schema");return U.push("}"),U}function n5($,_){let W=["/* Generated by Kontract. */"];for(let Q of $.enumGroups)W.push(..._J(Q.name,Q.values,_));for(let Q of $.dtoModels)W.push(...XJ(Q,_));return`${W.join(`
|
|
170
|
+
|
|
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
|
+
${Z.details??""}`;if(W.has(X))continue;W.add(X),_(Z.title,Z.details)}}}async function ZY($,_,W,Q){let U=[...Q,...$.map((Z)=>_2(W,Z)),..._9($,W),..._.map((Z)=>Y8(Z.outputDir,Z.serviceName))];await Promise.all(U.map((Z)=>$Y(Z,{recursive:!0}))),await Promise.all(Q.map((Z)=>e5(Y8(Z,".cache"),{recursive:!0,force:!0})))}function $9($){return[...new Set($)].sort((_,W)=>_.localeCompare(W))}function XY($){let _=$9($.map((Q)=>WY(Q))).sort((Q,U)=>Q.length-U.length||Q.localeCompare(U)),W=[];for(let Q of _){if(W.some((U)=>$2(U,Q)))continue;W.push(Q)}return W}function _9($,_){let W=$.filter((Q)=>Q.generator.type!==S.AsyncApiNats).map((Q)=>Q.sourceName);return $9(W.map((Q)=>FW(_,Q)))}async function GY($,_,W,Q){let U=[...$.map((X)=>_2(_,X)),..._9($,_)],Z=XY([...W,...U]);Q.printStep("Cleaning selected generated outputs and Kontract cache..."),await Promise.all(Z.map((X)=>e5(X,{recursive:!0,force:!0})))}function OY($,_,W,Q,U,Z){let X=0,G=(M,J)=>{if(X+=1,J===U1.Generated)$.generatedCount+=1;if(J===U1.Unchanged)$.unchangedCount+=1;if(J===U1.Failed)$.failedCount+=1;let T=`Generating contracts (${X}/${_.length}) \u2022 ${M.sourceName}/${M.targetName}/${M.serviceName} (${QY(M.channel)}, ${J})`;if(W){W.message(T);return}if(!Q&&U)Z(T)},O=(M,J)=>{$.failures.push(zX(`${M.sourceName}/${M.targetName}/${M.serviceName}`,J)),G(M,U1.Failed)};return async(M)=>{try{let J=await M.run();if($.results.push(J),J.success){if(J.skippedByManifest)D("generation.manifestSkipped");else $.touchedServiceDirs.add(Y8(M.outputDir,M.serviceName));if(J.manifest)$.pendingManifestWrites.push(J.manifest);if(J.changed)$.changedOutputRoots.add(M.outputDir);return G(M,J.changed?U1.Generated:U1.Unchanged),!0}return O(M,J.error.message),!1}catch(J){let T=J instanceof Error?J:Error(String(J));return $.results.push({success:!1,service:M.serviceName,error:T}),O(M,T.message),!1}}}async function MY($,_,W,Q,U){if(_)_.message("Formatting generated contracts...");else if(!W&&Q)U.printStep("Formatting generated contracts...");for(let Z of $){let X=await jZ(Z);if(!X.success)throw Error([`Could not run post-generation Biome format pass for ${jW(Z)}.`,X.details].filter(Boolean).join(`
|
|
174
|
+
`));else if(!W&&Q&&X.details)U.printInfo(X.details)}}async function JY($){let _=[];for(let W of $)try{if((await _Y(W)).isDirectory())_.push(W)}catch(Q){if(Q instanceof Error&&"code"in Q&&Q.code==="ENOENT")continue;throw Q}return _}function YY($,_,W){let Q=$.find((U)=>$2(U,W));if(Q)_.changedOutputRoots.add(Q)}function TY(){return{results:[],touchedServiceDirs:new Set,changedOutputRoots:new Set,pendingManifestWrites:[],failures:[],generatedCount:0,unchangedCount:0,failedCount:0}}function AY($){return[...new Set($.map((_)=>_.outputDir))].sort((_,W)=>_.localeCompare(W))}async function HY($,_){let W=await Promise.all([...$.touchedServiceDirs].map(async(Q)=>({serviceDir:Q,changed:await HZ(Q)})));for(let Q of W)if(Q.changed)YY(_,$,Q.serviceDir)}async function CY($,_){let W=await Promise.all(_.map(async(U)=>({outputRoot:U,changed:await CZ(U)}))),Q=await Promise.all(_.map(async(U)=>({outputRoot:U,changed:await LZ(U)})));for(let U of[...W,...Q])if(U.changed)$.changedOutputRoots.add(U.outputRoot)}async function zY($,_,W,Q,U){let Z=[...$.changedOutputRoots],X=await JY(Z);if(X.length===0)return;D("format.changedOutputRoots",X.length),await MY(X,_,W,Q,U)}async function LY($){if($.pendingManifestWrites.length===0)return;await Promise.all($.pendingManifestWrites.map((_)=>lZ(_)))}function VY($){return $>1&&process.env[OW]!=="1"&&process.env[lU]!=="1"}function EY($){if(!VY($))return D("worker.disabled"),null;try{let _=FJ($);return D("worker.enabled"),D("worker.count",$),_}catch(_){D("worker.startFailures");let W=_ instanceof Error?_.message:String(_);throw Error(`Could not start Kontract worker pool: ${W}. Set ${OW}=1 to run on the main thread.`)}}function KY($,_,W,Q){let U=`Done: ${$.generatedCount} generated, ${$.unchangedCount} unchanged, ${$.failedCount} failed`;if(_)if($.failedCount>0)_.error(U);else _.stop(U);else if(!W)Q.printStep(U);if($.failures.length>0)for(let Z of $.failures)Q.printFailure(Z)}async function BY($){let _=WZ($.metrics??null);try{return await RY($)}finally{_()}}async function RY($){let{concurrency:_,verbose:W,quiet:Q}=$,U=Q?null:await import("@clack/prompts"),Z=U?.spinner(_1("purple"))??null,X=LX(Q,U),{printStep:G,printInfo:O,printFailure:M}=X,J;try{J=await $$("plan",()=>aJ($))}catch(w){let N=w instanceof Error?w:Error(String(w));return M({title:`\u2717 ${N.message}`}),1}let{jobs:T,workItems:Y,cacheRoot:A}=J,E=T.map((w)=>`${w.sourceName}/${w.targetName} \u2192 ${jW(w.outputDir)}`).join(", ");if(G(`Kontract generate: ${E}`),Y.length===0)return O("No schema files found for selected sources and targets."),0;await $$("dependencyWarnings",()=>UY(T,X.printWarning));let V=AY(T);if($.clean===!0)await $$("clean",()=>GY(T,A,V,X));let z=TY();if(Z)Z.start(`Generating contracts (0/${Y.length})...`);await $$("prepareOutputDirectories",()=>ZY(T,Y,A,V));let j=OY(z,Y,Z,Q,W,G),F=EY(_),x=wJ(F);try{await $$("processItems",()=>_8(Y,j,_))}finally{x(),await F?.close()}await $$("barrels",async()=>{if(z.touchedServiceDirs.size===0&&z.changedOutputRoots.size===0){D("barrels.skipped");return}await HY(z,V),await CY(z,V)});try{await $$("format",()=>zY(z,Z,Q,W,X)),await $$("manifest.write",()=>LY(z))}catch(w){let N=w instanceof Error?w:Error(String(w));z.failures.push({title:`\u2717 ${N.message}`}),z.failedCount+=1}return KY(z,Z,Q,X),z.failedCount>0?1:0}function wY($,_){let W=_.split(`
|
|
175
|
+
`).map((Z)=>Z.trim()).filter((Z)=>Z.length>0),[Q="Unexpected error",...U]=W;return{title:`\u274C ${$}: ${Q}`,details:U.length>0?U.join(`
|
|
176
|
+
`):void 0}}function fY($){return $.type!==S.AsyncApiNats}function DY($){return $.type===S.AsyncApiNats}function NY($){let _=$.source?$.config.sources.filter((U)=>U.name===$.source):$.config.sources;if(_.length===0)throw Error(`No kontract source named '${$.source}'`);let W=[],Q=!1;for(let U of _){let Z=$.target?U.targets.filter((G)=>G.name===$.target):U.targets;if(Z.length>0)Q=!0;let X=Z.map((G)=>G.generator);W.push({source:U,inputDir:jY(U.input),validateOpenApi:X.some(fY),validateAsyncApi:X.some(DY)})}if($.target&&!Q)throw Error(`No kontract target named '${$.target}'`);return W.filter((U)=>U.validateOpenApi||U.validateAsyncApi)}async function yY($){let _=Bun.spawn(["bunx","@asyncapi/cli","validate",$],{stdout:"pipe",stderr:"pipe",env:{...process.env}});if(await _.exited!==0){let Q=await new Response(_.stderr).text();return{success:!1,file:$,kind:A$.AsyncApi,error:Error(Q.trim())}}return{success:!0,file:$,kind:A$.AsyncApi}}async function kY($){try{let _=await FY.parse($,{validate:{spec:!1}});return J2(_,{enforceOperationSchemaRefs:!0}),{success:!0,file:$,kind:A$.OpenApi}}catch(_){return{success:!1,file:$,kind:A$.OpenApi,error:_ instanceof Error?_:Error(String(_))}}}function PY($,_){return{printStep:(Z)=>{if($)return;if(_){_.log.step(Z,U$("step"));return}b0.step(Z)},printInfo:(Z)=>{if($)return;if(_){_.log.info(Z,U$("info"));return}b0.info(Z)},printFailure:(Z)=>{if(!$&&_){if(_.log.error(Z.title,{...U$("error"),symbol:"\u274C"}),Z.details)_.note(Z.details,"Details",P$("dim"));return}if(b0.error(Z.title),Z.details)b0.error(Z.details)}}}async function bY($){let _=[],W=[];for(let Q of $){if(Q.validateOpenApi){let U=await _5(Q.inputDir);_.push(...U.map((Z)=>Z.rootFile))}if(Q.validateAsyncApi){let U=await W5(Q.inputDir);W.push(...U.flatMap((Z)=>Z.files))}}return{openApiFiles:_,asyncApiFiles:W}}function gY($){let _=$.filter((Z)=>Z.success&&Z.kind===A$.OpenApi).length,W=$.filter((Z)=>!Z.success&&Z.kind===A$.OpenApi).length,Q=$.filter((Z)=>Z.success&&Z.kind===A$.AsyncApi).length,U=$.filter((Z)=>!Z.success&&Z.kind===A$.AsyncApi).length;return{summary:`OpenAPI: ${_} passed, ${W} failed | AsyncAPI: ${Q} passed, ${U} failed`,failedCount:W+U}}function a6($,_,W){return async(Q)=>{let U=await _(Q);W.results.push(U);let Z=IY(Q);if(U.success)return W.updateProgress(Z,$,T8.Passed),!0;return W.failures.push(wY(`${Z} (${$})`,U.error.message)),W.updateProgress(Z,$,T8.Failed),U.success}}function vY($,_,W,Q,U){let Z=0;return(X,G,O)=>{Z+=1;let M=`Validating schemas (${Z}/${$}) \u2022 ${X} (${G}, ${O})`;if(_){_.message(M);return}if(!W&&Q)U(M)}}function xY($,_,W,Q,U){if(W){if(_>0)W.error($);else W.stop($);return}if(!Q)U($)}async function uY($){let{concurrency:_,verbose:W,quiet:Q}=$,U=Q?null:await import("@clack/prompts"),Z=U?.spinner(_1("purple"))??null,{printStep:X,printInfo:G,printFailure:O}=PY(Q,U),M;try{M=NY($)}catch(z){let j=z instanceof Error?z:Error(String(z));return O({title:`\u2717 ${j.message}`}),1}X(`Kontract validate: ${M.map((z)=>z.source.name).join(", ")}`);let J,T;try{({openApiFiles:J,asyncApiFiles:T}=await bY(M))}catch(z){let j=z instanceof Error?z:Error(String(z));return O({title:`\u2717 ${j.message}`}),1}let Y=J.length+T.length;if(Y===0)return G("No schema files found for selected sources and targets."),0;if(Z)Z.start(`Validating schemas (0/${Y})...`);let A={results:[],failures:[],updateProgress:vY(Y,Z,Q,W,X)};await Promise.all([_8(J,a6(A$.OpenApi,kY,A),_),_8(T,a6(A$.AsyncApi,yY,A),_)]);let{summary:E,failedCount:V}=gY(A.results);if(xY(E,V,Z,Q,X),A.failures.length>0)for(let z of A.failures)O(z);return V>0?1:0}function pY($){let _=$W($,nU);if(!e6($W($,".git")))return!1;let W=`${ZW}/${cU}`,Q=e6(_)?lY(_,"utf8"):"";if(Q.split(/\r?\n/).includes(W))return!1;return dY(mY(_),{recursive:!0}),cY(_,`${Q.trimEnd()}
|
|
177
|
+
${W}
|
|
178
|
+
`,"utf8"),!0}function iY($){let{cwd:_,json:W,quiet:Q}=$,U=$.writeOutput??((X)=>{nY(1,X)});C0(N6,{cwd:_});let Z=pY(_);if(W)return U(`${JSON.stringify({ok:!0,command:"kontract init",data:{activated:N6,excludeUpdated:Z,hint:y6},warnings:[],error:null},null,2)}
|
|
179
|
+
`),0;if(!Q)y("Kontract is now active for this workspace.",{details:y6});return 0}function ZT($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function i1($,_){if(!ZT($))throw Error(`${_} must be an object`);return $}function t0($,_,W){let Q=$[_];if(typeof Q!=="string"||Q.trim().length===0)throw Error(`${W}.${_} must be a non-empty string`);return Q.trim()}function _W($,_,W){let Q=$[_];if(Q===void 0)return;if(typeof Q!=="string"||Q.trim().length===0)throw Error(`${W}.${_} must be a non-empty string`);return Q.trim()}function u$($,_,W){let Q=$[_];if(Q===void 0)return;if(typeof Q!=="boolean")throw Error(`${W}.${_} must be a boolean`);return Q}function U9($,_){if(!Array.isArray($)||$.length===0)throw Error(`${_} must be a non-empty array`);return $}function h$($,_,W){let Q=new Set(_);for(let U of Object.keys($))if(!Q.has(U))throw Error(`${W}.${U} is not supported`)}function XT($){for(let _ of aY)if(_ in $)throw Error(`kontract.${_} is not supported. Use kontract.sources[].targets[]`)}function l0($,_,W,Q){let U=$[_];if(U===void 0)return;if(typeof U!=="string")throw Error(`${Q}.${_} must be one of: ${W.join(", ")}`);for(let Z of W)if(U===Z)return Z;throw Error(`${Q}.${_} must be one of: ${W.join(", ")}`)}function g0($,_){return{useSingleRequestParameter:u$($,"useSingleRequestParameter",_),stringEnums:u$($,"stringEnums",_),enumUnknownDefaultCase:u$($,"enumUnknownDefaultCase",_),modelPropertyNaming:l0($,"modelPropertyNaming",EW,_),paramNaming:l0($,"paramNaming",KW,_),enumPropertyNaming:l0($,"enumPropertyNaming",BW,_),sortModelPropertiesByRequiredFlag:u$($,"sortModelPropertiesByRequiredFlag",_),sortParamsByRequiredFlag:u$($,"sortParamsByRequiredFlag",_)}}function GT($,_){let W=u$($,"dto",_),Q=u$($,"dtos",_);if(W!==void 0&&Q!==void 0&&W!==Q)throw Error(`${_}.dto conflicts with ${_}.dtos. Use only one DTO option.`);return Q??W}function OT($,_){let W=l0($,"type",$8,_);if(!W)throw Error(`${_}.type must be one of: ${$8.join(", ")}`);if(W===S.AsyncApiNats)return h$($,_T,_),{type:W,prefix:_W($,"prefix",_)};if(W===S.TypeScriptNestJs)return h$($,WT,_),{type:W,...g0($,_),dtos:GT($,_),zod:u$($,"zod",_)};if(W===S.TypeScriptAngular)return h$($,QT,_),{type:W,...g0($,_),providedIn:_W($,"providedIn",_)};if(W===S.TypeScriptModels)return h$($,UT,_),{type:W,...g0($,_)};return h$($,Q9,_),{type:W,...g0($,_)}}function MT($,_){let W=i1($,_);h$(W,$T,_);let Q=OT(i1(W.generator,`${_}.generator`),`${_}.generator`);return{name:t0(W,"name",_),output:t0(W,"output",_),generator:Q}}function JT($,_){let W=i1($,_);h$(W,eY,_);let Q=U9(W.targets,`${_}.targets`).map((U,Z)=>MT(U,`${_}.targets[${Z}]`));return{name:t0(W,"name",_),input:t0(W,"input",_),targets:Q}}function WW($,_){let W=new Set;for(let Q of $){if(W.has(Q.name))throw Error(`Duplicate ${_} name '${Q.name}'`);W.add(Q.name)}}function YT($){let _=tY($),W=i1(_,"sumr.yaml"),Q=i1(W.kontract,"kontract");XT(Q),h$(Q,["sources"],"kontract");let U=U9(Q.sources,"kontract.sources").map((X,G)=>JT(X,`kontract.sources[${G}]`));WW(U,"source");let Z=U.flatMap((X)=>X.targets);return WW(Z,"target"),{sources:U}}function TT($){let _=oY($,f6);if(!rY(_))throw Error(`${f6} not found. Define kontract.sources[].targets[]`);let W=sY(_,"utf8");return YT(W)}function QW($,_,W){if(W&&!W.startsWith("-"))return $[_]=W,!0;return $[_]=!0,!1}function zT($,_,W,Q){if($.startsWith("--")){let U=$.indexOf("=");if(U!==-1)return W[$.slice(2,U)]=$.slice(U+1),!1;return QW(W,$.slice(2),_)}if($.startsWith("-")&&$.length===2)return QW(W,$.slice(1),_);return Q.push($),!1}function a8($){let _={},W=[];for(let Q=0;Q<$.length;Q+=1){let U=$[Q];if(!U)continue;if(zT(U,$[Q+1],_,W))Q+=1}return{positionals:W,options:_}}function X1($,_){for(let W of _){let Q=$[W];if(typeof Q==="string")return Q}return}function M1($,_){return _.some((W)=>$[W]===!0)}function e8($,_){if(_.length===0)return 0;return o("sumr kontract"),L$(`Use \`sumr kontract ${$}\` with flags only.`),1}function Z9(){try{return TT(process.cwd())}catch($){let _=$ instanceof Error?$.message:String($);return o("sumr kontract"),L$(`Kontract config error: ${_}`),null}}async function LT($){let _=a8($.argv.slice(1)),W=e8("generate",_.positionals);if(W!==0)return W;let Q=process.env.CI==="true",U=Z9();if(!U)return 1;let Z=M1(_.options,["quiet"])||Q;if(!Z)o("sumr kontract");let{runGenerate:X}=await Promise.resolve().then(()=>(SY(),a5));return X({config:U,concurrency:Number(X1(_.options,["max-concurrent","concurrency","c"])??A8),source:X1(_.options,["source"]),target:X1(_.options,["target"]),specific:X1(_.options,["specific","s"]),clean:M1(_.options,["clean"]),verbose:M1(_.options,["verbose"]),quiet:Z})}async function VT($){let _=a8($.argv.slice(1)),W=e8("init",_.positionals);if(W!==0)return W;let Q=process.env.CI==="true",U=M1(_.options,["quiet"])||Q,Z=M1(_.options,["json"]);if(!U&&!Z)o("sumr kontract");return iY({cwd:process.cwd(),json:Z,quiet:U})}async function ET($){let _=a8($.argv.slice(1)),W=e8("validate",_.positionals);if(W!==0)return W;let Q=process.env.CI==="true",U=Z9();if(!U)return 1;let Z=M1(_.options,["quiet"])||Q;if(!Z)o("sumr kontract");let{runValidate:X}=await Promise.resolve().then(()=>(hY(),W9));return X({config:U,concurrency:Number(X1(_.options,["concurrency","c"])??A8),source:X1(_.options,["source"]),target:X1(_.options,["target"]),verbose:M1(_.options,["verbose"]),quiet:Z})}var PU,bU=($)=>$,UW=($,_)=>{for(var W in _)PU($,W,{get:_[W],enumerable:!0,configurable:!0,set:gU.bind(_,W)})},L=($,_)=>()=>($&&(_=$($=0)),_),w6="biome",A8,f6="sumr.yaml",xU="SUMR_CACHE_DIR",ZW=".sumr-cache",XW="kontract",uU="manifests",hU="bundle-cache",dU="source-cache",GW=1,OW="KONTRACT_DISABLE_WORKERS",lU="KONTRACT_FORCE_MAIN_THREAD",D6="0.0.0",cU="activations.json",N6="kontract",nU=".git/info/exclude",y6="Run `sumr playbook sync` to install Kontract AI guidance into your AI tools.",mU="**/*.openapi.{yml,yaml}",pU="**/*.asyncapi.{yml,yaml}",iU="_bundle.yml",rU="@redocly/cli@2.28.1",sU="KONTRACT_DISABLE_REDOCLY_CORE",oU="application/json",tU="*/*",MW,JW,YW,TW,AW,HW="openapi:",aU="asyncapi:",CW=".dto.ts",eU="index.ts",$Z="shared.ts",H8="index.ts",zW="shared",LW="<auto-generated>",VW,r,S,$8,EW,KW,BW,A$,t,p$,v0=null,a0,IW,e0,B8,dW,cZ="sha256:",lW,cW,n1=null,k0=null,nW,U1,nZ,CX,VX=()=>{},P6=2,gX=150,U8,b6,vX,Q5,R1,U5,cX=`export interface IMsgContext {
|
|
180
|
+
userId: string;
|
|
181
|
+
orgId: string;
|
|
182
|
+
}`,nX=`export interface IRouteContract<Req, Res> {
|
|
183
|
+
request: Req;
|
|
184
|
+
response: Res;
|
|
185
|
+
}`,mX=`export type IRouteContracts = Record<
|
|
186
|
+
string,
|
|
187
|
+
IRouteContract<unknown, unknown>
|
|
188
|
+
>;`,pX=`export interface IRawClientProxy {
|
|
189
|
+
emit<TResult = unknown, TInput = unknown>(
|
|
190
|
+
router: unknown,
|
|
191
|
+
message: TInput,
|
|
192
|
+
...extra: unknown[]
|
|
193
|
+
): Observable<TResult>;
|
|
194
|
+
send<TResult = unknown, TInput = unknown>(
|
|
195
|
+
router: unknown,
|
|
196
|
+
message: TInput,
|
|
197
|
+
...extra: unknown[]
|
|
198
|
+
): Observable<TResult>;
|
|
199
|
+
}`,iX=`export interface IClientProxy<
|
|
200
|
+
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> } = IRouteContracts,
|
|
201
|
+
> {
|
|
202
|
+
emit<Route extends keyof TRoutes & string>(
|
|
203
|
+
router: Route,
|
|
204
|
+
message: TRoutes[Route]['request'],
|
|
205
|
+
ctx?: IMsgContext,
|
|
206
|
+
): Observable<TRoutes[Route]['response']>;
|
|
207
|
+
send<Route extends keyof TRoutes & string>(
|
|
208
|
+
router: Route,
|
|
209
|
+
message: TRoutes[Route]['request'],
|
|
210
|
+
ctx?: IMsgContext,
|
|
211
|
+
): Observable<TRoutes[Route]['response']>;
|
|
212
|
+
emit<Res, Req, Route extends string = string>(
|
|
213
|
+
router: Exclude<Route, keyof TRoutes & string>,
|
|
214
|
+
message: Req,
|
|
215
|
+
ctx?: IMsgContext,
|
|
216
|
+
): Observable<Res>;
|
|
217
|
+
send<Res, Req, Route extends string = string>(
|
|
218
|
+
router: Exclude<Route, keyof TRoutes & string>,
|
|
219
|
+
message: Req,
|
|
220
|
+
ctx?: IMsgContext,
|
|
221
|
+
): Observable<Res>;
|
|
222
|
+
}`,rX=`class RouteTypedClientProxy<
|
|
223
|
+
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
|
|
224
|
+
> implements IClientProxy<TRoutes> {
|
|
225
|
+
constructor(private readonly client: IRawClientProxy) {}
|
|
226
|
+
|
|
227
|
+
emit<Route extends keyof TRoutes & string>(
|
|
228
|
+
router: Route,
|
|
229
|
+
message: TRoutes[Route]['request'],
|
|
230
|
+
ctx?: IMsgContext,
|
|
231
|
+
): Observable<TRoutes[Route]['response']>;
|
|
232
|
+
emit<Res, Req, Route extends string = string>(
|
|
233
|
+
router: Exclude<Route, keyof TRoutes & string>,
|
|
234
|
+
message: Req,
|
|
235
|
+
ctx?: IMsgContext,
|
|
236
|
+
): Observable<Res>;
|
|
237
|
+
emit<TResult = unknown, TInput = unknown>(
|
|
238
|
+
router: string,
|
|
239
|
+
message: TInput,
|
|
240
|
+
ctx?: IMsgContext,
|
|
241
|
+
): Observable<TResult> {
|
|
242
|
+
return this.client.emit<TResult, TInput>(router, message, ctx);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
send<Route extends keyof TRoutes & string>(
|
|
246
|
+
router: Route,
|
|
247
|
+
message: TRoutes[Route]['request'],
|
|
248
|
+
ctx?: IMsgContext,
|
|
249
|
+
): Observable<TRoutes[Route]['response']>;
|
|
250
|
+
send<Res, Req, Route extends string = string>(
|
|
251
|
+
router: Exclude<Route, keyof TRoutes & string>,
|
|
252
|
+
message: Req,
|
|
253
|
+
ctx?: IMsgContext,
|
|
254
|
+
): Observable<Res>;
|
|
255
|
+
send<TResult = unknown, TInput = unknown>(
|
|
256
|
+
router: string,
|
|
257
|
+
message: TInput,
|
|
258
|
+
ctx?: IMsgContext,
|
|
259
|
+
): Observable<TResult> {
|
|
260
|
+
return this.client.send<TResult, TInput>(router, message, ctx);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function createRouteTypedClientProxy<
|
|
265
|
+
TRoutes extends { [K in keyof TRoutes]: IRouteContract<unknown, unknown> },
|
|
266
|
+
>(client: IRawClientProxy): IClientProxy<TRoutes> {
|
|
267
|
+
return new RouteTypedClientProxy<TRoutes>(client);
|
|
268
|
+
}`,sX=`export interface CommandReturnType {
|
|
269
|
+
commandId: string;
|
|
270
|
+
}`,Z5,oX,s=()=>{},W$,$G,LG,IG,NG,xG,_O,X8,YO,AO,x0,K$,L5,m1,P8,t1,V5,G8,HO,T1,RO,SO,jO,q5,g8,xO,Y2,f5,eO,Z$,m,E1,a1,P5,A1,$M,TM,g5,VM,BM,xM,nM="${",A2,aM,GJ="unknown_default_open_api",m5,p5,VJ,qJ,h0=null,o5=()=>{},NJ,d0,eJ,a5,SY,T8,qY,W9,hY,aY,eY,$T,_T,WT,Q9,QT,UT,AT,HT,CT,KT;var G9=f2(()=>{v();v();v();v();v();PU=Object.defineProperty;r=L(()=>{A8=Math.max(vU().length-1,2),MW=/^application\/.+\+json$/i,JW=["200","201","202","204"],YW=["201","200","202","204"],TW=/^2\d\d$/,AW=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"]),VW=[`// ${LW}`,"// 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
|
+
`)}),p$=L(()=>{S={AsyncApiNats:"asyncapi-nats",TypeScriptAngular:"typescript-angular",TypeScriptAxios:"typescript-axios",TypeScriptFetch:"typescript-fetch",TypeScriptModels:"typescript-models",TypeScriptNestJs:"typescript-nestjs"},$8=[S.TypeScriptNestJs,S.AsyncApiNats,S.TypeScriptFetch,S.TypeScriptAxios,S.TypeScriptAngular,S.TypeScriptModels],EW=["camelCase","PascalCase","snake_case","original"],KW=["camelCase","PascalCase","snake_case","original"],BW=["PascalCase","camelCase","snake_case","UPPERCASE","original"],A$={AsyncApi:"asyncapi",ContractLink:"contract-link",OpenApi:"openapi"},t={Http:"http",Models:"models",Nats:"nats",Sdk:"sdk"}});a0=L(()=>{r()});e0=L(()=>{r(),IW={$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"}}}});B8=L(()=>{r()});nW=L(()=>{B8(),r(),dW=/\$ref\s*:\s*['"]?([^'"\s#]+(?:#[^'"\s]+)?|#[^'"\s]+)['"]?/g,lW=new URL("../../package.json",import.meta.url),cW=["src/generators/**/*.ts","src/shared/**/*.ts","src/cli/generate*.ts"]}),nZ=L(()=>{U1={Failed:"failed",Generated:"generated",Unchanged:"unchanged"}});CX=L(()=>{p$()});vX=L(()=>{r(),U8=Promise.resolve()});Q5=L(()=>{r()}),U5=L(()=>{R1={AsyncApiNats:"asyncapi-nats",OpenApiNestJs:"openapi-nestjs",OpenApiSdk:"openapi-sdk"}}),oX=L(()=>{Z5=["import { Observable } from 'rxjs';","",cX,"",nX,"",mX,"",pX,"",iX,"",rX,"",sX].join(`
|
|
272
|
+
`)});$G=L(()=>{W$={Command:"command",Event:"event",Query:"query"}});LG=L(()=>{s(),$G()});IG=L(()=>{s()});NG=L(()=>{r(),a0(),e0(),oX(),s(),LG(),IG()});xG=L(()=>{s()});_O=L(()=>{s()});YO=L(()=>{s(),_O(),X8={addDtoImport:y8,addEnumImport:N8,emitHelperDto:k8}});AO=L(()=>{s()}),t1=L(()=>{x0={V3_0:"3.0",V3_1:"3.1",V3_2:"3.2"},K$={Array:"array",Enum:"enum",Object:"object",Ref:"ref",Scalar:"scalar",Unknown:"unknown"},L5={Boolean:"boolean",Integer:"integer",Number:"number",String:"string"},m1={Body:"body",Path:"path",Query:"query",Schema:"schema"},P8={Operation:"operation",Schema:"schema"}}),HO=L(()=>{V5=["get","post","put","patch","delete","options","head","trace"],G8={Params:"Params",Query:"Query"}});T1=L(()=>{t1()});RO=L(()=>{t1(),T1()});SO=L(()=>{s()});jO=L(()=>{t1()});q5=L(()=>{s(),t1(),RO(),SO(),jO(),T1()});g8=L(()=>{r(),T1()});xO=L(()=>{s(),t1(),HO(),q5(),T1(),g8()});Y2=L(()=>{T1()});f5=L(()=>{xO(),q5(),T1(),Y2()});eO=L(()=>{s()});a1=L(()=>{Z$={Delete:"delete",Get:"get",Patch:"patch",Post:"post",Put:"put"},m={Path:"path",Query:"query"},E1={Array:"Array",Boolean:"Boolean",Number:"Number",Object:"Object",String:"String"}});P5=L(()=>{r(),a1(),T1()}),$M=L(()=>{A1={Parameters:"parameters",RequestBodies:"requestBodies",Responses:"responses",Schemas:"schemas"}});TM=L(()=>{s(),a1(),$M(),g8()});VM=L(()=>{s(),a1(),P5(),TM(),g5=[Z$.Get,Z$.Post,Z$.Put,Z$.Patch,Z$.Delete]});BM=L(()=>{VM()});xM=L(()=>{r(),a0(),e0(),s(),xG(),YO(),AO(),f5(),Y2(),eO(),BM()});A2=L(()=>{r(),p$()});aM=L(()=>{p$(),a1(),A2()});m5=L(()=>{s(),A2()});VJ=L(()=>{s(),a1(),g8(),P5(),A2(),m5(),p5=[Z$.Get,Z$.Post,Z$.Put,Z$.Patch,Z$.Delete]});qJ=L(()=>{a0(),e0(),p$(),f5(),Y2(),aM(),A2(),m5(),VJ()});NJ=L(()=>{NG(),xM(),qJ(),U5(),o5()});eJ=L(()=>{r(),vX(),nW(),Q5(),p$(),U5(),B8(),NJ(),d0=new Map}),a5={};UW(a5,{runGenerate:()=>BY});SY=L(()=>{r(),a0(),e0(),nW(),nZ(),p$(),CX(),VX(),B8(),eJ(),o5()}),qY=L(()=>{T8={Failed:"failed",Passed:"passed"}}),W9={};UW(W9,{runValidate:()=>uY});hY=L(()=>{Y2(),Q5(),qY(),p$()});r();r();p$();r();aY=["input","output","natsPrefix"],eY=["name","input","targets"],$T=["name","output","generator"],_T=["type","prefix"],WT=["type","dto","dtos","zod","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag"],Q9=["type","useSingleRequestParameter","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","paramNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag","sortParamsByRequiredFlag"],QT=[...Q9,"providedIn"],UT=["type","stringEnums","enumUnknownDefaultCase","modelPropertyNaming","enumPropertyNaming","sortModelPropertiesByRequiredFlag"];AT={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"]},HT={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"]},CT={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"]};KT=g1({name:"kontract",description:"Generate and validate API contract code",group:"modules",visibility:"public",commands:[q({name:"init",description:"Activate Kontract AI guidance for this workspace",group:"modules",visibility:"public",help:HT,execute:VT}),q({name:"generate",description:"Generate TypeScript contracts from API specs",group:"modules",visibility:"public",help:AT,execute:LT}),q({name:"validate",description:"Validate API specifications",group:"modules",visibility:"public",help:CT,execute:ET})]})});var t9={};E_(t9,{missionModule:()=>W4});import{createHash as BT}from"crypto";import{existsSync as RT}from"fs";import{homedir as ST}from"os";import{join as s$}from"path";import{spawnSync as eT}from"child_process";import{createHash as QA}from"crypto";import{existsSync as OA,readFileSync as MA}from"fs";import{dirname as I9,join as JA}from"path";import{z as H}from"zod";import{createHash as IA}from"crypto";import{existsSync as CH,readFileSync as zH,writeSync as LH}from"fs";import{join as VH}from"path";import{existsSync as q2,mkdirSync as I2,readdirSync as SH,readFileSync as P9,rmSync as b9,writeFileSync as J9}from"fs";import{basename as qH,join as H1}from"path";import{existsSync as sH,mkdirSync as oH,readFileSync as tH,writeFileSync as aH}from"fs";import{dirname as eH}from"path";import{mkdirSync as r9,readFileSync as B3,writeFileSync as s9}from"fs";import{join as O0}from"path";import{spawnSync as z_}from"child_process";import{mkdirSync as P3,readFileSync as b3,writeFileSync as g3}from"fs";import{join as z9}from"path";function N1($,_){let W=eT("git",[..._],{cwd:$,stdio:"pipe",encoding:"utf8"});if(W.status!==0)return;return W.stdout.trim()||void 0}function $A($){return N1($,["rev-parse","--show-toplevel"])}function G_($){return N1($,["branch","--show-current"])}function _A($){return N1($,["rev-parse","--short=12","HEAD"])}function O_($){return N1($,["config","--get","remote.origin.url"])}function WA($){let _=N1($,["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]);if(_?.startsWith("origin/"))return _.slice(7);return N1($,["config","--get","init.defaultBranch"])}function V2($){let _=$.map((W)=>W.trim().toUpperCase()).filter((W)=>S9.test(W));return[...new Set(_)]}function q9($){return $.map((_)=>_.trim()).filter((_)=>_.length>0&&!S9.test(_.toUpperCase()))}function W_($){let _=V2($);return _.length>0?_:[...UA]}function E2($){let _=$.issueKey.trim();if(!_)return{ok:!1,message:"Mission issue key cannot be empty."};let W=W_($.prefixes);if(W.some((U)=>new RegExp(`^${GA(U)}-[0-9]+$`).test(_)))return{ok:!0,issueKey:_};if($.allowCustomKey&&ZA.test(_))return{ok:!0,issueKey:_};return{ok:!1,message:`Mission issue key "${_}" does not match configured prefixes (${W.join(", ")}). Use --allow-custom-key for a slug.`}}function XA($){let _=$.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80),W=QA("sha256").update($).digest("hex").slice(0,8);return`${_||"mission"}--${W}`}function GA($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function BA($,_){return M_(TA,$,_)}function RA($,_){return M_(EA,$,_)}function SA($,_){return M_(KA,$,_)}function M_($,_,W){let Q=$.safeParse(_);if(Q.success)return Q.data;throw Error(qA(W,Q.error))}function qA($,_){let W=_.issues.map((Q)=>{return`${Q.path.length>0?Q.path.join("."):"<root>"}: ${Q.message}`}).join("; ");return`${$} is not valid Mission data: ${W}`}function f9($){return M0(V9,$)}function D9($){return M0(L9,$)}function J_($){return M0(X_,$)}function jA($){return M0(K9,$)}function FA($){return M0(E9,$)}function M0($,_){return $.some((W)=>W===_)}function Q_($){let _=wA.find((W)=>W.id===$);if(_)return _;throw Error(`Unknown Mission action: ${$}`)}function fA($){let _=R2($.flow);if(_.length>0)throw Error(_.join(`
|
|
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"),J9($,P9(W,"utf8"),"utf8"),b9(W,{force:!0})}function Y9($){if(!q2($))return[];return SH($,{withFileTypes:!0}).filter((_)=>_.isDirectory()).map((_)=>H1($,_.name))}function NH($){return $.slice(0,$.length-qH($).length-1)}function e($){return BH($.argv.slice(1))}function k($){return z$($,"json")}function P($){LH(1,`${JSON.stringify($,null,2)}
|
|
275
|
+
`)}function d9($){return!k($)&&E0()}function e$($,_,W){if(!W)return X$("Missing issue key.",`sumr mission ${$.argv[0]??"<command>"} <issueKey>`),{ok:!1,code:1};let Q=l(),U=E2({issueKey:W,prefixes:Q.config.issuePrefixes,allowCustomKey:z$(_,"allow-custom-key")});if(!U.ok)return g(U.message),{ok:!1,code:1};return{ok:!0,issueKey:U.issueKey}}function T_($,_){let W=l(),Q=C1(W,$);if(Q)return Q;return g9(W,$,_??$)}function A_($){return`${$.issueKey.padEnd(12)} ${$.status.padEnd(12)} ${$.nextAction}`}function yH($,_={}){let W=[`Mission: ${$.issueKey}`,`Title: ${$.title}`,`Status: ${$.status}`,`Repo: ${$.repoLabel} (${$.repoId})`,`Next: ${$.nextAction}`];if(kH(W,$,_.currentBranch),$.plan)W.push(`Plan: ${$.plan.latestPath}${$.plan.approved?" (approved)":" (pending approval)"}`);if($.claim)PH(W,$.claim);if($.blocker)W.push(`Blocker: ${$.blocker.reason}`);if($.flow)W.push(`Flow: ${$.flow.preset} (${$.flow.hash})`),W.push(`Flow steps: ${B2($.flow)}`);return bH(W,$),gH(W,$),W.join(`
|
|
276
|
+
`)}function kH($,_,W){if(W)$.push(`Current branch: ${W}`);if(_.branch)$.push(`Mission branch: ${_.branch}`);if(_.sourceSha)$.push(`Mission source SHA: ${_.sourceSha}`);let Q=_.claim?.branch??_.branch;if(Q&&W&&W!==Q)$.push(`Branch warning: current branch ${W} does not match mission branch ${Q}. Switch to the recorded branch or intentionally reclaim the mission before implementation or PR creation.`)}function PH($,_){let W=[`${_.agent} at ${_.startedAt}`];if(_.branch)W.push(`branch ${_.branch}`);if(_.sourceSha)W.push(`sha ${_.sourceSha}`);$.push(`Claim: ${W.join(", ")}`)}function bH($,_){if(!(_.pr?.latestPath||_.pr?.url))return;if($.push("PR:"),_.pr.latestPath)$.push(` preview: ${_.pr.latestPath}`);if(_.pr.url)$.push(` url: ${_.pr.url}`)}function gH($,_){let W=Object.entries(_.reports);if(W.length===0)return;$.push("Reports:");for(let[Q,U]of W)$.push(` ${Q}: ${U}`)}function X$($,_){g($,{title:"Usage",details:_})}function g($,_={}){L$($,_)}function vH($){let _={[b.Blocked]:0,[b.Planning]:1,[b.Planned]:2,[b.InProgress]:3,[b.Review]:4,[b.Validated]:5};return[...$].sort((W,Q)=>{let U=(_[W.status]??99)-(_[Q.status]??99);if(U!==0)return U;return Q.updatedAt.localeCompare(W.updatedAt)})[0]}function H_($,_){return`${lH()}-${$.issuePathKey}.${_}.md`}function xH($,_){return`# Mission Plan: ${$}
|
|
277
|
+
|
|
278
|
+
## Objective
|
|
279
|
+
|
|
280
|
+
${_}
|
|
281
|
+
|
|
282
|
+
## Implementation Plan
|
|
283
|
+
|
|
284
|
+
- TODO: describe the intended implementation.
|
|
285
|
+
|
|
286
|
+
## Verification
|
|
287
|
+
|
|
288
|
+
- TODO: list required checks.
|
|
289
|
+
`}function uH($,_){return`# ${l9($)} Report: ${_.issueKey}
|
|
290
|
+
|
|
291
|
+
## Summary
|
|
292
|
+
|
|
293
|
+
TODO: summarize the ${$} result.
|
|
294
|
+
|
|
295
|
+
## Evidence
|
|
296
|
+
|
|
297
|
+
- Mission: ${_.missionId}
|
|
298
|
+
- Status before report: ${_.status}
|
|
299
|
+
|
|
300
|
+
## Next Steps
|
|
301
|
+
|
|
302
|
+
- ${_.nextAction}
|
|
303
|
+
`}function hH($){for(let _ of[".github/pull_request_template.md",".github/PULL_REQUEST_TEMPLATE.md","pull_request_template.md","PULL_REQUEST_TEMPLATE.md"]){let W=VH($,_);if(CH(W))return zH(W,"utf8")}return}function dH($){return R9.includes($)}function l9($){return`${$.charAt(0).toUpperCase()}${$.slice(1)}`}function lH(){return new Date().toISOString().replace(/[:.]/g,"-")}function cH($){let{positionals:_,options:W}=e($),Q=_[0],U=l();if(!Q||Q===U0.SHOW)return Promise.resolve(nH(U,W));if(Q===U0.LIST)return Promise.resolve(mH(W));if(Q===U0.VALIDATE)return Promise.resolve(pH(U,W));if(Q===U0.EXPORT)return Promise.resolve(iH(U,W));if(Q===U0.USE)return Promise.resolve(rH(U,W,_[1]));return X$(`Unknown flow command: ${Q}`,"sumr mission flow <list|show|use|validate|export>"),Promise.resolve(1)}function nH($,_){let W=R2($.config.flow);if(W.length>0){if(k(_))P({ok:!1,errors:W});else q$(W,"Mission flow errors");return 1}let Q=K2($.config);if(k(_))P({ok:!0,preset:Q.preset,hash:Q.hash,steps:Q.steps,errors:W});else S$([`Preset: ${Q.preset}`,`Hash: ${Q.hash}`,`Flow: ${B2(Q)}`].join(`
|
|
304
|
+
`),"Mission Flow");return 0}function mH($){if(k($))P({ok:!0,presets:G0});else q$(G0,"Mission flow presets");return 0}function pH($,_){let W=R2($.config.flow);if(k(_))P({ok:W.length===0,errors:W});else if(W.length===0)y("Mission flow is valid.");else q$(W,"Mission flow errors");return W.length===0?0:1}function iH($,_){let W=R2($.config.flow);if(W.length>0){if(k(_))P({ok:!1,errors:W});else q$(W,"Mission flow errors");return 1}let Q=K2($.config);return P({ok:!0,preset:Q.preset,hash:Q.hash,text:B2(Q),steps:Q.steps}),0}function rH($,_,W){if(!W||!J_(W))return X$("Missing or invalid flow preset.",`sumr mission flow use <preset>
|
|
305
|
+
Allowed: ${G0.join(", ")}`),1;if(!$.sumrConfigPath)return g("No sumr.yaml found. Run Mission inside a SUMR repo to set a repo flow."),1;y9($.sumrConfigPath,W);let Q=l(),U=K2(Q.config);if(k(_))P({ok:!0,preset:U.preset,hash:U.hash,steps:U.steps});else y(`Mission flow set: ${U.preset}`,{title:"Flow",fields:[{label:"Flow",value:B2(U)}]});return 0}function $3($){let _=$.trim().toLowerCase();return jA(_)?_:void 0}function c9($){if(!$)return"not configured";return C_.find((_)=>_.value===$)?.label??$}function n9($){if(!$)return;let _=$.toLowerCase();if(_.includes("github.com"))return d.Github;if(_.includes("gitlab.com"))return d.Gitlab;if(_.includes("bitbucket.org"))return d.Bitbucket;if(_.includes("dev.azure.com")||_.includes("visualstudio.com"))return d.AzureDevops;if(_.includes("gitea"))return d.Gitea;if(_.includes("codeberg.org"))return d.Codeberg;return}function m9($){let _=j2.find((W)=>W.value===$);if(!_)throw Error(`Unsupported mission tracker: ${$}`);return _}function p9($){let _=$.trim().toLowerCase();return FA(_)?_:void 0}function T9($,_,W){let Q=_3.exec($);if(!Q)return{ok:!1,message:W};return{ok:!0,issueKey:`${_}-${Q[1]}`}}function A9($,_){let W=$.toUpperCase();if(!W3.test(W))return{ok:!1,message:`Enter a ${_} like PROJECT-123.`};return{ok:!0,issueKey:W}}function Q3($){let _=$.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80);if(_.length<2)return{ok:!1,message:"Enter at least two letters or numbers."};return{ok:!0,issueKey:_}}function U3($,_){if($===u.Github)return T9(_,"GH","Enter a GitHub issue number like 123 or #123.");if($===u.Gitlab)return T9(_,"GL","Enter a GitLab issue IID like 123 or #123.");if($===u.Jira)return A9(_,"Jira ticket key");if($===u.Linear)return A9(_,"Linear issue identifier");if($===u.AzureBoards){let W=_.match(/^(?:AB#?|work item\s+)?([0-9]+)$/i);if(W?.[1])return{ok:!0,issueKey:`AB-${W[1]}`}}return}function Z_($,_){let W=_.trim();if(!W)return{ok:!1,message:"Enter a mission ID."};return U3($,W)??Q3(W)}async function Z3($){let{options:_}=e($),W=l(),Q=await C3(_,W);if(!Q.ok)return Q.code;if(W.sumrConfigPath)X3(W.sumrConfigPath,Q.config);let U=y1(W);C0("mission",{cwd:W.cwd});let Z=HH(W),X=G3(W,Z),G={context:W,config:Q.config,root:U,excludePath:Z,excludeUpdated:X,playbookSyncRecommended:W.storageScope===D1.Repo};if(k(_))O3(G);else M3(G);return 0}function X3($,_){if(_.tracker)nA($,_.tracker);if(_.gitProvider)mA($,_.gitProvider);if(_.flowPreset)y9($,_.flowPreset);if(_.prefixes.length>0)cA($,_.prefixes)}function G3($,_){if(!(_&&$.storageScope===D1.Repo))return!1;oH(eH(_),{recursive:!0});let W=[".sumr-cache/mission/",".sumr-cache/activations.json"],Q=sH(_)?tH(_,"utf8"):"",U=Q.split(/\r?\n/),Z=W.filter((X)=>!U.includes(X));if(Z.length===0)return!1;return aH(_,`${Q.trimEnd()}
|
|
306
|
+
${Z.join(`
|
|
307
|
+
`)}
|
|
308
|
+
`,"utf8"),!0}function O3($){let{context:_,config:W}=$;P({ok:!0,root:$.root,baseDir:_.baseDir,excludePath:$.excludePath,excludeUpdated:$.excludeUpdated,tracker:W.tracker??_.config.tracker?.provider,gitProvider:W.gitProvider??_.config.git?.provider,flowPreset:W.flowPreset??_.config.flow?.preset??T$.Basic,issuePrefixes:W.prefixes.length>0?W.prefixes:_.config.issuePrefixes,playbookSyncRecommended:$.playbookSyncRecommended})}function M3($){let{context:_,config:W}=$;y("Mission initialized",{title:"Storage",fields:[{label:"Root",value:_.baseDir},{label:"Repo",value:`${_.repoLabel} (${_.repoId})`},{label:"Work item source",value:E3(W.tracker??_.config.tracker?.provider)},{label:"Git provider",value:c9(W.gitProvider??_.config.git?.provider)},{label:"Flow",value:W.flowPreset??_.config.flow?.preset??T$.Basic},{label:"Ticket prefixes",value:K3(W.prefixes.length>0?W.prefixes:_.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 J3($){let _=n($,"tracker")??n($,"provider"),W=_?p9(_):void 0;if(_&&!W)return X$(`Unsupported tracker: ${_}`,`Allowed trackers: ${j2.map((Q)=>Q.value).join(", ")}`),t$;return W}function Y3($){let _=n($,"git-provider"),W=_?$3(_):void 0;if(_&&!W)return X$(`Unsupported git provider: ${_}`,`Allowed git providers: ${C_.map((Q)=>Q.value).join(", ")}`),t$;return W}function T3($){let _=n($,"flow"),W=G0.find((Q)=>Q===_);if(_&&!W)return X$(`Unsupported flow preset: ${_}`,`Allowed flow presets: ${G0.join(", ")}`),t$;return W}function A3($){let _=RH($,"prefix");if(_.length>0){let W=q9(_);if(W.length>0)return g(`Invalid issue prefix${W.length===1?"":"es"}: ${W.join(", ")}. Prefixes must start with a letter and contain only letters or numbers.`),t$}return _}function H3($){let _=J3($);if(_===t$)return{error:!0};let W=Y3($);if(W===t$)return{error:!0};let Q=T3($);if(Q===t$)return{error:!0};let U=A3($);if(U===t$)return{error:!0};return{tracker:_,gitProvider:W,flowPreset:Q,prefixes:U}}async function C3($,_){let W=H3($);if("error"in W)return{ok:!1,code:1};if(W.tracker||W.gitProvider||W.flowPreset||W.prefixes.length>0)return{ok:!0,config:{tracker:W.tracker,gitProvider:W.gitProvider,flowPreset:W.flowPreset,prefixes:V2(W.prefixes)}};if(!_.sumrConfigPath||_.config.tracker?.provider||z$($,"yes")||!d9($))return{ok:!0,config:{prefixes:[]}};return{ok:!0,config:await z3(_)}}async function z3($){let _=await g$({message:"Where do this repo's work item IDs usually come from?",options:[...j2.map((Z)=>({value:Z.value,label:Z.label,hint:Z.hint})),{value:H9.Skip,label:"Skip for now",hint:"Ask per mission"}],initialValue:u.Github});if(!_||_===H9.Skip)return{prefixes:[]};let W=await L3($),Q=await V3();if(_!==u.Jira&&_!==u.Linear)return{tracker:_,gitProvider:W,flowPreset:Q,prefixes:[]};let U=await v1({message:`${_===u.Jira?"Jira project":"Linear team"} prefixes`,placeholder:"SUM, ENG, OPS",validate:(Z)=>{let X=C9(Z??"");if(X.length===0)return"Enter at least one prefix, like SUM.";let G=q9(X);if(G.length>0)return`Invalid prefix${G.length===1?"":"es"}: ${G.join(", ")}`;return}});if(!U)return{tracker:_,gitProvider:W,flowPreset:Q,prefixes:[]};return{tracker:_,gitProvider:W,flowPreset:Q,prefixes:V2(C9(U))}}async function L3($){let _=n9(O_($.cwd));return await g$({message:"Which git or PR provider should Mission recognize?",options:C_.map((W)=>({value:W.value,label:W.label,hint:W.hint})),initialValue:_??d.GenericGit})}async function V3(){return await g$({message:"Which Mission flow should this repo use?",options:[{value:T$.StandardDelivery,label:"Standard delivery",hint:"Plan, approval, delivery, validation, PR preview"},{value:T$.PlanningOnly,label:"Planning only",hint:"Stop after a reviewable plan"},{value:T$.Basic,label:"Basic",hint:"Current lightweight Mission lifecycle"},{value:T$.FullDelivery,label:"Full delivery",hint:"Richer flow with research, quality gate, and PR assist"}],initialValue:T$.StandardDelivery})}function E3($){if(!$)return"not configured";return m9($).label}function K3($){if($.length===0)return;return $.join(", ")}function C9($){return $.split(/[,\s]+/).map((_)=>_.trim()).filter(Boolean)}function R3($){let{positionals:_,options:W}=e($),Q=l();if(y1(Q),_[0]){let Z=FH(Q,_[0]);if(!Z)return g(`Mission not found: ${_[0]}`),Promise.resolve(1);if(k(W))P({ok:!0,mission:Z});else S$(yH(Z,{currentBranch:G_(Q.cwd)}),"Status");return Promise.resolve(0)}let U=J0(Q,{allRepos:!1});if(k(W))P({ok:!0,storage:Q.baseDir,missions:U});else if(b$("Mission workspace",{title:"Storage",fields:[{label:"Root",value:Q.baseDir},{label:"Repo",value:`${Q.repoLabel} (${Q.repoId})`}]}),U.length===0)b$("No missions found.");else q$(U.map(A_),"Missions");return Promise.resolve(0)}function S3($){let{options:_}=e($),W=l();y1(W);let Q=z$(_,"all"),U=J0(W,{allRepos:Q});if(k(_))P({ok:!0,missions:U});else if(U.length===0)b$("No missions found.");else q$(U.map(A_),Q?"All missions":"Missions");return Promise.resolve(0)}function q3($){let{options:_}=e($),W=l();y1(W);let Q=J0(W,{allRepos:z$(_,"all")}).filter((Z)=>Z.status!==b.Closed),U=vH(Q);if(k(_))P({ok:!0,mission:U});else if(!U)b$("No open missions.");else S$(A_(U),"Next mission");return Promise.resolve(0)}function I3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=l(),Z=T_(Q.issueKey),X=a$(U,Q.issueKey),G=O0(X.missionDir,"plans");r9(G,{recursive:!0});let O=n(W,"from"),M=O0(G,H_(Z,"plan")),J=O?B3(O,"utf8"):xH(Z.issueKey,Z.title);s9(M,J,"utf8");let T=z$(W,"approve"),Y=R$(U,{...Z,plan:{latestPath:M,approved:T,approvedAt:T?new Date().toISOString():void 0}});if(k(W))P({ok:!0,mission:Y,planPath:M});else y("Plan written",{title:"Plan",fields:[{label:"Path",value:M},{label:"Next",value:Y.nextAction}]});return Promise.resolve(0)}function j3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=l(),Z=C1(U,Q.issueKey);if(!Z)return g(`Mission not found: ${Q.issueKey}`),Promise.resolve(1);if(!Z.plan)return g("Create a plan before approving this mission."),Promise.resolve(1);if(Z.plan.approved){if(k(W))P({ok:!0,mission:Z,alreadyApproved:!0});else y(`Plan already approved: ${Z.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:Z.plan.latestPath},{label:"Next",value:Z.nextAction}]});return Promise.resolve(0)}let X=R$(U,{...Z,plan:{...Z.plan,approved:!0,approvedAt:new Date().toISOString()}});if(k(W))P({ok:!0,mission:X,alreadyApproved:!1});else y(`Plan approved: ${X.issueKey}`,{title:"Approval",fields:[{label:"Plan",value:X.plan?.latestPath??Z.plan.latestPath},{label:"Next",value:X.nextAction}]});return Promise.resolve(0)}function F3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=l(),Z=C1(U,Q.issueKey);if(!Z)return g(`Mission not found: ${Q.issueKey}`),Promise.resolve(1);if(!Z.plan?.approved)return g("Approve a plan before claiming this mission."),Promise.resolve(1);let X=G_(U.cwd),G=_A(U.cwd),O=n(W,"agent")??process.env.USER??"unknown",M=R$(U,{...Z,branch:X,sourceSha:G,claim:{agent:O,startedAt:new Date().toISOString(),branch:X,sourceSha:G}});if(k(W))P({ok:!0,mission:M});else y(`Mission claimed: ${M.issueKey}`,{title:"Claim",fields:[{label:"Agent",value:O},{label:"Next",value:M.nextAction}]});return Promise.resolve(0)}function w3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=n(W,"type");if(!dH(U))return X$("Missing or invalid report type.",`sumr mission report <issueKey> --type <type>
|
|
309
|
+
Allowed: ${R9.join(", ")}`),Promise.resolve(1);let Z=l(),X=T_(Q.issueKey),G=a$(Z,Q.issueKey),O=k3(U),M=O0(G.missionDir,O);r9(M,{recursive:!0});let J=O0(M,H_(X,U));s9(J,uH(U,X),"utf8");let T=R$(Z,{...X,reports:{...X.reports,[U]:J}});if(k(W))P({ok:!0,mission:T,reportPath:J});else y(`${l9(U)} report written`,{title:"Report",fields:[{label:"Path",value:J},{label:"Next",value:T.nextAction}]});return Promise.resolve(0)}function f3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=n(W,"reason");if(!U)return X$("Missing blocker reason.","sumr mission block <issueKey> --reason <text>"),Promise.resolve(1);let Z=l(),X=T_(Q.issueKey),G=R$(Z,{...X,blocker:{reason:U,blockedAt:new Date().toISOString()}});if(k(W))P({ok:!0,mission:G});else b1(`Mission blocked: ${G.issueKey}`,{title:"Blocker",fields:[{label:"Reason",value:U},{label:"Next",value:G.nextAction}]});return Promise.resolve(0)}function D3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=l(),Z=C1(U,Q.issueKey);if(!Z)return g(`Mission not found: ${Q.issueKey}`),Promise.resolve(1);let X=R$(U,{...Z,blocker:void 0});if(k(W))P({ok:!0,mission:X});else y(`Mission unblocked: ${X.issueKey}`,{title:"Mission",fields:[{label:"Next",value:X.nextAction}]});return Promise.resolve(0)}function N3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Promise.resolve(Q.code);let U=l(),Z=C1(U,Q.issueKey);if(!Z)return g(`Mission not found: ${Q.issueKey}`),Promise.resolve(1);try{let X=wH(U,Z,{force:z$(W,"force")});if(k(W))P({ok:!0,mission:X});else y(`Mission closed: ${X.issueKey}`);return Promise.resolve(0)}catch(X){return g(X instanceof Error?X.message:String(X)),Promise.resolve(1)}}function y3($){let{options:_}=e($),W=Number(n(_,"older-than")??30),Q=z$(_,"dry-run"),U=l();y1(U);let Z=fH(U,{olderThanDays:Number.isFinite(W)?W:30,dryRun:Q});if(k(_))P({ok:!0,dryRun:Q,...Z});else{let X=Q?Z.eligible.length:Z.removed.length,G=Q?Z.eligible:Z.removed;if(y(`${Q?"Eligible":"Removed"} closed mission cache directories: ${X}`),G.length>0)q$(G,Q?"Eligible":"Removed")}return Promise.resolve(0)}function k3($){return $===tT.Handoff?"handoffs":O0("reports",$)}async function x3($){let{positionals:_,options:W}=e($),Q=e$($,W,_[0]);if(!Q.ok)return Q.code;let U=l();if(U.config.git?.prMode===aT.Disabled)return g("PR assist is disabled for this repo by mission.git.prMode."),1;let Z=C1(U,Q.issueKey);if(!Z)return g(`Mission not found: ${Q.issueKey}`),1;let X=u3(W),G=h3(U,W),O=a$(U,Q.issueKey),M=z9(O.missionDir,"prs");P3(M,{recursive:!0});let J=z9(M,H_(Z,"pr")),T=n3(U,Z,G);g3(J,T,"utf8");let Y=R$(U,{...Z,pr:{...Z.pr,latestPath:J,mode:d3(X),updatedAt:new Date().toISOString()}});if(X===H$.Preview)return l3(W,Y,J,T,G),0;let A=await m3(U,Y,J,G,X);if(!A.ok)return A.code;return Y=R$(U,{...Y,pr:{...Y.pr,url:A.url,updatedAt:new Date().toISOString()}}),c3(W,Y,J,A.url),0}function u3($){if(z$($,H$.Create))return H$.Create;if(z$($,H$.CreateDraft))return H$.CreateDraft;return H$.Preview}function h3($,_){let W=n(_,"base")??n(_,"base-branch");if(W)return W;if($.config.git?.baseBranch)return $.config.git.baseBranch;let Q=WA($.cwd);if(!Q)throw Error("Could not resolve a PR base branch. Pass --base <branch> or configure mission.git.baseBranch.");return Q}function d3($){if($===H$.CreateDraft)return $_.Draft;if($===H$.Create)return $_.Ready;return $_.Preview}function l3($,_,W,Q,U){if(k($)){P({ok:!0,mission:_,prPath:W,body:Q});return}y("PR preview written",{title:"Pull Request",fields:[{label:"Path",value:W},{label:"Base branch",value:U},{label:"Next",value:_.nextAction}]})}function c3($,_,W,Q){if(k($)){P({ok:!0,mission:_,prPath:W,url:Q});return}y("Pull request created",{title:"Pull Request",fields:[{label:"URL",value:Q},{label:"Preview",value:W}]})}function n3($,_,W){let Q=hH($.cwd),U=_.issueKey.match(/^(?:GH|GL)-(\d+)$/)?.[1],Z=U?`Refs #${U}`:`Refs ${_.issueKey}`;return`## Summary
|
|
310
|
+
- ${_.title}
|
|
311
|
+
- TODO: summarize the user-facing change.
|
|
312
|
+
- TODO: summarize the main implementation change.
|
|
313
|
+
- ${Z}
|
|
314
|
+
|
|
315
|
+
## Verification
|
|
316
|
+
- TODO: add commands run and results.
|
|
317
|
+
- TODO: add manual or UI checks when relevant.
|
|
318
|
+
|
|
319
|
+
## Scope Review
|
|
320
|
+
- Base branch: \`${W}\`.
|
|
321
|
+
- TODO: list any required support work, or write "None".
|
|
322
|
+
- TODO: split unrelated dependency, audit, tooling, infrastructure, or cleanup changes.
|
|
323
|
+
|
|
324
|
+
## Mission Evidence
|
|
325
|
+
- Mission: \`${_.missionId}\`
|
|
326
|
+
- Plan: ${_.plan?_.plan.approved?"recorded and approved":"recorded, pending approval":"not recorded"}
|
|
327
|
+
- Implementation report: ${_.reports.implementation?"recorded":"not recorded"}
|
|
328
|
+
- Review report: ${_.reports.review?"recorded":"not recorded"}
|
|
329
|
+
- Validation report: ${_.reports.validation?"recorded":"not recorded"}
|
|
330
|
+
- Quality report: ${_.reports.quality?"recorded":"not recorded"}
|
|
331
|
+
|
|
332
|
+
## Risk
|
|
333
|
+
- TODO: document known gaps, skipped checks, and rollback notes.
|
|
334
|
+
${Q?`
|
|
335
|
+
## Repository PR Template
|
|
336
|
+
|
|
337
|
+
${Q.trim()}
|
|
338
|
+
`:""}
|
|
339
|
+
`}async function m3($,_,W,Q,U){let Z=$.config.git?.provider??n9(O_($.cwd));if(Z!==d.Github&&Z!==d.Gitlab)return g(`PR creation is only implemented for GitHub and GitLab in V1. Current provider: ${c9(Z)}.`),{ok:!1,code:1};let X=G_($.cwd);if(!X||o3(X))return g(`Refusing to create a PR from protected or empty branch: ${X??"(none)"}`),{ok:!1,code:1};let G=s3(_);if(G&&X!==G)return g(`Refusing to create a PR from branch ${X} because mission ${_.issueKey} is recorded on branch ${G}. Switch to ${G}, or intentionally reclaim the mission on ${X} before creating the PR.`),{ok:!1,code:1};if(!await r3(U,X,Q))return{ok:!1,code:1};let M=z_("git",["push","-u","origin",X],{cwd:$.cwd,stdio:"pipe",encoding:"utf8"});if(M.status!==0)return g(`Could not push branch before PR creation.
|
|
340
|
+
${M.stderr.trim()}`),{ok:!1,code:1};let J=Z===d.Github?p3($,_,W,Q,U):i3($,_,W,Q,X,U);if(J.status!==0)return g(`Could not create pull request.
|
|
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
|
+
${$.stderr}`.trim()||void 0}var i_="Bun runtime",r_="Bun version",OQ="Bun recommended version";function n_($){let _=$.match(/^v?(\d+)\.(\d+)\.(\d+)/);if(!_)return;return[Number(_[1]),Number(_[2]),Number(_[3])]}function m_($,_){let W=n_($),Q=n_(_);if(!W||!Q)return!1;if(W[0]!==Q[0])return W[0]>Q[0];if(W[1]!==Q[1])return W[1]>Q[1];return W[2]>=Q[2]}function p_($,_){return $.checks.some((W)=>W.label===_&&W.required&&!W.ok)}async function R0(){let $=process.versions.bun,_=process.versions.node,W=Boolean($),Q=$?m_($,x1):!1,U=$?m_($,g2):!1,Z=[{label:i_,ok:W,required:!0,details:W?`active (${$})`:`not active (running on Node ${_})`},{label:r_,ok:Q,required:!0,details:$?`${$} (required >= ${x1})`:"unknown (Bun runtime not active)"},{label:OQ,ok:U,required:!1,details:$?`${$} (recommended >= ${g2})`:"unknown (Bun runtime not active)"}];return{ok:Z.filter((G)=>G.required).every((G)=>G.ok),bunVersion:$,nodeVersion:_,checks:Z}}function S0($,_={}){let W=_.includeDoctorFollowUp??!0,Q=["\u26A0 Runtime precheck failed."],U=p_($,i_),Z=p_($,r_);if(U)Q.push("- SUMR CLI runs on Bun runtime only."),Q.push(`- Current runtime: Node ${$.nodeVersion}.`),Q.push("- Install Bun: https://bun.sh/docs/installation"),Q.push("- Reinstall SUMR with Bun: `bun add -g @sumrco/cli`.");else if(Z)Q.push(`- Bun ${$.bunVersion??"unknown"} is below required ${x1}.`),Q.push(`- Upgrade Bun to >= ${x1}: \`bun upgrade\`.`);else Q.push("- Runtime checks failed. Run `sumr doctor` for details.");if(W)Q.push("Run `sumr doctor` for full diagnostics.");return Q}var MQ={name:"doctor",description:"Check runtime and tool requirements",usage:["sumr doctor"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr doctor"]};function s_($){if($.ok)return R("PASS",["pink","bold"]);return $.required?R("FAIL",["pink","bold"]):R("WARN",["orchid","bold"])}async function JQ($){let _=await R0(),W=$.visibility==="private",Q=W?l_():!0,U=W?c_():void 0;console.log(""),console.log(R("SUMR doctor",["purple","bold"])),console.log("");for(let Z of _.checks)console.log(`- ${s_(Z)} ${Z.label}: ${Z.details}`);if(W)console.log(`- ${s_({ok:Q,required:!0})} AWS CLI: ${U??"not found"}`),console.log("");else console.log("");if(!_.ok){for(let Z of S0(_,{includeDoctorFollowUp:!1}).slice(1))console.log(Z);return 1}if(W&&!Q)return console.log(R("Install AWS CLI to use private team commands.","orchid")),1;return console.log(R(W?"Environment looks good.":"Runtime looks good.","pink")),0}var q0=q({name:"doctor",description:"Check runtime and tool requirements",group:"system",visibility:"public",help:MQ,execute:JQ});v();import{existsSync as YQ}from"fs";import{join as TQ}from"path";import{log as h2}from"@clack/prompts";var d2=["docs"],AQ=new Set(["source","yes"]),HQ=new Set(["input","output"]),CQ={claude:!0,codex:!0,cursor:!0,copilot:!1,gemini:!1,opencode:!1},zQ={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 LQ($,_,W,Q){let U=$.indexOf("=");if(U!==-1)return Q[$.slice(2,U)]=$.slice(U+1),0;let Z=_[W+1];if(Z&&!Z.startsWith("-"))return Q[$.slice(2)]=Z,1;return Q[$.slice(2)]=!0,0}function VQ($,_,W,Q){let U=_[W+1];if(U&&!U.startsWith("-"))return Q[$.slice(1)]=U,1;return Q[$.slice(1)]=!0,0}function EQ($){let _={},W=[];for(let Q=0;Q<$.length;Q+=1){let U=$[Q];if(!U)continue;if(U.startsWith("--")){Q+=LQ(U,$,Q,_);continue}if(U.startsWith("-")&&U.length===2){Q+=VQ(U,$,Q,_);continue}W.push(U)}return{positionals:W,options:_}}function KQ($,_){let W=$[_];return typeof W==="string"?W:void 0}function BQ($,_){return Object.hasOwn($,_)}function RQ($,_){return $[_]===!0}function SQ($){if(!$)return[...d2];let _=$.split(",").map((W)=>W.trim()).filter(Boolean);if(_.length===0)return[...d2];return _}function o_(){let $=[];return $.push("# SUMR per-repo configuration"),$.push("# Add product-specific sections only when the repository needs them."),$.push("version: 1"),$.push(""),$.join(`
|
|
343
|
+
`)}function qQ($){let _=[];_.push("# Playbook"),_.push("playbook:"),_.push(" channels:");for(let[W,Q]of Object.entries(CQ))_.push(` ${W}: ${Q}`);_.push(" sources:");for(let W of $.sourcePaths)_.push(` - ${W}`);return _}function IQ($){return Object.keys($).filter((_)=>!AQ.has(_))}function jQ($){return $.length===1?`-${$}`:`--${$}`}function FQ($){let _=$.map(jQ).join(", "),W=$.length===1?"is":"are";if($.some((U)=>HQ.has(U))){console.error(`${_} ${W} 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: ${_}.`)}async function wQ($,_){if($||!_)return!0;let{confirm:W,outro:Q,isCancel:U}=await import("@clack/prompts"),Z=await W({message:"sumr.yaml already exists. Update it?",initialValue:!1});if(U(Z)||!Z)return Q("Cancelled \u2014 existing sumr.yaml was not changed."),!1;return!0}function fQ($,_,W){if(!_&&!W.includePlaybook)return k2($,o_()),!0;if(!W.includePlaybook)return!1;return H0($,"playbook",qQ(W),{fallbackContent:o_(),sectionComment:"# Playbook"}),!0}function DQ($,_){if(!$)return"Created";return _?"Updated":"Kept existing"}function NQ($){return $?`${P1} kept existing module config.`:`${P1} created in this directory.`}function yQ($){return $?["Next:"," sumr playbook sync"," sumr --help"]:["Next:"," sumr --help"]}async function kQ($,_,W,Q,U){if(_){h2.success(`${DQ(W,Q)} ${P1} in ${$}`);return}let{note:Z}=await import("@clack/prompts");Z([NQ(W),"",...yQ(U)].join(`
|
|
344
|
+
`),"SUMR init")}async function PQ($){if($.args.flags.profile)return h2.error("Use `sumr init` without `--profile`."),1;let _=EQ($.argv.slice(1));if(_.positionals.length>0)return h2.error("Use `sumr init` with flags only."),1;let W=IQ(_.options);if(W.length>0)return FQ(W),1;let Q=process.cwd(),U=TQ(Q,P1),Z=RQ(_.options,"yes"),X=BQ(_.options,"source"),G=$.visibility==="private"&&X,O=KQ(_.options,"source");if($.visibility!=="private"&&X)return console.error("`--source` is only available in private mode (when playbook commands are present)."),1;let M={sourcePaths:G?SQ(O):[...d2],includePlaybook:G},J=YQ(U);if(!await wQ(Z,J))return 0;let Y=fQ(U,J,M);return await kQ(Q,Z,J,Y,G),0}var t_=q({name:"init",description:"Create a sumr.yaml config for this repository",group:"system",visibility:"public",help:zQ,execute:PQ});v();import{chmodSync as $6,existsSync as n2,mkdirSync as uQ,readFileSync as _6,rmSync as hQ}from"fs";import{homedir as W6}from"os";import{join as Q6}from"path";import{existsSync as bQ,renameSync as gQ,rmSync as vQ,writeFileSync as xQ}from"fs";function l2($,_,W){let Q=`${$}.sumr-tmp-${process.pid}-${Date.now()}`;try{xQ(Q,_,W),gQ(Q,$)}finally{if(bQ(Q))vQ(Q,{force:!0})}}var dQ="auth.json",j0="sumr-cli",F0="default",U6="SUMR CLI authentication";function h1($=W6()){return Q6($,b2,dQ)}function Z6($=W6()){uQ(Q6($,b2),{recursive:!0,mode:448})}function lQ($){if(typeof $!=="object"||$===null)return!1;let _=$;return typeof _.accessToken==="string"&&typeof _.stage==="string"}function a_($){try{let _=JSON.parse($);return lQ(_)?_:null}catch{return null}}function u1($,_){try{let W=Bun.spawnSync({cmd:$,stdin:_===void 0?void 0:new TextEncoder().encode(_),stdout:"pipe",stderr:"ignore",env:{...process.env},timeout:v_});return{code:W.exitCode,stdout:new TextDecoder().decode(W.stdout)}}catch{return{code:-1,stdout:""}}}var cQ="$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))",nQ="$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 e_($,_){if(!Bun.which("powershell"))return{code:-1,stdout:""};return u1(["powershell","-NoProfile","-NonInteractive","-Command",$],_)}var mQ=`
|
|
345
|
+
import Darwin
|
|
346
|
+
import Foundation
|
|
347
|
+
import Security
|
|
348
|
+
|
|
349
|
+
let action = __ACTION__
|
|
350
|
+
let service = __SERVICE__
|
|
351
|
+
let account = __ACCOUNT__
|
|
352
|
+
let label = __LABEL__
|
|
353
|
+
|
|
354
|
+
func baseQuery() -> [String: Any] {
|
|
355
|
+
return [
|
|
356
|
+
kSecClass as String: kSecClassGenericPassword,
|
|
357
|
+
kSecAttrService as String: service,
|
|
358
|
+
kSecAttrAccount as String: account,
|
|
359
|
+
]
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
switch action {
|
|
363
|
+
case "set":
|
|
364
|
+
let secretData = FileHandle.standardInput.readDataToEndOfFile()
|
|
365
|
+
if secretData.isEmpty {
|
|
366
|
+
exit(1)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
let attributes: [String: Any] = [
|
|
370
|
+
kSecValueData as String: secretData,
|
|
371
|
+
kSecAttrLabel as String: label,
|
|
372
|
+
]
|
|
373
|
+
let updateStatus = SecItemUpdate(baseQuery() as CFDictionary, attributes as CFDictionary)
|
|
374
|
+
if updateStatus == errSecSuccess {
|
|
375
|
+
exit(0)
|
|
376
|
+
}
|
|
377
|
+
if updateStatus != errSecItemNotFound {
|
|
378
|
+
exit(1)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
var addQuery = baseQuery()
|
|
382
|
+
addQuery[kSecValueData as String] = secretData
|
|
383
|
+
addQuery[kSecAttrLabel as String] = label
|
|
384
|
+
exit(SecItemAdd(addQuery as CFDictionary, nil) == errSecSuccess ? 0 : 1)
|
|
385
|
+
|
|
386
|
+
case "get":
|
|
387
|
+
var query = baseQuery()
|
|
388
|
+
query[kSecReturnData as String] = kCFBooleanTrue
|
|
389
|
+
query[kSecMatchLimit as String] = kSecMatchLimitOne
|
|
390
|
+
|
|
391
|
+
var item: CFTypeRef?
|
|
392
|
+
let status = SecItemCopyMatching(query as CFDictionary, &item)
|
|
393
|
+
guard status == errSecSuccess, let data = item as? Data else {
|
|
394
|
+
exit(1)
|
|
395
|
+
}
|
|
396
|
+
FileHandle.standardOutput.write(data)
|
|
397
|
+
exit(0)
|
|
398
|
+
|
|
399
|
+
case "clear":
|
|
400
|
+
let status = SecItemDelete(baseQuery() as CFDictionary)
|
|
401
|
+
exit(status == errSecSuccess || status == errSecItemNotFound ? 0 : 1)
|
|
402
|
+
|
|
403
|
+
default:
|
|
404
|
+
exit(64)
|
|
405
|
+
}
|
|
406
|
+
`;function I0($){return JSON.stringify($).replace(/\$/g,"\\$")}function pQ($){return mQ.replace("__ACTION__",I0($)).replace("__SERVICE__",I0(j0)).replace("__ACCOUNT__",I0(F0)).replace("__LABEL__",I0(U6))}function c2($,_){if(!Bun.which("swift"))return{code:-1,stdout:""};return u1(["swift","-e",pQ($)],_)}var iQ={set:($)=>c2("set",$).code===0,get:()=>{let{code:$,stdout:_}=c2("get");if($!==0)return null;let W=_.replace(/\n$/,"");return W.length>0?W:null},clear:()=>{c2("clear")}},rQ={set:($)=>{if(!Bun.which("secret-tool"))return!1;return u1(["secret-tool","store",`--label=${U6}`,"service",j0,"account",F0],$).code===0},get:()=>{if(!Bun.which("secret-tool"))return null;let{code:$,stdout:_}=u1(["secret-tool","lookup","service",j0,"account",F0]);if($!==0||_.length===0)return null;return _},clear:()=>{if(!Bun.which("secret-tool"))return;u1(["secret-tool","clear","service",j0,"account",F0])}},X6={set:($)=>{let{code:_,stdout:W}=e_(cQ,$);if(_!==0)return!1;let Q=W.trim();if(Q.length===0)return!1;try{tQ(Q)}catch{return!1}return!0},get:()=>{let $=h1();if(!n2($))return null;let _=aQ($);if(_===null||_.trim().length===0)return null;let{code:W,stdout:Q}=e_(nQ,_);if(W!==0)return null;let U=Q.trim();return U.length>0?U:null},clear:()=>{p2()}};function m2($){if($!==void 0)return null;if(process.env[x_]===B0)return null;if(process.platform==="darwin")return iQ;if(process.platform==="linux")return rQ;if(process.platform==="win32")return X6;return null}function G6($){return $!==void 0||process.env[v2]===B0}function sQ(){return Error(`SUMR auth keychain is unavailable. Refusing to write plaintext auth credentials. Set ${v2}=${B0} only for local development or CI isolation.`)}function O6($,_){if($!==X6)p2(_)}function oQ($,_){Z6(_);let W=h1(_);l2(W,`${JSON.stringify($,null,2)}
|
|
407
|
+
`,{encoding:"utf8",mode:384}),$6(W,384)}function p2($){let _=h1($);if(n2(_))hQ(_,{force:!0})}function tQ($){Z6();let _=h1();l2(_,$,{encoding:"utf8",mode:384}),$6(_,384)}function aQ($){try{return _6($,"utf8")}catch{return null}}function L1($){let _=m2($);if(_){let Q=_.get(),U=Q?a_(Q):null;if(U)return U}let W=h1($);if(!n2(W))return null;try{let Q=a_(_6(W,"utf8"));if(!Q)return null;if(G6($))return Q;if(_?.set(JSON.stringify(Q)))return O6(_,$),Q;return null}catch{return null}}function w0($,_){let W=m2(_);if(W?.set(JSON.stringify($))){O6(W,_);return}if(!G6(_))throw sQ();oQ($,_)}function f0($){let _=m2($);if(_)_.clear();p2($)}function M6($){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt}function J6($,_=300000){if($.expiresAt===void 0)return!1;return Date.now()>=$.expiresAt-_}var d1={AuthorizationPending:"authorization_pending",SlowDown:"slow_down",AccessDenied:"access_denied",ExpiredToken:"expired_token"},i2={Team:"team",Personal:"personal"};class l1 extends Error{constructor(){super("Login cancelled.");this.name="LoginCancelledError"}}function O$($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function M$($){return $===void 0||typeof $==="string"}function D0($){return $ instanceof Error&&($.name==="AbortError"||$.message.toLowerCase().includes("aborted"))}function c1($){return $ instanceof Error?$.message:String($)}var eQ="urn:ietf:params:oauth:grant-type:device_code",$U="refresh_token";function _U($){return $===void 0||typeof $==="number"}function WU($){if(!O$($))return!1;return M$($.sub)&&M$($.email)&&M$($.name)}function QU($){if(!O$($))return!1;return typeof $.deviceCode==="string"&&typeof $.userCode==="string"&&typeof $.verificationUri==="string"&&M$($.verificationUriComplete)&&typeof $.expiresIn==="number"&&typeof $.interval==="number"}function Y6($){if(!O$($))return!1;return typeof $.access_token==="string"&&M$($.refresh_token)&&M$($.id_token)&&M$($.token_type)&&_U($.expires_in)}function UU($){if(!O$($))return!1;return typeof $.error==="string"&&M$($.error_description)}async function T6($){try{return await $.text()}catch(_){return`Unable to read response body: ${c1(_)}`}}async function N0($,_){try{return await $.json()}catch(W){throw Error(`${_} returned invalid JSON: ${c1(W)}`)}}function A6($){try{let _=$.split(".");if(_.length!==3||!_[1])return{};let W=_[1].replace(/-/g,"+").replace(/_/g,"/"),Q=atob(W),U=JSON.parse(Q);return WU(U)?U:{}}catch{return{}}}function ZU($){return new Promise((_)=>setTimeout(_,$))}function XU($,_){switch($){case d1.AuthorizationPending:return _;case d1.SlowDown:return _+5;case d1.AccessDenied:throw Error("Access denied. You declined the login request in the browser.");case d1.ExpiredToken:throw Error("Device code expired. Run `sumr login` to try again.");default:throw Error(`Unexpected error from auth server: ${$}`)}}function r2($){if($?.aborted)throw new l1}async function s2($,_,W){let Q=new AbortController,U=setTimeout(()=>Q.abort(),u2),Z=()=>Q.abort();if(W?.aborted)Q.abort();else W?.addEventListener("abort",Z,{once:!0});try{return await fetch($,{..._,signal:Q.signal})}catch(X){if(D0(X))throw r2(W),Error(`SUMR identity request timed out after ${u2}ms.`);throw X}finally{clearTimeout(U),W?.removeEventListener("abort",Z)}}function GU($,_){let W=A6(_.access_token),Q=_.expires_in?Date.now()+_.expires_in*1000:void 0;return{stage:$,accessToken:_.access_token,refreshToken:_.refresh_token,tokenType:_.token_type??"Bearer",expiresAt:Q,createdAt:new Date().toISOString(),user:{id:W.sub,email:W.email,name:W.name}}}async function OU($){try{let _=await N0($,"Device token error response");if(!UU(_))throw Error("Device token error response did not match the expected shape.");return _.error}catch{throw Error(`Device token poll failed (${$.status})`)}}async function MU($,_){let W=await N0($,"Device token response");if(!Y6(W))throw Error("Device token response did not match the expected shape.");return GU(_,W)}async function JU($,_,W,Q,U){let Z=await s2(_,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:eQ,deviceCode:Q,clientId:W})},U);if(Z.ok)return{kind:"approved",session:await MU(Z,$)};return{kind:"pending",errorCode:await OU(Z)}}async function H6($){let _=`${$.apiBaseUrl}/v3/identity/device/code`,W=await s2(_,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:$.clientId,scope:$.scope})});if(!W.ok){let U=await T6(W);throw Error(`Device code request failed (${W.status}): ${U}`)}let Q=await N0(W,"Device code response");if(!QU(Q))throw Error("Device code response did not match the expected shape.");return Q}async function C6($,_,W,Q,U){let Z=`${_.apiBaseUrl}/v3/identity/device/token`,X=Q;for(;;){r2(U),await ZU(X*1000),r2(U);let G=await JU($,Z,_.clientId,W,U);if(G.kind==="approved")return G.session;X=XU(G.errorCode,X)}}async function z6($,_){if(!$.refreshToken)throw Error("No refresh token available.");let W=`${_.apiBaseUrl}/v3/identity/oauth/token`,Q=await s2(W,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grantType:$U,clientId:_.clientId,refreshToken:$.refreshToken})});if(!Q.ok){let G=await T6(Q);throw Error(`Token refresh failed (${Q.status}): ${G}`)}let U=await N0(Q,"Token refresh response");if(!Y6(U))throw Error("Token refresh response did not match the expected shape.");let Z=A6(U.access_token),X=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:X,user:{id:Z.sub??$.user?.id,email:Z.email??$.user?.email,name:Z.name??$.user?.name}}}import{log as E6}from"@clack/prompts";class y0 extends Error{status;details;constructor($,_){super(`SUMR API request failed (${$}).`);this.name="SumrApiError",this.status=$,this.details=_}}function YU($){return`Bearer ${$.accessToken}`}function TU($,_){return{accept:"application/json",authorization:YU($),..._?{"content-type":"application/json"}:{}}}async function L6($){try{return await $.text()}catch(_){return _ instanceof Error?_.message:String(_)}}async function AU($){let _=await L6($);if(!_)return;try{return JSON.parse(_)}catch(W){let Q=W instanceof Error?W.message:String(W);throw Error(`SUMR API returned invalid JSON: ${Q}`)}}async function HU($,_){let W=new AbortController,Q=setTimeout(()=>W.abort(),x2);try{return await fetch($,{..._,signal:W.signal})}catch(U){if(D0(U))throw Error(`SUMR API request timed out after ${x2}ms.`);throw U}finally{clearTimeout(Q)}}async function V6($,_,W,Q={}){let U=Q.body===void 0?void 0:JSON.stringify(Q.body),Z=await HU(`${$.apiBaseUrl}${W}`,{method:Q.method??"GET",headers:TU(_,U!==void 0),body:U});if(!Z.ok)throw new y0(Z.status,await L6(Z));return AU(Z)}var B6="prod",Q1={apiBaseUrl:"https://api.sumr.co",clientId:"sumr-cli",scope:"openid offline organizations:read organizations:write api-keys:read api-keys:write"};async function K6($,_){if(!$.refreshToken)return null;try{let W=await z6($,Q1);return w0(W,_),W}catch(W){return c1(W),null}}async function R6($){let _=L1($);if(!_)throw E6.error("Not signed in. Run `sumr login` first."),Error("Not signed in.");if(M6(_)){let W=await K6(_,$);if(!W)throw f0($),E6.error("Session expired. Run `sumr login` to sign in again."),Error("Session expired.");return W}if(J6(_))return await K6(_,$)??_;return _}async function S6($,_,W={}){return V6(Q1,$,_,W)}var CU={name:"login",description:"Sign in to SUMR",usage:["sumr login"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr login"]};function zU($){try{return new URL($).protocol==="https:"}catch{return!1}}function LU($){if(!zU($))return;try{let _=process.platform==="win32"?["cmd","/c","start","",$]:process.platform==="darwin"?["open",$]:["xdg-open",$];Bun.spawn(_,{stdout:"ignore",stderr:"ignore",env:{...process.env},timeout:K0})}catch{}}function VU($){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 EU($){if(!VU($))return{summary:$};return{summary:"Unable to connect to the prod auth API.",details:[`Target: ${Q1.apiBaseUrl}`,"Retry later or contact SUMR support if the problem continues.",`Cause: ${$}`].join(`
|
|
408
|
+
`)}}async function KU($,_){_.start("Waiting for browser sign-in...");let W=new AbortController,Q=()=>{W.abort()};process.on("SIGINT",Q);try{let U=await C6(B6,Q1,$.deviceCode,$.interval,W.signal);return _.stop("Sign-in approved."),{kind:"ok",session:U}}catch(U){if(_.stop(""),U instanceof l1||W.signal.aborted)return{kind:"cancelled"};return{kind:"error",message:U instanceof Error?U.message:String(U)}}finally{process.off("SIGINT",Q)}}async function BU(){let{spinner:$}=await import("@clack/prompts"),_=$(_1("purple"));_.start("Requesting sign-in code...");let W;try{W=await H6(Q1),_.stop("Sign-in code ready.")}catch(Q){return _.stop(""),{kind:"error",message:Q instanceof Error?Q.message:String(Q)}}return S$(["Open this URL in your browser:",` ${W.verificationUriComplete??W.verificationUri}`,"",`If prompted, enter this code: ${W.userCode}`,"",`Code expires in ${Math.floor(W.expiresIn/60)} minutes.`].join(`
|
|
409
|
+
`),"Sign in to SUMR","purple"),LU(W.verificationUriComplete??W.verificationUri),KU(W,$(_1("purple")))}async function RU($){if($.args.flags.profile)return L$("`sumr login` does not accept --profile."),1;if($.argv.length>1)return L$("Unexpected argument: public login targets SUMR production only."),1;o("sumr");let _=L1();if(_){let U=_.user?.email??_.user?.name??"your account";return b1(`Already signed in as ${U}. Run \`sumr logout\` first.`),1}let W=await BU();if(W.kind==="cancelled")return b1("Sign-in cancelled."),1;if(W.kind==="error"){let U=EU(W.message);return L$(`Sign-in failed: ${U.summary}`,{details:U.details,title:"Auth target"}),1}w0(W.session);let Q=W.session.user?.email??W.session.user?.name??`account on ${Q1.apiBaseUrl.replace("https://","")}`;return y(`Signed in as ${Q}.`),W1(),0}var q6=q({name:"login",description:"Sign in to SUMR",group:"auth",visibility:"public",help:CU,execute:RU});v();var SU={name:"logout",description:"Sign out of SUMR",usage:["sumr logout"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr logout"]};async function qU($){o("sumr");let _=L1();if(!_)return b$("Not signed in."),W1(),0;f0();let W=_.user?.email??_.user?.name??"your account";return y(`Signed out of ${W}.`),W1(),0}var I6=q({name:"logout",description:"Sign out of SUMR",group:"auth",visibility:"public",help:SU,execute:qU});v();function IU($){return $===i2.Team||$===i2.Personal}function jU($){if(!O$($))return!1;return typeof $.id==="string"&&typeof $.organizationId==="string"&&typeof $.principalId==="string"&&typeof $.role==="string"&&typeof $.status==="string"&&M$($.invitedBy)&&M$($.acceptedAt)&&typeof $.createdAt==="string"}function FU($){if(!O$($))return!1;return typeof $.id==="string"&&typeof $.slug==="string"&&typeof $.name==="string"&&IU($.kind)}function wU($){if(!O$($))return!1;return jU($.membership)&&FU($.organization)}function fU($){return O$($)&&Array.isArray($.data)&&$.data.every(wU)}function j6($){if(!fU($))throw Error("SUMR API /v3/me/organizations response did not match the expected shape.");return $}var DU={name:"whoami",description:"Show the currently signed-in user",usage:["sumr whoami"],options:[{flag:"--help, -h",description:"Show command help"}],examples:["sumr whoami"]};function NU($){if($===void 0)return"unknown";let _=$-Date.now();if(_<=0)return"expired";let W=Math.floor(_/60000);if(W<60)return`in ${W} minute${W===1?"":"s"}`;let Q=Math.floor(W/60);return`in ${Q} hour${Q===1?"":"s"}`}async function yU($){o("sumr");let _=await R6(),W=j6(await S6(_,"/v3/me/organizations")),Q=[];if(_.user?.email)Q.push(_.user.email);if(_.user?.name&&_.user.name!==_.user.email)Q[0]=Q[0]?`${Q[0]} (${_.user.name})`:_.user.name;return Q.push(`Stage: ${_.stage}`),Q.push(`Token expires: ${NU(_.expiresAt)}`),Q.push("API: connected"),Q.push(`Organizations: ${W.data.length}`),S$(Q.join(`
|
|
410
|
+
`),"Signed in","purple"),W1(),0}function kU($){if($ instanceof y0){let _=$.details.trim();return _?`API check failed (${$.status}): ${_}`:`API check failed (${$.status}).`}return $ instanceof Error?$.message:"Unable to reach SUMR API."}var F6=q({name:"whoami",description:"Show the currently signed-in user",group:"auth",visibility:"public",help:DU,execute:async($)=>{try{return await yU($)}catch(_){throw Error(kU(_))}}});v();function o2($,_){let W;async function Q(){if(!W)W=y_(await $());return W}return{name:_.name,description:_.description,group:_.group,visibility:_.visibility,run:async(U)=>(await Q()).run(U)}}var Q4=o2(()=>Promise.resolve().then(() => (G9(),X9)).then(($)=>$.kontractModule),{name:"kontract",description:"Generate and validate API contract code",group:"modules",visibility:"public"}),U4=o2(()=>Promise.resolve().then(() => (a9(),t9)).then(($)=>$.missionModule),{name:"mission",description:"File-backed execution state for AI-assisted work",group:"modules",visibility:"public"});function e9(){return[q6,I6,F6,t_,q0,Q4,U4]}v();import{log as Y4}from"@clack/prompts";v();import{existsSync as _7,readFileSync as Z4}from"fs";import{dirname as $7,join as L_}from"path";import{fileURLToPath as X4}from"url";var F2="0.0.0";function G4($){if(!O$($))return;return typeof $.version==="string"?$.version:void 0}function w2($=import.meta.url){let _=$7(X4($));for(;;){if(_7(L_(_,"package.json")))return _;let W=$7(_);if(W===_)return;_=W}}function W7($){try{let _=Z4(L_($,"package.json"),"utf8"),W=JSON.parse(_);return G4(W)??F2}catch{return F2}}function Q7($=w2()){return Boolean($&&_7(L_($,b_)))}var U7=[" _____ __ __ _____ _____ ","| __|__|__| | __ |","|__ | | | | | | -|","|_____|_____|_|_|_|__|__|"],O4="\u2508".repeat(Math.max(...U7.map(($)=>$.length)));function V_(){let $=w2();if(!$)return F2;return W7($)}function M4(){let $=w2();if(!Q7($))return"";return R("(Local-Test)","orange")}function J4($){return $==="private"?"\uD83D\uDD12":"\uD83C\uDF10"}function Y0($){console.log("");for(let Z of U7)console.log(Z);console.log(R(O4,["mauve","dim"]));let _=M4(),W=J4($),Q=R("|",["mauve","dim"]),U=[W,R(`v${V_()}`,["mauve","dim"]),_].filter(Boolean).join(` ${Q} `);console.log(U),console.log("")}async function Z7($){let _=D_($.argv),W=new Map($.commands.map((U)=>[U.name,U]));if(!_.command)return Y0($.visibility),console.log(V0($.commands,$.visibility)),0;if(_.command==="--help"||_.command==="-h")return Y0($.visibility),console.log(V0($.commands,$.visibility)),0;if(_.command==="--version"||_.command==="-v")return console.log(V_()),0;let Q=W.get(_.command);if(!Q)return Y0($.visibility),console.error(`Unknown command: ${_.command}`),console.log(V0($.commands,$.visibility)),1;if(Q.name!==q0.name){let U=await R0();if(!U.ok){Y0($.visibility);for(let Z of S0(U))console.error(Z);return 1}}try{return await Q.run({argv:$.argv,args:_,visibility:$.visibility})}catch(U){let Z=U instanceof Error?U.message:"Unexpected error.";return Y4.error(Z),1}}try{let $=await Z7({argv:process.argv.slice(2),commands:e9(),visibility:"public"});process.exit($)}catch($){let _=$ instanceof Error?$.message:String($);X7.error(`sumr: ${_}`),X7.warn("Run `sumr doctor` to diagnose your installation."),process.exit(1)}
|