Skip to content

feat: token mint, user guardrail, config cleanup + upload fixes#43

Merged
madtank merged 32 commits intomainfrom
dev/staging
Apr 13, 2026
Merged

feat: token mint, user guardrail, config cleanup + upload fixes#43
madtank merged 32 commits intomainfrom
dev/staging

Conversation

@madtank
Copy link
Copy Markdown
Member

@madtank madtank commented Apr 13, 2026

Summary

Three CLI features (cipher task list) plus upload pipeline fixes and the ax-operator skill.

Task 1: ax token mint <agent-name>

Single command for the full bootstrap flow: detect user PAT → resolve agent → exchange for user_admin JWT → issue agent PAT → save + profile.

  • ax token mint backend_sentinel works end-to-end from user PAT
  • --save-to /path writes token + config.toml
  • --profile name creates a named profile
  • Clear error on agent PAT: "Cannot mint with an agent PAT"
  • --json output
  • Workaround for agents.list scope gap: resolves via user_access, mints via user_admin

Task 2: User token guardrail

Warns when axp_u_ is used for non-management operations.

  • Warning to stderr (once per session, non-blocking)
  • Suppress via AX_I_KNOW_WHAT_IM_DOING=1
  • Management commands (mint, credentials) auto-suppress
  • Agent tokens never trigger

Task 3: Config resolution cleanup

Kill git dependency and global config footgun.

  • _find_project_root() only matches .ax/ dirs, ignores .git
  • Global ~/.ax/config.toml warns if it contains credentials
  • AX_VERBOSE=1 prints [env: hostname] on every command

Also included (from team work on dev/staging)

  • ax-operator skill at skills/SKILL.md (self-onboarding decision tree)
  • Upload attachment metadata fixes (url + context_key)
  • Channel bridge reply anchor tracking
  • Profile env exports agent_id
  • Upload space-scoping

Test plan

  • ax token mint <agent> with user PAT — mints successfully
  • ax token mint <agent> with agent PAT — clear error
  • ax token mint <agent> --save-to /path --profile name — saves + creates profile
  • ax messages list with user PAT — warning on stderr
  • AX_I_KNOW_WHAT_IM_DOING=1 ax messages list — no warning
  • ax token mint — no warning (management op)
  • cd into git repo without .ax/ — doesn't pick up git root config
  • Global config with credentials — deprecation warning
  • AX_VERBOSE=1 ax send "test" — prints env indicator

🤖 Generated with Claude Code

madtank and others added 13 commits April 12, 2026 22:27
Add a profile-driven dev smoke script for aX MCP app read/navigation validation.
…tions

Messages with file attachments (images, docs) now include the attachment
metadata (id, filename, content_type, size, url, context_key) in the
channel notification's meta.attachments field. This lets agents receiving
messages via the channel bridge know when attachments exist and retrieve
them on demand via context download, without requiring the bridge to
push the actual file data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SSE events don't include metadata.attachments, so the bridge now falls
back to a GET /messages/{id} call to retrieve the full message with
attachment metadata when the SSE payload lacks it. This ensures agents
receiving channel notifications can see attached images/files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Top-level skill file that teaches any agent to operate the aX platform
via axctl. Covers: identity verification, auth model (PAT vs JWT),
daily workflow pattern, follow-through rules (always notify, always
assign, always verify), anti-patterns, and full command reference.

This is the behavior layer — the CLI provides capability, the skill
enforces discipline. An agent that loads this skill should be a
competent aX operator immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The skill is the product. Rewrote from reference card to autonomous
onboarding flow:

1. Token detection (no token → guide user, user PAT → bootstrap, agent PAT → operate)
2. Identity verification (whoami, environment check, profile switching)
3. Access confirmation (auto-exchange, test send)
4. Team bootstrap (create agents, mint PATs, set up profiles, swarm pattern)
5. Daily operations (golden path with follow-through rules)
6. Agent mesh connectivity (channel bridge, BYOA, shared context)
7. Follow-through rules + anti-patterns
8. Command reference + troubleshooting

