@typescape-ai/cli 1.0.14 → 1.0.15
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/dist/cli.js +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -287,7 +287,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
287
287
|
`)+1;while(t!==0)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
288
288
|
`,t)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,t.value){let n="end"in t.value?t.value.end:void 0;if((Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment")n?.push(this.sourceToken);else e.items.push({start:[this.sourceToken]})}else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let a=e.items[e.items.length-2]?.value?.end;if(Array.isArray(a)){Array.prototype.push.apply(a,t.start),a.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,a=n&&(t.sep||t.explicitKey)&&this.type!=="seq-item-ind",r=[];if(a&&t.sep&&!t.value){let i=[];for(let o=0;o<t.sep.length;++o){let s=t.sep[o];switch(s.type){case"newline":i.push(o);break;case"space":break;case"comment":if(s.indent>e.indent)i.length=0;break;default:i.length=0}}if(i.length>=2)r=t.sep.splice(i[1])}switch(this.type){case"anchor":case"tag":if(a||t.value)r.push(this.sourceToken),e.items.push({start:r}),this.onKeyLine=!0;else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"explicit-key-ind":if(!t.sep&&!t.explicitKey)t.start.push(this.sourceToken),t.explicitKey=!0;else if(a||t.value)r.push(this.sourceToken),e.items.push({start:r,explicitKey:!0});else this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]});this.onKeyLine=!0;return;case"map-value-ind":if(t.explicitKey)if(!t.sep)if(yo(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let i=oc(t.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]})}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(yo(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]});else if(rZ(t.key)&&!yo(t.sep,"newline")){let i=oc(t.start),o=t.key,s=t.sep;s.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:o,sep:s}]})}else if(r.length>0)t.sep=t.sep.concat(r,this.sourceToken);else t.sep.push(this.sourceToken);else if(!t.sep)Object.assign(t,{key:null,sep:[this.sourceToken]});else if(t.value||a)e.items.push({start:r,key:null,sep:[this.sourceToken]});else if(yo(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]});else t.sep.push(this.sourceToken);this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let i=this.flowScalar(this.type);if(a||t.value)e.items.push({start:r,key:i,sep:[]}),this.onKeyLine=!0;else if(t.sep)this.stack.push(i);else Object.assign(t,{key:i,sep:[]}),this.onKeyLine=!0;return}default:{let i=this.startBlockValue(e);if(i){if(n&&i.type!=="block-seq")e.items.push({start:r});this.stack.push(i);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(t.value){let n="end"in t.value?t.value.end:void 0;if((Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment")n?.push(this.sourceToken);else e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let a=e.items[e.items.length-2]?.value?.end;if(Array.isArray(a)){Array.prototype.push.apply(a,t.start),a.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case"anchor":case"tag":if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;if(t.value||yo(t.start,"seq-item-ind"))e.items.push({start:[this.sourceToken]});else t.start.push(this.sourceToken);return}if(this.indent>e.indent){let n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!t||t.sep)e.items.push({start:[this.sourceToken]});else t.start.push(this.sourceToken);return;case"map-value-ind":if(!t||t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else Object.assign(t,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!t||t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);if(!t||t.value)e.items.push({start:[],key:a,sep:[]});else if(t.sep)this.stack.push(a);else Object.assign(t,{key:a,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);if(n)this.stack.push(n);else yield*this.pop(),yield*this.step()}else{let n=this.peek(2);if(n.type==="block-map"&&(this.type==="map-value-ind"&&n.indent===e.indent||this.type==="newline"&&!n.items[n.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&n.type!=="flow-collection"){let a=wb(n),r=oc(a);aZ(e);let i=e.end.splice(1,e.end.length);i.push(this.sourceToken);let o={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:r,key:e,sep:i}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=o}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let t=this.source.indexOf(`
|
|
289
289
|
`)+1;while(t!==0)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
290
|
-
`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=wb(e),n=oc(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let t=wb(e),n=oc(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){if(this.type!=="comment")return!1;if(this.indent<=t)return!1;return e.every((n)=>n.type==="newline"||n.type==="space")}*documentEnd(e){if(this.type!=="doc-mode"){if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}sqe.Parser=iZ});var lZ=S((bqe)=>{var oZ=HQ(),Aqe=Jl(),ad=Vl(),lqe=eQ(),dqe=ze(),uqe=ex(),sZ=tx();function cZ(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new uqe.LineCounter||null,prettyErrors:t}}function pqe(e,t={}){let{lineCounter:n,prettyErrors:a}=cZ(t),r=new sZ.Parser(n?.addNewLine),i=new oZ.Composer(t),o=Array.from(i.compose(r.parse(e)));if(a&&n)for(let s of o)s.errors.forEach(ad.prettifyError(e,n)),s.warnings.forEach(ad.prettifyError(e,n));if(o.length>0)return o;return Object.assign([],{empty:!0},i.streamInfo())}function AZ(e,t={}){let{lineCounter:n,prettyErrors:a}=cZ(t),r=new sZ.Parser(n?.addNewLine),i=new oZ.Composer(t),o=null;for(let s of i.compose(r.parse(e),!0,e.length))if(!o)o=s;else if(o.options.logLevel!=="silent"){o.errors.push(new ad.YAMLParseError(s.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(a&&n)o.errors.forEach(ad.prettifyError(e,n)),o.warnings.forEach(ad.prettifyError(e,n));return o}function mqe(e,t,n){let a=void 0;if(typeof t==="function")a=t;else if(n===void 0&&t&&typeof t==="object")n=t;let r=AZ(e,n);if(!r)return null;if(r.warnings.forEach((i)=>lqe.warn(r.options.logLevel,i)),r.errors.length>0)if(r.options.logLevel!=="silent")throw r.errors[0];else r.errors=[];return r.toJS(Object.assign({reviver:a},n))}function gqe(e,t,n){let a=null;if(typeof t==="function"||Array.isArray(t))a=t;else if(n===void 0&&t)n=t;if(typeof n==="string")n=n.length;if(typeof n==="number"){let r=Math.round(n);n=r<1?void 0:r>8?{indent:8}:{indent:r}}if(e===void 0){let{keepUndefined:r}=n??t??{};if(!r)return}if(dqe.isDocument(e)&&!a)return e.toString(n);return new Aqe.Document(e,a,n).toString(n)}bqe.parse=mqe;bqe.parseAllDocuments=pqe;bqe.parseDocument=AZ;bqe.stringify=gqe});var qZ=S((tdt,ONe)=>{ONe.exports={name:"@typescape-ai/cli",version:"1.0.14",description:"Typescape CLI - Create review sessions, export feedback, and integrate with AI workflows",type:"module",bin:{typescape:"./dist/cli.js"},files:["dist","README.md"],exports:{".":"./dist/cli.js"},publishConfig:{access:"public"},scripts:{build:"bun build src/index.ts --outfile=dist/cli.js --target=bun --bundle --minify",dev:"bun run --watch src/index.ts",test:"bun test",typecheck:"tsc -p tsconfig.typecheck.json --noEmit",lint:"eslint src",prepublishOnly:"bun run build"},dependencies:{},devDependencies:{"@types/bun":"1.1.14","@typescape/integrity":"workspace:*","@typescape/schemas":"workspace:*",ajv:"8.17.1","ajv-formats":"3.0.1",yaml:"2.8.2",zod:"4.3.0"},engines:{bun:">=1.0.0"},keywords:["typescape","cli","review","documentation","ai","feedback","bun"],repository:{type:"git",url:"https://github.com/voidserf/typescape-docs.git",directory:"apps/cli"},license:"MIT"}});var V=0,ma=1,O=2,ga=3,Pa=4,_b=5;function dx(e){if(e>=500)return 4;if(e===401||e===403)return 3;if(e>=400&&e<500)return 2;return 0}function On(e,t){if(t==="json")console.log(JSON.stringify(e,null,2));else if(typeof e==="string")console.log(e);else if(typeof e==="object"&&e!==null)for(let[n,a]of Object.entries(e))console.log(`${n}: ${a}`);else console.log(String(e))}function T(e,t){console.error(JSON.stringify({error:e},null,2)),process.exit(t)}function ux(e){console.error(e)}import{existsSync as nae,readFileSync as aae}from"fs";import{resolve as kD}from"path";var hne=_f(),yne=$c(),wne=cf(),qf=Sc(),kne=fc(),vr=Ge(),Bne=kr(),Cne=kt(),_ne=Cr(),Ene=_r(),YGe=zd(),vne=Sf(),Qne=Lf(),xne=jf(),Td=yD(),wD=gc();var Ine=hne.Composer,Dne=yne.Document,Fne=wne.Schema,$ne=qf.YAMLError,Sne=qf.YAMLParseError,Lne=qf.YAMLWarning,jne=kne.Alias,qne=vr.isAlias,Nne=vr.isCollection,Mne=vr.isDocument,Gne=vr.isMap,Rne=vr.isNode,Pne=vr.isPair,zne=vr.isScalar,Une=vr.isSeq,Hne=Bne.Pair,Tne=Cne.Scalar,One=_ne.YAMLMap,Zne=Ene.YAMLSeq;var Yne=vne.Lexer,Kne=Qne.LineCounter,Wne=xne.Parser,Bi=Td.parse,Jne=Td.parseAllDocuments,Vne=Td.parseDocument,Xne=Td.stringify,eae=wD.visit,tae=wD.visitAsync;var Nf=".typescape/config.yaml",rae="TYPESCAPE_API_TOKEN",BD="TYPESCAPE_BASE_URL",Gc=1;function iae(e){if(e)return kD(e);return kD(Nf)}function Kn(e){let t=iae(e);if(!nae(t))T({code:"config_not_found",message:`Configuration file not found: ${t}. Create a .typescape/config.yaml file or use --config to specify a path.`},O);let n;try{let c=aae(t,"utf-8");n=Bi(c)}catch(c){let A=c instanceof Error?c.message:String(c);T({code:"config_parse_error",message:`Failed to parse config file: ${A}`},O)}if(n.version!==void 0&&n.version!==Gc)T({code:"unsupported_config_version",message:`Unsupported config version: ${n.version}. Only version ${Gc} is supported.`},O);let a=process.env[BD],r=n.server?.base_url,i=a||r;if(!i)T({code:"missing_base_url",message:`Missing server.base_url in config file. Set server.base_url in ${t} or set the ${BD} environment variable.`},O);let o=n.server?.api_token_env||rae,s=process.env[o];if(!s)T({code:"missing_api_token",message:`Environment variable ${o} is not set. Set it to your operator API token.`},ga);return{baseUrl:i,apiToken:s,repoId:n.repo?.id,configPath:t}}function oae(e){if(e===void 0)return null;try{let t=JSON.stringify(e);if(!t)return null;if(t.length<=400)return t;return`${t.slice(0,397)}...`}catch{return null}}function Wn(e){let t=e.baseUrl.replace(/\/$/,""),n="/v1";async function a(r,i,o={}){let s=`${t}/v1${i}`;if(o.query&&Object.keys(o.query).length>0){let g=new URLSearchParams(o.query);s+=`?${g.toString()}`}let c={Authorization:`Bearer ${e.apiToken}`,Accept:"application/json",...o.headers};if(o.body!==void 0)c["Content-Type"]="application/json";let A;try{A=await fetch(s,{method:r,headers:c,body:o.body!==void 0?JSON.stringify(o.body):void 0})}catch(g){let b=g instanceof Error?g.message:String(g);T({code:"network_error",message:`Network error: ${b}`},ga)}let l,d=null;if((A.headers.get("Content-Type")||"").includes("application/json"))try{l=await A.json()}catch{l={}}else{try{d=(await A.text()).trim()||null}catch{d=null}l={}}let p=l?.request_id||A.headers.get("X-Request-Id")||"unknown";if(!A.ok){let g=l,b=g.error?.code||(d?"unexpected_response":"api_error"),y=g.error?.message||`API request failed with status ${A.status}`;if(!g.error?.message&&d){let D=d.length<=300?d:`${d.slice(0,297)}...`;y=`${y}: ${D}`}let w=[];if(g.error?.fix_hint)w.push(`fix_hint: ${g.error.fix_hint}`);let E=oae(g.error?.details);if(E)w.push(`details: ${E}`);if(w.length>0)y=`${y} (${w.join("; ")})`;let C=dx(A.status);T({code:b,message:`${y} (request_id: ${p})`},C)}return{status:A.status,body:l,requestId:p}}return{async get(r,i){return a("GET",r,i)},async post(r,i){return a("POST",r,i)},async put(r,i){return a("PUT",r,i)},async patch(r,i){return a("PATCH",r,i)},async delete(r,i){return a("DELETE",r,i)},request:a}}var{spawn:sae}=globalThis.Bun;import{existsSync as cae,readFileSync as Aae}from"fs";import{resolve as lae}from"path";async function Qr(e){if(!e||typeof e==="number")return"";return new Response(e).text()}class Jn extends Error{code;constructor(e,t){super(t);this.code=e;this.name="ReviewersFromConfigError"}}function dae(e){let t={file:"",reviewers:[],approvers:[],format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--file")t.file=e[n+1]||"",n+=2;else if(a.startsWith("--file="))t.file=a.slice(7),n++;else if(a==="--repo")t.repo=e[n+1],n+=2;else if(a.startsWith("--repo="))t.repo=a.slice(7),n++;else if(a==="--sha")t.sha=e[n+1],n+=2;else if(a.startsWith("--sha="))t.sha=a.slice(6),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--reviewer")t.reviewers.push(e[n+1]||""),n+=2;else if(a.startsWith("--reviewer="))t.reviewers.push(a.slice(11)),n++;else if(a==="--reviewers"){let r=e[n+1]||"";t.reviewers.push(...Od(r)),n+=2}else if(a.startsWith("--reviewers=")){let r=a.slice(12);t.reviewers.push(...Od(r)),n++}else if(a==="--participants"){let r=e[n+1]||"";t.reviewers.push(...Od(r)),n+=2}else if(a.startsWith("--participants=")){let r=a.slice(15);t.reviewers.push(...Od(r)),n++}else if(a==="--approver")t.approvers.push(e[n+1]||""),n+=2;else if(a.startsWith("--approver="))t.approvers.push(a.slice(11)),n++;else if(a==="--reviewers-from")t.reviewersFrom=e[n+1],n+=2;else if(a.startsWith("--reviewers-from="))t.reviewersFrom=a.slice(17),n++;else if(a==="--idempotency-key")t.idempotencyKey=e[n+1],n+=2;else if(a.startsWith("--idempotency-key="))t.idempotencyKey=a.slice(18),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Od(e){return e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0)}function CD(e){if(!Array.isArray(e))throw new Jn("reviewers_file_invalid","reviewers.yaml fields must be string arrays.");return e.map((n)=>{if(typeof n!=="string")throw new Jn("reviewers_file_invalid","reviewers.yaml fields must only contain email strings.");return n.trim()}).filter((n)=>n.length>0)}function _D(e){if(e===void 0)return{};if(!e||typeof e!=="object"||Array.isArray(e))throw new Jn("reviewers_file_invalid","reviewers.yaml role sections must be objects.");let t=e;for(let n of Object.keys(t))if(n!=="reviewers"&&n!=="approvers")throw new Jn("reviewers_file_invalid",`Unknown key in reviewers.yaml role section: ${n}`);return{reviewers:t.reviewers===void 0?void 0:CD(t.reviewers),approvers:t.approvers===void 0?void 0:CD(t.approvers)}}function uae(e){let t;try{t=Bi(e)}catch(r){let i=r instanceof Error?r.message:String(r);throw new Jn("reviewers_file_parse_error",`Failed to parse reviewers file: ${i}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw new Jn("reviewers_file_invalid","reviewers.yaml must be a YAML object.");let n=t;for(let r of Object.keys(n))if(r!=="default"&&r!=="overrides")throw new Jn("reviewers_file_invalid",`Unknown key in reviewers.yaml: ${r}`);let a={default:_D(n.default)};if(n.overrides!==void 0){if(!n.overrides||typeof n.overrides!=="object"||Array.isArray(n.overrides))throw new Jn("reviewers_file_invalid","reviewers.yaml overrides must be an object keyed by glob pattern.");let r=n.overrides,i={};for(let[o,s]of Object.entries(r))i[o]=_D(s);a.overrides=i}return a}function pae(e){return e==="."||e==="+"||e==="^"||e==="$"||e==="{"||e==="}"||e==="("||e===")"||e==="|"||e==="["||e==="]"||e==="\\"}function mae(e,t){let n="",a=0;while(a<t.length){let r=t[a];if(r==="*")if(t[a+1]==="*"){if(n+=".*",a+=2,t[a]==="/")a++}else n+="[^/]*",a++;else if(r==="?")n+="[^/]",a++;else if(pae(r))n+=`\\${r}`,a++;else n+=r,a++}return new RegExp(`^${n}$`).test(e)}function gae(e,t){if(e.length!==t.length)return t.length-e.length;return e.localeCompare(t)}function bae(e,t){let n=e.default?.reviewers??[],a=e.default?.approvers??[],i=Object.keys(e.overrides??{}).filter((s)=>mae(t,s)).sort(gae)[0];if(!i)return{reviewers:[...n],approvers:[...a]};let o=e.overrides?.[i]??{};return{reviewers:o.reviewers===void 0?[...n]:[...o.reviewers],approvers:o.approvers===void 0?[...a]:[...o.approvers],matchedOverride:i}}function fae(e,t){let n=lae(e);if(!cae(n))throw new Jn("reviewers_file_not_found",`reviewers file not found: ${n}`);let a=Aae(n,"utf-8"),r=uae(a);return bae(r,t)}async function hae(){try{let e=sae({cmd:["git","rev-parse","HEAD"],stdout:"pipe",stderr:"pipe"}),t=await Qr(e.stdout);if(await e.exited!==0)T({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O);let a=t.trim();if(!/^[a-f0-9]{40}$/i.test(a))T({code:"git_resolve_failed",message:`Invalid SHA format: ${a}. Use --sha to provide a commit SHA explicitly.`},O);return a.toLowerCase()}catch(e){T({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O)}}function yae(e){let t=[...e.reviewers],n=[...e.approvers];if(e.reviewersFrom){let r=fae(e.reviewersFrom,e.file);if(t.length===0)t=r.reviewers;if(n.length===0)n=r.approvers}let a=[];for(let r of t)if(r.trim())a.push({email:r.trim(),role:"reviewer",scopes:["read","comment"]});for(let r of n)if(r.trim())a.push({email:r.trim(),role:"approver",scopes:["read","comment","approve"]});return a}async function ED(e,t,n){let a=dae(e);if(!a.file)T({code:"missing_required_flag",message:"Missing required flag: --file"},O);let r=a.repo;if(!r||r===".")r=t.repoId;if(!r)T({code:"repo_id_missing",message:"Could not determine repo_id. Set repo.id in .typescape/config.yaml or use --repo."},O);let i=a.sha;if(!i)i=await hae();else{if(!/^[a-f0-9]{40}$/i.test(i))T({code:"invalid_sha_format",message:`Invalid SHA format: ${i}. Must be a 40-character hex string.`},O);i=i.toLowerCase()}let o=[];try{o=yae(a)}catch(l){if(l instanceof Jn)T({code:l.code,message:l.message},O);throw l}if(o.length===0&&!a.reviewersFrom)T({code:"missing_participants",message:"At least one participant is required. Use --reviewer <email>, --reviewers <email1,email2>, --participants <email1,email2>, or --approver <email>."},O);if(o.length===0&&a.reviewersFrom)console.error(`Warning: no participants resolved from --reviewers-from (${a.reviewersFrom}) for file ${a.file}; proceeding with no explicit participants.`);let s={repo_id:r,git_sha:i,file_path:a.file};if(a.title)s.title=a.title;if(s.participants=o,a.idempotencyKey)s.idempotency_key=a.idempotencyKey;let c={};if(a.idempotencyKey)c["Idempotency-Key"]=a.idempotencyKey;let A=await n.post("/sessions",{body:s,headers:c});if(a.format==="json")On({...A.body,resolved_participants:o},"json");else{let l=A.body.session?.id||"unknown",d=A.body.invitations?.[0]?.review_url||"";if(console.log(`Session created: ${l}`),d)console.log(`Review URL: ${d}`)}process.exit(V)}import{writeFileSync as wae}from"fs";function kae(e){let t={session:"",schema:"v1",format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else if(a==="--schema")t.schema=e[n+1]||"v1",n+=2;else if(a.startsWith("--schema="))t.schema=a.slice(9),n++;else if(a==="--view")t.view=e[n+1]||"",n+=2;else if(a.startsWith("--view="))t.view=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function vD(e,t,n){let a=kae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(a.schema!=="v1")T({code:"unsupported_schema_version",message:`Unsupported schema version: ${a.schema}. Only v1 is supported.`},O);let r={schema:a.schema};if(a.view)r.view=a.view;let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/export`,{query:r}),o=JSON.stringify(i.body,null,2);if(a.out)wae(a.out,o,"utf-8"),console.error(`Export written to ${a.out}`);else if(a.format==="json")console.log(o);else{let s=i.body.session,c=i.body.threads?.length??0,A=i.body.approvals?.length??0;console.log(`Session ID: ${s?.id??"unknown"}`),console.log(`File Path: ${s?.file_path??"unknown"}`),console.log(`Source Type: ${s?.source_type??"unknown"}`),console.log(`Git SHA: ${s?.git_sha??"N/A"}`),console.log(`Schema Version: ${i.body.schema_version}`),console.log(`Threads: ${c}`),console.log(`Approvals: ${A}`),console.log(`Request ID: ${i.body.request_id}`)}process.exit(V)}function Bae(e){let t={session:"",simulate:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<0)T({code:"invalid_wait_value",message:`Invalid --wait value: ${e[n+1]}. Must be a non-negative integer (seconds).`},O);t.wait=r,n+=2}else if(a.startsWith("--wait=")){let r=a.slice(7),i=parseInt(r,10);if(Number.isNaN(i)||i<0)T({code:"invalid_wait_value",message:`Invalid --wait value: ${r}. Must be a non-negative integer (seconds).`},O);t.wait=i,n++}else if(a==="--simulate")t.simulate=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Cae(e){let t=[];if(e.details)for(let[n,a]of Object.entries(e.details))t.push(`${n}=${a}`);if(e.thread_ids&&e.thread_ids.length>0)t.push(`threads=[${e.thread_ids.join(",")}]`);if(e.approval_ids&&e.approval_ids.length>0)t.push(`approval_ids=[${e.approval_ids.join(",")}]`);return t.join(" ")}async function QD(e,t,n){let a=Bae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={};if(a.simulate)r.simulate="true";if(a.wait!==void 0)r.wait=String(a.wait);let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/status`,{query:r}),{verdict:o,reasons:s}=i.body;if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else if(console.log(`Session: ${a.session}`),console.log(`Verdict: ${o}`),s.length>0){console.log("Reasons:");for(let c of s){let A=Cae(c);console.log(` ${c.code}${A?" "+A:""}`)}}if(o==="pass")process.exit(V);else process.exit(ma)}function _ae(e){let t={session:"",newSha:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--new-sha")t.newSha=e[n+1]||"",n+=2;else if(a.startsWith("--new-sha="))t.newSha=a.slice(10),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function xD(e,t,n){let a=_ae(e);if(!a.session){T({code:"missing_required_flag",message:"Missing required flag: --session"},O);return}if(!a.newSha){T({code:"missing_required_flag",message:"Missing required flag: --new-sha"},O);return}if(!/^[a-f0-9]{40}$/i.test(a.newSha)){T({code:"invalid_sha_format",message:`Invalid SHA format: ${a.newSha}. Must be a 40-character hex string.`},O);return}let r={git_sha:a.newSha.toLowerCase()};if(a.title)r.title=a.title;let i=await n.post(`/sessions/${encodeURIComponent(a.session)}/supersede`,{body:r});if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else{let{session:o,carry_forward:s,review_url:c}=i.body;console.log(`New session: ${o.id}`),console.log(`Supersedes: ${a.session}`);let A=s?.carried_count??0,l=s?.orphaned_count??0;if(console.log(`Carry-forward: ${A} threads carried, ${l} orphaned`),c)console.log(`Review URL: ${c}`)}process.exit(V)}function Eae(e){if(!e||typeof e!=="object")return!1;return e.features?.checks===!0}async function vae(e){let n=`${e.baseUrl.replace(/\/$/,"")}/v1/me/capabilities`,a;try{a=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiToken}`,Accept:"application/json"}})}catch(o){let s=o instanceof Error?o.message:String(o);T({code:"capabilities_fetch_failed",message:`Failed to load capabilities: ${s}`},ga)}let r={};if((a.headers.get("Content-Type")||"").includes("application/json"))try{r=await a.json()}catch{r={}}if(!a.ok){let o={};if(r&&typeof r==="object")o=r;let s=o.error?.code||"capabilities_fetch_failed",c=o.error?.message||`Failed to load capabilities (status ${a.status})`,A=o.request_id?` (request_id: ${o.request_id})`:"";T({code:s,message:`${c}${A}`},ga)}if(Eae(r))return;T({code:"feature_disabled",message:"Feature checks is not enabled for this deployment"},O)}function Qae(e){let t={session:"",wait:!0,timeout:300,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait")t.wait=!0,n++;else if(a==="--no-wait")t.wait=!1,n++;else if(a==="--timeout"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<=0)T({code:"invalid_timeout_value",message:`Invalid --timeout value: ${e[n+1]}. Must be a positive integer (seconds).`},O);t.timeout=r,n+=2}else if(a.startsWith("--timeout=")){let r=a.slice(10),i=parseInt(r,10);if(Number.isNaN(i)||i<=0)T({code:"invalid_timeout_value",message:`Invalid --timeout value: ${r}. Must be a positive integer (seconds).`},O);t.timeout=i,n++}else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function xae(e){return new Promise((t)=>setTimeout(t,e))}async function Iae(e,t,n,a){let r=Date.now()+a*1000,i=2000;while(Date.now()<r){let o=await e.get(`/sessions/${encodeURIComponent(t)}/checks/${encodeURIComponent(n)}`);if(o.body.status==="completed"||o.body.status==="failed")return o.body;await xae(2000)}T({code:"check_run_timeout",message:`Check run did not complete within ${a}s. Run ID: ${n}`},Pa)}async function ID(e,t,n){let a=Qae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);await vae(t);let r=await n.post(`/sessions/${encodeURIComponent(a.session)}/run-checks`),{check_run_id:i}=r.body;if(!a.wait){if(a.format==="json")console.log(JSON.stringify(r.body,null,2));else console.log(`Check run enqueued: ${i}`);process.exit(V)}if(a.format==="text")console.log(`Check run: ${i} (running)`);let o=Date.now(),s=await Iae(n,a.session,i,a.timeout);if(s.status==="failed"){if(a.format==="json")console.log(JSON.stringify(s,null,2));else if(console.log(`
|
|
290
|
+
`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=wb(e),n=oc(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let t=wb(e),n=oc(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){if(this.type!=="comment")return!1;if(this.indent<=t)return!1;return e.every((n)=>n.type==="newline"||n.type==="space")}*documentEnd(e){if(this.type!=="doc-mode"){if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}sqe.Parser=iZ});var lZ=S((bqe)=>{var oZ=HQ(),Aqe=Jl(),ad=Vl(),lqe=eQ(),dqe=ze(),uqe=ex(),sZ=tx();function cZ(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new uqe.LineCounter||null,prettyErrors:t}}function pqe(e,t={}){let{lineCounter:n,prettyErrors:a}=cZ(t),r=new sZ.Parser(n?.addNewLine),i=new oZ.Composer(t),o=Array.from(i.compose(r.parse(e)));if(a&&n)for(let s of o)s.errors.forEach(ad.prettifyError(e,n)),s.warnings.forEach(ad.prettifyError(e,n));if(o.length>0)return o;return Object.assign([],{empty:!0},i.streamInfo())}function AZ(e,t={}){let{lineCounter:n,prettyErrors:a}=cZ(t),r=new sZ.Parser(n?.addNewLine),i=new oZ.Composer(t),o=null;for(let s of i.compose(r.parse(e),!0,e.length))if(!o)o=s;else if(o.options.logLevel!=="silent"){o.errors.push(new ad.YAMLParseError(s.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(a&&n)o.errors.forEach(ad.prettifyError(e,n)),o.warnings.forEach(ad.prettifyError(e,n));return o}function mqe(e,t,n){let a=void 0;if(typeof t==="function")a=t;else if(n===void 0&&t&&typeof t==="object")n=t;let r=AZ(e,n);if(!r)return null;if(r.warnings.forEach((i)=>lqe.warn(r.options.logLevel,i)),r.errors.length>0)if(r.options.logLevel!=="silent")throw r.errors[0];else r.errors=[];return r.toJS(Object.assign({reviver:a},n))}function gqe(e,t,n){let a=null;if(typeof t==="function"||Array.isArray(t))a=t;else if(n===void 0&&t)n=t;if(typeof n==="string")n=n.length;if(typeof n==="number"){let r=Math.round(n);n=r<1?void 0:r>8?{indent:8}:{indent:r}}if(e===void 0){let{keepUndefined:r}=n??t??{};if(!r)return}if(dqe.isDocument(e)&&!a)return e.toString(n);return new Aqe.Document(e,a,n).toString(n)}bqe.parse=mqe;bqe.parseAllDocuments=pqe;bqe.parseDocument=AZ;bqe.stringify=gqe});var qZ=S((tdt,ONe)=>{ONe.exports={name:"@typescape-ai/cli",version:"1.0.15",description:"Typescape CLI - Create review sessions, export feedback, and integrate with AI workflows",type:"module",bin:{typescape:"./dist/cli.js"},files:["dist","README.md"],exports:{".":"./dist/cli.js"},publishConfig:{access:"public"},scripts:{build:"bun build src/index.ts --outfile=dist/cli.js --target=bun --bundle --minify",dev:"bun run --watch src/index.ts",test:"bun test",typecheck:"tsc -p tsconfig.typecheck.json --noEmit",lint:"eslint src",prepublishOnly:"bun run build"},dependencies:{},devDependencies:{"@types/bun":"1.1.14","@typescape/integrity":"workspace:*","@typescape/schemas":"workspace:*",ajv:"8.17.1","ajv-formats":"3.0.1",yaml:"2.8.2",zod:"4.3.0"},engines:{bun:">=1.0.0"},keywords:["typescape","cli","review","documentation","ai","feedback","bun"],repository:{type:"git",url:"https://github.com/voidserf/typescape-docs.git",directory:"apps/cli"},license:"MIT"}});var V=0,ma=1,O=2,ga=3,Pa=4,_b=5;function dx(e){if(e>=500)return 4;if(e===401||e===403)return 3;if(e>=400&&e<500)return 2;return 0}function On(e,t){if(t==="json")console.log(JSON.stringify(e,null,2));else if(typeof e==="string")console.log(e);else if(typeof e==="object"&&e!==null)for(let[n,a]of Object.entries(e))console.log(`${n}: ${a}`);else console.log(String(e))}function T(e,t){console.error(JSON.stringify({error:e},null,2)),process.exit(t)}function ux(e){console.error(e)}import{existsSync as nae,readFileSync as aae}from"fs";import{resolve as kD}from"path";var hne=_f(),yne=$c(),wne=cf(),qf=Sc(),kne=fc(),vr=Ge(),Bne=kr(),Cne=kt(),_ne=Cr(),Ene=_r(),YGe=zd(),vne=Sf(),Qne=Lf(),xne=jf(),Td=yD(),wD=gc();var Ine=hne.Composer,Dne=yne.Document,Fne=wne.Schema,$ne=qf.YAMLError,Sne=qf.YAMLParseError,Lne=qf.YAMLWarning,jne=kne.Alias,qne=vr.isAlias,Nne=vr.isCollection,Mne=vr.isDocument,Gne=vr.isMap,Rne=vr.isNode,Pne=vr.isPair,zne=vr.isScalar,Une=vr.isSeq,Hne=Bne.Pair,Tne=Cne.Scalar,One=_ne.YAMLMap,Zne=Ene.YAMLSeq;var Yne=vne.Lexer,Kne=Qne.LineCounter,Wne=xne.Parser,Bi=Td.parse,Jne=Td.parseAllDocuments,Vne=Td.parseDocument,Xne=Td.stringify,eae=wD.visit,tae=wD.visitAsync;var Nf=".typescape/config.yaml",rae="TYPESCAPE_API_TOKEN",BD="TYPESCAPE_BASE_URL",Gc=1;function iae(e){if(e)return kD(e);return kD(Nf)}function Kn(e){let t=iae(e);if(!nae(t))T({code:"config_not_found",message:`Configuration file not found: ${t}. Create a .typescape/config.yaml file or use --config to specify a path.`},O);let n;try{let c=aae(t,"utf-8");n=Bi(c)}catch(c){let A=c instanceof Error?c.message:String(c);T({code:"config_parse_error",message:`Failed to parse config file: ${A}`},O)}if(n.version!==void 0&&n.version!==Gc)T({code:"unsupported_config_version",message:`Unsupported config version: ${n.version}. Only version ${Gc} is supported.`},O);let a=process.env[BD],r=n.server?.base_url,i=a||r;if(!i)T({code:"missing_base_url",message:`Missing server.base_url in config file. Set server.base_url in ${t} or set the ${BD} environment variable.`},O);let o=n.server?.api_token_env||rae,s=process.env[o];if(!s)T({code:"missing_api_token",message:`Environment variable ${o} is not set. Set it to your operator API token.`},ga);return{baseUrl:i,apiToken:s,repoId:n.repo?.id,configPath:t}}function oae(e){if(e===void 0)return null;try{let t=JSON.stringify(e);if(!t)return null;if(t.length<=400)return t;return`${t.slice(0,397)}...`}catch{return null}}function Wn(e){let t=e.baseUrl.replace(/\/$/,""),n="/v1";async function a(r,i,o={}){let s=`${t}/v1${i}`;if(o.query&&Object.keys(o.query).length>0){let g=new URLSearchParams(o.query);s+=`?${g.toString()}`}let c={Authorization:`Bearer ${e.apiToken}`,Accept:"application/json",...o.headers};if(o.body!==void 0)c["Content-Type"]="application/json";let A;try{A=await fetch(s,{method:r,headers:c,body:o.body!==void 0?JSON.stringify(o.body):void 0})}catch(g){let b=g instanceof Error?g.message:String(g);T({code:"network_error",message:`Network error: ${b}`},ga)}let l,d=null;if((A.headers.get("Content-Type")||"").includes("application/json"))try{l=await A.json()}catch{l={}}else{try{d=(await A.text()).trim()||null}catch{d=null}l={}}let p=l?.request_id||A.headers.get("X-Request-Id")||"unknown";if(!A.ok){let g=l,b=g.error?.code||(d?"unexpected_response":"api_error"),y=g.error?.message||`API request failed with status ${A.status}`;if(!g.error?.message&&d){let D=d.length<=300?d:`${d.slice(0,297)}...`;y=`${y}: ${D}`}let w=[];if(g.error?.fix_hint)w.push(`fix_hint: ${g.error.fix_hint}`);let E=oae(g.error?.details);if(E)w.push(`details: ${E}`);if(w.length>0)y=`${y} (${w.join("; ")})`;let C=dx(A.status);T({code:b,message:`${y} (request_id: ${p})`},C)}return{status:A.status,body:l,requestId:p}}return{async get(r,i){return a("GET",r,i)},async post(r,i){return a("POST",r,i)},async put(r,i){return a("PUT",r,i)},async patch(r,i){return a("PATCH",r,i)},async delete(r,i){return a("DELETE",r,i)},request:a}}var{spawn:sae}=globalThis.Bun;import{existsSync as cae,readFileSync as Aae}from"fs";import{resolve as lae}from"path";async function Qr(e){if(!e||typeof e==="number")return"";return new Response(e).text()}class Jn extends Error{code;constructor(e,t){super(t);this.code=e;this.name="ReviewersFromConfigError"}}function dae(e){let t={file:"",reviewers:[],approvers:[],format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--file")t.file=e[n+1]||"",n+=2;else if(a.startsWith("--file="))t.file=a.slice(7),n++;else if(a==="--repo")t.repo=e[n+1],n+=2;else if(a.startsWith("--repo="))t.repo=a.slice(7),n++;else if(a==="--sha")t.sha=e[n+1],n+=2;else if(a.startsWith("--sha="))t.sha=a.slice(6),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--reviewer")t.reviewers.push(e[n+1]||""),n+=2;else if(a.startsWith("--reviewer="))t.reviewers.push(a.slice(11)),n++;else if(a==="--reviewers"){let r=e[n+1]||"";t.reviewers.push(...Od(r)),n+=2}else if(a.startsWith("--reviewers=")){let r=a.slice(12);t.reviewers.push(...Od(r)),n++}else if(a==="--participants"){let r=e[n+1]||"";t.reviewers.push(...Od(r)),n+=2}else if(a.startsWith("--participants=")){let r=a.slice(15);t.reviewers.push(...Od(r)),n++}else if(a==="--approver")t.approvers.push(e[n+1]||""),n+=2;else if(a.startsWith("--approver="))t.approvers.push(a.slice(11)),n++;else if(a==="--reviewers-from")t.reviewersFrom=e[n+1],n+=2;else if(a.startsWith("--reviewers-from="))t.reviewersFrom=a.slice(17),n++;else if(a==="--idempotency-key")t.idempotencyKey=e[n+1],n+=2;else if(a.startsWith("--idempotency-key="))t.idempotencyKey=a.slice(18),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Od(e){return e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0)}function CD(e){if(!Array.isArray(e))throw new Jn("reviewers_file_invalid","reviewers.yaml fields must be string arrays.");return e.map((n)=>{if(typeof n!=="string")throw new Jn("reviewers_file_invalid","reviewers.yaml fields must only contain email strings.");return n.trim()}).filter((n)=>n.length>0)}function _D(e){if(e===void 0)return{};if(!e||typeof e!=="object"||Array.isArray(e))throw new Jn("reviewers_file_invalid","reviewers.yaml role sections must be objects.");let t=e;for(let n of Object.keys(t))if(n!=="reviewers"&&n!=="approvers")throw new Jn("reviewers_file_invalid",`Unknown key in reviewers.yaml role section: ${n}`);return{reviewers:t.reviewers===void 0?void 0:CD(t.reviewers),approvers:t.approvers===void 0?void 0:CD(t.approvers)}}function uae(e){let t;try{t=Bi(e)}catch(r){let i=r instanceof Error?r.message:String(r);throw new Jn("reviewers_file_parse_error",`Failed to parse reviewers file: ${i}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw new Jn("reviewers_file_invalid","reviewers.yaml must be a YAML object.");let n=t;for(let r of Object.keys(n))if(r!=="default"&&r!=="overrides")throw new Jn("reviewers_file_invalid",`Unknown key in reviewers.yaml: ${r}`);let a={default:_D(n.default)};if(n.overrides!==void 0){if(!n.overrides||typeof n.overrides!=="object"||Array.isArray(n.overrides))throw new Jn("reviewers_file_invalid","reviewers.yaml overrides must be an object keyed by glob pattern.");let r=n.overrides,i={};for(let[o,s]of Object.entries(r))i[o]=_D(s);a.overrides=i}return a}function pae(e){return e==="."||e==="+"||e==="^"||e==="$"||e==="{"||e==="}"||e==="("||e===")"||e==="|"||e==="["||e==="]"||e==="\\"}function mae(e,t){let n="",a=0;while(a<t.length){let r=t[a];if(r==="*")if(t[a+1]==="*"){if(n+=".*",a+=2,t[a]==="/")a++}else n+="[^/]*",a++;else if(r==="?")n+="[^/]",a++;else if(pae(r))n+=`\\${r}`,a++;else n+=r,a++}return new RegExp(`^${n}$`).test(e)}function gae(e,t){if(e.length!==t.length)return t.length-e.length;return e.localeCompare(t)}function bae(e,t){let n=e.default?.reviewers??[],a=e.default?.approvers??[],i=Object.keys(e.overrides??{}).filter((s)=>mae(t,s)).sort(gae)[0];if(!i)return{reviewers:[...n],approvers:[...a]};let o=e.overrides?.[i]??{};return{reviewers:o.reviewers===void 0?[...n]:[...o.reviewers],approvers:o.approvers===void 0?[...a]:[...o.approvers],matchedOverride:i}}function fae(e,t){let n=lae(e);if(!cae(n))throw new Jn("reviewers_file_not_found",`reviewers file not found: ${n}`);let a=Aae(n,"utf-8"),r=uae(a);return bae(r,t)}async function hae(){try{let e=sae({cmd:["git","rev-parse","HEAD"],stdout:"pipe",stderr:"pipe"}),t=await Qr(e.stdout);if(await e.exited!==0)T({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O);let a=t.trim();if(!/^[a-f0-9]{40}$/i.test(a))T({code:"git_resolve_failed",message:`Invalid SHA format: ${a}. Use --sha to provide a commit SHA explicitly.`},O);return a.toLowerCase()}catch(e){T({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O)}}function yae(e){let t=[...e.reviewers],n=[...e.approvers];if(e.reviewersFrom){let r=fae(e.reviewersFrom,e.file);if(t.length===0)t=r.reviewers;if(n.length===0)n=r.approvers}let a=[];for(let r of t)if(r.trim())a.push({email:r.trim(),role:"reviewer",scopes:["read","comment"]});for(let r of n)if(r.trim())a.push({email:r.trim(),role:"approver",scopes:["read","comment","approve"]});return a}async function ED(e,t,n){let a=dae(e);if(!a.file)T({code:"missing_required_flag",message:"Missing required flag: --file"},O);let r=a.repo;if(!r||r===".")r=t.repoId;if(!r)T({code:"repo_id_missing",message:"Could not determine repo_id. Set repo.id in .typescape/config.yaml or use --repo."},O);let i=a.sha;if(!i)i=await hae();else{if(!/^[a-f0-9]{40}$/i.test(i))T({code:"invalid_sha_format",message:`Invalid SHA format: ${i}. Must be a 40-character hex string.`},O);i=i.toLowerCase()}let o=[];try{o=yae(a)}catch(l){if(l instanceof Jn)T({code:l.code,message:l.message},O);throw l}if(o.length===0&&!a.reviewersFrom)T({code:"missing_participants",message:"At least one participant is required. Use --reviewer <email>, --reviewers <email1,email2>, --participants <email1,email2>, or --approver <email>."},O);if(o.length===0&&a.reviewersFrom)console.error(`Warning: no participants resolved from --reviewers-from (${a.reviewersFrom}) for file ${a.file}; proceeding with no explicit participants.`);let s={repo_id:r,git_sha:i,file_path:a.file};if(a.title)s.title=a.title;if(s.participants=o,a.idempotencyKey)s.idempotency_key=a.idempotencyKey;let c={};if(a.idempotencyKey)c["Idempotency-Key"]=a.idempotencyKey;let A=await n.post("/sessions",{body:s,headers:c});if(a.format==="json")On({...A.body,resolved_participants:o},"json");else{let l=A.body.session?.id||"unknown",d=A.body.invitations?.[0]?.review_url||"";if(console.log(`Session created: ${l}`),d)console.log(`Review URL: ${d}`)}process.exit(V)}import{writeFileSync as wae}from"fs";function kae(e){let t={session:"",schema:"v1",format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else if(a==="--schema")t.schema=e[n+1]||"v1",n+=2;else if(a.startsWith("--schema="))t.schema=a.slice(9),n++;else if(a==="--view")t.view=e[n+1]||"",n+=2;else if(a.startsWith("--view="))t.view=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function vD(e,t,n){let a=kae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(a.schema!=="v1")T({code:"unsupported_schema_version",message:`Unsupported schema version: ${a.schema}. Only v1 is supported.`},O);let r={schema:a.schema};if(a.view)r.view=a.view;let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/export`,{query:r}),o=JSON.stringify(i.body,null,2);if(a.out)wae(a.out,o,"utf-8"),console.error(`Export written to ${a.out}`);else if(a.format==="json")console.log(o);else{let s=i.body.session,c=i.body.threads?.length??0,A=i.body.approvals?.length??0;console.log(`Session ID: ${s?.id??"unknown"}`),console.log(`File Path: ${s?.file_path??"unknown"}`),console.log(`Source Type: ${s?.source_type??"unknown"}`),console.log(`Git SHA: ${s?.git_sha??"N/A"}`),console.log(`Schema Version: ${i.body.schema_version}`),console.log(`Threads: ${c}`),console.log(`Approvals: ${A}`),console.log(`Request ID: ${i.body.request_id}`)}process.exit(V)}function Bae(e){let t={session:"",simulate:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<0)T({code:"invalid_wait_value",message:`Invalid --wait value: ${e[n+1]}. Must be a non-negative integer (seconds).`},O);t.wait=r,n+=2}else if(a.startsWith("--wait=")){let r=a.slice(7),i=parseInt(r,10);if(Number.isNaN(i)||i<0)T({code:"invalid_wait_value",message:`Invalid --wait value: ${r}. Must be a non-negative integer (seconds).`},O);t.wait=i,n++}else if(a==="--simulate")t.simulate=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Cae(e){let t=[];if(e.details)for(let[n,a]of Object.entries(e.details))t.push(`${n}=${a}`);if(e.thread_ids&&e.thread_ids.length>0)t.push(`threads=[${e.thread_ids.join(",")}]`);if(e.approval_ids&&e.approval_ids.length>0)t.push(`approval_ids=[${e.approval_ids.join(",")}]`);return t.join(" ")}async function QD(e,t,n){let a=Bae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={};if(a.simulate)r.simulate="true";if(a.wait!==void 0)r.wait=String(a.wait);let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/status`,{query:r}),{verdict:o,reasons:s}=i.body;if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else if(console.log(`Session: ${a.session}`),console.log(`Verdict: ${o}`),s.length>0){console.log("Reasons:");for(let c of s){let A=Cae(c);console.log(` ${c.code}${A?" "+A:""}`)}}if(o==="pass")process.exit(V);else process.exit(ma)}function _ae(e){let t={session:"",newSha:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--new-sha")t.newSha=e[n+1]||"",n+=2;else if(a.startsWith("--new-sha="))t.newSha=a.slice(10),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function xD(e,t,n){let a=_ae(e);if(!a.session){T({code:"missing_required_flag",message:"Missing required flag: --session"},O);return}if(!a.newSha){T({code:"missing_required_flag",message:"Missing required flag: --new-sha"},O);return}if(!/^[a-f0-9]{40}$/i.test(a.newSha)){T({code:"invalid_sha_format",message:`Invalid SHA format: ${a.newSha}. Must be a 40-character hex string.`},O);return}let r={git_sha:a.newSha.toLowerCase()};if(a.title)r.title=a.title;let i=await n.post(`/sessions/${encodeURIComponent(a.session)}/supersede`,{body:r});if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else{let{session:o,carry_forward:s,review_url:c}=i.body;console.log(`New session: ${o.id}`),console.log(`Supersedes: ${a.session}`);let A=s?.carried_count??0,l=s?.orphaned_count??0;if(console.log(`Carry-forward: ${A} threads carried, ${l} orphaned`),c)console.log(`Review URL: ${c}`)}process.exit(V)}function Eae(e){if(!e||typeof e!=="object")return!1;return e.features?.checks===!0}async function vae(e){let n=`${e.baseUrl.replace(/\/$/,"")}/v1/me/capabilities`,a;try{a=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiToken}`,Accept:"application/json"}})}catch(o){let s=o instanceof Error?o.message:String(o);T({code:"capabilities_fetch_failed",message:`Failed to load capabilities: ${s}`},ga)}let r={};if((a.headers.get("Content-Type")||"").includes("application/json"))try{r=await a.json()}catch{r={}}if(!a.ok){let o={};if(r&&typeof r==="object")o=r;let s=o.error?.code||"capabilities_fetch_failed",c=o.error?.message||`Failed to load capabilities (status ${a.status})`,A=o.request_id?` (request_id: ${o.request_id})`:"";T({code:s,message:`${c}${A}`},ga)}if(Eae(r))return;T({code:"feature_disabled",message:"Feature checks is not enabled for this deployment"},O)}function Qae(e){let t={session:"",wait:!0,timeout:300,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait")t.wait=!0,n++;else if(a==="--no-wait")t.wait=!1,n++;else if(a==="--timeout"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<=0)T({code:"invalid_timeout_value",message:`Invalid --timeout value: ${e[n+1]}. Must be a positive integer (seconds).`},O);t.timeout=r,n+=2}else if(a.startsWith("--timeout=")){let r=a.slice(10),i=parseInt(r,10);if(Number.isNaN(i)||i<=0)T({code:"invalid_timeout_value",message:`Invalid --timeout value: ${r}. Must be a positive integer (seconds).`},O);t.timeout=i,n++}else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function xae(e){return new Promise((t)=>setTimeout(t,e))}async function Iae(e,t,n,a){let r=Date.now()+a*1000,i=2000;while(Date.now()<r){let o=await e.get(`/sessions/${encodeURIComponent(t)}/checks/${encodeURIComponent(n)}`);if(o.body.status==="completed"||o.body.status==="failed")return o.body;await xae(2000)}T({code:"check_run_timeout",message:`Check run did not complete within ${a}s. Run ID: ${n}`},Pa)}async function ID(e,t,n){let a=Qae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);await vae(t);let r=await n.post(`/sessions/${encodeURIComponent(a.session)}/run-checks`),{check_run_id:i}=r.body;if(!a.wait){if(a.format==="json")console.log(JSON.stringify(r.body,null,2));else console.log(`Check run enqueued: ${i}`);process.exit(V)}if(a.format==="text")console.log(`Check run: ${i} (running)`);let o=Date.now(),s=await Iae(n,a.session,i,a.timeout);if(s.status==="failed"){if(a.format==="json")console.log(JSON.stringify(s,null,2));else if(console.log(`
|
|
291
291
|
Check run failed.`),s.error_json)console.log(`Error: ${JSON.stringify(s.error_json,null,2)}`);process.exit(Pa)}if(a.format==="json")console.log(JSON.stringify(s,null,2));else{let A=((Date.now()-o)/1000).toFixed(1);if(console.log(`Runner: checks@${s.runner_version} | Config: ${s.config_hash.slice(0,12)}`),console.log(`
|
|
292
292
|
Completed in ${A}s`),s.truncated)ux("Warning: Results truncated \u2014 findings exceeded maximum per run.");let l=s.findings||[];if(l.length>0){console.log("");for(let p of l){let g=p.finding_gate==="gates"?"blocking":p.finding_gate==="informational"?"suggestion":p.finding_gate,b=p.block_id?`Block ${p.block_id}`:"Session-level",y=p.title||p.rule_id;if(console.log(` [${g}] ${y} (rule: ${p.rule_id})`),p.body_md)console.log(` ${b} -> ${JSON.stringify(p.body_md)}`);else console.log(` ${b}`)}}let d=l.filter((p)=>p.finding_gate==="gates").length,u=l.length-d;console.log(`
|
|
293
293
|
Result: ${l.length} findings (${d} blocking, ${u} other)`)}if((s.findings||[]).some((A)=>A.finding_gate==="gates"))process.exit(ma);else process.exit(V)}import{createHash as Dae}from"crypto";import{readFileSync as Fae,writeFileSync as $ae}from"fs";var{spawn:Sae}=globalThis.Bun;function Lae(e){let t={session:"",threads:[],mode:"accepted_suggestions_only",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--threads"){let r=e[n+1]||"";t.threads=r.split(",").map((i)=>i.trim()).filter(Boolean),n+=2}else if(a.startsWith("--threads=")){let r=a.slice(10);t.threads=r.split(",").map((i)=>i.trim()).filter(Boolean),n++}else if(a==="--mode")t.mode=e[n+1]||"accepted_suggestions_only",n+=2;else if(a.startsWith("--mode="))t.mode=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else n++}return t}async function DD(e,t,n){let a=Lae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={mode:a.mode};if(a.threads.length>0)r.thread_ids=a.threads;let o=(await n.post(`/sessions/${encodeURIComponent(a.session)}/proposed-changes`,{body:r})).body;if(a.out)$ae(a.out,o.patch,"utf-8"),console.error(`Patch written to ${a.out}`);if(a.format==="json")console.log(JSON.stringify(o,null,2));else{let s=o.target.git_sha?`${o.target.repo_id??"?"} @ ${o.target.git_sha}`:o.target.source_type;console.log(`Proposed Change: ${o.proposed_change_id}`),console.log(`Target: ${s} / ${o.target.file_path}`),console.log(`Expected SHA256: ${o.expected_source_content_sha256}`),console.log(`Patch SHA256: ${o.patch_sha256}`),console.log(`State: ${o.state}`),console.log("---"),console.log(o.patch)}process.exit(V)}function jae(e){let t={session:"",change:"",checkOnly:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--change")t.change=e[n+1]||"",n+=2;else if(a.startsWith("--change="))t.change=a.slice(9),n++;else if(a==="--check-only")t.checkOnly=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function FD(e,t,n){let a=jae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(!a.change)T({code:"missing_required_flag",message:"Missing required flag: --change"},O);let i=(await n.get(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}`)).body,o=i.target.file_path,s;try{s=Buffer.from(Fae(o))}catch{T({code:"file_not_found",message:`Local file not found: ${o}`},O)}let c=`sha256:${Dae("sha256").update(new Uint8Array(s)).digest("hex")}`;if(c!==i.expected_source_content_sha256)T({code:"content_hash_mismatch",message:`Local file hash mismatch. Expected: ${i.expected_source_content_sha256}. Got: ${c}. The file has changed since session creation.`},O);let A=a.checkOnly?["git","apply","--check","-"]:["git","apply","-"],l=Sae({cmd:A,stdin:"pipe",stdout:"pipe",stderr:"pipe"});l.stdin.write(i.patch),l.stdin.end();let d=await Qr(l.stderr);if(await l.exited!==0)T({code:"git_apply_failed",message:`git apply failed: ${d.trim()||"patch could not be applied"}`},Pa);if(a.format==="json")console.log(JSON.stringify({proposed_change_id:i.proposed_change_id,file_path:o,check_only:a.checkOnly,applied:!a.checkOnly},null,2));else if(a.checkOnly)console.log(`Patch check passed for ${o}`);else console.log(`Patch applied to ${o}`);process.exit(V)}function qae(e){let t={session:"",change:"",commit:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--change")t.change=e[n+1]||"",n+=2;else if(a.startsWith("--change="))t.change=a.slice(9),n++;else if(a==="--commit")t.commit=e[n+1]||"",n+=2;else if(a.startsWith("--commit="))t.commit=a.slice(9),n++;else if(a==="--pr")t.pr=e[n+1],n+=2;else if(a.startsWith("--pr="))t.pr=a.slice(5),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function $D(e,t,n){let a=qae(e);if(!a.session)T({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(!a.change)T({code:"missing_required_flag",message:"Missing required flag: --change"},O);if(!a.commit)T({code:"missing_required_flag",message:"Missing required flag: --commit"},O);let i={patch_sha256:(await n.get(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}`)).body.patch_sha256,result_commit_sha:a.commit};if(a.pr)i.result_pr_url=a.pr;let o=await n.post(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}/applied`,{body:i});if(a.format==="json")console.log(JSON.stringify(o.body,null,2));else if(console.log(`Evidence recorded for ${a.change}`),console.log(` Commit: ${a.commit}`),a.pr)console.log(` PR: ${a.pr}`);process.exit(V)}import{readFileSync as PM,writeFileSync as hke}from"fs";import{createHash as Nae}from"crypto";var Mf=new Uint8Array([239,187,191]);function Mae(e){return e.length>=3&&e[0]===Mf[0]&&e[1]===Mf[1]&&e[2]===Mf[2]}function Gf(e){let t=e.length,n=!1,a=e;if(Mae(a))a=a.slice(3),n=!0;let r=new TextDecoder("utf-8",{fatal:!0}),i;try{i=r.decode(a)}catch{throw Error("Invalid UTF-8 encoding")}let o=i;i=i.replace(/\r\n/g,`
|