tycho-cli 0.0.1__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.
Files changed (68) hide show
  1. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/.gitignore +3 -0
  2. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/PKG-INFO +10 -10
  3. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/README.md +9 -9
  4. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/docs/harness-support.md +2 -2
  5. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_init_safety.py +1 -1
  6. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_status.py +2 -2
  7. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/__init__.py +1 -1
  8. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/cli.py +6 -3
  9. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/doctor.py +2 -1
  10. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/init.py +8 -5
  11. tycho_cli-0.0.3/tycho-target.ps1.example +19 -0
  12. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/.github/workflows/ci.yml +0 -0
  13. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/.github/workflows/release.yml +0 -0
  14. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/.tycho.toml +0 -0
  15. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/CONTRIBUTING.md +0 -0
  16. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/LICENSE +0 -0
  17. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/docs/bundler-spike.md +0 -0
  18. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/docs/hooks.md +0 -0
  19. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/docs/transcript-structures.md +0 -0
  20. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/docs/tycho-web.md +0 -0
  21. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/packaging/homebrew/tycho.rb +0 -0
  22. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/packaging/npm/bin/tycho.js +0 -0
  23. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/packaging/npm/package.json +0 -0
  24. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/pyproject.toml +0 -0
  25. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/conftest.py +0 -0
  26. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/codex_transcript_sample.jsonl +0 -0
  27. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/cursor_stop_payload.json +0 -0
  28. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/cursor_transcript_sample.jsonl +0 -0
  29. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/eval/claude_masked_red_suite.jsonl +0 -0
  30. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/eval/codex_masked_red_suite.jsonl +0 -0
  31. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/eval/cursor_masked_red_suite.jsonl +0 -0
  32. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/eval/opencode_masked_red_suite.json +0 -0
  33. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/opencode_transcript_sample.json +0 -0
  34. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/transcript_multiturn.jsonl +0 -0
  35. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/fixtures/transcript_sample.jsonl +0 -0
  36. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_count.py +0 -0
  37. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_doctor.py +0 -0
  38. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_e2e_install.py +0 -0
  39. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_eval.py +0 -0
  40. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m1.py +0 -0
  41. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m2.py +0 -0
  42. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m3.py +0 -0
  43. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m4.py +0 -0
  44. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m5.py +0 -0
  45. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_m6.py +0 -0
  46. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_relay.py +0 -0
  47. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_scope.py +0 -0
  48. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_smoke.py +0 -0
  49. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_turn_scope.py +0 -0
  50. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tests/test_update.py +0 -0
  51. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/__main__.py +0 -0
  52. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/astdiff.py +0 -0
  53. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/checks.py +0 -0
  54. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/config.py +0 -0
  55. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/events.py +0 -0
  56. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/fsstate.py +0 -0
  57. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/gitstate.py +0 -0
  58. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/harness.py +0 -0
  59. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/hook.py +0 -0
  60. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/model.py +0 -0
  61. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/opencode.py +0 -0
  62. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/report.py +0 -0
  63. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/runlog.py +0 -0
  64. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/state.py +0 -0
  65. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/status.py +0 -0
  66. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/verify.py +0 -0
  67. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/tycho/version.py +0 -0
  68. {tycho_cli-0.0.1 → tycho_cli-0.0.3}/uv.lock +0 -0
@@ -234,3 +234,6 @@ __marimo__/
234
234
  .private/
235
235
  /CLAUDE.md
236
236
  /AGENTS.md
237
+
238
+ # Local dev toggle (per-machine paths); commit tycho-target.ps1.example instead.
239
+ /tycho-target.ps1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tycho-cli
3
- Version: 0.0.1
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 status` prints that same badge for a shell prompt or tmux status line — see
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 status # the one-line status-bar indicator (what Claude Code renders)
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 status --off`) hides only Tycho's segment — the hook keeps
231
- verifying every turn; `/tycho-show` (or `tycho status --on`) brings it back. `TYCHO_STATUS=off` hides it
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 status` reads `.tycho/` off disk and prints one line, whichever agent wrote the
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 status) '$PS1 # bash / zsh prompt
283
- set -g status-right '#(cd #{pane_current_path} && tycho status)' # tmux (in tmux.conf)
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 status"
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 status --off` / `--on` and
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 status` prints that same badge for a shell prompt or tmux status line — see
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 status # the one-line status-bar indicator (what Claude Code renders)
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 status --off`) hides only Tycho's segment — the hook keeps
205
- verifying every turn; `/tycho-show` (or `tycho status --on`) brings it back. `TYCHO_STATUS=off` hides it
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 status` reads `.tycho/` off disk and prints one line, whichever agent wrote the
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 status) '$PS1 # bash / zsh prompt
257
- set -g status-right '#(cd #{pane_current_path} && tycho status)' # tmux (in tmux.conf)
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 status"
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 status --off` / `--on` and
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 status` reads `.tycho/` off disk, imports no
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 status` therefore catches
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 status"
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("status")
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("status")
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
 
@@ -6,4 +6,4 @@ trust path. Free, open source (Apache 2.0), offline, no account needed.
6
6
  """
7
7
 
8
8
  # Alpha. Bumped to 0.1.0 for the first public release (TYCHO-10).
9
- __version__ = "0.0.1"
9
+ __version__ = "0.0.3"
@@ -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
- "status": "one line for a harness status bar: is Tycho live here, and the last verdict",
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
- s = sub.add_parser("status", help=_COMMANDS["status"])
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 == "status":
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("status")
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
- return _is_ours(command, "status")
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", "status"),
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)", "status --off"),
585
- "show": ("Show the Tycho status indicator again", "status --on"),
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"),
@@ -0,0 +1,19 @@
1
+ # Toggle tycho hooks/statusline between local editable venv and global uv-tool release.
2
+ # Copy to tycho-target.ps1 (gitignored) and run from the repo root.
3
+ # Usage: .\tycho-target.ps1 (flips) | .\tycho-target.ps1 local | .\tycho-target.ps1 release
4
+ $settings = Join-Path $PSScriptRoot ".claude\settings.json"
5
+ $local = (Join-Path $PSScriptRoot ".venv\Scripts\tycho.EXE").Replace("\", "/")
6
+ $release = (Join-Path $HOME ".local\bin\tycho.exe").Replace("\", "/")
7
+
8
+ $text = Get-Content $settings -Raw
9
+ $isLocal = $text.Contains($local)
10
+ $want = $args[0]
11
+ if (-not $want) { $want = if ($isLocal) { "release" } else { "local" } }
12
+
13
+ switch ($want) {
14
+ "local" { $text = $text.Replace($release, $local) }
15
+ "release" { $text = $text.Replace($local, $release) }
16
+ default { Write-Host "arg must be 'local' or 'release'"; exit 1 }
17
+ }
18
+ [System.IO.File]::WriteAllText($settings, $text) # UTF-8 no BOM (Set-Content -Encoding utf8 adds a BOM in PS 5.1)
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