Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
077e208
Initial implementation of openadapt-tray package
abrichr Jan 17, 2026
467393a
fix: add README badges for license and Python version (#1)
abrichr Jan 17, 2026
30eeb04
Implement native notifications with desktop-notifier (#2)
abrichr Jan 17, 2026
c9b96d3
ci: add PyPI publish and auto-release workflows
abrichr Jan 29, 2026
44503c5
ci: switch to python-semantic-release for automated versioning
abrichr Jan 29, 2026
54063f6
fix(ci): remove build_command from semantic-release config
abrichr Jan 29, 2026
ef99843
chore: release 0.0.1
Jan 29, 2026
cb494e7
fix(ci): use v9 branch config for python-semantic-release (#4)
abrichr Feb 18, 2026
e7b2c24
feat: align tray with the hosted workflow lifecycle
abrichr Jul 15, 2026
9da5304
chore: release 0.1.0
Jul 15, 2026
3f70a44
fix: recover tray 0.1.1 PyPI release
abrichr Jul 15, 2026
807a00f
chore: release 0.1.1
Jul 15, 2026
8de5c99
docs: refresh README release boundary to the shipped 0.1.1 reality (#6)
abrichr Jul 17, 2026
d31d3d9
docs: use canonical 'retained evidence' wording in README (#8)
abrichr Jul 19, 2026
f423ad5
chore: add security CI (CodeQL, gitleaks, dependency-review, Dependab…
abrichr Jul 20, 2026
179c5b6
feat: use OpenAdapt mark, tinted per state, for the tray icon (#16)
abrichr Jul 20, 2026
026bc6c
chore: release 0.2.0
Jul 20, 2026
37122fe
chore(deps): bump actions/dependency-review-action from 4.9.0 to 5.0.…
dependabot[bot] Jul 21, 2026
11a03e2
chore(deps): bump python-semantic-release/publish-action (#11)
dependabot[bot] Jul 21, 2026
c009853
chore(deps): bump actions/checkout from 7.0.0 to 7.0.1 (#12)
dependabot[bot] Jul 21, 2026
fa17cd1
chore(deps): bump actions/setup-python from 6.3.0 to 7.0.0 (#13)
dependabot[bot] Jul 21, 2026
99f8d43
chore(deps): bump python-semantic-release/python-semantic-release (#14)
dependabot[bot] Jul 21, 2026
ba65868
docs: refresh README for the tray companion and reconciled desktop co…
abrichr Jul 21, 2026
8850e58
chore(deps-dev): bump uv from 0.11.26 to 0.11.29 (#15)
dependabot[bot] Jul 21, 2026
c623942
fix(deps): raise vulnerable tray dependency floors (#19)
abrichr Jul 21, 2026
2e21eb2
chore: release 0.2.1
Jul 21, 2026
560e672
chore: clean up repository root (#20)
abrichr Jul 25, 2026
cdbf507
chore(deps): bump github/codeql-action init+analyze to v4.37.3 togeth…
abrichr Jul 27, 2026
6b752c8
chore(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 (#24)
dependabot[bot] Jul 27, 2026
5acbda5
chore(deps): bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 (…
dependabot[bot] Jul 27, 2026
b75c430
chore(deps): bump uv from 0.11.29 to 0.11.32 across every release inp…
abrichr Jul 27, 2026
a955627
chore: gitignore .private/ (#28)
abrichr Jul 28, 2026
48360ec
fix: report keychain, toast and IPC failures honestly; pin ruff to 0.…
abrichr Jul 28, 2026
65eb1b1
chore: release 0.2.2
Jul 28, 2026
ad84c96
fix: make unknown outcomes representable instead of success-shaped (#30)
abrichr Jul 28, 2026
0f72555
chore: release 0.2.3
Jul 28, 2026
55269e0
fix: keep tray command failures visible (#31)
abrichr Jul 28, 2026
83471e4
chore: release 0.2.4
Jul 28, 2026
00e534f
feat: warn before hosted credentials expire (#32)
abrichr Jul 28, 2026
9d89a55
chore: release 0.3.0
Jul 28, 2026
8bb7659
chore(release): enforce the source-policy boundary (#33)
abrichr Jul 28, 2026
6afc0a4
chore: release 0.3.1
Jul 28, 2026
ed5e4d5
chore: confirm tray notification delivery
abrichr Jul 28, 2026
163a97d
chore(deps): bump the codeql-action group with 2 updates (#36)
dependabot[bot] Aug 18, 2026
4e13635
chore(deps): bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 (…
dependabot[bot] Aug 18, 2026
0ff9a9c
chore(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 (#40)
dependabot[bot] Aug 18, 2026
ddea451
chore(deps-dev): bump uv from 0.11.32 to 0.12.4 (#39)
dependabot[bot] Aug 18, 2026
d9df567
chore: release 0.3.2
Aug 18, 2026
670d56e
chore(deps): refresh CodeQL and uv toolchain (#41)
abrichr Aug 18, 2026
996dc67
docs: use canonical launcher quickstart (#42)
abrichr Aug 18, 2026
cc5d8cb
ci: correct the stale version comment on the pypi-publish pin (#43)
abrichr Aug 20, 2026
baa2c8a
chore: ignore every .env variant, not one at a time (#45)
abrichr Aug 26, 2026
da200d0
chore(deps): bump the codeql-action group with 2 updates (#44)
dependabot[bot] Aug 27, 2026
a6a49db
chore(policy): sync generated source boundary (#47)
abrichr Aug 27, 2026
4e4fc4a
fix: lock the semantic release runtime (#46)
abrichr Aug 27, 2026
0195c30
chore: release 0.3.3
Aug 27, 2026
fd44df6
docs: rewrite the README around what the tray actually is (#48)
abrichr Aug 28, 2026
084e232
fix: align Tray with the native Desktop protocol (#49)
abrichr Aug 28, 2026
7a7043f
chore: release 0.3.4
Aug 28, 2026
3d62ab7
chore(deps): bump the codeql-action group with 2 updates (#53)
dependabot[bot] Sep 2, 2026
b6a048b
chore(deps): update the GitHub release publishing action (#55)
dependabot[bot] Sep 10, 2026
d8d6da8
chore: isolate and update the locked release tools (#54)
dependabot[bot] Sep 10, 2026
690ca73
chore(deps): update the reviewed GitPython release dependency (#50)
dependabot[bot] Sep 10, 2026
0501727
chore(deps): align the reviewed UV release tool pins (#51)
dependabot[bot] Sep 10, 2026
7b93465
chore(deps): validate the Hatchling 1.32 release contract (#52)
dependabot[bot] Sep 10, 2026
04f17be
chore: align compatible release tools and bound Click updates (#58)
dependabot[bot] Sep 10, 2026
18d231c
chore: update CodeQL action to 4.38.0
dependabot[bot] Sep 14, 2026
af9038f
chore: update setup-uv action to 10.1.0
dependabot[bot] Sep 14, 2026
e193d5b
chore: synchronize uv 0.12.13 release tools
dependabot[bot] Sep 14, 2026
61413f7
fix: show the recording hotkey in the platform's form in the menu (#69)
abrichr Oct 14, 2026
99b7314
chore: release 0.3.5
Oct 14, 2026
0d6ebfe
chore: sync the published source policy (#72)
abrichr Oct 14, 2026
d4682e3
Plain README, macOS startup crash fix, and working menu actions (#73)
abrichr Oct 14, 2026
d260bfc
chore: release 0.3.6
Oct 14, 2026
67f0648
test: check every label in the default tray menu (#74)
abrichr Oct 14, 2026
b213fe8
fix(deps): patch Dependabot security alerts (#75)
abrichr Oct 14, 2026
a1ee7e5
chore: release 0.3.7
Oct 14, 2026
553dddf
chore: bump the codeql-action group with 2 updates (#65)
dependabot[bot] Oct 17, 2026
e263c22
chore: bump python-semantic-release/publish-action from 10.6.2 to 10.…
dependabot[bot] Oct 17, 2026
0dacb5f
chore: bump astral-sh/setup-uv from 10.1.0 to 10.3.0 (#70)
dependabot[bot] Oct 17, 2026
61972aa
chore: bump hatchling from 1.32.0 to 1.32.4 (#66)
dependabot[bot] Oct 17, 2026
24ef62d
chore: update ruff requirement from <0.17,>=0.16 to >=0.16,<0.18 (#71)
dependabot[bot] Oct 17, 2026
abcd416
build(monorepo): import openadapt-tray into packages/tray
abrichr Oct 19, 2026
27f58f3
build(tray): release openadapt-tray from the monorepo
abrichr Oct 19, 2026
63a2d7c
ci(tray): path-filtered tray jobs and an in-tree desktop IPC test
abrichr Oct 19, 2026
09d2ae0
docs(monorepo): name the tray import PR
abrichr Oct 19, 2026
89d42f7
Merge remote-tracking branch 'origin/main' into monorepo/tray
abrichr Oct 19, 2026
7aff28e
test(desktop): check the in-tree tray peer instead of a pinned checkout
abrichr Oct 19, 2026
1fa6354
Merge remote-tracking branch 'origin/main' into HEAD
abrichr Oct 19, 2026
bed4f09
flow: every teach path runs under the declared teach scope
abrichr Oct 20, 2026
9908f56
docs: link #1386 in the capability map
abrichr Oct 20, 2026
51faad6
flow: run authorizations signed with a GitHub SSH key, and operator p…
abrichr Oct 20, 2026
c8d1c05
capabilities: run authorizations and operator profiles row; refresh l…
abrichr Oct 20, 2026
dc7cdf4
Merge branch 'seal/rekor-anchor' into seal/run-authorization
abrichr Oct 20, 2026
22bd686
flow: authorization timing is reported, not refused; profile run list…
abrichr Oct 20, 2026
be0d737
flow: local-seal authorize sign shows what is authorized, then signs
abrichr Oct 20, 2026
9f2b7cf
flow: authorization timing is judged against the run's own start
abrichr Oct 20, 2026
195bf21
refactor(desktop): render the program map from @openadapt/program-graph
abrichr Oct 20, 2026
ca50d0e
Merge origin/main into flow/compiled-sections
abrichr Oct 20, 2026
18b3e6f
Merge branch 'program-graph/package' into program-graph/desktop
abrichr Oct 20, 2026
1e72a22
flow: local-seal timestamp: one RFC 3161 token per Seal or run author…
abrichr Oct 20, 2026
b607455
flow: compile named sections for every program; program map and Deskt…
abrichr Oct 20, 2026
ea37195
program-graph: fixture sections come from Flow; review controls; docs
abrichr Oct 20, 2026
ed46c49
Merge origin/program-graph/desktop into flow/compiled-sections
abrichr Oct 20, 2026
313fa7a
docs: say 'during review' (the shipped-only copy guard rejects 'in re…
abrichr Oct 20, 2026
86bde74
flow: redact session tokens from run reports before they are sealed
abrichr Oct 20, 2026
85f755c
capabilities: link the report redaction row to #1407
abrichr Oct 20, 2026
4f0da6c
program-graph: add @types/node so typecheck covers the demo and schem…
abrichr Oct 20, 2026
c643bab
Merge branch 'program-graph/package' into program-graph/desktop
abrichr Oct 20, 2026
3219e0f
flow: local-seal inputs fail in one clear line with exit 2, never a t…
abrichr Oct 20, 2026
e4e64e8
ci: run every required workflow on merge_group; review every PR base
abrichr Oct 20, 2026
5ed1e08
ci: cancel superseded Packages runs on main unless the push changes D…
abrichr Oct 20, 2026
8a9c381
ci: keep a push of 20 or more commits in its own Packages group
abrichr Oct 20, 2026
de8d2a0
test: require the 20-commit guard in the Packages concurrency test
abrichr Oct 20, 2026
157ef35
Merge origin/main into flow/redact-report-tokens; spell next-step hin…
abrichr Oct 20, 2026
1ebb417
Merge remote-tracking branch 'origin/main' into monorepo/tray
abrichr Oct 20, 2026
9e96b92
Merge remote-tracking branch 'origin/monorepo/tray' into monorepo/tray
abrichr Oct 20, 2026
f8b11e8
flow: run authorization security review fixes
abrichr Oct 20, 2026
f068ef3
flow: authorize create points to authorize sign; align the summary
abrichr Oct 20, 2026
977f898
flow: authorization follow-ups: one count per report, closed item lab…
abrichr Oct 20, 2026
a22eef1
Merge remote-tracking branch 'origin/main' into seal/run-authorization
abrichr Oct 20, 2026
b99a15c
flow: authorize create prints its hint through cli_hints.command
abrichr Oct 20, 2026
0ee6082
Merge branch 'seal/run-authorization' into seal/authorization-followups
abrichr Oct 20, 2026
1af8fb7
Merge pull request #1405 from OpenAdaptAI/flow/compiled-sections
abrichr Oct 20, 2026
edd21dd
Merge origin/main into program-graph/desktop
abrichr Oct 20, 2026
ccc5f06
Merge branch 'main' into claude/teach-scope-everywhere
abrichr Oct 20, 2026
c9908e7
Merge branch 'main' into seal/run-authorization
abrichr Oct 20, 2026
045f7c3
Merge branch 'main' into flow/redact-report-tokens
abrichr Oct 20, 2026
d5da216
Merge branch 'main' into ci/merge-queue-triggers
abrichr Oct 20, 2026
f31f743
Merge branch 'main' into ci/main-dedupe
abrichr Oct 20, 2026
5db7bec
Merge branch 'main' into seal/authorization-followups
abrichr Oct 20, 2026
f3e5a01
Merge branch 'main' into program-graph/desktop
abrichr Oct 20, 2026
8fbb08d
Merge branch 'main' into monorepo/tray
abrichr Oct 20, 2026
a84a35d
Merge #1401 into batch
abrichr Oct 20, 2026
962948d
Merge #1416 into batch
abrichr Oct 20, 2026
e962484
Merge #1407 into batch (keep authorization and redaction in seal_run)
abrichr Oct 20, 2026
000a2ec
Merge #1412 into batch
abrichr Oct 20, 2026
6b363f5
Merge #1415 into batch
abrichr Oct 20, 2026
7a815e8
Merge #1389 into batch
abrichr Oct 20, 2026
4cb5a44
Merge #1356 into batch
abrichr Oct 20, 2026
e221c65
batch: regenerate the command map and llms-full after merging
abrichr Oct 20, 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
8 changes: 8 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ updates:
open-pull-requests-limit: 5
labels:
- "dependencies"
# packages/tray keeps its own uv.lock, like packages/capture.
- package-ecosystem: "uv"
directory: "/packages/tray"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
labels:
- "dependencies"
# packages/desktop: its uv.lock, the frontend's package-lock.json and the
# Tauri shell's Cargo.lock. Minor and patch bumps are grouped, as they were
# in openadapt-desktop.
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ name: CodeQL
on:
push:
branches: [main]
# Every pull request, whatever its base, plus each merge queue group.
pull_request:
branches: [main]
merge_group:
schedule:
- cron: "23 5 * * 1"

Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ name: Dependency Review

# SOC 2: dependency-review (OA-C-24). Flags vulnerable/denied deps on PRs.
on:
# Every pull request, whatever its base, so a stacked PR reaches main with
# this required check already reported.
pull_request:
branches: [main]
# The merge queue tests each group before it lands on main.
merge_group:

permissions:
contents: read
Expand All @@ -22,6 +25,16 @@ jobs:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Dependency Review
if: github.event_name != 'merge_group'
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
with:
fail-on-severity: high
# A queue group has no pull request in its payload: compare the group's
# head with the main commit it was built on.
- name: Dependency Review (merge queue group)
if: github.event_name == 'merge_group'
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
with:
fail-on-severity: high
base-ref: ${{ github.event.merge_group.base_sha }}
head-ref: ${{ github.event.merge_group.head_sha }}
9 changes: 8 additions & 1 deletion .github/workflows/desktop-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,19 @@ jobs:
env:
BEFORE_SHA: ${{ github.event.before }}
EVENT_NAME: ${{ github.event_name }}
GROUP_BASE_SHA: ${{ github.event.merge_group.base_sha }}
shell: bash
run: |
set -euo pipefail
changed_paths="${RUNNER_TEMP}/openadapt-desktop-changed-paths.txt"
: > "${changed_paths}"
if [ "${EVENT_NAME}" = "push" ]; then
if [ "${EVENT_NAME}" = "merge_group" ]; then
# A queue group is scoped like a push to main: diff the group's
# head against the main commit it was built on.
BEFORE_SHA="${GROUP_BASE_SHA}"
git fetch --no-tags --depth=1 origin "${GROUP_BASE_SHA}" || true
fi
if [ "${EVENT_NAME}" = "push" ] || [ "${EVENT_NAME}" = "merge_group" ]; then
before="${BEFORE_SHA}"
if [ -z "${before}" ] || [ "${before}" = "0000000000000000000000000000000000000000" ]; then
before="$(git rev-parse HEAD^)"
Expand Down
13 changes: 4 additions & 9 deletions .github/workflows/desktop-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,12 @@ jobs:
- name: Install Desktop and the exact bundled Flow runtime
run: uv sync --locked --extra dev --extra build

- name: Checkout the exact Tray protocol peer
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: OpenAdaptAI/openadapt-tray
ref: 3d6ffbeda50af2fc4769ae0f1ce55e3d5d49435c
path: packages/desktop/.integration/openadapt-tray
persist-credentials: false

# The Tray client is in this tree (packages/tray), so the test runs
# against the client from the same commit. packages.yml runs this test
# too when only the tray changes.
- name: Exercise the Desktop and Tray IPC contract
env:
OPENADAPT_TRAY_SOURCE: .integration/openadapt-tray/src
OPENADAPT_TRAY_SOURCE: ../tray/src
run: uv run pytest tests/test_tray_integration.py -v

- name: Exercise qualification safety contracts
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ on:
pull_request:
branches:
- '**'
# The merge queue tests each group before it lands on main.
merge_group:
push:
branches:
- main
Expand Down
144 changes: 138 additions & 6 deletions .github/workflows/packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,20 @@
# on main, and the bundled-Flow qualification contract) and desktop-build.yml
# (frontend, Python distribution, frozen sidecar, and Tauri installers). Their
# jobs are in packages-gate like every other package's.
#
# openadapt-tray (packages/tray) keeps its own uv.lock and runs `uv sync
# --locked` against it: its suite on Linux with Python 3.10 and 3.12 for a PR,
# plus 3.11, macOS and Windows on main; ruff, the version and changelog
# contract, `uv build` and the archive boundary; and Desktop's socket test
# against this tray client, so a tray change cannot break the protocol
# without the desktop suite running. A desktop change runs that same test in
# desktop-test.yml.
name: Packages

on:
pull_request:
# The merge queue tests each group before it lands on main.
merge_group:
push:
branches: [main]
workflow_dispatch:
Expand All @@ -54,10 +64,33 @@ permissions:
contents: read

concurrency:
# A pull request's newer push supersedes its older run. Runs on main are
# never cancelled: desktop-release.yml needs every main commit's own result.
group: packages-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
# A pull request's newer push supersedes its older run.
#
# On main, desktop-release.yml waits for the Packages run of the newest
# first-parent commit that changed packages/desktop (#1398). A push whose
# commits touch packages/desktop/ therefore keeps its own group and is never
# cancelled. Every other push to main shares one group, so a newer one
# cancels it instead of queueing behind it. The test is conservative: any
# mention of packages/desktop/ in the push payload (file lists or messages)
# counts as a Desktop change. A push with no commit list, or with 20 or more
# commits (GitHub truncates the payload's list at 20, which could hide a
# Desktop change), keeps its own group. Merge queue groups and dispatches
# are never cancelled.
group: >-
packages-${{
github.event.pull_request.number
|| (github.event_name == 'push'
&& github.event.head_commit
&& !github.event.commits[19]
&& !contains(toJSON(github.event.commits), 'packages/desktop/')
&& 'main-without-desktop')
|| github.sha }}
cancel-in-progress: >-
${{ github.event_name == 'pull_request'
|| (github.event_name == 'push'
&& github.event.head_commit != null
&& !github.event.commits[19]
&& !contains(toJSON(github.event.commits), 'packages/desktop/')) }}

env:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
Expand All @@ -74,6 +107,7 @@ jobs:
capture: ${{ steps.classify.outputs.capture }}
privacy: ${{ steps.classify.outputs.privacy }}
desktop: ${{ steps.classify.outputs.desktop }}
tray: ${{ steps.classify.outputs.tray }}
program_graph: ${{ steps.classify.outputs.program_graph }}
weight: ${{ steps.classify.outputs.weight }}
steps:
Expand All @@ -86,15 +120,23 @@ jobs:
env:
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
GROUP_BASE_SHA: ${{ github.event.merge_group.base_sha }}
run: |
set -euo pipefail
all() {
for pkg in flow types agent capture privacy desktop program_graph weight; do echo "$pkg=true" >> "$GITHUB_OUTPUT"; done
for pkg in flow types agent capture privacy desktop tray program_graph weight; do echo "$pkg=true" >> "$GITHUB_OUTPUT"; done
exit 0
}
case "$EVENT_NAME" in
workflow_dispatch) all ;;
pull_request) base="HEAD^1" ;; # the PR merge commit's first parent is the base tip
# A queue group runs the full matrix (the PR tier ran one lane)
# for every package the group's PRs touch, measured from the main
# commit the group was built on.
merge_group)
base="$GROUP_BASE_SHA"
git cat-file -e "$base^{commit}" 2>/dev/null || all
;;
*)
if [ -z "${BEFORE_SHA:-}" ] || [ "$BEFORE_SHA" = 0000000000000000000000000000000000000000 ] \
|| ! git cat-file -e "$BEFORE_SHA^{commit}" 2>/dev/null; then
Expand All @@ -118,7 +160,9 @@ jobs:
agent="$(hit "^packages/(agent|flow|types)/|$wf")"
capture="$(hit "^packages/capture/|$wf")"
privacy="$(hit "^packages/privacy/|$wf")"
desktop="$(hit "^packages/desktop/|^\.github/workflows/desktop-[a-z-]+\.yml$|$wf")"
# Desktop bundles the program map from packages/program-graph.
desktop="$(hit "^packages/(desktop|program-graph)/|^\.github/workflows/desktop-[a-z-]+\.yml$|$wf")"
tray="$(hit "^packages/tray/|$wf")"
# The program map checks its schema against Flow's copy.
program_graph="$(hit "^packages/program-graph/|^packages/flow/schemas/program-graph-v2\.json$|^\.github/workflows/release-program-graph\.yml$|$wf")"
# Any package's metadata, or the launcher's, can change what an
Expand All @@ -131,6 +175,7 @@ jobs:
echo "capture=$capture"
echo "privacy=$privacy"
echo "desktop=$desktop"
echo "tray=$tray"
echo "program_graph=$program_graph"
echo "weight=$weight"
} | tee -a "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -681,6 +726,90 @@ jobs:
if: needs.scope.outputs.desktop == 'true'
uses: ./.github/workflows/desktop-build.yml

tray:
name: tray (${{ matrix.os }}, py${{ matrix.python-version }})
needs: scope
if: needs.scope.outputs.tray == 'true'
strategy:
fail-fast: false
matrix:
# A pull request runs Linux on the oldest and newest Python; main adds
# 3.11, macOS and Windows, where the tray's platform handlers differ.
include: ${{ fromJSON(github.event_name == 'pull_request' && '[{"os":"ubuntu-latest","python-version":"3.10"},{"os":"ubuntu-latest","python-version":"3.12"}]' || '[{"os":"ubuntu-latest","python-version":"3.10"},{"os":"ubuntu-latest","python-version":"3.11"},{"os":"ubuntu-latest","python-version":"3.12"},{"os":"macos-latest","python-version":"3.12"},{"os":"windows-latest","python-version":"3.12"}]') }}
runs-on: ${{ matrix.os }}
timeout-minutes: 20
defaults:
run:
working-directory: packages/tray
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
- name: Set up Python
run: uv python install ${{ matrix.python-version }}
- name: Install
run: uv sync --locked --python ${{ matrix.python-version }} --extra dev
- name: Test
env:
# No display or input device on the Linux runners.
PYNPUT_BACKEND: ${{ runner.os == 'Linux' && 'dummy' || '' }}
PYSTRAY_BACKEND: ${{ runner.os == 'Linux' && 'dummy' || '' }}
run: uv run --no-sync pytest tests -q

tray-contract:
name: tray lint and release contract
needs: scope
if: needs.scope.outputs.tray == 'true'
runs-on: ubuntu-latest
timeout-minutes: 15
defaults:
run:
working-directory: packages/tray
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
- name: Set up Python
run: uv python install 3.12
- name: Install
run: uv sync --locked --python 3.12 --extra dev
# The whole package, including examples/ and the root helper scripts.
- name: Ruff
run: uv run --no-sync ruff check .
- name: Build wheel and source distribution
run: uv build
- name: Versions agree and both distributions exist
run: uv run --no-sync python scripts/check_release_consistency.py --require-dist
- name: Verify release archive boundaries
run: uv run --no-sync python scripts/check_source_boundary.py --require-dist

tray-desktop-ipc:
# Desktop's socket server against this tray's IPC client, both from this
# commit. desktop-test.yml runs the same test when Desktop changes.
name: tray and desktop IPC contract
needs: scope
if: needs.scope.outputs.tray == 'true'
runs-on: ubuntu-latest
timeout-minutes: 20
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
- name: Set up Python
run: uv python install 3.12
- name: Install Desktop
run: uv sync --locked --python 3.12 --extra dev
- name: Exercise the Desktop and Tray IPC contract
env:
OPENADAPT_TRAY_SOURCE: ../tray/src
run: uv run --no-sync pytest tests/test_tray_integration.py -v

program-graph:
name: program-graph (test, build, vendor)
needs: scope
Expand Down Expand Up @@ -806,6 +935,9 @@ jobs:
- privacy-contract
- desktop-test
- desktop-build
- tray
- tray-contract
- tray-desktop-ipc
- program-graph
- install-weight
- capture-core-record
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/platform-manifest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ on:
pull_request:
branches:
- '**'
# The merge queue tests each group before it lands on main.
merge_group:
push:
branches:
- main
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/release-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
# agent openadapt-agent pypi-agent
# capture openadapt-capture pypi-capture
# privacy openadapt-privacy pypi-privacy
# tray openadapt-tray pypi-tray
#
# Manual dispatch only: there is no tag or push trigger, so nothing here runs
# unless someone starts it. openadapt-desktop is not here: desktop-release.yml
Expand All @@ -36,7 +37,7 @@ on:
description: "Package directory under packages/"
required: true
type: choice
options: [flow, types, agent, capture, privacy]
options: [flow, types, agent, capture, privacy, tray]
version:
description: "Version to publish; must equal packages/<package>/pyproject.toml"
required: true
Expand Down Expand Up @@ -96,6 +97,7 @@ jobs:
"agent": "openadapt-agent",
"capture": "openadapt-capture",
"privacy": "openadapt-privacy",
"tray": "openadapt-tray",
}[pkg]
if project["name"] != expected:
sys.exit(f"packages/{pkg} is {project['name']!r}, expected {expected!r}")
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/secret-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ name: Secret Scan
# invoke it directly and pin the version. Scans full git history on PRs + main.
on:
pull_request:
# The merge queue tests each group before it lands on main.
merge_group:
push:
branches: [main]

Expand Down
Loading
Loading