netcodex-agent-exporter 0.3.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 (86) hide show
  1. netcodex_agent_exporter-0.3.0/.gitignore +32 -0
  2. netcodex_agent_exporter-0.3.0/LICENSE +21 -0
  3. netcodex_agent_exporter-0.3.0/PKG-INFO +275 -0
  4. netcodex_agent_exporter-0.3.0/README.md +239 -0
  5. netcodex_agent_exporter-0.3.0/pyproject.toml +77 -0
  6. netcodex_agent_exporter-0.3.0/scripts/netcodex_entry.py +6 -0
  7. netcodex_agent_exporter-0.3.0/src/netcodex/__init__.py +6 -0
  8. netcodex_agent_exporter-0.3.0/src/netcodex/cli.py +309 -0
  9. netcodex_agent_exporter-0.3.0/src/netcodex/incremental.py +106 -0
  10. netcodex_agent_exporter-0.3.0/src/netcodex/models.py +145 -0
  11. netcodex_agent_exporter-0.3.0/src/netcodex/renderers/__init__.py +20 -0
  12. netcodex_agent_exporter-0.3.0/src/netcodex/renderers/markdown.py +279 -0
  13. netcodex_agent_exporter-0.3.0/src/netcodex/renderers/quarkdown.py +352 -0
  14. netcodex_agent_exporter-0.3.0/src/netcodex/security/__init__.py +4 -0
  15. netcodex_agent_exporter-0.3.0/src/netcodex/security/redaction.py +57 -0
  16. netcodex_agent_exporter-0.3.0/src/netcodex/services.py +690 -0
  17. netcodex_agent_exporter-0.3.0/src/netcodex/sources/__init__.py +5 -0
  18. netcodex_agent_exporter-0.3.0/src/netcodex/sources/aider.py +169 -0
  19. netcodex_agent_exporter-0.3.0/src/netcodex/sources/antigravity.py +236 -0
  20. netcodex_agent_exporter-0.3.0/src/netcodex/sources/claude.py +581 -0
  21. netcodex_agent_exporter-0.3.0/src/netcodex/sources/claude_ai.py +194 -0
  22. netcodex_agent_exporter-0.3.0/src/netcodex/sources/cline.py +225 -0
  23. netcodex_agent_exporter-0.3.0/src/netcodex/sources/codex.py +602 -0
  24. netcodex_agent_exporter-0.3.0/src/netcodex/sources/common.py +261 -0
  25. netcodex_agent_exporter-0.3.0/src/netcodex/sources/continue_dev.py +144 -0
  26. netcodex_agent_exporter-0.3.0/src/netcodex/sources/copilot_chat.py +307 -0
  27. netcodex_agent_exporter-0.3.0/src/netcodex/sources/copilot_cli.py +152 -0
  28. netcodex_agent_exporter-0.3.0/src/netcodex/sources/cursor.py +174 -0
  29. netcodex_agent_exporter-0.3.0/src/netcodex/sources/encrypted.py +77 -0
  30. netcodex_agent_exporter-0.3.0/src/netcodex/sources/gemini_cli.py +184 -0
  31. netcodex_agent_exporter-0.3.0/src/netcodex/sources/paths.py +110 -0
  32. netcodex_agent_exporter-0.3.0/src/netcodex/sources/registry.py +155 -0
  33. netcodex_agent_exporter-0.3.0/src/netcodex/web/__init__.py +1 -0
  34. netcodex_agent_exporter-0.3.0/src/netcodex/web/api.py +371 -0
  35. netcodex_agent_exporter-0.3.0/src/netcodex/web/local_ui.py +190 -0
  36. netcodex_agent_exporter-0.3.0/src/netcodex/web/static/local.html +198 -0
  37. netcodex_agent_exporter-0.3.0/tests/conftest.py +73 -0
  38. netcodex_agent_exporter-0.3.0/tests/fixtures/claude/normal-session.jsonl +4 -0
  39. netcodex_agent_exporter-0.3.0/tests/fixtures/claude/session-fixture.jsonl +5 -0
  40. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.jsonl +4 -0
  41. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444/subagents/agent-a1b2.meta.json +5 -0
  42. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444.jsonl +20 -0
  43. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/bbbbbbbb-1111-4222-8333-444444444444.jsonl +2 -0
  44. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/claude-code-sessions/acct-1/org-1/local_d1.json +9 -0
  45. netcodex_agent_exporter-0.3.0/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 +2 -0
  46. netcodex_agent_exporter-0.3.0/tests/fixtures/claude_v2/home/AppData/Roaming/Claude/local-agent-mode-sessions/acct-1/org-1/local_c1.json +7 -0
  47. netcodex_agent_exporter-0.3.0/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +5 -0
  48. netcodex_agent_exporter-0.3.0/tests/fixtures/codex_v2/archived_sessions/rollout-2026-06-01T09-00-00-99999999-8888-4777-8666-555555555555.jsonl +3 -0
  49. netcodex_agent_exporter-0.3.0/tests/fixtures/codex_v2/session_index.jsonl +1 -0
  50. netcodex_agent_exporter-0.3.0/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-00-11111111-2222-4333-8444-555555555555.jsonl +20 -0
  51. netcodex_agent_exporter-0.3.0/tests/fixtures/codex_v2/sessions/2026/06/08/rollout-2026-06-08T10-00-10-66666666-7777-4888-9999-aaaaaaaaaaaa.jsonl +3 -0
  52. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-conversation.md +28 -0
  53. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-conversation.qd +49 -0
  54. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-v2.md +112 -0
  55. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-conversation.md +26 -0
  56. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-v2-full.md +151 -0
  57. netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-v2.md +113 -0
  58. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/api_conversation_history.json +60 -0
  59. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/ui_messages.json +8 -0
  60. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/copilot-session-1.jsonl +6 -0
  61. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/empty-session.json +5 -0
  62. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/legacy-session.json +22 -0
  63. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/workspace.json +3 -0
  64. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +57 -0
  65. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +8 -0
  66. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/events.jsonl +7 -0
  67. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/workspace.yaml +6 -0
  68. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.gemini/tmp/projhash1/chats/session-2026-06-13T10-00-abc.json +54 -0
  69. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +16 -0
  70. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +70 -0
  71. netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/code/webshop/.aider.chat.history.md +22 -0
  72. netcodex_agent_exporter-0.3.0/tests/test_cli.py +70 -0
  73. netcodex_agent_exporter-0.3.0/tests/test_export_layout.py +78 -0
  74. netcodex_agent_exporter-0.3.0/tests/test_golden_outputs.py +58 -0
  75. netcodex_agent_exporter-0.3.0/tests/test_incremental.py +112 -0
  76. netcodex_agent_exporter-0.3.0/tests/test_local_ui.py +95 -0
  77. netcodex_agent_exporter-0.3.0/tests/test_redaction.py +37 -0
  78. netcodex_agent_exporter-0.3.0/tests/test_registry_export_all.py +205 -0
  79. netcodex_agent_exporter-0.3.0/tests/test_renderers.py +267 -0
  80. netcodex_agent_exporter-0.3.0/tests/test_sources.py +89 -0
  81. netcodex_agent_exporter-0.3.0/tests/test_sources_antigravity.py +97 -0
  82. netcodex_agent_exporter-0.3.0/tests/test_sources_cli_tools.py +88 -0
  83. netcodex_agent_exporter-0.3.0/tests/test_sources_v2.py +398 -0
  84. netcodex_agent_exporter-0.3.0/tests/test_sources_vscode_family.py +80 -0
  85. netcodex_agent_exporter-0.3.0/tests/test_web_api.py +276 -0
  86. netcodex_agent_exporter-0.3.0/tests/test_workflow_manifest.py +46 -0
