release-skill 0.9.17 → 0.9.19

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 (266) 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 +70 -2
  8. package/INSTALL.md +66 -9
  9. package/INSTALL.zh-CN.md +49 -8
  10. package/README.md +41 -20
  11. package/README.zh-CN.md +31 -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 +4425 -1519
  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 +46 -7
  29. package/adapters/claude/skills/release-help/SKILL.md +47 -103
  30. package/adapters/claude/skills/release-verify/SKILL.md +2 -2
  31. package/adapters/claude/src/schemas/host-descriptor.schema.json +9 -2
  32. package/adapters/codex/.codex-plugin/plugin.json +2 -2
  33. package/adapters/codex/bin/consumer-contract-vectors.json +7 -7
  34. package/adapters/codex/bin/error-codes.json +1 -1
  35. package/adapters/codex/bin/foundation-resource-binding.json +1 -1
  36. package/adapters/codex/bin/prebuild-manifest.json +8 -4
  37. package/adapters/codex/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  38. package/adapters/codex/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  39. package/adapters/codex/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  40. package/adapters/codex/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  41. package/adapters/codex/bin/registry.json +1 -1
  42. package/adapters/codex/bin/release-skill.bundle.mjs +4425 -1519
  43. package/adapters/codex/bin/rules.json +1 -1
  44. package/adapters/codex/data/hosts/cursor/host-descriptor.json +34 -0
  45. package/adapters/codex/data/hosts/registry.json +1 -0
  46. package/adapters/codex/schemas/release-plan.schema.json +255 -25
  47. package/adapters/codex/schemas/release-project.schema.json +228 -26
  48. package/adapters/codex/skills/release-finish/SKILL.md +46 -7
  49. package/adapters/codex/skills/release-help/SKILL.md +49 -105
  50. package/adapters/codex/skills/release-verify/SKILL.md +2 -2
  51. package/adapters/codex/src/schemas/host-descriptor.schema.json +9 -2
  52. package/adapters/cursor/.cursor-plugin/plugin.json +10 -0
  53. package/adapters/cursor/bin/consumer-contract-vectors.json +110 -0
  54. package/adapters/cursor/bin/error-codes.json +161 -0
  55. package/adapters/cursor/bin/foundation-legal/skill-family-contracts/LICENSE +202 -0
  56. package/adapters/cursor/bin/foundation-legal/skill-family-contracts/NOTICE +10 -0
  57. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/LICENSE +202 -0
  58. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/NOTICE +10 -0
  59. package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/THIRD_PARTY_NOTICES +142 -0
  60. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/LICENSE +202 -0
  61. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/NOTICE +10 -0
  62. package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/native-NOTICE +2 -0
  63. package/adapters/cursor/bin/foundation-resource-binding.json +1 -0
  64. package/adapters/cursor/bin/kernel-protocol.json +60 -0
  65. package/adapters/cursor/bin/license-texts/Apache-2.0.txt +201 -0
  66. package/adapters/cursor/bin/license-texts/MIT.txt +21 -0
  67. package/adapters/cursor/bin/prebuild-manifest.json +83 -0
  68. package/adapters/cursor/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  69. package/adapters/cursor/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  70. package/adapters/cursor/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  71. package/adapters/cursor/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  72. package/adapters/cursor/bin/registry.json +347 -0
  73. package/adapters/cursor/bin/release-skill-local-finish.mjs +4 -0
  74. package/adapters/cursor/bin/release-skill.bundle.mjs +152352 -0
  75. package/adapters/cursor/bin/release-skill.mjs +54 -0
  76. package/adapters/cursor/bin/rules.json +104 -0
  77. package/adapters/cursor/bin/schemas/consumer-contract-vector.schema.json +149 -0
  78. package/adapters/cursor/data/hosts/claude/host-descriptor.json +45 -0
  79. package/adapters/cursor/data/hosts/codebuddy/host-descriptor.json +26 -0
  80. package/adapters/cursor/data/hosts/codex/host-descriptor.json +45 -0
  81. package/adapters/cursor/data/hosts/cursor/host-descriptor.json +34 -0
  82. package/adapters/cursor/data/hosts/deepseek-harness/host-descriptor.json +23 -0
  83. package/adapters/cursor/data/hosts/kimi-code/host-descriptor.json +36 -0
  84. package/adapters/cursor/data/hosts/qoder/host-descriptor.json +26 -0
  85. package/adapters/cursor/data/hosts/registry.json +14 -0
  86. package/adapters/cursor/data/hosts/workbuddy/host-descriptor.json +34 -0
  87. package/adapters/cursor/data/licensing/registry.json +211 -0
  88. package/adapters/cursor/data/licensing/schema.json +207 -0
  89. package/adapters/cursor/native/safe-write/binding.gyp +41 -0
  90. package/adapters/cursor/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
  91. package/adapters/cursor/native/safe-write/prebuilds.json +24 -0
  92. package/adapters/cursor/native/safe-write/src/safe_write.cc +2032 -0
  93. package/adapters/cursor/schemas/.render-manifest.json +41 -0
  94. package/adapters/cursor/schemas/approval-record.schema.json +115 -0
  95. package/adapters/cursor/schemas/artifact-lock.schema.json +111 -0
  96. package/adapters/cursor/schemas/artifact-plan.schema.json +52 -0
  97. package/adapters/cursor/schemas/artifact-policy.schema.json +76 -0
  98. package/adapters/cursor/schemas/evidence-event-v2.schema.json +164 -0
  99. package/adapters/cursor/schemas/evidence-event.schema.json +89 -0
  100. package/adapters/cursor/schemas/postpublish-approval-record.schema.json +47 -0
  101. package/adapters/cursor/schemas/release-plan.schema.json +2226 -0
  102. package/adapters/cursor/schemas/release-project.schema.json +1815 -0
  103. package/adapters/cursor/schemas/release-run.schema.json +777 -0
  104. package/adapters/cursor/skills/release-assess/SKILL.md +61 -0
  105. package/adapters/cursor/skills/release-config/SKILL.md +151 -0
  106. package/adapters/cursor/skills/release-docs/SKILL.md +120 -0
  107. package/adapters/cursor/skills/release-finish/SKILL.md +181 -0
  108. package/adapters/cursor/skills/release-help/SKILL.md +98 -0
  109. package/adapters/cursor/skills/release-marketplace/SKILL.md +157 -0
  110. package/adapters/cursor/skills/release-prepare/SKILL.md +136 -0
  111. package/adapters/cursor/skills/release-publish/SKILL.md +92 -0
  112. package/adapters/cursor/skills/release-reconcile/SKILL.md +81 -0
  113. package/adapters/cursor/skills/release-setup/SKILL.md +132 -0
  114. package/adapters/cursor/skills/release-verify/SKILL.md +110 -0
  115. package/adapters/cursor/src/schemas/adapter-build-manifest.schema.json +41 -0
  116. package/adapters/cursor/src/schemas/adapter-peer-verification-request.schema.json +54 -0
  117. package/adapters/cursor/src/schemas/adapter-peer-verification-result.schema.json +54 -0
  118. package/adapters/cursor/src/schemas/adapter-source.schema.json +47 -0
  119. package/adapters/cursor/src/schemas/audit-baseline-pin.schema.json +163 -0
  120. package/adapters/cursor/src/schemas/declared-read-surface-result.schema.json +61 -0
  121. package/adapters/cursor/src/schemas/engineering-baseline.schema.json +77 -0
  122. package/adapters/cursor/src/schemas/executable-identity-observation.schema.json +162 -0
  123. package/adapters/cursor/src/schemas/filesystem-root-binding.schema.json +14 -0
  124. package/adapters/cursor/src/schemas/filesystem-tree-observation.schema.json +71 -0
  125. package/adapters/cursor/src/schemas/fixed-set-publication-manifest.schema.json +108 -0
  126. package/adapters/cursor/src/schemas/fixed-set-publication-receipt.schema.json +148 -0
  127. package/adapters/cursor/src/schemas/host-capability-fact.schema.json +31 -0
  128. package/adapters/cursor/src/schemas/host-descriptor.schema.json +144 -0
  129. package/adapters/cursor/src/schemas/host-operation-plan.schema.json +57 -0
  130. package/adapters/cursor/src/schemas/host-operation-receipt.schema.json +81 -0
  131. package/adapters/cursor/src/schemas/host-probe-result.schema.json +30 -0
  132. package/adapters/cursor/src/schemas/host-registry.schema.json +18 -0
  133. package/adapters/cursor/src/schemas/host-verification-request.schema.json +67 -0
  134. package/adapters/cursor/src/schemas/host-verification-result.schema.json +149 -0
  135. package/adapters/cursor/src/schemas/managed-file-lock.schema.json +77 -0
  136. package/adapters/cursor/src/schemas/migration-manifest.schema.json +412 -0
  137. package/adapters/cursor/src/schemas/observation-scope.schema.json +91 -0
  138. package/adapters/cursor/src/schemas/operation-request.schema.json +58 -0
  139. package/adapters/cursor/src/schemas/operation-result.schema.json +130 -0
  140. package/adapters/cursor/src/schemas/platform-difference-registry.schema.json +110 -0
  141. package/adapters/cursor/src/schemas/plugin-verification-request.schema.json +499 -0
  142. package/adapters/cursor/src/schemas/plugin-verification-result.schema.json +1217 -0
  143. package/adapters/cursor/src/schemas/profile-adoption-declaration.schema.json +111 -0
  144. package/adapters/cursor/src/schemas/profile-descriptor.schema.json +99 -0
  145. package/adapters/cursor/src/schemas/project-manifest.schema.json +67 -0
  146. package/adapters/cursor/src/schemas/project-profile.schema.json +25 -0
  147. package/adapters/cursor/src/schemas/public-boundary-declaration.schema.json +73 -0
  148. package/adapters/cursor/src/schemas/report-binding.schema.json +42 -0
  149. package/adapters/cursor/src/schemas/report-model.schema.json +308 -0
  150. package/adapters/cursor/src/schemas/skill-family-directory-verification-request.schema.json +100 -0
  151. package/adapters/cursor/src/schemas/skill-family-directory-verification-result.schema.json +193 -0
  152. package/adapters/cursor/src/schemas/source-authority-receipt.schema.json +31 -0
  153. package/adapters/cursor/src/schemas/state-event-envelope.schema.json +38 -0
  154. package/adapters/cursor/src/schemas/state-snapshot-metadata.schema.json +25 -0
  155. package/adapters/cursor/src/schemas/structured-scan-policy.schema.json +97 -0
  156. package/adapters/cursor/src/schemas/surface-scan-policy.schema.json +42 -0
  157. package/adapters/cursor/src/schemas/timeout-policy.schema.json +24 -0
  158. package/adapters/cursor/src/schemas/token-estimate-record.schema.json +75 -0
  159. package/adapters/cursor/src/schemas/token-estimate-result.schema.json +43 -0
  160. package/adapters/cursor/src/schemas/watchdog-termination-envelope.schema.json +156 -0
  161. package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
  162. package/adapters/kimi/bin/consumer-contract-vectors.json +7 -7
  163. package/adapters/kimi/bin/error-codes.json +1 -1
  164. package/adapters/kimi/bin/foundation-resource-binding.json +1 -1
  165. package/adapters/kimi/bin/prebuild-manifest.json +8 -4
  166. package/adapters/kimi/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  167. package/adapters/kimi/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  168. package/adapters/kimi/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  169. package/adapters/kimi/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  170. package/adapters/kimi/bin/registry.json +1 -1
  171. package/adapters/kimi/bin/release-skill.bundle.mjs +4425 -1519
  172. package/adapters/kimi/bin/rules.json +1 -1
  173. package/adapters/kimi/data/hosts/cursor/host-descriptor.json +34 -0
  174. package/adapters/kimi/data/hosts/registry.json +1 -0
  175. package/adapters/kimi/schemas/release-plan.schema.json +255 -25
  176. package/adapters/kimi/schemas/release-project.schema.json +228 -26
  177. package/adapters/kimi/skills/release-finish/SKILL.md +46 -7
  178. package/adapters/kimi/skills/release-help/SKILL.md +49 -105
  179. package/adapters/kimi/skills/release-verify/SKILL.md +2 -2
  180. package/adapters/kimi/src/schemas/host-descriptor.schema.json +9 -2
  181. package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
  182. package/adapters/qoder/bin/consumer-contract-vectors.json +7 -7
  183. package/adapters/qoder/bin/error-codes.json +1 -1
  184. package/adapters/qoder/bin/foundation-resource-binding.json +1 -1
  185. package/adapters/qoder/bin/prebuild-manifest.json +8 -4
  186. package/adapters/qoder/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  187. package/adapters/qoder/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  188. package/adapters/qoder/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  189. package/adapters/qoder/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  190. package/adapters/qoder/bin/registry.json +1 -1
  191. package/adapters/qoder/bin/release-skill.bundle.mjs +4425 -1519
  192. package/adapters/qoder/bin/rules.json +1 -1
  193. package/adapters/qoder/data/hosts/cursor/host-descriptor.json +34 -0
  194. package/adapters/qoder/data/hosts/registry.json +1 -0
  195. package/adapters/qoder/schemas/release-plan.schema.json +255 -25
  196. package/adapters/qoder/schemas/release-project.schema.json +228 -26
  197. package/adapters/qoder/skills/release-finish/SKILL.md +46 -7
  198. package/adapters/qoder/skills/release-help/SKILL.md +49 -105
  199. package/adapters/qoder/skills/release-verify/SKILL.md +2 -2
  200. package/adapters/qoder/src/schemas/host-descriptor.schema.json +9 -2
  201. package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
  202. package/adapters/workbuddy/bin/consumer-contract-vectors.json +7 -7
  203. package/adapters/workbuddy/bin/error-codes.json +1 -1
  204. package/adapters/workbuddy/bin/foundation-resource-binding.json +1 -1
  205. package/adapters/workbuddy/bin/prebuild-manifest.json +8 -4
  206. package/adapters/workbuddy/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  207. package/adapters/workbuddy/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  208. package/adapters/workbuddy/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  209. package/adapters/workbuddy/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  210. package/adapters/workbuddy/bin/registry.json +1 -1
  211. package/adapters/workbuddy/bin/release-skill.bundle.mjs +4425 -1519
  212. package/adapters/workbuddy/bin/rules.json +1 -1
  213. package/adapters/workbuddy/data/hosts/cursor/host-descriptor.json +34 -0
  214. package/adapters/workbuddy/data/hosts/registry.json +1 -0
  215. package/adapters/workbuddy/schemas/release-plan.schema.json +255 -25
  216. package/adapters/workbuddy/schemas/release-project.schema.json +228 -26
  217. package/adapters/workbuddy/skills/release-finish/SKILL.md +46 -7
  218. package/adapters/workbuddy/skills/release-help/SKILL.md +47 -103
  219. package/adapters/workbuddy/skills/release-verify/SKILL.md +2 -2
  220. package/adapters/workbuddy/src/schemas/host-descriptor.schema.json +9 -2
  221. package/bin/consumer-contract-vectors.json +7 -7
  222. package/bin/error-codes.json +1 -1
  223. package/bin/foundation-resource-binding.json +1 -1
  224. package/bin/prebuild-manifest.json +8 -4
  225. package/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
  226. package/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
  227. package/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
  228. package/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
  229. package/bin/registry.json +1 -1
  230. package/bin/release-skill-cli.mjs +115 -15
  231. package/bin/release-skill.bundle.mjs +4425 -1519
  232. package/bin/rules.json +1 -1
  233. package/data/hosts/cursor/host-descriptor.json +34 -0
  234. package/data/hosts/registry.json +1 -0
  235. package/package.json +7 -5
  236. package/platform-manifest.json +75 -9
  237. package/references/02-project-config.md +4 -0
  238. package/schemas/release-plan.schema.json +255 -25
  239. package/schemas/release-project.schema.json +228 -26
  240. package/scripts/sync-public-files.mjs +3 -22
  241. package/skills/release-finish/SKILL.md +46 -7
  242. package/skills/release-help/SKILL.md +47 -103
  243. package/skills/release-verify/SKILL.md +2 -2
  244. package/skills-src/release-finish/SKILL.md +46 -7
  245. package/skills-src/release-help/SKILL.md +47 -103
  246. package/skills-src/release-verify/SKILL.md +2 -2
  247. package/src/adapters/contract.mjs +1 -0
  248. package/src/adapters/plugin-marketplace.mjs +201 -9
  249. package/src/commands/post-release-finish.mjs +448 -0
  250. package/src/commands/post-release-local.mjs +312 -36
  251. package/src/commands/prepare.mjs +74 -9
  252. package/src/commands/publish.mjs +4 -1
  253. package/src/commands/ship.mjs +3 -0
  254. package/src/commands/verify.mjs +73 -0
  255. package/src/core/checkpoints.mjs +5 -2
  256. package/src/core/config.mjs +1 -1
  257. package/src/core/foundation-host-verification.mjs +168 -0
  258. package/src/core/plan.mjs +19 -1
  259. package/src/core/postpublish.mjs +9 -1
  260. package/src/core/run-retention.mjs +1 -1
  261. package/src/core/surface-host-bindings.mjs +1 -0
  262. package/src/core/verification-gates.mjs +1 -1
  263. package/src/platforms/registry.mjs +225 -16
  264. package/src/producers/build-adapters.mjs +21 -26
  265. package/src/producers/foundation-resource-projection.mjs +3 -3
  266. package/src/schemas/host-descriptor.schema.json +9 -2
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { readFile } from 'node:fs/promises';
4
- import { basename, dirname, join, resolve } from 'node:path';
4
+ import { basename, dirname, isAbsolute, join, normalize, resolve } from 'node:path';
5
5
  import { execFile as execFileCb } from 'node:child_process';
