release-skill 0.9.17 → 0.9.18

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 (257) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.cursor-plugin/plugin.json +10 -0
  5. package/.kimi-plugin/plugin.json +1 -1
  6. package/.qoder-plugin/plugin.json +1 -1
  7. package/CHANGELOG.md +36 -2
  8. package/INSTALL.md +56 -9
  9. package/INSTALL.zh-CN.md +41 -7
  10. package/README.md +31 -20
  11. package/README.zh-CN.md +29 -19
  12. package/adapters/claude/.claude-plugin/plugin.json +1 -1
  13. package/adapters/claude/bin/consumer-contract-vectors.json +7 -7
  14. package/adapters/claude/bin/error-codes.json +1 -1
  15. package/adapters/claude/bin/foundation-resource-binding.json +1 -1
  16. package/adapters/claude/bin/prebuild-manifest.json +8 -4
  17. package/adapters/claude/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  18. package/adapters/claude/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  19. package/adapters/claude/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  20. package/adapters/claude/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  21. package/adapters/claude/bin/registry.json +1 -1
  22. package/adapters/claude/bin/release-skill.bundle.mjs +3560 -1200
  23. package/adapters/claude/bin/rules.json +1 -1
  24. package/adapters/claude/data/hosts/cursor/host-descriptor.json +34 -0
  25. package/adapters/claude/data/hosts/registry.json +1 -0
  26. package/adapters/claude/schemas/release-plan.schema.json +255 -25
  27. package/adapters/claude/schemas/release-project.schema.json +228 -26
  28. package/adapters/claude/skills/release-finish/SKILL.md +17 -4
  29. package/adapters/claude/skills/release-help/SKILL.md +40 -39
  30. package/adapters/claude/src/schemas/host-descriptor.schema.json +9 -2
  31. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  32. package/adapters/codex/bin/consumer-contract-vectors.json +7 -7
  33. package/adapters/codex/bin/error-codes.json +1 -1
  34. package/adapters/codex/bin/foundation-resource-binding.json +1 -1
  35. package/adapters/codex/bin/prebuild-manifest.json +8 -4
  36. package/adapters/codex/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  37. package/adapters/codex/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  38. package/adapters/codex/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  39. package/adapters/codex/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  40. package/adapters/codex/bin/registry.json +1 -1
  41. package/adapters/codex/bin/release-skill.bundle.mjs +3560 -1200
  42. package/adapters/codex/bin/rules.json +1 -1
  43. package/adapters/codex/data/hosts/cursor/host-descriptor.json +34 -0
  44. package/adapters/codex/data/hosts/registry.json +1 -0
  45. package/adapters/codex/schemas/release-plan.schema.json +255 -25
  46. package/adapters/codex/schemas/release-project.schema.json +228 -26
  47. package/adapters/codex/skills/release-finish/SKILL.md +17 -4
  48. package/adapters/codex/skills/release-help/SKILL.md +40 -39
  49. package/adapters/codex/src/schemas/host-descriptor.schema.json +9 -2
  50. package/adapters/cursor/.cursor-plugin/plugin.json +10 -0
  51. package/adapters/cursor/bin/consumer-contract-vectors.json +110 -0
  52. package/adapters/cursor/bin/error-codes.json +161 -0
  53. package/adapters/cursor/bin/foundation-legal/skill-family-contracts/LICENSE +202 -0
  54. package/adapters/cursor/bin/foundation-legal/skill-family-contracts/NOTICE +10 -0
  55. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/LICENSE +202 -0
  56. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/NOTICE +10 -0
  57. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/THIRD_PARTY_NOTICES +142 -0
  58. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/LICENSE +202 -0
  59. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/NOTICE +10 -0
  60. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/native-NOTICE +2 -0
  61. package/adapters/cursor/bin/foundation-resource-binding.json +1 -0
  62. package/adapters/cursor/bin/kernel-protocol.json +60 -0
  63. package/adapters/cursor/bin/license-texts/Apache-2.0.txt +201 -0
  64. package/adapters/cursor/bin/license-texts/MIT.txt +21 -0
  65. package/adapters/cursor/bin/prebuild-manifest.json +83 -0
  66. package/adapters/cursor/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  67. package/adapters/cursor/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  68. package/adapters/cursor/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  69. package/adapters/cursor/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  70. package/adapters/cursor/bin/registry.json +347 -0
  71. package/adapters/cursor/bin/release-skill-local-finish.mjs +4 -0
  72. package/adapters/cursor/bin/release-skill.bundle.mjs +151806 -0
  73. package/adapters/cursor/bin/release-skill.mjs +54 -0
  74. package/adapters/cursor/bin/rules.json +104 -0
  75. package/adapters/cursor/bin/schemas/consumer-contract-vector.schema.json +149 -0
  76. package/adapters/cursor/data/hosts/claude/host-descriptor.json +45 -0
  77. package/adapters/cursor/data/hosts/codebuddy/host-descriptor.json +26 -0
  78. package/adapters/cursor/data/hosts/codex/host-descriptor.json +45 -0
  79. package/adapters/cursor/data/hosts/cursor/host-descriptor.json +34 -0
  80. package/adapters/cursor/data/hosts/deepseek-harness/host-descriptor.json +23 -0
  81. package/adapters/cursor/data/hosts/kimi-code/host-descriptor.json +36 -0
  82. package/adapters/cursor/data/hosts/qoder/host-descriptor.json +26 -0
  83. package/adapters/cursor/data/hosts/registry.json +14 -0
  84. package/adapters/cursor/data/hosts/workbuddy/host-descriptor.json +34 -0
  85. package/adapters/cursor/data/licensing/registry.json +211 -0
  86. package/adapters/cursor/data/licensing/schema.json +207 -0
  87. package/adapters/cursor/native/safe-write/binding.gyp +41 -0
  88. package/adapters/cursor/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  89. package/adapters/cursor/native/safe-write/prebuilds.json +24 -0
  90. package/adapters/cursor/native/safe-write/src/safe_write.cc +2032 -0
  91. package/adapters/cursor/schemas/.render-manifest.json +41 -0
  92. package/adapters/cursor/schemas/approval-record.schema.json +115 -0
  93. package/adapters/cursor/schemas/artifact-lock.schema.json +111 -0
  94. package/adapters/cursor/schemas/artifact-plan.schema.json +52 -0
  95. package/adapters/cursor/schemas/artifact-policy.schema.json +76 -0
  96. package/adapters/cursor/schemas/evidence-event-v2.schema.json +164 -0
  97. package/adapters/cursor/schemas/evidence-event.schema.json +89 -0
  98. package/adapters/cursor/schemas/postpublish-approval-record.schema.json +47 -0
  99. package/adapters/cursor/schemas/release-plan.schema.json +2226 -0
  100. package/adapters/cursor/schemas/release-project.schema.json +1815 -0
  101. package/adapters/cursor/schemas/release-run.schema.json +777 -0
  102. package/adapters/cursor/skills/release-assess/SKILL.md +61 -0
  103. package/adapters/cursor/skills/release-config/SKILL.md +151 -0
  104. package/adapters/cursor/skills/release-docs/SKILL.md +120 -0
  105. package/adapters/cursor/skills/release-finish/SKILL.md +155 -0
  106. package/adapters/cursor/skills/release-help/SKILL.md +155 -0
  107. package/adapters/cursor/skills/release-marketplace/SKILL.md +157 -0
  108. package/adapters/cursor/skills/release-prepare/SKILL.md +136 -0
  109. package/adapters/cursor/skills/release-publish/SKILL.md +92 -0
  110. package/adapters/cursor/skills/release-reconcile/SKILL.md +81 -0
  111. package/adapters/cursor/skills/release-setup/SKILL.md +132 -0
  112. package/adapters/cursor/skills/release-verify/SKILL.md +110 -0
  113. package/adapters/cursor/src/schemas/adapter-build-manifest.schema.json +41 -0
  114. package/adapters/cursor/src/schemas/adapter-peer-verification-request.schema.json +54 -0
  115. package/adapters/cursor/src/schemas/adapter-peer-verification-result.schema.json +54 -0
  116. package/adapters/cursor/src/schemas/adapter-source.schema.json +47 -0
  117. package/adapters/cursor/src/schemas/audit-baseline-pin.schema.json +163 -0
  118. package/adapters/cursor/src/schemas/declared-read-surface-result.schema.json +61 -0
  119. package/adapters/cursor/src/schemas/engineering-baseline.schema.json +77 -0
  120. package/adapters/cursor/src/schemas/executable-identity-observation.schema.json +162 -0
  121. package/adapters/cursor/src/schemas/filesystem-root-binding.schema.json +14 -0
  122. package/adapters/cursor/src/schemas/filesystem-tree-observation.schema.json +71 -0
  123. package/adapters/cursor/src/schemas/fixed-set-publication-manifest.schema.json +108 -0
  124. package/adapters/cursor/src/schemas/fixed-set-publication-receipt.schema.json +148 -0
  125. package/adapters/cursor/src/schemas/host-capability-fact.schema.json +31 -0
  126. package/adapters/cursor/src/schemas/host-descriptor.schema.json +144 -0
  127. package/adapters/cursor/src/schemas/host-operation-plan.schema.json +57 -0
  128. package/adapters/cursor/src/schemas/host-operation-receipt.schema.json +81 -0
  129. package/adapters/cursor/src/schemas/host-probe-result.schema.json +30 -0
  130. package/adapters/cursor/src/schemas/host-registry.schema.json +18 -0
  131. package/adapters/cursor/src/schemas/host-verification-request.schema.json +67 -0
  132. package/adapters/cursor/src/schemas/host-verification-result.schema.json +149 -0
  133. package/adapters/cursor/src/schemas/managed-file-lock.schema.json +77 -0
  134. package/adapters/cursor/src/schemas/migration-manifest.schema.json +412 -0
  135. package/adapters/cursor/src/schemas/observation-scope.schema.json +91 -0
  136. package/adapters/cursor/src/schemas/operation-request.schema.json +58 -0
  137. package/adapters/cursor/src/schemas/operation-result.schema.json +130 -0
  138. package/adapters/cursor/src/schemas/platform-difference-registry.schema.json +110 -0
  139. package/adapters/cursor/src/schemas/plugin-verification-request.schema.json +499 -0
  140. package/adapters/cursor/src/schemas/plugin-verification-result.schema.json +1217 -0
  141. package/adapters/cursor/src/schemas/profile-adoption-declaration.schema.json +111 -0
  142. package/adapters/cursor/src/schemas/profile-descriptor.schema.json +99 -0
  143. package/adapters/cursor/src/schemas/project-manifest.schema.json +67 -0
  144. package/adapters/cursor/src/schemas/project-profile.schema.json +25 -0
  145. package/adapters/cursor/src/schemas/public-boundary-declaration.schema.json +73 -0
  146. package/adapters/cursor/src/schemas/report-binding.schema.json +42 -0
  147. package/adapters/cursor/src/schemas/report-model.schema.json +308 -0
  148. package/adapters/cursor/src/schemas/skill-family-directory-verification-request.schema.json +100 -0
  149. package/adapters/cursor/src/schemas/skill-family-directory-verification-result.schema.json +193 -0
  150. package/adapters/cursor/src/schemas/source-authority-receipt.schema.json +31 -0
  151. package/adapters/cursor/src/schemas/state-event-envelope.schema.json +38 -0
  152. package/adapters/cursor/src/schemas/state-snapshot-metadata.schema.json +25 -0
  153. package/adapters/cursor/src/schemas/structured-scan-policy.schema.json +97 -0
  154. package/adapters/cursor/src/schemas/surface-scan-policy.schema.json +42 -0
  155. package/adapters/cursor/src/schemas/timeout-policy.schema.json +24 -0
  156. package/adapters/cursor/src/schemas/token-estimate-record.schema.json +75 -0
  157. package/adapters/cursor/src/schemas/token-estimate-result.schema.json +43 -0
  158. package/adapters/cursor/src/schemas/watchdog-termination-envelope.schema.json +156 -0
  159. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  160. package/adapters/kimi/bin/consumer-contract-vectors.json +7 -7
  161. package/adapters/kimi/bin/error-codes.json +1 -1
  162. package/adapters/kimi/bin/foundation-resource-binding.json +1 -1
  163. package/adapters/kimi/bin/prebuild-manifest.json +8 -4
  164. package/adapters/kimi/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  165. package/adapters/kimi/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  166. package/adapters/kimi/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  167. package/adapters/kimi/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  168. package/adapters/kimi/bin/registry.json +1 -1
  169. package/adapters/kimi/bin/release-skill.bundle.mjs +3560 -1200
  170. package/adapters/kimi/bin/rules.json +1 -1
  171. package/adapters/kimi/data/hosts/cursor/host-descriptor.json +34 -0
  172. package/adapters/kimi/data/hosts/registry.json +1 -0
  173. package/adapters/kimi/schemas/release-plan.schema.json +255 -25
  174. package/adapters/kimi/schemas/release-project.schema.json +228 -26
  175. package/adapters/kimi/skills/release-finish/SKILL.md +17 -4
  176. package/adapters/kimi/skills/release-help/SKILL.md +40 -39
  177. package/adapters/kimi/src/schemas/host-descriptor.schema.json +9 -2
  178. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  179. package/adapters/qoder/bin/consumer-contract-vectors.json +7 -7
  180. package/adapters/qoder/bin/error-codes.json +1 -1
  181. package/adapters/qoder/bin/foundation-resource-binding.json +1 -1
  182. package/adapters/qoder/bin/prebuild-manifest.json +8 -4
  183. package/adapters/qoder/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  184. package/adapters/qoder/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  185. package/adapters/qoder/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  186. package/adapters/qoder/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  187. package/adapters/qoder/bin/registry.json +1 -1
  188. package/adapters/qoder/bin/release-skill.bundle.mjs +3560 -1200
  189. package/adapters/qoder/bin/rules.json +1 -1
  190. package/adapters/qoder/data/hosts/cursor/host-descriptor.json +34 -0
  191. package/adapters/qoder/data/hosts/registry.json +1 -0
  192. package/adapters/qoder/schemas/release-plan.schema.json +255 -25
  193. package/adapters/qoder/schemas/release-project.schema.json +228 -26
  194. package/adapters/qoder/skills/release-finish/SKILL.md +17 -4
  195. package/adapters/qoder/skills/release-help/SKILL.md +40 -39
  196. package/adapters/qoder/src/schemas/host-descriptor.schema.json +9 -2
  197. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  198. package/adapters/workbuddy/bin/consumer-contract-vectors.json +7 -7
  199. package/adapters/workbuddy/bin/error-codes.json +1 -1
  200. package/adapters/workbuddy/bin/foundation-resource-binding.json +1 -1
  201. package/adapters/workbuddy/bin/prebuild-manifest.json +8 -4
  202. package/adapters/workbuddy/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  203. package/adapters/workbuddy/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  204. package/adapters/workbuddy/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  205. package/adapters/workbuddy/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  206. package/adapters/workbuddy/bin/registry.json +1 -1
  207. package/adapters/workbuddy/bin/release-skill.bundle.mjs +3560 -1200
  208. package/adapters/workbuddy/bin/rules.json +1 -1
  209. package/adapters/workbuddy/data/hosts/cursor/host-descriptor.json +34 -0
  210. package/adapters/workbuddy/data/hosts/registry.json +1 -0
  211. package/adapters/workbuddy/schemas/release-plan.schema.json +255 -25
  212. package/adapters/workbuddy/schemas/release-project.schema.json +228 -26
  213. package/adapters/workbuddy/skills/release-finish/SKILL.md +17 -4
  214. package/adapters/workbuddy/skills/release-help/SKILL.md +40 -39
  215. package/adapters/workbuddy/src/schemas/host-descriptor.schema.json +9 -2
  216. package/bin/consumer-contract-vectors.json +7 -7
  217. package/bin/error-codes.json +1 -1
  218. package/bin/foundation-resource-binding.json +1 -1
  219. package/bin/prebuild-manifest.json +8 -4
  220. package/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  221. package/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  222. package/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  223. package/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  224. package/bin/registry.json +1 -1
  225. package/bin/release-skill-cli.mjs +25 -1
  226. package/bin/release-skill.bundle.mjs +3560 -1200
  227. package/bin/rules.json +1 -1
  228. package/data/hosts/cursor/host-descriptor.json +34 -0
  229. package/data/hosts/registry.json +1 -0
  230. package/package.json +7 -5
  231. package/platform-manifest.json +75 -9
  232. package/schemas/release-plan.schema.json +255 -25
  233. package/schemas/release-project.schema.json +228 -26
  234. package/scripts/sync-public-files.mjs +3 -22
  235. package/skills/release-finish/SKILL.md +17 -4
  236. package/skills/release-help/SKILL.md +40 -39
  237. package/skills-src/release-finish/SKILL.md +17 -4
  238. package/skills-src/release-help/SKILL.md +40 -39
  239. package/src/adapters/contract.mjs +1 -0
  240. package/src/adapters/plugin-marketplace.mjs +201 -9
  241. package/src/commands/post-release-local.mjs +290 -34
  242. package/src/commands/prepare.mjs +74 -9
  243. package/src/commands/publish.mjs +4 -1
  244. package/src/commands/ship.mjs +2 -0
  245. package/src/commands/verify.mjs +73 -0
  246. package/src/core/checkpoints.mjs +5 -2
  247. package/src/core/config.mjs +1 -1
  248. package/src/core/foundation-host-verification.mjs +168 -0
  249. package/src/core/plan.mjs +19 -1
  250. package/src/core/postpublish.mjs +9 -1
  251. package/src/core/run-retention.mjs +1 -1
  252. package/src/core/surface-host-bindings.mjs +1 -0
  253. package/src/core/verification-gates.mjs +1 -1
  254. package/src/platforms/registry.mjs +225 -16
  255. package/src/producers/build-adapters.mjs +21 -26
  256. package/src/producers/foundation-resource-projection.mjs +3 -3
  257. package/src/schemas/host-descriptor.schema.json +9 -2
