@rotifer/playground 0.5.0-alpha.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CHANGELOG.md +159 -15
  2. package/LICENSE +1 -1
  3. package/README.md +51 -23
  4. package/README.zh.md +54 -25
  5. package/dist/cloud/auth.d.ts +7 -1
  6. package/dist/cloud/auth.d.ts.map +1 -1
  7. package/dist/cloud/auth.js +65 -1
  8. package/dist/cloud/auth.js.map +1 -1
  9. package/dist/cloud/client.d.ts +4 -1
  10. package/dist/cloud/client.d.ts.map +1 -1
  11. package/dist/cloud/client.js +9 -2
  12. package/dist/cloud/client.js.map +1 -1
  13. package/dist/cloud/types.d.ts +3 -1
  14. package/dist/cloud/types.d.ts.map +1 -1
  15. package/dist/cloud/types.js.map +1 -1
  16. package/dist/commands/agent-create.d.ts.map +1 -1
  17. package/dist/commands/agent-create.js +66 -3
  18. package/dist/commands/agent-create.js.map +1 -1
  19. package/dist/commands/agent-run.d.ts.map +1 -1
  20. package/dist/commands/agent-run.js +296 -32
  21. package/dist/commands/agent-run.js.map +1 -1
  22. package/dist/commands/arena-submit.d.ts.map +1 -1
  23. package/dist/commands/arena-submit.js +45 -17
  24. package/dist/commands/arena-submit.js.map +1 -1
  25. package/dist/commands/compile.d.ts.map +1 -1
  26. package/dist/commands/compile.js +9 -3
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +13 -3
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/login.d.ts.map +1 -1
  32. package/dist/commands/login.js +23 -16
  33. package/dist/commands/login.js.map +1 -1
  34. package/dist/commands/network.js +4 -4
  35. package/dist/commands/network.js.map +1 -1
  36. package/dist/commands/publish.d.ts.map +1 -1
  37. package/dist/commands/publish.js +162 -44
  38. package/dist/commands/publish.js.map +1 -1
  39. package/dist/commands/test.d.ts.map +1 -1
  40. package/dist/commands/test.js +209 -23
  41. package/dist/commands/test.js.map +1 -1
  42. package/dist/commands/wrap.d.ts.map +1 -1
  43. package/dist/commands/wrap.js +17 -1
  44. package/dist/commands/wrap.js.map +1 -1
  45. package/dist/index.js +0 -0
  46. package/dist/runtime/network-gateway.d.ts +53 -0
  47. package/dist/runtime/network-gateway.d.ts.map +1 -0
  48. package/dist/runtime/network-gateway.js +147 -0
  49. package/dist/runtime/network-gateway.js.map +1 -0
  50. package/dist/utils/binding.d.ts +25 -0
  51. package/dist/utils/binding.d.ts.map +1 -1
  52. package/dist/utils/binding.js.map +1 -1
  53. package/dist/utils/open-browser.d.ts +10 -0
  54. package/dist/utils/open-browser.d.ts.map +1 -0
  55. package/dist/utils/open-browser.js +23 -0
  56. package/dist/utils/open-browser.js.map +1 -0
  57. package/genes/academic-writer/.cloud-manifest.json +6 -0
  58. package/genes/academic-writer/.gene-manifest.json +8 -0
  59. package/genes/academic-writer/SKILL.md +274 -0
  60. package/genes/academic-writer/phenotype.json +28 -0
  61. package/genes/ai-components/.cloud-manifest.json +6 -0
  62. package/genes/ai-components/.gene-manifest.json +8 -0
  63. package/genes/ai-components/SKILL.md +381 -0
  64. package/genes/ai-components/phenotype.json +28 -0
  65. package/genes/algorithmic-art/.cloud-manifest.json +6 -0
  66. package/genes/algorithmic-art/.gene-manifest.json +8 -0
  67. package/genes/algorithmic-art/SKILL.md +405 -0
  68. package/genes/algorithmic-art/phenotype.json +28 -0
  69. package/genes/answer-synthesizer/.cloud-manifest.json +6 -0
  70. package/genes/answer-synthesizer/index.ts +194 -0
  71. package/genes/answer-synthesizer/phenotype.json +61 -0
  72. package/genes/api-designer/.cloud-manifest.json +6 -0
  73. package/genes/api-designer/.gene-manifest.json +8 -0
  74. package/genes/api-designer/SKILL.md +456 -0
  75. package/genes/api-designer/phenotype.json +28 -0
  76. package/genes/auto-coder/.cloud-manifest.json +6 -0
  77. package/genes/auto-coder/.gene-manifest.json +8 -0
  78. package/genes/auto-coder/SKILL.md +400 -0
  79. package/genes/auto-coder/phenotype.json +28 -0
  80. package/genes/auto-writer/.cloud-manifest.json +6 -0
  81. package/genes/auto-writer/.gene-manifest.json +8 -0
  82. package/genes/auto-writer/SKILL.md +361 -0
  83. package/genes/auto-writer/phenotype.json +28 -0
  84. package/genes/brand-personality/.cloud-manifest.json +6 -0
  85. package/genes/brand-personality/.gene-manifest.json +8 -0
  86. package/genes/brand-personality/SKILL.md +549 -0
  87. package/genes/brand-personality/phenotype.json +28 -0
  88. package/genes/business-writer/.cloud-manifest.json +6 -0
  89. package/genes/business-writer/.gene-manifest.json +8 -0
  90. package/genes/business-writer/SKILL.md +448 -0
  91. package/genes/business-writer/phenotype.json +28 -0
  92. package/genes/citation-manager/.cloud-manifest.json +6 -0
  93. package/genes/citation-manager/.gene-manifest.json +8 -0
  94. package/genes/citation-manager/SKILL.md +279 -0
  95. package/genes/citation-manager/index.ts +162 -0
  96. package/genes/citation-manager/package.json +1 -0
  97. package/genes/citation-manager/phenotype.json +50 -0
  98. package/genes/code-complexity/.cloud-manifest.json +6 -0
  99. package/genes/code-complexity/README.md +35 -0
  100. package/genes/code-complexity/index.ts +101 -0
  101. package/genes/code-complexity/phenotype.json +34 -0
  102. package/genes/copywriter/.cloud-manifest.json +6 -0
  103. package/genes/copywriter/.gene-manifest.json +8 -0
  104. package/genes/copywriter/SKILL.md +329 -0
  105. package/genes/copywriter/phenotype.json +28 -0
  106. package/genes/creative-writer/.cloud-manifest.json +6 -0
  107. package/genes/creative-writer/.gene-manifest.json +8 -0
  108. package/genes/creative-writer/SKILL.md +356 -0
  109. package/genes/creative-writer/phenotype.json +28 -0
  110. package/genes/data-modeler/.cloud-manifest.json +6 -0
  111. package/genes/data-modeler/.gene-manifest.json +8 -0
  112. package/genes/data-modeler/SKILL.md +486 -0
  113. package/genes/data-modeler/phenotype.json +28 -0
  114. package/genes/debugger/.cloud-manifest.json +6 -0
  115. package/genes/debugger/.gene-manifest.json +8 -0
  116. package/genes/debugger/SKILL.md +416 -0
  117. package/genes/debugger/phenotype.json +28 -0
  118. package/genes/design-tokens/.cloud-manifest.json +6 -0
  119. package/genes/design-tokens/.gene-manifest.json +8 -0
  120. package/genes/design-tokens/SKILL.md +222 -0
  121. package/genes/design-tokens/index.ts +128 -0
  122. package/genes/design-tokens/package.json +1 -0
  123. package/genes/design-tokens/phenotype.json +1 -0
  124. package/genes/devops-automator/.cloud-manifest.json +6 -0
  125. package/genes/devops-automator/.gene-manifest.json +8 -0
  126. package/genes/devops-automator/SKILL.md +490 -0
  127. package/genes/devops-automator/phenotype.json +28 -0
  128. package/genes/doc-coauthoring/.cloud-manifest.json +6 -0
  129. package/genes/doc-coauthoring/.gene-manifest.json +8 -0
  130. package/genes/doc-coauthoring/SKILL.md +375 -0
  131. package/genes/doc-coauthoring/phenotype.json +28 -0
  132. package/genes/doc-retrieval/.cloud-manifest.json +6 -0
  133. package/genes/doc-retrieval/index.ts +134 -0
  134. package/genes/doc-retrieval/phenotype.json +54 -0
  135. package/genes/docs-writer/.cloud-manifest.json +6 -0
  136. package/genes/docs-writer/.gene-manifest.json +8 -0
  137. package/genes/docs-writer/SKILL.md +492 -0
  138. package/genes/docs-writer/phenotype.json +28 -0
  139. package/genes/evolve-life/.cloud-manifest.json +6 -0
  140. package/genes/evolve-life/.compile-result.json +12 -0
  141. package/genes/evolve-life/README.md +52 -0
  142. package/genes/evolve-life/gene.ir.wasm +0 -0
  143. package/genes/evolve-life/gene.wasm +0 -0
  144. package/genes/evolve-life/index.ts +255 -0
  145. package/genes/evolve-life/phenotype.json +129 -0
  146. package/genes/evolve-life-bitwise/.cloud-manifest.json +6 -0
  147. package/genes/evolve-life-bitwise/.compile-result.json +12 -0
  148. package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
  149. package/genes/evolve-life-bitwise/gene.wasm +0 -0
  150. package/genes/evolve-life-bitwise/index.ts +273 -0
  151. package/genes/evolve-life-bitwise/phenotype.json +129 -0
  152. package/genes/evolve-life-sparse/.cloud-manifest.json +6 -0
  153. package/genes/evolve-life-sparse/.compile-result.json +12 -0
  154. package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
  155. package/genes/evolve-life-sparse/gene.wasm +0 -0
  156. package/genes/evolve-life-sparse/index.ts +236 -0
  157. package/genes/evolve-life-sparse/phenotype.json +129 -0
  158. package/genes/fact-checker/.cloud-manifest.json +6 -0
  159. package/genes/fact-checker/.gene-manifest.json +8 -0
  160. package/genes/fact-checker/SKILL.md +373 -0
  161. package/genes/fact-checker/phenotype.json +28 -0
  162. package/genes/genesis-code-format/.cloud-manifest.json +6 -0
  163. package/genes/genesis-code-format/package.json +1 -0
  164. package/genes/genesis-code-format/phenotype.json +1 -0
  165. package/genes/genesis-file-read/.cloud-manifest.json +6 -0
  166. package/genes/genesis-file-read/index.ts +11 -1
  167. package/genes/genesis-file-read/package.json +1 -0
  168. package/genes/genesis-file-read/phenotype.json +1 -0
  169. package/genes/genesis-l0-constraint/.cloud-manifest.json +6 -0
  170. package/genes/genesis-l0-constraint/package.json +1 -0
  171. package/genes/genesis-l0-constraint/phenotype.json +1 -0
  172. package/genes/genesis-web-search/.cloud-manifest.json +2 -2
  173. package/genes/genesis-web-search/package.json +1 -0
  174. package/genes/genesis-web-search/phenotype.json +1 -0
  175. package/genes/genesis-web-search-lite/.cloud-manifest.json +6 -0
  176. package/genes/genesis-web-search-lite/package.json +1 -0
  177. package/genes/genesis-web-search-lite/phenotype.json +1 -0
  178. package/genes/git-workflow/.cloud-manifest.json +6 -0
  179. package/genes/git-workflow/.gene-manifest.json +8 -0
  180. package/genes/git-workflow/SKILL.md +407 -0
  181. package/genes/git-workflow/phenotype.json +28 -0
  182. package/genes/grammar-checker/.cloud-manifest.json +6 -0
  183. package/genes/grammar-checker/.gene-manifest.json +8 -0
  184. package/genes/grammar-checker/SKILL.md +194 -0
  185. package/genes/grammar-checker/index.ts +168 -0
  186. package/genes/grammar-checker/package.json +1 -0
  187. package/genes/grammar-checker/phenotype.json +52 -0
  188. package/genes/json-validator/.cloud-manifest.json +6 -0
  189. package/genes/json-validator/README.md +42 -0
  190. package/genes/json-validator/index.ts +112 -0
  191. package/genes/json-validator/phenotype.json +42 -0
  192. package/genes/license-advisor/.cloud-manifest.json +6 -0
  193. package/genes/license-advisor/.gene-manifest.json +8 -0
  194. package/genes/license-advisor/SKILL.md +117 -0
  195. package/genes/license-advisor/phenotype.json +28 -0
  196. package/genes/logic-architect/.cloud-manifest.json +6 -0
  197. package/genes/logic-architect/.gene-manifest.json +8 -0
  198. package/genes/logic-architect/SKILL.md +451 -0
  199. package/genes/logic-architect/phenotype.json +28 -0
  200. package/genes/markdown-formatter/.cloud-manifest.json +6 -0
  201. package/genes/markdown-formatter/README.md +34 -0
  202. package/genes/markdown-formatter/index.ts +86 -0
  203. package/genes/markdown-formatter/phenotype.json +32 -0
  204. package/genes/orch/.cloud-manifest.json +6 -0
  205. package/genes/orch/.gene-manifest.json +8 -0
  206. package/genes/orch/SKILL.md +504 -0
  207. package/genes/orch/phenotype.json +28 -0
  208. package/genes/particle-barneshut/.cloud-manifest.json +6 -0
  209. package/genes/particle-barneshut/.compile-result.json +12 -0
  210. package/genes/particle-barneshut/README.md +55 -0
  211. package/genes/particle-barneshut/gene.ir.wasm +0 -0
  212. package/genes/particle-barneshut/gene.wasm +0 -0
  213. package/genes/particle-barneshut/index.ts +486 -0
  214. package/genes/particle-barneshut/phenotype.json +137 -0
  215. package/genes/particle-brute/.cloud-manifest.json +6 -0
  216. package/genes/particle-brute/.compile-result.json +12 -0
  217. package/genes/particle-brute/README.md +55 -0
  218. package/genes/particle-brute/gene.ir.wasm +0 -0
  219. package/genes/particle-brute/gene.wasm +0 -0
  220. package/genes/particle-brute/index.ts +277 -0
  221. package/genes/particle-brute/phenotype.json +137 -0
  222. package/genes/particle-spatial/.cloud-manifest.json +6 -0
  223. package/genes/particle-spatial/.compile-result.json +12 -0
  224. package/genes/particle-spatial/README.md +53 -0
  225. package/genes/particle-spatial/gene.ir.wasm +0 -0
  226. package/genes/particle-spatial/gene.wasm +0 -0
  227. package/genes/particle-spatial/index.ts +352 -0
  228. package/genes/particle-spatial/phenotype.json +137 -0
  229. package/genes/performance-optimizer/.cloud-manifest.json +6 -0
  230. package/genes/performance-optimizer/.gene-manifest.json +8 -0
  231. package/genes/performance-optimizer/SKILL.md +480 -0
  232. package/genes/performance-optimizer/phenotype.json +28 -0
  233. package/genes/plagiarism-checker/.cloud-manifest.json +6 -0
  234. package/genes/plagiarism-checker/.gene-manifest.json +8 -0
  235. package/genes/plagiarism-checker/SKILL.md +342 -0
  236. package/genes/plagiarism-checker/phenotype.json +28 -0
  237. package/genes/product-manager/.cloud-manifest.json +6 -0
  238. package/genes/product-manager/.gene-manifest.json +8 -0
  239. package/genes/product-manager/SKILL.md +249 -0
  240. package/genes/product-manager/phenotype.json +28 -0
  241. package/genes/project-reviewer/.cloud-manifest.json +6 -0
  242. package/genes/project-reviewer/.gene-manifest.json +8 -0
  243. package/genes/project-reviewer/SKILL.md +312 -0
  244. package/genes/project-reviewer/phenotype.json +28 -0
  245. package/genes/prompt-engineer/.cloud-manifest.json +6 -0
  246. package/genes/prompt-engineer/.gene-manifest.json +8 -0
  247. package/genes/prompt-engineer/SKILL.md +411 -0
  248. package/genes/prompt-engineer/phenotype.json +28 -0
  249. package/genes/readability-analyzer/.cloud-manifest.json +6 -0
  250. package/genes/readability-analyzer/.gene-manifest.json +8 -0
  251. package/genes/readability-analyzer/SKILL.md +357 -0
  252. package/genes/readability-analyzer/index.ts +123 -0
  253. package/genes/readability-analyzer/package.json +1 -0
  254. package/genes/readability-analyzer/phenotype.json +35 -0
  255. package/genes/rotifer-protocol/SKILL.md +121 -0
  256. package/genes/security-auditor/.cloud-manifest.json +6 -0
  257. package/genes/security-auditor/.gene-manifest.json +8 -0
  258. package/genes/security-auditor/SKILL.md +494 -0
  259. package/genes/security-auditor/phenotype.json +28 -0
  260. package/genes/seo-optimizer/.cloud-manifest.json +6 -0
  261. package/genes/seo-optimizer/.gene-manifest.json +8 -0
  262. package/genes/seo-optimizer/SKILL.md +327 -0
  263. package/genes/seo-optimizer/index.ts +206 -0
  264. package/genes/seo-optimizer/package.json +1 -0
  265. package/genes/seo-optimizer/phenotype.json +1 -0
  266. package/genes/source-linker/.cloud-manifest.json +6 -0
  267. package/genes/source-linker/index.ts +88 -0
  268. package/genes/source-linker/phenotype.json +45 -0
  269. package/genes/style-optimizer/.cloud-manifest.json +6 -0
  270. package/genes/style-optimizer/.gene-manifest.json +8 -0
  271. package/genes/style-optimizer/SKILL.md +285 -0
  272. package/genes/style-optimizer/phenotype.json +28 -0
  273. package/genes/tech-lead/.cloud-manifest.json +6 -0
  274. package/genes/tech-lead/.gene-manifest.json +8 -0
  275. package/genes/tech-lead/SKILL.md +451 -0
  276. package/genes/tech-lead/phenotype.json +28 -0
  277. package/genes/test-wrap/.cloud-manifest.json +6 -0
  278. package/genes/test-wrap/.gene-manifest.json +8 -0
  279. package/genes/test-wrap/phenotype.json +28 -0
  280. package/genes/testing-strategist/.cloud-manifest.json +6 -0
  281. package/genes/testing-strategist/.gene-manifest.json +8 -0
  282. package/genes/testing-strategist/SKILL.md +500 -0
  283. package/genes/testing-strategist/phenotype.json +28 -0
  284. package/genes/text-summarizer/.cloud-manifest.json +6 -0
  285. package/genes/text-summarizer/README.md +34 -0
  286. package/genes/text-summarizer/index.ts +122 -0
  287. package/genes/text-summarizer/phenotype.json +32 -0
  288. package/genes/tone-analyzer/.cloud-manifest.json +6 -0
  289. package/genes/tone-analyzer/.gene-manifest.json +8 -0
  290. package/genes/tone-analyzer/SKILL.md +410 -0
  291. package/genes/tone-analyzer/phenotype.json +28 -0
  292. package/genes/translator/.cloud-manifest.json +6 -0
  293. package/genes/translator/.gene-manifest.json +8 -0
  294. package/genes/translator/SKILL.md +355 -0
  295. package/genes/translator/phenotype.json +28 -0
  296. package/genes/ui-components/.cloud-manifest.json +6 -0
  297. package/genes/ui-components/.gene-manifest.json +8 -0
  298. package/genes/ui-components/SKILL.md +467 -0
  299. package/genes/ui-components/phenotype.json +28 -0
  300. package/genes/uiux-designer/.cloud-manifest.json +6 -0
  301. package/genes/uiux-designer/.gene-manifest.json +8 -0
  302. package/genes/uiux-designer/SKILL.md +353 -0
  303. package/genes/uiux-designer/phenotype.json +28 -0
  304. package/genes/url-extractor/.cloud-manifest.json +6 -0
  305. package/genes/url-extractor/README.md +37 -0
  306. package/genes/url-extractor/index.ts +86 -0
  307. package/genes/url-extractor/phenotype.json +48 -0
  308. package/genes/ux-patterns/.cloud-manifest.json +6 -0
  309. package/genes/ux-patterns/.gene-manifest.json +8 -0
  310. package/genes/ux-patterns/SKILL.md +872 -0
  311. package/genes/ux-patterns/phenotype.json +28 -0
  312. package/genes/web3-components/.cloud-manifest.json +6 -0
  313. package/genes/web3-components/.gene-manifest.json +8 -0
  314. package/genes/web3-components/SKILL.md +390 -0
  315. package/genes/web3-components/phenotype.json +28 -0
  316. package/package.json +6 -5
@@ -0,0 +1,28 @@
1
+ {
2
+ "domain": "ux.interaction",
3
+ "description": "Parameterized UX interaction pattern library. Generates contextual copy and motion effects based on emotional tone and motion intensity parameters.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "prompt": {
8
+ "type": "string"
9
+ }
10
+ },
11
+ "required": []
12
+ },
13
+ "outputSchema": {
14
+ "type": "object",
15
+ "properties": {
16
+ "result": {
17
+ "type": "string"
18
+ }
19
+ }
20
+ },
21
+ "dependencies": [],
22
+ "version": "0.1.0",
23
+ "author": "rotifer-team",
24
+ "createdAt": 1771939279231,
25
+ "fidelity": "Wrapped",
26
+ "transparency": "Open",
27
+ "source": "skill"
28
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "cloud_id": "642960ad-4274-4ea0-bb03-8a070e7fafdc",
3
+ "owner": "Rotifer Protocol",
4
+ "version": "0.1.0",
5
+ "published_at": "2026-03-17T14:14:02.853Z"
6
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "geneId": "ccf64de0ff30b08401c7ecee888ef2b89a1259a7086c7b8ebe580fb7b0142ab1",
3
+ "name": "web3-components",
4
+ "domain": "ui.web3",
5
+ "fidelity": "Wrapped",
6
+ "wrappedAt": "2026-02-24T13:23:07.304Z",
7
+ "fromSkill": "../.cursor/skills/web3-components/SKILL.md"
8
+ }
@@ -0,0 +1,390 @@
1
+ ---
2
+ name: web3-components
3
+ description: Web3 界面专项组件库,包含钱包连接、网络切换、交易状态、Gas 估算等。专为 DApp 应用设计。当用户提到"钱包""连接钱包""交易""Web3 界面""DApp""区块链"时使用。
4
+ ---
5
+
6
+ # Web3 Components (Web3 界面组件库)
7
+
8
+ **定位**: Web3 DApp 应用的专项 UI 组件。
9
+
10
+ **核心目标**: 打造专业、安全的 Web3 交互体验。
11
+
12
+ **设计规范**: 遵循 [design-tokens](../design-tokens/SKILL.md) 和 [ux-patterns](../ux-patterns/SKILL.md)。
13
+
14
+ ---
15
+
16
+ ## Connect Wallet Button (连接钱包)
17
+
18
+ ```tsx
19
+ function ConnectButton({ state, onConnect, onDisconnect }: Props) {
20
+ if (state.status === 'disconnected') {
21
+ return (
22
+ <button
23
+ onClick={onConnect}
24
+ className="px-4 py-2.5 rounded-xl font-medium bg-primary-500 text-white hover:bg-primary-600 transition-colors"
25
+ >
26
+ 连接钱包
27
+ </button>
28
+ )
29
+ }
30
+
31
+ if (state.status === 'connecting') {
32
+ return (
33
+ <button disabled className="px-4 py-2.5 rounded-xl bg-gray-100 text-gray-500">
34
+ <Spinner className="w-4 h-4 mr-2 inline animate-spin" />
35
+ 连接中...
36
+ </button>
37
+ )
38
+ }
39
+
40
+ if (state.status === 'connected') {
41
+ return (
42
+ <button
43
+ onClick={onDisconnect}
44
+ className="px-4 py-2.5 rounded-xl bg-gray-100 hover:bg-gray-200 transition-colors flex items-center gap-2"
45
+ >
46
+ <div className="w-2 h-2 bg-success rounded-full" />
47
+ <span className="font-mono text-sm">{truncateAddress(state.address)}</span>
48
+ </button>
49
+ )
50
+ }
51
+ }
52
+
53
+ function truncateAddress(address: string): string {
54
+ return `${address.slice(0, 6)}...${address.slice(-4)}`
55
+ }
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Network Badge (网络标识)
61
+
62
+ ```tsx
63
+ const NETWORK_COLORS: Record<number, string> = {
64
+ 1: 'bg-blue-500', // Ethereum
65
+ 137: 'bg-purple-500', // Polygon
66
+ 42161: 'bg-sky-500', // Arbitrum
67
+ 10: 'bg-red-500', // Optimism
68
+ 56: 'bg-yellow-500', // BSC
69
+ 43114: 'bg-red-600', // Avalanche
70
+ }
71
+
72
+ function NetworkBadge({ chainId, name }: Props) {
73
+ return (
74
+ <div className="flex items-center gap-1.5 px-2 py-1 rounded-full bg-gray-100 text-xs">
75
+ <div className={cn("w-2 h-2 rounded-full", NETWORK_COLORS[chainId] || 'bg-gray-400')} />
76
+ <span>{name}</span>
77
+ </div>
78
+ )
79
+ }
80
+ ```
81
+
82
+ ---
83
+
84
+ ## Wrong Network Alert (网络错误提示)
85
+
86
+ ```tsx
87
+ function WrongNetworkAlert({ expected, onSwitch }: Props) {
88
+ return (
89
+ <div className="rounded-xl border border-warning/30 bg-warning/10 p-4">
90
+ <div className="flex items-start gap-3">
91
+ <AlertIcon className="w-5 h-5 text-warning flex-shrink-0 mt-0.5" />
92
+ <div>
93
+ <h4 className="font-medium text-warning">网络不匹配</h4>
94
+ <p className="text-sm text-warning/80 mt-1">请切换到 {expected} 网络</p>
95
+ <button
96
+ onClick={onSwitch}
97
+ className="mt-3 px-3 py-1.5 rounded-lg bg-warning text-white text-sm hover:bg-warning/90 transition-colors"
98
+ >
99
+ 切换网络
100
+ </button>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ )
105
+ }
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Transaction Status (交易状态)
111
+
112
+ ```tsx
113
+ function TransactionStatus({ status, hash }: Props) {
114
+ const explorerUrl = `https://etherscan.io/tx/${hash}`
115
+
116
+ return (
117
+ <div className="rounded-xl border border-gray-100 p-4 space-y-3">
118
+ <div className="flex items-center gap-2">
119
+ {status === 'pending' && (
120
+ <>
121
+ <Spinner className="w-4 h-4 animate-spin text-primary-500" />
122
+ <span className="text-primary-500 font-medium">交易处理中...</span>
123
+ </>
124
+ )}
125
+ {status === 'confirmed' && (
126
+ <>
127
+ <CheckIcon className="w-4 h-4 text-success" />
128
+ <span className="text-success font-medium">交易已确认</span>
129
+ </>
130
+ )}
131
+ {status === 'failed' && (
132
+ <>
133
+ <XIcon className="w-4 h-4 text-error" />
134
+ <span className="text-error font-medium">交易失败</span>
135
+ </>
136
+ )}
137
+ </div>
138
+
139
+ {hash && (
140
+ <a
141
+ href={explorerUrl}
142
+ target="_blank"
143
+ rel="noopener noreferrer"
144
+ className="text-sm text-gray-500 hover:text-gray-700 flex items-center gap-1"
145
+ >
146
+ <span className="font-mono">{truncateAddress(hash)}</span>
147
+ <ExternalLinkIcon className="w-3 h-3" />
148
+ </a>
149
+ )}
150
+ </div>
151
+ )
152
+ }
153
+ ```
154
+
155
+ ---
156
+
157
+ ## Gas Estimation (Gas 估算)
158
+
159
+ ```tsx
160
+ function GasEstimate({ gasLimit, gasPrice, ethPrice }: Props) {
161
+ const gasCostWei = gasLimit * gasPrice
162
+ const gasCostEth = formatUnits(gasCostWei, 18)
163
+ const gasCostUsd = (parseFloat(gasCostEth) * ethPrice).toFixed(2)
164
+
165
+ return (
166
+ <div className="flex items-center justify-between text-sm text-gray-500">
167
+ <span>预估 Gas 费</span>
168
+ <span>
169
+ ~{parseFloat(gasCostEth).toFixed(6)} ETH
170
+ <span className="text-gray-400 ml-1">(${gasCostUsd})</span>
171
+ </span>
172
+ </div>
173
+ )
174
+ }
175
+ ```
176
+
177
+ ---
178
+
179
+ ## Balance Display (余额展示)
180
+
181
+ ```tsx
182
+ function BalanceDisplay({ balance, symbol, decimals = 18 }: Props) {
183
+ const formatted = formatUnits(balance, decimals)
184
+ const display = parseFloat(formatted).toFixed(4)
185
+
186
+ return (
187
+ <div className="flex items-center gap-2">
188
+ <span className="text-lg font-bold text-gray-900 tabular-nums">{display}</span>
189
+ <span className="text-sm text-gray-500">{symbol}</span>
190
+ </div>
191
+ )
192
+ }
193
+ ```
194
+
195
+ ---
196
+
197
+ ## Token Selector (代币选择器)
198
+
199
+ ```tsx
200
+ function TokenSelector({ tokens, selected, onSelect }: Props) {
201
+ const [isOpen, setIsOpen] = useState(false)
202
+
203
+ return (
204
+ <div className="relative">
205
+ <button
206
+ onClick={() => setIsOpen(!isOpen)}
207
+ className="flex items-center gap-2 px-3 py-2 bg-gray-100 rounded-xl hover:bg-gray-200 transition-colors"
208
+ >
209
+ <img src={selected.icon} alt={selected.symbol} className="w-6 h-6 rounded-full" />
210
+ <span className="font-medium">{selected.symbol}</span>
211
+ <ChevronDownIcon className={cn("w-4 h-4 transition-transform", isOpen && "rotate-180")} />
212
+ </button>
213
+
214
+ {isOpen && (
215
+ <div className="absolute top-full mt-2 w-48 bg-white border border-gray-100 rounded-xl shadow-lg overflow-hidden z-50">
216
+ {tokens.map((token) => (
217
+ <button
218
+ key={token.address}
219
+ onClick={() => { onSelect(token); setIsOpen(false) }}
220
+ className={cn(
221
+ "w-full flex items-center gap-3 px-4 py-3 hover:bg-gray-50 transition-colors",
222
+ selected.address === token.address && "bg-primary-50"
223
+ )}
224
+ >
225
+ <img src={token.icon} alt={token.symbol} className="w-6 h-6 rounded-full" />
226
+ <div className="flex-1 text-left">
227
+ <p className="font-medium text-gray-900">{token.symbol}</p>
228
+ <p className="text-xs text-gray-500">{token.name}</p>
229
+ </div>
230
+ </button>
231
+ ))}
232
+ </div>
233
+ )}
234
+ </div>
235
+ )
236
+ }
237
+ ```
238
+
239
+ ---
240
+
241
+ ## Signature Request Modal (签名请求)
242
+
243
+ ```tsx
244
+ function SignatureModal({ message, onSign, onCancel }: Props) {
245
+ return (
246
+ <div className="fixed inset-0 flex items-center justify-center z-50 p-4">
247
+ <div className="bg-white rounded-2xl shadow-xl w-full max-w-md overflow-hidden">
248
+ <div className="px-6 py-4 border-b border-gray-100">
249
+ <h2 className="text-lg font-semibold text-gray-900 flex items-center gap-2">
250
+ <PenIcon className="w-5 h-5 text-primary-500" />
251
+ 签名请求
252
+ </h2>
253
+ </div>
254
+
255
+ <div className="px-6 py-4">
256
+ <p className="text-sm text-gray-500 mb-3">应用请求您签名以下消息:</p>
257
+ <div className="bg-gray-50 rounded-xl p-4">
258
+ <pre className="text-xs text-gray-700 whitespace-pre-wrap break-all font-mono">
259
+ {message}
260
+ </pre>
261
+ </div>
262
+ <p className="text-xs text-gray-400 mt-3">
263
+ 签名不会花费 Gas 费用
264
+ </p>
265
+ </div>
266
+
267
+ <div className="px-6 py-4 bg-gray-50 flex gap-3">
268
+ <button
269
+ onClick={onCancel}
270
+ className="flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-xl hover:bg-gray-200 text-sm font-medium"
271
+ >
272
+ 取消
273
+ </button>
274
+ <button
275
+ onClick={onSign}
276
+ className="flex-1 px-4 py-2.5 bg-primary-500 text-white rounded-xl hover:bg-primary-600 text-sm font-medium"
277
+ >
278
+ 签名
279
+ </button>
280
+ </div>
281
+ </div>
282
+ </div>
283
+ )
284
+ }
285
+ ```
286
+
287
+ ---
288
+
289
+ ## Transaction Confirmation (交易确认)
290
+
291
+ ```tsx
292
+ function TransactionConfirmation({ tx, onConfirm, onCancel }: Props) {
293
+ return (
294
+ <div className="fixed inset-0 flex items-center justify-center z-50 p-4">
295
+ <div className="bg-white rounded-2xl shadow-xl w-full max-w-md overflow-hidden">
296
+ <div className="px-6 py-4 border-b border-gray-100">
297
+ <h2 className="text-lg font-semibold text-gray-900">确认交易</h2>
298
+ </div>
299
+
300
+ <div className="px-6 py-4 space-y-4">
301
+ {/* 交易详情 */}
302
+ <div className="space-y-3">
303
+ <div className="flex justify-between text-sm">
304
+ <span className="text-gray-500">发送至</span>
305
+ <span className="font-mono text-gray-900">{truncateAddress(tx.to)}</span>
306
+ </div>
307
+ <div className="flex justify-between text-sm">
308
+ <span className="text-gray-500">金额</span>
309
+ <span className="font-medium text-gray-900">{tx.value} {tx.symbol}</span>
310
+ </div>
311
+ </div>
312
+
313
+ {/* Gas 估算 */}
314
+ <div className="pt-3 border-t border-gray-100">
315
+ <GasEstimate
316
+ gasLimit={tx.gasLimit}
317
+ gasPrice={tx.gasPrice}
318
+ ethPrice={tx.ethPrice}
319
+ />
320
+ </div>
321
+ </div>
322
+
323
+ <div className="px-6 py-4 bg-gray-50 flex gap-3">
324
+ <button
325
+ onClick={onCancel}
326
+ className="flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-xl hover:bg-gray-200 text-sm font-medium"
327
+ >
328
+ 取消
329
+ </button>
330
+ <button
331
+ onClick={onConfirm}
332
+ className="flex-1 px-4 py-2.5 bg-primary-500 text-white rounded-xl hover:bg-primary-600 text-sm font-medium"
333
+ >
334
+ 确认发送
335
+ </button>
336
+ </div>
337
+ </div>
338
+ </div>
339
+ )
340
+ }
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Web3 场景文案规范
346
+
347
+ | 场景 | 文案 |
348
+ |------|------|
349
+ | 未连接 | "连接钱包" |
350
+ | 连接中 | "连接中..." |
351
+ | 签名请求 | "请在钱包中确认" |
352
+ | 交易发送 | "交易已提交" |
353
+ | 交易确认 | "交易已确认" |
354
+ | 交易失败 | "交易失败" |
355
+ | 余额不足 | "余额不足" |
356
+ | 网络错误 | "请切换到 [网络名] 网络" |
357
+ | Gas 过低 | "Gas 费用过低,交易可能失败" |
358
+ | 授权 | "授权 [代币名]" |
359
+
360
+ ---
361
+
362
+ ## 推荐库
363
+
364
+ | 用途 | 推荐库 |
365
+ |------|--------|
366
+ | 钱包连接 | `wagmi` + `viem` |
367
+ | UI 套件 | `connectkit` / `rainbowkit` |
368
+ | 动画 | `framer-motion` |
369
+ | Toast | `sonner` |
370
+ | 数字格式化 | `ethers` formatUnits |
371
+
372
+ ---
373
+
374
+ ## 必加 Classes
375
+
376
+ ```tsx
377
+ "font-mono" // 地址、哈希
378
+ "tabular-nums" // 数字对齐
379
+ "truncate" // 长文本截断
380
+ "transition-all duration-200" // 所有交互
381
+ ```
382
+
383
+ ---
384
+
385
+ ## 相关技能
386
+
387
+ - **design-tokens**: 设计令牌规范
388
+ - **ux-patterns**: 交互模式和文案规范
389
+ - **ai-components**: AI 专项组件
390
+ - **uiux-designer**: 统一调度入口
@@ -0,0 +1,28 @@
1
+ {
2
+ "domain": "ui.web3",
3
+ "description": "Web3 interface component library. Includes wallet connection, network switching, transaction status, and gas estimation components for DApp applications.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "prompt": {
8
+ "type": "string"
9
+ }
10
+ },
11
+ "required": []
12
+ },
13
+ "outputSchema": {
14
+ "type": "object",
15
+ "properties": {
16
+ "result": {
17
+ "type": "string"
18
+ }
19
+ }
20
+ },
21
+ "dependencies": [],
22
+ "version": "0.1.0",
23
+ "author": "rotifer-team",
24
+ "createdAt": 1771939387302,
25
+ "fidelity": "Wrapped",
26
+ "transparency": "Open",
27
+ "source": "skill"
28
+ }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@rotifer/playground",
3
- "version": "0.5.0-alpha.2",
3
+ "version": "0.7.0",
4
4
  "description": "Rotifer Protocol Playground — local development environment for gene development, Arena competition, and protocol simulation",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Rotifer Protocol Contributors",
7
- "homepage": "https://github.com/rotifer-protocol/rotifer-playground#readme",
7
+ "homepage": "https://gitlab.com/rotifer-protocol/rotifer-playground#readme",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "git+https://github.com/rotifer-protocol/rotifer-playground.git"
10
+ "url": "git+https://gitlab.com/rotifer-protocol/rotifer-playground.git"
11
11
  },
12
12
  "bugs": {
13
- "url": "https://github.com/rotifer-protocol/rotifer-playground/issues"
13
+ "url": "https://gitlab.com/rotifer-protocol/rotifer-playground/issues"
14
14
  },
15
15
  "keywords": [
16
16
  "rotifer",
@@ -51,7 +51,8 @@
51
51
  "ajv-formats": "^3.0.0",
52
52
  "chalk": "^4.1.2",
53
53
  "cli-table3": "^0.6.5",
54
- "commander": "^13.0.0"
54
+ "commander": "^13.0.0",
55
+ "pg": "^8.20.0"
55
56
  },
56
57
  "devDependencies": {
57
58
  "@napi-rs/cli": "^3.5.1",