Compare commits

..

5 Commits

Author SHA1 Message Date
km-anthropic
7e0e22a230 fix: provide explicit git base branch reference to prevent PR review errors
- Tell Claude to use 'origin/{baseBranch}' instead of assuming 'main'
- Add explicit instructions for git diff/log commands with correct base branch
- Fixes 'fatal: ambiguous argument main..HEAD' error in fork environments
- Claude was autonomously running git diff main..HEAD when reviewing PRs
2025-08-28 16:55:50 -07:00
km-anthropic
321a54d528 test: verify CI tools fix works correctly 2025-08-28 15:19:56 -07:00
kashyap murali
5f9a9e9747 test: update claude-review workflow to use feat/enhanced-mode-routing (#114)
- Use feat/enhanced-mode-routing branch to test new track_progress feature
- Enable track_progress to get tracking comments
- Add synchronize trigger for updates
- Changed from direct_prompt to prompt (v1 migration)
- Removed allowed_tools as they're not needed with the new routing
2025-08-28 15:04:44 -07:00
km-anthropic
9d2f5f2bee Update test workflow to checkout from fork pr-492 branch 2025-08-27 02:03:36 -07:00
km-anthropic
7919dd663f Test workflow to verify asset environment variable persistence 2025-08-27 01:58:22 -07:00
19 changed files with 140 additions and 414 deletions

View File

@@ -2,12 +2,14 @@ name: Auto review PRs
on:
pull_request:
types: [opened]
types: [opened, synchronize]
jobs:
auto-review:
permissions:
contents: read
issues: write
pull-requests: write
id-token: write
runs-on: ubuntu-latest
@@ -17,10 +19,11 @@ jobs:
with:
fetch-depth: 1
- name: Auto review PR
uses: anthropics/claude-code-action@main
- name: Auto review PR with tracking
uses: anthropics/claude-code-action@feat/enhanced-mode-routing
with:
direct_prompt: |
track_progress: true
prompt: |
Please review this PR. Look at the changes and provide thoughtful feedback on:
- Code quality and best practices
- Potential bugs or issues
@@ -30,4 +33,3 @@ jobs:
Be constructive and specific in your feedback. Give inline comments where applicable.
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
allowed_tools: "mcp__github__create_pending_pull_request_review,mcp__github__add_comment_to_pending_review,mcp__github__submit_pending_pull_request_review,mcp__github__get_pull_request_diff"

72
.github/workflows/test-asset-env.yml vendored Normal file
View File

@@ -0,0 +1,72 @@
name: Test Asset Environment Variable Bug
on:
workflow_dispatch:
issue_comment:
types: [created]
jobs:
test-env-bug:
if: contains(github.event.comment.body, 'test-asset-env') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: km-anthropic/claude-code-action
ref: pr-492 # Test the PR branch
- name: Create test issue comment
id: create-test-comment
if: github.event_name == 'workflow_dispatch'
uses: actions/github-script@v7
with:
script: |
// Create a test image file first
const fs = require('fs');
fs.writeFileSync('/tmp/test-image.png', 'fake image content');
// For workflow_dispatch, we'll simulate by just setting the env var
// In real scenario, this would be an issue with image attachments
core.exportVariable('TEST_SCENARIO', 'workflow_dispatch');
return { number: 1 };
result-encoding: json
- name: Step 1 - Download assets (simulate PR behavior)
uses: ./ # Use local action
id: download-assets
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY || 'test-key' }}
download_github_assets: true
prompt: "Test download step"
continue-on-error: true
- name: Step 2 - Check if CLAUDE_ASSET_FILES persists
run: |
echo "=== Checking CLAUDE_ASSET_FILES availability ==="
echo "CLAUDE_ASSET_FILES value: '$CLAUDE_ASSET_FILES'"
if [ -z "$CLAUDE_ASSET_FILES" ]; then
echo "❌ BUG CONFIRMED: CLAUDE_ASSET_FILES is empty!"
echo "The environment variable set by process.env doesn't persist between steps"
exit 1
else
echo "✅ CLAUDE_ASSET_FILES is available: $CLAUDE_ASSET_FILES"
echo "No bug - the implementation works correctly"
fi
- name: Step 3 - Test the example workflow pattern
run: |
# This simulates what the example workflow tries to do
if [ -n "$CLAUDE_ASSET_FILES" ]; then
echo "ASSET_FILE_LIST<<EOF" >> $GITHUB_ENV
echo "$CLAUDE_ASSET_FILES" | tr ',' '\n' | while IFS= read -r file; do
[ -n "$file" ] && echo "- $file"
done >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
else
echo "Cannot process assets - CLAUDE_ASSET_FILES is empty"
fi
- name: Step 4 - Verify processed list
run: |
echo "Processed asset list:"
echo "$ASSET_FILE_LIST"