@@ -132,6 +132,70 @@ function codexCrossValidateListEntry(found, action) {
132
132
  return { ok: true };
133
133
  }
134
134
 
135
+ // --- qoder strategy -------------------------------------------------------
136
+
137
+ function qoderParseListOutput(listOutput, pluginId) {
138
+ if (!Array.isArray(listOutput)) {
139
+ return { ok: false, error: 'Qoder plugin list did not return an array' };
140
+ }
141
+ const matches = listOutput.filter((entry) => entry?.id === pluginId);
142
+ if (matches.length === 0) {
143
+ return { ok: false, error: `plugin "${pluginId}" not found in Qoder plugin list` };
144
+ }
145
+ if (matches.length !== 1) {
146
+ return { ok: false, error: `plugin "${pluginId}" has duplicate Qoder list entries` };
147
+ }
148
+ const [found] = matches;
149
+ if (typeof found.installPath !== 'string' || found.installPath.length === 0) {
150
+ return { ok: false, error: `plugin "${pluginId}" found but missing installPath` };
151
+ }
152
+ return { ok: true, found, installPath: found.installPath };
153
+ }
154
+
155
+ function qoderParseMarketplaceListOutput(listOutput, marketplace) {
156
+ if (!Array.isArray(listOutput)) {
157
+ return { ok: false, error: 'Qoder marketplace list did not return an array' };
158
+ }
159
+ const matches = listOutput.filter((entry) => entry?.name === marketplace);
160
+ if (matches.length === 0) {
161
+ return { ok: false, error: `marketplace "${marketplace}" not found in Qoder marketplace list` };
162
+ }
163
+ if (matches.length !== 1) {
164
+ return { ok: false, error: `marketplace "${marketplace}" has duplicate Qoder list entries` };
165
+ }
166
+ const [found] = matches;
167
+ if (found.source?.source !== 'git' || typeof found.source.url !== 'string' || found.source.url.length === 0) {
168
+ return { ok: false, error: `marketplace "${marketplace}" has invalid Qoder git source` };
169
+ }
170
+ if (typeof found.installLocation !== 'string' || found.installLocation.length === 0) {
171
+ return { ok: false, error: `marketplace "${marketplace}" found but missing installLocation` };
172
+ }
173
+ return { ok: true, found, installPath: found.installLocation };
174
+ }
175
+
176
+ function qoderExtractInstallPath({ listParsed }) {
177
+ return { ok: true, installPath: listParsed?.installPath };
178
+ }
179
+
180
+ function qoderExtractListIdentity(found) {
181
+ return {
182
+ plugin: found.name,
183
+ marketplace: String(found.id ?? '').split('@').slice(1).join('@'),
184
+ version: found.version,
185
+ };
186
+ }
187
+
188
+ function qoderCrossValidateListEntry(found, action) {
189
+ const selector = `${action.plugin}@${action.marketplace}`;
190
+ if (found.name !== action.plugin || found.source !== selector || found.scope !== 'user') {
191
+ return { ok: false, error: `Qoder plugin "${selector}" does not match its frozen user-scope identity` };
192
+ }
193
+ if (found.version !== action.version) {
194
+ return { ok: false, error: `list version "${found.version}" does not match action version "${action.version}"` };
195
+ }
196
+ return { ok: true };
197
+ }
198
+
135
199
  // --- platform descriptors --------------------------------------------------
