Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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
11 changes: 8 additions & 3 deletions .github/workflows/acig.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,21 @@ jobs:
- name: Get GitHub App token
id: app-token
uses: actions/create-github-app-token@v2
if: ${{ secrets.ACIG_APP_ID != '' && secrets.ACIG_APP_PRIVATE_KEY != '' }}
if: ${{ vars.ACIG_APP_ID != '' }}
with:
app-id: ${{ secrets.ACIG_APP_ID }}
app-id: ${{ vars.ACIG_APP_ID }}
private-key: ${{ secrets.ACIG_APP_PRIVATE_KEY }}

- name: Install acig
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ACIG_VERSION="1.4.1"
ACIG_VERSION=$(curl -sL "https://api.github.com/repos/helloodokai/acig/releases/latest" | grep '"tag_name"' | sed 's/.*v\([0-9.]*\).*/\1/')
if [ -z "$ACIG_VERSION" ]; then
echo "::error::could not determine latest acig version"
exit 1
fi
echo "Using ACIG version ${ACIG_VERSION}"
RELEASE_URL="https://github.com/helloodokai/acig/releases/download/v${ACIG_VERSION}"

curl -sL "${RELEASE_URL}/checksums.txt" -o /tmp/checksums.txt
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,6 @@ Thumbs.db
.acig.toml

# Build
/acig
/acig

