Consolidate familiar studio to five tabs (Look + lifecycle merged into Identity)#3751
Merged
Conversation
… Identity Settings → Familiars had eight studio tabs; three carried overlapping or relocated concerns. The strip is now Identity | Brain | Memory | Projects | Vault: - Identity absorbs the Look sections (avatar, icon, backdrop, accent) by hosting FamiliarStudioLookTab inline, followed by a new lifecycle section. - New familiar-lifecycle-section.tsx keeps ONLY archive/unarchive and the undo-safe remove flow (confirm copy, UndoToast, Recently removed shelf, tombstone-backed restore) for the selected familiar. Roster reorder, reset-all-overrides, and the Open Appearance link retired with the tab. - Journal studio tab removed — the journal lives in Grimoire (Memories → Journal); journal-entries.tsx drops its now-orphaned `standalone` fork. - Context: FamiliarStudioTab union/STUDIO_TABS shrink; listView state removed; openFamiliarStudioListView now just opens Settings → Familiars (stale persisted tab values fall back to Identity via the existing guard). - Deep links retargeted: Familiars-view "Remove familiar…" → identity tab; settings search rows for Look/Lifecycle/Journal folded into Identity. - Tests renamed/retargeted to pin the new intent (journal-redirect.test.ts, familiar-lifecycle-section.test.ts); route-seam pins kept verbatim. Verified: app suite 891 files green, typecheck, pnpm lint, design-token ratchets, check-tests-wired. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Consolidates the Familiar Studio information architecture by collapsing multiple studio tabs into a smaller set and relocating “Look” and lifecycle actions into the Identity flow, while removing the retired Journal/Lifecycle studio tabs and updating deep links, search indexing, and invariant tests to match.
Changes:
- Shrinks the Familiar Studio tab model and Settings → Familiars inline panel to the consolidated tab set; removes the list-view state and retires deleted tabs.
- Moves lifecycle verbs (archive/unarchive + undo-safe remove + recently-removed restore) into a new
FamiliarLifecycleSectionrendered from the Identity tab. - Retires the Familiar Studio Journal tab, updates
/journalcopy/redirect seams, prunes dead CSS, and rewires/renames source-scan tests and suite wiring.
Reviewed changes
Copilot reviewed 23 out of 23 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/styles/journal.css | Removes studio-host journal layout rules now that the Familiar Studio Journal tab is retired. |
| src/styles/globals/shell-responsive.css | Updates lifecycle section layout styles; prunes lifecycle row/grip focus styling tied to deleted UI. |
| src/lib/surface-warmup-registry.test.ts | Updates warmup invalidation source pins to the new lifecycle section. |
| src/lib/slash-commands.ts | Updates /journal description to point at the Grimoire (Memories → Journal). |
| src/lib/familiar-studio-context.tsx | Shrinks FamiliarStudioTab/STUDIO_TABS and removes the retired list-view state from context. |
| src/components/workspace.tsx | Updates journal-mode redirect comment to reflect the Grimoire-only journal home. |
| src/components/settings-sections.ts | Consolidates Familiars search indexing into Identity and removes Look/Lifecycle/Journal rows. |
| src/components/settings-search.test.ts | Updates search pins for the new studio tab set and asserts retired tabs are not indexed. |
| src/components/settings-action-buttons.test.ts | Repoints lifecycle-related source scanning to the new lifecycle section; removes lifecycle row selector pin. |
| src/components/journal/journal-entries.tsx | Removes the Settings-host standalone fork and simplifies navigation actions to workspace event dispatch. |
| src/components/journal-redirect.test.ts | Rewrites pins to assert retired journal homes are gone and redirect seams remain intact. |
| src/components/familiars-view.test.ts | Updates overflow “Remove familiar…” routing to Identity (where lifecycle now lives). |
| src/components/familiars-view-sections.tsx | Routes “Remove familiar…” action to the Identity tab instead of the removed Lifecycle tab. |
| src/components/familiar-switcher.test.ts | Updates copy expectations for “Manage” entry point behavior. |
| src/components/familiar-studio-lifecycle-tab.tsx | Deletes the retired Lifecycle tab implementation. |
| src/components/familiar-studio-journal-tab.tsx | Deletes the retired Journal tab wrapper implementation. |
| src/components/familiar-studio-inline.tsx | Removes retired tabs from the Settings inline studio strip and forwards roster callbacks to Identity. |
| src/components/familiar-studio-inline.test.ts | Updates inline studio source pins for the new tab strip and Identity-hosted Look sections. |
| src/components/familiar-studio-identity-tab.tsx | Hosts merged Look sections and the new lifecycle section within Identity. |
| src/components/familiar-lifecycle-section.tsx | Adds the new selected-familiar lifecycle section (archive/remove + recently-removed restore). |
| src/components/familiar-lifecycle-section.test.ts | Updates/renames lifecycle pins to validate the new section’s invariants and route seams. |
| src/components/delete-undo-surfaces.test.ts | Updates delete/undo invariants to reference the lifecycle section rather than the deleted tab. |
| scripts/run-tests.mjs | Rewires the app test suite list to the renamed/retired tests. |
Comments suppressed due to low confidence (2)
src/components/familiar-studio-inline.tsx:33
- The studio context allows the persisted/deep-linked tab value "contract" (FamiliarStudioTab + STUDIO_TABS include it), but the Settings inline panel tab strip doesn't include a Contract tab. If the stored tab is "contract", Tabs will have a value with no corresponding item and the panel can appear broken.
const TABS: Array<{ id: FamiliarStudioTab; label: string; icon: IconName }> = [
{ id: "identity", label: "Identity", icon: "ph:user" },
{ id: "brain", label: "Brain", icon: "ph:brain" },
{ id: "memory", label: "Memory", icon: "ph:archive" },
{ id: "projects", label: "Projects", icon: "ph:folder" },
{ id: "vault", label: "Vault", icon: "ph:vault" },
src/components/familiar-studio-inline.tsx:139
- The inline panel never renders a body for activeTab === "contract". Since multiple call sites route users to the contract tab, this results in a blank panel when they follow those links or when localStorage restores a stale "contract" tab value.
{activeTab === "brain" ? <FamiliarStudioBrainTab familiar={familiar} /> : null}
{activeTab === "memory" ? (
<FamiliarStudioMemoryTab familiar={familiar} allFamiliars={familiars} />
) : null}
{activeTab === "projects" ? <FamiliarStudioProjectsTab familiar={familiar} /> : null}
{activeTab === "vault" ? <VaultPanel /> : null}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
9
to
14
| import { FamiliarStudioIdentityTab } from "./familiar-studio-identity-tab"; | ||
| import { FamiliarStudioLookTab } from "./familiar-studio-look-tab"; | ||
| import { FamiliarStudioBrainTab } from "./familiar-studio-brain-tab"; | ||
| import { FamiliarStudioLifecycleTab } from "./familiar-studio-lifecycle-tab"; | ||
| import { FamiliarStudioMemoryTab } from "./familiar-studio-memory-tab"; | ||
| import { FamiliarStudioProjectsTab } from "./familiar-studio-projects-tab"; | ||
| import { FamiliarStudioJournalTab } from "./familiar-studio-journal-tab"; | ||
| import { SettingsFamiliarPicker } from "./settings-familiar-picker"; | ||
| import { VaultPanel } from "./vault-panel"; |
Comment on lines
1004
to
1005
| .familiar-studio-lifecycle__hint { margin: 4px 0 8px; font-size: var(--text-2xs); line-height: 1.5; color: var(--text-muted); } | ||
| .familiar-studio-lifecycle__hint { font-size: 12px; color: var(--text-muted); line-height: 1.4; margin: 0; } |
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.
Summary
Consolidates the familiar studio from 8 tabs to 5: Identity | Brain | Memory | Projects | Vault, per three cumulative requests:
Changes
familiar-lifecycle-section.tsx(selected-familiar scope) replaces the roster-wide lifecycle tab; deletedfamiliar-studio-lifecycle-tab.tsxandfamiliar-studio-journal-tab.tsx.FamiliarStudioTabunion +STUDIO_TABSshrunk;listViewstate removed (openFamiliarStudioListViewnow routes to the settings page / clears selection).journal-entries.tsx: removed the now-orphanedstandalonefork (its only consumer was the deleted journal tab);/journalslash description updated..familiar-studio-journalhost block.familiar-lifecycle-section.test.ts+journal-redirect.test.ts; updated inline/search/switcher/action-button/warmup/delete-undo pins; stale persisted tab values fall back safely (guards verified).Verification
Closes bead cave-xkh5.