Compare commits

...
Author SHA1 Message Date
Saoud Rizwan 98cfe2d0d8 fix: hide workflows from customize menu 2026-06-25 20:50:23 -07:00
@@ -9,7 +9,6 @@ import {
ToggleCursorRuleRequest,
ToggleSkillRequest,
ToggleWindsurfRuleRequest,
ToggleWorkflowRequest,
} from "@shared/proto/cline/file"
import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import React, { useEffect, useRef, useState } from "react"
@@ -33,8 +32,6 @@ const ClineRulesToggleModal: React.FC = () => {
localCursorRulesToggles = {},
localWindsurfRulesToggles = {},
localAgentsRulesToggles = {},
localWorkflowToggles = {},
globalWorkflowToggles = {},
hooksEnabled,
setGlobalClineRulesToggles,
setLocalClineRulesToggles,
@@ -61,7 +58,7 @@ const ClineRulesToggleModal: React.FC = () => {
const { width: viewportWidth, height: viewportHeight } = useWindowSize()
const [arrowPosition, setArrowPosition] = useState(0)
const [menuPosition, setMenuPosition] = useState(0)
const [currentView, setCurrentView] = useState<"rules" | "workflows" | "hooks" | "skills">("rules")
const [currentView, setCurrentView] = useState<"rules" | "hooks" | "skills">("rules")
// Auto-switch to rules tab if hooks become disabled while viewing hooks tab
useEffect(() => {
@@ -208,20 +205,10 @@ const ClineRulesToggleModal: React.FC = () => {
.map(([path, enabled]): [string, boolean] => [path, enabled as boolean])
.sort(([a], [b]) => a.localeCompare(b))
const localWorkflows = Object.entries(localWorkflowToggles || {})
.map(([path, enabled]): [string, boolean] => [path, enabled as boolean])
.sort(([a], [b]) => a.localeCompare(b))
const globalWorkflows = Object.entries(globalWorkflowToggles || {})
.map(([path, enabled]): [string, boolean] => [path, enabled as boolean])
.sort(([a], [b]) => a.localeCompare(b))
const remoteConfigSettings = useRemoteConfigSettings(isVisible)
const remoteRules = remoteConfigSettings.filter((s) => s.type === "rule")
const remoteWorkflows = remoteConfigSettings.filter((s) => s.type === "workflow")
const remoteSkills = remoteConfigSettings.filter((s) => s.type === "skill")
const hasRemoteRules = remoteRules.length > 0
const hasRemoteWorkflows = remoteWorkflows.length > 0
const hasRemoteSkills = remoteSkills.length > 0
// Handle toggle rule using gRPC
@@ -320,28 +307,6 @@ const ClineRulesToggleModal: React.FC = () => {
})
}
const toggleWorkflow = (isGlobal: boolean, workflowPath: string, enabled: boolean) => {
FileServiceClient.toggleWorkflow(
ToggleWorkflowRequest.create({
workflowPath,
enabled,
scope: isGlobal ? RuleScope.GLOBAL : RuleScope.LOCAL,
}),
)
.then((response) => {
if (response.toggles) {
if (isGlobal) {
setGlobalWorkflowToggles(response.toggles)
} else {
setLocalWorkflowToggles(response.toggles)
}
}
})
.catch((err: Error) => {
console.error("Failed to toggle workflow:", err)
})
}
// Handle toggle for skills
const toggleSkill = (isGlobal: boolean, skillPath: string, enabled: boolean) => {
FileServiceClient.toggleSkill(
@@ -393,11 +358,11 @@ const ClineRulesToggleModal: React.FC = () => {
<div className="inline-flex min-w-0 max-w-full items-center" ref={modalRef}>
<div className="inline-flex w-full items-center" ref={buttonRef}>
<Tooltip>
{!isVisible && <TooltipContent>Manage Cline Rules & Workflows</TooltipContent>}
{!isVisible && <TooltipContent>Customize</TooltipContent>}
<TooltipTrigger>
<VSCodeButton
appearance="icon"
aria-label={isVisible ? "Hide Cline Rules & Workflows" : "Show Cline Rules & Workflows"}
aria-label={isVisible ? "Hide Customize" : "Show Customize"}
className="p-0 m-0 flex items-center"
onClick={() => setIsVisible(!isVisible)}>
<i className="codicon codicon-law" style={{ fontSize: "12.5px" }} />
@@ -428,9 +393,6 @@ const ClineRulesToggleModal: React.FC = () => {
<TabButton isActive={currentView === "rules"} onClick={() => setCurrentView("rules")}>
Rules
</TabButton>
<TabButton isActive={currentView === "workflows"} onClick={() => setCurrentView("workflows")}>
Workflows
</TabButton>
{hooksEnabled && (
<TabButton isActive={currentView === "hooks"} onClick={() => setCurrentView("hooks")}>
Hooks
@@ -443,17 +405,13 @@ const ClineRulesToggleModal: React.FC = () => {
</div>
{/* Remote config banner */}
{(currentView === "rules" && hasRemoteRules) ||
(currentView === "workflows" && hasRemoteWorkflows) ||
(currentView === "skills" && hasRemoteSkills) ? (
{(currentView === "rules" && hasRemoteRules) || (currentView === "skills" && hasRemoteSkills) ? (
<div className="flex items-center gap-2 px-3 py-3 mb-4 bg-vscode-textBlockQuote-background border-l-[3px] border-vscode-textLink-foreground">
<i className="codicon codicon-lock text-sm" />
<span className="text-base">
{currentView === "rules"
? "Your organization manages some rules"
: currentView === "workflows"
? "Your organization manages some workflows"
: "Your organization manages some skills"}
: "Your organization manages some skills"}
</span>
</div>
) : null}
@@ -471,17 +429,6 @@ const ClineRulesToggleModal: React.FC = () => {
Docs
</VSCodeLink>
</p>
) : currentView === "workflows" ? (
<p>
Workflows allow you to define a series of steps to guide Cline through a repetitive set of
tasks, such as deploying a service or submitting a PR. To invoke a workflow, type{" "}
<span className="text-foreground font-bold">/workflow-name</span> in the chat.{" "}
<VSCodeLink
className="text-xs inline"
href="https://docs.cline.bot/features/slash-commands/workflows">
Docs
</VSCodeLink>
</p>
) : currentView === "skills" ? (
<p>
Skills are reusable instruction sets that Cline can activate on-demand. When a task matches a
@@ -583,62 +530,6 @@ const ClineRulesToggleModal: React.FC = () => {
/>
</div>
</>
) : currentView === "workflows" ? (
<>
{/* Remote Workflows Section */}
{hasRemoteWorkflows && (
<div className="mb-3">
<div className="text-sm font-normal mb-2">Enterprise Workflows</div>
<div className="flex flex-col gap-0">
{remoteWorkflows.map((workflow) => {
const enabled = workflow.locked || workflow.enabled
return (
<RuleRow
alwaysEnabled={workflow.locked}
enabled={enabled}
isGlobal={false}
isRemote={true}
key={workflow.name}
rulePath={workflow.name}
ruleType="workflow"
toggleRule={workflow.toggle}
/>
)
})}
</div>
</div>
)}
{/* Global Workflows Section */}
<div className="mb-3">
<div className="text-sm font-normal mb-2">Global Workflows</div>
{/* File-based Global Workflows */}
<RulesToggleList
isGlobal={true}
listGap="small"
rules={globalWorkflows}
ruleType={"workflow"}
showNewRule={true}
showNoRules={false}
toggleRule={(rulePath, enabled) => toggleWorkflow(true, rulePath, enabled)}
/>
</div>
{/* Local Workflows Section */}
<div className="-mb-2.5">
<div className="text-sm font-normal mb-2">Workspace Workflows</div>
<RulesToggleList
isGlobal={false}
listGap="small"
rules={localWorkflows}
ruleType={"workflow"}
showNewRule={true}
showNoRules={false}
toggleRule={(rulePath, enabled) => toggleWorkflow(false, rulePath, enabled)}
/>
</div>
</>
) : currentView === "hooks" ? (
<>
<div className="text-xs text-description mb-4">