@celljs/cli 3.9.0 → 4.0.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 (758) hide show
  1. package/README.md +442 -1
  2. package/agent/guide.md +39 -0
  3. package/bin/cell.js +2 -0
  4. package/lib/agent/agent-guide.d.ts +39 -0
  5. package/lib/agent/agent-guide.d.ts.map +1 -0
  6. package/lib/agent/agent-guide.js +67 -0
  7. package/lib/agent/agent-guide.js.map +1 -0
  8. package/lib/build/executable-compiler.d.ts +44 -0
  9. package/lib/build/executable-compiler.d.ts.map +1 -0
  10. package/lib/build/executable-compiler.js +145 -0
  11. package/lib/build/executable-compiler.js.map +1 -0
  12. package/lib/build/executable-compiler.spec.d.ts +2 -0
  13. package/lib/build/executable-compiler.spec.d.ts.map +1 -0
  14. package/lib/build/executable-compiler.spec.js +71 -0
  15. package/lib/build/executable-compiler.spec.js.map +1 -0
  16. package/lib/build/single-compile.spec.d.ts +2 -0
  17. package/lib/build/single-compile.spec.d.ts.map +1 -0
  18. package/lib/build/single-compile.spec.js +135 -0
  19. package/lib/build/single-compile.spec.js.map +1 -0
  20. package/lib/check/project-checker.d.ts +85 -0
  21. package/lib/check/project-checker.d.ts.map +1 -0
  22. package/lib/check/project-checker.js +332 -0
  23. package/lib/check/project-checker.js.map +1 -0
  24. package/lib/check/project-checker.spec.d.ts +2 -0
  25. package/lib/check/project-checker.spec.d.ts.map +1 -0
  26. package/lib/check/project-checker.spec.js +147 -0
  27. package/lib/check/project-checker.spec.js.map +1 -0
  28. package/lib/cli/agent-command.d.ts +15 -0
  29. package/lib/cli/agent-command.d.ts.map +1 -0
  30. package/lib/cli/agent-command.js +42 -0
  31. package/lib/cli/agent-command.js.map +1 -0
  32. package/lib/cli/build-command.d.ts +84 -0
  33. package/lib/cli/build-command.d.ts.map +1 -0
  34. package/lib/cli/build-command.js +170 -0
  35. package/lib/cli/build-command.js.map +1 -0
  36. package/lib/cli/cell-cli.d.ts +35 -0
  37. package/lib/cli/cell-cli.d.ts.map +1 -0
  38. package/lib/cli/cell-cli.js +159 -0
  39. package/lib/cli/cell-cli.js.map +1 -0
  40. package/lib/cli/cell-cli.spec.d.ts +2 -0
  41. package/lib/cli/cell-cli.spec.d.ts.map +1 -0
  42. package/lib/cli/cell-cli.spec.js +195 -0
  43. package/lib/cli/cell-cli.spec.js.map +1 -0
  44. package/lib/cli/check-command.d.ts +31 -0
  45. package/lib/cli/check-command.d.ts.map +1 -0
  46. package/lib/cli/check-command.js +67 -0
  47. package/lib/cli/check-command.js.map +1 -0
  48. package/lib/cli/command.d.ts +24 -0
  49. package/lib/cli/command.d.ts.map +1 -0
  50. package/lib/cli/command.js +10 -0
  51. package/lib/cli/command.js.map +1 -0
  52. package/lib/cli/config-command.d.ts +29 -0
  53. package/lib/cli/config-command.d.ts.map +1 -0
  54. package/lib/cli/config-command.js +71 -0
  55. package/lib/cli/config-command.js.map +1 -0
  56. package/lib/cli/config-command.spec.d.ts +2 -0
  57. package/lib/cli/config-command.spec.d.ts.map +1 -0
  58. package/lib/cli/config-command.spec.js +79 -0
  59. package/lib/cli/config-command.spec.js.map +1 -0
  60. package/lib/cli/deploy-command.d.ts +41 -0
  61. package/lib/cli/deploy-command.d.ts.map +1 -0
  62. package/lib/cli/deploy-command.js +114 -0
  63. package/lib/cli/deploy-command.js.map +1 -0
  64. package/lib/cli/dev-command.d.ts +47 -0
  65. package/lib/cli/dev-command.d.ts.map +1 -0
  66. package/lib/cli/dev-command.js +219 -0
  67. package/lib/cli/dev-command.js.map +1 -0
  68. package/lib/cli/dev-command.spec.d.ts +2 -0
  69. package/lib/cli/dev-command.spec.d.ts.map +1 -0
  70. package/lib/cli/dev-command.spec.js +149 -0
  71. package/lib/cli/dev-command.spec.js.map +1 -0
  72. package/lib/cli/docs-command.d.ts +19 -0
  73. package/lib/cli/docs-command.d.ts.map +1 -0
  74. package/lib/cli/docs-command.js +47 -0
  75. package/lib/cli/docs-command.js.map +1 -0
  76. package/lib/cli/info-command.d.ts +44 -0
  77. package/lib/cli/info-command.d.ts.map +1 -0
  78. package/lib/cli/info-command.js +39 -0
  79. package/lib/cli/info-command.js.map +1 -0
  80. package/lib/cli/info-command.spec.d.ts +2 -0
  81. package/lib/cli/info-command.spec.d.ts.map +1 -0
  82. package/lib/cli/info-command.spec.js +236 -0
  83. package/lib/cli/info-command.spec.js.map +1 -0
  84. package/lib/cli/init-command.d.ts +20 -0
  85. package/lib/cli/init-command.d.ts.map +1 -0
  86. package/lib/cli/init-command.js +43 -0
  87. package/lib/cli/init-command.js.map +1 -0
  88. package/lib/cli/main.d.ts +2 -0
  89. package/lib/cli/main.d.ts.map +1 -0
  90. package/lib/cli/main.js +3 -0
  91. package/lib/cli/main.js.map +1 -0
  92. package/lib/cli/mcp-command.d.ts +34 -0
  93. package/lib/cli/mcp-command.d.ts.map +1 -0
  94. package/lib/cli/mcp-command.js +85 -0
  95. package/lib/cli/mcp-command.js.map +1 -0
  96. package/lib/cli/mcp-command.spec.d.ts +2 -0
  97. package/lib/cli/mcp-command.spec.d.ts.map +1 -0
  98. package/lib/cli/mcp-command.spec.js +132 -0
  99. package/lib/cli/mcp-command.spec.js.map +1 -0
  100. package/lib/cli/preview-command.d.ts +24 -0
  101. package/lib/cli/preview-command.d.ts.map +1 -0
  102. package/lib/cli/preview-command.js +91 -0
  103. package/lib/cli/preview-command.js.map +1 -0
  104. package/lib/cli/reporter.d.ts +26 -0
  105. package/lib/cli/reporter.d.ts.map +1 -0
  106. package/lib/cli/reporter.js +58 -0
  107. package/lib/cli/reporter.js.map +1 -0
  108. package/lib/config/config-build.spec.d.ts +2 -0
  109. package/lib/config/config-build.spec.d.ts.map +1 -0
  110. package/lib/config/config-build.spec.js +111 -0
  111. package/lib/config/config-build.spec.js.map +1 -0
  112. package/lib/config/config-explainer.d.ts +48 -0
  113. package/lib/config/config-explainer.d.ts.map +1 -0
  114. package/lib/config/config-explainer.js +130 -0
  115. package/lib/config/config-explainer.js.map +1 -0
  116. package/lib/config/config-file-loader.d.ts +22 -0
  117. package/lib/config/config-file-loader.d.ts.map +1 -0
  118. package/lib/config/config-file-loader.js +63 -0
  119. package/lib/config/config-file-loader.js.map +1 -0
  120. package/lib/config/config-resolver.d.ts +111 -0
  121. package/lib/config/config-resolver.d.ts.map +1 -0
  122. package/lib/config/config-resolver.js +215 -0
  123. package/lib/config/config-resolver.js.map +1 -0
  124. package/lib/config/config-resolver.spec.d.ts +2 -0
  125. package/lib/config/config-resolver.spec.d.ts.map +1 -0
  126. package/lib/config/config-resolver.spec.js +159 -0
  127. package/lib/config/config-resolver.spec.js.map +1 -0
  128. package/lib/config/config-validator.d.ts +35 -0
  129. package/lib/config/config-validator.d.ts.map +1 -0
  130. package/lib/config/config-validator.js +160 -0
  131. package/lib/config/config-validator.js.map +1 -0
  132. package/lib/config/config-validator.spec.d.ts +2 -0
  133. package/lib/config/config-validator.spec.d.ts.map +1 -0
  134. package/lib/config/config-validator.spec.js +77 -0
  135. package/lib/config/config-validator.spec.js.map +1 -0
  136. package/lib/config/define-config.d.ts +4 -0
  137. package/lib/config/define-config.d.ts.map +1 -0
  138. package/lib/config/define-config.js +5 -0
  139. package/lib/config/define-config.js.map +1 -0
  140. package/lib/config/types.d.ts +53 -0
  141. package/lib/config/types.d.ts.map +1 -0
  142. package/lib/config/types.js +2 -0
  143. package/lib/config/types.js.map +1 -0
  144. package/lib/deploy/cloud-api.d.ts +58 -0
  145. package/lib/deploy/cloud-api.d.ts.map +1 -0
  146. package/lib/deploy/cloud-api.js +189 -0
  147. package/lib/deploy/cloud-api.js.map +1 -0
  148. package/lib/deploy/code-package.d.ts +15 -0
  149. package/lib/deploy/code-package.d.ts.map +1 -0
  150. package/lib/deploy/code-package.js +40 -0
  151. package/lib/deploy/code-package.js.map +1 -0
  152. package/lib/deploy/deploy-utils.spec.d.ts +2 -0
  153. package/lib/deploy/deploy-utils.spec.d.ts.map +1 -0
  154. package/lib/deploy/deploy-utils.spec.js +56 -0
  155. package/lib/deploy/deploy-utils.spec.js.map +1 -0
  156. package/lib/deploy/deployer-registry.d.ts +11 -0
  157. package/lib/deploy/deployer-registry.d.ts.map +1 -0
  158. package/lib/deploy/deployer-registry.js +40 -0
  159. package/lib/deploy/deployer-registry.js.map +1 -0
  160. package/lib/deploy/request-signer.d.ts +51 -0
  161. package/lib/deploy/request-signer.d.ts.map +1 -0
  162. package/lib/deploy/request-signer.js +109 -0
  163. package/lib/deploy/request-signer.js.map +1 -0
  164. package/lib/deploy/zip-writer.d.ts +32 -0
  165. package/lib/deploy/zip-writer.d.ts.map +1 -0
  166. package/lib/deploy/zip-writer.js +114 -0
  167. package/lib/deploy/zip-writer.js.map +1 -0
  168. package/lib/docs/docs-index.d.ts +54 -0
  169. package/lib/docs/docs-index.d.ts.map +1 -0
  170. package/lib/docs/docs-index.js +140 -0
  171. package/lib/docs/docs-index.js.map +1 -0
  172. package/lib/docs/docs-index.spec.d.ts +2 -0
  173. package/lib/docs/docs-index.spec.d.ts.map +1 -0
  174. package/lib/docs/docs-index.spec.js +52 -0
  175. package/lib/docs/docs-index.spec.js.map +1 -0
  176. package/lib/events/event-bus.d.ts +30 -0
  177. package/lib/events/event-bus.d.ts.map +1 -0
  178. package/lib/events/event-bus.js +81 -0
  179. package/lib/events/event-bus.js.map +1 -0
  180. package/lib/events/event-bus.spec.d.ts +2 -0
  181. package/lib/events/event-bus.spec.d.ts.map +1 -0
  182. package/lib/events/event-bus.spec.js +69 -0
  183. package/lib/events/event-bus.spec.js.map +1 -0
  184. package/lib/events/hook-runner.d.ts +27 -0
  185. package/lib/events/hook-runner.d.ts.map +1 -0
  186. package/lib/events/hook-runner.js +65 -0
  187. package/lib/events/hook-runner.js.map +1 -0
  188. package/lib/events/hook-runner.spec.d.ts +2 -0
  189. package/lib/events/hook-runner.spec.d.ts.map +1 -0
  190. package/lib/events/hook-runner.spec.js +36 -0
  191. package/lib/events/hook-runner.spec.js.map +1 -0
  192. package/lib/index.d.ts +57 -1
  193. package/lib/index.d.ts.map +1 -1
  194. package/lib/index.js +57 -2
  195. package/lib/index.js.map +1 -1
  196. package/lib/info/project-inspector.d.ts +143 -0
  197. package/lib/info/project-inspector.d.ts.map +1 -0
  198. package/lib/info/project-inspector.js +244 -0
  199. package/lib/info/project-inspector.js.map +1 -0
  200. package/lib/init/project-initializer.d.ts +44 -0
  201. package/lib/init/project-initializer.d.ts.map +1 -0
  202. package/lib/init/project-initializer.js +90 -0
  203. package/lib/init/project-initializer.js.map +1 -0
  204. package/lib/init/project-initializer.spec.d.ts +2 -0
  205. package/lib/init/project-initializer.spec.d.ts.map +1 -0
  206. package/lib/init/project-initializer.spec.js +88 -0
  207. package/lib/init/project-initializer.spec.js.map +1 -0
  208. package/lib/mcp/dev-activity.d.ts +34 -0
  209. package/lib/mcp/dev-activity.d.ts.map +1 -0
  210. package/lib/mcp/dev-activity.js +46 -0
  211. package/lib/mcp/dev-activity.js.map +1 -0
  212. package/lib/mcp/dev-mcp-endpoint.d.ts +62 -0
  213. package/lib/mcp/dev-mcp-endpoint.d.ts.map +1 -0
  214. package/lib/mcp/dev-mcp-endpoint.js +280 -0
  215. package/lib/mcp/dev-mcp-endpoint.js.map +1 -0
  216. package/lib/mcp/dev-mcp-endpoint.spec.d.ts +2 -0
  217. package/lib/mcp/dev-mcp-endpoint.spec.d.ts.map +1 -0
  218. package/lib/mcp/dev-mcp-endpoint.spec.js +143 -0
  219. package/lib/mcp/dev-mcp-endpoint.spec.js.map +1 -0
  220. package/lib/mcp/mcp-server.d.ts +64 -0
  221. package/lib/mcp/mcp-server.d.ts.map +1 -0
  222. package/lib/mcp/mcp-server.js +201 -0
  223. package/lib/mcp/mcp-server.js.map +1 -0
  224. package/lib/mcp/mcp-server.spec.d.ts +2 -0
  225. package/lib/mcp/mcp-server.spec.d.ts.map +1 -0
  226. package/lib/mcp/mcp-server.spec.js +136 -0
  227. package/lib/mcp/mcp-server.spec.js.map +1 -0
  228. package/lib/mcp/project-mcp-tools.d.ts +35 -0
  229. package/lib/mcp/project-mcp-tools.d.ts.map +1 -0
  230. package/lib/mcp/project-mcp-tools.js +199 -0
  231. package/lib/mcp/project-mcp-tools.js.map +1 -0
  232. package/lib/modules/module-host.d.ts +118 -0
  233. package/lib/modules/module-host.d.ts.map +1 -0
  234. package/lib/modules/module-host.js +405 -0
  235. package/lib/modules/module-host.js.map +1 -0
  236. package/lib/modules/module-host.spec.d.ts +2 -0
  237. package/lib/modules/module-host.spec.d.ts.map +1 -0
  238. package/lib/modules/module-host.spec.js +220 -0
  239. package/lib/modules/module-host.spec.js.map +1 -0
  240. package/lib/preset/builtin-presets.d.ts +9 -0
  241. package/lib/preset/builtin-presets.d.ts.map +1 -0
  242. package/lib/preset/builtin-presets.js +24 -0
  243. package/lib/preset/builtin-presets.js.map +1 -0
  244. package/lib/preset/cloudflare/cloudflare-deployer.d.ts +26 -0
  245. package/lib/preset/cloudflare/cloudflare-deployer.d.ts.map +1 -0
  246. package/lib/preset/cloudflare/cloudflare-deployer.js +116 -0
  247. package/lib/preset/cloudflare/cloudflare-deployer.js.map +1 -0
  248. package/lib/preset/cloudflare/cloudflare-preset.d.ts +16 -0
  249. package/lib/preset/cloudflare/cloudflare-preset.d.ts.map +1 -0
  250. package/lib/preset/cloudflare/cloudflare-preset.js +97 -0
  251. package/lib/preset/cloudflare/cloudflare-preset.js.map +1 -0
  252. package/lib/preset/cloudflare/cloudflare.spec.d.ts +2 -0
  253. package/lib/preset/cloudflare/cloudflare.spec.d.ts.map +1 -0
  254. package/lib/preset/cloudflare/cloudflare.spec.js +212 -0
  255. package/lib/preset/cloudflare/cloudflare.spec.js.map +1 -0
  256. package/lib/preset/cloudflare/wrangler-config.d.ts +50 -0
  257. package/lib/preset/cloudflare/wrangler-config.d.ts.map +1 -0
  258. package/lib/preset/cloudflare/wrangler-config.js +160 -0
  259. package/lib/preset/cloudflare/wrangler-config.js.map +1 -0
  260. package/lib/preset/cloudflare/wrangler-config.spec.d.ts +2 -0
  261. package/lib/preset/cloudflare/wrangler-config.spec.d.ts.map +1 -0
  262. package/lib/preset/cloudflare/wrangler-config.spec.js +112 -0
  263. package/lib/preset/cloudflare/wrangler-config.spec.js.map +1 -0
  264. package/lib/preset/cloudflare/wrangler.d.ts +38 -0
  265. package/lib/preset/cloudflare/wrangler.d.ts.map +1 -0
  266. package/lib/preset/cloudflare/wrangler.js +90 -0
  267. package/lib/preset/cloudflare/wrangler.js.map +1 -0
  268. package/lib/preset/cloudflare/wrangler.spec.d.ts +2 -0
  269. package/lib/preset/cloudflare/wrangler.spec.d.ts.map +1 -0
  270. package/lib/preset/cloudflare/wrangler.spec.js +64 -0
  271. package/lib/preset/cloudflare/wrangler.spec.js.map +1 -0
  272. package/lib/preset/fc/fc-deployer.d.ts +50 -0
  273. package/lib/preset/fc/fc-deployer.d.ts.map +1 -0
  274. package/lib/preset/fc/fc-deployer.js +209 -0
  275. package/lib/preset/fc/fc-deployer.js.map +1 -0
  276. package/lib/preset/fc/fc-preset.d.ts +20 -0
  277. package/lib/preset/fc/fc-preset.d.ts.map +1 -0
  278. package/lib/preset/fc/fc-preset.js +46 -0
  279. package/lib/preset/fc/fc-preset.js.map +1 -0
  280. package/lib/preset/lambda/lambda-deployer.d.ts +50 -0
  281. package/lib/preset/lambda/lambda-deployer.d.ts.map +1 -0
  282. package/lib/preset/lambda/lambda-deployer.js +274 -0
  283. package/lib/preset/lambda/lambda-deployer.js.map +1 -0
  284. package/lib/preset/lambda/lambda-preset.d.ts +14 -0
  285. package/lib/preset/lambda/lambda-preset.d.ts.map +1 -0
  286. package/lib/preset/lambda/lambda-preset.js +44 -0
  287. package/lib/preset/lambda/lambda-preset.js.map +1 -0
  288. package/lib/preset/preset-output.d.ts +19 -0
  289. package/lib/preset/preset-output.d.ts.map +1 -0
  290. package/lib/preset/preset-output.js +45 -0
  291. package/lib/preset/preset-output.js.map +1 -0
  292. package/lib/preset/preset-registry.d.ts +16 -0
  293. package/lib/preset/preset-registry.d.ts.map +1 -0
  294. package/lib/preset/preset-registry.js +58 -0
  295. package/lib/preset/preset-registry.js.map +1 -0
  296. package/lib/preset/preset-registry.spec.d.ts +2 -0
  297. package/lib/preset/preset-registry.spec.d.ts.map +1 -0
  298. package/lib/preset/preset-registry.spec.js +28 -0
  299. package/lib/preset/preset-registry.spec.js.map +1 -0
  300. package/lib/preset/scf/scf-deployer.d.ts +54 -0
  301. package/lib/preset/scf/scf-deployer.d.ts.map +1 -0
  302. package/lib/preset/scf/scf-deployer.js +202 -0
  303. package/lib/preset/scf/scf-deployer.js.map +1 -0
  304. package/lib/preset/scf/scf-preset.d.ts +19 -0
  305. package/lib/preset/scf/scf-preset.d.ts.map +1 -0
  306. package/lib/preset/scf/scf-preset.js +43 -0
  307. package/lib/preset/scf/scf-preset.js.map +1 -0
  308. package/lib/preset/serverless-deployers.spec.d.ts +2 -0
  309. package/lib/preset/serverless-deployers.spec.d.ts.map +1 -0
  310. package/lib/preset/serverless-deployers.spec.js +307 -0
  311. package/lib/preset/serverless-deployers.spec.js.map +1 -0
  312. package/lib/preset/serverless-presets.spec.d.ts +2 -0
  313. package/lib/preset/serverless-presets.spec.d.ts.map +1 -0
  314. package/lib/preset/serverless-presets.spec.js +280 -0
  315. package/lib/preset/serverless-presets.spec.js.map +1 -0
  316. package/lib/preset/serverless-scripts.d.ts +29 -0
  317. package/lib/preset/serverless-scripts.d.ts.map +1 -0
  318. package/lib/preset/serverless-scripts.js +120 -0
  319. package/lib/preset/serverless-scripts.js.map +1 -0
  320. package/lib/preset/vercel/vercel-deployer.d.ts +38 -0
  321. package/lib/preset/vercel/vercel-deployer.d.ts.map +1 -0
  322. package/lib/preset/vercel/vercel-deployer.js +160 -0
  323. package/lib/preset/vercel/vercel-deployer.js.map +1 -0
  324. package/lib/preset/vercel/vercel-preset.d.ts +19 -0
  325. package/lib/preset/vercel/vercel-preset.d.ts.map +1 -0
  326. package/lib/preset/vercel/vercel-preset.js +102 -0
  327. package/lib/preset/vercel/vercel-preset.js.map +1 -0
  328. package/lib/test/fixture-project.d.ts +17 -0
  329. package/lib/test/fixture-project.d.ts.map +1 -0
  330. package/lib/test/fixture-project.js +43 -0
  331. package/lib/test/fixture-project.js.map +1 -0
  332. package/lib/testing/create-test-app.d.ts +27 -0
  333. package/lib/testing/create-test-app.d.ts.map +1 -0
  334. package/lib/testing/create-test-app.js +54 -0
  335. package/lib/testing/create-test-app.js.map +1 -0
  336. package/lib/testing/create-test-app.spec.d.ts +2 -0
  337. package/lib/testing/create-test-app.spec.d.ts.map +1 -0
  338. package/lib/testing/create-test-app.spec.js +66 -0
  339. package/lib/testing/create-test-app.spec.js.map +1 -0
  340. package/lib/toolchain/toolchain.d.ts +49 -0
  341. package/lib/toolchain/toolchain.d.ts.map +1 -0
  342. package/lib/toolchain/toolchain.js +100 -0
  343. package/lib/toolchain/toolchain.js.map +1 -0
  344. package/lib/utils/json-util.d.ts +11 -0
  345. package/lib/utils/json-util.d.ts.map +1 -0
  346. package/lib/utils/json-util.js +73 -0
  347. package/lib/utils/json-util.js.map +1 -0
  348. package/lib/utils/json-util.spec.d.ts +2 -0
  349. package/lib/utils/json-util.spec.d.ts.map +1 -0
  350. package/lib/utils/json-util.spec.js +18 -0
  351. package/lib/utils/json-util.spec.js.map +1 -0
  352. package/lib/utils/text-util.d.ts +19 -0
  353. package/lib/utils/text-util.d.ts.map +1 -0
  354. package/lib/utils/text-util.js +66 -0
  355. package/lib/utils/text-util.js.map +1 -0
  356. package/lib/utils/text-util.spec.d.ts +2 -0
  357. package/lib/utils/text-util.spec.d.ts.map +1 -0
  358. package/lib/utils/text-util.spec.js +22 -0
  359. package/lib/utils/text-util.spec.js.map +1 -0
  360. package/package.json +28 -30
  361. package/src/agent/agent-guide.ts +90 -0
  362. package/src/build/executable-compiler.ts +179 -0
  363. package/src/check/project-checker.ts +365 -0
  364. package/src/cli/agent-command.ts +46 -0
  365. package/src/cli/build-command.ts +189 -0
  366. package/src/cli/cell-cli.ts +174 -0
  367. package/src/cli/check-command.ts +74 -0
  368. package/src/cli/command.ts +29 -0
  369. package/src/cli/config-command.ts +73 -0
  370. package/src/cli/deploy-command.ts +122 -0
  371. package/src/cli/dev-command.ts +232 -0
  372. package/src/cli/docs-command.ts +53 -0
  373. package/src/cli/info-command.ts +40 -0
  374. package/src/cli/init-command.ts +53 -0
  375. package/src/cli/main.ts +3 -0
  376. package/src/cli/mcp-command.ts +98 -0
  377. package/src/cli/preview-command.ts +98 -0
  378. package/src/cli/reporter.ts +67 -0
  379. package/src/config/config-explainer.ts +158 -0
  380. package/src/config/config-file-loader.ts +76 -0
  381. package/src/config/config-resolver.ts +300 -0
  382. package/src/config/config-validator.ts +208 -0
  383. package/src/config/define-config.ts +6 -0
  384. package/src/config/types.ts +57 -0
  385. package/src/deploy/cloud-api.ts +194 -0
  386. package/src/deploy/code-package.ts +44 -0
  387. package/src/deploy/deployer-registry.ts +44 -0
  388. package/src/deploy/request-signer.ts +155 -0
  389. package/src/deploy/zip-writer.ts +132 -0
  390. package/src/docs/docs-index.ts +174 -0
  391. package/src/events/event-bus.ts +94 -0
  392. package/src/events/hook-runner.ts +78 -0
  393. package/src/index.ts +57 -0
  394. package/src/info/project-inspector.ts +352 -0
  395. package/src/init/project-initializer.ts +111 -0
  396. package/src/mcp/dev-activity.ts +71 -0
  397. package/src/mcp/dev-mcp-endpoint.ts +323 -0
  398. package/src/mcp/mcp-server.ts +251 -0
  399. package/src/mcp/project-mcp-tools.ts +216 -0
  400. package/src/modules/module-host.ts +489 -0
  401. package/src/preset/builtin-presets.ts +26 -0
  402. package/src/preset/cloudflare/cloudflare-deployer.ts +126 -0
  403. package/src/preset/cloudflare/cloudflare-preset.ts +97 -0
  404. package/src/preset/cloudflare/wrangler-config.ts +173 -0
  405. package/src/preset/cloudflare/wrangler.ts +113 -0
  406. package/src/preset/fc/fc-deployer.ts +237 -0
  407. package/src/preset/fc/fc-preset.ts +51 -0
  408. package/src/preset/lambda/lambda-deployer.ts +317 -0
  409. package/src/preset/lambda/lambda-preset.ts +45 -0
  410. package/src/preset/preset-output.ts +55 -0
  411. package/src/preset/preset-registry.ts +65 -0
  412. package/src/preset/scf/scf-deployer.ts +232 -0
  413. package/src/preset/scf/scf-preset.ts +45 -0
  414. package/src/preset/serverless-scripts.ts +132 -0
  415. package/src/preset/vercel/vercel-deployer.ts +168 -0
  416. package/src/preset/vercel/vercel-preset.ts +111 -0
  417. package/src/test/fixture-project.ts +50 -0
  418. package/src/testing/create-test-app.ts +73 -0
  419. package/src/toolchain/toolchain.ts +121 -0
  420. package/src/utils/json-util.ts +67 -0
  421. package/src/utils/text-util.ts +68 -0
  422. package/templates/backend/README.md +13 -0
  423. package/templates/backend/_gitignore +5 -0
  424. package/templates/backend/cell.yml +3 -0
  425. package/templates/backend/package.json +23 -0
  426. package/templates/{file-service/src → backend/src/node}/home-controller.ts +5 -2
  427. package/templates/{file-service/src → backend/src/node}/module.ts +0 -1
  428. package/templates/backend/template.json +3 -0
  429. package/templates/backend/test/app.spec.ts +19 -0
  430. package/templates/backend/tsconfig.json +25 -0
  431. package/templates/fullstack/README.md +13 -0
  432. package/templates/fullstack/_gitignore +5 -0
  433. package/templates/fullstack/cell.yml +6 -0
  434. package/templates/fullstack/package.json +27 -0
  435. package/templates/fullstack/src/browser/home.view.tsx +19 -0
  436. package/templates/{cell-component/src → fullstack/src/browser}/module.ts +1 -1
  437. package/templates/fullstack/src/common/greeting-protocol.ts +5 -0
  438. package/templates/fullstack/src/node/greeting-server.ts +13 -0
  439. package/templates/{admin-app/src/browser → fullstack/src/node}/module.ts +2 -1
  440. package/templates/fullstack/template.json +3 -0
  441. package/templates/fullstack/test/app.spec.ts +18 -0
  442. package/templates/fullstack/tsconfig.json +27 -0
  443. package/bin/cell +0 -2
  444. package/lib/build/build-manager.d.ts +0 -9
  445. package/lib/build/build-manager.d.ts.map +0 -1
  446. package/lib/build/build-manager.js +0 -41
  447. package/lib/build/build-manager.js.map +0 -1
  448. package/lib/build/build.d.ts +0 -6
  449. package/lib/build/build.d.ts.map +0 -1
  450. package/lib/build/build.js +0 -16
  451. package/lib/build/build.js.map +0 -1
  452. package/lib/cell-main.d.ts +0 -2
  453. package/lib/cell-main.d.ts.map +0 -1
  454. package/lib/cell-main.js +0 -110
  455. package/lib/cell-main.js.map +0 -1
  456. package/lib/cell.d.ts +0 -2
  457. package/lib/cell.d.ts.map +0 -1
  458. package/lib/cell.js +0 -194
  459. package/lib/cell.js.map +0 -1
  460. package/lib/config/config.d.ts +0 -12
  461. package/lib/config/config.d.ts.map +0 -1
  462. package/lib/config/config.js +0 -48
  463. package/lib/config/config.js.map +0 -1
  464. package/lib/deploy/deploy.d.ts +0 -7
  465. package/lib/deploy/deploy.d.ts.map +0 -1
  466. package/lib/deploy/deploy.js +0 -30
  467. package/lib/deploy/deploy.js.map +0 -1
  468. package/lib/info/info.d.ts +0 -6
  469. package/lib/info/info.d.ts.map +0 -1
  470. package/lib/info/info.js +0 -21
  471. package/lib/info/info.js.map +0 -1
  472. package/lib/init/init-manager.d.ts +0 -33
  473. package/lib/init/init-manager.d.ts.map +0 -1
  474. package/lib/init/init-manager.js +0 -141
  475. package/lib/init/init-manager.js.map +0 -1
  476. package/lib/init/init.d.ts +0 -4
  477. package/lib/init/init.d.ts.map +0 -1
  478. package/lib/init/init.js +0 -17
  479. package/lib/init/init.js.map +0 -1
  480. package/lib/init/templates.d.ts +0 -2
  481. package/lib/init/templates.d.ts.map +0 -1
  482. package/lib/init/templates.js +0 -23
  483. package/lib/init/templates.js.map +0 -1
  484. package/lib/package.spec.d.ts +0 -2
  485. package/lib/package.spec.d.ts.map +0 -1
  486. package/lib/package.spec.js +0 -7
  487. package/lib/package.spec.js.map +0 -1
  488. package/lib/props/props.d.ts +0 -9
  489. package/lib/props/props.d.ts.map +0 -1
  490. package/lib/props/props.js +0 -49
  491. package/lib/props/props.js.map +0 -1
  492. package/lib/serve/serve-manager.d.ts +0 -8
  493. package/lib/serve/serve-manager.d.ts.map +0 -1
  494. package/lib/serve/serve-manager.js +0 -44
  495. package/lib/serve/serve-manager.js.map +0 -1
  496. package/lib/serve/serve.d.ts +0 -8
  497. package/lib/serve/serve.d.ts.map +0 -1
  498. package/lib/serve/serve.js +0 -25
  499. package/lib/serve/serve.js.map +0 -1
  500. package/lib/update/update.d.ts +0 -9
  501. package/lib/update/update.d.ts.map +0 -1
  502. package/lib/update/update.js +0 -56
  503. package/lib/update/update.js.map +0 -1
  504. package/lib/utils/banner-util.d.ts +0 -6
  505. package/lib/utils/banner-util.d.ts.map +0 -1
  506. package/lib/utils/banner-util.js +0 -44
  507. package/lib/utils/banner-util.js.map +0 -1
  508. package/lib/utils/index.d.ts +0 -2
  509. package/lib/utils/index.d.ts.map +0 -1
  510. package/lib/utils/index.js +0 -18
  511. package/lib/utils/index.js.map +0 -1
  512. package/src/build/build-manager.ts +0 -50
  513. package/src/build/build.ts +0 -17
  514. package/src/cell-main.ts +0 -125
  515. package/src/cell.ts +0 -215
  516. package/src/config/config.ts +0 -56
  517. package/src/deploy/deploy.ts +0 -31
  518. package/src/info/info.ts +0 -23
  519. package/src/init/init-manager.ts +0 -163
  520. package/src/init/init.ts +0 -15
  521. package/src/init/templates.ts +0 -19
  522. package/src/package.spec.ts +0 -5
  523. package/src/props/props.ts +0 -48
  524. package/src/serve/serve-manager.ts +0 -51
  525. package/src/serve/serve.ts +0 -29
  526. package/src/update/update.ts +0 -61
  527. package/src/utils/banner-util.ts +0 -41
  528. package/src/utils/index.ts +0 -1
  529. package/templates/accounts/README.md +0 -76
  530. package/templates/accounts/cell-database.yml +0 -17
  531. package/templates/accounts/cell-locale.yml +0 -17
  532. package/templates/accounts/cell-oauth2.0.yml +0 -8
  533. package/templates/accounts/cell-theme.yml +0 -9
  534. package/templates/accounts/cell.yml +0 -10
  535. package/templates/accounts/favicon.ico +0 -0
  536. package/templates/accounts/package.json +0 -48
  537. package/templates/accounts/src/browser/home.view.tsx +0 -86
  538. package/templates/accounts/src/browser/index.ts +0 -3
  539. package/templates/accounts/src/browser/login.view.tsx +0 -78
  540. package/templates/accounts/src/browser/module.ts +0 -3
  541. package/templates/accounts/src/common/entity-protocol.ts +0 -7
  542. package/templates/accounts/src/common/index.ts +0 -1
  543. package/templates/accounts/src/node/authentication/authentication-success-handler.ts +0 -69
  544. package/templates/accounts/src/node/authentication/index.ts +0 -1
  545. package/templates/accounts/src/node/entity/base-entity.ts +0 -13
  546. package/templates/accounts/src/node/entity/connection.ts +0 -52
  547. package/templates/accounts/src/node/entity/index.ts +0 -1
  548. package/templates/accounts/src/node/entity/user.ts +0 -73
  549. package/templates/accounts/src/node/error/error.ts +0 -14
  550. package/templates/accounts/src/node/error/index.ts +0 -1
  551. package/templates/accounts/src/node/index.ts +0 -2
  552. package/templates/accounts/src/node/module.ts +0 -9
  553. package/templates/accounts/src/node/user/index.ts +0 -4
  554. package/templates/accounts/src/node/user/user-protocol.ts +0 -19
  555. package/templates/accounts/src/node/user/user-repository.ts +0 -72
  556. package/templates/accounts/src/node/user/user-service.ts +0 -36
  557. package/templates/accounts/tsconfig.json +0 -32
  558. package/templates/admin-app/.github/workflows/deploy.yml +0 -25
  559. package/templates/admin-app/.vscode/launch.json +0 -23
  560. package/templates/admin-app/README.md +0 -76
  561. package/templates/admin-app/cell-database.yml +0 -7
  562. package/templates/admin-app/cell.yml +0 -93
  563. package/templates/admin-app/package.json +0 -37
  564. package/templates/admin-app/src/browser/user.view.tsx +0 -40
  565. package/templates/admin-app/src/common/index.ts +0 -1
  566. package/templates/admin-app/src/common/user-protocol.ts +0 -23
  567. package/templates/admin-app/src/node/entity/index.ts +0 -1
  568. package/templates/admin-app/src/node/entity/user.ts +0 -15
  569. package/templates/admin-app/src/node/module.ts +0 -8
  570. package/templates/admin-app/src/node/user-service.ts +0 -41
  571. package/templates/admin-app/tsconfig.json +0 -32
  572. package/templates/backend-app/.github/workflows/deploy.yml +0 -25
  573. package/templates/backend-app/.vscode/launch.json +0 -23
  574. package/templates/backend-app/README.md +0 -76
  575. package/templates/backend-app/cell.yml +0 -0
  576. package/templates/backend-app/package.json +0 -33
  577. package/templates/backend-app/src/home-controller.ts +0 -11
  578. package/templates/backend-app/src/module.ts +0 -4
  579. package/templates/backend-app/src/user-controller.ts +0 -48
  580. package/templates/backend-app/test/home-controller.spec.ts +0 -19
  581. package/templates/backend-app/tsconfig.json +0 -32
  582. package/templates/cell-component/README.md +0 -27
  583. package/templates/cell-component/cell.yml +0 -0
  584. package/templates/cell-component/package.json +0 -29
  585. package/templates/cell-component/src/echo-service.ts +0 -16
  586. package/templates/cell-component/src/index.ts +0 -1
  587. package/templates/cell-component/src/package.spec.ts +0 -5
  588. package/templates/cell-component/tsconfig.json +0 -37
  589. package/templates/database-app/.github/workflows/deploy.yml +0 -25
  590. package/templates/database-app/.vscode/launch.json +0 -23
  591. package/templates/database-app/README.md +0 -76
  592. package/templates/database-app/cell.yml +0 -17
  593. package/templates/database-app/package.json +0 -31
  594. package/templates/database-app/src/entity/index.ts +0 -1
  595. package/templates/database-app/src/entity/user.ts +0 -13
  596. package/templates/database-app/src/home-controller.ts +0 -11
  597. package/templates/database-app/src/module.ts +0 -8
  598. package/templates/database-app/src/user-controller.ts +0 -43
  599. package/templates/database-app/tsconfig.json +0 -32
  600. package/templates/docker-app/.github/workflows/deploy.yml +0 -25
  601. package/templates/docker-app/.vscode/launch.json +0 -23
  602. package/templates/docker-app/Dockerfile +0 -27
  603. package/templates/docker-app/README.md +0 -77
  604. package/templates/docker-app/cell.yml +0 -0
  605. package/templates/docker-app/package.json +0 -31
  606. package/templates/docker-app/src/browser/assets/logo.png +0 -0
  607. package/templates/docker-app/src/browser/css-shims.d.ts +0 -30
  608. package/templates/docker-app/src/browser/hello.view.tsx +0 -31
  609. package/templates/docker-app/src/browser/module.ts +0 -3
  610. package/templates/docker-app/src/browser/style/hello.module.scss +0 -4
  611. package/templates/docker-app/src/common/welcome-protocol.ts +0 -5
  612. package/templates/docker-app/src/node/module.ts +0 -3
  613. package/templates/docker-app/src/node/welcome-server.ts +0 -9
  614. package/templates/docker-app/tsconfig.json +0 -33
  615. package/templates/file-service/.github/workflows/deploy.yml +0 -25
  616. package/templates/file-service/.vscode/launch.json +0 -23
  617. package/templates/file-service/README.md +0 -76
  618. package/templates/file-service/cell.yml +0 -12
  619. package/templates/file-service/package.json +0 -34
  620. package/templates/file-service/src/file-controller.ts +0 -47
  621. package/templates/file-service/tsconfig.json +0 -32
  622. package/templates/jwt-app/.github/workflows/deploy.yml +0 -25
  623. package/templates/jwt-app/.vscode/launch.json +0 -23
  624. package/templates/jwt-app/README.md +0 -76
  625. package/templates/jwt-app/cell.yml +0 -4
  626. package/templates/jwt-app/package.json +0 -36
  627. package/templates/jwt-app/src/context.ts +0 -16
  628. package/templates/jwt-app/src/error-handler.ts +0 -30
  629. package/templates/jwt-app/src/error.ts +0 -4
  630. package/templates/jwt-app/src/home-controller.ts +0 -23
  631. package/templates/jwt-app/src/index.ts +0 -5
  632. package/templates/jwt-app/src/jwt-middleware.ts +0 -36
  633. package/templates/jwt-app/src/module.ts +0 -3
  634. package/templates/jwt-app/test/home-controller.spec.ts +0 -19
  635. package/templates/jwt-app/tsconfig.json +0 -32
  636. package/templates/koa-app/app.js +0 -8
  637. package/templates/koa-app/package.json +0 -9
  638. package/templates/microservice/.github/workflows/deploy.yml +0 -28
  639. package/templates/microservice/.vscode/launch.json +0 -24
  640. package/templates/microservice/README.md +0 -76
  641. package/templates/microservice/examples/backend-app/README.md +0 -76
  642. package/templates/microservice/examples/backend-app/cell-remote.yml +0 -4
  643. package/templates/microservice/examples/backend-app/cell.yml +0 -3
  644. package/templates/microservice/examples/backend-app/package.json +0 -32
  645. package/templates/microservice/examples/backend-app/src/api-controller.ts +0 -31
  646. package/templates/microservice/examples/backend-app/src/module.ts +0 -3
  647. package/templates/microservice/examples/backend-app/tsconfig.json +0 -32
  648. package/templates/microservice/package.json +0 -20
  649. package/templates/microservice/packages/api/README.md +0 -76
  650. package/templates/microservice/packages/api/cell.yml +0 -0
  651. package/templates/microservice/packages/api/package.json +0 -25
  652. package/templates/microservice/packages/api/src/common/api-protocol.ts +0 -10
  653. package/templates/microservice/packages/api/src/common/index.ts +0 -1
  654. package/templates/microservice/packages/api/tsconfig.json +0 -30
  655. package/templates/microservice/packages/serviceA/.vscode/launch.json +0 -23
  656. package/templates/microservice/packages/serviceA/README.md +0 -76
  657. package/templates/microservice/packages/serviceA/cell.yml +0 -6
  658. package/templates/microservice/packages/serviceA/package.json +0 -29
  659. package/templates/microservice/packages/serviceA/src/node/module.ts +0 -3
  660. package/templates/microservice/packages/serviceA/src/node/service-a.ts +0 -9
  661. package/templates/microservice/packages/serviceA/tsconfig.json +0 -30
  662. package/templates/microservice/packages/serviceB/README.md +0 -76
  663. package/templates/microservice/packages/serviceB/cell.yml +0 -5
  664. package/templates/microservice/packages/serviceB/package.json +0 -29
  665. package/templates/microservice/packages/serviceB/src/node/module.ts +0 -3
  666. package/templates/microservice/packages/serviceB/src/node/service-b.ts +0 -9
  667. package/templates/microservice/packages/serviceB/tsconfig.json +0 -30
  668. package/templates/microservice/tsconfig.json +0 -32
  669. package/templates/mycli/.vscode/launch.json +0 -33
  670. package/templates/mycli/bin/mycli +0 -2
  671. package/templates/mycli/bin/mycli-deploy +0 -2
  672. package/templates/mycli/bin/mycli-init +0 -2
  673. package/templates/mycli/package.json +0 -33
  674. package/templates/mycli/src/bootstrap.ts +0 -7
  675. package/templates/mycli/src/constants.ts +0 -1
  676. package/templates/mycli/src/deploy/deploy-manager.ts +0 -12
  677. package/templates/mycli/src/deploy/deploy.ts +0 -16
  678. package/templates/mycli/src/deploy/index.ts +0 -1
  679. package/templates/mycli/src/index.ts +0 -2
  680. package/templates/mycli/src/init/index.ts +0 -1
  681. package/templates/mycli/src/init/init-manager.ts +0 -85
  682. package/templates/mycli/src/init/init.ts +0 -25
  683. package/templates/mycli/src/init/templates.ts +0 -3
  684. package/templates/mycli/src/module.ts +0 -3
  685. package/templates/mycli/src/mycli.ts +0 -13
  686. package/templates/mycli/templates/application-template/README.md +0 -0
  687. package/templates/mycli/tsconfig.json +0 -32
  688. package/templates/nest-app/.eslintrc.js +0 -25
  689. package/templates/nest-app/.prettierrc +0 -4
  690. package/templates/nest-app/README.md +0 -73
  691. package/templates/nest-app/nest-cli.json +0 -8
  692. package/templates/nest-app/package.json +0 -69
  693. package/templates/nest-app/src/app.controller.spec.ts +0 -22
  694. package/templates/nest-app/src/app.controller.ts +0 -12
  695. package/templates/nest-app/src/app.module.ts +0 -10
  696. package/templates/nest-app/src/app.service.ts +0 -8
  697. package/templates/nest-app/src/main.ts +0 -8
  698. package/templates/nest-app/test/app.e2e-spec.ts +0 -24
  699. package/templates/nest-app/test/jest-e2e.json +0 -9
  700. package/templates/nest-app/tsconfig.build.json +0 -12
  701. package/templates/nest-app/tsconfig.json +0 -25
  702. package/templates/nextjs-app/.eslintrc.json +0 -3
  703. package/templates/nextjs-app/README.md +0 -34
  704. package/templates/nextjs-app/next.config.js +0 -6
  705. package/templates/nextjs-app/package.json +0 -20
  706. package/templates/nextjs-app/pages/_app.js +0 -7
  707. package/templates/nextjs-app/pages/api/hello.js +0 -5
  708. package/templates/nextjs-app/pages/index.js +0 -69
  709. package/templates/nextjs-app/public/favicon.ico +0 -0
  710. package/templates/nextjs-app/public/vercel.svg +0 -4
  711. package/templates/nextjs-app/styles/Home.module.css +0 -116
  712. package/templates/nextjs-app/styles/globals.css +0 -16
  713. package/templates/sample-app/.github/workflows/deploy.yml +0 -25
  714. package/templates/sample-app/.vscode/launch.json +0 -23
  715. package/templates/sample-app/README.md +0 -76
  716. package/templates/sample-app/cell.yml +0 -0
  717. package/templates/sample-app/package.json +0 -31
  718. package/templates/sample-app/src/browser/assets/logo.png +0 -0
  719. package/templates/sample-app/src/browser/css-shims.d.ts +0 -30
  720. package/templates/sample-app/src/browser/hello.view.tsx +0 -31
  721. package/templates/sample-app/src/browser/module.ts +0 -3
  722. package/templates/sample-app/src/browser/style/hello.module.scss +0 -4
  723. package/templates/sample-app/src/common/welcome-protocol.ts +0 -5
  724. package/templates/sample-app/src/node/module.ts +0 -3
  725. package/templates/sample-app/src/node/welcome-server.ts +0 -9
  726. package/templates/sample-app/tsconfig.json +0 -32
  727. package/templates/schedule/.github/workflows/deploy.yml +0 -25
  728. package/templates/schedule/.vscode/launch.json +0 -23
  729. package/templates/schedule/README.md +0 -76
  730. package/templates/schedule/cell.yml +0 -1
  731. package/templates/schedule/package.json +0 -29
  732. package/templates/schedule/src/module.ts +0 -3
  733. package/templates/schedule/src/scheduler.ts +0 -10
  734. package/templates/schedule/tsconfig.json +0 -32
  735. package/templates/standalone-app/package.json +0 -17
  736. package/templates/standalone-app/src/app.service.ts +0 -10
  737. package/templates/standalone-app/src/main.ts +0 -14
  738. package/templates/standalone-app/src/module.ts +0 -3
  739. package/templates/standalone-app/tsconfig.json +0 -30
  740. package/templates/vue-app/.github/workflows/deploy.yml +0 -25
  741. package/templates/vue-app/.vscode/launch.json +0 -23
  742. package/templates/vue-app/README.md +0 -76
  743. package/templates/vue-app/cell.yml +0 -0
  744. package/templates/vue-app/package.json +0 -32
  745. package/templates/vue-app/src/browser/App.vue +0 -32
  746. package/templates/vue-app/src/browser/app.ts +0 -7
  747. package/templates/vue-app/src/browser/components/HelloWorld.vue +0 -42
  748. package/templates/vue-app/src/browser/declare.d.ts +0 -7
  749. package/templates/vue-app/src/browser/images/logo.png +0 -0
  750. package/templates/vue-app/src/browser/module.ts +0 -3
  751. package/templates/vue-app/src/browser/router.ts +0 -13
  752. package/templates/vue-app/src/browser/shims-vue.d.ts +0 -5
  753. package/templates/vue-app/src/browser/views/About.vue +0 -5
  754. package/templates/vue-app/src/browser/views/Root.vue +0 -37
  755. package/templates/vue-app/src/common/welcome-protocol.ts +0 -5
  756. package/templates/vue-app/src/node/module.ts +0 -3
  757. package/templates/vue-app/src/node/welcome-server.ts +0 -9
  758. package/templates/vue-app/tsconfig.json +0 -32
package/README.md CHANGED
@@ -1 +1,442 @@
1
- # Cell CLI
1
+ # @celljs/cli
2
+
3
+ Cell 4 的命令行工具 `cell`:读取 `cell.config.ts`,按 preset 构建应用,运行和部署构建产物。设计见仓库的 [docs/design/architecture.md](https://github.com/cellbang/cell/blob/main/docs/design/architecture.md),从 3.x 迁移见 [docs/migration-4.md](https://github.com/cellbang/cell/blob/main/docs/migration-4.md)。
4
+
5
+ 需要 Node.js `^20.19.0 || >=22.12.0`。在项目里安装:
6
+
7
+ ```bash
8
+ npm install -D @celljs/cli
9
+ npx cell build
10
+ ```
11
+
12
+ ## 命令
13
+
14
+ | 命令 | 作用 |
15
+ | --- | --- |
16
+ | `cell init [template] [dir]` | 从模板创建项目(`backend`、`fullstack`),自带 AGENTS.md、cell 技能和 `.mcp.json`;不带参数时列出模板 |
17
+ | `cell dev` | 开发:前后端同一个端口,前端 HMR,后端改文件自动重载,配置变化自动重启 |
18
+ | `cell build` | 构建到 `.cell/output`:`server/index.mjs`(依赖内联的单个文件)、`public/`(前端)、`manifest.json` |
19
+ | `cell info` | 描述项目:preset 及其来源、mode、目标、组件、DI 模块、hooks、产物状态。只读,不构建、不执行 hooks |
20
+ | `cell check` | 一次完成配置、TypeScript 类型、装饰器设置、后端 DI 绑定和模块注册的检查,有错误时退出码 1 |
21
+ | `cell preview` | 按 `manifest.json` 运行构建产物,不重新构建 |
22
+ | `cell deploy` | 用 preset 构建,再交给 preset 的部署器发布;`--dry-run` 只给出计划 |
23
+ | `cell config get <key>` | 某个配置项合并后的值,`--why` 列出设置它的文件和环境变量 |
24
+ | `cell docs <query>` | 检索已安装组件和模块随包的文档(与项目所用版本一致) |
25
+ | `cell mcp` | stdio MCP 服务器,把 `info`、`check`、`config_get`、`docs_search`、`build`、`deploy_plan` 和模块注册的工具提供给 coding agent |
26
+ | `cell agent sync` | 按已安装的版本重写 AGENTS.md 中由 Cell 管理的部分和 `.agents/skills/cell/SKILL.md` |
27
+
28
+
29
+ ## Preset
30
+
31
+ | preset | 产物 | 运行 / 预览 | 部署器 |
32
+ | --- | --- | --- | --- |
33
+ | `node`(默认) | Node.js HTTP 服务:`node .cell/output/server/index.mjs` | `cell preview` 用 Node.js 运行 | 无,产物自行部署 |
34
+ | `cloudflare` | Cloudflare Workers:`server/worker.mjs` + `wrangler.json`,前端作为静态资源 | `cell preview` 用 `wrangler dev` 在本机的 workerd 中运行 | `cloudflare`(Wrangler) |
35
+ | `cli` | Node.js 命令行程序:`node .cell/output/server/index.mjs` 启动应用但不起服务,由组件(如 `ApplicationLifecycle`)完成工作;不需要 `@celljs/express-adapter`,也不报缺少入口 | `cell preview` 用 Node.js 运行,继承当前终端 | 无 |
36
+ | `fc` | 阿里云函数计算 3.0 自定义运行时:产物加 `bootstrap` 启动脚本,前端由服务端从 `public/` 返回 | Node.js 运行 | `fc`(函数计算 API) |
37
+ | `scf` | 腾讯云 SCF Web 函数:产物加 `scf_bootstrap` | Node.js 运行 | `scf`(云函数 API) |
38
+ | `lambda` | AWS Lambda + 函数 URL:产物加 `server/lambda.mjs` 处理器 | Node.js 运行 | `lambda`(AWS API) |
39
+ | `vercel` | Vercel Build Output API:`.vercel/output`,前端在 CDN,服务端是一个函数 | Node.js 运行函数的 bundle,前端取自 `static/` | `vercel`(Vercel CLI) |
40
+
41
+ 每个 preset 的选项写在 `cell.config.ts` 里与 preset 同名的字段(如 `fc: { region: 'cn-shanghai' }`),按 preset 的 schema 校验,未知选项报 `CELL_CONFIG_INVALID`;切换 preset 时其他 preset 的字段保留不报错。
42
+
43
+ ### cloudflare
44
+
45
+ ```bash
46
+ cell build --preset cloudflare # 构建到 .cell/output
47
+ cell preview # wrangler dev,在 workerd(Cloudflare 的运行时)中运行,默认 8787 端口
48
+ cell deploy --preset cloudflare --dry-run # 构建并执行 wrangler deploy --dry-run,输出计划,不上传
49
+ cell deploy --preset cloudflare # 构建并部署,输出 workers.dev 地址
50
+ ```
51
+
52
+ - **运行方式**:Cell 后端(Express)运行在 Workers 的 `node:http` 服务端上(需要 `nodejs_compat`),由 `@celljs/express-adapter` 的 `http` 入口提供,与 `node` preset 相同。前端(`public/`)由 Cloudflare 作为静态资源直接返回,只有不匹配静态文件的请求进入 Worker。产物只支持 ESM,`--format cjs` 报 `CELL_CONFIG_CONFLICT`。
53
+ - **启动时机**:Workers 只允许在模块加载阶段生成代码(`new Function`,Express 的依赖会用到),只允许在处理请求时做 I/O。所以应用的模块在 Worker 启动时加载,`Application.start()` 和 `onStart` 在第一个请求时执行(`ApplicationHost.beforeStart`)。模块加载失败会让 Worker 启动失败,`wrangler dev` / `wrangler deploy` 直接报出。
54
+ - **Cloudflare 的配置写在项目根目录的 `wrangler.jsonc` 或 `wrangler.json`**(可选,按 Cloudflare 文档的写法):`name`、`compatibility_date`、`vars`、KV / D1 / R2 等绑定、`routes` 都在这里。构建时 Cell 以它为基础生成 `.cell/output/wrangler.json`,并设置:`main`(项目里写了会被忽略并警告)、有前端时的 `assets.directory`、`compatibility_flags` 里的 `nodejs_compat`。没有配置文件时,`name` 取自 package.json 的包名(如 `@acme/shop` → `acme-shop`),`compatibility_date` 默认 `2026-03-17`,这也是允许的最早日期(`node:http` 服务端与 `node:tty` 从这天起默认可用)。`wrangler.toml` 不支持,请改写成 `wrangler.jsonc`。
55
+ - **单页应用**:有前端时默认 `assets.not_found_handling: "single-page-application"`:浏览器导航到不存在的路径时由 Cloudflare 返回 `index.html`(与 Node.js 上 `@celljs/serve-static` 的 `spa` 一致),API 等其他请求仍进入 Worker;在 `wrangler.jsonc` 里写了 `not_found_handling` 就以项目为准。Worker 里没有前端文件,`@celljs/serve-static` 发现没有前端目录时直接放行,未知路径得到正常的 404。
56
+ - **自定义域名**:域名的 DNS 托管在 Cloudflare 时,在 `wrangler.jsonc` 里写 `"routes": [{ "pattern": "app.example.com", "custom_domain": true }]`,部署时 Cloudflare 自动创建 DNS 记录和证书,`deployment.url` 报告这个域名。国内网络无法访问 `*.workers.dev`,面向国内访问时要绑定自定义域名。
57
+ - **应用配置**:`vars` 和 secrets(`wrangler secret put`)进入 `process.env`,所以 `cell.yml` 里的 `${env.X}` 和 `CELL_BACKEND__*` 变量照常生效。
58
+ - **Wrangler**:不是 Cell 的依赖。项目装了 `wrangler` 就用项目的,否则由 `npx --yes wrangler@4` 在第一次使用时安装(npm 缓存)。凭据由 Wrangler 管理:设置 `CLOUDFLARE_API_TOKEN`(必要时加 `CLOUDFLARE_ACCOUNT_ID`),或执行一次 `npx wrangler login`。也可以不用 `cell deploy`,直接执行 `npx wrangler deploy --config .cell/output/wrangler.json`。
59
+ - **Workers Builds**(Cloudflare 的 CI,设置 `WORKERS_CI=1`)里自动选用 `cloudflare` preset:构建命令 `npx cell build`,部署命令 `npx cell deploy --skip-build`。
60
+ - `wrangler dev` 会在项目根目录创建 `.wrangler/`,请加入 `.gitignore`。
61
+
62
+ ### fc、scf、lambda
63
+
64
+ 三个函数平台的做法相同:Cell 服务端原样运行,产物目录整体打成 zip 作为函数代码;部署器直接调用云 API(请求签名自己实现:阿里云 ACS3、腾讯云 TC3、AWS SigV4),不需要云 SDK 或云厂商 CLI。函数名默认取包名(`@acme/shop` → `shop`),可用 `name` 指定;`env` 写入函数的环境变量(另带 `NODE_ENV=production`),`cell.yml` 里的 `${env.X}` 和 `CELL_BACKEND__*` 照常生效。
65
+
66
+ | preset | 运行方式 | 选项 | 凭据(环境变量) | 部署结果 |
67
+ | --- | --- | --- | --- | --- |
68
+ | `fc` | `custom.debian10` 运行时,`bootstrap` 用镜像自带的 Node.js 20(`node: '18'` 可选)在 9000 端口(`FC_SERVER_PORT`)启动服务 | `name`、`region`(默认 `ALIBABA_CLOUD_REGION_ID` 或 `cn-hangzhou`)、`node`、`memory`(MB,默认 1024)、`cpu`(默认按内存 2 GB/核)、`timeout`(默认 60)、`concurrency`(单实例并发,默认 20)、`env` | `ALIBABA_CLOUD_ACCESS_KEY_ID`、`ALIBABA_CLOUD_ACCESS_KEY_SECRET`(可选 `ALIBABA_CLOUD_SECURITY_TOKEN`) | 创建或更新函数,没有时创建匿名 HTTP 触发器 `http`(已有的触发器不改),返回 `fcapp.run` 地址 |
69
+ | `scf` | Web 函数(`Type: HTTP`),`scf_bootstrap` 用运行时的 Node.js 18(`runtime: 'Nodejs16.13'` 可选)在 9000 端口启动服务;只有 `/tmp` 可写 | `name`、`region`(默认 `TENCENTCLOUD_REGION` 或 `ap-guangzhou`)、`namespace`(默认 `default`)、`runtime`、`memory`(默认 512)、`timeout`(默认 60)、`env` | `TENCENTCLOUD_SECRET_ID`、`TENCENTCLOUD_SECRET_KEY`(可选 `TENCENTCLOUD_SESSION_TOKEN`) | 创建或更新函数(先代码后配置,等待状态变为 Active),没有时创建公网、免鉴权的函数 URL |
70
+ | `lambda` | `nodejs22.x`,初始化阶段在回环端口启动服务,`server/lambda.handler` 把函数 URL / HTTP API(payload 2.0)事件转成请求,响应以 base64 返回,多个 Cookie 放在 `cookies` | `name`、`region`(默认 `AWS_REGION` 或 `us-east-1`)、`runtime`、`architecture`(`x86_64` / `arm64`)、`memory`(默认 1024)、`timeout`(默认 30)、`role`、`env` | `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`(可选 `AWS_SESSION_TOKEN`),或 `~/.aws/credentials` 的 `AWS_PROFILE` / default | 没有 `role` 时创建或复用执行角色 `cell-lambda-execution`(只有日志权限);创建或更新函数;没有时创建 `AuthType: NONE` 的函数 URL 及其两项公开调用权限 |
71
+
72
+ - 代码包直接随请求上传,上限:FC 100 MB、SCF 20 MB、Lambda 50 MB(zip 后),超出报 `CELL_DEPLOY_PACKAGE_TOO_LARGE`。体积大多来自 `build.external` 留在 `server/node_modules` 的包。
73
+ - 没有凭据时 `--dry-run` 照样给出计划(动作为 `deploy`,并警告不知道函数是否已存在);有凭据时查询云端,动作是 `create` 或 `update`。实际部署缺凭据报 `CELL_DEPLOY_CREDENTIALS_MISSING`,云 API 的错误报 `CELL_DEPLOY_API_ERROR` / `CELL_DEPLOY_UNAUTHORIZED`,消息里带云厂商的错误码和请求 ID。
74
+ - 函数计算的默认域名 `fcapp.run` 会让浏览器下载 HTML 页面,网页应用请绑定自定义域名;API 不受影响。
75
+ - 镜像里的 Node.js 较旧(FC 20.10、SCF 18.15):服务端 bundle 自带 `import.meta.dirname` / `filename` 的补丁。
76
+
77
+ ### vercel
78
+
79
+ ```bash
80
+ cell build --preset vercel # .vercel/output(Build Output API v3)
81
+ cell preview # Node.js 运行函数的 bundle,前端取自 .vercel/output/static
82
+ cell deploy --preset vercel # vercel deploy --prebuilt,不在 Vercel 上再构建
83
+ ```
84
+
85
+ - 前端放在 `static/` 由 Vercel CDN 返回(`/assets/*` 带一年的 immutable 缓存头);其他请求进入函数 `functions/index.func`(`nodejs22.x`),函数里的 Cell 服务端处理 API,并用其中的 `public/index.html` 做单页回退。`vercel build` 留在 `.vercel/output` 的文件在构建时清除。
86
+ - 选项:`project`(默认取包名)、`scope`(团队)、`environment`(`production` 默认 / `preview`)、`runtime`、`memory`、`maxDuration`、`regions`(逗号分隔)。输出目录固定 `.vercel/output`(`--out-dir` 到别处时部署报 `CELL_DEPLOY_OUTPUT_MISMATCH`);不接受 `--single` / `--compile`。
87
+ - Vercel CLI 不是依赖:项目装了就用项目的,否则 `npx --yes vercel@65`。凭据:`VERCEL_TOKEN`,或执行一次 `npx vercel login`;项目不存在时自动创建(`--create-if-missing`)。
88
+ - Vercel 的构建环境(`VERCEL=1`)里自动选用 `vercel` preset。`.vercel/` 请加入 `.gitignore`。
89
+
90
+ ### cell dev
91
+
92
+ | 选项 | 说明 |
93
+ | --- | --- |
94
+ | `--preset <name>` | 用哪个 preset 的入口运行后端,默认 `node` |
95
+ | `-m, --mode <mode>` | 额外的 mode,可重复;`development` 总是自动加上 |
96
+ | `-p, --port <port>` | 端口,默认取 `cell.server.port`(考虑 `CELL_BACKEND__SERVER__PORT`),否则 3000;`0` 表示随机端口 |
97
+ | `--host <host>` | 监听地址,默认取 `cell.server.host`,否则 `127.0.0.1` |
98
+
99
+ - 一个端口:Vite 提供前端页面和模块(HMR),`/favicon.ico` 与组件的 `assets` 和构建产物里的位置一致,其余请求交给后端。
100
+ - 后端不打包,在 Vite 的 server 环境里由 module runner 加载:Cell 包和项目源码经过 Cell 插件(生成的 DI 容器与配置写到 `.cell/generated/`),其他依赖由 Node 直接加载。入口通过 `ApplicationHost`(`@celljs/core`)把请求处理函数交给 `cell dev`,不自己监听端口。
101
+ - 后端用到的文件变化时:先停止旧应用(触发 `onStop`),再从新的模块重新启动,并触发 `dev:reload`。启动失败时请求返回 500 和 `CellError`(`CELL_DEV_BACKEND_FAILED`),保存后自动重试。
102
+ - 项目或组件的 `cell*.yml`、`package.json`、`cell.config.*` 变化时:重新解析工具链并在同一端口重启,再次触发 `dev:ready`。配置写错时报错并等待下一次修改。
103
+ - 源码里的 `require()` 和项目内的 CommonJS 文件(如生成的 prisma client)照常可用。
104
+ - `POST /_cell/mcp`:运行中应用的 MCP 端点(Streamable HTTP,JSON 响应),工具有 `get_errors`(后端启动错误、失败的重载、5xx 请求、错误日志)、`list_routes`、`list_bindings`、`get_config`(`${...}` 已求值)、`recent_requests`、`logs`。只接受本机来源(无 `Origin` 或回环地址),其他来源返回 403。
105
+ - `--json`:就绪时 stdout 输出一行结果(`url`、`port`、`mode`、`targets`、`mcp`,后端启动失败时带 `backendError`),之后应用和 Vite 的输出都走 stderr。收到 SIGINT / SIGTERM 时停止应用并以 0 退出。
106
+ - React Fast Refresh 等框架插件由组件的 toolchain 模块提供(模块宿主完成后);在那之前前端修改会整页刷新,CSS 热替换。
107
+
108
+ ### cell build
109
+
110
+ | 选项 | 说明 |
111
+ | --- | --- |
112
+ | `--preset <name>` | 产物形态:`node`(默认)、`cloudflare`、`cli`、`fc`、`scf`、`lambda`、`vercel` |
113
+ | `-m, --mode <mode>` | 额外的 mode,读取 `cell.<mode>.yml`,可重复;`production` 总是自动加上 |
114
+ | `--format <esm\|cjs>` | 服务端产物格式,默认取 preset(`node` 为 `esm`) |
115
+ | `--single` | 前端内嵌进 `server/index.mjs`:一个文件运行整个应用(见下) |
116
+ | `--compile [bun\|node\|deno]` | 编译成一个可执行文件 `.cell/output/app`,默认 bun(见下) |
117
+ | `--compile-target <target>` | 交叉编译,交给 bun(如 `bun-linux-x64`)或 deno(如 `x86_64-unknown-linux-gnu`) |
118
+ | `--sourcemap` | 生成 source map |
119
+ | `--out-dir <dir>` | 输出目录,默认 `.cell/output` |
120
+
121
+ **单文件(`--single`)**:先构建前端,再把 `public/` 的全部文件(页面、脚本、favicon、组件的 assets)以 base64 写进服务端 bundle,启动时注册到 `Symbol.for('@celljs/serve-static/assets')`,`@celljs/serve-static` 从内存返回它们(Content-Type、ETag / 304、Cache-Control 与从磁盘时一致,单页应用回退到 `index.html`)。产物只有 `server/index.mjs` 和 `manifest.json`(`single: true`,没有 `public`),把这一个文件拷到任意目录用 `node index.mjs` 即可运行。项目只有后端时与不加 `--single` 相同(会提示);`build.external` 等留在 `server/node_modules` 的包仍要放在它旁边。也可在 `cell.config.ts` 写 `build: { single: true }`。
122
+
123
+ **可执行文件(`--compile`)**:在单文件 bundle 的基础上编译成 `.cell/output/app`(Windows 目标为 `app.exe`),拷到没有 Node.js 和 node_modules 的机器也能运行;`manifest.json` 记录 `executable`,`cell preview` 直接运行它。
124
+
125
+ | 工具 | 做法 | 需要 |
126
+ | --- | --- | --- |
127
+ | `bun`(默认) | `bun build --compile` | 本机装有 Bun |
128
+ | `deno` | `deno compile --allow-all` | 本机装有 Deno |
129
+ | `node` | Node.js 单可执行应用(SEA):CommonJS bundle 生成 blob,用 `npx postject` 注入 node 的副本,macOS 上重新签名 | 产物格式自动为 `cjs`;第一次使用时 npx 下载 postject;不能交叉编译 |
130
+
131
+ 留在 bundle 外的包(`build.external`、组件的 `optionalDependencies`,通常是原生模块)无法放进可执行文件,报 `CELL_COMPILE_EXTERNALS` 并列出它们。`cloudflare`、`vercel` preset 的前端由平台托管,不接受 `--single` / `--compile`。
132
+
133
+ ### cell info
134
+
135
+ 接受与 `cell build` 相同的 `--preset`、`-m`、`--format`、`--out-dir` 等选项,描述同样参数下 `cell build` 会用到的内容;另有:
136
+
137
+ | 选项 | 说明 |
138
+ | --- | --- |
139
+ | `--app-config` | 同时输出每个目标合并后的应用配置(`cell.yml`);后端的 `${...}` 保持原样,运行时才求值 |
140
+
141
+ 只读取 package.json、`cell*.yml`、`cell.config.ts` 和 `manifest.json`,不运行项目代码,不执行 `hooks`。`--json` 结果的主要字段:
142
+
143
+ | 字段 | 内容 |
144
+ | --- | --- |
145
+ | `name`、`version`、`cellVersion`、`configFile` | 项目、CLI 版本、`cell.config` 文件(相对根目录) |
146
+ | `preset` | `name`、`source`(`flag` / `config` / `env` / `ci` / `default`)、`entry`、`format`、`runtime`(`workerd` 表示 Cloudflare Workers)、`deployer`、`available` |
147
+ | `mode`、`targets`、`targetSources` | 生效的 mode;构建目标及其来由(`cell.config.ts`、`default` 或声明它的组件) |
148
+ | `build` | 生效的 `format`、`outDir`、`external`、`sourcemap`、`single`、`compile` |
149
+ | `components` | 按加载顺序;`dir`、`configFiles` 相对根目录,`targets` / `entries` / `toolchain` / `optionalDependencies` 只在组件声明时出现 |
150
+ | `frontend`、`backend` | `entry`、提供入口的 `entryComponent`、`staticModules` / `modules`(DI 模块,按加载顺序)、`config`(仅 `--app-config`) |
151
+ | `hooks`、`modules`、`moduleOptions` | `cell.config.ts` 里的 hooks、`modules` 条目、toolchain 模块选项的键 |
152
+ | `output` | `dir`、`built`,构建过时还有 manifest 里的 `preset`、`format`、`targets`、`server`、`public` |
153
+ | `frontend.envOverrides`、`backend.envOverrides` | 当前环境里的 `CELL_FRONTEND__*` / `CELL_BACKEND__*` 变量:`applied`(变量 → 配置路径)和 `problems`(找不到键或类型不符)。没有这类变量时不出现,不输出值 |
154
+
155
+ `warnings` 会提前指出不起作用或会让 `cell build` 失败的设置:没有组件提供 preset 的入口、`-m` 指定的 mode 没有任何 `cell.<mode>.yml`(附拼写建议)、使用了尚未提供的 `single` / `compile`、不生效的 `CELL_FRONTEND__*` / `CELL_BACKEND__*` 变量。
156
+
157
+ ### cell check
158
+
159
+ | 选项 | 说明 |
160
+ | --- | --- |
161
+ | `--preset <name>`、`-m, --mode <mode>` | 同 `cell build` |
162
+ | `--skip <check>` | 跳过某项检查,可重复;未知名字报 `CELL_ARGUMENT_INVALID` 并列出可用的检查 |
163
+
164
+ | 检查 | 内容 |
165
+ | --- | --- |
166
+ | `config` | 与 `cell info` 的 warnings 相同:缺少入口(`CELL_ENTRY_MISSING`)、无效 mode(`CELL_MODE_UNKNOWN`)、不生效或被遮住的环境变量(`CELL_ENV_OVERRIDE_IGNORED` / `CELL_ENV_OVERRIDE_SHADOWS`)、不可用的 `single` / `compile` |
167
+ | `types` | 用项目的 TypeScript 执行 `tsc --noEmit -p tsconfig.json`,每条诊断带文件、行列和 `TSxxxx` 码;没有 tsconfig.json 或 typescript 时跳过 |
168
+ | `decorators` | tsconfig 要开启 `experimentalDecorators` 和 `emitDecoratorMetadata`(`CELL_TSCONFIG_DECORATORS`),与构建时的装饰器语义一致 |
169
+ | `di` | 用 `cell dev` 的方式加载后端 DI 容器(不启动应用),逐个解析绑定:`CELL_DI_NO_BINDING`、`CELL_DI_AMBIGUOUS`、`CELL_DI_CIRCULAR`、`CELL_DI_MISSING_INJECT` 为错误,带修复建议;只能在注入点或请求中创建的绑定记为 info |
170
+ | 模块注册的检查 | toolchain 模块用 `addCheck` 注册,名字如 `typeorm:entities` |
171
+
172
+ `--json` 结果:`passed`、`summary`(errors / warnings / info 计数)、`issues`(每条带 `check`、`level`、`code`、`message`,可能有 `file`、`line`、`column`、`hint`)、`checks`(每项的耗时、问题数、跳过原因)。不加 `--json` 时按编译器格式输出 `src/a.ts:3:5 error TS2322 …`,info 不显示。
173
+
174
+ ### cell init
175
+
176
+ ```bash
177
+ npx @celljs/cli init backend my-app # 或 fullstack:React 前端 + 后端,经 RPC 调用
178
+ cd my-app && npm install && npx cell agent sync && npx cell dev
179
+ ```
180
+
181
+ | 选项 | 说明 |
182
+ | --- | --- |
183
+ | `--name <name>` | 包名,默认取目录名(转成小写、去掉空格) |
184
+ | `--force` | 允许写入非空目录(同名文件被覆盖) |
185
+
186
+ 从不提问;目录非空时报 `CELL_INIT_NOT_EMPTY`,模板不存在时报 `CELL_TEMPLATE_NOT_FOUND`(带拼写建议)。项目依赖 `@celljs/*` 的 `^<cli 版本>`,测试用 `bun test` + `createTestApp()`。为 coding agent 生成:`AGENTS.md`(Cell 指南,与版本匹配)、`.agents/skills/cell/SKILL.md`、`CLAUDE.md`(`@AGENTS.md`)、`.mcp.json`(`npx cell mcp`)。
187
+
188
+ ### cell agent sync
189
+
190
+ 把 `@celljs/cli` 自带的 Cell 指南和已安装组件、toolchain 模块(`addDocs` 目录)的 `AGENTS.md` 片段写进 `AGENTS.md` 的 `<!-- cell:begin -->` … `<!-- cell:end -->` 之间(其余内容保持不变;没有标记时追加到末尾),并重写 `.agents/skills/cell/SKILL.md`。升级 Cell 或增减组件后执行一次。
191
+
192
+ ### cell config get
193
+
194
+ ```bash
195
+ cell config get cell.server.port --why
196
+ # cell.server.port (backend) = 8080
197
+ # node_modules/@celljs/web/cell.yml: 3000
198
+ # cell.yml [backend]: 8080
199
+ ```
200
+
201
+ | 选项 | 说明 |
202
+ | --- | --- |
203
+ | `-m, --mode <mode>` | 额外的 mode,可重复 |
204
+ | `--target <target>` | `backend` 或 `frontend`,默认有后端时取 `backend` |
205
+ | `--why` | 列出设置该值的文件(按合并顺序:所有文件的公共部分在前,目标段 `backend:` / `frontend:` 在后,后者覆盖前者)和环境变量 |
206
+
207
+ 键可写 `a.b.c`、`items[0].name`。`--json` 结果有 `value`、`layers`(`file`、`component`、`section`、`value`)、`env`(设置了该键或其上下级的 `CELL_<TARGET>__*` 变量)、`expressions`(后端值含 `${...}`,服务端启动时求值)。键不存在时报 `CELL_CONFIG_KEY_NOT_FOUND`,带最接近的键。
208
+
209
+ ### cell docs
210
+
211
+ `cell docs <query> [--limit n]`:在各组件的 `README.md`、`docs/` 和模块 `addDocs()` 的目录里按标题分段检索,返回最匹配的段落和 `file:line`。
212
+
213
+ ### cell mcp
214
+
215
+ 在 stdio 上运行 MCP 服务器(每行一条 JSON-RPC 消息),直到 stdin 关闭。工具都对应同名命令的 `--json` 结果:
216
+
217
+ | 工具 | 对应命令 | 副作用 |
218
+ | --- | --- | --- |
219
+ | `info` | `cell info` | 只读 |
220
+ | `check` | `cell check` | 只读 |
221
+ | `config_get` | `cell config get` | 只读 |
222
+ | `docs_search` | `cell docs` | 只读 |
223
+ | `build` | `cell build` | 写输出目录 |
224
+ | `deploy_plan` | `cell deploy --dry-run` | 写输出目录,部署器可能联网;不部署 |
225
+
226
+ 不提供部署工具:实际部署由人执行 `cell deploy`。
227
+
228
+ 之后是 toolchain 模块用 `addMcpTool` 注册的工具(与内置工具重名的会被忽略并警告);`cell.config.*`、package.json 或模块文件变化后自动重新加载。每个工具标注 `readOnlyHint` / `openWorldHint`;参数按 `inputSchema` 校验,失败时返回 `isError` 和 `CellError`。stdout 只有协议消息,模块和 hooks 的输出都走 stderr。
229
+
230
+ 在 agent 中配置(项目根目录下运行):
231
+
232
+ ```jsonc
233
+ // Claude Code / Cursor / CodeBuddy:.mcp.json 或 .cursor/mcp.json
234
+ { "mcpServers": { "cell": { "command": "npx", "args": ["cell", "mcp"] } } }
235
+ ```
236
+
237
+ ```toml
238
+ # Codex:~/.codex/config.toml
239
+ [mcp_servers.cell]
240
+ command = "npx"
241
+ args = ["cell", "mcp"]
242
+ ```
243
+
244
+ `cell dev` 运行时,另外把 `http://127.0.0.1:<port>/_cell/mcp` 配成 HTTP 类型的 MCP 服务器即可查看运行中的应用。
245
+
246
+ ### cell preview
247
+
248
+ | 选项 | 说明 |
249
+ | --- | --- |
250
+ | `-p, --port <port>` | 监听端口,默认取 `cell.server.port`(3000);等同于设置 `CELL_BACKEND__SERVER__PORT`。`cloudflare` 产物传给 `wrangler dev --port`,默认 8787 |
251
+ | `--out-dir <dir>` | 产物目录,默认 `.cell/output` |
252
+
253
+ 产物由哪个 preset 构建,就按它的方式运行:`node`、`cli`、`fc`、`scf`、`lambda` 用 Node.js 运行 `server/index.mjs`(标准输入输出继承当前终端),`cloudflare` 用 `wrangler dev`,`vercel` 用 Node.js 运行函数里的 bundle 并从 `static/` 返回前端。
254
+
255
+ ### cell deploy
256
+
257
+ | 选项 | 说明 |
258
+ | --- | --- |
259
+ | `--preset <name>` | 部署到哪个平台:`cloudflare`、`fc`、`scf`、`lambda`、`vercel`;`node`、`cli` 没有部署器,报 `CELL_DEPLOY_UNSUPPORTED`(构建之前就检查) |
260
+ | `--dry-run` | 构建并计划,不上传(`cloudflare`:`wrangler deploy --dry-run`;`fc` / `scf` / `lambda`:打包并查询函数是否存在;`vercel`:列出函数和静态文件) |
261
+ | `--skip-build` | 部署 `--out-dir` 里已有的产物;产物的 preset 与 `--preset` 不一致时报 `CELL_DEPLOY_OUTPUT_MISMATCH` |
262
+ | `-m, --mode <mode>`、`--sourcemap`、`--out-dir <dir>` | 同 `cell build` |
263
+
264
+ 先 `plan` 后 `apply`:计划列出要部署的资源(`resources`,每项有 `type`、`name`、`action`、`details`),`--dry-run` 到此为止。依次触发 `deploy:before`(闸门,hooks 里的命令失败会取消部署)、`deploy:plan`、`deploy:done` 事件。部署工具(Wrangler、Vercel CLI)的输出在 `--json` 时走 stderr。`--json` 结果:`preset`、`deployer`、`dryRun`、`plan`,实际部署时还有 `deployment`(`url`,以及 `details.versionId`)。
265
+
266
+ ### 通用选项
267
+
268
+ | 选项 | 说明 |
269
+ | --- | --- |
270
+ | `--root <dir>` | 项目根目录,默认当前目录 |
271
+ | `--json` | stdout 只输出一行 JSON 结果,其余输出(进度、hook 命令的输出)走 stderr |
272
+ | `-h, --help` / `-v, --version` | 帮助 / 版本 |
273
+
274
+ 命令从不交互提问。退出码:成功 0,执行失败 1,用法错误(未知命令、选项、取值)2。
275
+
276
+ ## --json 输出
277
+
278
+ ```json
279
+ {"schemaVersion":1,"command":"build","ok":true,"root":"/app","preset":"node","format":"esm","mode":["production"],"targets":["backend"],"outDir":".cell/output","entry":"@celljs/express-adapter/lib/node/http-application-entry","durationMs":480,"warnings":[]}
280
+ ```
281
+
282
+ 失败时:
283
+
284
+ ```json
285
+ {"schemaVersion":1,"command":"build","ok":false,"error":{"code":"CELL_PRESET_NOT_FOUND","message":"Unknown preset 'nod'. Available: node.","hint":"Did you mean 'node'?","docs":"https://cell.cellbang.com/errors/cell-preset-not-found"},"warnings":[]}
286
+ ```
287
+
288
+ `schemaVersion` 不变时,字段只增不改。
289
+
290
+ ## cell.config.ts
291
+
292
+ 可选。只放工具链配置;应用配置(`@Value` 读取的内容)写在 `cell.yml`。
293
+
294
+ ```ts
295
+ import { defineConfig } from '@celljs/cli';
296
+
297
+ export default defineConfig({
298
+ preset: 'node',
299
+ targets: ['frontend', 'backend'],
300
+ modules: ['!@celljs/serve-static', { source: '@x/ui', runtime: false }],
301
+ build: { format: 'esm', external: ['sharp'], sourcemap: false, outDir: '.cell/output' },
302
+ vite: {},
303
+ hooks: { 'build:before': 'prisma generate' },
304
+ });
305
+ ```
306
+
307
+ | 字段 | 说明 |
308
+ | --- | --- |
309
+ | `preset` | 产物形态。优先级:`--preset` → 本字段 → `CELL_PRESET` → CI 环境识别 → `node` |
310
+ | `targets` | 构建目标。默认 `backend` 加上组件声明的目标(装了 `@celljs/react` / `@celljs/vue` 会加上 `frontend`);写了就完全以它为准 |
311
+ | `modules` | `'!包名'` 去掉一个组件(连同只经由它引入的依赖);`{ source, runtime: false }` 去掉它的 DI 模块、保留配置;`{ source, toolchain: false }` 去掉它的 toolchain 模块;本地路径或包名表示额外加载的 toolchain 模块(见下文) |
312
+ | `build.format` | `esm` 或 `cjs` |
313
+ | `build.external` | 不内联的包,按依赖关系拷到 `server/node_modules` |
314
+ | `build.sourcemap`、`build.outDir` | 同命令行选项 |
315
+ | `build.single`、`build.compile` | 单文件全栈 / 可执行文件,尚未提供(`CELL_UNSUPPORTED`) |
316
+ | `vite` | 合并进每个环境的 Vite 配置 |
317
+ | `hooks` | 在工具链事件上执行的 shell 命令,见下文 |
318
+
319
+ 其他顶层字段是 toolchain 模块的选项,值必须是对象。文件支持 `.ts/.mts/.cts/.js/.mjs/.cjs`,同时存在多个报 `CELL_CONFIG_AMBIGUOUS`。命令行参数优先于配置文件。
320
+
321
+ ## 用环境变量覆盖配置
322
+
323
+ `cell.yml` 里已有的任意键都可以用环境变量覆盖,不用改文件:
324
+
325
+ ```bash
326
+ CELL_BACKEND__SERVER__PORT=8080 cell preview # 服务端启动时应用:cell.server.port
327
+ CELL_FRONTEND__API_BASE=/api cell build # 构建前端时应用:cell.apiBase
328
+ ```
329
+
330
+ `__` 分隔层级,第一段先在顶层找、再到 `cell` 下找(`CELL__…` 总是指 `cell`),一个键只能由一个变量设置,不区分大小写并忽略 `_`、`-`;值按原值类型转换(JSON 写法的有限数、`true` / `false`、对象和数组用 JSON,原值为 `null` 时是 JSON 就按 JSON),整体是一个 `${...}` 的值保留到求值时再定类型(如 `CELL_BACKEND__SERVER__PORT='${env.PORT}'`),在 `${...}` 求值之前生效。只能覆盖已存在的键,找不到键或类型不符的变量不生效并给出警告:服务端在启动时打印,`cell build` 检查 `CELL_FRONTEND__*`,`cell info` 两种都检查。完整规则见[迁移指南 5.3](https://github.com/cellbang/cell/blob/main/docs/migration-4.md#53-用环境变量覆盖配置项)。
331
+
332
+ ## hooks
333
+
334
+ ```ts
335
+ hooks: {
336
+ 'build:before': 'prisma generate',
337
+ 'output:done': 'cp extra/* "$CELL_OUT_DIR/server/"',
338
+ }
339
+ ```
340
+
341
+ - 命令经 shell 在项目根目录执行,不读标准输入。PATH 最前面是项目及上级目录的 `node_modules/.bin`。
342
+ - 环境变量:`CELL_EVENT`、`CELL_PRESET`、`CELL_MODE`(逗号分隔)、`CELL_OUT_DIR`(输出目录的绝对路径)。
343
+ - `cell dev` 触发 `modules:done` → `config:resolved` → `dev:ready`,后端重载时 `dev:reload`,重启时 `close` 后重新来一遍。
344
+ - `cell build` 依次触发:`modules:done` → `config:resolved` → `build:before` → 构建 → `output:done` → `close`。
345
+ - `build:before` 是闸门事件:命令非零退出即取消构建(`CELL_BUILD_CANCELLED`)。其他事件里非零退出报 `CELL_HOOK_FAILED`。
346
+ - 只接受命令字符串。需要写代码或修改事件对象(`build:done`、`deploy:plan`)的扩展写成 toolchain 模块。
347
+
348
+ ## toolchain 模块
349
+
350
+ 需要写代码的扩展写成 toolchain 模块:默认导出一个工厂函数,拿到 `cell` 后注册能力(设计见 [docs/design/modules.md](https://github.com/cellbang/cell/blob/main/docs/design/modules.md))。
351
+
352
+ ```ts
353
+ // modules/audit.ts,在 cell.config.ts 里写 modules: ['./modules/audit'], audit: { url: '...' }
354
+ import type { CellAPI } from '@celljs/kit';
355
+
356
+ export default function (cell: CellAPI) {
357
+ const { url } = cell.options('audit', { url: 'http://localhost:9000' });
358
+ cell.addVitePlugin({ name: 'audit', transform: code => code }, { env: 'server' });
359
+ cell.on('build:done', event => {
360
+ event.files['audit.json'] = JSON.stringify({ url, targets: event.project.targets });
361
+ });
362
+ }
363
+ ```
364
+
365
+ - 加载顺序固定:依赖里的组件(package.json 的 `cell.toolchain`,按依赖顺序)→ `cell.config.ts` 的 `modules`(本地路径或包名,按书写顺序)。`{ source, toolchain: false }` 关掉某个组件的模块,`'!包名'` 连组件一起去掉。
366
+ - 工厂只做注册,不启动进程、端口、监听或定时器:`cell info` 也会执行工厂。
367
+ - `cell.config.ts` 里除 `preset`、`targets`、`modules`、`build`、`vite`、`hooks` 之外的顶层字段都是模块选项,必须由某个模块用 `options()` 或 `addConfigSchema()` 认领,否则报 `CELL_CONFIG_UNKNOWN_OPTION`(附拼写建议);`addConfigSchema` 接受 Standard Schema(zod、valibot 等),不合法报 `CELL_CONFIG_INVALID`。
368
+ - 工厂抛错报 `CELL_MODULE_ERROR`(带模块名);默认导出不是函数报 `CELL_MODULE_INVALID`。`cell dev` 中通知类事件的处理函数出错只报告不中断,`cell build` 中任何处理函数出错都失败。
369
+ - 每个模块注册了什么都列在 `cell info --json` 的 `toolchainModules` 里。
370
+
371
+ | API | 作用 |
372
+ | --- | --- |
373
+ | `command`、`mode`、`dev`、`ci`、`root`、`preset`、`components`、`logger` | 只读信息;`preset` 是命令行 / 配置 / 环境变量里写的名字,解析后的 preset 在 `config:resolved` 事件里 |
374
+ | `options(key, defaults)`、`addConfigSchema(key, schema)` | 读并认领 `cell.config.ts` 的 `key` 字段(只能在工厂里同步调用) |
375
+ | `updateConfig({ build: { external }, vite })` | 追加 external、在项目的 `vite` 之下合并 Vite 配置(项目优先);应用配置仍写在组件自己的 `cell.yml` |
376
+ | `addVitePlugin(plugin, { env })` | 加 Vite 插件,`env` 为 `client` / `server` 时只作用于前端 / 后端 |
377
+ | `addRuntimeModule(path, { target, static })`、`addVirtualModule(id, code)`、`setEntry(target, path)` | 追加 DI 模块、提供虚拟模块、指定入口 |
378
+ | `addDevHandler(path, handler)`、`addWatchFile(path)` | `cell dev` 中在后端之前处理某个路径;文件变化时重启 |
379
+ | `addPreset(preset)`、`addOutputFile(path, content)` | 注册 preset(参与 `--preset` 和 CI 识别);构建后写入输出目录的文件(`build:done` 的 `event.files` 可增删改) |
380
+ | `addCheck(def)`、`addMcpTool(def)`、`addDocs(dir)` | 供 `cell check`、`cell mcp`、`cell docs` 使用 |
381
+ | `on(event, handler)`、`events` | 订阅工具链事件(组合规则见 modules.md §3.2);模块之间的事件总线 |
382
+ | `exec(cmd, args, opts)`、`resolve(spec)` | 不经 shell 执行命令;从项目根目录解析模块 |
383
+
384
+ ## 错误码
385
+
386
+ 所有失败都以 `CellError { code, message, file?, line?, hint, docs }` 输出,`code` 在 4.x 内保持稳定。
387
+
388
+ | 错误码 | 含义 |
389
+ | --- | --- |
390
+ | `CELL_ARGUMENT_INVALID` | 未知命令、选项或取值(退出码 2) |
391
+ | `CELL_PROJECT_NOT_FOUND`、`CELL_PACKAGE_JSON_INVALID` | 根目录没有 package.json、某个 package.json 无法读取 |
392
+ | `CELL_CONFIG_LOAD`、`CELL_CONFIG_AMBIGUOUS` | `cell.config.ts` 加载或执行失败、存在多个配置文件 |
393
+ | `CELL_CONFIG_INVALID`、`CELL_CONFIG_CONFLICT` | 配置字段错误(带字段路径和拼写建议)、选项互相冲突 |
394
+ | `CELL_CONFIG_PARSE`、`CELL_CONFIG_NOT_OBJECT`、`CELL_CONFIG_EXPRESSION` | `cell.yml` 不是合法 YAML、顶层不是映射、`${...}` 表达式错误 |
395
+ | `CELL_COMPONENT_NOT_FOUND`、`CELL_LOCAL_MODULE_NOT_FOUND` | `modules` 里写的组件或本地模块不存在 |
396
+ | `CELL_MODULE_NOT_FOUND`、`CELL_CORE_NOT_FOUND` | 组件声明的 DI 模块无法解析、项目没有依赖 `@celljs/core` |
397
+ | `CELL_PRESET_NOT_FOUND`、`CELL_PRESET_DUPLICATE`、`CELL_PRESET_CYCLE` | preset 不存在、重名、`extends` 成环 |
398
+ | `CELL_BUILD_FAILED` | 打包失败,带出错文件和位置 |
399
+ | `CELL_BUILD_CANCELLED`、`CELL_HOOK_FAILED` | hook 或模块取消了构建、hook 命令失败 |
400
+ | `CELL_MODULE_ERROR`、`CELL_MODULE_INVALID` | toolchain 模块的工厂或处理函数出错、默认导出不是工厂函数 |
401
+ | `CELL_CHECK_FAILED`、`CELL_DI_MODULE_FAILED` | 某项检查自身出错、`cell check` 加载后端 DI 模块失败 |
402
+ | `CELL_CONFIG_UNKNOWN_OPTION` | `cell.config.ts` 有没有模块认领的选项字段 |
403
+ | `CELL_DEV_FAILED`、`CELL_DEV_BACKEND_FAILED`、`CELL_DEV_START_TIMEOUT` | `cell dev` 无法启动(端口等)、后端启动失败、后端入口超时未就绪 |
404
+ | `CELL_DEV_BACKEND_NOT_RUNNING` | dev MCP 工具需要运行中的后端,但后端启动失败或尚未启动 |
405
+ | `CELL_CONFIG_KEY_NOT_FOUND` | `cell config get` / `get_config` 的键不存在 |
406
+ | `CELL_COMPILE_TOOL_MISSING`、`CELL_COMPILE_FAILED` | `--compile` 需要的 bun / deno / node 不存在、编译器报错(带输出的最后几行) |
407
+ | `CELL_COMPILE_EXTERNALS`、`CELL_COMPILE_NO_SERVER` | 有留在 bundle 外的包、项目没有后端可编译 |
408
+ | `CELL_TEMPLATE_NOT_FOUND`、`CELL_INIT_NOT_EMPTY` | `cell init` 的模板不存在、目标目录非空 |
409
+ | `CELL_UNSUPPORTED` | 使用了尚未提供的功能 |
410
+ | `CELL_OUTPUT_NOT_FOUND`、`CELL_PREVIEW_NO_SERVER` | `cell preview` / `cell deploy --skip-build` 前没有构建、产物里没有服务端 |
411
+ | `CELL_DEPLOY_UNSUPPORTED`、`CELL_DEPLOY_OUTPUT_MISMATCH`、`CELL_DEPLOYER_NOT_FOUND` | preset 没有部署器、已有产物不是该 preset 构建的、部署器不存在 |
412
+ | `CELL_DEPLOY_PLAN_FAILED`、`CELL_DEPLOY_FAILED`、`CELL_DEPLOY_CANCELLED` | 计划失败(如打包失败)、部署失败(凭据问题时 `hint` 说明如何设置)、hook 或模块取消了部署 |
413
+ | `CELL_DEPLOY_CREDENTIALS_MISSING`、`CELL_DEPLOY_UNAUTHORIZED` | 没有云平台凭据、凭据无效或权限不足 |
414
+ | `CELL_DEPLOY_API_ERROR`、`CELL_DEPLOY_NETWORK`、`CELL_DEPLOY_TIMEOUT`、`CELL_DEPLOY_PACKAGE_TOO_LARGE` | 云 API 报错(带云厂商错误码和请求 ID)、连不上云 API、等待函数就绪超时、代码包超过直传上限 |
415
+ | `CELL_CLOUDFLARE_CONFIG_INVALID`、`CELL_CLOUDFLARE_CONFIG_UNSUPPORTED`、`CELL_CLOUDFLARE_COMPATIBILITY_DATE` | `wrangler.json(c)` 不是合法 JSON 或字段类型错误、使用了 `wrangler.toml`、`compatibility_date` 早于 `2026-03-17` |
416
+ | `CELL_INTERNAL_ERROR` | Cell 或模块的缺陷;设置 `CELL_DEBUG=1` 可看到调用栈 |
417
+
418
+ ## 测试:createTestApp
419
+
420
+ ```ts
421
+ import { createTestApp } from '@celljs/cli';
422
+
423
+ const app = await createTestApp({ root, mode: ['extra'] }); // mode 前面总有 test
424
+ const res = await app.fetch('/users', { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' });
425
+ const { UserService } = await app.import('/src/user-service.ts'); // 后端加载的那份模块
426
+ app.get(UserService); // DI 容器里的对象
427
+ await app.close(); // 停止应用(onStop)
428
+ ```
429
+
430
+ `app.get(X)` 中测试从项目源码导入的类或 `Symbol('X')` 与应用里的不是同一个模块实例(应用在 Vite 的 module runner 里),按类名或 symbol 描述匹配;没有或重名时报 `CELL_DI_NO_BINDING` / `CELL_DI_AMBIGUOUS`。要拿到应用用的那一份(重名时、或要用模块里的其他导出),用 `app.import()`:项目内的文件写 `/src/...`,包写包名。
431
+
432
+ 在测试进程里像 `cell dev` 一样从源码加载后端,不构建、不监听端口;请求经内存中的 req/res 对象走完整的 HTTP 处理链,`fetch` 返回标准 `Response`。启动失败抛 `CellError`(如 `CELL_DEV_BACKEND_FAILED`,带出错文件);后端没有 HTTP 入口时 `fetch` 报 `CELL_TEST_APP_NO_HTTP`。
433
+
434
+ ## 编程接口
435
+
436
+ ```ts
437
+ import { CellCli } from '@celljs/cli';
438
+
439
+ const code = await new CellCli({ stdout, stderr, env }).run(['build', '--json']);
440
+ ```
441
+
442
+ 也导出 `defineConfig`、`ConfigResolver`、`PresetRegistry`、`DeployerRegistry`、`EventBus`、`HookRunner` 等,用于测试和编写工具。
package/agent/guide.md ADDED
@@ -0,0 +1,39 @@
1
+ # Cell
2
+
3
+ This project uses Cell {{cellVersion}}: TypeScript with dependency injection, MVC controllers on Express, and the `cell` toolchain (Vite). This guide matches the installed version; `npx cell agent sync` rewrites it after an upgrade.
4
+
5
+ ## Layout
6
+
7
+ - `src/node/` is the backend, `src/browser/` the frontend, `src/common/` code for both. `src/<node|browser>/module.ts` is the DI module of its side: it imports every file that has components and ends with `export default autoBind();`. A file it does not import is not loaded.
8
+ - `cell.yml` holds the application configuration, with `backend:` and `frontend:` sections; `cell.<mode>.yml` adds to it per mode (`development` in `cell dev`, `production` in `cell build`, `test` in tests, more with `-m <mode>`).
9
+ - `cell.config.ts` (optional) configures the toolchain only: `preset`, `modules`, `build`, `vite`, `hooks`. Application configuration never goes there.
10
+
11
+ ## Writing code
12
+
13
+ - Services: `@Component()` on the class, `@Autowired(Type)` on a property to inject. For an interface, export a `Symbol` with the same name and bind the class with `@Component(Symbol)`.
14
+ - Configuration: `@Value('cell.key')` reads `cell.yml`. `${env.NAME ?: 'default'}` in values is evaluated at startup (quote such values in YAML). `CELL_BACKEND__SERVER__PORT=8080` overrides `cell.server.port` of an existing key.
15
+ - HTTP: `@Controller('path')` with `@Get()`, `@Post()`, `@Put(':id')`, `@Delete(':id')` from `@celljs/mvc/lib/node`; parameters `@Param('id')`, `@Query('q')`, `@Body()`. Returned objects are JSON; add `@Text()` for text. To validate a body, type the `@Body()` parameter with a class that has class-validator decorators: invalid bodies get 400.
16
+ - Frontend and backend: `@Rpc(Symbol)` on the backend class, `RpcUtil.get<T>(Symbol)` (`@celljs/rpc/lib/common`) in the frontend.
17
+
18
+ ## Verify
19
+
20
+ - `npx cell check --json` checks types, configuration, decorator settings and DI bindings. Every issue has `code`, `file`, `line` and a `hint`. Run it after each change.
21
+ - Tests run with `bun test`; `createTestApp()` from `@celljs/cli` starts the application in the test process:
22
+
23
+ ```ts
24
+ const app = await createTestApp({ root: join(__dirname, '..') });
25
+ const res = await app.fetch('/todos', { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' });
26
+ const service = app.get(TodoService);
27
+ await app.close();
28
+ ```
29
+
30
+ - `npx cell dev` runs the application and reloads it on save; `npx cell build` builds into `.cell/output` (`--single`: one file, `--compile`: one executable); `npx cell preview` runs the build.
31
+ - `npx cell deploy --preset <cloudflare|fc|scf|lambda|vercel> --dry-run` builds and shows what a deployment would change, without credentials. Platform options go in `cell.config.ts` under the preset's name (`fc: { region: 'cn-shanghai' }`); credentials come from environment variables. Leave the real `cell deploy` to the user unless asked.
32
+
33
+ ## Find out
34
+
35
+ - `npx cell info --json`: components, DI modules, entries, preset, hooks, output.
36
+ - `npx cell config get <key> --why`: a merged configuration value and the files and variables that set it.
37
+ - `npx cell docs <words>`: the docs of the installed Cell packages.
38
+ - `npx cell mcp` serves these as MCP tools. While `cell dev` runs, `http://127.0.0.1:<port>/_cell/mcp` has `get_errors`, `list_routes`, `list_bindings`, `get_config`, `recent_requests` and `logs` of the running application.
39
+ - Errors read `[CELL_CODE] message`, then `fix:` and a docs link: do what the fix says.
package/bin/cell.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../lib/cli/main.js';
@@ -0,0 +1,39 @@
1
+ /** Where a guide snippet comes from: a component's AGENTS.md or one in a module's docs directory. */
2
+ export interface GuideSnippet {
3
+ source: string;
4
+ file: string;
5
+ }
6
+ export interface AgentSyncResult {
7
+ /** Files written, relative to the project root. */
8
+ files: string[];
9
+ /** Components and modules whose AGENTS.md went into the guide. */
10
+ snippets: string[];
11
+ }
12
+ /**
13
+ * The agent guide of a project (docs/design/agent-first.md R7): the Cell guide of the installed
14
+ * @celljs/cli version, followed by the AGENTS.md snippets of the installed components and toolchain
15
+ * modules. It is written between markers in AGENTS.md, so the rest of the file stays the project's,
16
+ * and as the skill `.agents/skills/cell/SKILL.md`.
17
+ */
18
+ export declare class AgentGuide {
19
+ protected readonly root: string;
20
+ protected readonly version: string;
21
+ static readonly BEGIN = "<!-- cell:begin (generated by `cell agent sync`; edit outside these markers) -->";
22
+ static readonly END = "<!-- cell:end -->";
23
+ static readonly GUIDE: URL;
24
+ static readonly SKILL = ".agents/skills/cell/SKILL.md";
25
+ constructor(root: string, version: string);
26
+ /** AGENTS.md of the components (not the project's own) and of module docs directories. */
27
+ static snippets(components: readonly {
28
+ name: string;
29
+ dir: string;
30
+ root: boolean;
31
+ }[], moduleDocs: readonly {
32
+ source: string;
33
+ value: string;
34
+ }[]): GuideSnippet[];
35
+ content(snippets: GuideSnippet[]): string;
36
+ sync(snippets: GuideSnippet[]): AgentSyncResult;
37
+ protected write(file: string, content: string): void;
38
+ }
39
+ //# sourceMappingURL=agent-guide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guide.d.ts","sourceRoot":"","sources":["../../src/agent/agent-guide.ts"],"names":[],"mappings":"AAGA,qGAAqG;AACrG,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC5B,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IAOf,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAC/B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAPtC,MAAM,CAAC,QAAQ,CAAC,KAAK,sFAAsF;IAC3G,MAAM,CAAC,QAAQ,CAAC,GAAG,uBAAuB;IAC1C,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAoD;IACzE,MAAM,CAAC,QAAQ,CAAC,KAAK,kCAAkC;IAEvD,YACuB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAClC;IAEJ,0FAA0F;IAC1F,MAAM,CAAC,QAAQ,CACX,UAAU,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,EACnE,UAAU,EAAE,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GACzD,YAAY,EAAE,CAKhB;IAED,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAUxC;IAED,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,eAAe,CA2B9C;IAED,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGnD;CACJ"}
@@ -0,0 +1,67 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join, relative } from 'node:path';
3
+ /**
4
+ * The agent guide of a project (docs/design/agent-first.md R7): the Cell guide of the installed
5
+ * @celljs/cli version, followed by the AGENTS.md snippets of the installed components and toolchain
6
+ * modules. It is written between markers in AGENTS.md, so the rest of the file stays the project's,
7
+ * and as the skill `.agents/skills/cell/SKILL.md`.
8
+ */
9
+ export class AgentGuide {
10
+ root;
11
+ version;
12
+ static BEGIN = '<!-- cell:begin (generated by `cell agent sync`; edit outside these markers) -->';
13
+ static END = '<!-- cell:end -->';
14
+ static GUIDE = new URL('../../agent/guide.md', import.meta.url);
15
+ static SKILL = '.agents/skills/cell/SKILL.md';
16
+ constructor(root, version) {
17
+ this.root = root;
18
+ this.version = version;
19
+ }
20
+ /** AGENTS.md of the components (not the project's own) and of module docs directories. */
21
+ static snippets(components, moduleDocs) {
22
+ return [
23
+ ...components.filter(c => !c.root).map(c => ({ source: c.name, file: join(c.dir, 'AGENTS.md') })),
24
+ ...moduleDocs.map(d => ({ source: d.source, file: join(d.value, 'AGENTS.md') })),
25
+ ].filter(s => existsSync(s.file));
26
+ }
27
+ content(snippets) {
28
+ const guide = readFileSync(AgentGuide.GUIDE, 'utf8').replaceAll('{{cellVersion}}', this.version).trim();
29
+ const parts = snippets.map(s => {
30
+ // Headings of a snippet move one level down, under its package.
31
+ const body = readFileSync(s.file, 'utf8')
32
+ .trim()
33
+ .replace(/^(#{1,5}) /gm, '#$1 ');
34
+ return `### ${s.source}\n\n${body}`;
35
+ });
36
+ return parts.length > 0 ? `${guide}\n\n## Installed components\n\n${parts.join('\n\n')}\n` : `${guide}\n`;
37
+ }
38
+ sync(snippets) {
39
+ const content = this.content(snippets);
40
+ const agents = join(this.root, 'AGENTS.md');
41
+ const block = `${AgentGuide.BEGIN}\n${content}${AgentGuide.END}`;
42
+ const current = existsSync(agents) ? readFileSync(agents, 'utf8') : '';
43
+ const begin = current.indexOf(AgentGuide.BEGIN.slice(0, 16));
44
+ const end = current.indexOf(AgentGuide.END);
45
+ const next = begin !== -1 && end > begin
46
+ ? `${current.slice(0, begin)}${block}${current.slice(end + AgentGuide.END.length)}`
47
+ : current.trim()
48
+ ? `${current.trimEnd()}\n\n${block}\n`
49
+ : `${block}\n`;
50
+ this.write(agents, next);
51
+ const skill = join(this.root, AgentGuide.SKILL);
52
+ this.write(skill, [
53
+ '---',
54
+ 'name: cell',
55
+ 'description: Build, check and debug Cell applications (TypeScript, dependency injection, MVC on Express, the cell CLI) - project layout, decorators, configuration, tests, cell check and cell mcp.',
56
+ '---',
57
+ '',
58
+ content,
59
+ ].join('\n'));
60
+ return { files: [agents, skill].map(file => relative(this.root, file)), snippets: snippets.map(s => s.source) };
61
+ }
62
+ write(file, content) {
63
+ mkdirSync(dirname(file), { recursive: true });
64
+ writeFileSync(file, content);
65
+ }
66
+ }
67
+ //# sourceMappingURL=agent-guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guide.js","sourceRoot":"","sources":["../../src/agent/agent-guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAepD;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAOI,IAAI;IACJ,OAAO;IAP9B,MAAM,CAAU,KAAK,GAAG,kFAAkF,CAAC;IAC3G,MAAM,CAAU,GAAG,GAAG,mBAAmB,CAAC;IAC1C,MAAM,CAAU,KAAK,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,MAAM,CAAU,KAAK,GAAG,8BAA8B,CAAC;IAEvD,YACuB,IAAY,EACZ,OAAe;oBADf,IAAI;uBACJ,OAAO;IAC3B,CAAC;IAEJ,0FAA0F;IAC1F,MAAM,CAAC,QAAQ,CACX,UAAmE,EACnE,UAAwD;QAExD,OAAO;YACH,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;YACjG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;SACnF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,QAAwB;QAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACxG,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC3B,gEAAgE;YAChE,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;iBACpC,IAAI,EAAE;iBACN,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,IAAI,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,kCAAkC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;IAC9G,CAAC;IAED,IAAI,CAAC,QAAwB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,UAAU,CAAC,KAAK,KAAK,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,GACN,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK;YACvB,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACnF,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;gBACd,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;gBACtC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,CACN,KAAK,EACL;YACI,KAAK;YACL,YAAY;YACZ,qMAAqM;YACrM,KAAK;YACL,EAAE;YACF,OAAO;SACV,CAAC,IAAI,CAAC,IAAI,CAAC,CACf,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpH,CAAC;IAES,KAAK,CAAC,IAAY,EAAE,OAAe;QACzC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;CACJ"}