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.
Files changed (60) hide show
  1. axism-0.1.1/.github/copilot-instructions.md +1 -0
  2. axism-0.1.1/.github/workflows/ci.yml +32 -0
  3. axism-0.1.1/.github/workflows/release.yml +47 -0
  4. axism-0.1.1/.gitignore +16 -0
  5. axism-0.1.1/AGENTS.md +87 -0
  6. axism-0.1.1/CHANGELOG.md +57 -0
  7. axism-0.1.1/LICENSE +21 -0
  8. axism-0.1.1/PKG-INFO +275 -0
  9. axism-0.1.1/README.md +256 -0
  10. axism-0.1.1/SECURITY.md +17 -0
  11. axism-0.1.1/pyproject.toml +47 -0
  12. axism-0.1.1/scripts/check_anonymity.py +78 -0
  13. axism-0.1.1/scripts/install.sh +53 -0
  14. axism-0.1.1/src/axism/__init__.py +50 -0
  15. axism-0.1.1/src/axism/_build_info.py +3 -0
  16. axism-0.1.1/src/axism/agents.py +151 -0
  17. axism-0.1.1/src/axism/cli.py +726 -0
  18. axism-0.1.1/src/axism/delete.py +509 -0
  19. axism-0.1.1/src/axism/discover.py +247 -0
  20. axism-0.1.1/src/axism/fragments.py +229 -0
  21. axism-0.1.1/src/axism/live.py +503 -0
  22. axism-0.1.1/src/axism/move.py +751 -0
  23. axism-0.1.1/src/axism/paths.py +102 -0
  24. axism-0.1.1/src/axism/providers/__init__.py +99 -0
  25. axism-0.1.1/src/axism/providers/base.py +296 -0
  26. axism-0.1.1/src/axism/providers/claude_code.py +209 -0
  27. axism-0.1.1/src/axism/providers/common.py +184 -0
  28. axism-0.1.1/src/axism/providers/cursor.py +291 -0
  29. axism-0.1.1/src/axism/providers/cursor_store/__init__.py +1 -0
  30. axism-0.1.1/src/axism/providers/cursor_store/discover.py +326 -0
  31. axism-0.1.1/src/axism/providers/cursor_store/fragments.py +42 -0
  32. axism-0.1.1/src/axism/providers/cursor_store/live.py +26 -0
  33. axism-0.1.1/src/axism/providers/cursor_store/ops.py +207 -0
  34. axism-0.1.1/src/axism/providers/cursor_store/paths.py +139 -0
  35. axism-0.1.1/src/axism/providers/federation.py +101 -0
  36. axism-0.1.1/src/axism/providers/hermes.py +293 -0
  37. axism-0.1.1/src/axism/providers/hermes_store/__init__.py +1 -0
  38. axism-0.1.1/src/axism/providers/hermes_store/discover.py +175 -0
  39. axism-0.1.1/src/axism/providers/hermes_store/fragments.py +59 -0
  40. axism-0.1.1/src/axism/providers/hermes_store/ops.py +65 -0
  41. axism-0.1.1/src/axism/providers/hermes_store/paths.py +57 -0
  42. axism-0.1.1/src/axism/providers/transfer.py +639 -0
  43. axism-0.1.1/src/axism/rename.py +64 -0
  44. axism-0.1.1/src/axism/settings.py +125 -0
  45. axism-0.1.1/src/axism/tui/__init__.py +1 -0
  46. axism-0.1.1/src/axism/tui/app.py +2768 -0
  47. axism-0.1.1/tests/conftest.py +147 -0
  48. axism-0.1.1/tests/test_cursor_provider.py +282 -0
  49. axism-0.1.1/tests/test_discover_delete.py +126 -0
  50. axism-0.1.1/tests/test_federation.py +136 -0
  51. axism-0.1.1/tests/test_hermes_provider.py +238 -0
  52. axism-0.1.1/tests/test_kill.py +75 -0
  53. axism-0.1.1/tests/test_move.py +268 -0
  54. axism-0.1.1/tests/test_path_safety.py +31 -0
  55. axism-0.1.1/tests/test_paths.py +38 -0
  56. axism-0.1.1/tests/test_providers_registry.py +115 -0
  57. axism-0.1.1/tests/test_rename.py +26 -0
  58. axism-0.1.1/tests/test_resume.py +38 -0
  59. axism-0.1.1/tests/test_settings.py +66 -0
  60. 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
@@ -0,0 +1,16 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .eggs/
5
+ dist/
6
+ build/
7
+ .venv/
8
+ venv/
9
+ .pytest_cache/
10
+ .mypy_cache/
11
+ .ruff_cache/
12
+ .coverage
13
+ htmlcov/
14
+ *.swp
15
+ .DS_Store
16
+ uv.lock
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).
@@ -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: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
27
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
28
+ [![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](pyproject.toml)
29
+ [![CI](https://img.shields.io/badge/CI-pytest%20%2B%20ruff-brightgreen.svg)](.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
+ [![Buy Me A Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://buymeacoffee.com/confituurke)
272
+
273
+ ## License
274
+
275
+ [MIT](LICENSE) © aXism contributors