mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
refactor: migrate tool call format to function_calls/invoke pattern
- Changed from <tool_name><param>value</param></tool_name> - To <function_calls><invoke name="tool_name"><parameter name="param">value</parameter></invoke></function_calls> Updates: - 3 core parsers (AssistantMessageParser, parseAssistantMessage V1/V2) - 25 tool definition files - 6 documentation/prompt files - 1 bedrock converter - 30+ test files - 13 snapshots regenerated Tests: 137/139 passing (98.6%) Verified: 0 old format references remaining for all 21 tools
This commit is contained in:
parent
34392dd4dd
commit
c92e855cdf
56 changed files with 3344 additions and 2498 deletions
|
|
@ -97,7 +97,7 @@ describe("convertToBedrockConverseMessages", () => {
|
|||
expect(toolBlock.toolUse).toEqual({
|
||||
toolUseId: "test-id",
|
||||
name: "read_file",
|
||||
input: "<read_file>\n<path>\ntest.txt\n</path>\n</read_file>",
|
||||
input: '<function_calls>\n<invoke name="read_file">\n<parameter name="path">\ntest.txt\n</parameter>\n</invoke>\n</function_calls>',
|
||||
})
|
||||
} else {
|
||||
expect.fail("Expected tool use block not found")
|
||||
|
|
|
|||
|
|
@ -86,16 +86,16 @@ export function convertToBedrockConverseMessages(anthropicMessages: Anthropic.Me
|
|||
}
|
||||
|
||||
if (messageBlock.type === "tool_use") {
|
||||
// Convert tool use to XML format
|
||||
// Convert tool use to new XML format
|
||||
const toolParams = Object.entries(messageBlock.input || {})
|
||||
.map(([key, value]) => `<${key}>\n${value}\n</${key}>`)
|
||||
.map(([key, value]) => `<parameter name="${key}">\n${value}\n</parameter>`)
|
||||
.join("\n")
|
||||
|
||||
return {
|
||||
toolUse: {
|
||||
toolUseId: messageBlock.id || "",
|
||||
name: messageBlock.name || "",
|
||||
input: `<${messageBlock.name}>\n${toolParams}\n</${messageBlock.name}>`,
|
||||
input: `<function_calls>\n<invoke name="${messageBlock.name}">\n${toolParams}\n</invoke>\n</function_calls>`,
|
||||
},
|
||||
} as ContentBlock
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,13 @@ import { AssistantMessageContent } from "./parseAssistantMessage"
|
|||
/**
|
||||
* Parser for assistant messages. Maintains state between chunks
|
||||
* to avoid reprocessing the entire message on each update.
|
||||
*
|
||||
* Supports the new format:
|
||||
* <function_calls>
|
||||
* <invoke name="tool_name">
|
||||
* <parameter name="param_name">value</parameter>
|
||||
* </invoke>
|
||||
* </function_calls>
|
||||
*/
|
||||
export class AssistantMessageParser {
|
||||
private contentBlocks: AssistantMessageContent[] = []
|
||||
|
|
@ -17,6 +24,7 @@ export class AssistantMessageParser {
|
|||
private readonly MAX_ACCUMULATOR_SIZE = 1024 * 1024 // 1MB limit
|
||||
private readonly MAX_PARAM_LENGTH = 1024 * 100 // 100KB per parameter limit
|
||||
private accumulator = ""
|
||||
private inFunctionCalls = false
|
||||
|
||||
/**
|
||||
* Initialize a new AssistantMessageParser instance.
|
||||
|
|
@ -37,6 +45,7 @@ export class AssistantMessageParser {
|
|||
this.currentParamName = undefined
|
||||
this.currentParamValueStartIndex = 0
|
||||
this.accumulator = ""
|
||||
this.inFunctionCalls = false
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -47,8 +56,17 @@ export class AssistantMessageParser {
|
|||
// Return a shallow copy to prevent external mutation
|
||||
return this.contentBlocks.slice()
|
||||
}
|
||||
/**
|
||||
* Extract the name attribute from a tag like <invoke name="tool_name"> or <parameter name="param_name">
|
||||
*/
|
||||
private extractNameAttribute(tagContent: string): string | null {
|
||||
const match = tagContent.match(/name="([^"]+)"/)
|
||||
return match ? match[1] : null
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a new chunk of text and update the parser state.
|
||||
* Supports the new format: <function_calls><invoke name="tool"><parameter name="param">value</parameter></invoke></function_calls>
|
||||
* @param chunk The new chunk of text to process.
|
||||
*/
|
||||
public processChunk(chunk: string): AssistantMessageContent[] {
|
||||
|
|
@ -63,7 +81,32 @@ export class AssistantMessageParser {
|
|||
this.accumulator += char
|
||||
const currentPosition = accumulatorStartLength + i
|
||||
|
||||
// There should not be a param without a tool use.
|
||||
// Check for <function_calls> opening tag
|
||||
if (!this.inFunctionCalls && this.accumulator.endsWith("<function_calls>")) {
|
||||
this.inFunctionCalls = true
|
||||
|
||||
// End current text content if exists
|
||||
if (this.currentTextContent) {
|
||||
this.currentTextContent.partial = false
|
||||
this.currentTextContent.content = this.accumulator
|
||||
.slice(this.currentTextContentStartIndex, this.accumulator.length - "<function_calls>".length)
|
||||
.trim()
|
||||
if (this.currentTextContent.content.length > 0) {
|
||||
// No need to push, already in contentBlocks
|
||||
}
|
||||
this.currentTextContent = undefined
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Check for </function_calls> closing tag
|
||||
if (this.inFunctionCalls && this.accumulator.endsWith("</function_calls>")) {
|
||||
this.inFunctionCalls = false
|
||||
this.currentTextContentStartIndex = this.accumulator.length
|
||||
continue
|
||||
}
|
||||
|
||||
// Inside function_calls block, handle parameters
|
||||
if (this.currentToolUse && this.currentParamName) {
|
||||
const currentParamValue = this.accumulator.slice(this.currentParamValueStartIndex)
|
||||
if (currentParamValue.length > this.MAX_PARAM_LENGTH) {
|
||||
|
|
@ -72,11 +115,10 @@ export class AssistantMessageParser {
|
|||
this.currentParamValueStartIndex = 0
|
||||
continue
|
||||
}
|
||||
const paramClosingTag = `</${this.currentParamName}>`
|
||||
// Streamed param content: always write the currently accumulated value
|
||||
|
||||
const paramClosingTag = `</parameter>`
|
||||
if (currentParamValue.endsWith(paramClosingTag)) {
|
||||
// End of param value.
|
||||
// Do not trim content parameters to preserve newlines, but strip first and last newline only
|
||||
// End of param value
|
||||
const paramValue = currentParamValue.slice(0, -paramClosingTag.length)
|
||||
this.currentToolUse.params[this.currentParamName] =
|
||||
this.currentParamName === "content"
|
||||
|
|
@ -85,141 +127,92 @@ export class AssistantMessageParser {
|
|||
this.currentParamName = undefined
|
||||
continue
|
||||
} else {
|
||||
// Partial param value is accumulating.
|
||||
// Write the currently accumulated param content in real time
|
||||
// Partial param value is accumulating
|
||||
this.currentToolUse.params[this.currentParamName] = currentParamValue
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// No currentParamName.
|
||||
|
||||
if (this.currentToolUse) {
|
||||
const currentToolValue = this.accumulator.slice(this.currentToolUseStartIndex)
|
||||
const toolUseClosingTag = `</${this.currentToolUse.name}>`
|
||||
if (currentToolValue.endsWith(toolUseClosingTag)) {
|
||||
// End of a tool use.
|
||||
this.currentToolUse.partial = false
|
||||
|
||||
this.currentToolUse = undefined
|
||||
continue
|
||||
} else {
|
||||
const possibleParamOpeningTags = toolParamNames.map((name) => `<${name}>`)
|
||||
for (const paramOpeningTag of possibleParamOpeningTags) {
|
||||
if (this.accumulator.endsWith(paramOpeningTag)) {
|
||||
// Start of a new parameter.
|
||||
const paramName = paramOpeningTag.slice(1, -1)
|
||||
if (!toolParamNames.includes(paramName as ToolParamName)) {
|
||||
// Handle invalid parameter name gracefully
|
||||
continue
|
||||
}
|
||||
this.currentParamName = paramName as ToolParamName
|
||||
this.currentParamValueStartIndex = this.accumulator.length
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// There's no current param, and not starting a new param.
|
||||
|
||||
// Special case for write_to_file where file contents could
|
||||
// contain the closing tag, in which case the param would have
|
||||
// closed and we end up with the rest of the file contents here.
|
||||
// To work around this, get the string between the starting
|
||||
// content tag and the LAST content tag.
|
||||
// Inside function_calls, handle invoke tags
|
||||
if (this.inFunctionCalls) {
|
||||
// Check for </invoke> closing tag
|
||||
if (this.currentToolUse && this.accumulator.endsWith("</invoke>")) {
|
||||
// Special case for write_to_file content parameter
|
||||
const contentParamName: ToolParamName = "content"
|
||||
|
||||
if (
|
||||
this.currentToolUse.name === "write_to_file" &&
|
||||
this.accumulator.endsWith(`</${contentParamName}>`)
|
||||
) {
|
||||
const toolContent = this.accumulator.slice(this.currentToolUseStartIndex)
|
||||
const contentStartTag = `<${contentParamName}>`
|
||||
const contentEndTag = `</${contentParamName}>`
|
||||
const contentStartIndex = toolContent.indexOf(contentStartTag) + contentStartTag.length
|
||||
if (this.currentToolUse.name === "write_to_file") {
|
||||
const toolContent = this.accumulator.slice(
|
||||
this.currentToolUseStartIndex,
|
||||
this.accumulator.length - "</invoke>".length,
|
||||
)
|
||||
const contentStartTag = `<parameter name="${contentParamName}">`
|
||||
const contentEndTag = `</parameter>`
|
||||
const contentStartIndex = toolContent.indexOf(contentStartTag)
|
||||
const contentEndIndex = toolContent.lastIndexOf(contentEndTag)
|
||||
|
||||
if (contentStartIndex !== -1 && contentEndIndex !== -1 && contentEndIndex > contentStartIndex) {
|
||||
// Don't trim content to preserve newlines, but strip first and last newline only
|
||||
this.currentToolUse.params[contentParamName] = toolContent
|
||||
.slice(contentStartIndex, contentEndIndex)
|
||||
const contentValue = toolContent
|
||||
.slice(contentStartIndex + contentStartTag.length, contentEndIndex)
|
||||
.replace(/^\n/, "")
|
||||
.replace(/\n$/, "")
|
||||
this.currentToolUse.params[contentParamName] = contentValue
|
||||
}
|
||||
}
|
||||
|
||||
// Partial tool value is accumulating.
|
||||
// End of tool use
|
||||
this.currentToolUse.partial = false
|
||||
this.currentToolUse = undefined
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// No currentToolUse.
|
||||
|
||||
let didStartToolUse = false
|
||||
const possibleToolUseOpeningTags = toolNames.map((name) => `<${name}>`)
|
||||
|
||||
for (const toolUseOpeningTag of possibleToolUseOpeningTags) {
|
||||
if (this.accumulator.endsWith(toolUseOpeningTag)) {
|
||||
// Extract and validate the tool name
|
||||
const extractedToolName = toolUseOpeningTag.slice(1, -1)
|
||||
|
||||
// Check if the extracted tool name is valid
|
||||
if (!toolNames.includes(extractedToolName as ToolName)) {
|
||||
// Invalid tool name, treat as plain text and continue
|
||||
// Check for <parameter name="..."> opening tag
|
||||
if (this.currentToolUse && !this.currentParamName) {
|
||||
const paramMatch = this.accumulator.match(/<parameter name="([^"]+)">$/)
|
||||
if (paramMatch) {
|
||||
const paramName = paramMatch[1]
|
||||
if (toolParamNames.includes(paramName as ToolParamName)) {
|
||||
this.currentParamName = paramName as ToolParamName
|
||||
this.currentParamValueStartIndex = this.accumulator.length
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// Start of a new tool use.
|
||||
this.currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: extractedToolName as ToolName,
|
||||
params: {},
|
||||
partial: true,
|
||||
// Check for <invoke name="..."> opening tag
|
||||
if (!this.currentToolUse) {
|
||||
const invokeMatch = this.accumulator.match(/<invoke name="([^"]+)">$/)
|
||||
if (invokeMatch) {
|
||||
const toolName = invokeMatch[1]
|
||||
if (toolNames.includes(toolName as ToolName)) {
|
||||
this.currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: toolName as ToolName,
|
||||
params: {},
|
||||
partial: true,
|
||||
}
|
||||
this.currentToolUseStartIndex = this.accumulator.length
|
||||
|
||||
// Immediately push new tool_use block as partial
|
||||
let idx = this.contentBlocks.findIndex((block) => block === this.currentToolUse)
|
||||
if (idx === -1) {
|
||||
this.contentBlocks.push(this.currentToolUse)
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
this.currentToolUseStartIndex = this.accumulator.length
|
||||
|
||||
// This also indicates the end of the current text content.
|
||||
if (this.currentTextContent) {
|
||||
this.currentTextContent.partial = false
|
||||
|
||||
// Remove the partially accumulated tool use tag from the
|
||||
// end of text (<tool).
|
||||
this.currentTextContent.content = this.currentTextContent.content
|
||||
.slice(0, -toolUseOpeningTag.slice(0, -1).length)
|
||||
.trim()
|
||||
|
||||
// No need to push, currentTextContent is already in contentBlocks
|
||||
this.currentTextContent = undefined
|
||||
}
|
||||
|
||||
// Immediately push new tool_use block as partial
|
||||
let idx = this.contentBlocks.findIndex((block) => block === this.currentToolUse)
|
||||
if (idx === -1) {
|
||||
this.contentBlocks.push(this.currentToolUse)
|
||||
}
|
||||
|
||||
didStartToolUse = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (!didStartToolUse) {
|
||||
// No tool use, so it must be text either at the beginning or
|
||||
// between tools.
|
||||
// Outside function_calls, handle text content
|
||||
if (!this.inFunctionCalls && !this.currentToolUse) {
|
||||
if (this.currentTextContent === undefined) {
|
||||
// If this is the first chunk and we're at the beginning of processing,
|
||||
// set the start index to the current position in the accumulator
|
||||
this.currentTextContentStartIndex = currentPosition
|
||||
|
||||
// Create a new text content block and add it to contentBlocks
|
||||
this.currentTextContent = {
|
||||
type: "text",
|
||||
content: this.accumulator.slice(this.currentTextContentStartIndex).trim(),
|
||||
partial: true,
|
||||
}
|
||||
|
||||
// Add the new text content to contentBlocks immediately
|
||||
// Ensures it appears in the UI right away
|
||||
this.contentBlocks.push(this.currentTextContent)
|
||||
} else {
|
||||
// Update the existing text content
|
||||
|
|
@ -227,9 +220,7 @@ export class AssistantMessageParser {
|
|||
}
|
||||
}
|
||||
}
|
||||
// Do not call finalizeContentBlocks() here.
|
||||
// Instead, update any partial blocks in the array and add new ones as they're completed.
|
||||
// This matches the behavior of the original parseAssistantMessage function.
|
||||
|
||||
return this.getContentBlocks()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
describe("tool use streaming", () => {
|
||||
it("should parse a tool use with parameter, streamed char by char", () => {
|
||||
const message = "<read_file><path>src/file.ts</path></read_file>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -87,7 +88,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should mark tool use as partial when not closed", () => {
|
||||
const message = "<read_file><path>src/file.ts</path>"
|
||||
const message = '<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -98,7 +99,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle a partial parameter in a tool use", () => {
|
||||
const message = "<read_file><path>src/file"
|
||||
const message = '<function_calls><invoke name="read_file"><parameter name="path">src/file'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -110,7 +111,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
it("should handle tool use with multiple parameters streamed", () => {
|
||||
const message =
|
||||
"<read_file><path>src/file.ts</path><start_line>10</start_line><end_line>20</end_line></read_file>"
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter><parameter name="start_line">10</parameter><parameter name="end_line">20</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -125,7 +126,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
describe("mixed content streaming", () => {
|
||||
it("should parse text followed by a tool use, streamed", () => {
|
||||
const message = "Text before tool <read_file><path>src/file.ts</path></read_file>"
|
||||
const message =
|
||||
'Text before tool <function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message)
|
||||
expect(result).toHaveLength(2)
|
||||
const textContent = result[0] as TextContent
|
||||
|
|
@ -140,7 +142,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should parse a tool use followed by text, streamed", () => {
|
||||
const message = "<read_file><path>src/file.ts</path></read_file>Text after tool"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>Text after tool'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(2)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -156,7 +159,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
it("should parse multiple tool uses separated by text, streamed", () => {
|
||||
const message =
|
||||
"First: <read_file><path>file1.ts</path></read_file>Second: <read_file><path>file2.ts</path></read_file>"
|
||||
'First: <function_calls><invoke name="read_file"><parameter name="path">file1.ts</parameter></invoke></function_calls>Second: <function_calls><invoke name="read_file"><parameter name="path">file2.ts</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message)
|
||||
expect(result).toHaveLength(4)
|
||||
expect(result[0].type).toBe("text")
|
||||
|
|
@ -174,12 +177,12 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
describe("special and edge cases", () => {
|
||||
it("should handle the write_to_file tool with content that contains closing tags", () => {
|
||||
const message = `<write_to_file><path>src/file.ts</path><content>
|
||||
const message = `<function_calls><invoke name="write_to_file"><parameter name="path">src/file.ts</parameter><parameter name="content">
|
||||
function example() {
|
||||
// This has XML-like content: </content>
|
||||
// This has XML-like content: </parameter>
|
||||
return true;
|
||||
}
|
||||
</content><line_count>5</line_count></write_to_file>`
|
||||
</parameter><parameter name="line_count">5</parameter></invoke></function_calls>`
|
||||
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
|
|
@ -190,7 +193,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
expect(toolUse.params.path).toBe("src/file.ts")
|
||||
expect(toolUse.params.line_count).toBe("5")
|
||||
expect(toolUse.params.content).toContain("function example()")
|
||||
expect(toolUse.params.content).toContain("// This has XML-like content: </content>")
|
||||
expect(toolUse.params.content).toContain("// This has XML-like content: </parameter>")
|
||||
expect(toolUse.params.content).toContain("return true;")
|
||||
expect(toolUse.partial).toBe(false)
|
||||
})
|
||||
|
|
@ -209,7 +212,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle tool use with no parameters", () => {
|
||||
const message = "<browser_action></browser_action>"
|
||||
const message = '<function_calls><invoke name="browser_action"></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -220,7 +223,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle a tool use with a parameter containing XML-like content", () => {
|
||||
const message = "<search_files><regex><div>.*</div></regex><path>src</path></search_files>"
|
||||
const message =
|
||||
'<function_calls><invoke name="search_files"><parameter name="regex"><div>.*</div></parameter><parameter name="path">src</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -232,7 +236,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle consecutive tool uses without text in between", () => {
|
||||
const message = "<read_file><path>file1.ts</path></read_file><read_file><path>file2.ts</path></read_file>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">file1.ts</parameter></invoke></function_calls><function_calls><invoke name="read_file"><parameter name="path">file2.ts</parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(2)
|
||||
const toolUse1 = result[0] as ToolUse
|
||||
|
|
@ -248,7 +253,8 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle whitespace in parameters", () => {
|
||||
const message = "<read_file><path> src/file.ts </path></read_file>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path"> src/file.ts </parameter></invoke></function_calls>'
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
expect(result).toHaveLength(1)
|
||||
const toolUse = result[0] as ToolUse
|
||||
|
|
@ -259,11 +265,11 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
})
|
||||
|
||||
it("should handle multi-line parameters", () => {
|
||||
const message = `<write_to_file><path>file.ts</path><content>
|
||||
const message = `<function_calls><invoke name="write_to_file"><parameter name="path">file.ts</parameter><parameter name="content">
|
||||
line 1
|
||||
line 2
|
||||
line 3
|
||||
</content><line_count>3</line_count></write_to_file>`
|
||||
</parameter><parameter name="line_count">3</parameter></invoke></function_calls>`
|
||||
const result = streamChunks(parser, message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -280,18 +286,18 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
it("should handle a complex message with multiple content types", () => {
|
||||
const message = `I'll help you with that task.
|
||||
|
||||
<read_file><path>src/index.ts</path></read_file>
|
||||
<function_calls><invoke name="read_file"><parameter name="path">src/index.ts</parameter></invoke></function_calls>
|
||||
|
||||
Now let's modify the file:
|
||||
|
||||
<write_to_file><path>src/index.ts</path><content>
|
||||
<function_calls><invoke name="write_to_file"><parameter name="path">src/index.ts</parameter><parameter name="content">
|
||||
// Updated content
|
||||
console.log("Hello world");
|
||||
</content><line_count>2</line_count></write_to_file>
|
||||
</parameter><parameter name="line_count">2</parameter></invoke></function_calls>
|
||||
|
||||
Let's run the code:
|
||||
|
||||
<execute_command><command>node src/index.ts</command></execute_command>`
|
||||
<function_calls><invoke name="execute_command"><parameter name="command">node src/index.ts</parameter></invoke></function_calls>`
|
||||
|
||||
const result = streamChunks(parser, message)
|
||||
|
||||
|
|
@ -336,7 +342,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
it("should gracefully handle a parameter that exceeds MAX_PARAM_LENGTH", () => {
|
||||
// Create a parameter value that exceeds 100KB (MAX_PARAM_LENGTH)
|
||||
const largeParamValue = "x".repeat(1024 * 100 + 1) // 100KB + 1 byte
|
||||
const message = `<write_to_file><path>test.txt</path><content>${largeParamValue}</content></write_to_file>After tool`
|
||||
const message = `<function_calls><invoke name="write_to_file"><parameter name="path">test.txt</parameter><parameter name="content">${largeParamValue}</parameter></invoke></function_calls>After tool`
|
||||
|
||||
// Process the message in chunks to simulate streaming
|
||||
let result: AssistantMessageContent[] = []
|
||||
|
|
@ -344,7 +350,9 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
try {
|
||||
// Process the opening tags
|
||||
result = parser.processChunk("<write_to_file><path>test.txt</path><content>")
|
||||
result = parser.processChunk(
|
||||
'<function_calls><invoke name="write_to_file"><parameter name="path">test.txt</parameter><parameter name="content">',
|
||||
)
|
||||
|
||||
// Process the large parameter value in chunks
|
||||
const chunkSize = 1000
|
||||
|
|
@ -354,7 +362,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
}
|
||||
|
||||
// Process the closing tags and text after
|
||||
result = parser.processChunk("</content></write_to_file>After tool")
|
||||
result = parser.processChunk("</parameter></invoke></function_calls>After tool")
|
||||
} catch (e) {
|
||||
error = e as Error
|
||||
}
|
||||
|
|
@ -381,7 +389,7 @@ describe("AssistantMessageParser (streaming)", () => {
|
|||
|
||||
describe("finalizeContentBlocks", () => {
|
||||
it("should mark all partial blocks as complete", () => {
|
||||
const message = "<read_file><path>src/file.ts"
|
||||
const message = '<function_calls><invoke name="read_file"><parameter name="path">src/file.ts'
|
||||
streamChunks(parser, message)
|
||||
let blocks = parser.getContentBlocks()
|
||||
// The block may already be partial or not, depending on chunking.
|
||||
|
|
|
|||
|
|
@ -50,7 +50,8 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
describe("tool use parsing", () => {
|
||||
it("should parse a simple tool use", () => {
|
||||
const message = "<read_file><path>src/file.ts</path></read_file>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -63,7 +64,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
it("should parse a tool use with multiple parameters", () => {
|
||||
const message =
|
||||
"<read_file><path>src/file.ts</path><start_line>10</start_line><end_line>20</end_line></read_file>"
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter><parameter name="start_line">10</parameter><parameter name="end_line">20</parameter></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -77,7 +78,8 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should mark tool use as partial when it's not closed", () => {
|
||||
const message = "<read_file><path>src/file.ts</path>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -89,7 +91,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should handle a partial parameter in a tool use", () => {
|
||||
const message = "<read_file><path>src/file.ts"
|
||||
const message = '<function_calls><invoke name="read_file"><parameter name="path">src/file.ts'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -103,7 +105,8 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
describe("mixed content parsing", () => {
|
||||
it("should parse text followed by a tool use", () => {
|
||||
const message = "Here's the file content: <read_file><path>src/file.ts</path></read_file>"
|
||||
const message =
|
||||
'Here\'s the file content: <function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>'
|
||||
const result = parser(message)
|
||||
|
||||
expect(result).toHaveLength(2)
|
||||
|
|
@ -121,7 +124,8 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should parse a tool use followed by text", () => {
|
||||
const message = "<read_file><path>src/file.ts</path></read_file>Here's what I found in the file."
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>Here\'s what I found in the file.'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(2)
|
||||
|
|
@ -140,7 +144,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
it("should parse multiple tool uses separated by text", () => {
|
||||
const message =
|
||||
"First file: <read_file><path>src/file1.ts</path></read_file>Second file: <read_file><path>src/file2.ts</path></read_file>"
|
||||
'First file: <function_calls><invoke name="read_file"><parameter name="path">src/file1.ts</parameter></invoke></function_calls>Second file: <function_calls><invoke name="read_file"><parameter name="path">src/file2.ts</parameter></invoke></function_calls>'
|
||||
const result = parser(message)
|
||||
|
||||
expect(result).toHaveLength(4)
|
||||
|
|
@ -163,12 +167,12 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
describe("special cases", () => {
|
||||
it("should handle the write_to_file tool with content that contains closing tags", () => {
|
||||
const message = `<write_to_file><path>src/file.ts</path><content>
|
||||
const message = `<function_calls><invoke name="write_to_file"><parameter name="path">src/file.ts</parameter><parameter name="content">
|
||||
function example() {
|
||||
// This has XML-like content: </content>
|
||||
// This has XML-like content: </parameter>
|
||||
return true;
|
||||
}
|
||||
</content><line_count>5</line_count></write_to_file>`
|
||||
</parameter><parameter name="line_count">5</parameter></invoke></function_calls>`
|
||||
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
|
|
@ -179,7 +183,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
expect(toolUse.params.path).toBe("src/file.ts")
|
||||
expect(toolUse.params.line_count).toBe("5")
|
||||
expect(toolUse.params.content).toContain("function example()")
|
||||
expect(toolUse.params.content).toContain("// This has XML-like content: </content>")
|
||||
expect(toolUse.params.content).toContain("// This has XML-like content: </parameter>")
|
||||
expect(toolUse.params.content).toContain("return true;")
|
||||
expect(toolUse.partial).toBe(false)
|
||||
})
|
||||
|
|
@ -201,7 +205,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should handle tool use with no parameters", () => {
|
||||
const message = "<browser_action></browser_action>"
|
||||
const message = '<function_calls><invoke name="browser_action"></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -214,7 +218,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
it("should handle nested tool tags that aren't actually nested", () => {
|
||||
const message =
|
||||
"<execute_command><command>echo '<read_file><path>test.txt</path></read_file>'</command></execute_command>"
|
||||
'<function_calls><invoke name="execute_command"><parameter name="command">echo \'<function_calls><invoke name="read_file"><parameter name="path">test.txt</parameter></invoke></function_calls>\'</parameter></invoke></function_calls>'
|
||||
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
|
|
@ -222,12 +226,15 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
const toolUse = result[0] as ToolUse
|
||||
expect(toolUse.type).toBe("tool_use")
|
||||
expect(toolUse.name).toBe("execute_command")
|
||||
expect(toolUse.params.command).toBe("echo '<read_file><path>test.txt</path></read_file>'")
|
||||
expect(toolUse.params.command).toBe(
|
||||
'echo \'<function_calls><invoke name="read_file"><parameter name="path">test.txt</parameter></invoke></function_calls>\'',
|
||||
)
|
||||
expect(toolUse.partial).toBe(false)
|
||||
})
|
||||
|
||||
it("should handle a tool use with a parameter containing XML-like content", () => {
|
||||
const message = "<search_files><regex><div>.*</div></regex><path>src</path></search_files>"
|
||||
const message =
|
||||
'<function_calls><invoke name="search_files"><parameter name="regex"><div>.*</div></parameter><parameter name="path">src</parameter></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -241,7 +248,7 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
|
||||
it("should handle consecutive tool uses without text in between", () => {
|
||||
const message =
|
||||
"<read_file><path>file1.ts</path></read_file><read_file><path>file2.ts</path></read_file>"
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">file1.ts</parameter></invoke></function_calls><function_calls><invoke name="read_file"><parameter name="path">file2.ts</parameter></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(2)
|
||||
|
|
@ -260,7 +267,8 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should handle whitespace in parameters", () => {
|
||||
const message = "<read_file><path> src/file.ts </path></read_file>"
|
||||
const message =
|
||||
'<function_calls><invoke name="read_file"><parameter name="path"> src/file.ts </parameter></invoke></function_calls>'
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -272,11 +280,11 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
})
|
||||
|
||||
it("should handle multi-line parameters", () => {
|
||||
const message = `<write_to_file><path>file.ts</path><content>
|
||||
const message = `<function_calls><invoke name="write_to_file"><parameter name="path">file.ts</parameter><parameter name="content">
|
||||
line 1
|
||||
line 2
|
||||
line 3
|
||||
</content><line_count>3</line_count></write_to_file>`
|
||||
</parameter><parameter name="line_count">3</parameter></invoke></function_calls>`
|
||||
const result = parser(message).filter((block) => !isEmptyTextContent(block))
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
|
|
@ -294,18 +302,18 @@ const isEmptyTextContent = (block: AssistantMessageContent) =>
|
|||
it("should handle a complex message with multiple content types", () => {
|
||||
const message = `I'll help you with that task.
|
||||
|
||||
<read_file><path>src/index.ts</path></read_file>
|
||||
<function_calls><invoke name="read_file"><parameter name="path">src/index.ts</parameter></invoke></function_calls>
|
||||
|
||||
Now let's modify the file:
|
||||
|
||||
<write_to_file><path>src/index.ts</path><content>
|
||||
<function_calls><invoke name="write_to_file"><parameter name="path">src/index.ts</parameter><parameter name="content">
|
||||
// Updated content
|
||||
console.log("Hello world");
|
||||
</content><line_count>2</line_count></write_to_file>
|
||||
</parameter><parameter name="line_count">2</parameter></invoke></function_calls>
|
||||
|
||||
Let's run the code:
|
||||
|
||||
<execute_command><command>node src/index.ts</command></execute_command>`
|
||||
<function_calls><invoke name="execute_command"><parameter name="command">node src/index.ts</parameter></invoke></function_calls>`
|
||||
|
||||
const result = parser(message)
|
||||
|
||||
|
|
|
|||
|
|
@ -58,21 +58,21 @@ const testCases = [
|
|||
},
|
||||
{
|
||||
name: "Message with a simple tool use",
|
||||
input: "Let's read a file: <read_file><path>src/file.ts</path></read_file>",
|
||||
input: 'Let\'s read a file: <function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>',
|
||||
},
|
||||
{
|
||||
name: "Message with a complex tool use (write_to_file)",
|
||||
input: "<write_to_file><path>src/file.ts</path><content>\nfunction example() {\n // This has XML-like content: </content>\n return true;\n}\n</content><line_count>5</line_count></write_to_file>",
|
||||
input: '<function_calls><invoke name="write_to_file"><parameter name="path">src/file.ts</parameter><parameter name="content">\nfunction example() {\n // This has XML-like content: </parameter>\n return true;\n}\n</parameter><parameter name="line_count">5</parameter></invoke></function_calls>',
|
||||
},
|
||||
{
|
||||
name: "Message with multiple tool uses",
|
||||
input: "First file: <read_file><path>src/file1.ts</path></read_file>\nSecond file: <read_file><path>src/file2.ts</path></read_file>\nLet's write a new file: <write_to_file><path>src/file3.ts</path><content>\nexport function newFunction() {\n return 'Hello world';\n}\n</content><line_count>3</line_count></write_to_file>",
|
||||
input: 'First file: <function_calls><invoke name="read_file"><parameter name="path">src/file1.ts</parameter></invoke></function_calls>\nSecond file: <function_calls><invoke name="read_file"><parameter name="path">src/file2.ts</parameter></invoke></function_calls>\nLet\'s write a new file: <function_calls><invoke name="write_to_file"><parameter name="path">src/file3.ts</parameter><parameter name="content">\nexport function newFunction() {\n return \'Hello world\';\n}\n</parameter><parameter name="line_count">3</parameter></invoke></function_calls>',
|
||||
},
|
||||
{
|
||||
name: "Large message with repeated tool uses",
|
||||
input: Array(50)
|
||||
.fill(
|
||||
'<read_file><path>src/file.ts</path></read_file>\n<write_to_file><path>output.ts</path><content>console.log("hello");</content><line_count>1</line_count></write_to_file>',
|
||||
'<function_calls><invoke name="read_file"><parameter name="path">src/file.ts</parameter></invoke></function_calls>\n<function_calls><invoke name="write_to_file"><parameter name="path">output.ts</parameter><parameter name="content">console.log("hello");</parameter><parameter name="line_count">1</parameter></invoke></function_calls>',
|
||||
)
|
||||
.join("\n"),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -13,18 +13,18 @@ export function parseAssistantMessage(assistantMessage: string): AssistantMessag
|
|||
let currentParamName: ToolParamName | undefined = undefined
|
||||
let currentParamValueStartIndex = 0
|
||||
let accumulator = ""
|
||||
let inFunctionCalls = false
|
||||
|
||||
for (let i = 0; i < assistantMessage.length; i++) {
|
||||
const char = assistantMessage[i]
|
||||
accumulator += char
|
||||
|
||||
// There should not be a param without a tool use.
|
||||
// Inside function_calls block, handle parameters (check this FIRST to avoid nested tag issues)
|
||||
if (currentToolUse && currentParamName) {
|
||||
const currentParamValue = accumulator.slice(currentParamValueStartIndex)
|
||||
const paramClosingTag = `</${currentParamName}>`
|
||||
const paramClosingTag = `</parameter>`
|
||||
if (currentParamValue.endsWith(paramClosingTag)) {
|
||||
// End of param value.
|
||||
// Don't trim content parameters to preserve newlines, but strip first and last newline only
|
||||
// End of param value
|
||||
const paramValue = currentParamValue.slice(0, -paramClosingTag.length)
|
||||
currentToolUse.params[currentParamName] =
|
||||
currentParamName === "content"
|
||||
|
|
@ -33,102 +33,103 @@ export function parseAssistantMessage(assistantMessage: string): AssistantMessag
|
|||
currentParamName = undefined
|
||||
continue
|
||||
} else {
|
||||
// Partial param value is accumulating.
|
||||
// Partial param value is accumulating
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// No currentParamName.
|
||||
// Check for <function_calls> opening tag (only if not in a parameter)
|
||||
if (!inFunctionCalls && !currentParamName && accumulator.endsWith("<function_calls>")) {
|
||||
inFunctionCalls = true
|
||||
|
||||
if (currentToolUse) {
|
||||
const currentToolValue = accumulator.slice(currentToolUseStartIndex)
|
||||
const toolUseClosingTag = `</${currentToolUse.name}>`
|
||||
if (currentToolValue.endsWith(toolUseClosingTag)) {
|
||||
// End of a tool use.
|
||||
// End current text content if exists
|
||||
if (currentTextContent) {
|
||||
currentTextContent.partial = false
|
||||
currentTextContent.content = accumulator
|
||||
.slice(currentTextContentStartIndex, accumulator.length - "<function_calls>".length)
|
||||
.trim()
|
||||
if (currentTextContent.content.length > 0) {
|
||||
contentBlocks.push(currentTextContent)
|
||||
}
|
||||
currentTextContent = undefined
|
||||
}
|
||||
currentTextContentStartIndex = accumulator.length
|
||||
continue
|
||||
}
|
||||
|
||||
// Check for </function_calls> closing tag (only if not in a parameter)
|
||||
if (inFunctionCalls && !currentParamName && accumulator.endsWith("</function_calls>")) {
|
||||
inFunctionCalls = false
|
||||
currentTextContentStartIndex = accumulator.length
|
||||
continue
|
||||
}
|
||||
|
||||
// Inside function_calls, handle invoke tags
|
||||
if (inFunctionCalls) {
|
||||
// Check for </invoke> closing tag
|
||||
if (currentToolUse && accumulator.endsWith("</invoke>")) {
|
||||
// Special case for write_to_file content parameter
|
||||
const contentParamName: ToolParamName = "content"
|
||||
if (currentToolUse.name === "write_to_file") {
|
||||
const toolContent = accumulator.slice(
|
||||
currentToolUseStartIndex,
|
||||
accumulator.length - "</invoke>".length,
|
||||
)
|
||||
const contentStartTag = `<parameter name="${contentParamName}">`
|
||||
const contentEndTag = `</parameter>`
|
||||
const contentStartIndex = toolContent.indexOf(contentStartTag)
|
||||
const contentEndIndex = toolContent.lastIndexOf(contentEndTag)
|
||||
|
||||
if (contentStartIndex !== -1 && contentEndIndex !== -1 && contentEndIndex > contentStartIndex) {
|
||||
const contentValue = toolContent
|
||||
.slice(contentStartIndex + contentStartTag.length, contentEndIndex)
|
||||
.replace(/^\n/, "")
|
||||
.replace(/\n$/, "")
|
||||
currentToolUse.params[contentParamName] = contentValue
|
||||
}
|
||||
}
|
||||
|
||||
// End of tool use
|
||||
currentToolUse.partial = false
|
||||
contentBlocks.push(currentToolUse)
|
||||
currentToolUse = undefined
|
||||
continue
|
||||
} else {
|
||||
const possibleParamOpeningTags = toolParamNames.map((name) => `<${name}>`)
|
||||
for (const paramOpeningTag of possibleParamOpeningTags) {
|
||||
if (accumulator.endsWith(paramOpeningTag)) {
|
||||
// Start of a new parameter.
|
||||
currentParamName = paramOpeningTag.slice(1, -1) as ToolParamName
|
||||
}
|
||||
|
||||
// Check for <parameter name="..."> opening tag
|
||||
if (currentToolUse && !currentParamName) {
|
||||
const match = accumulator.match(/<parameter name="([^"]+)">$/)
|
||||
if (match) {
|
||||
const paramName = match[1]
|
||||
if (toolParamNames.includes(paramName as ToolParamName)) {
|
||||
currentParamName = paramName as ToolParamName
|
||||
currentParamValueStartIndex = accumulator.length
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// There's no current param, and not starting a new param.
|
||||
|
||||
// Special case for write_to_file where file contents could
|
||||
// contain the closing tag, in which case the param would have
|
||||
// closed and we end up with the rest of the file contents here.
|
||||
// To work around this, we get the string between the starting
|
||||
// content tag and the LAST content tag.
|
||||
const contentParamName: ToolParamName = "content"
|
||||
|
||||
if (currentToolUse.name === "write_to_file" && accumulator.endsWith(`</${contentParamName}>`)) {
|
||||
const toolContent = accumulator.slice(currentToolUseStartIndex)
|
||||
const contentStartTag = `<${contentParamName}>`
|
||||
const contentEndTag = `</${contentParamName}>`
|
||||
const contentStartIndex = toolContent.indexOf(contentStartTag) + contentStartTag.length
|
||||
const contentEndIndex = toolContent.lastIndexOf(contentEndTag)
|
||||
|
||||
if (contentStartIndex !== -1 && contentEndIndex !== -1 && contentEndIndex > contentStartIndex) {
|
||||
// Don't trim content to preserve newlines, but strip first and last newline only
|
||||
currentToolUse.params[contentParamName] = toolContent
|
||||
.slice(contentStartIndex, contentEndIndex)
|
||||
.replace(/^\n/, "")
|
||||
.replace(/\n$/, "")
|
||||
// Check for <invoke name="..."> opening tag
|
||||
if (!currentToolUse) {
|
||||
const match = accumulator.match(/<invoke name="([^"]+)">$/)
|
||||
if (match) {
|
||||
const toolName = match[1]
|
||||
if (toolNames.includes(toolName as ToolName)) {
|
||||
currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: toolName as ToolName,
|
||||
params: {},
|
||||
partial: true,
|
||||
}
|
||||
currentToolUseStartIndex = accumulator.length
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Partial tool value is accumulating.
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// No currentToolUse.
|
||||
|
||||
let didStartToolUse = false
|
||||
const possibleToolUseOpeningTags = toolNames.map((name) => `<${name}>`)
|
||||
|
||||
for (const toolUseOpeningTag of possibleToolUseOpeningTags) {
|
||||
if (accumulator.endsWith(toolUseOpeningTag)) {
|
||||
// Start of a new tool use.
|
||||
currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: toolUseOpeningTag.slice(1, -1) as ToolName,
|
||||
params: {},
|
||||
partial: true,
|
||||
}
|
||||
|
||||
currentToolUseStartIndex = accumulator.length
|
||||
|
||||
// This also indicates the end of the current text content.
|
||||
if (currentTextContent) {
|
||||
currentTextContent.partial = false
|
||||
|
||||
// Remove the partially accumulated tool use tag from the
|
||||
// end of text (<tool).
|
||||
currentTextContent.content = currentTextContent.content
|
||||
.slice(0, -toolUseOpeningTag.slice(0, -1).length)
|
||||
.trim()
|
||||
|
||||
contentBlocks.push(currentTextContent)
|
||||
currentTextContent = undefined
|
||||
}
|
||||
|
||||
didStartToolUse = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (!didStartToolUse) {
|
||||
// No tool use, so it must be text either at the beginning or
|
||||
// between tools.
|
||||
// Outside function_calls, handle text content
|
||||
if (!inFunctionCalls && !currentToolUse) {
|
||||
if (currentTextContent === undefined) {
|
||||
currentTextContentStartIndex = i
|
||||
}
|
||||
|
|
@ -142,10 +143,9 @@ export function parseAssistantMessage(assistantMessage: string): AssistantMessag
|
|||
}
|
||||
|
||||
if (currentToolUse) {
|
||||
// Stream did not complete tool call, add it as partial.
|
||||
// Stream did not complete tool call, add it as partial
|
||||
if (currentParamName) {
|
||||
// Tool call has a parameter that was not completed.
|
||||
// Don't trim content parameters to preserve newlines, but strip first and last newline only
|
||||
// Tool call has a parameter that was not completed
|
||||
const paramValue = accumulator.slice(currentParamValueStartIndex)
|
||||
currentToolUse.params[currentParamName] =
|
||||
currentParamName === "content" ? paramValue.replace(/^\n/, "").replace(/\n$/, "") : paramValue.trim()
|
||||
|
|
@ -158,7 +158,7 @@ export function parseAssistantMessage(assistantMessage: string): AssistantMessag
|
|||
// currentTextContent, only one of them will be defined since only one can
|
||||
// be partial at a time.
|
||||
if (currentTextContent) {
|
||||
// Stream did not complete text content, add it as partial.
|
||||
// Stream did not complete text content, add it as partial
|
||||
contentBlocks.push(currentTextContent)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,23 +9,24 @@ export type AssistantMessageContent = TextContent | ToolUse
|
|||
* usage blocks marked with XML-like tags into an array of structured content
|
||||
* objects.
|
||||
*
|
||||
* Supports the new format:
|
||||
* <function_calls>
|
||||
* <invoke name="tool_name">
|
||||
* <parameter name="param_name">value</parameter>
|
||||
* </invoke>
|
||||
* </function_calls>
|
||||
*
|
||||
* This version aims for efficiency by avoiding the character-by-character
|
||||
* accumulator of V1. It iterates through the string using an index `i`. At each
|
||||
* position, it checks if the substring *ending* at `i` matches any known
|
||||
* opening or closing tags for tools or parameters using `startsWith` with an
|
||||
* offset.
|
||||
* It uses pre-computed Maps (`toolUseOpenTags`, `toolParamOpenTags`) for quick
|
||||
* tag lookups.
|
||||
* State is managed using indices (`currentTextContentStart`,
|
||||
* `currentToolUseStart`, `currentParamValueStart`) pointing to the start of the
|
||||
* current block within the original `assistantMessage` string.
|
||||
* opening or closing tags.
|
||||
*
|
||||
* Slicing is used to extract content only when a block (text, parameter, or
|
||||
* tool use) is completed.
|
||||
* State is managed using indices pointing to the start of the current block
|
||||
* within the original `assistantMessage` string.
|
||||
*
|
||||
* Special handling for `write_to_file` and `new_rule` content parameters is
|
||||
* included, using `indexOf` and `lastIndexOf` on the relevant slice to handle
|
||||
* potentially nested closing tags.
|
||||
* Slicing is used to extract content only when a block is completed.
|
||||
*
|
||||
* Special handling for `write_to_file` content parameters is included.
|
||||
*
|
||||
* If the input string ends mid-block, the last open block is added and marked
|
||||
* as partial.
|
||||
|
|
@ -40,113 +41,99 @@ export type AssistantMessageContent = TextContent | ToolUse
|
|||
export function parseAssistantMessageV2(assistantMessage: string): AssistantMessageContent[] {
|
||||
const contentBlocks: AssistantMessageContent[] = []
|
||||
|
||||
let currentTextContentStart = 0 // Index where the current text block started.
|
||||
let currentTextContentStart = 0
|
||||
let currentTextContent: TextContent | undefined = undefined
|
||||
let currentToolUseStart = 0 // Index *after* the opening tag of the current tool use.
|
||||
let currentToolUseStart = 0
|
||||
let currentToolUse: ToolUse | undefined = undefined
|
||||
let currentParamValueStart = 0 // Index *after* the opening tag of the current param.
|
||||
let currentParamValueStart = 0
|
||||
let currentParamName: ToolParamName | undefined = undefined
|
||||
|
||||
// Precompute tags for faster lookups.
|
||||
const toolUseOpenTags = new Map<string, ToolName>()
|
||||
const toolParamOpenTags = new Map<string, ToolParamName>()
|
||||
|
||||
for (const name of toolNames) {
|
||||
toolUseOpenTags.set(`<${name}>`, name)
|
||||
}
|
||||
|
||||
for (const name of toolParamNames) {
|
||||
toolParamOpenTags.set(`<${name}>`, name)
|
||||
}
|
||||
let inFunctionCalls = false
|
||||
|
||||
const len = assistantMessage.length
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
const currentCharIndex = i
|
||||
|
||||
// Parsing a tool parameter
|
||||
// Inside function_calls block, handle parameters (check FIRST to avoid nested tag issues)
|
||||
if (currentToolUse && currentParamName) {
|
||||
const closeTag = `</${currentParamName}>`
|
||||
// Check if the string *ending* at index `i` matches the closing tag
|
||||
const paramCloseTag = "</parameter>"
|
||||
if (
|
||||
currentCharIndex >= closeTag.length - 1 &&
|
||||
assistantMessage.startsWith(
|
||||
closeTag,
|
||||
currentCharIndex - closeTag.length + 1, // Start checking from potential start of tag.
|
||||
)
|
||||
currentCharIndex >= paramCloseTag.length - 1 &&
|
||||
assistantMessage.startsWith(paramCloseTag, currentCharIndex - paramCloseTag.length + 1)
|
||||
) {
|
||||
// Found the closing tag for the parameter.
|
||||
// Found the closing tag for the parameter
|
||||
const value = assistantMessage.slice(
|
||||
currentParamValueStart, // Start after the opening tag.
|
||||
currentCharIndex - closeTag.length + 1, // End before the closing tag.
|
||||
currentParamValueStart,
|
||||
currentCharIndex - paramCloseTag.length + 1,
|
||||
)
|
||||
// Don't trim content parameters to preserve newlines, but strip first and last newline only
|
||||
currentToolUse.params[currentParamName] =
|
||||
currentParamName === "content" ? value.replace(/^\n/, "").replace(/\n$/, "") : value.trim()
|
||||
currentParamName = undefined // Go back to parsing tool content.
|
||||
// We don't continue loop here, need to check for tool close or other params at index i.
|
||||
currentParamName = undefined
|
||||
} else {
|
||||
continue // Still inside param value, move to next char.
|
||||
continue // Still inside param value
|
||||
}
|
||||
}
|
||||
|
||||
// Parsing a tool use (but not a specific parameter).
|
||||
if (currentToolUse && !currentParamName) {
|
||||
// Ensure we are not inside a parameter already.
|
||||
// Check if starting a new parameter.
|
||||
let startedNewParam = false
|
||||
// Check for <function_calls> opening tag (only if not in a parameter)
|
||||
const functionCallsOpenTag = "<function_calls>"
|
||||
if (
|
||||
!inFunctionCalls &&
|
||||
!currentParamName &&
|
||||
currentCharIndex >= functionCallsOpenTag.length - 1 &&
|
||||
assistantMessage.startsWith(functionCallsOpenTag, currentCharIndex - functionCallsOpenTag.length + 1)
|
||||
) {
|
||||
inFunctionCalls = true
|
||||
|
||||
for (const [tag, paramName] of toolParamOpenTags.entries()) {
|
||||
if (
|
||||
currentCharIndex >= tag.length - 1 &&
|
||||
assistantMessage.startsWith(tag, currentCharIndex - tag.length + 1)
|
||||
) {
|
||||
currentParamName = paramName
|
||||
currentParamValueStart = currentCharIndex + 1 // Value starts after the tag.
|
||||
startedNewParam = true
|
||||
break
|
||||
// End current text content if exists
|
||||
if (currentTextContent) {
|
||||
currentTextContent.content = assistantMessage
|
||||
.slice(currentTextContentStart, currentCharIndex - functionCallsOpenTag.length + 1)
|
||||
.trim()
|
||||
currentTextContent.partial = false
|
||||
if (currentTextContent.content.length > 0) {
|
||||
contentBlocks.push(currentTextContent)
|
||||
}
|
||||
currentTextContent = undefined
|
||||
}
|
||||
currentTextContentStart = currentCharIndex + 1
|
||||
continue
|
||||
}
|
||||
|
||||
if (startedNewParam) {
|
||||
continue // Handled start of param, move to next char.
|
||||
}
|
||||
|
||||
// Check if closing the current tool use.
|
||||
const toolCloseTag = `</${currentToolUse.name}>`
|
||||
// Check for </function_calls> closing tag (only if not in a parameter)
|
||||
const functionCallsCloseTag = "</function_calls>"
|
||||
if (
|
||||
inFunctionCalls &&
|
||||
!currentParamName &&
|
||||
currentCharIndex >= functionCallsCloseTag.length - 1 &&
|
||||
assistantMessage.startsWith(functionCallsCloseTag, currentCharIndex - functionCallsCloseTag.length + 1)
|
||||
) {
|
||||
inFunctionCalls = false
|
||||
currentTextContentStart = currentCharIndex + 1
|
||||
continue
|
||||
}
|
||||
|
||||
// Inside function_calls, handle invoke tags
|
||||
if (inFunctionCalls) {
|
||||
// Check for </invoke> closing tag
|
||||
const invokeCloseTag = "</invoke>"
|
||||
if (
|
||||
currentCharIndex >= toolCloseTag.length - 1 &&
|
||||
assistantMessage.startsWith(toolCloseTag, currentCharIndex - toolCloseTag.length + 1)
|
||||
currentToolUse &&
|
||||
currentCharIndex >= invokeCloseTag.length - 1 &&
|
||||
assistantMessage.startsWith(invokeCloseTag, currentCharIndex - invokeCloseTag.length + 1)
|
||||
) {
|
||||
// End of the tool use found.
|
||||
// Special handling for content params *before* finalizing the
|
||||
// tool.
|
||||
const toolContentSlice = assistantMessage.slice(
|
||||
currentToolUseStart, // From after the tool opening tag.
|
||||
currentCharIndex - toolCloseTag.length + 1, // To before the tool closing tag.
|
||||
)
|
||||
|
||||
// Check if content parameter needs special handling
|
||||
// (write_to_file/new_rule).
|
||||
// This check is important if the closing </content> tag was
|
||||
// missed by the parameter parsing logic (e.g., if content is
|
||||
// empty or parsing logic prioritizes tool close).
|
||||
// Special case for write_to_file content parameter
|
||||
const contentParamName: ToolParamName = "content"
|
||||
if (
|
||||
currentToolUse.name === "write_to_file" /* || currentToolUse.name === "new_rule" */ &&
|
||||
// !(contentParamName in currentToolUse.params) && // Only if not already parsed.
|
||||
toolContentSlice.includes(`<${contentParamName}>`) // Check if tag exists.
|
||||
) {
|
||||
const contentStartTag = `<${contentParamName}>`
|
||||
const contentEndTag = `</${contentParamName}>`
|
||||
if (currentToolUse.name === "write_to_file") {
|
||||
const toolContentSlice = assistantMessage.slice(
|
||||
currentToolUseStart,
|
||||
currentCharIndex - invokeCloseTag.length + 1,
|
||||
)
|
||||
const contentStartTag = `<parameter name="${contentParamName}">`
|
||||
const contentEndTag = "</parameter>"
|
||||
const contentStart = toolContentSlice.indexOf(contentStartTag)
|
||||
|
||||
// Use `lastIndexOf` for robustness against nested tags.
|
||||
const contentEnd = toolContentSlice.lastIndexOf(contentEndTag)
|
||||
|
||||
if (contentStart !== -1 && contentEnd !== -1 && contentEnd > contentStart) {
|
||||
// Don't trim content to preserve newlines, but strip first and last newline only
|
||||
const contentValue = toolContentSlice
|
||||
.slice(contentStart + contentStartTag.length, contentEnd)
|
||||
.replace(/^\n/, "")
|
||||
|
|
@ -155,98 +142,59 @@ export function parseAssistantMessageV2(assistantMessage: string): AssistantMess
|
|||
}
|
||||
}
|
||||
|
||||
currentToolUse.partial = false // Mark as complete.
|
||||
// End of tool use
|
||||
currentToolUse.partial = false
|
||||
contentBlocks.push(currentToolUse)
|
||||
currentToolUse = undefined // Reset state.
|
||||
currentTextContentStart = currentCharIndex + 1 // Potential text starts after this tag.
|
||||
continue // Move to next char.
|
||||
currentToolUse = undefined
|
||||
continue
|
||||
}
|
||||
|
||||
// If not starting a param and not closing the tool, continue
|
||||
// accumulating tool content implicitly.
|
||||
continue
|
||||
}
|
||||
|
||||
// Parsing text / looking for tool start.
|
||||
if (!currentToolUse) {
|
||||
// Check if starting a new tool use.
|
||||
let startedNewTool = false
|
||||
|
||||
for (const [tag, toolName] of toolUseOpenTags.entries()) {
|
||||
if (
|
||||
currentCharIndex >= tag.length - 1 &&
|
||||
assistantMessage.startsWith(tag, currentCharIndex - tag.length + 1)
|
||||
) {
|
||||
// End current text block if one was active.
|
||||
if (currentTextContent) {
|
||||
currentTextContent.content = assistantMessage
|
||||
.slice(
|
||||
currentTextContentStart, // From where text started.
|
||||
currentCharIndex - tag.length + 1, // To before the tool tag starts.
|
||||
)
|
||||
.trim()
|
||||
|
||||
currentTextContent.partial = false // Ended because tool started.
|
||||
|
||||
if (currentTextContent.content.length > 0) {
|
||||
contentBlocks.push(currentTextContent)
|
||||
}
|
||||
|
||||
currentTextContent = undefined
|
||||
} else {
|
||||
// Check for any text between the last block and this tag.
|
||||
const potentialText = assistantMessage
|
||||
.slice(
|
||||
currentTextContentStart, // From where text *might* have started.
|
||||
currentCharIndex - tag.length + 1, // To before the tool tag starts.
|
||||
)
|
||||
.trim()
|
||||
|
||||
if (potentialText.length > 0) {
|
||||
contentBlocks.push({
|
||||
type: "text",
|
||||
content: potentialText,
|
||||
partial: false,
|
||||
})
|
||||
}
|
||||
// Check for <parameter name="..."> opening tag
|
||||
if (currentToolUse && !currentParamName) {
|
||||
const paramMatch = assistantMessage
|
||||
.slice(Math.max(0, currentCharIndex - 50), currentCharIndex + 1)
|
||||
.match(/<parameter name="([^"]+)">$/)
|
||||
if (paramMatch) {
|
||||
const paramName = paramMatch[1]
|
||||
if (toolParamNames.includes(paramName as ToolParamName)) {
|
||||
currentParamName = paramName as ToolParamName
|
||||
currentParamValueStart = currentCharIndex + 1
|
||||
}
|
||||
|
||||
// Start the new tool use.
|
||||
currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: toolName,
|
||||
params: {},
|
||||
partial: true, // Assume partial until closing tag is found.
|
||||
}
|
||||
|
||||
currentToolUseStart = currentCharIndex + 1 // Tool content starts after the opening tag.
|
||||
startedNewTool = true
|
||||
|
||||
break
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if (startedNewTool) {
|
||||
continue // Handled start of tool, move to next char.
|
||||
// Check for <invoke name="..."> opening tag
|
||||
if (!currentToolUse) {
|
||||
const invokeMatch = assistantMessage
|
||||
.slice(Math.max(0, currentCharIndex - 50), currentCharIndex + 1)
|
||||
.match(/<invoke name="([^"]+)">$/)
|
||||
if (invokeMatch) {
|
||||
const toolName = invokeMatch[1]
|
||||
if (toolNames.includes(toolName as ToolName)) {
|
||||
currentToolUse = {
|
||||
type: "tool_use",
|
||||
name: toolName as ToolName,
|
||||
params: {},
|
||||
partial: true,
|
||||
}
|
||||
currentToolUseStart = currentCharIndex + 1
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If not starting a tool, it must be text content.
|
||||
// Outside function_calls, handle text content
|
||||
if (!inFunctionCalls && !currentToolUse) {
|
||||
if (!currentTextContent) {
|
||||
// Start a new text block if we aren't already in one.
|
||||
currentTextContentStart = currentCharIndex // Text starts at the current character.
|
||||
|
||||
// Check if the current char is the start of potential text *immediately* after a tag.
|
||||
// This needs the previous state - simpler to let slicing handle it later.
|
||||
// Resetting start index accurately is key.
|
||||
// It should be the index *after* the last processed tag.
|
||||
// The logic managing currentTextContentStart after closing tags handles this.
|
||||
currentTextContentStart = currentCharIndex
|
||||
currentTextContent = {
|
||||
type: "text",
|
||||
content: "", // Will be determined by slicing at the end or when a tool starts
|
||||
content: "",
|
||||
partial: true,
|
||||
}
|
||||
}
|
||||
// Continue accumulating text implicitly; content is extracted later.
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1059,8 +1059,8 @@ function sum(a, b) {
|
|||
expect(description).toContain("<<<<<<< SEARCH")
|
||||
expect(description).toContain("=======")
|
||||
expect(description).toContain(">>>>>>> REPLACE")
|
||||
expect(description).toContain("<apply_diff>")
|
||||
expect(description).toContain("</apply_diff>")
|
||||
expect(description).toContain('<invoke name="apply_diff">')
|
||||
expect(description).toContain("</invoke>")
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -134,8 +134,9 @@ Original file:
|
|||
\`\`\`
|
||||
|
||||
Search/Replace content:
|
||||
<apply_diff>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="apply_diff">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>eg.file.py</path>
|
||||
<diff>
|
||||
|
|
@ -154,12 +155,14 @@ def calculate_total(items):
|
|||
]]></content>
|
||||
</diff>
|
||||
</file>
|
||||
</args>
|
||||
</apply_diff>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Search/Replace content with multi edits across multiple files:
|
||||
<apply_diff>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="apply_diff">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>eg.file.py</path>
|
||||
<diff>
|
||||
|
|
@ -199,13 +202,15 @@ def greet(name):
|
|||
]]></content>
|
||||
</diff>
|
||||
</file>
|
||||
</args>
|
||||
</apply_diff>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
Usage:
|
||||
<apply_diff>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="apply_diff">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>File path here</path>
|
||||
<diff>
|
||||
|
|
@ -228,8 +233,9 @@ Each file requires its own path, start_line, and diff elements.
|
|||
<start_line>5</start_line>
|
||||
</diff>
|
||||
</file>
|
||||
</args>
|
||||
</apply_diff>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
||||
private unescapeMarkers(content: string): string {
|
||||
|
|
|
|||
|
|
@ -170,14 +170,16 @@ def calculate_sum(items):
|
|||
|
||||
|
||||
Usage:
|
||||
<apply_diff>
|
||||
<path>File path here</path>
|
||||
<diff>
|
||||
<function_calls>
|
||||
<invoke name="apply_diff">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="diff">
|
||||
Your search/replace content here
|
||||
You can use multi search/replace block in one diff block, but make sure to include the line numbers for each block.
|
||||
Only use a single line of '=======' between search and replacement content, because multiple '=======' will corrupt the file.
|
||||
</diff>
|
||||
</apply_diff>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
||||
private unescapeMarkers(content: string): string {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -270,23 +307,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -294,18 +335,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -313,16 +358,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -332,16 +381,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -373,27 +426,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -459,7 +516,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, a knowledgeable technical assistant focused on answering questions
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -167,23 +192,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -191,18 +220,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -210,16 +243,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -229,16 +266,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -270,27 +311,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -356,7 +401,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -96,9 +105,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create a Mode
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mode</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mode</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -107,18 +118,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -126,37 +141,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -165,18 +190,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -191,9 +219,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -206,23 +235,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -246,20 +279,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -269,23 +306,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -293,18 +334,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -312,16 +357,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -331,16 +380,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -372,27 +425,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -458,7 +515,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## use_mcp_tool
|
||||
Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters.
|
||||
|
|
@ -269,29 +306,33 @@ Parameters:
|
|||
- tool_name: (required) The name of the tool to execute
|
||||
- arguments: (required) A JSON object containing the tool's input parameters, following the tool's input schema
|
||||
Usage:
|
||||
<use_mcp_tool>
|
||||
<server_name>server name here</server_name>
|
||||
<tool_name>tool name here</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="tool_name">tool name here</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"param1": "value1",
|
||||
"param2": "value2"
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to use an MCP tool
|
||||
|
||||
<use_mcp_tool>
|
||||
<server_name>weather-server</server_name>
|
||||
<tool_name>get_forecast</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="tool_name">get_forecast</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"city": "San Francisco",
|
||||
"days": 5
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## access_mcp_resource
|
||||
Description: Request to access a resource provided by a connected MCP server. Resources represent data sources that can be used as context, such as files, API responses, or system information.
|
||||
|
|
@ -299,17 +340,21 @@ Parameters:
|
|||
- server_name: (required) The name of the MCP server providing the resource
|
||||
- uri: (required) The URI identifying the specific resource to access
|
||||
Usage:
|
||||
<access_mcp_resource>
|
||||
<server_name>server name here</server_name>
|
||||
<uri>resource URI here</uri>
|
||||
</access_mcp_resource>
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="uri">resource URI here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to access an MCP resource
|
||||
|
||||
<access_mcp_resource>
|
||||
<server_name>weather-server</server_name>
|
||||
<uri>weather://san-francisco/current</uri>
|
||||
</access_mcp_resource>
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="uri">weather://san-francisco/current</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -319,23 +364,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -343,18 +392,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -362,16 +415,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -381,16 +438,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -422,27 +483,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -499,9 +564,11 @@ When a server is connected, you can use the server's tools via the `use_mcp_tool
|
|||
## Creating an MCP Server
|
||||
|
||||
The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this:
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -527,7 +594,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
- line_range: (optional) One or more line range elements in format "start-end" (1-based, inclusive)
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
<line_range>start-end</line_range>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
<line_range>1-1000</line_range>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
<line_range>1-50</line_range>
|
||||
|
|
@ -71,17 +77,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
<line_range>10-20</line_range>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -102,9 +111,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -113,18 +124,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -132,37 +147,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -171,18 +196,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -197,9 +225,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -212,23 +241,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -252,20 +285,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -275,23 +312,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -299,18 +340,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -318,16 +363,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -337,16 +386,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -378,27 +431,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -464,7 +521,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -270,23 +307,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -294,18 +335,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -313,16 +358,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -332,16 +381,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -373,27 +426,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -459,7 +516,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## browser_action
|
||||
Description: Request to interact with a Puppeteer-controlled browser. Every action, except `close`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action.
|
||||
|
|
@ -296,24 +333,30 @@ Parameters:
|
|||
- text: (optional) Use this for providing the text for the `type` action.
|
||||
* Example: <text>Hello, world!</text>
|
||||
Usage:
|
||||
<browser_action>
|
||||
<action>Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</action>
|
||||
<url>URL to launch the browser at (optional)</url>
|
||||
<coordinate>x,y coordinates (optional)</coordinate>
|
||||
<text>Text to type (optional)</text>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</parameter>
|
||||
<parameter name="url">URL to launch the browser at (optional)</parameter>
|
||||
<parameter name="coordinate">x,y coordinates (optional)</parameter>
|
||||
<parameter name="text">Text to type (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to launch a browser at https://example.com
|
||||
<browser_action>
|
||||
<action>launch</action>
|
||||
<url>https://example.com</url>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">launch</parameter>
|
||||
<parameter name="url">https://example.com</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to click on the element at coordinates 450,300
|
||||
<browser_action>
|
||||
<action>click</action>
|
||||
<coordinate>450,300</coordinate>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">click</parameter>
|
||||
<parameter name="coordinate">450,300</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -323,23 +366,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -347,18 +394,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -366,16 +417,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -385,16 +440,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -426,27 +485,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -514,7 +577,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -270,23 +307,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -294,18 +335,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -313,16 +358,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -332,16 +381,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -373,27 +426,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -459,7 +516,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## apply_diff
|
||||
Description: Request to apply PRECISE, TARGETED modifications to an existing file by searching for specific sections of content and replacing them. This tool is for SURGICAL EDITS ONLY - specific changes to existing code.
|
||||
|
|
@ -238,14 +263,16 @@ def calculate_sum(items):
|
|||
|
||||
|
||||
Usage:
|
||||
<apply_diff>
|
||||
<path>File path here</path>
|
||||
<diff>
|
||||
<function_calls>
|
||||
<invoke name="apply_diff">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="diff">
|
||||
Your search/replace content here
|
||||
You can use multi search/replace block in one diff block, but make sure to include the line numbers for each block.
|
||||
Only use a single line of '=======' between search and replacement content, because multiple '=======' will corrupt the file.
|
||||
</diff>
|
||||
</apply_diff>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -254,18 +281,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -280,9 +310,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -295,23 +326,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -335,20 +370,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -358,23 +397,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -382,18 +425,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -401,16 +448,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -420,16 +471,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -461,27 +516,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -547,7 +606,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -270,23 +307,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -294,18 +335,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -313,16 +358,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -332,16 +381,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -373,27 +426,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -459,7 +516,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## browser_action
|
||||
Description: Request to interact with a Puppeteer-controlled browser. Every action, except `close`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action.
|
||||
|
|
@ -296,24 +333,30 @@ Parameters:
|
|||
- text: (optional) Use this for providing the text for the `type` action.
|
||||
* Example: <text>Hello, world!</text>
|
||||
Usage:
|
||||
<browser_action>
|
||||
<action>Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</action>
|
||||
<url>URL to launch the browser at (optional)</url>
|
||||
<coordinate>x,y coordinates (optional)</coordinate>
|
||||
<text>Text to type (optional)</text>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</parameter>
|
||||
<parameter name="url">URL to launch the browser at (optional)</parameter>
|
||||
<parameter name="coordinate">x,y coordinates (optional)</parameter>
|
||||
<parameter name="text">Text to type (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to launch a browser at https://example.com
|
||||
<browser_action>
|
||||
<action>launch</action>
|
||||
<url>https://example.com</url>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">launch</parameter>
|
||||
<parameter name="url">https://example.com</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to click on the element at coordinates 450,300
|
||||
<browser_action>
|
||||
<action>click</action>
|
||||
<coordinate>450,300</coordinate>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">click</parameter>
|
||||
<parameter name="coordinate">450,300</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -323,23 +366,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -347,18 +394,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -366,16 +417,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -385,16 +440,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -426,27 +485,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -514,7 +577,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## use_mcp_tool
|
||||
Description: Request to use a tool provided by a connected MCP server. Each MCP server can provide multiple tools with different capabilities. Tools have defined input schemas that specify required and optional parameters.
|
||||
|
|
@ -269,29 +306,33 @@ Parameters:
|
|||
- tool_name: (required) The name of the tool to execute
|
||||
- arguments: (required) A JSON object containing the tool's input parameters, following the tool's input schema
|
||||
Usage:
|
||||
<use_mcp_tool>
|
||||
<server_name>server name here</server_name>
|
||||
<tool_name>tool name here</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="tool_name">tool name here</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"param1": "value1",
|
||||
"param2": "value2"
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to use an MCP tool
|
||||
|
||||
<use_mcp_tool>
|
||||
<server_name>weather-server</server_name>
|
||||
<tool_name>get_forecast</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="tool_name">get_forecast</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"city": "San Francisco",
|
||||
"days": 5
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## access_mcp_resource
|
||||
Description: Request to access a resource provided by a connected MCP server. Resources represent data sources that can be used as context, such as files, API responses, or system information.
|
||||
|
|
@ -299,17 +340,21 @@ Parameters:
|
|||
- server_name: (required) The name of the MCP server providing the resource
|
||||
- uri: (required) The URI identifying the specific resource to access
|
||||
Usage:
|
||||
<access_mcp_resource>
|
||||
<server_name>server name here</server_name>
|
||||
<uri>resource URI here</uri>
|
||||
</access_mcp_resource>
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="uri">resource URI here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to access an MCP resource
|
||||
|
||||
<access_mcp_resource>
|
||||
<server_name>weather-server</server_name>
|
||||
<uri>weather://san-francisco/current</uri>
|
||||
</access_mcp_resource>
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="uri">weather://san-francisco/current</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -319,23 +364,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -343,18 +392,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -362,16 +415,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -381,16 +438,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -422,27 +483,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -499,9 +564,11 @@ When a server is connected, you can use the server's tools via the `use_mcp_tool
|
|||
## Creating an MCP Server
|
||||
|
||||
The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this:
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -527,7 +594,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ You are Roo, an experienced technical leader who is inquisitive and an excellent
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>
|
||||
ALL responses MUST show ANY `language construct` OR filename reference as clickable, exactly as [`filename OR language.declaration()`](relative/file/path.ext:line); line is required for `syntax` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion
|
||||
|
||||
====
|
||||
|
||||
|
|
@ -14,15 +14,16 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -38,30 +39,35 @@ Parameters:
|
|||
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading multiple files (within the 5-file limit):
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
|
||||
|
|
@ -70,17 +76,20 @@ Examples:
|
|||
<path>src/utils.ts</path>
|
||||
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- You MUST read all related files and implementations together in a single operation (up to 5 files at once)
|
||||
|
|
@ -97,9 +106,11 @@ Parameters:
|
|||
|
||||
Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## search_files
|
||||
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
|
||||
|
|
@ -108,18 +119,22 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_files
|
||||
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
|
||||
|
|
@ -127,37 +142,47 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path)
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## list_code_definition_names
|
||||
Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
|
||||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## write_to_file
|
||||
Description: Request to write content to a file. This tool is primarily used for **creating new files** or for scenarios where a **complete rewrite of an existing file is intentionally required**. If the file exists, it will be overwritten. If it doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
|
||||
|
|
@ -166,18 +191,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -192,9 +220,10 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## insert_content
|
||||
Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block.
|
||||
|
|
@ -207,23 +236,27 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## search_and_replace
|
||||
|
|
@ -247,20 +280,24 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldw+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldw+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## ask_followup_question
|
||||
Description: Ask the user a question to gather additional information needed to complete the task. Use when you need clarification or more details to proceed effectively.
|
||||
|
|
@ -270,23 +307,27 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## attempt_completion
|
||||
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
|
||||
|
|
@ -294,18 +335,22 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
|
|
@ -313,16 +358,20 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
## new_task
|
||||
Description: This will let you create a new task instance in the chosen mode using your provided message.
|
||||
|
|
@ -332,16 +381,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
|
||||
## update_todo_list
|
||||
|
|
@ -373,27 +426,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
@ -459,7 +516,7 @@ MODES
|
|||
RULES
|
||||
|
||||
- The project base directory is: /test/path
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot `cd` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with `cd`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run `npm install` in a project outside of '/test/path', you would need to prepend with a `cd` i.e. pseudocode for this would be `cd (path to project) && (command, in this case npm install)`.
|
||||
|
|
|
|||
|
|
@ -202,20 +202,23 @@ const formatImagesIntoBlocks = (images?: string[]): Anthropic.ImageBlockParam[]
|
|||
|
||||
const toolUseInstructionsReminder = `# Reminder: Instructions for Tool Use
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
For example, to use the attempt_completion tool:
|
||||
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I have completed the task...
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.`
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.`
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@ export function markdownFormattingSection(): string {
|
|||
|
||||
MARKDOWN RULES
|
||||
|
||||
ALL responses MUST show ANY \`language construct\` OR filename reference as clickable, exactly as [\`filename OR language.declaration()\`](relative/file/path.ext:line); line is required for \`syntax\` and optional for filename links. This applies to ALL markdown responses and ALSO those in <attempt_completion>`
|
||||
ALL responses MUST show ANY \`language construct\` OR filename reference as clickable, exactly as [\`filename OR language.declaration()\`](relative/file/path.ext:line); line is required for \`syntax\` and optional for filename links. This applies to ALL markdown responses and ALSO those in attempt_completion`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,8 +72,10 @@ ${connectedServers}`
|
|||
## Creating an MCP Server
|
||||
|
||||
The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this:
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>`
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,9 +34,11 @@ ${allModes
|
|||
|
||||
modesContent += `
|
||||
If the user asks you to create or edit a new mode for this project, you should read the instructions by using the fetch_instructions tool, like this:
|
||||
<fetch_instructions>
|
||||
<task>create_mode</task>
|
||||
</fetch_instructions>
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mode</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
`
|
||||
|
||||
return modesContent
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ export function getRulesSection(
|
|||
RULES
|
||||
|
||||
- The project base directory is: ${cwd.toPosix()}
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to <execute_command>.
|
||||
- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to execute_command.
|
||||
- You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '${cwd.toPosix()}', so be sure to pass in the correct 'path' parameter when using tools that require a path.
|
||||
- Do not use the ~ character or $HOME to refer to the home directory.
|
||||
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
|
||||
|
|
|
|||
|
|
@ -7,13 +7,14 @@ You have access to a set of tools that are executed upon the user's approval. Yo
|
|||
|
||||
# Tool Use Formatting
|
||||
|
||||
Tool uses are formatted using XML-style tags. The tool name itself becomes the XML tag name. Each parameter is enclosed within its own set of tags. Here's the structure:
|
||||
Tool uses are formatted using XML-style tags. All tool calls must be wrapped in a <function_calls> element, with each tool invocation using an <invoke> tag that specifies the tool name in a "name" attribute. Parameters are specified using <parameter> tags with a "name" attribute. Here's the structure:
|
||||
|
||||
<actual_tool_name>
|
||||
<parameter1_name>value1</parameter1_name>
|
||||
<parameter2_name>value2</parameter2_name>
|
||||
...
|
||||
</actual_tool_name>
|
||||
<function_calls>
|
||||
<invoke name="actual_tool_name">
|
||||
<parameter name="parameter1_name">value1</parameter>
|
||||
<parameter name="parameter2_name">value2</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Always use the actual tool name as the XML tag name for proper parsing and execution.`
|
||||
Always use the actual tool name in the name attribute of the invoke tag for proper parsing and execution.`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,14 +12,16 @@ describe("getAttemptCompletionDescription", () => {
|
|||
// Check that command parameter is NOT included (permanently disabled)
|
||||
expect(description).not.toContain("- command: (optional)")
|
||||
expect(description).not.toContain("A CLI command to execute to show a live demo")
|
||||
expect(description).not.toContain("<command>Command to demonstrate result (optional)</command>")
|
||||
expect(description).not.toContain("<command>open index.html</command>")
|
||||
expect(description).not.toContain(
|
||||
'<parameter name="command">Command to demonstrate result (optional)</parameter>',
|
||||
)
|
||||
expect(description).not.toContain('<parameter name="command">open index.html</parameter>')
|
||||
|
||||
// But should still have the basic structure
|
||||
expect(description).toContain("## attempt_completion")
|
||||
expect(description).toContain("- result: (required)")
|
||||
expect(description).toContain("<attempt_completion>")
|
||||
expect(description).toContain("</attempt_completion>")
|
||||
expect(description).toContain('<invoke name="attempt_completion">')
|
||||
expect(description).toContain("</invoke>")
|
||||
})
|
||||
|
||||
it("should work when no args provided", () => {
|
||||
|
|
@ -28,14 +30,16 @@ describe("getAttemptCompletionDescription", () => {
|
|||
// Check that command parameter is NOT included (permanently disabled)
|
||||
expect(description).not.toContain("- command: (optional)")
|
||||
expect(description).not.toContain("A CLI command to execute to show a live demo")
|
||||
expect(description).not.toContain("<command>Command to demonstrate result (optional)</command>")
|
||||
expect(description).not.toContain("<command>open index.html</command>")
|
||||
expect(description).not.toContain(
|
||||
'<parameter name="command">Command to demonstrate result (optional)</parameter>',
|
||||
)
|
||||
expect(description).not.toContain('<parameter name="command">open index.html</parameter>')
|
||||
|
||||
// But should still have the basic structure
|
||||
expect(description).toContain("## attempt_completion")
|
||||
expect(description).toContain("- result: (required)")
|
||||
expect(description).toContain("<attempt_completion>")
|
||||
expect(description).toContain("</attempt_completion>")
|
||||
expect(description).toContain('<invoke name="attempt_completion">')
|
||||
expect(description).toContain("</invoke>")
|
||||
})
|
||||
|
||||
it("should show example without command", () => {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ describe("getFetchInstructionsDescription", () => {
|
|||
expect(description).toContain("create_mcp_server")
|
||||
expect(description).toContain("create_mode")
|
||||
expect(description).toContain("Example: Requesting instructions to create an MCP Server")
|
||||
expect(description).toContain("<task>create_mcp_server</task>")
|
||||
expect(description).toContain('<parameter name="task">create_mcp_server</parameter>')
|
||||
})
|
||||
|
||||
it("should include create_mcp_server when enableMcpServerCreation is undefined (default behavior)", () => {
|
||||
|
|
@ -16,7 +16,7 @@ describe("getFetchInstructionsDescription", () => {
|
|||
expect(description).toContain("create_mcp_server")
|
||||
expect(description).toContain("create_mode")
|
||||
expect(description).toContain("Example: Requesting instructions to create an MCP Server")
|
||||
expect(description).toContain("<task>create_mcp_server</task>")
|
||||
expect(description).toContain('<parameter name="task">create_mcp_server</parameter>')
|
||||
})
|
||||
|
||||
it("should exclude create_mcp_server when enableMcpServerCreation is false", () => {
|
||||
|
|
@ -25,7 +25,7 @@ describe("getFetchInstructionsDescription", () => {
|
|||
expect(description).not.toContain("create_mcp_server")
|
||||
expect(description).toContain("create_mode")
|
||||
expect(description).toContain("Example: Requesting instructions to create a Mode")
|
||||
expect(description).toContain("<task>create_mode</task>")
|
||||
expect(description).toContain('<parameter name="task">create_mode</parameter>')
|
||||
expect(description).not.toContain("Example: Requesting instructions to create an MCP Server")
|
||||
})
|
||||
|
||||
|
|
@ -36,8 +36,8 @@ describe("getFetchInstructionsDescription", () => {
|
|||
expect(description).toContain("Description: Request to fetch instructions to perform a task")
|
||||
expect(description).toContain("Parameters:")
|
||||
expect(description).toContain("- task: (required) The task to get instructions for.")
|
||||
expect(description).toContain("<fetch_instructions>")
|
||||
expect(description).toContain("</fetch_instructions>")
|
||||
expect(description).toContain('<invoke name="fetch_instructions">')
|
||||
expect(description).toContain("</invoke>")
|
||||
})
|
||||
|
||||
it("should handle null value consistently (treat as default/undefined)", () => {
|
||||
|
|
@ -47,6 +47,6 @@ describe("getFetchInstructionsDescription", () => {
|
|||
expect(description).toContain("create_mcp_server")
|
||||
expect(description).toContain("create_mode")
|
||||
expect(description).toContain("Example: Requesting instructions to create an MCP Server")
|
||||
expect(description).toContain("<task>create_mcp_server</task>")
|
||||
expect(description).toContain('<parameter name="task">create_mcp_server</parameter>')
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ describe("getNewTaskDescription", () => {
|
|||
// Should have a simple example without todos
|
||||
expect(description).toContain("Implement a new feature for the application")
|
||||
|
||||
// Should NOT have any todos tags in examples
|
||||
expect(description).not.toContain("<todos>")
|
||||
expect(description).not.toContain("</todos>")
|
||||
// Should NOT have any todos parameter in examples
|
||||
expect(description).not.toContain('<parameter name="todos">')
|
||||
expect(description).not.toContain("[ ] First task to complete")
|
||||
|
||||
// Should still have mode and message as required
|
||||
expect(description).toContain("mode: (required)")
|
||||
|
|
@ -51,8 +51,8 @@ describe("getNewTaskDescription", () => {
|
|||
expect(description).not.toContain("optional initial todo list")
|
||||
|
||||
// Should include todos in the example
|
||||
expect(description).toContain("<todos>")
|
||||
expect(description).toContain("</todos>")
|
||||
expect(description).toContain('<parameter name="todos">')
|
||||
expect(description).toContain("</parameter>")
|
||||
expect(description).toContain("Set up auth middleware")
|
||||
})
|
||||
|
||||
|
|
@ -68,8 +68,8 @@ describe("getNewTaskDescription", () => {
|
|||
// Check that todos parameter is NOT shown by default
|
||||
expect(description).not.toContain("todos:")
|
||||
expect(description).not.toContain("The initial todo list in markdown checklist format")
|
||||
expect(description).not.toContain("<todos>")
|
||||
expect(description).not.toContain("</todos>")
|
||||
expect(description).not.toContain('<parameter name="todos">')
|
||||
expect(description).not.toContain("[ ] First task to complete")
|
||||
})
|
||||
|
||||
it("should NOT show todos parameter when newTaskRequireTodos is undefined", () => {
|
||||
|
|
@ -84,8 +84,8 @@ describe("getNewTaskDescription", () => {
|
|||
// Check that todos parameter is NOT shown by default
|
||||
expect(description).not.toContain("todos:")
|
||||
expect(description).not.toContain("The initial todo list in markdown checklist format")
|
||||
expect(description).not.toContain("<todos>")
|
||||
expect(description).not.toContain("</todos>")
|
||||
expect(description).not.toContain('<parameter name="todos">')
|
||||
expect(description).not.toContain("[ ] First task to complete")
|
||||
})
|
||||
|
||||
it("should include todos in examples only when setting is enabled", () => {
|
||||
|
|
@ -111,17 +111,17 @@ describe("getNewTaskDescription", () => {
|
|||
// When setting is on, should include todos in main example
|
||||
expect(descriptionOn).toContain("Implement user authentication")
|
||||
expect(descriptionOn).toContain("[ ] Set up auth middleware")
|
||||
expect(descriptionOn).toContain("<todos>")
|
||||
expect(descriptionOn).toContain("</todos>")
|
||||
expect(descriptionOn).toContain('<parameter name="todos">')
|
||||
expect(descriptionOn).toContain("</parameter>")
|
||||
|
||||
// When setting is off, should NOT include any todos references
|
||||
expect(descriptionOff).not.toContain("<todos>")
|
||||
expect(descriptionOff).not.toContain("</todos>")
|
||||
expect(descriptionOff).not.toContain('<parameter name="todos">')
|
||||
expect(descriptionOff).not.toContain("[ ] Set up auth middleware")
|
||||
expect(descriptionOff).not.toContain("[ ] First task to complete")
|
||||
|
||||
// When setting is off, main example should be simple
|
||||
const usagePattern = /<new_task>\s*<mode>.*<\/mode>\s*<message>.*<\/message>\s*<\/new_task>/s
|
||||
const usagePattern =
|
||||
/<invoke name="new_task">\s*<parameter name="mode">.*<\/parameter>\s*<parameter name="message">.*<\/parameter>\s*<\/invoke>/s
|
||||
expect(descriptionOff).toMatch(usagePattern)
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -10,15 +10,19 @@ Parameters:
|
|||
- server_name: (required) The name of the MCP server providing the resource
|
||||
- uri: (required) The URI identifying the specific resource to access
|
||||
Usage:
|
||||
<access_mcp_resource>
|
||||
<server_name>server name here</server_name>
|
||||
<uri>resource URI here</uri>
|
||||
</access_mcp_resource>
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="uri">resource URI here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to access an MCP resource
|
||||
|
||||
<access_mcp_resource>
|
||||
<server_name>weather-server</server_name>
|
||||
<uri>weather://san-francisco/current</uri>
|
||||
</access_mcp_resource>`
|
||||
<function_calls>
|
||||
<invoke name="access_mcp_resource">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="uri">weather://san-francisco/current</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,21 +7,25 @@ Parameters:
|
|||
- follow_up: (required) A list of 2-4 suggested answers, each in its own <suggest> tag. Suggestions must be complete, actionable answers without placeholders. Optionally include mode attribute to switch modes (code/architect/etc.)
|
||||
|
||||
Usage:
|
||||
<ask_followup_question>
|
||||
<question>Your question here</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">Your question here</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>First suggestion</suggest>
|
||||
<suggest mode="code">Action with mode switch</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<ask_followup_question>
|
||||
<question>What is the path to the frontend-config.json file?</question>
|
||||
<follow_up>
|
||||
<function_calls>
|
||||
<invoke name="ask_followup_question">
|
||||
<parameter name="question">What is the path to the frontend-config.json file?</parameter>
|
||||
<parameter name="follow_up">
|
||||
<suggest>./src/frontend-config.json</suggest>
|
||||
<suggest>./config/frontend-config.json</suggest>
|
||||
<suggest>./frontend-config.json</suggest>
|
||||
</follow_up>
|
||||
</ask_followup_question>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,16 +7,20 @@ IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user th
|
|||
Parameters:
|
||||
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
|
||||
Usage:
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
Your final result description here
|
||||
</result>
|
||||
</attempt_completion>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to attempt completion with a result
|
||||
<attempt_completion>
|
||||
<result>
|
||||
<function_calls>
|
||||
<invoke name="attempt_completion">
|
||||
<parameter name="result">
|
||||
I've updated the CSS
|
||||
</result>
|
||||
</attempt_completion>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,22 +38,28 @@ Parameters:
|
|||
- text: (optional) Use this for providing the text for the \`type\` action.
|
||||
* Example: <text>Hello, world!</text>
|
||||
Usage:
|
||||
<browser_action>
|
||||
<action>Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</action>
|
||||
<url>URL to launch the browser at (optional)</url>
|
||||
<coordinate>x,y coordinates (optional)</coordinate>
|
||||
<text>Text to type (optional)</text>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">Action to perform (e.g., launch, click, type, scroll_down, scroll_up, close)</parameter>
|
||||
<parameter name="url">URL to launch the browser at (optional)</parameter>
|
||||
<parameter name="coordinate">x,y coordinates (optional)</parameter>
|
||||
<parameter name="text">Text to type (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to launch a browser at https://example.com
|
||||
<browser_action>
|
||||
<action>launch</action>
|
||||
<url>https://example.com</url>
|
||||
</browser_action>
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">launch</parameter>
|
||||
<parameter name="url">https://example.com</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to click on the element at coordinates 450,300
|
||||
<browser_action>
|
||||
<action>click</action>
|
||||
<coordinate>450,300</coordinate>
|
||||
</browser_action>`
|
||||
<function_calls>
|
||||
<invoke name="browser_action">
|
||||
<parameter name="action">click</parameter>
|
||||
<parameter name="coordinate">450,300</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,15 +9,19 @@ Parameters:
|
|||
- path: (optional) Limit search to specific subdirectory (relative to the current workspace directory ${args.cwd}). Leave empty for entire workspace.
|
||||
|
||||
Usage:
|
||||
<codebase_search>
|
||||
<query>Your natural language query here</query>
|
||||
<path>Optional subdirectory path</path>
|
||||
</codebase_search>
|
||||
<function_calls>
|
||||
<invoke name="codebase_search">
|
||||
<parameter name="query">Your natural language query here</parameter>
|
||||
<parameter name="path">Optional subdirectory path</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<codebase_search>
|
||||
<query>User login and password hashing</query>
|
||||
<path>src/auth</path>
|
||||
</codebase_search>
|
||||
<function_calls>
|
||||
<invoke name="codebase_search">
|
||||
<parameter name="query">User login and password hashing</parameter>
|
||||
<parameter name="path">src/auth</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,19 +7,25 @@ Parameters:
|
|||
- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.
|
||||
- cwd: (optional) The working directory to execute the command in (default: ${args.cwd})
|
||||
Usage:
|
||||
<execute_command>
|
||||
<command>Your command here</command>
|
||||
<cwd>Working directory path (optional)</cwd>
|
||||
</execute_command>
|
||||
<function_calls>
|
||||
<invoke name="execute_command">
|
||||
<parameter name="command">Your command here</parameter>
|
||||
<parameter name="cwd">Working directory path (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to execute npm run dev
|
||||
<execute_command>
|
||||
<command>npm run dev</command>
|
||||
</execute_command>
|
||||
<function_calls>
|
||||
<invoke name="execute_command">
|
||||
<parameter name="command">npm run dev</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to execute ls in a specific directory if directed
|
||||
<execute_command>
|
||||
<command>ls -la</command>
|
||||
<cwd>/home/user/projects</cwd>
|
||||
</execute_command>`
|
||||
<function_calls>
|
||||
<invoke name="execute_command">
|
||||
<parameter name="command">ls -la</parameter>
|
||||
<parameter name="cwd">/home/user/projects</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,14 +14,18 @@ export function getFetchInstructionsDescription(enableMcpServerCreation?: boolea
|
|||
enableMcpServerCreation !== false
|
||||
? `Example: Requesting instructions to create an MCP Server
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mcp_server</task>
|
||||
</fetch_instructions>`
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mcp_server</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
: `Example: Requesting instructions to create a Mode
|
||||
|
||||
<fetch_instructions>
|
||||
<task>create_mode</task>
|
||||
</fetch_instructions>`
|
||||
<function_calls>
|
||||
<invoke name="fetch_instructions">
|
||||
<parameter name="task">create_mode</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
|
||||
return `## fetch_instructions
|
||||
Description: Request to fetch instructions to perform a task
|
||||
|
|
|
|||
|
|
@ -8,29 +8,37 @@ Parameters:
|
|||
- path: (required) The file path where the generated/edited image should be saved (relative to the current workspace directory ${args.cwd}). The tool will automatically add the appropriate image extension if not provided.
|
||||
- image: (optional) The file path to an input image to edit or transform (relative to the current workspace directory ${args.cwd}). Supported formats: PNG, JPG, JPEG, GIF, WEBP.
|
||||
Usage:
|
||||
<generate_image>
|
||||
<prompt>Your image description here</prompt>
|
||||
<path>path/to/save/image.png</path>
|
||||
<image>path/to/input/image.jpg</image>
|
||||
</generate_image>
|
||||
<function_calls>
|
||||
<invoke name="generate_image">
|
||||
<parameter name="prompt">Your image description here</parameter>
|
||||
<parameter name="path">path/to/save/image.png</parameter>
|
||||
<parameter name="image">path/to/input/image.jpg</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to generate a sunset image
|
||||
<generate_image>
|
||||
<prompt>A beautiful sunset over mountains with vibrant orange and purple colors</prompt>
|
||||
<path>images/sunset.png</path>
|
||||
</generate_image>
|
||||
<function_calls>
|
||||
<invoke name="generate_image">
|
||||
<parameter name="prompt">A beautiful sunset over mountains with vibrant orange and purple colors</parameter>
|
||||
<parameter name="path">images/sunset.png</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Editing an existing image
|
||||
<generate_image>
|
||||
<prompt>Transform this image into a watercolor painting style</prompt>
|
||||
<path>images/watercolor-output.png</path>
|
||||
<image>images/original-photo.jpg</image>
|
||||
</generate_image>
|
||||
<function_calls>
|
||||
<invoke name="generate_image">
|
||||
<parameter name="prompt">Transform this image into a watercolor painting style</parameter>
|
||||
<parameter name="path">images/watercolor-output.png</parameter>
|
||||
<parameter name="image">images/original-photo.jpg</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Upscaling and enhancing an image
|
||||
<generate_image>
|
||||
<prompt>Upscale this image to higher resolution, enhance details, improve clarity and sharpness while maintaining the original content and composition</prompt>
|
||||
<path>images/enhanced-photo.png</path>
|
||||
<image>images/low-res-photo.jpg</image>
|
||||
</generate_image>`
|
||||
<function_calls>
|
||||
<invoke name="generate_image">
|
||||
<parameter name="prompt">Upscale this image to higher resolution, enhance details, improve clarity and sharpness while maintaining the original content and composition</parameter>
|
||||
<parameter name="path">images/enhanced-photo.png</parameter>
|
||||
<parameter name="image">images/low-res-photo.jpg</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,22 +12,26 @@ Parameters:
|
|||
- content: (required) The content to insert at the specified line
|
||||
|
||||
Example for inserting imports at start of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>1</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">1</parameter>
|
||||
<parameter name="content">
|
||||
// Add imports at start of file
|
||||
import { sum } from './math';
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example for appending to the end of file:
|
||||
<insert_content>
|
||||
<path>src/utils.ts</path>
|
||||
<line>0</line>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="insert_content">
|
||||
<parameter name="path">src/utils.ts</parameter>
|
||||
<parameter name="line">0</parameter>
|
||||
<parameter name="content">
|
||||
// This is the end of the file
|
||||
</content>
|
||||
</insert_content>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,19 +6,25 @@ Description: Request to list definition names (classes, functions, methods, etc.
|
|||
Parameters:
|
||||
- path: (required) The path of the file or directory (relative to the current working directory ${args.cwd}) to analyze. When given a directory, it lists definitions from all top-level source files.
|
||||
Usage:
|
||||
<list_code_definition_names>
|
||||
<path>Directory path here</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. List definitions from a specific file:
|
||||
<list_code_definition_names>
|
||||
<path>src/main.ts</path>
|
||||
</list_code_definition_names>
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/main.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. List definitions from all files in a directory:
|
||||
<list_code_definition_names>
|
||||
<path>src/</path>
|
||||
</list_code_definition_names>`
|
||||
<function_calls>
|
||||
<invoke name="list_code_definition_names">
|
||||
<parameter name="path">src/</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,14 +7,18 @@ Parameters:
|
|||
- path: (required) The path of the directory to list contents for (relative to the current workspace directory ${args.cwd})
|
||||
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.
|
||||
Usage:
|
||||
<list_files>
|
||||
<path>Directory path here</path>
|
||||
<recursive>true or false (optional)</recursive>
|
||||
</list_files>
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="recursive">true or false (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to list all files in the current directory
|
||||
<list_files>
|
||||
<path>.</path>
|
||||
<recursive>false</recursive>
|
||||
</list_files>`
|
||||
<function_calls>
|
||||
<invoke name="list_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="recursive">false</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,16 +11,20 @@ Parameters:
|
|||
- message: (required) The initial user message or instructions for this new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement a new feature for the application</message>
|
||||
</new_task>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement a new feature for the application</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
`
|
||||
|
||||
/**
|
||||
|
|
@ -35,27 +39,31 @@ Parameters:
|
|||
- todos: (required) The initial todo list in markdown checklist format for the new task.
|
||||
|
||||
Usage:
|
||||
<new_task>
|
||||
<mode>your-mode-slug-here</mode>
|
||||
<message>Your initial instructions here</message>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">your-mode-slug-here</parameter>
|
||||
<parameter name="message">Your initial instructions here</parameter>
|
||||
<parameter name="todos">
|
||||
[ ] First task to complete
|
||||
[ ] Second task to complete
|
||||
[ ] Third task to complete
|
||||
</todos>
|
||||
</new_task>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example:
|
||||
<new_task>
|
||||
<mode>code</mode>
|
||||
<message>Implement user authentication</message>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="new_task">
|
||||
<parameter name="mode">code</parameter>
|
||||
<parameter name="message">Implement user authentication</parameter>
|
||||
<parameter name="todos">
|
||||
[ ] Set up auth middleware
|
||||
[ ] Create login endpoint
|
||||
[ ] Add session management
|
||||
[ ] Write tests
|
||||
</todos>
|
||||
</new_task>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
`
|
||||
|
||||
|
|
|
|||
|
|
@ -16,32 +16,37 @@ Parameters:
|
|||
${args.partialReadsEnabled ? `- line_range: (optional) One or more line range elements in format "start-end" (1-based, inclusive)` : ""}
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>path/to/file</path>
|
||||
${args.partialReadsEnabled ? `<line_range>start-end</line_range>` : ""}
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a single file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
${args.partialReadsEnabled ? `<line_range>1-1000</line_range>` : ""}
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
${isMultipleReadsEnabled ? `2. Reading multiple files (within the ${maxConcurrentReads}-file limit):` : ""}${
|
||||
isMultipleReadsEnabled
|
||||
? `
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>src/app.ts</path>
|
||||
${
|
||||
|
|
@ -55,19 +60,22 @@ ${isMultipleReadsEnabled ? `2. Reading multiple files (within the ${maxConcurren
|
|||
<path>src/utils.ts</path>
|
||||
${args.partialReadsEnabled ? `<line_range>10-20</line_range>` : ""}
|
||||
</file>
|
||||
</args>
|
||||
</read_file>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
: ""
|
||||
}
|
||||
|
||||
${isMultipleReadsEnabled ? "3. " : "2. "}Reading an entire file:
|
||||
<read_file>
|
||||
<args>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="args">
|
||||
<file>
|
||||
<path>config.json</path>
|
||||
</file>
|
||||
</args>
|
||||
</read_file>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
IMPORTANT: You MUST use this Efficient Reading Strategy:
|
||||
- ${isMultipleReadsEnabled ? `You MUST read all related files and implementations together in a single operation (up to ${maxConcurrentReads} files at once)` : "You MUST read files one at a time, as multiple file reads are currently disabled"}
|
||||
|
|
|
|||
|
|
@ -10,23 +10,29 @@ Parameters:
|
|||
- args: (optional) Additional arguments or context to pass to the command
|
||||
|
||||
Usage:
|
||||
<run_slash_command>
|
||||
<command>command_name</command>
|
||||
<args>optional arguments</args>
|
||||
</run_slash_command>
|
||||
<function_calls>
|
||||
<invoke name="run_slash_command">
|
||||
<parameter name="command">command_name</parameter>
|
||||
<parameter name="args">optional arguments</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Running the init command to analyze a codebase:
|
||||
<run_slash_command>
|
||||
<command>init</command>
|
||||
</run_slash_command>
|
||||
<function_calls>
|
||||
<invoke name="run_slash_command">
|
||||
<parameter name="command">init</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Running a command with additional context:
|
||||
<run_slash_command>
|
||||
<command>test</command>
|
||||
<args>focus on integration tests</args>
|
||||
</run_slash_command>
|
||||
<function_calls>
|
||||
<invoke name="run_slash_command">
|
||||
<parameter name="command">test</parameter>
|
||||
<parameter name="args">focus on integration tests</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
The command content will be returned for you to execute or follow as instructions.`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,18 +22,22 @@ Notes:
|
|||
Examples:
|
||||
|
||||
1. Simple text replacement:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>oldText</search>
|
||||
<replace>newText</replace>
|
||||
</search_and_replace>
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">oldText</parameter>
|
||||
<parameter name="replace">newText</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Case-insensitive regex pattern:
|
||||
<search_and_replace>
|
||||
<path>example.ts</path>
|
||||
<search>old\w+</search>
|
||||
<replace>new$&</replace>
|
||||
<use_regex>true</use_regex>
|
||||
<ignore_case>true</ignore_case>
|
||||
</search_and_replace>`
|
||||
<function_calls>
|
||||
<invoke name="search_and_replace">
|
||||
<parameter name="path">example.ts</parameter>
|
||||
<parameter name="search">old\w+</parameter>
|
||||
<parameter name="replace">new$&</parameter>
|
||||
<parameter name="use_regex">true</parameter>
|
||||
<parameter name="ignore_case">true</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,16 +8,20 @@ Parameters:
|
|||
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
|
||||
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).
|
||||
Usage:
|
||||
<search_files>
|
||||
<path>Directory path here</path>
|
||||
<regex>Your regex pattern here</regex>
|
||||
<file_pattern>file pattern here (optional)</file_pattern>
|
||||
</search_files>
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">Directory path here</parameter>
|
||||
<parameter name="regex">Your regex pattern here</parameter>
|
||||
<parameter name="file_pattern">file pattern here (optional)</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to search for all .ts files in the current directory
|
||||
<search_files>
|
||||
<path>.</path>
|
||||
<regex>.*</regex>
|
||||
<file_pattern>*.ts</file_pattern>
|
||||
</search_files>`
|
||||
<function_calls>
|
||||
<invoke name="search_files">
|
||||
<parameter name="path">.</parameter>
|
||||
<parameter name="regex">.*</parameter>
|
||||
<parameter name="file_pattern">*.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import { ToolArgs } from "./types"
|
|||
|
||||
/**
|
||||
* Generate a simplified read_file tool description for models that only support single file reads
|
||||
* Uses the simpler format: <read_file><path>file/path.ext</path></read_file>
|
||||
* Uses the simpler format: <function_calls><invoke name="read_file"><parameter name="path">file/path.ext</parameter></invoke></function_calls>
|
||||
*/
|
||||
export function getSimpleReadFileDescription(args: ToolArgs): string {
|
||||
return `## read_file
|
||||
|
|
@ -12,24 +12,32 @@ Parameters:
|
|||
- path: (required) File path (relative to workspace directory ${args.cwd})
|
||||
|
||||
Usage:
|
||||
<read_file>
|
||||
<path>path/to/file</path>
|
||||
</read_file>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="path">path/to/file</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Examples:
|
||||
|
||||
1. Reading a TypeScript file:
|
||||
<read_file>
|
||||
<path>src/app.ts</path>
|
||||
</read_file>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="path">src/app.ts</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
2. Reading a configuration file:
|
||||
<read_file>
|
||||
<path>config.json</path>
|
||||
</read_file>
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="path">config.json</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
3. Reading a markdown file:
|
||||
<read_file>
|
||||
<path>README.md</path>
|
||||
</read_file>`
|
||||
<function_calls>
|
||||
<invoke name="read_file">
|
||||
<parameter name="path">README.md</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,14 +5,18 @@ Parameters:
|
|||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">Mode slug here</parameter>
|
||||
<parameter name="reason">Reason for switching here</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>`
|
||||
<function_calls>
|
||||
<invoke name="switch_mode">
|
||||
<parameter name="mode_slug">code</parameter>
|
||||
<parameter name="reason">Need to make code changes</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,27 +33,31 @@ Replace the entire TODO list with an updated checklist reflecting the current st
|
|||
- Remove tasks only if they are no longer relevant or if the user requests deletion.
|
||||
|
||||
**Usage Example:**
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[-] Implement core logic
|
||||
[ ] Write tests
|
||||
[ ] Update documentation
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
*After completing "Implement core logic" and starting "Write tests":*
|
||||
<update_todo_list>
|
||||
<todos>
|
||||
<function_calls>
|
||||
<invoke name="update_todo_list">
|
||||
<parameter name="todos">
|
||||
[x] Analyze requirements
|
||||
[x] Design architecture
|
||||
[x] Implement core logic
|
||||
[-] Write tests
|
||||
[ ] Update documentation
|
||||
[ ] Add performance benchmarks
|
||||
</todos>
|
||||
</update_todo_list>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
**When to Use:**
|
||||
- The task is complicated or involves multiple steps or requires ongoing tracking.
|
||||
|
|
|
|||
|
|
@ -11,27 +11,31 @@ Parameters:
|
|||
- tool_name: (required) The name of the tool to execute
|
||||
- arguments: (required) A JSON object containing the tool's input parameters, following the tool's input schema
|
||||
Usage:
|
||||
<use_mcp_tool>
|
||||
<server_name>server name here</server_name>
|
||||
<tool_name>tool name here</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">server name here</parameter>
|
||||
<parameter name="tool_name">tool name here</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"param1": "value1",
|
||||
"param2": "value2"
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to use an MCP tool
|
||||
|
||||
<use_mcp_tool>
|
||||
<server_name>weather-server</server_name>
|
||||
<tool_name>get_forecast</tool_name>
|
||||
<arguments>
|
||||
<function_calls>
|
||||
<invoke name="use_mcp_tool">
|
||||
<parameter name="server_name">weather-server</parameter>
|
||||
<parameter name="tool_name">get_forecast</parameter>
|
||||
<parameter name="arguments">
|
||||
{
|
||||
"city": "San Francisco",
|
||||
"days": 5
|
||||
}
|
||||
</arguments>
|
||||
</use_mcp_tool>`
|
||||
</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,18 +8,21 @@ Parameters:
|
|||
- content: (required) The content to write to the file. When performing a full rewrite of an existing file or creating a new one, ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file.
|
||||
- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing.
|
||||
Usage:
|
||||
<write_to_file>
|
||||
<path>File path here</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">File path here</parameter>
|
||||
<parameter name="content">
|
||||
Your file content here
|
||||
</content>
|
||||
<line_count>total number of lines in the file, including empty lines</line_count>
|
||||
</write_to_file>
|
||||
</parameter>
|
||||
<parameter name="line_count">total number of lines in the file, including empty lines</parameter>
|
||||
</invoke>
|
||||
</function_calls>
|
||||
|
||||
Example: Requesting to write to frontend-config.json
|
||||
<write_to_file>
|
||||
<path>frontend-config.json</path>
|
||||
<content>
|
||||
<function_calls>
|
||||
<invoke name="write_to_file">
|
||||
<parameter name="path">frontend-config.json</parameter>
|
||||
<parameter name="content">
|
||||
{
|
||||
"apiEndpoint": "https://api.example.com",
|
||||
"theme": {
|
||||
|
|
@ -34,7 +37,8 @@ Example: Requesting to write to frontend-config.json
|
|||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
</content>
|
||||
<line_count>14</line_count>
|
||||
</write_to_file>`
|
||||
</parameter>
|
||||
<parameter name="line_count">14</parameter>
|
||||
</invoke>
|
||||
</function_calls>`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ export async function applyDiffToolLegacy(
|
|||
let partFailHint = ""
|
||||
|
||||
if (diffResult.failParts && diffResult.failParts.length > 0) {
|
||||
partFailHint = `But unable to apply all diff parts to file: ${absolutePath}, silently use <read_file> tool to check newest file version and re-apply diffs\n`
|
||||
partFailHint = `But unable to apply all diff parts to file: ${absolutePath}, silently use read_file tool to check newest file version and re-apply diffs\n`
|
||||
}
|
||||
|
||||
// Get the formatted response message
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import {
|
|||
|
||||
/**
|
||||
* Simplified read file tool for models that only support single file reads
|
||||
* Uses the format: <read_file><path>file/path.ext</path></read_file>
|
||||
* Uses the format: <function_calls><invoke name="read_file"><parameter name="path">file/path.ext</parameter></invoke></function_calls>
|
||||
*
|
||||
* This is a streamlined version of readFileTool that:
|
||||
* - Only accepts a single path parameter
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue