@agentxm/client-core 0.8.0 → 0.10.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 (196) hide show
  1. package/README.md +5 -0
  2. package/dist/src/unstable/cli-renderer/ansi-chrome.d.ts +7 -0
  3. package/dist/src/unstable/cli-renderer/ansi-chrome.d.ts.map +1 -1
  4. package/dist/src/unstable/cli-renderer/ansi-chrome.js +7 -7
  5. package/dist/src/unstable/cli-renderer/ansi-chrome.js.map +1 -1
  6. package/dist/src/unstable/cli-renderer/cli-renderer-interactive.d.ts.map +1 -1
  7. package/dist/src/unstable/cli-renderer/cli-renderer-interactive.js +16 -93
  8. package/dist/src/unstable/cli-renderer/cli-renderer-interactive.js.map +1 -1
  9. package/dist/src/unstable/cli-renderer/cli-renderer-machine.d.ts.map +1 -1
  10. package/dist/src/unstable/cli-renderer/cli-renderer-machine.js +2 -0
  11. package/dist/src/unstable/cli-renderer/cli-renderer-machine.js.map +1 -1
  12. package/dist/src/unstable/cli-renderer/cli-renderer-test.d.ts +1 -0
  13. package/dist/src/unstable/cli-renderer/cli-renderer-test.d.ts.map +1 -1
  14. package/dist/src/unstable/cli-renderer/cli-renderer-test.js +4 -0
  15. package/dist/src/unstable/cli-renderer/cli-renderer-test.js.map +1 -1
  16. package/dist/src/unstable/cli-renderer/cli-renderer.d.ts +1 -0
  17. package/dist/src/unstable/cli-renderer/cli-renderer.d.ts.map +1 -1
  18. package/dist/src/unstable/cli-renderer/cli-renderer.js.map +1 -1
  19. package/dist/src/unstable/cli-renderer/index.d.ts +1 -0
  20. package/dist/src/unstable/cli-renderer/index.d.ts.map +1 -1
  21. package/dist/src/unstable/cli-renderer/index.js +1 -0
  22. package/dist/src/unstable/cli-renderer/index.js.map +1 -1
  23. package/dist/src/unstable/cli-renderer/markdown-formatter.d.ts +2 -0
  24. package/dist/src/unstable/cli-renderer/markdown-formatter.d.ts.map +1 -0
  25. package/dist/src/unstable/cli-renderer/markdown-formatter.js +255 -0
  26. package/dist/src/unstable/cli-renderer/markdown-formatter.js.map +1 -0
  27. package/dist/src/unstable/cli-renderer/table-formatter.d.ts +5 -0
  28. package/dist/src/unstable/cli-renderer/table-formatter.d.ts.map +1 -0
  29. package/dist/src/unstable/cli-renderer/table-formatter.js +85 -0
  30. package/dist/src/unstable/cli-renderer/table-formatter.js.map +1 -0
  31. package/dist/src/unstable/cli-runtime/breadcrumb.d.ts +1 -0
  32. package/dist/src/unstable/cli-runtime/breadcrumb.d.ts.map +1 -1
  33. package/dist/src/unstable/cli-runtime/breadcrumb.js +2 -1
  34. package/dist/src/unstable/cli-runtime/breadcrumb.js.map +1 -1
  35. package/dist/src/unstable/cli-runtime/json-envelope.d.ts +4 -0
  36. package/dist/src/unstable/cli-runtime/json-envelope.d.ts.map +1 -1
  37. package/dist/src/unstable/cli-runtime/output-mode.d.ts +1 -0
  38. package/dist/src/unstable/cli-runtime/output-mode.d.ts.map +1 -1
  39. package/dist/src/unstable/cli-runtime/output-mode.js +1 -0
  40. package/dist/src/unstable/cli-runtime/output-mode.js.map +1 -1
  41. package/dist/src/unstable/cli-runtime/runtime-envelope.d.ts.map +1 -1
  42. package/dist/src/unstable/cli-runtime/runtime-envelope.js +4 -0
  43. package/dist/src/unstable/cli-runtime/runtime-envelope.js.map +1 -1
  44. package/dist/src/unstable/commands/manifest-schema.d.ts +21 -11
  45. package/dist/src/unstable/commands/manifest-schema.d.ts.map +1 -1
  46. package/dist/src/unstable/commands/operations/publish.d.ts.map +1 -1
  47. package/dist/src/unstable/commands/operations/publish.js +2 -1
  48. package/dist/src/unstable/commands/operations/publish.js.map +1 -1
  49. package/dist/src/unstable/commands/operations/shared-command-helpers.d.ts +20 -12
  50. package/dist/src/unstable/commands/operations/shared-command-helpers.d.ts.map +1 -1
  51. package/dist/src/unstable/extensions/common.d.ts +66 -11
  52. package/dist/src/unstable/extensions/common.d.ts.map +1 -1
  53. package/dist/src/unstable/extensions/common.js +86 -14
  54. package/dist/src/unstable/extensions/common.js.map +1 -1
  55. package/dist/src/unstable/extensions/index.d.ts +2 -1
  56. package/dist/src/unstable/extensions/index.d.ts.map +1 -1
  57. package/dist/src/unstable/extensions/index.js +2 -1
  58. package/dist/src/unstable/extensions/index.js.map +1 -1
  59. package/dist/src/unstable/extensions/license.d.ts +16 -0
  60. package/dist/src/unstable/extensions/license.d.ts.map +1 -0
  61. package/dist/src/unstable/extensions/license.js +29 -0
  62. package/dist/src/unstable/extensions/license.js.map +1 -0
  63. package/dist/src/unstable/lint/catalog/workspace/skills-universal-artifact-present.d.ts +11 -0
  64. package/dist/src/unstable/lint/catalog/workspace/skills-universal-artifact-present.d.ts.map +1 -0
  65. package/dist/src/unstable/lint/catalog/workspace/skills-universal-artifact-present.js +68 -0
  66. package/dist/src/unstable/lint/catalog/workspace/skills-universal-artifact-present.js.map +1 -0
  67. package/dist/src/unstable/lint/catalog/workspace-fixtures/interpret-ops.d.ts.map +1 -1
  68. package/dist/src/unstable/lint/catalog/workspace-fixtures/interpret-ops.js +47 -0
  69. package/dist/src/unstable/lint/catalog/workspace-fixtures/interpret-ops.js.map +1 -1
  70. package/dist/src/unstable/lint/catalog/workspace.d.ts +1 -0
  71. package/dist/src/unstable/lint/catalog/workspace.d.ts.map +1 -1
  72. package/dist/src/unstable/lint/catalog/workspace.js +4 -0
  73. package/dist/src/unstable/lint/catalog/workspace.js.map +1 -1
  74. package/dist/src/unstable/lint/cli.d.ts.map +1 -1
  75. package/dist/src/unstable/lint/cli.js +22 -0
  76. package/dist/src/unstable/lint/cli.js.map +1 -1
  77. package/dist/src/unstable/lockfile/schema.d.ts +85 -0
  78. package/dist/src/unstable/lockfile/schema.d.ts.map +1 -1
  79. package/dist/src/unstable/lockfile/schema.js +7 -1
  80. package/dist/src/unstable/lockfile/schema.js.map +1 -1
  81. package/dist/src/unstable/mcp-servers/manifest-schema.d.ts +21 -11
  82. package/dist/src/unstable/mcp-servers/manifest-schema.d.ts.map +1 -1
  83. package/dist/src/unstable/mcp-servers/operations/publish.d.ts.map +1 -1
  84. package/dist/src/unstable/mcp-servers/operations/publish.js +2 -1
  85. package/dist/src/unstable/mcp-servers/operations/publish.js.map +1 -1
  86. package/dist/src/unstable/package-urls/companion-package.d.ts +14 -0
  87. package/dist/src/unstable/package-urls/companion-package.d.ts.map +1 -0
  88. package/dist/src/unstable/package-urls/companion-package.js +41 -0
  89. package/dist/src/unstable/package-urls/companion-package.js.map +1 -0
  90. package/dist/src/unstable/package-urls/companion-package.spec.d.ts +2 -0
  91. package/dist/src/unstable/package-urls/companion-package.spec.d.ts.map +1 -0
  92. package/dist/src/unstable/package-urls/companion-package.spec.js +37 -0
  93. package/dist/src/unstable/package-urls/companion-package.spec.js.map +1 -0
  94. package/dist/src/unstable/package-urls/index.d.ts +4 -0
  95. package/dist/src/unstable/package-urls/index.d.ts.map +1 -0
  96. package/dist/src/unstable/package-urls/index.js +4 -0
  97. package/dist/src/unstable/package-urls/index.js.map +1 -0
  98. package/dist/src/unstable/package-urls/internal.d.ts +6 -0
  99. package/dist/src/unstable/package-urls/internal.d.ts.map +1 -0
  100. package/dist/src/unstable/package-urls/internal.js +14 -0
  101. package/dist/src/unstable/package-urls/internal.js.map +1 -0
  102. package/dist/src/unstable/package-urls/package-identity-purl.d.ts +5 -0
  103. package/dist/src/unstable/package-urls/package-identity-purl.d.ts.map +1 -0
  104. package/dist/src/unstable/package-urls/package-identity-purl.js +26 -0
  105. package/dist/src/unstable/package-urls/package-identity-purl.js.map +1 -0
  106. package/dist/src/unstable/package-urls/package-identity-purl.spec.d.ts +2 -0
  107. package/dist/src/unstable/package-urls/package-identity-purl.spec.d.ts.map +1 -0
  108. package/dist/src/unstable/package-urls/package-identity-purl.spec.js +33 -0
  109. package/dist/src/unstable/package-urls/package-identity-purl.spec.js.map +1 -0
  110. package/dist/src/unstable/package-urls/vers-range.d.ts +32 -0
  111. package/dist/src/unstable/package-urls/vers-range.d.ts.map +1 -0
  112. package/dist/src/unstable/package-urls/vers-range.js +164 -0
  113. package/dist/src/unstable/package-urls/vers-range.js.map +1 -0
  114. package/dist/src/unstable/package-urls/vers-range.spec.d.ts +2 -0
  115. package/dist/src/unstable/package-urls/vers-range.spec.d.ts.map +1 -0
  116. package/dist/src/unstable/package-urls/vers-range.spec.js +60 -0
  117. package/dist/src/unstable/package-urls/vers-range.spec.js.map +1 -0
  118. package/dist/src/unstable/packaging/cargo.d.ts +5 -2
  119. package/dist/src/unstable/packaging/cargo.d.ts.map +1 -1
  120. package/dist/src/unstable/packaging/cargo.js +96 -55
  121. package/dist/src/unstable/packaging/cargo.js.map +1 -1
  122. package/dist/src/unstable/packaging/gem.d.ts.map +1 -1
  123. package/dist/src/unstable/packaging/gem.js +30 -15
  124. package/dist/src/unstable/packaging/gem.js.map +1 -1
  125. package/dist/src/unstable/packs/manifest-schema.d.ts +21 -11
  126. package/dist/src/unstable/packs/manifest-schema.d.ts.map +1 -1
  127. package/dist/src/unstable/packs/operations/publish.d.ts.map +1 -1
  128. package/dist/src/unstable/packs/operations/publish.js +2 -1
  129. package/dist/src/unstable/packs/operations/publish.js.map +1 -1
  130. package/dist/src/unstable/plan/plan.d.ts +3 -0
  131. package/dist/src/unstable/plan/plan.d.ts.map +1 -1
  132. package/dist/src/unstable/publish/manifest-policy.d.ts +106 -56
  133. package/dist/src/unstable/publish/manifest-policy.d.ts.map +1 -1
  134. package/dist/src/unstable/publish/manifest-policy.js +75 -5
  135. package/dist/src/unstable/publish/manifest-policy.js.map +1 -1
  136. package/dist/src/unstable/registry/__generated__/registry-client.d.ts +121 -21
  137. package/dist/src/unstable/registry/__generated__/registry-client.d.ts.map +1 -1
  138. package/dist/src/unstable/registry/__generated__/registry-client.js +78 -12
  139. package/dist/src/unstable/registry/__generated__/registry-client.js.map +1 -1
  140. package/dist/src/unstable/registry/client.d.ts +7 -1
  141. package/dist/src/unstable/registry/client.d.ts.map +1 -1
  142. package/dist/src/unstable/registry/client.js.map +1 -1
  143. package/dist/src/unstable/registry/index.d.ts +1 -1
  144. package/dist/src/unstable/registry/index.d.ts.map +1 -1
  145. package/dist/src/unstable/registry/index.js +1 -1
  146. package/dist/src/unstable/registry/index.js.map +1 -1
  147. package/dist/src/unstable/registry/local-client.d.ts.map +1 -1
  148. package/dist/src/unstable/registry/local-client.js +11 -5
  149. package/dist/src/unstable/registry/local-client.js.map +1 -1
  150. package/dist/src/unstable/registry/remote-client.d.ts.map +1 -1
  151. package/dist/src/unstable/registry/remote-client.js +5 -4
  152. package/dist/src/unstable/registry/remote-client.js.map +1 -1
  153. package/dist/src/unstable/registry/schema.d.ts +37 -18
  154. package/dist/src/unstable/registry/schema.d.ts.map +1 -1
  155. package/dist/src/unstable/registry/schema.js +19 -4
  156. package/dist/src/unstable/registry/schema.js.map +1 -1
  157. package/dist/src/unstable/skills/manifest-schema.d.ts +21 -11
  158. package/dist/src/unstable/skills/manifest-schema.d.ts.map +1 -1
  159. package/dist/src/unstable/skills/operations/disable.d.ts.map +1 -1
  160. package/dist/src/unstable/skills/operations/disable.js +14 -1
  161. package/dist/src/unstable/skills/operations/disable.js.map +1 -1
  162. package/dist/src/unstable/skills/operations/enable.d.ts.map +1 -1
  163. package/dist/src/unstable/skills/operations/enable.js +17 -1
  164. package/dist/src/unstable/skills/operations/enable.js.map +1 -1
  165. package/dist/src/unstable/skills/operations/install.d.ts +1 -8
  166. package/dist/src/unstable/skills/operations/install.d.ts.map +1 -1
  167. package/dist/src/unstable/skills/operations/install.js +47 -22
  168. package/dist/src/unstable/skills/operations/install.js.map +1 -1
  169. package/dist/src/unstable/skills/operations/publish.d.ts.map +1 -1
  170. package/dist/src/unstable/skills/operations/publish.js +2 -1
  171. package/dist/src/unstable/skills/operations/publish.js.map +1 -1
  172. package/dist/src/unstable/skills/operations/uninstall.d.ts.map +1 -1
  173. package/dist/src/unstable/skills/operations/uninstall.js +5 -0
  174. package/dist/src/unstable/skills/operations/uninstall.js.map +1 -1
  175. package/dist/src/unstable/skills/operations/universal-artifact.d.ts +43 -0
  176. package/dist/src/unstable/skills/operations/universal-artifact.d.ts.map +1 -0
  177. package/dist/src/unstable/skills/operations/universal-artifact.js +77 -0
  178. package/dist/src/unstable/skills/operations/universal-artifact.js.map +1 -0
  179. package/dist/src/unstable/source-resolution/providers/registry/host-provider.d.ts.map +1 -1
  180. package/dist/src/unstable/source-resolution/providers/registry/host-provider.js +3 -2
  181. package/dist/src/unstable/source-resolution/providers/registry/host-provider.js.map +1 -1
  182. package/dist/src/unstable/subagents/manifest-schema.d.ts +21 -11
  183. package/dist/src/unstable/subagents/manifest-schema.d.ts.map +1 -1
  184. package/dist/src/unstable/subagents/operations/publish.d.ts.map +1 -1
  185. package/dist/src/unstable/subagents/operations/publish.js +2 -1
  186. package/dist/src/unstable/subagents/operations/publish.js.map +1 -1
  187. package/dist/src/unstable/workspace/initialization.d.ts +16 -16
  188. package/dist/src/unstable/workspace/service.d.ts +78 -22
  189. package/dist/src/unstable/workspace/service.d.ts.map +1 -1
  190. package/package.json +11 -4
  191. package/site-content/__generated__/schemas/axm-lock.schema.json +98 -0
  192. package/site-content/__generated__/schemas/command.schema.json +141 -24
  193. package/site-content/__generated__/schemas/mcp-server.schema.json +141 -24
  194. package/site-content/__generated__/schemas/pack.schema.json +141 -24
  195. package/site-content/__generated__/schemas/skill.schema.json +141 -24
  196. package/site-content/__generated__/schemas/subagent.schema.json +141 -24
