@fodx/codelens 1.0.0

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 (98) hide show
  1. package/README.md +212 -0
  2. package/adapters/pi/codelens.extension.ts +280 -0
  3. package/adapters/pi/extension.json +10 -0
  4. package/build/src/cli.js +265 -0
  5. package/build/src/cli.js.map +1 -0
  6. package/build/src/context/schema.sql +23 -0
  7. package/build/src/context/store.js +91 -0
  8. package/build/src/context/store.js.map +1 -0
  9. package/build/src/db/db.js +65 -0
  10. package/build/src/db/db.js.map +1 -0
  11. package/build/src/db/migrations.js +88 -0
  12. package/build/src/db/migrations.js.map +1 -0
  13. package/build/src/db/schema.js +11 -0
  14. package/build/src/db/schema.js.map +1 -0
  15. package/build/src/db/schema.sql +111 -0
  16. package/build/src/git/scope.js +68 -0
  17. package/build/src/git/scope.js.map +1 -0
  18. package/build/src/graph/edges.js +76 -0
  19. package/build/src/graph/edges.js.map +1 -0
  20. package/build/src/graph/grammars.js +57 -0
  21. package/build/src/graph/grammars.js.map +1 -0
  22. package/build/src/graph/query.js +52 -0
  23. package/build/src/graph/query.js.map +1 -0
  24. package/build/src/graph/resolve.js +68 -0
  25. package/build/src/graph/resolve.js.map +1 -0
  26. package/build/src/graph/symbols.js +84 -0
  27. package/build/src/graph/symbols.js.map +1 -0
  28. package/build/src/graph/tests.js +73 -0
  29. package/build/src/graph/tests.js.map +1 -0
  30. package/build/src/index/autoprune.js +29 -0
  31. package/build/src/index/autoprune.js.map +1 -0
  32. package/build/src/index/deny.js +40 -0
  33. package/build/src/index/deny.js.map +1 -0
  34. package/build/src/index/freshness.js +60 -0
  35. package/build/src/index/freshness.js.map +1 -0
  36. package/build/src/index/fts.js +125 -0
  37. package/build/src/index/fts.js.map +1 -0
  38. package/build/src/index/identity.js +21 -0
  39. package/build/src/index/identity.js.map +1 -0
  40. package/build/src/index/indexer.js +32 -0
  41. package/build/src/index/indexer.js.map +1 -0
  42. package/build/src/index/manager.js +48 -0
  43. package/build/src/index/manager.js.map +1 -0
  44. package/build/src/index/queue.js +47 -0
  45. package/build/src/index/queue.js.map +1 -0
  46. package/build/src/index/recovery.js +51 -0
  47. package/build/src/index/recovery.js.map +1 -0
  48. package/build/src/index/reindex.js +70 -0
  49. package/build/src/index/reindex.js.map +1 -0
  50. package/build/src/index/scanner.js +147 -0
  51. package/build/src/index/scanner.js.map +1 -0
  52. package/build/src/index/ttl.js +87 -0
  53. package/build/src/index/ttl.js.map +1 -0
  54. package/build/src/index/watcher.js +74 -0
  55. package/build/src/index/watcher.js.map +1 -0
  56. package/build/src/installer/agents.js +440 -0
  57. package/build/src/installer/agents.js.map +1 -0
  58. package/build/src/obs/doctor.js +53 -0
  59. package/build/src/obs/doctor.js.map +1 -0
  60. package/build/src/obs/stats.js +28 -0
  61. package/build/src/obs/stats.js.map +1 -0
  62. package/build/src/obs/usage.js +136 -0
  63. package/build/src/obs/usage.js.map +1 -0
  64. package/build/src/search/rank.js +70 -0
  65. package/build/src/search/rank.js.map +1 -0
  66. package/build/src/search/snippet.js +66 -0
  67. package/build/src/search/snippet.js.map +1 -0
  68. package/build/src/server.js +126 -0
  69. package/build/src/server.js.map +1 -0
  70. package/build/src/tools/current.js +32 -0
  71. package/build/src/tools/current.js.map +1 -0
  72. package/build/src/tools/expand.js +54 -0
  73. package/build/src/tools/expand.js.map +1 -0
  74. package/build/src/tools/prune.js +46 -0
  75. package/build/src/tools/prune.js.map +1 -0
  76. package/build/src/tools/refresh.js +14 -0
  77. package/build/src/tools/refresh.js.map +1 -0
  78. package/build/src/tools/registry.js +176 -0
  79. package/build/src/tools/registry.js.map +1 -0
  80. package/build/src/tools/related.js +28 -0
  81. package/build/src/tools/related.js.map +1 -0
  82. package/build/src/tools/save.js +15 -0
  83. package/build/src/tools/save.js.map +1 -0
  84. package/build/src/tools/search.js +124 -0
  85. package/build/src/tools/search.js.map +1 -0
  86. package/build/src/upgrade.js +74 -0
  87. package/build/src/upgrade.js.map +1 -0
  88. package/build/src/util/hash.js +15 -0
  89. package/build/src/util/hash.js.map +1 -0
  90. package/build/src/util/paths.js +67 -0
  91. package/build/src/util/paths.js.map +1 -0
  92. package/build/src/version.js +27 -0
  93. package/build/src/version.js.map +1 -0
  94. package/docs/agent-guide.md +47 -0
  95. package/docs/codelens-preview.png +0 -0
  96. package/docs/routing.md +59 -0
  97. package/docs/tools.md +53 -0
  98. package/package.json +103 -0
