codesift-mcp 0.1.0 → 0.2.1
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.
- package/LICENSE +66 -21
- package/README.md +402 -56
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +177 -67
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +157 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks.d.ts +3 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +163 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +400 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/formatters-shortening.d.ts +7 -0
- package/dist/formatters-shortening.d.ts.map +1 -0
- package/dist/formatters-shortening.js +68 -0
- package/dist/formatters-shortening.js.map +1 -0
- package/dist/formatters.d.ts +314 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +396 -0
- package/dist/formatters.js.map +1 -0
- package/dist/instructions.d.ts +6 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +72 -0
- package/dist/instructions.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +21 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +122 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +12 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -0
- package/dist/lsp/lsp-manager.js +82 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/lsp/lsp-servers.d.ts +13 -0
- package/dist/lsp/lsp-servers.d.ts.map +1 -0
- package/dist/lsp/lsp-servers.js +57 -0
- package/dist/lsp/lsp-servers.js.map +1 -0
- package/dist/lsp/lsp-tools.d.ts +67 -0
- package/dist/lsp/lsp-tools.d.ts.map +1 -0
- package/dist/lsp/lsp-tools.js +359 -0
- package/dist/lsp/lsp-tools.js.map +1 -0
- package/dist/parser/extractors/_shared.d.ts +11 -0
- package/dist/parser/extractors/_shared.d.ts.map +1 -0
- package/dist/parser/extractors/_shared.js +38 -0
- package/dist/parser/extractors/_shared.js.map +1 -0
- package/dist/parser/extractors/astro.d.ts +15 -0
- package/dist/parser/extractors/astro.d.ts.map +1 -0
- package/dist/parser/extractors/astro.js +104 -0
- package/dist/parser/extractors/astro.js.map +1 -0
- package/dist/parser/extractors/conversation.d.ts +16 -0
- package/dist/parser/extractors/conversation.d.ts.map +1 -0
- package/dist/parser/extractors/conversation.js +196 -0
- package/dist/parser/extractors/conversation.js.map +1 -0
- package/dist/parser/extractors/go.d.ts.map +1 -1
- package/dist/parser/extractors/go.js +22 -45
- package/dist/parser/extractors/go.js.map +1 -1
- package/dist/parser/extractors/python.d.ts +1 -1
- package/dist/parser/extractors/python.d.ts.map +1 -1
- package/dist/parser/extractors/python.js +19 -50
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/rust.d.ts +1 -1
- package/dist/parser/extractors/rust.d.ts.map +1 -1
- package/dist/parser/extractors/rust.js +7 -34
- package/dist/parser/extractors/rust.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +99 -68
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +12 -2
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts +2 -0
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js +2 -0
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/register-tools.d.ts +127 -0
- package/dist/register-tools.d.ts.map +1 -0
- package/dist/register-tools.js +1453 -0
- package/dist/register-tools.js.map +1 -0
- package/dist/retrieval/codebase-retrieval.d.ts +4 -26
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
- package/dist/retrieval/codebase-retrieval.js +105 -403
- package/dist/retrieval/codebase-retrieval.js.map +1 -1
- package/dist/retrieval/retrieval-constants.d.ts +27 -0
- package/dist/retrieval/retrieval-constants.d.ts.map +1 -0
- package/dist/retrieval/retrieval-constants.js +27 -0
- package/dist/retrieval/retrieval-constants.js.map +1 -0
- package/dist/retrieval/retrieval-schemas.d.ts +107 -0
- package/dist/retrieval/retrieval-schemas.d.ts.map +1 -0
- package/dist/retrieval/retrieval-schemas.js +102 -0
- package/dist/retrieval/retrieval-schemas.js.map +1 -0
- package/dist/retrieval/retrieval-utils.d.ts +40 -0
- package/dist/retrieval/retrieval-utils.d.ts.map +1 -0
- package/dist/retrieval/retrieval-utils.js +139 -0
- package/dist/retrieval/retrieval-utils.js.map +1 -0
- package/dist/retrieval/semantic-handlers.d.ts +8 -0
- package/dist/retrieval/semantic-handlers.d.ts.map +1 -0
- package/dist/retrieval/semantic-handlers.js +152 -0
- package/dist/retrieval/semantic-handlers.js.map +1 -0
- package/dist/search/bm25.d.ts +6 -1
- package/dist/search/bm25.d.ts.map +1 -1
- package/dist/search/bm25.js +95 -32
- package/dist/search/bm25.js.map +1 -1
- package/dist/search/chunker.d.ts +10 -0
- package/dist/search/chunker.d.ts.map +1 -1
- package/dist/search/chunker.js +63 -11
- package/dist/search/chunker.js.map +1 -1
- package/dist/search/reranker.d.ts +15 -0
- package/dist/search/reranker.d.ts.map +1 -0
- package/dist/search/reranker.js +126 -0
- package/dist/search/reranker.js.map +1 -0
- package/dist/search/semantic.d.ts +1 -1
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +40 -45
- package/dist/search/semantic.js.map +1 -1
- package/dist/server-helpers.d.ts +29 -0
- package/dist/server-helpers.d.ts.map +1 -0
- package/dist/server-helpers.js +312 -0
- package/dist/server-helpers.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -271
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +9 -0
- package/dist/storage/_shared.d.ts.map +1 -0
- package/dist/storage/_shared.js +26 -0
- package/dist/storage/_shared.js.map +1 -0
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +23 -63
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +6 -3
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +54 -30
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/graph-store.d.ts +48 -0
- package/dist/storage/graph-store.d.ts.map +1 -0
- package/dist/storage/graph-store.js +52 -0
- package/dist/storage/graph-store.js.map +1 -0
- package/dist/storage/index-store.d.ts +5 -0
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +28 -16
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts +4 -0
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +16 -16
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/usage-stats.d.ts +6 -0
- package/dist/storage/usage-stats.d.ts.map +1 -1
- package/dist/storage/usage-stats.js +59 -11
- package/dist/storage/usage-stats.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts +3 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +50 -132
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/storage/watcher.d.ts +2 -1
- package/dist/storage/watcher.d.ts.map +1 -1
- package/dist/storage/watcher.js +16 -16
- package/dist/storage/watcher.js.map +1 -1
- package/dist/tools/ast-query-tools.d.ts +29 -0
- package/dist/tools/ast-query-tools.d.ts.map +1 -0
- package/dist/tools/ast-query-tools.js +110 -0
- package/dist/tools/ast-query-tools.js.map +1 -0
- package/dist/tools/boundary-tools.d.ts +31 -0
- package/dist/tools/boundary-tools.d.ts.map +1 -0
- package/dist/tools/boundary-tools.js +62 -0
- package/dist/tools/boundary-tools.js.map +1 -0
- package/dist/tools/clone-tools.d.ts +35 -0
- package/dist/tools/clone-tools.d.ts.map +1 -0
- package/dist/tools/clone-tools.js +181 -0
- package/dist/tools/clone-tools.js.map +1 -0
- package/dist/tools/community-tools.d.ts +23 -0
- package/dist/tools/community-tools.d.ts.map +1 -0
- package/dist/tools/community-tools.js +297 -0
- package/dist/tools/community-tools.js.map +1 -0
- package/dist/tools/complexity-tools.d.ts +34 -0
- package/dist/tools/complexity-tools.d.ts.map +1 -0
- package/dist/tools/complexity-tools.js +135 -0
- package/dist/tools/complexity-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +44 -3
- package/dist/tools/context-tools.d.ts.map +1 -1
- package/dist/tools/context-tools.js +329 -99
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/conversation-tools.d.ts +107 -0
- package/dist/tools/conversation-tools.d.ts.map +1 -0
- package/dist/tools/conversation-tools.js +419 -0
- package/dist/tools/conversation-tools.js.map +1 -0
- package/dist/tools/coordinator-tools.d.ts +73 -0
- package/dist/tools/coordinator-tools.d.ts.map +1 -0
- package/dist/tools/coordinator-tools.js +153 -0
- package/dist/tools/coordinator-tools.js.map +1 -0
- package/dist/tools/cross-repo-tools.d.ts +43 -0
- package/dist/tools/cross-repo-tools.d.ts.map +1 -0
- package/dist/tools/cross-repo-tools.js +55 -0
- package/dist/tools/cross-repo-tools.js.map +1 -0
- package/dist/tools/diff-tools.d.ts +4 -1
- package/dist/tools/diff-tools.d.ts.map +1 -1
- package/dist/tools/diff-tools.js +23 -5
- package/dist/tools/diff-tools.js.map +1 -1
- package/dist/tools/frequency-tools.d.ts +46 -0
- package/dist/tools/frequency-tools.d.ts.map +1 -0
- package/dist/tools/frequency-tools.js +184 -0
- package/dist/tools/frequency-tools.js.map +1 -0
- package/dist/tools/generate-tools.d.ts.map +1 -1
- package/dist/tools/generate-tools.js +13 -2
- package/dist/tools/generate-tools.js.map +1 -1
- package/dist/tools/graph-tools.d.ts +44 -11
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +147 -104
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/hotspot-tools.d.ts +24 -0
- package/dist/tools/hotspot-tools.d.ts.map +1 -0
- package/dist/tools/hotspot-tools.js +122 -0
- package/dist/tools/hotspot-tools.js.map +1 -0
- package/dist/tools/impact-tools.d.ts +13 -0
- package/dist/tools/impact-tools.d.ts.map +1 -0
- package/dist/tools/impact-tools.js +238 -0
- package/dist/tools/impact-tools.js.map +1 -0
- package/dist/tools/index-tools.d.ts +44 -3
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +530 -222
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +35 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +229 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts +24 -13
- package/dist/tools/outline-tools.d.ts.map +1 -1
- package/dist/tools/outline-tools.js +113 -87
- package/dist/tools/outline-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts +32 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -0
- package/dist/tools/pattern-tools.js +116 -0
- package/dist/tools/pattern-tools.js.map +1 -0
- package/dist/tools/report-tools.d.ts +5 -0
- package/dist/tools/report-tools.d.ts.map +1 -0
- package/dist/tools/report-tools.js +167 -0
- package/dist/tools/report-tools.js.map +1 -0
- package/dist/tools/review-diff-tools.d.ts +148 -0
- package/dist/tools/review-diff-tools.d.ts.map +1 -0
- package/dist/tools/review-diff-tools.js +852 -0
- package/dist/tools/review-diff-tools.js.map +1 -0
- package/dist/tools/route-tools.d.ts +32 -0
- package/dist/tools/route-tools.d.ts.map +1 -0
- package/dist/tools/route-tools.js +276 -0
- package/dist/tools/route-tools.js.map +1 -0
- package/dist/tools/search-ranker.d.ts +5 -0
- package/dist/tools/search-ranker.d.ts.map +1 -0
- package/dist/tools/search-ranker.js +142 -0
- package/dist/tools/search-ranker.js.map +1 -0
- package/dist/tools/search-tools.d.ts +24 -1
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +459 -225
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/secret-tools.d.ts +104 -0
- package/dist/tools/secret-tools.d.ts.map +1 -0
- package/dist/tools/secret-tools.js +410 -0
- package/dist/tools/secret-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +90 -2
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +576 -42
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/types.d.ts +34 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/framework-detect.d.ts +5 -0
- package/dist/utils/framework-detect.d.ts.map +1 -0
- package/dist/utils/framework-detect.js +36 -0
- package/dist/utils/framework-detect.js.map +1 -0
- package/dist/utils/glob.d.ts +19 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +74 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/import-graph.d.ts +29 -0
- package/dist/utils/import-graph.d.ts.map +1 -0
- package/dist/utils/import-graph.js +125 -0
- package/dist/utils/import-graph.js.map +1 -0
- package/dist/utils/test-file.d.ts.map +1 -1
- package/dist/utils/test-file.js +1 -0
- package/dist/utils/test-file.js.map +1 -1
- package/dist/utils/walk.d.ts +45 -0
- package/dist/utils/walk.d.ts.map +1 -0
- package/dist/utils/walk.js +87 -0
- package/dist/utils/walk.js.map +1 -0
- package/package.json +12 -5
- package/rules/codesift.md +187 -0
- package/rules/codesift.mdc +192 -0
- package/rules/codex.md +187 -0
- package/rules/gemini.md +187 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation indexing tool.
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for JSONL session files, extracts conversation turn symbols,
|
|
5
|
+
* and registers them into the CodeSift index so they are searchable via BM25.
|
|
6
|
+
*/
|
|
7
|
+
import { type BM25Index } from "../search/bm25.js";
|
|
8
|
+
/** Get the cached BM25 index for a conversation repo (used by search tools). */
|
|
9
|
+
export declare function getConversationBM25Index(repoName: string): BM25Index | null;
|
|
10
|
+
export interface IndexConversationsResult {
|
|
11
|
+
/** Number of JSONL session files found and processed. */
|
|
12
|
+
sessions_found: number;
|
|
13
|
+
/** Total conversation_turn symbols indexed across all sessions. */
|
|
14
|
+
turns_indexed: number;
|
|
15
|
+
/** Number of noise records skipped (tool results, etc.). */
|
|
16
|
+
skipped_noise_records: number;
|
|
17
|
+
/** Number of sessions that contained compacted summaries. */
|
|
18
|
+
compacted_sessions: number;
|
|
19
|
+
/** Wall-clock time for the entire operation (ms). */
|
|
20
|
+
elapsed_ms: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert a project root path into Claude Code's per-project conversation path.
|
|
24
|
+
* Claude stores conversation JSONL files under `~/.claude/projects/<encoded-cwd>`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getClaudeConversationProjectPath(cwd: string, homeDir?: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Index all JSONL conversation session files found in `projectPath`.
|
|
29
|
+
*
|
|
30
|
+
* - Filters to `.jsonl` files only
|
|
31
|
+
* - Skips files larger than 10 MB
|
|
32
|
+
* - Extracts conversation_turn symbols via `extractConversationSymbols`
|
|
33
|
+
* - Saves to the CodeSift index store and registers in the registry
|
|
34
|
+
* - Caches the BM25 index in module memory for search use
|
|
35
|
+
*/
|
|
36
|
+
export declare function indexConversations(projectPath?: string): Promise<IndexConversationsResult>;
|
|
37
|
+
export interface ConversationSearchResult {
|
|
38
|
+
session_id: string;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
git_branch: string;
|
|
41
|
+
user_question: string;
|
|
42
|
+
assistant_answer: string;
|
|
43
|
+
score: number;
|
|
44
|
+
file: string;
|
|
45
|
+
turn_index: number;
|
|
46
|
+
project?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface SearchConversationsResult {
|
|
49
|
+
results: ConversationSearchResult[];
|
|
50
|
+
total_matches: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Search indexed conversation turns using hybrid BM25 + semantic search.
|
|
54
|
+
*
|
|
55
|
+
* When embeddings are available, fuses BM25 keyword results with semantic
|
|
56
|
+
* similarity via RRF (Reciprocal Rank Fusion). Falls back to BM25-only
|
|
57
|
+
* when no embedding provider is configured.
|
|
58
|
+
*/
|
|
59
|
+
export declare function searchConversations(query: string, projectPath?: string, limit?: number): Promise<SearchConversationsResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Search ALL indexed conversation projects at once.
|
|
62
|
+
* Iterates over all `conversations/*` repos in the registry,
|
|
63
|
+
* searches each, merges and re-ranks results.
|
|
64
|
+
*/
|
|
65
|
+
export declare function searchAllConversations(query: string, limit?: number): Promise<SearchConversationsResult & {
|
|
66
|
+
projects_searched: number;
|
|
67
|
+
}>;
|
|
68
|
+
export interface FindConversationsForSymbolResult {
|
|
69
|
+
symbol: {
|
|
70
|
+
name: string;
|
|
71
|
+
file: string;
|
|
72
|
+
kind: string;
|
|
73
|
+
};
|
|
74
|
+
conversations: ConversationSearchResult[];
|
|
75
|
+
session_count: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find conversation turns that mention a given symbol name.
|
|
79
|
+
*
|
|
80
|
+
* Resolves the symbol in the code repo first, then searches the matching
|
|
81
|
+
* Claude Code conversation directory for discussions of that symbol.
|
|
82
|
+
*/
|
|
83
|
+
export declare function findConversationsForSymbol(symbolName: string, repo: string, limit?: number): Promise<FindConversationsForSymbolResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Encode a filesystem path for use as a Claude project directory name.
|
|
86
|
+
* Claude stores per-project files under `~/.claude/projects/<encoded-cwd>`,
|
|
87
|
+
* where each `/` in the path is replaced with `-`.
|
|
88
|
+
*/
|
|
89
|
+
export declare function encodeCwdToClaudePath(cwd: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* Install a session-end hook into `<projectRoot>/.claude/settings.local.json`.
|
|
92
|
+
*
|
|
93
|
+
* The hook runs `codesift index-conversations --quiet` whenever Claude stops,
|
|
94
|
+
* keeping the conversation index up-to-date automatically. Idempotent — will
|
|
95
|
+
* not add a duplicate if the codesift hook is already present.
|
|
96
|
+
*/
|
|
97
|
+
export declare function installSessionEndHook(projectRoot: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Auto-discover and index conversation files for the current project at startup.
|
|
100
|
+
*
|
|
101
|
+
* Looks up `~/.claude/projects/<encoded-cwd>` for JSONL session files,
|
|
102
|
+
* indexes them incrementally, then installs the session-end hook so the
|
|
103
|
+
* index stays fresh going forward. Silently does nothing when no conversation
|
|
104
|
+
* directory exists for the project.
|
|
105
|
+
*/
|
|
106
|
+
export declare function autoDiscoverConversations(cwd: string): Promise<void>;
|
|
107
|
+
//# sourceMappingURL=conversation-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-tools.d.ts","sourceRoot":"","sources":["../../src/tools/conversation-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAA2C,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAe5F,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE3E;AAED,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,SAAsB,GAC5B,MAAM,CAER;AAMD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAsGnC;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAuED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAmEpC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCpE;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,aAAa,EAAE,wBAAwB,EAAE,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,gCAAgC,CAAC,CA+C3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C9E;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1E"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation indexing tool.
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for JSONL session files, extracts conversation turn symbols,
|
|
5
|
+
* and registers them into the CodeSift index so they are searchable via BM25.
|
|
6
|
+
*/
|
|
7
|
+
import { readdir, stat, readFile, writeFile, mkdir, rename } from "node:fs/promises";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { join, relative, basename, resolve } from "node:path";
|
|
10
|
+
import { extractConversationSymbols } from "../parser/symbol-extractor.js";
|
|
11
|
+
import { saveIndex, loadIndex, getIndexPath } from "../storage/index-store.js";
|
|
12
|
+
import { registerRepo } from "../storage/registry.js";
|
|
13
|
+
import { buildBM25Index, searchBM25, applyCutoff } from "../search/bm25.js";
|
|
14
|
+
import { loadConfig } from "../config.js";
|
|
15
|
+
import { embedSymbols } from "./index-tools.js";
|
|
16
|
+
// No file size limit — large sessions (40-66MB) often contain the most
|
|
17
|
+
// valuable decisions. readFile + line-by-line JSON.parse handles them fine.
|
|
18
|
+
function getCurrentHomeDir() {
|
|
19
|
+
return process.env.HOME ?? process.env.USERPROFILE ?? homedir();
|
|
20
|
+
}
|
|
21
|
+
/** Module-level BM25 cache keyed by conversation repo name. */
|
|
22
|
+
const bm25Indexes = new Map();
|
|
23
|
+
/** Get the cached BM25 index for a conversation repo (used by search tools). */
|
|
24
|
+
export function getConversationBM25Index(repoName) {
|
|
25
|
+
return bm25Indexes.get(repoName) ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Convert a project root path into Claude Code's per-project conversation path.
|
|
29
|
+
* Claude stores conversation JSONL files under `~/.claude/projects/<encoded-cwd>`.
|
|
30
|
+
*/
|
|
31
|
+
export function getClaudeConversationProjectPath(cwd, homeDir = getCurrentHomeDir()) {
|
|
32
|
+
return join(homeDir, ".claude", "projects", encodeCwdToClaudePath(resolve(cwd)));
|
|
33
|
+
}
|
|
34
|
+
function resolveConversationProjectPath(projectPath) {
|
|
35
|
+
return projectPath ? resolve(projectPath) : getClaudeConversationProjectPath(process.cwd());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Index all JSONL conversation session files found in `projectPath`.
|
|
39
|
+
*
|
|
40
|
+
* - Filters to `.jsonl` files only
|
|
41
|
+
* - Skips files larger than 10 MB
|
|
42
|
+
* - Extracts conversation_turn symbols via `extractConversationSymbols`
|
|
43
|
+
* - Saves to the CodeSift index store and registers in the registry
|
|
44
|
+
* - Caches the BM25 index in module memory for search use
|
|
45
|
+
*/
|
|
46
|
+
export async function indexConversations(projectPath) {
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
const rootPath = resolveConversationProjectPath(projectPath);
|
|
49
|
+
const config = loadConfig();
|
|
50
|
+
// Derive repo name: "conversations/<folder>"
|
|
51
|
+
const repoName = `conversations/${basename(rootPath)}`;
|
|
52
|
+
const indexPath = getIndexPath(config.dataDir, rootPath);
|
|
53
|
+
const allSymbols = [];
|
|
54
|
+
const fileEntries = [];
|
|
55
|
+
let sessionsFound = 0;
|
|
56
|
+
let turnsIndexed = 0;
|
|
57
|
+
let skippedNoiseRecords = 0;
|
|
58
|
+
let compactedSessions = 0;
|
|
59
|
+
// List directory entries — non-recursive, flat scan
|
|
60
|
+
let entries;
|
|
61
|
+
try {
|
|
62
|
+
entries = await readdir(rootPath);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
entries = [];
|
|
66
|
+
}
|
|
67
|
+
const jsonlFiles = entries.filter((name) => name.endsWith(".jsonl"));
|
|
68
|
+
for (const fileName of jsonlFiles) {
|
|
69
|
+
const filePath = join(rootPath, fileName);
|
|
70
|
+
// Read and extract
|
|
71
|
+
let source;
|
|
72
|
+
try {
|
|
73
|
+
source = await readFile(filePath, "utf-8");
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const relPath = relative(rootPath, filePath);
|
|
79
|
+
const symbols = extractConversationSymbols(source, relPath, repoName);
|
|
80
|
+
const turnSymbols = symbols.filter((s) => s.kind === "conversation_turn");
|
|
81
|
+
const summarySymbols = symbols.filter((s) => s.kind === "conversation_summary");
|
|
82
|
+
sessionsFound++;
|
|
83
|
+
turnsIndexed += turnSymbols.length;
|
|
84
|
+
if (summarySymbols.length > 0) {
|
|
85
|
+
compactedSessions++;
|
|
86
|
+
}
|
|
87
|
+
allSymbols.push(...symbols);
|
|
88
|
+
const entry = {
|
|
89
|
+
path: relPath,
|
|
90
|
+
language: "conversation",
|
|
91
|
+
symbol_count: symbols.length,
|
|
92
|
+
last_modified: Date.now(),
|
|
93
|
+
};
|
|
94
|
+
fileEntries.push(entry);
|
|
95
|
+
}
|
|
96
|
+
// Build and cache BM25 index
|
|
97
|
+
const bm25 = buildBM25Index(allSymbols);
|
|
98
|
+
bm25Indexes.set(repoName, bm25);
|
|
99
|
+
// Persist the code index
|
|
100
|
+
const codeIndex = {
|
|
101
|
+
repo: repoName,
|
|
102
|
+
root: rootPath,
|
|
103
|
+
symbols: allSymbols,
|
|
104
|
+
files: fileEntries,
|
|
105
|
+
created_at: Date.now(),
|
|
106
|
+
updated_at: Date.now(),
|
|
107
|
+
symbol_count: allSymbols.length,
|
|
108
|
+
file_count: fileEntries.length,
|
|
109
|
+
};
|
|
110
|
+
await saveIndex(indexPath, codeIndex);
|
|
111
|
+
// Embed conversation symbols in background (non-fatal, fire-and-forget)
|
|
112
|
+
embedSymbols(allSymbols, indexPath, repoName, config).catch((err) => {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
console.error(`[codesift] Conversation embedding failed for ${repoName}: ${msg}`);
|
|
115
|
+
});
|
|
116
|
+
// Register in the global registry
|
|
117
|
+
const meta = {
|
|
118
|
+
name: repoName,
|
|
119
|
+
root: rootPath,
|
|
120
|
+
index_path: indexPath,
|
|
121
|
+
symbol_count: allSymbols.length,
|
|
122
|
+
file_count: fileEntries.length,
|
|
123
|
+
updated_at: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
await registerRepo(config.registryPath, meta);
|
|
126
|
+
return {
|
|
127
|
+
sessions_found: sessionsFound,
|
|
128
|
+
turns_indexed: turnsIndexed,
|
|
129
|
+
skipped_noise_records: skippedNoiseRecords,
|
|
130
|
+
compacted_sessions: compactedSessions,
|
|
131
|
+
elapsed_ms: Date.now() - startTime,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Map a SearchResult to a ConversationSearchResult with metadata extraction.
|
|
136
|
+
*/
|
|
137
|
+
function toConversationResult(r, repoName) {
|
|
138
|
+
const sym = r.symbol;
|
|
139
|
+
const source = sym.source ?? "";
|
|
140
|
+
const sepIdx = source.indexOf("\n---\n");
|
|
141
|
+
const assistantAnswer = sepIdx >= 0 ? source.slice(sepIdx + 5, sepIdx + 505) : "";
|
|
142
|
+
const turnMatch = sym.id.match(/:turn_(\d+):/);
|
|
143
|
+
const turnIndex = turnMatch ? parseInt(turnMatch[1], 10) : 0;
|
|
144
|
+
// Parse signature for metadata: "timestamp\nuser_text" or "timestamp | branch\nuser_text"
|
|
145
|
+
const sig = sym.signature ?? "";
|
|
146
|
+
const firstNewline = sig.indexOf("\n");
|
|
147
|
+
const metaLine = firstNewline >= 0 ? sig.slice(0, firstNewline) : "";
|
|
148
|
+
const metaParts = metaLine.split(" | ");
|
|
149
|
+
// Check if first part looks like a timestamp (starts with 20)
|
|
150
|
+
const timestamp = metaParts[0]?.startsWith("20") ? metaParts[0] : "";
|
|
151
|
+
const gitBranch = timestamp ? (metaParts[1] ?? "") : "";
|
|
152
|
+
return {
|
|
153
|
+
session_id: sym.parent ?? "",
|
|
154
|
+
timestamp,
|
|
155
|
+
git_branch: gitBranch,
|
|
156
|
+
user_question: sym.name,
|
|
157
|
+
assistant_answer: assistantAnswer,
|
|
158
|
+
score: r.score,
|
|
159
|
+
file: sym.file,
|
|
160
|
+
turn_index: turnIndex,
|
|
161
|
+
...(repoName ? { project: repoName } : {}),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Load BM25 index + symbol map for a conversation repo (from cache or disk).
|
|
166
|
+
*/
|
|
167
|
+
async function loadConversationIndex(rootPath) {
|
|
168
|
+
const repoName = `conversations/${basename(rootPath)}`;
|
|
169
|
+
const config = loadConfig();
|
|
170
|
+
const indexPath = getIndexPath(config.dataDir, rootPath);
|
|
171
|
+
let bm25 = bm25Indexes.get(repoName) ?? null;
|
|
172
|
+
let codeIndex = null;
|
|
173
|
+
if (!bm25) {
|
|
174
|
+
try {
|
|
175
|
+
codeIndex = await loadIndex(indexPath);
|
|
176
|
+
if (codeIndex && codeIndex.symbols.length > 0) {
|
|
177
|
+
bm25 = buildBM25Index(codeIndex.symbols);
|
|
178
|
+
bm25Indexes.set(repoName, bm25);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!bm25)
|
|
186
|
+
return null;
|
|
187
|
+
// Build symbol map from BM25 index or loaded index
|
|
188
|
+
const symbols = bm25.symbols;
|
|
189
|
+
return { bm25, repoName, indexPath, symbols };
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Search indexed conversation turns using hybrid BM25 + semantic search.
|
|
193
|
+
*
|
|
194
|
+
* When embeddings are available, fuses BM25 keyword results with semantic
|
|
195
|
+
* similarity via RRF (Reciprocal Rank Fusion). Falls back to BM25-only
|
|
196
|
+
* when no embedding provider is configured.
|
|
197
|
+
*/
|
|
198
|
+
export async function searchConversations(query, projectPath, limit) {
|
|
199
|
+
const rootPath = resolveConversationProjectPath(projectPath);
|
|
200
|
+
const loaded = await loadConversationIndex(rootPath);
|
|
201
|
+
if (!loaded)
|
|
202
|
+
return { results: [], total_matches: 0 };
|
|
203
|
+
const { bm25, repoName, indexPath, symbols } = loaded;
|
|
204
|
+
const config = loadConfig();
|
|
205
|
+
const topK = limit ?? 10;
|
|
206
|
+
// BM25 results
|
|
207
|
+
const bm25Results = searchBM25(bm25, query, topK * 2, config.bm25FieldWeights);
|
|
208
|
+
const bm25Filtered = applyCutoff(bm25Results);
|
|
209
|
+
// Try semantic search if embeddings available
|
|
210
|
+
let semanticResults = [];
|
|
211
|
+
if (config.embeddingProvider) {
|
|
212
|
+
try {
|
|
213
|
+
const { createEmbeddingProvider, searchSemantic, cosineSimilarity: _cos } = await import("../search/semantic.js");
|
|
214
|
+
const { loadEmbeddings, getEmbeddingPath } = await import("../storage/embedding-store.js");
|
|
215
|
+
const provider = createEmbeddingProvider(config.embeddingProvider, config);
|
|
216
|
+
const embeddingPath = getEmbeddingPath(indexPath);
|
|
217
|
+
const embeddings = await loadEmbeddings(embeddingPath);
|
|
218
|
+
if (embeddings.size > 0) {
|
|
219
|
+
const [queryVec] = await provider.embed([query]);
|
|
220
|
+
if (queryVec) {
|
|
221
|
+
const qEmb = new Float32Array(queryVec);
|
|
222
|
+
semanticResults = searchSemantic(qEmb, embeddings, symbols, topK * 2);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Semantic search failed — fall back to BM25 only
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Fuse results: boost BM25 scores with semantic signal (additive, not RRF)
|
|
231
|
+
// This preserves BM25 magnitude for cross-project ranking
|
|
232
|
+
let finalResults;
|
|
233
|
+
if (semanticResults.length > 0) {
|
|
234
|
+
const semanticMap = new Map();
|
|
235
|
+
for (const r of semanticResults) {
|
|
236
|
+
semanticMap.set(r.symbol.id, r.score);
|
|
237
|
+
}
|
|
238
|
+
// Add semantic similarity as a bonus to BM25 score (scaled to ~20% of BM25 range)
|
|
239
|
+
const maxBm25 = bm25Filtered.length > 0 ? bm25Filtered[0].score : 1;
|
|
240
|
+
const boosted = bm25Filtered.map((r) => {
|
|
241
|
+
const semScore = semanticMap.get(r.symbol.id) ?? 0;
|
|
242
|
+
return { symbol: r.symbol, score: r.score + semScore * maxBm25 * 0.2 };
|
|
243
|
+
});
|
|
244
|
+
// Also add semantic-only results not in BM25 (with lower base score)
|
|
245
|
+
for (const r of semanticResults) {
|
|
246
|
+
if (!bm25Filtered.some((b) => b.symbol.id === r.symbol.id)) {
|
|
247
|
+
boosted.push({ symbol: r.symbol, score: r.score * maxBm25 * 0.15 });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
boosted.sort((a, b) => b.score - a.score);
|
|
251
|
+
finalResults = boosted.slice(0, topK);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
finalResults = bm25Filtered.slice(0, topK);
|
|
255
|
+
}
|
|
256
|
+
const results = finalResults.map((r) => toConversationResult(r, repoName));
|
|
257
|
+
return { results, total_matches: results.length };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Search ALL indexed conversation projects at once.
|
|
261
|
+
* Iterates over all `conversations/*` repos in the registry,
|
|
262
|
+
* searches each, merges and re-ranks results.
|
|
263
|
+
*/
|
|
264
|
+
export async function searchAllConversations(query, limit) {
|
|
265
|
+
const { listRepos } = await import("../storage/registry.js");
|
|
266
|
+
const config = loadConfig();
|
|
267
|
+
const repos = await listRepos(config.registryPath);
|
|
268
|
+
const conversationRepos = repos.filter((r) => r.name.startsWith("conversations/") && !r.name.includes("conv-test") && !r.name.includes("conv-ret"));
|
|
269
|
+
const allResults = [];
|
|
270
|
+
for (const repo of conversationRepos) {
|
|
271
|
+
try {
|
|
272
|
+
const { results } = await searchConversations(query, repo.root, limit ?? 10);
|
|
273
|
+
for (const r of results) {
|
|
274
|
+
allResults.push({ ...r, project: repo.name });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Skip repos that fail to load
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Sort by score descending, take top limit
|
|
282
|
+
allResults.sort((a, b) => b.score - a.score);
|
|
283
|
+
const topK = limit ?? 10;
|
|
284
|
+
const trimmed = allResults.slice(0, topK);
|
|
285
|
+
return {
|
|
286
|
+
results: trimmed,
|
|
287
|
+
total_matches: trimmed.length,
|
|
288
|
+
projects_searched: conversationRepos.length,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Find conversation turns that mention a given symbol name.
|
|
293
|
+
*
|
|
294
|
+
* Resolves the symbol in the code repo first, then searches the matching
|
|
295
|
+
* Claude Code conversation directory for discussions of that symbol.
|
|
296
|
+
*/
|
|
297
|
+
export async function findConversationsForSymbol(symbolName, repo, limit) {
|
|
298
|
+
let resolvedSymbol = { name: symbolName, file: "", kind: "" };
|
|
299
|
+
let projectPath;
|
|
300
|
+
try {
|
|
301
|
+
const { searchSymbols } = await import("./search-tools.js");
|
|
302
|
+
const symbolResults = await searchSymbols(repo, symbolName, {
|
|
303
|
+
include_source: false,
|
|
304
|
+
detail_level: "compact",
|
|
305
|
+
top_k: 10,
|
|
306
|
+
});
|
|
307
|
+
const bestMatch = symbolResults.find((r) => r.symbol.name === symbolName) ??
|
|
308
|
+
symbolResults.find((r) => r.symbol.name.toLowerCase() === symbolName.toLowerCase()) ??
|
|
309
|
+
symbolResults[0];
|
|
310
|
+
if (bestMatch) {
|
|
311
|
+
resolvedSymbol = {
|
|
312
|
+
name: bestMatch.symbol.name,
|
|
313
|
+
file: bestMatch.symbol.file,
|
|
314
|
+
kind: bestMatch.symbol.kind,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Fall back to plain-text search using the provided symbol name.
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
const { getRepo } = await import("../storage/registry.js");
|
|
323
|
+
const config = loadConfig();
|
|
324
|
+
const repoMeta = await getRepo(config.registryPath, repo);
|
|
325
|
+
if (repoMeta) {
|
|
326
|
+
projectPath = getClaudeConversationProjectPath(repoMeta.root);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// Fall back to the current project's conversations if repo lookup fails.
|
|
331
|
+
}
|
|
332
|
+
const { results } = await searchConversations(resolvedSymbol.name, projectPath, limit ?? 5);
|
|
333
|
+
const uniqueSessions = new Set(results.map((r) => r.session_id));
|
|
334
|
+
return {
|
|
335
|
+
symbol: resolvedSymbol,
|
|
336
|
+
conversations: results,
|
|
337
|
+
session_count: uniqueSessions.size,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Encode a filesystem path for use as a Claude project directory name.
|
|
342
|
+
* Claude stores per-project files under `~/.claude/projects/<encoded-cwd>`,
|
|
343
|
+
* where each `/` in the path is replaced with `-`.
|
|
344
|
+
*/
|
|
345
|
+
export function encodeCwdToClaudePath(cwd) {
|
|
346
|
+
return cwd.replace(/\//g, "-");
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Install a session-end hook into `<projectRoot>/.claude/settings.local.json`.
|
|
350
|
+
*
|
|
351
|
+
* The hook runs `codesift index-conversations --quiet` whenever Claude stops,
|
|
352
|
+
* keeping the conversation index up-to-date automatically. Idempotent — will
|
|
353
|
+
* not add a duplicate if the codesift hook is already present.
|
|
354
|
+
*/
|
|
355
|
+
export async function installSessionEndHook(projectRoot) {
|
|
356
|
+
const settingsDir = join(projectRoot, ".claude");
|
|
357
|
+
const settingsPath = join(settingsDir, "settings.local.json");
|
|
358
|
+
const hookEntry = {
|
|
359
|
+
matcher: "",
|
|
360
|
+
hooks: [
|
|
361
|
+
{
|
|
362
|
+
type: "command",
|
|
363
|
+
command: "codesift index-conversations --quiet",
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
};
|
|
367
|
+
let settings = {};
|
|
368
|
+
try {
|
|
369
|
+
const content = await readFile(settingsPath, "utf-8");
|
|
370
|
+
settings = JSON.parse(content);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// File doesn't exist or is invalid — start fresh
|
|
374
|
+
}
|
|
375
|
+
// Ensure hooks.Stop array exists
|
|
376
|
+
if (!settings.hooks || typeof settings.hooks !== "object") {
|
|
377
|
+
settings.hooks = {};
|
|
378
|
+
}
|
|
379
|
+
const hooksObj = settings.hooks;
|
|
380
|
+
if (!Array.isArray(hooksObj.Stop)) {
|
|
381
|
+
hooksObj.Stop = [];
|
|
382
|
+
}
|
|
383
|
+
// Check if codesift hook already exists (idempotent)
|
|
384
|
+
const existing = hooksObj.Stop;
|
|
385
|
+
if (existing.some((h) => h.hooks?.some((hk) => hk.command?.includes("codesift")))) {
|
|
386
|
+
return; // Already installed
|
|
387
|
+
}
|
|
388
|
+
existing.push(hookEntry);
|
|
389
|
+
// Write atomically
|
|
390
|
+
await mkdir(settingsDir, { recursive: true });
|
|
391
|
+
const tmpPath = settingsPath + ".tmp";
|
|
392
|
+
await writeFile(tmpPath, JSON.stringify(settings, null, 2));
|
|
393
|
+
await rename(tmpPath, settingsPath);
|
|
394
|
+
console.error("CodeSift: conversation index hook installed in .claude/settings.local.json");
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Auto-discover and index conversation files for the current project at startup.
|
|
398
|
+
*
|
|
399
|
+
* Looks up `~/.claude/projects/<encoded-cwd>` for JSONL session files,
|
|
400
|
+
* indexes them incrementally, then installs the session-end hook so the
|
|
401
|
+
* index stays fresh going forward. Silently does nothing when no conversation
|
|
402
|
+
* directory exists for the project.
|
|
403
|
+
*/
|
|
404
|
+
export async function autoDiscoverConversations(cwd) {
|
|
405
|
+
const conversationsDir = getClaudeConversationProjectPath(cwd);
|
|
406
|
+
try {
|
|
407
|
+
const dirStat = await stat(conversationsDir);
|
|
408
|
+
if (!dirStat.isDirectory())
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
return; // Directory doesn't exist — no conversations for this project
|
|
413
|
+
}
|
|
414
|
+
// Index conversations (incremental — skips unchanged files)
|
|
415
|
+
await indexConversations(conversationsDir);
|
|
416
|
+
// Install session-end hook
|
|
417
|
+
await installSessionEndHook(cwd);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=conversation-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-tools.js","sourceRoot":"","sources":["../../src/tools/conversation-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface ScratchpadEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
value: string;
|
|
4
|
+
created_at: string;
|
|
5
|
+
updated_at: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AnalysisPlan {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
steps: AnalysisStep[];
|
|
11
|
+
status: "pending" | "in_progress" | "completed" | "failed";
|
|
12
|
+
scratchpad_dir: string;
|
|
13
|
+
created_at: string;
|
|
14
|
+
completed_at?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AnalysisStep {
|
|
17
|
+
id: string;
|
|
18
|
+
description: string;
|
|
19
|
+
tool: string;
|
|
20
|
+
args: Record<string, unknown>;
|
|
21
|
+
status: "pending" | "in_progress" | "completed" | "failed" | "skipped";
|
|
22
|
+
result_key?: string;
|
|
23
|
+
depends_on?: string[];
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a new analysis plan with a scratchpad directory.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createAnalysisPlan(title: string, steps: Array<{
|
|
30
|
+
description: string;
|
|
31
|
+
tool: string;
|
|
32
|
+
args: Record<string, unknown>;
|
|
33
|
+
result_key?: string;
|
|
34
|
+
depends_on?: string[];
|
|
35
|
+
}>): Promise<AnalysisPlan>;
|
|
36
|
+
/**
|
|
37
|
+
* Write a key-value entry to the plan's scratchpad.
|
|
38
|
+
* Scratchpad entries are persisted as individual files.
|
|
39
|
+
*/
|
|
40
|
+
export declare function writeScratchpad(planId: string, key: string, value: string): Promise<ScratchpadEntry>;
|
|
41
|
+
/**
|
|
42
|
+
* Read a key from the plan's scratchpad.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readScratchpad(planId: string, key: string): Promise<ScratchpadEntry | null>;
|
|
45
|
+
/**
|
|
46
|
+
* List all entries in the plan's scratchpad.
|
|
47
|
+
*/
|
|
48
|
+
export declare function listScratchpad(planId: string): Promise<{
|
|
49
|
+
entries: Array<{
|
|
50
|
+
key: string;
|
|
51
|
+
size: number;
|
|
52
|
+
updated_at: string;
|
|
53
|
+
}>;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Update a step's status in the plan.
|
|
57
|
+
*/
|
|
58
|
+
export declare function updateStepStatus(planId: string, stepId: string, status: AnalysisStep["status"], error?: string): Promise<AnalysisPlan>;
|
|
59
|
+
/**
|
|
60
|
+
* Get the current state of a plan.
|
|
61
|
+
*/
|
|
62
|
+
export declare function getPlan(planId: string): AnalysisPlan | null;
|
|
63
|
+
/**
|
|
64
|
+
* List all active plans.
|
|
65
|
+
*/
|
|
66
|
+
export declare function listPlans(): Array<{
|
|
67
|
+
id: string;
|
|
68
|
+
title: string;
|
|
69
|
+
status: string;
|
|
70
|
+
steps_completed: number;
|
|
71
|
+
steps_total: number;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=coordinator-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator-tools.d.ts","sourceRoot":"","sources":["../../src/tools/coordinator-tools.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC,GACD,OAAO,CAAC,YAAY,CAAC,CAgCvB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAajC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA2BhF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,KAAK,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAQD"}
|