Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
230 commits
Select commit Hold shift + click to select a range
98b4c94
Add license checks and heritage scripts
ryanmelt Sep 27, 2026
f80460d
fix(cmd-tlm-api): read message logs incrementally
ryanmelt Sep 28, 2026
829e4db
fix(store): bound read_topics XREAD count by default
ryanmelt Sep 28, 2026
c915027
fix(operator): report process metrics for every microservice
jmthomas Sep 29, 2026
f10d411
docs(upgrading): explain tsdb migration error handling and cleanup
jmthomas Sep 29, 2026
e725432
fix(questdb): route info messages through the logger when present
jmthomas Sep 29, 2026
29a9071
fix(plugin): publish RUNNING status before exec
jmthomas Sep 29, 2026
e1937c8
fix(admin): wait for version history info before modified plugin dialog
jmthomas Oct 1, 2026
2753fa8
fix(models): raise config error for invalid MAP_TARGET enabled state
ryanmelt Oct 4, 2026
a7410fc
fix(models): start python raw logging for LOG_STREAM with no params
ryanmelt Oct 4, 2026
6f1951d
fix(python): decode ruby json_class Float NaN and Infinity values
ryanmelt Oct 4, 2026
4f02be2
fix(packets): drop given values of obfuscated items on obfuscate
ryanmelt Oct 4, 2026
d5202ef
fix(microservices): log connection error backtraces once per message
ryanmelt Oct 4, 2026
7885f59
fix(topics): identify routed commands against the routed target
ryanmelt Oct 4, 2026
4109bea
fix(interfaces): reject commands when a write protocol requests disco…
ryanmelt Oct 4, 2026
2c4fc57
fix(topics): write python command and decom stored flag as lowercase
ryanmelt Oct 4, 2026
c2c42d3
feat(interfaces): queue redis writes by default at 0.1s interval
jmthomas Oct 7, 2026
d850432
docs(protocols): document ccsds protocols plugin
jmthomas Oct 9, 2026
0cf4ac4
docs(conversions): use System.telemetry.packet for cross-packet reads
jmthomas Oct 9, 2026
b2f65fb
fix(python): treat zero green low limit as a defined limit
jmthomas Oct 9, 2026
e606de1
perf(packets): reduce memory of large cmd/tlm definitions
jmthomas Oct 9, 2026
0e80108
perf(packets): avoid per-item allocations in packet definitions
jmthomas Oct 9, 2026
9990f10
perf(python): cut packet item memory and state parsing cost
jmthomas Oct 9, 2026
c33c1a8
fix(review): apply Claude review fixes (turn 1)
github-actions[bot] Oct 9, 2026
e91e1c1
fix(review): apply Codex review fixes (turn 2)
github-actions[bot] Oct 9, 2026
4ca05dd
fix(microservices): reset logged connection errors on connect
ryanmelt Oct 10, 2026
421d490
fix(review): apply Claude review fixes (turn 1)
github-actions[bot] Oct 10, 2026
e01961d
Merge pull request #4032 from OpenC3/ai-review/pr-3998-38018577445
ryanmelt Oct 10, 2026
90b4158
Merge branch 'main' into reduce_cmd_tlm_memory
jmthomas Oct 11, 2026
1419b3e
Address findings and allow building plugin
jmthomas Oct 11, 2026
9459f19
Merge pull request #4030 from OpenC3/ai-review/pr-4015-38000332622
jmthomas Oct 11, 2026
bbd527d
fix(operator): address process metrics review feedback
jmthomas Oct 11, 2026
12d9e8c
fix(review): apply Claude review fixes (turn 1)
github-actions[bot] Oct 11, 2026
12d9b84
fix(review): apply Codex review fixes (turn 2)
github-actions[bot] Oct 11, 2026
3761363
Merge pull request #4035 from OpenC3/ai-review/pr-4027-38182945088
jmthomas Oct 11, 2026
7c2e8de
fix(packets): drop reserved item descriptions when descriptions is false
jmthomas Oct 11, 2026
171ebe3
fix(scripts): address CI and review findings in license/heritage tools
ryanmelt Oct 12, 2026
6d1c2e8
fix(review): apply Claude review fixes (turn 1)
github-actions[bot] Oct 12, 2026
8ed0393
Merge pull request #4037 from OpenC3/ai-review/pr-3950-38202506048
ryanmelt Oct 12, 2026
a65eee3
Merge branch 'main' into fix/read-topics-count
ryanmelt Oct 12, 2026
4cce91c
fix(script runner): stop goto from the debug prompt deadlocking
jmthomas Oct 12, 2026
733ddf8
Merge branch 'main' into reduce_cmd_tlm_memory
jmthomas Oct 13, 2026
e32e87c
Merge branch 'main' into reduce_cmd_tlm_memory
jmthomas Oct 13, 2026
fad4684
docs(protocols): clarify ccsds framing vs helper layers and scid exam…
jmthomas Oct 13, 2026
55ee931
Merge branch 'main' into interface_queued_default
jmthomas Oct 13, 2026
9ce0cf7
docs(interfaces): clarify UPDATE_INTERVAL only queues raw stream writes
jmthomas Oct 13, 2026
02d8b20
Merge branch 'main' into fix_python_green_low_limits
jmthomas Oct 13, 2026
5bb15b4
fix(python): keep zero green limits set at runtime
jmthomas Oct 13, 2026
224ce66
fix(review): apply Claude review fixes (turn 1)
github-actions[bot] Oct 13, 2026
f581e6a
fix(review): apply Codex review fixes (turn 2)
github-actions[bot] Oct 13, 2026
005a27d
Merge pull request #4027 from OpenC3/reduce_cmd_tlm_memory
jmthomas Oct 13, 2026
aa0724a
Merge pull request #4056 from OpenC3/ai-review/pr-3959-38456200586
jmthomas Oct 13, 2026
63ce7fa
feat(packet viewer): implement fuzzy search with typo tolerance (#3941)
calmonroe Oct 13, 2026
291d61e
fix(store): write through to the store after StoreQueued shutdown
jmthomas Oct 13, 2026
0b732f0
Merge branch 'main' into conversion_system_packet
jmthomas Oct 13, 2026
5ce05c3
docs(conversions): scope cross-packet reads to read conversions
jmthomas Oct 13, 2026
1e0d41d
build(openc3-ruby): update anycable-go binaries to go1.26.9
jmthomas Oct 13, 2026
e6c34d0
build(openc3-ruby): add anycable-go build script and update skill
jmthomas Oct 13, 2026
cfd0798
docs(skills): add missing upstream remote and stop pushing fork main
jmthomas Oct 13, 2026
0d98fda
style(openc3-ruby): use [[ ]] for tests in build-anycable.sh
jmthomas Oct 13, 2026
ceca063
Merge pull request #3992 from OpenC3/fix/interface-handle-enabled-error
jmthomas Oct 13, 2026
86d0dd5
Bump traefik to 3.7.14
jmthomas Oct 14, 2026
20d2f84
Merge pull request #4058 from OpenC3/traefik
jmthomas Oct 14, 2026
7c320fa
Bump versitygw to 1.9.0
jmthomas Oct 14, 2026
28c797c
Merge pull request #3944 from OpenC3/license_and_heritage_scripts
jmthomas Oct 14, 2026
5b57d82
Update versity tar.gz
jmthomas Oct 14, 2026
30fab66
fix(microservices): harden interface reconnect and shutdown (#4001)
ryanmelt Oct 14, 2026
e2caaa9
align error message references to function name
EmilyRagan Oct 14, 2026
6981a0a
align ruby filter behavior with python
EmilyRagan Oct 14, 2026
5b6deda
test plugin_list
EmilyRagan Oct 14, 2026
31cf219
fix(get_interface): set status to UNKNOWN if no status exists
calmonroe Oct 14, 2026
27fa931
fix(get_router): set status to UNKNOWN if no status exists
calmonroe Oct 14, 2026
740aa76
test(get_interface): add test coverage for interface DNE and status U…
calmonroe Oct 14, 2026
0dd5fcf
test(get_router): add test coverage for router DNE and status UNKNOWN
calmonroe Oct 14, 2026
b3bc2f9
test cleanup
EmilyRagan Oct 14, 2026
b547db7
fix(interfaces): stop stale python periodic cmd thread on reconnect (…
ryanmelt Oct 14, 2026
2ef8dfe
build(deps): bump the npm group across 2 directories with 13 updates
dependabot[bot] Oct 14, 2026
bc5a4bf
build(deps): bump the github-actions group across 1 directory with 9 …
dependabot[bot] Oct 14, 2026
10b52f4
fix(bucketexplorer): stream volume downloads to support files over 2GB
jmthomas Oct 15, 2026
d3f3c3d
docs(sr): Remove references to stale prop (from COSMOS 4) (#4069)
clayandgen Oct 15, 2026
661877a
Automated Doc Build Change
clayandgen Oct 15, 2026
5691369
Merge pull request #4003 from OpenC3/fix/router-unknown-commands
jmthomas Oct 15, 2026
6545c91
Merge pull request #4060 from OpenC3/versity
EmilyRagan Oct 15, 2026
03e0839
Merge pull request #4073 from OpenC3/dependabot/github_actions/github…
EmilyRagan Oct 15, 2026
fd4d9c2
Merge pull request #4071 from OpenC3/dependabot/npm_and_yarn/openc3-c…
EmilyRagan Oct 15, 2026
ddc23c3
Run the malicious code scan as part of AI Review
ryanmelt Oct 15, 2026
5616f71
Merge pull request #4077 from OpenC3/ai-review-runs-malicious-scan
ryanmelt Oct 15, 2026
ba7c1bf
docs(sr): Include Version History docs (#4068)
clayandgen Oct 15, 2026
09fda57
Automated Doc Build Change
clayandgen Oct 15, 2026
d669187
Merge branch 'main' into interface_queued_default
jmthomas Oct 15, 2026
5924c68
Merge branch 'main' into fix/debug-goto-deadlock
jmthomas Oct 15, 2026
b0224e9
Fix sonarqube
jmthomas Oct 15, 2026
864c56c
Merge pull request #4025 from OpenC3/fix_python_green_low_limits
jmthomas Oct 15, 2026
a7551ef
Merge pull request #4024 from OpenC3/conversion_system_packet
jmthomas Oct 15, 2026
8a4816b
docs(protocols): fix ccsds cltu/tctf write order and qualify claims
jmthomas Oct 15, 2026
c7fa355
Automated Doc Build Change
jmthomas Oct 15, 2026
f5ac997
Merge pull request #3988 from OpenC3/fix_modified_plugin_dialog_info_…
jmthomas Oct 15, 2026
fca1e55
Merge pull request #3995 from OpenC3/fix/python-log-stream-config
jmthomas Oct 15, 2026
9c4bc0f
Merge pull request #3946 from OpenC3/fix/message-log-reader-incremental
jmthomas Oct 15, 2026
c50c9f0
Allow setting MC_IMAGE for upgrade script
ryan-pratt Oct 15, 2026
254ac9b
Merge branch 'main' into fix/interface-write-disconnect-ack
ryanmelt Oct 15, 2026
a8292f5
fix(operator): isolate process metric failures per microservice
jmthomas Oct 15, 2026
6065953
fix(store): drain StoreQueued before switching to direct writes
jmthomas Oct 15, 2026
c299c0e
fix(metric): allow None for MetricModel values type hint
jmthomas Oct 15, 2026
f2c67b4
Merge pull request #4057 from OpenC3/anycable-go1.26.9
jmthomas Oct 15, 2026
ba23233
Merge branch 'main' into fix/interface-connection-error-logging
jmthomas Oct 15, 2026
3b7d743
fix(microservices): key logged errors on type and keep them across re…
jmthomas Oct 15, 2026
d011ca5
fix(microservices): match Ruby errno lists for expected network errors
jmthomas Oct 16, 2026
72194b7
Merge pull request #3998 from OpenC3/fix/obfuscate-given-values
ryanmelt Oct 16, 2026
3b3dcb3
Merge pull request #3997 from OpenC3/fix/python-json-float-additions
ryanmelt Oct 16, 2026
efd580b
fix(script runner): keep script variables for cross-file debug goto
jmthomas Oct 16, 2026
c9856d1
Merge pull request #3959 from OpenC3/fix/operator-process-metrics
jmthomas Oct 16, 2026
a44037d
Automated Doc Build Change
jmthomas Oct 16, 2026
1762d5a
build(anycable): install anycable-go only in the API images
EmilyRagan Oct 16, 2026
2dcee41
ci(build-cosmos): hash openc3-anycable into API image cache keys
EmilyRagan Oct 16, 2026
5971595
build(anycable): point update tooling at openc3-anycable
EmilyRagan Oct 16, 2026
3ded1cf
Merge pull request #4067 from OpenC3/align-plugin_list
EmilyRagan Oct 16, 2026
0ae42b4
exclude files/folders with these names at any depth within openc3 fro…
EmilyRagan Oct 1, 2026
ee07116
ignore more local stuff
EmilyRagan Oct 1, 2026
40d7d99
remove unused array
EmilyRagan Oct 15, 2026
f24e2ea
extract default plugin list to a yaml file and a util class
EmilyRagan Oct 15, 2026
e1dbe8b
default flag on plugins/all, use in UI
EmilyRagan Oct 15, 2026
0796433
sort by localeCompare names
EmilyRagan Oct 15, 2026
32ea355
use default plugins source for UI testing
EmilyRagan Oct 15, 2026
f6f49c3
let the endpoint handle filtering out default plugins
EmilyRagan Oct 15, 2026
9871dc8
Merge pull request #4078 from OpenC3/docs/migration-init
ryan-pratt Oct 16, 2026
d5548a8
Automated Doc Build Change
ryan-pratt Oct 16, 2026
1f2db9a
fix(build): relock uv against PYPI_URL so air-gapped builds resolve
mcosgriff Sep 17, 2026
cc44508
build(python): disable source builds during uv sync
mcosgriff Sep 17, 2026
8a27f90
fix(build): allow building the local Python project
mcosgriff Sep 17, 2026
a73cc20
fix(build): preserve PyPI mirror during selective rebuilds
mcosgriff Sep 17, 2026
50c086a
fix(build): force the relock to resolve only from the PYPI_URL mirror
mcosgriff Sep 18, 2026
00abee1
fix(docker): install uv from the PYPI_URL mirror
mcosgriff Sep 23, 2026
2d189dd
chore: remove build logs committed by mistake
mcosgriff Sep 23, 2026
c04d75b
test(docker): add air-gapped PYPI_URL mirror build test script
mcosgriff Sep 23, 2026
e88bb8e
fix(docker): harden the uv pip install in openc3-ruby images
mcosgriff Sep 23, 2026
91b9d97
chore: remove build-ubi.log committed by mistake
mcosgriff Sep 23, 2026
b4467c0
feat(cli): include uv.lock in generated target gemspec files
mcosgriff Oct 12, 2026
c3e074e
fix(build): keep UV_INSECURE_HOST out of runtime images
mcosgriff Oct 12, 2026
f9536cb
fix(build): skip uv relock when base image lacks the helper
mcosgriff Oct 12, 2026
d1be186
fix(build): reuse relocked uv.lock for the openc3 application sync
mcosgriff Oct 12, 2026
8411efc
fix(build): drop --no-build from the openc3 dependency sync
mcosgriff Oct 12, 2026
3ed3efc
docs(build): note plugin gems ship the build-time mirror lockfile
mcosgriff Oct 12, 2026
efd0c42
fix(build): normalize trailing slashes in PYPI_URL
mcosgriff Oct 12, 2026
a6a25ea
fix(build): keep host-generated mirror lockfiles as committed
mcosgriff Oct 12, 2026
c8790a2
fix(cli): indent python dependency block in generated target gemspec
mcosgriff Oct 12, 2026
4d0440f
style(cli): revert unrelated rubocop reformatting in cli_generator
mcosgriff Oct 12, 2026
99bcee8
refactor(build): replace UV_INSECURE_HOST with OPENC3_PYPI_ALLOW_INSE…
mcosgriff Oct 12, 2026
995b77c
refactor(build): rename UV_VERSION to OPENC3_UV_VERSION
mcosgriff Oct 12, 2026
284f0fe
fix(build): trust insecure pypi mirror in uv relock and sync steps
mcosgriff Oct 12, 2026
bc613fe
fix(cli): avoid nesting gemspec rewrite for each python target
mcosgriff Oct 12, 2026
713a2ab
fix(build): honor deprecated PIP_ENABLE_TRUSTED_HOST at build time
mcosgriff Oct 12, 2026
03362ff
fix(build): compare and log mirror url without credentials
mcosgriff Oct 12, 2026
df91681
fix(build): forbid sdist builds in the openc3-base mirror relock
mcosgriff Oct 12, 2026
5e7f33b
style(cli): drop unused block parameter in gemspec rewrite
mcosgriff Oct 12, 2026
2022ea3
fix(build): forbid sdist builds in the openc3-base dependency sync
mcosgriff Oct 12, 2026
020ef06
build(deps): bump uv to 0.12.24
mcosgriff Oct 12, 2026
6d64b47
fix(cli): leave the python plugin template gemspec unrewritten
mcosgriff Oct 12, 2026
14bfb77
fix(build): keep mirror relock downloads out of the shipped uv cache
mcosgriff Oct 12, 2026
1657443
fix(build): fail when a mirror is set but the relock helper is missing
mcosgriff Oct 12, 2026
3ec9755
docs(pypi): pass --no-config --no-sources in the host-side uv lock ex…
mcosgriff Oct 12, 2026
e64d925
fix(build): install uv-mirror-relock executable regardless of source …
mcosgriff Oct 12, 2026
ad35900
docs(pypi): warn against credentials in PYPI_URL
mcosgriff Oct 12, 2026
fe05ec9
fix(build): default PYPI_URL in the UBI build script
mcosgriff Oct 12, 2026
cb5a9ae
fix(build): drop a trailing slash from PYPI_URL in UV_DEFAULT_INDEX
mcosgriff Oct 12, 2026
9cab9bc
docs(pypi): tie the unlocked install fallback to a missed locked install
mcosgriff Oct 13, 2026
c64afad
fix(cli): upgrade legacy python_dep_file gemspecs to ship uv.lock
mcosgriff Oct 13, 2026
83fb9dc
fix(plugins): drop a trailing slash from pypi_url before adding /simple
jmthomas Oct 15, 2026
7ad1f7f
Merge pull request #4081 from OpenC3/pypi-url-trailing-slash
mcosgriff Oct 16, 2026
2f7f56f
Automated Doc Build Change
mcosgriff Oct 16, 2026
d963ec2
Merge pull request #4079 from OpenC3/centralize-default-plugins-list
EmilyRagan Oct 16, 2026
222c0b6
Merge pull request #3986 from OpenC3/dockerignore
EmilyRagan Oct 16, 2026
3dfbf95
fix(cmd-tlm-api): wait for streaming threads to exit in kill (#3947)
ryanmelt Oct 16, 2026
e6f1ec4
test(router api): lint and naming cleanup
calmonroe Oct 16, 2026
0e45bbc
fix(router api): align router does not exist error message w/ ruby er…
calmonroe Oct 16, 2026
dd2894a
Merge pull request #4004 from OpenC3/fix/interface-write-disconnect-ack
ryanmelt Oct 17, 2026
fd58426
Merge pull request #3999 from OpenC3/fix/interface-connection-error-l…
ryanmelt Oct 17, 2026
3a72d9a
fix(vue-common): detect jpeg, gif, and bmp plugin images
ryanmelt Oct 19, 2026
f02c612
fix(command sender): treat Ignore Range Checks as hazardous and resto…
calmonroe Oct 19, 2026
946ddc1
simplify logic
calmonroe Oct 19, 2026
637b19f
fix(interfaces): apply update interval to lazily created telemetry sh…
jmthomas Oct 19, 2026
ff73e6f
docs(protocols): add ccsds aos protocol and correct sdls auth mask
jmthomas Oct 19, 2026
77f85a9
Merge pull request #4049 from OpenC3/fix/debug-goto-deadlock
jmthomas Oct 19, 2026
e85768a
Bump traefik to 3.7.15
jmthomas Oct 19, 2026
58d654c
ci(trivy): fall back across DB mirrors and bump trivy to v0.76.0
jmthomas Oct 19, 2026
0a19f12
docs(interfaces): document DB_SHARD and DONT_LOG and fix router modif…
ryanmelt Oct 19, 2026
0b0b73b
Automated Doc Build Change
calmonroe Oct 19, 2026
2cc94e5
Merge pull request #4093 from OpenC3/traefik-3.7.15
jmthomas Oct 19, 2026
7b7a2f8
Merge remote-tracking branch 'origin/main' into interface_queued_default
jmthomas Oct 19, 2026
b66364d
Merge remote-tracking branch 'origin/main' into fix/stream-volume-dow…
jmthomas Oct 19, 2026
02244ac
Merge remote-tracking branch 'origin/main' into docs/ccsds-protocols
jmthomas Oct 19, 2026
8ffb5c6
build(anycable): copy anycable-go by TARGETARCH before API source
jmthomas Oct 19, 2026
da53467
Merge pull request #4094 from OpenC3/anycable-api-images-copy
EmilyRagan Oct 19, 2026
8e2e38c
update comments
EmilyRagan Oct 19, 2026
e826f7a
Merge branch 'main' into anycable-api-images-only
EmilyRagan Oct 19, 2026
b3a89cb
Merge pull request #4005 from OpenC3/fix/python-topics-stored-lowercase
mcosgriff Oct 19, 2026
47b7416
fix(router/interface api): write get_or_default method to grab interf…
calmonroe Oct 19, 2026
8d6f993
test all living python versions
EmilyRagan Oct 19, 2026
6d3c0c2
fix(get_or_default): cleanup dict defaulting
calmonroe Oct 19, 2026
5c44bc0
Merge pull request #3950 from OpenC3/fix/read-topics-count
mcosgriff Oct 19, 2026
330ba74
ci(trivy): authenticate vex hub fetch and report scan errors separately
jmthomas Oct 19, 2026
9a56982
Merge pull request #4070 from OpenC3/4028-get_interface-raise-error-w…
mcosgriff Oct 19, 2026
ebd086d
Merge pull request #4083 from OpenC3/anycable-api-images-only
EmilyRagan Oct 19, 2026
035ce90
"gate" jobs
EmilyRagan Oct 19, 2026
962b1a7
ci(trivy): pre-fetch vex hub instead of letting trivy call the github…
jmthomas Oct 20, 2026
d907828
ci(trivy): restrict vex hub downloads to https
jmthomas Oct 20, 2026
2ff9253
ci(trivy): pin vex hub to a commit fetched with git
jmthomas Oct 20, 2026
0629a5e
ci(trivy): keep trivy-action's cache from overwriting the vex hub
jmthomas Oct 20, 2026
f0b26b3
Merge pull request #4074 from OpenC3/fix/stream-volume-downloads
jmthomas Oct 20, 2026
f255453
feat(script-runner): expose bucket and path from open_bucket_dialog (…
jmthomas Oct 21, 2026
fdd4de3
if targets are skipped, microservices using those targets should not …
EmilyRagan Oct 21, 2026
2719bdf
Merge pull request #4091 from OpenC3/fix/plugin-image-mime-detection
ryanmelt Oct 21, 2026
045dc50
Merge pull request #4023 from OpenC3/docs/ccsds-protocols
jmthomas Oct 21, 2026
9faf3b8
fix(store): apply interface UPDATE_INTERVAL to every db shard
jmthomas Oct 21, 2026
7a3e116
Merge pull request #4104 from OpenC3/ci/trivy-ubi-vex-token
jmthomas Oct 21, 2026
812a9fd
build(deps): bump the github-actions group with 4 updates
dependabot[bot] Oct 21, 2026
000d7e3
Merge pull request #4015 from OpenC3/interface_queued_default
jmthomas Oct 21, 2026
5fc49ea
Merge pull request #4127 from OpenC3/dependabot/github_actions/github…
jmthomas Oct 21, 2026
67100af
Merge pull request #4119 from OpenC3/update-demo-plugin-txt
EmilyRagan Oct 22, 2026
659b039
remove python 3.15 for now
EmilyRagan Oct 22, 2026
1d4b174
Update certifi to v2026.10.19
mcosgriff Oct 22, 2026
ff3a363
Drop Python 3.10 support
jmthomas Oct 22, 2026
a7a6c0d
Merge pull request #4105 from OpenC3/ci-required-checks
jmthomas Oct 22, 2026
b7f0ae0
Merge pull request #4134 from OpenC3/update_certifi_to_resolve_cve
jmthomas Oct 22, 2026
eab2995
Drop python 3.15 for now
jmthomas Oct 22, 2026
44249cd
Merge remote-tracking branch 'origin/main' into drop-python-3.10
jmthomas Oct 22, 2026
5d110b0
refactor(python): use 3.11 builtins for UTC and TimeoutError
mcosgriff Oct 23, 2026
4313faf
Merge pull request #4138 from OpenC3/python-3.11-cleanups
jmthomas Oct 23, 2026
7473e91
Update openc3/python/pyproject.toml
mcosgriff Oct 23, 2026
0e971d1
fix(cli): use core operator image for hostsetup probe
mcosgriff Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
212 changes: 212 additions & 0 deletions .claude/skills/update-anycable/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
---
name: update-anycable
description: Rebuild the bundled anycable-go binaries (openc3-anycable/anycable-go-linux-amd64 and -arm64). Syncs a local anycable checkout with upstream, bumps the Go toolchain and module dependencies when a newer Go patch release is out, builds with openc3-anycable/build-anycable.sh, and opens a COSMOS PR with the new binaries. Optionally opens a dependency-bump PR against anycable/anycable from the user's fork. Use when asked to update or rebuild anycable or to pick up Go security releases.
argument-hint: "[go-minor, e.g. 1.26] [--force-build]"
---

# Update the anycable-go binaries

COSMOS ships prebuilt `anycable-go` binaries in `openc3-anycable/` (copied into
the API images by their Dockerfiles). We build them ourselves
so they pick up Go security releases faster than upstream anycable does.

## Inputs

`$ARGUMENTS` can include:
- A Go minor line such as `1.26`. If it's missing, read the `toolchain` line in
the anycable `go.mod` and use its major.minor.
- `--force-build` rebuilds and opens the COSMOS PR even when the toolchain is
already current (for example, after upstream released a new anycable version).

## Requirements

- `go` (any recent version; Go downloads the toolchain go.mod asks for)
- `gh`, authenticated (`gh auth status`)
- An anycable checkout at `$ANYCABLE_DIR`, defaulting to `../anycable` relative
to the cosmos repo root

The shell's cwd resets to the cosmos repo between commands, so use
`git -C "$ANYCABLE_DIR"` or absolute paths.

## Steps

### 1. Ask about the upstream PR

Ask the user (AskUserQuestion) whether to also open a dependency-bump PR against
`anycable/anycable`. Opening it needs a GitHub fork of anycable under their
account. Recommend "yes" only if nobody else on the team usually does it, so
upstream doesn't get duplicate Go-bump PRs. Remember the answer as `UPSTREAM_PR`.

### 2. Find or create the anycable checkout

```bash
ANYCABLE_DIR="${ANYCABLE_DIR:-$(cd .. && pwd)/anycable}"
GH_USER=$(gh api user -q .login)
```

If `$ANYCABLE_DIR` doesn't exist:
- `UPSTREAM_PR` = yes: `cd "$(dirname "$ANYCABLE_DIR")" && gh repo fork anycable/anycable --clone`.
This forks under `$GH_USER` (or reuses an existing fork), clones it into
`./anycable`, and sets `origin` = fork and `upstream` = anycable/anycable. If
`$ANYCABLE_DIR`'s basename isn't `anycable`, rename the clone to match.
- `UPSTREAM_PR` = no: `git clone https://github.com/anycable/anycable.git "$ANYCABLE_DIR"`.

Then work out the remote names by URL rather than assuming them:

```bash
git -C "$ANYCABLE_DIR" remote -v
```

- `UPSTREAM` = the remote whose URL is `github.com/anycable/anycable` (or `.git`)
- `FORK` = the remote whose URL is `github.com/$GH_USER/anycable`, if any

If there's no `UPSTREAM` remote (for example, a clone of the fork alone), add
one with `git -C "$ANYCABLE_DIR" remote add upstream https://github.com/anycable/anycable.git`
and use `UPSTREAM=upstream`.

If `UPSTREAM_PR` = yes but there's no `FORK` remote, run
`gh repo fork anycable/anycable --remote --remote-name fork` from inside the
checkout and use `FORK=fork`. If the checkout has local commits or a dirty tree
(`git status --short`), stop and ask the user before continuing. Untracked
`dist/` or build scripts are fine to ignore.

### 3. Sync with upstream

```bash
git -C "$ANYCABLE_DIR" fetch "$UPSTREAM" --tags
git -C "$ANYCABLE_DIR" switch main
git -C "$ANYCABLE_DIR" merge --ff-only "$UPSTREAM/main"
```

If the fast-forward fails, local `main` has diverged from upstream. Stop and
ask the user. Don't rebase, reset, or force-push. Don't push `main` to the
fork. Only the `go/$NEW` branch in step 9 goes there.

### 4. Check whether Go is out of date

Find the newest patch release in the minor line, using the release page as the
source of truth:

```bash
curl -s https://go.dev/doc/devel/release | grep -oE 'go1\.26\.[0-9]+' | sort -uV | tail -1
grep '^toolchain' "$ANYCABLE_DIR/go.mod"
```

(Replace `1\.26` with the requested minor line.) `https://go.dev/dl/?mode=json`
makes a good cross-check. If a newer minor line exists (for example `go1.27.x`),
mention it to the user, but stay on the current line unless they ask to move.

If the toolchain is already current and `--force-build` wasn't given, report
that and stop.

### 5. Bump the toolchain and dependencies on a branch

Name the branch `go/<version>`. Update **both** modules, the root module and
`etc/benchi`:

```bash
NEW=1.26.9 # newest patch from step 4
cd "$ANYCABLE_DIR"
git switch -c go/$NEW
go mod edit -toolchain=go$NEW && go get -u ./... && go mod tidy
(cd etc/benchi && go mod edit -toolchain=go$NEW && go get -u ./... && go mod tidy)
git diff --stat # expect only go.mod/go.sum in both modules
```

Leave the `go 1.26.0` directive alone. Only `toolchain` changes.

### 6. Verify

```bash
go version # must report the new toolchain
go test ./... # must pass
(cd etc/benchi && go build ./...)
go vet ./...
```

`go vet` already reports three `copies lock value` warnings on upstream main
(`redis/config_test.go`, `config/config.go`), and they're expected. Flag any
**new** vet output to the user. If tests fail, stop and report the output
instead of building.

### 7. Commit in anycable

Commit **before** building so the SHA stamped into the binaries is the
dependency-bump commit:

```bash
git -C "$ANYCABLE_DIR" add go.mod go.sum etc/benchi/go.mod etc/benchi/go.sum
git -C "$ANYCABLE_DIR" commit -m "Bump dependencies including toolchain go$NEW" # plus attribution footer
```

### 8. Build the binaries into COSMOS

From the cosmos repo root:

```bash
openc3-anycable/build-anycable.sh "$ANYCABLE_DIR"
```

This builds linux/amd64 and linux/arm64 straight into `openc3-anycable/` and prints
`go version` for both, which must show `go$NEW`. Report the new sizes.

### 9. Open the upstream PR (only if `UPSTREAM_PR` = yes)

Before creating the PR, run `gh pr list -R anycable/anycable --author "$GH_USER" --state open`
to look for a dependency PR that's still open. If one exists, ask the user
whether to update it or open a new one. Follow the format of earlier merged
PRs (#334, #339):

```bash
git -C "$ANYCABLE_DIR" push -u "$FORK" go/$NEW
gh pr create -R anycable/anycable --base main --head "$GH_USER:go/$NEW" \
--title "Bump dependencies including toolchain go$NEW" \
--body "### What is the purpose of this pull request?

Bump dependencies to close Go CVEs: https://go.dev/doc/devel/release#go1.26.minor

### What changes did you make? (overview)

Just dependency updates" # plus attribution footer
```

Afterwards, switch the checkout back to `main` (`git -C "$ANYCABLE_DIR" switch main`).
If `UPSTREAM_PR` = no, leave the `go/$NEW` branch local and switch back to `main`.

### 10. Open the COSMOS PR

Work in the cosmos repo root:

```bash
git status --short # note any unrelated changes; commit only the two binaries
git fetch origin
git switch -c anycable-go$NEW origin/main
git add openc3-anycable/anycable-go-linux-amd64 openc3-anycable/anycable-go-linux-arm64
git commit -m "build(openc3-anycable): update anycable-go binaries to go$NEW" # plus attribution footer
git push -u origin anycable-go$NEW
gh pr create --base main --head anycable-go$NEW \
--title "build(openc3-anycable): update anycable-go binaries to go$NEW" \
--body "Rebuilds the anycable-go linux/amd64 and linux/arm64 binaries with toolchain go$NEW and bumped Go dependencies, picking up the security fixes in https://go.dev/doc/devel/release#go1.26.minor.

Upstream dependency PR: <URL from step 9, or 'none'>" # plus attribution footer
```

`git switch -c ... origin/main` carries over uncommitted working-tree changes
(the new binaries included). If the switch fails because of conflicting local
changes, stop and ask the user. Don't stash or discard their work.

If the pre-commit hook fails with `invalid byte sequence in UTF-8`, the
installed `.git/hooks/pre-commit` is an old copy that tries to read the
binaries as text. Run `hooks/install.sh` to install the current hook, which
skips files without a supported extension, then commit again. Don't use `--no-verify`.

Afterwards, switch back to the branch the user started on.

## Report

Tell the user:
- Which anycable checkout was used, and whether it was cloned, forked, or fast-forwarded
- The old and new toolchain versions, plus notable dependency bumps
- Test and vet results
- The new binary sizes
- The upstream anycable PR URL (or that it was skipped) and the COSMOS PR URL
12 changes: 10 additions & 2 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ DEBIAN_POINT_RELEASE=13.7
RUBY_VERSION=3.4
APT_URL=http://deb.debian.org
RUBYGEMS_URL=https://rubygems.org
# A non-default PYPI_URL makes the build re-resolve the uv.lock files inside the
# image against that mirror - a lockfile pins absolute pypi.org download URLs
# that no index setting can redirect. The mirror must therefore serve every
# Python dependency, dev dependency groups included.
# Do not put user:token@ credentials in PYPI_URL: it is baked into the
# environment of every image, visible to docker inspect and the image history.
PYPI_URL=https://pypi.org
NPM_URL=https://registry.npmjs.org
MAVEN_URL=https://repo.maven.apache.org/maven2
Expand All @@ -121,8 +127,10 @@ OPENC3_AWS_ARN_PREFIX=arn:aws
# Override based on deployed region
AWS_REGION=us-east-1

# Enables uv's --allow-insecure-host flag when downloading python packages from
# the PYPI_URL, for a private index with a self signed certificate.
# Trusts the PYPI_URL host for a private index with a self signed certificate,
# or a plain-HTTP one: at build time pip installs uv with --trusted-host and the
# uv relock and sync steps get UV_INSECURE_HOST, and at run time uv gets
# --allow-insecure-host when installing plugin packages.
# OPENC3_PYPI_ALLOW_INSECURE=1
# Deprecated name for OPENC3_PYPI_ALLOW_INSECURE, still honored.
# PIP_ENABLE_TRUSTED_HOST=1
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/build-cosmos/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,8 @@ runs:
openc3-traefik|openc3-traefik|
openc3-base|openc3|openc3-ruby
openc3-node|openc3-node|openc3-base
openc3-cosmos-cmd-tlm-api|openc3-cosmos-cmd-tlm-api|openc3-base
openc3-cosmos-script-runner-api|openc3-cosmos-script-runner-api|openc3-base
openc3-cosmos-cmd-tlm-api|openc3-cosmos-cmd-tlm-api openc3-anycable|openc3-base
openc3-cosmos-script-runner-api|openc3-cosmos-script-runner-api openc3-anycable|openc3-base
openc3-operator|openc3-operator|openc3-base
openc3-cosmos-init|openc3-cosmos-init docs.openc3.com|openc3-node openc3-base
EOF
Expand Down
54 changes: 54 additions & 0 deletions .github/actions/fetch-vexhub/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Copyright 2026 OpenC3, Inc.
# All Rights Reserved.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE.md for more details.
#
# This file may also be used under the terms of a commercial license
# if purchased from OpenC3, Inc.

name: Fetch VEX Hub
description: |
Put a pinned commit of the Aqua VEX Hub into the trivy cache so trivy can
apply it without fetching it itself. Run trivy afterwards with
TRIVY_SKIP_VEX_REPO_UPDATE=true.

trivy reads vex-repository.json through the GitHub contents API. Without a
token that is rate limited per runner IP ("403 API rate limit exceeded");
with GITHUB_TOKEN it is rejected outright because the aquasecurity org has an
IP allow list. A git fetch hits neither limit.

The hub is pinned, not tracking main, because VEX statements suppress
findings: a tampered hub could hide real vulnerabilities. git verifies every
object against the commit hash, so the pin is also the integrity check. To
update, set VEXHUB_COMMIT to a newer commit on aquasecurity/vexhub main.

With the repo update skipped, trivy's pkg/vex/repo only reads
$CACHE_DIR/vex/repositories/default/0.1/index.json and the documents it
points to, so the hub checkout is all that is written.
inputs:
cache-dir:
description: Trivy cache dir. The default matches trivy-action's cache-dir default.
required: false
default: ${{ github.workspace }}/.cache/trivy
runs:
using: composite
steps:
- name: Download VEX Hub
shell: bash
env:
CACHE_DIR: ${{ inputs.cache-dir }}
VEXHUB_COMMIT: 8ae2a8c69e5958df726d228327a2c5fb13c2e640 # 2026-03-23
run: |
set -euo pipefail
dir="${CACHE_DIR}/vex/repositories/default/0.1"
rm -rf "$dir"
git init -q "$dir"
git -C "$dir" fetch -q --depth 1 https://github.com/aquasecurity/vexhub.git "$VEXHUB_COMMIT"
git -C "$dir" -c advice.detachedHead=false checkout -q FETCH_HEAD
test "$(git -C "$dir" rev-parse HEAD)" = "$VEXHUB_COMMIT"
rm -rf "$dir/.git"
test -s "$dir/index.json"
echo "VEX Hub ${VEXHUB_COMMIT}: $(grep -o '"id"' "$dir/index.json" | wc -l) packages"
4 changes: 2 additions & 2 deletions .github/actions/setup-uv-python/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ inputs:
uv release to install. The default is the version this repository
standardizes on; override only to test a candidate.
required: false
# Matches UV_VERSION in openc3-ruby/Dockerfile and Dockerfile-ubi.
default: "0.12.5"
# Matches OPENC3_UV_VERSION in openc3-ruby/Dockerfile and Dockerfile-ubi.
default: "0.12.24"
working-directory:
description: |
Directory holding pyproject.toml and uv.lock. Also given to setup-uv so
Expand Down
6 changes: 3 additions & 3 deletions .github/scripts/check_tool_versions.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.10"
# requires-python = ">=3.11"
# dependencies = ["requests==2.34.2"]
# ///

Expand Down Expand Up @@ -106,13 +106,13 @@ class Surface(NamedTuple):
Surface(
"uv (openc3-ruby image)",
"openc3-ruby/Dockerfile",
r"ARG UV_VERSION=([\d.]+)",
r"ARG OPENC3_UV_VERSION=([\d.]+)",
UV,
),
Surface(
"uv (openc3-ruby ubi image)",
"openc3-ruby/Dockerfile-ubi",
r"ARG UV_VERSION=([\d.]+)",
r"ARG OPENC3_UV_VERSION=([\d.]+)",
UV,
),
# The trivy release the scan workflows install through setup-trivy, which
Expand Down
Loading
Loading