feat(claude): account login pane — host claude login in a modal terminal (T-485)
Completes the `login` verb + the UI add/re-login affordances. The accountActionChannel 'login' action opens ClaudeLoginDialog — a modal hosting a TerminalPane that runs `CLAUDE_CONFIG_DIR=<dir> claude login`, so the CLI drives the OAuth browser flow and credentials land in that account's config dir (D-64: one CLI-initiated browser flow, on explicit action). TerminalPane gains optional argv/env/cwdOverride (default stays the login shell), and its pane.spawn carries env when set. The login pane reuses the TerminalPane *widget* — a code import, not a runtime dependency, since it spawns through the always-present pane.spawn IPC rather than the terminal extension. Tests cover the parameterized spawn args and the dialog's host wiring (title, CLAUDE_CONFIG_DIR, close). Closes T-485. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7197,3 +7197,5 @@ All actions go through T-480''s CLI verbs; this widget never writes the registry
|
||||
|
||||
Done: the Claude pane account badge (ClaudeAccountBadge) in the pane chrome trailing slot — shows the bound account (or ''default''), colour-tinted per account via accountAccent (theme tokens, hash-indexed), tap opens the account picker; hidden when no accounts registered. The welcome-view accounts section is split to T-486 (welcome is builtin-decoupled; needs a contribution point to avoid welcome->claude peer coupling).', NULL, '2026-06-27 22:43:31', '2026-06-27 22:43:31.723', '2026-06-27 22:43:31.723', NULL, 'd3146ee6d4abe36714b1b160e94d3d3a', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FFW49WBTT3ESK6QG0XZ1VN2G', 'status', 'in_progress', 'done', NULL, '2026-06-27 22:43:31', '2026-06-27 22:43:31.769', '2026-06-27 22:43:31.769', NULL, '34a8c26c8c71d27fdcb1e60e3ffa1ea0', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGN13H42TP2MP3T27CTSCDRW', 'description', NULL, 'Done: ClaudeLoginDialog hosts a parameterized TerminalPane running ''claude login'' with CLAUDE_CONFIG_DIR=<dir> in a modal (ctx.dialog.show), wired from the accountActionChannel ''login'' action. TerminalPane gained argv/env/cwdOverride params (default still the login shell). The CLI owns the OAuth browser flow (D-64). No runtime dep on builtin.terminal — the login pane reuses the TerminalPane widget, which spawns via the always-present pane.spawn IPC. Tests: parameterized spawn args + dialog host wiring.', NULL, '2026-06-27 22:52:31', '2026-06-27 22:52:31.121', '2026-06-27 22:52:31.121', NULL, '1e158c1dcb4bf9eafecb8c26cc4936d2', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGN13H42TP2MP3T27CTSCDRW', 'status', 'backlog', 'done', NULL, '2026-06-27 22:52:31', '2026-06-27 22:52:31.156', '2026-06-27 22:52:31.156', NULL, '620a851447b74c2553407fac431b1e18', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
|
||||
@@ -9157,3 +9157,5 @@ All actions go through T-480''s CLI verbs; this widget never writes the registry
|
||||
|
||||
|
||||
Done: the Claude pane account badge (ClaudeAccountBadge) in the pane chrome trailing slot — shows the bound account (or ''default''), colour-tinted per account via accountAccent (theme tokens, hash-indexed), tap opens the account picker; hidden when no accounts registered. The welcome-view accounts section is split to T-486 (welcome is builtin-decoupled; needs a contribution point to avoid welcome->claude peer coupling).', 'done', 'medium', NULL, NULL, NULL, '2026-06-25 09:16:42', '2026-06-27 22:43:31.769', NULL, '065f5914ac6b963342be92e0ea65ab82', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGN13H42TP2MP3T27CTSCDRW', 'task', '06FDXN3ZBRS6JK7Q8G6JVSPXFC', 'claude account login: spawn a CLAUDE_CONFIG_DIR=<dir> claude login terminal pane', 'Done: ClaudeLoginDialog hosts a parameterized TerminalPane running ''claude login'' with CLAUDE_CONFIG_DIR=<dir> in a modal (ctx.dialog.show), wired from the accountActionChannel ''login'' action. TerminalPane gained argv/env/cwdOverride params (default still the login shell). The CLI owns the OAuth browser flow (D-64). No runtime dep on builtin.terminal — the login pane reuses the TerminalPane widget, which spawns via the always-present pane.spawn IPC. Tests: parameterized spawn args + dialog host wiring.', 'backlog', 'medium', NULL, NULL, NULL, '2026-06-27 19:17:59.712', '2026-06-27 22:52:31.121', NULL, 'd52f43050d3e2b14eecd47aff90ea836', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGN13H42TP2MP3T27CTSCDRW', 'task', '06FDXN3ZBRS6JK7Q8G6JVSPXFC', 'claude account login: spawn a CLAUDE_CONFIG_DIR=<dir> claude login terminal pane', 'Done: ClaudeLoginDialog hosts a parameterized TerminalPane running ''claude login'' with CLAUDE_CONFIG_DIR=<dir> in a modal (ctx.dialog.show), wired from the accountActionChannel ''login'' action. TerminalPane gained argv/env/cwdOverride params (default still the login shell). The CLI owns the OAuth browser flow (D-64). No runtime dep on builtin.terminal — the login pane reuses the TerminalPane widget, which spawns via the always-present pane.spawn IPC. Tests: parameterized spawn args + dialog host wiring.', 'done', 'medium', NULL, NULL, NULL, '2026-06-27 19:17:59.712', '2026-06-27 22:52:31.156', NULL, 'c0e79a87fa88a49a38e8b469b194a96a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
|
||||
Reference in New Issue
Block a user