tycho-cli 0.0.2__tar.gz → 0.0.3__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.
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/PKG-INFO +10 -10
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/README.md +9 -9
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/docs/harness-support.md +2 -2
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_init_safety.py +1 -1
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_status.py +2 -2
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/__init__.py +1 -1
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/cli.py +6 -3
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/doctor.py +2 -1
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/init.py +8 -5
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/status.py +0 -4
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho-target.ps1.example +1 -1
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/.github/workflows/ci.yml +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/.github/workflows/release.yml +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/.gitignore +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/.tycho.toml +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/CONTRIBUTING.md +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/LICENSE +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/docs/bundler-spike.md +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/docs/hooks.md +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/docs/transcript-structures.md +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/docs/tycho-web.md +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/packaging/homebrew/tycho.rb +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/packaging/npm/bin/tycho.js +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/packaging/npm/package.json +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/pyproject.toml +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/conftest.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/codex_transcript_sample.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/cursor_stop_payload.json +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/cursor_transcript_sample.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/eval/claude_masked_red_suite.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/eval/codex_masked_red_suite.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/eval/cursor_masked_red_suite.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/eval/opencode_masked_red_suite.json +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/opencode_transcript_sample.json +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/transcript_multiturn.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/fixtures/transcript_sample.jsonl +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_count.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_doctor.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_e2e_install.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_eval.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m1.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m2.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m3.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m4.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m5.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_m6.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_relay.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_scope.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_smoke.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_turn_scope.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tests/test_update.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/__main__.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/astdiff.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/checks.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/config.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/events.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/fsstate.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/gitstate.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/harness.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/hook.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/model.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/opencode.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/report.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/runlog.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/state.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/verify.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/tycho/version.py +0 -0
- {tycho_cli-0.0.2 → tycho_cli-0.0.3}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tycho-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.3
|
|
4
4
|
Summary: Tycho — a free, offline, open-source local verifier that proves an AI agent actually did what it claims, from git, the filesystem, process exit codes, and the harness event stream. No account, no LLM in the trust path.
|
|
5
5
|
Project-URL: Homepage, https://swail.dev/tycho
|
|
6
6
|
Project-URL: Repository, https://github.com/swail-labs/tycho
|
|
@@ -97,7 +97,7 @@ it can't parse rather than risk it.
|
|
|
97
97
|
|
|
98
98
|
On Claude Code it also adds a status-bar badge and a set of `/tycho` slash commands, so you can see it's
|
|
99
99
|
on and drive it without leaving the session — see [In Claude Code](#in-claude-code) below. On the other
|
|
100
|
-
three harnesses, `tycho
|
|
100
|
+
three harnesses, `tycho statusline` prints that same badge for a shell prompt or tmux status line — see
|
|
101
101
|
[The badge in any shell](#the-badge-in-any-shell).
|
|
102
102
|
|
|
103
103
|
That's it. The next time an agent finishes a turn, Tycho verifies it automatically and prints the
|
|
@@ -109,7 +109,7 @@ tycho verify --harness cursor # force a harness (default: whichever ran most
|
|
|
109
109
|
tycho verify --session <path> # verify a specific transcript
|
|
110
110
|
tycho verify --claim "added rate limiting, tests pass" # echo the claim above the verdict
|
|
111
111
|
tycho help # what Tycho is, whether it's live here, and every command
|
|
112
|
-
tycho
|
|
112
|
+
tycho statusline # the one-line status-bar indicator (what Claude Code renders)
|
|
113
113
|
tycho count # how many problems Tycho has caught — in this repo, and all-time
|
|
114
114
|
tycho run -- pytest -q # run a command so its true exit code is seen (see "tycho run" below)
|
|
115
115
|
tycho scope list # show/edit which files the agent may edit (see "Scope" below)
|
|
@@ -227,8 +227,8 @@ already run a status line — a third-party badge, a shell prompt — Tycho **co
|
|
|
227
227
|
replacing it: it takes Claude Code's single `statusLine` slot, runs your existing command too, and renders
|
|
228
228
|
both (`[OTHER] [TYCHO]`). Nothing you had is lost, and `tycho uninstall` restores it.
|
|
229
229
|
|
|
230
|
-
**Toggle the badge.** `/tycho-hide` (or `tycho
|
|
231
|
-
verifying every turn; `/tycho-show` (or `tycho
|
|
230
|
+
**Toggle the badge.** `/tycho-hide` (or `tycho statusline --off`) hides only Tycho's segment — the hook keeps
|
|
231
|
+
verifying every turn; `/tycho-show` (or `tycho statusline --on`) brings it back. `TYCHO_STATUS=off` hides it
|
|
232
232
|
everywhere for a session.
|
|
233
233
|
|
|
234
234
|
## Let the agent see its own verdict — the relay
|
|
@@ -275,23 +275,23 @@ the cheapest, quietest default; turn it on when you'd rather the agent fix a bad
|
|
|
275
275
|
|
|
276
276
|
Only the *wiring* is Claude-only. `statusLine` is the one harness setting that means "run this command and
|
|
277
277
|
render its stdout", so `tycho init` has nowhere to hang the badge on Cursor, Codex, or OpenCode. The badge
|
|
278
|
-
itself doesn't care: `tycho
|
|
278
|
+
itself doesn't care: `tycho statusline` reads `.tycho/` off disk and prints one line, whichever agent wrote the
|
|
279
279
|
state. Call it from anything that renders a command:
|
|
280
280
|
|
|
281
281
|
```sh
|
|
282
|
-
PS1='$(tycho
|
|
283
|
-
set -g status-right '#(cd #{pane_current_path} && tycho
|
|
282
|
+
PS1='$(tycho statusline) '$PS1 # bash / zsh prompt
|
|
283
|
+
set -g status-right '#(cd #{pane_current_path} && tycho statusline)' # tmux (in tmux.conf)
|
|
284
284
|
```
|
|
285
285
|
|
|
286
286
|
```toml
|
|
287
287
|
[custom.tycho] # starship (in starship.toml)
|
|
288
|
-
command = "tycho
|
|
288
|
+
command = "tycho statusline"
|
|
289
289
|
when = true
|
|
290
290
|
```
|
|
291
291
|
|
|
292
292
|
No stdin needed — with no JSON on stdin it resolves the repo from the current directory, walking up to
|
|
293
293
|
find `.tycho/`, so the badge stays put as you `cd` around the tree. It prints nothing in repos where
|
|
294
|
-
Tycho isn't installed, so it stays out of every other prompt you have. `tycho
|
|
294
|
+
Tycho isn't installed, so it stays out of every other prompt you have. `tycho statusline --off` / `--on` and
|
|
295
295
|
`TYCHO_STATUS=off` work here exactly as they do in Claude Code.
|
|
296
296
|
|
|
297
297
|
## Is the hook still firing?
|
|
@@ -71,7 +71,7 @@ it can't parse rather than risk it.
|
|
|
71
71
|
|
|
72
72
|
On Claude Code it also adds a status-bar badge and a set of `/tycho` slash commands, so you can see it's
|
|
73
73
|
on and drive it without leaving the session — see [In Claude Code](#in-claude-code) below. On the other
|
|
74
|
-
three harnesses, `tycho
|
|
74
|
+
three harnesses, `tycho statusline` prints that same badge for a shell prompt or tmux status line — see
|
|
75
75
|
[The badge in any shell](#the-badge-in-any-shell).
|
|
76
76
|
|
|
77
77
|
That's it. The next time an agent finishes a turn, Tycho verifies it automatically and prints the
|
|
@@ -83,7 +83,7 @@ tycho verify --harness cursor # force a harness (default: whichever ran most
|
|
|
83
83
|
tycho verify --session <path> # verify a specific transcript
|
|
84
84
|
tycho verify --claim "added rate limiting, tests pass" # echo the claim above the verdict
|
|
85
85
|
tycho help # what Tycho is, whether it's live here, and every command
|
|
86
|
-
tycho
|
|
86
|
+
tycho statusline # the one-line status-bar indicator (what Claude Code renders)
|
|
87
87
|
tycho count # how many problems Tycho has caught — in this repo, and all-time
|
|
88
88
|
tycho run -- pytest -q # run a command so its true exit code is seen (see "tycho run" below)
|
|
89
89
|
tycho scope list # show/edit which files the agent may edit (see "Scope" below)
|
|
@@ -201,8 +201,8 @@ already run a status line — a third-party badge, a shell prompt — Tycho **co
|
|
|
201
201
|
replacing it: it takes Claude Code's single `statusLine` slot, runs your existing command too, and renders
|
|
202
202
|
both (`[OTHER] [TYCHO]`). Nothing you had is lost, and `tycho uninstall` restores it.
|
|
203
203
|
|
|
204
|
-
**Toggle the badge.** `/tycho-hide` (or `tycho
|
|
205
|
-
verifying every turn; `/tycho-show` (or `tycho
|
|
204
|
+
**Toggle the badge.** `/tycho-hide` (or `tycho statusline --off`) hides only Tycho's segment — the hook keeps
|
|
205
|
+
verifying every turn; `/tycho-show` (or `tycho statusline --on`) brings it back. `TYCHO_STATUS=off` hides it
|
|
206
206
|
everywhere for a session.
|
|
207
207
|
|
|
208
208
|
## Let the agent see its own verdict — the relay
|
|
@@ -249,23 +249,23 @@ the cheapest, quietest default; turn it on when you'd rather the agent fix a bad
|
|
|
249
249
|
|
|
250
250
|
Only the *wiring* is Claude-only. `statusLine` is the one harness setting that means "run this command and
|
|
251
251
|
render its stdout", so `tycho init` has nowhere to hang the badge on Cursor, Codex, or OpenCode. The badge
|
|
252
|
-
itself doesn't care: `tycho
|
|
252
|
+
itself doesn't care: `tycho statusline` reads `.tycho/` off disk and prints one line, whichever agent wrote the
|
|
253
253
|
state. Call it from anything that renders a command:
|
|
254
254
|
|
|
255
255
|
```sh
|
|
256
|
-
PS1='$(tycho
|
|
257
|
-
set -g status-right '#(cd #{pane_current_path} && tycho
|
|
256
|
+
PS1='$(tycho statusline) '$PS1 # bash / zsh prompt
|
|
257
|
+
set -g status-right '#(cd #{pane_current_path} && tycho statusline)' # tmux (in tmux.conf)
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
```toml
|
|
261
261
|
[custom.tycho] # starship (in starship.toml)
|
|
262
|
-
command = "tycho
|
|
262
|
+
command = "tycho statusline"
|
|
263
263
|
when = true
|
|
264
264
|
```
|
|
265
265
|
|
|
266
266
|
No stdin needed — with no JSON on stdin it resolves the repo from the current directory, walking up to
|
|
267
267
|
find `.tycho/`, so the badge stays put as you `cd` around the tree. It prints nothing in repos where
|
|
268
|
-
Tycho isn't installed, so it stays out of every other prompt you have. `tycho
|
|
268
|
+
Tycho isn't installed, so it stays out of every other prompt you have. `tycho statusline --off` / `--on` and
|
|
269
269
|
`TYCHO_STATUS=off` work here exactly as they do in Claude Code.
|
|
270
270
|
|
|
271
271
|
## Is the hook still firing?
|
|
@@ -140,7 +140,7 @@ PY
|
|
|
140
140
|
|
|
141
141
|
Two claims that are easy to conflate, and only the second is Claude-only (TYCHO-46):
|
|
142
142
|
|
|
143
|
-
- **The command is harness-agnostic.** `tycho
|
|
143
|
+
- **The command is harness-agnostic.** `tycho statusline` reads `.tycho/` off disk, imports no
|
|
144
144
|
engine, and falls back to the cwd when there's no JSON on stdin (`status.repo_of`) — so a
|
|
145
145
|
shell prompt, tmux, or starship renders the same badge on any of the four. Nothing below
|
|
146
146
|
applies to that path; there's no harness in it. (It walks up from the cwd for `.tycho/`,
|
|
@@ -172,7 +172,7 @@ declaration and the execution rules from the call site, both verbatim:
|
|
|
172
172
|
Two consequences worth keeping in mind:
|
|
173
173
|
|
|
174
174
|
- **Exit 0 or it's dead.** A non-zero exit makes the harness ignore stdout entirely — the
|
|
175
|
-
same class of silent nothing as a dead output field. `tycho
|
|
175
|
+
same class of silent nothing as a dead output field. `tycho statusline` therefore catches
|
|
176
176
|
everything and returns 0 with empty output, which renders as nothing.
|
|
177
177
|
- **Windows: the command runs through Git Bash**, which consumes unquoted backslashes;
|
|
178
178
|
the harness's own guidance is to write paths with forward slashes. Our commands come
|
|
@@ -143,7 +143,7 @@ def test_command_for_forward_slashes_windows_paths(monkeypatch):
|
|
|
143
143
|
|
|
144
144
|
# console-script branch (tycho.exe on PATH) is forward-slashed too
|
|
145
145
|
monkeypatch.setattr(init_mod.shutil, "which", lambda name: r"C:\Tools\tycho.exe")
|
|
146
|
-
assert init_mod.status_command() == "C:/Tools/tycho.exe
|
|
146
|
+
assert init_mod.status_command() == "C:/Tools/tycho.exe statusline"
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
# --- SessionStart hook (TYCHO-53) --------------------------------------------
|
|
@@ -310,7 +310,7 @@ def test_init_claims_the_slot_when_it_is_free(tmp_path: Path):
|
|
|
310
310
|
_install(tmp_path)
|
|
311
311
|
settings = json.loads((tmp_path / CLAUDE).read_text())
|
|
312
312
|
assert settings["statusLine"]["type"] == "command"
|
|
313
|
-
assert settings["statusLine"]["command"].endswith("
|
|
313
|
+
assert settings["statusLine"]["command"].endswith("statusline")
|
|
314
314
|
|
|
315
315
|
|
|
316
316
|
def test_init_composes_with_a_repo_level_statusline_and_restores_it(tmp_path: Path):
|
|
@@ -323,7 +323,7 @@ def test_init_composes_with_a_repo_level_statusline_and_restores_it(tmp_path: Pa
|
|
|
323
323
|
lines = init_mod.init(tmp_path, only="claude", assume_yes=True)
|
|
324
324
|
|
|
325
325
|
assert "composing with your existing status line" in "\n".join(lines)
|
|
326
|
-
assert json.loads((tmp_path / CLAUDE).read_text())["statusLine"]["command"].endswith("
|
|
326
|
+
assert json.loads((tmp_path / CLAUDE).read_text())["statusLine"]["command"].endswith("statusline")
|
|
327
327
|
wrap = state.read_statusline_wrap(tmp_path)
|
|
328
328
|
assert wrap["command"] == theirs["command"] and wrap["origin"] == "repo"
|
|
329
329
|
|
|
@@ -41,7 +41,7 @@ _COMMANDS = {
|
|
|
41
41
|
"init": "install Tycho's hook into this repo's detected harnesses",
|
|
42
42
|
"doctor": "check that Tycho's hooks are installed, current, and firing",
|
|
43
43
|
"uninstall": "remove Tycho's hooks (leaves your other hooks alone)",
|
|
44
|
-
"
|
|
44
|
+
"statusline": "one line for a harness status bar: is Tycho live here, and the last verdict",
|
|
45
45
|
"count": "how many problems Tycho has caught — in this repo, and all-time",
|
|
46
46
|
"run": "run a command so its true exit code is seen even when wrapped/piped: tycho run -- pytest",
|
|
47
47
|
"scope": "show or edit which files the agent may edit (the scope_drift allowlist)",
|
|
@@ -119,7 +119,10 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
119
119
|
action="store_true",
|
|
120
120
|
help="also delete repo-local Tycho state (.tycho/) and config (.tycho.toml)",
|
|
121
121
|
)
|
|
122
|
-
|
|
122
|
+
# `status` stays as a hidden back-compat alias: deployed statusLine entries and slash
|
|
123
|
+
# commands (/tycho-status, --off/--on) still say `status`, and this tool ships to installs
|
|
124
|
+
# that already have them (TYCHO-108).
|
|
125
|
+
s = sub.add_parser("statusline", aliases=["status"], help=_COMMANDS["statusline"])
|
|
123
126
|
toggle = s.add_mutually_exclusive_group()
|
|
124
127
|
toggle.add_argument("--off", action="store_true", help="hide the indicator in this repo (the hook keeps verifying)")
|
|
125
128
|
toggle.add_argument("--on", action="store_true", help="show the indicator again")
|
|
@@ -169,7 +172,7 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
169
172
|
return _update(skip=args.skip)
|
|
170
173
|
if args.command == "relay":
|
|
171
174
|
return _relay(Path.cwd(), on=args.on, off=args.off)
|
|
172
|
-
if args.command
|
|
175
|
+
if args.command in ("statusline", "status"):
|
|
173
176
|
from . import status
|
|
174
177
|
|
|
175
178
|
return status.main(off=args.off, on=args.on)
|
|
@@ -35,6 +35,7 @@ import time
|
|
|
35
35
|
from dataclasses import dataclass
|
|
36
36
|
from pathlib import Path
|
|
37
37
|
|
|
38
|
+
from . import __version__
|
|
38
39
|
from . import harness as harness_mod
|
|
39
40
|
from . import init as init_mod
|
|
40
41
|
from . import state
|
|
@@ -292,7 +293,7 @@ def healthy(findings: list[Finding]) -> bool:
|
|
|
292
293
|
|
|
293
294
|
|
|
294
295
|
def render(findings: list[Finding]) -> str:
|
|
295
|
-
lines = ["tycho doctor"]
|
|
296
|
+
lines = [f"tycho doctor (v{__version__})"]
|
|
296
297
|
for f in findings:
|
|
297
298
|
mark = {OK: "✓", INFO: "•", DRIFT: "⚠"}.get(f.level, "✗")
|
|
298
299
|
label = "" if f.level in (OK, INFO, DRIFT) else f"{f.level}: "
|
|
@@ -96,7 +96,7 @@ def hook_command() -> str:
|
|
|
96
96
|
|
|
97
97
|
def status_command() -> str:
|
|
98
98
|
"""Same resolution as `hook_command`, for the status bar (TYCHO-39)."""
|
|
99
|
-
return _command_for("
|
|
99
|
+
return _command_for("statusline")
|
|
100
100
|
|
|
101
101
|
|
|
102
102
|
def _command_for(subcommand: str) -> str:
|
|
@@ -150,7 +150,10 @@ def _is_tycho_hook(command: object) -> bool:
|
|
|
150
150
|
|
|
151
151
|
|
|
152
152
|
def _is_tycho_status(command: object) -> bool:
|
|
153
|
-
|
|
153
|
+
# `statusline` is canonical; `status` is the pre-TYCHO-108 name. Match both so init
|
|
154
|
+
# self-heals an old `tycho status` statusLine into `tycho statusline`, and uninstall
|
|
155
|
+
# removes it either way.
|
|
156
|
+
return _is_ours(command, "statusline") or _is_ours(command, "status")
|
|
154
157
|
|
|
155
158
|
|
|
156
159
|
def _is_tycho_session_start(command: object) -> bool:
|
|
@@ -576,13 +579,13 @@ def _install_claude(repo: Path) -> str:
|
|
|
576
579
|
# each shows up with its own description in Claude Code's `/` autocomplete (TYCHO-48).
|
|
577
580
|
# `hide`/`show` are the discoverable face of the `tycho status --off/--on` toggle (TYCHO-47).
|
|
578
581
|
_SLASH_SUBCOMMANDS = {
|
|
579
|
-
"status": ("Is Tycho live here, and its last verdict", "
|
|
582
|
+
"status": ("Is Tycho live here, and its last verdict", "statusline"),
|
|
580
583
|
"doctor": ("Full diagnostics: is Tycho installed, current, and firing?", "doctor"),
|
|
581
584
|
"verify": ("Verify the latest session and render a verdict", "verify $ARGUMENTS"),
|
|
582
585
|
"help": ("What Tycho is, whether it's live here, and every command", "help"),
|
|
583
586
|
"count": ("How many problems Tycho has caught here, and all-time", "count"),
|
|
584
|
-
"hide": ("Hide the Tycho status indicator (the hook keeps verifying)", "
|
|
585
|
-
"show": ("Show the Tycho status indicator again", "
|
|
587
|
+
"hide": ("Hide the Tycho status indicator (the hook keeps verifying)", "statusline --off"),
|
|
588
|
+
"show": ("Show the Tycho status indicator again", "statusline --on"),
|
|
586
589
|
"relay": ("Is the verdict relay on? (agent sees its verdict, works till VERIFIED)", "relay"),
|
|
587
590
|
"relay-on": ("Turn ON the verdict relay — agent sees non-VERIFIED verdicts, works till VERIFIED (bounded)", "relay --on"),
|
|
588
591
|
"relay-off": ("Turn OFF the verdict relay — verdicts stay human-only (the default)", "relay --off"),
|
|
@@ -76,13 +76,9 @@ def line(repo: Path) -> str:
|
|
|
76
76
|
return _paint(_VERDICT_COLOUR.get(verdict, _GREY), "[TYCHO]")
|
|
77
77
|
|
|
78
78
|
|
|
79
|
-
_PURPLE = _rgb(170, 120, 240) # TYCHO-108: temporary — remove before 0.1.0
|
|
80
|
-
|
|
81
|
-
|
|
82
79
|
def _paint(colour: str, text: str) -> str:
|
|
83
80
|
if os.environ.get("NO_COLOR"):
|
|
84
81
|
return text
|
|
85
|
-
colour = _PURPLE # ponytail: TYCHO-108 temporary override — always purple, to make the 0.0.2 update visible
|
|
86
82
|
return f"{colour}{text}{_RESET}"
|
|
87
83
|
|
|
88
84
|
|
|
@@ -15,5 +15,5 @@ switch ($want) {
|
|
|
15
15
|
"release" { $text = $text.Replace($local, $release) }
|
|
16
16
|
default { Write-Host "arg must be 'local' or 'release'"; exit 1 }
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
[System.IO.File]::WriteAllText($settings, $text) # UTF-8 no BOM (Set-Content -Encoding utf8 adds a BOM in PS 5.1)
|
|
19
19
|
Write-Host "tycho -> $want"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|