6
6
  import { promisify } from 'node:util';
7
7
  import { parseNodeMajor, meetsMinimum, computeReadinessStatus } from '../src/core/node-version.mjs';
@@ -426,9 +426,15 @@ Options:
426
426
  --approve Approve the ship plan (boolean; plan digest is auto-resolved)
427
427
  --hook-approval <path> Checkpoint approval for one requiresApproval hook (ship/distribute/postverify; repeatable)
428
428
  --state <path> Override the durable ship state file
429
+ --cursor-executable-root <absolute-directory> Directory containing cursor-agent (verify/ship)
430
+ --cursor-user-state-root <absolute-directory> Explicit existing Cursor user state (verify/ship)
429
431
  --update-local-hosts Update installed plugins for selected local hosts after VERIFIED
430
- --hosts <ids> Comma-separated local hosts for post-release update: claude,codex,kimi,codebuddy,workbuddy,qoder. No local host is updated unless --hosts contains at least one id
432
+ --hosts <ids> Comma-separated local hosts for post-release update: claude,codex,kimi,codebuddy,workbuddy,qoder,cursor. No local host is updated unless --hosts contains at least one id
433
+ --cursor-plugins-root <absolute-directory> Required for Cursor Local installation/update; quit Cursor before running
431
434
  --confirm-plan <digest> Confirm the exact VERIFIED plan before local host mutation
