forked from Zoo-Code-Org/Zoo-Code
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrulesMessageHandler.ts
More file actions
170 lines (150 loc) · 5.09 KB
/
Copy pathrulesMessageHandler.ts
File metadata and controls
170 lines (150 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import * as vscode from "vscode"
import type {
CreateRuleInput,
DeleteRuleInput,
RuleKind,
RuleMetadata,
RuleScope,
WebviewMessage,
} from "@roo-code/types"
import type { ClineProvider } from "./ClineProvider"
import { openFile } from "../../integrations/misc/open-file"
import { createRule, deleteRule, getRules, getRulesDirectoryPath, resolveRuleFile } from "../../services/rules/rules"
function getErrorMessage(error: unknown): string {
return error instanceof Error ? error.message : String(error)
}
export async function handleRequestRules(provider: ClineProvider, cwd: string): Promise<RuleMetadata[]> {
try {
const modes = await provider.getModes()
const rules = await getRules(cwd, { modes })
await provider.postMessageToWebview({ type: "rules", rules })
return rules
} catch (error) {
provider.log(`Error fetching rules: ${getErrorMessage(error)}`)
await provider.postMessageToWebview({ type: "rules", rules: [] })
return []
}
}
export async function handleCreateRule(
provider: ClineProvider,
cwd: string,
message: WebviewMessage,
): Promise<RuleMetadata[] | undefined> {
try {
const input = parseCreateRuleInput(message)
const createdPath = await createRule(cwd, input)
await openFile(createdPath)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Error creating rule: ${errorMessage}`)
vscode.window.showErrorMessage(`Failed to create rule: ${errorMessage}`)
return undefined
}
try {
return await refreshRules(provider, cwd)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Rule created but failed to refresh rules: ${errorMessage}`)
vscode.window.showWarningMessage("Rule created, but refreshing the rules list failed.")
return undefined
}
}
export async function handleDeleteRule(
provider: ClineProvider,
cwd: string,
message: WebviewMessage,
): Promise<RuleMetadata[] | undefined> {
try {
const input = parseDeleteRuleInput(message)
await deleteRule(cwd, input)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Error deleting rule: ${errorMessage}`)
vscode.window.showErrorMessage(`Failed to delete rule: ${errorMessage}`)
return undefined
}
try {
return await refreshRules(provider, cwd)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Rule deleted but failed to refresh rules: ${errorMessage}`)
vscode.window.showWarningMessage("Rule deleted, but refreshing the rules list failed.")
return undefined
}
}
export async function handleOpenRuleFile(provider: ClineProvider, cwd: string, message: WebviewMessage): Promise<void> {
try {
const input = parseDeleteRuleInput(message)
const filePath = await resolveRuleFile(cwd, input)
if (!filePath) {
throw new Error("Rule file not found")
}
await openFile(filePath)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Error opening rule file: ${errorMessage}`)
vscode.window.showErrorMessage(`Failed to open rule file: ${errorMessage}`)
}
}
export async function handleOpenRulesDirectory(
provider: ClineProvider,
cwd: string,
message: WebviewMessage,
): Promise<void> {
try {
const values = message.values ?? {}
const directoryPath = getRulesDirectoryPath(cwd, {
scope: values.scope,
kind: values.kind,
modeSlug: values.modeSlug,
} as CreateRuleInput)
await openFile(directoryPath)
} catch (error) {
const errorMessage = getErrorMessage(error)
provider.log(`Error opening rules directory: ${errorMessage}`)
vscode.window.showErrorMessage(`Failed to open rules directory: ${errorMessage}`)
}
}
async function refreshRules(provider: ClineProvider, cwd: string): Promise<RuleMetadata[]> {
const modes = await provider.getModes()
const rules = await getRules(cwd, { modes })
await provider.postMessageToWebview({ type: "rules", rules })
return rules
}
function parseCreateRuleInput(message: WebviewMessage): CreateRuleInput {
const values = message.values ?? {}
const scope = parseRuleScope(values.scope)
const kind = parseRuleKind(values.kind)
const fileName = values.fileName ?? message.text
if (!scope || !kind || !fileName) {
throw new Error("Missing required fields: scope, kind, or fileName")
}
return {
scope,
kind,
modeSlug: typeof values.modeSlug === "string" ? values.modeSlug : undefined,
fileName,
}
}
function parseDeleteRuleInput(message: WebviewMessage): DeleteRuleInput {
const values = message.values ?? {}
const scope = parseRuleScope(values.scope)
const kind = parseRuleKind(values.kind)
const relativePath = values.relativePath ?? message.text
if (!scope || !kind || !relativePath) {
throw new Error("Missing required fields: scope, kind, or relativePath")
}
return {
id: typeof values.id === "string" ? values.id : undefined,
scope,
kind,
modeSlug: typeof values.modeSlug === "string" ? values.modeSlug : undefined,
relativePath,
}
}
function parseRuleScope(value: unknown): RuleScope | undefined {
return value === "global" || value === "project" ? value : undefined
}
function parseRuleKind(value: unknown): RuleKind | undefined {
return value === "generic" || value === "mode" ? value : undefined
}