View File

@@ -51,4 +51,3 @@ Having issues or questions? Check out our [Frequently Asked Questions](./docs/fa
## License
This project is licensed under the MIT License—see the LICENSE file for details.
# Test change for PR review

1
TEST_FILE_2.md Normal file
View File

@@ -0,0 +1 @@
# Test PR with CI Tools Fix

View File

@@ -73,10 +73,6 @@ inputs:
description: "Enable commit signing using GitHub's commit signature verification. When false, Claude uses standard git commands"
required: false
default: "false"
track_progress:
description: "Force tag mode with tracking comments for pull_request and issue events. Only applicable to pull_request (opened, synchronize, ready_for_review, reopened) and issue (opened, edited, labeled, assigned) events."
required: false
default: "false"
experimental_allowed_domains:
description: "Restrict network access to these domains only (newline-separated). If not set, no restrictions are applied. Provider domains are auto-detected."
required: false
@@ -144,7 +140,6 @@ runs:
USE_STICKY_COMMENT: ${{ inputs.use_sticky_comment }}
DEFAULT_WORKFLOW_TOKEN: ${{ github.token }}
USE_COMMIT_SIGNING: ${{ inputs.use_commit_signing }}
TRACK_PROGRESS: ${{ inputs.track_progress }}
ADDITIONAL_PERMISSIONS: ${{ inputs.additional_permissions }}
CLAUDE_ARGS: ${{ inputs.claude_args }}
ALL_INPUTS: ${{ toJson(inputs) }}
@@ -162,7 +157,7 @@ runs:
# Install Claude Code if no custom executable is provided
if [ -z "${{ inputs.path_to_claude_code_executable }}" ]; then
echo "Installing Claude Code..."
curl -fsSL https://claude.ai/install.sh | bash -s 1.0.96
curl -fsSL https://claude.ai/install.sh | bash -s 1.0.93
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
else
echo "Using custom Claude Code executable: ${{ inputs.path_to_claude_code_executable }}"
@@ -252,7 +247,6 @@ runs:
PREPARE_ERROR: ${{ steps.prepare.outputs.prepare_error || '' }}
USE_STICKY_COMMENT: ${{ inputs.use_sticky_comment }}
USE_COMMIT_SIGNING: ${{ inputs.use_commit_signing }}
TRACK_PROGRESS: ${{ inputs.track_progress }}
- name: Display Claude Code Report
if: steps.prepare.outputs.contains_trigger == 'true' && steps.claude-code.outputs.execution_file != ''

View File

@@ -99,7 +99,7 @@ runs:
run: |
if [ -z "${{ inputs.path_to_claude_code_executable }}" ]; then
echo "Installing Claude Code..."
curl -fsSL https://claude.ai/install.sh | bash -s 1.0.96
curl -fsSL https://claude.ai/install.sh | bash -s 1.0.93
else
echo "Using custom Claude Code executable: ${{ inputs.path_to_claude_code_executable }}"
# Add the directory containing the custom executable to PATH

View File

@@ -22,12 +22,7 @@ jobs:
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
Please review this pull request.
Note: The PR branch is already checked out in the current working directory.
Please review this pull request and provide comprehensive feedback.
Focus on:
- Code quality and best practices
@@ -39,10 +34,7 @@ jobs:
- Verify that README.md and docs are updated for any new features or config changes
Provide constructive feedback with specific suggestions for improvement.
Use `gh pr comment:*` for top-level comments.
Use `mcp__github_inline_comment__create_inline_comment` to highlight specific areas of concern.
Only your GitHub comments that you post will be seen, so don't submit your review as a normal message, just as comments.
If the PR has already been reviewed, or there are no noteworthy changes, don't post anything.
Use inline comments to highlight specific areas of concern.
claude_args: |
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*)"
--allowedTools "mcp__github__create_pending_pull_request_review,mcp__github__add_comment_to_pending_review,mcp__github__submit_pending_pull_request_review,mcp__github__get_pull_request_diff"

View File

