faf-cli 7.10.0 → 7.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/cli.js +99 -99
- package/dist/cli.js.map +3 -3
- package/dist/index.js +11 -11
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
- package/project.faf +3 -3
package/dist/index.js
CHANGED
|
@@ -136,10 +136,10 @@ ${Z.comment}`:Z.comment}this.doc.range[2]=Z.offset;break}default:this.errors.pus
|
|
|
136
136
|
`)+1;while(Z!==0)this.onNewLine(this.offset+Z),Z=this.source.indexOf(`
|
|
137
137
|
`,Z)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap($){let Z=$.items[$.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,Z.value){let Q="end"in Z.value?Z.value.end:void 0;if((Array.isArray(Q)?Q[Q.length-1]:void 0)?.type==="comment")Q?.push(this.sourceToken);else $.items.push({start:[this.sourceToken]})}else if(Z.sep)Z.sep.push(this.sourceToken);else Z.start.push(this.sourceToken);return;case"space":case"comment":if(Z.value)$.items.push({start:[this.sourceToken]});else if(Z.sep)Z.sep.push(this.sourceToken);else{if(this.atIndentedComment(Z.start,$.indent)){let X=$.items[$.items.length-2]?.value?.end;if(Array.isArray(X)){x2(X,Z.start),X.push(this.sourceToken),$.items.pop();return}}Z.start.push(this.sourceToken)}return}if(this.indent>=$.indent){let Q=!this.onKeyLine&&this.indent===$.indent,X=Q&&(Z.sep||Z.explicitKey)&&this.type!=="seq-item-ind",z=[];if(X&&Z.sep&&!Z.value){let J=[];for(let H=0;H<Z.sep.length;++H){let U=Z.sep[H];switch(U.type){case"newline":J.push(H);break;case"space":break;case"comment":if(U.indent>$.indent)J.length=0;break;default:J.length=0}}if(J.length>=2)z=Z.sep.splice(J[1])}switch(this.type){case"anchor":case"tag":if(X||Z.value)z.push(this.sourceToken),$.items.push({start:z}),this.onKeyLine=!0;else if(Z.sep)Z.sep.push(this.sourceToken);else Z.start.push(this.sourceToken);return;case"explicit-key-ind":if(!Z.sep&&!Z.explicitKey)Z.start.push(this.sourceToken),Z.explicitKey=!0;else if(X||Z.value)z.push(this.sourceToken),$.items.push({start:z,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(Z.explicitKey)if(!Z.sep)if(W0(Z.start,"newline"))Object.assign(Z,{key:null,sep:[this.sourceToken]});else{let J=p0(Z.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:J,key:null,sep:[this.sourceToken]}]})}else if(Z.value)$.items.push({start:[],key:null,sep:[this.sourceToken]});else if(W0(Z.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:z,key:null,sep:[this.sourceToken]}]});else if(ZZ(Z.key)&&!W0(Z.sep,"newline")){let J=p0(Z.start),H=Z.key,U=Z.sep;U.push(this.sourceToken),delete Z.key,delete Z.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:J,key:H,sep:U}]})}else if(z.length>0)Z.sep=Z.sep.concat(z,this.sourceToken);else Z.sep.push(this.sourceToken);else if(!Z.sep)Object.assign(Z,{key:null,sep:[this.sourceToken]});else if(Z.value||X)$.items.push({start:z,key:null,sep:[this.sourceToken]});else if(W0(Z.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]});else Z.sep.push(this.sourceToken);this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let J=this.flowScalar(this.type);if(X||Z.value)$.items.push({start:z,key:J,sep:[]}),this.onKeyLine=!0;else if(Z.sep)this.stack.push(J);else Object.assign(Z,{key:J,sep:[]}),this.onKeyLine=!0;return}default:{let J=this.startBlockValue($);if(J){if(J.type==="block-seq"){if(!Z.explicitKey&&Z.sep&&!W0(Z.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else if(Q)$.items.push({start:z});this.stack.push(J);return}}}}yield*this.pop(),yield*this.step()}*blockSequence($){let Z=$.items[$.items.length-1];switch(this.type){case"newline":if(Z.value){let Q="end"in Z.value?Z.value.end:void 0;if((Array.isArray(Q)?Q[Q.length-1]:void 0)?.type==="comment")Q?.push(this.sourceToken);else $.items.push({start:[this.sourceToken]})}else Z.start.push(this.sourceToken);return;case"space":case"comment":if(Z.value)$.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(Z.start,$.indent)){let X=$.items[$.items.length-2]?.value?.end;if(Array.isArray(X)){x2(X,Z.start),X.push(this.sourceToken),$.items.pop();return}}Z.start.push(this.sourceToken)}return;case"anchor":case"tag":if(Z.value||this.indent<=$.indent)break;Z.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==$.indent)break;if(Z.value||W0(Z.start,"seq-item-ind"))$.items.push({start:[this.sourceToken]});else Z.start.push(this.sourceToken);return}if(this.indent>$.indent){let Q=this.startBlockValue($);if(Q){this.stack.push(Q);return}}yield*this.pop(),yield*this.step()}*flowCollection($){let Z=$.items[$.items.length-1];if(this.type==="flow-error-end"){let Q;do yield*this.pop(),Q=this.peek(1);while(Q?.type==="flow-collection")}else if($.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!Z||Z.sep)$.items.push({start:[this.sourceToken]});else Z.start.push(this.sourceToken);return;case"map-value-ind":if(!Z||Z.value)$.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Z.sep)Z.sep.push(this.sourceToken);else Object.assign(Z,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!Z||Z.value)$.items.push({start:[this.sourceToken]});else if(Z.sep)Z.sep.push(this.sourceToken);else Z.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let X=this.flowScalar(this.type);if(!Z||Z.value)$.items.push({start:[],key:X,sep:[]});else if(Z.sep)this.stack.push(X);else Object.assign(Z,{key:X,sep:[]});return}case"flow-map-end":case"flow-seq-end":$.end.push(this.sourceToken);return}let Q=this.startBlockValue($);if(Q)this.stack.push(Q);else yield*this.pop(),yield*this.step()}else{let Q=this.peek(2);if(Q.type==="block-map"&&(this.type==="map-value-ind"&&Q.indent===$.indent||this.type==="newline"&&!Q.items[Q.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&Q.type!=="flow-collection"){let X=j2(Q),z=p0(X);$Z($);let J=$.end.splice(1,$.end.length);J.push(this.sourceToken);let H={type:"block-map",offset:$.offset,indent:$.indent,items:[{start:z,key:$,sep:J}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=H}else yield*this.lineEnd($)}}flowScalar($){if(this.onNewLine){let Z=this.source.indexOf(`
|
|
138
138
|
`)+1;while(Z!==0)this.onNewLine(this.offset+Z),Z=this.source.indexOf(`
|
|
139
|
-
`,Z)+1}return{type:$,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue($){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 Z=j2($),Q=p0(Z);return Q.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:Q,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let Z=j2($),Q=p0(Z);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:Q,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment($,Z){if(this.type!=="comment")return!1;if(this.indent<=Z)return!1;return $.every((Q)=>Q.type==="newline"||Q.type==="space")}*documentEnd($){if(this.type!=="doc-mode"){if($.end)$.end.push(this.sourceToken);else $.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd($){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($.end)$.end.push(this.sourceToken);else $.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}nH.Parser=QZ});var UZ=F((zU)=>{var XZ=z8(),oH=M1(),P1=L1(),tH=_$(),eH=w(),$U=_8(),zZ=O8();function JZ($){let Z=$.prettyErrors!==!1;return{lineCounter:$.lineCounter||Z&&new $U.LineCounter||null,prettyErrors:Z}}function ZU($,Z={}){let{lineCounter:Q,prettyErrors:X}=JZ(Z),z=new zZ.Parser(Q?.addNewLine),J=new XZ.Composer(Z),H=Array.from(J.compose(z.parse($)));if(X&&Q)for(let U of H)U.errors.forEach(P1.prettifyError($,Q)),U.warnings.forEach(P1.prettifyError($,Q));if(H.length>0)return H;return Object.assign([],{empty:!0},J.streamInfo())}function HZ($,Z={}){let{lineCounter:Q,prettyErrors:X}=JZ(Z),z=new zZ.Parser(Q?.addNewLine),J=new XZ.Composer(Z),H=null;for(let U of J.compose(z.parse($),!0,$.length))if(!H)H=U;else if(H.options.logLevel!=="silent"){H.errors.push(new P1.YAMLParseError(U.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(X&&Q)H.errors.forEach(P1.prettifyError($,Q)),H.warnings.forEach(P1.prettifyError($,Q));return H}function QU($,Z,Q){let X=void 0;if(typeof Z==="function")X=Z;else if(Q===void 0&&Z&&typeof Z==="object")Q=Z;let z=HZ($,Q);if(!z)return null;if(z.warnings.forEach((J)=>tH.warn(z.options.logLevel,J)),z.errors.length>0)if(z.options.logLevel!=="silent")throw z.errors[0];else z.errors=[];return z.toJS(Object.assign({reviver:X},Q))}function XU($,Z,Q){let X=null;if(typeof Z==="function"||Array.isArray(Z))X=Z;else if(Q===void 0&&Z)Q=Z;if(typeof Q==="string")Q=Q.length;if(typeof Q==="number"){let z=Math.round(Q);Q=z<1?void 0:z>8?{indent:8}:{indent:z}}if($===void 0){let{keepUndefined:z}=Q??Z??{};if(!z)return}if(eH.isDocument($)&&!X)return $.toString(Q);return new oH.Document($,X,Q).toString(Q)}zU.parse=QU;zU.parseAllDocuments=ZU;zU.parseDocument=HZ;zU.stringify=XU});var v=[{index:1,path:"project.name",label:"Name",description:"Project name",category:"project"},{index:2,path:"project.goal",label:"Goal",description:"Goal (use case)",category:"project"},{index:3,path:"project.main_language",label:"Language",description:"Primary language",category:"project"},{index:4,path:"human_context.who",label:"Who",description:"Who is this for?",category:"human"},{index:5,path:"human_context.what",label:"What",description:"What are they building",category:"human"},{index:6,path:"human_context.why",label:"Why",description:"Why does it exist",category:"human"},{index:7,path:"human_context.where",label:"Where",description:"Where does it run",category:"human"},{index:8,path:"human_context.when",label:"When",description:"When was it started / timeline",category:"human"},{index:9,path:"human_context.how",label:"How",description:"How is it built",category:"human"},{index:10,path:"stack.frontend",canonical:"stack.framework",label:"Framework",description:"Framework (React, Svelte, etc.)",category:"frontend"},{index:11,path:"stack.css_framework",canonical:"stack.css",label:"CSS",description:"CSS framework",category:"frontend"},{index:12,path:"stack.ui_library",label:"UI Library",description:"UI component library",category:"frontend"},{index:13,path:"stack.state_management",canonical:"stack.state",label:"State",description:"State management",category:"frontend"},{index:14,path:"stack.backend",label:"Backend",description:"Backend framework",category:"backend"},{index:15,path:"stack.api_type",canonical:"stack.api",label:"API",description:"API style (REST, GraphQL, etc.)",category:"backend"},{index:16,path:"stack.runtime",label:"Runtime",description:"Runtime (Node, Bun, Python, etc.)",category:"backend"},{index:17,path:"stack.database",canonical:"stack.db",label:"Database",description:"Database",category:"backend"},{index:18,path:"stack.connection",label:"Connection",description:"Connection method (Prisma, etc.)",category:"backend"},{index:19,path:"stack.hosting",label:"Hosting",description:"Hosting platform",category:"universal"},{index:20,path:"stack.build",label:"Build",description:"Build tool",category:"universal"},{index:21,path:"stack.cicd",label:"CI/CD",description:"CI/CD",category:"universal"},{index:22,path:"stack.monorepo_tool",label:"Monorepo",description:"Monorepo tool",category:"enterprise_infra"},{index:23,path:"stack.package_manager",canonical:"stack.pkg_manager",label:"Package Manager",description:"Package manager",category:"enterprise_infra"},{index:24,path:"stack.workspaces",label:"Workspaces",description:"Workspace configuration",category:"enterprise_infra"},{index:25,path:"monorepo.packages_count",label:"Packages",description:"Number of packages",category:"enterprise_infra"},{index:26,path:"monorepo.build_orchestrator",label:"Build Orchestrator",description:"Build orchestration tool",category:"enterprise_infra"},{index:27,path:"stack.admin",label:"Admin",description:"Admin panel",category:"enterprise_app"},{index:28,path:"stack.cache",label:"Cache",description:"Caching layer",category:"enterprise_app"},{index:29,path:"stack.search",label:"Search",description:"Search engine",category:"enterprise_app"},{index:30,path:"stack.storage",label:"Storage",description:"Object storage",category:"enterprise_app"},{index:31,path:"monorepo.versioning_strategy",label:"Versioning",description:"Version strategy",category:"enterprise_ops"},{index:32,path:"monorepo.shared_configs",label:"Shared Configs",description:"Shared configs",category:"enterprise_ops"},{index:33,path:"monorepo.remote_cache",label:"Remote Cache",description:"Remote build cache",category:"enterprise_ops"}],e0=new Map(v.flatMap(($)=>$.canonical?[[$.path,$],[$.canonical,$]]:[[$.path,$]])),QV=new Map(v.filter(($)=>$.canonical).map(($)=>[$.canonical,$.path])),XV=new Map(v.filter(($)=>$.canonical).map(($)=>[$.path,$.canonical]));function n8($,Z){let Q=(z)=>{let J=z.split("."),H=$;for(let U of J)if(H&&typeof H==="object"&&U in H)H=H[U];else return;return H},X=Q(Z.path);if(X!==void 0)return X;if(Z.canonical)return Q(Z.canonical);return}function u4($){return v.filter((Z)=>Z.category===$)}var m4=v.filter(($)=>$.index<=21),l4=v,p1=new Set(["describe your project goal","development teams","cloud platform","null","none","unknown","n/a","not applicable"]);function K0($){if($===null||$===void 0||$==="")return!0;if(typeof $==="string")return p1.has($.toLowerCase().trim());if(Array.isArray($)&&$.length===0)return!0;if(typeof $==="object"&&Object.keys($).length===0)return!0;return!1}var S0={documentation:["project","human"],intent:["project","human"],encyclopedia:["project","human"],cli:["project","human","universal"],library:["project","human","universal"],sdk:["project","human","universal"],wasm:["project","human","universal"],html:["project","human","universal"],"server-card":["project","human","universal"],frontend:["project","frontend","human","universal"],website:["project","frontend","human","universal"],mobile:["project","frontend","human","universal"],app:["project","frontend","human","universal"],extension:["project","frontend","human","universal"],mcp:["project","backend","human","universal"],backend:["project","backend","universal","human"],"data-science":["project","backend","human","universal"],fullstack:["project","frontend","backend","universal","human"],svelte:["project","frontend","backend","universal","human"],framework:["project","frontend","backend","universal","human"],"monorepo-root":["project","human","enterprise_infra","enterprise_app","enterprise_ops"],mcpaas:["project","backend","universal","human","enterprise_app","enterprise_ops"],saas:["project","frontend","backend","universal","human","enterprise_app"],enterprise:["project","frontend","backend","universal","human","enterprise_infra","enterprise_app","enterprise_ops"]};var $$=($)=>(Z)=>`\x1B[${$}m${Z}\x1B[0m`,d1=$$("1"),$1=$$("2"),JV=$$("3"),Z1={cyan:"#00D4D4",cyanDeep:"#0E8C8C",orange:"#FF6B35"},c1=($)=>`\x1B[38;2;0;212;212m${$}\x1B[0m`,Z$=($)=>`\x1B[38;2;14;140;140m${$}\x1B[0m`,j0=($)=>`\x1B[38;5;208m${$}\x1B[0m`;var Z0=[{name:"TROPHY",indicator:`${j0("✪")} ${j0("TROPHY")}`,threshold:100},{name:"GOLD",indicator:`${j0(d1("★"))} ${j0("GOLD")}`,threshold:99},{name:"SILVER",indicator:`${c1("◆")} ${c1("SILVER")}`,threshold:95},{name:"BRONZE",indicator:`${Z$("◇")} ${Z$("BRONZE")}`,threshold:85},{name:"GREEN",indicator:`${d1("●")} GREEN`,threshold:70},{name:"YELLOW",indicator:`${$1("●")} YELLOW`,threshold:55},{name:"RED",indicator:`${$1("○")} RED`,threshold:1},{name:"WHITE",indicator:`${$1("♡")}`,threshold:0}];function Q1($){for(let Z of Z0)if($>=Z.threshold)return Z;return Z0[Z0.length-1]}function p4($){let Z=Q1($),Q=Z0.indexOf(Z);return Q>0?Z0[Q-1]:null}var z$={};f4(z$,{validate:()=>c4,sdkVersion:()=>s4,scoreFafb:()=>n4,scoreEnterprise:()=>d4,score:()=>X$,fafbInfo:()=>a4,decompile:()=>r4,compile:()=>i4});var Q$=null;function J0(){if(Q$)return Q$;try{let $=t0("faf-scoring-kernel");return Q$=$,$}catch{throw Error(`faf-scoring-kernel not installed.
|
|
139
|
+
`,Z)+1}return{type:$,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue($){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 Z=j2($),Q=p0(Z);return Q.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:Q,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let Z=j2($),Q=p0(Z);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:Q,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment($,Z){if(this.type!=="comment")return!1;if(this.indent<=Z)return!1;return $.every((Q)=>Q.type==="newline"||Q.type==="space")}*documentEnd($){if(this.type!=="doc-mode"){if($.end)$.end.push(this.sourceToken);else $.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd($){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($.end)$.end.push(this.sourceToken);else $.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}nH.Parser=QZ});var UZ=F((zU)=>{var XZ=z8(),oH=M1(),P1=L1(),tH=_$(),eH=w(),$U=_8(),zZ=O8();function JZ($){let Z=$.prettyErrors!==!1;return{lineCounter:$.lineCounter||Z&&new $U.LineCounter||null,prettyErrors:Z}}function ZU($,Z={}){let{lineCounter:Q,prettyErrors:X}=JZ(Z),z=new zZ.Parser(Q?.addNewLine),J=new XZ.Composer(Z),H=Array.from(J.compose(z.parse($)));if(X&&Q)for(let U of H)U.errors.forEach(P1.prettifyError($,Q)),U.warnings.forEach(P1.prettifyError($,Q));if(H.length>0)return H;return Object.assign([],{empty:!0},J.streamInfo())}function HZ($,Z={}){let{lineCounter:Q,prettyErrors:X}=JZ(Z),z=new zZ.Parser(Q?.addNewLine),J=new XZ.Composer(Z),H=null;for(let U of J.compose(z.parse($),!0,$.length))if(!H)H=U;else if(H.options.logLevel!=="silent"){H.errors.push(new P1.YAMLParseError(U.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(X&&Q)H.errors.forEach(P1.prettifyError($,Q)),H.warnings.forEach(P1.prettifyError($,Q));return H}function QU($,Z,Q){let X=void 0;if(typeof Z==="function")X=Z;else if(Q===void 0&&Z&&typeof Z==="object")Q=Z;let z=HZ($,Q);if(!z)return null;if(z.warnings.forEach((J)=>tH.warn(z.options.logLevel,J)),z.errors.length>0)if(z.options.logLevel!=="silent")throw z.errors[0];else z.errors=[];return z.toJS(Object.assign({reviver:X},Q))}function XU($,Z,Q){let X=null;if(typeof Z==="function"||Array.isArray(Z))X=Z;else if(Q===void 0&&Z)Q=Z;if(typeof Q==="string")Q=Q.length;if(typeof Q==="number"){let z=Math.round(Q);Q=z<1?void 0:z>8?{indent:8}:{indent:z}}if($===void 0){let{keepUndefined:z}=Q??Z??{};if(!z)return}if(eH.isDocument($)&&!X)return $.toString(Q);return new oH.Document($,X,Q).toString(Q)}zU.parse=QU;zU.parseAllDocuments=ZU;zU.parseDocument=HZ;zU.stringify=XU});var v=[{index:1,path:"project.name",label:"Name",description:"Project name",category:"project"},{index:2,path:"project.goal",label:"Goal",description:"Goal (use case)",category:"project"},{index:3,path:"project.main_language",label:"Language",description:"Primary language",category:"project"},{index:4,path:"human_context.who",label:"Who",description:"Who is this for?",category:"human"},{index:5,path:"human_context.what",label:"What",description:"What are they building",category:"human"},{index:6,path:"human_context.why",label:"Why",description:"Why does it exist",category:"human"},{index:7,path:"human_context.where",label:"Where",description:"Where does it run",category:"human"},{index:8,path:"human_context.when",label:"When",description:"When was it started / timeline",category:"human"},{index:9,path:"human_context.how",label:"How",description:"How is it built",category:"human"},{index:10,path:"stack.frontend",canonical:"stack.framework",label:"Framework",description:"Framework (React, Svelte, etc.)",category:"frontend"},{index:11,path:"stack.css_framework",canonical:"stack.css",label:"CSS",description:"CSS framework",category:"frontend"},{index:12,path:"stack.ui_library",label:"UI Library",description:"UI component library",category:"frontend"},{index:13,path:"stack.state_management",canonical:"stack.state",label:"State",description:"State management",category:"frontend"},{index:14,path:"stack.backend",label:"Backend",description:"Backend framework",category:"backend"},{index:15,path:"stack.api_type",canonical:"stack.api",label:"API",description:"API style (REST, GraphQL, etc.)",category:"backend"},{index:16,path:"stack.runtime",label:"Runtime",description:"Runtime (Node, Bun, Python, etc.)",category:"backend"},{index:17,path:"stack.database",canonical:"stack.db",label:"Database",description:"Database",category:"backend"},{index:18,path:"stack.connection",label:"Connection",description:"Connection method (Prisma, etc.)",category:"backend"},{index:19,path:"stack.hosting",label:"Hosting",description:"Hosting platform",category:"universal"},{index:20,path:"stack.build",label:"Build",description:"Build tool",category:"universal"},{index:21,path:"stack.cicd",label:"CI/CD",description:"CI/CD",category:"universal"},{index:22,path:"stack.monorepo_tool",label:"Monorepo",description:"Monorepo tool",category:"enterprise_infra"},{index:23,path:"stack.package_manager",canonical:"stack.pkg_manager",label:"Package Manager",description:"Package manager",category:"enterprise_infra"},{index:24,path:"stack.workspaces",label:"Workspaces",description:"Workspace configuration",category:"enterprise_infra"},{index:25,path:"monorepo.packages_count",label:"Packages",description:"Number of packages",category:"enterprise_infra"},{index:26,path:"monorepo.build_orchestrator",label:"Build Orchestrator",description:"Build orchestration tool",category:"enterprise_infra"},{index:27,path:"stack.admin",label:"Admin",description:"Admin panel",category:"enterprise_app"},{index:28,path:"stack.cache",label:"Cache",description:"Caching layer",category:"enterprise_app"},{index:29,path:"stack.search",label:"Search",description:"Search engine",category:"enterprise_app"},{index:30,path:"stack.storage",label:"Storage",description:"Object storage",category:"enterprise_app"},{index:31,path:"monorepo.versioning_strategy",label:"Versioning",description:"Version strategy",category:"enterprise_ops"},{index:32,path:"monorepo.shared_configs",label:"Shared Configs",description:"Shared configs",category:"enterprise_ops"},{index:33,path:"monorepo.remote_cache",label:"Remote Cache",description:"Remote build cache",category:"enterprise_ops"}],e0=new Map(v.flatMap(($)=>$.canonical?[[$.path,$],[$.canonical,$]]:[[$.path,$]])),XV=new Map(v.filter(($)=>$.canonical).map(($)=>[$.canonical,$.path])),zV=new Map(v.filter(($)=>$.canonical).map(($)=>[$.path,$.canonical]));function n8($,Z){let Q=(z)=>{let J=z.split("."),H=$;for(let U of J)if(H&&typeof H==="object"&&U in H)H=H[U];else return;return H},X=Q(Z.path);if(X!==void 0)return X;if(Z.canonical)return Q(Z.canonical);return}function u4($){return v.filter((Z)=>Z.category===$)}var m4=v.filter(($)=>$.index<=21),l4=v,p1=new Set(["describe your project goal","development teams","cloud platform","null","none","unknown","n/a","not applicable"]);function K0($){if($===null||$===void 0||$==="")return!0;if(typeof $==="string")return p1.has($.toLowerCase().trim());if(Array.isArray($)&&$.length===0)return!0;if(typeof $==="object"&&Object.keys($).length===0)return!0;return!1}var S0={documentation:["project","human"],intent:["project","human"],encyclopedia:["project","human"],cli:["project","human","universal"],library:["project","human","universal"],sdk:["project","human","universal"],wasm:["project","human","universal"],html:["project","human","universal"],"server-card":["project","human","universal"],frontend:["project","frontend","human","universal"],website:["project","frontend","human","universal"],mobile:["project","frontend","human","universal"],app:["project","frontend","human","universal"],extension:["project","frontend","human","universal"],mcp:["project","backend","human","universal"],backend:["project","backend","universal","human"],"data-science":["project","backend","human","universal"],fullstack:["project","frontend","backend","universal","human"],svelte:["project","frontend","backend","universal","human"],framework:["project","frontend","backend","universal","human"],"monorepo-root":["project","human","enterprise_infra","enterprise_app","enterprise_ops"],mcpaas:["project","backend","universal","human","enterprise_app","enterprise_ops"],saas:["project","frontend","backend","universal","human","enterprise_app"],enterprise:["project","frontend","backend","universal","human","enterprise_infra","enterprise_app","enterprise_ops"]};var $$=($)=>(Z)=>`\x1B[${$}m${Z}\x1B[0m`,d1=$$("1"),$1=$$("2"),HV=$$("3"),Z1={cyan:"#00D4D4",cyanDeep:"#0E8C8C",orange:"#FF6B35"},c1=($)=>`\x1B[38;2;0;212;212m${$}\x1B[0m`,Z$=($)=>`\x1B[38;2;14;140;140m${$}\x1B[0m`,j0=($)=>`\x1B[38;5;208m${$}\x1B[0m`;var Z0=[{name:"TROPHY",indicator:`${j0("✪")} ${j0("TROPHY")}`,threshold:100},{name:"GOLD",indicator:`${j0(d1("★"))} ${j0("GOLD")}`,threshold:99},{name:"SILVER",indicator:`${c1("◆")} ${c1("SILVER")}`,threshold:95},{name:"BRONZE",indicator:`${Z$("◇")} ${Z$("BRONZE")}`,threshold:85},{name:"GREEN",indicator:`${d1("●")} GREEN`,threshold:70},{name:"YELLOW",indicator:`${$1("●")} YELLOW`,threshold:55},{name:"RED",indicator:`${$1("○")} RED`,threshold:1},{name:"WHITE",indicator:`${$1("♡")}`,threshold:0}];function Q1($){for(let Z of Z0)if($>=Z.threshold)return Z;return Z0[Z0.length-1]}function p4($){let Z=Q1($),Q=Z0.indexOf(Z);return Q>0?Z0[Q-1]:null}var z$={};f4(z$,{validate:()=>c4,sdkVersion:()=>s4,scoreFafb:()=>n4,scoreEnterprise:()=>d4,score:()=>X$,fafbInfo:()=>a4,decompile:()=>r4,compile:()=>i4});var Q$=null;function J0(){if(Q$)return Q$;try{let $=t0("faf-scoring-kernel");return Q$=$,$}catch{throw Error(`faf-scoring-kernel not installed.
|
|
140
140
|
|
|
141
141
|
Run: npm install faf-scoring-kernel
|
|
142
|
-
`)}}function X$($){return JSON.parse(J0().score_faf($))}function d4($){return JSON.parse(J0().score_faf_enterprise($))}function c4($){return J0().validate_faf($)}function i4($){return J0().compile_fafb($)}function r4($){return JSON.parse(J0().decompile_fafb($))}function a4($){return JSON.parse(J0().fafb_info($))}function n4($){return JSON.parse(J0().score_fafb($))}function s4(){return J0().sdk_version()}var s8=/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;function o8($){let Z=$?.about?.represents;return typeof Z==="string"&&Z.length>0}function t8($){let Z=$.match(/^about:\s*\n((?:[ \t]+.*\n?)*)/m);if(!Z)return null;let Q=Z[1]??"",X=Q.match(/^[ \t]+represents:\s*(\S+)\s*$/m);if(!X)return null;let z=X[1],J=Q.match(/^[ \t]+source_score:\s*(\d+)\s*$/m),H=-1;if(J){let U=parseInt(J[1],10);if(U>=0&&U<=100)H=U}return{represents:z,sourceScore:H}}function e8($){return{score:$.score,tier:Q1($.score),populated:$.populated,empty:$.empty,ignored:$.ignored,active:$.active,total:$.total,slots:$.slots}}function J$($){let Z=t8($);if(Z){let Q=Z.sourceScore;return{score:Q,tier:Q>=0?Q1(Q):Z0[Z0.length-1],populated:0,empty:0,ignored:0,active:0,total:0,slots:{},inherited:!0,represents:Z.represents}}return e8(X$($))}function o4($){let Z=[];if(!$||typeof $!=="object")return Z.push("File is not a valid YAML mapping"),{valid:!1,errors:Z};let Q=$;if(!Q.faf_version)Z.push("Missing required field: faf_version");if(!Q.project?.name)Z.push("Missing required field: project.name");if(Q.app_type==="about")Z.push("about is not an app_type — declare about.represents (owner/repo) instead");if(Q.about!==void 0){if(!o8(Q)||typeof Q.about.represents!=="string")Z.push("about.represents is required (owner/repo of the source codebase)");else if(!s8.test(Q.about.represents))Z.push(`about.represents must be "owner/repo" format (got: ${Q.about.represents})`);if(Q.about.source_score!==void 0){let X=Q.about.source_score;if(typeof X!=="number"||X<0||X>100)Z.push(`about.source_score must be a number 0-100 (got: ${X})`)}}return{valid:Z.length===0,errors:Z}}import{readFileSync as GZ,writeFileSync as
|
|
142
|
+
`)}}function X$($){return JSON.parse(J0().score_faf($))}function d4($){return JSON.parse(J0().score_faf_enterprise($))}function c4($){return J0().validate_faf($)}function i4($){return J0().compile_fafb($)}function r4($){return JSON.parse(J0().decompile_fafb($))}function a4($){return JSON.parse(J0().fafb_info($))}function n4($){return JSON.parse(J0().score_fafb($))}function s4(){return J0().sdk_version()}var s8=/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;function o8($){let Z=$?.about?.represents;return typeof Z==="string"&&Z.length>0}function t8($){let Z=$.match(/^about:\s*\n((?:[ \t]+.*\n?)*)/m);if(!Z)return null;let Q=Z[1]??"",X=Q.match(/^[ \t]+represents:\s*(\S+)\s*$/m);if(!X)return null;let z=X[1],J=Q.match(/^[ \t]+source_score:\s*(\d+)\s*$/m),H=-1;if(J){let U=parseInt(J[1],10);if(U>=0&&U<=100)H=U}return{represents:z,sourceScore:H}}function e8($){return{score:$.score,tier:Q1($.score),populated:$.populated,empty:$.empty,ignored:$.ignored,active:$.active,total:$.total,slots:$.slots}}function J$($){let Z=t8($);if(Z){let Q=Z.sourceScore;return{score:Q,tier:Q>=0?Q1(Q):Z0[Z0.length-1],populated:0,empty:0,ignored:0,active:0,total:0,slots:{},inherited:!0,represents:Z.represents}}return e8(X$($))}function o4($){let Z=[];if(!$||typeof $!=="object")return Z.push("File is not a valid YAML mapping"),{valid:!1,errors:Z};let Q=$;if(!Q.faf_version)Z.push("Missing required field: faf_version");if(!Q.project?.name)Z.push("Missing required field: project.name");if(Q.app_type==="about")Z.push("about is not an app_type — declare about.represents (owner/repo) instead");if(Q.about!==void 0){if(!o8(Q)||typeof Q.about.represents!=="string")Z.push("about.represents is required (owner/repo of the source codebase)");else if(!s8.test(Q.about.represents))Z.push(`about.represents must be "owner/repo" format (got: ${Q.about.represents})`);if(Q.about.source_score!==void 0){let X=Q.about.source_score;if(typeof X!=="number"||X<0||X>100)Z.push(`about.source_score must be a number 0-100 (got: ${X})`)}}return{valid:Z.length===0,errors:Z}}import{readFileSync as GZ,writeFileSync as yW,existsSync as YZ}from"fs";import{join as BZ,dirname as iU,basename as fW}from"path";var YU=z8(),BU=M1(),GU=l$(),D8=L1(),VU=J1(),_0=w(),WU=Y0(),_U=h(),OU=G0(),DU=V0(),xW=E2(),IU=W8(),KU=_8(),MU=O8(),g2=UZ(),qZ=X1();var LU=YU.Composer,RU=BU.Document,FU=GU.Schema,NU=D8.YAMLError,AU=D8.YAMLParseError,PU=D8.YAMLWarning,TU=VU.Alias,CU=_0.isAlias,wU=_0.isCollection,bU=_0.isDocument,EU=_0.isMap,SU=_0.isNode,jU=_0.isPair,xU=_0.isScalar,gU=_0.isSeq,hU=WU.Pair,yU=_U.Scalar,vU=OU.YAMLMap,fU=DU.YAMLSeq;var kU=IU.Lexer,uU=KU.LineCounter,mU=MU.Parser,r=g2.parse,lU=g2.parseAllDocuments,pU=g2.parseDocument,h2=g2.stringify,dU=qZ.visit,cU=qZ.visitAsync;function rU($){let Z=GZ($,"utf-8");return r(Z)}function VZ($){return GZ($,"utf-8")}function WZ($=process.cwd()){let Z=["project.faf",".faf"];for(let X of Z){let z=BZ($,X);if(YZ(z))return z}let Q=iU($);if(Q!==$)for(let X of Z){let z=BZ(Q,X);if(YZ(z))return z}return null}import{writeFileSync as aU}from"fs";import{join as nU}from"path";var _Z=Z1.orange,sU=Z1.cyan,oU=Z1.cyanDeep,tU="#FF9500",eU="#FF3B30",$q="#E6EDF3",Zq="#6E7681",OZ={TROPHY:{glyph:"✪",color:_Z},GOLD:{glyph:"★",color:_Z},SILVER:{glyph:"◆",color:sU},BRONZE:{glyph:"◇",color:oU},GREEN:{glyph:"●",color:$q},YELLOW:{glyph:"●",color:tU},RED:{glyph:"○",color:eU},WHITE:{glyph:"♡",color:Zq}};function d0($){return String($??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}var DZ=["who","what","why","where","when","how"];function y2($){return $.filter(([,Z])=>Z!==void 0&&Z!==null&&String(Z).trim()!=="").map(([Z,Q])=>`<div class="row"><div class="k">${d0(Z)}</div><div class="v">${d0(Q)}</div></div>`).join(`
|
|
143
143
|
`)}function IZ($,Z,Q="project.faf"){let X=d0($.project?.name??"Project"),z=Z.tier?.name??"WHITE",J=OZ[z]??OZ.WHITE,H=Z.inherited?Z.represents?`inherited from ${d0(Z.represents)}`:"inherited":`${Z.score}%`,U=z==="TROPHY"&&!Z.inherited,q=$.human_context??{},Y=DZ.map((W)=>[W,q[W]]),B=Object.entries(q).filter(([W])=>!DZ.includes(W)),G=[["goal",$.project?.goal],["main_language",$.project?.main_language],["type",$.project?.type],["framework",$.project?.framework],["faf_version",$.faf_version]],V=Object.entries($.stack??{}),_=V.filter(([,W])=>W&&W!=="slotignored"&&String(W).trim()!==""),D=V.filter(([,W])=>W==="slotignored").length;return`<!DOCTYPE html>
|
|
144
144
|
<html lang="en">
|
|
145
145
|
<head>
|
|
@@ -211,22 +211,22 @@ Rendered on-demand from your current <strong>${d0(Q)}</strong><br>
|
|
|
211
211
|
</body>
|
|
212
212
|
</html>
|
|
213
213
|
`}function Qq($,Z,Q,X="project.faf"){aU(nU($,"project.html"),IZ(Z,Q,X),"utf-8")}import{writeFileSync as Xq}from"fs";import{join as zq}from"path";var KZ="application/vnd.faf+yaml",Jq="https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json",Hq=/^[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+$/;function LZ($){let Z=String($.project?.name??"project").trim();if(Z.includes("/")&&Hq.test(Z))return Z;let Q=$.project?.homepage??$.project?.website??$.project?.url,X="local";if(Q)try{X=new URL(Q).hostname.replace(/^www\./,"").split(".").reverse().join(".")}catch{}let z=Z.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/^-+|-+$/g,"")||"project";return`${X}/${z}`}function Uq($){let Z=String($.project?.goal??$.context??$.project?.name??"MCP server").replace(/\s+/g," ").trim();if(!Z)return"MCP server";return Z.length<=100?Z:`${Z.slice(0,97).trimEnd()}...`}function c0($,Z={}){return{faf:Z.fafPointer??"./project.faf",mediaType:KZ,iana:`https://www.iana.org/assignments/media-types/${KZ}`,deterministic:!0,...Z.scoreEndpoint?{scoreEndpoint:Z.scoreEndpoint}:{},generated:$.generated??Z.now??new Date().toISOString()}}function v2($,Z={}){let Q={$schema:Jq,name:LZ($),version:String($.project?.version??"0.1.0"),description:Uq($)},X=M8($)??$.project?.name;if(X&&X.length<=100)Q.title=X;let z=$.project?.homepage??$.project?.website??$.project?.url;if(z)Q.websiteUrl=z;if(Z.remoteUrl)Q.remotes=[{type:"streamable-http",url:Z.remoteUrl}];return Q._meta={"one.faf/context":c0($,Z)},Q}var RZ="io.modelcontextprotocol.registry/publisher-provided",MZ=4096;function I8($,Z={}){let Q={"one.faf/context":c0($,Z)},X=new TextEncoder().encode(JSON.stringify(Q)).length;if(X>MZ)throw Error(`publisher-provided _meta is ${X}B — exceeds the registry ${MZ}B cap`);return{[RZ]:Q}}function K8($){return LZ($)}function M8($){let Z=$.project?.title;if(typeof Z==="string"){let Q=Z.trim();if(Q&&Q.length<=100)return Q}return}function qq($,Z,Q={}){let X=v2(Z,Q),z=zq($,"server-card");return Xq(z,`${JSON.stringify(X,null,2)}
|
|
214
|
-
`,"utf-8"),z}import{existsSync as FZ,mkdirSync as aW,readFileSync as Yq,writeFileSync as nW}from"fs";import{dirname as Bq,join as NZ}from"path";var AZ="https://faf.one/context",Gq="JSONRPC",PZ="1.0",Vq=["a2a","mcp","registry","catalog"];function Wq($){return r(Yq($,"utf-8"))}function _q($=process.cwd()){let Z=["agent.fafa",".fafa"];for(let X of Z){let z=NZ($,X);if(FZ(z))return z}let Q=Bq($);if(Q!==$)for(let X of Z){let z=NZ(Q,X);if(FZ(z))return z}return null}function Oq($){return($.endpoints??[]).filter((Z)=>String(Z.protocol??"").toLowerCase()==="a2a"&&Z.location)}function L8($,Z={}){let Q=Oq($);if(Q.length>0)return Q;let X=Z.doorUrl?.trim();if(X)return[{protocol:"a2a",location:X,version:PZ}];return[]}function TZ($,Z,Q={}){let X=$.agent??{},z=L8($,Q);if(z.length===0)throw Error("No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.");let J=String(X.displayName??$.metadata?.persona??X.name??"").trim(),H=String(X.description??"").trim(),U=String(X.version??"").trim(),q=String(X.vendor??"").trim(),Y=String(X.homepage??"").trim();if(!J||!H||!U||!q||!Y)throw Error("A2A card needs agent.displayName|name, description, version, vendor, homepage in .fafa");let B=c0(Z,Q),G=($.capabilities??[]).map((V)=>{let _=String(V.name??"").trim();if(!_)throw Error("A2A skill missing capabilities[].name");let D=Array.isArray(V.tags)?V.tags.map(String):[];return{id:_,name:_,description:String(V.description??"").trim()||_,tags:D}});return{name:J,description:H,supportedInterfaces:z.map((V)=>({url:String(V.location),protocolBinding:Gq,protocolVersion:String(V.version??PZ)})),provider:{organization:q,url:Y},version:U,capabilities:{streaming:!1,pushNotifications:!1,extendedAgentCard:!1,extensions:[{uri:AZ,description:"FAF context provenance — the durable context block (one context, every door).",required:!1,params:B}]},defaultInputModes:["text/plain","application/json"],defaultOutputModes:["text/plain","application/json"],skills:G}}function Dq($){let Z=$.agent?.homepage;if(!Z)return"local";try{return new URL(Z).hostname.replace(/^www\./,"")}catch{return"local"}}function Iq($,Z){if(Z.a2aCardUrl)return Z.a2aCardUrl;let Q=$.agent?.homepage;if(Q)try{return new URL("/.well-known/agent-card.json",Q).href}catch{}return"/.well-known/agent-card.json"}function Kq($,Z,Q={}){let X=Dq($),z=$.agent??{},J=String(z.name??"agent"),H=Q.now??Z.generated??new Date().toISOString(),U=[];if(L8($,Q).length>0)U.push({identifier:`urn:air:${X}:a2a:${J}`,displayName:String(z.displayName??z.name??"A2A Agent Card"),type:"application/a2a-agent-card+json",description:"A2A v1.0 Agent Card. Projected from .fafa.",url:Iq($,Q),updatedAt:H});let q=Mq($,"fafa");if(q)U.push({identifier:`urn:air:${X}:agent:${J}`,displayName:String(z.displayName??z.name??".fafa"),type:"application/vnd.fafa+yaml",description:"FAF agent passport (.fafa).",url:q,updatedAt:H});return U}function Mq($,Z){let Q=$.agent?.homepage;if(!Q)return;try{return new URL(`/.well-known/${Z}`,Q).href}catch{return}}function Lq($,Z){let Q=$.findIndex((X)=>X.identifier===Z.identifier);if(Q>=0)return Q;if(Z.type==="application/a2a-agent-card+json"||Z.type==="application/json"||Z.identifier.includes(":a2a:"))return $.findIndex((X)=>X.identifier.includes(":a2a:")||X.type==="application/a2a-agent-card+json"||String(X.url??"").includes("agent-card.json"));if(Z.type==="application/vnd.fafa+yaml")return $.findIndex((X)=>X.type==="application/vnd.fafa+yaml");return-1}function Rq($,Z){let Q=$?{...$,entries:[...$.entries??[]]}:{specVersion:"1.0",entries:[]};for(let X of Z){let z=Lq(Q.entries,X);if(z>=0)Q.entries[z]={...Q.entries[z],url:X.url,type:X.type,...X.updatedAt?{updatedAt:X.updatedAt}:{}};else Q.entries.push(X)}return Q}function Fq($){let Z=$.opts??{},Q=new Set($.targets?.length?$.targets:Vq),z={block:c0($.faf,Z)};if(Q.has("mcp"))z.mcp=v2($.faf,Z);if(Q.has("registry")){let J=M8($.faf);z.registry={name:K8($.faf),...J?{title:J}:{},_meta:I8($.faf,Z)}}if(Q.has("a2a")||Q.has("catalog")){if(!$.fafa){if($.targets?.includes("a2a")||$.targets?.includes("catalog"))throw Error("A2A/catalog require a .fafa (agent.fafa). Will not invent an agent.")}}if(Q.has("a2a")&&$.fafa)if(L8($.fafa,Z).length===0){if($.targets?.includes("a2a"))throw Error("No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.")}else z.a2a=TZ($.fafa,$.faf,Z);if(Q.has("catalog")&&$.fafa)z.catalog=Kq($.fafa,$.faf,Z);return Nq(z),z}function Nq($){let Z=JSON.stringify($.block),Q=[];if($.a2a)Q.push(JSON.stringify($.a2a.capabilities.extensions[0].params));if($.mcp){let X=$.mcp._meta;Q.push(JSON.stringify(X["one.faf/context"]))}if($.registry){let X=$.registry._meta["io.modelcontextprotocol.registry/publisher-provided"];Q.push(JSON.stringify(X["one.faf/context"]))}for(let X of Q)if(X!==Z)throw Error("context block drifted across card targets — one projector, one block")}var R8=["ephemeral","standard","high","critical"],O0=Object.fromEntries(R8.map(($,Z)=>[$,Z])),f2=new Set(["user","feedback","project","reference"]),F8=new Set(["version","profile","namepoint","created","last_etched","retention","index","memory"]),N8=new Set(["facts","sessions","preferences","custom"]),A8={low:"ephemeral",medium:"standard"};import{readFileSync as Aq,writeFileSync as Pq,existsSync as Tq}from"fs";function i0(){return new Date().toISOString().replace(/\.\d{3}Z$/,"Z")}function k($){return $===null||$===void 0}function T1($){if(k($))return"standard";if(A8[$])return A8[$];if($ in O0)return $;return"standard"}var Cq=new Set(["text","id","type","priority","tags","links","timestamp","source"]);function CZ($){if(typeof $==="string")return{text:$,id:null,type:null,priority:"standard",tags:[],links:[],timestamp:null,source:null,extra:{}};if(!$||typeof $!=="object"||!("text"in $))throw Error(`fact must be a string or a mapping with 'text': ${JSON.stringify($)}`);let Z=$,Q={};for(let[X,z]of Object.entries(Z))if(!Cq.has(X))Q[X]=z;return{text:String(Z.text),id:Z.id??null,type:Z.type??null,priority:T1(Z.priority),tags:Array.isArray(Z.tags)?Z.tags.slice():[],links:Array.isArray(Z.links)?Z.links.slice():[],timestamp:Z.timestamp??null,source:Z.source??null,extra:Q}}function wZ($){if(k($.id)&&k($.type)&&$.tags.length===0&&$.links.length===0&&k($.timestamp)&&k($.source)&&Object.keys($.extra).length===0&&$.priority==="standard")return $.text;let Q={text:$.text};if(!k($.id))Q.id=$.id;if(!k($.type))Q.type=$.type;if(Q.priority=$.priority,$.tags.length)Q.tags=$.tags;if($.links.length)Q.links=$.links;if(!k($.timestamp))Q.timestamp=$.timestamp;if(!k($.source))Q.source=$.source;return Object.assign(Q,$.extra),Q}class T0{namepoint;profile;retention;created;last_etched;_facts;_byId;_index;_sessions;_preferences;_custom;_extra;_memoryExtra;constructor($,Z={}){this.namepoint=$,this.profile=Z.profile??"knowledge",this.retention=Z.retention??"forever",this.created=Z.created??i0(),this.last_etched=this.created,this._facts=Z.facts?Z.facts.slice():[],this._byId=new Map,this._facts.forEach((Q,X)=>{if(!k(Q.id))this._byId.set(Q.id,X)}),this._index=Z.index?Z.index.slice():[],this._sessions=Z.sessions?structuredClone(Z.sessions):[],this._preferences=Z.preferences?{...Z.preferences}:{},this._custom=Z.custom?{...Z.custom}:{},this._extra=Z.extra?{...Z.extra}:{},this._memoryExtra=Z.memoryExtra?{...Z.memoryExtra}:{}}get facts(){return this._facts}get index(){return this._index}get sessions(){return this._sessions}get preferences(){return this._preferences}get custom(){return this._custom}get extra(){return this._extra}get memoryExtra(){return this._memoryExtra}static load($){if(!Tq($))throw Error(`soul file not found: ${$}`);let Z=Aq($,"utf-8"),Q=r(Z);if(!Q||typeof Q!=="object")throw Error("soul is not a YAML mapping");let X=Q.memory&&typeof Q.memory==="object"?Q.memory:{},z=Array.isArray(X.facts)?X.facts:[],J={};for(let[q,Y]of Object.entries(Q))if(!F8.has(q))J[q]=structuredClone(Y);let H={};for(let[q,Y]of Object.entries(X))if(!N8.has(q))H[q]=structuredClone(Y);let U=new T0(String(Q.namepoint??$.replace(/.*\//,"").replace(/\.fafm$/,"")),{profile:String(Q.profile??"voice"),facts:z.map(CZ),retention:String(Q.retention??"forever"),created:Q.created??null,index:Array.isArray(Q.index)?Q.index.slice():[],sessions:Array.isArray(X.sessions)?structuredClone(X.sessions):[],preferences:X.preferences&&typeof X.preferences==="object"?structuredClone(X.preferences):{},custom:X.custom&&typeof X.custom==="object"?structuredClone(X.custom):{},extra:J,memoryExtra:H});return U.last_etched=String(Q.last_etched??U.created),U}static fromFile($){return T0.load($)}toDoc(){let $={facts:this._facts.map(wZ),sessions:structuredClone(this._sessions),preferences:structuredClone(this._preferences),custom:structuredClone(this._custom)};for(let[Q,X]of Object.entries(this._memoryExtra))if(!N8.has(Q))$[Q]=structuredClone(X);let Z={version:"1.1",profile:this.profile,namepoint:this.namepoint,created:this.created,last_etched:this.last_etched,retention:this.retention,index:this._index.slice(),memory:$};for(let[Q,X]of Object.entries(this._extra))if(!F8.has(Q))Z[Q]=structuredClone(X);return Z}toYaml(){return h2(this.toDoc(),{lineWidth:100})}rebuildIndex($=80){return this._index=this._facts.map((Z)=>`${Z.id??"?"} — ${Z.text.slice(0,$)}`),this._index}save($,Z={}){if(Z.reindex!==!1)this.rebuildIndex();return Pq($,this.toYaml(),"utf-8"),$}toFile($,Z={}){return this.save($,Z)}add($){if(!k($.id)&&this._byId.has($.id)){let Z=this._byId.get($.id);if(Z!==void 0)this._facts[Z]=$}else if(this._facts.push($),!k($.id))this._byId.set($.id,this._facts.length-1);if($.timestamp&&$.timestamp>(this.last_etched||""))this.last_etched=$.timestamp;return $}etch($,Z={}){return this.add({text:$,id:Z.id??null,type:Z.type??null,priority:T1(Z.priority),tags:Z.tags?Z.tags.slice():[],links:Z.links?Z.links.slice():[],timestamp:i0(),source:Z.source??null,extra:{}})}recall($,Z={}){let Q=O0[T1(Z.minPriority??"ephemeral")]??0,X=($??"").toLowerCase(),z=new Set(Z.tags??[]),J=[];this._facts.forEach((U,q)=>{if(X&&!U.text.toLowerCase().includes(X))return;if(z.size>0&&![...z].some((Y)=>U.tags.includes(Y)))return;if(!k(Z.type)&&U.type!==Z.type)return;if((O0[U.priority]??1)<Q)return;J.push([q,U])}),J.sort((U,q)=>{let Y=O0[U[1].priority]??1,B=O0[q[1].priority]??1;if(B!==Y)return B-Y;let G=U[1].timestamp??"",V=q[1].timestamp??"";if(V!==G)return V<G?-1:V>G?1:0;return q[0]-U[0]});let H=J.map(([,U])=>U);if(!k(Z.limit))return H.slice(0,Z.limit);return H}getFact($){let Z=this._byId.get($);return Z===void 0?null:this._facts[Z]}deleteFact($){let Z=this._byId.get($);if(Z===void 0)return!1;return this._facts.splice(Z,1),this._byId.clear(),this._facts.forEach((Q,X)=>{if(!k(Q.id))this._byId.set(Q.id,X)}),!0}}import{readdirSync as wq,readFileSync as bq,statSync as bZ,existsSync as Eq}from"fs";import{join as Sq,basename as EZ,resolve as jq}from"path";var SZ=new Set(["MEMORY.md","MEMORY-FULL.md","README.md"]),xq=/\[\[([^\]]+)\]\]/g;function gq($){let Z=bZ($).mtimeMs;return new Date(Z).toISOString().replace(/\.\d{3}Z$/,"Z")}function hq($){if(!$.startsWith("---"))return{fm:null,body:$};let Z=$.split("---");if(Z.length<3)return{fm:null,body:$};try{let Q=r(Z[1]);if(!Q||typeof Q!=="object")return{fm:null,body:Z.slice(2).join("---").trim()};return{fm:Q,body:Z.slice(2).join("---").trim()}}catch{return{fm:null,body:$}}}function yq($,Z,Q){if(!Q.name)return null;let X=Q.metadata&&typeof Q.metadata==="object"?Q.metadata:{},z=X.type;if(typeof z!=="string"||!f2.has(z))return null;let J=String(Q.name).trim(),U=(Q.description!==void 0&&Q.description!==null&&String(Q.description).trim()?String(Q.description).trim():"")||J,q={};if(X.originSessionId)q.provenance=[`session:${X.originSessionId}`];let Y=[...new Set([...Z.matchAll(xq)].map((B)=>B[1]))].sort();return{text:U,id:J,type:z,priority:"standard",tags:[],links:Y,timestamp:gq($),source:`claude-code memory: ${EZ($)}`,extra:q}}function jZ($,Z={}){let Q=jq($);if(!Eq(Q))throw Error(`Claude memory directory not found: ${Q}`);if(!bZ(Q).isDirectory())throw Error(`Claude memory path is not a directory: ${Q}`);let X=Z.skip??SZ,z=Z.namepoint??`@claude-code:${EZ(Q)}`,J=[],H=wq(Q).filter((G)=>G.endsWith(".md")).sort();for(let G of H){if(X.has(G))continue;let V=Sq(Q,G),_;try{_=bq(V,"utf-8")}catch{continue}let{fm:D,body:W}=hq(_);if(!D)continue;let O=yq(V,W,D);if(O)J.push(O)}let U=J.map((G)=>G.timestamp).filter(Boolean),q=U.length?U.reduce((G,V)=>G<V?G:V):i0(),Y=U.length?U.reduce((G,V)=>G>V?G:V):q,B=new T0(z,{profile:"knowledge",facts:J,created:q});return B.last_etched=Y,B.rebuildIndex(),B}var vZ="faf-interview/1",r0="(terse — 3-4 words)",P8=[{path:"project.name",question:"What is the name of this project?",header:"Name",type:"text",required:!0},{path:"project.goal",question:"What does this project do? (one sentence)",header:"Goal",type:"text",required:!0},{path:"human_context.who",question:`Who is this for? ${r0}`,header:"Who",type:"text",required:!0},{path:"human_context.what",question:`What are they building? ${r0}`,header:"What",type:"text",required:!0},{path:"human_context.why",question:`Why does it exist? ${r0}`,header:"Why",type:"text",required:!0},{path:"human_context.where",question:`Where does it run or ship? ${r0}`,header:"Where",type:"text",required:!0},{path:"human_context.when",question:`When — timeline or stage? ${r0}`,header:"When",type:"text",required:!0},{path:"human_context.how",question:`How is it built or used? ${r0}`,header:"How",type:"text",required:!0}],fZ=[{path:"project.main_language",question:"What is the primary programming language?",header:"Language",type:"select",required:!0,options:[{label:"TypeScript",value:"TypeScript",description:"JavaScript with types"},{label:"JavaScript",value:"JavaScript",description:"Vanilla JS or Node.js"},{label:"Python",value:"Python",description:"Python 3.x"},{label:"Rust",value:"Rust",description:"Systems programming"},{label:"Go",value:"Go",description:"Golang"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.frontend",question:"What frontend framework does it use?",header:"Frontend",type:"select",required:!1,options:[{label:"React",value:"React",description:"React.js"},{label:"Vue",value:"Vue",description:"Vue.js"},{label:"Svelte",value:"Svelte",description:"Svelte/SvelteKit"},{label:"Next.js",value:"Next.js",description:"React framework"},{label:"None",value:"None",description:"No frontend"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.backend",question:"What backend framework does it use?",header:"Backend",type:"select",required:!1,options:[{label:"Express",value:"Express",description:"Node.js Express"},{label:"Fastify",value:"Fastify",description:"Node.js Fastify"},{label:"Django",value:"Django",description:"Python Django"},{label:"FastAPI",value:"FastAPI",description:"Python FastAPI"},{label:"None",value:"None",description:"No backend"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.database",question:"What database does it use?",header:"Database",type:"select",required:!1,options:[{label:"PostgreSQL",value:"PostgreSQL",description:"Postgres"},{label:"MySQL",value:"MySQL",description:"MySQL/MariaDB"},{label:"SQLite",value:"SQLite",description:"Embedded SQL"},{label:"MongoDB",value:"MongoDB",description:"Document store"},{label:"None",value:"None",description:"No database"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.runtime",question:"What runtime does it run on?",header:"Runtime",type:"text",required:!1},{path:"stack.hosting",question:"Where is it hosted or distributed?",header:"Hosting",type:"text",required:!1},{path:"stack.build",question:"What is the build tool?",header:"Build",type:"text",required:!1},{path:"stack.cicd",question:"What CI/CD does it use?",header:"CI/CD",type:"text",required:!1}],a0=[...P8,...fZ],kZ=new Map(a0.map(($)=>[$.path,$])),vq=Object.fromEntries(a0.map(($)=>[$.path,$]));function T8($){let Z=kZ.get($);if(Z)return Z.question;let Q=e0.get($)??v.find((X)=>X.canonical===$);return Q?`${Q.description}?`.replace(/\?\?$/,"?"):`${$}?`}function fq($,Z){return a0.filter((Q)=>{let X=Q.path.split("."),z=$;for(let J of X)if(z&&typeof z==="object"&&J in z)z=z[J];else{z=void 0;break}if(z==="slotignored")return!1;return Z(z)})}var kq=new Set(["developers","development teams","development team","teams","development","cloud platform","web platform","platform","best practices","improve development efficiency","development efficiency","modern development practices","modern development","test-driven development","production/stable","production","stable","app","project","tool"]),uq=[["npm",/\bnpm\b/i],["PyPI",/\bpypi\b/i],["crates.io",/\bcrates\.io\b/i],["Homebrew",/\bhomebrew\b/i],["Docker",/\bdocker\b/i],["Cloudflare",/\bcloudflare\b/i],["Vercel",/\bvercel\b/i],["Netlify",/\bnetlify\b/i],["AWS",/\baws\b/i],["Cloud Run",/\bcloud run\b/i],["edge",/\bedge\b/i],["browser",/\bbrowser\b/i],["WASM",/\bwasm\b/i],["GitHub",/\bgithub\b/i],["MCP Registry",/\bmcp registry\b/i],["Chrome Web Store",/\bchrome web store\b/i],["Smithery",/\bsmithery\b/i]],xZ=($)=>kq.has($.toLowerCase().trim()),mq=/^(?:with|and|or|using|for|to|that|who|whom|whose|the|a|an|in|on|of|via|by|&)$/i;function gZ($,Z=5){let Q=$.trim().split(/\s+/).filter(Boolean).slice(0,Z);while(Q.length&&mq.test(Q[Q.length-1].replace(/[.,;:]+$/,"")))Q.pop();return Q.join(" ")}function uZ($){let Z={};if(!$||typeof $!=="string")return Z;let Q=$.trim(),X=Q.replace(/^[^A-Za-z0-9]+/,"").split(/\s+(?:for|that|which|to)\s+|\s+[—–]\s+|\s-\s|:\s|\.\s|,\s/)[0].trim(),z=gZ(X);if(z.split(/\s+/).filter(Boolean).length>=2&&!xZ(z))Z.what=z;let J=uq.filter(([,q])=>q.test(Q)).map(([q])=>q);if(J.length)Z.where=J.slice(0,4).join(", ");let H=Q.match(/\bfor ((?:[A-Za-z][\w./+-]* )?(?:any |all )?(?:developers?|teams?|engineers?|builders?|users?|integrators?)\b[^.,;:—]*)/i),U=gZ((H?.[1]||"").trim().replace(/\s+/g," "));if(U&&!xZ(U))Z.who=U;return Z}function hZ($,Z){let Q=$;for(let X of Z.split("."))if(Q&&typeof Q==="object"&&X in Q)Q=Q[X];else return;return Q}function yZ($){if(typeof $!=="string")return!1;let Z=$.trim();if(!Z||Z==="slotignored")return!1;return!K0(Z)}function lq($,Z={}){let Q=$&&typeof $==="object"?$:{},X=hZ(Q,"project.goal"),z=(yZ(X)?String(X).trim():"")||(Z.goal??"").trim(),J=uZ(z),H=Z.detailed??{},U={"project.goal":z||void 0,"human_context.what":J.what,"human_context.where":J.where,"human_context.who":J.who},q=(_)=>{let D=U[_];if(D)return{value:D,source:"project goal",confidence:0.9};let W=_.startsWith("human_context.")?_.slice(14):"",O=W?H[W]:void 0;return O?{value:O.value,source:O.source,confidence:O.confidence}:void 0},Y=P8.map((_,D)=>{let W={n:D+1,path:_.path,header:_.header,question:_.question},O=hZ(Q,_.path);if(yZ(O))return{...W,value:String(O).trim(),status:"filled",seeded:!1};let I=q(_.path);if(I)return{...W,value:I.value,status:"seeded",seeded:!0,source:I.source,confidence:I.confidence};return{...W,value:"",status:"empty",seeded:!1}}),B=Y.filter((_)=>_.status==="filled").length,G=Y.filter((_)=>_.status==="seeded").length,V=Y.filter((_)=>_.status==="empty").length;return{version:vZ,rows:Y,filledCount:B,seededCount:G,emptyCount:V,complete:V===0}}function k2($){if($===null||$===void 0)return!0;if(typeof $==="string"){let Z=$.trim();return Z===""||K0(Z)}return!1}function pq($,Z){let Q=$;for(let X of Z.split("."))if(Q&&typeof Q==="object"&&X in Q)Q=Q[X];else return;return Q}function mZ($){if($==="project.goal")return!0;return e0.get($)?.category==="human"}function lZ($,Z=k2){let Q=[],X=[];for(let z of a0){let J=pq($,z.path);if(J==="slotignored")continue;if(!Z(J))continue;(mZ(z.path)?Q:X).push(z.path)}return{human:Q,sourceable:X}}function pZ($,Z,Q=k2){let X=lZ(Z,Q),z;if($>=100||X.human.length===0&&X.sourceable.length===0)z="done";else if(X.sourceable.length>0)z="can-source";else z="needs-human";let J=z==="needs-human"?C8(X):[];return{status:z,score:$,gaps:X,ask:J}}function C8($){return $.human.map((Z)=>({path:Z,question:T8(Z)}))}function dq($,Z={}){let Q=Math.max(1,Z.maxRounds??5),X=Z.isEmpty??k2,z=[],J=0;for(let U=0;U<=Q;U++){let q=$.read();if(!q)return{status:"no-faf",score:0,rounds:J,history:z,ask:[]};let Y=$.score(q.yaml);z.push(Y);let B=pZ(Y,q.data,X);if(B.status==="done")return{status:"done",score:Y,rounds:J,history:z,ask:[]};if(B.status==="needs-human")return{status:"needs-human",score:Y,rounds:J,history:z,ask:B.ask};if(z.length>=2&&Y<=z[z.length-2])return B.gaps.human.length?{status:"needs-human",score:Y,rounds:J,history:z,ask:C8(B.gaps)}:{status:"stuck",score:Y,rounds:J,history:z,ask:[]};if(J>=Q)return{status:"capped",score:Y,rounds:J,history:z,ask:C8(B.gaps)};$.runAuto(),J++}return{status:"capped",score:z[z.length-1]??0,rounds:J,history:z,ask:[]}}import{createHash as cZ}from"crypto";var w8="faf-bench/1",cq={"project.name":"What is the project's name?","project.goal":"What is the project's goal — what is it for?","project.main_language":"What is the primary programming language?","human_context.who":"Who is this project for?","human_context.what":"What are they building?","human_context.why":"Why does this project exist?","human_context.where":"Where does it run or get distributed?","human_context.when":"When — what is the project's timeline or stage?","human_context.how":"How is it built or used?"};function iq($,Z){return cq[$]??`What is the project's ${Z.replace(/\s*\(.*\)$/,"").toLowerCase()}?`}var iZ=[["typescript","ts"],["javascript","js"],["python","py","python3"],["node","nodejs","node js","node.js"],["github actions","gh actions","actions"],["postgresql","postgres","pg"],["kubernetes","k8s"],["npm","npm registry"],["cloudflare workers","cf workers","workers"],["google cloud run","cloud run","gcp cloud run"]],C1=new Map;iZ.forEach(($,Z)=>$.forEach((Q)=>C1.set(Q,Z)));var rq=new Set(["a","an","the","and","or","of","for","to","in","on","with","is","it","its","their","your","via","by","using","use","used"]);function u2($){return $.toLowerCase().replace(/[^a-z0-9\s.+#-]/g," ").replace(/\.(?=\s|$)/g," ").replace(/\s+/g," ").trim()}function dZ($){return u2($).split(" ").filter((Z)=>Z&&!rq.has(Z))}function rZ($,Z){let Q=u2($),X=u2(Z);if(!Q||!X)return!1;if(Q===X)return!0;let z=C1.get(Q);if(z!==void 0&&C1.get(X)===z)return!0;let J=dZ($);if(J.length===0)return!1;let H=new Set(dZ(Z));return J.every((U)=>{if(H.has(U))return!0;let q=C1.get(U);return q!==void 0&&[...H].some((Y)=>C1.get(Y)===q)})}function aq($){let Z=J$($),Q=r($),X=[],z={},J=0;for(let q of v){if(Z.slots[q.path]!=="populated")continue;let Y=n8(Q,q);if(typeof Y!=="string")continue;let B=Y.trim();if(!B||p1.has(B.toLowerCase()))continue;J+=1,X.push({n:J,path:q.path,question:iq(q.path,q.description)}),z[J]=B}let H=JSON.stringify({v:w8,q:X.map((q)=>[q.path,q.question])}),U=cZ("sha256").update(H).digest("hex").slice(0,12);return{version:w8,qsetHash:U,questions:X,answers:z}}function nq($){return{version:$.version,qsetHash:$.qsetHash,questions:$.questions}}function sq($,Z){let Q=$.questions.map((z)=>{let J=Z[String(z.n)]??Z[z.path]??"";return{n:z.n,path:z.path,ok:typeof J==="string"&&J.trim()!==""&&rZ($.answers[z.n],J)}}),X=$.questions.filter((z)=>!Q[z.n-1].ok);return{correct:Q.filter((z)=>z.ok).length,total:$.questions.length,misses:X,perQuestion:Q}}function oq($,Z){let Q=JSON.stringify({v:$.version,repo:Z??null,qset:$.qsetHash,protocol:$.protocol,cold:$.cold??null,faf:$.faf??null});return{projection:Q,hash:cZ("sha256").update(Q).digest("hex")}}import{existsSync as gB,readdirSync as B4,readFileSync as hB}from"fs";import{join as v8,dirname as yB,extname as vB,resolve as fB}from"path";var b8={"package.json":{frameworks:["Node.js","JavaScript","TypeScript"],slots:{packageManager:"npm/yarn/pnpm",mainLanguage:"JavaScript/TypeScript"},priority:35,intelligence:"ultra-high"},"README.md":{frameworks:[],slots:{targetUser:"developers",coreProblem:"understanding project",missionPurpose:"project documentation"},priority:25,intelligence:"high"},"requirements.txt":{frameworks:["Python"],slots:{packageManager:"pip",mainLanguage:"Python"},priority:35,intelligence:"ultra-high"},Pipfile:{frameworks:["Python"],slots:{packageManager:"pipenv",mainLanguage:"Python"},priority:35,intelligence:"ultra-high"},"pyproject.toml":{frameworks:["Python"],slots:{mainLanguage:"Python",runtime:"Python",backend:"Python"},priority:36,intelligence:"ultra-high"},Gemfile:{frameworks:["Ruby"],slots:{packageManager:"bundler",mainLanguage:"Ruby"},priority:35,intelligence:"ultra-high"},"Gemfile.lock":{frameworks:["Ruby"],slots:{packageManager:"bundler",mainLanguage:"Ruby"},priority:34,intelligence:"high"},"composer.json":{frameworks:["PHP","Laravel","Symfony"],slots:{packageManager:"composer",mainLanguage:"PHP"},priority:35,intelligence:"ultra-high"},"Cargo.toml":{frameworks:["Rust"],slots:{packageManager:"cargo",mainLanguage:"Rust",buildTool:"cargo"},priority:36,intelligence:"ultra-high"},"go.mod":{frameworks:["Go"],slots:{packageManager:"go modules",mainLanguage:"Go",buildTool:"go build"},priority:36,intelligence:"ultra-high"},"Package.swift":{frameworks:["Swift"],slots:{packageManager:"spm",mainLanguage:"Swift",buildTool:"swift build"},priority:36,intelligence:"ultra-high"},"*.csproj":{frameworks:["C#",".NET"],slots:{packageManager:"NuGet",mainLanguage:"C#",buildTool:"dotnet"},priority:36,intelligence:"ultra-high"},"pubspec.yaml":{frameworks:["Dart"],slots:{packageManager:"pub",mainLanguage:"Dart"},priority:35,intelligence:"ultra-high"},"pom.xml":{frameworks:["Java"],slots:{packageManager:"maven",mainLanguage:"Java",buildTool:"maven"},priority:35,intelligence:"ultra-high"},"build.gradle":{frameworks:["Java","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Java",buildTool:"gradle"},priority:35,intelligence:"ultra-high"},"settings.gradle":{frameworks:["Java","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Java",buildTool:"gradle"},priority:34,intelligence:"high"},"settings.gradle.kts":{frameworks:["Kotlin","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Kotlin",buildTool:"gradle"},priority:34,intelligence:"high"},"next.config.js":{frameworks:["Next.js"],slots:{framework:"Next.js",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"next.config.mjs":{frameworks:["Next.js"],slots:{framework:"Next.js",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"next.config.ts":{frameworks:["Next.js 13+"],slots:{framework:"Next.js 13+",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"nuxt.config.js":{frameworks:["Nuxt 2"],slots:{framework:"Nuxt 2",runtime:"Node.js",buildTool:"Nuxt",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"nuxt.config.ts":{frameworks:["Nuxt 3"],slots:{framework:"Nuxt 3",runtime:"Node.js",buildTool:"Nuxt",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"svelte.config.js":{frameworks:["SvelteKit"],slots:{framework:"SvelteKit",buildTool:"Vite",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"angular.json":{frameworks:["Angular"],slots:{framework:"Angular",buildTool:"Angular CLI",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"manifest.json":{frameworks:["Chrome Extension","Browser Extension"],slots:{framework:"Chrome Extension",runtime:"Chrome/Browser",mainLanguage:"JavaScript",hosting:"Chrome Web Store",apiType:"Chrome APIs"},priority:35,intelligence:"ultra-high",confirmWith:["popup.html","background.js","content.js"]},"vue.config.js":{frameworks:["Vue"],slots:{framework:"Vue",buildTool:"Vue CLI",mainLanguage:"JavaScript"},priority:30,intelligence:"high"},"remix.config.js":{frameworks:["Remix"],slots:{framework:"Remix",runtime:"Node.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"gatsby-config.js":{frameworks:["Gatsby"],slots:{framework:"Gatsby",buildTool:"Gatsby",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"gatsby-config.ts":{frameworks:["Gatsby"],slots:{framework:"Gatsby",buildTool:"Gatsby",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"astro.config.mjs":{frameworks:["Astro"],slots:{framework:"Astro",buildTool:"Vite",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"redwood.toml":{frameworks:["RedwoodJS"],slots:{framework:"RedwoodJS",buildTool:"Webpack",mainLanguage:"JavaScript/TypeScript",server:"Node.js",database:"Prisma"},priority:30,intelligence:"high"},"blitz.config.ts":{frameworks:["Blitz.js"],slots:{framework:"Blitz.js",buildTool:"Next.js",mainLanguage:"TypeScript",server:"Node.js",database:"Prisma"},priority:30,intelligence:"high"},"qwik.config.ts":{frameworks:["Qwik"],slots:{framework:"Qwik",buildTool:"Vite",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"manage.py":{frameworks:["Django"],slots:{framework:"Django",backend:"Django",mainLanguage:"Python",server:"Django",apiType:"Django Views"},priority:30,intelligence:"high"},artisan:{frameworks:["Laravel"],slots:{framework:"Laravel",backend:"Laravel",mainLanguage:"PHP",server:"PHP",apiType:"Laravel Routes"},priority:30,intelligence:"high"},"mix.exs":{frameworks:["Phoenix","Elixir"],slots:{framework:"Phoenix",backend:"Phoenix",mainLanguage:"Elixir",server:"BEAM"},priority:30,intelligence:"high"},"nest-cli.json":{frameworks:["NestJS"],slots:{framework:"NestJS",backend:"NestJS",mainLanguage:"TypeScript",server:"Node.js",apiType:"REST API"},priority:30,intelligence:"high"},"strapi.config.js":{frameworks:["Strapi"],slots:{backend:"Strapi",apiType:"REST API",database:"Required",server:"Node.js"},priority:30,intelligence:"high"},Dockerfile:{frameworks:["Docker"],slots:{hosting:"Docker",connection:"Containerized"},priority:30,intelligence:"high"},"docker-compose.yml":{frameworks:["Docker Compose"],slots:{hosting:"Docker",connection:"Multi-container"},priority:30,intelligence:"high"},"docker-compose.yaml":{frameworks:["Docker Compose"],slots:{hosting:"Docker",connection:"Multi-container"},priority:30,intelligence:"high"},"kubernetes.yml":{frameworks:["Kubernetes"],slots:{hosting:"Kubernetes",connection:"Orchestrated"},priority:30,intelligence:"high"},"k8s.yaml":{frameworks:["Kubernetes"],slots:{hosting:"Kubernetes",connection:"Orchestrated"},priority:30,intelligence:"high"},"vercel.json":{frameworks:["Vercel"],slots:{hosting:"Vercel",cicd:"Vercel"},priority:30,intelligence:"high"},"netlify.toml":{frameworks:["Netlify"],slots:{hosting:"Netlify",cicd:"Netlify"},priority:30,intelligence:"high"},"render.yaml":{frameworks:["Render"],slots:{hosting:"Render",cicd:"Render"},priority:30,intelligence:"high"},"fly.toml":{frameworks:["Fly.io"],slots:{hosting:"Fly.io",cicd:"Fly.io"},priority:30,intelligence:"high"},"railway.json":{frameworks:["Railway"],slots:{hosting:"Railway",cicd:"Railway"},priority:30,intelligence:"high"},"railway.toml":{frameworks:["Railway"],slots:{hosting:"Railway",cicd:"Railway"},priority:30,intelligence:"high"},"app.yaml":{frameworks:["Google App Engine"],slots:{hosting:"Google Cloud",cicd:"Google Cloud"},priority:30,intelligence:"high"},Procfile:{frameworks:["Heroku"],slots:{hosting:"Heroku",cicd:"Heroku"},priority:30,intelligence:"high"},"vite.config.js":{frameworks:["Vite"],slots:{buildTool:"Vite"},priority:25,intelligence:"medium"},"vite.config.ts":{frameworks:["Vite"],slots:{buildTool:"Vite",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"webpack.config.js":{frameworks:["Webpack"],slots:{buildTool:"Webpack"},priority:25,intelligence:"medium"},"rollup.config.js":{frameworks:["Rollup"],slots:{buildTool:"Rollup"},priority:25,intelligence:"medium"},"esbuild.config.js":{frameworks:["esbuild"],slots:{buildTool:"esbuild"},priority:25,intelligence:"medium"},"parcel.config.js":{frameworks:["Parcel"],slots:{buildTool:"Parcel"},priority:25,intelligence:"medium"},"snowpack.config.js":{frameworks:["Snowpack"],slots:{buildTool:"Snowpack"},priority:25,intelligence:"medium"},"tsconfig.json":{frameworks:["TypeScript"],slots:{mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"jsconfig.json":{frameworks:["JavaScript"],slots:{mainLanguage:"JavaScript"},priority:20,intelligence:"medium"},"babel.config.js":{frameworks:["Babel"],slots:{buildTool:"Babel"},priority:20,intelligence:"medium"},".babelrc":{frameworks:["Babel"],slots:{buildTool:"Babel"},priority:20,intelligence:"medium"},"jest.config.js":{frameworks:["Jest"],slots:{cicd:"Jest"},priority:25,intelligence:"medium"},"jest.config.ts":{frameworks:["Jest"],slots:{cicd:"Jest",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"vitest.config.ts":{frameworks:["Vitest"],slots:{cicd:"Vitest",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"cypress.config.js":{frameworks:["Cypress"],slots:{cicd:"Cypress"},priority:25,intelligence:"medium"},"playwright.config.ts":{frameworks:["Playwright"],slots:{cicd:"Playwright",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"karma.conf.js":{frameworks:["Karma"],slots:{cicd:"Karma"},priority:20,intelligence:"medium"},"mocha.opts":{frameworks:["Mocha"],slots:{cicd:"Mocha"},priority:20,intelligence:"medium"},".rspec":{frameworks:["RSpec"],slots:{cicd:"RSpec",mainLanguage:"Ruby"},priority:25,intelligence:"medium"},"pytest.ini":{frameworks:["Pytest"],slots:{cicd:"Pytest",mainLanguage:"Python"},priority:25,intelligence:"medium"},"phpunit.xml":{frameworks:["PHPUnit"],slots:{cicd:"PHPUnit",mainLanguage:"PHP"},priority:25,intelligence:"medium"},"schema.prisma":{frameworks:["Prisma"],slots:{database:"Prisma ORM",connection:"Prisma"},priority:25,intelligence:"medium"},"drizzle.config.ts":{frameworks:["Drizzle"],slots:{database:"Drizzle ORM",connection:"Drizzle",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"ormconfig.js":{frameworks:["TypeORM"],slots:{database:"TypeORM",connection:"TypeORM"},priority:25,intelligence:"medium"},"knexfile.js":{frameworks:["Knex.js"],slots:{database:"Knex.js",connection:"Knex.js"},priority:25,intelligence:"medium"},"sequelize.config.js":{frameworks:["Sequelize"],slots:{database:"Sequelize",connection:"Sequelize"},priority:25,intelligence:"medium"},"alembic.ini":{frameworks:["Alembic"],slots:{database:"Alembic",mainLanguage:"Python"},priority:25,intelligence:"medium"},".github/workflows":{frameworks:["GitHub Actions"],slots:{cicd:"GitHub Actions"},priority:25,intelligence:"medium"},".gitlab-ci.yml":{frameworks:["GitLab CI"],slots:{cicd:"GitLab CI"},priority:25,intelligence:"medium"},Jenkinsfile:{frameworks:["Jenkins"],slots:{cicd:"Jenkins"},priority:25,intelligence:"medium"},".circleci/config.yml":{frameworks:["CircleCI"],slots:{cicd:"CircleCI"},priority:25,intelligence:"medium"},".travis.yml":{frameworks:["Travis CI"],slots:{cicd:"Travis CI"},priority:25,intelligence:"medium"},"azure-pipelines.yml":{frameworks:["Azure DevOps"],slots:{cicd:"Azure DevOps"},priority:25,intelligence:"medium"},"bitbucket-pipelines.yml":{frameworks:["Bitbucket Pipelines"],slots:{cicd:"Bitbucket Pipelines"},priority:25,intelligence:"medium"},"tailwind.config.js":{frameworks:["Tailwind CSS"],slots:{cssFramework:"Tailwind CSS"},priority:20,intelligence:"medium"},"tailwind.config.ts":{frameworks:["Tailwind CSS"],slots:{cssFramework:"Tailwind CSS",mainLanguage:"TypeScript"},priority:20,intelligence:"medium"},"postcss.config.js":{frameworks:["PostCSS"],slots:{cssFramework:"PostCSS"},priority:20,intelligence:"medium"},"uno.config.ts":{frameworks:["UnoCSS"],slots:{cssFramework:"UnoCSS",mainLanguage:"TypeScript"},priority:20,intelligence:"medium"},"styled-components.config.js":{frameworks:["styled-components"],slots:{cssFramework:"styled-components",uiLibrary:"styled-components"},priority:20,intelligence:"medium"},"emotion.config.js":{frameworks:["Emotion"],slots:{cssFramework:"Emotion",uiLibrary:"Emotion"},priority:20,intelligence:"medium"},"metro.config.js":{frameworks:["React Native"],slots:{framework:"React Native",mainLanguage:"JavaScript"},priority:25,intelligence:"medium"},"expo.config.js":{frameworks:["Expo"],slots:{framework:"React Native",buildTool:"Expo"},priority:25,intelligence:"medium"},"app.json":{frameworks:["React Native","Expo"],slots:{framework:"React Native"},priority:20,intelligence:"medium",confirmWith:["expo"]},"capacitor.config.ts":{frameworks:["Capacitor"],slots:{framework:"Capacitor",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"ionic.config.json":{frameworks:["Ionic"],slots:{framework:"Ionic",uiLibrary:"Ionic"},priority:25,intelligence:"medium"},"nx.json":{frameworks:["Nx"],slots:{buildTool:"Nx"},priority:25,intelligence:"medium"},"turbo.json":{frameworks:["Turborepo"],slots:{buildTool:"Turborepo"},priority:25,intelligence:"medium"},"lerna.json":{frameworks:["Lerna"],slots:{buildTool:"Lerna"},priority:25,intelligence:"medium"},"rush.json":{frameworks:["Rush"],slots:{buildTool:"Rush"},priority:25,intelligence:"medium"},"pnpm-workspace.yaml":{frameworks:["pnpm workspaces"],slots:{packageManager:"pnpm",buildTool:"pnpm workspaces"},priority:25,intelligence:"medium"},"*.svelte":{frameworks:["Svelte","SvelteKit"],slots:{framework:"Svelte"},priority:15,intelligence:"low"},"*.vue":{frameworks:["Vue"],slots:{framework:"Vue"},priority:15,intelligence:"low"},"*.jsx":{frameworks:["React"],slots:{framework:"React",mainLanguage:"JavaScript"},priority:15,intelligence:"low"},"*.ts":{frameworks:["TypeScript"],slots:{mainLanguage:"TypeScript"},priority:15,intelligence:"low"},"*.tsx":{frameworks:["React","TypeScript"],slots:{framework:"React",mainLanguage:"TypeScript"},priority:15,intelligence:"low"},"*.py":{frameworks:["Python"],slots:{mainLanguage:"Python"},priority:15,intelligence:"low"},"*.rb":{frameworks:["Ruby"],slots:{mainLanguage:"Ruby"},priority:15,intelligence:"low"},"*.php":{frameworks:["PHP"],slots:{mainLanguage:"PHP"},priority:15,intelligence:"low"},"*.java":{frameworks:["Java"],slots:{mainLanguage:"Java"},priority:15,intelligence:"low"},"*.kt":{frameworks:["Kotlin"],slots:{mainLanguage:"Kotlin"},priority:15,intelligence:"low"},"*.swift":{frameworks:["Swift"],slots:{mainLanguage:"Swift"},priority:15,intelligence:"low"},"*.go":{frameworks:["Go"],slots:{mainLanguage:"Go"},priority:15,intelligence:"low"},"*.rs":{frameworks:["Rust"],slots:{mainLanguage:"Rust"},priority:15,intelligence:"low"},"*.dart":{frameworks:["Flutter","Dart"],slots:{mainLanguage:"Dart"},priority:15,intelligence:"low"},"*.ex":{frameworks:["Elixir"],slots:{mainLanguage:"Elixir"},priority:15,intelligence:"low"},"*.exs":{frameworks:["Elixir"],slots:{mainLanguage:"Elixir"},priority:15,intelligence:"low"},"*.scala":{frameworks:["Scala"],slots:{mainLanguage:"Scala"},priority:15,intelligence:"low"},"*.clj":{frameworks:["Clojure"],slots:{mainLanguage:"Clojure"},priority:15,intelligence:"low"},"*.lua":{frameworks:["Lua"],slots:{mainLanguage:"Lua"},priority:15,intelligence:"low"},"*.r":{frameworks:["R"],slots:{mainLanguage:"R"},priority:15,intelligence:"low"},"*.R":{frameworks:["R"],slots:{mainLanguage:"R"},priority:15,intelligence:"low"},"*.jl":{frameworks:["Julia"],slots:{mainLanguage:"Julia"},priority:15,intelligence:"low"},"*.nim":{frameworks:["Nim"],slots:{mainLanguage:"Nim"},priority:15,intelligence:"low"},"*.zig":{frameworks:["Zig"],slots:{mainLanguage:"Zig"},priority:15,intelligence:"low"},"build.zig":{frameworks:["Zig"],slots:{packageManager:"Zig Package Manager",mainLanguage:"Zig",buildTool:"zig build",framework:"Zig",build:"zig build"},priority:35,intelligence:"ultra-high"},"openapi.json":{frameworks:["OpenAPI"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"openapi.yaml":{frameworks:["OpenAPI"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"swagger.json":{frameworks:["Swagger"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"graphql.schema":{frameworks:["GraphQL"],slots:{apiType:"GraphQL",backend:"GraphQL Server"},priority:30,intelligence:"high"},"schema.graphql":{frameworks:["GraphQL"],slots:{apiType:"GraphQL",backend:"GraphQL Server"},priority:30,intelligence:"high"},".graphqlconfig":{frameworks:["GraphQL"],slots:{apiType:"GraphQL"},priority:25,intelligence:"medium"},"redux.config.js":{frameworks:["Redux"],slots:{stateManagement:"Redux"},priority:20,intelligence:"medium"},"mobx.config.js":{frameworks:["MobX"],slots:{stateManagement:"MobX"},priority:20,intelligence:"medium"},"vuex.config.js":{frameworks:["Vuex"],slots:{stateManagement:"Vuex",framework:"Vue"},priority:20,intelligence:"medium"},"pinia.config.js":{frameworks:["Pinia"],slots:{stateManagement:"Pinia",framework:"Vue"},priority:20,intelligence:"medium"},"zustand.config.js":{frameworks:["Zustand"],slots:{stateManagement:"Zustand"},priority:20,intelligence:"medium"},".eslintrc.js":{frameworks:["ESLint"],slots:{},priority:15,intelligence:"low"},".eslintrc.json":{frameworks:["ESLint"],slots:{},priority:15,intelligence:"low"},".prettierrc":{frameworks:["Prettier"],slots:{},priority:15,intelligence:"low"},".prettierrc.json":{frameworks:["Prettier"],slots:{},priority:15,intelligence:"low"},"biome.json":{frameworks:["Biome"],slots:{},priority:15,intelligence:"low"},".editorconfig":{frameworks:["EditorConfig"],slots:{},priority:10,intelligence:"low"},"serverless.yml":{frameworks:["Serverless Framework"],slots:{hosting:"AWS Lambda/Azure/GCP",backend:"Serverless",apiType:"API Gateway"},priority:30,intelligence:"high"},"serverless.yaml":{frameworks:["Serverless Framework"],slots:{hosting:"AWS Lambda/Azure/GCP",backend:"Serverless",apiType:"API Gateway"},priority:30,intelligence:"high"},"sam.yaml":{frameworks:["AWS SAM"],slots:{hosting:"AWS Lambda",backend:"AWS SAM",cicd:"AWS SAM CLI"},priority:30,intelligence:"high"},"template.yaml":{frameworks:["AWS SAM","CloudFormation"],slots:{hosting:"AWS",backend:"AWS SAM/CloudFormation",cicd:"AWS"},priority:25,intelligence:"medium",confirmWith:["samconfig.toml"]},"amplify.yml":{frameworks:["AWS Amplify"],slots:{hosting:"AWS Amplify",backend:"AWS Amplify",cicd:"AWS Amplify"},priority:30,intelligence:"high"},Podfile:{frameworks:["CocoaPods","Swift"],slots:{packageManager:"CocoaPods",mainLanguage:"Swift/Objective-C"},priority:30,intelligence:"high"},"build.gradle.kts":{frameworks:["Kotlin","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Kotlin",buildTool:"gradle"},priority:35,intelligence:"ultra-high"},"*.ipynb":{frameworks:["Jupyter","Python"],slots:{mainLanguage:"Python",framework:"Jupyter Notebook"},priority:30,intelligence:"high"},MLproject:{frameworks:["MLflow"],slots:{mainLanguage:"Python",framework:"MLflow",backend:"MLflow",cicd:"MLflow"},priority:30,intelligence:"high"},"dvc.yaml":{frameworks:["DVC","Data Version Control"],slots:{mainLanguage:"Python",framework:"DVC",cicd:"DVC Pipelines"},priority:30,intelligence:"high"},"dvc.lock":{frameworks:["DVC"],slots:{framework:"DVC"},priority:20,intelligence:"medium"},"wrangler.toml":{frameworks:["Cloudflare Workers","Cloudflare"],slots:{hosting:"Cloudflare Workers",backend:"Cloudflare Workers",runtime:"V8 Isolates"},priority:30,intelligence:"high"},"deno.json":{frameworks:["Deno"],slots:{runtime:"Deno",mainLanguage:"TypeScript",packageManager:"Deno"},priority:30,intelligence:"high"},"bun.lockb":{frameworks:["Bun"],slots:{runtime:"Bun",packageManager:"Bun",mainLanguage:"TypeScript/JavaScript"},priority:30,intelligence:"high"},"codecov.yml":{frameworks:["Codecov"],slots:{cicd:"Codecov"},priority:25,intelligence:"high"},"dependabot.yml":{frameworks:["Dependabot","GitHub"],slots:{cicd:"Dependabot"},priority:25,intelligence:"high"},"renovate.json":{frameworks:["Renovate"],slots:{cicd:"Renovate"},priority:25,intelligence:"high"},Makefile:{frameworks:["Make","GNU Make"],slots:{buildTool:"Make"},priority:30,intelligence:"high"},"CMakeLists.txt":{frameworks:["CMake","C","C++"],slots:{buildTool:"CMake",mainLanguage:"C/C++"},priority:30,intelligence:"high"},"meson.build":{frameworks:["Meson","C","C++"],slots:{buildTool:"Meson",mainLanguage:"C/C++"},priority:30,intelligence:"high"},"*.c":{frameworks:["C"],slots:{mainLanguage:"C"},priority:30,intelligence:"high"},"*.cpp":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:30,intelligence:"high"},"*.cc":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:30,intelligence:"high"},"*.cxx":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:25,intelligence:"high"},"*.h":{frameworks:["C","C++"],slots:{mainLanguage:"C/C++"},priority:25,intelligence:"high"},"*.hpp":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:25,intelligence:"high"},"*.hxx":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:20,intelligence:"medium"},".env":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.example":{frameworks:[],slots:{},priority:25,intelligence:"high"},".env.local":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.development":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.production":{frameworks:[],slots:{},priority:20,intelligence:"medium"},"skaffold.yaml":{frameworks:["Skaffold","Kubernetes"],slots:{hosting:"Kubernetes",cicd:"Skaffold"},priority:30,intelligence:"high"},"Chart.yaml":{frameworks:["Helm","Kubernetes"],slots:{hosting:"Kubernetes",backend:"Helm"},priority:30,intelligence:"high"},"values.yaml":{frameworks:["Helm","Kubernetes"],slots:{hosting:"Kubernetes"},priority:25,intelligence:"high",confirmWith:["Chart.yaml"]},"pulumi.yaml":{frameworks:["Pulumi"],slots:{hosting:"Cloud",cicd:"Pulumi"},priority:30,intelligence:"high"},"Pulumi.yaml":{frameworks:["Pulumi"],slots:{hosting:"Cloud",cicd:"Pulumi"},priority:30,intelligence:"high"},"terragrunt.hcl":{frameworks:["Terragrunt","Terraform"],slots:{hosting:"Cloud",cicd:"Terragrunt"},priority:30,intelligence:"high"},"ansible.yml":{frameworks:["Ansible"],slots:{cicd:"Ansible"},priority:30,intelligence:"high"},"playbook.yml":{frameworks:["Ansible"],slots:{cicd:"Ansible"},priority:25,intelligence:"high"},"*.cs":{frameworks:["C#",".NET","Unity"],slots:{mainLanguage:"C#"},priority:30,intelligence:"high"},"*.m":{frameworks:["Objective-C","iOS"],slots:{mainLanguage:"Objective-C"},priority:25,intelligence:"high"},".nvmrc":{frameworks:["Node.js","nvm"],slots:{runtime:"Node.js"},priority:25,intelligence:"high"},".tool-versions":{frameworks:["asdf"],slots:{},priority:25,intelligence:"high"},".ruby-version":{frameworks:["Ruby","rbenv"],slots:{mainLanguage:"Ruby",runtime:"Ruby"},priority:25,intelligence:"high"},".python-version":{frameworks:["Python","pyenv"],slots:{mainLanguage:"Python",runtime:"Python"},priority:25,intelligence:"high"},".dockerignore":{frameworks:["Docker"],slots:{},priority:20,intelligence:"medium"},".gitattributes":{frameworks:["Git"],slots:{},priority:15,intelligence:"low"},".npmrc":{frameworks:["npm","Node.js"],slots:{packageManager:"npm"},priority:20,intelligence:"medium"},"sonar-project.properties":{frameworks:["SonarQube","SonarCloud"],slots:{cicd:"SonarQube"},priority:25,intelligence:"high"},"*.fs":{frameworks:["F#",".NET"],slots:{mainLanguage:"F#"},priority:25,intelligence:"high"},"*.mm":{frameworks:["Objective-C++","iOS","macOS"],slots:{mainLanguage:"Objective-C++"},priority:25,intelligence:"high"},"build.zig.zon":{frameworks:["Zig"],slots:{mainLanguage:"Zig",packageManager:"Zig Package Manager",buildTool:"zig build"},priority:35,intelligence:"ultra-high"},"gleam.toml":{frameworks:["Gleam","BEAM","Erlang"],slots:{mainLanguage:"Gleam",runtime:"BEAM",packageManager:"Gleam"},priority:30,intelligence:"high"},"bunfig.toml":{frameworks:["Bun"],slots:{runtime:"Bun",packageManager:"Bun",buildTool:"Bun"},priority:30,intelligence:"high"},"mise.toml":{frameworks:["mise"],slots:{},priority:25,intelligence:"high"},".mise.toml":{frameworks:["mise"],slots:{},priority:25,intelligence:"high"},"manifest.toml":{frameworks:["Flox","Nix"],slots:{},priority:25,intelligence:"high",confirmWith:[".flox"]},justfile:{frameworks:["Just"],slots:{buildTool:"Just"},priority:25,intelligence:"high"},".pre-commit-config.yaml":{frameworks:["pre-commit"],slots:{cicd:"pre-commit"},priority:25,intelligence:"high"},"CLAUDE.md":{frameworks:["Claude Code"],slots:{},priority:30,intelligence:"high",confirmWith:[".claude"]}};import{existsSync as aZ,readFileSync as eq,readdirSync as $Y}from"fs";import{join as E8}from"path";var n0={version:2,_doc:"SINGLE SOURCE of Dart/Flutter detection KNOWLEDGE (A+B hybrid, the Truth-is-faf-cli spec). faf-cli imports this directly; faf-python-sdk vendors a synced copy (phase 2); MCPs compose it. Bolster Dart/Flutter by editing THIS file. Logic stays in dart.ts. Refreshed 2026-08-01 (knowledge v2) — community receipt on top of 6.13.0 Dart Edition.",flutterDeps:["flutter"],mcpDeps:["dart_mcp","mcp_server","mcp_dart","dart_mcp_server","mcp","dart_mcpserver"],serverFrameworks:[["serverpod","Serverpod"],["dart_frog","Dart Frog"],["conduit","Conduit"],["angel3_framework","Angel3"],["alfred","Alfred"],["shelf","Shelf"],["jaspr","Jaspr"],["relic","Relic"]],stateManagement:[["flutter_riverpod","Riverpod"],["hooks_riverpod","Riverpod"],["riverpod_annotation","Riverpod"],["riverpod","Riverpod"],["flutter_bloc","Bloc"],["bloc","Bloc"],["provider","Provider"],["get","GetX"],["flutter_mobx","MobX"],["mobx","MobX"],["signals","Signals"],["flutter_hooks","Hooks"]],routing:[["go_router","go_router"],["auto_route","auto_route"],["beamer","Beamer"],["routemaster","Routemaster"]]};var ZY=n0.flutterDeps,QY=n0.mcpDeps,XY=n0.serverFrameworks,zY=n0.stateManagement,JY=n0.routing;function HY($){let Z=new Set,Q=!1;for(let X of $.split(`
|
|
214
|
+
`,"utf-8"),z}import{existsSync as FZ,mkdirSync as nW,readFileSync as Yq,writeFileSync as sW}from"fs";import{dirname as Bq,join as NZ}from"path";var AZ="https://faf.one/context",Gq="JSONRPC",PZ="1.0",Vq=["a2a","mcp","registry","catalog"];function Wq($){return r(Yq($,"utf-8"))}function _q($=process.cwd()){let Z=["agent.fafa",".fafa"];for(let X of Z){let z=NZ($,X);if(FZ(z))return z}let Q=Bq($);if(Q!==$)for(let X of Z){let z=NZ(Q,X);if(FZ(z))return z}return null}function Oq($){return($.endpoints??[]).filter((Z)=>String(Z.protocol??"").toLowerCase()==="a2a"&&Z.location)}function L8($,Z={}){let Q=Oq($);if(Q.length>0)return Q;let X=Z.doorUrl?.trim();if(X)return[{protocol:"a2a",location:X,version:PZ}];return[]}function TZ($,Z,Q={}){let X=$.agent??{},z=L8($,Q);if(z.length===0)throw Error("No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.");let J=String(X.displayName??$.metadata?.persona??X.name??"").trim(),H=String(X.description??"").trim(),U=String(X.version??"").trim(),q=String(X.vendor??"").trim(),Y=String(X.homepage??"").trim();if(!J||!H||!U||!q||!Y)throw Error("A2A card needs agent.displayName|name, description, version, vendor, homepage in .fafa");let B=c0(Z,Q),G=($.capabilities??[]).map((V)=>{let _=String(V.name??"").trim();if(!_)throw Error("A2A skill missing capabilities[].name");let D=Array.isArray(V.tags)?V.tags.map(String):[];return{id:_,name:_,description:String(V.description??"").trim()||_,tags:D}});return{name:J,description:H,supportedInterfaces:z.map((V)=>({url:String(V.location),protocolBinding:Gq,protocolVersion:String(V.version??PZ)})),provider:{organization:q,url:Y},version:U,capabilities:{streaming:!1,pushNotifications:!1,extendedAgentCard:!1,extensions:[{uri:AZ,description:"FAF context provenance — the durable context block (one context, every door).",required:!1,params:B}]},defaultInputModes:["text/plain","application/json"],defaultOutputModes:["text/plain","application/json"],skills:G}}function Dq($){let Z=$.agent?.homepage;if(!Z)return"local";try{return new URL(Z).hostname.replace(/^www\./,"")}catch{return"local"}}function Iq($,Z){if(Z.a2aCardUrl)return Z.a2aCardUrl;let Q=$.agent?.homepage;if(Q)try{return new URL("/.well-known/agent-card.json",Q).href}catch{}return"/.well-known/agent-card.json"}function Kq($,Z,Q={}){let X=Dq($),z=$.agent??{},J=String(z.name??"agent"),H=Q.now??Z.generated??new Date().toISOString(),U=[];if(L8($,Q).length>0)U.push({identifier:`urn:air:${X}:a2a:${J}`,displayName:String(z.displayName??z.name??"A2A Agent Card"),type:"application/a2a-agent-card+json",description:"A2A v1.0 Agent Card. Projected from .fafa.",url:Iq($,Q),updatedAt:H});let q=Mq($,"fafa");if(q)U.push({identifier:`urn:air:${X}:agent:${J}`,displayName:String(z.displayName??z.name??".fafa"),type:"application/vnd.fafa+yaml",description:"FAF agent passport (.fafa).",url:q,updatedAt:H});return U}function Mq($,Z){let Q=$.agent?.homepage;if(!Q)return;try{return new URL(`/.well-known/${Z}`,Q).href}catch{return}}function Lq($,Z){let Q=$.findIndex((X)=>X.identifier===Z.identifier);if(Q>=0)return Q;if(Z.type==="application/a2a-agent-card+json"||Z.type==="application/json"||Z.identifier.includes(":a2a:"))return $.findIndex((X)=>X.identifier.includes(":a2a:")||X.type==="application/a2a-agent-card+json"||String(X.url??"").includes("agent-card.json"));if(Z.type==="application/vnd.fafa+yaml")return $.findIndex((X)=>X.type==="application/vnd.fafa+yaml");return-1}function Rq($,Z){let Q=$?{...$,entries:[...$.entries??[]]}:{specVersion:"1.0",entries:[]};for(let X of Z){let z=Lq(Q.entries,X);if(z>=0)Q.entries[z]={...Q.entries[z],url:X.url,type:X.type,...X.updatedAt?{updatedAt:X.updatedAt}:{}};else Q.entries.push(X)}return Q}function Fq($){let Z=$.opts??{},Q=new Set($.targets?.length?$.targets:Vq),z={block:c0($.faf,Z)};if(Q.has("mcp"))z.mcp=v2($.faf,Z);if(Q.has("registry")){let J=M8($.faf);z.registry={name:K8($.faf),...J?{title:J}:{},_meta:I8($.faf,Z)}}if(Q.has("a2a")||Q.has("catalog")){if(!$.fafa){if($.targets?.includes("a2a")||$.targets?.includes("catalog"))throw Error("A2A/catalog require a .fafa (agent.fafa). Will not invent an agent.")}}if(Q.has("a2a")&&$.fafa)if(L8($.fafa,Z).length===0){if($.targets?.includes("a2a"))throw Error("No A2A endpoint in .fafa (need endpoints[].protocol: a2a + location). Will not invent a door.")}else z.a2a=TZ($.fafa,$.faf,Z);if(Q.has("catalog")&&$.fafa)z.catalog=Kq($.fafa,$.faf,Z);return Nq(z),z}function Nq($){let Z=JSON.stringify($.block),Q=[];if($.a2a)Q.push(JSON.stringify($.a2a.capabilities.extensions[0].params));if($.mcp){let X=$.mcp._meta;Q.push(JSON.stringify(X["one.faf/context"]))}if($.registry){let X=$.registry._meta["io.modelcontextprotocol.registry/publisher-provided"];Q.push(JSON.stringify(X["one.faf/context"]))}for(let X of Q)if(X!==Z)throw Error("context block drifted across card targets — one projector, one block")}var R8=["ephemeral","standard","high","critical"],O0=Object.fromEntries(R8.map(($,Z)=>[$,Z])),f2=new Set(["user","feedback","project","reference"]),F8=new Set(["version","profile","namepoint","created","last_etched","retention","index","memory"]),N8=new Set(["facts","sessions","preferences","custom"]),A8={low:"ephemeral",medium:"standard"};import{readFileSync as Aq,writeFileSync as Pq,existsSync as Tq}from"fs";function i0(){return new Date().toISOString().replace(/\.\d{3}Z$/,"Z")}function k($){return $===null||$===void 0}function T1($){if(k($))return"standard";if(A8[$])return A8[$];if($ in O0)return $;return"standard"}var Cq=new Set(["text","id","type","priority","tags","links","timestamp","source"]);function CZ($){if(typeof $==="string")return{text:$,id:null,type:null,priority:"standard",tags:[],links:[],timestamp:null,source:null,extra:{}};if(!$||typeof $!=="object"||!("text"in $))throw Error(`fact must be a string or a mapping with 'text': ${JSON.stringify($)}`);let Z=$,Q={};for(let[X,z]of Object.entries(Z))if(!Cq.has(X))Q[X]=z;return{text:String(Z.text),id:Z.id??null,type:Z.type??null,priority:T1(Z.priority),tags:Array.isArray(Z.tags)?Z.tags.slice():[],links:Array.isArray(Z.links)?Z.links.slice():[],timestamp:Z.timestamp??null,source:Z.source??null,extra:Q}}function wZ($){if(k($.id)&&k($.type)&&$.tags.length===0&&$.links.length===0&&k($.timestamp)&&k($.source)&&Object.keys($.extra).length===0&&$.priority==="standard")return $.text;let Q={text:$.text};if(!k($.id))Q.id=$.id;if(!k($.type))Q.type=$.type;if(Q.priority=$.priority,$.tags.length)Q.tags=$.tags;if($.links.length)Q.links=$.links;if(!k($.timestamp))Q.timestamp=$.timestamp;if(!k($.source))Q.source=$.source;return Object.assign(Q,$.extra),Q}class T0{namepoint;profile;retention;created;last_etched;_facts;_byId;_index;_sessions;_preferences;_custom;_extra;_memoryExtra;constructor($,Z={}){this.namepoint=$,this.profile=Z.profile??"knowledge",this.retention=Z.retention??"forever",this.created=Z.created??i0(),this.last_etched=this.created,this._facts=Z.facts?Z.facts.slice():[],this._byId=new Map,this._facts.forEach((Q,X)=>{if(!k(Q.id))this._byId.set(Q.id,X)}),this._index=Z.index?Z.index.slice():[],this._sessions=Z.sessions?structuredClone(Z.sessions):[],this._preferences=Z.preferences?{...Z.preferences}:{},this._custom=Z.custom?{...Z.custom}:{},this._extra=Z.extra?{...Z.extra}:{},this._memoryExtra=Z.memoryExtra?{...Z.memoryExtra}:{}}get facts(){return this._facts}get index(){return this._index}get sessions(){return this._sessions}get preferences(){return this._preferences}get custom(){return this._custom}get extra(){return this._extra}get memoryExtra(){return this._memoryExtra}static load($){if(!Tq($))throw Error(`soul file not found: ${$}`);let Z=Aq($,"utf-8"),Q=r(Z);if(!Q||typeof Q!=="object")throw Error("soul is not a YAML mapping");let X=Q.memory&&typeof Q.memory==="object"?Q.memory:{},z=Array.isArray(X.facts)?X.facts:[],J={};for(let[q,Y]of Object.entries(Q))if(!F8.has(q))J[q]=structuredClone(Y);let H={};for(let[q,Y]of Object.entries(X))if(!N8.has(q))H[q]=structuredClone(Y);let U=new T0(String(Q.namepoint??$.replace(/.*\//,"").replace(/\.fafm$/,"")),{profile:String(Q.profile??"voice"),facts:z.map(CZ),retention:String(Q.retention??"forever"),created:Q.created??null,index:Array.isArray(Q.index)?Q.index.slice():[],sessions:Array.isArray(X.sessions)?structuredClone(X.sessions):[],preferences:X.preferences&&typeof X.preferences==="object"?structuredClone(X.preferences):{},custom:X.custom&&typeof X.custom==="object"?structuredClone(X.custom):{},extra:J,memoryExtra:H});return U.last_etched=String(Q.last_etched??U.created),U}static fromFile($){return T0.load($)}toDoc(){let $={facts:this._facts.map(wZ),sessions:structuredClone(this._sessions),preferences:structuredClone(this._preferences),custom:structuredClone(this._custom)};for(let[Q,X]of Object.entries(this._memoryExtra))if(!N8.has(Q))$[Q]=structuredClone(X);let Z={version:"1.1",profile:this.profile,namepoint:this.namepoint,created:this.created,last_etched:this.last_etched,retention:this.retention,index:this._index.slice(),memory:$};for(let[Q,X]of Object.entries(this._extra))if(!F8.has(Q))Z[Q]=structuredClone(X);return Z}toYaml(){return h2(this.toDoc(),{lineWidth:100})}rebuildIndex($=80){return this._index=this._facts.map((Z)=>`${Z.id??"?"} — ${Z.text.slice(0,$)}`),this._index}save($,Z={}){if(Z.reindex!==!1)this.rebuildIndex();return Pq($,this.toYaml(),"utf-8"),$}toFile($,Z={}){return this.save($,Z)}add($){if(!k($.id)&&this._byId.has($.id)){let Z=this._byId.get($.id);if(Z!==void 0)this._facts[Z]=$}else if(this._facts.push($),!k($.id))this._byId.set($.id,this._facts.length-1);if($.timestamp&&$.timestamp>(this.last_etched||""))this.last_etched=$.timestamp;return $}etch($,Z={}){return this.add({text:$,id:Z.id??null,type:Z.type??null,priority:T1(Z.priority),tags:Z.tags?Z.tags.slice():[],links:Z.links?Z.links.slice():[],timestamp:i0(),source:Z.source??null,extra:{}})}recall($,Z={}){let Q=O0[T1(Z.minPriority??"ephemeral")]??0,X=($??"").toLowerCase(),z=new Set(Z.tags??[]),J=[];this._facts.forEach((U,q)=>{if(X&&!U.text.toLowerCase().includes(X))return;if(z.size>0&&![...z].some((Y)=>U.tags.includes(Y)))return;if(!k(Z.type)&&U.type!==Z.type)return;if((O0[U.priority]??1)<Q)return;J.push([q,U])}),J.sort((U,q)=>{let Y=O0[U[1].priority]??1,B=O0[q[1].priority]??1;if(B!==Y)return B-Y;let G=U[1].timestamp??"",V=q[1].timestamp??"";if(V!==G)return V<G?-1:V>G?1:0;return q[0]-U[0]});let H=J.map(([,U])=>U);if(!k(Z.limit))return H.slice(0,Z.limit);return H}getFact($){let Z=this._byId.get($);return Z===void 0?null:this._facts[Z]}deleteFact($){let Z=this._byId.get($);if(Z===void 0)return!1;return this._facts.splice(Z,1),this._byId.clear(),this._facts.forEach((Q,X)=>{if(!k(Q.id))this._byId.set(Q.id,X)}),!0}}import{readdirSync as wq,readFileSync as bq,statSync as bZ,existsSync as Eq}from"fs";import{join as Sq,basename as EZ,resolve as jq}from"path";var SZ=new Set(["MEMORY.md","MEMORY-FULL.md","README.md"]),xq=/\[\[([^\]]+)\]\]/g;function gq($){let Z=bZ($).mtimeMs;return new Date(Z).toISOString().replace(/\.\d{3}Z$/,"Z")}function hq($){if(!$.startsWith("---"))return{fm:null,body:$};let Z=$.split("---");if(Z.length<3)return{fm:null,body:$};try{let Q=r(Z[1]);if(!Q||typeof Q!=="object")return{fm:null,body:Z.slice(2).join("---").trim()};return{fm:Q,body:Z.slice(2).join("---").trim()}}catch{return{fm:null,body:$}}}function yq($,Z,Q){if(!Q.name)return null;let X=Q.metadata&&typeof Q.metadata==="object"?Q.metadata:{},z=X.type;if(typeof z!=="string"||!f2.has(z))return null;let J=String(Q.name).trim(),U=(Q.description!==void 0&&Q.description!==null&&String(Q.description).trim()?String(Q.description).trim():"")||J,q={};if(X.originSessionId)q.provenance=[`session:${X.originSessionId}`];let Y=[...new Set([...Z.matchAll(xq)].map((B)=>B[1]))].sort();return{text:U,id:J,type:z,priority:"standard",tags:[],links:Y,timestamp:gq($),source:`claude-code memory: ${EZ($)}`,extra:q}}function jZ($,Z={}){let Q=jq($);if(!Eq(Q))throw Error(`Claude memory directory not found: ${Q}`);if(!bZ(Q).isDirectory())throw Error(`Claude memory path is not a directory: ${Q}`);let X=Z.skip??SZ,z=Z.namepoint??`@claude-code:${EZ(Q)}`,J=[],H=wq(Q).filter((G)=>G.endsWith(".md")).sort();for(let G of H){if(X.has(G))continue;let V=Sq(Q,G),_;try{_=bq(V,"utf-8")}catch{continue}let{fm:D,body:W}=hq(_);if(!D)continue;let O=yq(V,W,D);if(O)J.push(O)}let U=J.map((G)=>G.timestamp).filter(Boolean),q=U.length?U.reduce((G,V)=>G<V?G:V):i0(),Y=U.length?U.reduce((G,V)=>G>V?G:V):q,B=new T0(z,{profile:"knowledge",facts:J,created:q});return B.last_etched=Y,B.rebuildIndex(),B}var vZ="faf-interview/1",r0="(terse — 3-4 words)",P8=[{path:"project.name",question:"What is the name of this project?",header:"Name",type:"text",required:!0},{path:"project.goal",question:"What does this project do? (one sentence)",header:"Goal",type:"text",required:!0},{path:"human_context.who",question:`Who is this for? ${r0}`,header:"Who",type:"text",required:!0},{path:"human_context.what",question:`What are they building? ${r0}`,header:"What",type:"text",required:!0},{path:"human_context.why",question:`Why does it exist? ${r0}`,header:"Why",type:"text",required:!0},{path:"human_context.where",question:`Where does it run or ship? ${r0}`,header:"Where",type:"text",required:!0},{path:"human_context.when",question:`When — timeline or stage? ${r0}`,header:"When",type:"text",required:!0},{path:"human_context.how",question:`How is it built or used? ${r0}`,header:"How",type:"text",required:!0}],fZ=[{path:"project.main_language",question:"What is the primary programming language?",header:"Language",type:"select",required:!0,options:[{label:"TypeScript",value:"TypeScript",description:"JavaScript with types"},{label:"JavaScript",value:"JavaScript",description:"Vanilla JS or Node.js"},{label:"Python",value:"Python",description:"Python 3.x"},{label:"Rust",value:"Rust",description:"Systems programming"},{label:"Go",value:"Go",description:"Golang"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.frontend",question:"What frontend framework does it use?",header:"Frontend",type:"select",required:!1,options:[{label:"React",value:"React",description:"React.js"},{label:"Vue",value:"Vue",description:"Vue.js"},{label:"Svelte",value:"Svelte",description:"Svelte/SvelteKit"},{label:"Next.js",value:"Next.js",description:"React framework"},{label:"None",value:"None",description:"No frontend"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.backend",question:"What backend framework does it use?",header:"Backend",type:"select",required:!1,options:[{label:"Express",value:"Express",description:"Node.js Express"},{label:"Fastify",value:"Fastify",description:"Node.js Fastify"},{label:"Django",value:"Django",description:"Python Django"},{label:"FastAPI",value:"FastAPI",description:"Python FastAPI"},{label:"None",value:"None",description:"No backend"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.database",question:"What database does it use?",header:"Database",type:"select",required:!1,options:[{label:"PostgreSQL",value:"PostgreSQL",description:"Postgres"},{label:"MySQL",value:"MySQL",description:"MySQL/MariaDB"},{label:"SQLite",value:"SQLite",description:"Embedded SQL"},{label:"MongoDB",value:"MongoDB",description:"Document store"},{label:"None",value:"None",description:"No database"},{label:"Other",value:"Other",description:"Specify manually"}]},{path:"stack.runtime",question:"What runtime does it run on?",header:"Runtime",type:"text",required:!1},{path:"stack.hosting",question:"Where is it hosted or distributed?",header:"Hosting",type:"text",required:!1},{path:"stack.build",question:"What is the build tool?",header:"Build",type:"text",required:!1},{path:"stack.cicd",question:"What CI/CD does it use?",header:"CI/CD",type:"text",required:!1}],a0=[...P8,...fZ],kZ=new Map(a0.map(($)=>[$.path,$])),vq=Object.fromEntries(a0.map(($)=>[$.path,$]));function T8($){let Z=kZ.get($);if(Z)return Z.question;let Q=e0.get($)??v.find((X)=>X.canonical===$);return Q?`${Q.description}?`.replace(/\?\?$/,"?"):`${$}?`}function fq($,Z){return a0.filter((Q)=>{let X=Q.path.split("."),z=$;for(let J of X)if(z&&typeof z==="object"&&J in z)z=z[J];else{z=void 0;break}if(z==="slotignored")return!1;return Z(z)})}var kq=new Set(["developers","development teams","development team","teams","development","cloud platform","web platform","platform","best practices","improve development efficiency","development efficiency","modern development practices","modern development","test-driven development","production/stable","production","stable","app","project","tool"]),uq=[["npm",/\bnpm\b/i],["PyPI",/\bpypi\b/i],["crates.io",/\bcrates\.io\b/i],["Homebrew",/\bhomebrew\b/i],["Docker",/\bdocker\b/i],["Cloudflare",/\bcloudflare\b/i],["Vercel",/\bvercel\b/i],["Netlify",/\bnetlify\b/i],["AWS",/\baws\b/i],["Cloud Run",/\bcloud run\b/i],["edge",/\bedge\b/i],["browser",/\bbrowser\b/i],["WASM",/\bwasm\b/i],["GitHub",/\bgithub\b/i],["MCP Registry",/\bmcp registry\b/i],["Chrome Web Store",/\bchrome web store\b/i],["Smithery",/\bsmithery\b/i]],xZ=($)=>kq.has($.toLowerCase().trim()),mq=/^(?:with|and|or|using|for|to|that|who|whom|whose|the|a|an|in|on|of|via|by|&)$/i;function gZ($,Z=5){let Q=$.trim().split(/\s+/).filter(Boolean).slice(0,Z);while(Q.length&&mq.test(Q[Q.length-1].replace(/[.,;:]+$/,"")))Q.pop();return Q.join(" ")}function uZ($){let Z={};if(!$||typeof $!=="string")return Z;let Q=$.trim(),X=Q.replace(/^[^A-Za-z0-9]+/,"").split(/\s+(?:for|that|which|to)\s+|\s+[—–]\s+|\s-\s|:\s|\.\s|,\s/)[0].trim(),z=gZ(X);if(z.split(/\s+/).filter(Boolean).length>=2&&!xZ(z))Z.what=z;let J=uq.filter(([,q])=>q.test(Q)).map(([q])=>q);if(J.length)Z.where=J.slice(0,4).join(", ");let H=Q.match(/\bfor ((?:[A-Za-z][\w./+-]* )?(?:any |all )?(?:developers?|teams?|engineers?|builders?|users?|integrators?)\b[^.,;:—]*)/i),U=gZ((H?.[1]||"").trim().replace(/\s+/g," "));if(U&&!xZ(U))Z.who=U;return Z}function hZ($,Z){let Q=$;for(let X of Z.split("."))if(Q&&typeof Q==="object"&&X in Q)Q=Q[X];else return;return Q}function yZ($){if(typeof $!=="string")return!1;let Z=$.trim();if(!Z||Z==="slotignored")return!1;return!K0(Z)}function lq($,Z={}){let Q=$&&typeof $==="object"?$:{},X=hZ(Q,"project.goal"),z=(yZ(X)?String(X).trim():"")||(Z.goal??"").trim(),J=uZ(z),H=Z.detailed??{},U={"project.goal":z||void 0,"human_context.what":J.what,"human_context.where":J.where,"human_context.who":J.who},q=(_)=>{let D=U[_];if(D)return{value:D,source:"project goal",confidence:0.9};let W=_.startsWith("human_context.")?_.slice(14):"",O=W?H[W]:void 0;return O?{value:O.value,source:O.source,confidence:O.confidence}:void 0},Y=P8.map((_,D)=>{let W={n:D+1,path:_.path,header:_.header,question:_.question},O=hZ(Q,_.path);if(yZ(O))return{...W,value:String(O).trim(),status:"filled",seeded:!1};let I=q(_.path);if(I)return{...W,value:I.value,status:"seeded",seeded:!0,source:I.source,confidence:I.confidence};return{...W,value:"",status:"empty",seeded:!1}}),B=Y.filter((_)=>_.status==="filled").length,G=Y.filter((_)=>_.status==="seeded").length,V=Y.filter((_)=>_.status==="empty").length;return{version:vZ,rows:Y,filledCount:B,seededCount:G,emptyCount:V,complete:V===0}}function k2($){if($===null||$===void 0)return!0;if(typeof $==="string"){let Z=$.trim();return Z===""||K0(Z)}return!1}function pq($,Z){let Q=$;for(let X of Z.split("."))if(Q&&typeof Q==="object"&&X in Q)Q=Q[X];else return;return Q}function mZ($){if($==="project.goal")return!0;return e0.get($)?.category==="human"}function lZ($,Z=k2){let Q=[],X=[];for(let z of a0){let J=pq($,z.path);if(J==="slotignored")continue;if(!Z(J))continue;(mZ(z.path)?Q:X).push(z.path)}return{human:Q,sourceable:X}}function pZ($,Z,Q=k2){let X=lZ(Z,Q),z;if($>=100||X.human.length===0&&X.sourceable.length===0)z="done";else if(X.sourceable.length>0)z="can-source";else z="needs-human";let J=z==="needs-human"?C8(X):[];return{status:z,score:$,gaps:X,ask:J}}function C8($){return $.human.map((Z)=>({path:Z,question:T8(Z)}))}function dq($,Z={}){let Q=Math.max(1,Z.maxRounds??5),X=Z.isEmpty??k2,z=[],J=0;for(let U=0;U<=Q;U++){let q=$.read();if(!q)return{status:"no-faf",score:0,rounds:J,history:z,ask:[]};let Y=$.score(q.yaml);z.push(Y);let B=pZ(Y,q.data,X);if(B.status==="done")return{status:"done",score:Y,rounds:J,history:z,ask:[]};if(B.status==="needs-human")return{status:"needs-human",score:Y,rounds:J,history:z,ask:B.ask};if(z.length>=2&&Y<=z[z.length-2])return B.gaps.human.length?{status:"needs-human",score:Y,rounds:J,history:z,ask:C8(B.gaps)}:{status:"stuck",score:Y,rounds:J,history:z,ask:[]};if(J>=Q)return{status:"capped",score:Y,rounds:J,history:z,ask:C8(B.gaps)};$.runAuto(),J++}return{status:"capped",score:z[z.length-1]??0,rounds:J,history:z,ask:[]}}import{createHash as cZ}from"crypto";var w8="faf-bench/1",cq={"project.name":"What is the project's name?","project.goal":"What is the project's goal — what is it for?","project.main_language":"What is the primary programming language?","human_context.who":"Who is this project for?","human_context.what":"What are they building?","human_context.why":"Why does this project exist?","human_context.where":"Where does it run or get distributed?","human_context.when":"When — what is the project's timeline or stage?","human_context.how":"How is it built or used?"};function iq($,Z){return cq[$]??`What is the project's ${Z.replace(/\s*\(.*\)$/,"").toLowerCase()}?`}var iZ=[["typescript","ts"],["javascript","js"],["python","py","python3"],["node","nodejs","node js","node.js"],["github actions","gh actions","actions"],["postgresql","postgres","pg"],["kubernetes","k8s"],["npm","npm registry"],["cloudflare workers","cf workers","workers"],["google cloud run","cloud run","gcp cloud run"]],C1=new Map;iZ.forEach(($,Z)=>$.forEach((Q)=>C1.set(Q,Z)));var rq=new Set(["a","an","the","and","or","of","for","to","in","on","with","is","it","its","their","your","via","by","using","use","used"]);function u2($){return $.toLowerCase().replace(/[^a-z0-9\s.+#-]/g," ").replace(/\.(?=\s|$)/g," ").replace(/\s+/g," ").trim()}function dZ($){return u2($).split(" ").filter((Z)=>Z&&!rq.has(Z))}function rZ($,Z){let Q=u2($),X=u2(Z);if(!Q||!X)return!1;if(Q===X)return!0;let z=C1.get(Q);if(z!==void 0&&C1.get(X)===z)return!0;let J=dZ($);if(J.length===0)return!1;let H=new Set(dZ(Z));return J.every((U)=>{if(H.has(U))return!0;let q=C1.get(U);return q!==void 0&&[...H].some((Y)=>C1.get(Y)===q)})}function aq($){let Z=J$($),Q=r($),X=[],z={},J=0;for(let q of v){if(Z.slots[q.path]!=="populated")continue;let Y=n8(Q,q);if(typeof Y!=="string")continue;let B=Y.trim();if(!B||p1.has(B.toLowerCase()))continue;J+=1,X.push({n:J,path:q.path,question:iq(q.path,q.description)}),z[J]=B}let H=JSON.stringify({v:w8,q:X.map((q)=>[q.path,q.question])}),U=cZ("sha256").update(H).digest("hex").slice(0,12);return{version:w8,qsetHash:U,questions:X,answers:z}}function nq($){return{version:$.version,qsetHash:$.qsetHash,questions:$.questions}}function sq($,Z){let Q=$.questions.map((z)=>{let J=Z[String(z.n)]??Z[z.path]??"";return{n:z.n,path:z.path,ok:typeof J==="string"&&J.trim()!==""&&rZ($.answers[z.n],J)}}),X=$.questions.filter((z)=>!Q[z.n-1].ok);return{correct:Q.filter((z)=>z.ok).length,total:$.questions.length,misses:X,perQuestion:Q}}function oq($,Z){let Q=JSON.stringify({v:$.version,repo:Z??null,qset:$.qsetHash,protocol:$.protocol,cold:$.cold??null,faf:$.faf??null});return{projection:Q,hash:cZ("sha256").update(Q).digest("hex")}}import{existsSync as gB,readdirSync as B4,readFileSync as hB}from"fs";import{join as v8,dirname as yB,extname as vB,resolve as fB}from"path";var b8={"package.json":{frameworks:["Node.js","JavaScript","TypeScript"],slots:{packageManager:"npm/yarn/pnpm",mainLanguage:"JavaScript/TypeScript"},priority:35,intelligence:"ultra-high"},"README.md":{frameworks:[],slots:{targetUser:"developers",coreProblem:"understanding project",missionPurpose:"project documentation"},priority:25,intelligence:"high"},"requirements.txt":{frameworks:["Python"],slots:{packageManager:"pip",mainLanguage:"Python"},priority:35,intelligence:"ultra-high"},Pipfile:{frameworks:["Python"],slots:{packageManager:"pipenv",mainLanguage:"Python"},priority:35,intelligence:"ultra-high"},"pyproject.toml":{frameworks:["Python"],slots:{mainLanguage:"Python",runtime:"Python",backend:"Python"},priority:36,intelligence:"ultra-high"},Gemfile:{frameworks:["Ruby"],slots:{packageManager:"bundler",mainLanguage:"Ruby"},priority:35,intelligence:"ultra-high"},"Gemfile.lock":{frameworks:["Ruby"],slots:{packageManager:"bundler",mainLanguage:"Ruby"},priority:34,intelligence:"high"},"composer.json":{frameworks:["PHP","Laravel","Symfony"],slots:{packageManager:"composer",mainLanguage:"PHP"},priority:35,intelligence:"ultra-high"},"Cargo.toml":{frameworks:["Rust"],slots:{packageManager:"cargo",mainLanguage:"Rust",buildTool:"cargo"},priority:36,intelligence:"ultra-high"},"go.mod":{frameworks:["Go"],slots:{packageManager:"go modules",mainLanguage:"Go",buildTool:"go build"},priority:36,intelligence:"ultra-high"},"Package.swift":{frameworks:["Swift"],slots:{packageManager:"spm",mainLanguage:"Swift",buildTool:"swift build"},priority:36,intelligence:"ultra-high"},"*.csproj":{frameworks:["C#",".NET"],slots:{packageManager:"NuGet",mainLanguage:"C#",buildTool:"dotnet"},priority:36,intelligence:"ultra-high"},"pubspec.yaml":{frameworks:["Dart"],slots:{packageManager:"pub",mainLanguage:"Dart"},priority:35,intelligence:"ultra-high"},"pom.xml":{frameworks:["Java"],slots:{packageManager:"maven",mainLanguage:"Java",buildTool:"maven"},priority:35,intelligence:"ultra-high"},"build.gradle":{frameworks:["Java","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Java",buildTool:"gradle"},priority:35,intelligence:"ultra-high"},"settings.gradle":{frameworks:["Java","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Java",buildTool:"gradle"},priority:34,intelligence:"high"},"settings.gradle.kts":{frameworks:["Kotlin","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Kotlin",buildTool:"gradle"},priority:34,intelligence:"high"},"next.config.js":{frameworks:["Next.js"],slots:{framework:"Next.js",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"next.config.mjs":{frameworks:["Next.js"],slots:{framework:"Next.js",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"next.config.ts":{frameworks:["Next.js 13+"],slots:{framework:"Next.js 13+",runtime:"Node.js",buildTool:"Next.js",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"nuxt.config.js":{frameworks:["Nuxt 2"],slots:{framework:"Nuxt 2",runtime:"Node.js",buildTool:"Nuxt",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"nuxt.config.ts":{frameworks:["Nuxt 3"],slots:{framework:"Nuxt 3",runtime:"Node.js",buildTool:"Nuxt",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"svelte.config.js":{frameworks:["SvelteKit"],slots:{framework:"SvelteKit",buildTool:"Vite",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"angular.json":{frameworks:["Angular"],slots:{framework:"Angular",buildTool:"Angular CLI",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"manifest.json":{frameworks:["Chrome Extension","Browser Extension"],slots:{framework:"Chrome Extension",runtime:"Chrome/Browser",mainLanguage:"JavaScript",hosting:"Chrome Web Store",apiType:"Chrome APIs"},priority:35,intelligence:"ultra-high",confirmWith:["popup.html","background.js","content.js"]},"vue.config.js":{frameworks:["Vue"],slots:{framework:"Vue",buildTool:"Vue CLI",mainLanguage:"JavaScript"},priority:30,intelligence:"high"},"remix.config.js":{frameworks:["Remix"],slots:{framework:"Remix",runtime:"Node.js",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"gatsby-config.js":{frameworks:["Gatsby"],slots:{framework:"Gatsby",buildTool:"Gatsby",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"gatsby-config.ts":{frameworks:["Gatsby"],slots:{framework:"Gatsby",buildTool:"Gatsby",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"astro.config.mjs":{frameworks:["Astro"],slots:{framework:"Astro",buildTool:"Vite",mainLanguage:"JavaScript",server:"Node.js"},priority:30,intelligence:"high"},"redwood.toml":{frameworks:["RedwoodJS"],slots:{framework:"RedwoodJS",buildTool:"Webpack",mainLanguage:"JavaScript/TypeScript",server:"Node.js",database:"Prisma"},priority:30,intelligence:"high"},"blitz.config.ts":{frameworks:["Blitz.js"],slots:{framework:"Blitz.js",buildTool:"Next.js",mainLanguage:"TypeScript",server:"Node.js",database:"Prisma"},priority:30,intelligence:"high"},"qwik.config.ts":{frameworks:["Qwik"],slots:{framework:"Qwik",buildTool:"Vite",mainLanguage:"TypeScript",server:"Node.js"},priority:30,intelligence:"high"},"manage.py":{frameworks:["Django"],slots:{framework:"Django",backend:"Django",mainLanguage:"Python",server:"Django",apiType:"Django Views"},priority:30,intelligence:"high"},artisan:{frameworks:["Laravel"],slots:{framework:"Laravel",backend:"Laravel",mainLanguage:"PHP",server:"PHP",apiType:"Laravel Routes"},priority:30,intelligence:"high"},"mix.exs":{frameworks:["Phoenix","Elixir"],slots:{framework:"Phoenix",backend:"Phoenix",mainLanguage:"Elixir",server:"BEAM"},priority:30,intelligence:"high"},"nest-cli.json":{frameworks:["NestJS"],slots:{framework:"NestJS",backend:"NestJS",mainLanguage:"TypeScript",server:"Node.js",apiType:"REST API"},priority:30,intelligence:"high"},"strapi.config.js":{frameworks:["Strapi"],slots:{backend:"Strapi",apiType:"REST API",database:"Required",server:"Node.js"},priority:30,intelligence:"high"},Dockerfile:{frameworks:["Docker"],slots:{hosting:"Docker",connection:"Containerized"},priority:30,intelligence:"high"},"docker-compose.yml":{frameworks:["Docker Compose"],slots:{hosting:"Docker",connection:"Multi-container"},priority:30,intelligence:"high"},"docker-compose.yaml":{frameworks:["Docker Compose"],slots:{hosting:"Docker",connection:"Multi-container"},priority:30,intelligence:"high"},"kubernetes.yml":{frameworks:["Kubernetes"],slots:{hosting:"Kubernetes",connection:"Orchestrated"},priority:30,intelligence:"high"},"k8s.yaml":{frameworks:["Kubernetes"],slots:{hosting:"Kubernetes",connection:"Orchestrated"},priority:30,intelligence:"high"},"vercel.json":{frameworks:["Vercel"],slots:{hosting:"Vercel",cicd:"Vercel"},priority:30,intelligence:"high"},"netlify.toml":{frameworks:["Netlify"],slots:{hosting:"Netlify",cicd:"Netlify"},priority:30,intelligence:"high"},"render.yaml":{frameworks:["Render"],slots:{hosting:"Render",cicd:"Render"},priority:30,intelligence:"high"},"fly.toml":{frameworks:["Fly.io"],slots:{hosting:"Fly.io",cicd:"Fly.io"},priority:30,intelligence:"high"},"railway.json":{frameworks:["Railway"],slots:{hosting:"Railway",cicd:"Railway"},priority:30,intelligence:"high"},"railway.toml":{frameworks:["Railway"],slots:{hosting:"Railway",cicd:"Railway"},priority:30,intelligence:"high"},"app.yaml":{frameworks:["Google App Engine"],slots:{hosting:"Google Cloud",cicd:"Google Cloud"},priority:30,intelligence:"high"},Procfile:{frameworks:["Heroku"],slots:{hosting:"Heroku",cicd:"Heroku"},priority:30,intelligence:"high"},"vite.config.js":{frameworks:["Vite"],slots:{buildTool:"Vite"},priority:25,intelligence:"medium"},"vite.config.ts":{frameworks:["Vite"],slots:{buildTool:"Vite",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"webpack.config.js":{frameworks:["Webpack"],slots:{buildTool:"Webpack"},priority:25,intelligence:"medium"},"rollup.config.js":{frameworks:["Rollup"],slots:{buildTool:"Rollup"},priority:25,intelligence:"medium"},"esbuild.config.js":{frameworks:["esbuild"],slots:{buildTool:"esbuild"},priority:25,intelligence:"medium"},"parcel.config.js":{frameworks:["Parcel"],slots:{buildTool:"Parcel"},priority:25,intelligence:"medium"},"snowpack.config.js":{frameworks:["Snowpack"],slots:{buildTool:"Snowpack"},priority:25,intelligence:"medium"},"tsconfig.json":{frameworks:["TypeScript"],slots:{mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"jsconfig.json":{frameworks:["JavaScript"],slots:{mainLanguage:"JavaScript"},priority:20,intelligence:"medium"},"babel.config.js":{frameworks:["Babel"],slots:{buildTool:"Babel"},priority:20,intelligence:"medium"},".babelrc":{frameworks:["Babel"],slots:{buildTool:"Babel"},priority:20,intelligence:"medium"},"jest.config.js":{frameworks:["Jest"],slots:{cicd:"Jest"},priority:25,intelligence:"medium"},"jest.config.ts":{frameworks:["Jest"],slots:{cicd:"Jest",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"vitest.config.ts":{frameworks:["Vitest"],slots:{cicd:"Vitest",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"cypress.config.js":{frameworks:["Cypress"],slots:{cicd:"Cypress"},priority:25,intelligence:"medium"},"playwright.config.ts":{frameworks:["Playwright"],slots:{cicd:"Playwright",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"karma.conf.js":{frameworks:["Karma"],slots:{cicd:"Karma"},priority:20,intelligence:"medium"},"mocha.opts":{frameworks:["Mocha"],slots:{cicd:"Mocha"},priority:20,intelligence:"medium"},".rspec":{frameworks:["RSpec"],slots:{cicd:"RSpec",mainLanguage:"Ruby"},priority:25,intelligence:"medium"},"pytest.ini":{frameworks:["Pytest"],slots:{cicd:"Pytest",mainLanguage:"Python"},priority:25,intelligence:"medium"},"phpunit.xml":{frameworks:["PHPUnit"],slots:{cicd:"PHPUnit",mainLanguage:"PHP"},priority:25,intelligence:"medium"},"schema.prisma":{frameworks:["Prisma"],slots:{database:"Prisma ORM",connection:"Prisma"},priority:25,intelligence:"medium"},"drizzle.config.ts":{frameworks:["Drizzle"],slots:{database:"Drizzle ORM",connection:"Drizzle",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"ormconfig.js":{frameworks:["TypeORM"],slots:{database:"TypeORM",connection:"TypeORM"},priority:25,intelligence:"medium"},"knexfile.js":{frameworks:["Knex.js"],slots:{database:"Knex.js",connection:"Knex.js"},priority:25,intelligence:"medium"},"sequelize.config.js":{frameworks:["Sequelize"],slots:{database:"Sequelize",connection:"Sequelize"},priority:25,intelligence:"medium"},"alembic.ini":{frameworks:["Alembic"],slots:{database:"Alembic",mainLanguage:"Python"},priority:25,intelligence:"medium"},".github/workflows":{frameworks:["GitHub Actions"],slots:{cicd:"GitHub Actions"},priority:25,intelligence:"medium"},".gitlab-ci.yml":{frameworks:["GitLab CI"],slots:{cicd:"GitLab CI"},priority:25,intelligence:"medium"},Jenkinsfile:{frameworks:["Jenkins"],slots:{cicd:"Jenkins"},priority:25,intelligence:"medium"},".circleci/config.yml":{frameworks:["CircleCI"],slots:{cicd:"CircleCI"},priority:25,intelligence:"medium"},".travis.yml":{frameworks:["Travis CI"],slots:{cicd:"Travis CI"},priority:25,intelligence:"medium"},"azure-pipelines.yml":{frameworks:["Azure DevOps"],slots:{cicd:"Azure DevOps"},priority:25,intelligence:"medium"},"bitbucket-pipelines.yml":{frameworks:["Bitbucket Pipelines"],slots:{cicd:"Bitbucket Pipelines"},priority:25,intelligence:"medium"},"tailwind.config.js":{frameworks:["Tailwind CSS"],slots:{cssFramework:"Tailwind CSS"},priority:20,intelligence:"medium"},"tailwind.config.ts":{frameworks:["Tailwind CSS"],slots:{cssFramework:"Tailwind CSS",mainLanguage:"TypeScript"},priority:20,intelligence:"medium"},"postcss.config.js":{frameworks:["PostCSS"],slots:{cssFramework:"PostCSS"},priority:20,intelligence:"medium"},"uno.config.ts":{frameworks:["UnoCSS"],slots:{cssFramework:"UnoCSS",mainLanguage:"TypeScript"},priority:20,intelligence:"medium"},"styled-components.config.js":{frameworks:["styled-components"],slots:{cssFramework:"styled-components",uiLibrary:"styled-components"},priority:20,intelligence:"medium"},"emotion.config.js":{frameworks:["Emotion"],slots:{cssFramework:"Emotion",uiLibrary:"Emotion"},priority:20,intelligence:"medium"},"metro.config.js":{frameworks:["React Native"],slots:{framework:"React Native",mainLanguage:"JavaScript"},priority:25,intelligence:"medium"},"expo.config.js":{frameworks:["Expo"],slots:{framework:"React Native",buildTool:"Expo"},priority:25,intelligence:"medium"},"app.json":{frameworks:["React Native","Expo"],slots:{framework:"React Native"},priority:20,intelligence:"medium",confirmWith:["expo"]},"capacitor.config.ts":{frameworks:["Capacitor"],slots:{framework:"Capacitor",mainLanguage:"TypeScript"},priority:25,intelligence:"medium"},"ionic.config.json":{frameworks:["Ionic"],slots:{framework:"Ionic",uiLibrary:"Ionic"},priority:25,intelligence:"medium"},"nx.json":{frameworks:["Nx"],slots:{buildTool:"Nx"},priority:25,intelligence:"medium"},"turbo.json":{frameworks:["Turborepo"],slots:{buildTool:"Turborepo"},priority:25,intelligence:"medium"},"lerna.json":{frameworks:["Lerna"],slots:{buildTool:"Lerna"},priority:25,intelligence:"medium"},"rush.json":{frameworks:["Rush"],slots:{buildTool:"Rush"},priority:25,intelligence:"medium"},"pnpm-workspace.yaml":{frameworks:["pnpm workspaces"],slots:{packageManager:"pnpm",buildTool:"pnpm workspaces"},priority:25,intelligence:"medium"},"*.svelte":{frameworks:["Svelte","SvelteKit"],slots:{framework:"Svelte"},priority:15,intelligence:"low"},"*.vue":{frameworks:["Vue"],slots:{framework:"Vue"},priority:15,intelligence:"low"},"*.jsx":{frameworks:["React"],slots:{framework:"React",mainLanguage:"JavaScript"},priority:15,intelligence:"low"},"*.ts":{frameworks:["TypeScript"],slots:{mainLanguage:"TypeScript"},priority:15,intelligence:"low"},"*.tsx":{frameworks:["React","TypeScript"],slots:{framework:"React",mainLanguage:"TypeScript"},priority:15,intelligence:"low"},"*.py":{frameworks:["Python"],slots:{mainLanguage:"Python"},priority:15,intelligence:"low"},"*.rb":{frameworks:["Ruby"],slots:{mainLanguage:"Ruby"},priority:15,intelligence:"low"},"*.php":{frameworks:["PHP"],slots:{mainLanguage:"PHP"},priority:15,intelligence:"low"},"*.java":{frameworks:["Java"],slots:{mainLanguage:"Java"},priority:15,intelligence:"low"},"*.kt":{frameworks:["Kotlin"],slots:{mainLanguage:"Kotlin"},priority:15,intelligence:"low"},"*.swift":{frameworks:["Swift"],slots:{mainLanguage:"Swift"},priority:15,intelligence:"low"},"*.go":{frameworks:["Go"],slots:{mainLanguage:"Go"},priority:15,intelligence:"low"},"*.rs":{frameworks:["Rust"],slots:{mainLanguage:"Rust"},priority:15,intelligence:"low"},"*.dart":{frameworks:["Flutter","Dart"],slots:{mainLanguage:"Dart"},priority:15,intelligence:"low"},"*.ex":{frameworks:["Elixir"],slots:{mainLanguage:"Elixir"},priority:15,intelligence:"low"},"*.exs":{frameworks:["Elixir"],slots:{mainLanguage:"Elixir"},priority:15,intelligence:"low"},"*.scala":{frameworks:["Scala"],slots:{mainLanguage:"Scala"},priority:15,intelligence:"low"},"*.clj":{frameworks:["Clojure"],slots:{mainLanguage:"Clojure"},priority:15,intelligence:"low"},"*.lua":{frameworks:["Lua"],slots:{mainLanguage:"Lua"},priority:15,intelligence:"low"},"*.r":{frameworks:["R"],slots:{mainLanguage:"R"},priority:15,intelligence:"low"},"*.R":{frameworks:["R"],slots:{mainLanguage:"R"},priority:15,intelligence:"low"},"*.jl":{frameworks:["Julia"],slots:{mainLanguage:"Julia"},priority:15,intelligence:"low"},"*.nim":{frameworks:["Nim"],slots:{mainLanguage:"Nim"},priority:15,intelligence:"low"},"*.zig":{frameworks:["Zig"],slots:{mainLanguage:"Zig"},priority:15,intelligence:"low"},"build.zig":{frameworks:["Zig"],slots:{packageManager:"Zig Package Manager",mainLanguage:"Zig",buildTool:"zig build",framework:"Zig",build:"zig build"},priority:35,intelligence:"ultra-high"},"openapi.json":{frameworks:["OpenAPI"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"openapi.yaml":{frameworks:["OpenAPI"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"swagger.json":{frameworks:["Swagger"],slots:{apiType:"REST API",backend:"API Server"},priority:30,intelligence:"high"},"graphql.schema":{frameworks:["GraphQL"],slots:{apiType:"GraphQL",backend:"GraphQL Server"},priority:30,intelligence:"high"},"schema.graphql":{frameworks:["GraphQL"],slots:{apiType:"GraphQL",backend:"GraphQL Server"},priority:30,intelligence:"high"},".graphqlconfig":{frameworks:["GraphQL"],slots:{apiType:"GraphQL"},priority:25,intelligence:"medium"},"redux.config.js":{frameworks:["Redux"],slots:{stateManagement:"Redux"},priority:20,intelligence:"medium"},"mobx.config.js":{frameworks:["MobX"],slots:{stateManagement:"MobX"},priority:20,intelligence:"medium"},"vuex.config.js":{frameworks:["Vuex"],slots:{stateManagement:"Vuex",framework:"Vue"},priority:20,intelligence:"medium"},"pinia.config.js":{frameworks:["Pinia"],slots:{stateManagement:"Pinia",framework:"Vue"},priority:20,intelligence:"medium"},"zustand.config.js":{frameworks:["Zustand"],slots:{stateManagement:"Zustand"},priority:20,intelligence:"medium"},".eslintrc.js":{frameworks:["ESLint"],slots:{},priority:15,intelligence:"low"},".eslintrc.json":{frameworks:["ESLint"],slots:{},priority:15,intelligence:"low"},".prettierrc":{frameworks:["Prettier"],slots:{},priority:15,intelligence:"low"},".prettierrc.json":{frameworks:["Prettier"],slots:{},priority:15,intelligence:"low"},"biome.json":{frameworks:["Biome"],slots:{},priority:15,intelligence:"low"},".editorconfig":{frameworks:["EditorConfig"],slots:{},priority:10,intelligence:"low"},"serverless.yml":{frameworks:["Serverless Framework"],slots:{hosting:"AWS Lambda/Azure/GCP",backend:"Serverless",apiType:"API Gateway"},priority:30,intelligence:"high"},"serverless.yaml":{frameworks:["Serverless Framework"],slots:{hosting:"AWS Lambda/Azure/GCP",backend:"Serverless",apiType:"API Gateway"},priority:30,intelligence:"high"},"sam.yaml":{frameworks:["AWS SAM"],slots:{hosting:"AWS Lambda",backend:"AWS SAM",cicd:"AWS SAM CLI"},priority:30,intelligence:"high"},"template.yaml":{frameworks:["AWS SAM","CloudFormation"],slots:{hosting:"AWS",backend:"AWS SAM/CloudFormation",cicd:"AWS"},priority:25,intelligence:"medium",confirmWith:["samconfig.toml"]},"amplify.yml":{frameworks:["AWS Amplify"],slots:{hosting:"AWS Amplify",backend:"AWS Amplify",cicd:"AWS Amplify"},priority:30,intelligence:"high"},Podfile:{frameworks:["CocoaPods","Swift"],slots:{packageManager:"CocoaPods",mainLanguage:"Swift/Objective-C"},priority:30,intelligence:"high"},"build.gradle.kts":{frameworks:["Kotlin","Gradle"],slots:{packageManager:"gradle",mainLanguage:"Kotlin",buildTool:"gradle"},priority:35,intelligence:"ultra-high"},"*.ipynb":{frameworks:["Jupyter","Python"],slots:{mainLanguage:"Python",framework:"Jupyter Notebook"},priority:30,intelligence:"high"},MLproject:{frameworks:["MLflow"],slots:{mainLanguage:"Python",framework:"MLflow",backend:"MLflow",cicd:"MLflow"},priority:30,intelligence:"high"},"dvc.yaml":{frameworks:["DVC","Data Version Control"],slots:{mainLanguage:"Python",framework:"DVC",cicd:"DVC Pipelines"},priority:30,intelligence:"high"},"dvc.lock":{frameworks:["DVC"],slots:{framework:"DVC"},priority:20,intelligence:"medium"},"wrangler.toml":{frameworks:["Cloudflare Workers","Cloudflare"],slots:{hosting:"Cloudflare Workers",backend:"Cloudflare Workers",runtime:"V8 Isolates"},priority:30,intelligence:"high"},"deno.json":{frameworks:["Deno"],slots:{runtime:"Deno",mainLanguage:"TypeScript",packageManager:"Deno"},priority:30,intelligence:"high"},"bun.lockb":{frameworks:["Bun"],slots:{runtime:"Bun",packageManager:"Bun",mainLanguage:"TypeScript/JavaScript"},priority:30,intelligence:"high"},"codecov.yml":{frameworks:["Codecov"],slots:{cicd:"Codecov"},priority:25,intelligence:"high"},"dependabot.yml":{frameworks:["Dependabot","GitHub"],slots:{cicd:"Dependabot"},priority:25,intelligence:"high"},"renovate.json":{frameworks:["Renovate"],slots:{cicd:"Renovate"},priority:25,intelligence:"high"},Makefile:{frameworks:["Make","GNU Make"],slots:{buildTool:"Make"},priority:30,intelligence:"high"},"CMakeLists.txt":{frameworks:["CMake","C","C++"],slots:{buildTool:"CMake",mainLanguage:"C/C++"},priority:30,intelligence:"high"},"meson.build":{frameworks:["Meson","C","C++"],slots:{buildTool:"Meson",mainLanguage:"C/C++"},priority:30,intelligence:"high"},"*.c":{frameworks:["C"],slots:{mainLanguage:"C"},priority:30,intelligence:"high"},"*.cpp":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:30,intelligence:"high"},"*.cc":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:30,intelligence:"high"},"*.cxx":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:25,intelligence:"high"},"*.h":{frameworks:["C","C++"],slots:{mainLanguage:"C/C++"},priority:25,intelligence:"high"},"*.hpp":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:25,intelligence:"high"},"*.hxx":{frameworks:["C++"],slots:{mainLanguage:"C++"},priority:20,intelligence:"medium"},".env":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.example":{frameworks:[],slots:{},priority:25,intelligence:"high"},".env.local":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.development":{frameworks:[],slots:{},priority:20,intelligence:"medium"},".env.production":{frameworks:[],slots:{},priority:20,intelligence:"medium"},"skaffold.yaml":{frameworks:["Skaffold","Kubernetes"],slots:{hosting:"Kubernetes",cicd:"Skaffold"},priority:30,intelligence:"high"},"Chart.yaml":{frameworks:["Helm","Kubernetes"],slots:{hosting:"Kubernetes",backend:"Helm"},priority:30,intelligence:"high"},"values.yaml":{frameworks:["Helm","Kubernetes"],slots:{hosting:"Kubernetes"},priority:25,intelligence:"high",confirmWith:["Chart.yaml"]},"pulumi.yaml":{frameworks:["Pulumi"],slots:{hosting:"Cloud",cicd:"Pulumi"},priority:30,intelligence:"high"},"Pulumi.yaml":{frameworks:["Pulumi"],slots:{hosting:"Cloud",cicd:"Pulumi"},priority:30,intelligence:"high"},"terragrunt.hcl":{frameworks:["Terragrunt","Terraform"],slots:{hosting:"Cloud",cicd:"Terragrunt"},priority:30,intelligence:"high"},"ansible.yml":{frameworks:["Ansible"],slots:{cicd:"Ansible"},priority:30,intelligence:"high"},"playbook.yml":{frameworks:["Ansible"],slots:{cicd:"Ansible"},priority:25,intelligence:"high"},"*.cs":{frameworks:["C#",".NET","Unity"],slots:{mainLanguage:"C#"},priority:30,intelligence:"high"},"*.m":{frameworks:["Objective-C","iOS"],slots:{mainLanguage:"Objective-C"},priority:25,intelligence:"high"},".nvmrc":{frameworks:["Node.js","nvm"],slots:{runtime:"Node.js"},priority:25,intelligence:"high"},".tool-versions":{frameworks:["asdf"],slots:{},priority:25,intelligence:"high"},".ruby-version":{frameworks:["Ruby","rbenv"],slots:{mainLanguage:"Ruby",runtime:"Ruby"},priority:25,intelligence:"high"},".python-version":{frameworks:["Python","pyenv"],slots:{mainLanguage:"Python",runtime:"Python"},priority:25,intelligence:"high"},".dockerignore":{frameworks:["Docker"],slots:{},priority:20,intelligence:"medium"},".gitattributes":{frameworks:["Git"],slots:{},priority:15,intelligence:"low"},".npmrc":{frameworks:["npm","Node.js"],slots:{packageManager:"npm"},priority:20,intelligence:"medium"},"sonar-project.properties":{frameworks:["SonarQube","SonarCloud"],slots:{cicd:"SonarQube"},priority:25,intelligence:"high"},"*.fs":{frameworks:["F#",".NET"],slots:{mainLanguage:"F#"},priority:25,intelligence:"high"},"*.mm":{frameworks:["Objective-C++","iOS","macOS"],slots:{mainLanguage:"Objective-C++"},priority:25,intelligence:"high"},"build.zig.zon":{frameworks:["Zig"],slots:{mainLanguage:"Zig",packageManager:"Zig Package Manager",buildTool:"zig build"},priority:35,intelligence:"ultra-high"},"gleam.toml":{frameworks:["Gleam","BEAM","Erlang"],slots:{mainLanguage:"Gleam",runtime:"BEAM",packageManager:"Gleam"},priority:30,intelligence:"high"},"bunfig.toml":{frameworks:["Bun"],slots:{runtime:"Bun",packageManager:"Bun",buildTool:"Bun"},priority:30,intelligence:"high"},"mise.toml":{frameworks:["mise"],slots:{},priority:25,intelligence:"high"},".mise.toml":{frameworks:["mise"],slots:{},priority:25,intelligence:"high"},"manifest.toml":{frameworks:["Flox","Nix"],slots:{},priority:25,intelligence:"high",confirmWith:[".flox"]},justfile:{frameworks:["Just"],slots:{buildTool:"Just"},priority:25,intelligence:"high"},".pre-commit-config.yaml":{frameworks:["pre-commit"],slots:{cicd:"pre-commit"},priority:25,intelligence:"high"},"CLAUDE.md":{frameworks:["Claude Code"],slots:{},priority:30,intelligence:"high",confirmWith:[".claude"]}};import{existsSync as aZ,readFileSync as eq,readdirSync as $Y}from"fs";import{join as E8}from"path";var n0={version:2,_doc:"SINGLE SOURCE of Dart/Flutter detection KNOWLEDGE (A+B hybrid, the Truth-is-faf-cli spec). faf-cli imports this directly; faf-python-sdk vendors a synced copy (phase 2); MCPs compose it. Bolster Dart/Flutter by editing THIS file. Logic stays in dart.ts. Refreshed 2026-08-01 (knowledge v2) — community receipt on top of 6.13.0 Dart Edition.",flutterDeps:["flutter"],mcpDeps:["dart_mcp","mcp_server","mcp_dart","dart_mcp_server","mcp","dart_mcpserver"],serverFrameworks:[["serverpod","Serverpod"],["dart_frog","Dart Frog"],["conduit","Conduit"],["angel3_framework","Angel3"],["alfred","Alfred"],["shelf","Shelf"],["jaspr","Jaspr"],["relic","Relic"]],stateManagement:[["flutter_riverpod","Riverpod"],["hooks_riverpod","Riverpod"],["riverpod_annotation","Riverpod"],["riverpod","Riverpod"],["flutter_bloc","Bloc"],["bloc","Bloc"],["provider","Provider"],["get","GetX"],["flutter_mobx","MobX"],["mobx","MobX"],["signals","Signals"],["flutter_hooks","Hooks"]],routing:[["go_router","go_router"],["auto_route","auto_route"],["beamer","Beamer"],["routemaster","Routemaster"]]};var ZY=n0.flutterDeps,QY=n0.mcpDeps,XY=n0.serverFrameworks,zY=n0.stateManagement,JY=n0.routing;function HY($){let Z=new Set,Q=!1;for(let X of $.split(`
|
|
215
215
|
`)){if(/^(dependencies|dev_dependencies|dependency_overrides):\s*$/.test(X)){Q=!0;continue}if(/^\S/.test(X))Q=!1;if(Q){let z=X.match(/^\s{2}([a-zA-Z0-9_]+):/);if(z)Z.add(z[1].toLowerCase())}}return Z}function m2($){let Z=E8($,"pubspec.yaml");if(!aZ(Z))return null;let Q;try{Q=eq(Z,"utf-8")}catch{return null}let X=HY(Q),z=(N)=>X.has(N.toLowerCase()),J=ZY.some(z)||/^flutter:\s*$/m.test(Q)||/\bsdk:\s*flutter\b/.test(Q),H=QY.find(z),U=XY.find(([N])=>z(N)),q=zY.find(([N])=>z(N)),Y=q?q[1]:"",B=JY.find(([N])=>z(N)),G=B?B[1]:"",V=z("flutter_test")?"flutter_test":z("test")?"test":"",_=/^executables:\s*$/m.test(Q),D=!1;try{D=$Y(E8($,"bin")).some((N)=>N.endsWith(".dart"))}catch{}let W=_||D,O,I="",R;if(J)if(I="Flutter",aZ(E8($,"lib","main.dart"))||/^publish_to:\s*['"]?none\b/m.test(Q))O="mobile",R="pubspec.yaml (Flutter app)";else O="library",R="pubspec.yaml (Flutter package)";else if(H)O="mcp",R=`pubspec.yaml + ${H} (Dart MCP server)`;else if(U)O="backend",I=U[1],R=`pubspec.yaml + ${U[0]} (Dart backend)`;else if(W)O="cli",R=_?"pubspec.yaml executables: (Dart CLI)":"pubspec.yaml + bin/*.dart (Dart CLI)";else O="library",R="pubspec.yaml (Dart package)";return{appType:O,isFlutter:J,framework:I,stateManagement:Y,routing:G,testing:V,found:R}}import{existsSync as S8,readFileSync as oZ,readdirSync as nZ,statSync as qY}from"fs";import{join as p2}from"path";var l2={version:1,_doc:"SINGLE SOURCE of Go detection KNOWLEDGE (A+B hybrid, Truth-is-faf-cli). faf-cli imports this directly; SDKs/MCPs compose it. Bolster Go by editing THIS file. Logic stays in go.ts. Content-aware: go.mod ≠ one bucket — backend · CLI · MCP · library. 2026-08-01 initial (Dart composition pattern).",mcpModules:["github.com/mark3labs/mcp-go","github.com/modelcontextprotocol/go-sdk","github.com/metoro-io/mcp-golang","github.com/ThinkInAIXYZ/go-mcp"],serverFrameworks:[["github.com/gin-gonic/gin","Gin"],["github.com/labstack/echo","Echo"],["github.com/labstack/echo/v4","Echo"],["github.com/gofiber/fiber","Fiber"],["github.com/gofiber/fiber/v2","Fiber"],["github.com/go-chi/chi","Chi"],["github.com/go-chi/chi/v5","Chi"],["github.com/gorilla/mux","Gorilla Mux"],["github.com/gofiber/fiber/v3","Fiber"],["google.golang.org/grpc","gRPC"],["connectrpc.com/connect","Connect"],["github.com/go-kratos/kratos","Kratos"],["github.com/go-kratos/kratos/v2","Kratos"],["github.com/zeromicro/go-zero","go-zero"],["github.com/cloudwego/hertz","Hertz"]],cliFrameworks:[["github.com/spf13/cobra","Cobra"],["github.com/urfave/cli","urfave/cli"],["github.com/urfave/cli/v2","urfave/cli"],["github.com/alecthomas/kingpin","Kingpin"],["github.com/alecthomas/kong","Kong"]]};var YY=l2.mcpModules,BY=l2.serverFrameworks,GY=l2.cliFrameworks;function VY($){let Z=new Set,Q=!1;for(let X of $.split(`
|
|
216
|
-
`)){let z=X.replace(/\/\/.*$/,"").trim();if(!z)continue;if(/^require\s*\(\s*$/.test(z)){Q=!0;continue}if(Q){if(z===")"){Q=!1;continue}let H=z.match(/^(\S+)/);if(H)Z.add(H[1].toLowerCase());continue}let J=z.match(/^require\s+(\S+)/);if(J&&J[1]!=="(")Z.add(J[1].toLowerCase())}return Z}function tZ($,Z){let Q=Z.toLowerCase();for(let X of $)if(X===Q||X.startsWith(`${Q}/`))return!0;return!1}function sZ($,Z){let Q;for(let X of Z){if(!tZ($,X[0]))continue;if(!Q||X[0].length>Q[0].length)Q=X}return Q}function WY($,Z){let Q;for(let X of Z){if(!tZ($,X))continue;if(!Q||X.length>Q.length)Q=X}return Q}function _Y($){let Z=$.match(/^module\s+(\S+)/m);return Z?Z[1]:""}function OY($){let Z=p2($,"cmd");if(!S8(Z))return!1;try{for(let Q of nZ(Z)){let X=p2(Z,Q);try{if(qY(X).isDirectory()){if(nZ(X).some((J)=>J.endsWith(".go")))return!0}else if(Q.endsWith(".go"))return!0}catch{}}}catch{}return!1}function DY($){let Z=p2($,"main.go");if(!S8(Z))return!1;try{let Q=oZ(Z,"utf-8");return/^package\s+main\b/m.test(Q)}catch{return!1}}function d2($){let Z=p2($,"go.mod");if(!S8(Z))return null;let Q;try{Q=oZ(Z,"utf-8")}catch{return null}let X=_Y(Q),z=VY(Q),J=WY(z,YY),H=sZ(z,BY),U=sZ(z,GY),q=OY($),Y=DY($),B,G="",V;if(J)B="mcp",V=`go.mod + ${J} (Go MCP server)`;else if(H)B="backend",G=H[1],V=`go.mod + ${H[0]} (Go backend)`;else if(U)B="cli",G=U[1],V=`go.mod + ${U[0]} (Go CLI)`;else if(q)B="cli",V="go.mod + cmd/ (Go CLI layout)";else if(Y&&!H)B="cli",V="go.mod + main.go package main (Go CLI)";else B="library",V="go.mod (Go module)";return{appType:B,modulePath:X,framework:G,found:V}}import{existsSync as KY,readFileSync as MY,readdirSync as LY}from"fs";import{join as RY}from"path";var C0={version:1,_doc:"SINGLE SOURCE of C# /.NET detection KNOWLEDGE (Truth-is-faf-cli). faf-cli imports this; SDKs/MCPs compose it. Bolster C# by editing THIS file. Logic stays in csharp.ts. Content-aware: .csproj alone ≠ type — Sdk first, then props/packages. Kill line: .csproj alone ≠ type. 2026-08-01 initial.",mcpPackages:["ModelContextProtocol","ModelContextProtocol.AspNetCore","ModelContextProtocol.Core","ModelContextProtocol.Extensions.Tasks","ModelContextProtocol.Extensions.Apps"],cliPackages:[["System.CommandLine","System.CommandLine"],["Spectre.Console.Cli","Spectre.Console"],["Spectre.Console","Spectre.Console"],["McMaster.Extensions.CommandLineUtils","McMaster"]],testPackages:[["Microsoft.NET.Test.Sdk","VSTest"],["xunit.v3","xUnit"],["xunit","xUnit"],["NUnit","NUnit"],["MSTest.TestFramework","MSTest"],["MSTest","MSTest"]],grpcServerPackages:["Grpc.AspNetCore"],specializedSdks:[["Microsoft.NET.Sdk.Web","web","ASP.NET Core"],["Microsoft.NET.Sdk.Worker","worker","Worker"],["Microsoft.NET.Sdk.BlazorWebAssembly","blazor-wasm","Blazor WebAssembly"],["Microsoft.NET.Sdk.Razor","razor-lib","Razor Class Library"],["MSTest.Sdk","test","MSTest"],["Aspire.AppHost.Sdk","aspire","Aspire AppHost"]],baseSdk:"Microsoft.NET.Sdk"};var FY=C0.mcpPackages.map(($)=>$.toLowerCase()),NY=C0.cliPackages.map(([$,Z])=>[$.toLowerCase(),Z]),AY=C0.testPackages.map(([$,Z])=>[$.toLowerCase(),Z]),PY=C0.grpcServerPackages.map(($)=>$.toLowerCase()),TY=C0.specializedSdks,eZ=C0.baseSdk.toLowerCase();function CY($){let Z=$.match(/<Project\b[^>]*\bSdk\s*=\s*"([^"/]+)(?:\/[^"]*)?"/i),Q=$.match(/<Sdk\b[^>]*\bName\s*=\s*"([^"]+)"/i),X=(Z?.[1]||Q?.[1]||"").trim(),z=($.match(/<OutputType>\s*([^<]+?)\s*<\/OutputType>/i)?.[1]||"").trim(),J=$.match(/<TargetFramework>\s*([^<]+?)\s*<\/TargetFramework>/i)?.[1],U=($.match(/<TargetFrameworks>\s*([^<]+?)\s*<\/TargetFrameworks>/i)?.[1]||J||"").trim(),q=/<IsTestProject>\s*true\s*<\/IsTestProject>/i.test($),Y=/<UseMaui>\s*true\s*<\/UseMaui>/i.test($),B=/<UseWPF>\s*true\s*<\/UseWPF>/i.test($),G=/<UseWindowsForms>\s*true\s*<\/UseWindowsForms>/i.test($),V=new Set;for(let D of $.matchAll(/<PackageReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi))V.add(D[1].toLowerCase());for(let D of $.matchAll(/<PackageReference\s+Include\s*=\s*"([^"]+)"/gi))V.add(D[1].toLowerCase());let _=new Set;for(let D of $.matchAll(/<FrameworkReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi))_.add(D[1].toLowerCase());return{sdk:X,outputType:z,targetFramework:U,isTestProject:q,useMaui:Y,useWpf:B,useWindowsForms:G,packages:V,frameworkRefs:_}}function j8($,Z){let Q=Z.toLowerCase();if($.has(Q))return!0;for(let X of $)if(X===Q||X.startsWith(`${Q}.`))return!0;return!1}function $4($,Z){let Q;for(let[X,z]of Z){if(!j8($,X))continue;if(!Q||X.length>Q[0].length)Q=[X,z]}return Q}function wY($){let Z;for(let Q of FY){if(!j8($,Q))continue;if(!Z||Q.length>Z.length)Z=Q}for(let Q of $)if(Q==="modelcontextprotocol"||Q.startsWith("modelcontextprotocol.")){if(!Z||Q.length>Z.length)Z=Q}return Z}function bY($){let Z=$.toLowerCase();if(!Z)return;let Q;for(let X of TY){let z=X[0].toLowerCase();if(Z===z||Z.startsWith(`${z}/`)){if(!Q||z.length>Q[0].length)Q=X}}return Q}function c2($){let Z=$.toLowerCase();return Z==="exe"||Z==="winexe"}function EY($,Z){if($==="mcp")return 0;if($==="mobile")return 1;if($==="backend")return 2;if($==="cli")return 3;if(Z&&Z!=="")return 4;return 5}function SY($,Z){let Q=Z.replace(/\.csproj$/i,""),{sdk:X,packages:z,frameworkRefs:J,outputType:H}=$,U,q="",Y,B=wY(z),G=bY(X),V=$4(z,AY),_=$4(z,NY),D=PY.some((O)=>j8(z,O)),W=J.has("microsoft.aspnetcore.app");if(B)U="mcp",q="MCP",Y=`${Z} + ${B} (C# MCP server)`;else if($.isTestProject||G?.[1]==="test"||V)U="library",q=V?.[1]||(G?.[1]==="test"?G[2]:"Test"),Y=`${Z} + test (${q})`;else if($.useMaui)U="mobile",q="MAUI",Y=`${Z} + UseMaui (MAUI)`;else if($.useWpf||$.useWindowsForms)U="backend",q=$.useWpf&&$.useWindowsForms?"WPF+WinForms":$.useWpf?"WPF":"Windows Forms",Y=`${Z} + ${q}`;else if(G?.[1]==="web")U="backend",q=D?"gRPC":G[2],Y=`${Z} + Sdk=${G[0]}${D?" + Grpc.AspNetCore":""} (ASP.NET Core)`;else if(G?.[1]==="worker")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Worker)`;else if(G?.[1]==="blazor-wasm")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Blazor WASM)`;else if(G?.[1]==="aspire")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Aspire)`;else if(G?.[1]==="razor-lib")U="library",q=G[2],Y=`${Z} + Sdk=${G[0]} (Razor class library)`;else if(W&&c2(H))U="backend",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (host)`;else if(W&&!c2(H))U="library",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (web library)`;else if(_&&(c2(H)||!H))U="cli",q=_[1],Y=`${Z} + ${_[0]} (C# CLI)`;else if(c2(H))U="cli",Y=`${Z} + OutputType=Exe (C# console)`;else{U="library";let O=X?` Sdk=${X}`:"";if(Y=`${Z}${O} (C# class library)`.replace(" Sdk=Microsoft.NET.Sdk",""),!X||X.toLowerCase()===eZ||X.toLowerCase().startsWith(`${eZ}/`))Y=`${Z} (C# class library)`}return{appType:U,projectName:Q,targetFramework:$.targetFramework,sdk:X||"Microsoft.NET.Sdk",framework:q,found:Y}}function s0($){if(!KY($))return[];try{return LY($).filter((Z)=>Z.toLowerCase().endsWith(".csproj")).sort()}catch{return[]}}function i2($){let Z=s0($);if(Z.length===0)return null;let Q=null,X=999;for(let z of Z){let J=RY($,z),H;try{H=MY(J,"utf-8")}catch{continue}let U=CY(H),q=SY(U,z),Y=EY(q.appType,q.framework);if(!Q||Y<X)Q=q,X=Y}return Q}import{existsSync as w0,readFileSync as xY,readdirSync as gY,statSync as hY}from"fs";import{join as p}from"path";var a={version:1,_doc:"SINGLE SOURCE of JVM (Java/Kotlin) detection KNOWLEDGE (Truth-is-faf-cli). faf-cli imports this; SDKs/MCPs compose it. Bolster JVM by editing THIS file. Logic stays in jvm.ts. Kill line: pom / gradle alone ≠ type. Content-aware: plugins · parents · packaging · deps · version catalogs. One brand JVM — Android/KMP are facets, not a second Kotlin Edition. 2026-08-03 initial (post-intel).",mcpArtifacts:["io.modelcontextprotocol.sdk:mcp","io.modelcontextprotocol.sdk:mcp-core","io.modelcontextprotocol.sdk:mcp-spring-webflux","io.modelcontextprotocol.sdk:mcp-spring-webmvc","org.springframework.ai:spring-ai-starter-mcp-server","org.springframework.ai:spring-ai-starter-mcp-server-webmvc","org.springframework.ai:spring-ai-starter-mcp-server-webflux","org.springframework.ai:spring-ai-starter-mcp-client","org.springframework.ai:spring-ai-mcp-server-spring-boot-starter","org.springframework.ai:spring-ai-mcp-client-spring-boot-starter","io.modelcontextprotocol:kotlin-sdk","io.modelcontextprotocol.kotlin:mcp"],webPlugins:[["org.springframework.boot","Spring Boot"],["io.quarkus","Quarkus"],["io.quarkus.gradle.plugin","Quarkus"],["io.micronaut.application","Micronaut"],["io.micronaut.library","Micronaut"]],webParents:[["org.springframework.boot:spring-boot-starter-parent","Spring Boot"],["io.quarkus.platform:quarkus-bom","Quarkus"],["io.micronaut.platform:micronaut-parent","Micronaut"]],webArtifacts:[["org.springframework.boot:spring-boot-starter-web","Spring Boot"],["org.springframework.boot:spring-boot-starter-webflux","Spring Boot"],["org.springframework.boot:spring-boot-starter","Spring Boot"],["io.quarkus:quarkus-core","Quarkus"],["io.micronaut:micronaut-http-server-netty","Micronaut"],["io.ktor:ktor-server-core","Ktor"],["io.ktor:ktor-server-netty","Ktor"],["io.ktor:ktor-server-cio","Ktor"]],androidPlugins:["com.android.application","com.android.library","com.android.kotlin.multiplatform.library"],kmpPlugins:["org.jetbrains.kotlin.multiplatform","kotlin-multiplatform"],jvmKotlinPlugins:["org.jetbrains.kotlin.jvm","kotlin-jvm","org.jetbrains.kotlin.android","kotlin-android"],cliPlugins:[["org.gradle.application","application"],["application","application"]],cliArtifacts:[["info.picocli:picocli","Picocli"],["com.github.ajalt.clikt:clikt","Clikt"],["com.github.ajalt.clikt:clikt-jvm","Clikt"]],libraryPlugins:["java-library","org.gradle.java-library"]};var yY=a.mcpArtifacts.map(($)=>$.toLowerCase()),vY=a.webPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),fY=a.webParents.map(([$,Z])=>[$.toLowerCase(),Z]),kY=a.webArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),r_=a.androidPlugins.map(($)=>$.toLowerCase()),uY=a.kmpPlugins.map(($)=>$.toLowerCase()),mY=a.jvmKotlinPlugins.map(($)=>$.toLowerCase()),lY=a.cliPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),pY=a.cliArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),dY=a.libraryPlugins.map(($)=>$.toLowerCase()),cY=["pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts"];function x8($){return cY.some((Z)=>w0(p($,Z)))}function b1($){try{return xY($,"utf-8")}catch{return null}}function iY($){let Z=new Map,Q=new Map,X="";for(let z of $.split(`
|
|
216
|
+
`)){let z=X.replace(/\/\/.*$/,"").trim();if(!z)continue;if(/^require\s*\(\s*$/.test(z)){Q=!0;continue}if(Q){if(z===")"){Q=!1;continue}let H=z.match(/^(\S+)/);if(H)Z.add(H[1].toLowerCase());continue}let J=z.match(/^require\s+(\S+)/);if(J&&J[1]!=="(")Z.add(J[1].toLowerCase())}return Z}function tZ($,Z){let Q=Z.toLowerCase();for(let X of $)if(X===Q||X.startsWith(`${Q}/`))return!0;return!1}function sZ($,Z){let Q;for(let X of Z){if(!tZ($,X[0]))continue;if(!Q||X[0].length>Q[0].length)Q=X}return Q}function WY($,Z){let Q;for(let X of Z){if(!tZ($,X))continue;if(!Q||X.length>Q.length)Q=X}return Q}function _Y($){let Z=$.match(/^module\s+(\S+)/m);return Z?Z[1]:""}function OY($){let Z=p2($,"cmd");if(!S8(Z))return!1;try{for(let Q of nZ(Z)){let X=p2(Z,Q);try{if(qY(X).isDirectory()){if(nZ(X).some((J)=>J.endsWith(".go")))return!0}else if(Q.endsWith(".go"))return!0}catch{}}}catch{}return!1}function DY($){let Z=p2($,"main.go");if(!S8(Z))return!1;try{let Q=oZ(Z,"utf-8");return/^package\s+main\b/m.test(Q)}catch{return!1}}function d2($){let Z=p2($,"go.mod");if(!S8(Z))return null;let Q;try{Q=oZ(Z,"utf-8")}catch{return null}let X=_Y(Q),z=VY(Q),J=WY(z,YY),H=sZ(z,BY),U=sZ(z,GY),q=OY($),Y=DY($),B,G="",V;if(J)B="mcp",V=`go.mod + ${J} (Go MCP server)`;else if(H)B="backend",G=H[1],V=`go.mod + ${H[0]} (Go backend)`;else if(U)B="cli",G=U[1],V=`go.mod + ${U[0]} (Go CLI)`;else if(q)B="cli",V="go.mod + cmd/ (Go CLI layout)";else if(Y&&!H)B="cli",V="go.mod + main.go package main (Go CLI)";else B="library",V="go.mod (Go module)";return{appType:B,modulePath:X,framework:G,found:V}}import{existsSync as KY,readFileSync as MY,readdirSync as LY}from"fs";import{join as RY}from"path";var C0={version:1,_doc:"SINGLE SOURCE of C# /.NET detection KNOWLEDGE (Truth-is-faf-cli). faf-cli imports this; SDKs/MCPs compose it. Bolster C# by editing THIS file. Logic stays in csharp.ts. Content-aware: .csproj alone ≠ type — Sdk first, then props/packages. Kill line: .csproj alone ≠ type. 2026-08-01 initial.",mcpPackages:["ModelContextProtocol","ModelContextProtocol.AspNetCore","ModelContextProtocol.Core","ModelContextProtocol.Extensions.Tasks","ModelContextProtocol.Extensions.Apps"],cliPackages:[["System.CommandLine","System.CommandLine"],["Spectre.Console.Cli","Spectre.Console"],["Spectre.Console","Spectre.Console"],["McMaster.Extensions.CommandLineUtils","McMaster"]],testPackages:[["Microsoft.NET.Test.Sdk","VSTest"],["xunit.v3","xUnit"],["xunit","xUnit"],["NUnit","NUnit"],["MSTest.TestFramework","MSTest"],["MSTest","MSTest"]],grpcServerPackages:["Grpc.AspNetCore"],specializedSdks:[["Microsoft.NET.Sdk.Web","web","ASP.NET Core"],["Microsoft.NET.Sdk.Worker","worker","Worker"],["Microsoft.NET.Sdk.BlazorWebAssembly","blazor-wasm","Blazor WebAssembly"],["Microsoft.NET.Sdk.Razor","razor-lib","Razor Class Library"],["MSTest.Sdk","test","MSTest"],["Aspire.AppHost.Sdk","aspire","Aspire AppHost"]],baseSdk:"Microsoft.NET.Sdk"};var FY=C0.mcpPackages.map(($)=>$.toLowerCase()),NY=C0.cliPackages.map(([$,Z])=>[$.toLowerCase(),Z]),AY=C0.testPackages.map(([$,Z])=>[$.toLowerCase(),Z]),PY=C0.grpcServerPackages.map(($)=>$.toLowerCase()),TY=C0.specializedSdks,eZ=C0.baseSdk.toLowerCase();function CY($){let Z=$.match(/<Project\b[^>]*\bSdk\s*=\s*"([^"/]+)(?:\/[^"]*)?"/i),Q=$.match(/<Sdk\b[^>]*\bName\s*=\s*"([^"]+)"/i),X=(Z?.[1]||Q?.[1]||"").trim(),z=($.match(/<OutputType>\s*([^<]+?)\s*<\/OutputType>/i)?.[1]||"").trim(),J=$.match(/<TargetFramework>\s*([^<]+?)\s*<\/TargetFramework>/i)?.[1],U=($.match(/<TargetFrameworks>\s*([^<]+?)\s*<\/TargetFrameworks>/i)?.[1]||J||"").trim(),q=/<IsTestProject>\s*true\s*<\/IsTestProject>/i.test($),Y=/<UseMaui>\s*true\s*<\/UseMaui>/i.test($),B=/<UseWPF>\s*true\s*<\/UseWPF>/i.test($),G=/<UseWindowsForms>\s*true\s*<\/UseWindowsForms>/i.test($),V=new Set;for(let D of $.matchAll(/<PackageReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi))V.add(D[1].toLowerCase());for(let D of $.matchAll(/<PackageReference\s+Include\s*=\s*"([^"]+)"/gi))V.add(D[1].toLowerCase());let _=new Set;for(let D of $.matchAll(/<FrameworkReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi))_.add(D[1].toLowerCase());return{sdk:X,outputType:z,targetFramework:U,isTestProject:q,useMaui:Y,useWpf:B,useWindowsForms:G,packages:V,frameworkRefs:_}}function j8($,Z){let Q=Z.toLowerCase();if($.has(Q))return!0;for(let X of $)if(X===Q||X.startsWith(`${Q}.`))return!0;return!1}function $4($,Z){let Q;for(let[X,z]of Z){if(!j8($,X))continue;if(!Q||X.length>Q[0].length)Q=[X,z]}return Q}function wY($){let Z;for(let Q of FY){if(!j8($,Q))continue;if(!Z||Q.length>Z.length)Z=Q}for(let Q of $)if(Q==="modelcontextprotocol"||Q.startsWith("modelcontextprotocol.")){if(!Z||Q.length>Z.length)Z=Q}return Z}function bY($){let Z=$.toLowerCase();if(!Z)return;let Q;for(let X of TY){let z=X[0].toLowerCase();if(Z===z||Z.startsWith(`${z}/`)){if(!Q||z.length>Q[0].length)Q=X}}return Q}function c2($){let Z=$.toLowerCase();return Z==="exe"||Z==="winexe"}function EY($,Z){if($==="mcp")return 0;if($==="mobile")return 1;if($==="backend")return 2;if($==="cli")return 3;if(Z&&Z!=="")return 4;return 5}function SY($,Z){let Q=Z.replace(/\.csproj$/i,""),{sdk:X,packages:z,frameworkRefs:J,outputType:H}=$,U,q="",Y,B=wY(z),G=bY(X),V=$4(z,AY),_=$4(z,NY),D=PY.some((O)=>j8(z,O)),W=J.has("microsoft.aspnetcore.app");if(B)U="mcp",q="MCP",Y=`${Z} + ${B} (C# MCP server)`;else if($.isTestProject||G?.[1]==="test"||V)U="library",q=V?.[1]||(G?.[1]==="test"?G[2]:"Test"),Y=`${Z} + test (${q})`;else if($.useMaui)U="mobile",q="MAUI",Y=`${Z} + UseMaui (MAUI)`;else if($.useWpf||$.useWindowsForms)U="backend",q=$.useWpf&&$.useWindowsForms?"WPF+WinForms":$.useWpf?"WPF":"Windows Forms",Y=`${Z} + ${q}`;else if(G?.[1]==="web")U="backend",q=D?"gRPC":G[2],Y=`${Z} + Sdk=${G[0]}${D?" + Grpc.AspNetCore":""} (ASP.NET Core)`;else if(G?.[1]==="worker")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Worker)`;else if(G?.[1]==="blazor-wasm")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Blazor WASM)`;else if(G?.[1]==="aspire")U="backend",q=G[2],Y=`${Z} + Sdk=${G[0]} (Aspire)`;else if(G?.[1]==="razor-lib")U="library",q=G[2],Y=`${Z} + Sdk=${G[0]} (Razor class library)`;else if(W&&c2(H))U="backend",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (host)`;else if(W&&!c2(H))U="library",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (web library)`;else if(_&&(c2(H)||!H))U="cli",q=_[1],Y=`${Z} + ${_[0]} (C# CLI)`;else if(c2(H))U="cli",Y=`${Z} + OutputType=Exe (C# console)`;else{U="library";let O=X?` Sdk=${X}`:"";if(Y=`${Z}${O} (C# class library)`.replace(" Sdk=Microsoft.NET.Sdk",""),!X||X.toLowerCase()===eZ||X.toLowerCase().startsWith(`${eZ}/`))Y=`${Z} (C# class library)`}return{appType:U,projectName:Q,targetFramework:$.targetFramework,sdk:X||"Microsoft.NET.Sdk",framework:q,found:Y}}function s0($){if(!KY($))return[];try{return LY($).filter((Z)=>Z.toLowerCase().endsWith(".csproj")).sort()}catch{return[]}}function i2($){let Z=s0($);if(Z.length===0)return null;let Q=null,X=999;for(let z of Z){let J=RY($,z),H;try{H=MY(J,"utf-8")}catch{continue}let U=CY(H),q=SY(U,z),Y=EY(q.appType,q.framework);if(!Q||Y<X)Q=q,X=Y}return Q}import{existsSync as w0,readFileSync as xY,readdirSync as gY,statSync as hY}from"fs";import{join as p}from"path";var a={version:1,_doc:"SINGLE SOURCE of JVM (Java/Kotlin) detection KNOWLEDGE (Truth-is-faf-cli). faf-cli imports this; SDKs/MCPs compose it. Bolster JVM by editing THIS file. Logic stays in jvm.ts. Kill line: pom / gradle alone ≠ type. Content-aware: plugins · parents · packaging · deps · version catalogs. One brand JVM — Android/KMP are facets, not a second Kotlin Edition. 2026-08-03 initial (post-intel).",mcpArtifacts:["io.modelcontextprotocol.sdk:mcp","io.modelcontextprotocol.sdk:mcp-core","io.modelcontextprotocol.sdk:mcp-spring-webflux","io.modelcontextprotocol.sdk:mcp-spring-webmvc","org.springframework.ai:spring-ai-starter-mcp-server","org.springframework.ai:spring-ai-starter-mcp-server-webmvc","org.springframework.ai:spring-ai-starter-mcp-server-webflux","org.springframework.ai:spring-ai-starter-mcp-client","org.springframework.ai:spring-ai-mcp-server-spring-boot-starter","org.springframework.ai:spring-ai-mcp-client-spring-boot-starter","io.modelcontextprotocol:kotlin-sdk","io.modelcontextprotocol.kotlin:mcp"],webPlugins:[["org.springframework.boot","Spring Boot"],["io.quarkus","Quarkus"],["io.quarkus.gradle.plugin","Quarkus"],["io.micronaut.application","Micronaut"],["io.micronaut.library","Micronaut"]],webParents:[["org.springframework.boot:spring-boot-starter-parent","Spring Boot"],["io.quarkus.platform:quarkus-bom","Quarkus"],["io.micronaut.platform:micronaut-parent","Micronaut"]],webArtifacts:[["org.springframework.boot:spring-boot-starter-web","Spring Boot"],["org.springframework.boot:spring-boot-starter-webflux","Spring Boot"],["org.springframework.boot:spring-boot-starter","Spring Boot"],["io.quarkus:quarkus-core","Quarkus"],["io.micronaut:micronaut-http-server-netty","Micronaut"],["io.ktor:ktor-server-core","Ktor"],["io.ktor:ktor-server-netty","Ktor"],["io.ktor:ktor-server-cio","Ktor"]],androidPlugins:["com.android.application","com.android.library","com.android.kotlin.multiplatform.library"],kmpPlugins:["org.jetbrains.kotlin.multiplatform","kotlin-multiplatform"],jvmKotlinPlugins:["org.jetbrains.kotlin.jvm","kotlin-jvm","org.jetbrains.kotlin.android","kotlin-android"],cliPlugins:[["org.gradle.application","application"],["application","application"]],cliArtifacts:[["info.picocli:picocli","Picocli"],["com.github.ajalt.clikt:clikt","Clikt"],["com.github.ajalt.clikt:clikt-jvm","Clikt"]],libraryPlugins:["java-library","org.gradle.java-library"]};var yY=a.mcpArtifacts.map(($)=>$.toLowerCase()),vY=a.webPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),fY=a.webParents.map(([$,Z])=>[$.toLowerCase(),Z]),kY=a.webArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),a_=a.androidPlugins.map(($)=>$.toLowerCase()),uY=a.kmpPlugins.map(($)=>$.toLowerCase()),mY=a.jvmKotlinPlugins.map(($)=>$.toLowerCase()),lY=a.cliPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),pY=a.cliArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),dY=a.libraryPlugins.map(($)=>$.toLowerCase()),cY=["pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts"];function x8($){return cY.some((Z)=>w0(p($,Z)))}function b1($){try{return xY($,"utf-8")}catch{return null}}function iY($){let Z=new Map,Q=new Map,X="";for(let z of $.split(`
|
|
217
217
|
`)){let J=z.replace(/#.*$/,"").trim();if(!J)continue;let H=J.match(/^\[([^\]]+)\]$/);if(H){X=H[1].trim().toLowerCase();continue}let U=J.match(/^([A-Za-z0-9_.-]+)\s*=\s*\{[^}]*\bid\s*=\s*"([^"]+)"/);if(U&&(X==="plugins"||X.endsWith(".plugins"))){Z.set(U[1].replace(/-/g,".").toLowerCase(),U[2].toLowerCase()),Z.set(U[1].toLowerCase(),U[2].toLowerCase());continue}let q=J.match(/^([A-Za-z0-9_.-]+)\s*=\s*\{[^}]*\bmodule\s*=\s*"([^"]+)"/);if(q&&(X==="libraries"||X.endsWith(".libraries"))){let G=q[1].toLowerCase();Q.set(G,q[2].toLowerCase()),Q.set(G.replace(/-/g,"."),q[2].toLowerCase());continue}let Y=J.match(/^([A-Za-z0-9_.-]+)\s*=\s*\{[^}]*\bgroup\s*=\s*"([^"]+)"[^}]*\bname\s*=\s*"([^"]+)"/);if(Y&&(X==="libraries"||X.endsWith(".libraries"))){let G=`${Y[2]}:${Y[3]}`.toLowerCase(),V=Y[1].toLowerCase();Q.set(V,G),Q.set(V.replace(/-/g,"."),G);continue}let B=J.match(/^([A-Za-z0-9_.-]+)\s*=\s*"([^"]+)"/);if(B){let G=B[1].toLowerCase(),V=B[2];if(X==="plugins"||X.endsWith(".plugins")){let _=V.split(":")[0].toLowerCase();Z.set(G,_),Z.set(G.replace(/-/g,"."),_)}else if(X==="libraries"||X.endsWith(".libraries")){let _=V.split(":");if(_.length>=2){let D=`${_[0]}:${_[1]}`.toLowerCase();Q.set(G,D),Q.set(G.replace(/-/g,"."),D)}}}}return{plugins:Z,libraries:Q}}function rY($){let Z=p($,"gradle","libs.versions.toml");if(!w0(Z))return{plugins:new Map,libraries:new Map};let Q=b1(Z);if(!Q)return{plugins:new Map,libraries:new Map};return iY(Q)}function aY($){let Z=[];for(let Q of $.matchAll(/include\s*\(\s*([^)]+)\)/g))for(let X of Q[1].split(",")){let z=X.replace(/['":\s]/g,"").replace(/^:/,"");if(z)Z.push(z.replace(/:/g,"/"))}for(let Q of $.matchAll(/include\s+((?:['"][^'"]+['"]\s*,?\s*)+)/g))for(let X of Q[1].split(",")){let z=X.replace(/['":\s]/g,"").replace(/^:/,"");if(z)Z.push(z.replace(/:/g,"/"))}for(let Q of $.matchAll(/project\s*\(\s*["']:([^"']+)["']\s*\)\s*\.projectDir\s*=\s*file\s*\(\s*["']([^"']+)["']\s*\)/g))Z.push(Q[2].replace(/^\.\//,""));return[...new Set(Z)]}function nY($,Z){let Q=new Set;for(let X of $.matchAll(/\bid\s*\(\s*["']([^"']+)["']\s*\)/g))Q.add(X[1].toLowerCase());for(let X of $.matchAll(/\bid\s+['"]([^'"]+)['"]/g))Q.add(X[1].toLowerCase());for(let X of $.matchAll(/plugins\s*\{([\s\S]*?)\}/g))for(let z of X[1].split(/[\n;]/)){let J=z.replace(/\/\/.*$/,"").trim();if(!J||J.startsWith("id")||J.startsWith("kotlin")||J.startsWith("alias"))continue;let H=J.match(/^`([a-zA-Z0-9.-]+)`$/)||J.match(/^([a-zA-Z][a-zA-Z0-9.-]*)$/);if(H)Q.add(H[1].toLowerCase())}for(let X of $.matchAll(/\bkotlin\s*\(\s*["']([^"']+)["']\s*\)/g)){let z=X[1].toLowerCase();if(z==="jvm")Q.add("org.jetbrains.kotlin.jvm");else if(z==="multiplatform")Q.add("org.jetbrains.kotlin.multiplatform");else if(z==="android")Q.add("org.jetbrains.kotlin.android");else Q.add(`org.jetbrains.kotlin.${z}`)}for(let X of $.matchAll(/libs\.plugins\.([A-Za-z0-9_.]+)/g)){let z=X[1].toLowerCase(),J=Z.plugins.get(z)||Z.plugins.get(z.replace(/\./g,"-"))||Z.plugins.get(z.replace(/-/g,"."));if(J)Q.add(J);else if(z.includes("spring")&&z.includes("boot"))Q.add("org.springframework.boot")}for(let X of $.matchAll(/apply\s+plugin\s*:\s*['"]([^'"]+)['"]/g))Q.add(X[1].toLowerCase());return Q}function sY($,Z){let Q=new Set;for(let X of $.matchAll(/["']([A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)(?::[^"']+)?["']/g))Q.add(X[1].toLowerCase());for(let X of $.matchAll(/libs\.([A-Za-z0-9_.]+)/g)){let z=X[1].toLowerCase();if(z.startsWith("plugins."))continue;let J=[z,z.replace(/\./g,"-"),z.replace(/-/g,".")];for(let H of J){let U=Z.libraries.get(H);if(U){Q.add(U.includes(":")?U.split(":").slice(0,2).join(":"):U);break}}}return Q}function X4($){let Z=($.match(/<packaging>\s*([^<]+?)\s*<\/packaging>/i)?.[1]||"jar").trim().toLowerCase(),Q=new Set,X=$.match(/<parent>([\s\S]*?)<\/parent>/i);if(X){let H=X[1].match(/<groupId>\s*([^<]+?)\s*<\/groupId>/i)?.[1]?.trim(),U=X[1].match(/<artifactId>\s*([^<]+?)\s*<\/artifactId>/i)?.[1]?.trim();if(H&&U)Q.add(`${H}:${U}`.toLowerCase())}let z=new Set;for(let H of $.matchAll(/<dependency>([\s\S]*?)<\/dependency>/gi)){let U=H[1].match(/<groupId>\s*([^<]+?)\s*<\/groupId>/i)?.[1]?.trim(),q=H[1].match(/<artifactId>\s*([^<]+?)\s*<\/artifactId>/i)?.[1]?.trim();if(U&&q)z.add(`${U}:${q}`.toLowerCase())}let J=[];for(let H of $.matchAll(/<module>\s*([^<]+?)\s*<\/module>/gi))J.push(H[1].trim());return{packaging:Z,parents:Q,artifacts:z,modules:J}}function z0($,Z){let Q=Z.toLowerCase();if($.has(Q))return!0;for(let X of $)if(X===Q||X.endsWith(`.${Q}`)||X===Q.replace(/^org\.gradle\./,""))return!0;return!1}function w1($,Z,Q){let X;for(let[z,J]of Z){let H=!1;if(Q==="plugin")H=z0($,z);else if(H=$.has(z)||[...$].some((U)=>U===z||U.startsWith(`${z}:`)||U.startsWith(`${z}.`)),!H&&Q==="artifact")H=[...$].some((U)=>U===z||U.startsWith(`${z}`));if(!H)continue;if(!X||z.length>X[0].length)X=[z,J]}return X}function oY($){let Z;for(let Q of yY)for(let X of $){if(X===Q||X.startsWith(`${Q}:`)||X.startsWith(Q.replace(/:mcp$/,":"))){if(!Z||Q.length>Z.length)Z=Q}if(X.startsWith("io.modelcontextprotocol")||X.includes("spring-ai-starter-mcp")||X.includes("spring-ai-mcp")){if(!Z||X.length>Z.length)Z=X}}return Z}function z4($){let Z=new Set,Q=!1,X=!1,z=[p($,"src"),p($,"src","main")],J=(H,U)=>{if(U>4||!w0(H))return;let q;try{q=gY(H)}catch{return}for(let Y of q){if(Y==="androidMain"||Y==="commonMain"||Y==="jvmMain"||Y==="iosMain")Z.add(Y);let B=p(H,Y);try{if(hY(B).isDirectory())J(B,U+1);else if(Y.endsWith(".kt")||Y.endsWith(".kts"))Q=!0;else if(Y.endsWith(".java"))X=!0}catch{}}};for(let H of z)J(H,0);return{kotlin:Q,java:X,hints:Z}}function tY($){let Z=[],Q=$.plugins,X=$.artifacts,z=uY.some((P)=>z0(Q,P))||$.sourceHints.has("commonMain"),J=z0(Q,"com.android.application"),H=z0(Q,"com.android.library")||z0(Q,"com.android.kotlin.multiplatform.library");if(J||H)Z.push("android");if(z)Z.push("multiplatform");let U=oY(X),q=w1(Q,vY,"plugin"),Y=w1($.parents,fY,"parent"),B=w1(X,kY,"artifact"),G=w1(Q,lY,"plugin"),V=w1(X,pY,"artifact"),_=dY.some((P)=>z0(Q,P)),D=$.packaging==="pom",W,O="",I;if(J)W="mobile",O=z?"Android+KMP":"Android",I=`${$.path||"root"} + com.android.application (${O})`;else if(U)W="mcp",O="MCP",Z.push("mcp"),I=`${$.path||"root"} + ${U} (JVM MCP server)`;else if(q||Y||B){W="backend",O=q?.[1]||Y?.[1]||B?.[1]||"JVM";let P=q?.[0]||Y?.[0]||B?.[0]||"web";I=`${$.path||"root"} + ${P} (JVM backend)`}else if(z&&!H)W="library",O="Kotlin Multiplatform",I=`${$.path||"root"} + kotlin multiplatform (KMP library)`;else if(H)W="library",O=z?"Android+KMP":"Android",I=`${$.path||"root"} + android library (${O})`;else if(V||$.hasApplicationPlugin&&($.hasMainClass||G)||G&&$.hasMainClass)W="cli",O=V?.[1]||"application",I=V?`${$.path||"root"} + ${V[0]} (JVM CLI)`:`${$.path||"root"} + application plugin (JVM CLI)`;else if($.hasApplicationPlugin&&!_)W="cli",O="application",I=`${$.path||"root"} + application plugin (JVM CLI)`;else if(D)W="library",I=`${$.path||"root"} + packaging=pom (Maven aggregator/BOM)`;else{W="library";let P=$.kotlinSources&&!$.javaSources?"Kotlin":"JVM";if(I=`${$.path||"root"} (${P} library)`,_)I=`${$.path||"root"} + java-library (JVM library)`}let R="Java";if($.kotlinSources&&$.javaSources)R="Java/Kotlin";else if($.kotlinSources||mY.some((P)=>z0(Q,P))||z)R="Kotlin";let N=[...new Set(Z)];return{appType:W,framework:O,facets:N,found:I,buildTool:$.buildTool,mainLanguage:R}}function eY($,Z){if($==="mcp")return 0;if($==="mobile")return 1;if(Z.includes("multiplatform")&&$==="backend")return 2;if($==="backend")return 3;if($==="cli")return 4;if(Z.includes("multiplatform"))return 5;if(Z.includes("android"))return 6;return 7}function Z4($,Z,Q){let X=Z?p($,Z):$,z=p(X,"build.gradle.kts"),J=p(X,"build.gradle"),H=w0(z)?z:w0(J)?J:null;if(!H)return null;let U=b1(H);if(!U)return null;let q=nY(U,Q),Y=sY(U,Q),B=z4(X),G=/mainClass\s*[.=]/.test(U)||/mainClassName\s*=/.test(U)||/Main-Class/.test(U),V=z0(q,"application")||z0(q,"org.gradle.application");return{path:Z||"build.gradle",plugins:q,artifacts:Y,packaging:"jar",parents:new Set,hasMainClass:G,hasApplicationPlugin:V,sourceHints:B.hints,kotlinSources:B.kotlin||H.endsWith(".kts"),javaSources:B.java,buildTool:"gradle"}}function Q4($,Z){let Q=Z?p($,Z):$,X=p(Q,"pom.xml");if(!w0(X))return null;let z=b1(X);if(!z)return null;let{packaging:J,parents:H,artifacts:U}=X4(z),q=z4(Q);return{path:Z?`${Z}/pom.xml`:"pom.xml",plugins:new Set,artifacts:U,packaging:J,parents:H,hasMainClass:/<mainClass>/.test(z),hasApplicationPlugin:!1,sourceHints:q.hints,kotlinSources:q.kotlin,javaSources:q.java,buildTool:"maven"}}function E1($){if(!x8($))return null;let Z=rY($),Q=[],X=null;for(let Y of["settings.gradle.kts","settings.gradle"]){let B=p($,Y);if(w0(B)){X=b1(B);break}}let z=X?aY(X):[],J=Z4($,"",Z);if(J)Q.push(J);for(let Y of z){let B=Z4($,Y,Z);if(B)Q.push(B)}let H=Q4($,"");if(H){Q.push(H);let Y=b1(p($,"pom.xml"));if(Y){let{modules:B}=X4(Y);for(let G of B){let V=Q4($,G);if(V)Q.push(V)}}}if(Q.length===0&&X)return{appType:"library",framework:"",buildTool:"gradle",mainLanguage:"Java/Kotlin",facets:[],found:"settings.gradle (Gradle multi-project root)"};if(Q.length===0)return null;let U=null,q=999;for(let Y of Q){let B=tY(Y),G=eY(B.appType,B.facets);if(!U||G<q)U={appType:B.appType,framework:B.framework,buildTool:B.buildTool,mainLanguage:B.mainLanguage,facets:B.facets,found:B.found},q=G}if(U&&z.length>0&&!U.found.includes("multi-project"));return U}import{existsSync as x1,readFileSync as ZB,readdirSync as r2,statSync as QB}from"fs";import{join as n}from"path";var S1={version:1,_doc:"SINGLE SOURCE of Ruby detection KNOWLEDGE (Truth-is-faf-cli). faf-cli imports this; SDKs/MCPs compose it. Kill line: Gemfile alone ≠ Rails. Content-aware: gem names + light layout. 2026-08-03 initial (post-intel ruby-edition).",mcpGems:["mcp","fast-mcp","fast_mcp","rails-mcp-server","rails_mcp_server","ruby-mcp-client","ruby_mcp_client","ruby_llm-mcp","ruby_llm_mcp"],webGems:[["rails","Rails"],["railties","Rails"],["sinatra","Sinatra"],["sinatra-contrib","Sinatra"],["roda","Roda"],["grape","Grape"],["hanami","Hanami"],["hanami-controller","Hanami"],["rack","Rack"]],cliGems:[["thor","Thor"],["gli","GLI"],["commander","Commander"],["slop","Slop"]],railsLayoutFiles:["config/application.rb","config/routes.rb","bin/rails","config/environment.rb"]};var XB=S1.mcpGems.map(($)=>$.toLowerCase()),zB=S1.webGems.map(([$,Z])=>[$.toLowerCase(),Z]),J4=S1.cliGems.map(([$,Z])=>[$.toLowerCase(),Z]),JB=S1.railsLayoutFiles;function HB($){return x1(n($,"Gemfile"))||x1(n($,"gems.rb"))||UB($)}function UB($){try{return r2($).some((Z)=>Z.endsWith(".gemspec"))}catch{return!1}}function j1($){try{return ZB($,"utf-8")}catch{return null}}function qB($){let Z=new Set;for(let Q of $.split(`
|
|
218
218
|
`)){let X=Q.replace(/#.*$/,"").trim();if(!X)continue;let z=X.match(/^\s*gem\s+['"]([^'"]+)['"]/i)||X.match(/^\s*gem\s+:([A-Za-z0-9_.-]+)/i);if(z)Z.add(z[1].toLowerCase())}return Z}function YB($){let Z=new Set,Q=!1;for(let X of $.split(`
|
|
219
219
|
`)){let z=X.replace(/\r$/,"");if(/^\s*specs:\s*$/.test(z)){Q=!0;continue}if(Q){if(/^[A-Z]/.test(z)||z.startsWith("PLATFORMS")||z.startsWith("DEPENDENCIES")||z.startsWith("BUNDLED")||z.startsWith("RUBY VERSION")||z.startsWith("CHECKSUMS")){Q=!1;continue}let J=z.match(/^\s{2,}([a-zA-Z0-9_.-]+)\s*\(/);if(J)Z.add(J[1].toLowerCase())}}return Z}function BB($){let Z=new Set;for(let Q of $.split(`
|
|
220
220
|
`)){let z=Q.replace(/#.*$/,"").match(/add_(?:runtime_|development_)?dependency\s*\(?\s*['"]([^'"]+)['"]/i);if(z)Z.add(z[1].toLowerCase())}return Z}function GB($){let Z=new Set,Q=[];for(let z of["Gemfile","gems.rb"]){let J=n($,z),H=j1(J);if(H){for(let U of qB(H))Z.add(U);Q.push(z)}}let X=j1(n($,"Gemfile.lock"))||j1(n($,"gems.locked"));if(X){for(let z of YB(X))Z.add(z);Q.push("Gemfile.lock")}try{for(let z of r2($)){if(!z.endsWith(".gemspec"))continue;let J=j1(n($,z));if(J){for(let H of BB(J))Z.add(H);Q.push(z)}}}catch{}return{gems:Z,sources:Q}}function g1($,Z){let Q=Z.toLowerCase();if($.has(Q))return!0;return!1}function g8($,Z){let Q;for(let[X,z]of Z){if(!g1($,X))continue;if(!Q||X.length>Q[0].length)Q=[X,z]}return Q}function VB($){let Z;for(let Q of XB)if(g1($,Q)&&(!Z||Q.length>Z.length))Z=Q;return Z}function H4($){for(let Z of JB)if(x1(n($,Z)))return Z;return}function WB($,Z){let Q=g8(Z,J4);if(Q)return{hit:!0,why:Q[0]};try{for(let z of r2($)){if(!z.endsWith(".gemspec"))continue;let J=j1(n($,z));if(J&&/executables\s*=/.test(J)&&!/executables\s*=\s*\[\s*\]/.test(J))return{hit:!0,why:`${z} executables`}}}catch{}let X=n($,"bin");if(x1(X))try{let J=r2(X).filter((H)=>{if(H==="setup"||H==="console"||H==="rake")return!1;try{return QB(n(X,H)).isFile()}catch{return!1}}).filter((H)=>H!=="rails");if(J.length>0&&!g1(Z,"rails")&&!H4($))return{hit:!0,why:`bin/${J[0]}`}}catch{}return{hit:!1,why:""}}function a2($){if(!HB($))return null;let{gems:Z,sources:Q}=GB($),X=Q[0]||"Gemfile",z=Q.some((O)=>O==="Gemfile"||O==="gems.rb"||O.includes("lock"))?"bundler":"rubygems",J=VB(Z),H=g8(Z,zB),U=H4($),q=g1(Z,"rails")||g1(Z,"railties"),Y=WB($,Z),B=x1(n($,"config.ru")),G=q||!!U,V=H&&H[1]!=="Rails"&&!(H[0]==="rack"&&!B)?H:void 0,_,D="",W;if(J)_="mcp",D="MCP",W=`${X} + gem ${J} (Ruby MCP)`;else if(G)if(_="backend",D="Rails",q&&U)W=`${X} + rails + ${U} (Rails)`;else if(q)W=`${X} + gem rails (Rails)`;else W=`${U} (Rails layout)`;else if(V)_="backend",D=V[1],W=`${X} + gem ${V[0]} (Ruby backend)`;else if(Y.hit)_="cli",D=g8(Z,J4)?.[1]||"",W=`${X} + ${Y.why} (Ruby CLI)`;else _="library",W=`${X} (Ruby library)`;return{appType:_,framework:D,packageManager:z,found:W}}import{existsSync as h8,readFileSync as OB,readdirSync as DB,statSync as IB}from"fs";import{join as h1}from"path";var e={version:1,_doc:"SINGLE SOURCE of Swift detection KNOWLEDGE (Truth-is-faf-cli). Kill line: Package.swift alone ≠ app. Static parse of products + package URLs + product names + light xcodeproj productType. Never execute Package.swift / swift build. 2026-08-03 post-intel swift-edition.",mcpPackageUrls:["modelcontextprotocol/swift-sdk","github.com/modelcontextprotocol/swift-sdk"],mcpProducts:["MCP"],serverPackageUrls:[["vapor/vapor","Vapor"],["github.com/vapor/vapor","Vapor"],["hummingbird-project/hummingbird","Hummingbird"],["github.com/hummingbird-project/hummingbird","Hummingbird"]],serverProducts:[["Vapor","Vapor"],["Hummingbird","Hummingbird"]],cliPackageUrls:[["apple/swift-argument-parser","ArgumentParser"],["github.com/apple/swift-argument-parser","ArgumentParser"]],cliProducts:[["ArgumentParser","ArgumentParser"]],appProductTypes:["com.apple.product-type.application"],cliProductTypes:["com.apple.product-type.tool"],vaporLayoutFiles:["Sources/App/configure.swift","Sources/App/routes.swift","Sources/App/entrypoint.swift"]};var KB=e.mcpPackageUrls.map(($)=>$.toLowerCase()),MB=e.mcpProducts.map(($)=>$.toLowerCase()),LB=e.serverPackageUrls.map(([$,Z])=>[$.toLowerCase(),Z]),RB=e.serverProducts.map(([$,Z])=>[$.toLowerCase(),Z]),FB=e.cliPackageUrls.map(([$,Z])=>[$.toLowerCase(),Z]),NB=e.cliProducts.map(([$,Z])=>[$.toLowerCase(),Z]),AB=e.appProductTypes,PB=e.cliProductTypes,TB=e.vaporLayoutFiles;function CB($){return h8(h1($,"Package.swift"))||y8($).length>0}function y8($){try{return DB($).filter((Z)=>{if(!Z.endsWith(".xcodeproj"))return!1;try{return IB(h1($,Z)).isDirectory()}catch{return!1}})}catch{return[]}}function Y4($){try{return OB($,"utf-8")}catch{return null}}function wB($){let Z=bB($),Q=Z.toLowerCase(),X=[],z=/\.package\s*\(\s*url\s*:\s*"([^"]+)"/gi,J;while((J=z.exec(Z))!==null)X.push(J[1]);let H=/\.package\s*\(\s*url\s*:\s*'([^']+)'/gi;while((J=H.exec(Z))!==null)X.push(J[1]);let U=[],q=/\.product\s*\(\s*name\s*:\s*"([^"]+)"/gi;while((J=q.exec(Z))!==null)U.push(J[1]);let Y=/\.product\s*\(\s*name\s*:\s*'([^']+)'/gi;while((J=Y.exec(Z))!==null)U.push(J[1]);let B=/\.library\s*\(/.test(Q),G=/\.executable\s*\(/.test(Q),V=/\.plugin\s*\(/.test(Q)&&!B&&!G?!0:/\bproducts\s*:\s*\[[\s\S]*?\.plugin\s*\(/.test(Q),_=/\.executabletarget\s*\(/.test(Q),D=/\.target\s*\(/.test(Q)&&!_?!0:(Q.match(/\.target\s*\(/g)||[]).length>(Q.match(/\.executabletarget\s*\(/g)||[]).length+(Q.match(/\.testtarget\s*\(/g)||[]).length;return{packageUrls:X,productNames:U,hasLibraryProduct:B,hasExecutableProduct:G,hasPluginProduct:!!V,hasExecutableTarget:_,hasLibraryTarget:D}}function bB($){let Z="",Q=0;while(Q<$.length){if($[Q]==='"'||$[Q]==="'"){let X=$[Q];Z+=X,Q++;while(Q<$.length){if($[Q]==="\\"&&Q+1<$.length){Z+=$[Q]+$[Q+1],Q+=2;continue}if(Z+=$[Q],$[Q]===X){Q++;break}Q++}continue}if($[Q]==="/"&&$[Q+1]==="/"){Q+=2;while(Q<$.length&&$[Q]!==`
|
|
221
|
-
`)Q++;continue}if($[Q]==="/"&&$[Q+1]==="*"){Q+=2;while(Q<$.length&&!($[Q]==="*"&&$[Q+1]==="/"))Q++;Q+=2;continue}Z+=$[Q],Q++}return Z}function EB($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let z of Z)for(let J of Q)if(J.includes(z)&&(!X||z.length>X.length))X=z;return X}function U4($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let[z,J]of Z)for(let H of Q)if(H.includes(z)&&(!X||z.length>X[0].length))X=[z,J];return X}function q4($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let[z,J]of Z)if(Q.includes(z)&&(!X||z.length>X[0].length))X=[z,J];return X}function SB($){let Z=$.map((Q)=>Q.toLowerCase());return MB.some((Q)=>Z.includes(Q))}function jB($){let Z=!1,Q=!1,X;for(let z of y8($)){let J=h1($,z,"project.pbxproj"),H=Y4(J);if(!H)continue;for(let U of AB)if(H.includes(U))Z=!0,X=U;for(let U of PB)if(H.includes(U)){if(Q=!0,!X)X=U}}return{hasApplication:Z,hasTool:Q,hit:X}}function xB($){for(let Z of TB)if(h8(h1($,Z)))return Z;return}function y1($){if(!CB($))return null;let Z=h1($,"Package.swift"),Q=h8(Z),X=y8($),z=X.length>0,J=null;if(Q){let S=Y4(Z);if(S)J=wB(S)}let H=z?jB($):{hasApplication:!1,hasTool:!1},U=xB($),q=J?.packageUrls??[],Y=J?.productNames??[],B=EB(q,KB),G=SB(Y),V=U4(q,LB),_=q4(Y,RB),D=U4(q,FB),W=q4(Y,NB),O=!!(B||G),I=!!(V||_||U),R=!!(J?.hasExecutableProduct||J?.hasExecutableTarget),N=!!(D||W),P=H.hasApplication,T=Q&&z?"spm+xcode":Q?"spm":"xcode",A,C="",L;if(O)if(A="mcp",C="MCP",G)L="Package.swift + product MCP (Swift MCP)";else L=`Package.swift + ${B} (Swift MCP)`;else if(I)if(A="backend",C=_?.[1]||V?.[1]||(U?"Vapor":""),_)L=`Package.swift + product ${_[1]} (Swift backend)`;else if(V)L=`Package.swift + ${V[1]} (Swift backend)`;else L=`${U} (Swift backend layout)`;else if(P)A="app",C="",L=`${X[0]} + ${H.hit||"application"} (Swift app)`;else if(N||R&&!I&&!O)if(A="cli",C=W?.[1]||D?.[1]||"",W)L=`Package.swift + product ${W[1]} (Swift CLI)`;else if(D)L=`Package.swift + ${D[1]} (Swift CLI)`;else if(J?.hasExecutableProduct)L="Package.swift + .executable product (Swift CLI)";else L="Package.swift + .executableTarget (Swift CLI)";else if(H.hasTool&&!Q)A="cli",L=`${X[0]} + tool productType (Swift CLI)`;else if(Q)if(A="library",J?.hasLibraryProduct)L="Package.swift + .library product (Swift library)";else L="Package.swift (Swift library)";else A="library",L=`${X[0]||"xcodeproj"} (Swift — no classifying productType)`;return{appType:A,framework:C,packageManager:T,found:L}}var kB=new Set(["node_modules",".git","dist","build","venv",".venv","__pycache__","target","coverage",".next",".svelte-kit","vendor"]),uB=new Set([".py",".ts",".tsx",".js",".jsx",".svelte",".vue",".rb",".go",".rs",".php",".java",".kt",".swift"]),mB={mainLanguage:["project","main_language"],main_language:["project","main_language"],framework:["stack","frontend"],cssFramework:["stack","css_framework"],css:["stack","css_framework"],uiLibrary:["stack","ui_library"],ui_library:["stack","ui_library"],stateManagement:["stack","state_management"],state:["stack","state_management"],backend:["stack","backend"],apiType:["stack","api_type"],api:["stack","api_type"],runtime:["stack","runtime"],database:["stack","database"],db:["stack","database"],connection:["stack","connection"],hosting:["stack","hosting"],buildTool:["stack","build"],build_tool:["stack","build"],build:["stack","build"],packageManager:["stack","package_manager"],pkg_manager:["stack","package_manager"],cicd:["stack","cicd"]},lB=[["packageManager","package-manager"],["pkg_manager","package-manager"],["mainLanguage","language"],["main_language","language"],["framework","framework"],["backend","backend"],["database","database"],["db","database"],["cicd","ci-cd"],["hosting","hosting"],["buildTool","build"],["build_tool","build"],["build","build"],["runtime","runtime"],["cssFramework","css"],["css","css"],["uiLibrary","ui-library"],["stateManagement","state-management"],["apiType","api"],["api","api"]];function pB($,Z){for(let[Q,X]of lB)if(Q in $)return X;return Z.length>0?"framework":"config"}function dB($){try{let Z=JSON.parse(hB($,"utf-8")),Q=["background","content_scripts","action","browser_action","permissions"].some((X)=>(X in Z));if(typeof Z.manifest_version==="number"&&Q)return"chrome";return"other"}catch{return"other"}}function cB($){let Z=[],Q=fB($),X=gB(v8($,".git")),z=new Set;for(let J=0;J<10;J++){let H;try{H=B4(Q)}catch{break}for(let q of H){if(q.toLowerCase().endsWith(".csproj")){let B=i2(Q);if(B){let G={mainLanguage:"C#",packageManager:"NuGet",buildTool:"dotnet"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="mobile"&&B.framework)G.framework=B.framework;if(B.targetFramework)G.runtime=B.targetFramework;let V=B.framework?[B.framework,"C#",".NET"]:["C#",".NET"];Z.push({slots:G,priority:36,frameworks:V,fileName:q})}continue}if(q.endsWith(".xcodeproj")){let B=y1(Q);if(B){let G={mainLanguage:"Swift",packageManager:B.packageManager==="spm"?"spm":"Xcode",buildTool:B.packageManager.includes("spm")?"swift build":"xcodebuild"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="app")G.framework=B.framework||"Swift App";let V=B.framework?[B.framework,"Swift"]:["Swift"];Z.push({slots:G,priority:36,frameworks:V,fileName:q})}continue}let Y=b8[q];if(!Y)continue;if(q==="manifest.json"&&dB(v8(Q,q))!=="chrome")continue;if(q==="pubspec.yaml"){let B=m2(Q);if(B){let G={mainLanguage:"Dart",packageManager:"pub"};if(B.isFlutter){if(G.framework="Flutter",B.stateManagement)G.stateManagement=B.stateManagement}else if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="mcp")G.apiType="MCP";Z.push({slots:G,priority:Y.priority,frameworks:B.isFlutter?["Flutter","Dart"]:["Dart"],fileName:q});continue}}if(q==="go.mod"){let B=d2(Q);if(B){let G={mainLanguage:"Go",packageManager:"go modules",buildTool:"go build"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";let V=B.framework?[B.framework,"Go"]:["Go"];Z.push({slots:G,priority:Y.priority,frameworks:V,fileName:q});continue}}if(q==="Gemfile"||q==="Gemfile.lock"||q==="gems.rb"){let B=a2(Q);if(B){let G={mainLanguage:"Ruby",packageManager:B.packageManager};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";let V=B.framework?[B.framework,"Ruby"]:["Ruby"];Z.push({slots:G,priority:Y.priority??35,frameworks:V,fileName:q});continue}}if(q==="Package.swift"){let B=y1(Q);if(B){let G={mainLanguage:"Swift",packageManager:B.packageManager==="xcode"?"Xcode":"spm",buildTool:"swift build"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="app")G.framework=B.framework||"SwiftUI/App";let V=B.framework?[B.framework,"Swift"]:["Swift"];Z.push({slots:G,priority:Y.priority??36,frameworks:V,fileName:q});continue}}if(q==="pom.xml"||q==="build.gradle"||q==="build.gradle.kts"||q==="settings.gradle"||q==="settings.gradle.kts"){if(z.has(Q))continue;z.add(Q);let B=E1(Q);if(B){let G={mainLanguage:B.mainLanguage==="Java/Kotlin"?"Kotlin":B.mainLanguage,packageManager:B.buildTool==="maven"?"maven":"gradle",buildTool:B.buildTool};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="mobile")G.framework=B.framework||"Android";if(B.facets.includes("multiplatform"))G.framework=B.framework||"Kotlin Multiplatform";let V=B.framework?[B.framework,"JVM",B.mainLanguage==="Kotlin"?"Kotlin":"Java"]:["JVM",B.mainLanguage==="Kotlin"?"Kotlin":"Java"];Z.push({slots:G,priority:Y.priority??35,frameworks:V,fileName:q});continue}}Z.push({slots:Y.slots||{},priority:Y.priority,frameworks:Y.frameworks,fileName:q})}if(X&&J===0)break;let U=yB(Q);if(U===Q)break;Q=U}return Z}function iB($){let Z=[];for(let Q of V4($,2,{count:0})){let X=b8[`*${Q}`],z=X?.slots?.mainLanguage;if(z)Z.push({slots:{mainLanguage:z},priority:X.priority,frameworks:X.frameworks})}return Z}function G4($){let Z=[...cB($),...iB($)],Q={},X={},z=new Set;for(let Y of Z){Y.frameworks.forEach((B)=>z.add(B));for(let[B,G]of Object.entries(Y.slots))if(G&&!G.includes("/")&&(!(B in Q)||Y.priority>X[B]))Q[B]=G,X[B]=Y.priority}let J=new Map;for(let Y of Z){if(!Y.fileName)continue;if(!J.has(Y.fileName))J.set(Y.fileName,{fileName:Y.fileName,category:pB(Y.slots,Y.frameworks),priority:Y.priority})}let H=[...J.values()].sort((Y,B)=>B.priority-Y.priority||Y.fileName.localeCompare(B.fileName)),U=[];if(Q.mainLanguage)U.push(Q.mainLanguage.toLowerCase());if(Q.framework)U.push(Q.framework.toLowerCase());let q=U.length>0?U.join("-"):"unknown-stack";return{slotFills:Q,frameworks:[...z],confirmedCount:Z.length,discoveredFormats:H,stackSignature:q}}function f8($){let{slotFills:Z}=G4($),Q={};for(let[X,z]of Object.entries(Z)){let J=mB[X];if(!J||!z)continue;let[H,U]=J;if(H==="project")(Q.project??={})[U]=z;else(Q.stack??={})[U]=z}return Q}function V4($,Z,Q){let X=new Set;if(Z<0||Q.count>400)return X;let z;try{z=B4($,{withFileTypes:!0})}catch{return X}for(let J of z){if(Q.count++>400)break;if(!J.isDirectory()){let H=vB(J.name);if(uB.has(H))X.add(H);continue}if(kB.has(J.name)||J.name.startsWith("."))continue;for(let H of V4(v8($,J.name),Z-1,Q))X.add(H)}return X}import{existsSync as W4,readFileSync as _4}from"fs";import{join as O4}from"path";var f=($,Z,Q)=>({value:$,source:Z,confidence:Q});function D4($,Z={}){let Q=Z.toolingRoot?null:rB($),X=aB($),z={},J=(H,U)=>{if(U)z[H]=U};return J("what",sB(Q,X)),J("who",oB(X)),J("why",tB(X)),J("where",eB(Q,X)),J("when",$G(X)),J("how",ZG(Q,X)),z}function k8($,Z={}){let Q=D4($,Z),X={};return Object.keys(Q).forEach((z)=>{let J=Q[z];if(J)X[z]=J.value}),X}function rB($){let Z=O4($,"package.json");if(!W4(Z))return null;try{return JSON.parse(_4(Z,"utf-8"))}catch{return null}}function aB($){let Z=O4($,"README.md");if(!W4(Z))return"";let Q;try{Q=_4(Z,"utf-8")}catch{return""}return Q.replace(/<!--[\s\S]*?-->/g,"").split(`
|
|
221
|
+
`)Q++;continue}if($[Q]==="/"&&$[Q+1]==="*"){Q+=2;while(Q<$.length&&!($[Q]==="*"&&$[Q+1]==="/"))Q++;Q+=2;continue}Z+=$[Q],Q++}return Z}function EB($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let z of Z)for(let J of Q)if(J.includes(z)&&(!X||z.length>X.length))X=z;return X}function U4($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let[z,J]of Z)for(let H of Q)if(H.includes(z)&&(!X||z.length>X[0].length))X=[z,J];return X}function q4($,Z){let Q=$.map((z)=>z.toLowerCase()),X;for(let[z,J]of Z)if(Q.includes(z)&&(!X||z.length>X[0].length))X=[z,J];return X}function SB($){let Z=$.map((Q)=>Q.toLowerCase());return MB.some((Q)=>Z.includes(Q))}function jB($){let Z=!1,Q=!1,X;for(let z of y8($)){let J=h1($,z,"project.pbxproj"),H=Y4(J);if(!H)continue;for(let U of AB)if(H.includes(U))Z=!0,X=U;for(let U of PB)if(H.includes(U)){if(Q=!0,!X)X=U}}return{hasApplication:Z,hasTool:Q,hit:X}}function xB($){for(let Z of TB)if(h8(h1($,Z)))return Z;return}function y1($){if(!CB($))return null;let Z=h1($,"Package.swift"),Q=h8(Z),X=y8($),z=X.length>0,J=null;if(Q){let S=Y4(Z);if(S)J=wB(S)}let H=z?jB($):{hasApplication:!1,hasTool:!1},U=xB($),q=J?.packageUrls??[],Y=J?.productNames??[],B=EB(q,KB),G=SB(Y),V=U4(q,LB),_=q4(Y,RB),D=U4(q,FB),W=q4(Y,NB),O=!!(B||G),I=!!(V||_||U),R=!!(J?.hasExecutableProduct||J?.hasExecutableTarget),N=!!(D||W),P=H.hasApplication,T=Q&&z?"spm+xcode":Q?"spm":"xcode",A,C="",L;if(O)if(A="mcp",C="MCP",G)L="Package.swift + product MCP (Swift MCP)";else L=`Package.swift + ${B} (Swift MCP)`;else if(I)if(A="backend",C=_?.[1]||V?.[1]||(U?"Vapor":""),_)L=`Package.swift + product ${_[1]} (Swift backend)`;else if(V)L=`Package.swift + ${V[1]} (Swift backend)`;else L=`${U} (Swift backend layout)`;else if(P)A="app",C="",L=`${X[0]} + ${H.hit||"application"} (Swift app)`;else if(N||R&&!I&&!O)if(A="cli",C=W?.[1]||D?.[1]||"",W)L=`Package.swift + product ${W[1]} (Swift CLI)`;else if(D)L=`Package.swift + ${D[1]} (Swift CLI)`;else if(J?.hasExecutableProduct)L="Package.swift + .executable product (Swift CLI)";else L="Package.swift + .executableTarget (Swift CLI)";else if(H.hasTool&&!Q)A="cli",L=`${X[0]} + tool productType (Swift CLI)`;else if(Q)if(A="library",J?.hasLibraryProduct)L="Package.swift + .library product (Swift library)";else L="Package.swift (Swift library)";else A="library",L=`${X[0]||"xcodeproj"} (Swift — no classifying productType)`;return{appType:A,framework:C,packageManager:T,found:L}}var kB=new Set(["node_modules",".git","dist","build","venv",".venv","__pycache__","target","coverage",".next",".svelte-kit","vendor"]),uB=new Set([".py",".ts",".tsx",".js",".jsx",".svelte",".vue",".rb",".go",".rs",".php",".java",".kt",".swift"]),mB={mainLanguage:["project","main_language"],main_language:["project","main_language"],framework:["stack","frontend"],cssFramework:["stack","css_framework"],css:["stack","css_framework"],uiLibrary:["stack","ui_library"],ui_library:["stack","ui_library"],stateManagement:["stack","state_management"],state:["stack","state_management"],backend:["stack","backend"],apiType:["stack","api_type"],api:["stack","api_type"],runtime:["stack","runtime"],database:["stack","database"],db:["stack","database"],connection:["stack","connection"],hosting:["stack","hosting"],buildTool:["stack","build"],build_tool:["stack","build"],build:["stack","build"],packageManager:["stack","package_manager"],pkg_manager:["stack","package_manager"],cicd:["stack","cicd"]},lB=[["packageManager","package-manager"],["pkg_manager","package-manager"],["mainLanguage","language"],["main_language","language"],["framework","framework"],["backend","backend"],["database","database"],["db","database"],["cicd","ci-cd"],["hosting","hosting"],["buildTool","build"],["build_tool","build"],["build","build"],["runtime","runtime"],["cssFramework","css"],["css","css"],["uiLibrary","ui-library"],["stateManagement","state-management"],["apiType","api"],["api","api"]];function pB($,Z){for(let[Q,X]of lB)if(Q in $)return X;return Z.length>0?"framework":"config"}function dB($){try{let Z=JSON.parse(hB($,"utf-8")),Q=["background","content_scripts","action","browser_action","permissions"].some((X)=>(X in Z));if(typeof Z.manifest_version==="number"&&Q)return"chrome";return"other"}catch{return"other"}}function cB($){let Z=[],Q=fB($),X=gB(v8($,".git")),z=new Set;for(let J=0;J<10;J++){let H;try{H=B4(Q)}catch{break}for(let q of H){if(q.toLowerCase().endsWith(".csproj")){let B=i2(Q);if(B){let G={mainLanguage:"C#",packageManager:"NuGet",buildTool:"dotnet"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="mobile"&&B.framework)G.framework=B.framework;if(B.targetFramework)G.runtime=B.targetFramework;let V=B.framework?[B.framework,"C#",".NET"]:["C#",".NET"];Z.push({slots:G,priority:36,frameworks:V,fileName:q})}continue}if(q.endsWith(".xcodeproj")){let B=y1(Q);if(B){let G={mainLanguage:"Swift",packageManager:B.packageManager==="spm"?"spm":"Xcode",buildTool:B.packageManager.includes("spm")?"swift build":"xcodebuild"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="app")G.framework=B.framework||"Swift App";let V=B.framework?[B.framework,"Swift"]:["Swift"];Z.push({slots:G,priority:36,frameworks:V,fileName:q})}continue}let Y=b8[q];if(!Y)continue;if(q==="manifest.json"&&dB(v8(Q,q))!=="chrome")continue;if(q==="pubspec.yaml"){let B=m2(Q);if(B){let G={mainLanguage:"Dart",packageManager:"pub"};if(B.isFlutter){if(G.framework="Flutter",B.stateManagement)G.stateManagement=B.stateManagement}else if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="mcp")G.apiType="MCP";Z.push({slots:G,priority:Y.priority,frameworks:B.isFlutter?["Flutter","Dart"]:["Dart"],fileName:q});continue}}if(q==="go.mod"){let B=d2(Q);if(B){let G={mainLanguage:"Go",packageManager:"go modules",buildTool:"go build"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";let V=B.framework?[B.framework,"Go"]:["Go"];Z.push({slots:G,priority:Y.priority,frameworks:V,fileName:q});continue}}if(q==="Gemfile"||q==="Gemfile.lock"||q==="gems.rb"){let B=a2(Q);if(B){let G={mainLanguage:"Ruby",packageManager:B.packageManager};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";let V=B.framework?[B.framework,"Ruby"]:["Ruby"];Z.push({slots:G,priority:Y.priority??35,frameworks:V,fileName:q});continue}}if(q==="Package.swift"){let B=y1(Q);if(B){let G={mainLanguage:"Swift",packageManager:B.packageManager==="xcode"?"Xcode":"spm",buildTool:"swift build"};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="app")G.framework=B.framework||"SwiftUI/App";let V=B.framework?[B.framework,"Swift"]:["Swift"];Z.push({slots:G,priority:Y.priority??36,frameworks:V,fileName:q});continue}}if(q==="pom.xml"||q==="build.gradle"||q==="build.gradle.kts"||q==="settings.gradle"||q==="settings.gradle.kts"){if(z.has(Q))continue;z.add(Q);let B=E1(Q);if(B){let G={mainLanguage:B.mainLanguage==="Java/Kotlin"?"Kotlin":B.mainLanguage,packageManager:B.buildTool==="maven"?"maven":"gradle",buildTool:B.buildTool};if(B.appType==="backend"&&B.framework)G.backend=B.framework;else if(B.appType==="cli"&&B.framework)G.framework=B.framework;else if(B.appType==="mcp")G.apiType="MCP";else if(B.appType==="mobile")G.framework=B.framework||"Android";if(B.facets.includes("multiplatform"))G.framework=B.framework||"Kotlin Multiplatform";let V=B.framework?[B.framework,"JVM",B.mainLanguage==="Kotlin"?"Kotlin":"Java"]:["JVM",B.mainLanguage==="Kotlin"?"Kotlin":"Java"];Z.push({slots:G,priority:Y.priority??35,frameworks:V,fileName:q});continue}}Z.push({slots:Y.slots||{},priority:Y.priority,frameworks:Y.frameworks,fileName:q})}if(X&&J===0)break;let U=yB(Q);if(U===Q)break;Q=U}return Z}function iB($){let Z=[];for(let Q of V4($,2,{count:0})){let X=b8[`*${Q}`],z=X?.slots?.mainLanguage;if(z)Z.push({slots:{mainLanguage:z},priority:X.priority,frameworks:X.frameworks})}return Z}function G4($){let Z=[...cB($),...iB($)],Q={},X={},z=new Set;for(let Y of Z){Y.frameworks.forEach((B)=>z.add(B));for(let[B,G]of Object.entries(Y.slots))if(G&&!G.includes("/")&&(!(B in Q)||Y.priority>X[B]))Q[B]=G,X[B]=Y.priority}let J=new Map;for(let Y of Z){if(!Y.fileName)continue;if(!J.has(Y.fileName))J.set(Y.fileName,{fileName:Y.fileName,category:pB(Y.slots,Y.frameworks),priority:Y.priority})}let H=[...J.values()].sort((Y,B)=>B.priority-Y.priority||Y.fileName.localeCompare(B.fileName)),U=[];if(Q.mainLanguage)U.push(Q.mainLanguage.toLowerCase());if(Q.framework)U.push(Q.framework.toLowerCase());let q=U.length>0?U.join("-"):"unknown-stack";return{slotFills:Q,frameworks:[...z],confirmedCount:Z.length,discoveredFormats:H,stackSignature:q}}function f8($){let{slotFills:Z}=G4($),Q={};for(let[X,z]of Object.entries(Z)){let J=mB[X];if(!J||!z)continue;let[H,U]=J;if(H==="project")(Q.project??={})[U]=z;else(Q.stack??={})[U]=z}return Q}function V4($,Z,Q){let X=new Set;if(Z<0||Q.count>400)return X;let z;try{z=B4($,{withFileTypes:!0})}catch{return X}for(let J of z){if(Q.count++>400)break;if(!J.isDirectory()){let H=vB(J.name);if(uB.has(H))X.add(H);continue}if(kB.has(J.name)||J.name.startsWith("."))continue;for(let H of V4(v8($,J.name),Z-1,Q))X.add(H)}return X}import{existsSync as W4,readFileSync as _4}from"fs";import{join as O4}from"path";var f=($,Z,Q)=>({value:$,source:Z,confidence:Q});function D4($,Z={}){let Q=Z.toolingRoot?null:rB($),X=aB($),z={},J=(H,U)=>{if(U)z[H]=U};return J("what",oB(Q,X)),J("who",tB(X)),J("why",eB(X)),J("where",$G(Q,X)),J("when",ZG(X)),J("how",QG(Q,X)),z}function k8($,Z={}){let Q=D4($,Z),X={};return Object.keys(Q).forEach((z)=>{let J=Q[z];if(J)X[z]=J.value}),X}function rB($){let Z=O4($,"package.json");if(!W4(Z))return null;try{return JSON.parse(_4(Z,"utf-8"))}catch{return null}}function aB($){let Z=O4($,"README.md");if(!W4(Z))return"";let Q;try{Q=_4(Z,"utf-8")}catch{return""}return Q.replace(/<!--[\s\S]*?-->/g,"").split(`
|
|
222
222
|
`).filter((X)=>!/^\s*\[!\[/.test(X)&&!/^\s*!\[/.test(X)).join(`
|
|
223
|
-
`).replace(/<[^>]+>/g,"").replace(/!\[[^\]]*\]\([^)]*\)/g,"").trim()}function b0($){return $.replace(/\s+/g," ").replace(/[#*`>]/g,"").trim().slice(0,280)}function nB($){if(!$)return 0;return($.match(/\[[^\]]*\]\([^)]*\)/g)??[]).join("").length/$.length}function o0($,Z){let Q=new RegExp(`##?\\s+(${Z})\\s*\\n+([\\s\\S]+?)(?:\\n\\n|\\n##?|$)`,"i"),X=$.match(Q);if(!X||!X[2]||X[2].trim().length<=20||nB(X[2])>0.4)return null;return{body:b0(X[2]),heading:X[1].trim()}}function v1($,Z,Q=30){for(let X of Z){let z=$.match(X);if(z&&z[1]&&z[1].trim().length>=Q)return b0(z[1])}return null}function sB($,Z){if($?.description&&$.description.length>20)return f(b0($.description),"package.json:description",0.95);let Q=o0(Z,"Purpose|What|About|Overview|Description");if(Q)return f(Q.body,`README:## ${Q.heading}`,0.8);let X=Z.split(/\n\s*\n/).map((J)=>J.trim()).find((J)=>J.length>30&&!J.startsWith("#"));if(X)return f(b0(X),"README:first-paragraph",0.5);let z=v1(Z,[/(?:core|main|primary)\s+(?:problem|challenge)(?:\s+is)?\s*:?\s*([^.\n]{30,})/i,/solves?\s+(?:the\s+)?(?:problem\s+of\s+)?([^.\n]{30,})/i]);return z?f(z,"README:problem-heuristic",0.6):null}function oB($){let Z=o0($,"Audience|Who|Who is this for|Who it.s for");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/\b(?:designed|built|made)\s+for\s+((?:[a-z][a-z-]*\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\n]{0,80})/i,/\bfor\s+((?:[a-z][a-z-]*\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\n]{0,80})/i],8);return Q?f(Q,"README:audience-heuristic",0.6):null}function tB($){let Z=o0($,"Why|Mission|Motivation|Rationale|Vision");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/(?:our\s+|the\s+)?(?:mission|purpose|goal)\s+is\s+([^.\n]{30,})/i,/\b(?:mission|purpose|goal)\s*:\s*([^.\n]{30,})/i,/(?:built|created|designed)\s+(?:because|to)\s+([^.\n]{30,})/i]);return Q?f(Q,"README:mission-heuristic",0.6):null}function eB($,Z){let Q=typeof $?.repository==="string"?$.repository:$?.repository?.url;if(Q)return f(b0(Q.replace(/^git\+/,"").replace(/\.git$/,"")),"package.json:repository",0.95);if($?.homepage)return f(b0($.homepage),"package.json:homepage",0.9);let X=v1(Z,[/\b(?:deployed|hosted|available|published)\s+(?:on|at|via)\s+([^.\n]{3,80})/i],3);return X?f(X,"README:deploy-heuristic",0.6):null}function $G($){let Z=o0($,"Timeline|Status|Release|Roadmap");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/\b(production\s+since\s+[^.\n]{4,60})/i,/\b((?:in\s+)?(?:production|beta|alpha|development)\s+since\s+[^.\n]{4,60})/i,/\bsince\s+((?:[A-Z][a-z]+\s+)?\d{4}[^.\n]{0,40})/],4);return Q?f(Q,"README:since-heuristic",0.6):null}function ZG($,Z){let Q=$?.scripts?Object.keys($.scripts):[],X=["start","dev","build"].filter((H)=>Q.includes(H));if(X.length)return f(b0(X.map((H)=>`npm run ${H}`).join(", ")),"package.json:scripts",0.9);let z=o0(Z,"Usage|Getting Started|Install|Installation|Quick Start");if(z)return f(z.body,`README:## ${z.heading}`,0.8);let J=o0(Z,"Architecture|Approach|How it works|Methodology|How");return J?f(J.body,`README:## ${J.heading}`,0.7):null}var I4="3.0";import{existsSync as M,readFileSync as $0,readdirSync as u8}from"fs";import{join as K}from"path";var K4=[{name:"Next.js",slug:"nextjs",category:"frontend",signals:[{type:"dependency",key:"next"},{type:"file",pattern:"next.config.*"}]},{name:"React",slug:"react",category:"frontend",signals:[{type:"dependency",key:"react"}]},{name:"SvelteKit",slug:"sveltekit",category:"frontend",signals:[{type:"dependency",key:"@sveltejs/kit"},{type:"file",pattern:"svelte.config.*"}]},{name:"Svelte",slug:"svelte",category:"frontend",signals:[{type:"dependency",key:"svelte"},{type:"devDependency",key:"svelte"}]},{name:"Vue.js",slug:"vue",category:"frontend",signals:[{type:"dependency",key:"vue"}]},{name:"Nuxt",slug:"nuxt",category:"frontend",signals:[{type:"dependency",key:"nuxt"},{type:"file",pattern:"nuxt.config.*"}]},{name:"Angular",slug:"angular",category:"frontend",signals:[{type:"dependency",key:"@angular/core"},{type:"file",pattern:"angular.json"}]},{name:"Astro",slug:"astro",category:"frontend",signals:[{type:"dependency",key:"astro"},{type:"file",pattern:"astro.config.*"}]},{name:"Solid",slug:"solid",category:"frontend",signals:[{type:"dependency",key:"solid-js"}]},{name:"Remix",slug:"remix",category:"frontend",signals:[{type:"dependency",key:"@remix-run/react"}]},{name:"Gatsby",slug:"gatsby",category:"frontend",signals:[{type:"dependency",key:"gatsby"},{type:"file",pattern:"gatsby-config.*"}]},{name:"Qwik",slug:"qwik",category:"frontend",signals:[{type:"dependency",key:"@builder.io/qwik"}]},{name:"Vercel (SvelteKit)",slug:"adapter-vercel",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-vercel"},{type:"devDependency",key:"@sveltejs/adapter-vercel"}]},{name:"Node (SvelteKit)",slug:"adapter-node",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-node"},{type:"devDependency",key:"@sveltejs/adapter-node"}]},{name:"Static (SvelteKit)",slug:"adapter-static",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-static"},{type:"devDependency",key:"@sveltejs/adapter-static"}]},{name:"Cloudflare (SvelteKit)",slug:"adapter-cloudflare",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-cloudflare"},{type:"devDependency",key:"@sveltejs/adapter-cloudflare"}]},{name:"Netlify (SvelteKit)",slug:"adapter-netlify",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-netlify"},{type:"devDependency",key:"@sveltejs/adapter-netlify"}]},{name:"Tailwind CSS",slug:"tailwind",category:"css",signals:[{type:"dependency",key:"tailwindcss"},{type:"devDependency",key:"tailwindcss"},{type:"file",pattern:"tailwind.config.*"}]},{name:"Bootstrap",slug:"bootstrap",category:"css",signals:[{type:"dependency",key:"bootstrap"}]},{name:"Styled Components",slug:"styled-components",category:"css",signals:[{type:"dependency",key:"styled-components"}]},{name:"shadcn/ui",slug:"shadcn",category:"ui",signals:[{type:"file",pattern:"components.json"},{type:"dependency",key:"@radix-ui/react-dialog"}]},{name:"Material UI",slug:"mui",category:"ui",signals:[{type:"dependency",key:"@mui/material"}]},{name:"Chakra UI",slug:"chakra",category:"ui",signals:[{type:"dependency",key:"@chakra-ui/react"}]},{name:"Ant Design",slug:"antd",category:"ui",signals:[{type:"dependency",key:"antd"}]},{name:"Redux",slug:"redux",category:"state",signals:[{type:"dependency",key:"@reduxjs/toolkit"}]},{name:"Zustand",slug:"zustand",category:"state",signals:[{type:"dependency",key:"zustand"}]},{name:"Jotai",slug:"jotai",category:"state",signals:[{type:"dependency",key:"jotai"}]},{name:"Pinia",slug:"pinia",category:"state",signals:[{type:"dependency",key:"pinia"}]},{name:"Express",slug:"express",category:"backend",signals:[{type:"dependency",key:"express"}]},{name:"Fastify",slug:"fastify",category:"backend",signals:[{type:"dependency",key:"fastify"}]},{name:"Hono",slug:"hono",category:"backend",signals:[{type:"dependency",key:"hono"}]},{name:"Elysia",slug:"elysia",category:"backend",signals:[{type:"dependency",key:"elysia"}]},{name:"NestJS",slug:"nestjs",category:"backend",signals:[{type:"dependency",key:"@nestjs/core"}]},{name:"Koa",slug:"koa",category:"backend",signals:[{type:"dependency",key:"koa"}]},{name:"Django",slug:"django",category:"backend",signals:[{type:"file",pattern:"manage.py"},{type:"file",pattern:"settings.py"}]},{name:"Flask",slug:"flask",category:"backend",signals:[{type:"content",pattern:"app.py",key:"flask"}]},{name:"FastAPI",slug:"fastapi",category:"backend",signals:[{type:"content",pattern:"main.py",key:"fastapi"}]},{name:"Rails",slug:"rails",category:"backend",signals:[{type:"content",pattern:"Gemfile",key:"rails"},{type:"content",pattern:"Gemfile.lock",key:"rails ("},{type:"file",pattern:"config/application.rb"},{type:"file",pattern:"config/routes.rb"}]},{name:"Spring Boot",slug:"spring",category:"backend",signals:[{type:"content",pattern:"pom.xml",key:"spring-boot"},{type:"content",pattern:"build.gradle",key:"springframework.boot"},{type:"content",pattern:"build.gradle.kts",key:"springframework.boot"},{type:"content",pattern:"gradle/libs.versions.toml",key:"springframework.boot"}]},{name:"Vapor",slug:"vapor",category:"backend",signals:[{type:"content",pattern:"Package.swift",key:"vapor/vapor"},{type:"content",pattern:"Package.swift",key:'product(name: "Vapor"'},{type:"content",pattern:"Package.swift",key:"product(name: 'Vapor'"},{type:"file",pattern:"Sources/App/configure.swift"}]},{name:"Hummingbird",slug:"hummingbird",category:"backend",signals:[{type:"content",pattern:"Package.swift",key:"hummingbird-project/hummingbird"},{type:"content",pattern:"Package.swift",key:'product(name: "Hummingbird"'},{type:"content",pattern:"Package.swift",key:"product(name: 'Hummingbird'"}]},{name:"Prisma",slug:"prisma",category:"database",signals:[{type:"dependency",key:"prisma"},{type:"devDependency",key:"prisma"},{type:"file",pattern:"prisma/schema.prisma"}]},{name:"Drizzle",slug:"drizzle",category:"database",signals:[{type:"dependency",key:"drizzle-orm"},{type:"file",pattern:"drizzle.config.*"}]},{name:"TypeORM",slug:"typeorm",category:"database",signals:[{type:"dependency",key:"typeorm"}]},{name:"Mongoose",slug:"mongoose",category:"database",signals:[{type:"dependency",key:"mongoose"}]},{name:"Vite",slug:"vite",category:"build",signals:[{type:"dependency",key:"vite"},{type:"devDependency",key:"vite"},{type:"file",pattern:"vite.config.*"}]},{name:"webpack",slug:"webpack",category:"build",signals:[{type:"dependency",key:"webpack"},{type:"devDependency",key:"webpack"},{type:"file",pattern:"webpack.config.*"}]},{name:"esbuild",slug:"esbuild",category:"build",signals:[{type:"dependency",key:"esbuild"},{type:"devDependency",key:"esbuild"}]},{name:"Turbopack",slug:"turbopack",category:"build",signals:[{type:"file",pattern:"turbo.json"}]},{name:"Jest",slug:"jest",category:"testing",signals:[{type:"devDependency",key:"jest"},{type:"file",pattern:"jest.config.*"}]},{name:"Vitest",slug:"vitest",category:"testing",signals:[{type:"devDependency",key:"vitest"}]},{name:"Playwright",slug:"playwright",category:"testing",signals:[{type:"devDependency",key:"@playwright/test"},{type:"file",pattern:"playwright.config.*"}]},{name:"Cypress",slug:"cypress",category:"testing",signals:[{type:"devDependency",key:"cypress"},{type:"file",pattern:"cypress.config.*"}]},{name:"Turborepo",slug:"turborepo",category:"monorepo",signals:[{type:"devDependency",key:"turbo"},{type:"file",pattern:"turbo.json"}]},{name:"Nx",slug:"nx",category:"monorepo",signals:[{type:"devDependency",key:"nx"},{type:"file",pattern:"nx.json"}]},{name:"Lerna",slug:"lerna",category:"monorepo",signals:[{type:"devDependency",key:"lerna"},{type:"file",pattern:"lerna.json"}]},{name:"MCP SDK",slug:"mcp",category:"ai",signals:[{type:"dependency",key:"@modelcontextprotocol/sdk"}]},{name:"Anthropic SDK",slug:"anthropic",category:"ai",signals:[{type:"dependency",key:"@anthropic-ai/sdk"}]},{name:"OpenAI SDK",slug:"openai",category:"ai",signals:[{type:"dependency",key:"openai"}]},{name:"LangChain",slug:"langchain",category:"ai",signals:[{type:"dependency",key:"langchain"}]},{name:"Vercel",slug:"vercel",category:"hosting",signals:[{type:"file",pattern:"vercel.json"}]},{name:"Netlify",slug:"netlify",category:"hosting",signals:[{type:"file",pattern:"netlify.toml"}]},{name:"Docker",slug:"docker",category:"hosting",signals:[{type:"file",pattern:"Dockerfile"},{type:"file",pattern:"docker-compose.yml"}]},{name:"Cloudflare Workers",slug:"cloudflare",category:"hosting",signals:[{type:"file",pattern:"wrangler.toml"},{type:"dependency",key:"wrangler"}]},{name:"GitHub Actions",slug:"github-actions",category:"cicd",signals:[{type:"file",pattern:".github/workflows/*.yml"}]},{name:"Commander.js",slug:"commander",category:"cli",signals:[{type:"dependency",key:"commander"}]}];function QG($){let Z=K($,"Cargo.toml");if(!M(Z))return null;try{let X=$0(Z,"utf-8").match(/^\s*\[package\][\s\S]*?^\s*name\s*=\s*"([^"]+)"/m);return X?X[1]:null}catch{return null}}function XG($){let Z=K($,"Cargo.toml");if(!M(Z))return!1;try{let Q=$0(Z,"utf-8");return/^\s*\[\[bin\]\]/m.test(Q)}catch{return!1}}function zG($,Z){if(Z?.keywords?.some((X)=>/^sdk(?:\s|-|$)|-sdk$/i.test(X)))return'package.json keywords contains "sdk"';if(Z?.name&&/(?:^|[-_/])sdk(?:[-_/]|$)/i.test(Z.name))return`package.json name "${Z.name}" → sdk`;let Q=QG($);if(Q&&/(?:^|[-_])sdk(?:[-_]|$)/i.test(Q))return`Cargo.toml name "${Q}" → sdk`;return null}function JG($){let Z=["manifest.json","public/manifest.json","src/manifest.json","app/manifest.json","extension/manifest.json","dist/manifest.json"];for(let Q of Z){let X=K($,Q);if(!M(X))continue;try{let z=JSON.parse($0(X,"utf-8"));if(typeof z.manifest_version==="number")return`${Q} manifest_version ${z.manifest_version} (browser extension)`}catch{}}return null}function HG($){let Z=/(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i,Q=K($,"pyproject.toml");if(M(Q))try{let J=$0(Q,"utf-8").match(Z);if(J)return`pyproject.toml depends on ${J[1]}`}catch{}let X=K($,"requirements.txt");if(M(X))try{let J=$0(X,"utf-8").match(Z);if(J)return`requirements.txt contains ${J[1]}`}catch{}return null}function UG($,Z){let Q=["react-native","expo","@capacitor/core","@ionic/core"];if(Z){for(let X of Q)if(Z.dependencies?.[X]||Z.devDependencies?.[X])return`${X} dependency`}if(M(K($,"ios"))&&M(K($,"android")))return"ios/ + android/ dirs";return null}function qG($,Z){let Q=K($,"Cargo.toml");if(M(Q))try{let z=$0(Q,"utf-8");if(/crate-type\s*=\s*\[[^\]]*"cdylib"/.test(z))return'Cargo.toml crate-type = ["cdylib"]';if(/wasm-bindgen|wasm-pack/i.test(z))return"Cargo.toml wasm-bindgen/wasm-pack"}catch{}let X=K($,"build.zig");if(M(X))try{let z=$0(X,"utf-8");if(/\.wasm\b|wasm32|setOutputFormat\(\.wasm/i.test(z))return"build.zig wasm target"}catch{}if(Z?.keywords?.some((z)=>/^wasm(?:-|$)|webassembly/i.test(z)))return'package.json keywords contains "wasm"';return null}function YG($,Z){if(!M(K($,"index.html")))return null;if(Z?.dependencies||Z?.devDependencies){let Q={...Z.dependencies??{},...Z.devDependencies??{}};if(["react","vue","svelte","@sveltejs/kit","next","nuxt","astro","gatsby","solid-js","qwik"].some((z)=>Q[z]))return null}return"index.html (vanilla, no frontend framework)"}function BG($,Z){if(Z?.name&&/specification|^@.*\/spec/i.test(Z.name))return`package name "${Z.name}" → documentation`;if(Z?.keywords?.some((Q)=>/^(specification|format-spec|standard)$/i.test(Q)))return'package keywords contains "specification"';if(Z?.bin)return null;if(Z?.files&&Z.files.length>0){let Q=/^(dist|src|lib|build|bin)(\/|$)|\/(dist|src|lib|build|bin)(\/|$)|(\.|\/)(js|ts|tsx|jsx|mjs|cjs|py|rs|go)$/,X=Z.files.some((J)=>Q.test(J)),z=Z.files.some((J)=>/\.(md|MD)$|examples?\//.test(J)||J==="README.md"||J==="docs"||J==="docs/");if(!X&&z)return"package.json files = docs/examples only (no source)"}return null}function GG($,Z,Q){let X=Q.find((z)=>z.slug==="astro"||z.slug==="gatsby");if(X)return`${X.name} (static-site framework)`;if(Z?.keywords?.some((z)=>/^(website|marketing|landing|brochure|portfolio)$/i.test(z)))return'package keywords contains "website"/"marketing"/"landing"';return null}function VG($,Z){if(!Z)return null;let Q={...Z.dependencies??{},...Z.devDependencies??{}},X=["@clerk/nextjs","@clerk/clerk-react","next-auth","@auth/core","auth0","@auth0/nextjs-auth0"],z=["stripe","@stripe/stripe-js","lemonsqueezy"],J=X.some((U)=>Q[U]),H=z.some((U)=>Q[U]);if(J&&H)return"auth + payment dependencies";return null}function WG($,Z,Q){if(Z?.keywords?.some((J)=>/mcpaas/i.test(J)))return'package keywords contains "mcpaas"';if(Z?.name&&/mcpaas/i.test(Z.name))return`package name "${Z.name}" → mcpaas`;let X=Q.some((J)=>J.slug==="mcp"),z=Q.some((J)=>J.category==="database");if(X&&z&&Z?.dependencies&&Object.keys(Z.dependencies).length>10)return"MCP + database + complex deps (platform shape)";return null}function _G($,Z){if(!Z?.private)return null;if(!(!!Z.workspaces||M(K($,"pnpm-workspace.yaml"))))return null;return"private workspace + multi-package"}var OG=new Set(["node_modules","dist","build","out","vendor","target","coverage","docs","doc","e2e","tests","test","__tests__","scripts","deploy","bin","public","examples","example","fixtures","assets","static","migrations","config","contracts","proto","protos"]),M4=/^(Python|Go|Rust|Ruby|Java|Kotlin)$/,DG=new Set(["frontend","backend","database","css","ui","state"]);function IG($){if(M(K($,"pyproject.toml"))||M(K($,"manage.py"))||M(K($,"setup.py"))||n2($,"requirements*.txt"))return!0;if(M(K($,"go.mod")))return!0;if(M(K($,"Cargo.toml")))return!0;if(M(K($,"Gemfile")))return!0;if(M(K($,"pom.xml"))||n2($,"build.gradle*"))return!0;if(s0($).length>0)return!0;let Z=D0($);if(Z&&Object.keys(Z.dependencies??{}).length>0)return!0;return!1}function s2($){let Z;try{Z=u8($,{withFileTypes:!0})}catch{return[]}let Q=[];for(let X of Z){if(!X.isDirectory()||X.name.startsWith(".")||OG.has(X.name))continue;let z=K($,X.name);if(!IG(z))continue;let J=t2(z);if(J==="Unknown")continue;let H=o2(z).filter((B)=>DG.has(B.category)),U=H.find((B)=>B.category==="frontend"),q=H.find((B)=>B.category==="backend"),Y=U??q??H[0]??null;Q.push({name:X.name,language:J,topFramework:Y?.name??null,frontend:!!U,backend:!!q||M4.test(J),hasFramework:!!Y,appRoot:M(K(z,"manage.py"))||M(K(z,"config.ru"))||M(K(z,"bin/rails"))||M(K(z,"artisan"))})}return Q}function KG($,Z){if(Z?.workspaces||M(K($,"pnpm-workspace.yaml")))return null;let Q=s2($),X=new Set(Q.map((z)=>z.language));if(Q.length<2||X.size<2)return null;if(!Q.some((z)=>z.frontend)||!Q.some((z)=>z.backend))return null;return`polyglot: ${Q.map((z)=>`${z.name}/ (${z.language})`).join(", ")}`}function L4($){let Z=s2($);if(Z.length<2)return null;let Q=(H)=>(H.appRoot?2:0)+(M4.test(H.language)?2:0)+(H.hasFramework?1:0)+(H.frontend?0.5:0),X=[...Z].sort((H,U)=>Q(U)-Q(H)),z=new Set,J=[];for(let H of X){if(z.has(H.language))continue;z.add(H.language);let U=H.frontend?"frontend":H.backend?"backend":"service";J.push(H.topFramework?`${H.language} (${H.topFramework} · ${U})`:`${H.language} (${U})`)}return J.join("; ")}function D0($){let Z=K($,"package.json");if(!M(Z))return null;try{return JSON.parse($0(Z,"utf-8"))}catch{return null}}function n2($,Z){if(!Z.includes("*"))return M(K($,Z));let Q=Z.split("/");if(Q.length===1){let U=Z.split("*")[0];try{return u8($).some((q)=>q.startsWith(U))}catch{return!1}}let X=K($,...Q.slice(0,-1)),z=Q[Q.length-1],J=z.split("*")[0],H=z.split("*")[1]||"";try{return u8(X).some((U)=>U.startsWith(J)&&U.endsWith(H))}catch{return!1}}function MG($,Z,Q){switch($.type){case"dependency":return!!Z?.dependencies?.[$.key];case"devDependency":return!!Z?.devDependencies?.[$.key];case"file":return n2(Q,$.pattern);case"content":{if(!$.pattern||!$.key)return!1;if(!n2(Q,$.pattern))return!1;try{let X=K(Q,$.pattern);if(!M(X))return!1;return $0(X,"utf-8").toLowerCase().includes($.key.toLowerCase())}catch{return!1}}default:return!1}}function o2($){let Z=D0($);return K4.map((Q)=>{let z=Q.signals.filter((J)=>MG(J,Z,$)).length/Q.signals.length;return{name:Q.name,slug:Q.slug,category:Q.category,confidence:z}}).filter((Q)=>Q.confidence>0).sort((Q,X)=>X.confidence-Q.confidence)}function t2($){let Z=D0($);if(Z?.devDependencies?.typescript||Z?.dependencies?.typescript)return"TypeScript";if(M(K($,"tsconfig.json")))return"TypeScript";if(M(K($,"Cargo.toml")))return"Rust";if(M(K($,"go.mod")))return"Go";if(s0($).length>0)return"C#";if(M(K($,"pyproject.toml"))||M(K($,"setup.py")))return"Python";if(M(K($,"Gemfile")))return"Ruby";if(x8($)){let Q=E1($);if(Q)return Q.mainLanguage==="Java/Kotlin"?"Kotlin":Q.mainLanguage;return"Java"}if(M(K($,"Package.swift")))return"Swift";if(M(K($,"build.zig")))return"Zig";if(M(K($,"pubspec.yaml")))return"Dart";if(Z)return"JavaScript";return"Unknown"}function R4($){let Z=D0($),Q=o2($),X=[],z=BG($,Z);if(z)return X.push(z),{type:"documentation",found:X};let J=zG($,Z);if(J)return X.push(J),{type:"sdk",found:X};let H=JG($);if(H)return X.push(H),{type:"extension",found:X};let U=WG($,Z,Q);if(U)return X.push(U),{type:"mcpaas",found:X};let q=VG($,Z);if(q)return X.push(q),{type:"saas",found:X};let Y=qG($,Z);if(Y)return X.push(Y),{type:"wasm",found:X};let B=m2($);if(B)return X.push(B.found),{type:B.appType,found:X};let G=d2($);if(G)return X.push(G.found),{type:G.appType,found:X};let V=i2($);if(V)return X.push(V.found),{type:V.appType,found:X};let _=E1($);if(_)return X.push(_.found),{type:_.appType,found:X};let D=a2($);if(D)return X.push(D.found),{type:D.appType,found:X};let W=y1($);if(W)return X.push(W.found),{type:W.appType,found:X};let O=UG($,Z);if(O)return X.push(O),{type:"mobile",found:X};if(Q.some((g)=>g.slug==="mcp"))return X.push("MCP SDK signal"),{type:"mcp",found:X};if(Z?.bin)return X.push("package.json bin"),{type:"cli",found:X};if(XG($))return X.push("Cargo.toml [[bin]]"),{type:"cli",found:X};if(M(K($,"build.zig"))){if(X.push("build.zig"),M(K($,"src/main.zig")))return X.push("src/main.zig"),{type:"cli",found:X};if(M(K($,"src/root.zig")))return X.push("src/root.zig"),{type:"library",found:X}}let R=Q.some((g)=>g.slug==="svelte"||g.slug==="sveltekit");if(Z?.private===!0&&(M(K($,"pnpm-workspace.yaml"))||Z?.workspaces!==void 0)&&R)return X.push("private workspace","Svelte"),{type:"framework",found:X};if(R)return X.push("Svelte/SvelteKit"),{type:"svelte",found:X};let P=Q.some((g)=>g.category==="frontend"),T=Q.some((g)=>g.category==="backend");if(Z?.private&&(Z.workspaces||M(K($,"pnpm-workspace.yaml")))&&P&&T)return X.push("private workspace + frontend + backend frameworks"),{type:"enterprise",found:X};let A=_G($,Z);if(A)return X.push(A),{type:"monorepo-root",found:X};let C=GG($,Z,Q);if(C)return X.push(C),{type:"website",found:X};if(Q.some((g)=>g.slug==="nextjs"||g.slug==="nuxt"))return X.push(Q.find((g)=>g.slug==="nextjs")?"Next.js":"Nuxt"),{type:"fullstack",found:X};let S=Q.some((g)=>g.category==="frontend"),E=Q.some((g)=>g.category==="backend");if(S&&E)return X.push("frontend framework","backend framework"),{type:"fullstack",found:X};if(S)return X.push("frontend framework"),{type:"frontend",found:X};if(E)return X.push("backend framework"),{type:"backend",found:X};let d=HG($);if(d)return X.push(d),{type:"data-science",found:X};let j=YG($,Z);if(j)return X.push(j),{type:"html",found:X};let I0=KG($,Z);if(I0)return X.push(I0),{type:"fullstack",found:X};if(Z?.main&&!Z?.bin)return X.push("package.json main (no bin)"),{type:"library",found:X};return X.push("no classifying signals — fallback"),{type:"library",found:X}}function F4($){if(M(K($,"bunfig.toml")))return"Bun";if(M(K($,"deno.json"))||M(K($,"deno.jsonc")))return"Deno";if(D0($))return"Node.js";if(M(K($,"Cargo.toml")))return"Rust";if(M(K($,"go.mod")))return"Go";if(s0($).length>0)return".NET";if(M(K($,"pubspec.yaml")))return"Dart";return"Unknown"}function N4($){if(M(K($,"pubspec.yaml")))return"pub";if(M(K($,"go.mod")))return"go modules";if(s0($).length>0)return"NuGet";if(M(K($,"pom.xml")))return"maven";if(M(K($,"build.gradle"))||M(K($,"build.gradle.kts"))||M(K($,"settings.gradle"))||M(K($,"settings.gradle.kts")))return"gradle";if(M(K($,"bun.lockb"))||M(K($,"bun.lock")))return"bun";if(M(K($,"pnpm-lock.yaml")))return"pnpm";if(M(K($,"yarn.lock")))return"yarn";if(M(K($,"package-lock.json")))return"npm";return"npm"}function A4($){if(M(K($,".github/workflows")))return"GitHub Actions";if(M(K($,".gitlab-ci.yml")))return"GitLab CI";if(M(K($,".circleci")))return"CircleCI";if(M(K($,"Jenkinsfile")))return"Jenkins";return null}function P4($){if(M(K($,"vercel.json")))return"Vercel";if(M(K($,"netlify.toml")))return"Netlify";if(M(K($,"wrangler.toml")))return"Cloudflare";if(M(K($,"Dockerfile")))return"Docker";if(M(K($,"fly.toml")))return"Fly.io";if(M(K($,"render.yaml")))return"Render";return null}function T4($){let Z=K($,"svelte.config.js");if(!M(Z))return null;try{let X=$0(Z,"utf-8").match(/@sveltejs\/adapter-(\w+)/);if(X){let z=X[1];switch(z){case"vercel":return"Vercel";case"node":return"Node";case"static":return"Static";case"cloudflare":return"Cloudflare";case"netlify":return"Netlify";case"auto":return"Auto";default:return z}}return null}catch{return null}}function C4($){let Z=D0($);if(Z?.devDependencies?.vite||Z?.dependencies?.vite)return"Vite";if(Z?.devDependencies?.webpack||Z?.dependencies?.webpack)return"webpack";if(Z?.devDependencies?.esbuild||Z?.dependencies?.esbuild)return"esbuild";if(M(K($,"tsconfig.json"))&&Z?.devDependencies?.typescript)return"TypeScript (tsc)";return null}function w4($){return["package.json","Cargo.toml","pyproject.toml","go.mod","build.zig","build.zig.zon","src/index.ts","src/index.js","src/main.ts","src/cli.ts","src/main.rs","src/lib.rs","src/main.zig","src/root.zig","src/__init__.py","main.py","__main__.py","main.go","cmd/main.go","README.md","SPECIFICATION.md","BINARY-FORMAT.md","tsconfig.json","wrangler.toml","vercel.json"].filter((Q)=>M(K($,Q)))}function b4($,Z){let Q={};if(Z?.scripts){for(let X of["build","test","lint","dev","start"])if(Z.scripts[X]){let z=M(K($,"bun.lock"))||M(K($,"bun.lockb"))?"bun run":"npm run";Q[X]=`${z} ${X}`}}if(M(K($,"Cargo.toml"))){if(!Q.build)Q.build="cargo build --release";if(!Q.test)Q.test="cargo test";if(!Q.lint)Q.lint="cargo clippy"}if(M(K($,"build.zig"))){if(!Q.build)Q.build="zig build";if(!Q.test)Q.test="zig build test"}if(M(K($,"go.mod"))){if(!Q.build)Q.build="go build ./...";if(!Q.test)Q.test="go test ./..."}if(M(K($,"pyproject.toml"))||M(K($,"pytest.ini"))){if(!Q.test)Q.test="pytest"}return Q}function E4($,Z,Q,X){let z=[];if(X&&X!=="Unknown")z.push(X);let J=new Set(["frontend","backend","database","build","css","state","monorepo"]);for(let H of Q)if(J.has(H.category))z.push(H.name);if(M(K($,"bunfig.toml")))z.push("Bun");else if(M(K($,"deno.json"))||M(K($,"deno.jsonc")))z.push("Deno");if(z.length<3&&Z?.dependencies){let H=Object.keys(Z.dependencies).slice(0,5);for(let U of H)if(!z.some((q)=>q.toLowerCase().includes(U.toLowerCase())))z.push(U)}return z}function S4($){let Z=D0($),Q=o2($),X=R4($),z=X.type,J=X.found.some((b)=>b.startsWith("polyglot:")),H=J&&L4($)||t2($),U=F4($),q=N4($),Y=A4($),B=P4($),G=C4($),V=Q.find((b)=>b.category==="frontend"),_=Q.find((b)=>b.category==="css"),D=Q.find((b)=>b.category==="ui"),W=Q.find((b)=>b.category==="state"),O=Q.find((b)=>b.category==="backend"),I=Q.find((b)=>b.category==="database"),R=S0[z]||S0.library,N=z==="framework",P=Q.some((b)=>b.slug==="svelte"||b.slug==="sveltekit"),T=N&&P?"svelte":N?null:null,A=z==="svelte"||T==="svelte",C=A?T4($):null,L=A&&Q.some((b)=>b.slug==="sveltekit"),S=new Set(["css_framework","ui_library","database","connection","hosting"]),E={},d=v.filter((b)=>b.path.startsWith("stack."));for(let b of d){let x=b.path.replace("stack.","");if(!R.includes(b.category)){E[x]="slotignored";continue}if(N&&S.has(x)){E[x]="slotignored";continue}switch(x){case"frontend":E[x]=V?.name??(z==="cli"?"CLI":"");break;case"css_framework":E[x]=_?.name??"";break;case"ui_library":E[x]=D?.name??"";break;case"state_management":E[x]=A?W?.name??"Runes":W?.name??"";break;case"backend":E[x]=A?L?"SvelteKit":O?.name??"":O?.name??"";break;case"api_type":E[x]=L?"Server Routes":"";break;case"runtime":E[x]=U!=="Unknown"?U:"";break;case"database":E[x]=I?.name??"";break;case"connection":E[x]=I?.name??"";break;case"hosting":if(A&&C)E[x]=C;else E[x]=B??"";break;case"build":E[x]=A?"Vite":G??"";break;case"cicd":E[x]=Y??"";break;case"package_manager":E[x]=q;break;default:E[x]="";break}}let j={},I0=v.filter((b)=>b.path.startsWith("monorepo."));for(let b of I0){let x=b.path.replace("monorepo.","");if(!R.includes(b.category))j[x]="slotignored";else j[x]=""}let g={name:Z?.name??$.split("/").pop()??"project",goal:J?"":Z?.description??"",main_language:H,type:z};if(N&&T)g.framework=T;let m1=E4($,Z,Q,J?t2($):H);if(J){for(let b of s2($))for(let x of[b.language,b.topFramework])if(x&&!m1.includes(x))m1.push(x)}let r8=w4($),a8=b4($,Z),l1={faf_version:I4,project:g,stack:E,human_context:{who:"",what:J?"":Z?.description??"",why:"",where:"",when:"",how:""},monorepo:j,_meta:{found:X.found}};if(m1.length>0)l1.tech_stack=m1;if(r8.length>0)l1.key_files=r8;if(Object.keys(a8).length>0)l1.commands=a8;return l1}import{existsSync as RG,readFileSync as FG}from"fs";import{join as NG}from"path";var j4={MIN_LENGTH:8,MAX_LENGTH:280},LG=[/^(see|see\s+the?)\s+readme/i,/^(tbd|todo|fixme|coming\s+soon)\b/i,/^(software|application|app|project|tool|library|framework)\.?$/i,/^(for\s+users|for\s+developers)\.?$/i,/^(description|goal|name|title)\.?$/i,/^lorem\s+ipsum/i,/^example(\s+\w+)?\.?$/i];function s($){let Z=$.trim();if(Z.length<j4.MIN_LENGTH)return!1;if(Z.length>j4.MAX_LENGTH)return!1;if(LG.some((Q)=>Q.test(Z)))return!1;if(/^[\s|\-*+]/.test(Z))return!1;if(Z.split(`
|
|
224
|
-
`).length>4)return!1;return!0}function
|
|
223
|
+
`).replace(/<[^>]+>/g,"").replace(/!\[[^\]]*\]\([^)]*\)/g,"").trim()}function b0($){return $.replace(/\s+/g," ").replace(/[#*`>]/g,"").trim().slice(0,280)}function nB($){if(!$)return 0;return($.match(/\[[^\]]*\]\([^)]*\)/g)??[]).join("").length/$.length}function o0($,Z){let Q=new RegExp(`##?\\s+(${Z})\\s*\\n+([\\s\\S]+?)(?:\\n\\n|\\n##?|$)`,"i"),X=$.match(Q);if(!X||!X[2]||X[2].trim().length<=20||nB(X[2])>0.4)return null;return{body:b0(X[2]),heading:X[1].trim()}}function sB($){let Z=$.trim();if(/^>/.test(Z))return!0;if(/\b(nightly (release|build)|pre-?release|work[-\s]in[-\s]progress|rough edges|early (access|testing|preview)|use at your own risk|not (yet )?production[-\s]?ready|expect (rough|breaking)|experimental release)\b/i.test(Z))return!0;let Q=Z.split(/[·|]/).map((X)=>X.trim()).filter(Boolean);if(Q.length>=3&&Q.every((X)=>X.length<=24))return!0;return!1}function v1($,Z,Q=30){for(let X of Z){let z=$.match(X);if(z&&z[1]&&z[1].trim().length>=Q)return b0(z[1])}return null}function oB($,Z){if($?.description&&$.description.length>20)return f(b0($.description),"package.json:description",0.95);let Q=o0(Z,"Purpose|What|About|Overview|Description");if(Q)return f(Q.body,`README:## ${Q.heading}`,0.8);let X=Z.split(/\n\s*\n/).map((J)=>J.replace(/\s+/g," ").trim()).find((J)=>J.length>30&&!J.startsWith("#")&&!sB(J));if(X)return f(b0(X),"README:first-paragraph",0.5);let z=v1(Z,[/(?:core|main|primary)\s+(?:problem|challenge)(?:\s+is)?\s*:?\s*([^.\n]{30,})/i,/solves?\s+(?:the\s+)?(?:problem\s+of\s+)?([^.\n]{30,})/i]);return z?f(z,"README:problem-heuristic",0.6):null}function tB($){let Z=o0($,"Audience|Who|Who is this for|Who it.s for");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/\b(?:designed|built|made)\s+for\s+((?:[a-z][a-z-]*\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\n]{0,80})/i,/\bfor\s+((?:[a-z][a-z-]*\s+)?(?:developers?|teams?|engineers?|builders?|founders?)[^.\n]{0,80})/i],8);return Q?f(Q,"README:audience-heuristic",0.6):null}function eB($){let Z=o0($,"Why|Mission|Motivation|Rationale|Vision");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/(?:our\s+|the\s+)?(?:mission|purpose|goal)\s+is\s+([^.\n]{30,})/i,/\b(?:mission|purpose|goal)\s*:\s*([^.\n]{30,})/i,/(?:built|created|designed)\s+(?:because|to)\s+([^.\n]{30,})/i]);return Q?f(Q,"README:mission-heuristic",0.6):null}function $G($,Z){let Q=typeof $?.repository==="string"?$.repository:$?.repository?.url;if(Q)return f(b0(Q.replace(/^git\+/,"").replace(/\.git$/,"")),"package.json:repository",0.95);if($?.homepage)return f(b0($.homepage),"package.json:homepage",0.9);let X=v1(Z,[/\b(?:deployed|hosted|available|published)\s+(?:on|at|via)\s+([^.\n]{3,80})/i],3);return X?f(X,"README:deploy-heuristic",0.6):null}function ZG($){let Z=o0($,"Timeline|Status|Release|Roadmap");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=v1($,[/\b(production\s+since\s+[^.\n]{4,60})/i,/\b((?:in\s+)?(?:production|beta|alpha|development)\s+since\s+[^.\n]{4,60})/i,/\bsince\s+((?:[A-Z][a-z]+\s+)?\d{4}[^.\n]{0,40})/],4);return Q?f(Q,"README:since-heuristic",0.6):null}function QG($,Z){let Q=$?.scripts?Object.keys($.scripts):[],X=["start","dev","build"].filter((H)=>Q.includes(H));if(X.length)return f(b0(X.map((H)=>`npm run ${H}`).join(", ")),"package.json:scripts",0.9);let z=o0(Z,"Usage|Getting Started|Install|Installation|Quick Start");if(z)return f(z.body,`README:## ${z.heading}`,0.8);let J=o0(Z,"Architecture|Approach|How it works|Methodology|How");return J?f(J.body,`README:## ${J.heading}`,0.7):null}var I4="3.0";import{existsSync as M,readFileSync as $0,readdirSync as u8}from"fs";import{join as K}from"path";var K4=[{name:"Next.js",slug:"nextjs",category:"frontend",signals:[{type:"dependency",key:"next"},{type:"file",pattern:"next.config.*"}]},{name:"React",slug:"react",category:"frontend",signals:[{type:"dependency",key:"react"}]},{name:"SvelteKit",slug:"sveltekit",category:"frontend",signals:[{type:"dependency",key:"@sveltejs/kit"},{type:"file",pattern:"svelte.config.*"}]},{name:"Svelte",slug:"svelte",category:"frontend",signals:[{type:"dependency",key:"svelte"},{type:"devDependency",key:"svelte"}]},{name:"Vue.js",slug:"vue",category:"frontend",signals:[{type:"dependency",key:"vue"}]},{name:"Nuxt",slug:"nuxt",category:"frontend",signals:[{type:"dependency",key:"nuxt"},{type:"file",pattern:"nuxt.config.*"}]},{name:"Angular",slug:"angular",category:"frontend",signals:[{type:"dependency",key:"@angular/core"},{type:"file",pattern:"angular.json"}]},{name:"Astro",slug:"astro",category:"frontend",signals:[{type:"dependency",key:"astro"},{type:"file",pattern:"astro.config.*"}]},{name:"Solid",slug:"solid",category:"frontend",signals:[{type:"dependency",key:"solid-js"}]},{name:"Remix",slug:"remix",category:"frontend",signals:[{type:"dependency",key:"@remix-run/react"}]},{name:"Gatsby",slug:"gatsby",category:"frontend",signals:[{type:"dependency",key:"gatsby"},{type:"file",pattern:"gatsby-config.*"}]},{name:"Qwik",slug:"qwik",category:"frontend",signals:[{type:"dependency",key:"@builder.io/qwik"}]},{name:"Vercel (SvelteKit)",slug:"adapter-vercel",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-vercel"},{type:"devDependency",key:"@sveltejs/adapter-vercel"}]},{name:"Node (SvelteKit)",slug:"adapter-node",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-node"},{type:"devDependency",key:"@sveltejs/adapter-node"}]},{name:"Static (SvelteKit)",slug:"adapter-static",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-static"},{type:"devDependency",key:"@sveltejs/adapter-static"}]},{name:"Cloudflare (SvelteKit)",slug:"adapter-cloudflare",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-cloudflare"},{type:"devDependency",key:"@sveltejs/adapter-cloudflare"}]},{name:"Netlify (SvelteKit)",slug:"adapter-netlify",category:"hosting",signals:[{type:"dependency",key:"@sveltejs/adapter-netlify"},{type:"devDependency",key:"@sveltejs/adapter-netlify"}]},{name:"Tailwind CSS",slug:"tailwind",category:"css",signals:[{type:"dependency",key:"tailwindcss"},{type:"devDependency",key:"tailwindcss"},{type:"file",pattern:"tailwind.config.*"}]},{name:"Bootstrap",slug:"bootstrap",category:"css",signals:[{type:"dependency",key:"bootstrap"}]},{name:"Styled Components",slug:"styled-components",category:"css",signals:[{type:"dependency",key:"styled-components"}]},{name:"shadcn/ui",slug:"shadcn",category:"ui",signals:[{type:"file",pattern:"components.json"},{type:"dependency",key:"@radix-ui/react-dialog"}]},{name:"Material UI",slug:"mui",category:"ui",signals:[{type:"dependency",key:"@mui/material"}]},{name:"Chakra UI",slug:"chakra",category:"ui",signals:[{type:"dependency",key:"@chakra-ui/react"}]},{name:"Ant Design",slug:"antd",category:"ui",signals:[{type:"dependency",key:"antd"}]},{name:"Redux",slug:"redux",category:"state",signals:[{type:"dependency",key:"@reduxjs/toolkit"}]},{name:"Zustand",slug:"zustand",category:"state",signals:[{type:"dependency",key:"zustand"}]},{name:"Jotai",slug:"jotai",category:"state",signals:[{type:"dependency",key:"jotai"}]},{name:"Pinia",slug:"pinia",category:"state",signals:[{type:"dependency",key:"pinia"}]},{name:"Express",slug:"express",category:"backend",signals:[{type:"dependency",key:"express"}]},{name:"Fastify",slug:"fastify",category:"backend",signals:[{type:"dependency",key:"fastify"}]},{name:"Hono",slug:"hono",category:"backend",signals:[{type:"dependency",key:"hono"}]},{name:"Elysia",slug:"elysia",category:"backend",signals:[{type:"dependency",key:"elysia"}]},{name:"NestJS",slug:"nestjs",category:"backend",signals:[{type:"dependency",key:"@nestjs/core"}]},{name:"Koa",slug:"koa",category:"backend",signals:[{type:"dependency",key:"koa"}]},{name:"Django",slug:"django",category:"backend",signals:[{type:"file",pattern:"manage.py"},{type:"file",pattern:"settings.py"}]},{name:"Flask",slug:"flask",category:"backend",signals:[{type:"content",pattern:"app.py",key:"flask"}]},{name:"FastAPI",slug:"fastapi",category:"backend",signals:[{type:"content",pattern:"main.py",key:"fastapi"}]},{name:"Rails",slug:"rails",category:"backend",signals:[{type:"content",pattern:"Gemfile",key:"rails"},{type:"content",pattern:"Gemfile.lock",key:"rails ("},{type:"file",pattern:"config/application.rb"},{type:"file",pattern:"config/routes.rb"}]},{name:"Spring Boot",slug:"spring",category:"backend",signals:[{type:"content",pattern:"pom.xml",key:"spring-boot"},{type:"content",pattern:"build.gradle",key:"springframework.boot"},{type:"content",pattern:"build.gradle.kts",key:"springframework.boot"},{type:"content",pattern:"gradle/libs.versions.toml",key:"springframework.boot"}]},{name:"Vapor",slug:"vapor",category:"backend",signals:[{type:"content",pattern:"Package.swift",key:"vapor/vapor"},{type:"content",pattern:"Package.swift",key:'product(name: "Vapor"'},{type:"content",pattern:"Package.swift",key:"product(name: 'Vapor'"},{type:"file",pattern:"Sources/App/configure.swift"}]},{name:"Hummingbird",slug:"hummingbird",category:"backend",signals:[{type:"content",pattern:"Package.swift",key:"hummingbird-project/hummingbird"},{type:"content",pattern:"Package.swift",key:'product(name: "Hummingbird"'},{type:"content",pattern:"Package.swift",key:"product(name: 'Hummingbird'"}]},{name:"Prisma",slug:"prisma",category:"database",signals:[{type:"dependency",key:"prisma"},{type:"devDependency",key:"prisma"},{type:"file",pattern:"prisma/schema.prisma"}]},{name:"Drizzle",slug:"drizzle",category:"database",signals:[{type:"dependency",key:"drizzle-orm"},{type:"file",pattern:"drizzle.config.*"}]},{name:"TypeORM",slug:"typeorm",category:"database",signals:[{type:"dependency",key:"typeorm"}]},{name:"Mongoose",slug:"mongoose",category:"database",signals:[{type:"dependency",key:"mongoose"}]},{name:"Vite",slug:"vite",category:"build",signals:[{type:"dependency",key:"vite"},{type:"devDependency",key:"vite"},{type:"file",pattern:"vite.config.*"}]},{name:"webpack",slug:"webpack",category:"build",signals:[{type:"dependency",key:"webpack"},{type:"devDependency",key:"webpack"},{type:"file",pattern:"webpack.config.*"}]},{name:"esbuild",slug:"esbuild",category:"build",signals:[{type:"dependency",key:"esbuild"},{type:"devDependency",key:"esbuild"}]},{name:"Turbopack",slug:"turbopack",category:"build",signals:[{type:"file",pattern:"turbo.json"}]},{name:"Jest",slug:"jest",category:"testing",signals:[{type:"devDependency",key:"jest"},{type:"file",pattern:"jest.config.*"}]},{name:"Vitest",slug:"vitest",category:"testing",signals:[{type:"devDependency",key:"vitest"}]},{name:"Playwright",slug:"playwright",category:"testing",signals:[{type:"devDependency",key:"@playwright/test"},{type:"file",pattern:"playwright.config.*"}]},{name:"Cypress",slug:"cypress",category:"testing",signals:[{type:"devDependency",key:"cypress"},{type:"file",pattern:"cypress.config.*"}]},{name:"Turborepo",slug:"turborepo",category:"monorepo",signals:[{type:"devDependency",key:"turbo"},{type:"file",pattern:"turbo.json"}]},{name:"Nx",slug:"nx",category:"monorepo",signals:[{type:"devDependency",key:"nx"},{type:"file",pattern:"nx.json"}]},{name:"Lerna",slug:"lerna",category:"monorepo",signals:[{type:"devDependency",key:"lerna"},{type:"file",pattern:"lerna.json"}]},{name:"MCP SDK",slug:"mcp",category:"ai",signals:[{type:"dependency",key:"@modelcontextprotocol/sdk"}]},{name:"Anthropic SDK",slug:"anthropic",category:"ai",signals:[{type:"dependency",key:"@anthropic-ai/sdk"}]},{name:"OpenAI SDK",slug:"openai",category:"ai",signals:[{type:"dependency",key:"openai"}]},{name:"LangChain",slug:"langchain",category:"ai",signals:[{type:"dependency",key:"langchain"}]},{name:"Vercel",slug:"vercel",category:"hosting",signals:[{type:"file",pattern:"vercel.json"}]},{name:"Netlify",slug:"netlify",category:"hosting",signals:[{type:"file",pattern:"netlify.toml"}]},{name:"Docker",slug:"docker",category:"hosting",signals:[{type:"file",pattern:"Dockerfile"},{type:"file",pattern:"docker-compose.yml"}]},{name:"Cloudflare Workers",slug:"cloudflare",category:"hosting",signals:[{type:"file",pattern:"wrangler.toml"},{type:"dependency",key:"wrangler"}]},{name:"GitHub Actions",slug:"github-actions",category:"cicd",signals:[{type:"file",pattern:".github/workflows/*.yml"}]},{name:"Commander.js",slug:"commander",category:"cli",signals:[{type:"dependency",key:"commander"}]}];function XG($){let Z=K($,"Cargo.toml");if(!M(Z))return null;try{let X=$0(Z,"utf-8").match(/^\s*\[package\][\s\S]*?^\s*name\s*=\s*"([^"]+)"/m);return X?X[1]:null}catch{return null}}function zG($){let Z=K($,"Cargo.toml");if(!M(Z))return!1;try{let Q=$0(Z,"utf-8");return/^\s*\[\[bin\]\]/m.test(Q)}catch{return!1}}function JG($,Z){if(Z?.keywords?.some((X)=>/^sdk(?:\s|-|$)|-sdk$/i.test(X)))return'package.json keywords contains "sdk"';if(Z?.name&&/(?:^|[-_/])sdk(?:[-_/]|$)/i.test(Z.name))return`package.json name "${Z.name}" → sdk`;let Q=XG($);if(Q&&/(?:^|[-_])sdk(?:[-_]|$)/i.test(Q))return`Cargo.toml name "${Q}" → sdk`;return null}function HG($){let Z=["manifest.json","public/manifest.json","src/manifest.json","app/manifest.json","extension/manifest.json","dist/manifest.json"];for(let Q of Z){let X=K($,Q);if(!M(X))continue;try{let z=JSON.parse($0(X,"utf-8"));if(typeof z.manifest_version==="number")return`${Q} manifest_version ${z.manifest_version} (browser extension)`}catch{}}return null}function UG($){let Z=/(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i,Q=K($,"pyproject.toml");if(M(Q))try{let J=$0(Q,"utf-8").match(Z);if(J)return`pyproject.toml depends on ${J[1]}`}catch{}let X=K($,"requirements.txt");if(M(X))try{let J=$0(X,"utf-8").match(Z);if(J)return`requirements.txt contains ${J[1]}`}catch{}return null}function qG($,Z){let Q=["react-native","expo","@capacitor/core","@ionic/core"];if(Z){for(let X of Q)if(Z.dependencies?.[X]||Z.devDependencies?.[X])return`${X} dependency`}if(M(K($,"ios"))&&M(K($,"android")))return"ios/ + android/ dirs";return null}function YG($,Z){let Q=K($,"Cargo.toml");if(M(Q))try{let z=$0(Q,"utf-8");if(/crate-type\s*=\s*\[[^\]]*"cdylib"/.test(z))return'Cargo.toml crate-type = ["cdylib"]';if(/wasm-bindgen|wasm-pack/i.test(z))return"Cargo.toml wasm-bindgen/wasm-pack"}catch{}let X=K($,"build.zig");if(M(X))try{let z=$0(X,"utf-8");if(/\.wasm\b|wasm32|setOutputFormat\(\.wasm/i.test(z))return"build.zig wasm target"}catch{}if(Z?.keywords?.some((z)=>/^wasm(?:-|$)|webassembly/i.test(z)))return'package.json keywords contains "wasm"';return null}function BG($,Z){if(!M(K($,"index.html")))return null;if(Z?.dependencies||Z?.devDependencies){let Q={...Z.dependencies??{},...Z.devDependencies??{}};if(["react","vue","svelte","@sveltejs/kit","next","nuxt","astro","gatsby","solid-js","qwik"].some((z)=>Q[z]))return null}return"index.html (vanilla, no frontend framework)"}function GG($,Z){if(Z?.name&&/specification|^@.*\/spec/i.test(Z.name))return`package name "${Z.name}" → documentation`;if(Z?.keywords?.some((Q)=>/^(specification|format-spec|standard)$/i.test(Q)))return'package keywords contains "specification"';if(Z?.bin)return null;if(Z?.files&&Z.files.length>0){let Q=/^(dist|src|lib|build|bin)(\/|$)|\/(dist|src|lib|build|bin)(\/|$)|(\.|\/)(js|ts|tsx|jsx|mjs|cjs|py|rs|go)$/,X=Z.files.some((J)=>Q.test(J)),z=Z.files.some((J)=>/\.(md|MD)$|examples?\//.test(J)||J==="README.md"||J==="docs"||J==="docs/");if(!X&&z)return"package.json files = docs/examples only (no source)"}return null}function VG($,Z,Q){let X=Q.find((z)=>z.slug==="astro"||z.slug==="gatsby");if(X)return`${X.name} (static-site framework)`;if(Z?.keywords?.some((z)=>/^(website|marketing|landing|brochure|portfolio)$/i.test(z)))return'package keywords contains "website"/"marketing"/"landing"';return null}function WG($,Z){if(!Z)return null;let Q={...Z.dependencies??{},...Z.devDependencies??{}},X=["@clerk/nextjs","@clerk/clerk-react","next-auth","@auth/core","auth0","@auth0/nextjs-auth0"],z=["stripe","@stripe/stripe-js","lemonsqueezy"],J=X.some((U)=>Q[U]),H=z.some((U)=>Q[U]);if(J&&H)return"auth + payment dependencies";return null}function _G($,Z,Q){if(Z?.keywords?.some((J)=>/mcpaas/i.test(J)))return'package keywords contains "mcpaas"';if(Z?.name&&/mcpaas/i.test(Z.name))return`package name "${Z.name}" → mcpaas`;let X=Q.some((J)=>J.slug==="mcp"),z=Q.some((J)=>J.category==="database");if(X&&z&&Z?.dependencies&&Object.keys(Z.dependencies).length>10)return"MCP + database + complex deps (platform shape)";return null}function OG($,Z){if(!Z?.private)return null;if(!(!!Z.workspaces||M(K($,"pnpm-workspace.yaml"))))return null;return"private workspace + multi-package"}var DG=new Set(["node_modules","dist","build","out","vendor","target","coverage","docs","doc","e2e","tests","test","__tests__","scripts","deploy","bin","public","examples","example","fixtures","assets","static","migrations","config","contracts","proto","protos"]),M4=/^(Python|Go|Rust|Ruby|Java|Kotlin)$/,IG=new Set(["frontend","backend","database","css","ui","state"]);function KG($){if(M(K($,"pyproject.toml"))||M(K($,"manage.py"))||M(K($,"setup.py"))||n2($,"requirements*.txt"))return!0;if(M(K($,"go.mod")))return!0;if(M(K($,"Cargo.toml")))return!0;if(M(K($,"Gemfile")))return!0;if(M(K($,"pom.xml"))||n2($,"build.gradle*"))return!0;if(s0($).length>0)return!0;let Z=D0($);if(Z&&Object.keys(Z.dependencies??{}).length>0)return!0;return!1}function s2($){let Z;try{Z=u8($,{withFileTypes:!0})}catch{return[]}let Q=[];for(let X of Z){if(!X.isDirectory()||X.name.startsWith(".")||DG.has(X.name))continue;let z=K($,X.name);if(!KG(z))continue;let J=t2(z);if(J==="Unknown")continue;let H=o2(z).filter((B)=>IG.has(B.category)),U=H.find((B)=>B.category==="frontend"),q=H.find((B)=>B.category==="backend"),Y=U??q??H[0]??null;Q.push({name:X.name,language:J,topFramework:Y?.name??null,frontend:!!U,backend:!!q||M4.test(J),hasFramework:!!Y,appRoot:M(K(z,"manage.py"))||M(K(z,"config.ru"))||M(K(z,"bin/rails"))||M(K(z,"artisan"))})}return Q}function MG($,Z){if(Z?.workspaces||M(K($,"pnpm-workspace.yaml")))return null;let Q=s2($),X=new Set(Q.map((z)=>z.language));if(Q.length<2||X.size<2)return null;if(!Q.some((z)=>z.frontend)||!Q.some((z)=>z.backend))return null;return`polyglot: ${Q.map((z)=>`${z.name}/ (${z.language})`).join(", ")}`}function L4($){let Z=s2($);if(Z.length<2)return null;let Q=(H)=>(H.appRoot?2:0)+(M4.test(H.language)?2:0)+(H.hasFramework?1:0)+(H.frontend?0.5:0),X=[...Z].sort((H,U)=>Q(U)-Q(H)),z=new Set,J=[];for(let H of X){if(z.has(H.language))continue;z.add(H.language);let U=H.frontend?"frontend":H.backend?"backend":"service";J.push(H.topFramework?`${H.language} (${H.topFramework} · ${U})`:`${H.language} (${U})`)}return J.join("; ")}function D0($){let Z=K($,"package.json");if(!M(Z))return null;try{return JSON.parse($0(Z,"utf-8"))}catch{return null}}function n2($,Z){if(!Z.includes("*"))return M(K($,Z));let Q=Z.split("/");if(Q.length===1){let U=Z.split("*")[0];try{return u8($).some((q)=>q.startsWith(U))}catch{return!1}}let X=K($,...Q.slice(0,-1)),z=Q[Q.length-1],J=z.split("*")[0],H=z.split("*")[1]||"";try{return u8(X).some((U)=>U.startsWith(J)&&U.endsWith(H))}catch{return!1}}function LG($,Z,Q){switch($.type){case"dependency":return!!Z?.dependencies?.[$.key];case"devDependency":return!!Z?.devDependencies?.[$.key];case"file":return n2(Q,$.pattern);case"content":{if(!$.pattern||!$.key)return!1;if(!n2(Q,$.pattern))return!1;try{let X=K(Q,$.pattern);if(!M(X))return!1;return $0(X,"utf-8").toLowerCase().includes($.key.toLowerCase())}catch{return!1}}default:return!1}}function o2($){let Z=D0($);return K4.map((Q)=>{let z=Q.signals.filter((J)=>LG(J,Z,$)).length/Q.signals.length;return{name:Q.name,slug:Q.slug,category:Q.category,confidence:z}}).filter((Q)=>Q.confidence>0).sort((Q,X)=>X.confidence-Q.confidence)}function t2($){let Z=D0($);if(Z?.devDependencies?.typescript||Z?.dependencies?.typescript)return"TypeScript";if(M(K($,"tsconfig.json")))return"TypeScript";if(M(K($,"Cargo.toml")))return"Rust";if(M(K($,"go.mod")))return"Go";if(s0($).length>0)return"C#";if(M(K($,"pyproject.toml"))||M(K($,"setup.py")))return"Python";if(M(K($,"Gemfile")))return"Ruby";if(x8($)){let Q=E1($);if(Q)return Q.mainLanguage==="Java/Kotlin"?"Kotlin":Q.mainLanguage;return"Java"}if(M(K($,"Package.swift")))return"Swift";if(M(K($,"build.zig")))return"Zig";if(M(K($,"pubspec.yaml")))return"Dart";if(Z)return"JavaScript";return"Unknown"}function R4($){let Z=D0($),Q=o2($),X=[],z=GG($,Z);if(z)return X.push(z),{type:"documentation",found:X};let J=JG($,Z);if(J)return X.push(J),{type:"sdk",found:X};let H=HG($);if(H)return X.push(H),{type:"extension",found:X};let U=_G($,Z,Q);if(U)return X.push(U),{type:"mcpaas",found:X};let q=WG($,Z);if(q)return X.push(q),{type:"saas",found:X};let Y=YG($,Z);if(Y)return X.push(Y),{type:"wasm",found:X};let B=m2($);if(B)return X.push(B.found),{type:B.appType,found:X};let G=d2($);if(G)return X.push(G.found),{type:G.appType,found:X};let V=i2($);if(V)return X.push(V.found),{type:V.appType,found:X};let _=E1($);if(_)return X.push(_.found),{type:_.appType,found:X};let D=a2($);if(D)return X.push(D.found),{type:D.appType,found:X};let W=y1($);if(W)return X.push(W.found),{type:W.appType,found:X};let O=qG($,Z);if(O)return X.push(O),{type:"mobile",found:X};if(Q.some((g)=>g.slug==="mcp"))return X.push("MCP SDK signal"),{type:"mcp",found:X};if(Z?.bin)return X.push("package.json bin"),{type:"cli",found:X};if(zG($))return X.push("Cargo.toml [[bin]]"),{type:"cli",found:X};if(M(K($,"build.zig"))){if(X.push("build.zig"),M(K($,"src/main.zig")))return X.push("src/main.zig"),{type:"cli",found:X};if(M(K($,"src/root.zig")))return X.push("src/root.zig"),{type:"library",found:X}}let R=Q.some((g)=>g.slug==="svelte"||g.slug==="sveltekit");if(Z?.private===!0&&(M(K($,"pnpm-workspace.yaml"))||Z?.workspaces!==void 0)&&R)return X.push("private workspace","Svelte"),{type:"framework",found:X};if(R)return X.push("Svelte/SvelteKit"),{type:"svelte",found:X};let P=Q.some((g)=>g.category==="frontend"),T=Q.some((g)=>g.category==="backend");if(Z?.private&&(Z.workspaces||M(K($,"pnpm-workspace.yaml")))&&P&&T)return X.push("private workspace + frontend + backend frameworks"),{type:"enterprise",found:X};let A=OG($,Z);if(A)return X.push(A),{type:"monorepo-root",found:X};let C=VG($,Z,Q);if(C)return X.push(C),{type:"website",found:X};if(Q.some((g)=>g.slug==="nextjs"||g.slug==="nuxt"))return X.push(Q.find((g)=>g.slug==="nextjs")?"Next.js":"Nuxt"),{type:"fullstack",found:X};let S=Q.some((g)=>g.category==="frontend"),E=Q.some((g)=>g.category==="backend");if(S&&E)return X.push("frontend framework","backend framework"),{type:"fullstack",found:X};if(S)return X.push("frontend framework"),{type:"frontend",found:X};if(E)return X.push("backend framework"),{type:"backend",found:X};let d=UG($);if(d)return X.push(d),{type:"data-science",found:X};let j=BG($,Z);if(j)return X.push(j),{type:"html",found:X};let I0=MG($,Z);if(I0)return X.push(I0),{type:"fullstack",found:X};if(Z?.main&&!Z?.bin)return X.push("package.json main (no bin)"),{type:"library",found:X};return X.push("no classifying signals — fallback"),{type:"library",found:X}}function F4($){if(M(K($,"bunfig.toml")))return"Bun";if(M(K($,"deno.json"))||M(K($,"deno.jsonc")))return"Deno";if(D0($))return"Node.js";if(M(K($,"Cargo.toml")))return"Rust";if(M(K($,"go.mod")))return"Go";if(s0($).length>0)return".NET";if(M(K($,"pubspec.yaml")))return"Dart";return"Unknown"}function N4($){if(M(K($,"pubspec.yaml")))return"pub";if(M(K($,"go.mod")))return"go modules";if(s0($).length>0)return"NuGet";if(M(K($,"pom.xml")))return"maven";if(M(K($,"build.gradle"))||M(K($,"build.gradle.kts"))||M(K($,"settings.gradle"))||M(K($,"settings.gradle.kts")))return"gradle";if(M(K($,"bun.lockb"))||M(K($,"bun.lock")))return"bun";if(M(K($,"pnpm-lock.yaml")))return"pnpm";if(M(K($,"yarn.lock")))return"yarn";if(M(K($,"package-lock.json")))return"npm";return"npm"}function A4($){if(M(K($,".github/workflows")))return"GitHub Actions";if(M(K($,".gitlab-ci.yml")))return"GitLab CI";if(M(K($,".circleci")))return"CircleCI";if(M(K($,"Jenkinsfile")))return"Jenkins";return null}function P4($){if(M(K($,"vercel.json")))return"Vercel";if(M(K($,"netlify.toml")))return"Netlify";if(M(K($,"wrangler.toml")))return"Cloudflare";if(M(K($,"Dockerfile")))return"Docker";if(M(K($,"fly.toml")))return"Fly.io";if(M(K($,"render.yaml")))return"Render";return null}function T4($){let Z=K($,"svelte.config.js");if(!M(Z))return null;try{let X=$0(Z,"utf-8").match(/@sveltejs\/adapter-(\w+)/);if(X){let z=X[1];switch(z){case"vercel":return"Vercel";case"node":return"Node";case"static":return"Static";case"cloudflare":return"Cloudflare";case"netlify":return"Netlify";case"auto":return"Auto";default:return z}}return null}catch{return null}}function C4($){let Z=D0($);if(Z?.devDependencies?.vite||Z?.dependencies?.vite)return"Vite";if(Z?.devDependencies?.webpack||Z?.dependencies?.webpack)return"webpack";if(Z?.devDependencies?.esbuild||Z?.dependencies?.esbuild)return"esbuild";if(M(K($,"tsconfig.json"))&&Z?.devDependencies?.typescript)return"TypeScript (tsc)";return null}function w4($){return["package.json","Cargo.toml","pyproject.toml","go.mod","build.zig","build.zig.zon","src/index.ts","src/index.js","src/main.ts","src/cli.ts","src/main.rs","src/lib.rs","src/main.zig","src/root.zig","src/__init__.py","main.py","__main__.py","main.go","cmd/main.go","README.md","SPECIFICATION.md","BINARY-FORMAT.md","tsconfig.json","wrangler.toml","vercel.json"].filter((Q)=>M(K($,Q)))}function b4($,Z){let Q={};if(Z?.scripts){for(let X of["build","test","lint","dev","start"])if(Z.scripts[X]){let z=M(K($,"bun.lock"))||M(K($,"bun.lockb"))?"bun run":"npm run";Q[X]=`${z} ${X}`}}if(M(K($,"Cargo.toml"))){if(!Q.build)Q.build="cargo build --release";if(!Q.test)Q.test="cargo test";if(!Q.lint)Q.lint="cargo clippy"}if(M(K($,"build.zig"))){if(!Q.build)Q.build="zig build";if(!Q.test)Q.test="zig build test"}if(M(K($,"go.mod"))){if(!Q.build)Q.build="go build ./...";if(!Q.test)Q.test="go test ./..."}if(M(K($,"pyproject.toml"))||M(K($,"pytest.ini"))){if(!Q.test)Q.test="pytest"}return Q}function E4($,Z,Q,X){let z=[];if(X&&X!=="Unknown")z.push(X);let J=new Set(["frontend","backend","database","build","css","state","monorepo"]);for(let H of Q)if(J.has(H.category))z.push(H.name);if(M(K($,"bunfig.toml")))z.push("Bun");else if(M(K($,"deno.json"))||M(K($,"deno.jsonc")))z.push("Deno");if(z.length<3&&Z?.dependencies){let H=Object.keys(Z.dependencies).slice(0,5);for(let U of H)if(!z.some((q)=>q.toLowerCase().includes(U.toLowerCase())))z.push(U)}return z}function S4($){let Z=D0($),Q=o2($),X=R4($),z=X.type,J=X.found.some((b)=>b.startsWith("polyglot:")),H=J&&L4($)||t2($),U=F4($),q=N4($),Y=A4($),B=P4($),G=C4($),V=Q.find((b)=>b.category==="frontend"),_=Q.find((b)=>b.category==="css"),D=Q.find((b)=>b.category==="ui"),W=Q.find((b)=>b.category==="state"),O=Q.find((b)=>b.category==="backend"),I=Q.find((b)=>b.category==="database"),R=S0[z]||S0.library,N=z==="framework",P=Q.some((b)=>b.slug==="svelte"||b.slug==="sveltekit"),T=N&&P?"svelte":N?null:null,A=z==="svelte"||T==="svelte",C=A?T4($):null,L=A&&Q.some((b)=>b.slug==="sveltekit"),S=new Set(["css_framework","ui_library","database","connection","hosting"]),E={},d=v.filter((b)=>b.path.startsWith("stack."));for(let b of d){let x=b.path.replace("stack.","");if(!R.includes(b.category)){E[x]="slotignored";continue}if(N&&S.has(x)){E[x]="slotignored";continue}switch(x){case"frontend":E[x]=V?.name??(z==="cli"?"CLI":"");break;case"css_framework":E[x]=_?.name??"";break;case"ui_library":E[x]=D?.name??"";break;case"state_management":E[x]=A?W?.name??"Runes":W?.name??"";break;case"backend":E[x]=A?L?"SvelteKit":O?.name??"":O?.name??"";break;case"api_type":E[x]=L?"Server Routes":"";break;case"runtime":E[x]=U!=="Unknown"?U:"";break;case"database":E[x]=I?.name??"";break;case"connection":E[x]=I?.name??"";break;case"hosting":if(A&&C)E[x]=C;else E[x]=B??"";break;case"build":E[x]=A?"Vite":G??"";break;case"cicd":E[x]=Y??"";break;case"package_manager":E[x]=q;break;default:E[x]="";break}}let j={},I0=v.filter((b)=>b.path.startsWith("monorepo."));for(let b of I0){let x=b.path.replace("monorepo.","");if(!R.includes(b.category))j[x]="slotignored";else j[x]=""}let g={name:Z?.name??$.split("/").pop()??"project",goal:J?"":Z?.description??"",main_language:H,type:z};if(N&&T)g.framework=T;let m1=E4($,Z,Q,J?t2($):H);if(J){for(let b of s2($))for(let x of[b.language,b.topFramework])if(x&&!m1.includes(x))m1.push(x)}let r8=w4($),a8=b4($,Z),l1={faf_version:I4,project:g,stack:E,human_context:{who:"",what:J?"":Z?.description??"",why:"",where:"",when:"",how:""},monorepo:j,_meta:{found:X.found}};if(m1.length>0)l1.tech_stack=m1;if(r8.length>0)l1.key_files=r8;if(Object.keys(a8).length>0)l1.commands=a8;return l1}import{existsSync as FG,readFileSync as NG}from"fs";import{join as AG}from"path";var j4={MIN_LENGTH:8,MAX_LENGTH:280},RG=[/^(see|see\s+the?)\s+readme/i,/^(tbd|todo|fixme|coming\s+soon)\b/i,/^(software|application|app|project|tool|library|framework)\.?$/i,/^(for\s+users|for\s+developers)\.?$/i,/^(description|goal|name|title)\.?$/i,/^lorem\s+ipsum/i,/^example(\s+\w+)?\.?$/i];function s($){let Z=$.trim();if(Z.length<j4.MIN_LENGTH)return!1;if(Z.length>j4.MAX_LENGTH)return!1;if(RG.some((Q)=>Q.test(Z)))return!1;if(/^[\s|\-*+]/.test(Z))return!1;if(Z.split(`
|
|
224
|
+
`).length>4)return!1;return!0}function PG($){let Z=$.split(`
|
|
225
225
|
`),Q=0;while(Q<Z.length&&/^(#\s|$)/.test(Z[Q].trim()))Q++;while(Q<Z.length){let X=Z[Q].trim();if(/^\[!\[/.test(X)){Q++;continue}if(/^!\[/.test(X)){Q++;continue}if(/^<img\s/i.test(X)){Q++;continue}if(X===""){Q++;continue}break}return Z.slice(Q).join(`
|
|
226
|
-
`)}function
|
|
226
|
+
`)}function TG($){let Q=PG($).split(`
|
|
227
227
|
`),X=[];for(let z of Q){let J=z.trim();if(J===""){if(X.length>0)break;continue}if(/^(#|>|```|---|\||\s*[-*+]\s|\d+\.\s)/.test(J))break;if(/^\*\*[^*]+\*\*\s*$/.test(J)&&X.length===0)continue;X.push(J)}if(X.length===0)return null;return X.join(" ").trim()}function E0($,Z){let Q=$.split(`
|
|
228
|
-
`),X=0;while(X<Q.length){let J=Q[X].trim().match(/^(#{1,6})\s+(.+)$/);if(J&&Z.test(J[2])){let H=J[1].length,U=[];X++;while(X<Q.length){let q=Q[X].trim(),Y=q.match(/^(#{1,6})\s+/);if(Y&&Y[1].length<=H)break;if(q===""){if(U.length>0)break;X++;continue}if(/^(>|```|---|\||\s*[-*+]\s|\d+\.\s)/.test(q))break;U.push(q),X++}if(U.length===0)return null;return U.join(" ").trim()}X++}return null}function
|
|
229
|
-
`),X=!1;for(let z of Q){let J=z.trim();if(/^\[/.test(J)){X=J==="[package]";continue}if(!X)continue;let H=J.match(new RegExp(`^${Z}\\s*=\\s*(.+)$`));if(H){let U=H[1].trim();U=U.replace(/\s*#.*$/,"").trim();let q=U.match(/^"((?:[^"\\]|\\.)*)"$/)||U.match(/^'((?:[^'\\]|\\.)*)'$/);if(q)return q[1];return U}}return null}function l8($){let Z=
|
|
228
|
+
`),X=0;while(X<Q.length){let J=Q[X].trim().match(/^(#{1,6})\s+(.+)$/);if(J&&Z.test(J[2])){let H=J[1].length,U=[];X++;while(X<Q.length){let q=Q[X].trim(),Y=q.match(/^(#{1,6})\s+/);if(Y&&Y[1].length<=H)break;if(q===""){if(U.length>0)break;X++;continue}if(/^(>|```|---|\||\s*[-*+]\s|\d+\.\s)/.test(q))break;U.push(q),X++}if(U.length===0)return null;return U.join(" ").trim()}X++}return null}function CG($){let Z=E0($,/^(use\s+cases?|goal)\b/i);if(Z&&s(Z))return Z;let Q=TG($);if(Q&&s(Q))return Q;return}function wG($){let Z=E0($,/^(about|description|overview|what(\s+is\s+this)?)\b/i);if(Z&&s(Z))return Z;return}function bG($){let Z=E0($,/^(audience|users?|for\s+whom|who(\s+is\s+this\s+for)?)\b/i);if(Z&&s(Z))return Z;return}function EG($){let Z=E0($,/^(why|motivation|problem|rationale)\b/i);if(Z&&s(Z))return Z;return}function SG($){let Z=E0($,/^(deployment|where(\s+it\s+runs)?|hosting)\b/i);if(Z&&s(Z))return Z;return}function jG($){let Z=E0($,/^(status|history|timeline|since|launched)\b/i);if(Z&&s(Z))return Z;return}function xG($){let Z=E0($,/^(architecture|how(\s+it\s+works)?|approach|design)\b/i);if(Z&&s(Z))return Z;return}function m8($){let Z=["README.md","README.MD","Readme.md","readme.md"],Q=null;for(let _ of Z){let D=AG($,_);if(FG(D)){Q=D;break}}if(!Q)return{};let X;try{X=NG(Q,"utf-8")}catch{return{}}X=X.replace(/<!--[\s\S]*?-->/g,"");let z={},J=CG(X);if(J)z.project={goal:J};let H={},U=wG(X);if(U)H.what=U;let q=bG(X);if(q)H.who=q;let Y=EG(X);if(Y)H.why=Y;let B=SG(X);if(B)H.where=B;let G=jG(X);if(G)H.when=G;let V=xG(X);if(V)H.how=V;if(Object.keys(H).length>0)z.human_context=H;return z}import{existsSync as gG,readFileSync as hG}from"fs";import{join as yG}from"path";function vG($,Z){let Q=$.split(`
|
|
229
|
+
`),X=!1;for(let z of Q){let J=z.trim();if(/^\[/.test(J)){X=J==="[package]";continue}if(!X)continue;let H=J.match(new RegExp(`^${Z}\\s*=\\s*(.+)$`));if(H){let U=H[1].trim();U=U.replace(/\s*#.*$/,"").trim();let q=U.match(/^"((?:[^"\\]|\\.)*)"$/)||U.match(/^'((?:[^'\\]|\\.)*)'$/);if(q)return q[1];return U}}return null}function l8($){let Z=yG($,"Cargo.toml");if(!gG(Z))return{};let Q;try{Q=hG(Z,"utf-8")}catch{return{}}let X=vG(Q,"description");if(X&&s(X))return{project:{goal:X}};return{}}import{readFileSync as fG,readdirSync as kG}from"fs";import{join as x4}from"path";var uG=[{re:/^postgres|postgis|pgvector/,slot:"database",label:"PostgreSQL"},{re:/^mysql/,slot:"database",label:"MySQL"},{re:/^mariadb/,slot:"database",label:"MariaDB"},{re:/^mongo/,slot:"database",label:"MongoDB"},{re:/clickhouse/,slot:"database",label:"ClickHouse"},{re:/^cockroach/,slot:"database",label:"CockroachDB"},{re:/^redis|^valkey/,slot:"cache",label:"Redis"},{re:/^memcached/,slot:"cache",label:"Memcached"},{re:/elasticsearch/,slot:"search",label:"Elasticsearch"},{re:/opensearch/,slot:"search",label:"OpenSearch"},{re:/meilisearch/,slot:"search",label:"Meilisearch"},{re:/typesense/,slot:"search",label:"Typesense"},{re:/qdrant/,slot:"search",label:"Qdrant (vector)"},{re:/weaviate/,slot:"search",label:"Weaviate (vector)"},{re:/^minio/,slot:"storage",label:"MinIO (S3-compatible)"},{re:/localstack/,slot:"storage",label:"LocalStack (AWS)"},{re:/rabbitmq/,slot:"runtime",label:"RabbitMQ"},{re:/kafka/,slot:"runtime",label:"Kafka"},{re:/nats/,slot:"runtime",label:"NATS"},{re:/temporalio\/|temporal-server|temporal:/,slot:"runtime",label:"Temporal"}],mG=new Set(["node_modules",".git","dist","build","vendor","target","e2e","tests","test"]);function lG($){let Z=[],Q=(X,z)=>{let J;try{J=kG(X,{withFileTypes:!0})}catch{return}for(let H of J)if(H.isFile()&&/^(docker-)?compose.*\.ya?ml$/i.test(H.name))Z.push(x4(X,H.name));else if(H.isDirectory()&&z>0&&!H.name.startsWith(".")&&!mG.has(H.name))Q(x4(X,H.name),z-1)};return Q($,1),Z}function f1($){return[...$].join(" · ")}function p8($){let Z=lG($);if(Z.length===0)return{};let Q={database:new Set,cache:new Set,search:new Set,storage:new Set,runtime:new Set};for(let z of Z){let J;try{J=fG(z,"utf-8")}catch{continue}for(let H of J.matchAll(/^\s*image:\s*["']?([^\s"'#]+)/gm)){let U=H[1].toLowerCase(),q=U.replace(/:[^/]*$/,"").split("/").pop()??U,Y=U.replace(/:[^/]*$/,"");for(let{re:B,slot:G,label:V}of uG)if(B.test(q)||B.test(Y))Q[G].add(V)}}let X={};if(Q.database.size)X.database=f1(Q.database);if(Q.cache.size)X.cache=f1(Q.cache);if(Q.search.size)X.search=f1(Q.search);if(Q.storage.size)X.storage=f1(Q.storage);if(Q.runtime.size)X.runtime=`Docker Compose (${f1(Q.runtime)})`;if(Object.keys(X).length===0&&!Q.runtime.size)return{stack:{hosting:"Docker Compose"}};return X.hosting="Docker Compose",{stack:X}}import{existsSync as e2,readFileSync as pG,readdirSync as dG}from"fs";import{join as k1}from"path";var cG=new Set(["node_modules",".git","dist","build","vendor","target","e2e","docs","scripts"]),iG=[{file:"Makefile",runner:"make",targets:($)=>[...$.matchAll(/^([a-zA-Z][\w-]*)\s*:(?!=)/gm)].map((Z)=>Z[1])},{file:"justfile",runner:"just",targets:($)=>[...$.matchAll(/^([a-zA-Z][\w-]*)\s*(?:\([^)]*\))?\s*:/gm)].map((Z)=>Z[1])},{file:"Taskfile.yml",runner:"task",targets:($)=>{let Z=$.indexOf("tasks:");if(Z===-1)return[];return[...$.slice(Z).matchAll(/^\s{2}([a-zA-Z][\w-]*):/gm)].map((Q)=>Q[1])}}];function d8($,Z){for(let Q of Z){let X=$.find((z)=>Q.test(z));if(X)return X}return null}function rG($){let Z=[$];try{for(let Q of dG($,{withFileTypes:!0}))if(Q.isDirectory()&&!Q.name.startsWith(".")&&!cG.has(Q.name))Z.push(k1($,Q.name))}catch{}return Z}function aG($){let Z=0;if(e2(k1($,"manage.py"))||e2(k1($,"pyproject.toml"))||e2(k1($,"Gemfile")))Z+=3;if(/(?:^|\/)(backend|api|server|core|app)$/.test($))Z+=2;return Z}function c8($){let Z=[];for(let X of rG($)){let z=X===$,J=z?"":`cd ${X.slice($.length+1)} && `;for(let H of iG){let U=k1(X,H.file);if(!e2(U))continue;let q;try{q=pG(U,"utf-8")}catch{continue}let Y=H.targets(q);if(Y.length===0)continue;let B={},G=d8(Y,[/^test$/i,/^tests$/i,/test-all/i,/^test-unit/i,/^test/i]),V=d8(Y,[/^build$/i,/^compile$/i,/^build/i]),_=d8(Y,[/^check-all$/i,/^check$/i,/^lint$/i,/^lint/i,/^fmt$/i,/^format$/i]);if(G)B.test=`${J}${H.runner} ${G}`;if(V)B.build=`${J}${H.runner} ${V}`;if(_)B.lint=`${J}${H.runner} ${_}`;if(Object.keys(B).length===0)continue;Z.push({score:Object.keys(B).length+(z?10:aG(X)),commands:B})}}let Q=Z.sort((X,z)=>z.score-X.score)[0];return Q?{commands:Q.commands}:{}}import{existsSync as nG}from"fs";import{join as sG}from"path";var oG=[".env.example",".env.sample",".env.template",".env.dist","env.example",".env.local.example"];function i8($){for(let Z of oG)if(nG(sG($,Z)))return{security:{secrets:".env",example:Z}};return{}}function tG($,Z){let Q={project:{...Z.project??{},...$.project??{}},human_context:{...Z.human_context??{},...$.human_context??{}},stack:{...Z.stack??{},...$.stack??{}},commands:{...Z.commands??{},...$.commands??{}},security:{...Z.security??{},...$.security??{}}};for(let X of["project","human_context","stack","commands","security"])if(Q[X]&&Object.keys(Q[X]).length===0)delete Q[X];return Q}function g4($){return[m8($),l8($),p8($),c8($),i8($)].reduce(tG,{})}function eG($){let Z=S4($),Q=g4($),X={};if(Q.stack)X.stack=Q.stack;if(Q.commands)X.commands=Q.commands;if(Q.security)X.security=Q.security;let z={};if(Q.project)z.project=Q.project;if(Q.human_context)z.human_context=Q.human_context;let J=u1(u1(X,Z),z);$V(J);let U=(Z._meta?.found??[]).some((Y)=>Y.startsWith("polyglot:")),q=u1(J,f8($));return u1(q,{human_context:k8($,{toolingRoot:U})})}function $V($){let Z=$.project?.type??"library",Q=S0[Z]||S0.library;for(let X of v){if(Q.includes(X.category))continue;let[z,J]=X.path.split(".");if(z==="stack"&&$.stack)$.stack[J]="slotignored";if(z==="monorepo"&&$.monorepo)$.monorepo[J]="slotignored"}}function u1($,Z){let Q={...$};for(let[X,z]of Object.entries(Z)){let J=Q[X];if(K0(J))Q[X]=z;else if(typeof z==="object"&&z!==null&&!Array.isArray(z)&&typeof J==="object"&&J!==null&&!Array.isArray(J))Q[X]=u1(J,z)}return Q}export{qq as writeServerCard,Qq as writeProjectHtml,o4 as validateFaf,i0 as utcNow,Rq as upsertCatalog,f8 as turboCatSlots,G4 as turboCatScan,u4 as slotsByCategory,uZ as seedSixWsFromGoal,J$ as scoreFafYaml,dq as runLoop,D4 as relentlessContextDetailed,k8 as relentlessContext,K8 as registryName,I8 as registryMeta,Wq as readFafa,VZ as readFafRaw,rU as readFaf,T8 as questionForSlot,nq as publicQuestions,Fq as projectCards,u2 as normalizeAnswer,pZ as loopVerdict,z$ as kernel,K0 as isPlaceholder,mZ as isHumanSlot,k2 as isEmptyValue,fq as interviewForMissing,sq as gradeAnswers,Q1 as getTier,p4 as getNextTier,v2 as generateServerCard,IZ as generateProjectHtml,TZ as generateA2ACard,jZ as fromClaudeDir,_q as findFafaFile,WZ as findFafFile,c0 as fafContextBlock,e8 as enrichScore,aq as deriveQuestionSet,lZ as classifyGaps,T1 as canonicalPriority,lq as buildTableOf8,oq as buildReceipt,eG as assembleFreshFaf,rZ as answersMatch,Z0 as TIERS,fZ as STACK_INTERVIEW,e0 as SLOT_BY_PATH,v as SLOTS,P8 as SIX_WS_INTERVIEW,RZ as REGISTRY_PUBLISHER_KEY,O0 as PRIORITY_RANK,R8 as PRIORITY_ORDER,p1 as PLACEHOLDERS,f2 as KNOWLEDGE_TYPES,vZ as INTERVIEW_VERSION,vq as INTERVIEW_PATHS,kZ as INTERVIEW_BY_PATH,a0 as INTERVIEW,T0 as FafmSoul,Z1 as FAF_HEX,l4 as ENTERPRISE_SLOTS,w8 as BENCH_VERSION,m4 as BASE_SLOTS,iZ as ALIAS_GROUPS,AZ as A2A_CONTEXT_URI};
|
|
230
230
|
|
|
231
|
-
//# debugId=
|
|
231
|
+
//# debugId=88C508916E2BB3DC64756E2164756E21
|
|
232
232
|
//# sourceMappingURL=index.js.map
|