Files
socraticode/package.json
Giancarlo Erra 50d8853ea6 feat(visualize): add interactive HTML graph explorer; British-English doc sweep
Interactive Viewer (primary)
────────────────────────────
codebase_graph_visualize now accepts mode="mermaid" (default, existing
behaviour — text Mermaid diagram) or mode="interactive". Interactive
mode generates a self-contained HTML page and opens it in the user's
default browser via the `open` npm package (cross-platform: macOS,
Linux, Windows). Cytoscape.js 3.30.2 + Dagre 0.8.5 + cytoscape-dagre
2.5.0 are vendored under src/assets/ — no CDN, works offline.

Features:
- File view — every source file as a node, imports as edges, language
  colour-coded, circular deps highlighted in red.
- Symbol view toggle — functions/classes/methods as nodes with call
  edges (confidence-styled). Embedded when the symbol graph fits under
  20k symbols / 60k call edges; above that threshold the file view
  remains usable and a banner directs users to codebase_impact /
  codebase_symbols for symbol-level queries.
- Sidebar on node click — imports, dependents, per-file symbol list
  (first 30 + link to codebase_symbols), action buttons for blast
  radius and call flow.
- Right-click any node → blast radius overlay (reverse-transitive
  closure). Call-flow button on the sidebar for forward traversal.
- Live search across files and symbols, six Cytoscape layouts
  (Dagre / force / concentric / breadth-first / grid / circle),
  PNG export (filename sanitised for cross-platform safety).
- `open: false` parameter skips auto-launch and just returns the file
  path — useful in headless environments.

Viewer is XSS-safe by construction: all DOM built with createElement
+ textContent (no innerHTML anywhere); embedded JSON escapes every
"<" as \u003c so a stray </script> in a file path or symbol name
cannot break out of the script-type="application/json" container.

New files:
- src/assets/{cytoscape.min.js,dagre.min.js,cytoscape-dagre.js,
  viewer-template.html,viewer-styles.css,viewer-app.js}
- scripts/copy-assets.mjs — postbuild copier (tsc does not handle
  non-TS files); wired into npm run build and prepublishOnly
- src/services/graph-visualize-html.ts — HTML builder with scale-cap
  logic (MAX_SYMBOLS / MAX_EDGES / MAX_SYMS_PER_FILE) and parallel
  per-file Qdrant payload loading
- src/services/graph-visualize-browser.ts — temp-file write +
  cross-platform open wrapper
- tests/unit/graph-visualize-html.test.ts — 5 tests (self-contained,
  escape-safety, symbolMode omitted/capped, cycle marking)
- tests/unit/graph-visualize-browser.test.ts — 4 tests (deterministic
  path, overwrite, success + failure paths)

New runtime dependency: open@^10.2.0 (Sindre Sorhus, zero transitive
deps, cross-platform).

British-English doc sweep (secondary)
─────────────────────────────────────
Switched all project docs to British English spelling:
  behavior → behaviour                organized → organised
  color-coded → colour-coded          initialization → initialisation
  visualization → visualisation       customization → customisation
  recognized → recognised             optimized → optimised
  acknowledgment → acknowledgement    finalize → finalise
  analyzing → analysing               apologizing → apologising
  sexualized → sexualised

Affected files: README, DEVELOPER, AGENTS, CLAUDE, GEMINI, SECURITY,
CONTRIBUTING, CODE_OF_CONDUCT, agents/codebase-explorer.md,
skills/codebase-exploration/{SKILL.md,references/tool-reference.md},
skills/codebase-management/references/tool-reference.md.

Also surfaced Impact Analysis in the top-level README paragraph.

Docs
────
- README: "Interactive graph explorer" subsection under Impact Analysis,
  tool-table row updated.
- DEVELOPER.md: architecture section under codebase_graph_visualize
  covering asset layout, data flow, cap logic, XSS-safety invariants.
- AGENTS.md / CLAUDE.md / GEMINI.md: new "User asks for a visual /
  interactive / shareable graph" row in the tool-routing table.