An agent that loads this skill can go from raw token to fully operational
autonomously — verify itself, bootstrap a team, connect everyone into a
shared context mesh. The user doesn't need to read docs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New command that handles the full bootstrap flow:
1. Detect user PAT (clear error on agent PAT)
2. Resolve agent name → UUID via user_access JWT
   (workaround: user_admin lacks agents.list scope)
3. Exchange for user_admin JWT
4. Issue agent-bound PAT via /credentials/agent-pat
5. Optionally save token + config to target directory (--save-to)
6. Optionally create a named profile (--profile)

Usage:
  ax token mint backend_sentinel
  ax token mint backend_sentinel --save-to /path --profile prod-backend
  ax token mint backend_sentinel --audience both --expires 30 --json

Tested on staging: agent PAT resolve, mint, save, profile creation
all verified end-to-end.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When a user PAT (axp_u_) is used for non-management operations (sending
messages, uploading files, listing tasks, etc.), the CLI now emits a
warning to stderr:

  ⚠  User token (axp_u_) used for: user_access exchange
     User tokens are management keys — use an agent token for daily work.
     Suppress: AX_I_KNOW_WHAT_IM_DOING=1

Behavior:
- Warns once per session (not per request)
- Suppress via AX_I_KNOW_WHAT_IM_DOING=1 env var
- Management commands (ax token mint, ax credentials) suppress automatically
- Agent tokens (axp_a_) never trigger the warning

Implementation: check fires in _get_jwt() when exchanging for user_access
with a user PAT, since all request paths converge there.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… creds

Three changes to make config resolution workspace-based:

1. _find_project_root() no longer stops at .git boundaries. Only .ax/
   directories are recognized. Identity is workspace-scoped, not
   repo-scoped — cd'ing into a git repo no longer silently changes
   your agent identity.

2. Global config (~/.ax/config.toml) warns if it contains credentials
   (token, token_file, agent_id, agent_name). These should live in
   profiles or workspace config. Global config is for defaults only
   (base_url, etc).

3. AX_VERBOSE=1 prints [env: hostname] to stderr so you always know
   which API you're hitting. No more silent localhost vs prod confusion.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
anvil and others added 7 commits April 13, 2026 03:31
- mint: if agent isn't found in list, try direct get_agent() lookup
  before failing. Handles agents hidden from list endpoint.
- skill: Step 4 now leads with `ax token mint` instead of raw curl.
  Shows one-command mint, mint+save+profile, and swarm bootstrap.

Addresses night_owl QA items #5 and #6.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
User PATs (axp_u_) on routine operations (messages, uploads, tasks)
now EXIT 1 with a clear error instead of just warning. User tokens
send messages as the user, not the agent — causing attribution errors.

The block message tells you exactly what to do:
  ax token mint <agent-name>
  ax credentials issue-enrollment

Override: AX_I_KNOW_WHAT_IM_DOING=1 (not recommended)
Management commands (ax token mint, ax credentials) auto-suppress.

Addresses night_owl QA feedback on PR #43.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When the agent doesn't exist:
- --create flag: creates it automatically, then mints
- Interactive TTY: prompts "Create it? [y/N]"
- Non-interactive: fails with "Use --create to create it"

This makes mint the single entry point for the entire bootstrap:
  ax token mint new-agent --create --save-to /path --profile name

One command: create agent + mint PAT + save token + create profile.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Unprofessional env var name for a production CLI. Renamed to
AX_ALLOW_USER_TOKEN=1 which is clear and descriptive.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Added the small CLI registration route fix in 493a215.

What changed:

  • ax token mint --create now prefers /api/v1/agents/manage/create and falls back to legacy /agents/manage/create only when the route is missing or caught by the frontend HTML shell.
  • mgmt_list_agents gets the same /api/v1 first, legacy fallback behavior.
  • Auth failures (401/403) do not fall back, so permission problems stay visible.

Validation:

  • ruff check .
  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q -> 73 passed
  • python3 -m build --sdist --wheel
  • Live dev smoke: ax token mint cli_route_probe_20260413_041722 --create --audience cli --expires 1 --json created the agent and minted a redacted 1-day CLI PAT successfully.

Remaining route debt before go-live: standardize the management/credential API surface so clients do not need compatibility fallbacks long-term.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Added a reply-routing hardening follow-up in fix(channel): deliver thread replies to listeners.

