Skip to content

fix(#6): add from __future__ import annotations to cli.py for Python 3.9 compat#1

Open
Etumos wants to merge 11 commits into
masterfrom
fix/6-py39-pep604-cli
Open

fix(#6): add from __future__ import annotations to cli.py for Python 3.9 compat#1
Etumos wants to merge 11 commits into
masterfrom
fix/6-py39-pep604-cli

Conversation

@Etumos
Copy link
Copy Markdown
Owner

@Etumos Etumos commented May 5, 2026

Summary

Closes Etumos/agentic-stack-private#6.

harness_manager/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 macOS 13/14/15.x and 26.x), install.sh crashes with:

TypeError: unsupported operand type(s) for |: 'types.GenericAlias' and 'NoneType'

Fix

Add from __future__ import annotations to cli.py. This defers annotation evaluation, making PEP-604 syntax work on Python 3.7+. Other modules in harness_manager/ (transfer_plan.py, install.py, doctor.py, status.py, schema.py, etc.) already have the import — cli.py was just missed when the pattern was rolled out.

Validation

On macOS 26.4.1 with system Python 3.9.6:

$ /usr/bin/python3 --version
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

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.sh so 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

Jason Bonito and others added 11 commits May 2, 2026 22:20
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant