loghop 0.1.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 (201) hide show
  1. loghop-0.1.0/LICENSE +21 -0
  2. loghop-0.1.0/NOTICE.md +45 -0
  3. loghop-0.1.0/PKG-INFO +379 -0
  4. loghop-0.1.0/README.md +338 -0
  5. loghop-0.1.0/pyproject.toml +98 -0
  6. loghop-0.1.0/setup.cfg +4 -0
  7. loghop-0.1.0/src/loghop/__init__.py +3 -0
  8. loghop-0.1.0/src/loghop/__main__.py +4 -0
  9. loghop-0.1.0/src/loghop/autocapture.py +351 -0
  10. loghop-0.1.0/src/loghop/cli.py +232 -0
  11. loghop-0.1.0/src/loghop/cli_commands/__init__.py +0 -0
  12. loghop-0.1.0/src/loghop/cli_commands/_admin_completion.py +84 -0
  13. loghop-0.1.0/src/loghop/cli_commands/_admin_doctor.py +301 -0
  14. loghop-0.1.0/src/loghop/cli_commands/_admin_init.py +326 -0
  15. loghop-0.1.0/src/loghop/cli_commands/_admin_providers.py +24 -0
  16. loghop-0.1.0/src/loghop/cli_commands/_admin_uninstall.py +98 -0
  17. loghop-0.1.0/src/loghop/cli_commands/_dashboard_no_args.py +56 -0
  18. loghop-0.1.0/src/loghop/cli_commands/_handoff_launch.py +235 -0
  19. loghop-0.1.0/src/loghop/cli_commands/_helpers.py +269 -0
  20. loghop-0.1.0/src/loghop/cli_commands/_install_ui.py +121 -0
  21. loghop-0.1.0/src/loghop/cli_commands/_runner.py +312 -0
  22. loghop-0.1.0/src/loghop/cli_commands/admin.py +31 -0
  23. loghop-0.1.0/src/loghop/cli_commands/annotate.py +121 -0
  24. loghop-0.1.0/src/loghop/cli_commands/backup.py +152 -0
  25. loghop-0.1.0/src/loghop/cli_commands/dashboard.py +214 -0
  26. loghop-0.1.0/src/loghop/cli_commands/goal.py +36 -0
  27. loghop-0.1.0/src/loghop/cli_commands/handoff.py +115 -0
  28. loghop-0.1.0/src/loghop/cli_commands/health.py +122 -0
  29. loghop-0.1.0/src/loghop/cli_commands/hook.py +353 -0
  30. loghop-0.1.0/src/loghop/cli_commands/install.py +163 -0
  31. loghop-0.1.0/src/loghop/cli_commands/journal.py +135 -0
  32. loghop-0.1.0/src/loghop/cli_commands/metrics.py +89 -0
  33. loghop-0.1.0/src/loghop/cli_commands/migrate.py +107 -0
  34. loghop-0.1.0/src/loghop/cli_commands/resume.py +8 -0
  35. loghop-0.1.0/src/loghop/cli_commands/run.py +8 -0
  36. loghop-0.1.0/src/loghop/cli_commands/sessions.py +216 -0
  37. loghop-0.1.0/src/loghop/cli_commands/status.py +60 -0
  38. loghop-0.1.0/src/loghop/cli_commands/timeline.py +96 -0
  39. loghop-0.1.0/src/loghop/cli_commands/topics.py +96 -0
  40. loghop-0.1.0/src/loghop/cli_commands/tui.py +31 -0
  41. loghop-0.1.0/src/loghop/cli_commands/wrap.py +206 -0
  42. loghop-0.1.0/src/loghop/cli_parser.py +680 -0
  43. loghop-0.1.0/src/loghop/env.py +61 -0
  44. loghop-0.1.0/src/loghop/errors.py +60 -0
  45. loghop-0.1.0/src/loghop/gittools.py +288 -0
  46. loghop-0.1.0/src/loghop/install/__init__.py +76 -0
  47. loghop-0.1.0/src/loghop/install/_alias.py +116 -0
  48. loghop-0.1.0/src/loghop/install/_config.py +227 -0
  49. loghop-0.1.0/src/loghop/install/_hooks.py +284 -0
  50. loghop-0.1.0/src/loghop/install/_migrations.py +155 -0
  51. loghop-0.1.0/src/loghop/install/_prompt.py +272 -0
  52. loghop-0.1.0/src/loghop/install/_shim.py +221 -0
  53. loghop-0.1.0/src/loghop/install/_types.py +70 -0
  54. loghop-0.1.0/src/loghop/logging.py +131 -0
  55. loghop-0.1.0/src/loghop/providers.py +357 -0
  56. loghop-0.1.0/src/loghop/py.typed +0 -0
  57. loghop-0.1.0/src/loghop/reconcile.py +155 -0
  58. loghop-0.1.0/src/loghop/redact.py +229 -0
  59. loghop-0.1.0/src/loghop/resilience.py +102 -0
  60. loghop-0.1.0/src/loghop/session_lifecycle.py +219 -0
  61. loghop-0.1.0/src/loghop/store/__init__.py +98 -0
  62. loghop-0.1.0/src/loghop/store/_config.py +92 -0
  63. loghop-0.1.0/src/loghop/store/_constants.py +101 -0
  64. loghop-0.1.0/src/loghop/store/_frontmatter.py +127 -0
  65. loghop-0.1.0/src/loghop/store/_handoff.py +209 -0
  66. loghop-0.1.0/src/loghop/store/_index.py +107 -0
  67. loghop-0.1.0/src/loghop/store/_integrity.py +137 -0
  68. loghop-0.1.0/src/loghop/store/_io.py +221 -0
  69. loghop-0.1.0/src/loghop/store/_models.py +89 -0
  70. loghop-0.1.0/src/loghop/store/_project_init.py +94 -0
  71. loghop-0.1.0/src/loghop/store/_redact.py +3 -0
  72. loghop-0.1.0/src/loghop/store/_registry.py +302 -0
  73. loghop-0.1.0/src/loghop/store/_render.py +336 -0
  74. loghop-0.1.0/src/loghop/store/_security.py +97 -0
  75. loghop-0.1.0/src/loghop/store/_session.py +539 -0
  76. loghop-0.1.0/src/loghop/store/_side_effects.py +51 -0
  77. loghop-0.1.0/src/loghop/store/_timeline.py +283 -0
  78. loghop-0.1.0/src/loghop/store/_topic.py +286 -0
  79. loghop-0.1.0/src/loghop/terminal.py +376 -0
  80. loghop-0.1.0/src/loghop/transcripts/__init__.py +17 -0
  81. loghop-0.1.0/src/loghop/transcripts/_base.py +168 -0
  82. loghop-0.1.0/src/loghop/transcripts/_claude.py +162 -0
  83. loghop-0.1.0/src/loghop/transcripts/_codex.py +239 -0
  84. loghop-0.1.0/src/loghop/transcripts/_drift.py +85 -0
  85. loghop-0.1.0/src/loghop/transcripts/_loghop_block.py +115 -0
  86. loghop-0.1.0/src/loghop/tui/__init__.py +1 -0
  87. loghop-0.1.0/src/loghop/tui/app.py +154 -0
  88. loghop-0.1.0/src/loghop/tui/commands.py +284 -0
  89. loghop-0.1.0/src/loghop/tui/format.py +87 -0
  90. loghop-0.1.0/src/loghop/tui/i18n.py +573 -0
  91. loghop-0.1.0/src/loghop/tui/launcher.py +238 -0
  92. loghop-0.1.0/src/loghop/tui/models.py +78 -0
  93. loghop-0.1.0/src/loghop/tui/screens/__init__.py +0 -0
  94. loghop-0.1.0/src/loghop/tui/screens/_home_vm.py +95 -0
  95. loghop-0.1.0/src/loghop/tui/screens/_list_shared.py +182 -0
  96. loghop-0.1.0/src/loghop/tui/screens/_project_vm.py +241 -0
  97. loghop-0.1.0/src/loghop/tui/screens/_screen_state.py +36 -0
  98. loghop-0.1.0/src/loghop/tui/screens/add_folder.py +499 -0
  99. loghop-0.1.0/src/loghop/tui/screens/confirm.py +98 -0
  100. loghop-0.1.0/src/loghop/tui/screens/help.py +129 -0
  101. loghop-0.1.0/src/loghop/tui/screens/home.py +758 -0
  102. loghop-0.1.0/src/loghop/tui/screens/project.py +1317 -0
  103. loghop-0.1.0/src/loghop/tui/services.py +299 -0
  104. loghop-0.1.0/src/loghop/tui/strings.py +14 -0
  105. loghop-0.1.0/src/loghop/tui/styles/loghop.tcss +632 -0
  106. loghop-0.1.0/src/loghop/tui/themes.py +393 -0
  107. loghop-0.1.0/src/loghop/tui/undo.py +29 -0
  108. loghop-0.1.0/src/loghop/tui/widgets/__init__.py +0 -0
  109. loghop-0.1.0/src/loghop/tui/widgets/badge.py +114 -0
  110. loghop-0.1.0/src/loghop/tui/widgets/chrome.py +89 -0
  111. loghop-0.1.0/src/loghop/tui/widgets/filter_chips.py +72 -0
  112. loghop-0.1.0/src/loghop/tui/widgets/glyph.py +45 -0
  113. loghop-0.1.0/src/loghop/tui/widgets/preview_pane.py +164 -0
  114. loghop-0.1.0/src/loghop.egg-info/PKG-INFO +379 -0
  115. loghop-0.1.0/src/loghop.egg-info/SOURCES.txt +199 -0
  116. loghop-0.1.0/src/loghop.egg-info/dependency_links.txt +1 -0
  117. loghop-0.1.0/src/loghop.egg-info/entry_points.txt +2 -0
  118. loghop-0.1.0/src/loghop.egg-info/requires.txt +19 -0
  119. loghop-0.1.0/src/loghop.egg-info/top_level.txt +1 -0
  120. loghop-0.1.0/tests/test_add_folder.py +424 -0
  121. loghop-0.1.0/tests/test_admin.py +262 -0
  122. loghop-0.1.0/tests/test_admin_uninstall.py +232 -0
  123. loghop-0.1.0/tests/test_annotate.py +125 -0
  124. loghop-0.1.0/tests/test_annotate_sessions.py +263 -0
  125. loghop-0.1.0/tests/test_audit_fixes.py +237 -0
  126. loghop-0.1.0/tests/test_autocapture.py +592 -0
  127. loghop-0.1.0/tests/test_autocapture_block_fastpath.py +115 -0
  128. loghop-0.1.0/tests/test_cli.py +871 -0
  129. loghop-0.1.0/tests/test_cli_and_tui_utils.py +375 -0
  130. loghop-0.1.0/tests/test_cli_error_paths.py +136 -0
  131. loghop-0.1.0/tests/test_cli_parser.py +343 -0
  132. loghop-0.1.0/tests/test_confirm_modal.py +192 -0
  133. loghop-0.1.0/tests/test_dashboard.py +80 -0
  134. loghop-0.1.0/tests/test_dashboard_no_args.py +80 -0
  135. loghop-0.1.0/tests/test_dashboard_projects.py +183 -0
  136. loghop-0.1.0/tests/test_drift.py +162 -0
  137. loghop-0.1.0/tests/test_e2e_user_flow_script.py +21 -0
  138. loghop-0.1.0/tests/test_enhancements.py +214 -0
  139. loghop-0.1.0/tests/test_frontmatter.py +230 -0
  140. loghop-0.1.0/tests/test_gittools.py +78 -0
  141. loghop-0.1.0/tests/test_gittools_mocks.py +326 -0
  142. loghop-0.1.0/tests/test_goal.py +94 -0
  143. loghop-0.1.0/tests/test_handoff.py +159 -0
  144. loghop-0.1.0/tests/test_handoff_launch.py +189 -0
  145. loghop-0.1.0/tests/test_handoff_store.py +284 -0
  146. loghop-0.1.0/tests/test_home_screen.py +654 -0
  147. loghop-0.1.0/tests/test_home_vm.py +98 -0
  148. loghop-0.1.0/tests/test_hook.py +291 -0
  149. loghop-0.1.0/tests/test_install.py +189 -0
  150. loghop-0.1.0/tests/test_install_cli.py +96 -0
  151. loghop-0.1.0/tests/test_install_features.py +1084 -0
  152. loghop-0.1.0/tests/test_install_units.py +428 -0
  153. loghop-0.1.0/tests/test_integrity_key.py +69 -0
  154. loghop-0.1.0/tests/test_journal.py +75 -0
  155. loghop-0.1.0/tests/test_launcher.py +324 -0
  156. loghop-0.1.0/tests/test_launcher_safety.py +62 -0
  157. loghop-0.1.0/tests/test_list_shared.py +135 -0
  158. loghop-0.1.0/tests/test_logging.py +246 -0
  159. loghop-0.1.0/tests/test_loghop_block.py +154 -0
  160. loghop-0.1.0/tests/test_migrations.py +171 -0
  161. loghop-0.1.0/tests/test_operational_readiness.py +187 -0
  162. loghop-0.1.0/tests/test_project_screen.py +1060 -0
  163. loghop-0.1.0/tests/test_provider_contracts.py +56 -0
  164. loghop-0.1.0/tests/test_providers_cli.py +49 -0
  165. loghop-0.1.0/tests/test_providers_unit.py +566 -0
  166. loghop-0.1.0/tests/test_reconcile.py +236 -0
  167. loghop-0.1.0/tests/test_redaction_expanded.py +295 -0
  168. loghop-0.1.0/tests/test_registry.py +176 -0
  169. loghop-0.1.0/tests/test_registry_extra.py +286 -0
  170. loghop-0.1.0/tests/test_release_hygiene.py +64 -0
  171. loghop-0.1.0/tests/test_remaining_hardening.py +317 -0
  172. loghop-0.1.0/tests/test_render.py +566 -0
  173. loghop-0.1.0/tests/test_resume_enrichment.py +246 -0
  174. loghop-0.1.0/tests/test_runner_error_paths.py +325 -0
  175. loghop-0.1.0/tests/test_security.py +136 -0
  176. loghop-0.1.0/tests/test_session_index.py +154 -0
  177. loghop-0.1.0/tests/test_session_index_bug.py +26 -0
  178. loghop-0.1.0/tests/test_session_index_extended.py +23 -0
  179. loghop-0.1.0/tests/test_session_lifecycle.py +263 -0
  180. loghop-0.1.0/tests/test_session_lifecycle_safety.py +168 -0
  181. loghop-0.1.0/tests/test_session_store_edge_cases.py +295 -0
  182. loghop-0.1.0/tests/test_sessions.py +182 -0
  183. loghop-0.1.0/tests/test_shim.py +135 -0
  184. loghop-0.1.0/tests/test_status.py +70 -0
  185. loghop-0.1.0/tests/test_store_io.py +608 -0
  186. loghop-0.1.0/tests/test_terminal.py +345 -0
  187. loghop-0.1.0/tests/test_theme_parity.py +178 -0
  188. loghop-0.1.0/tests/test_timeline.py +161 -0
  189. loghop-0.1.0/tests/test_topics.py +176 -0
  190. loghop-0.1.0/tests/test_transcript_drift.py +234 -0
  191. loghop-0.1.0/tests/test_transcripts.py +342 -0
  192. loghop-0.1.0/tests/test_transcripts_parsing.py +395 -0
  193. loghop-0.1.0/tests/test_tui_app.py +774 -0
  194. loghop-0.1.0/tests/test_tui_preferences.py +31 -0
  195. loghop-0.1.0/tests/test_tui_screen_state.py +45 -0
  196. loghop-0.1.0/tests/test_tui_services.py +203 -0
  197. loghop-0.1.0/tests/test_tui_topics.py +24 -0
  198. loghop-0.1.0/tests/test_undo.py +81 -0
  199. loghop-0.1.0/tests/test_v2_parse.py +145 -0
  200. loghop-0.1.0/tests/test_wrap_resume_journal.py +520 -0
  201. loghop-0.1.0/tests/test_zero_arg_ux.py +234 -0
