Skip to content

Remove timeline --watch - #646

Merged
jeremy merged 1 commit into
mainfrom
remove-timeline-watch
Aug 22, 2026
Merged

Remove timeline --watch#646
jeremy merged 1 commit into
mainfrom
remove-timeline-watch

Conversation

@jeremy

@jeremy jeremy commented Aug 22, 2026

Copy link
Copy Markdown
Member

What

Removes basecamp timeline --watch (and its -w shorthand and --interval
companion) along with everything reachable only from it: watchModel and its
bubbletea Init/Update/View, formatEvent, watchLabel,
runTimelineWatch, and the tests that covered only those two helpers.

This is a user-visible removal. --watch, -w and --interval now produce
an unknown-flag usage error. Both long flags are recorded in .surface-breaking
as acknowledged surface removals — release-scoped, since that file is cleared
after each release. Shorthands aren't recorded in .surface, so -w needs no
entry.

Why

runTimelineWatch reached tea.NewProgram with no interactivity check of any
kind
— no app.IsInteractive(), no IsMachineOutput(), no
stdinarg.InteractiveStdio(). The view set AltScreen = true, so
basecamp timeline --watch --json, --agent, or any piped invocation entered a
full-screen program that exited only on a key event or SIGINT.

It was the only reachable ungated bubbletea launcher in the repo. Every picker
path goes through resolve.Resolver.IsInteractive, the profile picker through
isInteractiveTTY, and basecamp tui is dev-build plus experimental-flag
gated. Worse, the shipped agent instructions pointed straight at it —
skills/basecamp/SKILL.md listed basecamp timeline --watch unqualified in
both the quick-reference table and the examples block, so an agent following the
skill hung.

Removing it rather than gating it: a live-polling TUI does not belong in a CLI
whose whole contract is one-shot machine-readable output. It can come back with
the actual TUI workspace, where it has somewhere to live. This also deletes the
last ungated launcher instead of adding a fourth thing that has to remember to
check.

Same family as #641/#645 — an agent invocation that hangs.

Testing

  • make check passes (via bin/ci) — including the surface snapshot vs
    .surface-breaking gate and skill drift on both skills

Smoke:

$ basecamp timeline --watch --json
{"ok": false, "error": "Unknown option: --watch", "code": "usage"}   exit=1
$ basecamp timeline -w --json
{"ok": false, "error": "Unknown option: -w", "code": "usage"}        exit=1

timeline --help no longer lists --watch/--interval and the Long help no
longer mentions polling. basecamp timeline --json is unaffected.

Audited every remaining tea.NewPrograminternal/commands/tui.go:115 (dev
build + experimental.tui), internal/tui/picker.go:505,527 (resolver-gated),
internal/tui/paginated_picker.go:393 and internal/tui/spinner.go:159 (both
dead code, zero callers). No ungated launcher remains.


Summary by cubic

Removes basecamp timeline --watch (and -w/--interval) to eliminate an ungated bubbletea TUI that entered alt-screen without interactivity checks and could hang non-interactive runs. These flags now return an unknown-option usage error; timeline remains a one-shot CLI.

  • Deletes watch-only code: runTimelineWatch, watchModel and its Init/Update/View, formatEvent, watchLabel, and their tests.
  • Records removals in .surface-breaking and drops flags from .surface; updates help and skills/basecamp/SKILL.md to remove watch references.
  • Audits remaining tea.NewProgram paths; all are gated via resolver or dev/experimental controls.
  • Migration: remove --watch, -w, and --interval from scripts and docs. Use basecamp timeline with --limit, --all, or --page as needed.

Written for commit 4dded08. Summary will update on new commits.

Review in cubic

`runTimelineWatch` reached `tea.NewProgram` with no interactivity check of any
kind — no `app.IsInteractive()`, no `IsMachineOutput()`, no
`stdinarg.InteractiveStdio()`. The view set `AltScreen = true`, so
`basecamp timeline --watch --json`, `--agent`, or any piped invocation entered a
full-screen program that exited only on a key event or SIGINT. It was the only
reachable ungated bubbletea launcher in the repo: every picker path goes through
`resolve.Resolver.IsInteractive`, the profile picker through `isInteractiveTTY`,
and `basecamp tui` is dev-build plus experimental-flag gated. The shipped agent
instructions pointed at it, so an agent following the skill hung.

Remove the feature rather than gate it. A live-polling TUI does not belong in a
CLI whose contract is one-shot machine-readable output; it can come back with
the actual TUI workspace, where it has somewhere to live. This also deletes the
last ungated bubbletea launcher instead of adding a fourth thing that must
remember to check.

This is a user-visible removal: `--watch`/`-w` and `--interval` are gone and now
produce an unknown-flag usage error. Both flags are recorded in
`.surface-breaking` as acknowledged surface removals (release-scoped; that file
is cleared after each release). `formatEvent`, `watchLabel`, `watchModel` and
their tests went with them — all were reachable only from watch mode.
Copilot AI balanced review requested due to automatic review settings August 22, 2026 07:39
@github-actions github-actions Bot added commands CLI command implementations tests Tests (unit and e2e) skills Agent skills labels Aug 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes the unsafe, non-interactive timeline watch TUI while preserving one-shot timeline output.

Changes:

  • Removes --watch, -w, --interval, and watch-only code/tests.
  • Updates CLI surface snapshots and agent documentation.

Tip

If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
.surface Removes timeline watch flags from the public surface.
.surface-breaking Acknowledges the intentional breaking removals.
internal/commands/timeline.go Removes watch flags, TUI implementation, and dependencies.
internal/commands/timeline_test.go Deletes watch-only tests.
skills/basecamp/SKILL.md Removes agent guidance referencing watch mode.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@jeremy
jeremy merged commit b6a9db6 into main Aug 22, 2026
25 checks passed
@jeremy
jeremy deleted the remove-timeline-watch branch August 22, 2026 07:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

commands CLI command implementations skills Agent skills tests Tests (unit and e2e)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants