Skip to content

Commit 61e6660

Browse files
feat: use CLI builtin review skill instead of fetching from GitHub
The Droid CLI bundles the review skill as a builtin, so the agent can invoke it via the Skill tool at runtime. Remove the load-skill.ts GitHub fetch and instead instruct the agent to invoke the 'review' skill directly. This eliminates the network dependency during the prepare step and uses the CLI as the single source of truth for the review methodology. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
1 parent 6465fba commit 61e6660

File tree

11 files changed

+6
-310
lines changed

11 files changed

+6
-310
lines changed

src/create-prompt/index.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ export type PromptCreationOptions = {
305305
reviewArtifacts?: ReviewArtifacts;
306306
outputFilePath?: string;
307307
includeSuggestions?: boolean;
308-
reviewSkillContent?: string;
309308
};
310309

311310
export async function createPrompt({
@@ -321,7 +320,6 @@ export async function createPrompt({
321320
reviewArtifacts,
322321
outputFilePath,
323322
includeSuggestions,
324-
reviewSkillContent,
325323
}: PromptCreationOptions) {
326324
try {
327325
const droidCommentId = commentId?.toString();
@@ -342,10 +340,6 @@ export async function createPrompt({
342340
preparedContext.includeSuggestions = includeSuggestions;
343341
}
344342

345-
if (reviewSkillContent) {
346-
preparedContext.reviewSkillContent = reviewSkillContent;
347-
}
348-
349343
await mkdir(`${process.env.RUNNER_TEMP || "/tmp"}/droid-prompts`, {
350344
recursive: true,
351345
});

src/create-prompt/templates/review-candidates-prompt.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { formatSkillSection } from "../../utils/load-skill";
21
import type { PreparedContext } from "../types";
32

43
export function generateReviewCandidatesPrompt(
@@ -53,7 +52,9 @@ export function generateReviewCandidatesPrompt(
5352
return `You are a senior staff software engineer and expert code reviewer.
5453
5554
Your task: Review PR #${prNumber} in ${repoFullName} and generate a JSON file with **high-confidence, actionable** review comments that pinpoint genuine issues.
56-
${formatSkillSection(context.reviewSkillContent)}
55+
56+
Before starting, invoke the 'review' skill to load the review methodology. Follow its bug patterns, analysis discipline, reporting gate, and priority levels throughout your review.
57+
5758
<context>
5859
Repo: ${repoFullName}
5960
PR Number: ${prNumber}

src/create-prompt/templates/review-validator-prompt.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { formatSkillSection } from "../../utils/load-skill";
21
import type { PreparedContext } from "../types";
32

43
export function generateReviewValidatorPrompt(
@@ -44,7 +43,9 @@ export function generateReviewValidatorPrompt(
4443
return `You are validating candidate review comments for PR #${prNumber} in ${repoFullName}.
4544
4645
IMPORTANT: This is Phase 2 (validator) of a two-pass review pipeline.
47-
${formatSkillSection(context.reviewSkillContent)}
46+
47+
Before starting, invoke the 'review' skill to load the review methodology. Apply its reporting gate, confidence calibration, and deduplication rules.
48+
4849
### Context
4950
5051
* Repo: ${repoFullName}

src/create-prompt/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,4 @@ export type PreparedContext = CommonFields & {
119119
reviewArtifacts?: ReviewArtifacts;
120120
outputFilePath?: string;
121121
includeSuggestions?: boolean;
122-
reviewSkillContent?: string;
123122
};

src/entrypoints/generate-review-prompt.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { prepareMcpTools } from "../mcp/install-mcp-server";
1515
import { generateReviewCandidatesPrompt } from "../create-prompt/templates/review-candidates-prompt";
1616
import { generateSecurityReviewPrompt } from "../create-prompt/templates/security-review-prompt";
1717
import { normalizeDroidArgs, parseAllowedTools } from "../utils/parse-tools";
18-
import { loadSkill } from "../utils/load-skill";
1918

2019
async function run() {
2120
try {
@@ -99,9 +98,6 @@ async function run() {
9998
const outputFilePath = process.env.DROID_OUTPUT_FILE || undefined;
10099
const includeSuggestions = process.env.INCLUDE_SUGGESTIONS !== "false";
101100

102-
const reviewSkillContent =
103-
reviewType === "code" ? await loadSkill("review") : undefined;
104-
105101
await createPrompt({
106102
githubContext: context,
107103
commentId,
@@ -114,7 +110,6 @@ async function run() {
114110
reviewArtifacts,
115111
outputFilePath,
116112
includeSuggestions,
117-
reviewSkillContent,
118113
});
119114

120115
// Set run type

src/tag/commands/review-validator.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { prepareMcpTools } from "../../mcp/install-mcp-server";
99
import { normalizeDroidArgs, parseAllowedTools } from "../../utils/parse-tools";
1010
import type { PrepareResult } from "../../prepare/types";
1111
import { generateReviewValidatorPrompt } from "../../create-prompt/templates/review-validator-prompt";
12-
import { loadSkill } from "../../utils/load-skill";
1312

1413
export async function prepareReviewValidatorMode({
1514
context,
@@ -47,7 +46,6 @@ export async function prepareReviewValidatorMode({
4746
};
4847

4948
const includeSuggestions = process.env.INCLUDE_SUGGESTIONS !== "false";
50-
const reviewSkillContent = await loadSkill("review");
5149

5250
await createPrompt({
5351
githubContext: context,
@@ -61,7 +59,6 @@ export async function prepareReviewValidatorMode({
6159
generatePrompt: generateReviewValidatorPrompt,
6260
reviewArtifacts,
6361
includeSuggestions,
64-
reviewSkillContent,
6562
});
6663

6764
core.exportVariable("DROID_EXEC_RUN_TYPE", "droid-review");

src/tag/commands/review.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { createInitialComment } from "../../github/operations/comments/create-in
99
import { normalizeDroidArgs, parseAllowedTools } from "../../utils/parse-tools";
1010
import { isEntityContext } from "../../github/context";
1111
import { generateReviewCandidatesPrompt } from "../../create-prompt/templates/review-candidates-prompt";
12-
import { loadSkill } from "../../utils/load-skill";
1312
import type { Octokits } from "../../github/api/client";
1413
import type { PrepareResult } from "../../prepare/types";
1514

@@ -86,7 +85,6 @@ export async function prepareReviewMode({
8685
});
8786

8887
const includeSuggestions = process.env.INCLUDE_SUGGESTIONS !== "false";
89-
const reviewSkillContent = await loadSkill("review");
9088

9189
await createPrompt({
9290
githubContext: context,
@@ -100,7 +98,6 @@ export async function prepareReviewMode({
10098
generatePrompt: generateReviewCandidatesPrompt,
10199
reviewArtifacts,
102100
includeSuggestions,
103-
reviewSkillContent,
104101
});
105102
core.exportVariable("DROID_EXEC_RUN_TYPE", "droid-review");
106103

src/utils/load-skill.ts

Lines changed: 0 additions & 123 deletions
This file was deleted.

test/integration/review-flow.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import * as createInitial from "../../src/github/operations/comments/create-init
88
import * as mcpInstaller from "../../src/mcp/install-mcp-server";
99
import * as actorValidation from "../../src/github/validation/actor";
1010
import * as promptModule from "../../src/create-prompt";
11-
import * as skillLoader from "../../src/utils/load-skill";
1211
import * as core from "@actions/core";
1312
import * as childProcess from "node:child_process";
1413

@@ -24,7 +23,6 @@ describe("review command integration", () => {
2423
let exportVarSpy: ReturnType<typeof spyOn>;
2524
let promptSpy: ReturnType<typeof spyOn>;
2625
let execSyncSpy: ReturnType<typeof spyOn>;
27-
let loadSkillSpy: ReturnType<typeof spyOn>;
2826

2927
beforeEach(async () => {
3028
tmpDir = await mkdtemp(path.join(os.tmpdir(), "review-int-"));
@@ -41,9 +39,6 @@ describe("review command integration", () => {
4139
promptSpy = spyOn(promptModule, "createPrompt").mockResolvedValue();
4240
setOutputSpy = spyOn(core, "setOutput").mockImplementation(() => {});
4341
exportVarSpy = spyOn(core, "exportVariable").mockImplementation(() => {});
44-
loadSkillSpy = spyOn(skillLoader, "loadSkill").mockResolvedValue(
45-
"mock skill content",
46-
);
4742

4843
execSyncSpy = spyOn(childProcess, "execSync").mockImplementation(((
4944
cmd: string,
@@ -65,7 +60,6 @@ describe("review command integration", () => {
6560
setOutputSpy.mockRestore();
6661
exportVarSpy.mockRestore();
6762
execSyncSpy.mockRestore();
68-
loadSkillSpy.mockRestore();
6963

7064
if (process.env.RUNNER_TEMP) {
7165
await rm(process.env.RUNNER_TEMP, { recursive: true, force: true });

test/modes/tag/review-command.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { createMockContext } from "../../mockContext";
66
import * as promptModule from "../../../src/create-prompt";
77
import * as mcpInstaller from "../../../src/mcp/install-mcp-server";
88
import * as comments from "../../../src/github/operations/comments/create-initial";
9-
import * as skillLoader from "../../../src/utils/load-skill";
109
import * as childProcess from "child_process";
1110
import * as fsPromises from "fs/promises";
1211

@@ -40,16 +39,12 @@ describe("prepareReviewMode", () => {
4039
let execSyncSpy: ReturnType<typeof spyOn>;
4140
let writeFileSpy: ReturnType<typeof spyOn>;
4241
let mkdirSpy: ReturnType<typeof spyOn>;
43-
let loadSkillSpy: ReturnType<typeof spyOn>;
4442

4543
beforeEach(() => {
4644
process.env.DROID_ARGS = "";
4745
delete process.env.REVIEW_MODEL;
4846
process.env.RUNNER_TEMP = "/tmp/test-runner";
4947

50-
loadSkillSpy = spyOn(skillLoader, "loadSkill").mockResolvedValue(
51-
"mock skill content",
52-
);
5348
promptSpy = spyOn(promptModule, "createPrompt").mockResolvedValue();
5449
mcpSpy = spyOn(mcpInstaller, "prepareMcpTools").mockResolvedValue(
5550
"mock-config",
@@ -89,7 +84,6 @@ describe("prepareReviewMode", () => {
8984
execSyncSpy.mockRestore();
9085
writeFileSpy.mockRestore();
9186
mkdirSpy.mockRestore();
92-
loadSkillSpy.mockRestore();
9387
process.env.DROID_ARGS = originalArgs;
9488
if (originalReviewModel !== undefined) {
9589
process.env.REVIEW_MODEL = originalReviewModel;

0 commit comments

Comments
 (0)