@agent-teams/engineering-foundation 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +11 -2
  2. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts +6 -0
  3. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.d.ts.map +1 -0
  4. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js +143 -0
  5. package/dist/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.js.map +1 -0
  6. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.d.ts +5 -0
  7. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.d.ts.map +1 -0
  8. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.js +7 -0
  9. package/dist/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.js.map +1 -0
  10. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.d.ts +9 -0
  11. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.d.ts.map +1 -0
  12. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js +205 -0
  13. package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js.map +1 -0
  14. package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts +46 -0
  15. package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts.map +1 -0
  16. package/dist/capabilities/public-api-compatibility/application/model/public-api.js +4 -0
  17. package/dist/capabilities/public-api-compatibility/application/model/public-api.js.map +1 -0
  18. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.d.ts +13 -0
  19. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.d.ts.map +1 -0
  20. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js +168 -0
  21. package/dist/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.js.map +1 -0
  22. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.d.ts +4 -0
  23. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.d.ts.map +1 -0
  24. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.js +2 -0
  25. package/dist/capabilities/public-api-compatibility/application/ports/change-fingerprint.js.map +1 -0
  26. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.d.ts +5 -0
  27. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.d.ts.map +1 -0
  28. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.js +2 -0
  29. package/dist/capabilities/public-api-compatibility/application/ports/public-api-extractor.js.map +1 -0
  30. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.d.ts +8 -0
  31. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.d.ts.map +1 -0
  32. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.js +2 -0
  33. package/dist/capabilities/public-api-compatibility/application/ports/public-api-repository.js.map +1 -0
  34. package/dist/capabilities/public-api-compatibility/application/rules.d.ts +19 -0
  35. package/dist/capabilities/public-api-compatibility/application/rules.d.ts.map +1 -0
  36. package/dist/capabilities/public-api-compatibility/application/rules.js +20 -0
  37. package/dist/capabilities/public-api-compatibility/application/rules.js.map +1 -0
  38. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.d.ts +15 -0
  39. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.d.ts.map +1 -0
  40. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js +30 -0
  41. package/dist/capabilities/public-api-compatibility/application/use-cases/analyze-public-api-compatibility.js.map +1 -0
  42. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts +14 -0
  43. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts.map +1 -0
  44. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js +62 -0
  45. package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js.map +1 -0
  46. package/dist/capabilities/public-api-compatibility/contract/config.d.ts +5 -0
  47. package/dist/capabilities/public-api-compatibility/contract/config.d.ts.map +1 -0
  48. package/dist/capabilities/public-api-compatibility/contract/config.js +104 -0
  49. package/dist/capabilities/public-api-compatibility/contract/config.js.map +1 -0
  50. package/dist/capabilities/public-api-compatibility/module.d.ts +10 -0
  51. package/dist/capabilities/public-api-compatibility/module.d.ts.map +1 -0
  52. package/dist/capabilities/public-api-compatibility/module.js +69 -0
  53. package/dist/capabilities/public-api-compatibility/module.js.map +1 -0
  54. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.d.ts +6 -0
  55. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.d.ts.map +1 -0
  56. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.js +200 -0
  57. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/filesystem-repository-security-reader.js.map +1 -0
  58. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts +46 -0
  59. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts.map +1 -0
  60. package/dist/capabilities/repository-security-baseline/application/model/repository-security.js +2 -0
  61. package/dist/capabilities/repository-security-baseline/application/model/repository-security.js.map +1 -0
  62. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts +4 -0
  63. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.d.ts.map +1 -0
  64. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js +218 -0
  65. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js.map +1 -0
  66. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.d.ts +5 -0
  67. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.d.ts.map +1 -0
  68. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.js +2 -0
  69. package/dist/capabilities/repository-security-baseline/application/ports/repository-security-reader.js.map +1 -0
  70. package/dist/capabilities/repository-security-baseline/application/rules.d.ts +23 -0
  71. package/dist/capabilities/repository-security-baseline/application/rules.d.ts.map +1 -0
  72. package/dist/capabilities/repository-security-baseline/application/rules.js +24 -0
  73. package/dist/capabilities/repository-security-baseline/application/rules.js.map +1 -0
  74. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.d.ts +9 -0
  75. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.d.ts.map +1 -0
  76. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.js +7 -0
  77. package/dist/capabilities/repository-security-baseline/application/use-cases/analyze-repository-security.js.map +1 -0
  78. package/dist/capabilities/repository-security-baseline/contract/config.d.ts +5 -0
  79. package/dist/capabilities/repository-security-baseline/contract/config.d.ts.map +1 -0
  80. package/dist/capabilities/repository-security-baseline/contract/config.js +86 -0
  81. package/dist/capabilities/repository-security-baseline/contract/config.js.map +1 -0
  82. package/dist/capabilities/repository-security-baseline/module.d.ts +5 -0
  83. package/dist/capabilities/repository-security-baseline/module.d.ts.map +1 -0
  84. package/dist/capabilities/repository-security-baseline/module.js +49 -0
  85. package/dist/capabilities/repository-security-baseline/module.js.map +1 -0
  86. package/dist/capabilities/source-dependencies/adapters/outbound/oxc/oxc-source-dependency-parser.d.ts +2 -1
  87. package/dist/capabilities/source-dependencies/adapters/outbound/oxc/oxc-source-dependency-parser.d.ts.map +1 -1
  88. package/dist/capabilities/source-dependencies/application/model/source-workspace.d.ts +1 -4
  89. package/dist/capabilities/source-dependencies/application/model/source-workspace.d.ts.map +1 -1
  90. package/dist/capabilities/source-dependencies/application/model/source-workspace.js.map +1 -1
  91. package/dist/capabilities/source-dependencies/application/policies/evaluate-source-dependencies.d.ts +2 -1
  92. package/dist/capabilities/source-dependencies/application/policies/evaluate-source-dependencies.d.ts.map +1 -1
  93. package/dist/capabilities/source-dependencies/application/ports/source-dependency-parser.d.ts +2 -1
  94. package/dist/capabilities/source-dependencies/application/ports/source-dependency-parser.d.ts.map +1 -1
  95. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.d.ts +1 -1
  96. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.d.ts.map +1 -1
  97. package/dist/capabilities/source-dependencies/application/use-cases/analyze-source-dependencies.js.map +1 -1
  98. package/dist/capabilities/source-dependencies/module.js +1 -1
  99. package/dist/capabilities/source-dependencies/module.js.map +1 -1
  100. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.d.ts +7 -0
  101. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.d.ts.map +1 -0
  102. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.js +115 -0
  103. package/dist/capabilities/suppression-governance/adapters/outbound/oxc/oxc-suppression-scanner.js.map +1 -0
  104. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.d.ts +5 -0
  105. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.d.ts.map +1 -0
  106. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.js +6 -0
  107. package/dist/capabilities/suppression-governance/adapters/outbound/time/system-clock.js.map +1 -0
  108. package/dist/capabilities/suppression-governance/application/model/iso-date.d.ts +2 -0
  109. package/dist/capabilities/suppression-governance/application/model/iso-date.d.ts.map +1 -0
  110. package/dist/capabilities/suppression-governance/application/model/iso-date.js +27 -0
  111. package/dist/capabilities/suppression-governance/application/model/iso-date.js.map +1 -0
  112. package/dist/capabilities/suppression-governance/application/model/suppression-governance.d.ts +35 -0
  113. package/dist/capabilities/suppression-governance/application/model/suppression-governance.d.ts.map +1 -0
  114. package/dist/capabilities/suppression-governance/application/model/suppression-governance.js +8 -0
  115. package/dist/capabilities/suppression-governance/application/model/suppression-governance.js.map +1 -0
  116. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.d.ts +8 -0
  117. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.d.ts.map +1 -0
  118. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.js +196 -0
  119. package/dist/capabilities/suppression-governance/application/policies/evaluate-suppression-governance.js.map +1 -0
  120. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.d.ts +4 -0
  121. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.d.ts.map +1 -0
  122. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.js +2 -0
  123. package/dist/capabilities/suppression-governance/application/ports/calendar-clock.js.map +1 -0
  124. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.d.ts +6 -0
  125. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.d.ts.map +1 -0
  126. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.js +2 -0
  127. package/dist/capabilities/suppression-governance/application/ports/suppression-scanner.js.map +1 -0
  128. package/dist/capabilities/suppression-governance/application/rules.d.ts +25 -0
  129. package/dist/capabilities/suppression-governance/application/rules.d.ts.map +1 -0
  130. package/dist/capabilities/suppression-governance/application/rules.js +26 -0
  131. package/dist/capabilities/suppression-governance/application/rules.js.map +1 -0
  132. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.d.ts +15 -0
  133. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.d.ts.map +1 -0
  134. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.js +15 -0
  135. package/dist/capabilities/suppression-governance/application/use-cases/analyze-suppression-governance.js.map +1 -0
  136. package/dist/capabilities/suppression-governance/contract/config.d.ts +5 -0
  137. package/dist/capabilities/suppression-governance/contract/config.d.ts.map +1 -0
  138. package/dist/capabilities/suppression-governance/contract/config.js +108 -0
  139. package/dist/capabilities/suppression-governance/contract/config.js.map +1 -0
  140. package/dist/capabilities/suppression-governance/module.d.ts +5 -0
  141. package/dist/capabilities/suppression-governance/module.d.ts.map +1 -0
  142. package/dist/capabilities/suppression-governance/module.js +57 -0
  143. package/dist/capabilities/suppression-governance/module.js.map +1 -0
  144. package/dist/cli.js +25 -2
  145. package/dist/cli.js.map +1 -1
  146. package/dist/composition/capability-registry.d.ts.map +1 -1
  147. package/dist/composition/capability-registry.js +6 -0
  148. package/dist/composition/capability-registry.js.map +1 -1
  149. package/dist/composition/rule-registry.d.ts.map +1 -1
  150. package/dist/composition/rule-registry.js +6 -0
  151. package/dist/composition/rule-registry.js.map +1 -1
  152. package/dist/foundation-config.d.ts +1 -1
  153. package/dist/foundation-config.d.ts.map +1 -1
  154. package/dist/foundation-config.js +6 -0
  155. package/dist/foundation-config.js.map +1 -1
  156. package/dist/package-self-check.d.ts +2 -3
  157. package/dist/package-self-check.d.ts.map +1 -1
  158. package/dist/package-self-check.js +2 -4
  159. package/dist/package-self-check.js.map +1 -1
  160. package/dist/schema-catalog.d.ts +1 -3
  161. package/dist/schema-catalog.d.ts.map +1 -1
  162. package/dist/schema-catalog.js +1 -6
  163. package/dist/schema-catalog.js.map +1 -1
  164. package/dist/schema-ids.d.ts +3 -0
  165. package/dist/schema-ids.d.ts.map +1 -0
  166. package/dist/schema-ids.js +11 -0
  167. package/dist/schema-ids.js.map +1 -0
  168. package/dist/semantic-version.d.ts +2 -0
  169. package/dist/semantic-version.d.ts.map +1 -1
  170. package/dist/semantic-version.js +72 -1
  171. package/dist/semantic-version.js.map +1 -1
  172. package/dist/{capabilities/source-dependencies → source-inventory}/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts +1 -1
  173. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +1 -0
  174. package/dist/{capabilities/source-dependencies → source-inventory}/adapters/outbound/filesystem/filesystem-source-tree-reader.js +3 -3
  175. package/dist/source-inventory/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +1 -0
  176. package/dist/source-inventory/application/model/source-file-snapshot.d.ts +5 -0
  177. package/dist/source-inventory/application/model/source-file-snapshot.d.ts.map +1 -0
  178. package/dist/source-inventory/application/model/source-file-snapshot.js +2 -0
  179. package/dist/source-inventory/application/model/source-file-snapshot.js.map +1 -0
  180. package/dist/{capabilities/source-dependencies → source-inventory}/application/ports/source-tree-reader.d.ts +1 -1
  181. package/dist/source-inventory/application/ports/source-tree-reader.d.ts.map +1 -0
  182. package/dist/source-inventory/application/ports/source-tree-reader.js.map +1 -0
  183. package/dist/strict-yaml.d.ts +1 -0
  184. package/dist/strict-yaml.d.ts.map +1 -1
  185. package/dist/strict-yaml.js +2 -2
  186. package/dist/strict-yaml.js.map +1 -1
  187. package/package.json +3 -1
  188. package/schemas/foundation-config/v1.schema.json +30 -0
  189. package/schemas/package-public-api-baseline/v1.schema.json +39 -0
  190. package/schemas/package-public-api-compatibility/v1.schema.json +70 -0
  191. package/schemas/quality-suppression-governance/v1.schema.json +109 -0
  192. package/schemas/repository-security-baseline/v1.schema.json +57 -0
  193. package/dist/capabilities/source-dependencies/adapters/outbound/filesystem/filesystem-source-tree-reader.d.ts.map +0 -1
  194. package/dist/capabilities/source-dependencies/adapters/outbound/filesystem/filesystem-source-tree-reader.js.map +0 -1
  195. package/dist/capabilities/source-dependencies/application/ports/source-tree-reader.d.ts.map +0 -1
  196. package/dist/capabilities/source-dependencies/application/ports/source-tree-reader.js.map +0 -1
  197. /package/dist/{capabilities/source-dependencies → source-inventory}/application/ports/source-tree-reader.js +0 -0
