~/demo/shadcn-app $ npx skills add jal-co/jalco-paper-skills --skill '*' --list Need to install the following packages: skills@1.7.2 Ok to proceed? (y) y ███████╗██╗ ██╗██╗██╗ ██╗ ███████╗ ██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝ ███████╗█████╔╝ ██║██║ ██║ ███████╗ ╚════██║██╔═██╗ ██║██║ ██║ ╚════██║ ███████║██║ ██╗██║███████╗███████╗███████║ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝ ┌ skills │ ◇ Source: https://github.com/jal-co/jalco-paper-skills.git │ ◇ Repository cloned │ ◇ Found 13 skills │ ◇ Available Skills │ │ paper-ds-canvas │ │ Shared rules for drawing in Paper through the Paper MCP without breaking things. Load before any paper-ds skill writes to a Paper file, and whenever a Paper screenshot comes back blank, artboards overlap, a node ID lookup returns the wrong ID, or dark mode needs to be drawn. │ │ paper-ds-components │ │ Bring actual design-system components into Paper and keep their baselines aligned with code or Figma. Import the variants, states, and usage rules needed for a task, checkpoint source versions, and preserve existing user revisions when refreshing instances. Use for component imports, stale canonical components, or replacing hand-drawn approximations with the real component. │ │ paper-ds-iterate │ │ Refine selected Paper components or nodes after feedback without restarting the exploration. Read the user's canvas edits, checkpoint revisions, preserve the current baseline, change only selected pieces, and verify survivors in context. Use for iterate on these nodes, keep this option, make it denser, use the actual Badge, or continue the next round. │ │ paper-ds-land │ │ Fold an approved Paper revision back into the design system and, when requested, the real component code. Preserve the previous version, update canonical artwork and usage guidance, verify code fidelity, and record approval separately from implementation. Use for adopt this option, make this the current component, implement these selected nodes, or land the approved design. │ │ paper-ds-manage │ │ Manage a design system and iterate on its components in Paper alongside the user. Start from the real system, route imports, comparisons, focused iterations, review, and approved implementation, and keep revision history. Use for ongoing Paper design-system work, continuing an exploration, managing drift, or deciding what to do next with a component. │ │ paper-ds-options │ │ Compare design directions or revisions of a real component, block, or page in Paper using its existing system and content. Choose the right comparison, preserve the baseline, capture draft lineage, and prepare survivors for focused iteration. Use for alternatives, variants, Current/Proposed comparisons, or stakeholder option sheets. Mobbin is optional. │ │ paper-ds-options-block │ │ Draw an option sheet for a block, meaning a section built from several components such as a pricing table, settings card, empty state, onboarding step or data list. Called by paper-ds-options when the decision is about a section. Use directly when the user asks for options for a section of a page. │ │ paper-ds-options-component │ │ Draw an option sheet for a single component, such as a badge, tile, toast, input or menu, using the user's design system. Called by paper-ds-options when the decision is about one component. Use directly when the user asks for variants of one component. │ │ paper-ds-options-page │ │ Draw an option sheet of whole-page directions, such as a billing page, dashboard, settings page or onboarding step, laid out side by side for stakeholders. Called by paper-ds-options when the decision is about a full screen. Use directly when the user asks for page-level directions. │ │ paper-ds-pages │ │ Organize a Paper file into a predictable page structure for a design system, and audit an existing file for a better one. Use when the user asks to organize or clean up a Paper file, asks whether their pages are laid out well, or after setup creates new pages. │ │ paper-ds-review │ │ Verify one real Paper design or revision against its system, states, widths, themes, and actual product context without inventing alternatives. Record the reviewed revision and evidence separately from approval or implementation. Use for review, critique, QA, in-context checks, or stakeholder sign-off of one subject. │ │ paper-ds-setup │ │ Connect an existing design system to Paper so it can be maintained and iterated alongside the user. Identify source authority, supported themes, real assets, and compact sheet defaults; create Foundations, TEMPLATE, and a versioned project manifest. Use for first-time setup or reconnecting an existing file, not to restart ongoing work. │ │ paper-ds-tokens │ │ Maintain the design system's tokens between its chosen source and Paper without erasing user edits or revision history. Compare drift, sync code or Figma values, explicitly pull approved Paper changes back to source, or generate a new system when requested. Use when tokens change, a theme drifts, or components need checking under a shared token revision. │ └ Use --skill to install specific skills ~/demo/shadcn-app $ npx skills add jal-co/jalco-paper-skills --skill '*' Need to install the following packages: skills@1.7.2 Ok to proceed? (y) y ███████╗██╗ ██╗██╗██╗ ██╗ ███████╗ ██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝ ███████╗█████╔╝ ██║██║ ██║ ███████╗ ╚════██║██╔═██╗ ██║██║ ██║ ╚════██║ ███████║██║ ██╗██║███████╗███████╗███████║ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝ ┌ skills │ ◇ Source: https://github.com/jal-co/jalco-paper-skills.git │ ◇ Repository cloned │ ◇ Found 13 skills │ ● Installing all 13 skills │ ◇ 79 agents │ ● Installing to: Pi │ ◇ Installation scope │ Project │ ◇ Installation Summary ───────────────────────────────────────────╮ │ │ │ ./.agents/skills/paper-ds-canvas │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-components │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-iterate │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-land │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-manage │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-options │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-options-block │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-options-component │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-options-page │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-pages │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-review │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-setup │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ │ ./.agents/skills/paper-ds-tokens │ │ copy → Pi, Amp, Antigravity, Antigravity CLI, Cline +16 more │ │ │ ├──────────────────────────────────────────────────────────────────╯ │ ◇ Proceed with installation? │ Yes │ ◇ Installation complete │ ◇ Installed 13 skills ─────────────────────────────╮ │ │ │ ✓ paper-ds-canvas (copied) │ │ → ./.agents/skills/paper-ds-canvas │ │ ✓ paper-ds-components (copied) │ │ → ./.agents/skills/paper-ds-components │ │ ✓ paper-ds-iterate (copied) │ │ → ./.agents/skills/paper-ds-iterate │ │ ✓ paper-ds-land (copied) │ │ → ./.agents/skills/paper-ds-land │ │ ✓ paper-ds-manage (copied) │ │ → ./.agents/skills/paper-ds-manage │ │ ✓ paper-ds-options (copied) │ │ → ./.agents/skills/paper-ds-options │ │ ✓ paper-ds-options-block (copied) │ │ → ./.agents/skills/paper-ds-options-block │ │ ✓ paper-ds-options-component (copied) │ │ → ./.agents/skills/paper-ds-options-component │ │ ✓ paper-ds-options-page (copied) │ │ → ./.agents/skills/paper-ds-options-page │ │ ✓ paper-ds-pages (copied) │ │ → ./.agents/skills/paper-ds-pages │ │ ✓ paper-ds-review (copied) │ │ → ./.agents/skills/paper-ds-review │ │ ✓ paper-ds-setup (copied) │ │ → ./.agents/skills/paper-ds-setup │ │ ✓ paper-ds-tokens (copied) │ │ → ./.agents/skills/paper-ds-tokens │ │ │ ├───────────────────────────────────────────────────╯ │ └ Done! Review skills before use; they run with full agent permissions. ~/demo/shadcn-app $ pi ▀▀█ v1.2.0 █▀ █ escape interrupt · ctrl+c/ctrl+d clear/exit · / commands · ! bash · ctrl+o more Press ctrl+o to show full startup help. Pi can explain its own features and look up its docs. Ask it how to use or extend Pi. Use paper-ds-setup for this project and my Paper file https://app.paper.design/file/01M4YDEG7VS396JB65FH21B9D5. Use our real tokens and components, and keep the sheets compact. [skill] paper-ds-setup:1-2000 (ctrl+o to expand) [skill] paper-ds-canvas:1-2000 (ctrl+o to expand) I should go through versioning.md, the manifest example, foundations.md, template.md, the design tokens, pages, and components to get a fuller picture of the project structure. $ cd /private/tmp/pdemo-home/demo/shadcn-app/.agents/skills; cat paper-ds-manage/references/versioning.md paper-ds-manage/references/manifest-example.json paper-ds-setup/references/foundations.md paper-ds-setup/references/template.md; cd ../..; ls; cat paper-ds.json 2>/dev/null; git ls-files 2>/dev/null | grep -v node_modules | head -80 (timeout 30s) ... (356 earlier lines, ctrl+o to expand) sources/provenance.json sources/registry.json sources/theming.md src/globals.css tsconfig.json Took 0.0s codemode const r = await tools.mcp__paper.get_basic_info({fileId:"01M4YDEG7VS396JB65FH21B9D5"}); return r; Script error: TypeError: tools.mcp__paper does not exist. Did you mean tools.mcp__paper__open_file, tools.mcp__paper__list_resources, tools.mcp__paper__create_file, tools.mcp__paper__rename_resource, tools.mcp__paper__create_page? ALL_TOOLS lists every tool; searchTools(query) finds tools by topic. Check for a member with "mcp__paper" in tools. ... (3 more lines, ctrl+o to expand) Took 0.1s codemode const names = Object.keys(tools).filter(n=>n.startsWith('mcp__paper')); const r = await tools.mcp__paper__get_basic_info({fileId:"01M4YDEG7VS396JB65FH21B9D5"}); return {names, r}; ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5"} 38ms {"names":["mcp__paper__open_file","mcp__paper__list_resources","mcp__paper__create_file","mcp__pap er__rename_resource","mcp__paper__create_page","mcp__paper__update_pages","mcp__paper__arrange_pag es","mcp__paper__get_basic_info","mcp__paper__get_selection","mcp__paper__get_node_info","mcp__pap er__get_children","mcp__paper__get_screenshot","mcp__paper__get_jsx","mcp__paper__get_tree_summary ","mcp__paper__get_computed_styles","mcp__paper__get_fill_image","mcp__paper__find_nodes","mcp__pa ... (219 more lines, ctrl+o to expand) Took 0.1s $ cd /private/tmp/pdemo-home/demo/shadcn-app; cat src/globals.css sources/theming.md sources/provenance.json components.json package.json; head -c 1500 sources/components/button.tsx; cat ../.agents/skills/paper-ds-tokens/SKILL.md 2>/dev/null | head -0; ls .agents/skills/paper-ds-tokens .agents/skills/paper-ds-tokens/references (timeout 30s) ... (594 earlier lines, ctrl+o to expand) .agents/skills/paper-ds-tokens: SKILL.md Command exited with code 1 Took 0.0s The design system pages are already heavily set up, but there's no local manifest file—so this looks like a reconnect scenario where I should reuse the existing pages and generate a fresh manifest. I'll need to flag unresolved choices like theme support, logo presence, and background style for the user to confirm, since the tokens hint at dark mode but no logo was found. Before writing anything, I should do some read-only inspection first—checking for logo assets, reviewing the Foundations artboards, the Components page, and the TEMPLATE state—so I have enough context to ask well-grouped questions rather than guessing. $ cd /private/tmp/pdemo-home/demo/shadcn-app; find . -path ./node_modules -prune -o \( -iname '*logo*' -o -iname '*.svg' -o -iname 'paper-ds*' -o -iname 'public' \) -print | grep -v '^./.agents' | head; ls -a; cat skills-lock.json | head -30 (timeout 20s) ... (35 earlier lines, ctrl+o to expand) "computedHash": "a982b42fffd19868cb6bc93fe3fee794d848c5f19d22ea59f215b3cf35ec50fe" }, "paper-ds-manage": { "source": "jal-co/jalco-paper-skills", "sourceType": "github", Took 0.0s codemode const out={}; for (const id of ["p-1-0","p-3-0","p-A-0","p-6-0"]) { try { const r = await tools.mcp__paper__get_basic_info({fileId:"01M4YDEG7VS396JB65FH21B9D5", pageId:id}); const t=r.content[r.content.length-1].text; const j=JSON.parse(t); out[id]={page:j.pageName,count:j.nodeCount,arts:j.artboards}; } catch(e){ out[id]=String(e).slice(0,200);} } return out; ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-1-0"} 18ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-3-0"} 7ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-A-0"} 9ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-6-0"} 6ms {"p-1-0":{"page":"Foundations","count":259,"arts":[{"id":"1-0","name":"01 Color roles","childCount":3,"width":1400,"height":null,"worldX":0,"worldY":0},{"id":"4Q-0","name":"02 Neutral ramp","childCount":3,"width":1400,"height":null,"worldX":1480,"worldY":0},{"id":"5Z-0","name":"03 Type and ... (10 more lines, ctrl+o to expand) Took 0.1s I'm checking that the design file setup is mostly there already, but there's no paper-ds.json in the repo so I need to reconnect that source. I'm also comparing the token naming conventions—Paper uses namespaced dark color tokens while the template seems to use shadcn-style role names like background/foreground, so I need to verify the template's tokens actually resolve correctly. Rather than guessing at defaults for themes, logo, and other unresolved choices, I think the right move is to gather my findings and ask the user in one grouped message, since the file is otherwise mostly built and asking is the more faithful approach here. I've read the project and your Paper file. I haven't written anything yet, because a few setup choices are still open. What I found - Token source: src/globals.css is a shadcn base-nova setup with :root and .dark blocks. sources/components/*.tsx holds 15 components. - Paper file: The token set matches the code, with plain light roles and --color-dark-* roles. The file already has these pages: - TEMPLATE, with four sheets: Component, Block, Page and Review. - Foundations, with 00 Overview and 01–04. - Components, plus one page for each of the 15 components. - Alert exploration, Alert review and Archive. - Missing pieces: - There is no paper-ds.json in the project, so this is a reconnect. I'll reuse the existing pages and nodes and won't rebuild them. - Foundations has no 05 Logo or 06 Font stacks artboard. - I found no logo or SVG asset in the repo. Questions 1. Themes: Do you ship light and dark, so every sheet shows a pair of stages? Or only one of them? 2. Logo: Which file should I use for the Logo foundation and the sheet header? If there isn't one, I'll leave the slot out. 3. Index style: Should options be numbered (01, 02) or lettered (A, B)? 4. Stage background: Should stages use --color-background or --color-card? Is that the same in both themes? 5. Optional slots: Should I keep the "Gives up:" trade-off line and the Feedback notes line on the sheets? Both are on by default. 6. Source authority: Is code the authority for both tokens and components? I'm assuming it is. Once you answer 1. I'll write paper-ds.json (schemaVersion: 2) from the node IDs I can verify. 2. I'll sync tokens and save a snapshot under paper-ds/history/. 3. I'll check that the TEMPLATE frames use your real token names (--color-background, --color-card, --spacing-*, --radius-*). 4. I'll add 05 Logo and 06 Font stacks (Geist and Geist Mono) to Foundations. I'll show you the proposed changes before I apply them. 5. I'll keep the sheets compact, using the DS spacing and type steps, and screenshot to verify. I won't mark any component approved or implemented. 1. Light and dark, side by side. 2. No logo, leave the slot out. 3. Numbers. 4. Keep whatever the existing TEMPLATE stages use. 5. Keep both. 6. Yes, code for both. Write the manifest and token snapshot, but don't add new Foundations artboards for now. I don't need to write text yet, so I'll skip font family lookup for now. I need the tokens hash ad7a869b and should verify node IDs, template stage usage, and component page artboards, so I'm gathering tokens, the template JSX for the stage fill, and the component pages next. codemode const F="01M4YDEG7VS396JB65FH21B9D5"; const tk = await tools.mcp__paper__get_tokens({fileId:F}); const tkText = tk.content[tk.content.length-1].text; const pages = {"Button":"p-A-0","Badge":"p-B-0","Input":"p-D-0","Textarea":"p-P-0","Checkbox":"p-I-0","RadioGrou p":"p-K-0","Switch":"p-J-0","Slider":"p-L-0","Progress":"p-M-0","Tabs":"p-N-0","Avatar":"p-O-0","C ard":"p-C-0","Alert":"p-E-0","Separator":"p-Q-0","Skeleton":"p-R-0"}; const comps={}; for (const [n,p] of Object.entries(pages)) { const r=await tools.mcp__paper__get_basic_info({fileId:F,pageId:p}); const ... (7 more lines, ctrl+o to expand) ... (9 earlier calls, ctrl+o to expand) ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-M-0"} 5ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-N-0"} 5ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-O-0"} 5ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-C-0"} 4ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-E-0"} 5ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-Q-0"} 5ms ✓ mcp__paper__get_basic_info {"fileId":"01M4YDEG7VS396JB65FH21B9D5","pageId":"p-R-0"} 4ms ✓ mcp__paper__get_jsx {"fileId":"01M4YDEG7VS396JB65FH21B9D5","nodeId":"NR-0","format":"inline-styles"} 8ms {"tkLen":23424,"tkHead":"{\n \"tokens\": [\n {\n \"name\": \"--color-background\",\n \"type\": \"color\",\n \"value\": \"oklch(100% 0 0)\",\n \"description\": \"Exact default neutral shadcn/ui theme, light\"\n },\n {\n \"name\": \"--color-foreground\",\n \"type\": \"color\",\n \"value\": \"oklch(14.5% 0 0)\",\n \"des","comps":{"Button":["8X-0:Button r1"],"Badge":["F7-0:Badge r1"],"Input":["JU-0:Input ... (28 more lines, ctrl+o to expand) Took 0.1s I'm noting the stage color variables and preparing to write the token snapshot JSON, themes, and manifest files, flagging a divergence around color-mix in the button secondary hover state with hash ad7a869b. I'm also mapping out component source paths and exploration/review page IDs for the Alert component, deciding to skip checking whether those pages contain subjects. Now I need to figure out how to actually write the token snapshot JSON file from the stored text — since codemode lacks direct filesystem access, I should check whether a write tool like mind_write is available to use instead. codemode const n=Object.keys(tools).filter(k=>k.includes('write')||k.includes('bash')); return n; ["bash","write","mcp__paper__write_html"] Took 0.0s codemode const tk = JSON.parse(load("tk")); const snap = {snapshot:1, capturedFrom:"paper get_tokens", fileId:"01M4YDEG7VS396JB65FH21B9D5", contentHash:"ad7a869b", themes:["light","dark"], darkMapping:"src/globals.css .dark -> --color-dark-*", tokens: tk.tokens}; await tools.write({path:"/private/tmp/pdemo-home/demo/shadcn-app/paper-ds/history/tokens-r1.json", content: JSON.stringify(snap,null,2)}); const pages={Button:["p-A-0","8X-0"],Badge:["p-B-0","F7-0"],Input:["p-D-0","JU-0"],Textarea:["p-P-0","1I O-0"],Checkbox:["p-I-0","12E-0"],RadioGroup:["p-K-0","16Y-0"],Switch:["p-J-0","14K-0"],Slider:["p- L-0","190-0"],Progress:["p-M-0","1BS-0"],Tabs:["p-N-0","1DG-0"],Avatar:["p-O-0","1FI-0"],Card:["p- ... (32 more lines, ctrl+o to expand) ✓ write {"path":"/private/tmp/pdemo-home/demo/shadcn-app/paper-ds/history/tokens-r1.j... 2ms ✓ write {"path":"/private/tmp/pdemo-home/demo/shadcn-app/paper-ds.json","content":"{\... 1ms 146 Took 0.0s I'll quickly confirm the files are present and double-check the token hash hasn't changed. $ cd /private/tmp/pdemo-home/demo/shadcn-app; ls -l paper-ds.json paper-ds/history; python3 -c "import json;m=json.load(open('paper-ds.json'));print(len(m['components']),m['tokensHash'])" (timeout 10s) ... (1 earlier lines, ctrl+o to expand) paper-ds/history: total 48 -rw-r--r--@ 1 justin wheel 23653 Oct 14 20:24 tokens-r1.json 15 ad7a869b Took 0.1s I wrote the manifest and a token snapshot. I didn't add or change anything in Paper, and I didn't add Foundations artboards. Files written (project root) - paper-ds.json is the manifest. - paper-ds/history/tokens-r1.json is the token snapshot: all 146 tokens from Paper, with the content hash ad7a869b. Choices recorded in the manifest - Themes: Light and dark, with each option shown as a pair of stages. Dark maps from .dark in src/globals.css to the --color-dark-* tokens. - Authority: Code is the source for both tokens and components. - Sheets: - Options are numbered. - There is no logo, so the slot stays out. - The "Gives up:" trade-off line and the Feedback notes line are both on. - Spacing is compact. - Stages: They use what the TEMPLATE already uses. That is --color-muted with a --color-border border in light, and --color-dark-muted with --color-dark-border in dark. - Node IDs: - TEMPLATE: The four sheets are mapped. - Foundations: The five existing artboards are mapped. - Components: The index and all 15 component pages and r1 artboards are mapped. - Exploration and review: Alert exploration and Alert review are recorded as page IDs only. - Components: The 15 are linked to sources/components/*.tsx. - Each is marked needsReview: true. - None has a current or implemented revision. - None is approved. - Divergences: Two are recorded. The Button secondary hover uses color-mix() in code, and dark mode needs separate tokens because a frame can't override variables. Not done - Screenshot checkpoints: I didn't save screenshots, get_jsx output or per-component baselines under paper-ds/history//r1/. The component r1 artboards are linked, but I haven't captured them as baselines. I can do that when you start work on a specific component. - Foundations: 05 Logo and 06 Font stacks are left out, as you asked. ──────────────────────────────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────────────────────────── /private/tmp/pdemo-home/demo/shadcn-app (main) ↑33k ↓6.6k R279k CH99.3% $0.160 4.5%/984k (auto) claude-sonnet-5-5 • medium To resume this session: pi --session 01a13cf0-f263-7227-996b-99c4e2ceb25b ~/demo/shadcn-app $ exit exit