@dyyz1993/create-agent 2.1.1 → 2.1.3

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 (348) 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/package.json +3 -2
  17. package/templates/agent/src/gateway/__tests__/ws-handler-token.test.ts +53 -39
  18. package/templates/agent/src/mainview/App.tsx +14 -12
  19. package/templates/agent/src/mainview/__tests__/hooks/use-rpc-init.test.ts +194 -190
  20. package/templates/agent/src/mainview/components/bash/BashPanel.tsx +210 -189
  21. package/templates/agent/src/mainview/components/chat/ChatPanel.tsx +45 -20
  22. package/templates/agent/src/mainview/components/common/ThemeToggle.tsx +41 -21
  23. package/templates/agent/src/mainview/components/debug/DebugPanel.tsx +181 -114
  24. package/templates/agent/src/mainview/components/debug/__tests__/DebugPanel.test.tsx +80 -80
  25. package/templates/agent/src/mainview/components/diff/__tests__/DiffViewerPanel.test.tsx +61 -58
  26. package/templates/agent/src/mainview/components/feed/FeedPanel.tsx +43 -41
  27. package/templates/agent/src/mainview/components/file-preview/FilePreviewOverlay.tsx +69 -50
  28. package/templates/agent/src/mainview/components/file-preview/VirtualizedCodeView.tsx +31 -18
  29. package/templates/agent/src/mainview/components/git/GitPanel.tsx +731 -490
  30. package/templates/agent/src/mainview/components/git/__tests__/GitPanel.test.tsx +157 -139
  31. package/templates/agent/src/mainview/components/layout/AppLayout.tsx +210 -161
  32. package/templates/agent/src/mainview/components/layout/__tests__/AppLayout.test.tsx +130 -122
  33. package/templates/agent/src/mainview/components/rules/RulesPanel.tsx +119 -109
  34. package/templates/agent/src/mainview/components/search/SearchPanel.tsx +123 -117
  35. package/templates/agent/src/mainview/components/search/__tests__/SearchPanel.test.tsx +64 -44
  36. package/templates/agent/src/mainview/components/sidebar/__tests__/PinButton.test.tsx +38 -38
  37. package/templates/agent/src/mainview/components/todo/TodoPanel.tsx +40 -38
  38. package/templates/agent/src/mainview/components/todo/__tests__/TodoPanel.test.tsx +72 -72
  39. package/templates/agent/src/mainview/lib/api-client.ts +36 -27
  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 +14 -6
  48. package/templates/agent/tsconfig.ipc.json +1 -1
  49. package/templates/agent/tsconfig.json +4 -1
  50. package/templates/browser-agent/.env.example +19 -0
  51. package/templates/browser-agent/.husky/commit-msg +4 -0
  52. package/templates/browser-agent/.husky/pre-commit +11 -0
  53. package/templates/browser-agent/.husky/pre-push +6 -0
  54. package/templates/browser-agent/.prettierignore +6 -0
  55. package/templates/browser-agent/.prettierrc +9 -0
  56. package/templates/browser-agent/AGENTS.md +396 -0
  57. package/templates/browser-agent/LICENSE +21 -0
  58. package/templates/browser-agent/README.md +103 -0
  59. package/templates/browser-agent/commitlint.config.js +8 -0
  60. package/templates/browser-agent/electrobun.config.ts +27 -0
  61. package/templates/browser-agent/electron/main.js +46 -0
  62. package/templates/browser-agent/electron/preload.js +5 -0
  63. package/templates/browser-agent/electron-builder.json +40 -0
  64. package/templates/browser-agent/eslint.config.mjs +79 -0
  65. package/templates/browser-agent/llms.txt +24 -0
  66. package/templates/browser-agent/package.json +141 -0
  67. package/templates/browser-agent/postcss.config.js +6 -0
  68. package/templates/browser-agent/scripts/dev.ts +138 -0
  69. package/templates/browser-agent/src/__tests__/hybrid-mode.test.ts +126 -0
  70. package/templates/browser-agent/src/__tests__/server-config-security.test.ts +55 -0
  71. package/templates/browser-agent/src/__tests__/server-config.test.ts +59 -0
  72. package/templates/browser-agent/src/bun/index.ts +130 -0
  73. package/templates/browser-agent/src/bun/three.d.ts +1 -0
  74. package/templates/browser-agent/src/gateway/http-routes.ts +1 -0
  75. package/templates/browser-agent/src/gateway/ipc-transport.ts +68 -0
  76. package/templates/browser-agent/src/gateway/sse-transport.ts +221 -0
  77. package/templates/browser-agent/src/mainview/App.tsx +45 -0
  78. package/templates/browser-agent/src/mainview/__tests__/hooks/use-rpc-init.test.ts +202 -0
  79. package/templates/browser-agent/src/mainview/__tests__/hooks/use-sidebar-resize.test.ts +127 -0
  80. package/templates/browser-agent/src/mainview/__tests__/i18n/i18n.test.ts +49 -0
  81. package/templates/browser-agent/src/mainview/__tests__/setup.ts +40 -0
  82. package/templates/browser-agent/src/mainview/__tests__/stores/use-chat-store.test.ts +73 -0
  83. package/templates/browser-agent/src/mainview/__tests__/stores/use-sidebar-store.test.ts +61 -0
  84. package/templates/browser-agent/src/mainview/__tests__/theme-variables.test.ts +36 -0
  85. package/templates/browser-agent/src/mainview/components/assets/AssetsPanel.tsx +139 -0
  86. package/templates/browser-agent/src/mainview/components/chat/ChatPanel.tsx +219 -0
  87. package/templates/browser-agent/src/mainview/components/chat/CommandBar.tsx +184 -0
  88. package/templates/browser-agent/src/mainview/components/chat/MessageBubble.tsx +249 -0
  89. package/templates/browser-agent/src/mainview/components/chat/ToolPicker.tsx +115 -0
  90. package/templates/browser-agent/src/mainview/components/common/ErrorBoundary.tsx +1 -0
  91. package/templates/browser-agent/src/mainview/components/common/LanguageSwitcher.tsx +15 -0
  92. package/templates/browser-agent/src/mainview/components/common/ThemeToggle.tsx +45 -0
  93. package/templates/browser-agent/src/mainview/components/common/__tests__/ErrorBoundary.test.tsx +74 -0
  94. package/templates/browser-agent/src/mainview/components/common/__tests__/LanguageSwitcher.test.tsx +44 -0
  95. package/templates/browser-agent/src/mainview/components/common/__tests__/ThemeToggle.test.tsx +41 -0
  96. package/templates/browser-agent/src/mainview/components/dev/NetworkPanel.tsx +155 -0
  97. package/templates/browser-agent/src/mainview/components/layout/AppLayout.tsx +311 -0
  98. package/templates/browser-agent/src/mainview/components/onboarding/SetupWizard.tsx +310 -0
  99. package/templates/browser-agent/src/mainview/components/process/ProcessPanel.tsx +329 -0
  100. package/templates/browser-agent/src/mainview/components/sidebar/SessionSidebar.tsx +122 -0
  101. package/templates/browser-agent/src/mainview/components/sidebar/SkillSidebar.tsx +115 -0
  102. package/templates/browser-agent/src/mainview/components/topbar/TopBar.tsx +350 -0
  103. package/templates/browser-agent/src/mainview/global.d.ts +13 -0
  104. package/templates/browser-agent/src/mainview/hooks/__tests__/use-breakpoint.test.ts +151 -0
  105. package/templates/browser-agent/src/mainview/hooks/use-agent-chat.ts +157 -0
  106. package/templates/browser-agent/src/mainview/hooks/use-breakpoint.ts +68 -0
  107. package/templates/browser-agent/src/mainview/hooks/use-rpc-init.ts +71 -0
  108. package/templates/browser-agent/src/mainview/hooks/use-sidebar-resize.ts +40 -0
  109. package/templates/browser-agent/src/mainview/index.css +71 -0
  110. package/templates/browser-agent/src/mainview/index.html +12 -0
  111. package/templates/browser-agent/src/mainview/lib/api-client.ts +397 -0
  112. package/templates/browser-agent/src/mainview/lib/i18n/index.ts +30 -0
  113. package/templates/browser-agent/src/mainview/lib/i18n/locales/en.json +130 -0
  114. package/templates/browser-agent/src/mainview/lib/i18n/locales/zh.json +128 -0
  115. package/templates/browser-agent/src/mainview/lib/network-bus.ts +92 -0
  116. package/templates/browser-agent/src/mainview/lib/rpc-cache.ts +94 -0
  117. package/templates/browser-agent/src/mainview/main.tsx +18 -0
  118. package/templates/browser-agent/src/mainview/stores/__tests__/use-connection-store.test.ts +26 -0
  119. package/templates/browser-agent/src/mainview/stores/__tests__/use-locale-store.test.ts +32 -0
  120. package/templates/browser-agent/src/mainview/stores/__tests__/use-log-store.test.ts +28 -0
  121. package/templates/browser-agent/src/mainview/stores/__tests__/use-theme-store.test.ts +59 -0
  122. package/templates/browser-agent/src/mainview/stores/message-batcher.ts +25 -0
  123. package/templates/browser-agent/src/mainview/stores/use-asset-store.ts +65 -0
  124. package/templates/browser-agent/src/mainview/stores/use-chat-store.ts +200 -0
  125. package/templates/browser-agent/src/mainview/stores/use-connection-store.ts +173 -0
  126. package/templates/browser-agent/src/mainview/stores/use-locale-store.ts +27 -0
  127. package/templates/browser-agent/src/mainview/stores/use-log-store.ts +16 -0
  128. package/templates/browser-agent/src/mainview/stores/use-network-panel-store.ts +18 -0
  129. package/templates/browser-agent/src/mainview/stores/use-record-store.ts +147 -0
  130. package/templates/browser-agent/src/mainview/stores/use-session-store.ts +151 -0
  131. package/templates/browser-agent/src/mainview/stores/use-sidebar-store.ts +161 -0
  132. package/templates/browser-agent/src/mainview/stores/use-theme-store.ts +46 -0
  133. package/templates/browser-agent/src/mainview/stores/use-view-store.ts +20 -0
  134. package/templates/browser-agent/src/mainview/types/index.ts +6 -0
  135. package/templates/browser-agent/src/server-config.ts +45 -0
  136. package/templates/browser-agent/src/server.ts +78 -0
  137. package/templates/browser-agent/src/shared/handlers/__tests__/chat-concurrency.test.ts +127 -0
  138. package/templates/browser-agent/src/shared/handlers/__tests__/chat-handler.test.ts +77 -0
  139. package/templates/browser-agent/src/shared/handlers/__tests__/file-handler.test.ts +100 -0
  140. package/templates/browser-agent/src/shared/handlers/__tests__/system-handler.test.ts +55 -0
  141. package/templates/browser-agent/src/shared/handlers/__tests__/timer-handler.test.ts +77 -0
  142. package/templates/browser-agent/src/shared/handlers/browser.ts +596 -0
  143. package/templates/browser-agent/src/shared/handlers/chat.ts +213 -0
  144. package/templates/browser-agent/src/shared/handlers/file.ts +99 -0
  145. package/templates/browser-agent/src/shared/handlers/index.ts +7 -0
  146. package/templates/browser-agent/src/shared/handlers/session.ts +167 -0
  147. package/templates/browser-agent/src/shared/handlers/system.ts +27 -0
  148. package/templates/browser-agent/src/shared/handlers/timer.ts +34 -0
  149. package/templates/browser-agent/src/shared/http-routes.ts +437 -0
  150. package/templates/browser-agent/src/shared/lib/__tests__/logger.test.ts +92 -0
  151. package/templates/browser-agent/src/shared/lib/__tests__/path-security.test.ts +77 -0
  152. package/templates/browser-agent/src/shared/lib/__tests__/web-server.test.ts +203 -0
  153. package/templates/browser-agent/src/shared/lib/agent.ts +384 -0
  154. package/templates/browser-agent/src/shared/lib/cdp.ts +448 -0
  155. package/templates/browser-agent/src/shared/lib/generate.ts +111 -0
  156. package/templates/browser-agent/src/shared/lib/logger.ts +152 -0
  157. package/templates/browser-agent/src/shared/lib/mock-stream.ts +147 -0
  158. package/templates/browser-agent/src/shared/lib/path-security.ts +38 -0
  159. package/templates/browser-agent/src/shared/lib/port-registry.ts +103 -0
  160. package/templates/browser-agent/src/shared/lib/web-server.ts +127 -0
  161. package/templates/browser-agent/src/shared/lib/xhs-extract.ts +71 -0
  162. package/templates/browser-agent/src/shared/modules/browser.ts +86 -0
  163. package/templates/browser-agent/src/shared/modules/chat.ts +20 -0
  164. package/templates/browser-agent/src/shared/modules/file.ts +40 -0
  165. package/templates/browser-agent/src/shared/modules/session.ts +55 -0
  166. package/templates/browser-agent/src/shared/modules/system.ts +8 -0
  167. package/templates/browser-agent/src/shared/modules/timer.ts +11 -0
  168. package/templates/browser-agent/src/shared/register-all-handlers.ts +36 -0
  169. package/templates/browser-agent/src/shared/rpc-schema.ts +34 -0
  170. package/templates/browser-agent/tailwind.config.js +15 -0
  171. package/templates/browser-agent/tsconfig.ipc.json +14 -0
  172. package/templates/browser-agent/tsconfig.json +36 -0
  173. package/templates/browser-agent/vite.config.ts +3 -0
  174. package/templates/browser-agent/vitest.config.ts +3 -0
  175. package/templates/chat/.husky/commit-msg +4 -0
  176. package/templates/chat/.husky/pre-commit +11 -0
  177. package/templates/chat/.husky/pre-push +6 -0
  178. package/templates/chat/commitlint.config.js +8 -0
  179. package/templates/chat/package.json +19 -3
  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/api-client.ts +10 -1
  185. package/templates/chat/src/mainview/lib/i18n/locales/en.json +175 -155
  186. package/templates/chat/src/mainview/lib/i18n/locales/zh.json +173 -155
  187. package/templates/chat/src/shared/handlers/chat.ts +17 -19
  188. package/templates/chat/src/shared/handlers/debug.ts +13 -5
  189. package/templates/chat/tsconfig.json +5 -2
  190. package/templates/cowork/.env.example +8 -0
  191. package/templates/cowork/.prettierignore +6 -0
  192. package/templates/cowork/.prettierrc +9 -0
  193. package/templates/cowork/AGENTS.md +236 -0
  194. package/templates/cowork/LICENSE +21 -0
  195. package/templates/cowork/README.md +103 -0
  196. package/templates/cowork/commitlint.config.js +8 -0
  197. package/templates/cowork/docs/CODE-VIEW-PLAN.md +637 -0
  198. package/templates/cowork/docs/CODE-VIEW-V2.md +196 -0
  199. package/templates/cowork/docs/CODE-VIEW-V4.md +150 -0
  200. package/templates/cowork/electrobun.config.ts +27 -0
  201. package/templates/cowork/eslint.config.mjs +79 -0
  202. package/templates/cowork/llms.txt +24 -0
  203. package/templates/cowork/package.json +88 -0
  204. package/templates/cowork/postcss.config.js +6 -0
  205. package/templates/cowork/scripts/dev.ts +138 -0
  206. package/templates/cowork/src/__tests__/hybrid-mode.test.ts +126 -0
  207. package/templates/cowork/src/__tests__/server-config-security.test.ts +55 -0
  208. package/templates/cowork/src/__tests__/server-config.test.ts +59 -0
  209. package/templates/cowork/src/bun/index.ts +130 -0
  210. package/templates/cowork/src/bun/three.d.ts +1 -0
  211. package/templates/cowork/src/gateway/http-routes.ts +1 -0
  212. package/templates/cowork/src/gateway/ipc-transport.ts +68 -0
  213. package/templates/cowork/src/gateway/sse-transport.ts +231 -0
  214. package/templates/cowork/src/mainview/App.tsx +45 -0
  215. package/templates/cowork/src/mainview/__tests__/hooks/use-rpc-init.test.ts +202 -0
  216. package/templates/cowork/src/mainview/__tests__/hooks/use-sidebar-resize.test.ts +127 -0
  217. package/templates/cowork/src/mainview/__tests__/i18n/i18n.test.ts +49 -0
  218. package/templates/cowork/src/mainview/__tests__/setup.ts +40 -0
  219. package/templates/cowork/src/mainview/__tests__/stores/use-chat-store.test.ts +73 -0
  220. package/templates/cowork/src/mainview/__tests__/stores/use-sidebar-store.test.ts +61 -0
  221. package/templates/cowork/src/mainview/__tests__/theme-variables.test.ts +36 -0
  222. package/templates/cowork/src/mainview/components/chat/TaskChat.tsx +311 -0
  223. package/templates/cowork/src/mainview/components/chat/__tests__/localhost-links.test.ts +76 -0
  224. package/templates/cowork/src/mainview/components/common/ErrorBoundary.tsx +1 -0
  225. package/templates/cowork/src/mainview/components/common/LanguageSwitcher.tsx +15 -0
  226. package/templates/cowork/src/mainview/components/common/ThemeToggle.tsx +45 -0
  227. package/templates/cowork/src/mainview/components/common/__tests__/ErrorBoundary.test.tsx +74 -0
  228. package/templates/cowork/src/mainview/components/common/__tests__/LanguageSwitcher.test.tsx +44 -0
  229. package/templates/cowork/src/mainview/components/common/__tests__/ThemeToggle.test.tsx +41 -0
  230. package/templates/cowork/src/mainview/components/dev/NetworkPanel.tsx +155 -0
  231. package/templates/cowork/src/mainview/components/layout/AppLayout.tsx +216 -0
  232. package/templates/cowork/src/mainview/components/right/ArtifactsPanel.tsx +54 -0
  233. package/templates/cowork/src/mainview/components/right/ContextPanel.tsx +133 -0
  234. package/templates/cowork/src/mainview/components/right/ElementPicker.tsx +206 -0
  235. package/templates/cowork/src/mainview/components/right/PreviewBlock.tsx +155 -0
  236. package/templates/cowork/src/mainview/components/right/ProgressPanel.tsx +85 -0
  237. package/templates/cowork/src/mainview/components/sidebar/TaskSidebar.tsx +211 -0
  238. package/templates/cowork/src/mainview/components/topbar/TopBar.tsx +86 -0
  239. package/templates/cowork/src/mainview/global.d.ts +13 -0
  240. package/templates/cowork/src/mainview/hooks/__tests__/use-breakpoint.test.ts +123 -0
  241. package/templates/cowork/src/mainview/hooks/use-breakpoint.ts +53 -0
  242. package/templates/cowork/src/mainview/hooks/use-rpc-init.ts +26 -0
  243. package/templates/cowork/src/mainview/hooks/use-sidebar-resize.ts +40 -0
  244. package/templates/cowork/src/mainview/index.css +89 -0
  245. package/templates/cowork/src/mainview/index.html +12 -0
  246. package/templates/cowork/src/mainview/lib/api-client.ts +404 -0
  247. package/templates/cowork/src/mainview/lib/i18n/index.ts +30 -0
  248. package/templates/cowork/src/mainview/lib/i18n/locales/en.json +130 -0
  249. package/templates/cowork/src/mainview/lib/i18n/locales/zh.json +128 -0
  250. package/templates/cowork/src/mainview/lib/network-bus.ts +92 -0
  251. package/templates/cowork/src/mainview/lib/rpc-cache.ts +94 -0
  252. package/templates/cowork/src/mainview/main.tsx +18 -0
  253. package/templates/cowork/src/mainview/stores/__tests__/use-connection-store.test.ts +26 -0
  254. package/templates/cowork/src/mainview/stores/__tests__/use-locale-store.test.ts +32 -0
  255. package/templates/cowork/src/mainview/stores/__tests__/use-log-store.test.ts +28 -0
  256. package/templates/cowork/src/mainview/stores/__tests__/use-preview-store.test.ts +193 -0
  257. package/templates/cowork/src/mainview/stores/__tests__/use-sidebar-store.test.ts +81 -0
  258. package/templates/cowork/src/mainview/stores/__tests__/use-theme-store.test.ts +59 -0
  259. package/templates/cowork/src/mainview/stores/message-batcher.ts +25 -0
  260. package/templates/cowork/src/mainview/stores/use-chat-store.ts +198 -0
  261. package/templates/cowork/src/mainview/stores/use-connection-store.ts +168 -0
  262. package/templates/cowork/src/mainview/stores/use-context-store.ts +68 -0
  263. package/templates/cowork/src/mainview/stores/use-locale-store.ts +27 -0
  264. package/templates/cowork/src/mainview/stores/use-log-store.ts +16 -0
  265. package/templates/cowork/src/mainview/stores/use-network-panel-store.ts +18 -0
  266. package/templates/cowork/src/mainview/stores/use-output-store.ts +47 -0
  267. package/templates/cowork/src/mainview/stores/use-preview-store.ts +97 -0
  268. package/templates/cowork/src/mainview/stores/use-sidebar-store.ts +272 -0
  269. package/templates/cowork/src/mainview/stores/use-task-store.ts +86 -0
  270. package/templates/cowork/src/mainview/stores/use-theme-store.ts +46 -0
  271. package/templates/cowork/src/mainview/stores/use-view-store.ts +29 -0
  272. package/templates/cowork/src/mainview/types/index.ts +6 -0
  273. package/templates/cowork/src/server-config.ts +44 -0
  274. package/templates/cowork/src/server.ts +78 -0
  275. package/templates/cowork/src/shared/handlers/__tests__/chat-concurrency.test.ts +127 -0
  276. package/templates/cowork/src/shared/handlers/__tests__/chat-handler.test.ts +77 -0
  277. package/templates/cowork/src/shared/handlers/__tests__/file-handler.test.ts +100 -0
  278. package/templates/cowork/src/shared/handlers/__tests__/preview-handler.test.ts +172 -0
  279. package/templates/cowork/src/shared/handlers/__tests__/system-handler.test.ts +55 -0
  280. package/templates/cowork/src/shared/handlers/__tests__/timer-handler.test.ts +77 -0
  281. package/templates/cowork/src/shared/handlers/chat.ts +213 -0
  282. package/templates/cowork/src/shared/handlers/context.ts +72 -0
  283. package/templates/cowork/src/shared/handlers/file.ts +99 -0
  284. package/templates/cowork/src/shared/handlers/index.ts +9 -0
  285. package/templates/cowork/src/shared/handlers/output.ts +59 -0
  286. package/templates/cowork/src/shared/handlers/preview.ts +81 -0
  287. package/templates/cowork/src/shared/handlers/system.ts +27 -0
  288. package/templates/cowork/src/shared/handlers/task.ts +101 -0
  289. package/templates/cowork/src/shared/handlers/timer.ts +34 -0
  290. package/templates/cowork/src/shared/http-routes.ts +444 -0
  291. package/templates/cowork/src/shared/lib/__tests__/logger.test.ts +92 -0
  292. package/templates/cowork/src/shared/lib/__tests__/path-security.test.ts +77 -0
  293. package/templates/cowork/src/shared/lib/__tests__/web-server.test.ts +203 -0
  294. package/templates/cowork/src/shared/lib/logger.ts +152 -0
  295. package/templates/cowork/src/shared/lib/path-security.ts +38 -0
  296. package/templates/cowork/src/shared/lib/port-registry.ts +103 -0
  297. package/templates/cowork/src/shared/lib/web-server.ts +127 -0
  298. package/templates/cowork/src/shared/modules/chat.ts +20 -0
  299. package/templates/cowork/src/shared/modules/context.ts +32 -0
  300. package/templates/cowork/src/shared/modules/file.ts +40 -0
  301. package/templates/cowork/src/shared/modules/output.ts +20 -0
  302. package/templates/cowork/src/shared/modules/preview.ts +44 -0
  303. package/templates/cowork/src/shared/modules/system.ts +8 -0
  304. package/templates/cowork/src/shared/modules/task.ts +31 -0
  305. package/templates/cowork/src/shared/modules/timer.ts +11 -0
  306. package/templates/cowork/src/shared/register-all-handlers.ts +36 -0
  307. package/templates/cowork/src/shared/rpc-schema.ts +38 -0
  308. package/templates/cowork/tailwind.config.js +15 -0
  309. package/templates/cowork/test-upload.txt +0 -0
  310. package/templates/cowork/tsconfig.ipc.json +14 -0
  311. package/templates/cowork/tsconfig.json +36 -0
  312. package/templates/cowork/vite.config.ts +3 -0
  313. package/templates/cowork/vitest.config.ts +3 -0
  314. package/templates/general/.husky/commit-msg +4 -0
  315. package/templates/general/.husky/pre-commit +11 -0
  316. package/templates/general/.husky/pre-push +6 -0
  317. package/templates/general/commitlint.config.js +8 -0
  318. package/templates/general/package.json +19 -3
  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/api-client.ts +10 -1
  334. package/templates/general/src/mainview/lib/i18n/locales/en.json +175 -155
  335. package/templates/general/src/mainview/lib/i18n/locales/zh.json +173 -155
  336. package/templates/general/src/mainview/stores/__tests__/use-explorer-store.test.ts +259 -0
  337. package/templates/general/src/mainview/stores/__tests__/use-feed-store.test.ts +160 -0
  338. package/templates/general/src/mainview/stores/__tests__/use-git-store.test.ts +313 -0
  339. package/templates/general/src/mainview/stores/__tests__/use-notification-store.test.ts +115 -0
  340. package/templates/general/src/mainview/stores/__tests__/use-sidebar-store.test.ts +120 -0
  341. package/templates/general/src/mainview/stores/use-explorer-store.ts +277 -260
  342. package/templates/general/src/mainview/types/index.ts +21 -20
  343. package/templates/general/src/shared/handlers/chat.ts +1 -1
  344. package/templates/general/src/shared/handlers/debug.ts +13 -5
  345. package/templates/general/tsconfig.json +5 -2
  346. package/templates/shared/components/ErrorBoundary.tsx +0 -1
  347. package/templates/shared/vite-base.config.ts +8 -7
  348. /package/templates/{shared → browser-agent}/test-upload.txt +0 -0