package/README.md CHANGED
@@ -23,12 +23,16 @@ schemaVersion: 1
23
23
  project:
24
24
  id: consumer-repository
25
25
  capabilities:
26
- architecture.source-dependencies:
27
- configPath: architecture/foundation/source-dependencies.yaml
28
26
  workspace.dependency-declarations:
29
27
  configPath: architecture/foundation/dependency-declarations.yaml
30
28
  ```
31
29
 
30
+ Capability presence means enabled. Add source dependencies, suppression
31
+ governance, public API compatibility, or the publishing-repository security
32
+ profile only in separate reviewed adoption changes with consumer-owned policy
33
+ and qualification evidence. Installing or upgrading this package never enables
34
+ them automatically.
35
+
32
36
  The root file is `foundation.config.yaml`. Use
33
37
  `agent-teams-foundation schema foundation-config/v1` for its canonical schema
34
38
  and `agent-teams-foundation explain <rule-id>` for rule guidance.
@@ -39,3 +43,8 @@ configuration extends the fast
39
43
  `./node_modules/@agent-teams/engineering-foundation/presets/oxlint/node.json`
40
44
  or type-aware `type-aware.json` preset. TypeScript remains the separate typecheck
41
45
  authority.
46
+
47
+ `agent-teams-foundation public-api-promote-release` is reserved for the
48
+ Changesets version workflow. Normal feature checks never update released API
49
+ baselines. Publishing consumers must also enforce release-owned baseline
50
+ mutation in required pull-request CI.
@@ -0,0 +1,6 @@
1
+ import type { PublicApiPackagePolicy, PublicApiSnapshot } from "../../../application/model/public-api.js";
2
+ import type { PublicApiExtractor } from "../../../application/ports/public-api-extractor.js";
3
+ export declare class MicrosoftPublicApiExtractor implements PublicApiExtractor {
4
+ extract(consumerRoot: string, policy: PublicApiPackagePolicy, packageVersion: string, signal?: AbortSignal): Promise<PublicApiSnapshot>;
5
+ }
6
+ //# sourceMappingURL=microsoft-public-api-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft-public-api-extractor.d.ts","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAsE7F,qBAAa,2BAA4B,YAAW,kBAAkB;IAC9D,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,sBAAsB,EAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAkH5B;CACF"}
@@ -0,0 +1,143 @@
1
+ import { mkdtemp, readFile, realpath, rm, stat } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import { Extractor, ExtractorConfig, ExtractorLogLevel } from "@microsoft/api-extractor";
5
+ import { ApiDeclaredItem, ApiModel } from "@microsoft/api-extractor-model";
6
+ import { CapabilityInputError } from "../../../../../capability-runtime.js";
7
+ import { pathTraversesSymbolicLink } from "../../../../../filesystem-path-safety.js";
8
+ import { assertNotCancelled } from "../../../../../strict-yaml.js";
9
+ import { compareCanonicalReferences } from "../../../application/model/public-api.js";
10
+ function inputError(code, message, phase) {
11
+ throw new CapabilityInputError({ code, message, phase, retryable: false });
12
+ }
13
+ function contained(parent, candidate) {
14
+ const relation = relative(parent, candidate);
15
+ return (relation === "" ||
16
+ (!isAbsolute(relation) && relation !== ".." && !relation.startsWith(`..${sep}`)));
17
+ }
18
+ async function safePath(root, repositoryPath, kind) {
19
+ const candidate = resolve(root, repositoryPath);
20
+ if (await pathTraversesSymbolicLink(root, candidate)) {
21
+ inputError("PUBLIC_API_PATH_SYMLINK_PROHIBITED", `Public API ${kind} cannot traverse a symbolic link: ${repositoryPath}.`, "public-api-extraction");
22
+ }
23
+ const canonical = await realpath(candidate).catch(() => inputError("PUBLIC_API_PATH_UNAVAILABLE", `Public API ${kind} is unavailable: ${repositoryPath}.`, "public-api-extraction"));
24
+ if (!contained(root, canonical)) {
25
+ inputError("PUBLIC_API_PATH_ESCAPE", `Public API ${kind} escapes the consumer repository: ${repositoryPath}.`, "public-api-extraction");
26
+ }
27
+ const metadata = await stat(canonical);
28
+ if ((kind === "file" && !metadata.isFile()) || (kind === "directory" && !metadata.isDirectory())) {
29
+ inputError("PUBLIC_API_PATH_INVALID", `Public API path is not a ${kind}: ${repositoryPath}.`, "public-api-extraction");
30
+ }
31
+ return canonical;
32
+ }
33
+ function collectItems(item, output) {
34
+ if (item instanceof ApiDeclaredItem) {
35
+ const parent = item.parent;
36
+ output.push({
37
+ canonicalReference: item.canonicalReference.toString(),
38
+ kind: item.kind,
39
+ ...(parent === undefined
40
+ ? {}
41
+ : { parentReference: parent.canonicalReference.toString() }),
42
+ parentKind: parent?.kind ?? "None",
43
+ signature: item.excerpt.text.replaceAll("\r\n", "\n").trim()
44
+ });
45
+ }
46
+ for (const member of item.members) {
47
+ collectItems(member, output);
48
+ }
49
+ }
50
+ export class MicrosoftPublicApiExtractor {
51
+ async extract(consumerRoot, policy, packageVersion, signal) {
52
+ assertNotCancelled(signal);
53
+ const canonicalRoot = await realpath(consumerRoot).catch(() => inputError("CONSUMER_ROOT_UNAVAILABLE", "Consumer root must be an existing accessible directory.", "public-api-extraction"));
54
+ const [packageRoot, manifestPath, entryPoint, tsconfigPath] = await Promise.all([
55
+ safePath(canonicalRoot, policy.packageRoot, "directory"),
56
+ safePath(canonicalRoot, policy.manifestPath, "file"),
57
+ safePath(canonicalRoot, policy.declarationEntryPoint, "file"),
58
+ safePath(canonicalRoot, policy.tsconfigPath, "file")
59
+ ]);
60
+ let manifest;
61
+ try {
62
+ manifest = JSON.parse(await readFile(manifestPath, "utf8"));
63
+ }
64
+ catch {
65
+ inputError("PUBLIC_API_PACKAGE_MANIFEST_INVALID", `Package manifest is not valid JSON: ${policy.manifestPath}.`, "public-api-extraction");
66
+ }
67
+ if (manifest.name !== policy.packageName) {
68
+ inputError("PUBLIC_API_PACKAGE_IDENTITY_INVALID", `Package manifest identity does not match ${policy.packageName}.`, "public-api-extraction");
69
+ }
70
+ const outputRoot = await mkdtemp(join(tmpdir(), "agent-teams-api-extractor-"));
71
+ try {
72
+ const apiJsonPath = join(outputRoot, "surface.api.json");
73
+ const config = ExtractorConfig.prepare({
74
+ configObject: {
75
+ projectFolder: packageRoot,
76
+ mainEntryPointFilePath: entryPoint,
77
+ compiler: { tsconfigFilePath: tsconfigPath },
78
+ apiReport: { enabled: false },
79
+ docModel: {
80
+ enabled: true,
81
+ apiJsonFilePath: apiJsonPath,
82
+ includeForgottenExports: false
83
+ },
84
+ dtsRollup: { enabled: false },
85
+ tsdocMetadata: { enabled: false },
86
+ newlineKind: "lf",
87
+ testMode: true,
88
+ messages: {
89
+ compilerMessageReporting: {
90
+ default: { logLevel: ExtractorLogLevel.Error }
91
+ },
92
+ extractorMessageReporting: {
93
+ default: { logLevel: ExtractorLogLevel.Warning },
94
+ "ae-forgotten-export": { logLevel: ExtractorLogLevel.Error },
95
+ "ae-missing-release-tag": { logLevel: ExtractorLogLevel.None },
96
+ "ae-undocumented": { logLevel: ExtractorLogLevel.None }
97
+ },
98
+ tsdocMessageReporting: {
99
+ default: { logLevel: ExtractorLogLevel.Warning }
100
+ }
101
+ }
102
+ },
103
+ configObjectFullPath: undefined,
104
+ packageJsonFullPath: manifestPath,
105
+ projectFolderLookupToken: packageRoot
106
+ });
107
+ const errors = [];
108
+ const result = Extractor.invoke(config, {
109
+ localBuild: true,
110
+ showVerboseMessages: false,
111
+ messageCallback(message) {
112
+ if (message.logLevel === ExtractorLogLevel.Error) {
113
+ errors.push(message.messageId);
114
+ }
115
+ message.handled = true;
116
+ }
117
+ });
118
+ assertNotCancelled(signal);
119
+ if (!result.succeeded || errors.length > 0) {
120
+ inputError("PUBLIC_API_EXTRACTION_FAILED", `API Extractor failed with message(s): ${[...new Set(errors)].toSorted().join(", ") || "unknown"}.`, "public-api-extraction");
121
+ }
122
+ const apiJsonSource = await readFile(apiJsonPath, "utf8");
123
+ if (apiJsonSource.length > 32 * 1024 * 1024) {
124
+ inputError("PUBLIC_API_SURFACE_TOO_LARGE", "Generated public API surface exceeds 32 MiB.", "public-api-extraction");
125
+ }
126
+ const model = new ApiModel();
127
+ const apiPackage = model.loadPackage(apiJsonPath);
128
+ const items = [];
129
+ collectItems(apiPackage, items);
130
+ return {
131
+ schemaVersion: 1,
132
+ packageName: policy.packageName,
133
+ packageVersion,
134
+ extractorVersion: Extractor.version,
135
+ items: items.toSorted((left, right) => compareCanonicalReferences(left.canonicalReference, right.canonicalReference))
136
+ };
137
+ }
138
+ finally {
139
+ await rm(outputRoot, { recursive: true, force: true });
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=microsoft-public-api-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft-public-api-extractor.js","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/api-extractor/microsoft-public-api-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ChangeFingerprint } from "../../../application/ports/change-fingerprint.js";
2
+ export declare class NodeChangeFingerprint implements ChangeFingerprint {
3
+ sha256(value: string): string;
4
+ }
5
+ //# sourceMappingURL=node-change-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-change-fingerprint.d.ts","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAE1F,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5B;CACF"}
@@ -0,0 +1,7 @@
1
+ import { createHash } from "node:crypto";
2
+ export class NodeChangeFingerprint {
3
+ sha256(value) {
4
+ return createHash("sha256").update(value, "utf8").digest("hex");
5
+ }
6
+ }
7
+ //# sourceMappingURL=node-change-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-change-fingerprint.js","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/crypto/node-change-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,OAAO,qBAAqB;IAChC,MAAM,CAAC,KAAa;QAClB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { PackageReleaseEvidence, PublicApiPackagePolicy, PublicApiSnapshot } from "../../../application/model/public-api.js";
2
+ import type { PublicApiRepository } from "../../../application/ports/public-api-repository.js";
3
+ export declare class FilesystemPublicApiRepository implements PublicApiRepository {
4
+ readReleasedBaseline(consumerRoot: string, policy: PublicApiPackagePolicy, signal?: AbortSignal): Promise<PublicApiSnapshot>;
5
+ readReleaseEvidence(consumerRoot: string, changesetDirectory: string, policy: PublicApiPackagePolicy, signal?: AbortSignal): Promise<PackageReleaseEvidence>;
6
+ isAcceptedDecision(consumerRoot: string, decisionPath: string, signal?: AbortSignal): Promise<boolean>;
7
+ writeReleasedBaseline(consumerRoot: string, policy: PublicApiPackagePolicy, snapshot: PublicApiSnapshot, signal?: AbortSignal): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=filesystem-public-api-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-public-api-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,sBAAsB,EAEtB,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAiK/F,qBAAa,6BAA8B,YAAW,mBAAmB;IACjE,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,sBAAsB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAmE5B;IAEK,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,sBAAsB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAqCjC;IAEK,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAiBlB;IAEK,qBAAqB,CACzB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf;CACF"}
@@ -0,0 +1,205 @@
1
+ import { lstat, mkdtemp, opendir, readFile, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
3
+ import { CapabilityInputError } from "../../../../../capability-runtime.js";
4
+ import { pathTraversesSymbolicLink } from "../../../../../filesystem-path-safety.js";
5
+ import { assertSchema } from "../../../../../schema-catalog.js";
6
+ import { isExactVersion } from "../../../../../semantic-version.js";
7
+ import { assertNotCancelled, parseStrictYamlSource } from "../../../../../strict-yaml.js";
8
+ import { compareCanonicalReferences } from "../../../application/model/public-api.js";
9
+ const MAX_INPUT_BYTES = 32 * 1024 * 1024;
10
+ const BUMP_RANK = {
11
+ patch: 0,
12
+ minor: 1,
13
+ major: 2
14
+ };
15
+ function inputError(code, message, phase) {
16
+ throw new CapabilityInputError({ code, message, phase, retryable: false });
17
+ }
18
+ function contained(parent, candidate) {
19
+ const relation = relative(parent, candidate);
20
+ return (relation === "" ||
21
+ (!isAbsolute(relation) && relation !== ".." && !relation.startsWith(`..${sep}`)));
22
+ }
23
+ async function canonicalRoot(consumerRoot) {
24
+ return realpath(consumerRoot).catch(() => inputError("CONSUMER_ROOT_UNAVAILABLE", "Consumer root must be an existing accessible directory.", "public-api-evidence"));
25
+ }
26
+ async function safePath(root, repositoryPath, kind) {
27
+ const candidate = resolve(root, repositoryPath);
28
+ if (await pathTraversesSymbolicLink(root, candidate)) {
29
+ inputError("PUBLIC_API_EVIDENCE_SYMLINK_PROHIBITED", `Public API evidence cannot traverse a symbolic link: ${repositoryPath}.`, "public-api-evidence");
30
+ }
31
+ const canonical = await realpath(candidate).catch(() => inputError("PUBLIC_API_EVIDENCE_UNAVAILABLE", `Public API evidence is unavailable: ${repositoryPath}.`, "public-api-evidence"));
32
+ if (!contained(root, canonical)) {
33
+ inputError("PUBLIC_API_EVIDENCE_ESCAPE", `Public API evidence escapes the consumer repository: ${repositoryPath}.`, "public-api-evidence");
34
+ }
35
+ const metadata = await stat(canonical);
36
+ if ((kind === "file" && (!metadata.isFile() || metadata.size > MAX_INPUT_BYTES)) ||
37
+ (kind === "directory" && !metadata.isDirectory())) {
38
+ inputError("PUBLIC_API_EVIDENCE_INVALID", `Public API evidence is not a valid ${kind}: ${repositoryPath}.`, "public-api-evidence");
39
+ }
40
+ return canonical;
41
+ }
42
+ function record(value, field) {
43
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
44
+ inputError("PUBLIC_API_EVIDENCE_INVALID", `${field} must be an object.`, "public-api-evidence");
45
+ }
46
+ return value;
47
+ }
48
+ function mapItem(value, index) {
49
+ const item = record(value, `items[${index}]`);
50
+ return Object.freeze({
51
+ canonicalReference: String(item["canonicalReference"]),
52
+ kind: String(item["kind"]),
53
+ ...(typeof item["parentReference"] === "string"
54
+ ? { parentReference: item["parentReference"] }
55
+ : {}),
56
+ parentKind: String(item["parentKind"]),
57
+ signature: String(item["signature"])
58
+ });
59
+ }
60
+ function strongerBump(current, candidate) {
61
+ if (candidate !== "patch" && candidate !== "minor" && candidate !== "major") {
62
+ return current;
63
+ }
64
+ return current === undefined || BUMP_RANK[candidate] > BUMP_RANK[current]
65
+ ? candidate
66
+ : current;
67
+ }
68
+ function changesetFrontmatter(source) {
69
+ const normalized = source.replaceAll("\r\n", "\n");
70
+ if (!normalized.startsWith("---\n")) {
71
+ return undefined;
72
+ }
73
+ const end = normalized.indexOf("\n---\n", 4);
74
+ return end === -1 ? undefined : normalized.slice(4, end);
75
+ }
76
+ async function declaredBump(directory, packageName, signal) {
77
+ let bump;
78
+ const entries = [];
79
+ const handle = await opendir(directory);
80
+ for await (const entry of handle) {
81
+ assertNotCancelled(signal);
82
+ if (entry.isSymbolicLink()) {
83
+ inputError("CHANGESET_SYMLINK_PROHIBITED", `Changeset entries cannot be symbolic links: ${entry.name}.`, "public-api-evidence");
84
+ }
85
+ if (entry.isFile() && entry.name.endsWith(".md") && entry.name !== "README.md") {
86
+ entries.push(entry.name);
87
+ }
88
+ }
89
+ for (const name of entries.toSorted()) {
90
+ const path = resolve(directory, name);
91
+ const metadata = await lstat(path);
92
+ if (!metadata.isFile() || metadata.size > 1024 * 1024) {
93
+ inputError("CHANGESET_INVALID", `Changeset must be a regular file no larger than 1 MiB: ${name}.`, "public-api-evidence");
94
+ }
95
+ const frontmatter = changesetFrontmatter(await readFile(path, "utf8"));
96
+ if (frontmatter === undefined) {
97
+ inputError("CHANGESET_INVALID", `Changeset has invalid frontmatter: ${name}.`, "public-api-evidence");
98
+ }
99
+ const parsed = record(parseStrictYamlSource(frontmatter, "public-api-changeset"), `changeset ${name}`);
100
+ bump = strongerBump(bump, parsed[packageName]);
101
+ }
102
+ return bump;
103
+ }
104
+ export class FilesystemPublicApiRepository {
105
+ async readReleasedBaseline(consumerRoot, policy, signal) {
106
+ assertNotCancelled(signal);
107
+ const root = await canonicalRoot(consumerRoot);
108
+ const baselinePath = await safePath(root, policy.releasedBaselinePath, "file");
109
+ let input;
110
+ try {
111
+ input = JSON.parse(await readFile(baselinePath, "utf8"));
112
+ }
113
+ catch {
114
+ inputError("PUBLIC_API_BASELINE_INVALID", `Released API baseline is not valid JSON: ${policy.releasedBaselinePath}.`, "public-api-evidence");
115
+ }
116
+ await assertSchema("package-public-api-baseline/v1", input, "public-api-baseline");
117
+ const baseline = record(input, "released API baseline");
118
+ const itemsInput = baseline["items"];
119
+ if (!Array.isArray(itemsInput)) {
120
+ inputError("PUBLIC_API_BASELINE_INVALID", "Released API baseline items must be an array.", "public-api-evidence");
121
+ }
122
+ const items = itemsInput.map(mapItem);
123
+ const references = items.map((item) => item.canonicalReference);
124
+ const sortedReferences = references.toSorted(compareCanonicalReferences);
125
+ if (new Set(references).size !== references.length ||
126
+ references.some((value, index) => value !== sortedReferences[index])) {
127
+ inputError("PUBLIC_API_BASELINE_INVALID", "Released API baseline items must have unique sorted canonical references.", "public-api-evidence");
128
+ }
129
+ const packageName = String(baseline["packageName"]);
130
+ if (packageName !== policy.packageName) {
131
+ inputError("PUBLIC_API_BASELINE_INVALID", `Released API baseline package does not match ${policy.packageName}.`, "public-api-evidence");
132
+ }
133
+ const packageVersion = String(baseline["packageVersion"]);
134
+ if (!isExactVersion(packageVersion)) {
135
+ inputError("PUBLIC_API_BASELINE_INVALID", `Released API baseline version is not exact SemVer: ${packageVersion}.`, "public-api-evidence");
136
+ }
137
+ return Object.freeze({
138
+ schemaVersion: 1,
139
+ packageName,
140
+ packageVersion,
141
+ extractorVersion: String(baseline["extractorVersion"]),
142
+ items: Object.freeze(items)
143
+ });
144
+ }
145
+ async readReleaseEvidence(consumerRoot, changesetDirectory, policy, signal) {
146
+ assertNotCancelled(signal);
147
+ const root = await canonicalRoot(consumerRoot);
148
+ const [manifestPath, changesetPath] = await Promise.all([
149
+ safePath(root, policy.manifestPath, "file"),
150
+ safePath(root, changesetDirectory, "directory")
151
+ ]);
152
+ let manifestInput;
153
+ try {
154
+ manifestInput = JSON.parse(await readFile(manifestPath, "utf8"));
155
+ }
156
+ catch {
157
+ inputError("PUBLIC_API_PACKAGE_MANIFEST_INVALID", `Package manifest is not valid JSON: ${policy.manifestPath}.`, "public-api-evidence");
158
+ }
159
+ const manifest = record(manifestInput, "package manifest");
160
+ const packageName = manifest["name"];
161
+ const packageVersion = manifest["version"];
162
+ if (packageName !== policy.packageName ||
163
+ typeof packageVersion !== "string" ||
164
+ !isExactVersion(packageVersion)) {
165
+ inputError("PUBLIC_API_PACKAGE_IDENTITY_INVALID", `Package manifest identity or version is invalid: ${policy.manifestPath}.`, "public-api-evidence");
166
+ }
167
+ const bump = await declaredBump(changesetPath, policy.packageName, signal);
168
+ return {
169
+ packageName: policy.packageName,
170
+ packageVersion,
171
+ ...(bump === undefined ? {} : { declaredBump: bump })
172
+ };
173
+ }
174
+ async isAcceptedDecision(consumerRoot, decisionPath, signal) {
175
+ assertNotCancelled(signal);
176
+ const root = await canonicalRoot(consumerRoot);
177
+ const source = await readFile(await safePath(root, decisionPath, "file"), "utf8");
178
+ const metadataLines = source.replaceAll("\r\n", "\n").split("\n").slice(0, 30);
179
+ const heading = metadataLines[0] ?? "";
180
+ const sectionBoundary = metadataLines.findIndex((line, index) => index > 0 && line.startsWith("## "));
181
+ const firstSection = metadataLines.slice(0, sectionBoundary === -1 ? metadataLines.length : sectionBoundary);
182
+ return (/^# ADR-[0-9]{4}:/u.test(heading) &&
183
+ firstSection.some((line) => line.trim() === "Status: Accepted"));
184
+ }
185
+ async writeReleasedBaseline(consumerRoot, policy, snapshot, signal) {
186
+ assertNotCancelled(signal);
187
+ const root = await canonicalRoot(consumerRoot);
188
+ const baselinePath = await safePath(root, policy.releasedBaselinePath, "file");
189
+ await assertSchema("package-public-api-baseline/v1", snapshot, "public-api-baseline-promotion");
190
+ const temporaryDirectory = await mkdtemp(join(dirname(baselinePath), ".public-api-baseline-"));
191
+ try {
192
+ const temporaryPath = join(temporaryDirectory, "baseline.json");
193
+ await writeFile(temporaryPath, `${JSON.stringify(snapshot, null, 2)}\n`, {
194
+ encoding: "utf8",
195
+ mode: 0o644
196
+ });
197
+ assertNotCancelled(signal);
198
+ await rename(temporaryPath, baselinePath);
199
+ }
200
+ finally {
201
+ await rm(temporaryDirectory, { recursive: true, force: true });
202
+ }
203
+ }
204
+ }
205
+ //# sourceMappingURL=filesystem-public-api-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-public-api-repository.js","sourceRoot":"","sources":["../../../../../../src/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export type ReleaseBump = "major" | "minor" | "patch";
2
+ export interface PublicApiItem {
3
+ readonly canonicalReference: string;
4
+ readonly kind: string;
5
+ readonly parentReference?: string;
6
+ readonly parentKind: string;
7
+ readonly signature: string;
8
+ }
9
+ export declare function compareCanonicalReferences(left: string, right: string): number;
10
+ export interface PublicApiSnapshot {
11
+ readonly schemaVersion: 1;
12
+ readonly packageName: string;
13
+ readonly packageVersion: string;
14
+ readonly extractorVersion: string;
15
+ readonly items: readonly PublicApiItem[];
16
+ }
17
+ export interface ApprovedBreakingChange {
18
+ readonly fingerprint: string;
19
+ readonly decisionPath: string;
20
+ }
21
+ export interface PublicApiPackagePolicy {
22
+ readonly packageName: string;
23
+ readonly packageRoot: string;
24
+ readonly manifestPath: string;
25
+ readonly declarationEntryPoint: string;
26
+ readonly tsconfigPath: string;
27
+ readonly releasedBaselinePath: string;
28
+ readonly approvedBreakingChanges: readonly ApprovedBreakingChange[];
29
+ }
30
+ export interface PublicApiCompatibilityPolicy {
31
+ readonly changesetDirectory: string;
32
+ readonly packages: readonly PublicApiPackagePolicy[];
33
+ }
34
+ export interface PublicApiChangeSet {
35
+ readonly classification: "additive" | "breaking" | "none";
36
+ readonly fingerprint?: string;
37
+ readonly added: readonly string[];
38
+ readonly changed: readonly string[];
39
+ readonly removed: readonly string[];
40
+ }
41
+ export interface PackageReleaseEvidence {
42
+ readonly packageName: string;
43
+ readonly packageVersion: string;
44
+ readonly declaredBump?: ReleaseBump;
45
+ }
46
+ //# sourceMappingURL=public-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/public-api-compatibility/application/model/public-api.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,uBAAuB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACrE;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC;CACrC"}
@@ -0,0 +1,4 @@
1
+ export function compareCanonicalReferences(left, right) {
2
+ return left < right ? -1 : left > right ? 1 : 0;
3
+ }
4
+ //# sourceMappingURL=public-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../../../../src/capabilities/public-api-compatibility/application/model/public-api.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,KAAa;IACpE,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { FoundationDiagnostic } from "../../../../check-contract.js";
2
+ import type { ChangeFingerprint } from "../ports/change-fingerprint.js";
3
+ import type { PackageReleaseEvidence, PublicApiChangeSet, PublicApiPackagePolicy, PublicApiSnapshot } from "../model/public-api.js";
4
+ export declare function classifyPublicApiChange(releasedSnapshot: PublicApiSnapshot, currentSnapshot: PublicApiSnapshot, fingerprint: ChangeFingerprint): PublicApiChangeSet;
5
+ export declare function evaluatePublicApiCompatibility(input: {
6
+ readonly policy: PublicApiPackagePolicy;
7
+ readonly released: PublicApiSnapshot;
8
+ readonly current: PublicApiSnapshot;
9
+ readonly change: PublicApiChangeSet;
10
+ readonly releaseEvidence: PackageReleaseEvidence;
11
+ readonly acceptedDecision: boolean | undefined;
12
+ }): readonly FoundationDiagnostic[];
13
+ //# sourceMappingURL=evaluate-public-api-compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-public-api-compatibility.d.ts","sourceRoot":"","sources":["../../../../../src/capabilities/public-api-compatibility/application/policies/evaluate-public-api-compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAElB,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAiEhC,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,iBAAiB,EACnC,eAAe,EAAE,iBAAiB,EAClC,WAAW,EAAE,iBAAiB,GAC7B,kBAAkB,CA4CpB;AASD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IACjD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;CAChD,GAAG,SAAS,oBAAoB,EAAE,CAgGlC"}