You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Cline's SDK/CLI config contract has moved: configured agents now require description (rulesync can emit files Cline refuses to load), global modular rules exist at ~/.cline/rules/ but rulesync drops them, hooks have converged on the documented plugin surface (which invalidates the rationale for closing #1847), .clinerules is literally named DEPRECATED_CONFIG_DIR upstream, and .clineignore is now documented as "deprecate soon".
Upstream baselines at time of research: Cline (VS Code) v4.0.11 (2026-07-24), Cline CLI v3.0.46 (2026-07-19), SDK v0.0.65 (2026-07-19).
v4.0.1 (2026-06-28) — release — the VS Code extension was rolled back to the pre-SDK (3.89.2) codebase; the SDK migration continues on main. This is why the shipping extension still resolves only the legacy .clinerules paths.
v4.0.11 (2026-07-24) — release — model additions only.
cli-v3.0.23 (2026-06-10) — "Added support for configured agents as subagent tools".
Docs 9466fcc0 (2026-07-26, PR #12154) — hooks stub retitled "See details under SDK Plugins page".
Upstream path surface at v4.0.11
From resolve*ConfigSearchPaths() in sdk/packages/shared/src/storage/paths.ts (where .clinerules is literally the constant DEPRECATED_CONFIG_DIR) and apps/vscode/src/core/storage/disk.ts:
isYamlFile() accepts .ymland.yaml. A missing or empty description, or an empty body, makes parseConfiguredAgentConfig throw and the agent is skipped.
rulesync: project + global. ClineSubagentFrontmatterSchema (src/features/subagents/cline-subagent.ts) declares only name (required) and description (optional), and fromRulesyncSubagent emits whatever came in. Because canonical RulesyncSubagentFrontmatter (src/features/subagents/rulesync-subagent.ts) also has description optional, rulesync will happily write .cline/agents/<name>.yaml with no description — a file Cline refuses to load, with no warning from either side. tools / skills / providerId / modelId / maxIterations are reachable only through the untyped cline: escape section.
2. rules — global modular rules are silently dropped
Upstream: resolveRulesConfigSearchPaths() (v4.0.11) reads global rules from ~/.cline/rules/ and ~/Documents/Cline/Rules/ in addition to ~/.agents/AGENTS.md; the VS Code extension creates and reads ~/Documents/Cline/Rules (ensureRulesDirectoryExists in disk.ts). Docs: config ("~/.cline/rules/ — Global rules") and cline-rules.
rulesync: global returns only a root path — ~/.agents/AGENTS.md — and fromRulesyncRule throws for non-root rules in global mode (src/features/rules/cline-rule.ts). The --global dry-run emits one file and drops the four non-root rules that project mode emits, making Cline the only tool in the matrix with a 🌏 rules marker that cannot carry modular global rules.
3. hooks — upstream converged on the plugin surface, which invalidates #1847's close rationale
#1847 was closed not planned on 2026-07-24 because "the two active runtimes still expose incompatible discovery contracts" for file-based hook scripts. That remains true of the file-hook loaders, but the documented surface has moved:
v4.0.0 (2026-06-26) shipped Cline Plugins as the supported extension mechanism, and the plugins docs document a single unambiguous discovery contract: .cline/plugins/ (project) and ~/.cline/plugins/ (global), .ts/.js modules exporting an AgentPlugin, with an explicit scope warning ("Cline SDK, CLI, and Kanban… not applicable on VSCode and JetBrains Extension for now").
rulesync: unsupported — there is no src/features/hooks/cline-hooks.ts (the directory has 20+ other adapters), and the project dry-run emits no hook artifact.
rulesync already has the exact primitive needed: src/features/hooks/amp-plugin-generator.ts generates a JS/TS plugin module that shells out to the user's canonical hook commands, and src/features/hooks/pi-extension-generator.ts does the same for Pi.
4. rules / commands — the new .cline/* roots are not emitted (forward-looking)
Upstream: .cline/rules/ (project rules) and .cline/workflows/ (project workflows) are both in the v4.0.11 SDK/CLI search paths, and .cline/rules/ is documented at config. In the SDK path resolver .clinerules is the constant DEPRECATED_CONFIG_DIR.
Severity note: this is not currently broken. The rolled-back VS Code extension (v4.0.1 shipped the 3.89.2 extension code) reads only.clinerules and .clinerules/workflows, and the SDK/CLI reads both old and new roots — so rulesync's current output is the maximally compatible choice today. The gap is forward-looking.
5. ignore — .clineignore is officially on the way out
Upstream: the clineignore docs are now titled ".clineignore (deprecate soon)" (docs commit b919a7e8, 2026-07-21) with a warning that it "is not a security or access-control boundary… We're moving away from it as a supported feature." The documented replacement is not a config file but a plugin (sdk/examples/plugins/gitignore-read-files-guard.ts) that enforces via a beforeTool hook and reads .gitignore.
Make description required in ClineSubagentFrontmatterSchema (or fail validation with an explicit message naming Cline's requirement), add typed optional tools / skills / providerId / modelId / maxIterations fields, and accept .yml alongside .yaml on import.
Add a global nonRoot path for Cline rules writing ~/.cline/rules/*.md (read by CLI/SDK) and/or ~/Documents/Cline/Rules/*.md (read by both runtimes), keeping ~/.agents/AGENTS.md as the root file.
Reopen the hooks question scoped to the plugin surface: add a cline-plugin-generator.ts emitting .cline/plugins/<name>.ts (project) and ~/.cline/plugins/<name>.ts (global), mapping rulesync events onto beforeTool / afterTool / beforeRun / afterRun. This targets one documented contract, needs no executable-bit or multi-file plumbing, and carries no duplicate-execution risk (the file-hook loaders never look at plugins/). Document the VS Code/JetBrains limitation that upstream itself documents.
Track the .cline/rules + .cline/workflows migration and switch (or dual-emit with import from both) once the SDK-backed VS Code extension ships as stable. Also consider ~/.cline/workflows for global commands.
No code change is forced for .clineignore yet, but the matrix ✅ should be qualified as a deprecated surface. The eventual replacement is the plugin surface from gap 3 — another reason to build the Cline plugin generator.
Minor / not gaps
mcp scope is correct — sdk/packages/core/src/extensions/mcp/config-loader.ts resolves exclusively through resolveMcpSettingsPath() → ~/.cline/data/settings/cline_mcp_settings.json. docs/cli/cli-reference lists a project .cline/mcp.json and docs/mcp/mcp-overview lists ~/.cline/mcp.json, but neither appears in any v4.0.11 loader, so those doc lines look stale. rulesync's global-only mapping matches the code.
mcp entry shape — the canonical registration is now nested ({ transport: { type, command|url, … }, disabled, metadata, oauth }); the flat form rulesync writes is explicitly kept as legacy*RegistrationSchema and still parses. isMcpServers (src/types/mcp.ts) is permissive enough that nested entries round-trip untouched.
rules frontmatter — paths is the only evaluated conditional (rule-conditionals.ts: conditionalEvaluators = { paths }, unknown keys ignored). The alwaysApply / description keys rulesync writes are inert but harmless.
permissions is an inert artifact — pre-existing design, not an upstream change.CommandPermissionController reads CLINE_COMMAND_PERMISSIONS from the environment and nothing else; no Cline code path loads .cline/command-permissions.json. rulesync knows this (src/features/permissions/cline-permissions.ts tells the user to export CLINE_COMMAND_PERMISSIONS=$(cat .cline/command-permissions.json)), but the README matrix's plain ✅ overstates it. Worth a doc qualification rather than a code change.
New surfaces with no rulesync feature dimension: cron/scheduled agents (.cline/cron/, ~/.cline/cron/) and agent teams (~/.cline/data/teams/).
Open questions / unconfirmed
Whether .cline/mcp.json (project) or ~/.cline/mcp.json ever functions: listed in docs/cli/cli-reference and docs/mcp/mcp-overview but absent from every v4.0.11 loader read. Treated as stale documentation.
Global workflows path: docs say ~/.cline/data/workflows/, paths.ts says ~/.cline/workflows. Code was preferred; the discrepancy is unconfirmed.
Whether the SDK-backed VS Code extension (reverted in v4.0.1) will re-land with the .cline/rules + .cline/workflows roots — no upstream statement of timing found. This gates gap 4.
Summary
Cline's SDK/CLI config contract has moved: configured agents now require
description(rulesync can emit files Cline refuses to load), global modular rules exist at~/.cline/rules/but rulesync drops them, hooks have converged on the documented plugin surface (which invalidates the rationale for closing #1847),.clinerulesis literally namedDEPRECATED_CONFIG_DIRupstream, and.clineignoreis now documented as "deprecate soon".Upstream baselines at time of research: Cline (VS Code) v4.0.11 (2026-07-24), Cline CLI v3.0.46 (2026-07-19), SDK v0.0.65 (2026-07-19).
Recent Releases
main. This is why the shipping extension still resolves only the legacy.clinerulespaths.cline skillinstall/manage command.0b0ca9b1(2026-05-12, PR #10350) — deleted the 514-line file-hooks reference, leavingdocs/customization/hooksa stub pointing at/sdk/plugins.b919a7e8(2026-07-21, PR #12410) —.clineignoremarked "deprecate soon".9466fcc0(2026-07-26, PR #12154) — hooks stub retitled "See details under SDK Plugins page".Upstream path surface at v4.0.11
From
resolve*ConfigSearchPaths()insdk/packages/shared/src/storage/paths.ts(where.clinerulesis literally the constantDEPRECATED_CONFIG_DIR) andapps/vscode/src/core/storage/disk.ts:disk.ts)AGENTS.md,.clinerules/,.cline/rules/,~/.agents/AGENTS.md,~/.cline/rules/,~/Documents/Cline/Rules.clinerules,AGENTS.md,~/Documents/Cline/Rules.clinerules/workflows,~/Documents/Cline/Workflows,~/.cline/workflows,.cline/workflows.clinerules/workflows,~/Documents/Cline/Workflows.clinerules/skills,.cline/skills,.agents/skills,~/.cline/skills,~/.agents/skills.claude/skills.cline/agents,~/.cline/agents~/Documents/Cline/Hooks,~/.cline/hooks,.clinerules/hooks,.cline/hooks.clinerules/hooks.cline/plugins,~/.cline/plugins~/.cline/data/settings/cline_mcp_settings.jsononlyCLINE_COMMAND_PERMISSIONSenv var onlyGaps
1. subagents — Cline's agent frontmatter contract has moved past rulesync's
Upstream (
sdk/packages/core/src/extensions/tools/team/configured-agent-config.ts, v4.0.11; feature landed cli-v3.0.23, 2026-06-10):isYamlFile()accepts.ymland.yaml. A missing or emptydescription, or an empty body, makesparseConfiguredAgentConfigthrow and the agent is skipped.rulesync:
project+global.ClineSubagentFrontmatterSchema(src/features/subagents/cline-subagent.ts) declares onlyname(required) anddescription(optional), andfromRulesyncSubagentemits whatever came in. Because canonicalRulesyncSubagentFrontmatter(src/features/subagents/rulesync-subagent.ts) also hasdescriptionoptional, rulesync will happily write.cline/agents/<name>.yamlwith nodescription— a file Cline refuses to load, with no warning from either side.tools/skills/providerId/modelId/maxIterationsare reachable only through the untypedcline:escape section.2. rules — global modular rules are silently dropped
resolveRulesConfigSearchPaths()(v4.0.11) reads global rules from~/.cline/rules/and~/Documents/Cline/Rules/in addition to~/.agents/AGENTS.md; the VS Code extension creates and reads~/Documents/Cline/Rules(ensureRulesDirectoryExistsindisk.ts). Docs: config ("~/.cline/rules/— Global rules") and cline-rules.globalreturns only arootpath —~/.agents/AGENTS.md— andfromRulesyncRulethrows for non-root rules in global mode (src/features/rules/cline-rule.ts). The--globaldry-run emits one file and drops the four non-root rules that project mode emits, making Cline the only tool in the matrix with a🌏rules marker that cannot carry modular global rules.3. hooks — upstream converged on the plugin surface, which invalidates #1847's close rationale
#1847 was closed not planned on 2026-07-24 because "the two active runtimes still expose incompatible discovery contracts" for file-based hook scripts. That remains true of the file-hook loaders, but the documented surface has moved:
docs/customization/hooks.mdxlost its entire 514-line file-hook reference on 2026-05-12 (commit0b0ca9b1) and is now a two-line stub pointing at /sdk/plugins. Thedocs.cline.bot/features/hooks/hook-referencepage cited in Add Cline hooks adapter (executable per-event scripts; needs multi-file output + executable-bit plumbing) #1847's triage no longer exists..cline/plugins/(project) and~/.cline/plugins/(global),.ts/.jsmodules exporting anAgentPlugin, with an explicit scope warning ("Cline SDK, CLI, and Kanban… not applicable on VSCode and JetBrains Extension for now").input,runtime_event,session_start,run_start,iteration_start,turn_start,before_agent_start,tool_call_before,tool_call_after,turn_end,stop_error,iteration_end,run_end,session_shutdown,error; plugin objects exposebeforeRun/afterRun/beforeModel/afterModel/beforeTool/afterTool/onEventplus per-hook policies (mode,timeoutMs,retries,failureMode, …).unsupported— there is nosrc/features/hooks/cline-hooks.ts(the directory has 20+ other adapters), and the project dry-run emits no hook artifact.src/features/hooks/amp-plugin-generator.tsgenerates a JS/TS plugin module that shells out to the user's canonical hook commands, andsrc/features/hooks/pi-extension-generator.tsdoes the same for Pi.4. rules / commands — the new
.cline/*roots are not emitted (forward-looking).cline/rules/(project rules) and.cline/workflows/(project workflows) are both in the v4.0.11 SDK/CLI search paths, and.cline/rules/is documented at config. In the SDK path resolver.clinerulesis the constantDEPRECATED_CONFIG_DIR..clinerules/only; commands project →.clinerules/workflows, global →~/Documents/Cline/Workflows(src/constants/cline-paths.ts,src/features/commands/cline-command.ts)..clinerulesand.clinerules/workflows, and the SDK/CLI reads both old and new roots — so rulesync's current output is the maximally compatible choice today. The gap is forward-looking.5. ignore —
.clineignoreis officially on the way outb919a7e8, 2026-07-21) with a warning that it "is not a security or access-control boundary… We're moving away from it as a supported feature." The documented replacement is not a config file but a plugin (sdk/examples/plugins/gitignore-read-files-guard.ts) that enforces via abeforeToolhook and reads.gitignore.project, straight.clineignorepassthrough (src/features/ignore/cline-ignore.ts).Proposed Follow-up
descriptionrequired inClineSubagentFrontmatterSchema(or fail validation with an explicit message naming Cline's requirement), add typed optionaltools/skills/providerId/modelId/maxIterationsfields, and accept.ymlalongside.yamlon import.nonRootpath for Cline rules writing~/.cline/rules/*.md(read by CLI/SDK) and/or~/Documents/Cline/Rules/*.md(read by both runtimes), keeping~/.agents/AGENTS.mdas the root file.cline-plugin-generator.tsemitting.cline/plugins/<name>.ts(project) and~/.cline/plugins/<name>.ts(global), mapping rulesync events ontobeforeTool/afterTool/beforeRun/afterRun. This targets one documented contract, needs no executable-bit or multi-file plumbing, and carries no duplicate-execution risk (the file-hook loaders never look atplugins/). Document the VS Code/JetBrains limitation that upstream itself documents..cline/rules+.cline/workflowsmigration and switch (or dual-emit with import from both) once the SDK-backed VS Code extension ships as stable. Also consider~/.cline/workflowsfor global commands..clineignoreyet, but the matrix✅should be qualified as a deprecated surface. The eventual replacement is the plugin surface from gap 3 — another reason to build the Cline plugin generator.Minor / not gaps
sdk/packages/core/src/extensions/mcp/config-loader.tsresolves exclusively throughresolveMcpSettingsPath()→~/.cline/data/settings/cline_mcp_settings.json.docs/cli/cli-referencelists a project.cline/mcp.jsonanddocs/mcp/mcp-overviewlists~/.cline/mcp.json, but neither appears in any v4.0.11 loader, so those doc lines look stale. rulesync's global-only mapping matches the code.{ transport: { type, command|url, … }, disabled, metadata, oauth }); the flat form rulesync writes is explicitly kept aslegacy*RegistrationSchemaand still parses.isMcpServers(src/types/mcp.ts) is permissive enough that nested entries round-trip untouched.pathsis the only evaluated conditional (rule-conditionals.ts:conditionalEvaluators = { paths }, unknown keys ignored). ThealwaysApply/descriptionkeys rulesync writes are inert but harmless.name+description(≤1024 chars);ClineSkillFrontmatterSchemamatches.CommandPermissionControllerreadsCLINE_COMMAND_PERMISSIONSfrom the environment and nothing else; no Cline code path loads.cline/command-permissions.json. rulesync knows this (src/features/permissions/cline-permissions.tstells the user toexport CLINE_COMMAND_PERMISSIONS=$(cat .cline/command-permissions.json)), but the README matrix's plain✅overstates it. Worth a doc qualification rather than a code change..cline/cron/,~/.cline/cron/) and agent teams (~/.cline/data/teams/).Open questions / unconfirmed
.cline/mcp.json(project) or~/.cline/mcp.jsonever functions: listed indocs/cli/cli-referenceanddocs/mcp/mcp-overviewbut absent from every v4.0.11 loader read. Treated as stale documentation.~/.cline/data/workflows/,paths.tssays~/.cline/workflows. Code was preferred; the discrepancy is unconfirmed..cline/rules+.cline/workflowsroots — no upstream statement of timing found. This gates gap 4.References
DEPRECATED_CONFIG_DIR(gaps 2, 4).description(gap 1).~/.cline/rules/and.cline/rules/(gaps 2, 4)..clinerulesis still the compatible choice (gap 4).