Migrate toggleWindsurfRule protobus (#3677)

* migrate toggleWindsurfRules

* changeset

---------

Co-authored-by: Elephant Lumps <celestial_vault@Elephants-MacBook-Pro.local>
This commit is contained in:
Evan 2025-05-20 16:55:53 -07:00 committed by GitHub
parent aff78bda7c
commit f0e352489f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 178 additions and 17 deletions

View File

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

View File

@ -40,6 +40,16 @@ service FileService {
// Toggle a Cursor rule (enable or disable)
rpc toggleCursorRule(ToggleCursorRuleRequest) returns (ClineRulesToggles);
// Toggle a Windsurf rule (enable or disable)
rpc toggleWindsurfRule(ToggleWindsurfRuleRequest) returns (ClineRulesToggles);
}
// Request to toggle a Windsurf rule
message ToggleWindsurfRuleRequest {
Metadata metadata = 1;
string rule_path = 2; // Path to the rule file
bool enabled = 3; // Whether to enable or disable the rule
}
// Request to convert a list of URIs to relative paths

View File

@ -14,6 +14,7 @@ import { searchFiles } from "./searchFiles"
import { selectImages } from "./selectImages"
import { toggleClineRule } from "./toggleClineRule"
import { toggleCursorRule } from "./toggleCursorRule"
import { toggleWindsurfRule } from "./toggleWindsurfRule"
// Register all file service methods
export function registerAllMethods(): void {
@ -29,4 +30,5 @@ export function registerAllMethods(): void {
registerMethod("selectImages", selectImages)
registerMethod("toggleClineRule", toggleClineRule)
registerMethod("toggleCursorRule", toggleCursorRule)
registerMethod("toggleWindsurfRule", toggleWindsurfRule)
}

View File

@ -0,0 +1,30 @@
import type { ToggleWindsurfRuleRequest, ClineRulesToggles } from "../../../shared/proto/file"
import type { Controller } from "../index"
import { getWorkspaceState, updateWorkspaceState } from "../../../core/storage/state"
import { ClineRulesToggles as AppClineRulesToggles } from "@shared/cline-rules"
/**
* Toggles a Windsurf rule (enable or disable)
* @param controller The controller instance
* @param request The toggle request
* @returns The updated Windsurf rule toggles
*/
export async function toggleWindsurfRule(controller: Controller, request: ToggleWindsurfRuleRequest): Promise<ClineRulesToggles> {
const { rulePath, enabled } = request
if (!rulePath || typeof enabled !== "boolean") {
console.error("toggleWindsurfRule: Missing or invalid parameters", {
rulePath,
enabled: typeof enabled === "boolean" ? enabled : `Invalid: ${typeof enabled}`,
})
throw new Error("Missing or invalid parameters for toggleWindsurfRule")
}
// Update the toggles
const toggles = ((await getWorkspaceState(controller.context, "localWindsurfRulesToggles")) as AppClineRulesToggles) || {}
toggles[rulePath] = enabled
await updateWorkspaceState(controller.context, "localWindsurfRulesToggles", toggles)
// Return the toggles directly
return { toggles: toggles }
}

View File

@ -389,19 +389,6 @@ export class Controller {
// break
// }
case "toggleWindsurfRule": {
const { rulePath, enabled } = message
if (rulePath && typeof enabled === "boolean") {
const toggles =
((await getWorkspaceState(this.context, "localWindsurfRulesToggles")) as ClineRulesToggles) || {}
toggles[rulePath] = enabled
await updateWorkspaceState(this.context, "localWindsurfRulesToggles", toggles)
await this.postStateToWebview()
} else {
console.error("toggleWindsurfRule: Missing or invalid parameters")
}
break
}
case "toggleWorkflow": {
const { workflowPath, enabled } = message
if (workflowPath && typeof enabled === "boolean") {

View File

@ -41,7 +41,6 @@ export interface WebviewMessage {
| "searchFiles"
| "grpc_request"
| "grpc_request_cancel"
| "toggleWindsurfRule"
| "toggleWorkflow"
| "updateTerminalConnectionTimeout"

View File

@ -10,6 +10,15 @@ import { Empty, EmptyRequest, Metadata, StringArray, StringRequest } from "./com
export const protobufPackage = "cline"
/** Request to toggle a Windsurf rule */
export interface ToggleWindsurfRuleRequest {
metadata?: Metadata | undefined
/** Path to the rule file */
rulePath: string
/** Whether to enable or disable the rule */
enabled: boolean
}
/** Request to convert a list of URIs to relative paths */
export interface RelativePathsRequest {
metadata?: Metadata | undefined
@ -123,6 +132,99 @@ export interface ToggleCursorRuleRequest {
enabled: boolean
}
function createBaseToggleWindsurfRuleRequest(): ToggleWindsurfRuleRequest {
return { metadata: undefined, rulePath: "", enabled: false }
}
export const ToggleWindsurfRuleRequest: MessageFns<ToggleWindsurfRuleRequest> = {
encode(message: ToggleWindsurfRuleRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.metadata !== undefined) {
Metadata.encode(message.metadata, writer.uint32(10).fork()).join()
}
if (message.rulePath !== "") {
writer.uint32(18).string(message.rulePath)
}
if (message.enabled !== false) {
writer.uint32(24).bool(message.enabled)
}
return writer
},
decode(input: BinaryReader | Uint8Array, length?: number): ToggleWindsurfRuleRequest {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = createBaseToggleWindsurfRuleRequest()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break
}
message.metadata = Metadata.decode(reader, reader.uint32())
continue
}
case 2: {
if (tag !== 18) {
break
}
message.rulePath = reader.string()
continue
}
case 3: {
if (tag !== 24) {
break
}
message.enabled = reader.bool()
continue
}
}
if ((tag & 7) === 4 || tag === 0) {
break
}
reader.skip(tag & 7)
}
return message
},
fromJSON(object: any): ToggleWindsurfRuleRequest {
return {
metadata: isSet(object.metadata) ? Metadata.fromJSON(object.metadata) : undefined,
rulePath: isSet(object.rulePath) ? globalThis.String(object.rulePath) : "",
enabled: isSet(object.enabled) ? globalThis.Boolean(object.enabled) : false,
}
},
toJSON(message: ToggleWindsurfRuleRequest): unknown {
const obj: any = {}
if (message.metadata !== undefined) {
obj.metadata = Metadata.toJSON(message.metadata)
}
if (message.rulePath !== "") {
obj.rulePath = message.rulePath
}
if (message.enabled !== false) {
obj.enabled = message.enabled
}
return obj
},
create<I extends Exact<DeepPartial<ToggleWindsurfRuleRequest>, I>>(base?: I): ToggleWindsurfRuleRequest {
return ToggleWindsurfRuleRequest.fromPartial(base ?? ({} as any))
},
fromPartial<I extends Exact<DeepPartial<ToggleWindsurfRuleRequest>, I>>(object: I): ToggleWindsurfRuleRequest {
const message = createBaseToggleWindsurfRuleRequest()
message.metadata =
object.metadata !== undefined && object.metadata !== null ? Metadata.fromPartial(object.metadata) : undefined
message.rulePath = object.rulePath ?? ""
message.enabled = object.enabled ?? false
return message
},
}
function createBaseRelativePathsRequest(): RelativePathsRequest {
return { metadata: undefined, uris: [] }
}
@ -1484,6 +1586,15 @@ export const FileServiceDefinition = {
responseStream: false,
options: {},
},
/** Toggle a Windsurf rule (enable or disable) */
toggleWindsurfRule: {
name: "toggleWindsurfRule",
requestType: ToggleWindsurfRuleRequest,
requestStream: false,
responseType: ClineRulesToggles,
responseStream: false,
options: {},
},
},
} as const

