fix(plist): own dictionary decoding across Apple workflows

Preserve XML, OpenStep and binary dictionary keys at their format owners. Share validated binary reference facts with materialization while retaining scalar precision, UID identity and bounded expansion. Migrate archive, Interface Builder, native and app-bundle consumers, then remove obsolete key-omission accounting and schema copies.

Validated source regressions and compiled CLI/MCP workflows, including native plist fidelity and archive identity. Typecheck, lint, docs and test discovery pass. No performance benchmarks were required.
This commit is contained in:
morluto committed 2026-10-26 22:20:00 +08:00
1 parent 3b26d7f80b
commit eb06e263cb
35 files changed
+1006 -785

No files matched your search

+2 -13
View File
@@ -84,10 +84,7 @@ import {
} from "../domain/apple/plistValue.js";
import { createPlistNumberProjection } from "../domain/apple/plistNumbers.js";
import type { NativeUiObservationResult } from "../domain/native/nativeUiObservation.js";
import {
omittedPrototypeKeysLimitation,
parseXmlPropertyList,
} from "../domain/propertyListKeys.js";
import { parseXmlPropertyList } from "../domain/propertyListKeys.js";
import {
demangleSwiftSchema,
inspectPlistSchema,
@@ -808,11 +805,6 @@ class NativeMacOSClient implements AnalysisClient {
...parsed.limitations,
...entitlementValue.limitations.map((note) => `Entitlements: ${note}`),
"Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined.",
...(entitlementValue.omittedPrototypeKeys === 0
? []
: [
`Entitlements: ${omittedPrototypeKeysLimitation(entitlementValue.omittedPrototypeKeys)}`,
]),
];
const architectures = codeSignArchitectures(parsed.format, this.target);
if (architectures.length > 1)
@@ -1491,13 +1483,11 @@ const parseEntitlements = (
output: string,
): {
readonly value: JsonValue;
readonly omittedPrototypeKeys: number;
readonly limitations: readonly string[];
} => {
const start = output.indexOf("<?xml");
const end = output.lastIndexOf("</plist>");
if (start < 0 || end < start)
return { value: null, omittedPrototypeKeys: 0, limitations: [] };
if (start < 0 || end < start) return { value: null, limitations: [] };
const decoded = parseXmlPropertyList(
output.slice(start, end + "</plist>".length),
);
@@ -1506,7 +1496,6 @@ const parseEntitlements = (
const value = numbers.project(projected.value);
return {
value,
omittedPrototypeKeys: decoded.omittedPrototypeKeys,
limitations: [
...numbers.limitations(),
...(projected.nonFiniteRealCount === 0