change roo boomerang to orchestrator; update tests that don't use modes
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"customModes": [
|
"customModes": [
|
||||||
{
|
{
|
||||||
"slug": "boomerang",
|
"slug": "orchestrator",
|
||||||
"name": "Boomerang",
|
"name": "Orchestrator",
|
||||||
"roleDefinition": "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, also your own, and with the information given by the user and other modes in shared context you are enabled to effectively break down complex problems into discrete tasks that can be solved by different specialists using the `taskmaster-ai` system for task and context management.",
|
"roleDefinition": "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, also your own, and with the information given by the user and other modes in shared context you are enabled to effectively break down complex problems into discrete tasks that can be solved by different specialists using the `taskmaster-ai` system for task and context management.",
|
||||||
"customInstructions": "Your role is to coordinate complex workflows by delegating tasks to specialized modes, using `taskmaster-ai` as the central hub for task definition, progress tracking, and context management. \nAs an orchestrator, you should:\nn1. When given a complex task, use contextual information (which gets updated frequently) to break it down into logical subtasks that can be delegated to appropriate specialized modes.\nn2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. \nThese instructions must include:\n* All necessary context from the parent task or previous subtasks required to complete the work.\n* A clearly defined scope, specifying exactly what the subtask should accomplish.\n* An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n* An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to further relay this information to other tasks and for you to keep track of what was completed on this project.\nn3. Track and manage the progress of all subtasks. When a subtask is completed, acknowledge its results and determine the next steps.\nn4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\nn5. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively. If it seems complex delegate to architect to accomplish that \nn6. Use subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.",
|
"customInstructions": "Your role is to coordinate complex workflows by delegating tasks to specialized modes, using `taskmaster-ai` as the central hub for task definition, progress tracking, and context management. \nAs an orchestrator, you should:\nn1. When given a complex task, use contextual information (which gets updated frequently) to break it down into logical subtasks that can be delegated to appropriate specialized modes.\nn2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. \nThese instructions must include:\n* All necessary context from the parent task or previous subtasks required to complete the work.\n* A clearly defined scope, specifying exactly what the subtask should accomplish.\n* An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n* An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to further relay this information to other tasks and for you to keep track of what was completed on this project.\nn3. Track and manage the progress of all subtasks. When a subtask is completed, acknowledge its results and determine the next steps.\nn4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\nn5. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively. If it seems complex delegate to architect to accomplish that \nn6. Use subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.",
|
||||||
"groups": [
|
"groups": [
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ To manually verify that the Roo files are properly included in the package:
|
|||||||
ls -la .roo/rules
|
ls -la .roo/rules
|
||||||
ls -la .roo/rules-architect
|
ls -la .roo/rules-architect
|
||||||
ls -la .roo/rules-ask
|
ls -la .roo/rules-ask
|
||||||
ls -la .roo/rules-boomerang
|
ls -la .roo/rules-orchestrator
|
||||||
ls -la .roo/rules-code
|
ls -la .roo/rules-code
|
||||||
ls -la .roo/rules-debug
|
ls -la .roo/rules-debug
|
||||||
ls -la .roo/rules-test
|
ls -la .roo/rules-test
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export const RULE_PROFILES = [
|
|||||||
export const ROO_MODES = [
|
export const ROO_MODES = [
|
||||||
'architect',
|
'architect',
|
||||||
'ask',
|
'ask',
|
||||||
'boomerang',
|
'orchestrator',
|
||||||
'code',
|
'code',
|
||||||
'debug',
|
'debug',
|
||||||
'test'
|
'test'
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ describe('Roo Files Inclusion in Package', () => {
|
|||||||
const expectedModes = [
|
const expectedModes = [
|
||||||
'architect',
|
'architect',
|
||||||
'ask',
|
'ask',
|
||||||
'boomerang',
|
'orchestrator',
|
||||||
'code',
|
'code',
|
||||||
'debug',
|
'debug',
|
||||||
'test'
|
'test'
|
||||||
|
|||||||
@@ -29,11 +29,8 @@ describe('Cursor Integration', () => {
|
|||||||
// Spy on fs methods
|
// Spy on fs methods
|
||||||
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {});
|
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {});
|
||||||
jest.spyOn(fs, 'readFileSync').mockImplementation((filePath) => {
|
jest.spyOn(fs, 'readFileSync').mockImplementation((filePath) => {
|
||||||
if (filePath.toString().includes('.cursormodes')) {
|
if (filePath.toString().includes('mcp.json')) {
|
||||||
return 'Existing cursormodes content';
|
return JSON.stringify({ mcpServers: {} }, null, 2);
|
||||||
}
|
|
||||||
if (filePath.toString().includes('-rules')) {
|
|
||||||
return 'Existing mode rules content';
|
|
||||||
}
|
}
|
||||||
return '{}';
|
return '{}';
|
||||||
});
|
});
|
||||||
@@ -58,29 +55,10 @@ describe('Cursor Integration', () => {
|
|||||||
// Create rules directory
|
// Create rules directory
|
||||||
fs.mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
|
fs.mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
|
||||||
|
|
||||||
// Create mode-specific rule directories
|
// Create MCP config file
|
||||||
const cursorModes = [
|
|
||||||
'architect',
|
|
||||||
'ask',
|
|
||||||
'boomerang',
|
|
||||||
'code',
|
|
||||||
'debug',
|
|
||||||
'test'
|
|
||||||
];
|
|
||||||
for (const mode of cursorModes) {
|
|
||||||
fs.mkdirSync(path.join(tempDir, '.cursor', `rules-${mode}`), {
|
|
||||||
recursive: true
|
|
||||||
});
|
|
||||||
fs.writeFileSync(
|
|
||||||
path.join(tempDir, '.cursor', `rules-${mode}`, `${mode}-rules`),
|
|
||||||
`Content for ${mode} rules`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy .cursormodes file
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.join(tempDir, '.cursormodes'),
|
path.join(tempDir, '.cursor', 'mcp.json'),
|
||||||
'Cursormodes file content'
|
JSON.stringify({ mcpServers: {} }, null, 2)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,14 @@ describe('Roo Integration', () => {
|
|||||||
fs.mkdirSync(path.join(tempDir, '.roo', 'rules'), { recursive: true });
|
fs.mkdirSync(path.join(tempDir, '.roo', 'rules'), { recursive: true });
|
||||||
|
|
||||||
// Create mode-specific rule directories
|
// Create mode-specific rule directories
|
||||||
const rooModes = ['architect', 'ask', 'boomerang', 'code', 'debug', 'test'];
|
const rooModes = [
|
||||||
|
'architect',
|
||||||
|
'ask',
|
||||||
|
'orchestrator',
|
||||||
|
'code',
|
||||||
|
'debug',
|
||||||
|
'test'
|
||||||
|
];
|
||||||
for (const mode of rooModes) {
|
for (const mode of rooModes) {
|
||||||
fs.mkdirSync(path.join(tempDir, '.roo', `rules-${mode}`), {
|
fs.mkdirSync(path.join(tempDir, '.roo', `rules-${mode}`), {
|
||||||
recursive: true
|
recursive: true
|
||||||
@@ -102,7 +109,7 @@ describe('Roo Integration', () => {
|
|||||||
{ recursive: true }
|
{ recursive: true }
|
||||||
);
|
);
|
||||||
expect(fs.mkdirSync).toHaveBeenCalledWith(
|
expect(fs.mkdirSync).toHaveBeenCalledWith(
|
||||||
path.join(tempDir, '.roo', 'rules-boomerang'),
|
path.join(tempDir, '.roo', 'rules-orchestrator'),
|
||||||
{ recursive: true }
|
{ recursive: true }
|
||||||
);
|
);
|
||||||
expect(fs.mkdirSync).toHaveBeenCalledWith(
|
expect(fs.mkdirSync).toHaveBeenCalledWith(
|
||||||
@@ -133,7 +140,7 @@ describe('Roo Integration', () => {
|
|||||||
expect.any(String)
|
expect.any(String)
|
||||||
);
|
);
|
||||||
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
||||||
path.join(tempDir, '.roo', 'rules-boomerang', 'boomerang-rules'),
|
path.join(tempDir, '.roo', 'rules-orchestrator', 'orchestrator-rules'),
|
||||||
expect.any(String)
|
expect.any(String)
|
||||||
);
|
);
|
||||||
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
||||||
|
|||||||
@@ -29,11 +29,8 @@ describe('Windsurf Integration', () => {
|
|||||||
// Spy on fs methods
|
// Spy on fs methods
|
||||||
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {});
|
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {});
|
||||||
jest.spyOn(fs, 'readFileSync').mockImplementation((filePath) => {
|
jest.spyOn(fs, 'readFileSync').mockImplementation((filePath) => {
|
||||||
if (filePath.toString().includes('.windsurfmodes')) {
|
if (filePath.toString().includes('mcp.json')) {
|
||||||
return 'Existing windsurfmodes content';
|
return JSON.stringify({ mcpServers: {} }, null, 2);
|
||||||
}
|
|
||||||
if (filePath.toString().includes('-rules')) {
|
|
||||||
return 'Existing mode rules content';
|
|
||||||
}
|
}
|
||||||
return '{}';
|
return '{}';
|
||||||
});
|
});
|
||||||
@@ -58,29 +55,10 @@ describe('Windsurf Integration', () => {
|
|||||||
// Create rules directory
|
// Create rules directory
|
||||||
fs.mkdirSync(path.join(tempDir, '.windsurf', 'rules'), { recursive: true });
|
fs.mkdirSync(path.join(tempDir, '.windsurf', 'rules'), { recursive: true });
|
||||||
|
|
||||||
// Create mode-specific rule directories
|
// Create MCP config file
|
||||||
const windsurfModes = [
|
|
||||||
'architect',
|
|
||||||
'ask',
|
|
||||||
'boomerang',
|
|
||||||
'code',
|
|
||||||
'debug',
|
|
||||||
'test'
|
|
||||||
];
|
|
||||||
for (const mode of windsurfModes) {
|
|
||||||
fs.mkdirSync(path.join(tempDir, '.windsurf', `rules-${mode}`), {
|
|
||||||
recursive: true
|
|
||||||
});
|
|
||||||
fs.writeFileSync(
|
|
||||||
path.join(tempDir, '.windsurf', `rules-${mode}`, `${mode}-rules`),
|
|
||||||
`Content for ${mode} rules`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy .windsurfmodes file
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.join(tempDir, '.windsurfmodes'),
|
path.join(tempDir, '.windsurf', 'mcp.json'),
|
||||||
'Windsurfmodes file content'
|
JSON.stringify({ mcpServers: {} }, null, 2)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user