-
Notifications
You must be signed in to change notification settings - Fork 0
release: canary → main (31 commits) — Python truth-layer + cross-platform install + 13 bug fixes #191
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
joelteply
wants to merge
47
commits into
main
Choose a base branch
from
canary
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
release: canary → main (31 commits) — Python truth-layer + cross-platform install + 13 bug fixes #191
Changes from all commits
Commits
Show all changes
47 commits
Select commit
Hold shift + click to select a range
51df415
refactor(adapters): iso_to_epoch dedupes BSD/GNU date split (Windows …
joelteply 74cebe2
fix(prereqs): strict python3 probe — Windows Store alias defeats comm…
joelteply 506a911
fix(sidecar): inherit --no-gist flag so tests stop leaking live #gene…
joelteply 3606845
fix(gist): git-clone fallback + |\| true guards under rate-limit (thi…
joelteply 5f5302e
feat(doctor,install): probe sshd readiness + scope strict-probe to py…
joelteply db48e7a
feat(install): auto-install + start sshd during install (close "this …
joelteply 4576c18
fix(sshd-probe): macOS launchctl print system + osascript admin dialo…
joelteply e26913d
fix(doctor): tailscale probe uses resolve_tailscale_bin (catch GUI in…
joelteply 2ea742d
fix(install,doctor): Windows HNS port-22 reservation (continuum's dia…
joelteply 4a81484
fix(parser,prereq): jq is required — fallback parser corrupts gist en…
joelteply 99e3e20
fix(python): AIRC_PYTHON env var replaces broken export -f shim (THE …
joelteply caa0b5e
fix(airc): two PR #164 followups — sed missed line 1372 + harden host…
joelteply 7a14984
feat(airc_core): Python truth-layer foundation + first migration (#15…
joelteply 74560f2
feat(airc_core): migrate config CRUD to airc_core.config (#152 Phase …
joelteply db89174
feat(airc_core): handshake response parser → airc_core.handshake (#15…
joelteply 1536d8f
feat(airc_core): collapse _whois_in_scope + resolve_name + cmd_rename…
joelteply 100dd00
feat(airc_core): joiner handshake send → airc_core.handshake.send (#1…
joelteply 0354658
feat(airc_core): monitor_formatter → airc_core.monitor_formatter (250…
joelteply ee02754
feat(airc_core): host pair-handshake accept_one → airc_core.handshake…
joelteply 088adbc
feat(airc-bash): split — extract platform_adapters.sh as Phase 3 feas…
joelteply 4a38885
fix(airc_core): use argparse --flags for all paths, not env vars (con…
joelteply 27cbd01
feat(airc-bash): extract cmd_doctor — airc under 5000 lines (Phase 3)…
joelteply 1c172f4
fix(airc_core): config set_host_block — close last env-var-pass site …
joelteply 8b55aed
fix(msys): MSYS2_ARG_CONV_EXCL — last layer; cross-machine VERIFIED e…
joelteply dee3b6c
fix(encoding): PYTHONIOENCODING=utf-8 at airc startup (continuum's si…
joelteply 9c08ce4
fix(airc): rename propagates to sibling scopes; cmd_send --internal f…
joelteply e9f3f05
fix(airc): pair-listener parent-watch — orphan-process port-hold (#13…
joelteply b1092fb
ci: clean-install matrix (linux + macos + windows + windows-ps5) (#186)
joelteply b8ce896
fix(windows-install-e2e): real CI prereq path + Tailscale typo + Defa…
joelteply f23c9e2
fix(airc): surface monitor-escalation to stdout + daemon-aware (#184)…
joelteply dbc295b
fix(airc list): hide stale entries by default; --all to show; --prune…
joelteply 116bdef
fix(install.sh): Windows-from-bash works end-to-end (#94 Tailscale, #…
joelteply 6a9c447
fix(install.sh): elevated PS transcript + step-by-step output (Joel: …
joelteply b4699ac
fix(install.sh): ssh-keygen probe — drop --version, bin has no such f…
joelteply c6ddb86
fix(install/airc): elevated transcript path; Tailscale Windows GUI fa…
joelteply 615b57a
fix(install.sh): stage payload as .ps1 file + ssh-keygen -A for hostk…
joelteply 3b0b379
fix(install.sh): auto-run 'gh auth setup-git' so gist ops stop prompt…
joelteply 132b67c
feat(airc daemon): Windows support via HKCU Run-key autostart (no adm…
joelteply 34f354e
fix(airc daemon): scope tracks cwd, not always $HOME/.airc (#201)
joelteply d4c5e60
fix(airc daemon): launcher cd's to cwd, skip AIRC_HOME (kills crashlo…
joelteply 8e9c66d
fix(airc daemon): sentinel-marker for intentional re-exec on Windows …
joelteply 7828437
refactor(airc): _reexec_into helper consolidates 5 exec sites (#205 t…
joelteply c2ab471
refactor: _to_win_path / _to_bash_path helpers (#205 Target #3) (#207)
joelteply 1f6e8d7
refactor(airc): _self_heal_stale_host helper (#205 target 4) — net -2…
joelteply 678d7a5
refactor(airc): _daemon_install_done helper + trim daemon comments (#…
joelteply 264fe06
refactor: set_config_val + parted_rooms unification (#205 target 6, n…
joelteply 19ca947
refactor: unify _daemon_os into detect_platform (#205, net -26) (#211)
joelteply File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,221 @@ | ||
| name: ci | ||
|
|
||
| # Three jobs on every PR + every push to canary/main: | ||
| # | ||
| # clean-install-linux ubuntu install.sh + airc doctor + smoke test | ||
| # clean-install-macos macos install.sh + airc doctor + smoke test | ||
| # clean-install-windows windows install.ps1 + airc doctor (PS-side) | ||
| # | ||
| # Plus on canary/main only (skipped on PR): integration-suite runs the | ||
| # full test/integration.sh on ubuntu — the most thorough gate, but | ||
| # expensive (real gh-gist scenarios + ~5min runtime). | ||
| # | ||
| # The clean-install jobs are the "guarantee installs work from zero" | ||
| # gate Joel asked for (2026-04-28). They run on a stock runner image | ||
| # with no airc preinstalled, exercise install.{sh,ps1} the way a real | ||
| # first-time user would, and validate the binary lands + doctor reports | ||
| # clean. Without these, every Windows install bug (#94, #96, #98, #99) | ||
| # slipped past every PR review and only surfaced when a user hit them. | ||
|
|
||
| on: | ||
| pull_request: | ||
| branches: [canary, main] | ||
| push: | ||
| branches: [canary, main] | ||
|
|
||
| # A previous push's CI gets cancelled if the same branch / PR pushes | ||
| # again. Prevents queue pileup when several PRs land in quick succession. | ||
| concurrency: | ||
| group: ci-${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| clean-install-linux: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Stage install.sh in a temp dir (simulate first-time user) | ||
| # The shipped install.sh clones from the canonical github URL. | ||
| # In CI we want it to install FROM THIS COMMIT, not from main — | ||
| # otherwise we'd be testing the published install.sh against | ||
| # whatever's already on the canonical branch, not the PR. | ||
| # Override AIRC_DIR + skip the clone step by pre-populating | ||
| # the source tree, then run install.sh's PATH/skills wiring. | ||
| run: | | ||
| mkdir -p $HOME/.airc-src | ||
| cp -r . $HOME/.airc-src/ | ||
| # Real install — no AIRC_SKIP_PREREQS. install.sh must | ||
| # detect the package manager and install everything missing. | ||
| AIRC_DIR=$HOME/.airc-src bash install.sh | ||
|
|
||
| - name: airc doctor (must report environment-clean) | ||
| run: | | ||
| export PATH="$HOME/.local/bin:$PATH" | ||
| which airc | ||
| airc doctor | ||
|
|
||
| - name: Smoke — connect --no-room --no-gist + teardown | ||
| run: | | ||
| export PATH="$HOME/.local/bin:$PATH" | ||
| export AIRC_HOME=/tmp/ci-airc/state | ||
| export AIRC_NO_DISCOVERY=1 AIRC_NO_GENERAL=1 AIRC_NO_IDENTITY_PROMPT=1 | ||
| mkdir -p /tmp/ci-airc/state | ||
| # Spawn host in background. --no-gist keeps it offline. | ||
| airc connect --no-room --no-gist > /tmp/ci-airc/host.log 2>&1 & | ||
| # Wait up to 10s for airc.pid to appear (airc writes it once | ||
| # the host loop is up). Don't pgrep on argv — airc's actual | ||
| # process line is `bash /path/to/airc connect ...` and pgrep | ||
| # patterns are brittle across distros. | ||
| for i in 1 2 3 4 5 6 7 8 9 10; do | ||
| [ -f /tmp/ci-airc/state/airc.pid ] && break | ||
| sleep 1 | ||
| done | ||
| if [ ! -f /tmp/ci-airc/state/airc.pid ]; then | ||
| echo "FAIL: airc.pid never appeared — connect didn't reach host loop" | ||
| cat /tmp/ci-airc/host.log || true | ||
| exit 1 | ||
| fi | ||
| # Verify all PIDs in airc.pid are alive. | ||
| for p in $(cat /tmp/ci-airc/state/airc.pid); do | ||
| if ! kill -0 "$p" 2>/dev/null; then | ||
| echo "FAIL: PID $p in airc.pid is not alive" | ||
| cat /tmp/ci-airc/host.log || true | ||
| exit 1 | ||
| fi | ||
| done | ||
| echo "✓ airc connect stayed up (pids: $(cat /tmp/ci-airc/state/airc.pid))" | ||
| airc teardown | ||
| sleep 1 | ||
| # After teardown, airc.pid is removed AND no PID from it should | ||
| # still be alive. We saved the pids before teardown for the | ||
| # post-check. | ||
| if [ -f /tmp/ci-airc/state/airc.pid ]; then | ||
| echo "FAIL: airc teardown left airc.pid behind" | ||
| exit 1 | ||
| fi | ||
| echo "✓ airc teardown clean" | ||
|
|
||
| clean-install-macos: | ||
| runs-on: macos-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Stage install.sh + run (no skip-prereqs — real install path) | ||
| run: | | ||
| mkdir -p $HOME/.airc-src | ||
| cp -r . $HOME/.airc-src/ | ||
| AIRC_DIR=$HOME/.airc-src bash install.sh | ||
|
|
||
| - name: airc doctor (must report environment-clean) | ||
| run: | | ||
| export PATH="$HOME/.local/bin:$PATH" | ||
| which airc | ||
| airc doctor | ||
|
|
||
| - name: Smoke — same as linux (airc.pid based) | ||
| run: | | ||
| export PATH="$HOME/.local/bin:$PATH" | ||
| export AIRC_HOME=/tmp/ci-airc/state | ||
| export AIRC_NO_DISCOVERY=1 AIRC_NO_GENERAL=1 AIRC_NO_IDENTITY_PROMPT=1 | ||
| mkdir -p /tmp/ci-airc/state | ||
| airc connect --no-room --no-gist > /tmp/ci-airc/host.log 2>&1 & | ||
| for i in 1 2 3 4 5 6 7 8 9 10; do | ||
| [ -f /tmp/ci-airc/state/airc.pid ] && break | ||
| sleep 1 | ||
| done | ||
| if [ ! -f /tmp/ci-airc/state/airc.pid ]; then | ||
| echo "FAIL: airc.pid never appeared — connect didn't reach host loop" | ||
| cat /tmp/ci-airc/host.log || true | ||
| exit 1 | ||
| fi | ||
| for p in $(cat /tmp/ci-airc/state/airc.pid); do | ||
| if ! kill -0 "$p" 2>/dev/null; then | ||
| echo "FAIL: PID $p in airc.pid is not alive" | ||
| cat /tmp/ci-airc/host.log || true | ||
| exit 1 | ||
| fi | ||
| done | ||
| echo "✓ airc connect stayed up (pids: $(cat /tmp/ci-airc/state/airc.pid))" | ||
| airc teardown | ||
| sleep 1 | ||
| if [ -f /tmp/ci-airc/state/airc.pid ]; then | ||
| echo "FAIL: airc teardown left airc.pid behind" | ||
| exit 1 | ||
| fi | ||
| echo "✓ airc teardown clean" | ||
|
|
||
| clean-install-windows: | ||
| runs-on: windows-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Run install.ps1 (no skip — real install path via winget) | ||
| shell: pwsh | ||
| run: | | ||
| $env:AIRC_DIR = "$env:USERPROFILE\.airc-src" | ||
| New-Item -ItemType Directory -Force -Path $env:AIRC_DIR | Out-Null | ||
| Copy-Item -Recurse -Force * $env:AIRC_DIR | ||
| # install.ps1 must work from default Windows PowerShell 5.1 | ||
| # too; we test 5.1 path in a separate job below. | ||
| & "$env:AIRC_DIR\install.ps1" | ||
|
|
||
| - name: airc doctor (must report environment-clean) | ||
| shell: pwsh | ||
| run: | | ||
| $env:PATH = "$env:USERPROFILE\AppData\Local\Programs\airc;$env:PATH" | ||
| (Get-Command airc -ErrorAction SilentlyContinue) | Out-String | ||
| airc doctor | ||
| if ($LASTEXITCODE -ne 0) { | ||
| Write-Error "airc doctor failed with exit $LASTEXITCODE" | ||
| exit $LASTEXITCODE | ||
| } | ||
|
|
||
| clean-install-windows-ps5: | ||
| # Validates the bootstrap path under Windows PowerShell 5.1 — the | ||
| # default that ships with Windows. install.ps1 must work from 5.1 | ||
| # to bootstrap pwsh itself (#91 — bootstrap-airc.ps1 fails under | ||
| # PS 5.1 because airc.ps1 has #Requires -Version 7.0). Splitting | ||
| # this into its own job means a 5.1 regression fails loudly without | ||
| # also failing the pwsh-based smoke. | ||
| runs-on: windows-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Run install.ps1 under Windows PowerShell 5.1 (real install) | ||
| shell: powershell | ||
| run: | | ||
| $env:AIRC_DIR = "$env:USERPROFILE\.airc-src-ps5" | ||
| New-Item -ItemType Directory -Force -Path $env:AIRC_DIR | Out-Null | ||
| Copy-Item -Recurse -Force * $env:AIRC_DIR | ||
| & "$env:AIRC_DIR\install.ps1" | ||
|
|
||
| integration-suite: | ||
| # Heavy gate: the full test/integration.sh, including scenarios that | ||
| # hit real gh-gists. Runs on canary/main pushes, NOT on PRs (rate | ||
| # limits + flaky network). When canary→main bundle PRs come up, this | ||
| # already-green status on the canary tip is the signal that cross- | ||
| # branch validation passed. | ||
| if: github.event_name == 'push' | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Stage + install (real install path) | ||
| run: | | ||
| mkdir -p $HOME/.airc-src | ||
| cp -r . $HOME/.airc-src/ | ||
| AIRC_DIR=$HOME/.airc-src bash install.sh | ||
|
|
||
| - name: Run integration suite | ||
| run: | | ||
| export PATH="$HOME/.local/bin:$PATH" | ||
| # Tests that need real gists self-skip without gh auth. The | ||
| # remaining ~85% of the suite covers the local-only scenarios | ||
| # that catch the lion's share of regressions. | ||
| bash test/integration.sh | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1,3 @@ | ||
| .airc/ | ||
| __pycache__/ | ||
| *.pyc |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Workflow header comment says “Three jobs on every PR + every push”, but the workflow now defines four clean-install jobs (linux/macos/windows/windows-ps5) plus integration-suite on push. Update the comment block to match the actual job set so future edits don’t drift based on incorrect docs.