What changed:

  • Listener reply anchors now match either parent_id or conversation_id.
  • Claude Code channel notifications include conversation_id alongside parent_id.
  • Added regression coverage proving a thread reply with mentions: [] still wakes the listener when it is a reply to a self-authored message.

Validation:

  • ruff check .
  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q tests/test_channel.py tests/test_client.py -> 18 passed
  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q -> 74 passed
  • python3 -m build --sdist --wheel

I also asked @mcp_sentinel to run a live reply-routing QA and report the SSE fields (id, parent_id, conversation_id, mentions, sender/author) so we can confirm backend payload consistency.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Update from ChatGPT/Codex:

  • Added ax handoff as the single composed agent coordination command.
  • Removed assign, ship, manage, and boss registrations/code.
  • Fixed task assignment to send assignee_id in the task body instead of confusing it with author/routing agent_id.
  • Added SSE wait plus recent-message/reply fallback so fast listener replies are not missed.
  • Updated README/docs and pushed the ax-cli wiki handoff runbook.
  • Live smoke passed: next-chatgpt used ax handoff orion ... --no-task --timeout 120 --json; Orion replied over the channel bridge with the handoff token.

Validation:

  • ruff check ax_cli tests
  • ruff format --check ax_cli
  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q -> 79 passed
  • GitHub CI is green across lint and Python 3.11/3.12/3.13 tests.

Operational note: dev/staging nginx currently needs AX_BASE_URL=https://dev.paxai.app/api for CLI message routes; https://dev.paxai.app can auth but 404 message endpoints.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Follow-up update:

  • Added ax context load <key> as the agent-facing artifact loader.
  • It keeps context as the source of truth, fetches authenticated media into the private axctl preview cache, returns metadata + local preview path, and supports --content for text-like files.
  • ax context preview is a hidden alias for the same behavior.
  • Existing context download now shares the same context-file parsing/fetching helper.
  • Tested against the real next attachment key: upload:1776055963919:image.png:edbabba5-76e6-4ab3-a9de-9bd802c0; returned a valid cached PNG path and rendered correctly.
  • Wiki command reference updated.

Validation:

  • ruff check ax_cli tests
  • ruff format --check ax_cli
  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q -> 81 passed
  • GitHub CI is green across lint and Python 3.11/3.12/3.13.

Design note for later backend policy: CLI should stay a loader. Space policy should be enforced server-side: private spaces permissive, team spaces audited/threshold-monitored, public spaces blocked or allowlisted by content type/action.

anvil and others added 4 commits April 13, 2026 05:26
* fix: show short message IDs in table to prevent truncation

UUIDs were being silently truncated by Rich table auto-sizing,
making them unusable for `ax messages get`. Now displays first
8 chars (like git short hashes). Full IDs available via --json.

Co-Authored-By: Cinder <noreply@anthropic.com>

* fix: resolve short message IDs

---------

Co-authored-by: Cinder <noreply@anthropic.com>
Co-authored-by: anvil <anvil@ax-platform.com>
@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Status update from ChatGPT/Codex:\n\n- Merged PR #44 into dev/staging as ac2bf6d; short message IDs now display cleanly in tables while JSON keeps full UUIDs.\n- Added short-ID resolution for messages get, messages edit, messages delete, and reply --parent, so agents can copy the table ID and use it consistently.\n- Fixed the brittle handoff help assertion that was failing CI after Rich help formatting split --follow-up.\n\nValidation on current dev/staging:\n- PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q -> 92 passed\n- python3 -m ruff check ax_cli/ -> pass\n- python3 -m ruff format --check ax_cli/ -> pass\n- python3 -m build --sdist --wheel -> pass after cleaning local generated build artifacts; clean wheel no longer contains stale removed command files.\n- GitHub CI for PR #43 is green across lint and Python 3.11/3.12/3.13.\n\nCurrent state: PR #43 is mergeable but blocked by required review for main. No additional code changes from me are pending.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Release automation follow-up from ChatGPT/Codex:\n\nAdded an automatic release path for ax-cli:\n- Release Please workflow on main pushes. It opens/updates release PRs from Conventional Commits.\n- Release Please config + manifest pinned to current baseline 0.3.1.\n- Baseline CHANGELOG.md added; future release PRs will update it with versioned entries.\n- PyPI publish workflow now also runs on main pushes and manual dispatch, with skip-existing: true so duplicate version attempts no-op instead of breaking.\n- CI now runs on main pushes as well as dev/staging, and includes the package build gate.\n- Added docs/release-process.md with the co-promotion flow: dev/staging -> reviewed main PR -> Release Please PR -> PyPI publish.\n\nValidation:\n- PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q -> 92 passed\n- python3 -m ruff check ax_cli/ -> pass\n- python3 -m ruff format --check ax_cli/ -> pass\n- python3 -m build --sdist --wheel -> pass\n- GitHub CI for #43 is green, including the new package jobs.\n\nOperational note: for fully automatic Release Please PR CI from bot-created PRs, configure a repo secret named RELEASE_PLEASE_TOKEN with a bot PAT. The workflow falls back to GITHUB_TOKEN, but GitHub may suppress follow-on workflows for resources created by the default token.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Operator QA update with @orion:

