Migrate refreshClineRules protobus (#3690)

* migrate refreshClineRules

* changeset

---------

Co-authored-by: Elephant Lumps <celestial_vault@Elephants-MacBook-Pro.local>
This commit is contained in:
Evan 2025-05-20 22:58:34 -07:00 committed by GitHub
parent 65a63952e3
commit 36c0192bd2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 255 additions and 9 deletions

View File

@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Migrate refreshClineRules to protobus

View File

@ -46,6 +46,18 @@ service FileService {
// Toggle a Windsurf rule (enable or disable)
rpc toggleWindsurfRule(ToggleWindsurfRuleRequest) returns (ClineRulesToggles);
// Refreshes all rule toggles (Cline, External, and Workflows)
rpc refreshRules(EmptyRequest) returns (RefreshedRules);
}
// Response for refreshRules operation
message RefreshedRules {
ClineRulesToggles global_cline_rules_toggles = 1;
ClineRulesToggles local_cline_rules_toggles = 2;
ClineRulesToggles local_cursor_rules_toggles = 3;
ClineRulesToggles local_windsurf_rules_toggles = 4;
ClineRulesToggles workflow_toggles = 5;
}
// Request to toggle a Windsurf rule

View File

@ -10,6 +10,7 @@ import { getRelativePaths } from "./getRelativePaths"
import { openFile } from "./openFile"
import { openImage } from "./openImage"
import { openMention } from "./openMention"
import { refreshRules } from "./refreshRules"
import { searchCommits } from "./searchCommits"
import { searchFiles } from "./searchFiles"
import { selectImages } from "./selectImages"
@ -27,6 +28,7 @@ export function registerAllMethods(): void {
registerMethod("openFile", openFile)
registerMethod("openImage", openImage)
registerMethod("openMention", openMention)
registerMethod("refreshRules", refreshRules)
registerMethod("searchCommits", searchCommits)
registerMethod("searchFiles", searchFiles)
registerMethod("selectImages", selectImages)

View File

@ -0,0 +1,32 @@
import { EmptyRequest } from "@shared/proto/common"
import { RefreshedRules } from "@shared/proto/file"
import type { Controller } from "../index"
import { refreshClineRulesToggles } from "@core/context/instructions/user-instructions/cline-rules"
import { refreshExternalRulesToggles } from "@core/context/instructions/user-instructions/external-rules"
import { refreshWorkflowToggles } from "@core/context/instructions/user-instructions/workflows"
import { cwd } from "@core/task"
/**
* Refreshes all rule toggles (Cline, External, and Workflows)
* @param controller The controller instance
* @param _request The empty request
* @returns RefreshedRules containing updated toggles for all rule types
*/
export async function refreshRules(controller: Controller, _request: EmptyRequest): Promise<RefreshedRules> {
try {
const { globalToggles, localToggles } = await refreshClineRulesToggles(controller.context, cwd)
const { cursorLocalToggles, windsurfLocalToggles } = await refreshExternalRulesToggles(controller.context, cwd)
const workflowToggles = await refreshWorkflowToggles(controller.context, cwd)
return {
globalClineRulesToggles: { toggles: globalToggles },
localClineRulesToggles: { toggles: localToggles },
localCursorRulesToggles: { toggles: cursorLocalToggles },
localWindsurfRulesToggles: { toggles: windsurfLocalToggles },
workflowToggles: { toggles: workflowToggles },
}
} catch (error) {
console.error("Failed to refresh rules:", error)
throw error
}
}

View File

@ -321,12 +321,6 @@ export class Controller {
await updateGlobalState(this.context, "lastShownAnnouncementId", this.latestAnnouncementId)
await this.postStateToWebview()
break
case "refreshClineRules":
await refreshClineRulesToggles(this.context, cwd)
await refreshExternalRulesToggles(this.context, cwd)
await refreshWorkflowToggles(this.context, cwd)
await this.postStateToWebview()
break
case "openInBrowser":
if (message.url) {
vscode.env.openExternal(vscode.Uri.parse(message.url))

View File

@ -17,7 +17,6 @@ export interface WebviewMessage {
| "didShowAnnouncement"
| "openInBrowser"
| "showChatView"
| "refreshClineRules"
| "openMcpSettings"
| "autoApprovalSettings"
| "togglePlanActMode"

View File

@ -10,6 +10,15 @@ import { Empty, EmptyRequest, Metadata, StringArray, StringRequest } from "./com
export const protobufPackage = "cline"
/** Response for refreshRules operation */
export interface RefreshedRules {
globalClineRulesToggles?: ClineRulesToggles | undefined
localClineRulesToggles?: ClineRulesToggles | undefined
localCursorRulesToggles?: ClineRulesToggles | undefined
localWindsurfRulesToggles?: ClineRulesToggles | undefined
workflowToggles?: ClineRulesToggles | undefined
}
/** Request to toggle a Windsurf rule */
export interface ToggleWindsurfRuleRequest {
metadata?: Metadata | undefined
@ -132,6 +141,159 @@ export interface ToggleCursorRuleRequest {
enabled: boolean
}
function createBaseRefreshedRules(): RefreshedRules {
return {
globalClineRulesToggles: undefined,
localClineRulesToggles: undefined,
localCursorRulesToggles: undefined,
localWindsurfRulesToggles: undefined,
workflowToggles: undefined,
}
}
export const RefreshedRules: MessageFns<RefreshedRules> = {
encode(message: RefreshedRules, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.globalClineRulesToggles !== undefined) {
ClineRulesToggles.encode(message.globalClineRulesToggles, writer.uint32(10).fork()).join()
}
if (message.localClineRulesToggles !== undefined) {
ClineRulesToggles.encode(message.localClineRulesToggles, writer.uint32(18).fork()).join()
}
if (message.localCursorRulesToggles !== undefined) {
ClineRulesToggles.encode(message.localCursorRulesToggles, writer.uint32(26).fork()).join()
}
if (message.localWindsurfRulesToggles !== undefined) {
ClineRulesToggles.encode(message.localWindsurfRulesToggles, writer.uint32(34).fork()).join()
}
if (message.workflowToggles !== undefined) {
ClineRulesToggles.encode(message.workflowToggles, writer.uint32(42).fork()).join()
}
return writer
},
decode(input: BinaryReader | Uint8Array, length?: number): RefreshedRules {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = createBaseRefreshedRules()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break
}
message.globalClineRulesToggles = ClineRulesToggles.decode(reader, reader.uint32())
continue
}
case 2: {
if (tag !== 18) {
break
}
message.localClineRulesToggles = ClineRulesToggles.decode(reader, reader.uint32())
continue
}
case 3: {
if (tag !== 26) {
break
}
message.localCursorRulesToggles = ClineRulesToggles.decode(reader, reader.uint32())
continue
}
case 4: {
if (tag !== 34) {
break
}
message.localWindsurfRulesToggles = ClineRulesToggles.decode(reader, reader.uint32())
continue
}
case 5: {
if (tag !== 42) {
break
}
message.workflowToggles = ClineRulesToggles.decode(reader, reader.uint32())
continue
}
}
if ((tag & 7) === 4 || tag === 0) {
break
}
reader.skip(tag & 7)
}
return message
},
fromJSON(object: any): RefreshedRules {
return {
globalClineRulesToggles: isSet(object.globalClineRulesToggles)
? ClineRulesToggles.fromJSON(object.globalClineRulesToggles)
: undefined,
localClineRulesToggles: isSet(object.localClineRulesToggles)
? ClineRulesToggles.fromJSON(object.localClineRulesToggles)
: undefined,
localCursorRulesToggles: isSet(object.localCursorRulesToggles)
? ClineRulesToggles.fromJSON(object.localCursorRulesToggles)
: undefined,
localWindsurfRulesToggles: isSet(object.localWindsurfRulesToggles)
? ClineRulesToggles.fromJSON(object.localWindsurfRulesToggles)
: undefined,
workflowToggles: isSet(object.workflowToggles) ? ClineRulesToggles.fromJSON(object.workflowToggles) : undefined,
}
},
toJSON(message: RefreshedRules): unknown {
const obj: any = {}
if (message.globalClineRulesToggles !== undefined) {
obj.globalClineRulesToggles = ClineRulesToggles.toJSON(message.globalClineRulesToggles)
}
if (message.localClineRulesToggles !== undefined) {
obj.localClineRulesToggles = ClineRulesToggles.toJSON(message.localClineRulesToggles)
}
if (message.localCursorRulesToggles !== undefined) {
obj.localCursorRulesToggles = ClineRulesToggles.toJSON(message.localCursorRulesToggles)
}
if (message.localWindsurfRulesToggles !== undefined) {
obj.localWindsurfRulesToggles = ClineRulesToggles.toJSON(message.localWindsurfRulesToggles)
}
if (message.workflowToggles !== undefined) {
obj.workflowToggles = ClineRulesToggles.toJSON(message.workflowToggles)
}
return obj
},
create<I extends Exact<DeepPartial<RefreshedRules>, I>>(base?: I): RefreshedRules {
return RefreshedRules.fromPartial(base ?? ({} as any))
},
fromPartial<I extends Exact<DeepPartial<RefreshedRules>, I>>(object: I): RefreshedRules {
const message = createBaseRefreshedRules()
message.globalClineRulesToggles =
object.globalClineRulesToggles !== undefined && object.globalClineRulesToggles !== null
? ClineRulesToggles.fromPartial(object.globalClineRulesToggles)
: undefined
message.localClineRulesToggles =
object.localClineRulesToggles !== undefined && object.localClineRulesToggles !== null
? ClineRulesToggles.fromPartial(object.localClineRulesToggles)
: undefined
message.localCursorRulesToggles =
object.localCursorRulesToggles !== undefined && object.localCursorRulesToggles !== null
? ClineRulesToggles.fromPartial(object.localCursorRulesToggles)
: undefined
message.localWindsurfRulesToggles =
object.localWindsurfRulesToggles !== undefined && object.localWindsurfRulesToggles !== null
? ClineRulesToggles.fromPartial(object.localWindsurfRulesToggles)
: undefined
message.workflowToggles =
object.workflowToggles !== undefined && object.workflowToggles !== null
? ClineRulesToggles.fromPartial(object.workflowToggles)
: undefined
return message
},
}
function createBaseToggleWindsurfRuleRequest(): ToggleWindsurfRuleRequest {
return { metadata: undefined, rulePath: "", enabled: false }
}
@ -1604,6 +1766,15 @@ export const FileServiceDefinition = {
responseStream: false,
options: {},
},
/** Refreshes all rule toggles (Cline, External, and Workflows) */
refreshRules: {
name: "refreshRules",
requestType: EmptyRequest,
requestStream: false,
responseType: RefreshedRules,
responseStream: false,
options: {},
},
},
} as const