loghop-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Raul
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.
loghop-0.1.0/NOTICE.md ADDED
@@ -0,0 +1,45 @@
1
+ # Third-Party Notices
2
+
3
+ loghop includes the following third-party components.
4
+
5
+ ## Direct Dependencies
6
+
7
+ | Package | License | Version Constraint |
8
+ |---------|---------|-------------------|
9
+ | [rich](https://github.com/Textualize/rich) | MIT | >=14,<15 |
10
+ | [tomli-w](https://github.com/hukkin/tomli-w) | Apache 2.0 / MIT | >=1.0.0,<2 |
11
+ | [pyyaml](https://github.com/yaml/pyyaml) | MIT | >=6.0.1,<7 |
12
+
13
+ ## Optional Dependencies
14
+
15
+ | Package | License | Version Constraint |
16
+ |---------|---------|-------------------|
17
+ | [textual](https://github.com/Textualize/textual) | MIT | >=2,<3 (for TUI support) |
18
+
19
+ ## Development Dependencies
20
+
21
+ | Package | License | Purpose |
22
+ |---------|---------|---------|
23
+ | pytest | MIT | Testing |
24
+ | pytest-cov | MIT | Coverage |
25
+ | ruff | MIT | Linting |
26
+ | mypy | MIT | Type checking |
27
+ | bandit | Apache 2.0 | Security scanning |
28
+ | pre-commit | MIT | Git hooks |
29
+ | build | MIT | Packaging |
30
+ | twine | Apache 2.0 | Package publishing |
31
+ | pip-audit | Apache 2.0 | Dependency audit |
32
+ | anyio | MIT | Asynchronous testing |
33
+ | types-pyyaml | Apache 2.0 | Type stubs for PyYAML |
34
+ | vulture | MIT | Dead code analysis |
35
+
36
+ ## Full License Texts
37
+
38
+ The MIT License and Apache 2.0 License texts are available at:
39
+
40
+ - MIT: https://opensource.org/licenses/MIT
41
+ - Apache 2.0: https://www.apache.org/licenses/LICENSE-2.0
42
+
43
+ ---
44
+
45
+ *This notice was generated automatically. Last updated: 2026-05-22*
loghop-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,379 @@
1
+ Metadata-Version: 2.4
2
+ Name: loghop
3
+ Version: 0.1.0
4
+ Summary: Switch AI coding assistants without starting over
5
+ Author-email: elruleh <elruleh@users.noreply.github.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/elruleh/loghop
8
+ Project-URL: Repository, https://github.com/elruleh/loghop
9
+ Project-URL: Issues, https://github.com/elruleh/loghop/issues
10
+ Project-URL: Changelog, https://github.com/elruleh/loghop/blob/main/CHANGELOG.md
11
+ Keywords: cli,git,handoff,codex,claude
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Software Development :: Version Control :: Git
19
+ Requires-Python: >=3.12
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ License-File: NOTICE.md
23
+ Requires-Dist: rich<15,>=14
24
+ Requires-Dist: tomli-w<2,>=1.0.0
25
+ Requires-Dist: pyyaml<7,>=6.0.1
26
+ Provides-Extra: tui
27
+ Requires-Dist: textual<3,>=2; extra == "tui"
28
+ Provides-Extra: dev
29
+ Requires-Dist: build>=1.2; extra == "dev"
30
+ Requires-Dist: pytest>=8; extra == "dev"
31
+ Requires-Dist: pytest-cov>=5; extra == "dev"
32
+ Requires-Dist: ruff>=0.6; extra == "dev"
33
+ Requires-Dist: mypy>=1.11; extra == "dev"
34
+ Requires-Dist: types-pyyaml>=6.0.12.20260408; extra == "dev"
35
+ Requires-Dist: bandit[toml]>=1.7; extra == "dev"
36
+ Requires-Dist: pip-audit>=2.6; extra == "dev"
37
+ Requires-Dist: pre-commit>=3.7; extra == "dev"
38
+ Requires-Dist: twine>=5; extra == "dev"
39
+ Requires-Dist: anyio>=4.13.0; extra == "dev"
40
+ Dynamic: license-file
41
+
42
+ <p align="center">
43
+ <a href="https://github.com/elruleh/loghop">
44
+ <img src="docs/img/logo-banner-a.svg" alt="loghop" width="500">
45
+ </a>
46
+ </p>
47
+
48
+ <p align="center">
49
+ <em>Switch AI coding assistants without starting over</em>
50
+ </p>
51
+
52
+ <p align="center">
53
+ <a href="https://pypi.org/project/loghop">
54
+ <img src="https://img.shields.io/pypi/v/loghop?color=%2334D058&label=pypi%20package" alt="Package version">
55
+ </a>
56
+ <a href="https://pypi.org/project/loghop">
57
+ <img src="https://img.shields.io/pypi/pyversions/loghop.svg?color=%2334D058" alt="Supported Python versions">
58
+ </a>
59
+ <a href="https://github.com/elruleh/loghop/actions?query=workflow%3ACI">
60
+ <img src="https://github.com/elruleh/loghop/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI">
61
+ </a>
62
+ <a href="https://opensource.org/licenses/MIT">
63
+ <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT">
64
+ </a>
65
+ <a href="https://pypi.org/project/loghop/">
66
+ <img src="https://img.shields.io/pypi/dm/loghop?color=%230A7EBF" alt="Downloads">
67
+ </a>
68
+ </p>
69
+
70
+ <p align="center">
71
+ <a href="#install">Install</a> ·
72
+ <a href="#quick-start">Quick start</a> ·
73
+ <a href="#commands">Commands</a> ·
74
+ <a href="#how-it-works">How it works</a> ·
75
+ <a href="#terminal-ui">Terminal UI</a> ·
76
+ <a href="#security">Security</a> ·
77
+ <a href="#contributing">Contributing</a>
78
+ </p>
79
+
80
+ ---
81
+
82
+ Use **Claude Code** for a while. Switch to **Codex** later. Pick up where you left off.
83
+
84
+ loghop captures every session from your AI coding agents, builds a shared timeline,
85
+ and writes handoff context so the next run — even with a different provider — resumes
86
+ cleanly. No lost decisions, no repeated work, no copy-pasting summaries between terminals.
87
+
88
+ ```text
89
+ ┌─────────────────────────────────────────────────────────────────────────────┐
90
+ │ │
91
+ │ 🤖 Session 1: Claude Code │
92
+ │ $ loghop run │
93
+ │ ┌──────────────────────────────────────────────────────────────┐ │
94
+ │ │ Working on task: "Setup Database schema" │ │
95
+ │ │ [Session complete - Autocapturing...] │ │
96
+ │ └──────────────────────────────┬───────────────────────────────┘ │
97
+ │ │ │
98
+ │ ▼ │
99
+ │ 📦 Unified Timeline (.loghop/) │
100
+ │ S-001.md: Claude Code session (Setup DB) │
101
+ │ H-001.md: Next steps (Add migrations & seeding) │
102
+ │ │ │
103
+ │ ▼ │
104
+ │ 🧠 Session 2: Codex (OpenAI) │
105
+ │ $ loghop run --provider codex │
106
+ │ ┌──────────────────────────────────────────────────────────────┐ │
107
+ │ │ Handoff loaded: Resuming from Session 1 (Setup DB) │ │
108
+ │ │ Current Goal: "Add migrations & seeding" │ │
109
+ │ └──────────────────────────────────────────────────────────────┘ │
110
+ │ │
111
+ └─────────────────────────────────────────────────────────────────────────────┘
112
+ ```
113
+
114
+ <p align="center">
115
+ <img src="docs/img/loghop-tui.svg" alt="loghop terminal UI" width="100%">
116
+ </p>
117
+
118
+ ## Key features
119
+
120
+ - **Automatic session capture** — reads native transcripts from Claude Code and Codex, redacts secrets, stores them locally
121
+ - **Seamless handoffs** — builds context packets so the next provider knows what happened before
122
+ - **Shared timeline** — every session across every provider, in one `timeline.jsonl`
123
+ - **Terminal UI** — browse projects, sessions, and handoffs with Textual (4 built-in themes)
124
+ - **Zero-config providers** — Claude and Codex are auto-detected from `PATH`
125
+ - **Security-first** — all files `0600`, atomic writes, regex redaction of API keys/tokens/JWTs
126
+
127
+ ## Install
128
+
129
+ Python 3.12+, Git, Linux/macOS/Windows.
130
+
131
+ ```bash
132
+ pipx install loghop
133
+ # or
134
+ uv tool install loghop
135
+ ```
136
+
137
+ For the terminal UI (pulls in [Textual](https://github.com/Textualize/textual)):
138
+
139
+ ```bash
140
+ pipx install 'loghop[tui]'
141
+ ```
142
+
143
+ ## Quick start
144
+
145
+ ```bash
146
+ # Inside any Git repo:
147
+ loghop init # one-time setup (hooks, shim, prompt — asks once)
148
+ loghop run # start or resume a session
149
+ loghop goal "Ship auth" # set a goal so the next run stays focused
150
+ ```
151
+
152
+ That's it. Every `loghop run` now:
153
+
154
+ 1. Builds a handoff from the project's timeline
155
+ 2. Launches the provider (Claude or Codex)
156
+ 3. Captures the transcript when it finishes
157
+ 4. Appends the session to the shared timeline
158
+
159
+ ## Commands
160
+
161
+ ```
162
+ loghop init set up in the current repo
163
+ loghop run [<project>] [--provider ...] start or resume a session
164
+ loghop goal "<text>" set a default project goal
165
+ loghop sessions browse recorded provider runs
166
+ loghop topics group related sessions by work item
167
+ loghop timeline inspect shared work by day/provider
168
+ loghop projects list registered projects
169
+ loghop projects remove|purge unregister or purge a project
170
+ loghop doctor [--fix] check or repair install state
171
+ loghop health run project health checks
172
+ loghop metrics [--format <format>] export project metrics (summary, prometheus, json, yaml)
173
+ loghop backup create|restore backup or restore local loghop data
174
+ loghop migrate [--dry-run] migrate local metadata schema
175
+ loghop tui open the terminal UI
176
+ ```
177
+
178
+ `--provider` is optional. If omitted, loghop picks the last-used provider for the
179
+ project — or the first one on `PATH`.
180
+
181
+ <details>
182
+ <summary>Full command reference</summary>
183
+
184
+ ```bash
185
+ loghop install first-time global install
186
+ loghop uninstall [--purge] [-y] remove loghop artifacts
187
+ loghop install-aliases install shell aliases in profiles
188
+ loghop uninstall-aliases uninstall shell aliases from profiles
189
+ loghop completion {bash,zsh,fish} shell tab-completion
190
+ loghop providers list available providers
191
+
192
+ loghop handoff build|list|show manage handoff documents
193
+ loghop resume [<project>] [--provider ...] resume a previous session/topic
194
+ loghop topics list|show|switch|close|rename manage work topics
195
+ loghop sessions show|annotate|reconcile inspect and fix sessions
196
+ loghop projects show|remove|purge|cleanup manage the project registry
197
+ loghop wrap {codex,claude} [provider args] transparent provider wrapper
198
+ loghop journal [--since 7d] [--all] session journal
199
+ loghop timeline [--since 12h] [--provider] timeline view
200
+ loghop status project status overview
201
+ loghop health production-style health checks
202
+ loghop metrics [--format <format>] export project metrics (summary, prometheus, json, yaml)
203
+ loghop backup create|restore backup or restore local loghop data
204
+ loghop migrate [--dry-run] migrate local metadata schema
205
+ ```
206
+
207
+ Global flags: `--json`, `--plain`, `--quiet`, `--verbose`, `--version`, `--global`.
208
+
209
+ </details>
210
+
211
+ ## How it works
212
+
213
+ ```
214
+ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
215
+ │ loghop run │────▶│ Provider │────▶│ Capture │
216
+ │ build handoff│ │ Claude/Codex │ │ transcript │
217
+ └─────────────┘ └─────────────┘ └──────┬──────┘
218
+
219
+ ┌─────────────────────▼──────────────────────┐
220
+ │ .loghop/ │
221
+ │ timeline.jsonl ← shared across providers │
222
+ │ sessions/S-*.md ← redacted metadata │
223
+ │ handoffs/H-*.md ← context for next run │
224
+ └────────────────────────────────────────────┘
225
+ ```
226
+
227
+ After each run, loghop reads the provider's native transcript
228
+ (`~/.claude/projects/...` for Claude, `~/.codex/sessions/...` for Codex),
229
+ redacts secrets, and stores it under `.loghop/sessions/`. The next `loghop run`
230
+ builds a handoff from the timeline so the provider gets full context.
231
+
232
+ ### Integration layers
233
+
234
+ `loghop init` orchestrates optional integrations. Each answer is stored in
235
+ `~/.loghop/config.toml`. Re-running `init` is safe; installers are idempotent.
236
+
237
+ 1. **Claude hooks** — merges `SessionStart` and `SessionEnd` commands into
238
+ `~/.claude/settings.json`, preserving existing settings.
239
+ 2. **Codex shim** — writes a managed executable in `~/.local/bin/codex` that
240
+ delegates to `loghop wrap codex`. Refuses to overwrite non-loghop files.
241
+ 3. **Prompt block** — writes `~/.loghop/loghop-prompt.md` and includes it from
242
+ Codex `AGENTS.md` and Claude `CLAUDE.md`. Asks providers to emit a structured
243
+ `loghop` block with summary, decisions, and todos.
244
+ 4. **Fast-path parser** — when a captured transcript contains the fenced `loghop`
245
+ block, autocapture trusts it for metadata before falling back to heuristics.
246
+
247
+ ### Transparent capture
248
+
249
+ Add a shell alias so direct `claude`/`codex` calls go through loghop in
250
+ initialized repos. Outside a repo, the wrapper passes through to the real binary.
251
+
252
+ You can automatically install or remove these aliases in your shell profile configuration files (`~/.bashrc`, `~/.zshrc`, `~/.config/fish/config.fish`) using:
253
+
254
+ ```bash
255
+ loghop install-aliases # install the alias block
256
+ loghop uninstall-aliases # remove the alias block
257
+ ```
258
+
259
+ Or configure it manually:
260
+
261
+ ```bash
262
+ alias claude='loghop wrap claude'
263
+ alias codex='loghop wrap codex'
264
+ ```
265
+
266
+ ### Cross-project usage
267
+
268
+ ```bash
269
+ loghop run my-project # cd into registered project, then resume
270
+ loghop journal --since 7d # last week of sessions in current repo
271
+ loghop journal --all --since 30d # last month across all projects
272
+ ```
273
+
274
+ ## Terminal UI
275
+
276
+ When stdout is a terminal and Textual is installed, running `loghop` (no
277
+ arguments) opens an interactive TUI. Use `loghop tui` to open it explicitly.
278
+
279
+ ```bash
280
+ pipx install 'loghop[tui]'
281
+ ```
282
+
283
+ <p align="center">
284
+ <img src="docs/img/loghop-tui.svg" alt="loghop TUI with Harbor dark theme" width="100%">
285
+ </p>
286
+
287
+ - **Home screen** — global project list and status
288
+ - **Project screen** — sessions, handoffs, and timeline for one repo
289
+ - **Command palette** — press `m` to search and run commands
290
+ - **4 themes** — Classic dark/light, Harbor dark/light
291
+
292
+ ## Storage layout
293
+
294
+ ```text
295
+ .loghop/
296
+ config.toml goal, handoff counter, session counter
297
+ handoffs/
298
+ H-001.md markdown with YAML frontmatter metadata
299
+ topics/
300
+ T-001.md work topic grouping related sessions
301
+ timeline.jsonl canonical timeline across providers
302
+ sessions/
303
+ S-001.md session metadata (goal, topic, status, summary, todos)
304
+ S-001.transcript.jsonl redacted turns from the provider transcript
305
+ .loghopignore patterns excluded from the handoff packet
306
+ loghop.md regenerated summary (goal + repo snapshot)
307
+
308
+ ~/.loghop/projects.toml global registry of all loghop projects
309
+ ~/.loghop/config.toml global init/install choices
310
+ ~/.loghop/loghop-prompt.md optional prompt include
311
+ ```
312
+
313
+ `loghop init` adds both `loghop.md` and `.loghop/` to `.gitignore`.
314
+
315
+ ## Providers
316
+
317
+ **Claude Code** and **Codex**. Auto-detected from `PATH` — no configuration
318
+ needed. Run `loghop providers` to see what's available.
319
+
320
+ ## Exit codes
321
+
322
+ | Code | Meaning |
323
+ |---|---|
324
+ | 0 | success |
325
+ | 1 | unexpected internal error |
326
+ | 2 | usage / validation error |
327
+ | 3 | timeout |
328
+ | 10 | provider run exited non-zero |
329
+ | 20 | project not initialized |
330
+
331
+ ## Security
332
+
333
+ - All files under `.loghop/` are written with mode `0o600`; directories are `0o700`.
334
+ - Atomic writes via `tempfile.mkstemp` + `os.replace` + `fsync`.
335
+ - `loghop health`, `loghop metrics`, `loghop backup`, and `loghop migrate` support operational checks, observability, recovery, and schema upgrades.
336
+ - File reads reject symlinks; `.loghop/` paths are validated before use.
337
+ - Per-project lock on handoff creation prevents duplicate IDs under concurrent runs.
338
+ - Every handoff, transcript, and `loghop.md` passes through a regex redactor that
339
+ strips API keys, bearer tokens, JWTs, and URLs with embedded credentials.
340
+ - Handoff and session artifacts include an HMAC signature over metadata and markdown body, backed by a private per-project `.loghop/integrity.key`.
341
+ - Capture survives interruption — `Ctrl+C`, rate-limit kills, and provider timeouts
342
+ all trigger a `try/finally` that sweeps partial transcripts. Sessions left as
343
+ `running` for over 1 hour are auto-finalized on the next invocation; explicit
344
+ recovery via `loghop sessions reconcile`.
345
+
346
+ ## Built with
347
+
348
+ - [Rich](https://github.com/Textualize/rich) — terminal formatting
349
+ - [Textual](https://github.com/Textualize/textual) — terminal UI framework
350
+ - [PyYAML](https://github.com/yaml/pyyaml) — frontmatter and config parsing
351
+
352
+ ## Contributing
353
+
354
+ Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development
355
+ setup, coding standards, and the release process. For documentation, see the [docs
356
+ folder](docs/).
357
+
358
+ ```bash
359
+ git clone https://github.com/elruleh/loghop.git
360
+ cd loghop
361
+ uv sync --all-extras --dev
362
+ bash scripts/release_check.sh qa
363
+ python3 scripts/e2e_user_flow.py --skip-pytest --skip-smoke
364
+ ```
365
+
366
+ ## License
367
+
368
+ [MIT](LICENSE) — use it however you like.
369
+
370
+ ## Disclaimer
371
+
372
+ Loghop is not affiliated with, endorsed by, or connected to Anthropic or OpenAI.
373
+
374
+ ---
375
+
376
+ <p align="center">
377
+ <a href="https://github.com/elruleh/loghop/issues/new/choose">Report a bug</a> ·
378
+ <a href="https://github.com/elruleh/loghop/issues/new/choose">Request a feature</a>
379
+ </p>