Skip to content

Actually publish to the package managers - #114

Merged
ralyodio merged 1 commit into
mainfrom
fix/distribution-actually-publishes
Sep 24, 2026
Merged

ralyodio merged 1 commit into
mainfrom
fix/distribution-actually-publishes

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

TronBrowser has never reached a single package manager. The channels were
scaffolded on 2026-06-25 and every manifest in distribution/ still said
0.1.0 while releases went out to 3.15.0.

Four things had to be true for a release to ship downstream. None were.

# What was wrong Effect
1 submit-packages.yml listened on release: [published], but release.yml un-drafts with GITHUB_TOKEN, and GitHub raises no workflow events for what a GITHUB_TOKEN does The workflow has zero runs in three months
2 DRY_RUN read github.event.inputs.dry_run, empty on anything but a workflow_dispatch; the guard was != "false" A release run always appended --dry-run, so even a working trigger could not submit
3 Chocolatey was hardcoded --dry-run Could never publish at all
4 There was no submission code — no push, PR or upload anywhere in the script It rewrote files and exited

Plus the refreshed manifests were discarded with the runner, which is why the
tree never moved off 0.1.0.

What this does

  • Trigger: release.yml calls the workflow directly via workflow_call. No PAT needed.
  • Dry-run: resolved from the inputs context and passed explicitly; a release passes dry_run: false. Chocolatey honours the same flag.
  • Manifests persist: refreshed files are opened as a PR, since they are the input to every submission and a stale tree means even a working submit publishes the wrong version.
  • Real submission for the channels we own: homebrew → our tap, scoop → our bucket, AUR over ssh with a generated .SRCINFO (makepkg is not on a runner), Chocolatey via choco push, Snap via snapcraft upload.
  • Honest about the rest: winget, flathub, nixpkgs, gentoo and freebsd are pull requests into someone else's monorepo with a human review queue. They refresh the manifest and print the contributing guide instead of reporting success.

A channel with no secret refreshes its manifest, explains the skip and exits
clean, so this repo (which currently has zero Actions secrets) still goes
green. A channel that has its secret and fails breaks the build — a silent
success is exactly what hid this for three months.

Verified

Ran against the real v3.15.0 release: manifests refresh to 3.15.0, and the
generated AUR sha256sums matches the published tronbrowser-linux-x64.tar.gz
byte for byte (0870fc5f…8779).

Still needs you

Nothing publishes until the credentials exist. Secrets to add to
profullstack/tronbrowser.dev:

Secret Channel Notes
HOMEBREW_TAP_TOKEN homebrew PAT with write to profullstack/homebrew-tap (repo must exist)
SCOOP_BUCKET_TOKEN scoop PAT with write to profullstack/scoop-bucket (repo must exist)
AUR_SSH_KEY aur ssh private key registered on an AUR account owning tronbrowser-bin
CHOCOLATEY_API_KEY chocolatey from the Chocolatey account
SNAPCRAFT_STORE_CREDENTIALS snap snapcraft export-login; also needs the release job to build and pass SNAP_FILE

winget / flathub / nixpkgs / gentoo / freebsd need a one-time upstream
submission by a person before any automation is meaningful.

🤖 Generated with Claude Code

TronBrowser has never reached a single package manager. The channels were
scaffolded on 2026-06-25 and every manifest in distribution/ still said 0.1.0
while releases went out to 3.15.0. Four separate things had to be true for a
release to ship downstream and none of them were.

The trigger never fired. submit-packages.yml listened on `release: [published]`,
but release.yml un-drafts with GITHUB_TOKEN, and GitHub raises no workflow events
for what a GITHUB_TOKEN does. The workflow has zero runs in three months.
release.yml now calls it directly through workflow_call, which needs no PAT.

The dry-run flag was read from `github.event.inputs.dry_run`, which is empty on
anything that is not a workflow_dispatch. The guard was `!= "false"`, so a
release run appended --dry-run every time: even with a working trigger the
submit path could not have executed. Chocolatey was worse, hardcoded --dry-run
with no way to turn it off.

The refreshed manifests were thrown away with the runner. Nothing committed them,
which is why the tree never moved off 0.1.0. They are now opened as a PR, since
those files are the input to every channel's submission and a stale tree means
even a working submit publishes the wrong version.

And there was no submission code at all. The header said submission was "gated on
the relevant secret", but no push, PR or upload existed anywhere in the script --
it rewrote files and exited. Channels we own outright now really publish:
homebrew to our tap, scoop to our bucket, AUR over ssh (with a generated .SRCINFO,
since makepkg is not on a runner), Chocolatey via choco push, Snap via snapcraft
upload. The five that are a pull request into someone else's monorepo (winget,
flathub, nixpkgs, gentoo, freebsd) cannot be automated end to end and now say so
with a link, rather than printing success.

A channel with no secret refreshes its manifest, explains the skip and exits
clean, so a credential-less repo still goes green. A channel that has its secret
and fails is allowed to break the build, because a silent success here is exactly
what hid this for three months.

Verified against the real v3.15.0 release: manifests refresh to 3.15.0 and the
generated AUR sha256 matches the published tarball byte for byte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

ThreatCrush Security Scan

52 finding(s)

HIGH/CRITICAL: 3 | MEDIUM: 28 | LOW: 21

Severity Rule Location
HIGH py-ssrf-outbound-request apps/desktop/launcher/tron-tor-helper:303
HIGH py-ssrf-outbound-request apps/desktop/launcher/tron-tor-helper:437
HIGH sh-remote-script-execution apps/web/public/install.sh:757
MEDIUM js-open-redirect apps/desktop/extensions/ai-sidebar/install-helper.js:156
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:34
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:57
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:237
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:266
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:336
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/options.js:305
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:78
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:166
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:77
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:227
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:569
MEDIUM js-unescaped-html-sink apps/web/public/app.js:29
MEDIUM js-unescaped-html-sink apps/web/public/dns.js:54
MEDIUM sh-remote-script-execution apps/web/public/install.sh:164
MEDIUM sh-remote-script-execution apps/web/public/install.sh:169
MEDIUM sh-remote-script-execution apps/web/public/install.sh:282
MEDIUM sh-remote-script-execution apps/web/public/install.sh:300
MEDIUM sh-remote-script-execution apps/web/public/install.sh:813
MEDIUM sh-remote-script-execution apps/web/public/install.sh:864
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:96
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:168
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:125
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:68
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:73
MEDIUM sql-template-interpolation services/api/src/store/db.ts:116
MEDIUM js-dynamic-code-execution services/api/src/store/scanner.ts:44
MEDIUM sh-predictable-temp-path start.sh:25
LOW js-dynamic-code-execution apps/desktop/extensions/ai-sidebar/pit-proxy.test.js:8
LOW js-dynamic-code-execution packages/agent-runtime/src/analyze/form-script.test.ts:6
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:26
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:49
LOW js-dynamic-code-execution packages/browser-core/src/automation/extract-script.test.ts:6
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:16
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:45
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:57
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:80
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:99
LOW js-dynamic-code-execution packages/browser-core/src/automation/snapshot-script.test.ts:11
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:62
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:101
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:47
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:170
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:216
LOW js-dynamic-code-execution packages/sdk/src/mcp/automate.test.ts:261
LOW secret-generic-api-key packages/storage/src/config.ts:51
LOW secret-generic-credential packages/storage/src/config.ts:51

…and 2 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 491e0fb into main Sep 24, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant