Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
286 commits
Select commit Hold shift + click to select a range
9715885
fix: make detect_editor_cli no-editor case deterministic
c-vigo Feb 25, 2026
137f226
fix(image): run lifecycle commands inside the container via bash
c-vigo Feb 25, 2026
5d61d9e
test: cover bash-wrapped devcontainer lifecycle commands
c-vigo Feb 25, 2026
db7cfdf
docs: update CHANGELOG
c-vigo Feb 25, 2026
afc668f
fix(image): run lifecycle commands inside the container via bash (#205)
c-vigo Feb 25, 2026
0257640
Merge remote-tracking branch 'origin/feature/70-remote-devc-orchestra…
gerchowl Feb 25, 2026
a253baf
fix: make detect_editor_cli no-editor case deterministic (#203)
gerchowl Feb 25, 2026
3e67e1d
chore: import additional worktree justfile for enhanced configuration
gerchowl Feb 26, 2026
b896cb0
Merge branch 'dev' of github.com:vig-os/devcontainer into feature/70-…
gerchowl Feb 26, 2026
93bad08
test: add failing test for terminal.integrated.defaultProfile.linux i…
gerchowl Feb 26, 2026
05cb2aa
fix(workspace): add terminal.integrated.defaultProfile.linux override…
gerchowl Feb 26, 2026
c2d386c
docs: update CHANGELOG for terminal profile override fix
gerchowl Feb 26, 2026
835ed30
fix(workspace): add terminal.integrated.defaultProfile.linux override…
gerchowl Feb 26, 2026
3ffe921
test: add BATS tests for setup-tailscale.sh
gerchowl Feb 26, 2026
50024c4
feat: add setup-tailscale.sh with install and start subcommands
gerchowl Feb 26, 2026
5800ee5
feat: hook setup-tailscale.sh install into post-create.sh
gerchowl Feb 26, 2026
da387ac
feat: hook setup-tailscale.sh start into post-start.sh
gerchowl Feb 26, 2026
8d0e437
docs: add commented Tailscale example to docker-compose.local.yaml
gerchowl Feb 26, 2026
db8c55f
docs: add Tailscale SSH section to devcontainer README
gerchowl Feb 26, 2026
d7741bc
docs: add Tailscale SSH changelog entry
gerchowl Feb 26, 2026
1950910
feat(podman): add push-ssh recipe to transfer images over SSH
gerchowl Feb 26, 2026
6995c39
feat: set default terminal profile to bash in devcontainer.json
gerchowl Feb 26, 2026
9760463
feat(podman): improve push-ssh validation and transfer progress
gerchowl Feb 26, 2026
4602d0a
fix(image): daemonize 'tailscaled' to survive postStartCommand exit
c-vigo Mar 6, 2026
be600dd
chore: merge branch 'dev' into feature/70-remote-devc-orchestration
c-vigo Mar 6, 2026
4fb1fbc
feat(podman): add arch detection and mismatch handling to push-ssh
gerchowl Mar 6, 2026
39850c2
Merge branch 'feature/70-remote-devc-orchestration' of github.com:vig…
gerchowl Mar 6, 2026
b76f3af
docs: add Tailscale SSH design document
gerchowl Mar 6, 2026
d3591e7
feat(remote): add Tailscale key injection and --open/--yes flags
gerchowl Mar 6, 2026
d9dc280
feat(remote): add --open ssh mode with Tailscale wait and connection …
gerchowl Mar 6, 2026
6b82c3b
feat(remote): auto-detect IDE from TERM_PROGRAM with fallback chain
gerchowl Mar 6, 2026
3d8c002
feat: add opt-in Tailscale SSH support to devcontainer (#208) (#211)
c-vigo Mar 7, 2026
30c029f
fix(ci): allow dotfile paths and doc filenames in agent blocklist
gerchowl Mar 7, 2026
9930815
feat(remote): IDE-agnostic --open ssh mode with Tailscale wait (#234)
gerchowl Mar 7, 2026
b041afa
feat(remote): Tailscale key injection and --open/--yes flags (#233)
gerchowl Mar 7, 2026
67a4da6
Merge remote-tracking branch 'origin/dev' into feature/70-remote-devc…
gerchowl Mar 7, 2026
0ea692a
Merge remote-tracking branch 'origin/feature/217-reorganize-scripts-v…
gerchowl Mar 7, 2026
c4c03f3
feat(remote): add container lifecycle execution and compose file parsing
gerchowl Mar 8, 2026
d530de6
feat(remote): add opt-in Claude Code CLI with subscription OAuth auth
gerchowl Mar 8, 2026
0b3f5bc
chore: add .worktrees/ to gitignore
gerchowl Mar 8, 2026
26d3ea7
test(remote): add failing tests for --bootstrap flag and bootstrap flow
gerchowl Mar 8, 2026
88b077f
feat(remote): add --bootstrap for one-time remote host setup with con…
gerchowl Mar 8, 2026
42d3e75
chore: add .worktrees/ to gitignore
gerchowl Mar 8, 2026
83dbb32
test(remote): add failing tests for gh: target arg parsing
gerchowl Mar 8, 2026
00e2664
feat(remote): add gh:org/repo[:branch] arg parsing to parse_args
gerchowl Mar 8, 2026
fd64108
test(remote): add failing tests for remote_clone_project function
gerchowl Mar 8, 2026
5fb12e2
feat(remote): implement remote_clone_project and wire into main pipeline
gerchowl Mar 8, 2026
7702775
docs(remote): add gh: target syntax to help text and changelog
gerchowl Mar 9, 2026
364de3e
Merge branch 'feature/235-bootstrap-remote' into feature/70-remote-de…
gerchowl Mar 9, 2026
4620c39
Merge branch 'feature/236-remote-gh-clone-target' into feature/70-rem…
gerchowl Mar 9, 2026
17ca79f
fix(remote): use sentinels for SSH arg passing in remote_clone_project
gerchowl Mar 9, 2026
9280224
feat(remote): forward GHCR auth on every deploy, not just bootstrap
gerchowl Mar 9, 2026
a6f140a
feat(remote): add --force flag, unpushed commits guard, and just remo…
gerchowl Mar 9, 2026
c209f1d
fix(remote): use real TUN for Tailscale SSH instead of userspace netw…
gerchowl Mar 9, 2026
501b0ef
fix(remote): ensure TUN device config added to existing Tailscale com…
gerchowl Mar 9, 2026
0b0bcef
fix(remote): always regenerate Tailscale key and prefer podman-compose
gerchowl Mar 9, 2026
15120fb
fix(remote): ensure ~/.local/bin in PATH for SSH compose commands
gerchowl Mar 9, 2026
ea3af49
refactor(remote): revert unnecessary podman-compose preference
gerchowl Mar 9, 2026
49c7a4e
feat(remote): pre-flight check for stale local Tailscale
gerchowl Mar 9, 2026
d44cf31
docs: regenerate README and CONTRIBUTE with remote-devc recipe
gerchowl Mar 12, 2026
41b6423
fix(tests): bump expected gh version to 2.88
gerchowl Mar 12, 2026
ac161b6
chore: prepare release 0.3.1
commit-action-bot[bot] Mar 17, 2026
1cef549
fix(ci): sync workspace manifest during release finalization
c-vigo Mar 17, 2026
4591cac
fix(ci): sync manifest mirror in prepare-release changelog commits
c-vigo Mar 17, 2026
451b936
fix(ci): sync changelog manifest in release workflows (#344)
c-vigo Mar 17, 2026
3e496ec
fix(ci): harden release workflow retries for network-sensitive steps
c-vigo Mar 17, 2026
53c6477
fix(ci): harden release workflow retries for network-sensitive steps …
c-vigo Mar 17, 2026
b2e9b37
fix(ci): add artifact-metadata permission for release attestations
c-vigo Mar 17, 2026
e4ebc23
docs(ci): add changelog entry for attestation metadata permission
c-vigo Mar 17, 2026
5b37cb4
fix: add artifact-metadata permission for release attestations (#351)
c-vigo Mar 17, 2026
aa04168
fix(ci): normalize smoke-test workspace ownership after installer
c-vigo Mar 17, 2026
aff43df
fix(ci): probe changelog path writability before ownership repair
c-vigo Mar 17, 2026
44c7205
fix(ci): validate changelog source readability in deploy probe
c-vigo Mar 17, 2026
7d4d7eb
fix(ci): normalize smoke-test workspace ownership after installer (#353)
c-vigo Mar 17, 2026
2683cb0
fix(ci): use status-aware smoke-test release lookup
c-vigo Mar 18, 2026
8ff2205
docs(ci): add changelog entry for release lookup fix
c-vigo Mar 18, 2026
3e5b769
fix(ci): fail fast on non-404 release lookup errors
c-vigo Mar 18, 2026
998f6f7
fix(ci): detect missing release via HTTP status
c-vigo Mar 18, 2026
7e8e10a
fix(ci): use status-aware smoke-test release lookup (#356)
c-vigo Mar 18, 2026
466523b
test(vigutils): add red tests for retry cli
c-vigo Mar 18, 2026
13a3550
feat(vigutils): add bounded retry cli command
c-vigo Mar 18, 2026
9b484ab
fix(ci): use retry cli for setup and image pull steps
c-vigo Mar 18, 2026
2ff89ec
fix(ci): harden release and sync workflows with retry
c-vigo Mar 18, 2026
06e4aab
fix(ci): harden workspace release templates with retry
c-vigo Mar 18, 2026
b8b5304
fix(ci): harden smoke-test dispatch retries and image resolution
c-vigo Mar 18, 2026
1d2dce4
docs(ci): record retry cli rollout in workflows
c-vigo Mar 18, 2026
b5e2c7c
fix(ci): validate tag target and release fallback retry
c-vigo Mar 18, 2026
7b6e155
fix(ci): harden sync workflow retry setup and portability
c-vigo Mar 18, 2026
1f5851d
fix(ci): run sync workflows in container image
c-vigo Mar 18, 2026
21764df
fix(ci): add resolve-image action and vig-os config
c-vigo Mar 18, 2026
e93f9b2
fix(ci): retry remote tag checks in push fallback
c-vigo Mar 18, 2026
992ed2f
fix(vigutils): handle command execution errors in retry CLI
c-vigo Mar 18, 2026
64203ef
fix: harden network retries in CI and release workflows (#359)
c-vigo Mar 18, 2026
13924bb
test(ci): add smoke-test dispatch orchestration assertions
c-vigo Mar 18, 2026
e33948a
ci(ci): redesign smoke-test dispatch release orchestration
c-vigo Mar 18, 2026
3660a68
fix(ci): harden smoke-test dispatch review feedback
c-vigo Mar 19, 2026
125d777
chore(ci): add temporary trivy ignore for CVE-2026-33186
c-vigo Mar 19, 2026
aeefa6a
fix(ci): repair root-owned files after smoke-test installer
c-vigo Mar 19, 2026
c478efe
chore: add temporary trivy ignore for CVE-2026-33186 (#362)
c-vigo Mar 19, 2026
9638e9f
chore: merge branch 'release/0.3.1' into feature/358-redesign-smoke-t…
c-vigo Mar 19, 2026
47952c9
ci(ci): redesign smoke-test dispatch release orchestration (#360)
c-vigo Mar 19, 2026
a78a3dc
fix(ci): ensure release retry steps do not require implicit uv
c-vigo Mar 19, 2026
3aa4f4c
fix(ci): centralize release retry helper via setup-env
c-vigo Mar 19, 2026
a67d541
fix(ci): ensure release retry steps do not require implicit uv (#366)
c-vigo Mar 19, 2026
e9ddd3e
fix(ci): decouple sync workflows from devcontainer image
c-vigo Mar 19, 2026
af86e08
fix(ci): remove upstream .vig-os files and document sync decoupling
c-vigo Mar 19, 2026
b85143e
fix(ci): remove obsolete upstream resolve-image action
c-vigo Mar 19, 2026
bcc80c4
fix(ci): decouple workspace sync workflows from upstream templates
c-vigo Mar 19, 2026
47f848f
refactor(ci): remove downstream release contract handshake
c-vigo Mar 19, 2026
80de687
fix(ci): minimize setup-env footprint in sync workflows
c-vigo Mar 19, 2026
51b5a46
fix(ci): decouple upstream sync workflows from ghcr image dependency …
c-vigo Mar 19, 2026
f92dac4
fix(ci): harden setup-env uv sync retry path
c-vigo Mar 19, 2026
2dbafcb
docs(ci): record uv sync crash recovery fix
c-vigo Mar 19, 2026
a318ad1
fix(ci): simplify uv sync retry control flow
c-vigo Mar 19, 2026
298e397
fix(ci): harden setup-env uv sync retry path (#371)
c-vigo Mar 19, 2026
de38bdf
fix(ci): checkout repository before rollback setup-env
c-vigo Mar 19, 2026
1623556
fix(ci): add rollback contents permission for checkout
c-vigo Mar 19, 2026
2aa8e9f
fix(ci): checkout repository before rollback setup-env (#372)
c-vigo Mar 19, 2026
3113bd0
fix(ci): prevent setup-env BASH_ENV self-source recursion
c-vigo Mar 19, 2026
938aa4d
fix(ci): prevent setup-env BASH_ENV self-source recursion (#375)
c-vigo Mar 19, 2026
aed2806
fix(ci): require checkout before smoke-test setup-env
c-vigo Mar 19, 2026
15855ff
fix: require checkout before smoke-test setup-env (#378)
c-vigo Mar 19, 2026
170c8b5
fix(ci): include resolve-image action in sparse checkout
c-vigo Mar 19, 2026
2c06416
fix(ci): include resolve-image action in sparse checkout (#385)
c-vigo Mar 19, 2026
27891c5
fix(ci): set explicit gh repo context in smoke-test dispatch
c-vigo Mar 19, 2026
ffc4e24
fix(ci): set explicit gh repo context in smoke-test dispatch (#387)
c-vigo Mar 20, 2026
d55cab9
fix(ci): harden smoke-test dispatch workflow contract
c-vigo Mar 20, 2026
6e6ebcd
fix(ci): refine smoke-test preflight diagnostics
c-vigo Mar 20, 2026
d145b29
docs(ci): include release_kind in smoke-test dispatch payload comment
c-vigo Mar 20, 2026
a154152
fix: harden smoke-test dispatch workflow contract (#390)
c-vigo Mar 20, 2026
6829b28
test(ci): assert gh workflow preflight uses --yaml with --ref
c-vigo Mar 20, 2026
eac1bb7
fix(ci): make smoke-test preflight compatible with gh ref validation
c-vigo Mar 20, 2026
22a18d6
test(ci): cover release rollback image and workflow hardening
c-vigo Mar 20, 2026
4843449
fix(ci): harden release workflows for smoke-test orchestration
c-vigo Mar 20, 2026
561828d
fix(ci): force bash shell in workspace container jobs
c-vigo Mar 20, 2026
79723e5
fix(ci): harden rollback failure gate for workspace release
c-vigo Mar 20, 2026
898d880
fix(ci): remove dead --yaml preflight error branch
c-vigo Mar 20, 2026
a265a4d
fix(ci): harden smoke-test preflight and release workflow orchestrati…
c-vigo Mar 20, 2026
ea7808e
docs(ci): document RELEASE_APP actions permission for downstream disp…
c-vigo Mar 20, 2026
a5ef886
docs(ci): add release app permission note to changelog
c-vigo Mar 20, 2026
ebf3986
docs(ci): document release app actions permission for downstream disp…
c-vigo Mar 20, 2026
cc4dcdb
fix(ci): require app tokens in downstream release templates
c-vigo Mar 20, 2026
8c851ea
fix(ci): address copilot follow-ups for release token routing
c-vigo Mar 20, 2026
c3f3d93
fix(ci): require app tokens in downstream release templates (#401)
c-vigo Mar 20, 2026
2818418
fix(ci): create sync branch via git push for CI trigger
c-vigo Mar 20, 2026
373e56c
fix(ci): split smoke-test dispatch into two-phase orchestration
c-vigo Mar 20, 2026
54f86b7
test(ci): add phase 2 tests and update phase 1 dispatch assertions
c-vigo Mar 21, 2026
5c3f585
fix(ci): fail on missing release-kind label in phase 2 validation
c-vigo Mar 21, 2026
c8a3ad6
docs: align 0.3.1 smoke-test notes with CHANGELOG sync removal
c-vigo Mar 21, 2026
0a71f72
fix(ci): split smoke-test dispatch into two-phase orchestration (#404)
c-vigo Mar 21, 2026
ec93e79
fix(ci): dispatch CI after sync-main-to-dev PR creation
c-vigo Mar 21, 2026
5864c40
fix(ci): dispatch sync PR CI before auto-merge for all PRs
c-vigo Mar 21, 2026
99efd68
fix(ci): remove post-PR workflow_dispatch CI trigger
c-vigo Mar 21, 2026
60ae67a
fix(ci): remove sync-main-to-dev workflow_dispatch CI trigger (#406)
c-vigo Mar 22, 2026
0c49fe5
fix(ci): retry setup-env uv install on transient download failure
c-vigo Mar 22, 2026
eefc95a
fix(ci): retry setup-env uv install on transient download failure (#411)
c-vigo Mar 22, 2026
c801766
fix(ci): detect sync-main-to-dev conflicts with merge-tree
c-vigo Mar 22, 2026
c2d2e70
fix: sync-main-to-dev conflict detection with merge-tree (#412)
c-vigo Mar 22, 2026
fedb863
fix(ci): smoke-test deploy uses workspace changelog scaffold
c-vigo Mar 23, 2026
71ee226
fix(ci): smoke-test deploy changelog chown and first Changed inject
c-vigo Mar 23, 2026
42d1712
fix(ci): stop injecting deploy line into smoke-test CHANGELOG
c-vigo Mar 23, 2026
aa6b434
fix(ci): smoke-test deploy uses workspace changelog scaffold (#415)
c-vigo Mar 23, 2026
6b7e039
ci(ci): bump the actions-minor-patch group with 4 updates
dependabot[bot] Mar 23, 2026
31dde78
build(deps): bump @devcontainers/cli from 0.84.0 to 0.84.1
dependabot[bot] Mar 23, 2026
21e5876
docs: record dependabot bumps for 0.3.1
c-vigo Mar 23, 2026
59962c0
ci(ci): dependabot actions and devcontainers/cli for release 0.3.1 (#…
c-vigo Mar 23, 2026
8645f3a
test(vigutils): add failing specs for prepare-changelog unprepare
c-vigo Mar 23, 2026
c066372
feat(vigutils): implement prepare-changelog unprepare
c-vigo Mar 23, 2026
0376023
fix(ci): sync smoke-test workspace CHANGELOG via prepare-changelog un…
c-vigo Mar 23, 2026
d831089
fix(ci): remove redundant changelog remap from smoke-test dispatch
c-vigo Mar 23, 2026
d81067b
docs: add CHANGELOG entry for smoke-test prepare-release fix
c-vigo Mar 23, 2026
29ae816
docs(vigutils): document prepare-changelog unprepare
c-vigo Mar 23, 2026
38f2e5b
fix(ci): align bats test with actual workflow changelog validation
c-vigo Mar 23, 2026
ea7d6ce
test: align smoke root CHANGELOG assertions with unprepare
c-vigo Mar 23, 2026
9eb7292
fix: restore smoke-test workspace changelog for prepare-release (#418)
c-vigo Mar 23, 2026
1b5ca5d
fix(ci): merge smoke-test release phase 2 into repository dispatch
c-vigo Mar 23, 2026
bc214ea
fix(ci): align merge-release-pr gh env and drop unused trigger-releas…
c-vigo Mar 23, 2026
8f8b60f
fix(ci): merge smoke-test release phase 2 into repository dispatch (#…
c-vigo Mar 23, 2026
2c73914
fix(ci): harden downstream release validate and rollback context
c-vigo Mar 23, 2026
1076398
fix: harden downstream release validate and rollback context (#422)
c-vigo Mar 23, 2026
d3d81bc
test: update expected uv minor line in image tests
c-vigo Mar 24, 2026
42ce087
test(image): expect just 1.48.x in container tests
c-vigo Mar 24, 2026
dc28eb3
test: align container image checks with uv and just release lines (#424)
c-vigo Mar 24, 2026
affc154
fix(image): add jq to devcontainer image
c-vigo Mar 24, 2026
aad2fef
fix: add jq to devcontainer image (#426)
c-vigo Mar 24, 2026
0f84364
chore(ci): bump commit-action to v0.2.0
c-vigo Mar 24, 2026
9a3ac5b
chore(ci): bump commit-action to v0.2.0 (#429)
c-vigo Mar 24, 2026
0f8109e
fix(ci): approve release PR with GITHUB_TOKEN before release dispatch
c-vigo Mar 24, 2026
b451a2e
ci: strict shell and approval failure hint in dispatch approve step
c-vigo Mar 24, 2026
27b1289
fix: approve smoke-test release PR before downstream release (#431)
c-vigo Mar 24, 2026
7424460
fix(image): make cursor-agent install resilient to CDN failures
c-vigo Mar 25, 2026
ff34cef
fix(image): harden cursor-agent install retry loop
c-vigo Mar 25, 2026
1aafb81
fix(build): make cursor-agent install resilient to Cursor CDN failure…
c-vigo Mar 25, 2026
794076a
fix(ci): enable commit-action MAX_ATTEMPTS for transient ref failures
c-vigo Mar 25, 2026
51ad6c6
fix(ci): enable commit-action MAX_ATTEMPTS for transient ref failures…
c-vigo Mar 25, 2026
8ef2bce
fix(ci): accept bot PR approval when reviewDecision is empty
c-vigo Mar 25, 2026
50abef9
fix(ci): tighten bot-approval fallback per review feedback
c-vigo Mar 25, 2026
41258db
fix(ci): slurp paginated PR reviews before jq count
c-vigo Mar 25, 2026
a1bcd94
fix(ci): accept bot PR approval when reviewDecision is empty (#439)
c-vigo Mar 25, 2026
2aedc0e
test: add smoke test for dispatch RC number output wiring
c-vigo Mar 25, 2026
0e7b874
test: add smoke test for workspace release rc-number input
c-vigo Mar 25, 2026
632d22b
fix(ci): pass RC number from dispatch to downstream release
c-vigo Mar 25, 2026
5478b95
docs: document RC number passthrough for cross-repo gate
c-vigo Mar 25, 2026
2cb7957
fix(ci): align error message and comment wording per review
c-vigo Mar 25, 2026
a23aa66
fix(ci): align downstream candidate RC with upstream dispatch tag (#442)
c-vigo Mar 25, 2026
f9c931b
chore: sync issues and PRs
commit-action-bot[bot] Mar 25, 2026
567a0b8
fix(ci): fail validate when GitHub Release already exists
c-vigo Mar 25, 2026
22b74cf
fix(ci): fail closed when release existence check hits API errors
c-vigo Mar 25, 2026
27ff18e
fix(ci): fail validate when GitHub Release already exists (#445)
c-vigo Mar 25, 2026
8784c10
chore(ci): remove PR Title Check workflow
c-vigo Mar 25, 2026
3b23b36
chore(vigutils): remove validate-commit-msg --subject-only
c-vigo Mar 25, 2026
4a9b2fb
test(vigutils): align minimal chore test with rstrip parsing
c-vigo Mar 25, 2026
281456a
chore(ci): remove PR Title Check and validate-commit subject-only mod…
c-vigo Mar 26, 2026
1bb5f78
feat(ci): draft final releases, idempotent tags, and forward-fix roll…
c-vigo Mar 26, 2026
495e767
fix(ci): add lightweight-tag fallback and deduplicate release view call
c-vigo Mar 26, 2026
83b2323
ci: Align release automation with draft finals and forward-fix rollba…
c-vigo Mar 26, 2026
5bd0444
fix(ci): use H1 release title and drop Release Content in PR bodies
c-vigo Mar 26, 2026
6f79003
fix(ci): use H1 release title and drop Release Content in PR bodies (…
c-vigo Mar 26, 2026
622568e
fix(ci): coerce tag_already_exists for workspace release publish
c-vigo Mar 26, 2026
be51ce5
chore(image): expect GitHub CLI 2.89 in image version checks
c-vigo Mar 26, 2026
11bc8e9
fix: coerce workspace release tag_already_exists for workflow_call (#…
c-vigo Mar 26, 2026
ef7eb6e
chore: sync issues and PRs
commit-action-bot[bot] Mar 26, 2026
c639954
chore: release 0.3.1 (#342)
c-vigo Mar 26, 2026
2dc33c4
chore: merge main into feature/70-remote-devc-orchestration
gerchowl Mar 27, 2026
fb5b578
fix(remote): add ~/.local/bin to PATH in bootstrap build heredoc
gerchowl Mar 27, 2026
8540109
fix(remote): sanitize underscores in Tailscale hostname and preserve …
gerchowl Mar 27, 2026
9dfecb1
feat(remote): resolve Claude OAuth token from macOS keychain
gerchowl Mar 27, 2026
89311d1
feat(remote): resolve all secrets from macOS keychain at deploy time
gerchowl Mar 27, 2026
3d0b2b3
fix(remote): use sanitize_dns_label for Tailscale hostname pattern match
gerchowl Mar 27, 2026
b34f530
fix(remote): always run compose up to detect config changes
gerchowl Mar 27, 2026
18ef4e6
fix(lifecycle): make dependency sync non-fatal in post-create/post-start
gerchowl Mar 27, 2026
20f61df
fix(remote): detect container recreate by comparing container IDs
gerchowl Mar 27, 2026
345f2fe
fix(remote): filter compose provider banner from container ID capture
gerchowl Mar 27, 2026
f3759ac
fix(remote): handle apt clock skew in Tailscale install
gerchowl Mar 27, 2026
d7e056e
fix(remote): install Tailscale from its own repo only to avoid clock …
gerchowl Mar 27, 2026
77062e0
fix(remote): handle apt clock skew in Claude Code Node.js install
gerchowl Mar 27, 2026
3f8d177
fix(remote): add nodesource repo directly to avoid clock skew
gerchowl Mar 27, 2026
22af8d8
fix(remote): add --yes to gpg dearmor to overwrite existing keyring
gerchowl Mar 27, 2026
dc9035a
fix(remote): update all repos with clock-skew tolerance for Node.js deps
gerchowl Mar 27, 2026
5539fd0
fix(remote): ignore apt-get update exit 100 from clock-skewed repos
gerchowl Mar 27, 2026
6224e5f
feat(remote): add cl/cld aliases in container for both root and claud…
gerchowl Mar 29, 2026
896e130
fix(remote): source OAuth token from PID 1 in claude wrapper
gerchowl Mar 29, 2026
93cfb4c
fix(remote): allocate PTY in claude wrapper for interactive TUI
gerchowl Mar 29, 2026
b3d837a
feat(remote): sync local Claude Code config into container on deploy
gerchowl Mar 29, 2026
146e5c7
feat(remote): skip Claude Code onboarding screen in container
gerchowl Mar 29, 2026
82124fb
fix(remote): add hasCompletedAuthFlow to skip login screen
gerchowl Mar 29, 2026
d51f347
feat(remote): pre-configure workspace trust and dangerous mode skip
gerchowl Mar 29, 2026
f2a69e1
feat(remote): add --add-dir \$PWD to claude wrapper for workspace trust
gerchowl Mar 29, 2026
a1b7fa0
fix(remote): pre-set workspace trust in both .claude.json and project…
gerchowl Mar 29, 2026
a39b1cd
feat(image): bundle agent-CLI toolkit + TUI debug stack + Claude Code
gerchowl May 15, 2026
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
161 changes: 150 additions & 11 deletions .github/actions/setup-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@
# - hadolint (for Containerfile linting in pre-commit)
# - BATS + helper libraries (for shell script testing)
#
# IMPORTANT: The caller must checkout the repository before using this action.
# This action does NOT checkout code, allowing callers to control ref, token,
# persist-credentials, and other checkout options.
# IMPORTANT:
# - This action does NOT checkout code, allowing callers to control ref, token,
# persist-credentials, and other checkout options.
# - Checkout is only required for operations that read repository files
# (for example, sync-dependencies or devcontainer CLI version lookup).
#
# Inputs:
# install-python: Install Python (default: true)
# python-version: Python version fallback when pyproject.toml is unavailable (default: '3.12')
# sync-dependencies: Run uv sync to install project deps (default: false)
# install-podman: Install podman (default: false)
# install-node: Install Node.js (default: false)
Expand All @@ -25,10 +29,15 @@
# uv-version: The version of uv that was installed
#
# Usage:
# # Minimal (Python + uv only)
# # Default (Python + uv only)
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-env
#
# # uv only (skip Python setup)
# - uses: ./.github/actions/setup-env
# with:
# install-python: 'false'
#
# # With project dependencies
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-env
Expand All @@ -47,6 +56,14 @@ name: 'Setup Environment'
description: 'Set up CI environment with Python, uv, and optional tools (podman, Node.js, devcontainer CLI, hadolint, BATS)'

inputs:
install-python:
description: 'Install Python runtime'
required: false
default: 'true'
python-version:
description: 'Python version fallback when pyproject.toml is unavailable'
required: false
default: '3.12'
sync-dependencies:
description: 'Run uv sync to install project dependencies'
required: false
Expand Down Expand Up @@ -87,31 +104,145 @@ inputs:
outputs:
uv-version:
description: 'Version of uv installed'
value: ${{ steps.setup-uv.outputs.uv-version }}
value: ${{ steps.setup-uv-retry.outputs.uv-version || steps.setup-uv.outputs.uv-version }}

runs:
using: composite
steps:
# ── Python ───────────────────────────────────────────────────────────
- name: "Set up Python"
- name: "Set up Python from pyproject"
if: inputs.install-python == 'true' && hashFiles('pyproject.toml') != ''
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version-file: "pyproject.toml"

- name: "Set up Python fallback"
if: inputs.install-python == 'true' && hashFiles('pyproject.toml') == ''
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: ${{ inputs.python-version }}

# ── uv ─────────────────────────────────────────────────────────────
- name: Install uv
id: setup-uv
continue-on-error: true
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7
with:
enable-cache: true
# Install a specific version of uv.
version: "0.10.0"

- name: Wait before retrying uv install
if: steps.setup-uv.outcome == 'failure'
shell: bash
run: sleep 15

- name: Install uv (retry)
id: setup-uv-retry
if: steps.setup-uv.outcome == 'failure'
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7
with:
enable-cache: true
# Install a specific version of uv.
version: "0.10.0"

# ── retry() shell helper ───────────────────────────────────────────
- name: Export retry helper function
shell: bash
run: |
set -euo pipefail
RETRY_HELPER="$RUNNER_TEMP/setup-env-retry.sh"
PREV_BASH_ENV="${BASH_ENV:-}"

cat > "$RETRY_HELPER" <<'EOF'
retry() {
local retries=3
local backoff=1
local max_backoff=60
local rc=1

while [ "$#" -gt 0 ]; do
case "$1" in
--retries)
retries="$2"
shift 2
;;
--backoff)
backoff="$2"
shift 2
;;
--max-backoff)
max_backoff="$2"
shift 2
;;
--)
shift
break
;;
*)
echo "ERROR: Unknown retry option '$1'"
return 2
;;
esac
done

if [ "$#" -eq 0 ]; then
echo "ERROR: retry requires a command after '--'"
return 2
fi

local attempt=1
local current_backoff="$backoff"
while [ "$attempt" -le "$retries" ]; do
if "$@"; then
return 0
fi
rc=$?
if [ "$attempt" -lt "$retries" ]; then
local wait="$current_backoff"
if [ "$wait" -gt "$max_backoff" ]; then
wait="$max_backoff"
fi
echo "Retry $attempt/$retries failed (exit $rc), waiting ${wait}s..."
sleep "$wait"
current_backoff=$((current_backoff * 2))
fi
attempt=$((attempt + 1))
done

echo "ERROR: Command failed after $retries attempts: $*"
return "$rc"
}
export -f retry
EOF

if [ -n "$PREV_BASH_ENV" ] && [ -f "$PREV_BASH_ENV" ] && [ "$PREV_BASH_ENV" != "$RETRY_HELPER" ]; then
{
echo "source \"$PREV_BASH_ENV\""
cat "$RETRY_HELPER"
} > "${RETRY_HELPER}.merged"
mv "${RETRY_HELPER}.merged" "$RETRY_HELPER"
fi

echo "BASH_ENV=$RETRY_HELPER" >> "$GITHUB_ENV"

# ── Python dependencies ───────────────────────────────────────────────
- name: Sync Python dependencies
if: inputs.sync-dependencies == 'true'
shell: bash
run: uv sync --frozen --all-extras
run: |
set -euo pipefail

if uv sync --frozen --all-extras; then
:
else
rc=$?
echo "WARNING: uv sync failed (exit $rc), clearing cache and .venv before retry..."
uv cache clean
rm -rf .venv
echo "Retrying uv sync..."
uv sync --frozen --all-extras
fi

# ── Podman ──────────────────────────────────────────────────────────
- name: Install podman
Expand Down Expand Up @@ -162,8 +293,10 @@ runs:
BIN_FILE="hadolint-${ARCH}"
SHA_FILE="${BIN_FILE}.sha256"

curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
curl -fsSL "${BASE_URL}/${SHA_FILE}" -o "${SHA_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${SHA_FILE}" -o "${SHA_FILE}"

EXPECTED_SHA="$(awk '{print $1}' "${SHA_FILE}")"
echo "${EXPECTED_SHA} ${BIN_FILE}" | sha256sum -c -
Expand All @@ -189,11 +322,17 @@ runs:
;;
esac

TAPLO_VERSION="$(curl -fsSL https://api.github.com/repos/tamasfe/taplo/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')"
TAPLO_VERSION="$(retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL https://api.github.com/repos/tamasfe/taplo/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')"
if [ -z "${TAPLO_VERSION:-}" ]; then
echo "ERROR: Failed to resolve Taplo version from GitHub releases API"
exit 1
fi
BASE_URL="https://github.com/tamasfe/taplo/releases/download/${TAPLO_VERSION}"
BIN_FILE="taplo-linux-${ARCH}.gz"

curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
gunzip "${BIN_FILE}"
sudo install -m 0755 "taplo-linux-${ARCH}" /usr/local/bin/taplo
rm -f "taplo-linux-${ARCH}"
Expand Down
17 changes: 2 additions & 15 deletions .github/actions/test-image/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,21 +125,8 @@ runs:
echo "Pulling image: $IMAGE_TAG"

# Retry logic for podman pull (network flakiness)
RETRIES=3
for i in $(seq 1 $RETRIES); do
if podman pull "$IMAGE_TAG"; then
echo "Image pulled successfully"
break
else
if [ $i -lt $RETRIES ]; then
echo "Pull failed, retrying ($i/$RETRIES)..."
sleep 3
else
echo "Pull failed after $RETRIES attempts"
exit 1
fi
fi
done
uv run retry --retries 3 --backoff 3 --max-backoff 3 -- podman pull "$IMAGE_TAG"
echo "Image pulled successfully"

- name: Verify image is available
if: inputs.image-source == 'local'
Expand Down
1 change: 1 addition & 0 deletions .github/actions/test-project/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ runs:
run: |
uv run pytest \
tests/test_utils.py \
tests/test_devc_remote_uri.py \
packages/vig-utils/tests \
--cov --cov-report=term-missing --cov-report=xml \
$TEST_ARGS
Expand Down
2 changes: 1 addition & 1 deletion .github/agent-blocklist.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Canonical blocklist for AI agent identity fingerprints.
# Referenced by: validate-commit-msg, pre-commit hooks, pr-title-check CI.
# Referenced by: validate-commit-msg, pre-commit hooks.
# Refs: #163

[patterns]
Expand Down
63 changes: 63 additions & 0 deletions .github/pr-draft-236-into-70.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
## Description

Add `gh:org/repo[:branch]` target syntax to `devc-remote.sh`, enabling one-command clone-and-start of a project's devcontainer on a remote host. Existing `host:path` syntax continues to work unchanged.

## Type of Change

- [x] `feat` -- New feature
- [ ] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- `scripts/devc-remote.sh` — Extended `parse_args` to recognize `gh:org/repo[:branch]` as second positional arg; new `remote_clone_project` function (single SSH call: clone or fetch, optional branch checkout, config-based path resolution); wired into `main()` between `check_ssh` and `remote_preflight`; updated help text with new syntax and examples
- `assets/workspace/scripts/devc-remote.sh` — Synced copy via manifest
- `tests/bats/devc-remote.bats` — 7 new tests: 4 for arg parsing (gh:org/repo, gh:org/repo:branch, host:path+gh:, invalid gh:), 3 for clone function (fresh clone, fetch existing, branch checkout)
- `CHANGELOG.md` — Added entry under Unreleased

## Changelog Entry

### Added
- **`gh:org/repo[:branch]` target for devc-remote** ([#236](https://github.com/vig-os/devcontainer/issues/236))
- Clone a GitHub repo on the remote host and start its devcontainer in one command
- Supports `gh:org/repo` (default branch) and `gh:org/repo:branch` (specific branch)
- Already-cloned repos are fetched, not re-cloned
- Clone location resolved from remote config `projects_dir` or overridden via `host:path`

## Testing

- [x] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit `docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[Unreleased]` section (and pasted the entry above)
- [x] My changes generate no new warnings or errors
- [x] I have added tests that prove my fix is effective or that my feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published

## Additional Notes

Design: https://github.com/vig-os/devcontainer/issues/236#issuecomment-4019537584

Refs: #236
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,9 @@ jobs:
sync-dependencies: 'true'

- name: Install safety
run: uv pip install safety==3.7.0
run: |
set -euo pipefail
uv run retry --retries 3 --backoff 5 --max-backoff 30 -- uv pip install safety==3.7.0

- name: Run Bandit (Python security linting)
id: bandit
Expand Down Expand Up @@ -311,7 +313,7 @@ jobs:

- name: Upload SARIF to GitHub Security
if: always()
uses: github/codeql-action/upload-sarif@0d579ffd059c29b07949a3cce3983f0780820c98 # v4
uses: github/codeql-action/upload-sarif@38697555549f1db7851b81482ff19f1fa5c4fedc # v4
with:
sarif_file: trivy-results.sarif
category: 'container-image'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Initialize CodeQL
uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98 # v4
uses: github/codeql-action/init@38697555549f1db7851b81482ff19f1fa5c4fedc # v4
with:
languages: ${{ matrix.language }}

- name: Run CodeQL analysis
uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98 # v4
uses: github/codeql-action/analyze@38697555549f1db7851b81482ff19f1fa5c4fedc # v4
with:
category: '/language:${{ matrix.language }}'
Loading