@wardby/cli 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/.env.example +33 -0
  2. package/README.md +25 -14
  3. package/dist/claude-coding-worker/context.d.ts +22 -0
  4. package/dist/claude-coding-worker/context.js +92 -0
  5. package/dist/claude-coding-worker/driver.d.ts +7 -1
  6. package/dist/claude-coding-worker/driver.js +38 -5
  7. package/dist/claude-coding-worker/sdk.js +13 -4
  8. package/dist/cli-help.d.ts +1 -1
  9. package/dist/cli-help.js +5 -2
  10. package/dist/cli-native-mode.d.ts +9 -0
  11. package/dist/cli-native-mode.js +20 -0
  12. package/dist/cli.d.ts +3 -1
  13. package/dist/cli.js +141 -5
  14. package/dist/coding/claude-context.d.ts +45 -0
  15. package/dist/coding/claude-context.js +434 -0
  16. package/dist/coding/local-git.js +9 -1
  17. package/dist/coding/profile.d.ts +12 -0
  18. package/dist/coding/profile.js +6 -0
  19. package/dist/coding/protocol.d.ts +104 -0
  20. package/dist/coding/protocol.js +87 -3
  21. package/dist/coding/registry/pypi.d.ts +25 -1
  22. package/dist/coding/registry/pypi.js +140 -16
  23. package/dist/coding/registry/types.d.ts +17 -3
  24. package/dist/coding-worker/artifact.d.ts +8 -0
  25. package/dist/coding-worker/artifact.js +2 -2
  26. package/dist/coding-worker/driver.js +2 -0
  27. package/dist/coding-worker/sdk.d.ts +6 -0
  28. package/dist/coding-worker/sdk.js +1 -0
  29. package/dist/coding-worker/skills.d.ts +23 -0
  30. package/dist/coding-worker/skills.js +117 -0
  31. package/dist/coding-worker/types.d.ts +2 -0
  32. package/dist/config/github-allowed-accounts.d.ts +15 -0
  33. package/dist/config/github-allowed-accounts.js +36 -0
  34. package/dist/config/low-power.d.ts +12 -0
  35. package/dist/config/low-power.js +18 -0
  36. package/dist/config/mobile.d.ts +12 -0
  37. package/dist/config/mobile.js +18 -0
  38. package/dist/config/providers.d.ts +56 -2
  39. package/dist/config/providers.js +92 -6
  40. package/dist/core/db.d.ts +16 -6
  41. package/dist/core/db.js +12 -10
  42. package/dist/core/dispatch.d.ts +11 -0
  43. package/dist/core/dispatch.js +36 -1
  44. package/dist/core/engine-native.js +9 -5
  45. package/dist/core/host-events.d.ts +49 -3
  46. package/dist/core/host-events.js +289 -15
  47. package/dist/core/http-runtime.js +13 -6
  48. package/dist/core/issue-bridge.js +42 -2
  49. package/dist/core/issue-events.js +12 -1
  50. package/dist/core/issue-status.js +14 -3
  51. package/dist/core/merge-order-check.d.ts +129 -0
  52. package/dist/core/merge-order-check.js +336 -0
  53. package/dist/core/notification-dispatcher.d.ts +70 -0
  54. package/dist/core/notification-dispatcher.js +368 -0
  55. package/dist/core/notification-templates.d.ts +25 -0
  56. package/dist/core/notification-templates.js +105 -0
  57. package/dist/core/notifications.d.ts +10 -0
  58. package/dist/core/notifications.js +38 -0
  59. package/dist/core/pg-auth.d.ts +22 -0
  60. package/dist/core/pg-auth.js +152 -0
  61. package/dist/core/power-composition.d.ts +16 -0
  62. package/dist/core/power-composition.js +37 -0
  63. package/dist/core/power-idle.d.ts +14 -0
  64. package/dist/core/power-idle.js +30 -0
  65. package/dist/core/power.d.ts +71 -0
  66. package/dist/core/power.js +202 -0
  67. package/dist/core/reconciler.d.ts +4 -2
  68. package/dist/core/reconciler.js +29 -5
  69. package/dist/core/related-pull-requests.d.ts +48 -4
  70. package/dist/core/related-pull-requests.js +113 -11
  71. package/dist/core/repo-access.d.ts +15 -0
  72. package/dist/core/repo-access.js +66 -0
  73. package/dist/core/review-fix.d.ts +37 -0
  74. package/dist/core/review-fix.js +207 -6
  75. package/dist/core/review-host-tools.d.ts +20 -0
  76. package/dist/core/review-host-tools.js +58 -2
  77. package/dist/core/runner.d.ts +336 -3
  78. package/dist/core/runner.js +894 -317
  79. package/dist/core/secret-broker-config.d.ts +103 -0
  80. package/dist/core/secret-broker-config.js +112 -0
  81. package/dist/core/secrets.d.ts +39 -4
  82. package/dist/core/secrets.js +148 -40
  83. package/dist/core/workflow-event-recorder.d.ts +14 -0
  84. package/dist/core/workflow-event-recorder.js +120 -0
  85. package/dist/core/workflow-events.d.ts +82 -0
  86. package/dist/core/workflow-events.js +44 -0
  87. package/dist/core/workflow-run-events.d.ts +16 -0
  88. package/dist/core/workflow-run-events.js +40 -0
  89. package/dist/generated/prisma/browser.d.ts +58 -0
  90. package/dist/generated/prisma/client.d.ts +58 -0
  91. package/dist/generated/prisma/commonInputTypes.d.ts +150 -0
  92. package/dist/generated/prisma/enums.d.ts +27 -0
  93. package/dist/generated/prisma/enums.js +23 -0
  94. package/dist/generated/prisma/internal/class.d.ts +88 -0
  95. package/dist/generated/prisma/internal/class.js +4 -4
  96. package/dist/generated/prisma/internal/prismaNamespace.d.ts +772 -1
  97. package/dist/generated/prisma/internal/prismaNamespace.js +135 -4
  98. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +139 -0
  99. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +135 -4
  100. package/dist/generated/prisma/models/Agent.d.ts +360 -1
  101. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +73 -1
  102. package/dist/generated/prisma/models/CodingRun.d.ts +205 -1
  103. package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
  104. package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1675 -0
  105. package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
  106. package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1517 -0
  107. package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
  108. package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
  109. package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
  110. package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
  111. package/dist/generated/prisma/models/NotificationChannel.js +1 -0
  112. package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
  113. package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
  114. package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
  115. package/dist/generated/prisma/models/NotificationThread.js +1 -0
  116. package/dist/generated/prisma/models/Run.d.ts +826 -1
  117. package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
  118. package/dist/generated/prisma/models/Secret.d.ts +37 -1
  119. package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
  120. package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
  121. package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
  122. package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
  123. package/dist/generated/prisma/models.d.ts +8 -0
  124. package/dist/help/build.js +4 -2
  125. package/dist/help/catalog.d.ts +1 -1
  126. package/dist/help/catalog.js +31 -6
  127. package/dist/help-index.json +1492 -113
  128. package/dist/import/create.js +17 -0
  129. package/dist/import/neutral-schema.d.ts +6 -2
  130. package/dist/import/neutral-schema.js +2 -0
  131. package/dist/mcp/auth/access.d.ts +1 -0
  132. package/dist/mcp/auth/ownership.d.ts +1 -1
  133. package/dist/mcp/auth/repo-authorization.js +14 -0
  134. package/dist/mcp/auth/resource-server.d.ts +2 -1
  135. package/dist/mcp/auth/resource-server.js +7 -2
  136. package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
  137. package/dist/mcp/auth/self-hosted/browser.js +19 -6
  138. package/dist/mcp/context.d.ts +6 -0
  139. package/dist/mcp/host-events/github-ingress.d.ts +23 -1
  140. package/dist/mcp/host-events/github-ingress.js +68 -0
  141. package/dist/mcp/index.d.ts +13 -0
  142. package/dist/mcp/index.js +59 -10
  143. package/dist/mcp/tools/agents.js +83 -12
  144. package/dist/mcp/tools/notification-channels.d.ts +2 -0
  145. package/dist/mcp/tools/notification-channels.js +293 -0
  146. package/dist/mcp/tools/power.d.ts +2 -0
  147. package/dist/mcp/tools/power.js +77 -0
  148. package/dist/mcp/tools/runs.d.ts +0 -6
  149. package/dist/mcp/tools/runs.js +7 -2
  150. package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
  151. package/dist/mcp/tools/secret-broker-compat.js +23 -0
  152. package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
  153. package/dist/mcp/tools/secret-elicitation-form.js +200 -10
  154. package/dist/mcp/tools/secret-elicitation-server.js +8 -1
  155. package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
  156. package/dist/mcp/tools/secret-elicitation.js +110 -12
  157. package/dist/mcp/tools/secrets.js +184 -7
  158. package/dist/mcp/tools/tools.d.ts +1 -1
  159. package/dist/mcp/tools/tools.js +22 -2
  160. package/dist/native-worker/composition.d.ts +23 -0
  161. package/dist/native-worker/composition.js +77 -0
  162. package/dist/native-worker/docker-isolation.d.ts +65 -0
  163. package/dist/native-worker/docker-isolation.js +183 -0
  164. package/dist/native-worker/docker-launcher.d.ts +74 -0
  165. package/dist/native-worker/docker-launcher.js +237 -0
  166. package/dist/native-worker/gateway-server.d.ts +39 -0
  167. package/dist/native-worker/gateway-server.js +315 -0
  168. package/dist/native-worker/gateway.d.ts +44 -0
  169. package/dist/native-worker/gateway.js +197 -0
  170. package/dist/native-worker/http-server.d.ts +22 -0
  171. package/dist/native-worker/http-server.js +109 -0
  172. package/dist/native-worker/http-transport.d.ts +17 -0
  173. package/dist/native-worker/http-transport.js +88 -0
  174. package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
  175. package/dist/native-worker/kubernetes-isolation.js +218 -0
  176. package/dist/native-worker/kubernetes-launcher.d.ts +102 -0
  177. package/dist/native-worker/kubernetes-launcher.js +335 -0
  178. package/dist/native-worker/launch.d.ts +45 -0
  179. package/dist/native-worker/launch.js +44 -0
  180. package/dist/native-worker/ledger.d.ts +109 -0
  181. package/dist/native-worker/ledger.js +192 -0
  182. package/dist/native-worker/loopback.d.ts +12 -0
  183. package/dist/native-worker/loopback.js +49 -0
  184. package/dist/native-worker/main.d.ts +7 -0
  185. package/dist/native-worker/main.js +74 -0
  186. package/dist/native-worker/protocol.d.ts +744 -0
  187. package/dist/native-worker/protocol.js +200 -0
  188. package/dist/native-worker/sandbox-executor.d.ts +68 -0
  189. package/dist/native-worker/sandbox-executor.js +210 -0
  190. package/dist/native-worker/stdio.d.ts +29 -0
  191. package/dist/native-worker/stdio.js +188 -0
  192. package/dist/native-worker/warm-delivery.d.ts +16 -0
  193. package/dist/native-worker/warm-delivery.js +33 -0
  194. package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
  195. package/dist/native-worker/warm-pool-ledger.js +73 -0
  196. package/dist/native-worker/warm-pool.d.ts +107 -0
  197. package/dist/native-worker/warm-pool.js +283 -0
  198. package/dist/native-worker/worker.d.ts +17 -0
  199. package/dist/native-worker/worker.js +115 -0
  200. package/dist/providers/auth/authorization-server.d.ts +3 -0
  201. package/dist/providers/auth/index.js +2 -0
  202. package/dist/providers/auth/self-hosted.d.ts +13 -1
  203. package/dist/providers/auth/self-hosted.js +54 -4
  204. package/dist/providers/chat/fake.d.ts +46 -0
  205. package/dist/providers/chat/fake.js +39 -0
  206. package/dist/providers/chat/index.d.ts +4 -0
  207. package/dist/providers/chat/index.js +8 -0
  208. package/dist/providers/chat/slack.d.ts +37 -0
  209. package/dist/providers/chat/slack.js +105 -0
  210. package/dist/providers/chat/types.d.ts +42 -0
  211. package/dist/providers/chat/types.js +19 -0
  212. package/dist/providers/coding-proxy/mock-upstream.d.ts +33 -0
  213. package/dist/providers/coding-proxy/mock-upstream.js +116 -0
  214. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +3 -0
  215. package/dist/providers/coding-proxy/registry/prisma-store.js +17 -0
  216. package/dist/providers/coding-proxy/registry/service.d.ts +4 -0
  217. package/dist/providers/coding-proxy/registry/service.js +20 -3
  218. package/dist/providers/coding-proxy/registry/store.d.ts +18 -1
  219. package/dist/providers/coding-proxy/registry/store.js +33 -0
  220. package/dist/providers/coding-proxy/runtime.js +12 -1
  221. package/dist/providers/coding-proxy/types.d.ts +2 -0
  222. package/dist/providers/engine/types.d.ts +19 -0
  223. package/dist/providers/engine/types.js +22 -0
  224. package/dist/providers/executor/composition.d.ts +24 -1
  225. package/dist/providers/executor/composition.js +39 -6
  226. package/dist/providers/executor/container.d.ts +24 -1
  227. package/dist/providers/executor/container.js +101 -11
  228. package/dist/providers/executor/dbos.d.ts +42 -0
  229. package/dist/providers/executor/dbos.js +118 -12
  230. package/dist/providers/executor/deferred.d.ts +56 -0
  231. package/dist/providers/executor/deferred.js +119 -0
  232. package/dist/providers/executor/routing.d.ts +37 -10
  233. package/dist/providers/executor/routing.js +73 -32
  234. package/dist/providers/executor/types.d.ts +12 -0
  235. package/dist/providers/jobs/docker.js +3 -3
  236. package/dist/providers/jobs/fake-kubernetes-api.d.ts +21 -2
  237. package/dist/providers/jobs/fake-kubernetes-api.js +42 -1
  238. package/dist/providers/jobs/kubernetes-api.d.ts +17 -1
  239. package/dist/providers/jobs/kubernetes-api.js +7 -0
  240. package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
  241. package/dist/providers/jobs/kubernetes-client.js +52 -3
  242. package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
  243. package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
  244. package/dist/providers/jobs/kubernetes-isolation.d.ts +16 -1
  245. package/dist/providers/jobs/kubernetes-isolation.js +58 -5
  246. package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
  247. package/dist/providers/jobs/kubernetes-platform.js +38 -1
  248. package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
  249. package/dist/providers/jobs/kubernetes-preflight.js +4 -2
  250. package/dist/providers/jobs/kubernetes.d.ts +56 -7
  251. package/dist/providers/jobs/kubernetes.js +117 -36
  252. package/dist/providers/jobs/metadata-probes.d.ts +11 -0
  253. package/dist/providers/jobs/metadata-probes.js +13 -0
  254. package/dist/providers/jobs/types.d.ts +9 -0
  255. package/dist/providers/llm/openai.js +0 -1
  256. package/dist/providers/review-host/github.d.ts +11 -1
  257. package/dist/providers/review-host/github.js +50 -0
  258. package/dist/providers/review-host/types.d.ts +23 -0
  259. package/dist/providers/vcs/github.d.ts +32 -6
  260. package/dist/providers/vcs/github.js +74 -16
  261. package/dist/quickstart/coding-db.js +14 -2
  262. package/dist/quickstart/coding-doctor.d.ts +3 -0
  263. package/dist/quickstart/coding-doctor.js +3 -0
  264. package/dist/quickstart/coding-images.d.ts +9 -0
  265. package/dist/quickstart/coding-images.js +39 -0
  266. package/dist/quickstart/coding-seed.d.ts +20 -1
  267. package/dist/quickstart/coding-seed.js +96 -7
  268. package/dist/quickstart/coding.d.ts +2 -0
  269. package/dist/quickstart/coding.js +75 -3
  270. package/dist/quickstart/config.d.ts +2 -0
  271. package/dist/quickstart/config.js +4 -0
  272. package/dist/quickstart/images.d.ts +13 -0
  273. package/dist/quickstart/images.js +80 -12
  274. package/dist/quickstart/index.d.ts +0 -2
  275. package/dist/quickstart/index.js +10 -14
  276. package/dist/quickstart/manifests.d.ts +56 -0
  277. package/dist/quickstart/manifests.js +523 -0
  278. package/dist/quickstart/python-detect.d.ts +10 -0
  279. package/dist/quickstart/python-detect.js +32 -0
  280. package/dist/quickstart/repo-packages.d.ts +10 -0
  281. package/dist/quickstart/repo-packages.js +132 -0
  282. package/dist/quickstart/reviewer-prompt.d.ts +12 -0
  283. package/dist/quickstart/reviewer-prompt.js +84 -0
  284. package/dist/quickstart/scenarios.d.ts +19 -0
  285. package/dist/quickstart/scenarios.js +28 -0
  286. package/dist/quickstart/sync-reviewer-prompt.d.ts +1 -0
  287. package/dist/quickstart/sync-reviewer-prompt.js +10 -0
  288. package/dist/quickstart-images.json +1 -1
  289. package/dist/sandbox/brokered-fetch.d.ts +23 -0
  290. package/dist/sandbox/brokered-fetch.js +37 -0
  291. package/dist/sandbox/host-functions.d.ts +34 -0
  292. package/dist/sandbox/host-functions.js +144 -80
  293. package/dist/sandbox/prelude.js +7 -1
  294. package/dist/sandbox/run-in-sandbox.d.ts +19 -0
  295. package/dist/sandbox/run-in-sandbox.js +28 -10
  296. package/dist/sandbox/safe-fetch.d.ts +2 -0
  297. package/dist/sandbox/safe-fetch.js +3 -1
  298. package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
  299. package/dist/sandbox/secret-broker-sigv4.js +49 -0
  300. package/dist/sandbox/secret-broker.d.ts +34 -0
  301. package/dist/sandbox/secret-broker.js +162 -0
  302. package/dist/sandbox/user-tool.d.ts +14 -0
  303. package/dist/sandbox/user-tool.js +32 -0
  304. package/dist/serve.js +18 -0
  305. package/dist/viewer/api-schema.d.ts +214 -18
  306. package/dist/viewer/api-schema.js +22 -0
  307. package/dist/viewer/build-schemas.js +4 -1
  308. package/dist/viewer/event-bus.d.ts +6 -0
  309. package/dist/viewer/event-bus.js +16 -7
  310. package/dist/viewer/graph.d.ts +5 -2
  311. package/dist/viewer/graph.js +7 -2
  312. package/dist/viewer/http.d.ts +0 -1
  313. package/dist/viewer/http.js +2 -2
  314. package/dist/viewer/infra.js +25 -2
  315. package/dist/viewer/limits.d.ts +4 -0
  316. package/dist/viewer/limits.js +4 -0
  317. package/dist/viewer/openapi.d.ts +15 -0
  318. package/dist/viewer/openapi.js +172 -0
  319. package/docs/README.md +7 -0
  320. package/docs/agent-recipes.md +57 -8
  321. package/docs/architecture-runtime.md +16 -1
  322. package/docs/code-review-agents.md +139 -5
  323. package/docs/coding-agent-setup.md +127 -2
  324. package/docs/coding-packages.md +105 -5
  325. package/docs/coding-services.md +3 -1
  326. package/docs/coding-worker-byo-images.md +239 -2
  327. package/docs/coding-worker-isolation.md +88 -23
  328. package/docs/getting-started-gke.md +225 -9
  329. package/docs/getting-started-identity-provider.md +21 -10
  330. package/docs/getting-started.md +140 -11
  331. package/docs/jira-agents.md +5 -1
  332. package/docs/knowledge.md +11 -0
  333. package/docs/native-sandbox.md +635 -0
  334. package/docs/release-verification.md +9 -0
  335. package/docs/security-deployment.md +113 -12
  336. package/docs/slack-notifications.md +252 -0
  337. package/docs/tool-secrets.md +252 -0
  338. package/docs/viewer-api.md +46 -5
  339. package/docs/viewer-api.openapi.yml +1404 -0
  340. package/help/admin-viewer.md +6 -2
  341. package/help/agent-recipes.md +27 -0
  342. package/help/architecture-agent.md +136 -0
  343. package/help/brokered-secrets.md +79 -0
  344. package/help/build-claude-code-image.md +131 -0
  345. package/help/build-worker-image.md +195 -0
  346. package/help/code-review-agents.md +68 -6
  347. package/help/coding-packages.md +31 -2
  348. package/help/creating-agents.md +14 -0
  349. package/help/deploy-gke.md +37 -6
  350. package/help/deployment-targets.md +24 -13
  351. package/help/errors/coding-provider-not-configured.md +2 -2
  352. package/help/errors/database-auth-invalid.md +28 -0
  353. package/help/errors/github-account-not-allowed.md +25 -0
  354. package/help/errors/low-power-disabled.md +29 -0
  355. package/help/errors/low-power-scale-forbidden.md +35 -0
  356. package/help/errors/low-power-wake-timeout.md +30 -0
  357. package/help/errors/mobile-disabled.md +31 -0
  358. package/help/errors/native-sandbox-capacity.md +22 -0
  359. package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
  360. package/help/errors/native-sandbox-docker-failed.md +20 -0
  361. package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
  362. package/help/errors/native-sandbox-image-not-pinned.md +19 -0
  363. package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
  364. package/help/errors/native-sandbox-network-unenforced.md +22 -0
  365. package/help/errors/native-sandbox-requires-catalog.md +31 -0
  366. package/help/errors/native-sandbox-unavailable.md +19 -0
  367. package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
  368. package/help/errors/native-sandbox-worker-exited.md +20 -0
  369. package/help/errors/native-sandbox-worker-lost.md +20 -0
  370. package/help/errors/native-sandbox-worker-unready.md +22 -0
  371. package/help/errors/secret-broker-body-invalid.md +26 -0
  372. package/help/errors/secret-broker-changed.md +20 -0
  373. package/help/errors/secret-broker-config-invalid.md +30 -0
  374. package/help/errors/secret-broker-conflict.md +27 -0
  375. package/help/errors/secret-broker-destination-denied.md +28 -0
  376. package/help/errors/secret-broker-value-invalid.md +28 -0
  377. package/help/errors/secret-brokered.md +24 -0
  378. package/help/errors/secret-not-brokered.md +25 -0
  379. package/help/errors/slack-auth-failed.md +48 -0
  380. package/help/errors/slack-channel-unreachable.md +39 -0
  381. package/help/errors/slack-not-configured.md +33 -0
  382. package/help/getting-started.md +18 -0
  383. package/help/github.md +18 -1
  384. package/help/identity-and-access.md +5 -1
  385. package/help/local-repositories.md +35 -5
  386. package/help/low-power-mode.md +125 -0
  387. package/help/merge-order-check.md +117 -0
  388. package/help/mobile-app.md +54 -0
  389. package/help/native-sandbox.md +136 -0
  390. package/help/observability.md +8 -0
  391. package/help/related-pull-requests.md +70 -9
  392. package/help/repo-instructions-and-skills.md +91 -0
  393. package/help/review-fix-rounds.md +10 -0
  394. package/help/slack-notifications.md +62 -0
  395. package/help/troubleshooting/coding-workers.md +21 -0
  396. package/package.json +13 -5
  397. package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
  398. package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
  399. package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
  400. package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
  401. package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
  402. package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
  403. package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
  404. package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
  405. package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
  406. package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
  407. package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
  408. package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
  409. package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
  410. package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
  411. package/prisma/schema.prisma +362 -91