@@ -0,0 +1,45 @@
name: Claude Experimental Review Mode
on:
pull_request:
types: [opened, synchronize]
issue_comment:
types: [created]
jobs:
code-review:
# Run on PR events, or when someone comments "@claude review" on a PR
if: |
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@claude review'))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for better diff analysis
- name: Code Review with Claude
uses: anthropics/claude-code-action@v1-dev
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
# github_token not needed - uses default GITHUB_TOKEN for GitHub operations
prompt: |
Review this pull request comprehensively.
Focus on:
- Code quality and maintainability
- Security vulnerabilities
- Performance issues
- Best practices and design patterns
- Test coverage gaps
Be constructive and provide specific suggestions for improvements.
Use GitHub's suggestion format when proposing code changes.

View File

@@ -28,13 +28,7 @@ jobs:
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
Please review this pull request focusing on the changed files.
Note: The PR branch is already checked out in the current working directory.
Provide feedback on:
- Code quality and adherence to best practices
- Potential bugs or edge cases
@@ -44,6 +38,3 @@ jobs:
Since this PR touches critical source code paths, please be thorough
in your review and provide inline comments where appropriate.
claude_args: |
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*)"

View File

@@ -27,13 +27,8 @@ jobs:
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
Please provide a thorough review of this pull request.
Note: The PR branch is already checked out in the current working directory.
Since this is from a specific author that requires careful review,
please pay extra attention to:
- Adherence to project coding standards
@@ -43,6 +38,3 @@ jobs:
- Documentation
Provide detailed feedback and suggestions for improvement.
claude_args: |
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*)"

View File

@@ -1,5 +1,3 @@
import type { GitHubContext } from "../github/context";
export type CommonFields = {
repository: string;
claudeCommentId: string;
@@ -101,5 +99,4 @@ export type EventData =
// Combined type with separate eventData field
export type PreparedContext = CommonFields & {
eventData: EventData;
githubContext?: GitHubContext;
};

View File

@@ -75,7 +75,6 @@ type BaseContext = {
useStickyComment: boolean;
useCommitSigning: boolean;
allowedBots: string;
trackProgress: boolean;
};
};
@@ -123,7 +122,6 @@ export function parseGitHubContext(): GitHubContext {
useStickyComment: process.env.USE_STICKY_COMMENT === "true",
useCommitSigning: process.env.USE_COMMIT_SIGNING === "true",
allowedBots: process.env.ALLOWED_BOTS ?? "",
trackProgress: process.env.TRACK_PROGRESS === "true",
},
};

View File

