netcodex-agent-exporter 0.3.0__tar.gz → 0.3.2__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.
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/.gitignore +3 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/PKG-INFO +70 -29
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/README.md +69 -28
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/pyproject.toml +4 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/__init__.py +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/cli.py +69 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/sources/locations.py +565 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/api.py +65 -22
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/404/index.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/404.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next.__PAGE__.txt +9 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._full.txt +17 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._head.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._index.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/__next._tree.txt +2 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_buildManifest.js +11 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_clientMiddlewareManifest.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86/_ssgManifest.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/05-c3ty_6dwfk.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0cz1d0mv5g_q7.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0xs948yx7egqf.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0y-qmi6py9vt0.js +2 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/14mrh2-p_w84d.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/15orcrkp-_9ct.js +4 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/16x2ab5tjuq8p.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1rxncug86bump.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zrw-wzjvs1a7.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zz7ddvqh9xr5.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/24w1ykbgdtn0d.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/27gsbatdo0vgh.js +10 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2cnskixvc-f-1.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2nykiepra7i1k.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2wfuz7opg3uv2.js +20 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3rbfc1m17ic0f.css +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3z5q_p4msz2ha.js +31 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/turbopack-1_6kmb9wb6nxy.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._full.txt +15 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._head.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._index.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._not-found.__PAGE__.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._not-found.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/__next._tree.txt +2 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/index.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found/index.txt +15 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._full.txt +19 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._head.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._index.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next._tree.txt +2 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next.app.__PAGE__.txt +9 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/__next.app.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.txt +19 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo-v2-icon.png +0 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo-v2.png +0 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/brand/netcodex-logo.png +0 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.txt +17 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._full.txt +25 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._head.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._index.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next._tree.txt +3 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +7 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.html +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.txt +25 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._full.txt +16 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._head.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._index.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._tree.txt +2 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next.where.__PAGE__.txt +6 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next.where.txt +5 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/index.html +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/index.txt +16 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/local_api.py +267 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/local_ui.py +107 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-conversation.md +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-v2.md +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-conversation.md +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-v2-full.md +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/codex-v2.md +1 -1
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_local_ui.py +75 -2
- netcodex_agent_exporter-0.3.2/tests/test_locations.py +211 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_web_api.py +1 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/web/local_ui.py +0 -190
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/LICENSE +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/scripts/netcodex_entry.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/incremental.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/models.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/markdown.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/renderers/quarkdown.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/security/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/security/redaction.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/services.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/aider.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/antigravity.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/claude.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/claude_ai.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/cline.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/codex.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/common.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/continue_dev.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/copilot_chat.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/copilot_cli.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/cursor.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/encrypted.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/gemini_cli.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/paths.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/sources/registry.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/src/netcodex/web/static/local.html +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/conftest.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude/normal-session.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude/session-fixture.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.meta.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/bbbbbbbb-1111-4222-8333-444444444444.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/claude-code-sessions/acct-1/org-1/local_d1.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/local-agent-mode-sessions/acct-1/org-1/local_c1/.claude/projects/-sessions-keen-gauss/cccccccc-1111-4222-8333-444444444444.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/local-agent-mode-sessions/acct-1/org-1/local_c1.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/archived_sessions/rollout-2026-06-01T09-00-00-99999999-8888-4777-8666-555555555555.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/session_index.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-00-11111111-2222-4333-8444-555555555555.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-10-66666666-7777-4888-9999-aaaaaaaaaaaa.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/golden/claude-conversation.qd +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/api_conversation_history.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/ui_messages.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/copilot-session-1.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/empty-session.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/legacy-session.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/workspace.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/events.jsonl +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/workspace.yaml +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash1/chats/session-2026-06-13T10-00-abc.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/fixtures/sources_v3/home/code/webshop/.aider.chat.history.md +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_cli.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_export_layout.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_golden_outputs.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_incremental.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_redaction.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_registry_export_all.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_renderers.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_antigravity.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_cli_tools.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_v2.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_sources_vscode_family.py +0 -0
- {netcodex_agent_exporter-0.3.0 → netcodex_agent_exporter-0.3.2}/tests/test_workflow_manifest.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: netcodex-agent-exporter
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown.
|
|
5
5
|
Project-URL: Homepage, https://gitlab.com/netcodex-tech/agent-conversation-exporter
|
|
6
6
|
Project-URL: Repository, https://gitlab.com/netcodex-tech/agent-conversation-exporter
|
|
@@ -41,24 +41,44 @@ and Codex into Markdown, Quarkdown and PDF.
|
|
|
41
41
|
|
|
42
42
|
## Status
|
|
43
43
|
|
|
44
|
-
Version 0.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
44
|
+
Version 0.3. Supported tools, where each one keeps its chats, and how to import them
|
|
45
|
+
(`netcodex where` prints the same table with the paths that exist on your machine).
|
|
46
|
+
|
|
47
|
+
### Where are my chats?
|
|
48
|
+
|
|
49
|
+
<!-- netcodex:where:start (generated by scripts/export_locations.py) -->
|
|
50
|
+
| Tool | Status | Windows | macOS / Linux | Import via |
|
|
51
|
+
| --- | --- | --- | --- | --- |
|
|
52
|
+
| Codex CLI / VS Code / Desktop | supported; override: `CODEX_HOME` | `%USERPROFILE%\.codex\sessions\YYYY\MM\DD\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\archived_sessions\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\state_*.sqlite`<br>`%USERPROFILE%\.codex\session_index.jsonl` | `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`<br>`~/.codex/archived_sessions/rollout-*.jsonl`<br>`~/.codex/state_*.sqlite`<br>`~/.codex/session_index.jsonl` | Upload files, Local sources, CLI |
|
|
53
|
+
| Claude Code CLI / VS Code | supported; override: `CLAUDE_CONFIG_DIR` | `%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `~/.claude/projects/<project>/<session>.jsonl` | Upload files, Local sources, CLI |
|
|
54
|
+
| Claude Desktop (Code tab) | supported; override: `CLAUDE_CONFIG_DIR` | `%APPDATA%\Claude\claude-code-sessions\**\local_*.json`<br>`%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `<config>/Claude/claude-code-sessions/**/local_*.json`<br>`~/.claude/projects/<project>/<session>.jsonl` | Local sources, CLI |
|
|
55
|
+
| Claude Cowork | supported | `%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>.json`<br>`%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>\.claude\projects\**\*.jsonl` | `<config>/Claude/local-agent-mode-sessions/**/local_<id>.json`<br>`<config>/Claude/local-agent-mode-sessions/**/local_<id>/.claude/projects/**/*.jsonl` | Local sources, CLI |
|
|
56
|
+
| Claude.ai (official data export) | supported; override: `NETCODEX_CLAUDE_AI_EXPORT` | `%USERPROFILE%\Downloads\data-*.zip`<br>`%USERPROFILE%\Downloads\<folder>\conversations.json` | `~/Downloads/data-*.zip`<br>`~/Downloads/<folder>/conversations.json` | Local sources, CLI |
|
|
57
|
+
| GitHub Copilot Chat | supported | `%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.jsonl`<br>`%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.json`<br>`%APPDATA%\<editor>\User\globalStorage\emptyWindowChatSessions\*.json` | `<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.jsonl`<br>`<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.json`<br>`<config>/<editor>/User/globalStorage/emptyWindowChatSessions/*.json` | Local sources, CLI |
|
|
58
|
+
| GitHub Copilot CLI | supported | `%USERPROFILE%\.copilot\session-state\<id>\events.jsonl` | `~/.copilot/session-state/<id>/events.jsonl` | Local sources, CLI |
|
|
59
|
+
| Cline / Roo Code / Kilo Code | supported | `%APPDATA%\<editor>\User\globalStorage\saoudrizwan.claude-dev\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\rooveterinaryinc.roo-cline\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\kilocode.kilo-code\tasks\<id>\api_conversation_history.json` | `<config>/<editor>/User/globalStorage/saoudrizwan.claude-dev/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/rooveterinaryinc.roo-cline/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/kilocode.kilo-code/tasks/<id>/api_conversation_history.json` | Local sources, CLI |
|
|
60
|
+
| Cursor | supported | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | `<config>/Cursor/User/globalStorage/state.vscdb` | Local sources, CLI |
|
|
61
|
+
| Gemini CLI | supported | `%USERPROFILE%\.gemini\tmp\<hash>\chats\session-*.json`<br>`%USERPROFILE%\.gemini\tmp\<hash>\logs.json` | `~/.gemini/tmp/<hash>/chats/session-*.json`<br>`~/.gemini/tmp/<hash>/logs.json` | Local sources, CLI |
|
|
62
|
+
| Continue | supported | `%USERPROFILE%\.continue\sessions\*.json` | `~/.continue/sessions/*.json` | Local sources, CLI |
|
|
63
|
+
| Aider | supported; override: `NETCODEX_AIDER_PATHS` | `<repo>\.aider.chat.history.md` | `<repo>/.aider.chat.history.md` | Local sources, CLI |
|
|
64
|
+
| Google Antigravity | best effort | `%USERPROFILE%\.gemini\antigravity\conversation_summaries.db`<br>`%USERPROFILE%\.gemini\antigravity\conversations\*.db` | `~/.gemini/antigravity/conversation_summaries.db`<br>`~/.gemini/antigravity/conversations/*.db` | Local sources, CLI |
|
|
65
|
+
| Trae | encrypted, not supported | `%APPDATA%\Trae\ModularData\ai-agent\database.db`<br>`%APPDATA%\Trae CN\ModularData\ai-agent\database.db` | `<config>/Trae/ModularData/ai-agent/database.db`<br>`<config>/Trae CN/ModularData/ai-agent/database.db` | - |
|
|
66
|
+
| Windsurf | encrypted, not supported | `%USERPROFILE%\.codeium\windsurf\cascade\*.pb` | `~/.codeium/windsurf/cascade/*.pb` | - |
|
|
67
|
+
|
|
68
|
+
`<config>` is `~/Library/Application Support` on macOS and `~/.config` on Linux. `<editor>` is any VS Code-family editor: Code, Code - Insiders, VSCodium, Cursor, Windsurf, Trae, Trae CN, Antigravity, Kiro, Positron.
|
|
69
|
+
<!-- netcodex:where:end -->
|
|
70
|
+
|
|
71
|
+
Find them on your machine with `netcodex where` (`--json`, `--patterns`), or open the desk
|
|
72
|
+
(`netcodex ui`) and click **Where are my chats?**: it lists every tool with its status, the
|
|
73
|
+
resolved folder on this computer (Copy path / Open folder) and what to import. Encrypted
|
|
74
|
+
stores (current Trae, Windsurf) are reported but cannot be exported. claude.ai chats are not
|
|
75
|
+
stored locally: request the official data export (Settings > Privacy > Export data) and save
|
|
76
|
+
the `data-*.zip` / `conversations.json` in Downloads or point `NETCODEX_CLAUDE_AI_EXPORT` at it.
|
|
77
|
+
|
|
78
|
+
Client labels written to the `tool` field: `codex-cli`, `codex-vscode`, `codex-desktop`,
|
|
79
|
+
`claude-code-cli`, `claude-code-vscode`, `claude-desktop`, `claude-cowork`,
|
|
80
|
+
`copilot-chat-<editor>`, `cline-*`, `roo-code-*`, `kilo-code-*`, `cursor`, `copilot-cli`,
|
|
81
|
+
`gemini-cli`, `continue`, `aider`, `claude-ai`, `antigravity`.
|
|
62
82
|
|
|
63
83
|
All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
|
|
64
84
|
with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
|
|
@@ -86,19 +106,33 @@ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` a
|
|
|
86
106
|
upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
|
|
87
107
|
[Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
|
|
88
108
|
|
|
89
|
-
### Local UI
|
|
109
|
+
### Local UI: the Conversation export desk
|
|
90
110
|
|
|
91
111
|
```powershell
|
|
92
|
-
netcodex ui # opens http://127.0.0.1:<port
|
|
112
|
+
netcodex ui # opens http://127.0.0.1:<port>/app/#token=... in your browser
|
|
93
113
|
netcodex ui --port 8765 --out D:\exports --no-open
|
|
114
|
+
netcodex --version
|
|
94
115
|
```
|
|
95
116
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
117
|
+
`netcodex ui` serves the full export desk from your own machine: an upload rail for
|
|
118
|
+
JSONL/SQLite/ZIP files with source auto-detection, a **Local sources** tab that reads the
|
|
119
|
+
detected tools directly (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI, ...),
|
|
120
|
+
MD/QD/PDF formats with Quarkdown templates, the Upload > Analyze > Review > Export > Done
|
|
121
|
+
tracker, a system activity log, the preview and the export summary with the ZIP download.
|
|
122
|
+
The preview shows the Quarkdown HTML for QD/PDF exports and a rendered (sanitized) Markdown
|
|
123
|
+
view for Markdown-only exports, plus the Markdown source tab. **Where are my chats?** (header
|
|
124
|
+
button and Upload rail link) lists every supported tool with its status, the folder found on
|
|
125
|
+
this computer (Copy path / Open folder) and what to import. QD and PDF need the Quarkdown CLI;
|
|
126
|
+
the desk says so when it is missing.
|
|
127
|
+
|
|
128
|
+
Everything runs on 127.0.0.1: `--host` with a non-loopback address is refused unless
|
|
129
|
+
`--allow-remote` is given, API calls need the per-launch token from the URL (exchanged
|
|
130
|
+
for an HttpOnly, SameSite=Strict session cookie), and requests whose `Host` is not a
|
|
131
|
+
loopback name are rejected. Nothing is sent to a NetCodex server.
|
|
132
|
+
|
|
133
|
+
The desk is the Next.js app in `web/`, built as a static site by `npm run desk:build`
|
|
134
|
+
(`scripts/build-desk.mjs`) into `src/netcodex/web/desk/` and shipped in the wheel. A
|
|
135
|
+
source checkout without that build falls back to a minimal built-in page.
|
|
102
136
|
|
|
103
137
|
## License
|
|
104
138
|
|
|
@@ -115,6 +149,8 @@ uv run netcodex --help
|
|
|
115
149
|
|
|
116
150
|
```powershell
|
|
117
151
|
uv run netcodex sources # registered sources, found / not found
|
|
152
|
+
uv run netcodex where # where each tool keeps its chats, and what is on this machine
|
|
153
|
+
uv run netcodex where --json # same, machine-readable (also: sources --paths)
|
|
118
154
|
uv run netcodex scan --sources all
|
|
119
155
|
uv run netcodex analyze --source auto --json
|
|
120
156
|
uv run netcodex export --all --out exports # every available source, every session
|
|
@@ -145,6 +181,11 @@ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
|
|
|
145
181
|
|
|
146
182
|
Large exports use worker processes (`--jobs`, default automatic, up to 4).
|
|
147
183
|
|
|
184
|
+
The "Where are my chats?" table above, `netcodex where`, the desk help panel and the public
|
|
185
|
+
`/where` page all come from `netcodex.sources.locations`. After changing it, regenerate the
|
|
186
|
+
README table and `web/lib/chat-locations.json` with `uv run python scripts/export_locations.py`
|
|
187
|
+
(a test fails while they are out of date).
|
|
188
|
+
|
|
148
189
|
Sources live in a registry (`netcodex.sources.registry`). Store locations come
|
|
149
190
|
from a per-platform path matrix (`netcodex.sources.paths`: Windows
|
|
150
191
|
`%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
|
|
@@ -225,8 +266,8 @@ npm run api:dev
|
|
|
225
266
|
npm run web:dev
|
|
226
267
|
```
|
|
227
268
|
|
|
228
|
-
|
|
229
|
-
`http://localhost:8000
|
|
269
|
+
In development (`npm run dev`) the desk reads `NEXT_PUBLIC_API_URL` (default
|
|
270
|
+
`http://localhost:8000`) and the dev API also serves the local-sources endpoints. The MVP web flow accepts `.jsonl`, `.sqlite`, and
|
|
230
271
|
`.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
|
|
231
272
|
and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
|
|
232
273
|
|
|
@@ -5,24 +5,44 @@ and Codex into Markdown, Quarkdown and PDF.
|
|
|
5
5
|
|
|
6
6
|
## Status
|
|
7
7
|
|
|
8
|
-
Version 0.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
8
|
+
Version 0.3. Supported tools, where each one keeps its chats, and how to import them
|
|
9
|
+
(`netcodex where` prints the same table with the paths that exist on your machine).
|
|
10
|
+
|
|
11
|
+
### Where are my chats?
|
|
12
|
+
|
|
13
|
+
<!-- netcodex:where:start (generated by scripts/export_locations.py) -->
|
|
14
|
+
| Tool | Status | Windows | macOS / Linux | Import via |
|
|
15
|
+
| --- | --- | --- | --- | --- |
|
|
16
|
+
| Codex CLI / VS Code / Desktop | supported; override: `CODEX_HOME` | `%USERPROFILE%\.codex\sessions\YYYY\MM\DD\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\archived_sessions\rollout-*.jsonl`<br>`%USERPROFILE%\.codex\state_*.sqlite`<br>`%USERPROFILE%\.codex\session_index.jsonl` | `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`<br>`~/.codex/archived_sessions/rollout-*.jsonl`<br>`~/.codex/state_*.sqlite`<br>`~/.codex/session_index.jsonl` | Upload files, Local sources, CLI |
|
|
17
|
+
| Claude Code CLI / VS Code | supported; override: `CLAUDE_CONFIG_DIR` | `%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `~/.claude/projects/<project>/<session>.jsonl` | Upload files, Local sources, CLI |
|
|
18
|
+
| Claude Desktop (Code tab) | supported; override: `CLAUDE_CONFIG_DIR` | `%APPDATA%\Claude\claude-code-sessions\**\local_*.json`<br>`%USERPROFILE%\.claude\projects\<project>\<session>.jsonl` | `<config>/Claude/claude-code-sessions/**/local_*.json`<br>`~/.claude/projects/<project>/<session>.jsonl` | Local sources, CLI |
|
|
19
|
+
| Claude Cowork | supported | `%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>.json`<br>`%APPDATA%\Claude\local-agent-mode-sessions\**\local_<id>\.claude\projects\**\*.jsonl` | `<config>/Claude/local-agent-mode-sessions/**/local_<id>.json`<br>`<config>/Claude/local-agent-mode-sessions/**/local_<id>/.claude/projects/**/*.jsonl` | Local sources, CLI |
|
|
20
|
+
| Claude.ai (official data export) | supported; override: `NETCODEX_CLAUDE_AI_EXPORT` | `%USERPROFILE%\Downloads\data-*.zip`<br>`%USERPROFILE%\Downloads\<folder>\conversations.json` | `~/Downloads/data-*.zip`<br>`~/Downloads/<folder>/conversations.json` | Local sources, CLI |
|
|
21
|
+
| GitHub Copilot Chat | supported | `%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.jsonl`<br>`%APPDATA%\<editor>\User\workspaceStorage\<hash>\chatSessions\*.json`<br>`%APPDATA%\<editor>\User\globalStorage\emptyWindowChatSessions\*.json` | `<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.jsonl`<br>`<config>/<editor>/User/workspaceStorage/<hash>/chatSessions/*.json`<br>`<config>/<editor>/User/globalStorage/emptyWindowChatSessions/*.json` | Local sources, CLI |
|
|
22
|
+
| GitHub Copilot CLI | supported | `%USERPROFILE%\.copilot\session-state\<id>\events.jsonl` | `~/.copilot/session-state/<id>/events.jsonl` | Local sources, CLI |
|
|
23
|
+
| Cline / Roo Code / Kilo Code | supported | `%APPDATA%\<editor>\User\globalStorage\saoudrizwan.claude-dev\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\rooveterinaryinc.roo-cline\tasks\<id>\api_conversation_history.json`<br>`%APPDATA%\<editor>\User\globalStorage\kilocode.kilo-code\tasks\<id>\api_conversation_history.json` | `<config>/<editor>/User/globalStorage/saoudrizwan.claude-dev/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/rooveterinaryinc.roo-cline/tasks/<id>/api_conversation_history.json`<br>`<config>/<editor>/User/globalStorage/kilocode.kilo-code/tasks/<id>/api_conversation_history.json` | Local sources, CLI |
|
|
24
|
+
| Cursor | supported | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | `<config>/Cursor/User/globalStorage/state.vscdb` | Local sources, CLI |
|
|
25
|
+
| Gemini CLI | supported | `%USERPROFILE%\.gemini\tmp\<hash>\chats\session-*.json`<br>`%USERPROFILE%\.gemini\tmp\<hash>\logs.json` | `~/.gemini/tmp/<hash>/chats/session-*.json`<br>`~/.gemini/tmp/<hash>/logs.json` | Local sources, CLI |
|
|
26
|
+
| Continue | supported | `%USERPROFILE%\.continue\sessions\*.json` | `~/.continue/sessions/*.json` | Local sources, CLI |
|
|
27
|
+
| Aider | supported; override: `NETCODEX_AIDER_PATHS` | `<repo>\.aider.chat.history.md` | `<repo>/.aider.chat.history.md` | Local sources, CLI |
|
|
28
|
+
| Google Antigravity | best effort | `%USERPROFILE%\.gemini\antigravity\conversation_summaries.db`<br>`%USERPROFILE%\.gemini\antigravity\conversations\*.db` | `~/.gemini/antigravity/conversation_summaries.db`<br>`~/.gemini/antigravity/conversations/*.db` | Local sources, CLI |
|
|
29
|
+
| Trae | encrypted, not supported | `%APPDATA%\Trae\ModularData\ai-agent\database.db`<br>`%APPDATA%\Trae CN\ModularData\ai-agent\database.db` | `<config>/Trae/ModularData/ai-agent/database.db`<br>`<config>/Trae CN/ModularData/ai-agent/database.db` | - |
|
|
30
|
+
| Windsurf | encrypted, not supported | `%USERPROFILE%\.codeium\windsurf\cascade\*.pb` | `~/.codeium/windsurf/cascade/*.pb` | - |
|
|
31
|
+
|
|
32
|
+
`<config>` is `~/Library/Application Support` on macOS and `~/.config` on Linux. `<editor>` is any VS Code-family editor: Code, Code - Insiders, VSCodium, Cursor, Windsurf, Trae, Trae CN, Antigravity, Kiro, Positron.
|
|
33
|
+
<!-- netcodex:where:end -->
|
|
34
|
+
|
|
35
|
+
Find them on your machine with `netcodex where` (`--json`, `--patterns`), or open the desk
|
|
36
|
+
(`netcodex ui`) and click **Where are my chats?**: it lists every tool with its status, the
|
|
37
|
+
resolved folder on this computer (Copy path / Open folder) and what to import. Encrypted
|
|
38
|
+
stores (current Trae, Windsurf) are reported but cannot be exported. claude.ai chats are not
|
|
39
|
+
stored locally: request the official data export (Settings > Privacy > Export data) and save
|
|
40
|
+
the `data-*.zip` / `conversations.json` in Downloads or point `NETCODEX_CLAUDE_AI_EXPORT` at it.
|
|
41
|
+
|
|
42
|
+
Client labels written to the `tool` field: `codex-cli`, `codex-vscode`, `codex-desktop`,
|
|
43
|
+
`claude-code-cli`, `claude-code-vscode`, `claude-desktop`, `claude-cowork`,
|
|
44
|
+
`copilot-chat-<editor>`, `cline-*`, `roo-code-*`, `kilo-code-*`, `cursor`, `copilot-cli`,
|
|
45
|
+
`gemini-cli`, `continue`, `aider`, `claude-ai`, `antigravity`.
|
|
26
46
|
|
|
27
47
|
All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
|
|
28
48
|
with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
|
|
@@ -50,19 +70,33 @@ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` a
|
|
|
50
70
|
upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
|
|
51
71
|
[Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
|
|
52
72
|
|
|
53
|
-
### Local UI
|
|
73
|
+
### Local UI: the Conversation export desk
|
|
54
74
|
|
|
55
75
|
```powershell
|
|
56
|
-
netcodex ui # opens http://127.0.0.1:<port
|
|
76
|
+
netcodex ui # opens http://127.0.0.1:<port>/app/#token=... in your browser
|
|
57
77
|
netcodex ui --port 8765 --out D:\exports --no-open
|
|
78
|
+
netcodex --version
|
|
58
79
|
```
|
|
59
80
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
`netcodex ui` serves the full export desk from your own machine: an upload rail for
|
|
82
|
+
JSONL/SQLite/ZIP files with source auto-detection, a **Local sources** tab that reads the
|
|
83
|
+
detected tools directly (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI, ...),
|
|
84
|
+
MD/QD/PDF formats with Quarkdown templates, the Upload > Analyze > Review > Export > Done
|
|
85
|
+
tracker, a system activity log, the preview and the export summary with the ZIP download.
|
|
86
|
+
The preview shows the Quarkdown HTML for QD/PDF exports and a rendered (sanitized) Markdown
|
|
87
|
+
view for Markdown-only exports, plus the Markdown source tab. **Where are my chats?** (header
|
|
88
|
+
button and Upload rail link) lists every supported tool with its status, the folder found on
|
|
89
|
+
this computer (Copy path / Open folder) and what to import. QD and PDF need the Quarkdown CLI;
|
|
90
|
+
the desk says so when it is missing.
|
|
91
|
+
|
|
92
|
+
Everything runs on 127.0.0.1: `--host` with a non-loopback address is refused unless
|
|
93
|
+
`--allow-remote` is given, API calls need the per-launch token from the URL (exchanged
|
|
94
|
+
for an HttpOnly, SameSite=Strict session cookie), and requests whose `Host` is not a
|
|
95
|
+
loopback name are rejected. Nothing is sent to a NetCodex server.
|
|
96
|
+
|
|
97
|
+
The desk is the Next.js app in `web/`, built as a static site by `npm run desk:build`
|
|
98
|
+
(`scripts/build-desk.mjs`) into `src/netcodex/web/desk/` and shipped in the wheel. A
|
|
99
|
+
source checkout without that build falls back to a minimal built-in page.
|
|
66
100
|
|
|
67
101
|
## License
|
|
68
102
|
|
|
@@ -79,6 +113,8 @@ uv run netcodex --help
|
|
|
79
113
|
|
|
80
114
|
```powershell
|
|
81
115
|
uv run netcodex sources # registered sources, found / not found
|
|
116
|
+
uv run netcodex where # where each tool keeps its chats, and what is on this machine
|
|
117
|
+
uv run netcodex where --json # same, machine-readable (also: sources --paths)
|
|
82
118
|
uv run netcodex scan --sources all
|
|
83
119
|
uv run netcodex analyze --source auto --json
|
|
84
120
|
uv run netcodex export --all --out exports # every available source, every session
|
|
@@ -109,6 +145,11 @@ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
|
|
|
109
145
|
|
|
110
146
|
Large exports use worker processes (`--jobs`, default automatic, up to 4).
|
|
111
147
|
|
|
148
|
+
The "Where are my chats?" table above, `netcodex where`, the desk help panel and the public
|
|
149
|
+
`/where` page all come from `netcodex.sources.locations`. After changing it, regenerate the
|
|
150
|
+
README table and `web/lib/chat-locations.json` with `uv run python scripts/export_locations.py`
|
|
151
|
+
(a test fails while they are out of date).
|
|
152
|
+
|
|
112
153
|
Sources live in a registry (`netcodex.sources.registry`). Store locations come
|
|
113
154
|
from a per-platform path matrix (`netcodex.sources.paths`: Windows
|
|
114
155
|
`%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
|
|
@@ -189,8 +230,8 @@ npm run api:dev
|
|
|
189
230
|
npm run web:dev
|
|
190
231
|
```
|
|
191
232
|
|
|
192
|
-
|
|
193
|
-
`http://localhost:8000
|
|
233
|
+
In development (`npm run dev`) the desk reads `NEXT_PUBLIC_API_URL` (default
|
|
234
|
+
`http://localhost:8000`) and the dev API also serves the local-sources endpoints. The MVP web flow accepts `.jsonl`, `.sqlite`, and
|
|
194
235
|
`.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
|
|
195
236
|
and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
|
|
196
237
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "netcodex-agent-exporter"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.2"
|
|
4
4
|
description = "Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -68,9 +68,12 @@ testpaths = ["tests"]
|
|
|
68
68
|
|
|
69
69
|
[tool.hatch.build.targets.wheel]
|
|
70
70
|
packages = ["src/netcodex"]
|
|
71
|
+
# The static export desk is generated (npm run desk:build) and git-ignored; ship it anyway.
|
|
72
|
+
artifacts = ["src/netcodex/web/desk/**"]
|
|
71
73
|
|
|
72
74
|
[tool.hatch.build.targets.sdist]
|
|
73
75
|
include = ["src/netcodex", "tests", "README.md", "LICENSE", "pyproject.toml", "scripts/netcodex_entry.py"]
|
|
76
|
+
artifacts = ["src/netcodex/web/desk/**"]
|
|
74
77
|
|
|
75
78
|
[build-system]
|
|
76
79
|
requires = ["hatchling>=1.27"]
|
|
@@ -7,6 +7,7 @@ from pathlib import Path
|
|
|
7
7
|
|
|
8
8
|
import typer
|
|
9
9
|
|
|
10
|
+
from netcodex import __version__
|
|
10
11
|
from netcodex.renderers import DEFAULT_TEMPLATE_ID, MarkdownOptions
|
|
11
12
|
from netcodex.sources.paths import current_platform, path_matrix
|
|
12
13
|
from netcodex.sources.registry import create_source, registered
|
|
@@ -24,6 +25,26 @@ from netcodex.services import (
|
|
|
24
25
|
app = typer.Typer(help="Export local agent conversations to Markdown, Quarkdown and PDF.")
|
|
25
26
|
|
|
26
27
|
|
|
28
|
+
def _print_version(value: bool) -> None:
|
|
29
|
+
if value:
|
|
30
|
+
typer.echo(f"netcodex {__version__}")
|
|
31
|
+
raise typer.Exit()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@app.callback()
|
|
35
|
+
def main(
|
|
36
|
+
version: bool = typer.Option(
|
|
37
|
+
False,
|
|
38
|
+
"--version",
|
|
39
|
+
"-V",
|
|
40
|
+
callback=_print_version,
|
|
41
|
+
is_eager=True,
|
|
42
|
+
help="Show the installed version and exit.",
|
|
43
|
+
),
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Export local agent conversations to Markdown, Quarkdown and PDF."""
|
|
46
|
+
|
|
47
|
+
|
|
27
48
|
@app.command()
|
|
28
49
|
def scan(
|
|
29
50
|
sources: str = typer.Option("all", help="Comma-separated sources, or all."),
|
|
@@ -70,12 +91,58 @@ def analyze(
|
|
|
70
91
|
typer.echo(f"warning: {warning}")
|
|
71
92
|
|
|
72
93
|
|
|
94
|
+
@app.command("where")
|
|
95
|
+
def where(
|
|
96
|
+
json_output: bool = typer.Option(False, "--json", help="Print machine-readable JSON."),
|
|
97
|
+
counts: bool = typer.Option(True, "--count/--no-count", help="Count the conversations found in each place."),
|
|
98
|
+
patterns: bool = typer.Option(False, "--patterns", help="Also print the generic path patterns for this OS."),
|
|
99
|
+
markdown: bool = typer.Option(False, "--markdown", help="Print the machine-independent Markdown table."),
|
|
100
|
+
) -> None:
|
|
101
|
+
"""Where are my chats? Storage folder of every supported tool, and what exists on this machine."""
|
|
102
|
+
|
|
103
|
+
from netcodex.sources.locations import STATUS_LABELS, machine_payload, markdown_table
|
|
104
|
+
|
|
105
|
+
if markdown:
|
|
106
|
+
typer.echo(markdown_table(), nl=False)
|
|
107
|
+
return
|
|
108
|
+
payload = machine_payload(with_counts=counts)
|
|
109
|
+
if json_output:
|
|
110
|
+
typer.echo(json.dumps(payload, indent=2))
|
|
111
|
+
return
|
|
112
|
+
platform = payload["platform"]
|
|
113
|
+
rows = []
|
|
114
|
+
for tool in payload["tools"]:
|
|
115
|
+
found = [item["path"] for item in tool["resolved"]]
|
|
116
|
+
detected = "" if tool["detected"] is None else str(tool["detected"])
|
|
117
|
+
rows.append((tool["name"], STATUS_LABELS[tool["status"]], detected, found, tool))
|
|
118
|
+
name_width = max(len(row[0]) for row in rows)
|
|
119
|
+
status_width = max(len(row[1]) for row in rows)
|
|
120
|
+
count_width = max(len("found"), *(len(row[2]) for row in rows))
|
|
121
|
+
typer.echo(f"{'tool':<{name_width}} {'status':<{status_width}} {'found':>{count_width}} path on this machine")
|
|
122
|
+
for name, status, detected, found, tool in rows:
|
|
123
|
+
first = found[0] if found else "(not found)"
|
|
124
|
+
typer.echo(f"{name:<{name_width}} {status:<{status_width}} {detected:>{count_width}} {first}")
|
|
125
|
+
indent = " " * (name_width + status_width + count_width + 6)
|
|
126
|
+
for extra in found[1:]:
|
|
127
|
+
typer.echo(f"{indent}{extra}")
|
|
128
|
+
if patterns:
|
|
129
|
+
for pattern in tool["patterns"][platform]:
|
|
130
|
+
typer.echo(f"{indent}pattern: {pattern}")
|
|
131
|
+
if payload["env_set"]:
|
|
132
|
+
typer.echo(f"overrides in effect: {', '.join(payload['env_set'])}")
|
|
133
|
+
typer.echo("found = conversations detected (encrypted tools: encrypted files). Details: netcodex where --json")
|
|
134
|
+
|
|
135
|
+
|
|
73
136
|
@app.command("sources")
|
|
74
137
|
def list_sources(
|
|
75
138
|
json_output: bool = typer.Option(False, "--json", help="Print machine-readable JSON."),
|
|
139
|
+
paths: bool = typer.Option(False, "--paths", help="Show where each tool stores its chats (same as `where`)."),
|
|
76
140
|
) -> None:
|
|
77
141
|
"""List registered sources, whether their local store exists, and where they are read from."""
|
|
78
142
|
|
|
143
|
+
if paths:
|
|
144
|
+
where(json_output=json_output, counts=True, patterns=False, markdown=False)
|
|
145
|
+
return
|
|
79
146
|
matrix = path_matrix()
|
|
80
147
|
payload = []
|
|
81
148
|
for info in registered():
|
|
@@ -301,7 +368,8 @@ def ui(
|
|
|
301
368
|
token = secrets.token_urlsafe(24)
|
|
302
369
|
application = create_local_app(out.resolve(), token=token, allow_remote=allow_remote)
|
|
303
370
|
shown_host = f"[{host}]" if ":" in host else host
|
|
304
|
-
|
|
371
|
+
page = "/app/" if application.state.desk_dir is not None else "/"
|
|
372
|
+
url = f"http://{shown_host}:{port}{page}#token={token}"
|
|
305
373
|
typer.echo(f"NetCodex UI: {url}")
|
|
306
374
|
typer.echo("Press Ctrl+C to stop.")
|
|
307
375
|
if open_browser:
|