@blxzer/cursor-trellis 0.4.1 → 0.4.3

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 (337) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +25 -14
  3. package/README.zh-CN.md +14 -10
  4. package/bin/smart-search.js +10 -2
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +36 -15
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/commands/init.d.ts +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +42 -153
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/migrate.d.ts +10 -0
  13. package/dist/commands/migrate.d.ts.map +1 -0
  14. package/dist/commands/migrate.js +38 -0
  15. package/dist/commands/migrate.js.map +1 -0
  16. package/dist/commands/update.d.ts +5 -0
  17. package/dist/commands/update.d.ts.map +1 -1
  18. package/dist/commands/update.js +144 -41
  19. package/dist/commands/update.js.map +1 -1
  20. package/dist/configurators/cursor.d.ts +2 -1
  21. package/dist/configurators/cursor.d.ts.map +1 -1
  22. package/dist/configurators/cursor.js +4 -2
  23. package/dist/configurators/cursor.js.map +1 -1
  24. package/dist/configurators/index.js +4 -4
  25. package/dist/configurators/index.js.map +1 -1
  26. package/dist/configurators/shared.d.ts +8 -0
  27. package/dist/configurators/shared.d.ts.map +1 -1
  28. package/dist/configurators/shared.js +27 -1
  29. package/dist/configurators/shared.js.map +1 -1
  30. package/dist/configurators/workflow.d.ts +0 -9
  31. package/dist/configurators/workflow.d.ts.map +1 -1
  32. package/dist/configurators/workflow.js +12 -45
  33. package/dist/configurators/workflow.js.map +1 -1
  34. package/dist/constants/paths.d.ts +13 -0
  35. package/dist/constants/paths.d.ts.map +1 -1
  36. package/dist/constants/paths.js +17 -0
  37. package/dist/constants/paths.js.map +1 -1
  38. package/dist/migrations/manifests/0.3.0.json +1 -1
  39. package/dist/templates/common/bundled-skills/cstl-check/SKILL.md +1 -1
  40. package/dist/templates/common/bundled-skills/cstl-meta/references/platform-files/hooks-and-settings.md +2 -2
  41. package/dist/templates/common/bundled-skills/cstl-meta/references/platform-files/overview.md +1 -1
  42. package/dist/templates/common/bundled-skills/cstl-meta/references/platform-files/skills-and-commands.md +2 -4
  43. package/dist/templates/common/bundled-skills/cstl-skill-creator/SKILL.md +10 -7
  44. package/dist/templates/common/bundled-skills/cstl-skill-creator/references/authoring-rules.md +93 -19
  45. package/dist/templates/common/bundled-skills/cstl-skill-creator/references/general-authoring.md +189 -0
  46. package/dist/templates/common/bundled-skills/cstl-skill-creator/references/review-checklist.md +10 -5
  47. package/dist/templates/common/commands/continue.md +6 -5
  48. package/dist/templates/common/index.d.ts +20 -0
  49. package/dist/templates/common/index.d.ts.map +1 -1
  50. package/dist/templates/common/index.js +21 -2
  51. package/dist/templates/common/index.js.map +1 -1
  52. package/dist/templates/common/optional-skills/chrome-cdp/SKILL.md +179 -0
  53. package/dist/templates/common/optional-skills/chrome-cdp/examples/fetch-hook-api-capture.md +149 -0
  54. package/dist/templates/common/optional-skills/chrome-cdp/scripts/cdp.mjs +903 -0
  55. package/dist/templates/common/skills/brainstorm.md +2 -2
  56. package/dist/templates/cursor/agents/cstl-check.md +2 -2
  57. package/dist/templates/cursor/agents/cstl-implement.md +1 -1
  58. package/dist/templates/cursor/agents/cstl-research.md +2 -2
  59. package/dist/templates/cursor/fixtures/expected-rules.d.ts +1 -1
  60. package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +1 -1
  61. package/dist/templates/cursor/fixtures/expected-rules.js +7 -24
  62. package/dist/templates/cursor/fixtures/expected-rules.js.map +1 -1
  63. package/dist/templates/cursor/hooks.json +4 -0
  64. package/dist/templates/cursor/index.d.ts +1 -1
  65. package/dist/templates/cursor/index.js +1 -1
  66. package/dist/templates/cursor/rules/cstl-bootstrap.mdc +17 -0
  67. package/dist/templates/markdown/agents.md +36 -3
  68. package/dist/templates/markdown/{spec/guides → framework}/cursor-native-modes-guide.md.txt +13 -10
  69. package/dist/templates/markdown/{spec/guides → framework}/cursor-subagent-policy.md.txt +63 -127
  70. package/dist/templates/markdown/framework/dogfood-only-surfaces.md.txt +29 -0
  71. package/dist/templates/markdown/{spec/guides → framework}/execution-strategy.md.txt +2 -0
  72. package/dist/templates/markdown/framework/index.md.txt +31 -0
  73. package/dist/templates/markdown/framework/internal-skills-cursor-reachability.md.txt +45 -0
  74. package/dist/templates/markdown/framework/middleware-protocol.md.txt +83 -0
  75. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +78 -0
  76. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +83 -0
  77. package/dist/templates/markdown/framework/release-boundary.md.txt +30 -0
  78. package/dist/templates/markdown/{spec/guides → framework}/retrieval-daily-guide.md.txt +1 -1
  79. package/dist/templates/markdown/framework/upgrade.md.txt +15 -0
  80. package/dist/templates/markdown/{spec/guides → framework}/verification-strength-guide.md.txt +2 -2
  81. package/dist/templates/markdown/index.d.ts +26 -10
  82. package/dist/templates/markdown/index.d.ts.map +1 -1
  83. package/dist/templates/markdown/index.js +87 -11
  84. package/dist/templates/markdown/index.js.map +1 -1
  85. package/dist/templates/markdown/prompts/run-semantic-slice-12.md.txt +1 -1
  86. package/dist/templates/markdown/spec/guides/index.md.txt +5 -19
  87. package/dist/templates/markdown/spec/guides/prototype-guide.md.txt +10 -10
  88. package/dist/templates/markdown/spec/guides/test-discipline-guide.md.txt +1 -1
  89. package/dist/templates/shared-hooks/event-bridge.py +60 -0
  90. package/dist/templates/shared-hooks/index.d.ts +1 -1
  91. package/dist/templates/shared-hooks/index.d.ts.map +1 -1
  92. package/dist/templates/shared-hooks/index.js +1 -0
  93. package/dist/templates/shared-hooks/index.js.map +1 -1
  94. package/dist/templates/shared-hooks/session-start.py +19 -2
  95. package/dist/templates/trellis/CONTEXT.md +63 -3
  96. package/dist/templates/trellis/config.yaml +1 -1
  97. package/dist/templates/trellis/gitignore.txt +39 -39
  98. package/dist/templates/trellis/index.d.ts +12 -0
  99. package/dist/templates/trellis/index.d.ts.map +1 -1
  100. package/dist/templates/trellis/index.js +73 -15
  101. package/dist/templates/trellis/index.js.map +1 -1
  102. package/dist/templates/trellis/pool/README.md +12 -3
  103. package/dist/templates/trellis/pool/plan.md +24 -5
  104. package/dist/templates/trellis/scripts/common/adapter_middleware.py +158 -0
  105. package/dist/templates/trellis/scripts/common/artifact_locale.py +12 -3
  106. package/dist/templates/trellis/scripts/common/cursor_retrieval_env.py +5 -2
  107. package/dist/templates/trellis/scripts/common/full_quality.py +237 -0
  108. package/dist/templates/trellis/scripts/common/git.py +6 -0
  109. package/dist/templates/trellis/scripts/common/git_context.py +17 -5
  110. package/dist/templates/trellis/scripts/common/kernel_command.py +367 -0
  111. package/dist/templates/trellis/scripts/common/lite_context.py +280 -0
  112. package/dist/templates/trellis/scripts/common/ondemand_topology.py +225 -0
  113. package/dist/templates/trellis/scripts/common/parent_orchestration.py +1 -1
  114. package/dist/templates/trellis/scripts/common/pool_store.py +16 -4
  115. package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +2 -2
  116. package/dist/templates/trellis/scripts/common/session_context.py +28 -2
  117. package/dist/templates/trellis/scripts/common/task_gates.py +73 -12
  118. package/dist/templates/trellis/scripts/common/task_map.py +42 -9
  119. package/dist/templates/trellis/scripts/common/task_store.py +293 -61
  120. package/dist/templates/trellis/scripts/common/test_adapter_middleware.py +56 -0
  121. package/dist/templates/trellis/scripts/common/test_depends_mode_block.py +9 -0
  122. package/dist/templates/trellis/scripts/common/test_full_quality.py +197 -0
  123. package/dist/templates/trellis/scripts/common/test_kernel_command.py +326 -0
  124. package/dist/templates/trellis/scripts/common/test_lite_path.py +190 -0
  125. package/dist/templates/trellis/scripts/common/test_observable_defaults.py +10 -4
  126. package/dist/templates/trellis/scripts/common/test_ondemand_topology.py +122 -0
  127. package/dist/templates/trellis/scripts/common/test_pool_store.py +17 -0
  128. package/dist/templates/trellis/scripts/common/test_task_store_kernel_patch.py +163 -0
  129. package/dist/templates/trellis/scripts/common/workflow_phase.py +3 -0
  130. package/dist/templates/trellis/scripts/cursor_retrieval_probe_prompt.md +4 -5
  131. package/dist/templates/trellis/scripts/get_context.py +1 -0
  132. package/dist/templates/trellis/scripts/pool.py +5 -0
  133. package/dist/templates/trellis/scripts/task.py +83 -7
  134. package/dist/templates/trellis/workflow.md +109 -23
  135. package/dist/utils/cursor-retrieval-env.d.ts +2 -1
  136. package/dist/utils/cursor-retrieval-env.d.ts.map +1 -1
  137. package/dist/utils/cursor-retrieval-env.js +3 -2
  138. package/dist/utils/cursor-retrieval-env.js.map +1 -1
  139. package/dist/utils/cursor2plus-residue-cleanup.d.ts +38 -0
  140. package/dist/utils/cursor2plus-residue-cleanup.d.ts.map +1 -0
  141. package/dist/utils/cursor2plus-residue-cleanup.js +145 -0
  142. package/dist/utils/cursor2plus-residue-cleanup.js.map +1 -0
  143. package/dist/utils/manifest-prune.d.ts.map +1 -1
  144. package/dist/utils/manifest-prune.js +7 -2
  145. package/dist/utils/manifest-prune.js.map +1 -1
  146. package/dist/utils/p36-upgrade.d.ts +62 -0
  147. package/dist/utils/p36-upgrade.d.ts.map +1 -0
  148. package/dist/utils/p36-upgrade.js +160 -0
  149. package/dist/utils/p36-upgrade.js.map +1 -0
  150. package/dist/utils/project-capabilities.d.ts +1 -12
  151. package/dist/utils/project-capabilities.d.ts.map +1 -1
  152. package/dist/utils/project-capabilities.js +3 -100
  153. package/dist/utils/project-capabilities.js.map +1 -1
  154. package/dist/utils/readiness.d.ts +10 -0
  155. package/dist/utils/readiness.d.ts.map +1 -1
  156. package/dist/utils/readiness.js +58 -26
  157. package/dist/utils/readiness.js.map +1 -1
  158. package/dist/utils/retrieval-agent-instructions.js +1 -1
  159. package/dist/utils/retrieval-agent-instructions.js.map +1 -1
  160. package/dist/utils/retrieval-execution-telemetry.js +1 -1
  161. package/dist/utils/retrieval-execution-telemetry.js.map +1 -1
  162. package/dist/utils/template-hash.d.ts.map +1 -1
  163. package/dist/utils/template-hash.js +11 -1
  164. package/dist/utils/template-hash.js.map +1 -1
  165. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
  166. package/dist/utils/uninstall-scrubbers.js +52 -14
  167. package/dist/utils/uninstall-scrubbers.js.map +1 -1
  168. package/dist/utils/update-rollout-report.d.ts +14 -0
  169. package/dist/utils/update-rollout-report.d.ts.map +1 -1
  170. package/dist/utils/update-rollout-report.js +1 -0
  171. package/dist/utils/update-rollout-report.js.map +1 -1
  172. package/dist/utils/workflow-ownership.d.ts +1 -1
  173. package/dist/utils/workflow-ownership.js +4 -4
  174. package/dist/utils/workflow-ownership.js.map +1 -1
  175. package/package.json +5 -4
  176. package/scripts/postinstall.js +6 -7
  177. package/dist/commands/campaign/canvas-render.d.ts +0 -68
  178. package/dist/commands/campaign/canvas-render.d.ts.map +0 -1
  179. package/dist/commands/campaign/canvas-render.js +0 -414
  180. package/dist/commands/campaign/canvas-render.js.map +0 -1
  181. package/dist/commands/campaign/compose.d.ts +0 -15
  182. package/dist/commands/campaign/compose.d.ts.map +0 -1
  183. package/dist/commands/campaign/compose.js +0 -110
  184. package/dist/commands/campaign/compose.js.map +0 -1
  185. package/dist/commands/campaign/index.d.ts +0 -13
  186. package/dist/commands/campaign/index.d.ts.map +0 -1
  187. package/dist/commands/campaign/index.js +0 -134
  188. package/dist/commands/campaign/index.js.map +0 -1
  189. package/dist/commands/campaign/kind-map.d.ts +0 -6
  190. package/dist/commands/campaign/kind-map.d.ts.map +0 -1
  191. package/dist/commands/campaign/kind-map.js +0 -21
  192. package/dist/commands/campaign/kind-map.js.map +0 -1
  193. package/dist/commands/campaign/mcp-server.d.ts +0 -6
  194. package/dist/commands/campaign/mcp-server.d.ts.map +0 -1
  195. package/dist/commands/campaign/mcp-server.js +0 -167
  196. package/dist/commands/campaign/mcp-server.js.map +0 -1
  197. package/dist/commands/campaign/render.d.ts +0 -5
  198. package/dist/commands/campaign/render.d.ts.map +0 -1
  199. package/dist/commands/campaign/render.js +0 -103
  200. package/dist/commands/campaign/render.js.map +0 -1
  201. package/dist/commands/campaign/trellis-load.d.ts +0 -13
  202. package/dist/commands/campaign/trellis-load.d.ts.map +0 -1
  203. package/dist/commands/campaign/trellis-load.js +0 -122
  204. package/dist/commands/campaign/trellis-load.js.map +0 -1
  205. package/dist/commands/campaign/types.d.ts +0 -61
  206. package/dist/commands/campaign/types.d.ts.map +0 -1
  207. package/dist/commands/campaign/types.js +0 -3
  208. package/dist/commands/campaign/types.js.map +0 -1
  209. package/dist/commands/goal/index.d.ts +0 -3
  210. package/dist/commands/goal/index.d.ts.map +0 -1
  211. package/dist/commands/goal/index.js +0 -159
  212. package/dist/commands/goal/index.js.map +0 -1
  213. package/dist/commands/goal/review.d.ts +0 -6
  214. package/dist/commands/goal/review.d.ts.map +0 -1
  215. package/dist/commands/goal/review.js +0 -28
  216. package/dist/commands/goal/review.js.map +0 -1
  217. package/dist/commands/rpc/client.d.ts +0 -51
  218. package/dist/commands/rpc/client.d.ts.map +0 -1
  219. package/dist/commands/rpc/client.js +0 -147
  220. package/dist/commands/rpc/client.js.map +0 -1
  221. package/dist/commands/rpc/index.d.ts +0 -10
  222. package/dist/commands/rpc/index.d.ts.map +0 -1
  223. package/dist/commands/rpc/index.js +0 -157
  224. package/dist/commands/rpc/index.js.map +0 -1
  225. package/dist/commands/rpc/serve.d.ts +0 -23
  226. package/dist/commands/rpc/serve.d.ts.map +0 -1
  227. package/dist/commands/rpc/serve.js +0 -60
  228. package/dist/commands/rpc/serve.js.map +0 -1
  229. package/dist/commands/rpc/smoke.d.ts +0 -16
  230. package/dist/commands/rpc/smoke.d.ts.map +0 -1
  231. package/dist/commands/rpc/smoke.js +0 -92
  232. package/dist/commands/rpc/smoke.js.map +0 -1
  233. package/dist/commands/sdk/index.d.ts +0 -9
  234. package/dist/commands/sdk/index.d.ts.map +0 -1
  235. package/dist/commands/sdk/index.js +0 -58
  236. package/dist/commands/sdk/index.js.map +0 -1
  237. package/dist/commands/sdk/run.d.ts +0 -42
  238. package/dist/commands/sdk/run.d.ts.map +0 -1
  239. package/dist/commands/sdk/run.js +0 -220
  240. package/dist/commands/sdk/run.js.map +0 -1
  241. package/dist/commands/sdk/status.d.ts +0 -14
  242. package/dist/commands/sdk/status.d.ts.map +0 -1
  243. package/dist/commands/sdk/status.js +0 -69
  244. package/dist/commands/sdk/status.js.map +0 -1
  245. package/dist/configurators/cursor2plus-local.d.ts +0 -6
  246. package/dist/configurators/cursor2plus-local.d.ts.map +0 -1
  247. package/dist/configurators/cursor2plus-local.js +0 -21
  248. package/dist/configurators/cursor2plus-local.js.map +0 -1
  249. package/dist/goal/action-packet.d.ts +0 -89
  250. package/dist/goal/action-packet.d.ts.map +0 -1
  251. package/dist/goal/action-packet.js +0 -113
  252. package/dist/goal/action-packet.js.map +0 -1
  253. package/dist/goal/audit.d.ts +0 -14
  254. package/dist/goal/audit.d.ts.map +0 -1
  255. package/dist/goal/audit.js +0 -12
  256. package/dist/goal/audit.js.map +0 -1
  257. package/dist/goal/constants.d.ts +0 -26
  258. package/dist/goal/constants.d.ts.map +0 -1
  259. package/dist/goal/constants.js +0 -24
  260. package/dist/goal/constants.js.map +0 -1
  261. package/dist/goal/paths.d.ts +0 -8
  262. package/dist/goal/paths.d.ts.map +0 -1
  263. package/dist/goal/paths.js +0 -36
  264. package/dist/goal/paths.js.map +0 -1
  265. package/dist/goal/preflight.d.ts +0 -21
  266. package/dist/goal/preflight.d.ts.map +0 -1
  267. package/dist/goal/preflight.js +0 -97
  268. package/dist/goal/preflight.js.map +0 -1
  269. package/dist/goal/review-seam.d.ts +0 -44
  270. package/dist/goal/review-seam.d.ts.map +0 -1
  271. package/dist/goal/review-seam.js +0 -153
  272. package/dist/goal/review-seam.js.map +0 -1
  273. package/dist/goal/reviewer-rules.d.ts +0 -13
  274. package/dist/goal/reviewer-rules.d.ts.map +0 -1
  275. package/dist/goal/reviewer-rules.js +0 -153
  276. package/dist/goal/reviewer-rules.js.map +0 -1
  277. package/dist/goal/reviewer.d.ts +0 -9
  278. package/dist/goal/reviewer.d.ts.map +0 -1
  279. package/dist/goal/reviewer.js +0 -54
  280. package/dist/goal/reviewer.js.map +0 -1
  281. package/dist/goal/runtime.d.ts +0 -32
  282. package/dist/goal/runtime.d.ts.map +0 -1
  283. package/dist/goal/runtime.js +0 -242
  284. package/dist/goal/runtime.js.map +0 -1
  285. package/dist/goal/sdk-client.d.ts +0 -10
  286. package/dist/goal/sdk-client.d.ts.map +0 -1
  287. package/dist/goal/sdk-client.js +0 -34
  288. package/dist/goal/sdk-client.js.map +0 -1
  289. package/dist/goal/state.d.ts +0 -40
  290. package/dist/goal/state.d.ts.map +0 -1
  291. package/dist/goal/state.js +0 -37
  292. package/dist/goal/state.js.map +0 -1
  293. package/dist/goal/task-triggers.d.ts +0 -15
  294. package/dist/goal/task-triggers.d.ts.map +0 -1
  295. package/dist/goal/task-triggers.js +0 -23
  296. package/dist/goal/task-triggers.js.map +0 -1
  297. package/dist/goal/walls.d.ts +0 -12
  298. package/dist/goal/walls.d.ts.map +0 -1
  299. package/dist/goal/walls.js +0 -65
  300. package/dist/goal/walls.js.map +0 -1
  301. package/dist/goal/worker-prompt.d.ts +0 -13
  302. package/dist/goal/worker-prompt.d.ts.map +0 -1
  303. package/dist/goal/worker-prompt.js +0 -41
  304. package/dist/goal/worker-prompt.js.map +0 -1
  305. package/dist/goal/worker.d.ts +0 -42
  306. package/dist/goal/worker.d.ts.map +0 -1
  307. package/dist/goal/worker.js +0 -180
  308. package/dist/goal/worker.js.map +0 -1
  309. package/dist/templates/common/bundled-skills/cstl-cursor2plus-setup/SKILL.md +0 -63
  310. package/dist/templates/cursor/commands/cursor2plus-setup.md +0 -82
  311. package/dist/templates/cursor/rules/cstl-cursor-modes.mdc +0 -32
  312. package/dist/templates/cursor/rules/cstl-session-rename.mdc +0 -31
  313. package/dist/templates/cursor/rules/cstl-subagent-dispatch.mdc +0 -34
  314. package/dist/templates/cursor/rules/cstl-triage.mdc +0 -36
  315. package/dist/templates/cursor/rules/retrieval-routing.mdc +0 -78
  316. package/dist/templates/markdown/spec/guides/cursor-trellis-release-coexistence-guide.md.txt +0 -166
  317. package/dist/templates/markdown/spec/guides/goal-release-regression-runbook.md.txt +0 -132
  318. package/dist/templates/trellis/local/README.md +0 -85
  319. package/dist/templates/trellis/local/config.local.json.example +0 -6
  320. package/dist/templates/trellis/local/index.d.ts +0 -8
  321. package/dist/templates/trellis/local/index.d.ts.map +0 -1
  322. package/dist/templates/trellis/local/index.js +0 -15
  323. package/dist/templates/trellis/local/index.js.map +0 -1
  324. package/dist/templates/trellis/local/patch_wpelc8.py +0 -421
  325. package/dist/templates/trellis/local/smoke.py +0 -94
  326. package/dist/templates/trellis/local/subagent-models.json.example +0 -4
  327. package/dist/templates/trellis/local/trellis-task-models.json.example +0 -10
  328. package/dist/templates/trellis/local/trellis-task-models.json5.example +0 -45
  329. package/dist/templates/trellis/local/trellis_task_models_config.py +0 -200
  330. package/dist/utils/cursor-sdk-gate.d.ts +0 -10
  331. package/dist/utils/cursor-sdk-gate.d.ts.map +0 -1
  332. package/dist/utils/cursor-sdk-gate.js +0 -32
  333. package/dist/utils/cursor-sdk-gate.js.map +0 -1
  334. /package/dist/templates/markdown/{spec/guides → framework}/artifact-locale-guide.md.txt +0 -0
  335. /package/dist/templates/markdown/{spec/guides → framework}/cursor-context-injection-guide.md.txt +0 -0
  336. /package/dist/templates/markdown/{spec/guides → framework}/cursor-semantic-compliance.md.txt +0 -0
  337. /package/dist/templates/markdown/{spec/guides → framework}/injection-budget-guide.md.txt +0 -0
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import chalk from "chalk";
4
4
  import inquirer from "inquirer";
