@vibe-monitor/setup 0.3.0-beta.21 → 0.3.0-beta.22

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import si from"node:path";import{fileURLToPath as Fa}from"node:url";import{spawnSync as Ma}from"node:child_process";import Ce from"node:fs";import se from"node:path";var Q="0.3.0-beta.19",vt="https://vibe-monitor-gateway.vibe-monitor-lab.workers.dev",Pt=new Set([".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".kts",".swift",".c",".h",".cc",".cpp",".hpp",".cs",".rb",".php",".vue",".svelte"]),er=new Set([".git","node_modules","dist","build",".next",".nuxt",".turbo",".cache","coverage","vendor","target","Pods",".venv","venv","__pycache__",".idea",".vscode"]),tr=Object.freeze({S0:{rank:0,label:"Unknown"},S1:{rank:1,label:"Healthy"},S2:{rank:2,label:"Drift"},S3:{rank:3,label:"Pressure"},S4:{rank:4,label:"Transition Window"},S5:{rank:5,label:"Critical"}}),Vt={ui:/(?:react|vue|svelte|component|render|dom|jsx|tsx|template)/i,data:/(?:database|query|sql|prisma|sequelize|mongoose|repository|storage|persist)/i,api:/(?:router|route|endpoint|request|response|fetch\(|axios|http)/i,auth:/(?:auth|oauth|jwt|session|permission|role|credential)/i,ai:/(?:openai|anthropic|llm|model|prompt|embedding|inference)/i,filesystem:/(?:readFile|writeFile|filesystem|\bfs\.|path\.)/i,process:/(?:child_process|spawn\(|exec\(|worker_threads|multiprocessing|subprocess)/i,network:/(?:socket|websocket|grpc|sse|tcp|udp|network)/i,state:/(?:useState|useReducer|redux|zustand|store|globalThis|singleton|state)/i,rendering:/(?:canvas|webgl|three|renderer|animation|gsap|svg)/i,export:/(?:export.*pdf|download|serialize|csv|pdf|print)/i,scheduling:/(?:cron|schedule|queue|job|worker|retry)/i,observability:/(?:telemetry|opentelemetry|trace|metric|logger|logging|span)/i},nr=[/process\.platform/g,/process\.arch/g,/\bdarwin\b/gi,/\bwin32\b/gi,/\blinux\b/gi,/\barm64\b/gi,/\bx64\b/gi,/\bcuda\b/gi,/\bmetal\b/gi,/\brocm\b/gi,/\btpu\b/gi],rr=[/process\.env\.[A-Z0-9_]*(?:TOKEN|KEY|SECRET|PASSWORD|CREDENTIAL)[A-Z0-9_]*/g,/(?:api[_-]?key|token|secret|password|credential)\s*[:=]\s*["'][^"']+["']/gi],or=[/\b(?:app|router)\.(?:get|post|put|patch|delete)\s*\(/g,/@(?:Get|Post|Put|Patch|Delete)\s*\(/g,/@(?:app|router)\.(?:get|post|put|patch|delete)\s*\(/g,/\bexport\s+(?:async\s+)?function\s+(?:GET|POST|PUT|PATCH|DELETE)\s*\(/g,/\bexport\s+const\s+(?:GET|POST|PUT|PATCH|DELETE)\s*=/g,/\b(?:GET|POST|PUT|PATCH|DELETE)\s+\/[A-Za-z0-9_{}:/.-]+/g],Bt=/(^|\/)(tests?|__tests__|specs?|acceptance|verification)(\/|$)|(^|\/)(?:(?:run-)?test|spec|verify|check|soak)[-_][^/]+\.[^.]+$|\.(test|spec)\.[^.]+$/i;import ci from"node:crypto";import tt from"node:fs";import qt from"node:path";import li from"node:os";function E(e,t=0,n=100){return Math.max(t,Math.min(n,e))}function me(e){return ci.createHash("sha256").update(String(e)).digest("hex")}function O(e){tt.mkdirSync(e,{recursive:!0,mode:448});try{tt.chmodSync(e,448)}catch{}return e}function V(){return process.env.VIBE_MONITOR_HOME||qt.join(li.homedir(),".vibe-monitor")}function ir(e,t){return qt.relative(e,t).split(qt.sep).join("/")}function I(e,t=null){try{return JSON.parse(tt.readFileSync(e,"utf8"))}catch{return t}}function q(e,t){O(qt.dirname(e));let n=e+".tmp-"+process.pid;tt.writeFileSync(n,JSON.stringify(t,null,2)+`
2
+ import si from"node:path";import{fileURLToPath as Fa}from"node:url";import{spawnSync as Ma}from"node:child_process";import Ce from"node:fs";import se from"node:path";var Q="0.3.0-beta.22",vt="https://vibe-monitor-gateway.vibe-monitor-lab.workers.dev",Pt=new Set([".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".kts",".swift",".c",".h",".cc",".cpp",".hpp",".cs",".rb",".php",".vue",".svelte"]),er=new Set([".git","node_modules","dist","build",".next",".nuxt",".turbo",".cache","coverage","vendor","target","Pods",".venv","venv","__pycache__",".idea",".vscode"]),tr=Object.freeze({S0:{rank:0,label:"Unknown"},S1:{rank:1,label:"Healthy"},S2:{rank:2,label:"Drift"},S3:{rank:3,label:"Pressure"},S4:{rank:4,label:"Transition Window"},S5:{rank:5,label:"Critical"}}),Vt={ui:/(?:react|vue|svelte|component|render|dom|jsx|tsx|template)/i,data:/(?:database|query|sql|prisma|sequelize|mongoose|repository|storage|persist)/i,api:/(?:router|route|endpoint|request|response|fetch\(|axios|http)/i,auth:/(?:auth|oauth|jwt|session|permission|role|credential)/i,ai:/(?:openai|anthropic|llm|model|prompt|embedding|inference)/i,filesystem:/(?:readFile|writeFile|filesystem|\bfs\.|path\.)/i,process:/(?:child_process|spawn\(|exec\(|worker_threads|multiprocessing|subprocess)/i,network:/(?:socket|websocket|grpc|sse|tcp|udp|network)/i,state:/(?:useState|useReducer|redux|zustand|store|globalThis|singleton|state)/i,rendering:/(?:canvas|webgl|three|renderer|animation|gsap|svg)/i,export:/(?:export.*pdf|download|serialize|csv|pdf|print)/i,scheduling:/(?:cron|schedule|queue|job|worker|retry)/i,observability:/(?:telemetry|opentelemetry|trace|metric|logger|logging|span)/i},nr=[/process\.platform/g,/process\.arch/g,/\bdarwin\b/gi,/\bwin32\b/gi,/\blinux\b/gi,/\barm64\b/gi,/\bx64\b/gi,/\bcuda\b/gi,/\bmetal\b/gi,/\brocm\b/gi,/\btpu\b/gi],rr=[/process\.env\.[A-Z0-9_]*(?:TOKEN|KEY|SECRET|PASSWORD|CREDENTIAL)[A-Z0-9_]*/g,/(?:api[_-]?key|token|secret|password|credential)\s*[:=]\s*["'][^"']+["']/gi],or=[/\b(?:app|router)\.(?:get|post|put|patch|delete)\s*\(/g,/@(?:Get|Post|Put|Patch|Delete)\s*\(/g,/@(?:app|router)\.(?:get|post|put|patch|delete)\s*\(/g,/\bexport\s+(?:async\s+)?function\s+(?:GET|POST|PUT|PATCH|DELETE)\s*\(/g,/\bexport\s+const\s+(?:GET|POST|PUT|PATCH|DELETE)\s*=/g,/\b(?:GET|POST|PUT|PATCH|DELETE)\s+\/[A-Za-z0-9_{}:/.-]+/g],Bt=/(^|\/)(tests?|__tests__|specs?|acceptance|verification)(\/|$)|(^|\/)(?:(?:run-)?test|spec|verify|check|soak)[-_][^/]+\.[^.]+$|\.(test|spec)\.[^.]+$/i;import ci from"node:crypto";import tt from"node:fs";import qt from"node:path";import li from"node:os";function E(e,t=0,n=100){return Math.max(t,Math.min(n,e))}function me(e){return ci.createHash("sha256").update(String(e)).digest("hex")}function O(e){tt.mkdirSync(e,{recursive:!0,mode:448});try{tt.chmodSync(e,448)}catch{}return e}function V(){return process.env.VIBE_MONITOR_HOME||qt.join(li.homedir(),".vibe-monitor")}function ir(e,t){return qt.relative(e,t).split(qt.sep).join("/")}function I(e,t=null){try{return JSON.parse(tt.readFileSync(e,"utf8"))}catch{return t}}function q(e,t){O(qt.dirname(e));let n=e+".tmp-"+process.pid;tt.writeFileSync(n,JSON.stringify(t,null,2)+`
3
3
  `,{encoding:"utf8",mode:384}),tt.renameSync(n,e);try{tt.chmodSync(e,384)}catch{}}function ie(e,t){let n=e>=85?"S5":e>=70?"S4":e>=50?"S3":e>=35?"S2":"S1";return t<3&&["S3","S4","S5"].includes(n)&&(n="S2"),t<4&&["S4","S5"].includes(n)&&(n="S3"),n}function A(e,t){if(!e)return 0;let n=t.flags.includes("g")?t.flags:t.flags+"g",r=new RegExp(t.source,n);return[...e.matchAll(r)].length}function te(e,t=2){let n=10**t;return Math.round(e*n)/n}import{execFileSync as ui}from"node:child_process";function di(e,t){try{return ui("git",t,{cwd:e,encoding:"utf8",maxBuffer:8*1024*1024,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}function sr(e,t=50){let n=di(e,["log","--format=@@%H","--name-only","-n",String(t)]);if(!n)return{available:!1,commitCount:0,fileCommitCounts:{},cochange:{}};let r=[],o=null;for(let c of n.split(/\r?\n/))c.startsWith("@@")?(o&&r.push(o),o={hash:c.slice(2),files:[]}):o&&c.trim()&&o.files.push(c.trim());o&&r.push(o);let i={},s=new Map;for(let c of r){let l=[...new Set(c.files)].slice(0,80);for(let u of l)i[u]=(i[u]||0)+1;for(let u=0;u<l.length;u++)for(let p=u+1;p<l.length;p++){let S=l[u]<l[p]?l[u]+"|"+l[p]:l[p]+"|"+l[u];s.set(S,(s.get(S)||0)+1)}}let a={};for(let[c,l]of s){if(l<2)continue;let[u,p]=c.split("|");(a[u]||=[]).push({file:p,count:l}),(a[p]||=[]).push({file:u,count:l})}for(let c of Object.values(a))c.sort((l,u)=>u.count-l.count);return{available:!0,commitCount:r.length,fileCommitCounts:i,cochange:a}}import pi from"node:fs";import fi from"node:path";import mi from"tree-sitter";import gi from"tree-sitter-javascript";import ar from"tree-sitter-typescript";import hi from"tree-sitter-python";var cr=new Set(["function_declaration","generator_function_declaration","function_expression","generator_function","arrow_function","method_definition","function_definition"]),yi=new Set(["call_expression","call"]),vi=Object.freeze({presentation:new Set(["ui","rendering"]),data:new Set(["data","filesystem","state"]),integration:new Set(["api","auth","network","ai"]),execution:new Set(["process","scheduling"]),operations:new Set(["observability"]),delivery:new Set(["export"])});function lr(e){let t=fi.extname(e).toLowerCase();return t===".ts"?{language:"typescript",grammar:ar.typescript}:t===".tsx"?{language:"tsx",grammar:ar.tsx}:[".js",".jsx",".mjs",".cjs"].includes(t)?{language:"javascript",grammar:gi}:t===".py"?{language:"python",grammar:hi}:null}function ur(e){return!!lr(e)}function ze(e,t){return e.slice(t.startIndex,t.endIndex)}function Si(e){return Object.entries(Vt).filter(([,t])=>t.test(e)).map(([t])=>t)}function bi(e){let t=null,n=0;for(let[r,o]of Object.entries(vi)){let i=e.filter(s=>o.has(s)).length;i>n&&(t=r,n=i)}return t||"domain"}function Ut(e,t,{stopAtNestedFunctions:n=!1,rootFunction:r=null}={}){let o=[e];for(;o.length;){let i=o.pop();if(!(n&&i!==r&&cr.has(i.type))){t(i);for(let s=i.namedChildCount-1;s>=0;s--){let a=i.namedChild(s);a&&o.push(a)}}}}function wi(e,t){let n=e.childForFieldName?.("name");if(n)return ze(t,n).trim();let r=e.parent;if(r?.type==="variable_declarator"){let o=r.childForFieldName?.("name");if(o)return ze(t,o).trim()}if(r?.type==="pair"){let o=r.childForFieldName?.("key");if(o)return ze(t,o).trim()}return null}function _i(e,t){let n=e.childForFieldName?.("function")||e.namedChild?.(0);if(!n)return null;let r=ze(t,n).trim();return/^[A-Za-z_$][\w$]*$/.test(r)?r:null}function xi(e,t,n){let r=new Set,o=0;return Ut(e,i=>{if(n==="python"){if(i.type!=="import_statement"&&i.type!=="import_from_statement")return;o+=1;let a=ze(t,i),c=a.match(/^\s*from\s+([A-Za-z0-9_.]+)/)||a.match(/^\s*import\s+([A-Za-z0-9_.]+)/);c&&r.add(c[1]);return}if(i.type!=="import_statement")return;o+=1;let s=i.childForFieldName?.("source");s&&r.add(ze(t,s).replace(/^["']|["']$/g,""))}),{count:o,specs:[...r]}}function ki(e){let t=0;return Ut(e,n=>{(n.type==="ERROR"||n.isMissing)&&(t+=1)}),t}function dr(e,t=e){let n=lr(t);if(!n)return null;let r=pi.readFileSync(e,"utf8"),o=new mi;o.setLanguage(n.grammar);let s=o.parse(r).rootNode,a=[];Ut(s,m=>{if(!cr.has(m.type))return;let h=wi(m,r),x=ze(r,m),k=Si(x);a.push({name:h,group:bi(k),responsibilityCount:k.length,node:m})});let c=a.filter(m=>m.name&&/^[A-Za-z_$][\w$]*$/.test(m.name)),l=new Set(c.map(m=>m.name)),u=new Map;for(let m of c)u.has(m.name)||u.set(m.name,m.group);let p={};for(let m of a)p[m.group]=(p[m.group]||0)+1;let S=0,d=new Set,f={},g={};for(let m of c)Ut(m.node,h=>{if(!yi.has(h.type))return;let x=_i(h,r);if(!x||!l.has(x)||x===m.name)return;let k=m.name+"->"+x;if(d.has(k))return;d.add(k),S+=1;let _=m.group,C=u.get(x)||"domain";_===C?f[_]=(f[_]||0)+1:g[_]=(g[_]||0)+1},{stopAtNestedFunctions:!0,rootFunction:m.node});let w=Object.entries(p).filter(([m,h])=>m!=="domain"&&h>=2).map(([m,h])=>{let x=f[m]||0,k=g[m]||0,_=x>=1&&k<=Math.max(1,Math.floor(x*.5));return{group:m,functionCount:h,internalCalls:x,crossCalls:k,separated:_}}).filter(m=>m.separated).sort((m,h)=>h.functionCount-m.functionCount||h.internalCalls-m.internalCalls||m.crossCalls-h.crossCalls).slice(0,4),y=xi(s,r,n.language),v=Object.entries(p).filter(([m,h])=>m!=="domain"&&h>=2).length;return{parser:"tree-sitter",language:n.language,parseErrors:ki(s),functionCount:a.length,namedFunctionCount:c.length,importDeclarationCount:y.count,responsibilityClusterCount:v,localCallEdges:S,boundaryCandidateCount:w.length,boundaryCandidates:w,groupCounts:p}}var ji=1024*1024,fr={openai:/(^|[/@-])openai($|[/@-])/i,anthropic:/anthropic/i,stripe:/stripe/i,supabase:/supabase/i,firebase:/firebase/i,aws:/(?:^|[/@-])aws(?:-sdk|$|[/@-])|@aws-sdk/i,google:/googleapis|@google-cloud|google-auth/i,azure:/@azure|azure-/i,cloudflare:/cloudflare|wrangler/i,vercel:/@vercel|vercel/i,github:/@octokit|github/i,twilio:/twilio/i,sendgrid:/sendgrid/i},Ii={state:[/redux/i,/zustand/i,/mobx/i,/pinia/i,/recoil/i,/jotai/i],http:[/axios/i,/^got$/i,/^ky$/i,/superagent/i,/undici/i],validation:[/^zod$/i,/^joi$/i,/^yup$/i,/^ajv$/i,/typebox/i,/io-ts/i],orm:[/prisma/i,/sequelize/i,/mongoose/i,/drizzle/i,/typeorm/i,/mikro-orm/i],logging:[/^pino$/i,/^winston$/i,/bunyan/i,/log4js/i]};function mr(e,t=e,n=[]){let r=[];try{r=Ce.readdirSync(t,{withFileTypes:!0})}catch{return n}for(let o of r){if(o.isSymbolicLink())continue;if(o.isDirectory()){!er.has(o.name)&&!o.name.startsWith(".vibe-monitor")&&mr(e,se.join(t,o.name),n);continue}if(!o.isFile())continue;let i=se.extname(o.name).toLowerCase();Pt.has(i)&&n.push(se.join(t,o.name))}return n}function Ai(e){let t=[],n=[/\bimport\s+(?:[^"'\n]+?\s+from\s+)?["']([^"']+)["']/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g,/\bfrom\s+([A-Za-z0-9_.]+)\s+import\b/g,/^\s*use\s+([A-Za-z0-9_:]+)/gm];for(let r of n)for(let o of e.matchAll(r))t.push(o[1]);return[...new Set(t)]}function Ei(e){return!e||e.startsWith(".")?null:e.startsWith("@")?e.split("/").slice(0,2).join("/"):e.split("/")[0]}function Ci(e){let t=new Set;for(let n of e){let r=Ei(n);if(r)for(let[o,i]of Object.entries(fr))i.test(r)&&t.add(o)}return[...t].sort()}function Ri(e,t,n,r){if(!n.startsWith("."))return null;let o=se.posix.dirname(t),i=se.posix.normalize(se.posix.join(o,n));return[i,...[...Pt].map(a=>i+a),...[...Pt].map(a=>se.posix.join(i,"index"+a))].find(a=>r.has(a))||null}function Di(e){return Object.entries(Vt).filter(([,t])=>t.test(e)).map(([t])=>t)}function Ni(e,t=10){let n=e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>=4&&!o.startsWith("//")&&!o.startsWith("#")&&!o.startsWith("/*")&&!o.startsWith("*")&&!/^import\b/.test(o)&&!/^from\s+\S+\s+import\b/.test(o));if(n.length<t)return[];let r=new Set;for(let o=0;o<=n.length-t;o++){let i=n.slice(o,o+t).join(`
4
4
  `).replace(/\s+/g," ");if(!(i.length<240)&&(r.add(me(i).slice(0,24)),r.size>=1200))break}return[...r]}function Ti(e,t,n){let r=Ce.statSync(t);if(r.size>ji)return null;let o;try{o=Ce.readFileSync(t,"utf8")}catch{return null}let i=ir(e,t),s=o.split(/\r?\n/),a=Ai(o),c=A(o,/\bfunction\s+[A-Za-z_$][\w$]*\s*\(/g)+A(o,/(?:^|\n)\s*(?:export\s+)?(?:async\s+)?(?:const|let|var)\s+[A-Za-z_$][\w$]*\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g)+A(o,/\bdef\s+[A-Za-z_]\w*\s*\(/g)+A(o,/\bfn\s+[A-Za-z_]\w*\s*\(/g),l=A(o,/\bclass\s+[A-Za-z_$][\w$]*/g)+A(o,/\bstruct\s+[A-Za-z_]\w*/g),u=nr.reduce((fe,yt)=>fe+A(o,yt),0),p=rr.reduce((fe,yt)=>fe+A(o,yt),0),S=or.reduce((fe,yt)=>fe+A(o,yt),0),d=Ci(a),f=A(o,/openapi|swagger|json\s*schema|protobuf|\.proto\b|z\.object\s*\(|Type\.Object\s*\(|BaseModel\b|interface\s+\w*(?:Request|Response|Dto|DTO)\b|type\s+\w*(?:Request|Response|Dto|DTO)\b/gi),g=A(o,/\/v[1-9]\d*\/|api[_-]?version|x-api-version|accept-version/gi),w=A(o,/backward[-_ ]compat(?:ible|ibility)?|deprecated(?:Route|Field|Version|Endpoint)?|legacy(?:Route|Api|API|Client|Adapter|Schema|Endpoint)|compat(?:ibility)?(?:Layer|Adapter|Branch|Version)/g),y=A(o,/tenantId|tenant_id|workspaceId|workspace_id|organizationId|organization_id|orgId|org_id|membership|multi[-_ ]tenant/gi),v=A(o,/stripe|checkout|subscription|billing|invoice|payment|priceId|price_id|planId|plan_id/gi),m=d.length?A(o,/\bprovider\b\s*(?:===?|!==?|:)|switch\s*\([^)]*provider|case\s+["'][^"']+["']/gi):0,h=Di(o),x=A(o,/\bif\s*[\s(]/g)+A(o,/\belse\s+if\b/g)+A(o,/\bswitch\s*\(/g)+A(o,/\bcase\s+[^:]+:/g)+A(o,/\bfor\s*[\s(]/g)+A(o,/\bwhile\s*[\s(]/g)+A(o,/\bcatch\s*[\s(]/g)+A(o,/\bexcept\b/g),k=h.filter(fe=>["ui","rendering"].includes(fe)).length,_=h.filter(fe=>["data","api","auth","filesystem","process","network","scheduling"].includes(fe)).length,C=k>0&&_>0,D=A(o,/\basync\b/g)+A(o,/\bawait\b/g)+A(o,/\.then\s*\(/g),R=A(o,/child_process|spawn\s*\(|exec\s*\(|worker_threads|multiprocessing|subprocess/g),M=A(o,/globalThis|\bglobal\.|\bsingleton\b|createGlobal|globalStore/gi),Y=A(o,/createContext|useContext|redux|zustand|mobx|pinia|globalThis|\bsingleton\b|globalStore|sharedState/gi),le=A(o,/localStorage|sessionStorage|indexedDB|sqlite|prisma|sequelize|mongoose|\bdatabase\b|\bsql\b|redis|supabase|firebase|postgres|mysql/gi),de=A(o,/\bmigration\b|\bmigrate\b|CREATE\s+TABLE|ALTER\s+TABLE|prisma\s+migrate|\balembic\b/gi),P=A(o,/\bcron\b|scheduleJob\s*\(|setInterval\s*\(|queue\.(?:add|push|enqueue)\s*\(|new\s+Worker\s*\(|worker_threads|\bbullmq\b|\bcelery\b|\bsidekiq\b|\bagenda\b|BackgroundTasks\s*\(/gi),H=A(o,/\bretry\b|backoff|maxAttempts|max_retries|retryCount|attempts/gi),pe=A(o,/\btimeout\b|AbortController|AbortSignal|\bcancel(?:led|lation)?\b/gi),re=A(o,/idempotent|idempotency|dedup(?:e|licate|lication)|exactly[-_ ]once/gi),gt=A(o,/\bmutex\b|\bsemaphore\b|\block\b|\blease\b|flock|advisory[_ -]?lock/gi),mn=A(o,/checkpoint|resume|reconcile|replay|\bdurable\b|recovery|recoverable|orphan/gi),et=A(o,/logger\.(?:info|warn|error|debug)|pino\b|winston\b|structlog\b|loguru\b/gi),Ft=A(o,/opentelemetry|@opentelemetry|\botel\b|\btelemetry\b|RuntimeEvent|runtimeEvent|publicEvent|eventJournal|traceparent|startSpan\s*\(|createCounter\s*\(|createHistogram\s*\(|prom-client|prometheus-client|sentry\.|@sentry|datadog/gi),ht=A(o,/correlation[_-]?id|request[_-]?id|trace[_-]?id|span[_-]?id/gi),ve=Bt.test(i),Mt=/^(scripts?|docs?|fixtures?|benchmarks?|examples?|dev)(\/|$)/i.test(i),ai=ve?A(o,/\bexpect\s*\(|\bassert(?:Equal|True|False|Raises)?\s*\(|\bassert\s+|should\.|toEqual\s*\(|toBe\s*\(/g):0;return{path:i,loc:s.length,nonBlankLoc:s.filter(fe=>fe.trim()).length,bytes:r.size,importCount:a.length,imports:a,functionCount:c,classCount:l,responsibilities:h,decisionCount:x,mixedLayerWork:C,duplicateBlockCount:0,_duplicateBlockHashes:Ni(o),platformAssumptions:u,credentialSurface:p,publicEndpoints:S,providerNames:d,apiContractSignals:f,apiVersionSignals:g,compatibilitySignals:w,tenantSignals:y,commercialSignals:v,providerBranchSignals:m,asyncPaths:D,processSignals:R,globalStateSignals:M,sharedStateSignals:Y,persistenceSignals:le,schemaSignals:de,backgroundJobSignals:P,retrySignals:H,timeoutSignals:pe,idempotencySignals:re,coordinationSignals:gt,recoverySignals:mn,structuredLogSignals:et,telemetrySignals:Ft,correlationSignals:ht,isTestFile:ve,isToolingFile:Mt,assertionSignals:ai,gitCommits:n.fileCommitCounts[i]||0,cochangePartners:(n.cochange[i]||[]).slice(0,10)}}function Oi(e){let t=new Map,n=new Map(e.map(i=>[i.path,i]));for(let i of e)for(let s of i._duplicateBlockHashes||[]){let a=t.get(s);a||(a=new Set,t.set(s,a)),a.add(i.path)}let r=0,o=new Set;for(let i of t.values())if(!(i.size<2)){r+=1;for(let s of i){o.add(s);let a=n.get(s);a&&(a.duplicateBlockCount+=1)}}for(let i of e)delete i._duplicateBlockHashes;return{duplicateBlockGroups:r,duplicateAffectedFiles:o.size}}function Fi(e){let t={production:0,development:0,manifests:[],technologyGroups:{},providerPackages:[],workspacePackages:0},n=new Set,r=se.join(e,"package.json");if(Ce.existsSync(r))try{let i=JSON.parse(Ce.readFileSync(r,"utf8")),s=Object.keys(i.dependencies||{}),a=Object.keys(i.devDependencies||{});t.production+=s.length,t.development+=a.length,t.manifests.push("package.json");for(let l of[...s,...a])n.add(l);let c=i.workspaces;Array.isArray(c)?t.workspacePackages=c.length:Array.isArray(c?.packages)&&(t.workspacePackages=c.packages.length)}catch{}for(let i of["pyproject.toml","requirements.txt","Cargo.toml","go.mod","Gemfile"])Ce.existsSync(se.join(e,i))&&t.manifests.push(i);for(let[i,s]of Object.entries(Ii)){let a=[...n].filter(c=>s.some(l=>l.test(c)));a.length&&(t.technologyGroups[i]=a.sort())}let o=new Set;for(let i of n)for(let[s,a]of Object.entries(fr))a.test(i)&&o.add(s);return t.providerPackages=[...o].sort(),t}function Mi(e){let t=[["vercel",["vercel.json"]],["netlify",["netlify.toml"]],["fly",["fly.toml"]],["cloudflare",["wrangler.toml","wrangler.json","wrangler.jsonc"]],["docker",["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml"]],["serverless",["serverless.yml","serverless.yaml"]],["railway",["railway.json","railway.toml"]],["render",["render.yaml","render.yml"]],["procfile",["Procfile"]]],n=[];for(let[r,o]of t)o.some(i=>Ce.existsSync(se.join(e,i)))&&n.push(r);return(Ce.existsSync(se.join(e,"k8s"))||Ce.existsSync(se.join(e,"kubernetes")))&&n.push("kubernetes"),{targets:n,targetCount:n.length}}function Pi(e){let t=new Set(e.map(l=>l.path)),n={},r={};for(let l of e)n[l.path]=[],r[l.path]||=[];for(let l of e)for(let u of l.imports){let p=Ri("",l.path,u,t);p&&(n[l.path].push(p),(r[p]||=[]).push(l.path))}let o=[],i=new Set,s=new Set,a=[];function c(l){if(i.has(l)){let u=a.indexOf(l);u>=0&&o.push([...a.slice(u),l]);return}if(!s.has(l)){i.add(l),a.push(l);for(let u of n[l]||[])c(u);a.pop(),i.delete(l),s.add(l)}}for(let l of t)c(l);return{edgeCount:Object.values(n).reduce((l,u)=>l+u.length,0),maxFanOut:Math.max(0,...Object.values(n).map(l=>l.length)),maxFanIn:Math.max(0,...Object.values(r).map(l=>l.length)),cycleCount:o.length,cycles:o.slice(0,10),outgoing:n,incoming:r}}function pr(e){let t=e.cochangePartners.filter(n=>n.count>=2).length;return Math.min(e.loc,2500)/25+e.responsibilities.length*12+Math.min(e.functionCount,100)*1.5+Math.min(e.importCount,30)*2+Math.min(e.gitCommits,20)*3+Math.min(t,10)*6+(e.mixedLayerWork?30:0)}function Vi(e){if(!ur(e.path)||e.isTestFile||e.isToolingFile)return!1;let t=e.cochangePartners.filter(n=>n.count>=2).length;return e.loc>=450&&(e.responsibilities.length>=3||e.functionCount>=15||e.importCount>=8||e.mixedLayerWork)?!0:e.loc>=200&&(e.gitCommits>=4||t>=3)}function Bi(e,t,{maxFiles:n=5,maxBytes:r=1.5*1024*1024}={}){let o=Date.now(),i=t.filter(Vi).sort((u,p)=>pr(p)-pr(u)),s=0,a=0,c=0,l=new Set;for(let u of i){if(s>=n||a+u.bytes>r&&s>0)break;try{let p=dr(se.join(e,u.path),u.path);if(!p)continue;u.structuralEvidence=p,s+=1,a+=u.bytes,c+=p.parseErrors||0,p.language&&l.add(p.language)}catch{u.structuralEvidence={parser:"tree-sitter",language:null,unavailable:!0}}}return{mode:"adaptive",candidateFiles:i.length,analyzedFiles:s,skippedByBudget:Math.max(0,i.length-s),analyzedBytes:a,parserErrors:c,languages:[...l].sort(),maxFiles:n,maxBytes:r,durationMs:Date.now()-o}}function gr(e){let t=Date.now(),n=Date.now(),r=sr(e),o=Date.now()-n,i=Date.now(),s=mr(e).map(d=>Ti(e,d,r)).filter(Boolean),a=Oi(s),c=Pi(s),l=Fi(e),u=Mi(e),p=Date.now()-i,S=Bi(e,s);return{schemaVersion:1,evidenceVersion:4,capturedAt:new Date().toISOString(),durationMs:Date.now()-t,timings:{gitEvidenceMs:o,evidenceMs:p,structuralMs:S.durationMs},summary:{sourceFiles:s.length,totalLoc:s.reduce((d,f)=>d+f.loc,0),totalFunctions:s.reduce((d,f)=>d+f.functionCount,0),totalImports:s.reduce((d,f)=>d+f.importCount,0),totalDecisions:s.reduce((d,f)=>d+f.decisionCount,0),duplicateBlockGroups:a.duplicateBlockGroups,duplicateAffectedFiles:a.duplicateAffectedFiles,productionDependencies:l.production,developmentDependencies:l.development,dependencyManifests:l.manifests,technologyGroups:l.technologyGroups,providerPackages:l.providerPackages,workspacePackages:l.workspacePackages,deploymentTargets:u.targets,deploymentTargetCount:u.targetCount,platformAssumptions:s.reduce((d,f)=>d+f.platformAssumptions,0),credentialSurface:s.reduce((d,f)=>d+f.credentialSurface,0),publicEndpoints:s.reduce((d,f)=>d+f.publicEndpoints,0),apiContractSignals:s.reduce((d,f)=>d+f.apiContractSignals,0),apiVersionSignals:s.reduce((d,f)=>d+f.apiVersionSignals,0),compatibilitySignals:s.reduce((d,f)=>d+f.compatibilitySignals,0),tenantSignals:s.reduce((d,f)=>d+f.tenantSignals,0),commercialSignals:s.reduce((d,f)=>d+f.commercialSignals,0),providerBranchSignals:s.reduce((d,f)=>d+f.providerBranchSignals,0),providerFiles:s.filter(d=>d.providerNames.length>0).length,providerNames:[...new Set(s.flatMap(d=>d.providerNames))].sort(),asyncPaths:s.reduce((d,f)=>d+f.asyncPaths,0),processSignals:s.reduce((d,f)=>d+f.processSignals,0),globalStateSignals:s.reduce((d,f)=>d+f.globalStateSignals,0),sharedStateSignals:s.reduce((d,f)=>d+f.sharedStateSignals,0),persistenceSignals:s.reduce((d,f)=>d+f.persistenceSignals,0),schemaSignals:s.reduce((d,f)=>d+f.schemaSignals,0),backgroundJobSignals:s.reduce((d,f)=>d+f.backgroundJobSignals,0),retrySignals:s.reduce((d,f)=>d+f.retrySignals,0),timeoutSignals:s.reduce((d,f)=>d+f.timeoutSignals,0),idempotencySignals:s.reduce((d,f)=>d+f.idempotencySignals,0),coordinationSignals:s.reduce((d,f)=>d+f.coordinationSignals,0),recoverySignals:s.reduce((d,f)=>d+f.recoverySignals,0),structuredLogSignals:s.reduce((d,f)=>d+f.structuredLogSignals,0),telemetrySignals:s.reduce((d,f)=>d+f.telemetrySignals,0),correlationSignals:s.reduce((d,f)=>d+f.correlationSignals,0),testFiles:s.filter(d=>d.isTestFile).length,testLoc:s.filter(d=>d.isTestFile).reduce((d,f)=>d+f.loc,0),assertionSignals:s.reduce((d,f)=>d+f.assertionSignals,0),structuralScan:S},graph:{edgeCount:c.edgeCount,maxFanOut:c.maxFanOut,maxFanIn:c.maxFanIn,cycleCount:c.cycleCount,cycles:c.cycles},git:{available:r.available,commitCount:r.commitCount},files:s}}import Se from"node:fs";import Re from"node:path";import{execFileSync as hr}from"node:child_process";function nt(e,t){try{return hr("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}function qi(e,t){try{return{ok:!0,output:hr("git",t,{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]})}}catch{return{ok:!1,output:""}}}function $e(e=process.cwd()){let t=Re.resolve(e),n=nt(t,["rev-parse","--show-toplevel"]);if(n)return Se.realpathSync(n);let r=t;for(;;){if(Se.existsSync(Re.join(r,"package.json"))||Se.existsSync(Re.join(r,"pyproject.toml"))||Se.existsSync(Re.join(r,"Cargo.toml"))||Se.existsSync(Re.join(r,"go.mod")))return Se.realpathSync(r);let o=Re.dirname(r);if(o===r)return Se.realpathSync(t);r=o}}function Ui(e){let t=String(e||"").trim().replace(/\\/g,"/").replace(/^git@([^:]+):/,"ssh://git@$1/").replace(/\.git\/?$/,"");try{let n=new URL(t);if(n.hostname)return(n.hostname.toLowerCase()+n.pathname).replace(/\/+/g,"/").replace(/\/$/,"")}catch{}return t.replace(/\/$/,"")}function Me(e){let t=Se.realpathSync(e),n=nt(e,["config","--get","remote.origin.url"]),o=Ui(n)||"local:"+t,i=me(o).slice(0,16),s=nt(e,["rev-parse","--git-dir"]);if(s){s=Re.resolve(e,s);try{s=Se.realpathSync(s)}catch{}}let a=JSON.stringify({repoId:i,realRoot:t,gitDir:s||null}),c=me(a).slice(0,16);return{id:c,repoId:i,projectInstanceId:c,legacyId:i,identityVersion:2,root:t,displayName:Re.basename(t),remotePresent:!!n,branch:nt(e,["branch","--show-current"])||null,head:nt(e,["rev-parse","HEAD"])||null}}function yr(e){let t=qi(e,["status","--porcelain=v1","-z","--untracked-files=all"]);if(!t.ok)return null;let n=nt(e,["rev-parse","HEAD"])||"no-head",r=new Set,o=t.output.split("\0").filter(Boolean);for(let s=0;s<o.length;s++){let a=o[s];if(a.length<4)continue;let c=a.slice(0,2),l=a.slice(3);if(l&&r.add(l),/[RC]/.test(c)&&s+1<o.length){let u=o[s+1];u&&r.add(u),s+=1}}let i=[...r].sort().map(s=>{let a=Re.join(e,s);try{let c=Se.statSync(a);return[s,c.size,Math.trunc(c.mtimeMs)]}catch{return[s,"deleted",0]}});return me(JSON.stringify({head:n,status:me(t.output),state:i})).slice(0,24)}import ae from"node:fs";import X from"node:path";import wt from"node:crypto";import U from"node:fs";import Z from"node:path";import{execFileSync as He}from"node:child_process";var br="Vibe Monitor",Li=1;function wr(){return O(Z.join(V(),"keystore"))}function _r(e){let t=process.env.VIBE_MONITOR_TEST_SECRET_DIR?O(process.env.VIBE_MONITOR_TEST_SECRET_DIR):wr();return Z.join(t,e.replace(/[^A-Za-z0-9_.-]/g,"_")+".key")}function Ji(e){try{return He("security",["find-generic-password","-s",br,"-a",e,"-w"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function zi(e,t){He("security",["add-generic-password","-U","-s",br,"-a",e,"-w",t],{stdio:["ignore","ignore","ignore"]})}function xr(){return process.env.SystemRoot?Z.join(process.env.SystemRoot,"System32","WindowsPowerShell","v1.0","powershell.exe"):"powershell.exe"}function gn(e){return Z.join(wr(),e.replace(/[^A-Za-z0-9_.-]/g,"_")+".dpapi")}function kr(e,t=null){let n={...process.env,VIBE_DPAPI_FILE_B64:Buffer.from(e,"utf8").toString("base64")};t!==null&&(n.VIBE_DPAPI_VALUE_B64=Buffer.from(t,"utf8").toString("base64"));let r=["Add-Type -AssemblyName System.Security;","$f=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:VIBE_DPAPI_FILE_B64));","$b=[IO.File]::ReadAllBytes($f);","$p=[Security.Cryptography.ProtectedData]::Unprotect($b,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser);","[Convert]::ToBase64String($p)"].join(""),o=["Add-Type -AssemblyName System.Security;","$f=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:VIBE_DPAPI_FILE_B64));","$p=[Convert]::FromBase64String($env:VIBE_DPAPI_VALUE_B64);","$b=[Security.Cryptography.ProtectedData]::Protect($p,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser);","[IO.File]::WriteAllBytes($f,$b)"].join("");return{args:["-NoProfile","-NonInteractive","-Command",t===null?r:o],env:n}}function jr(e){let t=gn(e);if(!U.existsSync(t))return null;try{let n=kr(t),r=He(xr(),n.args,{encoding:"utf8",env:n.env,stdio:["ignore","pipe","ignore"]}).trim();return r?Buffer.from(r,"base64").toString("utf8"):null}catch{return null}}function Ir(e,t){let n=gn(e),r=kr(n,t);He(xr(),r.args,{env:r.env,stdio:["ignore","ignore","ignore"]});try{U.chmodSync(n,384)}catch{}}function Lt(){try{return He("sh",["-lc","command -v secret-tool >/dev/null 2>&1"],{stdio:["ignore","ignore","ignore"]}),!0}catch{return!1}}function $i(e){if(!Lt())return null;try{return He("secret-tool",["lookup","service","vibe-monitor","account",e],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function Hi(e,t){He("secret-tool",["store","--label=Vibe Monitor","service","vibe-monitor","account",e],{input:t,encoding:"utf8",stdio:["pipe","ignore","ignore"]})}function vr(e){let t=_r(e);try{return U.readFileSync(t,"utf8").trim()||null}catch{return null}}function Sr(e,t){let n=_r(e);U.writeFileSync(n,t+`
5
5
  `,{encoding:"utf8",mode:384});try{U.chmodSync(n,384)}catch{}}function Ar(){return process.env.VIBE_MONITOR_TEST_SECRET_DIR||process.env.VIBE_MONITOR_TEST_MASTER_KEY?"test-env":process.platform==="darwin"?"macos-keychain":process.platform==="win32"?"windows-dpapi":process.platform==="linux"&&Lt()?"linux-secret-service":"file-0600"}function _t(e){return process.env.VIBE_MONITOR_TEST_MASTER_KEY&&e==="project-state-key"?process.env.VIBE_MONITOR_TEST_MASTER_KEY:process.env.VIBE_MONITOR_TEST_SECRET_DIR?vr(e):process.platform==="darwin"?Ji(e):process.platform==="win32"?jr(e):process.platform==="linux"&&Lt()?$i(e):vr(e)}function rt(e,t){if(!(process.env.VIBE_MONITOR_TEST_MASTER_KEY&&e==="project-state-key"))return process.env.VIBE_MONITOR_TEST_SECRET_DIR?Sr(e,t):process.platform==="darwin"?zi(e,t):process.platform==="win32"?Ir(e,t):process.platform==="linux"&&Lt()?Hi(e,t):Sr(e,t)}function Er(){if(process.platform!=="win32"||process.env.VIBE_MONITOR_TEST_SECRET_DIR)return{ok:!0,backend:Ar(),checked:!1};let e="__credential-preflight-"+process.pid+"-"+wt.randomBytes(6).toString("hex"),t=gn(e),n="vibe-dpapi-preflight-"+wt.randomBytes(24).toString("base64url");try{if(Ir(e,n),jr(e)!==n)throw new Error("dpapi_round_trip_mismatch");return{ok:!0,backend:"windows-dpapi",checked:!0}}catch(r){let o=new Error("credential_preflight_failed");throw o.cause=r,o.installPhase="credential_preflight",o}finally{try{U.rmSync(t,{force:!0})}catch{}}}function xt(e,t=32){let n=_t(e);if(n)return n;let r=wt.randomBytes(t).toString("base64url");return rt(e,r),r}function Gi(){let e=xt("project-state-key",32),t=Buffer.from(e,"base64url");return t.length!==32?wt.createHash("sha256").update(e).digest():t}function Wi(e){return Buffer.from("vibe-monitor:"+Z.basename(e),"utf8")}function Ge(e,t="state.enc"){if(!e||e.v!==Li||e.alg!=="A256GCM")throw new Error("unsupported_encrypted_state");let n=wt.createDecipheriv("aes-256-gcm",Gi(),Buffer.from(e.iv,"base64"));n.setAAD(Wi(t)),n.setAuthTag(Buffer.from(e.tag,"base64"));let r=Buffer.concat([n.update(Buffer.from(e.data,"base64")),n.final()]);return JSON.parse(r.toString("utf8"))}function We(){let e=Ar(),t=Z.join(V(),"projects"),n=0,r=0,o=0;if(U.existsSync(t)){let i=s=>{for(let a of U.readdirSync(s,{withFileTypes:!0})){let c=Z.join(s,a.name);if(a.isDirectory()){i(c);continue}if(a.name.endsWith(".enc")&&(n+=1),a.name.endsWith(".json")){r+=1;try{(U.statSync(c).mode&63)!==0&&(o+=1)}catch{}}}};i(t)}return{secretBackend:e,osProtectedSecrets:["macos-keychain","windows-dpapi","linux-secret-service"].includes(e),projectStateStorage:"plaintext-json-0600",plaintextProjectJsonFiles:r,legacyEncryptedProjectFiles:n,nonPrivateProjectFiles:o,projectStateRisk:"Contains derived project structure/evolution metadata, not source code, diffs, prompts, or secret values.",fallbackWarning:e==="file-0600"?"OS secret store unavailable; cloud/telemetry secrets are protected only by user-only filesystem permissions.":null}}function Yi(e,t){if(!U.existsSync(e))return!1;if(U.existsSync(t))try{JSON.parse(U.readFileSync(t,"utf8"));try{U.chmodSync(t,384)}catch{}return U.unlinkSync(e),!1}catch{}let n=JSON.parse(U.readFileSync(e,"utf8")),r=Ge(n,e);return q(t,r),U.unlinkSync(e),!0}function ot(){let e=Z.join(V(),"projects");if(!U.existsSync(e))return{migrated:0,failed:0};let t=0,n=0,r=o=>{for(let i of U.readdirSync(o,{withFileTypes:!0})){let s=Z.join(o,i.name);if(i.isDirectory()){r(s);continue}try{if(i.name.endsWith(".enc")){let a=s.replace(/\.enc$/,".json");Yi(s,a)&&(t+=1);continue}if(i.name.endsWith(".json"))try{U.chmodSync(s,384)}catch{}}catch{n+=1}}};return r(e),{migrated:t,failed:n}}function bt(e){if(!U.existsSync(e))return null;try{U.chmodSync(e,384)}catch{}return JSON.parse(U.readFileSync(e,"utf8"))}function hn(e=process.cwd(),{section:t="all",snapshotLimit:n=10}={}){ot();let r=$e(e),o=Me(r),i=Z.join(V(),"projects",o.id),s={latest:()=>bt(Z.join(i,"latest.json")),findings:()=>bt(Z.join(i,"findings.json")),intent:()=>bt(Z.join(i,"intent.json")),notice:()=>bt(Z.join(i,"notice-state.json")),snapshots:()=>{let c=Z.join(i,"snapshots");return U.existsSync(c)?U.readdirSync(c).filter(l=>l.endsWith(".json")).sort().slice(-Math.max(1,Math.min(100,Number(n)||10))).map(l=>({file:l,value:bt(Z.join(c,l))})):[]}};if(t!=="all"&&!s[t])throw new Error("unknown_security_section:"+t);let a=t==="all"?Object.fromEntries(Object.entries(s).map(([c,l])=>[c,l()])):{[t]:s[t]()};return{project:{id:o.id,root:o.root},storage:"plaintext-json-0600",state:a}}function Cr(e,t,{section:n="all",snapshotLimit:r=10}={}){if(!t)throw new Error("output_required");let o=hn(e,{section:n,snapshotLimit:r}),i=Z.resolve(t);O(Z.dirname(i)),U.writeFileSync(i,JSON.stringify(o,null,2)+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-monitor/setup",
3
- "version": "0.3.0-beta.21",
3
+ "version": "0.3.0-beta.22",
4
4
  "private": false,
5
5
  "description": "Session-scoped software evolution monitor for AI-assisted coding.",
6
6
  "type": "module",