61 Commits

Author SHA1 Message Date
Giancarlo Erra 5c84a9ad66 chore: release v1.4.0 v1.4.0 2026-04-12 19:30:53 +01:00
Giancarlo Erra 9eea98079e Merge pull request #23 from giancarloerra:feat/multi-collection-search
feat: cross-project search and branch-aware indexing
2026-04-12 19:15:08 +01:00
Giancarlo Erra f745d59ddd fix: address remaining CodeRabbit production code issues
- Scope dedupe key to label::relativePath in mergeMultiCollectionResults
  so same file in different projects is not collapsed
- Compute embedding once in searchMultipleCollections via internal
  searchChunksWithVector helper (avoids N redundant API calls)
- Compare base project hashes (not branch-suffixed names) when skipping
  duplicate linked projects in resolveLinkedCollections
- Use path.resolve() for platform-neutral assertion in query-tools tests
- Update multi-collection-search tests for new cross-project dedup semantics
2026-04-11 17:53:59 +01:00
Giancarlo Erra f09f417c6e fix: address CodeRabbit review feedback on tests
- Refactor git temp repos into initTempRepo() helper using git config
  instead of env vars (resolves Critical finding)
- Restore SOCRATICODE_LINKED_PROJECTS and SOCRATICODE_PROJECT_ID to
  original values in resolveLinkedCollections afterEach
- Fix TypeScript 'never' type errors in query-tools mocks by adding
  explicit SearchResult[] return types
2026-04-11 17:53:59 +01:00
Giancarlo Erra ad2e3b9ea1 fix: provide git identity for temp repo commits in CI
CI runners have no git user.name/email configured, causing
'git commit --allow-empty' to fail with 'Author identity unknown'.
Pass GIT_AUTHOR_NAME/EMAIL and GIT_COMMITTER_NAME/EMAIL env vars.
2026-04-11 17:53:59 +01:00
Giancarlo Erra ffa8e95bdf fix: use self-contained temp git repos in branch-aware tests
CI checks out in detached HEAD state, causing detectGitBranch(process.cwd())
to return null. Replace process.cwd() with temporary git repos that have a
known branch and initial commit, making tests deterministic everywhere.
2026-04-11 17:53:59 +01:00
Giancarlo Erra 24faa1075b docs: add cross-project and branch-aware highlights to intro and Why SocratiCode 2026-04-11 17:53:59 +01:00
Giancarlo Erra bf93e4a992 test: add includeLinked and searchMultipleCollections tests
- query-tools.test.ts: 6 new tests for includeLinked parameter:
  - omitted/false → calls searchChunks (not searchMultipleCollections)
  - true → calls searchMultipleCollections via resolveLinkedCollections
  - passes collections and args correctly
  - project label appears in output
  - no project tag when field absent

- multi-collection-search.test.ts: 1 new test for searchMultipleCollections
  empty-input short-circuit (internal searchChunks calls cannot be mocked
  from the same module — integration covered by query-tools tests)
2026-04-11 17:53:59 +01:00
Giancarlo Erra fc3c2988fa fix: linked projects use base hash without branch suffix
resolveLinkedCollections() was calling projectIdFromPath() for linked
projects, which with SOCRATICODE_BRANCH_AWARE=true appended the linked
project's git branch to its ID. Linked projects indexed without
branch-aware mode don't have __branch collections, so lookups failed.

Extract coreProjectId() helper (hash-only, no branch suffix) and use
it for linked projects. Also fix dedup to compare collection names
instead of raw IDs to handle the branch suffix mismatch.

Adds unit test verifying linked collection names are branch-agnostic.
2026-04-11 17:53:59 +01:00
Giancarlo Erra 096f59da13 fix: update path handling and type imports in indexer and query tools 2026-04-11 17:53:59 +01:00
Giancarlo Erra 76e3ff5f59 docs: add cross-project search and branch-aware indexing documentation
- README: new Features entries, full sections with config examples
- README: new env vars SOCRATICODE_BRANCH_AWARE, SOCRATICODE_LINKED_PROJECTS
- README: updated codebase_search tool description for includeLinked
- DEVELOPER.md: updated config.ts description, branch-aware and linked projects sections
2026-04-11 17:53:59 +01:00
Giancarlo Erra 3a4139d714 feat: branch-aware collection naming via SOCRATICODE_BRANCH_AWARE
- detectGitBranch() detects current git branch via git rev-parse
- sanitizeBranchName() converts branch names to Qdrant-safe suffixes
- When SOCRATICODE_BRANCH_AWARE=true, projectIdFromPath appends __branch
  to create separate indexes per branch