.charter.toml
5 changes: 5 additions & 0 deletions .playwright-mcp/console-2026-05-08T14-45-41-864Z.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[ 610ms] [ERROR] Failed to load resource: the server responded with a status of 404 () @ https://github.com/supasympa/opus/pull/420:0
[ 4319ms] [WARNING] The resource https://github.githubassets.com/assets/global-banner-disable-7f8c9b12bd1db3c7.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally. @ https://github.com/supasympa/opus/pull/420:0
[ 2417377ms] [WARNING] The resource https://github.githubassets.com/assets/global-banner-disable-7f8c9b12bd1db3c7.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally. @ https://github.com/supasympa/opus/pull/420:0
[ 3086979ms] [WARNING] The resource https://github.githubassets.com/assets/global-banner-disable-7f8c9b12bd1db3c7.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally. @ https://github.com/supasympa/opus/pull/420:0
[ 3293169ms] [WARNING] The resource https://github.githubassets.com/assets/global-banner-disable-7f8c9b12bd1db3c7.js was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate `as` value and it is preloaded intentionally. @ https://github.com/supasympa/opus/pull/420:0
273 changes: 273 additions & 0 deletions .playwright-mcp/page-2026-05-08T14-45-42-712Z.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
- generic [ref=e2]:
- generic [ref=e3]:
- link "Skip to content" [ref=e4] [cursor=pointer]:
- /url: "#start-of-content"
- banner [ref=e6]:
- heading "Navigation Menu" [level=2] [ref=e7]
- generic [ref=e8]:
- link "Homepage" [ref=e10] [cursor=pointer]:
- /url: /
- img [ref=e11]
- generic [ref=e13]:
- navigation "Global" [ref=e16]:
- list [ref=e17]:
- listitem [ref=e18]:
- button "Platform" [ref=e20] [cursor=pointer]:
- text: Platform
- img [ref=e21]
- listitem [ref=e23]:
- button "Solutions" [ref=e25] [cursor=pointer]:
- text: Solutions
- img [ref=e26]
- listitem [ref=e28]:
- button "Resources" [ref=e30] [cursor=pointer]:
- text: Resources
- img [ref=e31]
- listitem [ref=e33]:
- button "Open Source" [ref=e35] [cursor=pointer]:
- text: Open Source
- img [ref=e36]
- listitem [ref=e38]:
- button "Enterprise" [ref=e40] [cursor=pointer]:
- text: Enterprise
- img [ref=e41]
- listitem [ref=e43]:
- link "Pricing" [ref=e44] [cursor=pointer]:
- /url: https://github.com/pricing
- generic [ref=e45]: Pricing
- generic [ref=e46]:
- button "Search or jump to…" [ref=e49] [cursor=pointer]:
- img [ref=e51]
- generic [ref=e53]:
- link "Sign in" [ref=e54] [cursor=pointer]:
- /url: /login?return_to=https%3A%2F%2Fgithub.com%2Fsupasympa%2Fopus%2Fpull%2F420
- generic [ref=e56]:
- heading "Sign in to GitHub" [level=4] [ref=e57]
- generic [ref=e58]:
- text: Username or email address
- textbox "Username or email address" [active] [ref=e59]
- generic [ref=e60]:
- text: Password
- textbox "Password" [ref=e61]
- link "Forgot password?" [ref=e62] [cursor=pointer]:
- /url: /password_reset
- button "Sign in" [ref=e63] [cursor=pointer]
- link "Sign up" [ref=e64] [cursor=pointer]:
- /url: /signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F_view_fragments%2Fvoltron%2Fpull_requests%2Fshow%2Fsupasympa%2Fopus%2F420%2Fpull_request_layout&source=header
- button "Appearance settings" [disabled] [ref=e67]:
- img
- main [ref=e70]:
- img "404 “This is not the web page you are looking for”" [ref=e74]
- generic [ref=e75]:
- search [ref=e76]:
- generic [ref=e77]: "Find code, projects, and people on GitHub:"
- generic [ref=e78]:
- textbox "Find code, projects, and people on GitHub:" [ref=e79]
- button "Search" [ref=e80] [cursor=pointer]
- generic [ref=e81]:
- link "Contact Support" [ref=e82] [cursor=pointer]:
- /url: https://support.github.com?tags=dotcom-404
- text: —
- link "GitHub Status" [ref=e83] [cursor=pointer]:
- /url: https://githubstatus.com
- text: —
- link "@githubstatus" [ref=e84] [cursor=pointer]:
- /url: https://x.com/githubstatus
- contentinfo [ref=e85]:
- heading "Site-wide Links" [level=2] [ref=e86]
- generic [ref=e88]:
- generic [ref=e89]:
- link "Go to GitHub homepage" [ref=e90] [cursor=pointer]:
- /url: /
- img [ref=e91]
- heading "Subscribe to our developer newsletter" [level=3] [ref=e95]
- paragraph [ref=e96]: Get tips, technical guides, and best practices. Twice a month.
- link "Subscribe" [ref=e97] [cursor=pointer]:
- /url: https://github.com/newsletter
- navigation "Platform" [ref=e98]:
- heading "Platform" [level=3] [ref=e99]
- list [ref=e100]:
- listitem [ref=e101]:
- link "Features" [ref=e102] [cursor=pointer]:
- /url: /features
- listitem [ref=e103]:
- link "Enterprise" [ref=e104] [cursor=pointer]:
- /url: /enterprise
- listitem [ref=e105]:
- link "Copilot" [ref=e106] [cursor=pointer]:
- /url: /features/copilot
- listitem [ref=e107]:
- link "AI" [ref=e108] [cursor=pointer]:
- /url: /features/ai
- listitem [ref=e109]:
- link "Security" [ref=e110] [cursor=pointer]:
- /url: /security
- listitem [ref=e111]:
- link "Pricing" [ref=e112] [cursor=pointer]:
- /url: /pricing
- listitem [ref=e113]:
- link "Team" [ref=e114] [cursor=pointer]:
- /url: /team
- listitem [ref=e115]:
- link "Resources" [ref=e116] [cursor=pointer]:
- /url: https://resources.github.com
- listitem [ref=e117]:
- link "Roadmap" [ref=e118] [cursor=pointer]:
- /url: https://github.com/github/roadmap
- listitem [ref=e119]:
- link "Compare GitHub" [ref=e120] [cursor=pointer]:
- /url: /resources/articles/devops-tools-comparison
- navigation "Ecosystem" [ref=e121]:
- heading "Ecosystem" [level=3] [ref=e122]
- list [ref=e123]:
- listitem [ref=e124]:
- link "Developer API" [ref=e125] [cursor=pointer]:
- /url: https://docs.github.com/get-started/exploring-integrations/about-building-integrations
- listitem [ref=e126]:
- link "Partners" [ref=e127] [cursor=pointer]:
- /url: https://partner.github.com
- listitem [ref=e128]:
- link "Education" [ref=e129] [cursor=pointer]:
- /url: https://github.com/edu
- listitem [ref=e130]:
- link "GitHub CLI" [ref=e131] [cursor=pointer]:
- /url: https://cli.github.com
- listitem [ref=e132]:
- link "GitHub Desktop" [ref=e133] [cursor=pointer]:
- /url: https://desktop.github.com
- listitem [ref=e134]:
- link "GitHub Mobile" [ref=e135] [cursor=pointer]:
- /url: https://github.com/mobile
- listitem [ref=e136]:
- link "GitHub Marketplace" [ref=e137] [cursor=pointer]:
- /url: https://github.com/marketplace
- listitem [ref=e138]:
- link "MCP Registry" [ref=e139] [cursor=pointer]:
- /url: https://github.com/mcp
- navigation "Support" [ref=e140]:
- heading "Support" [level=3] [ref=e141]
- list [ref=e142]:
- listitem [ref=e143]:
- link "Docs" [ref=e144] [cursor=pointer]:
- /url: https://docs.github.com
- listitem [ref=e145]:
- link "Community Forum" [ref=e146] [cursor=pointer]:
- /url: https://github.community
- listitem [ref=e147]:
- link "Professional Services" [ref=e148] [cursor=pointer]:
- /url: https://services.github.com
- listitem [ref=e149]:
- link "Premium Support" [ref=e150] [cursor=pointer]:
- /url: /enterprise/premium-support
- listitem [ref=e151]:
- link "Skills" [ref=e152] [cursor=pointer]:
- /url: https://skills.github.com
- listitem [ref=e153]:
- link "Status" [ref=e154] [cursor=pointer]:
- /url: https://www.githubstatus.com
- listitem [ref=e155]:
- link "Contact GitHub" [ref=e156] [cursor=pointer]:
- /url: https://support.github.com?tags=dotcom-footer
- navigation "Company" [ref=e157]:
- heading "Company" [level=3] [ref=e158]
- list [ref=e159]:
- listitem [ref=e160]:
- link "About" [ref=e161] [cursor=pointer]:
- /url: https://github.com/about
- listitem [ref=e162]:
- link "Why GitHub" [ref=e163] [cursor=pointer]:
- /url: https://github.com/why-github
- listitem [ref=e164]:
- link "Customer stories" [ref=e165] [cursor=pointer]:
- /url: /customer-stories?type=enterprise
- listitem [ref=e166]:
- link "Blog" [ref=e167] [cursor=pointer]:
- /url: https://github.blog
- listitem [ref=e168]:
- link "The ReadME Project" [ref=e169] [cursor=pointer]:
- /url: /readme
- listitem [ref=e170]:
- link "Careers" [ref=e171] [cursor=pointer]:
- /url: https://github.careers
- listitem [ref=e172]:
- link "Newsroom" [ref=e173] [cursor=pointer]:
- /url: /newsroom
- listitem [ref=e174]:
- link "Inclusion" [ref=e175] [cursor=pointer]:
- /url: /about/diversity
- listitem [ref=e176]:
- link "Social Impact" [ref=e177] [cursor=pointer]:
- /url: https://socialimpact.github.com
- listitem [ref=e178]:
- link "Shop" [ref=e179] [cursor=pointer]:
- /url: https://shop.github.com
- generic [ref=e181]:
- navigation "Legal and Resource Links" [ref=e182]:
- list [ref=e183]:
- listitem [ref=e184]:
- text: ©
- time [ref=e185]: "2026"
- text: GitHub, Inc.
- listitem [ref=e186]:
- link "Terms" [ref=e187] [cursor=pointer]:
- /url: https://docs.github.com/site-policy/github-terms/github-terms-of-service
- listitem [ref=e188]:
- link "Privacy" [ref=e189] [cursor=pointer]:
- /url: https://docs.github.com/site-policy/privacy-policies/github-privacy-statement
- link "(Updated 02/2024) 02/2024" [ref=e190] [cursor=pointer]:
- /url: https://github.com/github/site-policy/pull/582
- text: (Updated 02/2024)
- time [ref=e191]: 02/2024
- listitem [ref=e192]:
- link "Sitemap" [ref=e193] [cursor=pointer]:
- /url: /sitemap
- listitem [ref=e194]:
- link "What is Git?" [ref=e195] [cursor=pointer]:
- /url: /git-guides
- listitem [ref=e196]:
- button "Manage cookies" [ref=e198] [cursor=pointer]
- listitem [ref=e199]:
- button "Do not share my personal information" [ref=e201] [cursor=pointer]
- navigation "GitHub's Social Media Links" [ref=e202]:
- list [ref=e203]:
- listitem [ref=e204]:
- link "GitHub on LinkedIn" [ref=e205] [cursor=pointer]:
- /url: https://www.linkedin.com/company/github
- img [ref=e206]
- generic [ref=e208]: GitHub on LinkedIn
- listitem [ref=e209]:
- link "GitHub on Instagram" [ref=e210] [cursor=pointer]:
- /url: https://www.instagram.com/github
- img [ref=e211]
- generic [ref=e213]: GitHub on Instagram
- listitem [ref=e214]:
- link "GitHub on YouTube" [ref=e215] [cursor=pointer]:
- /url: https://www.youtube.com/github
- img [ref=e216]
- generic [ref=e218]: GitHub on YouTube
- listitem [ref=e219]:
- link "GitHub on X" [ref=e220] [cursor=pointer]:
- /url: https://x.com/github
- img [ref=e221]
- generic [ref=e223]: GitHub on X
- listitem [ref=e224]:
- link "GitHub on TikTok" [ref=e225] [cursor=pointer]:
- /url: https://www.tiktok.com/@github
- img [ref=e226]
- generic [ref=e228]: GitHub on TikTok
- listitem [ref=e229]:
- link "GitHub on Twitch" [ref=e230] [cursor=pointer]:
- /url: https://www.twitch.tv/github
- img [ref=e231]
- generic [ref=e233]: GitHub on Twitch
- listitem [ref=e234]:
- link "GitHub’s organization on GitHub" [ref=e235] [cursor=pointer]:
- /url: https://github.com/github
- img [ref=e236]
- generic [ref=e239]: GitHub’s organization on GitHub
- button "English Select language" [ref=e242] [cursor=pointer]:
- generic [ref=e245]:
- img [ref=e246]
- text: English
- generic [ref=e248]: Select language
- img [ref=e249]
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ test:
lint:
golangci-lint run

