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.
- loghop-0.1.0/LICENSE +21 -0
- loghop-0.1.0/NOTICE.md +45 -0
- loghop-0.1.0/PKG-INFO +379 -0
- loghop-0.1.0/README.md +338 -0
- loghop-0.1.0/pyproject.toml +98 -0
- loghop-0.1.0/setup.cfg +4 -0
- loghop-0.1.0/src/loghop/__init__.py +3 -0
- loghop-0.1.0/src/loghop/__main__.py +4 -0
- loghop-0.1.0/src/loghop/autocapture.py +351 -0
- loghop-0.1.0/src/loghop/cli.py +232 -0
- loghop-0.1.0/src/loghop/cli_commands/__init__.py +0 -0
- loghop-0.1.0/src/loghop/cli_commands/_admin_completion.py +84 -0
- loghop-0.1.0/src/loghop/cli_commands/_admin_doctor.py +301 -0
- loghop-0.1.0/src/loghop/cli_commands/_admin_init.py +326 -0
- loghop-0.1.0/src/loghop/cli_commands/_admin_providers.py +24 -0
- loghop-0.1.0/src/loghop/cli_commands/_admin_uninstall.py +98 -0
- loghop-0.1.0/src/loghop/cli_commands/_dashboard_no_args.py +56 -0
- loghop-0.1.0/src/loghop/cli_commands/_handoff_launch.py +235 -0
- loghop-0.1.0/src/loghop/cli_commands/_helpers.py +269 -0
- loghop-0.1.0/src/loghop/cli_commands/_install_ui.py +121 -0
- loghop-0.1.0/src/loghop/cli_commands/_runner.py +312 -0
- loghop-0.1.0/src/loghop/cli_commands/admin.py +31 -0
- loghop-0.1.0/src/loghop/cli_commands/annotate.py +121 -0
- loghop-0.1.0/src/loghop/cli_commands/backup.py +152 -0
- loghop-0.1.0/src/loghop/cli_commands/dashboard.py +214 -0
- loghop-0.1.0/src/loghop/cli_commands/goal.py +36 -0
- loghop-0.1.0/src/loghop/cli_commands/handoff.py +115 -0
- loghop-0.1.0/src/loghop/cli_commands/health.py +122 -0
- loghop-0.1.0/src/loghop/cli_commands/hook.py +353 -0
- loghop-0.1.0/src/loghop/cli_commands/install.py +163 -0
- loghop-0.1.0/src/loghop/cli_commands/journal.py +135 -0
- loghop-0.1.0/src/loghop/cli_commands/metrics.py +89 -0
- loghop-0.1.0/src/loghop/cli_commands/migrate.py +107 -0
- loghop-0.1.0/src/loghop/cli_commands/resume.py +8 -0
- loghop-0.1.0/src/loghop/cli_commands/run.py +8 -0
- loghop-0.1.0/src/loghop/cli_commands/sessions.py +216 -0
- loghop-0.1.0/src/loghop/cli_commands/status.py +60 -0
- loghop-0.1.0/src/loghop/cli_commands/timeline.py +96 -0
- loghop-0.1.0/src/loghop/cli_commands/topics.py +96 -0
- loghop-0.1.0/src/loghop/cli_commands/tui.py +31 -0
- loghop-0.1.0/src/loghop/cli_commands/wrap.py +206 -0
- loghop-0.1.0/src/loghop/cli_parser.py +680 -0
- loghop-0.1.0/src/loghop/env.py +61 -0
- loghop-0.1.0/src/loghop/errors.py +60 -0
- loghop-0.1.0/src/loghop/gittools.py +288 -0
- loghop-0.1.0/src/loghop/install/__init__.py +76 -0
- loghop-0.1.0/src/loghop/install/_alias.py +116 -0
- loghop-0.1.0/src/loghop/install/_config.py +227 -0
- loghop-0.1.0/src/loghop/install/_hooks.py +284 -0
- loghop-0.1.0/src/loghop/install/_migrations.py +155 -0
- loghop-0.1.0/src/loghop/install/_prompt.py +272 -0
- loghop-0.1.0/src/loghop/install/_shim.py +221 -0
- loghop-0.1.0/src/loghop/install/_types.py +70 -0
- loghop-0.1.0/src/loghop/logging.py +131 -0
- loghop-0.1.0/src/loghop/providers.py +357 -0
- loghop-0.1.0/src/loghop/py.typed +0 -0
- loghop-0.1.0/src/loghop/reconcile.py +155 -0
- loghop-0.1.0/src/loghop/redact.py +229 -0
- loghop-0.1.0/src/loghop/resilience.py +102 -0
- loghop-0.1.0/src/loghop/session_lifecycle.py +219 -0
- loghop-0.1.0/src/loghop/store/__init__.py +98 -0
- loghop-0.1.0/src/loghop/store/_config.py +92 -0
- loghop-0.1.0/src/loghop/store/_constants.py +101 -0
- loghop-0.1.0/src/loghop/store/_frontmatter.py +127 -0
- loghop-0.1.0/src/loghop/store/_handoff.py +209 -0
- loghop-0.1.0/src/loghop/store/_index.py +107 -0
- loghop-0.1.0/src/loghop/store/_integrity.py +137 -0
- loghop-0.1.0/src/loghop/store/_io.py +221 -0
- loghop-0.1.0/src/loghop/store/_models.py +89 -0
- loghop-0.1.0/src/loghop/store/_project_init.py +94 -0
- loghop-0.1.0/src/loghop/store/_redact.py +3 -0
- loghop-0.1.0/src/loghop/store/_registry.py +302 -0
- loghop-0.1.0/src/loghop/store/_render.py +336 -0
- loghop-0.1.0/src/loghop/store/_security.py +97 -0
- loghop-0.1.0/src/loghop/store/_session.py +539 -0
- loghop-0.1.0/src/loghop/store/_side_effects.py +51 -0
- loghop-0.1.0/src/loghop/store/_timeline.py +283 -0
- loghop-0.1.0/src/loghop/store/_topic.py +286 -0
- loghop-0.1.0/src/loghop/terminal.py +376 -0
- loghop-0.1.0/src/loghop/transcripts/__init__.py +17 -0
- loghop-0.1.0/src/loghop/transcripts/_base.py +168 -0
- loghop-0.1.0/src/loghop/transcripts/_claude.py +162 -0
- loghop-0.1.0/src/loghop/transcripts/_codex.py +239 -0
- loghop-0.1.0/src/loghop/transcripts/_drift.py +85 -0
- loghop-0.1.0/src/loghop/transcripts/_loghop_block.py +115 -0
- loghop-0.1.0/src/loghop/tui/__init__.py +1 -0
- loghop-0.1.0/src/loghop/tui/app.py +154 -0
- loghop-0.1.0/src/loghop/tui/commands.py +284 -0
- loghop-0.1.0/src/loghop/tui/format.py +87 -0
- loghop-0.1.0/src/loghop/tui/i18n.py +573 -0
- loghop-0.1.0/src/loghop/tui/launcher.py +238 -0
- loghop-0.1.0/src/loghop/tui/models.py +78 -0
- loghop-0.1.0/src/loghop/tui/screens/__init__.py +0 -0
- loghop-0.1.0/src/loghop/tui/screens/_home_vm.py +95 -0
- loghop-0.1.0/src/loghop/tui/screens/_list_shared.py +182 -0
- loghop-0.1.0/src/loghop/tui/screens/_project_vm.py +241 -0
- loghop-0.1.0/src/loghop/tui/screens/_screen_state.py +36 -0
- loghop-0.1.0/src/loghop/tui/screens/add_folder.py +499 -0
- loghop-0.1.0/src/loghop/tui/screens/confirm.py +98 -0
- loghop-0.1.0/src/loghop/tui/screens/help.py +129 -0
- loghop-0.1.0/src/loghop/tui/screens/home.py +758 -0
- loghop-0.1.0/src/loghop/tui/screens/project.py +1317 -0
- loghop-0.1.0/src/loghop/tui/services.py +299 -0
- loghop-0.1.0/src/loghop/tui/strings.py +14 -0
- loghop-0.1.0/src/loghop/tui/styles/loghop.tcss +632 -0
- loghop-0.1.0/src/loghop/tui/themes.py +393 -0
- loghop-0.1.0/src/loghop/tui/undo.py +29 -0
- loghop-0.1.0/src/loghop/tui/widgets/__init__.py +0 -0
- loghop-0.1.0/src/loghop/tui/widgets/badge.py +114 -0
- loghop-0.1.0/src/loghop/tui/widgets/chrome.py +89 -0
- loghop-0.1.0/src/loghop/tui/widgets/filter_chips.py +72 -0
- loghop-0.1.0/src/loghop/tui/widgets/glyph.py +45 -0
- loghop-0.1.0/src/loghop/tui/widgets/preview_pane.py +164 -0
- loghop-0.1.0/src/loghop.egg-info/PKG-INFO +379 -0
- loghop-0.1.0/src/loghop.egg-info/SOURCES.txt +199 -0
- loghop-0.1.0/src/loghop.egg-info/dependency_links.txt +1 -0
- loghop-0.1.0/src/loghop.egg-info/entry_points.txt +2 -0
- loghop-0.1.0/src/loghop.egg-info/requires.txt +19 -0
- loghop-0.1.0/src/loghop.egg-info/top_level.txt +1 -0
- loghop-0.1.0/tests/test_add_folder.py +424 -0
- loghop-0.1.0/tests/test_admin.py +262 -0
- loghop-0.1.0/tests/test_admin_uninstall.py +232 -0
- loghop-0.1.0/tests/test_annotate.py +125 -0
- loghop-0.1.0/tests/test_annotate_sessions.py +263 -0
- loghop-0.1.0/tests/test_audit_fixes.py +237 -0
- loghop-0.1.0/tests/test_autocapture.py +592 -0
- loghop-0.1.0/tests/test_autocapture_block_fastpath.py +115 -0
- loghop-0.1.0/tests/test_cli.py +871 -0
- loghop-0.1.0/tests/test_cli_and_tui_utils.py +375 -0
- loghop-0.1.0/tests/test_cli_error_paths.py +136 -0
- loghop-0.1.0/tests/test_cli_parser.py +343 -0
- loghop-0.1.0/tests/test_confirm_modal.py +192 -0
- loghop-0.1.0/tests/test_dashboard.py +80 -0
- loghop-0.1.0/tests/test_dashboard_no_args.py +80 -0
- loghop-0.1.0/tests/test_dashboard_projects.py +183 -0
- loghop-0.1.0/tests/test_drift.py +162 -0
- loghop-0.1.0/tests/test_e2e_user_flow_script.py +21 -0
- loghop-0.1.0/tests/test_enhancements.py +214 -0
- loghop-0.1.0/tests/test_frontmatter.py +230 -0
- loghop-0.1.0/tests/test_gittools.py +78 -0
- loghop-0.1.0/tests/test_gittools_mocks.py +326 -0
- loghop-0.1.0/tests/test_goal.py +94 -0
- loghop-0.1.0/tests/test_handoff.py +159 -0
- loghop-0.1.0/tests/test_handoff_launch.py +189 -0
- loghop-0.1.0/tests/test_handoff_store.py +284 -0
- loghop-0.1.0/tests/test_home_screen.py +654 -0
- loghop-0.1.0/tests/test_home_vm.py +98 -0
- loghop-0.1.0/tests/test_hook.py +291 -0
- loghop-0.1.0/tests/test_install.py +189 -0
- loghop-0.1.0/tests/test_install_cli.py +96 -0
- loghop-0.1.0/tests/test_install_features.py +1084 -0
- loghop-0.1.0/tests/test_install_units.py +428 -0
- loghop-0.1.0/tests/test_integrity_key.py +69 -0
- loghop-0.1.0/tests/test_journal.py +75 -0
- loghop-0.1.0/tests/test_launcher.py +324 -0
- loghop-0.1.0/tests/test_launcher_safety.py +62 -0
- loghop-0.1.0/tests/test_list_shared.py +135 -0
- loghop-0.1.0/tests/test_logging.py +246 -0
- loghop-0.1.0/tests/test_loghop_block.py +154 -0
- loghop-0.1.0/tests/test_migrations.py +171 -0
- loghop-0.1.0/tests/test_operational_readiness.py +187 -0
- loghop-0.1.0/tests/test_project_screen.py +1060 -0
- loghop-0.1.0/tests/test_provider_contracts.py +56 -0
- loghop-0.1.0/tests/test_providers_cli.py +49 -0
- loghop-0.1.0/tests/test_providers_unit.py +566 -0
- loghop-0.1.0/tests/test_reconcile.py +236 -0
- loghop-0.1.0/tests/test_redaction_expanded.py +295 -0
- loghop-0.1.0/tests/test_registry.py +176 -0
- loghop-0.1.0/tests/test_registry_extra.py +286 -0
- loghop-0.1.0/tests/test_release_hygiene.py +64 -0
- loghop-0.1.0/tests/test_remaining_hardening.py +317 -0
- loghop-0.1.0/tests/test_render.py +566 -0
- loghop-0.1.0/tests/test_resume_enrichment.py +246 -0
- loghop-0.1.0/tests/test_runner_error_paths.py +325 -0
- loghop-0.1.0/tests/test_security.py +136 -0
- loghop-0.1.0/tests/test_session_index.py +154 -0
- loghop-0.1.0/tests/test_session_index_bug.py +26 -0
- loghop-0.1.0/tests/test_session_index_extended.py +23 -0
- loghop-0.1.0/tests/test_session_lifecycle.py +263 -0
- loghop-0.1.0/tests/test_session_lifecycle_safety.py +168 -0
- loghop-0.1.0/tests/test_session_store_edge_cases.py +295 -0
- loghop-0.1.0/tests/test_sessions.py +182 -0
- loghop-0.1.0/tests/test_shim.py +135 -0
- loghop-0.1.0/tests/test_status.py +70 -0
- loghop-0.1.0/tests/test_store_io.py +608 -0
- loghop-0.1.0/tests/test_terminal.py +345 -0
- loghop-0.1.0/tests/test_theme_parity.py +178 -0
- loghop-0.1.0/tests/test_timeline.py +161 -0
- loghop-0.1.0/tests/test_topics.py +176 -0
- loghop-0.1.0/tests/test_transcript_drift.py +234 -0
- loghop-0.1.0/tests/test_transcripts.py +342 -0
- loghop-0.1.0/tests/test_transcripts_parsing.py +395 -0
- loghop-0.1.0/tests/test_tui_app.py +774 -0
- loghop-0.1.0/tests/test_tui_preferences.py +31 -0
- loghop-0.1.0/tests/test_tui_screen_state.py +45 -0
- loghop-0.1.0/tests/test_tui_services.py +203 -0
- loghop-0.1.0/tests/test_tui_topics.py +24 -0
- loghop-0.1.0/tests/test_undo.py +81 -0
- loghop-0.1.0/tests/test_v2_parse.py +145 -0
- loghop-0.1.0/tests/test_wrap_resume_journal.py +520 -0
- 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>
|