@vpxa/kb 0.1.32 → 0.1.33

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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/packages/analyzers/dist/diagram-generator.js +2 -2
  3. package/packages/analyzers/dist/pattern-analyzer.js +1 -1
  4. package/packages/analyzers/dist/regex-call-graph.js +1 -1
  5. package/packages/cli/dist/commands/init/constants.d.ts +2 -0
  6. package/packages/cli/dist/commands/init/constants.js +1 -1
  7. package/packages/present/dist/index.html +321 -22
  8. package/packages/server/dist/server.js +1 -1
  9. package/packages/server/dist/tools/onboard.tool.js +2 -2
  10. package/packages/server/dist/tools/present/browser.d.ts +4 -0
  11. package/packages/server/dist/tools/present/browser.js +93 -0
  12. package/packages/server/dist/tools/present/helpers.d.ts +13 -0
  13. package/packages/server/dist/tools/present/helpers.js +1 -0
  14. package/packages/server/dist/tools/present/html.d.ts +18 -0
  15. package/packages/server/dist/tools/present/html.js +5 -0
  16. package/packages/server/dist/tools/present/index.d.ts +2 -0
  17. package/packages/server/dist/tools/present/index.js +1 -0
  18. package/packages/server/dist/tools/present/markdown.d.ts +17 -0
  19. package/packages/server/dist/tools/present/markdown.js +8 -0
  20. package/packages/server/dist/tools/present/templates.d.ts +14 -0
  21. package/packages/server/dist/tools/present/templates.js +472 -0
  22. package/packages/server/dist/tools/present/tool.d.ts +23 -0
  23. package/packages/server/dist/tools/present/tool.js +19 -0
  24. package/packages/server/dist/tools/present.tool.d.ts +1 -6
  25. package/packages/server/dist/tools/present.tool.js +1 -114
  26. package/packages/tools/dist/compact.js +1 -1
  27. package/packages/tools/dist/file-cache.js +3 -3
  28. package/packages/tools/dist/file-summary.js +1 -1
  29. package/packages/tools/dist/onboard.d.ts +7 -0
  30. package/packages/tools/dist/onboard.js +4 -4
  31. package/skills/present/SKILL.md +283 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/kb",
3
- "version": "0.1.32",
3
+ "version": "0.1.33",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -1,2 +1,2 @@
1
- import{DependencyAnalyzer as e}from"./dependency-analyzer.js";import{StructureAnalyzer as t}from"./structure-analyzer.js";var n=class{name=`diagrams`;structureAnalyzer=new t;dependencyAnalyzer=new e;async analyze(e,t={}){let{diagramType:n=`architecture`}=t,r=Date.now(),i;switch(n){case`dependencies`:i=await this.generateDependencyDiagram(e);break;default:i=await this.generateArchitectureDiagram(e);break}return{output:i,data:{diagramType:n},meta:{analyzedAt:new Date().toISOString(),scope:e,fileCount:0,durationMs:Date.now()-r}}}async generateArchitectureDiagram(e){let t=(await this.structureAnalyzer.analyze(e,{format:`json`,maxDepth:4})).data.tree,n=(await this.dependencyAnalyzer.analyze(e,{format:`json`})).data,r=["```mermaid",`graph TB`],i=(t.children??[]).filter(e=>e.type===`directory`).slice(0,15);for(let e of i){let t=e.name.replace(/[^a-zA-Z0-9]/g,`_`),n=(e.children??[]).filter(e=>e.type===`directory`);if(n.length>0){r.push(` subgraph ${t}["${e.name}/"]`);for(let e of n.slice(0,12)){let n=`${t}_${e.name.replace(/[^a-zA-Z0-9]/g,`_`)}`,i=Array.isArray(e.children)?e.children.length:0;r.push(` ${n}["${e.name}/ (${i})"]`)}r.push(` end`)}else{let n=Array.isArray(e.children)?e.children.length:0;r.push(` ${t}["${e.name}/ (${n} files)"]`)}}let a=new Set;if(n.internal)for(let[e,t]of Object.entries(n.internal)){let n=e.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`);for(let e of t){if(e.startsWith(`.`))continue;let t=e.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`);if(n&&t&&n!==t){let e=`${n}->${t}`;a.has(e)||(a.add(e),r.push(` ${n} --> ${t}`))}}}return r.push("```"),r.join(`
2
- `)}async generateDependencyDiagram(e){return`\`\`\`mermaid\n${(await this.dependencyAnalyzer.analyze(e,{format:`mermaid`})).output}\n\`\`\``}};export{n as DiagramGenerator};
1
+ import{DependencyAnalyzer as e}from"./dependency-analyzer.js";import{StructureAnalyzer as t}from"./structure-analyzer.js";import{join as n}from"node:path";import{readFileSync as r,readdirSync as i}from"node:fs";var a=class{name=`diagrams`;structureAnalyzer=new t;dependencyAnalyzer=new e;async analyze(e,t={}){let{diagramType:n=`architecture`}=t,r=Date.now(),i;switch(n){case`dependencies`:i=await this.generateDependencyDiagram(e);break;default:i=await this.generateArchitectureDiagram(e);break}return{output:i,data:{diagramType:n},meta:{analyzedAt:new Date().toISOString(),scope:e,fileCount:0,durationMs:Date.now()-r}}}async generateArchitectureDiagram(e){let t=(await this.structureAnalyzer.analyze(e,{format:`json`,maxDepth:4})).data.tree,a=await this.dependencyAnalyzer.analyze(e,{format:`json`}),o=a.data,s=["```mermaid",`graph TB`],c=(t.children??[]).filter(e=>e.type===`directory`).slice(0,15);for(let e of c){let t=e.name.replace(/[^a-zA-Z0-9]/g,`_`),n=(e.children??[]).filter(e=>e.type===`directory`);if(n.length>0){s.push(` subgraph ${t}["${e.name}/"]`);for(let e of n.slice(0,12)){let n=`${t}_${e.name.replace(/[^a-zA-Z0-9]/g,`_`)}`,r=Array.isArray(e.children)?e.children.length:0;s.push(` ${n}["${e.name}/ (${r})"]`)}s.push(` end`)}else{let n=Array.isArray(e.children)?e.children.length:0;s.push(` ${t}["${e.name}/ (${n} files)"]`)}}let l=new Set;if(o.internal)for(let[e,t]of Object.entries(o.internal)){let n=e.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`);for(let e of t){if(e.startsWith(`.`))continue;let t=e.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`);if(n&&t&&n!==t){let e=`${n}->${t}`;l.has(e)||(l.add(e),s.push(` ${n} --> ${t}`))}}}let u=a.data;if(u.external){let t=new Map;for(let a of[`packages`,`apps`,`libs`,`services`,`functions`])try{for(let o of i(n(e,a),{withFileTypes:!0}))if(o.isDirectory())try{let i=JSON.parse(r(n(e,a,o.name,`package.json`),`utf-8`));i.name&&t.set(i.name,`${a}/${o.name}`)}catch{}}catch{}for(let[e,n]of Object.entries(u.external)){let r=t.get(e);if(!r)continue;let i=r.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`),a=Array.isArray(n)?n:n.usedBy;for(let e of a??[]){let t=e.split(`/`)[0]?.replace(/[^a-zA-Z0-9]/g,`_`);if(t&&i&&t!==i){let e=`${t}->${i}`;l.has(e)||(l.add(e),s.push(` ${t} --> ${i}`))}}}}return s.push("```"),s.join(`
2
+ `)}async generateDependencyDiagram(e){return`\`\`\`mermaid\n${(await this.dependencyAnalyzer.analyze(e,{format:`mermaid`})).output}\n\`\`\``}};export{a as DiagramGenerator};
@@ -1,2 +1,2 @@
1
- import{access as e,readFile as t,readdir as n,stat as r}from"node:fs/promises";import{extname as i,join as a,relative as o}from"node:path";import{SUPPORTED_EXTENSIONS as s,WasmRuntime as c,detectPatterns as l}from"../../chunker/dist/index.js";const u=new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,`__pycache__`,`.venv`,`target`,`bin`,`obj`,`.gradle`,`venv`,`env`]),d=[{dirs:[`adapters`,`ports`],pattern:`Hexagonal Architecture`,description:`Ports & adapters (hexagonal) separation`},{dirs:[`domain`,`infrastructure`,`application`],pattern:`Clean Architecture`,description:`Layered with domain/infrastructure separation`},{dirs:[`controllers`,`models`],pattern:`MVC Pattern`,description:`Model-View-Controller structure`},{dirs:[`repositories`],pattern:`Repository Pattern`,description:`Data access abstraction via repositories`},{dirs:[`factories`],pattern:`Factory Pattern`,description:`Object creation via factories`},{dirs:[`handlers`],pattern:`Handler Pattern`,description:`Event/request handler separation`},{dirs:[`middleware`],pattern:`Middleware Pattern`,description:`Request pipeline middleware`},{dirs:[`hooks`],pattern:`React Hooks`,description:`Custom React hooks for logic reuse`},{dirs:[`components`],pattern:`Component Architecture`,description:`UI component-based structure`},{dirs:[`stacks`,`constructs`],pattern:`CDK IaC`,description:`AWS CDK infrastructure as code`},{dirs:[`lambdas`,`functions`],pattern:`Serverless`,description:`Serverless function architecture`}];function f(e){if(e.length<=3)return e;let t=new Map;for(let n of e){let e=n.split(`/`),r=e.length>1?e.slice(0,-1).join(`/`):`.`,i=t.get(r);i?i.push(n):t.set(r,[n])}let n=[];for(let[e,r]of t)r.length>=3?n.push(`${e}/ (${r.length} files)`):n.push(...r);return n.slice(0,5)}const p=[{regex:/container\.register|@injectable|@inject/i,pattern:`Dependency Injection`,description:`IoC container or DI decorators`},{regex:/\.pipe\(|Observable|BehaviorSubject/i,pattern:`Reactive (RxJS)`,description:`Reactive programming with observables`,lang:`js`},{regex:/createContext|useContext/i,pattern:`React Context`,description:`React Context API for state sharing`,lang:`js`},{regex:/createSlice|configureStore/i,pattern:`Redux Toolkit`,description:`Redux state management`,lang:`js`},{regex:/defineStore|usePinia/i,pattern:`Pinia Store`,description:`Vue Pinia state management`,lang:`js`},{regex:/\.(test|spec)\.[jt]sx?|describe\s*\(|\bit\s*\([\s'"]/i,pattern:`Test Suite`,description:`Unit/integration test files`},{regex:/@SpringBootApplication|@EnableAutoConfiguration/,pattern:`Spring Boot`,description:`Spring Boot application framework`,lang:`java`,definitive:!0},{regex:/@Autowired|@Component|@Service|@Repository|@Controller/,pattern:`Spring DI`,description:`Spring dependency injection`,lang:`java`},{regex:/@RestController|@RequestMapping|@GetMapping|@PostMapping/,pattern:`Spring REST`,description:`Spring REST API controllers`,lang:`java`},{regex:/app\s*=\s*Flask\s*\(|@app\.route/,pattern:`Flask`,description:`Flask web framework`,lang:`python`},{regex:/app\s*=\s*FastAPI\s*\(|@app\.get|@app\.post/,pattern:`FastAPI`,description:`FastAPI web framework`,lang:`python`},{regex:/func\s+main\s*\(\s*\)|http\.ListenAndServe/,pattern:`Go Application`,description:`Go main application`,lang:`go`},{regex:/export\s+(?:async\s+)?function\s+create[A-Z]\w+/,pattern:`Factory`,description:`Object creation via create*() functions`,lang:`js`},{regex:/(?:export\s+)?function\s+wrap[A-Z]\w+/,pattern:`Wrapper/Decorator`,description:`Higher-order function wrapping`,lang:`js`},{regex:/(?:const|let)\s+\w+\s*=\s*new\s+(?:Map|WeakMap)\s*[<(]/,pattern:`Singleton Cache`,description:`Module-level cache with lazy initialization`,lang:`js`},{regex:/Record<string,\s*(?:\w+)?Handler>|\.(?:get|post|put|delete)\s*\(/,pattern:`Router/Dispatcher`,description:`Request routing/dispatch table`,lang:`js`},{regex:/export\s+(?:default\s+)?class\s+\w+\s+extends\s+(?:Construct|Stack|NestedStack|Stage)/,pattern:`CDK Construct`,description:`AWS CDK infrastructure construct`,lang:`js`,definitive:!0}];var m=class{name=`patterns`;async analyze(e,t={}){let n=Date.now(),r=await this.collectDirectories(e),i=this.detectDirectoryPatterns(r,e),a=await this.collectCodeFiles(e),o=await this.detectCodePatterns(a,e),s=[...i,...o],c=await this.detectConfigPatterns(e),l=c.find(e=>e.pattern===`Maven`||e.pattern===`Gradle`||e.pattern===`Gradle (Kotlin DSL)`||e.pattern===`Node.js Project`||e.pattern===`Go Module`||e.pattern===`Rust (Cargo)`),u=new Set([`Ruby (Bundler)`,`PHP (Composer)`,`Swift Package`,`SBT`]);for(let e of c)l&&u.has(e.pattern)||s.push(e);return{output:this.formatMarkdown(s,e),data:{patterns:s,total:s.length},meta:{analyzedAt:new Date().toISOString(),scope:e,fileCount:a.length,durationMs:Date.now()-n}}}async collectDirectories(e){let t=[],i=async(e,o)=>{if(o>5||!(await r(e).catch(()=>null))?.isDirectory())return;let s=await n(e,{withFileTypes:!0});for(let n of s){if(!n.isDirectory()||u.has(n.name)||n.name.startsWith(`.`))continue;let r=a(e,n.name);t.push(n.name),await i(r,o+1)}};return await i(e,0),t}async collectCodeFiles(e){let t=[],r=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.java`,`.py`,`.go`,`.cs`,`.kt`,`.scala`,`.rb`,`.rs`,`.php`,`.swift`]),o=async e=>{let s=await n(e,{withFileTypes:!0});for(let n of s){if(u.has(n.name)||n.name.startsWith(`.`))continue;let s=a(e,n.name);n.isDirectory()?await o(s):r.has(i(n.name))&&t.push(s)}};return await o(e),t}detectDirectoryPatterns(e,t){let n=new Set(e.map(e=>e.toLowerCase())),r=[];for(let e of d){let t=e.dirs.filter(e=>n.has(e));t.length!==0&&(e.dirs.length>1&&t.length<2||r.push({pattern:e.pattern,description:e.description,locations:t.map(e=>`${e}/`),confidence:t.length===e.dirs.length?`high`:`medium`}))}return r}async detectCodePatterns(e,n){let r=[],a={},u=!1;try{await c.ensure(),u=!0}catch{}let d=e.filter(e=>/Application\.\w+$|Main\.\w+$|app\.\w+$|main\.\w+$/i.test(e)||/Controller|Service|Handler|Router/i.test(e)),m=e.filter(e=>!d.includes(e)),h=[...d.slice(0,50),...m.slice(0,150)];for(let e of h)try{let r=await t(e,`utf-8`),c=i(e).toLowerCase(),d=o(n,e).replace(/\\/g,`/`);if(u&&s.has(c)){let e=await l(r,c,d);for(let t of e){a[t.pattern]||(a[t.pattern]=new Set);for(let e of t.locations)a[t.pattern].add(e)}}let f=c===`.java`||c===`.kt`||c===`.scala`?`java`:c===`.py`?`python`:c===`.go`?`go`:`js`;for(let e of p)e.lang&&e.lang!==f||e.regex.test(r)&&(a[e.pattern]||(a[e.pattern]=new Set),a[e.pattern].add(d))}catch{}for(let e of p){let t=a[e.pattern];if(t&&t.size>0){let n=f([...t]);r.push({pattern:e.pattern,description:e.description,locations:n,confidence:e.definitive||t.size>=3?`high`:t.size>=2?`medium`:`low`})}}let g=new Set(p.map(e=>e.pattern));for(let[e,t]of Object.entries(a)){if(g.has(e)||t.size===0)continue;let n=f([...t]);r.push({pattern:e,description:`Detected via AST analysis`,locations:n,confidence:t.size>=3?`high`:t.size>=2?`medium`:`low`})}return r}async detectConfigPatterns(t){let n=[];for(let r of[{file:`Dockerfile`,pattern:`Docker`,description:`Containerized application`},{file:`docker-compose.yml`,pattern:`Docker Compose`,description:`Container orchestration`},{file:`cdk.json`,pattern:`AWS CDK`,description:`AWS CDK infrastructure as code`},{file:`terraform.tf`,pattern:`Terraform`,description:`Terraform IaC`},{file:`main.tf`,pattern:`Terraform`,description:`Terraform IaC`}])try{await e(a(t,r.file)),n.push({pattern:r.pattern,description:r.description,locations:[r.file],confidence:`high`})}catch{}return n}formatMarkdown(e,t){let n=[];n.push(`## Patterns Detected: ${t}\n`),n.push(`**${e.length} patterns** found\n`);let r={high:[],medium:[],low:[]};for(let t of e)r[t.confidence].push(t);for(let[e,t]of Object.entries(r))if(t.length!==0){n.push(`### ${e.charAt(0).toUpperCase()+e.slice(1)} Confidence\n`);for(let e of t)n.push(`- **${e.pattern}**: ${e.description}`),n.push(` Locations: ${e.locations.slice(0,5).join(`, `)}`);n.push(``)}return n.join(`
1
+ import{access as e,readFile as t,readdir as n,stat as r}from"node:fs/promises";import{extname as i,join as a,relative as o}from"node:path";import{SUPPORTED_EXTENSIONS as s,WasmRuntime as c,detectPatterns as l}from"../../chunker/dist/index.js";const u=new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,`__pycache__`,`.venv`,`target`,`bin`,`obj`,`.gradle`,`venv`,`env`]),d=[{dirs:[`adapters`,`ports`],pattern:`Hexagonal Architecture`,description:`Ports & adapters (hexagonal) separation`},{dirs:[`domain`,`infrastructure`,`application`],pattern:`Clean Architecture`,description:`Layered with domain/infrastructure separation`},{dirs:[`controllers`,`models`],pattern:`MVC Pattern`,description:`Model-View-Controller structure`},{dirs:[`repositories`],pattern:`Repository Pattern`,description:`Data access abstraction via repositories`},{dirs:[`factories`],pattern:`Factory Pattern`,description:`Object creation via factories`},{dirs:[`handlers`],pattern:`Handler Pattern`,description:`Event/request handler separation`},{dirs:[`middleware`],pattern:`Middleware Pattern`,description:`Request pipeline middleware`},{dirs:[`hooks`],pattern:`React Hooks`,description:`Custom React hooks for logic reuse`},{dirs:[`components`],pattern:`Component Architecture`,description:`UI component-based structure`},{dirs:[`stacks`,`constructs`],pattern:`CDK IaC`,description:`AWS CDK infrastructure as code`},{dirs:[`lambdas`,`functions`],pattern:`Serverless`,description:`Serverless function architecture`}];function f(e){if(e.length<=3)return e;let t=new Map;for(let n of e){let e=n.split(`/`),r=e.length>1?e.slice(0,-1).join(`/`):`.`,i=t.get(r);i?i.push(n):t.set(r,[n])}let n=[];for(let[e,r]of t)r.length>=3?n.push(`${e}/ (${r.length} files)`):n.push(...r);return n.slice(0,5)}const p=[{regex:/container\.register|@injectable|@inject/i,pattern:`Dependency Injection`,description:`IoC container or DI decorators`},{regex:/\.pipe\(|Observable|BehaviorSubject/i,pattern:`Reactive (RxJS)`,description:`Reactive programming with observables`,lang:`js`},{regex:/createContext|useContext/i,pattern:`React Context`,description:`React Context API for state sharing`,lang:`js`},{regex:/createSlice|configureStore/i,pattern:`Redux Toolkit`,description:`Redux state management`,lang:`js`},{regex:/defineStore|usePinia/i,pattern:`Pinia Store`,description:`Vue Pinia state management`,lang:`js`},{regex:/\.(test|spec)\.[jt]sx?|describe\s*\(|\bit\s*\([\s'"]/i,pattern:`Test Suite`,description:`Unit/integration test files`},{regex:/@SpringBootApplication|@EnableAutoConfiguration/,pattern:`Spring Boot`,description:`Spring Boot application framework`,lang:`java`,definitive:!0},{regex:/@Autowired|@Component|@Service|@Repository|@Controller/,pattern:`Spring DI`,description:`Spring dependency injection`,lang:`java`},{regex:/@RestController|@RequestMapping|@GetMapping|@PostMapping/,pattern:`Spring REST`,description:`Spring REST API controllers`,lang:`java`},{regex:/app\s*=\s*Flask\s*\(|@app\.route/,pattern:`Flask`,description:`Flask web framework`,lang:`python`},{regex:/app\s*=\s*FastAPI\s*\(|@app\.get|@app\.post/,pattern:`FastAPI`,description:`FastAPI web framework`,lang:`python`},{regex:/func\s+main\s*\(\s*\)|http\.ListenAndServe/,pattern:`Go Application`,description:`Go main application`,lang:`go`},{regex:/export\s+(?:async\s+)?function\s+create[A-Z]\w+/,pattern:`Factory`,description:`Object creation via create*() functions`,lang:`js`},{regex:/(?:export\s+)?function\s+wrap[A-Z]\w+/,pattern:`Wrapper/Decorator`,description:`Higher-order function wrapping`,lang:`js`},{regex:/(?:const|let)\s+\w+\s*=\s*new\s+(?:Map|WeakMap)\s*[<(]/,pattern:`Singleton Cache`,description:`Module-level cache with lazy initialization`,lang:`js`},{regex:/Record<string,\s*(?:\w+)?Handler>|\.(?:get|post|put|delete)\s*\(/,pattern:`Router/Dispatcher`,description:`Request routing/dispatch table`,lang:`js`},{regex:/export\s+(?:default\s+)?class\s+\w+\s+extends\s+(?:Construct|Stack|NestedStack|Stage)/,pattern:`CDK Construct`,description:`AWS CDK infrastructure construct`,lang:`js`,definitive:!0}];var m=class{name=`patterns`;async analyze(e,t={}){let n=Date.now(),r=await this.collectDirectories(e),i=this.detectDirectoryPatterns(r,e),a=await this.collectCodeFiles(e),o=await this.detectCodePatterns(a,e),s=[...i,...o],c=await this.detectConfigPatterns(e),l=c.find(e=>e.pattern===`Maven`||e.pattern===`Gradle`||e.pattern===`Gradle (Kotlin DSL)`||e.pattern===`Node.js Project`||e.pattern===`Go Module`||e.pattern===`Rust (Cargo)`),u=new Set([`Ruby (Bundler)`,`PHP (Composer)`,`Swift Package`,`SBT`]);for(let e of c)l&&u.has(e.pattern)||s.push(e);return{output:this.formatMarkdown(s,e),data:{patterns:s,total:s.length},meta:{analyzedAt:new Date().toISOString(),scope:e,fileCount:a.length,durationMs:Date.now()-n}}}async collectDirectories(e){let t=[],i=async(e,o)=>{if(o>5||!(await r(e).catch(()=>null))?.isDirectory())return;let s=await n(e,{withFileTypes:!0});for(let n of s){if(!n.isDirectory()||u.has(n.name)||n.name.startsWith(`.`))continue;let r=a(e,n.name);t.push(n.name),await i(r,o+1)}};return await i(e,0),t}async collectCodeFiles(e){let t=[],r=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.java`,`.py`,`.go`,`.cs`,`.kt`,`.scala`,`.rb`,`.rs`,`.php`,`.swift`]),o=async e=>{let s=await n(e,{withFileTypes:!0});for(let n of s){if(u.has(n.name)||n.name.startsWith(`.`))continue;let s=a(e,n.name);n.isDirectory()?await o(s):r.has(i(n.name))&&t.push(s)}};return await o(e),t}detectDirectoryPatterns(e,t){let n=new Set(e.map(e=>e.toLowerCase())),r=[];for(let e of d){let t=e.dirs.filter(e=>n.has(e));t.length!==0&&(e.dirs.length>1&&t.length<2||r.push({pattern:e.pattern,description:e.description,locations:t.map(e=>`${e}/`),confidence:t.length===e.dirs.length?`high`:`medium`}))}return r}async detectCodePatterns(e,n){let r=[],a={},u=!1;try{await c.ensure(),u=!0}catch{}let d=e.filter(e=>/Application\.\w+$|Main\.\w+$|app\.\w+$|main\.\w+$/i.test(e)||/Controller|Service|Handler|Router/i.test(e)),m=e.filter(e=>!d.includes(e)),h=[...d.slice(0,50),...m.slice(0,150)];for(let e of h)try{let r=await t(e,`utf-8`),c=i(e).toLowerCase(),d=o(n,e).replace(/\\/g,`/`);if(/analyzers\/src\//.test(d))continue;if(u&&s.has(c)){let e=await l(r,c,d);for(let t of e){a[t.pattern]||(a[t.pattern]=new Set);for(let e of t.locations)a[t.pattern].add(e)}}let f=c===`.java`||c===`.kt`||c===`.scala`?`java`:c===`.py`?`python`:c===`.go`?`go`:`js`;for(let e of p)e.lang&&e.lang!==f||e.regex.test(r)&&(a[e.pattern]||(a[e.pattern]=new Set),a[e.pattern].add(d))}catch{}for(let e of p){let t=a[e.pattern];if(t&&t.size>0){let n=f([...t]);r.push({pattern:e.pattern,description:e.description,locations:n,confidence:e.definitive||t.size>=3?`high`:t.size>=2?`medium`:`low`})}}let g=new Set(p.map(e=>e.pattern));for(let[e,t]of Object.entries(a)){if(g.has(e)||t.size===0)continue;let n=f([...t]);r.push({pattern:e,description:`Detected via AST analysis`,locations:n,confidence:t.size>=3?`high`:t.size>=2?`medium`:`low`})}return r}async detectConfigPatterns(t){let n=[];for(let r of[{file:`Dockerfile`,pattern:`Docker`,description:`Containerized application`},{file:`docker-compose.yml`,pattern:`Docker Compose`,description:`Container orchestration`},{file:`cdk.json`,pattern:`AWS CDK`,description:`AWS CDK infrastructure as code`},{file:`terraform.tf`,pattern:`Terraform`,description:`Terraform IaC`},{file:`main.tf`,pattern:`Terraform`,description:`Terraform IaC`}])try{await e(a(t,r.file)),n.push({pattern:r.pattern,description:r.description,locations:[r.file],confidence:`high`})}catch{}return n}formatMarkdown(e,t){let n=[];n.push(`## Patterns Detected: ${t}\n`),n.push(`**${e.length} patterns** found\n`);let r={high:[],medium:[],low:[]};for(let t of e)r[t.confidence].push(t);for(let[e,t]of Object.entries(r))if(t.length!==0){n.push(`### ${e.charAt(0).toUpperCase()+e.slice(1)} Confidence\n`);for(let e of t)n.push(`- **${e.pattern}**: ${e.description}`),n.push(` Locations: ${e.locations.slice(0,5).join(`, `)}`);n.push(``)}return n.join(`
2
2
  `)}};export{m as PatternAnalyzer};
@@ -1 +1 @@
1
- import{extname as e,join as t,relative as n}from"node:path";import{readFileSync as r,readdirSync as i}from"node:fs";const a=new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,`.venv`,`venv`,`__pycache__`,`target`,`vendor`,`bin`,`obj`]),o=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.java`,`.py`,`.go`,`.cs`,`.kt`,`.scala`,`.rs`,`.rb`,`.php`,`.swift`]);async function s(i){let a=Date.now(),o=v(i);if(o.length===0)return null;let s=o.slice(0,800),u=new Map,m=new Map;for(let t of s){let a=n(i,t).replace(/\\/g,`/`),o=r(t,`utf-8`),s=e(t).toLowerCase(),d=c(o,s);u.set(a,d);let f=l(o,s);m.set(a,f)}let g=p(s,i),y=new Map;for(let[n,a]of u){if(_(n))continue;let o=f(r(t(i,n),`utf-8`),e(n));for(let t of a){if(!t.isRelative)continue;let r=h(n,t.source,g,e(n));if(r.length===0)continue;let i=r[0];if(_(i)||n===i)continue;let a;if(a=t.symbols.length>0?t.symbols.filter(e=>RegExp(`\\b${d(e)}\\b`).test(o)):[`*`],a.length===0)continue;let s=`${n}|${i}`,c=y.get(s);if(c)for(let e of a)c.add(e);else y.set(s,new Set(a))}}let b=[];for(let[e,t]of y){let[n,r]=e.split(`|`);b.push({from:n,to:r,symbols:[...t].sort().slice(0,10)})}return b.sort((e,t)=>t.symbols.length-e.symbols.length),{edges:b,fileCount:s.length,edgeCount:b.length,durationMs:Date.now()-a}}function c(e,t){let n=[];switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{let t=/import\s+(?:type\s+)?\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`,`).map(e=>{let t=e.trim().split(/\s+as\s+/);return(t[t.length-1]||``).trim()}).filter(Boolean);n.push({source:r[2],symbols:e,isRelative:r[2].startsWith(`.`)})}let i=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;for(;(r=i.exec(e))!==null;)r[1]!==`type`&&n.push({source:r[2],symbols:[r[1]],isRelative:r[2].startsWith(`.`)});let a=/(?:const|let|var)\s+\{([^}]+)\}\s*=\s*require\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=a.exec(e))!==null;){let e=r[1].split(`,`).map(e=>e.trim().split(`:`)[0].trim()).filter(Boolean);n.push({source:r[2],symbols:e,isRelative:r[2].startsWith(`.`)})}break}case`.java`:case`.kt`:case`.scala`:{let t=/^import\s+(?:static\s+)?([\w.]+)\s*;/gm,r;for(;(r=t.exec(e))!==null;){let t=r[1].split(`.`),i=t[t.length-1];i===`*`?n.push({source:r[1],symbols:[],isRelative:u(r[1],e)}):n.push({source:r[1],symbols:[i],isRelative:u(r[1],e)})}break}case`.py`:{let t=/^from\s+([\w.]+)\s+import\s+(.+)$/gm,r;for(;(r=t.exec(e))!==null;){let e=r[2].split(`,`).map(e=>{let t=e.trim().split(/\s+as\s+/);return(t[t.length-1]||``).trim()}).filter(e=>e&&e!==`(`);n.push({source:r[1],symbols:e,isRelative:r[1].startsWith(`.`)})}let i=/^import\s+([\w.]+)(?:\s+as\s+(\w+))?\s*$/gm;for(;(r=i.exec(e))!==null;){let e=r[1].split(`.`),t=r[2]||e[e.length-1];n.push({source:r[1],symbols:[t],isRelative:r[1].startsWith(`.`)})}break}case`.go`:{let t=/import\s+(?:(\w+)\s+)?[""]([^""]+)[""]/g,r;for(;(r=t.exec(e))!==null;){let e=r[2].split(`/`),t=r[1]||e[e.length-1];n.push({source:r[2],symbols:[t],isRelative:!r[2].includes(`.`)&&!r[2].startsWith(`github.com`)})}let i=/import\s*\(([\s\S]*?)\)/g;for(;(r=i.exec(e))!==null;){let e=r[1],t=/(?:(\w+)\s+)?[""]([^""]+)[""]/g,i;for(;(i=t.exec(e))!==null;){let e=i[2].split(`/`),t=i[1]||e[e.length-1];n.push({source:i[2],symbols:[t],isRelative:!i[2].includes(`.`)&&!i[2].startsWith(`github.com`)})}}break}case`.cs`:{let t=/^using\s+(?:static\s+)?([\w.]+)\s*;/gm,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`.`);n.push({source:r[1],symbols:[e[e.length-1]],isRelative:!0})}break}case`.rs`:{let t=/^use\s+([\w:]+(?:::\w+)*)/gm,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`::`),t=e[e.length-1];n.push({source:r[1],symbols:t===`*`?[]:[t],isRelative:r[1].startsWith(`crate`)||r[1].startsWith(`super`)})}break}}return n}function l(e,t){let n=new Set;switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{let t=/export\s+(?:default\s+)?(?:abstract\s+)?(?:async\s+)?(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/g,r;for(;(r=t.exec(e))!==null;)n.add(r[1]);break}case`.java`:case`.kt`:case`.scala`:{let t=/(?:public|protected)\s+(?:static\s+)?(?:abstract\s+)?(?:final\s+)?(?:class|interface|enum|record|@interface)\s+(\w+)/g,r;for(;(r=t.exec(e))!==null;)n.add(r[1]);let i=/(?:public|protected)\s+(?:static\s+)?(?:abstract\s+)?(?:final\s+)?\w+(?:<[^>]+>)?\s+(\w+)\s*\(/g;for(;(r=i.exec(e))!==null;)[`if`,`for`,`while`,`switch`,`catch`,`return`,`class`,`interface`,`enum`,`new`].includes(r[1])||n.add(r[1]);break}case`.py`:{let t=/^(?:def|class)\s+([A-Z_]\w*)/gm,r;for(;(r=t.exec(e))!==null;)r[1].startsWith(`_`)||n.add(r[1]);break}case`.go`:{let t=/^(?:func|type|var|const)\s+(\(?[A-Z]\w*)/gm,r;for(;(r=t.exec(e))!==null;)n.add(r[1].replace(`(`,``));break}}return n}function u(e,t){let n=t.match(/^package\s+([\w.]+)\s*;/m);if(!n)return!1;let r=n[1].split(`.`),i=e.split(`.`);return r.length>=2&&i.length>=2&&r[0]===i[0]&&r[1]===i[1]}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function f(e,t){switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:return e.replace(/^import\s+.+$/gm,``).replace(/^const\s+.+=\s*require\(.+$/gm,``);case`.java`:case`.kt`:case`.scala`:return e.replace(/^import\s+.+;$/gm,``);case`.py`:return e.replace(/^(?:from\s+.+import\s+.+|import\s+.+)$/gm,``);case`.go`:return e.replace(/^import\s+.+$/gm,``).replace(/import\s*\([\s\S]*?\)/g,``);case`.cs`:return e.replace(/^using\s+.+;$/gm,``);case`.rs`:return e.replace(/^use\s+.+;$/gm,``);default:return e}}function p(e,t){let r=new Map;for(let i of e){let e=n(t,i).replace(/\\/g,`/`),a=e.replace(/\.[^.]+$/,``);m(r,a,e);let o=a.split(`/`),s=o[o.length-1];m(r,s,e)}return r}function m(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function h(e,t,n,r){switch(r){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{if(!t.startsWith(`.`))return[];let r=e.split(`/`).slice(0,-1).join(`/`),i=g(r?`${r}/${t}`:t);for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`,`/index.ts`,`/index.js`]){let t=n.get(i+e)||n.get((i+e).replace(/\.[^.]+$/,``));if(t&&t.length>0)return[t[0]]}let a=n.get(i.replace(/\.[^.]+$/,``));return a?[a[0]]:[]}case`.java`:case`.kt`:case`.scala`:{let e=t.split(`.`),r=e[e.length-1];if(r===`*`)return[];let i=n.get(r);return i?[i[0]]:[]}case`.py`:{if(t.startsWith(`.`)){let r=e.split(`/`).slice(0,-1).join(`/`),i=t.replace(/^\.+/,``).replace(/\./g,`/`),a=r?`${r}/${i}`:i,o=a.split(`/`),s=n.get(a)||n.get(o[o.length-1]);if(s)return[s[0]]}let r=t.replace(/\./g,`/`),i=n.get(r);return i?[i[0]]:[]}case`.go`:{let e=t.split(`/`),r=e[e.length-1],i=n.get(r);return i?[i[0]]:[]}default:return[]}}function g(e){let t=e.split(`/`),n=[];for(let e of t)if(!(e===`.`||e===``)){if(e===`..`){n.pop();continue}n.push(e)}return n.join(`/`)}function _(e){return e.split(`/`).some(e=>e===`test`||e===`tests`||e===`__tests__`||e===`spec`||e===`test_`||e===`__test__`)||/\.(test|spec)\.[^.]+$/.test(e)}function v(r){let s=[],c=(l,u)=>{if(!(u>10))try{for(let d of i(l,{withFileTypes:!0})){if(a.has(d.name)||d.name.startsWith(`.`))continue;let i=t(l,d.name);if(d.isDirectory())c(i,u+1);else{let t=e(d.name).toLowerCase();if(!o.has(t)||d.name.endsWith(`.d.ts`)||/\.(test|spec)\.[^.]+$/.test(d.name)||n(r,l).replace(/\\/g,`/`).split(`/`).some(e=>e===`test`||e===`tests`||e===`__tests__`||e===`spec`))continue;s.push(i)}}}catch{}};return c(r,0),s}export{s as extractRegexCallGraph};
1
+ import{extname as e,join as t,relative as n}from"node:path";import{readFileSync as r,readdirSync as i}from"node:fs";const a=new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,`.venv`,`venv`,`__pycache__`,`target`,`vendor`,`bin`,`obj`]),o=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.java`,`.py`,`.go`,`.cs`,`.kt`,`.scala`,`.rs`,`.rb`,`.php`,`.swift`]);async function s(i){let a=Date.now(),o=v(i);if(o.length===0)return null;let s=o.slice(0,800),u=new Map,m=new Map;for(let t of s){let a=n(i,t).replace(/\\/g,`/`),o=r(t,`utf-8`),s=e(t).toLowerCase(),d=c(o,s);u.set(a,d);let f=l(o,s);m.set(a,f)}let g=p(s,i),x=y(i),S=new Map;for(let[n,a]of u){if(_(n))continue;let o=f(r(t(i,n),`utf-8`),e(n));for(let t of a){if(!t.isRelative){let e=b(t.source,x,g);if(!e)continue;let r=e;if(_(r)||n===r)continue;let i;if(i=t.symbols.length>0?t.symbols.filter(e=>RegExp(`\\b${d(e)}\\b`).test(o)):[`*`],i.length===0)continue;let a=`${n}|${r}`,s=S.get(a);if(s)for(let e of i)s.add(e);else S.set(a,new Set(i));continue}let r=h(n,t.source,g,e(n));if(r.length===0)continue;let i=r[0];if(_(i)||n===i)continue;let a;if(a=t.symbols.length>0?t.symbols.filter(e=>RegExp(`\\b${d(e)}\\b`).test(o)):[`*`],a.length===0)continue;let s=`${n}|${i}`,c=S.get(s);if(c)for(let e of a)c.add(e);else S.set(s,new Set(a))}}let C=[];for(let[e,t]of S){let[n,r]=e.split(`|`);C.push({from:n,to:r,symbols:[...t].sort().slice(0,10)})}return C.sort((e,t)=>t.symbols.length-e.symbols.length),{edges:C,fileCount:s.length,edgeCount:C.length,durationMs:Date.now()-a}}function c(e,t){let n=[];switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{let t=/import\s+(?:type\s+)?\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`,`).map(e=>{let t=e.trim().split(/\s+as\s+/);return(t[t.length-1]||``).trim()}).filter(Boolean);n.push({source:r[2],symbols:e,isRelative:r[2].startsWith(`.`)})}let i=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;for(;(r=i.exec(e))!==null;)r[1]!==`type`&&n.push({source:r[2],symbols:[r[1]],isRelative:r[2].startsWith(`.`)});let a=/(?:const|let|var)\s+\{([^}]+)\}\s*=\s*require\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=a.exec(e))!==null;){let e=r[1].split(`,`).map(e=>e.trim().split(`:`)[0].trim()).filter(Boolean);n.push({source:r[2],symbols:e,isRelative:r[2].startsWith(`.`)})}break}case`.java`:case`.kt`:case`.scala`:{let t=/^import\s+(?:static\s+)?([\w.]+)\s*;/gm,r;for(;(r=t.exec(e))!==null;){let t=r[1].split(`.`),i=t[t.length-1];i===`*`?n.push({source:r[1],symbols:[],isRelative:u(r[1],e)}):n.push({source:r[1],symbols:[i],isRelative:u(r[1],e)})}break}case`.py`:{let t=/^from\s+([\w.]+)\s+import\s+(.+)$/gm,r;for(;(r=t.exec(e))!==null;){let e=r[2].split(`,`).map(e=>{let t=e.trim().split(/\s+as\s+/);return(t[t.length-1]||``).trim()}).filter(e=>e&&e!==`(`);n.push({source:r[1],symbols:e,isRelative:r[1].startsWith(`.`)})}let i=/^import\s+([\w.]+)(?:\s+as\s+(\w+))?\s*$/gm;for(;(r=i.exec(e))!==null;){let e=r[1].split(`.`),t=r[2]||e[e.length-1];n.push({source:r[1],symbols:[t],isRelative:r[1].startsWith(`.`)})}break}case`.go`:{let t=/import\s+(?:(\w+)\s+)?[""]([^""]+)[""]/g,r;for(;(r=t.exec(e))!==null;){let e=r[2].split(`/`),t=r[1]||e[e.length-1];n.push({source:r[2],symbols:[t],isRelative:!r[2].includes(`.`)&&!r[2].startsWith(`github.com`)})}let i=/import\s*\(([\s\S]*?)\)/g;for(;(r=i.exec(e))!==null;){let e=r[1],t=/(?:(\w+)\s+)?[""]([^""]+)[""]/g,i;for(;(i=t.exec(e))!==null;){let e=i[2].split(`/`),t=i[1]||e[e.length-1];n.push({source:i[2],symbols:[t],isRelative:!i[2].includes(`.`)&&!i[2].startsWith(`github.com`)})}}break}case`.cs`:{let t=/^using\s+(?:static\s+)?([\w.]+)\s*;/gm,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`.`);n.push({source:r[1],symbols:[e[e.length-1]],isRelative:!0})}break}case`.rs`:{let t=/^use\s+([\w:]+(?:::\w+)*)/gm,r;for(;(r=t.exec(e))!==null;){let e=r[1].split(`::`),t=e[e.length-1];n.push({source:r[1],symbols:t===`*`?[]:[t],isRelative:r[1].startsWith(`crate`)||r[1].startsWith(`super`)})}break}}return n}function l(e,t){let n=new Set;switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{let t=/export\s+(?:default\s+)?(?:abstract\s+)?(?:async\s+)?(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/g,r;for(;(r=t.exec(e))!==null;)n.add(r[1]);break}case`.java`:case`.kt`:case`.scala`:{let t=/(?:public|protected)\s+(?:static\s+)?(?:abstract\s+)?(?:final\s+)?(?:class|interface|enum|record|@interface)\s+(\w+)/g,r;for(;(r=t.exec(e))!==null;)n.add(r[1]);let i=/(?:public|protected)\s+(?:static\s+)?(?:abstract\s+)?(?:final\s+)?\w+(?:<[^>]+>)?\s+(\w+)\s*\(/g;for(;(r=i.exec(e))!==null;)[`if`,`for`,`while`,`switch`,`catch`,`return`,`class`,`interface`,`enum`,`new`].includes(r[1])||n.add(r[1]);break}case`.py`:{let t=/^(?:def|class)\s+([A-Z_]\w*)/gm,r;for(;(r=t.exec(e))!==null;)r[1].startsWith(`_`)||n.add(r[1]);break}case`.go`:{let t=/^(?:func|type|var|const)\s+(\(?[A-Z]\w*)/gm,r;for(;(r=t.exec(e))!==null;)n.add(r[1].replace(`(`,``));break}}return n}function u(e,t){let n=t.match(/^package\s+([\w.]+)\s*;/m);if(!n)return!1;let r=n[1].split(`.`),i=e.split(`.`);return r.length>=2&&i.length>=2&&r[0]===i[0]&&r[1]===i[1]}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function f(e,t){switch(t){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:return e.replace(/^import\s+.+$/gm,``).replace(/^const\s+.+=\s*require\(.+$/gm,``);case`.java`:case`.kt`:case`.scala`:return e.replace(/^import\s+.+;$/gm,``);case`.py`:return e.replace(/^(?:from\s+.+import\s+.+|import\s+.+)$/gm,``);case`.go`:return e.replace(/^import\s+.+$/gm,``).replace(/import\s*\([\s\S]*?\)/g,``);case`.cs`:return e.replace(/^using\s+.+;$/gm,``);case`.rs`:return e.replace(/^use\s+.+;$/gm,``);default:return e}}function p(e,t){let r=new Map;for(let i of e){let e=n(t,i).replace(/\\/g,`/`),a=e.replace(/\.[^.]+$/,``);m(r,a,e);let o=a.split(`/`),s=o[o.length-1];m(r,s,e)}return r}function m(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function h(e,t,n,r){switch(r){case`.ts`:case`.tsx`:case`.js`:case`.jsx`:{if(!t.startsWith(`.`))return[];let r=e.split(`/`).slice(0,-1).join(`/`),i=g(r?`${r}/${t}`:t);for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`,`/index.ts`,`/index.js`]){let t=n.get(i+e)||n.get((i+e).replace(/\.[^.]+$/,``));if(t&&t.length>0)return[t[0]]}let a=n.get(i.replace(/\.[^.]+$/,``));return a?[a[0]]:[]}case`.java`:case`.kt`:case`.scala`:{let e=t.split(`.`),r=e[e.length-1];if(r===`*`)return[];let i=n.get(r);return i?[i[0]]:[]}case`.py`:{if(t.startsWith(`.`)){let r=e.split(`/`).slice(0,-1).join(`/`),i=t.replace(/^\.+/,``).replace(/\./g,`/`),a=r?`${r}/${i}`:i,o=a.split(`/`),s=n.get(a)||n.get(o[o.length-1]);if(s)return[s[0]]}let r=t.replace(/\./g,`/`),i=n.get(r);return i?[i[0]]:[]}case`.go`:{let e=t.split(`/`),r=e[e.length-1],i=n.get(r);return i?[i[0]]:[]}default:return[]}}function g(e){let t=e.split(`/`),n=[];for(let e of t)if(!(e===`.`||e===``)){if(e===`..`){n.pop();continue}n.push(e)}return n.join(`/`)}function _(e){return e.split(`/`).some(e=>e===`test`||e===`tests`||e===`__tests__`||e===`spec`||e===`test_`||e===`__test__`)||/\.(test|spec)\.[^.]+$/.test(e)}function v(r){let s=[],c=(l,u)=>{if(!(u>10))try{for(let d of i(l,{withFileTypes:!0})){if(a.has(d.name)||d.name.startsWith(`.`))continue;let i=t(l,d.name);if(d.isDirectory())c(i,u+1);else{let t=e(d.name).toLowerCase();if(!o.has(t)||d.name.endsWith(`.d.ts`)||/\.(test|spec)\.[^.]+$/.test(d.name)||n(r,l).replace(/\\/g,`/`).split(`/`).some(e=>e===`test`||e===`tests`||e===`__tests__`||e===`spec`))continue;s.push(i)}}}catch{}};return c(r,0),s}function y(e){let n=new Map;for(let a of[`packages`,`apps`,`libs`,`services`,`functions`]){let o=t(e,a),s;try{s=i(o,{withFileTypes:!0})}catch{continue}for(let e of s){if(!e.isDirectory())continue;let i=t(o,e.name,`package.json`);try{let o=JSON.parse(r(i,`utf-8`));if(o.name){let r=o.exports?.[`.`]?.import??o.exports?.[`.`]?.default??o.main??`src/index.ts`,i=t(a,e.name,r).replace(/\\/g,`/`);n.set(o.name,i)}}catch{}}}return n}function b(e,t,n){if(t.has(e))return t.get(e)??null;let r=e.startsWith(`@`)?e.split(`/`):[];if(r.length>=2){let e=`${r[0]}/${r[1]}`,i=t.get(e);if(i){if(r.length===2)return i;let e=i.replace(/\/src\/index\.\w+$/,``).replace(/\/dist\/.*$/,``),t=r.slice(2).join(`/`),a=[`${e}/src/${t}`,`${e}/${t}`];for(let e of a){let t=e.replace(/\.\w+$/,``),r=n.get(t);if(r?.[0])return r[0]}return i}}return null}export{s as extractRegexCallGraph};
@@ -33,6 +33,8 @@ declare const SKILL_NAMES: readonly ["knowledge-base", "brainstorming", "session
33
33
  * - enableChatTools: Enables integrated-browser tools (openBrowserPage,
34
34
  * readPage, screenshotPage, etc.) so agents can open and interact with
35
35
  * web pages inside VS Code's built-in browser.
36
+ * - mcpApps: Enables MCP tool apps so KB tools can be consumed by Copilot
37
+ * Chat without requiring manual MCP server configuration.
36
38
  */
37
39
  declare const VSCODE_SETTINGS: Record<string, unknown>;
38
40
  //#endregion
@@ -1 +1 @@
1
- const e=`knowledge-base`,t={type:`stdio`,command:`npx`,args:[`-y`,`@vpxa/kb`,`serve`]},n=[`knowledge-base`,`brainstorming`,`session-handoff`,`requirements-clarity`,`lesson-learned`,`c4-architecture`,`adr-skill`,`present`],r={"chat.agentFilesLocations":{"~/.claude/agents":!1},"github.copilot.chat.copilotMemory.enabled":!0,"chat.customAgentInSubagent.enabled":!0,"chat.useNestedAgentsMdFiles":!0,"chat.useAgentSkills":!0,"github.copilot.chat.switchAgent.enabled":!0,"workbench.browser.enableChatTools":!0};export{t as MCP_SERVER_ENTRY,e as SERVER_NAME,n as SKILL_NAMES,r as VSCODE_SETTINGS};
1
+ const e=`knowledge-base`,t={type:`stdio`,command:`npx`,args:[`-y`,`@vpxa/kb`,`serve`]},n=[`knowledge-base`,`brainstorming`,`session-handoff`,`requirements-clarity`,`lesson-learned`,`c4-architecture`,`adr-skill`,`present`],r={"chat.agentFilesLocations":{"~/.claude/agents":!1},"github.copilot.chat.copilotMemory.enabled":!0,"chat.customAgentInSubagent.enabled":!0,"chat.useNestedAgentsMdFiles":!0,"chat.useAgentSkills":!0,"github.copilot.chat.switchAgent.enabled":!0,"workbench.browser.enableChatTools":!0,"chat.mcp.apps.enabled":!0};export{t as MCP_SERVER_ENTRY,e as SERVER_NAME,n as SKILL_NAMES,r as VSCODE_SETTINGS};