@dyyz1993/create-agent 2.1.1 → 2.1.2

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 (346) hide show
  1. package/package.json +5 -4
  2. package/src/__tests__/cli.test.ts +2 -0
  3. package/src/__tests__/copy.test.ts +110 -122
  4. package/src/__tests__/create-args.test.ts +113 -0
  5. package/src/__tests__/templates.test.ts +29 -3
  6. package/src/__tests__/update.test.ts +129 -0
  7. package/src/cli.ts +30 -32
  8. package/src/commands/create.ts +83 -24
  9. package/src/commands/update.ts +174 -0
  10. package/src/commands/workspace.ts +26 -6
  11. package/src/lib/copy.ts +127 -91
  12. package/src/lib/templates.ts +12 -0
  13. package/templates/agent/.husky/commit-msg +4 -0
  14. package/templates/agent/.husky/pre-commit +11 -0
  15. package/templates/agent/.husky/pre-push +6 -0
  16. package/templates/agent/CHANGELOG.md +15 -0
  17. package/templates/agent/package.json +3 -3
  18. package/templates/agent/src/gateway/__tests__/ws-handler-token.test.ts +53 -39
  19. package/templates/agent/src/mainview/App.tsx +14 -12
  20. package/templates/agent/src/mainview/__tests__/hooks/use-rpc-init.test.ts +194 -190
  21. package/templates/agent/src/mainview/components/bash/BashPanel.tsx +210 -189
  22. package/templates/agent/src/mainview/components/chat/ChatPanel.tsx +45 -20
  23. package/templates/agent/src/mainview/components/common/ThemeToggle.tsx +41 -21
  24. package/templates/agent/src/mainview/components/debug/DebugPanel.tsx +181 -114
  25. package/templates/agent/src/mainview/components/debug/__tests__/DebugPanel.test.tsx +80 -80
  26. package/templates/agent/src/mainview/components/diff/__tests__/DiffViewerPanel.test.tsx +61 -58
  27. package/templates/agent/src/mainview/components/feed/FeedPanel.tsx +43 -41
  28. package/templates/agent/src/mainview/components/file-preview/FilePreviewOverlay.tsx +69 -50
  29. package/templates/agent/src/mainview/components/file-preview/VirtualizedCodeView.tsx +31 -18
  30. package/templates/agent/src/mainview/components/git/GitPanel.tsx +731 -490
  31. package/templates/agent/src/mainview/components/git/__tests__/GitPanel.test.tsx +157 -139
  32. package/templates/agent/src/mainview/components/layout/AppLayout.tsx +210 -161
  33. package/templates/agent/src/mainview/components/layout/__tests__/AppLayout.test.tsx +130 -122
  34. package/templates/agent/src/mainview/components/rules/RulesPanel.tsx +119 -109
  35. package/templates/agent/src/mainview/components/search/SearchPanel.tsx +123 -117
  36. package/templates/agent/src/mainview/components/search/__tests__/SearchPanel.test.tsx +64 -44
  37. package/templates/agent/src/mainview/components/sidebar/__tests__/PinButton.test.tsx +38 -38
  38. package/templates/agent/src/mainview/components/todo/TodoPanel.tsx +40 -38
  39. package/templates/agent/src/mainview/components/todo/__tests__/TodoPanel.test.tsx +72 -72
  40. package/templates/agent/src/mainview/lib/i18n/locales/en.json +175 -155
  41. package/templates/agent/src/mainview/lib/i18n/locales/zh.json +173 -155
  42. package/templates/agent/src/mainview/stores/use-app-store.ts +96 -86
  43. package/templates/agent/src/mainview/stores/use-explorer-store.ts +292 -275
  44. package/templates/agent/src/mainview/types/index.ts +23 -22
  45. package/templates/agent/src/mainview/utils/file-icon.tsx +17 -21
  46. package/templates/agent/src/shared/handlers/chat.ts +53 -53
  47. package/templates/agent/src/shared/handlers/debug.ts +13 -3
  48. package/templates/browser-agent/.env.example +19 -0
  49. package/templates/browser-agent/.husky/commit-msg +4 -0
  50. package/templates/browser-agent/.husky/pre-commit +11 -0
  51. package/templates/browser-agent/.husky/pre-push +6 -0
  52. package/templates/browser-agent/.prettierignore +6 -0
  53. package/templates/browser-agent/.prettierrc +9 -0
  54. package/templates/browser-agent/AGENTS.md +396 -0
  55. package/templates/browser-agent/CHANGELOG.md +15 -0
  56. package/templates/browser-agent/LICENSE +21 -0
  57. package/templates/browser-agent/README.md +103 -0
  58. package/templates/browser-agent/commitlint.config.js +8 -0
  59. package/templates/browser-agent/electrobun.config.ts +27 -0
  60. package/templates/browser-agent/electron/main.js +46 -0
  61. package/templates/browser-agent/electron/preload.js +5 -0
  62. package/templates/browser-agent/electron-builder.json +40 -0
  63. package/templates/browser-agent/eslint.config.mjs +79 -0
  64. package/templates/browser-agent/llms.txt +24 -0
  65. package/templates/browser-agent/package.json +140 -0
  66. package/templates/browser-agent/postcss.config.js +6 -0
  67. package/templates/browser-agent/scripts/dev.ts +138 -0
  68. package/templates/browser-agent/src/__tests__/hybrid-mode.test.ts +126 -0
  69. package/templates/browser-agent/src/__tests__/server-config-security.test.ts +55 -0
  70. package/templates/browser-agent/src/__tests__/server-config.test.ts +59 -0
  71. package/templates/browser-agent/src/bun/index.ts +130 -0
  72. package/templates/browser-agent/src/bun/three.d.ts +1 -0
  73. package/templates/browser-agent/src/gateway/http-routes.ts +1 -0
  74. package/templates/browser-agent/src/gateway/ipc-transport.ts +68 -0
  75. package/templates/browser-agent/src/gateway/sse-transport.ts +221 -0
  76. package/templates/browser-agent/src/mainview/App.tsx +45 -0
  77. package/templates/browser-agent/src/mainview/__tests__/hooks/use-rpc-init.test.ts +202 -0
  78. package/templates/browser-agent/src/mainview/__tests__/hooks/use-sidebar-resize.test.ts +127 -0
  79. package/templates/browser-agent/src/mainview/__tests__/i18n/i18n.test.ts +49 -0
  80. package/templates/browser-agent/src/mainview/__tests__/setup.ts +40 -0
  81. package/templates/browser-agent/src/mainview/__tests__/stores/use-chat-store.test.ts +73 -0
  82. package/templates/browser-agent/src/mainview/__tests__/stores/use-sidebar-store.test.ts +61 -0
  83. package/templates/browser-agent/src/mainview/__tests__/theme-variables.test.ts +36 -0
  84. package/templates/browser-agent/src/mainview/components/assets/AssetsPanel.tsx +139 -0
  85. package/templates/browser-agent/src/mainview/components/chat/ChatPanel.tsx +219 -0
  86. package/templates/browser-agent/src/mainview/components/chat/CommandBar.tsx +184 -0
  87. package/templates/browser-agent/src/mainview/components/chat/MessageBubble.tsx +249 -0
  88. package/templates/browser-agent/src/mainview/components/chat/ToolPicker.tsx +115 -0
  89. package/templates/browser-agent/src/mainview/components/common/ErrorBoundary.tsx +1 -0
  90. package/templates/browser-agent/src/mainview/components/common/LanguageSwitcher.tsx +15 -0
  91. package/templates/browser-agent/src/mainview/components/common/ThemeToggle.tsx +45 -0
  92. package/templates/browser-agent/src/mainview/components/common/__tests__/ErrorBoundary.test.tsx +74 -0
  93. package/templates/browser-agent/src/mainview/components/common/__tests__/LanguageSwitcher.test.tsx +44 -0
  94. package/templates/browser-agent/src/mainview/components/common/__tests__/ThemeToggle.test.tsx +41 -0
  95. package/templates/browser-agent/src/mainview/components/dev/NetworkPanel.tsx +155 -0
  96. package/templates/browser-agent/src/mainview/components/layout/AppLayout.tsx +311 -0
  97. package/templates/browser-agent/src/mainview/components/onboarding/SetupWizard.tsx +310 -0
  98. package/templates/browser-agent/src/mainview/components/process/ProcessPanel.tsx +329 -0
  99. package/templates/browser-agent/src/mainview/components/sidebar/SessionSidebar.tsx +122 -0
  100. package/templates/browser-agent/src/mainview/components/sidebar/SkillSidebar.tsx +115 -0
  101. package/templates/browser-agent/src/mainview/components/topbar/TopBar.tsx +350 -0
  102. package/templates/browser-agent/src/mainview/global.d.ts +13 -0
  103. package/templates/browser-agent/src/mainview/hooks/__tests__/use-breakpoint.test.ts +151 -0
  104. package/templates/browser-agent/src/mainview/hooks/use-agent-chat.ts +157 -0
  105. package/templates/browser-agent/src/mainview/hooks/use-breakpoint.ts +68 -0
  106. package/templates/browser-agent/src/mainview/hooks/use-rpc-init.ts +71 -0
  107. package/templates/browser-agent/src/mainview/hooks/use-sidebar-resize.ts +40 -0
  108. package/templates/browser-agent/src/mainview/index.css +71 -0
  109. package/templates/browser-agent/src/mainview/index.html +12 -0
  110. package/templates/browser-agent/src/mainview/lib/api-client.ts +397 -0
  111. package/templates/browser-agent/src/mainview/lib/i18n/index.ts +30 -0
  112. package/templates/browser-agent/src/mainview/lib/i18n/locales/en.json +130 -0
  113. package/templates/browser-agent/src/mainview/lib/i18n/locales/zh.json +128 -0
  114. package/templates/browser-agent/src/mainview/lib/network-bus.ts +92 -0
  115. package/templates/browser-agent/src/mainview/lib/rpc-cache.ts +94 -0
  116. package/templates/browser-agent/src/mainview/main.tsx +18 -0
  117. package/templates/browser-agent/src/mainview/stores/__tests__/use-connection-store.test.ts +26 -0
  118. package/templates/browser-agent/src/mainview/stores/__tests__/use-locale-store.test.ts +32 -0
  119. package/templates/browser-agent/src/mainview/stores/__tests__/use-log-store.test.ts +28 -0
  120. package/templates/browser-agent/src/mainview/stores/__tests__/use-theme-store.test.ts +59 -0
  121. package/templates/browser-agent/src/mainview/stores/message-batcher.ts +25 -0
  122. package/templates/browser-agent/src/mainview/stores/use-asset-store.ts +65 -0
  123. package/templates/browser-agent/src/mainview/stores/use-chat-store.ts +200 -0
  124. package/templates/browser-agent/src/mainview/stores/use-connection-store.ts +173 -0
  125. package/templates/browser-agent/src/mainview/stores/use-locale-store.ts +27 -0
  126. package/templates/browser-agent/src/mainview/stores/use-log-store.ts +16 -0
  127. package/templates/browser-agent/src/mainview/stores/use-network-panel-store.ts +18 -0
  128. package/templates/browser-agent/src/mainview/stores/use-record-store.ts +147 -0
  129. package/templates/browser-agent/src/mainview/stores/use-session-store.ts +151 -0
  130. package/templates/browser-agent/src/mainview/stores/use-sidebar-store.ts +161 -0
  131. package/templates/browser-agent/src/mainview/stores/use-theme-store.ts +46 -0
  132. package/templates/browser-agent/src/mainview/stores/use-view-store.ts +20 -0
  133. package/templates/browser-agent/src/mainview/types/index.ts +6 -0
  134. package/templates/browser-agent/src/server-config.ts +45 -0
  135. package/templates/browser-agent/src/server.ts +78 -0
  136. package/templates/browser-agent/src/shared/handlers/__tests__/chat-concurrency.test.ts +127 -0
  137. package/templates/browser-agent/src/shared/handlers/__tests__/chat-handler.test.ts +77 -0
  138. package/templates/browser-agent/src/shared/handlers/__tests__/file-handler.test.ts +100 -0
  139. package/templates/browser-agent/src/shared/handlers/__tests__/system-handler.test.ts +55 -0
  140. package/templates/browser-agent/src/shared/handlers/__tests__/timer-handler.test.ts +77 -0
  141. package/templates/browser-agent/src/shared/handlers/browser.ts +596 -0
  142. package/templates/browser-agent/src/shared/handlers/chat.ts +213 -0
  143. package/templates/browser-agent/src/shared/handlers/file.ts +99 -0
  144. package/templates/browser-agent/src/shared/handlers/index.ts +7 -0
  145. package/templates/browser-agent/src/shared/handlers/session.ts +167 -0
  146. package/templates/browser-agent/src/shared/handlers/system.ts +27 -0
  147. package/templates/browser-agent/src/shared/handlers/timer.ts +34 -0
  148. package/templates/browser-agent/src/shared/http-routes.ts +437 -0
  149. package/templates/browser-agent/src/shared/lib/__tests__/logger.test.ts +92 -0
  150. package/templates/browser-agent/src/shared/lib/__tests__/path-security.test.ts +77 -0
  151. package/templates/browser-agent/src/shared/lib/__tests__/web-server.test.ts +203 -0
  152. package/templates/browser-agent/src/shared/lib/agent.ts +384 -0
  153. package/templates/browser-agent/src/shared/lib/cdp.ts +448 -0
  154. package/templates/browser-agent/src/shared/lib/generate.ts +111 -0
  155. package/templates/browser-agent/src/shared/lib/logger.ts +152 -0
  156. package/templates/browser-agent/src/shared/lib/mock-stream.ts +147 -0
  157. package/templates/browser-agent/src/shared/lib/path-security.ts +38 -0
  158. package/templates/browser-agent/src/shared/lib/port-registry.ts +103 -0
  159. package/templates/browser-agent/src/shared/lib/web-server.ts +127 -0
  160. package/templates/browser-agent/src/shared/lib/xhs-extract.ts +71 -0
  161. package/templates/browser-agent/src/shared/modules/browser.ts +86 -0
  162. package/templates/browser-agent/src/shared/modules/chat.ts +20 -0
  163. package/templates/browser-agent/src/shared/modules/file.ts +40 -0
  164. package/templates/browser-agent/src/shared/modules/session.ts +55 -0
  165. package/templates/browser-agent/src/shared/modules/system.ts +8 -0
  166. package/templates/browser-agent/src/shared/modules/timer.ts +11 -0
  167. package/templates/browser-agent/src/shared/register-all-handlers.ts +36 -0
  168. package/templates/browser-agent/src/shared/rpc-schema.ts +34 -0
  169. package/templates/browser-agent/tailwind.config.js +15 -0
  170. package/templates/browser-agent/tsconfig.ipc.json +14 -0
  171. package/templates/browser-agent/tsconfig.json +36 -0
  172. package/templates/browser-agent/vite.config.ts +3 -0
  173. package/templates/browser-agent/vitest.config.ts +3 -0
  174. package/templates/chat/.husky/commit-msg +4 -0
  175. package/templates/chat/.husky/pre-commit +11 -0
  176. package/templates/chat/.husky/pre-push +6 -0
  177. package/templates/chat/CHANGELOG.md +15 -0
  178. package/templates/chat/commitlint.config.js +8 -0
  179. package/templates/chat/package.json +19 -4
  180. package/templates/chat/src/mainview/__tests__/hooks/use-input-history.test.ts +125 -0
  181. package/templates/chat/src/mainview/__tests__/setup.ts +32 -29
  182. package/templates/chat/src/mainview/components/chat/ChatPanel.tsx +80 -55
  183. package/templates/chat/src/mainview/components/common/ThemeToggle.tsx +40 -20
  184. package/templates/chat/src/mainview/lib/i18n/locales/en.json +175 -155
  185. package/templates/chat/src/mainview/lib/i18n/locales/zh.json +173 -155
  186. package/templates/chat/src/shared/handlers/chat.ts +17 -19
  187. package/templates/chat/src/shared/handlers/debug.ts +12 -2
  188. package/templates/cowork/.env.example +8 -0
  189. package/templates/cowork/.prettierignore +6 -0
  190. package/templates/cowork/.prettierrc +9 -0
  191. package/templates/cowork/AGENTS.md +236 -0
  192. package/templates/cowork/CHANGELOG.md +15 -0
  193. package/templates/cowork/LICENSE +21 -0
  194. package/templates/cowork/README.md +103 -0
  195. package/templates/cowork/commitlint.config.js +8 -0
  196. package/templates/cowork/docs/CODE-VIEW-PLAN.md +637 -0
  197. package/templates/cowork/docs/CODE-VIEW-V2.md +196 -0
  198. package/templates/cowork/docs/CODE-VIEW-V4.md +150 -0
  199. package/templates/cowork/electrobun.config.ts +27 -0
  200. package/templates/cowork/eslint.config.mjs +79 -0
  201. package/templates/cowork/llms.txt +24 -0
  202. package/templates/cowork/package.json +87 -0
  203. package/templates/cowork/postcss.config.js +6 -0
  204. package/templates/cowork/scripts/dev.ts +138 -0
  205. package/templates/cowork/src/__tests__/hybrid-mode.test.ts +126 -0
  206. package/templates/cowork/src/__tests__/server-config-security.test.ts +55 -0
  207. package/templates/cowork/src/__tests__/server-config.test.ts +59 -0
  208. package/templates/cowork/src/bun/index.ts +130 -0
  209. package/templates/cowork/src/bun/three.d.ts +1 -0
  210. package/templates/cowork/src/gateway/http-routes.ts +1 -0
  211. package/templates/cowork/src/gateway/ipc-transport.ts +68 -0
  212. package/templates/cowork/src/gateway/sse-transport.ts +231 -0
  213. package/templates/cowork/src/mainview/App.tsx +45 -0
  214. package/templates/cowork/src/mainview/__tests__/hooks/use-rpc-init.test.ts +202 -0
  215. package/templates/cowork/src/mainview/__tests__/hooks/use-sidebar-resize.test.ts +127 -0
  216. package/templates/cowork/src/mainview/__tests__/i18n/i18n.test.ts +49 -0
  217. package/templates/cowork/src/mainview/__tests__/setup.ts +40 -0
  218. package/templates/cowork/src/mainview/__tests__/stores/use-chat-store.test.ts +73 -0
  219. package/templates/cowork/src/mainview/__tests__/stores/use-sidebar-store.test.ts +61 -0
  220. package/templates/cowork/src/mainview/__tests__/theme-variables.test.ts +36 -0
  221. package/templates/cowork/src/mainview/components/chat/TaskChat.tsx +311 -0
  222. package/templates/cowork/src/mainview/components/chat/__tests__/localhost-links.test.ts +76 -0
  223. package/templates/cowork/src/mainview/components/common/ErrorBoundary.tsx +1 -0
  224. package/templates/cowork/src/mainview/components/common/LanguageSwitcher.tsx +15 -0
  225. package/templates/cowork/src/mainview/components/common/ThemeToggle.tsx +45 -0
  226. package/templates/cowork/src/mainview/components/common/__tests__/ErrorBoundary.test.tsx +74 -0
  227. package/templates/cowork/src/mainview/components/common/__tests__/LanguageSwitcher.test.tsx +44 -0
  228. package/templates/cowork/src/mainview/components/common/__tests__/ThemeToggle.test.tsx +41 -0
  229. package/templates/cowork/src/mainview/components/dev/NetworkPanel.tsx +155 -0
  230. package/templates/cowork/src/mainview/components/layout/AppLayout.tsx +216 -0
  231. package/templates/cowork/src/mainview/components/right/ArtifactsPanel.tsx +54 -0
  232. package/templates/cowork/src/mainview/components/right/ContextPanel.tsx +133 -0
  233. package/templates/cowork/src/mainview/components/right/ElementPicker.tsx +206 -0
  234. package/templates/cowork/src/mainview/components/right/PreviewBlock.tsx +155 -0
  235. package/templates/cowork/src/mainview/components/right/ProgressPanel.tsx +85 -0
  236. package/templates/cowork/src/mainview/components/sidebar/TaskSidebar.tsx +211 -0
  237. package/templates/cowork/src/mainview/components/topbar/TopBar.tsx +86 -0
  238. package/templates/cowork/src/mainview/global.d.ts +13 -0
  239. package/templates/cowork/src/mainview/hooks/__tests__/use-breakpoint.test.ts +123 -0
  240. package/templates/cowork/src/mainview/hooks/use-breakpoint.ts +53 -0
  241. package/templates/cowork/src/mainview/hooks/use-rpc-init.ts +26 -0
  242. package/templates/cowork/src/mainview/hooks/use-sidebar-resize.ts +40 -0
  243. package/templates/cowork/src/mainview/index.css +89 -0
  244. package/templates/cowork/src/mainview/index.html +12 -0
  245. package/templates/cowork/src/mainview/lib/api-client.ts +404 -0
  246. package/templates/cowork/src/mainview/lib/i18n/index.ts +30 -0
  247. package/templates/cowork/src/mainview/lib/i18n/locales/en.json +130 -0
  248. package/templates/cowork/src/mainview/lib/i18n/locales/zh.json +128 -0
  249. package/templates/cowork/src/mainview/lib/network-bus.ts +92 -0
  250. package/templates/cowork/src/mainview/lib/rpc-cache.ts +94 -0
  251. package/templates/cowork/src/mainview/main.tsx +18 -0
  252. package/templates/cowork/src/mainview/stores/__tests__/use-connection-store.test.ts +26 -0
  253. package/templates/cowork/src/mainview/stores/__tests__/use-locale-store.test.ts +32 -0
  254. package/templates/cowork/src/mainview/stores/__tests__/use-log-store.test.ts +28 -0
  255. package/templates/cowork/src/mainview/stores/__tests__/use-preview-store.test.ts +193 -0
  256. package/templates/cowork/src/mainview/stores/__tests__/use-sidebar-store.test.ts +81 -0
  257. package/templates/cowork/src/mainview/stores/__tests__/use-theme-store.test.ts +59 -0
  258. package/templates/cowork/src/mainview/stores/message-batcher.ts +25 -0
  259. package/templates/cowork/src/mainview/stores/use-chat-store.ts +198 -0
  260. package/templates/cowork/src/mainview/stores/use-connection-store.ts +168 -0
  261. package/templates/cowork/src/mainview/stores/use-context-store.ts +68 -0
  262. package/templates/cowork/src/mainview/stores/use-locale-store.ts +27 -0
  263. package/templates/cowork/src/mainview/stores/use-log-store.ts +16 -0
  264. package/templates/cowork/src/mainview/stores/use-network-panel-store.ts +18 -0
  265. package/templates/cowork/src/mainview/stores/use-output-store.ts +47 -0
  266. package/templates/cowork/src/mainview/stores/use-preview-store.ts +97 -0
  267. package/templates/cowork/src/mainview/stores/use-sidebar-store.ts +272 -0
  268. package/templates/cowork/src/mainview/stores/use-task-store.ts +86 -0
  269. package/templates/cowork/src/mainview/stores/use-theme-store.ts +46 -0
  270. package/templates/cowork/src/mainview/stores/use-view-store.ts +29 -0
  271. package/templates/cowork/src/mainview/types/index.ts +6 -0
  272. package/templates/cowork/src/server-config.ts +44 -0
  273. package/templates/cowork/src/server.ts +78 -0
  274. package/templates/cowork/src/shared/handlers/__tests__/chat-concurrency.test.ts +127 -0
  275. package/templates/cowork/src/shared/handlers/__tests__/chat-handler.test.ts +77 -0
  276. package/templates/cowork/src/shared/handlers/__tests__/file-handler.test.ts +100 -0
  277. package/templates/cowork/src/shared/handlers/__tests__/preview-handler.test.ts +172 -0
  278. package/templates/cowork/src/shared/handlers/__tests__/system-handler.test.ts +55 -0
  279. package/templates/cowork/src/shared/handlers/__tests__/timer-handler.test.ts +77 -0
  280. package/templates/cowork/src/shared/handlers/chat.ts +213 -0
  281. package/templates/cowork/src/shared/handlers/context.ts +72 -0
  282. package/templates/cowork/src/shared/handlers/file.ts +99 -0
  283. package/templates/cowork/src/shared/handlers/index.ts +9 -0
  284. package/templates/cowork/src/shared/handlers/output.ts +59 -0
  285. package/templates/cowork/src/shared/handlers/preview.ts +81 -0
  286. package/templates/cowork/src/shared/handlers/system.ts +27 -0
  287. package/templates/cowork/src/shared/handlers/task.ts +101 -0
  288. package/templates/cowork/src/shared/handlers/timer.ts +34 -0
  289. package/templates/cowork/src/shared/http-routes.ts +444 -0
  290. package/templates/cowork/src/shared/lib/__tests__/logger.test.ts +92 -0
  291. package/templates/cowork/src/shared/lib/__tests__/path-security.test.ts +77 -0
  292. package/templates/cowork/src/shared/lib/__tests__/web-server.test.ts +203 -0
  293. package/templates/cowork/src/shared/lib/logger.ts +152 -0
  294. package/templates/cowork/src/shared/lib/path-security.ts +38 -0
  295. package/templates/cowork/src/shared/lib/port-registry.ts +103 -0
  296. package/templates/cowork/src/shared/lib/web-server.ts +127 -0
  297. package/templates/cowork/src/shared/modules/chat.ts +20 -0
  298. package/templates/cowork/src/shared/modules/context.ts +32 -0
  299. package/templates/cowork/src/shared/modules/file.ts +40 -0
  300. package/templates/cowork/src/shared/modules/output.ts +20 -0
  301. package/templates/cowork/src/shared/modules/preview.ts +44 -0
  302. package/templates/cowork/src/shared/modules/system.ts +8 -0
  303. package/templates/cowork/src/shared/modules/task.ts +31 -0
  304. package/templates/cowork/src/shared/modules/timer.ts +11 -0
  305. package/templates/cowork/src/shared/register-all-handlers.ts +36 -0
  306. package/templates/cowork/src/shared/rpc-schema.ts +38 -0
  307. package/templates/cowork/tailwind.config.js +15 -0
  308. package/templates/cowork/test-upload.txt +0 -0
  309. package/templates/cowork/tsconfig.ipc.json +14 -0
  310. package/templates/cowork/tsconfig.json +36 -0
  311. package/templates/cowork/vite.config.ts +3 -0
  312. package/templates/cowork/vitest.config.ts +3 -0
  313. package/templates/general/.husky/commit-msg +4 -0
  314. package/templates/general/.husky/pre-commit +11 -0
  315. package/templates/general/.husky/pre-push +6 -0
  316. package/templates/general/CHANGELOG.md +15 -0
  317. package/templates/general/commitlint.config.js +8 -0
  318. package/templates/general/package.json +19 -4
  319. package/templates/general/src/mainview/__tests__/hooks/use-input-history.test.ts +125 -0
  320. package/templates/general/src/mainview/__tests__/setup.ts +32 -29
  321. package/templates/general/src/mainview/components/chat/ChatPanel.tsx +80 -55
  322. package/templates/general/src/mainview/components/common/ThemeToggle.tsx +40 -20
  323. package/templates/general/src/mainview/components/debug/DebugPanel.tsx +170 -156
  324. package/templates/general/src/mainview/components/debug/__tests__/DebugPanel.test.tsx +169 -0
  325. package/templates/general/src/mainview/components/explorer/ConfirmDialog.tsx +42 -42
  326. package/templates/general/src/mainview/components/explorer/ContextMenu.tsx +72 -67
  327. package/templates/general/src/mainview/components/feed/FeedPanel.tsx +7 -5
  328. package/templates/general/src/mainview/components/file-preview/FilePreviewOverlay.tsx +64 -45
  329. package/templates/general/src/mainview/components/file-preview/VirtualizedCodeView.tsx +24 -7
  330. package/templates/general/src/mainview/components/git/GitPanel.tsx +700 -473
  331. package/templates/general/src/mainview/components/layout/AppLayout.tsx +123 -114
  332. package/templates/general/src/mainview/components/search/SearchPanel.tsx +15 -19
  333. package/templates/general/src/mainview/lib/i18n/locales/en.json +175 -155
  334. package/templates/general/src/mainview/lib/i18n/locales/zh.json +173 -155
  335. package/templates/general/src/mainview/stores/__tests__/use-explorer-store.test.ts +259 -0
  336. package/templates/general/src/mainview/stores/__tests__/use-feed-store.test.ts +160 -0
  337. package/templates/general/src/mainview/stores/__tests__/use-git-store.test.ts +313 -0
  338. package/templates/general/src/mainview/stores/__tests__/use-notification-store.test.ts +115 -0
  339. package/templates/general/src/mainview/stores/__tests__/use-sidebar-store.test.ts +120 -0
  340. package/templates/general/src/mainview/stores/use-explorer-store.ts +277 -260
  341. package/templates/general/src/mainview/types/index.ts +21 -20
  342. package/templates/general/src/shared/handlers/chat.ts +1 -1
  343. package/templates/general/src/shared/handlers/debug.ts +12 -2
  344. package/templates/shared/components/ErrorBoundary.tsx +0 -1
  345. package/templates/shared/vite-base.config.ts +8 -7
  346. /package/templates/{shared → browser-agent}/test-upload.txt +0 -0
