fix(#6): add from __future__ import annotations to cli.py for Python 3.9 compat#1
Open
Etumos wants to merge 11 commits into
Open
fix(#6): add from __future__ import annotations to cli.py for Python 3.9 compat#1Etumos wants to merge 11 commits into
from __future__ import annotations to cli.py for Python 3.9 compat#1Etumos wants to merge 11 commits into
Conversation
bin/update-fork-from-upstream.sh: - Idempotent fetch+merge from codejunkie99/agentic-stack upstream - Adds upstream remote on first run (local-only, invisible to GitHub UI) - Safe-by-default: refuses dirty tree, warns on detached HEAD, uses --ff-only when no local commits ahead - Clean conflict handling: exits non-zero with resolution steps README.etumos.md: - Documents the privacy stance (private fork, no GitHub fork-link) - Update procedure - What lives here vs upstream Both authored fresh; no upstream content modified.
Tier 1 overlay extracted from xbr-analytics: - etumos.config.example.sh — per-project config (sourced by all bin scripts) - bin/sync-env.sh / push-env.sh — canonical .env sync (#83 Phase 2A pattern) - bin/refresh-runners.sh — GHA runner auto-recovery (ACCESS_TOKEN-based, #141) - bin/issue-api-token.sh / revoke-api-token.sh — Bearer-token admin auth (#168) - compose-snippets/gha-runner-access-token.yml — canonical runner block Per-project setup is symlink-style: copy .etumos.config.example.sh → .etumos.config.sh in your project root, customize values, ln -s the bin scripts. Scripts read config from project's .etumos.config.sh so they're reusable without forking. Tier 2/3 follow-up: promote/deploy templates, postgres-many-dbs snippet, init-project bootstrap wizard.
… + init-project script - compose-snippets/postgres-many-dbs.yml — single Postgres, dedicated DB per workload (#137 pattern) - templates/CLAUDE.md.template — universal sections extracted from xbr-analytics (issue/branch discipline, schema changes, secrets management, infra audit-first, etc.) with project-specific section delimited at the bottom - bin/init-project.sh — bootstrap wizard that drops .etumos.config.sh, symlinks bin scripts, and lays down a starter CLAUDE.md from the template Tier 3 (promote/deploy templates) deferred until a real second project — those are too project-specific to design abstractly.
Pulls Etumos/agentic-stack (which itself auto-syncs from codejunkie99) into
this private repo as a pull request — not a direct merge. PR review surfaces
what's incoming so etumos/ overlay conflicts are seen explicitly.
Sync chain:
codejunkie99/agentic-stack
↓ daily 06:00 UTC, ff-only auto-merge
Etumos/agentic-stack (public mirror)
↓ daily 07:00 UTC, opens PR
Etumos/agentic-stack-private (this repo) — review + merge
Manual: trigger via Actions tab → 'Sync from public mirror' → Run workflow.
README.etumos.md now describes the 3-tier sync chain (codejunkie99 → public mirror → private). bin/update-fork-from-upstream.sh defaults to pulling from the public mirror instead of upstream directly. Manual flow stays available as fallback when Actions are paused or for ad-hoc syncs.
GitHub-hosted minutes are billing-blocked on this private repo. The new gha-runner-stack-private container on Unraid (xbr-analytics compose, ACCESS_TOKEN-based) handles this workflow. Public mirror's sync-upstream.yml continues to use ubuntu-latest — public repos get unlimited free Actions minutes.
Default GITHUB_TOKEN can't push workflow file changes (security restriction). The merge from public mirror brings .github/workflows/sync-upstream.yml into this repo, which counts as creating a workflow file → push refused. PAT (repo scope) bypasses this. Stored as SYNC_PAT repo secret.
Self-hosted runner reuses its workspace (EPHEMERAL: false for cache warmth), so the second run hits 'remote mirror already exists'. Remove-then-add makes it always succeed.
sync: pull upstream from mirror (2026-05-03)
…py for Python 3.9 compat cli.py:407 uses PEP-604 union syntax (`list[str] | None`) which requires Python 3.10+. On macOS systems where `python3` resolves to the Xcode-CLI-bundled 3.9 (default on 13/14/15.x and 26.x), `install.sh` crashes with: ``` TypeError: unsupported operand type(s) for |: 'types.GenericAlias' and 'NoneType' ``` Other harness_manager modules (transfer_plan.py, install.py, doctor.py, status.py, etc.) already have the future-annotations import — cli.py was just missed when the pattern was rolled out. This brings cli.py in line with the rest of the package. Verified on macOS 26.4.1 with system Python 3.9.6: ``` $ /usr/bin/python3 -m harness_manager.cli status /Users/jasonbonito/Projects/li-ssi-bot project: /Users/jasonbonito/Projects/li-ssi-bot brain: .agent/ (9 skills, 13 episodic, 1 lessons) version: agentic-stack 0.13.0 adapters installed (1): • claude-code primitive: $CLAUDE_PROJECT_DIR ``` Closes codejunkie99#6. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes Etumos/agentic-stack-private#6.
harness_manager/cli.py:407uses PEP-604 union syntax (list[str] | None) which requires Python 3.10+. On macOS systems wherepython3resolves to the Xcode-CLI-bundled 3.9 (default on macOS 13/14/15.x and 26.x),install.shcrashes with:Fix
Add
from __future__ import annotationstocli.py. This defers annotation evaluation, making PEP-604 syntax work on Python 3.7+. Other modules inharness_manager/(transfer_plan.py, install.py, doctor.py, status.py, schema.py, etc.) already have the import —cli.pywas just missed when the pattern was rolled out.Validation
On macOS 26.4.1 with system Python 3.9.6:
Same command pre-fix raised the TypeError above.
Out of scope (future PR)
Per the issue, also worth adding an explicit Python version guard in
install.shso users on even older Python (3.6/3.7/3.8) get a clear error instead of a traceback. Holding for a separate PR — this one is the minimal, targeted fix.🤖 Generated with Claude Code