axism 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- axism-0.1.1/.github/copilot-instructions.md +1 -0
- axism-0.1.1/.github/workflows/ci.yml +32 -0
- axism-0.1.1/.github/workflows/release.yml +47 -0
- axism-0.1.1/.gitignore +16 -0
- axism-0.1.1/AGENTS.md +87 -0
- axism-0.1.1/CHANGELOG.md +57 -0
- axism-0.1.1/LICENSE +21 -0
- axism-0.1.1/PKG-INFO +275 -0
- axism-0.1.1/README.md +256 -0
- axism-0.1.1/SECURITY.md +17 -0
- axism-0.1.1/pyproject.toml +47 -0
- axism-0.1.1/scripts/check_anonymity.py +78 -0
- axism-0.1.1/scripts/install.sh +53 -0
- axism-0.1.1/src/axism/__init__.py +50 -0
- axism-0.1.1/src/axism/_build_info.py +3 -0
- axism-0.1.1/src/axism/agents.py +151 -0
- axism-0.1.1/src/axism/cli.py +726 -0
- axism-0.1.1/src/axism/delete.py +509 -0
- axism-0.1.1/src/axism/discover.py +247 -0
- axism-0.1.1/src/axism/fragments.py +229 -0
- axism-0.1.1/src/axism/live.py +503 -0
- axism-0.1.1/src/axism/move.py +751 -0
- axism-0.1.1/src/axism/paths.py +102 -0
- axism-0.1.1/src/axism/providers/__init__.py +99 -0
- axism-0.1.1/src/axism/providers/base.py +296 -0
- axism-0.1.1/src/axism/providers/claude_code.py +209 -0
- axism-0.1.1/src/axism/providers/common.py +184 -0
- axism-0.1.1/src/axism/providers/cursor.py +291 -0
- axism-0.1.1/src/axism/providers/cursor_store/__init__.py +1 -0
- axism-0.1.1/src/axism/providers/cursor_store/discover.py +326 -0
- axism-0.1.1/src/axism/providers/cursor_store/fragments.py +42 -0
- axism-0.1.1/src/axism/providers/cursor_store/live.py +26 -0
- axism-0.1.1/src/axism/providers/cursor_store/ops.py +207 -0
- axism-0.1.1/src/axism/providers/cursor_store/paths.py +139 -0
- axism-0.1.1/src/axism/providers/federation.py +101 -0
- axism-0.1.1/src/axism/providers/hermes.py +293 -0
- axism-0.1.1/src/axism/providers/hermes_store/__init__.py +1 -0
- axism-0.1.1/src/axism/providers/hermes_store/discover.py +175 -0
- axism-0.1.1/src/axism/providers/hermes_store/fragments.py +59 -0
- axism-0.1.1/src/axism/providers/hermes_store/ops.py +65 -0
- axism-0.1.1/src/axism/providers/hermes_store/paths.py +57 -0
- axism-0.1.1/src/axism/providers/transfer.py +639 -0
- axism-0.1.1/src/axism/rename.py +64 -0
- axism-0.1.1/src/axism/settings.py +125 -0
- axism-0.1.1/src/axism/tui/__init__.py +1 -0
- axism-0.1.1/src/axism/tui/app.py +2768 -0
- axism-0.1.1/tests/conftest.py +147 -0
- axism-0.1.1/tests/test_cursor_provider.py +282 -0
- axism-0.1.1/tests/test_discover_delete.py +126 -0
- axism-0.1.1/tests/test_federation.py +136 -0
- axism-0.1.1/tests/test_hermes_provider.py +238 -0
- axism-0.1.1/tests/test_kill.py +75 -0
- axism-0.1.1/tests/test_move.py +268 -0
- axism-0.1.1/tests/test_path_safety.py +31 -0
- axism-0.1.1/tests/test_paths.py +38 -0
- axism-0.1.1/tests/test_providers_registry.py +115 -0
- axism-0.1.1/tests/test_rename.py +26 -0
- axism-0.1.1/tests/test_resume.py +38 -0
- axism-0.1.1/tests/test_settings.py +66 -0
- axism-0.1.1/tests/test_transfer.py +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
See [AGENTS.md](../AGENTS.md) at the repository root for contributor and coding-agent instructions.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, master]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Install uv
|
|
15
|
+
uses: astral-sh/setup-uv@v5
|
|
16
|
+
with:
|
|
17
|
+
enable-cache: true
|
|
18
|
+
|
|
19
|
+
- name: Python
|
|
20
|
+
run: uv python install 3.12
|
|
21
|
+
|
|
22
|
+
- name: Sync
|
|
23
|
+
run: uv sync --extra dev
|
|
24
|
+
|
|
25
|
+
- name: Ruff
|
|
26
|
+
run: uv run ruff check src tests
|
|
27
|
+
|
|
28
|
+
- name: Pytest
|
|
29
|
+
run: uv run pytest -q
|
|
30
|
+
|
|
31
|
+
- name: Anonymity
|
|
32
|
+
run: uv run python scripts/check_anonymity.py
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
release:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
environment: pypi
|
|
15
|
+
permissions:
|
|
16
|
+
contents: write
|
|
17
|
+
id-token: write # Trusted Publisher (OIDC) → PyPI
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
uses: astral-sh/setup-uv@v5
|
|
23
|
+
|
|
24
|
+
- name: Python
|
|
25
|
+
run: uv python install 3.12
|
|
26
|
+
|
|
27
|
+
- name: Build
|
|
28
|
+
run: |
|
|
29
|
+
uv sync --extra dev
|
|
30
|
+
uv build
|
|
31
|
+
ls -la dist
|
|
32
|
+
|
|
33
|
+
- name: Upload GitHub release assets
|
|
34
|
+
uses: softprops/action-gh-release@v2
|
|
35
|
+
with:
|
|
36
|
+
files: |
|
|
37
|
+
dist/*.whl
|
|
38
|
+
dist/*.tar.gz
|
|
39
|
+
generate_release_notes: true
|
|
40
|
+
env:
|
|
41
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
42
|
+
|
|
43
|
+
# Creates the PyPI project on first successful upload when a
|
|
44
|
+
# pending Trusted Publisher is registered for this workflow.
|
|
45
|
+
# See: https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
|
|
46
|
+
- name: Publish to PyPI
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
axism-0.1.1/.gitignore
ADDED
axism-0.1.1/AGENTS.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Agent instructions for aXism
|
|
2
|
+
|
|
3
|
+
**aXism** (*Agent Interactive Session Manager*) is a TUI + CLI session manager for Claude Code, Cursor, and Hermes. Keep the product name and binary **`axism`** agent-agnostic.
|
|
4
|
+
|
|
5
|
+
## Stack
|
|
6
|
+
|
|
7
|
+
- Python 3.12+, Textual, uv, hatchling
|
|
8
|
+
- Binary: `axism`
|
|
9
|
+
- Package: `axism` under `src/axism/`
|
|
10
|
+
- Display name: **aXism**
|
|
11
|
+
|
|
12
|
+
## Hard rules
|
|
13
|
+
|
|
14
|
+
1. **Anonymity** — no hostnames, forge URLs, personal home paths, or secrets in tracked files. Fixtures use synthetic `/home/alice/...` or `/Users/alice/...` only. Run `python3 scripts/check_anonymity.py`.
|
|
15
|
+
2. **Protected paths** — never delete credentials, agent config, skills, plugins, daemon keys, project `memory/`, or a backend's whole database with a normal session delete. `fragments.PROTECTED_NAMES` is shared by every provider.
|
|
16
|
+
3. **Subprocess** — argv lists only; never `shell=True`.
|
|
17
|
+
4. **Go through the provider** — TUI and CLI call `SessionProvider` methods only. Never import `discover` / `live` / `rename` / `move` / `delete` / `fragments` directly from `cli.py` or `tui/app.py`; those are Claude Code's implementation, wrapped by `ClaudeCodeProvider`.
|
|
18
|
+
5. **Unsupported means explicit** — declare it in `Capabilities`, then raise `UnsupportedOperation` (or return a failed `MoveResult` / `(False, message)`). Never silently no-op.
|
|
19
|
+
6. **Stop** — `s`/`S` targets whatever `provider.can_stop(live)` allows: Claude Code background jobs via ``claude stop``, otherwise the agent process. Never map Stop onto a global switch such as `hermes pause`.
|
|
20
|
+
7. **Pane-aware keys** — Space / a / d / o / s / m follow the projects vs sessions matrix; **c/C clears all marks** (projects + sessions). **d/D** deletes projects when the projects pane is focused, sessions otherwise. **m/M moves** project(s) or session(s) to another path (pick existing or type cwd) within the same agent tool. **`,`** opens Settings (include backends + config dirs). Enabled backends are federated into one inventory; marks/live use `provider:id` keys.
|
|
21
|
+
8. User-facing branding says **aXism**. Name a specific agent only where the code shells out to it.
|
|
22
|
+
9. **Docs are current-state only** — README and similar docs describe how the project works *now*, not how it evolved. Prefer editing content in place over phrases like “was removed,” “previously,” “used to,” “as of [date],” or “no longer.” Do not put agent/process meta-commentary into project files. **Exception:** keep `CHANGELOG.md` up to date on every version bump (see Versioning).
|
|
23
|
+
10. **Changelog** — when bumping the version, move `[Unreleased]` notes into a new `## [X.Y.Z] — YYYY-MM-DD` section in `CHANGELOG.md` and leave a fresh empty `[Unreleased]` stub.
|
|
24
|
+
|
|
25
|
+
## Layout
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
src/axism/
|
|
29
|
+
cli.py, tui/, agents.py, delete.py, discover.py, fragments.py, live.py, move.py,
|
|
30
|
+
paths.py, rename.py, settings.py # Claude Code implementation + shared DTOs
|
|
31
|
+
providers/
|
|
32
|
+
base.py # SessionProvider protocol, Capabilities, ProviderBase
|
|
33
|
+
common.py # shared helpers for filesystem-backed backends
|
|
34
|
+
__init__.py # registry: PROVIDER_LABELS + get_provider
|
|
35
|
+
claude_code.py # wraps the top-level modules above
|
|
36
|
+
cursor.py + cursor_store/ # ~/.cursor agent transcripts + CLI SQLite chats
|
|
37
|
+
hermes.py + hermes_store/ # ~/.hermes state.db, mutations via the hermes CLI
|
|
38
|
+
tests/ # synthetic alice fixtures
|
|
39
|
+
scripts/install.sh
|
|
40
|
+
scripts/check_anonymity.py
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Provider scope
|
|
44
|
+
|
|
45
|
+
Each backend manages **default chat sessions only**. Work beyond that belongs on its own branch so the shared protocol stays stable:
|
|
46
|
+
|
|
47
|
+
| Branch | Scope |
|
|
48
|
+
|--------|-------|
|
|
49
|
+
| `feat/hermes-extras` | Hermes profiles (`profiles/<name>/state.db`), kanban boards (`kanban.db`), `hermes project` workspaces (`projects.db`), messaging/cron sources |
|
|
50
|
+
| `feat/cursor-extras` | Cursor desktop Composer history in the Electron profile (`state.vscdb`) |
|
|
51
|
+
|
|
52
|
+
If one of those needs a protocol change, extend `SessionProvider` in a way every backend can satisfy — never with a single-backend assumption in `base.py`.
|
|
53
|
+
|
|
54
|
+
## Adding a provider
|
|
55
|
+
|
|
56
|
+
1. Create `providers/<name>.py` subclassing `ProviderBase`, plus `providers/<name>_store/` for its layout. Do not import another backend's store package.
|
|
57
|
+
2. Map into the shared DTOs (`ProjectInfo`, `SessionMeta`, `LiveSession`, `Fragment`); use `SessionMeta.entrypoint` for a badge rather than new required fields.
|
|
58
|
+
3. Register the id and label in `providers/__init__.py`, and set `config_hint` for the Settings placeholder.
|
|
59
|
+
4. Prefer the agent's own CLI for mutations when one exists; fall back to filesystem operations only where it does not.
|
|
60
|
+
5. Add tests with synthetic fixtures under `tests/`; never touch a real agent home in a test.
|
|
61
|
+
|
|
62
|
+
## Dev commands
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
uv sync --extra dev
|
|
66
|
+
uv run pytest
|
|
67
|
+
uv run ruff check src tests
|
|
68
|
+
python3 scripts/check_anonymity.py
|
|
69
|
+
uv run axism --help
|
|
70
|
+
uv tool install --force .
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Versioning & release
|
|
74
|
+
|
|
75
|
+
Bump **all** of:
|
|
76
|
+
|
|
77
|
+
| File | Field / action |
|
|
78
|
+
|------|----------------|
|
|
79
|
+
| `pyproject.toml` | `project.version` |
|
|
80
|
+
| `src/axism/__init__.py` | `__version__` |
|
|
81
|
+
| `CHANGELOG.md` | move `[Unreleased]` → `## [X.Y.Z] — YYYY-MM-DD`; leave empty `[Unreleased]` |
|
|
82
|
+
|
|
83
|
+
Tag `v*` (e.g. `v0.1.0`) to trigger `.github/workflows/release.yml` (GitHub Release assets + PyPI). Keep docs forge-agnostic (no hardcoded private hosts).
|
|
84
|
+
|
|
85
|
+
## Commits
|
|
86
|
+
|
|
87
|
+
Prefer generic messages (“add pane-aware select”, not machine- or customer-specific notes).
|
axism-0.1.1/CHANGELOG.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to aXism are documented in this file.
|
|
4
|
+
|
|
5
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.1] — 2026-09-23
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Cursor provider: IDE agent transcripts (`~/.cursor/projects/<slug>/agent-transcripts/`) and CLI chats (`~/.cursor/chats/<md5-cwd>/<id>/`, both the SQLite and JSON-sidecar shapes), with open, stop, rename, move, and delete
|
|
15
|
+
- Hermes provider: interactive sessions from `~/.hermes/state.db`, opened with `hermes --resume` and mutated through `hermes sessions`
|
|
16
|
+
- `--provider` flag and `axism providers` command
|
|
17
|
+
- Provider `Capabilities`, so keys a backend cannot perform report instead of failing
|
|
18
|
+
- Federated inventory: enable multiple backends in Settings; TUI and `axism list` show them together with an **Agent** column when more than one is active
|
|
19
|
+
- `providers/federation.py` helpers and composite `provider:id` keys for marks/live maps
|
|
20
|
+
- Cross-agent session copy (beta): TUI move to another agent, or `axism export <id> --to-provider … --to /cwd` (text turns; source kept)
|
|
21
|
+
- Hermes inventory includes imported (`claude-code` / `codex`) and `oneshot` sessions; exports stamp the destination cwd
|
|
22
|
+
- Publish tagged releases to PyPI via GitHub Actions Trusted Publisher (OIDC)
|
|
23
|
+
- Project homepage / repository / issues URLs in package metadata
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- `SessionProvider` covers discovery, liveness, open/stop, fragments, rename, move, and delete; the TUI and CLI no longer reach into Claude Code's modules directly
|
|
28
|
+
- `--config-dir` overrides the active provider's root instead of always setting `$CLAUDE_CONFIG_DIR`
|
|
29
|
+
- Credentials, agent config files, and backend databases are protected for every provider
|
|
30
|
+
- Settings Space = include in inventory; Enter = CLI default (`active_provider`)
|
|
31
|
+
- Move/delete refuse mixed-agent selections; destinations stay within the same agent tool
|
|
32
|
+
- Sessions filter/sort chrome sits under the sessions table; Tab cycles detail → sessions → projects
|
|
33
|
+
- Header shows full brand + version without mid-name ellipsis
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- CI pytest collection (`pythonpath` includes project root so `tests.*` imports resolve)
|
|
38
|
+
- Cross-agent transfer into Claude Code now writes `customTitle` so the transferred session keeps its title
|
|
39
|
+
- Hermes delete stops a live session's process before deleting it, matching Claude Code and Cursor
|
|
40
|
+
- Cursor delete now blocks on a genuinely running `cursor-agent` process instead of never blocking
|
|
41
|
+
- Cursor session move no longer reports failure when a session is already at the destination
|
|
42
|
+
|
|
43
|
+
## [0.1.0] — 2026-09-19
|
|
44
|
+
|
|
45
|
+
Initial public release.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- Textual TUI and CLI session manager (`axism`) for Claude Code configs
|
|
50
|
+
- Cross-project inventory: list, open, stop, rename, move, delete
|
|
51
|
+
- Pane-aware projects / sessions / detail layout with essential footer bindings
|
|
52
|
+
- Settings for active provider and config directory
|
|
53
|
+
- Session filter and sort in the sessions pane
|
|
54
|
+
- Safe delete with confirm; project delete uses a stronger danger confirm
|
|
55
|
+
- Project move with memory merge and optional agent handoff on dual `MEMORY.md`
|
|
56
|
+
- GitHub Actions CI (pytest, ruff, anonymity check) and tagged GitHub Releases
|
|
57
|
+
- Install via `scripts/install.sh` / `uv tool install`
|
axism-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 aXism contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
axism-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: axism
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: aXism — Agent Interactive Session Manager (TUI + CLI)
|
|
5
|
+
Project-URL: Homepage, https://github.com/aXistem-dev/axism
|
|
6
|
+
Project-URL: Repository, https://github.com/aXistem-dev/axism
|
|
7
|
+
Project-URL: Issues, https://github.com/aXistem-dev/axism/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/aXistem-dev/axism/blob/main/CHANGELOG.md
|
|
9
|
+
Author: aXism contributors
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: agents,ai,axism,claude-code,sessions,tui
|
|
13
|
+
Requires-Python: >=3.12
|
|
14
|
+
Requires-Dist: textual>=1.0.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
17
|
+
Requires-Dist: ruff>=0.8.0; extra == 'dev'
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
|
|
20
|
+
# aXism
|
|
21
|
+
|
|
22
|
+
**Agent Interactive Session Manager** — list, inspect, open, stop, rename, move, and purge coding-agent chat sessions and their on-disk fragments across every project on your machine.
|
|
23
|
+
|
|
24
|
+
**Current version: `0.1.0`** (`pyproject.toml` / `axism --version`)
|
|
25
|
+
|
|
26
|
+
[](LICENSE)
|
|
27
|
+
[](https://www.python.org/downloads/)
|
|
28
|
+
[](pyproject.toml)
|
|
29
|
+
[](.github/workflows/ci.yml)
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<a href="https://buymeacoffee.com/confituurke">
|
|
33
|
+
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="50" width="217" />
|
|
34
|
+
</a>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
Works on **Linux** and **macOS**, across three agent backends:
|
|
38
|
+
|
|
39
|
+
| Provider | Id | Session store | Config override |
|
|
40
|
+
|----------|----|---------------|-----------------|
|
|
41
|
+
| [Claude Code](https://code.claude.com/) (default) | `claude_code` | `projects/<slug>/<uuid>.jsonl` | `$CLAUDE_CONFIG_DIR` or `~/.claude` |
|
|
42
|
+
| Cursor | `cursor` | `projects/<slug>/agent-transcripts/<id>/` and `chats/<md5-cwd>/<id>/` | `$CURSOR_DATA_DIR` or `~/.cursor` |
|
|
43
|
+
| Hermes | `hermes` | `state.db` (`sessions` + `messages`) | `$HERMES_HOME` or `~/.hermes` |
|
|
44
|
+
|
|
45
|
+
Enable any combination in Settings (`,`) in the TUI — Space includes a backend in the inventory; Enter sets the CLI default. Use `--provider` on the CLI to scope one command to a single backend.
|
|
46
|
+
|
|
47
|
+
## Features
|
|
48
|
+
|
|
49
|
+
- Cross-project session inventory with sizes, tags, and live/background state
|
|
50
|
+
- Pane-aware Textual TUI: **projects (25%) · sessions (50%) · detail**
|
|
51
|
+
- Detail shows **project** summary when the projects pane is focused; **session** detail otherwise
|
|
52
|
+
- Footer only lists essentials (plus Settings / Help); `?` has the full key legend
|
|
53
|
+
- Theme-aware markup (`t` picker / `T` cycle)
|
|
54
|
+
- Mark, open, stop, rename, **move**, and delete — all respect focus and multi-select
|
|
55
|
+
- **Delete** is pane-aware: `d` on projects deletes projects; `d` on sessions deletes sessions (project delete confirm uses a stronger danger style)
|
|
56
|
+
- Move projects or sessions to another project (pick existing or type a path)
|
|
57
|
+
- Project moves merge `memory/` into the destination (colliding names get a `-from-<slug>` suffix; dual `MEMORY.md` can hand off to a local agent CLI)
|
|
58
|
+
- Settings (`,`) to include backends in the inventory and set config directories (`~/.config/axism/settings.json`)
|
|
59
|
+
- When more than one agent is enabled, the projects pane shows an **Agent** column
|
|
60
|
+
- Safe delete with confirm (stops live processes when deleting)
|
|
61
|
+
- Header shows brand with version/commit beside it; `v` for runtime details
|
|
62
|
+
- Sessions pane: `/` filter, `.` cycle sort (updated / title / size)
|
|
63
|
+
- Open sessions via the provider CLI (`claude attach` / `claude --resume`, `cursor-agent --resume`, `hermes --resume`)
|
|
64
|
+
- Keys that a backend cannot perform say so instead of failing halfway
|
|
65
|
+
- Headless CLI for scripting
|
|
66
|
+
|
|
67
|
+
## Install
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# once published to PyPI
|
|
71
|
+
pipx install axism
|
|
72
|
+
# or
|
|
73
|
+
uv tool install axism
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
From GitHub release assets:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
uv tool install https://github.com/aXistem-dev/axism/releases/download/v0.1.0/axism-0.1.0-py3-none-any.whl
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
From a clone (development):
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
./scripts/install.sh
|
|
86
|
+
# or: uv tool install --force .
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Ensure `~/.local/bin` is on your `PATH`. Then:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
axism --version # e.g. axism 0.1.0
|
|
93
|
+
axism --help
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Quick start
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
axism # TUI
|
|
100
|
+
axism tui
|
|
101
|
+
axism list
|
|
102
|
+
axism list --project /home/alice/src/demo
|
|
103
|
+
axism list --json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Keyboard (TUI)
|
|
107
|
+
|
|
108
|
+
Actions are **pane-aware**. Most letter keys accept both cases (`a` / `A`, `q` / `Q`, …). The footer hides keys that cannot run right now (e.g. Open/Rename/Stop on the projects pane, Stop when nothing is stoppable). Press **`?`** / **`h`** for the full legend.
|
|
109
|
+
|
|
110
|
+
| Key | Projects pane | Sessions / detail |
|
|
111
|
+
|-----|---------------|-------------------|
|
|
112
|
+
| `Tab` | Switch pane (detail → sessions → projects) | Same |
|
|
113
|
+
| `Shift+Tab` / `←` / `→` | Switch pane (`←`/`→` spatial) | Same |
|
|
114
|
+
| `↑` / `↓` | Move in list | Move in list |
|
|
115
|
+
| `Space` | Mark project | Mark session (no-op on detail) |
|
|
116
|
+
| `a` / `A` | Select all projects | Select all sessions in project |
|
|
117
|
+
| `c` / `C` | Clear **all** marks (projects + sessions) | Clear **all** marks |
|
|
118
|
+
| `o` / `O` | — | **Open** — live background → `claude attach`; else `claude --resume` |
|
|
119
|
+
| `s` / `S` | — | **Stop** background session(s) (same as `/stop` while attached) |
|
|
120
|
+
| `n` / `N` | — | **Rename** focused session |
|
|
121
|
+
| `m` / `M` | **Move** marked/focused project(s) | **Move** marked/focused session(s) |
|
|
122
|
+
| `/` | — | Focus session filter |
|
|
123
|
+
| `.` | — | Cycle session sort |
|
|
124
|
+
| `d` / `D` | Delete marked/focused project(s) | Delete marked/focused session(s) |
|
|
125
|
+
| `r` / `R` | Refresh | Refresh |
|
|
126
|
+
| `t` | Theme picker | Theme picker |
|
|
127
|
+
| `T` | Cycle theme | Cycle theme |
|
|
128
|
+
| `,` | Settings (include agents + config dirs) | Settings |
|
|
129
|
+
| `v` / `V` | Version details | Version details |
|
|
130
|
+
| `?` / `h` | Help | Help |
|
|
131
|
+
| `q` / `Q` | Quit | Quit |
|
|
132
|
+
|
|
133
|
+
**Move** opens a dialog: pick another project from the list (↑/↓), or **Tab** to the path field and type an absolute workspace path (**Shift+Tab** returns to the list). One project → a new path renames the Claude project directory and creates the workspace folder if needed (source tree files stay put); otherwise sessions and `memory/` are merged into the destination. Live/background sessions must be stopped first. If both sides have `MEMORY.md`, aXism offers a handoff to a detected agent CLI (`claude`, `cursor`, `opencode`, `aider`, `codex`, …) or saves a task brief only.
|
|
134
|
+
|
|
135
|
+
Confirm dialogs use `y` / `n` / `Esc`.
|
|
136
|
+
|
|
137
|
+
## CLI
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
axism --version
|
|
141
|
+
axism list
|
|
142
|
+
axism list --project /home/alice/src/demo
|
|
143
|
+
axism list --json
|
|
144
|
+
axism show <session-uuid>
|
|
145
|
+
axism resume <session-uuid>
|
|
146
|
+
axism resume <session-uuid> --print-only
|
|
147
|
+
axism stop <session-uuid> --yes
|
|
148
|
+
axism rename <session-uuid> "New title"
|
|
149
|
+
axism move <session-uuid> [<uuid>…] --to /home/alice/src/other
|
|
150
|
+
axism move --project /home/alice/src/demo --to /home/alice/src/other
|
|
151
|
+
axism move --project -home-alice-src-demo --to /home/alice/src/other --dry-run
|
|
152
|
+
axism move --project /home/alice/src/demo --to /home/alice/src/other --memory-agent auto
|
|
153
|
+
axism move --project /home/alice/src/demo --to /home/alice/src/other --memory-agent claude --memory-agent-force
|
|
154
|
+
axism move --project /home/alice/src/demo --to /home/alice/src/other --no-merge-memory
|
|
155
|
+
axism export <session-uuid> --to-provider hermes --to /home/alice/src/demo
|
|
156
|
+
axism export <session-uuid> --to-provider cursor --to /home/alice/src/other --dry-run
|
|
157
|
+
axism delete <session-uuid> --dry-run
|
|
158
|
+
axism delete <uuid-a> <uuid-b> --yes
|
|
159
|
+
axism delete-project /home/alice/src/demo --dry-run
|
|
160
|
+
axism delete-project -home-alice-src-demo --yes
|
|
161
|
+
axism delete-project -home-alice-src-demo --yes --keep-memory
|
|
162
|
+
axism purge-project /home/alice/src/demo --dry-run # wraps: claude project purge
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Global flags: `--provider {claude_code,cursor,hermes}`, `--config-dir`, `--no-cli` (skip agent-CLI live enrichment), `--version`.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
axism providers # backends, enabled state, and resolved roots
|
|
169
|
+
axism --provider cursor list
|
|
170
|
+
axism --provider hermes show <session-id>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
TUI **Settings** (`,`) stores which backends are included (`enabled`), the CLI default (`active_provider`), and optional per-backend config dirs in `~/.config/axism/settings.json` (or `$AXISM_CONFIG_DIR`). The TUI and `axism list` merge every enabled backend; `--provider` scopes one CLI command to a single backend; `--config-dir` overrides that backend's root. Same-agent move/delete refuse mixed marks. Session **move** to another agent copies text turns (source kept); use `axism export` for the same from the CLI.
|
|
174
|
+
|
|
175
|
+
## Backend differences
|
|
176
|
+
|
|
177
|
+
Every backend implements the same provider interface, and each one refuses what its agent genuinely cannot do:
|
|
178
|
+
|
|
179
|
+
| Capability | Claude Code | Cursor | Hermes |
|
|
180
|
+
|------------|-------------|--------|--------|
|
|
181
|
+
| Open / resume | `claude attach` or `claude --resume` | `cursor-agent --resume` | `hermes --resume` |
|
|
182
|
+
| Stop | `claude stop` on background jobs | ends the `cursor-agent` process | ends the `hermes` process |
|
|
183
|
+
| Rename | `custom-title` transcript record | `store.db` name / title sidecar | `hermes sessions rename` |
|
|
184
|
+
| Move sessions / projects | yes, with `memory/` merge | yes (relocates chat dirs) | not supported |
|
|
185
|
+
| Delete session | fragment plan across the tree | removes the chat dir in each store | `hermes sessions delete` |
|
|
186
|
+
| Project purge | `claude project purge` | not supported | not supported |
|
|
187
|
+
|
|
188
|
+
Hermes reads `state.db` read-only and only lists interactive sources (`cli`, `tui`, `desktop`, `webui`) — cron and kanban worker sessions stay hidden.
|
|
189
|
+
|
|
190
|
+
A Cursor chat started from the CLI exists in both stores under one id; aXism shows it once and treats both directories as its fragments. CLI chats come in two shapes — a SQLite `store.db` (its `name` is the title) and newer `meta.json` + `prompt_history.json` sidecars (title comes from the first real prompt) — and both are listed.
|
|
191
|
+
|
|
192
|
+
### Not managed
|
|
193
|
+
|
|
194
|
+
These stores are intentionally left alone:
|
|
195
|
+
|
|
196
|
+
- Hermes named profiles (`~/.hermes/profiles/<name>/`, each with its own `state.db`), kanban boards (`kanban.db`), and `hermes project` workspaces (`projects.db`)
|
|
197
|
+
- Hermes gateway/messaging sessions (Telegram, Discord, Slack, …) and cron runs
|
|
198
|
+
- Cursor's desktop Composer history in the Electron profile (`~/.config/Cursor` / `~/Library/Application Support/Cursor`)
|
|
199
|
+
|
|
200
|
+
## How it works
|
|
201
|
+
|
|
202
|
+
aXism scans every **enabled** provider config root, maps each session id to its transcripts, jobs, subagents, caches, and live records (namespaced per backend), then lets you open, stop, rename, move, or delete those fragments without touching protected global state. The TUI and CLI only ever call the provider interface in [`src/axism/providers/base.py`](src/axism/providers/base.py); each backend owns its own layout under `providers/<name>_store/`.
|
|
203
|
+
|
|
204
|
+
Claude Code's tree:
|
|
205
|
+
|
|
206
|
+
```text
|
|
207
|
+
configRoot
|
|
208
|
+
├── projects/<slug>/<uuid>.jsonl transcripts
|
|
209
|
+
├── projects/<slug>/<uuid>/ subagents / tool-results
|
|
210
|
+
├── projects/<slug>/memory/ project memory (protected on session delete)
|
|
211
|
+
├── file-history/<uuid>/
|
|
212
|
+
├── jobs/<short8>/
|
|
213
|
+
├── sessions/<pid>.json live registry
|
|
214
|
+
└── history.jsonl prompt index (rewritten on delete / move)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Project slugs are Claude Code’s encoding of an absolute cwd (non-alphanumeric → `-`).
|
|
218
|
+
|
|
219
|
+
**Move** relocates session files between `projects/<slug>/` dirs (or renames a whole project dir), rewrites **all** transcript `cwd` fields to the destination, updates `history.jsonl` / job `cwd` when present, creates the destination workspace folder if it does not exist (it does **not** move your source tree files), and leaves UUID-keyed fragment trees (`file-history`, …) in place. Project merges also merge `memory/` (unique files move; content collisions become `-from-<slug>` names; dual `MEMORY.md` parks the source index for an optional agent handoff).
|
|
220
|
+
|
|
221
|
+
## What is protected
|
|
222
|
+
|
|
223
|
+
Never deleted with a session: credentials (`auth.json`, `.credentials.json`, `.env`), agent config (`settings.json`, `config.yaml`, `cli-config.json`), skills, plugins, daemon keys, project `memory/`, the Hermes `state.db`, and unrelated global caches.
|
|
224
|
+
|
|
225
|
+
**Project delete** removes `projects/<slug>/` (memory unless `--keep-memory`) plus linked session fragments outside that directory.
|
|
226
|
+
|
|
227
|
+
## Build from source
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
uv sync --extra dev
|
|
231
|
+
uv run pytest
|
|
232
|
+
uv run ruff check src tests
|
|
233
|
+
python3 scripts/check_anonymity.py
|
|
234
|
+
uv build # dist/axism-0.1.0-*.whl and *.tar.gz
|
|
235
|
+
./scripts/install.sh # reinstall tool + print axism --version
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Versioning
|
|
239
|
+
|
|
240
|
+
Bump **all** when releasing:
|
|
241
|
+
|
|
242
|
+
| File | Field |
|
|
243
|
+
|------|--------|
|
|
244
|
+
| `pyproject.toml` | `project.version` |
|
|
245
|
+
| `src/axism/__init__.py` | `__version__` |
|
|
246
|
+
| `CHANGELOG.md` | new `[X.Y.Z]` section from `[Unreleased]` |
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
axism --version # installed binary
|
|
250
|
+
# → axism 0.1.0
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Tag `v*` (e.g. `v0.1.0`) to trigger the release workflow.
|
|
254
|
+
|
|
255
|
+
## Releases & CI
|
|
256
|
+
|
|
257
|
+
- **CI** (`.github/workflows/ci.yml`): pytest, ruff, anonymity check — works on GitHub Actions and Forgejo/Gitea/Codeberg Actions.
|
|
258
|
+
- **Release** (`.github/workflows/release.yml`): on tag `v*`, builds wheel/sdist, uploads GitHub release assets, and publishes to PyPI via Trusted Publisher (OIDC).
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
git tag v0.1.0
|
|
262
|
+
git push origin v0.1.0
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Contributing
|
|
266
|
+
|
|
267
|
+
See [AGENTS.md](AGENTS.md) for coding-agent and human contributor rules (anonymity, pane-aware keys, safe delete / move).
|
|
268
|
+
|
|
269
|
+
## Support
|
|
270
|
+
|
|
271
|
+
[](https://buymeacoffee.com/confituurke)
|
|
272
|
+
|
|
273
|
+
## License
|
|
274
|
+
|
|
275
|
+
[MIT](LICENSE) © aXism contributors
|