@@ -0,0 +1,32 @@
1
+ .venv/
2
+ .ruff_cache/
3
+ .pytest_cache/
4
+ __pycache__/
5
+ *.py[cod]
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ node_modules/
10
+ web/.next/
11
+ web/out/
12
+ web/tsconfig.tsbuildinfo
13
+ web/playwright-report/
14
+ web/test-results/
15
+
16
+ # Local private exports and raw agent stores must not be committed.
17
+ exports/
18
+ raw/
19
+ *.sqlite
20
+ *.sqlite-shm
21
+ *.sqlite-wal
22
+ *.jsonl.raw
23
+ *.jsonl
24
+ !tests/fixtures/**/*.jsonl
25
+
26
+ # Tool output
27
+ quarkdown-output/
28
+ docs/architecture/generated/
29
+
30
+ # PyInstaller
31
+ *.spec
32
+ binaries/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NetCodex Technology
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,275 @@
1
+ Metadata-Version: 2.5
2
+ Name: netcodex-agent-exporter
3
+ Version: 0.3.0
4
+ Summary: Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown.
5
+ Project-URL: Homepage, https://gitlab.com/netcodex-tech/agent-conversation-exporter
6
+ Project-URL: Repository, https://gitlab.com/netcodex-tech/agent-conversation-exporter
7
+ Project-URL: Issues, https://gitlab.com/netcodex-tech/agent-conversation-exporter/-/issues
8
+ Author: NetCodex Technology
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai-agents,claude-code,codex,copilot,cursor,export,markdown,transcripts
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
23
+ Classifier: Topic :: Utilities
24
+ Requires-Python: >=3.12
25
+ Requires-Dist: pydantic>=2.7
26
+ Requires-Dist: typer>=0.12
27
+ Provides-Extra: ui
28
+ Requires-Dist: fastapi>=0.115; extra == 'ui'
29
+ Requires-Dist: python-multipart>=0.0.9; extra == 'ui'
30
+ Requires-Dist: uvicorn[standard]>=0.30; extra == 'ui'
31
+ Provides-Extra: web
32
+ Requires-Dist: fastapi>=0.115; extra == 'web'
33
+ Requires-Dist: python-multipart>=0.0.9; extra == 'web'
34
+ Requires-Dist: uvicorn[standard]>=0.30; extra == 'web'
35
+ Description-Content-Type: text/markdown
36
+
37
+ # NetCodex Agent Conversation Exporter
38
+
39
+ Private, local-first CLI for exporting AI agent conversations from Claude Code
40
+ and Codex into Markdown, Quarkdown and PDF.
41
+
42
+ ## Status
43
+
44
+ Version 0.2 ("correct exports"). Supported sources:
45
+
46
+ | Source | Where it is read from | Client labels (`tool`) |
47
+ | --- | --- | --- |
48
+ | Codex CLI / VS Code extension / Codex Desktop | `$CODEX_HOME` or `~/.codex`: newest `state_*.sqlite` (`threads`, `thread_spawn_edges`), `session_index.jsonl` titles, rollout JSONL in `sessions/` and `archived_sessions/` | `codex-cli`, `codex-vscode`, `codex-desktop` |
49
+ | Claude Code CLI / VS Code | `$CLAUDE_CONFIG_DIR/projects` or `~/.claude/projects/**/<session>.jsonl`; subagents in `<session>/subagents/agent-*.jsonl` are grouped under their parent | `claude-code-cli`, `claude-code-vscode` |
50
+ | Claude desktop "Code" tab | Same JSONL, titled from `%APPDATA%/Claude/claude-code-sessions/**/local_*.json` | `claude-desktop` |
51
+ | Claude desktop Cowork | `%APPDATA%/Claude/local-agent-mode-sessions/**/local_<id>.json` + `local_<id>/.claude/projects/**/*.jsonl` | `claude-cowork` |
52
+ | GitHub Copilot Chat (`copilot-chat`) | `<editor>/User/workspaceStorage/*/chatSessions/*.jsonl` (operation log) or `.json`, `globalStorage/emptyWindowChatSessions` in every VS Code-family editor | `copilot-chat-<editor>` |
53
+ | Cline / Roo Code / Kilo Code (`cline`) | `<editor>/User/globalStorage/<extension>/tasks/<id>/api_conversation_history.json` | `cline-*`, `roo-code-*`, `kilo-code-*` |
54
+ | Cursor (`cursor`) | `Cursor/User/globalStorage/state.vscdb` (`cursorDiskKV` composer + bubbles) | `cursor` |
55
+ | GitHub Copilot CLI (`copilot-cli`) | `~/.copilot/session-state/<id>/events.jsonl` | `copilot-cli` |
56
+ | Gemini CLI (`gemini-cli`) | `~/.gemini/tmp/<hash>/chats/session-*.json`, `logs.json` | `gemini-cli` |
57
+ | Continue (`continue`) | `~/.continue/sessions/*.json` | `continue` |
58
+ | Aider (`aider`) | `.aider.chat.history.md` in repos under `NETCODEX_AIDER_PATHS` or the home folder (depth 3) | `aider` |
59
+ | claude.ai chats (`claude-ai`) | Official export ZIP / `conversations.json` from `NETCODEX_CLAUDE_AI_EXPORT` or `~/Downloads` | `claude-ai` |
60
+ | Google Antigravity (`antigravity`) | `~/.gemini/antigravity/conversation_summaries.db` + `conversations/*.db` (schemaless protobuf, best effort; legacy encrypted `.pb` skipped) | `antigravity` |
61
+ | Trae, Windsurf (`trae`, `windsurf`) | Encrypted stores: reported by `netcodex sources`, not exported | - |
62
+
63
+ All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
64
+ with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
65
+ `system_context` and `summary` parts). Tool results are attached to their call,
66
+ injected environment/instruction/hook context is classified as system context,
67
+ and mirrored Codex `event_msg` messages are de-duplicated.
68
+
69
+ Raw conversations stay local by default. Generated exports are written under
70
+ `exports/`, which is intentionally ignored by Git.
71
+
72
+ ## Install
73
+
74
+ NetCodex runs on your own machine; it reads the local conversation stores and never
75
+ uploads them. Python 3.12+ is required for the package installs.
76
+
77
+ | How | Command | Notes |
78
+ | --- | --- | --- |
79
+ | pipx | `pipx install "netcodex-agent-exporter[ui]"` | Recommended. Drop `[ui]` for the CLI only. |
80
+ | uv | `uv tool install "netcodex-agent-exporter[ui]"` | Same, using uv. |
81
+ | Binary | Download `netcodex-<version>-windows-x86_64.exe` or `-linux-x86_64` from the GitLab Release | Single file, no Python needed; includes the UI. |
82
+ | From source | `git clone ... && uv sync && uv run netcodex --help` | For development. |
83
+
84
+ The PyPI package and release binaries are published from `v*` tags (first release:
85
+ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the
86
+ upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
87
+ [Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
88
+
89
+ ### Local UI
90
+
91
+ ```powershell
92
+ netcodex ui # opens http://127.0.0.1:<port>/#token=... in your browser
93
+ netcodex ui --port 8765 --out D:\exports --no-open
94
+ ```
95
+
96
+ The UI lists every detected source and its conversations, previews the Markdown
97
+ (reasoning / tool output / system context toggles) and exports the selected or all
98
+ conversations to a folder you choose, incrementally. It binds to 127.0.0.1 only;
99
+ `--host` with a non-loopback address is refused unless `--allow-remote` is given.
100
+ Every API call needs the per-launch token from the URL, and requests whose `Host` is
101
+ not a loopback name are rejected.
102
+
103
+ ## License
104
+
105
+ MIT, see [LICENSE](LICENSE).
106
+
107
+ ## Setup (development)
108
+
109
+ ```powershell
110
+ uv sync
111
+ uv run netcodex --help
112
+ ```
113
+
114
+ ## Common Commands
115
+
116
+ ```powershell
117
+ uv run netcodex sources # registered sources, found / not found
118
+ uv run netcodex scan --sources all
119
+ uv run netcodex analyze --source auto --json
120
+ uv run netcodex export --all --out exports # every available source, every session
121
+ uv run netcodex export --all --since 7d --workspace my-repo
122
+ uv run netcodex export --source claude --formats md,qd --limit 1
123
+ uv run netcodex export --local --source codex --formats md,qd,pdf --template galactic-guide --json
124
+ uv run netcodex validate exports
125
+ ```
126
+
127
+ `export` accepts `--source auto|all|<name>[,<name>]` (or `--all`), `--limit N` per
128
+ source (default `0` = all sessions), `--since`/`--until` (ISO date or an age such
129
+ as `7d`, `12h`, `2w`) and `--workspace <text>` (case-insensitive match on the
130
+ session's working directory). Tool inputs/outputs are capped per block with
131
+ `--max-tool-output-lines` (default 200) and `--max-tool-output-bytes` (default
132
+ 32000); the Markdown notes how much was left out. Payloads over 200k characters
133
+ are also cut at import time, before redaction.
134
+
135
+ Exports are incremental: `<out>/.netcodex-state.json` records a fingerprint of
136
+ each session's source files (size and mtime, including subagent files), its title
137
+ and the export options. Re-running `export` into the same folder only re-renders new
138
+ or changed conversations (renamed ones replace their old folder); `--force`
139
+ re-exports everything and `--no-incremental` ignores the state file. To keep a
140
+ folder up to date continuously:
141
+
142
+ ```powershell
143
+ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
144
+ ```
145
+
146
+ Large exports use worker processes (`--jobs`, default automatic, up to 4).
147
+
148
+ Sources live in a registry (`netcodex.sources.registry`). Store locations come
149
+ from a per-platform path matrix (`netcodex.sources.paths`: Windows
150
+ `%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
151
+ enumerates VS Code-family editors (Code, Insiders, VSCodium, Cursor, Windsurf,
152
+ Trae, Antigravity, Kiro, Positron).
153
+
154
+ Each export creates one folder per conversation named
155
+ `<source>/<date>-<title-slug>-<short-id>/` containing `conversation.md`,
156
+ `metadata.json` and `netcodex-manifest.json`, plus an `index.md` table (date,
157
+ title, tool, turns, link) at the export root.
158
+
159
+ `conversation.md` (Markdown v2) starts with YAML frontmatter (`title`, `id`,
160
+ `source`, `tool`, `originator`, `model`, `workspace`, `git_branch`,
161
+ `started_at`, `ended_at`, `turn_count`, `subagent_count`, `parent_id`), uses one
162
+ `## Role · timestamp` heading per turn, keeps code fences intact and puts tool
163
+ calls/results and reasoning in collapsible `<details>` blocks. Images and
164
+ attachments become placeholders. Content switches:
165
+
166
+ ```powershell
167
+ uv run netcodex export --source codex --limit 20 `
168
+ --no-reasoning --no-tool-output --include-system-context --no-subagents `
169
+ --max-tool-output-lines 50
170
+ ```
171
+
172
+ Every export records the shared workflow `analyze -> parse -> render -> package`
173
+ inside `netcodex-manifest.json`, including generated artifact hashes without
174
+ storing transcript bodies.
175
+
176
+ PDF export uses Quarkdown for the MVP. If Quarkdown or its browser runtime is
177
+ not available, the CLI reports the missing dependency instead of failing
178
+ silently.
179
+
180
+ ## Releasing
181
+
182
+ 1. Bump `version` in `pyproject.toml` and `src/netcodex/__init__.py`, merge to `main`.
183
+ 2. Push a tag `vX.Y.Z` matching that version. The tag pipeline builds the sdist and
184
+ wheel, PyInstaller single-file binaries for Linux and Windows (GitLab.com Windows
185
+ runner), uploads everything to the project's generic package registry, creates the
186
+ GitLab Release, and publishes to PyPI with the masked, protected CI/CD variable
187
+ `PYPI_TOKEN` (job skipped when the variable is absent).
188
+ 3. macOS binaries need a macOS runner; build them locally with
189
+ `uv run pyinstaller --onefile --name netcodex --collect-submodules netcodex --collect-submodules uvicorn --collect-data netcodex scripts/netcodex_entry.py`.
190
+
191
+ ## Development
192
+
193
+ ```powershell
194
+ uv run ruff check .
195
+ uv run pytest
196
+ uv build
197
+ npm run diagrams:check
198
+ ```
199
+
200
+ ## Local Web
201
+
202
+ Install dependencies once:
203
+
204
+ ```powershell
205
+ uv sync
206
+ npm install
207
+ npm install --prefix web
208
+ ```
209
+
210
+ Run the local API and web UI together from one terminal:
211
+
212
+ ```powershell
213
+ npm run dev
214
+ ```
215
+
216
+ This starts:
217
+
218
+ - API: `http://localhost:8000`
219
+ - Web: `http://127.0.0.1:3100`
220
+
221
+ You can still run each side separately when debugging:
222
+
223
+ ```powershell
224
+ npm run api:dev
225
+ npm run web:dev
226
+ ```
227
+
228
+ The web UI reads `NEXT_PUBLIC_API_URL`; when it is not set, it uses
229
+ `http://localhost:8000`. The MVP web flow accepts `.jsonl`, `.sqlite`, and
230
+ `.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
231
+ and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
232
+
233
+ ### Public landing deployment (landing-only mode)
234
+
235
+ The web app can be deployed publicly as a marketing site (e.g. Dokploy/Nixpacks
236
+ with build path `web`, `npm run build` then `npm run start`). Because the export
237
+ workspace needs the local API, a production build runs in **landing-only mode**
238
+ when `NEXT_PUBLIC_LANDING_ONLY=1` is set, or when `NEXT_PUBLIC_API_URL` is unset:
239
+ `/app` shows a "This tool runs locally" panel with install instructions instead
240
+ of the upload form, and every "Open app" call to action points to `/install`.
241
+ Set `NEXT_PUBLIC_LANDING_ONLY=0` to force the full workspace in a production
242
+ build. `next dev` always keeps the local workspace.
243
+
244
+ See `docs/web/local-web-api.md` for the API contract and temporary file cleanup
245
+ policy.
246
+
247
+ ## Architecture
248
+
249
+ The canonical architecture model lives in `docs/architecture/likec4/model.c4`
250
+ and is validated with LikeC4. GitLab-friendly Mermaid mirrors live in
251
+ `docs/architecture/c4.md`.
252
+
253
+ VS Code users should open the `.c4` file with the LikeC4 extension installed.
254
+ The expected extension id is `likec4.likec4-vscode`.
255
+
256
+ ## GitLab Flow
257
+
258
+ NetCodex uses GitLab Flow, not Git Flow:
259
+
260
+ - `main` is protected and always releasable.
261
+ - Work starts from issue branches named `issue/<iid>-<short-slug>`.
262
+ - Every change goes through a merge request into `main`.
263
+ - Merge requires a green pipeline and resolved discussions.
264
+ - `release/*` branches and `v*` tags are reserved for release preparation.
265
+
266
+ See `docs/development/gitlab-flow.md` for the full policy.
267
+
268
+ ## Privacy Rules
269
+
270
+ - Do not commit real exports, raw `.jsonl` files, SQLite databases or local
271
+ attachments.
272
+ - Use sanitized fixtures only.
273
+ - Keep parsers read-only against source directories.
274
+ - Use `--include-paths` only when full local paths are intentionally needed in
275
+ the generated metadata.
@@ -0,0 +1,239 @@
1
+ # NetCodex Agent Conversation Exporter
2
+
3
+ Private, local-first CLI for exporting AI agent conversations from Claude Code
4
+ and Codex into Markdown, Quarkdown and PDF.
5
+
6
+ ## Status
7
+
8
+ Version 0.2 ("correct exports"). Supported sources:
9
+
10
+ | Source | Where it is read from | Client labels (`tool`) |
11
+ | --- | --- | --- |
12
+ | Codex CLI / VS Code extension / Codex Desktop | `$CODEX_HOME` or `~/.codex`: newest `state_*.sqlite` (`threads`, `thread_spawn_edges`), `session_index.jsonl` titles, rollout JSONL in `sessions/` and `archived_sessions/` | `codex-cli`, `codex-vscode`, `codex-desktop` |
13
+ | Claude Code CLI / VS Code | `$CLAUDE_CONFIG_DIR/projects` or `~/.claude/projects/**/<session>.jsonl`; subagents in `<session>/subagents/agent-*.jsonl` are grouped under their parent | `claude-code-cli`, `claude-code-vscode` |
14
+ | Claude desktop "Code" tab | Same JSONL, titled from `%APPDATA%/Claude/claude-code-sessions/**/local_*.json` | `claude-desktop` |
15
+ | Claude desktop Cowork | `%APPDATA%/Claude/local-agent-mode-sessions/**/local_<id>.json` + `local_<id>/.claude/projects/**/*.jsonl` | `claude-cowork` |
16
+ | GitHub Copilot Chat (`copilot-chat`) | `<editor>/User/workspaceStorage/*/chatSessions/*.jsonl` (operation log) or `.json`, `globalStorage/emptyWindowChatSessions` in every VS Code-family editor | `copilot-chat-<editor>` |
17
+ | Cline / Roo Code / Kilo Code (`cline`) | `<editor>/User/globalStorage/<extension>/tasks/<id>/api_conversation_history.json` | `cline-*`, `roo-code-*`, `kilo-code-*` |
18
+ | Cursor (`cursor`) | `Cursor/User/globalStorage/state.vscdb` (`cursorDiskKV` composer + bubbles) | `cursor` |
19
+ | GitHub Copilot CLI (`copilot-cli`) | `~/.copilot/session-state/<id>/events.jsonl` | `copilot-cli` |
20
+ | Gemini CLI (`gemini-cli`) | `~/.gemini/tmp/<hash>/chats/session-*.json`, `logs.json` | `gemini-cli` |
21
+ | Continue (`continue`) | `~/.continue/sessions/*.json` | `continue` |
22
+ | Aider (`aider`) | `.aider.chat.history.md` in repos under `NETCODEX_AIDER_PATHS` or the home folder (depth 3) | `aider` |
23
+ | claude.ai chats (`claude-ai`) | Official export ZIP / `conversations.json` from `NETCODEX_CLAUDE_AI_EXPORT` or `~/Downloads` | `claude-ai` |
24
+ | Google Antigravity (`antigravity`) | `~/.gemini/antigravity/conversation_summaries.db` + `conversations/*.db` (schemaless protobuf, best effort; legacy encrypted `.pb` skipped) | `antigravity` |
25
+ | Trae, Windsurf (`trae`, `windsurf`) | Encrypted stores: reported by `netcodex sources`, not exported | - |
26
+
27
+ All parsers map to one canonical model (`Conversation` -> `Turn` -> `MessagePart`
28
+ with `text`, `tool_call`, `tool_result`, `reasoning`, `image`, `attachment`,
29
+ `system_context` and `summary` parts). Tool results are attached to their call,
30
+ injected environment/instruction/hook context is classified as system context,
31
+ and mirrored Codex `event_msg` messages are de-duplicated.
32
+
33
+ Raw conversations stay local by default. Generated exports are written under
34
+ `exports/`, which is intentionally ignored by Git.
35
+
36
+ ## Install
37
+
38
+ NetCodex runs on your own machine; it reads the local conversation stores and never
39
+ uploads them. Python 3.12+ is required for the package installs.
40
+
41
+ | How | Command | Notes |
42
+ | --- | --- | --- |
43
+ | pipx | `pipx install "netcodex-agent-exporter[ui]"` | Recommended. Drop `[ui]` for the CLI only. |
44
+ | uv | `uv tool install "netcodex-agent-exporter[ui]"` | Same, using uv. |
45
+ | Binary | Download `netcodex-<version>-windows-x86_64.exe` or `-linux-x86_64` from the GitLab Release | Single file, no Python needed; includes the UI. |
46
+ | From source | `git clone ... && uv sync && uv run netcodex --help` | For development. |
47
+
48
+ The PyPI package and release binaries are published from `v*` tags (first release:
49
+ v0.3.0). Extras: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the
50
+ upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
51
+ [Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
52
+
53
+ ### Local UI
54
+
55
+ ```powershell
56
+ netcodex ui # opens http://127.0.0.1:<port>/#token=... in your browser
57
+ netcodex ui --port 8765 --out D:\exports --no-open
58
+ ```
59
+
60
+ The UI lists every detected source and its conversations, previews the Markdown
61
+ (reasoning / tool output / system context toggles) and exports the selected or all
62
+ conversations to a folder you choose, incrementally. It binds to 127.0.0.1 only;
63
+ `--host` with a non-loopback address is refused unless `--allow-remote` is given.
64
+ Every API call needs the per-launch token from the URL, and requests whose `Host` is
65
+ not a loopback name are rejected.
66
+
67
+ ## License
68
+
69
+ MIT, see [LICENSE](LICENSE).
70
+
71
+ ## Setup (development)
72
+
73
+ ```powershell
74
+ uv sync
75
+ uv run netcodex --help
76
+ ```
77
+
78
+ ## Common Commands
79
+
80
+ ```powershell
81
+ uv run netcodex sources # registered sources, found / not found
82
+ uv run netcodex scan --sources all
83
+ uv run netcodex analyze --source auto --json
84
+ uv run netcodex export --all --out exports # every available source, every session
85
+ uv run netcodex export --all --since 7d --workspace my-repo
86
+ uv run netcodex export --source claude --formats md,qd --limit 1
87
+ uv run netcodex export --local --source codex --formats md,qd,pdf --template galactic-guide --json
88
+ uv run netcodex validate exports
89
+ ```
90
+
91
+ `export` accepts `--source auto|all|<name>[,<name>]` (or `--all`), `--limit N` per
92
+ source (default `0` = all sessions), `--since`/`--until` (ISO date or an age such
93
+ as `7d`, `12h`, `2w`) and `--workspace <text>` (case-insensitive match on the
94
+ session's working directory). Tool inputs/outputs are capped per block with
95
+ `--max-tool-output-lines` (default 200) and `--max-tool-output-bytes` (default
96
+ 32000); the Markdown notes how much was left out. Payloads over 200k characters
97
+ are also cut at import time, before redaction.
98
+
99
+ Exports are incremental: `<out>/.netcodex-state.json` records a fingerprint of
100
+ each session's source files (size and mtime, including subagent files), its title
101
+ and the export options. Re-running `export` into the same folder only re-renders new
102
+ or changed conversations (renamed ones replace their old folder); `--force`
103
+ re-exports everything and `--no-incremental` ignores the state file. To keep a
104
+ folder up to date continuously:
105
+
106
+ ```powershell
107
+ uv run netcodex watch --out exports --interval 60 # Ctrl+C to stop
108
+ ```
109
+
110
+ Large exports use worker processes (`--jobs`, default automatic, up to 4).
111
+
112
+ Sources live in a registry (`netcodex.sources.registry`). Store locations come
113
+ from a per-platform path matrix (`netcodex.sources.paths`: Windows
114
+ `%APPDATA%`, macOS `~/Library/Application Support`, Linux `~/.config`) that also
115
+ enumerates VS Code-family editors (Code, Insiders, VSCodium, Cursor, Windsurf,
116
+ Trae, Antigravity, Kiro, Positron).
117
+
118
+ Each export creates one folder per conversation named
119
+ `<source>/<date>-<title-slug>-<short-id>/` containing `conversation.md`,
120
+ `metadata.json` and `netcodex-manifest.json`, plus an `index.md` table (date,
121
+ title, tool, turns, link) at the export root.
122
+
123
+ `conversation.md` (Markdown v2) starts with YAML frontmatter (`title`, `id`,
124
+ `source`, `tool`, `originator`, `model`, `workspace`, `git_branch`,
125
+ `started_at`, `ended_at`, `turn_count`, `subagent_count`, `parent_id`), uses one
126
+ `## Role · timestamp` heading per turn, keeps code fences intact and puts tool
127
+ calls/results and reasoning in collapsible `<details>` blocks. Images and
128
+ attachments become placeholders. Content switches:
129
+
130
+ ```powershell
131
+ uv run netcodex export --source codex --limit 20 `
132
+ --no-reasoning --no-tool-output --include-system-context --no-subagents `
133
+ --max-tool-output-lines 50
134
+ ```
135
+
136
+ Every export records the shared workflow `analyze -> parse -> render -> package`
137
+ inside `netcodex-manifest.json`, including generated artifact hashes without
138
+ storing transcript bodies.
139
+
140
+ PDF export uses Quarkdown for the MVP. If Quarkdown or its browser runtime is
141
+ not available, the CLI reports the missing dependency instead of failing
142
+ silently.
143
+
144
+ ## Releasing
145
+
146
+ 1. Bump `version` in `pyproject.toml` and `src/netcodex/__init__.py`, merge to `main`.
147
+ 2. Push a tag `vX.Y.Z` matching that version. The tag pipeline builds the sdist and
148
+ wheel, PyInstaller single-file binaries for Linux and Windows (GitLab.com Windows
149
+ runner), uploads everything to the project's generic package registry, creates the
150
+ GitLab Release, and publishes to PyPI with the masked, protected CI/CD variable
151
+ `PYPI_TOKEN` (job skipped when the variable is absent).
152
+ 3. macOS binaries need a macOS runner; build them locally with
153
+ `uv run pyinstaller --onefile --name netcodex --collect-submodules netcodex --collect-submodules uvicorn --collect-data netcodex scripts/netcodex_entry.py`.
154
+
155
+ ## Development
156
+
157
+ ```powershell
158
+ uv run ruff check .
159
+ uv run pytest
160
+ uv build
161
+ npm run diagrams:check
162
+ ```
163
+
164
+ ## Local Web
165
+
166
+ Install dependencies once:
167
+
168
+ ```powershell
169
+ uv sync
170
+ npm install
171
+ npm install --prefix web
172
+ ```
173
+
174
+ Run the local API and web UI together from one terminal:
175
+
176
+ ```powershell
177
+ npm run dev
178
+ ```
179
+
180
+ This starts:
181
+
182
+ - API: `http://localhost:8000`
183
+ - Web: `http://127.0.0.1:3100`
184
+
185
+ You can still run each side separately when debugging:
186
+
187
+ ```powershell
188
+ npm run api:dev
189
+ npm run web:dev
190
+ ```
191
+
192
+ The web UI reads `NEXT_PUBLIC_API_URL`; when it is not set, it uses
193
+ `http://localhost:8000`. The MVP web flow accepts `.jsonl`, `.sqlite`, and
194
+ `.zip` uploads, analyzes detected Claude/Codex sessions, previews Markdown,
195
+ and downloads generated artifacts plus `netcodex-manifest.json` as a ZIP.
196
+
197
+ ### Public landing deployment (landing-only mode)
198
+
199
+ The web app can be deployed publicly as a marketing site (e.g. Dokploy/Nixpacks
200
+ with build path `web`, `npm run build` then `npm run start`). Because the export
201
+ workspace needs the local API, a production build runs in **landing-only mode**
202
+ when `NEXT_PUBLIC_LANDING_ONLY=1` is set, or when `NEXT_PUBLIC_API_URL` is unset:
203
+ `/app` shows a "This tool runs locally" panel with install instructions instead
204
+ of the upload form, and every "Open app" call to action points to `/install`.
205
+ Set `NEXT_PUBLIC_LANDING_ONLY=0` to force the full workspace in a production
206
+ build. `next dev` always keeps the local workspace.
207
+
208
+ See `docs/web/local-web-api.md` for the API contract and temporary file cleanup
209
+ policy.
210
+
211
+ ## Architecture
212
+
213
+ The canonical architecture model lives in `docs/architecture/likec4/model.c4`
214
+ and is validated with LikeC4. GitLab-friendly Mermaid mirrors live in
215
+ `docs/architecture/c4.md`.
216
+
217
+ VS Code users should open the `.c4` file with the LikeC4 extension installed.
218
+ The expected extension id is `likec4.likec4-vscode`.
219
+
220
+ ## GitLab Flow
221
+
222
+ NetCodex uses GitLab Flow, not Git Flow:
223
+
224
+ - `main` is protected and always releasable.
225
+ - Work starts from issue branches named `issue/<iid>-<short-slug>`.
226
+ - Every change goes through a merge request into `main`.
227
+ - Merge requires a green pipeline and resolved discussions.
228
+ - `release/*` branches and `v*` tags are reserved for release preparation.
229
+
230
+ See `docs/development/gitlab-flow.md` for the full policy.
231
+
232
+ ## Privacy Rules
233
+
234
+ - Do not commit real exports, raw `.jsonl` files, SQLite databases or local
235
+ attachments.
236
+ - Use sanitized fixtures only.
237
+ - Keep parsers read-only against source directories.
238
+ - Use `--include-paths` only when full local paths are intentionally needed in
239
+ the generated metadata.
@@ -0,0 +1,77 @@
1
+ [project]
2
+ name = "netcodex-agent-exporter"
3
+ version = "0.3.0"
4
+ description = "Local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline, Cursor, Gemini CLI and more) to Markdown."
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
9
+ authors = [{ name = "NetCodex Technology" }]
10
+ keywords = ["codex", "claude-code", "copilot", "cursor", "markdown", "export", "ai-agents", "transcripts"]
11
+ classifiers = [
12
+ "Development Status :: 4 - Beta",
13
+ "Environment :: Console",
14
+ "Environment :: Web Environment",
15
+ "Intended Audience :: Developers",
16
+ "Operating System :: OS Independent",
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3 :: Only",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Programming Language :: Python :: 3.13",
21
+ "Topic :: Software Development",
22
+ "Topic :: Text Processing :: Markup :: Markdown",
23
+ "Topic :: Utilities",
24
+ ]
25
+ # Core CLI: no web server dependencies.
26
+ dependencies = [
27
+ "pydantic>=2.7",
28
+ "typer>=0.12",
29
+ ]
30
+
31
+ [project.optional-dependencies]
32
+ # `netcodex ui` (local web UI) and the upload API used by the Next.js app.
33
+ ui = [
34
+ "fastapi>=0.115",
35
+ "python-multipart>=0.0.9",
36
+ "uvicorn[standard]>=0.30",
37
+ ]
38
+ web = [
39
+ "fastapi>=0.115",
40
+ "python-multipart>=0.0.9",
41
+ "uvicorn[standard]>=0.30",
42
+ ]
43
+
44
+ [project.urls]
45
+ Homepage = "https://gitlab.com/netcodex-tech/agent-conversation-exporter"
46
+ Repository = "https://gitlab.com/netcodex-tech/agent-conversation-exporter"
47
+ Issues = "https://gitlab.com/netcodex-tech/agent-conversation-exporter/-/issues"
48
+
49
+ [project.scripts]
50
+ netcodex = "netcodex.cli:app"
51
+
52
+ [dependency-groups]
53
+ dev = [
54
+ "fastapi>=0.115",
55
+ "httpx>=0.27",
56
+ "pytest>=8.2",
57
+ "python-multipart>=0.0.9",
58
+ "ruff>=0.6",
59
+ "uvicorn[standard]>=0.30",
60
+ ]
61
+
62
+ [tool.ruff]
63
+ line-length = 100
64
+ target-version = "py312"
65
+
66
+ [tool.pytest.ini_options]
67
+ testpaths = ["tests"]
68
+
69
+ [tool.hatch.build.targets.wheel]
70
+ packages = ["src/netcodex"]
71
+
72
+ [tool.hatch.build.targets.sdist]
73
+ include = ["src/netcodex", "tests", "README.md", "LICENSE", "pyproject.toml", "scripts/netcodex_entry.py"]
74
+
75
+ [build-system]
76
+ requires = ["hatchling>=1.27"]
77
+ build-backend = "hatchling.build"
@@ -0,0 +1,6 @@
1
+ """Entry point for PyInstaller single-file binaries (``netcodex`` / ``netcodex.exe``)."""
2
+
3
+ from netcodex.cli import app
4
+
5
+ if __name__ == "__main__":
6
+ app()
@@ -0,0 +1,6 @@
1
+ """NetCodex agent conversation exporter."""
2
+
3
+ __all__ = ["__version__"]
4
+
5
+ __version__ = "0.3.0"
6
+