尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Context for Claude 首次运行体验解析:macOS 首次启动的 6 阶段引导、权限编排与 Claude 集成全流程

Context for Claude 首次运行体验解析:macOS 首次启动的 6 阶段引导、权限编排与 Claude 集成全流程 Context for Claude 首次运行体验解析macOS 首次启动的 6 阶段引导、权限编排与 Claude 集成全流程【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend导读本文以 desktop/context-for-claude/docs/first-run-experience.md 为核心系统拆解 Context for ClaudemacOS 上的看得见你的屏幕、听得见你的对话的 AI 配件应用的首次运行First-Run体验设计。你会读到贯穿全程的只教真实存在的东西原则、从品牌去 Anthropic 化到合成音频、拖拽式 DMG、电影开场、六卡引导、四权限编排以及一个以真实 Activity 面板、真实搜索结果、真实 Claude 工具调用收尾的 11 节拍教程。读完你既能理解这套引导架构的每一条设计决策与踩坑修正也能拿到可直接复用的验证与调试命令。一、核心原则应用有一扇正门Claude 与用户读的是同一个 Store首次运行体验的设计前提只有一句话这个应用有一扇正门而 Claude 通过同一个 Store 读取它。整个首次运行承担四件按序完成的工作看起来无可挑剔look unmistakably good诚实地取得同意take consent honestly向 Claude 完成注册register with Claude证明整套系统真的运转——带用户走完应用自己的界面并以 Claude 给出的真实回答作为终点。在这四条之下只有一条不可动摇的规则也是全文反复出现的唯一金科玉律首次运行不得教授一个应用并不存在的界面或手势也不得演示一个它没有真实获得的结果。这条规则最初被写反过一次规划文档撰写时产品还没有自己的检索界面于是写下搜索栏就是 Claude本应用不提供搜索面板、不可回放的时间线、也没有全局热键——而这句话的三个分句全部过时了。文档把这段错误记录在案而不是删除因为后续所有过时指令都源于它。理解现在真正发货的是什么是读懂后面全部设计修正的前提。应用现在真正拥有的界面与旧文档声明的差异Activity 主干Activity spine是主界面一条按天分组、按时间排序的对话/记忆/任务/屏幕时刻流带过滤芯片行All · Conversations · Memories · Tasks · Rewind与小时轨道hour rail。它在用户输入任何文字之前就于悬浮面板内给出答案因此应用一打开就落在这条主干上见 ActivitySurface.swift 与 SearchBarView.swift。对话、记忆与任务来自用户的 Omi 账号屏幕时刻是本地数据。账号不可达是界面必须区分于空的一种普通状态——因此价值卡片的同意文案必须把账号写成用户自己也能读回的东西而不只是给 Claude 看OnboardingView.valueClaims。两个全局和弦均可重绑定⌘ ⌘左右两个物理 Command 键同时按下不是双击打开 Activity⌘⌘⇧切换同一表面。动作名为GlobalShortcuts.Action.openActivity原openTimeline因窗口变化而改名但持久化的标识符故意保留openTimeline让已记录的绑定得以存活见Action.storageKey。两个和弦在未获得辅助功能Accessibility授权时都不会触发——这是整个流程中唯一列出但从不强制的权限因此任何提到和弦的文案都必须先查询GlobalShortcuts.readiness。时间线不再是落地页从面板头部的Timeline ⌘T胶囊、菜单栏的 Open Timeline 行或激活某个时刻进入。设置则是同一头部的齿轮与菜单栏。面板是 Spotlight 式面板无边框、不激活non-activating、不把应用带到前台、按 Esc 即消失。GlobalShortcuts在 GlobalShortcuts.swift 中把⌘ ⌘建模为独立的bothCommandKeys手势——因为NSEvent.ModifierFlags对两个 Command 键只有一个.command位两个 Command 键无法用修饰词词汇表拼写必须单独成类、单独打印⌘ ⌘而非⌘⌘后者是双击的另一种手势。二、Phase 0去 Anthropic 化品牌把菜单栏做成原生菜单现状的问题界面视觉是 Anthropic 的Anthropic clay而菜单栏是重灾区。四个改动项如下#改动位置0.1停止强制NSApp.appearance .aqua跟随系统外观ContextApp.swift文档标注:490.2恢复原始模板标记template markMenuBar/ContextMark.swift对照提交git show 2920115b85:desktop/context-for-claude/Sources/ContextApp/MenuBar/ContextMark.swift0.3菜单栏面板改回原生度量StatusView.swift 与Ink.swift:638-6430.4替换 Anthropic 调色板与衬线展示字体Onboarding/Ink.swift:57-108、315-358、420-4670.1 是颜色看起来不对劲的根因全应用强制.aqua会让弹出面板变浅而周围系统菜单是深色。删除该覆盖即可——面板本就使用原生语义色会自然匹配。0.2几何形状从未变过头、两只椭圆眼、两条弯曲腿。原版设置NSColor.blackimage.isTemplate true由 macOS 按菜单栏外观自动反色并在非激活时变暗当前版本硬编码陶土色#D97757且isTemplate false。恢复 template 就是全部修复。0.3原生菜单没有填充行胶囊、没有自定义字距、行高约 22pt、没有卡片内边距。应去掉InkPermissionRow(native:)的quaternaryLabelColor.opacity(0.5)填充、去掉该表面的.inkStyle字距、使用Divider()并让行高交给系统。文档还建议评估把NSPopover换成内含NSHostingView行的真NSMenu——真正的菜单是唯一读起来像菜单的东西。0.4调色板确实是 Anthropic 的——paper #FAF9F5、ink #141413、bronze #D97757源码注释直接称其 Anthropic clay且所有 ≥22pt 角色使用系统衬线New York。替换方向强调色NSColor.controlAccentColor——用户自己选的重音色最原生也绝非借来的品牌绝不使用紫色INV-UI-1。中性色系统语义色labelColor、secondaryLabelColor、separatorColor、材质不再手调 paper/ink。展示字体Open Runde已随包分发在Resources/Fonts/OpenRunde-*.otf目前被衬线切换冷落几何感、辨识度高、是我们自己的。正文保持 SF Pro。标记本身回到 template 黑白0.2随处正确反色。另外Resources/ContextForClaude.icns从未被 restyle 提交动过、仍携带旧调色板——要用恢复后的标记重新生成。三、Phase 1全程合成音频做到许可证干净现状项目里没有任何 UI 声音基础设施NSSound/AVAudioPlayer/AudioServices命中为零。方案是不下载任何音乐所有素材在本机生成因此无许可负担。生成器scripts/make-sounds.pynumpy 标准库wave48 kHz匹配 Core Audio免重采样16-bit PCM输出到Resources/Sounds/pad.wav后为 pad.m4a——环境氛围底四组正弦泛音C3 130.81、G3 196.00、C4 261.63、E4 329.63每组叠加一个安静的三角波高八度成对 detune ±3–5 分声像 ±15–20%。包络 A3s/D1s/S0.7/R4s 加 0.05–0.1 Hz 振幅 LFO。伪混响350–450 ms 反馈延迟 180 ms 早反射 tap反馈 0.35–0.45湿声 25–30%反馈路径低通 4–6 kHz。结尾 2 s 与开头交叉淡化使numberOfLoops -1无缝循环峰值 −6 dBFS。swoosh.wav——250–400 ms 的嗖声白噪声经带通Q 2–4从 400 Hz 扫到 3–4 kHz用 overlap-add STFT 幅度整形20–50 ms 窗下方叠一个轻柔的 150→600 Hz 啁啾。Attack 10–20 ms偏斜 Hann 峰约在 40% 处指数衰减。峰值 −8 至 −10 dBFS。click.wav——40–80 ms 的 UI 点击1 kHz 的 tick 更安静的 300–400 Hz 主体音高从 1000→700 Hz 弯曲。Attack 1–3 ms快速指数衰减无 sustain。单声道峰值 −12 dBFS它会频繁重复。chime.wav——权限授予成功与最终 all set 的成功提示音。播放层Sound.swift音乐单个AVAudioPlayernumberOfLoops -1用setVolume(_:fadeDuration:)做淡入淡出——绝不硬切。音效AVAudioEngine 预载AVAudioPCMBuffer的AVAudioPlayerNode池让高频点击可以重叠而不产生分配延迟。界面声音click、swoosh遵循系统设置通过CFPreferencesCopyAppValue(com.apple.sound.uiaudio.enabled, com.apple.systemsound)读取AVAudioPlayer与AVAudioEngine都不会自动尊重它。电影氛围底是内容而非界面声音由自己的显式静音开关控制。随本阶段修复的一个 BugCapture/SystemAudioCapture.swift构建 tap 时用了CATapDescription(stereoGlobalTapButExcludeProcesses: [])——空排除列表意味着全局 tap 会录进包括本应用在内的每一个进程引导音乐和嗖声会落进用户自己的转录里。修复无条件排除本进程 pid覆盖整个进程生命周期不仅引导期——设置界面在采集会话运行期间也会触发点击声。那个显然正确的一行修复其实是错的并在实现中已被纠正。文档早期版本推荐过// WRONG — does not compile, and would not have worked if it did. CATapDescription(stereoGlobalTapButExcludeProcesses: [pid_t(ProcessInfo.processInfo.processIdentifier)])stereoGlobalTapButExcludeProcesses接收的是[AudioObjectID]——CoreAudio 进程对象ID不是 pid。把 pid 传进去会看起来修好了而自己的音频依然落进 tap本机实测pid 77685 对应对象 164。真正的修复先经kAudioHardwarePropertyTranslatePIDToProcessObject做转换且两个 tap 站点共用同一个工厂避免再次漂移。需要两个测试而非一个排除列表非空且包含本进程对象。证明方式回退修复并看着测试失败——一个对坏代码和好代码都通过的断言不配叫回归测试。isExclusive true且muteBehavior .unmuted。把exclusive翻转会把列表含义反转为只录我们那将比被修的问题严重得多且能通过第一个测试。如果 pid→对象转换失败实现记录日志并开放回退空排除列表而不是拒绝采集。这是刻意的权衡暴露面仅限于本应用自己的 UI 声音而失败即关闭会静默禁用产品的核心功能。四、Phase 2真正可拖拽安装的 DMGscripts/package-dmg.sh文档标注:79-91当前直接从暂存文件夹产出普通UDZO镜像/Applications符号链接已有其余未做任何美化。scripts/make-dmg-background.sh用 ImageMagick已安装7.1.1-47渲染 1x 与 2x 背景左上角 wordmark、Drag Context for Claude into Applications to install 文字、两个图标位之间的箭头。不放标记mark——早期版本把应用字形从.icns提到左上角导致标记上屏两次Finder 会在左槽真实绘制应用图标位于其下方 130 pt 处而那正是窗口存在的意义——被拖进 Applications。再放一个更小的复制品是干扰物不是品牌。走廊保持为箭头这是平台限制而非偏好。曾构建过虚线弧 沿弧飞行的半透明磁贴的动画版本并回退人们真正想要的是应用被拖入 Applications 的连续动画而没有任何磁盘镜像能实现它。Finder 从.DS_Store记录的静态图片路径取窗口背景且只绘制一次GIF/视频只能渲染成单帧macOS 早已不再从挂载卷自动运行任何东西因此 DMG 上没有任何机制能在不先由用户启动的情况下驱动动画。暗示运动的静帧比箭头更糟——它会引诱用户再次提出同样的诉求。真正能动画的方案都要运行用户启动的代码镜像内的安装器应用——需要 Gatekeeper 提示与第二个已签名二进制或应用首次启动时自行移出/Volumes两者都不在本阶段范围内。package-dmg.sh增加标准美化流程无新依赖create-dmg未安装且不值得引入hdiutil create -format UDRW→hdiutil attach -readwrite -noverify -noautoopen→ 放入.background/background.png.VolumeIcon.icnsSetFile -a C卷 → Finder AppleScript →hdiutil detach→hdiutil convert -format UDZO。AppleScript 必须设置open磁盘、图标视图、隐藏工具栏/状态栏、容器窗口bounds、icon size 128、arrangement ... not arranged、背景图片为相对别名.background:background.png、对 app 与Applications显式设置position of item、然后update without registering applications、delay、close。坑位清单卷必须先在 Finder 中打开仅挂载不够才能设置位置arrangement必须是not arranged否则 Finder 会重新吸附到网格并丢弃位置背景路径必须是相对别名而非绝对路径镜像必须在convert前完全 detach首次运行需要 shell 驱动 Finder 的自动化权限因此要检测并在失败时大声报错而非挂起。仓库中 Resources/DMG/background.png及其 1x/2x 变体正是该脚本产出的安装背景图。五、Phase 3首次运行电影开场cinematic一个无边框透明窗口浮在变暗的桌面上。OnboardingWindow当前是固定 720×640 的浮动卡片OnboardingWindow.swiftcardSize电影开场需要一个覆盖指针所在显示器全屏的变体之后在 Phase 4 缩回卡片。六个节拍每拍配自己的声音变暗Dim——桌面约 0.6 s 变暗音乐淡入。绘制标记Build the mark——恢复后的标记自绘头、眼睛、腿依次wordmark 随后显形。这是应用自我介绍的时刻故停留一拍。收束为一条横杠Collapse to a bar——标记与 wordmark 经 matched geometry 变形为一条水平横杠。拉伸成输入框Stretch into a prompt——横杠加宽成提示输入框标记在左、光标在右一个问题自己打出来what was I working on today?。拉伸伴随嗖声。窗口嗖然飞入Windows swoosh in——一片窗口卡片从屏外错峰飞入、落成网格、随后漂浮每扇窗各自的长周期、静止倾角与跟随静止比例的视差。这些窗口是合成的、每次运行完全相同——由 CinematicWindowArt.swift 绘制通用应用窗口绝不用用户被采集的帧也绝不伪造截图。该文件的类型只携带数字、其中没有任何视图能绘制文字因此窗口不可能命名某个应用、某个人或某条消息。为什么删除真实帧路径而非保留为回退见 CinematicWindows.swift 的文件头说明首次运行的 Store 按构造即为空回退路径就是发货路径。**退回Recede**到欢迎卡片。约束Esc与可见的 Skip intro 可在任何时刻中止InkReduceMotion已存在把所有运动节拍折叠成交叉淡化整个序列必须幂等一旦context.onboarded置位就绝不再播。六、Phase 4引导卡片——六张卡、一个可被断言的状态机流程welcome → value → sign in to Omi → permissions → connector → tutorial intro → done带进度圆点与点击音。状态机是OnboardingStepOnboardingView.swift它被建模为带纯函数itinerary/next/back/progressSteps的值类型而不是视图内部的私有枚举——因为顺序正是容易答错的部分而View无法被断言。关键设计决策每条都有源码注释背书登录先于权限是刻意的。所有录制内容都落在 Omi 账号里而权限才是开始录制的开关所以在向 macOS 要麦克风之前账号必须已知。恢复的会话只丢弃.signIn别的什么都不丢。从.permissions起拒绝返回Back。TCC 每个提示只显示一次、不会撤销询问因此回退到一张已完成的同意流程卡片毫无意义——提供无法工作的按钮比不提供更糟。最后一张卡的两个出口都会封存本次运行seal the run。.done的finish()与教程交接都调用sealTheRun()——登录项、context.onboarded、OnboardingResume().clear()、音乐停止。旧版交接会跳过全部四项导致走完引导的应用仍是未引导状态下次启动卡片又弹出来。恢复点被纠正到本次运行的 itineraryOnboardingStep.resumed。记录里存的是卡片而 itinerary 在启动时按是否恢复了会话重建两者可能不一致——例如一次记录了.signIn、回来时却已恢复账号的运行会停在那张该次运行根本不存在的卡片上让已登录的人再登一次。修正规则与next(after:)对中途掉出的步骤相同交回其后第一张仍在的卡片.done是兜底。done卡同时点名两条进入路径菜单栏MenuBarSpotlight在行显示期间敲响与和弦从GlobalShortcuts打印未武装时省略。done卡始终监听屏幕授权只在有时才打开设置面板OnboardingFinale。旧版把两者绑成一个条件而搁浅了一次运行未授权卡片唯一控件是 Open Screen Recording而监听只对未推迟屏幕行的运行武装——于是按了 Ill do these later 的用户到达一张既无法察觉授权、也没有按钮能关掉的最后卡片背后还是无 Dock 图标的无边框窗口。现在刻意的 later 直接关闭流程只要授权缺失无论缺失原因监听都会运行。OnboardingFinale把是否监听与是否打开面板拆成两个独立字段并新增askIsSpent/relaunchIsSpent/screenRecordIsUnusable防止开关已开却反复让用户重开的二次搁浅对应PermissionDeadEnd文档化的状态。Accessibility 行从不说 AllowOnboardingView.statusWord。macOS 在任何时刻都没有对应的对话框——Permissions.request(.accessibility)只会打开设置面板——因此第一帧起就是 Open Settings而不是先浪费一次并不存在的提示。OnboardingStep的纯函数实现印证了这些规则itinerary(signedIn:)仅在未登录时包含.signInnext(after:signedIn:)对已掉出 itinerary 的步骤返回其后的第一张剩余卡片因为一步刚完成自己的工作就可能把自己从清单上删除back(from:signedIn:)从.permissions起一律返回nil。七、Phase 5权限编排——引导并高亮真实行永不重绘系统 UImacOS 26 自己绘制拖拽示意。虚线行与Drag this row up into the list箭头是 System Settings 26.x 的 UI——没有应用能画进那个窗口。因此策略是引导并高亮真实的东西绝不自绘或模拟不在我们的卡片里预演。卡内幽灵副本已移除它让用户先按 Show me the row 才发生任何事等于我们的 UI 挡在真实任务前面。现在当能力需要时引导直接出现在真实窗口上。打开精确面板Permissions.swift 的Capability.settingsPane已有逐能力 URL再通过 Accessibility APICapture/AXElement.swift已封装 AX定位 System Settings 窗口与拖拽目标行绘制浮动覆盖层脉冲圆环 指向真实行的动画手。行上显示实时等待状态TCC 一报告授权即翻转为对勾伴chime.wav。屏幕录制还额外需要既有的重启提示——窗口服务器只在新进程中兑现授权。行的顺序按卡片列出的顺序屏幕、辅助功能、麦克风、系统音频。必需子集是麦克风、系统音频与屏幕辅助功能被列出但从不强制——macOS 没有对应对话框用一枚需要手拨的开关卡住卡片会搁浅任何不愿离开流程的人。屏幕排第一因为两个行定位器各自需要对方的授权而授予屏幕正是让之后每个面板的行可被找到的前提——完整论证在PermissionInvitations.listed上它是两个列表的唯一拥有者。任何其他位置不得复述该顺序OnboardingView里曾有一份副本比它描述的顺序多活了一次重写。权限保持一次一个且剧集内先导文案/授权后节奏得以保留——那是早先刻意的修复不可回退。真正被回退的是自动排序卡片不再自行索要任何东西。每个能力是一行、由用户点击只有那次点击才启动它的剧集PermissionInvitations.swift。节奏从来不是问题把它花在用户并未要求的提示上才是——对话框在解释它的句子被读完之前就弹了出来。源码层面值得注意的实现在Permissions.swiftCapabilityGroup保证一组只有在每个成员都授权时才显示 GrantedfirstMissing是纯函数Permissions.ScreenBlock用纯函数screenBlock(granted:hasEverCaptured:needsRelaunch:recordIsUnusable:)把屏幕状态区分为notGranted/grantLost/needsRelaunch/recordUnusable四态spawnRelaunchHelper()用一个被 reparent 到 launchd 的/bin/sh循环kill -0等待本进程退出后再open应用包——先布置替代者再结束进程是重启以完成授权这条路径正确性的全部。八、Phase 6教程——走遍应用自己的界面在 Claude 内部结束十一个节拍TutorialStep.flow就是那张清单TutorialStep.swift。本段最初写时只有六拍且全部是卡片或 Claude——因为应用还没有自己的界面可走。当前十一拍里有四拍是应用自己的窗口openActivity、timeline、findMoments、query。Onboarding 的.tutorial卡是入口其附注必须描述这个而不是过去那个一分钟跳到 Claude的流程。invitation——Let me show you what I do开始 / 跳过。screenAccess——屏幕录制只在此处、且仅在它确实缺失时索要。已授权与授权已生效是两个不同事实流程两者都读TutorialEnvironment.screenNeedsRelaunch。macOS 在程序连接窗口服务器时决定其可采集范围因此应用运行期间取得的授权会预检为已授权却采不到任何东西直到应用重启。这是普通首次运行而非边缘情况引导的权限卡正是授权通常被取得之处而教程交接从提供重启那张卡之前的卡片离开。未加测试时走查会感谢用户它并不拥有的视力然后在 45 s 耐心时限里干等不可能到来的帧卡片却还叫用户继续滚动它打开的那页。该拍现在说明原因、不打开任何页面、并立即给出绕过之路——与未武装的和弦、未打开的时间线获得相同处理——TutorialOutcome把原因以.cannotSeeYet一路带到结束卡。collectFrames——打开anthropic.com/researchClaude 自己的网站这个应用能放到用户屏幕上而无需替他们挑选第三方内容且页面上有足够可滚的内容请用户滚动它。首页又短又静态而采集做感知去重滚到底也产生不了多少帧。门禁读取我们自己的 StoreTutorialGate.realFrames真实帧不是伪装成帧的计时器。计数不被叙述卡片只说Scroll through it for a bit然后 Got it并且只在NSWorkspace确认页面真的打开时才声称打开过。openActivity——和弦只有一种教和弦的方式用户按下⌘ ⌘真实的 Activity 面板因为他们按下而打开门禁是真实快捷键真的触发TutorialGate.realHotkey。此拍曾是openTimeline把和弦教成通往时间线的路——它不是于是节拍跟随行为而不是保留旧课。timeline——拖过被采集的一天这是产品变得显然的时刻。教程自己打开那个窗口并明说因为和弦不再做这件事穿越动作仍必须是用户的TutorialGate.realGesture。findMoments——真实的 Search All 胶囊门禁是真实搜索面板在屏。query——在真实搜索栏里输入并点击真实命中项以穿越到它。刻意不用 Return在该面板里这个键把问题交给 Claude 并关闭本拍正在进行的表面教这张卡的卡片等于在教结束自己课程的那一个按键。结果随输入实时收窄因此没有需要提交的东西门禁是对真实问题的真实答案TutorialGate.realSearchResult——这是全流程中唯一不可豁免的门禁。交给 Claude——用做的方式。直接指令用户Open claude for me and type the first thing in. 教程通过ClaudeRouter把建议问题路由为claude://claude.ai/new?q…落入一个普通新聊天的 composer。提示是预填、未发送——按 Return 仍是用户的权利。所有无法预填的分支如实说明没有claude://处理器则回退到剪贴板完全没有 Claude Desktop 则如实承认TutorialClaudeAsk。表面在调用点被点名ClaudeHandoff.surface因为 Claude 有两个且不可互换claude://claude.ai/new是普通聊天claude://code/new是 Claude Code 标签页。此拍曾在第二个上发货继承自搜索栏还负责路由到 Claude 的时代把用户中途扔进 Code 标签页。任一个表面都能作答ClaudeRegistrar把 MCP 条目写入两个配置但只有一个是人问问题的地方。目标是用户的不是调用点的。Settings → Agents → Claude target选择 Claude 应用或claudeCLI本次交接由该下拉框操控——ClaudeHandoff在交接时读取SettingsStore.claudeTargetCLI 分支回答TutorialClaudeAsk.ranInTerminal而不是假装填了 composer。在该目标上绝不提供重启claude进程每次都是新的、启动时读取~/.claude.json退出用户正在阅读的 Claude 会让他们损失一个会话且修不了任何东西。重启是有条件的、经同意的。Claude 启动时读取 MCP 配置因此在注册之前就开着的 Claude 调不到我们的工具——但这是条件性判断ClaudeHandoff测试条件而非假设launchDate ClaudeRegistrar.claudeDesktopRegisteredAt任一日期缺失即回答不重启。注册之后启动的 Claude 已经带上了我们、绝不去碰。真正需要重启时卡片询问Claude is open already… May I close and reopen it?并提供真实的第二选择——拒绝仍会交接问题文案说明可达性可能过时这比强退别人的会话去强行过门禁要好。回来时如实报告发生了什么拒绝退出的应用就是restarted: false。卡片让出 Claude 的空间但不离开。曾有一句报告——当它打开 Claude 窗口时流程窗口挡住了视图。两个节拍都取TutorialPlacement.clearOfClaudeTutorialOverlay.parked把卡片放进 Claude 真实窗口周围有空间的环带旁边→上方→下方→全屏 Claude 无空隙时的顶部尾角绝不放底部那是 composer 所在。Claude 的 frame 来自ClaudeWindowProbe它读CGWindowListCopyWindowInfo因此无需授权且每 tick 重读——Claude 在卡片之后才打开、用户也可能移动它。证明它claudeProof。MCP 服务器把最后一次查询时间戳写进数据目录应用监听它因此只有 Claude 真正调用过我们的某个工具时才会出现 Found it。这是回报节拍是挣来的而非排演的。它也是唯一不得抢键盘的卡片TutorialStep.takesFocusOnEntry工具调用发生在用户在 Claude composer 里按 Return 时而配件应用在 Claude 之上激活会恰好吃掉那个按键。allSet——Thats everything以及那句说明采集节拍真正成就了什么的话。它吸收了旧的独立 Your screen is now searchable 卡片。menuBar——one more thing — I live up here伴随MenuBarSpotlight.show()。快捷键冲突步骤重新进入范围。本节曾以我们不注册任何热键因此没有冲突可警告加一个假的纯属表演结尾。现在注册了两个和弦⌘ ⌘与⌘⌘⇧、均可重绑定ShortcutConflicts的存在就是为了报告与其他工具绑定的冲突。它在设置中而非首启卡片中呈现——把冲突提示放在还没用过任一个和弦的人面前是警告一件不存在的事——但没有此步骤的理由不再是没有热键。TutorialStep还定义了每次运行如何诚实恢复resumeLanding把claudeProof拉回claudeHandoffQueryStamp是严格晚于某时刻写入的一个直接醒在 proof 上的新进程会把过去任何时刻的戳当作证据而那正是本文件为之戒备的失败gate把每个节拍绑定到真实门禁realFrames/realHotkey/realGesture/realSearchPanel/realSearchResult/genuineToolCallusesSearchPanel保证面板不会被带进与它无关的节拍handsOverToAnotherApp决定氛围音乐何时收尾claudeProof不能豁免且不可跳过若音乐只随教程结束而停就会在别人页面下无限循环。九、验证测试、冷启动与截图比对swift test --package-path desktop/context-for-claude——文档撰写时 1123 个测试计划刚写时是 146 个新行为新增测试pid 排除、声音门控、步骤状态机。scripts/build.sh 之后做一次真正冷启动。本地构建以开发者证书签名携带的是developer标识符需要重置的正是这些标识符tccutil reset All com.omi.context-for-claude.devdefaults delete com.omi.context-for-claude.dev删除 Keychain 会话清除两处 MCP 注册context-for-claude-dev重置 release 标识符会毁掉已安装应用的授权而碰不到被测构建。只在应用已安装时重置 TCC——tccutil通过 LaunchServices 解析 bundle id且授权在卸载后仍存活卸载后再重置会在重装时静默恢复旧授权。逐拍截图并与参考比对菜单栏与真实系统菜单并排对比。python3 scripts/eval.py不得回退——它给 MCP 回答的诚实度打分与本工作无关任何波动都意味着有东西泄漏了。十、明确不在范围内本节曾读作可回放的倒带时间线、应用内搜索面板、全局热键。搜索栏就是 Claude。——三项全部已发货。在这里点名只是为了没人把上面那句还当成有约束力的承诺。真正仍在范围外的是那句话所属的规则首次运行不得教授应用没有的界面或手势也不得演示它没有真实获得的结果。每个教程门禁仍然是真实的TutorialGate电影里的窗口仍然是合成的CinematicWindowArt任何卡片都不得声称GlobalShortcuts.readiness说它并未武装的和弦。这条规则贯穿 first-run-experience.md 的六个阶段也正是这套首次运行体验与演示型引导最本质的区别每一步都基于真实发生的事实而不是预先排演好的表演。【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表