mirror of
https://github.com/Twigpine/node.git
synced 2026-11-09 05:20:05 -10:00
* ci(release): add Windows target and cross-platform packaging
Add x86_64-pc-windows-msvc to the release matrix. Windows ships a .zip
(7z) while unix keeps .tar.gz; a portable sha256 helper handles
sha256sum/shasum/certutil. Smoke test and packaging now resolve the
.exe suffix on Windows. Release attach uses globs to cover both formats.
* feat(release): vendor npm wrapper and auto-publish to npm
Vendor the @gitlawb/gl npm wrapper (optionalDependencies platform-package
pattern) into npm/, replacing the standalone gl-npm repo. A new npm-publish
job downloads the four unix release tarballs from the GitHub release, lays in
the binaries, stamps every package.json with the release version, and runs
npm publish --provenance. Guarded on NPM_TOKEN so it no-ops until the secret
is configured.
* feat(release): auto-bump Homebrew tap on release
Add a homebrew-bump job that regenerates Formula/gl.rb in Gitlawb/homebrew-tap
from the release tarballs' sha256 checksums (macOS+Linux, arm64+x64) and pushes
the bump. Guarded on HOMEBREW_TAP_PAT so it no-ops until the secret and tap repo
exist. Enables 'brew install gitlawb/tap/gl'.
* feat(release): Windows installer and web auto-sync on release
Add install.ps1 (Windows PowerShell installer, source of truth in node).
Add a web-sync job that opens a PR to Gitlawb/web on each release syncing
install.sh + install.ps1 + public/version.json, plus idempotent drift fixes
(remove orphaned public/bin, fix stale skill.md releases link). Guarded on
WEB_SYNC_PAT. Vercel deploys on merge.
* docs(readme): document npm, Homebrew, and Windows install methods
* ci(release): build only CLI binaries on Windows
The gitlawb-node daemon targets Linux/macOS; building it on Windows risks
a compile failure that would block the whole release (npm/brew/web jobs all
depend on release-binaries). Windows now builds only gl + git-remote-gitlawb;
the smoke-test and package loops follow the per-target binary list.
* fix(release): reconcile release-please manifest with v0.3.9 and bump action to v5
The manifest still said 0.3.8 while the only tag is a manual v0.3.9 and
Cargo.toml is 0.3.9, so release-please had no valid baseline (no v0.3.8 tag)
and never cut a release. Set the manifest to 0.3.9 so release-please diffs
v0.3.9..main and opens a proper release PR for the next version. Also pin
release-please-action to v5.0.0 to match the openclaude pipeline.
* ci(release): set explicit minimal permissions on homebrew-bump and web-sync
CodeQL flagged both jobs for lacking a permissions block, leaving GITHUB_TOKEN
at broad default scopes. Both only need contents: read (cross-repo writes use
dedicated PATs).
* fix(release): harden installers and workflow per review
- install.ps1: fail closed if the .sha256 cannot be fetched; pure ASCII (no BOM)
- npm install.js: fail (exit 1 / throw) when the platform payload or a binary is
missing instead of reporting a successful but broken install
- workflow: top-level permissions {} + persist-credentials: false on read-only
checkouts
- docs: PowerShell-only Windows note; text language tag on npm/README fenced block
* fix(installer): require core CLI binaries on Windows
install.ps1 only failed when zero binaries were present, so a partial archive
missing gl.exe could still report success. Require gl.exe + git-remote-gitlawb.exe
(gitlawb-node.exe stays optional, matching the Windows build) and fail early if a
required binary is absent.
* ci(release): make Windows non-blocking and stop persisting cross-repo PATs
- release-binaries: continue-on-error for the Windows leg so a failure there
no longer fails the job or blocks npm/Homebrew (matches the best-effort intent)
- homebrew-bump/web-sync: persist-credentials: false on the PAT-backed checkouts;
supply the token only on the git push via an x-access-token URL
* fix(release): gate web-sync on binaries and detect native arch in installer
- web-sync now needs release-binaries so the site never advertises a release
whose artifacts failed to build
- install.ps1 reads PROCESSOR_ARCHITEW6432 before PROCESSOR_ARCHITECTURE so a
32-bit PowerShell host on x64 Windows is not wrongly rejected
* ci(release): make npm publish idempotent across reruns
Skip any @gitlawb package version already on the registry so rerunning the
job after a partial publish no longer errors on the first existing package
and leaves the wrapper/platform packages out of sync.
* fix(release): harden web-sync and tap commit per review
- web-sync: verify the Windows ZIP + .sha256 exist on the release before
syncing install.ps1/version.json (Windows is best-effort, so a failed leg
must not make the site advertise a missing installer)
- stage generated files before the no-op check so brand-new untracked files
(formula, version.json) are committed instead of skipped
- gh pr create: only swallow the 'PR already exists' case; surface auth/API errors
- npm README: scope npm/yarn/pnpm/bun install to macOS/Linux/WSL, point native
Windows at the PowerShell installer
* ci(release): guard npm-publish before doing any work
Check NPM_TOKEN in an up-front guard step (like homebrew-bump/web-sync) and
skip checkout, release downloads, extraction, version rewrites, and publish
when it is absent, instead of doing all that work and bailing in Publish.
* fix(release): robust web PR error handling and Windows installer hardening
- web-sync: capture gh pr list output so a real API/auth failure surfaces
instead of being misread as 'PR already exists'
- install.ps1: enforce TLS 1.2 and use -UseBasicParsing so downloads work on
stock Windows PowerShell 5.1; remove binaries no longer shipped on upgrade so
an in-place update can't leave a mixed-version install; handle an empty user
PATH without a leading separator
125 lines
4.5 KiB
PowerShell
125 lines
4.5 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
gitlawb installer for Windows - downloads pre-built binaries from GitHub Releases.
|
|
.EXAMPLE
|
|
irm https://gitlawb.com/install.ps1 | iex
|
|
.EXAMPLE
|
|
& ([scriptblock]::Create((irm https://gitlawb.com/install.ps1))) -Version v0.3.9
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[string]$Version = "latest"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# Windows PowerShell 5.1 may default to TLS 1.0; GitHub requires TLS 1.2+.
|
|
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
|
|
|
|
$Repo = if ($env:GITLAWB_RELEASE_REPO) { $env:GITLAWB_RELEASE_REPO } else { "Gitlawb/node" }
|
|
$InstallDir = if ($env:GITLAWB_INSTALL_DIR) { $env:GITLAWB_INSTALL_DIR } else { "$env:LOCALAPPDATA\Programs\gitlawb" }
|
|
|
|
$arch = if ($env:PROCESSOR_ARCHITEW6432) {
|
|
$env:PROCESSOR_ARCHITEW6432
|
|
} else {
|
|
$env:PROCESSOR_ARCHITECTURE
|
|
}
|
|
if ($arch -ne "AMD64") {
|
|
throw "Unsupported architecture: $arch. Only x64 Windows binaries are published. Use WSL for arm64."
|
|
}
|
|
$target = "x86_64-pc-windows-msvc"
|
|
|
|
if ($Version -eq "latest") {
|
|
Write-Host "Fetching latest release version..."
|
|
$rel = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest" -UseBasicParsing -Headers @{ "User-Agent" = "gitlawb-installer" }
|
|
$tag = $rel.tag_name
|
|
} elseif ($Version.StartsWith("v")) {
|
|
$tag = $Version
|
|
} else {
|
|
$tag = "v$Version"
|
|
}
|
|
$ver = $tag.TrimStart("v")
|
|
|
|
$archive = "gitlawb-node-$ver-$target.zip"
|
|
$url = "https://github.com/$Repo/releases/download/$tag/$archive"
|
|
|
|
Write-Host "Installing gitlawb $tag for windows/x64"
|
|
Write-Host " Archive: $archive"
|
|
Write-Host " Into: $InstallDir"
|
|
|
|
$tmp = Join-Path ([System.IO.Path]::GetTempPath()) ("gitlawb-" + [System.Guid]::NewGuid().ToString("N"))
|
|
New-Item -ItemType Directory -Path $tmp | Out-Null
|
|
try {
|
|
$zipPath = Join-Path $tmp $archive
|
|
Write-Host "Downloading..."
|
|
Invoke-WebRequest -Uri $url -OutFile $zipPath -UseBasicParsing -Headers @{ "User-Agent" = "gitlawb-installer" }
|
|
|
|
# Verify checksum. Every published asset has a matching .sha256, so fail closed
|
|
# if it cannot be fetched rather than installing an unverified binary.
|
|
$sumPath = "$zipPath.sha256"
|
|
Invoke-WebRequest -Uri "$url.sha256" -OutFile $sumPath -UseBasicParsing -Headers @{ "User-Agent" = "gitlawb-installer" }
|
|
$expected = ((Get-Content $sumPath -Raw).Trim() -split '\s+')[0].ToLower()
|
|
$actual = (Get-FileHash $zipPath -Algorithm SHA256).Hash.ToLower()
|
|
if ($expected -ne $actual) {
|
|
throw "checksum mismatch! expected $expected got $actual"
|
|
}
|
|
Write-Host " checksum OK"
|
|
|
|
Write-Host "Extracting..."
|
|
$extract = Join-Path $tmp "extract"
|
|
Expand-Archive -Path $zipPath -DestinationPath $extract -Force
|
|
$pkgDir = Get-ChildItem -Path $extract -Directory | Select-Object -First 1
|
|
|
|
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
|
|
# The Windows archive always ships the two CLI binaries; the daemon is optional.
|
|
$requiredBins = @("gl.exe", "git-remote-gitlawb.exe")
|
|
$optionalBins = @("gitlawb-node.exe")
|
|
$missing = $requiredBins | Where-Object {
|
|
-not (Test-Path (Join-Path $pkgDir.FullName $_))
|
|
}
|
|
if ($missing.Count -gt 0) {
|
|
throw "archive is missing required binaries: $($missing -join ', ')"
|
|
}
|
|
|
|
$installed = @()
|
|
foreach ($bin in $requiredBins + $optionalBins) {
|
|
$src = Join-Path $pkgDir.FullName $bin
|
|
if (Test-Path $src) {
|
|
Copy-Item -Path $src -Destination (Join-Path $InstallDir $bin) -Force
|
|
$installed += $bin
|
|
}
|
|
}
|
|
|
|
# Drop binaries no longer shipped (e.g. an optional one removed in a new release)
|
|
# so an upgrade in place never leaves a stale, mixed-version install behind.
|
|
foreach ($bin in $requiredBins + $optionalBins) {
|
|
if ($installed -notcontains $bin) {
|
|
$dst = Join-Path $InstallDir $bin
|
|
if (Test-Path $dst) { Remove-Item -Path $dst -Force }
|
|
}
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host "Installed gitlawb $tag"
|
|
foreach ($bin in $installed) { Write-Host " $bin -> $InstallDir\$bin" }
|
|
}
|
|
finally {
|
|
Remove-Item -Recurse -Force $tmp -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
# Add to the user PATH if missing.
|
|
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
|
|
if (($userPath -split ';') -notcontains $InstallDir) {
|
|
$newPath = if ([string]::IsNullOrEmpty($userPath)) { $InstallDir } else { "$userPath;$InstallDir" }
|
|
[Environment]::SetEnvironmentVariable("Path", $newPath, "User")
|
|
Write-Host ""
|
|
Write-Host "Added $InstallDir to your PATH. Restart your terminal, then run:"
|
|
} else {
|
|
Write-Host ""
|
|
Write-Host "Run:"
|
|
}
|
|
Write-Host " gl doctor"
|
|
Write-Host " gl quickstart"
|
|
Write-Host ""
|
|
Write-Host "Docs: https://docs.gitlawb.com"
|