@blxzer/pactile 0.5.0 → 0.6.0-beta.2

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 (917) hide show
  1. package/CHANGELOG.md +612 -563
  2. package/LICENSE +235 -235
  3. package/README.md +108 -105
  4. package/README.zh-CN.md +105 -105
  5. package/bin/compat-warning.js +11 -11
  6. package/bin/cstl.js +6 -6
  7. package/bin/pactile.js +3 -3
  8. package/bin/smart-search.js +38 -38
  9. package/dist/cli/index.d.ts.map +1 -1
  10. package/dist/cli/index.js +79 -30
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/commands/codex.d.ts +3 -0
  13. package/dist/commands/codex.d.ts.map +1 -0
  14. package/dist/commands/codex.js +54 -0
  15. package/dist/commands/codex.js.map +1 -0
  16. package/dist/commands/context.d.ts +3 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +272 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/init.d.ts +0 -20
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +285 -456
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/migrate.js +1 -1
  25. package/dist/commands/migrate.js.map +1 -1
  26. package/dist/commands/parallel.d.ts +2 -0
  27. package/dist/commands/parallel.d.ts.map +1 -0
  28. package/dist/commands/parallel.js +26 -0
  29. package/dist/commands/parallel.js.map +1 -0
  30. package/dist/commands/pi.d.ts +3 -0
  31. package/dist/commands/pi.d.ts.map +1 -0
  32. package/dist/commands/pi.js +94 -0
  33. package/dist/commands/pi.js.map +1 -0
  34. package/dist/commands/session.d.ts +2 -0
  35. package/dist/commands/session.d.ts.map +1 -0
  36. package/dist/commands/session.js +169 -0
  37. package/dist/commands/session.js.map +1 -0
  38. package/dist/commands/task.d.ts +3 -0
  39. package/dist/commands/task.d.ts.map +1 -0
  40. package/dist/commands/task.js +1026 -0
  41. package/dist/commands/task.js.map +1 -0
  42. package/dist/commands/update.d.ts +3 -1
  43. package/dist/commands/update.d.ts.map +1 -1
  44. package/dist/commands/update.js +130 -47
  45. package/dist/commands/update.js.map +1 -1
  46. package/dist/commands/workflow.d.ts.map +1 -1
  47. package/dist/commands/workflow.js +1 -2
  48. package/dist/commands/workflow.js.map +1 -1
  49. package/dist/configurators/index.d.ts +5 -51
  50. package/dist/configurators/index.d.ts.map +1 -1
  51. package/dist/configurators/index.js +9 -140
  52. package/dist/configurators/index.js.map +1 -1
  53. package/dist/configurators/shared.d.ts +7 -66
  54. package/dist/configurators/shared.d.ts.map +1 -1
  55. package/dist/configurators/shared.js +17 -262
  56. package/dist/configurators/shared.js.map +1 -1
  57. package/dist/configurators/workflow.d.ts +5 -6
  58. package/dist/configurators/workflow.d.ts.map +1 -1
  59. package/dist/configurators/workflow.js +11 -39
  60. package/dist/configurators/workflow.js.map +1 -1
  61. package/dist/constants/paths.d.ts +1 -5
  62. package/dist/constants/paths.d.ts.map +1 -1
  63. package/dist/constants/paths.js +1 -5
  64. package/dist/constants/paths.js.map +1 -1
  65. package/dist/core/compat/environment.d.ts +43 -0
  66. package/dist/core/compat/environment.d.ts.map +1 -0
  67. package/dist/core/compat/environment.js +91 -0
  68. package/dist/core/compat/environment.js.map +1 -0
  69. package/dist/core/compat/index.d.ts +2 -0
  70. package/dist/core/compat/index.d.ts.map +1 -0
  71. package/dist/core/compat/index.js +2 -0
  72. package/dist/core/compat/index.js.map +1 -0
  73. package/dist/core/index.d.ts +4 -0
  74. package/dist/core/index.d.ts.map +1 -0
  75. package/dist/core/index.js +6 -0
  76. package/dist/core/index.js.map +1 -0
  77. package/dist/core/pactile/capability.d.ts +65 -0
  78. package/dist/core/pactile/capability.d.ts.map +1 -0
  79. package/dist/core/pactile/capability.js +199 -0
  80. package/dist/core/pactile/capability.js.map +1 -0
  81. package/dist/core/pactile/index.d.ts +15 -0
  82. package/dist/core/pactile/index.d.ts.map +1 -0
  83. package/dist/core/pactile/index.js +13 -0
  84. package/dist/core/pactile/index.js.map +1 -0
  85. package/dist/core/pactile/lifecycle.d.ts +106 -0
  86. package/dist/core/pactile/lifecycle.d.ts.map +1 -0
  87. package/dist/core/pactile/lifecycle.js +607 -0
  88. package/dist/core/pactile/lifecycle.js.map +1 -0
  89. package/dist/core/pactile/middleware/index.d.ts +3 -0
  90. package/dist/core/pactile/middleware/index.d.ts.map +1 -0
  91. package/dist/core/pactile/middleware/index.js +2 -0
  92. package/dist/core/pactile/middleware/index.js.map +1 -0
  93. package/dist/core/pactile/middleware/redaction.d.ts +4 -0
  94. package/dist/core/pactile/middleware/redaction.d.ts.map +1 -0
  95. package/dist/core/pactile/middleware/redaction.js +34 -0
  96. package/dist/core/pactile/middleware/redaction.js.map +1 -0
  97. package/dist/core/pactile/middleware/resolver.d.ts +62 -0
  98. package/dist/core/pactile/middleware/resolver.d.ts.map +1 -0
  99. package/dist/core/pactile/middleware/resolver.js +803 -0
  100. package/dist/core/pactile/middleware/resolver.js.map +1 -0
  101. package/dist/core/pactile/projection.d.ts +81 -0
  102. package/dist/core/pactile/projection.d.ts.map +1 -0
  103. package/dist/core/pactile/projection.js +399 -0
  104. package/dist/core/pactile/projection.js.map +1 -0
  105. package/dist/core/pactile/provider.d.ts +81 -0
  106. package/dist/core/pactile/provider.d.ts.map +1 -0
  107. package/dist/core/pactile/provider.js +313 -0
  108. package/dist/core/pactile/provider.js.map +1 -0
  109. package/dist/core/pactile/runtime.d.ts +56 -0
  110. package/dist/core/pactile/runtime.d.ts.map +1 -0
  111. package/dist/core/pactile/runtime.js +176 -0
  112. package/dist/core/pactile/runtime.js.map +1 -0
  113. package/dist/core/pactile/tile-compiler-types.d.ts +32 -0
  114. package/dist/core/pactile/tile-compiler-types.d.ts.map +1 -0
  115. package/dist/core/pactile/tile-compiler-types.js +2 -0
  116. package/dist/core/pactile/tile-compiler-types.js.map +1 -0
  117. package/dist/core/pactile/tile.d.ts +71 -0
  118. package/dist/core/pactile/tile.d.ts.map +1 -0
  119. package/dist/core/pactile/tile.js +228 -0
  120. package/dist/core/pactile/tile.js.map +1 -0
  121. package/dist/core/pactile/trace-runtime/index.d.ts +38 -0
  122. package/dist/core/pactile/trace-runtime/index.d.ts.map +1 -0
  123. package/dist/core/pactile/trace-runtime/index.js +292 -0
  124. package/dist/core/pactile/trace-runtime/index.js.map +1 -0
  125. package/dist/core/pactile/trace.d.ts +42 -0
  126. package/dist/core/pactile/trace.d.ts.map +1 -0
  127. package/dist/core/pactile/trace.js +221 -0
  128. package/dist/core/pactile/trace.js.map +1 -0
  129. package/dist/core/pactile/validation.d.ts +91 -0
  130. package/dist/core/pactile/validation.d.ts.map +1 -0
  131. package/dist/core/pactile/validation.js +301 -0
  132. package/dist/core/pactile/validation.js.map +1 -0
  133. package/dist/core/task/adapter-middleware.d.ts +122 -0
  134. package/dist/core/task/adapter-middleware.d.ts.map +1 -0
  135. package/dist/core/task/adapter-middleware.js +476 -0
  136. package/dist/core/task/adapter-middleware.js.map +1 -0
  137. package/dist/core/task/compat.d.ts +7 -0
  138. package/dist/core/task/compat.d.ts.map +1 -0
  139. package/dist/core/task/compat.js +2 -0
  140. package/dist/core/task/compat.js.map +1 -0
  141. package/dist/core/task/contract-migrate.d.ts +29 -0
  142. package/dist/core/task/contract-migrate.d.ts.map +1 -0
  143. package/dist/core/task/contract-migrate.js +207 -0
  144. package/dist/core/task/contract-migrate.js.map +1 -0
  145. package/dist/core/task/full-quality.d.ts +89 -0
  146. package/dist/core/task/full-quality.d.ts.map +1 -0
  147. package/dist/core/task/full-quality.js +379 -0
  148. package/dist/core/task/full-quality.js.map +1 -0
  149. package/dist/core/task/index.d.ts +32 -0
  150. package/dist/core/task/index.d.ts.map +1 -0
  151. package/dist/core/task/index.js +20 -0
  152. package/dist/core/task/index.js.map +1 -0
  153. package/dist/core/task/kernel-cli.d.ts +51 -0
  154. package/dist/core/task/kernel-cli.d.ts.map +1 -0
  155. package/dist/core/task/kernel-cli.js +301 -0
  156. package/dist/core/task/kernel-cli.js.map +1 -0
  157. package/dist/core/task/kernel-contract.d.ts +164 -0
  158. package/dist/core/task/kernel-contract.d.ts.map +1 -0
  159. package/dist/core/task/kernel-contract.js +475 -0
  160. package/dist/core/task/kernel-contract.js.map +1 -0
  161. package/dist/core/task/kernel-store.d.ts +130 -0
  162. package/dist/core/task/kernel-store.d.ts.map +1 -0
  163. package/dist/core/task/kernel-store.js +905 -0
  164. package/dist/core/task/kernel-store.js.map +1 -0
  165. package/dist/core/task/kernel-surface.d.ts +70 -0
  166. package/dist/core/task/kernel-surface.d.ts.map +1 -0
  167. package/dist/core/task/kernel-surface.js +121 -0
  168. package/dist/core/task/kernel-surface.js.map +1 -0
  169. package/dist/core/task/lite-context-pack.d.ts +71 -0
  170. package/dist/core/task/lite-context-pack.d.ts.map +1 -0
  171. package/dist/core/task/lite-context-pack.js +175 -0
  172. package/dist/core/task/lite-context-pack.js.map +1 -0
  173. package/dist/core/task/ondemand-topology.d.ts +108 -0
  174. package/dist/core/task/ondemand-topology.d.ts.map +1 -0
  175. package/dist/core/task/ondemand-topology.js +456 -0
  176. package/dist/core/task/ondemand-topology.js.map +1 -0
  177. package/dist/core/task/p36-artifact-migrate.d.ts +58 -0
  178. package/dist/core/task/p36-artifact-migrate.d.ts.map +1 -0
  179. package/dist/core/task/p36-artifact-migrate.js +293 -0
  180. package/dist/core/task/p36-artifact-migrate.js.map +1 -0
  181. package/dist/core/task/p36-wave-c.d.ts +39 -0
  182. package/dist/core/task/p36-wave-c.d.ts.map +1 -0
  183. package/dist/core/task/p36-wave-c.js +100 -0
  184. package/dist/core/task/p36-wave-c.js.map +1 -0
  185. package/dist/core/task/paths.d.ts +37 -0
  186. package/dist/core/task/paths.d.ts.map +1 -0
  187. package/dist/core/task/paths.js +49 -0
  188. package/dist/core/task/paths.js.map +1 -0
  189. package/dist/core/task/phase.d.ts +27 -0
  190. package/dist/core/task/phase.d.ts.map +1 -0
  191. package/dist/core/task/phase.js +24 -0
  192. package/dist/core/task/phase.js.map +1 -0
  193. package/dist/core/task/records.d.ts +48 -0
  194. package/dist/core/task/records.d.ts.map +1 -0
  195. package/dist/core/task/records.js +100 -0
  196. package/dist/core/task/records.js.map +1 -0
  197. package/dist/core/task/schema.d.ts +77 -0
  198. package/dist/core/task/schema.d.ts.map +1 -0
  199. package/dist/core/task/schema.js +220 -0
  200. package/dist/core/task/schema.js.map +1 -0
  201. package/dist/core/testing/index.d.ts +2 -0
  202. package/dist/core/testing/index.d.ts.map +1 -0
  203. package/dist/core/testing/index.js +4 -0
  204. package/dist/core/testing/index.js.map +1 -0
  205. package/dist/migrations/manifests/0.1.0.json +9 -9
  206. package/dist/migrations/manifests/0.1.1.json +9 -9
  207. package/dist/migrations/manifests/0.1.2.json +9 -9
  208. package/dist/migrations/manifests/0.1.3.json +9 -9
  209. package/dist/migrations/manifests/0.1.4.json +9 -9
  210. package/dist/migrations/manifests/0.2.1.json +9 -9
  211. package/dist/migrations/manifests/0.2.10.json +374 -374
  212. package/dist/migrations/manifests/0.2.2.json +8 -8
  213. package/dist/migrations/manifests/0.2.3.json +9 -9
  214. package/dist/migrations/manifests/0.2.4.json +8 -8
  215. package/dist/migrations/manifests/0.2.5.json +8 -8
  216. package/dist/migrations/manifests/0.2.6.json +8 -8
  217. package/dist/migrations/manifests/0.2.7.json +8 -8
  218. package/dist/migrations/manifests/0.2.8.json +9 -9
  219. package/dist/migrations/manifests/0.2.9.json +9 -9
  220. package/dist/migrations/manifests/0.3.0.json +89 -89
  221. package/dist/migrations/manifests/0.3.1.json +32 -32
  222. package/dist/migrations/manifests/0.3.2.json +16 -16
  223. package/dist/migrations/manifests/0.3.3.json +9 -9
  224. package/dist/migrations/manifests/0.3.4.json +9 -9
  225. package/dist/migrations/manifests/0.3.5.json +9 -9
  226. package/dist/migrations/manifests/0.3.6.json +9 -9
  227. package/dist/migrations/manifests/0.4.0.json +9 -9
  228. package/dist/migrations/manifests/0.4.1.json +9 -9
  229. package/dist/migrations/manifests/0.4.2.json +9 -9
  230. package/dist/migrations/manifests/0.4.3.json +9 -9
  231. package/dist/migrations/manifests/0.5.0-beta.0.json +9 -9
  232. package/dist/migrations/manifests/0.5.0-beta.1.json +9 -9
  233. package/dist/migrations/manifests/0.5.0-beta.2.json +8 -8
  234. package/dist/migrations/manifests/0.5.0-beta.3.json +8 -8
  235. package/dist/migrations/manifests/0.5.0-beta.4.json +9 -9
  236. package/dist/migrations/manifests/0.5.0-beta.5.json +9 -9
  237. package/dist/migrations/manifests/0.5.0.json +9 -0
  238. package/dist/migrations/manifests/0.6.0-beta.1.json +35 -0
  239. package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
  240. package/dist/migrations/manifests/0.6.0.json +9 -0
  241. package/dist/pactile/adapters/codex/index.js +1 -1
  242. package/dist/pactile/adapters/codex/index.js.map +1 -1
  243. package/dist/pactile/adapters/index.d.ts +0 -1
  244. package/dist/pactile/adapters/index.d.ts.map +1 -1
  245. package/dist/pactile/adapters/index.js +0 -1
  246. package/dist/pactile/adapters/index.js.map +1 -1
  247. package/dist/pactile/adoption/bindings.d.ts +1 -1
  248. package/dist/pactile/adoption/bindings.d.ts.map +1 -1
  249. package/dist/pactile/adoption/bindings.js +1 -1
  250. package/dist/pactile/adoption/bindings.js.map +1 -1
  251. package/dist/pactile/adoption/inventory.d.ts +1 -1
  252. package/dist/pactile/adoption/inventory.d.ts.map +1 -1
  253. package/dist/pactile/adoption/inventory.js +1 -1
  254. package/dist/pactile/adoption/inventory.js.map +1 -1
  255. package/dist/pactile/adoption/safety.js +1 -1
  256. package/dist/pactile/adoption/safety.js.map +1 -1
  257. package/dist/pactile/adoption/workflow.d.ts +1 -1
  258. package/dist/pactile/adoption/workflow.d.ts.map +1 -1
  259. package/dist/pactile/adoption/workflow.js +1 -1
  260. package/dist/pactile/adoption/workflow.js.map +1 -1
  261. package/dist/pactile/codex/bridge.d.ts +71 -0
  262. package/dist/pactile/codex/bridge.d.ts.map +1 -0
  263. package/dist/pactile/codex/bridge.js +271 -0
  264. package/dist/pactile/codex/bridge.js.map +1 -0
  265. package/dist/pactile/compat/init-context.js +1 -1
  266. package/dist/pactile/compat/init-context.js.map +1 -1
  267. package/dist/pactile/compat/node-entry-migration.d.ts +3 -0
  268. package/dist/pactile/compat/node-entry-migration.d.ts.map +1 -0
  269. package/dist/pactile/compat/node-entry-migration.js +25 -0
  270. package/dist/pactile/compat/node-entry-migration.js.map +1 -0
  271. package/dist/pactile/exit/receipt.js +1 -1
  272. package/dist/pactile/exit/receipt.js.map +1 -1
  273. package/dist/pactile/exit/service.d.ts +1 -1
  274. package/dist/pactile/exit/service.d.ts.map +1 -1
  275. package/dist/pactile/exit/service.js +1 -3
  276. package/dist/pactile/exit/service.js.map +1 -1
  277. package/dist/pactile/lifecycle/command-runner.d.ts +1 -1
  278. package/dist/pactile/lifecycle/command-runner.d.ts.map +1 -1
  279. package/dist/pactile/lifecycle/command-runner.js +1 -3
  280. package/dist/pactile/lifecycle/command-runner.js.map +1 -1
  281. package/dist/pactile/lifecycle/default-adapters.d.ts.map +1 -1
  282. package/dist/pactile/lifecycle/default-adapters.js +8 -32
  283. package/dist/pactile/lifecycle/default-adapters.js.map +1 -1
  284. package/dist/pactile/lifecycle/orchestrator.d.ts +1 -1
  285. package/dist/pactile/lifecycle/orchestrator.d.ts.map +1 -1
  286. package/dist/pactile/lifecycle/orchestrator.js +1 -1
  287. package/dist/pactile/lifecycle/orchestrator.js.map +1 -1
  288. package/dist/pactile/lifecycle/project-files.d.ts.map +1 -1
  289. package/dist/pactile/lifecycle/project-files.js +4 -1
  290. package/dist/pactile/lifecycle/project-files.js.map +1 -1
  291. package/dist/pactile/middleware/manifest-loader.d.ts +1 -1
  292. package/dist/pactile/middleware/manifest-loader.d.ts.map +1 -1
  293. package/dist/pactile/middleware/manifest-loader.js +1 -1
  294. package/dist/pactile/middleware/manifest-loader.js.map +1 -1
  295. package/dist/pactile/migration/transaction.d.ts +1 -1
  296. package/dist/pactile/migration/transaction.d.ts.map +1 -1
  297. package/dist/pactile/migration/transaction.js +1 -1
  298. package/dist/pactile/migration/transaction.js.map +1 -1
  299. package/dist/pactile/parallel/batch.d.ts +41 -0
  300. package/dist/pactile/parallel/batch.d.ts.map +1 -0
  301. package/dist/pactile/parallel/batch.js +190 -0
  302. package/dist/pactile/parallel/batch.js.map +1 -0
  303. package/dist/pactile/parallel/policy.d.ts +18 -0
  304. package/dist/pactile/parallel/policy.d.ts.map +1 -0
  305. package/dist/pactile/parallel/policy.js +174 -0
  306. package/dist/pactile/parallel/policy.js.map +1 -0
  307. package/dist/pactile/pi/bridge.d.ts +51 -0
  308. package/dist/pactile/pi/bridge.d.ts.map +1 -0
  309. package/dist/pactile/pi/bridge.js +353 -0
  310. package/dist/pactile/pi/bridge.js.map +1 -0
  311. package/dist/pactile/pi/rpc.d.ts +41 -0
  312. package/dist/pactile/pi/rpc.d.ts.map +1 -0
  313. package/dist/pactile/pi/rpc.js +219 -0
  314. package/dist/pactile/pi/rpc.js.map +1 -0
  315. package/dist/pactile/projection/planner.d.ts +1 -1
  316. package/dist/pactile/projection/planner.d.ts.map +1 -1
  317. package/dist/pactile/projection/planner.js +1 -1
  318. package/dist/pactile/projection/planner.js.map +1 -1
  319. package/dist/pactile/projection/shared/index.js +1 -1
  320. package/dist/pactile/projection/shared/index.js.map +1 -1
  321. package/dist/pactile/projection/store.js +1 -1
  322. package/dist/pactile/projection/store.js.map +1 -1
  323. package/dist/pactile/providers/probes.d.ts +2 -2
  324. package/dist/pactile/providers/probes.d.ts.map +1 -1
  325. package/dist/pactile/providers/probes.js +0 -6
  326. package/dist/pactile/providers/probes.js.map +1 -1
  327. package/dist/pactile/registry.d.ts +1 -8
  328. package/dist/pactile/registry.d.ts.map +1 -1
  329. package/dist/pactile/registry.js +8 -25
  330. package/dist/pactile/registry.js.map +1 -1
  331. package/dist/pactile/retrieval/envelope.d.ts +19 -0
  332. package/dist/pactile/retrieval/envelope.d.ts.map +1 -0
  333. package/dist/pactile/retrieval/envelope.js +115 -0
  334. package/dist/pactile/retrieval/envelope.js.map +1 -0
  335. package/dist/pactile/retrieval/evidence.js +1 -1
  336. package/dist/pactile/retrieval/evidence.js.map +1 -1
  337. package/dist/pactile/retrieval/pack.d.ts +9 -0
  338. package/dist/pactile/retrieval/pack.d.ts.map +1 -0
  339. package/dist/pactile/retrieval/pack.js +300 -0
  340. package/dist/pactile/retrieval/pack.js.map +1 -0
  341. package/dist/pactile/retrieval/planner.d.ts +1 -1
  342. package/dist/pactile/retrieval/planner.d.ts.map +1 -1
  343. package/dist/pactile/retrieval/planner.js +1 -1
  344. package/dist/pactile/retrieval/planner.js.map +1 -1
  345. package/dist/pactile/retrieval/types.d.ts +1 -1
  346. package/dist/pactile/retrieval/types.d.ts.map +1 -1
  347. package/dist/pactile/runtime/json-api.d.ts +1 -1
  348. package/dist/pactile/runtime/json-api.js +1 -1
  349. package/dist/pactile/runtime/paths.js +1 -1
  350. package/dist/pactile/runtime/paths.js.map +1 -1
  351. package/dist/pactile/runtime/stores.d.ts +1 -1
  352. package/dist/pactile/runtime/stores.d.ts.map +1 -1
  353. package/dist/pactile/runtime/stores.js +1 -1
  354. package/dist/pactile/runtime/stores.js.map +1 -1
  355. package/dist/pactile/runtime/unicode-nfc-data.d.ts +1 -1
  356. package/dist/pactile/runtime/unicode-nfc-data.js +1 -1
  357. package/dist/pactile/task/config.d.ts +9 -0
  358. package/dist/pactile/task/config.d.ts.map +1 -0
  359. package/dist/pactile/task/config.js +103 -0
  360. package/dist/pactile/task/config.js.map +1 -0
  361. package/dist/pactile/task/context.d.ts +19 -0
  362. package/dist/pactile/task/context.d.ts.map +1 -0
  363. package/dist/pactile/task/context.js +117 -0
  364. package/dist/pactile/task/context.js.map +1 -0
  365. package/dist/pactile/task/guards.d.ts +21 -0
  366. package/dist/pactile/task/guards.d.ts.map +1 -0
  367. package/dist/pactile/task/guards.js +232 -0
  368. package/dist/pactile/task/guards.js.map +1 -0
  369. package/dist/pactile/task/scaffold.d.ts +6 -0
  370. package/dist/pactile/task/scaffold.d.ts.map +1 -0
  371. package/dist/pactile/task/scaffold.js +57 -0
  372. package/dist/pactile/task/scaffold.js.map +1 -0
  373. package/dist/pactile/task/session-memory.d.ts +2 -0
  374. package/dist/pactile/task/session-memory.d.ts.map +1 -0
  375. package/dist/pactile/task/session-memory.js +123 -0
  376. package/dist/pactile/task/session-memory.js.map +1 -0
  377. package/dist/pactile/task/session-pack.d.ts +3 -0
  378. package/dist/pactile/task/session-pack.d.ts.map +1 -0
  379. package/dist/pactile/task/session-pack.js +139 -0
  380. package/dist/pactile/task/session-pack.js.map +1 -0
  381. package/dist/pactile/task/session.d.ts +13 -0
  382. package/dist/pactile/task/session.d.ts.map +1 -0
  383. package/dist/pactile/task/session.js +105 -0
  384. package/dist/pactile/task/session.js.map +1 -0
  385. package/dist/pactile/task/strategy.d.ts +24 -0
  386. package/dist/pactile/task/strategy.d.ts.map +1 -0
  387. package/dist/pactile/task/strategy.js +136 -0
  388. package/dist/pactile/task/strategy.js.map +1 -0
  389. package/dist/pactile/task/task-map.d.ts +35 -0
  390. package/dist/pactile/task/task-map.d.ts.map +1 -0
  391. package/dist/pactile/task/task-map.js +217 -0
  392. package/dist/pactile/task/task-map.js.map +1 -0
  393. package/dist/pactile/task/workflow-phase.d.ts +3 -0
  394. package/dist/pactile/task/workflow-phase.d.ts.map +1 -0
  395. package/dist/pactile/task/workflow-phase.js +56 -0
  396. package/dist/pactile/task/workflow-phase.js.map +1 -0
  397. package/dist/pactile/tiles/catalog.d.ts +1 -1
  398. package/dist/pactile/tiles/catalog.d.ts.map +1 -1
  399. package/dist/pactile/tiles/catalog.js +1 -1
  400. package/dist/pactile/tiles/catalog.js.map +1 -1
  401. package/dist/pactile/tiles/compiler.d.ts +1 -1
  402. package/dist/pactile/tiles/compiler.d.ts.map +1 -1
  403. package/dist/pactile/tiles/compiler.js +1 -1
  404. package/dist/pactile/tiles/compiler.js.map +1 -1
  405. package/dist/pactile/tiles/content/ondemand/index.d.ts +2 -2
  406. package/dist/pactile/tiles/content/ondemand/index.d.ts.map +1 -1
  407. package/dist/pactile/tiles/content/ondemand/index.js +2 -16
  408. package/dist/pactile/tiles/content/ondemand/index.js.map +1 -1
  409. package/dist/pactile/tiles/loader.d.ts +1 -1
  410. package/dist/pactile/tiles/loader.d.ts.map +1 -1
  411. package/dist/pactile/tiles/loader.js +1 -1
  412. package/dist/pactile/tiles/loader.js.map +1 -1
  413. package/dist/templates/common/bundled-skills/pactile-check/SKILL.md +161 -161
  414. package/dist/templates/common/bundled-skills/pactile-check/references/fowler-12-smells.md +28 -28
  415. package/dist/templates/common/bundled-skills/pactile-handoff/SKILL.md +117 -117
  416. package/dist/templates/common/bundled-skills/pactile-meta/SKILL.md +75 -75
  417. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/add-project-local-conventions.md +83 -83
  418. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-agents.md +5 -47
  419. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-context-loading.md +79 -84
  420. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-hooks.md +5 -57
  421. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-skills-or-commands.md +7 -77
  422. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-spec-structure.md +83 -83
  423. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-task-lifecycle.md +82 -88
  424. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-workflow.md +65 -65
  425. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/overview.md +12 -55
  426. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/context-injection.md +68 -68
  427. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/generated-files.md +7 -83
  428. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/overview.md +7 -51
  429. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/spec-system.md +102 -102
  430. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/task-system.md +138 -133
  431. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/workflow.md +75 -75
  432. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/workspace-memory.md +71 -71
  433. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/agents.md +7 -69
  434. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/hooks-and-settings.md +7 -59
  435. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/overview.md +5 -45
  436. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/platform-map.md +9 -45
  437. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/skills-and-commands.md +7 -108
  438. package/dist/templates/common/bundled-skills/pactile-micro-grill/SKILL.md +68 -68
  439. package/dist/templates/common/bundled-skills/pactile-skill-creator/SKILL.md +47 -47
  440. package/dist/templates/common/bundled-skills/pactile-skill-creator/references/authoring-rules.md +170 -170
  441. package/dist/templates/common/bundled-skills/pactile-skill-creator/references/general-authoring.md +189 -189
  442. package/dist/templates/common/bundled-skills/pactile-skill-creator/references/pactile-skill-locations.md +11 -52
  443. package/dist/templates/common/bundled-skills/pactile-skill-creator/references/review-checklist.md +52 -52
  444. package/dist/templates/common/bundled-skills/pactile-spec-bootstrap/SKILL.md +41 -41
  445. package/dist/templates/common/bundled-skills/pactile-spec-bootstrap/references/mcp-setup.md +18 -90
  446. package/dist/templates/common/bundled-skills/pactile-spec-bootstrap/references/repository-analysis.md +41 -59
  447. package/dist/templates/common/bundled-skills/pactile-spec-bootstrap/references/spec-task-planning.md +61 -61
  448. package/dist/templates/common/bundled-skills/pactile-spec-bootstrap/references/spec-writing.md +70 -70
  449. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +393 -393
  450. package/dist/templates/common/bundled-skills/smart-search-cli/agents/openai.yaml +3 -3
  451. package/dist/templates/common/bundled-skills/smart-search-cli/examples/batch-search.md +98 -98
  452. package/dist/templates/common/bundled-skills/smart-search-cli/examples/evidence-gathering.md +89 -89
  453. package/dist/templates/common/bundled-skills/smart-search-cli/references/cli-contract.md +323 -323
  454. package/dist/templates/common/commands/continue.md +60 -62
  455. package/dist/templates/common/commands/finish-work.md +84 -82
  456. package/dist/templates/common/commands/start.md +66 -66
  457. package/dist/templates/common/index.d.ts +0 -20
  458. package/dist/templates/common/index.d.ts.map +1 -1
  459. package/dist/templates/common/index.js +0 -16
  460. package/dist/templates/common/index.js.map +1 -1
  461. package/dist/templates/common/skills/before-dev.md +35 -35
  462. package/dist/templates/common/skills/brainstorm.md +204 -204
  463. package/dist/templates/common/skills/break-loop.md +125 -125
  464. package/dist/templates/common/skills/update-spec.md +363 -363
  465. package/dist/templates/extract.d.ts +1 -8
  466. package/dist/templates/extract.d.ts.map +1 -1
  467. package/dist/templates/extract.js +0 -31
  468. package/dist/templates/extract.js.map +1 -1
  469. package/dist/templates/markdown/agents.md +14 -14
  470. package/dist/templates/markdown/framework/artifact-locale-guide.md.txt +93 -93
  471. package/dist/templates/markdown/framework/codex-worker-dispatch.md.txt +9 -0
  472. package/dist/templates/markdown/framework/dogfood-only-surfaces.md.txt +7 -28
  473. package/dist/templates/markdown/framework/execution-strategy.md.txt +14 -45
  474. package/dist/templates/markdown/framework/index.md.txt +20 -31
  475. package/dist/templates/markdown/framework/injection-budget-guide.md.txt +7 -111
  476. package/dist/templates/markdown/framework/middleware-protocol.md.txt +139 -238
  477. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +116 -116
  478. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +105 -105
  479. package/dist/templates/markdown/framework/release-boundary.md.txt +30 -30
  480. package/dist/templates/markdown/framework/retrieval-daily-guide.md.txt +9 -199
  481. package/dist/templates/markdown/framework/upgrade.md.txt +15 -15
  482. package/dist/templates/markdown/framework/verification-strength-guide.md.txt +185 -185
  483. package/dist/templates/markdown/gitignore.txt +15 -15
  484. package/dist/templates/markdown/index.d.ts +1 -5
  485. package/dist/templates/markdown/index.d.ts.map +1 -1
  486. package/dist/templates/markdown/index.js +3 -23
  487. package/dist/templates/markdown/index.js.map +1 -1
  488. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -51
  489. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -54
  490. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -51
  491. package/dist/templates/markdown/spec/backend/index.md.txt +38 -38
  492. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -51
  493. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -51
  494. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -59
  495. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -54
  496. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -51
  497. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -39
  498. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -51
  499. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -51
  500. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -51
  501. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +174 -174
  502. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +162 -162
  503. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +17 -634
  504. package/dist/templates/markdown/spec/guides/debug-loop-guide.md.txt +227 -227
  505. package/dist/templates/markdown/spec/guides/durable-learning-decision-guide.md.txt +75 -75
  506. package/dist/templates/markdown/spec/guides/e2e-walkthrough-guide.md.txt +88 -93
  507. package/dist/templates/markdown/spec/guides/index.md.txt +131 -131
  508. package/dist/templates/markdown/spec/guides/prototype-guide.md.txt +137 -139
  509. package/dist/templates/markdown/spec/guides/test-discipline-guide.md.txt +179 -179
  510. package/dist/templates/markdown/workspace-index.md +122 -125
  511. package/dist/templates/markdown/worktree.yaml.txt +58 -58
  512. package/dist/templates/pactile/CONTEXT.md +101 -113
  513. package/dist/templates/pactile/config/execution-strategy-rules.json +30 -31
  514. package/dist/templates/pactile/config.yaml +111 -130
  515. package/dist/templates/pactile/docs/adr/README.md +21 -21
  516. package/dist/templates/pactile/gitignore.txt +35 -35
  517. package/dist/templates/pactile/index.d.ts +3 -127
  518. package/dist/templates/pactile/index.d.ts.map +1 -1
  519. package/dist/templates/pactile/index.js +13 -298
  520. package/dist/templates/pactile/index.js.map +1 -1
  521. package/dist/templates/pactile/modules/approval-personal/contract.md +43 -43
  522. package/dist/templates/pactile/modules/close-basic/contract.md +37 -37
  523. package/dist/templates/pactile/modules/context-progressive/contract.md +44 -44
  524. package/dist/templates/pactile/modules/debug-recovery/contract.md +44 -44
  525. package/dist/templates/pactile/modules/define-basic/contract.md +39 -39
  526. package/dist/templates/pactile/modules/define-extended/contract.md +45 -45
  527. package/dist/templates/pactile/modules/execute-agent/contract.md +38 -38
  528. package/dist/templates/pactile/modules/independent-check/contract.md +35 -35
  529. package/dist/templates/pactile/modules/index.json +127 -133
  530. package/dist/templates/pactile/modules/intake-basic/contract.md +34 -34
  531. package/dist/templates/pactile/modules/observability-local/contract.md +31 -31
  532. package/dist/templates/pactile/modules/parent-child/contract.md +45 -45
  533. package/dist/templates/pactile/modules/personal-memory/contract.md +55 -55
  534. package/dist/templates/pactile/modules/retention-storage/contract.md +43 -43
  535. package/dist/templates/pactile/modules/retrieval-extended/contract.md +78 -77
  536. package/dist/templates/pactile/modules/session-transfer/contract.md +41 -41
  537. package/dist/templates/pactile/modules/spec-learning/contract.md +50 -50
  538. package/dist/templates/pactile/modules/vcs-integration/contract.md +46 -46
  539. package/dist/templates/pactile/modules/verify-basic/contract.md +38 -38
  540. package/dist/templates/pactile/modules/worker-orchestration/contract.md +47 -47
  541. package/dist/templates/pactile/scripts/retrieval_probe_matrix_template.json +43 -43
  542. package/dist/templates/pactile/tasks/locale/en/default-prd.md +27 -27
  543. package/dist/templates/pactile/tasks/locale/zh/default-prd.md +27 -27
  544. package/dist/templates/pactile/tasks/templates/release-execution/design.md +60 -60
  545. package/dist/templates/pactile/tasks/templates/release-execution/handoff-template.md +28 -28
  546. package/dist/templates/pactile/tasks/templates/release-execution/implement.md +28 -28
  547. package/dist/templates/pactile/tasks/templates/release-execution/prd.md +30 -30
  548. package/dist/templates/pactile/tasks/templates/release-readiness/design.md +49 -49
  549. package/dist/templates/pactile/tasks/templates/release-readiness/handoff-template.md +38 -38
  550. package/dist/templates/pactile/tasks/templates/release-readiness/implement.md +28 -28
  551. package/dist/templates/pactile/tasks/templates/release-readiness/prd.md +30 -30
  552. package/dist/templates/pactile/workflow.md +65 -64
  553. package/dist/types/ai-tools.d.ts +12 -13
  554. package/dist/types/ai-tools.d.ts.map +1 -1
  555. package/dist/types/ai-tools.js +15 -14
  556. package/dist/types/ai-tools.js.map +1 -1
  557. package/dist/utils/codebase-retrieval-router.d.ts +1 -1
  558. package/dist/utils/codebase-retrieval-router.d.ts.map +1 -1
  559. package/dist/utils/cwd-guard.js +1 -1
  560. package/dist/utils/cwd-guard.js.map +1 -1
  561. package/dist/utils/developer.d.ts +5 -0
  562. package/dist/utils/developer.d.ts.map +1 -0
  563. package/dist/utils/developer.js +38 -0
  564. package/dist/utils/developer.js.map +1 -0
  565. package/dist/utils/git-root.d.ts +3 -0
  566. package/dist/utils/git-root.d.ts.map +1 -0
  567. package/dist/utils/git-root.js +24 -0
  568. package/dist/utils/git-root.js.map +1 -0
  569. package/dist/utils/local-date.d.ts +3 -0
  570. package/dist/utils/local-date.d.ts.map +1 -0
  571. package/dist/utils/local-date.js +8 -0
  572. package/dist/utils/local-date.js.map +1 -0
  573. package/dist/utils/manifest-prune.d.ts +5 -4
  574. package/dist/utils/manifest-prune.d.ts.map +1 -1
  575. package/dist/utils/manifest-prune.js +11 -21
  576. package/dist/utils/manifest-prune.js.map +1 -1
  577. package/dist/utils/p36-upgrade.d.ts +1 -1
  578. package/dist/utils/p36-upgrade.d.ts.map +1 -1
  579. package/dist/utils/p36-upgrade.js +1 -1
  580. package/dist/utils/p36-upgrade.js.map +1 -1
  581. package/dist/utils/post-update-smoke.d.ts +1 -4
  582. package/dist/utils/post-update-smoke.d.ts.map +1 -1
  583. package/dist/utils/post-update-smoke.js +13 -25
  584. package/dist/utils/post-update-smoke.js.map +1 -1
  585. package/dist/utils/project-capabilities.d.ts +2 -17
  586. package/dist/utils/project-capabilities.d.ts.map +1 -1
  587. package/dist/utils/project-capabilities.js +14 -119
  588. package/dist/utils/project-capabilities.js.map +1 -1
  589. package/dist/utils/readiness.d.ts +14 -0
  590. package/dist/utils/readiness.d.ts.map +1 -1
  591. package/dist/utils/readiness.js +61 -30
  592. package/dist/utils/readiness.js.map +1 -1
  593. package/dist/utils/retrieval-execution-telemetry.d.ts +1 -1
  594. package/dist/utils/retrieval-execution-telemetry.d.ts.map +1 -1
  595. package/dist/utils/retrieval-result-ranking.d.ts +1 -1
  596. package/dist/utils/retrieval-result-ranking.d.ts.map +1 -1
  597. package/dist/utils/retrieval-tool-classification.d.ts +1 -1
  598. package/dist/utils/retrieval-tool-classification.d.ts.map +1 -1
  599. package/dist/utils/task-json.d.ts +3 -3
  600. package/dist/utils/task-json.d.ts.map +1 -1
  601. package/dist/utils/task-json.js +3 -3
  602. package/dist/utils/task-json.js.map +1 -1
  603. package/dist/utils/template-hash.d.ts +4 -0
  604. package/dist/utils/template-hash.d.ts.map +1 -1
  605. package/dist/utils/template-hash.js +1 -1
  606. package/dist/utils/template-hash.js.map +1 -1
  607. package/dist/utils/update-rollout-report.d.ts +9 -0
  608. package/dist/utils/update-rollout-report.d.ts.map +1 -1
  609. package/dist/utils/update-rollout-report.js +14 -1
  610. package/dist/utils/update-rollout-report.js.map +1 -1
  611. package/package.json +22 -11
  612. package/scripts/postinstall.js +6 -6
  613. package/dist/commands/channel/adapters/claude.d.ts +0 -29
  614. package/dist/commands/channel/adapters/claude.d.ts.map +0 -1
  615. package/dist/commands/channel/adapters/claude.js +0 -203
  616. package/dist/commands/channel/adapters/claude.js.map +0 -1
  617. package/dist/commands/channel/adapters/codex.d.ts +0 -85
  618. package/dist/commands/channel/adapters/codex.d.ts.map +0 -1
  619. package/dist/commands/channel/adapters/codex.js +0 -505
  620. package/dist/commands/channel/adapters/codex.js.map +0 -1
  621. package/dist/commands/channel/adapters/index.d.ts +0 -84
  622. package/dist/commands/channel/adapters/index.d.ts.map +0 -1
  623. package/dist/commands/channel/adapters/index.js +0 -115
  624. package/dist/commands/channel/adapters/index.js.map +0 -1
  625. package/dist/commands/channel/adapters/types.d.ts +0 -33
  626. package/dist/commands/channel/adapters/types.d.ts.map +0 -1
  627. package/dist/commands/channel/adapters/types.js +0 -2
  628. package/dist/commands/channel/adapters/types.js.map +0 -1
  629. package/dist/commands/channel/agent-loader.d.ts +0 -32
  630. package/dist/commands/channel/agent-loader.d.ts.map +0 -1
  631. package/dist/commands/channel/agent-loader.js +0 -154
  632. package/dist/commands/channel/agent-loader.js.map +0 -1
  633. package/dist/commands/channel/context-loader.d.ts +0 -26
  634. package/dist/commands/channel/context-loader.d.ts.map +0 -1
  635. package/dist/commands/channel/context-loader.js +0 -290
  636. package/dist/commands/channel/context-loader.js.map +0 -1
  637. package/dist/commands/channel/context.d.ts +0 -16
  638. package/dist/commands/channel/context.d.ts.map +0 -1
  639. package/dist/commands/channel/context.js +0 -83
  640. package/dist/commands/channel/context.js.map +0 -1
  641. package/dist/commands/channel/create.d.ts +0 -27
  642. package/dist/commands/channel/create.d.ts.map +0 -1
  643. package/dist/commands/channel/create.js +0 -39
  644. package/dist/commands/channel/create.js.map +0 -1
  645. package/dist/commands/channel/dev-parse-trace.d.ts +0 -14
  646. package/dist/commands/channel/dev-parse-trace.d.ts.map +0 -1
  647. package/dist/commands/channel/dev-parse-trace.js +0 -70
  648. package/dist/commands/channel/dev-parse-trace.js.map +0 -1
  649. package/dist/commands/channel/guard.d.ts +0 -150
  650. package/dist/commands/channel/guard.d.ts.map +0 -1
  651. package/dist/commands/channel/guard.js +0 -475
  652. package/dist/commands/channel/guard.js.map +0 -1
  653. package/dist/commands/channel/index.d.ts +0 -3
  654. package/dist/commands/channel/index.d.ts.map +0 -1
  655. package/dist/commands/channel/index.js +0 -531
  656. package/dist/commands/channel/index.js.map +0 -1
  657. package/dist/commands/channel/interrupt.d.ts +0 -10
  658. package/dist/commands/channel/interrupt.d.ts.map +0 -1
  659. package/dist/commands/channel/interrupt.js +0 -22
  660. package/dist/commands/channel/interrupt.js.map +0 -1
  661. package/dist/commands/channel/kill.d.ts +0 -7
  662. package/dist/commands/channel/kill.d.ts.map +0 -1
  663. package/dist/commands/channel/kill.js +0 -121
  664. package/dist/commands/channel/kill.js.map +0 -1
  665. package/dist/commands/channel/list.d.ts +0 -17
  666. package/dist/commands/channel/list.d.ts.map +0 -1
  667. package/dist/commands/channel/list.js +0 -233
  668. package/dist/commands/channel/list.js.map +0 -1
  669. package/dist/commands/channel/messages.d.ts +0 -15
  670. package/dist/commands/channel/messages.d.ts.map +0 -1
  671. package/dist/commands/channel/messages.js +0 -245
  672. package/dist/commands/channel/messages.js.map +0 -1
  673. package/dist/commands/channel/rm.d.ts +0 -27
  674. package/dist/commands/channel/rm.d.ts.map +0 -1
  675. package/dist/commands/channel/rm.js +0 -216
  676. package/dist/commands/channel/rm.js.map +0 -1
  677. package/dist/commands/channel/run.d.ts +0 -30
  678. package/dist/commands/channel/run.d.ts.map +0 -1
  679. package/dist/commands/channel/run.js +0 -130
  680. package/dist/commands/channel/run.js.map +0 -1
  681. package/dist/commands/channel/send.d.ts +0 -11
  682. package/dist/commands/channel/send.d.ts.map +0 -1
  683. package/dist/commands/channel/send.js +0 -24
  684. package/dist/commands/channel/send.js.map +0 -1
  685. package/dist/commands/channel/spawn.d.ts +0 -40
  686. package/dist/commands/channel/spawn.d.ts.map +0 -1
  687. package/dist/commands/channel/spawn.js +0 -242
  688. package/dist/commands/channel/spawn.js.map +0 -1
  689. package/dist/commands/channel/store/events.d.ts +0 -39
  690. package/dist/commands/channel/store/events.d.ts.map +0 -1
  691. package/dist/commands/channel/store/events.js +0 -87
  692. package/dist/commands/channel/store/events.js.map +0 -1
  693. package/dist/commands/channel/store/filter.d.ts +0 -3
  694. package/dist/commands/channel/store/filter.d.ts.map +0 -1
  695. package/dist/commands/channel/store/filter.js +0 -2
  696. package/dist/commands/channel/store/filter.js.map +0 -1
  697. package/dist/commands/channel/store/lock.d.ts +0 -23
  698. package/dist/commands/channel/store/lock.d.ts.map +0 -1
  699. package/dist/commands/channel/store/lock.js +0 -99
  700. package/dist/commands/channel/store/lock.js.map +0 -1
  701. package/dist/commands/channel/store/paths.d.ts +0 -63
  702. package/dist/commands/channel/store/paths.d.ts.map +0 -1
  703. package/dist/commands/channel/store/paths.js +0 -247
  704. package/dist/commands/channel/store/paths.js.map +0 -1
  705. package/dist/commands/channel/store/schema.d.ts +0 -27
  706. package/dist/commands/channel/store/schema.d.ts.map +0 -1
  707. package/dist/commands/channel/store/schema.js +0 -34
  708. package/dist/commands/channel/store/schema.js.map +0 -1
  709. package/dist/commands/channel/store/thread-state.d.ts +0 -5
  710. package/dist/commands/channel/store/thread-state.d.ts.map +0 -1
  711. package/dist/commands/channel/store/thread-state.js +0 -16
  712. package/dist/commands/channel/store/thread-state.js.map +0 -1
  713. package/dist/commands/channel/store/watch.d.ts +0 -19
  714. package/dist/commands/channel/store/watch.d.ts.map +0 -1
  715. package/dist/commands/channel/store/watch.js +0 -146
  716. package/dist/commands/channel/store/watch.js.map +0 -1
  717. package/dist/commands/channel/supervisor/idle.d.ts +0 -46
  718. package/dist/commands/channel/supervisor/idle.d.ts.map +0 -1
  719. package/dist/commands/channel/supervisor/idle.js +0 -72
  720. package/dist/commands/channel/supervisor/idle.js.map +0 -1
  721. package/dist/commands/channel/supervisor/inbox.d.ts +0 -30
  722. package/dist/commands/channel/supervisor/inbox.d.ts.map +0 -1
  723. package/dist/commands/channel/supervisor/inbox.js +0 -160
  724. package/dist/commands/channel/supervisor/inbox.js.map +0 -1
  725. package/dist/commands/channel/supervisor/shutdown.d.ts +0 -68
  726. package/dist/commands/channel/supervisor/shutdown.d.ts.map +0 -1
  727. package/dist/commands/channel/supervisor/shutdown.js +0 -146
  728. package/dist/commands/channel/supervisor/shutdown.js.map +0 -1
  729. package/dist/commands/channel/supervisor/stdout.d.ts +0 -51
  730. package/dist/commands/channel/supervisor/stdout.d.ts.map +0 -1
  731. package/dist/commands/channel/supervisor/stdout.js +0 -121
  732. package/dist/commands/channel/supervisor/stdout.js.map +0 -1
  733. package/dist/commands/channel/supervisor/turns.d.ts +0 -31
  734. package/dist/commands/channel/supervisor/turns.d.ts.map +0 -1
  735. package/dist/commands/channel/supervisor/turns.js +0 -45
  736. package/dist/commands/channel/supervisor/turns.js.map +0 -1
  737. package/dist/commands/channel/supervisor/warning.d.ts +0 -48
  738. package/dist/commands/channel/supervisor/warning.d.ts.map +0 -1
  739. package/dist/commands/channel/supervisor/warning.js +0 -77
  740. package/dist/commands/channel/supervisor/warning.js.map +0 -1
  741. package/dist/commands/channel/supervisor.d.ts +0 -59
  742. package/dist/commands/channel/supervisor.d.ts.map +0 -1
  743. package/dist/commands/channel/supervisor.js +0 -345
  744. package/dist/commands/channel/supervisor.js.map +0 -1
  745. package/dist/commands/channel/text-body.d.ts +0 -13
  746. package/dist/commands/channel/text-body.d.ts.map +0 -1
  747. package/dist/commands/channel/text-body.js +0 -47
  748. package/dist/commands/channel/text-body.js.map +0 -1
  749. package/dist/commands/channel/threads.d.ts +0 -39
  750. package/dist/commands/channel/threads.d.ts.map +0 -1
  751. package/dist/commands/channel/threads.js +0 -106
  752. package/dist/commands/channel/threads.js.map +0 -1
  753. package/dist/commands/channel/title.d.ts +0 -12
  754. package/dist/commands/channel/title.d.ts.map +0 -1
  755. package/dist/commands/channel/title.js +0 -24
  756. package/dist/commands/channel/title.js.map +0 -1
  757. package/dist/commands/channel/wait.d.ts +0 -17
  758. package/dist/commands/channel/wait.d.ts.map +0 -1
  759. package/dist/commands/channel/wait.js +0 -75
  760. package/dist/commands/channel/wait.js.map +0 -1
  761. package/dist/commands/validate-rules.d.ts +0 -6
  762. package/dist/commands/validate-rules.d.ts.map +0 -1
  763. package/dist/commands/validate-rules.js +0 -33
  764. package/dist/commands/validate-rules.js.map +0 -1
  765. package/dist/configurators/cursor.d.ts +0 -21
  766. package/dist/configurators/cursor.d.ts.map +0 -1
  767. package/dist/configurators/cursor.js +0 -51
  768. package/dist/configurators/cursor.js.map +0 -1
  769. package/dist/pactile/adapters/cursor/index.d.ts +0 -60
  770. package/dist/pactile/adapters/cursor/index.d.ts.map +0 -1
  771. package/dist/pactile/adapters/cursor/index.js +0 -186
  772. package/dist/pactile/adapters/cursor/index.js.map +0 -1
  773. package/dist/templates/common/optional-skills/chrome-cdp/SKILL.md +0 -179
  774. package/dist/templates/common/optional-skills/chrome-cdp/examples/fetch-hook-api-capture.md +0 -149
  775. package/dist/templates/common/optional-skills/chrome-cdp/scripts/cdp.mjs +0 -904
  776. package/dist/templates/cursor/agents/pactile-check.md +0 -58
  777. package/dist/templates/cursor/agents/pactile-implement.md +0 -56
  778. package/dist/templates/cursor/agents/pactile-research.md +0 -51
  779. package/dist/templates/cursor/commands/handoff.md +0 -101
  780. package/dist/templates/cursor/fixtures/expected-rules.d.ts +0 -14
  781. package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +0 -1
  782. package/dist/templates/cursor/fixtures/expected-rules.js +0 -20
  783. package/dist/templates/cursor/fixtures/expected-rules.js.map +0 -1
  784. package/dist/templates/cursor/hooks.json +0 -52
  785. package/dist/templates/cursor/index.d.ts +0 -19
  786. package/dist/templates/cursor/index.d.ts.map +0 -1
  787. package/dist/templates/cursor/index.js +0 -19
  788. package/dist/templates/cursor/index.js.map +0 -1
  789. package/dist/templates/cursor/rules/pactile-bootstrap.mdc +0 -18
  790. package/dist/templates/cursor/worktrees.json +0 -11
  791. package/dist/templates/markdown/framework/cursor-context-injection-guide.md.txt +0 -85
  792. package/dist/templates/markdown/framework/cursor-native-modes-guide.md.txt +0 -239
  793. package/dist/templates/markdown/framework/cursor-semantic-compliance.md.txt +0 -41
  794. package/dist/templates/markdown/framework/cursor-subagent-policy.md.txt +0 -90
  795. package/dist/templates/markdown/framework/internal-skills-cursor-reachability.md.txt +0 -45
  796. package/dist/templates/markdown/prompts/run-semantic-slice-12.md.txt +0 -25
  797. package/dist/templates/pactile/modules/candidate-pool/contract.md +0 -37
  798. package/dist/templates/pactile/pool/README.md +0 -149
  799. package/dist/templates/pactile/pool/items/.gitkeep +0 -0
  800. package/dist/templates/pactile/pool/plan.md +0 -50
  801. package/dist/templates/pactile/scripts/__init__.py +0 -5
  802. package/dist/templates/pactile/scripts/add_session.py +0 -547
  803. package/dist/templates/pactile/scripts/build_context_pack.py +0 -17
  804. package/dist/templates/pactile/scripts/build_retrieval_pack.py +0 -376
  805. package/dist/templates/pactile/scripts/codegraph_session_smoke.py +0 -76
  806. package/dist/templates/pactile/scripts/common/__init__.py +0 -103
  807. package/dist/templates/pactile/scripts/common/active_task.py +0 -576
  808. package/dist/templates/pactile/scripts/common/adapter_middleware.py +0 -1373
  809. package/dist/templates/pactile/scripts/common/artifact_locale.py +0 -303
  810. package/dist/templates/pactile/scripts/common/artifact_search.py +0 -587
  811. package/dist/templates/pactile/scripts/common/cli_adapter.py +0 -135
  812. package/dist/templates/pactile/scripts/common/cli_environment.py +0 -155
  813. package/dist/templates/pactile/scripts/common/codebase_retrieval_router.py +0 -1339
  814. package/dist/templates/pactile/scripts/common/config.py +0 -497
  815. package/dist/templates/pactile/scripts/common/context_pack.py +0 -371
  816. package/dist/templates/pactile/scripts/common/cursor_retrieval_env.py +0 -31
  817. package/dist/templates/pactile/scripts/common/developer.py +0 -190
  818. package/dist/templates/pactile/scripts/common/execution_strategy.py +0 -268
  819. package/dist/templates/pactile/scripts/common/full_quality.py +0 -237
  820. package/dist/templates/pactile/scripts/common/git.py +0 -37
  821. package/dist/templates/pactile/scripts/common/git_context.py +0 -198
  822. package/dist/templates/pactile/scripts/common/injection_budget.py +0 -317
  823. package/dist/templates/pactile/scripts/common/io.py +0 -37
  824. package/dist/templates/pactile/scripts/common/kernel_command.py +0 -369
  825. package/dist/templates/pactile/scripts/common/lite_context.py +0 -280
  826. package/dist/templates/pactile/scripts/common/log.py +0 -45
  827. package/dist/templates/pactile/scripts/common/ondemand_topology.py +0 -419
  828. package/dist/templates/pactile/scripts/common/packages_context.py +0 -239
  829. package/dist/templates/pactile/scripts/common/pactile_config.py +0 -131
  830. package/dist/templates/pactile/scripts/common/parallel_declaration.py +0 -369
  831. package/dist/templates/pactile/scripts/common/parent_orchestration.py +0 -1198
  832. package/dist/templates/pactile/scripts/common/paths.py +0 -756
  833. package/dist/templates/pactile/scripts/common/pool_refs.py +0 -119
  834. package/dist/templates/pactile/scripts/common/pool_slice.py +0 -269
  835. package/dist/templates/pactile/scripts/common/pool_store.py +0 -766
  836. package/dist/templates/pactile/scripts/common/project_file_stats.py +0 -91
  837. package/dist/templates/pactile/scripts/common/retrieval_adapter_metadata.py +0 -943
  838. package/dist/templates/pactile/scripts/common/retrieval_agent_instructions.py +0 -123
  839. package/dist/templates/pactile/scripts/common/retrieval_evidence.py +0 -915
  840. package/dist/templates/pactile/scripts/common/retrieval_pack.py +0 -422
  841. package/dist/templates/pactile/scripts/common/retrieval_pack_context.py +0 -122
  842. package/dist/templates/pactile/scripts/common/retrieval_plan_gate.py +0 -61
  843. package/dist/templates/pactile/scripts/common/retrieval_result_ranking.py +0 -104
  844. package/dist/templates/pactile/scripts/common/retrieval_tool_classification.py +0 -166
  845. package/dist/templates/pactile/scripts/common/safe_commit.py +0 -285
  846. package/dist/templates/pactile/scripts/common/semantic_plan_gate.py +0 -53
  847. package/dist/templates/pactile/scripts/common/session_context.py +0 -1213
  848. package/dist/templates/pactile/scripts/common/session_memory.py +0 -386
  849. package/dist/templates/pactile/scripts/common/session_pack.py +0 -886
  850. package/dist/templates/pactile/scripts/common/smart_search_evidence.py +0 -514
  851. package/dist/templates/pactile/scripts/common/smart_search_resolve.py +0 -150
  852. package/dist/templates/pactile/scripts/common/subagent_dispatch.py +0 -592
  853. package/dist/templates/pactile/scripts/common/task_context.py +0 -241
  854. package/dist/templates/pactile/scripts/common/task_dashboard.py +0 -286
  855. package/dist/templates/pactile/scripts/common/task_dependencies.py +0 -648
  856. package/dist/templates/pactile/scripts/common/task_gates.py +0 -2478
  857. package/dist/templates/pactile/scripts/common/task_map.py +0 -703
  858. package/dist/templates/pactile/scripts/common/task_queue.py +0 -188
  859. package/dist/templates/pactile/scripts/common/task_store.py +0 -2252
  860. package/dist/templates/pactile/scripts/common/task_utils.py +0 -274
  861. package/dist/templates/pactile/scripts/common/tasks.py +0 -231
  862. package/dist/templates/pactile/scripts/common/test_adapter_middleware.py +0 -199
  863. package/dist/templates/pactile/scripts/common/test_depends_mode_block.py +0 -509
  864. package/dist/templates/pactile/scripts/common/test_full_quality.py +0 -197
  865. package/dist/templates/pactile/scripts/common/test_kernel_command.py +0 -336
  866. package/dist/templates/pactile/scripts/common/test_lite_path.py +0 -190
  867. package/dist/templates/pactile/scripts/common/test_observable_defaults.py +0 -141
  868. package/dist/templates/pactile/scripts/common/test_ondemand_topology.py +0 -237
  869. package/dist/templates/pactile/scripts/common/test_parallel_declaration.py +0 -264
  870. package/dist/templates/pactile/scripts/common/test_pool_slice.py +0 -198
  871. package/dist/templates/pactile/scripts/common/test_pool_store.py +0 -452
  872. package/dist/templates/pactile/scripts/common/test_retrieval_arbitration.py +0 -331
  873. package/dist/templates/pactile/scripts/common/test_task_dashboard.py +0 -155
  874. package/dist/templates/pactile/scripts/common/test_task_dependencies.py +0 -329
  875. package/dist/templates/pactile/scripts/common/test_task_store_kernel_patch.py +0 -163
  876. package/dist/templates/pactile/scripts/common/types.py +0 -110
  877. package/dist/templates/pactile/scripts/common/workflow_phase.py +0 -194
  878. package/dist/templates/pactile/scripts/compile_session_pack.py +0 -15
  879. package/dist/templates/pactile/scripts/cursor_retrieval_probe.py +0 -64
  880. package/dist/templates/pactile/scripts/cursor_retrieval_probe_prompt.md +0 -33
  881. package/dist/templates/pactile/scripts/generate_dispatch_prompt.py +0 -182
  882. package/dist/templates/pactile/scripts/get_context.py +0 -19
  883. package/dist/templates/pactile/scripts/get_developer.py +0 -26
  884. package/dist/templates/pactile/scripts/hooks/linear_sync.py +0 -243
  885. package/dist/templates/pactile/scripts/init_developer.py +0 -51
  886. package/dist/templates/pactile/scripts/injection_budget_probe.py +0 -69
  887. package/dist/templates/pactile/scripts/pool.py +0 -237
  888. package/dist/templates/pactile/scripts/rank_retrieval_candidates.py +0 -98
  889. package/dist/templates/pactile/scripts/route_codebase_retrieval.py +0 -72
  890. package/dist/templates/pactile/scripts/run_smart_search.py +0 -12
  891. package/dist/templates/pactile/scripts/score_evidence.py +0 -131
  892. package/dist/templates/pactile/scripts/search_artifacts.py +0 -13
  893. package/dist/templates/pactile/scripts/search_memory.py +0 -12
  894. package/dist/templates/pactile/scripts/spec_health_outcomes.py +0 -160
  895. package/dist/templates/pactile/scripts/task.py +0 -1118
  896. package/dist/templates/pactile/scripts/verify_evidence_probe.py +0 -138
  897. package/dist/templates/shared-hooks/event-bridge.py +0 -121
  898. package/dist/templates/shared-hooks/index.d.ts +0 -50
  899. package/dist/templates/shared-hooks/index.d.ts.map +0 -1
  900. package/dist/templates/shared-hooks/index.js +0 -96
  901. package/dist/templates/shared-hooks/index.js.map +0 -1
  902. package/dist/templates/shared-hooks/inject-retrieval-plan.py +0 -217
  903. package/dist/templates/shared-hooks/inject-shell-session-context.py +0 -183
  904. package/dist/templates/shared-hooks/inject-subagent-context.py +0 -267
  905. package/dist/templates/shared-hooks/inject-workflow-state.py +0 -106
  906. package/dist/templates/shared-hooks/rename-session-for-task.py +0 -231
  907. package/dist/templates/shared-hooks/research-end-retrieval-pack.py +0 -345
  908. package/dist/templates/shared-hooks/session-start.py +0 -355
  909. package/dist/templates/shared-hooks/spec-write-audit.py +0 -173
  910. package/dist/utils/mirror-check.d.ts +0 -22
  911. package/dist/utils/mirror-check.d.ts.map +0 -1
  912. package/dist/utils/mirror-check.js +0 -90
  913. package/dist/utils/mirror-check.js.map +0 -1
  914. package/dist/utils/validate-rules.d.ts +0 -21
  915. package/dist/utils/validate-rules.d.ts.map +0 -1
  916. package/dist/utils/validate-rules.js +0 -88
  917. package/dist/utils/validate-rules.js.map +0 -1
