diff --git a/bun-test.d.ts b/bun-test.d.ts index 43bdc481b..f93a107fb 100644 --- a/bun-test.d.ts +++ b/bun-test.d.ts @@ -12,6 +12,7 @@ declare module "bun:test" { } export function describe(name: string, fn: () => void): void + export function test(name: string, fn: () => void | Promise): void export function it(name: string, fn: () => void | Promise): void export function beforeEach(fn: () => void | Promise): void export function afterEach(fn: () => void | Promise): void @@ -28,6 +29,8 @@ declare module "bun:test" { interface Matchers { toBe(expected: unknown): void + toBeDefined(): void + toBeUndefined(): void toBeNull(): void toEqual(expected: unknown): void toContain(expected: unknown): void diff --git a/src/features/builtin-commands/commands.test.ts b/src/features/builtin-commands/commands.test.ts index eed1925c4..2da5682b7 100644 --- a/src/features/builtin-commands/commands.test.ts +++ b/src/features/builtin-commands/commands.test.ts @@ -1,3 +1,5 @@ +/// + import { afterEach, beforeEach, describe, test, expect } from "bun:test" import { loadBuiltinCommands } from "./commands" import { HANDOFF_TEMPLATE } from "./templates/handoff" @@ -170,6 +172,15 @@ describe("REMOVE_AI_SLOPS_TEMPLATE", () => { expect(REMOVE_AI_SLOPS_TEMPLATE).toContain("Safety Verification") expect(REMOVE_AI_SLOPS_TEMPLATE).toContain("Behavior Preservation") }) + + test("should detect the base branch dynamically instead of hardcoding main", () => { + //#given - the template string + + //#when / #then + expect(REMOVE_AI_SLOPS_TEMPLATE).toContain("git symbolic-ref refs/remotes/origin/HEAD") + expect(REMOVE_AI_SLOPS_TEMPLATE).toContain('git merge-base "$BASE_BRANCH" HEAD') + expect(REMOVE_AI_SLOPS_TEMPLATE).not.toContain("git merge-base main HEAD") + }) }) describe("HANDOFF_TEMPLATE", () => { diff --git a/src/features/builtin-commands/templates/remove-ai-slops.ts b/src/features/builtin-commands/templates/remove-ai-slops.ts index 2d2155549..12a553b83 100644 --- a/src/features/builtin-commands/templates/remove-ai-slops.ts +++ b/src/features/builtin-commands/templates/remove-ai-slops.ts @@ -17,20 +17,27 @@ You are a senior code quality engineer specialized in identifying and removing A ## Process ### Phase 1: Identify Changed Files -Execute the following command to get all changed files in the current branch: -\\\`\\\`\\\`bash -git diff $(git merge-base main HEAD)..HEAD --name-only -\\\`\\\`\\\` +Detect the repository base branch dynamically, then get all changed files in the current branch: +\`\`\`bash +BASE_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main") +git diff $(git merge-base "$BASE_BRANCH" HEAD)..HEAD --name-only +\`\`\` + +If \`git symbolic-ref refs/remotes/origin/HEAD\` is unavailable, detect the base branch at runtime using the repo's configured remote default branch. Only fall back to \`main\` as a last resort. ### Phase 2: Parallel AI Slop Removal For each changed file, spawn an agent in parallel using the Task tool with the ai-slop-remover skill: -\\\`\\\`\\\` +\`\`\` task(category="quick", load_skills=["ai-slop-remover"], run_in_background=true, description="Remove AI slops from {filename}", prompt="Remove AI slops from: {file_path}") -\\\`\\\`\\\` +\`\`\` **CRITICAL**: Launch ALL agents in a SINGLE message with multiple Task tool calls for maximum parallelism. +Before running ai-slop-remover on each file, save a file-specific rollback artifact that captures only the delta introduced by the slop-removal pass. Use a safe pattern such as generating a per-file patch and reverse-applying it if review fails. + +Do NOT use \`git checkout -- {file_path}\` or any rollback that discards pre-existing branch changes in the file. + ### Phase 3: Critical Review After all ai-slop-remover agents complete, perform a critical review with the following checklist: @@ -56,14 +63,14 @@ After all ai-slop-remover agents complete, perform a critical review with the fo If any issues are found during critical review: 1. Identify the specific problem 2. Explain why it's a problem -3. Use git checkout to revert the changes from ai-slop-remover +3. Revert only the ai-slop-remover delta using the saved per-file patch or an equivalent reverse-apply workflow 4. If remaining ai-slops are found after reverting, remove them by editing the file yourself - with parallel tool calls, per-file 5. Verify the fix doesn't introduce new issues ## Output Format ### Summary Report -\\\`\\\`\\\` +\`\`\` ## AI Slop Removal Summary ### Files Processed @@ -80,7 +87,7 @@ If any issues are found during critical review: ### Final Status [CLEAN / ISSUES FIXED / REQUIRES ATTENTION] -\\\`\\\`\\\` +\`\`\` ## Quality Assurance - NEVER remove code that serves a functional purpose