Skip to content

feat(import): UniGetUI .ubundle importer — manifest-import capability#147

Open
Artexis10 wants to merge 2 commits into
mainfrom
feat/unigetui-import
Open

feat(import): UniGetUI .ubundle importer — manifest-import capability#147
Artexis10 wants to merge 2 commits into
mainfrom
feat/unigetui-import

Conversation

@Artexis10

Copy link
Copy Markdown
Owner

Implements OpenSpec change unigetui-import — the acquisition bridge from the 2026-07 market brief (step 3 of the outreach order: the UniGetUI interop Discussion). UniGetUI's backup covers the package list, explicitly not settings; this converts that backup into an Endstate manifest so rebuild --from lights up install + settings restore + verify on top of it.

What

  • endstate import --from unigetui --path <backup.ubundle> — pure transform (no network, no installs): winget packages map to manifest apps; --pin carries versions with per-package InstallationOptions.Version precedence over the observed version.
  • Skip transparency is first-class: chocolatey/scoop/pip/npm entries, incompatible_packages, and duplicate winget Ids come back as an explicit skip list with reasons — nothing is ever silently dropped.
  • Schema verified against upstream — parser field names/casing locked against UniGetUI's actual serialization sources (mixed snake_case bundle / PascalCase package fields; export_version as C# double; pin object omitted-when-default). Forward-compat: unknown fields ignored, future/odd export_version encodings warn instead of fail, BOM tolerated; JSON that has neither export_version nor packages is rejected as not-a-UniGetUI-bundle.
  • Output safety: emitted JSONC passes a byte-exact LoadManifest round-trip gate before an atomic temp+rename write; default output is manifests/local/ in-repo or beside the input bundle outside a checkout; deterministic output with canonical Id ordering (stable across UniGetUI re-exports).
  • Capability advert commands.import + contract-doc section (additive, no schema bump). Also adds the missing .omc/ gitignore rule (runtime artifacts).

Review

Dual-pass (ContractGuard + code review, both Opus): 0 blockers/majors, APPROVE ×2; all 8 minors + nits hardened in this diff (out-of-repo default path, tolerant version decoding, wrong-file guard, re-export-stable ordering, duplicate-Id de-dup, atomic write, gate-failure test, envelope consistency).

Tests

26 hermetic tests across internal/importer and internal/commands (parser tolerance matrix, mapper truth tables, byte-level determinism ×2 runs, skip completeness, round-trip + gate-failure lanes, capabilities advert). Full suite green; openspec:validate 81/81.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WjiYqx7LVvR2Yr883PMKYr

Artexis10 and others added 2 commits July 12, 2026 03:21
… as first source

OpenSpec change: endstate import --from unigetui --path <file> converts a
UniGetUI backup (.ubundle, export_version 3) into a JSONC manifest.
Winget-source packages map to apps; --pin writes versions (per-package
InstallationOptions.Version wins); every non-imported package is
reported with a reason. Pure transform: no network, deterministic.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WjiYqx7LVvR2Yr883PMKYr
endstate import --from unigetui --path <backup.ubundle> converts a
UniGetUI backup (export_version 3, schema verified against upstream
serialization sources) into a JSONC manifest. Winget packages map with
deterministic canonically-sorted ids; --pin carries versions with
per-package InstallationOptions precedence; every non-winget or
duplicate entry is reported in the skip list, never silently dropped.
Emitted manifest passes a byte-exact LoadManifest round-trip gate
before an atomic write; outside a repo checkout the default output
lands beside the input bundle. Wrong-shaped JSON is rejected as
not-a-UniGetUI-bundle; export_version tolerates numeric, quoted, or
unrecognized encodings (warn, never fail).

Implements openspec/changes/unigetui-import.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WjiYqx7LVvR2Yr883PMKYr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant