solidjs-patterns by different-ai/openwork
npx skills add https://github.com/different-ai/openwork --skill solidjs-patternsOpenWork 的 UI 基于 SolidJS:它通过 signals 进行更新,而非 React 式的重新渲染。大多数“UI 卡住”的 bug 实际上是 状态耦合 问题(例如,一个全局的 busy() 禁用了不相关的操作),而非重新渲染问题。
此技能总结了我们在 OpenWork 中希望一致使用的模式。
pending 状态)。createMemo() 推导 UI 状态,而非重复定义布尔值。当一个操作可能与其他操作重叠时(例如权限请求、安装、后台刷新),不要复用全局的 busy()。
为每个操作使用独立的 signal:
const [replying, setReplying] = createSignal(false);
async function respond() {
if (replying()) return;
setReplying(true);
try {
await doTheThing();
} finally {
setReplying(false);
}
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
单一的 busy() 布尔值会导致死锁:
busy(true)busy() 而被禁用解决方案:权限 UI 应仅由 特定于权限 的 pending 状态来禁用。
如果在异步函数内部读取 signals 并需要稳定的值,请尽早获取快照:
const request = activePermission();
if (!request) return;
const requestID = request.id;
await respondPermission(requestID, "always");
优先使用 createMemo() 来计算禁用状态:
const canSend = createMemo(() => prompt().trim().length > 0 && !busy());
setItems((current) => current.filter((x) => x.id !== id));
current。await 之后读取了可能已改变的 signals?每周安装量
98
代码仓库
GitHub 星标数
11.4K
首次出现
2026 年 1 月 22 日
安全审计
安装于
opencode93
gemini-cli89
codex85
github-copilot84
cursor83
claude-code82
OpenWork’s UI is SolidJS: it updates via signals , not React-style rerenders. Most “UI stuck” bugs are actually state coupling bugs (e.g. one global busy() disabling an unrelated action), not rerender issues.
This skill captures the patterns we want to consistently use in OpenWork.
pending state).createMemo() instead of duplicating booleans.When an operation can overlap with others (permissions, installs, background refresh), don’t reuse a global busy().
Use a dedicated signal per action:
const [replying, setReplying] = createSignal(false);
async function respond() {
if (replying()) return;
setReplying(true);
try {
await doTheThing();
} finally {
setReplying(false);
}
}
A single busy() boolean creates deadlocks:
busy(true)busy()Fix: permission UI must be disabled only by a permission-specific pending state.
If you read signals inside an async function and you need stable values, snapshot early:
const request = activePermission();
if (!request) return;
const requestID = request.id;
await respondPermission(requestID, "always");
Prefer createMemo() for computed disabled states:
const canSend = createMemo(() => prompt().trim().length > 0 && !busy());
Use setter callbacks for derived updates:
setItems((current) => current.filter((x) => x.id !== id));
Don’t mutate current in-place.
await where values might have changed?Weekly Installs
98
Repository
GitHub Stars
11.4K
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode93
gemini-cli89
codex85
github-copilot84
cursor83
claude-code82
Vue 3 调试指南:解决响应式、计算属性与监听器常见错误
11,600 周安装
Google Gemini 多模态AI技能:音频转录、图像分析、视频处理、文档提取与生成
272 周安装
Tailwind CSS 开发指南:v3 特性、深色模式、Flexbox/Grid 布局与最佳实践
274 周安装
BlockRun:AI 微支付网关,集成 GPT-5.2、DALL-E、Grok 实时搜索,按需付费
272 周安装
Claude Code 上下文压缩恢复工具 - 自动恢复工作状态,加载知识库,总结工作进度
284 周安装
Agentic Workflow 多智能体流水线模式:AI任务编排与自动化实施架构
280 周安装
Claude提示词库 - 开发者必备的AI提示词模板集合,含代码审查、系统架构等角色扮演
278 周安装