session-compass 0.1.0__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 (47) hide show
  1. session_compass-0.1.0/.github/scripts/update_compatibility_issue.js +106 -0
  2. session_compass-0.1.0/.github/workflows/cli-compatibility-pr.yml +80 -0
  3. session_compass-0.1.0/.github/workflows/cli-compatibility.yml +101 -0
  4. session_compass-0.1.0/.github/workflows/publish.yml +40 -0
  5. session_compass-0.1.0/.gitignore +5 -0
  6. session_compass-0.1.0/LICENSE +21 -0
  7. session_compass-0.1.0/PKG-INFO +154 -0
  8. session_compass-0.1.0/README.md +138 -0
  9. session_compass-0.1.0/cli-sessions-customization-master-plan.md +1663 -0
  10. session_compass-0.1.0/docs/superpowers/plans/2026-09-08-agy-session-metadata-filtering.md +90 -0
  11. session_compass-0.1.0/docs/superpowers/plans/2026-09-08-cli-compatibility-monitoring.md +738 -0
  12. session_compass-0.1.0/docs/superpowers/plans/2026-09-08-session-compass-rename.md +554 -0
  13. session_compass-0.1.0/docs/superpowers/progress/2026-09-08-cli-compatibility-monitoring-progress.md +91 -0
  14. session_compass-0.1.0/docs/superpowers/specs/2026-09-08-cli-compatibility-monitoring-design.md +402 -0
  15. session_compass-0.1.0/docs/superpowers/specs/2026-09-08-session-compass-rename-design.md +144 -0
  16. session_compass-0.1.0/install.sh +32 -0
  17. session_compass-0.1.0/pyproject.toml +28 -0
  18. session_compass-0.1.0/scripts/__init__.py +1 -0
  19. session_compass-0.1.0/scripts/build_compatibility_report.py +43 -0
  20. session_compass-0.1.0/scripts/probe_cli_compatibility.py +93 -0
  21. session_compass-0.1.0/src/session_compass/__init__.py +3 -0
  22. session_compass-0.1.0/src/session_compass/agents/__init__.py +5 -0
  23. session_compass-0.1.0/src/session_compass/agents/antigravity.py +173 -0
  24. session_compass-0.1.0/src/session_compass/agents/base.py +141 -0
  25. session_compass-0.1.0/src/session_compass/agents/claude.py +113 -0
  26. session_compass-0.1.0/src/session_compass/agents/codex.py +152 -0
  27. session_compass-0.1.0/src/session_compass/agents/copilot.py +97 -0
  28. session_compass-0.1.0/src/session_compass/agents/registry.py +26 -0
  29. session_compass-0.1.0/src/session_compass/cli.py +139 -0
  30. session_compass-0.1.0/tests/__init__.py +1 -0
  31. session_compass-0.1.0/tests/agents/__init__.py +1 -0
  32. session_compass-0.1.0/tests/agents/test_antigravity_metadata.py +122 -0
  33. session_compass-0.1.0/tests/agents/test_claude_metadata.py +56 -0
  34. session_compass-0.1.0/tests/agents/test_compatibility.py +48 -0
  35. session_compass-0.1.0/tests/agents/test_registry.py +19 -0
  36. session_compass-0.1.0/tests/agents/test_resumability.py +64 -0
  37. session_compass-0.1.0/tests/agents/test_resume_commands.py +127 -0
  38. session_compass-0.1.0/tests/agents/test_storage_contracts.py +86 -0
  39. session_compass-0.1.0/tests/fixtures/cli_help/agy-minimum.txt +2 -0
  40. session_compass-0.1.0/tests/fixtures/cli_help/claude-minimum.txt +2 -0
  41. session_compass-0.1.0/tests/fixtures/cli_help/codex-minimum.txt +2 -0
  42. session_compass-0.1.0/tests/fixtures/cli_help/copilot-minimum.txt +2 -0
  43. session_compass-0.1.0/tests/test_characterization.py +201 -0
  44. session_compass-0.1.0/tests/test_compatibility_probe.py +89 -0
  45. session_compass-0.1.0/tests/test_issue_payload.py +54 -0
  46. session_compass-0.1.0/tests/test_pr_workflow.py +23 -0
  47. session_compass-0.1.0/tests/test_public_packaging.py +36 -0
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ const UUID_RE = /\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\b/g;
4
+ const SECRET_RE = /\b(?:sk|ghp|github_pat)[_-][A-Za-z0-9_-]+\b/g;
5
+ const PATH_RE = /(?<!\w)(?:\/Users|\/home|\/tmp|[A-Z]:\\)[^\s,;]+/g;
6
+
7
+ function sanitizeText(value) {
8
+ return String(value)
9
+ .replace(PATH_RE, "<path>")
10
+ .replace(UUID_RE, "<uuid>")
11
+ .replace(SECRET_RE, "<secret>")
12
+ .slice(0, 200);
13
+ }
14
+
15
+ function issueTitle(agent, problemType) {
16
+ return `[compat] ${agent} ${problemType}`;
17
+ }
18
+
19
+ function issueLabels(agent) {
20
+ return ["compatibility", "automated-detection", `agent:${agent}`];
21
+ }
22
+
23
+ function problemType(result) {
24
+ if (result.failure === "executable_not_found" || result.failure === "execution_error") {
25
+ return "CLI installation failure";
26
+ }
27
+ if (Array.isArray(result.missing_flags) && result.missing_flags.length > 0) {
28
+ return "resume capability mismatch";
29
+ }
30
+ if (result.failure && String(result.failure).includes("storage")) {
31
+ return "storage contract mismatch";
32
+ }
33
+ return "CLI compatibility failure";
34
+ }
35
+
36
+ function failureBody(result, artifactUrl, runUrl) {
37
+ const safe = {
38
+ agent: result.agent,
39
+ version: result.version || "unknown",
40
+ status: result.status,
41
+ failure: result.failure ? sanitizeText(result.failure) : undefined,
42
+ detected_flags: result.detected_flags || [],
43
+ missing_flags: result.missing_flags || [],
44
+ };
45
+ return [
46
+ "## CLI compatibility failure",
47
+ "",
48
+ "```json",
49
+ JSON.stringify(safe, null, 2),
50
+ "```",
51
+ "",
52
+ `Artifact: ${artifactUrl}`,
53
+ `Workflow run: ${runUrl}`,
54
+ ].join("\n");
55
+ }
56
+
57
+ function recoveryComment(agent, runUrl) {
58
+ return `Compatibility check recovered for ${agent}. The issue remains open for maintainer review. Workflow run: ${runUrl}`;
59
+ }
60
+
61
+ async function updateCompatibilityIssues({ github, context, results, artifactUrl, runUrl }) {
62
+ const repo = { owner: context.repo.owner, repo: context.repo.repo };
63
+ for (const result of results) {
64
+ if (result.status === "pass") {
65
+ const open = await github.rest.search.issuesAndPullRequests({
66
+ q: `repo:${repo.owner}/${repo.repo} is:issue is:open [compat] ${result.agent}`,
67
+ });
68
+ for (const issue of open.data.items.filter((item) => item.title.startsWith(`[compat] ${result.agent} `))) {
69
+ await github.rest.issues.createComment({
70
+ ...repo,
71
+ issue_number: issue.number,
72
+ body: recoveryComment(result.agent, runUrl),
73
+ });
74
+ }
75
+ continue;
76
+ }
77
+
78
+ const title = issueTitle(result.agent, problemType(result));
79
+ const all = await github.rest.search.issuesAndPullRequests({
80
+ q: `repo:${repo.owner}/${repo.repo} is:issue "${title}"`,
81
+ });
82
+ const exact = all.data.items.find((item) => item.title === title);
83
+ const body = failureBody(result, artifactUrl, runUrl);
84
+ if (exact && exact.state === "open") {
85
+ await github.rest.issues.createComment({ ...repo, issue_number: exact.number, body });
86
+ } else {
87
+ const previous = exact ? `\n\nPrevious issue: #${exact.number}` : "";
88
+ await github.rest.issues.create({
89
+ ...repo,
90
+ title,
91
+ labels: issueLabels(result.agent),
92
+ body: body + previous,
93
+ });
94
+ }
95
+ }
96
+ }
97
+
98
+ module.exports = {
99
+ sanitizeText,
100
+ issueTitle,
101
+ issueLabels,
102
+ problemType,
103
+ failureBody,
104
+ recoveryComment,
105
+ updateCompatibilityIssues,
106
+ };
@@ -0,0 +1,80 @@
1
+ name: CLI compatibility PR check
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ - dev
8
+ types: [opened, synchronize, reopened]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ compatibility:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Check out pull request
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Set up Node.js
21
+ uses: actions/setup-node@v4
22
+ with:
23
+ node-version: 20
24
+
25
+ - name: Run unit and metadata regression tests
26
+ shell: bash
27
+ run: PYTHONPATH=src python -m unittest discover -s tests -v
28
+
29
+ - name: Install latest public agent CLIs
30
+ shell: bash
31
+ run: |
32
+ set +e
33
+ npm install --global @anthropic-ai/claude-code
34
+ npm install --global @openai/codex
35
+ npm install --global @github/copilot
36
+ curl -fsSL https://antigravity.google/cli/install.sh | bash
37
+ exit 0
38
+
39
+ - name: Probe version and help contracts
40
+ continue-on-error: true
41
+ shell: bash
42
+ run: |
43
+ PYTHONPATH=src python scripts/probe_cli_compatibility.py \
44
+ --output compatibility-report.json
45
+
46
+ - name: Sanitize compatibility report
47
+ if: ${{ always() }}
48
+ shell: bash
49
+ run: |
50
+ if test -f compatibility-report.json; then
51
+ PYTHONPATH=src python scripts/build_compatibility_report.py \
52
+ compatibility-report.json \
53
+ --commit-sha "${GITHUB_SHA}" > compatibility-report-sanitized.json
54
+ else
55
+ printf '{"commit_sha":"%s","results":[],"failure":"probe_report_missing"}\n' \
56
+ "${GITHUB_SHA}" > compatibility-report-sanitized.json
57
+ fi
58
+
59
+ - name: Upload PR compatibility artifact
60
+ if: ${{ always() }}
61
+ uses: actions/upload-artifact@v4
62
+ with:
63
+ name: cli-compatibility-pr-${{ github.event.pull_request.number }}-${{ github.run_id }}
64
+ path: |
65
+ compatibility-report.json
66
+ compatibility-report-sanitized.json
67
+ if-no-files-found: warn
68
+
69
+ - name: Fail when any capability check fails
70
+ if: ${{ always() }}
71
+ shell: bash
72
+ run: |
73
+ test -f compatibility-report.json
74
+ PYTHONPATH=src python - <<'PY'
75
+ import json
76
+ from pathlib import Path
77
+
78
+ report = json.loads(Path("compatibility-report.json").read_text())
79
+ raise SystemExit(0 if report and all(item.get("status") == "pass" for item in report) else 1)
80
+ PY
@@ -0,0 +1,101 @@
1
+ name: CLI compatibility
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 0 * * 1"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ issues: write
11
+
12
+ jobs:
13
+ compatibility:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Check out repository
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Node.js
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: 20
23
+
24
+ - name: Run unit and metadata regression tests
25
+ shell: bash
26
+ run: PYTHONPATH=src python -m unittest discover -s tests -v
27
+
28
+ - name: Install latest public agent CLIs
29
+ shell: bash
30
+ run: |
31
+ set +e
32
+ npm install --global @anthropic-ai/claude-code
33
+ npm install --global @openai/codex
34
+ npm install --global @github/copilot
35
+ curl -fsSL https://antigravity.google/cli/install.sh | bash
36
+ exit 0
37
+
38
+ - name: Probe version and help contracts
39
+ id: probe
40
+ continue-on-error: true
41
+ shell: bash
42
+ run: |
43
+ # Check resume and native dangerous-permission capabilities only.
44
+ PYTHONPATH=src python scripts/probe_cli_compatibility.py \
45
+ --output compatibility-report.json
46
+
47
+ - name: Sanitize compatibility report
48
+ if: ${{ always() }}
49
+ shell: bash
50
+ run: |
51
+ if test -f compatibility-report.json; then
52
+ PYTHONPATH=src python scripts/build_compatibility_report.py \
53
+ compatibility-report.json \
54
+ --commit-sha "${GITHUB_SHA}" > compatibility-report-sanitized.json
55
+ else
56
+ printf '{"commit_sha":"%s","results":[],"failure":"probe_report_missing"}\n' \
57
+ "${GITHUB_SHA}" > compatibility-report-sanitized.json
58
+ fi
59
+
60
+ - name: Upload compatibility artifact
61
+ if: ${{ always() }}
62
+ uses: actions/upload-artifact@v4
63
+ with:
64
+ name: cli-compatibility-${{ github.run_id }}
65
+ path: |
66
+ compatibility-report.json
67
+ compatibility-report-sanitized.json
68
+ if-no-files-found: warn
69
+
70
+ - name: Update compatibility issues
71
+ if: ${{ always() }}
72
+ uses: actions/github-script@v7
73
+ with:
74
+ github-token: ${{ secrets.GITHUB_TOKEN }}
75
+ script: |
76
+ const fs = require("fs");
77
+ const { updateCompatibilityIssues } = require(
78
+ `${process.env.GITHUB_WORKSPACE}/.github/scripts/update_compatibility_issue.js`
79
+ );
80
+ const report = JSON.parse(fs.readFileSync("compatibility-report-sanitized.json", "utf8"));
81
+ const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
82
+ await updateCompatibilityIssues({
83
+ github,
84
+ context,
85
+ results: report.results || [],
86
+ artifactUrl: runUrl,
87
+ runUrl,
88
+ });
89
+
90
+ - name: Fail when any capability check fails
91
+ if: ${{ always() }}
92
+ shell: bash
93
+ run: |
94
+ test -f compatibility-report.json
95
+ PYTHONPATH=src python - <<'PY'
96
+ import json
97
+ from pathlib import Path
98
+
99
+ report = json.loads(Path("compatibility-report.json").read_text())
100
+ raise SystemExit(0 if report and all(item.get("status") == "pass" for item in report) else 1)
101
+ PY
@@ -0,0 +1,40 @@
1
+ name: Publish Session Compass to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions:
7
+ contents: read
8
+ id-token: write
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ environment:
14
+ name: pypi
15
+ url: https://pypi.org/p/session-compass
16
+ steps:
17
+ - name: Check out repository
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.x"
24
+
25
+ - name: Build distributions
26
+ shell: bash
27
+ run: |
28
+ python -m pip install --upgrade build
29
+ python -m build
30
+
31
+ - name: Validate distributions
32
+ shell: bash
33
+ run: |
34
+ python -m pip install --upgrade twine
35
+ python -m twine check dist/*
36
+
37
+ - name: Publish distributions to PyPI
38
+ uses: pypa/gh-action-pypi-publish@release/v1
39
+ with:
40
+ packages-dir: dist/
@@ -0,0 +1,5 @@
1
+ dist/
2
+ build/
3
+ *.egg-info/
4
+ __pycache__/
5
+ *.pyc
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 12signals
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.
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.5
2
+ Name: session-compass
3
+ Version: 0.1.0
4
+ Summary: Discover and resume local sessions from Claude Code, Codex, Antigravity, and Copilot CLI
5
+ Author-email: Yeonchan Ahn <ahnyeonchan@gmail.com>
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Keywords: antigravity,claude-code,cli,codex,coding-agents,copilot,resume,sessions
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Software Development
13
+ Classifier: Topic :: Utilities
14
+ Requires-Python: >=3.9
15
+ Description-Content-Type: text/markdown
16
+
17
+ # Session Compass
18
+
19
+ [![PyPI](https://img.shields.io/pypi/v/session-compass)](https://pypi.org/project/session-compass/)
20
+
21
+ Session Compass is a local-first CLI for discovering, identifying, and resuming sessions created by Claude Code, Codex, Antigravity CLI, and Copilot CLI.
22
+
23
+ This project started as a fork of [cli-sessions](https://github.com/pavbyte/cli-sessions). It keeps the upstream project's practical local-session workflow while adding provider-specific metadata, resumability checks, and compatibility monitoring for independently updated agent CLIs.
24
+
25
+ ## Why Session Compass?
26
+
27
+ Coding agents store useful session data locally, but each agent exposes that history differently. Session Compass gives you one starting point for answering:
28
+
29
+ - Which agent created this session?
30
+ - Which workspace was it using?
31
+ - What was the session about?
32
+ - When was it last active?
33
+ - Can it be resumed safely?
34
+
35
+ It is designed for local development machines and remote Linux servers accessed through SSH. It does not require a daemon, a central database, an account, or a web service.
36
+
37
+ ## Install
38
+
39
+ Using `pipx` is recommended for command-line tools because it keeps Session Compass isolated from other Python applications:
40
+
41
+ ```bash
42
+ pipx install session-compass
43
+ ```
44
+
45
+ You can also install it with `pip`:
46
+
47
+ ```bash
48
+ pip install session-compass
49
+ ```
50
+
51
+ The repository includes an optional installer for machines where `pipx` is not already configured:
52
+
53
+ ```bash
54
+ curl -fsSL https://raw.githubusercontent.com/ycahn82/session-compass/main/install.sh | bash
55
+ ```
56
+
57
+ ## Usage
58
+
59
+ ```bash
60
+ scompass # List sessions from all supported agents
61
+ scompass --claude # Show Claude Code sessions
62
+ scompass --codex # Show Codex sessions
63
+ scompass --agy # Show Antigravity sessions
64
+ scompass --copilot # Show Copilot CLI sessions
65
+ ```
66
+
67
+ Choose a session number to resume it in its original working directory. Press `q` to exit without resuming.
68
+
69
+ Use `--include-unverified` when diagnosing records that do not have enough local evidence to be considered resumable:
70
+
71
+ ```bash
72
+ scompass --include-unverified
73
+ ```
74
+
75
+ ### Permission bypass
76
+
77
+ Use `-d` as the short alias for `--dangerously-skip-permissions` when resuming a session:
78
+
79
+ ```bash
80
+ scompass -d
81
+ scompass --claude -d
82
+ ```
83
+
84
+ Session Compass translates this shared option to each provider's native permission-bypass option. This can reduce or remove safety prompts from the provider, so use it only in environments where you understand the consequences.
85
+
86
+ ## Supported agents
87
+
88
+ Session Compass currently reads local session metadata from these locations:
89
+
90
+ ```text
91
+ Claude Code: ~/.claude/projects/*/*.jsonl
92
+ Codex: ~/.codex/state_*.sqlite or ~/.codex/session_index.jsonl
93
+ Antigravity: ~/.gemini/antigravity-cli/conversations/*.db and history.jsonl
94
+ Copilot CLI: ~/.copilot/session-store.db
95
+ ```
96
+
97
+ An agent that is not installed is skipped. Session databases are opened for metadata discovery only; Session Compass does not migrate, rewrite, or delete them.
98
+
99
+ The default list focuses on sessions with evidence that they can be resumed. Internal and metadata-only records are hidden from that list. Use `--include-unverified` to inspect diagnostic records without making them normal resume candidates.
100
+
101
+ ## Local-first and privacy
102
+
103
+ Session Compass reads files already written on your machine. It does not send session content anywhere and does not include telemetry. The current implementation does not use an LLM to generate summaries; it prefers deterministic titles, previews, and user-message metadata already present in local storage.
104
+
105
+ ## Compatibility policy
106
+
107
+ Agent CLIs can update independently, including their resume arguments and local storage schemas. Each Session Compass provider adapter owns its storage contract, metadata extraction, resumability evidence, and native resume command.
108
+
109
+ The project maintains separate compatibility floors for the provider CLI's resume command and its session-storage schema. GitHub Actions checks supported provider versions and help contracts weekly and on pull requests. When an upstream change breaks a contract, maintainers review the report and update the affected adapter; normal runtime execution does not probe provider help on every invocation.
110
+
111
+ ## Current capabilities
112
+
113
+ - Unified session listing across supported coding agents
114
+ - Provider and workspace metadata
115
+ - Deterministic title and summary extraction from local records
116
+ - Resumability filtering for internal, incomplete, or metadata-only records
117
+ - Native resume command mapping per provider
118
+ - Shared `-d`/`--dangerously-skip-permissions` option
119
+ - Read-only compatibility and storage-contract tests
120
+
121
+ ## Roadmap
122
+
123
+ The master plan is intentionally incremental. Planned work includes:
124
+
125
+ - Richer text search across agent, project, workspace, title, and branch metadata
126
+ - A stable machine-readable JSON output mode
127
+ - A read-only `doctor` diagnostic command
128
+ - Optional aggregation of session metadata from explicitly selected remote hosts
129
+ - Better provenance for workspace and Git context
130
+
131
+ These roadmap items are not required for the current interactive listing and resume workflow.
132
+
133
+ ## Fork maintenance
134
+
135
+ The upstream project is [pavbyte/cli-sessions](https://github.com/pavbyte/cli-sessions). Session Compass keeps the upstream remote separate and documents intentional differences in the repository's development plans.
136
+
137
+ The public package and command are intentionally separate from the upstream project:
138
+
139
+ ```text
140
+ Upstream cli-sessions: pip install cli-sessions -> sessions
141
+ Session Compass: pip install session-compass -> scompass
142
+ ```
143
+
144
+ Session Compass does not provide a `sessions` alias. This prevents a new installation from replacing or shadowing an existing upstream `cli-sessions` command.
145
+
146
+ ## Links
147
+
148
+ - Source: https://github.com/ycahn82/session-compass
149
+ - Upstream: https://github.com/pavbyte/cli-sessions
150
+ - PyPI: https://pypi.org/project/session-compass/
151
+
152
+ ## License
153
+
154
+ MIT
@@ -0,0 +1,138 @@
1
+ # Session Compass
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/session-compass)](https://pypi.org/project/session-compass/)
4
+
5
+ Session Compass is a local-first CLI for discovering, identifying, and resuming sessions created by Claude Code, Codex, Antigravity CLI, and Copilot CLI.
6
+
7
+ This project started as a fork of [cli-sessions](https://github.com/pavbyte/cli-sessions). It keeps the upstream project's practical local-session workflow while adding provider-specific metadata, resumability checks, and compatibility monitoring for independently updated agent CLIs.
8
+
9
+ ## Why Session Compass?
10
+
11
+ Coding agents store useful session data locally, but each agent exposes that history differently. Session Compass gives you one starting point for answering:
12
+
13
+ - Which agent created this session?
14
+ - Which workspace was it using?
15
+ - What was the session about?
16
+ - When was it last active?
17
+ - Can it be resumed safely?
18
+
19
+ It is designed for local development machines and remote Linux servers accessed through SSH. It does not require a daemon, a central database, an account, or a web service.
20
+
21
+ ## Install
22
+
23
+ Using `pipx` is recommended for command-line tools because it keeps Session Compass isolated from other Python applications:
24
+
25
+ ```bash
26
+ pipx install session-compass
27
+ ```
28
+
29
+ You can also install it with `pip`:
30
+
31
+ ```bash
32
+ pip install session-compass
33
+ ```
34
+
35
+ The repository includes an optional installer for machines where `pipx` is not already configured:
36
+
37
+ ```bash
38
+ curl -fsSL https://raw.githubusercontent.com/ycahn82/session-compass/main/install.sh | bash
39
+ ```
40
+
41
+ ## Usage
42
+
43
+ ```bash
44
+ scompass # List sessions from all supported agents
45
+ scompass --claude # Show Claude Code sessions
46
+ scompass --codex # Show Codex sessions
47
+ scompass --agy # Show Antigravity sessions
48
+ scompass --copilot # Show Copilot CLI sessions
49
+ ```
50
+
51
+ Choose a session number to resume it in its original working directory. Press `q` to exit without resuming.
52
+
53
+ Use `--include-unverified` when diagnosing records that do not have enough local evidence to be considered resumable:
54
+
55
+ ```bash
56
+ scompass --include-unverified
57
+ ```
58
+
59
+ ### Permission bypass
60
+
61
+ Use `-d` as the short alias for `--dangerously-skip-permissions` when resuming a session:
62
+
63
+ ```bash
64
+ scompass -d
65
+ scompass --claude -d
66
+ ```
67
+
68
+ Session Compass translates this shared option to each provider's native permission-bypass option. This can reduce or remove safety prompts from the provider, so use it only in environments where you understand the consequences.
69
+
70
+ ## Supported agents
71
+
72
+ Session Compass currently reads local session metadata from these locations:
73
+
74
+ ```text
75
+ Claude Code: ~/.claude/projects/*/*.jsonl
76
+ Codex: ~/.codex/state_*.sqlite or ~/.codex/session_index.jsonl
77
+ Antigravity: ~/.gemini/antigravity-cli/conversations/*.db and history.jsonl
78
+ Copilot CLI: ~/.copilot/session-store.db
79
+ ```
80
+
81
+ An agent that is not installed is skipped. Session databases are opened for metadata discovery only; Session Compass does not migrate, rewrite, or delete them.
82
+
83
+ The default list focuses on sessions with evidence that they can be resumed. Internal and metadata-only records are hidden from that list. Use `--include-unverified` to inspect diagnostic records without making them normal resume candidates.
84
+
85
+ ## Local-first and privacy
86
+
87
+ Session Compass reads files already written on your machine. It does not send session content anywhere and does not include telemetry. The current implementation does not use an LLM to generate summaries; it prefers deterministic titles, previews, and user-message metadata already present in local storage.
88
+
89
+ ## Compatibility policy
90
+
91
+ Agent CLIs can update independently, including their resume arguments and local storage schemas. Each Session Compass provider adapter owns its storage contract, metadata extraction, resumability evidence, and native resume command.
92
+
93
+ The project maintains separate compatibility floors for the provider CLI's resume command and its session-storage schema. GitHub Actions checks supported provider versions and help contracts weekly and on pull requests. When an upstream change breaks a contract, maintainers review the report and update the affected adapter; normal runtime execution does not probe provider help on every invocation.
94
+
95
+ ## Current capabilities
96
+
97
+ - Unified session listing across supported coding agents
98
+ - Provider and workspace metadata
99
+ - Deterministic title and summary extraction from local records
100
+ - Resumability filtering for internal, incomplete, or metadata-only records
101
+ - Native resume command mapping per provider
102
+ - Shared `-d`/`--dangerously-skip-permissions` option
103
+ - Read-only compatibility and storage-contract tests
104
+
105
+ ## Roadmap
106
+
107
+ The master plan is intentionally incremental. Planned work includes:
108
+
109
+ - Richer text search across agent, project, workspace, title, and branch metadata
110
+ - A stable machine-readable JSON output mode
111
+ - A read-only `doctor` diagnostic command
112
+ - Optional aggregation of session metadata from explicitly selected remote hosts
113
+ - Better provenance for workspace and Git context
114
+
115
+ These roadmap items are not required for the current interactive listing and resume workflow.
116
+
117
+ ## Fork maintenance
118
+
119
+ The upstream project is [pavbyte/cli-sessions](https://github.com/pavbyte/cli-sessions). Session Compass keeps the upstream remote separate and documents intentional differences in the repository's development plans.
120
+
121
+ The public package and command are intentionally separate from the upstream project:
122
+
123
+ ```text
124
+ Upstream cli-sessions: pip install cli-sessions -> sessions
125
+ Session Compass: pip install session-compass -> scompass
126
+ ```
127
+
128
+ Session Compass does not provide a `sessions` alias. This prevents a new installation from replacing or shadowing an existing upstream `cli-sessions` command.
129
+
130
+ ## Links
131
+
132
+ - Source: https://github.com/ycahn82/session-compass
133
+ - Upstream: https://github.com/pavbyte/cli-sessions
134
+ - PyPI: https://pypi.org/project/session-compass/
135
+
136
+ ## License
137
+
138
+ MIT