@@ -24,6 +24,114 @@
24
24
  }
25
25
  ]
26
26
  },
27
+ "Repository": {
28
+ "anyOf": [
29
+ {
30
+ "type": "string",
31
+ "examples": ["https://github.com/acme/code-review", "github:acme/code-review"],
32
+ "format": "uri-reference"
33
+ },
34
+ {
35
+ "type": "object",
36
+ "properties": {
37
+ "type": {
38
+ "anyOf": [
39
+ {
40
+ "type": "string",
41
+ "allOf": [
42
+ {
43
+ "minLength": 1,
44
+ "description": "Version control system (e.g., `git`).",
45
+ "examples": ["git"]
46
+ }
47
+ ]
48
+ },
49
+ { "type": "null" }
50
+ ]
51
+ },
52
+ "url": {
53
+ "type": "string",
54
+ "allOf": [
55
+ {
56
+ "minLength": 1,
57
+ "description": "Repository URL.",
58
+ "examples": ["https://github.com/acme/code-review"],
59
+ "format": "uri"
60
+ }
61
+ ]
62
+ },
63
+ "directory": {
64
+ "anyOf": [
65
+ {
66
+ "type": "string",
67
+ "allOf": [
68
+ {
69
+ "minLength": 1,
70
+ "description": "Subdirectory within the repository, for monorepo publishers.",
71
+ "examples": ["packages/code-review"]
72
+ }
73
+ ]
74
+ },
75
+ { "type": "null" }
76
+ ]
77
+ }
78
+ },
79
+ "required": ["url"],
80
+ "additionalProperties": false
81
+ }
82
+ ],
83
+ "title": "Repository",
84
+ "description": "Source repository for this extension. Accepts a URL string (or `host:owner/repo` shorthand) or an object with `type`, `url`, and optional `directory`."
85
+ },
86
+ "Bugs": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string",
90
+ "examples": ["https://github.com/acme/code-review/issues"],
91
+ "format": "uri"
92
+ },
93
+ {
94
+ "type": "object",
95
+ "properties": {
96
+ "url": {
97
+ "anyOf": [
98
+ {
99
+ "type": "string",
100
+ "allOf": [
101
+ {
102
+ "minLength": 1,
103
+ "description": "Issue tracker URL.",
104
+ "examples": ["https://github.com/acme/code-review/issues"],
105
+ "format": "uri"
106
+ }
107
+ ]
108
+ },
109
+ { "type": "null" }
110
+ ]
111
+ },
112
+ "email": {
113
+ "anyOf": [
114
+ {
115
+ "type": "string",
116
+ "allOf": [
117
+ {
118
+ "minLength": 1,
119
+ "description": "Contact email for bug reports.",
120
+ "examples": ["bugs@acme.dev"],
121
+ "format": "email"
122
+ }
123
+ ]
124
+ },
125
+ { "type": "null" }
126
+ ]
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ }
131
+ ],
132
+ "title": "Bugs",
133
+ "description": "Where to report bugs against this extension. Accepts a URL string or an object with optional `url` and `email`."
134
+ },
27
135
  "Author": {
28
136
  "type": "object",
29
137
  "properties": {
@@ -36,17 +144,38 @@
36
144
  "title": "Author",
37
145
  "description": "A person credited as a creator or maintainer of this extension."
38
146
  },
39
- "PackageUrl": {
147
+ "PackageIdentityPurl": {
40
148
  "type": "string",
41
149
  "allOf": [
150
+ { "minLength": 1 },
42
151
  {
43
152
  "pattern": "^[Pp][Kk][Gg]:[a-zA-Z][a-zA-Z0-9.+-]*\\/.+$",
44
- "title": "Package URL",
45
- "description": "A Package URL (purl) string identifying a package across ecosystems (e.g. pkg:npm/react@18.2.0).",
46
- "examples": ["pkg:npm/react@18.2.0", "pkg:pypi/requests@2.31.0", "pkg:cargo/serde@1.0"]
153
+ "title": "Package Identity Purl",
154
+ "description": "A Package URL (purl) identity for a companion package. Companion package purls are identities, not pins: omit the purl @version segment and put compatibility constraints in versionRange.",
155
+ "examples": ["pkg:npm/react", "pkg:pypi/requests", "pkg:cargo/serde"]
47
156
  }
48
157
  ]
49
158
  },
159
+ "VersRange": {
160
+ "type": "string",
161
+ "allOf": [
162
+ {
163
+ "minLength": 1,
164
+ "examples": ["vers:npm/>=18.0.0|<19.0.0", "vers:pypi/>=2.31.0", "vers:cargo/>=1.0.0"]
165
+ }
166
+ ]
167
+ },
168
+ "CompanionPackage": {
169
+ "type": "object",
170
+ "properties": {
171
+ "purl": { "$ref": "#/definitions/PackageIdentityPurl" },
172
+ "versionRange": { "anyOf": [{ "$ref": "#/definitions/VersRange" }, { "type": "null" }] }
173
+ },
174
+ "required": ["purl"],
175
+ "additionalProperties": false,
176
+ "title": "Companion Package",
177
+ "description": "A companion package purl identity with an optional VERS compatibility range."
178
+ },
50
179
  "ExtensionName": {
51
180
  "type": "string",
52
181
  "allOf": [
@@ -107,16 +236,7 @@
107
236
  { "type": "null" }
108
237
  ]
109
238
  },
110
- "repository": {
111
- "anyOf": [
112
- {
113
- "type": "string",
114
- "examples": ["https://github.com/acme/code-review"],
115
- "format": "uri"
116
- },
117
- { "type": "null" }
118
- ]
119
- },
239
+ "repository": { "anyOf": [{ "$ref": "#/definitions/Repository" }, { "type": "null" }] },
120
240
  "homepage": {
121
241
  "anyOf": [
122
242
  { "type": "string", "examples": ["https://acme.dev/code-review"], "format": "uri" },
@@ -124,21 +244,18 @@
124
244
  ]
125
245
  },
126
246
  "license": {
127
- "anyOf": [
128
- { "type": "string", "allOf": [{ "minLength": 1, "examples": ["MIT", "Apache-2.0"] }] },
129
- { "type": "null" }
130
- ]
131
- },
132
- "bugs": {
133
247
  "anyOf": [
134
248
  {
135
249
  "type": "string",
136
- "examples": ["https://github.com/acme/code-review/issues"],
137
- "format": "uri"
250
+ "title": "License",
251
+ "description": "SPDX license expression, or `UNLICENSED` for proprietary code.",
252
+ "examples": ["MIT", "Apache-2.0", "MIT OR Apache-2.0", "UNLICENSED"],
253
+ "format": "spdx-expression"
138
254
  },
139
255
  { "type": "null" }
140
256
  ]
141
257
  },
258
+ "bugs": { "anyOf": [{ "$ref": "#/definitions/Bugs" }, { "type": "null" }] },
142
259
  "authors": {
143
260
  "anyOf": [
144
261
  { "type": "array", "items": { "$ref": "#/definitions/Author" } },
@@ -149,8 +266,8 @@
149
266
  "anyOf": [
150
267
  {
151
268
  "type": "array",
152
- "description": "External ecosystem packages this extension is designed to work with (e.g. the npm or PyPI package an MCP server wraps), identified by Package URL (purl).",
153
- "items": { "$ref": "#/definitions/PackageUrl" }
269
+ "description": "External ecosystem packages this extension is designed to work with, declared as identity Package URLs with optional VERS compatibility ranges.",
270
+ "items": { "$ref": "#/definitions/CompanionPackage" }
154
271
  },
155
272
  { "type": "null" }
156
273
  ]
@@ -24,6 +24,114 @@
24
24
  }
25
25
  ]
26
26
  },
27
+ "Repository": {
28
+ "anyOf": [
29
+ {
30
+ "type": "string",
31
+ "examples": ["https://github.com/acme/code-review", "github:acme/code-review"],
32
+ "format": "uri-reference"
33
+ },
34
+ {
35
+ "type": "object",
36
+ "properties": {
37
+ "type": {
38
+ "anyOf": [
39
+ {
40
+ "type": "string",
41
+ "allOf": [
42
+ {
43
+ "minLength": 1,
44
+ "description": "Version control system (e.g., `git`).",
45
+ "examples": ["git"]
46
+ }
47
+ ]
48
+ },
49
+ { "type": "null" }
50
+ ]
51
+ },
52
+ "url": {
53
+ "type": "string",
54
+ "allOf": [
55
+ {
56
+ "minLength": 1,
57
+ "description": "Repository URL.",
58
+ "examples": ["https://github.com/acme/code-review"],
59
+ "format": "uri"
60
+ }
61
+ ]
62
+ },
63
+ "directory": {
64
+ "anyOf": [
65
+ {
66
+ "type": "string",
67
+ "allOf": [
68
+ {
69
+ "minLength": 1,
70
+ "description": "Subdirectory within the repository, for monorepo publishers.",
71
+ "examples": ["packages/code-review"]
72
+ }
73
+ ]
74
+ },
75
+ { "type": "null" }
76
+ ]
77
+ }
78
+ },
79
+ "required": ["url"],
80
+ "additionalProperties": false
81
+ }
82
+ ],
83
+ "title": "Repository",
84
+ "description": "Source repository for this extension. Accepts a URL string (or `host:owner/repo` shorthand) or an object with `type`, `url`, and optional `directory`."
85
+ },
86
+ "Bugs": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string",
90
+ "examples": ["https://github.com/acme/code-review/issues"],
91
+ "format": "uri"
92
+ },
93
+ {
94
+ "type": "object",
95
+ "properties": {
96
+ "url": {
97
+ "anyOf": [
98
+ {
99
+ "type": "string",
100
+ "allOf": [
101
+ {
102
+ "minLength": 1,
103
+ "description": "Issue tracker URL.",
104
+ "examples": ["https://github.com/acme/code-review/issues"],
105
+ "format": "uri"
106
+ }
107
+ ]
108
+ },
109
+ { "type": "null" }
110
+ ]
111
+ },
112
+ "email": {
113
+ "anyOf": [
114
+ {
115
+ "type": "string",
116
+ "allOf": [
117
+ {
118
+ "minLength": 1,
119
+ "description": "Contact email for bug reports.",
120
+ "examples": ["bugs@acme.dev"],
121
+ "format": "email"
122
+ }
123
+ ]
124
+ },
125
+ { "type": "null" }
126
+ ]
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ }
131
+ ],
132
+ "title": "Bugs",
133
+ "description": "Where to report bugs against this extension. Accepts a URL string or an object with optional `url` and `email`."
134
+ },
27
135
  "Author": {
28
136
  "type": "object",
29
137
  "properties": {
@@ -36,17 +144,38 @@
36
144
  "title": "Author",
37
145
  "description": "A person credited as a creator or maintainer of this extension."
38
146
  },
39
- "PackageUrl": {
147
+ "PackageIdentityPurl": {
40
148
  "type": "string",
41
149
  "allOf": [
150
+ { "minLength": 1 },
42
151
  {
43
152
  "pattern": "^[Pp][Kk][Gg]:[a-zA-Z][a-zA-Z0-9.+-]*\\/.+$",
44
- "title": "Package URL",
45
- "description": "A Package URL (purl) string identifying a package across ecosystems (e.g. pkg:npm/react@18.2.0).",
46
- "examples": ["pkg:npm/react@18.2.0", "pkg:pypi/requests@2.31.0", "pkg:cargo/serde@1.0"]
153
+ "title": "Package Identity Purl",
154
+ "description": "A Package URL (purl) identity for a companion package. Companion package purls are identities, not pins: omit the purl @version segment and put compatibility constraints in versionRange.",
155
+ "examples": ["pkg:npm/react", "pkg:pypi/requests", "pkg:cargo/serde"]
47
156
  }
48
157
  ]
49
158
  },
159
+ "VersRange": {
160
+ "type": "string",
161
+ "allOf": [
162
+ {
163
+ "minLength": 1,
164
+ "examples": ["vers:npm/>=18.0.0|<19.0.0", "vers:pypi/>=2.31.0", "vers:cargo/>=1.0.0"]
165
+ }
166
+ ]
167
+ },
168
+ "CompanionPackage": {
169
+ "type": "object",
170
+ "properties": {
171
+ "purl": { "$ref": "#/definitions/PackageIdentityPurl" },
172
+ "versionRange": { "anyOf": [{ "$ref": "#/definitions/VersRange" }, { "type": "null" }] }
173
+ },
174
+ "required": ["purl"],
175
+ "additionalProperties": false,
176
+ "title": "Companion Package",
177
+ "description": "A companion package purl identity with an optional VERS compatibility range."
178
+ },
50
179
  "PackSpec": {
51
180
  "type": "string",
52
181
  "allOf": [
@@ -96,16 +225,7 @@
96
225
  { "type": "null" }
97
226
  ]
98
227
  },
99
- "repository": {
100
- "anyOf": [
101
- {
102
- "type": "string",
103
- "examples": ["https://github.com/acme/code-review"],
104
- "format": "uri"
105
- },
106
- { "type": "null" }
107
- ]
108
- },
228
+ "repository": { "anyOf": [{ "$ref": "#/definitions/Repository" }, { "type": "null" }] },
109
229
  "homepage": {
110
230
  "anyOf": [
111
231
  { "type": "string", "examples": ["https://acme.dev/code-review"], "format": "uri" },
@@ -113,21 +233,18 @@
113
233
  ]
114
234
  },
115
235
  "license": {
116
- "anyOf": [
117
- { "type": "string", "allOf": [{ "minLength": 1, "examples": ["MIT", "Apache-2.0"] }] },
118
- { "type": "null" }
119
- ]
120
- },
121
- "bugs": {
122
236
  "anyOf": [
123
237
  {
124
238
  "type": "string",
125
- "examples": ["https://github.com/acme/code-review/issues"],
126
- "format": "uri"
239
+ "title": "License",
240
+ "description": "SPDX license expression, or `UNLICENSED` for proprietary code.",
241
+ "examples": ["MIT", "Apache-2.0", "MIT OR Apache-2.0", "UNLICENSED"],
242
+ "format": "spdx-expression"
127
243
  },
128
244
  { "type": "null" }
129
245
  ]
130
246
  },
247
+ "bugs": { "anyOf": [{ "$ref": "#/definitions/Bugs" }, { "type": "null" }] },
131
248
  "authors": {
132
249
  "anyOf": [
133
250
  { "type": "array", "items": { "$ref": "#/definitions/Author" } },
@@ -138,8 +255,8 @@
138
255
  "anyOf": [
139
256
  {
140
257
  "type": "array",
141
- "description": "External ecosystem packages this extension is designed to work with (e.g. the npm or PyPI package an MCP server wraps), identified by Package URL (purl).",
142
- "items": { "$ref": "#/definitions/PackageUrl" }
258
+ "description": "External ecosystem packages this extension is designed to work with, declared as identity Package URLs with optional VERS compatibility ranges.",
259
+ "items": { "$ref": "#/definitions/CompanionPackage" }
143
260
  },
144
261
  { "type": "null" }
145
262
  ]
@@ -24,6 +24,114 @@
24
24
  }
25
25
  ]
26
26
  },
27
+ "Repository": {
28
+ "anyOf": [
29
+ {
30
+ "type": "string",
31
+ "examples": ["https://github.com/acme/code-review", "github:acme/code-review"],
32
+ "format": "uri-reference"
33
+ },
34
+ {
35
+ "type": "object",
36
+ "properties": {
37
+ "type": {
38
+ "anyOf": [
39
+ {
40
+ "type": "string",
41
+ "allOf": [
42
+ {
43
+ "minLength": 1,
44
+ "description": "Version control system (e.g., `git`).",
45
+ "examples": ["git"]
46
+ }
47
+ ]
48
+ },
49
+ { "type": "null" }
50
+ ]
51
+ },
52
+ "url": {
53
+ "type": "string",
54
+ "allOf": [
55
+ {
56
+ "minLength": 1,
57
+ "description": "Repository URL.",
58
+ "examples": ["https://github.com/acme/code-review"],
59
+ "format": "uri"
60
+ }
61
+ ]
62
+ },
63
+ "directory": {
64
+ "anyOf": [
65
+ {
66
+ "type": "string",
67
+ "allOf": [
68
+ {
69
+ "minLength": 1,
70
+ "description": "Subdirectory within the repository, for monorepo publishers.",
71
+ "examples": ["packages/code-review"]
72
+ }
73
+ ]
74
+ },
75
+ { "type": "null" }
76
+ ]
77
+ }
78
+ },
79
+ "required": ["url"],
80
+ "additionalProperties": false
81
+ }
82
+ ],
83
+ "title": "Repository",
84
+ "description": "Source repository for this extension. Accepts a URL string (or `host:owner/repo` shorthand) or an object with `type`, `url`, and optional `directory`."
85
+ },
86
+ "Bugs": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string",
90
+ "examples": ["https://github.com/acme/code-review/issues"],
91
+ "format": "uri"
92
+ },
93
+ {
94
+ "type": "object",
95
+ "properties": {
96
+ "url": {
97
+ "anyOf": [
98
+ {
99
+ "type": "string",
100
+ "allOf": [
101
+ {
102
+ "minLength": 1,
103
+ "description": "Issue tracker URL.",
104
+ "examples": ["https://github.com/acme/code-review/issues"],
105
+ "format": "uri"
106
+ }
107
+ ]
108
+ },
109
+ { "type": "null" }
110
+ ]
111
+ },
112
+ "email": {
113
+ "anyOf": [
114
+ {
115
+ "type": "string",
116
+ "allOf": [
117
+ {
118
+ "minLength": 1,
119
+ "description": "Contact email for bug reports.",
120
+ "examples": ["bugs@acme.dev"],
121
+ "format": "email"
122
+ }
123
+ ]
124
+ },
125
+ { "type": "null" }
126
+ ]
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ }
131
+ ],
132
+ "title": "Bugs",
133
+ "description": "Where to report bugs against this extension. Accepts a URL string or an object with optional `url` and `email`."
134
+ },
27
135
  "Author": {
28
136
  "type": "object",
29
137
  "properties": {
@@ -36,17 +144,38 @@
36
144
  "title": "Author",
37
145
  "description": "A person credited as a creator or maintainer of this extension."
38
146
  },
39
- "PackageUrl": {
147
+ "PackageIdentityPurl": {
40
148
  "type": "string",
41
149
  "allOf": [
150
+ { "minLength": 1 },
42
151
  {
43
152
  "pattern": "^[Pp][Kk][Gg]:[a-zA-Z][a-zA-Z0-9.+-]*\\/.+$",
44
- "title": "Package URL",
45
- "description": "A Package URL (purl) string identifying a package across ecosystems (e.g. pkg:npm/react@18.2.0).",
46
- "examples": ["pkg:npm/react@18.2.0", "pkg:pypi/requests@2.31.0", "pkg:cargo/serde@1.0"]
153
+ "title": "Package Identity Purl",
154
+ "description": "A Package URL (purl) identity for a companion package. Companion package purls are identities, not pins: omit the purl @version segment and put compatibility constraints in versionRange.",
155
+ "examples": ["pkg:npm/react", "pkg:pypi/requests", "pkg:cargo/serde"]
47
156
  }
48
157
  ]
49
158
  },
159
+ "VersRange": {
160
+ "type": "string",
161
+ "allOf": [
162
+ {
163
+ "minLength": 1,
164
+ "examples": ["vers:npm/>=18.0.0|<19.0.0", "vers:pypi/>=2.31.0", "vers:cargo/>=1.0.0"]
165
+ }
166
+ ]
167
+ },
168
+ "CompanionPackage": {
169
+ "type": "object",
170
+ "properties": {
171
+ "purl": { "$ref": "#/definitions/PackageIdentityPurl" },
172
+ "versionRange": { "anyOf": [{ "$ref": "#/definitions/VersRange" }, { "type": "null" }] }
173
+ },
174
+ "required": ["purl"],
175
+ "additionalProperties": false,
176
+ "title": "Companion Package",
177
+ "description": "A companion package purl identity with an optional VERS compatibility range."
178
+ },
50
179
  "PackSpec": {
51
180
  "type": "string",
52
181
  "allOf": [
@@ -96,16 +225,7 @@
96
225
  { "type": "null" }
97
226
  ]
98
227
  },
99
- "repository": {
100
- "anyOf": [
101
- {
102
- "type": "string",
103
- "examples": ["https://github.com/acme/code-review"],
104
- "format": "uri"
105
- },
106
- { "type": "null" }
107
- ]
108
- },
228
+ "repository": { "anyOf": [{ "$ref": "#/definitions/Repository" }, { "type": "null" }] },
109
229
  "homepage": {
110
230
  "anyOf": [
111
231
  { "type": "string", "examples": ["https://acme.dev/code-review"], "format": "uri" },
@@ -113,21 +233,18 @@
113
233
  ]
114
234
  },
115
235
  "license": {
116
- "anyOf": [
117
- { "type": "string", "allOf": [{ "minLength": 1, "examples": ["MIT", "Apache-2.0"] }] },
118
- { "type": "null" }
119
- ]
120
- },
121
- "bugs": {
122
236
  "anyOf": [
123
237
  {
124
238
  "type": "string",
125
- "examples": ["https://github.com/acme/code-review/issues"],
126
- "format": "uri"
239
+ "title": "License",
240
+ "description": "SPDX license expression, or `UNLICENSED` for proprietary code.",
241
+ "examples": ["MIT", "Apache-2.0", "MIT OR Apache-2.0", "UNLICENSED"],
242
+ "format": "spdx-expression"
127
243
  },
128
244
  { "type": "null" }
129
245
  ]
130
246
  },
247
+ "bugs": { "anyOf": [{ "$ref": "#/definitions/Bugs" }, { "type": "null" }] },
131
248
  "authors": {
132
249
  "anyOf": [
133
250
  { "type": "array", "items": { "$ref": "#/definitions/Author" } },
@@ -138,8 +255,8 @@
138
255
  "anyOf": [
139
256
  {
140
257
  "type": "array",
141
- "description": "External ecosystem packages this extension is designed to work with (e.g. the npm or PyPI package an MCP server wraps), identified by Package URL (purl).",
142
- "items": { "$ref": "#/definitions/PackageUrl" }
258
+ "description": "External ecosystem packages this extension is designed to work with, declared as identity Package URLs with optional VERS compatibility ranges.",
259
+ "items": { "$ref": "#/definitions/CompanionPackage" }
143
260
  },
144
261
  { "type": "null" }
145
262
  ]