opentine-tui 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.
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(gh pr *)",
5
+ "Bash(pip index *)",
6
+ "Bash(curl -s https://pypi.org/pypi/opentine/json)",
7
+ "Bash(python -c \"import sys,json; d=json.load\\(sys.stdin\\); print\\('PyPI latest:', d['info']['version']\\)\")",
8
+ "Bash(git checkout *)",
9
+ "Bash(git check-ignore *)",
10
+ "Bash(git add *)",
11
+ "Bash(git commit *)",
12
+ "Bash(git push *)",
13
+ "Bash(gh run *)"
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,66 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ concurrency:
10
+ group: ci-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ env:
14
+ # opentine 0.1.1 (with the harness integration the TUI relies on) is not yet on
15
+ # PyPI; install it from source until the release lands. Drop this and rely on the
16
+ # pinned PyPI dependency once opentine>=0.1.1 is published.
17
+ OPENTINE_GIT: "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
18
+
19
+ jobs:
20
+ test:
21
+ runs-on: ${{ matrix.os }}
22
+ strategy:
23
+ matrix:
24
+ os: [ubuntu-latest, macos-latest, windows-latest]
25
+ python-version: ["3.11", "3.12", "3.13"]
26
+ fail-fast: false
27
+
28
+ steps:
29
+ - uses: actions/checkout@v5
30
+
31
+ - name: Set up Python ${{ matrix.python-version }}
32
+ uses: actions/setup-python@v5
33
+ with:
34
+ python-version: ${{ matrix.python-version }}
35
+
36
+ - name: Upgrade build tooling
37
+ run: python -m pip install --upgrade pip
38
+
39
+ - name: Install opentine from source
40
+ run: python -m pip install "${{ env.OPENTINE_GIT }}"
41
+
42
+ - name: Install opentine-tui with dev extras
43
+ run: python -m pip install -e ".[dev]"
44
+
45
+ - name: Lint with ruff
46
+ run: ruff check .
47
+
48
+ - name: Format check with ruff
49
+ run: ruff format --check .
50
+
51
+ - name: Run tests
52
+ run: pytest tests -v
53
+
54
+ - name: Build package
55
+ run: python -m build --sdist --wheel --outdir dist
56
+
57
+ - name: Check package metadata
58
+ run: twine check dist/*
59
+
60
+ - name: Upload build artifacts
61
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
62
+ uses: actions/upload-artifact@v4
63
+ with:
64
+ name: opentine-tui-dist
65
+ path: dist/opentine_tui-*
66
+ if-no-files-found: error
@@ -0,0 +1,69 @@
1
+ name: GitHub Release Artifacts
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ env:
9
+ OPENTINE_GIT: "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
10
+
11
+ jobs:
12
+ release-artifacts:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: write
16
+ id-token: write
17
+ attestations: write
18
+
19
+ steps:
20
+ - uses: actions/checkout@v5
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.13"
26
+
27
+ - name: Upgrade build tooling
28
+ run: python -m pip install --upgrade pip
29
+
30
+ - name: Install opentine from source
31
+ run: python -m pip install "${{ env.OPENTINE_GIT }}"
32
+
33
+ - name: Install opentine-tui with dev extras
34
+ run: python -m pip install -e ".[dev]"
35
+
36
+ - name: Run fast gates
37
+ run: |
38
+ ruff check .
39
+ ruff format --check .
40
+ pytest tests -q
41
+
42
+ - name: Build package
43
+ run: python -m build --sdist --wheel --outdir dist
44
+
45
+ - name: Check package metadata
46
+ run: twine check dist/*
47
+
48
+ - name: Generate SHA256SUMS
49
+ run: |
50
+ cd dist
51
+ sha256sum opentine_tui-* > SHA256SUMS
52
+
53
+ - name: Attest build provenance
54
+ uses: actions/attest-build-provenance@v4
55
+ with:
56
+ subject-path: dist/opentine_tui-*
57
+
58
+ - name: Upload workflow artifacts
59
+ uses: actions/upload-artifact@v4
60
+ with:
61
+ name: opentine-tui-release-artifacts
62
+ path: |
63
+ dist/opentine_tui-*
64
+ dist/SHA256SUMS
65
+
66
+ - name: Attach artifacts to GitHub release
67
+ env:
68
+ GH_TOKEN: ${{ github.token }}
69
+ run: gh release create "$GITHUB_REF_NAME" dist/opentine_tui-* dist/SHA256SUMS --verify-tag --generate-notes
@@ -0,0 +1,8 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ .ruff_cache/
8
+ .pytest_cache/
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ All notable changes to opentine-tui are documented here.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-06-25
9
+
10
+ First public release.
11
+
12
+ ### Added
13
+ - Three-panel Textual dashboard (runs / steps / details) for `.tine` run artifacts.
14
+ - Run list that keeps corrupt `.tine` files visible with their load or integrity error.
15
+ - Step DAG view with per-step cost and duration, and a detail panel for run and step
16
+ metadata, inputs, outputs, and errors.
17
+ - Integrity verification (`v`) backed by `opentine`'s SHA-256 manifest digest.
18
+ - Write actions with confirmation modals: fork (`f`), cache replay (`c`),
19
+ diff (`d`), and scoped resume (`x`).
20
+ - External harness launches: run (`h`), fork + harness (`Ctrl+F`), and
21
+ replay + harness (`Ctrl+R`), covering the codex, claude-code, cursor, opencode,
22
+ openclaw, kimi-code, hermes, pi, and generic adapters.
23
+ - `--runs-dir` flag and `OPENTINE_RUNS_DIR` environment variable for selecting the
24
+ artifact directory.
25
+ - GitHub Actions CI (lint, format, tests, build, metadata check) across
26
+ Linux/macOS/Windows on Python 3.11–3.13, and a tag-driven release-artifacts
27
+ workflow.
28
+
29
+ ### Requirements
30
+ - Requires `opentine>=0.1.1`, the first opentine release that ships the
31
+ `opentine.harnesses` integration layer the dashboard depends on.
32
+
33
+ [0.1.0]: https://github.com/0xcircuitbreaker/opentine-tui/releases/tag/v0.1.0
@@ -0,0 +1,119 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ https://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction, and
10
+ distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by the copyright
13
+ owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all other entities
16
+ that control, are controlled by, or are under common control with that entity.
17
+ For the purposes of this definition, "control" means (i) the power, direct or
18
+ indirect, to cause the direction or management of such entity, whether by
19
+ contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
20
+ outstanding shares, or (iii) beneficial ownership of such entity.
21
+
22
+ "You" (or "Your") shall mean an individual or Legal Entity exercising
23
+ permissions granted by this License.
24
+
25
+ "Source" form shall mean the preferred form for making modifications, including
26
+ but not limited to software source code, documentation source, and configuration
27
+ files.
28
+
29
+ "Object" form shall mean any form resulting from mechanical transformation or
30
+ translation of a Source form, including but not limited to compiled object code,
31
+ generated documentation, and conversions to other media types.
32
+
33
+ "Work" shall mean the work of authorship, whether in Source or Object form,
34
+ made available under the License, as indicated by a copyright notice that is
35
+ included in or attached to the work.
36
+
37
+ "Derivative Works" shall mean any work, whether in Source or Object form, that
38
+ is based on (or derived from) the Work and for which the editorial revisions,
39
+ annotations, elaborations, or other modifications represent, as a whole, an
40
+ original work of authorship. For the purposes of this License, Derivative Works
41
+ shall not include works that remain separable from, or merely link (or bind by
42
+ name) to the interfaces of, the Work and Derivative Works thereof.
43
+
44
+ "Contribution" shall mean any work of authorship, including the original version
45
+ of the Work and any modifications or additions to that Work or Derivative Works
46
+ thereof, that is intentionally submitted to Licensor for inclusion in the Work
47
+ by the copyright owner or by an individual or Legal Entity authorized to submit
48
+ on behalf of the copyright owner. For the purposes of this definition,
49
+ "submitted" means any form of electronic, verbal, or written communication sent
50
+ to the Licensor or its representatives, including but not limited to
51
+ communication on electronic mailing lists, source code control systems, and
52
+ issue tracking systems that are managed by, or on behalf of, the Licensor for
53
+ the purpose of discussing and improving the Work, but excluding communication
54
+ that is conspicuously marked or otherwise designated in writing by the copyright
55
+ owner as "Not a Contribution."
56
+
57
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf
58
+ of whom a Contribution has been received by Licensor and subsequently
59
+ incorporated within the Work.
60
+
61
+ 2. Grant of Copyright License. Subject to the terms and conditions of this
62
+ License, each Contributor hereby grants to You a perpetual, worldwide,
63
+ non-exclusive, no-charge, royalty-free, irrevocable copyright license to
64
+ reproduce, prepare Derivative Works of, publicly display, publicly perform,
65
+ sublicense, and distribute the Work and such Derivative Works in Source or
66
+ Object form.
67
+
68
+ 3. Grant of Patent License. Subject to the terms and conditions of this License,
69
+ each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
70
+ no-charge, royalty-free, irrevocable patent license to make, have made, use,
71
+ offer to sell, sell, import, and otherwise transfer the Work.
72
+
73
+ 4. Redistribution. You may reproduce and distribute copies of the Work or
74
+ Derivative Works thereof in any medium, with or without modifications, and in
75
+ Source or Object form, provided that You meet the following conditions:
76
+
77
+ You must give any other recipients of the Work or Derivative Works a copy of
78
+ this License; and
79
+
80
+ You must cause any modified files to carry prominent notices stating that You
81
+ changed the files; and
82
+
83
+ You must retain, in the Source form of any Derivative Works that You distribute,
84
+ all copyright, patent, trademark, and attribution notices from the Source form
85
+ of the Work, excluding those notices that do not pertain to any part of the
86
+ Derivative Works; and
87
+
88
+ If the Work includes a "NOTICE" text file as part of its distribution, then any
89
+ Derivative Works that You distribute must include a readable copy of the
90
+ attribution notices contained within such NOTICE file.
91
+
92
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any
93
+ Contribution intentionally submitted for inclusion in the Work by You to the
94
+ Licensor shall be under the terms and conditions of this License, without any
95
+ additional terms or conditions.
96
+
97
+ 6. Trademarks. This License does not grant permission to use the trade names,
98
+ trademarks, service marks, or product names of the Licensor, except as required
99
+ for reasonable and customary use in describing the origin of the Work and
100
+ reproducing the content of the NOTICE file.
101
+
102
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in
103
+ writing, Licensor provides the Work on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied, including, without
105
+ limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
106
+ MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
107
+
108
+ 8. Limitation of Liability. In no event and under no legal theory, whether in
109
+ tort (including negligence), contract, or otherwise, unless required by
110
+ applicable law or agreed to in writing, shall any Contributor be liable to You
111
+ for damages, including any direct, indirect, special, incidental, or
112
+ consequential damages arising as a result of this License or out of the use or
113
+ inability to use the Work.
114
+
115
+ 9. Accepting Warranty or Additional Liability. While redistributing the Work or
116
+ Derivative Works thereof, You may choose to offer, and charge a fee for,
117
+ acceptance of support, warranty, indemnity, or other liability obligations.
118
+ However, in accepting such obligations, You may act only on Your own behalf and
119
+ on Your sole responsibility, not on behalf of any other Contributor.
@@ -0,0 +1,123 @@
1
+ Metadata-Version: 2.4
2
+ Name: opentine-tui
3
+ Version: 0.1.0
4
+ Summary: Terminal dashboard for opentine — visual management console with Textual
5
+ Project-URL: Homepage, https://opentine.com
6
+ Project-URL: Repository, https://github.com/0xcircuitbreaker/opentine-tui
7
+ Project-URL: Issues, https://github.com/0xcircuitbreaker/opentine-tui/issues
8
+ Author: opentine contributors
9
+ License-Expression: Apache-2.0
10
+ License-File: LICENSE
11
+ Keywords: agents,fork,llm,replay,run-tree,tui
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Environment :: Console :: Curses
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development :: User Interfaces
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: opentine<0.2,>=0.1.1
23
+ Requires-Dist: textual>=3.0
24
+ Provides-Extra: dev
25
+ Requires-Dist: build>=1.2; extra == 'dev'
26
+ Requires-Dist: pytest-asyncio>=1.0; extra == 'dev'
27
+ Requires-Dist: pytest>=9.0; extra == 'dev'
28
+ Requires-Dist: ruff>=0.4; extra == 'dev'
29
+ Requires-Dist: twine>=5.0; extra == 'dev'
30
+ Description-Content-Type: text/markdown
31
+
32
+ # opentine-tui
33
+
34
+ Terminal management console for [opentine](https://github.com/0xcircuitbreaker/opentine)
35
+ agent runs.
36
+
37
+ Built with [Textual](https://textual.textualize.io/).
38
+
39
+ ## Install
40
+
41
+ ```bash
42
+ pip install opentine-tui
43
+ ```
44
+
45
+ Requires [`opentine`](https://github.com/0xcircuitbreaker/opentine) `>=0.1.1`, the
46
+ first release that ships the harness integration layer the dashboard uses. Until
47
+ `opentine` 0.1.1 is published to PyPI, install it from source first:
48
+
49
+ ```bash
50
+ pip install "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
51
+ pip install opentine-tui
52
+ ```
53
+
54
+ ## Usage
55
+
56
+ ```bash
57
+ tine-dashboard
58
+ opentine-tui
59
+ ```
60
+
61
+ By default the TUI reads `.tine` artifacts from `.tine_runs`. Override that with:
62
+
63
+ ```bash
64
+ tine-dashboard --runs-dir path/to/.tine_runs
65
+ OPENTINE_RUNS_DIR=path/to/.tine_runs tine-dashboard
66
+ ```
67
+
68
+ ## Layout
69
+
70
+ ```
71
+ ┌── Runs ───────┐ ┌── Steps ───────────────┐ ┌── Details ─────────┐
72
+ │ a3f8 done │ │ * think "I'll search" │ │ Run: a3f8 │
73
+ │ b7c1 fail │ │ > tool search(q="...") │ │ Model: claude │
74
+ │ c9d2 corrupt │ │ * think "The mass..." │ │ Steps: 4 │
75
+ │ │ │ + done │ │ Cost: $0.003 │
76
+ │ │ │ │ │ Duration: 12.3s │
77
+ └──────────────────┘ └──────────────────────────────┘ └─────────────────────┘
78
+ ```
79
+
80
+ Corrupt `.tine` files remain visible in the run list with their load or integrity
81
+ error in the details panel.
82
+
83
+ ## Keybindings
84
+
85
+ | Key | Action |
86
+ |---|---|
87
+ | `q` | Quit |
88
+ | `r` | Refresh run list |
89
+ | `1` | Focus runs panel |
90
+ | `2` | Focus steps panel |
91
+ | `3` | Focus details panel |
92
+ | `Enter` | View selected run |
93
+ | `v` | Verify selected `.tine` integrity |
94
+ | `f` | Fork selected run from the selected step |
95
+ | `c` | Write a cached replay from the selected step |
96
+ | `d` | Diff selected run against another run |
97
+ | `x` | Resume selected run when `manifest.resume` is true |
98
+ | `h` | Launch a new external harness run |
99
+ | `Ctrl+F` | Fork selected step and launch a harness |
100
+ | `Ctrl+R` | Replay from selected step with a harness |
101
+
102
+ Write operations and external harness launches require an explicit confirmation
103
+ modal before they run.
104
+
105
+ ## Development
106
+
107
+ ```bash
108
+ # install opentine (from source until 0.1.1 is on PyPI) and the TUI with dev extras
109
+ pip install "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
110
+ pip install -e ".[dev]"
111
+
112
+ ruff check .
113
+ ruff format --check .
114
+ pytest
115
+ ```
116
+
117
+ CI runs lint, format, the test suite, a packaging build, and a `twine` metadata
118
+ check across Linux/macOS/Windows on Python 3.11–3.13. Pushing a `v*` tag builds
119
+ signed release artifacts and attaches them to a GitHub release.
120
+
121
+ ## License
122
+
123
+ Apache 2.0
@@ -0,0 +1,92 @@
1
+ # opentine-tui
2
+
3
+ Terminal management console for [opentine](https://github.com/0xcircuitbreaker/opentine)
4
+ agent runs.
5
+
6
+ Built with [Textual](https://textual.textualize.io/).
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ pip install opentine-tui
12
+ ```
13
+
14
+ Requires [`opentine`](https://github.com/0xcircuitbreaker/opentine) `>=0.1.1`, the
15
+ first release that ships the harness integration layer the dashboard uses. Until
16
+ `opentine` 0.1.1 is published to PyPI, install it from source first:
17
+
18
+ ```bash
19
+ pip install "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
20
+ pip install opentine-tui
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```bash
26
+ tine-dashboard
27
+ opentine-tui
28
+ ```
29
+
30
+ By default the TUI reads `.tine` artifacts from `.tine_runs`. Override that with:
31
+
32
+ ```bash
33
+ tine-dashboard --runs-dir path/to/.tine_runs
34
+ OPENTINE_RUNS_DIR=path/to/.tine_runs tine-dashboard
35
+ ```
36
+
37
+ ## Layout
38
+
39
+ ```
40
+ ┌── Runs ───────┐ ┌── Steps ───────────────┐ ┌── Details ─────────┐
41
+ │ a3f8 done │ │ * think "I'll search" │ │ Run: a3f8 │
42
+ │ b7c1 fail │ │ > tool search(q="...") │ │ Model: claude │
43
+ │ c9d2 corrupt │ │ * think "The mass..." │ │ Steps: 4 │
44
+ │ │ │ + done │ │ Cost: $0.003 │
45
+ │ │ │ │ │ Duration: 12.3s │
46
+ └──────────────────┘ └──────────────────────────────┘ └─────────────────────┘
47
+ ```
48
+
49
+ Corrupt `.tine` files remain visible in the run list with their load or integrity
50
+ error in the details panel.
51
+
52
+ ## Keybindings
53
+
54
+ | Key | Action |
55
+ |---|---|
56
+ | `q` | Quit |
57
+ | `r` | Refresh run list |
58
+ | `1` | Focus runs panel |
59
+ | `2` | Focus steps panel |
60
+ | `3` | Focus details panel |
61
+ | `Enter` | View selected run |
62
+ | `v` | Verify selected `.tine` integrity |
63
+ | `f` | Fork selected run from the selected step |
64
+ | `c` | Write a cached replay from the selected step |
65
+ | `d` | Diff selected run against another run |
66
+ | `x` | Resume selected run when `manifest.resume` is true |
67
+ | `h` | Launch a new external harness run |
68
+ | `Ctrl+F` | Fork selected step and launch a harness |
69
+ | `Ctrl+R` | Replay from selected step with a harness |
70
+
71
+ Write operations and external harness launches require an explicit confirmation
72
+ modal before they run.
73
+
74
+ ## Development
75
+
76
+ ```bash
77
+ # install opentine (from source until 0.1.1 is on PyPI) and the TUI with dev extras
78
+ pip install "opentine @ git+https://github.com/0xcircuitbreaker/opentine.git@main"
79
+ pip install -e ".[dev]"
80
+
81
+ ruff check .
82
+ ruff format --check .
83
+ pytest
84
+ ```
85
+
86
+ CI runs lint, format, the test suite, a packaging build, and a `twine` metadata
87
+ check across Linux/macOS/Windows on Python 3.11–3.13. Pushing a `v*` tag builds
88
+ signed release artifacts and attaches them to a GitHub release.
89
+
90
+ ## License
91
+
92
+ Apache 2.0
@@ -0,0 +1,32 @@
1
+ """opentine-tui — Terminal dashboard for opentine agent runs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ from collections.abc import Sequence
7
+
8
+ from opentine_tui.app import OpentineTUI
9
+
10
+ BRAND = "#FF6900"
11
+
12
+
13
+ def build_parser(prog: str | None = None) -> argparse.ArgumentParser:
14
+ parser = argparse.ArgumentParser(
15
+ prog=prog,
16
+ description="Terminal management console for opentine .tine runs",
17
+ )
18
+ parser.add_argument(
19
+ "--runs-dir",
20
+ help="Directory containing .tine artifacts (default: OPENTINE_RUNS_DIR or .tine_runs)",
21
+ )
22
+ return parser
23
+
24
+
25
+ def main(argv: Sequence[str] | None = None) -> None:
26
+ args = build_parser().parse_args(argv)
27
+ app = OpentineTUI(runs_dir=args.runs_dir)
28
+ app.run()
29
+
30
+
31
+ if __name__ == "__main__":
32
+ main()