netcodex-agent-exporter 0.3.2__tar.gz → 0.4.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.2 → netcodex_agent_exporter-0.4.0}/.gitignore +5 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/PKG-INFO +84 -10
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/README.md +76 -9
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/pyproject.toml +12 -2
- netcodex_agent_exporter-0.4.0/scripts/netcodex_desktop.py +11 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/__init__.py +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/cli.py +22 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/__init__.py +1 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/api.py +340 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/app.py +341 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/assets/netcodex.ico +0 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/assets/netcodex.png +0 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/instance.py +137 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/desktop/settings.py +148 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/404/index.html +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/404.html +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next.__PAGE__.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next._full.txt +3 -3
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk}/__next._head.txt +1 -1
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk}/__next._index.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next._tree.txt +2 -2
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3z5q_p4msz2ha.js → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/0dhbjz-xsmu83.js +2 -2
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/0qnmh9wz9lorw.js +1 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1b-vm_07onb7r.js +3 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1ea89e3xab1ak.js +3 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1gu32z8d2tay0.js +3 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1zuuge2xd2clt.js +1 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/207ds7nnlgbnd.css +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zz7ddvqh9xr5.js → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/2moa64stoso8d.js +1 -1
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3-zdmcjilyxgd.js +10 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/36s2b2nufwwkv.js +1 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/16x2ab5tjuq8p.js → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3a1ymfgzop588.js +1 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2nykiepra7i1k.js → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3peubv2924kx4.js +1 -1
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3v9d505v3a-8k.js +1 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/427h3xvkktehv.js +20 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/turbopack-1_6kmb9wb6nxy.js → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/turbopack-41gzj9ou99jhe.js +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._full.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._head.txt +1 -1
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_not-found}/__next._index.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._not-found.__PAGE__.txt +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._not-found.txt +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._tree.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/index.html +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/index.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next._full.txt +3 -3
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/app}/__next._head.txt +1 -1
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_not-found → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/app}/__next._index.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next._tree.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next.app.__PAGE__.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next.app.txt +1 -1
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/app/index.html +1 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/index.txt +3 -3
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/brand/netcodex-app-icon.png +0 -0
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/index.html +2 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/index.txt +3 -3
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._full.txt +20 -19
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._head.txt +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._index.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._tree.txt +2 -2
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +8 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next.install.txt +1 -1
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/install/index.html +6 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/index.txt +20 -19
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._full.txt +3 -3
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._head.txt +1 -1
- netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/where/__next._index.txt +5 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._tree.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next.where.__PAGE__.txt +2 -2
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next.where.txt +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/index.html +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/index.txt +3 -3
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/local_api.py +4 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/local_ui.py +11 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-conversation.md +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-v2.md +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-conversation.md +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-v2-full.md +1 -1
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-v2.md +1 -1
- netcodex_agent_exporter-0.4.0/tests/test_desktop.py +364 -0
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0xs948yx7egqf.js +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1rxncug86bump.js +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zrw-wzjvs1a7.js +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/24w1ykbgdtn0d.js +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/27gsbatdo0vgh.js +0 -10
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2cnskixvc-f-1.js +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2wfuz7opg3uv2.js +0 -20
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3rbfc1m17ic0f.css +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.html +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.html +0 -1
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +0 -7
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.html +0 -5
- netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._index.txt +0 -5
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/LICENSE +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/scripts/netcodex_entry.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/incremental.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/models.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/markdown.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/quarkdown.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/security/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/security/redaction.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/services.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/aider.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/antigravity.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/claude.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/claude_ai.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/cline.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/codex.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/common.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/continue_dev.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/copilot_chat.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/copilot_cli.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/cursor.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/encrypted.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/gemini_cli.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/locations.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/paths.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/registry.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/__init__.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/api.py +0 -0
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86 → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/LuivC58xmhDLbM44Um6JB}/_buildManifest.js +0 -0
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86 → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/LuivC58xmhDLbM44Um6JB}/_clientMiddlewareManifest.js +0 -0
- {netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/I0mRqzUWWnK0TU4TefL86 → netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/LuivC58xmhDLbM44Um6JB}/_ssgManifest.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/05-c3ty_6dwfk.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/0cz1d0mv5g_q7.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/0y-qmi6py9vt0.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/14mrh2-p_w84d.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/15orcrkp-_9ct.js +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo-v2-icon.png +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo-v2.png +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo.png +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/static/local.html +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/conftest.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude/normal-session.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude/session-fixture.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/aaaaaaaa-1111-4222-8333-444444444444.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude_v2/home/.claude/projects/C--Users-Example-app/bbbbbbbb-1111-4222-8333-444444444444.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.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 +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/codex_v2/session_index.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/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.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-conversation.qd +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/api_conversation_history.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/globalStorage/kilocode.kilo-code/tasks/1781000100000/ui_messages.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/copilot-session-1.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/empty-session.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/chatSessions/legacy-session.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/appdata/Code/User/workspaceStorage/0a1b2c3d/workspace.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/events.jsonl +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.copilot/session-state/cli-session-1/workspace.yaml +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash1/chats/session-2026-06-13T10-00-abc.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/code/webshop/.aider.chat.history.md +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_cli.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_export_layout.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_golden_outputs.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_incremental.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_local_ui.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_locations.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_redaction.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_registry_export_all.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_renderers.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_antigravity.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_cli_tools.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_v2.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_vscode_family.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_web_api.py +0 -0
- {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_workflow_manifest.py +0 -0
|
@@ -33,3 +33,8 @@ binaries/
|
|
|
33
33
|
|
|
34
34
|
# Built export desk (generated by npm run desk:build, shipped in the wheel)
|
|
35
35
|
src/netcodex/web/desk/
|
|
36
|
+
|
|
37
|
+
# Desktop app builds (PyInstaller onedir, Inno Setup output) and landing downloads fetched at build time
|
|
38
|
+
desktop-dist/
|
|
39
|
+
packaging/windows/Output/
|
|
40
|
+
web/public/downloads/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: netcodex-agent-exporter
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
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
|
|
@@ -11,7 +11,9 @@ License-File: LICENSE
|
|
|
11
11
|
Keywords: ai-agents,claude-code,codex,copilot,cursor,export,markdown,transcripts
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Environment :: MacOS X
|
|
14
15
|
Classifier: Environment :: Web Environment
|
|
16
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
15
17
|
Classifier: Intended Audience :: Developers
|
|
16
18
|
Classifier: Operating System :: OS Independent
|
|
17
19
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -24,6 +26,11 @@ Classifier: Topic :: Utilities
|
|
|
24
26
|
Requires-Python: >=3.12
|
|
25
27
|
Requires-Dist: pydantic>=2.7
|
|
26
28
|
Requires-Dist: typer>=0.12
|
|
29
|
+
Provides-Extra: desktop
|
|
30
|
+
Requires-Dist: fastapi>=0.115; extra == 'desktop'
|
|
31
|
+
Requires-Dist: python-multipart>=0.0.9; extra == 'desktop'
|
|
32
|
+
Requires-Dist: pywebview>=5.3; extra == 'desktop'
|
|
33
|
+
Requires-Dist: uvicorn[standard]>=0.30; extra == 'desktop'
|
|
27
34
|
Provides-Extra: ui
|
|
28
35
|
Requires-Dist: fastapi>=0.115; extra == 'ui'
|
|
29
36
|
Requires-Dist: python-multipart>=0.0.9; extra == 'ui'
|
|
@@ -36,12 +43,13 @@ Description-Content-Type: text/markdown
|
|
|
36
43
|
|
|
37
44
|
# NetCodex Agent Conversation Exporter
|
|
38
45
|
|
|
39
|
-
Private, local-first
|
|
40
|
-
and
|
|
46
|
+
Private, local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline,
|
|
47
|
+
Cursor, Gemini CLI and more) into Markdown, Quarkdown and PDF: a **desktop app** that finds
|
|
48
|
+
your AI tools by itself, a local web desk and a CLI.
|
|
41
49
|
|
|
42
50
|
## Status
|
|
43
51
|
|
|
44
|
-
Version 0.
|
|
52
|
+
Version 0.4. Supported tools, where each one keeps its chats, and how to import them
|
|
45
53
|
(`netcodex where` prints the same table with the paths that exist on your machine).
|
|
46
54
|
|
|
47
55
|
### Where are my chats?
|
|
@@ -96,16 +104,66 @@ uploads them. Python 3.12+ is required for the package installs.
|
|
|
96
104
|
|
|
97
105
|
| How | Command | Notes |
|
|
98
106
|
| --- | --- | --- |
|
|
107
|
+
| Desktop app (Windows) | Download `NetCodex-Setup-<version>-x64.exe` from the landing page (Download for Windows) | Per-user install, no admin, no Python. Portable `NetCodex-<version>-portable.exe` too. |
|
|
108
|
+
| Desktop app (any OS) | `pipx install "netcodex-agent-exporter[desktop]"` then `netcodex desktop` | Native window via pywebview. |
|
|
99
109
|
| pipx | `pipx install "netcodex-agent-exporter[ui]"` | Recommended. Drop `[ui]` for the CLI only. |
|
|
100
110
|
| uv | `uv tool install "netcodex-agent-exporter[ui]"` | Same, using uv. |
|
|
101
111
|
| Binary | Download `netcodex-<version>-windows-x86_64.exe` or `-linux-x86_64` from the GitLab Release | Single file, no Python needed; includes the UI. |
|
|
102
112
|
| From source | `git clone ... && uv sync && uv run netcodex --help` | For development. |
|
|
103
113
|
|
|
104
114
|
The PyPI package and release binaries are published from `v*` tags (first release:
|
|
105
|
-
v0.3.0). Extras: `[
|
|
106
|
-
|
|
115
|
+
v0.3.0). Extras: `[desktop]` adds pywebview plus the UI server for `netcodex desktop`;
|
|
116
|
+
`[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the upload API; the core
|
|
117
|
+
CLI only needs Pydantic and Typer. PDF export needs the external
|
|
107
118
|
[Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
|
|
108
119
|
|
|
120
|
+
### Desktop app
|
|
121
|
+
|
|
122
|
+
Download the Windows installer from the landing page (or the GitLab Release), run it, and open
|
|
123
|
+
**NetCodex** from the Start menu. With Python on any OS:
|
|
124
|
+
`pipx install "netcodex-agent-exporter[desktop]"` and `netcodex desktop`.
|
|
125
|
+
|
|
126
|
+
- A native window titled NetCodex opens (Edge WebView2 on Windows, WebKit on macOS, GTK or Qt on
|
|
127
|
+
Linux) over a local service on a random `127.0.0.1` port with a per-launch token. The window
|
|
128
|
+
is opened on a single-use launch link that sets an HttpOnly session cookie, so the token never
|
|
129
|
+
appears in a URL. Closing the window stops the service.
|
|
130
|
+
- **Detected on this computer**: on open it scans every supported tool through the source
|
|
131
|
+
registry and shows a card per installed tool (status, conversation count, last activity,
|
|
132
|
+
workspaces). Encrypted stores (Trae, Windsurf) are flagged; tools that are not installed are
|
|
133
|
+
collapsed. **Export all**, per-tool **Export**, and **Choose...** (search, date range and
|
|
134
|
+
workspace filters) write Markdown plus an `index.md` into the output folder, incrementally
|
|
135
|
+
(unchanged conversations are skipped; untick *Incremental* to re-export). **Open output
|
|
136
|
+
folder** opens it in Explorer/Finder.
|
|
137
|
+
- Default output folder: `Documents\NetCodex Exports` (Windows Known Folder, so OneDrive-redirected
|
|
138
|
+
Documents work). Change it with **Change...**; it is remembered in `settings.json` under
|
|
139
|
+
`%APPDATA%\NetCodex` (macOS `~/Library/Application Support/NetCodex`, Linux
|
|
140
|
+
`~/.config/netcodex`; `NETCODEX_APP_DIR` overrides). No conversation content is stored there.
|
|
141
|
+
- **Upload files** and **Where are my chats?** stay available (the full export desk).
|
|
142
|
+
- Single instance: launching it again brings the open window to the front.
|
|
143
|
+
- No WebView2 runtime (rare on Windows 10/11): a message offers the
|
|
144
|
+
[WebView2 download](https://go.microsoft.com/fwlink/p/?LinkId=2124703) and the app opens in
|
|
145
|
+
your default browser instead (`netcodex desktop --browser` does that on purpose).
|
|
146
|
+
- `netcodex desktop --smoke` starts the service, checks it answers and exits (used by CI).
|
|
147
|
+
|
|
148
|
+
Windows packaging lives in `packaging/windows/`: `build.ps1` (PyInstaller onedir app + portable
|
|
149
|
+
single-file exe, both smoke-tested, then Inno Setup 6 `netcodex.iss` -> per-user installer with
|
|
150
|
+
Start menu entry, optional desktop shortcut, uninstaller, icon and version metadata) and
|
|
151
|
+
`test-install.ps1` (silent `/VERYSILENT /CURRENTUSER` install, smoke test, silent uninstall).
|
|
152
|
+
Icons are generated from the brand mark by `scripts/make_icons.py`.
|
|
153
|
+
|
|
154
|
+
**SmartScreen and code signing.** The installer is not code-signed yet, so Windows SmartScreen
|
|
155
|
+
shows "Windows protected your PC" on first run (More info > Run anyway). The release job signs
|
|
156
|
+
the exes and the installer with `signtool` automatically once the masked CI/CD variables
|
|
157
|
+
`CODE_SIGNING_PFX_BASE64` (base64 of a code-signing .pfx) and `CODE_SIGNING_PFX_PASSWORD`
|
|
158
|
+
(optional `CODE_SIGNING_TIMESTAMP_URL`) exist; without them the step is skipped.
|
|
159
|
+
|
|
160
|
+
**macOS and Linux desktop builds** are not produced by CI: a macOS app bundle needs a macOS
|
|
161
|
+
runner (`packaging/icons/netcodex.icns` is ready), and a Linux AppImage would have to bundle
|
|
162
|
+
GTK/WebKit2. On both, use `pipx install "netcodex-agent-exporter[desktop]"`; on Linux also
|
|
163
|
+
install a pywebview backend (`sudo apt install python3-gi gir1.2-webkit2-4.1` with
|
|
164
|
+
`pipx inject netcodex-agent-exporter pygobject`, or `pipx inject netcodex-agent-exporter "pywebview[qt]"`),
|
|
165
|
+
or run `netcodex desktop --browser`.
|
|
166
|
+
|
|
109
167
|
### Local UI: the Conversation export desk
|
|
110
168
|
|
|
111
169
|
```powershell
|
|
@@ -222,10 +280,14 @@ silently.
|
|
|
222
280
|
|
|
223
281
|
1. Bump `version` in `pyproject.toml` and `src/netcodex/__init__.py`, merge to `main`.
|
|
224
282
|
2. Push a tag `vX.Y.Z` matching that version. The tag pipeline builds the sdist and
|
|
225
|
-
wheel, PyInstaller single-file binaries for Linux and Windows
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
283
|
+
wheel, PyInstaller single-file CLI binaries for Linux and Windows, the Windows desktop app
|
|
284
|
+
(`release:desktop-windows` on the GitLab.com Windows runner: installer + portable exe,
|
|
285
|
+
smoke-tested and install-tested), uploads everything to the project's generic package
|
|
286
|
+
registry, writes the pointer `netcodex-desktop/latest/latest.json` (version, file names,
|
|
287
|
+
sizes, SHA-256), creates the GitLab Release, publishes to PyPI with the masked, protected
|
|
288
|
+
CI/CD variable `PYPI_TOKEN` (job skipped when the variable is absent) and, when the
|
|
289
|
+
masked variable `DOKPLOY_DEPLOY_TOKEN` exists, redeploys the public landing
|
|
290
|
+
(`release:landing`) so its download button serves the new installer.
|
|
229
291
|
3. macOS binaries need a macOS runner; build them locally with
|
|
230
292
|
`uv run pyinstaller --onefile --name netcodex --collect-submodules netcodex --collect-submodules uvicorn --collect-data netcodex scripts/netcodex_entry.py`.
|
|
231
293
|
|
|
@@ -282,6 +344,18 @@ of the upload form, and every "Open app" call to action points to `/install`.
|
|
|
282
344
|
Set `NEXT_PUBLIC_LANDING_ONLY=0` to force the full workspace in a production
|
|
283
345
|
build. `next dev` always keeps the local workspace.
|
|
284
346
|
|
|
347
|
+
**Download for Windows.** The GitLab project is private, so visitors cannot download Release
|
|
348
|
+
assets. The landing serves the installer itself: `npm run build` runs `prebuild`
|
|
349
|
+
(`web/scripts/fetch-downloads.mjs`), which reads `latest.json` from the generic package registry
|
|
350
|
+
with a project deploy token that only has `read_package_registry`, downloads the installer and
|
|
351
|
+
the portable exe into `web/public/downloads/`, verifies size and SHA-256 and writes
|
|
352
|
+
`web/lib/downloads.json` (version, size, SHA-256 shown on the page). Configure it as build-time
|
|
353
|
+
environment of the landing app (never commit it): `GITLAB_DEPLOY_TOKEN_USER`,
|
|
354
|
+
`GITLAB_DEPLOY_TOKEN` (optional `GITLAB_PROJECT_ID`, `GITLAB_URL`,
|
|
355
|
+
`NETCODEX_DOWNLOADS_REQUIRED=1` to fail the build when the download fails). Without a token the
|
|
356
|
+
page shows the pipx instructions only. The token is used only during the build; it never
|
|
357
|
+
reaches the browser.
|
|
358
|
+
|
|
285
359
|
See `docs/web/local-web-api.md` for the API contract and temporary file cleanup
|
|
286
360
|
policy.
|
|
287
361
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# NetCodex Agent Conversation Exporter
|
|
2
2
|
|
|
3
|
-
Private, local-first
|
|
4
|
-
and
|
|
3
|
+
Private, local-first exporter for AI agent conversations (Codex, Claude Code, Copilot, Cline,
|
|
4
|
+
Cursor, Gemini CLI and more) into Markdown, Quarkdown and PDF: a **desktop app** that finds
|
|
5
|
+
your AI tools by itself, a local web desk and a CLI.
|
|
5
6
|
|
|
6
7
|
## Status
|
|
7
8
|
|
|
8
|
-
Version 0.
|
|
9
|
+
Version 0.4. Supported tools, where each one keeps its chats, and how to import them
|
|
9
10
|
(`netcodex where` prints the same table with the paths that exist on your machine).
|
|
10
11
|
|
|
11
12
|
### Where are my chats?
|
|
@@ -60,16 +61,66 @@ uploads them. Python 3.12+ is required for the package installs.
|
|
|
60
61
|
|
|
61
62
|
| How | Command | Notes |
|
|
62
63
|
| --- | --- | --- |
|
|
64
|
+
| Desktop app (Windows) | Download `NetCodex-Setup-<version>-x64.exe` from the landing page (Download for Windows) | Per-user install, no admin, no Python. Portable `NetCodex-<version>-portable.exe` too. |
|
|
65
|
+
| Desktop app (any OS) | `pipx install "netcodex-agent-exporter[desktop]"` then `netcodex desktop` | Native window via pywebview. |
|
|
63
66
|
| pipx | `pipx install "netcodex-agent-exporter[ui]"` | Recommended. Drop `[ui]` for the CLI only. |
|
|
64
67
|
| uv | `uv tool install "netcodex-agent-exporter[ui]"` | Same, using uv. |
|
|
65
68
|
| Binary | Download `netcodex-<version>-windows-x86_64.exe` or `-linux-x86_64` from the GitLab Release | Single file, no Python needed; includes the UI. |
|
|
66
69
|
| From source | `git clone ... && uv sync && uv run netcodex --help` | For development. |
|
|
67
70
|
|
|
68
71
|
The PyPI package and release binaries are published from `v*` tags (first release:
|
|
69
|
-
v0.3.0). Extras: `[
|
|
70
|
-
|
|
72
|
+
v0.3.0). Extras: `[desktop]` adds pywebview plus the UI server for `netcodex desktop`;
|
|
73
|
+
`[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the upload API; the core
|
|
74
|
+
CLI only needs Pydantic and Typer. PDF export needs the external
|
|
71
75
|
[Quarkdown](https://github.com/iamgio/quarkdown) binary on `PATH` (no Python extra).
|
|
72
76
|
|
|
77
|
+
### Desktop app
|
|
78
|
+
|
|
79
|
+
Download the Windows installer from the landing page (or the GitLab Release), run it, and open
|
|
80
|
+
**NetCodex** from the Start menu. With Python on any OS:
|
|
81
|
+
`pipx install "netcodex-agent-exporter[desktop]"` and `netcodex desktop`.
|
|
82
|
+
|
|
83
|
+
- A native window titled NetCodex opens (Edge WebView2 on Windows, WebKit on macOS, GTK or Qt on
|
|
84
|
+
Linux) over a local service on a random `127.0.0.1` port with a per-launch token. The window
|
|
85
|
+
is opened on a single-use launch link that sets an HttpOnly session cookie, so the token never
|
|
86
|
+
appears in a URL. Closing the window stops the service.
|
|
87
|
+
- **Detected on this computer**: on open it scans every supported tool through the source
|
|
88
|
+
registry and shows a card per installed tool (status, conversation count, last activity,
|
|
89
|
+
workspaces). Encrypted stores (Trae, Windsurf) are flagged; tools that are not installed are
|
|
90
|
+
collapsed. **Export all**, per-tool **Export**, and **Choose...** (search, date range and
|
|
91
|
+
workspace filters) write Markdown plus an `index.md` into the output folder, incrementally
|
|
92
|
+
(unchanged conversations are skipped; untick *Incremental* to re-export). **Open output
|
|
93
|
+
folder** opens it in Explorer/Finder.
|
|
94
|
+
- Default output folder: `Documents\NetCodex Exports` (Windows Known Folder, so OneDrive-redirected
|
|
95
|
+
Documents work). Change it with **Change...**; it is remembered in `settings.json` under
|
|
96
|
+
`%APPDATA%\NetCodex` (macOS `~/Library/Application Support/NetCodex`, Linux
|
|
97
|
+
`~/.config/netcodex`; `NETCODEX_APP_DIR` overrides). No conversation content is stored there.
|
|
98
|
+
- **Upload files** and **Where are my chats?** stay available (the full export desk).
|
|
99
|
+
- Single instance: launching it again brings the open window to the front.
|
|
100
|
+
- No WebView2 runtime (rare on Windows 10/11): a message offers the
|
|
101
|
+
[WebView2 download](https://go.microsoft.com/fwlink/p/?LinkId=2124703) and the app opens in
|
|
102
|
+
your default browser instead (`netcodex desktop --browser` does that on purpose).
|
|
103
|
+
- `netcodex desktop --smoke` starts the service, checks it answers and exits (used by CI).
|
|
104
|
+
|
|
105
|
+
Windows packaging lives in `packaging/windows/`: `build.ps1` (PyInstaller onedir app + portable
|
|
106
|
+
single-file exe, both smoke-tested, then Inno Setup 6 `netcodex.iss` -> per-user installer with
|
|
107
|
+
Start menu entry, optional desktop shortcut, uninstaller, icon and version metadata) and
|
|
108
|
+
`test-install.ps1` (silent `/VERYSILENT /CURRENTUSER` install, smoke test, silent uninstall).
|
|
109
|
+
Icons are generated from the brand mark by `scripts/make_icons.py`.
|
|
110
|
+
|
|
111
|
+
**SmartScreen and code signing.** The installer is not code-signed yet, so Windows SmartScreen
|
|
112
|
+
shows "Windows protected your PC" on first run (More info > Run anyway). The release job signs
|
|
113
|
+
the exes and the installer with `signtool` automatically once the masked CI/CD variables
|
|
114
|
+
`CODE_SIGNING_PFX_BASE64` (base64 of a code-signing .pfx) and `CODE_SIGNING_PFX_PASSWORD`
|
|
115
|
+
(optional `CODE_SIGNING_TIMESTAMP_URL`) exist; without them the step is skipped.
|
|
116
|
+
|
|
117
|
+
**macOS and Linux desktop builds** are not produced by CI: a macOS app bundle needs a macOS
|
|
118
|
+
runner (`packaging/icons/netcodex.icns` is ready), and a Linux AppImage would have to bundle
|
|
119
|
+
GTK/WebKit2. On both, use `pipx install "netcodex-agent-exporter[desktop]"`; on Linux also
|
|
120
|
+
install a pywebview backend (`sudo apt install python3-gi gir1.2-webkit2-4.1` with
|
|
121
|
+
`pipx inject netcodex-agent-exporter pygobject`, or `pipx inject netcodex-agent-exporter "pywebview[qt]"`),
|
|
122
|
+
or run `netcodex desktop --browser`.
|
|
123
|
+
|
|
73
124
|
### Local UI: the Conversation export desk
|
|
74
125
|
|
|
75
126
|
```powershell
|
|
@@ -186,10 +237,14 @@ silently.
|
|
|
186
237
|
|
|
187
238
|
1. Bump `version` in `pyproject.toml` and `src/netcodex/__init__.py`, merge to `main`.
|
|
188
239
|
2. Push a tag `vX.Y.Z` matching that version. The tag pipeline builds the sdist and
|
|
189
|
-
wheel, PyInstaller single-file binaries for Linux and Windows
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
240
|
+
wheel, PyInstaller single-file CLI binaries for Linux and Windows, the Windows desktop app
|
|
241
|
+
(`release:desktop-windows` on the GitLab.com Windows runner: installer + portable exe,
|
|
242
|
+
smoke-tested and install-tested), uploads everything to the project's generic package
|
|
243
|
+
registry, writes the pointer `netcodex-desktop/latest/latest.json` (version, file names,
|
|
244
|
+
sizes, SHA-256), creates the GitLab Release, publishes to PyPI with the masked, protected
|
|
245
|
+
CI/CD variable `PYPI_TOKEN` (job skipped when the variable is absent) and, when the
|
|
246
|
+
masked variable `DOKPLOY_DEPLOY_TOKEN` exists, redeploys the public landing
|
|
247
|
+
(`release:landing`) so its download button serves the new installer.
|
|
193
248
|
3. macOS binaries need a macOS runner; build them locally with
|
|
194
249
|
`uv run pyinstaller --onefile --name netcodex --collect-submodules netcodex --collect-submodules uvicorn --collect-data netcodex scripts/netcodex_entry.py`.
|
|
195
250
|
|
|
@@ -246,6 +301,18 @@ of the upload form, and every "Open app" call to action points to `/install`.
|
|
|
246
301
|
Set `NEXT_PUBLIC_LANDING_ONLY=0` to force the full workspace in a production
|
|
247
302
|
build. `next dev` always keeps the local workspace.
|
|
248
303
|
|
|
304
|
+
**Download for Windows.** The GitLab project is private, so visitors cannot download Release
|
|
305
|
+
assets. The landing serves the installer itself: `npm run build` runs `prebuild`
|
|
306
|
+
(`web/scripts/fetch-downloads.mjs`), which reads `latest.json` from the generic package registry
|
|
307
|
+
with a project deploy token that only has `read_package_registry`, downloads the installer and
|
|
308
|
+
the portable exe into `web/public/downloads/`, verifies size and SHA-256 and writes
|
|
309
|
+
`web/lib/downloads.json` (version, size, SHA-256 shown on the page). Configure it as build-time
|
|
310
|
+
environment of the landing app (never commit it): `GITLAB_DEPLOY_TOKEN_USER`,
|
|
311
|
+
`GITLAB_DEPLOY_TOKEN` (optional `GITLAB_PROJECT_ID`, `GITLAB_URL`,
|
|
312
|
+
`NETCODEX_DOWNLOADS_REQUIRED=1` to fail the build when the download fails). Without a token the
|
|
313
|
+
page shows the pipx instructions only. The token is used only during the build; it never
|
|
314
|
+
reaches the browser.
|
|
315
|
+
|
|
249
316
|
See `docs/web/local-web-api.md` for the API contract and temporary file cleanup
|
|
250
317
|
policy.
|
|
251
318
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "netcodex-agent-exporter"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
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"
|
|
@@ -12,6 +12,8 @@ classifiers = [
|
|
|
12
12
|
"Development Status :: 4 - Beta",
|
|
13
13
|
"Environment :: Console",
|
|
14
14
|
"Environment :: Web Environment",
|
|
15
|
+
"Environment :: Win32 (MS Windows)",
|
|
16
|
+
"Environment :: MacOS X",
|
|
15
17
|
"Intended Audience :: Developers",
|
|
16
18
|
"Operating System :: OS Independent",
|
|
17
19
|
"Programming Language :: Python :: 3",
|
|
@@ -35,6 +37,14 @@ ui = [
|
|
|
35
37
|
"python-multipart>=0.0.9",
|
|
36
38
|
"uvicorn[standard]>=0.30",
|
|
37
39
|
]
|
|
40
|
+
# `netcodex desktop` and the installed NetCodex app: native window (pywebview: Edge WebView2 on
|
|
41
|
+
# Windows, WebKit on macOS; on Linux also install a GUI backend, e.g. PyGObject or pywebview[qt]).
|
|
42
|
+
desktop = [
|
|
43
|
+
"fastapi>=0.115",
|
|
44
|
+
"python-multipart>=0.0.9",
|
|
45
|
+
"uvicorn[standard]>=0.30",
|
|
46
|
+
"pywebview>=5.3",
|
|
47
|
+
]
|
|
38
48
|
web = [
|
|
39
49
|
"fastapi>=0.115",
|
|
40
50
|
"python-multipart>=0.0.9",
|
|
@@ -72,7 +82,7 @@ packages = ["src/netcodex"]
|
|
|
72
82
|
artifacts = ["src/netcodex/web/desk/**"]
|
|
73
83
|
|
|
74
84
|
[tool.hatch.build.targets.sdist]
|
|
75
|
-
include = ["src/netcodex", "tests", "README.md", "LICENSE", "pyproject.toml", "scripts/netcodex_entry.py"]
|
|
85
|
+
include = ["src/netcodex", "tests", "README.md", "LICENSE", "pyproject.toml", "scripts/netcodex_entry.py", "scripts/netcodex_desktop.py"]
|
|
76
86
|
artifacts = ["src/netcodex/web/desk/**"]
|
|
77
87
|
|
|
78
88
|
[build-system]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Entry point of the packaged desktop app (NetCodex.exe, PyInstaller --windowed)."""
|
|
2
|
+
|
|
3
|
+
import multiprocessing
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from netcodex.desktop.app import main
|
|
7
|
+
|
|
8
|
+
if __name__ == "__main__":
|
|
9
|
+
# Needed by frozen builds before anything can start worker processes.
|
|
10
|
+
multiprocessing.freeze_support()
|
|
11
|
+
sys.exit(main())
|
|
@@ -375,3 +375,25 @@ def ui(
|
|
|
375
375
|
if open_browser:
|
|
376
376
|
threading.Timer(1.0, webbrowser.open, args=(url,)).start()
|
|
377
377
|
uvicorn.run(application, host=host, port=port, log_level="warning")
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
@app.command()
|
|
381
|
+
def desktop(
|
|
382
|
+
browser: bool = typer.Option(False, "--browser", help="Open in the default browser instead of a native window."),
|
|
383
|
+
smoke: bool = typer.Option(False, "--smoke", help="Start the local service, check it answers, then exit."),
|
|
384
|
+
) -> None:
|
|
385
|
+
"""Open the NetCodex desktop app: a native window that detects your AI tools and exports their chats."""
|
|
386
|
+
|
|
387
|
+
try:
|
|
388
|
+
import fastapi # noqa: F401
|
|
389
|
+
import uvicorn # noqa: F401
|
|
390
|
+
except ImportError as exc:
|
|
391
|
+
typer.echo(
|
|
392
|
+
"The desktop app needs the optional 'desktop' extra: "
|
|
393
|
+
"pipx install 'netcodex-agent-exporter[desktop]' (or uv tool install 'netcodex-agent-exporter[desktop]').",
|
|
394
|
+
err=True,
|
|
395
|
+
)
|
|
396
|
+
raise typer.Exit(1) from exc
|
|
397
|
+
from netcodex.desktop.app import launch
|
|
398
|
+
|
|
399
|
+
raise typer.Exit(launch(browser=browser, smoke=smoke))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""NetCodex desktop app: native window over the local export desk (``netcodex desktop``)."""
|