glancey 2.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.
- package/LICENSE +21 -0
- package/README.md +435 -0
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
- package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +157 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.js +178 -0
- package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +273 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +334 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +102 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +279 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +1305 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
- package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.js +153 -0
- package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.js +184 -0
- package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
- package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.js +175 -0
- package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.js +229 -0
- package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
- package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
- package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
- package/dist/__tests__/utils/cache.test.d.ts +2 -0
- package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cache.test.js +147 -0
- package/dist/__tests__/utils/cache.test.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/logger.test.d.ts +2 -0
- package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
- package/dist/__tests__/utils/logger.test.js +131 -0
- package/dist/__tests__/utils/logger.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +191 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +788 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +64 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +211 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +505 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +172 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +362 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/token-tracking.d.ts +143 -0
- package/dist/dashboard/token-tracking.d.ts.map +1 -0
- package/dist/dashboard/token-tracking.js +363 -0
- package/dist/dashboard/token-tracking.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +2710 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +28 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +165 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +34 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +120 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +22 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +179 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +20 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +227 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +103 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +23 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2028 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +29 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +236 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/chunk-utils.d.ts +24 -0
- package/dist/search/chunk-utils.d.ts.map +1 -0
- package/dist/search/chunk-utils.js +41 -0
- package/dist/search/chunk-utils.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +377 -0
- package/dist/search/indexer.d.ts.map +1 -0
- package/dist/search/indexer.js +1557 -0
- package/dist/search/indexer.js.map +1 -0
- package/dist/search/tree-sitter-chunker.d.ts +64 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +412 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/tools/clustering-handlers.d.ts +70 -0
- package/dist/tools/clustering-handlers.d.ts.map +1 -0
- package/dist/tools/clustering-handlers.js +150 -0
- package/dist/tools/clustering-handlers.js.map +1 -0
- package/dist/tools/commit-handlers.d.ts +77 -0
- package/dist/tools/commit-handlers.d.ts.map +1 -0
- package/dist/tools/commit-handlers.js +251 -0
- package/dist/tools/commit-handlers.js.map +1 -0
- package/dist/tools/index-handlers.d.ts +31 -0
- package/dist/tools/index-handlers.d.ts.map +1 -0
- package/dist/tools/index-handlers.js +53 -0
- package/dist/tools/index-handlers.js.map +1 -0
- package/dist/tools/instructions-handlers.d.ts +25 -0
- package/dist/tools/instructions-handlers.d.ts.map +1 -0
- package/dist/tools/instructions-handlers.js +36 -0
- package/dist/tools/instructions-handlers.js.map +1 -0
- package/dist/tools/memory-handlers.d.ts +95 -0
- package/dist/tools/memory-handlers.d.ts.map +1 -0
- package/dist/tools/memory-handlers.js +126 -0
- package/dist/tools/memory-handlers.js.map +1 -0
- package/dist/tools/search-handlers.d.ts +51 -0
- package/dist/tools/search-handlers.d.ts.map +1 -0
- package/dist/tools/search-handlers.js +128 -0
- package/dist/tools/search-handlers.js.map +1 -0
- package/dist/tools/symbol-handlers.d.ts +171 -0
- package/dist/tools/symbol-handlers.d.ts.map +1 -0
- package/dist/tools/symbol-handlers.js +456 -0
- package/dist/tools/symbol-handlers.js.map +1 -0
- package/dist/tools/types.d.ts +32 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/worktree-handlers.d.ts +96 -0
- package/dist/tools/worktree-handlers.d.ts.map +1 -0
- package/dist/tools/worktree-handlers.js +186 -0
- package/dist/tools/worktree-handlers.js.map +1 -0
- package/dist/utils/cache.d.ts +77 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +134 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +87 -0
- package/scripts/postinstall.js +48 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for clustering operations.
|
|
3
|
+
*/
|
|
4
|
+
import type { CodeIndexer, CodeChunk, CodebaseSummary } from '../search/indexer.js';
|
|
5
|
+
import type { ConceptCluster } from '../search/clustering.js';
|
|
6
|
+
import type { ToolResponse } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Context for clustering tools.
|
|
9
|
+
*/
|
|
10
|
+
export interface ClusteringToolContext {
|
|
11
|
+
indexer: CodeIndexer;
|
|
12
|
+
toolGuidance: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Arguments for summarize_codebase tool.
|
|
16
|
+
*/
|
|
17
|
+
export interface SummarizeCodebaseArgs {
|
|
18
|
+
numClusters?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse and validate summarize_codebase arguments.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseSummarizeCodebaseArgs(args: Record<string, unknown> | undefined): SummarizeCodebaseArgs;
|
|
24
|
+
/**
|
|
25
|
+
* Format codebase summary for display.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatCodebaseSummary(summary: CodebaseSummary): string;
|
|
28
|
+
/**
|
|
29
|
+
* Handle summarize_codebase tool.
|
|
30
|
+
*/
|
|
31
|
+
export declare function handleSummarizeCodebase(args: SummarizeCodebaseArgs, context: ClusteringToolContext): Promise<ToolResponse>;
|
|
32
|
+
/**
|
|
33
|
+
* Arguments for list_concepts tool.
|
|
34
|
+
*/
|
|
35
|
+
export interface ListConceptsArgs {
|
|
36
|
+
forceRecluster?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse and validate list_concepts arguments.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseListConceptsArgs(args: Record<string, unknown> | undefined): ListConceptsArgs;
|
|
42
|
+
/**
|
|
43
|
+
* Format concept clusters for display.
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatConceptClusters(concepts: ConceptCluster[]): string;
|
|
46
|
+
/**
|
|
47
|
+
* Handle list_concepts tool.
|
|
48
|
+
*/
|
|
49
|
+
export declare function handleListConcepts(args: ListConceptsArgs, context: ClusteringToolContext): Promise<ToolResponse>;
|
|
50
|
+
/**
|
|
51
|
+
* Arguments for search_by_concept tool.
|
|
52
|
+
*/
|
|
53
|
+
export interface SearchByConceptArgs {
|
|
54
|
+
conceptId: number;
|
|
55
|
+
query?: string;
|
|
56
|
+
limit?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse and validate search_by_concept arguments.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseSearchByConceptArgs(args: Record<string, unknown> | undefined): SearchByConceptArgs;
|
|
62
|
+
/**
|
|
63
|
+
* Format concept search results for display.
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatConceptSearchResults(results: CodeChunk[], conceptId: number): string;
|
|
66
|
+
/**
|
|
67
|
+
* Handle search_by_concept tool.
|
|
68
|
+
*/
|
|
69
|
+
export declare function handleSearchByConcept(args: SearchByConceptArgs, context: ClusteringToolContext): Promise<ToolResponse>;
|
|
70
|
+
//# sourceMappingURL=clustering-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clustering-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/clustering-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,qBAAqB,CAIvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA0BtE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAiBvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,gBAAgB,CAIjG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAgBxE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,mBAAmB,CAerB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAe1F;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for clustering operations.
|
|
3
|
+
*/
|
|
4
|
+
import { createToolResponse } from './types.js';
|
|
5
|
+
import { isNumber, isBoolean, isString } from '../utils/type-guards.js';
|
|
6
|
+
import { GlanceyError } from '../utils/errors.js';
|
|
7
|
+
import { dashboardState } from '../dashboard/state.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse and validate summarize_codebase arguments.
|
|
10
|
+
*/
|
|
11
|
+
export function parseSummarizeCodebaseArgs(args) {
|
|
12
|
+
return {
|
|
13
|
+
numClusters: isNumber(args?.numClusters) ? args.numClusters : undefined,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format codebase summary for display.
|
|
18
|
+
*/
|
|
19
|
+
export function formatCodebaseSummary(summary) {
|
|
20
|
+
const languageList = summary.languages
|
|
21
|
+
.map((l) => `- **${l.language}**: ${l.fileCount} files, ${l.chunkCount} chunks`)
|
|
22
|
+
.join('\n');
|
|
23
|
+
const conceptList = summary.concepts
|
|
24
|
+
.map((c) => {
|
|
25
|
+
const keywords = c.keywords.slice(0, 5).join(', ');
|
|
26
|
+
return `- **Cluster ${c.id}: ${c.label}** (${c.size} chunks)\n Keywords: ${keywords}`;
|
|
27
|
+
})
|
|
28
|
+
.join('\n');
|
|
29
|
+
return `# Codebase Summary
|
|
30
|
+
|
|
31
|
+
## Overview
|
|
32
|
+
- **Total Files**: ${summary.totalFiles}
|
|
33
|
+
- **Total Chunks**: ${summary.totalChunks}
|
|
34
|
+
- **Concept Clusters**: ${summary.concepts.length}
|
|
35
|
+
- **Clustering Quality**: ${(summary.clusteringQuality * 100).toFixed(1)}% (silhouette score)
|
|
36
|
+
- **Generated At**: ${summary.generatedAt}
|
|
37
|
+
|
|
38
|
+
## Languages
|
|
39
|
+
${languageList}
|
|
40
|
+
|
|
41
|
+
## Concept Areas
|
|
42
|
+
${conceptList}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Handle summarize_codebase tool.
|
|
46
|
+
*/
|
|
47
|
+
export async function handleSummarizeCodebase(args, context) {
|
|
48
|
+
const summary = await context.indexer.summarizeCodebase(args.numClusters ? { numClusters: args.numClusters } : undefined);
|
|
49
|
+
const formatted = formatCodebaseSummary(summary);
|
|
50
|
+
// Track token savings (optional)
|
|
51
|
+
try {
|
|
52
|
+
const status = await context.indexer.getStatus();
|
|
53
|
+
dashboardState
|
|
54
|
+
.getTokenTracker()
|
|
55
|
+
.recordSummarizeCodebase(formatted.length, status.fileCount ?? 0);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Token tracking not available
|
|
59
|
+
}
|
|
60
|
+
return createToolResponse(formatted, context.toolGuidance);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse and validate list_concepts arguments.
|
|
64
|
+
*/
|
|
65
|
+
export function parseListConceptsArgs(args) {
|
|
66
|
+
return {
|
|
67
|
+
forceRecluster: isBoolean(args?.forceRecluster) ? args.forceRecluster : false,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format concept clusters for display.
|
|
72
|
+
*/
|
|
73
|
+
export function formatConceptClusters(concepts) {
|
|
74
|
+
if (concepts.length === 0) {
|
|
75
|
+
return 'No concept clusters found. Make sure the codebase is indexed first.';
|
|
76
|
+
}
|
|
77
|
+
const formatted = concepts
|
|
78
|
+
.map((c) => {
|
|
79
|
+
const keywords = c.keywords.slice(0, 5).join(', ');
|
|
80
|
+
return `## Cluster ${c.id}: ${c.label}
|
|
81
|
+
- **Size**: ${c.size} code chunks
|
|
82
|
+
- **Keywords**: ${keywords}
|
|
83
|
+
- **Representatives**: ${c.representativeChunks.slice(0, 3).join(', ')}`;
|
|
84
|
+
})
|
|
85
|
+
.join('\n\n');
|
|
86
|
+
return `# Concept Clusters\n\n${formatted}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Handle list_concepts tool.
|
|
90
|
+
*/
|
|
91
|
+
export async function handleListConcepts(args, context) {
|
|
92
|
+
const concepts = await context.indexer.listConcepts(args.forceRecluster ?? false);
|
|
93
|
+
const formatted = formatConceptClusters(concepts);
|
|
94
|
+
// Track token savings (optional)
|
|
95
|
+
try {
|
|
96
|
+
dashboardState.getTokenTracker().recordListConcepts(formatted.length, concepts.length);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Token tracking not available
|
|
100
|
+
}
|
|
101
|
+
return createToolResponse(formatted, context.toolGuidance);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse and validate search_by_concept arguments.
|
|
105
|
+
*/
|
|
106
|
+
export function parseSearchByConceptArgs(args) {
|
|
107
|
+
const conceptId = isNumber(args?.conceptId) ? args.conceptId : -1;
|
|
108
|
+
if (conceptId < 0) {
|
|
109
|
+
throw new GlanceyError('conceptId is required and must be a non-negative number', 'validation', { tool: 'search_by_concept' });
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
conceptId,
|
|
113
|
+
query: isString(args?.query) ? args.query : undefined,
|
|
114
|
+
limit: isNumber(args?.limit) ? args.limit : 10,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format concept search results for display.
|
|
119
|
+
*/
|
|
120
|
+
export function formatConceptSearchResults(results, conceptId) {
|
|
121
|
+
if (results.length === 0) {
|
|
122
|
+
return `No code found in concept cluster ${conceptId}. Try list_concepts to see available clusters.`;
|
|
123
|
+
}
|
|
124
|
+
return results
|
|
125
|
+
.map((r, i) => {
|
|
126
|
+
let header = `## Result ${i + 1}: ${r.filepath}:${r.startLine}-${r.endLine}`;
|
|
127
|
+
if (r.symbolName) {
|
|
128
|
+
const typeLabel = r.symbolType ? ` (${r.symbolType})` : '';
|
|
129
|
+
header += `\n**Symbol:** \`${r.symbolName}\`${typeLabel}`;
|
|
130
|
+
}
|
|
131
|
+
return `${header}\n\`\`\`${r.language}\n${r.content}\n\`\`\``;
|
|
132
|
+
})
|
|
133
|
+
.join('\n\n');
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Handle search_by_concept tool.
|
|
137
|
+
*/
|
|
138
|
+
export async function handleSearchByConcept(args, context) {
|
|
139
|
+
const results = await context.indexer.searchByConcept(args.conceptId, args.query, args.limit ?? 10);
|
|
140
|
+
const formatted = formatConceptSearchResults(results, args.conceptId);
|
|
141
|
+
// Track token savings (optional)
|
|
142
|
+
try {
|
|
143
|
+
dashboardState.getTokenTracker().recordSearchByConcept(formatted.length, results.length);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Token tracking not available
|
|
147
|
+
}
|
|
148
|
+
return createToolResponse(formatted, context.toolGuidance);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=clustering-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clustering-handlers.js","sourceRoot":"","sources":["../../src/tools/clustering-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for git commit operations.
|
|
3
|
+
*/
|
|
4
|
+
import type { ToolResponse } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Commit rules reminder text.
|
|
7
|
+
*/
|
|
8
|
+
export declare const COMMIT_RULES = "\n## Commit Rules Reminder\n\n1. **Branch**: Must be on a feature branch, not main/master\n2. **Message length**: Subject line must be \u226472 characters\n3. **Imperative mood**: \"Add feature\" not \"Added feature\"\n4. **Single responsibility**: One logical change per commit\n5. **Body format**: Only \"Co-Authored-By: Claude <noreply@anthropic.com>\"\n\n**Signs of multi-responsibility** (split into separate commits):\n- Message contains \"and\" connecting actions\n- Message lists multiple changes with commas\n- Changes span unrelated files/features\n";
|
|
9
|
+
/**
|
|
10
|
+
* Execute a git command safely using spawn with array arguments.
|
|
11
|
+
*/
|
|
12
|
+
export declare function gitSpawn(args: string[], options: {
|
|
13
|
+
cwd: string;
|
|
14
|
+
stdin?: string;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Interface for git operations (for testability).
|
|
21
|
+
*/
|
|
22
|
+
export interface IGitOperations {
|
|
23
|
+
getCurrentBranch(cwd: string): Promise<string>;
|
|
24
|
+
stageFiles(cwd: string, files: string[]): Promise<void>;
|
|
25
|
+
getStagedFiles(cwd: string): Promise<string[]>;
|
|
26
|
+
commit(cwd: string, message: string): Promise<string>;
|
|
27
|
+
unstageFiles(cwd: string, files: string[]): Promise<void>;
|
|
28
|
+
writeMarkerFile(projectPath: string): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Default git operations implementation.
|
|
32
|
+
*/
|
|
33
|
+
export declare const defaultGitOperations: IGitOperations;
|
|
34
|
+
/**
|
|
35
|
+
* Context for commit tools.
|
|
36
|
+
*/
|
|
37
|
+
export interface CommitToolContext {
|
|
38
|
+
projectPath: string;
|
|
39
|
+
/** Optional git operations (for testing). */
|
|
40
|
+
gitOperations?: IGitOperations;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Arguments for commit tool.
|
|
44
|
+
*/
|
|
45
|
+
export interface CommitArgs {
|
|
46
|
+
message: string;
|
|
47
|
+
files?: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse and validate commit arguments.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseCommitArgs(args: Record<string, unknown> | undefined): CommitArgs;
|
|
53
|
+
/**
|
|
54
|
+
* Validation result for commit message.
|
|
55
|
+
*/
|
|
56
|
+
export interface CommitValidationResult {
|
|
57
|
+
valid: boolean;
|
|
58
|
+
errors: string[];
|
|
59
|
+
warnings: string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate commit message and branch.
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateCommit(message: string, context: CommitToolContext): Promise<CommitValidationResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Format validation errors for response.
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatValidationErrors(errors: string[], warnings: string[]): string;
|
|
69
|
+
/**
|
|
70
|
+
* Format successful commit response.
|
|
71
|
+
*/
|
|
72
|
+
export declare function formatCommitSuccess(output: string, warnings: string[]): string;
|
|
73
|
+
/**
|
|
74
|
+
* Handle commit tool.
|
|
75
|
+
*/
|
|
76
|
+
export declare function handleCommit(args: CommitArgs, context: CommitToolContext): Promise<ToolResponse>;
|
|
77
|
+
//# sourceMappingURL=commit-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/commit-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,eAAO,MAAM,YAAY,ojBAaxB,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0C7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAiClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AASD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,UAAU,CASrF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,sBAAsB,CAAC,CA4CjC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAOnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAO9E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAuEvB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for git commit operations.
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { isString, isStringArray } from '../utils/type-guards.js';
|
|
10
|
+
import { GlanceyError, wrapError } from '../utils/errors.js';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
/**
|
|
13
|
+
* Commit rules reminder text.
|
|
14
|
+
*/
|
|
15
|
+
export const COMMIT_RULES = `
|
|
16
|
+
## Commit Rules Reminder
|
|
17
|
+
|
|
18
|
+
1. **Branch**: Must be on a feature branch, not main/master
|
|
19
|
+
2. **Message length**: Subject line must be ≤72 characters
|
|
20
|
+
3. **Imperative mood**: "Add feature" not "Added feature"
|
|
21
|
+
4. **Single responsibility**: One logical change per commit
|
|
22
|
+
5. **Body format**: Only "Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
23
|
+
|
|
24
|
+
**Signs of multi-responsibility** (split into separate commits):
|
|
25
|
+
- Message contains "and" connecting actions
|
|
26
|
+
- Message lists multiple changes with commas
|
|
27
|
+
- Changes span unrelated files/features
|
|
28
|
+
`;
|
|
29
|
+
/**
|
|
30
|
+
* Execute a git command safely using spawn with array arguments.
|
|
31
|
+
*/
|
|
32
|
+
export function gitSpawn(args, options) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const proc = spawn('git', args, {
|
|
35
|
+
cwd: options.cwd,
|
|
36
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
37
|
+
});
|
|
38
|
+
let stdout = '';
|
|
39
|
+
let stderr = '';
|
|
40
|
+
proc.stdout.on('data', (data) => {
|
|
41
|
+
stdout += data.toString();
|
|
42
|
+
});
|
|
43
|
+
proc.stderr.on('data', (data) => {
|
|
44
|
+
stderr += data.toString();
|
|
45
|
+
});
|
|
46
|
+
proc.on('error', (err) => {
|
|
47
|
+
reject(err);
|
|
48
|
+
});
|
|
49
|
+
proc.on('close', (code) => {
|
|
50
|
+
if (code === 0) {
|
|
51
|
+
resolve({ stdout, stderr });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const exitCode = code ?? 1;
|
|
55
|
+
const error = new Error(`git ${args[0]} failed with code ${exitCode}: ${stderr}`);
|
|
56
|
+
error.code = exitCode;
|
|
57
|
+
error.stdout = stdout;
|
|
58
|
+
error.stderr = stderr;
|
|
59
|
+
reject(error);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (options.stdin !== undefined) {
|
|
63
|
+
proc.stdin.write(options.stdin);
|
|
64
|
+
proc.stdin.end();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
proc.stdin.end();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Default git operations implementation.
|
|
73
|
+
*/
|
|
74
|
+
export const defaultGitOperations = {
|
|
75
|
+
async getCurrentBranch(cwd) {
|
|
76
|
+
const { stdout } = await execAsync('git branch --show-current', { cwd });
|
|
77
|
+
return stdout.trim();
|
|
78
|
+
},
|
|
79
|
+
async stageFiles(cwd, files) {
|
|
80
|
+
await gitSpawn(['add', '--', ...files], { cwd });
|
|
81
|
+
},
|
|
82
|
+
async getStagedFiles(cwd) {
|
|
83
|
+
const { stdout } = await gitSpawn(['diff', '--cached', '--name-only'], { cwd });
|
|
84
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
85
|
+
},
|
|
86
|
+
async commit(cwd, message) {
|
|
87
|
+
const fullMessage = `${message}\n\nCo-Authored-By: Claude <noreply@anthropic.com>`;
|
|
88
|
+
const { stdout } = await gitSpawn(['commit', '-F', '-'], { cwd, stdin: fullMessage });
|
|
89
|
+
return stdout.trim();
|
|
90
|
+
},
|
|
91
|
+
async unstageFiles(cwd, files) {
|
|
92
|
+
await gitSpawn(['reset', 'HEAD', '--', ...files], { cwd });
|
|
93
|
+
},
|
|
94
|
+
writeMarkerFile(projectPath) {
|
|
95
|
+
const markerPath = path.join(projectPath, '.git', 'MCP_COMMIT_MARKER');
|
|
96
|
+
try {
|
|
97
|
+
fs.writeFileSync(markerPath, Date.now().toString());
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Ignore marker write failures - non-critical
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Get git operations instance.
|
|
106
|
+
*/
|
|
107
|
+
function getGitOperations(context) {
|
|
108
|
+
return context.gitOperations ?? defaultGitOperations;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse and validate commit arguments.
|
|
112
|
+
*/
|
|
113
|
+
export function parseCommitArgs(args) {
|
|
114
|
+
const message = isString(args?.message) ? args.message : '';
|
|
115
|
+
const files = isStringArray(args?.files) ? args.files : [];
|
|
116
|
+
if (!message) {
|
|
117
|
+
throw new GlanceyError('message is required', 'validation', { tool: 'commit' });
|
|
118
|
+
}
|
|
119
|
+
return { message, files };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Validate commit message and branch.
|
|
123
|
+
*/
|
|
124
|
+
export async function validateCommit(message, context) {
|
|
125
|
+
const git = getGitOperations(context);
|
|
126
|
+
const errors = [];
|
|
127
|
+
const warnings = [];
|
|
128
|
+
// Check 1: Not on main/master branch
|
|
129
|
+
try {
|
|
130
|
+
const currentBranch = await git.getCurrentBranch(context.projectPath);
|
|
131
|
+
if (currentBranch === 'main' || currentBranch === 'master') {
|
|
132
|
+
errors.push(`Cannot commit directly to ${currentBranch}. Create a feature branch first:\n git checkout -b feature/your-feature-name`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
errors.push('Failed to determine current branch. Are you in a git repository?');
|
|
137
|
+
}
|
|
138
|
+
// Check 2: Message length
|
|
139
|
+
const subjectLine = message.split('\n')[0];
|
|
140
|
+
if (subjectLine.length > 72) {
|
|
141
|
+
errors.push(`Subject line is ${subjectLine.length} characters (max 72). Shorten it.`);
|
|
142
|
+
}
|
|
143
|
+
// Check 3: Imperative mood (heuristic)
|
|
144
|
+
const pastTensePatterns = /^(Added|Fixed|Updated|Changed|Removed|Implemented|Created|Deleted|Modified|Refactored|Merged)\b/i;
|
|
145
|
+
if (pastTensePatterns.test(subjectLine)) {
|
|
146
|
+
warnings.push(`Subject may not be imperative mood. Use "Add" not "Added", "Fix" not "Fixed", etc.`);
|
|
147
|
+
}
|
|
148
|
+
// Check 4: Single responsibility (heuristic)
|
|
149
|
+
const multiResponsibilityPatterns = /\b(and|,)\s+(add|fix|update|change|remove|implement|create|delete|modify|refactor)\b/i;
|
|
150
|
+
if (multiResponsibilityPatterns.test(subjectLine)) {
|
|
151
|
+
errors.push(`Message suggests multiple responsibilities. Split into separate commits.`);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
valid: errors.length === 0,
|
|
155
|
+
errors,
|
|
156
|
+
warnings,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Format validation errors for response.
|
|
161
|
+
*/
|
|
162
|
+
export function formatValidationErrors(errors, warnings) {
|
|
163
|
+
let text = `## Commit Blocked\n\n**Errors:**\n${errors.map((e) => `- ${e}`).join('\n')}`;
|
|
164
|
+
if (warnings.length > 0) {
|
|
165
|
+
text += `\n\n**Warnings:**\n${warnings.map((w) => `- ${w}`).join('\n')}`;
|
|
166
|
+
}
|
|
167
|
+
text += `\n${COMMIT_RULES}`;
|
|
168
|
+
return text;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Format successful commit response.
|
|
172
|
+
*/
|
|
173
|
+
export function formatCommitSuccess(output, warnings) {
|
|
174
|
+
let response = `## Commit Successful\n\n${output}`;
|
|
175
|
+
if (warnings.length > 0) {
|
|
176
|
+
response += `\n\n**Warnings:**\n${warnings.map((w) => `- ${w}`).join('\n')}`;
|
|
177
|
+
}
|
|
178
|
+
response += `\n${COMMIT_RULES}`;
|
|
179
|
+
return response;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Handle commit tool.
|
|
183
|
+
*/
|
|
184
|
+
export async function handleCommit(args, context) {
|
|
185
|
+
const git = getGitOperations(context);
|
|
186
|
+
// Validate commit message and branch
|
|
187
|
+
const validation = await validateCommit(args.message, context);
|
|
188
|
+
if (!validation.valid) {
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: 'text',
|
|
193
|
+
text: formatValidationErrors(validation.errors, validation.warnings),
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
isError: true,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Track files we staged for potential rollback
|
|
200
|
+
const stagedByUs = [];
|
|
201
|
+
// Stage files if provided
|
|
202
|
+
if (args.files && args.files.length > 0) {
|
|
203
|
+
try {
|
|
204
|
+
await git.stageFiles(context.projectPath, args.files);
|
|
205
|
+
stagedByUs.push(...args.files);
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
throw wrapError('Failed to stage files', 'git', e, { files: args.files });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Check if there are staged changes
|
|
212
|
+
try {
|
|
213
|
+
const stagedFiles = await git.getStagedFiles(context.projectPath);
|
|
214
|
+
if (stagedFiles.length === 0) {
|
|
215
|
+
throw new GlanceyError('No staged changes to commit. Stage files first or pass files parameter.', 'git');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
if (e instanceof GlanceyError) {
|
|
220
|
+
throw e;
|
|
221
|
+
}
|
|
222
|
+
throw wrapError('Failed to check staged changes', 'git', e);
|
|
223
|
+
}
|
|
224
|
+
// Write marker file
|
|
225
|
+
git.writeMarkerFile(context.projectPath);
|
|
226
|
+
// Execute commit
|
|
227
|
+
try {
|
|
228
|
+
const output = await git.commit(context.projectPath, args.message);
|
|
229
|
+
return {
|
|
230
|
+
content: [
|
|
231
|
+
{
|
|
232
|
+
type: 'text',
|
|
233
|
+
text: formatCommitSuccess(output, validation.warnings),
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch (e) {
|
|
239
|
+
// Rollback: unstage files we staged if commit failed
|
|
240
|
+
if (stagedByUs.length > 0) {
|
|
241
|
+
try {
|
|
242
|
+
await git.unstageFiles(context.projectPath, stagedByUs);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Ignore rollback failures - best effort
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
throw wrapError('Git commit failed', 'git', e, { message: args.message });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=commit-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-handlers.js","sourceRoot":"","sources":["../../src/tools/commit-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for index operations.
|
|
3
|
+
*/
|
|
4
|
+
import type { IndexProgress } from '../search/indexer.js';
|
|
5
|
+
import type { ToolContext, ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Arguments for index_codebase tool.
|
|
8
|
+
*/
|
|
9
|
+
export interface IndexCodebaseArgs {
|
|
10
|
+
patterns?: string[];
|
|
11
|
+
excludePatterns?: string[];
|
|
12
|
+
forceReindex?: boolean;
|
|
13
|
+
autoRepair?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse and validate index_codebase arguments.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseIndexCodebaseArgs(args: Record<string, unknown> | undefined): IndexCodebaseArgs;
|
|
19
|
+
/**
|
|
20
|
+
* Handle index_codebase tool.
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleIndexCodebase(args: IndexCodebaseArgs, context: ToolContext, onProgress?: (progress: IndexProgress) => void): Promise<ToolResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Handle get_index_status tool.
|
|
25
|
+
*/
|
|
26
|
+
export declare function handleGetIndexStatus(context: ToolContext): Promise<ToolResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Handle clear_index tool.
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleClearIndex(context: ToolContext): Promise<ToolResponse>;
|
|
31
|
+
//# sourceMappingURL=index-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/index-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,iBAAiB,CAOnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAC7C,OAAO,CAAC,YAAY,CAAC,CAmBvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAetF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAGlF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for index operations.
|
|
3
|
+
*/
|
|
4
|
+
import { createToolResponse } from './types.js';
|
|
5
|
+
import { isStringArray, isBoolean } from '../utils/type-guards.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse and validate index_codebase arguments.
|
|
8
|
+
*/
|
|
9
|
+
export function parseIndexCodebaseArgs(args) {
|
|
10
|
+
return {
|
|
11
|
+
patterns: isStringArray(args?.patterns) ? args.patterns : undefined,
|
|
12
|
+
excludePatterns: isStringArray(args?.excludePatterns) ? args.excludePatterns : undefined,
|
|
13
|
+
forceReindex: isBoolean(args?.forceReindex) ? args.forceReindex : false,
|
|
14
|
+
autoRepair: isBoolean(args?.autoRepair) ? args.autoRepair : false,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Handle index_codebase tool.
|
|
19
|
+
*/
|
|
20
|
+
export async function handleIndexCodebase(args, context, onProgress) {
|
|
21
|
+
const result = await context.indexer.indexCodebase(args.patterns, args.excludePatterns, args.forceReindex ?? false, onProgress, args.autoRepair ?? false);
|
|
22
|
+
const mode = result.repaired
|
|
23
|
+
? 'Repaired (corruption detected)'
|
|
24
|
+
: result.incremental
|
|
25
|
+
? 'Incremental update'
|
|
26
|
+
: 'Full reindex';
|
|
27
|
+
return createToolResponse(`${mode}: Indexed ${result.filesIndexed} files, total ${result.chunksCreated} chunks.`, context.toolGuidance);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Handle get_index_status tool.
|
|
31
|
+
*/
|
|
32
|
+
export async function handleGetIndexStatus(context) {
|
|
33
|
+
const status = await context.indexer.getStatus();
|
|
34
|
+
let statusText = JSON.stringify(status, null, 2);
|
|
35
|
+
if (status.corrupted) {
|
|
36
|
+
statusText =
|
|
37
|
+
`**WARNING: Index corruption detected!**\n` +
|
|
38
|
+
`Reason: ${status.corruptionReason}\n` +
|
|
39
|
+
`\nTo repair, either:\n` +
|
|
40
|
+
`1. Run \`index_codebase\` with \`autoRepair: true\`\n` +
|
|
41
|
+
`2. Run \`clear_index\` followed by \`index_codebase\`\n\n` +
|
|
42
|
+
statusText;
|
|
43
|
+
}
|
|
44
|
+
return createToolResponse(statusText, context.toolGuidance);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Handle clear_index tool.
|
|
48
|
+
*/
|
|
49
|
+
export async function handleClearIndex(context) {
|
|
50
|
+
await context.indexer.clearIndex();
|
|
51
|
+
return createToolResponse('Index cleared.', context.toolGuidance);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index-handlers.js.map
|