Skip to content

TM-1: Missing chat option - #52

Merged
wdembinski merged 22 commits into
developmentfrom
feat/missing-chat-option
Sep 19, 2026
Merged

wdembinski merged 22 commits into
developmentfrom
feat/missing-chat-option

Conversation

@wdembinski

Copy link
Copy Markdown
Owner

When AI agent asks about something it gives options to click or text field to answer own words. However, when I'm using Claude CLI it usually allows to select option to chat about the question/problem. Could it be added to the Task Manager?

github-actions Bot and others added 22 commits September 18, 2026 19:36
replanCard no longer refuses with chain-busy while a card's steps are
still running — the re-plan turn is its own conversation on the card,
not part of the chain, so it can run alongside a live step. A NEW
refusal, `planning`, covers the case that actually needs blocking: a
second re-plan while one is already queued, running, or sitting in the
inbox as a plan-approval (`Scheduler.replanPending`).

`Run`/`startTask` opts gain `replan`, so `settle` can tell a re-plan
run apart from an ordinary one: a re-plan that comes back `done` never
had any work of its own to land, so it skips chain.workWritten and the
integration path entirely and just returns the card to `in-progress`.
A failed re-plan is unaffected and still goes through
`handleRunFailure`.

packages/ui's canReplan and REFUSAL_HINT follow the same split.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extracts settle's landing block (open PR / auto-merge / offer the Merge
button, chain hand-back, plan write-back) into landWork(ctx), shared
with a new landHeld(cardId). When a chain's last pending step finishes
while a re-plan for the same card is still in flight, settle now holds
that landing in heldLandings instead of racing it against whatever the
human is about to approve — the step is marked done and a note is filed
saying so.

landHeld replays the held context once the plan resolves: approvePlan
drops the hold and lets the chain continue when the plan adds steps, or
lands it when the plan adds nothing; startPendingReplan and the
'exited' handler land it too when a queued or live re-plan declines to
start; stopTask converts a held landing into a Merge offer instead of
leaving it stranded.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds splitStepPhases to boardColumns.ts: the current phase is the first
round with an unfinished step, or the last round once everything is done.
splitEarlierSteps is reimplemented on top of it, gaining a flattened
`later` alongside its existing `earlier`/`latest`.

TaskCard grows a mirrored later-steps row (chevron, "N upcoming steps",
0/N, attention tint but no running dot) beside the existing earlier-steps
one, threaded through KanbanColumn and both boards (MyTasks, BoardScreen)
via a new `shownLaterStepCards` setting.

