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.
- netcodex_agent_exporter-0.3.0/.gitignore +32 -0
- netcodex_agent_exporter-0.3.0/LICENSE +21 -0
- netcodex_agent_exporter-0.3.0/PKG-INFO +275 -0
- netcodex_agent_exporter-0.3.0/README.md +239 -0
- netcodex_agent_exporter-0.3.0/pyproject.toml +77 -0
- netcodex_agent_exporter-0.3.0/scripts/netcodex_entry.py +6 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/__init__.py +6 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/cli.py +309 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/incremental.py +106 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/models.py +145 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/renderers/__init__.py +20 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/renderers/markdown.py +279 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/renderers/quarkdown.py +352 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/security/__init__.py +4 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/security/redaction.py +57 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/services.py +690 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/__init__.py +5 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/aider.py +169 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/antigravity.py +236 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/claude.py +581 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/claude_ai.py +194 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/cline.py +225 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/codex.py +602 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/common.py +261 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/continue_dev.py +144 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/copilot_chat.py +307 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/copilot_cli.py +152 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/cursor.py +174 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/encrypted.py +77 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/gemini_cli.py +184 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/paths.py +110 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/sources/registry.py +155 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/web/__init__.py +1 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/web/api.py +371 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/web/local_ui.py +190 -0
- netcodex_agent_exporter-0.3.0/src/netcodex/web/static/local.html +198 -0
- netcodex_agent_exporter-0.3.0/tests/conftest.py +73 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/claude/normal-session.jsonl +4 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/claude/session-fixture.jsonl +5 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- netcodex_agent_exporter-0.3.0/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +5 -0
- 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
- netcodex_agent_exporter-0.3.0/tests/fixtures/codex_v2/session_index.jsonl +1 -0
- 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
- 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
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-conversation.md +28 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-conversation.qd +49 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/claude-v2.md +112 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-conversation.md +26 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-v2-full.md +151 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/golden/codex-v2.md +113 -0
- 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
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/ui_messages.json +8 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/copilot-session-1.jsonl +6 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/empty-session.json +5 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/legacy-session.json +22 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/workspace.json +3 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +57 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +8 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/events.jsonl +7 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/workspace.yaml +6 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.gemini/tmp/projhash1/chats/session-2026-06-13T10-00-abc.json +54 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +16 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +70 -0
- netcodex_agent_exporter-0.3.0/tests/fixtures/sources_v3/home/code/webshop/.aider.chat.history.md +22 -0
- netcodex_agent_exporter-0.3.0/tests/test_cli.py +70 -0
- netcodex_agent_exporter-0.3.0/tests/test_export_layout.py +78 -0
- netcodex_agent_exporter-0.3.0/tests/test_golden_outputs.py +58 -0
- netcodex_agent_exporter-0.3.0/tests/test_incremental.py +112 -0
- netcodex_agent_exporter-0.3.0/tests/test_local_ui.py +95 -0
- netcodex_agent_exporter-0.3.0/tests/test_redaction.py +37 -0
- netcodex_agent_exporter-0.3.0/tests/test_registry_export_all.py +205 -0
- netcodex_agent_exporter-0.3.0/tests/test_renderers.py +267 -0
- netcodex_agent_exporter-0.3.0/tests/test_sources.py +89 -0
- netcodex_agent_exporter-0.3.0/tests/test_sources_antigravity.py +97 -0
- netcodex_agent_exporter-0.3.0/tests/test_sources_cli_tools.py +88 -0
- netcodex_agent_exporter-0.3.0/tests/test_sources_v2.py +398 -0
- netcodex_agent_exporter-0.3.0/tests/test_sources_vscode_family.py +80 -0
- netcodex_agent_exporter-0.3.0/tests/test_web_api.py +276 -0
- 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"
|