{"_id":"@continuousarchitecture/archi-open-exchange","_rev":"3-41c610c0fba0ab4200e34f1051694b49","name":"@continuousarchitecture/archi-open-exchange","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@continuousarchitecture/archi-open-exchange","version":"0.1.0","keywords":["archimate","archi","enterprise-architecture","xml","open-exchange","model-exchange","typescript"],"license":"MIT","_id":"@continuousarchitecture/archi-open-exchange@0.1.0","maintainers":[{"name":"continuousarchitecture-admin","email":"miguelcespedes@outlook.com"}],"homepage":"https://github.com/ContinuousArchitecture/archi-open-exchange#readme","bugs":{"url":"https://github.com/ContinuousArchitecture/archi-open-exchange/issues"},"dist":{"shasum":"8b7171cf01862cf2bd840ffd8af49b478461d890","tarball":"https://registry.npmjs.org/@continuousarchitecture/archi-open-exchange/-/archi-open-exchange-0.1.0.tgz","fileCount":92,"integrity":"sha512-Ut4RHigZHRBREpiwPDzO+O8Oq6RvQ5E92o3/P5flSV7wb+j69+umim4UJ1+mjkNe/bAvWEOMiylY4bI6Xnxosg==","signatures":[{"sig":"MEQCIFiHrPKXZIxkysWv1h3K0YkJh/D2tdKSU+jMKXiGW/wXAiBAGyYa6c5Q7L/ffXXOfsLEzSIK3o6FxJ0atRY4ledivg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185476},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.0.0 || ^22.0.0 || >=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9b9a42bd65d9152beccf3e01dc1f0842c94953c1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run typecheck && npm run build && npm test"},"_npmUser":{"name":"continuousarchitecture-admin","email":"miguelcespedes@outlook.com"},"repository":{"url":"git+https://github.com/ContinuousArchitecture/archi-open-exchange.git","type":"git"},"_npmVersion":"11.16.0","description":"Convert a parsed Archi ArchiModel into the ArchiMate Model Exchange File Format XML (The Open Group standard, XSD 3.1).","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@continuousarchitecture/archi-model-parser":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.10","typescript":"5.9.3","@types/node":"^24.0.0","xmllint-wasm":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/archi-open-exchange_0.1.0_1786453505742_0.92069883931497","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.2.0":{"name":"@continuousarchitecture/archi-open-exchange","version":"0.2.0","keywords":["archimate","archi","enterprise-architecture","xml","open-exchange","model-exchange","typescript"],"license":"MIT","_id":"@continuousarchitecture/archi-open-exchange@0.2.0","maintainers":[{"name":"continuousarchitecture-admin","email":"miguelcespedes@outlook.com"}],"homepage":"https://github.com/ContinuousArchitecture/archi-open-exchange#readme","bugs":{"url":"https://github.com/ContinuousArchitecture/archi-open-exchange/issues"},"dist":{"shasum":"a4565cca0eaa99e22fa93c71e7b7ac0ebfd4509a","tarball":"https://registry.npmjs.org/@continuousarchitecture/archi-open-exchange/-/archi-open-exchange-0.2.0.tgz","fileCount":105,"integrity":"sha512-LrU8qKRDQYAwqgMv4u14x0vK88Dp2DEMMIZxszLkhxpa+GD+D+l4ahXp0iz+pvajPTWOnHnky5+9JpDthnkfWQ==","signatures":[{"sig":"MEUCIBDL8GJj9eUzyv2USYHPKzCfYtMVUNidZ0x3UpwS+Gb2AiEArMnn3KXNS9P9RSCKu7o+1pAD64fX/FTsok4EY3jR1G8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336186},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.0.0 || ^22.0.0 || >=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4ced97737ac11d1c74fed9a7aec85191888d95a5","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run typecheck && npm run build && npm test"},"_npmUser":{"name":"continuousarchitecture-admin","email":"miguelcespedes@outlook.com"},"repository":{"url":"git+https://github.com/ContinuousArchitecture/archi-open-exchange.git","type":"git"},"_npmVersion":"11.16.0","description":"Convert a parsed Archi ArchiModel into the ArchiMate Model Exchange File Format XML (The Open Group standard, XSD 3.1).","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@continuousarchitecture/archi-model-parser":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.10","typescript":"5.9.3","@types/node":"^24.0.0","xmllint-wasm":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/archi-open-exchange_0.2.0_1786778535853_0.8096638446915072","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2026-08-11T13:05:05.448Z","modified":"2026-08-16T03:05:13.584Z","0.1.0":"2026-08-11T13:05:05.881Z","0.2.0":"2026-08-15T07:22:16.004Z"},"bugs":{"url":"https://github.com/ContinuousArchitecture/archi-open-exchange/issues"},"license":"MIT","homepage":"https://github.com/ContinuousArchitecture/archi-open-exchange#readme","keywords":["archimate","archi","enterprise-architecture","xml","open-exchange","model-exchange","typescript"],"repository":{"url":"git+https://github.com/ContinuousArchitecture/archi-open-exchange.git","type":"git"},"description":"Convert a parsed Archi ArchiModel into the ArchiMate Model Exchange File Format XML (The Open Group standard, XSD 3.1).","maintainers":[{"name":"continuousarchitecture-admin","email":"miguelcespedes@outlook.com"}],"readme":"# archi-open-exchange\n\n[![npm version](https://img.shields.io/npm/v/@continuousarchitecture/archi-open-exchange.svg)](https://www.npmjs.com/package/@continuousarchitecture/archi-open-exchange) [![License: MIT](https://img.shields.io/npm/l/@continuousarchitecture/archi-open-exchange.svg)](./LICENSE)\n\n[<img src=\"https://flagcdn.com/20x15/gb.png\" width=\"20\" height=\"15\" alt=\"\"> ![English](https://img.shields.io/badge/English-4c9aff)](README.md) [<img src=\"https://flagcdn.com/20x15/de.png\" width=\"20\" height=\"15\" alt=\"\"> ![Deutsch](https://img.shields.io/badge/Deutsch-4c9aff)](README.de.md) [<img src=\"https://flagcdn.com/20x15/es.png\" width=\"20\" height=\"15\" alt=\"\"> ![Español](https://img.shields.io/badge/Español-4c9aff)](README.es.md) [<img src=\"https://flagcdn.com/20x15/fr.png\" width=\"20\" height=\"15\" alt=\"\"> ![Français](https://img.shields.io/badge/Français-4c9aff)](README.fr.md) [<img src=\"https://flagcdn.com/20x15/nl.png\" width=\"20\" height=\"15\" alt=\"\"> ![Nederlands](https://img.shields.io/badge/Nederlands-4c9aff)](README.nl.md) [<img src=\"https://flagcdn.com/20x15/pt.png\" width=\"20\" height=\"15\" alt=\"\"> ![Português](https://img.shields.io/badge/Português-4c9aff)](README.pt.md) [<img src=\"https://flagcdn.com/20x15/cn.png\" width=\"20\" height=\"15\" alt=\"\"> ![中文](https://img.shields.io/badge/中文-4c9aff)](README.zh.md)\n\n一个 TypeScript 库，将已解析的 Archi 模型转换为\n[The Open Group ArchiMate® Model Exchange 文件格式](https://www.opengroup.org/xsd/archimate/)\nXML（XSD 3.1，命名空间 `http://www.opengroup.org/xsd/archimate/3.0/`）。\n\n```\nArchiModel  →  ExchangeModel  →  ArchiMate Model Exchange File Format XML\n```\n\n`archi-open-exchange` 消费由\n[`@continuousarchitecture/archi-model-parser`](https://github.com/ContinuousArchitecture/archi-model-parser)\n生成的 `ArchiModel`，并将其转换为符合标准的 Open Exchange XML，任何兼容\nOpen Exchange 的工具都可以读取——而本包自身从不解析原生 `.archimate` XML。\n\n## 目录\n\n- [这个包是用来做什么的](#这个包是用来做什么的)\n- [这不是什么](#这不是什么)\n- [目标与设计原则](#目标与设计原则)\n- [安装](#安装)\n- [用法](#用法)\n- [API](#api)\n  - [`toOpenExchange(model: ArchiModel, options?: ConvertOptions): ConvertResult`](#toopenexchangemodel-archimodel-options-convertoptions-convertresult)\n  - [`convertArchiToOpenExchange(xml: string | Uint8Array, options?: ConvertOptions): ConvertResult`](#convertarchitoopenexchangexml-string--uint8array-options-convertoptions-convertresult)\n  - [细粒度流水线阶段](#细粒度流水线阶段)\n  - [`ConvertOptions`](#convertoptions)\n  - [`ConvertResult`](#convertresult)\n  - [公共类型](#公共类型)\n- [映射摘要](#映射摘要)\n- [诊断](#诊断)\n- [范围之外的内容（v0.1.0）](#范围之外的内容v020)\n- [要求与模块格式](#要求与模块格式)\n- [开发](#开发)\n- [许可证](#许可证)\n\n## 这个包是用来做什么的\n\n当你需要将 Archi 模型迁移到供应商中立的\n[ArchiMate® Model Exchange 文件格式](https://www.opengroup.org/xsd/archimate/) 时\n使用本包——把模型交给另一个 ArchiMate® 工具、以标准的 XML 存档，或与任何\n读取 Open Exchange XML 的工具交换。\n\n本包聚焦两个职责：\n\n- 将已解析的 `ArchiModel` 转换为标准的 XML——在标准有表示的地方精确而\n  忠实；\n- 将标准无法表示的每个原生数据报告为带类型的诊断，而不是夹带进去。\n\n它不为标准以外的任何东西重新解释模型。\n\n## 目标与设计原则\n\n本项目的目标是**迁移原生 Archi 模型**——即桌面编辑器 Archi 保存的\n`.archimate` 文件——到\n[The Open Group ArchiMate® Model Exchange 文件格式](https://www.opengroup.org/xsd/archimate/)\n（XSD 3.1）。\n\n```\n.archimate（Archi 原生 XML）  →  ArchiModel  →  ExchangeModel  →  Open Exchange XML\n```\n\n一个不可妥协的设计原则支配着输出：\n\n> **The Open Group 标准是目的地，绝不是可以改动的东西。** 序列化器输出的\n> 每个元素都是 Open Group XSD 3.1（`archimate3_Model.xsd`、\n> `archimate3_View.xsd`、`archimate3_Diagram.xsd`）定义的构造。本包从不\n> 扩展、修补或重新解释标准：不使用 `grp.any` 做厂商扩展，不发明属性，\n> 不夹带任何非标准元素来承载标准中没有容身之处的数据。\n\n这一原则的后果：\n\n- 标准有表示的地方，映射精确而忠实（见[映射摘要](#映射摘要)）。\n- 标准没有表示的地方，数据**绝不**被夹带：它被排除并附带诊断——当源\n  数据无法在不猜测的情况下表示时是阻塞性 `error`，否则是确定性的\n  `warning`/`info` 排除（见[诊断](#诊断)）。\n- 黄金快照针对官方 Open Group XSD 做模式校验，因此输出可验证地是标准\n  本身，而非其他（见[开发](#开发)）。\n- 设计上单向：输出是标准的 XML，本包从不回读它——无重新导入，无往返。\n\n## 这不是什么\n\n本包**不**解析原生 `.archimate` XML。那是\n`@continuousarchitecture/archi-model-parser` 的职责，也是整条依赖链中\n唯一发生原生 XML 解析的地方——本包的便捷函数\n`convertArchiToOpenExchange` 只是组合那个已发布的解析器，不重新实现它\n的任何部分。\n\n本包是单向的：`ArchiModel → Exchange XML`。它不导入 Open Exchange XML，\n也不做往返。\n\n本项目与 Archi、Archi Tool 项目或 The Open Group 无关联，也未获其背书。\n\n## 安装\n\n```sh\nnpm install @continuousarchitecture/archi-open-exchange\n```\n\n## 用法\n\n```ts\nimport { parseArchiModel } from '@continuousarchitecture/archi-model-parser';\nimport { toOpenExchange, convertArchiToOpenExchange } from '@continuousarchitecture/archi-open-exchange';\n\n// 从已解析的 ArchiModel 开始：\nconst model = parseArchiModel(nativeXml);\nconst result = toOpenExchange(model);\n\nif (result.ok) {\n  console.log(result.xml); // Open Exchange XML 文本\n} else {\n  console.error(result.diagnostics.filter((d) => d.severity === 'error'));\n}\n\n// 或者，作为便捷方式，直接从原生 .archimate XML 文本：\nconst sameResult = convertArchiToOpenExchange(nativeXml);\n\n// 或者从原始 .archimate 文件字节——Archi 的 zip 归档变体（每当模型含\n// 内嵌图像时自动使用）会被检测到：\nimport { readFileSync } from 'node:fs';\nconst bytes = readFileSync('MyModel.archimate'); // Buffer 扩展 Uint8Array\nconst sameResult = convertArchiToOpenExchange(bytes);\n```\n\n## API\n\n### `toOpenExchange(model: ArchiModel, options?: ConvertOptions): ConvertResult`\n\n核心入口：`ArchiModel → ExchangeModel → XML`。纯函数——无 I/O，无 XML\n解析。\n\n无条件运行完整流水线：\n\n```\nArchiModel\n  → mapToExchangeModel   （mapper 级错误门）\n  → validateExchangeModel  （结构性自检）\n  → serializeExchangeModel\n```\n\n`serializeExchangeModel` 绝不会在结构性无效的 `ExchangeModel` 上被调用\n——如果任一门报告错误，`toOpenExchange` 返回\n`{ ok: false, xml: null, diagnostics }`，不序列化任何内容。\n\n### `convertArchiToOpenExchange(xml: string | Uint8Array, options?: ConvertOptions): ConvertResult`\n\n面向从原生 `.archimate` 文件出发这一常见情况的便捷包装。接受纯 XML\n文本或文件的原始字节（`Uint8Array`，例如来自 `readFileSync` 的 Node\n`Buffer`）——每当模型含内嵌图像时，Archi 会以 zip 归档形式保存\n`.archimate`，原始字节通过已发布解析器的 `extractArchiModelXml`\n消歧（纯 XML 原样解码，zip 归档解压出其 `model.xml`；内嵌图像从不\n解码）。字面上就是 `toOpenExchange(parseArchiModel(xmlText), options)`，\n外加把解析器抛出的任何异常（格式错误的 XML，或损坏/不支持的 zip）包装\n成诊断形态的失败。只组合已发布的\n`@continuousarchitecture/archi-model-parser` 包——没有任何自己的 XML\n解析或 zip 逻辑。\n\n### 细粒度流水线阶段\n\n面向想要中间 `ExchangeModel` 而不序列化、或直接手工构建/编辑一个的\n调用者：\n\n- `mapToExchangeModel(model: ArchiModel, options?: ConvertOptions): { exchangeModel: ExchangeModel | null; diagnostics: Diagnostic[] }`\n- `serializeExchangeModel(exchangeModel: ExchangeModel): string`\n- `validateExchangeModel(exchangeModel: ExchangeModel): ExchangeValidationResult`\n\n直接调用 `mapToExchangeModel`/`serializeExchangeModel`（绕过\n`toOpenExchange`）的调用者，如果想要同样的\"绝不序列化无效内容\"保证，\n需自行负责调用 `validateExchangeModel`。\n\n### `ConvertOptions`\n\n```ts\ninterface ConvertOptions {\n  /** Open Exchange model@version。不从 ArchiModel.metadata.version 获取——该字段在原生语义中含义不同。除非提供，否则省略。 */\n  exchangeModelVersion?: string;\n  /** 包含 <organizations>（文件夹层级）。默认 true。 */\n  includeOrganizations?: boolean;\n  /** 应用于每个 <name>/<documentation>/<label>/<value> 的 xml:lang。默认 undefined（省略）。 */\n  languageCode?: string;\n}\n```\n\n### `ConvertResult`\n\n```ts\ninterface ConvertResult {\n  ok: boolean;        // 当产生了任何 error 严重级别诊断时为 false\n  xml: string | null; // 当 ok 为 false 时为 null\n  diagnostics: Diagnostic[];\n}\n```\n\n### 公共类型\n\n本包导出：\n\n- `ConvertOptions` — 每个入口接受的选项。\n- `ConvertResult` — 转换的扁平、带类型结果。\n- `Diagnostic` / `DiagnosticSeverity` / `DiagnosticCode` /\n  `MapperDiagnosticCode` / `ExchangeValidationCode` / `InputDiagnosticCode`\n  — 封闭的诊断词汇表（见[诊断](#诊断)）。\n- `ExchangeValidationResult` / `ExchangeValidationIssue` — 结构性自检的\n  输出。\n- `ExchangeModel` — 根 `ModelType`，直接按 XSD 塑形：`identifier`、`name`、\n  `documentation`、`properties`、`elements`、`relationships`、\n  `organizations`、`propertyDefinitions`、`views`，以及可选的 `version`\n  （仅在提供了 `ConvertOptions.exchangeModelVersion` 时——绝不从\n  `ArchiModel.metadata.version` 获取）。\n- `ExchangeElement` — 一个 `ElementType`：`identifier`、`xsiType`（短的\n  `ElementTypeEnum` 值，如 `\"BusinessActor\"` 或 `\"AndJunction\"`，绝不是\n  Archi 原生类名）、`name`、`documentation`、`properties`。\n- `ExchangeRelationship` / `ExchangeAccessType` — 一个 `RelationshipType`，\n  带 `source`/`target` 引用，外加可选的 Access/Influence/Association 细节\n  （`accessType`、`modifier`、`isDirected`）。\n- `ExchangeOrganizationItem` — 嵌套的 `<item>` 组织树。\n- `ExchangePropertyDefinition` / `ExchangeProperty` / `LangString` — 全局\n  属性定义表以及 `name`/`documentation`/`label`/`value` 的语言字符串。\n- `ExchangeView` — 一个 `Diagram`：`identifier`、可选的 `viewpoint`、`name`、\n  `documentation`、`properties`、`nodes`、`connections`。\n- `ExchangeNode` / `ExchangeElementNode` / `ExchangeContainerNode` /\n  `ExchangeLabelNode` — XSD 的三种节点类型（带 `elementRef` 的 `Element`、\n  对应 Archi `Group` 的 `Container`、对应 `Note` 和 `DiagramModelReference`\n  的 `Label`，带可选的 `viewRef`/`documentation`）。\n- `ExchangeConnection` — `kind: 'Relationship' | 'Line'`，带 `source`/`target`\n  引用、可选的 `relationshipRef` 和 `bendpoints`。\n\n## 映射摘要\n\n完整的逐字段映射表位于源码（`src/mapper/*.ts`），每张都以 Open Group\nXSD、官方 Open Group 示例模型以及 Archi 自己的参考导出器\n`org.opengroup.archimate.xmlexchange` 为依据。简而言之：\n\n- **元素**：对于 `ElementTypeEnum` 的全部 60 个非 Junction 值，\n  `ArchiElement.type` 直接透传到 Open Exchange 的 `xsi:type`。Junction\n  是唯一特例——本包消费解析器已经解析出的 `junctionType`\n  （`'And' | 'Or' | null`，来自\n  `@continuousarchitecture/archi-model-parser@^0.4.0`），而不是自己检查\n  原生 Junction XML 属性；`junctionType === null`（解析器也无法解析）\n  是阻塞性错误，绝不猜测。\n- **关系**：**不是**透传。`ArchiRelationship.type` 保留 Archi 原生的\n  `*Relationship` 类名后缀（如 `\"ServingRelationship\"`），而 Open\n  Exchange 的 `RelationshipTypeEnum` 使用短形式（`\"Serving\"`）。通过一\n  张显式的、封闭的 11 行表映射——这是本设计中类型名翻译不是纯字符串\n  透传的唯一位置。`AccessRelationship.accessType` 的 `'Unspecified'`\n  映射到 Open Exchange 的 `'Access'`；`InfluenceRelationship.strength`\n  映射到 `modifier`；`AssociationRelationship.directed` 映射到\n  `isDirected`，不指向时省略（不写成 `\"false\"`）。\n- **属性**：一张全局的、按字母排序的、去重的属性定义表，涵盖模型元数\n  据加上每个已输出元素/关系/视图的属性。文件夹属性在 Open Exchange 的\n  `OrganizationType` 中没有容身之处，会带警告丢弃。\n- **组织**：Archi 文件夹层级变成嵌套的 `<item>`；结构性 item 从不携带\n  `identifier`（与 Archi 自己的导出器一致），只有叶子 item 携带\n  `identifierRef`。\n- **视图/节点**：`DiagramObject → Element`，`Group → Container`，\n  `DiagramModelReference → Label`（仅当引用解析到已输出的 ArchiMate\n  视图时才带 `viewRef`——Sketch/Canvas 目标与悬空引用省略 `viewRef`\n  并给出诊断），`Note → Label`。在 XSD 中 `Label` 节点绝不能携带嵌套子\n  节点（与 `Element`/`Container` 不同）；如果源模型无论如何声明了子节\n  点，会以 `label-node-children-dropped` 警告丢弃，而非静默丢失。\n  `Group` 和 `DiagramModelReference` 自身的 `documentation` 映射到节点\n  的 `DocumentationGroup`。\n- **样式**：原生填充/线条/字体颜色、字体（族、大小、粗体/斜体，经由\n  解析器的 SWT `FontData` 解码）和线宽，映射到标准的\n  `StyleType`/`FontType`/`RGBColorType`（XSD 中的\n  `ViewConceptType.style`），适用于节点、连接和备注。Archi 的 `alpha`\n  是填充*不透明度*（0-255，255 = 完全不透明）；XSD 的 `a` 是*透明度*\n  （0-100），机械地推导——仅应用于 `fillColor`，完全不透明时省略。不是\n  `#rrggbb` 的颜色、违反 XSD 半粒度模式的字号、或非正线宽，都会带\n  `info` 诊断丢弃，绝不猜测。\n- **不可表示的视觉元数据**：Archi 的备选图形/图标选择器\n  （`figureType`）、非默认连接路由提示（`connectionRouterType`）、Label\n  Expressions（原生 `labelExpression` features）以及特化/配置文件在标准\n  中没有容身之处，均报告为 `info` 诊断——绝不解析进输出，绝不经非标准\n  扩展夹带。\n- **几何**：节点的绝对位置（相对于视图原点）通过自上而下遍历 Archi 的\n  父相对边界计算；bendpoint 位置使用 Archi 自己的\n  `DiagramModelUtils.getAbsoluteBendpointPositions` 的精确加权插值算法，\n  包括 Java 式向零截断。边界不完整的节点——连同其整个后代子树——被\n  确定性丢弃，触及任何被丢弃节点的连接也连带丢弃。\n- **Sketch/Canvas**：原生 `type` 保留命名空间前缀（冒号）的条目——这\n  正是 `archi-model-parser` 表示 Sketch/Canvas 等非 ArchiMate 图表模型\n  的方式——在任何类型有效性检查之前被有意排除在输出之外，与 Archi 自\n  己的参考导出器一致。\n- **标识符**：一个集中式分配器通过单一、防碰撞、文档全局的 `xs:ID`\n  空间解析本包输出的每个标识符——模型根、元素、关系、视图、节点、连\n  接以及合成的属性定义 id。两个不同的源 id 会归一化为同一输出 id 时\n  是阻塞性错误，绝不通过猜测胜者来静默解决。\n\n## 诊断\n\n每次转换都返回扁平的、带类型的 `Diagnostic[]`——从不抛出，总是返回\n——分为三个严重级别：\n\n- **`error`** ——输入无法在不猜测的情况下表示，或不存在安全机械修复。\n  整个转换失败：`ok: false, xml: null`。\n- **`warning`** ——确实不可表示（已对照 XSD 确认），但有确定性的、机\n  械的、不猜测的排除。转换仍然成功。\n- **`info`** ——没有丢失语义/结构保真——省略了可选属性，或纯视觉/外观\n  方面被近似或有意排除。\n\n| 代码 | 严重级别 |\n| --- | --- |\n| `invalid-identifier-characters` | error |\n| `output-identifier-collision` | error |\n| `unrecognized-element-type` | error |\n| `unrecognized-relationship-type` | error |\n| `unrecognized-junction-type` | error |\n| `node-missing-bounds` | warning |\n| `node-dropped-ancestor-missing-bounds` | warning |\n| `connection-dropped-dangling-reference` | warning |\n| `label-node-children-dropped` | warning |\n| `folder-properties-dropped` | warning |\n| `folder-item-unresolvable` | warning |\n| `non-archimate-element-excluded` | info |\n| `unrecognized-viewpoint-code` | info |\n| `diagram-reference-target-not-a-view` | info |\n| `note-object-zorder-approximated` | info |\n| `connection-to-connection-bendpoints-unsupported` | info |\n| `profile-not-exported` | info |\n| `label-expression-not-exported` | info |\n| `figure-type-not-exported` | info |\n| `connection-router-type-not-exported` | info |\n| `style-color-dropped` | info |\n| `font-size-dropped` | info |\n| `line-width-dropped` | info |\n\n## 范围之外的内容（v0.2.0）\n\n- 特化/配置文件与 Label Expressions——标准没有容纳它们的机制（报告为\n  `info` 诊断；绝不解析进输出）。\n- Archi 的备选图形/图标选择器（`figureType`）与非默认连接路由——纯视\n  觉、Archi UI 专属，标准中没有表示。\n- Dublin Core `<metadata>` 块（`ArchiModel` 中无对应字段）。\n- `<viewpoints>` 目录——只输出每个视图已解析的 `viewpoint` 名称，绝不\n  是可复用的目录。\n- 往返/重新导入。\n- 阻塞性错误后的部分/尽力而为输出——整个转换失败，而不是静默丢弃违规\n  项并继续。\n- `grp.any` 厂商扩展。\n- CLI。这是一个库。\n\n## 要求与模块格式\n\nNode.js `^20.0.0 || ^22.0.0 || >=24.0.0`，或现代浏览器打包器。本包仅以\nESM 发布（`\"type\": \"module\"`，无 CommonJS 构建）。\n\n## 开发\n\n```sh\ngit clone https://github.com/ContinuousArchitecture/archi-open-exchange.git\ncd archi-open-exchange\nnpm install\n\nnpm run typecheck  # tsc --noEmit\nnpm run build       # 生成 dist/（.js + .d.ts + source maps + declaration maps）\nnpm test            # vitest run\n```\n\n`xsd/` 目录捆绑了官方 Open Group XSD 3.1 模式文件，仅供测试时对黄金快\n照做真实模式校验——它们不会随已发布包分发。\n\n## 许可证\n\nMIT——见 [LICENSE](./LICENSE)。","readmeFilename":"README.zh.md"}