TM-1: Missing chat option - #52
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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?