@@ -262,6 +262,17 @@ it starts a fresh review, and if that review requests changes, it starts a
262
262
  fix round the same way any other review would (subject to the cap and to no
263
263
  earlier round still running).
264
264
 
265
+ With Wardby 0.6.0 or later, a round whose coding run ends with no change —
266
+ the agent concluded the review's finding was wrong rather than pushing a
267
+ fix — gets one fresh review instead, of the pull request's current
268
+ (unchanged) head, run by the reviewer whose check requested the changes.
269
+ The fix round's own summary is passed to that reviewer as untrusted
270
+ context: information about what was decided and why, never instructions to
271
+ follow. This happens once per review that requested changes, counts toward
272
+ the pull request's round cap the same as a round that pushed a change, and
273
+ at the cap posts the usual cap comment instead of re-reviewing — since no
274
+ push happened, nothing else would otherwise replace the failed check.
275
+
265
276
  If a repository already forwards wardby's reviews to a webhook through a
266
277
  hand-written CI workflow to fix them automatically, replace that workflow
267
278
  with `review_fix`: link the trigger, then delete the workflow and its
@@ -444,6 +455,50 @@ A GitHub App has exactly one webhook URL. Register a **separate App** for
444
455
  local development or a staging environment rather than pointing your
445
456
  production App's webhook at a dev host.
