@blxzer/pactile 0.6.0-beta.2 → 0.6.0-beta.5

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 (704) hide show
  1. package/README.md +93 -84
  2. package/README.zh-CN.md +90 -81
  3. package/dist/bin/compat-warning.d.ts +2 -0
  4. package/dist/bin/compat-warning.d.ts.map +1 -0
  5. package/dist/bin/compat-warning.js +8 -0
  6. package/dist/bin/compat-warning.js.map +1 -0
  7. package/dist/bin/cstl.d.ts +3 -0
  8. package/dist/bin/cstl.d.ts.map +1 -0
  9. package/{bin → dist/bin}/cstl.js +2 -3
  10. package/dist/bin/cstl.js.map +1 -0
  11. package/dist/bin/pactile.d.ts +3 -0
  12. package/dist/bin/pactile.d.ts.map +1 -0
  13. package/dist/bin/pactile.js +4 -0
  14. package/dist/bin/pactile.js.map +1 -0
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +77 -17
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/commands/capability.d.ts +3 -0
  19. package/dist/commands/capability.d.ts.map +1 -0
  20. package/dist/commands/capability.js +129 -0
  21. package/dist/commands/capability.js.map +1 -0
  22. package/dist/commands/codex.d.ts.map +1 -1
  23. package/dist/commands/codex.js +54 -6
  24. package/dist/commands/codex.js.map +1 -1
  25. package/dist/commands/context.d.ts +2 -0
  26. package/dist/commands/context.d.ts.map +1 -1
  27. package/dist/commands/context.js +367 -41
  28. package/dist/commands/context.js.map +1 -1
  29. package/dist/commands/detach.d.ts.map +1 -1
  30. package/dist/commands/detach.js +5 -4
  31. package/dist/commands/detach.js.map +1 -1
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +615 -259
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/legacy-task.d.ts +3 -0
  36. package/dist/commands/legacy-task.d.ts.map +1 -0
  37. package/dist/commands/legacy-task.js +295 -0
  38. package/dist/commands/legacy-task.js.map +1 -0
  39. package/dist/commands/pi.d.ts +3 -2
  40. package/dist/commands/pi.d.ts.map +1 -1
  41. package/dist/commands/pi.js +333 -10
  42. package/dist/commands/pi.js.map +1 -1
  43. package/dist/commands/session.d.ts.map +1 -1
  44. package/dist/commands/session.js +148 -24
  45. package/dist/commands/session.js.map +1 -1
  46. package/dist/commands/task-schedule.d.ts +17 -0
  47. package/dist/commands/task-schedule.d.ts.map +1 -0
  48. package/dist/commands/task-schedule.js +395 -0
  49. package/dist/commands/task-schedule.js.map +1 -0
  50. package/dist/commands/task-verify-plan.d.ts +3 -0
  51. package/dist/commands/task-verify-plan.d.ts.map +1 -0
  52. package/dist/commands/task-verify-plan.js +503 -0
  53. package/dist/commands/task-verify-plan.js.map +1 -0
  54. package/dist/commands/task-worktree-close.d.ts +4 -0
  55. package/dist/commands/task-worktree-close.d.ts.map +1 -0
  56. package/dist/commands/task-worktree-close.js +81 -0
  57. package/dist/commands/task-worktree-close.js.map +1 -0
  58. package/dist/commands/task.d.ts +3 -0
  59. package/dist/commands/task.d.ts.map +1 -1
  60. package/dist/commands/task.js +1373 -184
  61. package/dist/commands/task.js.map +1 -1
  62. package/dist/commands/tile-selection.d.ts +3 -0
  63. package/dist/commands/tile-selection.d.ts.map +1 -0
  64. package/dist/commands/tile-selection.js +174 -0
  65. package/dist/commands/tile-selection.js.map +1 -0
  66. package/dist/commands/update.d.ts +1 -1
  67. package/dist/commands/update.d.ts.map +1 -1
  68. package/dist/commands/update.js +80 -55
  69. package/dist/commands/update.js.map +1 -1
  70. package/dist/commands/worktree.d.ts +4 -0
  71. package/dist/commands/worktree.d.ts.map +1 -0
  72. package/dist/commands/worktree.js +198 -0
  73. package/dist/commands/worktree.js.map +1 -0
  74. package/dist/configurators/shared.js +1 -1
  75. package/dist/configurators/shared.js.map +1 -1
  76. package/dist/core/compat/environment.d.ts +0 -1
  77. package/dist/core/compat/environment.d.ts.map +1 -1
  78. package/dist/core/compat/environment.js +1 -9
  79. package/dist/core/compat/environment.js.map +1 -1
  80. package/dist/core/pactile/bounded-capabilities.d.ts +127 -0
  81. package/dist/core/pactile/bounded-capabilities.d.ts.map +1 -0
  82. package/dist/core/pactile/bounded-capabilities.js +188 -0
  83. package/dist/core/pactile/bounded-capabilities.js.map +1 -0
  84. package/dist/core/pactile/index.d.ts +1 -0
  85. package/dist/core/pactile/index.d.ts.map +1 -1
  86. package/dist/core/pactile/index.js +1 -0
  87. package/dist/core/pactile/index.js.map +1 -1
  88. package/dist/core/task/index.d.ts +4 -2
  89. package/dist/core/task/index.d.ts.map +1 -1
  90. package/dist/core/task/index.js +2 -1
  91. package/dist/core/task/index.js.map +1 -1
  92. package/dist/core/task/kernel-cli.d.ts +14 -1
  93. package/dist/core/task/kernel-cli.d.ts.map +1 -1
  94. package/dist/core/task/kernel-cli.js +128 -0
  95. package/dist/core/task/kernel-cli.js.map +1 -1
  96. package/dist/core/task/kernel-contract.d.ts +6 -3
  97. package/dist/core/task/kernel-contract.d.ts.map +1 -1
  98. package/dist/core/task/kernel-contract.js +71 -23
  99. package/dist/core/task/kernel-contract.js.map +1 -1
  100. package/dist/core/task/kernel-store.d.ts +6 -0
  101. package/dist/core/task/kernel-store.d.ts.map +1 -1
  102. package/dist/core/task/kernel-store.js +54 -2
  103. package/dist/core/task/kernel-store.js.map +1 -1
  104. package/dist/core/task/legacy-task-migration-reader.d.ts +137 -0
  105. package/dist/core/task/legacy-task-migration-reader.d.ts.map +1 -0
  106. package/dist/core/task/legacy-task-migration-reader.js +512 -0
  107. package/dist/core/task/legacy-task-migration-reader.js.map +1 -0
  108. package/dist/core/task/legacy-task-migration.d.ts +105 -0
  109. package/dist/core/task/legacy-task-migration.d.ts.map +1 -0
  110. package/dist/core/task/legacy-task-migration.js +562 -0
  111. package/dist/core/task/legacy-task-migration.js.map +1 -0
  112. package/dist/core/task/legacy-task-overlay-durable-io.d.ts +18 -0
  113. package/dist/core/task/legacy-task-overlay-durable-io.d.ts.map +1 -0
  114. package/dist/core/task/legacy-task-overlay-durable-io.js +66 -0
  115. package/dist/core/task/legacy-task-overlay-durable-io.js.map +1 -0
  116. package/dist/core/task/legacy-task-reconciliation-reader.d.ts +26 -0
  117. package/dist/core/task/legacy-task-reconciliation-reader.d.ts.map +1 -0
  118. package/dist/core/task/legacy-task-reconciliation-reader.js +324 -0
  119. package/dist/core/task/legacy-task-reconciliation-reader.js.map +1 -0
  120. package/dist/core/task/legacy-task-v2-import.d.ts +67 -0
  121. package/dist/core/task/legacy-task-v2-import.d.ts.map +1 -0
  122. package/dist/core/task/legacy-task-v2-import.js +1046 -0
  123. package/dist/core/task/legacy-task-v2-import.js.map +1 -0
  124. package/dist/core/task/project-file-observer.d.ts +46 -0
  125. package/dist/core/task/project-file-observer.d.ts.map +1 -0
  126. package/dist/core/task/project-file-observer.js +618 -0
  127. package/dist/core/task/project-file-observer.js.map +1 -0
  128. package/dist/core/task/start-authority.d.ts +14 -0
  129. package/dist/core/task/start-authority.d.ts.map +1 -0
  130. package/dist/core/task/start-authority.js +146 -0
  131. package/dist/core/task/start-authority.js.map +1 -0
  132. package/dist/core/task/strategy.d.ts +24 -0
  133. package/dist/core/task/strategy.d.ts.map +1 -0
  134. package/dist/core/task/strategy.js +136 -0
  135. package/dist/core/task/strategy.js.map +1 -0
  136. package/dist/core/task/task-candidate-observer.d.ts +111 -0
  137. package/dist/core/task/task-candidate-observer.d.ts.map +1 -0
  138. package/dist/core/task/task-candidate-observer.js +762 -0
  139. package/dist/core/task/task-candidate-observer.js.map +1 -0
  140. package/dist/core/task/task-kernel-close.d.ts +5 -0
  141. package/dist/core/task/task-kernel-close.d.ts.map +1 -0
  142. package/dist/core/task/task-kernel-close.js +367 -0
  143. package/dist/core/task/task-kernel-close.js.map +1 -0
  144. package/dist/core/task/task-kernel-dependencies.d.ts +3 -0
  145. package/dist/core/task/task-kernel-dependencies.d.ts.map +1 -0
  146. package/dist/core/task/task-kernel-dependencies.js +24 -0
  147. package/dist/core/task/task-kernel-dependencies.js.map +1 -0
  148. package/dist/core/task/task-kernel-host.d.ts +5 -0
  149. package/dist/core/task/task-kernel-host.d.ts.map +1 -0
  150. package/dist/core/task/task-kernel-host.js +136 -0
  151. package/dist/core/task/task-kernel-host.js.map +1 -0
  152. package/dist/core/task/task-kernel-paths.d.ts +19 -0
  153. package/dist/core/task/task-kernel-paths.d.ts.map +1 -0
  154. package/dist/core/task/task-kernel-paths.js +237 -0
  155. package/dist/core/task/task-kernel-paths.js.map +1 -0
  156. package/dist/core/task/task-kernel-reviews.d.ts +3 -0
  157. package/dist/core/task/task-kernel-reviews.d.ts.map +1 -0
  158. package/dist/core/task/task-kernel-reviews.js +100 -0
  159. package/dist/core/task/task-kernel-reviews.js.map +1 -0
  160. package/dist/core/task/task-kernel-runs.d.ts +5 -0
  161. package/dist/core/task/task-kernel-runs.d.ts.map +1 -0
  162. package/dist/core/task/task-kernel-runs.js +196 -0
  163. package/dist/core/task/task-kernel-runs.js.map +1 -0
  164. package/dist/core/task/task-kernel-schema.d.ts +29 -0
  165. package/dist/core/task/task-kernel-schema.d.ts.map +1 -0
  166. package/dist/core/task/task-kernel-schema.js +1169 -0
  167. package/dist/core/task/task-kernel-schema.js.map +1 -0
  168. package/dist/core/task/task-kernel-store-v2.d.ts +33 -0
  169. package/dist/core/task/task-kernel-store-v2.d.ts.map +1 -0
  170. package/dist/core/task/task-kernel-store-v2.js +574 -0
  171. package/dist/core/task/task-kernel-store-v2.js.map +1 -0
  172. package/dist/core/task/task-kernel-types.d.ts +585 -0
  173. package/dist/core/task/task-kernel-types.d.ts.map +1 -0
  174. package/dist/core/task/task-kernel-types.js +31 -0
  175. package/dist/core/task/task-kernel-types.js.map +1 -0
  176. package/dist/core/task/task-kernel-workspaces.d.ts +10 -0
  177. package/dist/core/task/task-kernel-workspaces.d.ts.map +1 -0
  178. package/dist/core/task/task-kernel-workspaces.js +250 -0
  179. package/dist/core/task/task-kernel-workspaces.js.map +1 -0
  180. package/dist/core/task/task-kernel-write-set.d.ts +3 -0
  181. package/dist/core/task/task-kernel-write-set.d.ts.map +1 -0
  182. package/dist/core/task/task-kernel-write-set.js +12 -0
  183. package/dist/core/task/task-kernel-write-set.js.map +1 -0
  184. package/dist/core/task/task-kernel.d.ts +19 -0
  185. package/dist/core/task/task-kernel.d.ts.map +1 -0
  186. package/dist/core/task/task-kernel.js +17 -0
  187. package/dist/core/task/task-kernel.js.map +1 -0
  188. package/dist/core/task/task-pull-request-observer.d.ts +25 -0
  189. package/dist/core/task/task-pull-request-observer.d.ts.map +1 -0
  190. package/dist/core/task/task-pull-request-observer.js +187 -0
  191. package/dist/core/task/task-pull-request-observer.js.map +1 -0
  192. package/dist/core/task/task-review-evidence.d.ts +27 -0
  193. package/dist/core/task/task-review-evidence.d.ts.map +1 -0
  194. package/dist/core/task/task-review-evidence.js +383 -0
  195. package/dist/core/task/task-review-evidence.js.map +1 -0
  196. package/dist/migrations/index.d.ts +1 -1
  197. package/dist/migrations/index.d.ts.map +1 -1
  198. package/dist/migrations/index.js +5 -3
  199. package/dist/migrations/index.js.map +1 -1
  200. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  201. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  202. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  203. package/dist/pactile/artifacts/documents.d.ts +72 -0
  204. package/dist/pactile/artifacts/documents.d.ts.map +1 -0
  205. package/dist/pactile/artifacts/documents.js +406 -0
  206. package/dist/pactile/artifacts/documents.js.map +1 -0
  207. package/dist/pactile/artifacts/index.d.ts +6 -0
  208. package/dist/pactile/artifacts/index.d.ts.map +1 -0
  209. package/dist/pactile/artifacts/index.js +6 -0
  210. package/dist/pactile/artifacts/index.js.map +1 -0
  211. package/dist/pactile/artifacts/projection.d.ts +50 -0
  212. package/dist/pactile/artifacts/projection.d.ts.map +1 -0
  213. package/dist/pactile/artifacts/projection.js +139 -0
  214. package/dist/pactile/artifacts/projection.js.map +1 -0
  215. package/dist/pactile/artifacts/reader.d.ts +20 -0
  216. package/dist/pactile/artifacts/reader.d.ts.map +1 -0
  217. package/dist/pactile/artifacts/reader.js +559 -0
  218. package/dist/pactile/artifacts/reader.js.map +1 -0
  219. package/dist/pactile/artifacts/schema.d.ts +4 -0
  220. package/dist/pactile/artifacts/schema.d.ts.map +1 -0
  221. package/dist/pactile/artifacts/schema.js +217 -0
  222. package/dist/pactile/artifacts/schema.js.map +1 -0
  223. package/dist/pactile/artifacts/types.d.ts +66 -0
  224. package/dist/pactile/artifacts/types.d.ts.map +1 -0
  225. package/dist/pactile/artifacts/types.js +45 -0
  226. package/dist/pactile/artifacts/types.js.map +1 -0
  227. package/dist/pactile/capabilities/claim.d.ts +3 -0
  228. package/dist/pactile/capabilities/claim.d.ts.map +1 -0
  229. package/dist/pactile/capabilities/claim.js +97 -0
  230. package/dist/pactile/capabilities/claim.js.map +1 -0
  231. package/dist/pactile/capabilities/command.d.ts +6 -0
  232. package/dist/pactile/capabilities/command.d.ts.map +1 -0
  233. package/dist/pactile/capabilities/command.js +253 -0
  234. package/dist/pactile/capabilities/command.js.map +1 -0
  235. package/dist/pactile/capabilities/discover.d.ts +6 -0
  236. package/dist/pactile/capabilities/discover.d.ts.map +1 -0
  237. package/dist/pactile/capabilities/discover.js +48 -0
  238. package/dist/pactile/capabilities/discover.js.map +1 -0
  239. package/dist/pactile/capabilities/node.d.ts +15 -0
  240. package/dist/pactile/capabilities/node.d.ts.map +1 -0
  241. package/dist/pactile/capabilities/node.js +292 -0
  242. package/dist/pactile/capabilities/node.js.map +1 -0
  243. package/dist/pactile/capabilities/read.d.ts +6 -0
  244. package/dist/pactile/capabilities/read.d.ts.map +1 -0
  245. package/dist/pactile/capabilities/read.js +100 -0
  246. package/dist/pactile/capabilities/read.js.map +1 -0
  247. package/dist/pactile/capabilities/receipts.d.ts +17 -0
  248. package/dist/pactile/capabilities/receipts.d.ts.map +1 -0
  249. package/dist/pactile/capabilities/receipts.js +90 -0
  250. package/dist/pactile/capabilities/receipts.js.map +1 -0
  251. package/dist/pactile/capabilities/search.d.ts +6 -0
  252. package/dist/pactile/capabilities/search.d.ts.map +1 -0
  253. package/dist/pactile/capabilities/search.js +181 -0
  254. package/dist/pactile/capabilities/search.js.map +1 -0
  255. package/dist/pactile/capabilities/shared.d.ts +29 -0
  256. package/dist/pactile/capabilities/shared.d.ts.map +1 -0
  257. package/dist/pactile/capabilities/shared.js +134 -0
  258. package/dist/pactile/capabilities/shared.js.map +1 -0
  259. package/dist/pactile/capabilities/workspace.d.ts +19 -0
  260. package/dist/pactile/capabilities/workspace.d.ts.map +1 -0
  261. package/dist/pactile/capabilities/workspace.js +273 -0
  262. package/dist/pactile/capabilities/workspace.js.map +1 -0
  263. package/dist/pactile/codex/bridge.d.ts +105 -2
  264. package/dist/pactile/codex/bridge.d.ts.map +1 -1
  265. package/dist/pactile/codex/bridge.js +1266 -92
  266. package/dist/pactile/codex/bridge.js.map +1 -1
  267. package/dist/pactile/codex/dispatch-stop-proof.d.ts +43 -0
  268. package/dist/pactile/codex/dispatch-stop-proof.d.ts.map +1 -0
  269. package/dist/pactile/codex/dispatch-stop-proof.js +177 -0
  270. package/dist/pactile/codex/dispatch-stop-proof.js.map +1 -0
  271. package/dist/pactile/codex/host-stop.d.ts +47 -0
  272. package/dist/pactile/codex/host-stop.d.ts.map +1 -0
  273. package/dist/pactile/codex/host-stop.js +344 -0
  274. package/dist/pactile/codex/host-stop.js.map +1 -0
  275. package/dist/pactile/coordination/index.d.ts +4 -0
  276. package/dist/pactile/coordination/index.d.ts.map +1 -0
  277. package/dist/pactile/coordination/index.js +4 -0
  278. package/dist/pactile/coordination/index.js.map +1 -0
  279. package/dist/pactile/coordination/journal.d.ts +10 -0
  280. package/dist/pactile/coordination/journal.d.ts.map +1 -0
  281. package/dist/pactile/coordination/journal.js +255 -0
  282. package/dist/pactile/coordination/journal.js.map +1 -0
  283. package/dist/pactile/coordination/kernel-resume.d.ts +8 -0
  284. package/dist/pactile/coordination/kernel-resume.d.ts.map +1 -0
  285. package/dist/pactile/coordination/kernel-resume.js +87 -0
  286. package/dist/pactile/coordination/kernel-resume.js.map +1 -0
  287. package/dist/pactile/coordination/model.d.ts +553 -0
  288. package/dist/pactile/coordination/model.d.ts.map +1 -0
  289. package/dist/pactile/coordination/model.js +239 -0
  290. package/dist/pactile/coordination/model.js.map +1 -0
  291. package/dist/pactile/coordination/state.d.ts +46 -0
  292. package/dist/pactile/coordination/state.d.ts.map +1 -0
  293. package/dist/pactile/coordination/state.js +301 -0
  294. package/dist/pactile/coordination/state.js.map +1 -0
  295. package/dist/pactile/coordination/store.d.ts +94 -0
  296. package/dist/pactile/coordination/store.d.ts.map +1 -0
  297. package/dist/pactile/coordination/store.js +396 -0
  298. package/dist/pactile/coordination/store.js.map +1 -0
  299. package/dist/pactile/index.d.ts +7 -1
  300. package/dist/pactile/index.d.ts.map +1 -1
  301. package/dist/pactile/index.js +7 -1
  302. package/dist/pactile/index.js.map +1 -1
  303. package/dist/pactile/jev/contracts.d.ts +104 -0
  304. package/dist/pactile/jev/contracts.d.ts.map +1 -0
  305. package/dist/pactile/jev/contracts.js +53 -0
  306. package/dist/pactile/jev/contracts.js.map +1 -0
  307. package/dist/pactile/jev/decision.d.ts +58 -0
  308. package/dist/pactile/jev/decision.d.ts.map +1 -0
  309. package/dist/pactile/jev/decision.js +149 -0
  310. package/dist/pactile/jev/decision.js.map +1 -0
  311. package/dist/pactile/jev/http.d.ts +25 -0
  312. package/dist/pactile/jev/http.d.ts.map +1 -0
  313. package/dist/pactile/jev/http.js +234 -0
  314. package/dist/pactile/jev/http.js.map +1 -0
  315. package/dist/pactile/jev/index.d.ts +8 -0
  316. package/dist/pactile/jev/index.d.ts.map +1 -0
  317. package/dist/pactile/jev/index.js +4 -0
  318. package/dist/pactile/jev/index.js.map +1 -0
  319. package/dist/pactile/jev/outbound.d.ts +15 -0
  320. package/dist/pactile/jev/outbound.d.ts.map +1 -0
  321. package/dist/pactile/jev/outbound.js +264 -0
  322. package/dist/pactile/jev/outbound.js.map +1 -0
  323. package/dist/pactile/jev/project-policy.d.ts +10 -0
  324. package/dist/pactile/jev/project-policy.d.ts.map +1 -0
  325. package/dist/pactile/jev/project-policy.js +53 -0
  326. package/dist/pactile/jev/project-policy.js.map +1 -0
  327. package/dist/pactile/jev/response.d.ts +17 -0
  328. package/dist/pactile/jev/response.d.ts.map +1 -0
  329. package/dist/pactile/jev/response.js +280 -0
  330. package/dist/pactile/jev/response.js.map +1 -0
  331. package/dist/pactile/jev/scheduler-advice.d.ts +92 -0
  332. package/dist/pactile/jev/scheduler-advice.d.ts.map +1 -0
  333. package/dist/pactile/jev/scheduler-advice.js +323 -0
  334. package/dist/pactile/jev/scheduler-advice.js.map +1 -0
  335. package/dist/pactile/jev/transport.d.ts +6 -0
  336. package/dist/pactile/jev/transport.d.ts.map +1 -0
  337. package/dist/pactile/jev/transport.js +87 -0
  338. package/dist/pactile/jev/transport.js.map +1 -0
  339. package/dist/pactile/lifecycle/deferred-live.d.ts +17 -0
  340. package/dist/pactile/lifecycle/deferred-live.d.ts.map +1 -0
  341. package/dist/pactile/lifecycle/deferred-live.js +173 -0
  342. package/dist/pactile/lifecycle/deferred-live.js.map +1 -0
  343. package/dist/pactile/lifecycle/legacy-import.d.ts +1 -1
  344. package/dist/pactile/lifecycle/legacy-import.js +3 -3
  345. package/dist/pactile/lifecycle/legacy-import.js.map +1 -1
  346. package/dist/pactile/lifecycle/project-files.d.ts.map +1 -1
  347. package/dist/pactile/lifecycle/project-files.js +1 -0
  348. package/dist/pactile/lifecycle/project-files.js.map +1 -1
  349. package/dist/pactile/migration/legacy-task-batch-generation.d.ts +23 -0
  350. package/dist/pactile/migration/legacy-task-batch-generation.d.ts.map +1 -0
  351. package/dist/pactile/migration/legacy-task-batch-generation.js +102 -0
  352. package/dist/pactile/migration/legacy-task-batch-generation.js.map +1 -0
  353. package/dist/pactile/migration/legacy-task-batch-io.d.ts +9 -0
  354. package/dist/pactile/migration/legacy-task-batch-io.d.ts.map +1 -0
  355. package/dist/pactile/migration/legacy-task-batch-io.js +208 -0
  356. package/dist/pactile/migration/legacy-task-batch-io.js.map +1 -0
  357. package/dist/pactile/migration/legacy-task-batch-journal.d.ts +6 -0
  358. package/dist/pactile/migration/legacy-task-batch-journal.d.ts.map +1 -0
  359. package/dist/pactile/migration/legacy-task-batch-journal.js +121 -0
  360. package/dist/pactile/migration/legacy-task-batch-journal.js.map +1 -0
  361. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts +18 -0
  362. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts.map +1 -0
  363. package/dist/pactile/migration/legacy-task-batch-orchestrator.js +634 -0
  364. package/dist/pactile/migration/legacy-task-batch-orchestrator.js.map +1 -0
  365. package/dist/pactile/migration/legacy-task-batch-source.d.ts +8 -0
  366. package/dist/pactile/migration/legacy-task-batch-source.d.ts.map +1 -0
  367. package/dist/pactile/migration/legacy-task-batch-source.js +158 -0
  368. package/dist/pactile/migration/legacy-task-batch-source.js.map +1 -0
  369. package/dist/pactile/migration/legacy-task-batch-types.d.ts +127 -0
  370. package/dist/pactile/migration/legacy-task-batch-types.d.ts.map +1 -0
  371. package/dist/pactile/migration/legacy-task-batch-types.js +127 -0
  372. package/dist/pactile/migration/legacy-task-batch-types.js.map +1 -0
  373. package/dist/pactile/migration/legacy-task-batch.d.ts +3 -0
  374. package/dist/pactile/migration/legacy-task-batch.d.ts.map +1 -0
  375. package/dist/pactile/migration/legacy-task-batch.js +2 -0
  376. package/dist/pactile/migration/legacy-task-batch.js.map +1 -0
  377. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts +27 -0
  378. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts.map +1 -0
  379. package/dist/pactile/migration/legacy-task-held-source-reader.js +261 -0
  380. package/dist/pactile/migration/legacy-task-held-source-reader.js.map +1 -0
  381. package/dist/pactile/migration/legacy-task-reconciliation.d.ts +46 -0
  382. package/dist/pactile/migration/legacy-task-reconciliation.d.ts.map +1 -0
  383. package/dist/pactile/migration/legacy-task-reconciliation.js +589 -0
  384. package/dist/pactile/migration/legacy-task-reconciliation.js.map +1 -0
  385. package/dist/pactile/migration/legacy-task-update.d.ts +19 -0
  386. package/dist/pactile/migration/legacy-task-update.d.ts.map +1 -0
  387. package/dist/pactile/migration/legacy-task-update.js +164 -0
  388. package/dist/pactile/migration/legacy-task-update.js.map +1 -0
  389. package/dist/pactile/parallel/batch.d.ts +21 -2
  390. package/dist/pactile/parallel/batch.d.ts.map +1 -1
  391. package/dist/pactile/parallel/batch.js +271 -50
  392. package/dist/pactile/parallel/batch.js.map +1 -1
  393. package/dist/pactile/parallel/policy.d.ts +1 -1
  394. package/dist/pactile/parallel/policy.d.ts.map +1 -1
  395. package/dist/pactile/parallel/policy.js +130 -102
  396. package/dist/pactile/parallel/policy.js.map +1 -1
  397. package/dist/pactile/pi/bridge.d.ts +139 -2
  398. package/dist/pactile/pi/bridge.d.ts.map +1 -1
  399. package/dist/pactile/pi/bridge.js +1317 -106
  400. package/dist/pactile/pi/bridge.js.map +1 -1
  401. package/dist/pactile/pi/rpc.d.ts +23 -4
  402. package/dist/pactile/pi/rpc.d.ts.map +1 -1
  403. package/dist/pactile/pi/rpc.js +243 -42
  404. package/dist/pactile/pi/rpc.js.map +1 -1
  405. package/dist/pactile/pi/v2-dispatch.d.ts +113 -0
  406. package/dist/pactile/pi/v2-dispatch.d.ts.map +1 -0
  407. package/dist/pactile/pi/v2-dispatch.js +919 -0
  408. package/dist/pactile/pi/v2-dispatch.js.map +1 -0
  409. package/dist/pactile/projection/planner.js +1 -1
  410. package/dist/pactile/projection/planner.js.map +1 -1
  411. package/dist/pactile/registry.d.ts +63 -1
  412. package/dist/pactile/registry.d.ts.map +1 -1
  413. package/dist/pactile/registry.js +633 -4
  414. package/dist/pactile/registry.js.map +1 -1
  415. package/dist/pactile/retrieval/index.d.ts +1 -0
  416. package/dist/pactile/retrieval/index.d.ts.map +1 -1
  417. package/dist/pactile/retrieval/index.js +1 -0
  418. package/dist/pactile/retrieval/index.js.map +1 -1
  419. package/dist/pactile/retrieval/jev-planning.d.ts +28 -0
  420. package/dist/pactile/retrieval/jev-planning.d.ts.map +1 -0
  421. package/dist/pactile/retrieval/jev-planning.js +96 -0
  422. package/dist/pactile/retrieval/jev-planning.js.map +1 -0
  423. package/dist/pactile/review/contract.d.ts +232 -0
  424. package/dist/pactile/review/contract.d.ts.map +1 -0
  425. package/dist/pactile/review/contract.js +695 -0
  426. package/dist/pactile/review/contract.js.map +1 -0
  427. package/dist/pactile/review/escalation-artifacts.d.ts +41 -0
  428. package/dist/pactile/review/escalation-artifacts.d.ts.map +1 -0
  429. package/dist/pactile/review/escalation-artifacts.js +415 -0
  430. package/dist/pactile/review/escalation-artifacts.js.map +1 -0
  431. package/dist/pactile/review/escalation-contract.d.ts +115 -0
  432. package/dist/pactile/review/escalation-contract.d.ts.map +1 -0
  433. package/dist/pactile/review/escalation-contract.js +151 -0
  434. package/dist/pactile/review/escalation-contract.js.map +1 -0
  435. package/dist/pactile/review/escalation-finalize.d.ts +14 -0
  436. package/dist/pactile/review/escalation-finalize.d.ts.map +1 -0
  437. package/dist/pactile/review/escalation-finalize.js +319 -0
  438. package/dist/pactile/review/escalation-finalize.js.map +1 -0
  439. package/dist/pactile/review/escalation-reply.d.ts +10 -0
  440. package/dist/pactile/review/escalation-reply.d.ts.map +1 -0
  441. package/dist/pactile/review/escalation-reply.js +61 -0
  442. package/dist/pactile/review/escalation-reply.js.map +1 -0
  443. package/dist/pactile/review/escalation-transport.d.ts +32 -0
  444. package/dist/pactile/review/escalation-transport.d.ts.map +1 -0
  445. package/dist/pactile/review/escalation-transport.js +216 -0
  446. package/dist/pactile/review/escalation-transport.js.map +1 -0
  447. package/dist/pactile/review/escalation.d.ts +7 -0
  448. package/dist/pactile/review/escalation.d.ts.map +1 -0
  449. package/dist/pactile/review/escalation.js +6 -0
  450. package/dist/pactile/review/escalation.js.map +1 -0
  451. package/dist/pactile/review/evidence.d.ts +25 -0
  452. package/dist/pactile/review/evidence.d.ts.map +1 -0
  453. package/dist/pactile/review/evidence.js +58 -0
  454. package/dist/pactile/review/evidence.js.map +1 -0
  455. package/dist/pactile/review/jev-escalation-advice.d.ts +77 -0
  456. package/dist/pactile/review/jev-escalation-advice.d.ts.map +1 -0
  457. package/dist/pactile/review/jev-escalation-advice.js +358 -0
  458. package/dist/pactile/review/jev-escalation-advice.js.map +1 -0
  459. package/dist/pactile/scheduler/index.d.ts +6 -0
  460. package/dist/pactile/scheduler/index.d.ts.map +1 -0
  461. package/dist/pactile/scheduler/index.js +5 -0
  462. package/dist/pactile/scheduler/index.js.map +1 -0
  463. package/dist/pactile/scheduler/project-lease-store.d.ts +35 -0
  464. package/dist/pactile/scheduler/project-lease-store.d.ts.map +1 -0
  465. package/dist/pactile/scheduler/project-lease-store.js +189 -0
  466. package/dist/pactile/scheduler/project-lease-store.js.map +1 -0
  467. package/dist/pactile/scheduler/scheduler.d.ts +91 -0
  468. package/dist/pactile/scheduler/scheduler.d.ts.map +1 -0
  469. package/dist/pactile/scheduler/scheduler.js +589 -0
  470. package/dist/pactile/scheduler/scheduler.js.map +1 -0
  471. package/dist/pactile/scheduler/task-kernel-admission.d.ts +173 -0
  472. package/dist/pactile/scheduler/task-kernel-admission.d.ts.map +1 -0
  473. package/dist/pactile/scheduler/task-kernel-admission.js +1560 -0
  474. package/dist/pactile/scheduler/task-kernel-admission.js.map +1 -0
  475. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts +184 -0
  476. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts.map +1 -0
  477. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js +952 -0
  478. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js.map +1 -0
  479. package/dist/pactile/scheduler/task-map-scheduler.d.ts +116 -0
  480. package/dist/pactile/scheduler/task-map-scheduler.d.ts.map +1 -0
  481. package/dist/pactile/scheduler/task-map-scheduler.js +1448 -0
  482. package/dist/pactile/scheduler/task-map-scheduler.js.map +1 -0
  483. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts +7 -0
  484. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts.map +1 -0
  485. package/dist/pactile/scheduler/task-run-dispatch-state.js +69 -0
  486. package/dist/pactile/scheduler/task-run-dispatch-state.js.map +1 -0
  487. package/dist/pactile/task/authorization.d.ts +3 -0
  488. package/dist/pactile/task/authorization.d.ts.map +1 -0
  489. package/dist/pactile/task/authorization.js +43 -0
  490. package/dist/pactile/task/authorization.js.map +1 -0
  491. package/dist/pactile/task/creation.d.ts +22 -0
  492. package/dist/pactile/task/creation.d.ts.map +1 -0
  493. package/dist/pactile/task/creation.js +95 -0
  494. package/dist/pactile/task/creation.js.map +1 -0
  495. package/dist/pactile/task/guards.d.ts +1 -4
  496. package/dist/pactile/task/guards.d.ts.map +1 -1
  497. package/dist/pactile/task/guards.js +5 -57
  498. package/dist/pactile/task/guards.js.map +1 -1
  499. package/dist/pactile/task/session-jev-receipt.d.ts +58 -0
  500. package/dist/pactile/task/session-jev-receipt.d.ts.map +1 -0
  501. package/dist/pactile/task/session-jev-receipt.js +375 -0
  502. package/dist/pactile/task/session-jev-receipt.js.map +1 -0
  503. package/dist/pactile/task/session-jev.d.ts +7 -0
  504. package/dist/pactile/task/session-jev.d.ts.map +1 -0
  505. package/dist/pactile/task/session-jev.js +217 -0
  506. package/dist/pactile/task/session-jev.js.map +1 -0
  507. package/dist/pactile/task/session-pack.d.ts.map +1 -1
  508. package/dist/pactile/task/session-pack.js +155 -16
  509. package/dist/pactile/task/session-pack.js.map +1 -1
  510. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts +49 -0
  511. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts.map +1 -0
  512. package/dist/pactile/task/session-retrieval-jev-receipt.js +97 -0
  513. package/dist/pactile/task/session-retrieval-jev-receipt.js.map +1 -0
  514. package/dist/pactile/task/session-retrieval-jev.d.ts +8 -0
  515. package/dist/pactile/task/session-retrieval-jev.d.ts.map +1 -0
  516. package/dist/pactile/task/session-retrieval-jev.js +352 -0
  517. package/dist/pactile/task/session-retrieval-jev.js.map +1 -0
  518. package/dist/pactile/task/strategy.d.ts +1 -23
  519. package/dist/pactile/task/strategy.d.ts.map +1 -1
  520. package/dist/pactile/task/strategy.js +2 -135
  521. package/dist/pactile/task/strategy.js.map +1 -1
  522. package/dist/pactile/tiles/jev-selection.d.ts +44 -0
  523. package/dist/pactile/tiles/jev-selection.d.ts.map +1 -0
  524. package/dist/pactile/tiles/jev-selection.js +210 -0
  525. package/dist/pactile/tiles/jev-selection.js.map +1 -0
  526. package/dist/pactile/tiles/safe-yaml.d.ts +5 -1
  527. package/dist/pactile/tiles/safe-yaml.d.ts.map +1 -1
  528. package/dist/pactile/tiles/safe-yaml.js +8 -8
  529. package/dist/pactile/tiles/safe-yaml.js.map +1 -1
  530. package/dist/pactile/tiles/selection-receipts.d.ts +71 -0
  531. package/dist/pactile/tiles/selection-receipts.d.ts.map +1 -0
  532. package/dist/pactile/tiles/selection-receipts.js +319 -0
  533. package/dist/pactile/tiles/selection-receipts.js.map +1 -0
  534. package/dist/pactile/tiles/selection.d.ts +185 -0
  535. package/dist/pactile/tiles/selection.d.ts.map +1 -0
  536. package/dist/pactile/tiles/selection.js +985 -0
  537. package/dist/pactile/tiles/selection.js.map +1 -0
  538. package/dist/pactile/verification/git-observer.d.ts +3 -0
  539. package/dist/pactile/verification/git-observer.d.ts.map +1 -0
  540. package/dist/pactile/verification/git-observer.js +3 -0
  541. package/dist/pactile/verification/git-observer.js.map +1 -0
  542. package/dist/pactile/verification/index.d.ts +11 -0
  543. package/dist/pactile/verification/index.d.ts.map +1 -0
  544. package/dist/pactile/verification/index.js +6 -0
  545. package/dist/pactile/verification/index.js.map +1 -0
  546. package/dist/pactile/verification/jev-advice.d.ts +78 -0
  547. package/dist/pactile/verification/jev-advice.d.ts.map +1 -0
  548. package/dist/pactile/verification/jev-advice.js +397 -0
  549. package/dist/pactile/verification/jev-advice.js.map +1 -0
  550. package/dist/pactile/verification/planner.d.ts +15 -0
  551. package/dist/pactile/verification/planner.d.ts.map +1 -0
  552. package/dist/pactile/verification/planner.js +412 -0
  553. package/dist/pactile/verification/planner.js.map +1 -0
  554. package/dist/pactile/verification/receipt.d.ts +101 -0
  555. package/dist/pactile/verification/receipt.d.ts.map +1 -0
  556. package/dist/pactile/verification/receipt.js +400 -0
  557. package/dist/pactile/verification/receipt.js.map +1 -0
  558. package/dist/pactile/verification/types.d.ts +72 -0
  559. package/dist/pactile/verification/types.d.ts.map +1 -0
  560. package/dist/pactile/verification/types.js +21 -0
  561. package/dist/pactile/verification/types.js.map +1 -0
  562. package/dist/pactile/worktree/git-probe.d.ts +32 -0
  563. package/dist/pactile/worktree/git-probe.d.ts.map +1 -0
  564. package/dist/pactile/worktree/git-probe.js +336 -0
  565. package/dist/pactile/worktree/git-probe.js.map +1 -0
  566. package/dist/pactile/worktree/git-removal.d.ts +3 -0
  567. package/dist/pactile/worktree/git-removal.d.ts.map +1 -0
  568. package/dist/pactile/worktree/git-removal.js +11 -0
  569. package/dist/pactile/worktree/git-removal.js.map +1 -0
  570. package/dist/pactile/worktree/index.d.ts +2 -0
  571. package/dist/pactile/worktree/index.d.ts.map +1 -0
  572. package/dist/pactile/worktree/index.js +2 -0
  573. package/dist/pactile/worktree/index.js.map +1 -0
  574. package/dist/pactile/worktree/integration-evidence.d.ts +80 -0
  575. package/dist/pactile/worktree/integration-evidence.d.ts.map +1 -0
  576. package/dist/pactile/worktree/integration-evidence.js +166 -0
  577. package/dist/pactile/worktree/integration-evidence.js.map +1 -0
  578. package/dist/pactile/worktree/manager-core.d.ts +50 -0
  579. package/dist/pactile/worktree/manager-core.d.ts.map +1 -0
  580. package/dist/pactile/worktree/manager-core.js +359 -0
  581. package/dist/pactile/worktree/manager-core.js.map +1 -0
  582. package/dist/pactile/worktree/manager-provenance.d.ts +32 -0
  583. package/dist/pactile/worktree/manager-provenance.d.ts.map +1 -0
  584. package/dist/pactile/worktree/manager-provenance.js +409 -0
  585. package/dist/pactile/worktree/manager-provenance.js.map +1 -0
  586. package/dist/pactile/worktree/manager-types.d.ts +84 -0
  587. package/dist/pactile/worktree/manager-types.d.ts.map +1 -0
  588. package/dist/pactile/worktree/manager-types.js +11 -0
  589. package/dist/pactile/worktree/manager-types.js.map +1 -0
  590. package/dist/pactile/worktree/manager.d.ts +10 -0
  591. package/dist/pactile/worktree/manager.d.ts.map +1 -0
  592. package/dist/pactile/worktree/manager.js +6 -0
  593. package/dist/pactile/worktree/manager.js.map +1 -0
  594. package/dist/pactile/worktree/run-workspace-cleanup.d.ts +10 -0
  595. package/dist/pactile/worktree/run-workspace-cleanup.d.ts.map +1 -0
  596. package/dist/pactile/worktree/run-workspace-cleanup.js +695 -0
  597. package/dist/pactile/worktree/run-workspace-cleanup.js.map +1 -0
  598. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts +65 -0
  599. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts.map +1 -0
  600. package/dist/pactile/worktree/run-workspace-lifecycle.js +276 -0
  601. package/dist/pactile/worktree/run-workspace-lifecycle.js.map +1 -0
  602. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-hooks.md +1 -1
  603. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/generated-files.md +1 -1
  604. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/hooks-and-settings.md +1 -1
  605. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/overview.md +1 -1
  606. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/platform-map.md +1 -1
  607. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +2 -0
  608. package/dist/templates/common/skills/brainstorm.md +19 -13
  609. package/dist/templates/markdown/agents.md +2 -2
  610. package/dist/templates/markdown/framework/execution-strategy.md.txt +1 -1
  611. package/dist/templates/markdown/framework/index.md.txt +1 -1
  612. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +17 -105
  613. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +3 -3
  614. package/dist/templates/markdown/framework/release-boundary.md.txt +9 -10
  615. package/dist/templates/markdown/framework/retrieval-daily-guide.md.txt +1 -1
  616. package/dist/templates/pactile/CONTEXT.md +48 -36
  617. package/dist/templates/pactile/modules/approval-personal/contract.md +12 -24
  618. package/dist/templates/pactile/modules/close-basic/contract.md +15 -18
  619. package/dist/templates/pactile/modules/debug-recovery/contract.md +4 -4
  620. package/dist/templates/pactile/modules/define-basic/contract.md +15 -19
  621. package/dist/templates/pactile/modules/define-extended/contract.md +3 -3
  622. package/dist/templates/pactile/modules/execute-agent/contract.md +11 -19
  623. package/dist/templates/pactile/modules/intake-basic/contract.md +16 -13
  624. package/dist/templates/pactile/modules/verify-basic/contract.md +11 -20
  625. package/dist/templates/pactile/tasks/templates/release-execution/design.md +5 -5
  626. package/dist/templates/pactile/tasks/templates/release-readiness/design.md +6 -6
  627. package/dist/templates/pactile/tasks/templates/release-readiness/handoff-template.md +8 -2
  628. package/dist/templates/pactile/workflow.md +37 -41
  629. package/dist/templates/template-utils.d.ts +1 -2
  630. package/dist/templates/template-utils.d.ts.map +1 -1
  631. package/dist/templates/template-utils.js +2 -13
  632. package/dist/templates/template-utils.js.map +1 -1
  633. package/dist/types/ai-tools.d.ts +1 -1
  634. package/dist/types/ai-tools.js +1 -1
  635. package/dist/utils/manifest-prune.js +1 -1
  636. package/dist/utils/manifest-prune.js.map +1 -1
  637. package/dist/utils/p36-upgrade.d.ts +2 -2
  638. package/dist/utils/p36-upgrade.d.ts.map +1 -1
  639. package/dist/utils/p36-upgrade.js +2 -10
  640. package/dist/utils/p36-upgrade.js.map +1 -1
  641. package/dist/utils/post-update-smoke.js +1 -1
  642. package/dist/utils/post-update-smoke.js.map +1 -1
  643. package/dist/utils/readiness.d.ts +2 -2
  644. package/dist/utils/readiness.js +2 -2
  645. package/dist/utils/uninstall-scrubbers.js +1 -1
  646. package/dist/utils/workflow-dir.d.ts +1 -1
  647. package/dist/utils/workflow-dir.d.ts.map +1 -1
  648. package/dist/utils/workflow-dir.js +1 -1
  649. package/dist/utils/workflow-dir.js.map +1 -1
  650. package/package.json +42 -37
  651. package/CHANGELOG.md +0 -651
  652. package/bin/compat-warning.js +0 -11
  653. package/bin/pactile.js +0 -3
  654. package/bin/smart-search.js +0 -38
  655. package/dist/migrations/manifests/0.1.0.json +0 -9
  656. package/dist/migrations/manifests/0.1.1.json +0 -9
  657. package/dist/migrations/manifests/0.1.2.json +0 -9
  658. package/dist/migrations/manifests/0.1.3.json +0 -9
  659. package/dist/migrations/manifests/0.1.4.json +0 -9
  660. package/dist/migrations/manifests/0.2.1.json +0 -9
  661. package/dist/migrations/manifests/0.2.10.json +0 -374
  662. package/dist/migrations/manifests/0.2.2.json +0 -9
  663. package/dist/migrations/manifests/0.2.3.json +0 -9
  664. package/dist/migrations/manifests/0.2.4.json +0 -9
  665. package/dist/migrations/manifests/0.2.5.json +0 -9
  666. package/dist/migrations/manifests/0.2.6.json +0 -9
  667. package/dist/migrations/manifests/0.2.7.json +0 -9
  668. package/dist/migrations/manifests/0.2.8.json +0 -9
  669. package/dist/migrations/manifests/0.2.9.json +0 -9
  670. package/dist/migrations/manifests/0.3.0.json +0 -89
  671. package/dist/migrations/manifests/0.3.1.json +0 -32
  672. package/dist/migrations/manifests/0.3.2.json +0 -16
  673. package/dist/migrations/manifests/0.3.3.json +0 -9
  674. package/dist/migrations/manifests/0.3.4.json +0 -9
  675. package/dist/migrations/manifests/0.3.5.json +0 -9
  676. package/dist/migrations/manifests/0.3.6.json +0 -9
  677. package/dist/migrations/manifests/0.4.0.json +0 -9
  678. package/dist/migrations/manifests/0.4.1.json +0 -9
  679. package/dist/migrations/manifests/0.4.2.json +0 -9
  680. package/dist/migrations/manifests/0.4.3.json +0 -9
  681. package/dist/migrations/manifests/0.5.0-beta.0.json +0 -9
  682. package/dist/migrations/manifests/0.5.0-beta.1.json +0 -9
  683. package/dist/migrations/manifests/0.5.0-beta.2.json +0 -9
  684. package/dist/migrations/manifests/0.5.0-beta.3.json +0 -9
  685. package/dist/migrations/manifests/0.5.0-beta.4.json +0 -9
  686. package/dist/migrations/manifests/0.5.0-beta.5.json +0 -9
  687. package/dist/migrations/manifests/0.5.0.json +0 -9
  688. package/dist/pactile/compat/retired-alternate-client.d.ts +0 -42
  689. package/dist/pactile/compat/retired-alternate-client.d.ts.map +0 -1
  690. package/dist/pactile/compat/retired-alternate-client.js +0 -153
  691. package/dist/pactile/compat/retired-alternate-client.js.map +0 -1
  692. package/dist/pactile/compat/update-residue.d.ts +0 -4
  693. package/dist/pactile/compat/update-residue.d.ts.map +0 -1
  694. package/dist/pactile/compat/update-residue.js +0 -55
  695. package/dist/pactile/compat/update-residue.js.map +0 -1
  696. package/dist/utils/cursor-retrieval-env.d.ts +0 -17
  697. package/dist/utils/cursor-retrieval-env.d.ts.map +0 -1
  698. package/dist/utils/cursor-retrieval-env.js +0 -19
  699. package/dist/utils/cursor-retrieval-env.js.map +0 -1
  700. package/dist/utils/proxy.d.ts +0 -25
  701. package/dist/utils/proxy.d.ts.map +0 -1
  702. package/dist/utils/proxy.js +0 -60
  703. package/dist/utils/proxy.js.map +0 -1
  704. package/scripts/postinstall.js +0 -6
@@ -11,15 +11,14 @@ import { getInitToolChoices } from "../configurators/index.js";
11
11
  import { DIR_NAMES, FILE_NAMES, PATHS } from "../constants/paths.js";
12
12
  import { VERSION } from "../constants/version.js";
13
13
  import { setWriteMode, startRecordingWrites, stopRecordingWrites, } from "../utils/file-writer.js";
14
- import { applyKernelCreate, applyKernelStart, writeWaveCConfirmed, } from "../core/task/index.js";
15
- import { emptyTaskJson } from "../utils/task-json.js";
14
+ import { writeWaveCConfirmed, createTaskKernel, readTaskKernel, } from "../core/task/index.js";
15
+ import { canonicalProjectRoot } from "../core/task/task-kernel-paths.js";
16
16
  import { initializeDeveloper, readDeveloper } from "../utils/developer.js";
17
17
  import { detectProjectType, detectMonorepo, sanitizePkgName, } from "../utils/project-detector.js";
18
18
  import { initializeHashes, removeHash } from "../utils/template-hash.js";
19
19
  import { NATIVE_WORKFLOW_ID, resolveWorkflowTemplate, } from "../utils/workflow-resolver.js";
20
20
  import { isCwdHomedir, homedirGuardMessage, homedirBypassEnabled, } from "../utils/cwd-guard.js";
21
21
  import { fetchTemplateIndex, probeRegistryIndex, downloadTemplateById, downloadRegistryDirect, parseRegistrySource, TIMEOUTS, TEMPLATE_INDEX_URL, } from "../utils/template-fetcher.js";
22
- import { setupProxy, maskProxyUrl } from "../utils/proxy.js";
23
22
  import { reportInitReadiness, snapshotReadinessForRollout, } from "../utils/readiness.js";
24
23
  import { getProjectCapability, getProjectCapabilityChoices, loadProjectCapabilities, parseProjectCapabilities, writeProjectCapabilityFiles, } from "../utils/project-capabilities.js";
25
24
  import { collectCanonicalGenerationFiles, collectLegacyCstlLifecycleFiles, discoverCanonicalGenerationPaths, installedPactilePlatforms, materializeCanonicalGeneration, materializePreparedLegacyUserState, prepareLegacyCstlImport, readLegacyCstlVersion, runLifecycleCommand, seedCanonicalBuildRoot, } from "../pactile/lifecycle/index.js";
@@ -47,47 +46,368 @@ export function slugifyDeveloperName(name) {
47
46
  return slug || "user";
48
47
  }
49
48
  /**
50
- * Write a task skeleton (task.json + prd.md).
51
- *
52
- * Idempotent: if the task dir already exists, returns true without touching
53
- * anything. Shared by both creator bootstrap and joiner onboarding flows.
49
+ * Task Kernel IDs are lowercase ASCII slugs, while legacy task directory names
50
+ * intentionally preserve Unicode developer names. Encode non-ASCII code points
51
+ * so both identities remain deterministic without changing an existing path.
54
52
  */
