Jelajahi Sumber

Fix all linter errors (and fix the lint scripts too) (#2958)

Chris Estreich 10 bulan lalu
induk
melakukan
1924e10e72
93 mengubah file dengan 181 tambahan dan 413 penghapusan
  1. 1 1
      package.json
  2. 1 21
      src/__mocks__/fs/promises.ts
  3. 3 3
      src/__mocks__/services/ripgrep/index.ts
  4. 1 1
      src/api/index.ts
  5. 4 4
      src/api/providers/__tests__/bedrock-custom-arn.test.ts
  6. 6 16
      src/api/providers/__tests__/bedrock-invokedModelId.test.ts
  7. 1 4
      src/api/providers/__tests__/bedrock.test.ts
  8. 1 1
      src/api/providers/__tests__/gemini.test.ts
  9. 3 3
      src/api/providers/__tests__/lmstudio.test.ts
  10. 4 3
      src/api/providers/__tests__/mistral.test.ts
  11. 3 3
      src/api/providers/__tests__/ollama.test.ts
  12. 3 3
      src/api/providers/__tests__/openai-native.test.ts
  13. 2 2
      src/api/providers/__tests__/openai.test.ts
  14. 2 4
      src/api/providers/__tests__/requesty.test.ts
  15. 1 2
      src/api/providers/__tests__/vertex.test.ts
  16. 1 1
      src/api/providers/__tests__/vscode-lm.test.ts
  17. 4 3
      src/api/providers/bedrock.ts
  18. 0 1
      src/api/providers/gemini.ts
  19. 6 18
      src/api/providers/human-relay.ts
  20. 1 10
      src/api/providers/mistral.ts
  21. 1 1
      src/api/providers/openai.ts
  22. 1 10
      src/api/providers/vertex.ts
  23. 1 1
      src/api/providers/vscode-lm.ts
  24. 10 10
      src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts
  25. 0 1
      src/api/transform/cache-strategy/base-strategy.ts
  26. 0 4
      src/api/transform/cache-strategy/multi-point-strategy.ts
  27. 2 2
      src/api/transform/mistral-format.ts
  28. 7 7
      src/core/__tests__/Cline.test.ts
  29. 1 4
      src/core/__tests__/mode-validator.test.ts
  30. 1 2
      src/core/__tests__/read-file-maxReadFileLine.test.ts
  31. 1 2
      src/core/__tests__/read-file-xml.test.ts
  32. 4 4
      src/core/config/ProviderSettingsManager.ts
  33. 2 2
      src/core/config/__tests__/CustomModesManager.test.ts
  34. 2 2
      src/core/diff/strategies/multi-search-replace.ts
  35. 3 3
      src/core/ignore/__mocks__/RooIgnoreController.ts
  36. 0 1
      src/core/ignore/__tests__/RooIgnoreController.security.test.ts
  37. 0 3
      src/core/ignore/__tests__/RooIgnoreController.test.ts
  38. 1 1
      src/core/mentions/index.ts
  39. 1 1
      src/core/prompts/__tests__/sections.test.ts
  40. 0 14
      src/core/prompts/__tests__/system.test.ts
  41. 1 1
      src/core/prompts/instructions/create-mode.ts
  42. 4 4
      src/core/prompts/sections/__tests__/custom-instructions.test.ts
  43. 1 1
      src/core/prompts/sections/modes.ts
  44. 3 8
      src/core/prompts/sections/rules.ts
  45. 2 8
      src/core/prompts/sections/system-info.ts
  46. 2 3
      src/core/prompts/system.ts
  47. 1 1
      src/core/prompts/tools/new-task.ts
  48. 0 4
      src/core/tools/applyDiffTool.ts
  49. 1 1
      src/core/tools/useMcpToolTool.ts
  50. 6 11
      src/core/webview/__tests__/ClineProvider.test.ts
  51. 3 3
      src/integrations/misc/__tests__/line-counter.test.ts
  52. 3 15
      src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts
  53. 0 1
      src/integrations/misc/extract-text.ts
  54. 0 1
      src/integrations/misc/read-lines.ts
  55. 2 1
      src/integrations/terminal/TerminalProcess.ts
  56. 0 1
      src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts
  57. 0 1
      src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts
  58. 0 1
      src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts
  59. 0 15
      src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts
  60. 1 1
      src/integrations/workspace/WorkspaceTracker.ts
  61. 0 1
      src/services/browser/BrowserSession.ts
  62. 1 2
      src/services/browser/browserDiscovery.ts
  63. 1 1
      src/services/checkpoints/types.ts
  64. 1 13
      src/services/glob/__mocks__/list-files.ts
  65. 1 5
      src/services/mcp/McpHub.ts
  66. 0 1
      src/services/mcp/__tests__/McpHub.test.ts
  67. 3 3
      src/services/ripgrep/index.ts
  68. 0 3
      src/services/tree-sitter/__tests__/helpers.ts
  69. 2 2
      src/services/tree-sitter/__tests__/index.test.ts
  70. 3 2
      src/services/tree-sitter/__tests__/markdownIntegration.test.ts
  71. 8 20
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts
  72. 4 18
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts
  73. 2 8
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts
  74. 4 8
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts
  75. 2 10
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts
  76. 2 8
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts
  77. 6 10
      src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts
  78. 3 7
      src/services/tree-sitter/index.ts
  79. 1 1
      src/shared/__tests__/vsCodeSelectorUtils.test.ts
  80. 2 1
      src/utils/__tests__/git.test.ts
  81. 1 1
      src/utils/logging/CompactLogger.ts
  82. 1 2
      webview-ui/package.json
  83. 2 1
      webview-ui/src/components/chat/ChatTextArea.tsx
  84. 0 1
      webview-ui/src/components/chat/ContextMenu.tsx
  85. 1 1
      webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx
  86. 2 2
      webview-ui/src/components/common/CodeBlock.tsx
  87. 2 2
      webview-ui/src/components/common/MarkdownBlock.tsx
  88. 1 1
      webview-ui/src/components/prompts/PromptsView.tsx
  89. 0 1
      webview-ui/src/components/settings/AutoApproveSettings.tsx
  90. 0 1
      webview-ui/src/components/settings/ExperimentalSettings.tsx
  91. 7 8
      webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx
  92. 1 6
      webview-ui/src/components/ui/__tests__/select-dropdown.test.tsx
  93. 1 1
      webview-ui/src/components/ui/chat/ChatMessage.tsx

+ 1 - 1
package.json

@@ -364,7 +364,7 @@
 		"install-webview": "cd webview-ui && npm install",
 		"install-webview": "cd webview-ui && npm install",
 		"install-e2e": "cd e2e && npm install",
 		"install-e2e": "cd e2e && npm install",
 		"lint": "npm-run-all -l -p lint:*",
 		"lint": "npm-run-all -l -p lint:*",
-		"lint:extension": "eslint src/**/*.ts",
+		"lint:extension": "eslint src --ext .ts",
 		"lint:webview": "cd webview-ui && npm run lint",
 		"lint:webview": "cd webview-ui && npm run lint",
 		"lint:e2e": "cd e2e && npm run lint",
 		"lint:e2e": "cd e2e && npm run lint",
 		"check-types": "npm-run-all -l -p check-types:*",
 		"check-types": "npm-run-all -l -p check-types:*",

+ 1 - 21
src/__mocks__/fs/promises.ts

@@ -24,26 +24,6 @@ const baseTestDirs = [
 	"/test/log/path",
 	"/test/log/path",
 ]
 ]
 
 
-// Helper function to format instructions
-const formatInstructions = (sections: string[]): string => {
-	const joinedSections = sections.filter(Boolean).join("\n\n")
-	return joinedSections
-		? `
-====
-
-USER'S CUSTOM INSTRUCTIONS
-
-The following additional instructions are provided by the user, and should be followed to the best of your ability without interfering with the TOOL USE guidelines.
-
-${joinedSections}`
-		: ""
-}
-
-// Helper function to format rule content
-const formatRuleContent = (ruleFile: string, content: string): string => {
-	return `Rules:\n# Rules from ${ruleFile}:\n${content}`
-}
-
 type RuleFiles = {
 type RuleFiles = {
 	".clinerules-code": string
 	".clinerules-code": string
 	".clinerules-ask": string
 	".clinerules-ask": string
@@ -65,7 +45,7 @@ const ensureDirectoryExists = (path: string) => {
 }
 }
 
 
 const mockFs = {
 const mockFs = {
-	readFile: jest.fn().mockImplementation(async (filePath: string, encoding?: string) => {
+	readFile: jest.fn().mockImplementation(async (filePath: string, _encoding?: string) => {
 		// Return stored content if it exists
 		// Return stored content if it exists
 		if (mockFiles.has(filePath)) {
 		if (mockFiles.has(filePath)) {
 			return mockFiles.get(filePath)
 			return mockFiles.get(filePath)

+ 3 - 3
src/__mocks__/services/ripgrep/index.ts

@@ -13,7 +13,7 @@
  * @param vscodeAppRoot - Optional VSCode app root path (can be undefined)
  * @param vscodeAppRoot - Optional VSCode app root path (can be undefined)
  * @returns Promise resolving to a mock path to the ripgrep binary
  * @returns Promise resolving to a mock path to the ripgrep binary
  */
  */
-export const getBinPath = jest.fn().mockImplementation(async (vscodeAppRoot?: string): Promise<string> => {
+export const getBinPath = jest.fn().mockImplementation(async (_vscodeAppRoot?: string): Promise<string> => {
 	return "/mock/path/to/rg"
 	return "/mock/path/to/rg"
 })
 })
 
 
@@ -30,7 +30,7 @@ export const getBinPath = jest.fn().mockImplementation(async (vscodeAppRoot?: st
 export const regexSearchFiles = jest
 export const regexSearchFiles = jest
 	.fn()
 	.fn()
 	.mockImplementation(
 	.mockImplementation(
-		async (cwd?: string, directoryPath?: string, regex?: string, filePattern?: string): Promise<string> => {
+		async (_cwd?: string, _directoryPath?: string, _regex?: string, _filePattern?: string): Promise<string> => {
 			return "Mock search results"
 			return "Mock search results"
 		},
 		},
 	)
 	)
@@ -43,6 +43,6 @@ export const regexSearchFiles = jest
  * @param maxLength - Optional maximum length (can be undefined)
  * @param maxLength - Optional maximum length (can be undefined)
  * @returns The original line or empty string if undefined
  * @returns The original line or empty string if undefined
  */
  */
-export const truncateLine = jest.fn().mockImplementation((line?: string, maxLength?: number): string => {
+export const truncateLine = jest.fn().mockImplementation((line?: string, _maxLength?: number): string => {
 	return line || ""
 	return line || ""
 })
 })

+ 1 - 1
src/api/index.ts

@@ -77,7 +77,7 @@ export function buildApiHandler(configuration: ApiConfiguration): ApiHandler {
 		case "requesty":
 		case "requesty":
 			return new RequestyHandler(options)
 			return new RequestyHandler(options)
 		case "human-relay":
 		case "human-relay":
-			return new HumanRelayHandler(options)
+			return new HumanRelayHandler()
 		case "fake-ai":
 		case "fake-ai":
 			return new FakeAIHandler(options)
 			return new FakeAIHandler(options)
 		case "xai":
 		case "xai":

+ 4 - 4
src/api/providers/__tests__/bedrock-custom-arn.test.ts

@@ -1,3 +1,5 @@
+// npx jest src/api/providers/__tests__/bedrock-custom-arn.test.ts
+
 import { AwsBedrockHandler } from "../bedrock"
 import { AwsBedrockHandler } from "../bedrock"
 import { ApiHandlerOptions } from "../../../shared/api"
 import { ApiHandlerOptions } from "../../../shared/api"
 import { logger } from "../../../utils/logging"
 import { logger } from "../../../utils/logging"
@@ -52,9 +54,6 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => {
 	}
 	}
 })
 })
 
 
-// Get mock module for testing
-const bedrockMock = jest.requireMock("@aws-sdk/client-bedrock-runtime").__mock
-
 describe("Bedrock ARN Handling", () => {
 describe("Bedrock ARN Handling", () => {
 	// Helper function to create a handler with specific options
 	// Helper function to create a handler with specific options
 	const createHandler = (options: Partial<ApiHandlerOptions> = {}) => {
 	const createHandler = (options: Partial<ApiHandlerOptions> = {}) => {
@@ -236,7 +235,8 @@ describe("Bedrock ARN Handling", () => {
 			// Create handler with ARN region different from provided region
 			// Create handler with ARN region different from provided region
 			const arn =
 			const arn =
 				"arn:aws:bedrock:eu-west-1:123456789012:inference-profile/anthropic.claude-3-sonnet-20240229-v1:0"
 				"arn:aws:bedrock:eu-west-1:123456789012:inference-profile/anthropic.claude-3-sonnet-20240229-v1:0"
-			const handler = createHandler({
+
+			createHandler({
 				awsCustomArn: arn,
 				awsCustomArn: arn,
 				awsRegion: "us-east-1", // Different from ARN region
 				awsRegion: "us-east-1", // Different from ARN region
 			})
 			})

+ 6 - 16
src/api/providers/__tests__/bedrock-invokedModelId.test.ts

@@ -1,3 +1,9 @@
+// npx jest src/api/providers/__tests__/bedrock-invokedModelId.test.ts
+
+import { ApiHandlerOptions } from "../../../shared/api"
+
+import { AwsBedrockHandler, StreamEvent } from "../bedrock"
+
 // Mock AWS SDK credential providers and Bedrock client
 // Mock AWS SDK credential providers and Bedrock client
 jest.mock("@aws-sdk/credential-providers", () => ({
 jest.mock("@aws-sdk/credential-providers", () => ({
 	fromIni: jest.fn().mockReturnValue({
 	fromIni: jest.fn().mockReturnValue({
@@ -62,11 +68,6 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => {
 	}
 	}
 })
 })
 
 
-import { AwsBedrockHandler, StreamEvent } from "../bedrock"
-import { ApiHandlerOptions } from "../../../shared/api"
-import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime"
-const { fromIni } = require("@aws-sdk/credential-providers")
-
 describe("AwsBedrockHandler with invokedModelId", () => {
 describe("AwsBedrockHandler with invokedModelId", () => {
 	let mockSend: jest.Mock
 	let mockSend: jest.Mock
 
 
@@ -279,17 +280,6 @@ describe("AwsBedrockHandler with invokedModelId", () => {
 			}
 			}
 		})
 		})
 
 
-		// Mock getModel to return expected values
-		const getModelSpy = jest.spyOn(handler, "getModel").mockReturnValue({
-			id: "anthropic.claude-3-5-sonnet-20241022-v2:0",
-			info: {
-				maxTokens: 4096,
-				contextWindow: 128_000,
-				supportsPromptCache: false,
-				supportsImages: true,
-			},
-		})
-
 		// Create a message generator
 		// Create a message generator
 		const messageGenerator = handler.createMessage("system prompt", [{ role: "user", content: "user message" }])
 		const messageGenerator = handler.createMessage("system prompt", [{ role: "user", content: "user message" }])
 
 

+ 1 - 4
src/api/providers/__tests__/bedrock.test.ts

@@ -22,11 +22,8 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => ({
 }))
 }))
 
 
 import { AwsBedrockHandler } from "../bedrock"
 import { AwsBedrockHandler } from "../bedrock"
-import { MessageContent } from "../../../shared/api"
-import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime"
+
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
-const { fromIni } = require("@aws-sdk/credential-providers")
-import { logger } from "../../../utils/logging"
 
 
 describe("AwsBedrockHandler", () => {
 describe("AwsBedrockHandler", () => {
 	let handler: AwsBedrockHandler
 	let handler: AwsBedrockHandler

+ 1 - 1
src/api/providers/__tests__/gemini.test.ts

@@ -95,7 +95,7 @@ describe("GeminiHandler", () => {
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should throw before yielding any chunks
 					// Should throw before yielding any chunks
 				}
 				}
 			}).rejects.toThrow()
 			}).rejects.toThrow()

+ 3 - 3
src/api/providers/__tests__/lmstudio.test.ts

@@ -1,7 +1,7 @@
+import { Anthropic } from "@anthropic-ai/sdk"
+
 import { LmStudioHandler } from "../lmstudio"
 import { LmStudioHandler } from "../lmstudio"
 import { ApiHandlerOptions } from "../../../shared/api"
 import { ApiHandlerOptions } from "../../../shared/api"
-import OpenAI from "openai"
-import { Anthropic } from "@anthropic-ai/sdk"
 
 
 // Mock OpenAI client
 // Mock OpenAI client
 const mockCreate = jest.fn()
 const mockCreate = jest.fn()
@@ -120,7 +120,7 @@ describe("LmStudioHandler", () => {
 			const stream = handler.createMessage(systemPrompt, messages)
 			const stream = handler.createMessage(systemPrompt, messages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should not reach here
 					// Should not reach here
 				}
 				}
 			}).rejects.toThrow("Please check the LM Studio developer logs to debug what went wrong")
 			}).rejects.toThrow("Please check the LM Studio developer logs to debug what went wrong")

+ 4 - 3
src/api/providers/__tests__/mistral.test.ts

@@ -1,6 +1,7 @@
-import { MistralHandler } from "../mistral"
-import { ApiHandlerOptions, mistralDefaultModelId } from "../../../shared/api"
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
+
+import { MistralHandler } from "../mistral"
+import { ApiHandlerOptions } from "../../../shared/api"
 import { ApiStreamTextChunk } from "../../transform/stream"
 import { ApiStreamTextChunk } from "../../transform/stream"
 
 
 // Mock Mistral client
 // Mock Mistral client
@@ -9,7 +10,7 @@ jest.mock("@mistralai/mistralai", () => {
 	return {
 	return {
 		Mistral: jest.fn().mockImplementation(() => ({
 		Mistral: jest.fn().mockImplementation(() => ({
 			chat: {
 			chat: {
-				stream: mockCreate.mockImplementation(async (options) => {
+				stream: mockCreate.mockImplementation(async (_options) => {
 					const stream = {
 					const stream = {
 						[Symbol.asyncIterator]: async function* () {
 						[Symbol.asyncIterator]: async function* () {
 							yield {
 							yield {

+ 3 - 3
src/api/providers/__tests__/ollama.test.ts

@@ -1,7 +1,7 @@
+import { Anthropic } from "@anthropic-ai/sdk"
+
 import { OllamaHandler } from "../ollama"
 import { OllamaHandler } from "../ollama"
 import { ApiHandlerOptions } from "../../../shared/api"
 import { ApiHandlerOptions } from "../../../shared/api"
-import OpenAI from "openai"
-import { Anthropic } from "@anthropic-ai/sdk"
 
 
 // Mock OpenAI client
 // Mock OpenAI client
 const mockCreate = jest.fn()
 const mockCreate = jest.fn()
@@ -120,7 +120,7 @@ describe("OllamaHandler", () => {
 			const stream = handler.createMessage(systemPrompt, messages)
 			const stream = handler.createMessage(systemPrompt, messages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should not reach here
 					// Should not reach here
 				}
 				}
 			}).rejects.toThrow("API Error")
 			}).rejects.toThrow("API Error")

+ 3 - 3
src/api/providers/__tests__/openai-native.test.ts

@@ -1,7 +1,7 @@
+import { Anthropic } from "@anthropic-ai/sdk"
+
 import { OpenAiNativeHandler } from "../openai-native"
 import { OpenAiNativeHandler } from "../openai-native"
 import { ApiHandlerOptions } from "../../../shared/api"
 import { ApiHandlerOptions } from "../../../shared/api"
-import OpenAI from "openai"
-import { Anthropic } from "@anthropic-ai/sdk"
 
 
 // Mock OpenAI client
 // Mock OpenAI client
 const mockCreate = jest.fn()
 const mockCreate = jest.fn()
@@ -116,7 +116,7 @@ describe("OpenAiNativeHandler", () => {
 			mockCreate.mockRejectedValueOnce(new Error("API Error"))
 			mockCreate.mockRejectedValueOnce(new Error("API Error"))
 			const stream = handler.createMessage(systemPrompt, messages)
 			const stream = handler.createMessage(systemPrompt, messages)
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should not reach here
 					// Should not reach here
 				}
 				}
 			}).rejects.toThrow("API Error")
 			}).rejects.toThrow("API Error")

+ 2 - 2
src/api/providers/__tests__/openai.test.ts

@@ -176,7 +176,7 @@ describe("OpenAiHandler", () => {
 			const stream = handler.createMessage("system prompt", testMessages)
 			const stream = handler.createMessage("system prompt", testMessages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should not reach here
 					// Should not reach here
 				}
 				}
 			}).rejects.toThrow("API Error")
 			}).rejects.toThrow("API Error")
@@ -191,7 +191,7 @@ describe("OpenAiHandler", () => {
 			const stream = handler.createMessage("system prompt", testMessages)
 			const stream = handler.createMessage("system prompt", testMessages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should not reach here
 					// Should not reach here
 				}
 				}
 			}).rejects.toThrow("Rate limit exceeded")
 			}).rejects.toThrow("Rate limit exceeded")

+ 2 - 4
src/api/providers/__tests__/requesty.test.ts

@@ -1,6 +1,6 @@
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
 import OpenAI from "openai"
 import OpenAI from "openai"
-import { ApiHandlerOptions, ModelInfo, requestyDefaultModelInfo } from "../../../shared/api"
+import { ApiHandlerOptions, ModelInfo } from "../../../shared/api"
 import { RequestyHandler } from "../requesty"
 import { RequestyHandler } from "../requesty"
 import { convertToOpenAiMessages } from "../../transform/openai-format"
 import { convertToOpenAiMessages } from "../../transform/openai-format"
 import { convertToR1Format } from "../../transform/r1-format"
 import { convertToR1Format } from "../../transform/r1-format"
@@ -40,9 +40,7 @@ describe("RequestyHandler", () => {
 		jest.clearAllMocks()
 		jest.clearAllMocks()
 
 
 		// Setup mock create function that preserves params
 		// Setup mock create function that preserves params
-		let lastParams: any
-		mockCreate = jest.fn().mockImplementation((params) => {
-			lastParams = params
+		mockCreate = jest.fn().mockImplementation((_params) => {
 			return {
 			return {
 				[Symbol.asyncIterator]: async function* () {
 				[Symbol.asyncIterator]: async function* () {
 					yield {
 					yield {

+ 1 - 2
src/api/providers/__tests__/vertex.test.ts

@@ -2,7 +2,6 @@
 
 
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
 import { AnthropicVertex } from "@anthropic-ai/vertex-sdk"
 import { AnthropicVertex } from "@anthropic-ai/vertex-sdk"
-import { BetaThinkingConfigParam } from "@anthropic-ai/sdk/resources/beta"
 
 
 import { VertexHandler } from "../vertex"
 import { VertexHandler } from "../vertex"
 import { ApiStreamChunk } from "../../transform/stream"
 import { ApiStreamChunk } from "../../transform/stream"
@@ -388,7 +387,7 @@ describe("VertexHandler", () => {
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 
 
 			await expect(async () => {
 			await expect(async () => {
-				for await (const chunk of stream) {
+				for await (const _chunk of stream) {
 					// Should throw before yielding any chunks
 					// Should throw before yielding any chunks
 				}
 				}
 			}).rejects.toThrow("Vertex API error")
 			}).rejects.toThrow("Vertex API error")

+ 1 - 1
src/api/providers/__tests__/vscode-lm.test.ts

@@ -21,7 +21,7 @@ jest.mock("vscode", () => {
 
 
 	return {
 	return {
 		workspace: {
 		workspace: {
-			onDidChangeConfiguration: jest.fn((callback) => ({
+			onDidChangeConfiguration: jest.fn((_callback) => ({
 				dispose: jest.fn(),
 				dispose: jest.fn(),
 			})),
 			})),
 		},
 		},

+ 4 - 3
src/api/providers/bedrock.ts

@@ -603,8 +603,8 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH
 			// Look for a pattern where the first segment before a dot doesn't contain dots or colons
 			// Look for a pattern where the first segment before a dot doesn't contain dots or colons
 			// and the remaining parts still contain at least one dot
 			// and the remaining parts still contain at least one dot
 			const genericPrefixMatch = modelId.match(/^([^.:]+)\.(.+\..+)$/)
 			const genericPrefixMatch = modelId.match(/^([^.:]+)\.(.+\..+)$/)
+
 			if (genericPrefixMatch) {
 			if (genericPrefixMatch) {
-				const genericPrefix = genericPrefixMatch[1] + "."
 				return genericPrefixMatch[2]
 				return genericPrefixMatch[2]
 			}
 			}
 		}
 		}
@@ -708,10 +708,11 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH
 		if (Array.isArray(content)) {
 		if (Array.isArray(content)) {
 			return content.map((block) => {
 			return content.map((block) => {
 				// Use destructuring to remove cachePoint property
 				// Use destructuring to remove cachePoint property
-				const { cachePoint, ...rest } = block
+				const { cachePoint: _, ...rest } = block
 				return rest
 				return rest
 			})
 			})
 		}
 		}
+
 		return content
 		return content
 	}
 	}
 
 
@@ -864,7 +865,7 @@ Suggestions:
 	/**
 	/**
 	 * Formats an error message based on the error type and context
 	 * Formats an error message based on the error type and context
 	 */
 	 */
-	private formatErrorMessage(error: unknown, errorType: string, isStreamContext: boolean): string {
+	private formatErrorMessage(error: unknown, errorType: string, _isStreamContext: boolean): string {
 		const definition = AwsBedrockHandler.ERROR_TYPES[errorType] || AwsBedrockHandler.ERROR_TYPES.GENERIC
 		const definition = AwsBedrockHandler.ERROR_TYPES[errorType] || AwsBedrockHandler.ERROR_TYPES.GENERIC
 		let template = definition.messageTemplate
 		let template = definition.messageTemplate
 
 

+ 0 - 1
src/api/providers/gemini.ts

@@ -4,7 +4,6 @@ import {
 	type GenerateContentResponseUsageMetadata,
 	type GenerateContentResponseUsageMetadata,
 	type GenerateContentParameters,
 	type GenerateContentParameters,
 	type Content,
 	type Content,
-	CreateCachedContentConfig,
 } from "@google/genai"
 } from "@google/genai"
 import NodeCache from "node-cache"
 import NodeCache from "node-cache"
 
 

+ 6 - 18
src/api/providers/human-relay.ts

@@ -1,23 +1,16 @@
-// filepath: e:\Project\Roo-Code\src\api\providers\human-relay.ts
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
-import { ApiHandlerOptions, ModelInfo } from "../../shared/api"
+import * as vscode from "vscode"
+
+import { ModelInfo } from "../../shared/api"
 import { ApiHandler, SingleCompletionHandler } from "../index"
 import { ApiHandler, SingleCompletionHandler } from "../index"
 import { ApiStream } from "../transform/stream"
 import { ApiStream } from "../transform/stream"
-import * as vscode from "vscode"
-import { ExtensionMessage } from "../../shared/ExtensionMessage"
-import { getPanel } from "../../activate/registerCommands" // Import the getPanel function
 
 
 /**
 /**
  * Human Relay API processor
  * Human Relay API processor
  * This processor does not directly call the API, but interacts with the model through human operations copy and paste.
  * This processor does not directly call the API, but interacts with the model through human operations copy and paste.
  */
  */
 export class HumanRelayHandler implements ApiHandler, SingleCompletionHandler {
 export class HumanRelayHandler implements ApiHandler, SingleCompletionHandler {
-	private options: ApiHandlerOptions
-
-	constructor(options: ApiHandlerOptions) {
-		this.options = options
-	}
-	countTokens(content: Array<Anthropic.Messages.ContentBlockParam>): Promise<number> {
+	countTokens(_content: Array<Anthropic.Messages.ContentBlockParam>): Promise<number> {
 		return Promise.resolve(0)
 		return Promise.resolve(0)
 	}
 	}
 
 
@@ -125,15 +118,10 @@ async function showHumanRelayDialog(promptText: string): Promise<string | undefi
 		vscode.commands.executeCommand(
 		vscode.commands.executeCommand(
 			"roo-cline.registerHumanRelayCallback",
 			"roo-cline.registerHumanRelayCallback",
 			requestId,
 			requestId,
-			(response: string | undefined) => {
-				resolve(response)
-			},
+			(response: string | undefined) => resolve(response),
 		)
 		)
 
 
 		// Open the dialog box directly using the current panel
 		// Open the dialog box directly using the current panel
-		vscode.commands.executeCommand("roo-cline.showHumanRelayDialog", {
-			requestId,
-			promptText,
-		})
+		vscode.commands.executeCommand("roo-cline.showHumanRelayDialog", { requestId, promptText })
 	})
 	})
 }
 }

+ 1 - 10
src/api/providers/mistral.ts

@@ -1,16 +1,7 @@
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Mistral } from "@mistralai/mistralai"
 import { Mistral } from "@mistralai/mistralai"
 import { SingleCompletionHandler } from "../"
 import { SingleCompletionHandler } from "../"
-import {
-	ApiHandlerOptions,
-	mistralDefaultModelId,
-	MistralModelId,
-	mistralModels,
-	ModelInfo,
-	openAiNativeDefaultModelId,
-	OpenAiNativeModelId,
-	openAiNativeModels,
-} from "../../shared/api"
+import { ApiHandlerOptions, mistralDefaultModelId, MistralModelId, mistralModels, ModelInfo } from "../../shared/api"
 import { convertToMistralMessages } from "../transform/mistral-format"
 import { convertToMistralMessages } from "../transform/mistral-format"
 import { ApiStream } from "../transform/stream"
 import { ApiStream } from "../transform/stream"
 import { BaseProvider } from "./base-provider"
 import { BaseProvider } from "./base-provider"

+ 1 - 1
src/api/providers/openai.ts

@@ -226,7 +226,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl
 		}
 		}
 	}
 	}
 
 
-	protected processUsageMetrics(usage: any, modelInfo?: ModelInfo): ApiStreamUsageChunk {
+	protected processUsageMetrics(usage: any, _modelInfo?: ModelInfo): ApiStreamUsageChunk {
 		return {
 		return {
 			type: "usage",
 			type: "usage",
 			inputTokens: usage?.prompt_tokens || 0,
 			inputTokens: usage?.prompt_tokens || 0,

+ 1 - 10
src/api/providers/vertex.ts

@@ -57,15 +57,6 @@ interface VertexMessage extends Omit<Anthropic.Messages.MessageParam, "content">
 	content: string | VertexContentBlock[]
 	content: string | VertexContentBlock[]
 }
 }
 
 
-interface VertexMessageCreateParams {
-	model: string
-	max_tokens: number
-	temperature: number
-	system: string | VertexTextBlock[]
-	messages: VertexMessage[]
-	stream: boolean
-}
-
 interface VertexMessageResponse {
 interface VertexMessageResponse {
 	content: Array<{ type: "text"; text: string }>
 	content: Array<{ type: "text"; text: string }>
 }
 }
@@ -259,7 +250,7 @@ export class VertexHandler extends BaseProvider implements SingleCompletionHandl
 
 
 	private async *createClaudeMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream {
 	private async *createClaudeMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream {
 		const model = this.getModel()
 		const model = this.getModel()
-		let { id, info, temperature, maxTokens, thinking } = model
+		let { id, temperature, maxTokens, thinking } = model
 		const useCache = model.info.supportsPromptCache
 		const useCache = model.info.supportsPromptCache
 
 
 		// Find indices of user messages that we want to cache
 		// Find indices of user messages that we want to cache

+ 1 - 1
src/api/providers/vscode-lm.ts

@@ -122,7 +122,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan
 				family: "lm",
 				family: "lm",
 				version: "1.0",
 				version: "1.0",
 				maxInputTokens: 8192,
 				maxInputTokens: 8192,
-				sendRequest: async (messages, options, token) => {
+				sendRequest: async (_messages, _options, _token) => {
 					// Provide a minimal implementation
 					// Provide a minimal implementation
 					return {
 					return {
 						stream: (async function* () {
 						stream: (async function* () {

+ 10 - 10
src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts

@@ -1,10 +1,10 @@
-import { MultiPointStrategy } from "../multi-point-strategy"
-import { CacheStrategy } from "../base-strategy"
-import { CacheStrategyConfig, ModelInfo, CachePointPlacement } from "../types"
 import { ContentBlock, SystemContentBlock } from "@aws-sdk/client-bedrock-runtime"
 import { ContentBlock, SystemContentBlock } from "@aws-sdk/client-bedrock-runtime"
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
+import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime"
+
+import { MultiPointStrategy } from "../multi-point-strategy"
+import { CacheStrategyConfig, ModelInfo, CachePointPlacement } from "../types"
 import { AwsBedrockHandler } from "../../../providers/bedrock"
 import { AwsBedrockHandler } from "../../../providers/bedrock"
-import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime"
 
 
 // Common test utilities
 // Common test utilities
 const defaultModelInfo: ModelInfo = {
 const defaultModelInfo: ModelInfo = {
@@ -363,7 +363,7 @@ describe("Cache Strategy", () => {
 
 
 			// Call the method that uses convertToBedrockConverseMessages
 			// Call the method that uses convertToBedrockConverseMessages
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
-			for await (const chunk of stream) {
+			for await (const _chunk of stream) {
 				// Just consume the stream
 				// Just consume the stream
 			}
 			}
 
 
@@ -404,7 +404,7 @@ describe("Cache Strategy", () => {
 
 
 			// Call the method that uses convertToBedrockConverseMessages
 			// Call the method that uses convertToBedrockConverseMessages
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
-			for await (const chunk of stream) {
+			for await (const _chunk of stream) {
 				// Just consume the stream
 				// Just consume the stream
 			}
 			}
 
 
@@ -505,7 +505,7 @@ describe("Cache Strategy", () => {
 
 
 			// Call the method that uses convertToBedrockConverseMessages
 			// Call the method that uses convertToBedrockConverseMessages
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
-			for await (const chunk of stream) {
+			for await (const _chunk of stream) {
 				// Just consume the stream
 				// Just consume the stream
 			}
 			}
 
 
@@ -555,7 +555,7 @@ describe("Cache Strategy", () => {
 
 
 			// Call the method that uses convertToBedrockConverseMessages
 			// Call the method that uses convertToBedrockConverseMessages
 			const stream = handler.createMessage(systemPrompt, mockMessages)
 			const stream = handler.createMessage(systemPrompt, mockMessages)
-			for await (const chunk of stream) {
+			for await (const _chunk of stream) {
 				// Just consume the stream
 				// Just consume the stream
 			}
 			}
 
 
@@ -931,7 +931,7 @@ describe("Cache Strategy", () => {
 				// (260 tokens from messages 7-8 plus 400 tokens from the new messages)
 				// (260 tokens from messages 7-8 plus 400 tokens from the new messages)
 
 
 				// Create messages matching Example 5 from documentation
 				// Create messages matching Example 5 from documentation
-				const messages = [
+				const _messages = [
 					createMessage("user", "Tell me about machine learning.", 100),
 					createMessage("user", "Tell me about machine learning.", 100),
 					createMessage("assistant", "Machine learning is a field of study...", 200),
 					createMessage("assistant", "Machine learning is a field of study...", 200),
 					createMessage("user", "What about deep learning?", 100),
 					createMessage("user", "What about deep learning?", 100),
@@ -948,7 +948,7 @@ describe("Cache Strategy", () => {
 				]
 				]
 
 
 				// Previous cache point placements from Example 4
 				// Previous cache point placements from Example 4
-				const previousCachePointPlacements: CachePointPlacement[] = [
+				const _previousCachePointPlacements: CachePointPlacement[] = [
 					{
 					{
 						index: 2, // After the second user message
 						index: 2, // After the second user message
 						type: "message",
 						type: "message",

+ 0 - 1
src/api/transform/cache-strategy/base-strategy.ts

@@ -1,7 +1,6 @@
 import { Anthropic } from "@anthropic-ai/sdk"
 import { Anthropic } from "@anthropic-ai/sdk"
 import { ContentBlock, SystemContentBlock, Message, ConversationRole } from "@aws-sdk/client-bedrock-runtime"
 import { ContentBlock, SystemContentBlock, Message, ConversationRole } from "@aws-sdk/client-bedrock-runtime"
 import { CacheStrategyConfig, CacheResult, CachePointPlacement } from "./types"
 import { CacheStrategyConfig, CacheResult, CachePointPlacement } from "./types"
-import { logger } from "../../../utils/logging"
 
 
 export abstract class CacheStrategy {
 export abstract class CacheStrategy {
 	/**
 	/**

+ 0 - 4
src/api/transform/cache-strategy/multi-point-strategy.ts

@@ -95,9 +95,6 @@ export class MultiPointStrategy extends CacheStrategy {
 			return placements
 			return placements
 		}
 		}
 
 
-		// Calculate total tokens in the conversation
-		const totalTokens = this.config.messages.reduce((acc, curr) => acc + this.estimateTokenCount(curr), 0)
-
 		// Calculate tokens in new messages (added since last cache point placement)
 		// Calculate tokens in new messages (added since last cache point placement)
 		const lastPreviousIndex = previousPlacements[previousPlacements.length - 1].index
 		const lastPreviousIndex = previousPlacements[previousPlacements.length - 1].index
 		const newMessagesTokens = this.config.messages
 		const newMessagesTokens = this.config.messages
@@ -181,7 +178,6 @@ export class MultiPointStrategy extends CacheStrategy {
 						} else if (i === smallestGapIndex) {
 						} else if (i === smallestGapIndex) {
 							// Replace with a combined placement
 							// Replace with a combined placement
 							const combinedEndIndex = previousPlacements[i + 1].index
 							const combinedEndIndex = previousPlacements[i + 1].index
-							const combinedTokens = tokensBetweenPlacements[i] + tokensBetweenPlacements[i + 1]
 
 
 							// Find the optimal placement within this combined range
 							// Find the optimal placement within this combined range
 							const startOfRange = i === 0 ? 0 : previousPlacements[i - 1].index + 1
 							const startOfRange = i === 0 ? 0 : previousPlacements[i - 1].index + 1

+ 2 - 2
src/api/transform/mistral-format.ts

@@ -21,7 +21,7 @@ export function convertToMistralMessages(anthropicMessages: Anthropic.Messages.M
 			})
 			})
 		} else {
 		} else {
 			if (anthropicMessage.role === "user") {
 			if (anthropicMessage.role === "user") {
-				const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce<{
+				const { nonToolMessages } = anthropicMessage.content.reduce<{
 					nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[]
 					nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[]
 					toolMessages: Anthropic.ToolResultBlockParam[]
 					toolMessages: Anthropic.ToolResultBlockParam[]
 				}>(
 				}>(
@@ -53,7 +53,7 @@ export function convertToMistralMessages(anthropicMessages: Anthropic.Messages.M
 					})
 					})
 				}
 				}
 			} else if (anthropicMessage.role === "assistant") {
 			} else if (anthropicMessage.role === "assistant") {
-				const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce<{
+				const { nonToolMessages } = anthropicMessage.content.reduce<{
 					nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[]
 					nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[]
 					toolMessages: Anthropic.ToolUseBlockParam[]
 					toolMessages: Anthropic.ToolUseBlockParam[]
 				}>(
 				}>(

+ 7 - 7
src/core/__tests__/Cline.test.ts

@@ -191,19 +191,19 @@ describe("Cline", () => {
 
 
 					return undefined
 					return undefined
 				}),
 				}),
-				update: jest.fn().mockImplementation((key, value) => Promise.resolve()),
+				update: jest.fn().mockImplementation((_key, _value) => Promise.resolve()),
 				keys: jest.fn().mockReturnValue([]),
 				keys: jest.fn().mockReturnValue([]),
 			},
 			},
 			globalStorageUri: storageUri,
 			globalStorageUri: storageUri,
 			workspaceState: {
 			workspaceState: {
-				get: jest.fn().mockImplementation((key) => undefined),
-				update: jest.fn().mockImplementation((key, value) => Promise.resolve()),
+				get: jest.fn().mockImplementation((_key) => undefined),
+				update: jest.fn().mockImplementation((_key, _value) => Promise.resolve()),
 				keys: jest.fn().mockReturnValue([]),
 				keys: jest.fn().mockReturnValue([]),
 			},
 			},
 			secrets: {
 			secrets: {
-				get: jest.fn().mockImplementation((key) => Promise.resolve(undefined)),
-				store: jest.fn().mockImplementation((key, value) => Promise.resolve()),
-				delete: jest.fn().mockImplementation((key) => Promise.resolve()),
+				get: jest.fn().mockImplementation((_key) => Promise.resolve(undefined)),
+				store: jest.fn().mockImplementation((_key, _value) => Promise.resolve()),
+				delete: jest.fn().mockImplementation((_key) => Promise.resolve()),
 			},
 			},
 			extensionUri: {
 			extensionUri: {
 				fsPath: "/mock/extension/path",
 				fsPath: "/mock/extension/path",
@@ -385,7 +385,7 @@ describe("Cline", () => {
 				// Mock the method with a stable implementation
 				// Mock the method with a stable implementation
 				jest.spyOn(Cline.prototype, "getEnvironmentDetails").mockImplementation(
 				jest.spyOn(Cline.prototype, "getEnvironmentDetails").mockImplementation(
 					// Use 'any' type to allow for dynamic test properties
 					// Use 'any' type to allow for dynamic test properties
-					async function (this: any, verbose: boolean = false): Promise<string> {
+					async function (this: any, _verbose: boolean = false): Promise<string> {
 						// Use test-specific mock if available
 						// Use test-specific mock if available
 						if (this._mockGetEnvironmentDetails) {
 						if (this._mockGetEnvironmentDetails) {
 							return this._mockGetEnvironmentDetails()
 							return this._mockGetEnvironmentDetails()

+ 1 - 4
src/core/__tests__/mode-validator.test.ts

@@ -1,6 +1,6 @@
 // npx jest src/core/__tests__/mode-validator.test.ts
 // npx jest src/core/__tests__/mode-validator.test.ts
 
 
-import { isToolAllowedForMode, getModeConfig, modes, ModeConfig } from "../../shared/modes"
+import { isToolAllowedForMode, modes, ModeConfig } from "../../shared/modes"
 import { TOOL_GROUPS } from "../../shared/tools"
 import { TOOL_GROUPS } from "../../shared/tools"
 import { validateToolUse } from "../mode-validator"
 import { validateToolUse } from "../mode-validator"
 
 
@@ -10,7 +10,6 @@ describe("mode-validator", () => {
 	describe("isToolAllowedForMode", () => {
 	describe("isToolAllowedForMode", () => {
 		describe("code mode", () => {
 		describe("code mode", () => {
 			it("allows all code mode tools", () => {
 			it("allows all code mode tools", () => {
-				const mode = getModeConfig(codeMode)
 				// Code mode has all groups
 				// Code mode has all groups
 				Object.entries(TOOL_GROUPS).forEach(([_, config]) => {
 				Object.entries(TOOL_GROUPS).forEach(([_, config]) => {
 					config.tools.forEach((tool: string) => {
 					config.tools.forEach((tool: string) => {
@@ -26,7 +25,6 @@ describe("mode-validator", () => {
 
 
 		describe("architect mode", () => {
 		describe("architect mode", () => {
 			it("allows configured tools", () => {
 			it("allows configured tools", () => {
-				const mode = getModeConfig(architectMode)
 				// Architect mode has read, browser, and mcp groups
 				// Architect mode has read, browser, and mcp groups
 				const architectTools = [
 				const architectTools = [
 					...TOOL_GROUPS.read.tools,
 					...TOOL_GROUPS.read.tools,
@@ -41,7 +39,6 @@ describe("mode-validator", () => {
 
 
 		describe("ask mode", () => {
 		describe("ask mode", () => {
 			it("allows configured tools", () => {
 			it("allows configured tools", () => {
-				const mode = getModeConfig(askMode)
 				// Ask mode has read, browser, and mcp groups
 				// Ask mode has read, browser, and mcp groups
 				const askTools = [...TOOL_GROUPS.read.tools, ...TOOL_GROUPS.browser.tools, ...TOOL_GROUPS.mcp.tools]
 				const askTools = [...TOOL_GROUPS.read.tools, ...TOOL_GROUPS.browser.tools, ...TOOL_GROUPS.mcp.tools]
 				askTools.forEach((tool) => {
 				askTools.forEach((tool) => {

+ 1 - 2
src/core/__tests__/read-file-maxReadFileLine.test.ts

@@ -8,7 +8,6 @@ import { extractTextFromFile } from "../../integrations/misc/extract-text"
 import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
 import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
 import { isBinaryFile } from "isbinaryfile"
 import { isBinaryFile } from "isbinaryfile"
 import { ReadFileToolUse } from "../../shared/tools"
 import { ReadFileToolUse } from "../../shared/tools"
-import { ToolUsage } from "../../schemas"
 
 
 // Mock dependencies
 // Mock dependencies
 jest.mock("../../integrations/misc/line-counter")
 jest.mock("../../integrations/misc/line-counter")
@@ -100,7 +99,7 @@ describe("read_file tool with maxReadFileLine setting", () => {
 		mockInputContent = fileContent
 		mockInputContent = fileContent
 
 
 		// Setup the extractTextFromFile mock implementation with the current mockInputContent
 		// Setup the extractTextFromFile mock implementation with the current mockInputContent
-		mockedExtractTextFromFile.mockImplementation((filePath) => {
+		mockedExtractTextFromFile.mockImplementation((_filePath) => {
 			const actual = jest.requireActual("../../integrations/misc/extract-text")
 			const actual = jest.requireActual("../../integrations/misc/extract-text")
 			return Promise.resolve(actual.addLineNumbers(mockInputContent))
 			return Promise.resolve(actual.addLineNumbers(mockInputContent))
 		})
 		})

+ 1 - 2
src/core/__tests__/read-file-xml.test.ts

@@ -8,7 +8,6 @@ import { extractTextFromFile } from "../../integrations/misc/extract-text"
 import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
 import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
 import { isBinaryFile } from "isbinaryfile"
 import { isBinaryFile } from "isbinaryfile"
 import { ReadFileToolUse } from "../../shared/tools"
 import { ReadFileToolUse } from "../../shared/tools"
-import { ToolUsage } from "../../schemas"
 
 
 // Mock dependencies
 // Mock dependencies
 jest.mock("../../integrations/misc/line-counter")
 jest.mock("../../integrations/misc/line-counter")
@@ -22,7 +21,7 @@ jest.mock("../../integrations/misc/extract-text", () => {
 		...actual,
 		...actual,
 		// Expose the spy so tests can access it
 		// Expose the spy so tests can access it
 		__addLineNumbersSpy: addLineNumbersSpy,
 		__addLineNumbersSpy: addLineNumbersSpy,
-		extractTextFromFile: jest.fn().mockImplementation((filePath) => {
+		extractTextFromFile: jest.fn().mockImplementation((_filePath) => {
 			// Use the actual addLineNumbers function
 			// Use the actual addLineNumbers function
 			const content = mockInputContent
 			const content = mockInputContent
 			return Promise.resolve(actual.addLineNumbers(content))
 			return Promise.resolve(actual.addLineNumbers(content))

+ 4 - 4
src/core/config/ProviderSettingsManager.ts

@@ -1,7 +1,7 @@
 import { ExtensionContext } from "vscode"
 import { ExtensionContext } from "vscode"
 import { z, ZodError } from "zod"
 import { z, ZodError } from "zod"
 
 
-import { providerSettingsSchema, ApiConfigMeta, ProviderSettings } from "../../schemas"
+import { providerSettingsSchema, ApiConfigMeta } from "../../schemas"
 import { Mode, modes } from "../../shared/modes"
 import { Mode, modes } from "../../shared/modes"
 import { telemetryService } from "../../services/telemetry/TelemetryService"
 import { telemetryService } from "../../services/telemetry/TelemetryService"
 
 
@@ -78,7 +78,7 @@ export class ProviderSettingsManager {
 				let isDirty = false
 				let isDirty = false
 
 
 				// Ensure all configs have IDs.
 				// Ensure all configs have IDs.
-				for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
+				for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
 					if (!apiConfig.id) {
 					if (!apiConfig.id) {
 						apiConfig.id = this.generateId()
 						apiConfig.id = this.generateId()
 						isDirty = true
 						isDirty = true
@@ -130,7 +130,7 @@ export class ProviderSettingsManager {
 				rateLimitSeconds = 0
 				rateLimitSeconds = 0
 			}
 			}
 
 
-			for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
+			for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
 				if (apiConfig.rateLimitSeconds === undefined) {
 				if (apiConfig.rateLimitSeconds === undefined) {
 					apiConfig.rateLimitSeconds = rateLimitSeconds
 					apiConfig.rateLimitSeconds = rateLimitSeconds
 				}
 				}
@@ -162,7 +162,7 @@ export class ProviderSettingsManager {
 				fuzzyMatchThreshold = 1.0
 				fuzzyMatchThreshold = 1.0
 			}
 			}
 
 
-			for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
+			for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) {
 				if (apiConfig.diffEnabled === undefined) {
 				if (apiConfig.diffEnabled === undefined) {
 					apiConfig.diffEnabled = diffEnabled
 					apiConfig.diffEnabled = diffEnabled
 				}
 				}

+ 2 - 2
src/core/config/__tests__/CustomModesManager.test.ts

@@ -170,7 +170,7 @@ describe("CustomModesManager", () => {
 				throw new Error("File not found")
 				throw new Error("File not found")
 			})
 			})
 			;(fs.writeFile as jest.Mock).mockImplementation(
 			;(fs.writeFile as jest.Mock).mockImplementation(
-				async (path: string, content: string, encoding?: string) => {
+				async (path: string, content: string, _encoding?: string) => {
 					if (path === mockSettingsPath) {
 					if (path === mockSettingsPath) {
 						settingsContent = JSON.parse(content)
 						settingsContent = JSON.parse(content)
 					}
 					}
@@ -297,7 +297,7 @@ describe("CustomModesManager", () => {
 				throw new Error("File not found")
 				throw new Error("File not found")
 			})
 			})
 			;(fs.writeFile as jest.Mock).mockImplementation(
 			;(fs.writeFile as jest.Mock).mockImplementation(
-				async (path: string, content: string, encoding?: string) => {
+				async (path: string, content: string, _encoding?: string) => {
 					if (path === mockSettingsPath) {
 					if (path === mockSettingsPath) {
 						settingsContent = JSON.parse(content)
 						settingsContent = JSON.parse(content)
 					}
 					}

+ 2 - 2
src/core/diff/strategies/multi-search-replace.ts

@@ -203,7 +203,7 @@ Only use a single line of '=======' between search and replacement content, beca
 		const SEARCH_PREFIX = "<<<<<<<"
 		const SEARCH_PREFIX = "<<<<<<<"
 		const REPLACE_PREFIX = ">>>>>>>"
 		const REPLACE_PREFIX = ">>>>>>>"
 
 
-		const reportMergeConflictError = (found: string, expected: string) => ({
+		const reportMergeConflictError = (found: string, _expected: string) => ({
 			success: false,
 			success: false,
 			error:
 			error:
 				`ERROR: Special marker '${found}' found in your diff content at line ${state.line}:\n` +
 				`ERROR: Special marker '${found}' found in your diff content at line ${state.line}:\n` +
@@ -525,7 +525,7 @@ Only use a single line of '=======' between search and replacement content, beca
 			})
 			})
 
 
 			// Apply the replacement while preserving exact indentation
 			// Apply the replacement while preserving exact indentation
-			const indentedReplaceLines = replaceLines.map((line, i) => {
+			const indentedReplaceLines = replaceLines.map((line) => {
 				// Get the matched line's exact indentation
 				// Get the matched line's exact indentation
 				const matchedIndent = originalIndents[0] || ""
 				const matchedIndent = originalIndents[0] || ""
 
 

+ 3 - 3
src/core/ignore/__mocks__/RooIgnoreController.ts

@@ -3,7 +3,7 @@ export const LOCK_TEXT_SYMBOL = "\u{1F512}"
 export class RooIgnoreController {
 export class RooIgnoreController {
 	rooIgnoreContent: string | undefined = undefined
 	rooIgnoreContent: string | undefined = undefined
 
 
-	constructor(cwd: string) {
+	constructor(_cwd: string) {
 		// No-op constructor
 		// No-op constructor
 	}
 	}
 
 
@@ -12,12 +12,12 @@ export class RooIgnoreController {
 		return Promise.resolve()
 		return Promise.resolve()
 	}
 	}
 
 
-	validateAccess(filePath: string): boolean {
+	validateAccess(_filePath: string): boolean {
 		// Default implementation: allow all access
 		// Default implementation: allow all access
 		return true
 		return true
 	}
 	}
 
 
-	validateCommand(command: string): string | undefined {
+	validateCommand(_command: string): string | undefined {
 		// Default implementation: allow all commands
 		// Default implementation: allow all commands
 		return undefined
 		return undefined
 	}
 	}

+ 0 - 1
src/core/ignore/__tests__/RooIgnoreController.security.test.ts

@@ -4,7 +4,6 @@ import { RooIgnoreController } from "../RooIgnoreController"
 import * as path from "path"
 import * as path from "path"
 import * as fs from "fs/promises"
 import * as fs from "fs/promises"
 import { fileExistsAtPath } from "../../../utils/fs"
 import { fileExistsAtPath } from "../../../utils/fs"
-import * as vscode from "vscode"
 
 
 // Mock dependencies
 // Mock dependencies
 jest.mock("fs/promises")
 jest.mock("fs/promises")

+ 0 - 3
src/core/ignore/__tests__/RooIgnoreController.test.ts

@@ -433,9 +433,6 @@ describe("RooIgnoreController", () => {
 			mockFileExists.mockResolvedValue(true)
 			mockFileExists.mockResolvedValue(true)
 			mockReadFile.mockResolvedValue("node_modules")
 			mockReadFile.mockResolvedValue("node_modules")
 
 
-			// Find and trigger the onCreate handler
-			const onCreateHandler = mockWatcher.onDidCreate.mock.calls[0][0]
-
 			// Force reload of .rooignore content manually
 			// Force reload of .rooignore content manually
 			await controller.initialize()
 			await controller.initialize()
 
 

+ 1 - 1
src/core/mentions/index.ts

@@ -2,7 +2,7 @@ import * as vscode from "vscode"
 import * as path from "path"
 import * as path from "path"
 import { openFile } from "../../integrations/misc/open-file"
 import { openFile } from "../../integrations/misc/open-file"
 import { UrlContentFetcher } from "../../services/browser/UrlContentFetcher"
 import { UrlContentFetcher } from "../../services/browser/UrlContentFetcher"
-import { mentionRegexGlobal, formatGitSuggestion, type MentionSuggestion } from "../../shared/context-mentions"
+import { mentionRegexGlobal } from "../../shared/context-mentions"
 import fs from "fs/promises"
 import fs from "fs/promises"
 import { extractTextFromFile } from "../../integrations/misc/extract-text"
 import { extractTextFromFile } from "../../integrations/misc/extract-text"
 import { isBinaryFile } from "isbinaryfile"
 import { isBinaryFile } from "isbinaryfile"

+ 1 - 1
src/core/prompts/__tests__/sections.test.ts

@@ -35,7 +35,7 @@ describe("getCapabilitiesSection", () => {
 	const mockDiffStrategy: DiffStrategy = {
 	const mockDiffStrategy: DiffStrategy = {
 		getName: () => "MockStrategy",
 		getName: () => "MockStrategy",
 		getToolDescription: () => "apply_diff tool description",
 		getToolDescription: () => "apply_diff tool description",
-		applyDiff: async (originalContent: string, diffContent: string): Promise<DiffResult> => {
+		applyDiff: async (_originalContent: string, _diffContent: string): Promise<DiffResult> => {
 			return { success: true, content: "mock result" }
 			return { success: true, content: "mock result" }
 		},
 		},
 	}
 	}

+ 0 - 14
src/core/prompts/__tests__/system.test.ts

@@ -2,11 +2,9 @@ import * as vscode from "vscode"
 
 
 import { SYSTEM_PROMPT } from "../system"
 import { SYSTEM_PROMPT } from "../system"
 import { McpHub } from "../../../services/mcp/McpHub"
 import { McpHub } from "../../../services/mcp/McpHub"
-import { ClineProvider } from "../../../core/webview/ClineProvider"
 import { defaultModeSlug, modes, Mode, ModeConfig } from "../../../shared/modes"
 import { defaultModeSlug, modes, Mode, ModeConfig } from "../../../shared/modes"
 import "../../../utils/path" // Import path utils to get access to toPosix string extension.
 import "../../../utils/path" // Import path utils to get access to toPosix string extension.
 import { addCustomInstructions } from "../sections/custom-instructions"
 import { addCustomInstructions } from "../sections/custom-instructions"
-import { EXPERIMENT_IDS } from "../../../shared/experiments"
 import { MultiSearchReplaceDiffStrategy } from "../../diff/strategies/multi-search-replace"
 import { MultiSearchReplaceDiffStrategy } from "../../diff/strategies/multi-search-replace"
 
 
 // Mock the sections
 // Mock the sections
@@ -119,14 +117,6 @@ const mockContext = {
 	},
 	},
 } as unknown as vscode.ExtensionContext
 } as unknown as vscode.ExtensionContext
 
 
-// Create a minimal mock of ClineProvider
-const mockProvider = {
-	ensureMcpServersDirectoryExists: async () => "/mock/mcp/path",
-	ensureSettingsDirectoryExists: async () => "/mock/settings/path",
-	postMessageToWebview: async () => {},
-	context: mockContext,
-} as unknown as ClineProvider
-
 // Instead of extending McpHub, create a mock that implements just what we need
 // Instead of extending McpHub, create a mock that implements just what we need
 const createMockMcpHub = (): McpHub =>
 const createMockMcpHub = (): McpHub =>
 	({
 	({
@@ -481,7 +471,6 @@ describe("SYSTEM_PROMPT", () => {
 })
 })
 
 
 describe("addCustomInstructions", () => {
 describe("addCustomInstructions", () => {
-	let experiments: Record<string, boolean> | undefined
 	beforeAll(() => {
 	beforeAll(() => {
 		// Ensure fs mock is properly initialized
 		// Ensure fs mock is properly initialized
 		const mockFs = jest.requireMock("fs/promises")
 		const mockFs = jest.requireMock("fs/promises")
@@ -493,9 +482,6 @@ describe("addCustomInstructions", () => {
 			}
 			}
 			throw new Error(`ENOENT: no such file or directory, mkdir '${path}'`)
 			throw new Error(`ENOENT: no such file or directory, mkdir '${path}'`)
 		})
 		})
-
-		// Initialize experiments as undefined by default
-		experiments = undefined
 	})
 	})
 
 
 	beforeEach(() => {
 	beforeEach(() => {

+ 1 - 1
src/core/prompts/instructions/create-mode.ts

@@ -1,6 +1,6 @@
 import * as path from "path"
 import * as path from "path"
 import * as vscode from "vscode"
 import * as vscode from "vscode"
-import { promises as fs } from "fs"
+
 import { GlobalFileNames } from "../../../shared/globalFileNames"
 import { GlobalFileNames } from "../../../shared/globalFileNames"
 
 
 export async function createModeInstructions(context: vscode.ExtensionContext | undefined): Promise<string> {
 export async function createModeInstructions(context: vscode.ExtensionContext | undefined): Promise<string> {

+ 4 - 4
src/core/prompts/sections/__tests__/custom-instructions.test.ts

@@ -1,8 +1,8 @@
-import { loadRuleFiles, addCustomInstructions } from "../custom-instructions"
 import fs from "fs/promises"
 import fs from "fs/promises"
-import path from "path"
 import { PathLike } from "fs"
 import { PathLike } from "fs"
 
 
+import { loadRuleFiles, addCustomInstructions } from "../custom-instructions"
+
 // Mock fs/promises
 // Mock fs/promises
 jest.mock("fs/promises")
 jest.mock("fs/promises")
 
 
@@ -134,7 +134,7 @@ describe("loadRuleFiles", () => {
 		] as any)
 		] as any)
 
 
 		statMock.mockImplementation(
 		statMock.mockImplementation(
-			(path) =>
+			(_path) =>
 				({
 				({
 					isFile: jest.fn().mockReturnValue(true),
 					isFile: jest.fn().mockReturnValue(true),
 				}) as any,
 				}) as any,
@@ -428,7 +428,7 @@ describe("addCustomInstructions", () => {
 		] as any)
 		] as any)
 
 
 		statMock.mockImplementation(
 		statMock.mockImplementation(
-			(path) =>
+			(_path) =>
 				({
 				({
 					isFile: jest.fn().mockReturnValue(true),
 					isFile: jest.fn().mockReturnValue(true),
 				}) as any,
 				}) as any,

+ 1 - 1
src/core/prompts/sections/modes.ts

@@ -1,8 +1,8 @@
 import * as path from "path"
 import * as path from "path"
 import * as vscode from "vscode"
 import * as vscode from "vscode"
 import { promises as fs } from "fs"
 import { promises as fs } from "fs"
+
 import { ModeConfig, getAllModesWithPrompts } from "../../../shared/modes"
 import { ModeConfig, getAllModesWithPrompts } from "../../../shared/modes"
-import { GlobalFileNames } from "../../../shared/globalFileNames"
 
 
 export async function getModesSection(context: vscode.ExtensionContext): Promise<string> {
 export async function getModesSection(context: vscode.ExtensionContext): Promise<string> {
 	const settingsDir = path.join(context.globalStorageUri.fsPath, "settings")
 	const settingsDir = path.join(context.globalStorageUri.fsPath, "settings")

+ 3 - 8
src/core/prompts/sections/rules.ts

@@ -1,6 +1,6 @@
 import { DiffStrategy } from "../../../shared/tools"
 import { DiffStrategy } from "../../../shared/tools"
 
 
-function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Record<string, boolean>): string {
+function getEditingInstructions(diffStrategy?: DiffStrategy): string {
 	const instructions: string[] = []
 	const instructions: string[] = []
 	const availableTools: string[] = []
 	const availableTools: string[] = []
 
 
@@ -44,12 +44,7 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor
 	return instructions.join("\n")
 	return instructions.join("\n")
 }
 }
 
 
-export function getRulesSection(
-	cwd: string,
-	supportsComputerUse: boolean,
-	diffStrategy?: DiffStrategy,
-	experiments?: Record<string, boolean> | undefined,
-): string {
+export function getRulesSection(cwd: string, supportsComputerUse: boolean, diffStrategy?: DiffStrategy): string {
 	return `====
 	return `====
 
 
 RULES
 RULES
@@ -61,7 +56,7 @@ RULES
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
 - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
 - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using ${diffStrategy ? "apply_diff or write_to_file" : "write_to_file"} to make informed changes.
 - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using ${diffStrategy ? "apply_diff or write_to_file" : "write_to_file"} to make informed changes.
 - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser.
 - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser.
-${getEditingInstructions(diffStrategy, experiments)}
+${getEditingInstructions(diffStrategy)}
 - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode.
 - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode.
 - Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write.
 - Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write.
   * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$"
   * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$"

+ 2 - 8
src/core/prompts/sections/system-info.ts

@@ -1,15 +1,9 @@
-import defaultShell from "default-shell"
 import os from "os"
 import os from "os"
 import osName from "os-name"
 import osName from "os-name"
-import { Mode, ModeConfig, getModeBySlug, defaultModeSlug, isToolAllowedForMode } from "../../../shared/modes"
-import { getShell } from "../../../utils/shell"
-
-export function getSystemInfoSection(cwd: string, currentMode: Mode, customModes?: ModeConfig[]): string {
-	const findModeBySlug = (slug: string, modes?: ModeConfig[]) => modes?.find((m) => m.slug === slug)
 
 
-	const currentModeName = findModeBySlug(currentMode, customModes)?.name || currentMode
-	const codeModeName = findModeBySlug(defaultModeSlug, customModes)?.name || "Code"
+import { getShell } from "../../../utils/shell"
 
 
+export function getSystemInfoSection(cwd: string): string {
 	let details = `====
 	let details = `====
 
 
 SYSTEM INFORMATION
 SYSTEM INFORMATION

+ 2 - 3
src/core/prompts/system.ts

@@ -3,7 +3,6 @@ import {
 	modes,
 	modes,
 	CustomModePrompts,
 	CustomModePrompts,
 	PromptComponent,
 	PromptComponent,
-	getRoleDefinition,
 	defaultModeSlug,
 	defaultModeSlug,
 	ModeConfig,
 	ModeConfig,
 	getModeBySlug,
 	getModeBySlug,
@@ -87,9 +86,9 @@ ${getCapabilitiesSection(cwd, supportsComputerUse, mcpHub, effectiveDiffStrategy
 
 
 ${modesSection}
 ${modesSection}
 
 
-${getRulesSection(cwd, supportsComputerUse, effectiveDiffStrategy, experiments)}
+${getRulesSection(cwd, supportsComputerUse, effectiveDiffStrategy)}
 
 
-${getSystemInfoSection(cwd, mode, customModeConfigs)}
+${getSystemInfoSection(cwd)}
 
 
 ${getObjectiveSection()}
 ${getObjectiveSection()}
 
 

+ 1 - 1
src/core/prompts/tools/new-task.ts

@@ -1,6 +1,6 @@
 import { ToolArgs } from "./types"
 import { ToolArgs } from "./types"
 
 
-export function getNewTaskDescription(args: ToolArgs): string {
+export function getNewTaskDescription(_args: ToolArgs): string {
 	return `## new_task
 	return `## new_task
 Description: Create a new task with a specified starting mode and initial message. This tool instructs the system to create a new Cline instance in the given mode with the provided message.
 Description: Create a new task with a specified starting mode and initial message. This tool instructs the system to create a new Cline instance in the given mode with the provided message.
 
 

+ 0 - 4
src/core/tools/applyDiffTool.ts

@@ -96,8 +96,6 @@ export async function applyDiffTool(
 				error: "No diff strategy available",
 				error: "No diff strategy available",
 			}
 			}
 
 
-			let partResults = ""
-
 			if (!diffResult.success) {
 			if (!diffResult.success) {
 				cline.consecutiveMistakeCount++
 				cline.consecutiveMistakeCount++
 				const currentCount = (cline.consecutiveMistakeCountForApplyDiff.get(relPath) || 0) + 1
 				const currentCount = (cline.consecutiveMistakeCountForApplyDiff.get(relPath) || 0) + 1
@@ -116,8 +114,6 @@ export async function applyDiffTool(
 						formattedError = `<error_details>\n${
 						formattedError = `<error_details>\n${
 							failPart.error
 							failPart.error
 						}${errorDetails ? `\n\nDetails:\n${errorDetails}` : ""}\n</error_details>`
 						}${errorDetails ? `\n\nDetails:\n${errorDetails}` : ""}\n</error_details>`
-
-						partResults += formattedError
 					}
 					}
 				} else {
 				} else {
 					const errorDetails = diffResult.details ? JSON.stringify(diffResult.details, null, 2) : ""
 					const errorDetails = diffResult.details ? JSON.stringify(diffResult.details, null, 2) : ""

+ 1 - 1
src/core/tools/useMcpToolTool.ts

@@ -90,7 +90,7 @@ export async function useMcpToolTool(
 								return item.text
 								return item.text
 							}
 							}
 							if (item.type === "resource") {
 							if (item.type === "resource") {
-								const { blob, ...rest } = item.resource
+								const { blob: _, ...rest } = item.resource
 								return JSON.stringify(rest, null, 2)
 								return JSON.stringify(rest, null, 2)
 							}
 							}
 							return ""
 							return ""

+ 6 - 11
src/core/webview/__tests__/ClineProvider.test.ts

@@ -82,7 +82,7 @@ const mockAddCustomInstructions = jest.fn().mockResolvedValue("Combined instruct
 
 
 // Mock delay module
 // Mock delay module
 jest.mock("delay", () => {
 jest.mock("delay", () => {
-	const delayFn = (ms: number) => Promise.resolve()
+	const delayFn = (_ms: number) => Promise.resolve()
 	delayFn.createDelay = () => delayFn
 	delayFn.createDelay = () => delayFn
 	delayFn.reject = () => Promise.reject(new Error("Delay rejected"))
 	delayFn.reject = () => Promise.reject(new Error("Delay rejected"))
 	delayFn.range = () => Promise.resolve()
 	delayFn.range = () => Promise.resolve()
@@ -137,7 +137,7 @@ jest.mock("vscode", () => ({
 			get: jest.fn().mockReturnValue([]),
 			get: jest.fn().mockReturnValue([]),
 			update: jest.fn(),
 			update: jest.fn(),
 		}),
 		}),
-		onDidChangeConfiguration: jest.fn().mockImplementation((callback) => ({
+		onDidChangeConfiguration: jest.fn().mockImplementation(() => ({
 			dispose: jest.fn(),
 			dispose: jest.fn(),
 		})),
 		})),
 		onDidSaveTextDocument: jest.fn(() => ({ dispose: jest.fn() })),
 		onDidSaveTextDocument: jest.fn(() => ({ dispose: jest.fn() })),
@@ -212,7 +212,7 @@ jest.mock("../../Cline", () => ({
 	Cline: jest
 	Cline: jest
 		.fn()
 		.fn()
 		.mockImplementation(
 		.mockImplementation(
-			(provider, apiConfiguration, customInstructions, diffEnabled, fuzzyMatchThreshold, task, taskId) => ({
+			(_provider, _apiConfiguration, _customInstructions, _diffEnabled, _fuzzyMatchThreshold, _task, taskId) => ({
 				api: undefined,
 				api: undefined,
 				abortTask: jest.fn(),
 				abortTask: jest.fn(),
 				handleWebviewAskResponse: jest.fn(),
 				handleWebviewAskResponse: jest.fn(),
@@ -231,7 +231,7 @@ jest.mock("../../Cline", () => ({
 
 
 // Mock extract-text
 // Mock extract-text
 jest.mock("../../../integrations/misc/extract-text", () => ({
 jest.mock("../../../integrations/misc/extract-text", () => ({
-	extractTextFromFile: jest.fn().mockImplementation(async (filePath: string) => {
+	extractTextFromFile: jest.fn().mockImplementation(async (_filePath: string) => {
 		const content = "const x = 1;\nconst y = 2;\nconst z = 3;"
 		const content = "const x = 1;\nconst y = 2;\nconst z = 3;"
 		const lines = content.split("\n")
 		const lines = content.split("\n")
 		return lines.map((line, index) => `${index + 1} | ${line}`).join("\n")
 		return lines.map((line, index) => `${index + 1} | ${line}`).join("\n")
@@ -322,9 +322,7 @@ describe("ClineProvider", () => {
 				callback()
 				callback()
 				return { dispose: jest.fn() }
 				return { dispose: jest.fn() }
 			}),
 			}),
-			onDidChangeVisibility: jest.fn().mockImplementation((callback) => {
-				return { dispose: jest.fn() }
-			}),
+			onDidChangeVisibility: jest.fn().mockImplementation(() => ({ dispose: jest.fn() })),
 		} as unknown as vscode.WebviewView
 		} as unknown as vscode.WebviewView
 
 
 		provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", new ContextProxy(mockContext))
 		provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", new ContextProxy(mockContext))
@@ -1055,7 +1053,7 @@ describe("ClineProvider", () => {
 			// Reset and setup mock
 			// Reset and setup mock
 			mockAddCustomInstructions.mockClear()
 			mockAddCustomInstructions.mockClear()
 			mockAddCustomInstructions.mockImplementation(
 			mockAddCustomInstructions.mockImplementation(
-				(modeInstructions: string, globalInstructions: string, cwd: string) => {
+				(modeInstructions: string, globalInstructions: string, _cwd: string) => {
 					return Promise.resolve(modeInstructions || globalInstructions || "")
 					return Promise.resolve(modeInstructions || globalInstructions || "")
 				},
 				},
 			)
 			)
@@ -2028,7 +2026,6 @@ describe.skip("ContextProxy integration", () => {
 	let mockContext: vscode.ExtensionContext
 	let mockContext: vscode.ExtensionContext
 	let mockOutputChannel: vscode.OutputChannel
 	let mockOutputChannel: vscode.OutputChannel
 	let mockContextProxy: any
 	let mockContextProxy: any
-	let mockGlobalStateUpdate: jest.Mock
 
 
 	beforeEach(() => {
 	beforeEach(() => {
 		// Reset mocks
 		// Reset mocks
@@ -2050,8 +2047,6 @@ describe.skip("ContextProxy integration", () => {
 		mockOutputChannel = { appendLine: jest.fn() } as unknown as vscode.OutputChannel
 		mockOutputChannel = { appendLine: jest.fn() } as unknown as vscode.OutputChannel
 		mockContextProxy = new ContextProxy(mockContext)
 		mockContextProxy = new ContextProxy(mockContext)
 		provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", mockContextProxy)
 		provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", mockContextProxy)
-
-		mockGlobalStateUpdate = mockContext.globalState.update as jest.Mock
 	})
 	})
 
 
 	test("updateGlobalState uses contextProxy", async () => {
 	test("updateGlobalState uses contextProxy", async () => {

+ 3 - 3
src/integrations/misc/__tests__/line-counter.test.ts

@@ -64,7 +64,7 @@ describe("countFileLines", () => {
 		}
 		}
 
 
 		const mockReadStream = {
 		const mockReadStream = {
-			on: jest.fn().mockImplementation(function (this: any, event, callback) {
+			on: jest.fn().mockImplementation(function (this: any, _event, _callback) {
 				return this
 				return this
 			}),
 			}),
 		}
 		}
@@ -96,7 +96,7 @@ describe("countFileLines", () => {
 		}
 		}
 
 
 		const mockReadStream = {
 		const mockReadStream = {
-			on: jest.fn().mockImplementation(function (this: any, event, callback) {
+			on: jest.fn().mockImplementation(function (this: any, _event, _callback) {
 				return this
 				return this
 			}),
 			}),
 		}
 		}
@@ -126,7 +126,7 @@ describe("countFileLines", () => {
 		}
 		}
 
 
 		const mockReadStream = {
 		const mockReadStream = {
-			on: jest.fn().mockImplementation(function (this: any, event, callback) {
+			on: jest.fn().mockImplementation(function (this: any, _event, _callback) {
 				return this
 				return this
 			}),
 			}),
 		}
 		}

+ 3 - 15
src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts

@@ -354,25 +354,13 @@ function runBenchmark() {
 		const lineLimit = 500 // Standard line limit for truncation
 		const lineLimit = 500 // Standard line limit for truncation
 
 
 		console.log("\n--- Function 1: processCarriageReturns ---")
 		console.log("\n--- Function 1: processCarriageReturns ---")
-		const processCarriageReturnsResult = runPerformanceTest(
-			"processCarriageReturns",
-			processCarriageReturns,
-			testData,
-			iterations,
-		)
+		runPerformanceTest("processCarriageReturns", processCarriageReturns, testData, iterations)
 
 
 		console.log("\n--- Function 2: applyRunLengthEncoding ---")
 		console.log("\n--- Function 2: applyRunLengthEncoding ---")
-		const applyRunLengthEncodingResult = runPerformanceTest(
-			"applyRunLengthEncoding",
-			applyRunLengthEncoding,
-			testData,
-			iterations,
-		)
+		runPerformanceTest("applyRunLengthEncoding", applyRunLengthEncoding, testData, iterations)
 
 
 		console.log("\n--- Function 3: truncateOutput ---")
 		console.log("\n--- Function 3: truncateOutput ---")
-		const truncateOutputResult = runPerformanceTest("truncateOutput", truncateOutput, testData, iterations, [
-			lineLimit,
-		])
+		runPerformanceTest("truncateOutput", truncateOutput, testData, iterations, [lineLimit])
 
 
 		// Run baseline test to measure variance between identical runs
 		// Run baseline test to measure variance between identical runs
 		runBaselineTest(testData, Math.max(5, Math.floor(iterations / 4)))
 		runBaselineTest(testData, Math.max(5, Math.floor(iterations / 4)))

+ 0 - 1
src/integrations/misc/extract-text.ts

@@ -187,7 +187,6 @@ export function applyRunLengthEncoding(content: string): string {
 	let pos = 0
 	let pos = 0
 	let repeatCount = 0
 	let repeatCount = 0
 	let prevLine = null
 	let prevLine = null
-	let firstOccurrence = true
 
 
 	while (pos < content.length) {
 	while (pos < content.length) {
 		const nextNewlineIdx = content.indexOf("\n", pos) // Find next line feed (\n) index
 		const nextNewlineIdx = content.indexOf("\n", pos) // Find next line feed (\n) index

+ 0 - 1
src/integrations/misc/read-lines.ts

@@ -7,7 +7,6 @@
  * Now you can read a range of lines from a file
  * Now you can read a range of lines from a file
  */
  */
 import { createReadStream } from "fs"
 import { createReadStream } from "fs"
-import { createInterface } from "readline"
 
 
 const outOfRangeError = (filepath: string, n: number) => {
 const outOfRangeError = (filepath: string, n: number) => {
 	return new RangeError(`Line with index ${n} does not exist in '${filepath}'. Note that line indexing is zero-based`)
 	return new RangeError(`Line with index ${n} does not exist in '${filepath}'. Note that line indexing is zero-based`)

+ 2 - 1
src/integrations/terminal/TerminalProcess.ts

@@ -412,7 +412,8 @@ export class TerminalProcess extends EventEmitter<TerminalProcessEvents> {
 			}
 			}
 
 
 			// Wait for shell execution to complete and handle exit details
 			// Wait for shell execution to complete and handle exit details
-			const exitDetails = await shellExecutionComplete
+			await shellExecutionComplete
+
 			this.isHot = false
 			this.isHot = false
 
 
 			if (commandOutputStarted) {
 			if (commandOutputStarted) {

+ 0 - 1
src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts

@@ -221,7 +221,6 @@ async function testTerminalCommand(
 		const exitDetails = TerminalProcess.interpretExitCode(exitCode)
 		const exitDetails = TerminalProcess.interpretExitCode(exitCode)
 
 
 		// Set a timeout to avoid hanging tests
 		// Set a timeout to avoid hanging tests
-		let timeoutId: NodeJS.Timeout
 		const timeoutPromise = new Promise<void>((_, reject) => {
 		const timeoutPromise = new Promise<void>((_, reject) => {
 			timeoutId = setTimeout(() => {
 			timeoutId = setTimeout(() => {
 				reject(new Error("Test timed out after 1000ms"))
 				reject(new Error("Test timed out after 1000ms"))

+ 0 - 1
src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts

@@ -69,7 +69,6 @@ async function testCmdCommand(
 	let startTime: bigint = BigInt(0)
 	let startTime: bigint = BigInt(0)
 	let endTime: bigint = BigInt(0)
 	let endTime: bigint = BigInt(0)
 	let timeRecorded = false
 	let timeRecorded = false
-	let timeoutId: NodeJS.Timeout | undefined
 
 
 	// Create a mock terminal with shell integration
 	// Create a mock terminal with shell integration
 	const mockTerminal = {
 	const mockTerminal = {

+ 0 - 1
src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts

@@ -71,7 +71,6 @@ async function testPowerShellCommand(
 	let startTime: bigint = BigInt(0)
 	let startTime: bigint = BigInt(0)
 	let endTime: bigint = BigInt(0)
 	let endTime: bigint = BigInt(0)
 	let timeRecorded = false
 	let timeRecorded = false
-	let timeoutId: NodeJS.Timeout | undefined
 
 
 	// Create a mock terminal with shell integration
 	// Create a mock terminal with shell integration
 	const mockTerminal = {
 	const mockTerminal = {

+ 0 - 15
src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts

@@ -1,20 +1,5 @@
 import { TerminalProcess } from "../TerminalProcess"
 import { TerminalProcess } from "../TerminalProcess"
 import { execSync } from "child_process"
 import { execSync } from "child_process"
-import { Terminal } from "../Terminal"
-import * as vscode from "vscode"
-
-// Mock vscode.Terminal for testing
-const mockTerminal = {
-	name: "Test Terminal",
-	processId: Promise.resolve(123),
-	creationOptions: {},
-	exitStatus: undefined,
-	state: { isInteractedWith: true },
-	dispose: jest.fn(),
-	hide: jest.fn(),
-	show: jest.fn(),
-	sendText: jest.fn(),
-} as unknown as vscode.Terminal
 
 
 describe("TerminalProcess.interpretExitCode", () => {
 describe("TerminalProcess.interpretExitCode", () => {
 	it("should handle undefined exit code", () => {
 	it("should handle undefined exit code", () => {

+ 1 - 1
src/integrations/workspace/WorkspaceTracker.ts

@@ -1,10 +1,10 @@
 import * as vscode from "vscode"
 import * as vscode from "vscode"
 import * as path from "path"
 import * as path from "path"
+
 import { listFiles } from "../../services/glob/list-files"
 import { listFiles } from "../../services/glob/list-files"
 import { ClineProvider } from "../../core/webview/ClineProvider"
 import { ClineProvider } from "../../core/webview/ClineProvider"
 import { toRelativePath } from "../../utils/path"
 import { toRelativePath } from "../../utils/path"
 import { getWorkspacePath } from "../../utils/path"
 import { getWorkspacePath } from "../../utils/path"
-import { logger } from "../../utils/logging"
 
 
 const MAX_INITIAL_FILES = 1_000
 const MAX_INITIAL_FILES = 1_000
 
 

+ 0 - 1
src/services/browser/BrowserSession.ts

@@ -6,7 +6,6 @@ import { Browser, Page, ScreenshotOptions, TimeoutError, launch, connect } from
 import PCR from "puppeteer-chromium-resolver"
 import PCR from "puppeteer-chromium-resolver"
 import pWaitFor from "p-wait-for"
 import pWaitFor from "p-wait-for"
 import delay from "delay"
 import delay from "delay"
-import axios from "axios"
 import { fileExistsAtPath } from "../../utils/fs"
 import { fileExistsAtPath } from "../../utils/fs"
 import { BrowserActionResult } from "../../shared/ExtensionMessage"
 import { BrowserActionResult } from "../../shared/ExtensionMessage"
 import { discoverChromeHostUrl, tryChromeHostUrl } from "./browserDiscovery"
 import { discoverChromeHostUrl, tryChromeHostUrl } from "./browserDiscovery"

+ 1 - 2
src/services/browser/browserDiscovery.ts

@@ -45,8 +45,7 @@ export async function isPortOpen(host: string, port: number, timeout = 1000): Pr
 export async function tryChromeHostUrl(chromeHostUrl: string): Promise<boolean> {
 export async function tryChromeHostUrl(chromeHostUrl: string): Promise<boolean> {
 	try {
 	try {
 		console.log(`Trying to connect to Chrome at: ${chromeHostUrl}/json/version`)
 		console.log(`Trying to connect to Chrome at: ${chromeHostUrl}/json/version`)
-		const response = await axios.get(`${chromeHostUrl}/json/version`, { timeout: 1000 })
-		const data = response.data
+		await axios.get(`${chromeHostUrl}/json/version`, { timeout: 1000 })
 		return true
 		return true
 	} catch (error) {
 	} catch (error) {
 		return false
 		return false

+ 1 - 1
src/services/checkpoints/types.ts

@@ -1,4 +1,4 @@
-import { CommitResult, SimpleGit } from "simple-git"
+import { CommitResult } from "simple-git"
 
 
 export type CheckpointResult = Partial<CommitResult> & Pick<CommitResult, "commit">
 export type CheckpointResult = Partial<CommitResult> & Pick<CommitResult, "commit">
 
 

+ 1 - 13
src/services/glob/__mocks__/list-files.ts

@@ -21,18 +21,6 @@ const mockResolve = (dirPath: string): string => {
 	return dirPath.startsWith("/") ? dirPath : `/mock/path/${dirPath}`
 	return dirPath.startsWith("/") ? dirPath : `/mock/path/${dirPath}`
 }
 }
 
 
-/**
- * Mock function to check if paths are equal without importing path module
- * Provides simple equality comparison for testing
- *
- * @param path1 - First path to compare
- * @param path2 - Second path to compare
- * @returns Whether paths are equal
- */
-const mockArePathsEqual = (path1: string, path2: string): boolean => {
-	return path1 === path2
-}
-
 /**
 /**
  * Mock implementation of listFiles function
  * Mock implementation of listFiles function
  * Returns different results based on input path for testing different scenarios
  * Returns different results based on input path for testing different scenarios
@@ -42,7 +30,7 @@ const mockArePathsEqual = (path1: string, path2: string): boolean => {
  * @param limit - Maximum number of files to return
  * @param limit - Maximum number of files to return
  * @returns Promise resolving to [file paths, limit reached flag]
  * @returns Promise resolving to [file paths, limit reached flag]
  */
  */
-export const listFiles = jest.fn((dirPath: string, recursive: boolean, limit: number) => {
+export const listFiles = jest.fn((dirPath: string, _recursive: boolean, _limit: number) => {
 	// Special case: Root or home directories
 	// Special case: Root or home directories
 	// Prevents tests from trying to list all files in these directories
 	// Prevents tests from trying to list all files in these directories
 	if (dirPath === "/" || dirPath === "/root" || dirPath === "/home/user") {
 	if (dirPath === "/" || dirPath === "/root" || dirPath === "/home/user") {

+ 1 - 5
src/services/mcp/McpHub.ts

@@ -1,5 +1,5 @@
 import { Client } from "@modelcontextprotocol/sdk/client/index.js"
 import { Client } from "@modelcontextprotocol/sdk/client/index.js"
-import { StdioClientTransport, StdioServerParameters } from "@modelcontextprotocol/sdk/client/stdio.js"
+import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
 import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"
 import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"
 import ReconnectingEventSource from "reconnecting-eventsource"
 import ReconnectingEventSource from "reconnecting-eventsource"
 import {
 import {
@@ -205,11 +205,7 @@ export class McpHub {
 	 * @param error The error object
 	 * @param error The error object
 	 */
 	 */
 	private showErrorMessage(message: string, error: unknown): void {
 	private showErrorMessage(message: string, error: unknown): void {
-		const errorMessage = error instanceof Error ? error.message : `${error}`
 		console.error(`${message}:`, error)
 		console.error(`${message}:`, error)
-		// if (vscode.window && typeof vscode.window.showErrorMessage === 'function') {
-		// 	vscode.window.showErrorMessage(`${message}: ${errorMessage}`)
-		// }
 	}
 	}
 
 
 	public setupWorkspaceFoldersWatcher(): void {
 	public setupWorkspaceFoldersWatcher(): void {

+ 0 - 1
src/services/mcp/__tests__/McpHub.test.ts

@@ -37,7 +37,6 @@ describe("McpHub", () => {
 
 
 	// Store original console methods
 	// Store original console methods
 	const originalConsoleError = console.error
 	const originalConsoleError = console.error
-	const mockSettingsPath = "/mock/settings/path/mcp_settings.json"
 
 
 	beforeEach(() => {
 	beforeEach(() => {
 		jest.clearAllMocks()
 		jest.clearAllMocks()

+ 3 - 3
src/services/ripgrep/index.ts

@@ -1,8 +1,9 @@
-import * as vscode from "vscode"
 import * as childProcess from "child_process"
 import * as childProcess from "child_process"
 import * as path from "path"
 import * as path from "path"
-import * as fs from "fs"
 import * as readline from "readline"
 import * as readline from "readline"
+
+import * as vscode from "vscode"
+
 import { RooIgnoreController } from "../../core/ignore/RooIgnoreController"
 import { RooIgnoreController } from "../../core/ignore/RooIgnoreController"
 import { fileExistsAtPath } from "../../utils/fs"
 import { fileExistsAtPath } from "../../utils/fs"
 /*
 /*
@@ -160,7 +161,6 @@ export async function regexSearchFiles(
 	}
 	}
 
 
 	const results: SearchFileResult[] = []
 	const results: SearchFileResult[] = []
-	let currentResult: Partial<SearchResult> | null = null
 	let currentFile: SearchFileResult | null = null
 	let currentFile: SearchFileResult | null = null
 
 
 	output.split("\n").forEach((line) => {
 	output.split("\n").forEach((line) => {

+ 0 - 3
src/services/tree-sitter/__tests__/helpers.ts

@@ -28,8 +28,6 @@ export async function initializeTreeSitter() {
 	}
 	}
 
 
 	const TreeSitter = await initializeWorkingParser()
 	const TreeSitter = await initializeWorkingParser()
-	const wasmPath = path.join(process.cwd(), "dist/tree-sitter-tsx.wasm")
-	const tsxLang = await TreeSitter.Language.load(wasmPath)
 
 
 	initializedTreeSitter = TreeSitter
 	initializedTreeSitter = TreeSitter
 	return TreeSitter
 	return TreeSitter
@@ -68,7 +66,6 @@ export async function testParseSourceCodeDefinitions(
 	} = {},
 	} = {},
 ): Promise<string | undefined> {
 ): Promise<string | undefined> {
 	// Set default options
 	// Set default options
-	const language = options.language || "tsx"
 	const wasmFile = options.wasmFile || "tree-sitter-tsx.wasm"
 	const wasmFile = options.wasmFile || "tree-sitter-tsx.wasm"
 	const queryString = options.queryString || tsxQuery
 	const queryString = options.queryString || tsxQuery
 	const extKey = options.extKey || "tsx"
 	const extKey = options.extKey || "tsx"

+ 2 - 2
src/services/tree-sitter/__tests__/index.test.ts

@@ -1,9 +1,9 @@
+import * as fs from "fs/promises"
+
 import { parseSourceCodeForDefinitionsTopLevel } from "../index"
 import { parseSourceCodeForDefinitionsTopLevel } from "../index"
 import { listFiles } from "../../glob/list-files"
 import { listFiles } from "../../glob/list-files"
 import { loadRequiredLanguageParsers } from "../languageParser"
 import { loadRequiredLanguageParsers } from "../languageParser"
 import { fileExistsAtPath } from "../../../utils/fs"
 import { fileExistsAtPath } from "../../../utils/fs"
-import * as fs from "fs/promises"
-import * as path from "path"
 
 
 // Mock dependencies
 // Mock dependencies
 jest.mock("../../glob/list-files")
 jest.mock("../../glob/list-files")

+ 3 - 2
src/services/tree-sitter/__tests__/markdownIntegration.test.ts

@@ -1,6 +1,7 @@
-import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import * as fs from "fs/promises"
 import * as fs from "fs/promises"
-import * as path from "path"
+
+import { describe, expect, it, jest, beforeEach } from "@jest/globals"
+
 import { parseSourceCodeDefinitionsForFile } from "../index"
 import { parseSourceCodeDefinitionsForFile } from "../index"
 
 
 // Mock fs.readFile
 // Mock fs.readFile

+ 8 - 20
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts

@@ -1,12 +1,7 @@
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
-import * as fs from "fs/promises"
-import * as path from "path"
-import Parser from "web-tree-sitter"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
 import { cppQuery } from "../queries"
 import { cppQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { testParseSourceCodeDefinitions } from "./helpers"
 
 
 // Sample C++ content for tests covering all supported structures:
 // Sample C++ content for tests covering all supported structures:
 // - struct declarations
 // - struct declarations
@@ -516,7 +511,6 @@ const cppOptions = {
 
 
 // Mock file system operations
 // Mock file system operations
 jest.mock("fs/promises")
 jest.mock("fs/promises")
-const mockedFs = jest.mocked(fs)
 
 
 // Mock loadRequiredLanguageParsers
 // Mock loadRequiredLanguageParsers
 jest.mock("../languageParser", () => ({
 jest.mock("../languageParser", () => ({
@@ -654,12 +648,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => {
 	})
 	})
 
 
 	it("should parse C++ using declarations and aliases", async () => {
 	it("should parse C++ using declarations and aliases", async () => {
-		const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
-		const resultLines = result?.split("\n") || []
-
+		// const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
+		// const resultLines = result?.split("\n") || []
 		// Test using declarations - not supported by current parser
 		// Test using declarations - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("using std::string"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("using std::string"))).toBe(true)
-
 		// Test using directives - not supported by current parser
 		// Test using directives - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("using namespace std"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("using namespace std"))).toBe(true)
 		// Test alias declarations - not supported by current parser
 		// Test alias declarations - not supported by current parser
@@ -683,12 +675,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => {
 	})
 	})
 
 
 	it("should parse C++ attributes and macros", async () => {
 	it("should parse C++ attributes and macros", async () => {
-		const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
-		const resultLines = result?.split("\n") || []
-
+		// const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
+		// const resultLines = result?.split("\n") || []
 		// Test attributes - not supported by current parser
 		// Test attributes - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("[[nodiscard]]") || line.includes("attribute_declaration"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("[[nodiscard]]") || line.includes("attribute_declaration"))).toBe(true)
-
 		// Test macro definitions - not supported by current parser
 		// Test macro definitions - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("#define SQUARE"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("#define SQUARE"))).toBe(true)
 	})
 	})
@@ -721,12 +711,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => {
 	})
 	})
 
 
 	it("should parse C++ inline functions and variables", async () => {
 	it("should parse C++ inline functions and variables", async () => {
-		const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
-		const resultLines = result?.split("\n") || []
-
+		// const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions)
+		// const resultLines = result?.split("\n") || []
 		// Test inline functions - not supported by current parser
 		// Test inline functions - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("inline double square"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("inline double square"))).toBe(true)
-
 		// Test inline variables - not supported by current parser
 		// Test inline variables - not supported by current parser
 		// expect(resultLines.some((line) => line.includes("inline constexpr double PI"))).toBe(true)
 		// expect(resultLines.some((line) => line.includes("inline constexpr double PI"))).toBe(true)
 	})
 	})

+ 4 - 18
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts

@@ -1,12 +1,7 @@
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
-import * as fs from "fs/promises"
-import * as path from "path"
-import Parser from "web-tree-sitter"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
 import { goQuery } from "../queries"
 import { goQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { testParseSourceCodeDefinitions } from "./helpers"
 
 
 // Sample Go content for tests covering all supported structures:
 // Sample Go content for tests covering all supported structures:
 // - function declarations (with associated comments)
 // - function declarations (with associated comments)
@@ -260,7 +255,6 @@ const goOptions = {
 
 
 // Mock file system operations
 // Mock file system operations
 jest.mock("fs/promises")
 jest.mock("fs/promises")
-const mockedFs = jest.mocked(fs)
 
 
 // Mock loadRequiredLanguageParsers
 // Mock loadRequiredLanguageParsers
 jest.mock("../languageParser", () => ({
 jest.mock("../languageParser", () => ({
@@ -279,7 +273,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 
 
 	it("should parse Go struct definitions", async () => {
 	it("should parse Go struct definitions", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for struct definitions - we only check for the ones that are actually captured
 		// Check for struct definitions - we only check for the ones that are actually captured
 		expect(result).toContain("type Point struct")
 		expect(result).toContain("type Point struct")
@@ -289,7 +282,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 
 
 	it("should parse Go method declarations", async () => {
 	it("should parse Go method declarations", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for method declarations - we only check for the ones that are actually captured
 		// Check for method declarations - we only check for the ones that are actually captured
 		expect(result).toContain("func (p *Point) Move")
 		expect(result).toContain("func (p *Point) Move")
@@ -298,7 +290,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 
 
 	it("should parse Go function declarations", async () => {
 	it("should parse Go function declarations", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for function declarations - we only check for the ones that are actually captured
 		// Check for function declarations - we only check for the ones that are actually captured
 		expect(result).toContain("func CalculateDistance")
 		expect(result).toContain("func CalculateDistance")
@@ -308,7 +299,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 
 
 	it("should parse Go interface definitions", async () => {
 	it("should parse Go interface definitions", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for interface definitions - we only check for the ones that are actually captured
 		// Check for interface definitions - we only check for the ones that are actually captured
 		expect(result).toContain("type Shape interface")
 		expect(result).toContain("type Shape interface")
@@ -327,8 +317,7 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 	})
 	})
 
 
 	it("should parse Go type aliases", async () => {
 	it("should parse Go type aliases", async () => {
-		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
+		await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 
 
 		// Note: Type aliases might not be captured due to Tree-Sitter parser limitations
 		// Note: Type aliases might not be captured due to Tree-Sitter parser limitations
 		// This test is kept for completeness
 		// This test is kept for completeness
@@ -336,9 +325,7 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 	})
 	})
 
 
 	it("should parse Go embedded structs and interfaces", async () => {
 	it("should parse Go embedded structs and interfaces", async () => {
-		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
-
+		await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		// Note: Embedded structs and interfaces might not be captured due to Tree-Sitter parser limitations
 		// Note: Embedded structs and interfaces might not be captured due to Tree-Sitter parser limitations
 		// This test is kept for completeness
 		// This test is kept for completeness
 		expect(true).toBe(true)
 		expect(true).toBe(true)
@@ -346,7 +333,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => {
 
 
 	it("should parse Go init functions", async () => {
 	it("should parse Go init functions", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for init functions
 		// Check for init functions
 		expect(result).toContain("func init")
 		expect(result).toContain("func init")

+ 2 - 8
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts

@@ -1,12 +1,7 @@
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
-import * as fs from "fs/promises"
-import * as path from "path"
-import Parser from "web-tree-sitter"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
 import { javaQuery } from "../queries"
 import { javaQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { testParseSourceCodeDefinitions } from "./helpers"
 
 
 // Sample Java content for tests covering all supported structures:
 // Sample Java content for tests covering all supported structures:
 // - class declarations (including inner and anonymous classes)
 // - class declarations (including inner and anonymous classes)
@@ -309,7 +304,6 @@ const javaOptions = {
 
 
 // Mock file system operations
 // Mock file system operations
 jest.mock("fs/promises")
 jest.mock("fs/promises")
-const mockedFs = jest.mocked(fs)
 
 
 // Mock loadRequiredLanguageParsers
 // Mock loadRequiredLanguageParsers
 jest.mock("../languageParser", () => ({
 jest.mock("../languageParser", () => ({

+ 4 - 8
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts

@@ -1,11 +1,10 @@
-import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
 import * as fs from "fs/promises"
 import * as fs from "fs/promises"
 import * as path from "path"
 import * as path from "path"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
+import { describe, expect, it, jest, beforeEach } from "@jest/globals"
+
 import { javascriptQuery } from "../queries"
 import { javascriptQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { initializeTreeSitter, testParseSourceCodeDefinitions, debugLog } from "./helpers"
 
 
 // Sample JSON content for tests
 // Sample JSON content for tests
 const sampleJsonContent = `{
 const sampleJsonContent = `{
@@ -68,9 +67,6 @@ describe("jsonParserDebug", () => {
 		parser.setLanguage(jsLang)
 		parser.setLanguage(jsLang)
 		const tree = parser.parse(sampleJsonContent)
 		const tree = parser.parse(sampleJsonContent)
 
 
-		// Extract definitions using JavaScript query
-		const query = jsLang.query(javascriptQuery)
-
 		expect(tree).toBeDefined()
 		expect(tree).toBeDefined()
 	})
 	})
 
 

+ 2 - 10
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts

@@ -1,12 +1,7 @@
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
-import * as fs from "fs/promises"
-import * as path from "path"
-import Parser from "web-tree-sitter"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
 import { pythonQuery } from "../queries"
 import { pythonQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { testParseSourceCodeDefinitions } from "./helpers"
 
 
 // Sample Python content for tests covering all supported structures:
 // Sample Python content for tests covering all supported structures:
 // - class definitions
 // - class definitions
@@ -355,7 +350,6 @@ const pythonOptions = {
 
 
 // Mock file system operations
 // Mock file system operations
 jest.mock("fs/promises")
 jest.mock("fs/promises")
-const mockedFs = jest.mocked(fs)
 
 
 // Mock loadRequiredLanguageParsers
 // Mock loadRequiredLanguageParsers
 jest.mock("../languageParser", () => ({
 jest.mock("../languageParser", () => ({
@@ -374,7 +368,6 @@ describe("parseSourceCodeDefinitionsForFile with Python", () => {
 
 
 	it("should parse Python class definitions", async () => {
 	it("should parse Python class definitions", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for class definitions
 		// Check for class definitions
 		expect(result).toContain("class Point")
 		expect(result).toContain("class Point")
@@ -386,7 +379,6 @@ describe("parseSourceCodeDefinitionsForFile with Python", () => {
 
 
 	it("should parse Python function definitions", async () => {
 	it("should parse Python function definitions", async () => {
 		const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions)
 		const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions)
-		const resultLines = result?.split("\n") || []
 
 
 		// Check for function definitions
 		// Check for function definitions
 		expect(result).toContain("def calculate_average")
 		expect(result).toContain("def calculate_average")

+ 2 - 8
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts

@@ -1,12 +1,7 @@
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
 import { describe, expect, it, jest, beforeEach } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
-import * as fs from "fs/promises"
-import * as path from "path"
-import Parser from "web-tree-sitter"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
+
 import { rustQuery } from "../queries"
 import { rustQuery } from "../queries"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+import { testParseSourceCodeDefinitions } from "./helpers"
 
 
 // Sample Rust content for tests covering all supported structures:
 // Sample Rust content for tests covering all supported structures:
 // - struct definitions
 // - struct definitions
@@ -318,7 +313,6 @@ const rustOptions = {
 
 
 // Mock file system operations
 // Mock file system operations
 jest.mock("fs/promises")
 jest.mock("fs/promises")
-const mockedFs = jest.mocked(fs)
 
 
 // Mock loadRequiredLanguageParsers
 // Mock loadRequiredLanguageParsers
 jest.mock("../languageParser", () => ({
 jest.mock("../languageParser", () => ({

+ 6 - 10
src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts

@@ -1,11 +1,11 @@
-import { describe, expect, it, jest, beforeEach, beforeAll } from "@jest/globals"
-import { parseSourceCodeDefinitionsForFile } from ".."
+// npx jest src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts
+
 import * as fs from "fs/promises"
 import * as fs from "fs/promises"
 import * as path from "path"
 import * as path from "path"
-import { fileExistsAtPath } from "../../../utils/fs"
-import { loadRequiredLanguageParsers } from "../languageParser"
-import tsxQuery from "../queries/tsx"
-import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers"
+
+import { describe, expect, it, jest, beforeEach } from "@jest/globals"
+
+import { initializeTreeSitter, testParseSourceCodeDefinitions, debugLog } from "./helpers"
 
 
 // Sample component content with enhanced TypeScript language constructs
 // Sample component content with enhanced TypeScript language constructs
 const sampleTsxContent = `
 const sampleTsxContent = `
@@ -338,9 +338,6 @@ describe("treeParserDebug", () => {
 		const tree = parser.parse(sampleCode)
 		const tree = parser.parse(sampleCode)
 		// console.log("Parsed tree:", tree.rootNode.toString())
 		// console.log("Parsed tree:", tree.rootNode.toString())
 
 
-		// Extract definitions using TSX query
-		const query = tsxLang.query(tsxQuery)
-
 		expect(tree).toBeDefined()
 		expect(tree).toBeDefined()
 	})
 	})
 
 
@@ -571,7 +568,6 @@ it("should parse conditional types", async function () {
 
 
 	// Save the initial line count to compare later
 	// Save the initial line count to compare later
 	const initialLineCount = initialResult ? initialResult.split("\n").length : 0
 	const initialLineCount = initialResult ? initialResult.split("\n").length : 0
-	const initialCaptures = initialResult ? initialResult : ""
 
 
 	// Now check if the new query pattern improves the output
 	// Now check if the new query pattern improves the output
 	const updatedResult = await testParseSourceCodeDefinitions("/test/conditional-type.tsx", conditionalTypeContent)
 	const updatedResult = await testParseSourceCodeDefinitions("/test/conditional-type.tsx", conditionalTypeContent)

+ 3 - 7
src/services/tree-sitter/index.ts

@@ -3,7 +3,7 @@ import * as path from "path"
 import { listFiles } from "../glob/list-files"
 import { listFiles } from "../glob/list-files"
 import { LanguageParser, loadRequiredLanguageParsers } from "./languageParser"
 import { LanguageParser, loadRequiredLanguageParsers } from "./languageParser"
 import { fileExistsAtPath } from "../../utils/fs"
 import { fileExistsAtPath } from "../../utils/fs"
-import { parseMarkdown, formatMarkdownCaptures } from "./markdownParser"
+import { parseMarkdown } from "./markdownParser"
 import { RooIgnoreController } from "../../core/ignore/RooIgnoreController"
 import { RooIgnoreController } from "../../core/ignore/RooIgnoreController"
 
 
 const extensions = [
 const extensions = [
@@ -109,7 +109,7 @@ export async function parseSourceCodeForDefinitionsTopLevel(
 	let result = ""
 	let result = ""
 
 
 	// Separate files to parse and remaining files
 	// Separate files to parse and remaining files
-	const { filesToParse, remainingFiles } = separateFiles(allFiles)
+	const { filesToParse } = separateFiles(allFiles)
 
 
 	// Filter filepaths for access if controller is provided
 	// Filter filepaths for access if controller is provided
 	const allowedFilesToParse = rooIgnoreController ? rooIgnoreController.filterPaths(filesToParse) : filesToParse
 	const allowedFilesToParse = rooIgnoreController ? rooIgnoreController.filterPaths(filesToParse) : filesToParse
@@ -227,9 +227,6 @@ function processCaptures(captures: any[], lines: string[], minComponentLines: nu
 	// Sort captures by their start position
 	// Sort captures by their start position
 	captures.sort((a, b) => a.node.startPosition.row - b.node.startPosition.row)
 	captures.sort((a, b) => a.node.startPosition.row - b.node.startPosition.row)
 
 
-	// Keep track of the last line we've processed
-	let lastLine = -1
-
 	// Track already processed lines to avoid duplicates
 	// Track already processed lines to avoid duplicates
 	const processedLines = new Set<string>()
 	const processedLines = new Set<string>()
 
 
@@ -300,13 +297,12 @@ function processCaptures(captures: any[], lines: string[], minComponentLines: nu
 				}
 				}
 			}
 			}
 		}
 		}
-
-		lastLine = endLine
 	})
 	})
 
 
 	if (formattedOutput.length > 0) {
 	if (formattedOutput.length > 0) {
 		return formattedOutput
 		return formattedOutput
 	}
 	}
+
 	return null
 	return null
 }
 }
 
 

+ 1 - 1
src/shared/__tests__/vsCodeSelectorUtils.test.ts

@@ -1,4 +1,4 @@
-import { stringifyVsCodeLmModelSelector, SELECTOR_SEPARATOR } from "../vsCodeSelectorUtils"
+import { stringifyVsCodeLmModelSelector } from "../vsCodeSelectorUtils"
 import { LanguageModelChatSelector } from "vscode"
 import { LanguageModelChatSelector } from "vscode"
 
 
 describe("vsCodeSelectorUtils", () => {
 describe("vsCodeSelectorUtils", () => {

+ 2 - 1
src/utils/__tests__/git.test.ts

@@ -1,7 +1,8 @@
 import { jest } from "@jest/globals"
 import { jest } from "@jest/globals"
-import { searchCommits, getCommitInfo, getWorkingState, GitCommit } from "../git"
 import { ExecException } from "child_process"
 import { ExecException } from "child_process"
 
 
+import { searchCommits, getCommitInfo, getWorkingState } from "../git"
+
 type ExecFunction = (
 type ExecFunction = (
 	command: string,
 	command: string,
 	options: { cwd?: string },
 	options: { cwd?: string },

+ 1 - 1
src/utils/logging/CompactLogger.ts

@@ -142,7 +142,7 @@ export class CompactLogger implements ILogger {
 			l: level,
 			l: level,
 			m: message,
 			m: message,
 			c: meta?.ctx,
 			c: meta?.ctx,
-			d: meta ? (({ ctx, ...rest }) => (Object.keys(rest).length > 0 ? rest : undefined))(meta) : undefined,
+			d: meta ? (({ ctx: _, ...rest }) => (Object.keys(rest).length > 0 ? rest : undefined))(meta) : undefined,
 		}
 		}
 
 
 		this.transport.write(entry)
 		this.transport.write(entry)

+ 1 - 2
webview-ui/package.json

@@ -4,8 +4,7 @@
 	"private": true,
 	"private": true,
 	"type": "module",
 	"type": "module",
 	"scripts": {
 	"scripts": {
-		"lint": "eslint src/**/*.ts src/**/*.tsx",
-		"lint-fix": "eslint src/**/*.ts src/**/*.tsx --fix",
+		"lint": "eslint src --ext .ts,.tsx",
 		"check-types": "tsc",
 		"check-types": "tsc",
 		"test": "jest -w=40%",
 		"test": "jest -w=40%",
 		"dev": "vite",
 		"dev": "vite",

+ 2 - 1
webview-ui/src/components/chat/ChatTextArea.tsx

@@ -94,11 +94,12 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 
 
 		// Close dropdown when clicking outside.
 		// Close dropdown when clicking outside.
 		useEffect(() => {
 		useEffect(() => {
-			const handleClickOutside = (event: MouseEvent) => {
+			const handleClickOutside = () => {
 				if (showDropdown) {
 				if (showDropdown) {
 					setShowDropdown(false)
 					setShowDropdown(false)
 				}
 				}
 			}
 			}
+
 			document.addEventListener("mousedown", handleClickOutside)
 			document.addEventListener("mousedown", handleClickOutside)
 			return () => document.removeEventListener("mousedown", handleClickOutside)
 			return () => document.removeEventListener("mousedown", handleClickOutside)
 		}, [showDropdown])
 		}, [showDropdown])

+ 0 - 1
webview-ui/src/components/chat/ContextMenu.tsx

@@ -33,7 +33,6 @@ const ContextMenu: React.FC<ContextMenuProps> = ({
 	selectedType,
 	selectedType,
 	queryItems,
 	queryItems,
 	modes,
 	modes,
-	loading = false,
 	dynamicSearchResults = [],
 	dynamicSearchResults = [],
 }) => {
 }) => {
 	const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("")
 	const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("")

+ 1 - 1
webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx

@@ -360,7 +360,7 @@ describe("ChatTextArea", () => {
 			const outsidePath = "/Users/other/project/file.js"
 			const outsidePath = "/Users/other/project/file.js"
 
 
 			// Mock the convertToMentionPath function to return the original path for paths outside cwd
 			// Mock the convertToMentionPath function to return the original path for paths outside cwd
-			mockConvertToMentionPath.mockImplementationOnce((path, cwd) => {
+			mockConvertToMentionPath.mockImplementationOnce((path, _cwd) => {
 				return path // Return original path for this test
 				return path // Return original path for this test
 			})
 			})
 
 

+ 2 - 2
webview-ui/src/components/common/CodeBlock.tsx

@@ -100,7 +100,7 @@ const StyledPre = styled.pre<{ theme: any }>`
 
 
 	${(props) =>
 	${(props) =>
 		Object.keys(props.theme)
 		Object.keys(props.theme)
-			.map((key, index) => {
+			.map((key) => {
 				return `
 				return `
       & ${key} {
       & ${key} {
         color: ${props.theme[key]};
         color: ${props.theme[key]};
@@ -135,7 +135,7 @@ const CodeBlock = memo(({ source, forceWrap = false }: CodeBlockProps) => {
 		],
 		],
 		rehypeReactOptions: {
 		rehypeReactOptions: {
 			components: {
 			components: {
-				pre: ({ node, ...preProps }: any) => <StyledPre {...preProps} theme={theme} />,
+				pre: ({ node: _, ...preProps }: any) => <StyledPre {...preProps} theme={theme} />,
 			},
 			},
 		},
 		},
 	})
 	})

+ 2 - 2
webview-ui/src/components/common/MarkdownBlock.tsx

@@ -160,7 +160,7 @@ const StyledPre = styled.pre<{ theme: any }>`
 
 
 	${(props) =>
 	${(props) =>
 		Object.keys(props.theme)
 		Object.keys(props.theme)
-			.map((key, index) => {
+			.map((key) => {
 				return `
 				return `
       & ${key} {
       & ${key} {
         color: ${props.theme[key]};
         color: ${props.theme[key]};
@@ -195,7 +195,7 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => {
 		],
 		],
 		rehypeReactOptions: {
 		rehypeReactOptions: {
 			components: {
 			components: {
-				pre: ({ node, children, ...preProps }: any) => {
+				pre: ({ node: _, children, ...preProps }: any) => {
 					if (Array.isArray(children) && children.length === 1 && React.isValidElement(children[0])) {
 					if (Array.isArray(children) && children.length === 1 && React.isValidElement(children[0])) {
 						const child = children[0] as React.ReactElement<{ className?: string }>
 						const child = children[0] as React.ReactElement<{ className?: string }>
 						if (child.props?.className?.includes("language-mermaid")) {
 						if (child.props?.className?.includes("language-mermaid")) {

+ 1 - 1
webview-ui/src/components/prompts/PromptsView.tsx

@@ -316,7 +316,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 
 
 	// Handle clicks outside the config menu
 	// Handle clicks outside the config menu
 	useEffect(() => {
 	useEffect(() => {
-		const handleClickOutside = (event: MouseEvent) => {
+		const handleClickOutside = () => {
 			if (showConfigMenu) {
 			if (showConfigMenu) {
 				setShowConfigMenu(false)
 				setShowConfigMenu(false)
 			}
 			}

+ 0 - 1
webview-ui/src/components/settings/AutoApproveSettings.tsx

@@ -57,7 +57,6 @@ export const AutoApproveSettings = ({
 	alwaysAllowExecute,
 	alwaysAllowExecute,
 	allowedCommands,
 	allowedCommands,
 	setCachedStateField,
 	setCachedStateField,
-	className,
 	...props
 	...props
 }: AutoApproveSettingsProps) => {
 }: AutoApproveSettingsProps) => {
 	const { t } = useAppTranslation()
 	const { t } = useAppTranslation()

+ 0 - 1
webview-ui/src/components/settings/ExperimentalSettings.tsx

@@ -18,7 +18,6 @@ type ExperimentalSettingsProps = HTMLAttributes<HTMLDivElement> & {
 }
 }
 
 
 export const ExperimentalSettings = ({
 export const ExperimentalSettings = ({
-	setCachedStateField,
 	experiments,
 	experiments,
 	setExperimentEnabled,
 	setExperimentEnabled,
 	className,
 	className,

+ 7 - 8
webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx

@@ -1,6 +1,5 @@
 // npx jest src/components/settings/__tests__/ApiConfigManager.test.tsx
 // npx jest src/components/settings/__tests__/ApiConfigManager.test.tsx
 
 
-import React from "react"
 import { render, screen, fireEvent, within } from "@testing-library/react"
 import { render, screen, fireEvent, within } from "@testing-library/react"
 
 
 import ApiConfigManager from "../ApiConfigManager"
 import ApiConfigManager from "../ApiConfigManager"
@@ -21,14 +20,14 @@ jest.mock("@vscode/webview-ui-toolkit/react", () => ({
 
 
 jest.mock("@/components/ui", () => ({
 jest.mock("@/components/ui", () => ({
 	...jest.requireActual("@/components/ui"),
 	...jest.requireActual("@/components/ui"),
-	Dialog: ({ children, open, onOpenChange }: any) => (
+	Dialog: ({ children, open }: any) => (
 		<div role="dialog" aria-modal="true" style={{ display: open ? "block" : "none" }} data-testid="dialog">
 		<div role="dialog" aria-modal="true" style={{ display: open ? "block" : "none" }} data-testid="dialog">
 			{children}
 			{children}
 		</div>
 		</div>
 	),
 	),
 	DialogContent: ({ children }: any) => <div data-testid="dialog-content">{children}</div>,
 	DialogContent: ({ children }: any) => <div data-testid="dialog-content">{children}</div>,
 	DialogTitle: ({ children }: any) => <div data-testid="dialog-title">{children}</div>,
 	DialogTitle: ({ children }: any) => <div data-testid="dialog-title">{children}</div>,
-	Button: ({ children, onClick, disabled, variant, "data-testid": dataTestId }: any) => (
+	Button: ({ children, onClick, disabled, "data-testid": dataTestId }: any) => (
 		<button onClick={onClick} disabled={disabled} data-testid={dataTestId}>
 		<button onClick={onClick} disabled={disabled} data-testid={dataTestId}>
 			{children}
 			{children}
 		</button>
 		</button>
@@ -43,16 +42,16 @@ jest.mock("@/components/ui", () => ({
 		/>
 		/>
 	),
 	),
 	// New components for searchable dropdown
 	// New components for searchable dropdown
-	Popover: ({ children, open, onOpenChange }: any) => (
+	Popover: ({ children, open }: any) => (
 		<div className="popover" style={{ position: "relative" }}>
 		<div className="popover" style={{ position: "relative" }}>
 			{children}
 			{children}
 			{open && <div className="popover-content" style={{ position: "absolute", top: "100%", left: 0 }}></div>}
 			{open && <div className="popover-content" style={{ position: "absolute", top: "100%", left: 0 }}></div>}
 		</div>
 		</div>
 	),
 	),
-	PopoverTrigger: ({ children, asChild }: any) => <div className="popover-trigger">{children}</div>,
-	PopoverContent: ({ children, className }: any) => <div className="popover-content">{children}</div>,
+	PopoverTrigger: ({ children }: any) => <div className="popover-trigger">{children}</div>,
+	PopoverContent: ({ children }: any) => <div className="popover-content">{children}</div>,
 	Command: ({ children }: any) => <div className="command">{children}</div>,
 	Command: ({ children }: any) => <div className="command">{children}</div>,
-	CommandInput: ({ value, onValueChange, placeholder, className, "data-testid": dataTestId, ref }: any) => (
+	CommandInput: ({ value, onValueChange, placeholder, className, "data-testid": dataTestId }: any) => (
 		<input
 		<input
 			value={value}
 			value={value}
 			onChange={(e) => onValueChange(e.target.value)}
 			onChange={(e) => onValueChange(e.target.value)}
@@ -70,7 +69,7 @@ jest.mock("@/components/ui", () => ({
 		</div>
 		</div>
 	),
 	),
 	// Keep old components for backward compatibility
 	// Keep old components for backward compatibility
-	Select: ({ children, value, onValueChange }: any) => (
+	Select: ({ value, onValueChange }: any) => (
 		<select
 		<select
 			value={value}
 			value={value}
 			onChange={(e) => {
 			onChange={(e) => {

+ 1 - 6
webview-ui/src/components/ui/__tests__/select-dropdown.test.tsx

@@ -1,4 +1,4 @@
-// npx jest webview-ui/src/components/ui/__tests__/select-dropdown.test.tsx
+// npx jest src/components/ui/__tests__/select-dropdown.test.tsx
 
 
 import { ReactNode } from "react"
 import { ReactNode } from "react"
 import { render, screen, fireEvent } from "@testing-library/react"
 import { render, screen, fireEvent } from "@testing-library/react"
@@ -16,7 +16,6 @@ jest.mock("@/components/ui", () => {
 	return {
 	return {
 		Popover: ({
 		Popover: ({
 			children,
 			children,
-			open,
 			onOpenChange,
 			onOpenChange,
 		}: {
 		}: {
 			children: ReactNode
 			children: ReactNode
@@ -44,10 +43,6 @@ jest.mock("@/components/ui", () => {
 
 
 		PopoverContent: ({
 		PopoverContent: ({
 			children,
 			children,
-			align,
-			sideOffset,
-			container,
-			className,
 		}: {
 		}: {
 			children: ReactNode
 			children: ReactNode
 			align?: string
 			align?: string

+ 1 - 1
webview-ui/src/components/ui/chat/ChatMessage.tsx

@@ -20,7 +20,7 @@ interface ChatMessageProps {
 	append?: ChatHandler["append"]
 	append?: ChatHandler["append"]
 }
 }
 
 
-export function ChatMessage({ message, isLast, isHeaderVisible, isLoading, append }: ChatMessageProps) {
+export function ChatMessage({ message, isLast, isHeaderVisible }: ChatMessageProps) {
 	const badges = useMemo(
 	const badges = useMemo(
 		() =>
 		() =>
 			message.annotations
 			message.annotations