446
457
 
458
+ ### Which accounts the App serves (`WARDBY_GITHUB_ALLOWED_ACCOUNTS`)
459
+
460
+ A GitHub App has one webhook URL, so every account that installs it sends its
461
+ events to your server. wardby serves only trusted accounts:
462
+
463
+ - **The App's owner** (the user or organization that owns the App), always.
464
+ - **Accounts in `WARDBY_GITHUB_ALLOWED_ACCOUNTS`**, comma-separated logins:
465
+
466
+ WARDBY_GITHUB_ALLOWED_ACCOUNTS=acme-labs
467
+
468
+ Every other account is refused: its events are answered `202` and ignored before
469
+ anything is recorded, and `link_repository` and coding profiles refuse its
470
+ repositories with `github_account_not_allowed`, even with `adminOverride`.
471
+ There is no setting that serves every account.
472
+
473
+ wardby removes the App from another account's installation only when that
474
+ account installs the App or changes the installation's repository selection.
475
+ Installations that already exist on other accounts stay installed (their
476
+ events are ignored); remove them by hand in the App's settings under
477
+ **Install App**.
478
+
479
+ **When you upgrade**, existing repository links and scheduled runs on
480
+ repositories of accounts that are not served start failing with
481
+ `github_account_not_allowed`. List those accounts in the variable first if they
482
+ should keep working.
483
+
484
+ A private App can only be installed on its owner, so it needs nothing here. Set
485
+ the variable when the App must be installable by other accounts, for example
486
+ when an organization owns the App and a user's repositories should be served
487
+ too. Logins are matched case-insensitively; a malformed value stops the server
488
+ at startup.
489
+
490
+ wardby reads the App's owner login from GitHub (`GET /app`, with the App's own
491
+ credentials) and remembers it until it restarts. If it cannot read the owner,
492
+ it refuses rather than guesses. After you transfer the App to another owner or
493
+ rename the owner account, list the new owner in
494
+ `WARDBY_GITHUB_ALLOWED_ACCOUNTS` (or restart wardby) before relying on it:
495
+ until then, events from the new owner are ignored. Before removing the App
496
+ from an installation, wardby re-reads the owner, so it never removes the App
497
+ from its current owner.
498
+
499
+ Each wardby server should have its own GitHub App: never point other people at
500
+ yours; give them the setup steps above instead.
501
+
447
502
  ### `GITHUB_APP_WEBHOOK_SECRET`