435
+ --finish Run the complete post-release finish orchestration and return COMPLETE/PENDING/FAILED
436
+ --finish-feedback <absolute-json-file> Read bound agent-reported host loading and setup results
437
+ --skip-local-hosts Explicitly skip host update, loading, and setup for this finish run
432
438
  --no-hook-cache Force every prepare hook to run in full; neither read nor write the hook cache
433
439
  --json Output results as JSON
434
440
  --version Show version and exit
@@ -686,6 +692,8 @@ if (command === 'ship' && (args.includes('--help') || args.includes('-h'))) {
686
692
  state: '--state <path>',
687
693
  unit: '--unit <id> (repeatable before plan freeze)',
688
694
  approve: '--approve --actor <name>',
695
+ cursorExecutableRoot: '--cursor-executable-root <absolute-directory>',
696
+ cursorUserStateRoot: '--cursor-user-state-root <absolute-directory>',
689
697
  },
690
698
  message: 'Repeat the same command to resume from the same state. For parallel or cross-session versions, use .release-skill/ships/<version>.json.',
691
699
  }, null, 2));
@@ -700,6 +708,11 @@ Options:
700
708
  --state <path> Specify the durable state file
701
709
  --unit <id> Select a release unit before plan freeze (repeatable)
702
710
  --approve --actor <name> Approve the plan bound to the current state
