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.
- session_compass-0.1.0/.github/scripts/update_compatibility_issue.js +106 -0
- session_compass-0.1.0/.github/workflows/cli-compatibility-pr.yml +80 -0
- session_compass-0.1.0/.github/workflows/cli-compatibility.yml +101 -0
- session_compass-0.1.0/.github/workflows/publish.yml +40 -0
- session_compass-0.1.0/.gitignore +5 -0
- session_compass-0.1.0/LICENSE +21 -0
- session_compass-0.1.0/PKG-INFO +154 -0
- session_compass-0.1.0/README.md +138 -0
- session_compass-0.1.0/cli-sessions-customization-master-plan.md +1663 -0
- session_compass-0.1.0/docs/superpowers/plans/2026-09-08-agy-session-metadata-filtering.md +90 -0
- session_compass-0.1.0/docs/superpowers/plans/2026-09-08-cli-compatibility-monitoring.md +738 -0
- session_compass-0.1.0/docs/superpowers/plans/2026-09-08-session-compass-rename.md +554 -0
- session_compass-0.1.0/docs/superpowers/progress/2026-09-08-cli-compatibility-monitoring-progress.md +91 -0
- session_compass-0.1.0/docs/superpowers/specs/2026-09-08-cli-compatibility-monitoring-design.md +402 -0
- session_compass-0.1.0/docs/superpowers/specs/2026-09-08-session-compass-rename-design.md +144 -0
- session_compass-0.1.0/install.sh +32 -0
- session_compass-0.1.0/pyproject.toml +28 -0
- session_compass-0.1.0/scripts/__init__.py +1 -0
- session_compass-0.1.0/scripts/build_compatibility_report.py +43 -0
- session_compass-0.1.0/scripts/probe_cli_compatibility.py +93 -0
- session_compass-0.1.0/src/session_compass/__init__.py +3 -0
- session_compass-0.1.0/src/session_compass/agents/__init__.py +5 -0
- session_compass-0.1.0/src/session_compass/agents/antigravity.py +173 -0
- session_compass-0.1.0/src/session_compass/agents/base.py +141 -0
- session_compass-0.1.0/src/session_compass/agents/claude.py +113 -0
- session_compass-0.1.0/src/session_compass/agents/codex.py +152 -0
- session_compass-0.1.0/src/session_compass/agents/copilot.py +97 -0
- session_compass-0.1.0/src/session_compass/agents/registry.py +26 -0
- session_compass-0.1.0/src/session_compass/cli.py +139 -0
- session_compass-0.1.0/tests/__init__.py +1 -0
- session_compass-0.1.0/tests/agents/__init__.py +1 -0
- session_compass-0.1.0/tests/agents/test_antigravity_metadata.py +122 -0
- session_compass-0.1.0/tests/agents/test_claude_metadata.py +56 -0
- session_compass-0.1.0/tests/agents/test_compatibility.py +48 -0
- session_compass-0.1.0/tests/agents/test_registry.py +19 -0
- session_compass-0.1.0/tests/agents/test_resumability.py +64 -0
- session_compass-0.1.0/tests/agents/test_resume_commands.py +127 -0
- session_compass-0.1.0/tests/agents/test_storage_contracts.py +86 -0
- session_compass-0.1.0/tests/fixtures/cli_help/agy-minimum.txt +2 -0
- session_compass-0.1.0/tests/fixtures/cli_help/claude-minimum.txt +2 -0
- session_compass-0.1.0/tests/fixtures/cli_help/codex-minimum.txt +2 -0
- session_compass-0.1.0/tests/fixtures/cli_help/copilot-minimum.txt +2 -0
- session_compass-0.1.0/tests/test_characterization.py +201 -0
- session_compass-0.1.0/tests/test_compatibility_probe.py +89 -0
- session_compass-0.1.0/tests/test_issue_payload.py +54 -0
- session_compass-0.1.0/tests/test_pr_workflow.py +23 -0
- 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,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
|
+
[](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
|
+
[](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
|