@@ -19,134 +19,143 @@ import { LanguageSwitcher } from "../common/LanguageSwitcher";
19
19
  export type CenterTab = "chat" | "feed";
20
20
 
21
21
  interface AppLayoutProps {
22
- centerTab: CenterTab;
23
- setCenterTab: (tab: CenterTab) => void;
24
- sidebarWidth: number;
25
- handleResizeStart: (e: React.MouseEvent) => void;
22
+ centerTab: CenterTab;
23
+ setCenterTab: (tab: CenterTab) => void;
24
+ sidebarWidth: number;
25
+ handleResizeStart: (e: React.MouseEvent) => void;
26
26
  }
27
27
 
28
28
  export function AppLayout({
29
- centerTab,
30
- setCenterTab,
31
- sidebarWidth,
32
- handleResizeStart,
29
+ centerTab,
30
+ setCenterTab,
31
+ sidebarWidth,
32
+ handleResizeStart,
33
33
  }: AppLayoutProps) {
34
- const { t } = useTranslation();
35
- const mode = useConnectionStore((s) => s.mode);
36
- const filePreview = useExplorerStore((s) => s.filePreview);
37
- const loadingFile = useExplorerStore((s) => s.loadingFile);
38
- const closePreview = useExplorerStore((s) => s.closePreview);
34
+ const { t } = useTranslation();
35
+ const mode = useConnectionStore((s) => s.mode);
36
+ const filePreview = useExplorerStore((s) => s.filePreview);
37
+ const loadingFile = useExplorerStore((s) => s.loadingFile);
38
+ const closePreview = useExplorerStore((s) => s.closePreview);
39
+ const scrollToLine = useExplorerStore((s) => s.scrollToLine);
40
+ const clearScrollToLine = useExplorerStore((s) => s.clearScrollToLine);
39
41
 
40
- const activePanel = useSidebarStore((s) => s.activePanel);
41
- const isPinned = useSidebarStore((s) => s.isPinned);
42
- const drawerOpen = useSidebarStore((s) => s.drawerOpen);
43
- const setDrawerOpen = useSidebarStore((s) => s.setDrawerOpen);
44
- const breakpoint = useSidebarStore((s) => s.breakpoint);
42
+ const activePanel = useSidebarStore((s) => s.activePanel);
43
+ const isPinned = useSidebarStore((s) => s.isPinned);
44
+ const drawerOpen = useSidebarStore((s) => s.drawerOpen);
45
+ const setDrawerOpen = useSidebarStore((s) => s.setDrawerOpen);
46
+ const breakpoint = useSidebarStore((s) => s.breakpoint);
45
47
 
46
- const isMobile = breakpoint === "mobile";
47
- const isDesktop = breakpoint === "desktop";
48
- const sidebarIsDrawer = isMobile || !isPinned;
49
- const showSidebar = activePanel !== null && (isPinned || drawerOpen);
50
- const showDebug = isDesktop;
48
+ const isMobile = breakpoint === "mobile";
49
+ const isDesktop = breakpoint === "desktop";
50
+ const sidebarIsDrawer = isMobile || !isPinned;
51
+ const showSidebar = activePanel !== null && (isPinned || drawerOpen);
52
+ const showDebug = isDesktop;
51
53
 
52
- const sidebarContent = activePanel === "explorer" ? (
53
- <ExplorerSidebar hideOuterShell />
54
- ) : activePanel === "git" ? (
55
- <GitPanel hideOuterShell />
56
- ) : activePanel === "search" ? (
57
- <SearchPanel />
58
- ) : activePanel === "chat" ? (
59
- <ChatPanel />
60
- ) : activePanel === "feed" ? (
61
- <FeedPanel />
62
- ) : activePanel === "debug" ? (
63
- <DebugPanel />
64
- ) : null;
54
+ const sidebarContent =
55
+ activePanel === "explorer" ? (
56
+ <ExplorerSidebar hideOuterShell />
57
+ ) : activePanel === "git" ? (
58
+ <GitPanel hideOuterShell />
59
+ ) : activePanel === "search" ? (
60
+ <SearchPanel />
61
+ ) : activePanel === "chat" ? (
62
+ <ChatPanel />
63
+ ) : activePanel === "feed" ? (
64
+ <FeedPanel />
65
+ ) : activePanel === "debug" ? (
66
+ <DebugPanel />
67
+ ) : null;
65
68
 
66
- const centerTabs: { id: CenterTab; icon: typeof MessageSquare; label: string }[] = [
67
- { id: "chat", icon: MessageSquare, label: t("tabs.chat") },
68
- { id: "feed", icon: Rss, label: t("tabs.feed") },
69
- ];
69
+ const centerTabs: { id: CenterTab; icon: typeof MessageSquare; label: string }[] = [
70
+ { id: "chat", icon: MessageSquare, label: t("tabs.chat") },
71
+ { id: "feed", icon: Rss, label: t("tabs.feed") },
72
+ ];
70
73
 
71
- return (
72
- <div className="h-screen bg-[var(--color-bg-primary)] text-[var(--color-text-primary)] flex flex-col overflow-hidden">
73
- {!isMobile && (
74
- <div className="h-8 bg-[var(--color-bg-secondary)] flex items-center px-3 text-xs border-b border-[var(--color-border-primary)] flex-shrink-0">
75
- <span className={`px-2 py-0.5 rounded flex items-center gap-1 ${mode === "desktop" ? "bg-green-600" : "bg-blue-600"}`}>
76
- {mode === "desktop" ? <Monitor className="w-3 h-3" /> : <Wifi className="w-3 h-3" />}
77
- {mode === "desktop" ? t("app.mode.desktop") : t("app.mode.web")}
78
- </span>
79
- <span className="ml-3 text-[var(--color-text-tertiary)]">{t("app.title")}</span>
80
- <div className="ml-auto flex items-center gap-1">
81
- <LanguageSwitcher />
82
- <ThemeToggle />
83
- </div>
84
- </div>
85
- )}
74
+ return (
75
+ <div className="h-screen bg-[var(--color-bg-primary)] text-[var(--color-text-primary)] flex flex-col overflow-hidden">
76
+ {!isMobile && (
77
+ <div className="h-8 bg-[var(--color-bg-secondary)] flex items-center px-3 text-xs border-b border-[var(--color-border-primary)] flex-shrink-0">
78
+ <span
79
+ className={`px-2 py-0.5 rounded flex items-center gap-1 ${mode === "desktop" ? "bg-[var(--color-text-success)]" : "bg-blue-600"}`}
80
+ >
81
+ {mode === "desktop" ? <Monitor className="w-3 h-3" /> : <Wifi className="w-3 h-3" />}
82
+ {mode === "desktop" ? t("app.mode.desktop") : t("app.mode.web")}
83
+ </span>
84
+ <span className="ml-3 text-[var(--color-text-tertiary)]">{t("app.title")}</span>
85
+ <div className="ml-auto flex items-center gap-1">
86
+ <LanguageSwitcher />
87
+ <ThemeToggle />
88
+ </div>
89
+ </div>
90
+ )}
86
91
 
87
- <div className="flex-1 flex overflow-hidden relative">
88
- {!isMobile && <ActivityBar />}
92
+ <div className="flex-1 flex overflow-hidden relative">
93
+ {!isMobile && <ActivityBar />}
89
94
 
90
- {showSidebar && isPinned && !isMobile && (
91
- <div className="bg-[var(--color-bg-primary)] border-r border-[var(--color-border-primary)] flex flex-col flex-shrink-0 overflow-hidden relative"
92
- style={{ width: sidebarWidth }}>
93
- {sidebarContent}
94
- <div
95
- className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize bg-[var(--color-border-primary)] hover:bg-indigo-500/50 active:bg-indigo-500 transition-colors z-10"
96
- onMouseDown={handleResizeStart}
97
- />
98
- </div>
99
- )}
95
+ {showSidebar && isPinned && !isMobile && (
96
+ <div
97
+ className="bg-[var(--color-bg-primary)] border-r border-[var(--color-border-primary)] flex flex-col flex-shrink-0 overflow-hidden relative"
98
+ style={{ width: sidebarWidth }}
99
+ >
100
+ {sidebarContent}
101
+ <div
102
+ className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize bg-[var(--color-border-primary)] hover:bg-[var(--color-accent)]/50 active:bg-[var(--color-accent)] transition-colors z-10"
103
+ onMouseDown={handleResizeStart}
104
+ />
105
+ </div>
106
+ )}
100
107
 
101
- <div className="flex-1 flex flex-col overflow-hidden relative">
102
- <div className="flex items-center bg-[var(--color-bg-secondary)] border-b border-[var(--color-border-primary)] flex-shrink-0">
103
- {centerTabs.map(({ id, icon: Icon, label }) => (
104
- <button
105
- key={id}
106
- onClick={() => setCenterTab(id)}
107
- className={`flex items-center gap-1.5 px-4 py-1.5 text-xs border-b-2 transition-colors ${
108
- centerTab === id
109
- ? "border-[var(--color-accent)] text-[var(--color-text-primary)]"
110
- : "border-transparent text-[var(--color-text-placeholder)] hover:text-[var(--color-text-secondary)]"
111
- }`}
112
- >
113
- <Icon className="w-3.5 h-3.5" />
114
- {label}
115
- </button>
116
- ))}
117
- </div>
108
+ <div className="flex-1 flex flex-col overflow-hidden relative">
109
+ <div className="flex items-center bg-[var(--color-bg-secondary)] border-b border-[var(--color-border-primary)] flex-shrink-0">
110
+ {centerTabs.map(({ id, icon: Icon, label }) => (
111
+ <button
112
+ key={id}
113
+ onClick={() => setCenterTab(id)}
114
+ className={`flex items-center gap-1.5 px-4 py-1.5 text-xs border-b-2 transition-colors ${
115
+ centerTab === id
116
+ ? "border-[var(--color-accent)] text-[var(--color-text-primary)]"
117
+ : "border-transparent text-[var(--color-text-placeholder)] hover:text-[var(--color-text-secondary)]"
118
+ }`}
119
+ >
120
+ <Icon className="w-3.5 h-3.5" />
121
+ {label}
122
+ </button>
123
+ ))}
124
+ </div>
118
125
 
119
- {centerTab === "chat" ? <ChatPanel /> : <FeedPanel />}
120
- {filePreview && (
121
- <FilePreviewOverlay
122
- preview={filePreview}
123
- loading={loadingFile}
124
- onClose={closePreview}
125
- />
126
- )}
127
- <DiffViewerPanel />
128
- </div>
126
+ {centerTab === "chat" ? <ChatPanel /> : <FeedPanel />}
127
+ {filePreview && (
128
+ <FilePreviewOverlay
129
+ preview={filePreview}
130
+ loading={loadingFile}
131
+ onClose={closePreview}
132
+ scrollToLine={scrollToLine ?? undefined}
133
+ onScrolledToLine={clearScrollToLine}
134
+ />
135
+ )}
136
+ <DiffViewerPanel />
137
+ </div>
129
138
 
130
- {showDebug && <DebugPanel />}
131
- </div>
139
+ {showDebug && <DebugPanel />}
140
+ </div>
132
141
 
133
- {sidebarIsDrawer && showSidebar && (
134
- <>
135
- <div
136
- className="fixed inset-0 bg-black/50 z-40"
137
- style={isMobile ? { bottom: 56 } : undefined}
138
- onClick={() => setDrawerOpen(false)}
139
- />
140
- <div
141
- className="fixed left-0 top-0 w-60 z-50 bg-[var(--color-bg-primary)] border-r border-[var(--color-border-primary)] flex flex-col overflow-hidden"
142
- style={isMobile ? { top: 0, bottom: 56 } : { top: 0, bottom: 0 }}
143
- >
144
- {sidebarContent}
145
- </div>
146
- </>
147
- )}
142
+ {sidebarIsDrawer && showSidebar && (
143
+ <>
144
+ <div
145
+ className="fixed inset-0 bg-black/50 z-40"
146
+ style={isMobile ? { bottom: 56 } : undefined}
147
+ onClick={() => setDrawerOpen(false)}
148
+ />
149
+ <div
150
+ className="fixed left-0 top-0 w-60 z-50 bg-[var(--color-bg-primary)] border-r border-[var(--color-border-primary)] flex flex-col overflow-hidden"
151
+ style={isMobile ? { top: 0, bottom: 56 } : { top: 0, bottom: 0 }}
152
+ >
153
+ {sidebarContent}
154
+ </div>
155
+ </>
156
+ )}
148
157
 
149
- {isMobile && <MobileTabBar />}
150
- </div>
151
- );
158
+ {isMobile && <MobileTabBar />}
159
+ </div>
160
+ );
152
161
  }
@@ -249,13 +249,13 @@ export function SearchPanel() {
249
249
  setResults((prev) => prev.map((g, i) => (i === index ? { ...g, expanded: !g.expanded } : g)));
250
250
  }, []);
251
251
 
252
- const handleOpenFile = useCallback((filePath: string, _line: number) => {
252
+ const handleOpenFile = useCallback((filePath: string, line: number) => {
253
253
  const node: TreeNode = {
254
254
  name: filePath.split("/").pop() || filePath,
255
255
  path: filePath,
256
256
  type: "file",
257
257
  };
258
- useExplorerStore.getState().openFile(node);
258
+ useExplorerStore.getState().openFileAtLine(node, line);
259
259
  }, []);
260
260
 
261
261
  const modKey =
@@ -283,7 +283,7 @@ export function SearchPanel() {
283
283
  value={query}
284
284
  onChange={(e) => setQuery(e.target.value)}
285
285
  onKeyDown={handleKeyDown}
286
- placeholder="Search in files..."
286
+ placeholder={t("sidebar.search") + "..."}
287
287
  className="w-full pl-7 pr-7 py-1.5 text-xs bg-[var(--color-bg-secondary)] rounded text-[var(--color-text-primary)] border border-[var(--color-border-secondary)] focus:border-[var(--color-accent)] focus:outline-none"
288
288
  />
289
289
  {query && (
@@ -340,10 +340,10 @@ export function SearchPanel() {
340
340
  {isSearching ? (
341
341
  <button
342
342
  onClick={cancelSearch}
343
- className="px-2 py-1 text-xs text-red-400 hover:text-red-300 transition-colors flex items-center gap-1"
343
+ className="px-2 py-1 text-xs text-[var(--color-text-error)] hover:text-[var(--color-text-error)] transition-colors flex items-center gap-1"
344
344
  >
345
345
  <Loader2 className="w-3 h-3 animate-spin" />
346
- Cancel
346
+ {t("common.cancel")}
347
347
  </button>
348
348
  ) : (
349
349
  query.trim() && (
@@ -351,7 +351,7 @@ export function SearchPanel() {
351
351
  onClick={performSearch}
352
352
  className="px-2 py-1 text-xs bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] rounded transition-colors"
353
353
  >
354
- Search
354
+ {t("sidebar.search")}
355
355
  </button>
356
356
  )
357
357
  )}
@@ -363,15 +363,11 @@ export function SearchPanel() {
363
363
  <div className="px-3 py-1.5 text-[11px] text-[var(--color-text-placeholder)] border-b border-[var(--color-bg-secondary)] flex-shrink-0">
364
364
  {totalMatches > 0 ? (
365
365
  <>
366
- <span className="text-[var(--color-text-accent)] font-medium">{totalMatches}</span>{" "}
367
- result{totalMatches !== 1 && "s"} in{" "}
368
- <span className="text-[var(--color-text-accent)] font-medium">{results.length}</span>{" "}
369
- file
370
- {results.length !== 1 && "s"}
371
- <span className="ml-2 text-gray-600">({filesSearched} files searched)</span>
366
+ {t("search.resultsIn", { count: totalMatches, fileCount: results.length })}
367
+ <span className="ml-2">{t("search.filesSearched", { count: filesSearched })}</span>
372
368
  </>
373
369
  ) : (
374
- "No results found"
370
+ t("search.noResults")
375
371
  )}
376
372
  </div>
377
373
  )}
@@ -380,7 +376,7 @@ export function SearchPanel() {
380
376
  {isSearching && (
381
377
  <div className="flex items-center justify-center py-8 text-[var(--color-text-placeholder)] text-sm flex-shrink-0">
382
378
  <Loader2 className="w-4 h-4 animate-spin mr-2" />
383
- Searching...
379
+ {t("common.loading")}
384
380
  </div>
385
381
  )}
386
382
 
@@ -389,16 +385,16 @@ export function SearchPanel() {
389
385
  {!hasSearched && !isSearching ? (
390
386
  <div className="flex flex-col items-center justify-center h-full text-[var(--color-text-tertiary)] text-xs px-4">
391
387
  <Search className="w-8 h-8 mb-2 text-[var(--color-text-placeholder)]" />
392
- <p>Type a search term and press Enter</p>
388
+ <p>{t("search.typeToSearch")}</p>
393
389
  <p className="mt-1 text-[var(--color-text-placeholder)]">
394
- {modKey}+Shift+F to focus search
390
+ {t("search.focusShortcut", { key: modKey })}
395
391
  </p>
396
392
  </div>
397
393
  ) : !isSearching && totalMatches === 0 ? (
398
394
  <div className="flex flex-col items-center justify-center h-full text-[var(--color-text-tertiary)] text-xs px-4">
399
395
  <FileText className="w-8 h-8 mb-2 text-[var(--color-text-placeholder)]" />
400
- <p>No results for "{query}"</p>
401
- <p className="mt-1 text-[var(--color-text-placeholder)]">Try different search terms</p>
396
+ <p>{t("search.noResultsFor", { query })}</p>
397
+ <p className="mt-1 text-[var(--color-text-placeholder)]">{t("search.tryDifferent")}</p>
402
398
  </div>
403
399
  ) : (
404
400
  <div className="py-1">
@@ -418,7 +414,7 @@ export function SearchPanel() {
418
414
  <span className="text-[var(--color-text-secondary)] truncate flex-1">
419
415
  {group.relativePath}
420
416
  </span>
421
- <span className="text-[10px] text-gray-600 flex-shrink-0 ml-1">
417
+ <span className="text-[10px] text-[var(--color-text-tertiary)] flex-shrink-0 ml-1">
422
418
  {group.matches.length}
423
419
  </span>
424
420
  </button>