55
- function writeTaskSkeleton(cwd, taskName, taskJson, prdContent) {
56
- const taskDir = path.join(cwd, PATHS.TASKS, taskName);
57
- if (fs.existsSync(taskDir))
58
- return true; // idempotent
53
+ function taskKernelIdForDirectoryName(taskName) {
54
+ let encoded = "";
55
+ for (const character of taskName.toLowerCase()) {
56
+ if (/[a-z0-9]/u.test(character) || character === "-") {
57
+ encoded += character;
58
+ }
59
+ else {
60
+ encoded += `-u${character.codePointAt(0)?.toString(16) ?? "0"}-`;
61
+ }
62
+ }
63
+ return encoded.replace(/-+/gu, "-").replace(/^-|-$/gu, "") || "task";
64
+ }
65
+ const INIT_TASK_MARKER_TEXT = "Task creation was interrupted; retry pactile init.\n";
66
+ const INIT_JOINER_MARKER_PREFIX = `${INIT_TASK_MARKER_TEXT}joiner:v1:`;
67
+ const MAX_INIT_JOINER_DEVELOPER_NAME_LENGTH = 256;
68
+ const MAX_INIT_TASK_MARKER_BYTES = 2048;
69
+ function containsInitJoinerControlCharacters(value) {
70
+ for (const character of value) {
71
+ const codePoint = character.codePointAt(0) ?? 0;
72
+ if (codePoint < 0x20 || codePoint === 0x7f)
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+ function normalizeInitJoinerDeveloperName(value, taskName) {
78
+ if (typeof value !== "string" ||
79
+ value.length === 0 ||
80
+ value.length > MAX_INIT_JOINER_DEVELOPER_NAME_LENGTH ||
81
+ value.trim() !== value ||
82
+ value === "." ||
83
+ value === ".." ||
84
+ containsInitJoinerControlCharacters(value) ||
85
+ Buffer.byteLength(value, "utf8") > MAX_INIT_JOINER_DEVELOPER_NAME_LENGTH * 4 ||
86
+ taskName !== `00-join-${slugifyDeveloperName(value)}`) {
87
+ return null;
88
+ }
89
+ return value;
90
+ }
91
+ function initTaskMarkerContent(taskName, developerName) {
92
+ if (!developerName)
93
+ return INIT_TASK_MARKER_TEXT;
94
+ const normalizedName = normalizeInitJoinerDeveloperName(developerName.trim(), taskName);
95
+ if (!normalizedName)
96
+ return INIT_TASK_MARKER_TEXT;
97
+ return `${INIT_JOINER_MARKER_PREFIX}${JSON.stringify(normalizedName)}\n`;
98
+ }
99
+ function pathExists(pathname) {
100
+ return fs.lstatSync(pathname, { throwIfNoEntry: false }) !== undefined;
101
+ }
102
+ function assertSafeInitTaskPaths(cwd, extraDirectories = []) {
103
+ const projectRoot = canonicalProjectRoot(cwd, cwd);
104
+ const tasksRoot = path.resolve(projectRoot, PATHS.TASKS);
105
+ const tasksRelative = path.relative(projectRoot, tasksRoot);
106
+ if (!tasksRelative ||
107
+ tasksRelative === ".." ||
108
+ tasksRelative.startsWith(`..${path.sep}`) ||
109
+ path.isAbsolute(tasksRelative)) {
110
+ throw new Error("Init Task root must stay inside the canonical project root");
111
+ }
112
+ const pactileRoot = path.resolve(projectRoot, DIR_NAMES.WORKFLOW);
113
+ const checkedDirectories = [pactileRoot, tasksRoot, ...extraDirectories];
114
+ for (const directory of checkedDirectories) {
115
+ const relative = path.relative(tasksRoot, directory);
116
+ if (directory !== pactileRoot &&
117
+ directory !== tasksRoot &&
118
+ (!relative ||
119
+ relative === ".." ||
120
+ relative.startsWith(`..${path.sep}`) ||
121
+ path.isAbsolute(relative))) {
122
+ throw new Error("Init Task staging path must stay inside .pactile/tasks");
123
+ }
124
+ const entry = fs.lstatSync(directory, { throwIfNoEntry: false });
125
+ if (!entry)
126
+ continue;
127
+ if (entry.isSymbolicLink() ||
128
+ !entry.isDirectory() ||
129
+ fs.realpathSync(directory) !== directory) {
130
+ throw new Error("Init Task paths must be real directories inside the project");
131
+ }
132
+ }
133
+ return tasksRoot;
134
+ }
135
+ function readInitTaskMarker(cwd, taskName) {
136
+ try {
137
+ const tasksRoot = assertSafeInitTaskPaths(cwd);
138
+ const marker = path.join(tasksRoot, `.pending-${taskName}`);
139
+ const entry = fs.lstatSync(marker);
140
+ if (!entry.isFile() ||
141
+ entry.isSymbolicLink() ||
142
+ entry.size > MAX_INIT_TASK_MARKER_BYTES) {
143
+ return null;
144
+ }
145
+ const contents = fs.readFileSync(marker, "utf8");
146
+ if (contents === INIT_TASK_MARKER_TEXT)
147
+ return { developerName: null };
148
+ if (!contents.startsWith(INIT_JOINER_MARKER_PREFIX) ||
149
+ !contents.endsWith("\n")) {
150
+ return null;
151
+ }
152
+ const encodedName = contents.slice(INIT_JOINER_MARKER_PREFIX.length, -1);
153
+ let parsedName;
154
+ try {
155
+ parsedName = JSON.parse(encodedName);
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ const developerName = normalizeInitJoinerDeveloperName(parsedName, taskName);
161
+ return developerName ? { developerName } : null;
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ function hasInitTaskMarker(cwd, taskName) {
168
+ return readInitTaskMarker(cwd, taskName) !== null;
169
+ }
170
+ function readPendingJoinerMarkers(cwd) {
59
171
  try {
60
- fs.mkdirSync(taskDir, { recursive: true });
61
- const created = applyKernelCreate({
62
- taskDir,
63
- actor: "pactile init",
64
- idempotencyKey: `init:${taskName}`,
65
- record: { ...taskJson, status: "planning" },
66
- evidence: "pactile init skeleton",
172
+ const tasksRoot = assertSafeInitTaskPaths(cwd);
173
+ if (!pathExists(tasksRoot))
174
+ return [];
175
+ const taskNames = fs
176
+ .readdirSync(tasksRoot)
177
+ .filter((entry) => entry.startsWith(".pending-00-join-"))
178
+ .map((entry) => entry.slice(".pending-".length));
179
+ return taskNames.map((taskName) => {
180
+ const marker = readInitTaskMarker(cwd, taskName);
181
+ return {
182
+ taskName,
183
+ developerName: marker?.developerName ?? null,
184
+ valid: marker !== null,
185
+ };
67
186
  });
68
- if (taskJson.status === "in_progress") {
69
- applyKernelStart({
70
- taskDir,
71
- expectedRevision: created.kernel.revision,
72
- actor: "pactile init",
73
- idempotencyKey: `init-start:${taskName}`,
74
- record: { ...taskJson, status: "in_progress" },
75
- evidence: "pactile init skeleton start",
187
+ }
188
+ catch {
189
+ return [];
190
+ }
191
+ }
192
+ function readPendingJoinerDeveloperName(cwd) {
193
+ const markers = readPendingJoinerMarkers(cwd);
194
+ if (markers.length !== 1)
195
+ return null;
196
+ return markers[0].developerName;
197
+ }
198
+ function clearInitTaskMarker(cwd, taskName) {
199
+ if (hasInitTaskMarker(cwd, taskName)) {
200
+ try {
201
+ const tasksRoot = assertSafeInitTaskPaths(cwd);
202
+ fs.unlinkSync(path.join(tasksRoot, `.pending-${taskName}`));
203
+ }
204
+ catch {
205
+ // A missing, unreadable, or user-owned marker is left untouched.
206
+ }
207
+ }
208
+ }
209
+ function ensureInitTaskMarker(cwd, taskName, developerName) {
210
+ try {
211
+ let tasksRoot = assertSafeInitTaskPaths(cwd);
212
+ fs.mkdirSync(tasksRoot, { recursive: true });
213
+ tasksRoot = assertSafeInitTaskPaths(cwd);
214
+ const marker = path.join(tasksRoot, `.pending-${taskName}`);
215
+ const markerContent = initTaskMarkerContent(taskName, developerName);
216
+ try {
217
+ fs.writeFileSync(marker, markerContent, {
218
+ encoding: "utf8",
219
+ flag: "wx",
76
220
  });
221
+ return true;
77
222
  }
78
- fs.writeFileSync(path.join(taskDir, FILE_NAMES.PRD), prdContent, "utf-8");
79
- return true;
223
+ catch (error) {
224
+ if (error.code !== "EEXIST")
225
+ return false;
226
+ const existing = readInitTaskMarker(cwd, taskName);
227
+ if (!existing)
228
+ return false;
229
+ if (!developerName)
230
+ return true;
231
+ const normalizedName = normalizeInitJoinerDeveloperName(developerName.trim(), taskName);
232
+ if (!normalizedName)
233
+ return existing.developerName === null;
234
+ if (existing.developerName === normalizedName)
235
+ return true;
236
+ if (existing.developerName !== null)
237
+ return false;
238
+ // Upgrade only the exact legacy sentinel owned by init. A malformed or
239
+ // user-edited marker never reaches this branch because the reader rejects it.
240
+ fs.writeFileSync(marker, markerContent, {
241
+ encoding: "utf8",
242
+ flag: "w",
243
+ });
244
+ return readInitTaskMarker(cwd, taskName)?.developerName === normalizedName;
245
+ }
246
+ }
247
+ catch {
248
+ // A conflicting, unreadable, or unwritable marker path is never replaced.
249
+ return false;
250
+ }
251
+ }
252
+ function recordInitTaskFailure(cwd, taskName) {
253
+ ensureInitTaskMarker(cwd, taskName);
254
+ }
255
+ function isCompleteExistingInitTask(cwd, taskName, taskId) {
256
+ const taskDir = path.join(cwd, PATHS.TASKS, taskName);
257
+ try {
258
+ const entry = fs.lstatSync(taskDir);
259
+ if (!entry.isDirectory() || entry.isSymbolicLink())
260
+ return false;
261
+ const prd = fs.readFileSync(path.join(taskDir, FILE_NAMES.PRD), "utf8");
262
+ if (!prd.trim())
263
+ return false;
264
+ const read = readTaskKernel({ root: cwd, taskDir, cwd });
265
+ if (read.kind === "task-kernel-v2") {
266
+ return (read.kernel.identity.taskId === taskId &&
267
+ read.kernel.definition.taskId === taskId);
268
+ }
269
+ // Keep complete historical V1 tasks in place for the explicit migration
270
+ // flow. A task.json without a persisted, matching Kernel is not complete.
271
+ const taskJson = JSON.parse(fs.readFileSync(path.join(taskDir, FILE_NAMES.TASK_JSON), "utf8"));
272
+ const legacyKernel = read.kernel.kernel;
273
+ const projection = legacyKernel.projection;
274
+ return (read.kernel.persisted &&
275
+ legacyKernel.identity.taskId === taskName &&
276
+ projection !== null &&
277
+ taskJson.id === taskName &&
278
+ taskJson.status === projection.status &&
279
+ projection.record.id === taskName &&
280
+ projection.record.status === projection.status);
80
281
  }
81
282
  catch {
82
283
  return false;
83
284
  }
84
285
  }
286
+ function removeInitTaskStaging(stagingRoot, stagingDir) {
287
+ const relative = path.relative(stagingRoot, path.resolve(stagingDir));
288
+ if (!relative ||
289
+ relative === ".." ||
290
+ relative.startsWith(`..${path.sep}`) ||
291
+ path.isAbsolute(relative) ||
292
+ fs.lstatSync(stagingDir).isSymbolicLink()) {
293
+ throw new Error("Unsafe init Task staging cleanup target");
294
+ }
295
+ fs.rmSync(stagingDir, { recursive: true, force: true });
296
+ }
85
297
  /**
86
- * Compute the bootstrap checklist items (previously stored as structured
87
- * `subtasks: [{name, status}]` in task.json). Per task 04-21-task-schema-unify
88
- * (D1), these live as markdown `- [ ]` items in prd.md instead, so task.json
89
- * stays canonical with `subtasks: string[]` (child task dir names).
298
+ * Publish a complete V2 Define Task (kernel.json + prd.md).
299
+ *
300
+ * A complete existing task is kept. A partial one is reported for recovery,
301
+ * never silently treated as a successful init. Historical V1 records are
302
+ * preserved for the explicit migration flow and are never rewritten here.
90
303
  */
304
+ function writeTaskSkeleton(cwd, taskName, definition, actor, prdContent) {
305
+ let tasksRoot = null;
306
+ let stagingRoot = null;
307
+ let stagingDir = null;
308
+ let createdStagingRoot = false;
309
+ let committed = false;
310
+ try {
311
+ tasksRoot = assertSafeInitTaskPaths(cwd);
312
+ stagingRoot = path.join(tasksRoot, ".creating");
313
+ if (pathExists(path.join(tasksRoot, taskName))) {
314
+ if (!isCompleteExistingInitTask(cwd, taskName, definition.taskId)) {
315
+ throw new Error(`Task already exists or needs recovery: ${taskName}`);
316
+ }
317
+ clearInitTaskMarker(cwd, taskName);
318
+ return true;
319
+ }
320
+ fs.mkdirSync(tasksRoot, { recursive: true });
321
+ assertSafeInitTaskPaths(cwd);
322
+ try {
323
+ fs.mkdirSync(stagingRoot);
324
+ createdStagingRoot = true;
325
+ }
326
+ catch (error) {
327
+ if (error.code !== "EEXIST")
328
+ throw error;
329
+ const existingStagingRoot = fs.lstatSync(stagingRoot);
330
+ if (!existingStagingRoot.isDirectory() ||
331
+ existingStagingRoot.isSymbolicLink()) {
332
+ throw new Error("Init Task staging path must be a directory");
333
+ }
334
+ }
335
+ assertSafeInitTaskPaths(cwd, [stagingRoot]);
336
+ stagingDir = fs.mkdtempSync(path.join(stagingRoot, `${taskName}-`));
337
+ assertSafeInitTaskPaths(cwd, [stagingRoot, stagingDir]);
338
+ fs.writeFileSync(path.join(stagingDir, FILE_NAMES.PRD), prdContent, {
339
+ encoding: "utf8",
340
+ flag: "wx",
341
+ });
342
+ const created = createTaskKernel({
343
+ root: cwd,
344
+ taskDir: stagingDir,
345
+ definition,
346
+ actor,
347
+ idempotencyKey: `init-v2:${definition.taskId}`,
348
+ cwd,
349
+ });
350
+ if (created.kernel.phase !== "define" ||
351
+ created.kernel.runs.length !== 0 ||
352
+ created.kernel.reviews.length !== 0 ||
353
+ created.kernel.closure !== null) {
354
+ throw new Error("Init Task did not produce the expected V2 Define state");
355
+ }
356
+ const verified = readTaskKernel({ root: cwd, taskDir: stagingDir, cwd });
357
+ if (verified.kind !== "task-kernel-v2" ||
358
+ verified.kernel.identity.taskId !== definition.taskId ||
359
+ verified.kernel.definition.deliveryLevel !== definition.deliveryLevel ||
360
+ verified.kernel.definition.dependencies.length !== 0 ||
361
+ verified.kernel.phase !== "define" ||
362
+ verified.kernel.runs.length !== 0 ||
363
+ verified.kernel.reviews.length !== 0 ||
364
+ verified.kernel.closure !== null) {
365
+ throw new Error("Init Task failed V2 Kernel read-back validation");
366
+ }
367
+ assertSafeInitTaskPaths(cwd, [stagingRoot, stagingDir]);
368
+ const taskDir = path.join(tasksRoot, taskName);
369
+ if (pathExists(taskDir))
370
+ throw new Error(`Task already exists: ${taskName}`);
371
+ fs.renameSync(stagingDir, taskDir);
372
+ stagingDir = null;
373
+ committed = true;
374
+ clearInitTaskMarker(cwd, taskName);
375
+ return true;
376
+ }
377
+ catch {
378
+ recordInitTaskFailure(cwd, taskName);
379
+ return false;
380
+ }
381
+ finally {
382
+ if (!committed &&
383
+ stagingRoot &&
384
+ stagingDir &&
385
+ pathExists(stagingDir)) {
386
+ try {
387
+ assertSafeInitTaskPaths(cwd, [stagingRoot, stagingDir]);
388
+ removeInitTaskStaging(stagingRoot, stagingDir);
389
+ }
390
+ catch {
391
+ // Leave unexpected staging state for inspection; the marker remains.
392
+ }
393
+ }
394
+ if (createdStagingRoot && stagingRoot && pathExists(stagingRoot)) {
395
+ try {
396
+ assertSafeInitTaskPaths(cwd, [stagingRoot]);
397
+ const currentStagingRoot = fs.lstatSync(stagingRoot);
398
+ if (currentStagingRoot.isDirectory() &&
399
+ !currentStagingRoot.isSymbolicLink() &&
400
+ fs.readdirSync(stagingRoot).length === 0) {
401
+ fs.rmdirSync(stagingRoot);
402
+ }
403
+ }
404
+ catch {
405
+ // Preserve unexpected or user-modified paths during cleanup.
406
+ }
407
+ }
408
+ }
409
+ }
410
+ /** Build the human-readable checklist mirrored by the bootstrap Task's AC. */
91
411
  function getBootstrapChecklistItems(projectType, packages) {
92
412
  if (packages && packages.length > 0) {
93
413
  const items = packages.map((pkg) => `Fill guidelines for ${pkg.name}`);
@@ -117,7 +437,7 @@ function renderCapabilityReadinessSection(selectedCapabilities) {
117
437
  })
118
438
  .join("\n");
119
439
  return `
120
- ## Capability readiness (required before archive)
440
+ ## Capability readiness (record before Review and Close)
121
441
 
122
442
  Init selected optional project capabilities for this repo. Treat them as
123
443
  \`pending\` until you verify they work in this checkout.
@@ -131,7 +451,7 @@ ${checklist}
131
451
  watcher auto-syncs later edits; you do not need to re-run full indexing for
132
452
  every code change.
133
453
  - If a capability cannot be made ready, record the failure and fallback path in
134
- \`verify.md\` before archiving bootstrap.
454
+ this Task's evidence before independent Review and Close.
135
455
  - Validation entrypoint: \`pactile capability-smoke --write-status\`
136
456
 
137
457
  ---
@@ -154,23 +474,17 @@ function getBootstrapPrdContent(projectType, selectedCapabilities, packages) {
154
474
  const checklistMarkdown = checklistItems
155
475
  .map((item) => `- [ ] ${item}`)
156
476
  .join("\n");
477
+ const acceptanceMarkdown = getBootstrapTaskDefinition(projectType, selectedCapabilities, packages)
478
+ .acceptanceCriteria.map((criterion) => `- [ ] ${criterion.id}: ${criterion.description}`)
479
+ .join("\n");
157
480
  const header = `# Bootstrap Task: Fill Project Development Guidelines
158
481
 
159
- **You (the AI) are running this task. The developer does not read this file.**
482
+ **Task state: V2 Define. No Run exists, and init does not authorize execution.**
160
483
 
161
- The developer just ran \`pactile init\` on this project for the first time.
162
- \`.pactile/\` now exists with empty spec scaffolding, and this bootstrap task
163
- exists under \`.pactile/tasks/\`. When they want to work on it, they should start
164
- this task from a session that provides Pactile session identity.
165
-
166
- **Your job**: help them populate \`.pactile/spec/\` with the team's real
167
- coding conventions. Every future AI session — this project's
168
- \`pactile-implement\` and \`pactile-check\` sub-agents — auto-loads spec files
169
- listed in per-task jsonl manifests. Empty spec = sub-agents write generic
170
- code. Real spec = sub-agents match the team's actual patterns.
484
+ pactile init created this V2 Task as a proposal to document the project's actual conventions. Its kernel.json records Task state; this prd.md is the human-readable plan. Before starting any Run or making project changes, obtain the user's ordinary, explicit approval for that work.\n\n**Deliverable**: useful, evidence-based project guidance in .pactile/spec/. Read the current workflow and the project itself. Do not assume that a named sub-agent, host hook, or automatic prompt injection is installed or active; verify actual host behavior before making such a claim. Contributors can consult relevant spec files directly when working on this project.
171
485
 
172
486
  Don't dump instructions. Open with a short greeting, figure out if the repo
173
- has any existing convention docs (AGENTS.md, .cursorrules, CONTRIBUTING.md, etc.), and drive
487
+ has any existing convention docs (AGENTS.md, CONTRIBUTING.md, etc.), and drive
174
488
  the rest conversationally.
175
489
 
176
490
  ---
@@ -179,6 +493,10 @@ the rest conversationally.
179
493
 
180
494
  ${checklistMarkdown}
181
495
 
496
+ ## Acceptance criteria
497
+
498
+ ${acceptanceMarkdown}
499
+
182
500
  ---
183
501
 
184
502
  ${renderCapabilityReadinessSection(selectedCapabilities)}
@@ -230,8 +548,6 @@ usually much faster than documenting from scratch.
230
548
  | File / Directory | Notes |
231
549
  |------|------|
232
550
  | \`AGENTS.md\` | Agent entry / managed instructions |
233
- | \`.cursorrules\` | Legacy Cursor rules file |
234
- | \`.cursor/rules/*.mdc\` | Cursor rules directory |
235
551
  | \`CONTRIBUTING.md\` | General project conventions |
236
552
  | \`.editorconfig\` | Editor formatting rules |
237
553
 
@@ -245,50 +561,22 @@ Scan real code to discover patterns. Before writing each spec file:
245
561
  ### Step 3: Document reality, not ideals
246
562
 
247
563
  **Critical**: write what the code *actually does*, not what it should do.
248
- Sub-agents match the spec, so aspirational patterns that don't exist in the
249
- codebase will cause sub-agents to write code that looks out of place.
564
+ Separate verified patterns from open questions so the documentation does not
565
+ present aspirational conventions as current behavior.
250
566
 
251
567
  If the team has known tech debt, document the current state — improvement
252
568
  is a separate conversation, not a bootstrap concern.
253
569
 
254
570
  ---
255
571
 
256
- ## Quick explainer of the runtime (share when they ask "why do we need spec at all")
257
-
258
- - Every AI coding task spawns two sub-agents: \`pactile-implement\` (writes
259
- code) and \`pactile-check\` (verifies quality).
260
- - Each task has \`implement.jsonl\` / \`check.jsonl\` manifests listing which
261
- spec files to load.
262
- - The platform hook auto-injects those spec files + the task's \`prd.md\`
263
- into every sub-agent prompt, so the sub-agent codes/reviews per team
264
- conventions without anyone pasting them manually.
265
- - Source of truth: \`.pactile/spec/\`. That's why filling it well now pays
266
- off forever.
267
-
268
- ---
269
-
270
- ## Completion
271
-
272
- When the developer confirms the checklist items above are done with real
273
- examples (not placeholders), guide them to run:
274
-
275
- \`\`\`bash
276
- pactile task archive 00-bootstrap-guidelines --check
277
- pactile task archive 00-bootstrap-guidelines
278
- \`\`\`
279
-
280
- After archive, every new developer who joins this project will get a
281
- \`00-join-<slug>\` onboarding task instead of this bootstrap task.
572
+ ## How this fits the Task workflow\n\n- A V2 Task Kernel records the definition, hard dependencies, Runs, candidate snapshots, independent Reviews, and Close evidence. .pactile/workflow.md is a human overview; the Kernel is lifecycle authority.\n- This generated Task has no Run. A Run may begin only after the user approves the specific work through the ordinary approval flow.\n- A completed Run produces a candidate that must receive an independent Review bound to that exact candidate. Close uses the latest passing Review and evidence for every acceptance criterion, with documentation delivery evidence for this Task.\n- Scheduler suggestions do not grant approval or bypass Kernel gates. Use the current V2 Task commands and pactile task --help for their arguments.\n\n---\n
573
+ ## Completion\n\nWhen the checklist items are complete, record evidence for every acceptance criterion, including references to the documented files and real examples. Ask the user before creating a Run. Then follow the V2 lifecycle: approved Run, candidate-bound independent Review, and Close with matching documentation delivery evidence. Init, a scheduler plan, or this PRD is not execution approval.
282
574
 
283
575
  ---
284
576
 
285
577
  ## Suggested opening line
286
578
 
287
- "Welcome to Pactile! Your init just set me up to help you fill the project
288
- spec — a one-time setup so every future AI session follows the team's
289
- conventions instead of writing generic code. Before we start, do you have
290
- any existing convention docs (AGENTS.md, .cursorrules, CONTRIBUTING.md,
291
- etc.) I can pull from, or should I scan the codebase from scratch?"
579
+ "Welcome to Pactile! Init created a proposal to document this project's conventions. Do you have existing convention docs (AGENTS.md, CONTRIBUTING.md, or similar) I should compare with the code, or should I begin by inspecting the repository?"
292
580
  `;
293
581
  let content = header;
294
582
  if (packages && packages.length > 0) {
@@ -319,184 +607,167 @@ etc.) I can pull from, or should I scan the codebase from scratch?"
319
607
  content += footer;
320
608
  return content;
321
609
  }
322
- function getBootstrapTaskJson(developer, projectType, packages) {
323
- const today = new Date().toISOString().split("T")[0];
610
+ function getBootstrapTaskDefinition(projectType, selectedCapabilities, packages) {
324
611
  const relatedFiles = getBootstrapRelatedFiles(projectType, packages);
325
- // Canonical 24-field shape via emptyTaskJson factory.
326
- // Checklist items (previously stored as structured `subtasks`) are now
327
- // rendered as `- [ ]` items in prd.md; task.json.subtasks is always
328
- // string[] (child task dir names) per the canonical schema.
329
- return emptyTaskJson({
330
- id: BOOTSTRAP_TASK_NAME,
331
- name: BOOTSTRAP_TASK_NAME,
332
- title: "Bootstrap Guidelines",
333
- description: "Fill in project development guidelines for AI agents",
334
- status: "in_progress",
335
- dev_type: "docs",
336
- priority: "P1",
337
- creator: developer,
338
- assignee: developer,
339
- createdAt: today,
340
- relatedFiles,
341
- notes: `First-time setup task created by pactile init (${projectType} project)`,
342
- });
612
+ const checklistItems = getBootstrapChecklistItems(projectType, packages);
613
+ const acceptanceCriteria = [
614
+ {
615
+ id: "AC-1",
616
+ description: "Complete the project-specific checklist (" +
617
+ checklistItems.join("; ") +
618
+ ") and update the relevant spec files: " +
619
+ relatedFiles.join(", ") +
620
+ ".",
621
+ },
622
+ {
623
+ id: "AC-2",
624
+ description: "For each documented convention, cite at least two real repository examples or source documents; mark unsupported claims as open questions instead of presenting them as facts.",
625
+ },
626
+ ];
627
+ if (selectedCapabilities.length > 0) {
628
+ acceptanceCriteria.push({
629
+ id: "AC-3",
630
+ description: "Record each selected capability as ready, pending, or failed using observable verification evidence; do not report a capability as ready without that evidence.",
631
+ });
632
+ }
633
+ return {
634
+ taskId: BOOTSTRAP_TASK_NAME,
635
+ title: "Populate project development guidelines",
636
+ description: "Document verified project conventions in the Pactile specification files.",
637
+ deliverable: "Evidence-based project guidance in " +
638
+ relatedFiles.join(", ") +
639
+ " with acceptance evidence recorded for this Task.",
640
+ deliveryLevel: "documentation",
641
+ acceptanceCriteria,
642
+ dependencies: [],
643
+ };
343
644
  }
344
645
  /**
345
646
  * Create bootstrap task for first-time setup
346
647
  */
347
648
  function createBootstrapTask(cwd, developer, projectType, selectedCapabilities, packages) {
348
- const taskJson = getBootstrapTaskJson(developer, projectType, packages);
649
+ const definition = getBootstrapTaskDefinition(projectType, selectedCapabilities, packages);
349
650
  const prdContent = getBootstrapPrdContent(projectType, selectedCapabilities, packages);
350
- return writeTaskSkeleton(cwd, BOOTSTRAP_TASK_NAME, taskJson, prdContent);
651
+ return writeTaskSkeleton(cwd, BOOTSTRAP_TASK_NAME, definition, "pactile init (" + developer + ")", prdContent);
351
652
  }
352
653
  // =============================================================================
353
654
  // Joiner Onboarding Task Creation
354
655
  // =============================================================================
355
- /**
356
- * task.json factory for joiner onboarding. Mirrors the bootstrap factory but
357
- * uses dev_type "docs", higher priority "P1", and the developer-specific task
358
- * name (so multiple joiners in the same checkout don't collide).
359
- */
360
- function getJoinerTaskJson(developer, taskName) {
361
- const today = new Date().toISOString().split("T")[0];
362
- return emptyTaskJson({
363
- id: taskName,
364
- name: taskName,
365
- title: `Joining: Onboard to this Pactile project (${developer})`,
366
- description: "Onboard a new developer to an existing Pactile project: learn the workflow, conventions, and find assigned work",
367
- status: "in_progress",
368
- dev_type: "docs",
369
- priority: "P1",
370
- creator: developer,
371
- assignee: developer,
372
- createdAt: today,
373
- notes: "Generated by pactile init for a new developer joining an existing Pactile project",
374
- });
656
+ /** Create the V2 documentation Task used for a new project joiner. */
657
+ function getJoinerTaskDefinition(developer, taskId, taskName, selectedCapabilities) {
658
+ const acceptanceCriteria = [
659
+ {
660
+ id: "AC-1",
661
+ description: "Create onboarding-notes.md in the Task directory with references to this project's actual workflow and specification files, and explain that the Kernel controls lifecycle state.",
662
+ },
663
+ {
664
+ id: "AC-2",
665
+ description: "Record the active V2 Task IDs found or explicitly state that none are listed; do not infer V2 assignment from legacy task fields.",
666
+ },
667
+ ];
668
+ if (selectedCapabilities.length > 0) {
669
+ acceptanceCriteria.push({
670
+ id: "AC-3",
671
+ description: "Record each selected capability as ready, pending, or failed with observable verification evidence, or state that verification was not performed.",
672
+ });
673
+ }
674
+ return {
675
+ taskId,
676
+ title: "Onboard developer to this Pactile project: " + developer,
677
+ description: "Prepare a concise onboarding note based on the actual project workflow, conventions, and visible V2 Tasks.",
678
+ deliverable: "A project-specific onboarding note at .pactile/tasks/" +
679
+ taskName +
680
+ "/onboarding-notes.md with evidence for each acceptance criterion.",
681
+ deliveryLevel: "documentation",
682
+ acceptanceCriteria,
683
+ dependencies: [],
684
+ };
375
685
  }
376
686
  /**
377
687
  * PRD content for joiner onboarding. Kept concise (~80 lines) — deeper
378
688
  * guidance lives in skills and docs.
379
689
  */
380
- function getJoinerPrdContent(developer, selectedCapabilities) {
381
- const slug = slugifyDeveloperName(developer);
690
+ function getJoinerPrdContent(developer, taskName, taskId, selectedCapabilities) {
382
691
  const selectedCapabilityChecklist = selectedCapabilities
383
692
  .map((id) => {
384
693
  const capability = getProjectCapability(id);
385
- return `- \`${capability.id}\` — re-check readiness in this clone before claiming it is available.`;
694
+ return ("- " +
695
+ capability.id +
696
+ " — re-check readiness in this clone before claiming it is available.");
386
697
  })
387
698
  .join("\n");
388
- let capabilitySection = "";
389
- if (selectedCapabilities.length > 0) {
390
- capabilitySection = `
391
- ### 5. Re-verify selected project capabilities
392
-
393
- This repo has capability selections recorded in \`.pactile/capabilities.json\`.
394
- Before they rely on MCP-backed behavior, remind them to check the selected set:
395
-
396
- ${selectedCapabilityChecklist}
397
-
398
- - If a capability is not \`ready\`, have them re-run the local verification path
399
- instead of assuming the previous machine's setup carries over.
400
-
401
- ---
402
- `;
403
- }
404
- return `# Joiner Onboarding Task
405
-
406
- **You (the AI) are running this task. The developer does not read this file.**
407
-
408
- \`${developer}\` just ran \`pactile init\` on a fresh clone, saw "Developer
409
- initialized", and will now start asking you questions in chat. This joiner task
410
- exists under \`.pactile/tasks/\`; when they want to work on it, they should
411
- select it from a session that provides Pactile session identity.
412
-
413
- Your job is to orient them to Pactile. Don't dump all of this at them — open
414
- with a short greeting, ask where they want to start, and fill in the rest as
415
- they engage.
416
-
417
- ---
418
-
419
- ## Topics to cover (adapt order to their questions)
420
-
421
- ### 1. What Pactile is + the workflow
422
-
423
- Pactile is a governed capability workspace for Codex that keeps AI
424
- agents consistent with project-specific conventions instead of writing generic
425
- code every session.
426
-
427
- - **Human lifecycle**: Open → Define → Approve → Execute → Verify →
428
- (Integrate? when parent-child) → Close. Kernel writes that state.
429
- \`.pactile/workflow.md\` is a human overview, **not runtime SSOT**.
430
- - **Task files** live under \`.pactile/tasks/\`. \`status\` is a projection, not
431
- the only truth.
432
- - **Codex session**: read the Task record, project instructions, and current
433
- Evidence before resuming. The Task record remains durable authority.
434
-
435
- ### 2. Runtime mechanics (explain when they ask "how does it know what to do")
436
-
437
- - **Context**: load Kernel / Dashboard and the selected Task's \`prd.md\`
438
- plus recent activity. Do not treat a generated phase index as runtime
439
- authority.
440
- - **Coordination**: \`pactile codex\` records native desktop task requests and
441
- receipts; the App task invokes its native tools. \`pactile pi\` dispatches
442
- approved Execute work through Pi RPC.
443
-
444
- File layout (mention when they ask "where does what live"):
445
- - \`.pactile/.runtime/sessions/<session>.json\` — live-session selected-task state, gitignored
446
- - \`.pactile/tasks/<task>/{implement,check}.jsonl\` — per-task context manifests
447
- - \`.pactile/spec/\` — project-wide conventions (source of truth)
448
- - \`.pactile/workspace/${developer}/journal-*.md\` — their session log,
449
- rotated at ~2000 lines
450
-
451
- ### 3. This project's actual conventions
452
-
453
- - Summarize \`.pactile/spec/\` for them — what coding conventions this
454
- specific team enforces.
455
- - Point at the last 5 entries in \`.pactile/tasks/archive/\` as a rhythm
456
- example of how people actually work here. **If archive is empty** (the
457
- project just started), skip this — don't invent examples.
458
- - Not your job in this onboarding to teach them the business code itself —
459
- the README and their teammates handle that.
460
-
461
- ### 4. Their assigned work
462
-
463
- - Check if \`.pactile/workspace/${developer}/\` already exists — if yes, it's
464
- their journal from another machine and worth mentioning.
465
- - Run \`pactile task list --assignee "${developer}"\` to
466
- show tasks assigned to them. (Quote the name if it contains spaces.)
467
- - Remind them to inspect assigned Tasks at the start of each session.
468
-
469
- ---
470
-
471
- ${capabilitySection}
472
-
473
- ## Optional: walk through a small task end-to-end
474
-
475
- If they want to practice before touching real work, offer to pick a tiny
476
- P3 task or a typo fix and run the full cycle together: define → approve →
477
- execute → verify → close.
478
-
479
- ---
480
-
481
- ## Completion
482
-
483
- When they feel oriented (or after you've covered the four topics with
484
- reasonable back-and-forth), guide them to run:
485
-
486
- \`\`\`bash
487
- pactile task archive 00-join-${slug} --check
488
- pactile task archive 00-join-${slug}
489
- \`\`\`
490
-
491
- ---
492
-
493
- ## Suggested opening line
494
-
495
- "Welcome! Your \`pactile init\` set me up to onboard you to this project. I
496
- can walk you through the workflow, show you the runtime mechanics under the
497
- hood, summarize the team's spec, or jump to what you're already curious about
498
- — which would you prefer?"
499
- `;
699
+ const capabilitySection = selectedCapabilities.length > 0
700
+ ? [
701
+ "### Selected project capabilities",
702
+ "",
703
+ "Re-check each selected capability in this clone before relying on it:",
704
+ "",
705
+ selectedCapabilityChecklist,
706
+ "",
707
+ "If verification is incomplete, record it as pending or failed with the fallback path.",
708
+ ].join("\n")
709
+ : "";
710
+ const acceptanceCriteriaMarkdown = getJoinerTaskDefinition(developer, taskId, taskName, selectedCapabilities)
711
+ .acceptanceCriteria.map((criterion) => "- [ ] " + criterion.id + ": " + criterion.description)
712
+ .join("\n");
713
+ return [
714
+ "# Joiner Onboarding Task",
715
+ "",
716
+ "Task ID: " +
717
+ taskId +
718
+ ". State: V2 Define. No Run exists, and init does not authorize execution.",
719
+ "",
720
+ "pactile init created this V2 Task for " +
721
+ developer +
722
+ " as an onboarding proposal. The Kernel in .pactile/tasks/" +
723
+ taskName +
724
+ "/kernel.json records its definition and lifecycle. This PRD is the human-readable plan.",
725
+ "Before starting a Run or changing project files, obtain the user's ordinary, explicit approval for that work.",
726
+ "",
727
+ "Your deliverable is a concise onboarding note at .pactile/tasks/" +
728
+ taskName +
729
+ "/onboarding-notes.md. Use project evidence, and mark unavailable information as unknown rather than guessing.",
730
+ "",
731
+ "## Onboarding topics",
732
+ "",
733
+ "### 1. Current Task workflow",
734
+ "",
735
+ "- Read .pactile/workflow.md as a human overview. The V2 Task Kernel is lifecycle authority.",
736
+ "- Explain the Task definition, hard dependencies, and why a Run needs ordinary user approval.",
737
+ "- Explain that a Task can have multiple Runs and that an independent Review binds to the exact candidate from one Run.",
738
+ "- Explain that Close uses the latest passing Review, evidence for every acceptance criterion, and the delivery evidence level in the Task definition.",
739
+ "- Use pactile task --help for the current command arguments. Do not assume a host spawned a named agent or ran a hook without an observable receipt.",
740
+ "",
741
+ "### 2. This project's actual conventions",
742
+ "",
743
+ "- Read .pactile/spec/ and cite the relevant files in onboarding-notes.md.",
744
+ "- Compare the written guidance with real repository files; mark unresolved questions explicitly.",
745
+ "- Do not treat old archive directories or generated phase hints as V2 lifecycle authority.",
746
+ "",
747
+ "### 3. Visible V2 Tasks and next steps",
748
+ "",
749
+ "- Run pactile task schedule list to inspect visible V2 scheduling candidates. Record their Task IDs, or state that none were listed.",
750
+ "- Ask the user which approved work they want to pursue. The V2 Task definition has no assignee field, so do not infer assignment from legacy task.json data.",
751
+ "- If the user wants a practice task, agree on its definition and acceptance criteria first, then follow the ordinary approval, Run, independent Review, and Close gates.",
752
+ "",
753
+ capabilitySection,
754
+ "",
755
+ "## Acceptance criteria",
756
+ "",
757
+ acceptanceCriteriaMarkdown,
758
+ "",
759
+ "## Acceptance evidence",
760
+ "",
761
+ "In onboarding-notes.md include links or repository-relative paths to the workflow and spec files reviewed, the V2 Task IDs found (or none), and capability verification status when applicable.",
762
+ "",
763
+ "Before completion, check every acceptance criterion in the Task definition. Ask the user before any Run, record a candidate-bound independent Review, then Close with documentation delivery evidence that points to onboarding-notes.md. Do not move the task directory as a substitute for Close.",
764
+ "",
765
+ "## Suggested opening",
766
+ "",
767
+ "Welcome, " +
768
+ developer +
769
+ ". I can start by explaining the current Task workflow, reviewing the project conventions, or checking which V2 Tasks are visible. Which is most useful?",
770
+ ].join("\n");
500
771
  }
501
772
  /**
502
773
  * Create joiner onboarding task for a new developer on an existing Pactile
@@ -506,9 +777,11 @@ hood, summarize the team's spec, or jump to what you're already curious about
506
777
  function createJoinerOnboardingTask(cwd, developer) {
507
778
  const slug = slugifyDeveloperName(developer);
508
779
  const taskName = `00-join-${slug}`;
509
- const taskJson = getJoinerTaskJson(developer, taskName);
510
- const prdContent = getJoinerPrdContent(developer, loadProjectCapabilities(cwd));
511
- return writeTaskSkeleton(cwd, taskName, taskJson, prdContent);
780
+ const taskId = taskKernelIdForDirectoryName(taskName);
781
+ const selectedCapabilities = loadProjectCapabilities(cwd);
782
+ const definition = getJoinerTaskDefinition(developer, taskId, taskName, selectedCapabilities);
783
+ const prdContent = getJoinerPrdContent(developer, taskName, taskId, selectedCapabilities);
784
+ return writeTaskSkeleton(cwd, taskName, definition, `pactile init (${developer})`, prdContent);
512
785
  }
513
786
  /**
514
787
  * Handle re-init when .pactile/ already exists.
@@ -622,16 +895,24 @@ async function handleReinit(cwd, options, developerName) {
622
895
  // the Node identity writer, this checkout had no identity → treat as a new
623
896
  // joiner onboarding onto an existing Pactile project.
624
897
  const hadDeveloperFileBefore = fs.existsSync(path.join(cwd, DIR_NAMES.WORKFLOW, FILE_NAMES.DEVELOPER));
625
- try {
626
- initializeDeveloper(cwd, devName);
627
- console.log(chalk.green(`✓ Developer "${devName}" initialized`));
898
+ const joinerTaskName = `00-join-${slugifyDeveloperName(devName)}`;
899
+ const joinerIntentReady = hadDeveloperFileBefore ||
900
+ ensureInitTaskMarker(cwd, joinerTaskName, devName);
901
+ if (!joinerIntentReady) {
902
+ console.warn(chalk.yellow("⚠ Could not record joiner recovery intent; developer identity was not initialized"));
628
903
  }
629
- catch (err) {
630
- console.log(chalk.yellow(`⚠ Could not initialize developer: ${err instanceof Error ? err.message : String(err)}`));
904
+ if (joinerIntentReady) {
905
+ try {
906
+ initializeDeveloper(cwd, devName);
907
+ console.log(chalk.green(`✓ Developer "${devName}" initialized`));
908
+ }
909
+ catch (err) {
910
+ console.log(chalk.yellow(`⚠ Could not initialize developer: ${err instanceof Error ? err.message : String(err)}`));
911
+ }
631
912
  }
632
913
  // Create joiner onboarding task for fresh checkouts (no prior .developer).
633
914
  // Runs outside the init_developer try/catch so failures surface as warnings.
634
- if (!hadDeveloperFileBefore) {
915
+ if (!hadDeveloperFileBefore && joinerIntentReady) {
635
916
  try {
636
917
  if (!createJoinerOnboardingTask(cwd, devName)) {
637
918
  console.warn(chalk.yellow("⚠ Failed to create joiner onboarding task"));
@@ -731,11 +1012,6 @@ export async function init(options) {
731
1012
  const banner = figlet.textSync("Pactile", { font: "Rebel" });
732
1013
  console.log(chalk.cyan(`\n${banner.trimEnd()}`));
733
1014
  console.log(chalk.gray("\n Governed AI workflow for Codex\n"));
734
- // Set up proxy before any network calls
735
- const proxyUrl = setupProxy();
736
- if (proxyUrl) {
737
- console.log(chalk.gray(` Using proxy: ${maskProxyUrl(proxyUrl)}\n`));
738
- }
739
1015
  // Set write mode based on options
740
1016
  let writeMode = "ask";
741
1017
  if (options.force) {
@@ -770,6 +1046,50 @@ export async function init(options) {
770
1046
  }
771
1047
  }
772
1048
  }
1049
+ // A joiner intent is durable before identity is written. Resolve any
1050
+ // existing identity before dispatch so an unrelated request or marker cannot
1051
+ // publish a Task under a second developer name.
1052
+ let persistedDeveloper = null;
1053
+ try {
1054
+ persistedDeveloper = readDeveloper(cwd);
1055
+ }
1056
+ catch {
1057
+ // Keep init best-effort when a user-owned identity file is unreadable.
1058
+ }
1059
+ const pendingJoinerMarkers = readPendingJoinerMarkers(cwd);
1060
+ const validPendingJoinerMarkers = pendingJoinerMarkers.filter((marker) => marker.valid);
1061
+ const hasPersistedDeveloperFile = pathExists(path.join(cwd, PATHS.DEVELOPER_FILE));
1062
+ let requestedDeveloper = null;
1063
+ const trimmedDeveloperName = developerName?.trim();
1064
+ if (trimmedDeveloperName)
1065
+ requestedDeveloper = trimmedDeveloperName;
1066
+ const markerConflictsWithIdentity = (marker, identity) => marker.developerName !== null
1067
+ ? marker.developerName !== identity
1068
+ : marker.taskName !== `00-join-${slugifyDeveloperName(identity)}`;
1069
+ const conflictsWithPersistedDeveloper = persistedDeveloper !== null &&
1070
+ ((requestedDeveloper !== null &&
1071
+ requestedDeveloper !== persistedDeveloper) ||
1072
+ validPendingJoinerMarkers.some((marker) => markerConflictsWithIdentity(marker, persistedDeveloper)));
1073
+ const conflictingRequestAndMarker = requestedDeveloper !== null &&
1074
+ validPendingJoinerMarkers.some((marker) => markerConflictsWithIdentity(marker, requestedDeveloper));
1075
+ const cannotValidatePersistedDeveloper = hasPersistedDeveloperFile &&
1076
+ persistedDeveloper === null &&
1077
+ (requestedDeveloper !== null || validPendingJoinerMarkers.length > 0);
1078
+ if (conflictsWithPersistedDeveloper ||
1079
+ conflictingRequestAndMarker ||
1080
+ cannotValidatePersistedDeveloper) {
1081
+ console.warn(chalk.yellow("⚠ Init stopped: the requested identity, pending joiner marker, and existing .developer identity cannot be reconciled. Preserve existing files and resolve the identity before retrying."));
1082
+ return;
1083
+ }
1084
+ if (!options.user) {
1085
+ if (persistedDeveloper &&
1086
+ hasInitTaskMarker(cwd, `00-join-${slugifyDeveloperName(persistedDeveloper)}`)) {
1087
+ developerName = persistedDeveloper;
1088
+ }
1089
+ else if (!persistedDeveloper) {
1090
+ developerName = readPendingJoinerDeveloperName(cwd) ?? developerName;
1091
+ }
1092
+ }
773
1093
  if (developerName) {
774
1094
  console.log(chalk.blue("👤 Developer:"), chalk.gray(developerName));
775
1095
  }
@@ -781,12 +1101,18 @@ export async function init(options) {
781
1101
  // to the full flow so the main-dispatch tasksEmpty fallback fires —
782
1102
  // handleReinit's joiner branch would otherwise mis-route the recovery.
783
1103
  const tasksDirEarly = path.join(cwd, PATHS.TASKS);
784
- const tasksEmptyEarly = !fs.existsSync(tasksDirEarly) || fs.readdirSync(tasksDirEarly).length === 0;
1104
+ const pendingBootstrap = hasInitTaskMarker(cwd, BOOTSTRAP_TASK_NAME);
1105
+ const pendingJoiner = developerName
1106
+ ? hasInitTaskMarker(cwd, `00-join-${slugifyDeveloperName(developerName)}`)
1107
+ : false;
1108
+ const tasksEmptyEarly = !fs.existsSync(tasksDirEarly) || fs.readdirSync(tasksDirEarly).filter((entry) => entry !== ".creating" && !entry.startsWith(".pending-")).length === 0;
785
1109
  if (!isFirstInit &&
786
1110
  !importingCstl &&
787
1111
  !options.force &&
788
1112
  !options.skipExisting &&
789
- !tasksEmptyEarly) {
1113
+ !tasksEmptyEarly &&
1114
+ !pendingBootstrap &&
1115
+ !pendingJoiner) {
790
1116
  const reinitDone = await handleReinit(cwd, options, developerName);
791
1117
  if (reinitDone)
792
1118
  return;
@@ -1427,8 +1753,37 @@ export async function init(options) {
1427
1753
  // migration backup or prompt for a legacy transition that never existed.
1428
1754
  writeWaveCConfirmed(cwd);
1429
1755
  }
1430
- // Initialize developer identity with Node (silent - no output).
1756
+ let shouldCreateBootstrap = false;
1757
+ let shouldCreateJoiner = false;
1431
1758
  if (developerName) {
1759
+ const tasksDir = path.join(cwd, PATHS.TASKS);
1760
+ const tasksEmpty = !fs.existsSync(tasksDir) ||
1761
+ fs
1762
+ .readdirSync(tasksDir)
1763
+ .filter((entry) => entry !== ".creating" && !entry.startsWith(".pending-"))
1764
+ .length === 0;
1765
+ shouldCreateBootstrap =
1766
+ (isFirstInit && !importingCstl) ||
1767
+ pendingBootstrap ||
1768
+ (tasksEmpty && !pendingJoiner);
1769
+ shouldCreateJoiner =
1770
+ !shouldCreateBootstrap &&
1771
+ (!hadDeveloperFileAtStart || pendingJoiner);
1772
+ }
1773
+ const joinerTaskName = developerName
1774
+ ? `00-join-${slugifyDeveloperName(developerName)}`
1775
+ : null;
1776
+ const joinerIntentReady = !developerName ||
1777
+ !shouldCreateJoiner ||
1778
+ (joinerTaskName !== null &&
1779
+ ensureInitTaskMarker(cwd, joinerTaskName, developerName ?? undefined));
1780
+ if (shouldCreateJoiner && !joinerIntentReady) {
1781
+ console.warn(chalk.yellow("⚠ Could not record joiner recovery intent; developer identity was not initialized"));
1782
+ }
1783
+ // Initialize developer identity with Node (silent - no output). For a fresh
1784
+ // joiner, the recovery intent must be durable before this write so a process
1785
+ // interruption cannot leave identity without its onboarding Task.
1786
+ if (developerName && joinerIntentReady) {
1432
1787
  try {
1433
1788
  if (!readDeveloper(cwd))
1434
1789
  initializeDeveloper(cwd, developerName);
@@ -1451,15 +1806,16 @@ export async function init(options) {
1451
1806
  // Runs OUTSIDE the init_developer try/catch (which uses stdio: "pipe")
1452
1807
  // so joiner failures surface as warnings instead of being silently
1453
1808
  // swallowed.
1454
- const tasksDir = path.join(cwd, PATHS.TASKS);
1455
- const tasksEmpty = !fs.existsSync(tasksDir) || fs.readdirSync(tasksDir).length === 0;
1456
- if ((isFirstInit && !importingCstl) || tasksEmpty) {
1809
+ if (shouldCreateBootstrap) {
1457
1810
  const bootstrapCreated = createBootstrapTask(cwd, developerName, projectType, selectedCapabilities, monorepoPackages);
1458
1811
  if (bootstrapCreated) {
1459
1812
  console.log(chalk.gray(`Next: complete ${BOOTSTRAP_TASK_NAME} to verify selected capabilities and fill the project spec.`));
1460
1813
  }
1814
+ else {
1815
+ console.warn(chalk.yellow(`⚠ Failed to create ${BOOTSTRAP_TASK_NAME}; inspect .pactile/tasks/ and retry pactile init.`));
1816
+ }
1461
1817
  }
1462
- else if (!hadDeveloperFileAtStart) {
1818
+ else if (shouldCreateJoiner) {
1463
1819
  try {
1464
1820
  if (!createJoinerOnboardingTask(cwd, developerName)) {
1465
1821
  console.warn(chalk.yellow("⚠ Failed to create joiner onboarding task"));