5
- import { DIR_NAMES, FILE_NAMES, PATHS } from "../constants/paths.js";
5
+ import { DIR_NAMES, FILE_NAMES, PATHS, isUserMiddlewareOverlayPath, } from "../constants/paths.js";
6
6
  import { VERSION, PACKAGE_NAME } from "../constants/version.js";
7
7
  import { getMigrationsForVersion, getAllMigrations, getMigrationMetadata, getConfigSectionsAddedBetween, } from "../migrations/index.js";
8
8
  import { assessCstlDirectoryMigrate } from "../utils/workflow-ownership.js";
@@ -11,29 +11,30 @@ import { loadHashes, saveHashes, updateHashes, isTemplateModified, removeHash, r
11
11
  import { compareVersions } from "../utils/compare-versions.js";
12
12
  import { toPosix } from "../utils/posix.js";
13
13
  import { setupProxy } from "../utils/proxy.js";
14
- import { checkProjectCapabilityReadiness, checkSmartSearchReadiness, } from "../utils/readiness.js";
14
+ import { reportUpdateReadiness, snapshotReadinessForRollout, } from "../utils/readiness.js";
15
15
  import { collectProjectCapabilityTemplates, loadProjectCapabilities, } from "../utils/project-capabilities.js";
16
+ import { applyArtifactMigration, applyKernelCreate, planArtifactMigration, planWaveC, scanContractMigration, writeWaveCConfirmed, } from "@blxzer/cursor-trellis-core/task";
16
17
  import { emptyTaskJson } from "../utils/task-json.js";
18
+ import { applyOfficialRetire, composeP36Plan, officialWorkPending, planOfficialSurfaceA, printP36Vernacular, p36SummaryForRollout, waveCWorkPending, } from "../utils/p36-upgrade.js";
17
19
  // Import templates for comparison
18
- import { cursor2plusPatchScript, cursor2plusReadme, cursor2plusConfigExample, subagentModelsExample, trellisTaskModelsJson5Example, trellisTaskModelsConfigPy, } from "../templates/trellis/local/index.js";
19
20
  import { getAllScripts, getAllPoolSkeleton,
20
21
  // Configuration
21
22
  configYamlTemplate, gitignoreTemplate, workflowMdTemplate, executionStrategyRulesJson, } from "../templates/trellis/index.js";
22
- import { agentsMdContent } from "../templates/markdown/index.js";
23
+ import { agentsMdContent, frameworkDocs } from "../templates/markdown/index.js";
23
24
  import { ALL_MANAGED_DIRS, getConfiguredPlatforms, collectPlatformTemplates, isManagedPath, isManagedRootDir, } from "../configurators/index.js";
24
25
  import { getWorkflowRootTemplateFiles } from "../configurators/workflow.js";
25
26
  import { replacePythonCommandLiterals } from "../configurators/shared.js";
26
27
  import { pruneOrphanManifestKeys } from "../utils/manifest-prune.js";
27
28
  import { runPostUpdateSmoke } from "../utils/post-update-smoke.js";
28
29
  import { assertCursorRulesValid } from "../utils/validate-rules.js";
30
+ import { cleanupCursor2plusResidue, hasCursor2plusBundleResidue, } from "../utils/cursor2plus-residue-cleanup.js";
29
31
  import { buildFilePlanFromChanges, createBaseRolloutReport, emitRolloutReport, migrationResultToSummary, summarizeMigrationPlan, } from "../utils/update-rollout-report.js";
30
- import { snapshotReadinessForRollout } from "../utils/readiness.js";
31
- function logCursor2plusCompatHint(cwd) {
32
- const bundleDir = path.join(cwd, DIR_NAMES.WORKFLOW, "local", "cursor2plus");
33
- if (!fs.existsSync(bundleDir)) {
32
+ function logCursor2plusRetiredResidueNotice(cwd) {
33
+ if (!hasCursor2plusBundleResidue(cwd)) {
34
34
  return;
35
35
  }
36
- console.log(chalk.gray("\nCursor++ BYOK: after Cursor/Cursor++ upgrades, run `python .cstl/local/cursor2plus/patch_wpelc8.py --check-compat` before re-applying Method 2.5."));
36
+ console.log(chalk.yellow("\nCursor++ path retired: leftover `.cstl/local/cursor2plus/` (or `.trellis/…`) is not an install surface."));
37
+ console.log(chalk.gray(" Do not run patch scripts. Unmodified managed residue is removed by update hash-safe cleanup; review and manually delete any user-modified leftover files if unused."));
37
38
  }
38
39
  const CSTL_BLOCK_START = "<!-- CSTL:START -->";
39
40
  const CSTL_BLOCK_END = "<!-- CSTL:END -->";
@@ -48,6 +49,7 @@ const PROTECTED_PATHS = [
48
49
  `${DIR_NAMES.WORKFLOW}/${DIR_NAMES.WORKSPACE}`, // workspace/
49
50
  `${DIR_NAMES.WORKFLOW}/${DIR_NAMES.TASKS}`, // tasks/
50
51
  `${DIR_NAMES.WORKFLOW}/${DIR_NAMES.SPEC}`, // spec/
52
+ PATHS.MIDDLEWARE, // user overlay — never write/delete/hash
51
53
  `${DIR_NAMES.WORKFLOW}/.developer`,
52
54
  `${DIR_NAMES.WORKFLOW}/.current-task`,
53
55
  ];
@@ -509,19 +511,8 @@ bypassUpdateSkip = false) {
509
511
  files.set(`${DIR_NAMES.WORKFLOW}/config.yaml`, configYamlTemplate);
510
512
  files.set(`${DIR_NAMES.WORKFLOW}/config/execution-strategy-rules.json`, executionStrategyRulesJson);
511
513
  files.set(`${DIR_NAMES.WORKFLOW}/.gitignore`, gitignoreTemplate);
512
- const localPrefix = `${DIR_NAMES.WORKFLOW}/local`;
513
- // Cursor++ BYOK bundle is opt-in from 1.1.0. On update, only refresh it
514
- // when the project already has the directory (keep existing installs;
515
- // never inject it into projects that declined the opt-in at init time).
516
- const cursor2plusInstalled = fs.existsSync(path.join(cwd, localPrefix, "cursor2plus"));
517
- if (cursor2plusInstalled) {
518
- files.set(`${localPrefix}/cursor2plus/patch_wpelc8.py`, cursor2plusPatchScript);
519
- files.set(`${localPrefix}/cursor2plus/trellis_task_models_config.py`, trellisTaskModelsConfigPy);
520
- files.set(`${localPrefix}/cursor2plus/README.md`, cursor2plusReadme);
521
- files.set(`${localPrefix}/cursor2plus/config.local.json.example`, cursor2plusConfigExample);
522
- files.set(`${localPrefix}/subagent-models.json.example`, subagentModelsExample);
523
- files.set(`${localPrefix}/trellis-task-models.json5.example`, trellisTaskModelsJson5Example);
524
- }
514
+ // Cursor++ local bundle is retired — never refresh or inject
515
+ // `.cstl/local/cursor2plus/` (or sibling example files) on update.
525
516
  // workflow.md is included here because it is runtime-parsed by
526
517
  // get_context.py and shared hooks. Keep it on the normal template update
527
518
  // path: if the installed file still matches the tracked hash, update the
@@ -530,6 +521,12 @@ bypassUpdateSkip = false) {
530
521
  // platform routing markers outside [workflow-state:*] blocks are also
531
522
  // script-consumed.
532
523
  files.set(`${DIR_NAMES.WORKFLOW}/workflow.md`, workflowMdTemplate);
524
+ // Framework docs (.cstl/framework/) — framework-owned, refreshed by update.
525
+ // New files flow through the standard new/auto-update/hash-conflict
526
+ // analysis; .cstl/spec/ stays fully protected.
527
+ for (const doc of frameworkDocs) {
528
+ files.set(`${PATHS.FRAMEWORK}/${doc.name}`, doc.content);
529
+ }
533
530
  // Project domain glossary stub + ADR rules (user-maintained; conflict
534
531
  // handling works the same as workflow.md — modified files prompt first).
535
532
  for (const [relativePath, content] of getWorkflowRootTemplateFiles()) {
@@ -566,6 +563,14 @@ bypassUpdateSkip = false) {
566
563
  for (const [filePath, content] of files) {
567
564
  files.set(filePath, replacePythonCommandLiterals(content));
568
565
  }
566
+ // User overlay is never a template — strip even if a future collector
567
+ // accidentally adds it. Cursor++ residue cleanup is a separate allow-list
568
+ // and must not target this directory.
569
+ for (const [filePath] of [...files]) {
570
+ if (isUserMiddlewareOverlayPath(filePath)) {
571
+ files.delete(filePath);
572
+ }
573
+ }
569
574
  return files;
570
575
  }
571
576
  /**
@@ -790,6 +795,7 @@ const BACKUP_EXCLUDE_PATTERNS = [
790
795
  "/workspace/", // Developer workspace (user data)
791
796
  "/tasks/", // Task data (user data)
792
797
  "/spec/", // Spec files (user-customized content)
798
+ "/middleware/", // User middleware overlay (never managed)
793
799
  "/backlog/", // Backlog data (user data)
794
800
  "/agent-traces/", // Agent traces (user data, legacy name)
795
801
  // Platform-native worktree dirs — these are full sub-repos the CLI
@@ -1427,6 +1433,7 @@ function rolloutOptionsFromUpdate(options) {
1427
1433
  migrate: Boolean(options.migrate),
1428
1434
  allowDowngrade: Boolean(options.allowDowngrade),
1429
1435
  skipReadiness: Boolean(options.skipReadiness),
1436
+ writeArtifacts: Boolean(options.writeArtifacts),
1430
1437
  };
1431
1438
  }
1432
1439
  function upgradeDirectionFromCompare(cliVsProject, projectVersion) {
@@ -1450,10 +1457,10 @@ function releaseBlockersFromReadiness(readiness, cliBehindNpm, cliVersion, lates
1450
1457
  if (!readiness.skipped && !readiness.smartSearch.ok) {
1451
1458
  blockers.push({
1452
1459
  code: "smart_search_readiness",
1453
- message: "Smart Search readiness did not pass",
1460
+ message: "Smart Search readiness unverified (does not block Proceed?)",
1454
1461
  recovery: [
1455
1462
  "smart-search doctor --format json",
1456
- "cstl update --skip-readiness",
1463
+ "Treat Smart Search as unverified; official files can still update after Proceed?",
1457
1464
  ],
1458
1465
  });
1459
1466
  }
@@ -1461,8 +1468,10 @@ function releaseBlockersFromReadiness(readiness, cliBehindNpm, cliVersion, lates
1461
1468
  if (!cap.ok) {
1462
1469
  blockers.push({
1463
1470
  code: `capability_${cap.id}`,
1464
- message: `Capability ${cap.id} readiness failed`,
1465
- recovery: ["cstl update --skip-readiness"],
1471
+ message: `Capability ${cap.id} readiness unverified (does not block Proceed?)`,
1472
+ recovery: [
1473
+ "Treat this capability as unverified; official files can still update after Proceed?",
1474
+ ],
1466
1475
  });
1467
1476
  }
1468
1477
  }
@@ -1531,21 +1540,12 @@ export async function update(options) {
1531
1540
  console.log(chalk.cyan("══════════════\n"));
1532
1541
  // Set up proxy before any network calls (npm version check)
1533
1542
  setupProxy();
1534
- checkSmartSearchReadiness({
1535
- skipReadiness: options.skipReadiness,
1536
- skipReadinessCommand: "cstl update --skip-readiness",
1537
- });
1538
- checkProjectCapabilityReadiness({
1539
- cwd,
1540
- selected: loadProjectCapabilities(cwd),
1541
- skipReadiness: options.skipReadiness,
1542
- skipReadinessCommand: "cstl update --skip-readiness",
1543
- });
1544
1543
  readinessSnapshot = snapshotReadinessForRollout({
1545
1544
  cwd,
1546
1545
  selected: loadProjectCapabilities(cwd),
1547
1546
  skipReadiness: options.skipReadiness,
1548
1547
  });
1548
+ reportUpdateReadiness(readinessSnapshot);
1549
1549
  // Get versions
1550
1550
  projectVersion = getInstalledVersion(cwd);
1551
1551
  cliVersion = VERSION;
@@ -1716,6 +1716,19 @@ export async function update(options) {
1716
1716
  if (safeFileDeletes.length > 0) {
1717
1717
  printSafeFileDeleteSummary(safeFileDeletes);
1718
1718
  }
1719
+ // Preview Cursor++ residue cleanup (hash-safe; always considered)
1720
+ const cursor2plusResiduePreview = cleanupCursor2plusResidue(cwd, {
1721
+ dryRun: true,
1722
+ });
1723
+ if (cursor2plusResiduePreview.deleted.length > 0) {
1724
+ console.log(chalk.cyan("\nCursor++ residue cleanup (hash-safe):"));
1725
+ for (const rel of cursor2plusResiduePreview.deleted) {
1726
+ console.log(chalk.gray(` would delete: ${rel}`));
1727
+ }
1728
+ }
1729
+ if (cursor2plusResiduePreview.preservedModified.length > 0) {
1730
+ console.log(chalk.yellow(` preserve (user-modified): ${cursor2plusResiduePreview.preservedModified.join(", ")}`));
1731
+ }
1719
1732
  // Analyze changes (pass hashes for modification detection)
1720
1733
  const changes = analyzeChanges(cwd, hashes, templates);
1721
1734
  const missingAgentsMdHash = collectMissingAgentsMdHash(changes, hashes);
@@ -1733,6 +1746,7 @@ export async function update(options) {
1733
1746
  userDeletedFiles: changes.userDeletedFiles,
1734
1747
  safeDeletePaths,
1735
1748
  });
1749
+ const p36State = {};
1736
1750
  const emitRollout = (outcome, extra) => {
1737
1751
  const readiness = readinessSnapshot ??
1738
1752
  snapshotReadinessForRollout({
@@ -1759,11 +1773,32 @@ export async function update(options) {
1759
1773
  apply: extra?.apply,
1760
1774
  postUpdateSmoke: extra?.postUpdateSmoke,
1761
1775
  releaseBlockers: releaseBlockersFromReadiness(readiness, cliVsNpm < 0 && latestNpmVersion !== null, cliVersion, latestNpmVersion),
1776
+ p36: extra?.p36 ?? p36State.report,
1762
1777
  });
1763
1778
  finishRollout(options, report);
1764
1779
  };
1765
1780
  // Print summary
1766
1781
  printChangeSummary(changes);
1782
+ const officialPlan = planOfficialSurfaceA({
1783
+ cwd,
1784
+ hashes,
1785
+ refresh: changes.autoUpdateFiles.map((file) => file.relativePath),
1786
+ preserved: changes.changedFiles.map((file) => file.relativePath),
1787
+ added: changes.newFiles.map((file) => file.relativePath),
1788
+ });
1789
+ const artifactPlan = planArtifactMigration({ root: cwd });
1790
+ const waveCPlan = planWaveC({
1791
+ root: cwd,
1792
+ report: scanContractMigration({ root: cwd }),
1793
+ });
1794
+ const p36Plan = composeP36Plan({
1795
+ official: officialPlan,
1796
+ artifacts: artifactPlan,
1797
+ writeArtifacts: Boolean(options.writeArtifacts),
1798
+ waveC: waveCPlan,
1799
+ });
1800
+ p36State.report = p36SummaryForRollout(p36Plan);
1801
+ printP36Vernacular(p36Plan);
1767
1802
  // First-time hash tracking hint
1768
1803
  if (isFirstHashTracking && changes.changedFiles.length > 0) {
1769
1804
  console.log(chalk.cyan("ℹ️ First update with hash tracking enabled."));
@@ -1779,11 +1814,17 @@ export async function update(options) {
1779
1814
  classifiedMigrations &&
1780
1815
  (classifiedMigrations.auto.length > 0 ||
1781
1816
  classifiedMigrations.confirm.length > 0);
1817
+ const hasOfficialP36 = officialWorkPending(officialPlan);
1818
+ const hasMaintainerArtifactWrites = Boolean(options.writeArtifacts) && artifactPlan.writable.length > 0;
1819
+ const hasWaveCPending = waveCWorkPending(p36Plan);
1782
1820
  if (changes.newFiles.length === 0 &&
1783
1821
  changes.autoUpdateFiles.length === 0 &&
1784
1822
  changes.changedFiles.length === 0 &&
1785
1823
  !hasPendingMigrations &&
1786
- !hasSafeDeletes) {
1824
+ !hasSafeDeletes &&
1825
+ !hasOfficialP36 &&
1826
+ !hasMaintainerArtifactWrites &&
1827
+ !hasWaveCPending) {
1787
1828
  if (!options.dryRun && missingAgentsMdHash.size > 0) {
1788
1829
  updateHashes(cwd, missingAgentsMdHash);
1789
1830
  }
@@ -1853,6 +1894,10 @@ export async function update(options) {
1853
1894
  emitRollout("would_apply", { files: buildRolloutFilePlan() });
1854
1895
  return;
1855
1896
  }
1897
+ // File-conflict flags (--force / --skip-all / --create-new) consent to apply
1898
+ // official A writes. They are not Wave C stop-read confirm. Only interactive
1899
+ // Proceed? yes writes `.cstl/.p36-wave-c.json`.
1900
+ let waveCInteractivelyConfirmed = false;
1856
1901
  // Batch-resolution flags are explicit consent for non-interactive runs.
1857
1902
  // Prompting here breaks CI and `node ... update --force --migrate` smoke tests.
1858
1903
  if (!options.force && !options.skipAll && !options.createNew) {
@@ -1878,6 +1923,7 @@ export async function update(options) {
1878
1923
  emitRollout("cancelled", { files: buildRolloutFilePlan() });
1879
1924
  return;
1880
1925
  }
1926
+ waveCInteractivelyConfirmed = true;
1881
1927
  }
1882
1928
  // Create complete backup of all managed platform/workflow directories
1883
1929
  const backupDir = createFullBackup(cwd);
@@ -1885,6 +1931,10 @@ export async function update(options) {
1885
1931
  if (backupDir) {
1886
1932
  console.log(chalk.gray(`\nBackup created: ${path.relative(cwd, backupDir)}/`));
1887
1933
  }
1934
+ const officialRetired = applyOfficialRetire(cwd, officialPlan);
1935
+ if (officialRetired > 0) {
1936
+ console.log(chalk.cyan(`\nStopped ${officialRetired} extra official always-on rule(s)`));
1937
+ }
1888
1938
  // Execute migrations if --migrate flag is set
1889
1939
  if (options.migrate && classifiedMigrations) {
1890
1940
  const pendingRenameItems = [
@@ -1946,6 +1996,15 @@ export async function update(options) {
1946
1996
  console.log(chalk.cyan(`\nCleaned up ${safeDeleted} deprecated command file(s)`));
1947
1997
  }
1948
1998
  }
1999
+ // Hash-safe Cursor++ residue cleanup (retired product surfaces)
2000
+ const cursor2plusCleanup = cleanupCursor2plusResidue(cwd);
2001
+ if (cursor2plusCleanup.deleted.length > 0) {
2002
+ safeDeleted += cursor2plusCleanup.deleted.length;
2003
+ console.log(chalk.cyan(`\nCleaned up ${cursor2plusCleanup.deleted.length} retired Cursor++ file(s)`));
2004
+ }
2005
+ if (cursor2plusCleanup.preservedModified.length > 0) {
2006
+ console.log(chalk.yellow(`Preserved user-modified Cursor++ residue: ${cursor2plusCleanup.preservedModified.join(", ")}`));
2007
+ }
1949
2008
  // Track results
1950
2009
  let added = 0;
1951
2010
  let autoUpdated = 0;
@@ -2050,6 +2109,22 @@ export async function update(options) {
2050
2109
  if (filesToHash.size > 0) {
2051
2110
  updateHashes(cwd, filesToHash);
2052
2111
  }
2112
+ let artifactApply = null;
2113
+ if (options.writeArtifacts && artifactPlan.writable.length > 0) {
2114
+ artifactApply = applyArtifactMigration({
2115
+ root: cwd,
2116
+ plan: artifactPlan,
2117
+ });
2118
+ if (artifactApply.ok) {
2119
+ console.log(chalk.cyan(`\nWrote ${artifactApply.written} artifact projection(s); business text kept.`));
2120
+ }
2121
+ else {
2122
+ console.log(chalk.yellow("产物写入失败,已回到双读。项目仍可用,可再跑 update。"));
2123
+ if (artifactApply.error) {
2124
+ console.log(chalk.gray(` ${artifactApply.error}`));
2125
+ }
2126
+ }
2127
+ }
2053
2128
  // Print summary
2054
2129
  console.log(chalk.cyan("\n--- Summary ---\n"));
2055
2130
  if (added > 0) {
@@ -2073,12 +2148,36 @@ export async function update(options) {
2073
2148
  if (configSectionsAppended > 0) {
2074
2149
  console.log(` Config sections added: ${configSectionsAppended}`);
2075
2150
  }
2151
+ if (officialRetired > 0) {
2152
+ console.log(` Official always-on stopped: ${officialRetired}`);
2153
+ }
2154
+ if (artifactApply?.ok && artifactApply.written > 0) {
2155
+ console.log(` Artifact projections written: ${artifactApply.written}`);
2156
+ }
2157
+ if (artifactApply && !artifactApply.ok) {
2158
+ console.log(" Artifact projections: rolled back to dual-read");
2159
+ }
2160
+ if (hasWaveCPending && waveCInteractivelyConfirmed) {
2161
+ try {
2162
+ writeWaveCConfirmed(cwd);
2163
+ console.log(" 已确认停读旧形状(leftover kind/mode/classification 不再当唯一真相)");
2164
+ }
2165
+ catch (err) {
2166
+ console.log(chalk.yellow("停读确认未写上。项目仍可用,旧字段仍双读,可再跑 update。"));
2167
+ if (err instanceof Error && err.message) {
2168
+ console.log(chalk.gray(` ${err.message}`));
2169
+ }
2170
+ }
2171
+ }
2172
+ else if (hasWaveCPending) {
2173
+ console.log(chalk.yellow(" 旧字段仍双读。停读需要再跑一次交互式 `cstl update` 并确认 Proceed?(--force / --skip-all / --create-new 不算停读确认)。"));
2174
+ }
2076
2175
  if (backupDir) {
2077
2176
  console.log(` Backup: ${path.relative(cwd, backupDir)}/`);
2078
2177
  }
2079
2178
  const actionWord = isDowngrade ? "Downgrade" : "Update";
2080
2179
  console.log(chalk.green(`\n✅ ${actionWord} complete! (${projectVersion} → ${cliVersion})`));
2081
- logCursor2plusCompatHint(cwd);
2180
+ logCursor2plusRetiredResidueNotice(cwd);
2082
2181
  if (createdNew > 0) {
2083
2182
  console.log(chalk.gray("\nTip: Review .new files and merge changes manually if needed."));
2084
2183
  }
@@ -2129,9 +2228,13 @@ export async function update(options) {
2129
2228
  assignee: currentDeveloper,
2130
2229
  createdAt: todayStr,
2131
2230
  });
2132
- // Write task.json
2133
- const taskJsonPath = path.join(taskDir, "task.json");
2134
- fs.writeFileSync(taskJsonPath, JSON.stringify(taskJson, null, 2));
2231
+ applyKernelCreate({
2232
+ taskDir,
2233
+ actor: "cstl update",
2234
+ idempotencyKey: `update:${taskSlug}`,
2235
+ record: taskJson,
2236
+ evidence: "cstl update migration skeleton",
2237
+ });
2135
2238
  // Build PRD content
2136
2239
  let prdContent = `# Migration Task: Upgrade to v${cliVersion}\n\n`;
2137
2240
  prdContent += `**Created**: ${todayStr}\n`;