@@ -5,41 +5,6 @@ import type { PreparedContext } from "../../create-prompt/types";
import { prepareMcpConfig } from "../../mcp/install-mcp-server";
import { parseAllowedTools } from "./parse-tools";
import { configureGitAuth } from "../../github/operations/git-config";
import type { GitHubContext } from "../../github/context";
import { isEntityContext } from "../../github/context";
/**
* Extract GitHub context as environment variables for agent mode
*/
function extractGitHubContext(context: GitHubContext): Record<string, string> {
const envVars: Record<string, string> = {};
// Basic repository info
envVars.GITHUB_REPOSITORY = context.repository.full_name;
envVars.GITHUB_TRIGGER_ACTOR = context.actor;
envVars.GITHUB_EVENT_NAME = context.eventName;
// Entity-specific context (PR/issue numbers, branches, etc.)
if (isEntityContext(context)) {
if (context.isPR) {
envVars.GITHUB_PR_NUMBER = String(context.entityNumber);
// Extract branch info from payload if available
if (
context.payload &&
"pull_request" in context.payload &&
context.payload.pull_request
) {
envVars.GITHUB_BASE_REF = context.payload.pull_request.base?.ref || "";
envVars.GITHUB_HEAD_REF = context.payload.pull_request.head?.ref || "";
}
} else {
envVars.GITHUB_ISSUE_NUMBER = String(context.entityNumber);
}
}
return envVars;
}
/**
* Agent mode implementation.
@@ -171,14 +136,6 @@ export const agentMode: Mode = {
},
generatePrompt(context: PreparedContext): string {
// Inject GitHub context as environment variables
if (context.githubContext) {
const envVars = extractGitHubContext(context.githubContext);
for (const [key, value] of Object.entries(envVars)) {
core.exportVariable(key, value);
}
}
// Agent mode uses prompt field
if (context.prompt) {
return context.prompt;

View File

@@ -3,65 +3,31 @@ import {
isEntityContext,
isIssueCommentEvent,
isPullRequestReviewCommentEvent,
isPullRequestEvent,
isIssuesEvent,
isPullRequestReviewEvent,
} from "../github/context";
import { checkContainsTrigger } from "../github/validation/trigger";
export type AutoDetectedMode = "tag" | "agent";
export function detectMode(context: GitHubContext): AutoDetectedMode {
// Validate track_progress usage
if (context.inputs.trackProgress) {
validateTrackProgressEvent(context);
// If prompt is provided, use agent mode for direct execution
if (context.inputs?.prompt) {
return "agent";
}
// If track_progress is set for PR/issue events, force tag mode
if (context.inputs.trackProgress && isEntityContext(context)) {
if (isPullRequestEvent(context) || isIssuesEvent(context)) {
return "tag";
}
}
// Comment events (current behavior - unchanged)
// Check for @claude mentions (tag mode)
if (isEntityContext(context)) {
if (
isIssueCommentEvent(context) ||
isPullRequestReviewCommentEvent(context) ||
isPullRequestReviewEvent(context)
isPullRequestReviewCommentEvent(context)
) {
// If prompt is provided on comment events, use agent mode
if (context.inputs.prompt) {
return "agent";
}
// Default to tag mode if @claude mention found
if (checkContainsTrigger(context)) {
return "tag";
}
}
}
// Issue events
if (isEntityContext(context) && isIssuesEvent(context)) {
// Check for @claude mentions or labels/assignees
if (checkContainsTrigger(context)) {
return "tag";
}
}
// PR events (opened, synchronize, etc.)
if (isEntityContext(context) && isPullRequestEvent(context)) {
const supportedActions = [
"opened",
"synchronize",
"ready_for_review",
"reopened",
];
if (context.eventAction && supportedActions.includes(context.eventAction)) {
// If prompt is provided, use agent mode (default for automation)
if (context.inputs.prompt) {
return "agent";
if (context.eventName === "issues") {
if (checkContainsTrigger(context)) {
return "tag";
}
}
}
@@ -81,33 +47,6 @@ export function getModeDescription(mode: AutoDetectedMode): string {
}
}
function validateTrackProgressEvent(context: GitHubContext): void {
// track_progress is only valid for pull_request and issue events
const validEvents = ["pull_request", "issues"];
if (!validEvents.includes(context.eventName)) {
throw new Error(
`track_progress is only supported for pull_request and issue events. ` +
`Current event: ${context.eventName}`,
);
}
// Additionally validate PR actions
if (context.eventName === "pull_request" && context.eventAction) {
const validActions = [
"opened",
"synchronize",
"ready_for_review",
"reopened",
];
if (!validActions.includes(context.eventAction)) {
throw new Error(
`track_progress for pull_request events is only supported for actions: ` +
`${validActions.join(", ")}. Current action: ${context.eventAction}`,
);
}
}
}
export function shouldUseTrackingComment(mode: AutoDetectedMode): boolean {
return mode === "tag";
}

View File

@@ -125,9 +125,6 @@ export const tagMode: Mode = {
"Read",
"Write",
"mcp__github_comment__update_claude_comment",
"mcp__github_ci__get_ci_status",
"mcp__github_ci__get_workflow_run_details",
"mcp__github_ci__download_job_log",
];
// Add git commands when not using commit signing
@@ -180,25 +177,7 @@ export const tagMode: Mode = {
githubData: FetchDataResult,
useCommitSigning: boolean,
): string {
const defaultPrompt = generateDefaultPrompt(
context,
githubData,
useCommitSigning,
);
// If a custom prompt is provided, inject it into the tag mode prompt
if (context.githubContext?.inputs?.prompt) {
return (
defaultPrompt +
`
<custom_instructions>
${context.githubContext.inputs.prompt}
</custom_instructions>`
);
}
return defaultPrompt;
return generateDefaultPrompt(context, githubData, useCommitSigning);
},
getSystemPrompt() {

View File

@@ -32,7 +32,6 @@ describe("prepareMcpConfig", () => {
useStickyComment: false,
useCommitSigning: false,
allowedBots: "",
trackProgress: false,
},
};

View File

@@ -19,7 +19,6 @@ const defaultInputs = {
useStickyComment: false,
useCommitSigning: false,
allowedBots: "",
trackProgress: false,
};
const defaultRepository = {
@@ -73,7 +72,7 @@ export const createMockAutomationContext = (
const mergedInputs = overrides.inputs
? { ...defaultInputs, ...overrides.inputs }
: { ...defaultInputs };
: defaultInputs;
return { ...baseContext, ...overrides, inputs: mergedInputs };
};

View File

@@ -68,7 +68,6 @@ describe("checkWritePermissions", () => {
useStickyComment: false,
useCommitSigning: false,
allowedBots: "",
trackProgress: false,
},
});

View File

@@ -1,229 +0,0 @@
import { describe, expect, it } from "bun:test";
import { detectMode } from "../../src/modes/detector";
import type { GitHubContext } from "../../src/github/context";
describe("detectMode with enhanced routing", () => {
const baseContext = {
runId: "test-run",
eventAction: "opened",
repository: {
owner: "test-owner",
repo: "test-repo",
full_name: "test-owner/test-repo",
},
actor: "test-user",
inputs: {
prompt: "",
triggerPhrase: "@claude",
assigneeTrigger: "",
labelTrigger: "",
branchPrefix: "claude/",
useStickyComment: false,
useCommitSigning: false,
allowedBots: "",
trackProgress: false,
},
};
describe("PR Events with track_progress", () => {
it("should use tag mode when track_progress is true for pull_request.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use tag mode when track_progress is true for pull_request.synchronize", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "synchronize",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode when track_progress is false for pull_request.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: false },
};
expect(detectMode(context)).toBe("agent");
});
it("should throw error when track_progress is used with unsupported PR action", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "closed",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(() => detectMode(context)).toThrow(
/track_progress for pull_request events is only supported for actions/,
);
});
});
describe("Issue Events with track_progress", () => {
it("should use tag mode when track_progress is true for issues.opened", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode when track_progress is false for issues", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, trackProgress: false },
};
expect(detectMode(context)).toBe("agent");
});
});
describe("Comment Events (unchanged behavior)", () => {
it("should use tag mode for issue_comment with @claude mention", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issue_comment",
payload: {
issue: { number: 1, body: "Test" },
comment: { body: "@claude help" },
} as any,
entityNumber: 1,
isPR: false,
};
expect(detectMode(context)).toBe("tag");
});
it("should use agent mode for issue_comment with prompt provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issue_comment",
payload: {
issue: { number: 1, body: "Test" },
comment: { body: "@claude help" },
} as any,
entityNumber: 1,
isPR: false,
inputs: { ...baseContext.inputs, prompt: "Review this PR" },
};
expect(detectMode(context)).toBe("agent");
});
it("should use tag mode for PR review comments with @claude mention", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request_review_comment",
payload: {
pull_request: { number: 1, body: "Test" },
comment: { body: "@claude check this" },
} as any,
entityNumber: 1,
isPR: true,
};
expect(detectMode(context)).toBe("tag");
});
});
describe("Automation Events (should error with track_progress)", () => {
it("should throw error when track_progress is used with workflow_dispatch", () => {
const context: GitHubContext = {
...baseContext,
eventName: "workflow_dispatch",
payload: {} as any,
inputs: { ...baseContext.inputs, trackProgress: true },
};
expect(() => detectMode(context)).toThrow(
/track_progress is only supported for pull_request and issue events/,
);
});
it("should use agent mode for workflow_dispatch without track_progress", () => {
const context: GitHubContext = {
...baseContext,
eventName: "workflow_dispatch",
payload: {} as any,
inputs: { ...baseContext.inputs, prompt: "Run workflow" },
};
expect(detectMode(context)).toBe("agent");
});
});
describe("Custom prompt injection in tag mode", () => {
it("should use tag mode for PR events when both track_progress and prompt are provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "pull_request",
eventAction: "opened",
payload: { pull_request: { number: 1 } } as any,
entityNumber: 1,
isPR: true,
inputs: {
...baseContext.inputs,
trackProgress: true,
prompt: "Review for security issues",
},
};
expect(detectMode(context)).toBe("tag");
});
it("should use tag mode for issue events when both track_progress and prompt are provided", () => {
const context: GitHubContext = {
...baseContext,
eventName: "issues",
eventAction: "opened",
payload: { issue: { number: 1, body: "Test" } } as any,
entityNumber: 1,
isPR: false,
inputs: {
...baseContext.inputs,
trackProgress: true,
prompt: "Analyze this issue",
},
};
expect(detectMode(context)).toBe("tag");
});
});
});