check: lint test

vet:
go vet ./...

Expand Down
32 changes: 27 additions & 5 deletions internal/cli/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,12 @@ func runRun(cmd *cobra.Command, args []string) error {
fmt.Fprintln(ui.Output(), "")
}

slog.Info("verdict", "decision", v.Decision, "risk", v.Risk, "findings", len(v.Findings), "cost_usd", fmt.Sprintf("%.4f", v.TotalCostUSD))
notesCount := 0
for _, cr := range v.CriticResults {
notesCount += len(cr.Notes)
}

slog.Info("verdict", "decision", v.Decision, "risk", v.Risk, "findings", len(v.Findings), "validation_notes", notesCount, "cost_usd", fmt.Sprintf("%.4f", v.TotalCostUSD))

if showUI {
ui.PrintVerdict(ui.VerdictSummary{
Expand All @@ -186,6 +191,10 @@ func runRun(cmd *cobra.Command, args []string) error {
Suppressions: len(suppressions),
})

if notesCount > 0 {
ui.PrintStep("", fmt.Sprintf("%d validation note(s) — see verdict JSON for details", notesCount))
}

findings := make([]ui.FindingDisplay, len(v.Findings))
for i, f := range v.Findings {
findings[i] = ui.FindingDisplay{
Expand Down Expand Up @@ -254,8 +263,6 @@ func detectBaseSHA() string {
return "unknown"
}



const lastVerdictFile = "/tmp/acig-last-verdict.json"

func writeOutput(v *verdict.Verdict) {
Expand Down Expand Up @@ -323,9 +330,24 @@ func reportToGitHub(ctx context.Context, cfg *config.Config, v *verdict.Verdict,
token := os.Getenv("GITHUB_TOKEN")
client := githubclient.NewClient(token)
reporter := reporters.NewGitHubReporter(client, sha)
if runURL := actionRunURL(); runURL != "" {
reporter.SetRunURL(runURL)
}
return reporter.Report(ctx, v, owner, name, prNumber)
}

// actionRunURL builds the GitHub Actions run URL from environment variables
// set by the runner. Returns empty when not running inside Actions.
func actionRunURL() string {
server := os.Getenv("GITHUB_SERVER_URL")
repo := os.Getenv("GITHUB_REPOSITORY")
runID := os.Getenv("GITHUB_RUN_ID")
if server == "" || repo == "" || runID == "" {
return ""
}
return fmt.Sprintf("%s/%s/actions/runs/%s", server, repo, runID)
}

func detectPRNumber() (int, error) {
eventPath := os.Getenv("GITHUB_EVENT_PATH")
if eventPath == "" {
Expand All @@ -338,7 +360,7 @@ func detectPRNumber() (int, error) {
}

var event struct {
Number int `json:"number"`
Number int `json:"number"`
PullRequest struct {
Number int `json:"number"`
} `json:"pull_request"`
Expand All @@ -365,4 +387,4 @@ func detectSuppressionsPath() string {
return ".acig-suppressions.toml"
}
return strings.TrimSpace(string(out)) + "/.acig-suppressions.toml"
}
}
Loading
Loading