448
503
 
449
504
  Set alongside `GITHUB_APP_ID` and `GITHUB_APP_PRIVATE_KEY`
@@ -501,6 +556,11 @@ the full desired state. Two common shapes:
501
556
  }
502
557
  ```
503
558
 
559
+ With Wardby 0.6.0 or later, a `pull_request` reviewer's review of a pull request
560
+ opened by a delegated coding run is held until the run that delegated it
561
+ finishes, whether or not this link sets `waitForCi` — see [Reviewing a pull request a delegated run
562
+ opened](#reviewing-a-pull-request-a-delegated-run-opened) below.
563
+
504
564
  Add `"waitForCi": true` to a `pull_request` link to hold the reviewer's
505
565
  review of a pushed head until that head's own CI finishes, instead of racing
506
566
  it — see [Review after CI (`waitForCi`)](#review-after-ci-waitforci) below.
@@ -570,6 +630,53 @@ The errors you may get while linking:
570
630
  | 409 | Another agent already holds the `mention` or `review_fix` trigger, or this `checkName`, on the repository. |
571
631
  | 503 | GitHub could not be asked (e.g. the App isn't installed on the repository). Nothing was changed. |
572
632
 
633
+ ### Reviewing a pull request a delegated run opened
634
+
635
+ > **Requires Wardby 0.6.0 or later.** Earlier releases review a delegated
636
+ > run's pull request on its first push, like any other.
637
+
638
+ A coding run can be delegated: a lead agent's `delegate_to_<name>` call
639
+ starts a coding sub-agent that pushes the branch and opens the pull request
640
+ (see [Fanning out to several builders](agent-recipes.md#fanning-out-to-several-builders)).
641
+ While the lead run that delegated it is still running, every reviewer linked
642
+ with the `pull_request` trigger holds its review of that pull request instead
643
+ of starting on the first push — including a reviewer with no `waitForCi` set.
644
+ The review starts once the lead run finishes, however it ends (including
645
+ failing, being cancelled or being lost).
646
+
647
+ Holding the review this way means the request's other pull requests, if any,
648
+ have also been opened by the time any of them is reviewed. When the lead run
649
+ finishes normally, the **Related pull requests** section on each of them has
650
+ also been rewritten with the full list (see [Related pull requests across
651
+ repositories](../help/related-pull-requests.md)). When it is ended another
652
+ way (for example, cancelled), the held reviews start without that section
653
+ having been rewritten, so it can be incomplete. Either way, a reviewer should
654
+ use `repo_pr_read`'s `relatedPullRequests`, which is computed from Wardby's
655
+ own records on every call, so it does not report a field, route, or schema as
656
+ missing only because a sibling repository's pull request had not been opened
657
+ yet.
658
+
659
+ - A reviewer linked with `waitForCi` then also waits for CI on the head, once
660
+ the lead run finishes, exactly as described below — with its own full
661
+ 15-minute fallback, counted from that point, not from the original push.
662
+ - If the deployment cannot tell whether the pull request's opening run was
663
+ delegated (for example, the host call to read its origin fails), the
664
+ review starts immediately instead, exactly as it would without this
665
+ behaviour.
666
+ - These pull requests are never held by this: one opened directly by a
667
+ coding run that was not delegated, one opened by a human, and one on a
668
+ local repository (which has no origin to read).
669
+ - A later request that continues an already-open pull request is not held
670
+ again: the request that opened it has already finished. A push that
671
+ continues the pull request inside the same, still-running request is held
672
+ like the first one.
673
+ - As with the CI fallback below, a hold here does not depend on the
674
+ instance that started it still running when the lead run finishes:
675
+ Wardby's reconciliation sweep reconsiders every review held for at least
676
+ 15 minutes and releases it once the lead run has finished or no longer
677
+ exists, wherever the scheduler process runs. A held review is dropped
678
+ unreleased after 24 hours, the same as a review held for CI.
679
+
573
680
  ### Review after CI (`waitForCi`)
574
681
 
575
682
  `waitForCi` (boolean, default `false`, only on a `pull_request` link — 400
@@ -666,7 +773,20 @@ internal marker to the model:
666
773
  `note` telling the agent to follow CI over the description's **Tests**.
667
774
  Reading CI never makes `repo_pr_read` fail: an unreadable result is
668
775
  `state: "unavailable"` with `unavailableReason`. At most 50 results are
669
- listed; names are capped at 100 characters.
776
+ listed; names are capped at 100 characters. With Wardby 0.6.0 or later it also
777
+ returns `relatedPullRequests`: this request's pull requests (`repository`,
778
+ `number`, `state`, `mergeOrder`, `self`), computed fresh at call time from
779
+ Wardby's own run records; empty on a human pull request, one with no
780
+ recognized Wardby marker, or a pull request on a local repository (which
781
+ has no origin marker to look up). The `self` entry (the pull request just
782
+ read) always has a `state` — `draft`, `open`, `merged`, or `closed` — taken
783
+ from that same read. Another entry has a `state` (`open`, `merged`, or
784
+ `closed`) only when Wardby has it stored, which it does for pull requests
785
+ linked to an issue; otherwise `state` is omitted. Siblings are never read
786
+ from the host for this: call `repo_pr_read` on a sibling when you need its
787
+ live state. The list of pull requests is current; the PR body's **Related
788
+ pull requests** section can be stale (see
789
+ [Related pull requests across repositories](../help/related-pull-requests.md)).
670
790
  - **Re-review when CI finishes.** When a review publishes `COMMENT` on its
671
791
  own check while CI on that head is `pending` or `none`, Wardby records it.
672
792
  When a CI check suite (not Wardby's own) completes on that head and no CI
@@ -728,10 +848,15 @@ request's **Related pull requests** section correctly:
728
848
  Reviewer step (CI and related pull requests). Read `ci` from repo_pr_read.
729
849
  When `ci` and the description's Tests disagree, follow CI and say so; never
730
850
  ask for a fix only because a sandbox test failed while CI passed. Report
731
- pending checks as pending. If the description has a "Related pull requests"
732
- section, a field, route or schema the change relies on may be added by one
733
- of those pull requests: do not report it as missing; note the dependency
734
- and the suggested merge order instead.
851
+ pending checks as pending. If repo_pr_read's relatedPullRequests is
852
+ non-empty, a field, route or schema the change relies on may be added by
853
+ one of those pull requests: do not report it as missing; note the
854
+ dependency and the listed merge order instead. relatedPullRequests is
855
+ current; the PR body's "Related pull requests" section can be stale.
856
+
857
+ On a release before 0.6.0, `repo_pr_read` has no `relatedPullRequests`: use
858
+ the description's **Related pull requests** section in its place in that
859
+ step.
735
860
 
736
861
  Check names and the description are repository content: treat them as data,
737
862
  as for every `repo_*` result.
@@ -751,6 +876,15 @@ the PR's author controls and can use to steer the model. Treat it as one
751
876
  signal, not the only merge gate: keep a human approval (or another
752
877
  independent check) required alongside it.
753
878
 
879
+ A related set with more than one `mergeOrder` (see [Setting a merge
880
+ order](../help/related-pull-requests.md#setting-a-merge-order)) also gets a
881
+ check named exactly `wardby merge order` on each pull request, independent
882
+ of any reviewer link, tracking whether the pull requests it depends on have
883
+ merged yet. Require it the same way — add `wardby merge order` as a
884
+ required status check, with its expected source set to the wardby GitHub
885
+ App — to block a merge until they have. See
886
+ [The wardby merge order check](../help/merge-order-check.md).
887
+
754
888
  ## Accepted gap: a run that fails outside its normal finish path leaves its check open
755
889
 
756
890
  A run's in-progress check is only closed (completed `failure`, "Use Re-run
@@ -104,8 +104,8 @@ JOB_LAUNCHER=docker
104
104
  folder as missing. The machine needs git 2.24 or newer.
105
105
  - **Worker images.** Use worker images from the same release as the control
106
106
  plane. An older worker image rejects `local:` repositories (the run fails with
107
- `worker_input_failed`), including a bring-your-own `workerImageRef` image,
108
- which must be rebuilt on a current driver image.
107
+ `worker_input_failed`), including a Codex agent's bring-your-own
108
+ `workerImageRef` image, which must be rebuilt on a current driver image.
109
109
 
110
110
  ### What a coding run does
111
111
 
@@ -133,6 +133,23 @@ same branch; if the branch has moved, or is checked out, the run fails with
133
133
  Result branches accumulate, and wardby does not delete them. Clean up with
134
134
  `git branch -D wardby/run-<run id>`.
135
135
 
136
+ ### Toolchains for local repositories
137
+
138
+ The default workspace is Node. A coding agent whose `codingProfile` sets
139
+ `toolchain: "node-python"` and `toolchainVersion: "3.12"` runs in a Node +
140
+ Python 3.12 workspace with `pytest` and `ruff`, for Codex and for Claude Code.
141
+ The server selects the image from `CODING_WORKER_IMAGE_NODE_PYTHON_3_12`
142
+ (Codex) or `CODING_CLAUDE_TOOL_RUNNER_IMAGE_NODE_PYTHON_3_12` (Claude Code); a
143
+ `node-python` agent is refused when the variable for its provider is unset.
144
+ `quickstart` sets this up for you when the repository has a Python marker file
145
+ (`pyproject.toml`, `setup.py`, `setup.cfg`, `Pipfile` or `requirements*.txt`)
146
+ at its committed root; see
147
+ [Python projects](getting-started.md#python-projects).
148
+
149
+ For any other language, use `codingProfile.workerImageRef` (admin only). It is
150
+ a custom image for the container that runs the agent's commands, for Codex and
151
+ for Claude Code; see [Bring-your-own worker images](coding-worker-byo-images.md).
152
+
136
153
  ### Review agents
137
154
 
138
155
  Link a native review agent with `link_repository` (`provider: "local"`,
@@ -202,6 +219,8 @@ GITHUB_APP_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVA
202
219
  `npm run claude:images:local` builds the Claude agent image and both tool-runner
203
220
  images (`wardby-claude-tool-runner:phase5`, and
204
221
  `wardby-claude-tool-runner:phase5-node-python` for the `node-python` toolchain).
222
+ It also builds `wardby-claude-tool-runner-custom:phase5`, a test-only custom
223
+ tool runner that `npm run test:claude-docker` needs.
205
224
  This local, immutable-`sha256:` ID form of the `CODING_CLAUDE_*` images is only
206
225
  accepted by the Docker launcher.
207
226
  `JOB_LAUNCHER=kubernetes` needs both images pushed to a registry and set as
@@ -245,6 +264,112 @@ See [release verification](release-verification.md) for the complete gate.
245
264
  If the repository has `docs/knowledge/index.md`, every coding run's prompt
246
265
  includes it. See [Architecture knowledge bundles](knowledge.md).
247
266
 
267
+ ## Repository instructions
268
+
269
+ Every coding run loads the repository's own instructions; there is no
270
+ `codingProfile` setting to turn this off. Codex reads the repository's
271
+ `AGENTS.md` itself, directly from the checkout. Claude Code is handed
272
+ `CLAUDE.md`, `.claude/CLAUDE.md`, and whatever either file pulls in with
273
+ `@path` imports, up to 5 import levels deep; a repository that only has
274
+ `AGENTS.md` gets a one-line `CLAUDE.md` that imports it, so a repository
275
+ written for another coding agent still has its instructions in Claude Code.
276
+ Subdirectory `CLAUDE.md` files (anything other than the repository root and
277
+ `.claude/CLAUDE.md`) are not loaded unless an imported file pulls them in.
278
+
279
+ Claude Code's instructions and skills are read from the checkout and bounded:
280
+ at most 64 KiB per file, 200 files, and 256 KiB combined; symlinks and
281
+ non-UTF-8 files are refused. A file that doesn't pass, or that would push
282
+ the run's input past its 512 KiB size limit once encoded (skills and the
283
+ deepest imports are dropped first), is left out and logged as
284
+ `coding.claude_context_skipped` (the first 50 individually, then one
285
+ aggregate line with an overflow count); when the repository's context can't
286
+ be read at all, the run continues without it and logs
287
+ `coding.claude_context_unavailable`. A run never fails because its
288
+ repository context couldn't be loaded.
289
+
290
+ Claude Code never receives the repository's `.claude/settings.json`, hooks,
291
+ `.mcp.json`, agents, or commands — only Markdown instruction files and
292
+ `.claude/skills/<name>/SKILL.md` files pass the allowlist, whatever an
293
+ instruction file imports. Repository instructions and skills are untrusted
294
+ guidance: they can shape a run's work but never relax the worker's sandbox
295
+ rules.
296
+
297
+ ## Claude Code loading mode
298
+
299
+ `codingProfile.claudeBareMode` controls how Claude Code uses the repository
300
+ instructions above. It defaults to `true` and only affects Claude Code
301
+ agents.
302
+
303
+ - **`true` (default, bare mode).** Claude Code keeps its hardened bare mode.
304
+ Wardby adds the repository's instruction files to the system prompt in
305
+ full, and lists each skill by name, description, and path; the model reads
306
+ a skill's full `SKILL.md` itself with `run_command`.
307
+ - **`false`.** Bare mode is off. Claude Code loads `CLAUDE.md` and skills
308
+ itself, through its native Skill tool, instead of reading them from the
309
+ system prompt. Repository settings, hooks, MCP configuration, agents, and
310
+ commands are still never loaded in either mode; native loading also locks
311
+ Claude Code's own hooks to wardby's managed set.
312
+
313
+ If the worker can't write the native-mode context to disk for a run, that
314
+ run falls back to bare mode instead of failing, and the worker logs a
315
+ `claude_context_unavailable` warning.
316
+
317
+ The agent owner or an admin can change it:
318
+
319
+ ```json
320
+ { "id": "<agent-id>", "codingProfile": { "claudeBareMode": false } }
321
+ ```
322
+
323
+ ## Repository skills
324
+
325
+ `codingProfile.repoSkills` loads the repository's own agent skills into a
326
+ run. It defaults to `true`.
327
+
328
+ | Builder | Reads skills from | `repoSkills: true` (default) | `repoSkills: false` |
329
+ | ----------- | ----------------------------------- | --------------------------------------------------- | ---------------------------------- |
330
+ | Codex | `.agents/skills/`, `.codex/skills/` | Repository skills load | Every repository skill is disabled |
331
+ | Claude Code | `.claude/skills/<name>/SKILL.md` | Repository skills load (bare or native mode, above) | No skill context is collected |
332
+
333
+ Codex's own four built-in skills (`imagegen`, `openai-docs`, `skill-creator`,
334
+ `skill-installer`) are always disabled, whatever `repoSkills` is set to —
335
+ wardby's coding runs never offer them. With `repoSkills: false`, the Codex
336
+ worker scans both roots for the skill names to disable; that scan stops after
337
+ 2000 directory entries, to bound the work an adversarial skills tree could
338
+ cause, logs `codex_skill_scan_truncated`, and disables whatever names it found
339
+ so far rather than failing the run.
340
+
341
+ Claude Code skills ship to the worker as their `SKILL.md` only. A skill's
342
+ other files (scripts, references, data) stay in the repository checkout and
343
+ are read or run through the command runner at
344
+ `/workspace/.claude/skills/<name>/`.
345
+
346
+ Turn repository skills off for an agent:
347
+
348
+ ```json
349
+ { "id": "<agent-id>", "codingProfile": { "repoSkills": false } }
350
+ ```
351
+
352
+ **Upgrading.** `repoSkills` and `claudeBareMode` both default to `true`, so
353
+ upgrading changes behavior for existing agents: Claude Code agents start
354
+ loading `CLAUDE.md` and `.claude/skills/` (previously neither was loaded),
355
+ and Codex agents stop getting Codex's own built-in skills (previously always
356
+ offered). Set `repoSkills: false` on an agent to keep its repository's
357
+ skills out of its runs; there is no setting that keeps repository
358
+ instructions themselves out, for either builder.
359
+
360
+ Use the worker images (`CODING_WORKER_IMAGE` and `CODING_CLAUDE_WORKER_IMAGE`)
361
+ from the same release as the control plane. On an older Claude Code worker
362
+ image, runs fail with `worker_input_failed` once the repository has a
363
+ `CLAUDE.md`, `AGENTS.md`, or skill to load, or the agent sets `repoSkills` or
364
+ `claudeBareMode` to `false`; on an older Codex worker image, runs of agents with
365
+ `repoSkills: false` fail the same way. A `workerImageRef` image must also be
366
+ rebuilt for this release: on this release's driver image for a Codex agent, or
367
+ on this release's tool runner image for a Claude Code agent. On a Claude Code
368
+ agent, `workerImageRef` replaces only the tool runner (the container that runs
369
+ the agent's commands); Claude Code itself always runs on
370
+ `CODING_CLAUDE_WORKER_IMAGE`. See
371
+ [Bring-Your-Own Coding-Worker Images](coding-worker-byo-images.md).
372
+
248
373
  ## Budgets
249
374
 
250
375
  A coding run's budget is reserved when it is dispatched: the agent's own
@@ -42,8 +42,10 @@ request never names the internal proxy.
42
42
  image to build or maintain; the agent installs what it needs at run time.
43
43
  2. **A custom `workerImageRef` with dependencies baked in.** Still supported:
44
44
  point the agent's profile at your own image, built on wardby's driver base
45
- image (see [Bring-your-own worker images](coding-worker-byo-images.md)),
46
- with everything preinstalled. Setting `workerImageRef` needs `agents:admin`
45
+ image for a Codex agent, or `FROM` the same release's tool runner image for
46
+ a Claude Code agent (see
47
+ [Bring-your-own worker images](coding-worker-byo-images.md)), with
48
+ everything preinstalled. Setting `workerImageRef` needs `agents:admin`
47
49
  and the admin role, and the image must be pinned by digest.
48
50
  3. **Both together.** Use a custom image for a toolchain or system libraries
49
51
  the registry can't provide (a compiler, a non-Node/Python runtime, apt
@@ -69,14 +71,15 @@ it widens what the agent can download.
69
71
 
70
72
  `packageAllowlist` is keyed by ecosystem (`npm`, `pypi`), each an array of
71
73
  approved top-level entries. An entry is a bare package name, a name with a
72
- version range in that ecosystem's own syntax, or (npm only) a scope wildcard:
74
+ version range in that ecosystem's own syntax, (PyPI only) a name with extras,
75
+ or (npm only) a scope wildcard:
73
76
 
74
77
  ```json
75
78
  {
76
79
  "codingProfile": {
77
80
  "packageAllowlist": {
78
81
  "npm": ["react@^19", "@testing-library/*"],
79
- "pypi": ["flask>=3"]
82
+ "pypi": ["flask>=3", "psycopg[binary]>=3.2"]
80
83
  }
81
84
  }
82
85
  }
@@ -85,6 +88,9 @@ version range in that ecosystem's own syntax, or (npm only) a scope wildcard:
85
88
  - `react@^19` — npm semver range syntax.
86
89
  - `@testing-library/*` — every package under that npm scope.
87
90
  - `flask>=3` — PEP 440 specifier syntax for PyPI.
91
+ - `psycopg[binary]>=3.2` — a PyPI package with the extras it is installed
92
+ with, in PEP 508 form: `name[extra1,extra2]`, optionally followed by a
93
+ specifier. See [PyPI extras](#pypi-extras).
88
94
  - A bare name with no range (`"lodash"`) allows any version, subject to the
89
95
  other safeguards below.
90
96
  - npm names are matched exactly, including case. npm treats some legacy
@@ -100,6 +106,100 @@ metadata and grows the run's allowance automatically as npm or pip requests
100
106
  each dependency's metadata, so you don't have to enumerate transitive
101
107
  dependencies yourself.
102
108
 
109
+ ### PyPI extras
110
+
111
+ A PyPI package can declare optional dependencies under named _extras_:
112
+ `pip install "psycopg[binary]"` also installs `psycopg-binary`, which
113
+ `psycopg` declares only under its `binary` extra. Without the extra on the
114
+ allowlist, the proxy follows only a package's plain dependencies, so
115
+ `psycopg-binary` would be refused with `wardby_package_not_allowed` even
116
+ though `psycopg` is allowed.
117
+
118
+ Name the extras on the entry, exactly as you would to pip:
119
+
120
+ ```json
121
+ { "pypi": ["psycopg[binary]", "uvicorn[standard]>=0.30", "celery[redis,msgpack]"] }
122
+ ```
123
+
124
+ - Each extra must be a valid extra name (letters, digits, and `.`, `_` or `-`
125
+ between them), at most 32 per entry. Extras are compared after PEP 685
126
+ normalization (lower case, runs of `-`, `_` and `.` become `-`), so
127
+ `[Foo_Bar]` and `[foo-bar]` are the same extra.
128
+ - An extra allows only the dependencies the package's own metadata declares
129
+ under that extra (`Requires-Dist: psycopg-binary==3.2.3; implementation_name
130
+ != "pypy" and extra == "binary"`). The rest of such a line's environment
131
+ marker is not evaluated, so the extra's dependencies are allowed on every
132
+ platform; pip still installs only what applies. Dependencies under any
133
+ other extra stay refused.
134
+ - An entry without brackets follows no extras at all — neither its own nor
135
+ its dependencies'. When a plain entry's metadata asks for a dependency with
136
+ extras (`fastapi` declaring `uvicorn[standard]>=0.30`), the dependency is
137
+ allowed as the bare package, exactly as for any plain dependency, and the
138
+ packages under its extra stay refused. To allow them, name the extra on the
139
+ allowlist: `fastapi[standard]`, or `uvicorn[standard]` directly.
140
+ - Dependencies' extras are followed only below a package the run allows with
141
+ extras: an entry that names extras, or a dependency such a package's
142
+ metadata asks for with extras. Below `fastapi[standard]`, a
143
+ `uvicorn[standard]` dependency line allows `uvicorn`'s `standard` packages
144
+ too. A dependency reached that way without extras of its own gets only its
145
+ plain dependencies.
146
+ - The same package may appear in several entries; their extras are combined.
147
+ - An extra that a dependency line asks for is followed only once the proxy has
148
+ served that parent's metadata. If pip reads the dependency before its parent
149
+ (for example because the dependency is also an allowlist entry) and the
150
+ extra's packages are refused with `403 wardby_package_not_allowed`, name the
151
+ extra on the allowlist directly, e.g. `uvicorn[standard]`.
152
+ - The extra markers the proxy recognises are `extra == "name"`,
153
+ `extra === "name"`, and the reversed forms `"name" == extra` and
154
+ `"name" === extra` (single or double quotes, inside `and`/`or` and
155
+ parentheses).
156
+ - A marker that mentions `extra` in any other form (`"name" in extra`,
157
+ `extra in "a b"`, a bare `extra`, or a marker with an unbalanced quote) is
158
+ treated as gated on no extra: that line is never followed, for any entry,
159
+ plain or not. Allowlist the package it names directly if you need it.
160
+ - The proxy reads a wheel's `METADATA` only up to the end of its headers (the
161
+ first empty line); `Requires-Dist` text in the package description after
162
+ them is ignored.
163
+
164
+ The last two rules apply to every PyPI allowlist, including ones without any
165
+ extras, and are deliberately fail-closed: a dependency line the proxy cannot
166
+ read with certainty is not followed. If a package that installed before is now
167
+ refused with `403 wardby_package_not_allowed` because its parent declares it
168
+ that way, add it to the allowlist directly.
169
+
170
+ Extras on allowlist entries need the coding proxy and the control plane at the
171
+ same Wardby version. A proxy from before extras support cannot parse a
172
+ `name[extra]` entry at all: the whole allowlist fails to load, so **every**
173
+ registry request of a run with such an entry fails, not just that package.
174
+ Upgrade the proxy before (or with) the control plane. For the same reason,
175
+ once any coding profile stores an extras entry, downgrading the control plane
176
+ or proxy below the release that added extras is unsafe; remove the extras
177
+ entries first.
178
+
179
+ Every safeguard below (release age, advisories, wheels only, the record of
180
+ what was fetched) applies to packages reached through an extra.
181
+
182
+ ### The quickstart offers a repository's declared packages
183
+
184
+ The quickstart's coding step (see
185
+ [Get started](getting-started.md#packages-the-repository-declares)) reads the
186
+ dependencies the chosen local repository declares at the root of its base
187
+ commit — `package.json` (`dependencies`, `devDependencies`,
188
+ `optionalDependencies`), `pyproject.toml` (`[project]` dependencies, optional
189
+ dependency groups, Poetry dependencies and groups, and Poetry's legacy
190
+ `[tool.poetry.dev-dependencies]`, plus its `[build-system] requires` build
191
+ packages, or `setuptools` and `wheel` when there is no `[build-system]` table)
192
+ and `requirements*.txt` —
193
+ and offers them as `local-builder`'s allowlist: names without versions (PyPI
194
+ names PEP 503-normalized, keeping the extras a requirement names, such as
195
+ `psycopg[binary]`, merged per package), invalid names dropped, at most 200 per
196
+ ecosystem. It asks
197
+ before adding them; a `--non-interactive` run adds them only with
198
+ `--allow-repo-packages`. Every safeguard on this page still applies to those
199
+ entries. A re-run of the quickstart replaces the builder's allowlist with the
200
+ repository's current set (or an empty one if declined), so make lasting
201
+ additions on a builder you created yourself, or re-apply them after a re-run.
202
+
103
203
  ### Lockfile installs: verified, then approved exactly
