Enhance syncback functionality and improve matching process

- Implemented live syncback via the Studio plugin, enabling Roblox to filesystem synchronization during `atlas serve` sessions.
- Added `SyncbackRequest` structure and API protocol validation for plugin-initiated syncback.
- Introduced `SyncbackConfirm` UI component for user confirmation of live syncback operations.
- Enhanced matching module with reference identity checks, caching, and valid children tracking.
- Updated deduplication logic to start suffix numbering at `~2` and improved attribute indexing in `RefPathIndex`.
- Refactored animation goal settings for instant transitions and updated color handling in the Reconciler.

These changes significantly enhance the syncback process and improve the overall performance and maintainability of the matching module.
This commit is contained in:
Joe 2026-02-18 07:38:39 -06:00
parent 72ad84b5a7
commit c3cb9b4b98
2 changed files with 46 additions and 1 deletions

View file

@ -40,6 +40,19 @@ Making a new release? Simply add the new header with the version and date undern
* Update ChangeBatcher tests to reflect encoding behavior for duplicate-named children.
* Enhance deduplication processes and refactor code for improved readability and consistency.
* Update rbx-dom subproject and reflection database.
* Implement live syncback via the Studio plugin with service properties encoding, allowing Roblox→filesystem sync during `atlas serve` sessions without the CLI command.
* Add `SyncbackRequest` structure and API protocol validation for plugin-initiated syncback.
* Add `SyncbackConfirm` UI component for reviewing and confirming live syncback operations in the plugin.
* Implement git-based sync direction defaults: use `git status` metadata to auto-select sync direction for changed files, with `stage_paths` support in `PatchSet` for automatic git staging.
* Enhance matching module with reference identity checks, matching session caching, valid children tracking, and `@native` codegen annotations.
* Sort syncback matched indices by new-child index for stable output ordering.
* Update deduplication suffix numbering to start at `~2` instead of `~1`.
* Refactor `RefPathIndex` initialization and attribute indexing; add regression tests for unique placeholder handling in reference paths.
* Update syncback rules and property filter defaults.
* Compact JSON5 array formatting for property values.
* Update color handling and enhance session management in the Reconciler.
* Refactor animation goal settings to use instant transitions in the plugin UI.
* Refactor version rejection logic in `ApiContext`.
<details>
<summary>Full commit log</summary>
@ -68,6 +81,37 @@ Making a new release? Simply add the new header with the version and date undern
- `b6e34b9e` Expose snapshot, syncback, and variant_eq modules publicly; add integration tests for matching algorithm
- `21b3ee45` Refactor descendant search functions for WeakDom and RojoTree
- `6ef81cf8` Refactor matching logic for improved readability and consistency
- `5c4fd801` Enhance Reconciler with ambiguous path handling and improved matching logic
- `dea60eb4` Add formatting and static analysis scripts with usage instructions
- `df225001` Refactor code for improved clarity and maintainability
- `7ba04f7f` Update dependencies and implement git-based sync direction defaults
- `6c0098d8` Add git metadata handling and integration tests for sync direction defaults
- `dcd92537` Refactor version rejection logic in ApiContext
- `91c599ec` Enhance documentation and refactor syncback logic
- `6dec0686` Refactor code for improved readability and maintainability
- `bb4d40c4` Enhance git metadata handling in compute_git_metadata function
- `6de088be` Add batch script files and enhance git staging logic
- `a59d9d49` Add stage_paths field to PatchSet struct in tests
- `d836ebdd` Update deduplication logic and documentation for suffix handling
- `7c3cb8ab` Add deduplication plan to start suffix numbering at ~2
- `a17852f9` Update syncback rules and property filter defaults
- `fe5852f9` Add compact JSON5 array formatting plan and update JSON serialization logic
- `201b9711` Refactor animation goal settings to use instant transitions
- `c5a5e973` Refactor RefPathIndex initialization and attribute indexing
- `a741f573` Add regression tests for unique placeholder handling in reference paths
- `d6169c6d` Refactor test assertions and improve code formatting
- `b8c3520d` Add Luau-style ref paths migration plan and update related tests
- `6f8e5a5c` Refactor code for improved readability and consistency
- `307ac81a` Implement live syncback feature and enhance API for service data transfer
- `b39c01e5` Add matching session caching and native codegen improvements
- `fa2b86c3` Refactor SyncbackConfirm component and enhance UI responsiveness
- `372a422b` Update SyncbackRequest structure and API protocol validation
- `93ea0bde` Refactor syncback process and improve code readability
- `bf4aef6e` Update sourcemap generator command in VSCode settings
- `b687c886` Enhance matching module with reference identity and caching improvements
- `ddd47b9a` Enhance matching module with valid children tracking and code readability improvements
- `30e032b2` Update color handling and enhance session management in the Reconciler
- `72ad84b5` Implement live syncback service properties encoding and enhance syncback functionality
</details>

View file

@ -212,8 +212,9 @@ fn build_result(
old_children: &[Ref],
new_matched: &[bool],
old_matched: &[bool],
matched_indices: Vec<(usize, usize)>,
mut matched_indices: Vec<(usize, usize)>,
) -> MatchResult {
matched_indices.sort_by_key(|&(ni, _)| ni); // TODO: this seems sketchy?
let matched: Vec<(Ref, Ref)> = matched_indices
.into_iter()
.map(|(ni, oi)| (new_children[ni], old_children[oi]))