@wascartech/devbot 0.0.0-stage → 2.1.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/LICENSE +202 -0
- package/README.md +638 -2
- package/dist/access-grant-store.js +99 -0
- package/dist/access-grant-store.js.map +1 -0
- package/dist/access-resolve.js +11 -0
- package/dist/access-resolve.js.map +1 -0
- package/dist/access-rule-store.js +99 -0
- package/dist/access-rule-store.js.map +1 -0
- package/dist/admin/access-routes.js +73 -0
- package/dist/admin/access-routes.js.map +1 -0
- package/dist/admin/access-rule-routes.js +107 -0
- package/dist/admin/access-rule-routes.js.map +1 -0
- package/dist/admin/custom-repos-routes.js +93 -0
- package/dist/admin/custom-repos-routes.js.map +1 -0
- package/dist/admin/env-routes.js +74 -0
- package/dist/admin/env-routes.js.map +1 -0
- package/dist/admin/global-settings-routes.js +254 -0
- package/dist/admin/global-settings-routes.js.map +1 -0
- package/dist/admin/mcp-cleanup.js +12 -0
- package/dist/admin/mcp-cleanup.js.map +1 -0
- package/dist/admin/mcp-routes.js +169 -0
- package/dist/admin/mcp-routes.js.map +1 -0
- package/dist/admin/query-params.js +80 -0
- package/dist/admin/query-params.js.map +1 -0
- package/dist/admin/routes.js +150 -0
- package/dist/admin/routes.js.map +1 -0
- package/dist/admin/run-history-routes.js +44 -0
- package/dist/admin/run-history-routes.js.map +1 -0
- package/dist/admin/run-routes.js +99 -0
- package/dist/admin/run-routes.js.map +1 -0
- package/dist/admin/settings-routes.js +119 -0
- package/dist/admin/settings-routes.js.map +1 -0
- package/dist/admin/stats-routes.js +51 -0
- package/dist/admin/stats-routes.js.map +1 -0
- package/dist/admin/task-routes.js +213 -0
- package/dist/admin/task-routes.js.map +1 -0
- package/dist/admin/test-routes.js +38 -0
- package/dist/admin/test-routes.js.map +1 -0
- package/dist/admin/volume-routes.js +82 -0
- package/dist/admin/volume-routes.js.map +1 -0
- package/dist/admin/webhook-routes.js +174 -0
- package/dist/admin/webhook-routes.js.map +1 -0
- package/dist/agents.js +48 -0
- package/dist/agents.js.map +1 -0
- package/dist/assignee-value.js +6 -0
- package/dist/assignee-value.js.map +1 -0
- package/dist/attachments.js +76 -0
- package/dist/attachments.js.map +1 -0
- package/dist/auto-commands.js +88 -0
- package/dist/auto-commands.js.map +1 -0
- package/dist/auto-features.js +32 -0
- package/dist/auto-features.js.map +1 -0
- package/dist/base-branch-store.js +40 -0
- package/dist/base-branch-store.js.map +1 -0
- package/dist/base-branches.js +9 -0
- package/dist/base-branches.js.map +1 -0
- package/dist/build-workflow.js +116 -0
- package/dist/build-workflow.js.map +1 -0
- package/dist/change-request-lifecycle.js +16 -0
- package/dist/change-request-lifecycle.js.map +1 -0
- package/dist/change-request-store.js +72 -0
- package/dist/change-request-store.js.map +1 -0
- package/dist/ci-failure.js +80 -0
- package/dist/ci-failure.js.map +1 -0
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/conflict-fix.js +178 -0
- package/dist/conflict-fix.js.map +1 -0
- package/dist/cookie.js +70 -0
- package/dist/cookie.js.map +1 -0
- package/dist/crypto-util.js +40 -0
- package/dist/crypto-util.js.map +1 -0
- package/dist/custom-repos-store.js +90 -0
- package/dist/custom-repos-store.js.map +1 -0
- package/dist/custom-repos-sync.js +118 -0
- package/dist/custom-repos-sync.js.map +1 -0
- package/dist/db.js +12 -0
- package/dist/db.js.map +1 -0
- package/dist/devbot-scripts.js +18 -0
- package/dist/devbot-scripts.js.map +1 -0
- package/dist/devcontainer.js +150 -0
- package/dist/devcontainer.js.map +1 -0
- package/dist/env-config-store.js +132 -0
- package/dist/env-config-store.js.map +1 -0
- package/dist/error-log-store.js +193 -0
- package/dist/error-log-store.js.map +1 -0
- package/dist/git.js +605 -0
- package/dist/git.js.map +1 -0
- package/dist/global-queue.js +127 -0
- package/dist/global-queue.js.map +1 -0
- package/dist/global-settings-store.js +307 -0
- package/dist/global-settings-store.js.map +1 -0
- package/dist/help.js +41 -0
- package/dist/help.js.map +1 -0
- package/dist/http-csp.js +15 -0
- package/dist/http-csp.js.map +1 -0
- package/dist/http-util.js +40 -0
- package/dist/http-util.js.map +1 -0
- package/dist/idempotency.js +50 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/lifecycle.js +234 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/logger.js +33 -0
- package/dist/logger.js.map +1 -0
- package/dist/lsp-servers.js +81 -0
- package/dist/lsp-servers.js.map +1 -0
- package/dist/mcp/auth.js +62 -0
- package/dist/mcp/auth.js.map +1 -0
- package/dist/mcp/effective-mcp.js +42 -0
- package/dist/mcp/effective-mcp.js.map +1 -0
- package/dist/mcp/oauth-refresh.js +138 -0
- package/dist/mcp/oauth-refresh.js.map +1 -0
- package/dist/mcp/peer-sync.js +109 -0
- package/dist/mcp/peer-sync.js.map +1 -0
- package/dist/mcp/registry.js +54 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/runner-bridge.js +93 -0
- package/dist/mcp/runner-bridge.js.map +1 -0
- package/dist/mcp/server.js +173 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/_helpers.js +88 -0
- package/dist/mcp/tools/_helpers.js.map +1 -0
- package/dist/mcp/tools/attachments.js +117 -0
- package/dist/mcp/tools/attachments.js.map +1 -0
- package/dist/mcp/tools/cicd.js +105 -0
- package/dist/mcp/tools/cicd.js.map +1 -0
- package/dist/mcp/tools/discovery.js +34 -0
- package/dist/mcp/tools/discovery.js.map +1 -0
- package/dist/mcp/tools/issues.js +56 -0
- package/dist/mcp/tools/issues.js.map +1 -0
- package/dist/mcp/tools/merge_requests.js +67 -0
- package/dist/mcp/tools/merge_requests.js.map +1 -0
- package/dist/mcp/tools/metadata.js +127 -0
- package/dist/mcp/tools/metadata.js.map +1 -0
- package/dist/mcp/tools/peer_sync.js +43 -0
- package/dist/mcp/tools/peer_sync.js.map +1 -0
- package/dist/mcp/tools/repository.js +178 -0
- package/dist/mcp/tools/repository.js.map +1 -0
- package/dist/mcp/tools/work_tracking.js +125 -0
- package/dist/mcp/tools/work_tracking.js.map +1 -0
- package/dist/mcp/tools/workitems.js +30 -0
- package/dist/mcp/tools/workitems.js.map +1 -0
- package/dist/mcp/volume-files.js +187 -0
- package/dist/mcp/volume-files.js.map +1 -0
- package/dist/mcp-auth-store.js +134 -0
- package/dist/mcp-auth-store.js.map +1 -0
- package/dist/mcp-config-store.js +83 -0
- package/dist/mcp-config-store.js.map +1 -0
- package/dist/mention.js +512 -0
- package/dist/mention.js.map +1 -0
- package/dist/migrate.js +438 -0
- package/dist/migrate.js.map +1 -0
- package/dist/mr-assignee.js +71 -0
- package/dist/mr-assignee.js.map +1 -0
- package/dist/mr-content.js +90 -0
- package/dist/mr-content.js.map +1 -0
- package/dist/oauth-routes.js +54 -0
- package/dist/oauth-routes.js.map +1 -0
- package/dist/onboarding-allowlist.js +32 -0
- package/dist/onboarding-allowlist.js.map +1 -0
- package/dist/opencode.js +291 -0
- package/dist/opencode.js.map +1 -0
- package/dist/outbound-webhook-store.js +229 -0
- package/dist/outbound-webhook-store.js.map +1 -0
- package/dist/outbound-webhook.js +314 -0
- package/dist/outbound-webhook.js.map +1 -0
- package/dist/path-sandbox.js +200 -0
- package/dist/path-sandbox.js.map +1 -0
- package/dist/platform/git-auth.js +34 -0
- package/dist/platform/git-auth.js.map +1 -0
- package/dist/platform/gitealike/attachments.js +62 -0
- package/dist/platform/gitealike/attachments.js.map +1 -0
- package/dist/platform/gitealike/base.js +935 -0
- package/dist/platform/gitealike/base.js.map +1 -0
- package/dist/platform/gitealike/forgejo.js +16 -0
- package/dist/platform/gitealike/forgejo.js.map +1 -0
- package/dist/platform/gitealike/gitea.js +16 -0
- package/dist/platform/gitealike/gitea.js.map +1 -0
- package/dist/platform/gitealike/http.js +152 -0
- package/dist/platform/gitealike/http.js.map +1 -0
- package/dist/platform/gitealike/schemas.js +284 -0
- package/dist/platform/gitealike/schemas.js.map +1 -0
- package/dist/platform/github/attachments.js +52 -0
- package/dist/platform/github/attachments.js.map +1 -0
- package/dist/platform/github/http.js +153 -0
- package/dist/platform/github/http.js.map +1 -0
- package/dist/platform/github/index.js +936 -0
- package/dist/platform/github/index.js.map +1 -0
- package/dist/platform/github/schemas.js +308 -0
- package/dist/platform/github/schemas.js.map +1 -0
- package/dist/platform/github/zip.js +85 -0
- package/dist/platform/github/zip.js.map +1 -0
- package/dist/platform/gitlab/admin.js +105 -0
- package/dist/platform/gitlab/admin.js.map +1 -0
- package/dist/platform/gitlab/api.js +229 -0
- package/dist/platform/gitlab/api.js.map +1 -0
- package/dist/platform/gitlab/attachments.js +79 -0
- package/dist/platform/gitlab/attachments.js.map +1 -0
- package/dist/platform/gitlab/http.js +165 -0
- package/dist/platform/gitlab/http.js.map +1 -0
- package/dist/platform/gitlab/index.js +630 -0
- package/dist/platform/gitlab/index.js.map +1 -0
- package/dist/platform/gitlab/oauth.js +58 -0
- package/dist/platform/gitlab/oauth.js.map +1 -0
- package/dist/platform/gitlab/read.js +182 -0
- package/dist/platform/gitlab/read.js.map +1 -0
- package/dist/platform/gitlab/schemas-read.js +274 -0
- package/dist/platform/gitlab/schemas-read.js.map +1 -0
- package/dist/platform/gitlab/schemas.js +251 -0
- package/dist/platform/gitlab/schemas.js.map +1 -0
- package/dist/platform/gitlab/signature.js +52 -0
- package/dist/platform/gitlab/signature.js.map +1 -0
- package/dist/platform/index.js +38 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/port.js +26 -0
- package/dist/platform/port.js.map +1 -0
- package/dist/platform/types.js +80 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/podman.js +119 -0
- package/dist/podman.js.map +1 -0
- package/dist/project-sync.js +69 -0
- package/dist/project-sync.js.map +1 -0
- package/dist/prompt.js +47 -0
- package/dist/prompt.js.map +1 -0
- package/dist/queue-store.js +236 -0
- package/dist/queue-store.js.map +1 -0
- package/dist/queue.js +129 -0
- package/dist/queue.js.map +1 -0
- package/dist/redact.js +23 -0
- package/dist/redact.js.map +1 -0
- package/dist/run-files.js +297 -0
- package/dist/run-files.js.map +1 -0
- package/dist/run-filters.js +54 -0
- package/dist/run-filters.js.map +1 -0
- package/dist/run-history-store.js +229 -0
- package/dist/run-history-store.js.map +1 -0
- package/dist/run-log-sink.js +270 -0
- package/dist/run-log-sink.js.map +1 -0
- package/dist/run-log.js +97 -0
- package/dist/run-log.js.map +1 -0
- package/dist/run-usage.js +29 -0
- package/dist/run-usage.js.map +1 -0
- package/dist/run-view.js +112 -0
- package/dist/run-view.js.map +1 -0
- package/dist/runner.js +1094 -0
- package/dist/runner.js.map +1 -0
- package/dist/runtime-apply.js +26 -0
- package/dist/runtime-apply.js.map +1 -0
- package/dist/runtime-settings.js +71 -0
- package/dist/runtime-settings.js.map +1 -0
- package/dist/runtime-state.js +19 -0
- package/dist/runtime-state.js.map +1 -0
- package/dist/server.js +119 -0
- package/dist/server.js.map +1 -0
- package/dist/settings-store.js +320 -0
- package/dist/settings-store.js.map +1 -0
- package/dist/status.js +121 -0
- package/dist/status.js.map +1 -0
- package/dist/stop.js +56 -0
- package/dist/stop.js.map +1 -0
- package/dist/sweeps.js +87 -0
- package/dist/sweeps.js.map +1 -0
- package/dist/task-log.js +279 -0
- package/dist/task-log.js.map +1 -0
- package/dist/task-view.js +62 -0
- package/dist/task-view.js.map +1 -0
- package/dist/token-store.js +68 -0
- package/dist/token-store.js.map +1 -0
- package/dist/types/access.js +74 -0
- package/dist/types/access.js.map +1 -0
- package/dist/types/custom-repos.js +28 -0
- package/dist/types/custom-repos.js.map +1 -0
- package/dist/types/env-config.js +25 -0
- package/dist/types/env-config.js.map +1 -0
- package/dist/types/env.js +190 -0
- package/dist/types/env.js.map +1 -0
- package/dist/types/global-settings.js +178 -0
- package/dist/types/global-settings.js.map +1 -0
- package/dist/types/lsp-servers.js +145 -0
- package/dist/types/lsp-servers.js.map +1 -0
- package/dist/types/mcp-config.js +77 -0
- package/dist/types/mcp-config.js.map +1 -0
- package/dist/types/opencode.js +59 -0
- package/dist/types/opencode.js.map +1 -0
- package/dist/types/outbound-webhook.js +56 -0
- package/dist/types/outbound-webhook.js.map +1 -0
- package/dist/types/project-settings.js +114 -0
- package/dist/types/project-settings.js.map +1 -0
- package/dist/types/provider-registry.js +37 -0
- package/dist/types/provider-registry.js.map +1 -0
- package/dist/types/runtime-settings.js +78 -0
- package/dist/types/runtime-settings.js.map +1 -0
- package/dist/usage-stats.js +159 -0
- package/dist/usage-stats.js.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/dist/volume-gc.js +193 -0
- package/dist/volume-gc.js.map +1 -0
- package/dist/volume-manage.js +191 -0
- package/dist/volume-manage.js.map +1 -0
- package/dist/volume-store.js +122 -0
- package/dist/volume-store.js.map +1 -0
- package/dist/webhook.js +1106 -0
- package/dist/webhook.js.map +1 -0
- package/dist/work-item-auto-store.js +75 -0
- package/dist/work-item-auto-store.js.map +1 -0
- package/dist/work-item-branch-store.js +37 -0
- package/dist/work-item-branch-store.js.map +1 -0
- package/migrations/0001_initial.sql +59 -0
- package/migrations/0002_queue_status.sql +15 -0
- package/migrations/0003_work_item_base_branch.sql +14 -0
- package/migrations/0004_project_settings.sql +15 -0
- package/migrations/0005_global_settings.sql +34 -0
- package/migrations/0006_model_variants.sql +8 -0
- package/migrations/0007_container_error_logs.sql +21 -0
- package/migrations/0008_project_access_grants.sql +16 -0
- package/migrations/0009_drop_imported_legacy.sql +4 -0
- package/migrations/0010_container_error_log_model.sql +6 -0
- package/migrations/0011_container_error_log_title.sql +5 -0
- package/migrations/0012_pending_task_cancel.sql +6 -0
- package/migrations/0013_builder_image.sql +6 -0
- package/migrations/0014_build_workflow.sql +7 -0
- package/migrations/0015_access_rules.sql +24 -0
- package/migrations/0016_trigger_policy.sql +17 -0
- package/migrations/0017_attachment_upload.sql +8 -0
- package/migrations/0018_work_item_branch.sql +11 -0
- package/migrations/0019_auto_push_mr.sql +18 -0
- package/migrations/0020_outbound_webhooks.sql +47 -0
- package/migrations/0021_runtime_settings.sql +12 -0
- package/migrations/0022_auto_resolve_conflicts.sql +17 -0
- package/migrations/0023_ci_fail_auto_report.sql +27 -0
- package/migrations/0024_work_item_auto_override.sql +22 -0
- package/migrations/0025_run_history.sql +37 -0
- package/migrations/0026_run_history_task_seq.sql +6 -0
- package/migrations/0027_custom_repos.sql +11 -0
- package/migrations/0028_run_usage.sql +14 -0
- package/migrations/0029_drop_ocr_langs.sql +6 -0
- package/migrations/0030_mr_assignee.sql +9 -0
- package/migrations/0031_lsp_servers.sql +14 -0
- package/opencode-config/managed/devbot-agent-policy.md +61 -0
- package/opencode-config/managed/opencode.json +77 -0
- package/opencode-config/opencode.json +211 -0
- package/opencode-config/plugins/devbot-path-guard.js +224 -0
- package/package.json +158 -4
- package/public/assets/DashboardSidebarCollapse-rIuzCmVm.js +1 -0
- package/public/assets/DashboardToolbar-DFCUqZ4Z.js +1 -0
- package/public/assets/ErrorLogModal.vue_vue_type_script_setup_true_lang-BCyNIf1E.js +1 -0
- package/public/assets/ErrorLogsPage-DyYK2Rop.js +1 -0
- package/public/assets/LogSlideover.vue_vue_type_script_setup_true_lang-33xie7TE.js +1 -0
- package/public/assets/OverviewPage-CFfa0uwg.js +1 -0
- package/public/assets/PageGrid-CBROIU87.js +1 -0
- package/public/assets/PeriodRangePicker.vue_vue_type_script_setup_true_lang-DiFUNem7.js +1 -0
- package/public/assets/ProjectDetailPage-CreyvUit.js +1 -0
- package/public/assets/ProjectsPage-CFx8-elJ.js +1 -0
- package/public/assets/RunDetailSlideover.vue_vue_type_script_setup_true_lang-DopYYmCT.js +1 -0
- package/public/assets/RunsPage-CRnnXU4P.js +1 -0
- package/public/assets/Select-Bvx32Diz.js +1 -0
- package/public/assets/SelectMenu-BjMxc4VB.js +1 -0
- package/public/assets/SettingsPage-Bb6LM3wO.js +60 -0
- package/public/assets/TimeCell.vue_vue_type_script_setup_true_lang-DW_UB0Fu.js +1 -0
- package/public/assets/UsagePage-BLMDEsv-.js +332 -0
- package/public/assets/UsagePage-DodEeAjB.css +1 -0
- package/public/assets/VolumesPage-CxcLc3L2.js +1 -0
- package/public/assets/WebhookConfigPanel.vue_vue_type_script_setup_true_lang-B2V2GF6b.js +1 -0
- package/public/assets/WorkItemCell.vue_vue_type_script_setup_true_lang-BQn6vTjd.js +1 -0
- package/public/assets/index-BMbMibyb.js +4 -0
- package/public/assets/index-C5RBBrPj.js +30 -0
- package/public/assets/index-CgX29UgC.css +1 -0
- package/public/assets/usage-format-jsb31_O8.js +1 -0
- package/public/assets/useManagedProjects-8rtjRqVJ.js +1 -0
- package/public/assets/useRouteTab-DfwrcMic.js +1 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/public/index.html +15 -0
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { db } from "./db.js";
|
|
5
|
+
import { log } from "./logger.js";
|
|
6
|
+
// Minimal versioned migration runner. No framework dependency — works with the
|
|
7
|
+
// shared sync DatabaseSync handle and matches the codebase's lean style. Each
|
|
8
|
+
// migration is a numbered .sql file in migrations/ applied in order inside a
|
|
9
|
+
// transaction; schema_migrations records the applied version. Fail-closed: a
|
|
10
|
+
// half-applied migration aborts boot so a never half-schema serves requests.
|
|
11
|
+
//
|
|
12
|
+
// Additive migrations (ALTER TABLE ... ADD COLUMN plus the IF NOT EXISTS forms)
|
|
13
|
+
// are safe to replay against a schema that is ahead of schema_migrations: an
|
|
14
|
+
// existing column with the declared shape is skipped, a missing one is added,
|
|
15
|
+
// and the version is recorded only after every declared effect is present.
|
|
16
|
+
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const MIGRATIONS_DIR = join(MODULE_DIR, "..", "migrations");
|
|
18
|
+
const IDENT = '(?:"[^"]+"|`[^`]+`|\\[[^\\]]+\\]|[A-Za-z_][A-Za-z0-9_$]*)';
|
|
19
|
+
const QUALIFIED_IDENT = `${IDENT}(?:\\s*\\.\\s*${IDENT})?`;
|
|
20
|
+
const ADD_COLUMN = new RegExp(`^ALTER\\s+TABLE\\s+(${QUALIFIED_IDENT})\\s+ADD\\s+(?:COLUMN\\s+)?(${IDENT})\\s+([\\s\\S]+)$`, "i");
|
|
21
|
+
const CREATE_TABLE = new RegExp(`^CREATE\\s+TABLE\\s+IF\\s+NOT\\s+EXISTS\\s+(${QUALIFIED_IDENT})`, "i");
|
|
22
|
+
const CREATE_INDEX = new RegExp(`^CREATE\\s+(?:UNIQUE\\s+)?INDEX\\s+IF\\s+NOT\\s+EXISTS\\s+(${QUALIFIED_IDENT})`, "i");
|
|
23
|
+
const CONSTRAINT_KEYWORDS = [
|
|
24
|
+
"PRIMARY",
|
|
25
|
+
"NOT",
|
|
26
|
+
"NULL",
|
|
27
|
+
"UNIQUE",
|
|
28
|
+
"CHECK",
|
|
29
|
+
"DEFAULT",
|
|
30
|
+
"COLLATE",
|
|
31
|
+
"REFERENCES",
|
|
32
|
+
"GENERATED",
|
|
33
|
+
"AS",
|
|
34
|
+
];
|
|
35
|
+
const NOT_COLUMN_KEYWORDS = new Set(["CONSTRAINT", "PRIMARY", "UNIQUE", "FOREIGN", "CHECK"]);
|
|
36
|
+
function loadMigrations() {
|
|
37
|
+
let names;
|
|
38
|
+
try {
|
|
39
|
+
names = readdirSync(MIGRATIONS_DIR).filter((name) => name.endsWith(".sql"));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return names
|
|
45
|
+
.map((filename) => {
|
|
46
|
+
const match = /^(\d+)_.+\.sql$/.exec(filename);
|
|
47
|
+
if (!match)
|
|
48
|
+
return null;
|
|
49
|
+
const version = Number(match[1]);
|
|
50
|
+
const sql = readFileSync(join(MIGRATIONS_DIR, filename), "utf8");
|
|
51
|
+
return { version, filename, sql };
|
|
52
|
+
})
|
|
53
|
+
.filter((migration) => migration !== null)
|
|
54
|
+
.sort((a, b) => a.version - b.version);
|
|
55
|
+
}
|
|
56
|
+
function splitStatements(sql) {
|
|
57
|
+
const statements = [];
|
|
58
|
+
let current = "";
|
|
59
|
+
let quote = null;
|
|
60
|
+
let i = 0;
|
|
61
|
+
while (i < sql.length) {
|
|
62
|
+
const ch = sql[i];
|
|
63
|
+
const next = sql[i + 1];
|
|
64
|
+
if (quote !== null) {
|
|
65
|
+
current += ch;
|
|
66
|
+
if (ch === quote) {
|
|
67
|
+
if (next === quote) {
|
|
68
|
+
current += next;
|
|
69
|
+
i += 2;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
quote = null;
|
|
73
|
+
}
|
|
74
|
+
i++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (ch === "-" && next === "-") {
|
|
78
|
+
i += 2;
|
|
79
|
+
while (i < sql.length && sql[i] !== "\n")
|
|
80
|
+
i++;
|
|
81
|
+
current += " ";
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (ch === "/" && next === "*") {
|
|
85
|
+
i += 2;
|
|
86
|
+
while (i < sql.length && !(sql[i] === "*" && sql[i + 1] === "/"))
|
|
87
|
+
i++;
|
|
88
|
+
i += 2;
|
|
89
|
+
current += " ";
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ch === "'" || ch === '"' || ch === "`") {
|
|
93
|
+
quote = ch;
|
|
94
|
+
current += ch;
|
|
95
|
+
i++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (ch === "[") {
|
|
99
|
+
quote = "]";
|
|
100
|
+
current += ch;
|
|
101
|
+
i++;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (ch === ";") {
|
|
105
|
+
const statement = current.trim();
|
|
106
|
+
if (statement)
|
|
107
|
+
statements.push(statement);
|
|
108
|
+
current = "";
|
|
109
|
+
i++;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
current += ch;
|
|
113
|
+
i++;
|
|
114
|
+
}
|
|
115
|
+
const statement = current.trim();
|
|
116
|
+
if (statement)
|
|
117
|
+
statements.push(statement);
|
|
118
|
+
return statements;
|
|
119
|
+
}
|
|
120
|
+
function lastIdentPart(raw) {
|
|
121
|
+
let quote = null;
|
|
122
|
+
let lastDot = -1;
|
|
123
|
+
for (let i = 0; i < raw.length; i++) {
|
|
124
|
+
const ch = raw[i];
|
|
125
|
+
if (quote !== null) {
|
|
126
|
+
if (ch === quote)
|
|
127
|
+
quote = null;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (ch === "'" || ch === '"' || ch === "`") {
|
|
131
|
+
quote = ch;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (ch === "[") {
|
|
135
|
+
quote = "]";
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (ch === ".")
|
|
139
|
+
lastDot = i;
|
|
140
|
+
}
|
|
141
|
+
return unquoteIdent(raw.slice(lastDot + 1));
|
|
142
|
+
}
|
|
143
|
+
function unquoteIdent(raw) {
|
|
144
|
+
const value = raw.trim();
|
|
145
|
+
if (value.length < 2)
|
|
146
|
+
return value;
|
|
147
|
+
const first = value[0];
|
|
148
|
+
const last = value[value.length - 1];
|
|
149
|
+
if ((first === '"' && last === '"') || (first === "'" && last === "'") || (first === "`" && last === "`")) {
|
|
150
|
+
return value.slice(1, -1).replaceAll(first + first, first);
|
|
151
|
+
}
|
|
152
|
+
if (first === "[" && last === "]")
|
|
153
|
+
return value.slice(1, -1).replaceAll("]]", "]");
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
function parseAdditive(sql) {
|
|
157
|
+
const statements = splitStatements(sql);
|
|
158
|
+
if (statements.length === 0)
|
|
159
|
+
return null;
|
|
160
|
+
const effects = [];
|
|
161
|
+
for (const statement of statements) {
|
|
162
|
+
const add = ADD_COLUMN.exec(statement);
|
|
163
|
+
if (add) {
|
|
164
|
+
const table = lastIdentPart(add[1]);
|
|
165
|
+
const column = lastIdentPart(add[2]);
|
|
166
|
+
const definition = add[3].trim();
|
|
167
|
+
if (!definition || NOT_COLUMN_KEYWORDS.has(column.toUpperCase()))
|
|
168
|
+
return null;
|
|
169
|
+
effects.push({ kind: "column", sql: statement, table, column, definition });
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const table = CREATE_TABLE.exec(statement);
|
|
173
|
+
if (table) {
|
|
174
|
+
effects.push({ kind: "table", sql: statement, name: lastIdentPart(table[1]) });
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const index = CREATE_INDEX.exec(statement);
|
|
178
|
+
if (index) {
|
|
179
|
+
effects.push({ kind: "index", sql: statement, name: lastIdentPart(index[1]) });
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return effects;
|
|
185
|
+
}
|
|
186
|
+
function topLevelIndex(sql, words) {
|
|
187
|
+
let quote = null;
|
|
188
|
+
let depth = 0;
|
|
189
|
+
for (let i = 0; i < sql.length; i++) {
|
|
190
|
+
const ch = sql[i];
|
|
191
|
+
if (quote !== null) {
|
|
192
|
+
if (ch === quote) {
|
|
193
|
+
if (sql[i + 1] === quote) {
|
|
194
|
+
i++;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
quote = null;
|
|
198
|
+
}
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (ch === "'" || ch === '"' || ch === "`") {
|
|
202
|
+
quote = ch;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (ch === "[") {
|
|
206
|
+
quote = "]";
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (ch === "(") {
|
|
210
|
+
depth++;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (ch === ")") {
|
|
214
|
+
depth = Math.max(0, depth - 1);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (depth !== 0 || !/[A-Za-z_]/.test(ch))
|
|
218
|
+
continue;
|
|
219
|
+
let end = i + 1;
|
|
220
|
+
while (end < sql.length && /[A-Za-z0-9_$]/.test(sql[end]))
|
|
221
|
+
end++;
|
|
222
|
+
if (words.includes(sql.slice(i, end).toUpperCase()))
|
|
223
|
+
return i;
|
|
224
|
+
i = end - 1;
|
|
225
|
+
}
|
|
226
|
+
return -1;
|
|
227
|
+
}
|
|
228
|
+
function parseDefault(definition) {
|
|
229
|
+
const at = topLevelIndex(definition, ["DEFAULT"]);
|
|
230
|
+
if (at === -1)
|
|
231
|
+
return null;
|
|
232
|
+
let i = at + "DEFAULT".length;
|
|
233
|
+
while (i < definition.length && /\s/.test(definition[i]))
|
|
234
|
+
i++;
|
|
235
|
+
if (i >= definition.length)
|
|
236
|
+
return null;
|
|
237
|
+
const start = i;
|
|
238
|
+
const first = definition[i];
|
|
239
|
+
if (first === "'" || first === '"' || first === "`") {
|
|
240
|
+
i++;
|
|
241
|
+
while (i < definition.length) {
|
|
242
|
+
if (definition[i] === first) {
|
|
243
|
+
if (definition[i + 1] === first) {
|
|
244
|
+
i += 2;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
i++;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
i++;
|
|
251
|
+
}
|
|
252
|
+
return normalizeSql(definition.slice(start, i));
|
|
253
|
+
}
|
|
254
|
+
if (first === "(") {
|
|
255
|
+
let depth = 0;
|
|
256
|
+
while (i < definition.length) {
|
|
257
|
+
const ch = definition[i];
|
|
258
|
+
if (ch === "(")
|
|
259
|
+
depth++;
|
|
260
|
+
else if (ch === ")") {
|
|
261
|
+
depth--;
|
|
262
|
+
if (depth === 0) {
|
|
263
|
+
i++;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
i++;
|
|
268
|
+
}
|
|
269
|
+
return normalizeSql(definition.slice(start, i));
|
|
270
|
+
}
|
|
271
|
+
while (i < definition.length && !/[\s,)]/.test(definition[i]))
|
|
272
|
+
i++;
|
|
273
|
+
return normalizeSql(definition.slice(start, i));
|
|
274
|
+
}
|
|
275
|
+
function normalizeSql(value) {
|
|
276
|
+
return value.trim().replace(/\s+/g, " ");
|
|
277
|
+
}
|
|
278
|
+
function parseColumnShape(definition) {
|
|
279
|
+
const typeEnd = topLevelIndex(definition, CONSTRAINT_KEYWORDS);
|
|
280
|
+
return {
|
|
281
|
+
type: normalizeSql(typeEnd === -1 ? definition : definition.slice(0, typeEnd)).toUpperCase(),
|
|
282
|
+
notNull: topLevelIndex(definition, ["NOT"]) !== -1,
|
|
283
|
+
default: parseDefault(definition),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function quoteIdent(name) {
|
|
287
|
+
return `"${name.replaceAll('"', '""')}"`;
|
|
288
|
+
}
|
|
289
|
+
function columnState(database, effect) {
|
|
290
|
+
const rows = database.prepare(`PRAGMA table_info(${quoteIdent(effect.table)})`).all();
|
|
291
|
+
const row = rows.find((candidate) => candidate.name.toLowerCase() === effect.column.toLowerCase());
|
|
292
|
+
if (!row)
|
|
293
|
+
return "missing";
|
|
294
|
+
const expected = parseColumnShape(effect.definition);
|
|
295
|
+
const compatible = normalizeSql(row.type).toUpperCase() === expected.type &&
|
|
296
|
+
(row.notnull === 1) === expected.notNull &&
|
|
297
|
+
normalizeSql(row.dflt_value ?? "") === normalizeSql(expected.default ?? "");
|
|
298
|
+
return compatible ? "compatible" : "incompatible";
|
|
299
|
+
}
|
|
300
|
+
function objectExists(database, type, name) {
|
|
301
|
+
const row = database
|
|
302
|
+
.prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = ? AND name = ? COLLATE NOCASE")
|
|
303
|
+
.get(type, name);
|
|
304
|
+
return row !== undefined;
|
|
305
|
+
}
|
|
306
|
+
function applyAdditiveMigration(database, effects) {
|
|
307
|
+
let skipped = 0;
|
|
308
|
+
let executed = 0;
|
|
309
|
+
for (const effect of effects) {
|
|
310
|
+
if (effect.kind === "column") {
|
|
311
|
+
const state = columnState(database, effect);
|
|
312
|
+
if (state === "compatible") {
|
|
313
|
+
skipped++;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (state === "incompatible") {
|
|
317
|
+
throw new Error(`column ${effect.table}.${effect.column} exists with an incompatible definition`);
|
|
318
|
+
}
|
|
319
|
+
database.exec(effect.sql);
|
|
320
|
+
executed++;
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
database.exec(effect.sql);
|
|
324
|
+
executed++;
|
|
325
|
+
}
|
|
326
|
+
for (const effect of effects) {
|
|
327
|
+
if (effect.kind === "column") {
|
|
328
|
+
const state = columnState(database, effect);
|
|
329
|
+
if (state === "missing") {
|
|
330
|
+
throw new Error(`migration did not create column ${effect.table}.${effect.column}`);
|
|
331
|
+
}
|
|
332
|
+
if (state === "incompatible") {
|
|
333
|
+
throw new Error(`column ${effect.table}.${effect.column} exists with an incompatible definition`);
|
|
334
|
+
}
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
if (!objectExists(database, effect.kind, effect.name)) {
|
|
338
|
+
throw new Error(`migration did not create ${effect.kind} ${effect.name}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return { skipped, executed };
|
|
342
|
+
}
|
|
343
|
+
function appliedVersions(database) {
|
|
344
|
+
database.exec(`
|
|
345
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
346
|
+
version INTEGER PRIMARY KEY,
|
|
347
|
+
applied_at INTEGER NOT NULL
|
|
348
|
+
)
|
|
349
|
+
`);
|
|
350
|
+
const rows = database.prepare("SELECT version FROM schema_migrations").all();
|
|
351
|
+
return new Set(rows.map((row) => row.version));
|
|
352
|
+
}
|
|
353
|
+
export function unrecordedBelowMax(applied, migrations) {
|
|
354
|
+
if (applied.size === 0)
|
|
355
|
+
return [];
|
|
356
|
+
const max = Math.max(...applied);
|
|
357
|
+
const missing = new Set();
|
|
358
|
+
for (const migration of migrations) {
|
|
359
|
+
if (migration.version < max && !applied.has(migration.version))
|
|
360
|
+
missing.add(migration.version);
|
|
361
|
+
}
|
|
362
|
+
return [...missing].sort((a, b) => a - b);
|
|
363
|
+
}
|
|
364
|
+
function migrateOne(database, migration) {
|
|
365
|
+
const started = Date.now();
|
|
366
|
+
try {
|
|
367
|
+
database.exec("BEGIN");
|
|
368
|
+
let skipped = 0;
|
|
369
|
+
let executed = 0;
|
|
370
|
+
if (migration.effects !== null) {
|
|
371
|
+
const result = applyAdditiveMigration(database, migration.effects);
|
|
372
|
+
skipped = result.skipped;
|
|
373
|
+
executed = result.executed;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
database.exec(migration.sql);
|
|
377
|
+
executed = 1;
|
|
378
|
+
}
|
|
379
|
+
database.prepare("INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)").run(migration.version, Math.floor(Date.now() / 1000));
|
|
380
|
+
database.exec("COMMIT");
|
|
381
|
+
log.info("migration applied", {
|
|
382
|
+
version: migration.version,
|
|
383
|
+
file: migration.filename,
|
|
384
|
+
ms: Date.now() - started,
|
|
385
|
+
skippedColumns: skipped,
|
|
386
|
+
executedStatements: executed,
|
|
387
|
+
adopted: skipped > 0 && executed === 0,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
catch (e) {
|
|
391
|
+
try {
|
|
392
|
+
database.exec("ROLLBACK");
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
// BEGIN may have failed before a transaction was active.
|
|
396
|
+
}
|
|
397
|
+
log.error("migration failed, aborting boot", {
|
|
398
|
+
version: migration.version,
|
|
399
|
+
file: migration.filename,
|
|
400
|
+
err: e instanceof Error ? e.message : String(e),
|
|
401
|
+
});
|
|
402
|
+
throw new Error(`migration ${migration.version} (${migration.filename}) failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
export function runMigrations(database, migrations = loadMigrations()) {
|
|
406
|
+
const applied = appliedVersions(database);
|
|
407
|
+
const last = applied.size === 0 ? 0 : Math.max(...applied);
|
|
408
|
+
const pending = migrations
|
|
409
|
+
.filter((migration) => !applied.has(migration.version))
|
|
410
|
+
.sort((a, b) => a.version - b.version)
|
|
411
|
+
.map((migration) => ({ ...migration, effects: parseAdditive(migration.sql) }));
|
|
412
|
+
if (pending.length === 0) {
|
|
413
|
+
log.debug("migrations up to date", { applied: last });
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const missing = unrecordedBelowMax(applied, migrations);
|
|
417
|
+
if (missing.length > 0) {
|
|
418
|
+
const filenames = new Map(migrations.map((migration) => [migration.version, migration.filename]));
|
|
419
|
+
log.warn("schema_migrations has unrecorded versions below the applied max", {
|
|
420
|
+
max: last,
|
|
421
|
+
missing: missing.map((version) => ({ version, filename: filenames.get(version) })),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
const pendingLast = pending[pending.length - 1].version;
|
|
425
|
+
log.info("applying migrations", { from: last, to: pendingLast, count: pending.length });
|
|
426
|
+
for (const migration of pending)
|
|
427
|
+
migrateOne(database, migration);
|
|
428
|
+
}
|
|
429
|
+
export function migrate() {
|
|
430
|
+
runMigrations(db);
|
|
431
|
+
}
|
|
432
|
+
export function migrationStatus() {
|
|
433
|
+
const all = loadMigrations();
|
|
434
|
+
const applied = appliedVersions(db);
|
|
435
|
+
const appliedCount = all.filter((migration) => applied.has(migration.version)).length;
|
|
436
|
+
return { appliedCount, pendingCount: all.length - appliedCount };
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { getGlobalSettings } from "./global-settings-store.js";
|
|
2
|
+
import { log } from "./logger.js";
|
|
3
|
+
import { getPlatform } from "./platform/index.js";
|
|
4
|
+
import { getProjectSettings } from "./settings-store.js";
|
|
5
|
+
function skipped(projectId, username, reason) {
|
|
6
|
+
log.warn("mr assignee skipped", { projectId, username, reason });
|
|
7
|
+
return {
|
|
8
|
+
warning: reason === "not-a-member"
|
|
9
|
+
? `⚠️ Assignee not set: @${username} is not a member of this project.`
|
|
10
|
+
: reason === "unresolved"
|
|
11
|
+
? `⚠️ Assignee not set: @${username} could not be resolved on this forge.`
|
|
12
|
+
: `⚠️ Assignee not set: could not verify @${username} on this forge.`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// Resolution order: project "none" (deliberate, no warning) -> project username
|
|
16
|
+
// -> global username -> nobody. The membership gate runs before creation.
|
|
17
|
+
export async function resolveMrAssignee(projectId) {
|
|
18
|
+
let username;
|
|
19
|
+
try {
|
|
20
|
+
const projectValue = getProjectSettings(projectId)?.assignee ?? "";
|
|
21
|
+
if (projectValue === "none")
|
|
22
|
+
return {};
|
|
23
|
+
username = projectValue || getGlobalSettings().assignee;
|
|
24
|
+
if (!username)
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
log.warn("mr assignee settings unreadable", { projectId, err: e });
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const user = await getPlatform().workItems.resolveUser(username);
|
|
33
|
+
if (!user)
|
|
34
|
+
return skipped(projectId, username, "unresolved");
|
|
35
|
+
const permission = await getPlatform().workItems.getMemberPermission(projectId, {
|
|
36
|
+
id: user.id,
|
|
37
|
+
username: user.username,
|
|
38
|
+
});
|
|
39
|
+
if (permission === "none")
|
|
40
|
+
return skipped(projectId, username, "not-a-member");
|
|
41
|
+
return { assignee: { id: user.id, username: user.username } };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return skipped(projectId, username, "forge-error");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Create the MR with the resolved assignee. Creation errors propagate to the
|
|
48
|
+
// runner's existing MR-failure handling: the pre-flight resolution/membership
|
|
49
|
+
// gate is the only assignee-related best-effort layer.
|
|
50
|
+
export async function createChangeRequestWithAssignee(projectId, input) {
|
|
51
|
+
const resolved = await resolveMrAssignee(projectId);
|
|
52
|
+
const mr = await getPlatform().changeRequests.create(projectId, resolved.assignee ? { ...input, assignee: resolved.assignee } : input);
|
|
53
|
+
return {
|
|
54
|
+
mr,
|
|
55
|
+
note: `✅ Merge request created: ${mr.webUrl}${resolved.warning ? `\n\n${resolved.warning}` : ""}`,
|
|
56
|
+
...(resolved.warning ? { warning: resolved.warning } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Settings-route trust boundary: a non-empty username must exist on the forge.
|
|
60
|
+
// Membership is deliberately not checked here (C2) — it can change later.
|
|
61
|
+
export async function validateAssigneeUsername(username) {
|
|
62
|
+
if (!username)
|
|
63
|
+
return "ok";
|
|
64
|
+
try {
|
|
65
|
+
return (await getPlatform().workItems.resolveUser(username)) ? "ok" : "unknown";
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return "error";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mr-assignee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mr-assignee.js","sourceRoot":"","sources":["../src/mr-assignee.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Pure parser for the agent-authored MR/PR content block. The build-mode agent
|
|
2
|
+
// ends its reply with a fenced ```mr block carrying `title:` and `description:`
|
|
3
|
+
// lines; devbot extracts it, strips it from the note text, and feeds it to
|
|
4
|
+
// createMergeRequest / updateMergeRequest. Falls back to the historical
|
|
5
|
+
// defaults (`Resolves #<number>` / `Generated by devbot.`) when the block is
|
|
6
|
+
// absent or malformed — a malformed block never blocks the MR/PR.
|
|
7
|
+
//
|
|
8
|
+
// Format (documented in the build-mode prompt suffix in runner.ts):
|
|
9
|
+
// ```mr
|
|
10
|
+
// title: <single-line Conventional Commit summary, end with (#<number>)>
|
|
11
|
+
// description:
|
|
12
|
+
// <Markdown body — structured as ## Summary / ## Changes / ## Rationale
|
|
13
|
+
// sections, ending with `Resolves #<number>`; transported to the forge verbatim>
|
|
14
|
+
// ```
|
|
15
|
+
//
|
|
16
|
+
// The block must be the LAST fenced ```mr block in the reply. All such blocks
|
|
17
|
+
// are stripped from the note text posted to the work item (the metadata block
|
|
18
|
+
// is internal transport, not user-facing prose).
|
|
19
|
+
const DEFAULT_TITLE = (workItemNumber) => `Resolves #${workItemNumber}`;
|
|
20
|
+
const DEFAULT_DESCRIPTION = "Generated by devbot.";
|
|
21
|
+
const TITLE_MAX = 255;
|
|
22
|
+
const DESCRIPTION_MAX = 8000;
|
|
23
|
+
const MR_BLOCK = /```mr\s*\n([\s\S]*?)```/g;
|
|
24
|
+
// Strip any trailing (#<digits>) suffix from the title and append the correct
|
|
25
|
+
// work-item number anchor. Idempotent: a title already ending in (#<number>)
|
|
26
|
+
// is returned unchanged; a title with a wrong/old number is normalized to the
|
|
27
|
+
// correct one; re-runs don't grow the title. Slice to 255 AFTER the suffix
|
|
28
|
+
// is added so the anchor is never truncated away.
|
|
29
|
+
function normalizeTitle(raw, workItemNumber) {
|
|
30
|
+
// Strip ALL trailing (#<digits>) suffixes (handles double/multiple from
|
|
31
|
+
// re-runs), then append the correct one. Idempotent: a title already
|
|
32
|
+
// ending in (#<number>) is returned unchanged after strip+re-add.
|
|
33
|
+
const stripped = raw.trim().replace(/(?:\s*\(#\d+\))+\s*$/, "");
|
|
34
|
+
// Slice the body to leave room for the suffix, so the anchor is never
|
|
35
|
+
// truncated away. Then append.
|
|
36
|
+
const suffix = ` (#${workItemNumber})`;
|
|
37
|
+
const maxBody = TITLE_MAX - suffix.length;
|
|
38
|
+
return `${stripped.slice(0, maxBody)}${suffix}`;
|
|
39
|
+
}
|
|
40
|
+
export function parseMrContent(reply, workItemNumber) {
|
|
41
|
+
const matches = [...reply.matchAll(MR_BLOCK)];
|
|
42
|
+
const replyStripped = matches.reduce((acc, m) => acc.replace(m[0], "").trim(), reply);
|
|
43
|
+
const defaults = {
|
|
44
|
+
title: DEFAULT_TITLE(workItemNumber),
|
|
45
|
+
description: DEFAULT_DESCRIPTION,
|
|
46
|
+
};
|
|
47
|
+
if (matches.length === 0)
|
|
48
|
+
return { reply, mr: defaults };
|
|
49
|
+
const last = matches[matches.length - 1];
|
|
50
|
+
const body = (last[1] ?? "").trim();
|
|
51
|
+
if (!body)
|
|
52
|
+
return { reply: replyStripped, mr: defaults };
|
|
53
|
+
let title = "";
|
|
54
|
+
let description = "";
|
|
55
|
+
let sawTitle = false;
|
|
56
|
+
let sawDescription = false;
|
|
57
|
+
const descLines = [];
|
|
58
|
+
for (const line of body.split("\n")) {
|
|
59
|
+
if (!sawDescription) {
|
|
60
|
+
const tMatch = line.match(/^title:\s*(.*)$/);
|
|
61
|
+
if (tMatch) {
|
|
62
|
+
title = (tMatch[1] ?? "").trim();
|
|
63
|
+
sawTitle = true;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const dMatch = line.match(/^description:\s*(.*)$/);
|
|
67
|
+
if (dMatch) {
|
|
68
|
+
description = (dMatch[1] ?? "").trim();
|
|
69
|
+
sawDescription = true;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
descLines.push(line);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (sawDescription && descLines.length > 0) {
|
|
78
|
+
const joined = description ? `${description}\n${descLines.join("\n")}` : descLines.join("\n");
|
|
79
|
+
description = joined.trim();
|
|
80
|
+
}
|
|
81
|
+
const mr = {
|
|
82
|
+
title: sawTitle && title ? normalizeTitle(title, workItemNumber) : defaults.title,
|
|
83
|
+
description: sawDescription ? (description || defaults.description) : defaults.description,
|
|
84
|
+
};
|
|
85
|
+
if (mr.description.length > DESCRIPTION_MAX) {
|
|
86
|
+
mr.description = mr.description.slice(0, DESCRIPTION_MAX);
|
|
87
|
+
}
|
|
88
|
+
return { reply: replyStripped, mr };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=mr-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mr-content.js","sourceRoot":"","sources":["../src/mr-content.ts"],"names":[],"mappings":"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"}
|