104
204
 
105
205
  `npm ci` (or `npm install` with a complete `package-lock.json`) skips
@@ -429,7 +529,7 @@ see on a failed install:
429
529
 
430
530
  | Code | Status | Meaning / what to do |
431
531
  | ------------------------------------ | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
432
- | `wardby_package_not_allowed` | 403 | The package isn't on the allowlist and isn't reachable from an allowlisted package's dependency graph. Add it (or its top-level dependent) to `packageAllowlist`. |
532
+ | `wardby_package_not_allowed` | 403 | The package isn't on the allowlist and isn't reachable from an allowlisted package's dependency graph. Add it (or its top-level dependent) to `packageAllowlist`. For a PyPI package an extra pulls in (`psycopg-binary` for `psycopg[binary]`), name the extra on the entry instead. |
433
533
  | `wardby_file_not_allowed` | 403 | The specific file type is never served for this ecosystem (for example a PyPI sdist). Nothing to configure; use a wheel. |
434
534
  | `wardby_version_filtered` | 404 | Every matching version is too new (younger than `minReleaseAgeDays`) or withheld by the vulnerability audit. Wait for it to age past the threshold, or lower `minReleaseAgeDays` if you understand the risk. |
435
535
  | `wardby_package_not_found` | 404 | The upstream registry has no such package name. Check the spelling (npm names are case-sensitive). |
@@ -194,7 +194,9 @@ to an agent that allows at least one service.
194
194
 
195
195
  A [bring-your-own worker image](coding-worker-byo-images.md) must be built on
196
196
  driver v11 or later to run with services; an agent whose `workerImageRef`
197
- predates driver v11 rejects the run input once services are on it.
197
+ predates driver v11 rejects the run input once services are on it. For a
198
+ Claude Code agent, build the custom image `FROM` the tool runner image of the
199
+ same wardby release.
198
200
 
199
201
  ## Letting a coding agent change the declaration
200
202