View File

@ -34,6 +34,7 @@ import { searchFiles } from "../core/controller/file/searchFiles"
import { toggleClineRule } from "../core/controller/file/toggleClineRule"
import { toggleCursorRule } from "../core/controller/file/toggleCursorRule"
import { toggleWindsurfRule } from "../core/controller/file/toggleWindsurfRule"
import { refreshRules } from "../core/controller/file/refreshRules"
// Mcp Service
import { toggleMcpServer } from "../core/controller/mcp/toggleMcpServer"
@ -130,6 +131,7 @@ export function addServices(
toggleClineRule: wrapper(toggleClineRule, controller),
toggleCursorRule: wrapper(toggleCursorRule, controller),
toggleWindsurfRule: wrapper(toggleWindsurfRule, controller),
refreshRules: wrapper(refreshRules, controller),
})
// Mcp Service

View File

@ -8,7 +8,8 @@ import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"
import RulesToggleList from "./RulesToggleList"
import Tooltip from "@/components/common/Tooltip"
import styled from "styled-components"
import { ClineRulesToggles, ToggleWindsurfRuleRequest } from "@shared/proto/file"
import { ClineRulesToggles, RefreshedRules, ToggleWindsurfRuleRequest } from "@shared/proto/file"
import { EmptyRequest } from "@shared/proto/common"
const ClineRulesToggleModal: React.FC = () => {
const {
@ -21,6 +22,7 @@ const ClineRulesToggleModal: React.FC = () => {
setLocalClineRulesToggles,
setLocalCursorRulesToggles,
setLocalWindsurfRulesToggles,
setWorkflowToggles,
} = useExtensionState()
const [isVisible, setIsVisible] = useState(false)
const buttonRef = useRef<HTMLDivElement>(null)
@ -32,7 +34,28 @@ const ClineRulesToggleModal: React.FC = () => {
useEffect(() => {
if (isVisible) {
vscode.postMessage({ type: "refreshClineRules" })
FileServiceClient.refreshRules({} as EmptyRequest)
.then((response: RefreshedRules) => {
// Update state with the response data using all available setters
if (response.globalClineRulesToggles?.toggles) {
setGlobalClineRulesToggles(response.globalClineRulesToggles.toggles)
}
if (response.localClineRulesToggles?.toggles) {
setLocalClineRulesToggles(response.localClineRulesToggles.toggles)
}
if (response.localCursorRulesToggles?.toggles) {
setLocalCursorRulesToggles(response.localCursorRulesToggles.toggles)
}
if (response.localWindsurfRulesToggles?.toggles) {
setLocalWindsurfRulesToggles(response.localWindsurfRulesToggles.toggles)
}
if (response.workflowToggles?.toggles) {
setWorkflowToggles(response.workflowToggles.toggles)
}
})
.catch((error) => {
console.error("Failed to refresh rules:", error)
})
}
}, [isVisible])

View File

@ -55,6 +55,7 @@ interface ExtensionStateContextType extends ExtensionState {
setLocalClineRulesToggles: (toggles: Record<string, boolean>) => void
setLocalCursorRulesToggles: (toggles: Record<string, boolean>) => void
setLocalWindsurfRulesToggles: (toggles: Record<string, boolean>) => void
setWorkflowToggles: (toggles: Record<string, boolean>) => void
setMcpMarketplaceCatalog: (value: McpMarketplaceCatalog) => void
// Navigation state setters
@ -540,6 +541,11 @@ export const ExtensionStateContextProvider: React.FC<{
...prevState,
localWindsurfRulesToggles: toggles,
})),
setWorkflowToggles: (toggles) =>
setState((prevState) => ({
...prevState,
workflowToggles: toggles,
})),
setMcpTab,
}