- skills/codebase-exploration/: SKILL.md bullet + tool-reference.md
  full mode description.
- CHANGELOG.md: "Interactive Graph Explorer" section under Unreleased.

Quality gates (all green)
─────────────────────────
- Biome lint: clean
- TypeScript (tsc): clean
- Unit tests: 685/685
- Integration tests: 154/154 (real Qdrant + Ollama)
- CodeRabbit: No findings (1 fix applied — filename sanitisation)
- Snyk code test: 0 issues

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:04:41 +01:00

105 lines
2.8 KiB
JSON

{
"name": "socraticode",
"mcpName": "io.github.giancarloerra/socraticode",
"version": "1.6.1",
"description": "SocratiCode — MCP server for local codebase indexing, semantic search, and code dependency graphs. All private, all local via Docker.",
"type": "module",
"main": "dist/index.js",
"bin": {
"socraticode": "dist/index.js"
},
"scripts": {
"build": "tsc && node scripts/copy-assets.mjs",
"start": "node dist/index.js",
"dev": "tsx src/index.ts",
"lint": "biome check src/ tests/",
"lint:fix": "biome check --write src/ tests/",
"release": "release-it",
"prepublishOnly": "tsc && node scripts/copy-assets.mjs",
"release:dry": "release-it --dry-run",
"test": "vitest run",
"test:unit": "vitest run tests/unit/",
"test:integration": "vitest run tests/integration/",
"test:e2e": "vitest run tests/e2e/",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage"
},
"keywords": [
"mcp",
"socraticode",
"codebase",
"indexer",
"vector-database",
"qdrant",
"ollama",
"embeddings",
"code-graph"
],
"author": {
"name": "Giancarlo Erra",
"email": "giancarlo@altaire.com",
"url": "https://altaire.com"
},
"repository": {
"type": "git",
"url": "https://github.com/giancarloerra/socraticode.git"
},
"bugs": {
"url": "https://github.com/giancarloerra/socraticode/issues"
},
"homepage": "https://socraticode.cloud",
"license": "AGPL-3.0-only",
"files": [
"dist",
".claude-plugin",
"skills",
"agents",
"hooks",
".mcp.json",
"LICENSE",
"LICENSE-COMMERCIAL",
"README.md",
"THIRD-PARTY-LICENSES",
"socraticode_logo_thumbnail.png"
],
"dependencies": {
"@ast-grep/lang-bash": "^0.0.7",
"@ast-grep/lang-c": "^0.0.5",
"@ast-grep/lang-cpp": "^0.0.5",
"@ast-grep/lang-csharp": "^0.0.5",
"@ast-grep/lang-go": "^0.0.5",
"@ast-grep/lang-java": "^0.0.6",
"@ast-grep/lang-kotlin": "^0.0.6",
"@ast-grep/lang-php": "^0.0.6",
"@ast-grep/lang-python": "^0.0.5",
"@ast-grep/lang-ruby": "^0.0.6",
"@ast-grep/lang-rust": "^0.0.6",
"@ast-grep/lang-scala": "^0.0.6",
"@ast-grep/lang-swift": "^0.0.7",
"@ast-grep/napi": "^0.40.5",
"@google/generative-ai": "^0.24.1",
"@modelcontextprotocol/sdk": "^1.26.0",
"@parcel/watcher": "^2.5.6",
"@qdrant/js-client-rest": "^1.17.0",
"glob": "^11.0.1",
"ignore": "^7.0.3",
"ollama": "^0.5.14",
"open": "^10.2.0",
"openai": "^6.22.0",
"proper-lockfile": "^4.1.2",
"zod": "^3.24.2"
},
"devDependencies": {
"@biomejs/biome": "^2.4.4",
"@types/node": "^22.13.4",
"@types/proper-lockfile": "^4.1.4",
"@vitest/coverage-v8": "^4.0.18",
"tsx": "^4.19.4",
"typescript": "^5.7.3",
"vitest": "^4.0.18"
},
"engines": {
"node": ">=18.0.0"
}
}