* chore: remove legacy cli/ source and direct references
The legacy React Ink CLI in cli/ has been superseded by the new SDK
CLI at sdk/apps/cli/ (published as cline@nightly today, taking over
the cline npm package on the next latest cut).
This commit deletes the cli/ source tree (~9.5MB, 142 files) and the
remaining references that point at it:
- .clinerules/cli.md (the per-area tribal-knowledge file for working
in cli/)
- package.json workspaces: drop the "cli" entry (root no longer
publishes a workspace from there)
- package.json coverage excludes: drop the stale **/evals/cli/**
paths (the directory does not exist)
- tsconfig.json: drop "cli/src/**/*" from the include list so the
root typecheck stops trying to walk into a missing tree
- .github/copilot-instructions.md: drop the CLI architecture bullet
and the cli/src/components/ModelPicker.tsx mention from the
add-API-provider checklist
Intentionally left alone:
- .claude/hooks/claude-code-for-web-setup.sh references
github.com/cli/cli (the gh CLI), not our deleted cli/
- src/core/locks/SqliteLockManager.ts comments mention
cli/pkg/common/schema.go which is the Go-based cline-core schema,
a different component
- .github/workflows/cline-evals-regression.yml is already disabled
pending rewire at the new SDK CLI
* chore: remove orphaned legacy CLI distribution scripts
With cli/ gone, the public-install path (curl | bash → install.sh →
download CLI binaries from cline/cline GitHub releases) and the
enterprise endpoint-bundling helpers no longer have anything to
install or bundle:
- scripts/install.sh — curl-bash installer that downloaded the old
CLI binary from cline/cline GH releases. The new install path is
npm i -g cline.
- scripts/test-install.sh — only tested install.sh.
- scripts/test-bundled-endpoints.sh — built a VSIX *and* CLI tgz with
bundled staging endpoints for enterprise distribution. The CLI half
is dead; the VSIX half can be done with vsce + add-endpoints-to-vsix.sh
directly. The script as a whole was niche test infra, not production.
- scripts/add-endpoints-to-npm.sh — injected endpoints.json into the
old CLI's npm tarball. Companion add-endpoints-to-vsix.sh and
add-endpoints-to-jetbrains.sh stay (they target the extension and
JetBrains plugin).
- package.json: drop the orphaned `test:install` root script that
wrapped scripts/test-install.sh.
If install.cline.bot (or any public URL) was still serving
scripts/install.sh as a curl|bash target, that URL will 404 after
this lands. Worth checking and either redirecting or stubbing with
a `npm i -g cline` hint.
* chore: clean up legacy CLI references
* chore: disable legacy smoke eval workflow
* Revert "chore: disable legacy smoke eval workflow"
This reverts commit 193ee78718.
* chore: remove disabled smoke eval workflow
* docs: clarify disabled smoke eval CI
- Update root package.json axios from 1.13.6 to 1.15.0
- Update evals/package.json axios from 1.13.6 to 1.15.0
- Update docs/package.json axios override from 1.13.5 to 1.15.0
- Regenerate all package-lock.json files
* fix: catch errors in path-based tool handlers instead of crashing
ListCodeDefinitionNamesToolHandler, ListFilesToolHandler, and
SearchFilesToolHandler let exceptions from their core operations
propagate through ToolExecutor's re-throw path, crashing the CLI
process. This is the same class of bug fixed for ReadFileToolHandler
in #9730.
Changes per handler:
- Wrap the core operation in try/catch, returning formatResponse.toolError()
on failure so the model can see the error and recover gracefully.
- Move consecutiveMistakeCount reset to after a successful operation so
repeated failures accumulate toward the yolo-mode mistake limit.
- Increment consecutiveMistakeCount on caught errors.
Add end-to-end tests exercising each handler with a mock TaskConfig,
covering: non-existent paths, missing parameters, failure accumulation,
and success-based counter reset.
* address review: expand try/catch scope, add stub-based tests
- Include resolveWorkspacePath inside try/catch in
ListCodeDefinitionNamesToolHandler and ListFilesToolHandler (matching
SearchFilesToolHandler's pattern) so path resolution failures are
also caught gracefully.
- Fix trivially-true assertion in file-not-a-directory test.
- Add 6 new stub-based tests that force core operations to throw:
parseSourceCodeForDefinitionsTopLevel, listFiles, and
determineSearchPaths — verifying the catch paths return
formatResponse.toolError() and increment consecutiveMistakeCount.
- Total: 19 passing tests (up from 13).
* address review: move clineignore check before IO in ListFilesToolHandler
Move the .clineignore access validation before resolveWorkspacePath and
listFiles so blocked paths are rejected without incurring IO cost.
Also ensures consecutiveMistakeCount is only reset after all
validations and the core operation succeed.
* address review: increment counter on clineignore denial
Clineignore denial in ListFilesToolHandler now increments
consecutiveMistakeCount so repeated attempts at blocked paths
accumulate toward the yolo-mode mistake limit. Added 2 tests
verifying single and repeated clineignore denials.
Total: 21 passing tests.
* fix: increment consecutiveMistakeCount when SearchFilesToolHandler searches fail
Previously, SearchFilesToolHandler's executeSearch() caught regexSearchFiles
errors and returned {success: false}, but the handler unconditionally reset
consecutiveMistakeCount to 0 even when ALL searches failed. This contradicted
the PR's goal of accumulating failures toward the yolo-mode mistake limit.
Now we check if any search succeeded before resetting the counter:
- If at least one search succeeded: reset to 0 (existing behavior for successes)
- If all searches failed: increment the counter (new fix)
Also added comprehensive test coverage for this scenario, including tests for:
- regexSearchFiles throwing errors
- Repeated search failures accumulating
- Successful search resetting the counter after failures
* fix: detect error strings in ListCodeDefinitionNamesToolHandler
parseSourceCodeForDefinitionsTopLevel returns error strings instead of
throwing exceptions for file paths and non-existent directories. The
handler now detects these error conditions and increments
consecutiveMistakeCount so repeated failures accumulate correctly.
This addresses Greptile's feedback that the counter was unconditionally
resetting to 0 for all real-world failure modes of this handler.
* add tui UI tests
using microsoft/tui-test library, can run many headless versions of
cline and execute ui tests (requires Node <= 20)
improve brittle sleep calls
* add cli-tui-tests github action
---------
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
* chore: replace baseUrl with explicit relative paths in tsconfig files
Remove `baseUrl: "."` from tsconfig configurations and update all path aliases to use explicit relative paths (e.g., `./src/*` instead of `src/*`). This makes path resolution more explicit and avoids potential ambiguity in module resolution across the main project and webview-ui configurations.
* update package-lock.json
* Release V3.67.0
Bump version from 3.66.0 to 3.67.0 in package.json and
package-lock.json. Add changelog entry for v3.67.0 covering new
features (subagent skills, AgentConfigLoader, Responses API, websocket
preconnect, CLI /q command), bug fixes (reasoning delta crash, OpenAI
tool ID, auth checks, Gemini 3.1 Pro), and other changes. Update
WhatsNewItems fallback banners to reflect current promotions.
* Fixing stuff
* refactor: centralize tool handler registration and filter by allowed tools
- Create centralized toolHandlersMap for all tool handler instantiation
- Add registerToolHandlers method to register only allowed tools from config
- Filter subagent tools to only include allowed tools from allowedTools config
- Remove scattered tool handler registration logic in favor of single source of truth
- Improve maintainability by consolidating tool handler creation in one place
This refactoring ensures subagents only have access to explicitly allowed tools
and makes the tool registration process more maintainable and consistent.
It also improves separation of concerns by having the coordinator manage all tool handler registration, while the executor focuses on orchestration. The allowedTools parameter enables runtime filtering of available tools for different contexts.
Also update PromptRegistry to load synchronous and simplify variant lookup
- Convert async load() to synchronous, called in constructor as both loadVariants and loadComponents are not async functions
- Remove health check logic and loaded state tracking
- Extract getVariant() method with proper generic fallback
- Add getComponents() accessor and simplify component loading
- Convert variant/component loaders from async to synchronous
- Remove unnecessary await calls throughout the codebase
- Add PromptRegistry tests for variant resolution and components
* fix test
* feat: add AgentConfigLoader for file-based agent configs
Add AgentConfigLoader singleton to manage agent configurations loaded from
YAML files in the agents directory. Supports hot-reloading via file watcher,
validates config schema with Zod, and integrates with extension lifecycle
(StateManager initialization and tearDown disposal).
* add tests
* add missing export
* update tests
* feat(tools): implement dynamic tool registration for subagents
Updates the tool system to support dynamically registered subagents as individual tools.
- Modifies `ClineToolSet` to generate specific tool definitions for configured subagents via `AgentConfigLoader`.
- Updates `parseAssistantMessageV2` to use `getToolUseNames()` instead of a static list, enabling the parser to recognize dynamic tool tags.
- Replaces the generic `USE_SUBAGENTS` tool with specific subagent instances when available in the system prompt context.
* update config path and refine tool descriptions
- Relocate the subagent configuration directory from `~/.cline/data/agents` to `~/Documents/Cline/Agents` to improve user accessibility.
- Update subagent tool descriptions and parameter instructions in the system prompt to be more descriptive and helpful for the model.
* revert unrelated changes
* revert unrelated changes
* update unit test
* fix: await AgentConfigLoader initialization before StateManager completes
Ensure agent configs are fully loaded during StateManager initialization
by awaiting the `ready()` promise. Previously, `AgentConfigLoader` was
instantiated without waiting for the initial load to complete, causing
potential race conditions where configs might not be available when
needed.
- Add `initialLoadPromise` field to track the async initial load
- Expose a `ready()` method to allow callers to await initialization
- Await `AgentConfigLoader.getInstance().ready()` in StateManager
* set previousRequestTotalTokens
Updating CHANGELOG.md format
update changelog
update banner and bump version
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
- Fixes for Minimax model family
- Fixes for Response chaining for OpenAI's Responses API
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>