@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.
- package/.env.example +33 -0
- package/README.md +25 -14
- package/dist/claude-coding-worker/context.d.ts +22 -0
- package/dist/claude-coding-worker/context.js +92 -0
- package/dist/claude-coding-worker/driver.d.ts +7 -1
- package/dist/claude-coding-worker/driver.js +38 -5
- package/dist/claude-coding-worker/sdk.js +13 -4
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +5 -2
- package/dist/cli-native-mode.d.ts +9 -0
- package/dist/cli-native-mode.js +20 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +141 -5
- package/dist/coding/claude-context.d.ts +45 -0
- package/dist/coding/claude-context.js +434 -0
- package/dist/coding/local-git.js +9 -1
- package/dist/coding/profile.d.ts +12 -0
- package/dist/coding/profile.js +6 -0
- package/dist/coding/protocol.d.ts +104 -0
- package/dist/coding/protocol.js +87 -3
- package/dist/coding/registry/pypi.d.ts +25 -1
- package/dist/coding/registry/pypi.js +140 -16
- package/dist/coding/registry/types.d.ts +17 -3
- package/dist/coding-worker/artifact.d.ts +8 -0
- package/dist/coding-worker/artifact.js +2 -2
- package/dist/coding-worker/driver.js +2 -0
- package/dist/coding-worker/sdk.d.ts +6 -0
- package/dist/coding-worker/sdk.js +1 -0
- package/dist/coding-worker/skills.d.ts +23 -0
- package/dist/coding-worker/skills.js +117 -0
- package/dist/coding-worker/types.d.ts +2 -0
- package/dist/config/github-allowed-accounts.d.ts +15 -0
- package/dist/config/github-allowed-accounts.js +36 -0
- package/dist/config/low-power.d.ts +12 -0
- package/dist/config/low-power.js +18 -0
- package/dist/config/mobile.d.ts +12 -0
- package/dist/config/mobile.js +18 -0
- package/dist/config/providers.d.ts +56 -2
- package/dist/config/providers.js +92 -6
- package/dist/core/db.d.ts +16 -6
- package/dist/core/db.js +12 -10
- package/dist/core/dispatch.d.ts +11 -0
- package/dist/core/dispatch.js +36 -1
- package/dist/core/engine-native.js +9 -5
- package/dist/core/host-events.d.ts +49 -3
- package/dist/core/host-events.js +289 -15
- package/dist/core/http-runtime.js +13 -6
- package/dist/core/issue-bridge.js +42 -2
- package/dist/core/issue-events.js +12 -1
- package/dist/core/issue-status.js +14 -3
- package/dist/core/merge-order-check.d.ts +129 -0
- package/dist/core/merge-order-check.js +336 -0
- package/dist/core/notification-dispatcher.d.ts +70 -0
- package/dist/core/notification-dispatcher.js +368 -0
- package/dist/core/notification-templates.d.ts +25 -0
- package/dist/core/notification-templates.js +105 -0
- package/dist/core/notifications.d.ts +10 -0
- package/dist/core/notifications.js +38 -0
- package/dist/core/pg-auth.d.ts +22 -0
- package/dist/core/pg-auth.js +152 -0
- package/dist/core/power-composition.d.ts +16 -0
- package/dist/core/power-composition.js +37 -0
- package/dist/core/power-idle.d.ts +14 -0
- package/dist/core/power-idle.js +30 -0
- package/dist/core/power.d.ts +71 -0
- package/dist/core/power.js +202 -0
- package/dist/core/reconciler.d.ts +4 -2
- package/dist/core/reconciler.js +29 -5
- package/dist/core/related-pull-requests.d.ts +48 -4
- package/dist/core/related-pull-requests.js +113 -11
- package/dist/core/repo-access.d.ts +15 -0
- package/dist/core/repo-access.js +66 -0
- package/dist/core/review-fix.d.ts +37 -0
- package/dist/core/review-fix.js +207 -6
- package/dist/core/review-host-tools.d.ts +20 -0
- package/dist/core/review-host-tools.js +58 -2
- package/dist/core/runner.d.ts +336 -3
- package/dist/core/runner.js +894 -317
- package/dist/core/secret-broker-config.d.ts +103 -0
- package/dist/core/secret-broker-config.js +112 -0
- package/dist/core/secrets.d.ts +39 -4
- package/dist/core/secrets.js +148 -40
- package/dist/core/workflow-event-recorder.d.ts +14 -0
- package/dist/core/workflow-event-recorder.js +120 -0
- package/dist/core/workflow-events.d.ts +82 -0
- package/dist/core/workflow-events.js +44 -0
- package/dist/core/workflow-run-events.d.ts +16 -0
- package/dist/core/workflow-run-events.js +40 -0
- package/dist/generated/prisma/browser.d.ts +58 -0
- package/dist/generated/prisma/client.d.ts +58 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +150 -0
- package/dist/generated/prisma/enums.d.ts +27 -0
- package/dist/generated/prisma/enums.js +23 -0
- package/dist/generated/prisma/internal/class.d.ts +88 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +772 -1
- package/dist/generated/prisma/internal/prismaNamespace.js +135 -4
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +139 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +135 -4
- package/dist/generated/prisma/models/Agent.d.ts +360 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +73 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +205 -1
- package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1675 -0
- package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1517 -0
- package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
- package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
- package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
- package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
- package/dist/generated/prisma/models/NotificationChannel.js +1 -0
- package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
- package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
- package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
- package/dist/generated/prisma/models/NotificationThread.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +826 -1
- package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
- package/dist/generated/prisma/models/Secret.d.ts +37 -1
- package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
- package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
- package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
- package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
- package/dist/generated/prisma/models.d.ts +8 -0
- package/dist/help/build.js +4 -2
- package/dist/help/catalog.d.ts +1 -1
- package/dist/help/catalog.js +31 -6
- package/dist/help-index.json +1492 -113
- package/dist/import/create.js +17 -0
- package/dist/import/neutral-schema.d.ts +6 -2
- package/dist/import/neutral-schema.js +2 -0
- package/dist/mcp/auth/access.d.ts +1 -0
- package/dist/mcp/auth/ownership.d.ts +1 -1
- package/dist/mcp/auth/repo-authorization.js +14 -0
- package/dist/mcp/auth/resource-server.d.ts +2 -1
- package/dist/mcp/auth/resource-server.js +7 -2
- package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/browser.js +19 -6
- package/dist/mcp/context.d.ts +6 -0
- package/dist/mcp/host-events/github-ingress.d.ts +23 -1
- package/dist/mcp/host-events/github-ingress.js +68 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.js +59 -10
- package/dist/mcp/tools/agents.js +83 -12
- package/dist/mcp/tools/notification-channels.d.ts +2 -0
- package/dist/mcp/tools/notification-channels.js +293 -0
- package/dist/mcp/tools/power.d.ts +2 -0
- package/dist/mcp/tools/power.js +77 -0
- package/dist/mcp/tools/runs.d.ts +0 -6
- package/dist/mcp/tools/runs.js +7 -2
- package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
- package/dist/mcp/tools/secret-broker-compat.js +23 -0
- package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
- package/dist/mcp/tools/secret-elicitation-form.js +200 -10
- package/dist/mcp/tools/secret-elicitation-server.js +8 -1
- package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
- package/dist/mcp/tools/secret-elicitation.js +110 -12
- package/dist/mcp/tools/secrets.js +184 -7
- package/dist/mcp/tools/tools.d.ts +1 -1
- package/dist/mcp/tools/tools.js +22 -2
- package/dist/native-worker/composition.d.ts +23 -0
- package/dist/native-worker/composition.js +77 -0
- package/dist/native-worker/docker-isolation.d.ts +65 -0
- package/dist/native-worker/docker-isolation.js +183 -0
- package/dist/native-worker/docker-launcher.d.ts +74 -0
- package/dist/native-worker/docker-launcher.js +237 -0
- package/dist/native-worker/gateway-server.d.ts +39 -0
- package/dist/native-worker/gateway-server.js +315 -0
- package/dist/native-worker/gateway.d.ts +44 -0
- package/dist/native-worker/gateway.js +197 -0
- package/dist/native-worker/http-server.d.ts +22 -0
- package/dist/native-worker/http-server.js +109 -0
- package/dist/native-worker/http-transport.d.ts +17 -0
- package/dist/native-worker/http-transport.js +88 -0
- package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
- package/dist/native-worker/kubernetes-isolation.js +218 -0
- package/dist/native-worker/kubernetes-launcher.d.ts +102 -0
- package/dist/native-worker/kubernetes-launcher.js +335 -0
- package/dist/native-worker/launch.d.ts +45 -0
- package/dist/native-worker/launch.js +44 -0
- package/dist/native-worker/ledger.d.ts +109 -0
- package/dist/native-worker/ledger.js +192 -0
- package/dist/native-worker/loopback.d.ts +12 -0
- package/dist/native-worker/loopback.js +49 -0
- package/dist/native-worker/main.d.ts +7 -0
- package/dist/native-worker/main.js +74 -0
- package/dist/native-worker/protocol.d.ts +744 -0
- package/dist/native-worker/protocol.js +200 -0
- package/dist/native-worker/sandbox-executor.d.ts +68 -0
- package/dist/native-worker/sandbox-executor.js +210 -0
- package/dist/native-worker/stdio.d.ts +29 -0
- package/dist/native-worker/stdio.js +188 -0
- package/dist/native-worker/warm-delivery.d.ts +16 -0
- package/dist/native-worker/warm-delivery.js +33 -0
- package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
- package/dist/native-worker/warm-pool-ledger.js +73 -0
- package/dist/native-worker/warm-pool.d.ts +107 -0
- package/dist/native-worker/warm-pool.js +283 -0
- package/dist/native-worker/worker.d.ts +17 -0
- package/dist/native-worker/worker.js +115 -0
- package/dist/providers/auth/authorization-server.d.ts +3 -0
- package/dist/providers/auth/index.js +2 -0
- package/dist/providers/auth/self-hosted.d.ts +13 -1
- package/dist/providers/auth/self-hosted.js +54 -4
- package/dist/providers/chat/fake.d.ts +46 -0
- package/dist/providers/chat/fake.js +39 -0
- package/dist/providers/chat/index.d.ts +4 -0
- package/dist/providers/chat/index.js +8 -0
- package/dist/providers/chat/slack.d.ts +37 -0
- package/dist/providers/chat/slack.js +105 -0
- package/dist/providers/chat/types.d.ts +42 -0
- package/dist/providers/chat/types.js +19 -0
- package/dist/providers/coding-proxy/mock-upstream.d.ts +33 -0
- package/dist/providers/coding-proxy/mock-upstream.js +116 -0
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +3 -0
- package/dist/providers/coding-proxy/registry/prisma-store.js +17 -0
- package/dist/providers/coding-proxy/registry/service.d.ts +4 -0
- package/dist/providers/coding-proxy/registry/service.js +20 -3
- package/dist/providers/coding-proxy/registry/store.d.ts +18 -1
- package/dist/providers/coding-proxy/registry/store.js +33 -0
- package/dist/providers/coding-proxy/runtime.js +12 -1
- package/dist/providers/coding-proxy/types.d.ts +2 -0
- package/dist/providers/engine/types.d.ts +19 -0
- package/dist/providers/engine/types.js +22 -0
- package/dist/providers/executor/composition.d.ts +24 -1
- package/dist/providers/executor/composition.js +39 -6
- package/dist/providers/executor/container.d.ts +24 -1
- package/dist/providers/executor/container.js +101 -11
- package/dist/providers/executor/dbos.d.ts +42 -0
- package/dist/providers/executor/dbos.js +118 -12
- package/dist/providers/executor/deferred.d.ts +56 -0
- package/dist/providers/executor/deferred.js +119 -0
- package/dist/providers/executor/routing.d.ts +37 -10
- package/dist/providers/executor/routing.js +73 -32
- package/dist/providers/executor/types.d.ts +12 -0
- package/dist/providers/jobs/docker.js +3 -3
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +21 -2
- package/dist/providers/jobs/fake-kubernetes-api.js +42 -1
- package/dist/providers/jobs/kubernetes-api.d.ts +17 -1
- package/dist/providers/jobs/kubernetes-api.js +7 -0
- package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
- package/dist/providers/jobs/kubernetes-client.js +52 -3
- package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
- package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +16 -1
- package/dist/providers/jobs/kubernetes-isolation.js +58 -5
- package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
- package/dist/providers/jobs/kubernetes-platform.js +38 -1
- package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
- package/dist/providers/jobs/kubernetes-preflight.js +4 -2
- package/dist/providers/jobs/kubernetes.d.ts +56 -7
- package/dist/providers/jobs/kubernetes.js +117 -36
- package/dist/providers/jobs/metadata-probes.d.ts +11 -0
- package/dist/providers/jobs/metadata-probes.js +13 -0
- package/dist/providers/jobs/types.d.ts +9 -0
- package/dist/providers/llm/openai.js +0 -1
- package/dist/providers/review-host/github.d.ts +11 -1
- package/dist/providers/review-host/github.js +50 -0
- package/dist/providers/review-host/types.d.ts +23 -0
- package/dist/providers/vcs/github.d.ts +32 -6
- package/dist/providers/vcs/github.js +74 -16
- package/dist/quickstart/coding-db.js +14 -2
- package/dist/quickstart/coding-doctor.d.ts +3 -0
- package/dist/quickstart/coding-doctor.js +3 -0
- package/dist/quickstart/coding-images.d.ts +9 -0
- package/dist/quickstart/coding-images.js +39 -0
- package/dist/quickstart/coding-seed.d.ts +20 -1
- package/dist/quickstart/coding-seed.js +96 -7
- package/dist/quickstart/coding.d.ts +2 -0
- package/dist/quickstart/coding.js +75 -3
- package/dist/quickstart/config.d.ts +2 -0
- package/dist/quickstart/config.js +4 -0
- package/dist/quickstart/images.d.ts +13 -0
- package/dist/quickstart/images.js +80 -12
- package/dist/quickstart/index.d.ts +0 -2
- package/dist/quickstart/index.js +10 -14
- package/dist/quickstart/manifests.d.ts +56 -0
- package/dist/quickstart/manifests.js +523 -0
- package/dist/quickstart/python-detect.d.ts +10 -0
- package/dist/quickstart/python-detect.js +32 -0
- package/dist/quickstart/repo-packages.d.ts +10 -0
- package/dist/quickstart/repo-packages.js +132 -0
- package/dist/quickstart/reviewer-prompt.d.ts +12 -0
- package/dist/quickstart/reviewer-prompt.js +84 -0
- package/dist/quickstart/scenarios.d.ts +19 -0
- package/dist/quickstart/scenarios.js +28 -0
- package/dist/quickstart/sync-reviewer-prompt.d.ts +1 -0
- package/dist/quickstart/sync-reviewer-prompt.js +10 -0
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/brokered-fetch.d.ts +23 -0
- package/dist/sandbox/brokered-fetch.js +37 -0
- package/dist/sandbox/host-functions.d.ts +34 -0
- package/dist/sandbox/host-functions.js +144 -80
- package/dist/sandbox/prelude.js +7 -1
- package/dist/sandbox/run-in-sandbox.d.ts +19 -0
- package/dist/sandbox/run-in-sandbox.js +28 -10
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +3 -1
- package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
- package/dist/sandbox/secret-broker-sigv4.js +49 -0
- package/dist/sandbox/secret-broker.d.ts +34 -0
- package/dist/sandbox/secret-broker.js +162 -0
- package/dist/sandbox/user-tool.d.ts +14 -0
- package/dist/sandbox/user-tool.js +32 -0
- package/dist/serve.js +18 -0
- package/dist/viewer/api-schema.d.ts +214 -18
- package/dist/viewer/api-schema.js +22 -0
- package/dist/viewer/build-schemas.js +4 -1
- package/dist/viewer/event-bus.d.ts +6 -0
- package/dist/viewer/event-bus.js +16 -7
- package/dist/viewer/graph.d.ts +5 -2
- package/dist/viewer/graph.js +7 -2
- package/dist/viewer/http.d.ts +0 -1
- package/dist/viewer/http.js +2 -2
- package/dist/viewer/infra.js +25 -2
- package/dist/viewer/limits.d.ts +4 -0
- package/dist/viewer/limits.js +4 -0
- package/dist/viewer/openapi.d.ts +15 -0
- package/dist/viewer/openapi.js +172 -0
- package/docs/README.md +7 -0
- package/docs/agent-recipes.md +57 -8
- package/docs/architecture-runtime.md +16 -1
- package/docs/code-review-agents.md +139 -5
- package/docs/coding-agent-setup.md +127 -2
- package/docs/coding-packages.md +105 -5
- package/docs/coding-services.md +3 -1
- package/docs/coding-worker-byo-images.md +239 -2
- package/docs/coding-worker-isolation.md +88 -23
- package/docs/getting-started-gke.md +225 -9
- package/docs/getting-started-identity-provider.md +21 -10
- package/docs/getting-started.md +140 -11
- package/docs/jira-agents.md +5 -1
- package/docs/knowledge.md +11 -0
- package/docs/native-sandbox.md +635 -0
- package/docs/release-verification.md +9 -0
- package/docs/security-deployment.md +113 -12
- package/docs/slack-notifications.md +252 -0
- package/docs/tool-secrets.md +252 -0
- package/docs/viewer-api.md +46 -5
- package/docs/viewer-api.openapi.yml +1404 -0
- package/help/admin-viewer.md +6 -2
- package/help/agent-recipes.md +27 -0
- package/help/architecture-agent.md +136 -0
- package/help/brokered-secrets.md +79 -0
- package/help/build-claude-code-image.md +131 -0
- package/help/build-worker-image.md +195 -0
- package/help/code-review-agents.md +68 -6
- package/help/coding-packages.md +31 -2
- package/help/creating-agents.md +14 -0
- package/help/deploy-gke.md +37 -6
- package/help/deployment-targets.md +24 -13
- package/help/errors/coding-provider-not-configured.md +2 -2
- package/help/errors/database-auth-invalid.md +28 -0
- package/help/errors/github-account-not-allowed.md +25 -0
- package/help/errors/low-power-disabled.md +29 -0
- package/help/errors/low-power-scale-forbidden.md +35 -0
- package/help/errors/low-power-wake-timeout.md +30 -0
- package/help/errors/mobile-disabled.md +31 -0
- package/help/errors/native-sandbox-capacity.md +22 -0
- package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
- package/help/errors/native-sandbox-docker-failed.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
- package/help/errors/native-sandbox-image-not-pinned.md +19 -0
- package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
- package/help/errors/native-sandbox-network-unenforced.md +22 -0
- package/help/errors/native-sandbox-requires-catalog.md +31 -0
- package/help/errors/native-sandbox-unavailable.md +19 -0
- package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +20 -0
- package/help/errors/native-sandbox-worker-lost.md +20 -0
- package/help/errors/native-sandbox-worker-unready.md +22 -0
- package/help/errors/secret-broker-body-invalid.md +26 -0
- package/help/errors/secret-broker-changed.md +20 -0
- package/help/errors/secret-broker-config-invalid.md +30 -0
- package/help/errors/secret-broker-conflict.md +27 -0
- package/help/errors/secret-broker-destination-denied.md +28 -0
- package/help/errors/secret-broker-value-invalid.md +28 -0
- package/help/errors/secret-brokered.md +24 -0
- package/help/errors/secret-not-brokered.md +25 -0
- package/help/errors/slack-auth-failed.md +48 -0
- package/help/errors/slack-channel-unreachable.md +39 -0
- package/help/errors/slack-not-configured.md +33 -0
- package/help/getting-started.md +18 -0
- package/help/github.md +18 -1
- package/help/identity-and-access.md +5 -1
- package/help/local-repositories.md +35 -5
- package/help/low-power-mode.md +125 -0
- package/help/merge-order-check.md +117 -0
- package/help/mobile-app.md +54 -0
- package/help/native-sandbox.md +136 -0
- package/help/observability.md +8 -0
- package/help/related-pull-requests.md +70 -9
- package/help/repo-instructions-and-skills.md +91 -0
- package/help/review-fix-rounds.md +10 -0
- package/help/slack-notifications.md +62 -0
- package/help/troubleshooting/coding-workers.md +21 -0
- package/package.json +13 -5
- package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
- package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
- package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
- package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
- package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
- package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
- package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
- package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
- package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
- package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
- package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
- package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
- package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
- package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
- 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
|
|
732
|
-
|
|
733
|
-
of those pull requests: do not report it as missing; note the
|
|
734
|
-
and the
|
|
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
|
|
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
|
package/docs/coding-packages.md
CHANGED
|
@@ -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
|
|
46
|
-
|
|
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,
|
|
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). |
|
package/docs/coding-services.md
CHANGED
|
@@ -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
|
|