- Explicit SOCRATICODE_PROJECT_ID takes precedence (no branch suffix)
- 14 unit tests for sanitization, detection, and integration

Relates to #19
2026-04-11 17:53:59 +01:00
Giancarlo Erra 61e868cf9e feat: linked projects support via .socraticode.json and SOCRATICODE_LINKED_PROJECTS
- loadLinkedProjects() reads .socraticode.json config and env var
- resolveLinkedCollections() maps linked projects to collection names
- codebase_search gains includeLinked parameter for cross-project queries
- Results tagged with [project-label] when searching across projects
- 10 unit tests for config loading and collection resolution

Relates to #20
2026-04-11 17:53:59 +01:00
Giancarlo Erra ad8db7f0db feat: multi-collection search with client-side RRF fusion and deduplication
Add searchMultipleCollections() and mergeMultiCollectionResults() to qdrant.ts.
Queries multiple Qdrant collections in parallel, merges results using Reciprocal
Rank Fusion (k=60), and deduplicates by relativePath (first collection wins).

Add optional 'project' field to SearchResult type for source attribution.

This is the shared foundation for linked projects (#20) and branch-aware
indexing (#19).

Refs: #19, #20
2026-04-11 17:53:59 +01:00
Giancarlo Erra 2c2de5ab09 Merge pull request #22 from sb-giithub:fix/jvm-multi-module-resolution
fix: resolve JVM imports in multi-module Maven/Gradle projects (0 edges bug)
2026-04-11 17:53:04 +01:00
jason.ma 5a734eb301 fix: resolve JVM imports in multi-module Maven/Gradle projects
Single-module resolution (src/main/java/…) already worked.
Multi-module layouts like:

  module-a/sub/src/main/java/com/example/Foo.java

were silently unresolved because the three fixed src-dir prefixes
never matched. The dependency graph therefore always produced 0
edges for any Java/Kotlin/Scala project that follows the standard
Maven/Gradle multi-module layout.

Fix: introduce `buildJvmSuffixMap()` which scans `fileSet` once
(O(n)) and registers every JVM source file by its class-path key
(i.e. everything after src/main/<lang>/). `resolveImport` accepts
the map as an optional last argument and falls back to it when the
existing prefix-based approach yields no result.

- `buildJvmSuffixMap` exported for reuse / testing.
- Map is built once per `buildCodeGraph` call, only when the
  project contains at least one JVM file — zero cost for other
  language projects.
- Lookup is O(1) per import, replacing a worst-case O(n) linear
  scan on every miss.
- Works on both Windows (backslash) and POSIX (forward-slash)
  because the map key is built with `path.sep`.
- 7 new unit tests covering: map construction, test-source
  exclusion, multi-module Java resolution, Kotlin resolution,
  unresolvable class, stdlib guard.

Fixes: enterprise Java/Spring Boot codebases (30+ Maven modules)
reporting 0 edges in codebase_graph_stats.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:23:03 +08:00
Giancarlo Erra 0896164442 docs: add OpenCode setup instructions to README
Closes #18
2026-04-05 11:30:04 +01:00
Giancarlo Erra 15ab5c8956 chore: release v1.3.2 v1.3.2 2026-03-26 18:06:54 +00:00
Giancarlo Erra 72e4a5f998 fix: change SessionStart hook type from prompt to command
Prompt-type hooks require ToolUseContext which doesn't exist at session
startup, causing an error on every Claude Code session start.

Closes #16
2026-03-26 17:47:04 +00:00
Giancarlo Erra 3502f0e653 chore: release v1.3.1 v1.3.1 2026-03-24 17:38:20 +00:00
Giancarlo Erra 282b99dc93 Merge pull request #14 from mantvydas:fix/prepublish-build
fix: add prepublishOnly to keep dist/ in sync with source
2026-03-24 17:36:01 +00:00
Mantvydas 2f5b410a04 fix: add prepublishOnly script to ensure dist/ is rebuilt before publish
The published npm package has stale dist/ files that don't include
the SOCRATICODE_PROJECT_ID environment variable support added in source.
This causes the env var to be silently ignored when installed via npm.

Adding a prepublishOnly script ensures tsc runs before every publish,
keeping dist/ in sync with source.
2026-03-24 14:14:04 +02:00
Giancarlo Erra fbc5d54d27 chore: release v1.3.0 v1.3.0 2026-03-19 11:59:43 +00:00
Giancarlo Erra 4590366578 Merge pull request #13 from cstuncsik:feat/alias-resolution-css-imports
feat: add CSS @import tracking and path alias resolution to dependency graph

Thanks cstuncsik, it was in my notes as a known limitation of the previous attempt, thanks for covering this up, very clean and comprehensive, much appreciated!
2026-03-19 11:53:03 +00:00
Csaba Tuncsik f80eec476a fix: add stylus to CSS resolution cases and getAstGrepLang mapping 2026-03-18 20:49:29 +01:00
Csaba Tuncsik f4c5518453 docs: update language support and graph docs for CSS @import and path aliases
- Move Svelte/Vue from "Indexing Only" to "Full Support" in README
- Move SASS/LESS to "Code Graph via Regex" in README
- Add graph-aliases.ts to DEVELOPER.md service file listing
- Update DEVELOPER.md data flow with CSS @import, path alias, and SCSS
  partial resolution steps
2026-03-18 20:18:45 +01:00
Csaba Tuncsik c7e160cb5c feat: add CSS @import tracking and path alias resolution to dependency graph
Add CSS @import extraction from Svelte/Vue <style> blocks and standalone
CSS/SCSS/SASS/LESS files. Add path alias resolution from tsconfig.json /
jsconfig.json compilerOptions.paths with extends chain support.
2026-03-18 20:18:44 +01:00
Giancarlo Erra 4471f874ef chore: release v1.2.0 v1.2.0 2026-03-18 13:56:28 +00:00
Giancarlo Erra 7b72cf0363 docs: add Svelte/Vue to code graph language list 2026-03-18 13:48:26 +00:00
Giancarlo Erra be5184338e Merge pull request #9 from pineapplestrikesback/feat/svelte-import-parsing
feat: add Svelte and Vue import parsing to dependency graph

Thanks pineapplestrikesback, nice idea and nicely implemented with zero-dependencies.
2026-03-18 13:45:28 +00:00
Giancarlo Erra 0c45ed9906 Merge pull request #10 from midweste/midweste-dotfiles
feat: add env support for controlling indexing of dotfiles
2026-03-18 12:32:13 +00:00
Giancarlo Erra 2e0cdbbd08 Merge pull request #11 from midweste/midweste-qdrantport
feat: auto-infer port from QDRANT_URL for reverse proxy support
2026-03-18 12:23:50 +00:00
Giancarlo Erra 4d255f50ee fix: only call ensureOllamaReady when using Ollama provider (#8)
ensureOllamaReady() was called unconditionally on every search and context
operation, causing failures for OpenAI and Google embedding users. Now only
called when embeddingProvider is ollama; otherwise the configured provider
is initialized via getEmbeddingProvider().

Fixes #7

Co-authored-by: pineapplestrikesback <pineapplestrikesback@users.noreply.github.com>
2026-03-17 17:46:51 +00:00
midwestE 507d823336 feat: auto-infer port from QDRANT_URL for reverse proxy support 2026-03-17 07:20:56 -05:00
midwestE 7265247d83 feat: add env support for controlling indexing of dotfiles 2026-03-17 07:11:25 -05:00
Giancarlo Erra 4cd113b1e9 docs: add npx cache update instructions for MCP-only install 2026-03-16 23:09:12 +00:00
Giancarlo Erra 640e054eac chore: release v1.1.3 v1.1.3 2026-03-16 22:57:15 +00:00
Giancarlo Erra 51bec9998e Merge pull request #5 from cstuncsik/fix/relative-path-keys
fix: use relative paths for index keys to support shared worktree indexes
2026-03-16 20:32:32 +00:00
Giancarlo Erra b26038a8b1 docs: add auto-update instructions for Claude Code plugin 2026-03-16 20:32:06 +00:00
pineapplestrikesback 4c2bd0cc53 feat: add Svelte and Vue import parsing to dependency graph
Svelte and Vue files were included in the graph as leaf nodes (targets
of import edges) but their own imports were never extracted because
no ast-grep grammar exists for these languages.

This adds support by parsing .svelte/.vue files as HTML (built-in
grammar), extracting <script> block content, and re-parsing it as
TypeScript to extract imports using the existing JS/TS logic.

Changes:
- code-graph.ts: register .svelte and .vue in getAstGrepLang()
- graph-imports.ts: add Svelte/Vue script extraction handler; refactor
  JS/TS import extraction into shared extractJsTsImportsFromNode()
  helper to avoid duplication
- graph-resolution.ts: add "svelte" and "vue" cases to resolveImport(),
  with .svelte/.vue as first-priority extension resolution
- graph-imports.test.ts: add tests for Svelte (static, dynamic, module,
  no-script, JS-only) and Vue import extraction

Zero new dependencies — uses the built-in Lang.Html and Lang.TypeScript
grammars from @ast-grep/napi.

Known limitation: path aliases ($lib/, @/) are not resolved and will be
treated as external packages (same as current JS/TS behavior).
2026-03-16 16:23:18 +01:00
Csaba Tuncsik 505fbd722b fix: use relative paths for index keys to support shared worktree indexes
When SOCRATICODE_PROJECT_ID is set to share a Qdrant collection across
git worktrees, the indexer still used absolute paths as keys in the file
hash map, chunk IDs, and for deleting file chunks. This caused every
worktree to see all files as "new" and trigger a full re-index, defeating
the purpose of the shared project ID feature.

Switch all internal keying from absolute paths to relative paths:
- chunkId() now hashes on relativePath for stable IDs across worktrees
- File hash map (change detection) keyed by relativePath
- deleteFileChunks() filters on relativePath Qdrant field
- Deleted file detection uses relative path sets

Absolute paths are now only used for actual file I/O (stat, readFile).
2026-03-16 08:39:22 +01:00
Giancarlo Erra 06f5dee474 chore: release v1.1.2 v1.1.2 2026-03-16 01:00:34 +00:00
Giancarlo Erra 17eedd68e9 Merge pull request #4 from giancarloerra:fix/plugin-hooks-and-install-docs
fix: correct hooks.json format, remove explicit hooks path, and improve install docs
2026-03-16 00:58:44 +00:00
Giancarlo Erra db69a2d9b4 fix: correct hooks.json format, remove explicit hooks path, and improve install docs 2026-03-16 00:58:01 +00:00
Giancarlo Erra b1bfe2c480 chore: release v1.1.1 v1.1.1 2026-03-16 00:42:06 +00:00
Giancarlo Erra 55a7a2d859 Merge pull request #3 from giancarloerra:fix/plugin-install-commands
fix: correct Claude Code plugin install commands and add marketplace.json
2026-03-16 00:41:02 +00:00
Giancarlo Erra 157b353bc4 fix: correct Claude Code plugin install commands and add marketplace.json 2026-03-16 00:39:44 +00:00
Giancarlo Erra 2b121683c7 chore: release v1.1.0 v1.1.0 2026-03-15 23:59:17 +00:00
Giancarlo Erra 6ba856b503 Merge pull request #2 from giancarloerra:feat/claude-plugin
feat: add Claude Code plugin with skills, agent, and MCP bundling
2026-03-15 23:56:43 +00:00
Giancarlo Erra 31e5d748bc feat: add Claude Code plugin with skills, agent, and MCP bundling
- Add .claude-plugin/plugin.json with MCP server reference and hooks
- Add codebase-exploration skill with search-before-reading workflow
- Add codebase-management skill with indexing and troubleshooting guides
- Add codebase-explorer delegatable subagent for deep analysis
- Add SessionStart hook for duplicate MCP detection
- Add .mcp.json for plugin-bundled MCP server config
- Update package.json files array to include plugin assets in npm package
- Add release-it after:bump hook to sync plugin.json version
- Update README with plugin install badge, instructions, and guidance
2026-03-15 23:47:46 +00:00