feat: enhance review process and role management
- Refactor reviewPass function to identify states with review checks instead of specific review types. - Introduce review policies (HUMAN, AGENT, AUTO) to control PR review processes based on developer levels. - Update projectTick to handle review policies and step routing labels for reviewers and testers. - Add detailed reviewer instructions to templates for clarity on review responsibilities. - Implement role:level label management, allowing dynamic creation of labels based on project configuration. - Enhance task_update tool to support state and level updates, ensuring at least one parameter is provided. - Update work_finish tool to include reviewer actions (approve, reject) in task completion. - Modify work_start tool to utilize role-level detection for better level assignment. - Add tests for new functionalities, including review routing and level detection from labels.
This commit is contained in:
@@ -32,12 +32,14 @@ describe("role registry", () => {
|
||||
assert.ok(ids.includes("developer"));
|
||||
assert.ok(ids.includes("tester"));
|
||||
assert.ok(ids.includes("architect"));
|
||||
assert.ok(ids.includes("reviewer"));
|
||||
});
|
||||
|
||||
it("should validate role IDs", () => {
|
||||
assert.strictEqual(isValidRole("developer"), true);
|
||||
assert.strictEqual(isValidRole("tester"), true);
|
||||
assert.strictEqual(isValidRole("architect"), true);
|
||||
assert.strictEqual(isValidRole("reviewer"), true);
|
||||
assert.strictEqual(isValidRole("nonexistent"), false);
|
||||
});
|
||||
|
||||
@@ -58,6 +60,7 @@ describe("levels", () => {
|
||||
assert.deepStrictEqual([...getLevelsForRole("developer")], ["junior", "medior", "senior"]);
|
||||
assert.deepStrictEqual([...getLevelsForRole("tester")], ["junior", "medior", "senior"]);
|
||||
assert.deepStrictEqual([...getLevelsForRole("architect")], ["junior", "senior"]);
|
||||
assert.deepStrictEqual([...getLevelsForRole("reviewer")], ["junior", "senior"]);
|
||||
});
|
||||
|
||||
it("should return empty for unknown role", () => {
|
||||
@@ -185,17 +188,21 @@ describe("emoji", () => {
|
||||
|
||||
describe("completion results", () => {
|
||||
it("should return valid results per role", () => {
|
||||
assert.deepStrictEqual([...getCompletionResults("developer")], ["done", "review", "blocked"]);
|
||||
assert.deepStrictEqual([...getCompletionResults("developer")], ["done", "blocked"]);
|
||||
assert.deepStrictEqual([...getCompletionResults("tester")], ["pass", "fail", "refine", "blocked"]);
|
||||
assert.deepStrictEqual([...getCompletionResults("architect")], ["done", "blocked"]);
|
||||
assert.deepStrictEqual([...getCompletionResults("reviewer")], ["approve", "reject", "blocked"]);
|
||||
});
|
||||
|
||||
it("should validate results", () => {
|
||||
assert.strictEqual(isValidResult("developer", "done"), true);
|
||||
assert.strictEqual(isValidResult("developer", "review"), true);
|
||||
assert.strictEqual(isValidResult("developer", "pass"), false);
|
||||
assert.strictEqual(isValidResult("tester", "pass"), true);
|
||||
assert.strictEqual(isValidResult("tester", "done"), false);
|
||||
assert.strictEqual(isValidResult("reviewer", "approve"), true);
|
||||
assert.strictEqual(isValidResult("reviewer", "reject"), true);
|
||||
assert.strictEqual(isValidResult("reviewer", "escalate"), false);
|
||||
assert.strictEqual(isValidResult("reviewer", "done"), false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -205,6 +212,7 @@ describe("session key pattern", () => {
|
||||
assert.ok(pattern.includes("developer"));
|
||||
assert.ok(pattern.includes("tester"));
|
||||
assert.ok(pattern.includes("architect"));
|
||||
assert.ok(pattern.includes("reviewer"));
|
||||
});
|
||||
|
||||
it("should work as regex", () => {
|
||||
@@ -213,6 +221,7 @@ describe("session key pattern", () => {
|
||||
assert.ok(regex.test("developer"));
|
||||
assert.ok(regex.test("tester"));
|
||||
assert.ok(regex.test("architect"));
|
||||
assert.ok(regex.test("reviewer"));
|
||||
assert.ok(!regex.test("nonexistent"));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -30,7 +30,7 @@ export const ROLE_REGISTRY: Record<string, RoleConfig> = {
|
||||
senior: "🧠",
|
||||
},
|
||||
fallbackEmoji: "🔧",
|
||||
completionResults: ["done", "review", "blocked"],
|
||||
completionResults: ["done", "blocked"],
|
||||
sessionKeyPattern: "developer",
|
||||
notifications: { onStart: true, onComplete: true },
|
||||
},
|
||||
@@ -74,4 +74,23 @@ export const ROLE_REGISTRY: Record<string, RoleConfig> = {
|
||||
sessionKeyPattern: "architect",
|
||||
notifications: { onStart: true, onComplete: true },
|
||||
},
|
||||
|
||||
reviewer: {
|
||||
id: "reviewer",
|
||||
displayName: "REVIEWER",
|
||||
levels: ["junior", "senior"],
|
||||
defaultLevel: "junior",
|
||||
models: {
|
||||
junior: "anthropic/claude-haiku-4-5",
|
||||
senior: "anthropic/claude-sonnet-4-5",
|
||||
},
|
||||
emoji: {
|
||||
junior: "👁️",
|
||||
senior: "🔬",
|
||||
},
|
||||
fallbackEmoji: "👁️",
|
||||
completionResults: ["approve", "reject", "blocked"],
|
||||
sessionKeyPattern: "reviewer",
|
||||
notifications: { onStart: true, onComplete: true },
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user