@sdsrs/code-graph
Advanced tools
@@ -7,3 +7,3 @@ { | ||
| }, | ||
| "version": "0.29.0", | ||
| "version": "0.30.0", | ||
| "keywords": [ | ||
@@ -10,0 +10,0 @@ "code-graph", |
@@ -94,37 +94,57 @@ #!/usr/bin/env node | ||
| // Schema | ||
| if (hc.issue && hc.issue.includes('schema')) { | ||
| results.push({ name: 'Schema', status: 'warn', detail: hc.issue, fixId: 'schema-mismatch' }); | ||
| // No-index short-circuit — binary deliberately returns a structured | ||
| // JSON with reason='no_index' instead of bailing, so we can route to | ||
| // the index-empty fix without grepping stderr. Falls through to the | ||
| // rest of runDiagnostics so Auto-update / Hooks still report. | ||
| if (hc.reason === 'no_index') { | ||
| results.push({ name: 'Schema', status: 'ok', detail: 'binary ok (no index yet)' }); | ||
| results.push({ name: 'Index', status: 'warn', detail: 'missing — not indexed yet', fixId: 'index-empty' }); | ||
| results.push({ name: 'Embeddings', status: 'skip', detail: 'no index' }); | ||
| } else { | ||
| results.push({ name: 'Schema', status: 'ok', detail: `v${hc.schema_version}` }); | ||
| } | ||
| // Schema | ||
| if (hc.issue && hc.issue.includes('schema')) { | ||
| results.push({ name: 'Schema', status: 'warn', detail: hc.issue, fixId: 'schema-mismatch' }); | ||
| } else { | ||
| results.push({ name: 'Schema', status: 'ok', detail: `v${hc.schema_version}` }); | ||
| } | ||
| // Index | ||
| if (hc.nodes === 0) { | ||
| results.push({ name: 'Index', status: 'warn', detail: 'empty', fixId: 'index-empty' }); | ||
| } else { | ||
| const age = hc.index_age ? ` (${hc.index_age})` : ''; | ||
| results.push({ | ||
| name: 'Index', | ||
| status: 'ok', | ||
| detail: `${hc.nodes} nodes, ${hc.edges} edges, ${hc.files} files${age}`, | ||
| }); | ||
| // Index | ||
| if (hc.nodes === 0) { | ||
| results.push({ name: 'Index', status: 'warn', detail: 'empty', fixId: 'index-empty' }); | ||
| } else { | ||
| const age = hc.index_age ? ` (${hc.index_age})` : ''; | ||
| results.push({ | ||
| name: 'Index', | ||
| status: 'ok', | ||
| detail: `${hc.nodes} nodes, ${hc.edges} edges, ${hc.files} files${age}`, | ||
| }); | ||
| } | ||
| // Embeddings | ||
| const ep = hc.embedding_progress || '0/0'; | ||
| const [done, total] = ep.split('/').map(Number); | ||
| if (total > 0 && done < total) { | ||
| const pct = Math.round((done / total) * 100); | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: `${pct}% (${done}/${total})` }); | ||
| } else if (total === 0) { | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: 'no embeddable nodes' }); | ||
| } else { | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: `100% (${done}/${total})` }); | ||
| } | ||
| } | ||
| // Embeddings | ||
| const ep = hc.embedding_progress || '0/0'; | ||
| const [done, total] = ep.split('/').map(Number); | ||
| if (total > 0 && done < total) { | ||
| const pct = Math.round((done / total) * 100); | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: `${pct}% (${done}/${total})` }); | ||
| } else if (total === 0) { | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: 'no embeddable nodes' }); | ||
| } catch (e) { | ||
| const rawStderr = e.stderr ? e.stderr.toString() : ''; | ||
| const msg = rawStderr ? rawStderr.trim().slice(0, 100) : e.message.slice(0, 100); | ||
| // "No index found" is a missing-index situation, not a broken binary — | ||
| // the index-empty fix path knows how to create one. Without this branch | ||
| // the fixId routes to nothing and the report shows "0/1 addressed". | ||
| if (rawStderr.includes('No index found')) { | ||
| results.push({ name: 'Schema', status: 'ok', detail: 'binary ok (no index yet)' }); | ||
| results.push({ name: 'Index', status: 'warn', detail: 'missing — not indexed yet', fixId: 'index-empty' }); | ||
| results.push({ name: 'Embeddings', status: 'skip', detail: 'no index' }); | ||
| } else { | ||
| results.push({ name: 'Embeddings', status: 'ok', detail: `100% (${done}/${total})` }); | ||
| results.push({ name: 'Schema', status: 'error', detail: `health-check failed: ${msg}`, fixId: 'binary-broken' }); | ||
| results.push({ name: 'Index', status: 'skip', detail: 'health-check failed' }); | ||
| results.push({ name: 'Embeddings', status: 'skip', detail: 'health-check failed' }); | ||
| } | ||
| } catch (e) { | ||
| const msg = e.stderr ? e.stderr.toString().trim().slice(0, 100) : e.message.slice(0, 100); | ||
| results.push({ name: 'Schema', status: 'error', detail: `health-check failed: ${msg}`, fixId: 'binary-broken' }); | ||
| results.push({ name: 'Index', status: 'skip', detail: 'health-check failed' }); | ||
| results.push({ name: 'Embeddings', status: 'skip', detail: 'health-check failed' }); | ||
| } | ||
@@ -131,0 +151,0 @@ } else { |
+6
-6
| { | ||
| "name": "@sdsrs/code-graph", | ||
| "version": "0.29.0", | ||
| "version": "0.30.0", | ||
| "description": "MCP server that indexes codebases into an AST knowledge graph with semantic search, call graph traversal, and HTTP route tracing", | ||
@@ -38,8 +38,8 @@ "license": "MIT", | ||
| "optionalDependencies": { | ||
| "@sdsrs/code-graph-linux-x64": "0.29.0", | ||
| "@sdsrs/code-graph-linux-arm64": "0.29.0", | ||
| "@sdsrs/code-graph-darwin-x64": "0.29.0", | ||
| "@sdsrs/code-graph-darwin-arm64": "0.29.0", | ||
| "@sdsrs/code-graph-win32-x64": "0.29.0" | ||
| "@sdsrs/code-graph-linux-x64": "0.30.0", | ||
| "@sdsrs/code-graph-linux-arm64": "0.30.0", | ||
| "@sdsrs/code-graph-darwin-x64": "0.30.0", | ||
| "@sdsrs/code-graph-darwin-arm64": "0.30.0", | ||
| "@sdsrs/code-graph-win32-x64": "0.30.0" | ||
| } | ||
| } |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
335698
0.42%6773
0.3%