upstream 取り込み PR #2: v2 UI 小粒 / marketing / 9 commits#398
Conversation
…rset-sh#3551) requestLocalNetworkAccess was defined in local-network-permission.ts but never called, so the Info.plist keys (NSLocalNetworkUsageDescription, NSBonjourServices) wired up in electron-builder never had a trigger to prompt the user. On macOS 15+ this causes outbound connections to local-network IPs from the app and its spawned child processes (node, python in the terminal) to be silently blocked, while system binaries like curl escape the same TCC attribution. Call it alongside requestAppleEventsAccess in app ready. Refs superset-sh#3474
…h#3553) Adds a Tasks nav entry (collapsed + expanded) alongside Workspaces, mirroring v1: paywall gate, last-used filter restoration, and active-route highlight.
…ojectPickerPill styling (superset-sh#3593) The footer rendered two DevicePicker instances bound to the same draft state. Remove the right-hand duplicate and restyle the remaining one to use FormPickerTrigger so the Device/Project/Branch pickers read as one segmented control (same text size, color, icon size).
…rset-sh#3622) Replace the fixed Tailwind `-500` palette (22 entries, ~5 grey families, several near-duplicate hue families) with a golden-angle hue generator over fixed-L/C OKLCH. Successive workspace names land far apart on the color wheel, eliminating the frequent collisions between concurrent dev workspaces.
…superset-sh#3563) * Remove video section * Rband * More brand * Move pills * CTA * Color * Grid line * polish marketing hero, CTA, and testimonials - Hero title: both segments at weight 500; "AI Agents." uses lo-res-21-ot-serif with Pixelify Sans fallback. - Subtitle: "Orchestrate 100+ coding agents in parallel" (keep rest). - Remove vertical grid lines from <main>. - Move ProductDemo pills back under the mockup (no scroll transform). - CTA heading matches FAQ styling; copy now "Try Superset now.". - Add `role` field to Iven's testimonial (Engineer at Paraflow). - TypewriterText: optional per-segment `render` for custom glyph rendering. - Simplify DownloadButton classes (unify with buttonClasses). * revert hero 'AI Agents.' styling to main version * swap feature-demo background to paper-design Dithering shader Replaces the canvas-based Bayer dither with @paper-design/shaders-react's <Dithering> shader (shape="warp", type="4x4"), lazy-loaded via React.lazy. Rendered at opacity 30% with mix-blend-screen over each card's palette. * slow feature-demo dither shader from 0.3 to 0.15 * subtle hover on trusted-by logo tiles (brighter border + bg) * soften Download button: ghost-style over solid foreground * recolor Download button ghost style to brand orange * match header CTA to brand ghost style * push CTA button text to a more saturated orange * restore cursor:pointer on <button> (Tailwind v4 preflight default is default) * unify header CTA with DownloadButton * update Chris Laupama role to TS Lead at Webflow * match TrustedBy heading style to WallOfLove * shrink TrustedBy heading one step * use original compact size on TrustedBy heading, keep semibold * update Elias role to Founder at Cleanroom * update Chase role to Founding Engineer at Decoda Health * update Felipe role to Codex at OpenAI * drop unused Adobe Fonts kit scaffolding and lo-res-22 font-family * restore mobile horizontal scroll on ProductDemo pills
…erset-sh#3639) * feat(marketing): redesign header and footer IA - Header: NavigationMenu dropdowns (Product, Resources) + Pricing, Enterprise top-level links; mobile hamburger with grouped flat list - Footer: Notion-inspired 4-column grid (brand | Company | Resources | Legal) with auto-width link columns for even spacing - Social icons: add LinkedIn + YouTube alongside Discord + X - Add @source directive to marketing globals.css so Tailwind v4 scans packages/ui (fixes NavigationMenu positioning classes not compiling) - Refresh navigation-menu.tsx to latest shadcn (adds radix-ui meta-package) - Add CAREERS_URL (YC), TRUST_URL, STATUS_URL, LINKEDIN_URL, YOUTUBE_URL to @superset/shared/constants * feat(marketing): add /pricing page Public pricing page mirroring the desktop plans page (Free / Pro / Enterprise) so prospects can see pricing before installing. - Tier cards with Monthly/Yearly toggle (default Yearly, Save 25% badge) - Comparison table: Usage / Features / Support / Security across 3 tiers, with Coming Soon pills on Remote workspaces, Mobile, CLI - FAQ with 4 plan-mechanic questions - Free + Pro CTAs point to DOWNLOAD_URL_MAC_ARM64 (billing happens in-app); Enterprise CTA routes to /enterprise contact form - Tier + comparison data duplicated in pricing/constants.ts rather than shared via packages/shared — desktop's Plan shape carries app-specific CTA actions, marketing copy will evolve independently - Add /pricing to sitemap (priority 0.9, monthly) * feat(marketing): mobile plan selector; tone down pricing roundings - ComparisonTable splits into desktop (full 3-col table) and mobile (3-pill selector + single-tier per-section view). Avoids horizontal scroll / column clipping on narrow viewports. - Pricing selectors, badges, and "Popular" pill move from rounded-full to rounded-sm/rounded-md to match the blocky marketing aesthetic.
upstream superset-sh#3593 は selectedProject?.needsSetup === true で警告を出すが、 fork の ProjectOption 型にはこのフィールドが無い (upstream superset-sh#3566 v2 project create/import の依存)。PR #2b で superset-sh#3566 を取り込んだ後に再追加する。
📝 WalkthroughWalkthroughデスクトップアプリケーションはローカルネットワークアクセス権限要求機能を追加し、ワークスペース色生成をハッシュベースの計算方式に変更。マーケティングサイトは大規模にリファクタリングされ、新しいヘッダーナビゲーション、価格ページ、フッター再設計が実装された。その他、タスク機能の追加、プロジェクト設定ナビゲーション改善、UI コンポーネントの更新が含まれる。 Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (2 warnings, 1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🧹 Preview Cleanup CompleteThe following preview resources have been cleaned up:
Thank you for your contribution! 🎉 |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (18)
apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx (1)
75-95: 分岐の重複を小さく整理できます(任意)。
renderの有無で<span>ラッパが重複しています。ラッパ側を一箇所にし、children のみ切り替える形にするとメンテが楽になります。挙動は同じなので任意対応で問題ありません。♻️ リファクタ案
- if (segment.render) { - return ( - <span - key={segment.text} - className={segment.className} - style={segment.style} - > - {segment.render(visibleText)} - </span> - ); - } - - return ( - <span - key={segment.text} - className={segment.className} - style={segment.style} - > - {visibleText} - </span> - ); + return ( + <span + key={segment.text} + className={segment.className} + style={segment.style} + > + {segment.render ? segment.render(visibleText) : visibleText} + </span> + );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx` around lines 75 - 95, The JSX duplicates the <span> wrapper for segments; refactor the return inside the TypewriterText component to render a single <span> and switch only the children: keep key={segment.text}, className={segment.className} and style={segment.style} on that single <span> and use {segment.render ? segment.render(visibleText) : visibleText} as its children so behavior stays identical while removing the duplicated wrapper code.apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx (2)
49-58: アクセシビリティ:handleが表示から消える点の確認
testimonial.role ?? testimonial.handleにより、roleが設定されているテスティモニアル(現状はほぼ全件)では Twitter ハンドル(@...)が UI 上で完全に非表示になります。カード全体がtestimonial.url(x.com へのリンク)になっているため機能上は辿れますが、視覚的にハンドル情報が失われるため、以下のいずれかを検討することをおすすめします:
roleとhandleを併記する(例:役職 ·@handle``)- ハンドルを
aria-labelやtitle属性として保持し、スクリーンリーダー/ホバーで参照可能にする意図的に役職のみ表示する方針であれば、このコメントは無視して問題ありません。
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx` around lines 49 - 58, The current UI uses testimonial.role ?? testimonial.handle which hides the handle when role exists; update WallOfLoveSection to preserve handle information by either rendering both (e.g., render testimonial.role followed by "·" and testimonial.handle) or keeping the handle on the element via attributes for accessibility (add title={testimonial.handle} and aria-label={`@${testimonial.handle}`} to the same span or the outer link that uses testimonial.url). Locate the span rendering testimonial.role ?? testimonial.handle and change it to output both values or add the title/aria-label so screen readers and hover users can access the handle while keeping the visible role.
73-78:Translatedボタンの非ホバー時ラベルが両ブランチで同一この変更範囲外ですが、Line 74 の三項演算子は両分岐とも
"Translated"を返しており無意味になっています(showOriginalの状態を示せていない)。近接変更のついでに、非ホバー時も状態に応じたラベル(例:showOriginal ? "Original" : "Translated")へ修正すると UX が改善します。♻️ 提案する修正
- <span className="group-hover:hidden"> - {showOriginal ? "Translated" : "Translated"} - </span> + <span className="group-hover:hidden"> + {showOriginal ? "Original" : "Translated"} + </span>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx` around lines 73 - 78, The non-hover label currently uses a ternary that returns "Translated" in both branches, so update the conditional in the WallOfLoveSection component to reflect the showOriginal state: change the first span's expression (the one with className "group-hover:hidden") to showOriginal ? "Original" : "Translated" so the UI shows "Original" when showOriginal is true and "Translated" otherwise, leaving the hover-state span (className "hidden group-hover:inline") as-is.apps/marketing/src/app/components/HeroSection/HeroSection.tsx (1)
29-31: フォールバック追加は妥当
monospaceフォールバックの追加により、--font-ibm-plex-monoのロード失敗時でも等幅フォントで描画される安全策となっており良い修正です。なお、Line 43 のTypewriterText側のfontFamily: "var(--font-geist-pixel-grid)"には同様のフォールバックが無いため、ここで合わせてmonospaceなどを追記しておくと一貫性が取れます(本 PR の範囲外でも可)。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/HeroSection/HeroSection.tsx` around lines 29 - 31, HeroSection adds a monospace fallback for --font-ibm-plex-mono which is good; mirror that change for the TypewriterText usage by updating the fontFamily declaration on the TypewriterText component (the property currently set to "var(--font-geist-pixel-grid)") to include a safe fallback like ", monospace" (e.g., "var(--font-geist-pixel-grid), monospace") so that if the custom font fails to load the text still renders with an appropriate fallback.apps/marketing/src/app/components/Footer/Footer.tsx (2)
88-94: Props 型はinterfaceで定義することを推奨。
FooterColumn/FooterLinkItemの props がインライン型リテラルで定義されています。コーディングガイドラインでは TypeScript のオブジェクト形状はinterfaceの使用が推奨されているため、FooterColumnProps/FooterLinkItemPropsとして切り出すと一貫性が向上します。♻️ 提案する差分
+interface FooterColumnProps { + title: string; + links: FooterLink[]; +} + -function FooterColumn({ - title, - links, -}: { - title: string; - links: FooterLink[]; -}) { +function FooterColumn({ title, links }: FooterColumnProps) { @@ -function FooterLinkItem({ link }: { link: FooterLink }) { +interface FooterLinkItemProps { + link: FooterLink; +} + +function FooterLinkItem({ link }: FooterLinkItemProps) {As per coding guidelines: "Prefer
interfacefor defining object shapes in TypeScript".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/Footer/Footer.tsx` around lines 88 - 94, The props for FooterColumn and FooterLinkItem are declared inline; extract them into named interfaces to follow the project's TypeScript style guide by creating FooterColumnProps and FooterLinkItemProps interfaces that describe { title: string; links: FooterLink[] } (for FooterColumn) and the corresponding shape used by FooterLinkItem, then update the function/component signatures (FooterColumn and FooterLinkItem) to use these interfaces instead of inline type literals to improve consistency and readability.
120-122: 装飾アイコンはaria-hidden指定を推奨。
ArrowUpRightはホバー時のアフォーダンスを示す純粋な装飾要素です。スクリーンリーダーに不要な要素として読み上げられないようaria-hidden="true"を付与することを推奨します(リンクテキストは既にlink.labelで伝達されています)。♻️ 提案する差分
- <ArrowUpRight className="h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100" /> + <ArrowUpRight + aria-hidden="true" + className="h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100" + />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/Footer/Footer.tsx` around lines 120 - 122, The decorative icon ArrowUpRight inside the Footer link is read by assistive tech; mark it as purely decorative by adding aria-hidden="true" to the ArrowUpRight element (in the Footer component where ArrowUpRight is rendered next to link.label) so screen readers ignore it while the link text remains accessible.apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx (1)
71-87: アクセシビリティ: Tasks ボタンにaria-label/aria-currentが未設定Collapsed 時はアイコンのみで可視ラベルが無く、Tooltip はフォーカス/ホバー時のみ表示されるためスクリーンリーダー利用者向けに
aria-label="Tasks"を付与するのが望ましいです。また、アクティブ状態(isTasksOpen/isWorkspacesListOpen)はナビゲーションとしてaria-current="page"を付与するとセマンティクスが向上します(既存の Workspaces ボタンにも同様)。今回の変更範囲の Tasks ボタンに限ってでも対応を検討してください。Also applies to: 152-164
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx` around lines 71 - 87, The Tasks button lacks accessible labeling and state semantics; update the button rendered in TooltipTrigger (the element using onClick={handleTasksClick} and rendering HiOutlineClipboardDocumentList) to include aria-label="Tasks" and add aria-current="page" when isTasksOpen is true (i.e., set aria-current={isTasksOpen ? "page" : undefined}) so screen readers get a persistent label and the active navigation state; apply the same aria-current pattern used for the Workspaces button for consistency.apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx (1)
27-27: テキスト色のみハードコードされています
bg-brand/10とborder-brand/20はブランドトークンを使っている一方、テキスト色だけtext-[#ff8c3a]とハードコードされた値になっています。apps/marketing/src/app/globals.cssで追加された--brand-light:#e8804a;(Tailwind トークンtext-brand-light)とほぼ同系統の色なので、テーマトークンに揃えた方が今後のブランド色変更時に追従しやすいです。現状の#ff8c3aは--brand-lightと完全一致はしないため、意図した色であれば新トークンを 1 つ足すのも手です。♻️ 提案差分(トークン化する場合)
- const buttonClasses = `bg-brand/10 text-[`#ff8c3a`] border border-brand/20 ${sizeClasses} font-normal hover:bg-brand/15 hover:border-brand/35 transition-colors flex items-center gap-2 ${className}`; + const buttonClasses = `bg-brand/10 text-brand-light border border-brand/20 ${sizeClasses} font-normal hover:bg-brand/15 hover:border-brand/35 transition-colors flex items-center gap-2 ${className}`;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx` at line 27, The buttonClasses string in DownloadButton.tsx hardcodes the text color as text-[`#ff8c3a`]; change this to use the theme token (e.g. text-brand-light) so it follows the brand token in globals.css (--brand-light) and stays consistent with bg-brand/10 and border-brand/20; update the class used in the buttonClasses constant (and add a new Tailwind token only if the desired color truly differs from --brand-light) so future brand color changes are applied consistently.apps/marketing/src/app/globals.css (1)
3-3: Stylelint の警告は Tailwind v4 構文による誤検出
@source/@theme/@theme inlineはいずれも Tailwind CSS v4 の正規ディレクティブであり、stylelint のscss/at-rule-no-unknownによる指摘は false positive です。対応として、stylelint 設定側で Tailwind のディレクティブをignoreAtRulesに追加しておくと、今後他ファイルでも同様のノイズを抑えられます(例:["tailwind", "apply", "layer", "config", "source", "theme", "utility", "variant", "custom-variant"])。修正は本 PR スコープ外でも問題ありません。Also applies to: 10-14
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/globals.css` at line 3, Stylelint is falsely flagging Tailwind v4 directives (`@source`, `@theme`, `@theme` inline) via the scss/at-rule-no-unknown rule; update the stylelint config to add Tailwind directives to ignoreAtRules (e.g., include "source", "theme", "tailwind", "apply", "layer", "config", "utility", "variant", "custom-variant") so these at-rules are treated as valid and the warnings in globals.css and other files stop appearing.apps/desktop/src/main/lib/dock-icon.ts (1)
12-20: ゴールデン角の適用方法とコメントの整合性について(任意)JSDoc では「successive workspaces land far apart」と記載されていますが、ゴールデン角による均等分散はシーケンシャルな整数インデックス(0,1,2,… × 137.508 mod 360)に掛けたときに成立する性質です。ここでは入力が既に擬似ランダムな
hash(workspaceName)なので、(hash * 137.508) % 360の分布は実質hash % 360と同等で、「連続するワークスペースが遠くに配置される」保証にはなりません(dev 用途なので実害はありません)。意図を活かすなら、ワークスペース名ではなく生成順インデックスを乗数に使うか、コメントを「名前ハッシュから決定的に色相を選ぶ(GOLDEN_ANGLE は色相空間の分散を意図した係数)」のように実装に合わせた表現へ微修正するのが素直です。
📝 コメント微修正の案
/** - * Deterministic workspace-name → RGB picker. Hashes the name to a hue via the - * golden angle (137.508°) so successive workspaces land far apart on the color - * wheel, then converts a fixed-lightness/chroma OKLCH point to sRGB. + * Deterministic workspace-name → RGB picker. Hashes the name into a hue + * (scaled by the golden angle for spread), then converts a fixed + * lightness/chroma OKLCH point at that hue to sRGB. */また、
L = 0.68/C = 0.18の組み合わせは一部色相で sRGB ガマット外となり、toSrgb内のMath.max(0, Math.min(1, v))で線形値がクランプされ、結果として意図より彩度の低い/色相のずれた色になる色相帯が存在します。dev 用のドックアイコン装飾なので許容範囲ですが、将来色の均質性が気になった際は C を少し下げる(例: 0.12–0.15)のが簡単な緩和策です。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/desktop/src/main/lib/dock-icon.ts` around lines 12 - 20, The JSDoc for pickWorkspaceColor misleadingly claims "successive workspaces land far apart" though the code multiplies a name hash by GOLDEN_ANGLE; because hash(workspaceName) is already pseudo-random this does not guarantee sequential spacing — either change the implementation to use a sequential index × GOLDEN_ANGLE (use generation order instead of hash) or update the comment to state that the function deterministically maps workspaceName via hash to a hue using GOLDEN_ANGLE; additionally, to avoid sRGB-gamut clipping in toSrgb when converting OKLCH, consider lowering C (e.g., to ~0.12–0.15) or document that L = 0.68 and C = 0.18 may clip for some hues.apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx (1)
11-33: 4色タプルを要求しているにもかかわらず、colors[0]しか使用していません。
DitheredBackgroundProps.colorsはreadonly [string, string, string, string]の 4 要素タプルを要求していますが、実装ではcolorFront={colors[0]}として最初の色のみを参照しており、残り 3 色は使用されていません。呼び出し側のFeatureDemoは constants.ts のFEATURESから 4 色全て(例:["#7f1d1d", "#991b1b", "#450a0a", "#1a1a2e"])を渡しているため、不要なデータを強制しているため、呼び出し側が不安になる可能性があります。基盤となる
@paper-design/shaders-reactのDitheringコンポーネントは 2 色シェーダーで、colorFrontは単一の色文字列のみをサポートし、複数色には対応していません。以下のいずれかに統一することを推奨します:
- シェーダーが実際に単色のみで運用されるなら、props を
color: stringに簡潔化する。- 将来的に複数色を活用する予定があるなら、TODO コメントで明示する。
♻️ 単色前提に簡潔化する例
interface DitheredBackgroundProps { - colors: readonly [string, string, string, string]; + color: string; className?: string; } export function DitheredBackground({ - colors, + color, className = "", }: DitheredBackgroundProps) { ... - colorFront={colors[0]} + colorFront={color}(呼び出し側
FeatureDemo/FeaturesSectionもcolor={colors[0]}に更新してください。)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx` around lines 11 - 33, DitheredBackgroundProps currently requires a 4-tuple but only uses the first element; change the API to a single color prop or document intent: update the DitheredBackgroundProps to use color: string (replace colors: readonly [string,...]) and adjust the component signature in DitheredBackground to read color (defaulting className as before) and pass colorFront={color} into the Dithering component; then update callers (e.g., FeatureDemo and wherever FEATURES constants are used) to pass color={colors[0]} or simplify FEATURES to supply a single color, or alternatively add a clear TODO comment in DitheredBackgroundProps explaining why a 4-tuple is accepted but only the first color is used if you intend to keep the tuple for future use.apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx (1)
10-31: アクセシビリティ: トグルをrole="group"でラップするのが望ましい2 つのボタンは排他的トグルとして
aria-pressedを付けているので機能的には問題ありませんが、外側のdivにラベル付きのrole="group"(またはradiogroupとして<input type="radio">構成)を与えると、支援技術で「Billing period」のまとまりとして認識しやすくなります。任意の改善案です。♻️ 提案
- <div className="inline-flex items-center gap-1 rounded-md border border-border bg-card p-1"> + <div + role="group" + aria-label="Billing period" + className="inline-flex items-center gap-1 rounded-md border border-border bg-card p-1" + >🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx` around lines 10 - 31, Wrap the toggle container in BillingToggle with an accessible group role and label: update the outer div in the BillingToggle function to include role="group" and a descriptive accessible name (for example aria-label="Billing period" or aria-labelledby pointing to a visible label), so screen readers treat the two ToggleButton items as a labeled exclusive group; no change needed to ToggleButton's aria-pressed behavior unless you opt to convert to real radios.apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx (1)
1-1:GridCrossへの相対的な深いインポートパス
@/app/blog/components/GridCrossを pricing 配下から直接参照しているため、blog 固有コンポーネントへの暗黙的な結合が生まれています。ヘッダー/フッターなど複数ページで再利用されるのであれば、app/components/等の共通置き場所に移動するか再エクスポートして、ページ間のディレクトリ依存を整理することを検討してください。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx` at line 1, PricingHero.tsx currently imports GridCross directly from "@/app/blog/components/GridCross", creating an implicit dependency on the blog page; to fix, move the GridCross component to a shared location (e.g., app/components/GridCross) or add a re-export from a common barrel (e.g., app/components/index.ts) and update the import in PricingHero.tsx to the shared path; specifically modify the import of GridCross in PricingHero.tsx to point at the new shared module and remove blog-specific coupling so other pages can reuse the component.packages/ui/package.json (1)
37-37:radix-uiメタパッケージと個別@radix-ui/react-navigation-menuの重複
navigation-menu.tsxはradix-uiメタパッケージからNavigationMenuをインポートしており、直接依存として残っている@radix-ui/react-navigation-menuは冗長です。他の Radix プリミティブもまだ個別パッケージを直接 import しているため現在は共存で問題ありませんが、将来的にradix-ui1 本に寄せるか、@radix-ui/react-navigation-menuを削除して重複した依存関係を整理することを検討してください。今回の PR では影響はありません。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/ui/package.json` at line 37, The package.json currently lists a redundant direct dependency "@radix-ui/react-navigation-menu" while the code (navigation-menu.tsx) imports NavigationMenu from the radix-ui meta package; remove the duplicate dependency from package.json (the "@radix-ui/react-navigation-menu" entry) or alternatively update imports in navigation-menu.tsx to consistently use the individual package—choose and apply one approach across the repo (refer to navigation-menu.tsx and the "@radix-ui/react-navigation-menu" dependency name to locate the change).apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx (1)
63-83:colSpan={4}がハードコードされており、ティア数の変更に弱いです現在は「Features 列 +
PRICING_TIERS3 列」で合計 4 になっていますが、将来PRICING_TIERSを追加/削除するとセクション見出し行が列をまたぎきれずレイアウトが崩れます。PRICING_TIERS.length + 1を使うと安全です。♻️ 提案
-function DesktopSectionGroup({ - title, - children, -}: { - title: string; - children: React.ReactNode; -}) { +function DesktopSectionGroup({ + title, + colSpan, + children, +}: { + title: string; + colSpan: number; + children: React.ReactNode; +}) { return ( <> <tr> <td - colSpan={4} + colSpan={colSpan} className="border-b border-border bg-accent/20 px-4 py-3 text-xs font-medium uppercase tracking-wide text-muted-foreground" > {title} </td> </tr> {children} </> ); }呼び出し側で
colSpan={PRICING_TIERS.length + 1}を渡してください。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx` around lines 63 - 83, The DesktopSectionGroup currently hardcodes colSpan={4}, which breaks if PRICING_TIERS changes; update DesktopSectionGroup to accept a numeric prop (e.g., colSpan) and use that instead of the constant so callers can pass PRICING_TIERS.length + 1; locate the DesktopSectionGroup function and replace the literal colSpan with the prop, and update its call sites to pass colSpan={PRICING_TIERS.length + 1}.apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx (1)
3-3:framer-motionをプロジェクト全体でmotion/reactに統一することを検討してくださいframer-motion v12.23.26 では、公式ドキュメントにより
motion/reactからのインポートが推奨されています。現在、プロジェクトは両方の import スタイルが混在しており、packages/ui/src/components/ai-elements/shimmer.tsxでは既にmotion/reactを使用しているのに対し、他の大多数のファイルはframer-motionを使用しています。整合性を図るため、motionパッケージへの統一的な移行と import パスの標準化が望ましいです。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx` at line 3, Update the framer-motion import in PricingFAQ.tsx: currently it imports AnimatePresence and motion from "framer-motion"; change this to the project's chosen React entrypoint (match the existing pattern used elsewhere, e.g. import AnimatePresence and motion from "framer-motion/react" or the project's "motion/react" alias) so the file's import for AnimatePresence and motion is consistent with packages/ui/src/components/ai-elements/shimmer.tsx and the rest of the codebase.apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx (1)
19-66: Esc キー / 外側クリックでの閉じる操作がありません現状トグルボタン以外では閉じられず、同一ルートへ遷移した場合もドロワーが開いたままになります(
onNavigateは異なるパス遷移時のみ効果的)。一般的なモバイルナビ UX に合わせて、Escapeキーや背景スクロール時の自動クローズを検討してください。必須ではないのでお好みで。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx` around lines 19 - 66, MobileNav currently only toggles via its button; add Escape-key and outside-click close plus optional background-scroll lock: create a ref for the motion.div panel and add a useEffect in MobileNav that (1) listens for 'keydown' and calls setIsOpen(false) when event.key === 'Escape', (2) listens for pointer/mousedown events on document and closes when the click target is outside the panel ref, and (3) when isOpen is true set document.body.style.overflow = 'hidden' and restore on close; ensure you clean up all listeners and restore overflow in the effect cleanup; keep existing close() and onNavigate behavior (MobileSection onNavigate still calls close).apps/marketing/src/app/pricing/constants.ts (1)
19-19:Partial<Record<string, string>>の冗長性を検討
featureLimitsフィールド自体が?で optional になっているため、Partial<>ラッパーは型上の実質的な利点がありません。また、
featureLimitsは PRICING_TIERS データ内で一度も使用されておらず、コードベース全体でも参照されていません。設計意図が「ティアごとの特定キー値マップ」であれば、キーセットをTierIdに限定して型安全性を高めることを検討してください:- featureLimits?: Partial<Record<string, string>>; + featureLimits?: Record<TierId, string>;ただし、このフィールドが将来的な使用を想定している場合は、そのまま保持してもかまいません。
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apps/marketing/src/app/pricing/constants.ts` at line 19, featureLimits フィールドは既に optional (?) なので Partial<Record<string, string>> のラップは冗長で、さらに PRICING_TIERS 内やプロジェクトで参照されていないため選択肢は三つです:不要なら featureLimits プロパティを削除して型をシンプルにする、将来保守のため残すなら型を Record<TierId, string> のようにキーを TierId に限定して型安全性を高める、あるいは本当に任意のキーを許す必要があるなら Partial を外して単に Record<string,string> | undefined にする — 対象は apps/marketing/src/app/pricing/constants.ts の featureLimits 宣言と PRICING_TIERS 定義を確認して意図に沿う選択を反映してください。
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@apps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsx`:
- Around line 48-52: The current unconditional onWheel handler on PopoverContent
(in ProjectPickerPill) calls event.stopPropagation() for every wheel event which
can block ancestor scroll handlers; instead, restrict wheel interception to the
actual scrollable dropdown content (e.g. the Radix CommandList) or only when
that content is scrollable/at its scroll bounds: move the wheel handler to the
CommandList component (or query/select the CommandList inside PopoverContent)
and call stopPropagation() only when the CommandList can scroll (scrollHeight >
clientHeight) or when the wheel would attempt to scroll beyond its bounds;
otherwise let the event bubble so modal/ancestor scroll logic still runs. Ensure
you update the onWheel attachment and logic around PopoverContent and
CommandList accordingly.
In
`@apps/marketing/src/app/components/Header/components/DesktopNav/DesktopNav.tsx`:
- Around line 72-94: FeatureCard currently links to "/" which is too generic for
the promo copy; update the Link href inside the FeatureCard component (the Link
wrapped by NavigationMenuLink in FeatureCard) to point to the specific product
page (e.g. "/desktop" or the intended landing route) or make href configurable
via props so the CTA directs users to the proper product/landing page instead of
the marketing root.
In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx`:
- Around line 84-105: The external anchor elements rendered in the links.map
branch don't call the onNavigate handler, so the drawer stays open when opening
external links; update the external branch (the <a> element rendered for
link.external) to include onClick={onNavigate} (keep target="_blank" and
rel="noopener noreferrer") so clicking external links also triggers the same
navigation/close logic as the internal Link branch; ensure the onClick prop is
added to the anchor that currently uses key={link.href}, href={link.href}, and
the same className so behavior and styling remain consistent.
In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx`:
- Around line 51-67: The region's aria-labelledby currently points to its own id
(contentId); change it to reference the FAQ trigger button's id instead (e.g.,
`${contentId}-trigger`). Add or update the trigger button element to include
id={`${contentId}-trigger`} and then set the motion.div's aria-labelledby to
that trigger id (use the same contentId base to build the trigger id). Ensure
the motion.div keeps id={contentId} for region identification but not as its own
label, and verify any toggle logic using isOpen still matches these ids.
---
Nitpick comments:
In `@apps/desktop/src/main/lib/dock-icon.ts`:
- Around line 12-20: The JSDoc for pickWorkspaceColor misleadingly claims
"successive workspaces land far apart" though the code multiplies a name hash by
GOLDEN_ANGLE; because hash(workspaceName) is already pseudo-random this does not
guarantee sequential spacing — either change the implementation to use a
sequential index × GOLDEN_ANGLE (use generation order instead of hash) or update
the comment to state that the function deterministically maps workspaceName via
hash to a hue using GOLDEN_ANGLE; additionally, to avoid sRGB-gamut clipping in
toSrgb when converting OKLCH, consider lowering C (e.g., to ~0.12–0.15) or
document that L = 0.68 and C = 0.18 may clip for some hues.
In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx`:
- Around line 71-87: The Tasks button lacks accessible labeling and state
semantics; update the button rendered in TooltipTrigger (the element using
onClick={handleTasksClick} and rendering HiOutlineClipboardDocumentList) to
include aria-label="Tasks" and add aria-current="page" when isTasksOpen is true
(i.e., set aria-current={isTasksOpen ? "page" : undefined}) so screen readers
get a persistent label and the active navigation state; apply the same
aria-current pattern used for the Workspaces button for consistency.
In `@apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx`:
- Line 27: The buttonClasses string in DownloadButton.tsx hardcodes the text
color as text-[`#ff8c3a`]; change this to use the theme token (e.g.
text-brand-light) so it follows the brand token in globals.css (--brand-light)
and stays consistent with bg-brand/10 and border-brand/20; update the class used
in the buttonClasses constant (and add a new Tailwind token only if the desired
color truly differs from --brand-light) so future brand color changes are
applied consistently.
In
`@apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx`:
- Around line 11-33: DitheredBackgroundProps currently requires a 4-tuple but
only uses the first element; change the API to a single color prop or document
intent: update the DitheredBackgroundProps to use color: string (replace colors:
readonly [string,...]) and adjust the component signature in DitheredBackground
to read color (defaulting className as before) and pass colorFront={color} into
the Dithering component; then update callers (e.g., FeatureDemo and wherever
FEATURES constants are used) to pass color={colors[0]} or simplify FEATURES to
supply a single color, or alternatively add a clear TODO comment in
DitheredBackgroundProps explaining why a 4-tuple is accepted but only the first
color is used if you intend to keep the tuple for future use.
In `@apps/marketing/src/app/components/Footer/Footer.tsx`:
- Around line 88-94: The props for FooterColumn and FooterLinkItem are declared
inline; extract them into named interfaces to follow the project's TypeScript
style guide by creating FooterColumnProps and FooterLinkItemProps interfaces
that describe { title: string; links: FooterLink[] } (for FooterColumn) and the
corresponding shape used by FooterLinkItem, then update the function/component
signatures (FooterColumn and FooterLinkItem) to use these interfaces instead of
inline type literals to improve consistency and readability.
- Around line 120-122: The decorative icon ArrowUpRight inside the Footer link
is read by assistive tech; mark it as purely decorative by adding
aria-hidden="true" to the ArrowUpRight element (in the Footer component where
ArrowUpRight is rendered next to link.label) so screen readers ignore it while
the link text remains accessible.
In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx`:
- Around line 19-66: MobileNav currently only toggles via its button; add
Escape-key and outside-click close plus optional background-scroll lock: create
a ref for the motion.div panel and add a useEffect in MobileNav that (1) listens
for 'keydown' and calls setIsOpen(false) when event.key === 'Escape', (2)
listens for pointer/mousedown events on document and closes when the click
target is outside the panel ref, and (3) when isOpen is true set
document.body.style.overflow = 'hidden' and restore on close; ensure you clean
up all listeners and restore overflow in the effect cleanup; keep existing
close() and onNavigate behavior (MobileSection onNavigate still calls close).
In
`@apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx`:
- Around line 75-95: The JSX duplicates the <span> wrapper for segments;
refactor the return inside the TypewriterText component to render a single
<span> and switch only the children: keep key={segment.text},
className={segment.className} and style={segment.style} on that single <span>
and use {segment.render ? segment.render(visibleText) : visibleText} as its
children so behavior stays identical while removing the duplicated wrapper code.
In `@apps/marketing/src/app/components/HeroSection/HeroSection.tsx`:
- Around line 29-31: HeroSection adds a monospace fallback for
--font-ibm-plex-mono which is good; mirror that change for the TypewriterText
usage by updating the fontFamily declaration on the TypewriterText component
(the property currently set to "var(--font-geist-pixel-grid)") to include a safe
fallback like ", monospace" (e.g., "var(--font-geist-pixel-grid), monospace") so
that if the custom font fails to load the text still renders with an appropriate
fallback.
In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx`:
- Around line 49-58: The current UI uses testimonial.role ?? testimonial.handle
which hides the handle when role exists; update WallOfLoveSection to preserve
handle information by either rendering both (e.g., render testimonial.role
followed by "·" and testimonial.handle) or keeping the handle on the element via
attributes for accessibility (add title={testimonial.handle} and
aria-label={`@${testimonial.handle}`} to the same span or the outer link that
uses testimonial.url). Locate the span rendering testimonial.role ??
testimonial.handle and change it to output both values or add the
title/aria-label so screen readers and hover users can access the handle while
keeping the visible role.
- Around line 73-78: The non-hover label currently uses a ternary that returns
"Translated" in both branches, so update the conditional in the
WallOfLoveSection component to reflect the showOriginal state: change the first
span's expression (the one with className "group-hover:hidden") to showOriginal
? "Original" : "Translated" so the UI shows "Original" when showOriginal is true
and "Translated" otherwise, leaving the hover-state span (className "hidden
group-hover:inline") as-is.
In `@apps/marketing/src/app/globals.css`:
- Line 3: Stylelint is falsely flagging Tailwind v4 directives (`@source`, `@theme`,
`@theme` inline) via the scss/at-rule-no-unknown rule; update the stylelint config
to add Tailwind directives to ignoreAtRules (e.g., include "source", "theme",
"tailwind", "apply", "layer", "config", "utility", "variant", "custom-variant")
so these at-rules are treated as valid and the warnings in globals.css and other
files stop appearing.
In
`@apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx`:
- Around line 63-83: The DesktopSectionGroup currently hardcodes colSpan={4},
which breaks if PRICING_TIERS changes; update DesktopSectionGroup to accept a
numeric prop (e.g., colSpan) and use that instead of the constant so callers can
pass PRICING_TIERS.length + 1; locate the DesktopSectionGroup function and
replace the literal colSpan with the prop, and update its call sites to pass
colSpan={PRICING_TIERS.length + 1}.
In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx`:
- Line 3: Update the framer-motion import in PricingFAQ.tsx: currently it
imports AnimatePresence and motion from "framer-motion"; change this to the
project's chosen React entrypoint (match the existing pattern used elsewhere,
e.g. import AnimatePresence and motion from "framer-motion/react" or the
project's "motion/react" alias) so the file's import for AnimatePresence and
motion is consistent with packages/ui/src/components/ai-elements/shimmer.tsx and
the rest of the codebase.
In `@apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx`:
- Line 1: PricingHero.tsx currently imports GridCross directly from
"@/app/blog/components/GridCross", creating an implicit dependency on the blog
page; to fix, move the GridCross component to a shared location (e.g.,
app/components/GridCross) or add a re-export from a common barrel (e.g.,
app/components/index.ts) and update the import in PricingHero.tsx to the shared
path; specifically modify the import of GridCross in PricingHero.tsx to point at
the new shared module and remove blog-specific coupling so other pages can reuse
the component.
In
`@apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx`:
- Around line 10-31: Wrap the toggle container in BillingToggle with an
accessible group role and label: update the outer div in the BillingToggle
function to include role="group" and a descriptive accessible name (for example
aria-label="Billing period" or aria-labelledby pointing to a visible label), so
screen readers treat the two ToggleButton items as a labeled exclusive group; no
change needed to ToggleButton's aria-pressed behavior unless you opt to convert
to real radios.
In `@apps/marketing/src/app/pricing/constants.ts`:
- Line 19: featureLimits フィールドは既に optional (?) なので Partial<Record<string,
string>> のラップは冗長で、さらに PRICING_TIERS 内やプロジェクトで参照されていないため選択肢は三つです:不要なら
featureLimits プロパティを削除して型をシンプルにする、将来保守のため残すなら型を Record<TierId, string> のようにキーを
TierId に限定して型安全性を高める、あるいは本当に任意のキーを許す必要があるなら Partial を外して単に Record<string,string>
| undefined にする — 対象は apps/marketing/src/app/pricing/constants.ts の
featureLimits 宣言と PRICING_TIERS 定義を確認して意図に沿う選択を反映してください。
In `@packages/ui/package.json`:
- Line 37: The package.json currently lists a redundant direct dependency
"@radix-ui/react-navigation-menu" while the code (navigation-menu.tsx) imports
NavigationMenu from the radix-ui meta package; remove the duplicate dependency
from package.json (the "@radix-ui/react-navigation-menu" entry) or alternatively
update imports in navigation-menu.tsx to consistently use the individual
package—choose and apply one approach across the repo (refer to
navigation-menu.tsx and the "@radix-ui/react-navigation-menu" dependency name to
locate the change).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 23fe4065-f037-4561-9732-9cfa2e82261c
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (52)
apps/desktop/src/main/index.tsapps/desktop/src/main/lib/dock-icon.tsapps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsxapps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.tsapps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsxapps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/components/WorkspaceHoverCard/WorkspaceHoverCard.tsxapps/marketing/package.jsonapps/marketing/src/app/components/CTAButtons/HeaderCTA.tsxapps/marketing/src/app/components/CTASection/CTASection.tsxapps/marketing/src/app/components/DownloadButton/DownloadButton.tsxapps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/FeatureDemo.tsxapps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsxapps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/index.tsapps/marketing/src/app/components/Footer/Footer.tsxapps/marketing/src/app/components/Header/Header.tsxapps/marketing/src/app/components/Header/components/DesktopNav/DesktopNav.tsxapps/marketing/src/app/components/Header/components/DesktopNav/index.tsapps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsxapps/marketing/src/app/components/Header/components/MobileNav/index.tsapps/marketing/src/app/components/Header/components/SupersetLogo/SupersetLogo.tsxapps/marketing/src/app/components/Header/components/SupersetLogo/index.tsapps/marketing/src/app/components/Header/constants.tsapps/marketing/src/app/components/HeroSection/HeroSection.tsxapps/marketing/src/app/components/HeroSection/components/ProductDemo/ProductDemo.tsxapps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsxapps/marketing/src/app/components/SocialLinks/SocialLinks.tsxapps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsxapps/marketing/src/app/components/VideoSection/VideoSection.tsxapps/marketing/src/app/components/VideoSection/index.tsapps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsxapps/marketing/src/app/components/WallOfLoveSection/constants.tsapps/marketing/src/app/globals.cssapps/marketing/src/app/layout.tsxapps/marketing/src/app/page.tsxapps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsxapps/marketing/src/app/pricing/components/ComparisonTable/index.tsapps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsxapps/marketing/src/app/pricing/components/PricingFAQ/index.tsapps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsxapps/marketing/src/app/pricing/components/PricingHero/index.tsapps/marketing/src/app/pricing/components/PricingTiers/PricingTiers.tsxapps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsxapps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/index.tsapps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/PricingCard.tsxapps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/index.tsapps/marketing/src/app/pricing/components/PricingTiers/index.tsapps/marketing/src/app/pricing/constants.tsapps/marketing/src/app/pricing/page.tsxapps/marketing/src/app/sitemap.tspackages/shared/src/constants.tspackages/ui/package.jsonpackages/ui/src/components/ui/navigation-menu.tsx
💤 Files with no reviewable changes (3)
- apps/marketing/src/app/components/VideoSection/VideoSection.tsx
- apps/marketing/src/app/components/VideoSection/index.ts
- apps/marketing/src/app/page.tsx
Summary
upstream (superset-sh/superset) の残 67 commits 中、fork 固有機能と衝突しない 9 commits を慎重に cherry-pick。PR #388 の教訓を反映し、バッチサイズを 8-12 に抑え、事前 Codex 調査・fork 固有機能 baseline 検証・silent regression 検出手順を標準化。
取り込み内容(9 commits)
Desktop (v2 UI 小粒・スタートアップ・UX):
Marketing:
事前調査で PR #2 から除外した commits
Codex 事前分析 (
/tmp/pr2-codex-preanalysis.md) により以下を PR #2 から外し、PR #2b / #5 へ移動:e964940e9d2b(fix(desktop): stop spurious folder picker on settings → dashboard nav superset-sh/superset#3602 folder picker 抑制) → PR #2b: 前提 commit1f2c093558a8(feat(v2): minimal project create/import for workspaces superset-sh/superset#3566 v2 project create/import) が scope 外1e2302f1bbdd(feat(desktop): infer project name from folder on import superset-sh/superset#3605 folder-first import name inference) → PR #2b: 同じく1f2c093558a8前提3fc7027b62da(chore(ci): pin third-party GitHub Actions to commit SHAs superset-sh/superset#3631 CI pinning) → 既取り込み判定: fork 側で既に全 workflow が pin 済み、残差分は fork 独自の@vscode/ripgreppostinstall step のみFork 側のコンフリクト解決
apps/desktop/src/main/index.ts(fix(desktop): trigger macOS Local Network permission on startup superset-sh/superset#3551): fork の browser MCP / todo-agent / vscode shim / host-service coordinator alias / 各種 protocol handler を全て維持しつつrequestLocalNetworkAccess()をrequestAppleEventsAccess()直後に追加DevicePicker.tsx/PromptGroup.tsx(fix(desktop): dedupe DevicePicker in new-workspace modal and match ProjectPickerPill styling superset-sh/superset#3593): fork は既に重複削除 + Button ベース UI。upstream のFormPickerTrigger移行は fork 固有 UI を壊すため不採用。needsSetup警告は upstream 依存 (feat(v2): minimal project create/import for workspaces superset-sh/superset#3566) が fork に未取り込みのため削除 (PR #2b で再追加予定)bun.lock(polish(marketing): hero font, pixel-dithered demos, testimonials, CTA superset-sh/superset#3563, feat(marketing): add /pricing page and redesign header/footer IA superset-sh/superset#3639): upstream 依存 (@paper-design/shaders-react,radix-ui/*) を採用しつつansi_up/@vscode/ripgrep/@xyflow/reactの fork 依存を維持。bun installで lockfile 整合性確認済み.github/workflows/deploy-preview.yml(chore(ci): pin third-party GitHub Actions to commit SHAs superset-sh/superset#3631 一部): fork は既に Electric deploy を削除済み、upstream が追加しようとしたdeploy-electricジョブは取り込まないFork 固有機能ヘルスチェック
作業前 baseline (
/tmp/pr2-baseline/fork-features.txt) と作業後を grep で照合。全 14 項目変化なし:ansi_up,@vscode/ripgrep,@xyflow/reactTERMINAL_OPTIONS(5 ファイル)SUPERSET_WORKSPACE_NAME(24 箇所)moonshot-ai.kimi-code)MainWindowEffectstearoff ガードINCEPTION_AUTH_PROVIDER_IDlistBranchessortOrder (4) / pinDefault (3)BROWSER_RELOADhotkeysport-scanner.tsWindows 分岐electron-builder.tsdmg.size="4g"Silent Regression 検出
Codex 事前分析で警告された以下のファイルを作業後に再検証し、fork 実装が silently 上書きされていないことを確認:
apps/desktop/src/main/index.tsDashboardSidebarHeader.tsxPromptGroup.tsx/DevicePicker.tsx/ProjectPickerPill.tsxapps/marketing/src/app/globals.csspackages/shared/src/constants.tspackages/ui/package.jsonbun.lockTest plan
bun install正常完了bun run typecheckグリーン (27/27 task)bun run lintグリーン (4055 files checked, biome 指摘ゼロ)/pricingページ表示次の PR
1f2c093v2 project create 前提 commits + Chat UX + scheduled agent runs)Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
Style & UI Updates