Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,14 @@ body:
attributes:
value: |
<br />
Thank you for taking the time to report a bug! Please answer each question below to the best of your ability; it is okay to leave questions blank if you have to.
Thank you for taking the time to report a bug! Please answer each question below to the best of your ability; it is okay to leave questions blank if you have to.
⚠️ **Security notice**: This is a public repository. Before sharing logs or files, please review them for:
- API keys, tokens, or credentials
- Personal identifiable information (PII)
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar: “Personal identifiable information (PII)” should be “Personally identifiable information (PII)”.

Suggested change
- Personal identifiable information (PII)
- Personally identifiable information (PII)

Copilot uses AI. Check for mistakes.
Copy link

@jarlungoodoo73 jarlungoodoo73 Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delete red 15 , Keep add green 15 use suggest

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delete red 15 , Keep add green 15

- Internal URLs, hostnames, or filesystem paths
Please avoid sharing contents from `~/.copilot/` unless you've reviewed and redacted sensitive data.
- type: textarea
id: description
attributes:
Expand Down
21 changes: 14 additions & 7 deletions .github/workflows/close-invalid.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,29 @@ permissions:

jobs:
close-on-adding-invalid-label:
if:
github.repository == 'github/copilot-cli' && github.event.label.name ==
'invalid'
if: |
github.repository == 'github/copilot-cli' &&
github.event.label.name == 'invalid' &&
(
github.event_name == 'issues' ||
github.event.pull_request.head.repo.full_name == github.repository
)
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Close issue
if: ${{ github.event_name == 'issues' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
URL: ${{ github.event.issue.html_url }}
run: gh issue close $URL
NUMBER: ${{ github.event.issue.number }}
REPO: ${{ github.repository }}
run: gh issue close "$NUMBER" --repo "$REPO"

- name: Close PR
if: ${{ github.event_name == 'pull_request_target' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
URL: ${{ github.event.pull_request.html_url }}
run: gh pr close $URL
NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: gh pr close "$NUMBER" --repo "$REPO"
9 changes: 7 additions & 2 deletions .github/workflows/close-single-word-issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ permissions:
jobs:
close-issue:
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Close Single-Word Issue
uses: actions/github-script@v7
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
Expand All @@ -25,8 +26,10 @@ jobs:
const issueNumber = context.payload.issue.number;
const repo = context.repo.repo;
console.log(`Closing single-word issue #${issueNumber}: "${issueTitle}"`);
// Close the issue and add the invalid label
github.rest.issues.update({
await github.rest.issues.update({
owner: context.repo.owner,
repo: repo,
issue_number: issueNumber,
Expand All @@ -41,4 +44,6 @@ jobs:
issue_number: issueNumber,
body: `This issue may have been opened accidentally. I'm going to close it now, but feel free to open a new issue with a more descriptive title.`
});
console.log(`Successfully closed issue #${issueNumber}`);
}
6 changes: 5 additions & 1 deletion .github/workflows/feature-request-comment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ permissions:

jobs:
add-comment-to-enhancement-issues:
if: github.event.label.name == 'enhancement'
if: github.repository == 'github/copilot-cli' && github.event.label.name == 'enhancement'
runs-on: ubuntu-latest
timeout-minutes: 5
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
Expand All @@ -29,3 +30,6 @@ jobs:
contribute.
steps:
- run: gh issue comment "$NUMBER" --body "$BODY"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
4 changes: 3 additions & 1 deletion .github/workflows/no-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ permissions:

jobs:
noResponse:
if: github.repository == 'github/copilot-cli'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/stale@v9
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
only-issue-labels: 'more-info-needed'
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/on-issue-close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ on:
- closed
jobs:
label_issues:
if: github.repository == 'github/copilot-cli'
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
issues: write
steps:
Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/remove-triage-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ permissions:

jobs:
remove-triage-label-from-issues:
if:
github.event.label.name != 'triage' && github.event.label.name !=
'more-info-needed'
if: github.repository == 'github/copilot-cli' && github.event.label.name != 'triage' && github.event.label.name != 'more-info-needed'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- run: gh issue edit "$NUMBER" --remove-label "$LABELS"
env:
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/stale-issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ permissions:

jobs:
stale:
if: github.repository == 'github/copilot-cli'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/stale@v9
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
with:
stale-issue-label: 'stale, triage' # The label that will be added to the issues when automatically marked as stale
start-date: '2025-01-01T00:00:00Z' # Skip stale action for issues created before it
Expand Down
12 changes: 8 additions & 4 deletions .github/workflows/triage-issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@ on:
permissions:
issues: write

concurrency:
group: triage-${{ github.event.issue.number }}
cancel-in-progress: true

jobs:
label_incoming_issues:
if: github.repository == 'github/copilot-cli' && (github.event.action == 'opened' || github.event.action == 'reopened')
runs-on: ubuntu-latest
if: github.event.action == 'opened' || github.event.action == 'reopened'
timeout-minutes: 5
steps:
- run: gh issue edit "$NUMBER" --add-label "$LABELS"
env:
Expand All @@ -21,10 +26,9 @@ jobs:
NUMBER: ${{ github.event.issue.number }}
LABELS: triage
label_more_info_issues:
if:
github.event.action == 'unlabeled' && github.event.label.name ==
'more-info-needed'
if: github.repository == 'github/copilot-cli' && github.event.action == 'unlabeled' && github.event.label.name == 'more-info-needed'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- run: gh issue edit "$NUMBER" --add-label "$LABELS"
env:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/unable-to-reproduce-comment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ permissions:

jobs:
add-comment-to-unable-to-reproduce-issues:
if: github.event.label.name == 'unable-to-reproduce'
if: github.repository == 'github/copilot-cli' && github.event.label.name == 'unable-to-reproduce'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Update issue
env:
Expand Down
56 changes: 46 additions & 10 deletions .github/workflows/winget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,75 @@ on:

jobs:
publish-winget:
if: github.repository == 'github/copilot-cli'
name: Submit to WinGet repository

# GitHub token permissions needed for winget-create to submit a PR
permissions:
contents: read
pull-requests: write

Comment on lines 12 to 15
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment says the job’s “GitHub token permissions” are needed for winget-create to submit a PR, but the workflow actually uses WINGET_CREATE_GITHUB_TOKEN (a secret/PAT) and the permissions: block now only sets contents: read. Please update the comment to reflect which token needs which permissions (or re-add the permission if it’s still required).

Copilot uses AI. Check for mistakes.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dete red line 14, add the Green line this is the fix

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dete red line 14, add the Green line this is the fix

# winget-create is only supported on Windows
runs-on: windows-latest
timeout-minutes: 30

# winget-create will read the following environment variable to access the GitHub token needed for submitting a PR
# See https://aka.ms/winget-create-token
env:
WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.WINGET_CREATE_GITHUB_TOKEN }}
RELEASE_ASSETS_JSON: ${{ toJSON(github.event.release.assets) }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
IS_PRERELEASE: ${{ github.event.release.prerelease }}

steps:
- name: Validate required secret
shell: pwsh
run: |
if ([string]::IsNullOrWhiteSpace($env:WINGET_CREATE_GITHUB_TOKEN)) {
Write-Error "WINGET_CREATE_GITHUB_TOKEN secret is not configured"
exit 1
}

- name: Submit package using wingetcreate
shell: pwsh
run: |
# Set the package ID based on the release info
$packageId = if ('${{ !github.event.release.prerelease }}' -eq 'true') { 'GitHub.Copilot' } else { 'GitHub.Copilot.Prerelease' }

# Get installer info from release event
$assets = '${{ toJSON(github.event.release.assets) }}' | ConvertFrom-Json
$packageVersion = (${{ toJSON(github.event.release.tag_name) }})

$isPrerelease = ($env:IS_PRERELEASE -eq 'true')
$packageId = if ($isPrerelease) { 'GitHub.Copilot.Prerelease' } else { 'GitHub.Copilot' }

# Get installer info from release event (passed via env to avoid script injection patterns)
$assets = $env:RELEASE_ASSETS_JSON | ConvertFrom-Json
$packageVersion = $env:RELEASE_TAG

# Find the download URLs for the x64 and arm64 installers separately
# This allows overrides to be used so that wingetcreate does not have to guess the architecture from the filename
$installerUrlx64 = $assets | Where-Object -Property name -like '*win32-x64.zip' | Select-Object -ExpandProperty browser_download_url
$installerUrlarm64 = $assets | Where-Object -Property name -like '*win32-arm64.zip' | Select-Object -ExpandProperty browser_download_url


if ([string]::IsNullOrWhiteSpace($installerUrlx64) -or [string]::IsNullOrWhiteSpace($installerUrlarm64)) {
Write-Error "Could not determine installer URLs from release assets"
exit 1
}

# Download wingetcreate (with retries)
$maxRetries = 3
$retryDelaySeconds = 5
for ($i = 1; $i -le $maxRetries; $i++) {
try {
curl.exe -JLO https://aka.ms/wingetcreate/latest
if (Test-Path "wingetcreate.exe") { break }
} catch {
Write-Warning "Download attempt $i failed: $($_.Exception.Message)"
Comment on lines +58 to +66
Copy link

Copilot AI Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The retry loop wraps curl.exe in try/catch, but external executables don’t throw terminating PowerShell exceptions on failure; they set $LASTEXITCODE. This means transient download failures may not be logged as intended, and a non-zero exit can still leave a partial file. Consider using Invoke-WebRequest with -ErrorAction Stop, or explicitly check $LASTEXITCODE/file size and use curl’s --fail/--retry options.

Copilot uses AI. Check for mistakes.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The retry loop wraps curl.exe in try/catch, but external executables don’t throw terminating PowerShell exceptions on failure; they set $LASTEXITCODE. This means transient download failures may not be logged as intended, and a non-zero exit can still leave a partial file. Consider using Invoke-WebRequest with -ErrorAction Stop, or explicitly check $LASTEXITCODE/file size and use curl’s --fail/--retry options.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The retry loop wraps curl.exe in try/catch, but external executables don’t throw terminating PowerShell exceptions on failure; they set $LASTEXITCODE. This means transient download failures may not be logged as intended, and a non-zero exit can still leave a partial file. Consider using Invoke-WebRequest with -ErrorAction Stop, or explicitly check $LASTEXITCODE/file size and use curl’s --fail/--retry options.

Configure

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The retry loop wraps curl.exe in try/catch, but external executables don’t throw terminating PowerShell exceptions on failure; they set $LASTEXITCODE. This means transient download failures may not be logged as intended, and a non-zero exit can still leave a partial file. Consider using Invoke-WebRequest with -ErrorAction Stop, or explicitly check $LASTEXITCODE/file size and use curl’s --fail/--retry options.

Configure

}
Start-Sleep -Seconds $retryDelaySeconds
}

if (-not (Test-Path "wingetcreate.exe")) {
Write-Error "Failed to download wingetcreate after $maxRetries attempts"
exit 1
}

# Update package using wingetcreate
curl.exe -JLO https://aka.ms/wingetcreate/latest
.\wingetcreate.exe update $packageId `
--version $packageVersion `
--version "$packageVersion" `
--urls "$installerUrlx64|x64" "$installerUrlarm64|arm64" `
--submit
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# GitHub Copilot CLI (Public Preview)

## Workflow Status
![Stale Issues](https://github.com/github/copilot-cli/actions/workflows/stale-issues.yml/badge.svg)
![No Response](https://github.com/github/copilot-cli/actions/workflows/no-response.yml/badge.svg)

The power of GitHub Copilot, now in your terminal.

GitHub Copilot CLI brings AI-powered coding assistance directly to your command line, enabling you to build, debug, and understand code through natural language conversations. Powered by the same agentic harness as GitHub's Copilot coding agent, it provides intelligent assistance while staying deeply integrated with your GitHub workflow.
Expand Down
Loading
Loading