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.
Files changed (179) hide show
  1. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/.gitignore +5 -0
  2. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/PKG-INFO +84 -10
  3. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/README.md +76 -9
  4. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/pyproject.toml +12 -2
  5. netcodex_agent_exporter-0.4.0/scripts/netcodex_desktop.py +11 -0
  6. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/__init__.py +1 -1
  7. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/cli.py +22 -0
  8. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/__init__.py +1 -0
  9. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/api.py +340 -0
  10. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/app.py +341 -0
  11. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/assets/netcodex.ico +0 -0
  12. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/assets/netcodex.png +0 -0
  13. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/instance.py +137 -0
  14. netcodex_agent_exporter-0.4.0/src/netcodex/desktop/settings.py +148 -0
  15. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/404/index.html +1 -1
  16. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/404.html +1 -1
  17. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next.__PAGE__.txt +2 -2
  18. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next._full.txt +3 -3
  19. {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
  20. {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
  21. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/__next._tree.txt +2 -2
  22. 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
  23. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/0qnmh9wz9lorw.js +1 -0
  24. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1b-vm_07onb7r.js +3 -0
  25. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1ea89e3xab1ak.js +3 -0
  26. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1gu32z8d2tay0.js +3 -0
  27. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/1zuuge2xd2clt.js +1 -0
  28. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/207ds7nnlgbnd.css +1 -0
  29. 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
  30. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3-zdmcjilyxgd.js +10 -0
  31. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/36s2b2nufwwkv.js +1 -0
  32. 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
  33. 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
  34. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/3v9d505v3a-8k.js +1 -0
  35. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/_next/static/chunks/427h3xvkktehv.js +20 -0
  36. 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
  37. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._full.txt +2 -2
  38. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._head.txt +1 -1
  39. {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
  40. {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
  41. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._not-found.txt +1 -1
  42. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/__next._tree.txt +2 -2
  43. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/index.html +1 -1
  44. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_not-found/index.txt +2 -2
  45. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next._full.txt +3 -3
  46. {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
  47. {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
  48. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next._tree.txt +2 -2
  49. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next.app.__PAGE__.txt +2 -2
  50. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/__next.app.txt +1 -1
  51. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/app/index.html +1 -0
  52. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/app/index.txt +3 -3
  53. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/brand/netcodex-app-icon.png +0 -0
  54. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/index.html +2 -0
  55. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/index.txt +3 -3
  56. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._full.txt +20 -19
  57. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._head.txt +1 -1
  58. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._index.txt +2 -2
  59. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next._tree.txt +2 -2
  60. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +8 -0
  61. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/__next.install.txt +1 -1
  62. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/install/index.html +6 -0
  63. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/install/index.txt +20 -19
  64. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._full.txt +3 -3
  65. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._head.txt +1 -1
  66. netcodex_agent_exporter-0.4.0/src/netcodex/web/desk/where/__next._index.txt +5 -0
  67. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next._tree.txt +2 -2
  68. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next.where.__PAGE__.txt +2 -2
  69. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/__next.where.txt +1 -1
  70. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/index.html +1 -1
  71. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/where/index.txt +3 -3
  72. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/local_api.py +4 -0
  73. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/local_ui.py +11 -1
  74. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-conversation.md +1 -1
  75. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-v2.md +1 -1
  76. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-conversation.md +1 -1
  77. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-v2-full.md +1 -1
  78. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/codex-v2.md +1 -1
  79. netcodex_agent_exporter-0.4.0/tests/test_desktop.py +364 -0
  80. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/0xs948yx7egqf.js +0 -1
  81. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1rxncug86bump.js +0 -1
  82. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/1zrw-wzjvs1a7.js +0 -1
  83. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/24w1ykbgdtn0d.js +0 -1
  84. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/27gsbatdo0vgh.js +0 -10
  85. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2cnskixvc-f-1.js +0 -1
  86. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/2wfuz7opg3uv2.js +0 -20
  87. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/_next/static/chunks/3rbfc1m17ic0f.css +0 -1
  88. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/app/index.html +0 -1
  89. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/index.html +0 -1
  90. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/__next.install.__PAGE__.txt +0 -7
  91. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/install/index.html +0 -5
  92. netcodex_agent_exporter-0.3.2/src/netcodex/web/desk/where/__next._index.txt +0 -5
  93. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/LICENSE +0 -0
  94. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/scripts/netcodex_entry.py +0 -0
  95. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/incremental.py +0 -0
  96. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/models.py +0 -0
  97. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/__init__.py +0 -0
  98. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/markdown.py +0 -0
  99. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/renderers/quarkdown.py +0 -0
  100. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/security/__init__.py +0 -0
  101. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/security/redaction.py +0 -0
  102. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/services.py +0 -0
  103. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/__init__.py +0 -0
  104. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/aider.py +0 -0
  105. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/antigravity.py +0 -0
  106. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/claude.py +0 -0
  107. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/claude_ai.py +0 -0
  108. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/cline.py +0 -0
  109. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/codex.py +0 -0
  110. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/common.py +0 -0
  111. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/continue_dev.py +0 -0
  112. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/copilot_chat.py +0 -0
  113. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/copilot_cli.py +0 -0
  114. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/cursor.py +0 -0
  115. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/encrypted.py +0 -0
  116. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/gemini_cli.py +0 -0
  117. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/locations.py +0 -0
  118. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/paths.py +0 -0
  119. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/sources/registry.py +0 -0
  120. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/__init__.py +0 -0
  121. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/api.py +0 -0
  122. {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
  123. {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
  124. {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
  125. {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
  126. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/0cz1d0mv5g_q7.js +0 -0
  127. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/0y-qmi6py9vt0.js +0 -0
  128. {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
  129. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/_next/static/chunks/15orcrkp-_9ct.js +0 -0
  130. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo-v2-icon.png +0 -0
  131. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo-v2.png +0 -0
  132. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/desk/brand/netcodex-logo.png +0 -0
  133. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/src/netcodex/web/static/local.html +0 -0
  134. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/conftest.py +0 -0
  135. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude/normal-session.jsonl +0 -0
  136. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/claude/session-fixture.jsonl +0 -0
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/codex/sessions/2026/06/07/rollout-fixture.jsonl +0 -0
  145. {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
  146. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/codex_v2/session_index.jsonl +0 -0
  147. {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
  148. {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
  149. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/golden/claude-conversation.qd +0 -0
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.continue/sessions/continue-1.json +0 -0
  157. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.continue/sessions/sessions.json +0 -0
  158. {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
  159. {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
  160. {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
  161. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/.gemini/tmp/projhash2/logs.json +0 -0
  162. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/fixtures/sources_v3/home/Downloads/claude-export/conversations.json +0 -0
  163. {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
  164. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_cli.py +0 -0
  165. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_export_layout.py +0 -0
  166. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_golden_outputs.py +0 -0
  167. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_incremental.py +0 -0
  168. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_local_ui.py +0 -0
  169. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_locations.py +0 -0
  170. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_redaction.py +0 -0
  171. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_registry_export_all.py +0 -0
  172. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_renderers.py +0 -0
  173. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources.py +0 -0
  174. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_antigravity.py +0 -0
  175. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_cli_tools.py +0 -0
  176. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_v2.py +0 -0
  177. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_sources_vscode_family.py +0 -0
  178. {netcodex_agent_exporter-0.3.2 → netcodex_agent_exporter-0.4.0}/tests/test_web_api.py +0 -0
  179. {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.2
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 CLI for exporting AI agent conversations from Claude Code
40
- and Codex into Markdown, Quarkdown and PDF.
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.3. Supported tools, where each one keeps its chats, and how to import them
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: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the
106
- upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
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 (GitLab.com Windows
226
- runner), uploads everything to the project's generic package registry, creates the
227
- GitLab Release, and publishes to PyPI with the masked, protected CI/CD variable
228
- `PYPI_TOKEN` (job skipped when the variable is absent).
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 CLI for exporting AI agent conversations from Claude Code
4
- and Codex into Markdown, Quarkdown and PDF.
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.3. Supported tools, where each one keeps its chats, and how to import them
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: `[ui]` (alias `[web]`) adds FastAPI/uvicorn for `netcodex ui` and the
70
- upload API; the core CLI only needs Pydantic and Typer. PDF export needs the external
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 (GitLab.com Windows
190
- runner), uploads everything to the project's generic package registry, creates the
191
- GitLab Release, and publishes to PyPI with the masked, protected CI/CD variable
192
- `PYPI_TOKEN` (job skipped when the variable is absent).
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.2"
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())
@@ -2,5 +2,5 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.3.2"
5
+ __version__ = "0.4.0"
6
6
 
@@ -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``)."""