View File

@ -32,6 +32,7 @@ import { getRelativePaths } from "../core/controller/file/getRelativePaths"
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"
// Mcp Service
import { toggleMcpServer } from "../core/controller/mcp/toggleMcpServer"
@ -124,6 +125,7 @@ export function addServices(
searchFiles: wrapper(searchFiles, controller),
toggleClineRule: wrapper(toggleClineRule, controller),
toggleCursorRule: wrapper(toggleCursorRule, controller),
toggleWindsurfRule: wrapper(toggleWindsurfRule, controller),
})
// Mcp Service

View File

@ -8,6 +8,7 @@ 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"
const ClineRulesToggleModal: React.FC = () => {
const {
@ -19,6 +20,7 @@ const ClineRulesToggleModal: React.FC = () => {
setGlobalClineRulesToggles,
setLocalClineRulesToggles,
setLocalCursorRulesToggles,
setLocalWindsurfRulesToggles,
} = useExtensionState()
const [isVisible, setIsVisible] = useState(false)
const buttonRef = useRef<HTMLDivElement>(null)
@ -94,11 +96,18 @@ const ClineRulesToggleModal: React.FC = () => {
}
const toggleWindsurfRule = (rulePath: string, enabled: boolean) => {
vscode.postMessage({
type: "toggleWindsurfRule",
FileServiceClient.toggleWindsurfRule({
rulePath,
enabled,
})
} as ToggleWindsurfRuleRequest)
.then((response: ClineRulesToggles) => {
if (response.toggles) {
setLocalWindsurfRulesToggles(response.toggles)
}
})
.catch((error) => {
console.error("Error toggling Windsurf rule:", error)
})
}
const toggleWorkflow = (workflowPath: string, enabled: boolean) => {

View File

@ -54,6 +54,7 @@ interface ExtensionStateContextType extends ExtensionState {
setGlobalClineRulesToggles: (toggles: Record<string, boolean>) => void
setLocalClineRulesToggles: (toggles: Record<string, boolean>) => void
setLocalCursorRulesToggles: (toggles: Record<string, boolean>) => void
setLocalWindsurfRulesToggles: (toggles: Record<string, boolean>) => void
// Navigation state setters
setShowMcp: (value: boolean) => void
@ -532,6 +533,11 @@ export const ExtensionStateContextProvider: React.FC<{
...prevState,
localCursorRulesToggles: toggles,
})),
setLocalWindsurfRulesToggles: (toggles) =>
setState((prevState) => ({
...prevState,
localWindsurfRulesToggles: toggles,
})),
setMcpTab,
}