Binary file
@@ -0,0 +1,59 @@
1
+ # Agent Routing Instructions — CodeLens
2
+
3
+ > Inject this block into your agent's system prompt / rules so it routes code
4
+ > discovery through the codelens tools instead of raw grep/find/read.
5
+
6
+ ## When to use codelens tools
7
+
8
+ **For codebase discovery, do NOT start with `grep`/`find`/`read`.** Use the
9
+ codelens tools first:
10
+
11
+ 1. Call `cl_current` to confirm the index is ready for the current branch.
12
+ - If `status` is `missing`, call `cl_refresh` to build the index.
13
+ 2. Use `cl_search` to find relevant files/symbols by intent (2–4 specific terms).
14
+ 3. Use `cl_related` to expand graph neighbors (tests, callers, imports).
15
+ 4. Use `cl_expand` to read the exact current file content for a chosen target
16
+ (it reads from disk — never stale).
17
+ 5. Save working context with `cl_save` and reload it with `cl_load` across
18
+ compaction / long sessions.
19
+
20
+ ## When raw reads are still allowed
21
+
22
+ - Before **editing** a file: read the exact target file with your normal read
23
+ tool (or `cl_expand`) so you have the current bytes.
24
+ - When **verifying** exact code, logs, or user-supplied paths.
25
+ - When `cl_search` explicitly cannot answer (e.g. the index is empty and the
26
+ repo is not a git repo).
27
+ - When the user explicitly asks for raw command output.
28
+
29
+ Do **not** ban raw reads outright — they are correct for editing and
30
+ verification. The routing is about **discovery**: prefer indexed context over
31
+ bulk file dumps to keep your context window lean.
32
+
33
+ ## Branch safety
34
+
35
+ Results are scoped to the **current branch/worktree index only** by default.
36
+ After `git checkout`, results will not leak from the old branch. If you switch
37
+ branches mid-task, call `cl_current` again; the tool activates/creates the new
38
+ branch's index automatically.
39
+
40
+ ## Freshness
41
+
42
+ `cl_search` auto-refreshes changed files before returning (budget-bounded). If
43
+ the response carries `freshness: "partial"` and `pendingFiles > 0`, some very
44
+ recent edits may not yet be reflected — call `cl_refresh` or re-query.
45
+
46
+ ## Tool quick reference
47
+
48
+ | Tool | Purpose |
49
+ |------|---------|
50
+ | `cl_current` | repo/branch/index status + freshness |
51
+ | `cl_refresh` | build/update the current branch index |
52
+ | `cl_search` | hybrid ranked search → compact handles |
53
+ | `cl_related` | graph neighbors (imports/tests/callers) |
54
+ | `cl_expand` | exact current file content by path/range |
55
+ | `cl_save` / `cl_load` | persist + reload working context |
56
+ | `cl_stats` | index counts |
57
+ | `cl_doctor` | runtime/DB/integrity health check |
58
+ | `cl_prune` | manual TTL sweep |
59
+ | `cl_drop` | delete a branch/index explicitly |
package/docs/tools.md ADDED
@@ -0,0 +1,53 @@
1
+ # Tool Reference — CodeLens
2
+
3
+ All tools are exposed via MCP. Inputs are validated with zod; outputs are
4
+ JSON-serialized text content.
5
+
6
+ ## cl_current
7
+ - **Input**: none
8
+ - **Returns**: `{ repo, branch, headSha, indexId, status, dirtyFiles, lastIndexedAt, inGitRepo }`
9
+ - **Use**: first call to check index readiness.
10
+
11
+ ## cl_refresh
12
+ - **Input**: none
13
+ - **Returns**: `{ indexId, branch, indexedFiles, totalChunks, skipped, status }`
14
+ - **Use**: build/update the current branch index.
15
+
16
+ ## cl_search
17
+ - **Input**: `{ query: string, limit?: number=5, cursor?: string }`
18
+ - **Returns**: `{ indexId, results:[{handle,path,startLine,endLine,score,snippet,why}], nextCursor, freshness, pendingFiles }`
19
+ - **Use**: intent-level code discovery.
20
+
21
+ ## cl_related
22
+ - **Input**: `{ path: string, types?: string[], depth?: number=2, direction?: "out"|"in"|"both" }`
23
+ - **Returns**: `{ indexId, results:[{handle,path,edgeType,hops,confidence}] }`
24
+ - **Edge types**: `imports|imported_by|tests|calls|references|defines|exports|belongs_to`
25
+
26
+ ## cl_expand
27
+ - **Input**: `{ path?: string, handle?: string, startLine?: number, endLine?: number, budget?: number=4000 }`
28
+ - **Returns**: `{ path, startLine, endLine, content, truncated, chars }`
29
+ - **Use**: read exact current file content (disk-backed, never stale). Rejects path traversal.
30
+
31
+ ## cl_save
32
+ - **Input**: `{ name: string, items: [{handle?,path?,symbol_id?,chunk_id?}], notes?: string, pinned?: boolean }`
33
+ - **Returns**: `{ id, name, pinned, itemCount }`
34
+
35
+ ## cl_load
36
+ - **Input**: `{ name: string }`
37
+ - **Returns**: `{ context, items }`
38
+
39
+ ## cl_stats
40
+ - **Input**: none
41
+ - **Returns**: `{ active, indexId, branch, counts, backlog, lastIndexedAt, totalIndexes }`
42
+
43
+ ## cl_doctor
44
+ - **Input**: none
45
+ - **Returns**: `{ nodeVersion, betterSqlite3, gitPresent, schemaVersion, integrityOk, walMode, inGitRepo, codeVersion }`
46
+
47
+ ## cl_prune
48
+ - **Input**: none
49
+ - **Returns**: `{ deletedIndexes, skipped, bytesFreed }`
50
+
51
+ ## cl_drop
52
+ - **Input**: `{ indexId?: string, branch?: string }`
53
+ - **Returns**: `{ deleted, indexId, reason? }` (refuses active/pinned)
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "@fodx/codelens",
3
+ "version": "1.0.0",
4
+ "description": "Local, branch-aware code search & relation graph. SQLite FTS5 + tree-sitter symbols + source-graph edges, exposed as an MCP server and CLI. No chat LLM required.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "homepage": "https://github.com/ex-git/codeLens#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/ex-git/codeLens.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/ex-git/codeLens/issues"
14
+ },
15
+ "keywords": [
16
+ "pi-package",
17
+ "mcp",
18
+ "mcp-server",
19
+ "modelcontextprotocol",
20
+ "code-search",
21
+ "code-graph",
22
+ "code-index",
23
+ "tree-sitter",
24
+ "claude-code",
25
+ "cursor",
26
+ "gemini-cli",
27
+ "opencode",
28
+ "codex"
29
+ ],
30
+ "engines": {
31
+ "node": ">=22.5.0"
32
+ },
33
+ "main": "build/src/server.js",
34
+ "bin": {
35
+ "codelens": "build/src/server.js"
36
+ },
37
+ "files": [
38
+ "build/src",
39
+ "adapters/pi",
40
+ "README.md",
41
+ "docs/agent-guide.md",
42
+ "docs/routing.md",
43
+ "docs/tools.md",
44
+ "docs/codelens-preview.png"
45
+ ],
46
+ "pi": {
47
+ "extensions": [
48
+ "adapters/pi/codelens.extension.ts"
49
+ ],
50
+ "image": "https://raw.githubusercontent.com/ex-git/codeLens/main/docs/codelens-preview.png"
51
+ },
52
+ "scripts": {
53
+ "typecheck": "tsc --noEmit",
54
+ "lint": "eslint . --ext .ts",
55
+ "test": "vitest run",
56
+ "build": "tsc && node scripts/build.mjs",
57
+ "prepublishOnly": "npm run build",
58
+ "mcp:smoke": "node build/src/server.js --smoke",
59
+ "start": "node build/src/server.js",
60
+ "benchmark": "npx tsx bench/run.ts"
61
+ },
62
+ "dependencies": {
63
+ "@modelcontextprotocol/sdk": "^1.26.0",
64
+ "better-sqlite3": "^12.6.2",
65
+ "ignore": "^7.0.5",
66
+ "tree-sitter": "^0.25.0",
67
+ "tree-sitter-c": "^0.24.1",
68
+ "tree-sitter-cpp": "^0.23.4",
69
+ "tree-sitter-go": "^0.25.0",
70
+ "tree-sitter-java": "^0.23.5",
71
+ "tree-sitter-javascript": "^0.25.0",
72
+ "tree-sitter-php": "^0.24.2",
73
+ "tree-sitter-python": "^0.25.0",
74
+ "tree-sitter-ruby": "^0.23.1",
75
+ "tree-sitter-rust": "^0.24.0",
76
+ "tree-sitter-typescript": "^0.23.2",
77
+ "zod": "^3.25.0"
78
+ },
79
+ "publishConfig": {
80
+ "access": "public",
81
+ "provenance": true
82
+ },
83
+ "peerDependencies": {
84
+ "@earendil-works/pi-coding-agent": "*"
85
+ },
86
+ "peerDependenciesMeta": {
87
+ "@earendil-works/pi-coding-agent": {
88
+ "optional": true
89
+ }
90
+ },
91
+ "devDependencies": {
92
+ "@eslint/js": "^9.0.0",
93
+ "@types/better-sqlite3": "^7.6.13",
94
+ "@types/node": "^22.19.11",
95
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
96
+ "@typescript-eslint/parser": "^8.0.0",
97
+ "eslint": "^9.0.0",
98
+ "tsx": "^4.22.4",
99
+ "typescript": "^5.7.0",
100
+ "typescript-eslint": "^8.0.0",
101
+ "vitest": "^4.0.18"
102
+ }
103
+ }