TaskSteps' phase list now renders earlier/current/later using the same
split, fixes the current phase's dead chevron by rendering it as plain
text instead of an inert toggle, and relabels "Round N" to "Phase N"
throughout (including approvePlan's timeline comment).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
`task:replan` takes an optional `replaceRound`: the round must exist and
every one of its steps must still be pending/stopped, or the ask is
refused with `phase-started`. Approving the plan swaps the round's steps
via the new `Store.replaceSubtaskRound` (one transaction: delete the
round's steps, insert the replacements at the same round, renumber every
subtask's order) — unless the phase started while the plan sat waiting,
in which case it lands as a new round after it instead, with a comment
explaining why. The panel gets a "Re-plan…" button on each later phase's
header, reusing the existing note form.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds a sixth scenario to verify-round.mjs proving replaceSubtaskRound
against a real database: seed a card with phases 1-3, replace phase 2,
and confirm getSubtasks reads phase 1, the new phase 2, phase 3 in
that order, with the old round's rows gone.

Fixes a typecheck error the gates caught along the way: landWork's two
readyToIntegrate.set calls spread projectId twice ({ projectId:
project.id, ...ctx }), which TS2783 flags as always-overwritten — ctx
already carries projectId (LandingContext is PendingIntegration), and
project is looked up BY ctx.projectId, so the two were always the same
value. Both call sites now just pass ctx.

Replaces docs/03's "Re-planning folds the previous bunch by itself"
passage with a "Phases" section covering the three independent folds,
planning ahead beside a live chain, re-planning a future phase in
place, and a chain holding its landing while a plan is pending.
Adds a "Phase" entry to docs/05-glossary.md beside Subtask (step).

Bumps apps/client/package.json to 0.100.0 (MINOR: new user-facing
capability, per CONTRIBUTING §4).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Step 1's own brief re-checked against the code, since a step's prompt
carries only its sibling's title, not its body, and step 2 needs the
detail to survive the hand-off. One gap found: reconcileMergeRequests
preserves openedForTaskId but never sets it for a brand-new row, so a
link flow must stamp it explicitly the way forge/createPr.ts#rowFor
already does.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds the manual-link half of automatic MR/PR linking: parsePrUrl.ts parses a
pasted merge-request/pull-request URL into forge coordinates (by path segment,
never by host, since both forges self-host); linkPr.ts fetches it through the
same describe*/reconcile* functions the syncs use and stamps taskId/
openedForTaskId onto the target card, since the human pointing at a URL beats
whatever key-matching a sync would otherwise guess. Wires the mr:link IPC
channel (relay-classified, token stays on the desktop) and adds a "Link
existing MR/PR" button + dialog to TaskAgentPanel, shared by desktop and web.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both reconcilers upserted a fresh row for a card the query dropped and
archived, the moment its issue reappeared in a later page or a retry —
so a removed card would silently pop back onto the board. Skip any
prior with archivedAt set instead of restoring it, and remove the
now-dead restoreIds plumbing (JiraSyncResult/GitHubIssueSyncResult, the
two unarchiveTask loops in ipc.ts). A card now stays off the board
until an explicit restore.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The archived-card fate in both reconcilers' doc comments now names the
one pre-existing edge case this fix does not touch: restoring a card
whose ticket genuinely fell out of the query just lets the next sync
re-archive it through the normal left-query path, which is correct
given the query, not a regression. Removed-cards recovery itself
(task:restore, the Removed-cards list) is unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Scaffolds the shared on/off switches every later phase in this ticket
reads: a FeatureSettings group (all true by default) plus per-surface
shelf view-state (shelvedCardIds, shelfFolded), classified in
GLOBAL_SETTINGS_KEYS/local keys, and rendered as a Features tab on
both the desktop and web Settings screens.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds ensureFoldedCard (add-if-absent, prune-on-write) beside
toggleFoldedCard, and wires it into every place a human moves a card —
the board's drag-and-drop (moveTask / onDropInColumn) and the detail
pane's State dropdown (TaskDetailsCell.onStatusSet, threaded through
TaskDetail) — on both the desktop and the web. Gated on
settings.features.autoFoldReviewDone, and fires only on the move
transition so a card reopened afterwards stays open.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A card can now be moved to a full-width shelf strip beneath the board
columns ("Move to shelf" / "Return to board" on its menu, or drag it
onto the strip) — it keeps its status but is hidden from every column
and shows no column while shelved. Gated on settings.features.shelf
and shared between the desktop and web boards via @tm/ui.

- shelvedCards.ts mirrors foldedSteps.ts's toggle/ensure/set helpers
- partitionShelved splits a scope's cards into on-board vs. shelved
- ShelfStrip renders the strip, its own drag-and-drop drop zone, and
  the fold/unfold header; TaskCard grows a shelved/onToggleShelved pair

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A merged MR with no genuine CI reading (`pipelineStatus` none/unknown) used
to keep wearing "no pipeline"/"pipeline unknown" forever, which reads as
unfinished business on a row that has otherwise landed. `showPipeline` in
`mergeRequest.ts` draws the line, gated on `settings.features.afterMergePipeline`
in both MergeRequests and TaskCard's pipeline fallback.

Also extends GitHub's CI read to the merge commit SHA once a PR has landed:
`head.sha` never moves after merging, so it only ever reported the pre-merge
run. GitLab's `head_pipeline` already tracks the post-merge run.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
When a merge/pull request needs a rebase and the forge can trigger it,
its verdict badge (pane) or glyph (card) is replaced by a clickable
icon-button that fires GitLab's rebase or GitHub's update-branch
endpoint, then re-syncs. Gated on settings.features.mrRebaseButton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds `activityLabel` (packages/ui/src/agentActivity.ts), a formatter that
turns a `tool-use`/`thinking` SessionEvent into a short human phrase
("Reading foo.ts", "Running tests", "Running: <sub-agent task>"), reusing
`labelOf` for sub-agent calls.

`foldTurns` grows a `{ quiet }` option that drops the tool/thinking work
entirely instead of folding it into a "worked with N tools" row — the
agent's prose turns are unaffected. `TaskDetail`'s footer derives the
most recent tool-use/thinking from the same unfiltered event stream
`subAgents` reads, and shows its one-liner as a muted caption beside
`run.label`.

`settings.features.quietAgentProgress` threads through from MyTasks.tsx
and the web board into TaskDetail, gating both the fold and the footer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
When a mirrored JIRA/GitHub ticket resolves to a project that owns a
board, sync it onto that project's board instead of Personal. Reuses
resolveAgentProject's precedence (explicit assignment, filing, then
epic-key match) via a new resolveOwningBoardProject, widened to every
project rather than only ones with a repo — a ticket-only board owns
no directory, so agentProjectsOf's hasRepo filter would hide exactly
the projects this feature targets. Gated on
settings.features.ticketsToOwnBoard.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…Done toggle

RELEASE.md §1's three gates (typecheck, test, build) all pass fresh with turbo's
cache forced off, format:check is clean, and settings.test.ts still classifies
every AppSettings key. The other five feature toggles already had an
integration-style test exercising their off case (jiraSync's assignOwnBoard,
turns.ts's quiet mode) or gate genuinely UI-only rendering this repo has no
harness for; autoFoldReviewDone was the one gap cheap to close, so its
duplicated inline check in MyTasks.tsx and BoardScreen.tsx is now the shared,
tested shouldAutoFoldOnMove predicate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…wering it

The CLI's own interactive AskUserQuestion prompt lets you talk about a
question instead of only picking an option or typing a final answer; the
app's form had no equivalent — every message sent through the held tool's
answer channel was phrased as a committed decision, so the agent was told
"do NOT ask again" even for a bare clarifying comment.

Add a "Discuss instead" action alongside "Send answer" and "Let the agent
decide": it sends whatever free text was typed as a new `discuss` decision,
phrased for the agent as NOT an answer, inviting it to respond and ask
again if it still needs one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Resolves the release-bump collision on apps/client/package.json (kept
development's already-released 0.100.3) after pulling in the tracker,
chat-log, MR-rebase, and pipeline-badge work merged since this branch
was cut. No other conflicts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wdembinski
wdembinski merged commit e0ad1ed into development Sep 19, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant