fengming 0.3.9 → 0.3.11

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 (763) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/{bundled-channel-config-schema-DpdKMATU.d.ts → bundled-channel-config-schema-Bte--ZlY.d.ts} +26 -26
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/cli-startup-metadata.json +8 -8
  5. package/dist/control-ui/assets/{activity-B2W-IeAT.js → activity-wgT0-JR0.js} +2 -2
  6. package/dist/control-ui/assets/{agents-mRUyNVCz.js → agents-DG5PobrT.js} +2 -2
  7. package/dist/control-ui/assets/{channels-8QHOqBnt.js → channels-CX28oM42.js} +2 -2
  8. package/dist/control-ui/assets/{cron-H3unP_mO.js → cron-B8ixwBqU.js} +2 -2
  9. package/dist/control-ui/assets/{debug-CxLsQ9vH.js → debug-CnkYZUXy.js} +2 -2
  10. package/dist/control-ui/assets/{index-jtIYT0Eh.js → index-DQRZJKbO.js} +4 -4
  11. package/dist/control-ui/assets/{instances-B1JQeCRb.js → instances-BE3mV1JC.js} +2 -2
  12. package/dist/control-ui/assets/{nodes-RGOmq_1l.js → nodes-Cou4PWRX.js} +2 -2
  13. package/dist/control-ui/assets/{sessions-C2O-Jgpg.js → sessions-DpAaBT21.js} +2 -2
  14. package/dist/control-ui/assets/{skills-jyJOYA4I.js → skills-DjA_j_20.js} +2 -2
  15. package/dist/control-ui/assets/{workboard-uM_kK8cQ.js → workboard-BFnvbS0k.js} +2 -2
  16. package/dist/control-ui/index.html +1 -1
  17. package/dist/control-ui/sw.js +1 -1
  18. package/dist/gateway/protocol/index.d.ts +1 -1
  19. package/dist/{index-DhOQs6M_.d.ts → index-DuDY3bCZ.d.ts} +45 -45
  20. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  21. package/dist/plugin-sdk/agent-config-primitives.d.ts +1 -1
  22. package/dist/plugin-sdk/{bundled-channel-config-schema-Dfn3b8sF.d.ts → bundled-channel-config-schema-BPFNnbwu.d.ts} +23 -23
  23. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +3 -3
  24. package/dist/plugin-sdk/channel-config-primitives.d.ts +2 -2
  25. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +3 -3
  26. package/dist/plugin-sdk/channel-config-schema.d.ts +2 -2
  27. package/dist/plugin-sdk/channel-core.d.ts +1 -1
  28. package/dist/plugin-sdk/channel-plugin-common.d.ts +1 -1
  29. package/dist/plugin-sdk/compat.d.ts +2 -2
  30. package/dist/plugin-sdk/{config-schema-DUddICQM.d.ts → config-schema-D7cABQ6o.d.ts} +1 -1
  31. package/dist/plugin-sdk/config-schema.d.ts +4 -4
  32. package/dist/plugin-sdk/core.d.ts +1 -1
  33. package/dist/plugin-sdk/discord.d.ts +2 -2
  34. package/dist/plugin-sdk/tts-runtime.d.ts +1 -1
  35. package/dist/plugin-sdk/{zod-schema.core-B4_b2R5K.d.ts → zod-schema.core-CwBNqcXp.d.ts} +1 -1
  36. package/dist/{zod-schema.core-Cuz0lz6m.d.ts → zod-schema.core-BGLctDlK.d.ts} +1 -1
  37. package/package.json +7 -412
  38. package/CHANGELOG.md +0 -38
  39. package/THIRD_PARTY_NOTICES.md +0 -37
  40. package/docs/.i18n/README.md +0 -81
  41. package/docs/.i18n/ar-navigation.json +0 -18
  42. package/docs/.i18n/de-navigation.json +0 -18
  43. package/docs/.i18n/es-navigation.json +0 -18
  44. package/docs/.i18n/fr-navigation.json +0 -18
  45. package/docs/.i18n/glossary.ar.json +0 -78
  46. package/docs/.i18n/glossary.de.json +0 -78
  47. package/docs/.i18n/glossary.es.json +0 -78
  48. package/docs/.i18n/glossary.fa.json +0 -78
  49. package/docs/.i18n/glossary.fr.json +0 -78
  50. package/docs/.i18n/glossary.id.json +0 -78
  51. package/docs/.i18n/glossary.it.json +0 -78
  52. package/docs/.i18n/glossary.ja-JP.json +0 -98
  53. package/docs/.i18n/glossary.ko.json +0 -78
  54. package/docs/.i18n/glossary.nl.json +0 -78
  55. package/docs/.i18n/glossary.pl.json +0 -78
  56. package/docs/.i18n/glossary.pt-BR.json +0 -78
  57. package/docs/.i18n/glossary.th.json +0 -78
  58. package/docs/.i18n/glossary.tr.json +0 -78
  59. package/docs/.i18n/glossary.uk.json +0 -78
  60. package/docs/.i18n/glossary.vi.json +0 -78
  61. package/docs/.i18n/glossary.zh-CN.json +0 -1122
  62. package/docs/.i18n/glossary.zh-TW.json +0 -78
  63. package/docs/.i18n/id-navigation.json +0 -18
  64. package/docs/.i18n/it-navigation.json +0 -18
  65. package/docs/.i18n/ja-navigation.json +0 -18
  66. package/docs/.i18n/ko-navigation.json +0 -18
  67. package/docs/.i18n/pl-navigation.json +0 -18
  68. package/docs/.i18n/pt-BR-navigation.json +0 -18
  69. package/docs/.i18n/tr-navigation.json +0 -18
  70. package/docs/.i18n/translation-workflow.md +0 -111
  71. package/docs/.i18n/zh-Hans-navigation.json +0 -552
  72. package/docs/AGENTS.md +0 -36
  73. package/docs/CLAUDE.md +0 -1
  74. package/docs/agent-runtime-architecture.md +0 -48
  75. package/docs/announcements/bluebubbles-imessage.md +0 -79
  76. package/docs/auth-credential-semantics.md +0 -124
  77. package/docs/automation/auth-monitoring.md +0 -11
  78. package/docs/automation/clawflow.md +0 -12
  79. package/docs/automation/cron-jobs.md +0 -534
  80. package/docs/automation/cron-vs-heartbeat.md +0 -11
  81. package/docs/automation/gmail-pubsub.md +0 -11
  82. package/docs/automation/hooks.md +0 -387
  83. package/docs/automation/index.md +0 -135
  84. package/docs/automation/poll.md +0 -12
  85. package/docs/automation/standing-orders.md +0 -250
  86. package/docs/automation/taskflow.md +0 -155
  87. package/docs/automation/tasks.md +0 -374
  88. package/docs/automation/troubleshooting.md +0 -12
  89. package/docs/automation/webhook.md +0 -12
  90. package/docs/brave-search.md +0 -11
  91. package/docs/channels/access-groups.md +0 -201
  92. package/docs/channels/ambient-room-events.md +0 -214
  93. package/docs/channels/bot-loop-protection.md +0 -131
  94. package/docs/channels/broadcast-groups.md +0 -472
  95. package/docs/channels/channel-routing.md +0 -162
  96. package/docs/channels/clickclack.md +0 -138
  97. package/docs/channels/discord.md +0 -1758
  98. package/docs/channels/feishu.md +0 -650
  99. package/docs/channels/googlechat.md +0 -284
  100. package/docs/channels/group-messages.md +0 -95
  101. package/docs/channels/groups.md +0 -524
  102. package/docs/channels/imessage-from-bluebubbles.md +0 -259
  103. package/docs/channels/imessage.md +0 -839
  104. package/docs/channels/index.md +0 -64
  105. package/docs/channels/irc.md +0 -253
  106. package/docs/channels/line.md +0 -243
  107. package/docs/channels/location.md +0 -71
  108. package/docs/channels/matrix-migration.md +0 -370
  109. package/docs/channels/matrix-presentation.md +0 -77
  110. package/docs/channels/matrix-push-rules.md +0 -150
  111. package/docs/channels/matrix.md +0 -921
  112. package/docs/channels/mattermost.md +0 -542
  113. package/docs/channels/msteams.md +0 -1096
  114. package/docs/channels/nextcloud-talk.md +0 -176
  115. package/docs/channels/nostr.md +0 -253
  116. package/docs/channels/pairing.md +0 -214
  117. package/docs/channels/qqbot.md +0 -314
  118. package/docs/channels/signal.md +0 -417
  119. package/docs/channels/slack.md +0 -1623
  120. package/docs/channels/synology-chat.md +0 -187
  121. package/docs/channels/telegram.md +0 -1124
  122. package/docs/channels/tlon.md +0 -296
  123. package/docs/channels/troubleshooting.md +0 -162
  124. package/docs/channels/twitch.md +0 -431
  125. package/docs/channels/wechat.md +0 -171
  126. package/docs/channels/whatsapp.md +0 -796
  127. package/docs/channels/yuanbao.md +0 -416
  128. package/docs/channels/zalo.md +0 -253
  129. package/docs/channels/zalouser.md +0 -217
  130. package/docs/ci.md +0 -657
  131. package/docs/clawhub/publishing.md +0 -96
  132. package/docs/cli/acp.md +0 -370
  133. package/docs/cli/agent.md +0 -109
  134. package/docs/cli/agents.md +0 -253
  135. package/docs/cli/approvals.md +0 -190
  136. package/docs/cli/backup.md +0 -98
  137. package/docs/cli/browser.md +0 -307
  138. package/docs/cli/channels.md +0 -154
  139. package/docs/cli/clawbot.md +0 -25
  140. package/docs/cli/commitments.md +0 -90
  141. package/docs/cli/completion.md +0 -39
  142. package/docs/cli/config.md +0 -504
  143. package/docs/cli/configure.md +0 -77
  144. package/docs/cli/crestodian.md +0 -337
  145. package/docs/cli/cron.md +0 -304
  146. package/docs/cli/daemon.md +0 -67
  147. package/docs/cli/dashboard.md +0 -33
  148. package/docs/cli/devices.md +0 -240
  149. package/docs/cli/directory.md +0 -68
  150. package/docs/cli/dns.md +0 -53
  151. package/docs/cli/docs.md +0 -63
  152. package/docs/cli/doctor.md +0 -241
  153. package/docs/cli/flows.md +0 -52
  154. package/docs/cli/gateway.md +0 -572
  155. package/docs/cli/health.md +0 -43
  156. package/docs/cli/hooks.md +0 -345
  157. package/docs/cli/index.md +0 -400
  158. package/docs/cli/infer.md +0 -364
  159. package/docs/cli/logs.md +0 -68
  160. package/docs/cli/mcp.md +0 -529
  161. package/docs/cli/memory.md +0 -183
  162. package/docs/cli/message.md +0 -317
  163. package/docs/cli/migrate.md +0 -334
  164. package/docs/cli/models.md +0 -239
  165. package/docs/cli/node.md +0 -177
  166. package/docs/cli/nodes.md +0 -76
  167. package/docs/cli/onboard.md +0 -250
  168. package/docs/cli/pairing.md +0 -77
  169. package/docs/cli/path.md +0 -511
  170. package/docs/cli/plugins.md +0 -459
  171. package/docs/cli/policy.md +0 -886
  172. package/docs/cli/proxy.md +0 -89
  173. package/docs/cli/qr.md +0 -56
  174. package/docs/cli/reset.md +0 -39
  175. package/docs/cli/sandbox.md +0 -208
  176. package/docs/cli/secrets.md +0 -202
  177. package/docs/cli/security.md +0 -136
  178. package/docs/cli/sessions.md +0 -164
  179. package/docs/cli/setup.md +0 -59
  180. package/docs/cli/skills.md +0 -122
  181. package/docs/cli/status.md +0 -45
  182. package/docs/cli/system.md +0 -89
  183. package/docs/cli/tasks.md +0 -111
  184. package/docs/cli/transcripts.md +0 -151
  185. package/docs/cli/tui.md +0 -91
  186. package/docs/cli/uninstall.md +0 -44
  187. package/docs/cli/update.md +0 -243
  188. package/docs/cli/voicecall.md +0 -204
  189. package/docs/cli/webhooks.md +0 -117
  190. package/docs/cli/wiki.md +0 -256
  191. package/docs/concepts/active-memory.md +0 -856
  192. package/docs/concepts/agent-loop.md +0 -185
  193. package/docs/concepts/agent-runtimes.md +0 -276
  194. package/docs/concepts/agent-workspace.md +0 -230
  195. package/docs/concepts/agent.md +0 -140
  196. package/docs/concepts/architecture.md +0 -154
  197. package/docs/concepts/channel-docking.md +0 -145
  198. package/docs/concepts/commitments.md +0 -150
  199. package/docs/concepts/compaction.md +0 -203
  200. package/docs/concepts/context-engine.md +0 -347
  201. package/docs/concepts/context.md +0 -199
  202. package/docs/concepts/delegate-architecture.md +0 -319
  203. package/docs/concepts/dreaming.md +0 -264
  204. package/docs/concepts/experimental-features.md +0 -109
  205. package/docs/concepts/features.md +0 -91
  206. package/docs/concepts/fengming-sdk.md +0 -323
  207. package/docs/concepts/mantis-slack-desktop-runbook.md +0 -231
  208. package/docs/concepts/mantis.md +0 -744
  209. package/docs/concepts/markdown-formatting.md +0 -139
  210. package/docs/concepts/memory-builtin.md +0 -148
  211. package/docs/concepts/memory-honcho.md +0 -144
  212. package/docs/concepts/memory-qmd.md +0 -271
  213. package/docs/concepts/memory-search.md +0 -167
  214. package/docs/concepts/memory.md +0 -299
  215. package/docs/concepts/message-lifecycle-refactor.md +0 -1126
  216. package/docs/concepts/messages.md +0 -214
  217. package/docs/concepts/model-failover.md +0 -384
  218. package/docs/concepts/model-providers.md +0 -719
  219. package/docs/concepts/models.md +0 -371
  220. package/docs/concepts/multi-agent.md +0 -625
  221. package/docs/concepts/oauth.md +0 -198
  222. package/docs/concepts/parallel-specialist-lanes.md +0 -127
  223. package/docs/concepts/personal-agent-benchmark-pack.md +0 -74
  224. package/docs/concepts/presence.md +0 -117
  225. package/docs/concepts/progress-drafts.md +0 -406
  226. package/docs/concepts/qa-e2e-automation.md +0 -947
  227. package/docs/concepts/qa-matrix.md +0 -139
  228. package/docs/concepts/queue-steering.md +0 -90
  229. package/docs/concepts/queue.md +0 -136
  230. package/docs/concepts/retry.md +0 -86
  231. package/docs/concepts/session-pruning.md +0 -104
  232. package/docs/concepts/session-tool.md +0 -188
  233. package/docs/concepts/session.md +0 -164
  234. package/docs/concepts/soul.md +0 -116
  235. package/docs/concepts/streaming.md +0 -257
  236. package/docs/concepts/system-prompt.md +0 -328
  237. package/docs/concepts/timezone.md +0 -47
  238. package/docs/concepts/typebox.md +0 -309
  239. package/docs/concepts/typing-indicators.md +0 -88
  240. package/docs/concepts/usage-tracking.md +0 -66
  241. package/docs/date-time.md +0 -126
  242. package/docs/debug/node-issue.md +0 -90
  243. package/docs/diagnostics/flags.md +0 -182
  244. package/docs/docs.json +0 -1862
  245. package/docs/fengming-agent-runtime.md +0 -82
  246. package/docs/gateway/authentication.md +0 -256
  247. package/docs/gateway/background-process.md +0 -147
  248. package/docs/gateway/bonjour.md +0 -303
  249. package/docs/gateway/bridge-protocol.md +0 -97
  250. package/docs/gateway/cli-backends.md +0 -439
  251. package/docs/gateway/config-agents.md +0 -1525
  252. package/docs/gateway/config-channels.md +0 -945
  253. package/docs/gateway/config-tools.md +0 -774
  254. package/docs/gateway/configuration-examples.md +0 -704
  255. package/docs/gateway/configuration-reference.md +0 -1391
  256. package/docs/gateway/configuration.md +0 -739
  257. package/docs/gateway/diagnostics.md +0 -213
  258. package/docs/gateway/discovery.md +0 -154
  259. package/docs/gateway/doctor.md +0 -575
  260. package/docs/gateway/gateway-lock.md +0 -37
  261. package/docs/gateway/health.md +0 -73
  262. package/docs/gateway/heartbeat.md +0 -498
  263. package/docs/gateway/index.md +0 -383
  264. package/docs/gateway/local-model-services.md +0 -205
  265. package/docs/gateway/local-models.md +0 -355
  266. package/docs/gateway/logging.md +0 -149
  267. package/docs/gateway/multiple-gateways.md +0 -178
  268. package/docs/gateway/network-model.md +0 -15
  269. package/docs/gateway/openai-http-api.md +0 -378
  270. package/docs/gateway/openresponses-http-api.md +0 -347
  271. package/docs/gateway/openshell.md +0 -316
  272. package/docs/gateway/opentelemetry.md +0 -433
  273. package/docs/gateway/operator-scopes.md +0 -119
  274. package/docs/gateway/pairing.md +0 -207
  275. package/docs/gateway/prometheus.md +0 -249
  276. package/docs/gateway/protocol.md +0 -826
  277. package/docs/gateway/remote-gateway-readme.md +0 -169
  278. package/docs/gateway/remote.md +0 -280
  279. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -148
  280. package/docs/gateway/sandboxing.md +0 -546
  281. package/docs/gateway/secrets-plan-contract.md +0 -159
  282. package/docs/gateway/secrets.md +0 -805
  283. package/docs/gateway/security/audit-checks.md +0 -127
  284. package/docs/gateway/security/exposure-runbook.md +0 -212
  285. package/docs/gateway/security/index.md +0 -1343
  286. package/docs/gateway/security/secure-file-operations.md +0 -76
  287. package/docs/gateway/security/shrinkwrap.md +0 -111
  288. package/docs/gateway/tailscale.md +0 -156
  289. package/docs/gateway/tools-invoke-http-api.md +0 -169
  290. package/docs/gateway/troubleshooting.md +0 -877
  291. package/docs/gateway/trusted-proxy-auth.md +0 -483
  292. package/docs/help/debugging.md +0 -341
  293. package/docs/help/environment.md +0 -233
  294. package/docs/help/faq-first-run.md +0 -870
  295. package/docs/help/faq-models.md +0 -556
  296. package/docs/help/faq.md +0 -2041
  297. package/docs/help/index.md +0 -39
  298. package/docs/help/scripts.md +0 -56
  299. package/docs/help/testing-live.md +0 -587
  300. package/docs/help/testing-updates-plugins.md +0 -299
  301. package/docs/help/testing.md +0 -977
  302. package/docs/help/troubleshooting.md +0 -449
  303. package/docs/index.md +0 -196
  304. package/docs/install/ansible.md +0 -233
  305. package/docs/install/azure.md +0 -315
  306. package/docs/install/bun.md +0 -59
  307. package/docs/install/clawdock.md +0 -112
  308. package/docs/install/development-channels.md +0 -148
  309. package/docs/install/digitalocean.md +0 -174
  310. package/docs/install/docker-vm-runtime.md +0 -154
  311. package/docs/install/docker.md +0 -564
  312. package/docs/install/exe-dev.md +0 -201
  313. package/docs/install/fly.md +0 -524
  314. package/docs/install/gcp.md +0 -418
  315. package/docs/install/hetzner.md +0 -285
  316. package/docs/install/hostinger.md +0 -98
  317. package/docs/install/index.md +0 -232
  318. package/docs/install/installer.md +0 -447
  319. package/docs/install/kubernetes.md +0 -196
  320. package/docs/install/macos-vm.md +0 -281
  321. package/docs/install/migrating-claude.md +0 -165
  322. package/docs/install/migrating-hermes.md +0 -178
  323. package/docs/install/migrating.md +0 -137
  324. package/docs/install/nix.md +0 -112
  325. package/docs/install/node.md +0 -142
  326. package/docs/install/northflank.mdx +0 -44
  327. package/docs/install/oracle.md +0 -218
  328. package/docs/install/podman.md +0 -216
  329. package/docs/install/railway.mdx +0 -92
  330. package/docs/install/raspberry-pi.md +0 -234
  331. package/docs/install/render.mdx +0 -167
  332. package/docs/install/uninstall.md +0 -131
  333. package/docs/install/updating.md +0 -284
  334. package/docs/install/upstash.md +0 -96
  335. package/docs/logging.md +0 -320
  336. package/docs/nav-tabs-underline.js +0 -100
  337. package/docs/network.md +0 -72
  338. package/docs/nodes/audio.md +0 -216
  339. package/docs/nodes/camera.md +0 -166
  340. package/docs/nodes/images.md +0 -77
  341. package/docs/nodes/index.md +0 -439
  342. package/docs/nodes/location-command.md +0 -102
  343. package/docs/nodes/media-understanding.md +0 -495
  344. package/docs/nodes/talk.md +0 -160
  345. package/docs/nodes/troubleshooting.md +0 -123
  346. package/docs/nodes/voicewake.md +0 -93
  347. package/docs/perplexity.md +0 -11
  348. package/docs/plan/codex-context-engine-harness.md +0 -624
  349. package/docs/plan/ui-channels.md +0 -284
  350. package/docs/platforms/digitalocean.md +0 -12
  351. package/docs/platforms/easyrunner.md +0 -109
  352. package/docs/platforms/index.md +0 -51
  353. package/docs/platforms/linux.md +0 -141
  354. package/docs/platforms/mac/bundled-gateway.md +0 -79
  355. package/docs/platforms/mac/canvas.md +0 -128
  356. package/docs/platforms/mac/child-process.md +0 -72
  357. package/docs/platforms/mac/dev-setup.md +0 -112
  358. package/docs/platforms/mac/health.md +0 -39
  359. package/docs/platforms/mac/icon.md +0 -36
  360. package/docs/platforms/mac/logging.md +0 -62
  361. package/docs/platforms/mac/menu-bar.md +0 -93
  362. package/docs/platforms/mac/peekaboo.md +0 -96
  363. package/docs/platforms/mac/permissions.md +0 -73
  364. package/docs/platforms/mac/remote.md +0 -123
  365. package/docs/platforms/mac/signing.md +0 -52
  366. package/docs/platforms/mac/skills.md +0 -43
  367. package/docs/platforms/mac/voice-overlay.md +0 -66
  368. package/docs/platforms/mac/voicewake.md +0 -73
  369. package/docs/platforms/mac/webchat.md +0 -54
  370. package/docs/platforms/mac/xpc.md +0 -66
  371. package/docs/platforms/oracle.md +0 -12
  372. package/docs/platforms/raspberry-pi.md +0 -13
  373. package/docs/platforms/windows.md +0 -286
  374. package/docs/plugins/adding-capabilities.md +0 -146
  375. package/docs/plugins/admin-http-rpc.md +0 -216
  376. package/docs/plugins/agent-tools.md +0 -13
  377. package/docs/plugins/architecture-internals.md +0 -1196
  378. package/docs/plugins/architecture.md +0 -483
  379. package/docs/plugins/building-extensions.md +0 -13
  380. package/docs/plugins/building-plugins.md +0 -335
  381. package/docs/plugins/bundles.md +0 -310
  382. package/docs/plugins/cli-backend-plugins.md +0 -310
  383. package/docs/plugins/codex-computer-use.md +0 -297
  384. package/docs/plugins/codex-harness-reference.md +0 -470
  385. package/docs/plugins/codex-harness-runtime.md +0 -268
  386. package/docs/plugins/codex-harness.md +0 -780
  387. package/docs/plugins/codex-native-plugins.md +0 -276
  388. package/docs/plugins/community.md +0 -77
  389. package/docs/plugins/compatibility.md +0 -167
  390. package/docs/plugins/copilot.md +0 -356
  391. package/docs/plugins/dependency-resolution.md +0 -176
  392. package/docs/plugins/google-meet.md +0 -1737
  393. package/docs/plugins/hooks.md +0 -484
  394. package/docs/plugins/install-overrides.md +0 -80
  395. package/docs/plugins/manage-plugins.md +0 -210
  396. package/docs/plugins/manifest.md +0 -1457
  397. package/docs/plugins/memory-lancedb.md +0 -385
  398. package/docs/plugins/memory-wiki.md +0 -529
  399. package/docs/plugins/message-presentation.md +0 -473
  400. package/docs/plugins/oc-path.md +0 -166
  401. package/docs/plugins/plugin-inventory.md +0 -189
  402. package/docs/plugins/plugin-permission-requests.md +0 -193
  403. package/docs/plugins/reference/acpx.md +0 -23
  404. package/docs/plugins/reference/admin-http-rpc.md +0 -23
  405. package/docs/plugins/reference/alibaba.md +0 -23
  406. package/docs/plugins/reference/amazon-bedrock-mantle.md +0 -23
  407. package/docs/plugins/reference/amazon-bedrock.md +0 -23
  408. package/docs/plugins/reference/anthropic-vertex.md +0 -19
  409. package/docs/plugins/reference/anthropic.md +0 -23
  410. package/docs/plugins/reference/arcee.md +0 -23
  411. package/docs/plugins/reference/azure-speech.md +0 -23
  412. package/docs/plugins/reference/bonjour.md +0 -19
  413. package/docs/plugins/reference/brave.md +0 -23
  414. package/docs/plugins/reference/browser.md +0 -23
  415. package/docs/plugins/reference/byteplus.md +0 -19
  416. package/docs/plugins/reference/canvas.md +0 -19
  417. package/docs/plugins/reference/cerebras.md +0 -23
  418. package/docs/plugins/reference/chutes.md +0 -23
  419. package/docs/plugins/reference/clickclack.md +0 -23
  420. package/docs/plugins/reference/cloudflare-ai-gateway.md +0 -23
  421. package/docs/plugins/reference/codex-supervisor.md +0 -27
  422. package/docs/plugins/reference/codex.md +0 -23
  423. package/docs/plugins/reference/comfy.md +0 -23
  424. package/docs/plugins/reference/copilot-proxy.md +0 -19
  425. package/docs/plugins/reference/copilot.md +0 -23
  426. package/docs/plugins/reference/deepgram.md +0 -23
  427. package/docs/plugins/reference/deepinfra.md +0 -23
  428. package/docs/plugins/reference/deepseek.md +0 -23
  429. package/docs/plugins/reference/diagnostics-otel.md +0 -19
  430. package/docs/plugins/reference/diagnostics-prometheus.md +0 -19
  431. package/docs/plugins/reference/diffs-language-pack.md +0 -19
  432. package/docs/plugins/reference/diffs.md +0 -19
  433. package/docs/plugins/reference/discord.md +0 -23
  434. package/docs/plugins/reference/document-extract.md +0 -23
  435. package/docs/plugins/reference/duckduckgo.md +0 -23
  436. package/docs/plugins/reference/elevenlabs.md +0 -23
  437. package/docs/plugins/reference/exa.md +0 -23
  438. package/docs/plugins/reference/fal.md +0 -23
  439. package/docs/plugins/reference/feishu.md +0 -23
  440. package/docs/plugins/reference/file-transfer.md +0 -19
  441. package/docs/plugins/reference/firecrawl.md +0 -23
  442. package/docs/plugins/reference/fireworks.md +0 -23
  443. package/docs/plugins/reference/github-copilot.md +0 -23
  444. package/docs/plugins/reference/gmi.md +0 -23
  445. package/docs/plugins/reference/google-meet.md +0 -23
  446. package/docs/plugins/reference/google.md +0 -23
  447. package/docs/plugins/reference/googlechat.md +0 -23
  448. package/docs/plugins/reference/gradium.md +0 -23
  449. package/docs/plugins/reference/groq.md +0 -23
  450. package/docs/plugins/reference/huggingface.md +0 -23
  451. package/docs/plugins/reference/imessage.md +0 -23
  452. package/docs/plugins/reference/inworld.md +0 -23
  453. package/docs/plugins/reference/irc.md +0 -23
  454. package/docs/plugins/reference/kilocode.md +0 -23
  455. package/docs/plugins/reference/kimi.md +0 -23
  456. package/docs/plugins/reference/line.md +0 -23
  457. package/docs/plugins/reference/litellm.md +0 -23
  458. package/docs/plugins/reference/llm-task.md +0 -19
  459. package/docs/plugins/reference/lmstudio.md +0 -23
  460. package/docs/plugins/reference/lobster.md +0 -19
  461. package/docs/plugins/reference/matrix.md +0 -23
  462. package/docs/plugins/reference/mattermost.md +0 -23
  463. package/docs/plugins/reference/memory-core.md +0 -19
  464. package/docs/plugins/reference/memory-lancedb.md +0 -23
  465. package/docs/plugins/reference/memory-wiki.md +0 -23
  466. package/docs/plugins/reference/microsoft-foundry.md +0 -19
  467. package/docs/plugins/reference/microsoft.md +0 -19
  468. package/docs/plugins/reference/migrate-claude.md +0 -19
  469. package/docs/plugins/reference/migrate-hermes.md +0 -19
  470. package/docs/plugins/reference/minimax.md +0 -23
  471. package/docs/plugins/reference/mistral.md +0 -23
  472. package/docs/plugins/reference/moonshot.md +0 -23
  473. package/docs/plugins/reference/msteams.md +0 -23
  474. package/docs/plugins/reference/nextcloud-talk.md +0 -23
  475. package/docs/plugins/reference/nostr.md +0 -23
  476. package/docs/plugins/reference/novita.md +0 -23
  477. package/docs/plugins/reference/nvidia.md +0 -23
  478. package/docs/plugins/reference/oc-path.md +0 -23
  479. package/docs/plugins/reference/ollama.md +0 -23
  480. package/docs/plugins/reference/open-prose.md +0 -19
  481. package/docs/plugins/reference/openai.md +0 -23
  482. package/docs/plugins/reference/opencode-go.md +0 -23
  483. package/docs/plugins/reference/opencode.md +0 -23
  484. package/docs/plugins/reference/openrouter.md +0 -23
  485. package/docs/plugins/reference/openshell.md +0 -19
  486. package/docs/plugins/reference/perplexity.md +0 -23
  487. package/docs/plugins/reference/pixverse.md +0 -23
  488. package/docs/plugins/reference/policy.md +0 -72
  489. package/docs/plugins/reference/qa-channel.md +0 -23
  490. package/docs/plugins/reference/qa-lab.md +0 -19
  491. package/docs/plugins/reference/qa-matrix.md +0 -19
  492. package/docs/plugins/reference/qianfan.md +0 -23
  493. package/docs/plugins/reference/qqbot.md +0 -23
  494. package/docs/plugins/reference/qwen.md +0 -23
  495. package/docs/plugins/reference/runway.md +0 -23
  496. package/docs/plugins/reference/searxng.md +0 -19
  497. package/docs/plugins/reference/senseaudio.md +0 -23
  498. package/docs/plugins/reference/sglang.md +0 -23
  499. package/docs/plugins/reference/signal.md +0 -23
  500. package/docs/plugins/reference/skill-workshop.md +0 -23
  501. package/docs/plugins/reference/slack.md +0 -23
  502. package/docs/plugins/reference/stepfun.md +0 -23
  503. package/docs/plugins/reference/synology-chat.md +0 -23
  504. package/docs/plugins/reference/synthetic.md +0 -23
  505. package/docs/plugins/reference/tavily.md +0 -23
  506. package/docs/plugins/reference/telegram.md +0 -23
  507. package/docs/plugins/reference/tencent.md +0 -23
  508. package/docs/plugins/reference/tlon.md +0 -23
  509. package/docs/plugins/reference/together.md +0 -23
  510. package/docs/plugins/reference/tokenjuice.md +0 -23
  511. package/docs/plugins/reference/tts-local-cli.md +0 -19
  512. package/docs/plugins/reference/twitch.md +0 -23
  513. package/docs/plugins/reference/venice.md +0 -23
  514. package/docs/plugins/reference/vercel-ai-gateway.md +0 -23
  515. package/docs/plugins/reference/vllm.md +0 -23
  516. package/docs/plugins/reference/voice-call.md +0 -23
  517. package/docs/plugins/reference/volcengine.md +0 -23
  518. package/docs/plugins/reference/voyage.md +0 -19
  519. package/docs/plugins/reference/vydra.md +0 -23
  520. package/docs/plugins/reference/web-readability.md +0 -19
  521. package/docs/plugins/reference/webhooks.md +0 -23
  522. package/docs/plugins/reference/whatsapp.md +0 -23
  523. package/docs/plugins/reference/workboard.md +0 -23
  524. package/docs/plugins/reference/xai.md +0 -23
  525. package/docs/plugins/reference/xiaomi.md +0 -23
  526. package/docs/plugins/reference/zai.md +0 -23
  527. package/docs/plugins/reference/zalo.md +0 -23
  528. package/docs/plugins/reference/zalouser.md +0 -24
  529. package/docs/plugins/reference.md +0 -145
  530. package/docs/plugins/sdk-agent-harness.md +0 -338
  531. package/docs/plugins/sdk-channel-inbound.md +0 -70
  532. package/docs/plugins/sdk-channel-ingress.md +0 -137
  533. package/docs/plugins/sdk-channel-message.md +0 -18
  534. package/docs/plugins/sdk-channel-outbound.md +0 -113
  535. package/docs/plugins/sdk-channel-plugins.md +0 -765
  536. package/docs/plugins/sdk-channel-turn.md +0 -9
  537. package/docs/plugins/sdk-entrypoints.md +0 -344
  538. package/docs/plugins/sdk-migration.md +0 -979
  539. package/docs/plugins/sdk-overview.md +0 -511
  540. package/docs/plugins/sdk-provider-plugins.md +0 -846
  541. package/docs/plugins/sdk-runtime.md +0 -676
  542. package/docs/plugins/sdk-setup.md +0 -550
  543. package/docs/plugins/sdk-subpaths.md +0 -391
  544. package/docs/plugins/sdk-testing.md +0 -403
  545. package/docs/plugins/skill-workshop.md +0 -713
  546. package/docs/plugins/tool-plugins.md +0 -411
  547. package/docs/plugins/voice-call.md +0 -942
  548. package/docs/plugins/webhooks.md +0 -192
  549. package/docs/plugins/workboard.md +0 -252
  550. package/docs/plugins/zalouser.md +0 -86
  551. package/docs/prose.md +0 -137
  552. package/docs/providers/alibaba.md +0 -158
  553. package/docs/providers/anthropic.md +0 -381
  554. package/docs/providers/arcee.md +0 -144
  555. package/docs/providers/azure-speech.md +0 -119
  556. package/docs/providers/bedrock-mantle.md +0 -211
  557. package/docs/providers/bedrock.md +0 -414
  558. package/docs/providers/cerebras.md +0 -130
  559. package/docs/providers/chutes.md +0 -153
  560. package/docs/providers/claude-max-api-proxy.md +0 -191
  561. package/docs/providers/cloudflare-ai-gateway.md +0 -119
  562. package/docs/providers/comfy.md +0 -362
  563. package/docs/providers/deepgram.md +0 -184
  564. package/docs/providers/deepinfra.md +0 -92
  565. package/docs/providers/deepseek.md +0 -146
  566. package/docs/providers/ds4.md +0 -309
  567. package/docs/providers/elevenlabs.md +0 -130
  568. package/docs/providers/fal.md +0 -240
  569. package/docs/providers/fireworks.md +0 -144
  570. package/docs/providers/github-copilot.md +0 -257
  571. package/docs/providers/gmi.md +0 -92
  572. package/docs/providers/google.md +0 -472
  573. package/docs/providers/gradium.md +0 -123
  574. package/docs/providers/groq.md +0 -171
  575. package/docs/providers/huggingface.md +0 -235
  576. package/docs/providers/index.md +0 -105
  577. package/docs/providers/inferrs.md +0 -272
  578. package/docs/providers/inworld.md +0 -120
  579. package/docs/providers/kilocode.md +0 -135
  580. package/docs/providers/litellm.md +0 -234
  581. package/docs/providers/lmstudio.md +0 -224
  582. package/docs/providers/minimax.md +0 -505
  583. package/docs/providers/mistral.md +0 -235
  584. package/docs/providers/models.md +0 -64
  585. package/docs/providers/moonshot.md +0 -413
  586. package/docs/providers/novita.md +0 -92
  587. package/docs/providers/nvidia.md +0 -158
  588. package/docs/providers/ollama-cloud.md +0 -115
  589. package/docs/providers/ollama.md +0 -1225
  590. package/docs/providers/openai.md +0 -1093
  591. package/docs/providers/opencode-go.md +0 -123
  592. package/docs/providers/opencode.md +0 -149
  593. package/docs/providers/openrouter.md +0 -349
  594. package/docs/providers/perplexity-provider.md +0 -123
  595. package/docs/providers/pixverse.md +0 -165
  596. package/docs/providers/qianfan.md +0 -132
  597. package/docs/providers/qwen-oauth.md +0 -115
  598. package/docs/providers/qwen.md +0 -364
  599. package/docs/providers/runway.md +0 -103
  600. package/docs/providers/senseaudio.md +0 -68
  601. package/docs/providers/sglang.md +0 -161
  602. package/docs/providers/stepfun.md +0 -229
  603. package/docs/providers/synthetic.md +0 -154
  604. package/docs/providers/tencent.md +0 -130
  605. package/docs/providers/together.md +0 -140
  606. package/docs/providers/venice.md +0 -312
  607. package/docs/providers/vercel-ai-gateway.md +0 -128
  608. package/docs/providers/vllm.md +0 -407
  609. package/docs/providers/volcengine.md +0 -199
  610. package/docs/providers/vydra.md +0 -180
  611. package/docs/providers/xai.md +0 -571
  612. package/docs/providers/xiaomi.md +0 -262
  613. package/docs/providers/zai.md +0 -224
  614. package/docs/refactor/access.md +0 -9
  615. package/docs/refactor/acp.md +0 -298
  616. package/docs/refactor/canvas.md +0 -131
  617. package/docs/refactor/database-first.md +0 -2256
  618. package/docs/refactor/ingress-core.md +0 -341
  619. package/docs/reference/AGENTS.default.md +0 -131
  620. package/docs/reference/RELEASING.md +0 -799
  621. package/docs/reference/api-usage-costs.md +0 -208
  622. package/docs/reference/application-modernization-plan.md +0 -208
  623. package/docs/reference/code-mode.md +0 -773
  624. package/docs/reference/credits.md +0 -33
  625. package/docs/reference/device-models.md +0 -50
  626. package/docs/reference/fengming-sdk-api-design.md +0 -390
  627. package/docs/reference/full-release-validation.md +0 -202
  628. package/docs/reference/memory-config.md +0 -604
  629. package/docs/reference/prompt-caching.md +0 -358
  630. package/docs/reference/release-performance-sweep.md +0 -360
  631. package/docs/reference/rich-output-protocol.md +0 -101
  632. package/docs/reference/rpc.md +0 -43
  633. package/docs/reference/secret-placeholder-conventions.md +0 -33
  634. package/docs/reference/secretref-credential-surface.md +0 -159
  635. package/docs/reference/secretref-user-supplied-credentials-matrix.json +0 -663
  636. package/docs/reference/session-management-compaction.md +0 -474
  637. package/docs/reference/templates/AGENTS.dev.md +0 -90
  638. package/docs/reference/templates/AGENTS.md +0 -227
  639. package/docs/reference/templates/BOOT.md +0 -16
  640. package/docs/reference/templates/BOOTSTRAP.md +0 -66
  641. package/docs/reference/templates/CLAUDE.md +0 -1
  642. package/docs/reference/templates/HEARTBEAT.md +0 -24
  643. package/docs/reference/templates/IDENTITY.dev.md +0 -52
  644. package/docs/reference/templates/IDENTITY.md +0 -34
  645. package/docs/reference/templates/SOUL.dev.md +0 -82
  646. package/docs/reference/templates/SOUL.md +0 -49
  647. package/docs/reference/templates/TOOLS.dev.md +0 -29
  648. package/docs/reference/templates/TOOLS.md +0 -51
  649. package/docs/reference/templates/USER.dev.md +0 -23
  650. package/docs/reference/templates/USER.md +0 -28
  651. package/docs/reference/test.md +0 -247
  652. package/docs/reference/token-use.md +0 -246
  653. package/docs/reference/transcript-hygiene.md +0 -214
  654. package/docs/reference/wizard.md +0 -252
  655. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -101
  656. package/docs/security/THREAT-MODEL-ATLAS.md +0 -611
  657. package/docs/security/formal-verification.md +0 -170
  658. package/docs/security/incident-response.md +0 -59
  659. package/docs/security/network-proxy.md +0 -268
  660. package/docs/snippets/plugin-publish/minimal-fengming.plugin.json +0 -12
  661. package/docs/snippets/plugin-publish/minimal-package.json +0 -16
  662. package/docs/specs/claw-supervisor.md +0 -247
  663. package/docs/start/bootstrapping.md +0 -49
  664. package/docs/start/docs-directory.md +0 -69
  665. package/docs/start/fengming.md +0 -252
  666. package/docs/start/getting-started.md +0 -152
  667. package/docs/start/hubs.md +0 -201
  668. package/docs/start/lore.md +0 -223
  669. package/docs/start/onboarding-overview.md +0 -72
  670. package/docs/start/onboarding.md +0 -98
  671. package/docs/start/quickstart.md +0 -25
  672. package/docs/start/setup.md +0 -178
  673. package/docs/start/showcase.md +0 -363
  674. package/docs/start/wizard-cli-automation.md +0 -232
  675. package/docs/start/wizard-cli-reference.md +0 -331
  676. package/docs/start/wizard.md +0 -141
  677. package/docs/style.css +0 -137
  678. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +0 -316
  679. package/docs/tools/acp-agents-setup.md +0 -351
  680. package/docs/tools/acp-agents.md +0 -854
  681. package/docs/tools/agent-send.md +0 -130
  682. package/docs/tools/apply-patch.md +0 -64
  683. package/docs/tools/brave-search.md +0 -139
  684. package/docs/tools/browser-control.md +0 -391
  685. package/docs/tools/browser-linux-troubleshooting.md +0 -173
  686. package/docs/tools/browser-login.md +0 -77
  687. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +0 -219
  688. package/docs/tools/browser.md +0 -810
  689. package/docs/tools/btw.md +0 -159
  690. package/docs/tools/capability-cookbook.md +0 -12
  691. package/docs/tools/clawhub.md +0 -5
  692. package/docs/tools/code-execution.md +0 -173
  693. package/docs/tools/creating-skills.md +0 -158
  694. package/docs/tools/diffs.md +0 -525
  695. package/docs/tools/duckduckgo-search.md +0 -109
  696. package/docs/tools/elevated.md +0 -128
  697. package/docs/tools/exa-search.md +0 -152
  698. package/docs/tools/exec-approvals-advanced.md +0 -444
  699. package/docs/tools/exec-approvals.md +0 -494
  700. package/docs/tools/exec.md +0 -285
  701. package/docs/tools/firecrawl.md +0 -155
  702. package/docs/tools/gemini-search.md +0 -114
  703. package/docs/tools/goal.md +0 -217
  704. package/docs/tools/grok-search.md +0 -129
  705. package/docs/tools/image-generation.md +0 -493
  706. package/docs/tools/index.md +0 -178
  707. package/docs/tools/kimi-search.md +0 -105
  708. package/docs/tools/llm-task.md +0 -137
  709. package/docs/tools/lobster.md +0 -365
  710. package/docs/tools/loop-detection.md +0 -154
  711. package/docs/tools/media-overview.md +0 -160
  712. package/docs/tools/minimax-search.md +0 -102
  713. package/docs/tools/multi-agent-sandbox-tools.md +0 -409
  714. package/docs/tools/music-generation.md +0 -372
  715. package/docs/tools/ollama-search.md +0 -153
  716. package/docs/tools/pdf.md +0 -213
  717. package/docs/tools/perplexity-search.md +0 -220
  718. package/docs/tools/plugin.md +0 -363
  719. package/docs/tools/reactions.md +0 -100
  720. package/docs/tools/searxng-search.md +0 -141
  721. package/docs/tools/skills-config.md +0 -195
  722. package/docs/tools/skills.md +0 -569
  723. package/docs/tools/slash-commands.md +0 -487
  724. package/docs/tools/steer.md +0 -77
  725. package/docs/tools/subagents.md +0 -651
  726. package/docs/tools/tavily.md +0 -162
  727. package/docs/tools/thinking.md +0 -142
  728. package/docs/tools/tokenjuice.md +0 -84
  729. package/docs/tools/tool-search.md +0 -269
  730. package/docs/tools/trajectory.md +0 -229
  731. package/docs/tools/tts.md +0 -1009
  732. package/docs/tools/video-generation.md +0 -555
  733. package/docs/tools/web-fetch.md +0 -210
  734. package/docs/tools/web.md +0 -461
  735. package/docs/tts.md +0 -11
  736. package/docs/vps.md +0 -139
  737. package/docs/web/control-ui.md +0 -512
  738. package/docs/web/dashboard.md +0 -107
  739. package/docs/web/index.md +0 -133
  740. package/docs/web/tui.md +0 -250
  741. package/docs/web/webchat.md +0 -102
  742. package/npm-shrinkwrap.json +0 -12861
  743. package/patches/.gitkeep +0 -0
  744. package/patches/@agentclientprotocol__claude-agent-acp@0.37.0.patch +0 -41
  745. package/pnpm-workspace.yaml +0 -120
  746. package/scripts/crabbox-wrapper.mjs +0 -2004
  747. package/scripts/lib/official-external-channel-catalog.json +0 -560
  748. package/scripts/lib/official-external-plugin-catalog.json +0 -264
  749. package/scripts/lib/official-external-provider-catalog.json +0 -158
  750. package/scripts/lib/package-dist-imports.mjs +0 -171
  751. package/scripts/npm-runner.mjs +0 -91
  752. package/scripts/postinstall-bundled-plugins.mjs +0 -978
  753. package/scripts/preinstall-package-manager-warning.mjs +0 -64
  754. package/scripts/prepare-git-hooks.mjs +0 -72
  755. package/scripts/windows-cmd-helpers.mjs +0 -22
  756. package/skills/batch/SKILL.md +0 -118
  757. package/skills/code-review/SKILL.md +0 -107
  758. package/skills/debug/SKILL.md +0 -83
  759. package/skills/loop/SKILL.md +0 -118
  760. package/skills/run/SKILL.md +0 -79
  761. package/skills/run-skill-generator/SKILL.md +0 -179
  762. package/skills/verify/SKILL.md +0 -103
  763. package/src/agents/templates/HEARTBEAT.md +0 -3
@@ -1,977 +0,0 @@
1
- ---
2
- summary: "Testing kit: unit/e2e/live suites, Docker runners, and what each test covers"
3
- read_when:
4
- - Running tests locally or in CI
5
- - Adding regressions for model/provider bugs
6
- - Debugging gateway + agent behavior
7
- title: "Testing"
8
- ---
9
-
10
- FengMing has three Vitest suites (unit/integration, e2e, live) and a small set
11
- of Docker runners. This doc is a "how we test" guide:
12
-
13
- - What each suite covers (and what it deliberately does _not_ cover).
14
- - Which commands to run for common workflows (local, pre-push, debugging).
15
- - How live tests discover credentials and select models/providers.
16
- - How to add regressions for real-world model/provider issues.
17
-
18
- <Note>
19
- **QA stack (qa-lab, qa-channel, live transport lanes)** is documented separately:
20
-
21
- - [QA overview](/concepts/qa-e2e-automation) - architecture, command surface, scenario authoring.
22
- - [Matrix QA](/concepts/qa-matrix) - reference for `pnpm fengming qa matrix`.
23
- - [QA channel](/channels/qa-channel) - the synthetic transport plugin used by repo-backed scenarios.
24
-
25
- This page covers running the regular test suites and Docker/Parallels runners. The QA-specific runners section below ([QA-specific runners](#qa-specific-runners)) lists the concrete `qa` invocations and points back at the references above.
26
- </Note>
27
-
28
- ## Quick start
29
-
30
- Most days:
31
-
32
- - Full gate (expected before push): `pnpm build && pnpm check && pnpm check:test-types && pnpm test`
33
- - Faster local full-suite run on a roomy machine: `pnpm test:max`
34
- - Direct Vitest watch loop: `pnpm test:watch`
35
- - Direct file targeting now routes extension/channel paths too: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts`
36
- - Prefer targeted runs first when you are iterating on a single failure.
37
- - Docker-backed QA site: `pnpm qa:lab:up`
38
- - Linux VM-backed QA lane: `pnpm fengming qa suite --runner multipass --scenario channel-chat-baseline`
39
-
40
- When you touch tests or want extra confidence:
41
-
42
- - Coverage gate: `pnpm test:coverage`
43
- - E2E suite: `pnpm test:e2e`
44
-
45
- When debugging real providers/models (requires real creds):
46
-
47
- - Live suite (models + gateway tool/image probes): `pnpm test:live`
48
- - Target one live file quietly: `pnpm test:live -- src/agents/models.profiles.live.test.ts`
49
- - Runtime performance reports: dispatch `FengMing Performance` with
50
- `live_openai_candidate=true` for a real `openai/gpt-5.5` agent turn or
51
- `deep_profile=true` for Kova CPU/heap/trace artifacts. Daily scheduled runs
52
- publish mock-provider, deep-profile, and GPT 5.5 lane artifacts to
53
- `fengming/clawgrit-reports` when `CLAWGRIT_REPORTS_TOKEN` is configured. The
54
- mock-provider report also includes source-level gateway boot, memory,
55
- plugin-pressure, repeated fake-model hello-loop, and CLI startup numbers.
56
- - Docker live model sweep: `pnpm test:docker:live-models`
57
- - Each selected model now runs a text turn plus a small file-read-style probe.
58
- Models whose metadata advertises `image` input also run a tiny image turn.
59
- Disable the extra probes with `FENGMING_LIVE_MODEL_FILE_PROBE=0` or
60
- `FENGMING_LIVE_MODEL_IMAGE_PROBE=0` when isolating provider failures.
61
- - CI coverage: daily `FengMing Scheduled Live And E2E Checks` and manual
62
- `FengMing Release Checks` both call the reusable live/E2E workflow with
63
- `include_live_suites: true`, which includes separate Docker live model
64
- matrix jobs sharded by provider.
65
- - For focused CI reruns, dispatch `FengMing Live And E2E Checks (Reusable)`
66
- with `include_live_suites: true` and `live_models_only: true`.
67
- - Add new high-signal provider secrets to `scripts/ci-hydrate-live-auth.sh`
68
- plus `.github/workflows/fengming-live-and-e2e-checks-reusable.yml` and its
69
- scheduled/release callers.
70
- - Native Codex bound-chat smoke: `pnpm test:docker:live-codex-bind`
71
- - Runs a Docker live lane against the Codex app-server path, binds a synthetic
72
- Slack DM with `/codex bind`, exercises `/codex fast` and
73
- `/codex permissions`, then verifies a plain reply and an image attachment
74
- route through the native plugin binding instead of ACP.
75
- - Codex app-server harness smoke: `pnpm test:docker:live-codex-harness`
76
- - Runs gateway agent turns through the plugin-owned Codex app-server harness,
77
- verifies `/codex status` and `/codex models`, and by default exercises image,
78
- cron MCP, sub-agent, and Guardian probes. Disable the sub-agent probe with
79
- `FENGMING_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` when isolating other Codex
80
- app-server failures. For a focused sub-agent check, disable the other probes:
81
- `FENGMING_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 FENGMING_LIVE_CODEX_HARNESS_MCP_PROBE=0 FENGMING_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 FENGMING_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`.
82
- This exits after the sub-agent probe unless
83
- `FENGMING_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0` is set.
84
- - Codex on-demand install smoke: `pnpm test:docker:codex-on-demand`
85
- - Installs the packaged FengMing tarball in Docker, runs OpenAI API-key
86
- onboarding, and verifies the Codex plugin plus `@openai/codex` dependency
87
- were downloaded into the managed npm project root on demand.
88
- - Live plugin tool dependency smoke: `pnpm test:docker:live-plugin-tool`
89
- - Packs a fixture plugin with a real `slugify` dependency, installs it through
90
- `npm-pack:`, verifies the dependency under the managed npm project root,
91
- then asks a live OpenAI model to call the plugin tool and return the hidden
92
- slug.
93
- - Crestodian rescue command smoke: `pnpm test:live:crestodian-rescue-channel`
94
- - Opt-in belt-and-suspenders check for the message-channel rescue command
95
- surface. It exercises `/crestodian status`, queues a persistent model
96
- change, replies `/crestodian yes`, and verifies the audit/config write path.
97
- - Crestodian planner Docker smoke: `pnpm test:docker:crestodian-planner`
98
- - Runs Crestodian in a configless container with a fake Claude CLI on `PATH`
99
- and verifies the fuzzy planner fallback translates into an audited typed
100
- config write.
101
- - Crestodian first-run Docker smoke: `pnpm test:docker:crestodian-first-run`
102
- - Starts from an empty FengMing state dir, verifies the modern onboard
103
- Crestodian entrypoint, applies setup/model/agent/Discord plugin + SecretRef
104
- writes, validates config, and verifies audit entries. The same Ring 0 setup
105
- path is also covered in QA Lab by
106
- `pnpm fengming qa suite --scenario crestodian-ring-zero-setup`.
107
- - Moonshot/Kimi cost smoke: with `MOONSHOT_API_KEY` set, run
108
- `fengming models list --provider moonshot --json`, then run an isolated
109
- `fengming agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json`
110
- against `moonshot/kimi-k2.6`. Verify the JSON reports Moonshot/K2.6 and the
111
- assistant transcript stores normalized `usage.cost`.
112
-
113
- <Tip>
114
- When you only need one failing case, prefer narrowing live tests via the allowlist env vars described below.
115
- </Tip>
116
-
117
- ## QA-specific runners
118
-
119
- These commands sit beside the main test suites when you need QA-lab realism:
120
-
121
- CI runs QA Lab in dedicated workflows. Agentic parity is nested under
122
- `QA-Lab - All Lanes` and release validation, not a standalone PR workflow.
123
- Broad validation should use `Full Release Validation` with
124
- `rerun_group=qa-parity` or the release-checks QA group. Stable/default release
125
- checks keep exhaustive live/Docker soak behind `run_release_soak=true`; the
126
- `full` profile forces soak on. `QA-Lab - All Lanes`
127
- runs nightly on `main` and from manual dispatch with the mock parity lane, live
128
- Matrix lane, Convex-managed live Telegram lane, and Convex-managed live Discord
129
- lane as parallel jobs. Scheduled QA and release checks pass Matrix
130
- `--profile fast` explicitly, while the Matrix CLI and manual workflow input
131
- default remain `all`; manual dispatch can shard `all` into `transport`,
132
- `media`, `e2ee-smoke`, `e2ee-deep`, and `e2ee-cli` jobs. `FengMing Release
133
- Checks` runs parity plus the fast Matrix and Telegram lanes before release
134
- approval, using `mock-openai/gpt-5.5` for release transport checks so they stay
135
- deterministic and avoid normal provider-plugin startup. These live transport
136
- gateways disable memory search; memory behavior stays covered by the QA parity
137
- suites.
138
-
139
- Full release live media shards use
140
- `ghcr.io/fengming/fengming-live-media-runner:ubuntu-24.04`, which already has
141
- `ffmpeg` and `ffprobe`. Docker live model/backend shards use the shared
142
- `ghcr.io/fengming/fengming-live-test:<sha>` image built once per selected
143
- commit, then pull it with `FENGMING_SKIP_DOCKER_BUILD=1` instead of rebuilding
144
- inside every shard.
145
-
146
- - `pnpm fengming qa suite`
147
- - Runs repo-backed QA scenarios directly on the host.
148
- - Runs multiple selected scenarios in parallel by default with isolated
149
- gateway workers. `qa-channel` defaults to concurrency 4 (bounded by the
150
- selected scenario count). Use `--concurrency <count>` to tune the worker
151
- count, or `--concurrency 1` for the older serial lane.
152
- - Exits non-zero when any scenario fails. Use `--allow-failures` when you
153
- want artifacts without a failing exit code.
154
- - Supports provider modes `live-frontier`, `mock-openai`, and `aimock`.
155
- `aimock` starts a local AIMock-backed provider server for experimental
156
- fixture and protocol-mock coverage without replacing the scenario-aware
157
- `mock-openai` lane.
158
- - `pnpm fengming qa coverage --match <query>`
159
- - Searches scenario IDs, titles, surfaces, coverage IDs, docs refs, code refs,
160
- plugins, and provider requirements, then prints matching suite targets.
161
- - Use this before a QA Lab run when you know the touched behavior or file path
162
- but not the smallest scenario. It is advisory only; still choose mock,
163
- live, Multipass, Matrix, or transport proof from the behavior being changed.
164
- - `pnpm test:plugins:kitchen-sink-live`
165
- - Runs the live OpenAI Kitchen Sink plugin gauntlet through QA Lab. It
166
- installs the external Kitchen Sink package, verifies the plugin SDK surface
167
- inventory, probes `/healthz` and `/readyz`, records gateway CPU/RSS
168
- evidence, runs a live OpenAI turn, and checks adversarial diagnostics.
169
- Requires live OpenAI auth such as `OPENAI_API_KEY`. In hydrated Testbox
170
- sessions it automatically sources the Testbox live-auth profile when the
171
- `fengming-testbox-env` helper is present.
172
- - `pnpm test:gateway:cpu-scenarios`
173
- - Runs the gateway startup bench plus a small mock QA Lab scenario pack
174
- (`channel-chat-baseline`, `memory-failure-fallback`,
175
- `gateway-restart-inflight-run`) and writes a combined CPU observation
176
- summary under `.artifacts/gateway-cpu-scenarios/`.
177
- - Flags only sustained hot CPU observations by default (`--cpu-core-warn`
178
- plus `--hot-wall-warn-ms`), so short startup bursts are recorded as metrics
179
- without looking like the minutes-long gateway peg regression.
180
- - Uses built `dist` artifacts; run a build first when the checkout does not
181
- already have fresh runtime output.
182
- - `pnpm fengming qa suite --runner multipass`
183
- - Runs the same QA suite inside a disposable Multipass Linux VM.
184
- - Keeps the same scenario-selection behavior as `qa suite` on the host.
185
- - Reuses the same provider/model selection flags as `qa suite`.
186
- - Live runs forward the supported QA auth inputs that are practical for the guest:
187
- env-based provider keys, the QA live provider config path, and `CODEX_HOME`
188
- when present.
189
- - Output dirs must stay under the repo root so the guest can write back through
190
- the mounted workspace.
191
- - Writes the normal QA report + summary plus Multipass logs under
192
- `.artifacts/qa-e2e/...`.
193
- - `pnpm qa:lab:up`
194
- - Starts the Docker-backed QA site for operator-style QA work.
195
- - `pnpm test:docker:npm-onboard-channel-agent`
196
- - Builds an npm tarball from the current checkout, installs it globally in
197
- Docker, runs non-interactive OpenAI API-key onboarding, configures Telegram
198
- by default, verifies the packaged plugin runtime loads without startup
199
- dependency repair, runs doctor, and runs one local agent turn against a
200
- mocked OpenAI endpoint.
201
- - Use `FENGMING_NPM_ONBOARD_CHANNEL=discord` to run the same packaged-install
202
- lane with Discord.
203
- - `pnpm test:docker:session-runtime-context`
204
- - Runs a deterministic built-app Docker smoke for embedded runtime context
205
- transcripts. It verifies hidden FengMing runtime context is persisted as a
206
- non-display custom message instead of leaking into the visible user turn,
207
- then seeds an affected broken session JSONL and verifies
208
- `fengming doctor --fix` rewrites it to the active branch with a backup.
209
- - `pnpm test:docker:npm-telegram-live`
210
- - Installs an FengMing package candidate in Docker, runs installed-package
211
- onboarding, configures Telegram through the installed CLI, then reuses the
212
- live Telegram QA lane with that installed package as the SUT Gateway.
213
- - The wrapper mounts only the `qa-lab` harness source from the checkout; the
214
- installed package owns `dist`, `fengming/plugin-sdk`, and bundled plugin
215
- runtime so the lane does not mix current checkout plugins into the package
216
- under test.
217
- - Defaults to `FENGMING_NPM_TELEGRAM_PACKAGE_SPEC=fengming@beta`; set
218
- `FENGMING_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/fengming-current.tgz` or
219
- `FENGMING_CURRENT_PACKAGE_TGZ` to test a resolved local tarball instead of
220
- installing from the registry.
221
- - Uses the same Telegram env credentials or Convex credential source as
222
- `pnpm fengming qa telegram`. For CI/release automation, set
223
- `FENGMING_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex` plus
224
- `FENGMING_QA_CONVEX_SITE_URL` and the role secret. If
225
- `FENGMING_QA_CONVEX_SITE_URL` and a Convex role secret are present in CI,
226
- the Docker wrapper selects Convex automatically.
227
- - The wrapper validates Telegram or Convex credential env on the host before
228
- Docker build/install work. Set `FENGMING_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1`
229
- only when deliberately debugging pre-credential setup.
230
- - `FENGMING_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` overrides the shared
231
- `FENGMING_QA_CREDENTIAL_ROLE` for this lane only.
232
- - GitHub Actions exposes this lane as the manual maintainer workflow
233
- `NPM Telegram Beta E2E`. It does not run on merge. The workflow uses the
234
- `qa-live-shared` environment and Convex CI credential leases.
235
- - GitHub Actions also exposes `Package Acceptance` for side-run product proof
236
- against one candidate package. It accepts a trusted ref, published npm spec,
237
- HTTPS tarball URL plus SHA-256, or tarball artifact from another run, uploads
238
- the normalized `fengming-current.tgz` as `package-under-test`, then runs the
239
- existing Docker E2E scheduler with smoke, package, product, full, or custom
240
- lane profiles. Set `telegram_mode=mock-openai` or `live-frontier` to run the
241
- Telegram QA workflow against the same `package-under-test` artifact.
242
- - Latest beta product proof:
243
-
244
- ```bash
245
- gh workflow run package-acceptance.yml --ref main \
246
- -f source=npm \
247
- -f package_spec=fengming@beta \
248
- -f suite_profile=product \
249
- -f telegram_mode=mock-openai
250
- ```
251
-
252
- - Exact tarball URL proof requires a digest and uses the public URL safety policy:
253
-
254
- ```bash
255
- gh workflow run package-acceptance.yml --ref main \
256
- -f source=url \
257
- -f package_url=https://registry.npmjs.org/fengming/-/fengming-VERSION.tgz \
258
- -f package_sha256=<sha256> \
259
- -f suite_profile=package
260
- ```
261
-
262
- - Enterprise/private tarball mirrors use an explicit trusted-source policy:
263
-
264
- ```bash
265
- gh workflow run package-acceptance.yml --ref main \
266
- -f source=trusted-url \
267
- -f trusted_source_id=enterprise-artifactory \
268
- -f package_url=https://packages.example.internal:8443/artifactory/fengming/fengming-VERSION.tgz \
269
- -f package_sha256=<sha256> \
270
- -f suite_profile=package
271
- ```
272
-
273
- `source=trusted-url` reads `.github/package-trusted-sources.json` from the trusted workflow ref and does not accept URL credentials or a workflow-input private-network bypass. If the named policy declares bearer auth, configure the fixed `FENGMING_TRUSTED_PACKAGE_TOKEN` secret.
274
-
275
- - Artifact proof downloads a tarball artifact from another Actions run:
276
-
277
- ```bash
278
- gh workflow run package-acceptance.yml --ref main \
279
- -f source=artifact \
280
- -f artifact_run_id=<run-id> \
281
- -f artifact_name=<artifact-name> \
282
- -f suite_profile=smoke
283
- ```
284
-
285
- - `pnpm test:docker:plugins`
286
- - Packs and installs the current FengMing build in Docker, starts the Gateway
287
- with OpenAI configured, then enables bundled channel/plugins via config
288
- edits.
289
- - Verifies setup discovery leaves unconfigured downloadable plugins absent,
290
- the first configured doctor repair installs each missing downloadable
291
- plugin explicitly, and a second restart does not run hidden dependency
292
- repair.
293
- - Also installs a known older npm baseline, enables Telegram before running
294
- `fengming update --tag <candidate>`, and verifies the candidate's
295
- post-update doctor cleans legacy plugin dependency debris without a
296
- harness-side postinstall repair.
297
- - `pnpm test:parallels:npm-update`
298
- - Runs the native packaged-install update smoke across Parallels guests. Each
299
- selected platform first installs the requested baseline package, then runs
300
- the installed `fengming update` command in the same guest and verifies the
301
- installed version, update status, gateway readiness, and one local agent
302
- turn.
303
- - Use `--platform macos`, `--platform windows`, or `--platform linux` while
304
- iterating on one guest. Use `--json` for the summary artifact path and
305
- per-lane status.
306
- - The OpenAI lane uses `openai/gpt-5.5` for the live agent-turn proof by
307
- default. Pass `--model <provider/model>` or set
308
- `FENGMING_PARALLELS_OPENAI_MODEL` when deliberately validating another
309
- OpenAI model.
310
- - Wrap long local runs in a host timeout so Parallels transport stalls cannot
311
- consume the rest of the testing window:
312
-
313
- ```bash
314
- timeout --foreground 150m pnpm test:parallels:npm-update -- --json
315
- timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json
316
- ```
317
-
318
- - The script writes nested lane logs under `/tmp/fengming-parallels-npm-update.*`.
319
- Inspect `windows-update.log`, `macos-update.log`, or `linux-update.log`
320
- before assuming the outer wrapper is hung.
321
- - Windows update can spend 10 to 15 minutes in post-update doctor and package
322
- update work on a cold guest; that is still healthy when the nested npm
323
- debug log is advancing.
324
- - Do not run this aggregate wrapper in parallel with individual Parallels
325
- macOS, Windows, or Linux smoke lanes. They share VM state and can collide on
326
- snapshot restore, package serving, or guest gateway state.
327
- - The post-update proof runs the normal bundled plugin surface because
328
- capability facades such as speech, image generation, and media
329
- understanding are loaded through bundled runtime APIs even when the agent
330
- turn itself only checks a simple text response.
331
-
332
- - `pnpm fengming qa aimock`
333
- - Starts only the local AIMock provider server for direct protocol smoke
334
- testing.
335
- - `pnpm fengming qa matrix`
336
- - Runs the Matrix live QA lane against a disposable Docker-backed Tuwunel homeserver. Source-checkout only - packaged installs do not ship `qa-lab`.
337
- - Full CLI, profile/scenario catalog, env vars, and artifact layout: [Matrix QA](/concepts/qa-matrix).
338
- - `pnpm fengming qa telegram`
339
- - Runs the Telegram live QA lane against a real private group using the driver and SUT bot tokens from env.
340
- - Requires `FENGMING_QA_TELEGRAM_GROUP_ID`, `FENGMING_QA_TELEGRAM_DRIVER_BOT_TOKEN`, and `FENGMING_QA_TELEGRAM_SUT_BOT_TOKEN`. The group id must be the numeric Telegram chat id.
341
- - Supports `--credential-source convex` for shared pooled credentials. Use env mode by default, or set `FENGMING_QA_CREDENTIAL_SOURCE=convex` to opt into pooled leases.
342
- - Defaults cover canary, mention gating, command addressing, `/status`, bot-to-bot mentioned replies, and core native command replies. `mock-openai` defaults also cover deterministic reply-chain and Telegram final-message streaming regressions. Use `--list-scenarios` for optional probes such as `session_status`.
343
- - Exits non-zero when any scenario fails. Use `--allow-failures` when you
344
- want artifacts without a failing exit code.
345
- - Requires two distinct bots in the same private group, with the SUT bot exposing a Telegram username.
346
- - For stable bot-to-bot observation, enable Bot-to-Bot Communication Mode in `@BotFather` for both bots and ensure the driver bot can observe group bot traffic.
347
- - Writes a Telegram QA report, summary, and observed-messages artifact under `.artifacts/qa-e2e/...`. Replying scenarios include RTT from driver send request to observed SUT reply.
348
-
349
- `Mantis Telegram Live` is the PR-evidence wrapper around this lane. It runs the
350
- candidate ref with Convex-leased Telegram credentials, renders the redacted
351
- observed-message transcript in a Crabbox desktop browser, records MP4 evidence,
352
- generates a motion-trimmed GIF, uploads the artifact bundle, and posts inline PR
353
- evidence through the Mantis GitHub App when `pr_number` is set. Maintainers can
354
- start it from the Actions UI through `Mantis Scenario` (`scenario_id:
355
- telegram-live`) or directly from a pull request comment:
356
-
357
- ```text
358
- @fengming-mantis telegram
359
- @fengming-mantis telegram scenario=telegram-status-command
360
- @fengming-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-reply
361
- ```
362
-
363
- `Mantis Telegram Desktop Proof` is the agentic native Telegram Desktop
364
- before/after wrapper for PR visual proof. Start it from the Actions UI with
365
- freeform `instructions`, through `Mantis Scenario` (`scenario_id:
366
- telegram-desktop-proof`), or from a PR comment:
367
-
368
- ```text
369
- @fengming-mantis telegram desktop proof
370
- ```
371
-
372
- The Mantis agent reads the PR, decides what Telegram-visible behavior proves the
373
- change, runs the real-user Crabbox Telegram Desktop proof lane on baseline and
374
- candidate refs, iterates until the native GIFs are useful, writes a paired
375
- `motionPreview` manifest, and posts the same 2-column GIF table through the
376
- Mantis GitHub App when `pr_number` is set.
377
-
378
- - `pnpm fengming qa mantis telegram-desktop-builder`
379
- - Leases or reuses a Crabbox Linux desktop, installs native Telegram Desktop, configures FengMing with a leased Telegram SUT bot token, starts the gateway, and records screenshot/MP4 evidence from the visible VNC desktop.
380
- - Defaults to `--credential-source convex` so workflows only need the Convex broker secret. Use `--credential-source env` with the same `FENGMING_QA_TELEGRAM_*` variables as `pnpm fengming qa telegram`.
381
- - Telegram Desktop still needs a user login/profile. The bot token configures FengMing only. Use `--telegram-profile-archive-env <name>` for a base64 `.tgz` profile archive, or use `--keep-lease` and log in manually through VNC once.
382
- - Writes `mantis-telegram-desktop-builder-report.md`, `mantis-telegram-desktop-builder-summary.json`, `telegram-desktop-builder.png`, and `telegram-desktop-builder.mp4` under the output directory.
383
-
384
- Live transport lanes share one standard contract so new transports do not drift; the per-lane coverage matrix lives in [QA overview → Live transport coverage](/concepts/qa-e2e-automation#live-transport-coverage). `qa-channel` is the broad synthetic suite and is not part of that matrix.
385
-
386
- ### Shared Telegram credentials via Convex (v1)
387
-
388
- When `--credential-source convex` (or `FENGMING_QA_CREDENTIAL_SOURCE=convex`) is enabled for
389
- live transport QA, QA lab acquires an exclusive lease from a Convex-backed pool, heartbeats that
390
- lease while the lane is running, and releases the lease on shutdown. The section name predates
391
- Discord, Slack, and WhatsApp support; the lease contract is shared across kinds.
392
-
393
- Reference Convex project scaffold:
394
-
395
- - `qa/convex-credential-broker/`
396
-
397
- Required env vars:
398
-
399
- - `FENGMING_QA_CONVEX_SITE_URL` (for example `https://your-deployment.convex.site`)
400
- - One secret for the selected role:
401
- - `FENGMING_QA_CONVEX_SECRET_MAINTAINER` for `maintainer`
402
- - `FENGMING_QA_CONVEX_SECRET_CI` for `ci`
403
- - Credential role selection:
404
- - CLI: `--credential-role maintainer|ci`
405
- - Env default: `FENGMING_QA_CREDENTIAL_ROLE` (defaults to `ci` in CI, `maintainer` otherwise)
406
-
407
- Optional env vars:
408
-
409
- - `FENGMING_QA_CREDENTIAL_LEASE_TTL_MS` (default `1200000`)
410
- - `FENGMING_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (default `30000`)
411
- - `FENGMING_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (default `90000`)
412
- - `FENGMING_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`)
413
- - `FENGMING_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`)
414
- - `FENGMING_QA_CREDENTIAL_OWNER_ID` (optional trace id)
415
- - `FENGMING_QA_ALLOW_INSECURE_HTTP=1` allows loopback `http://` Convex URLs for local-only development.
416
-
417
- `FENGMING_QA_CONVEX_SITE_URL` should use `https://` in normal operation.
418
-
419
- Maintainer admin commands (pool add/remove/list) require
420
- `FENGMING_QA_CONVEX_SECRET_MAINTAINER` specifically.
421
-
422
- CLI helpers for maintainers:
423
-
424
- ```bash
425
- pnpm fengming qa credentials doctor
426
- pnpm fengming qa credentials add --kind telegram --payload-file qa/telegram-credential.json
427
- pnpm fengming qa credentials list --kind telegram
428
- pnpm fengming qa credentials remove --credential-id <credential-id>
429
- ```
430
-
431
- Use `doctor` before live runs to check the Convex site URL, broker secrets,
432
- endpoint prefix, HTTP timeout, and admin/list reachability without printing
433
- secret values. Use `--json` for machine-readable output in scripts and CI
434
- utilities.
435
-
436
- Default endpoint contract (`FENGMING_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`):
437
-
438
- - `POST /acquire`
439
- - Request: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }`
440
- - Success: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }`
441
- - Exhausted/retryable: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }`
442
- - `POST /payload-chunk`
443
- - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, index }`
444
- - Success: `{ status: "ok", index, data }`
445
- - `POST /heartbeat`
446
- - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }`
447
- - Success: `{ status: "ok" }` (or empty `2xx`)
448
- - `POST /release`
449
- - Request: `{ kind, ownerId, actorRole, credentialId, leaseToken }`
450
- - Success: `{ status: "ok" }` (or empty `2xx`)
451
- - `POST /admin/add` (maintainer secret only)
452
- - Request: `{ kind, actorId, payload, note?, status? }`
453
- - Success: `{ status: "ok", credential }`
454
- - `POST /admin/remove` (maintainer secret only)
455
- - Request: `{ credentialId, actorId }`
456
- - Success: `{ status: "ok", changed, credential }`
457
- - Active lease guard: `{ status: "error", code: "LEASE_ACTIVE", ... }`
458
- - `POST /admin/list` (maintainer secret only)
459
- - Request: `{ kind?, status?, includePayload?, limit? }`
460
- - Success: `{ status: "ok", credentials, count }`
461
-
462
- Payload shape for Telegram kind:
463
-
464
- - `{ groupId: string, driverToken: string, sutToken: string }`
465
- - `groupId` must be a numeric Telegram chat id string.
466
- - `admin/add` validates this shape for `kind: "telegram"` and rejects malformed payloads.
467
-
468
- Payload shape for Telegram real-user kind:
469
-
470
- - `{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }`
471
- - `groupId`, `testerUserId`, and `telegramApiId` must be numeric strings.
472
- - `tdlibArchiveSha256` and `desktopTdataArchiveSha256` must be SHA-256 hex strings.
473
- - `kind: "telegram-user"` is reserved for the Mantis Telegram Desktop proof workflow. Generic QA Lab lanes must not acquire it.
474
-
475
- Broker-validated multi-channel payloads:
476
-
477
- - Discord: `{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string }`
478
- - WhatsApp: `{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }`
479
-
480
- Slack lanes can also lease from the pool, but Slack payload validation currently
481
- lives in the Slack QA runner rather than the broker. Use
482
- `{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }`
483
- for Slack rows.
484
-
485
- ### Adding a channel to QA
486
-
487
- The architecture and scenario-helper names for new channel adapters live in [QA overview → Adding a channel](/concepts/qa-e2e-automation#adding-a-channel). The minimum bar: implement the transport runner on the shared `qa-lab` host seam, declare `qaRunners` in the plugin manifest, mount as `fengming qa <runner>`, and author scenarios under `qa/scenarios/`.
488
-
489
- ## Test suites (what runs where)
490
-
491
- Think of the suites as "increasing realism" (and increasing flakiness/cost):
492
-
493
- ### Unit / integration (default)
494
-
495
- - Command: `pnpm test`
496
- - Config: untargeted runs use the `vitest.full-*.config.ts` shard set and may expand multi-project shards into per-project configs for parallel scheduling
497
- - Files: core/unit inventories under `src/**/*.test.ts`, `packages/**/*.test.ts`, and `test/**/*.test.ts`; UI unit tests run in the dedicated `unit-ui` shard
498
- - Scope:
499
- - Pure unit tests
500
- - In-process integration tests (gateway auth, routing, tooling, parsing, config)
501
- - Deterministic regressions for known bugs
502
- - Expectations:
503
- - Runs in CI
504
- - No real keys required
505
- - Should be fast and stable
506
- - Resolver and public-surface loader tests must prove broad `api.js` and
507
- `runtime-api.js` fallback behavior with generated tiny plugin fixtures, not
508
- real bundled plugin source APIs. Real plugin API loads belong in
509
- plugin-owned contract/integration suites.
510
-
511
- Native dependency policy:
512
-
513
- - Default test installs skip optional native Discord opus builds. Discord voice uses bundled `libopus-wasm`, and `@discordjs/opus` stays disabled in `allowBuilds` so local tests and Testbox lanes do not compile the native addon.
514
- - Compare native opus performance in the `libopus-wasm` benchmark repo, not in default FengMing install/test loops. Do not set `@discordjs/opus` to `true` in the default `allowBuilds`; that makes unrelated install/test loops compile native code.
515
-
516
- <AccordionGroup>
517
- <Accordion title="Projects, shards, and scoped lanes">
518
-
519
- - Untargeted `pnpm test` runs twelve smaller shard configs (`core-unit-fast`, `core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) instead of one giant native root-project process. This cuts peak RSS on loaded machines and avoids auto-reply/extension work starving unrelated suites.
520
- - `pnpm test --watch` still uses the native root `vitest.config.ts` project graph, because a multi-shard watch loop is not practical.
521
- - `pnpm test`, `pnpm test:watch`, and `pnpm test:perf:imports` route explicit file/directory targets through scoped lanes first, so `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` avoids paying the full root project startup tax.
522
- - `pnpm test:changed` expands changed git paths into cheap scoped lanes by default: direct test edits, sibling `*.test.ts` files, explicit source mappings, and local import-graph dependents. Config/setup/package edits do not broad-run tests unless you explicitly use `FENGMING_TEST_CHANGED_BROAD=1 pnpm test:changed`.
523
- - `pnpm check:changed` is the normal smart local check gate for narrow work. It classifies the diff into core, core tests, extensions, extension tests, apps, docs, release metadata, live Docker tooling, and tooling, then runs the matching typecheck, lint, and guard commands. It does not run Vitest tests; call `pnpm test:changed` or explicit `pnpm test <target>` for test proof. Release metadata-only version bumps run targeted version/config/root-dependency checks, with a guard that rejects package changes outside the top-level version field.
524
- - Live Docker ACP harness edits run focused checks: shell syntax for the live Docker auth scripts and a live Docker scheduler dry-run. `package.json` changes are included only when the diff is limited to `scripts["test:docker:live-*"]`; dependency, export, version, and other package-surface edits still use the broader guards.
525
- - Import-light unit tests from agents, commands, plugins, auto-reply helpers, `plugin-sdk`, and similar pure utility areas route through the `unit-fast` lane, which skips `test/setup-fengming-runtime.ts`; stateful/runtime-heavy files stay on the existing lanes.
526
- - Selected `plugin-sdk` and `commands` helper source files also map changed-mode runs to explicit sibling tests in those light lanes, so helper edits avoid rerunning the full heavy suite for that directory.
527
- - `auto-reply` has dedicated buckets for top-level core helpers, top-level `reply.*` integration tests, and the `src/auto-reply/reply/**` subtree. CI further splits the reply subtree into agent-runner, dispatch, and commands/state-routing shards so one import-heavy bucket does not own the full Node tail.
528
- - Normal PR/main CI intentionally skips the extension batch sweep and release-only `agentic-plugins` shard. Full Release Validation dispatches the separate `Plugin Prerelease` child workflow for those plugin/extension-heavy suites on release candidates.
529
-
530
- </Accordion>
531
-
532
- <Accordion title="Embedded runner coverage">
533
-
534
- - When you change message-tool discovery inputs or compaction runtime
535
- context, keep both levels of coverage.
536
- - Add focused helper regressions for pure routing and normalization
537
- boundaries.
538
- - Keep the embedded runner integration suites healthy:
539
- `src/agents/embedded-agent-runner/compact.hooks.test.ts`,
540
- `src/agents/embedded-agent-runner/run.overflow-compaction.test.ts`, and
541
- `src/agents/embedded-agent-runner/run.overflow-compaction.loop.test.ts`.
542
- - Those suites verify that scoped ids and compaction behavior still flow
543
- through the real `run.ts` / `compact.ts` paths; helper-only tests are
544
- not a sufficient substitute for those integration paths.
545
-
546
- </Accordion>
547
-
548
- <Accordion title="Vitest pool and isolation defaults">
549
-
550
- - Base Vitest config defaults to `threads`.
551
- - The shared Vitest config fixes `isolate: false` and uses the
552
- non-isolated runner across the root projects, e2e, and live configs.
553
- - The root UI lane keeps its `jsdom` setup and optimizer, but runs on the
554
- shared non-isolated runner too.
555
- - Each `pnpm test` shard inherits the same `threads` + `isolate: false`
556
- defaults from the shared Vitest config.
557
- - `scripts/run-vitest.mjs` adds `--no-maglev` for Vitest child Node
558
- processes by default to reduce V8 compile churn during big local runs.
559
- Set `FENGMING_VITEST_ENABLE_MAGLEV=1` to compare against stock V8
560
- behavior.
561
- - `scripts/run-vitest.mjs` terminates explicit non-watch Vitest runs after
562
- 5 minutes with no stdout or stderr output. Set
563
- `FENGMING_VITEST_NO_OUTPUT_TIMEOUT_MS=0` to disable the watchdog for an
564
- intentionally silent investigation.
565
-
566
- </Accordion>
567
-
568
- <Accordion title="Fast local iteration">
569
-
570
- - `pnpm changed:lanes` shows which architectural lanes a diff triggers.
571
- - The pre-commit hook is formatting-only. It restages formatted files and
572
- does not run lint, typecheck, or tests.
573
- - Run `pnpm check:changed` explicitly before handoff or push when you
574
- need the smart local check gate.
575
- - `pnpm test:changed` routes through cheap scoped lanes by default. Use
576
- `FENGMING_TEST_CHANGED_BROAD=1 pnpm test:changed` only when the agent
577
- decides a harness, config, package, or contract edit really needs broader
578
- Vitest coverage.
579
- - `pnpm test:max` and `pnpm test:changed:max` keep the same routing
580
- behavior, just with a higher worker cap.
581
- - Local worker auto-scaling is intentionally conservative and backs off
582
- when the host load average is already high, so multiple concurrent
583
- Vitest runs do less damage by default.
584
- - The base Vitest config marks the projects/config files as
585
- `forceRerunTriggers` so changed-mode reruns stay correct when test
586
- wiring changes.
587
- - The config keeps `FENGMING_VITEST_FS_MODULE_CACHE` enabled on supported
588
- hosts; set `FENGMING_VITEST_FS_MODULE_CACHE_PATH=/abs/path` if you want
589
- one explicit cache location for direct profiling.
590
-
591
- </Accordion>
592
-
593
- <Accordion title="Perf debugging">
594
-
595
- - `pnpm test:perf:imports` enables Vitest import-duration reporting plus
596
- import-breakdown output.
597
- - `pnpm test:perf:imports:changed` scopes the same profiling view to
598
- files changed since `origin/main`.
599
- - Shard timing data is written to `.artifacts/vitest-shard-timings.json`.
600
- Whole-config runs use the config path as the key; include-pattern CI
601
- shards append the shard name so filtered shards can be tracked
602
- separately.
603
- - When one hot test still spends most of its time in startup imports,
604
- keep heavy dependencies behind a narrow local `*.runtime.ts` seam and
605
- mock that seam directly instead of deep-importing runtime helpers just
606
- to pass them through `vi.mock(...)`.
607
- - `pnpm test:perf:changed:bench -- --ref <git-ref>` compares routed
608
- `test:changed` against the native root-project path for that committed
609
- diff and prints wall time plus macOS max RSS.
610
- - `pnpm test:perf:changed:bench -- --worktree` benchmarks the current
611
- dirty tree by routing the changed file list through
612
- `scripts/test-projects.mjs` and the root Vitest config.
613
- - `pnpm test:perf:profile:main` writes a main-thread CPU profile for
614
- Vitest/Vite startup and transform overhead.
615
- - `pnpm test:perf:profile:runner` writes runner CPU+heap profiles for the
616
- unit suite with file parallelism disabled.
617
-
618
- </Accordion>
619
- </AccordionGroup>
620
-
621
- ### Stability (gateway)
622
-
623
- - Command: `pnpm test:stability:gateway`
624
- - Config: `vitest.gateway.config.ts`, forced to one worker
625
- - Scope:
626
- - Starts a real loopback Gateway with diagnostics enabled by default
627
- - Drives synthetic gateway message, memory, and large-payload churn through the diagnostic event path
628
- - Queries `diagnostics.stability` over the Gateway WS RPC
629
- - Covers diagnostic stability bundle persistence helpers
630
- - Asserts the recorder remains bounded, synthetic RSS samples stay under the pressure budget, and per-session queue depths drain back to zero
631
- - Expectations:
632
- - CI-safe and keyless
633
- - Narrow lane for stability-regression follow-up, not a substitute for the full Gateway suite
634
-
635
- ### E2E (repo aggregate)
636
-
637
- - Command: `pnpm test:e2e`
638
- - Scope:
639
- - Runs the gateway smoke E2E lane
640
- - Runs the mocked Control UI browser E2E lane
641
- - Expectations:
642
- - CI-safe and keyless
643
- - Requires Playwright Chromium to be installed
644
-
645
- ### E2E (gateway smoke)
646
-
647
- - Command: `pnpm test:e2e:gateway`
648
- - Config: `vitest.e2e.config.ts`
649
- - Files: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`, and bundled-plugin E2E tests under `extensions/`
650
- - Runtime defaults:
651
- - Uses Vitest `threads` with `isolate: false`, matching the rest of the repo.
652
- - Uses adaptive workers (CI: up to 2, local: 1 by default).
653
- - Runs in silent mode by default to reduce console I/O overhead.
654
- - Useful overrides:
655
- - `FENGMING_E2E_WORKERS=<n>` to force worker count (capped at 16).
656
- - `FENGMING_E2E_VERBOSE=1` to re-enable verbose console output.
657
- - Scope:
658
- - Multi-instance gateway end-to-end behavior
659
- - WebSocket/HTTP surfaces, node pairing, and heavier networking
660
- - Expectations:
661
- - Runs in CI (when enabled in the pipeline)
662
- - No real keys required
663
- - More moving parts than unit tests (can be slower)
664
-
665
- ### E2E (Control UI mocked browser)
666
-
667
- - Command: `pnpm test:ui:e2e`
668
- - Config: `test/vitest/vitest.ui-e2e.config.ts`
669
- - Files: `ui/src/**/*.e2e.test.ts`
670
- - Scope:
671
- - Starts the Vite Control UI
672
- - Drives a real Chromium page through Playwright
673
- - Replaces the Gateway WebSocket with deterministic in-browser mocks
674
- - Expectations:
675
- - Runs in CI as part of `pnpm test:e2e`
676
- - No real Gateway, agents, or provider keys required
677
- - Browser dependency must be present (`pnpm --dir ui exec playwright install chromium`)
678
-
679
- ### E2E: OpenShell backend smoke
680
-
681
- - Command: `pnpm test:e2e:openshell`
682
- - File: `extensions/openshell/src/backend.e2e.test.ts`
683
- - Scope:
684
- - Starts an isolated OpenShell gateway on the host via Docker
685
- - Creates a sandbox from a temporary local Dockerfile
686
- - Exercises FengMing's OpenShell backend over real `sandbox ssh-config` + SSH exec
687
- - Verifies remote-canonical filesystem behavior through the sandbox fs bridge
688
- - Expectations:
689
- - Opt-in only; not part of the default `pnpm test:e2e` run
690
- - Requires a local `openshell` CLI plus a working Docker daemon
691
- - Uses isolated `HOME` / `XDG_CONFIG_HOME`, then destroys the test gateway and sandbox
692
- - Useful overrides:
693
- - `FENGMING_E2E_OPENSHELL=1` to enable the test when running the broader e2e suite manually
694
- - `FENGMING_E2E_OPENSHELL_COMMAND=/path/to/openshell` to point at a non-default CLI binary or wrapper script
695
-
696
- ### Live (real providers + real models)
697
-
698
- - Command: `pnpm test:live`
699
- - Config: `vitest.live.config.ts`
700
- - Files: `src/**/*.live.test.ts`, `test/**/*.live.test.ts`, and bundled-plugin live tests under `extensions/`
701
- - Default: **enabled** by `pnpm test:live` (sets `FENGMING_LIVE_TEST=1`)
702
- - Scope:
703
- - "Does this provider/model actually work _today_ with real creds?"
704
- - Catch provider format changes, tool-calling quirks, auth issues, and rate limit behavior
705
- - Expectations:
706
- - Not CI-stable by design (real networks, real provider policies, quotas, outages)
707
- - Costs money / uses rate limits
708
- - Prefer running narrowed subsets instead of "everything"
709
- - Live runs use already-exported API keys and staged auth profiles.
710
- - By default, live runs still isolate `HOME` and copy config/auth material into a temp test home so unit fixtures cannot mutate your real `~/.fengming`.
711
- - Set `FENGMING_LIVE_USE_REAL_HOME=1` only when you intentionally need live tests to use your real home directory.
712
- - `pnpm test:live` defaults to a quieter mode: it keeps `[live] ...` progress output and mutes gateway bootstrap logs/Bonjour chatter. Set `FENGMING_LIVE_TEST_QUIET=0` if you want the full startup logs back.
713
- - API key rotation (provider-specific): set `*_API_KEYS` with comma/semicolon format or `*_API_KEY_1`, `*_API_KEY_2` (for example `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) or per-live override via `FENGMING_LIVE_*_KEY`; tests retry on rate limit responses.
714
- - Progress/heartbeat output:
715
- - Live suites now emit progress lines to stderr so long provider calls are visibly active even when Vitest console capture is quiet.
716
- - `vitest.live.config.ts` disables Vitest console interception so provider/gateway progress lines stream immediately during live runs.
717
- - Tune direct-model heartbeats with `FENGMING_LIVE_HEARTBEAT_MS`.
718
- - Tune gateway/probe heartbeats with `FENGMING_LIVE_GATEWAY_HEARTBEAT_MS`.
719
-
720
- ## Which suite should I run?
721
-
722
- Use this decision table:
723
-
724
- - Editing logic/tests: run `pnpm test` (and `pnpm test:coverage` if you changed a lot)
725
- - Touching gateway networking / WS protocol / pairing: add `pnpm test:e2e`
726
- - Debugging "my bot is down" / provider-specific failures / tool calling: run a narrowed `pnpm test:live`
727
-
728
- ## Live (network-touching) tests
729
-
730
- For the live model matrix, CLI backend smokes, ACP smokes, Codex app-server
731
- harness, and all media-provider live tests (Deepgram, BytePlus, ComfyUI, image,
732
- music, video, media harness) - plus credential handling for live runs - see
733
- [Testing live suites](/help/testing-live). For the dedicated update and
734
- plugin validation checklist, see
735
- [Testing updates and plugins](/help/testing-updates-plugins).
736
-
737
- ## Docker runners (optional "works in Linux" checks)
738
-
739
- These Docker runners split into two buckets:
740
-
741
- - Live-model runners: `test:docker:live-models` and `test:docker:live-gateway` run only their matching profile-key live file inside the repo Docker image (`src/agents/models.profiles.live.test.ts` and `src/gateway/gateway-models.profiles.live.test.ts`), mounting your local config dir, workspace, and optional profile env file. The matching local entrypoints are `test:live:models-profiles` and `test:live:gateway-profiles`.
742
- - Docker live runners keep their own practical caps where needed:
743
- `test:docker:live-models` defaults to the curated supported high-signal set, and
744
- `test:docker:live-gateway` defaults to `FENGMING_LIVE_GATEWAY_SMOKE=1`,
745
- `FENGMING_LIVE_GATEWAY_MAX_MODELS=8`,
746
- `FENGMING_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, and
747
- `FENGMING_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Set `FENGMING_LIVE_MAX_MODELS`
748
- or the gateway env vars when you explicitly want a smaller cap or larger scan.
749
- - `test:docker:all` builds the live Docker image once via `test:docker:live-build`, packs FengMing once as an npm tarball through `scripts/package-fengming-for-docker.mjs`, then builds/reuses two `scripts/e2e/Dockerfile` images. The bare image is only the Node/Git runner for install/update/plugin-dependency lanes; those lanes mount the prebuilt tarball. The functional image installs the same tarball into `/app` for built-app functionality lanes. Docker lane definitions live in `scripts/lib/docker-e2e-scenarios.mjs`; planner logic lives in `scripts/lib/docker-e2e-plan.mjs`; `scripts/test-docker-all.mjs` executes the selected plan. The aggregate uses a weighted local scheduler: `FENGMING_DOCKER_ALL_PARALLELISM` controls process slots, while resource caps keep heavy live, npm-install, and multi-service lanes from all starting at once. If a single lane is heavier than the active caps, the scheduler can still start it when the pool is empty and then keeps it running alone until capacity is available again. Defaults are 10 slots, `FENGMING_DOCKER_ALL_LIVE_LIMIT=9`, `FENGMING_DOCKER_ALL_NPM_LIMIT=10`, and `FENGMING_DOCKER_ALL_SERVICE_LIMIT=7`; tune `FENGMING_DOCKER_ALL_WEIGHT_LIMIT` or `FENGMING_DOCKER_ALL_DOCKER_LIMIT` only when the Docker host has more headroom. The runner performs a Docker preflight by default, removes stale FengMing E2E containers, prints status every 30 seconds, stores successful lane timings in `.artifacts/docker-tests/lane-timings.json`, and uses those timings to start longer lanes first on later runs. Use `FENGMING_DOCKER_ALL_DRY_RUN=1` to print the weighted lane manifest without building or running Docker, or `node scripts/test-docker-all.mjs --plan-json` to print the CI plan for selected lanes, package/image needs, and credentials.
750
- - `Package Acceptance` is the GitHub-native package gate for "does this installable tarball work as a product?" It resolves one candidate package from `source=npm`, `source=ref`, `source=url`, or `source=artifact`, uploads it as `package-under-test`, then runs the reusable Docker E2E lanes against that exact tarball instead of repacking the selected ref. Profiles are ordered by breadth: `smoke`, `package`, `product`, and `full`. See [Testing updates and plugins](/help/testing-updates-plugins) for the package/update/plugin contract, published-upgrade survivor matrix, release defaults, and failure triage.
751
- - Build and release checks run `scripts/check-cli-bootstrap-imports.mjs` after tsdown. The guard walks the static built graph from `dist/entry.js` and `dist/cli/run-main.js` and fails if pre-dispatch startup imports package dependencies such as Commander, prompt UI, undici, or logging before command dispatch; it also keeps the bundled gateway run chunk under budget and rejects static imports of known cold gateway paths. Packaged CLI smoke also covers root help, onboard help, doctor help, status, config schema, and a model-list command.
752
- - Package Acceptance legacy compatibility is capped at `2026.4.25` (`2026.4.25-beta.*` included). Through that cutoff, the harness tolerates only shipped-package metadata gaps: omitted private QA inventory entries, missing `gateway install --wrapper`, missing patch files in the tarball-derived git fixture, missing persisted `update.channel`, legacy plugin install-record locations, missing marketplace install-record persistence, and config metadata migration during `plugins update`. For packages after `2026.4.25`, those paths are strict failures.
753
- - Container smoke runners: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:release-user-journey`, `test:docker:release-typed-onboarding`, `test:docker:release-media-memory`, `test:docker:release-upgrade-user-journey`, `test:docker:release-plugin-marketplace`, `test:docker:skill-install`, `test:docker:update-channel-switch`, `test:docker:upgrade-survivor`, `test:docker:published-upgrade-survivor`, `test:docker:session-runtime-context`, `test:docker:agents-delete-shared-workspace`, `test:docker:gateway-network`, `test:docker:browser-cdp-snapshot`, `test:docker:mcp-channels`, `test:docker:agent-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, `test:docker:plugin-lifecycle-matrix`, and `test:docker:config-reload` boot one or more real containers and verify higher-level integration paths.
754
- - Docker/Bash E2E lanes that install the packed FengMing tarball through `scripts/lib/fengming-e2e-instance.sh` cap `npm install` at `FENGMING_E2E_NPM_INSTALL_TIMEOUT` (default `600s`; set `0` to disable the wrapper for debugging).
755
-
756
- The live-model Docker runners also bind-mount only the needed CLI auth homes (or all supported ones when the run is not narrowed), then copy them into the container home before the run so external-CLI OAuth can refresh tokens without mutating the host auth store:
757
-
758
- - Direct models: `pnpm test:docker:live-models` (script: `scripts/test-live-models-docker.sh`)
759
- - ACP bind smoke: `pnpm test:docker:live-acp-bind` (script: `scripts/test-live-acp-bind-docker.sh`; covers Claude, Codex, and Gemini by default, with strict Droid/OpenCode coverage via `pnpm test:docker:live-acp-bind:droid` and `pnpm test:docker:live-acp-bind:opencode`)
760
- - CLI backend smoke: `pnpm test:docker:live-cli-backend` (script: `scripts/test-live-cli-backend-docker.sh`)
761
- - Codex app-server harness smoke: `pnpm test:docker:live-codex-harness` (script: `scripts/test-live-codex-harness-docker.sh`)
762
- - Gateway + dev agent: `pnpm test:docker:live-gateway` (script: `scripts/test-live-gateway-models-docker.sh`)
763
- - Observability smokes: `pnpm qa:otel:smoke`, `pnpm qa:prometheus:smoke`, and `pnpm qa:observability:smoke` are private QA source-checkout lanes. They are intentionally not part of package Docker release lanes because the npm tarball omits QA Lab.
764
- - Open WebUI live smoke: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`)
765
- - Onboarding wizard (TTY, full scaffolding): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`)
766
- - Npm tarball onboarding/channel/agent smoke: `pnpm test:docker:npm-onboard-channel-agent` installs the packed FengMing tarball globally in Docker, configures OpenAI via env-ref onboarding plus Telegram by default, runs doctor, and runs one mocked OpenAI agent turn. Reuse a prebuilt tarball with `FENGMING_CURRENT_PACKAGE_TGZ=/path/to/fengming-*.tgz`, skip the host rebuild with `FENGMING_NPM_ONBOARD_HOST_BUILD=0`, or switch channel with `FENGMING_NPM_ONBOARD_CHANNEL=discord` or `FENGMING_NPM_ONBOARD_CHANNEL=slack`.
767
-
768
- - Release user journey smoke: `pnpm test:docker:release-user-journey` installs the packed FengMing tarball globally in a clean Docker home, runs onboarding, configures a mocked OpenAI provider, runs an agent turn, installs/uninstalls external plugins, configures ClickClack against a local fixture, verifies outbound/inbound messaging, restarts Gateway, and runs doctor.
769
- - Release typed onboarding smoke: `pnpm test:docker:release-typed-onboarding` installs the packed tarball, drives `fengming onboard` through a real TTY, configures OpenAI as an env-ref provider, verifies no raw key persistence, and runs a mocked agent turn.
770
- - Release media/memory smoke: `pnpm test:docker:release-media-memory` installs the packed tarball, verifies image understanding from a PNG attachment, OpenAI-compatible image generation output, memory search recall, and recall survival across Gateway restart.
771
- - Release upgrade user journey smoke: `pnpm test:docker:release-upgrade-user-journey` installs `fengming@latest` by default, configures provider/plugin/ClickClack state on the published package, upgrades to the candidate tarball, then reruns the core agent/plugin/channel journey. Override the baseline with `FENGMING_RELEASE_UPGRADE_BASELINE_SPEC=fengming@<version>`.
772
- - Release plugin marketplace smoke: `pnpm test:docker:release-plugin-marketplace` installs from a local fixture marketplace, updates the installed plugin, uninstalls it, and verifies the plugin CLI disappears with install metadata pruned.
773
- - Skill install smoke: `pnpm test:docker:skill-install` installs the packed FengMing tarball globally in Docker, disables uploaded archive installs in config, resolves the current live ClawHub skill slug from search, installs it with `fengming skills install`, and verifies the installed skill plus `.clawhub` origin/lock metadata.
774
- - Update channel switch smoke: `pnpm test:docker:update-channel-switch` installs the packed FengMing tarball globally in Docker, switches from package `stable` to git `dev`, verifies the persisted channel and plugin post-update work, then switches back to package `stable` and checks update status.
775
- - Upgrade survivor smoke: `pnpm test:docker:upgrade-survivor` installs the packed FengMing tarball over a dirty old-user fixture with agents, channel config, plugin allowlists, stale plugin dependency state, and existing workspace/session files. It runs package update plus non-interactive doctor without live provider or channel keys, then starts a loopback Gateway and checks config/state preservation plus startup/status budgets.
776
- - Published upgrade survivor smoke: `pnpm test:docker:published-upgrade-survivor` installs `fengming@latest` by default, seeds realistic existing-user files, configures that baseline with a baked command recipe, validates the resulting config, updates that published install to the candidate tarball, runs non-interactive doctor, writes `.artifacts/upgrade-survivor/summary.json`, then starts a loopback Gateway and checks configured intents, state preservation, startup, `/healthz`, `/readyz`, and RPC status budgets. Override one baseline with `FENGMING_UPGRADE_SURVIVOR_BASELINE_SPEC`, ask the aggregate scheduler to expand exact local baselines with `FENGMING_UPGRADE_SURVIVOR_BASELINE_SPECS` such as `fengming@2026.5.2 fengming@2026.4.23 fengming@2026.4.15`, and expand issue-shaped fixtures with `FENGMING_UPGRADE_SURVIVOR_SCENARIOS` such as `reported-issues`; the reported-issues set includes `configured-plugin-installs` for automatic external FengMing plugin install repair. Package Acceptance exposes those as `published_upgrade_survivor_baseline`, `published_upgrade_survivor_baselines`, and `published_upgrade_survivor_scenarios`, resolves meta baseline tokens such as `last-stable-4` or `all-since-2026.4.23`, and Full Release Validation expands the release-soak package gate to `last-stable-4 2026.4.23 2026.5.2 2026.4.15` plus `reported-issues`.
777
- - Session runtime context smoke: `pnpm test:docker:session-runtime-context` verifies hidden runtime context transcript persistence plus doctor repair of affected duplicated prompt-rewrite branches.
778
- - Bun global install smoke: `bash scripts/e2e/bun-global-install-smoke.sh` packs the current tree, installs it with `bun install -g` in an isolated home, and verifies `fengming infer image providers --json` returns bundled image providers instead of hanging. Reuse a prebuilt tarball with `FENGMING_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/fengming-*.tgz`, skip the host build with `FENGMING_BUN_GLOBAL_SMOKE_HOST_BUILD=0`, or copy `dist/` from a built Docker image with `FENGMING_BUN_GLOBAL_SMOKE_DIST_IMAGE=fengming-dockerfile-smoke:local`.
779
- - Installer Docker smoke: `bash scripts/test-install-sh-docker.sh` shares one npm cache across its root, update, and direct-npm containers. Update smoke defaults to npm `latest` as the stable baseline before upgrading to the candidate tarball. Override with `FENGMING_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` locally, or with the Install Smoke workflow's `update_baseline_version` input on GitHub. Non-root installer checks keep an isolated npm cache so root-owned cache entries do not mask user-local install behavior. Set `FENGMING_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` to reuse the root/update/direct-npm cache across local reruns.
780
- - Install Smoke CI skips the duplicate direct-npm global update with `FENGMING_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1`; run the script locally without that env when direct `npm install -g` coverage is needed.
781
- - Agents delete shared workspace CLI smoke: `pnpm test:docker:agents-delete-shared-workspace` (script: `scripts/e2e/agents-delete-shared-workspace-docker.sh`) builds the root Dockerfile image by default, seeds two agents with one workspace in an isolated container home, runs `agents delete --json`, and verifies valid JSON plus retained workspace behavior. Reuse the install-smoke image with `FENGMING_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=fengming-dockerfile-smoke:local FENGMING_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1`.
782
- - Gateway networking (two containers, WS auth + health): `pnpm test:docker:gateway-network` (script: `scripts/e2e/gateway-network-docker.sh`)
783
- - Browser CDP snapshot smoke: `pnpm test:docker:browser-cdp-snapshot` (script: `scripts/e2e/browser-cdp-snapshot-docker.sh`) builds the source E2E image plus a Chromium layer, starts Chromium with raw CDP, runs `browser doctor --deep`, and verifies CDP role snapshots cover link URLs, cursor-promoted clickables, iframe refs, and frame metadata.
784
- - OpenAI Responses web_search minimal reasoning regression: `pnpm test:docker:openai-web-search-minimal` (script: `scripts/e2e/openai-web-search-minimal-docker.sh`) runs a mocked OpenAI server through Gateway, verifies `web_search` raises `reasoning.effort` from `minimal` to `low`, then forces the provider schema reject and checks the raw detail appears in Gateway logs.
785
- - MCP channel bridge (seeded Gateway + stdio bridge + raw Claude notification-frame smoke): `pnpm test:docker:mcp-channels` (script: `scripts/e2e/mcp-channels-docker.sh`)
786
- - FengMing bundle MCP tools (real stdio MCP server + embedded FengMing profile allow/deny smoke): `pnpm test:docker:agent-bundle-mcp-tools` (script: `scripts/e2e/agent-bundle-mcp-tools-docker.sh`)
787
- - Cron/subagent MCP cleanup (real Gateway + stdio MCP child teardown after isolated cron and one-shot subagent runs): `pnpm test:docker:cron-mcp-cleanup` (script: `scripts/e2e/cron-mcp-cleanup-docker.sh`)
788
- - Plugins (install/update smoke for local path, `file:`, npm registry with hoisted dependencies, malformed npm package metadata, git moving refs, ClawHub kitchen-sink, marketplace updates, and Claude-bundle enable/inspect): `pnpm test:docker:plugins` (script: `scripts/e2e/plugins-docker.sh`)
789
- Set `FENGMING_PLUGINS_E2E_CLAWHUB=0` to skip the ClawHub block, or override the default kitchen-sink package/runtime pair with `FENGMING_PLUGINS_E2E_CLAWHUB_SPEC` and `FENGMING_PLUGINS_E2E_CLAWHUB_ID`. Without `FENGMING_CLAWHUB_URL`/`CLAWHUB_URL`, the test uses a hermetic local ClawHub fixture server.
790
- - Plugin update unchanged smoke: `pnpm test:docker:plugin-update` (script: `scripts/e2e/plugin-update-unchanged-docker.sh`)
791
- - Plugin lifecycle matrix smoke: `pnpm test:docker:plugin-lifecycle-matrix` installs the packed FengMing tarball in a bare container, installs an npm plugin, toggles enable/disable, upgrades and downgrades it through a local npm registry, deletes the installed code, then verifies uninstall still removes stale state while logging RSS/CPU metrics for each lifecycle phase.
792
- - Config reload metadata smoke: `pnpm test:docker:config-reload` (script: `scripts/e2e/config-reload-source-docker.sh`)
793
- - Plugins: `pnpm test:docker:plugins` covers install/update smoke for local path, `file:`, npm registry with hoisted dependencies, git moving refs, ClawHub fixtures, marketplace updates, and Claude-bundle enable/inspect. `pnpm test:docker:plugin-update` covers unchanged update behavior for installed plugins. `pnpm test:docker:plugin-lifecycle-matrix` covers resource-tracked npm plugin install, enable, disable, upgrade, downgrade, and missing-code uninstall.
794
-
795
- To prebuild and reuse the shared functional image manually:
796
-
797
- ```bash
798
- FENGMING_DOCKER_E2E_IMAGE=fengming-docker-e2e-functional:local pnpm test:docker:e2e-build
799
- FENGMING_DOCKER_E2E_IMAGE=fengming-docker-e2e-functional:local FENGMING_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
800
- ```
801
-
802
- Suite-specific image overrides such as `FENGMING_GATEWAY_NETWORK_E2E_IMAGE` still win when set. When `FENGMING_SKIP_DOCKER_BUILD=1` points at a remote shared image, the scripts pull it if it is not already local. The QR and installer Docker tests keep their own Dockerfiles because they validate package/install behavior rather than the shared built-app runtime.
803
-
804
- The live-model Docker runners also bind-mount the current checkout read-only and
805
- stage it into a temporary workdir inside the container. This keeps the runtime
806
- image slim while still running Vitest against your exact local source/config.
807
- The staging step skips large local-only caches and app build outputs such as
808
- `.pnpm-store`, `.worktrees`, `__fengming_vitest__`, and app-local `.build` or
809
- Gradle output directories so Docker live runs do not spend minutes copying
810
- machine-specific artifacts.
811
- They also set `FENGMING_SKIP_CHANNELS=1` so gateway live probes do not start
812
- real Telegram/Discord/etc. channel workers inside the container.
813
- `test:docker:live-models` still runs `pnpm test:live`, so pass through
814
- `FENGMING_LIVE_GATEWAY_*` as well when you need to narrow or exclude gateway
815
- live coverage from that Docker lane.
816
- `test:docker:openwebui` is a higher-level compatibility smoke: it starts an
817
- FengMing gateway container with the OpenAI-compatible HTTP endpoints enabled,
818
- starts a pinned Open WebUI container against that gateway, signs in through
819
- Open WebUI, verifies `/api/models` exposes `fengming/default`, then sends a
820
- real chat request through Open WebUI's `/api/chat/completions` proxy.
821
- Set `OPENWEBUI_SMOKE_MODE=models` for release-path CI checks that should stop
822
- after Open WebUI sign-in and model discovery, without waiting on a live model
823
- completion.
824
- The first run can be noticeably slower because Docker may need to pull the
825
- Open WebUI image and Open WebUI may need to finish its own cold-start setup.
826
- This lane expects a usable live model key. Provide it through the process
827
- environment, staged auth profiles, or an explicit `FENGMING_PROFILE_FILE`.
828
- Successful runs print a small JSON payload like `{ "ok": true, "model":
829
- "fengming/default", ... }`.
830
- `test:docker:mcp-channels` is intentionally deterministic and does not need a
831
- real Telegram, Discord, or iMessage account. It boots a seeded Gateway
832
- container, starts a second container that spawns `fengming mcp serve`, then
833
- verifies routed conversation discovery, transcript reads, attachment metadata,
834
- live event queue behavior, outbound send routing, and Claude-style channel +
835
- permission notifications over the real stdio MCP bridge. The notification check
836
- inspects the raw stdio MCP frames directly so the smoke validates what the
837
- bridge actually emits, not just what a specific client SDK happens to surface.
838
- `test:docker:agent-bundle-mcp-tools` is deterministic and does not need a live
839
- model key. It builds the repo Docker image, starts a real stdio MCP probe server
840
- inside the container, materializes that server through the embedded FengMing bundle
841
- MCP runtime, executes the tool, then verifies `coding` and `messaging` keep
842
- `bundle-mcp` tools while `minimal` and `tools.deny: ["bundle-mcp"]` filter them.
843
- `test:docker:cron-mcp-cleanup` is deterministic and does not need a live model
844
- key. It starts a seeded Gateway with a real stdio MCP probe server, runs an
845
- isolated cron turn and a `sessions_spawn` one-shot child turn, then verifies
846
- the MCP child process exits after each run.
847
-
848
- Manual ACP plain-language thread smoke (not CI):
849
-
850
- - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...`
851
- - Keep this script for regression/debug workflows. It may be needed again for ACP thread routing validation, so do not delete it.
852
-
853
- Useful env vars:
854
-
855
- - `FENGMING_CONFIG_DIR=...` (default: `~/.fengming`) mounted to `/home/node/.fengming`
856
- - `FENGMING_WORKSPACE_DIR=...` (default: `~/.fengming/workspace`) mounted to `/home/node/.fengming/workspace`
857
- - `FENGMING_PROFILE_FILE=...` mounted and sourced before running tests
858
- - `FENGMING_DOCKER_PROFILE_ENV_ONLY=1` to verify only env vars sourced from `FENGMING_PROFILE_FILE`, using temporary config/workspace dirs and no external CLI auth mounts
859
- - `FENGMING_DOCKER_CLI_TOOLS_DIR=...` (default: `~/.cache/fengming/docker-cli-tools`) mounted to `/home/node/.npm-global` for cached CLI installs inside Docker
860
- - External CLI auth dirs/files under `$HOME` are mounted read-only under `/host-auth...`, then copied into `/home/node/...` before tests start
861
- - Default dirs: `.minimax`
862
- - Default files: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json`
863
- - Narrowed provider runs mount only the needed dirs/files inferred from `FENGMING_LIVE_PROVIDERS` / `FENGMING_LIVE_GATEWAY_PROVIDERS`
864
- - Override manually with `FENGMING_DOCKER_AUTH_DIRS=all`, `FENGMING_DOCKER_AUTH_DIRS=none`, or a comma list like `FENGMING_DOCKER_AUTH_DIRS=.claude,.codex`
865
- - `FENGMING_LIVE_GATEWAY_MODELS=...` / `FENGMING_LIVE_MODELS=...` to narrow the run
866
- - `FENGMING_LIVE_GATEWAY_PROVIDERS=...` / `FENGMING_LIVE_PROVIDERS=...` to filter providers in-container
867
- - `FENGMING_SKIP_DOCKER_BUILD=1` to reuse an existing `fengming:local-live` image for reruns that do not need a rebuild
868
- - `FENGMING_LIVE_REQUIRE_PROFILE_KEYS=1` to ensure creds come from the profile store (not env)
869
- - `FENGMING_OPENWEBUI_MODEL=...` to choose the model exposed by the gateway for the Open WebUI smoke
870
- - `FENGMING_OPENWEBUI_PROMPT=...` to override the nonce-check prompt used by the Open WebUI smoke
871
- - `OPENWEBUI_IMAGE=...` to override the pinned Open WebUI image tag
872
-
873
- ## Docs sanity
874
-
875
- Run docs checks after doc edits: `pnpm check:docs`.
876
- Run full Mintlify anchor validation when you need in-page heading checks too: `pnpm docs:check-links:anchors`.
877
-
878
- ## Offline regression (CI-safe)
879
-
880
- These are "real pipeline" regressions without real providers:
881
-
882
- - Gateway tool calling (mock OpenAI, real gateway + agent loop): `src/gateway/gateway.test.ts` (case: "runs a mock OpenAI tool call end-to-end via gateway agent loop")
883
- - Gateway wizard (WS `wizard.start`/`wizard.next`, writes config + auth enforced): `src/gateway/gateway.test.ts` (case: "runs wizard over ws and writes auth token config")
884
-
885
- ## Agent reliability evals (skills)
886
-
887
- We already have a few CI-safe tests that behave like "agent reliability evals":
888
-
889
- - Mock tool-calling through the real gateway + agent loop (`src/gateway/gateway.test.ts`).
890
- - End-to-end wizard flows that validate session wiring and config effects (`src/gateway/gateway.test.ts`).
891
-
892
- What's still missing for skills (see [Skills](/tools/skills)):
893
-
894
- - **Decisioning:** when skills are listed in the prompt, does the agent pick the right skill (or avoid irrelevant ones)?
895
- - **Compliance:** does the agent read `SKILL.md` before use and follow required steps/args?
896
- - **Workflow contracts:** multi-turn scenarios that assert tool order, session history carryover, and sandbox boundaries.
897
-
898
- Future evals should stay deterministic first:
899
-
900
- - A scenario runner using mock providers to assert tool calls + order, skill file reads, and session wiring.
901
- - A small suite of skill-focused scenarios (use vs avoid, gating, prompt injection).
902
- - Optional live evals (opt-in, env-gated) only after the CI-safe suite is in place.
903
-
904
- ## Contract tests (plugin and channel shape)
905
-
906
- Contract tests verify that every registered plugin and channel conforms to its
907
- interface contract. They iterate over all discovered plugins and run a suite of
908
- shape and behavior assertions. The default `pnpm test` unit lane intentionally
909
- skips these shared seam and smoke files; run the contract commands explicitly
910
- when you touch shared channel or provider surfaces.
911
-
912
- ### Commands
913
-
914
- - All contracts: `pnpm test:contracts`
915
- - Channel contracts only: `pnpm test:contracts:channels`
916
- - Provider contracts only: `pnpm test:contracts:plugins`
917
-
918
- ### Channel contracts
919
-
920
- Located in `src/channels/plugins/contracts/*.contract.test.ts`:
921
-
922
- - **plugin** - Basic plugin shape (id, name, capabilities)
923
- - **setup** - Setup wizard contract
924
- - **session-binding** - Session binding behavior
925
- - **outbound-payload** - Message payload structure
926
- - **inbound** - Inbound message handling
927
- - **actions** - Channel action handlers
928
- - **threading** - Thread ID handling
929
- - **directory** - Directory/roster API
930
- - **group-policy** - Group policy enforcement
931
-
932
- ### Provider status contracts
933
-
934
- Located in `src/plugins/contracts/*.contract.test.ts`.
935
-
936
- - **status** - Channel status probes
937
- - **registry** - Plugin registry shape
938
-
939
- ### Provider contracts
940
-
941
- Located in `src/plugins/contracts/*.contract.test.ts`:
942
-
943
- - **auth** - Auth flow contract
944
- - **auth-choice** - Auth choice/selection
945
- - **catalog** - Model catalog API
946
- - **discovery** - Plugin discovery
947
- - **loader** - Plugin loading
948
- - **runtime** - Provider runtime
949
- - **shape** - Plugin shape/interface
950
- - **wizard** - Setup wizard
951
-
952
- ### When to run
953
-
954
- - After changing plugin-sdk exports or subpaths
955
- - After adding or modifying a channel or provider plugin
956
- - After refactoring plugin registration or discovery
957
-
958
- Contract tests run in CI and do not require real API keys.
959
-
960
- ## Adding regressions (guidance)
961
-
962
- When you fix a provider/model issue discovered in live:
963
-
964
- - Add a CI-safe regression if possible (mock/stub provider, or capture the exact request-shape transformation)
965
- - If it's inherently live-only (rate limits, auth policies), keep the live test narrow and opt-in via env vars
966
- - Prefer targeting the smallest layer that catches the bug:
967
- - provider request conversion/replay bug → direct models test
968
- - gateway session/history/tool pipeline bug → gateway live smoke or CI-safe gateway mock test
969
- - SecretRef traversal guardrail:
970
- - `src/secrets/exec-secret-ref-id-parity.test.ts` derives one sampled target per SecretRef class from registry metadata (`listSecretTargetRegistryEntries()`), then asserts traversal-segment exec ids are rejected.
971
- - If you add a new `includeInPlan` SecretRef target family in `src/secrets/target-registry-data.ts`, update `classifyTargetClass` in that test. The test intentionally fails on unclassified target ids so new classes cannot be skipped silently.
972
-
973
- ## Related
974
-
975
- - [Testing live](/help/testing-live)
976
- - [Testing updates and plugins](/help/testing-updates-plugins)
977
- - [CI](/ci)