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,766 @@
|
|
|
1
|
+
# Multiple repos, test repos, and GitHub Issues: build design
|
|
2
|
+
|
|
3
|
+
A dot today watches one GitHub repo. Real teams split their product across several: a web app, an API, a test automation repo, and sometimes a docs repo. This design lets a dot hold a set of repos with a role each, reads every repo once into a short profile, runs suites that live in a separate test repo, and treats GitHub Issues as the tracker. Think of a new QA hire: on day one they skim each repo to learn where checkout lives and which tests cover it, then they keep that mental map current as merges land.
|
|
4
|
+
|
|
5
|
+
Scope: Linear KAT-85 (multiple repos and the repo scan), KAT-86 (test automation repos), KAT-87 (GitHub Issues as ALM). No code changes with this document; section 5 lists the work. Code references are to `duonghaijoe/localdost` at `aceb957` (2026-10-08). Research was done on 2026-10-08; sources are in section 6, and items marked "to confirm" were not verified on a primary page.
|
|
6
|
+
|
|
7
|
+
Status, 2026-10-19: tasks T3 and T4 of section 5 are built for Playwright (KAT-86): a PR check and a merge of an app repo run the suite of a Tests repo at a resolved ref, and the report names its specs `owner/name:path`. Where the build differs from the design below, the paragraph says so. Status, 2026-10-08: tasks M1 to M4 of section 5 are built. The `repo_scan` job runs from `POST /api/repos/:owner/:name/scan` (KAT-221) and the CLI. The profile endpoints and the bundled demo profile wait for the rest of the repo scanner (KAT-85 part 2). The API contract as built is in [API-V2.md](API-V2.md#repos).
|
|
8
|
+
|
|
9
|
+
## Contents
|
|
10
|
+
|
|
11
|
+
1. Data model: workspace repos and per-dot repo sets
|
|
12
|
+
2. Repo scan and profile
|
|
13
|
+
3. Test repos
|
|
14
|
+
4. GitHub Issues as ALM
|
|
15
|
+
5. Build tasks
|
|
16
|
+
6. Sources
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Data model: workspace repos and per-dot repo sets
|
|
21
|
+
|
|
22
|
+
### 1.1 Current state
|
|
23
|
+
|
|
24
|
+
- `Watch.repo` is one optional `{ owner, name, defaultBranch, pathFilters? }` (`src/types.ts`).
|
|
25
|
+
- Fourteen modules read `watch.repo` or `w.repo` directly: `webhooks.ts` (matching), `monitor/pollers.ts` (cursor per repo), `integrations/github.ts` (`githubFor`), `runner/index.ts` (clone when no `workdir`), `review/checkout.ts`, `review/index.ts` (graph cache key), `flows/change.ts`, `flows/common.ts`, `flows/qa.ts`, `flows/ticks.ts`, `flows/ticketReview.ts`, `agent/prompts.ts`, `routes/review.ts`, `runner/aivision/cli.ts`.
|
|
26
|
+
- The GitHub provider on the Setup page already has a repo picker (`optionKinds: ['repos']` in `src/connect/providers.ts`, stored as `settings.repos`). It lists repos from the App installations or the token, but nothing reads the selection: the dot form still takes `owner/name` as free text (`client/src/features/settings/watchForm.ts`).
|
|
27
|
+
|
|
28
|
+
### 1.2 New model
|
|
29
|
+
|
|
30
|
+
Two levels. The workspace holds every repo that localdost may read, connected once on the Setup page. A dot picks a subset of them and gives each a role.
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
// src/types.ts (add only)
|
|
34
|
+
|
|
35
|
+
export type RepoRole = 'app' | 'test' | 'docs';
|
|
36
|
+
|
|
37
|
+
/** A workspace repo: connected once, scanned once, shared by every dot that picks it. */
|
|
38
|
+
export interface WorkspaceRepo {
|
|
39
|
+
id: string; // "owner/name", lower case
|
|
40
|
+
owner: string;
|
|
41
|
+
name: string;
|
|
42
|
+
defaultBranch: string; // from GET /repos/{o}/{r} at add time, refreshed on scan
|
|
43
|
+
private: boolean;
|
|
44
|
+
addedAt: string;
|
|
45
|
+
/** Scan state of the latest profile. */
|
|
46
|
+
scan: {
|
|
47
|
+
state: 'queued' | 'scanning' | 'ready' | 'stale' | 'error';
|
|
48
|
+
sha?: string; // profile built at this commit of the default branch
|
|
49
|
+
at?: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
mode?: 'full' | 'incremental';
|
|
52
|
+
};
|
|
53
|
+
/** How events reach localdost for this repo, detected from deliveries and poll cursors. */
|
|
54
|
+
intake?: 'webhook' | 'poll' | 'none';
|
|
55
|
+
lastEventAt?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** One repo in a dot's set. */
|
|
59
|
+
export interface WatchRepo {
|
|
60
|
+
repo: string; // WorkspaceRepo.id
|
|
61
|
+
role: RepoRole;
|
|
62
|
+
/** Unset: the workspace repo's default branch. */
|
|
63
|
+
defaultBranch?: string;
|
|
64
|
+
pathFilters?: string[];
|
|
65
|
+
/** role 'app' only: which PRs of the repo the dot takes (KAT-354, docs/SETUP.md section PR scope). Unset: every PR. */
|
|
66
|
+
prScope?: PrScope;
|
|
67
|
+
/** role 'app' only: false runs no tests for the repo; it is still reviewed (KAT-361, docs/SANDBOX.md section Run tests per repo). Only false is stored. */
|
|
68
|
+
runTests?: boolean;
|
|
69
|
+
/** role 'app' only: the GitHub environment this repo's merge deploys to, and the seconds a merge waits for it (KAT-395, docs/SETUP.md section Deploy wait of one repo). Unset: the dot's. 0 seconds: this repo does not wait. */
|
|
70
|
+
deployEnvironment?: string;
|
|
71
|
+
waitForDeploySec?: number;
|
|
72
|
+
/** role 'test' only (section 3.2). */
|
|
73
|
+
test?: TestRepoConfig;
|
|
74
|
+
/** role 'test' only: app repos this suite exercises. Unset: every app repo of the dot. */
|
|
75
|
+
targets?: string[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface Watch {
|
|
79
|
+
// existing fields unchanged, including repo?
|
|
80
|
+
repos?: WatchRepo[];
|
|
81
|
+
/** pr_check waits this long for a deployment_status preview before it falls back to baseUrl. Default 0. */
|
|
82
|
+
waitForPreviewSec?: number;
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Rules:
|
|
87
|
+
|
|
88
|
+
- A dot may hold any number of repos. At least one `app` repo is required when the dot holds a `test` repo, because test repos run against an app.
|
|
89
|
+
- `Watch.repo` stays (the types contract is add-only). On every save, the server writes `repo` from the first `app` repo in `repos`, so readers that have not moved yet keep working. Once all readers use the helper below, `repo` is a derived field only.
|
|
90
|
+
- One helper replaces direct reads: `watchRepos(w): ResolvedRepo[]` in a new `src/repos.ts`. It returns `repos` when set, else a single `app` entry built from `repo`. `repoForEvent(w, ev)` returns the entry whose `repo` matches `ev.repo`, or null.
|
|
91
|
+
- `githubFor(watch, event)` keeps its signature and picks the repo from `event.repo` through `repoForEvent`. A new `githubForRepo(id)` serves repo-level work that has no dot (scans, profile reads).
|
|
92
|
+
|
|
93
|
+
### 1.3 Storage and migration
|
|
94
|
+
|
|
95
|
+
New tables in `src/db.ts` (same `migrate()` mechanism, so creation is idempotent):
|
|
96
|
+
|
|
97
|
+
| Table | Columns | Notes |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| `repos` | `owner`, `name`, `defaultBranch`, `private`, `scan` (json), `intake`, `lastEventAt` | `id` is `owner/name` lower case |
|
|
100
|
+
| `repo_profiles` | `repoId`, `sha`, `profile` (json), `overrides` (json), `version`, `mode`, `scanMs`, `tokens` | Newest row per repo is the live profile; keep the last 5 for diffing |
|
|
101
|
+
| `links` | `kind`, `from`, `to`, `source`, `watchId`, `meta` (json) | Section 4.4 |
|
|
102
|
+
| `issue_state` | `repoId`, `number`, `bodyHash`, `updatedAt`, `testStatus` (json) | Sections 4.2 and 4.6 |
|
|
103
|
+
|
|
104
|
+
Migration, run once at boot and safe to repeat (`migrateWatchRepos()` in `src/repos.ts`):
|
|
105
|
+
|
|
106
|
+
1. For each watch with `repo` and no `repos`: insert a `repos` row when missing, then write `repos: [{ repo: id, role: 'app', defaultBranch, pathFilters }]`.
|
|
107
|
+
2. For each id in the GitHub provider's `settings.repos`: insert a `repos` row when missing. After this step `settings.repos` mirrors the `repos` table and is written on every change, so the existing Setup picker keeps its state.
|
|
108
|
+
3. Queue a `repo_scan` job for each repo with no profile. Demo mode skips real scans and loads a bundled profile for `demo/sample-app`.
|
|
109
|
+
|
|
110
|
+
Rollback: an older build ignores `repos` and the new tables and still reads `repo`, which step 1 keeps filled.
|
|
111
|
+
|
|
112
|
+
### 1.4 Event matching
|
|
113
|
+
|
|
114
|
+
`watchMatches` in `src/webhooks.ts` changes for `source: 'github'`:
|
|
115
|
+
|
|
116
|
+
- Match when `ev.repo` equals any entry of `watchRepos(w)`. A push also needs that entry's default branch.
|
|
117
|
+
- The role picks the job. `app` repos keep today's table (`pr_check`, `post_merge`, `ci_failure`). `test` and `docs` repos follow section 3.6. Every default-branch push on any role also queues `repo_scan` for the workspace repo, once per repo and once only, whatever the number of dots (dedupe key `scan:<repo>:<sha>`).
|
|
118
|
+
- `dispatchTrigger` already dedupes per dot (`<eventKey>:<watchId>:<jobKind>`), so two dots that share a repo each get their job.
|
|
119
|
+
- A PR event also has to be in the repo entry's `prScope`. `dispatchTrigger` records a PR the scope keeps out as an event row with `skipped: 'out of scope: <rule>'` (the same way it records a stage that is off) and queues nothing for that dot. A push to the default branch is judged by the merged PR of its head commit (`GET /repos/{o}/{r}/commits/{sha}/pulls`), so the merge of a PR the scope keeps out starts no `post_merge` through the push either.
|
|
120
|
+
|
|
121
|
+
The poller (`pollGithubOnce`) loops over the union of repos of all unpaused dots that poll, keyed by repo, so a repo shared by three dots is polled once. Cursor keys are already per repo (`github:<owner>/<name>:<branch>`).
|
|
122
|
+
|
|
123
|
+
### 1.5 API
|
|
124
|
+
|
|
125
|
+
| Method and path | Purpose |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `GET /api/repos` | Workspace repos with scan state, intake, and the dots that use each |
|
|
128
|
+
| `GET /api/repos/options?q=` | Repos visible to the GitHub connection (wraps the provider's `options('repos')`), marked when already added |
|
|
129
|
+
| `POST /api/repos` body `{ repos: ["owner/name", ...] }` | Adds repos, reads each default branch, queues scans. 207 with per-repo errors |
|
|
130
|
+
| `DELETE /api/repos/:owner/:name` | Removes a repo. 409 with the dot names when a dot still uses it |
|
|
131
|
+
| `POST /api/repos/:owner/:name/scan` body `{ full?: boolean }` | Rescan now |
|
|
132
|
+
| `GET /api/repos/:owner/:name/profile` | Profile with overrides applied, plus `raw` and `overrides` separately |
|
|
133
|
+
| `PATCH /api/repos/:owner/:name/profile` | Saves overrides (section 2.8) |
|
|
134
|
+
| `POST /api/dots`, `PATCH /api/dots/:id` | Accept `repos: WatchRepo[]`. A repo the connection can see but the workspace lacks is added on save. 400 when a test repo has no app repo |
|
|
135
|
+
| `GET /api/dots/:id` | `dotView` adds `repos[]` with role, scan state, last event, and intake per repo |
|
|
136
|
+
|
|
137
|
+
Live events: add `{ type: 'repo'; repo: WorkspaceRepo }` to `LiveEventV2` so scan progress updates the pages without a reload.
|
|
138
|
+
|
|
139
|
+
### 1.6 UI
|
|
140
|
+
|
|
141
|
+
Setup page, GitHub row: the existing picker becomes the workspace repo list. Each row shows the repo, a status indicator for the scan, the profile age, and how events arrive.
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
GitHub Connected as localdost-app[bot] [Test] [Disconnect]
|
|
145
|
+
Repositories [Add repos]
|
|
146
|
+
acme/shop-web (o) Ready, scanned 2 h ago at 4f1c2a9 webhook [Open]
|
|
147
|
+
acme/shop-api (o) Scanning, 1,240 of 3,100 files webhook [Open]
|
|
148
|
+
acme/shop-e2e (o) Ready, scanned 1 d ago at 9be0d11 poll [Open]
|
|
149
|
+
acme/handbook (!) Error: clone failed (403) none [Retry]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Dot dialog: the free-text Repository field becomes a multi-select picker with one row per picked repo. The role is a three-option segmented control. Branch and path filters sit behind a row-level "More" toggle that has a visible label. A test repo row adds its framework and ref fields (section 3.2).
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
Repositories [+ Add repository]
|
|
156
|
+
acme/shop-web Role [App | Tests | Docs] Branch main More v
|
|
157
|
+
acme/shop-api Role [App | Tests | Docs] Branch main More v
|
|
158
|
+
acme/shop-e2e Role [App | Tests | Docs] Branch main More ^
|
|
159
|
+
Framework Playwright (detected)
|
|
160
|
+
Test ref [Default branch | Same branch as app PR | Fixed: ____]
|
|
161
|
+
Folder e2e/ Base URL variable BASE_URL
|
|
162
|
+
Tests shop-web, shop-api
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Dot detail page: a Repos section with one row per repo: role, scan state, last event, and the last run for that repo. Errors (a 403 on clone, no events for 7 days while the repo had pushes) show on the row with the action that fixes them.
|
|
166
|
+
|
|
167
|
+
Mobile: rows stack to two lines at 390 px; the role control stays on one line. A visual check of both themes at 390x844 and 1280x800 is part of the UI tasks in section 5.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 2. Repo scan and profile
|
|
172
|
+
|
|
173
|
+
### 2.1 Method chosen
|
|
174
|
+
|
|
175
|
+
**Choice: an in-process TypeScript scanner in three layers. The base layer reuses the regex scanners localdost already has. On top sits an Aider-style symbol map: tree-sitter tags parsed with `web-tree-sitter` (WASM), a reference graph, and PageRank. GitHub's languages API adds cheap facts before the clone. One small model call then names the feature areas and writes the glossary.** Repomix stays an optional chat export. OpenQodex `packages/graph` stays the planned call-graph upgrade (PR-REVIEW-QA.md task 37).
|
|
176
|
+
|
|
177
|
+
| Candidate | Licence | Fit | Decision |
|
|
178
|
+
|---|---|---|---|
|
|
179
|
+
| Existing localdost scanners (`routes.ts`, `specs.ts`, `imports.ts`, `classify.ts`, CODEOWNERS and owner map parsers in `impact.ts`) | MIT (ours) | Offline, cached by sha. They already produce routes, specs, test ids, and import edges | Base layer |
|
|
180
|
+
| Aider repo map [A1, A2] | Apache-2.0 | Tree-sitter tags for definitions and references, a graph with files as nodes and edges weighted by reference count, personalized PageRank, output fitted to a token budget (default 1,024 tokens). Offline, no service. Caches tags by file mtime in SQLite | Re-implement the method in TypeScript. Copy no code |
|
|
181
|
+
| `web-tree-sitter` and grammar WASM files [A10] | MIT (tree-sitter core and the TypeScript, JavaScript, Python, Java, Go grammars) | Runs in Node with no native build. SPEC.md rules out native dependencies | Parser for the symbol map. npm licence of `web-tree-sitter` to confirm (repo is MIT) |
|
|
182
|
+
| GitHub languages API [A6] | n/a | Bytes per language, one request, no clone | Pre-clone stack facts |
|
|
183
|
+
| GitHub SBOM API [A7] | n/a | SPDX dependency list. The sync endpoint closes on 2026-11-13; the replacement is an async generate-then-fetch pair | Skip. Manifests in the clone give the same facts offline |
|
|
184
|
+
| Repomix [A3, A4] | MIT | Packs a repo into one XML, Markdown, or JSON file with token counts. `--compress` keeps signatures through tree-sitter (marked experimental). Has an MCP mode. No incremental cache | Optional chat tool "pack this area", capped. Too large to serve as the profile |
|
|
185
|
+
| code2prompt [A5] | MIT | Rust CLI that renders a repo into a prompt from templates | Overlaps with Repomix; no added value |
|
|
186
|
+
| OpenQodex `packages/graph` [A8] | Apache-2.0 | TypeScript package next to the review code we already adapt | Later: callers two hops away, behind a flag |
|
|
187
|
+
| Sourcegraph SCIP [A9] | Apache-2.0 (scip, scip-typescript); scip-python to confirm | Compiler-grade references. Each language needs its own indexer, and scip-typescript needs a working `tsconfig.json`. Full re-index each time | Too heavy for a scan on connect |
|
|
188
|
+
| Universal Ctags [A11] | GPL-2.0 | Tags file per language. Usable only as a separate binary, which adds a system dependency. Aider moved away from it for the same install burden [A2] | Skip |
|
|
189
|
+
| deepwiki-open [A12], DeepWiki MCP [A13] | MIT; hosted service | Wiki and diagrams from a FastAPI server with embeddings and many model calls. The hosted MCP serves public repos only | Too costly per repo and per merge; private repos need an account |
|
|
190
|
+
| Code-graph MCP servers: codebase-memory-mcp [A14] (MIT, single binary, SQLite, incremental), code-graph-rag [A15] (MIT, needs Memgraph), CodeGraphContext [A16] (MIT, embedded graph DB), Serena [A17] (GPL-3.0 except its LSP layer), GitNexus [A18] (PolyForm Noncommercial) | Mixed | Built for an agent that edits code | Out of scope for the scan. A user can attach codebase-memory-mcp as an MCP connection for chat. Serena and GitNexus licences do not fit an MIT product |
|
|
191
|
+
| AGENTS.md generators [A19] | Mixed | Every one found is model-driven over the whole repo | Too costly; the profile summary covers the need |
|
|
192
|
+
|
|
193
|
+
Reasons, against the criteria in KAT-85:
|
|
194
|
+
|
|
195
|
+
- Licence: the chosen path is MIT end to end. The Aider method is an algorithm, so a re-implementation carries no licence duty. Aider's own `queries/*.scm` files have no licence file in that folder and an unclear origin [A1], so localdost takes `tags.scm` files from the grammar repos, which are MIT, with a header and a `NOTICE` line (task R4).
|
|
196
|
+
- No services: the scan is one Node job. State lives in SQLite and the data folder.
|
|
197
|
+
- Offline: after the clone, the scan reads only the local checkout. The languages API call is optional.
|
|
198
|
+
- Incremental: tags and import edges are cached per git blob sha. Aider keys its cache by mtime, which a fresh worktree resets; a blob sha survives that. A merge re-parses only the blobs it changed (section 2.5).
|
|
199
|
+
- Compact output: hard caps per field (section 2.3) keep the profile JSON under 64 KB and the prompt block under 4 KB.
|
|
200
|
+
|
|
201
|
+
### 2.2 Scan pipeline
|
|
202
|
+
|
|
203
|
+
New `src/profile/`, job kind `repo_scan`, one job per repo and sha:
|
|
204
|
+
|
|
205
|
+
1. **Mirror.** Keep one partial clone per repo at `data/mirrors/<owner>__<name>.git` (`git clone --filter=blob:none --bare`), refreshed with `git fetch`. Check out the default-branch head into `data/checkouts/scan-<repo>-<sha>` with `git worktree add --detach`. The review checkout and the test runner reuse the same mirror (section 3.3), so a repo is cloned once per workspace.
|
|
206
|
+
2. **Inventory.** `checkoutView(root)` lists files (cap 8,000, today's `MAX_FILES`). Classify each file with `classFor`. Read manifests: `package.json` (with workspaces), `pnpm-workspace.yaml`, `turbo.json`, `nx.json`, `pyproject.toml`, `requirements*.txt`, `pom.xml`, `build.gradle*`, `go.mod`, `Gemfile`, `composer.json`, `Dockerfile*`, `docker-compose*.yml`, and Katalon `*.prj`.
|
|
207
|
+
3. **Stack.** Languages from the GitHub languages API, or from file extensions when offline. Frameworks from manifest dependencies by a fixed table (Next.js, Remix, SvelteKit, Vite React, Angular, Vue, Express, Fastify, NestJS, Django, Flask, FastAPI, Rails, Spring Boot, and others). Each framework carries its evidence line.
|
|
208
|
+
4. **Apps.** One app per deployable unit: each workspace package with a `start`, `dev`, or `build` script; each folder with a framework config (`next.config.*`, `vite.config.*`, `angular.json`, `manage.py`); each Dockerfile. Kind is `web`, `api`, `mobile`, `worker`, `cli`, or `library`.
|
|
209
|
+
5. **Routes.** `detectRoutes` over route files and source files, with the framework table in PR-REVIEW-QA.md section 2.3. Each route is attached to its app by path prefix.
|
|
210
|
+
6. **Tests.** Framework detection by config file and dependency (section 3.4 table). `specInventory` for JS, TS, and Python specs. New parsers for Java and Kotlin (JUnit annotations, `@Tag`, `@DisplayName`), Groovy scripts plus Katalon `Object Repository/*.rs` XML, and Cypress `cy.get('[data-cy=...]')`.
|
|
211
|
+
7. **CI.** Parse `.github/workflows/*.yml` with the existing YAML parser: name, `on` triggers, job names, and whether a job runs tests (a `run` line that calls a known test command), deploys a preview, uploads coverage artifacts, or checks out another repo (`actions/checkout` with `repository:`, a strong hint of an app and test repo pair [B10]).
|
|
212
|
+
8. **Owners.** `parseCodeowners` from `.github/CODEOWNERS`, `CODEOWNERS`, and `docs/CODEOWNERS`. Team handles only; no commit-author mining, so no personal data lands in the profile.
|
|
213
|
+
9. **Symbol map.** Aider method: `tags.scm` queries yield definitions and references per file. Build a graph with an edge from a file that references a name to each file that defines it, weighted by the square root of the reference count. Personalize PageRank toward route files, entry points, and files named in the owner map. Keep the top 60 files with up to 8 symbols each.
|
|
214
|
+
10. **Areas.** Draft areas from, in order: `.localdost/review.yml` owner map, route groups (first URL segment, `areaOfRoute`), monorepo packages, and path heuristics (`pathArea`). Merge drafts that share most of their files. Then one model call (section 2.6) names each area in user words, adds flows, and writes the summary and glossary.
|
|
215
|
+
11. **Store.** Write a `repo_profiles` row, update `repos.scan`, publish a `repo` live event, and remove the worktree.
|
|
216
|
+
|
|
217
|
+
### 2.3 Profile schema
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
// src/types.ts (add only)
|
|
221
|
+
|
|
222
|
+
export interface RepoProfile {
|
|
223
|
+
version: 1;
|
|
224
|
+
repo: string; // owner/name
|
|
225
|
+
sha: string;
|
|
226
|
+
scannedAt: string;
|
|
227
|
+
mode: 'full' | 'incremental';
|
|
228
|
+
/** Three sentences at most: what the repo is and who uses it. */
|
|
229
|
+
summary: string;
|
|
230
|
+
stack: {
|
|
231
|
+
languages: { name: string; share: number }[]; // top 8
|
|
232
|
+
frameworks: { name: string; version?: string; evidence: string }[];
|
|
233
|
+
packageManagers: string[];
|
|
234
|
+
monorepo?: { tool: string; packages: string[] }; // top 40 packages
|
|
235
|
+
};
|
|
236
|
+
apps: {
|
|
237
|
+
id: string; // app1, app2, ...
|
|
238
|
+
name: string;
|
|
239
|
+
path: string; // folder
|
|
240
|
+
kind: 'web' | 'api' | 'mobile' | 'worker' | 'cli' | 'library';
|
|
241
|
+
framework?: string;
|
|
242
|
+
routeCount: number;
|
|
243
|
+
/** Env var or config key that sets its URL in tests, when found. */
|
|
244
|
+
baseUrlHint?: string;
|
|
245
|
+
}[];
|
|
246
|
+
routes: { app: string; route: string; method?: string; file: string; line: number; area?: string }[]; // cap 400
|
|
247
|
+
areas: ProfileArea[]; // cap 40
|
|
248
|
+
tests: {
|
|
249
|
+
frameworks: TestFrameworkInfo[];
|
|
250
|
+
specs: ProfileSpec[]; // cap 2,000 (MAX_SPECS)
|
|
251
|
+
smokeTag?: string;
|
|
252
|
+
tags: { tag: string; count: number }[]; // @smoke, @checkout, ...
|
|
253
|
+
};
|
|
254
|
+
ci: {
|
|
255
|
+
workflows: {
|
|
256
|
+
file: string;
|
|
257
|
+
name: string;
|
|
258
|
+
on: string[];
|
|
259
|
+
jobs: string[];
|
|
260
|
+
runsTests: boolean;
|
|
261
|
+
previewDeploy: boolean;
|
|
262
|
+
coverageArtifacts: string[];
|
|
263
|
+
checksOut: string[]; // other repos named in actions/checkout
|
|
264
|
+
}[];
|
|
265
|
+
};
|
|
266
|
+
owners: { pattern: string; owners: string[] }[]; // CODEOWNERS, cap 200
|
|
267
|
+
glossary: { term: string; meaning: string; paths?: string[] }[]; // cap 40
|
|
268
|
+
map: { file: string; rank: number; symbols: string[] }[]; // cap 60
|
|
269
|
+
/** Other repos or app URLs this repo names: test configs, workflow checkouts, README links. */
|
|
270
|
+
mentions: { repo?: string; url?: string; file: string; why: string }[];
|
|
271
|
+
stats: { files: number; truncated: boolean; parsedFiles: number; scanMs: number; modelTokens: number };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface ProfileArea {
|
|
275
|
+
id: string; // stable slug, e.g. "checkout"
|
|
276
|
+
name: string; // "Checkout and payment"
|
|
277
|
+
paths: string[]; // globs
|
|
278
|
+
routes: string[];
|
|
279
|
+
flows: string[]; // user words: "guest checkout with a coupon"
|
|
280
|
+
specs: string[]; // spec paths in this repo
|
|
281
|
+
owners: string[];
|
|
282
|
+
keyFiles: string[]; // top ranked files from the map
|
|
283
|
+
source: 'owner_map' | 'routes' | 'packages' | 'paths' | 'model' | 'user';
|
|
284
|
+
confidence: number;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export interface TestFrameworkInfo {
|
|
288
|
+
framework: 'playwright' | 'cypress' | 'webdriverio' | 'pytest' | 'junit' | 'katalon' | 'jest' | 'vitest' | 'other';
|
|
289
|
+
config?: string; // playwright.config.ts, cypress.config.ts, wdio.conf.ts, ...
|
|
290
|
+
dir: string; // testDir, specPattern root, Test Cases/
|
|
291
|
+
count: number;
|
|
292
|
+
kind: 'e2e' | 'unit' | 'api' | 'mixed';
|
|
293
|
+
baseUrl?: { config?: string; env?: string[] };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export interface ProfileSpec {
|
|
297
|
+
path: string;
|
|
298
|
+
framework: TestFrameworkInfo['framework'];
|
|
299
|
+
titles: string[]; // cap 20 per spec
|
|
300
|
+
routes: string[];
|
|
301
|
+
testIds: string[];
|
|
302
|
+
texts: string[]; // cap 20 per spec
|
|
303
|
+
tags: string[];
|
|
304
|
+
/** Page objects or Katalon test objects the spec uses (one import hop). */
|
|
305
|
+
uses: string[];
|
|
306
|
+
/** Issue references in titles, tags, or comments: "#123", "SHOP-12", "KAT-85". */
|
|
307
|
+
issues: string[];
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 2.4 Storage
|
|
312
|
+
|
|
313
|
+
- `repo_profiles` row per scan (section 1.3). The live profile is the newest row; reads apply `overrides` on top.
|
|
314
|
+
- Blob cache at `data/repo-cache/<owner>__<name>/blobs.jsonl`: one line per git blob sha with its tags, import specifiers, routes, and spec facts. This cache makes refresh incremental. Each full scan drops entries for blobs that left the head tree.
|
|
315
|
+
- The import graph cache (`data/graph-cache/<repo>/<sha>.json`) keeps its format and key. The scan writes it, so the first PR review after a scan finds it warm.
|
|
316
|
+
|
|
317
|
+
### 2.5 Incremental refresh on merges
|
|
318
|
+
|
|
319
|
+
- Trigger: a push to the default branch or a merged PR on the repo, from webhook or poll, queues `repo_scan` with `{ repo, sha, since: <profile sha> }`.
|
|
320
|
+
- Coalesce: one scan per repo runs at a time. A newer sha replaces a queued older one. A repo rescans at most once per 10 minutes (`PROFILE_MIN_INTERVAL_SEC`), and the last push in a burst always gets a scan.
|
|
321
|
+
- Delta: `git diff --name-status <since> <sha>` in the mirror. Only added and modified blobs are parsed; removed files leave the inventory. Stack, apps, and CI re-run only when a manifest, framework config, or workflow file changed. PageRank re-runs on the whole graph, which takes milliseconds.
|
|
322
|
+
- Areas: the deterministic drafts are rebuilt every time. The model call runs again only when the drafts changed: a new top-level route segment, a new package, or a moved area path. Otherwise names, flows, and the glossary carry over by area id.
|
|
323
|
+
- Full rescan: weekly, when `since` is not an ancestor of `sha` (force push), when the profile `version` changes, or on demand.
|
|
324
|
+
|
|
325
|
+
### 2.6 Cost bounds
|
|
326
|
+
|
|
327
|
+
| Item | Bound |
|
|
328
|
+
|---|---|
|
|
329
|
+
| Files listed | 8,000 (`MAX_FILES`); over the cap, `stats.truncated` and the UI say so |
|
|
330
|
+
| Files parsed for tags | Source files under 256 KB, at most 5,000 per scan; generated, vendored, and lock files skipped by `classFor` |
|
|
331
|
+
| Wall time | Target 60 s for a full scan of 8,000 files on a laptop, 5 s for a typical merge |
|
|
332
|
+
| GitHub API | Two calls per full scan (repo, languages). Well inside 5,000 requests per hour for a token or App install [A6] |
|
|
333
|
+
| Model calls | One per full scan, and one per incremental scan whose drafts changed. None in demo mode (mock backend) |
|
|
334
|
+
| Model input | 24 KB: draft areas with paths and routes, top map entries, spec titles per area, first 2 KB of the README |
|
|
335
|
+
| Model output | 2 KB JSON: area names, flows, summary, glossary. Checked by a schema and the prose rules in `check.ts` |
|
|
336
|
+
| Model choice | The review backend in use (`claude-cli`, `codex-cli`, or `anthropic`), small model tier |
|
|
337
|
+
| Prompt block for other flows | 4 KB per repo, 8 KB for all repos of one dot |
|
|
338
|
+
|
|
339
|
+
### 2.7 How profiles feed other flows
|
|
340
|
+
|
|
341
|
+
- **Impact mapping.** `buildImpactDrafts` gets the profiles of the dot's app repos. A changed file inside a profile area's paths maps to that area with `via: 'profile'` at confidence 0.85, or 0.95 when a user confirmed the area (`source: 'user'`). The owner map in the repo stays at 0.95. Areas keep their profile id, so one area has one name in every review. `ImpactArea['via']` gains `'profile'`.
|
|
342
|
+
- **What to test.** The reviewer input gets a `<repo_profile>` block: summary, the touched areas with their flows and specs, glossary terms that appear in the diff, and the test frameworks. The spec inventory for `existingTest` becomes the union of the app repo's own specs and the specs of every linked test repo (section 3.1).
|
|
343
|
+
- **Chat.** The dot's system prompt carries one summary line per repo. New read-only chat tools: `get_repo_profile(repo, area?)`, `find_tests(query)` across all repos of the dot, and `pack_area(repo, area)`, which runs Repomix with `--compress` on the area paths, capped at 30 KB.
|
|
344
|
+
- **Ticket review.** Today the flow takes three title keywords and calls GitHub code search (`flows/ticketReview.ts`). New order: match the ticket text against area names, flows, glossary terms, route paths, and spec titles in every profile of the dot; take the top three areas; send their key files, routes, and specs as `codeHits`; call code search only when no area scores. This finds "the coupon field" in an area named "Checkout and payment" even when no file name contains the word coupon.
|
|
345
|
+
- **Spec selection.** `pickSpecs` uses profile areas in place of `areaOf`, which today reads only `src/<area>/`.
|
|
346
|
+
|
|
347
|
+
### 2.8 Viewing and correcting a profile
|
|
348
|
+
|
|
349
|
+
Repo page `#/repos/<owner>/<name>`, reached from Setup and from the dot detail page. Sections: Summary, Stack, Apps and routes, Feature areas, Tests, CI, Owners, Glossary. Feature areas use a table with a detail drawer:
|
|
350
|
+
|
|
351
|
+
```text
|
|
352
|
+
Feature areas [Rescan] [Save as review.yml]
|
|
353
|
+
Area Paths Routes Specs Owners Source
|
|
354
|
+
Checkout and payment src/checkout/**, ... 4 6 @web-pay Model
|
|
355
|
+
Account and sign-in src/auth/** 3 2 @identity Owner map
|
|
356
|
+
Search src/search/** 1 0 - Routes
|
|
357
|
+
2 files in no area: src/lib/money.ts, src/lib/date.ts [Assign]
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
A user can rename an area, edit its path globs, merge two areas, split one by path, delete one, assign unmapped files, edit flows, add or edit glossary terms, and mark a detected framework as wrong.
|
|
361
|
+
|
|
362
|
+
- Edits save as `overrides` on the profile, keyed by area id and field. Rescans keep them. When a rescan no longer finds an area that has overrides, the area stays with a "no longer detected" mark until the user deletes it.
|
|
363
|
+
- **Save as review.yml** drafts `.localdost/review.yml` from the corrected areas and sends it as an `open_pr` action (default rule `act_when_asked`; the button press is the ask). The owner map then lives in the repo, where code review covers it. Until `open_pr` execution exists (PR-REVIEW-QA.md task 33), the draft lands in the outbox with a copy button.
|
|
364
|
+
- Chat can propose a correction ("checkout also covers src/lib/money.ts"). The proposal shows as a card with Apply and Dismiss, and nothing changes until the user applies it.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 3. Test repos
|
|
369
|
+
|
|
370
|
+
### 3.1 Cross-repo spec inventory
|
|
371
|
+
|
|
372
|
+
A test repo has its own profile with `tests.specs` filled. When an app repo changes, the review links the change to specs in every test repo of the dot that targets that app.
|
|
373
|
+
|
|
374
|
+
| Link | How | Confidence |
|
|
375
|
+
|---|---|---|
|
|
376
|
+
| Route | A changed route (from `routes.ts`) equals a spec route from `goto`, `cy.visit`, `browser.url`, `WebUI.navigateToUrl`, `driver.get`, after joining paths and dropping the origin | 0.8 |
|
|
377
|
+
| Test id | A `data-testid`, `data-cy`, `data-test`, or `data-qa` value defined in a changed file (`definesValue`) appears in a spec, a page object it uses, or a Katalon test object | 0.8 |
|
|
378
|
+
| Issue key | The PR closes or names an issue that a spec names in its title or tags (`@issue-123`, `#123`, `SHOP-12`) | 0.85 |
|
|
379
|
+
| API path | A changed API route equals a request path in an API spec (`request.get`, `cy.request`, `requests.get`, RestAssured `given().get`) | 0.75 |
|
|
380
|
+
| Visible text | Changed UI text appears in a spec text locator or a test object | 0.6 |
|
|
381
|
+
| Area name | A spec path, describe title, or tag contains the area id or a glossary term of the touched area | 0.55 |
|
|
382
|
+
|
|
383
|
+
Page objects matter here. Most test repos keep selectors and URLs in page objects or Katalon test objects, and the specs only call them. The scan follows one import hop from each spec: `imports.ts` for JS, TS, and Python, `import` lines for Java, and `findTestObject('...')` for Katalon. The page object's routes, test ids, and texts count for every spec that uses it.
|
|
384
|
+
|
|
385
|
+
In types: `QaTestToRun.existingTest` and `QaTestAtRisk.path` may carry a repo prefix, `owner/name:path`. A path with no prefix keeps today's meaning, the app repo. `SpecLink` gains `repo`.
|
|
386
|
+
|
|
387
|
+
### 3.2 Test repo config
|
|
388
|
+
|
|
389
|
+
```ts
|
|
390
|
+
export interface TestRepoConfig {
|
|
391
|
+
/** Detected on scan; the user can change it. */
|
|
392
|
+
framework: 'playwright' | 'cypress' | 'webdriverio' | 'pytest' | 'junit' | 'katalon';
|
|
393
|
+
/** Subfolder with the test project. Unset: repo root. */
|
|
394
|
+
dir?: string;
|
|
395
|
+
/** Which ref of the test repo runs against an app change. Default 'default'. */
|
|
396
|
+
ref?: 'default' | 'match_branch' | { fixed: string };
|
|
397
|
+
/** Overrides the adapter's command. Runs without a shell, like runner.command. */
|
|
398
|
+
command?: string;
|
|
399
|
+
/** Env var names the adapter sets to the app URL. Default per adapter. */
|
|
400
|
+
baseUrlEnv?: string[];
|
|
401
|
+
/** Env var names passed into the run, such as test user credentials. Each must start with LOCALDOST_TEST_. */
|
|
402
|
+
passEnv?: string[];
|
|
403
|
+
/** Text that marks a smoke spec. Default '@smoke'. */
|
|
404
|
+
smokeGrep?: string;
|
|
405
|
+
/** Katalon only. */
|
|
406
|
+
katalon?: { suite?: string; profile?: string; browser?: string; apiKeyEnv?: string };
|
|
407
|
+
/** Jobs that run this repo's specs. Default ['pr_check', 'post_merge']. */
|
|
408
|
+
on?: ('pr_check' | 'post_merge')[];
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Ref resolution for one app PR, first match wins:
|
|
413
|
+
|
|
414
|
+
1. A line in the PR body, `localdost-tests-ref: <branch>`, pins the test repo to that branch when it exists. This covers the common case where the app change and its test change land in two PRs. Built as a branch name only: the `#<n>` and `owner/name@<branch>` forms of the first design are not built, and a branch the test repo lacks is said in a step and skipped.
|
|
415
|
+
2. `match_branch`: when the test repo has a branch with the app PR's head branch name, use it, else the default branch.
|
|
416
|
+
3. `{ fixed }`: that branch or tag.
|
|
417
|
+
4. `default`: the test repo's default branch, as GitHub reports it.
|
|
418
|
+
|
|
419
|
+
A merge uses rules 3 and 4 only. A fork PR uses rules 3 and 4 only: its body and branch name pick nothing. The run records the resolved ref and sha (`TestReport.testRepos`), and the PR comment names them under Details, so anyone can rerun the same tests. Built in `src/runner/test-repo.ts` (`resolveTestRef`). `TestRepoConfig` gained `label`, `setup` and `areas`, see [SANDBOX.md](SANDBOX.md#tests-repo).
|
|
420
|
+
|
|
421
|
+
### 3.3 Runner checkout
|
|
422
|
+
|
|
423
|
+
```ts
|
|
424
|
+
export interface RunSpec {
|
|
425
|
+
// existing fields unchanged
|
|
426
|
+
/** Set: the run checks out this test repo at sha and runs its specs against baseUrl. */
|
|
427
|
+
testRepo?: { repo: string; ref: string; sha: string; config: TestRepoConfig };
|
|
428
|
+
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
`run()` in `src/runner/index.ts`:
|
|
432
|
+
|
|
433
|
+
- Workdir: a worktree of the test repo at `sha` in `<data>/worktrees/<runId>-a<attempt>-tests`, removed when the run ends and swept at boot with the app worktrees. Built on a cache folder `<data>/test-repos/<owner>__<name>`, a git folder with no files of its own that holds fetched commits, and not on the mirror of section 2.2 (R1 is not built). `runner.workdir` keeps working for single-repo dots and for the app repo.
|
|
434
|
+
- Base URL: the app PR preview (`previewFor(appRepo, headSha)`), else the dot's `baseUrl`. Only the URL crosses from the app side; a test-repo run never checks out the app repo.
|
|
435
|
+
- Install: docker mode runs the adapter's install step (`npm ci`, `pip install -r`, `mvn -q -DskipTests dependency:go-offline`) in the container. A named volume per repo and lockfile hash caches `node_modules`, `~/.m2`, and pip wheels, so a second run on the same lockfile skips the download.
|
|
436
|
+
- Secrets: the existing credential filter applies. `passEnv` names must start with `LOCALDOST_TEST_`, and the run sees them with that prefix replaced by `TEST_` (`LOCALDOST_TEST_USER` becomes `TEST_USER`). A dot config therefore cannot forward `GITHUB_TOKEN` or a model key. The same rule and the same `TEST_` rename apply to `runner.passEnv` of a dot, which the runner reads today (docs/SANDBOX.md section Test login); `test.passEnv` of a test repo is built the same way, and falls back to the dot's `runner.passEnv` when the test repo lists none. The Katalon API key is the one exception: `katalon.apiKeyEnv` names it, and it goes only to `katalonc` as `-apiKey`.
|
|
437
|
+
- Fork safety: a fork PR of an app repo never runs test repo code with the host environment. Built as: in local mode the batch is skipped, in Docker mode it runs only when no test login (`test.passEnv`, else the dot's `runner.passEnv`) would go with it, otherwise it is skipped with a sentence, and the body and branch of a fork PR never pick the ref. This replaces the first design, which followed `runner.trustForks`.
|
|
438
|
+
- Batches: when a dot has app specs and a test repo, the runs go in sequence by default (`LOCALDOST_RUN_CONCURRENCY` raises it), and `mergeReports` combines them. Retries (`runSuite`) stay per batch.
|
|
439
|
+
|
|
440
|
+
### 3.4 Framework adapters
|
|
441
|
+
|
|
442
|
+
New `src/runner/adapters/`, one module per framework behind one interface:
|
|
443
|
+
|
|
444
|
+
```ts
|
|
445
|
+
export interface FrameworkAdapter {
|
|
446
|
+
id: TestRepoConfig['framework'];
|
|
447
|
+
/** Finds the framework in a checkout. */
|
|
448
|
+
detect(view: RepoView): { config?: string; dir: string; version?: string } | null;
|
|
449
|
+
/** Lists runnable tests without running them, when the framework can. */
|
|
450
|
+
list?(ctx: AdapterCtx): Promise<{ file: string; title: string; tags: string[] }[]>;
|
|
451
|
+
/** Builds the command for a selection. */
|
|
452
|
+
command(sel: Selection, ctx: AdapterCtx): { cmd: string; args: string[]; env: Record<string, string> };
|
|
453
|
+
install(ctx: AdapterCtx): { cmd: string; args: string[] } | null;
|
|
454
|
+
image(ctx: AdapterCtx): string;
|
|
455
|
+
/** Parses the report files into the shared result shape. */
|
|
456
|
+
parse(outDir: string, exec: ExecResult): ParsedReport;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export interface Selection {
|
|
460
|
+
files: string[];
|
|
461
|
+
titles?: string[]; // becomes a grep, -k, or -Dtest filter
|
|
462
|
+
tags?: string[];
|
|
463
|
+
all?: boolean;
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
| Order | Framework | Select | Base URL | Report | Image |
|
|
468
|
+
|---|---|---|---|---|---|
|
|
469
|
+
| 1 | Playwright [B1, B2, B3] (exists for the app repo; moved behind the interface) | spec paths, `--grep`; `--list --reporter=json` lists tests | `BASE_URL`; the config must read it into `use.baseURL` | `--reporter=json` (existing parser) | `mcr.microsoft.com/playwright:v<version>-noble` |
|
|
470
|
+
| 2 | Cypress [B4] | `--spec a,b`; default `specPattern` is `cypress/e2e/**/*.cy.{js,jsx,ts,tsx}` | `CYPRESS_BASE_URL` sets `baseUrl` | JUnit reporter to `<out>/r-[hash].xml` | `cypress/included:<version>` |
|
|
471
|
+
| 3 | WebdriverIO [B5, B6] | `--spec` (flag to confirm) | `baseUrl` in a wrapper config | `@wdio/junit-reporter` set in the wrapper config, as the Playwright wrapper does today | Node image with Chrome |
|
|
472
|
+
| 4 | pytest [B7, B8] | `path::Class::test`, `-k`, `-m`; `--collect-only -q` lists tests | `--base-url` when `pytest-base-url` is installed, else `BASE_URL` | `--junitxml=<out>/junit.xml` | `mcr.microsoft.com/playwright/python:v<version>-noble` |
|
|
473
|
+
| 5 | JUnit 5 with Maven or Gradle [B9] | `-Dtest=Class#method`, tags through `<groups>`; Gradle `--tests` | `-Dbase.url=` plus `BASE_URL` | Surefire XML in `target/surefire-reports/`, Gradle XML in `build/test-results/` | `maven:3-eclipse-temurin-21`, `gradle:jdk21` |
|
|
474
|
+
| 6 | Katalon Studio [B11] | `-testSuitePath` or `-testSuiteCollectionPath` (relative, no extension) | `-executionProfile` with a `baseUrl` variable | JUnit report in `-reportFolder` | Katalon Runtime Engine image; needs a Runtime Engine licence and `-apiKey` |
|
|
475
|
+
|
|
476
|
+
One shared parser, `src/runner/junit-xml.ts`, turns JUnit XML into `ParsedReport` for adapters 2 to 6: a `testcase` with `failure` or `error` is failed, `skipped` is skipped, Surefire `flakyFailure` and `flakyError` count as flaky, and `classname` plus `name` give the title. It uses `fast-xml-parser` (MIT, no native code).
|
|
477
|
+
|
|
478
|
+
Katalon specifics: `katalonc` runs in console mode with `-projectPath` (absolute, including the `.prj` file) and needs a Runtime Engine licence [B11]. The dot shows Katalon as runnable only when `katalon.apiKeyEnv` names a set variable, and the Setup page says why. Selection is coarse in the first version: whole suites from `katalon.suite`, plus smoke. A generated temporary suite that lists the linked test cases comes later (task T9). The folder layout this design assumes (`Test Cases/`, `Scripts/`, `Object Repository/*.rs`, `Test Suites/`, `Profiles/`) is to confirm against a sample project, since the docs page for it did not load.
|
|
479
|
+
|
|
480
|
+
Live view: Playwright keeps its step reporter and browser frames. Other adapters stream stdout to the run log only.
|
|
481
|
+
|
|
482
|
+
### 3.5 Results on the app PR
|
|
483
|
+
|
|
484
|
+
- The test-repo report merges into the same `TestReport` through `mergeReports`. Each case's `file` gets the repo prefix, `acme/shop-e2e:tests/checkout.spec.ts`.
|
|
485
|
+
- `whatToTest[].result` fills from those cases exactly as for app specs, so the checklist, verdict, check run, and sticky comment need no new path.
|
|
486
|
+
- The sticky comment and the check summary add one line in the counts: "Ran 14 Shop tests from shop-e2e: 13 passed, 1 failed." The commit, the ref, why that ref, the tests chosen and the URL sit under Details ("acme/shop-e2e at main (9be0d11), because the default branch; tests: the whole suite; against https://pr-58.preview.acme.dev"). File links point to the test repo blob at that sha.
|
|
487
|
+
- The check run stays on the app PR head sha. Annotations stay on app files, because GitHub annotates only files of the repo that owns the check. A failing test in the test repo is listed in the check summary with its link.
|
|
488
|
+
- Flaky memory keys get the repo prefix, so one file name in two repos never mixes.
|
|
489
|
+
|
|
490
|
+
### 3.6 Events for both repos
|
|
491
|
+
|
|
492
|
+
| Repo role | Event | Job | What happens |
|
|
493
|
+
|---|---|---|---|
|
|
494
|
+
| app | PR opened, synchronize | `pr_check` | Review; app specs plus linked test-repo specs against the preview or base URL |
|
|
495
|
+
| app | `deployment_status` success [B10] | none | Records the preview. With `waitForPreviewSec` set, a waiting `pr_check` starts now. A `post_merge` that waits for the deploy of its commit looks again now ([SETUP.md](SETUP.md#waiting-for-the-deploy)) |
|
|
496
|
+
| app | merge or push to default | `post_merge` and `repo_scan` | Same as today plus test-repo specs against `baseUrl`, and a profile refresh |
|
|
497
|
+
| test | PR opened, synchronize | `test_pr_check` (new) | Review the test diff with the existing test signals (assertion removed, test disabled, test config changed); run the changed specs against the dot's `baseUrl`; comment on the test PR |
|
|
498
|
+
| test | merge or push to default | `repo_scan` | Refresh the spec inventory. A smoke run happens only when the dot turns it on |
|
|
499
|
+
| test | `workflow_run` failure | `ci_failure` | Triage as today; the prompt adds the app repo merges since the last green run, since a nightly e2e failure usually points at an app change |
|
|
500
|
+
| docs | merge or push to default | `repo_scan` | Profile only: glossary and flows from docs feed the areas |
|
|
501
|
+
|
|
502
|
+
Polling covers PRs and pushes for every repo, as today. Webhooks need the GitHub App installed on every repo in the set, or a repo webhook on each. The Setup row shows the intake per repo, so a missing webhook on the test repo is visible.
|
|
503
|
+
|
|
504
|
+
`test_pr_check` and `pr_check` share `flows/change.ts`; the role selects the spec source and the comment target. localdost runs the cross-repo suite itself, so the team needs no `repository_dispatch` or second-repo `actions/checkout` wiring [B10].
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 4. GitHub Issues as ALM
|
|
509
|
+
|
|
510
|
+
### 4.1 Tracker kind github
|
|
511
|
+
|
|
512
|
+
```ts
|
|
513
|
+
// src/types.ts (the unions widen)
|
|
514
|
+
|
|
515
|
+
export interface Watch {
|
|
516
|
+
tracker?:
|
|
517
|
+
| { kind: 'jira'; baseUrl: string; projectKeys: string[] }
|
|
518
|
+
| { kind: 'linear'; teamKeys: string[] }
|
|
519
|
+
| {
|
|
520
|
+
kind: 'github';
|
|
521
|
+
/** Repos whose issues this dot reviews. Default: the dot's app repos. */
|
|
522
|
+
repos?: string[];
|
|
523
|
+
/** Labels that mark requirements and defects, and labels to skip. */
|
|
524
|
+
labels?: { requirement?: string[]; defect?: string[]; ignore?: string[] };
|
|
525
|
+
/** Org issue types that count as requirements and defects. */
|
|
526
|
+
issueTypes?: { requirement?: string[]; defect?: string[] };
|
|
527
|
+
/** Only review issues in these milestones. Unset: all. */
|
|
528
|
+
milestones?: string[];
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Ticket.tracker and TriggerEvent.ticket.tracker: 'jira' | 'linear' | 'github'
|
|
533
|
+
// Ticket gains: milestone?: string; issueType?: string; state?: 'open' | 'closed'; repo?: string
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
Widening these unions changes the contract in `src/types.ts`, which says add only. Widening breaks no reader that switches on `kind`, but each `switch` without a default case needs a check; task A1 lists them.
|
|
537
|
+
|
|
538
|
+
Ticket key for GitHub: `owner/name#123`. `ticket.id` is the issue node id. `projectKey` is `owner/name`, so `watchMatches` compares it with `tracker.repos`.
|
|
539
|
+
|
|
540
|
+
Issue types are org-level since April 2025, with Task, Bug, and Feature as defaults and up to 25 types [C3, C4]. Repos outside an org, or orgs that do not use types, fall back to labels. Sub-issues (up to 100 per parent [C5]) map to a requirement tree in the traceability view.
|
|
541
|
+
|
|
542
|
+
### 4.2 Normalizer, poller, and webhooks
|
|
543
|
+
|
|
544
|
+
`normalizeGithubIssue(eventName, payload)` in a new `src/integrations/github-issues.ts`. Action names come from the webhook reference [C8]:
|
|
545
|
+
|
|
546
|
+
| Event and action | Trigger | Notes |
|
|
547
|
+
|---|---|---|
|
|
548
|
+
| `issues.opened` | `ticket_created` | Skip when the author is the localdost bot |
|
|
549
|
+
| `issues.edited` with `changes.body` or `changes.title` | `ticket_updated` (new kind, job `ticket_review`) | Dedupe on a hash of the new body, so a repeated edit queues once |
|
|
550
|
+
| `issues.labeled` with a requirement or defect label | `ticket_updated` | Only when the label brings the issue into scope |
|
|
551
|
+
| `issues.typed` | `ticket_updated` | When the new type is in `issueTypes` |
|
|
552
|
+
| `issues.milestoned` | `ticket_updated` | When the milestone is in `milestones` |
|
|
553
|
+
| `issues.closed`, `issues.reopened` | none | Updates `issue_state` and the traceability view |
|
|
554
|
+
| `issue_comment.created` with `/localdost review` on an issue | `ticket_updated` | Only from users with write access (`writePermission`), so outsiders cannot spend model calls |
|
|
555
|
+
| `issue_comment.created` with `/localdost review` on a pull request | a review on demand of the PR (`pr_check`) | Only from users with write access, for each dot that watches the repo as an app repo (KAT-376) |
|
|
556
|
+
| `issue_comment.edited` | existing path | Sticky PR comment ticks, unchanged |
|
|
557
|
+
|
|
558
|
+
Pull requests also arrive as issue events. The normalizer drops any payload with `issue.pull_request` set.
|
|
559
|
+
|
|
560
|
+
Dedupe keys: `github-issue:<owner/name>#<n>:created` and `github-issue:<owner/name>#<n>:edited:<bodyHash8>`. Webhook and poll share them.
|
|
561
|
+
|
|
562
|
+
Poller: `pollGithubIssuesOnce(repo)` calls `GET /repos/{o}/{r}/issues?state=all&sort=updated&direction=asc&since=<cursor>&per_page=100`. It drops pull requests, emits `created` for issues created after the cursor, and emits `edited` when the body hash differs from `issue_state.bodyHash`. The first poll records a cursor and queues nothing, like the Linear poller. Interval `POLL_GITHUB_SEC`.
|
|
563
|
+
|
|
564
|
+
The App and the token need one more permission, Issues read and write, and the App subscribes to the `issues` event. GITHUB.md's permission table and the App manifest in `src/connect/github-app.ts` change with task A2.
|
|
565
|
+
|
|
566
|
+
### 4.3 Ticket review on issues
|
|
567
|
+
|
|
568
|
+
- `fetchTicket` gets a `github` branch: `GET /repos/{o}/{r}/issues/{n}` into `Ticket` with labels, milestone, `type.name`, state, and author.
|
|
569
|
+
- Acceptance criteria, first match wins: the section under a heading that matches "acceptance criteria" (the existing `extractAcceptanceCriteria`), the task list items (`- [ ]`) in the body, or the `### <label>` sections that GitHub renders from issue form templates.
|
|
570
|
+
- The review comment is sticky per issue, marked `<!-- localdost:ticket-review -->`. A re-review edits that comment in place. Rule `ticket_comment` keeps its default `ask`.
|
|
571
|
+
- The flow matches Jira and Linear, including the score floor and the profile-based code lookup from section 2.7.
|
|
572
|
+
|
|
573
|
+
### 4.4 PR to issue links
|
|
574
|
+
|
|
575
|
+
Three sources, stored in `links`:
|
|
576
|
+
|
|
577
|
+
| Source | How | Kind |
|
|
578
|
+
|---|---|---|
|
|
579
|
+
| Closing keywords [C6] | Regex on PR title and body: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved, then `#N`, `owner/name#N`, or an issue URL. GitHub closes the issue only when the PR targets the default branch; localdost records the link for any base | `closes` |
|
|
580
|
+
| Development sidebar | GraphQL `pullRequest.closingIssuesReferences` on every PR the dot checks. It also returns manual sidebar links (up to 10 per PR, any branch, cross-repo [C6]) that no text holds. Field signature to confirm [C9] | `closes` |
|
|
581
|
+
| Timeline [C7] | `GET /repos/{o}/{r}/issues/{n}/timeline`: cross-reference events (a PR or issue mentions this one) and sub-issue and blocking events | `references`, `parent`, `blocks` |
|
|
582
|
+
|
|
583
|
+
Jira keys and Linear identifiers in a PR title or branch already link a PR to a ticket for AI-Vision cases. The same function now writes `links` rows for all three trackers, so traceability works the same way for each.
|
|
584
|
+
|
|
585
|
+
Test links: a spec that names an issue (`ProfileSpec.issues`) writes a `tests` link. A `whatToTest` item from a review of a PR that closes an issue writes a `covers` link with the run id.
|
|
586
|
+
|
|
587
|
+
### 4.5 Defects filed as issues
|
|
588
|
+
|
|
589
|
+
- New action kind `issue_create`, default rule `ask`. It runs on its own only when the user sets the rule to `act`.
|
|
590
|
+
- When: a `post_merge` or `pr_check` verdict of `product_failure` with a case that failed on both retries. Flaky results and test failures never draft a defect.
|
|
591
|
+
- Body: title from the failing scenario; steps from the test steps (Playwright step reporter or the `whatToTest` steps); expected and actual; the error text; links to the run, trace, and screenshot; the suspected PR; "Relates to #N" for each requirement linked to that PR. Labels: the dot's `labels.defect` (default `bug`) plus `localdost`. Issue type: the first `issueTypes.defect` when the org has types. Milestone: the linked requirement's milestone.
|
|
592
|
+
- Duplicate guard: the body carries `<!-- localdost:defect sig=<hash of test id and first error line> -->`. Before drafting, localdost searches open issues for that marker. A match turns the draft into a `ticket_comment` on the existing issue: "Seen again in run <link>".
|
|
593
|
+
- The same action targets Jira (create issue) and Linear (`issueCreate`) for those trackers in a later task, which mirrors True Platform's "Create Defects" for Jira [C2].
|
|
594
|
+
|
|
595
|
+
### 4.6 Per-issue test status
|
|
596
|
+
|
|
597
|
+
Computed on read from `links` and runs, and cached in `issue_state.testStatus`:
|
|
598
|
+
|
|
599
|
+
| Status | Rule |
|
|
600
|
+
|---|---|
|
|
601
|
+
| Not tested | No linked PR has a run, and no spec links to the issue |
|
|
602
|
+
| Passing | The latest run of every linked PR passed, and every linked spec passed in its latest run |
|
|
603
|
+
| Failing | A linked spec or `whatToTest` item failed in the latest run, or an open defect links to the issue |
|
|
604
|
+
| Partly tested | Some `whatToTest` items of the linked PRs are `not_run` |
|
|
605
|
+
| Out of date | A linked PR has a newer head than its latest run |
|
|
606
|
+
|
|
607
|
+
The app shows the status. Writing it back to GitHub is optional and off by default: a `qa: passing` or `qa: failing` label and a status line in the sticky ticket-review comment, both through the `ticket_comment` rule.
|
|
608
|
+
|
|
609
|
+
### 4.7 Traceability view
|
|
610
|
+
|
|
611
|
+
New client feature `client/src/features/trace/`: one table of requirements per dot, one row per issue, with a detail drawer. It works the same for Jira, Linear, and GitHub tickets.
|
|
612
|
+
|
|
613
|
+
```text
|
|
614
|
+
Traceability [Milestone: 2026.11 v] [Status: All v] [Repo: acme/shop-web v]
|
|
615
|
+
Issue Type PRs Tests Defects Status
|
|
616
|
+
#412 Guest checkout coupon Feature #58 #61 6 / 7 1 open (!) Failing
|
|
617
|
+
#418 Saved cards Feature #63 3 / 3 - (o) Passing
|
|
618
|
+
#420 Order history filter Task - 0 - ( ) Not tested
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
Drawer: issue summary and acceptance criteria, linked PRs with their last verdict, linked tests with the last result per run, defects, and the QA review comment. Export: the table as CSV, and a `ReportPage` of kind `readiness` per milestone.
|
|
622
|
+
|
|
623
|
+
### 4.8 Match with the Katalon True Platform model
|
|
624
|
+
|
|
625
|
+
Public Katalon docs, read on 2026-10-08, document no GitHub Issues ALM integration. True Platform lists Jira, Azure DevOps, and Xray as ALM integrations [C1]. Its GitHub integration syncs test cases and test suites between a repo and the platform [C10], and recent release notes add GitHub Server support and GitHub context for the Katalon AI assistant [C11]. If the True Platform team runs GitHub Issues as its ALM, that setup lives outside the public docs, and Huy should confirm the label and type conventions before task A4.
|
|
626
|
+
|
|
627
|
+
This design therefore copies the shape of True Platform's Jira ALM model onto GitHub Issues [C2]:
|
|
628
|
+
|
|
629
|
+
| True Platform with Jira | localdost with GitHub Issues |
|
|
630
|
+
|---|---|
|
|
631
|
+
| Pick Jira work item types to sync as requirements | `issueTypes.requirement` or `labels.requirement` |
|
|
632
|
+
| Status and resolution mapping | Issue `state` plus `closed` reason; labels for anything finer |
|
|
633
|
+
| Release-date fields | Milestone and its due date |
|
|
634
|
+
| Requirement coverage: linked and executed test cases, pass and fail, defects [C11] | Per-issue test status (4.6) and the traceability view (4.7) |
|
|
635
|
+
| "Link Defects" to existing issues, "Create Defects" as new issues | Duplicate guard comment, and `issue_create` behind the ask rule (4.5) |
|
|
636
|
+
| Test cases synced from a GitHub repo | That repo joins the dot as a `test` repo; the scan reads its specs (section 3) |
|
|
637
|
+
|
|
638
|
+
Two hand-offs keep the systems compatible. Katalon reporters upload JUnit and Playwright reports to True Platform, so a team can send localdost run results there through the `upload-report` path when it wants True Platform as the system of record. The Katalon MCP server can be attached as an MCP connection, so a dot's chat can read True Platform test cases and results next to the GitHub issues.
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
## 5. Build tasks
|
|
643
|
+
|
|
644
|
+
Sizes: S is under half a day, M is one to two days, L is three days or more. Each row is one PR that passes review and CI on its own and leaves the product working. Dependencies in brackets.
|
|
645
|
+
|
|
646
|
+
### Multiple repos (KAT-85, part 1)
|
|
647
|
+
|
|
648
|
+
| # | PR | Size | Notes |
|
|
649
|
+
|---|---|---|---|
|
|
650
|
+
| M1 | Types (`RepoRole`, `WorkspaceRepo`, `WatchRepo`, `Watch.repos`, `waitForPreviewSec`, `repo` live event) and `src/repos.ts` with `watchRepos`, `repoForEvent`, unit tests | S | No behaviour change |
|
|
651
|
+
| M2 | Move the 14 direct `watch.repo` readers to the helpers; `githubFor` picks the repo from the event; `githubForRepo` | M | [M1] Existing tests must pass unchanged; add a two-repo dot test |
|
|
652
|
+
| M3 | `repos` table, `migrateWatchRepos`, `settings.repos` mirror, `/api/repos` endpoints (scan state stays `queued`) | M | [M1] Migration test on a copy of a real `localdost.db` |
|
|
653
|
+
| M4 | `watchMatches` over repo sets, role-to-job routing for app repos, poller over the repo union, `repos` on the dots API with validation, `dotView` repos | M | [M2, M3] |
|
|
654
|
+
| M5 | UI: Setup repo list, dot dialog repo picker with roles, dot detail Repos section | L | [M4] Screenshots of both themes at 390x844 and 1280x800 |
|
|
655
|
+
|
|
656
|
+
### Repo scan and profile (KAT-85, part 2)
|
|
657
|
+
|
|
658
|
+
| # | PR | Size | Notes |
|
|
659
|
+
|---|---|---|---|
|
|
660
|
+
| R1 | Mirror and worktree manager (`src/repos/mirror.ts`): partial clone, fetch, worktree add and remove, boot sweep. Review checkout uses it behind a flag | M | [M3] |
|
|
661
|
+
| R2 | Deterministic scanner: inventory, stack, apps, routes, tests, CI, owners, mentions; `RepoProfile` types; `repo_profiles` storage; `repo_scan` job; blob cache; demo profile | L | [R1] Fixture repos: Next.js monorepo, Django, Spring Boot |
|
|
662
|
+
| R3 | Licence material for tag queries: `tags.scm` files from MIT grammar repos with headers, `NOTICE` lines | S | Before R4 merges |
|
|
663
|
+
| R4 | Symbol map: `web-tree-sitter`, tags for TS, JS, Python, Java, Go; reference graph; personalized PageRank; top 60 files | M | [R2, R3] |
|
|
664
|
+
| R5 | Area drafts, the naming model call with schema and prose checks, glossary, mock backend output | M | [R2] |
|
|
665
|
+
| R6 | Incremental refresh: triggers from push and merge, coalescing, delta parse, full-rescan rules, `PROFILE_MIN_INTERVAL_SEC` | M | [R2, M4] |
|
|
666
|
+
| R7 | Consumers: impact `via: 'profile'`, `<repo_profile>` reviewer block, `pickSpecs` by area, ticket review by area, chat tools `get_repo_profile`, `find_tests`, `pack_area` (Repomix) | M | [R5] Re-run `npm run eval:qa-review`; impact accuracy must not drop |
|
|
667
|
+
| R8 | Repo page, overrides `PATCH`, Save as review.yml through `open_pr`, chat proposal card | L | [R5, M5] Screenshots both themes |
|
|
668
|
+
| R9 | Profile evals: expected areas for the three fixture repos, area precision and recall, scan time and token budget checks in CI | M | [R5] |
|
|
669
|
+
|
|
670
|
+
### Test repos (KAT-86)
|
|
671
|
+
|
|
672
|
+
| # | PR | Size | Notes |
|
|
673
|
+
|---|---|---|---|
|
|
674
|
+
| T1 | `TestRepoConfig`, `RunSpec.testRepo`, validation, test repo fields in the dot dialog | S | [M5] |
|
|
675
|
+
| T2 | Cross-repo spec inventory and link rules (route, test id, issue key, API path, text, area), page object hop, repo-prefixed `existingTest` and `testsAtRisk` | M | [R2] |
|
|
676
|
+
| T3 | Adapter interface; move the Playwright path behind it with no behaviour change; test repo checkout at a resolved ref (PR body directive, `match_branch`, fixed, default); `passEnv` rule; fork rule | M | [R1, T1] Built (2026-10-19, `src/runner/adapters/`, `src/runner/test-repo.ts`). The adapter covers the arguments, environment, image and report reading; the live view stays in `src/runner/index.ts`. R1 was not needed: the checkout uses its own cache folder |
|
|
677
|
+
| T4 | Flow wiring: test-repo batch in `pr_check` and `post_merge`, `mergeReports` with prefixes, comment line, check summary, flaky keys, `waitForPreviewSec` | M | [T2, T3] Built (2026-10-19, `src/flows/testRepo.ts`) without T2: the tests are the whole suite, or the tests of the areas that `test.areas` maps. The fixture test repo for the demo shop is `test/fixtures/tests-repo`, used by `test/test-repo-e2e.test.ts`; the demo dot itself has no test repo yet |
|
|
678
|
+
| T5 | Test repo events: `test_pr_check`, `ci_failure` context with app merges, scans on test repo merges | M | [T4, R6] |
|
|
679
|
+
| T6 | `junit-xml.ts` parser and the Cypress adapter | M | [T3] |
|
|
680
|
+
| T7 | WebdriverIO adapter with a wrapper config | S | [T6] |
|
|
681
|
+
| T8 | pytest and JUnit (Maven, Gradle) adapters | M | [T6] |
|
|
682
|
+
| T9 | Katalon adapter: detection, Object Repository parse, `katalonc` with the licence gate, generated suite for the selection | L | [T6] Needs a Runtime Engine licence on the test machine |
|
|
683
|
+
| T10 | SANDBOX.md and GITHUB.md: test repos, install the App on every repo | S | [T4] |
|
|
684
|
+
|
|
685
|
+
### GitHub Issues as ALM (KAT-87)
|
|
686
|
+
|
|
687
|
+
| # | PR | Size | Notes |
|
|
688
|
+
|---|---|---|---|
|
|
689
|
+
| A1 | Widen the tracker unions; new `Ticket` fields; audit every `switch` on tracker kind | S | [M2] |
|
|
690
|
+
| A2 | `github-issues.ts` normalizer, webhook routing for `issues` and `issue_comment.created`, Issues permission and event in the App manifest | M | [A1] |
|
|
691
|
+
| A3 | Issue poller and `issue_state` | M | [A2] |
|
|
692
|
+
| A4 | Ticket review on issues: fetch, acceptance criteria from headings, task lists, and issue forms; sticky comment; `/localdost review`; tracker settings UI for labels, types, milestones | M | [A2] Confirm True Platform label and type conventions first (4.8) |
|
|
693
|
+
| A5 | `links` table; closing keyword parser; `closingIssuesReferences`; timeline; Jira and Linear keys through the same function | M | [A1] |
|
|
694
|
+
| A6 | `issue_create` action kind (default `ask`), defect draft, signature guard, GitHub executor | M | [A5] |
|
|
695
|
+
| A7 | Per-issue test status and the optional label write-back | S | [A5, T4] |
|
|
696
|
+
| A8 | Traceability view, CSV export, milestone readiness report | L | [A7] Screenshots both themes |
|
|
697
|
+
| A9 | `issue_create` executors for Jira and Linear | S | [A6] |
|
|
698
|
+
| A10 | TRACKERS.md GitHub Issues section; GITHUB.md permissions | S | [A4] |
|
|
699
|
+
|
|
700
|
+
### Order
|
|
701
|
+
|
|
702
|
+
1. M1, M2, M3, M4. After these, a dot can hold several app repos with no scan yet.
|
|
703
|
+
2. R1, R2, R3, R4, R5, R6, then M5 and R7. First useful release: multi-repo dots with profiles that feed impact and ticket review.
|
|
704
|
+
3. A1 to A5 can run in parallel with step 2, since they depend only on M2.
|
|
705
|
+
4. T1 to T5 with Playwright only. Second release: test repos on Playwright plus GitHub Issues review and links.
|
|
706
|
+
5. T6, T7, T8, A6, A7, A8, R8, R9.
|
|
707
|
+
6. T9 (Katalon, licence-gated), A9, and the docs tasks T10 and A10 with the features they describe.
|
|
708
|
+
|
|
709
|
+
---
|
|
710
|
+
|
|
711
|
+
## 6. Sources
|
|
712
|
+
|
|
713
|
+
Fetched 2026-10-08.
|
|
714
|
+
|
|
715
|
+
Repo understanding:
|
|
716
|
+
|
|
717
|
+
- [A1] Aider `repomap.py` and `queries/`: https://raw.githubusercontent.com/Aider-AI/aider/main/aider/repomap.py , https://github.com/Aider-AI/aider/tree/main/aider/queries ; licence via https://api.github.com/repos/Aider-AI/aider
|
|
718
|
+
- [A2] Aider repo map docs and the tree-sitter post: https://aider.chat/docs/repomap.html , https://aider.chat/2023/10/22/repomap.html
|
|
719
|
+
- [A3] Repomix: https://github.com/yamadashy/repomix , https://repomix.com/guide/code-compress
|
|
720
|
+
- [A4] Repomix MCP server: https://repomix.com/guide/mcp-server
|
|
721
|
+
- [A5] code2prompt: https://github.com/mufeedvh/code2prompt
|
|
722
|
+
- [A6] GitHub languages API and rate limits: https://docs.github.com/en/rest/repos/repos#list-repository-languages , https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api
|
|
723
|
+
- [A7] GitHub SBOM API and its closing date: https://docs.github.com/en/rest/dependency-graph/sboms
|
|
724
|
+
- [A8] OpenQodex: https://github.com/openqodex/openqodex , https://github.com/openqodex/openqodex/tree/main/packages/graph
|
|
725
|
+
- [A9] SCIP: https://github.com/sourcegraph/scip , https://github.com/sourcegraph/scip-typescript , https://github.com/sourcegraph/scip-python
|
|
726
|
+
- [A10] tree-sitter: https://github.com/tree-sitter/tree-sitter
|
|
727
|
+
- [A11] Universal Ctags: https://github.com/universal-ctags/ctags , https://docs.ctags.io/en/latest/man/ctags.1.html
|
|
728
|
+
- [A12] deepwiki-open: https://github.com/AsyncFuncAI/deepwiki-open
|
|
729
|
+
- [A13] DeepWiki MCP: https://docs.devin.ai/work-with-devin/deepwiki-mcp
|
|
730
|
+
- [A14] codebase-memory-mcp: https://github.com/DeusData/codebase-memory-mcp
|
|
731
|
+
- [A15] code-graph-rag: https://github.com/vitali87/code-graph-rag
|
|
732
|
+
- [A16] CodeGraphContext: https://github.com/CodeGraphContext/CodeGraphContext
|
|
733
|
+
- [A17] Serena: https://github.com/oraios/serena
|
|
734
|
+
- [A18] GitNexus: https://github.com/abhigyanpatwari/GitNexus
|
|
735
|
+
- [A19] AGENTS.md generators: https://pypi.org/project/agsk , https://pi.dev/packages/pi-agentsmd
|
|
736
|
+
|
|
737
|
+
Test repos:
|
|
738
|
+
|
|
739
|
+
- [B1] Playwright configuration: https://playwright.dev/docs/test-configuration
|
|
740
|
+
- [B2] Playwright CLI: https://playwright.dev/docs/test-cli
|
|
741
|
+
- [B3] Playwright reporters: https://playwright.dev/docs/test-reporters
|
|
742
|
+
- [B4] Cypress configuration: https://docs.cypress.io/app/references/configuration
|
|
743
|
+
- [B5] WebdriverIO configuration: https://webdriver.io/docs/configuration
|
|
744
|
+
- [B6] WebdriverIO JUnit reporter: https://webdriver.io/docs/junit-reporter
|
|
745
|
+
- [B7] pytest usage: https://docs.pytest.org/en/stable/how-to/usage.html
|
|
746
|
+
- [B8] pytest-base-url (MPL-2.0): https://pypi.org/project/pytest-base-url/
|
|
747
|
+
- [B9] Maven Surefire: https://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html , https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit-platform.html
|
|
748
|
+
- [B10] GitHub Actions events and checkout of a second repo: https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows , https://github.com/actions/checkout
|
|
749
|
+
- [B11] Katalon Runtime Engine command line: https://docs.katalon.com/katalon-studio/execute-tests/katalon-runtime-engine/command-line-syntax-in-katalon-runtime-engine
|
|
750
|
+
|
|
751
|
+
GitHub Issues and Katalon:
|
|
752
|
+
|
|
753
|
+
- [C1] Katalon Platform integrations: https://docs.katalon.com/katalon-studio/integrations/integrations-in-katalon-platform
|
|
754
|
+
- [C2] Katalon Platform Jira integration: https://docs.katalon.com/katalon-platform/integrations/alm-and-test-management/jira-integration
|
|
755
|
+
- [C3] GitHub issue types: https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/managing-issue-types-in-an-organization
|
|
756
|
+
- [C4] Issue types and sub-issues GA: https://github.blog/changelog/2025-04-09-evolving-github-issues-and-projects/
|
|
757
|
+
- [C5] Sub-issues: https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/adding-sub-issues
|
|
758
|
+
- [C6] Linking a pull request to an issue: https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue
|
|
759
|
+
- [C7] Timeline events API: https://docs.github.com/en/rest/issues/timeline
|
|
760
|
+
- [C8] Webhook events and payloads: https://docs.github.com/en/webhooks/webhook-events-and-payloads
|
|
761
|
+
- [C9] GraphQL `PullRequest` object: https://docs.github.com/en/graphql/reference/objects#pullrequest
|
|
762
|
+
- [C10] Katalon Platform GitHub integration: https://docs.katalon.com/katalon-platform/integrations/repository/github-integration
|
|
763
|
+
- [C11] Katalon TestOps release notes: https://docs.katalon.com/katalon-platform/release-notes/katalon-testops-release-notes
|
|
764
|
+
- Katalon MCP server: https://docs.katalon.com/katalon-platform/testops-mcp-server
|
|
765
|
+
|
|
766
|
+
To confirm before the matching task: the `web-tree-sitter` npm licence (R4), the scip-python licence (not used), the Repomix library API (R7), the WebdriverIO `--spec` and `--baseUrl` flags (T7), the Katalon project folder layout (T9), and the `closingIssuesReferences` signature (A5).
|