package/src/cli.ts CHANGED
@@ -1,19 +1,21 @@
1
1
  #!/usr/bin/env bun
2
2
 
3
- import { runCreate } from './commands/create.js';
4
- import { runList } from './commands/list.js';
5
- import { runStatus } from './commands/status.js';
6
- import { runWorkspace } from './commands/workspace.js';
3
+ import { runCreate } from "./commands/create.js";
4
+ import { runList } from "./commands/list.js";
5
+ import { runStatus } from "./commands/status.js";
6
+ import { runWorkspace } from "./commands/workspace.js";
7
+ import { runUpdate } from "./commands/update.js";
7
8
 
8
9
  const COMMANDS = new Map<string, (args: string[]) => Promise<void>>([
9
- ['create', runCreate],
10
- ['list', runList],
11
- ['status', runStatus],
12
- ['workspace', runWorkspace],
10
+ ["create", runCreate],
11
+ ["list", runList],
12
+ ["status", runStatus],
13
+ ["workspace", runWorkspace],
14
+ ["update", runUpdate],
13
15
  ]);
14
16
 
15
17
  function printHelp(): void {
16
- console.log(`
18
+ console.log(`
17
19
  Create Agent CLI — project scaffolding tool
18
20
 
19
21
  Usage:
@@ -24,7 +26,7 @@ Commands:
24
26
  list Show available template types
25
27
  status Show active pi-agent instances
26
28
  workspace add <name> Create isolated workspace for parallel development
27
- update Update project to latest template (coming soon)
29
+ update Update project to latest template version
28
30
 
29
31
  Options:
30
32
  -h, --help Show this help message
@@ -34,32 +36,28 @@ Run "create-agent create --help" for create-specific options.
34
36
  }
35
37
 
36
38
  async function main(): Promise<void> {
37
- const args = process.argv.slice(2);
39
+ const args = process.argv.slice(2);
38
40
 
39
- const command = args[0];
40
- const rest = args.slice(1);
41
+ const command = args[0];
42
+ const rest = args.slice(1);
41
43
 
42
- if (!command || command === '-h' || command === '--help') {
43
- printHelp();
44
- process.exit(0);
45
- }
44
+ if (!command || command === "-h" || command === "--help") {
45
+ printHelp();
46
+ process.exit(0);
47
+ }
46
48
 
47
- if (command === 'update') {
48
- console.log('Update feature coming soon');
49
- return;
50
- }
49
+ const handler = COMMANDS.get(command);
50
+ if (!handler) {
51
+ console.error(`Unknown command: "${command}"\n`);
52
+ printHelp();
53
+ process.exit(1);
54
+ }
51
55
 
52
- const handler = COMMANDS.get(command);
53
- if (!handler) {
54
- console.error(`Unknown command: "${command}"\n`);
55
- printHelp();
56
- process.exit(1);
57
- }
58
-
59
- await handler(rest);
56
+ await handler(rest);
60
57
  }
61
58
 
62
- main().catch((err) => {
63
- console.error(`Error: ${err.message}`);
64
- process.exit(1);
59
+ main().catch((err: unknown) => {
60
+ const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
61
+ console.error(`Error: ${message}`);
62
+ process.exit(1);
65
63
  });
@@ -1,27 +1,8 @@
1
1
  import { resolve } from "path";
2
2
  import { resolveTemplateDir, getRootDir } from "../lib/templates.js";
3
- import { copyTemplate } from "../lib/copy.js";
3
+ import { copyTemplate, expandTilde } from "../lib/copy.js";
4
4
 
5
- export async function runCreate(args: string[]): Promise<void> {
6
- let templateType = "general";
7
- let customDir: string | undefined;
8
-
9
- const positional: string[] = [];
10
- for (let i = 0; i < args.length; i++) {
11
- const arg = args[i]!;
12
- if (arg === "--type" && args[i + 1]) {
13
- templateType = args[++i]!;
14
- } else if (arg === "--dir" && args[i + 1]) {
15
- customDir = args[++i]!;
16
- } else if (!arg.startsWith("--")) {
17
- positional.push(arg);
18
- }
19
- }
20
-
21
- const projectName = positional[0];
22
- const targetArg = customDir || positional[1];
23
- if (!projectName) {
24
- console.log(`
5
+ const HELP = `
25
6
  Usage: create-agent create <name> [--type <type>] [--dir <path>]
26
7
 
27
8
  Options:
@@ -32,12 +13,90 @@ Examples:
32
13
  create-agent create my-app
33
14
  create-agent create my-app --type chat
34
15
  create-agent create my-app --dir ~/projects/my-app
35
- `);
16
+ `;
17
+
18
+ function fail(message: string): never {
19
+ console.error(message);
20
+ process.exit(1);
21
+ }
22
+
23
+ interface ParsedArgs {
24
+ positional: string[];
25
+ options: { type?: string; dir?: string };
26
+ error?: string;
27
+ }
28
+
29
+ /** Pure arg parser (no process.exit) so it can be unit tested. */
30
+ export function parseArgs(args: string[]): ParsedArgs {
31
+ const positional: string[] = [];
32
+ const options: { type?: string; dir?: string } = {};
33
+
34
+ for (let i = 0; i < args.length; i++) {
35
+ const arg = args[i]!;
36
+ if (arg === "--") {
37
+ positional.push(...args.slice(i + 1));
38
+ break;
39
+ }
40
+ if (arg === "-h" || arg === "--help") continue;
41
+ if (arg.startsWith("--")) {
42
+ const eq = arg.indexOf("=");
43
+ const key = eq === -1 ? arg.slice(2) : arg.slice(2, eq);
44
+ let value = eq === -1 ? undefined : arg.slice(eq + 1);
45
+
46
+ if (key !== "type" && key !== "dir") {
47
+ return { positional, options, error: `Unknown option: ${arg}\n${HELP}` };
48
+ }
49
+ if (value === undefined) {
50
+ const next = args[i + 1];
51
+ if (!next || next.startsWith("--")) {
52
+ return {
53
+ positional,
54
+ options,
55
+ error: `Option --${key} requires a value.\n${HELP}`,
56
+ };
57
+ }
58
+ value = next;
59
+ i++;
60
+ }
61
+ if (key === "type") options.type = value;
62
+ else options.dir = value;
63
+ } else {
64
+ positional.push(arg);
65
+ }
66
+ }
67
+
68
+ return { positional, options };
69
+ }
70
+
71
+ export async function runCreate(args: string[]): Promise<void> {
72
+ if (args.includes("-h") || args.includes("--help")) {
73
+ console.log(HELP);
74
+ process.exit(0);
75
+ }
76
+
77
+ const { positional, options, error } = parseArgs(args);
78
+ if (error) fail(error);
79
+ const templateType = options.type ?? "general";
80
+ const customDir = options.dir;
81
+
82
+ const projectNameArg = positional[0];
83
+ const targetArg = customDir || positional[1];
84
+ if (!projectNameArg) {
85
+ console.log(HELP);
36
86
  process.exit(1);
37
87
  }
38
88
 
39
- const sanitized = projectName.replace(/[^a-zA-Z0-9-_]/g, "-");
40
- const targetDir = targetArg ? resolve(targetArg) : resolve(process.cwd(), sanitized);
89
+ const sanitized = projectNameArg.replace(/[^a-zA-Z0-9-_]/g, "-");
90
+ // Reject names that sanitize into garbage (e.g. Chinese input -> "----")
91
+ // instead of silently creating unusable package names / bundle ids.
92
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(sanitized)) {
93
+ fail(
94
+ `Invalid project name: "${projectNameArg}"\n` +
95
+ "Use a name starting with a letter or digit, containing only letters, digits, '-', '_' (e.g. my-app)."
96
+ );
97
+ }
98
+
99
+ const targetDir = targetArg ? resolve(expandTilde(targetArg)) : resolve(process.cwd(), sanitized);
41
100
  const rootDir = getRootDir();
42
101
  const templateDir = resolveTemplateDir(rootDir, templateType);
43
102
 
@@ -0,0 +1,174 @@
1
+ import { resolve } from "path";
2
+ import { existsSync, readFileSync, readdirSync, mkdtempSync, rmSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { spawnSync } from "child_process";
5
+ import { getRootDir, resolveTemplateDir } from "../lib/templates.js";
6
+ import { copyAndReplace, postProcessTemplate, expandTilde } from "../lib/copy.js";
7
+
8
+ interface TemplateMeta {
9
+ templateType: string;
10
+ projectName: string;
11
+ }
12
+
13
+ /** Detect which template a project was created from (exported for tests). */
14
+ export function detectTemplateMeta(targetDir: string): TemplateMeta | null {
15
+ const pkgPath = resolve(targetDir, "package.json");
16
+ if (!existsSync(pkgPath)) return null;
17
+
18
+ try {
19
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
20
+ const projectName = pkg.name || null;
21
+ if (!projectName) return null;
22
+
23
+ const sharedDir = resolve(targetDir, "src", "shared");
24
+ const modulesDir = existsSync(sharedDir) ? resolve(sharedDir, "modules") : null;
25
+ if (!modulesDir || !existsSync(modulesDir)) return null;
26
+
27
+ const modules = new Set(readdirSync(modulesDir).filter((f) => !f.startsWith(".")));
28
+
29
+ if (modules.has("bash") && modules.has("todo") && modules.has("rules")) {
30
+ return { templateType: "agent", projectName };
31
+ }
32
+ if (modules.has("browser")) {
33
+ return { templateType: "browser-agent", projectName };
34
+ }
35
+ if (modules.has("task") && modules.has("context") && modules.has("output")) {
36
+ return { templateType: "cowork", projectName };
37
+ }
38
+ if (modules.has("chat") && !modules.has("file") && !modules.has("git")) {
39
+ return { templateType: "chat", projectName };
40
+ }
41
+ return { templateType: "general", projectName };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+
47
+ const DIFF_EXCLUDES = [
48
+ "node_modules",
49
+ "dist",
50
+ "build",
51
+ ".git",
52
+ ".husky",
53
+ ".server-port",
54
+ "logs",
55
+ "bun.lock",
56
+ "pnpm-lock.yaml",
57
+ ].flatMap((e) => [`--exclude=${e}`]);
58
+
59
+ function diffTemplateAgainstProject(
60
+ templateDir: string,
61
+ targetDir: string,
62
+ projectName: string
63
+ ): string {
64
+ // Render the template into a temp dir first so the diff compares what
65
+ // update --force would actually write, not the raw placeholders.
66
+ const tmpDir = mkdtempSync(resolve(tmpdir(), "create-agent-update-"));
67
+ try {
68
+ copyAndReplace(templateDir, tmpDir, projectName);
69
+ const result = spawnSync("diff", ["-rq", ...DIFF_EXCLUDES, `${tmpDir}/`, `${targetDir}/`], {
70
+ encoding: "utf-8",
71
+ maxBuffer: 10 * 1024 * 1024,
72
+ });
73
+ if (result.error) {
74
+ return `(diff unavailable: ${result.error.message})`;
75
+ }
76
+ if (result.status === 2) {
77
+ return `(diff failed: ${result.stderr.trim()})`;
78
+ }
79
+ return result.stdout.replaceAll(`${tmpDir}/`, "<template>/");
80
+ } finally {
81
+ rmSync(tmpDir, { recursive: true, force: true });
82
+ }
83
+ }
84
+
85
+ export async function runUpdate(args: string[]): Promise<void> {
86
+ let targetDir = process.cwd();
87
+ let force = false;
88
+ let dryRun = false;
89
+
90
+ for (let i = 0; i < args.length; i++) {
91
+ const arg = args[i];
92
+ if (arg === "--dir" && args[i + 1]) {
93
+ targetDir = resolve(expandTilde(args[++i]!));
94
+ } else if (arg === "--force") {
95
+ force = true;
96
+ } else if (arg === "--dry-run") {
97
+ dryRun = true;
98
+ } else if (arg === "--help" || arg === "-h") {
99
+ console.log(`
100
+ Usage: create-agent update [options]
101
+
102
+ Update project to latest template version.
103
+
104
+ Options:
105
+ --dir <path> Target project directory (default: current directory)
106
+ --force Overwrite ALL template files (including src/shared/, modules/, lib/)
107
+ --dry-run Show what would change without modifying files
108
+ -h, --help Show this help message
109
+
110
+ Examples:
111
+ create-agent update
112
+ create-agent update --dir ~/projects/my-app
113
+ create-agent update --dry-run
114
+ create-agent update --force
115
+ `);
116
+ process.exit(0);
117
+ }
118
+ }
119
+
120
+ if (!existsSync(targetDir)) {
121
+ console.error(`Directory does not exist: ${targetDir}`);
122
+ process.exit(1);
123
+ }
124
+
125
+ const meta = detectTemplateMeta(targetDir);
126
+ if (!meta) {
127
+ console.error(
128
+ "Cannot detect template type. Make sure you're in a pi-agent-template project directory."
129
+ );
130
+ process.exit(1);
131
+ }
132
+
133
+ const { templateType, projectName } = meta;
134
+ console.log(`Detected template: ${templateType}`);
135
+ console.log(`Project name: ${projectName}`);
136
+ console.log("");
137
+
138
+ const rootDir = getRootDir();
139
+ const templateDir = resolveTemplateDir(rootDir, templateType);
140
+
141
+ if (dryRun) {
142
+ console.log("Dry run - showing changes:");
143
+ console.log("");
144
+ const diffResult = diffTemplateAgainstProject(templateDir, targetDir, projectName);
145
+ if (!diffResult.trim()) {
146
+ console.log("No changes detected. Project is up to date!");
147
+ } else {
148
+ console.log(diffResult);
149
+ }
150
+ return;
151
+ }
152
+
153
+ if (!force) {
154
+ console.log("This command requires --force to run.");
155
+ console.log("");
156
+ console.log("NOTE: --force overwrites ALL template files, including your edits in");
157
+ console.log("src/shared/handlers/, src/shared/modules/, src/shared/lib/. Commit or");
158
+ console.log("stash your work first, then review the result with: git diff");
159
+ console.log("");
160
+ console.log("Use --dry-run to preview changes before forcing.");
161
+ return;
162
+ }
163
+
164
+ copyAndReplace(templateDir, targetDir, projectName);
165
+ postProcessTemplate(targetDir, projectName);
166
+
167
+ console.log("");
168
+ console.log("Template files updated successfully!");
169
+ console.log("");
170
+ console.log("Next steps:");
171
+ console.log(" 1. Review the changes with: git diff");
172
+ console.log(" 2. Run: bun install");
173
+ console.log(" 3. Test: bun run dev:web");
174
+ }
@@ -1,10 +1,26 @@
1
1
  import { resolve } from "path";
2
- import { execSync } from "child_process";
2
+ import { execFileSync } from "child_process";
3
3
  import { existsSync, readFileSync, mkdirSync } from "fs";
4
+ import { homedir } from "os";
4
5
  import { createServer } from "net";
5
6
  import type { PortEntry } from "../lib/types.js";
6
7
 
7
- const PORT_REGISTRY = resolve(process.env.HOME || "~", ".pi-agent", "ports.json");
8
+ const PORT_REGISTRY = resolve(homedir(), ".pi-agent", "ports.json");
9
+
10
+ const WORKSPACE_NAME_RE = /^[\w][\w.-]*$/;
11
+
12
+ /** Returns an error message for invalid names, or null when valid. */
13
+ export function validateWorkspaceName(name: string): string | null {
14
+ // The name becomes both a directory and a git branch; anything outside
15
+ // word characters, dots and dashes is rejected rather than escaped.
16
+ if (!WORKSPACE_NAME_RE.test(name)) {
17
+ return (
18
+ `Invalid workspace name "${name}". ` +
19
+ "Use letters, digits, '.', '_' or '-' (e.g. feature-chat-ui)."
20
+ );
21
+ }
22
+ return null;
23
+ }
8
24
 
9
25
  function readRegistry(): Record<string, PortEntry> {
10
26
  try {
@@ -83,6 +99,12 @@ Examples:
83
99
  process.exit(1);
84
100
  }
85
101
 
102
+ const nameError = validateWorkspaceName(name);
103
+ if (nameError) {
104
+ console.error(`Error: ${nameError}`);
105
+ process.exit(1);
106
+ }
107
+
86
108
  const projectRoot = process.cwd();
87
109
  const workspaceDir = resolve(projectRoot, ".workspace", name);
88
110
 
@@ -101,7 +123,7 @@ Examples:
101
123
  mkdirSync(resolve(projectRoot, ".workspace"), { recursive: true });
102
124
 
103
125
  try {
104
- execSync(`git worktree add "${workspaceDir}" -b ${branchName} ${baseArg}`, {
126
+ execFileSync("git", ["worktree", "add", workspaceDir, "-b", branchName, baseArg], {
105
127
  cwd: projectRoot,
106
128
  stdio: "pipe",
107
129
  });
@@ -119,7 +141,7 @@ Examples:
119
141
  console.log("");
120
142
  console.log("Installing dependencies...");
121
143
  try {
122
- execSync("bun install", { cwd: workspaceDir, stdio: "pipe" });
144
+ execFileSync("bun", ["install"], { cwd: workspaceDir, stdio: "pipe" });
123
145
  } catch {
124
146
  console.log("(bun install skipped)");
125
147
  }
@@ -131,6 +153,4 @@ Examples:
131
153
  console.log(` cd .workspace/${name}`);
132
154
  console.log(` PORT=${ports.backend} VITE_PORT=${ports.vite} bun run dev:web`);
133
155
  console.log("");
134
- console.log("Or start from project root:");
135
- console.log(` PORT=${ports.backend} VITE_PORT=${ports.vite} bun run dev:web`);
136
156
  }