scip-query 0.10.3 → 0.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/dist/{chunk-YVLHL6KQ.js → chunk-237YUOPK.js} +2 -2
- package/dist/chunk-56UN3DMK.js +2 -0
- package/dist/chunk-5UDFZC4D.js +2 -0
- package/dist/{chunk-X474LKJX.js → chunk-6UFMPECA.js} +2 -2
- package/dist/chunk-7JOTOWZO.js +4 -0
- package/dist/chunk-A7RNHUJH.js +20 -0
- package/dist/chunk-AYYIZ4BA.js +4 -0
- package/dist/chunk-BNKE4TT5.js +2 -0
- package/dist/chunk-MA7OVFHI.js +2 -0
- package/dist/chunk-ONPCQ2PM.js +6 -0
- package/dist/chunk-QUJBXLBY.js +2 -0
- package/dist/chunk-WBJZNPUT.js +2 -0
- package/dist/{chunk-4HOMAEDD.js → chunk-YUTRW57I.js} +2 -2
- package/dist/cli.js +211 -198
- package/dist/frontend-behavior-evidence-BxKpKWUu.d.ts +4 -0
- package/dist/postinstall.js +3 -3
- package/dist/queries/diff-gate.d.ts +4 -2
- package/dist/queries/diff-gate.js +1 -1
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/health.js +1 -1
- package/dist/queries/incomplete-migration.js +1 -1
- package/dist/queries/index.d.ts +1 -0
- package/dist/queries/index.js +1 -1
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/react-component-duplicates.js +1 -1
- package/dist/queries/react-hook-candidates.d.ts +3 -2
- package/dist/queries/react-hook-candidates.js +1 -1
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/vue-component-duplicates.js +1 -1
- package/dist/queries/vue-composable-candidates.d.ts +3 -2
- package/dist/queries/vue-composable-candidates.js +1 -1
- package/dist/reindex-worker.js +8 -8
- package/dist/reindex.d.ts +1 -1
- package/dist/reindex.js +19 -19
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +2 -2
- package/dist/{scip-cli-a-xOztiK.d.ts → scip-cli-Bh1M_JPu.d.ts} +1 -1
- package/docs/AGENT_GUIDE.md +42 -5
- package/docs/AI_FAILURE_MODES.md +28 -21
- package/docs/COMMAND_REFERENCE.md +4 -2
- package/docs/analyzer-inventory.md +5 -1
- package/docs/analyzer-validation-ledger.md +8 -0
- package/package.json +7 -3
- package/scripts/build-scip-windows.mjs +75 -0
- package/skills/concrete-plan/SKILL.md +3 -5
- package/skills/concrete-plan/agents/openai.yaml +4 -0
- package/skills/scip-adoption/SKILL.md +120 -0
- package/skills/scip-adoption/agents/openai.yaml +4 -0
- package/skills/scip-ai-cleanup/SKILL.md +12 -4
- package/skills/scip-ai-cleanup/agents/openai.yaml +4 -0
- package/skills/scip-api-impact/SKILL.md +147 -0
- package/skills/scip-api-impact/agents/openai.yaml +4 -0
- package/skills/scip-debloat/SKILL.md +15 -13
- package/skills/scip-debloat/agents/openai.yaml +4 -0
- package/skills/scip-debug/SKILL.md +119 -0
- package/skills/scip-debug/agents/openai.yaml +4 -0
- package/skills/scip-diagram/SKILL.md +138 -0
- package/skills/scip-diagram/agents/openai.yaml +4 -0
- package/skills/scip-directory-architecture/SKILL.md +2 -2
- package/skills/scip-directory-architecture/agents/openai.yaml +4 -0
- package/skills/scip-doc-reconcile/SKILL.md +1 -3
- package/skills/scip-doc-reconcile/agents/openai.yaml +4 -0
- package/skills/scip-explore/SKILL.md +8 -2
- package/skills/scip-explore/agents/openai.yaml +4 -0
- package/skills/scip-health-audit/SKILL.md +158 -0
- package/skills/scip-health-audit/agents/openai.yaml +4 -0
- package/skills/scip-health-improve/SKILL.md +151 -0
- package/skills/scip-health-improve/agents/openai.yaml +4 -0
- package/skills/scip-language-playbook/SKILL.md +7 -4
- package/skills/scip-language-playbook/agents/openai.yaml +4 -0
- package/skills/scip-maintainability/SKILL.md +7 -3
- package/skills/scip-maintainability/agents/openai.yaml +4 -0
- package/skills/scip-query/SKILL.md +74 -33
- package/skills/scip-query/agents/openai.yaml +4 -0
- package/skills/scip-query-setup/SKILL.md +65 -18
- package/skills/scip-query-setup/agents/openai.yaml +3 -0
- package/skills/scip-react-maintainability/SKILL.md +2 -2
- package/skills/scip-react-maintainability/agents/openai.yaml +4 -0
- package/skills/scip-triage-issue/SKILL.md +112 -0
- package/skills/scip-triage-issue/agents/openai.yaml +4 -0
- package/skills/scip-verify/SKILL.md +83 -232
- package/skills/scip-verify/agents/openai.yaml +4 -0
- package/skills/scip-vue-maintainability/SKILL.md +2 -3
- package/skills/scip-vue-maintainability/agents/openai.yaml +4 -0
- package/vendor/scip/LICENSE.scip +201 -0
- package/vendor/scip/README.md +6 -0
- package/vendor/scip/win32-arm64/scip.exe +0 -0
- package/vendor/scip/win32-x64/scip.exe +0 -0
- package/dist/chunk-7ADUXFRZ.js +0 -2
- package/dist/chunk-GLJAAKDW.js +0 -4
- package/dist/chunk-GS33KGAY.js +0 -2
- package/dist/chunk-I7TSQZ3J.js +0 -4
- package/dist/chunk-NP5HYVLX.js +0 -20
- package/dist/chunk-NXIAHE7F.js +0 -5
- package/dist/chunk-O4L4AB3T.js +0 -2
- package/dist/chunk-TO54DY4O.js +0 -2
- package/dist/chunk-UMNENNTX.js +0 -2
package/dist/reindex.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
VALUES (?, ?, NULL, ?)`),u=o.transaction(g=>{let l=0;for(let p of g){if(i.has(p))continue;let m=
|
|
3
|
-
`).filter(r=>r&&n.has(v(r).toLowerCase())).sort()}catch{return null}}function
|
|
4
|
-
`)){if(!r)continue;let o=
|
|
5
|
-
`).filter(Boolean)}catch{return null}}function
|
|
6
|
-
`)[0]}`;return t(`Skipping ${e.language}: ${s}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:s}}}finally{
|
|
1
|
+
import{a as x,b as O,f as F}from"./chunk-ONPCQ2PM.js";import{a as ne}from"./chunk-UUBMFL3F.js";import{a as Z,b as ee}from"./chunk-OBBDKQAG.js";import"./chunk-64MNV6AB.js";import"./chunk-7S5E7KWT.js";import{execFileSync as ur}from"child_process";import{closeSync as cr,copyFileSync as lr,existsSync as w,mkdirSync as K,mkdtempSync as gr,openSync as pr,readFileSync as We,renameSync as Y,rmSync as Q,writeFileSync as Ge}from"fs";import{basename as C,dirname as f,extname as dr,join as d}from"path";import qe from"better-sqlite3";import{execFileSync as Xe}from"child_process";import{existsSync as Ke,readdirSync as Ye,readFileSync as Qe}from"fs";import{extname as v,join as te}from"path";function b(e){let n=new Set((e.extensions??Z).map(i=>i.toLowerCase()));if(n.size===0)return{scanned:0,inserted:0,existing:0};if(!Ke(e.dbPath))throw new Error(`SCIP SQLite database not found at ${e.dbPath}`);let t=ne(e.projectRoot),r=Ze(e.projectRoot,n).filter(i=>!t.isIgnored(i)),o=new qe(e.dbPath);try{let i=nn(o,r),s=o.prepare(`INSERT OR IGNORE INTO documents (language, relative_path, position_encoding, text)
|
|
2
|
+
VALUES (?, ?, NULL, ?)`),u=o.transaction(g=>{let l=0;for(let p of g){if(i.has(p))continue;let m=Qe(te(e.projectRoot,p),"utf-8"),ze=s.run(tn(p),p,m);l+=Number(ze.changes)}return l})(r),c={scanned:r.length,inserted:u,existing:r.length-u};return e.onStatus?.(`Augmented SQLite documents with ${u} auxiliary source file${u===1?"":"s"} (${c.existing} already present).`),c}finally{o.close()}}function Ze(e,n){let t=en(e,n);if(t)return t;let r=[],o=i=>{let s=i?te(e,i):e,a;try{a=Ye(s,{withFileTypes:!0})}catch{return}for(let u of a){if(ee.has(u.name))continue;let c=i?`${i}/${u.name}`:u.name;if(u.isDirectory()){o(c);continue}n.has(v(u.name).toLowerCase())&&r.push(c)}};return o(""),r.sort()}function en(e,n){try{return Xe("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}).split(`
|
|
3
|
+
`).filter(r=>r&&n.has(v(r).toLowerCase())).sort()}catch{return null}}function nn(e,n){let t=new Set,r=500;for(let o=0;o<n.length;o+=r){let i=n.slice(o,o+r),s=e.prepare(`SELECT relative_path FROM documents WHERE relative_path IN (${i.map(()=>"?").join(",")})`).all(...i);for(let a of s)t.add(a.relative_path)}return t}function tn(e){return v(e).toLowerCase()===".vue"?"vue":v(e).replace(/^\./,"").toLowerCase()||"source"}import{execFileSync as rn}from"child_process";import{existsSync as on,readdirSync as oe}from"fs";import{extname as ie,join as se}from"path";var sn=new Set([".git",".hg",".svn",".idea",".vscode","node_modules","vendor","dist","build","target","bin","obj",".dart_tool",".gradle",".next",".venv","venv","__pycache__"]),an=[{language:"typescript",files:["tsconfig.json","tsconfig.base.json"],extensions:[".ts",".tsx",".mts",".cts"]},{language:"rust",files:["Cargo.toml"],extensions:[".rs"]},{language:"go",files:["go.mod"],extensions:[".go"]},{language:"java",files:["pom.xml","build.gradle","build.gradle.kts"],extensions:[".java"]},{language:"kotlin",files:["build.gradle.kts"],extensions:[".kt",".kts"]},{language:"scala",files:["build.sbt"],extensions:[".scala"]},{language:"python",files:["pyproject.toml","setup.py","setup.cfg","Pipfile"],extensions:[".py",".pyi"]},{language:"ruby",files:["Gemfile"],extensions:[".rb"]},{language:"cpp",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"]},{language:"c",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".c",".h"]},{language:"csharp",globs:["*.csproj","*.sln"],extensions:[".cs"]},{language:"vb",globs:["*.vbproj"],extensions:[".vb"]},{language:"dart",files:["pubspec.yaml"],extensions:[".dart"]},{language:"php",files:["composer.json"],extensions:[".php"]},{language:"javascript",files:["package.json"],extensions:[".js",".jsx",".mjs",".cjs"]}];function D(e){let n=[],t=un(e),r=pn(e);for(let o of an){if(cn(e,o.files)){n.push(o.language);continue}if(ln(t,o.globs)){n.push(o.language);continue}mn(r,o.extensions)&&n.push(o.language)}return n.includes("typescript")&&re(n,"javascript"),n.includes("cpp")&&!r.has(".c")&&re(n,"c"),n}function un(e){try{return oe(e)}catch{return[]}}function cn(e,n){return n?.length?n.some(t=>on(se(e,t))):!1}function ln(e,n){return n?.length?e.some(t=>n.some(r=>gn(t,r))):!1}function gn(e,n){if(n==="*")return!0;if(!n.includes("*"))return e===n;let[t,r]=n.split("*");return e.startsWith(t??"")&&e.endsWith(r??"")}function pn(e){let n=dn(e);if(n)return n;let t=new Set,r=[e];for(;r.length>0;){let o=r.pop();if(!o)continue;let i;try{i=oe(o,{withFileTypes:!0})}catch{continue}for(let s of i){if(s.name.startsWith(".")&&!s.name.endsWith("proj")&&!s.name.endsWith("sln")&&s.isDirectory())continue;let a=se(o,s.name);if(s.isDirectory()){sn.has(s.name)||r.push(a);continue}let u=ie(s.name).toLowerCase();u&&t.add(u)}}return t}function dn(e){try{let n=rn("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}),t=new Set;for(let r of n.split(`
|
|
4
|
+
`)){if(!r)continue;let o=ie(r).toLowerCase();o&&t.add(o)}return t}catch{return null}}function mn(e,n){return n?.length?n.some(t=>e.has(t)):!1}function re(e,n){let t=e.indexOf(n);t!==-1&&e.splice(t,1)}import{existsSync as ae,readdirSync as fn}from"fs";import{join as E}from"path";var ce={typescript:{language:"typescript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,pnpmWorkspaces:n,indexerBinary:t})=>{let r=["index","--infer-tsconfig","--output",e,"--no-progress-bar"];return n&&r.splice(1,0,"--pnpm-workspaces"),{binary:t,args:r}},markerFiles:["tsconfig.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},javascript:{language:"javascript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,indexerBinary:n})=>({binary:n,args:["index","--infer-tsconfig","--output",e,"--no-progress-bar"]}),markerFiles:["package.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},java:{language:"java",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["pom.xml","build.gradle"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},scala:{language:"scala",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.sbt"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},kotlin:{language:"kotlin",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.gradle.kts"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},rust:{language:"rust",indexerBinary:"rust-analyzer",checkCommand:"rust-analyzer --version",indexArgs:({outputPath:e})=>({binary:"rust-analyzer",args:["scip",".","--output",e]}),markerFiles:["Cargo.toml"],installMethods:[{label:"rustup",prerequisite:"rustup",binary:"rustup",args:["component","add","rust-analyzer"]}],installUrl:"https://github.com/rust-lang/rust-analyzer"},python:{language:"python",indexerBinary:"scip-python-plus",binaryAliases:["scip-python"],checkCommand:"scip-python-plus --version",indexArgs:({outputPath:e,indexerBinary:n})=>({binary:n,args:["index","--output",e,"--project-name","project"]}),markerFiles:["pyproject.toml","setup.py"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","scip-python-plus"]}],installUrl:"https://github.com/PlunderStruck/scip-python",bundledNpmPackage:"scip-python-plus"},ruby:{language:"ruby",indexerBinary:"scip-ruby",checkCommand:"scip-ruby --version",indexArgs:({indexerBinary:e})=>({binary:e,args:["--dir","."]}),defaultOutputPath:"index.scip",markerFiles:["Gemfile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-ruby/releases"},go:{language:"go",indexerBinary:"scip-go",checkCommand:"scip-go --version",indexArgs:({outputPath:e})=>({binary:"scip-go",args:["--output",e]}),markerFiles:["go.mod"],installMethods:[{label:"go install",prerequisite:"go",binary:"go",args:["install","github.com/sourcegraph/scip-go@latest"]}],installUrl:"https://github.com/sourcegraph/scip-go"},cpp:{language:"cpp",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},c:{language:"c",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},csharp:{language:"csharp",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:n})=>({binary:"scip-dotnet",args:["index",ue(e,[".sln",".csproj"])??e,"--output",n,"--working-directory",e]}),markerFiles:["*.csproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},vb:{language:"vb",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:n})=>({binary:"scip-dotnet",args:["index",ue(e,[".sln",".vbproj"])??e,"--output",n,"--working-directory",e]}),markerFiles:["*.vbproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},dart:{language:"dart",indexerBinary:"scip-dart",checkCommand:"scip-dart --version",indexArgs:({indexerBinary:e,outputPath:n})=>({binary:e,args:["--output",n]}),markerFiles:["pubspec.yaml"],installMethods:[{label:"dart pub",prerequisite:"dart",binary:"dart",args:["pub","global","activate","scip_dart"]}],installUrl:"https://github.com/Workiva/scip-dart/releases"},php:{language:"php",indexerBinary:"scip-php",projectLocalBinaries:["vendor/davidrjenni/scip-php/bin/scip-php","vendor/bin/scip-php"],checkCommand:"scip-php --version",indexArgs:({projectRoot:e,indexerBinary:n})=>{let t=E(e,"vendor","bin","scip-php"),r=E(e,"vendor","davidrjenni","scip-php","bin","scip-php");return{binary:"php",args:["-d","error_reporting=E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED",ae(r)?r:ae(t)?t:n]}},defaultOutputPath:"index.scip",markerFiles:["composer.json"],installMethods:[],installUrl:"https://github.com/davidrjenni/scip-php/releases"}};function k(e){return ce[e]}function ue(e,n){let t;try{t=fn(e)}catch{return null}for(let r of t)if(n.some(o=>r.endsWith(o)))return E(e,r);return null}import{readFileSync as hn,writeFileSync as bn}from"fs";import{create as V}from"@bufbuild/protobuf";import{deserializeSCIP as yn,serializeSCIP as xn,DocumentSchema as Sn,IndexSchema as Rn,SymbolInformationSchema as vn}from"@c4312/scip";function le(e){if(e.length===0)throw new Error("Cannot merge zero SCIP indexes");if(e.length===1)return e[0];let n=kn(e),t=In(e.flatMap(o=>o.documents??[])),r=ge(e.flatMap(o=>o.externalSymbols??[]));return V(Rn,{metadata:n,documents:t,externalSymbols:r})}function T(e,n){if(e.length===0)throw new Error("Cannot merge zero SCIP files");let t=e.map(o=>yn(hn(o))),r=le(t);return bn(n,Buffer.from(xn(r))),{documentCount:r.documents.length,externalSymbolCount:r.externalSymbols.length,inputCount:e.length}}function kn(e){let n=e[0]?.metadata;if(!n)return;let t=n.projectRoot;for(let r of e.slice(1)){let o=r.metadata?.projectRoot;if(t&&o&&o!==t)throw new Error(`Cannot merge SCIP indexes with different project roots: ${t} vs ${o}`)}return n}function In(e){let n=new Map;for(let t of e){let r=n.get(t.relativePath);if(!r){n.set(t.relativePath,t);continue}n.set(t.relativePath,V(Sn,{language:r.language||t.language,relativePath:r.relativePath||t.relativePath,occurrences:[...r.occurrences,...t.occurrences],symbols:ge([...r.symbols,...t.symbols]),text:Ln(r.text,t.text),positionEncoding:r.positionEncoding||t.positionEncoding}))}return[...n.values()]}function ge(e){let n=new Map;for(let t of e){let r=n.get(t.symbol);if(!r){n.set(t.symbol,t);continue}n.set(t.symbol,V(vn,{symbol:r.symbol,documentation:Cn([...r.documentation,...t.documentation]),relationships:Pn([...r.relationships,...t.relationships]),kind:r.kind||t.kind,displayName:r.displayName||t.displayName,enclosingSymbol:r.enclosingSymbol||t.enclosingSymbol,signatureDocumentation:r.signatureDocumentation??t.signatureDocumentation}))}return[...n.values()]}function Pn(e){let n=new Set,t=[];for(let r of e){let o=[r.symbol,r.isReference?"1":"0",r.isImplementation?"1":"0",r.isTypeDefinition?"1":"0",r.isDefinition?"1":"0"].join("|");n.has(o)||(n.add(o),t.push(r))}return t}function Ln(e,n){return e?n?e.length>=n.length?e:n:e:n}function Cn(e){return[...new Set(e)]}import{execFileSync as wn}from"child_process";import{createHash as On}from"crypto";import{readdirSync as Fn,readFileSync as Dn}from"fs";import{join as de}from"path";function pe(e){return(Vn(e)??Tn(e)).filter(n=>n&&!me(n)).sort()}function S(e,n={}){return(n.language?pe(e).filter(r=>En(r,n.language,n.markerFiles)):pe(e)).map(r=>{let o=de(e,r);try{let i=Dn(o);return{path:r,size:i.byteLength,hash:On("sha256").update(i).digest("hex")}}catch{return{path:r,size:-1,hash:"unreadable"}}})}function En(e,n,t){let r=e.split("/").at(-1)??e;if(t?.includes(e)||t?.includes(r)||Mn.has(r))return!0;let o=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return(Nn[n]??[]).includes(o)}function Vn(e){try{return wn("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
|
|
5
|
+
`).filter(Boolean)}catch{return null}}function Tn(e){let n=[],t=[""];for(;t.length>0;){let r=t.pop(),o=r?de(e,r):e,i;try{i=Fn(o,{withFileTypes:!0})}catch{continue}for(let s of i){let a=r?`${r}/${s.name}`:s.name;if(s.isDirectory()){me(a)||t.push(a);continue}n.push(a)}}return n}function me(e){return e.split("/").some(t=>jn.has(t))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var jn=new Set([".git","node_modules",".scipquery-cache",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]),Mn=new Set(["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lockb","tsconfig.json","tsconfig.base.json","pyproject.toml","setup.py","setup.cfg","Cargo.toml","Cargo.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","build.sbt","compile_commands.json","CMakeLists.txt","Makefile","Gemfile","Gemfile.lock","composer.json","composer.lock","pubspec.yaml","pubspec.lock"]),Nn={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".mjs",".cjs"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"]};import{readFileSync as An,writeFileSync as _n}from"fs";import{create as fe}from"@bufbuild/protobuf";import{deserializeSCIP as $n,DocumentSchema as Bn,IndexSchema as Un,serializeSCIP as Wn,SymbolRole as Gn}from"@c4312/scip";function he(e){let n;try{n=$n(An(e))}catch{return{removedDefinitionOccurrences:0,touchedDocuments:0}}let t=Jn(n);return t.removedDefinitionOccurrences>0&&_n(e,Buffer.from(Wn(t.index))),{removedDefinitionOccurrences:t.removedDefinitionOccurrences,touchedDocuments:t.touchedDocuments}}function Jn(e){let n=new Set;for(let i of e.documents)for(let s of i.symbols)s.symbol&&n.add(s.symbol);for(let i of e.externalSymbols)i.symbol&&n.add(i.symbol);let t=0,r=0,o=[];for(let i of e.documents){let s=i.occurrences.filter(a=>(a.symbolRoles&Gn.Definition)===0||n.has(a.symbol)?!0:(t+=1,!1));if(s.length===i.occurrences.length){o.push(i);continue}r+=1,o.push(fe(Bn,{language:i.language,relativePath:i.relativePath,occurrences:s,symbols:i.symbols,text:i.text,positionEncoding:i.positionEncoding}))}return{index:t===0?e:fe(Un,{metadata:e.metadata,documents:o,externalSymbols:e.externalSymbols}),removedDefinitionOccurrences:t,touchedDocuments:r}}import{execFile as Hn}from"child_process";import{existsSync as I,renameSync as M,rmSync as N}from"fs";import{cpus as zn}from"os";import{join as be}from"path";function qn(e,n,t){if(!e.defaultOutputPath)return;let r=be(n,e.defaultOutputPath);t!==r&&I(r)&&M(r,t)}function Xn(e,n,t){if(!e.defaultOutputPath)return null;let r=be(n,e.defaultOutputPath);if(r===t)return null;let o=`${t}.default-output-backup`;return N(o,{force:!0}),I(r)?(M(r,o),{defaultOutputPath:r,backupPath:o}):{defaultOutputPath:r,backupPath:null}}function Kn(e){e&&(N(e.defaultOutputPath,{force:!0}),e.backupPath&&I(e.backupPath)&&M(e.backupPath,e.defaultOutputPath))}function Yn(e,n){if(e<=1)return 1;let t=Number(process.env.SCIP_QUERY_INDEXER_CONCURRENCY??0),r=Number.isFinite(n)&&n&&n>0?n:Number.isFinite(t)&&t>0?t:Math.min(2,Math.max(1,zn().length-1));return Math.max(1,Math.min(e,Math.floor(r)))}async function ye(e,n,t,r){let o=e.filter(c=>c.config.defaultOutputPath),i=e.filter(c=>!c.config.defaultOutputPath),s=[],a=Yn(i.length,r),u=await Zn(i,a,c=>j(c,n,t));if(a>1){let c=new Map;for(let g of u.filter(l=>l.skipped)){let l=i.find(p=>p.language===g.language);l&&(t(`Retrying ${l.language} indexer serially after parallel failure...`),c.set(l.language,await j(l,n,t)))}s.push(...u.map(g=>c.get(g.language)??g))}else s.push(...u);for(let c of o)s.push(await j(c,n,t));return s.sort((c,g)=>e.findIndex(l=>l.language===c.language)-e.findIndex(l=>l.language===g.language))}async function j(e,n,t){t(`Indexing ${e.language} with ${e.resolvedBinary}...`),N(e.scipPath,{force:!0});let r=Xn(e.config,n,e.scipPath);try{await Qn(e.binary,e.args,{cwd:n,env:e.env,maxBuffer:50*1024*1024}),qn(e.config,n,e.scipPath)}catch(o){let i=o instanceof Error?o.message:String(o),s=`${e.resolvedBinary} indexer failed: ${i.split(`
|
|
6
|
+
`)[0]}`;return t(`Skipping ${e.language}: ${s}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:s}}}finally{Kn(r)}if(!I(e.scipPath)){let o=`${e.resolvedBinary} indexer completed but did not produce ${e.scipPath}`;return t(`Skipping ${e.language}: ${o}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:o}}}return{language:e.language,scipPath:e.scipPath}}function Qn(e,n,t){return new Promise((r,o)=>{Hn(e,[...n],t,i=>{i?o(i):r()})})}async function Zn(e,n,t){if(e.length===0)return[];let r=new Array(e.length),o=0,i=Math.max(1,Math.min(e.length,n)),s=Array.from({length:i},async()=>{for(;o<e.length;){let a=o++;r[a]=await t(e[a])}});return await Promise.all(s),r}import{execFileSync as _}from"child_process";import{existsSync as A,readFileSync as et}from"fs";import{createRequire as nt}from"module";import{platform as tt}from"os";import{dirname as xe,join as P}from"path";var rt=nt(import.meta.url);function $(e){return[e.indexerBinary,...e.binaryAliases??[]]}function L(e){let n=$(e);return n.length===1?n[0]:n.join(" or ")}function R(e){for(let n of $(e))if(x(n))return n;return it(e)}function B(e){return R(e)!==null||ot(e)}function ot(e){return Se(e)!==null}function it(e){let n=Se(e);if(!n)return null;let r=JSON.parse(et(n,"utf8")).bin;if(!r)return null;if(typeof r=="string")return P(xe(n),r);for(let o of $(e)){let i=r[o];if(i)return P(xe(n),i)}return null}function Se(e){if(!e.bundledNpmPackage)return null;try{return rt.resolve(`${e.bundledNpmPackage}/package.json`)}catch{return null}}function U(e,n){for(let t of e.projectLocalBinaries??[]){let r=P(n,t);if(A(r))return r}return null}function W(e,n=process.env,t=e.indexerBinary){if(e.indexerBinary!=="scip-dotnet"||Re(t,n))return n;let r=st(t,n);return r?{...n,DOTNET_ROOT:r}:n}function G(e,n){let t=e.installMethods,r=L(e);if(!t?.length)return n(`No auto-install method available for ${r}.`),e.installUrl&&n(`Install manually from: ${e.installUrl}`),!1;for(let o of t)if(x(o.prerequisite)){n(`Installing ${r} via ${o.label}...`);try{_(o.binary,o.args,{stdio:"inherit",timeout:3e5,env:process.env});let i=R(e);if(i){let s=i===e.indexerBinary?"":` (using ${i})`;return n(`Successfully installed ${r} via ${o.label}${s}`),!0}n(`${o.label} command completed but ${r} was not found on PATH`)}catch(i){let s=i instanceof Error?i.message:String(i);n(`${o.label} install failed: ${s}`)}}return n(`Could not auto-install ${r}.`),e.installUrl&&n(`Install manually from: ${e.installUrl}`),!1}function st(e,n){for(let t of at(n))if(Re(e,{...n,DOTNET_ROOT:t}))return t;return null}function at(e){let n=[],t=e.DOTNET_ROOT;if(t&&A(t)&&n.push(t),tt()==="darwin"&&x("brew"))try{let r=_("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:e}).toString().trim(),o=P(r,"libexec");A(o)&&!n.includes(o)&&n.push(o)}catch{}return n}function Re(e,n){try{return _(e,["--version"],{stdio:"pipe",env:n}),!0}catch{return!1}}import Bt from"better-sqlite3";import{existsSync as Ut,readFileSync as Wt,writeFileSync as Gt}from"fs";import{dirname as Jt,join as Ht,resolve as zt}from"path";import{readFileSync as ut,rmSync as ct,statSync as lt,mkdtempSync as gt}from"fs";import{cpus as pt,tmpdir as dt}from"os";import{join as J}from"path";import{Worker as mt}from"worker_threads";function ve(e){return e.length>=8&&Ie(e.length)>1}function ke(e){let n=Ie(e.vueFiles.length),t=ht(e.vueFiles),r=yt(t,n),o=new URL("./augment-vue-worker.js",import.meta.url),i=gt(J(dt(),"scip-query-vue-workers-")),s=new SharedArrayBuffer(4),a=new Int32Array(s),u=ft(),c=Date.now();try{for(let l=0;l<r.length;l++)new mt(o,{workerData:{projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,tasks:r[l],resultPath:J(i,`${l}.json`),sharedBuffer:s}});for(;Atomics.load(a,0)<r.length;){if(Date.now()-c>u)throw new Error(`Vue reference workers timed out after ${(u/1e3).toFixed(0)}s`);Atomics.wait(a,0,Atomics.load(a,0),100)}let g=r.map((l,p)=>{let m=JSON.parse(ut(J(i,`${p}.json`),"utf-8"));if(!m.ok)throw new Error(`Vue reference worker failed: ${m.error}`);return m.result});return{occurrences:g.flatMap(l=>l.occurrences),skippedReferences:g.reduce((l,p)=>l+p.skippedReferences,0)}}finally{ct(i,{recursive:!0,force:!0})}}function Ie(e){let n=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKERS??0),t=Number.isFinite(n)&&n>0?n:Math.min(8,Math.max(1,pt().length-1));return Math.max(1,Math.min(e,t))}function ft(){let e=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKER_TIMEOUT_MS??0);return Number.isFinite(e)&&e>0?e:3e5}function ht(e){let n=bt(),t=[];for(let r of e){let o=Pe(r),i=Math.max(1,Math.ceil(o/n));for(let s=0;s<i;s++)t.push({fileName:r,startOffset:Math.floor(o*s/i),endOffset:s===i-1?Number.POSITIVE_INFINITY:Math.floor(o*(s+1)/i),countFileSkip:s===0})}return t}function bt(){return Number.POSITIVE_INFINITY}function yt(e,n){let t=Array.from({length:n},()=>({tasks:[],weight:0})),r=e.map(o=>({task:o,weight:xt(o)})).sort((o,i)=>i.weight-o.weight);for(let o of r){let i=t.reduce((s,a)=>a.weight<s.weight?a:s);i.tasks.push(o.task),i.weight+=o.weight}return t.map(o=>o.tasks).filter(o=>o.length>0)}function xt(e){return Number.isFinite(e.endOffset)?Math.max(1,e.endOffset-e.startOffset):Math.max(1,Pe(e.fileName)-e.startOffset)}function Pe(e){try{return lt(e).size}catch{return 1}}import{createRequire as St}from"module";import{existsSync as Rt,readFileSync as z}from"fs";import{dirname as Le,extname as vt,join as Ce,relative as kt,resolve as It}from"path";import{pathToFileURL as Pt}from"url";function Lt(e){e.transaction(()=>{e.prepare(`
|
|
7
7
|
DELETE FROM mentions
|
|
8
8
|
WHERE chunk_id IN (
|
|
9
9
|
SELECT c.id
|
|
@@ -18,12 +18,12 @@ import{a as h,e as O}from"./chunk-NXIAHE7F.js";import{a as ee}from"./chunk-UUBMF
|
|
|
18
18
|
FROM documents
|
|
19
19
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
20
20
|
)
|
|
21
|
-
`).run()})()}function
|
|
21
|
+
`).run()})()}function we(e,n){return e.prepare(`
|
|
22
22
|
SELECT relative_path AS relativePath
|
|
23
23
|
FROM documents
|
|
24
24
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
25
25
|
ORDER BY relative_path
|
|
26
|
-
`).all().map(r=>
|
|
26
|
+
`).all().map(r=>It(n,r.relativePath))}function Oe(e,n){let{vueCore:t,ts:r,volarTs:o}=Ct(e),{parsed:i,vueOptions:s}=wt(t,r,n),a=Le(n),u=t.createVueLanguagePlugin(r,i.options,s,m=>m),c=Ot(t,r,u),g=Ft(a,i),{languageServiceHost:l}=o.createLanguageServiceHost(r,r.sys,c,m=>m,g),p=r.createLanguageService(l);return{ts:r,language:c,languageService:p,fileNames:i.fileNames,configDir:a}}function Ct(e){let n=St(Pt(Ce(e,"package.json")).href);return{vueCore:H(n,"@vue/language-core",e),ts:H(n,"typescript",e),volarTs:H(n,"@volar/typescript",e)}}function wt(e,n,t){let r=n.readConfigFile(t,n.sys.readFile);if(r.error||!r.config)throw new Error(`Failed to read ${t}`);let i=e.createParsedCommandLine(n,n.sys,t).vueOptions;return typeof e.createGlobalTypesWriter=="function"&&(i.globalTypesPath=e.createGlobalTypesWriter(i,n.sys.writeFile)),{parsed:n.parseJsonConfigFileContent(r.config,n.sys,Le(t),void 0,t,void 0,e.getAllExtensions(i).map(s=>({extension:s.slice(1),isMixedContent:!0,scriptKind:n.ScriptKind.Deferred}))),vueOptions:i}}function Ot(e,n,t){let r={},o=e.createLanguage([t],new Map,i=>{if(!Rt(i))return;let s=z(i,"utf-8");r.current?.scripts.set(i,n.ScriptSnapshot.fromString(s),t.getLanguageId(i)??Mt(i))});return r.current=o,o}function Ft(e,n){return{getCurrentDirectory:()=>e,getCompilationSettings:()=>n.options,getScriptFileNames:()=>n.fileNames,getProjectReferences:()=>n.projectReferences,getProjectVersion:()=>"0"}}function H(e,n,t){try{return e(n)}catch(r){throw(typeof r=="object"&&r!==null&&"code"in r?r.code:null)==="MODULE_NOT_FOUND"?new Error(`Vue augmentation requires ${n} to be installed in ${t}. Install Vue/Volar dependencies for that project, then rerun augment-vue.`,{cause:r}):r}}function Fe(e,n,t){let r=Dt(e);return o=>{let i=h(n,o.fileName),s=t.get(o.fileName);if(!s)return null;let a=t.positionAt(s,o.textSpan.start),u=r.get(i);if(!u)return null;let c=u.containingByLine.get(a.line);return c!==void 0?c:Et(u.starts,a.line,2)}}function Dt(e){let n=e.prepare(`
|
|
27
27
|
SELECT
|
|
28
28
|
d.relative_path AS relativePath,
|
|
29
29
|
der.start_line AS startLine,
|
|
@@ -32,23 +32,23 @@ import{a as h,e as O}from"./chunk-NXIAHE7F.js";import{a as ee}from"./chunk-UUBMF
|
|
|
32
32
|
FROM defn_enclosing_ranges der
|
|
33
33
|
JOIN documents d ON d.id = der.document_id
|
|
34
34
|
ORDER BY d.relative_path, (der.end_line - der.start_line) DESC
|
|
35
|
-
`).all(),t=new Map;for(let r of n){let o=t.get(r.relativePath);o||(o={containingByLine:new Map,starts:[]},t.set(r.relativePath,o)),o.starts.push({line:r.startLine,symbolId:r.symbolId});for(let i=r.startLine;i<=r.endLine;i++)o.containingByLine.set(i,r.symbolId)}for(let r of t.values())r.starts.sort((o,i)=>o.line-i.line);return t}function
|
|
35
|
+
`).all(),t=new Map;for(let r of n){let o=t.get(r.relativePath);o||(o={containingByLine:new Map,starts:[]},t.set(r.relativePath,o)),o.starts.push({line:r.startLine,symbolId:r.symbolId});for(let i=r.startLine;i<=r.endLine;i++)o.containingByLine.set(i,r.symbolId)}for(let r of t.values())r.starts.sort((o,i)=>o.line-i.line);return t}function Et(e,n,t){let r=0,o=e.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);e[s].line<n?r=s+1:o=s-1}let i=null;for(let s of[o,r]){let a=e[s];if(!a)continue;let u=Math.abs(a.line-n);u>t||(!i||u<i.distance)&&(i={distance:u,symbolId:a.symbolId})}return i?.symbolId??null}function De(e,n,t){let r=_t(n),o=e.prepare("SELECT id FROM global_symbols WHERE symbol = ?"),i=e.prepare(`
|
|
36
36
|
INSERT OR IGNORE INTO global_symbols (symbol, display_name, kind, documentation)
|
|
37
37
|
VALUES (?, ?, ?, ?)
|
|
38
|
-
`),s=0,a=new Map;return e.transaction(()=>{for(let c of t){let g=
|
|
38
|
+
`),s=0,a=new Map;return e.transaction(()=>{for(let c of t){let g=h(n,c),l=$e(r.name,r.version,g);i.run(l,"default",7,`Vue component|${g}`);let p=$t(o,r,n,c);p&&(s++,a.set(c,p))}})(),{get(c){return a.get(c)??null},syntheticSymbols:s}}function Ee(e,n,t,r,o){return e.transaction(()=>(Lt(e),Vt(e,n,t,r),Tt(e,o)))()}function Vt(e,n,t,r){let o=e.prepare("SELECT id FROM documents WHERE relative_path = ?"),i=e.prepare(`
|
|
39
39
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
40
40
|
VALUES (?, ?, ?, ?, X'00')
|
|
41
41
|
`),s=e.prepare(`
|
|
42
42
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
43
43
|
VALUES (?, ?, 1)
|
|
44
|
-
`);for(let a of t){let u=r.get(a);if(!u)continue;let c=
|
|
44
|
+
`);for(let a of t){let u=r.get(a);if(!u)continue;let c=h(n,a),g=o.get(c);if(!g)continue;let l=i.run(g.id,-1,0,0);s.run(Number(l.lastInsertRowid),u)}}function Ve(e,n,t,r,o){if(e.fileName.endsWith(".vue")){let i=r.language.scripts.get(e.fileName),s=i?.generated?.languagePlugin.typescript?.getServiceScript(i.generated.root)?.code;if(i&&s){let a=r.language.maps.get(s,i);if(q(a,e.textSpan.start)!==null)return t.get(e.fileName)}return e.fileName.startsWith(o)?t.get(e.fileName):null}return n(e)}function Te(e){let n=new Set,t=[];for(let r of e){let o=je(r);n.has(o)||(n.add(o),t.push(r))}return t}function je(e){return[e.sourceFile,e.sourceLine,e.sourceStartChar,e.sourceEndChar,e.symbolId].join(":")}function Tt(e,n){let t=At(e,[...new Set(n.map(u=>u.sourceFile))]),r=e.prepare(`
|
|
45
45
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
46
46
|
VALUES (?, ?, ?, ?, X'00')
|
|
47
47
|
`),o=e.prepare(`
|
|
48
48
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
49
49
|
VALUES (?, ?, 0)
|
|
50
|
-
`),i=new Set,s=0,a=0;for(let u of n){let c=
|
|
51
|
-
`)}function
|
|
50
|
+
`),i=new Set,s=0,a=0;for(let u of n){let c=je(u);if(i.has(c))continue;i.add(c);let g=t.get(u.sourceFile);if(!g)continue;let l=r.run(g,a++,u.sourceLine,u.sourceLine),p=o.run(Number(l.lastInsertRowid),u.symbolId);s+=Number(p.changes)}return s}function*Me(e){let n=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,t=new Set(["script","setup","template","style","lang","scoped","true","false","null","undefined","const","let","var","import","from","export","return","if","else","for","while","function","class","type","interface","as","await","async"]),r;for(;r=n.exec(e);){let o=r[0];t.has(o)||(yield{text:o,start:r.index,end:r.index+o.length})}}function Ne(e,n){for(let[t]of e.toGeneratedLocation(n,r=>!!r.navigation))return t;return null}function q(e,n){let t=e;for(let[r]of t.toSourceLocation(n,o=>!!o.navigation))return r;return null}function jt(e,n){let t=0,r=e.lineStarts.length-1;for(;t<=r;){let i=Math.floor((t+r)/2);e.lineStarts[i]<=n?t=i+1:r=i-1}let o=Math.max(0,r);return{line:o,character:n-e.lineStarts[o]}}function Ae(e,n){return h(e,n).startsWith("node_modules/")}function h(e,n){return kt(e,n).replaceAll("\\","/")}function Mt(e){switch(vt(e)){case".vue":return"vue";case".tsx":return"typescriptreact";case".ts":case".mts":case".cts":return"typescript";case".jsx":return"javascriptreact";case".js":case".mjs":case".cjs":return"javascript";case".json":return"json";default:return"typescript"}}function _e(){let e=new Map;return{get(n){if(e.has(n))return e.get(n)??null;try{let t=z(n,"utf-8"),r={text:t,lineStarts:Nt(t)};return e.set(n,r),r}catch{return e.set(n,null),null}},positionAt:jt}}function Nt(e){let n=[0];for(let t=0;t<e.length;t++)e.charCodeAt(t)===10&&n.push(t+1);return n}function At(e,n){let t=new Map,r=500;for(let o=0;o<n.length;o+=r){let i=n.slice(o,o+r),s=e.prepare(`SELECT id, relative_path AS relativePath FROM documents WHERE relative_path IN (${i.map(()=>"?").join(",")})`).all(...i);for(let a of s)t.set(a.relativePath,a.id)}return t}function _t(e){try{let n=JSON.parse(z(Ce(e,"package.json"),"utf-8"));return{name:n.name??"workspace",version:n.version??"0.0.0"}}catch{return{name:"workspace",version:"0.0.0"}}}function $t(e,n,t,r){let o=h(t,r),i=$e(n.name,n.version,o);return e.get(i)?.id??null}function $e(e,n,t){let r=t.split("/").map(o=>`\`${o.replaceAll("`","")}\``).join("/");return`scip-vue npm ${e} ${n} ${r}/default.`}function qt(e){b({projectRoot:e.projectRoot,dbPath:e.dbPath});let n=zt(e.projectRoot,e.tsconfig);if(!Ut(n))throw new Error(`Vue tsconfig not found at ${n}`);let t=new Bt(e.dbPath);try{let r=we(t,e.projectRoot),o=Ht(Jt(e.dbPath),"augment-vue-meta.json"),i=Be(t,e.projectRoot,e.tsconfig),s=Xt(o,i,e.onStatus);if(s)return s;let a=Kt({db:t,projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,configPath:n,vueFiles:r,onStatus:e.onStatus});return Zt(o,Be(t,e.projectRoot,e.tsconfig),a),a}finally{t.close()}}function Xt(e,n,t){let r=Qt(e,n);return r&&t?.(`Vue references unchanged; reused ${r.resolvedReferences} cached resolved references.`),r}function Kt(e){let n=De(e.db,e.projectRoot,e.vueFiles),t=Yt(e,n),r=Te(t.occurrences),o=Ee(e.db,e.projectRoot,e.vueFiles,n,r),i={vueFiles:e.vueFiles.length,resolvedReferences:r.length,insertedMentions:o,skippedReferences:t.skippedReferences,syntheticSymbols:n.syntheticSymbols};return e.onStatus?.(`Resolved ${i.resolvedReferences} Vue references with Volar; inserted ${i.insertedMentions} mentions.`),i}function Yt(e,n){if(ve(e.vueFiles))return ke({projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,vueFiles:e.vueFiles});let t=er({db:e.db,projectRoot:e.projectRoot,configPath:e.configPath,vueSymbolLookup:n});return nr({...t,vueFiles:t.context.fileNames.filter(r=>r.endsWith(".vue"))})}function Qt(e,n){try{let t=JSON.parse(Wt(e,"utf-8"));return JSON.stringify(t.fingerprint)===JSON.stringify(n)?t.result:null}catch{return null}}function Zt(e,n,t){Gt(e,JSON.stringify({updatedAt:new Date().toISOString(),fingerprint:n,result:t},null,2)+`
|
|
51
|
+
`)}function Be(e,n,t){let r=e.prepare(`
|
|
52
52
|
SELECT
|
|
53
53
|
(SELECT COUNT(*) FROM documents) AS documents,
|
|
54
54
|
(SELECT COUNT(*) FROM global_symbols) AS symbols,
|
|
@@ -57,13 +57,13 @@ import{a as h,e as O}from"./chunk-NXIAHE7F.js";import{a as ee}from"./chunk-UUBMF
|
|
|
57
57
|
(SELECT COUNT(*) FROM defn_enclosing_ranges) AS ranges,
|
|
58
58
|
(SELECT MAX(id) FROM chunks) AS maxChunkId,
|
|
59
59
|
(SELECT MAX(id) FROM global_symbols) AS maxSymbolId
|
|
60
|
-
`).get();return{version:2,tsconfig:t,files:S(n),db:r}}function
|
|
61
|
-
Install from: https://github.com/sourcegraph/scip/releases`);if(n("scip CLI not found on PATH. Attempting auto-install..."),!
|
|
62
|
-
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function
|
|
60
|
+
`).get();return{version:2,tsconfig:t,files:S(n),db:r}}function er(e){let n=_e();return{projectRoot:e.projectRoot,context:Oe(e.projectRoot,e.configPath),symbolLookup:Fe(e.db,e.projectRoot,n),vueSymbolLookup:e.vueSymbolLookup,sourceReader:n}}function nr(e){let n=[],t=0,r=e.tasks??e.vueFiles.map(o=>({fileName:o,startOffset:0,endOffset:Number.POSITIVE_INFINITY,countFileSkip:!0}));for(let o of r){let i=tr(e,o);n.push(...i.occurrences),t+=i.skippedReferences}return{occurrences:n,skippedReferences:t}}function tr(e,n){let t=e.context.language.scripts.get(n.fileName),r=t?.generated?.languagePlugin.typescript?.getServiceScript(t.generated.root)?.code;if(!t||!r)return{occurrences:[],skippedReferences:n.countFileSkip?1:0};let o=e.sourceReader.get(n.fileName);if(!o)return{occurrences:[],skippedReferences:n.countFileSkip?1:0};let i=e.context.language.maps.get(r,t),s=h(e.projectRoot,n.fileName),a=[...Me(o.text)],u={tokens:a.filter(c=>c.start>=n.startOffset&&c.start<n.endOffset),tokenByStart:new Map(a.map(c=>[c.start,c])),tokenTextCounts:ir(a),processedStarts:new Set};return rr({...e,fileName:n.fileName,sourceInfo:o,sourceFile:s,map:i,tokenContext:u})}function rr(e){let n=[],t=0;for(let r of e.tokenContext.tokens){if(e.tokenContext.processedStarts.has(r.start))continue;let o=Ne(e.map,r.start);if(o===null)continue;let s=(e.context.languageService.getDefinitionAtPosition(e.fileName,o+1)??[]).find(u=>!Ae(e.projectRoot,u.fileName));if(!s){t++;continue}let a=Ve(s,e.symbolLookup,e.vueSymbolLookup,e.context,e.projectRoot);if(a===null){t++;continue}Ue(n,e.sourceReader,e.sourceInfo,e.sourceFile,r,a),e.tokenContext.processedStarts.add(r.start),or(n,e,r,o,a)}return{occurrences:n,skippedReferences:t}}function or(e,n,t,r,o){if(!((n.tokenContext.tokenTextCounts.get(t.text)??0)<=1))for(let i of sr(n.context.languageService,n.fileName,r+1,n.map,t,n.tokenContext.tokenByStart)){if(n.tokenContext.processedStarts.has(i))continue;let s=n.tokenContext.tokenByStart.get(i);s&&(Ue(e,n.sourceReader,n.sourceInfo,n.sourceFile,s,o),n.tokenContext.processedStarts.add(i))}}function Ue(e,n,t,r,o,i){let s=n.positionAt(t,o.start);e.push({sourceFile:r,sourceLine:s.line,sourceStartChar:s.character,sourceEndChar:s.character+o.text.length,symbolId:i})}function ir(e){let n=new Map;for(let t of e)n.set(t.text,(n.get(t.text)??0)+1);return n}function sr(e,n,t,r,o,i){let s=e.getDocumentHighlights?.(n,t,[n])??[],a=[];for(let u of s)if(u.fileName===n)for(let c of u.highlightSpans){let g=ar(r,c.textSpan.start,i,o.text);g!==null&&a.push(g)}return a}function ar(e,n,t,r){let o=t.get(n);if(o?.text===r)return o.start;let i=q(e,n);if(i===null)return null;let s=t.get(i);return s?.text===r?s.start:null}async function Zo(e){let{projectRoot:n,maxHeapMb:t=8192,onStatus:r=console.log,skipAutoInstall:o=!1}=e,i=mr(e),s=Date.now();K(f(i.outputScip),{recursive:!0}),K(f(i.outputDb),{recursive:!0});let a=e.languages??D(n);if(a.length===0)throw new Error("No supported languages detected in this project. Looked for: tsconfig.json, Cargo.toml, go.mod, pyproject.toml, etc.");r(`Detected languages: ${a.join(", ")}`);let u=Er(n,a,{pnpmWorkspaces:e.pnpmWorkspaces}),c=Fr(d(f(i.outputDb),"index.lock")),g=null;try{let l=fr({opts:e,paths:i,languages:a,fingerprint:u,start:s,onStatus:r});if(l)return l;vr(o,r);let p=hr(i);return g=p.runDir,await br({opts:e,languages:a,projectRoot:n,paths:i,tempPaths:p,fingerprint:u,start:s,maxHeapMb:t,skipAutoInstall:o,onStatus:r})}finally{g&&Q(g,{recursive:!0,force:!0}),c()}}function mr(e){let n=e.outputScip??d(e.projectRoot,"index.scip"),t=e.outputDb??d(e.projectRoot,"index.db");return{outputScip:n,outputDb:t,metaPath:d(f(t),"meta.json")}}function fr(e){if(e.opts.skipIfUnchanged===!1||!w(e.paths.outputScip)||!w(e.paths.outputDb)||!Vr(e.paths.metaPath,e.fingerprint))return null;b({projectRoot:e.opts.projectRoot,dbPath:e.paths.outputDb,onStatus:e.onStatus});let n=Date.now()-e.start;return e.onStatus(`Index unchanged; reused existing SQLite index in ${(n/1e3).toFixed(1)}s`),{languages:e.languages,indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:n,reused:!0,skipped:[]}}function hr(e){let n=gr(d(f(e.outputDb),"reindex-"));return{runDir:n,tempOutputScip:d(n,C(e.outputScip)),tempOutputDb:d(n,C(e.outputDb)),tempMetaPath:d(n,C(e.metaPath))}}async function br(e){let n={...process.env,NODE_OPTIONS:`--max-old-space-size=${e.maxHeapMb}`},{indexedOutputs:t,skippedLanguages:r,reusedLanguages:o}=await yr(e,n);o.length>0&&e.onStatus(`Reused ${o.length} cached language shard(s): ${o.join(", ")}`),xr(e,n,t,r);let i=Date.now()-e.start;return e.onStatus(`Done in ${(i/1e3).toFixed(1)}s`),{languages:t.map(s=>s.language),indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:i,reused:!1,skipped:r}}async function yr(e,n){let t=Sr(e),r=new Set(t.map(c=>c.language));for(let c of r)e.onStatus(`Reusing cached ${c} SCIP shard (language inputs unchanged).`);let{preparedRuns:o,skippedLanguages:i}=kr({languages:e.languages.filter(c=>!r.has(c)),tempOutputScip:e.tempPaths.tempOutputScip,projectRoot:e.projectRoot,env:n,skipAutoInstall:e.skipAutoInstall,pnpmWorkspaces:e.opts.pnpmWorkspaces,onStatus:e.onStatus}),s=await ye(o,e.projectRoot,e.onStatus,e.opts.indexerConcurrency),{indexedOutputs:a}=Pr(s,i),u=[...t,...a];return Lr(u,i,e.languages,e.opts.allowPartial,e.onStatus),{indexedOutputs:u,skippedLanguages:i,reusedLanguages:[...r]}}function xr(e,n,t,r){Rr(e.paths.outputDb,t),Cr(t,e.tempPaths.tempOutputScip,e.onStatus),wr(e.tempPaths.tempOutputScip,e.tempPaths.tempOutputDb,n,e.onStatus),b({projectRoot:e.projectRoot,dbPath:e.tempPaths.tempOutputDb,onStatus:e.onStatus}),Tr(e.tempPaths.tempMetaPath,{version:3,status:r.length===0?"complete":"partial",updatedAt:new Date().toISOString(),fingerprint:e.fingerprint,languageFingerprints:Je(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces}),requestedLanguages:e.languages,indexedLanguages:t.map(o=>o.language),skipped:[...r]}),Dr({tempOutputScip:e.tempPaths.tempOutputScip,tempOutputDb:e.tempPaths.tempOutputDb,tempMetaPath:e.tempPaths.tempMetaPath,outputScip:e.paths.outputScip,outputDb:e.paths.outputDb,metaPath:e.paths.metaPath})}function Sr(e){let n;try{n=JSON.parse(We(e.paths.metaPath,"utf-8"))}catch{return[]}if(n.version!==3||!n.languageFingerprints)return[];let t=[],r=Je(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces});for(let o of e.languages){let i=He(e.paths.outputDb,o);w(i)&&y(n.languageFingerprints[o])===y(r[o])&&t.push({language:o,scipPath:i})}return t}function Rr(e,n){for(let t of n){let r=He(e,t.language);K(f(r),{recursive:!0}),t.scipPath!==r&&lr(t.scipPath,r)}}function vr(e,n){if(!O()){if(e)throw new Error(`The scip CLI is required but not found on PATH.
|
|
61
|
+
Install from: https://github.com/sourcegraph/scip/releases`);if(n("scip CLI not found on PATH. Attempting auto-install..."),!F(n))throw new Error(`The scip CLI is required but could not be installed.
|
|
62
|
+
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function kr(e){let n=[],t=[],r=e.languages.map((o,i)=>({language:o,scipPath:e.languages.length>1?Or(e.tempOutputScip,o,i):e.tempOutputScip}));for(let{language:o,scipPath:i}of r){let s=Ir({...e,language:o,scipPath:i});"skipped"in s?t.push(s.skipped):n.push(s.prepared)}return{preparedRuns:n,skippedLanguages:t}}function Ir(e){let n=k(e.language),t=L(n),r=U(n,e.projectRoot);if(!r&&!B(n)){if(e.skipAutoInstall){let a=`${t} not found on PATH (auto-install disabled). ${n.installUrl??""}`.trim();return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}if(e.onStatus(`${t} not found. Attempting auto-install...`),!G(n,e.onStatus)){let a=`${t} could not be auto-installed. ${n.installUrl?`Install manually from ${n.installUrl}`:`Install ${t} and put it on PATH.`}`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}}let o=r??R(n);if(!o){let a=`${t} was not found after installation checks.`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}let{binary:i,args:s}=n.indexArgs({projectRoot:e.projectRoot,outputPath:e.scipPath,pnpmWorkspaces:e.pnpmWorkspaces,indexerBinary:o});return{prepared:{language:e.language,scipPath:e.scipPath,config:n,resolvedBinary:o,binary:i,args:s,env:W(n,e.env,o)}}}function Pr(e,n){let t=[];for(let r of e)r.skipped?n.push(r.skipped):t.push({language:r.language,scipPath:r.scipPath});return{indexedOutputs:t}}function Lr(e,n,t,r,o){if(e.length===0){let i=n.map(s=>` - ${s.language}: ${s.reason}`).join(`
|
|
63
63
|
`);throw new Error(`No language indexers ran successfully. Install at least one indexer for the languages in this project.
|
|
64
64
|
`+i)}if(n.length!==0&&(o(`Indexed ${e.length} of ${t.length} languages; skipped ${n.map(i=>i.language).join(", ")}.`),!r))throw new Error(`Failed to index all required languages; preserving the previous index. Pass --allow-partial to intentionally write an incomplete index.
|
|
65
65
|
`+n.map(i=>` - ${i.language}: ${i.reason}`).join(`
|
|
66
|
-
`))}function
|
|
67
|
-
`),()=>{try{
|
|
68
|
-
`)}function
|
|
66
|
+
`))}function Cr(e,n,t){e.length>1?(t(`Merging ${e.length} language indexes...`),T(e.map(r=>r.scipPath),n)):e[0].scipPath!==n&&Y(e[0].scipPath,n)}function wr(e,n,t,r){if(r("Converting to SQLite..."),!w(e))throw new Error(`SCIP index not found at ${e} after indexing`);try{let o=he(e);o.removedDefinitionOccurrences>0&&r(`Sanitized ${o.removedDefinitionOccurrences} invalid definition occurrences across ${o.touchedDocuments} documents before SQLite conversion.`);let i=O();if(!i)throw new Error("scip CLI is not available");ur(i,["expt-convert","--output",n,e],{env:t,stdio:"pipe",maxBuffer:50*1024*1024})}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`Failed to convert SCIP index to SQLite: ${i}`,{cause:o})}}function Or(e,n,t){let r=dr(e)||".scip",o=C(e,r);return d(f(e),`${o}.${t+1}.${n}${r}`)}function Fr(e){let n;try{n=pr(e,"wx")}catch(t){throw(typeof t=="object"&&t&&"code"in t?t.code:void 0)==="EEXIST"?new Error(`Another scip-query reindex is already running for ${f(e)}.`,{cause:t}):t}return Ge(n,JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()})+`
|
|
67
|
+
`),()=>{try{cr(n)}finally{Q(e,{force:!0})}}}function Dr(e){X(e.tempOutputScip,e.outputScip),X(e.tempOutputDb,e.outputDb),X(e.tempMetaPath,e.metaPath)}function X(e,n){Q(`${n}.tmp-replace`,{force:!0}),Y(e,`${n}.tmp-replace`),Y(`${n}.tmp-replace`,n)}function Er(e,n,t){return{version:1,languages:[...n].sort(),pnpmWorkspaces:t.pnpmWorkspaces===!0,files:S(e)}}function Je(e,n,t){return Object.fromEntries(n.map(r=>{let o=k(r).markerFiles;return[r,{version:1,languages:[r],pnpmWorkspaces:r==="typescript"&&t.pnpmWorkspaces===!0,files:S(e,{language:r,markerFiles:o})}]}))}function He(e,n){return d(f(e),"language-indexes",`${n}.scip`)}function Vr(e,n){try{let t=JSON.parse(We(e,"utf-8"));return(t.version===2||t.version===3)&&t.status==="complete"&&y(t.fingerprint)===y(n)&&y([...t.indexedLanguages??[]].sort())===y(n.languages)}catch{return!1}}function Tr(e,n){Ge(e,`${JSON.stringify(n,null,2)}
|
|
68
|
+
`)}function y(e){return JSON.stringify(e)}export{ce as INDEXER_CONFIGS,b as augmentAuxiliaryDocuments,qt as augmentVueResolvedReferences,L as describeIndexerBinary,D as detectLanguages,k as getIndexerConfig,W as getIndexerExecutionEnv,x as isBinaryAvailable,B as isIndexerInstalled,T as mergeScipFiles,le as mergeScipIndexes,Zo as reindex,R as resolveIndexerBinary,U as resolveProjectLocalIndexerBinary,G as tryInstallIndexer,F as tryInstallScipCli};
|
|
69
69
|
//# sourceMappingURL=reindex.js.map
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { P as ProjectConfig, a as SupportedLanguage } from './config-types-Bj4sh28g.js';
|
|
2
|
-
export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-
|
|
2
|
+
export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-Bh1M_JPu.js';
|
|
3
3
|
|
|
4
4
|
type WatcherStatus = {
|
|
5
5
|
state: 'idle';
|
package/dist/runtime.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`),t}function f(i){return _(i,{recursive:!0}),i}import{watch as
|
|
1
|
+
import{c as $,d as T,e as E}from"./chunk-ONPCQ2PM.js";import{a as v}from"./chunk-UUBMFL3F.js";import{readFileSync as D,writeFileSync as A,existsSync as b,mkdirSync as _}from"fs";import{join as c,resolve as C}from"path";import{createHash as W}from"crypto";import{homedir as F}from"os";var h=".scipquery.json",M={enabled:!1,debounceMs:3e4,cooldownMs:6e4,ignore:[]};function L(i){let e=c(i,h);if(!b(e))return{};try{let t=D(e,"utf-8");return JSON.parse(t)}catch(t){let s=t instanceof Error?t.message:String(t);throw t instanceof SyntaxError?new Error(`invalid ${h} at ${e}: ${s}`,{cause:t}):new Error(`unable to read ${h} at ${e}: ${s}`,{cause:t})}}function P(i){return{...M,...i.watch}}function N(i,e){let t=process.env.SCIP_QUERY_CACHE_DIR;if(t)return f(t);if(e?.dbPath)return f(C(i,e.dbPath));let n=process.env.XDG_CACHE_HOME||c(F(),".cache"),r=W("sha256").update(C(i)).digest("hex").slice(0,12),o=c(n,"scip-query","projects",r);return f(o)}function m(i,e){let t=N(i,e);return{cacheDir:t,dbPath:c(t,"index.db"),indexPath:c(t,"index.scip"),metaPath:c(t,"meta.json")}}function O(i,e){let t=c(i,h);return b(t)||A(t,JSON.stringify({languages:e,watch:{enabled:!1,debounceMs:3e4,cooldownMs:6e4}},null,2)+`
|
|
2
|
+
`),t}function f(i){return _(i,{recursive:!0}),i}import{watch as U}from"fs";import{existsSync as R,renameSync as k}from"fs";import{join as q,relative as H}from"path";import{fork as B}from"child_process";import G from"ignore";var y=class{projectRoot;watchConfig;indexPaths;languages;pnpmWorkspaces;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.watchConfig=P(e.config),this.indexPaths=m(e.projectRoot,e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=v(e.projectRoot),this.extraIgnore=G(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"});try{let e=U(this.projectRoot,{recursive:!0},(t,s)=>{s&&!this.stopped&&this.handleFileChange(s)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.setStatus({state:"idle"})}handleFileChange(e){let t=H(this.projectRoot,q(this.projectRoot,e));if(this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||e.endsWith(".scipquery.json"))return;if(this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let s=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:s}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let s=this.watchConfig.cooldownMs-e;this.dirty=!0;let n=Date.now()+s;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},s);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=Date.now();this.setStatus({state:"indexing",startedAt:t}),this.runReindex().then(s=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(s),this.dirty&&!this.stopped){let n=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(s=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(s instanceof Error?s:new Error(String(s))),this.setStatus({state:"idle"})})}runReindex(){return new Promise((e,t)=>{let s=Date.now(),n=this.indexPaths.dbPath+".tmp",r=X(this.indexPaths.indexPath),o=B(new URL("./reindex-worker.js",import.meta.url).pathname,[],{env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:r,SCIP_REINDEX_OUTPUT_DB:n,SCIP_REINDEX_LANGUAGES:this.languages?.join(",")??"",SCIP_REINDEX_PNPM_WORKSPACES:this.pnpmWorkspaces?"1":""},stdio:"pipe"});o.on("exit",d=>{if(d===0)try{R(n)&&k(n,this.indexPaths.dbPath),R(r)&&k(r,this.indexPaths.indexPath),e(Date.now()-s)}catch(a){t(new Error(`Atomic swap failed: ${a}`))}else t(new Error(`Reindex worker exited with code ${d}`))}),o.on("error",t)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}};function X(i){return i.endsWith(".scip")?i.slice(0,-5)+".tmp.scip":i+".tmp.scip"}import{existsSync as x,mkdirSync as J,symlinkSync as V,readlinkSync as K,unlinkSync as Q}from"fs";import{join as p,dirname as I,resolve as S}from"path";import{homedir as w,platform as Y}from"os";import{fileURLToPath as z}from"url";var Z=Y()==="win32",ee=["scip-query","scip-query-setup","scip-adoption","scip-health-audit","scip-health-improve","scip-api-impact","concrete-plan","scip-ai-cleanup","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-debloat","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook"];function te(i={}){let e=i.quiet?()=>{}:console.log,t=z(import.meta.url),s=S(I(t),"..","skills"),n=[p(w(),".claude","skills"),p(w(),".codex","skills"),p(w(),".agents","skills")],r={installed:[],skipped:[],alreadyLinked:[]};for(let o of n){let d=I(o);if(!x(d))continue;J(o,{recursive:!0});let a=ie(o);for(let l of ee){let g=p(s,l),u=p(o,l);if(!x(g)){r.skipped.push(`${a}/${l}`);continue}if(x(u)){try{let j=K(u);if(S(j)===S(g)){r.alreadyLinked.push(`${a}/${l}`),e(` ok: ${l} \u2192 ${a} (already linked)`);continue}}catch{r.skipped.push(`${a}/${l}`),e(` skip: ${l} \u2192 ${a} (exists, not a symlink)`);continue}Q(u)}V(g,u,Z?"junction":"dir"),r.installed.push(`${a}/${l}`),e(` done: ${l} \u2192 ${a}`)}}return r}function ie(i){return i.includes(".codex")?"Codex":i.includes(".agents")?"Agents":"Claude"}export{y as Watcher,T as getScipVersion,O as initProjectConfig,te as installSkills,$ as isScipInstalled,L as loadProjectConfig,E as printScipInstallInstructions,m as resolveIndexPaths};
|
|
3
3
|
//# sourceMappingURL=runtime.js.map
|
package/docs/AGENT_GUIDE.md
CHANGED
|
@@ -6,6 +6,43 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## Workflow 0: Bootstrap scip-query in a project
|
|
10
|
+
|
|
11
|
+
**Goal:** Make a repository ready for scip-query-backed agent work before cleanup or implementation begins.
|
|
12
|
+
|
|
13
|
+
### Steps
|
|
14
|
+
|
|
15
|
+
1. **Run setup**
|
|
16
|
+
```bash
|
|
17
|
+
scip-query setup-hooks --json
|
|
18
|
+
scip-query setup --json
|
|
19
|
+
```
|
|
20
|
+
Returns: project-local hook install state, detected languages, indexer readiness, remediation attempts, index result, capability summary, smoke tests, health score, issue list, health dossier paths, and setup verdict.
|
|
21
|
+
|
|
22
|
+
2. **Resolve blockers**
|
|
23
|
+
```bash
|
|
24
|
+
scip-query check-deps
|
|
25
|
+
scip-query doctor
|
|
26
|
+
scip-query capability-matrix --json
|
|
27
|
+
```
|
|
28
|
+
Missing indexers or toolchains are blockers, not clean results. Fix what setup can prove, then rerun setup or reindex.
|
|
29
|
+
|
|
30
|
+
3. **Start health follow-through**
|
|
31
|
+
```bash
|
|
32
|
+
scip-query health --json --full
|
|
33
|
+
scip-query diff-gate --json
|
|
34
|
+
```
|
|
35
|
+
Before cleanup, tell the user the health score, confirmed items, unavailable checks, and recommended first cleanup batch. Use `scip-health-audit` for confirmation and `scip-health-improve` when the user wants autonomous score improvement.
|
|
36
|
+
|
|
37
|
+
### What you should know after this workflow
|
|
38
|
+
|
|
39
|
+
- Whether the index is current and usable
|
|
40
|
+
- Which capabilities are available, partial, or unavailable
|
|
41
|
+
- Where the health dossier was written
|
|
42
|
+
- What needs to be fixed before the repo can be called ready
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
9
46
|
## Workflow 1: Understand a system before making changes
|
|
10
47
|
|
|
11
48
|
**Goal:** Build a complete mental model of a module or feature area so you can write a precise implementation plan with no ambiguity about what code exists, what it does, and what depends on it.
|
|
@@ -88,7 +125,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
88
125
|
4. **Check blast radius before editing**
|
|
89
126
|
```bash
|
|
90
127
|
scip-query change-surface <file>
|
|
91
|
-
scip-query diff-impact
|
|
128
|
+
scip-query diff-impact --json
|
|
92
129
|
```
|
|
93
130
|
Identify which symbols in your change set have many external consumers and which downstream files will be affected.
|
|
94
131
|
|
|
@@ -101,7 +138,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
101
138
|
|
|
102
139
|
6. **After making changes, verify impact**
|
|
103
140
|
```bash
|
|
104
|
-
scip-query diff-impact
|
|
141
|
+
scip-query diff-impact --json
|
|
105
142
|
scip-query drift
|
|
106
143
|
```
|
|
107
144
|
Shows every symbol affected by your git diff, every consumer file impacted, and whether the change introduced new structural drift.
|
|
@@ -297,7 +334,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
297
334
|
|
|
298
335
|
1. **Compute diff impact**
|
|
299
336
|
```bash
|
|
300
|
-
scip-query diff-impact
|
|
337
|
+
scip-query diff-impact --json
|
|
301
338
|
```
|
|
302
339
|
Shows: changed files, changed symbols with fan-in counts, and affected consumer files.
|
|
303
340
|
|
|
@@ -326,7 +363,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
326
363
|
| See what a function calls and who calls it | `call-graph <symbol>` |
|
|
327
364
|
| Check blast radius of a change | `affected <symbol>` |
|
|
328
365
|
| Get a pre-change briefing | `change-surface <file>` |
|
|
329
|
-
| See impact of my git changes | `diff-impact` |
|
|
366
|
+
| See impact of my git changes | `diff-impact --json` |
|
|
330
367
|
| Find dead code to delete | `dead --min-loc 10 --skip-barrels` |
|
|
331
368
|
| Find duplicate functions | `similar --min-similarity 0.5` |
|
|
332
369
|
| Find same-shape functions | `similar-signatures --min-loc 5` |
|
|
@@ -347,7 +384,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
|
|
|
347
384
|
- **Always reindex before analysis** if the codebase has changed significantly: `scip-query reindex`
|
|
348
385
|
- **Use `--json` on `health`** for programmatic consumption — parse the JSON to make decisions
|
|
349
386
|
- **Run `change-surface` before every file modification** — it takes <1 second and prevents surprises
|
|
350
|
-
- **Run `diff-impact` before committing** — catches unexpected blast radius across downstream consumers
|
|
387
|
+
- **Run `diff-impact --json` before committing** — catches unexpected blast radius across downstream consumers
|
|
351
388
|
- **Use `convergence` after `similar`** — `similar` finds the problem, `convergence` gives the solution
|
|
352
389
|
- **Start cleanup with `health`** — it prioritizes for you so you don't have to decide what to fix first
|
|
353
390
|
- **Scope commands with `-s`** — most commands accept `--scope <path>` to limit analysis to a specific module. Use this on large codebases to keep results focused.
|
package/docs/AI_FAILURE_MODES.md
CHANGED
|
@@ -207,13 +207,13 @@ breaks transitively, or which files historically move together with it — then
|
|
|
207
207
|
|
|
208
208
|
**The detectors:** `plan-context` (one command bundling definitions,
|
|
209
209
|
references, call graph, blast radius, churn, and co-change partners — the
|
|
210
|
-
pre-edit briefing), `change-surface`, `affected`, `diff-impact`.
|
|
210
|
+
pre-edit briefing), `change-surface`, `affected`, `diff-impact --json`.
|
|
211
211
|
|
|
212
212
|
**Use it:**
|
|
213
213
|
|
|
214
214
|
```bash
|
|
215
215
|
scip-query plan-context <symbol-or-file> # before the edit
|
|
216
|
-
scip-query diff-impact
|
|
216
|
+
scip-query diff-impact --json # after the edit
|
|
217
217
|
```
|
|
218
218
|
|
|
219
219
|
The `concrete-plan` skill enforces this end-to-end: every step in a plan must
|
|
@@ -244,35 +244,42 @@ scip-query health --baseline # in CI
|
|
|
244
244
|
|
|
245
245
|
The detectors only help if they run. Three layers, in increasing strength:
|
|
246
246
|
|
|
247
|
-
**1. Skills (routing).** Installing scip-query symlinks
|
|
248
|
-
`~/.agents/skills/`, `~/.claude/skills/`, and
|
|
249
|
-
automatically with the package.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
247
|
+
**1. Skills and lifecycle hooks (routing).** Installing scip-query symlinks the
|
|
248
|
+
bundled skills into `~/.agents/skills/`, `~/.claude/skills/`, and
|
|
249
|
+
`~/.codex/skills/` — they update automatically with the package. Project setup
|
|
250
|
+
writes reviewable repo-local hooks to `.codex/hooks.json` and
|
|
251
|
+
`.claude/settings.json`, unless `SCIP_QUERY_SKIP_HOOK_INSTALL=1` is set. The
|
|
252
|
+
hooks add scip-query context at session start, route prompts toward the right
|
|
253
|
+
specialist, and run a safe Stop hook wrapper around the diff gate only for that
|
|
254
|
+
repository. The Stop hook warns by default instead of blocking the agent; set
|
|
255
|
+
`SCIP_QUERY_STOP_HOOK_MODE=feedback` to ask the agent to continue without a
|
|
256
|
+
hook error, or `SCIP_QUERY_STOP_HOOK_MODE=block` to enforce the gate. Run
|
|
257
|
+
`scip-query setup-hooks --json` to repair the current repo's hooks.
|
|
254
258
|
|
|
255
|
-
**2. Project guidance
|
|
259
|
+
**2. Project setup and guidance.** Run once per project:
|
|
256
260
|
|
|
257
261
|
```bash
|
|
258
|
-
scip-query setup
|
|
262
|
+
scip-query setup --json
|
|
259
263
|
```
|
|
260
264
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
265
|
+
Setup installs or refreshes skills, configures project-local hooks, checks indexer readiness, attempts
|
|
266
|
+
configured indexer remediation, refreshes the index, smoke-tests representative
|
|
267
|
+
commands, writes `docs/scip-query/health-dossier.md` and `.json`, reports the
|
|
268
|
+
health score and items needing attention, and seeds a managed block in
|
|
269
|
+
`AGENTS.md` plus a `CLAUDE.md` import shim.
|
|
270
|
+
|
|
271
|
+
After setup, use `scip-health-audit` to confirm raw signals and
|
|
272
|
+
`scip-health-improve` when the user wants the agent to fix the worst confirmed
|
|
273
|
+
items until the health score is as high as reasonably possible.
|
|
266
274
|
|
|
267
275
|
**3. The gate (enforcement).**
|
|
268
276
|
|
|
269
277
|
```bash
|
|
270
|
-
scip-query diff-gate
|
|
278
|
+
scip-query diff-gate --json # one command, every check above, scoped to the diff, exit 1 on findings
|
|
271
279
|
scip-query setup-agent --git-hook # pre-commit backstop: fires whoever wrote the diff
|
|
272
280
|
```
|
|
273
281
|
|
|
274
282
|
Every finding ships with a remediation an agent can act on without human
|
|
275
|
-
triage.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
tool's hook config if you want the gate to be unskippable.
|
|
283
|
+
triage. The installed Codex/Claude Stop hook uses the same diff-gate evidence,
|
|
284
|
+
warns by default, and no-ops outside indexed scip-query workspaces, so global
|
|
285
|
+
hook install stays safe for ordinary projects.
|
|
@@ -95,7 +95,7 @@ This syntax summary is generated from the CLI command descriptors. Keep workflow
|
|
|
95
95
|
| `co-change [file]` | Files that change together in git history without a dependency edge — hidden coupling candidates | `--min-together <n>`<br>`-n, --limit <n>`<br>`--all`<br>`--full`<br>`--json` |
|
|
96
96
|
| `diff-gate` | Gate the current diff: echo candidates, incomplete migrations, missing co-change partners, uncited doc updates, unused params, new dead symbols; exit 1 on findings | `--base <ref>`<br>`--min-together <n>`<br>`--max-echo-checks <n>`<br>`--max-helpers <n>`<br>`--skip <check>`<br>`--hook`<br>`--json` |
|
|
97
97
|
| `incomplete-migration` | Partially-completed extraction candidates: new helpers in the diff wired into some sites while similar un-migrated sites remain | `--base <ref>`<br>`--min-containment <n>`<br>`--max-helpers <n>`<br>`-n, --limit <n>`<br>`--full`<br>`--json` |
|
|
98
|
-
| `diff-impact` | Compute changed symbols and downstream consumers from current git diff | `--base <ref
|
|
98
|
+
| `diff-impact` | Compute changed symbols and downstream consumers from current git diff | `--base <ref>`<br>`--json` |
|
|
99
99
|
|
|
100
100
|
### Planning
|
|
101
101
|
|
|
@@ -115,7 +115,8 @@ This syntax summary is generated from the CLI command descriptors. Keep workflow
|
|
|
115
115
|
|
|
116
116
|
| Command | Description | Options |
|
|
117
117
|
|---|---|---|
|
|
118
|
-
| `install-skills` | Install skills (scip-query, scip-query-setup, concrete-plan, scip-ai-cleanup, scip-explore, scip-debloat, scip-doc-reconcile, scip-directory-architecture, scip-maintainability, scip-react-maintainability, scip-vue-maintainability, scip-verify, scip-language-playbook) into Claude Code, Codex, and shared agent roots | - |
|
|
118
|
+
| `install-skills` | Install skills (scip-query, scip-query-setup, scip-adoption, scip-health-audit, scip-health-improve, scip-api-impact, concrete-plan, scip-ai-cleanup, scip-debug, scip-explore, scip-triage-issue, scip-diagram, scip-debloat, scip-doc-reconcile, scip-directory-architecture, scip-maintainability, scip-react-maintainability, scip-vue-maintainability, scip-verify, scip-language-playbook) into Claude Code, Codex, and shared agent roots | - |
|
|
119
|
+
| `setup-hooks` | Install or refresh project-local Codex and Claude Code lifecycle hooks | `--json` |
|
|
119
120
|
| `check-deps` | Check whether scip-query and the detected language indexers are actually runnable | - |
|
|
120
121
|
| `capabilities` | Report which evidence and verification capabilities are available in this project | `--json` |
|
|
121
122
|
| `capability-matrix` | Report the evidence and verification capability matrix by language | `--json` |
|
|
@@ -123,6 +124,7 @@ This syntax summary is generated from the CLI command descriptors. Keep workflow
|
|
|
123
124
|
| `config-validate` | Validate .scipquery.json, including structured suppressions and declared coupling groups | `--json` |
|
|
124
125
|
| `suppress <id>` | Record an accepted finding in .scipquery.json with a required reason | `--reason <text>`<br>`--check <check>`<br>`--file <path>`<br>`--expires-at <iso>`<br>`--json` |
|
|
125
126
|
| `doctor` | Diagnose config, index freshness, dependency readiness, and project capabilities | `--json` |
|
|
127
|
+
| `setup` | Bootstrap this project: install agent skills, refresh the index, verify capabilities, and report health | `--git-hook`<br>`--json` |
|
|
126
128
|
| `setup-agent` | Seed agent guidance for this project: AGENTS.md/CLAUDE.md block pointing agents at the scip-query skills and diff gate, plus an optional git pre-commit backstop | `--git-hook` |
|
|
127
129
|
| `setup-ci` | Write a GitHub Actions workflow that runs scip-query reindex and diff-gate on pull requests | `--force`<br>`--dry-run` |
|
|
128
130
|
| `watch` | Watch for file changes and reindex automatically | `--debounce <ms>`<br>`--cooldown <ms>` |
|
|
@@ -20,7 +20,7 @@ The action tiers are:
|
|
|
20
20
|
|
|
21
21
|
## Current Surfaces
|
|
22
22
|
|
|
23
|
-
The published query surface
|
|
23
|
+
The published query surface and private query-helper manifest live in `src/queries/public-query-entries.ts`. The CLI command order and families live in `src/runtime/commands/query-command-specs.ts`. The composite health score runs the phases listed in `HEALTH_PHASES` in `src/queries/health/health.ts`. The diff gate runs the checks listed in `DIFF_GATE_CHECKS` in `src/queries/impact/diff-gate.ts`, with doc-reference and baseline policy helpers kept private to the query tree.
|
|
24
24
|
|
|
25
25
|
`health --json` on this repository currently reports:
|
|
26
26
|
|
|
@@ -160,3 +160,7 @@ Command shape:
|
|
|
160
160
|
- Action tier: contextual signal. It guides placement; it should not force moves without architecture judgment.
|
|
161
161
|
|
|
162
162
|
This should pair with `react-large-component-pressure`, `vue-large-view-pressure`, `extract-candidates`, and `incomplete-migration` so agents do not reduce size scores by dumping extracted pieces into flat local directories.
|
|
163
|
+
|
|
164
|
+
## 2026-06-23 Citation Refresh
|
|
165
|
+
|
|
166
|
+
The maintainability-register completion slice rechecked the command and diff-gate guide references above. `src/runtime/commands/query-command-specs.ts` still owns the public query order, now also exporting `orderedQueryCommandDescriptors` so CLI registration can derive from that order. `src/queries/impact/diff-gate.ts` still owns `DIFF_GATE_CHECKS`; the slice only centralized finding emission through a local recorder and did not change the listed check family.
|