@@ -1,1198 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Parent reviewer orchestration: child prompt generation and review workflows.
4
-
5
- Inline mode prints prompts and review summaries for manual handoff to external agents.
6
- Subagent-capable platforms may use the same output with platform-specific dispatch.
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- import re
12
- from datetime import datetime, timezone
13
- from pathlib import Path
14
-
15
- from .io import read_json
16
- from .paths import get_repo_root
17
- from .task_gates import (
18
- build_spec_update_scaffold,
19
- durable_learning_decision_status,
20
- task_closeout_profile,
21
- )
22
- from .task_map import (
23
- PARENT_TERMINAL_STATES,
24
- get_child_entry,
25
- load_task_map,
26
- resolve_child_map_id,
27
- validate_parent_child_integration,
28
- )
29
-
30
- _ARTIFACT_NAMES = ("prd.md", "design.md", "implement.md", "verify.md", "handoff.md")
31
- _GLOBAL_CHILD_CONSTRAINTS = """General constraints:
32
- - Read the parent task artifacts first: prd.md, design.md, implement.md, task-map.md, and child-prompts.md when present.
33
- - Read your own child task artifacts: prd.md, design.md, implement.md.
34
- - Stay inside your child scope and declared touch areas.
35
- - Do not publish packages, push remotes, create tags, edit credentials, or change global/MCP configuration.
36
- - Preserve explicit user approval for destructive, remote, credential-bearing, publish, push, tag, and global configuration actions.
37
- - Write `verify.md` and `handoff.md` in your child task directory.
38
- - Handoff must include changed files, validation commands/results, residual risks, and parent integration notes.
39
- - If you find a needed contract change, stop and report it to the parent instead of silently redefining shared state/gate semantics.
40
-
41
- Validation baseline:
42
- - Run focused tests for touched behavior.
43
- - Run typecheck when touching TypeScript.
44
- - Run ESLint for changed TypeScript test/source files when applicable.
45
- - Run Python compile checks when touching Python scripts/templates.
46
- - Run `python ./.pactile/scripts/task.py validate <your-child-task>` before handoff."""
47
-
48
- _VALIDATION_BASELINE = """Validation baseline:
49
- - Run focused tests for touched behavior.
50
- - Run typecheck when touching TypeScript.
51
- - Run ESLint for changed TypeScript test/source files when applicable.
52
- - Run Python compile checks when touching Python scripts/templates.
53
- - Run `python ./.pactile/scripts/task.py validate <child-dir>` before handoff."""
54
-
55
-
56
- def _utc_now() -> str:
57
- return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
58
-
59
-
60
- def _read_optional(path: Path, max_chars: int = 12000) -> str | None:
61
- if not path.is_file():
62
- return None
63
- try:
64
- text = path.read_text(encoding="utf-8")
65
- except OSError:
66
- return None
67
- if len(text) > max_chars:
68
- return text[:max_chars] + "\n\n...[truncated for prompt]...\n"
69
- return text
70
-
71
-
72
- def _repo_rel(path: Path, repo_root: Path) -> str:
73
- try:
74
- return path.relative_to(repo_root).as_posix()
75
- except ValueError:
76
- return str(path)
77
-
78
-
79
- def _unmet_dependencies(child_entry: dict, children_by_id: dict[str, dict]) -> list[str]:
80
- deps = child_entry.get("depends_on") or []
81
- if not isinstance(deps, list):
82
- return []
83
- blocked: list[str] = []
84
- for dep_id in deps:
85
- if not isinstance(dep_id, str):
86
- continue
87
- dep = children_by_id.get(dep_id)
88
- if dep is None:
89
- blocked.append(f"{dep_id} (missing from task-map)")
90
- continue
91
- state = dep.get("state")
92
- if state not in PARENT_TERMINAL_STATES:
93
- blocked.append(f"{dep_id} (state={state!r}, need integrated or cancelled)")
94
- return blocked
95
-
96
-
97
- def _child_prompt_section(
98
- parent_dir: Path,
99
- child_dir: Path,
100
- child_entry: dict,
101
- repo_root: Path,
102
- *,
103
- include_artifacts: bool,
104
- ) -> str:
105
- child_name = child_entry.get("id") or child_dir.name
106
- parent_rel = _repo_rel(parent_dir, repo_root)
107
- child_rel = _repo_rel(child_dir, repo_root)
108
- state = child_entry.get("state", "open")
109
- depends_on = child_entry.get("depends_on") or []
110
- touches = child_entry.get("touches") or []
111
- isolation = child_entry.get("isolation") or "git-worktree"
112
-
113
- lines = [
114
- f"## Child: `{child_name}`",
115
- "",
116
- f"- Parent task: `{parent_rel}`",
117
- f"- Child task: `{child_rel}`",
118
- f"- Integration state: `{state}`",
119
- f"- Isolation: `{isolation}`",
120
- ]
121
- if depends_on:
122
- lines.append(f"- Depends on: {', '.join(f'`{d}`' for d in depends_on)}")
123
- else:
124
- lines.append("- Depends on: (none)")
125
- if touches:
126
- lines.append("- Touch scope:")
127
- for touch in touches:
128
- lines.append(f" - `{touch}`")
129
- else:
130
- lines.append("- Touch scope: (not declared in task-map; stay within child prd/design/implement)")
131
-
132
- if include_artifacts:
133
- lines.append("")
134
- lines.append("### Child artifacts (context)")
135
- for name in _ARTIFACT_NAMES:
136
- content = _read_optional(child_dir / name, max_chars=8000)
137
- if content:
138
- lines.append(f"#### {name}")
139
- lines.append("")
140
- lines.append(content.strip())
141
- lines.append("")
142
-
143
- lines.append("### Suggested child worker commands")
144
- lines.append("")
145
- lines.append("```bash")
146
- lines.append(f"python ./.pactile/scripts/task.py select {child_rel}")
147
- lines.append(
148
- f"python ./.pactile/scripts/task.py set-child-state {parent_rel} {child_rel} working --evidence implement.md"
149
- )
150
- lines.append("# ... implement ...")
151
- lines.append(
152
- f"python ./.pactile/scripts/task.py set-child-state {parent_rel} {child_rel} review --evidence verify.md"
153
- )
154
- lines.append("```")
155
- lines.append("")
156
- return "\n".join(lines)
157
-
158
-
159
- def build_child_prompt(
160
- parent_dir: Path,
161
- child_dir: Path,
162
- *,
163
- include_artifacts: bool = False,
164
- mode: str = "inline",
165
- ) -> tuple[str | None, list[str]]:
166
- """Build an implementation prompt for a linked child task."""
167
- errors: list[str] = []
168
- repo_root = get_repo_root()
169
-
170
- parent_json = parent_dir / "task.json"
171
- if not parent_json.is_file():
172
- return None, [f"parent task.json missing: {parent_dir}"]
173
-
174
- parent_data = read_json(parent_json) or {}
175
- child_data = read_json(child_dir / "task.json") or {}
176
- child_name = resolve_child_map_id(parent_data, child_dir, child_data)
177
-
178
- data, body = load_task_map(parent_dir)
179
- if data is None:
180
- return None, ["parent task-map.md missing or invalid"]
181
-
182
- child_entry = get_child_entry(data, child_name)
183
- if child_entry is None:
184
- return None, [f"child not in parent task-map: {child_name}"]
185
-
186
- children_by_id = {
187
- item.get("id"): item
188
- for item in data.get("children", [])
189
- if isinstance(item, dict) and item.get("id")
190
- }
191
- blocked = _unmet_dependencies(child_entry, children_by_id)
192
-
193
- parent_rel = _repo_rel(parent_dir, repo_root)
194
- child_rel = _repo_rel(child_dir, repo_root)
195
- repo_rel = _repo_rel(repo_root, repo_root)
196
-
197
- child_prd = _read_optional(child_dir / "prd.md", 4000)
198
- child_design = _read_optional(child_dir / "design.md", 4000)
199
- child_implement = _read_optional(child_dir / "implement.md", 4000)
200
- parent_child_prompts = _read_optional(parent_dir / "child-prompts.md", 16000)
201
-
202
- goal = ""
203
- if child_prd:
204
- goal_match = re.search(r"(?ms)^##\s*Goal\s*\n+(.*?)(?:\n##|\Z)", child_prd)
205
- if goal_match:
206
- goal = goal_match.group(1).strip()
207
-
208
- lines = [
209
- f"You are implementing child task `{child_name}`.",
210
- "",
211
- "Workspace:",
212
- f"- Root: {repo_rel}",
213
- f"- Parent task: {parent_rel}",
214
- f"- Child task: {child_rel}",
215
- "",
216
- ]
217
-
218
- if blocked:
219
- lines.extend(
220
- [
221
- "Start condition:",
222
- "- **BLOCKED** — unmet dependencies:",
223
- ]
224
- )
225
- for item in blocked:
226
- lines.append(f" - {item}")
227
- lines.append("- Do not start implementation until dependencies reach `integrated` or `cancelled`.")
228
- lines.append("")
229
- elif depends_on := child_entry.get("depends_on"):
230
- lines.extend(
231
- [
232
- "Start condition:",
233
- f"- Dependencies satisfied: {', '.join(f'`{d}`' for d in depends_on)}.",
234
- "",
235
- ]
236
- )
237
-
238
- lines.extend(
239
- [
240
- "Read first:",
241
- f"- Parent prd.md/design.md/implement.md/task-map.md",
242
- f"- Child prd.md/design.md/implement.md under `{child_rel}`",
243
- ]
244
- )
245
- if parent_child_prompts and child_name in parent_child_prompts:
246
- lines.append(f"- Parent child-prompts.md section for `{child_name}` when present")
247
-
248
- if goal:
249
- lines.extend(["", "Goal:", goal, ""])
250
-
251
- lines.append(_GLOBAL_CHILD_CONSTRAINTS)
252
- lines.append("")
253
-
254
- if child_implement:
255
- lines.extend(["Implementation plan (from child implement.md):", child_implement.strip()[:6000], ""])
256
- elif child_design:
257
- lines.extend(["Design notes (from child design.md):", child_design.strip()[:4000], ""])
258
-
259
- touches = child_entry.get("touches") or []
260
- if touches:
261
- lines.append("Declared touch scope (parent task-map):")
262
- for touch in touches:
263
- lines.append(f"- `{touch}`")
264
- lines.append("")
265
-
266
- if mode == "subagent":
267
- topo = data.get("execution_topology", "serial")
268
- merge_lim = data.get("merge_limit", 1)
269
- lines.extend(
270
- [
271
- f"Selected task: {child_rel}",
272
- "",
273
- "Delivery mode: subagent (Cursor)",
274
- "- **Default:** Parent session dispatches **Task** with `subagent_type=pactile-implement` and this prompt as the task description (writable sub-agent). Native Cursor `model:` frontmatter still applies.",
275
- "- **Exception:** If parent `child-prompts.md` or the user names this child for a **separate writable Agent chat**, open a new Agent session, pick the model manually, paste this prompt — do not use Task from Parent.",
276
- "- Parent retains `review-child` / `integrate-child`. Child must not nest further `pactile-research` / `pactile-implement` / `pactile-check` Task dispatches.",
277
- f"- Parent orchestration: `execution_topology={topo}`, `merge_limit={merge_lim}`.",
278
- "- When `isolation: git-worktree`, prepare worktree from a **git repo root** (e.g. `Pactile/`) before large edits.",
279
- "",
280
- ]
281
- )
282
- else:
283
- lines.extend(
284
- [
285
- "Delivery mode: inline",
286
- "- Hand this prompt to the child worker agent or session manually.",
287
- "- Parent session retains integration authority (`integrate-child`, `review-child`).",
288
- "",
289
- ]
290
- )
291
-
292
- lines.append(_child_prompt_section(parent_dir, child_dir, child_entry, repo_root, include_artifacts=include_artifacts))
293
-
294
- return "\n".join(lines), errors
295
-
296
-
297
-
298
- def _children_by_id(data: dict) -> dict[str, dict]:
299
- return {
300
- item.get("id"): item
301
- for item in data.get("children", [])
302
- if isinstance(item, dict) and isinstance(item.get("id"), str)
303
- }
304
-
305
-
306
- def _normalize_stages(data: dict) -> tuple[list[dict], list[str], bool]:
307
- """Return (stages, errors, used_legacy_default)."""
308
- errors: list[str] = []
309
- children = _children_by_id(data)
310
- raw_stages = data.get("stages") or []
311
- if not isinstance(raw_stages, list):
312
- return [], ["task-map stages must be a list"], False
313
-
314
- if not raw_stages:
315
- units = list(children.keys())
316
- return (
317
- [{"id": "default", "title": "All children (no stages declared)", "units": units}],
318
- [],
319
- True,
320
- )
321
-
322
- stages: list[dict] = []
323
- seen_units: set[str] = set()
324
- for idx, stage in enumerate(raw_stages):
325
- if not isinstance(stage, dict):
326
- errors.append(f"stages[{idx}] must be a mapping")
327
- continue
328
- stage_id = stage.get("id")
329
- if not isinstance(stage_id, str) or not stage_id.strip():
330
- errors.append(f"stages[{idx}] missing id")
331
- continue
332
- units = stage.get("units") or []
333
- if not isinstance(units, list):
334
- errors.append(f"stage `{stage_id}` units must be a list")
335
- continue
336
- norm_units: list[str] = []
337
- for unit in units:
338
- if not isinstance(unit, str) or not unit.strip():
339
- errors.append(f"stage `{stage_id}` has invalid unit entry")
340
- continue
341
- if unit not in children:
342
- errors.append(f"stage `{stage_id}` unit `{unit}` not in children[]")
343
- continue
344
- if unit in seen_units:
345
- errors.append(f"unit `{unit}` appears in multiple stages")
346
- continue
347
- seen_units.add(unit)
348
- norm_units.append(unit)
349
- stages.append(
350
- {
351
- "id": stage_id,
352
- "title": stage.get("title") if isinstance(stage.get("title"), str) else "",
353
- "units": norm_units,
354
- }
355
- )
356
- return stages, errors, False
357
-
358
-
359
- def _unit_readiness(
360
- unit_id: str,
361
- children_by_id: dict[str, dict],
362
- ) -> tuple[str, list[str]]:
363
- entry = children_by_id.get(unit_id) or {}
364
- blocked = _unmet_dependencies(entry, children_by_id)
365
- return ("ready" if not blocked else "blocked", blocked)
366
-
367
-
368
- _PACK_GENERATED_RE = re.compile(r"^- Generated:\s*(.+)$", re.MULTILINE)
369
- _PACK_DASH = r"[\u2014\-]"
370
- _PACK_UNIT_LINE_RE = re.compile(
371
- rf"^- `([^`]+)` {_PACK_DASH} `([^`]+)` {_PACK_DASH} \*\*(ready|blocked)\*\*",
372
- re.MULTILINE,
373
- )
374
-
375
-
376
- def _parse_iso_timestamp(raw: str) -> datetime | None:
377
- text = raw.strip()
378
- if not text:
379
- return None
380
- normalized = text[:-1] + "+00:00" if text.endswith("Z") else text
381
- try:
382
- parsed = datetime.fromisoformat(normalized)
383
- except ValueError:
384
- try:
385
- parsed = datetime.strptime(text, "%Y-%m-%d")
386
- except ValueError:
387
- return None
388
- if parsed.tzinfo is None:
389
- return parsed.replace(tzinfo=timezone.utc)
390
- return parsed
391
-
392
-
393
- def _parse_pack_generated(pack_text: str) -> datetime | None:
394
- match = _PACK_GENERATED_RE.search(pack_text)
395
- if not match:
396
- return None
397
- return _parse_iso_timestamp(match.group(1))
398
-
399
-
400
- def _last_integrate_event_time(body: str) -> datetime | None:
401
- last: datetime | None = None
402
- for line in body.splitlines():
403
- stripped = line.strip()
404
- if not stripped.startswith("- "):
405
- continue
406
- remainder = stripped[2:]
407
- parts = remainder.split(" - ", 1)
408
- if len(parts) != 2:
409
- continue
410
- ts_raw, message = parts[0].strip(), parts[1]
411
- lowered = message.lower()
412
- if "integration state" not in message and "integrate-through" not in lowered:
413
- continue
414
- parsed = _parse_iso_timestamp(ts_raw)
415
- if parsed is not None and (last is None or parsed > last):
416
- last = parsed
417
- return last
418
-
419
-
420
- def _pack_ready_units(pack_text: str) -> set[str]:
421
- ready: set[str] = set()
422
- for unit_id, _state, readiness in _PACK_UNIT_LINE_RE.findall(pack_text):
423
- if readiness == "ready":
424
- ready.add(unit_id)
425
- return ready
426
-
427
-
428
- def _expected_pack_ready_units(
429
- data: dict,
430
- children_by_id: dict[str, dict],
431
- ) -> set[str]:
432
- stages, _, _ = _normalize_stages(data)
433
- ready: set[str] = set()
434
- for stage in stages:
435
- for unit in stage.get("units") or []:
436
- if not isinstance(unit, str):
437
- continue
438
- readiness, _ = _unit_readiness(unit, children_by_id)
439
- if readiness == "ready":
440
- ready.add(unit)
441
- return ready
442
-
443
-
444
- def _pack_unit_states_mismatch(
445
- pack_text: str,
446
- children_by_id: dict[str, dict],
447
- ) -> bool:
448
- for unit_id, pack_state, _readiness in _PACK_UNIT_LINE_RE.findall(pack_text):
449
- entry = children_by_id.get(unit_id) or {}
450
- current_state = entry.get("state", "?")
451
- if str(current_state) != pack_state:
452
- return True
453
- return False
454
-
455
-
456
- def _compute_stale_pack(
457
- parent_dir: Path,
458
- data: dict,
459
- body: str,
460
- children_by_id: dict[str, dict],
461
- ) -> bool | None:
462
- pack_path = parent_dir / "child-prompts" / "PACK.md"
463
- if not pack_path.is_file():
464
- return None
465
- try:
466
- pack_text = pack_path.read_text(encoding="utf-8")
467
- except OSError:
468
- return None
469
-
470
- generated = _parse_pack_generated(pack_text)
471
- if generated is None:
472
- return None
473
-
474
- stale = False
475
- last_integrate = _last_integrate_event_time(body)
476
- if last_integrate is not None and generated < last_integrate:
477
- stale = True
478
- if _pack_unit_states_mismatch(pack_text, children_by_id):
479
- stale = True
480
- expected_ready = _expected_pack_ready_units(data, children_by_id)
481
- if _pack_ready_units(pack_text) != expected_ready:
482
- stale = True
483
- return stale
484
-
485
-
486
- def _compute_newly_ready(children_by_id: dict[str, dict]) -> list[str]:
487
- ready_ids: list[str] = []
488
- for unit_id in sorted(children_by_id):
489
- entry = children_by_id[unit_id]
490
- if entry.get("state") != "open":
491
- continue
492
- readiness, _ = _unit_readiness(unit_id, children_by_id)
493
- if readiness == "ready":
494
- ready_ids.append(unit_id)
495
- return ready_ids
496
-
497
-
498
- def _child_prompt_filename(unit_id: str) -> str:
499
- """Flat filename for child-prompts (nested slash unit ids use `--`)."""
500
- return f"{unit_id.replace('/', '--')}.md"
501
-
502
-
503
- def build_publish_pack(
504
- parent_dir: Path,
505
- *,
506
- stage_id: str | None = None,
507
- mode: str = "inline",
508
- dry_run: bool = False,
509
- ) -> tuple[str | None, list[str]]:
510
- """Build campaign PACK index + per-unit prompts under child-prompts/."""
511
- errors: list[str] = []
512
- repo_root = get_repo_root()
513
- parent_rel = _repo_rel(parent_dir, repo_root)
514
-
515
- if not (parent_dir / "task.json").is_file():
516
- return None, [f"parent task.json missing: {parent_dir}"]
517
-
518
- data, _ = load_task_map(parent_dir)
519
- if data is None:
520
- return None, ["parent task-map.md missing or invalid"]
521
-
522
- stages, stage_errors, legacy = _normalize_stages(data)
523
- errors.extend(stage_errors)
524
- if errors:
525
- return None, errors
526
-
527
- if stage_id:
528
- stages = [s for s in stages if s.get("id") == stage_id]
529
- if not stages:
530
- return None, [f"unknown stage id: {stage_id}"]
531
-
532
- children_by_id = _children_by_id(data)
533
- prompts_dir = parent_dir / "child-prompts"
534
- ready_rows: list[tuple[str, str, str]] = []
535
- blocked_rows: list[tuple[str, str, list[str]]] = []
536
-
537
- pack_lines = [
538
- f"# Campaign PACK — `{parent_dir.name}`",
539
- "",
540
- f"- Parent: `{parent_rel}`",
541
- f"- Generated: {_utc_now()}",
542
- f"- Mode: `{mode}`",
543
- "- Path rule: every worker must `task.py select <explicit-child-path>`; "
544
- "do not rely on selected_task inheritance across windows.",
545
- "",
546
- "## Manual window path (PACK)",
547
- "",
548
- "1. Run `publish-pack` (this file) on the Parent.",
549
- "2. For each **ready** unit: IDE **New Chat** or Agents Window → paste `child-prompts/<child>.md`.",
550
- "3. In that session run `python ./.pactile/scripts/task.py select <child-path>`.",
551
- "4. Parent retains `review-child` / `integrate-child`. PACK is not RUN auto-dispatch.",
552
- "",
553
- "## Stages",
554
- "",
555
- ]
556
- if legacy:
557
- pack_lines.append(
558
- "> Warning: no `stages:` in task-map; using implicit `default` stage "
559
- "with all children. Declare `stages:` for HYBRID campaign packs."
560
- )
561
- pack_lines.append("")
562
-
563
- written: list[str] = []
564
- for stage in stages:
565
- sid = stage["id"]
566
- title = stage.get("title") or ""
567
- heading = f"### `{sid}`" + (f" — {title}" if title else "")
568
- pack_lines.append(heading)
569
- pack_lines.append("")
570
- for unit in stage.get("units") or []:
571
- readiness, blocked = _unit_readiness(unit, children_by_id)
572
- child_dir = parent_dir.parent / unit
573
- child_rel = _repo_rel(child_dir, repo_root)
574
- state = (children_by_id.get(unit) or {}).get("state", "?")
575
- if readiness == "ready":
576
- prompt, prompt_errors = build_child_prompt(
577
- parent_dir,
578
- child_dir,
579
- include_artifacts=False,
580
- mode=mode,
581
- )
582
- if prompt_errors or not prompt:
583
- errors.extend(prompt_errors or [f"could not build prompt for `{unit}`"])
584
- continue
585
- out_name = _child_prompt_filename(unit)
586
- out_rel = f"{parent_rel}/child-prompts/{out_name}"
587
- if not dry_run:
588
- prompts_dir.mkdir(parents=True, exist_ok=True)
589
- (prompts_dir / out_name).write_text(prompt + "\n", encoding="utf-8")
590
- written.append(out_rel)
591
- ready_rows.append((sid, unit, out_rel))
592
- pack_lines.append(
593
- f"- `{unit}` — `{state}` — **ready** — prompt: `child-prompts/{out_name}` "
594
- f"(select `{child_rel}`)"
595
- )
596
- else:
597
- blocked_rows.append((sid, unit, blocked))
598
- stub = "\n".join(
599
- [
600
- f"# BLOCKED — `{unit}`",
601
- "",
602
- f"- Parent: `{parent_rel}`",
603
- f"- Child: `{child_rel}`",
604
- f"- Stage: `{sid}`",
605
- "- Do not start implementation until dependencies reach "
606
- "`integrated` or `cancelled`.",
607
- "",
608
- "Unmet dependencies:",
609
- *[f"- {item}" for item in blocked],
610
- "",
611
- ]
612
- )
613
- out_name = _child_prompt_filename(unit)
614
- out_rel = f"{parent_rel}/child-prompts/{out_name}"
615
- if not dry_run:
616
- prompts_dir.mkdir(parents=True, exist_ok=True)
617
- (prompts_dir / out_name).write_text(stub, encoding="utf-8")
618
- written.append(out_rel)
619
- pack_lines.append(
620
- f"- `{unit}` — `{state}` — **blocked** — {', '.join(blocked)}"
621
- )
622
- pack_lines.append("")
623
-
624
- pack_lines.extend(["## Ready", ""])
625
- if ready_rows:
626
- for sid, unit, path in ready_rows:
627
- pack_lines.append(f"- `{sid}` / `{unit}` → `{path}`")
628
- else:
629
- pack_lines.append("(none)")
630
- pack_lines.extend(["", "## Blocked", ""])
631
- if blocked_rows:
632
- for sid, unit, deps in blocked_rows:
633
- pack_lines.append(f"- `{sid}` / `{unit}` — {', '.join(deps)}")
634
- else:
635
- pack_lines.append("(none)")
636
- pack_lines.append("")
637
-
638
- pack_body = "\n".join(pack_lines)
639
- pack_rel = f"{parent_rel}/child-prompts/PACK.md"
640
- if not dry_run:
641
- prompts_dir.mkdir(parents=True, exist_ok=True)
642
- (prompts_dir / "PACK.md").write_text(pack_body + "\n", encoding="utf-8")
643
- written.append(pack_rel)
644
-
645
- if errors:
646
- return None, errors
647
-
648
- summary = [
649
- f"# publish-pack — `{parent_dir.name}`",
650
- "",
651
- f"- Parent: `{parent_rel}`",
652
- f"- dry_run: {dry_run}",
653
- f"- legacy_no_stages: {legacy}",
654
- f"- ready: {len(ready_rows)}",
655
- f"- blocked: {len(blocked_rows)}",
656
- f"- pack_index: `{pack_rel}`",
657
- "",
658
- ]
659
- if written:
660
- summary.append("## Written")
661
- summary.append("")
662
- for path in written:
663
- summary.append(f"- `{path}`")
664
- summary.append("")
665
- elif dry_run:
666
- summary.append("(dry-run: no files written)")
667
- summary.append("")
668
- summary.append(pack_body)
669
- return "\n".join(summary), []
670
-
671
-
672
- def build_parent_status_dict(parent_dir: Path) -> dict | None:
673
- """Machine-readable parent orchestration snapshot (campaign UI / MCP)."""
674
- repo_root = get_repo_root()
675
- parent_rel = _repo_rel(parent_dir, repo_root)
676
- data, _ = load_task_map(parent_dir)
677
- if data is None:
678
- return None
679
-
680
- children_by_id = _children_by_id(data)
681
- stages, stage_errors, legacy = _normalize_stages(data)
682
- _, body = load_task_map(parent_dir)
683
- stale_pack = _compute_stale_pack(parent_dir, data, body, children_by_id)
684
- newly_ready = _compute_newly_ready(children_by_id)
685
-
686
- stage_rows: list[dict] = []
687
- for stage in stages:
688
- units: list[dict] = []
689
- for unit in stage.get("units") or []:
690
- entry = children_by_id.get(unit) or {}
691
- readiness, blocked = _unit_readiness(unit, children_by_id)
692
- units.append(
693
- {
694
- "id": unit,
695
- "state": entry.get("state", "?"),
696
- "readiness": readiness,
697
- "blockedBy": blocked,
698
- }
699
- )
700
- stage_rows.append(
701
- {
702
- "id": stage["id"],
703
- "title": stage.get("title") or "",
704
- "units": units,
705
- }
706
- )
707
-
708
- children_rows: list[dict] = []
709
- for child in data.get("children") or []:
710
- if not isinstance(child, dict):
711
- continue
712
- cid = child.get("id")
713
- if not isinstance(cid, str):
714
- continue
715
- child_dir = parent_dir.parent / cid
716
- children_rows.append(
717
- {
718
- "id": cid,
719
- "state": child.get("state", "?"),
720
- "dependsOn": child.get("depends_on") or [],
721
- "touches": child.get("touches") or [],
722
- "isolation": child.get("isolation"),
723
- "branch": child.get("branch"),
724
- "worktreePath": child.get("worktree_path"),
725
- "evidence": child.get("evidence"),
726
- "ref": child.get("ref"),
727
- "verifyMd": (child_dir / "verify.md").is_file(),
728
- "handoffMd": (child_dir / "handoff.md").is_file(),
729
- }
730
- )
731
-
732
- return {
733
- "id": parent_dir.name,
734
- "path": parent_rel,
735
- "contractEpoch": data.get("contract_epoch"),
736
- "executionTopology": data.get("execution_topology"),
737
- "mergeLimit": data.get("merge_limit"),
738
- "stages": stage_rows,
739
- "children": children_rows,
740
- "integrationQueue": data.get("integration_queue") or [],
741
- "stageErrors": stage_errors,
742
- "legacyStages": legacy,
743
- "stalePack": stale_pack,
744
- "newlyReady": newly_ready,
745
- }
746
-
747
-
748
- def build_parent_status(parent_dir: Path) -> str:
749
- """Render a parent task-map status summary for the reviewer."""
750
- repo_root = get_repo_root()
751
- parent_rel = _repo_rel(parent_dir, repo_root)
752
- data, _ = load_task_map(parent_dir)
753
- if data is None:
754
- return f"Parent `{parent_rel}`: task-map.md missing or invalid."
755
-
756
- lines = [
757
- f"# Parent orchestration status — `{parent_dir.name}`",
758
- "",
759
- f"- Path: `{parent_rel}`",
760
- f"- contract_epoch: {data.get('contract_epoch', '?')}",
761
- f"- execution_topology: {data.get('execution_topology', '?')}",
762
- f"- merge_limit: {data.get('merge_limit', '?')}",
763
- "",
764
- ]
765
-
766
- children_by_id = _children_by_id(data)
767
- stages, stage_errors, legacy = _normalize_stages(data)
768
- _, body = load_task_map(parent_dir)
769
- stale_pack = _compute_stale_pack(parent_dir, data, body, children_by_id)
770
- newly_ready = _compute_newly_ready(children_by_id)
771
- lines.append("## Pack freshness")
772
- lines.append("")
773
- lines.append(f"- stalePack: {stale_pack}")
774
- if newly_ready:
775
- lines.append(f"- newlyReady: {', '.join(newly_ready)}")
776
- else:
777
- lines.append("- newlyReady: (none)")
778
- lines.append("")
779
- lines.append("## Stages")
780
- lines.append("")
781
- if stage_errors:
782
- for err in stage_errors:
783
- lines.append(f"- error: {err}")
784
- lines.append("")
785
- elif legacy:
786
- lines.append("stages: (none declared — implicit `default` for publish-pack)")
787
- lines.append("")
788
- else:
789
- for stage in stages:
790
- sid = stage["id"]
791
- title = stage.get("title") or ""
792
- heading = f"### `{sid}`" + (f" — {title}" if title else "")
793
- lines.append(heading)
794
- for unit in stage.get("units") or []:
795
- entry = children_by_id.get(unit) or {}
796
- state = entry.get("state", "?")
797
- readiness, blocked = _unit_readiness(unit, children_by_id)
798
- if readiness == "ready":
799
- lines.append(f"- `{unit}` — `{state}` — ready")
800
- else:
801
- lines.append(f"- `{unit}` — `{state}` — blocked ({', '.join(blocked)})")
802
- lines.append("")
803
-
804
- lines.extend(["## Children", ""])
805
-
806
- children = data.get("children") or []
807
- if not children:
808
- lines.append("(no children in task-map)")
809
- return "\n".join(lines)
810
-
811
- for child in children:
812
- if not isinstance(child, dict):
813
- continue
814
- cid = child.get("id", "?")
815
- state = child.get("state", "?")
816
- evidence = child.get("evidence")
817
- ref = child.get("ref")
818
- deps = child.get("depends_on") or []
819
- touches = child.get("touches") or []
820
- isolation = child.get("isolation")
821
- branch = child.get("branch")
822
- worktree_path = child.get("worktree_path")
823
- lines.append(f"### `{cid}` — `{state}`")
824
- if deps:
825
- lines.append(f"- depends_on: {', '.join(deps)}")
826
- if touches:
827
- lines.append(f"- touches: {', '.join(touches)}")
828
- if isolation:
829
- lines.append(f"- isolation: {isolation}")
830
- if branch:
831
- lines.append(f"- branch: {branch}")
832
- if worktree_path:
833
- lines.append(f"- worktree_path: {worktree_path}")
834
- if evidence:
835
- lines.append(f"- evidence: {evidence}")
836
- if ref:
837
- lines.append(f"- ref: {ref}")
838
- child_dir = parent_dir.parent / cid
839
- for artifact in ("verify.md", "handoff.md"):
840
- flag = "yes" if (child_dir / artifact).is_file() else "missing"
841
- lines.append(f"- {artifact}: {flag}")
842
- lines.append("")
843
-
844
- queue = data.get("integration_queue") or []
845
- lines.append(f"integration_queue: {queue}")
846
- lines.append("")
847
- lines.append("## Suggested parent commands")
848
- lines.append("")
849
- lines.append("```bash")
850
- lines.append(f"python ./.pactile/scripts/task.py parent-status {parent_rel}")
851
- lines.append(f"python ./.pactile/scripts/task.py publish-pack {parent_rel}")
852
- lines.append(f"python ./.pactile/scripts/task.py generate-child-prompt {parent_rel} <child> --mode subagent")
853
- lines.append(f"python ./.pactile/scripts/task.py generate-child-prompt {parent_rel} <child> --mode inline")
854
- lines.append(f"python ./.pactile/scripts/task.py review-child {parent_rel} <child> --check")
855
- lines.append(f"python ./.pactile/scripts/task.py review-child {parent_rel} <child> --decision accept --ref <ref>")
856
- lines.append("```")
857
- return "\n".join(lines)
858
-
859
-
860
- def _summarize_handoff(child_dir: Path) -> dict[str, str | list[str] | bool]:
861
- verify = _read_optional(child_dir / "verify.md", 6000) or ""
862
- handoff = _read_optional(child_dir / "handoff.md", 12000) or ""
863
- has_verify = (child_dir / "verify.md").is_file()
864
- has_handoff = (child_dir / "handoff.md").is_file()
865
-
866
- validation_ok = bool(
867
- re.search(r"(?i)validation\s+(evidence|commands|results)", verify)
868
- or re.search(r"(?i)validation\s*:", verify)
869
- )
870
- acceptance_ok = bool(re.search(r"(?i)acceptance\s+evidence|accepted\s+by\s+user", verify))
871
- learning = durable_learning_decision_status(verify) if verify else {
872
- "no_durable_learning": False,
873
- "spec_update": False,
874
- "learning_artifact": False,
875
- "any": False,
876
- }
877
-
878
- changed_files: list[str] = []
879
- for line in handoff.splitlines():
880
- if "|" in line and not line.strip().startswith("| ---"):
881
- cells = [c.strip() for c in line.split("|") if c.strip()]
882
- if len(cells) >= 2 and cells[0].lower() not in ("path", "file"):
883
- changed_files.append(cells[0])
884
-
885
- return {
886
- "has_verify": has_verify,
887
- "has_handoff": has_handoff,
888
- "validation_section": validation_ok,
889
- "acceptance_section": acceptance_ok,
890
- "learning_decision": learning,
891
- "verify_excerpt": verify.strip()[:2000],
892
- "handoff_excerpt": handoff.strip()[:4000],
893
- "changed_files": changed_files[:20],
894
- }
895
-
896
-
897
- def _learning_decision_review_lines(
898
- parent_dir: Path,
899
- child_dir: Path,
900
- child_data: dict,
901
- summary: dict,
902
- *,
903
- decision: str | None,
904
- reason: str | None,
905
- ) -> list[str]:
906
- """Prompt parent/child to record durable learning before child archive."""
907
- learning = summary.get("learning_decision") or {}
908
- if learning.get("any"):
909
- return []
910
-
911
- repo_root = get_repo_root()
912
- child_rel = _repo_rel(child_dir, repo_root)
913
- lines = [
914
- "## Durable learning decision (required before child archive)",
915
- "",
916
- "Child verify.md has no grep-friendly durable-learning line yet. Pick one outcome:",
917
- "",
918
- "- `Durable learning decision: no durable learning` — routine scope, no reusable contract.",
919
- "- `Spec update evidence: .pactile/spec/<path>` — after `/pactile:update-spec` with reviewer confirmation.",
920
- f"- `Learning artifact: {child_rel}/handoff.md` — handoff already captures the insight.",
921
- "",
922
- f"Helper: `python ./.pactile/scripts/task.py prepare-archive-evidence {child_rel}`",
923
- "",
924
- ]
925
-
926
- trigger: str | None = None
927
- if decision == "changes":
928
- trigger = f"Parent review requested changes ({reason or 'see review notes'})"
929
- elif decision in ("accept", "integrate-through"):
930
- trigger = "Parent accepted child handoff — confirm whether workflow/contracts should be captured in spec"
931
-
932
- if trigger or decision == "changes":
933
- lines.append(build_spec_update_scaffold(repo_root, child_dir, child_data, trigger=trigger))
934
- return lines
935
-
936
-
937
- def build_review_report(
938
- parent_dir: Path,
939
- child_dir: Path,
940
- parent_data: dict,
941
- child_data: dict,
942
- *,
943
- decision: str | None,
944
- ref: str | None,
945
- reason: str | None,
946
- notes: str | None,
947
- ) -> tuple[str, list[str], dict]:
948
- """Build review summary and validate integration transitions for a decision."""
949
- child_name = resolve_child_map_id(parent_data, child_dir, child_data)
950
- summary = _summarize_handoff(child_dir)
951
- errors: list[str] = []
952
- actions: dict = {"integrate": None, "gates": []}
953
-
954
- data, _ = load_task_map(parent_dir)
955
- child_entry = get_child_entry(data, child_name) if data else None
956
- current_state = child_entry.get("state") if child_entry else None
957
-
958
- lines = [
959
- f"# Parent review — `{child_name}`",
960
- "",
961
- f"- Timestamp: {_utc_now()}",
962
- f"- Current integration state: `{current_state}`",
963
- f"- Decision: `{decision or 'check-only'}`",
964
- "",
965
- "## Handoff artifacts",
966
- "",
967
- f"- verify.md: {'present' if summary['has_verify'] else '**missing**'}",
968
- f"- handoff.md: {'present' if summary['has_handoff'] else '**missing**'}",
969
- f"- verify validation section signal: {summary['validation_section']}",
970
- f"- verify acceptance section signal: {summary['acceptance_section']}",
971
- f"- durable learning decision signal: {summary['learning_decision'].get('any')}",
972
- "",
973
- ]
974
- learning_lines = _learning_decision_review_lines(
975
- parent_dir,
976
- child_dir,
977
- child_data,
978
- summary,
979
- decision=decision,
980
- reason=reason,
981
- )
982
- if learning_lines:
983
- lines.extend(learning_lines)
984
-
985
- if summary["changed_files"]:
986
- lines.append("Changed files (from handoff table):")
987
- for path in summary["changed_files"]:
988
- lines.append(f"- `{path}`")
989
- lines.append("")
990
-
991
- if notes:
992
- lines.extend(["## Parent notes", "", notes.strip(), ""])
993
-
994
- if decision in ("accept", "changes", "cancel"):
995
- if decision == "accept":
996
- target = "accepted"
997
- if current_state != "review":
998
- errors.append(f"accept requires child state 'review', got {current_state!r}")
999
- errors.extend(
1000
- validate_parent_child_integration(
1001
- parent_dir,
1002
- parent_data,
1003
- child_dir,
1004
- child_data,
1005
- target,
1006
- "handoff.md",
1007
- ref,
1008
- reason,
1009
- )
1010
- )
1011
- actions["integrate"] = {
1012
- "state": target,
1013
- "evidence": "handoff.md",
1014
- "ref": ref,
1015
- }
1016
- actions["gates"].append(
1017
- {
1018
- "task": "parent",
1019
- "transition": "parent-accepted",
1020
- "optional": True,
1021
- "hint": (
1022
- f"Optional audit: python ./.pactile/scripts/task.py record-gate {parent_dir.name} "
1023
- f"--transition parent-accepted --gate code-review --result PASS "
1024
- f"--reviewer parent --evidence review-{child_name}.md"
1025
- ),
1026
- }
1027
- )
1028
- child_profile = task_closeout_profile(child_dir, child_data)
1029
- if child_profile == "full":
1030
- actions["gates"].append(
1031
- {
1032
- "task": "child",
1033
- "transition": "child-review",
1034
- "optional": False,
1035
- "hint": (
1036
- f"Required before accept: python ./.pactile/scripts/task.py record-gate {child_name} "
1037
- f"--transition child-review --gate code-review --result PASS "
1038
- f"--reviewer parent --evidence verify.md"
1039
- ),
1040
- }
1041
- )
1042
- elif child_profile == "lite":
1043
- actions["gates"].append(
1044
- {
1045
- "task": "child",
1046
- "transition": "child-review",
1047
- "optional": True,
1048
- "hint": "Lite child: no child-review gate chain required.",
1049
- }
1050
- )
1051
- elif decision == "changes":
1052
- target = "changes"
1053
- errors.extend(
1054
- validate_parent_child_integration(
1055
- parent_dir,
1056
- parent_data,
1057
- child_dir,
1058
- child_data,
1059
- target,
1060
- "handoff.md",
1061
- ref,
1062
- reason,
1063
- )
1064
- )
1065
- if not reason:
1066
- errors.append("changes requires --reason")
1067
- actions["integrate"] = {
1068
- "state": target,
1069
- "evidence": "handoff.md",
1070
- "ref": ref,
1071
- "reason": reason,
1072
- }
1073
- elif decision == "cancel":
1074
- target = "cancelled"
1075
- errors.extend(
1076
- validate_parent_child_integration(
1077
- parent_dir,
1078
- parent_data,
1079
- child_dir,
1080
- child_data,
1081
- target,
1082
- "handoff.md",
1083
- ref,
1084
- reason,
1085
- )
1086
- )
1087
- if not reason:
1088
- errors.append("cancel requires --reason")
1089
- actions["integrate"] = {
1090
- "state": target,
1091
- "evidence": "handoff.md",
1092
- "reason": reason,
1093
- }
1094
- elif decision == "integrate-through":
1095
- sequence = [
1096
- ("accepted", "handoff.md"),
1097
- ("integrating", "task-map.md"),
1098
- ("integrated", "task-map.md"),
1099
- ]
1100
- sim_state = current_state
1101
- for target, evidence in sequence:
1102
- if target == "accepted" and sim_state != "review":
1103
- errors.append(f"integrate-through requires child state 'review', got {sim_state!r}")
1104
- break
1105
- if target == "integrating" and sim_state != "accepted":
1106
- errors.append(f"integrating requires 'accepted', simulated from {sim_state!r}")
1107
- break
1108
- if target == "integrated" and sim_state != "integrating":
1109
- errors.append(f"integrated requires 'integrating', simulated from {sim_state!r}")
1110
- break
1111
- step_errors = validate_parent_child_integration(
1112
- parent_dir,
1113
- parent_data,
1114
- child_dir,
1115
- child_data,
1116
- target,
1117
- evidence,
1118
- ref,
1119
- reason,
1120
- current_state_override=sim_state,
1121
- )
1122
- errors.extend(step_errors)
1123
- if step_errors:
1124
- break
1125
- sim_state = target
1126
- if not errors:
1127
- actions["integrate_sequence"] = [
1128
- {"state": "accepted", "evidence": "handoff.md", "ref": ref},
1129
- {"state": "integrating", "evidence": "task-map.md", "ref": ref},
1130
- {"state": "integrated", "evidence": "task-map.md", "ref": ref},
1131
- ]
1132
- actions["gates"].append(
1133
- {
1134
- "task": "parent",
1135
- "transition": "parent-integrated",
1136
- "optional": False,
1137
- "hint": (
1138
- f"Required before parent archive: python ./.pactile/scripts/task.py record-gate {parent_dir.name} "
1139
- f"--transition parent-integrated --gate integration-review --result PASS "
1140
- f"--reviewer parent --evidence task-map.md"
1141
- ),
1142
- }
1143
- )
1144
-
1145
- lines.extend(
1146
- [
1147
- "## verify.md excerpt",
1148
- "",
1149
- (summary["verify_excerpt"] or "(empty)"),
1150
- "",
1151
- "## handoff.md excerpt",
1152
- "",
1153
- (summary["handoff_excerpt"] or "(empty)"),
1154
- "",
1155
- ]
1156
- )
1157
-
1158
- if decision and not errors:
1159
- lines.append("## Integration plan")
1160
- lines.append("")
1161
- if actions.get("integrate_sequence"):
1162
- for step in actions["integrate_sequence"]:
1163
- lines.append(
1164
- f"- integrate-child → `{step['state']}` (evidence={step['evidence']}, ref={step.get('ref')})"
1165
- )
1166
- elif actions.get("integrate"):
1167
- step = actions["integrate"]
1168
- lines.append(
1169
- f"- integrate-child → `{step['state']}` (evidence={step['evidence']}, ref={step.get('ref')})"
1170
- )
1171
- for gate in actions.get("gates", []):
1172
- if gate.get("optional"):
1173
- lines.append(f"- Optional gate ({gate['transition']}): {gate['hint']}")
1174
- lines.append("")
1175
-
1176
- report = "\n".join(lines)
1177
- return report, errors, actions
1178
-
1179
-
1180
- def append_parent_review_notes(parent_dir: Path, child_name: str, report: str) -> None:
1181
- """Append a parent review section to parent verify.md."""
1182
- verify_path = parent_dir / "verify.md"
1183
- header = f"\n\n## Parent review — `{child_name}` ({_utc_now()})\n\n"
1184
- if verify_path.is_file():
1185
- existing = verify_path.read_text(encoding="utf-8")
1186
- verify_path.write_text(existing.rstrip() + header + report.strip() + "\n", encoding="utf-8")
1187
- else:
1188
- verify_path.write_text(
1189
- "# Verification Evidence\n\n" + header + report.strip() + "\n",
1190
- encoding="utf-8",
1191
- )
1192
-
1193
-
1194
- def write_review_artifact(parent_dir: Path, child_name: str, report: str) -> Path:
1195
- """Write a standalone review artifact under the parent task directory."""
1196
- path = parent_dir / f"review-{child_name}.md"
1197
- path.write_text(report.strip() + "\n", encoding="utf-8")
1198
- return path