refactor(agent): remove CherryClaw branding and the Soul Mode toggle#16726
refactor(agent): remove CherryClaw branding and the Soul Mode toggle#16726vaayne wants to merge 51 commits into
Conversation
…ntry The commit hashes recorded before the rebase onto origin/main are stale; point the entry at the PR instead. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…n registry design doc The soul-mode entry now lists all PR #16726 commits and documents the interactive-tool overlay removal (agents regain AskUserQuestion, plan-mode, and worktree tools). The declarative-tool-registry design doc gets a status note marking soul de-gating and the claw→cherry-tools merge as landed so its claw/soul references read as history. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…ntry The commit hashes recorded before the rebase onto origin/main are stale; point the entry at the PR instead. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…n registry design doc The soul-mode entry now lists all PR #16726 commits and documents the interactive-tool overlay removal (agents regain AskUserQuestion, plan-mode, and worktree tools). The declarative-tool-registry design doc gets a status note marking soul de-gating and the claw→cherry-tools merge as landed so its claw/soul references read as history. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…n process All agents now run with autonomy enabled, so the soul_enabled branches collapse: claw + agent-memory MCP servers are always injected, the mcp__claw__ auto-approve prefix and allowlist wildcards always apply, AGENT_DISALLOWED_TOOLS (renamed from SOUL_MODE_DISALLOWED_TOOLS) is always spread, and buildSystemPrompt always uses the PromptBuilder workspace prompt (the preset claude_code path became unreachable). AgentTaskService drops the soul/bypassPermissions eligibility gate; the claw config tool no longer reports soul_enabled. Renderer, zod schema, i18n, and CherryClaw branding follow in subsequent commits. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…schema With soul-mode behavior unconditional in the main process, the flag has no remaining effect: remove the SoulModeField toggle, the soulEnabled form state and its bidirectional coupling with bypassPermissions (permission_mode is now a fully independent setting), the soul-gated composer placeholder branch, the soul_enabled: true seeds on agent creation presets, the scheduled-task agent eligibility filter, and the channels soulModeRequired warning. soul_enabled is removed from the configuration zod schema; the schema is .loose() so stored configs keep parsing with the stale key ignored. Orphaned i18n keys are removed in a follow-up commit. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…gents engine The former cherryclaw/ directory is the default prompt/heartbeat engine for every agent now, so its three modules (prompt, seedWorkspace, heartbeat) move up into src/main/ai/agents/. Delete the dead seedWorkspaceTemplates and buildToolGuidance paths and simplify composeToolGuidance (claw guidance always applies). De-brand prompt and channel-security wording, drop the CherryClaw docs set and its image, and update architecture doc trees. Kept intentionally: the 'cherry-claw' → 'claude-code' read-time type remap in AgentService and the 'cherry-claw-default' id remap migrator — both are data-migration shims for existing databases. agent.cherryClaw.* i18n keys are renamed in the next commit. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…rryClaw namespace
Delete the orphaned soul keys (library.config.agent.field.soul_enabled.*,
agent.settings.soulMode.*, the channels soulModeRequired warning, the
obsolete permission_mode.help text, and the unreferenced
agent.cherryClaw soul/sandbox/scheduler/warning/heartbeat groups) and
rename agent.cherryClaw.channels.* / agent.cherryClaw.tasks.* to
agent.channels.* / agent.tasks.* across all twelve locale files, with
code references updated. agent.input.soul_placeholder becomes
agent.input.agent_placeholder (the {{key}} placeholder variant is still
used by the missing-agent composer, so both keys remain). Brand-suffixed
strings like "bypassPermissions (Soul)" are neutralized, and lingering
soul-mode comment references in main are cleaned up.
Adds the breaking-changes entry documenting the removed Autonomous Mode
toggle.
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…ntry The commit hashes recorded before the rebase onto origin/main are stale; point the entry at the PR instead. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…verlay Remove AGENT_DISALLOWED_TOOLS (the former soul-mode overlay): agents keep AskUserQuestion, plan-mode, and worktree tools. Cron*, TodoWrite, and NotebookEdit stay blocked regardless — they are classified exposure: 'disabled' in the declarative tool registry, which was always the authoritative layer for them. The assistant role's pre-existing AskUserQuestion disable is restored explicitly. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Last CherryClaw branding residue: the in-process autonomy MCP server 'claw' becomes 'cherry', so its tools are now mcp__cherry__cron / mcp__cherry__notify / mcp__cherry__config. Registry keys, the auto-approve prefix and allowlist wildcard, condition predicates, prompts (bootstrap + channel security + tool guidance), the agent.tools.builtin.CherryCron i18n label key, and tests follow. Prefix matching keeps the trailing __ delimiter, so mcp__cherry__ and mcp__cherry-tools__ cannot shadow each other; a regression test guards this. Agents whose persisted disabledTools contain the old mcp__claw__cron name lose that override (accepted pre-release). Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Fold the standalone cherry MCP server (cron/notify/config) into cherry-tools so all injected builtin tools live under one server and one mcp__cherry-tools__ namespace. The autonomy handlers move verbatim to cherryAutonomyTools.ts; CherryBuiltinToolsServer registers them only when constructed with a per-session agent context. cron/notify/config join the explicit auto-approve list (they were blanket-allowed as mcp__cherry__* before), while kb_manage keeps its per-call approval. Pre-release break: persisted disabledTools entries using the old mcp__cherry__cron name lose their override; no remap shim added. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
… merge Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The server's only production call site (settingsBuilder) always has the session's agent context, so the optional no-context mode was speculative flexibility with zero users. Make the context required and drop the conditional autonomy-tool registration plus its dead-mode test. Also fix the builtinTools comment: the tool registry hardcodes the runtime names and does not import these constants. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The branch deleted seedWorkspaceTemplates, leaving only the bootstrap instructions and the SOUL.md content threshold — nothing in the file seeds a workspace anymore. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…n registry design doc The soul-mode entry now lists all PR #16726 commits and documents the interactive-tool overlay removal (agents regain AskUserQuestion, plan-mode, and worktree tools). The declarative-tool-registry design doc gets a status note marking soul de-gating and the claw→cherry-tools merge as landed so its claw/soul references read as history. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Soul-mode removal made the soul example prompt ('Help me connect to
Telegram') the placeholder for every agent session, dropping the send
shortcut and slash-search hints. Restore the generic placeholder and
delete the now-orphaned agent.input.agent_placeholder key from all
locales.
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
update_channel / remove_channel / reconnect_channel took a raw channel_id and mutated any agent's channel. The config tool is auto-approved and now injected for every agent, so reject foreign channels with the same "not found" error as missing ones (no existence leak). Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Review flagged residual 'wires skills' claims in the tool-registry doc. The SkillsServer is defined but injected nowhere by buildMcpServers(); reconcile the PR-7 line, the de-soul-gating risk, and the 'skills newly wired' risk item to say wiring stays deferred/unmounted, matching the earlier note and classification. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…istorical Review flagged that the fs-usage audit still points at deleted/renamed paths. PR #16726 removed seedWorkspace.ts and moved prompt.ts/heartbeat.ts to ai/agents/ and claw.ts to ai/mcp/servers/cherryAutonomyTools.ts. Add historical markers (incl. the un-flagged heartbeat entry, same class) so future audit work doesn't chase dead paths, and refresh the import-style summary row. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The idle-reuse guard also rebuilds when no live connection exists yet but a non-headless connect is still in flight (connecting set, connection undefined) and a headless run arrives. Add the regression test for that branch alongside the two live-connection headless cases. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
All three suggestions fixed + full self-review passThanks @eeee0717. Addressed all three, and rather than trickle these out I did a complete independent + adversarial sweep of the whole diff to close the loop — details at the end. 1. 2. Stale 3. In-flight Full-diff review (not just these lines). Ran my own pass plus an independent adversarial review of
CI green (general-test, basic-checks, changeset, catalog, changes). Re-requesting @eeee0717. |
eeee0717
left a comment
There was a problem hiding this comment.
Findings:
- Blocking:
src/main/data/services/AgentTaskService.ts:96and:190still pass raw taskchannelIdsintoreplaceTaskSubscriptions()without checking that each channel belongs to the task'sagentId. The MCPcron addpath now validates ownership, but the DataApi/settings path can still create or update Agent A's scheduled task with Agent B's channel id, which sends scheduled output into the wrong Telegram/Slack/etc. channel. Please enforcechannel.agentId === agentIdat the service boundary, and/or filter the settings channel picker by the selected task agent before writing subscriptions. - Blocking:
src/main/ai/runtime/claudeCode/settingsBuilder.ts:640still treats any session with a persisted channel link as headless viachannelService.findBySessionId(session.id), even when the current turn was opened from the interactive renderer path withheadless: false. Opening a channel-linked session in the app UI would therefore rebuild settings withAskUserQuestiondisabled despite an interactive responder being present. Now that headless is explicitly plumbed through scheduled/channel call sites, the build-time policy should key off the current run'soptions.headless === truerather than the persistent channel link fallback, or otherwise distinguish channel-triggered turns from UI-triggered turns. - Suggestion:
v2-refactor-temp/docs/ai/declarative-tool-registry.md:75and:146still describebuildMcpServers()as injecting in-process MCP servers only when at least one tool is enabled. Current code and tests injectcherry-toolsandagent-memoryfor every session and rely ondisallowedTools/ hooks for per-tool policy, withskillsstill unmounted. Please update those stale lines to match the current model. - Suggestion:
v2-refactor-temp/docs/ai/data-cluster.md:87still listssoul_enabledas a typedAgentConfigurationSchemakey, but this PR removes that key from the schema and documents stored values as ignored. Please remove it from the current key list or mark it historical so follow-up data/API reviews do not treat it as live schema surface.
CI: GitHub checks are green for this head (changes, catalog-hand-edit-check, changeset-check, basic-checks, general-test, and render-test passed; notify skipped). Local pnpm lint/test/format was not run per repository review rules.
修复后请 request eeee0717 再进行后续 review。
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
createTask/updateTask validated nothing about incoming channelIds, so the DataApi/settings path could attach another agent's channel to a task and deliver scheduled output into the wrong IM channel. Enforce channel.agentId === agentId at the service boundary with the same 'not found' response as the MCP cron guard (no existence leak), and filter the Tasks settings channel picker by the task's agent so users are never offered a channel the service would reject. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
buildToolPermissions treated any session with a persisted channel link as headless, so opening a channel-linked session interactively in the app disabled AskUserQuestion despite a live responder. Scheduled and channel dispatches both pass headless: true explicitly and the runtime rebuilds warm connections on a headless mismatch, so the findBySessionId fallback is redundant on headless paths and wrong on interactive ones — drop it. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
cherry-tools/agent-memory are injected for every session with per-tool policy via disallowedTools/hooks, and soul_enabled is no longer a typed AgentConfigurationSchema key — mark it historical. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Review follow-up — all four findings addressed (
|
CherryNotify and CherryConfig are exposure 'user' like CherryCron, so the agent edit dialog renders them via agent.tools.builtin.<key> — but only CherryCron had locale entries, leaving the two new cards in untranslated fallback. The dynamic template key is invisible to i18n:check. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Full-PR multi-lens review (3 parallel independent reviewers, basis
|
There was a problem hiding this comment.
This review was translated automatically.
Findings:
- Blocking:
src/main/ai/streamManager/context/AgentChatContextProvider.ts:98drops the backendheadless: truestate when a channel-bound session is already busy. The busy branch only callsenqueueUserMessage(sessionId, userMessage), andenqueueUserMessage()can either steer into the current non-headless connection or queue the next turn without changing the connection's baked tool policy. A channel message that arrives during an interactive turn can therefore still exposeAskUserQuestionfor a later responder-less channel turn and stall. Please carry headless state through the enqueue/steer path and rebuild or tighten the runtime policy before the queued headless turn runs. - Blocking:
src/main/data/services/AgentChannelWorkflowService.ts:67allows a channel'sagentIdto be changed without clearing or revalidating existingagent_channel_tasksubscriptions.src/main/ai/agents/runAgentTask.ts:149then reads subscribed channels only by schedule id and sends through their adapters, so a task owned by Agent A can keep delivering through a channel after that channel is reassigned to Agent B. Please clear subscriptions on channel ownership changes, or enforce task/channel owner matching at the subscription read/delivery boundary. - Suggestion:
src/main/ai/mcp/servers/cherryAutonomyTools.ts:90documents omittedchannel_idsas "auto-bind all agent channels", butaddJob()only binds explicit ids or the current source channel; non-channel invocations create a task with no channel subscriptions. Please align the schema text with the current behavior or implement the advertised all-channel default. - Suggestion:
src/renderer/pages/settings/ChannelsSettings/ChannelForms.tsx:74emitsundefinedwhen the user chooses inherited permission mode, andsrc/renderer/pages/settings/ChannelsSettings/ChannelDetail.tsx:489dropsundefinedbefore PATCH. That means an existing channel permission override cannot be cleared back to inherit from the settings UI. The API already accepts nullable values, so sendnullfor the inherit case.
After fixing, please request eeee0717 for further review.
Verification:
- Reviewed PR #16726 at
36bc41a5be9767b5aa19821ffc8396bab39dd3bfin isolated worktree/Users/cherryai004/Documents/Cherry_Studio_Dev/cherry-studio-pr-review/.codex-tmp/pr-review-sweep-20260707T071612Z-16726-36bc41a5. - Ran six scoped reviewer passes and used only results that repeated PR #16726, this head SHA, and the assigned worktree.
- Checked existing reviews/comments to avoid repeating previously raised issues.
- Checked GitHub CI:
general-testfailed insrc/main/core/job/__tests__/JobManager.integration.test.tson a 20s timeout forarms a delayed job after commit and promotes it at scheduledAt;render-test,basic-checks,changes,changeset-check, andcatalog-hand-edit-checkpassed;notifyskipped. - Local
pnpm lint/test/formatnot run per repository review rules.
Original Content
Findings:
- Blocking:
src/main/ai/streamManager/context/AgentChatContextProvider.ts:98drops the backendheadless: truestate when a channel-bound session is already busy. The busy branch only callsenqueueUserMessage(sessionId, userMessage), andenqueueUserMessage()can either steer into the current non-headless connection or queue the next turn without changing the connection's baked tool policy. A channel message that arrives during an interactive turn can therefore still exposeAskUserQuestionfor a later responder-less channel turn and stall. Please carry headless state through the enqueue/steer path and rebuild or tighten the runtime policy before the queued headless turn runs. - Blocking:
src/main/data/services/AgentChannelWorkflowService.ts:67allows a channel'sagentIdto be changed without clearing or revalidating existingagent_channel_tasksubscriptions.src/main/ai/agents/runAgentTask.ts:149then reads subscribed channels only by schedule id and sends through their adapters, so a task owned by Agent A can keep delivering through a channel after that channel is reassigned to Agent B. Please clear subscriptions on channel ownership changes, or enforce task/channel owner matching at the subscription read/delivery boundary. - Suggestion:
src/main/ai/mcp/servers/cherryAutonomyTools.ts:90documents omittedchannel_idsas "auto-bind all agent channels", butaddJob()only binds explicit ids or the current source channel; non-channel invocations create a task with no channel subscriptions. Please align the schema text with the current behavior or implement the advertised all-channel default. - Suggestion:
src/renderer/pages/settings/ChannelsSettings/ChannelForms.tsx:74emitsundefinedwhen the user chooses inherited permission mode, andsrc/renderer/pages/settings/ChannelsSettings/ChannelDetail.tsx:489dropsundefinedbefore PATCH. That means an existing channel permission override cannot be cleared back to inherit from the settings UI. The API already accepts nullable values, so sendnullfor the inherit case.
修复后请 request eeee0717 再进行后续 review。
Verification:
- Reviewed PR #16726 at
36bc41a5be9767b5aa19821ffc8396bab39dd3bfin isolated worktree/Users/cherryai004/Documents/Cherry_Studio_Dev/cherry-studio-pr-review/.codex-tmp/pr-review-sweep-20260707T071612Z-16726-36bc41a5. - Ran six scoped reviewer passes and used only results that repeated PR #16726, this head SHA, and the assigned worktree.
- Checked existing reviews/comments to avoid repeating previously raised issues.
- Checked GitHub CI:
general-testfailed insrc/main/core/job/__tests__/JobManager.integration.test.tson a 20s timeout forarms a delayed job after commit and promotes it at scheduledAt;render-test,basic-checks,changes,changeset-check, andcatalog-hand-edit-checkpassed;notifyskipped. - Local
pnpm lint/test/formatnot run per repository review rules.
…at fire time A channel dispatch landing on a busy session goes through enqueueUserMessage, which cannot rebuild the connection's baked tool policy — so a queued channel turn ran with AskUserQuestion available and no responder. Track headless per queued message (mirroring the steer-mark pattern), stamp it on the turn that message opens, and deny AskUserQuestion in canUseTool when the live current turn is headless. Messages steered into a live interactive turn shed the mark: an interactive responder exists there. Baked disallowedTools stays as the belt for fully-headless connections. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Rebinding a channel to another agent left its agent_channel_task rows intact, and runAgentTask read subscriptions by schedule id alone — so Agent A's scheduled output kept flowing into Agent B's channel. Clear the channel's task subscriptions on an agentId change (deliberately not restored if the follow-up sync fails: conservative beats wrong-agent delivery) and filter delivery to channels owned by the task's agent as the authoritative guard for legacy rows and races. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The schema advertised 'omit to auto-bind all agent channels', but addJob binds explicit ids or the current source channel only. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The inherit option emitted undefined, which handleSave drops before PATCH — an existing override could never be cleared. Send null, which the API schema already accepts. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…ions A headless turn steered by another headless input previously rolled into an interactive continuation turn, reopening AskUserQuestion mid-run. Compute rollHeadless at the steer boundary (before the marks are consumed) and inherit it in startContinuationTurn; any interactive participant keeps the continuation interactive. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…stored Subscriptions created during the transient rebind window (between the optimistic agentId update and the sync failure) belonged to the new agent; restoring the old agentId must clear them again. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Legacy agent_channel_task rows could link a task to a channel owned by a different agent; importing them verbatim would violate the v2 invariant that task delivery stays within the owning agent. Skip such rows and report them via skippedCrossAgentChannelLinks. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The assistant builtin role has no persona workspace or autonomy loop; running a heartbeat against it created pointless sessions. Return a skip result before any session or workspace work. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
app.proxy.url may carry basic-auth userinfo; injecting it verbatim into the system prompt leaks credentials to the model provider. Strip username/password while keeping host and port. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The memory append API reads a tags array, not a tag string, so the bootstrap completion log was written untagged. The prompt also told the model to edit memory/FACT.md directly while an earlier rule forbade it; FACT.md is read inline and written only via the memory update action. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
The config fields are allowed_chat_ids (allowed_channel_ids on Discord); allow_ids does not exist. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
…hema add_channel validates with ChannelConfigSchema, which requires full feishu/wechat credentials up front — the QR-code-on-omission flow the descriptions promised can never be reached; point QR reconnection at reconnect_channel or the settings UI instead. Also state that enabled defaults to true only on add and is left unchanged when omitted on update. Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Review follow-up — all four findings addressed (
|
What this PR does
Before this PR:
configuration.soul_enabled). Only soul-enabled agents got the claw/autonomy MCP tools, the agent-memory MCP server, the workspace persona system prompt (SOUL.md / USER.md / FACT.md), and the autonomous-operation disallowed-tools overlay. Enabling it force-switched the agent tobypassPermissions, and scheduled tasks / channels refused agents without it.src/main/ai/agents/cherryclaw/directory (the engine actually powering soul mode for every agent), adocs/references/cherryclaw/doc set, brand mentions in system prompts and channel help text, and anagent.cherryClaw.*i18n namespace.After this PR:
AskUserQuestion, plan-mode, and worktree tools where the tool registry allows them (Cron*/TodoWrite/NotebookEditremain blocked by their pre-existingexposure: 'disabled'registry classification). Exception added after review: headless runs (channel-triggered and scheduled-task dispatches) still disallowAskUserQuestion— they have no responder, so a question would stall the run.configtool now rejects channels owned by another agent;notify/configare user-disableable (exposure: 'user') likecron; agents with non-blank user instructions skip the bootstrap onboarding interview; the prompt no longer references the unmountedmcp__skills__skillstool.soul_enabledflag is fully removed: no UI toggle, no zod schema field, no reads anywhere.permission_modeis now a fully independent setting and its field is always visible in the agent edit dialog.cherryclaw/engine directory is flattened intosrc/main/ai/agents/(prompt / bootstrap / heartbeat), prompts and channel help are de-branded, the CherryClaw doc set is deleted, andagent.cherryClaw.channels.*/agent.cherryClaw.tasks.*i18n keys are flattened toagent.channels.*/agent.tasks.*across all locales.clawMCP server is merged intocherry-tools; autonomy tools now live undermcp__cherry-tools__cron,mcp__cherry-tools__notify, andmcp__cherry-tools__config.seedWorkspaceTemplates,PromptBuilder.buildToolGuidance, and the always-true branches ofcomposeToolGuidance/adjustAllowedToolsForMcp.Fixes # N/A
Why we need it and why it was done in this way
CherryClaw's autonomy features were productized as soul mode and recent work already made personality + autonomy the default for new agents. Keeping a toggle (and a brand) for behavior that every agent should have added a second code path, a confusing permission-mode coupling, stale docs, and tool-name drift. Removing the flag and merging the autonomy tools into
cherry-toolsgives the app one agent behavior instead of two.The following tradeoffs were made:
AskUserQuestion, plan-mode, and worktree tools stay available to every agent unless the tool registry disables them. The assistant role's pre-existingAskUserQuestiondisable is preserved explicitly, and headless (channel / scheduled-task) runs keepAskUserQuestiondisallowed via a transient dispatch flag.'cherry-claw'→'claude-code'read-time type remap inAgentServiceand the'cherry-claw-default'id remap migrator. The unrelatedcherry-claw.pngmodel icon is untouched.soul_enabledconfiguration key is simply ignored (the configuration zod schema is.loose()), so no data migration is needed.mcp__claw__*) are not kept as aliases; callers must use the newmcp__cherry-tools__*names.The following alternatives were considered:
cherryclaw/toworkspace/orpersona/instead of flattening — rejected:workspaceis heavily overloaded in this codebase and the directory only held a few agent-engine modules.clawMCP server name as a compatibility alias — rejected: this PR removes the CherryClaw product surface rather than preserving a legacy synonym.Links to places where the discussion took place: N/A
Breaking changes
The Soul Mode / Autonomous Mode toggle is removed from agent settings; every agent now always runs with autonomy features (scheduled tasks, channels, cron/notify/config tools, agent-memory tools, workspace persona prompt). Scheduled tasks and channels no longer require Soul Mode or
bypassPermissions.MCP tool names changed from
mcp__claw__*tomcp__cherry-tools__*:mcp__claw__cron→mcp__cherry-tools__cronmcp__claw__notify→mcp__cherry-tools__notifymcp__claw__config→mcp__cherry-tools__configDocumented in
v2-refactor-temp/docs/breaking-changes/2026-07-03-remove-soul-mode-toggle.md; no user data migration is required.Special notes for your reviewer
mcp__claw__*is acceptable, whether all Claude Code Agents should default to autonomy tools, and whether the preserved assistant-roleAskUserQuestionspecial case is still correct.git logshows the moved engine files as renames (cherryclaw/prompt.ts→agents/prompt.ts, etc.) — review with rename detection on.pnpm lint,pnpm test, andpnpm build:checkpass locally. GitHub CI is green:changes,catalog-hand-edit-check,changeset-check,basic-checks,general-test, andrender-testpassed (notifyskipped).Checklist
This checklist is not enforcing, but it's a reminder of items that could be relevant to every PR.
Approvers are expected to review this list.
mainfor active development,v1for v1 maintenance fixes/gh-pr-review,gh pr diff, or GitHub UI) before requesting review from othersRelease note