I handed PR #43 / ax-cli dev/staging to Orion through axctl handoff using the agent-bound next-chatgpt profile. The handoff created task a59a6367-75de-459b-b25b-c00550ede8b9, sent message d4c226c0-2107-41c1-81a8-3a6bee59d382, woke Orion, and the watcher received both the in-progress reply and final report.

Orion result: 7 PASS, 0 FAIL, 2 NOTES. Validated:

  • agent-bound identity
  • user PAT hard block for routine agent work
  • short IDs in message tables
  • short ID resolution with messages get
  • threaded reply using short ID
  • upload with attachment/context metadata
  • context list/get/download/load
  • release automation files and PyPI publish flow

Follow-up pushed in 193ab4b:

  • top-level ax send now accepts --parent as an alias for --reply-to, matching ax messages send.
  • context download/load no longer leaks raw Rich markup tags in plain terminal output/errors.
  • Added regression tests for both notes.

Validation after follow-up:

  • PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/ -q -> 93 passed
  • python3 -m ruff check ax_cli/ -> pass
  • python3 -m ruff format --check ax_cli/ -> pass
  • python3 -m build --sdist --wheel -> pass
  • GitHub CI is green, including package jobs.

@madtank
Copy link
Copy Markdown
Member Author

madtank commented Apr 13, 2026

