faf-cli 7.8.0 → 7.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -211,7 +211,7 @@ Rendered on-demand from your current <strong>${p0(Q)}</strong><br>
211
211
  </body>
212
212
  </html>
213
213
  `}function dU($,Z,Q,X="project.faf"){yU(fU($,"project.html"),JZ(Z,Q,X),"utf-8")}import{writeFileSync as cU}from"fs";import{join as iU}from"path";var HZ="application/vnd.faf+yaml",rU="https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json",aU=/^[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+$/;function qZ($){let Z=String($.project?.name??"project").trim();if(Z.includes("/")&&aU.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 sU($){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 d0($,Z={}){return{faf:Z.fafPointer??"./project.faf",mediaType:HZ,iana:`https://www.iana.org/assignments/media-types/${HZ}`,deterministic:!0,...Z.scoreEndpoint?{scoreEndpoint:Z.scoreEndpoint}:{},generated:$.generated??Z.now??new Date().toISOString()}}function j2($,Z={}){let Q={$schema:rU,name:qZ($),version:String($.project?.version??"0.1.0"),description:sU($)},X=B8($)??$.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":d0($,Z)},Q}var YZ="io.modelcontextprotocol.registry/publisher-provided",UZ=4096;function q8($,Z={}){let Q={"one.faf/context":d0($,Z)},X=new TextEncoder().encode(JSON.stringify(Q)).length;if(X>UZ)throw Error(`publisher-provided _meta is ${X}B — exceeds the registry ${UZ}B cap`);return{[YZ]:Q}}function Y8($){return qZ($)}function B8($){let Z=$.project?.title;if(typeof Z==="string"){let Q=Z.trim();if(Q&&Q.length<=100)return Q}return}function nU($,Z,Q={}){let X=j2(Z,Q),z=iU($,"server-card");return cU(z,`${JSON.stringify(X,null,2)}
214
- `,"utf-8"),z}import{existsSync as BZ,mkdirSync as I_,readFileSync as oU,writeFileSync as K_}from"fs";import{dirname as tU,join as GZ}from"path";var VZ="https://faf.one/context",eU="JSONRPC",_Z="1.0",$q=["a2a","mcp","registry","catalog"];function Zq($){return r(oU($,"utf-8"))}function Qq($=process.cwd()){let Z=["agent.fafa",".fafa"];for(let X of Z){let z=GZ($,X);if(BZ(z))return z}let Q=tU($);if(Q!==$)for(let X of Z){let z=GZ(Q,X);if(BZ(z))return z}return null}function Xq($){return($.endpoints??[]).filter((Z)=>String(Z.protocol??"").toLowerCase()==="a2a"&&Z.location)}function G8($,Z={}){let Q=Xq($);if(Q.length>0)return Q;let X=Z.doorUrl?.trim();if(X)return[{protocol:"a2a",location:X,version:_Z}];return[]}function WZ($,Z,Q={}){let X=$.agent??{},z=G8($,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=d0(Z,Q),G=($.capabilities??[]).map((V)=>{let W=String(V.name??"").trim();if(!W)throw Error("A2A skill missing capabilities[].name");let D=Array.isArray(V.tags)?V.tags.map(String):[];return{id:W,name:W,description:String(V.description??"").trim()||W,tags:D}});return{name:J,description:H,supportedInterfaces:z.map((V)=>({url:String(V.location),protocolBinding:eU,protocolVersion:String(V.version??_Z)})),provider:{organization:q,url:Y},version:U,capabilities:{streaming:!1,pushNotifications:!1,extendedAgentCard:!1,extensions:[{uri:VZ,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 zq($){let Z=$.agent?.homepage;if(!Z)return"local";try{return new URL(Z).hostname.replace(/^www\./,"")}catch{return"local"}}function Jq($,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 Hq($,Z,Q={}){let X=zq($),z=$.agent??{},J=String(z.name??"agent"),H=Q.now??Z.generated??new Date().toISOString(),U=[];if(G8($,Q).length>0)U.push({identifier:`urn:air:${X}:a2a:${J}`,displayName:String(z.displayName??z.name??"A2A Agent Card"),type:"application/json",description:"A2A v1.0 Agent Card. Projected from .fafa.",url:Jq($,Q),updatedAt:H});let q=Uq($,"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 Uq($,Z){let Q=$.agent?.homepage;if(!Q)return;try{return new URL(`/.well-known/${Z}`,Q).href}catch{return}}function qq($,Z){let Q=$.findIndex((X)=>X.identifier===Z.identifier);if(Q>=0)return Q;if(Z.type==="application/json"||Z.identifier.includes(":a2a:"))return $.findIndex((X)=>X.identifier.includes(":a2a:")||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 Yq($,Z){let Q=$?{...$,entries:[...$.entries??[]]}:{specVersion:"1.0",entries:[]};for(let X of Z){let z=qq(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 Bq($){let Z=$.opts??{},Q=new Set($.targets?.length?$.targets:$q),z={block:d0($.faf,Z)};if(Q.has("mcp"))z.mcp=j2($.faf,Z);if(Q.has("registry")){let J=B8($.faf);z.registry={name:Y8($.faf),...J?{title:J}:{},_meta:q8($.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(G8($.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=WZ($.fafa,$.faf,Z);if(Q.has("catalog")&&$.fafa)z.catalog=Hq($.fafa,$.faf,Z);return Gq(z),z}function Gq($){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 V8=["ephemeral","standard","high","critical"],O0=Object.fromEntries(V8.map(($,Z)=>[$,Z])),g2=new Set(["user","feedback","project","reference"]),_8=new Set(["version","profile","namepoint","created","last_etched","retention","index","memory"]),W8=new Set(["facts","sessions","preferences","custom"]),O8={low:"ephemeral",medium:"standard"};import{readFileSync as Vq,writeFileSync as _q,existsSync as Wq}from"fs";function c0(){return new Date().toISOString().replace(/\.\d{3}Z$/,"Z")}function k($){return $===null||$===void 0}function A1($){if(k($))return"standard";if(O8[$])return O8[$];if($ in O0)return $;return"standard"}var Oq=new Set(["text","id","type","priority","tags","links","timestamp","source"]);function OZ($){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(!Oq.has(X))Q[X]=z;return{text:String(Z.text),id:Z.id??null,type:Z.type??null,priority:A1(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 DZ($){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 A0{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??c0(),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(!Wq($))throw Error(`soul file not found: ${$}`);let Z=Vq($,"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(!_8.has(q))J[q]=structuredClone(Y);let H={};for(let[q,Y]of Object.entries(X))if(!W8.has(q))H[q]=structuredClone(Y);let U=new A0(String(Q.namepoint??$.replace(/.*\//,"").replace(/\.fafm$/,"")),{profile:String(Q.profile??"voice"),facts:z.map(OZ),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 A0.load($)}toDoc(){let $={facts:this._facts.map(DZ),sessions:structuredClone(this._sessions),preferences:structuredClone(this._preferences),custom:structuredClone(this._custom)};for(let[Q,X]of Object.entries(this._memoryExtra))if(!W8.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(!_8.has(Q))Z[Q]=structuredClone(X);return Z}toYaml(){return E2(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 _q($,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:A1(Z.priority),tags:Z.tags?Z.tags.slice():[],links:Z.links?Z.links.slice():[],timestamp:c0(),source:Z.source??null,extra:{}})}recall($,Z={}){let Q=O0[A1(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 Dq,readFileSync as Iq,statSync as IZ,existsSync as Kq}from"fs";import{join as Lq,basename as KZ,resolve as Mq}from"path";var LZ=new Set(["MEMORY.md","MEMORY-FULL.md","README.md"]),Rq=/\[\[([^\]]+)\]\]/g;function Fq($){let Z=IZ($).mtimeMs;return new Date(Z).toISOString().replace(/\.\d{3}Z$/,"Z")}function Nq($){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 Aq($,Z,Q){if(!Q.name)return null;let X=Q.metadata&&typeof Q.metadata==="object"?Q.metadata:{},z=X.type;if(typeof z!=="string"||!g2.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(Rq)].map((B)=>B[1]))].sort();return{text:U,id:J,type:z,priority:"standard",tags:[],links:Y,timestamp:Fq($),source:`claude-code memory: ${KZ($)}`,extra:q}}function MZ($,Z={}){let Q=Mq($);if(!Kq(Q))throw Error(`Claude memory directory not found: ${Q}`);if(!IZ(Q).isDirectory())throw Error(`Claude memory path is not a directory: ${Q}`);let X=Z.skip??LZ,z=Z.namepoint??`@claude-code:${KZ(Q)}`,J=[],H=Dq(Q).filter((G)=>G.endsWith(".md")).sort();for(let G of H){if(X.has(G))continue;let V=Lq(Q,G),W;try{W=Iq(V,"utf-8")}catch{continue}let{fm:D,body:_}=Nq(W);if(!D)continue;let O=Aq(V,_,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):c0(),Y=U.length?U.reduce((G,V)=>G>V?G:V):q,B=new A0(z,{profile:"knowledge",facts:J,created:q});return B.last_etched=Y,B.rebuildIndex(),B}var PZ="faf-interview/1",i0="(terse — 3-4 words)",D8=[{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? ${i0}`,header:"Who",type:"text",required:!0},{path:"human_context.what",question:`What are they building? ${i0}`,header:"What",type:"text",required:!0},{path:"human_context.why",question:`Why does it exist? ${i0}`,header:"Why",type:"text",required:!0},{path:"human_context.where",question:`Where does it run or ship? ${i0}`,header:"Where",type:"text",required:!0},{path:"human_context.when",question:`When — timeline or stage? ${i0}`,header:"When",type:"text",required:!0},{path:"human_context.how",question:`How is it built or used? ${i0}`,header:"How",type:"text",required:!0}],TZ=[{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}],r0=[...D8,...TZ],CZ=new Map(r0.map(($)=>[$.path,$])),Pq=Object.fromEntries(r0.map(($)=>[$.path,$]));function I8($){let Z=CZ.get($);if(Z)return Z.question;let Q=o0.get($)??y.find((X)=>X.canonical===$);return Q?`${Q.description}?`.replace(/\?\?$/,"?"):`${$}?`}function Tq($,Z){return r0.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 Cq=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"]),wq=[["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]],RZ=($)=>Cq.has($.toLowerCase().trim()),bq=/^(?:with|and|or|using|for|to|that|who|whom|whose|the|a|an|in|on|of|via|by|&)$/i;function FZ($,Z=5){let Q=$.trim().split(/\s+/).filter(Boolean).slice(0,Z);while(Q.length&&bq.test(Q[Q.length-1].replace(/[.,;:]+$/,"")))Q.pop();return Q.join(" ")}function wZ($){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=FZ(X);if(z.split(/\s+/).filter(Boolean).length>=2&&!RZ(z))Z.what=z;let J=wq.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=FZ((H?.[1]||"").trim().replace(/\s+/g," "));if(U&&!RZ(U))Z.who=U;return Z}function NZ($,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 AZ($){if(typeof $!=="string")return!1;let Z=$.trim();if(!Z||Z==="slotignored")return!1;return!D0(Z)}function Eq($,Z={}){let Q=$&&typeof $==="object"?$:{},X=NZ(Q,"project.goal"),z=(AZ(X)?String(X).trim():"")||(Z.goal??"").trim(),J=wZ(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=(W)=>{let D=U[W];if(D)return{value:D,source:"project goal",confidence:0.9};let _=W.startsWith("human_context.")?W.slice(14):"",O=_?H[_]:void 0;return O?{value:O.value,source:O.source,confidence:O.confidence}:void 0},Y=D8.map((W,D)=>{let _={n:D+1,path:W.path,header:W.header,question:W.question},O=NZ(Q,W.path);if(AZ(O))return{..._,value:String(O).trim(),status:"filled",seeded:!1};let I=q(W.path);if(I)return{..._,value:I.value,status:"seeded",seeded:!0,source:I.source,confidence:I.confidence};return{..._,value:"",status:"empty",seeded:!1}}),B=Y.filter((W)=>W.status==="filled").length,G=Y.filter((W)=>W.status==="seeded").length,V=Y.filter((W)=>W.status==="empty").length;return{version:PZ,rows:Y,filledCount:B,seededCount:G,emptyCount:V,complete:V===0}}function x2($){if($===null||$===void 0)return!0;if(typeof $==="string"){let Z=$.trim();return Z===""||D0(Z)}return!1}function Sq($,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 bZ($){if($==="project.goal")return!0;return o0.get($)?.category==="human"}function EZ($,Z=x2){let Q=[],X=[];for(let z of r0){let J=Sq($,z.path);if(J==="slotignored")continue;if(!Z(J))continue;(bZ(z.path)?Q:X).push(z.path)}return{human:Q,sourceable:X}}function SZ($,Z,Q=x2){let X=EZ(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"?K8(X):[];return{status:z,score:$,gaps:X,ask:J}}function K8($){return $.human.map((Z)=>({path:Z,question:I8(Z)}))}function jq($,Z={}){let Q=Math.max(1,Z.maxRounds??5),X=Z.isEmpty??x2,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=SZ(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:K8(B.gaps)}:{status:"stuck",score:Y,rounds:J,history:z,ask:[]};if(J>=Q)return{status:"capped",score:Y,rounds:J,history:z,ask:K8(B.gaps)};$.runAuto(),J++}return{status:"capped",score:z[z.length-1]??0,rounds:J,history:z,ask:[]}}import{createHash as gZ}from"crypto";var L8="faf-bench/1",gq={"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 xq($,Z){return gq[$]??`What is the project's ${Z.replace(/\s*\(.*\)$/,"").toLowerCase()}?`}var xZ=[["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"]],P1=new Map;xZ.forEach(($,Z)=>$.forEach((Q)=>P1.set(Q,Z)));var hq=new Set(["a","an","the","and","or","of","for","to","in","on","with","is","it","its","their","your","via","by","using","use","used"]);function h2($){return $.toLowerCase().replace(/[^a-z0-9\s.+#-]/g," ").replace(/\.(?=\s|$)/g," ").replace(/\s+/g," ").trim()}function jZ($){return h2($).split(" ").filter((Z)=>Z&&!hq.has(Z))}function hZ($,Z){let Q=h2($),X=h2(Z);if(!Q||!X)return!1;if(Q===X)return!0;let z=P1.get(Q);if(z!==void 0&&P1.get(X)===z)return!0;let J=jZ($);if(J.length===0)return!1;let H=new Set(jZ(Z));return J.every((U)=>{if(H.has(U))return!0;let q=P1.get(U);return q!==void 0&&[...H].some((Y)=>P1.get(Y)===q)})}function yq($){let Z=n2($),Q=r($),X=[],z={},J=0;for(let q of y){if(Z.slots[q.path]!=="populated")continue;let Y=f8(Q,q);if(typeof Y!=="string")continue;let B=Y.trim();if(!B||k1.has(B.toLowerCase()))continue;J+=1,X.push({n:J,path:q.path,question:xq(q.path,q.description)}),z[J]=B}let H=JSON.stringify({v:L8,q:X.map((q)=>[q.path,q.question])}),U=gZ("sha256").update(H).digest("hex").slice(0,12);return{version:L8,qsetHash:U,questions:X,answers:z}}function fq($){return{version:$.version,qsetHash:$.qsetHash,questions:$.questions}}function kq($,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()!==""&&hZ($.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 vq($,Z){let Q=JSON.stringify({v:$.version,repo:Z??null,qset:$.qsetHash,protocol:$.protocol,cold:$.cold??null,faf:$.faf??null});return{projection:Q,hash:gZ("sha256").update(Q).digest("hex")}}import{existsSync as FB,readdirSync as tZ,readFileSync as NB}from"fs";import{join as w8,dirname as AB,extname as PB,resolve as TB}from"path";var M8={"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 yZ,readFileSync as mq,readdirSync as lq}from"fs";import{join as R8}from"path";var a0={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 pq=a0.flutterDeps,dq=a0.mcpDeps,cq=a0.serverFrameworks,iq=a0.stateManagement,rq=a0.routing;function aq($){let Z=new Set,Q=!1;for(let X of $.split(`
214
+ `,"utf-8"),z}import{existsSync as BZ,mkdirSync as I_,readFileSync as oU,writeFileSync as K_}from"fs";import{dirname as tU,join as GZ}from"path";var VZ="https://faf.one/context",eU="JSONRPC",_Z="1.0",$q=["a2a","mcp","registry","catalog"];function Zq($){return r(oU($,"utf-8"))}function Qq($=process.cwd()){let Z=["agent.fafa",".fafa"];for(let X of Z){let z=GZ($,X);if(BZ(z))return z}let Q=tU($);if(Q!==$)for(let X of Z){let z=GZ(Q,X);if(BZ(z))return z}return null}function Xq($){return($.endpoints??[]).filter((Z)=>String(Z.protocol??"").toLowerCase()==="a2a"&&Z.location)}function G8($,Z={}){let Q=Xq($);if(Q.length>0)return Q;let X=Z.doorUrl?.trim();if(X)return[{protocol:"a2a",location:X,version:_Z}];return[]}function WZ($,Z,Q={}){let X=$.agent??{},z=G8($,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=d0(Z,Q),G=($.capabilities??[]).map((V)=>{let W=String(V.name??"").trim();if(!W)throw Error("A2A skill missing capabilities[].name");let D=Array.isArray(V.tags)?V.tags.map(String):[];return{id:W,name:W,description:String(V.description??"").trim()||W,tags:D}});return{name:J,description:H,supportedInterfaces:z.map((V)=>({url:String(V.location),protocolBinding:eU,protocolVersion:String(V.version??_Z)})),provider:{organization:q,url:Y},version:U,capabilities:{streaming:!1,pushNotifications:!1,extendedAgentCard:!1,extensions:[{uri:VZ,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 zq($){let Z=$.agent?.homepage;if(!Z)return"local";try{return new URL(Z).hostname.replace(/^www\./,"")}catch{return"local"}}function Jq($,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 Hq($,Z,Q={}){let X=zq($),z=$.agent??{},J=String(z.name??"agent"),H=Q.now??Z.generated??new Date().toISOString(),U=[];if(G8($,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:Jq($,Q),updatedAt:H});let q=Uq($,"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 Uq($,Z){let Q=$.agent?.homepage;if(!Q)return;try{return new URL(`/.well-known/${Z}`,Q).href}catch{return}}function qq($,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 Yq($,Z){let Q=$?{...$,entries:[...$.entries??[]]}:{specVersion:"1.0",entries:[]};for(let X of Z){let z=qq(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 Bq($){let Z=$.opts??{},Q=new Set($.targets?.length?$.targets:$q),z={block:d0($.faf,Z)};if(Q.has("mcp"))z.mcp=j2($.faf,Z);if(Q.has("registry")){let J=B8($.faf);z.registry={name:Y8($.faf),...J?{title:J}:{},_meta:q8($.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(G8($.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=WZ($.fafa,$.faf,Z);if(Q.has("catalog")&&$.fafa)z.catalog=Hq($.fafa,$.faf,Z);return Gq(z),z}function Gq($){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 V8=["ephemeral","standard","high","critical"],O0=Object.fromEntries(V8.map(($,Z)=>[$,Z])),g2=new Set(["user","feedback","project","reference"]),_8=new Set(["version","profile","namepoint","created","last_etched","retention","index","memory"]),W8=new Set(["facts","sessions","preferences","custom"]),O8={low:"ephemeral",medium:"standard"};import{readFileSync as Vq,writeFileSync as _q,existsSync as Wq}from"fs";function c0(){return new Date().toISOString().replace(/\.\d{3}Z$/,"Z")}function k($){return $===null||$===void 0}function A1($){if(k($))return"standard";if(O8[$])return O8[$];if($ in O0)return $;return"standard"}var Oq=new Set(["text","id","type","priority","tags","links","timestamp","source"]);function OZ($){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(!Oq.has(X))Q[X]=z;return{text:String(Z.text),id:Z.id??null,type:Z.type??null,priority:A1(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 DZ($){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 A0{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??c0(),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(!Wq($))throw Error(`soul file not found: ${$}`);let Z=Vq($,"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(!_8.has(q))J[q]=structuredClone(Y);let H={};for(let[q,Y]of Object.entries(X))if(!W8.has(q))H[q]=structuredClone(Y);let U=new A0(String(Q.namepoint??$.replace(/.*\//,"").replace(/\.fafm$/,"")),{profile:String(Q.profile??"voice"),facts:z.map(OZ),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 A0.load($)}toDoc(){let $={facts:this._facts.map(DZ),sessions:structuredClone(this._sessions),preferences:structuredClone(this._preferences),custom:structuredClone(this._custom)};for(let[Q,X]of Object.entries(this._memoryExtra))if(!W8.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(!_8.has(Q))Z[Q]=structuredClone(X);return Z}toYaml(){return E2(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 _q($,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:A1(Z.priority),tags:Z.tags?Z.tags.slice():[],links:Z.links?Z.links.slice():[],timestamp:c0(),source:Z.source??null,extra:{}})}recall($,Z={}){let Q=O0[A1(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 Dq,readFileSync as Iq,statSync as IZ,existsSync as Kq}from"fs";import{join as Lq,basename as KZ,resolve as Mq}from"path";var LZ=new Set(["MEMORY.md","MEMORY-FULL.md","README.md"]),Rq=/\[\[([^\]]+)\]\]/g;function Fq($){let Z=IZ($).mtimeMs;return new Date(Z).toISOString().replace(/\.\d{3}Z$/,"Z")}function Nq($){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 Aq($,Z,Q){if(!Q.name)return null;let X=Q.metadata&&typeof Q.metadata==="object"?Q.metadata:{},z=X.type;if(typeof z!=="string"||!g2.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(Rq)].map((B)=>B[1]))].sort();return{text:U,id:J,type:z,priority:"standard",tags:[],links:Y,timestamp:Fq($),source:`claude-code memory: ${KZ($)}`,extra:q}}function MZ($,Z={}){let Q=Mq($);if(!Kq(Q))throw Error(`Claude memory directory not found: ${Q}`);if(!IZ(Q).isDirectory())throw Error(`Claude memory path is not a directory: ${Q}`);let X=Z.skip??LZ,z=Z.namepoint??`@claude-code:${KZ(Q)}`,J=[],H=Dq(Q).filter((G)=>G.endsWith(".md")).sort();for(let G of H){if(X.has(G))continue;let V=Lq(Q,G),W;try{W=Iq(V,"utf-8")}catch{continue}let{fm:D,body:_}=Nq(W);if(!D)continue;let O=Aq(V,_,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):c0(),Y=U.length?U.reduce((G,V)=>G>V?G:V):q,B=new A0(z,{profile:"knowledge",facts:J,created:q});return B.last_etched=Y,B.rebuildIndex(),B}var PZ="faf-interview/1",i0="(terse — 3-4 words)",D8=[{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? ${i0}`,header:"Who",type:"text",required:!0},{path:"human_context.what",question:`What are they building? ${i0}`,header:"What",type:"text",required:!0},{path:"human_context.why",question:`Why does it exist? ${i0}`,header:"Why",type:"text",required:!0},{path:"human_context.where",question:`Where does it run or ship? ${i0}`,header:"Where",type:"text",required:!0},{path:"human_context.when",question:`When — timeline or stage? ${i0}`,header:"When",type:"text",required:!0},{path:"human_context.how",question:`How is it built or used? ${i0}`,header:"How",type:"text",required:!0}],TZ=[{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}],r0=[...D8,...TZ],CZ=new Map(r0.map(($)=>[$.path,$])),Pq=Object.fromEntries(r0.map(($)=>[$.path,$]));function I8($){let Z=CZ.get($);if(Z)return Z.question;let Q=o0.get($)??y.find((X)=>X.canonical===$);return Q?`${Q.description}?`.replace(/\?\?$/,"?"):`${$}?`}function Tq($,Z){return r0.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 Cq=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"]),wq=[["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]],RZ=($)=>Cq.has($.toLowerCase().trim()),bq=/^(?:with|and|or|using|for|to|that|who|whom|whose|the|a|an|in|on|of|via|by|&)$/i;function FZ($,Z=5){let Q=$.trim().split(/\s+/).filter(Boolean).slice(0,Z);while(Q.length&&bq.test(Q[Q.length-1].replace(/[.,;:]+$/,"")))Q.pop();return Q.join(" ")}function wZ($){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=FZ(X);if(z.split(/\s+/).filter(Boolean).length>=2&&!RZ(z))Z.what=z;let J=wq.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=FZ((H?.[1]||"").trim().replace(/\s+/g," "));if(U&&!RZ(U))Z.who=U;return Z}function NZ($,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 AZ($){if(typeof $!=="string")return!1;let Z=$.trim();if(!Z||Z==="slotignored")return!1;return!D0(Z)}function Eq($,Z={}){let Q=$&&typeof $==="object"?$:{},X=NZ(Q,"project.goal"),z=(AZ(X)?String(X).trim():"")||(Z.goal??"").trim(),J=wZ(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=(W)=>{let D=U[W];if(D)return{value:D,source:"project goal",confidence:0.9};let _=W.startsWith("human_context.")?W.slice(14):"",O=_?H[_]:void 0;return O?{value:O.value,source:O.source,confidence:O.confidence}:void 0},Y=D8.map((W,D)=>{let _={n:D+1,path:W.path,header:W.header,question:W.question},O=NZ(Q,W.path);if(AZ(O))return{..._,value:String(O).trim(),status:"filled",seeded:!1};let I=q(W.path);if(I)return{..._,value:I.value,status:"seeded",seeded:!0,source:I.source,confidence:I.confidence};return{..._,value:"",status:"empty",seeded:!1}}),B=Y.filter((W)=>W.status==="filled").length,G=Y.filter((W)=>W.status==="seeded").length,V=Y.filter((W)=>W.status==="empty").length;return{version:PZ,rows:Y,filledCount:B,seededCount:G,emptyCount:V,complete:V===0}}function x2($){if($===null||$===void 0)return!0;if(typeof $==="string"){let Z=$.trim();return Z===""||D0(Z)}return!1}function Sq($,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 bZ($){if($==="project.goal")return!0;return o0.get($)?.category==="human"}function EZ($,Z=x2){let Q=[],X=[];for(let z of r0){let J=Sq($,z.path);if(J==="slotignored")continue;if(!Z(J))continue;(bZ(z.path)?Q:X).push(z.path)}return{human:Q,sourceable:X}}function SZ($,Z,Q=x2){let X=EZ(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"?K8(X):[];return{status:z,score:$,gaps:X,ask:J}}function K8($){return $.human.map((Z)=>({path:Z,question:I8(Z)}))}function jq($,Z={}){let Q=Math.max(1,Z.maxRounds??5),X=Z.isEmpty??x2,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=SZ(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:K8(B.gaps)}:{status:"stuck",score:Y,rounds:J,history:z,ask:[]};if(J>=Q)return{status:"capped",score:Y,rounds:J,history:z,ask:K8(B.gaps)};$.runAuto(),J++}return{status:"capped",score:z[z.length-1]??0,rounds:J,history:z,ask:[]}}import{createHash as gZ}from"crypto";var L8="faf-bench/1",gq={"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 xq($,Z){return gq[$]??`What is the project's ${Z.replace(/\s*\(.*\)$/,"").toLowerCase()}?`}var xZ=[["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"]],P1=new Map;xZ.forEach(($,Z)=>$.forEach((Q)=>P1.set(Q,Z)));var hq=new Set(["a","an","the","and","or","of","for","to","in","on","with","is","it","its","their","your","via","by","using","use","used"]);function h2($){return $.toLowerCase().replace(/[^a-z0-9\s.+#-]/g," ").replace(/\.(?=\s|$)/g," ").replace(/\s+/g," ").trim()}function jZ($){return h2($).split(" ").filter((Z)=>Z&&!hq.has(Z))}function hZ($,Z){let Q=h2($),X=h2(Z);if(!Q||!X)return!1;if(Q===X)return!0;let z=P1.get(Q);if(z!==void 0&&P1.get(X)===z)return!0;let J=jZ($);if(J.length===0)return!1;let H=new Set(jZ(Z));return J.every((U)=>{if(H.has(U))return!0;let q=P1.get(U);return q!==void 0&&[...H].some((Y)=>P1.get(Y)===q)})}function yq($){let Z=n2($),Q=r($),X=[],z={},J=0;for(let q of y){if(Z.slots[q.path]!=="populated")continue;let Y=f8(Q,q);if(typeof Y!=="string")continue;let B=Y.trim();if(!B||k1.has(B.toLowerCase()))continue;J+=1,X.push({n:J,path:q.path,question:xq(q.path,q.description)}),z[J]=B}let H=JSON.stringify({v:L8,q:X.map((q)=>[q.path,q.question])}),U=gZ("sha256").update(H).digest("hex").slice(0,12);return{version:L8,qsetHash:U,questions:X,answers:z}}function fq($){return{version:$.version,qsetHash:$.qsetHash,questions:$.questions}}function kq($,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()!==""&&hZ($.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 vq($,Z){let Q=JSON.stringify({v:$.version,repo:Z??null,qset:$.qsetHash,protocol:$.protocol,cold:$.cold??null,faf:$.faf??null});return{projection:Q,hash:gZ("sha256").update(Q).digest("hex")}}import{existsSync as FB,readdirSync as tZ,readFileSync as NB}from"fs";import{join as w8,dirname as AB,extname as PB,resolve as TB}from"path";var M8={"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 yZ,readFileSync as mq,readdirSync as lq}from"fs";import{join as R8}from"path";var a0={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 pq=a0.flutterDeps,dq=a0.mcpDeps,cq=a0.serverFrameworks,iq=a0.stateManagement,rq=a0.routing;function aq($){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 y2($){let Z=R8($,"pubspec.yaml");if(!yZ(Z))return null;let Q;try{Q=mq(Z,"utf-8")}catch{return null}let X=aq(Q),z=(N)=>X.has(N.toLowerCase()),J=pq.some(z)||/^flutter:\s*$/m.test(Q)||/\bsdk:\s*flutter\b/.test(Q),H=dq.find(z),U=cq.find(([N])=>z(N)),q=iq.find(([N])=>z(N)),Y=q?q[1]:"",B=rq.find(([N])=>z(N)),G=B?B[1]:"",V=z("flutter_test")?"flutter_test":z("test")?"test":"",W=/^executables:\s*$/m.test(Q),D=!1;try{D=lq(R8($,"bin")).some((N)=>N.endsWith(".dart"))}catch{}let _=W||D,O,I="",L;if(J)if(I="Flutter",yZ(R8($,"lib","main.dart"))||/^publish_to:\s*['"]?none\b/m.test(Q))O="mobile",L="pubspec.yaml (Flutter app)";else O="library",L="pubspec.yaml (Flutter package)";else if(H)O="mcp",L=`pubspec.yaml + ${H} (Dart MCP server)`;else if(U)O="backend",I=U[1],L=`pubspec.yaml + ${U[0]} (Dart backend)`;else if(_)O="cli",L=W?"pubspec.yaml executables: (Dart CLI)":"pubspec.yaml + bin/*.dart (Dart CLI)";else O="library",L="pubspec.yaml (Dart package)";return{appType:O,isFlutter:J,framework:I,stateManagement:Y,routing:G,testing:V,found:L}}import{existsSync as F8,readFileSync as vZ,readdirSync as fZ,statSync as nq}from"fs";import{join as k2}from"path";var f2={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 oq=f2.mcpModules,tq=f2.serverFrameworks,eq=f2.cliFrameworks;function $Y($){let Z=new Set,Q=!1;for(let X of $.split(`
216
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 uZ($,Z){let Q=Z.toLowerCase();for(let X of $)if(X===Q||X.startsWith(`${Q}/`))return!0;return!1}function kZ($,Z){let Q;for(let X of Z){if(!uZ($,X[0]))continue;if(!Q||X[0].length>Q[0].length)Q=X}return Q}function ZY($,Z){let Q;for(let X of Z){if(!uZ($,X))continue;if(!Q||X.length>Q.length)Q=X}return Q}function QY($){let Z=$.match(/^module\s+(\S+)/m);return Z?Z[1]:""}function XY($){let Z=k2($,"cmd");if(!F8(Z))return!1;try{for(let Q of fZ(Z)){let X=k2(Z,Q);try{if(nq(X).isDirectory()){if(fZ(X).some((J)=>J.endsWith(".go")))return!0}else if(Q.endsWith(".go"))return!0}catch{}}}catch{}return!1}function zY($){let Z=k2($,"main.go");if(!F8(Z))return!1;try{let Q=vZ(Z,"utf-8");return/^package\s+main\b/m.test(Q)}catch{return!1}}function v2($){let Z=k2($,"go.mod");if(!F8(Z))return null;let Q;try{Q=vZ(Z,"utf-8")}catch{return null}let X=QY(Q),z=$Y(Q),J=ZY(z,oq),H=kZ(z,tq),U=kZ(z,eq),q=XY($),Y=zY($),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 HY,readFileSync as UY,readdirSync as qY}from"fs";import{join as YY}from"path";var P0={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 BY=P0.mcpPackages.map(($)=>$.toLowerCase()),GY=P0.cliPackages.map(([$,Z])=>[$.toLowerCase(),Z]),VY=P0.testPackages.map(([$,Z])=>[$.toLowerCase(),Z]),_Y=P0.grpcServerPackages.map(($)=>$.toLowerCase()),WY=P0.specializedSdks,mZ=P0.baseSdk.toLowerCase();function OY($){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 W=new Set;for(let D of $.matchAll(/<FrameworkReference\b[^>]*\bInclude\s*=\s*"([^"]+)"/gi))W.add(D[1].toLowerCase());return{sdk:X,outputType:z,targetFramework:U,isTestProject:q,useMaui:Y,useWpf:B,useWindowsForms:G,packages:V,frameworkRefs:W}}function N8($,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 lZ($,Z){let Q;for(let[X,z]of Z){if(!N8($,X))continue;if(!Q||X.length>Q[0].length)Q=[X,z]}return Q}function DY($){let Z;for(let Q of BY){if(!N8($,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 IY($){let Z=$.toLowerCase();if(!Z)return;let Q;for(let X of WY){let z=X[0].toLowerCase();if(Z===z||Z.startsWith(`${z}/`)){if(!Q||z.length>Q[0].length)Q=X}}return Q}function u2($){let Z=$.toLowerCase();return Z==="exe"||Z==="winexe"}function KY($,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 LY($,Z){let Q=Z.replace(/\.csproj$/i,""),{sdk:X,packages:z,frameworkRefs:J,outputType:H}=$,U,q="",Y,B=DY(z),G=IY(X),V=lZ(z,VY),W=lZ(z,GY),D=_Y.some((O)=>N8(z,O)),_=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(_&&u2(H))U="backend",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (host)`;else if(_&&!u2(H))U="library",q="ASP.NET Core",Y=`${Z} + FrameworkReference Microsoft.AspNetCore.App (web library)`;else if(W&&(u2(H)||!H))U="cli",q=W[1],Y=`${Z} + ${W[0]} (C# CLI)`;else if(u2(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()===mZ||X.toLowerCase().startsWith(`${mZ}/`))Y=`${Z} (C# class library)`}return{appType:U,projectName:Q,targetFramework:$.targetFramework,sdk:X||"Microsoft.NET.Sdk",framework:q,found:Y}}function T1($){if(!HY($))return[];try{return qY($).filter((Z)=>Z.toLowerCase().endsWith(".csproj")).sort()}catch{return[]}}function m2($){let Z=T1($);if(Z.length===0)return null;let Q=null,X=999;for(let z of Z){let J=YY($,z),H;try{H=UY(J,"utf-8")}catch{continue}let U=OY(H),q=LY(U,z),Y=KY(q.appType,q.framework);if(!Q||Y<X)Q=q,X=Y}return Q}import{existsSync as T0,readFileSync as RY,readdirSync as FY,statSync as NY}from"fs";import{join as d}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 AY=a.mcpArtifacts.map(($)=>$.toLowerCase()),PY=a.webPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),TY=a.webParents.map(([$,Z])=>[$.toLowerCase(),Z]),CY=a.webArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),DW=a.androidPlugins.map(($)=>$.toLowerCase()),wY=a.kmpPlugins.map(($)=>$.toLowerCase()),bY=a.jvmKotlinPlugins.map(($)=>$.toLowerCase()),EY=a.cliPlugins.map(([$,Z])=>[$.toLowerCase(),Z]),SY=a.cliArtifacts.map(([$,Z])=>[$.toLowerCase(),Z]),jY=a.libraryPlugins.map(($)=>$.toLowerCase()),gY=["pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts"];function A8($){return gY.some((Z)=>T0(d($,Z)))}function w1($){try{return RY($,"utf-8")}catch{return null}}function xY($){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 W=V.split(":")[0].toLowerCase();Z.set(G,W),Z.set(G.replace(/-/g,"."),W)}else if(X==="libraries"||X.endsWith(".libraries")){let W=V.split(":");if(W.length>=2){let D=`${W[0]}:${W[1]}`.toLowerCase();Q.set(G,D),Q.set(G.replace(/-/g,"."),D)}}}}return{plugins:Z,libraries:Q}}function hY($){let Z=d($,"gradle","libs.versions.toml");if(!T0(Z))return{plugins:new Map,libraries:new Map};let Q=w1(Z);if(!Q)return{plugins:new Map,libraries:new Map};return xY(Q)}function yY($){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 fY($,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 kY($,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 cZ($){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 C1($,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 vY($){let Z;for(let Q of AY)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 iZ($){let Z=new Set,Q=!1,X=!1,z=[d($,"src"),d($,"src","main")],J=(H,U)=>{if(U>4||!T0(H))return;let q;try{q=FY(H)}catch{return}for(let Y of q){if(Y==="androidMain"||Y==="commonMain"||Y==="jvmMain"||Y==="iosMain")Z.add(Y);let B=d(H,Y);try{if(NY(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 uY($){let Z=[],Q=$.plugins,X=$.artifacts,z=wY.some((A)=>z0(Q,A))||$.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=vY(X),q=C1(Q,PY,"plugin"),Y=C1($.parents,TY,"parent"),B=C1(X,CY,"artifact"),G=C1(Q,EY,"plugin"),V=C1(X,SY,"artifact"),W=jY.some((A)=>z0(Q,A)),D=$.packaging==="pom",_,O="",I;if(J)_="mobile",O=z?"Android+KMP":"Android",I=`${$.path||"root"} + com.android.application (${O})`;else if(U)_="mcp",O="MCP",Z.push("mcp"),I=`${$.path||"root"} + ${U} (JVM MCP server)`;else if(q||Y||B){_="backend",O=q?.[1]||Y?.[1]||B?.[1]||"JVM";let A=q?.[0]||Y?.[0]||B?.[0]||"web";I=`${$.path||"root"} + ${A} (JVM backend)`}else if(z&&!H)_="library",O="Kotlin Multiplatform",I=`${$.path||"root"} + kotlin multiplatform (KMP library)`;else if(H)_="library",O=z?"Android+KMP":"Android",I=`${$.path||"root"} + android library (${O})`;else if(V||$.hasApplicationPlugin&&($.hasMainClass||G)||G&&$.hasMainClass)_="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)_="library",I=`${$.path||"root"} + packaging=pom (Maven aggregator/BOM)`;else{_="library";let A=$.kotlinSources&&!$.javaSources?"Kotlin":"JVM";if(I=`${$.path||"root"} (${A} library)`,W)I=`${$.path||"root"} + java-library (JVM library)`}let L="Java";if($.kotlinSources&&$.javaSources)L="Java/Kotlin";else if($.kotlinSources||bY.some((A)=>z0(Q,A))||z)L="Kotlin";let N=[...new Set(Z)];return{appType:_,framework:O,facets:N,found:I,buildTool:$.buildTool,mainLanguage:L}}function mY($,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 pZ($,Z,Q){let X=Z?d($,Z):$,z=d(X,"build.gradle.kts"),J=d(X,"build.gradle"),H=T0(z)?z:T0(J)?J:null;if(!H)return null;let U=w1(H);if(!U)return null;let q=fY(U,Q),Y=kY(U,Q),B=iZ(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 dZ($,Z){let Q=Z?d($,Z):$,X=d(Q,"pom.xml");if(!T0(X))return null;let z=w1(X);if(!z)return null;let{packaging:J,parents:H,artifacts:U}=cZ(z),q=iZ(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 b1($){if(!A8($))return null;let Z=hY($),Q=[],X=null;for(let Y of["settings.gradle.kts","settings.gradle"]){let B=d($,Y);if(T0(B)){X=w1(B);break}}let z=X?yY(X):[],J=pZ($,"",Z);if(J)Q.push(J);for(let Y of z){let B=pZ($,Y,Z);if(B)Q.push(B)}let H=dZ($,"");if(H){Q.push(H);let Y=w1(d($,"pom.xml"));if(Y){let{modules:B}=cZ(Y);for(let G of B){let V=dZ($,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=uY(Y),G=mY(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 j1,readFileSync as pY,readdirSync as l2,statSync as dY}from"fs";import{join as s}from"path";var E1={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 cY=E1.mcpGems.map(($)=>$.toLowerCase()),iY=E1.webGems.map(([$,Z])=>[$.toLowerCase(),Z]),rZ=E1.cliGems.map(([$,Z])=>[$.toLowerCase(),Z]),rY=E1.railsLayoutFiles;function aY($){return j1(s($,"Gemfile"))||j1(s($,"gems.rb"))||sY($)}function sY($){try{return l2($).some((Z)=>Z.endsWith(".gemspec"))}catch{return!1}}function S1($){try{return pY($,"utf-8")}catch{return null}}function nY($){let Z=new Set;for(let Q of $.split(`
@@ -220,7 +220,7 @@ Rendered on-demand from your current <strong>${p0(Q)}</strong><br>
220
220
  `)){let z=Q.replace(/#.*$/,"").match(/add_(?:runtime_|development_)?dependency\s*\(?\s*['"]([^'"]+)['"]/i);if(z)Z.add(z[1].toLowerCase())}return Z}function eY($){let Z=new Set,Q=[];for(let z of["Gemfile","gems.rb"]){let J=s($,z),H=S1(J);if(H){for(let U of nY(H))Z.add(U);Q.push(z)}}let X=S1(s($,"Gemfile.lock"))||S1(s($,"gems.locked"));if(X){for(let z of oY(X))Z.add(z);Q.push("Gemfile.lock")}try{for(let z of l2($)){if(!z.endsWith(".gemspec"))continue;let J=S1(s($,z));if(J){for(let H of tY(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 P8($,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 $B($){let Z;for(let Q of cY)if(g1($,Q)&&(!Z||Q.length>Z.length))Z=Q;return Z}function aZ($){for(let Z of rY)if(j1(s($,Z)))return Z;return}function ZB($,Z){let Q=P8(Z,rZ);if(Q)return{hit:!0,why:Q[0]};try{for(let z of l2($)){if(!z.endsWith(".gemspec"))continue;let J=S1(s($,z));if(J&&/executables\s*=/.test(J)&&!/executables\s*=\s*\[\s*\]/.test(J))return{hit:!0,why:`${z} executables`}}}catch{}let X=s($,"bin");if(j1(X))try{let J=l2(X).filter((H)=>{if(H==="setup"||H==="console"||H==="rake")return!1;try{return dY(s(X,H)).isFile()}catch{return!1}}).filter((H)=>H!=="rails");if(J.length>0&&!g1(Z,"rails")&&!aZ($))return{hit:!0,why:`bin/${J[0]}`}}catch{}return{hit:!1,why:""}}function p2($){if(!aY($))return null;let{gems:Z,sources:Q}=eY($),X=Q[0]||"Gemfile",z=Q.some((O)=>O==="Gemfile"||O==="gems.rb"||O.includes("lock"))?"bundler":"rubygems",J=$B(Z),H=P8(Z,iY),U=aZ($),q=g1(Z,"rails")||g1(Z,"railties"),Y=ZB($,Z),B=j1(s($,"config.ru")),G=q||!!U,V=H&&H[1]!=="Rails"&&!(H[0]==="rack"&&!B)?H:void 0,W,D="",_;if(J)W="mcp",D="MCP",_=`${X} + gem ${J} (Ruby MCP)`;else if(G)if(W="backend",D="Rails",q&&U)_=`${X} + rails + ${U} (Rails)`;else if(q)_=`${X} + gem rails (Rails)`;else _=`${U} (Rails layout)`;else if(V)W="backend",D=V[1],_=`${X} + gem ${V[0]} (Ruby backend)`;else if(Y.hit)W="cli",D=P8(Z,rZ)?.[1]||"",_=`${X} + ${Y.why} (Ruby CLI)`;else W="library",_=`${X} (Ruby library)`;return{appType:W,framework:D,packageManager:z,found:_}}import{existsSync as T8,readFileSync as XB,readdirSync as zB,statSync as JB}from"fs";import{join as x1}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 HB=e.mcpPackageUrls.map(($)=>$.toLowerCase()),UB=e.mcpProducts.map(($)=>$.toLowerCase()),qB=e.serverPackageUrls.map(([$,Z])=>[$.toLowerCase(),Z]),YB=e.serverProducts.map(([$,Z])=>[$.toLowerCase(),Z]),BB=e.cliPackageUrls.map(([$,Z])=>[$.toLowerCase(),Z]),GB=e.cliProducts.map(([$,Z])=>[$.toLowerCase(),Z]),VB=e.appProductTypes,_B=e.cliProductTypes,WB=e.vaporLayoutFiles;function OB($){return T8(x1($,"Package.swift"))||C8($).length>0}function C8($){try{return zB($).filter((Z)=>{if(!Z.endsWith(".xcodeproj"))return!1;try{return JB(x1($,Z)).isDirectory()}catch{return!1}})}catch{return[]}}function oZ($){try{return XB($,"utf-8")}catch{return null}}function DB($){let Z=IB($),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),W=/\.executabletarget\s*\(/.test(Q),D=/\.target\s*\(/.test(Q)&&!W?!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:W,hasLibraryTarget:D}}function IB($){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
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 KB($,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 sZ($,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 nZ($,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 LB($){let Z=$.map((Q)=>Q.toLowerCase());return UB.some((Q)=>Z.includes(Q))}function MB($){let Z=!1,Q=!1,X;for(let z of C8($)){let J=x1($,z,"project.pbxproj"),H=oZ(J);if(!H)continue;for(let U of VB)if(H.includes(U))Z=!0,X=U;for(let U of _B)if(H.includes(U)){if(Q=!0,!X)X=U}}return{hasApplication:Z,hasTool:Q,hit:X}}function RB($){for(let Z of WB)if(T8(x1($,Z)))return Z;return}function h1($){if(!OB($))return null;let Z=x1($,"Package.swift"),Q=T8(Z),X=C8($),z=X.length>0,J=null;if(Q){let C=oZ(Z);if(C)J=DB(C)}let H=z?MB($):{hasApplication:!1,hasTool:!1},U=RB($),q=J?.packageUrls??[],Y=J?.productNames??[],B=KB(q,HB),G=LB(Y),V=sZ(q,qB),W=nZ(Y,YB),D=sZ(q,BB),_=nZ(Y,GB),O=!!(B||G),I=!!(V||W||U),L=!!(J?.hasExecutableProduct||J?.hasExecutableTarget),N=!!(D||_),A=H.hasApplication,T=Q&&z?"spm+xcode":Q?"spm":"xcode",P,w="",K;if(O)if(P="mcp",w="MCP",G)K="Package.swift + product MCP (Swift MCP)";else K=`Package.swift + ${B} (Swift MCP)`;else if(I)if(P="backend",w=W?.[1]||V?.[1]||(U?"Vapor":""),W)K=`Package.swift + product ${W[1]} (Swift backend)`;else if(V)K=`Package.swift + ${V[1]} (Swift backend)`;else K=`${U} (Swift backend layout)`;else if(A)P="app",w="",K=`${X[0]} + ${H.hit||"application"} (Swift app)`;else if(N||L&&!I&&!O)if(P="cli",w=_?.[1]||D?.[1]||"",_)K=`Package.swift + product ${_[1]} (Swift CLI)`;else if(D)K=`Package.swift + ${D[1]} (Swift CLI)`;else if(J?.hasExecutableProduct)K="Package.swift + .executable product (Swift CLI)";else K="Package.swift + .executableTarget (Swift CLI)";else if(H.hasTool&&!Q)P="cli",K=`${X[0]} + tool productType (Swift CLI)`;else if(Q)if(P="library",J?.hasLibraryProduct)K="Package.swift + .library product (Swift library)";else K="Package.swift (Swift library)";else P="library",K=`${X[0]||"xcodeproj"} (Swift — no classifying productType)`;return{appType:P,framework:w,packageManager:T,found:K}}var CB=new Set(["node_modules",".git","dist","build","venv",".venv","__pycache__","target","coverage",".next",".svelte-kit","vendor"]),wB=new Set([".py",".ts",".tsx",".js",".jsx",".svelte",".vue",".rb",".go",".rs",".php",".java",".kt",".swift"]),bB={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"]},EB=[["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 SB($,Z){for(let[Q,X]of EB)if(Q in $)return X;return Z.length>0?"framework":"config"}function jB($){try{let Z=JSON.parse(NB($,"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 gB($){let Z=[],Q=TB($),X=FB(w8($,".git")),z=new Set;for(let J=0;J<10;J++){let H;try{H=tZ(Q)}catch{break}for(let q of H){if(q.toLowerCase().endsWith(".csproj")){let B=m2(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=h1(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=M8[q];if(!Y)continue;if(q==="manifest.json"&&jB(w8(Q,q))!=="chrome")continue;if(q==="pubspec.yaml"){let B=y2(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=v2(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=p2(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=h1(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=b1(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=AB(Q);if(U===Q)break;Q=U}return Z}function xB($){let Z=[];for(let Q of $4($,2,{count:0})){let X=M8[`*${Q}`],z=X?.slots?.mainLanguage;if(z)Z.push({slots:{mainLanguage:z},priority:X.priority,frameworks:X.frameworks})}return Z}function eZ($){let Z=[...gB($),...xB($)],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:SB(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 b8($){let{slotFills:Z}=eZ($),Q={};for(let[X,z]of Object.entries(Z)){let J=bB[X];if(!J||!z)continue;let[H,U]=J;if(H==="project")(Q.project??={})[U]=z;else(Q.stack??={})[U]=z}return Q}function $4($,Z,Q){let X=new Set;if(Z<0||Q.count>400)return X;let z;try{z=tZ($,{withFileTypes:!0})}catch{return X}for(let J of z){if(Q.count++>400)break;if(!J.isDirectory()){let H=PB(J.name);if(wB.has(H))X.add(H);continue}if(CB.has(J.name)||J.name.startsWith("."))continue;for(let H of $4(w8($,J.name),Z-1,Q))X.add(H)}return X}import{existsSync as Z4,readFileSync as Q4}from"fs";import{join as X4}from"path";var f=($,Z,Q)=>({value:$,source:Z,confidence:Q});function z4($){let Z=hB($),Q=yB($),X={},z=(J,H)=>{if(H)X[J]=H};return z("what",fB(Z,Q)),z("who",kB(Q)),z("why",vB(Q)),z("where",uB(Z,Q)),z("when",mB(Q)),z("how",lB(Z,Q)),X}function E8($){let Z=z4($),Q={};return Object.keys(Z).forEach((X)=>{let z=Z[X];if(z)Q[X]=z.value}),Q}function hB($){let Z=X4($,"package.json");if(!Z4(Z))return null;try{return JSON.parse(Q4(Z,"utf-8"))}catch{return null}}function yB($){let Z=X4($,"README.md");if(!Z4(Z))return"";let Q;try{Q=Q4(Z,"utf-8")}catch{return""}return Q.split(`
222
222
  `).filter((X)=>!/^\s*\[!\[/.test(X)&&!/^\s*!\[/.test(X)).join(`
223
- `).replace(/<[^>]+>/g,"").replace(/!\[[^\]]*\]\([^)]*\)/g,"").trim()}function C0($){return $.replace(/\s+/g," ").replace(/[#*`>]/g,"").trim().slice(0,280)}function s0($,Z){let Q=new RegExp(`##?\\s+(${Z})\\s*\\n+([\\s\\S]+?)(?:\\n\\n|\\n##?|$)`,"i"),X=$.match(Q);return X&&X[2]&&X[2].trim().length>20?{body:C0(X[2]),heading:X[1].trim()}:null}function y1($,Z,Q=30){for(let X of Z){let z=$.match(X);if(z&&z[1]&&z[1].trim().length>=Q)return C0(z[1])}return null}function fB($,Z){if($?.description&&$.description.length>20)return f(C0($.description),"package.json:description",0.95);let Q=s0(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(C0(X),"README:first-paragraph",0.5);let z=y1(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 kB($){let Z=s0($,"Audience|Who|Who is this for|Who it.s for");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/\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 vB($){let Z=s0($,"Why|Mission|Motivation|Rationale|Vision");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/(?: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 uB($,Z){let Q=typeof $?.repository==="string"?$.repository:$?.repository?.url;if(Q)return f(C0(Q.replace(/^git\+/,"").replace(/\.git$/,"")),"package.json:repository",0.95);if($?.homepage)return f(C0($.homepage),"package.json:homepage",0.9);let X=y1(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 mB($){let Z=s0($,"Timeline|Status|Release|Roadmap");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/\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 lB($,Z){let Q=$?.scripts?Object.keys($.scripts):[],X=["start","dev","build"].filter((H)=>Q.includes(H));if(X.length)return f(C0(X.map((H)=>`npm run ${H}`).join(", ")),"package.json:scripts",0.9);let z=s0(Z,"Usage|Getting Started|Install|Installation|Quick Start");if(z)return f(z.body,`README:## ${z.heading}`,0.8);let J=s0(Z,"Architecture|Approach|How it works|Methodology|How");return J?f(J.body,`README:## ${J.heading}`,0.7):null}var J4="3.0";import{existsSync as F,readFileSync as $0,readdirSync as U4}from"fs";import{join as R}from"path";var H4=[{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:"file",pattern:"app.py"}]},{name:"FastAPI",slug:"fastapi",category:"backend",signals:[{type:"file",pattern:"main.py"}]},{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 pB($){let Z=R($,"Cargo.toml");if(!F(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 dB($){let Z=R($,"Cargo.toml");if(!F(Z))return!1;try{let Q=$0(Z,"utf-8");return/^\s*\[\[bin\]\]/m.test(Q)}catch{return!1}}function cB($,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=pB($);if(Q&&/(?:^|[-_])sdk(?:[-_]|$)/i.test(Q))return`Cargo.toml name "${Q}" → sdk`;return null}function iB($){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=R($,Q);if(!F(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 rB($){let Z=/(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i,Q=R($,"pyproject.toml");if(F(Q))try{let J=$0(Q,"utf-8").match(Z);if(J)return`pyproject.toml depends on ${J[1]}`}catch{}let X=R($,"requirements.txt");if(F(X))try{let J=$0(X,"utf-8").match(Z);if(J)return`requirements.txt contains ${J[1]}`}catch{}return null}function aB($,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(F(R($,"ios"))&&F(R($,"android")))return"ios/ + android/ dirs";return null}function sB($,Z){let Q=R($,"Cargo.toml");if(F(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=R($,"build.zig");if(F(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 nB($,Z){if(!F(R($,"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 oB($,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 tB($,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 eB($,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 ZG($,Z){if(!Z?.private)return null;if(!(!!Z.workspaces||F(R($,"pnpm-workspace.yaml"))))return null;return"private workspace + multi-package"}function w0($){let Z=R($,"package.json");if(!F(Z))return null;try{return JSON.parse($0(Z,"utf-8"))}catch{return null}}function q4($,Z){if(!Z.includes("*"))return F(R($,Z));let Q=Z.split("/");if(Q.length===1){let U=Z.split("*")[0];try{return U4($).some((q)=>q.startsWith(U))}catch{return!1}}let X=R($,...Q.slice(0,-1)),z=Q[Q.length-1],J=z.split("*")[0],H=z.split("*")[1]||"";try{return U4(X).some((U)=>U.startsWith(J)&&U.endsWith(H))}catch{return!1}}function QG($,Z,Q){switch($.type){case"dependency":return!!Z?.dependencies?.[$.key];case"devDependency":return!!Z?.devDependencies?.[$.key];case"file":return q4(Q,$.pattern);case"content":{if(!$.pattern||!$.key)return!1;if(!q4(Q,$.pattern))return!1;try{let X=R(Q,$.pattern);if(!F(X))return!1;return $0(X,"utf-8").toLowerCase().includes($.key.toLowerCase())}catch{return!1}}default:return!1}}function S8($){let Z=w0($);return H4.map((Q)=>{let z=Q.signals.filter((J)=>QG(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 Y4($){let Z=w0($);if(Z?.devDependencies?.typescript||Z?.dependencies?.typescript)return"TypeScript";if(F(R($,"tsconfig.json")))return"TypeScript";if(F(R($,"Cargo.toml")))return"Rust";if(F(R($,"go.mod")))return"Go";if(T1($).length>0)return"C#";if(F(R($,"pyproject.toml"))||F(R($,"setup.py")))return"Python";if(F(R($,"Gemfile")))return"Ruby";if(A8($)){let Q=b1($);if(Q)return Q.mainLanguage==="Java/Kotlin"?"Kotlin":Q.mainLanguage;return"Java"}if(F(R($,"Package.swift")))return"Swift";if(F(R($,"build.zig")))return"Zig";if(F(R($,"pubspec.yaml")))return"Dart";if(Z)return"JavaScript";return"Unknown"}function B4($){let Z=w0($),Q=S8($),X=[],z=oB($,Z);if(z)return X.push(z),{type:"documentation",found:X};let J=cB($,Z);if(J)return X.push(J),{type:"sdk",found:X};let H=iB($);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=eB($,Z);if(q)return X.push(q),{type:"saas",found:X};let Y=sB($,Z);if(Y)return X.push(Y),{type:"wasm",found:X};let B=y2($);if(B)return X.push(B.found),{type:B.appType,found:X};let G=v2($);if(G)return X.push(G.found),{type:G.appType,found:X};let V=m2($);if(V)return X.push(V.found),{type:V.appType,found:X};let W=b1($);if(W)return X.push(W.found),{type:W.appType,found:X};let D=p2($);if(D)return X.push(D.found),{type:D.appType,found:X};let _=h1($);if(_)return X.push(_.found),{type:_.appType,found:X};let O=aB($,Z);if(O)return X.push(O),{type:"mobile",found:X};if(Q.some((j)=>j.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(dB($))return X.push("Cargo.toml [[bin]]"),{type:"cli",found:X};if(F(R($,"build.zig"))){if(X.push("build.zig"),F(R($,"src/main.zig")))return X.push("src/main.zig"),{type:"cli",found:X};if(F(R($,"src/root.zig")))return X.push("src/root.zig"),{type:"library",found:X}}let L=Q.some((j)=>j.slug==="svelte"||j.slug==="sveltekit");if(Z?.private===!0&&(F(R($,"pnpm-workspace.yaml"))||Z?.workspaces!==void 0)&&L)return X.push("private workspace","Svelte"),{type:"framework",found:X};if(L)return X.push("Svelte/SvelteKit"),{type:"svelte",found:X};let A=Q.some((j)=>j.category==="frontend"),T=Q.some((j)=>j.category==="backend");if(Z?.private&&(Z.workspaces||F(R($,"pnpm-workspace.yaml")))&&A&&T)return X.push("private workspace + frontend + backend frameworks"),{type:"enterprise",found:X};let P=ZG($,Z);if(P)return X.push(P),{type:"monorepo-root",found:X};let w=tB($,Z,Q);if(w)return X.push(w),{type:"website",found:X};if(Q.some((j)=>j.slug==="nextjs"||j.slug==="nuxt"))return X.push(Q.find((j)=>j.slug==="nextjs")?"Next.js":"Nuxt"),{type:"fullstack",found:X};let C=Q.some((j)=>j.category==="frontend"),u=Q.some((j)=>j.category==="backend");if(C&&u)return X.push("frontend framework","backend framework"),{type:"fullstack",found:X};if(C)return X.push("frontend framework"),{type:"frontend",found:X};if(u)return X.push("backend framework"),{type:"backend",found:X};let m=rB($);if(m)return X.push(m),{type:"data-science",found:X};let S=nB($,Z);if(S)return X.push(S),{type:"html",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 G4($){if(F(R($,"bunfig.toml")))return"Bun";if(F(R($,"deno.json"))||F(R($,"deno.jsonc")))return"Deno";if(w0($))return"Node.js";if(F(R($,"Cargo.toml")))return"Rust";if(F(R($,"go.mod")))return"Go";if(T1($).length>0)return".NET";if(F(R($,"pubspec.yaml")))return"Dart";return"Unknown"}function V4($){if(F(R($,"pubspec.yaml")))return"pub";if(F(R($,"go.mod")))return"go modules";if(T1($).length>0)return"NuGet";if(F(R($,"pom.xml")))return"maven";if(F(R($,"build.gradle"))||F(R($,"build.gradle.kts"))||F(R($,"settings.gradle"))||F(R($,"settings.gradle.kts")))return"gradle";if(F(R($,"bun.lockb"))||F(R($,"bun.lock")))return"bun";if(F(R($,"pnpm-lock.yaml")))return"pnpm";if(F(R($,"yarn.lock")))return"yarn";if(F(R($,"package-lock.json")))return"npm";return"npm"}function _4($){if(F(R($,".github/workflows")))return"GitHub Actions";if(F(R($,".gitlab-ci.yml")))return"GitLab CI";if(F(R($,".circleci")))return"CircleCI";if(F(R($,"Jenkinsfile")))return"Jenkins";return null}function W4($){if(F(R($,"vercel.json")))return"Vercel";if(F(R($,"netlify.toml")))return"Netlify";if(F(R($,"wrangler.toml")))return"Cloudflare";if(F(R($,"Dockerfile")))return"Docker";if(F(R($,"fly.toml")))return"Fly.io";if(F(R($,"render.yaml")))return"Render";return null}function O4($){let Z=R($,"svelte.config.js");if(!F(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 D4($){let Z=w0($);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(F(R($,"tsconfig.json"))&&Z?.devDependencies?.typescript)return"TypeScript (tsc)";return null}function I4($){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)=>F(R($,Q)))}function K4($,Z){let Q={};if(Z?.scripts){for(let X of["build","test","lint","dev","start"])if(Z.scripts[X]){let z=F(R($,"bun.lock"))||F(R($,"bun.lockb"))?"bun run":"npm run";Q[X]=`${z} ${X}`}}if(F(R($,"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(F(R($,"build.zig"))){if(!Q.build)Q.build="zig build";if(!Q.test)Q.test="zig build test"}if(F(R($,"go.mod"))){if(!Q.build)Q.build="go build ./...";if(!Q.test)Q.test="go test ./..."}if(F(R($,"pyproject.toml"))||F(R($,"pytest.ini"))){if(!Q.test)Q.test="pytest"}return Q}function L4($,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(F(R($,"bunfig.toml")))z.push("Bun");else if(F(R($,"deno.json"))||F(R($,"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 M4($){let Z=w0($),Q=S8($),X=Y4($),z=B4($),J=z.type,H=G4($),U=V4($),q=_4($),Y=W4($),B=D4($),G=Q.find((E)=>E.category==="frontend"),V=Q.find((E)=>E.category==="css"),W=Q.find((E)=>E.category==="ui"),D=Q.find((E)=>E.category==="state"),_=Q.find((E)=>E.category==="backend"),O=Q.find((E)=>E.category==="database"),I=E0[J]||E0.library,L=J==="framework",N=Q.some((E)=>E.slug==="svelte"||E.slug==="sveltekit"),A=L&&N?"svelte":L?null:null,T=J==="svelte"||A==="svelte",P=T?O4($):null,w=T&&Q.some((E)=>E.slug==="sveltekit"),K=new Set(["css_framework","ui_library","database","connection","hosting"]),C={},u=y.filter((E)=>E.path.startsWith("stack."));for(let E of u){let g=E.path.replace("stack.","");if(!I.includes(E.category)){C[g]="slotignored";continue}if(L&&K.has(g)){C[g]="slotignored";continue}switch(g){case"frontend":C[g]=G?.name??(J==="cli"?"CLI":"");break;case"css_framework":C[g]=V?.name??"";break;case"ui_library":C[g]=W?.name??"";break;case"state_management":C[g]=T?D?.name??"Runes":D?.name??"";break;case"backend":C[g]=T?w?"SvelteKit":_?.name??"":_?.name??"";break;case"api_type":C[g]=w?"Server Routes":"";break;case"runtime":C[g]=H!=="Unknown"?H:"";break;case"database":C[g]=O?.name??"";break;case"connection":C[g]=O?.name??"";break;case"hosting":if(T&&P)C[g]=P;else C[g]=Y??"";break;case"build":C[g]=T?"Vite":B??"";break;case"cicd":C[g]=q??"";break;case"package_manager":C[g]=U;break;default:C[g]="";break}}let m={},S=y.filter((E)=>E.path.startsWith("monorepo."));for(let E of S){let g=E.path.replace("monorepo.","");if(!I.includes(E.category))m[g]="slotignored";else m[g]=""}let j={name:Z?.name??$.split("/").pop()??"project",goal:Z?.description??"",main_language:X,type:J};if(L&&A)j.framework=A;let x8=L4($,Z,Q,X),h8=I4($),y8=K4($,Z),f1={faf_version:J4,project:j,stack:C,human_context:{who:"",what:Z?.description??"",why:"",where:"",when:"",how:""},monorepo:m,_meta:{found:z.found}};if(x8.length>0)f1.tech_stack=x8;if(h8.length>0)f1.key_files=h8;if(Object.keys(y8).length>0)f1.commands=y8;return f1}import{existsSync as zG,readFileSync as JG}from"fs";import{join as HG}from"path";var R4={MIN_LENGTH:8,MAX_LENGTH:280},XG=[/^(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 n($){let Z=$.trim();if(Z.length<R4.MIN_LENGTH)return!1;if(Z.length>R4.MAX_LENGTH)return!1;if(XG.some((Q)=>Q.test(Z)))return!1;if(/^[\s|\-*+]/.test(Z))return!1;if(Z.split(`
223
+ `).replace(/<[^>]+>/g,"").replace(/!\[[^\]]*\]\([^)]*\)/g,"").trim()}function C0($){return $.replace(/\s+/g," ").replace(/[#*`>]/g,"").trim().slice(0,280)}function s0($,Z){let Q=new RegExp(`##?\\s+(${Z})\\s*\\n+([\\s\\S]+?)(?:\\n\\n|\\n##?|$)`,"i"),X=$.match(Q);return X&&X[2]&&X[2].trim().length>20?{body:C0(X[2]),heading:X[1].trim()}:null}function y1($,Z,Q=30){for(let X of Z){let z=$.match(X);if(z&&z[1]&&z[1].trim().length>=Q)return C0(z[1])}return null}function fB($,Z){if($?.description&&$.description.length>20)return f(C0($.description),"package.json:description",0.95);let Q=s0(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(C0(X),"README:first-paragraph",0.5);let z=y1(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 kB($){let Z=s0($,"Audience|Who|Who is this for|Who it.s for");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/\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 vB($){let Z=s0($,"Why|Mission|Motivation|Rationale|Vision");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/(?: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 uB($,Z){let Q=typeof $?.repository==="string"?$.repository:$?.repository?.url;if(Q)return f(C0(Q.replace(/^git\+/,"").replace(/\.git$/,"")),"package.json:repository",0.95);if($?.homepage)return f(C0($.homepage),"package.json:homepage",0.9);let X=y1(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 mB($){let Z=s0($,"Timeline|Status|Release|Roadmap");if(Z)return f(Z.body,`README:## ${Z.heading}`,0.8);let Q=y1($,[/\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 lB($,Z){let Q=$?.scripts?Object.keys($.scripts):[],X=["start","dev","build"].filter((H)=>Q.includes(H));if(X.length)return f(C0(X.map((H)=>`npm run ${H}`).join(", ")),"package.json:scripts",0.9);let z=s0(Z,"Usage|Getting Started|Install|Installation|Quick Start");if(z)return f(z.body,`README:## ${z.heading}`,0.8);let J=s0(Z,"Architecture|Approach|How it works|Methodology|How");return J?f(J.body,`README:## ${J.heading}`,0.7):null}var J4="3.0";import{existsSync as F,readFileSync as $0,readdirSync as U4}from"fs";import{join as R}from"path";var H4=[{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 pB($){let Z=R($,"Cargo.toml");if(!F(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 dB($){let Z=R($,"Cargo.toml");if(!F(Z))return!1;try{let Q=$0(Z,"utf-8");return/^\s*\[\[bin\]\]/m.test(Q)}catch{return!1}}function cB($,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=pB($);if(Q&&/(?:^|[-_])sdk(?:[-_]|$)/i.test(Q))return`Cargo.toml name "${Q}" → sdk`;return null}function iB($){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=R($,Q);if(!F(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 rB($){let Z=/(numpy|pandas|jupyter|scikit-learn|sklearn|pytorch|tensorflow|matplotlib|scipy)/i,Q=R($,"pyproject.toml");if(F(Q))try{let J=$0(Q,"utf-8").match(Z);if(J)return`pyproject.toml depends on ${J[1]}`}catch{}let X=R($,"requirements.txt");if(F(X))try{let J=$0(X,"utf-8").match(Z);if(J)return`requirements.txt contains ${J[1]}`}catch{}return null}function aB($,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(F(R($,"ios"))&&F(R($,"android")))return"ios/ + android/ dirs";return null}function sB($,Z){let Q=R($,"Cargo.toml");if(F(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=R($,"build.zig");if(F(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 nB($,Z){if(!F(R($,"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 oB($,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 tB($,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 eB($,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 ZG($,Z){if(!Z?.private)return null;if(!(!!Z.workspaces||F(R($,"pnpm-workspace.yaml"))))return null;return"private workspace + multi-package"}function w0($){let Z=R($,"package.json");if(!F(Z))return null;try{return JSON.parse($0(Z,"utf-8"))}catch{return null}}function q4($,Z){if(!Z.includes("*"))return F(R($,Z));let Q=Z.split("/");if(Q.length===1){let U=Z.split("*")[0];try{return U4($).some((q)=>q.startsWith(U))}catch{return!1}}let X=R($,...Q.slice(0,-1)),z=Q[Q.length-1],J=z.split("*")[0],H=z.split("*")[1]||"";try{return U4(X).some((U)=>U.startsWith(J)&&U.endsWith(H))}catch{return!1}}function QG($,Z,Q){switch($.type){case"dependency":return!!Z?.dependencies?.[$.key];case"devDependency":return!!Z?.devDependencies?.[$.key];case"file":return q4(Q,$.pattern);case"content":{if(!$.pattern||!$.key)return!1;if(!q4(Q,$.pattern))return!1;try{let X=R(Q,$.pattern);if(!F(X))return!1;return $0(X,"utf-8").toLowerCase().includes($.key.toLowerCase())}catch{return!1}}default:return!1}}function S8($){let Z=w0($);return H4.map((Q)=>{let z=Q.signals.filter((J)=>QG(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 Y4($){let Z=w0($);if(Z?.devDependencies?.typescript||Z?.dependencies?.typescript)return"TypeScript";if(F(R($,"tsconfig.json")))return"TypeScript";if(F(R($,"Cargo.toml")))return"Rust";if(F(R($,"go.mod")))return"Go";if(T1($).length>0)return"C#";if(F(R($,"pyproject.toml"))||F(R($,"setup.py")))return"Python";if(F(R($,"Gemfile")))return"Ruby";if(A8($)){let Q=b1($);if(Q)return Q.mainLanguage==="Java/Kotlin"?"Kotlin":Q.mainLanguage;return"Java"}if(F(R($,"Package.swift")))return"Swift";if(F(R($,"build.zig")))return"Zig";if(F(R($,"pubspec.yaml")))return"Dart";if(Z)return"JavaScript";return"Unknown"}function B4($){let Z=w0($),Q=S8($),X=[],z=oB($,Z);if(z)return X.push(z),{type:"documentation",found:X};let J=cB($,Z);if(J)return X.push(J),{type:"sdk",found:X};let H=iB($);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=eB($,Z);if(q)return X.push(q),{type:"saas",found:X};let Y=sB($,Z);if(Y)return X.push(Y),{type:"wasm",found:X};let B=y2($);if(B)return X.push(B.found),{type:B.appType,found:X};let G=v2($);if(G)return X.push(G.found),{type:G.appType,found:X};let V=m2($);if(V)return X.push(V.found),{type:V.appType,found:X};let W=b1($);if(W)return X.push(W.found),{type:W.appType,found:X};let D=p2($);if(D)return X.push(D.found),{type:D.appType,found:X};let _=h1($);if(_)return X.push(_.found),{type:_.appType,found:X};let O=aB($,Z);if(O)return X.push(O),{type:"mobile",found:X};if(Q.some((j)=>j.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(dB($))return X.push("Cargo.toml [[bin]]"),{type:"cli",found:X};if(F(R($,"build.zig"))){if(X.push("build.zig"),F(R($,"src/main.zig")))return X.push("src/main.zig"),{type:"cli",found:X};if(F(R($,"src/root.zig")))return X.push("src/root.zig"),{type:"library",found:X}}let L=Q.some((j)=>j.slug==="svelte"||j.slug==="sveltekit");if(Z?.private===!0&&(F(R($,"pnpm-workspace.yaml"))||Z?.workspaces!==void 0)&&L)return X.push("private workspace","Svelte"),{type:"framework",found:X};if(L)return X.push("Svelte/SvelteKit"),{type:"svelte",found:X};let A=Q.some((j)=>j.category==="frontend"),T=Q.some((j)=>j.category==="backend");if(Z?.private&&(Z.workspaces||F(R($,"pnpm-workspace.yaml")))&&A&&T)return X.push("private workspace + frontend + backend frameworks"),{type:"enterprise",found:X};let P=ZG($,Z);if(P)return X.push(P),{type:"monorepo-root",found:X};let w=tB($,Z,Q);if(w)return X.push(w),{type:"website",found:X};if(Q.some((j)=>j.slug==="nextjs"||j.slug==="nuxt"))return X.push(Q.find((j)=>j.slug==="nextjs")?"Next.js":"Nuxt"),{type:"fullstack",found:X};let C=Q.some((j)=>j.category==="frontend"),u=Q.some((j)=>j.category==="backend");if(C&&u)return X.push("frontend framework","backend framework"),{type:"fullstack",found:X};if(C)return X.push("frontend framework"),{type:"frontend",found:X};if(u)return X.push("backend framework"),{type:"backend",found:X};let m=rB($);if(m)return X.push(m),{type:"data-science",found:X};let S=nB($,Z);if(S)return X.push(S),{type:"html",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 G4($){if(F(R($,"bunfig.toml")))return"Bun";if(F(R($,"deno.json"))||F(R($,"deno.jsonc")))return"Deno";if(w0($))return"Node.js";if(F(R($,"Cargo.toml")))return"Rust";if(F(R($,"go.mod")))return"Go";if(T1($).length>0)return".NET";if(F(R($,"pubspec.yaml")))return"Dart";return"Unknown"}function V4($){if(F(R($,"pubspec.yaml")))return"pub";if(F(R($,"go.mod")))return"go modules";if(T1($).length>0)return"NuGet";if(F(R($,"pom.xml")))return"maven";if(F(R($,"build.gradle"))||F(R($,"build.gradle.kts"))||F(R($,"settings.gradle"))||F(R($,"settings.gradle.kts")))return"gradle";if(F(R($,"bun.lockb"))||F(R($,"bun.lock")))return"bun";if(F(R($,"pnpm-lock.yaml")))return"pnpm";if(F(R($,"yarn.lock")))return"yarn";if(F(R($,"package-lock.json")))return"npm";return"npm"}function _4($){if(F(R($,".github/workflows")))return"GitHub Actions";if(F(R($,".gitlab-ci.yml")))return"GitLab CI";if(F(R($,".circleci")))return"CircleCI";if(F(R($,"Jenkinsfile")))return"Jenkins";return null}function W4($){if(F(R($,"vercel.json")))return"Vercel";if(F(R($,"netlify.toml")))return"Netlify";if(F(R($,"wrangler.toml")))return"Cloudflare";if(F(R($,"Dockerfile")))return"Docker";if(F(R($,"fly.toml")))return"Fly.io";if(F(R($,"render.yaml")))return"Render";return null}function O4($){let Z=R($,"svelte.config.js");if(!F(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 D4($){let Z=w0($);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(F(R($,"tsconfig.json"))&&Z?.devDependencies?.typescript)return"TypeScript (tsc)";return null}function I4($){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)=>F(R($,Q)))}function K4($,Z){let Q={};if(Z?.scripts){for(let X of["build","test","lint","dev","start"])if(Z.scripts[X]){let z=F(R($,"bun.lock"))||F(R($,"bun.lockb"))?"bun run":"npm run";Q[X]=`${z} ${X}`}}if(F(R($,"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(F(R($,"build.zig"))){if(!Q.build)Q.build="zig build";if(!Q.test)Q.test="zig build test"}if(F(R($,"go.mod"))){if(!Q.build)Q.build="go build ./...";if(!Q.test)Q.test="go test ./..."}if(F(R($,"pyproject.toml"))||F(R($,"pytest.ini"))){if(!Q.test)Q.test="pytest"}return Q}function L4($,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(F(R($,"bunfig.toml")))z.push("Bun");else if(F(R($,"deno.json"))||F(R($,"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 M4($){let Z=w0($),Q=S8($),X=Y4($),z=B4($),J=z.type,H=G4($),U=V4($),q=_4($),Y=W4($),B=D4($),G=Q.find((E)=>E.category==="frontend"),V=Q.find((E)=>E.category==="css"),W=Q.find((E)=>E.category==="ui"),D=Q.find((E)=>E.category==="state"),_=Q.find((E)=>E.category==="backend"),O=Q.find((E)=>E.category==="database"),I=E0[J]||E0.library,L=J==="framework",N=Q.some((E)=>E.slug==="svelte"||E.slug==="sveltekit"),A=L&&N?"svelte":L?null:null,T=J==="svelte"||A==="svelte",P=T?O4($):null,w=T&&Q.some((E)=>E.slug==="sveltekit"),K=new Set(["css_framework","ui_library","database","connection","hosting"]),C={},u=y.filter((E)=>E.path.startsWith("stack."));for(let E of u){let g=E.path.replace("stack.","");if(!I.includes(E.category)){C[g]="slotignored";continue}if(L&&K.has(g)){C[g]="slotignored";continue}switch(g){case"frontend":C[g]=G?.name??(J==="cli"?"CLI":"");break;case"css_framework":C[g]=V?.name??"";break;case"ui_library":C[g]=W?.name??"";break;case"state_management":C[g]=T?D?.name??"Runes":D?.name??"";break;case"backend":C[g]=T?w?"SvelteKit":_?.name??"":_?.name??"";break;case"api_type":C[g]=w?"Server Routes":"";break;case"runtime":C[g]=H!=="Unknown"?H:"";break;case"database":C[g]=O?.name??"";break;case"connection":C[g]=O?.name??"";break;case"hosting":if(T&&P)C[g]=P;else C[g]=Y??"";break;case"build":C[g]=T?"Vite":B??"";break;case"cicd":C[g]=q??"";break;case"package_manager":C[g]=U;break;default:C[g]="";break}}let m={},S=y.filter((E)=>E.path.startsWith("monorepo."));for(let E of S){let g=E.path.replace("monorepo.","");if(!I.includes(E.category))m[g]="slotignored";else m[g]=""}let j={name:Z?.name??$.split("/").pop()??"project",goal:Z?.description??"",main_language:X,type:J};if(L&&A)j.framework=A;let x8=L4($,Z,Q,X),h8=I4($),y8=K4($,Z),f1={faf_version:J4,project:j,stack:C,human_context:{who:"",what:Z?.description??"",why:"",where:"",when:"",how:""},monorepo:m,_meta:{found:z.found}};if(x8.length>0)f1.tech_stack=x8;if(h8.length>0)f1.key_files=h8;if(Object.keys(y8).length>0)f1.commands=y8;return f1}import{existsSync as zG,readFileSync as JG}from"fs";import{join as HG}from"path";var R4={MIN_LENGTH:8,MAX_LENGTH:280},XG=[/^(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 n($){let Z=$.trim();if(Z.length<R4.MIN_LENGTH)return!1;if(Z.length>R4.MAX_LENGTH)return!1;if(XG.some((Q)=>Q.test(Z)))return!1;if(/^[\s|\-*+]/.test(Z))return!1;if(Z.split(`
224
224
  `).length>4)return!1;return!0}function UG($){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
226
  `)}function qG($){let Q=UG($).split(`
@@ -228,5 +228,5 @@ Rendered on-demand from your current <strong>${p0(Q)}</strong><br>
228
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 YG($){let Z=b0($,/^(use\s+cases?|goal)\b/i);if(Z&&n(Z))return Z;let Q=qG($);if(Q&&n(Q))return Q;return}function BG($){let Z=b0($,/^(about|description|overview|what(\s+is\s+this)?)\b/i);if(Z&&n(Z))return Z;return}function GG($){let Z=b0($,/^(audience|users?|for\s+whom|who(\s+is\s+this\s+for)?)\b/i);if(Z&&n(Z))return Z;return}function VG($){let Z=b0($,/^(why|motivation|problem|rationale)\b/i);if(Z&&n(Z))return Z;return}function _G($){let Z=b0($,/^(deployment|where(\s+it\s+runs)?|hosting)\b/i);if(Z&&n(Z))return Z;return}function WG($){let Z=b0($,/^(status|history|timeline|since|launched)\b/i);if(Z&&n(Z))return Z;return}function OG($){let Z=b0($,/^(architecture|how(\s+it\s+works)?|approach|design)\b/i);if(Z&&n(Z))return Z;return}function j8($){let Z=["README.md","README.MD","Readme.md","readme.md"],Q=null;for(let W of Z){let D=HG($,W);if(zG(D)){Q=D;break}}if(!Q)return{};let X;try{X=JG(Q,"utf-8")}catch{return{}}let z={},J=YG(X);if(J)z.project={goal:J};let H={},U=BG(X);if(U)H.what=U;let q=GG(X);if(q)H.who=q;let Y=VG(X);if(Y)H.why=Y;let B=_G(X);if(B)H.where=B;let G=WG(X);if(G)H.when=G;let V=OG(X);if(V)H.how=V;if(Object.keys(H).length>0)z.human_context=H;return z}import{existsSync as DG,readFileSync as IG}from"fs";import{join as KG}from"path";function LG($,Z){let Q=$.split(`
229
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 g8($){let Z=KG($,"Cargo.toml");if(!DG(Z))return{};let Q;try{Q=IG(Z,"utf-8")}catch{return{}}let X=LG(Q,"description");if(X&&n(X))return{project:{goal:X}};return{}}function MG($,Z){let Q={project:{...Z.project??{},...$.project??{}},human_context:{...Z.human_context??{},...$.human_context??{}}};if(Q.project&&Object.keys(Q.project).length===0)delete Q.project;if(Q.human_context&&Object.keys(Q.human_context).length===0)delete Q.human_context;return Q}function F4($){return MG(j8($),g8($))}function RG($){let Z=M4($),Q=F4($),X=d2(Z,Q);FG(X);let z=d2(X,b8($));return d2(z,{human_context:E8($)})}function FG($){let Z=$.project?.type??"library",Q=E0[Z]||E0.library;for(let X of y){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 d2($,Z){let Q={...$};for(let[X,z]of Object.entries(Z)){let J=Q[X];if(D0(J))Q[X]=z;else if(typeof z==="object"&&z!==null&&!Array.isArray(z)&&typeof J==="object"&&J!==null&&!Array.isArray(J))Q[X]=d2(J,z)}return Q}export{nU as writeServerCard,dU as writeProjectHtml,v4 as validateFaf,c0 as utcNow,Yq as upsertCatalog,b8 as turboCatSlots,eZ as turboCatScan,w4 as slotsByCategory,wZ as seedSixWsFromGoal,n2 as scoreFafYaml,jq as runLoop,z4 as relentlessContextDetailed,E8 as relentlessContext,Y8 as registryName,q8 as registryMeta,Zq as readFafa,$Z as readFafRaw,hU as readFaf,I8 as questionForSlot,fq as publicQuestions,Bq as projectCards,h2 as normalizeAnswer,SZ as loopVerdict,s2 as kernel,D0 as isPlaceholder,bZ as isHumanSlot,x2 as isEmptyValue,Tq as interviewForMissing,kq as gradeAnswers,$1 as getTier,S4 as getNextTier,j2 as generateServerCard,JZ as generateProjectHtml,WZ as generateA2ACard,MZ as fromClaudeDir,Qq as findFafaFile,ZZ as findFafFile,d0 as fafContextBlock,m8 as enrichScore,yq as deriveQuestionSet,EZ as classifyGaps,A1 as canonicalPriority,Eq as buildTableOf8,vq as buildReceipt,RG as assembleFreshFaf,hZ as answersMatch,Z0 as TIERS,TZ as STACK_INTERVIEW,o0 as SLOT_BY_PATH,y as SLOTS,D8 as SIX_WS_INTERVIEW,YZ as REGISTRY_PUBLISHER_KEY,O0 as PRIORITY_RANK,V8 as PRIORITY_ORDER,k1 as PLACEHOLDERS,g2 as KNOWLEDGE_TYPES,PZ as INTERVIEW_VERSION,Pq as INTERVIEW_PATHS,CZ as INTERVIEW_BY_PATH,r0 as INTERVIEW,A0 as FafmSoul,e0 as FAF_HEX,E4 as ENTERPRISE_SLOTS,L8 as BENCH_VERSION,b4 as BASE_SLOTS,xZ as ALIAS_GROUPS,VZ as A2A_CONTEXT_URI};
230
230
 
231
- //# debugId=4E2087397DFEC9B764756E2164756E21
231
+ //# debugId=235F20974BDD688164756E2164756E21
232
232
  //# sourceMappingURL=index.js.map