Skip to content

Consolidate familiar studio to five tabs (Look + lifecycle merged into Identity)#3751

Merged
BunsDev merged 1 commit into
mainfrom
refactor/familiar-studio-tabs
Jul 24, 2026
Merged

Consolidate familiar studio to five tabs (Look + lifecycle merged into Identity)#3751
BunsDev merged 1 commit into
mainfrom
refactor/familiar-studio-tabs

Conversation

@BunsDev

@BunsDev BunsDev commented Jul 24, 2026

Copy link
Copy Markdown
Member

Summary

Consolidates the familiar studio from 8 tabs to 5: Identity | Brain | Memory | Projects | Vault, per three cumulative requests:

  1. Remove the Journal studio tab (journal lives in Memories → Journal)
  2. Remove the Lifecycle tab, keeping only archive + delete, relocated into an existing tab
  3. Merge the Look tab into Identity — intuitively and minimalistically

Changes

  • Identity tab now hosts: Type picker → identity fields → Look sections (avatar, icon, backdrop, accent color) → new Lifecycle section (Archive/Unarchive + undo-safe Remove with the same confirm copy, Recently-removed shelf, and undo toast).
  • New familiar-lifecycle-section.tsx (selected-familiar scope) replaces the roster-wide lifecycle tab; deleted familiar-studio-lifecycle-tab.tsx and familiar-studio-journal-tab.tsx.
  • FamiliarStudioTab union + STUDIO_TABS shrunk; listView state removed (openFamiliarStudioListView now routes to the settings page / clears selection).
  • "Remove familiar…" popover in Familiars settings deep-links to the Identity tab.
  • Settings search: Identity row absorbs look/lifecycle keywords; Look/Lifecycle/Journal rows removed.
  • journal-entries.tsx: removed the now-orphaned standalone fork (its only consumer was the deleted journal tab); /journal slash description updated.
  • CSS: pruned dead lifecycle row/grip rules; removed .familiar-studio-journal host block.
  • Tests: renamed/rewrote 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

  • Full app suite: 891 test files green; typecheck, lint, design-token ratchets, check-tests-wired all pass.
  • Production build + Playwright screenshots of Settings → Familiars: 5-tab strip renders; Identity shows Type → fields → Look sections → Lifecycle (Archive/Remove…) end-to-end.

Closes bead cave-xkh5.

… 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>
Copilot AI review requested due to automatic review settings July 24, 2026 05:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 FamiliarLifecycleSection rendered from the Identity tab.
  • Retires the Familiar Studio Journal tab, updates /journal copy/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; }
@BunsDev
BunsDev merged commit 267863f into main Jul 24, 2026
16 checks passed
@BunsDev
BunsDev deleted the refactor/familiar-studio-tabs branch July 24, 2026 10:19
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.

2 participants