Operator QA update with @orion:\n\nI handed PR #43 / ax-cli dev/staging to Orion through using the agent-bound profile. The handoff created task , sent message , woke Orion, and the watcher received both the in-progress reply and final report.\n\nOrion result: 7 PASS, 0 FAIL, 2 NOTES. Validated:\n- agent-bound identity\n- user PAT hard block for routine agent work\n- short IDs in message tables\n- short ID resolution with \n- threaded reply using short ID\n- upload with attachment/context metadata\n- context list/get/download/load\n- release automation files and PyPI publish flow\n\nFollow-up pushed in :\n- top-level now accepts as an alias for , matching .\n- no longer leaks raw Rich markup tags in plain terminal output/errors.\n- Added regression tests for both notes.\n\nValidation after follow-up:\n- ........................................................................ [ 77%]
..................... [100%]
93 passed in 2.05s -> 93 passed\n- All checks passed! -> pass\n- 25 files already formatted -> pass\n- running egg_info
writing axctl.egg-info/PKG-INFO
writing dependency_links to axctl.egg-info/dependency_links.txt
writing entry points to axctl.egg-info/entry_points.txt
writing requirements to axctl.egg-info/requires.txt
writing top-level names to axctl.egg-info/top_level.txt
reading manifest file 'axctl.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'axctl.egg-info/SOURCES.txt'
running sdist
running egg_info
writing axctl.egg-info/PKG-INFO
writing dependency_links to axctl.egg-info/dependency_links.txt
writing entry points to axctl.egg-info/entry_points.txt
writing requirements to axctl.egg-info/requires.txt
writing top-level names to axctl.egg-info/top_level.txt
reading manifest file 'axctl.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'axctl.egg-info/SOURCES.txt'
running check
creating axctl-0.3.1
creating axctl-0.3.1/ax_cli
creating axctl-0.3.1/ax_cli/commands
creating axctl-0.3.1/axctl.egg-info
creating axctl-0.3.1/tests
copying files to axctl-0.3.1...
copying LICENSE -> axctl-0.3.1
copying README.md -> axctl-0.3.1
copying pyproject.toml -> axctl-0.3.1
copying ax_cli/init.py -> axctl-0.3.1/ax_cli
copying ax_cli/avatar.py -> axctl-0.3.1/ax_cli
copying ax_cli/client.py -> axctl-0.3.1/ax_cli
copying ax_cli/config.py -> axctl-0.3.1/ax_cli
copying ax_cli/context_keys.py -> axctl-0.3.1/ax_cli
copying ax_cli/main.py -> axctl-0.3.1/ax_cli
copying ax_cli/output.py -> axctl-0.3.1/ax_cli
copying ax_cli/token_cache.py -> axctl-0.3.1/ax_cli
copying ax_cli/commands/init.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/agents.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/auth.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/channel.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/context.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/credentials.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/events.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/handoff.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/keys.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/listen.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/messages.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/mint.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/profile.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/spaces.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/tasks.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/upload.py -> axctl-0.3.1/ax_cli/commands
copying ax_cli/commands/watch.py -> axctl-0.3.1/ax_cli/commands
copying axctl.egg-info/PKG-INFO -> axctl-0.3.1/axctl.egg-info
copying axctl.egg-info/SOURCES.txt -> axctl-0.3.1/axctl.egg-info
copying axctl.egg-info/dependency_links.txt -> axctl-0.3.1/axctl.egg-info
copying axctl.egg-info/entry_points.txt -> axctl-0.3.1/axctl.egg-info
copying axctl.egg-info/requires.txt -> axctl-0.3.1/axctl.egg-info
copying axctl.egg-info/top_level.txt -> axctl-0.3.1/axctl.egg-info
copying tests/test_auth_commands.py -> axctl-0.3.1/tests
copying tests/test_channel.py -> axctl-0.3.1/tests
copying tests/test_client.py -> axctl-0.3.1/tests
copying tests/test_config.py -> axctl-0.3.1/tests
copying tests/test_context_commands.py -> axctl-0.3.1/tests
copying tests/test_handoff.py -> axctl-0.3.1/tests
copying tests/test_messages.py -> axctl-0.3.1/tests
copying tests/test_profile_commands.py -> axctl-0.3.1/tests
copying tests/test_token_cache.py -> axctl-0.3.1/tests
copying tests/test_upload.py -> axctl-0.3.1/tests
copying axctl.egg-info/SOURCES.txt -> axctl-0.3.1/axctl.egg-info
Writing axctl-0.3.1/setup.cfg
Creating tar archive
removing 'axctl-0.3.1' (and everything under it)
running egg_info
writing axctl.egg-info/PKG-INFO
writing dependency_links to axctl.egg-info/dependency_links.txt
writing entry points to axctl.egg-info/entry_points.txt
writing requirements to axctl.egg-info/requires.txt
writing top-level names to axctl.egg-info/top_level.txt
reading manifest file 'axctl.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'axctl.egg-info/SOURCES.txt'
running bdist_wheel
running build
running build_py
copying ax_cli/main.py -> build/lib/ax_cli
copying ax_cli/token_cache.py -> build/lib/ax_cli
copying ax_cli/avatar.py -> build/lib/ax_cli
copying ax_cli/config.py -> build/lib/ax_cli
copying ax_cli/client.py -> build/lib/ax_cli
copying ax_cli/context_keys.py -> build/lib/ax_cli
copying ax_cli/output.py -> build/lib/ax_cli
copying ax_cli/init.py -> build/lib/ax_cli
copying ax_cli/commands/keys.py -> build/lib/ax_cli/commands
copying ax_cli/commands/handoff.py -> build/lib/ax_cli/commands
copying ax_cli/commands/spaces.py -> build/lib/ax_cli/commands
copying ax_cli/commands/listen.py -> build/lib/ax_cli/commands
copying ax_cli/commands/profile.py -> build/lib/ax_cli/commands
copying ax_cli/commands/upload.py -> build/lib/ax_cli/commands
copying ax_cli/commands/watch.py -> build/lib/ax_cli/commands
copying ax_cli/commands/agents.py -> build/lib/ax_cli/commands
copying ax_cli/commands/auth.py -> build/lib/ax_cli/commands
copying ax_cli/commands/events.py -> build/lib/ax_cli/commands
copying ax_cli/commands/tasks.py -> build/lib/ax_cli/commands
copying ax_cli/commands/credentials.py -> build/lib/ax_cli/commands
copying ax_cli/commands/context.py -> build/lib/ax_cli/commands
copying ax_cli/commands/channel.py -> build/lib/ax_cli/commands
copying ax_cli/commands/init.py -> build/lib/ax_cli/commands
copying ax_cli/commands/messages.py -> build/lib/ax_cli/commands
copying ax_cli/commands/mint.py -> build/lib/ax_cli/commands
running egg_info
writing axctl.egg-info/PKG-INFO
writing dependency_links to axctl.egg-info/dependency_links.txt
writing entry points to axctl.egg-info/entry_points.txt
writing requirements to axctl.egg-info/requires.txt
writing top-level names to axctl.egg-info/top_level.txt
reading manifest file 'axctl.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'axctl.egg-info/SOURCES.txt'
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/ax_cli
copying build/lib/ax_cli/main.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/token_cache.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/avatar.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/config.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/client.py -> build/bdist.linux-x86_64/wheel/./ax_cli
creating build/bdist.linux-x86_64/wheel/ax_cli/commands
copying build/lib/ax_cli/commands/keys.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/handoff.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/spaces.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/listen.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/profile.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/upload.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/watch.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/agents.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/auth.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/events.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/tasks.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/credentials.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/context.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/channel.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/init.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/messages.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/commands/mint.py -> build/bdist.linux-x86_64/wheel/./ax_cli/commands
copying build/lib/ax_cli/context_keys.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/output.py -> build/bdist.linux-x86_64/wheel/./ax_cli
copying build/lib/ax_cli/init.py -> build/bdist.linux-x86_64/wheel/./ax_cli
running install_egg_info
Copying axctl.egg-info to build/bdist.linux-x86_64/wheel/./axctl-0.3.1-py3.12.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/axctl-0.3.1.dist-info/WHEEL
creating '/home/ax-agent/shared/repos/ax-cli/dist/.tmp-40c5h8t5/axctl-0.3.1-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'ax_cli/init.py'
adding 'ax_cli/avatar.py'
adding 'ax_cli/client.py'
adding 'ax_cli/config.py'
adding 'ax_cli/context_keys.py'
adding 'ax_cli/main.py'
adding 'ax_cli/output.py'
adding 'ax_cli/token_cache.py'
adding 'ax_cli/commands/init.py'
adding 'ax_cli/commands/agents.py'
adding 'ax_cli/commands/auth.py'
adding 'ax_cli/commands/channel.py'
adding 'ax_cli/commands/context.py'
adding 'ax_cli/commands/credentials.py'
adding 'ax_cli/commands/events.py'
adding 'ax_cli/commands/handoff.py'
adding 'ax_cli/commands/keys.py'
adding 'ax_cli/commands/listen.py'
adding 'ax_cli/commands/messages.py'
adding 'ax_cli/commands/mint.py'
adding 'ax_cli/commands/profile.py'
adding 'ax_cli/commands/spaces.py'
adding 'ax_cli/commands/tasks.py'
adding 'ax_cli/commands/upload.py'
adding 'ax_cli/commands/watch.py'
adding 'axctl-0.3.1.dist-info/licenses/LICENSE'
adding 'axctl-0.3.1.dist-info/METADATA'
adding 'axctl-0.3.1.dist-info/WHEEL'
adding 'axctl-0.3.1.dist-info/entry_points.txt'
adding 'axctl-0.3.1.dist-info/top_level.txt'
adding 'axctl-0.3.1.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built axctl-0.3.1.tar.gz and axctl-0.3.1-py3-none-any.whl -> pass\n- GitHub CI is green, including package jobs.

@madtank madtank merged commit 9df4182 into main Apr 13, 2026
10 checks passed
@madtank madtank deleted the dev/staging branch April 13, 2026 16:25
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