Repository: cline/cline
Pull request #2256: Tasks Galore!
Author: login: celestial-vault
Created: 2025-03-14T17:18:31Z | Merged: 2025-03-25T00:07:47Z

### Description

- Registered a VS Code command to create an arbitrary number of tasks.
- The command is behind the IS_DEV flag, so will only be registered when IS_DEV is true
- Displays progress with a progress bar.
- Matches the task format and even duplicates an example conversation.
- Each task is about 1mb.

### Test Procedure

Used multiple times to create 10k to 20k tasks.

### Type of Change

<!-- Put an 'x' in all boxes that apply -->

-   [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
-   [x] ✨ New feature (non-breaking change which adds functionality)
-   [ ] 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
-   [ ] 📚 Documentation update

### Pre-flight Checklist

<!-- Put an 'x' in all boxes that apply -->

-   [x] Changes are limited to a single feature, bugfix or chore (split larger changes into separate PRs)
-   [x] Tests are passing (`npm test`) and code is formatted and linted (`npm run format && npm run lint`)
-   [x] I have created a changeset using `npm run changeset` (required for user-facing changes)
-   [x] I have reviewed [contributor guidelines](https://github.com/cline/cline/blob/main/CONTRIBUTING.md)

### Screenshots

<!-- For UI changes, add screenshots here -->

### Additional Notes

Tasks are not synced with checkpoints - further improvement could add checkpoints for each task, if this is deemed necessary.

<!-- ELLIPSIS_HIDDEN -->


----

> [!IMPORTANT]
> Adds a VS Code command to create test tasks in development mode with realistic message sequences.
> 
>   - **New Feature**:
>     - Adds `cline.dev.createTestTasks` command in `package.json` to create test tasks in development mode.
>     - Implements `registerTaskCommands()` in `tasks.ts` to handle task creation, generating tasks with realistic message sequences and storing them in the global storage path.
>     - Updates `activate()` in `extension.ts` to register the new command when `IS_DEV` is true.
>   - **Behavior**:
>     - Each task is approximately 1MB and includes a realistic message sequence.
>     - Progress is displayed with a progress bar during task creation.
>   - **Misc**:
>     - Adds a changeset for the new feature.
> 
> <sup>This description was created by </sup>[<img alt="Ellipsis" src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=cline%2Fcline&utm_source=github&utm_medium=referral)<sup> for 3c516023c8d78c2f65442ff1e0d41815237eb609. It will automatically update as commits are pushed.</sup>


<!-- ELLIPSIS_HIDDEN -->


Diff:
diff --git a/.changeset/nasty-pigs-camp.md b/.changeset/nasty-pigs-camp.md
new file mode 100644
index 00000000000..136086114d2
--- /dev/null
+++ b/.changeset/nasty-pigs-camp.md
@@ -0,0 +1,5 @@
+---
+"claude-dev": minor
+---
+
+Added a script to create test tasks in dev mode
diff --git a/package.json b/package.json
index 5ca76e1d253..b83e449e8f8 100644
--- a/package.json
+++ b/package.json
@@ -96,6 +96,12 @@
 				"title": "Open In New Tab",
 				"category": "Cline"
 			},
+			{
+				"command": "cline.dev.createTestTasks",
+				"title": "Create Test Tasks",
+				"category": "Cline",
+				"when": "cline.isDevMode"
+			},
 			{
 				"command": "cline.openDocumentation",
 				"title": "Documentation",
diff --git a/src/dev/commands/tasks.ts b/src/dev/commands/tasks.ts
new file mode 100644
index 00000000000..ea6ecb72802
--- /dev/null
+++ b/src/dev/commands/tasks.ts
@@ -0,0 +1,288 @@
+import * as vscode from "vscode"
+import * as fs from "fs/promises"
+import * as path from "path"
+import { ClineProvider } from "../../core/webview/ClineProvider"
+import { HistoryItem } from "../../shared/HistoryItem"
+import { ClineMessage } from "../../shared/ExtensionMessage"
+
+/**
+ * Registers development-only commands for task manipulation.
+ * These are only activated in development mode.
+ */
+export function registerTaskCommands(context: vscode.ExtensionContext, provider: ClineProvider): vscode.Disposable[] {
+	return [
+		vscode.commands.registerCommand("cline.dev.createTestTasks", async () => {
+			const count = await vscode.window.showInputBox({
+				title: "Test Tasks",
+				prompt: "How many test tasks to create?",
+				value: "10",
+			})
+
+			if (!count) {
+				return
+			}
+
+			const tasksCount = parseInt(count)
+			const globalStoragePath = context.globalStorageUri.fsPath
+			const tasksDir = path.join(globalStoragePath, "tasks")
+
+			vscode.window.withProgress(
+				{
+					location: vscode.ProgressLocation.Notification,
+					title: `Creating ${tasksCount} test tasks...`,
+					cancellable: false,
+				},
+				async (progress) => {
+					for (let i = 0; i < tasksCount; i++) {
+						// Generate a timestamp to ensure unique IDs
+						const timestamp = Date.now() + i
+						const taskId = `${timestamp}`
+						const taskDir = path.join(tasksDir, taskId)
+
+						await fs.mkdir(taskDir, { recursive: true })
+
+						// Generate a task prompt
+						const taskName = getRandomTaskName(i)
+
+						// Create realistic message sequence
+						const messages = createRealisticMessageSequence(timestamp, taskName, i)
+
+						// Create API conversation history file
+						await fs.writeFile(
+							path.join(taskDir, "api_conversation_history.json"),
+							JSON.stringify(
+								[
+									{
+										role: "user",
+										content: [{ type: "text", text: `<task>\n${taskName}\n</task>` }],
+									},
+									{
+										role: "assistant",
+										content: [
+											{
+												type: "text",
+												text: `I'll help you ${taskName.toLowerCase()}. Let me break this down into steps.`,
+											},
+										],
+									},
+								],
+								null,
+								2,
+							),
+						)
+
+						// Create UI messages file with realistic message sequence
+						await fs.writeFile(path.join(taskDir, "ui_messages.json"), JSON.stringify(messages, null, 2))
+
+						// Create history item to be shown in the HistoryView
+						const historyItem: HistoryItem = {
+							id: taskId,
+							ts: timestamp,
+							task: taskName,
+							tokensIn: Math.floor(100 + Math.random() * 900), // Random token count from 100-1000
+							tokensOut: Math.floor(200 + Math.random() * 1800), // Random token count from 200-2000
+							cacheWrites: i % 3 === 0 ? Math.floor(50 + Math.random() * 150) : undefined, // Only add cache writes to every 3rd task
+							cacheReads: i % 3 === 0 ? Math.floor(20 + Math.random() * 80) : undefined, // Only add cache reads to every 3rd task
+							totalCost: Number((0.0001 + Math.random() * 0.01).toFixed(5)), // Random cost from $0.0001 to $0.0101
+							size: 1024 * 1024, // 1MB
+						}
+
+						// Update task history in global state
+						await provider.updateTaskHistory(historyItem)
+
+						progress.report({ increment: 100 / tasksCount })
+					}
+
+					// Update the UI to show the new tasks
+					await provider.postStateToWebview()
+
+					vscode.window.showInformationMessage(`Created ${tasksCount} test tasks`)
+				},
+			)
+		}),
+	]
+}
+
+/**
+ * Creates a realistic sequence of messages that would occur in a typical task
+ */
+function createRealisticMessageSequence(baseTimestamp: number, taskPrompt: string, taskIndex: number): ClineMessage[] {
+	// Use an incrementing timestamp to ensure messages appear in sequence
+	let timestamp = baseTimestamp
+	const getNextTimestamp = () => {
+		timestamp += 1000 // Add 1 second between messages
+		return timestamp
+	}
+
+	// Variables to make different test tasks look unique
+	const fileName = getRandomFileName(taskIndex)
+	const commitHash = `commit${taskIndex}${Math.floor(Math.random() * 1000000).toString(16)}`
+
+	// Create a realistic message sequence
+	const messages: ClineMessage[] = [
+		// Initial task message - uses "say" with "text" which is the format used in Cline.ts
+		{
+			ts: baseTimestamp,
+			type: "say",
+			say: "text",
+			text: taskPrompt,
+		},
+
+		// API request started
+		{
+			ts: getNextTimestamp(),
+			type: "say",
+			say: "api_req_started",
+			text: JSON.stringify({
+				request: `<task>\n${taskPrompt}\n</task>`,
+				tokensIn: Math.floor(100 + Math.random() * 200),
+				tokensOut: Math.floor(300 + Math.random() * 500),
+			}),
+		},
+
+		// Reasoning message
+		{
+			ts: getNextTimestamp(),
+			type: "say",
+			say: "reasoning",
+			text: `I'll approach this task by breaking it down into manageable steps. First, I'll analyze the requirements, then create a plan, and finally implement the solution systematically.`,
+		},
+
+		// Text response
+		{
+			ts: getNextTimestamp(),
+			type: "say",
+			say: "text",
+			text: `I'll help you with this task. Let me start by creating the necessary files and implementing the core functionality.`,
+		},
+	]
+
+	// Add task-specific messages based on index modulo to create variety
+	const messageType = taskIndex % 5
+
+	if (messageType === 0 || messageType === 2) {
+		// Tool use - file operations
+		messages.push({
+			ts: getNextTimestamp(),
+			type: "say",
+			say: "tool",
+			text: JSON.stringify({
+				tool: "newFileCreated",
+				path: fileName,
+				content: `// Sample code for ${taskPrompt}`,
+			}),
+		})
+	}
+
+	if (messageType === 1 || messageType === 3) {
+		// Command execution
+		messages.push(
+			{
+				ts: getNextTimestamp(),
+				type: "ask",
+				ask: "command",
+				text: `ls -la`,
+			},
+			{
+				ts: getNextTimestamp(),
+				type: "say",
+				say: "command_output",
+				text: `total 24\ndrwxr-xr-x 3 user staff 96 Mar 10 12:34 .\ndrwxr-xr-x 8 user staff 256 Mar 10 12:30 ..\n-rw-r--r-- 1 user staff 158 Mar 10 12:34 ${fileName}`,
+			},
+		)
+	}
+
+	if (messageType === 2 || messageType === 4) {
+		// Browser actions
+		messages.push(
+			{
+				ts: getNextTimestamp(),
+				type: "ask",
+				ask: "browser_action_launch",
+				text: `https://example.com`,
+			},
+			{
+				ts: getNextTimestamp(),
+				type: "say",
+				say: "browser_action_result",
+				text: JSON.stringify({
+					logs: "Page loaded successfully",
+					screenshot:
+						"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
+				}),
+			},
+			{
+				ts: getNextTimestamp(),
+				type: "say",
+				say: "browser_action",
+				text: JSON.stringify({
+					action: "close",
+				}),
+			},
+		)
+	}
+
+	// Add checkpoint
+	messages.push({
+		ts: getNextTimestamp(),
+		type: "say",
+		say: "checkpoint_created",
+		lastCheckpointHash: commitHash,
+	})
+
+	// Add completion result (all tasks end with this)
+	messages.push({
+		ts: getNextTimestamp(),
+		type: "say",
+		say: "completion_result",
+		text: `I've completed the task to ${taskPrompt.toLowerCase()}. The implementation includes all the required functionality and meets the specifications. ${"x".repeat(1024 * 1024)}`, // 1MB file
+		lastCheckpointHash: commitHash,
+	})
+
+	return messages
+}
+
+/**
+ * Returns a random task name for test data
+ */
+function getRandomTaskName(index: number): string {
+	const tasks = [
+		"Create a simple todo application",
+		"Build a weather forecast widget",
+		"Implement a markdown parser",
+		"Design a responsive landing page",
+		"Develop a currency converter",
+		"Create a file upload component",
+		"Build a data visualization dashboard",
+		"Implement a search functionality",
+		"Create a user authentication system",
+		"Design a dark mode toggle",
+		"Build a countdown timer",
+		"Create a drag and drop interface",
+		"Implement form validation",
+		"Design a multi-step wizard",
+		"Create a notification system",
+	]
+
+	return tasks[index % tasks.length] + ` (Test ${index + 1})`
+}
+
+/**
+ * Returns a random file name for test data
+ */
+function getRandomFileName(index: number): string {
+	const files = [
+		"index.html",
+		"styles.css",
+		"script.js",
+		"app.jsx",
+		"main.ts",
+		"utils.py",
+		"config.json",
+		"server.js",
+		"data.csv",
+		"README.md",
+	]
+
+	return files[index % files.length]
+}
diff --git a/src/extension.ts b/src/extension.ts
index 9a8daa1615f..372ee30dfca 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -32,6 +32,8 @@ export function activate(context: vscode.ExtensionContext) {
 
 	const sidebarProvider = new ClineProvider(context, outputChannel)
 
+	vscode.commands.executeCommand("setContext", "cline.isDevMode", IS_DEV && IS_DEV === "true")
+
 	context.subscriptions.push(
 		vscode.window.registerWebviewViewProvider(ClineProvider.sideBarId, sidebarProvider, {
 			webviewOptions: { retainContextWhenHidden: true },
@@ -193,6 +195,20 @@ export function activate(context: vscode.ExtensionContext) {
 	}
 	context.subscriptions.push(vscode.window.registerUriHandler({ handleUri }))
 
+	// Register size testing commands in development mode
+	if (IS_DEV && IS_DEV === "true") {
+		// Use dynamic import to avoid loading the module in production
+		import("./dev/commands/tasks")
+			.then((module) => {
+				const devTaskCommands = module.registerTaskCommands(context, sidebarProvider)
+				context.subscriptions.push(...devTaskCommands)
+				Logger.log("Cline dev task commands registered")
+			})
+			.catch((error) => {
+				Logger.log("Failed to register dev task commands: " + error)
+			})
+	}
+
 	context.subscriptions.push(
 		vscode.commands.registerCommand("cline.addToChat", async (range?: vscode.Range, diagnostics?: vscode.Diagnostic[]) => {
 			const editor = vscode.window.activeTextEditor


Reviews:
user: login: ellipsis-dev[bot]
body: :+1: Looks good to me! Incremental review on 2ac6af5b086d6fce942b4f74ed390329cfd493cf in <ellipsistime>39 seconds</ellipsistime>

<details>
<summary>More details</summary>

 - Looked at `11` lines of code in `1` files
 - Skipped `0` files when reviewing.
 - Skipped posting `3` drafted comments based on config settings.


<details>
<summary>1. <code>.changeset/nasty-pigs-camp.md:2</code></summary>

- **Draft comment:** 
Consider removing quotes from the package name for consistency with typical changeset formatting. If intentional, please document the reason.
- **Reason this comment was not posted:** 
Confidence changes required: `50%` <= threshold `50%`
None

</details>

<details>
<summary>2. <code>.changeset/nasty-pigs-camp.md:2</code></summary>

- **Draft comment:** 
Verify that 'claude-dev' is the intended release channel, and that a minor bump fits this dev-only change.
- **Reason this comment was not posted:** 
Comment did not seem useful. Confidence is useful = `0%` <= threshold `50%`
The comment is asking the PR author to verify their intention regarding the release channel and the appropriateness of a minor version bump. This violates the rule against asking the author to confirm their intention or ensure behavior is intended.

</details>

<details>
<summary>3. <code>.changeset/nasty-pigs-camp.md:5</code></summary>

- **Draft comment:** 
Consider expanding the description to note that this script is for dev mode only, ensuring clarity for future maintainers.
- **Reason this comment was not posted:** 
Confidence changes required: `50%` <= threshold `50%`
None

</details>


Workflow ID: <workflowid>`wflow_EoOG2xP6MD8Tzt73`</workflowid>

</details>


----
You can customize Ellipsis with :+1: / :-1: [feedback](https://docs.ellipsis.dev/review), review rules, user-specific overrides, `quiet` mode, and [more](https://docs.ellipsis.dev/config).

state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T17:20:07Z
user: login: ellipsis-dev[bot]
body: :x: Changes requested. Reviewed everything up to 7e68dd8d980718f0bdab01c3dc9cc2b2d7301187 in <ellipsistime>3 minutes and 2 seconds</ellipsistime>

<details>
<summary>More details</summary>

 - Looked at `345` lines of code in `3` files
 - Skipped `0` files when reviewing.
 - Skipped posting `2` drafted comments based on config settings.


<details>
<summary>1. <code>src/extension.ts:196</code></summary>

- **Draft comment:** 
Expected export name 'registerSizeTestingCommands' but 'tasks.ts' exports 'registerTaskCommands'. Update the import or export name accordingly.
- **Reason this comment was not posted:** 
Marked as duplicate.

</details>

<details>
<summary>2. <code>src/dev/commands/tasks.ts:25</code></summary>

- **Draft comment:** 
Specify the radix in parseInt (e.g. parseInt(count, 10)) for clarity and to avoid potential issues.
- **Reason this comment was not posted:** 
Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 20% vs. threshold = 50%
While specifying the radix is generally good practice, in this specific case: 1) The input comes from a UI prompt defaulting to "10" 2) The context makes it clear we're dealing with decimal numbers 3) Modern JS engines default to base 10 for parseInt() when the string doesn't start with 0x or 0o 4) This is dev-only test code. The risk of issues is extremely low.
The suggestion follows a good coding practice. Not specifying radix could theoretically cause issues if someone entered a number with leading zeros.
Given this is dev-only test code with a controlled input source, the benefit is minimal and doesn't justify the noise of an extra code review comment.
While technically correct, this suggestion is too minor for test code and doesn't meet the bar of being an important enough issue to flag in review.

</details>


Workflow ID: <workflowid>`wflow_nnPF8S5b7SIIxnQP`</workflowid>

</details>


----
**Want Ellipsis to fix these issues?** Tag `@ellipsis-dev` in a comment. You can customize Ellipsis with :+1: / :-1: [feedback](https://docs.ellipsis.dev/review), review rules, user-specific overrides, `quiet` mode, and [more](https://docs.ellipsis.dev/config).

state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T17:21:40Z
user: login: ellipsis-dev[bot]
body: :+1: Looks good to me! Incremental review on 4c0c0c947bfc18e1b55e5788941ee540058cc32f in <ellipsistime>1 minute and 10 seconds</ellipsistime>

<details>
<summary>More details</summary>

 - Looked at `21` lines of code in `1` files
 - Skipped `0` files when reviewing.
 - Skipped posting `4` drafted comments based on config settings.


<details>
<summary>1. <code>src/extension.ts:196</code></summary>

- **Draft comment:** 
Renamed registration function and variable from sizeTestingCommands to devTaskCommands to reflect their updated purpose for task creation. Ensure that module.registerTaskCommands is correctly exported.
- **Reason this comment was not posted:** 
Confidence changes required: `0%` <= threshold `50%`
None

</details>

<details>
<summary>2. <code>src/extension.ts:202</code></summary>

- **Draft comment:** 
Updated error log message to match the new dev task commands naming; verify consistency in error handling.
- **Reason this comment was not posted:** 
Confidence changes required: `0%` <= threshold `50%`
None

</details>

<details>
<summary>3. <code>src/extension.ts:197</code></summary>

- **Draft comment:** 
Renamed the command registration from 'registerSizeTestingCommands' to 'registerTaskCommands'. Ensure the module export and variable naming reflect the intended new functionality.
- **Reason this comment was not posted:** 
Comment looked like it was already resolved.

</details>

<details>
<summary>4. <code>src/extension.ts:202</code></summary>

- **Draft comment:** 
The error message was updated to reference 'dev task commands'. Confirm that all logging and messaging consistently use the new naming.
- **Reason this comment was not posted:** 
Comment did not seem useful. Confidence is useful = `0%` <= threshold `50%`
The comment is asking the PR author to confirm consistency in logging and messaging, which is against the rules. It doesn't provide a specific suggestion or point out a specific issue in the code.

</details>


Workflow ID: <workflowid>`wflow_wyWFXWrwpc6ADeMM`</workflowid>

</details>


----
You can customize Ellipsis with :+1: / :-1: [feedback](https://docs.ellipsis.dev/review), review rules, user-specific overrides, `quiet` mode, and [more](https://docs.ellipsis.dev/config).

state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T18:20:25Z
user: login: ellipsis-dev[bot]
body: :x: Changes requested. Incremental review on 3c516023c8d78c2f65442ff1e0d41815237eb609 in <ellipsistime>1 minute and 30 seconds</ellipsistime>

<details>
<summary>More details</summary>

 - Looked at `13` lines of code in `1` files
 - Skipped `0` files when reviewing.
 - Skipped posting `1` drafted comments based on config settings.


<details>
<summary>1. <code>src/extension.ts:193</code></summary>

- **Draft comment:** 
Consider unifying the IS_DEV checks. Using IS_DEV === 'true' here conflicts with other parts of the file which use IS_DEV !== 'false'. Ensure consistency to avoid unexpected dev behavior.
- **Reason this comment was not posted:** 
Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 20% vs. threshold = 50%
The comment has a valid point - there are two different ways of checking IS_DEV in the code. However, these checks serve different purposes in different parts of the code. The `=== "true"` check is more strict and appropriate for dev-only features, while the `!== "false"` check is more permissive. The change appears intentional to make dev features more strictly controlled.
I could be wrong about the intentionality of having different checks. Maybe it really is an oversight that could cause bugs.
The stricter check for dev-only features is likely intentional as a safety measure. Having different checks for different purposes is a valid pattern.
The comment should be deleted because the different IS_DEV checks appear to be intentionally different for different purposes, and the change to a stricter check for dev features seems appropriate.

</details>


Workflow ID: <workflowid>`wflow_rK69epkooEqG0HSR`</workflowid>

</details>


----
**Want Ellipsis to fix these issues?** Tag `@ellipsis-dev` in a comment. You can customize Ellipsis with :+1: / :-1: [feedback](https://docs.ellipsis.dev/review), review rules, user-specific overrides, `quiet` mode, and [more](https://docs.ellipsis.dev/config).

state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T18:22:39Z
user: login: dcbartlett
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-15T08:06:12Z
user: login: pashpashpash
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T19:47:34Z
user: login: saoudrizwan
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T00:05:30Z

Review comments:
diff_hunk: @@ -187,6 +189,20 @@
 	}
 	context.subscriptions.push(vscode.window.registerUriHandler({ handleUri }))
 
+	// Register size testing commands in development mode
+	if (IS_DEV && IS_DEV !== "false") {
+		// Use dynamic import to avoid loading the module in production
+		import("./dev/commands/tasks")
+			.then((module) => {
+				const sizeTestingCommands = module.registerSizeTestingCommands(context, sidebarProvider)
path: src/extension.ts
user: login: ellipsis-dev[bot]
body: Function name mismatch: you're calling `registerSizeTestingCommands` but `tasks.ts` exports `registerTaskCommands`.
```suggestion
				const sizeTestingCommands = module.registerTaskCommands(context, sidebarProvider)
```
created_at: 2025-03-14T17:21:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -32,6 +32,8 @@
 
 	const sidebarProvider = new ClineProvider(context, outputChannel)
 
+	vscode.commands.executeCommand("setContext", "cline.isDevMode", IS_DEV && IS_DEV === "true")
path: src/extension.ts
user: login: ellipsis-dev[bot]
body: Inconsistent dev mode checks: using `IS_DEV === "true"` here vs `IS_DEV !== "false"` later. Use a consistent check.
created_at: 2025-03-14T17:21:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -187,6 +189,20 @@ export function activate(context: vscode.ExtensionContext) {
 	}
 	context.subscriptions.push(vscode.window.registerUriHandler({ handleUri }))
 
+	// Register size testing commands in development mode
+	if (IS_DEV && IS_DEV === "true") {
path: src/extension.ts
user: login: ellipsis-dev[bot]
body: The revised check using `IS_DEV === 'true'` is clearer, but note that elsewhere (e.g., on line 223) the check uses `IS_DEV !== 'false'`. Consider normalizing `IS_DEV` (e.g., converting to a boolean once) and using a consistent condition across the file.
created_at: 2025-03-14T18:22:39Z
author_association: CONTRIBUTOR
path: src/extension.ts
user: login: dcbartlett
body: I have a task on the radar to refactor how we handle IS_DEV and make it more global.  For now, I would ignore ellipsis-dev on the consistency.
created_at: 2025-03-15T08:05:56Z
author_association: CONTRIBUTOR

PR comments:
user: login: changeset-bot[bot]
created_at: 2025-03-14T17:18:36Z
body: ###  🦋  Changeset detected

Latest commit: b092284f63bcaf42e38f136a912f2147fd6eb6b3

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 1 package</summary>

  | Name       | Type  |
| ---------- | ----- |
| claude-dev | Minor |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/cline/cline/new/dev-script-create-tasks?filename=.changeset/tender-plums-try.md&value=---%0A%22claude-dev%22%3A%20patch%0A---%0A%0ATasks%20Galore!%0A)


author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-14T17:18:47Z
body: This PR requires a changeset since it includes user-facing changes. Please:

1. Run `npm run changeset` locally
2. Choose the appropriate version bump:
   - `major` for breaking changes (1.0.0 → 2.0.0)
   - `minor` for new features (1.0.0 → 1.1.0)
   - `patch` for bug fixes (1.0.0 → 1.0.1)
3. Write a clear description of your changes
4. Commit the generated changeset file

Note: Documentation-only changes do not require a changeset.
author_association: CONTRIBUTOR
user: login: NightTrek
created_at: 2025-03-14T23:22:22Z
body: missing a changeset
author_association: CONTRIBUTOR
user: login: saoudrizwan
created_at: 2025-03-20T10:27:04Z
body: Closing until evan investigates `"when": "cline.isDevMode"` and checks if this option shows up in production builds or not
author_association: CONTRIBUTOR
user: login: celestial-vault
created_at: 2025-03-20T16:18:18Z
body: > Closing until evan investigates `"when": "cline.isDevMode"` and checks if this option shows up in production builds or not

Yes I've checked this by compiling a vsix and confirming the command does not show up
author_association: CONTRIBUTOR