711
+ --cursor-executable-root <absolute-directory> Directory containing cursor-agent
712
+ --cursor-user-state-root <absolute-directory> Existing Cursor user-state directory
713
+
714
+ Cursor verification requires both directories on each verification attempt.
715
+ Runtime directories are private and are not saved in the plan or ship state.
703
716
 
704
717
  Repeat the same command to resume from the same state.
705
718
  For parallel or cross-session versions, use .release-skill/ships/<version>.json.`);
@@ -1098,6 +1111,10 @@ if (command === 'ship') {
1098
1111
  adapterRegistry,
1099
1112
  ...(hasUnitSelection ? { unitIds } : {}),
1100
1113
  ...(postpublishApprovalPaths.length > 0 ? { postpublishApprovalPaths } : {}),
1114
+ cursorHostRuntime: {
1115
+ executableRoot: value('--cursor-executable-root'),
1116
+ existingUserStateRoot: value('--cursor-user-state-root'),
1117
+ },
1101
1118
  });
1102
1119
  if (hasJson) {
1103
1120
  console.log(JSON.stringify(result, null, 2));
@@ -1130,9 +1147,9 @@ if (command === 'ship') {
1130
1147
  const localHostUpdate = result.postRelease.localHostUpdate;
1131
1148
  if (localHostUpdate?.promptRequired === true) {
1132
1149
  console.log(`Post-release: ask whether to update local host plugins (${result.postRelease.localHostUpdate.hosts.join(', ')}).`);
1133
- if (localHostUpdate.available === true && typeof localHostUpdate.runPath === 'string') {
1134
- console.log(`Post-release command: release-skill post-release --plan ${result.planPath} --run ${localHostUpdate.runPath}`);
1135
- console.log('Choose --hosts before adding --update-local-hosts to perform a local update.');
1150
+ if (result.postRelease.finishCommand) {
1151
+ console.log(`Post-release finish command: ${result.postRelease.finishCommand.argv.join(' ')}`);
1152
+ console.log('Choose --hosts before adding --update-local-hosts, or use --skip-local-hosts.');
1136
1153
  }
1137
1154
  printHubManualTargets(localHostUpdate.targets);
1138
1155
  } else {
@@ -1525,6 +1542,48 @@ if (command === 'post-release') {
1525
1542
  };
1526
1543
  const planPath = value('--plan') ? resolve(value('--plan')) : undefined;
1527
1544
  const runPath = value('--run') ? resolve(value('--run')) : undefined;
1545
+ const finishRequested = args.includes('--finish');
1546
+ const skipLocalHosts = args.includes('--skip-local-hosts');
1547
+ const feedbackValue = value('--finish-feedback');
1548
+ if (finishRequested || skipLocalHosts || args.includes('--finish-feedback')) {
1549
+ const valued = new Set([
1550
+ '--root', '--plan', '--run', '--confirm-plan', '--hosts',
1551
+ '--cursor-plugins-root', '--finish-feedback',
1552
+ ]);
1553
+ const booleans = new Set(['--finish', '--skip-local-hosts', '--update-local-hosts', '--json']);
1554
+ const seen = new Set();
1555
+ let parameterError;
1556
+ for (let index = 1; index < args.length; index += 1) {
1557
+ const token = args[index];
1558
+ if (valued.has(token)) {
1559
+ if (seen.has(token)) parameterError ??= `post-release finish does not accept duplicate ${token}`;
1560
+ seen.add(token);
1561
+ const next = args[index + 1];
1562
+ if (!next || next.startsWith('-')) parameterError ??= `post-release finish requires a value for ${token}`;
1563
+ else index += 1;
1564
+ continue;
1565
+ }
1566
+ if (booleans.has(token)) {
1567
+ if (seen.has(token)) parameterError ??= `post-release finish does not accept duplicate ${token}`;
1568
+ seen.add(token);
1569
+ continue;
1570
+ }
1571
+ parameterError ??= `post-release finish does not accept ${token}`;
1572
+ }
1573
+ const rawHosts = value('--hosts');
1574
+ if (!finishRequested) parameterError ??= '--skip-local-hosts and --finish-feedback require --finish';
1575
+ if (skipLocalHosts && (args.includes('--update-local-hosts') || (typeof rawHosts === 'string' && rawHosts.trim().length > 0))) {
1576
+ parameterError ??= '--skip-local-hosts conflicts with --update-local-hosts and --hosts';
1577
+ }
1578
+ if (feedbackValue && (!isAbsolute(feedbackValue) || normalize(feedbackValue) !== feedbackValue)) {
1579
+ parameterError ??= '--finish-feedback requires a normalized absolute JSON file path';
1580
+ }
1581
+ if (parameterError) {
1582
+ if (hasJson) console.log(JSON.stringify({ error: 'POST_RELEASE_FINISH_INVALID', message: parameterError, exitCode: 1 }));
1583
+ else console.error(`Error: ${parameterError}`);
1584
+ await exitAfterFlush(1);
1585
+ }
1586
+ }
1528
1587
  if (!planPath || !runPath) {
1529
1588
  const message = 'post-release requires --plan <path> and --run <verify-or-postverify-run-path>';
1530
1589
  if (hasJson) console.log(JSON.stringify({ error: 'MISSING_PARAMETERS', message, exitCode: 1 }));
@@ -1549,7 +1608,7 @@ if (command === 'post-release') {
1549
1608
  requireDigest: true,
1550
1609
  authorityPlanPath: planPath,
1551
1610
  });
1552
- if (!updateRequested) {
1611
+ if (!updateRequested || finishRequested) {
1553
1612
  const { assertLocalFinishRun } = await import('../src/commands/post-release-local.mjs');
1554
1613
  await assertLocalFinishRun({
1555
1614
  plan,
@@ -1570,13 +1629,31 @@ if (command === 'post-release') {
1570
1629
  .split(',')
1571
1630
  .map((host) => host.trim())
1572
1631
  .filter(Boolean);
1573
- const result = updateRequested
1632
+ const root = resolve(value('--root') ?? process.cwd());
1633
+ const result = finishRequested
1634
+ ? await (async () => {
1635
+ const { runPostReleaseFinish } = await import('../src/commands/post-release-finish.mjs');
1636
+ return runPostReleaseFinish({
1637
+ root,
1638
+ plan,
1639
+ planPath,
1640
+ runPath: resolvedRunPath,
1641
+ selectedHosts,
1642
+ updateRequested,
1643
+ skipLocalHosts,
1644
+ confirmPlanDigest: value('--confirm-plan'),
1645
+ cursorPluginsRoot: value('--cursor-plugins-root'),
1646
+ feedbackPath: feedbackValue,
1647
+ });
1648
+ })()
1649
+ : updateRequested
1574
1650
  ? await updateLocalHostPlugins({
1575
1651
  planPath,
1576
1652
  runPath: resolvedRunPath,
1577
- root: resolve(value('--root') ?? process.cwd()),
1653
+ root,
1578
1654
  confirmPlanDigest: value('--confirm-plan'),
1579
1655
  selectedHosts,
1656
+ cursorPluginsRoot: value('--cursor-plugins-root'),
1580
1657
  })
1581
1658
  : derivePostReleaseChecklist(plan, {
1582
1659
  runPath: runRecord.command === 'postverify' && runRecord.status === 'DISTRIBUTED'
@@ -1588,6 +1665,14 @@ if (command === 'post-release') {
1588
1665
 
1589
1666
  if (hasJson) {
1590
1667
  console.log(JSON.stringify(result, null, 2));
1668
+ } else if (finishRequested) {
1669
+ console.log(`Post-release finish: ${result.finish.status}`);
1670
+ for (const [name, outcome] of Object.entries(result.finish.steps)) {
1671
+ console.log(` ${name}: ${outcome.status} - ${outcome.summary}`);
1672
+ }
1673
+ for (const action of result.finish.nextActions) {
1674
+ console.log(`Next [${action.type}] ${JSON.stringify(action)}`);
1675
+ }
1591
1676
  } else if (!updateRequested) {
1592
1677
  console.log(`Post-release status: ${result.status}`);
1593
1678
  if (result.merge.promptRequired) console.log('Ask whether the user wants to merge the remaining branch.');
@@ -1611,6 +1696,9 @@ if (command === 'post-release') {
1611
1696
  }
1612
1697
  console.log('The release remains VERIFIED; restart updated hosts before using the new plugin bytes.');
1613
1698
  }
1699
+ if (finishRequested) {
1700
+ await exitAfterFlush(result.finish.status === 'COMPLETE' ? 0 : result.finish.status === 'PENDING' ? 2 : 1);
1701
+ }
1614
1702
  const success = !updateRequested || ['UPDATED', 'ALREADY_CURRENT', 'NO_APPLICABLE_HOSTS'].includes(result.status);
1615
1703
  await exitAfterFlush(success ? 0 : 1);
1616
1704
  } catch (err) {
@@ -1633,6 +1721,11 @@ if (command === 'post-release') {
1633
1721
 
1634
1722
  // --- Verify command routing ---
1635
1723
  if (command === 'verify') {
1724
+ const cursorValue = (flag) => {
1725
+ const index = args.indexOf(flag);
1726
+ return index !== -1 && args[index + 1] && !args[index + 1].startsWith('--')
1727
+ ? args[index + 1] : undefined;
1728
+ };
1636
1729
 
1637
1730
  const rootIdx = args.indexOf('--root');
1638
1731
  const rawRoot = rootIdx !== -1 && args[rootIdx + 1] ? args[rootIdx + 1] : process.cwd();
@@ -1673,6 +1766,10 @@ if (command === 'verify') {
1673
1766
  adapterRegistry: registry,
1674
1767
  root,
1675
1768
  verificationGatesAuthorized,
1769
+ cursorHostRuntime: {
1770
+ executableRoot: cursorValue('--cursor-executable-root'),
1771
+ existingUserStateRoot: cursorValue('--cursor-user-state-root'),
1772
+ },
1676
1773
  });
1677
1774
  if (result.status === 'VERIFIED') {
1678
1775
  const {
@@ -1681,7 +1778,9 @@ if (command === 'verify') {
1681
1778
  } = await import('../src/commands/post-release-local.mjs');
1682
1779
  const plan = JSON.parse(await readFile(planPath, 'utf8'));
1683
1780
  try {
1684
- result.postRelease = derivePostReleaseChecklist(plan, { root, runPath: result.runPath });
1781
+ result.postRelease = derivePostReleaseChecklist(plan, {
1782
+ root, planPath, runPath: result.runPath,
1783
+ });
1685
1784
  } catch (error) {
1686
1785
  result.postRelease = unavailablePostReleaseChecklist(plan, error);
1687
1786
  }
@@ -1709,9 +1808,9 @@ if (command === 'verify') {
1709
1808
  }
1710
1809
  if (result.postRelease?.localHostUpdate?.promptRequired === true) {
1711
1810
  console.log(`Post-release: ask whether to update local host plugins (${result.postRelease.localHostUpdate.hosts.join(', ')}).`);
1712
- if (result.postRelease.localHostUpdate.available === true && typeof result.postRelease.localHostUpdate.runPath === 'string') {
1713
- console.log(`Post-release command: release-skill post-release --plan ${planPath} --run ${result.postRelease.localHostUpdate.runPath}`);
1714
- console.log('Choose --hosts before adding --update-local-hosts to perform a local update.');
1811
+ if (result.postRelease.finishCommand) {
1812
+ console.log(`Post-release finish command: ${result.postRelease.finishCommand.argv.join(' ')}`);
1813
+ console.log('Choose --hosts before adding --update-local-hosts, or use --skip-local-hosts.');
1715
1814
  }
1716
1815
  printHubManualTargets(result.postRelease.localHostUpdate.targets);
1717
1816
  } else {
@@ -1839,6 +1938,7 @@ This command creates an independent postVerify run and never reads or writes shi
1839
1938
  plan = JSON.parse(await readFile(resolve(planPath), 'utf8'));
1840
1939
  result.postRelease = derivePostReleaseChecklist(plan, {
1841
1940
  root,
1941
+ planPath: resolve(planPath),
1842
1942
  runPath: result.runPath,
1843
1943
  postVerifyComplete: true,
1844
1944
  });
@@ -1860,9 +1960,9 @@ This command creates an independent postVerify run and never reads or writes shi
1860
1960
  } else if (result.postRelease?.localHostUpdate?.promptRequired === true) {
1861
1961
  const localHostUpdate = result.postRelease.localHostUpdate;
1862
1962
  console.log(`Post-release: ask whether to update local host plugins (${localHostUpdate.hosts.join(', ')}).`);
1863
- if (localHostUpdate.available === true && typeof localHostUpdate.runPath === 'string') {
1864
- console.log(`Post-release command: release-skill post-release --plan ${resolve(planPath)} --run ${localHostUpdate.runPath}`);
1865
- console.log('Choose --hosts before adding --update-local-hosts to perform a local update.');
1963
+ if (result.postRelease.finishCommand) {
1964
+ console.log(`Post-release finish command: ${result.postRelease.finishCommand.argv.join(' ')}`);
1965
+ console.log('Choose --hosts before adding --update-local-hosts, or use --skip-local-hosts.');
1866
1966
  }
1867
1967
  printHubManualTargets(localHostUpdate.targets);
1868
1968
  }