tinybeeai 0.0.0-stage → 0.16.1
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/.railway/railway.ts +83 -0
- package/.railway/tsconfig.json +13 -0
- package/AGENTS.md +102 -0
- package/Dockerfile +108 -0
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/localdost.js +29 -0
- package/bin/tinybeeai.js +28 -0
- package/compose.yml +63 -0
- package/demo/payloads/ci_failure.json +46 -0
- package/demo/payloads/outage.json +18 -0
- package/demo/payloads/pr_comment_edited.json +50 -0
- package/demo/payloads/pr_merged.json +80 -0
- package/demo/payloads/pr_opened.json +69 -0
- package/demo/payloads/pr_synchronize.json +69 -0
- package/demo/payloads/ticket_created.json +138 -0
- package/demo/sample-app/playwright.config.ts +20 -0
- package/demo/sample-app/server.ts +163 -0
- package/demo/sample-app/tests/checkout.spec.ts +13 -0
- package/demo/sample-app/tests/smoke.spec.ts +8 -0
- package/dist/agent/approval-retries.js +59 -0
- package/dist/agent/approval-retries.js.map +1 -0
- package/dist/agent/approvals.js +390 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/chat-bridge.js +154 -0
- package/dist/agent/chat-bridge.js.map +1 -0
- package/dist/agent/chat-lead.js +475 -0
- package/dist/agent/chat-lead.js.map +1 -0
- package/dist/agent/chat-loop.js +106 -0
- package/dist/agent/chat-loop.js.map +1 -0
- package/dist/agent/chat-mcp.js +49 -0
- package/dist/agent/chat-mcp.js.map +1 -0
- package/dist/agent/chat-tool-blocks.js +453 -0
- package/dist/agent/chat-tool-blocks.js.map +1 -0
- package/dist/agent/chat-view.js +94 -0
- package/dist/agent/chat-view.js.map +1 -0
- package/dist/agent/chat-views.js +781 -0
- package/dist/agent/chat-views.js.map +1 -0
- package/dist/agent/chat.js +1703 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/destinations.js +150 -0
- package/dist/agent/destinations.js.map +1 -0
- package/dist/agent/llm-cli.js +451 -0
- package/dist/agent/llm-cli.js.map +1 -0
- package/dist/agent/llm-codex.js +493 -0
- package/dist/agent/llm-codex.js.map +1 -0
- package/dist/agent/llm-openai.js +211 -0
- package/dist/agent/llm-openai.js.map +1 -0
- package/dist/agent/llm.js +1464 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/memory.js +33 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/mock-views.js +93 -0
- package/dist/agent/mock-views.js.map +1 -0
- package/dist/agent/model-availability.js +207 -0
- package/dist/agent/model-availability.js.map +1 -0
- package/dist/agent/model-errors.js +188 -0
- package/dist/agent/model-errors.js.map +1 -0
- package/dist/agent/model-guard.js +311 -0
- package/dist/agent/model-guard.js.map +1 -0
- package/dist/agent/prompts.js +374 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/qa-lenses/qa-auth.md +32 -0
- package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
- package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
- package/dist/agent/qa-lenses/qa-dates.md +31 -0
- package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
- package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
- package/dist/agent/qa-lenses/qa-migration.md +35 -0
- package/dist/agent/qa-lenses/qa-money.md +38 -0
- package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
- package/dist/agent/qa-lenses/qa-validation.md +29 -0
- package/dist/agent/qa-prompts.js +660 -0
- package/dist/agent/qa-prompts.js.map +1 -0
- package/dist/agent/reasoning.js +55 -0
- package/dist/agent/reasoning.js.map +1 -0
- package/dist/agent/redact.js +48 -0
- package/dist/agent/redact.js.map +1 -0
- package/dist/agent/rules.js +927 -0
- package/dist/agent/rules.js.map +1 -0
- package/dist/agent/runs.js +440 -0
- package/dist/agent/runs.js.map +1 -0
- package/dist/agent/send-retry.js +62 -0
- package/dist/agent/send-retry.js.map +1 -0
- package/dist/agent/team-notes.js +288 -0
- package/dist/agent/team-notes.js.map +1 -0
- package/dist/agent/token-meter.js +31 -0
- package/dist/agent/token-meter.js.map +1 -0
- package/dist/agent/triage.js +506 -0
- package/dist/agent/triage.js.map +1 -0
- package/dist/api.js +1047 -0
- package/dist/api.js.map +1 -0
- package/dist/approval-targets.js +107 -0
- package/dist/approval-targets.js.map +1 -0
- package/dist/bee/cloudflared.js +108 -0
- package/dist/bee/cloudflared.js.map +1 -0
- package/dist/bee/health.js +99 -0
- package/dist/bee/health.js.map +1 -0
- package/dist/bee/hive-client.js +75 -0
- package/dist/bee/hive-client.js.map +1 -0
- package/dist/bee/identity.js +39 -0
- package/dist/bee/identity.js.map +1 -0
- package/dist/bee/models.js +510 -0
- package/dist/bee/models.js.map +1 -0
- package/dist/bee/pairing.js +351 -0
- package/dist/bee/pairing.js.map +1 -0
- package/dist/bee/relay-client.js +50 -0
- package/dist/bee/relay-client.js.map +1 -0
- package/dist/bee/routes.js +214 -0
- package/dist/bee/routes.js.map +1 -0
- package/dist/bee/setup-page.js +223 -0
- package/dist/bee/setup-page.js.map +1 -0
- package/dist/bee/state.js +41 -0
- package/dist/bee/state.js.map +1 -0
- package/dist/bee/status.js +117 -0
- package/dist/bee/status.js.map +1 -0
- package/dist/bee/tunnel-manager.js +245 -0
- package/dist/bee/tunnel-manager.js.map +1 -0
- package/dist/bee/updater.js +268 -0
- package/dist/bee/updater.js.map +1 -0
- package/dist/boot.js +41 -0
- package/dist/boot.js.map +1 -0
- package/dist/call/index.js +145 -0
- package/dist/call/index.js.map +1 -0
- package/dist/case-folders.js +294 -0
- package/dist/case-folders.js.map +1 -0
- package/dist/cases.js +554 -0
- package/dist/cases.js.map +1 -0
- package/dist/chat-blocks.js +709 -0
- package/dist/chat-blocks.js.map +1 -0
- package/dist/chat-parse-util.js +38 -0
- package/dist/chat-parse-util.js.map +1 -0
- package/dist/chat-results.js +96 -0
- package/dist/chat-results.js.map +1 -0
- package/dist/chat-stats.js +193 -0
- package/dist/chat-stats.js.map +1 -0
- package/dist/chat-view-specs.js +186 -0
- package/dist/chat-view-specs.js.map +1 -0
- package/dist/cli/doctor-ops.js +361 -0
- package/dist/cli/doctor-ops.js.map +1 -0
- package/dist/cli/doctor.js +289 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dogfood.js +70 -0
- package/dist/cli/dogfood.js.map +1 -0
- package/dist/cli/env-file.js +34 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/eval-chat-cases.js +359 -0
- package/dist/cli/eval-chat-cases.js.map +1 -0
- package/dist/cli/eval-chat-results.js +85 -0
- package/dist/cli/eval-chat-results.js.map +1 -0
- package/dist/cli/eval-chat.js +508 -0
- package/dist/cli/eval-chat.js.map +1 -0
- package/dist/cli/eval-designer.js +67 -0
- package/dist/cli/eval-designer.js.map +1 -0
- package/dist/cli/eval-qa-review.js +284 -0
- package/dist/cli/eval-qa-review.js.map +1 -0
- package/dist/cli/golden-export.js +35 -0
- package/dist/cli/golden-export.js.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +746 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan-repo.js +199 -0
- package/dist/cli/scan-repo.js.map +1 -0
- package/dist/cli/seed.js +108 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/cli/tinybee.js +247 -0
- package/dist/cli/tinybee.js.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/connect/aivision-local.js +833 -0
- package/dist/connect/aivision-local.js.map +1 -0
- package/dist/connect/aivision-token.js +84 -0
- package/dist/connect/aivision-token.js.map +1 -0
- package/dist/connect/crypto.js +65 -0
- package/dist/connect/crypto.js.map +1 -0
- package/dist/connect/deps.js +110 -0
- package/dist/connect/deps.js.map +1 -0
- package/dist/connect/engines.js +144 -0
- package/dist/connect/engines.js.map +1 -0
- package/dist/connect/github-access.js +74 -0
- package/dist/connect/github-access.js.map +1 -0
- package/dist/connect/github-app.js +129 -0
- package/dist/connect/github-app.js.map +1 -0
- package/dist/connect/index.js +9 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/model-choices.js +201 -0
- package/dist/connect/model-choices.js.map +1 -0
- package/dist/connect/providers.js +900 -0
- package/dist/connect/providers.js.map +1 -0
- package/dist/connect/readiness.js +232 -0
- package/dist/connect/readiness.js.map +1 -0
- package/dist/connect/redact.js +16 -0
- package/dist/connect/redact.js.map +1 -0
- package/dist/connect/registry.js +406 -0
- package/dist/connect/registry.js.map +1 -0
- package/dist/connect/store.js +283 -0
- package/dist/connect/store.js.map +1 -0
- package/dist/connect/tunnel.js +134 -0
- package/dist/connect/tunnel.js.map +1 -0
- package/dist/connect/types.js +8 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connections/index.js +5 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/manager.js +223 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/presets.js +264 -0
- package/dist/connections/presets.js.map +1 -0
- package/dist/connections/store.js +132 -0
- package/dist/connections/store.js.map +1 -0
- package/dist/connections/tools.js +206 -0
- package/dist/connections/tools.js.map +1 -0
- package/dist/db-schema.js +355 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/db.js +379 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.js +49 -0
- package/dist/delivery.js.map +1 -0
- package/dist/deploy-wait.js +701 -0
- package/dist/deploy-wait.js.map +1 -0
- package/dist/disk.js +243 -0
- package/dist/disk.js.map +1 -0
- package/dist/dot-health.js +966 -0
- package/dist/dot-health.js.map +1 -0
- package/dist/dot-remove.js +246 -0
- package/dist/dot-remove.js.map +1 -0
- package/dist/events.js +38 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence-pack.js +423 -0
- package/dist/evidence-pack.js.map +1 -0
- package/dist/flows/answers.js +289 -0
- package/dist/flows/answers.js.map +1 -0
- package/dist/flows/change.js +811 -0
- package/dist/flows/change.js.map +1 -0
- package/dist/flows/checkStatus.js +524 -0
- package/dist/flows/checkStatus.js.map +1 -0
- package/dist/flows/ci.js +236 -0
- package/dist/flows/ci.js.map +1 -0
- package/dist/flows/ciFailure.js +76 -0
- package/dist/flows/ciFailure.js.map +1 -0
- package/dist/flows/common.js +522 -0
- package/dist/flows/common.js.map +1 -0
- package/dist/flows/default-branch.js +29 -0
- package/dist/flows/default-branch.js.map +1 -0
- package/dist/flows/defectDraft.js +447 -0
- package/dist/flows/defectDraft.js.map +1 -0
- package/dist/flows/defects.js +623 -0
- package/dist/flows/defects.js.map +1 -0
- package/dist/flows/digest.js +295 -0
- package/dist/flows/digest.js.map +1 -0
- package/dist/flows/impact.js +82 -0
- package/dist/flows/impact.js.map +1 -0
- package/dist/flows/index.js +23 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/intent-sources.js +72 -0
- package/dist/flows/intent-sources.js.map +1 -0
- package/dist/flows/mergeCases.js +169 -0
- package/dist/flows/mergeCases.js.map +1 -0
- package/dist/flows/nightlyRun.js +82 -0
- package/dist/flows/nightlyRun.js.map +1 -0
- package/dist/flows/outage.js +64 -0
- package/dist/flows/outage.js.map +1 -0
- package/dist/flows/postMerge.js +5 -0
- package/dist/flows/postMerge.js.map +1 -0
- package/dist/flows/prCheck.js +5 -0
- package/dist/flows/prCheck.js.map +1 -0
- package/dist/flows/prTarget.js +66 -0
- package/dist/flows/prTarget.js.map +1 -0
- package/dist/flows/qa.js +363 -0
- package/dist/flows/qa.js.map +1 -0
- package/dist/flows/questions.js +160 -0
- package/dist/flows/questions.js.map +1 -0
- package/dist/flows/recovery.js +64 -0
- package/dist/flows/recovery.js.map +1 -0
- package/dist/flows/rerun.js +50 -0
- package/dist/flows/rerun.js.map +1 -0
- package/dist/flows/testDesign.js +294 -0
- package/dist/flows/testDesign.js.map +1 -0
- package/dist/flows/testDesignJob.js +46 -0
- package/dist/flows/testDesignJob.js.map +1 -0
- package/dist/flows/testRepo.js +228 -0
- package/dist/flows/testRepo.js.map +1 -0
- package/dist/flows/testSavings.js +381 -0
- package/dist/flows/testSavings.js.map +1 -0
- package/dist/flows/testStatus.js +343 -0
- package/dist/flows/testStatus.js.map +1 -0
- package/dist/flows/ticketContext.js +425 -0
- package/dist/flows/ticketContext.js.map +1 -0
- package/dist/flows/ticketReview.js +249 -0
- package/dist/flows/ticketReview.js.map +1 -0
- package/dist/flows/ticks.js +73 -0
- package/dist/flows/ticks.js.map +1 -0
- package/dist/hive/admin.js +122 -0
- package/dist/hive/admin.js.map +1 -0
- package/dist/hive/auth.js +130 -0
- package/dist/hive/auth.js.map +1 -0
- package/dist/hive/billing.js +278 -0
- package/dist/hive/billing.js.map +1 -0
- package/dist/hive/config.js +63 -0
- package/dist/hive/config.js.map +1 -0
- package/dist/hive/db.js +186 -0
- package/dist/hive/db.js.map +1 -0
- package/dist/hive/embed.js +76 -0
- package/dist/hive/embed.js.map +1 -0
- package/dist/hive/errors.js +17 -0
- package/dist/hive/errors.js.map +1 -0
- package/dist/hive/google.js +75 -0
- package/dist/hive/google.js.map +1 -0
- package/dist/hive/index.js +25 -0
- package/dist/hive/index.js.map +1 -0
- package/dist/hive/jwt.js +57 -0
- package/dist/hive/jwt.js.map +1 -0
- package/dist/hive/keys.js +61 -0
- package/dist/hive/keys.js.map +1 -0
- package/dist/hive/mail.js +27 -0
- package/dist/hive/mail.js.map +1 -0
- package/dist/hive/native-push.js +255 -0
- package/dist/hive/native-push.js.map +1 -0
- package/dist/hive/pairing.js +342 -0
- package/dist/hive/pairing.js.map +1 -0
- package/dist/hive/presence.js +121 -0
- package/dist/hive/presence.js.map +1 -0
- package/dist/hive/push.js +185 -0
- package/dist/hive/push.js.map +1 -0
- package/dist/hive/relay.js +205 -0
- package/dist/hive/relay.js.map +1 -0
- package/dist/hive/routes.js +228 -0
- package/dist/hive/routes.js.map +1 -0
- package/dist/hive/server.js +12 -0
- package/dist/hive/server.js.map +1 -0
- package/dist/hive/session.js +28 -0
- package/dist/hive/session.js.map +1 -0
- package/dist/hive/tenants.js +287 -0
- package/dist/hive/tenants.js.map +1 -0
- package/dist/hive/tunnel/cloudflare.js +160 -0
- package/dist/hive/tunnel/cloudflare.js.map +1 -0
- package/dist/hive/tunnel/mock.js +52 -0
- package/dist/hive/tunnel/mock.js.map +1 -0
- package/dist/hive/tunnel/provider.js +19 -0
- package/dist/hive/tunnel/provider.js.map +1 -0
- package/dist/hive/updates.js +61 -0
- package/dist/hive/updates.js.map +1 -0
- package/dist/http-error.js +11 -0
- package/dist/http-error.js.map +1 -0
- package/dist/impact/classify.js +226 -0
- package/dist/impact/classify.js.map +1 -0
- package/dist/impact/find.js +259 -0
- package/dist/impact/find.js.map +1 -0
- package/dist/impact/pr.js +54 -0
- package/dist/impact/pr.js.map +1 -0
- package/dist/impact/store.js +365 -0
- package/dist/impact/store.js.map +1 -0
- package/dist/impact/text.js +158 -0
- package/dist/impact/text.js.map +1 -0
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/adf.js +397 -0
- package/dist/integrations/adf.js.map +1 -0
- package/dist/integrations/bot-marker.js +103 -0
- package/dist/integrations/bot-marker.js.map +1 -0
- package/dist/integrations/github-issues.js +705 -0
- package/dist/integrations/github-issues.js.map +1 -0
- package/dist/integrations/github.js +1284 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/issue-create.js +60 -0
- package/dist/integrations/issue-create.js.map +1 -0
- package/dist/integrations/jira.js +279 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +273 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/own-identity-warm.js +47 -0
- package/dist/integrations/own-identity-warm.js.map +1 -0
- package/dist/integrations/own-identity.js +39 -0
- package/dist/integrations/own-identity.js.map +1 -0
- package/dist/integrations/status-change.js +42 -0
- package/dist/integrations/status-change.js.map +1 -0
- package/dist/lead-defects.js +202 -0
- package/dist/lead-defects.js.map +1 -0
- package/dist/lead-digest.js +333 -0
- package/dist/lead-digest.js.map +1 -0
- package/dist/lead-release.js +286 -0
- package/dist/lead-release.js.map +1 -0
- package/dist/lead.js +328 -0
- package/dist/lead.js.map +1 -0
- package/dist/legacy-names.js +51 -0
- package/dist/legacy-names.js.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/link-trust.js +224 -0
- package/dist/link-trust.js.map +1 -0
- package/dist/links.js +219 -0
- package/dist/links.js.map +1 -0
- package/dist/loopback.js +35 -0
- package/dist/loopback.js.map +1 -0
- package/dist/model-cap.js +60 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/model-usage.js +173 -0
- package/dist/model-usage.js.map +1 -0
- package/dist/monitor/backfill.js +39 -0
- package/dist/monitor/backfill.js.map +1 -0
- package/dist/monitor/browser-probe.js +198 -0
- package/dist/monitor/browser-probe.js.map +1 -0
- package/dist/monitor/catch-up.js +31 -0
- package/dist/monitor/catch-up.js.map +1 -0
- package/dist/monitor/pollers.js +1606 -0
- package/dist/monitor/pollers.js.map +1 -0
- package/dist/monitor/probes.js +178 -0
- package/dist/monitor/probes.js.map +1 -0
- package/dist/monitor/self-health.js +228 -0
- package/dist/monitor/self-health.js.map +1 -0
- package/dist/monitor/statuspage.js +105 -0
- package/dist/monitor/statuspage.js.map +1 -0
- package/dist/nightly-scheduler.js +127 -0
- package/dist/nightly-scheduler.js.map +1 -0
- package/dist/nightly.js +141 -0
- package/dist/nightly.js.map +1 -0
- package/dist/notify/headline.js +114 -0
- package/dist/notify/headline.js.map +1 -0
- package/dist/notify/push.js +174 -0
- package/dist/notify/push.js.map +1 -0
- package/dist/object-cards.js +585 -0
- package/dist/object-cards.js.map +1 -0
- package/dist/object-links.js +47 -0
- package/dist/object-links.js.map +1 -0
- package/dist/onboarding-checks.js +141 -0
- package/dist/onboarding-checks.js.map +1 -0
- package/dist/onboarding.js +401 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/path-filters.js +62 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/phone/alerts.js +67 -0
- package/dist/phone/alerts.js.map +1 -0
- package/dist/phone/auth.js +240 -0
- package/dist/phone/auth.js.map +1 -0
- package/dist/phone/pairing.js +442 -0
- package/dist/phone/pairing.js.map +1 -0
- package/dist/phone/prefs.js +27 -0
- package/dist/phone/prefs.js.map +1 -0
- package/dist/phone/tailscale.js +161 -0
- package/dist/phone/tailscale.js.map +1 -0
- package/dist/pr-scope.js +441 -0
- package/dist/pr-scope.js.map +1 -0
- package/dist/proc.js +156 -0
- package/dist/proc.js.map +1 -0
- package/dist/profile/cache.js +108 -0
- package/dist/profile/cache.js.map +1 -0
- package/dist/profile/ci.js +216 -0
- package/dist/profile/ci.js.map +1 -0
- package/dist/profile/index.js +8 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/job.js +135 -0
- package/dist/profile/job.js.map +1 -0
- package/dist/profile/queries/go-tags.scm +47 -0
- package/dist/profile/queries/java-tags.scm +25 -0
- package/dist/profile/queries/javascript-tags.scm +104 -0
- package/dist/profile/queries/python-tags.scm +19 -0
- package/dist/profile/queries/typescript-tags.scm +28 -0
- package/dist/profile/scan-thread.js +42 -0
- package/dist/profile/scan-thread.js.map +1 -0
- package/dist/profile/scan-worker.js +16 -0
- package/dist/profile/scan-worker.js.map +1 -0
- package/dist/profile/scan.js +351 -0
- package/dist/profile/scan.js.map +1 -0
- package/dist/profile/stack.js +528 -0
- package/dist/profile/stack.js.map +1 -0
- package/dist/profile/store.js +35 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/profile/tests.js +399 -0
- package/dist/profile/tests.js.map +1 -0
- package/dist/queue.js +350 -0
- package/dist/queue.js.map +1 -0
- package/dist/refs.js +756 -0
- package/dist/refs.js.map +1 -0
- package/dist/release-notes.js +272 -0
- package/dist/release-notes.js.map +1 -0
- package/dist/reports/build.js +243 -0
- package/dist/reports/build.js.map +1 -0
- package/dist/reports/index.js +211 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/store.js +150 -0
- package/dist/reports/store.js.map +1 -0
- package/dist/reports/ticket-titles.js +124 -0
- package/dist/reports/ticket-titles.js.map +1 -0
- package/dist/reports/trace-map.js +1278 -0
- package/dist/reports/trace-map.js.map +1 -0
- package/dist/reports/traceability.js +422 -0
- package/dist/reports/traceability.js.map +1 -0
- package/dist/repos/mirror.js +356 -0
- package/dist/repos/mirror.js.map +1 -0
- package/dist/repos-github.js +108 -0
- package/dist/repos-github.js.map +1 -0
- package/dist/repos.js +891 -0
- package/dist/repos.js.map +1 -0
- package/dist/review/backend-anthropic.js +90 -0
- package/dist/review/backend-anthropic.js.map +1 -0
- package/dist/review/backend-cli.js +248 -0
- package/dist/review/backend-cli.js.map +1 -0
- package/dist/review/backend-codex.js +81 -0
- package/dist/review/backend-codex.js.map +1 -0
- package/dist/review/backend-mock.js +686 -0
- package/dist/review/backend-mock.js.map +1 -0
- package/dist/review/backend-only.js +168 -0
- package/dist/review/backend-only.js.map +1 -0
- package/dist/review/backend.js +105 -0
- package/dist/review/backend.js.map +1 -0
- package/dist/review/baseline/render-v1.js +483 -0
- package/dist/review/baseline/render-v1.js.map +1 -0
- package/dist/review/change-summary.js +197 -0
- package/dist/review/change-summary.js.map +1 -0
- package/dist/review/changelog.js +40 -0
- package/dist/review/changelog.js.map +1 -0
- package/dist/review/check.js +494 -0
- package/dist/review/check.js.map +1 -0
- package/dist/review/checkout.js +185 -0
- package/dist/review/checkout.js.map +1 -0
- package/dist/review/classify.js +178 -0
- package/dist/review/classify.js.map +1 -0
- package/dist/review/coverage.js +347 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/decision-eval.js +121 -0
- package/dist/review/decision-eval.js.map +1 -0
- package/dist/review/deliver.js +104 -0
- package/dist/review/deliver.js.map +1 -0
- package/dist/review/designer-eval.js +280 -0
- package/dist/review/designer-eval.js.map +1 -0
- package/dist/review/dogfood-digest.js +136 -0
- package/dist/review/dogfood-digest.js.map +1 -0
- package/dist/review/dogfood-eval.js +486 -0
- package/dist/review/dogfood-eval.js.map +1 -0
- package/dist/review/environment.js +109 -0
- package/dist/review/environment.js.map +1 -0
- package/dist/review/eval.js +405 -0
- package/dist/review/eval.js.map +1 -0
- package/dist/review/glob.js +110 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/golden-export.js +219 -0
- package/dist/review/golden-export.js.map +1 -0
- package/dist/review/impact.js +406 -0
- package/dist/review/impact.js.map +1 -0
- package/dist/review/imports.js +542 -0
- package/dist/review/imports.js.map +1 -0
- package/dist/review/index.js +512 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/intent.js +128 -0
- package/dist/review/intent.js.map +1 -0
- package/dist/review/lenses.js +167 -0
- package/dist/review/lenses.js.map +1 -0
- package/dist/review/linked-tickets.js +293 -0
- package/dist/review/linked-tickets.js.map +1 -0
- package/dist/review/merge.js +370 -0
- package/dist/review/merge.js.map +1 -0
- package/dist/review/on-demand.js +218 -0
- package/dist/review/on-demand.js.map +1 -0
- package/dist/review/prompt-eval.js +299 -0
- package/dist/review/prompt-eval.js.map +1 -0
- package/dist/review/prompt-variants.js +37 -0
- package/dist/review/prompt-variants.js.map +1 -0
- package/dist/review/readability-eval.js +217 -0
- package/dist/review/readability-eval.js.map +1 -0
- package/dist/review/readability.js +295 -0
- package/dist/review/readability.js.map +1 -0
- package/dist/review/render.js +2409 -0
- package/dist/review/render.js.map +1 -0
- package/dist/review/repo.js +194 -0
- package/dist/review/repo.js.map +1 -0
- package/dist/review/report-plan.js +90 -0
- package/dist/review/report-plan.js.map +1 -0
- package/dist/review/routes.js +195 -0
- package/dist/review/routes.js.map +1 -0
- package/dist/review/run-summary.js +34 -0
- package/dist/review/run-summary.js.map +1 -0
- package/dist/review/run.js +245 -0
- package/dist/review/run.js.map +1 -0
- package/dist/review/scope.js +454 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/security.js +432 -0
- package/dist/review/security.js.map +1 -0
- package/dist/review/signals.js +550 -0
- package/dist/review/signals.js.map +1 -0
- package/dist/review/specs.js +150 -0
- package/dist/review/specs.js.map +1 -0
- package/dist/review/ste.js +133 -0
- package/dist/review/ste.js.map +1 -0
- package/dist/review/test-repo-file.js +18 -0
- package/dist/review/test-repo-file.js.map +1 -0
- package/dist/review/test-repo-lines.js +53 -0
- package/dist/review/test-repo-lines.js.map +1 -0
- package/dist/review/ticket-on-demand.js +232 -0
- package/dist/review/ticket-on-demand.js.map +1 -0
- package/dist/review/yaml.js +298 -0
- package/dist/review/yaml.js.map +1 -0
- package/dist/room.js +361 -0
- package/dist/room.js.map +1 -0
- package/dist/routes/activity.js +219 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/call.js +29 -0
- package/dist/routes/call.js.map +1 -0
- package/dist/routes/cards.js +40 -0
- package/dist/routes/cards.js.map +1 -0
- package/dist/routes/cases.js +133 -0
- package/dist/routes/cases.js.map +1 -0
- package/dist/routes/connect.js +268 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/connection-presets.js +32 -0
- package/dist/routes/connection-presets.js.map +1 -0
- package/dist/routes/connections.js +177 -0
- package/dist/routes/connections.js.map +1 -0
- package/dist/routes/disk.js +19 -0
- package/dist/routes/disk.js.map +1 -0
- package/dist/routes/docs.js +71 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/dot-suggest.js +1002 -0
- package/dist/routes/dot-suggest.js.map +1 -0
- package/dist/routes/evidence-pack.js +16 -0
- package/dist/routes/evidence-pack.js.map +1 -0
- package/dist/routes/health.js +121 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/impact.js +48 -0
- package/dist/routes/impact.js.map +1 -0
- package/dist/routes/lead.js +50 -0
- package/dist/routes/lead.js.map +1 -0
- package/dist/routes/links.js +13 -0
- package/dist/routes/links.js.map +1 -0
- package/dist/routes/markdown.js +62 -0
- package/dist/routes/markdown.js.map +1 -0
- package/dist/routes/onboarding.js +47 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/phone.js +231 -0
- package/dist/routes/phone.js.map +1 -0
- package/dist/routes/release-notes.js +30 -0
- package/dist/routes/release-notes.js.map +1 -0
- package/dist/routes/reports.js +102 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/routes/repos.js +91 -0
- package/dist/routes/repos.js.map +1 -0
- package/dist/routes/review.js +283 -0
- package/dist/routes/review.js.map +1 -0
- package/dist/routes/roles.js +114 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/room.js +21 -0
- package/dist/routes/room.js.map +1 -0
- package/dist/routes/runner.js +156 -0
- package/dist/routes/runner.js.map +1 -0
- package/dist/routes/runs.js +84 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/setup.js +18 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/test-runs.js +220 -0
- package/dist/routes/test-runs.js.map +1 -0
- package/dist/routes/ticket-status.js +17 -0
- package/dist/routes/ticket-status.js.map +1 -0
- package/dist/routes/traceability.js +143 -0
- package/dist/routes/traceability.js.map +1 -0
- package/dist/routes/true.js +142 -0
- package/dist/routes/true.js.map +1 -0
- package/dist/routes/updates.js +70 -0
- package/dist/routes/updates.js.map +1 -0
- package/dist/runner/adapters/index.js +12 -0
- package/dist/runner/adapters/index.js.map +1 -0
- package/dist/runner/adapters/playwright.js +68 -0
- package/dist/runner/adapters/playwright.js.map +1 -0
- package/dist/runner/aivision/cases.js +172 -0
- package/dist/runner/aivision/cases.js.map +1 -0
- package/dist/runner/aivision/cli.js +201 -0
- package/dist/runner/aivision/cli.js.map +1 -0
- package/dist/runner/aivision/index.js +281 -0
- package/dist/runner/aivision/index.js.map +1 -0
- package/dist/runner/aivision/server.js +394 -0
- package/dist/runner/aivision/server.js.map +1 -0
- package/dist/runner/aivision/shared.js +140 -0
- package/dist/runner/aivision/shared.js.map +1 -0
- package/dist/runner/artifact-cap.js +189 -0
- package/dist/runner/artifact-cap.js.map +1 -0
- package/dist/runner/artifacts.js +433 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/command.js +564 -0
- package/dist/runner/command.js.map +1 -0
- package/dist/runner/copyfiles.js +221 -0
- package/dist/runner/copyfiles.js.map +1 -0
- package/dist/runner/engines.js +32 -0
- package/dist/runner/engines.js.map +1 -0
- package/dist/runner/evidence.js +114 -0
- package/dist/runner/evidence.js.map +1 -0
- package/dist/runner/host-env.js +160 -0
- package/dist/runner/host-env.js.map +1 -0
- package/dist/runner/index.js +1221 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/observe.js +603 -0
- package/dist/runner/observe.js.map +1 -0
- package/dist/runner/playwright-json.js +108 -0
- package/dist/runner/playwright-json.js.map +1 -0
- package/dist/runner/pwgen/exec.js +192 -0
- package/dist/runner/pwgen/exec.js.map +1 -0
- package/dist/runner/pwgen/explore.js +111 -0
- package/dist/runner/pwgen/explore.js.map +1 -0
- package/dist/runner/pwgen/index.js +423 -0
- package/dist/runner/pwgen/index.js.map +1 -0
- package/dist/runner/pwgen/propose.js +69 -0
- package/dist/runner/pwgen/propose.js.map +1 -0
- package/dist/runner/pwgen/source.js +632 -0
- package/dist/runner/pwgen/source.js.map +1 -0
- package/dist/runner/setup.js +222 -0
- package/dist/runner/setup.js.map +1 -0
- package/dist/runner/step-reporter.js +107 -0
- package/dist/runner/step-reporter.js.map +1 -0
- package/dist/runner/test-repo.js +326 -0
- package/dist/runner/test-repo.js.map +1 -0
- package/dist/runner/typed-value.js +46 -0
- package/dist/runner/typed-value.js.map +1 -0
- package/dist/runner/verify.js +133 -0
- package/dist/runner/verify.js.map +1 -0
- package/dist/runner/worktree.js +349 -0
- package/dist/runner/worktree.js.map +1 -0
- package/dist/sandbox.js +61 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/server.js +262 -0
- package/dist/server.js.map +1 -0
- package/dist/shadow-week.js +126 -0
- package/dist/shadow-week.js.map +1 -0
- package/dist/shutdown.js +92 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/slack/index.js +645 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/stages/config.js +147 -0
- package/dist/stages/config.js.map +1 -0
- package/dist/stages/index.js +41 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/suites.js +293 -0
- package/dist/suites.js.map +1 -0
- package/dist/target-url.js +116 -0
- package/dist/target-url.js.map +1 -0
- package/dist/test-runs.js +662 -0
- package/dist/test-runs.js.map +1 -0
- package/dist/ticket-keys.js +97 -0
- package/dist/ticket-keys.js.map +1 -0
- package/dist/ticket-supersede.js +105 -0
- package/dist/ticket-supersede.js.map +1 -0
- package/dist/tinybee/ed25519.js +99 -0
- package/dist/tinybee/ed25519.js.map +1 -0
- package/dist/tinybee/models-routes.js +19 -0
- package/dist/tinybee/models-routes.js.map +1 -0
- package/dist/tinybee/pair-payload.js +41 -0
- package/dist/tinybee/pair-payload.js.map +1 -0
- package/dist/tinybee/update-manifest.js +77 -0
- package/dist/tinybee/update-manifest.js.map +1 -0
- package/dist/tinybee/well-known.js +64 -0
- package/dist/tinybee/well-known.js.map +1 -0
- package/dist/tinybee/workflows/activity.js +23 -0
- package/dist/tinybee/workflows/activity.js.map +1 -0
- package/dist/tinybee/workflows/cron.js +210 -0
- package/dist/tinybee/workflows/cron.js.map +1 -0
- package/dist/tinybee/workflows/engine.js +371 -0
- package/dist/tinybee/workflows/engine.js.map +1 -0
- package/dist/tinybee/workflows/from-text.js +203 -0
- package/dist/tinybee/workflows/from-text.js.map +1 -0
- package/dist/tinybee/workflows/routes.js +189 -0
- package/dist/tinybee/workflows/routes.js.map +1 -0
- package/dist/tinybee/workflows/scheduler.js +100 -0
- package/dist/tinybee/workflows/scheduler.js.map +1 -0
- package/dist/tinybee/workflows/skills.js +227 -0
- package/dist/tinybee/workflows/skills.js.map +1 -0
- package/dist/tinybee/workflows/store.js +205 -0
- package/dist/tinybee/workflows/store.js.map +1 -0
- package/dist/tinybee/workflows/types.js +180 -0
- package/dist/tinybee/workflows/types.js.map +1 -0
- package/dist/tinybee/workflows/yaml.js +323 -0
- package/dist/tinybee/workflows/yaml.js.map +1 -0
- package/dist/true/api.js +495 -0
- package/dist/true/api.js.map +1 -0
- package/dist/true/client.js +292 -0
- package/dist/true/client.js.map +1 -0
- package/dist/true/clock.js +36 -0
- package/dist/true/clock.js.map +1 -0
- package/dist/true/events.js +125 -0
- package/dist/true/events.js.map +1 -0
- package/dist/true/hosts.js +98 -0
- package/dist/true/hosts.js.map +1 -0
- package/dist/true/index.js +29 -0
- package/dist/true/index.js.map +1 -0
- package/dist/true/key.js +54 -0
- package/dist/true/key.js.map +1 -0
- package/dist/true/line.js +69 -0
- package/dist/true/line.js.map +1 -0
- package/dist/true/mask.js +31 -0
- package/dist/true/mask.js.map +1 -0
- package/dist/true/names.js +114 -0
- package/dist/true/names.js.map +1 -0
- package/dist/true/outbox.js +233 -0
- package/dist/true/outbox.js.map +1 -0
- package/dist/true/replay.js +164 -0
- package/dist/true/replay.js.map +1 -0
- package/dist/true/settings.js +123 -0
- package/dist/true/settings.js.map +1 -0
- package/dist/true/status.js +189 -0
- package/dist/true/status.js.map +1 -0
- package/dist/true/sync-cases.js +222 -0
- package/dist/true/sync-cases.js.map +1 -0
- package/dist/true/sync-manual.js +295 -0
- package/dist/true/sync-manual.js.map +1 -0
- package/dist/true/sync-runs.js +109 -0
- package/dist/true/sync-runs.js.map +1 -0
- package/dist/true/worker.js +414 -0
- package/dist/true/worker.js.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/updates/asks.js +38 -0
- package/dist/updates/asks.js.map +1 -0
- package/dist/updates/index.js +835 -0
- package/dist/updates/index.js.map +1 -0
- package/dist/updates/owner.js +24 -0
- package/dist/updates/owner.js.map +1 -0
- package/dist/updates/prefs.js +118 -0
- package/dist/updates/prefs.js.map +1 -0
- package/dist/updates/route.js +78 -0
- package/dist/updates/route.js.map +1 -0
- package/dist/updates/sources.js +345 -0
- package/dist/updates/sources.js.map +1 -0
- package/dist/updates/words.js +452 -0
- package/dist/updates/words.js.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/dist/view-compute.js +382 -0
- package/dist/view-compute.js.map +1 -0
- package/dist/view-spec.js +894 -0
- package/dist/view-spec.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
- package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
- package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
- package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
- package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
- package/dist/web/assets/Cases-CpfED0uB.css +1 -0
- package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
- package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
- package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
- package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
- package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
- package/dist/web/assets/Docs-fodKx8S7.css +1 -0
- package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
- package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
- package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
- package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
- package/dist/web/assets/Dots-BqCsS34m.js +2 -0
- package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
- package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
- package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
- package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
- package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
- package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
- package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
- package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
- package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
- package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
- package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
- package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
- package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
- package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
- package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
- package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
- package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
- package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
- package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
- package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
- package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
- package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
- package/dist/web/assets/Pair-omex_K7H.js +2 -0
- package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
- package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
- package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
- package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
- package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
- package/dist/web/assets/Room-BoG_uge4.js +2 -0
- package/dist/web/assets/Room-evAfiW_e.css +1 -0
- package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
- package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
- package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
- package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
- package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
- package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
- package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
- package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
- package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
- package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
- package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
- package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
- package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
- package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
- package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
- package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
- package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
- package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
- package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
- package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
- package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
- package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
- package/dist/web/assets/Trace-aF92UWaH.js +2 -0
- package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
- package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
- package/dist/web/assets/activity-C3qilrDm.css +1 -0
- package/dist/web/assets/activity-CBfTSxqw.js +2 -0
- package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
- package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
- package/dist/web/assets/data-CmXvx3Mj.js +2 -0
- package/dist/web/assets/engines-CfdJODFj.css +1 -0
- package/dist/web/assets/format-BBZ8vFyT.js +2 -0
- package/dist/web/assets/forms-Coc7p2UF.css +1 -0
- package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
- package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
- package/dist/web/assets/index-B6qKm1NW.js +13 -0
- package/dist/web/assets/index-BvKyT1X7.css +1 -0
- package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/web/assets/lead-BL_P_kri.css +1 -0
- package/dist/web/assets/model-BIQy5IVG.js +2 -0
- package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
- package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
- package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
- package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
- package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
- package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
- package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
- package/dist/web/assets/reports-BWaA1HhM.js +37 -0
- package/dist/web/assets/reports-DXwdWQsB.css +1 -0
- package/dist/web/assets/router-W6nZsQ33.js +2 -0
- package/dist/web/assets/runs-BY0Owv93.css +1 -0
- package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
- package/dist/web/assets/storage-yvL36AWt.js +2 -0
- package/dist/web/assets/store-IqrqHuFR.js +2 -0
- package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
- package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
- package/dist/web/assets/true-9Q68cs5b.js +2 -0
- package/dist/web/assets/true-DPGBpoir.css +1 -0
- package/dist/web/assets/ui-DcmhYyYp.js +13 -0
- package/dist/web/assets/ui-DxEDgbIx.css +1 -0
- package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
- package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
- package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
- package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
- package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
- package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
- package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.webmanifest +23 -0
- package/dist/web/mascots/argus-attention.svg +7 -0
- package/dist/web/mascots/argus-ok.svg +7 -0
- package/dist/web/mascots/argus-outage.svg +7 -0
- package/dist/web/mascots/argus-running.svg +7 -0
- package/dist/web/mascots/bolt-attention.svg +7 -0
- package/dist/web/mascots/bolt-ok.svg +7 -0
- package/dist/web/mascots/bolt-outage.svg +7 -0
- package/dist/web/mascots/bolt-running.svg +7 -0
- package/dist/web/mascots/echo-attention.svg +7 -0
- package/dist/web/mascots/echo-ok.svg +7 -0
- package/dist/web/mascots/echo-outage.svg +7 -0
- package/dist/web/mascots/echo-running.svg +7 -0
- package/dist/web/mascots/lens-attention.svg +7 -0
- package/dist/web/mascots/lens-ok.svg +7 -0
- package/dist/web/mascots/lens-outage.svg +7 -0
- package/dist/web/mascots/lens-running.svg +7 -0
- package/dist/web/mascots/moss-attention.svg +7 -0
- package/dist/web/mascots/moss-ok.svg +7 -0
- package/dist/web/mascots/moss-outage.svg +7 -0
- package/dist/web/mascots/moss-running.svg +7 -0
- package/dist/web/mascots/nit-attention.svg +7 -0
- package/dist/web/mascots/nit-ok.svg +7 -0
- package/dist/web/mascots/nit-outage.svg +7 -0
- package/dist/web/mascots/nit-running.svg +7 -0
- package/dist/web/mascots/nova-attention.svg +7 -0
- package/dist/web/mascots/nova-ok.svg +7 -0
- package/dist/web/mascots/nova-outage.svg +7 -0
- package/dist/web/mascots/nova-running.svg +7 -0
- package/dist/web/mascots/penn-attention.svg +7 -0
- package/dist/web/mascots/penn-ok.svg +7 -0
- package/dist/web/mascots/penn-outage.svg +7 -0
- package/dist/web/mascots/penn-running.svg +7 -0
- package/dist/web/mascots/pip-attention.svg +7 -0
- package/dist/web/mascots/pip-ok.svg +7 -0
- package/dist/web/mascots/pip-outage.svg +7 -0
- package/dist/web/mascots/pip-running.svg +7 -0
- package/dist/web/mascots/ward-attention.svg +7 -0
- package/dist/web/mascots/ward-ok.svg +7 -0
- package/dist/web/mascots/ward-outage.svg +7 -0
- package/dist/web/mascots/ward-running.svg +7 -0
- package/dist/web/sw.js +98 -0
- package/dist/webhook-seen.js +53 -0
- package/dist/webhook-seen.js.map +1 -0
- package/dist/webhooks.js +625 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/zip.js +63 -0
- package/dist/zip.js.map +1 -0
- package/docs/API-V2.md +532 -0
- package/docs/CHAT-EVAL.md +130 -0
- package/docs/CHAT-UI.md +416 -0
- package/docs/CONNECTIONS.md +89 -0
- package/docs/DATA-MODEL.md +518 -0
- package/docs/DEPLOY.md +577 -0
- package/docs/DOGFOOD-LEDGER.md +81 -0
- package/docs/GITHUB.md +148 -0
- package/docs/INTEGRATION-MODEL.md +200 -0
- package/docs/LEAD-DOT.md +553 -0
- package/docs/LIST-PATTERNS.md +52 -0
- package/docs/MULTI-REPO.md +766 -0
- package/docs/PARITY.md +276 -0
- package/docs/PR-REVIEW-QA.md +1266 -0
- package/docs/PR-REVIEW.md +357 -0
- package/docs/SANDBOX.md +320 -0
- package/docs/SETUP.md +776 -0
- package/docs/SLACK.md +80 -0
- package/docs/STAGES.md +619 -0
- package/docs/TRACE-MAP.md +89 -0
- package/docs/TRACKERS.md +225 -0
- package/docs/VOICE.md +36 -0
- package/docs/tinybee/00-README.md +45 -0
- package/docs/tinybee/01-PRD.md +216 -0
- package/docs/tinybee/02-architecture-pairing.md +199 -0
- package/docs/tinybee/03-local-agent.md +222 -0
- package/docs/tinybee/04-local-setup-ui.md +128 -0
- package/docs/tinybee/05-mobile-app-ux.md +199 -0
- package/docs/tinybee/06-environments-and-delivery.md +148 -0
- package/docs/tinybee/07-coding-agent-handoff.md +116 -0
- package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
- package/docs/tinybee/PROGRESS.md +134 -0
- package/package.json +111 -4
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// The Tests repo batch of pr_check and post_merge (docs/MULTI-REPO.md sections 3.3 to 3.6, KAT-86 T4).
|
|
2
|
+
//
|
|
3
|
+
// A dot whose app repos have no Playwright suite keeps its end-to-end suite in a separate repo, the Tests repo (a repo with role test).
|
|
4
|
+
// When a PR of an app repo is checked, or a merge of it is tested, the dot runs that suite after the app repo's own tests, against the
|
|
5
|
+
// same target: the PR's preview when one is known, else the dot's base URL (a PR) and the base URL after the deploy wait (a merge).
|
|
6
|
+
// The batch checks out the Tests repo at a ref chosen by src/runner/test-repo.ts, runs the whole suite or the tests of the changed
|
|
7
|
+
// areas, and hands back a report whose cases name their file `owner/name:path`. mergeReports joins it to the app report.
|
|
8
|
+
//
|
|
9
|
+
// The app repo's Run tests switch decides about the app repo's own suite only. The dot has two switches for this batch, one for PRs
|
|
10
|
+
// and one for merges, both on by default.
|
|
11
|
+
import { addStep, isRunCancelled } from '../agent/runs.js';
|
|
12
|
+
import { githubFor } from '../integrations/github.js';
|
|
13
|
+
import { fullName, targetRepo, watchRepos } from '../repos.js';
|
|
14
|
+
import { refRuleWords, testRepoSentence } from '../review/test-repo-lines.js';
|
|
15
|
+
import { refSourceOf, resolveTestRef, testRepoRefusal } from '../runner/test-repo.js';
|
|
16
|
+
import { runSuite } from './common.js';
|
|
17
|
+
import { mergeReports } from './qa.js';
|
|
18
|
+
export { testRepoSentence };
|
|
19
|
+
// ---------- the dot's switches ----------
|
|
20
|
+
/** The two switches of the dot, with their defaults: both on. */
|
|
21
|
+
export function testRepoSwitches(w) {
|
|
22
|
+
return { onPr: w.testRepoOnPr !== false, onMerge: w.testRepoOnMerge !== false };
|
|
23
|
+
}
|
|
24
|
+
/** Why the switches of a save are not usable, or null. A switch is true, false, or null (back to the default). */
|
|
25
|
+
export function testRepoSwitchError(v) {
|
|
26
|
+
for (const k of ['testRepoOnPr', 'testRepoOnMerge']) {
|
|
27
|
+
if (v[k] !== undefined && v[k] !== null && typeof v[k] !== 'boolean')
|
|
28
|
+
return `${k} must be true or false.`;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/** The sentence the report gives when a switch holds the batch back. */
|
|
33
|
+
function switchReason(task) {
|
|
34
|
+
return task === 'pr_check' ? 'the dot\'s "Run the Tests repo on app PRs" switch is off' : 'the dot\'s "Run the Tests repo on merges" switch is off';
|
|
35
|
+
}
|
|
36
|
+
// ---------- which Tests repos run ----------
|
|
37
|
+
/**
|
|
38
|
+
* The Tests repos a PR check or a merge of this event runs: each repo of role test that exercises the app repo of the event (its
|
|
39
|
+
* `targets`, else every app repo) and takes the job (`test.on`, else both). Not the dot's switch: the caller says why a batch is held back.
|
|
40
|
+
* An event with no repo belongs to the dot's first app repo.
|
|
41
|
+
*/
|
|
42
|
+
export function testReposFor(watch, ev, task) {
|
|
43
|
+
const app = targetRepo(watch, ev);
|
|
44
|
+
if (!app || app.role !== 'app')
|
|
45
|
+
return [];
|
|
46
|
+
return watchRepos(watch).filter((r) => r.role === 'test' && (!r.targets?.length || r.targets.includes(app.id)) && (r.test?.on ?? ['pr_check', 'post_merge']).includes(task));
|
|
47
|
+
}
|
|
48
|
+
/** The sentence that says why the batch does not run for this event, or null when it does. */
|
|
49
|
+
export function testRepoHold(o) {
|
|
50
|
+
const sw = testRepoSwitches(o.watch);
|
|
51
|
+
if (o.task === 'pr_check' ? !sw.onPr : !sw.onMerge)
|
|
52
|
+
return switchReason(o.task);
|
|
53
|
+
if (o.docsOnly)
|
|
54
|
+
return 'only docs or the changelog changed';
|
|
55
|
+
if (o.prSkip)
|
|
56
|
+
return o.prSkip;
|
|
57
|
+
if (!o.baseUrl && o.watch.runner.mode !== 'demo')
|
|
58
|
+
return o.task === 'pr_check'
|
|
59
|
+
? 'no preview of this PR is known and the dot has no base URL to run them against'
|
|
60
|
+
: 'the dot has no base URL to run them against';
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
64
|
+
const sayList = (xs) => (xs.length <= 2 ? xs.join(' and ') : `${xs.slice(0, -1).join(', ')} and ${xs[xs.length - 1]}`);
|
|
65
|
+
/**
|
|
66
|
+
* Which tests of the Tests repo run. Narrower than the whole suite only when the repo maps areas to tests (`test.areas`), the review's
|
|
67
|
+
* regression scope is area or narrow, and every area of the change is mapped: the tests of those areas run, and the quick tests (the
|
|
68
|
+
* smoke text) with them. Anything else runs the whole suite: no mapping, no review, a wide scope (broad or full), no area named, or an area
|
|
69
|
+
* with no tests mapped to it, since nobody can say which tests cover that area. A selection that matches no test is caught by the caller.
|
|
70
|
+
*/
|
|
71
|
+
export function selectTestRepoSuite(o) {
|
|
72
|
+
const whole = (reason) => ({ selection: 'the whole suite', reason: `the whole suite runs: ${reason}` });
|
|
73
|
+
const mapped = new Map(Object.entries(o.config?.areas ?? {}).map(([area, grep]) => [area.trim().toLowerCase(), grep]));
|
|
74
|
+
if (!mapped.size)
|
|
75
|
+
return whole('no area is mapped to tests');
|
|
76
|
+
const review = o.review;
|
|
77
|
+
if (!review)
|
|
78
|
+
return whole('there is no review of the change to pick tests from');
|
|
79
|
+
const level = review.regressionScope.level;
|
|
80
|
+
if (level === 'full' || level === 'broad')
|
|
81
|
+
return whole(`the review's regression scope is ${level}`);
|
|
82
|
+
const ids = review.regressionScope.areaIds;
|
|
83
|
+
const areas = ids.length ? review.impactAreas.filter((a) => ids.includes(a.id)) : review.impactAreas;
|
|
84
|
+
if (!areas.length)
|
|
85
|
+
return whole('the review names no area of the change');
|
|
86
|
+
const names = [...new Set(areas.map((a) => a.area.trim()).filter(Boolean))];
|
|
87
|
+
const missing = names.filter((n) => !mapped.has(n.toLowerCase()));
|
|
88
|
+
if (!names.length || missing.length)
|
|
89
|
+
return whole(`no tests are mapped to ${sayList(missing.length ? missing : ['the changed area'])}`);
|
|
90
|
+
const smoke = o.config?.smokeGrep?.trim() || '@smoke';
|
|
91
|
+
const parts = [...new Set(names.map((n) => mapped.get(n.toLowerCase()))), escapeRe(smoke)];
|
|
92
|
+
return {
|
|
93
|
+
grep: parts.map((p) => `(?:${p})`).join('|'),
|
|
94
|
+
selection: `the tests of ${sayList(names)}, and the quick tests`,
|
|
95
|
+
reason: `the tests mapped to ${sayList(names)} run, with the quick tests (${review.regressionScope.level} scope)`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// ---------- joining the batch to the app report ----------
|
|
99
|
+
/**
|
|
100
|
+
* The report of the app repo's own tests joined with the report of a Tests repo batch. A batch that ran nothing (it was skipped) only adds
|
|
101
|
+
* its line. A batch that ran replaces an app report that was itself skipped, so a repo with Run tests off still shows the result of its
|
|
102
|
+
* Tests repo; otherwise the two are merged, and a batch that did not run marks the merged report like any other batch (mergeReports).
|
|
103
|
+
*/
|
|
104
|
+
export function joinTestRepoReport(app, batch) {
|
|
105
|
+
const testRepos = [...(app.testRepos ?? []), ...(batch.testRepos ?? [])];
|
|
106
|
+
if (!batch.cases.length && !batch.notRun)
|
|
107
|
+
return { ...app, ...(testRepos.length ? { testRepos } : {}) };
|
|
108
|
+
if (app.notRun?.stage === 'skipped' && !app.cases.length)
|
|
109
|
+
return { ...batch, testRepos };
|
|
110
|
+
return mergeReports(app, batch);
|
|
111
|
+
}
|
|
112
|
+
const sha7 = (sha) => sha.slice(0, 7);
|
|
113
|
+
/**
|
|
114
|
+
* Runs the Tests repos of the event one after the other and joins their reports. Never throws except when GitHub cannot be reached, which
|
|
115
|
+
* the job retries. A repo that cannot be checked out or run gives a report that did not run, with its reason on its line.
|
|
116
|
+
*/
|
|
117
|
+
export async function runTestRepos(i) {
|
|
118
|
+
let joined;
|
|
119
|
+
const flaky = [];
|
|
120
|
+
for (const repo of i.repos) {
|
|
121
|
+
if (isRunCancelled(i.runId))
|
|
122
|
+
break;
|
|
123
|
+
const one = await runOne(i, repo);
|
|
124
|
+
flaky.push(...one.flaky);
|
|
125
|
+
joined = joined ? joinTestRepoReport(joined, one.report) : one.report;
|
|
126
|
+
}
|
|
127
|
+
return joined ? { report: joined, flaky } : null;
|
|
128
|
+
}
|
|
129
|
+
async function runOne(i, repo) {
|
|
130
|
+
const { watch, ev, runId, task } = i;
|
|
131
|
+
const name = fullName(repo);
|
|
132
|
+
const cfg = repo.test ?? { framework: 'playwright' };
|
|
133
|
+
const label = cfg.label?.trim() || undefined;
|
|
134
|
+
const started = Date.now();
|
|
135
|
+
const stub = (run, notRun) => ({
|
|
136
|
+
mode: watch.runner.mode,
|
|
137
|
+
command: '',
|
|
138
|
+
startedAt: new Date(started).toISOString(),
|
|
139
|
+
durationMs: 0,
|
|
140
|
+
passed: 0,
|
|
141
|
+
failed: 0,
|
|
142
|
+
flaky: 0,
|
|
143
|
+
skipped: 0,
|
|
144
|
+
cases: [],
|
|
145
|
+
...(i.baseUrl ? { baseUrl: i.baseUrl } : {}),
|
|
146
|
+
...(notRun ? { notRun } : {}),
|
|
147
|
+
testRepos: [
|
|
148
|
+
{
|
|
149
|
+
repo: repo.id,
|
|
150
|
+
name: repo.name,
|
|
151
|
+
...(label ? { label } : {}),
|
|
152
|
+
ref: '',
|
|
153
|
+
refRule: 'default',
|
|
154
|
+
sha: '',
|
|
155
|
+
selection: '',
|
|
156
|
+
passed: 0,
|
|
157
|
+
failed: 0,
|
|
158
|
+
flaky: 0,
|
|
159
|
+
skipped: 0,
|
|
160
|
+
...run,
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
// What must not start: a framework localdost cannot run, a fork PR outside Docker (the fork rule). Nothing failed, so nothing is marked.
|
|
165
|
+
const fork = !!ev.pr?.fork;
|
|
166
|
+
const refusal = testRepoRefusal({ repo: { owner: repo.owner, name: repo.name }, ref: '', sha: '', config: cfg, ...(fork ? { fork } : {}) }, watch.runner.mode, watch.runner.passEnv);
|
|
167
|
+
if (refusal) {
|
|
168
|
+
addStep(runId, `Tests repo skipped: ${name}`, refusal, 'warn');
|
|
169
|
+
return { report: stub({ notRun: refusal, notRunOnPurpose: true }), flaky: [] };
|
|
170
|
+
}
|
|
171
|
+
const gh = githubFor(watch, { repo: { owner: repo.owner, name: repo.name } });
|
|
172
|
+
const source = refSourceOf(gh);
|
|
173
|
+
if (!source) {
|
|
174
|
+
const reason = 'GitHub is not connected, so the Tests repo cannot be fetched.';
|
|
175
|
+
addStep(runId, `Tests repo could not be checked out: ${name}`, reason, 'warn');
|
|
176
|
+
return {
|
|
177
|
+
report: stub({ notRun: reason }, { stage: 'checkout', reason: `The tests of ${name} did not run: ${reason}`, testRepo: repo.id }),
|
|
178
|
+
flaky: [],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const resolved = await resolveTestRef({
|
|
182
|
+
...(repo.test ? { config: repo.test } : {}),
|
|
183
|
+
defaultBranch: repo.defaultBranch,
|
|
184
|
+
task,
|
|
185
|
+
prBody: ev.pr?.body,
|
|
186
|
+
prHeadRef: ev.pr?.headRef,
|
|
187
|
+
fork,
|
|
188
|
+
source,
|
|
189
|
+
repo: { owner: repo.owner, name: repo.name },
|
|
190
|
+
});
|
|
191
|
+
if (!resolved.ok) {
|
|
192
|
+
addStep(runId, `Tests repo could not be checked out: ${name}`, resolved.reason, 'warn');
|
|
193
|
+
return { report: stub({ notRun: resolved.reason }, { stage: 'checkout', reason: resolved.reason, testRepo: repo.id }), flaky: [] };
|
|
194
|
+
}
|
|
195
|
+
const { ref, rule, sha, note } = resolved.ref;
|
|
196
|
+
addStep(runId, `Tests repo: ${name}`, `Runs ${ref} at ${sha7(sha)} (${refRuleWords(rule)}).${note ? ` ${note}` : ''}`, note ? 'warn' : 'info');
|
|
197
|
+
let suite = selectTestRepoSuite({ config: cfg, review: i.review });
|
|
198
|
+
addStep(runId, 'Picked tests of the Tests repo', suite.reason);
|
|
199
|
+
const testRepo = { repo: { owner: repo.owner, name: repo.name }, ref, sha, config: cfg, ...(fork ? { fork } : {}) };
|
|
200
|
+
let out = await runSuite(watch, runId, { ...(i.baseUrl ? { baseUrl: i.baseUrl } : {}), ...(suite.grep ? { grep: suite.grep } : {}), testRepo });
|
|
201
|
+
// A selection that matches no test must not read as a pass: the whole suite runs instead.
|
|
202
|
+
if (suite.grep && !out.report.notRun && !out.report.cases.length) {
|
|
203
|
+
addStep(runId, 'No test matched the changed areas', 'The tests mapped to the changed areas matched nothing, so the whole suite of the Tests repo runs.', 'warn');
|
|
204
|
+
suite = { selection: 'the whole suite', reason: 'no test matched the changed areas' };
|
|
205
|
+
out = await runSuite(watch, runId, { ...(i.baseUrl ? { baseUrl: i.baseUrl } : {}), testRepo });
|
|
206
|
+
}
|
|
207
|
+
const r = out.report;
|
|
208
|
+
const run = {
|
|
209
|
+
repo: repo.id,
|
|
210
|
+
name: repo.name,
|
|
211
|
+
...(label ? { label } : {}),
|
|
212
|
+
ref,
|
|
213
|
+
refRule: rule,
|
|
214
|
+
sha,
|
|
215
|
+
...(note ? { note } : {}),
|
|
216
|
+
selection: suite.selection,
|
|
217
|
+
...(i.baseUrl ? { baseUrl: i.baseUrl } : {}),
|
|
218
|
+
passed: r.passed,
|
|
219
|
+
failed: r.failed,
|
|
220
|
+
flaky: r.flaky,
|
|
221
|
+
skipped: r.skipped,
|
|
222
|
+
...(r.notRun ? { notRun: r.notRun.reason } : {}),
|
|
223
|
+
};
|
|
224
|
+
// The report says which batch did not run, so a verdict that reads the merged report blames the right repo.
|
|
225
|
+
const notRun = r.notRun ? { ...r.notRun, testRepo: repo.id } : undefined;
|
|
226
|
+
return { report: { ...r, ...(notRun ? { notRun } : {}), testRepos: [run] }, flaky: out.flaky };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=testRepo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testRepo.js","sourceRoot":"","sources":["../../src/flows/testRepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
// Fewer test runs (KAT-344). Three rules keep the dot from running the suite when it learns nothing new:
|
|
2
|
+
// 1. A change of only docs, the changelog, or the version field of package.json skips the test run.
|
|
3
|
+
// 2. A pr_check job waits for a quiet period, and a newer head of the same PR replaces the older job.
|
|
4
|
+
// 3. post_merge reuses the passing PR results when the merge commit has the same tree as the PR head.
|
|
5
|
+
// Each rule has a per-dot switch (testDocsOnlySkip, testDebounceSec, reuseMergeResults), all on by default.
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { list, update } from '../db.js';
|
|
9
|
+
import { addStep, cancelRun } from '../agent/runs.js';
|
|
10
|
+
import { cancelRunProcess } from '../runner/index.js';
|
|
11
|
+
import { engineOf } from '../runner/pwgen/index.js';
|
|
12
|
+
import { log } from '../config.js';
|
|
13
|
+
import { FORK_NOT_RUN_LINE } from '../review/render.js';
|
|
14
|
+
import { isTestRepoFile } from '../review/test-repo-file.js';
|
|
15
|
+
export const DEFAULT_DEBOUNCE_SEC = 120;
|
|
16
|
+
/** The quiet period of a dot that sets none. A process-wide override exists so the test scripts can start queued PR jobs at once. */
|
|
17
|
+
function defaultDebounceSec() {
|
|
18
|
+
const raw = process.env.LOCALDOST_TEST_DEBOUNCE_DEFAULT_SEC;
|
|
19
|
+
const n = Number(raw);
|
|
20
|
+
return raw !== undefined && Number.isInteger(n) && n >= 0 ? n : DEFAULT_DEBOUNCE_SEC;
|
|
21
|
+
}
|
|
22
|
+
export const MAX_DEBOUNCE_SEC = 3600;
|
|
23
|
+
/** The dot's switches with the defaults: both skips on, a 120 s quiet period. */
|
|
24
|
+
export function testSavings(watch) {
|
|
25
|
+
return {
|
|
26
|
+
docsOnlySkip: watch.testDocsOnlySkip ?? true,
|
|
27
|
+
debounceSec: typeof watch.testDebounceSec === 'number' ? watch.testDebounceSec : defaultDebounceSec(),
|
|
28
|
+
reuseMergeResults: watch.reuseMergeResults ?? true,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Why a dot's test-saving fields are not usable, or null. Used by the dot create and update routes. */
|
|
32
|
+
export function testSavingsError(v) {
|
|
33
|
+
for (const k of ['testDocsOnlySkip', 'reuseMergeResults']) {
|
|
34
|
+
if (v[k] !== undefined && typeof v[k] !== 'boolean')
|
|
35
|
+
return `${k} must be true or false.`;
|
|
36
|
+
}
|
|
37
|
+
const d = v.testDebounceSec;
|
|
38
|
+
if (d !== undefined && !(typeof d === 'number' && Number.isInteger(d) && d >= 0 && d <= MAX_DEBOUNCE_SEC))
|
|
39
|
+
return `testDebounceSec must be a whole number of seconds from 0 to ${MAX_DEBOUNCE_SEC}. 0 turns the quiet period off.`;
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
// ---------- 1. docs-only changes ----------
|
|
43
|
+
const VERSION_LINE_RE = /^\s*"version"\s*:\s*"[^"]*"\s*,?\s*$/;
|
|
44
|
+
/** True when the patch changes nothing but "version" lines. A missing patch (too large for GitHub) is never version-only. */
|
|
45
|
+
export function versionOnlyPatch(patch, maxChanged = Infinity) {
|
|
46
|
+
if (!patch)
|
|
47
|
+
return false;
|
|
48
|
+
let changed = 0;
|
|
49
|
+
for (const line of patch.split('\n')) {
|
|
50
|
+
if (line.startsWith('+++') || line.startsWith('---') || line.startsWith('@@'))
|
|
51
|
+
continue;
|
|
52
|
+
if (!line.startsWith('+') && !line.startsWith('-'))
|
|
53
|
+
continue;
|
|
54
|
+
if (!VERSION_LINE_RE.test(line.slice(1)))
|
|
55
|
+
return false;
|
|
56
|
+
changed++;
|
|
57
|
+
}
|
|
58
|
+
return changed > 0 && changed <= maxChanged;
|
|
59
|
+
}
|
|
60
|
+
/** The old and new value of the one version line a package.json patch changes, or null. */
|
|
61
|
+
function versionPair(patch) {
|
|
62
|
+
const val = (sign) => patch
|
|
63
|
+
?.split('\n')
|
|
64
|
+
.find((l) => l.startsWith(sign) && !l.startsWith(sign + sign + sign))
|
|
65
|
+
?.match(/"version"\s*:\s*"([^"]+)"/)?.[1];
|
|
66
|
+
const from = val('-');
|
|
67
|
+
const to = val('+');
|
|
68
|
+
return from && to ? { from, to } : null;
|
|
69
|
+
}
|
|
70
|
+
/** True when every changed version line of a lockfile patch moves from the project's old version to its new one. */
|
|
71
|
+
function sameBump(patch, bump) {
|
|
72
|
+
for (const line of (patch ?? '').split('\n')) {
|
|
73
|
+
if (line.startsWith('+++') || line.startsWith('---'))
|
|
74
|
+
continue;
|
|
75
|
+
const v = line.match(/"version"\s*:\s*"([^"]+)"/)?.[1];
|
|
76
|
+
if (line.startsWith('-') && v !== bump.from)
|
|
77
|
+
return false;
|
|
78
|
+
if (line.startsWith('+') && v !== bump.to)
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* True when every changed version line of a lockfile patch is one of the project's own: the top-level field (two-space
|
|
85
|
+
* indent), or the version under the `packages[""]` entry within the hunk's context lines. A nested dependency entry
|
|
86
|
+
* (`"node_modules/x": {`, even an aliased one with its own `"name"`) is installed code, whatever version it moves to.
|
|
87
|
+
*/
|
|
88
|
+
function rootVersionLines(patch) {
|
|
89
|
+
const lines = (patch ?? '').split('\n');
|
|
90
|
+
return lines.every((line, i) => {
|
|
91
|
+
if (!/^[-+]\s*"version"\s*:/.test(line) || line.startsWith('+++') || line.startsWith('---'))
|
|
92
|
+
return true;
|
|
93
|
+
if (/^[-+] {2}"version"/.test(line))
|
|
94
|
+
return true;
|
|
95
|
+
for (let j = i - 1; j >= 0 && j >= i - 4; j--) {
|
|
96
|
+
const ctx = lines[j];
|
|
97
|
+
if (ctx.startsWith('@@'))
|
|
98
|
+
break;
|
|
99
|
+
if (ctx.startsWith('-') || ctx.startsWith('+'))
|
|
100
|
+
continue;
|
|
101
|
+
if (/^\s*"":\s*\{/.test(ctx.slice(1)))
|
|
102
|
+
return true;
|
|
103
|
+
if (/^\s*"[^"]+":\s*\{/.test(ctx.slice(1)))
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function isDocsPath(path) {
|
|
110
|
+
const p = path.replace(/^\.?\//, '');
|
|
111
|
+
return /\.md$/i.test(p) || p.startsWith('docs/');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* True when every changed file is docs (*.md, docs/**), the changelog, or the version field of package.json or
|
|
115
|
+
* package-lock.json. An empty file list is not docs-only: nothing is known about the change, so the tests run.
|
|
116
|
+
*/
|
|
117
|
+
export function docsOnlyChange(files) {
|
|
118
|
+
if (!files.length)
|
|
119
|
+
return false;
|
|
120
|
+
// A lockfile counts as a version bump only next to the project's own bump in package.json, and only for its two
|
|
121
|
+
// root version lines (each one removed and one added): a nested dependency version is installed code.
|
|
122
|
+
const manifest = files.find((f) => /(?:^|\/)package\.json$/.test(f.path) && f.status === 'modified' && versionOnlyPatch(f.patch, 2));
|
|
123
|
+
const bump = manifest ? versionPair(manifest.patch) : null;
|
|
124
|
+
return files.every((f) => {
|
|
125
|
+
if (f.status === 'removed' && !isDocsPath(f.path))
|
|
126
|
+
return false;
|
|
127
|
+
if (isDocsPath(f.path))
|
|
128
|
+
return true;
|
|
129
|
+
if (/(?:^|\/)package\.json$/.test(f.path))
|
|
130
|
+
return f.status === 'modified' && versionOnlyPatch(f.patch, 2);
|
|
131
|
+
if (/(?:^|\/)package-lock\.json$/.test(f.path))
|
|
132
|
+
return !!bump && f.status === 'modified' && versionOnlyPatch(f.patch, 4) && sameBump(f.patch, bump) && rootVersionLines(f.patch);
|
|
133
|
+
return false;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** The report of a run that skipped its tests. Not a failure: stage `skipped`. */
|
|
137
|
+
export function skippedReport(reason, now = new Date()) {
|
|
138
|
+
return {
|
|
139
|
+
mode: 'local',
|
|
140
|
+
command: '',
|
|
141
|
+
startedAt: now.toISOString(),
|
|
142
|
+
durationMs: 0,
|
|
143
|
+
passed: 0,
|
|
144
|
+
failed: 0,
|
|
145
|
+
flaky: 0,
|
|
146
|
+
skipped: 0,
|
|
147
|
+
cases: [],
|
|
148
|
+
notRun: { stage: 'skipped', reason },
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** Why a fork pull request got no test run, for the run step and the verdict. The PR comment shows FORK_NOT_RUN_LINE. */
|
|
152
|
+
export const FORK_NOT_RUN_REASON = 'This PR comes from a fork, so localdost did not run its code. The code review still ran.';
|
|
153
|
+
/**
|
|
154
|
+
* The report of a fork pull request that was reviewed and not tested (KAT-384). Unlike a skip on purpose it is no pass:
|
|
155
|
+
* no test ran for the commit, so the stage is `checkout` and the CI note and the "not tested yet" wording apply.
|
|
156
|
+
*/
|
|
157
|
+
export function forkNotRunReport(now = new Date()) {
|
|
158
|
+
return { ...skippedReport(FORK_NOT_RUN_LINE, now), notRun: { stage: 'checkout', reason: FORK_NOT_RUN_REASON, fork: true } };
|
|
159
|
+
}
|
|
160
|
+
function hasPr(ev) {
|
|
161
|
+
return !!ev?.pr?.number;
|
|
162
|
+
}
|
|
163
|
+
const repoKey = (ev) => (ev.repo ? `${ev.repo.owner}/${ev.repo.name}`.toLowerCase() : '');
|
|
164
|
+
/** When a new pr_check job may start: after the dot's quiet period. Undefined means now. Requested reviews never wait. */
|
|
165
|
+
export function debouncedRunAfter(watch, ev, now = Date.now()) {
|
|
166
|
+
const sec = testSavings(watch).debounceSec;
|
|
167
|
+
if (sec <= 0 || !hasPr(ev) || ev.requestedBy)
|
|
168
|
+
return undefined;
|
|
169
|
+
return new Date(now + sec * 1000).toISOString();
|
|
170
|
+
}
|
|
171
|
+
// ---------- current head of each PR (KAT-346) ----------
|
|
172
|
+
// `ties`: other heads delivered with the same updated_at. Nothing orders them, so none of them is stale and none stops another.
|
|
173
|
+
const currentHeads = new Map();
|
|
174
|
+
const headKey = (repo, pr) => `${repo.toLowerCase()}#${pr}`;
|
|
175
|
+
const sameHead = (a, b) => !!a && !!b && (a.startsWith(b) || b.startsWith(a));
|
|
176
|
+
/**
|
|
177
|
+
* Records the head a pull_request delivery names, unless a delivery with a later updated_at already named another one.
|
|
178
|
+
* `updatedAt` is the PR's own updated_at (ISO); a delivery without it counts as newest by arrival.
|
|
179
|
+
*/
|
|
180
|
+
export function notePrHead(repo, pr, headSha, updatedAt) {
|
|
181
|
+
if (!repo || !headSha)
|
|
182
|
+
return;
|
|
183
|
+
const t = updatedAt ? Date.parse(updatedAt) : NaN;
|
|
184
|
+
const at = Number.isFinite(t) ? t : Date.now();
|
|
185
|
+
const key = headKey(repo, pr);
|
|
186
|
+
const cur = currentHeads.get(key);
|
|
187
|
+
if (cur && at < cur.at && !sameHead(cur.sha, headSha))
|
|
188
|
+
return;
|
|
189
|
+
if (cur && at === cur.at && !sameHead(cur.sha, headSha)) {
|
|
190
|
+
if (!cur.ties?.some((t) => sameHead(t, headSha)))
|
|
191
|
+
cur.ties = [...(cur.ties ?? []), headSha];
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// A redelivery of the same head never moves its time back, or an older head could then pass it.
|
|
195
|
+
const same = !!cur && sameHead(cur.sha, headSha);
|
|
196
|
+
currentHeads.set(key, { sha: headSha, at: same ? Math.max(cur.at, at) : at, ...(same && at <= cur.at && cur.ties ? { ties: cur.ties } : {}) });
|
|
197
|
+
}
|
|
198
|
+
/** True when the dot knows a different current head for this PR: the event came late and must start nothing and cancel nothing. */
|
|
199
|
+
export function isStalePrHead(ev) {
|
|
200
|
+
if (!hasPr(ev) || !ev.pr.headSha || !ev.repo)
|
|
201
|
+
return false;
|
|
202
|
+
const cur = currentHeads.get(headKey(repoKey(ev), ev.pr.number));
|
|
203
|
+
return !!cur && !sameHead(cur.sha, ev.pr.headSha) && !cur.ties?.some((t) => sameHead(t, ev.pr.headSha));
|
|
204
|
+
}
|
|
205
|
+
/** True when another head of this PR has the same updated_at as the current one: neither may stop the other's jobs. */
|
|
206
|
+
export function isTiedPrHead(ev) {
|
|
207
|
+
if (!hasPr(ev) || !ev.repo)
|
|
208
|
+
return false;
|
|
209
|
+
return !!currentHeads.get(headKey(repoKey(ev), ev.pr.number))?.ties?.length;
|
|
210
|
+
}
|
|
211
|
+
/** Forgets every tracked head. Used by tests. */
|
|
212
|
+
export function resetPrHeads() {
|
|
213
|
+
currentHeads.clear();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* A newer head of a PR arrived: older pr_check jobs of the same PR in the same repo stop. A queued job is dropped
|
|
217
|
+
* (marked done, with a note that names the newer head). A running run gets a step and goes through the cancel path
|
|
218
|
+
* of POST /api/runs/:id/cancel: the run is marked cancelled and its test process is killed.
|
|
219
|
+
*/
|
|
220
|
+
export function supersedeOlderPrJobs(newJobId, watch, ev) {
|
|
221
|
+
const out = { dropped: [], cancelled: [] };
|
|
222
|
+
if (testSavings(watch).debounceSec <= 0 || !hasPr(ev) || ev.requestedBy || !ev.pr.headSha)
|
|
223
|
+
return out;
|
|
224
|
+
const head = ev.pr.headSha;
|
|
225
|
+
const short = head.slice(0, 7);
|
|
226
|
+
// KAT-346: only the current head of the PR may stop older jobs; a late delivery for an old head stops nothing.
|
|
227
|
+
if (isTiedPrHead(ev)) {
|
|
228
|
+
log.info(`PR #${ev.pr.number}: head ${short} has the same updated_at as another head and supersedes nothing`);
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
if (isStalePrHead(ev)) {
|
|
232
|
+
log.info(`PR #${ev.pr.number}: stale head ${short} supersedes nothing`);
|
|
233
|
+
return out;
|
|
234
|
+
}
|
|
235
|
+
const note = `Superseded by newer head ${short} of PR #${ev.pr.number}.`;
|
|
236
|
+
for (const j of list('jobs', { watchId: watch.id, kind: 'pr_check', status: ['queued', 'running'] })) {
|
|
237
|
+
if (j.id === newJobId)
|
|
238
|
+
continue;
|
|
239
|
+
const old = j.payload;
|
|
240
|
+
if (!hasPr(old) || old.requestedBy || old.pr.number !== ev.pr.number || repoKey(old) !== repoKey(ev))
|
|
241
|
+
continue;
|
|
242
|
+
if (!old.pr.headSha || old.pr.headSha === head)
|
|
243
|
+
continue;
|
|
244
|
+
if (j.status === 'queued') {
|
|
245
|
+
update('jobs', j.id, { status: 'done', error: note, finishedAt: new Date().toISOString() });
|
|
246
|
+
out.dropped.push(j.id);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
for (const r of list('runs', { watchId: watch.id, status: 'running' }).filter((x) => x.jobId === j.id)) {
|
|
250
|
+
addStep(r.id, `Superseded by newer head ${short}`, `PR #${ev.pr.number} has a newer head, so this run for ${old.pr.headSha.slice(0, 7)} stops.`, 'warn');
|
|
251
|
+
if (cancelRun(r.id, `a newer head ${short}`)) {
|
|
252
|
+
cancelRunProcess(r.id);
|
|
253
|
+
out.cancelled.push(r.id);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (out.dropped.length || out.cancelled.length)
|
|
258
|
+
log.info(`PR #${ev.pr.number}: head ${short} superseded ${out.dropped.length} queued job(s) and ${out.cancelled.length} running run(s)`);
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
// ---------- 3. post_merge reuses the PR results ----------
|
|
262
|
+
/** The tree of a commit: the working folder's git first (git rev-parse), then the GitHub commit. Null when neither knows it. */
|
|
263
|
+
export async function treeOf(watch, gh, sha) {
|
|
264
|
+
const dir = watch.runner?.workdir;
|
|
265
|
+
if (dir && existsSync(dir) && /^[0-9a-f]{7,64}$/i.test(sha)) {
|
|
266
|
+
const r = spawnSync('git', ['-C', dir, 'rev-parse', '--verify', '--quiet', `${sha}^{tree}`], { encoding: 'utf8', timeout: 15_000 });
|
|
267
|
+
const out = (r.stdout ?? '').trim();
|
|
268
|
+
if (r.status === 0 && /^[0-9a-f]{40,64}$/.test(out))
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
return (await gh.getCommit(sha))?.treeSha ?? null;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/** Tests that ran: skipped tests did not. */
|
|
279
|
+
const ran = (r) => r.passed + r.failed + r.flaky;
|
|
280
|
+
/**
|
|
281
|
+
* The PR a merge belongs to: the PR of a pr_merged event, else the number a squash or merge commit puts in its title
|
|
282
|
+
* ("... (#120)", "Merge pull request #120 ..."). A push to main carries no PR of its own.
|
|
283
|
+
*/
|
|
284
|
+
export function mergedPrNumber(ev) {
|
|
285
|
+
if (ev.pr?.number)
|
|
286
|
+
return ev.pr.number;
|
|
287
|
+
if (!ev.push)
|
|
288
|
+
return null;
|
|
289
|
+
const first = ev.title.replace(/^Push to [^:]+:\s*/, '').split('\n')[0] ?? '';
|
|
290
|
+
const m = /\(#(\d+)\)\s*$/.exec(first) ?? /^Merge pull request #(\d+)\b/.exec(first);
|
|
291
|
+
return m ? Number(m[1]) : null;
|
|
292
|
+
}
|
|
293
|
+
/** The commit a post_merge run tests. */
|
|
294
|
+
export function mergeShaOf(ev) {
|
|
295
|
+
return ev.pr?.mergeSha || ev.push?.after || '';
|
|
296
|
+
}
|
|
297
|
+
/** The latest pr_check run of this PR that ran tests, when those tests passed. Otherwise null. */
|
|
298
|
+
export function lastPassedPrRun(watchId, prNumber, repo) {
|
|
299
|
+
const runs = list('runs', { watchId, kind: 'pr_check' }, { orderBy: 'createdAt DESC', limit: 300 }).filter((r) => r.status === 'done' && r.trigger?.pr?.number === prNumber && (r.trigger.repo ? repoKey(r.trigger) : '') === repo);
|
|
300
|
+
// KAT-345: reuse needs tests that ran and passed. Skipped tests (docs-only rule or any other) never count as a pass.
|
|
301
|
+
const tested = runs.find((r) => r.report && !r.report.notRun && !r.report.interrupted && ran(r.report) > 0);
|
|
302
|
+
return tested &&
|
|
303
|
+
tested.report.passed > 0 &&
|
|
304
|
+
tested.report.failed === 0 &&
|
|
305
|
+
tested.report.flaky === 0 &&
|
|
306
|
+
tested.verdict?.outcome !== 'product_failure' &&
|
|
307
|
+
tested.verdict?.outcome !== 'test_failure'
|
|
308
|
+
? tested
|
|
309
|
+
: null;
|
|
310
|
+
}
|
|
311
|
+
/** JSON with object keys sorted at every level, so the same settings always give the same string. */
|
|
312
|
+
function stableJson(v) {
|
|
313
|
+
if (Array.isArray(v))
|
|
314
|
+
return `[${v.map(stableJson).join(',')}]`;
|
|
315
|
+
if (v && typeof v === 'object')
|
|
316
|
+
return `{${Object.keys(v)
|
|
317
|
+
.filter((k) => v[k] !== undefined)
|
|
318
|
+
.sort()
|
|
319
|
+
.map((k) => `${JSON.stringify(k)}:${stableJson(v[k])}`)
|
|
320
|
+
.join(',')}}`;
|
|
321
|
+
return JSON.stringify(v ?? null);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* The dot settings that decide what a test run runs: every runner setting, the engine as resolved (so a new workspace
|
|
325
|
+
* default counts), and the base URL. A merge reuses PR results only when this is unchanged, so any runner change runs
|
|
326
|
+
* the merge's own tests.
|
|
327
|
+
*/
|
|
328
|
+
export function runnerKey(watch) {
|
|
329
|
+
return stableJson({ runner: watch.runner, engine: engineOf(watch), baseUrl: watch.baseUrl ?? '' });
|
|
330
|
+
}
|
|
331
|
+
/** True when the PR run's recorded specs cover the merge's selection. A run without testedSpecs ran an unknown set and covers nothing. */
|
|
332
|
+
export function prRunCovers(run, merge) {
|
|
333
|
+
const tested = run.testedSpecs;
|
|
334
|
+
if (!tested)
|
|
335
|
+
return false;
|
|
336
|
+
// A PR preview is another environment than the merge's target: results there say nothing about it.
|
|
337
|
+
if ((tested.baseUrl ?? '') !== (merge.baseUrl ?? ''))
|
|
338
|
+
return false;
|
|
339
|
+
if (tested.full)
|
|
340
|
+
return true;
|
|
341
|
+
return !merge.full && merge.specs.every((s) => tested.specs.includes(s));
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* The spec suite results of a PR report. Generated (pwgen/) and AI-Vision (aivision/) cases follow their own post_merge
|
|
345
|
+
* options and run on the merge itself, so a reused report leaves them out. So do the cases of a Tests repo: its batch runs on
|
|
346
|
+
* the merge too, against the build the merge deployed, and the PR's results of it say nothing about that build (KAT-86).
|
|
347
|
+
*/
|
|
348
|
+
export function specSuiteReport(r) {
|
|
349
|
+
const cases = r.cases.filter((c) => !c.file.startsWith('pwgen/') && !c.file.startsWith('aivision/') && !isTestRepoFile(c.file));
|
|
350
|
+
if (cases.length === r.cases.length && !r.generated && !r.testRepos)
|
|
351
|
+
return { ...r };
|
|
352
|
+
const out = {
|
|
353
|
+
...r,
|
|
354
|
+
cases,
|
|
355
|
+
passed: cases.filter((c) => c.status === 'passed').length,
|
|
356
|
+
failed: cases.filter((c) => c.status === 'failed' || c.status === 'timedOut').length,
|
|
357
|
+
flaky: cases.filter((c) => c.status === 'flaky').length,
|
|
358
|
+
skipped: cases.filter((c) => c.status === 'skipped').length,
|
|
359
|
+
};
|
|
360
|
+
delete out.generated;
|
|
361
|
+
delete out.testRepos;
|
|
362
|
+
return out;
|
|
363
|
+
}
|
|
364
|
+
/** The PR run whose results the merge may reuse: the merge commit has the same tree as the head that run tested, and the run ran every spec the merge would. */
|
|
365
|
+
export async function reusableMergeRun(watch, gh, ev, selection) {
|
|
366
|
+
const num = mergedPrNumber(ev);
|
|
367
|
+
const mergeSha = mergeShaOf(ev);
|
|
368
|
+
if (!num || !mergeSha)
|
|
369
|
+
return null;
|
|
370
|
+
const run = lastPassedPrRun(watch.id, num, repoKey(ev));
|
|
371
|
+
const head = run?.trigger?.pr?.headSha;
|
|
372
|
+
// A run from before runnerKey, or one tested with other runner settings, ran something else: the merge runs its own tests.
|
|
373
|
+
if (!run || !head || run.runnerKey !== runnerKey(watch))
|
|
374
|
+
return null;
|
|
375
|
+
// A PR run that ran a subset of the suite says nothing about the specs the merge would add.
|
|
376
|
+
if (!prRunCovers(run, selection))
|
|
377
|
+
return null;
|
|
378
|
+
const [a, b] = await Promise.all([treeOf(watch, gh, head), treeOf(watch, gh, mergeSha)]);
|
|
379
|
+
return a && b && a === b ? { run, head, tree: a } : null;
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=testSavings.js.map
|