十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Unread dot

Unread dot Unread dot【免费下载链接】buzzA hive mind communication platform项目地址: https://gitcode.com/GitHub_Trending/buzz14/buzzA message arrives in#random.{{01-unread-dot}}Context menuRight-click shows Mark as read.{{02-context-menu}}重复运行会覆盖 agent-screenshots/username 分支上的图片 blob但脚本**追加新的 PR 评论**——不编辑、不删除旧评论。重发后要手动删掉过期评论否则评审者仍会看到旧图 bash # 列出截图评论找到过期那条的 id gh pr view pr --json comments \ --jq .comments[] | select(.body | test(pr-pr--)) | {id, url} gh api -X DELETE repos/block/buzz/issues/comments/stale-comment-id彻底完成后清理分支git push origin --delete agent-screenshots/username。编写 E2E 截图 Spec五条经验法则当截图需要预置状态、实时消息或捕获前的 UI 交互时应写 Playwright spec 而不是用just desktop-screenshot。spec 加到desktop/tests/e2e/并注册进playwright.config.ts的smokeprojecttestMatch。每个测试都要调用installMockBridge(page)安装 mock Tauri IPCmock pubkey、channel 名、UUID 都在e2eBridge.ts里。永远用pnpm build:e2e构建绝不用pnpm run build。mock Tauri bridge 只在--mode e2e下编译进产物见 desktop/src/main.tsx 中的installE2eBridgeIfConfigured。普通 build 会把它剥掉window.__TAURI_INTERNALS__永远未定义所有mock 模式 spec 都会以Cannot read properties of undefined (reading invoke)失败应用渲染出Community connection failed——看起来像产品 bug 而非构建错误会浪费真实时间。pnpm test:e2e:smoke与pnpm test:e2e:integration会自动执行正确的构建优先使用它们而不是手动 build 再playwright test。陈旧 serverreuseExistingServer: true意味着上一次构建的 server 还在提供旧代码。代码改动后重跑测试前杀掉 4173 端口并重新pnpm build:e2e。addInitScript必须在 bridge 之前page.addInitScript种 localStorage要先于installMockBridge(page)——React 在挂载时读状态而 bridge 触发挂载。实时消息__BUZZ_E2E_EMIT_MOCK_MESSAGE__之前必须调用waitForMockLiveSubscription(page, channelName)——没有订阅的消息会被静默丢弃。先导航进该 channel触发订阅再离开让未读指示器出现然后注入。动画时序Radix 组件用 CSS 动画入场toBeVisible()会在动画中途就 resolve——截图前要等完成。任何page.screenshot()或locator.screenshot()之前必须用共享 helperspec 中强制要求import { waitForAnimations } from ../helpers/animations; // ... 元素可见之后、截图之前 await waitForAnimations(page); await page.screenshot({ path: ..., clip: { ... } });just desktop-screenshot路径screenshot.mjs会自动调用waitForAnimations无需手动处理。需要按元素等待时少见优先用页级 helperawait menuItem.evaluate((el) Promise.all( el.closest([data-state])?.getAnimations().map((a) a.finished) ?? [], ), );裁剪用clip——全窗口1280x720截图对侧栏功能不可读。侧栏 256px上下文菜单约 450px。状态要可区分——发布前验证当一个视图一次渲染大量元素如单网格里的所有团队卡片时不加作用域的全页page.screenshot()对每张图捕获的是相同像素多张 PNG 会字节级相同。用locator.screenshot()把每张图限定到其对象只有需要包含打开的 dropdown 等 overlay 时才用全页clip。然后以哈希唯一性作为门禁shasum -a 256 test-results/dir/*.png # 每个哈希必须唯一哈希相同说明两张图捕获了同一状态——修 spec别发布。这是最常见的截图回归。其他两条generalchannel 有预置消息hasUnread恒为 true静音且无未读的视觉状态要用engineeringPR 评论用第三个参数post-screenshots.sh的 body 模板配{{filename}}占位符每张截图配一个###标题加一行描述。常见陷阱Common Gotchas文档列出的 7 条陷阱每一条都在仓库中有对应实现Channel 元数据用 kind39000不是41—— kind 41 是 NIP-01Buzz 未用。所有 kind 定义在crates/buzz-core/src/kind.rs前文已验证 39000/39001/39002 常量。relay 查询必须指定kinds—— 省略kinds会触发 p-gate403。始终带显式 kind 过滤器。messages search自己选择支持的 kinds—— 不要给它加--kinds选项当前命令不接受这与仍需显式 kinds 的原始 relay 过滤器不同。worktree 里cd要和命令写在同一条命令—— shell 的 CWD 在工具调用之间不保留。用cd /path cargo build一条命令完成。desktop crate 不在根 workspace 中—— 仓库根跑cargo test不会跑桌面测试。必须显式cargo test --manifest-path desktop/src-tauri/Cargo.toml。React 渲染性能React.memo是全有或全无—— 只有所有prop 引用稳定时才跳过重渲染一个不稳定 prop内联箭头/JSX或每次渲染返回新{}/[]/Map的 hook就使其失效。两个惯犯(a) React Query 结果useMutation/useQuery每次渲染都是新对象——依赖稳定方法mutation.mutateAsync而不是对象(b) 版本 bump 时重算的派生Map/数组状态——包进内容相等引用缓存shared/hooks/useStableReference.ts。排查交互滞后时在 DevTools 关闭、无性能探针的情况下测量开着的 Web Inspector 每次按键console.log会抬高数字并一次移除一个嫌疑对象做隔离而不是猜。pgschema会漏掉 seed DML 和部分存储参数—— 期望状态的全新引导用./bin/pgschema apply它不执行INSERT语句、也不保留 schema/schema.sql 中每张表的存储参数。把每个不支持的不变量写成幂等收敛语句加一条 live catalog 或数据断言放进scripts/reconcile-schema-after-pgschema.sql该文件在仓库中确认存在。每个pgschema apply调用方都必须跑那个脚本。仅对schema.sql做字符串断言证明不了 pgschema 建的数据库处于预期状态。桌面端规范rem 缩放与 Community 切换桌面应用是 Tauri 2 React 19 Vite Tailwind CSS功能组织在desktop/src/features/下Biome 负责 lint 与格式化just desktop-dev # 纯 web dev server迭代更快 just dev # 完整 Tauri 应用原生外壳文字尺寸与缩放只用 rem永不用 px桌面应用通过缩放根html的 font-size 实现 Cmd /- 缩放desktop/src/app/useWebviewZoomShortcuts.ts同时固定原生 webview 缩放。只有 rem 文本会随缩放走——硬编码的 px 文本是冻结的。因此通用界面文本用标准 rem tokentext-base、text-sm、text-xs等它们都派生自虚拟排版 rem跟随用户字号偏好与 Cmd /- 缩放会话文本使用命名 tokentext-message。其Smaller / Default / Larger 契约是键盘缩放前的 13 / 14 / 15px。作者名用同一档会话字号步长时间戳、系统行、代码、reaction 是共享虚拟 rem 阶梯上刻意设计的相邻档位。保持这些关系 token 化不要恢复固定 16px 聊天基线或在组件里硬编码偏好特定值text-2xs与text-3xs是元文本 tokendesktop/tailwind.config.js 的theme.extend.fontSize下分别为 0.6875rem / 16px 虚拟 rem 下的 11px 与 0.5rem / 8px用于低于text-xs的阶梯——时间戳、计数角标、tracking 标签、微型字形。它们取代了此前漂移的几十处任意text-[…rem]字面量元文本保持在这两个 token 上不要造新的任意值反面text-[15px]、text-[13px]、CSSfont-size: 15px——px 对缩放冻结曾造成消息时间线回归PR #891任意 rem 字面量同样不要text-[0.6875rem]、text-[0.9rem]等——缩放没问题但重新碎片化了已整合的字号阶梯。用命名 token。优先标准 tokenrem、缩放安全只有设计真正需要标准/2xs/3xs阶梯无法表达的尺寸时才新增 rem-based token同样加在theme.extend.fontSize下而不是任意字面量。CI 门禁 desktop/scripts/check-px-text.mjspnpm check:px-text扫描desktop/src全量任何新增任意文字尺寸字面量px或rem/em都会失败。真正的装饰性字形如text-[6rem]的头像 emoji按path:line在该脚本的 allowlist 中豁免。源码印证tailwind.config.js 中2xs/3xs确实定义为calc(var(--buzz-type-rem) * 0.6875)与calc(var(--buzz-type-rem) * 0.5)即文档所述虚拟 rem 阶梯的实现。Community 切换key 重挂载 显式重置单例桌面应用支持多 community各由不同 relay 支撑。切换 community不重载页面——用 React key 重挂载。desktop/src/app/App.tsx 中的AppReady key{communityKey} /强制整个 community 作用域子树卸载并重挂载获得全新状态。源码中communityKey由activeCommunity.id、reinitKey、currentPubkey、signerEpoch拼合key 变化即触发整棵子树含 QueryClient 与AppReady重建。模块级单例必须显式重置。React 重挂载只清 React 状态useState、useRef、context模块级变量Map、类实例、缓存 promise跨重挂载存活。每个 community 作用域单例都需要一个 reset 函数接入 desktop/src/features/communities/useCommunityInit.ts 中的resetCommunityState()。该函数是 community 作用域单例的权威清单——新增任何持有 community 作用域数据的模块级缓存、Map 或类实例时必须在同一次改动里把它的 reset 加进去。漏掉会导致旧 community 的数据泄漏进新 community。关键文件desktop/src/app/App.tsx— community key、init 门禁、重挂载边界desktop/src/features/communities/useCommunityInit.ts—resetCommunityState()把配置应用到 Tauri 后端desktop/src/main.tsx— provider 层级QueryClientProviderApp。移动端规范Flutter移动端在mobile/Flutter Riverpod Hooks 架构状态管理Riverpod flutter_hooksHookConsumerWidget主题Catppuccin Latte浅/ Macchiato深与桌面一致功能隔离lib/features/下共享代码在lib/shared/Nostr 模型lib/shared/relay/nostr_models.dart—— 事件 kind 必须与desktop/src/shared/constants/kinds.ts保持同步。硬性规则绝不用StatefulWidget—— 状态优先 Riverpod局部状态一律HookConsumerWidget或配flutter_hooks的ConsumerWidgetAgent 可以在实质性帮助实现、调试或验证移动改动时构建并运行 Flutter 应用。优先最小相关命令复用已运行的模拟器/仿真器和应用已配置的 staging 或生产 community除非任务确实需要 relay 侧或隔离集成行为不要启动或重建本地 relay 服务iOS 运行时验证优先just mobile-dev应用 worktree 专属调试身份并跑flutter run直接flutter run或 IDE 流程也可。仅在任务确实相关时用just mobile-build-android不为仪式感重建、重装或重启。保留 Flutter 增量构建缓存适当使用热重载/重启只有当陈旧构建产物是可信成因时才flutter clean只有任务明确要求工具链变更时才flutter upgrade对用户可见或集成改动在可行时用真实应用走一遍受影响工作流并报告实际测试的设备/模拟器、连接的 community 与工作流不用print()—— 用debugPrint()或结构化日志优先context.colors与context.textTheme经 theme extensions而非裸Theme.of(context)Widget 保持小而可组合每文件一个公开 widget私有子 widget_Foo推进page/目录下的兄弟part文件而不是撑大页面文件。移动端硬上限1200 行/文件由仓库级just file-size-check门禁与其他表界面专属限制一起执行just check、CI、每次 pre-push。若某个文件触发该 guard拆文件——绝不为了塞进该文件而提高表面限制或加例外。刻意的仓库级政策修订必须同步更新被执行的规则、测试与指导功能模块不得互相导入——只能从shared/导入间距用Gridtoken圆角用Radii。质量检查与本地运行cd mobile dart format --outputnone --set-exit-if-changed . flutter analyze flutter test或在仓库根just mobile-fmt自动修复、just mobile-checklint fmt 检查、just mobile-test测试。用 worktree 专属调试身份 已启动或复用的 iOS 模拟器在本地运行just mobile-dev【免费下载链接】buzzA hive mind communication platform项目地址: https://gitcode.com/GitHub_Trending/buzz14/buzz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表