136
200
 
137
201
  const CLAUDE = Object.freeze({
@@ -188,6 +252,7 @@ const CLAUDE = Object.freeze({
188
252
  pluginDirName: '.claude-plugin',
189
253
  templateFileName: 'plugin.json',
190
254
  hasMarketplace: false,
255
+ enabled: true,
191
256
  }),
192
257
  strategy: Object.freeze({
193
258
  parseListOutput: claudeParseListOutput,
@@ -249,6 +314,7 @@ const CODEX = Object.freeze({
249
314
  templateFileName: 'plugin.json',
250
315
  marketplaceFileName: null,
251
316
  hasMarketplace: false,
317
+ enabled: true,
252
318
  }),
253
319
  strategy: Object.freeze({
254
320
  parseListOutput: codexParseListOutput,
@@ -309,6 +375,7 @@ const KIMI = Object.freeze({
309
375
  templateFileName: 'plugin.json',
310
376
  marketplaceFileName: null,
311
377
  hasMarketplace: false,
378
+ enabled: true,
312
379
  }),
313
380
  strategy: Object.freeze({
314
381
  parseListOutput: null,
@@ -395,6 +462,7 @@ const CODEBUDDY = Object.freeze({
395
462
  templateFileName: 'plugin.json',
396
463
  marketplaceFileName: null,
397
464
  hasMarketplace: false,
465
+ enabled: true,
398
466
  }),
399
467
  strategy: Object.freeze({
400
468
  parseListOutput: null,
@@ -408,20 +476,126 @@ const CODEBUDDY = Object.freeze({
408
476
  }),
409
477
  });
410
478
 
411
- /** Ordered platform registry. Order is significant (claude, codex, kimi, codebuddy). */
412
- export const PLATFORMS = Object.freeze([CLAUDE, CODEX, KIMI, CODEBUDDY]);
479
+ const QODER = Object.freeze({
480
+ id: 'qoder',
481
+ skillProjectionSurface: 'platforms/qoder',
482
+ distributionType: 'qoder-plugin',
483
+ actionType: 'qoder-marketplace-install',
484
+ adapter: 'plugin-marketplace',
485
+ automatable: true,
486
+ installMethod: 'structured-cli',
487
+ // Qoder's marketplace-add command follows the marketplace default branch;
488
+ // the frozen commit is checked from the materialized Hub checkout before
489
+ // installation, so marketplace add itself is not treated as a ref pin.
490
+ refStrength: 'commit-sha',
491
+ outputProtocol: 'structured',
492
+ identityEvidence: 'list-record',
493
+ degradationPolicy: 'block',
494
+ cli: Object.freeze({
495
+ binary: 'qodercli',
496
+ binaryAliases: Object.freeze(['qoder']),
497
+ marketplaceAdd: (repo) => ['plugins', 'marketplace', 'add', repo, '--scope', 'user'],
498
+ install: (plugin, marketplace) => ['plugins', 'install', `${plugin}@${marketplace}`, '--scope', 'user', '--json'],
499
+ marketplaceList: () => ['plugins', 'marketplace', 'list', '--json'],
500
+ list: () => ['plugins', 'list', '--json'],
501
+ }),
502
+ jsonProtocol: Object.freeze({
503
+ listOutput: 'array',
504
+ installPathSource: 'list',
505
+ marketplaceAddOutput: null,
506
+ pluginInstallOutput: null,
507
+ }),
508
+ isolationEnv: (home) => ({ HOME: home }),
509
+ isolationSubdirs: Object.freeze(['.qoder']),
510
+ manifestPaths: Object.freeze({
511
+ plugin: '.qoder-plugin/plugin.json',
512
+ marketplace: null,
513
+ }),
514
+ marketplaceSourceForm: null,
515
+ marketplaceEntryCarriesVersion: false,
516
+ marketplaceRefForm: null,
517
+ knownHostArtifacts: Object.freeze(['.git']),
518
+ schemaRequiredFields: Object.freeze(['plugin', 'marketplace', 'entrySkill']),
519
+ skillRendering: Object.freeze({ mode: 'substitute', preamble: 'qoder', placeholder: '${CLAUDE_PLUGIN_ROOT}' }),
520
+ buildAdapter: Object.freeze({
521
+ name: 'qoder',
522
+ pluginDirName: '.qoder-plugin',
523
+ templateFileName: 'plugin.json',
524
+ marketplaceFileName: null,
525
+ hasMarketplace: false,
526
+ enabled: true,
527
+ }),
528
+ strategy: Object.freeze({
529
+ parseListOutput: qoderParseListOutput,
530
+ parseMarketplaceListOutput: qoderParseMarketplaceListOutput,
531
+ extractInstallPath: qoderExtractInstallPath,
532
+ extractListIdentity: qoderExtractListIdentity,
533
+ crossValidateListEntry: qoderCrossValidateListEntry,
534
+ buildManualRequirement: null,
535
+ readManifest: null,
536
+ }),
537
+ });
413
538
 
414
- const VALID_DISTRIBUTION_TYPES = new Set(['claude-plugin', 'codex-plugin', 'kimi-plugin', 'codebuddy-plugin']);
415
- const VALID_ACTION_TYPES = new Set(['claude-marketplace-install', 'codex-marketplace-install', 'kimi-marketplace-install', 'codebuddy-marketplace-install']);
539
+ const CURSOR = Object.freeze({
540
+ id: 'cursor',
541
+ skillProjectionSurface: 'platforms/cursor',
542
+ distributionType: 'cursor-plugin',
543
+ actionType: null,
544
+ adapter: null,
545
+ automatable: true,
546
+ installMethod: 'foundation-host-verification',
547
+ refStrength: 'local-payload',
548
+ outputProtocol: 'structured',
549
+ identityEvidence: 'host-verification-result',
550
+ degradationPolicy: 'block',
551
+ cli: null,
552
+ jsonProtocol: Object.freeze({
553
+ listOutput: null,
554
+ installPathSource: null,
555
+ marketplaceAddOutput: null,
556
+ pluginInstallOutput: null,
557
+ }),
558
+ isolationEnv: null,
559
+ isolationSubdirs: Object.freeze([]),
560
+ manifestPaths: Object.freeze({ plugin: null, marketplace: null }),
561
+ marketplaceSourceForm: null,
562
+ marketplaceEntryCarriesVersion: null,
563
+ marketplaceRefForm: null,
564
+ knownHostArtifacts: Object.freeze([]),
565
+ schemaRequiredFields: Object.freeze(['entrySkill']),
566
+ skillRendering: null,
567
+ buildAdapter: Object.freeze({
568
+ name: 'cursor',
569
+ pluginDirName: '.cursor-plugin',
570
+ templateFileName: 'plugin.json',
571
+ marketplaceFileName: null,
572
+ hasMarketplace: false,
573
+ enabled: true,
574
+ }),
575
+ strategy: Object.freeze({
576
+ parseListOutput: null,
577
+ extractInstallPath: null,
578
+ extractListIdentity: null,
579
+ crossValidateListEntry: null,
580
+ buildManualRequirement: null,
581
+ readManifest: null,
582
+ }),
583
+ });
584
+
585
+ /** Ordered platform registry. Order is significant. */
586
+ export const PLATFORMS = Object.freeze([CLAUDE, CODEX, KIMI, CODEBUDDY, QODER, CURSOR]);
587
+
588
+ const VALID_DISTRIBUTION_TYPES = new Set(['claude-plugin', 'codex-plugin', 'kimi-plugin', 'codebuddy-plugin', 'qoder-plugin', 'cursor-plugin']);
589
+ const VALID_ACTION_TYPES = new Set(['claude-marketplace-install', 'codex-marketplace-install', 'kimi-marketplace-install', 'codebuddy-marketplace-install', 'qoder-marketplace-install', null]);
416
590
  const VALID_SOURCE_FORMS = new Set(['string', 'local-path-object', null]);
417
591
  const VALID_MARKETPLACE_REF_FORMS = new Set(['sha', 'name', null]);
418
592
  const VALID_LIST_OUTPUTS = new Set(['array', 'installed-object', null]);
419
593
  const VALID_CLI_OUTPUTS = new Set(['json', null]);
420
594
  const VALID_ENTRY_VERSION_BINDING = new Set([true, false, null]);
421
- const VALID_INSTALL_METHODS = new Set(['structured-cli', 'interactive-only', 'human-attestation']);
422
- const VALID_REF_STRENGTHS = new Set(['commit-sha', 'name-ref', 'unfixable']);
595
+ const VALID_INSTALL_METHODS = new Set(['structured-cli', 'interactive-only', 'human-attestation', 'foundation-host-verification']);
596
+ const VALID_REF_STRENGTHS = new Set(['commit-sha', 'name-ref', 'unfixable', 'local-payload']);
423
597
  const VALID_OUTPUT_PROTOCOLS = new Set(['structured', 'text', 'none']);
424
- const VALID_IDENTITY_EVIDENCE = new Set(['list-record', 'install-output', 'filesystem-payload', 'human-attestation']);
598
+ const VALID_IDENTITY_EVIDENCE = new Set(['list-record', 'install-output', 'filesystem-payload', 'human-attestation', 'host-verification-result']);
425
599
  const VALID_DEGRADATION_POLICIES = new Set(['block', 'human-attestation', 'human-attestation-with-fallback']);
426
600
  const SKILL_PROJECTION_SURFACE_PATTERN = /^platforms\/[a-z0-9]+(?:-[a-z0-9]+)*$/u;
427
601
 
@@ -442,19 +616,19 @@ const STANDALONE_SHA_RE = /^[0-9a-f]{40}$/u;
442
616
  function standaloneIdentityCore(platformOrId, fields) {
443
617
  const platform = typeof platformOrId === 'string' ? getPlatform(platformOrId) : platformOrId;
444
618
  const id = platform?.id;
445
- if (id !== 'claude' && id !== 'codex') {
619
+ if (!['claude', 'codex', 'qoder'].includes(id)) {
446
620
  throw new Error(`standalone-index install identity is unsupported for platform "${id ?? '<unknown>'}"`);
447
621
  }
448
622
  const { name, source, version } = fields;
449
623
  if (typeof name !== 'string' || name.length === 0
450
624
  || !source || typeof source !== 'object' || Array.isArray(source)
451
625
  || typeof source.source !== 'string'
452
- || typeof source.ref !== 'string' || source.ref.length === 0
453
626
  || typeof source.sha !== 'string' || !STANDALONE_SHA_RE.test(source.sha)) {
454
627
  throw new Error(`${id} standalone-index install identity has invalid owned fields`);
455
628
  }
456
629
  if (id === 'claude') {
457
- if (source.source !== 'github' || typeof source.repo !== 'string' || source.repo.length === 0
630
+ if (typeof source.ref !== 'string' || source.ref.length === 0
631
+ || source.source !== 'github' || typeof source.repo !== 'string' || source.repo.length === 0
458
632
  || typeof version !== 'string' || version.length === 0) {
459
633
  throw new Error('Claude standalone-index install identity requires github repo, ref, sha, and version');
460
634
  }
@@ -465,6 +639,12 @@ function standaloneIdentityCore(platformOrId, fields) {
465
639
  };
466
640
  }
467
641
  if (source.source !== 'url' || typeof source.url !== 'string' || source.url.length === 0) {
642
+ throw new Error(`${id === 'qoder' ? 'Qoder' : 'Codex'} standalone-index install identity requires url and sha`);
643
+ }
644
+ if (id === 'qoder') {
645
+ return { name, source: { source: 'url', url: source.url, sha: source.sha } };
646
+ }
647
+ if (typeof source.ref !== 'string' || source.ref.length === 0) {
468
648
  throw new Error('Codex standalone-index install identity requires url, ref, and sha');
469
649
  }
470
650
  return {
@@ -494,6 +674,12 @@ export function buildExpectedStandaloneIndexInstallIdentity(platformOrId, frozen
494
674
  source: { source: 'url', url: `https://github.com/${repo}.git`, ref: `refs/tags/${tag}`, sha },
495
675
  });
496
676
  }
677
+ if (id === 'qoder') {
678
+ return standaloneIdentityCore(platform, {
679
+ name,
680
+ source: { source: 'url', url: `https://github.com/${repo}.git`, sha },
681
+ });
682
+ }
497
683
  return standaloneIdentityCore(platform, { name, source: {}, version });
498
684
  }
499
685
 
@@ -531,6 +717,12 @@ export function projectObservedStandaloneIndexInstallIdentity(platformOrId, entr
531
717
  },
532
718
  });
533
719
  }
720
+ if (id === 'qoder') {
721
+ return standaloneIdentityCore(platform, {
722
+ name: entry.name,
723
+ source: { source: source.source, url: source.url, sha: source.sha },
724
+ });
725
+ }
534
726
  return standaloneIdentityCore(platform, { name: entry.name, source });
535
727
  }
536
728
 
@@ -573,16 +765,22 @@ export function assertRegistry(registry = PLATFORMS) {
573
765
  if (!VALID_ACTION_TYPES.has(platform.actionType)) {
574
766
  throw new Error(`platform registry: ${label} has illegal actionType "${platform.actionType}"`);
575
767
  }
576
- if (typeof platform.adapter !== 'string' || platform.adapter.length === 0) {
768
+ if (platform.installMethod !== 'foundation-host-verification'
769
+ && (typeof platform.adapter !== 'string' || platform.adapter.length === 0)) {
577
770
  throw new Error(`platform registry: ${label} needs a non-empty adapter id`);
578
771
  }
772
+ if (platform.installMethod === 'foundation-host-verification'
773
+ && (platform.actionType !== null || platform.adapter !== null)) {
774
+ throw new Error(`platform registry: ${label} host verification must not declare a checkpoint action or adapter`);
775
+ }
579
776
  if (!VALID_ENTRY_VERSION_BINDING.has(platform.marketplaceEntryCarriesVersion)) {
580
777
  throw new Error(`platform registry: ${label} has illegal marketplaceEntryCarriesVersion "${platform.marketplaceEntryCarriesVersion}"`);
581
778
  }
582
779
  if (typeof platform.automatable !== 'boolean') {
583
780
  throw new Error(`platform registry: ${label} automatable must be boolean`);
584
781
  }
585
- if (typeof platform.isolationEnv !== 'function') {
782
+ if (platform.installMethod !== 'foundation-host-verification'
783
+ && typeof platform.isolationEnv !== 'function') {
586
784
  throw new Error(`platform registry: ${label} isolationEnv must be a function`);
587
785
  }
588
786
  if (!VALID_SOURCE_FORMS.has(platform.marketplaceSourceForm)) {
@@ -603,6 +801,9 @@ export function assertRegistry(registry = PLATFORMS) {
603
801
  if (!platform.buildAdapter || typeof platform.buildAdapter !== 'object') {
604
802
  throw new Error(`platform registry: ${label} buildAdapter must be an object`);
605
803
  }
804
+ if (typeof platform.buildAdapter.enabled !== 'boolean') {
805
+ throw new Error(`platform registry: ${label} buildAdapter.enabled must be boolean`);
806
+ }
606
807
  // D6: the adapter directory name is always explicit — prepare's G4
607
808
  // declared-host reconciliation and the build producer both key on it.
608
809
  if (typeof platform.buildAdapter.name !== 'string' || platform.buildAdapter.name.length === 0) {
@@ -649,7 +850,11 @@ export function assertRegistry(registry = PLATFORMS) {
649
850
  throw new Error(`platform registry: ${label} has illegal degradationPolicy "${platform.degradationPolicy}"`);
650
851
  }
651
852
 
652
- if (platform.automatable) {
853
+ if (platform.installMethod === 'foundation-host-verification') {
854
+ if (platform.cli !== null) {
855
+ throw new Error(`platform registry: ${label} Foundation host verification must have cli === null`);
856
+ }
857
+ } else if (platform.automatable) {
653
858
  if (!platform.cli || typeof platform.cli.marketplaceAdd !== 'function'
654
859
  || typeof platform.cli.install !== 'function' || typeof platform.cli.list !== 'function') {
655
860
  throw new Error(`platform registry: automatable platform ${label} needs cli template functions`);
@@ -690,7 +895,8 @@ export function assertRegistry(registry = PLATFORMS) {
690
895
 
691
896
  // --- capability contract consistency rules (能力契约一致性规则) -----------
692
897
  // automatable === true 必须有 installMethod === 'structured-cli'
693
- if (platform.automatable === true && platform.installMethod !== 'structured-cli') {
898
+ if (platform.automatable === true
899
+ && !['structured-cli', 'foundation-host-verification'].includes(platform.installMethod)) {
694
900
  throw new Error(`platform registry: ${label} is automatable but installMethod is "${platform.installMethod}" (expected "structured-cli")`);
695
901
  }
696
902
  // automatable === false 必须有 installMethod !== 'structured-cli'
@@ -728,6 +934,9 @@ export function resolvePlatformRoute(platform) {
728
934
  if (installMethod === 'interactive-only' || installMethod === 'human-attestation') {
729
935
  return { route: 'human-attestation', reason: `installMethod is ${installMethod}` };
730
936
  }
937
+ if (installMethod === 'foundation-host-verification') {
938
+ return { route: 'host-verification', reason: 'installMethod is foundation-host-verification' };
939
+ }
731
940
  throw new Error(
732
941
  `platform "${platform?.id ?? '<unknown>'}" with installMethod="${installMethod}" cannot be routed`,
733
942
  );
@@ -745,7 +954,7 @@ export function resolveCapabilityConflicts(platform) {
745
954
  const { id, automatable, installMethod, refStrength, identityEvidence, cli, strategy } = platform;
746
955
 
747
956
  // automatable <-> installMethod 一致性
748
- if (automatable === true && installMethod !== 'structured-cli') {
957
+ if (automatable === true && !['structured-cli', 'foundation-host-verification'].includes(installMethod)) {
749
958
  conflicts.push(`automatable=true but installMethod="${installMethod}"`);
750
959
  }
751
960
  if (automatable === false && installMethod === 'structured-cli') {
@@ -763,7 +972,7 @@ export function resolveCapabilityConflicts(platform) {
763
972
  }
764
973
 
765
974
  // 自动化平台必须有 cli 和策略解析函数
766
- if (automatable === true) {
975
+ if (automatable === true && installMethod !== 'foundation-host-verification') {
767
976
  if (!cli || typeof cli !== 'object') {
768
977
  conflicts.push(`automatable=true but cli is missing`);
769
978
  }
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Reads skill metadata from skills-src/ and plugin.json templates,
5
5
  * generates self-contained adapter directories for each platform
6
- * (claude, codex, kimi, workbuddy, and the build-only qoder adapter).
6
+ * enabled by the platform registry (currently claude, codex, kimi,
7
+ * workbuddy, and qoder).
7
8
  *
8
9
  * Each adapter root contains:
9
10
  * - Plugin manifest (.claude-plugin/, .codex-plugin/, .kimi-plugin/,
@@ -208,7 +209,9 @@ export function computeBuildAdaptersDigest(sourceBytes) {
208
209
  // tree (adapters/workbuddy/, manifest .codebuddy-plugin/plugin.json). This is
209
210
  // what lets codebuddy join the publish pipeline WITHOUT changing a single byte
210
211
  // of the generated workbuddy adapter (the former BUILD_ONLY workbuddy entry).
211
- const REGISTRY_PLATFORMS = PLATFORM_REGISTRY.map((platform) => ({
212
+ const REGISTRY_PLATFORMS = PLATFORM_REGISTRY
213
+ .filter((platform) => platform.buildAdapter.enabled)
214
+ .map((platform) => ({
212
215
  name: platform.buildAdapter?.name ?? platform.id,
213
216
  pluginDirName: platform.buildAdapter.pluginDirName,
214
217
  templateFileName: platform.buildAdapter.templateFileName,
@@ -216,31 +219,14 @@ const REGISTRY_PLATFORMS = PLATFORM_REGISTRY.map((platform) => ({
216
219
  ? { marketplaceFileName: platform.buildAdapter.marketplaceFileName }
217
220
  : {}),
218
221
  hasMarketplace: platform.buildAdapter.hasMarketplace,
219
- }));
222
+ }));
220
223
 
221
224
  /**
222
- * Build-only distribution adapters: generated, self-contained plugin trees
223
- * that are NOT wired into the automated publish/reconcile/verify pipeline —
224
- * no registry PLATFORMS membership, no distributionType/actionType in the
225
- * plan schemas, no automated install checkpoint. A host joins the pipeline
226
- * only with a full registry descriptor (strategy, CLI protocol, schema enum);
227
- * until then a build-only entry lets the build emit an installable adapter
228
- * tree without fabricating an unverified install protocol.
229
- *
230
- * workbuddy (the CodeBuddy/WorkBuddy plugin, manifest
231
- * `.codebuddy-plugin/plugin.json`, `${CODEBUDDY_PLUGIN_ROOT}` expanded inline
232
- * in skill content) moved into the registry as the `codebuddy` platform with
233
- * `buildAdapter.name = 'workbuddy'`, so its adapter tree is still produced —
234
- * byte-for-byte unchanged — via REGISTRY_PLATFORMS. Qoder remains build-only:
235
- * its installable projection is public, while release plans intentionally do
236
- * not gain a qoder distribution type or publish checkpoint.
225
+ * Compatibility export retained for callers that still import the historical
226
+ * build-only list. Every generated adapter now derives from the registry's
227
+ * buildAdapter.enabled flag, so this list must remain empty.
237
228
  */
238
- export const BUILD_ONLY_ADAPTERS = Object.freeze([Object.freeze({
239
- name: 'qoder',
240
- pluginDirName: '.qoder-plugin',
241
- templateFileName: 'plugin.json',
242
- hasMarketplace: false,
243
- })]);
229
+ export const BUILD_ONLY_ADAPTERS = Object.freeze([]);
244
230
 
245
231
  export const PLATFORMS = Object.freeze([...REGISTRY_PLATFORMS, ...BUILD_ONLY_ADAPTERS]);
246
232
 
@@ -362,6 +348,11 @@ const QODER_PREAMBLE = `\
362
348
  >\n\
363
349
  `;
364
350
 
351
+ const CURSOR_PREAMBLE = CODEX_PREAMBLE.replaceAll('Codex', 'Cursor').replace(
352
+ '> 令 `RELEASE_SKILL_ENTRY',
353
+ '> 校验 `PLUGIN_ROOT/.cursor-plugin/plugin.json` 是根内的普通文件,且名称为 `release-skill`;清单缺失或不一致时停止。Cursor 不保证注入插件根变量。\n> 令 `RELEASE_SKILL_ENTRY',
354
+ );
355
+
365
356
  /**
366
357
  * Render SKILL.md content for a specific platform.
367
358
  *
@@ -386,12 +377,13 @@ function renderSkillForPlatform(content, platformName) {
386
377
  return content.replaceAll('${CLAUDE_PLUGIN_ROOT}', '${CODEBUDDY_PLUGIN_ROOT}');
387
378
  }
388
379
 
389
- if (platformName === 'codex' || platformName === 'kimi' || platformName === 'qoder') {
390
- const hostLabel = { codex: 'Codex', kimi: 'Kimi', qoder: 'Qoder' }[platformName];
380
+ if (platformName === 'codex' || platformName === 'kimi' || platformName === 'qoder' || platformName === 'cursor') {
381
+ const hostLabel = { codex: 'Codex', kimi: 'Kimi', qoder: 'Qoder', cursor: 'Cursor' }[platformName];
391
382
  const preamble = {
392
383
  codex: CODEX_PREAMBLE,
393
384
  kimi: KIMI_PREAMBLE,
394
385
  qoder: QODER_PREAMBLE,
386
+ cursor: CURSOR_PREAMBLE,
395
387
  }[platformName];
396
388
  let rendered = content.replaceAll(
397
389
  '${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs',
@@ -405,6 +397,9 @@ function renderSkillForPlatform(content, platformName) {
405
397
  .replaceAll('RELEASE_SKILL_ENTRY', 'RELEASE_SKILL_LOCAL_FINISH_ENTRY')
406
398
  .replaceAll('release-skill.mjs', 'release-skill-local-finish.mjs')
407
399
  : preamble;
400
+ if (platformName === 'cursor' && /\$\{(?:CLAUDE|CURSOR|CODEBUDDY|KIMI)[A-Z_]*\}/u.test(rendered)) {
401
+ throw new Error('Cursor rendering contains a residual host-specific placeholder');
402
+ }
408
403
  // A remaining bare host-root reference has no safe path-derived equivalent.
409
404
  if (rendered.includes('${CLAUDE_PLUGIN_ROOT}')) {
410
405
  throw new Error(`${hostLabel} rendering found an unsupported bare CLAUDE_PLUGIN_ROOT reference`);
@@ -55,9 +55,9 @@ import { digestBytes, publishFileOrReplace, readFileStrict, withTemporaryWorkspa
55
55
  import { canonicalJson } from '../core/digest.mjs';
56
56
 
57
57
  export const FOUNDATION_PACKAGES = Object.freeze({
58
- 'skill-family-contracts': '0.17.0',
59
- 'skill-family-engineering-kit': '0.17.0',
60
- 'skill-family-harness-node': '0.17.0',
58
+ 'skill-family-contracts': '0.21.0',
59
+ 'skill-family-engineering-kit': '0.21.0',
60
+ 'skill-family-harness-node': '0.21.0',
61
61
  });
62
62
 
63
63
  export const BINDING_RECORD_PATH = 'bin/foundation-resource-binding.json';
@@ -25,7 +25,7 @@
25
25
  "additionalProperties": false,
26
26
  "required": ["driverId", "authStrategy", "credentialMutation"],
27
27
  "properties": {
28
- "driverId": { "enum": ["kimi-code-print-v1", "workbuddy-codebuddy-print-v1", "codebuddy-print-v1", "claude-code-print-v1", "codex-exec-v1", "qodercli-print-v1"] },
28
+ "driverId": { "enum": ["kimi-code-print-v1", "workbuddy-codebuddy-print-v1", "codebuddy-print-v1", "claude-code-print-v1", "codex-exec-v1", "qodercli-print-v1", "cursor-agent-print-v1"] },
29
29
  "authStrategy": { "const": "existing-user-state" },
30
30
  "credentialMutation": { "const": "host-managed" }
31
31
  }
@@ -109,7 +109,14 @@
109
109
  }
110
110
  },
111
111
  {
112
- "if": { "properties": { "hostId": { "enum": ["kimi-code", "workbuddy", "codebuddy", "claude", "codex", "qoder"] } }, "required": ["hostId"] },
112
+ "if": { "properties": { "hostId": { "const": "cursor" } }, "required": ["hostId"] },
113
+ "then": {
114
+ "required": ["verification"],
115
+ "properties": { "verification": { "type": "object", "properties": { "driverId": { "const": "cursor-agent-print-v1" } } } }
116
+ }
117
+ },
118
+ {
119
+ "if": { "properties": { "hostId": { "enum": ["kimi-code", "workbuddy", "codebuddy", "claude", "codex", "qoder", "cursor"] } }, "required": ["hostId"] },
113
120
  "else": { "properties": { "verification": false } }
114
121
  },
115
122
  {