feat(migrations): auto-select matching destination project in the wizard #176

Merged
haydar merged 1 commit from feat/smart-destination-matching into develop 2026-10-28 21:07:35 +00:00
Member

Discovery now attaches a server-computed suggested_destination to every
item: a verified prior binding (bound migration_source_issues rows or an
earlier run's destination for the same source_ref + source_base_url)
wins outright, otherwise exactly one normalized-name match in the
organization pre-selects the existing project, several matches require
an explicit choice with per-candidate eligibility reasons, and none
proposes a new project. Archived and foreign-org projects never match;
a Jira destination stays eligible when only its docs provisioning
failed (kind-specific readiness mirrors destinationUsable).

The wizard seeds each destination from the suggestion: detected
existing projects get an explicit affordance, choose-mode lists the
candidates with ineligible reasons instead of dropping them, and
create-mode warns that a matching project exists so a distinct identity
is required. Operator overrides are tracked per item and never
reseeded; store()/destinationPlans() still validates the submitted
choice.

Normalization (NFKD fold, diacritic strip, lowercase, whitespace
collapse) is shared via normalizeForMatch — identifiers.ts twinning
App\Support\Identifiers.

Discovery now attaches a server-computed suggested_destination to every item: a verified prior binding (bound migration_source_issues rows or an earlier run's destination for the same source_ref + source_base_url) wins outright, otherwise exactly one normalized-name match in the organization pre-selects the existing project, several matches require an explicit choice with per-candidate eligibility reasons, and none proposes a new project. Archived and foreign-org projects never match; a Jira destination stays eligible when only its docs provisioning failed (kind-specific readiness mirrors destinationUsable). The wizard seeds each destination from the suggestion: detected existing projects get an explicit affordance, choose-mode lists the candidates with ineligible reasons instead of dropping them, and create-mode warns that a matching project exists so a distinct identity is required. Operator overrides are tracked per item and never reseeded; store()/destinationPlans() still validates the submitted choice. Normalization (NFKD fold, diacritic strip, lowercase, whitespace collapse) is shared via normalizeForMatch — identifiers.ts twinning App\Support\Identifiers.
feat(migrations): auto-select matching destination project in the wizard
All checks were successful
ci / commit-trailers (pull_request) Successful in 10s
ci / secret-scan (pull_request) Successful in 12s
ci / release-tests (pull_request) Successful in 1m31s
ci / portal-frontend (pull_request) Successful in 34s
ci / integrations-js (pull_request) Successful in 26s
ci / openproject-spec (pull_request) Successful in 36s
ci / portal-php (pull_request) Successful in 5m24s
ci / openproject-rspec (pull_request) Successful in 5m27s
5a73d2a418
Discovery now attaches a server-computed suggested_destination to every
item: a verified prior binding (bound migration_source_issues rows or an
earlier run's destination for the same source_ref + source_base_url)
wins outright, otherwise exactly one normalized-name match in the
organization pre-selects the existing project, several matches require
an explicit choice with per-candidate eligibility reasons, and none
proposes a new project. Archived and foreign-org projects never match;
a Jira destination stays eligible when only its docs provisioning
failed (kind-specific readiness mirrors destinationUsable).

The wizard seeds each destination from the suggestion: detected
existing projects get an explicit affordance, choose-mode lists the
candidates with ineligible reasons instead of dropping them, and
create-mode warns that a matching project exists so a distinct identity
is required. Operator overrides are tracked per item and never
reseeded; store()/destinationPlans() still validates the submitted
choice.

Normalization (NFKD fold, diacritic strip, lowercase, whitespace
collapse) is shared via normalizeForMatch — identifiers.ts twinning
App\Support\Identifiers.
haydar scheduled this pull request to auto merge when all checks succeed 2026-10-28 21:00:04 +00:00
haydar merged commit 9e5b1446e3 into develop 2026-10-28 21:07:35 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
developing4all/devworkbase!176
No description provided.